From 450454019d67d298b827a9d7925e1470ac44717e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 16 Feb 2026 01:52:59 +0100 Subject: [PATCH 001/161] chore: Process strings from Crowdin correctly --- .../addresources/values-af-rZA/strings.xml | 488 +-- .../addresources/values-am-rET/strings.xml | 488 +-- .../addresources/values-ar-rSA/strings.xml | 3383 ++++++++-------- .../addresources/values-as-rIN/strings.xml | 491 +-- .../addresources/values-az-rAZ/strings.xml | 3332 ++++++++-------- .../addresources/values-be-rBY/strings.xml | 3338 ++++++++-------- .../addresources/values-bg-rBG/strings.xml | 3338 ++++++++-------- .../addresources/values-bn-rBD/strings.xml | 3338 ++++++++-------- .../addresources/values-bs-rBA/strings.xml | 488 +-- .../addresources/values-ca-rES/strings.xml | 488 +-- .../addresources/values-cs-rCZ/strings.xml | 3332 ++++++++-------- .../addresources/values-da-rDK/strings.xml | 3318 ++++++++-------- .../addresources/values-de-rDE/strings.xml | 3310 ++++++++-------- .../addresources/values-el-rGR/strings.xml | 3397 ++++++++--------- .../addresources/values-es-rES/strings.xml | 3372 ++++++++-------- .../addresources/values-et-rEE/strings.xml | 3336 ++++++++-------- .../addresources/values-eu-rES/strings.xml | 488 +-- .../addresources/values-fa-rIR/strings.xml | 608 ++- .../addresources/values-fi-rFI/strings.xml | 3397 ++++++++--------- .../addresources/values-fil-rPH/strings.xml | 3298 ++++++++-------- .../addresources/values-fr-rFR/strings.xml | 3397 ++++++++--------- .../addresources/values-ga-rIE/strings.xml | 3397 ++++++++--------- .../addresources/values-gl-rES/strings.xml | 488 +-- .../addresources/values-gu-rIN/strings.xml | 488 +-- .../addresources/values-hi-rIN/strings.xml | 491 +-- .../addresources/values-hr-rHR/strings.xml | 493 +-- .../addresources/values-hu-rHU/strings.xml | 3326 ++++++++-------- .../addresources/values-hy-rAM/strings.xml | 3347 ++++++++-------- .../addresources/values-in-rID/strings.xml | 3397 ++++++++--------- .../addresources/values-is-rIS/strings.xml | 488 +-- .../addresources/values-it-rIT/strings.xml | 3397 ++++++++--------- .../addresources/values-iw-rIL/strings.xml | 3342 ++++++++-------- .../addresources/values-ja-rJP/strings.xml | 3397 ++++++++--------- .../addresources/values-ka-rGE/strings.xml | 488 +-- .../addresources/values-kk-rKZ/strings.xml | 488 +-- .../addresources/values-km-rKH/strings.xml | 488 +-- .../addresources/values-kn-rIN/strings.xml | 519 ++- .../addresources/values-ko-rKR/strings.xml | 3397 ++++++++--------- .../addresources/values-ky-rKG/strings.xml | 488 +-- .../addresources/values-lo-rLA/strings.xml | 488 +-- .../addresources/values-lt-rLT/strings.xml | 3338 ++++++++-------- .../addresources/values-lv-rLV/strings.xml | 3340 ++++++++-------- .../addresources/values-mk-rMK/strings.xml | 488 +-- .../addresources/values-ml-rIN/strings.xml | 488 +-- .../addresources/values-mn-rMN/strings.xml | 488 +-- .../addresources/values-mr-rIN/strings.xml | 488 +-- .../addresources/values-ms-rMY/strings.xml | 491 +-- .../addresources/values-my-rMM/strings.xml | 488 +-- .../addresources/values-nb-rNO/strings.xml | 488 +-- .../addresources/values-ne-rIN/strings.xml | 493 +-- .../addresources/values-nl-rNL/strings.xml | 3312 ++++++++-------- .../addresources/values-or-rIN/strings.xml | 488 +-- .../addresources/values-pa-rIN/strings.xml | 488 +-- .../addresources/values-pl-rPL/strings.xml | 3397 ++++++++--------- .../addresources/values-pt-rBR/strings.xml | 3326 ++++++++-------- .../addresources/values-pt-rPT/strings.xml | 3397 ++++++++--------- .../addresources/values-ro-rRO/strings.xml | 3308 ++++++++-------- .../addresources/values-ru-rRU/strings.xml | 3397 ++++++++--------- .../addresources/values-si-rLK/strings.xml | 488 +-- .../addresources/values-sk-rSK/strings.xml | 3332 ++++++++-------- .../addresources/values-sl-rSI/strings.xml | 3340 ++++++++-------- .../addresources/values-sq-rAL/strings.xml | 3316 ++++++++-------- .../addresources/values-sr-rCS/strings.xml | 3332 ++++++++-------- .../addresources/values-sr-rSP/strings.xml | 3340 ++++++++-------- .../addresources/values-sv-rSE/strings.xml | 3314 ++++++++-------- .../addresources/values-sw-rKE/strings.xml | 488 +-- .../addresources/values-ta-rIN/strings.xml | 488 +-- .../addresources/values-te-rIN/strings.xml | 488 +-- .../addresources/values-th-rTH/strings.xml | 3340 ++++++++-------- .../addresources/values-tr-rTR/strings.xml | 3397 ++++++++--------- .../addresources/values-uk-rUA/strings.xml | 3338 ++++++++-------- .../addresources/values-ur-rIN/strings.xml | 488 +-- .../addresources/values-uz-rUZ/strings.xml | 488 +-- .../addresources/values-vi-rVN/strings.xml | 3344 ++++++++-------- .../addresources/values-zh-rCN/strings.xml | 3340 ++++++++-------- .../addresources/values-zh-rTW/strings.xml | 3397 ++++++++--------- .../addresources/values-zu-rZA/strings.xml | 488 +-- 77 files changed, 77723 insertions(+), 80358 deletions(-) diff --git a/patches/src/main/resources/addresources/values-af-rZA/strings.xml b/patches/src/main/resources/addresources/values-af-rZA/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-af-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-af-rZA/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-am-rET/strings.xml b/patches/src/main/resources/addresources/values-am-rET/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-am-rET/strings.xml +++ b/patches/src/main/resources/addresources/values-am-rET/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index 50f00b2e94..a7ad05ddfb 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -17,1273 +17,1272 @@ "First 'item' text Second \"item\" text" ---> - - - - اسم التطبيق - - مخصص - أيقونة التطبيق - الأصلية - ReVanced - - ReVanced minimal - ReVanced scaled - - مخصص - - - فشلت عمليات التحقق - فتح الموقع الرسمي - تجاهل - <h5>لا يبدو أن هذا التطبيق قد تم تعديله من قبلك.</h5><br>قد لا يعمل هذا التطبيق بشكل صحيح، <b>قد يكون ضارًا أو حتى خطيرًا للاستخدام</b>.<br><br>تشير هذه الفحوصات إلى أن هذا التطبيق تم تعديله مسبقًا أو تم الحصول عليه من شخص آخر:<br><br><small>%1$s</small><br>يوصى بشدة بـ <b>إلغاء تثبيت هذا التطبيق وتعديله بنفسك</b> للتأكد من أنك تستخدم تطبيقًا معتمدًا وآمنًا.<p><br>في حالة تجاهل هذا التحذير، سيتم عرضه مرتين فقط. - تم تعديله على جهاز مختلف - لم يتم تثبيته بواسطة ReVanced Manager - تم تعديله قبل أكثر من 10 دقائق - تم التعديل منذ %s يوم - تاريخ بناء APK تالف - - - إشعار ReVanced - لم يتم حفظ سجل المشاهدة الخاص بك.<br><br>من المرجح أن يكون السبب في ذلك هو مانع إعلانات DNS أو وكيل الشبكة.<br><br>لإصلاح هذه المشكلة، قم بإضافة <b>s.youtube.com</b> إلى القائمة البيضاء أو قم بإيقاف تشغيل جميع أدوات حظر DNS ووكلاء البروكسي. - لا تعرض مرة أخرى - - - الإعدادات - ReVanced - هل أنت متأكد أنك تريد المتابعة؟ - حفظ - إعادة التعيين - إعادة تعيين اللون - لون غير صالح - إعادة التشغيل مطلوبة - أعد تشغيل التطبيق لكي يسري هذا التغيير. - إعادة التشغيل - استيراد - نسخ - إعادة تعيين إعدادات ReVanced إلى الوضع الافتراضي - تم استيراد %d إعدادات - فشل الاستيراد: %s - بحث الإعدادات - لم يتم العثور على نتائج لـ \".%s\" - جرّب كلمة مفتاحية أخرى - عمليات البحث الأخيرة - إزالة من سجل البحث؟ - مسح سجل البحث - هل أنت متأكد أنك تريد مسح كل سجل البحث؟ - نصائح البحث - "• انقر على مسار للانتقال إليه +--> + + + اسم التطبيق + + مخصص + أيقونة التطبيق + الأصلية + ReVanced + + ReVanced minimal + ReVanced scaled + + مخصص + + + فشلت عمليات التحقق + فتح الموقع الرسمي + تجاهل + <h5>لا يبدو أن هذا التطبيق قد تم تعديله من قبلك.</h5><br>قد لا يعمل هذا التطبيق بشكل صحيح، <b>قد يكون ضارًا أو حتى خطيرًا للاستخدام</b>.<br><br>تشير هذه الفحوصات إلى أن هذا التطبيق تم تعديله مسبقًا أو تم الحصول عليه من شخص آخر:<br><br><small>%1$s</small><br>يوصى بشدة بـ <b>إلغاء تثبيت هذا التطبيق وتعديله بنفسك</b> للتأكد من أنك تستخدم تطبيقًا معتمدًا وآمنًا.<p><br>في حالة تجاهل هذا التحذير، سيتم عرضه مرتين فقط. + تم تعديله على جهاز مختلف + لم يتم تثبيته بواسطة ReVanced Manager + تم تعديله قبل أكثر من 10 دقائق + تم التعديل منذ %s يوم + تاريخ بناء APK تالف + + + إشعار ReVanced + لم يتم حفظ سجل المشاهدة الخاص بك.<br><br>من المرجح أن يكون السبب في ذلك هو مانع إعلانات DNS أو وكيل الشبكة.<br><br>لإصلاح هذه المشكلة، قم بإضافة <b>s.youtube.com</b> إلى القائمة البيضاء أو قم بإيقاف تشغيل جميع أدوات حظر DNS ووكلاء البروكسي. + لا تعرض مرة أخرى + + + الإعدادات + ReVanced + هل أنت متأكد أنك تريد المتابعة؟ + حفظ + إعادة التعيين + إعادة تعيين اللون + لون غير صالح + إعادة التشغيل مطلوبة + أعد تشغيل التطبيق لكي يسري هذا التغيير. + إعادة التشغيل + استيراد + نسخ + إعادة تعيين إعدادات ReVanced إلى الوضع الافتراضي + تم استيراد %d إعدادات + فشل الاستيراد: %s + بحث الإعدادات + لم يتم العثور على نتائج لـ \".%s\" + جرّب كلمة مفتاحية أخرى + عمليات البحث الأخيرة + إزالة من سجل البحث؟ + مسح سجل البحث + هل أنت متأكد أنك تريد مسح كل سجل البحث؟ + نصائح البحث + "• انقر على مسار للانتقال إليه • اضغط مطولًا على إعداد للانتقال إليه • اضغط على Enter لحفظ استعلام البحث في السجل • يتجاهل البحث حالة الأحرف وعلامات الترقيم • تظهر الإعدادات الرئيسية فوق الإعدادات الفرعية المعطلة" - سجل البحث فارغ - لحفظ سجل البحث، اكتب استعلام بحث واضغط على Enter - عرض سجل بحث الإعدادات - يتم عرض سجل البحث في الإعدادات - لا يتم عرض سجل البحث في الإعدادات - عرض أيقونات إعدادات ReVanced - يتم عرض أيقونات الإعدادات - لا يتم عرض أيقونات الإعدادات - لغة ReVanced - "قد تكون ترجمات بعض اللغات مفقودة أو غير مكتملة. + سجل البحث فارغ + لحفظ سجل البحث، اكتب استعلام بحث واضغط على Enter + عرض سجل بحث الإعدادات + يتم عرض سجل البحث في الإعدادات + لا يتم عرض سجل البحث في الإعدادات + عرض أيقونات إعدادات ReVanced + يتم عرض أيقونات الإعدادات + لا يتم عرض أيقونات الإعدادات + لغة ReVanced + "قد تكون ترجمات بعض اللغات مفقودة أو غير مكتملة. لترجمة لغات جديدة أو تحسين الترجمات الحالية، تفضل بزيارة translate.revanced.app" - لغة التطبيق - استيراد / تصدير - استيراد / تصدير إعدادات ReVanced - - أنت تستخدم إصدار ReVanced Patches <i>%s</i> - ملاحظة - هذه النسخة هي إصدار ما قبل الإصدار وقد تواجه مشكلات غير متوقعة - الروابط الرسمية - + أنت تستخدم إصدار ReVanced Patches <i>%s</i> + ملاحظة + هذه النسخة هي إصدار ما قبل الإصدار وقد تواجه مشكلات غير متوقعة + الروابط الرسمية + - - - إعدادات GmsCore - إعدادات لـ GmsCore - - لم يتم تثبيت MicroG GmsCore. قم بتثبيته. - الإجراء مطلوب - "لا يملك MicroG GmsCore صلاحية التشغيل في الخلفية. + + + إعدادات GmsCore + إعدادات لـ GmsCore + + لم يتم تثبيت MicroG GmsCore. قم بتثبيته. + الإجراء مطلوب + "لا يملك MicroG GmsCore صلاحية التشغيل في الخلفية. اتبع دليل \"لا تغلق تطبيقي\" لهاتفك، وطبّق التعليمات على تثبيت MicroG. هذا مطلوب لعمل التطبيق." - فتح الموقع - "يجب تعطيل تحسينات بطارية MicroG GmsCore لمنع حدوث مشكلات. + فتح الموقع + "يجب تعطيل تحسينات بطارية MicroG GmsCore لمنع حدوث مشكلات. لن يؤثر تعطيل تحسينات البطارية لـ MicroG سلبًا على استخدام البطارية. انقر فوق زر متابعة واسمح بتغييرات التحسين." - متابعة - - - Spoof Video Streams - تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل - Spoof Video Streams - تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل - Spoof Video Streams - "يتم تزييف تدفقات الفيديو + متابعة + + + Spoof Video Streams + تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل + Spoof Video Streams + تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل + Spoof Video Streams + "يتم تزييف تدفقات الفيديو إذا كنت مستخدمًا لـ YouTube Premium، فقد لا يكون هذا الإعداد مطلوبًا" - "لا يتم تزييف تدفقات الفيديو + "لا يتم تزييف تدفقات الفيديو قد لا يعمل تشغيل الفيديو" - قد يؤدي إيقاف تشغيل هذا الإعداد إلى مشكلات في التشغيل. - العميل الافتراضي - - - فرض لغة الصوت الأصلية - استخدام لغة الصوت الأصلية - استخدام الصوت الافتراضي - - لاستخدام هذه الميزة، غيّر \'Spoof Video Streams\' إلى أي عميل باستثناء Android Studio - - - تصحيح الأخطاء - تمكين أو تعطيل خيارات تصحيح الأخطاء - تسجيل تصحيح الأخطاء - تم تمكين تسجيلات تصحيح الأخطاء - تم تعطيل تسجيلات تصحيح الأخطاء - سجل تتبع المكدس - تتضمن سجلات التصحيح سجل تتبع المكدس - لا تتضمن سجلات التصحيح سجل تتبع المكدس - عرض ملاحظة عند وجود خطأ في ReVanced - يتم عرض ملاحظة في حالة حدوث خطأ - لا يتم عرض ملاحظة في حالة حدوث خطأ - "يؤدي إيقاف تشغيل ملاحظات الأخطاء إلى إخفاء كافة إشعارات أخطاء ReVanced. + قد يؤدي إيقاف تشغيل هذا الإعداد إلى مشكلات في التشغيل. + العميل الافتراضي + + + فرض لغة الصوت الأصلية + استخدام لغة الصوت الأصلية + استخدام الصوت الافتراضي + + لاستخدام هذه الميزة، غيّر \'Spoof Video Streams\' إلى أي عميل باستثناء Android Studio + + + تصحيح الأخطاء + تمكين أو تعطيل خيارات تصحيح الأخطاء + تسجيل تصحيح الأخطاء + تم تمكين تسجيلات تصحيح الأخطاء + تم تعطيل تسجيلات تصحيح الأخطاء + سجل تتبع المكدس + تتضمن سجلات التصحيح سجل تتبع المكدس + لا تتضمن سجلات التصحيح سجل تتبع المكدس + عرض ملاحظة عند وجود خطأ في ReVanced + يتم عرض ملاحظة في حالة حدوث خطأ + لا يتم عرض ملاحظة في حالة حدوث خطأ + "يؤدي إيقاف تشغيل ملاحظات الأخطاء إلى إخفاء كافة إشعارات أخطاء ReVanced. لن يتم إعلامك بأي أخطاء غير متوقعة." - تصدير سجلات تصحيح الأخطاء - نسخ سجلات تصحيح أخطاء ReVanced إلى الحافظة - تم تعطيل تسجيلات تصحيح الأخطاء - لم يتم العثور على سجلات - تم نسخ السجلات - فشل تصدير السجلات: %s - مسح سجلات تصحيح الأخطاء - يمسح جميع سجلات تصحيح أخطاء ReVanced المخزنة - تم مسح السجلات - إدارة Feature Flags - إدارة Feature Flags الثنائية - Flags نشطة (%d) - Flags محظورة (%d) - البحث عن Flags... - تم حفظ Flags - تم إعادة تعيين Flags - تم نسخ Flags إلى الحافظة - سجل بروتوكول التخزين المؤقت - تتضمن سجلات التصحيح التخزين المؤقت - لا تتضمن سجلات التصحيح التخزين المؤقت - "سيؤدي تمكين هذا الإعداد إلى تسجيل بيانات تخطيط إضافية، بما في ذلك النص المعروض على الشاشة لبعض مكونات واجهة المستخدم. + تصدير سجلات تصحيح الأخطاء + نسخ سجلات تصحيح أخطاء ReVanced إلى الحافظة + تم تعطيل تسجيلات تصحيح الأخطاء + لم يتم العثور على سجلات + تم نسخ السجلات + فشل تصدير السجلات: %s + مسح سجلات تصحيح الأخطاء + يمسح جميع سجلات تصحيح أخطاء ReVanced المخزنة + تم مسح السجلات + إدارة Feature Flags + إدارة Feature Flags الثنائية + Flags نشطة (%d) + Flags محظورة (%d) + البحث عن Flags... + تم حفظ Flags + تم إعادة تعيين Flags + تم نسخ Flags إلى الحافظة + سجل بروتوكول التخزين المؤقت + تتضمن سجلات التصحيح التخزين المؤقت + لا تتضمن سجلات التصحيح التخزين المؤقت + "سيؤدي تمكين هذا الإعداد إلى تسجيل بيانات تخطيط إضافية، بما في ذلك النص المعروض على الشاشة لبعض مكونات واجهة المستخدم. يمكن أن يساعد هذا في تحديد المكونات عند إنشاء عوامل تصفية مخصصة. ومع ذلك، سيؤدي تمكين هذا أيضًا إلى تسجيل بعض بيانات المستخدم مثل عنوان IP الخاص بك." - - - تطهير روابط المشاركة - تمت إزالة معلمة استعلام التتبع من الروابط عند المشاركة - لم تتم إزالة معلمة استعلام التتبع من الروابط عند المشاركة - تغيير روابط المشاركة إلى youtube.com - تستخدم روابط المشاركة youtube.com - تستخدم روابط المشاركة music.youtube.com - - - فلتر مخصص - إخفاء المكونات باستخدام فلاتر مخصصة - تمكين الفلتر المخصص - تم تمكين الفلتر المخصص - تم تعطيل الفلتر المخصص - فلتر مخصص - - قائمة سلاسل منشئ مسار المكونات المراد تصفيتها مفصولة بسطر جديد - فلتر مخصص غير صالح: %s - - - - - لمحة - الإعلانات - مصغرات فيديو بديلة - الموجز - عام - المشغل - Shorts - شريط تقدم الفيديو - التحكم عن طريق إيماءة التمرير - استعادة YouTube Dislike - خيارات متنوعة - الفيديو - استعادة قوائم الإعدادات القديمة - يتم عرض قوائم الإعدادات القديمة - لا يتم عرض قوائم الإعدادات القديمة - - - تعطيل تشغيل فيديوهات Shorts في الخلفية - تم تعطيل تشغيل Shorts بالخلفية - تم تمكين تشغيل Shorts بالخلفية - - - إخفاء بطاقات الألبوم - تم إخفاء بطاقات الألبوم - يتم عرض بطاقات الألبوم - إخفاء بطاقات الفنان - تم إخفاء بطاقات الفنان - يتم عرض بطاقات الفنان - إخفاء رف الشرائح - تم إخفاء رف الشرائح - يتم عرض رف الشرائح - إخفاء مشاركات المجتمع - تم إخفاء مشاركات المجتمع - يتم عرض مشاركات المجتمع - إخفاء شريط الإعلانات - تم إخفاء شريط الإعلانات - يتم عرض شريط الإعلانات - إخفاء البطاقة القابلة للتوسيع - تم إخفاء البطاقة القابلة للتوسيع أسفل مقاطع الفيديو - يتم عرض البطاقة القابلة للتوسيع أسفل مقاطع الفيديو - إخفاء زر الميكروفون العائم - تم إخفاء زر الميكروفون العائم في البحث - يتم عرض زر الميكروفون العائم في البحث - إخفاء الرفوف الأفقية - "تم إخفاء الأرفف الأفقية، مثل: + + + تطهير روابط المشاركة + تمت إزالة معلمة استعلام التتبع من الروابط عند المشاركة + لم تتم إزالة معلمة استعلام التتبع من الروابط عند المشاركة + تغيير روابط المشاركة إلى youtube.com + تستخدم روابط المشاركة youtube.com + تستخدم روابط المشاركة music.youtube.com + + + فلتر مخصص + إخفاء المكونات باستخدام فلاتر مخصصة + تمكين الفلتر المخصص + تم تمكين الفلتر المخصص + تم تعطيل الفلتر المخصص + فلتر مخصص + + قائمة سلاسل منشئ مسار المكونات المراد تصفيتها مفصولة بسطر جديد + فلتر مخصص غير صالح: %s + + + + + لمحة + الإعلانات + مصغرات فيديو بديلة + الموجز + عام + المشغل + Shorts + شريط تقدم الفيديو + التحكم عن طريق إيماءة التمرير + استعادة YouTube Dislike + خيارات متنوعة + الفيديو + استعادة قوائم الإعدادات القديمة + يتم عرض قوائم الإعدادات القديمة + لا يتم عرض قوائم الإعدادات القديمة + + + تعطيل تشغيل فيديوهات Shorts في الخلفية + تم تعطيل تشغيل Shorts بالخلفية + تم تمكين تشغيل Shorts بالخلفية + + + إخفاء بطاقات الألبوم + تم إخفاء بطاقات الألبوم + يتم عرض بطاقات الألبوم + إخفاء بطاقات الفنان + تم إخفاء بطاقات الفنان + يتم عرض بطاقات الفنان + إخفاء رف الشرائح + تم إخفاء رف الشرائح + يتم عرض رف الشرائح + إخفاء مشاركات المجتمع + تم إخفاء مشاركات المجتمع + يتم عرض مشاركات المجتمع + إخفاء شريط الإعلانات + تم إخفاء شريط الإعلانات + يتم عرض شريط الإعلانات + إخفاء البطاقة القابلة للتوسيع + تم إخفاء البطاقة القابلة للتوسيع أسفل مقاطع الفيديو + يتم عرض البطاقة القابلة للتوسيع أسفل مقاطع الفيديو + إخفاء زر الميكروفون العائم + تم إخفاء زر الميكروفون العائم في البحث + يتم عرض زر الميكروفون العائم في البحث + إخفاء الرفوف الأفقية + "تم إخفاء الأرفف الأفقية، مثل: • الأخبار العاجلة • متابعة المشاهدة • استكشاف المزيد من القنوات • الأكثر صلة • التسوق • أريد أن اشاهدها مرة أخرى" - يتم عرض الأرفف الأفقية - إخفاء رف الصور - تم إخفاء رف الصور في نتائج البحث - يتم عرض رف الصور في نتائج البحث - إخفاء آخر المشاركات - تم إخفاء أحدث المشاركات - يتم عرض أحدث المشاركات - إخفاء قوائم تشغيل التشكيلة - تم إخفاء قوائم تشغيل التشكيلة - يتم عرض قوائم تشغيل التشكيلة - إخفاء قسم الأفلام - تم إخفاء قسم الأفلام - يتم عرض قسم الأفلام - - إخفاء زر \'تنبيهي\' - تم إخفاء زر تنبيهي - يتم عرض زر تنبيهي - إخفاء هيّا نلعب - تم إخفاء هيّا نلعب - يتم عرض هيّا نلعب - - إخفاء زر \'عرض المزيد\' - تم إخفاء زر عرض المزيد في نتائج البحث - يتم إظهار زر عرض المزيد في نتائج البحث - إخفاء الاستبيانات - تم إخفاء الاستبيانات - يتم عرض الاستبيانات - إخفاء رف التذاكر - تم إخفاء رف التذاكر - يتم عرض رف التذاكر - - إخفاء تسميات الفيديوهات المقترحة - تم إخفاء تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث - يتم عرض تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث - إخفاء المسافة البادئة المرئية - تم إخفاء المسافة البادئة المرئية - يتم عرض المسافة البادئة المرئية - - إخفاء رسومات YouTube - تم إخفاء رسوم Doodles المتحركة على شعار YouTube - يتم عرض رسوم Doodles المتحركة على شعار YouTube - "تظهر رسومات YouTube Doodles لعدة أيام كل عام. + إخفاء زر \'عرض المزيد\' + تم إخفاء زر عرض المزيد في نتائج البحث + يتم إظهار زر عرض المزيد في نتائج البحث + إخفاء الاستبيانات + تم إخفاء الاستبيانات + يتم عرض الاستبيانات + إخفاء رف التذاكر + تم إخفاء رف التذاكر + يتم عرض رف التذاكر + + إخفاء تسميات الفيديوهات المقترحة + تم إخفاء تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث + يتم عرض تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث + إخفاء المسافة البادئة المرئية + تم إخفاء المسافة البادئة المرئية + يتم عرض المسافة البادئة المرئية + + إخفاء رسومات YouTube + تم إخفاء رسوم Doodles المتحركة على شعار YouTube + يتم عرض رسوم Doodles المتحركة على شعار YouTube + "تظهر رسومات YouTube Doodles لعدة أيام كل عام. إذا كانت رسومات Doodles تظهر حاليًا في منطقتك وكان إعداد الإخفاء هذا قيد التشغيل، فسيتم أيضًا إخفاء شريط التصفية الموجود أسفل شريط البحث." - إخفاء شريط القناة - تم إخفاء شريط القناة - يتم عرض شريط القناة - إخفاء العلامة المائية للقناة - تم إخفاء علامة الفيديو المائية - يتم عرض علامة الفيديو المائية - إخفاء مربع التمويل الجماعي - تم إخفاء مربع التمويل الجماعي - يتم عرض مربع التمويل الجماعي - إخفاء صناديق الطوارئ - تم إخفاء صناديق الطوارئ - يتم عرض صناديق الطوارئ - إخفاء لوحات المعلومات - تم إخفاء لوحات المعلومات - يتم عرض لوحات المعلومات - - إخفاء زر الانضمام - تم إخفاء زر الانضمام - يتم عرض زر الانضمام - إخفاء اللوحات الطبية - تم إخفاء اللوحات الطبية - يتم عرض اللوحات الطبية - إخفاء الإجراءات السريعة - تم إخفاء الإجراءات السريعة في ملء الشاشة - يتم عرض الإجراءات السريعة في ملء الشاشة - إخفاء الفيديوهات ذات الصلة - تم إخفاء الفيديوهات ذات الصلة في الإجراءات السريعة - يتم عرض الفيديوهات ذات الصلة في الإجراءات السريعة - إخفاء إرشادات المشتركين - تم إخفاء إرشادات مجتمع المشتركين - يتم عرض إرشادات مجتمع المشتركين - إخفاء ردود الفعل المؤقتة - تم إخفاء ردود الفعل المؤقتة - يتم عرض ردود الفعل المؤقتة - إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\' - تم إخفاء قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI - يتم عرض قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI - إخفاء طرح سؤال - تم إخفاء قسم طرح سؤال - يتم عرض قسم طرح سؤال - إخفاء الصفات - تم إخفاء أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون - يتم عرض أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون - إخفاء الفصول - تم إخفاء قسم الفصول - يتم عرض قسم الفصول - إخفاء \'كيف تم إنشاء هذا المحتوى\' - تم إخفاء قسم كيف تم إنشاء هذا المحتوى - يتم عرض قسم كيف تم إنشاء هذا المحتوى - إخفاء نقاط التشجيع - تم إخفاء نقاط التشجيع - يتم عرض نقاط التشجيع - إخفاء \'استكشاف البودكاست\' - تم إخفاء قسم استكشاف البودكاست - يتم عرض قسم استكشاف البودكاست - إخفاء الروابط المميزة - تم إخفاء قسم الروابط المميزة - يتم عرض قسم الروابط المميزة - إخفاء الفيديوهات المميزة - تم إخفاء قسم الفيديوهات المميزة - يتم عرض قسم الفيديوهات المميزة - إخفاء بطاقات المعلومات - تم إخفاء قسم بطاقات المعلومات - يتم عرض قسم بطاقات المعلومات - إخفاء \'المفاهيم الأساسية\' - تم إخفاء قسم المفاهيم الأساسية - يتم عرض قسم المفاهيم الأساسية - إخفاء زر الاشتراك - تم إخفاء زر الاشتراك - يتم عرض زر الاشتراك - إخفاء النص - تم إخفاء قسم النص - يتم عرض قسم النص - وصف الفيديو - إخفاء أو عرض مكونات وصف الفيديو - شريط التصفية - إخفاء أو عرض شريط الفلترة في الموجزات والفيديوهات ذات الصلة ونتائج البحث وسجل المشاهدة - إخفاء في الموجز - مخفي في الموجز - يُعرض في الموجز - إخفاء في الفيديوهات ذات الصلة - مخفي في الفيديوهات ذات الصلة - يُعرض في الفيديوهات ذات الصلة - إخفاء في نتائج البحث - مخفي في نتائج البحث - يُعرض في نتائج البحث - إخفاء في السجلّ - مخفي في السجلّ - يُعرض في السجلّ - صفحة القناة - إخفاء أو عرض مكونات صفحة القناة - - إخفاء زر المنتدى - تم إخفاء زر المجتمع - يتم عرض زر المجتمع - - إخفاء رف \'مقترحات لك\' - تم إخفاء رف مقترح لك - يتم عرض رف مقترح لك - - إخفاء زر الانضمام - تم إخفاء زر الانضمام - يتم عرض زر الانضمام - إخفاء معاينة الروابط - تم إخفاء معاينة الروابط - يتم عرض معاينة الروابط - إخفاء رف الأعضاء - تم إخفاء رف الأعضاء - يتم عرض رف الأعضاء - - إخفاء زر المتجر - تم إخفاء زر المتجر - يتم عرض زر المتجر - - إخفاء زر الاشتراك - تم إخفاء زر الاشتراك - يتم عرض زر الاشتراك - التعليقات - إخفاء أو عرض مكونات قسم التعليقات - إخفاء ملخص محادثات الذكاء الاصطناعي - تم إخفاء ملخص محادثة الذكاء الاصطناعي - يتم عرض ملخص محادثة الذكاء الاصطناعي - إخفاء ملخص تعليقات الذكاء الاصطناعي - تم إخفاء ملخص تعليقات الذكاء الاصطناعي - يتم عرض ملخص تعليقات الذكاء الاصطناعي - إخفاء إرشادات القناة - تم إخفاء إرشادات القناة - يتم عرض إرشادات القناة - إخفاء علامة \'تعليقات بواسطة الأعضاء\' - تم إخفاء علامة تعليقات من الأعضاء - يتم عرض علامة تعليقات من الأعضاء - إخفاء قسم التعليقات - تم إخفاء قسم التعليقات - يتم عرض قسم التعليقات - إخفاء إرشادات المجتمع - تم إخفاء إرشادات المجتمع - يتم عرض إرشادات المجتمع - إخفاء زر \'إنشاء Short\' - تم إخفاء زر إنشاء Short - يتم عرض زر إنشاء Short - إخفاء أزرار الرموز التعبيرية والطابع الزمني - تم إخفاء أزرار الرموز التعبيرية والطوابع الزمنية - يتم عرض أزرار الرموز التعبيرية والطوابع الزمنية - إخفاء تعليق المعاينة - تم إخفاء تعليق المعاينة - يتم عرض تعليق المعاينة - إخفاء زر شكرًا - تم إخفاء زر شكرًا - يتم عرض زر شكرًا - إخفاء عدد المشاهدات - تم إخفاء عدد المشاهدات في الموجز ونتائج البحث - يتم عرض عدد المشاهدات في الموجز ونتائج البحث - - "القيود: + إخفاء زر الانضمام + تم إخفاء زر الانضمام + يتم عرض زر الانضمام + إخفاء اللوحات الطبية + تم إخفاء اللوحات الطبية + يتم عرض اللوحات الطبية + إخفاء الإجراءات السريعة + تم إخفاء الإجراءات السريعة في ملء الشاشة + يتم عرض الإجراءات السريعة في ملء الشاشة + إخفاء الفيديوهات ذات الصلة + تم إخفاء الفيديوهات ذات الصلة في الإجراءات السريعة + يتم عرض الفيديوهات ذات الصلة في الإجراءات السريعة + إخفاء إرشادات المشتركين + تم إخفاء إرشادات مجتمع المشتركين + يتم عرض إرشادات مجتمع المشتركين + إخفاء ردود الفعل المؤقتة + تم إخفاء ردود الفعل المؤقتة + يتم عرض ردود الفعل المؤقتة + إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\' + تم إخفاء قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI + يتم عرض قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI + إخفاء طرح سؤال + تم إخفاء قسم طرح سؤال + يتم عرض قسم طرح سؤال + إخفاء الصفات + تم إخفاء أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون + يتم عرض أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون + إخفاء الفصول + تم إخفاء قسم الفصول + يتم عرض قسم الفصول + إخفاء \'كيف تم إنشاء هذا المحتوى\' + تم إخفاء قسم كيف تم إنشاء هذا المحتوى + يتم عرض قسم كيف تم إنشاء هذا المحتوى + إخفاء نقاط التشجيع + تم إخفاء نقاط التشجيع + يتم عرض نقاط التشجيع + إخفاء \'استكشاف البودكاست\' + تم إخفاء قسم استكشاف البودكاست + يتم عرض قسم استكشاف البودكاست + إخفاء الروابط المميزة + تم إخفاء قسم الروابط المميزة + يتم عرض قسم الروابط المميزة + إخفاء الفيديوهات المميزة + تم إخفاء قسم الفيديوهات المميزة + يتم عرض قسم الفيديوهات المميزة + إخفاء بطاقات المعلومات + تم إخفاء قسم بطاقات المعلومات + يتم عرض قسم بطاقات المعلومات + إخفاء \'المفاهيم الأساسية\' + تم إخفاء قسم المفاهيم الأساسية + يتم عرض قسم المفاهيم الأساسية + إخفاء زر الاشتراك + تم إخفاء زر الاشتراك + يتم عرض زر الاشتراك + إخفاء النص + تم إخفاء قسم النص + يتم عرض قسم النص + وصف الفيديو + إخفاء أو عرض مكونات وصف الفيديو + شريط التصفية + إخفاء أو عرض شريط الفلترة في الموجزات والفيديوهات ذات الصلة ونتائج البحث وسجل المشاهدة + إخفاء في الموجز + مخفي في الموجز + يُعرض في الموجز + إخفاء في الفيديوهات ذات الصلة + مخفي في الفيديوهات ذات الصلة + يُعرض في الفيديوهات ذات الصلة + إخفاء في نتائج البحث + مخفي في نتائج البحث + يُعرض في نتائج البحث + إخفاء في السجلّ + مخفي في السجلّ + يُعرض في السجلّ + صفحة القناة + إخفاء أو عرض مكونات صفحة القناة + + إخفاء زر المنتدى + تم إخفاء زر المجتمع + يتم عرض زر المجتمع + + إخفاء رف \'مقترحات لك\' + تم إخفاء رف مقترح لك + يتم عرض رف مقترح لك + + إخفاء زر الانضمام + تم إخفاء زر الانضمام + يتم عرض زر الانضمام + إخفاء معاينة الروابط + تم إخفاء معاينة الروابط + يتم عرض معاينة الروابط + إخفاء رف الأعضاء + تم إخفاء رف الأعضاء + يتم عرض رف الأعضاء + + إخفاء زر المتجر + تم إخفاء زر المتجر + يتم عرض زر المتجر + + إخفاء زر الاشتراك + تم إخفاء زر الاشتراك + يتم عرض زر الاشتراك + التعليقات + إخفاء أو عرض مكونات قسم التعليقات + إخفاء ملخص محادثات الذكاء الاصطناعي + تم إخفاء ملخص محادثة الذكاء الاصطناعي + يتم عرض ملخص محادثة الذكاء الاصطناعي + إخفاء ملخص تعليقات الذكاء الاصطناعي + تم إخفاء ملخص تعليقات الذكاء الاصطناعي + يتم عرض ملخص تعليقات الذكاء الاصطناعي + إخفاء إرشادات القناة + تم إخفاء إرشادات القناة + يتم عرض إرشادات القناة + إخفاء علامة \'تعليقات بواسطة الأعضاء\' + تم إخفاء علامة تعليقات من الأعضاء + يتم عرض علامة تعليقات من الأعضاء + إخفاء قسم التعليقات + تم إخفاء قسم التعليقات + يتم عرض قسم التعليقات + إخفاء إرشادات المجتمع + تم إخفاء إرشادات المجتمع + يتم عرض إرشادات المجتمع + إخفاء زر \'إنشاء Short\' + تم إخفاء زر إنشاء Short + يتم عرض زر إنشاء Short + إخفاء أزرار الرموز التعبيرية والطابع الزمني + تم إخفاء أزرار الرموز التعبيرية والطوابع الزمنية + يتم عرض أزرار الرموز التعبيرية والطوابع الزمنية + إخفاء تعليق المعاينة + تم إخفاء تعليق المعاينة + يتم عرض تعليق المعاينة + إخفاء زر شكرًا + تم إخفاء زر شكرًا + يتم عرض زر شكرًا + إخفاء عدد المشاهدات + تم إخفاء عدد المشاهدات في الموجز ونتائج البحث + يتم عرض عدد المشاهدات في الموجز ونتائج البحث + + "القيود: • رفوف Shorts وصفحات القنوات ونتائج البحث قد تظل تعرض أعداد المشاهدات • هذه الميزة لا تعمل مع عامل الشكل Automotive" - إخفاء وقت التحميل - تم إخفاء وقت التحميل في الموجز ونتائج البحث - يتم عرض وقت التحميل في الموجز ونتائج البحث - - "القيود: + إخفاء وقت التحميل + تم إخفاء وقت التحميل في الموجز ونتائج البحث + يتم عرض وقت التحميل في الموجز ونتائج البحث + + "القيود: • قد تظل أرفف Shorts وصفحات القنوات ونتائج البحث تُظهر أوقات التحميل • هذه الميزة لا تعمل مع عامل الشكل Automotive" - إخفاء محتوى بالكلمات المفتاحية - إخفاء فيديوهات البحث والموجز باستخدام فلاتر الكلمات المفتاحية - إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية - تتم تصفية الفيديوهات في علامة التبويب \'الصفحة الرئيسية\' حسب الكلمات المفتاحية - لا تتم تصفية الفيديوهات في علامة التبويب \'الصفحة الرئيسية\' حسب الكلمات المفتاحية - إخفاء نتائج البحث عن طريق الكلمات المفتاحية - يتم تصفية نتائج البحث حسب الكلمات المفتاحية - لا يتم تصفية نتائج البحث حسب الكلمات المفتاحية - إخفاء الفيديوهات الخاصة بالاشتراكات عن طريق الكلمات المفتاحية - يتم تصفية الفيديوهات في علامة التبويب الاشتراكات حسب الكلمات المفتاحية - لا يتم تصفية الفيديوهات في علامة التبويب الاشتراكات حسب الكلمات المفتاحية - الكلمات المفتاحية المراد إخفاؤها - - "الكلمات والعبارات التي تريد إخفاءها، مفصولة بسطور جديدة + "الكلمات والعبارات التي تريد إخفاءها، مفصولة بسطور جديدة يمكن أن تكون الكلمات عبارة عن أسماء قنوات أو أي نص يظهر في عناوين الفيديوهات يجب إدخال الكلمات التي تحتوي على أحرف كبيرة في المنتصف بنفس الحالة (على سبيل المثال: iPhone, TikTok, LeBlanc)" - لمحة عن تصفية الكلمات المفتاحية - "الصفحة الرئيسية/الاشتراكات/نتائج البحث يتم تصفيتها لإخفاء المحتوى الذي يتطابق مع كلمات البحث + لمحة عن تصفية الكلمات المفتاحية + "الصفحة الرئيسية/الاشتراكات/نتائج البحث يتم تصفيتها لإخفاء المحتوى الذي يتطابق مع كلمات البحث القيود • فيديوهات Shorts لا يمكن إخفاؤها بواسطة اسم القناة • قد لا يتم إخفاء بعض مكونات واجهة المستخدم • البحث عن كلمة ما قد لا يعطي نتائج" - مطابقة الكلمات بأكملها - - سيؤدي وضع علامة اقتباس مزدوجة حول كلمة مفتاحية/عبارة إلى منع التطابقات الجزئية لعناوين الفيديو وأسماء القنوات<br><br>على سبيل المثال،<br><b>\"ai\"</b> سيخفي الفيديو: <b>How does AI work?</b><br><b>ولكن لن يخفي:<b>What does fair use mean?</b> - - لا يمكن استخدام الكلمة المفتاحية: %s - إضافة اقتباسات لاستخدام الكلمة المفتاحية: %s - الكلمة المفتاحية بها تعريفات متعارضة: %s - الكلمة المفتاحية قصيرة جدًا وتتطلب اقتباسات: %s - الكلمة المفتاحية سوف تخفي جميع الفيديوهات: %s - - - إخفاء رف متجر المنشئ - تم إخفاء رف متجر المنشئ أسفل مشغل الفيديو - يتم عرض رف متجر المنشئ أسفل مشغل الفيديو - إخفاء لافتة شاشة المتجر النهائية - تم إخفاء لافتة المتجر بالشاشة النهائية - يتم عرض لافتة المتجر بالشاشة النهائية - إخفاء إعلانات ملء الشاشة - "يتم إخفاء إعلانات ملء الشاشة + مطابقة الكلمات بأكملها + + سيؤدي وضع علامة اقتباس مزدوجة حول كلمة مفتاحية/عبارة إلى منع التطابقات الجزئية لعناوين الفيديو وأسماء القنوات<br><br>على سبيل المثال،<br><b>\"ai\"</b> سيخفي الفيديو: <b>How does AI work?</b><br><b>ولكن لن يخفي:<b>What does fair use mean?</b> + + لا يمكن استخدام الكلمة المفتاحية: %s + إضافة اقتباسات لاستخدام الكلمة المفتاحية: %s + الكلمة المفتاحية بها تعريفات متعارضة: %s + الكلمة المفتاحية قصيرة جدًا وتتطلب اقتباسات: %s + الكلمة المفتاحية سوف تخفي جميع الفيديوهات: %s + + + إخفاء رف متجر المنشئ + تم إخفاء رف متجر المنشئ أسفل مشغل الفيديو + يتم عرض رف متجر المنشئ أسفل مشغل الفيديو + إخفاء لافتة شاشة المتجر النهائية + تم إخفاء لافتة المتجر بالشاشة النهائية + يتم عرض لافتة المتجر بالشاشة النهائية + إخفاء إعلانات ملء الشاشة + "يتم إخفاء إعلانات ملء الشاشة هذه الميزة متاحة فقط للأجهزة القديمة" - يتم عرض إعلانات ملء الشاشة - - إخفاء إعلانات ملء الشاشة يعمل فقط مع الأجهزة القديمة - إخفاء الإعلانات العامة - تم إخفاء الإعلانات بشكل عام - يتم عرض الإعلانات العامة - إخفاء لافتات البضائع - تم إخفاء لافتات البضائع - يتم عرض لافتات البضائع - إخفاء تسمية الترقية المدفوعة - تم إخفاء تسمية الترقية المدفوعة - يتم عرض تسمية الترقية المدفوعة - إخفاء بطاقات الرعاية الذاتية - تم إخفاء بطاقات الرعاية الذاتية - يتم عرض بطاقات الرعاية الذاتية - إخفاء روابط التسوق - تم إخفاء روابط التسوق في وصف الفيديو - يتم عرض روابط التسوق في وصف الفيديو - إخفاء لافتة \'عرض المنتجات\' - تم إخفاء لافتة عرض المنتجات في واجهة الفيديو - يتم عرض لافتة عرض المنتجات في واجهة الفيديو - إخفاء نتائج بحث الويب - تم إخفاء نتائج البحث على الويب - يتم عرض نتائج البحث على الويب - - - إخفاء ترقية YouTube Premium - تم إخفاء عروض YouTube Premium الترويجية تحت مشغل الفيديو - يتم إظهار عروض YouTube Premium الترويجية تحت مشغل الفيديو - - - إخفاء إعلانات الفيديو - تم إخفاء إعلانات الفيديو - يتم عرض إعلانات الفيديو - - - تم نسخ URL إلى الحافظة - تم نسخ عنوان URL مع الطابع الزمني - عرض زر نسخ عنوان URL للفيديو - يتم عرض زر نسخ عنوان URL للفيديو. انقر لنسخ عنوان URL للفيديو. انقر مع الاستمرار للنسخ مع الطابع الزمني - لا يتم عرض زر نسخ عنوان URL للفيديو - عرض زر نسخ URL مع الطابع الزمني - يتم عرض زر نسخ عنوان URL مع الطابع الزمني. انقر لنسخ عنوان URL للفيديو مع الطابع الزمني. انقر مع الاستمرار للنسخ بدون الطابع الزمني - لا يتم عرض زر نسخ عنوان URL مع الطابع الزمني - - - إزالة مربع حوار تقدير المشاهد - سيتم إزالة مربع الحوار - سيتم عرض مربع الحوار - وهذا لا يتجاوز قيود السن. بل يقبلها تلقائيًا. - - - تعطيل النافذة المنبثقة لتسجيل الدخول إلى التلفزيون - تم تعطيل نافذة تسجيل الدخول إلى التلفزيون - تم تمكين نافذة تسجيل الدخول إلى التلفزيون - - - تعطيل تخطي الفصل بالنقر المزدوج - لا يمكن للنقر المزدوج مطلقًا أن يؤدي إلى تخطي الفصل التالي/السابق - يمكن للنقر المزدوج أن يؤدي أحيانًا إلى تخطي الفصل التالي/السابق - - - التنزيلات الخارجية - إعدادات لاستخدام أداة التنزيل الخارجية - عرض زر التنزيل الخارجي - يتم عرض زر التنزيل في المشغل - لا يتم عرض زر التنزيل في المشغل - - تجاوز زر إجراء زر التنزيل - يفتح زر التنزيل أداة التنزيل الخارجية - يفتح زر التنزيل أداة التنزيل الأصلية داخل التطبيق - اسم حزمة أداة التنزيل - اسم حزمة تطبيق التنزيل الخارجي المثبت لديك - أدخل اسم الحزمة - أخرى - التطبيق غير مثبت - لم يتم تثبيت %s . الرجاء تثبيته. - "تعذر العثور على التطبيق المثبت باسم الحزمة: %s + يتم عرض إعلانات ملء الشاشة + + إخفاء إعلانات ملء الشاشة يعمل فقط مع الأجهزة القديمة + إخفاء الإعلانات العامة + تم إخفاء الإعلانات بشكل عام + يتم عرض الإعلانات العامة + إخفاء لافتات البضائع + تم إخفاء لافتات البضائع + يتم عرض لافتات البضائع + إخفاء تسمية الترقية المدفوعة + تم إخفاء تسمية الترقية المدفوعة + يتم عرض تسمية الترقية المدفوعة + إخفاء بطاقات الرعاية الذاتية + تم إخفاء بطاقات الرعاية الذاتية + يتم عرض بطاقات الرعاية الذاتية + إخفاء روابط التسوق + تم إخفاء روابط التسوق في وصف الفيديو + يتم عرض روابط التسوق في وصف الفيديو + إخفاء لافتة \'عرض المنتجات\' + تم إخفاء لافتة عرض المنتجات في واجهة الفيديو + يتم عرض لافتة عرض المنتجات في واجهة الفيديو + إخفاء نتائج بحث الويب + تم إخفاء نتائج البحث على الويب + يتم عرض نتائج البحث على الويب + + + إخفاء ترقية YouTube Premium + تم إخفاء عروض YouTube Premium الترويجية تحت مشغل الفيديو + يتم إظهار عروض YouTube Premium الترويجية تحت مشغل الفيديو + + + إخفاء إعلانات الفيديو + تم إخفاء إعلانات الفيديو + يتم عرض إعلانات الفيديو + + + تم نسخ URL إلى الحافظة + تم نسخ عنوان URL مع الطابع الزمني + عرض زر نسخ عنوان URL للفيديو + يتم عرض زر نسخ عنوان URL للفيديو. انقر لنسخ عنوان URL للفيديو. انقر مع الاستمرار للنسخ مع الطابع الزمني + لا يتم عرض زر نسخ عنوان URL للفيديو + عرض زر نسخ URL مع الطابع الزمني + يتم عرض زر نسخ عنوان URL مع الطابع الزمني. انقر لنسخ عنوان URL للفيديو مع الطابع الزمني. انقر مع الاستمرار للنسخ بدون الطابع الزمني + لا يتم عرض زر نسخ عنوان URL مع الطابع الزمني + + + إزالة مربع حوار تقدير المشاهد + سيتم إزالة مربع الحوار + سيتم عرض مربع الحوار + وهذا لا يتجاوز قيود السن. بل يقبلها تلقائيًا. + + + تعطيل النافذة المنبثقة لتسجيل الدخول إلى التلفزيون + تم تعطيل نافذة تسجيل الدخول إلى التلفزيون + تم تمكين نافذة تسجيل الدخول إلى التلفزيون + + + تعطيل تخطي الفصل بالنقر المزدوج + لا يمكن للنقر المزدوج مطلقًا أن يؤدي إلى تخطي الفصل التالي/السابق + يمكن للنقر المزدوج أن يؤدي أحيانًا إلى تخطي الفصل التالي/السابق + + + التنزيلات الخارجية + إعدادات لاستخدام أداة التنزيل الخارجية + عرض زر التنزيل الخارجي + يتم عرض زر التنزيل في المشغل + لا يتم عرض زر التنزيل في المشغل + + تجاوز زر إجراء زر التنزيل + يفتح زر التنزيل أداة التنزيل الخارجية + يفتح زر التنزيل أداة التنزيل الأصلية داخل التطبيق + اسم حزمة أداة التنزيل + اسم حزمة تطبيق التنزيل الخارجي المثبت لديك + أدخل اسم الحزمة + أخرى + التطبيق غير مثبت + لم يتم تثبيت %s . الرجاء تثبيته. + "تعذر العثور على التطبيق المثبت باسم الحزمة: %s تأكد من أن اسم الحزمة صحيح وأن التطبيق مثبت" - لا يمكن أن يكون اسم الحزمة فارغًا - - - تعطيل إيماءة التمرير الدقيقة - تم تعطيل إيماءة التمرير الدقيقة - تم تمكين إيماءة التمرير الدقيقة - - - تمكين النقر للتمرير - تم تمكين النقر للتمرير - تم تعطيل النقر للتمرير - - - تمكين إيماءة السطوع - "تم تمكين إيماءة مستوى السطوع في وضع ملء الشاشة + لا يمكن أن يكون اسم الحزمة فارغًا + + + تعطيل إيماءة التمرير الدقيقة + تم تعطيل إيماءة التمرير الدقيقة + تم تمكين إيماءة التمرير الدقيقة + + + تمكين النقر للتمرير + تم تمكين النقر للتمرير + تم تعطيل النقر للتمرير + + + تمكين إيماءة السطوع + "تم تمكين إيماءة مستوى السطوع في وضع ملء الشاشة اضبط مستوى السطوع بالتمرير عموديًا على يسار الشاشة" - تم تعطيل إيماءة مستوى السطوع في وضع ملء الشاشة - تمكين إيماءة الصوت - "تم تمكين إيماءة مستوى الصوت في وضع ملء الشاشة + تم تعطيل إيماءة مستوى السطوع في وضع ملء الشاشة + تمكين إيماءة الصوت + "تم تمكين إيماءة مستوى الصوت في وضع ملء الشاشة اضبط مستوى الصوت عن طريق التمرير عموديًا على الجانب الأيمن من الشاشة" - تم تعطيل إيماءة مستوى الصوت في وضع ملء الشاشة - تمكين الضغط لتمرير الإيماءة - تم تمكين الضغط لتمرير الإيماءة - تم تعطيل الضغط لتمرير الإيماءة - الاهتزاز عند الضغط - تم تمكين الاهتزاز عند الضغط - تم تعطيل الاهتزاز عند الضغط - حفظ واستعادة السطوع - حفظ واستعادة السطوع عند الخروج أو الدخول إلى وضع ملء الشاشة - لا تقم بحفظ السطوع واستعادته عند الخروج أو الدخول إلى وضع ملء الشاشة - تمكين إيماءة السطوع التلقائي - التمرير لأسفل إلى أدنى قيمة للسطوع يمكّن السطوع التلقائي - لا يؤدي التمرير لأسفل إلى أدنى قيمة إلى تمكين السطوع التلقائي - تلقائي - مهلة واجهة التمرير - مقدار الوقت الذي تظهر فيه واجهة التمرير بعد التغيير بجزء الثانية - تعتيم خلفية واجهة التمرير - قيمة الشفافية بين 0-100 - يجب أن تكون شفافية التمرير بين 0-100 - لون نمط إيماءة السطوع - لون شريط عناصر التحكم في مستوى السطوع - لون نمط إيماءة الصوت - لون شريط عناصر التحكم في مستوى الصوت - حجم نص نمط إيماءة التمرير - حجم النص لنمط التمرير بين 1-30 - يجب أن يكون حجم النص بين 1-30 - مقدار حد التمرير - مقدار الحد الأقصى لحدوث التمرير - حساسية تمرير مستوى الصوت - مقدار تغير مستوى الصوت لكل تمريرة - نمط واجهة التمرير - النمط الافقي - النمط الأفقي (الأدنى - الأعلى) - النمط الأفقي (الأدنى - المنتصف) - النمط الدائري - النمط الدائري (الأدنى) - النمط العمودي - النمط العمودي (الأدنى) - تمكين إيماءة التمرير لتغيير الفيديوهات - سيؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق - لن يؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق - - - تعطيل الترجمة التلقائية - تم تعطيل الترجمة التلقائية - تم تمكين الترجمة التلقائية - - - أزرار الإجراء - إخفاء أو عرض الأزرار تحت الفيديوهات - تعطيل توهج الإعجاب والاشتراك - لن يتوهج زر أعجبني والاشتراك عند الإشارة إليه - سيتوهَّج زر أعجبني والاشتراك عند الإشارة إليه - إخفاء أعجبني ولم يعجبني - تم إخفاء أزرار أعجبني ولم يعجبني - يتم عرض أزرار أعجبني ولم يعجبني - - إخفاء المشاركة - تم إخفاء زر مشاركة - يتم عرض زر مشاركة - - إخفاء إيقاف الإعلانات - تم إخفاء زر إيقاف الإعلانات - يتم عرض زر إيقاف الإعلانات - - إخفاء التعليقات - تم إخفاء زر التعليقات - يتم عرض زر التعليقات - + إخفاء المشاركة + تم إخفاء زر مشاركة + يتم عرض زر مشاركة + + إخفاء إيقاف الإعلانات + تم إخفاء زر إيقاف الإعلانات + يتم عرض زر إيقاف الإعلانات + + إخفاء التعليقات + تم إخفاء زر التعليقات + يتم عرض زر التعليقات + - إخفاء إبلاغ - تم إخفاء زر إبلاغ - يتم عرض زر إبلاغ - - إخفاء ريمكس - تم إخفاء زر ريمكس - يتم عرض زر ريمكس - - إخفاء تنزيل - تم إخفاء زر تنزيل - يتم عرض زر تنزيل - + إخفاء ريمكس + تم إخفاء زر ريمكس + يتم عرض زر ريمكس + + إخفاء تنزيل + تم إخفاء زر تنزيل + يتم عرض زر تنزيل + - إخفاء التشجيع - تم إخفاء زر التشجيع - يتم عرض زر التشجيع - - إخفاء الترويج - تم إخفاء زر الترويج - يتم عرض زر الترويج - - إخفاء شكرًا - تم إخفاء زر شكرًا - يتم عرض زر شكرًا - + إخفاء الترويج + تم إخفاء زر الترويج + يتم عرض زر الترويج + + إخفاء شكرًا + تم إخفاء زر شكرًا + يتم عرض زر شكرًا + - إخفاء طرح سؤال - تم إخفاء زر طرح سؤال - يتم عرض زر طرح سؤال - - إخفاء المقطع - تم إخفاء زر المقطع - يتم عرض زر المقطع - - إخفاء المتجر - تم إخفاء زر المتجر - يتم عرض زر المتجر - - إخفاء حفظ - تم إخفاء زر حفظ - يتم عرض زر حفظ - - - أزرار التنقل - إخفاء أو تغيير الأزرار في شريط التنقل - - إخفاء الصفحة الرئيسية - تم إخفاء زر الصفحة الرئيسية - يتم عرض زر الصفحة الرئيسية - - إخفاء Shorts - تم إخفاء زر Shorts - يتم عرض زر Shorts - - إخفاء إنشاء - تم إخفاء زر الإنشاء - يتم عرض زر الإنشاء - - إخفاء الاشتراكات - تم إخفاء زر الاشتراكات - يتم عرض زر الاشتراكات - إخفاء الإشعارات - تم إخفاء زر الإشعارات - يتم عرض زر الإشعارات - - تبديل الإنشاء بالإشعارات - "تم تبديل زر الإنشاء بـزر الإشعارات + إخفاء طرح سؤال + تم إخفاء زر طرح سؤال + يتم عرض زر طرح سؤال + + إخفاء المقطع + تم إخفاء زر المقطع + يتم عرض زر المقطع + + إخفاء المتجر + تم إخفاء زر المتجر + يتم عرض زر المتجر + + إخفاء حفظ + تم إخفاء زر حفظ + يتم عرض زر حفظ + + + أزرار التنقل + إخفاء أو تغيير الأزرار في شريط التنقل + + إخفاء الصفحة الرئيسية + تم إخفاء زر الصفحة الرئيسية + يتم عرض زر الصفحة الرئيسية + + إخفاء Shorts + تم إخفاء زر Shorts + يتم عرض زر Shorts + + إخفاء إنشاء + تم إخفاء زر الإنشاء + يتم عرض زر الإنشاء + + إخفاء الاشتراكات + تم إخفاء زر الاشتراكات + يتم عرض زر الاشتراكات + إخفاء الإشعارات + تم إخفاء زر الإشعارات + يتم عرض زر الإشعارات + + تبديل الإنشاء بالإشعارات + "تم تبديل زر الإنشاء بـزر الإشعارات ملاحظة: يؤدي تمكين هذا أيضًا إلى إخفاء إعلانات الفيديو بالقوة" - لا يتم تبديل زر الإنشاء بزر الإشعارات - "سيؤدي تعطيل هذا الإعداد أيضًا إلى تعطيل حظر إعلانات Shorts. + لا يتم تبديل زر الإنشاء بزر الإشعارات + "سيؤدي تعطيل هذا الإعداد أيضًا إلى تعطيل حظر إعلانات Shorts. إذا لم يتم تفعيل تغيير هذا الإعداد، فحاول التبديل إلى وضع التصفُّح المتخفي." - إخفاء تسميات زر التنقل - تم إخفاء التسميات - يتم عرض التسميات - تعطيل شريط الحالة الشفاف - شريط الحالة غير شفاف - شريط الحالة معتم أو شفاف - في بعض الأجهزة، قد يؤدي تمكين هذه الميزة إلى تغيير شريط التنقل في النظام إلى شفاف. - تعطيل الشريط الشفاف الفاتح - شريط التنقل في الوضع الفاتح غير شفاف - شريط التنقل في الوضع الفاتح معتم او شفاف - تعطيل الشريط الشفاف الداكن - شريط التنقل في الوضع الداكن غير شفاف - شريط التنقل في الوضع الداكن معتم او شفاف - - - القائمة المنبثقة - إخفاء أو عرض عناصر قائمة المشغل المنبثقة - - إخفاء الترجمة - تم إخفاء قائمة الترجمة - يتم عرض قائمة الترجمة - - إخفاء إعدادات إضافية - تم إخفاء قائمة إعدادات إضافية - يتم عرض قائمة إعدادات إضافية - - إخفاء مؤقِّت إيقاف التشغيل - تم إخفاء قائمة مؤقِّت إيقاف التشغيل - يتم عرض قائمة مؤقِّت إيقاف التشغيل - - إخفاء تكرار الفيديو - تم إخفاء قائمة تكرار الفيديو - يتم عرض قائمة تكرار الفيديو - - إخفاء وضع الإضاءة السينمائية - تم إخفاء قائمة الإضاءة السينمائية - يتم عرض قائمة الإضاءة السينمائية - إخفاء مستوى الصوت الثابت - يتم عرض قائمة مستوى الصوت الثابت - تم إخفاء قائمة مستوى الصوت الثابت - - إخفاء المساعدة & الملاحظات - تم إخفاء قائمة المساعدة & الملاحظات - يتم عرض قائمة المساعدة & الملاحظات - - إخفاء سرعة التشغيل - تم إخفاء قائمة سرعة التشغيل - يتم عرض قائمة سرعة التشغيل - - إخفاء شاشة القفل - تم إخفاء قائمة شاشة القفل - يتم عرض قائمة شاشة القفل - - إخفاء الاستماع مع YouTube Music - تم إخفاء قائمة الاستماع مع YouTube Music - يتم عرض قائمة الاستماع مع YouTube Music - - إخفاء المقطع الصوتي - تم إخفاء قائمة المقطع الصوتي - يتم عرض قائمة المقطع الصوتي - + إخفاء الترجمة + تم إخفاء قائمة الترجمة + يتم عرض قائمة الترجمة + + إخفاء إعدادات إضافية + تم إخفاء قائمة إعدادات إضافية + يتم عرض قائمة إعدادات إضافية + + إخفاء مؤقِّت إيقاف التشغيل + تم إخفاء قائمة مؤقِّت إيقاف التشغيل + يتم عرض قائمة مؤقِّت إيقاف التشغيل + + إخفاء تكرار الفيديو + تم إخفاء قائمة تكرار الفيديو + يتم عرض قائمة تكرار الفيديو + + إخفاء وضع الإضاءة السينمائية + تم إخفاء قائمة الإضاءة السينمائية + يتم عرض قائمة الإضاءة السينمائية + إخفاء مستوى الصوت الثابت + يتم عرض قائمة مستوى الصوت الثابت + تم إخفاء قائمة مستوى الصوت الثابت + + إخفاء المساعدة & الملاحظات + تم إخفاء قائمة المساعدة & الملاحظات + يتم عرض قائمة المساعدة & الملاحظات + + إخفاء سرعة التشغيل + تم إخفاء قائمة سرعة التشغيل + يتم عرض قائمة سرعة التشغيل + + إخفاء شاشة القفل + تم إخفاء قائمة شاشة القفل + يتم عرض قائمة شاشة القفل + + إخفاء الاستماع مع YouTube Music + تم إخفاء قائمة الاستماع مع YouTube Music + يتم عرض قائمة الاستماع مع YouTube Music + + إخفاء المقطع الصوتي + تم إخفاء قائمة المقطع الصوتي + يتم عرض قائمة المقطع الصوتي + - "تم إخفاء قائمة المقطع الصوتي + "تم إخفاء قائمة المقطع الصوتي لعرض قائمة المقطع الصوتي، غيّر 'Spoof Video Streams' إلى 'Android No SDK'" - - إخفاء المشاهدة في VR - تم إخفاء قائمة المشاهدة في الوضع الافتراضي - يتم عرض قائمة المشاهدة في الوضع الافتراضي - إخفاء قائمة جودة الفيديو - تم إخفاء قائمة جودة الفيديو - يتم عرض قائمة جودة الفيديو - إخفاء تذييل قائمة جودة الفيديو - تم إخفاء تذييل قائمة جودة الفيديو - يتم عرض تذييل قائمة جودة الفيديو - - - إخفاء زر التشغيل التلقائي - تم إخفاء زر التشغيل التلقائي - يتم عرض زر التشغيل التلقائي - - إخفاء زر الترجمة - تم إخفاء زر الترجمة - يتم عرض زر الترجمة - إخفاء زر البث - تم إخفاء زر البث - يتم عرض زر البث - إخفاء خلفية عناصر التحكم بالمشغل - تم إخفاء خلفية عناصر تحكم المشغل - يتم عرض خلفية عناصر تحكم المشغل - إخفاء أزرار السابق & التالي - تم إخفاء أزرار السابق & التالي - يتم عرض أزرار السابق & التالي - - - إخفاء بطاقات شاشة النهاية - تم إخفاء بطاقات شاشة النهاية - يتم عرض بطاقات شاشة النهاية - - - تعطيل وضع الإضاءة السينمائية في ملء الشاشة - تم تعطيل وضع الإضاءة السينمائية - تم تمكين وضع الإضاءة السينمائية - - - إخفاء بطاقات المعلومات - تم إخفاء بطاقات المعلومات - يتم عرض بطاقات المعلومات - - - تعطيل عدد مرات المشاهدة والإعجابات في الوقت الفعلي - عدد مرات المشاهدة والإعجابات غير متحركة - عدد مرات المشاهدة والإعجابات متحركة - - - إخفاء شريط تقدم مشغل الفيديو - تم إخفاء شريط تقدم الفيديو - يتم عرض شريط تقدم الفيديو - - إخفاء شريط تقدم مصغرات الفيديو - تم إخفاء شريط تقدم مصغرات الفيديو - يتم عرض شريط تقدم مصغرات الفيديو - - - مشغل Shorts - إخفاء أو عرض مكونات مشغل Shorts - - إخفاء Shorts في الصفحة الرئيسية - مخفي في موجز الصفحة الرئيسية والفيديوهات ذات الصلة - يُعرض في موجز الصفحة الرئيسية والفيديوهات ذات الصلة - إخفاء Shorts في نتائج البحث - مخفي في نتائج البحث - يُعرض في نتائج البحث - - إخفاء Shorts في موجز الاشتراكات - مخفي في موجز الاشتراكات - يُعرض في موجز الاشتراكات - إخفاء Shorts في السجلّ - مخفي في السجلّ - يُعرض في السجلّ - إخفاء تسمية \"مدبلج تلقائياً\" - تم إخفاء تسمية الدبلجة التلقائية - يتم عرض تسمية الدبلجة التلقائية - إخفاء زر شراء Super Thanks - تم إخفاء زر شراء Super Thanks - يتم عرض زر شراء Super Thanks - إخفاء زر التأثير - تم إخفاء زر التأثير - يتم عرض زر التأثير - إخفاء زر الشاشة الخضراء - تم إخفاء زر الشاشة الخضراء - يتم عرض زر الشاشة الخضراء - إخفاء زر هاشتاج - تم إخفاء زر الهاشتاج - يتم عرض زر الهاشتاج - - إخفاء زر الانضمام - تم إخفاء زر الانضمام - يتم عرض زر الانضمام - إخفاء المعاينة المباشرة - تم إخفاء معاينة البث المباشر - تم عرض معاينة البث المباشر - إخفاء تسمية الموقع - تم إخفاء تسمية الموقع - يتم عرض تسمية الموقع - إخفاء زر المنشورات الجديدة - تم إخفاء زر المنشورات الجديدة - يتم عرض زر المنشورات الجديدة - إخفاء أزرار واجهة التوقف - تم إخفاء أزرار واجهة التوقف - يتم عرض أزرار واجهة التوقف - إخفاء تعليق المعاينة - تم إخفاء تعليق المعاينة - يتم عرض تعليق المعاينة - إخفاء زر حفظ الموسيقى - تم إخفاء زر حفظ الموسيقى - يتم عرض زر حفظ الموسيقى - إخفاء اقتراحات البحث - تم إخفاء اقتراحات البحث - يتم عرض اقتراحات البحث - إخفاء زر المتجر - تم إخفاء زر المتجر - يتم عرض زر المتجر - إخفاء الملصقات - تم إخفاء الملصقات - يتم عرض الملصقات - إخفاء زر الاشتراك - تم إخفاء زر الاشتراك - يتم عرض زر الاشتراك - إخفاء المنتجات الموسومة - تم إخفاء المنتجات الموسومة - يتم عرض المنتجات الموسومة - إخفاء زر القادم - تم إخفاء زر القادم - يتم عرض زر القادم - إخفاء زر استخدام هذا الصوت - تم إخفاء زر استخدام هذا الصوت - يتم عرض زر استخدام هذا الصوت - إخفاء زر استخدام النموذج - تم إخفاء زر استخدم هذا النموذج - يتم عرض زر استخدم هذا النموذج - إخفاء التأثير الفوّار لـزر أعجبني - تم إخفاء التأثير الفوّار لـزر أعجبني - يتم عرض التأثير الفوّار لـزر أعجبني - إخفاء زر أعجبني - تم إخفاء زر أعجبني - يتم عرض زر أعجبني - إخفاء زر لم يعجبني - تم إخفاء زر لم يعجبني - يتم عرض زر لم يعجبني - إخفاء زر التعليقات - تم إخفاء زر التعليقات - يتم عرض زر التعليقات - - إخفاء زر مشاركة - تم إخفاء زر مشاركة - يتم عرض زر مشاركة - - إخفاء زر ريمكس - تم إخفاء زر ريمكس - يتم عرض زر ريمكس - إخفاء زر الصوت - تم إخفاء زر الصوت - يتم عرض زر الصوت - إخفاء لوحة المعلومات - تم إخفاء لوحة المعلومات - يتم عرض لوحة المعلومات - إخفاء شريط القناة - تم إخفاء شريط القناة - يتم عرض شريط القناة - إخفاء عنوان الفيديو - تم إخفاء عنوان الفيديو - يتم عرض عنوان الفيديو - إخفاء تسمية بيانات التعريف الصوتية - تم إخفاء تسمية بيانات التعريف الصوتية - يتم عرض تسمية بيانات التعريف الصوتية - إخفاء تسمية رابط الفيديو - تم إخفاء تسمية رابط الفيديو - يتم عرض تسمية رابط الفيديو - إخفاء شريط التنقل - تم إخفاء شريط التنقل - يتم عرض شريط التنقل - - - إخفاء الفيديو المقترح في شاشة النهاية - "تم إخفاء الفيديو المقترح في شاشة النهاية عند إيقاف التشغيل التلقائي + + إخفاء المشاهدة في VR + تم إخفاء قائمة المشاهدة في الوضع الافتراضي + يتم عرض قائمة المشاهدة في الوضع الافتراضي + إخفاء قائمة جودة الفيديو + تم إخفاء قائمة جودة الفيديو + يتم عرض قائمة جودة الفيديو + إخفاء تذييل قائمة جودة الفيديو + تم إخفاء تذييل قائمة جودة الفيديو + يتم عرض تذييل قائمة جودة الفيديو + + + إخفاء زر التشغيل التلقائي + تم إخفاء زر التشغيل التلقائي + يتم عرض زر التشغيل التلقائي + + إخفاء زر الترجمة + تم إخفاء زر الترجمة + يتم عرض زر الترجمة + إخفاء زر البث + تم إخفاء زر البث + يتم عرض زر البث + إخفاء خلفية عناصر التحكم بالمشغل + تم إخفاء خلفية عناصر تحكم المشغل + يتم عرض خلفية عناصر تحكم المشغل + إخفاء أزرار السابق & التالي + تم إخفاء أزرار السابق & التالي + يتم عرض أزرار السابق & التالي + + + إخفاء بطاقات شاشة النهاية + تم إخفاء بطاقات شاشة النهاية + يتم عرض بطاقات شاشة النهاية + + + تعطيل وضع الإضاءة السينمائية في ملء الشاشة + تم تعطيل وضع الإضاءة السينمائية + تم تمكين وضع الإضاءة السينمائية + + + إخفاء بطاقات المعلومات + تم إخفاء بطاقات المعلومات + يتم عرض بطاقات المعلومات + + + تعطيل عدد مرات المشاهدة والإعجابات في الوقت الفعلي + عدد مرات المشاهدة والإعجابات غير متحركة + عدد مرات المشاهدة والإعجابات متحركة + + + إخفاء شريط تقدم مشغل الفيديو + تم إخفاء شريط تقدم الفيديو + يتم عرض شريط تقدم الفيديو + + إخفاء شريط تقدم مصغرات الفيديو + تم إخفاء شريط تقدم مصغرات الفيديو + يتم عرض شريط تقدم مصغرات الفيديو + + + مشغل Shorts + إخفاء أو عرض مكونات مشغل Shorts + + إخفاء Shorts في الصفحة الرئيسية + مخفي في موجز الصفحة الرئيسية والفيديوهات ذات الصلة + يُعرض في موجز الصفحة الرئيسية والفيديوهات ذات الصلة + إخفاء Shorts في نتائج البحث + مخفي في نتائج البحث + يُعرض في نتائج البحث + + إخفاء Shorts في موجز الاشتراكات + مخفي في موجز الاشتراكات + يُعرض في موجز الاشتراكات + إخفاء Shorts في السجلّ + مخفي في السجلّ + يُعرض في السجلّ + إخفاء تسمية \"مدبلج تلقائياً\" + تم إخفاء تسمية الدبلجة التلقائية + يتم عرض تسمية الدبلجة التلقائية + إخفاء زر شراء Super Thanks + تم إخفاء زر شراء Super Thanks + يتم عرض زر شراء Super Thanks + إخفاء زر التأثير + تم إخفاء زر التأثير + يتم عرض زر التأثير + إخفاء زر الشاشة الخضراء + تم إخفاء زر الشاشة الخضراء + يتم عرض زر الشاشة الخضراء + إخفاء زر هاشتاج + تم إخفاء زر الهاشتاج + يتم عرض زر الهاشتاج + + إخفاء زر الانضمام + تم إخفاء زر الانضمام + يتم عرض زر الانضمام + إخفاء المعاينة المباشرة + تم إخفاء معاينة البث المباشر + تم عرض معاينة البث المباشر + إخفاء تسمية الموقع + تم إخفاء تسمية الموقع + يتم عرض تسمية الموقع + إخفاء زر المنشورات الجديدة + تم إخفاء زر المنشورات الجديدة + يتم عرض زر المنشورات الجديدة + إخفاء أزرار واجهة التوقف + تم إخفاء أزرار واجهة التوقف + يتم عرض أزرار واجهة التوقف + إخفاء تعليق المعاينة + تم إخفاء تعليق المعاينة + يتم عرض تعليق المعاينة + إخفاء زر حفظ الموسيقى + تم إخفاء زر حفظ الموسيقى + يتم عرض زر حفظ الموسيقى + إخفاء اقتراحات البحث + تم إخفاء اقتراحات البحث + يتم عرض اقتراحات البحث + إخفاء زر المتجر + تم إخفاء زر المتجر + يتم عرض زر المتجر + إخفاء الملصقات + تم إخفاء الملصقات + يتم عرض الملصقات + إخفاء زر الاشتراك + تم إخفاء زر الاشتراك + يتم عرض زر الاشتراك + إخفاء المنتجات الموسومة + تم إخفاء المنتجات الموسومة + يتم عرض المنتجات الموسومة + إخفاء زر القادم + تم إخفاء زر القادم + يتم عرض زر القادم + إخفاء زر استخدام هذا الصوت + تم إخفاء زر استخدام هذا الصوت + يتم عرض زر استخدام هذا الصوت + إخفاء زر استخدام النموذج + تم إخفاء زر استخدم هذا النموذج + يتم عرض زر استخدم هذا النموذج + إخفاء التأثير الفوّار لـزر أعجبني + تم إخفاء التأثير الفوّار لـزر أعجبني + يتم عرض التأثير الفوّار لـزر أعجبني + إخفاء زر أعجبني + تم إخفاء زر أعجبني + يتم عرض زر أعجبني + إخفاء زر لم يعجبني + تم إخفاء زر لم يعجبني + يتم عرض زر لم يعجبني + إخفاء زر التعليقات + تم إخفاء زر التعليقات + يتم عرض زر التعليقات + + إخفاء زر مشاركة + تم إخفاء زر مشاركة + يتم عرض زر مشاركة + + إخفاء زر ريمكس + تم إخفاء زر ريمكس + يتم عرض زر ريمكس + إخفاء زر الصوت + تم إخفاء زر الصوت + يتم عرض زر الصوت + إخفاء لوحة المعلومات + تم إخفاء لوحة المعلومات + يتم عرض لوحة المعلومات + إخفاء شريط القناة + تم إخفاء شريط القناة + يتم عرض شريط القناة + إخفاء عنوان الفيديو + تم إخفاء عنوان الفيديو + يتم عرض عنوان الفيديو + إخفاء تسمية بيانات التعريف الصوتية + تم إخفاء تسمية بيانات التعريف الصوتية + يتم عرض تسمية بيانات التعريف الصوتية + إخفاء تسمية رابط الفيديو + تم إخفاء تسمية رابط الفيديو + يتم عرض تسمية رابط الفيديو + إخفاء شريط التنقل + تم إخفاء شريط التنقل + يتم عرض شريط التنقل + + + إخفاء الفيديو المقترح في شاشة النهاية + "تم إخفاء الفيديو المقترح في شاشة النهاية عند إيقاف التشغيل التلقائي يمكن تغيير التشغيل التلقائي في إعدادات YouTube: الإعدادات ← التشغيل ← تشغيل الفيديو التالي تلقائيًا" - يتم عرض الفيديو المقترح في شاشة النهاية - - - إخفاء واجهة الفيديوهات ذات الصلة - تم إخفاء واجهة الفيديوهات ذات الصلة في ملء الشاشة - يتم عرض واجهة الفيديوهات ذات الصلة في ملء الشاشة - - - إخفاء الطابع الزمني للفيديو - تم إخفاء الطابع الزمني - يتم عرض الطابع الزمني - - - إخفاء لوحات المشغل المنبثقة - تم إخفاء لوحات المشغل المنبثقة - يتم عرض لوحات المشغل المنبثقة - - - الخروج من وضع ملء الشاشة عند انتهاء الفيديو - معطل - بالطول - بالعرض - بالطول والعرض - - - فتح الفيديوهات في ملء الشاشة - يتم فتح الفيديوهات في وضع ملء الشاشة - لا يتم فتح الفيديوهات في وضع ملء الشاشة - - - شفافية واجهة المشغل - قيمة الشفافية بين 0-100، حيث يكون 0 شفاف - شفافية واجهة المشغل يجب أن تكون بين 0-100 - - - - لم يعجبني غير متاح مؤقتًا (انتهت مهلة API) - لم يعجبني غير متاح (الحالة %d) - عدد مرات لم يعجبني غير متوفر (حد API للعميل) - لم يعجبني غير متاح (%s) - - أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike - - مخفي بواسطة المالك - استعادة YouTube Dislike - يتم عرض لم يعجبني - لا يتم عرض لم يعجبني - عرض لم يعجني في فيديوهات Shorts - "يتم عرض عدد مرات لم يعجبني في فيديوهات Shorts + يتم عرض الفيديو المقترح في شاشة النهاية + + + إخفاء واجهة الفيديوهات ذات الصلة + تم إخفاء واجهة الفيديوهات ذات الصلة في ملء الشاشة + يتم عرض واجهة الفيديوهات ذات الصلة في ملء الشاشة + + + إخفاء الطابع الزمني للفيديو + تم إخفاء الطابع الزمني + يتم عرض الطابع الزمني + + + إخفاء لوحات المشغل المنبثقة + تم إخفاء لوحات المشغل المنبثقة + يتم عرض لوحات المشغل المنبثقة + + + الخروج من وضع ملء الشاشة عند انتهاء الفيديو + معطل + بالطول + بالعرض + بالطول والعرض + + + فتح الفيديوهات في ملء الشاشة + يتم فتح الفيديوهات في وضع ملء الشاشة + لا يتم فتح الفيديوهات في وضع ملء الشاشة + + + شفافية واجهة المشغل + قيمة الشفافية بين 0-100، حيث يكون 0 شفاف + شفافية واجهة المشغل يجب أن تكون بين 0-100 + + + + لم يعجبني غير متاح مؤقتًا (انتهت مهلة API) + لم يعجبني غير متاح (الحالة %d) + عدد مرات لم يعجبني غير متوفر (حد API للعميل) + لم يعجبني غير متاح (%s) + + أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike + + مخفي بواسطة المالك + استعادة YouTube Dislike + يتم عرض لم يعجبني + لا يتم عرض لم يعجبني + عرض لم يعجني في فيديوهات Shorts + "يتم عرض عدد مرات لم يعجبني في فيديوهات Shorts التقييد: قد لا تظهر مرات لم يعجبني في وضع التصفح المتخفي" - لا يتم عرض مرات لم يعجبني على فيديوهات Shorts - لم يعجبني كــ نسبة مئوية - يعرض عدد لم يعجبني كـ نسبة مئوية - يتم عرض عدد لم يعجبني كـ رَقَم - - مقاس زر أعجبني - زر أعجبني مصمم لأدنى عرض - زر أعجبني مصمم لأفضل مظهر - عرض الإعجابات المقدرة - يتم عرض عدد تقديري للإعجابات في الفيديوهات التي تم تعطيل الإعجابات فيها - لا يتم عرض عدد الإعجابات المقدرة - عرض ملاحظة إذا كان API غير متاح - يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike - لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike - ReturnYouTubeDislike.com - يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد - - إحصائيات واجهة برمجيات ReturnYouTubeDislike لهذا الجهاز - وقت استجابة API، متوسط - وقت استجابة API، الحد الأدنى - وقت استجابة API، الحد الأقصى - وقت استجابة API، آخر فيديو - لم يعجبني غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول - API جلب الأصوات وعدد الاتصالات - لم يتم إجراء اتصالات الشبكة - %d اتصالات شبكية أجريت - API جلب الأصوات، عدد المهلات - لم تنتهي مهلة الاتصالات الشبكية - اتصالات شبكية انتهت مهلتها %d - حدود معدل عميل API - لا توجد حدود لمعدل العميل - تم مواجهة حد معدل العميل %d مرة - %d جزء الثانية - - - تمكين شريط البحث العريض - تم تمكين شريط البحث العريض - تم تعطيل شريط البحث العريض - - - تمكين المصغرات عالية الجودة - مصغرات شريط التقدم عالية الجودة - مصغرات شريط التقدم متوسطة الجودة - مصغرات شريط التقدم بملء الشاشة عالية الجودة - مصغرات شريط التقدم بملء الشاشة متوسطة الجودة - "سيؤدي هذا أيضا إلى استعادة المصغرات على البث المباشر الذي لا يحتوي على مصغرات شريط التقدم. + لا يتم عرض مرات لم يعجبني على فيديوهات Shorts + لم يعجبني كــ نسبة مئوية + يعرض عدد لم يعجبني كـ نسبة مئوية + يتم عرض عدد لم يعجبني كـ رَقَم + + مقاس زر أعجبني + زر أعجبني مصمم لأدنى عرض + زر أعجبني مصمم لأفضل مظهر + عرض الإعجابات المقدرة + يتم عرض عدد تقديري للإعجابات في الفيديوهات التي تم تعطيل الإعجابات فيها + لا يتم عرض عدد الإعجابات المقدرة + عرض ملاحظة إذا كان API غير متاح + يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike + لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike + ReturnYouTubeDislike.com + يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد + + إحصائيات واجهة برمجيات ReturnYouTubeDislike لهذا الجهاز + وقت استجابة API، متوسط + وقت استجابة API، الحد الأدنى + وقت استجابة API، الحد الأقصى + وقت استجابة API، آخر فيديو + لم يعجبني غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول + API جلب الأصوات وعدد الاتصالات + لم يتم إجراء اتصالات الشبكة + %d اتصالات شبكية أجريت + API جلب الأصوات، عدد المهلات + لم تنتهي مهلة الاتصالات الشبكية + اتصالات شبكية انتهت مهلتها %d + حدود معدل عميل API + لا توجد حدود لمعدل العميل + تم مواجهة حد معدل العميل %d مرة + %d جزء الثانية + + + تمكين شريط البحث العريض + تم تمكين شريط البحث العريض + تم تعطيل شريط البحث العريض + + + تمكين المصغرات عالية الجودة + مصغرات شريط التقدم عالية الجودة + مصغرات شريط التقدم متوسطة الجودة + مصغرات شريط التقدم بملء الشاشة عالية الجودة + مصغرات شريط التقدم بملء الشاشة متوسطة الجودة + "سيؤدي هذا أيضا إلى استعادة المصغرات على البث المباشر الذي لا يحتوي على مصغرات شريط التقدم. مصغرات شريط التقدم سوف تستخدم نفس جودة الفيديو الحالي. تعمل هذه الميزة بشكل أفضل مع جودة فيديو 720p أو أقل وعند استخدام اتصال إنترنت سريع جدًا." - استعادة مصغرات شريط التقدم القديمة - مصغرات شريط التقدم ستظهر فوق شريط تقدم الفيديو - مصغرات شريط التقدم ستظهر في ملء الشاشة - - - SponsorBlock - تمكين SponsorBlock - مانع الرُعَاة هو نظام جماعي لتخطي الأجزاء المزعجة من فيديوهات YouTube - المظهر - عرض زر التصويت - يتم عرض زر التصويت على المقطع - لا يتم عرض زر التصويت على المقطع - استخدام التخطيط المربع - الأزرار وعناصر التحكم مربعة الشكل - الأزرار وعناصر التحكم مدورة الشكل - - استخدام زر التخطي المُصَغَّر - زر التخطي مصمم لأدنى عرض - زر التخطي مصمم لأفضل مظهر - إخفاء زر التخطي تلقائيًا - إخفاء زر التخطي بعد بضع ثوانٍ - يتم عرض زر التخطي للمقطع بأكمله - مدة زر التخطي - كم من الوقت يجب إظهار أزرار التخطي والتخطي للأبرز قبل إخفائها تلقائيًا - عرض التراجع عن التخطي - تظهر ملاحظة عند تخطي مقطع تلقائيًا. انقر على الملاحظة للتراجع عن التخطي - لا يتم عرض الملاحظة - مدة ملاحظة التخطي - المدة اللازمة لإظهار التراجع عن التخطي - ثانية واحدة - ثانيتان - 3 ثوانٍ - 4 ثوانٍ - 5 ثوانٍ - 6 ثوانٍ - 7 ثوانٍ - 8 ثوانٍ - 9 ثوانٍ - 10 ثوانٍ - عرض مدة الفيديو بدون المقاطع - يعرض مدة الفيديو ناقصًا منه جميع المقاطع على شريط التقدم - يتم عرض مدة الفيديو كاملةً - إنشاء مقاطع جديدة - عرض زر إنشاء مقطع جديد - يتم عرض زر إنشاء مقطع جديد - لا يتم عرض زر إنشاء مقطع جديد - تعديل تقديم او تأخير المقطع الجديد - أجزاء الثانية في الوقت الذي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة - يجب أن تكون القيمة رقمًا موجبًا - عرض الإرشادات - الإرشادات تتضمن قواعد ونصائح لإنشاء مقاطع جديدة - اتبع الإرشادات - من المستحسن قراءة الإرشادات لـ SponsorBlock قبل تقديم أي مقطع - تمت قراءتها - اعرضها لي - عام - عرض ملاحظة إذا كان API غير متاح - يتم عرض ملاحظة في حالة عدم توفر SponsorBlock - لا يتم عرض ملاحظة في حالة عدم توفر SponsorBlock - تمكين تتبع مرات التخطي - يُتيح لـ SponsorBlock Leaderboard معرفة مقدار الوقت الذي وفره المشاهدين، يتم إعلام الخادم في كل مرة تتخطى فيها مقطعًا - تتبع عدد مرات التخطي غير مفعل - الحد الأدنى لمدة المقطع - لن يتم عرض المقاطع الأقصر من هذه القيمة (بالثواني) أو تخطيها - المدة الزمنية غير صالحة - معرف المستخدم User ID الفريد الخاص بك - يجب أن يبقى هذا خاصًا. انه مثل كلمة المرور ولا ينبغي مشاركته مع أي شخص. إذا كان شخص ما يملك هذا، فيمكنه انتحال شخصيتك - يجب أن يكون معرف المستخدم الخاص 30 حرفًا على الأقل - تغيير عنوان API - العنوان الذي يستخدمه SponsorBlock لإجراء اتصالات إلى الخادم - إعادة تعيين رابط API - رابط API غير صالح - تم تغيير رابط API - إستيراد/تصدير الإعدادات - نسخ - تكوين SponsorBlock JSON الخاص بك والذي يمكن استيراده/تصديره إلى ReVanced ومنصات SponsorBlock الأخرى - تكوين SponsorBlock الخاص بك كتنسيق JSON الذي يمكن استيراده / تصديره إلى ReVanced وغيره من منصات SponsorBlock الأخرى. يتضمن هذا معرف المستخدم الفريد الخاص بك. تأكد من مشاركته بحكمة - تم استيراد الإعدادات بنجاح - فشل استيراد: %s - فشل تصدير: %s - "تحتوي إعداداتك على معرف مستخدم خاص لـ SponsorBlock. + استعادة مصغرات شريط التقدم القديمة + مصغرات شريط التقدم ستظهر فوق شريط تقدم الفيديو + مصغرات شريط التقدم ستظهر في ملء الشاشة + + + SponsorBlock + تمكين SponsorBlock + مانع الرُعَاة هو نظام جماعي لتخطي الأجزاء المزعجة من فيديوهات YouTube + المظهر + عرض زر التصويت + يتم عرض زر التصويت على المقطع + لا يتم عرض زر التصويت على المقطع + استخدام التخطيط المربع + الأزرار وعناصر التحكم مربعة الشكل + الأزرار وعناصر التحكم مدورة الشكل + + استخدام زر التخطي المُصَغَّر + زر التخطي مصمم لأدنى عرض + زر التخطي مصمم لأفضل مظهر + إخفاء زر التخطي تلقائيًا + إخفاء زر التخطي بعد بضع ثوانٍ + يتم عرض زر التخطي للمقطع بأكمله + مدة زر التخطي + كم من الوقت يجب إظهار أزرار التخطي والتخطي للأبرز قبل إخفائها تلقائيًا + عرض التراجع عن التخطي + تظهر ملاحظة عند تخطي مقطع تلقائيًا. انقر على الملاحظة للتراجع عن التخطي + لا يتم عرض الملاحظة + مدة ملاحظة التخطي + المدة اللازمة لإظهار التراجع عن التخطي + ثانية واحدة + ثانيتان + 3 ثوانٍ + 4 ثوانٍ + 5 ثوانٍ + 6 ثوانٍ + 7 ثوانٍ + 8 ثوانٍ + 9 ثوانٍ + 10 ثوانٍ + عرض مدة الفيديو بدون المقاطع + يعرض مدة الفيديو ناقصًا منه جميع المقاطع على شريط التقدم + يتم عرض مدة الفيديو كاملةً + إنشاء مقاطع جديدة + عرض زر إنشاء مقطع جديد + يتم عرض زر إنشاء مقطع جديد + لا يتم عرض زر إنشاء مقطع جديد + تعديل تقديم او تأخير المقطع الجديد + أجزاء الثانية في الوقت الذي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة + يجب أن تكون القيمة رقمًا موجبًا + عرض الإرشادات + الإرشادات تتضمن قواعد ونصائح لإنشاء مقاطع جديدة + اتبع الإرشادات + من المستحسن قراءة الإرشادات لـ SponsorBlock قبل تقديم أي مقطع + تمت قراءتها + اعرضها لي + عام + عرض ملاحظة إذا كان API غير متاح + يتم عرض ملاحظة في حالة عدم توفر SponsorBlock + لا يتم عرض ملاحظة في حالة عدم توفر SponsorBlock + تمكين تتبع مرات التخطي + يُتيح لـ SponsorBlock Leaderboard معرفة مقدار الوقت الذي وفره المشاهدين، يتم إعلام الخادم في كل مرة تتخطى فيها مقطعًا + تتبع عدد مرات التخطي غير مفعل + الحد الأدنى لمدة المقطع + لن يتم عرض المقاطع الأقصر من هذه القيمة (بالثواني) أو تخطيها + المدة الزمنية غير صالحة + معرف المستخدم User ID الفريد الخاص بك + يجب أن يبقى هذا خاصًا. انه مثل كلمة المرور ولا ينبغي مشاركته مع أي شخص. إذا كان شخص ما يملك هذا، فيمكنه انتحال شخصيتك + يجب أن يكون معرف المستخدم الخاص 30 حرفًا على الأقل + تغيير عنوان API + العنوان الذي يستخدمه SponsorBlock لإجراء اتصالات إلى الخادم + إعادة تعيين رابط API + رابط API غير صالح + تم تغيير رابط API + إستيراد/تصدير الإعدادات + نسخ + تكوين SponsorBlock JSON الخاص بك والذي يمكن استيراده/تصديره إلى ReVanced ومنصات SponsorBlock الأخرى + تكوين SponsorBlock الخاص بك كتنسيق JSON الذي يمكن استيراده / تصديره إلى ReVanced وغيره من منصات SponsorBlock الأخرى. يتضمن هذا معرف المستخدم الفريد الخاص بك. تأكد من مشاركته بحكمة + تم استيراد الإعدادات بنجاح + فشل استيراد: %s + فشل تصدير: %s + "تحتوي إعداداتك على معرف مستخدم خاص لـ SponsorBlock. معرف المستخدم الخاص بك يشبه كلمة المرور ويجب عدم مشاركته أبدًا. " - لا تعرض مرة أخرى - تغيير سلوك المقطع - الراعي - الترويج المدفوع، والإحالات المدفوعة، والإعلانات المباشرة. ليس للترويج الذاتي أو الترويج المجاني للقضايا/المبدعين/المواقع الإلكترونية/المنتجات التي يفضلونها - ترويج شخصي/غير مدفوع الأجر - مشابهة لـ \'الراعي\' باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى - تذكير بالتفاعل (اشتراك) - تذكير قصير للإعجاب أو الاشتراك أو المتابعة في منتصف المحتوى. إذا كانت طويلة أو تتعلق بشيء محدد، فيجب أن تكون خاضعة للترويج الشخصي بدلاً من ذلك - الأبرز - الجزء من الفيديو الذي يبحث عنه معظم الناس - المقدمة/فاصل - فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات - الخاتمة / تترات النهاية - تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات - تحية / وداع - مقاطع دعائية مروية للفيديو القادم، تحيات ووداعات. لا تشمل الأقسام التي تضيف محتوى إضافيًا - معاينة / ملخص - مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر - خارج الموضوع / نكات - مشاهد أو نكات جانبية غير ضرورية لفهم المحتوى الرئيسي للفيديو. لا تشمل الأقسام التي توفر سياقًا أو تفاصيل خلفية - الموسيقى: مقطع غير موسيقي - فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى - تخطي - الأبرز - تخطي الراعي - تخطي العرض الترويجي - تخطي التفاعل - التخطي لأبرز المشاهد - تخطي المقدمة - تخطي الفاصل - تخطي الفاصل - تخطي الخاتمة - تخطي المقدمة - تخطي النظرة العامة - تخطي النظرة العامة - تخطي الملخص - تخطي مقطع غير ذي صلة - تخطي غير الموسيقى - تخطي المقطع - تم تخطي الراعي - تم تخطي الترويج الشخصي - تم تخطي التذكير بالتفاعل - تم التخطي لأبرز المشاهد - تم تخطي المقدمة - تم تخطي الفاصل - تم تخطي الفاصل - تم تخطي الخاتمة - تم تخطي المقدمة - تم تخطي النظرة العامة - تم تخطي النظرة العامة - تم تخطي الملخص - تم تخطي مقطع غير ذي صلة - تم تخطي جزء غير موسيقي - تم تخطي المقطع الغير المرسل - تم تخطي عدة مقاطع - التخطي تلقائيًا - التخطي تلقائيًا مرة واحدة - عرض زر التخطي - عرض في شريط تقدم الفيديو - تعطيل - غير قادر على إرسال المقطع: الحالة: %s - SponsorBlock متوقف مؤقتًا - غير قادر على إرسال المقطع (الحالة: %1$d %2$s) - لا يمكن إرسال المقطع. جارٍ الحد من معدل إرسالك (عدد كبير جدًا من نفس المستخدم أو IP) - لا يمكن إرسال المقطع: %s - "لا يمكن إرسال هذا المقطع. + لا تعرض مرة أخرى + تغيير سلوك المقطع + الراعي + الترويج المدفوع، والإحالات المدفوعة، والإعلانات المباشرة. ليس للترويج الذاتي أو الترويج المجاني للقضايا/المبدعين/المواقع الإلكترونية/المنتجات التي يفضلونها + ترويج شخصي/غير مدفوع الأجر + مشابهة لـ \'الراعي\' باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى + تذكير بالتفاعل (اشتراك) + تذكير قصير للإعجاب أو الاشتراك أو المتابعة في منتصف المحتوى. إذا كانت طويلة أو تتعلق بشيء محدد، فيجب أن تكون خاضعة للترويج الشخصي بدلاً من ذلك + الأبرز + الجزء من الفيديو الذي يبحث عنه معظم الناس + المقدمة/فاصل + فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات + الخاتمة / تترات النهاية + تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات + تحية / وداع + مقاطع دعائية مروية للفيديو القادم، تحيات ووداعات. لا تشمل الأقسام التي تضيف محتوى إضافيًا + معاينة / ملخص + مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر + خارج الموضوع / نكات + مشاهد أو نكات جانبية غير ضرورية لفهم المحتوى الرئيسي للفيديو. لا تشمل الأقسام التي توفر سياقًا أو تفاصيل خلفية + الموسيقى: مقطع غير موسيقي + فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى + تخطي + الأبرز + تخطي الراعي + تخطي العرض الترويجي + تخطي التفاعل + التخطي لأبرز المشاهد + تخطي المقدمة + تخطي الفاصل + تخطي الفاصل + تخطي الخاتمة + تخطي المقدمة + تخطي النظرة العامة + تخطي النظرة العامة + تخطي الملخص + تخطي مقطع غير ذي صلة + تخطي غير الموسيقى + تخطي المقطع + تم تخطي الراعي + تم تخطي الترويج الشخصي + تم تخطي التذكير بالتفاعل + تم التخطي لأبرز المشاهد + تم تخطي المقدمة + تم تخطي الفاصل + تم تخطي الفاصل + تم تخطي الخاتمة + تم تخطي المقدمة + تم تخطي النظرة العامة + تم تخطي النظرة العامة + تم تخطي الملخص + تم تخطي مقطع غير ذي صلة + تم تخطي جزء غير موسيقي + تم تخطي المقطع الغير المرسل + تم تخطي عدة مقاطع + التخطي تلقائيًا + التخطي تلقائيًا مرة واحدة + عرض زر التخطي + عرض في شريط تقدم الفيديو + تعطيل + غير قادر على إرسال المقطع: الحالة: %s + SponsorBlock متوقف مؤقتًا + غير قادر على إرسال المقطع (الحالة: %1$d %2$s) + لا يمكن إرسال المقطع. جارٍ الحد من معدل إرسالك (عدد كبير جدًا من نفس المستخدم أو IP) + لا يمكن إرسال المقطع: %s + "لا يمكن إرسال هذا المقطع. موجود بالفعل" - تم إرسال المقطع بنجاح - - SponsorBlock غير متاح مؤقتًا (انتهت مهلة API) - SponsorBlock غير متاح مؤقتًا (الحالة %d) - SponsorBlock غير متاح مؤقتًا - غير قادر على التصويت للمقطع (انتهت مهلة API) - غير قادر على التصويت للمقطع (الحالة: %1$d %2$s) - غير قادر على التصويت للمقطع: %s - تأييد - اعتراض - تغيير الفئة - لا توجد مقاطع للتصويت عليها - - %1$s إلى %2$s - اختيار فئة المقطع - الفئة معطلة في الإعدادات. تمكين الفئة للإرسال. - مقطع SponsorBlock جديد - تعيين %s كبداية أو نهاية لمقطع جديد؟ - البداية - النهاية - الآن - الوقت الذي يبدأ عنده المقطع - الوقت الذي ينتهي عنده المقطع - هل الأوقات صحيحة؟ - "المقطع من + تم إرسال المقطع بنجاح + + SponsorBlock غير متاح مؤقتًا (انتهت مهلة API) + SponsorBlock غير متاح مؤقتًا (الحالة %d) + SponsorBlock غير متاح مؤقتًا + غير قادر على التصويت للمقطع (انتهت مهلة API) + غير قادر على التصويت للمقطع (الحالة: %1$d %2$s) + غير قادر على التصويت للمقطع: %s + تأييد + اعتراض + تغيير الفئة + لا توجد مقاطع للتصويت عليها + + %1$s إلى %2$s + اختيار فئة المقطع + الفئة معطلة في الإعدادات. تمكين الفئة للإرسال. + مقطع SponsorBlock جديد + تعيين %s كبداية أو نهاية لمقطع جديد؟ + البداية + النهاية + الآن + الوقت الذي يبدأ عنده المقطع + الوقت الذي ينتهي عنده المقطع + هل الأوقات صحيحة؟ + "المقطع من %1$s إلى @@ -1292,47 +1291,47 @@ Second \"item\" text" (%3$s) هل أنت مستعد للإرسال؟" - يجب أن تكون البداية قبل النهاية - ضع علامة على موقعين في شريط الوقت أولًا - معاينة المقطع، والتأكد من تخطيه بسلاسة - تعديل توقيت المقطع يدويًا - هل تود تعديل التوقيت لبداية أو نهاية المقطع؟ - الوقت المحدد غير صحيح - إحصائيات - - الإحصائيات غير متوفرة مؤقتًا (API معطل) - جارٍ التحميل... - تم تعطيل SponsorBlock - اسم المستخدم الخاص بك: <b>%s</b> - اضغط هنا لتغيير اسم المستخدم الخاص بك - غير قادر على تغيير اسم المستخدم: الحالة: %1$d %2$s - تم تغيير اسم المستخدم بنجاح - سمعتك <b>%.2f</b> - لقد أنشأت <b>%s</b> مقطع - اضغط هنا لعرض المقاطع الخاصة بك - متصدرين SponsorBlock - لقد قمت بحفظ الناس من <b>%s</b> مقطع - اضغط هنا لرؤية الإحصائيات العالمية وأبرز المساهمين - هذا يساوي <b>%s</b> من حياتهم.<br>اضغط هنا لرؤية لوحة المتصدرين - لقد قمت بتخطي <b>%s</b> مقطع - هذا يساوي <b>%s</b> - إعادة تعيين عداد المقاطع التي تم تخطيها؟ - %1$s ساعة %2$s دقيقة - %1$s دقيقة %2$s ثانية - %s ثانية - الشفافية: - اللون: - لمحة - sponsor.ajay.app - يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد والتنزيل لمنصات أخرى - - - شكل نموذج التخطيط - الافتراضي - الجوّال - الجهاز اللوحي - Automotive - "التغييرات تشمل: + يجب أن تكون البداية قبل النهاية + ضع علامة على موقعين في شريط الوقت أولًا + معاينة المقطع، والتأكد من تخطيه بسلاسة + تعديل توقيت المقطع يدويًا + هل تود تعديل التوقيت لبداية أو نهاية المقطع؟ + الوقت المحدد غير صحيح + إحصائيات + + الإحصائيات غير متوفرة مؤقتًا (API معطل) + جارٍ التحميل... + تم تعطيل SponsorBlock + اسم المستخدم الخاص بك: <b>%s</b> + اضغط هنا لتغيير اسم المستخدم الخاص بك + غير قادر على تغيير اسم المستخدم: الحالة: %1$d %2$s + تم تغيير اسم المستخدم بنجاح + سمعتك <b>%.2f</b> + لقد أنشأت <b>%s</b> مقطع + اضغط هنا لعرض المقاطع الخاصة بك + متصدرين SponsorBlock + لقد قمت بحفظ الناس من <b>%s</b> مقطع + اضغط هنا لرؤية الإحصائيات العالمية وأبرز المساهمين + هذا يساوي <b>%s</b> من حياتهم.<br>اضغط هنا لرؤية لوحة المتصدرين + لقد قمت بتخطي <b>%s</b> مقطع + هذا يساوي <b>%s</b> + إعادة تعيين عداد المقاطع التي تم تخطيها؟ + %1$s ساعة %2$s دقيقة + %1$s دقيقة %2$s ثانية + %s ثانية + الشفافية: + اللون: + لمحة + sponsor.ajay.app + يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد والتنزيل لمنصات أخرى + + + شكل نموذج التخطيط + الافتراضي + الجوّال + الجهاز اللوحي + Automotive + "التغييرات تشمل: تصميم الجهاز اللوحي • مشاركات المجتمع مخفية @@ -1340,326 +1339,325 @@ Second \"item\" text" تصميم Automotive • يتم فتح Shorts في المشغل العادي • يتم تنظيم الموجز حسب المواضيع والقنوات" - - - إصدار تطبيق وهمي - تم تغيير اصدار التطبيق - لم يتم تغيير اصدار التطبيق - "سيتم تغيير إصدار التطبيق إلى إصدار قديم من YouTube. + + + إصدار تطبيق وهمي + تم تغيير اصدار التطبيق + لم يتم تغيير اصدار التطبيق + "سيتم تغيير إصدار التطبيق إلى إصدار قديم من YouTube. سيؤدي هذا إلى تغيير مظهر ومميزات التطبيق، ولكن قد تحدث تأثيرات جانبية غير معروفة. إذا تم إيقاف تشغيله لاحقًا، من المستحسن مسح بيانات التطبيق لمنع حدوث أخطاء في واجهة المستخدم." - الهدف من تغيير إصدار التطبيق - 20.13.41 - استعادة شريط إجراءات الفيديو غير المطوي - 20.05.46 - استعادة وظيفة النسخ - 19.35.36 - استعادة أيقونات مشغل Shorts القديمة - 19.01.34 - استعادة أيقونات التنقل القديمة - - - تغيير صفحة البداية - الافتراضي - كلّ الاشتراكات - تصفح القنوات - الدورات / التعلم - استكشف - الموضة & التجميل - ألعاب - السجلّ - المكتبة - الفيديوهات التي أعجبتني - مباشر - أفلام - الموسيقى - الأخبار - الإشعارات - قوائم التشغيل - البحث - تسوق - Shorts - الرياضة - الاشتراكات - المحتوى الرائج - الواقع الافتراضي - شاهد لاحقًا - فيديوهاتك - تغيير صفحة البداية دائمًا - "يتم تغيير صفحة البداية دائمًا + الهدف من تغيير إصدار التطبيق + 20.13.41 - استعادة شريط إجراءات الفيديو غير المطوي + 20.05.46 - استعادة وظيفة النسخ + 19.35.36 - استعادة أيقونات مشغل Shorts القديمة + 19.01.34 - استعادة أيقونات التنقل القديمة + + + تغيير صفحة البداية + الافتراضي + كلّ الاشتراكات + تصفح القنوات + الدورات / التعلم + استكشف + الموضة & التجميل + ألعاب + السجلّ + المكتبة + الفيديوهات التي أعجبتني + مباشر + أفلام + الموسيقى + الأخبار + الإشعارات + قوائم التشغيل + البحث + تسوق + Shorts + الرياضة + الاشتراكات + المحتوى الرائج + الواقع الافتراضي + شاهد لاحقًا + فيديوهاتك + تغيير صفحة البداية دائمًا + "يتم تغيير صفحة البداية دائمًا التقييد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات" - يتم تغيير صفحة البداية فقط عند بدء تشغيل التطبيق - - - تعطيل استئناف مشغل Shorts - لن يتم استئناف تشغيل مشغل Shorts عند بدء تشغيل التطبيق - سيتم استئناف تشغيل مشغل Shorts عند بدء تشغيل التطبيق - - - فتح فيديوهات Shorts باستخدام - مشغل Shorts - المشغل العادي - المشغل العادي في وضع ملء الشاشة - - - التشغيل التلقائي لفيديوهات Shorts - سيتم تشغيل فيديوهات Shorts تلقائيًا - سيتم تكرار فيديوهات Shorts - تشغيل فيديوهات Shorts تلقائيًا في الخلفية - سيتم تشغيل فيديوهات Shorts تلقائيًا في الخلفية - سيتم تكرار فيديوهات Shorts في الخلفية - - - المشغل المصغر - تغيير نمط المشغل المصغر داخل التطبيق - نوع المشغل المصغر - معطّل - إفتراضي - الحد الأدنى - الجهاز اللوحي - حديث 1 - حديث 2 - حديث 3 - حديث 4 - تعطيل الزوايا الدائرية - الزوايا مربعة - الزوايا مستديرة - تمكين النقر المزدوج والضغط لتغيير الحجم - "تم تمكين إجراء الضغط المزدوج والضغط لتغيير الحجم + يتم تغيير صفحة البداية فقط عند بدء تشغيل التطبيق + + + تعطيل استئناف مشغل Shorts + لن يتم استئناف تشغيل مشغل Shorts عند بدء تشغيل التطبيق + سيتم استئناف تشغيل مشغل Shorts عند بدء تشغيل التطبيق + + + فتح فيديوهات Shorts باستخدام + مشغل Shorts + المشغل العادي + المشغل العادي في وضع ملء الشاشة + + + التشغيل التلقائي لفيديوهات Shorts + سيتم تشغيل فيديوهات Shorts تلقائيًا + سيتم تكرار فيديوهات Shorts + تشغيل فيديوهات Shorts تلقائيًا في الخلفية + سيتم تشغيل فيديوهات Shorts تلقائيًا في الخلفية + سيتم تكرار فيديوهات Shorts في الخلفية + + + المشغل المصغر + تغيير نمط المشغل المصغر داخل التطبيق + نوع المشغل المصغر + معطّل + إفتراضي + الحد الأدنى + الجهاز اللوحي + حديث 1 + حديث 2 + حديث 3 + حديث 4 + تعطيل الزوايا الدائرية + الزوايا مربعة + الزوايا مستديرة + تمكين النقر المزدوج والضغط لتغيير الحجم + "تم تمكين إجراء الضغط المزدوج والضغط لتغيير الحجم • النقر المزدوج لزيادة حجم المشغل المصغر • النقر المزدوج مرة أخرى لاستعادة الحجم الأصلي" - إجراء النقر المزدوج والضغط لتغيير الحجم معطل - تعطيل السحب والإفلات - تم تعطيل السحب والإفلات - "السحب والإفلات مفعلان + إجراء النقر المزدوج والضغط لتغيير الحجم معطل + تعطيل السحب والإفلات + تم تعطيل السحب والإفلات + "السحب والإفلات مفعلان يمكن سحب المشغل المصغر إلى أي زاوية من الشاشة" - تعطيل إيماءة السحب الأفقي - تم تعطيل إيماءة السحب الأفقية - "تم تمكين إيماءة السحب الأفقية + تعطيل إيماءة السحب الأفقي + تم تعطيل إيماءة السحب الأفقية + "تم تمكين إيماءة السحب الأفقية يمكن سحب المشغل المصغر خارج الشاشة إلى اليسار أو اليمين" - إخفاء أزرار الواجهة - تم إخفاء أزرار الواجهة - يتم عرض أزرار الواجهة - إخفاء أزرار التوسيع والإغلاق - "تم إخفاء الأزرار + إخفاء أزرار الواجهة + تم إخفاء أزرار الواجهة + يتم عرض أزرار الواجهة + إخفاء أزرار التوسيع والإغلاق + "تم إخفاء الأزرار مرر للتوسيع أو الإغلاق" - يتم عرض أزرار التوسيع والإغلاق - إخفاء النصوص الفرعية - تم إخفاء النصوص الفرعية - يتم عرض النصوص الفرعية - إخفاء أزرار التخطي للأمام والخلف - تم إخفاء تخطي للأمام والخلف - يتم عرض تخطي للأمام والخلف - تهيئة الحجم - تهيئة الحجم على الشاشة، بالبكسل - حجم البكسل يجب أن يكون بين %1$s و %2$s - شفافية الواجهة - قيمة الشفافية بين 0-100، حيث يكون 0 شفاف - شفافية واجهة المشغل المصغر يجب أن تكون بين 0-100 - - - تمكين شاشة التحميل المتدرجة - ستحتوي شاشة التحميل على خلفية متدرجة - ستحتوي شاشة التحميل على خلفية ثابتة - نمط الشاشة الترحيبية - اللون - أبيض وأسود - تمكين لون شريط تقدم الفيديو المخصص - يتم عرض لون شريط تقدم الفيديو المخصص - يتم عرض لون شريط تقدم الفيديو الاصلي - لون شريط تقدم الفيديو المخصص - لون شريط التقدم - لون تمييز شريط التقدم المخصص - لون تمييز شريط التقدم - لون شريط التقدم غير صالح - - - YouTube ReVanced - YT ReVanced - YT - - - علامة الشعار - الافتراضي - القياسي - Premium - ReVanced - - ReVanced minimal - مخصص - - - تجاوز قيود منطقة الصورة - استخدام مضيف الصورة yt4.ggpht.com - "استخدام مضيف الصور الأصلي + يتم عرض أزرار التوسيع والإغلاق + إخفاء النصوص الفرعية + تم إخفاء النصوص الفرعية + يتم عرض النصوص الفرعية + إخفاء أزرار التخطي للأمام والخلف + تم إخفاء تخطي للأمام والخلف + يتم عرض تخطي للأمام والخلف + تهيئة الحجم + تهيئة الحجم على الشاشة، بالبكسل + حجم البكسل يجب أن يكون بين %1$s و %2$s + شفافية الواجهة + قيمة الشفافية بين 0-100، حيث يكون 0 شفاف + شفافية واجهة المشغل المصغر يجب أن تكون بين 0-100 + + + تمكين شاشة التحميل المتدرجة + ستحتوي شاشة التحميل على خلفية متدرجة + ستحتوي شاشة التحميل على خلفية ثابتة + نمط الشاشة الترحيبية + اللون + أبيض وأسود + تمكين لون شريط تقدم الفيديو المخصص + يتم عرض لون شريط تقدم الفيديو المخصص + يتم عرض لون شريط تقدم الفيديو الاصلي + لون شريط تقدم الفيديو المخصص + لون شريط التقدم + لون تمييز شريط التقدم المخصص + لون تمييز شريط التقدم + لون شريط التقدم غير صالح + + + YouTube ReVanced + YT ReVanced + YT + + + علامة الشعار + الافتراضي + القياسي + Premium + ReVanced + + ReVanced minimal + مخصص + + + تجاوز قيود منطقة الصورة + استخدام مضيف الصورة yt4.ggpht.com + "استخدام مضيف الصور الأصلي تمكين هذا يمكن إصلاح الصور المفقودة التي يتم حظرها في بعض المناطق" - - - - علامة التبويب الصفحة الرئيسية - - علامة تبويب الاشتراكات - - علامة التبويب أنت - قوائم تشغيل المشغل والتوصيات - نتائج البحث - المصغرات الأصلية - DeArrow & المصغرات الأصلية - DeArrow & اللقطات الثابتة - اللقطات الثابتة - DeArrow - "يوفر DeArrow مصغرات فيديو من مصادر جماعية لفيديوهات YouTube. هذه المصغرات غالبًا ما تكون أكثر صلة من تلك المقدمة من YouTube + + + + علامة التبويب الصفحة الرئيسية + + علامة تبويب الاشتراكات + + علامة التبويب أنت + قوائم تشغيل المشغل والتوصيات + نتائج البحث + المصغرات الأصلية + DeArrow & المصغرات الأصلية + DeArrow & اللقطات الثابتة + اللقطات الثابتة + DeArrow + "يوفر DeArrow مصغرات فيديو من مصادر جماعية لفيديوهات YouTube. هذه المصغرات غالبًا ما تكون أكثر صلة من تلك المقدمة من YouTube إذا تم تفعيلها، سيتم إرسال روابط الفيديو إلى خادم API ولن يتم إرسال أي بيانات أخرى. إذا كان الفيديو لا يحتوي على مصغرات DeArrow، سيتم عرض المقاطع الأصلية أو اللقطات الثابتة اضغط هنا لمعرفة المزيد عن DeArrow" - عرض ملاحظة إذا كان API غير متاح - يتم عرض ملاحظة إذا كان DeArrow غير متاح - لا يتم عرض ملاحظة إذا كان DeArrow غير متاح - DeArrow API Endpoint - عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت لمصغرات DeArrow - لقطات الفيديو الثابتة - يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية - استخدام اللقطات الثابتة السريعة - استخدام اللقطات متوسطة الجودة. سيتم تحميل المصغرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مصغرات فارغة - استخدام لقطات الفيديو الثابتة بجودة عالية - وقت الفيديو لأخذ اللقطات الثابتة منه - بداية الفيديو - منتصف الفيديو - نهاية الفيديو - - DeArrow غير متوفر مؤقتًا (رمز الحالة: %s) - DeArrow غير متوفر مؤقتًا - - - عرض إعلانات ReVanced - يتم عرض الإعلانات عند بدء التشغيل - لا يتم عرض الإعلانات عند بدء التشغيل - عرض الإعلانات عند بدء التشغيل - فشل الاتصال بموفر الإعلانات - تجاهل - - - تمكين تكرار الفيديو - سيتم تكرار الفيديو - لن يتم تكرار الفيديو - - - عرض زر تكرار الفيديو - يتم عرض الزر - لا يتم عرض الزر - تكرار الفيديو قيد التشغيل - تكرار الفيديو متوقف - - - - - تزوير أبعاد الجهاز - "تم تزييف أبعاد الجهاز + عرض ملاحظة إذا كان API غير متاح + يتم عرض ملاحظة إذا كان DeArrow غير متاح + لا يتم عرض ملاحظة إذا كان DeArrow غير متاح + DeArrow API Endpoint + عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت لمصغرات DeArrow + لقطات الفيديو الثابتة + يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية + استخدام اللقطات الثابتة السريعة + استخدام اللقطات متوسطة الجودة. سيتم تحميل المصغرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مصغرات فارغة + استخدام لقطات الفيديو الثابتة بجودة عالية + وقت الفيديو لأخذ اللقطات الثابتة منه + بداية الفيديو + منتصف الفيديو + نهاية الفيديو + + DeArrow غير متوفر مؤقتًا (رمز الحالة: %s) + DeArrow غير متوفر مؤقتًا + + + عرض إعلانات ReVanced + يتم عرض الإعلانات عند بدء التشغيل + لا يتم عرض الإعلانات عند بدء التشغيل + عرض الإعلانات عند بدء التشغيل + فشل الاتصال بموفر الإعلانات + تجاهل + + + تمكين تكرار الفيديو + سيتم تكرار الفيديو + لن يتم تكرار الفيديو + + + عرض زر تكرار الفيديو + يتم عرض الزر + لا يتم عرض الزر + تكرار الفيديو قيد التشغيل + تكرار الفيديو متوقف + + + + تزوير أبعاد الجهاز + "تم تزييف أبعاد الجهاز قد يتم فتح قفل جودة الفيديو العالية ولكن قد تواجه تقطعًا في تشغيل الفيديو وعمر بطارية أسوأ وتأثيرات جانبية غير معروفة" - "أبعاد الجهاز غير مزيفة + "أبعاد الجهاز غير مزيفة تفعيل هذا يمكن أن يفتح جودات فيديو أعلى" - قد يؤدي تمكين هذا إلى تباطؤ تشغيل الفيديو وتدهور عمر البطارية وآثار جانبية غير معروفة. - - - الاهتزاز عند الضغط - تغيير الاهتزاز عند الضغط - تعطيل الاهتزاز للفصول - تم تعطيل الاهتزاز للفصول - تم تمكين الاهتزاز للفصول - تعطيل الاهتزاز عند التمرير الدقيق - تم تعطيل الاهتزاز الدقيق عند التمرير - تم تمكين الاهتزاز عند التمرير الدقيق - تعطيل اهتزاز التراجع عن التمرير - تم تعطيل اهتزاز التراجع عن التمرير - تم تمكين اهتزاز التراجع عن التمرير - تعطيل الاهتزاز عند التكبير - تم تعطيل الاهتزاز عند التكبير - تم تمكين الاهتزاز عند التكبير - - - إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فقم بإلغاء تثبيت MicroG وإعادة تثبيته. - - - تجاوز إعادة توجيه URL - تم تجاوز إعادة توجيه عنوان URL - لم يتم تجاوز إعادة توجيه عنوان URL - - - فتح الروابط في المتصفح - فتح الروابط في متصفح خارجي - فتح الروابط في متصفح داخل التطبيق - - - - تلقائي - تذكر تغييرات جودة الفيديو - تنطبق تغييرات الجودة على جميع الفيديوهات - تنطبق تغييرات الجودة على الفيديو الحالي فقط - عرض ملاحظة عند تغيير جودة الفيديو - يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية - لا يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية - جودة الفيديو الافتراضية على شبكة Wi-Fi - جودة الفيديو الافتراضية على شبكة الجوَّال - تذكر تغييرات جودة Shorts - تنطبق تغييرات الجودة على جميع فيديوهات Shorts - تنطبق تغييرات الجودة فقط على فيديو Short الحالي - جودة Shorts الافتراضية على شبكة Wi-Fi - جودة Shorts الافتراضية على شبكة الجوّال - الجوّال - Wi-Fi - تم تغيير جودة %1$s الافتراضية إلى: %2$s - تم تغيير جودة Shorts %1$s إلى: %2$s - - - عرض زر مربع حوار السرعة - يتم عرض زر مربع حوار السرعة. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي - لا يتم عرض زر مربع حوار السرعة - - - عرض زر جودة الفيديو - يتم عرض زر جودة الفيديو. انقر مع الاستمرار لإعادة تعيين الجودة إلى الوضع الافتراضي - لا يتم عرض زر جودة الفيديو - - - قائمة سرعة التشغيل المخصصة - يتم عرض قائمة سرعة التشغيل المخصصة - لا يتم عرض قائمة سرعة التشغيل المخصصة - استعادة قائمة سرعة التشغيل القديمة - يتم عرض قائمة سرعة التشغيل القديمة - يتم عرض قائمة سرعة التشغيل الحديثة - سرعة التشغيل المخصصة - إضافة أو تغيير سرعات التشغيل المخصصة - يجب أن تكون سرعات التشغيل المخصصة أقل من %s - سرعات التشغيل المخصصة غير صالحة - تلقائي - سرعة النقر مع الاستمرار المخصصة - سرعة التشغيل بين 0-8 - - - تذكر تغييرات سرعة التشغيل - تطبيق تغييرات سرعة التشغيل على جميع الفيديوهات - تطبيق تغييرات سرعة التشغيل فقط على الفيديو الحالي - عرض ملاحظة عند تغيير سرعة التشغيل - يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية - لا يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية - سرعة التشغيل الافتراضية - تغيير السرعة الافتراضية إلى: %s - - - تعطيل فيديو HDR - تم تعطيل فيديو HDR - تم تمكين فيديو HDR - فرض AVC (H.264) - تم فرض برنامج ترميز الفيديو على AVC (H.264) - يتم تحديد برنامج ترميز الفيديو تلقائيًا - "الفوائد: + قد يؤدي تمكين هذا إلى تباطؤ تشغيل الفيديو وتدهور عمر البطارية وآثار جانبية غير معروفة. + + + الاهتزاز عند الضغط + تغيير الاهتزاز عند الضغط + تعطيل الاهتزاز للفصول + تم تعطيل الاهتزاز للفصول + تم تمكين الاهتزاز للفصول + تعطيل الاهتزاز عند التمرير الدقيق + تم تعطيل الاهتزاز الدقيق عند التمرير + تم تمكين الاهتزاز عند التمرير الدقيق + تعطيل اهتزاز التراجع عن التمرير + تم تعطيل اهتزاز التراجع عن التمرير + تم تمكين اهتزاز التراجع عن التمرير + تعطيل الاهتزاز عند التكبير + تم تعطيل الاهتزاز عند التكبير + تم تمكين الاهتزاز عند التكبير + + + إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فقم بإلغاء تثبيت MicroG وإعادة تثبيته. + + + تجاوز إعادة توجيه URL + تم تجاوز إعادة توجيه عنوان URL + لم يتم تجاوز إعادة توجيه عنوان URL + + + فتح الروابط في المتصفح + فتح الروابط في متصفح خارجي + فتح الروابط في متصفح داخل التطبيق + + + + تلقائي + تذكر تغييرات جودة الفيديو + تنطبق تغييرات الجودة على جميع الفيديوهات + تنطبق تغييرات الجودة على الفيديو الحالي فقط + عرض ملاحظة عند تغيير جودة الفيديو + يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية + لا يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية + جودة الفيديو الافتراضية على شبكة Wi-Fi + جودة الفيديو الافتراضية على شبكة الجوَّال + تذكر تغييرات جودة Shorts + تنطبق تغييرات الجودة على جميع فيديوهات Shorts + تنطبق تغييرات الجودة فقط على فيديو Short الحالي + جودة Shorts الافتراضية على شبكة Wi-Fi + جودة Shorts الافتراضية على شبكة الجوّال + الجوّال + Wi-Fi + تم تغيير جودة %1$s الافتراضية إلى: %2$s + تم تغيير جودة Shorts %1$s إلى: %2$s + + + عرض زر مربع حوار السرعة + يتم عرض زر مربع حوار السرعة. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي + لا يتم عرض زر مربع حوار السرعة + + + عرض زر جودة الفيديو + يتم عرض زر جودة الفيديو. انقر مع الاستمرار لإعادة تعيين الجودة إلى الوضع الافتراضي + لا يتم عرض زر جودة الفيديو + + + قائمة سرعة التشغيل المخصصة + يتم عرض قائمة سرعة التشغيل المخصصة + لا يتم عرض قائمة سرعة التشغيل المخصصة + استعادة قائمة سرعة التشغيل القديمة + يتم عرض قائمة سرعة التشغيل القديمة + يتم عرض قائمة سرعة التشغيل الحديثة + سرعة التشغيل المخصصة + إضافة أو تغيير سرعات التشغيل المخصصة + يجب أن تكون سرعات التشغيل المخصصة أقل من %s + سرعات التشغيل المخصصة غير صالحة + تلقائي + سرعة النقر مع الاستمرار المخصصة + سرعة التشغيل بين 0-8 + + + تذكر تغييرات سرعة التشغيل + تطبيق تغييرات سرعة التشغيل على جميع الفيديوهات + تطبيق تغييرات سرعة التشغيل فقط على الفيديو الحالي + عرض ملاحظة عند تغيير سرعة التشغيل + يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية + لا يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية + سرعة التشغيل الافتراضية + تغيير السرعة الافتراضية إلى: %s + + + تعطيل فيديو HDR + تم تعطيل فيديو HDR + تم تمكين فيديو HDR + فرض AVC (H.264) + تم فرض برنامج ترميز الفيديو على AVC (H.264) + يتم تحديد برنامج ترميز الفيديو تلقائيًا + "الفوائد: • يمكن أن يحسن عمر البطارية • يمكن أن يستعيد دقة الفيديو المفقودة على الأجهزة القديمة @@ -1668,179 +1666,178 @@ Second \"item\" text" • تشغيل الفيديو سيستهلك المزيد من بيانات الإنترنت مقارنةً بـ VP9 أو AV1 • لن تستخدم فيديوهات HDR ترميز AVC • لا يمكن لبعض الأجهزة فرض AVC" - - - عرض قائمة جودة الفيديو المتقدمة - يتم عرض قائمة جودة الفيديو المتقدمة - لا يتم عرض قائمة جودة الفيديو المتقدمة - - - تمكين التمرير للتقديم أو الترجيع - تم تمكين التمرير للتقديم أو الترجيع - تم تعطيل التمرير للتقديم أو الترجيع - - - السماح بـ Android VR AV1 - "برنامج ترميز الفيديو هو AVC (H.264) أو VP9 أو AV1 + + + عرض قائمة جودة الفيديو المتقدمة + يتم عرض قائمة جودة الفيديو المتقدمة + لا يتم عرض قائمة جودة الفيديو المتقدمة + + + تمكين التمرير للتقديم أو الترجيع + تم تمكين التمرير للتقديم أو الترجيع + تم تعطيل التمرير للتقديم أو الترجيع + + + السماح بـ Android VR AV1 + "برنامج ترميز الفيديو هو AVC (H.264) أو VP9 أو AV1 قد يحدث تقطيع أو فقدان للإطارات أثناء التشغيل" - برنامج ترميز الفيديو هو AVC (H.264) أو VP9 - "قد يؤدي تمكين هذا الإعداد إلى استخدام فك تشفير AV1 البرمجي. + برنامج ترميز الفيديو هو AVC (H.264) أو VP9 + "قد يؤدي تمكين هذا الإعداد إلى استخدام فك تشفير AV1 البرمجي. قد يتسبب تشغيل الفيديو باستخدام AV1 في التقطيع أو إسقاط الإطارات." - التأثيرات الجانبية للتزييف - • عميل تجريبي وقد يتوقف عن العمل في أي وقت - • قد يتوقف الفيديو عند 1:00، أو قد لا يكون متاحًا في بعض المناطق - • قائمة المقطع الصوتي مفقودة - • لا يوجد ترميز الفيديو AV1 - • مستوى الصوت الثابت غير متاح - • قد لا يتم تشغيل الفيديوهات المخصصة للأطفال عند تسجيل الخروج أو عند استخدام وضع التصفح المتخفي - - • فرض الصوت الأصلي غير متاح - عرض في إحصاءات تقنية - يتم عرض نوع العميل في إحصاءات تقنية - تم إخفاء نوع العميل في إحصاءات تقنية - - - - - - - لمحة - الإعلانات - عام - المشغل - متنوعة - - - إخفاء إعلانات الفيديو - تم إخفاء إعلانات الفيديو - يتم عرض إعلانات الفيديو - - - تمكين التكرار الدائم - تم تمكين التكرار الدائم - تم تعطيل التكرار الدائم - - - إخفاء زر البث - تم إخفاء زر البث - يتم عرض زر البث - إخفاء زر السجل - تم إخفاء زر السجل - يتم عرض زر السجل - إخفاء زر الإشعارات - تم إخفاء زر الإشعارات - يتم عرض زر الإشعارات - إخفاء زر البحث - تم إخفاء زر البحث - يتم عرض زر البحث - - - إخفاء شريط الفئات - تم إخفاء شريط الفئات - يتم عرض شريط الفئات - - - تغيير لون المشغل المصغر - يتطابق لون المشغل المصغر مع المشغل بملء الشاشة - يستخدم المشغل المصغر اللون الافتراضي - - - شريط التنقل - إخفاء أزرار شريط التنقل أو تغييرها - - إخفاء الصفحة الرئيسية - تم إخفاء زر الصفحة الرئيسية - يتم عرض زر الصفحة الرئيسية - - إخفاء المقاطع - زر \"المقتطفات\" مخفي - زر \"المقتطفات\" ظاهر - - إخفاء استكشاف - زر \"استكشاف\" مخفي - زر \"استكشاف\" ظاهر - - إخفاء المكتبة - زر \"المكتبة\" مخفي - زر \"المكتبة\" ظاهر - - إخفاء ترقية - زر \"الترقية\" مخفي - زر \"الترقية\" ظاهر - إخفاء شريط التنقل - شريط التنقل مخفي - شريط التنقل ظاهر - إخفاء تسميات أزرار التنقل - التسميات مخفية - التسميات ظاهرة - - - إخفاء تسمية \'الحصول على Music Premium\' - التسمية مخفية - التسمية معروضة - - - إخفاء زر الترقية - الزر مخفي - الزر معروض - - - - - حظر الإعلانات الصوتية - تم حظر الإعلانات الصوتية - تم إلغاء حظر الإعلانات الصوتية - - - %s غير متوفر، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - قام خادم %s بإرجاع خطأ، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - حظر إعلانات الفيديو المضمنة - معطّل - Luminous Proxy - PurpleAdBlock Proxy - - - حظر إعلانات الفيديو - تم حظر إعلانات الفيديو - يتم إلغاء حظر إعلانات الفيديو - - - تم حذف الرسالة - عرض الرسائل المحذوفة - لا تعرض الرسائل المحذوفة - إخفاء الرسائل المحذوفة داخل Spoiler - عرض الرسائل المحذوفة كنص مشطوب - - - الحصول على نقاط القناة تلقائيًا - يتم الحصول على نقاط القناة تلقائيًا - لا تتم المطالبة بنقاط القناة تلقائيًا - - - - تمكين وضع تصحيح أخطاء Twitch - تم تمكين وضع تصحيح أخطاء Twitch (غير مستحسن) - تم تعطيل وضع تصحيح أخطاء Twitch - - - إعدادات ReVanced - لمحة - لمحة عن ReVanced - حظر الإعلانات - إعدادات حظر الإعلانات - الدردشة - إعدادات الدردشة - متنوعة - إعدادات متنوعة - الإعدادات العامة - إعدادات أخرى - إعلانات جانب العميل - إعلانات surestream على جانب الخادم - تسجيل تصحيح الأخطاء - تم تمكين تسجيلات تصحيح الأخطاء - تم تعطيل تسجيلات تصحيح الأخطاء - - + التأثيرات الجانبية للتزييف + • عميل تجريبي وقد يتوقف عن العمل في أي وقت + • قد يتوقف الفيديو عند 1:00، أو قد لا يكون متاحًا في بعض المناطق + • قائمة المقطع الصوتي مفقودة + • لا يوجد ترميز الفيديو AV1 + • مستوى الصوت الثابت غير متاح + • قد لا يتم تشغيل الفيديوهات المخصصة للأطفال عند تسجيل الخروج أو عند استخدام وضع التصفح المتخفي + + • فرض الصوت الأصلي غير متاح + عرض في إحصاءات تقنية + يتم عرض نوع العميل في إحصاءات تقنية + تم إخفاء نوع العميل في إحصاءات تقنية + + + + + + لمحة + الإعلانات + عام + المشغل + متنوعة + + + إخفاء إعلانات الفيديو + تم إخفاء إعلانات الفيديو + يتم عرض إعلانات الفيديو + + + تمكين التكرار الدائم + تم تمكين التكرار الدائم + تم تعطيل التكرار الدائم + + + إخفاء زر البث + تم إخفاء زر البث + يتم عرض زر البث + إخفاء زر السجل + تم إخفاء زر السجل + يتم عرض زر السجل + إخفاء زر الإشعارات + تم إخفاء زر الإشعارات + يتم عرض زر الإشعارات + إخفاء زر البحث + تم إخفاء زر البحث + يتم عرض زر البحث + + + إخفاء شريط الفئات + تم إخفاء شريط الفئات + يتم عرض شريط الفئات + + + تغيير لون المشغل المصغر + يتطابق لون المشغل المصغر مع المشغل بملء الشاشة + يستخدم المشغل المصغر اللون الافتراضي + + + شريط التنقل + إخفاء أزرار شريط التنقل أو تغييرها + + إخفاء الصفحة الرئيسية + تم إخفاء زر الصفحة الرئيسية + يتم عرض زر الصفحة الرئيسية + + إخفاء المقاطع + زر \"المقتطفات\" مخفي + زر \"المقتطفات\" ظاهر + + إخفاء استكشاف + زر \"استكشاف\" مخفي + زر \"استكشاف\" ظاهر + + إخفاء المكتبة + زر \"المكتبة\" مخفي + زر \"المكتبة\" ظاهر + + إخفاء ترقية + زر \"الترقية\" مخفي + زر \"الترقية\" ظاهر + إخفاء شريط التنقل + شريط التنقل مخفي + شريط التنقل ظاهر + إخفاء تسميات أزرار التنقل + التسميات مخفية + التسميات ظاهرة + + + إخفاء تسمية \'الحصول على Music Premium\' + التسمية مخفية + التسمية معروضة + + + إخفاء زر الترقية + الزر مخفي + الزر معروض + + + + + حظر الإعلانات الصوتية + تم حظر الإعلانات الصوتية + تم إلغاء حظر الإعلانات الصوتية + + + %s غير متوفر، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + قام خادم %s بإرجاع خطأ، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + حظر إعلانات الفيديو المضمنة + معطّل + Luminous Proxy + PurpleAdBlock Proxy + + + حظر إعلانات الفيديو + تم حظر إعلانات الفيديو + يتم إلغاء حظر إعلانات الفيديو + + + تم حذف الرسالة + عرض الرسائل المحذوفة + لا تعرض الرسائل المحذوفة + إخفاء الرسائل المحذوفة داخل Spoiler + عرض الرسائل المحذوفة كنص مشطوب + + + الحصول على نقاط القناة تلقائيًا + يتم الحصول على نقاط القناة تلقائيًا + لا تتم المطالبة بنقاط القناة تلقائيًا + + + + تمكين وضع تصحيح أخطاء Twitch + تم تمكين وضع تصحيح أخطاء Twitch (غير مستحسن) + تم تعطيل وضع تصحيح أخطاء Twitch + + + إعدادات ReVanced + لمحة + لمحة عن ReVanced + حظر الإعلانات + إعدادات حظر الإعلانات + الدردشة + إعدادات الدردشة + متنوعة + إعدادات متنوعة + الإعدادات العامة + إعدادات أخرى + إعلانات جانب العميل + إعلانات surestream على جانب الخادم + تسجيل تصحيح الأخطاء + تم تمكين تسجيلات تصحيح الأخطاء + تم تعطيل تسجيلات تصحيح الأخطاء + + diff --git a/patches/src/main/resources/addresources/values-as-rIN/strings.xml b/patches/src/main/resources/addresources/values-as-rIN/strings.xml index 33433fa0d8..f2d7803a41 100644 --- a/patches/src/main/resources/addresources/values-as-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-as-rIN/strings.xml @@ -17,294 +17,223 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - খাৰিজ কৰক - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + খাৰিজ কৰক + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 2e57845cd5..7726105f33 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -17,1259 +17,1258 @@ "First 'item' text Second \"item\" text" ---> - - - - Tətbiq adı - - Fərdi - Tətbiq simvolu - Orijinal - - ReVanced ən kiçik - ReVanced ölçüləndirilmiş - - Fərdi - - - Yoxlamalar uğursuz oldu - Xidməti veb saytı aç - Məhəl qoyma - <h5>Bu tətbiq sizin tərəfinizdən yamaqlanmayıb.</h5><br>Bu tətbiq düzgün işləməyə bilər, <b>istifadə etmək zərərli və ya hətta təhlükəli ola bilər</b>.<br><br>Bu yoxlamalar bu tətbiqin əvvəl yamaqlandığını və ya başqasından əldə edildiyini bildirir:<br><br><small>%1$s</small><br> <br>onu silməyiniz və özünüz yamaqlamağınız tövsiyə olunur. </b>təsdiqlənmiş və təhlükəsiz tətbiq istifadə etdiyinizə əmin olmaq üçün. <p><br> Ləğv edilməzsə, bu xəbərdarlıq yalnız iki dəfə göstəriləcək. - Fərqli cihazda yamaqlanıb - ReVanced Manager tərəfindən quraşdırılmayıb - 10 dəqiqədən çox əvvəl yamaqlanıb - %s gün əvvəl yamaqlanıb - APK qurulma vaxtı pozulub - - - ReVanced Bildiriş - Baxış tarixçəniz saxlanmır.<br><br>Bu çox güman ki, DNS reklam bloklayıcı və ya şəbəkə proksisinə görədir.<br><br>.Bunu düzəltmək üçün s.youtube.com-u</b> <b>ağ siyahıya salın və ya bütün DNS bloklayıcıları və proksiləri bağlayın. - Təkrar göstərmə - - - Tənzimləmələr - Davam etmək istədiyinizə əminsiniz? - Saxla - Sıfırla - Rəngi sıfırla - Yanlış rəng - Yenidən başlatma tələb olunur - Bu dəyişikliyin təsir etməsi üçün tətbiqi yenidən başladın. - Yenidən başlat - İdxal et - Köçür - ReVanced tənzimləmələr standarta təyin edildi - %d tənzimləmə idxal edildi - Uğursuz idxal prosesi: %s - Tənzimləmələri axtar - ‘%s’ üçün nəticə tapılmadı - Başqa açar sözü yoxla - Son axtarışlar - Axtarış tarixçəsindən silinsin? - Axtarış tarixçəsini təmizlə - Bütün axtarış tarixçəsini təmizləmək istədiyinizə əminsiniz? - Axtarış Tövsiyələri - "• Buna keçmək üçün yola toxun +--> + + + Tətbiq adı + + Fərdi + Tətbiq simvolu + Orijinal + + ReVanced ən kiçik + ReVanced ölçüləndirilmiş + + Fərdi + + + Yoxlamalar uğursuz oldu + Xidməti veb saytı aç + Məhəl qoyma + <h5>Bu tətbiq sizin tərəfinizdən yamaqlanmayıb.</h5><br>Bu tətbiq düzgün işləməyə bilər, <b>istifadə etmək zərərli və ya hətta təhlükəli ola bilər</b>.<br><br>Bu yoxlamalar bu tətbiqin əvvəl yamaqlandığını və ya başqasından əldə edildiyini bildirir:<br><br><small>%1$s</small><br> <br>onu silməyiniz və özünüz yamaqlamağınız tövsiyə olunur. </b>təsdiqlənmiş və təhlükəsiz tətbiq istifadə etdiyinizə əmin olmaq üçün. <p><br> Ləğv edilməzsə, bu xəbərdarlıq yalnız iki dəfə göstəriləcək. + Fərqli cihazda yamaqlanıb + ReVanced Manager tərəfindən quraşdırılmayıb + 10 dəqiqədən çox əvvəl yamaqlanıb + %s gün əvvəl yamaqlanıb + APK qurulma vaxtı pozulub + + + ReVanced Bildiriş + Baxış tarixçəniz saxlanmır.<br><br>Bu çox güman ki, DNS reklam bloklayıcı və ya şəbəkə proksisinə görədir.<br><br>.Bunu düzəltmək üçün s.youtube.com-u</b> <b>ağ siyahıya salın və ya bütün DNS bloklayıcıları və proksiləri bağlayın. + Təkrar göstərmə + + + Tənzimləmələr + Davam etmək istədiyinizə əminsiniz? + Saxla + Sıfırla + Rəngi sıfırla + Yanlış rəng + Yenidən başlatma tələb olunur + Bu dəyişikliyin təsir etməsi üçün tətbiqi yenidən başladın. + Yenidən başlat + İdxal et + Köçür + ReVanced tənzimləmələr standarta təyin edildi + %d tənzimləmə idxal edildi + Uğursuz idxal prosesi: %s + Tənzimləmələri axtar + ‘%s’ üçün nəticə tapılmadı + Başqa açar sözü yoxla + Son axtarışlar + Axtarış tarixçəsindən silinsin? + Axtarış tarixçəsini təmizlə + Bütün axtarış tarixçəsini təmizləmək istədiyinizə əminsiniz? + Axtarış Tövsiyələri + "• Buna keçmək üçün yola toxun • Buna keçmək üçün tənzimləməni uzun basın • Axtarış sorğusunu tarixçəyə qeyd etmək üçün Daxil Et düyməsini bas • Axtarış böyük/kiçik hərfləri və durğu işarələrini nəzərə almır • Valideyn tənzimləmələri qapadılan uşaq tənzimləmələrin üstündə görünür" - Axtarış tarixçəsi boşdur - Axtarış tarixçəsini saxlamaq üçün axtarış sorğusu yazın və Daxil Et basın - Tənzimləmə axtarış tarixçəsin göstər - Tənzimləmə axtarış tarixçəsi göstərilir - Tənzimləmə axtarış tarixçəsi görünmür - ReVanced tənzimləmə nişanların göstər - Tənzimləmə nişanları göstərilir - Tənzimləmə nişanları göstərilmir - ReVanced dili - "Bəzi dillər üçün tərcümələr çatışmayan və ya natamam ola bilər. + Axtarış tarixçəsi boşdur + Axtarış tarixçəsini saxlamaq üçün axtarış sorğusu yazın və Daxil Et basın + Tənzimləmə axtarış tarixçəsin göstər + Tənzimləmə axtarış tarixçəsi göstərilir + Tənzimləmə axtarış tarixçəsi görünmür + ReVanced tənzimləmə nişanların göstər + Tənzimləmə nişanları göstərilir + Tənzimləmə nişanları göstərilmir + ReVanced dili + "Bəzi dillər üçün tərcümələr çatışmayan və ya natamam ola bilər. Yeni dilləri tərcümə etmək və ya mövcud tərcümələri təkmilləşdirmək üçün translate.revanced.app saytın ziyarət edin" - Tətbiq dili - İdxal/İxrac et - ReVanced tənzimləmələrin idxal/ixrac et - - ReVanced Patches <i>%s</i> versiyasını istifadə edirsiniz - Qeyd - Bu versiya ilkin buraxılışdır və gözlənilməz problemlərlə üzləşə bilərsiniz - Rəsmi bağlantılar - + ReVanced Patches <i>%s</i> versiyasını istifadə edirsiniz + Qeyd + Bu versiya ilkin buraxılışdır və gözlənilməz problemlərlə üzləşə bilərsiniz + Rəsmi bağlantılar + - - - GmsCore Tənzimləmələri - GmsCore üçün Tənzimləmələr - - MicroG GmsCore quraşdırılmayıb. Bunu quraşdır. - Fəaliyyət lazımdır - "MicroG GmsCore-un arxa planda işləməsi üçün icazəsi yoxdur. + + + GmsCore Tənzimləmələri + GmsCore üçün Tənzimləmələr + + MicroG GmsCore quraşdırılmayıb. Bunu quraşdır. + Fəaliyyət lazımdır + "MicroG GmsCore-un arxa planda işləməsi üçün icazəsi yoxdur. Telefonunuz üçün \"Tətbiqimi dayandırma\" bələdçisinə əməl edin və təlimatları MicroG quraşdırmanıza tətbiq edin. Bu, tətbiqin işləməsi üçün tələb olunur." - Veb saytı aç - "Problemlərin olmaması üçün MicroG GmsCore batareya optimallaşması qapadılmalıdır. + Veb saytı aç + "Problemlərin olmaması üçün MicroG GmsCore batareya optimallaşması qapadılmalıdır. MicroG üçün batareya optimallaşmasın qapatma batareya istifadəsinə mənfi təsir etməyəcək. Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et." - Davam et - - - Video yayımların saxtalaşdır - Oynatma problemlərin önləmək üçün qəbuledici video yayımların saxtalaşdır - Video yayımları saxtalaşdır - "Video yayımları saxtalaşdırılıb + Davam et + + + Video yayımların saxtalaşdır + Oynatma problemlərin önləmək üçün qəbuledici video yayımların saxtalaşdır + Video yayımları saxtalaşdır + "Video yayımları saxtalaşdırılıb Əgər YouTube Premium istifadəçisisinizsə, bu tənzimlənmə tələb olunmaya bilər" - "Video yayımları saxtalaşmayıb + "Video yayımları saxtalaşmayıb Oynatma işləməyə bilər" - Bu tənzimləməni qapatmaq oynatma problemlərinə səbəb ola bilər. - İlkin qəbuledici - - - Orijinal səs dilini zorla - Orijinal səs dilini istifadə - İlkin səs istifadəsi - - Bu funksiyanı istifadə etmək üçün \"Video yayımları saxtalaşdırı\" Android Studio savayı istənilən qəbulediciyə dəyiş - - - Sazlama - Sazlama seçimlərini aktiv/qeyri-aktiv et - Sazlama jurnalı - Sazlama jurnalı işləkdir - Sazlama jurnalı qeyri-aktivdir - Yığın izləri jurnalı - Sazlama jurnalına yığın izləri daxildir - Sazlama jurnalına yığın izləri daxil deyil - ReVanced xətasında ani bildiriş göstər - Xəta baş verərsə ani bildiriş görünür - Xəta baş verərsə ani bildiriş görünmür - "Xəta ani bildirişlərin qapatmaq, bütün ReVanced xəta bildirişlərin gizlədir. + Bu tənzimləməni qapatmaq oynatma problemlərinə səbəb ola bilər. + İlkin qəbuledici + + + Orijinal səs dilini zorla + Orijinal səs dilini istifadə + İlkin səs istifadəsi + + Bu funksiyanı istifadə etmək üçün \"Video yayımları saxtalaşdırı\" Android Studio savayı istənilən qəbulediciyə dəyiş + + + Sazlama + Sazlama seçimlərini aktiv/qeyri-aktiv et + Sazlama jurnalı + Sazlama jurnalı işləkdir + Sazlama jurnalı qeyri-aktivdir + Yığın izləri jurnalı + Sazlama jurnalına yığın izləri daxildir + Sazlama jurnalına yığın izləri daxil deyil + ReVanced xətasında ani bildiriş göstər + Xəta baş verərsə ani bildiriş görünür + Xəta baş verərsə ani bildiriş görünmür + "Xəta ani bildirişlərin qapatmaq, bütün ReVanced xəta bildirişlərin gizlədir. Gözlənilməz hallardan xəbərdar olmayacaqsınız." - Sazlama qeydlərini ixrac edin - ReVanced sazlama qeydlərini buferə köçürür - Sazlama qeydi qapalıdır - Qeydlər tapılmadı - Qeydlər köçürüldü - Qeydləri ixrac etmək alınmadı: %s - Sazlama qeydlərini təmizlə - Saxlanılan bütün ReVanced sazlama qeydlərini təmizləyir - Qeydlər silindi - Xüsusiyyət nişançıları idarəedicisi - Boolean xüsusiyyət nişançıların idarə et - Aktiv nişançılar (%d) - Bloklanmış nişançılar (%d) - Nişançıları axtarın... - Nişançılar saxlandı - Nişançılar sıfırlandı - Nişançılar buferə köçürüldü - Bufer protokol jurnalı - Sazlama jurnallarına protokol buferi daxildir - Sazlama jurnallarına protokol buferi daxil deyil - "Bu seçimi aktivləşdirmə bəzi UI quruluşları üçün ekran mətni də olmaqla əlavə tərtibat bazasını daxil edəcək. + Sazlama qeydlərini ixrac edin + ReVanced sazlama qeydlərini buferə köçürür + Sazlama qeydi qapalıdır + Qeydlər tapılmadı + Qeydlər köçürüldü + Qeydləri ixrac etmək alınmadı: %s + Sazlama qeydlərini təmizlə + Saxlanılan bütün ReVanced sazlama qeydlərini təmizləyir + Qeydlər silindi + Xüsusiyyət nişançıları idarəedicisi + Boolean xüsusiyyət nişançıların idarə et + Aktiv nişançılar (%d) + Bloklanmış nişançılar (%d) + Nişançıları axtarın... + Nişançılar saxlandı + Nişançılar sıfırlandı + Nişançılar buferə köçürüldü + Bufer protokol jurnalı + Sazlama jurnallarına protokol buferi daxildir + Sazlama jurnallarına protokol buferi daxil deyil + "Bu seçimi aktivləşdirmə bəzi UI quruluşları üçün ekran mətni də olmaqla əlavə tərtibat bazasını daxil edəcək. Bu, xüsusi filtrlər yaradarkən quruluşları müəyyən etməyə kömək edə bilər. Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlumatın da daxil edəcək." - - - Paylaşım linklərin təmizlə - İzləmə sorğusu faktoru paylaşılan linklərdən silinir - İzləmə sorğusu faktoru paylaşılan linklərdən silinmir - Paylaşma keçidlərini youtube.com-a dəyişdir - Paylaşılan keçidlər youtube.com istifadə edir - Paylaşılan keçidlər music.youtube.com istifadə edir - - - Şəxsi filtr - Fərdi filtrlər işlədərək elementləri gizlət - Fərdi filtri aktivləşdir - Fərdi filtr aktivdir - Fərdi filtr qeyri-aktivdir - Fərdi filtr - - Yeni sətirlə ayrılmış filtr üçün element yol qurucusu sətirlərinin siyahısı - Etibarsız fərdi filtr: %s - - - - - Haqqında - Reklamlar - Seçmə miniatürlər - Axın - Ümumi - Oynadıcı - İrəliləyiş cizgisi - Sürüşdürmə nəzarətçiləri - Çoxvariantlı - Köhnə tənzimləmələr bölmələrin bərpa et - Köhnə tənzimləmələr bölmələri göstərilir - Köhnə tənzimləmələr bölmələri göstərilmir - - - Shorts arxa plan oynatmasın qapat - Shorts arxa plan oynatma qapalıdır - Shorts arxa plan oynatma aktivdir - - - Albom kartlarını gizlət - Albom kartları gizlidir - Albom kartları göstərilir - Sənətçi kartlarını gizlət - Sənətçi kartları gizlidir - Sənətçi kartları göstərilir - Çip bölməsin gizlət - Çip bölməsi gizlidir - Çip bölməsi göstərilir - İcma elanların gizlət - İcma elanları gizlədilib - İcma elanları göstərilir - Yığcam afişaları gizlət - Yığcam afişalar gizlidir - Yığcam afişalar görünür - Genişlənən kartı gizlət - Videoların aşağısında genişlənən kart gizlidir - Videoların altında genişlənən kart görünür - Üzən mikrofon düyməsini gizlət - Axtarışda üzən mikrofon düyməsi gizlidir - Üzən mikrofon düyməsi axtarışda göstərilir - Üfüqi hissələri gizlət - "Üfüqi cərgələr gizlidir, məsələn: + + + Paylaşım linklərin təmizlə + İzləmə sorğusu faktoru paylaşılan linklərdən silinir + İzləmə sorğusu faktoru paylaşılan linklərdən silinmir + Paylaşma keçidlərini youtube.com-a dəyişdir + Paylaşılan keçidlər youtube.com istifadə edir + Paylaşılan keçidlər music.youtube.com istifadə edir + + + Şəxsi filtr + Fərdi filtrlər işlədərək elementləri gizlət + Fərdi filtri aktivləşdir + Fərdi filtr aktivdir + Fərdi filtr qeyri-aktivdir + Fərdi filtr + + Yeni sətirlə ayrılmış filtr üçün element yol qurucusu sətirlərinin siyahısı + Etibarsız fərdi filtr: %s + + + + + Haqqında + Reklamlar + Seçmə miniatürlər + Axın + Ümumi + Oynadıcı + İrəliləyiş cizgisi + Sürüşdürmə nəzarətçiləri + Çoxvariantlı + Köhnə tənzimləmələr bölmələrin bərpa et + Köhnə tənzimləmələr bölmələri göstərilir + Köhnə tənzimləmələr bölmələri göstərilmir + + + Shorts arxa plan oynatmasın qapat + Shorts arxa plan oynatma qapalıdır + Shorts arxa plan oynatma aktivdir + + + Albom kartlarını gizlət + Albom kartları gizlidir + Albom kartları göstərilir + Sənətçi kartlarını gizlət + Sənətçi kartları gizlidir + Sənətçi kartları göstərilir + Çip bölməsin gizlət + Çip bölməsi gizlidir + Çip bölməsi göstərilir + İcma elanların gizlət + İcma elanları gizlədilib + İcma elanları göstərilir + Yığcam afişaları gizlət + Yığcam afişalar gizlidir + Yığcam afişalar görünür + Genişlənən kartı gizlət + Videoların aşağısında genişlənən kart gizlidir + Videoların altında genişlənən kart görünür + Üzən mikrofon düyməsini gizlət + Axtarışda üzən mikrofon düyməsi gizlidir + Üzən mikrofon düyməsi axtarışda göstərilir + Üfüqi hissələri gizlət + "Üfüqi cərgələr gizlidir, məsələn: • Son xəbərlər • İzləməyə davam et • Daha çox kanal kəşf et • Ən uyğun • Alış-veriş • Yenidən izləyin" - Üfüqi cərgələr görünür - Şəkil cərgəsin gizlət - Şəkil cərgəsi axtarış nəticələrində gizlidir - Şəkil cərgəsi axtarış nəticələrində görünür - Son elanları gizlət - Ən son elanlar gizlədilib - Ən son elanlar göstərilir - Qarışıq pleylistləri gizlət - Qarışıq oynatma siyahıları gizlədilir - Qarışıq oynatma siyahıları göstərilir - Filmlər bölməsini gizlət - Filmlər bölməsi gizlidir - Filmlər bölməsi göstərilir - - \"Mənə bildir\" düyməsini gizlət - Mənə bildir düyməsi gizlidir - Mənə bildir düyməsi görünür - Oynadılan elementləri gizlət - Oynadılanlar gizlidir - Oynadılanlar göstərilir - - \'Daha çox göstər\' düyməsini gizlət - Daha çox göstər düyməsi axtarış nəticələrində gizlidir - Daha çox göstər düyməsi axtarış nəticələrində görünür - Sorğuları gizlət - Sorğular gizlədilib - Sorğular görünür - Bilet bölməsin gizlət - Bilet bölməsi gizlidir - Bilet bölməsi görünür - - Video tövsiyə etiketlərini gizlət - \'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində gizlədilib - \'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində görünür - Vizual ayırıcı gizlət - Vizual ayırıcı gizlənib - Vizual ayırıcı göstərilib - - YouTube Doodle-ları gizlət - YouTube Doodles animasiyası simvolda gizlidir - YouTube Doodles animasiyası simvolda görünür - "YouTube Doodle-ları hər il bir neçə gün görünür. + \'Daha çox göstər\' düyməsini gizlət + Daha çox göstər düyməsi axtarış nəticələrində gizlidir + Daha çox göstər düyməsi axtarış nəticələrində görünür + Sorğuları gizlət + Sorğular gizlədilib + Sorğular görünür + Bilet bölməsin gizlət + Bilet bölməsi gizlidir + Bilet bölməsi görünür + + Video tövsiyə etiketlərini gizlət + \'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində gizlədilib + \'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində görünür + Vizual ayırıcı gizlət + Vizual ayırıcı gizlənib + Vizual ayırıcı göstərilib + + YouTube Doodle-ları gizlət + YouTube Doodles animasiyası simvolda gizlidir + YouTube Doodles animasiyası simvolda görünür + "YouTube Doodle-ları hər il bir neçə gün görünür. Əgər hazırda bölgənizdə Doodle göstərilirsə və bu gizlətmə seçimi aktivdirsə, axtarış cizgisi aşağısındakı filtr sahəsi də gizlədiləcək." - Kanal çubuğunu gizlət - Kanal çubuğu gizlidir - Kanal çubuğu göstərilir - Kanal filiqranını gizlət - Su nişanı gizlidir - Su nişanı göstərilir - İanə qutusunu gizlət - İanə qutusu gizlidir - İanə qutusu göstərilir - Ciddi vəziyyət qutularını gizlət - Ciddi vəziyyət qutuları gizlidir - Ciddi vəziyyət qutuları göstərilir - Məlumat lövhələrini gizlət - Məlumat lövhələri gizlidir - Məlumat lövhələri göstərilir - - Qoşul düyməsin gizlət - Qoşul düyməsi gizlidir - Qoşul düyməsi görünür - Tibbi lövhələri gizlət - Tibbi lövhələr gizlidir - Tibbi lövhələr göstərilir - Cəld fəaliyyətləri gizlət - Tam ekranda cəld fəaliyyətlər gizlədilib - Tam ekranda cəld fəaliyyətlər görünür - Əlaqəli videoları gizlət - Əlaqəli videolar cəld fəaliyyətlərdə gizlədilib - Əlaqəli videolar cəld fəaliyyətlərdə görünür - Abunəçi təlimatlarını gizlət - Abunəliklərin icma təlimatları gizlidir - Abunəliklərin icma təlimatları göstərilir - Vaxtlı reaksiyaları gizlət - Zamanlanmış reaksiyalar gizlədilir - Zamanlanmış reaksiyalar göstərilir - \"AI ilə yaradılan video xülasəsini\" gizlət - Sİ ilə yaradılan video xülasə bölməsi gizlədilib - Sİ ilə yaradılan video xülasə bölməsi görünür - Soruş\'u Gizlət - Soruş bölməsi gizlidir - \"Soruş\" bölməsi göstərilir - Atributları Gizlət - Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri gizlədilir - Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri görünür - Fəsilləri Gizlət - Bölümlər bölməsi gizlidir - Bölümlər bölməsi göstərilir - \'Bu kontent necə hazırlanıb\'ı Gizlət - Bu məzmunun necə hazırlandığı bölməsi gizlidir - Bu məzmunun necə hazırlandığı bölməsi görünür - Coşqu xalların gizlət - Coşqu xalları gizlədilib - Coşqu xalları göstərilir - \'Podkastı araşdırın\"-ı Gizlət - Podkast bölməsin araşdırın gizlidir - Podkast bölməsin araşdırın görünür - Seçilən keçidləri gizlət - Seçilən keçidlər bölməsi gizlidir - Seçilən keçidlər bölməsi göstərilir - Seçilən videoları gizlət - Seçilən videolar bölməsi gizlidir - Seçilən videolar bölməsi göstərilir - Məlumat Kartlarını Gizlət - Məlumat kartları bölməsi gizlədilir - Məlumat kartları bölməsi göstərilir - \"Əsas konseptlər-i\" gizlət - Əsas konseptlər bölməsi gizlidir - Əsas konseptlər bölməsi görünür - Abunə ol düyməsini gizlət - Abunə ol düyməsi gizlidir - Abunə ol düyməsi görünür - Transkript-i Gizlət - Transkripsiya bölməsi gizlidir - Transkripsiya bölməsi göstərilir - Video təsviri - Video təsviri elementlərini gizlət və ya göstər - Filtr çubuğu - Axınlar, əlaqəli videolar, axtarış nəticələri və baxış tarixçəsində filtr cərgəsin gizlət və ya göstər - Axınlarda gizlət - Axınlarda gizlidir - Axınlarda göstər - Əlaqəli videolarda gizlət - Əlaqəli videolarda gizlidir - Əlaqəli videolarda görünür - Axtarış nəticələrində gizlət - Axtarış nəticələrində gizlədilib - Axtarış nəticələrində göstərilir - Baxış tarixçəsində gizlət - Baxış tarixçəsində gizlədilib - Baxış tarixçəsində görünür - Kanal səhifəsi - Kanal səhifə elementlərini gizlət və ya göstər - - İcma düyməsini gizlət - İcmaya düyməsi gizlidir - İcmaya düyməsi görünür - - \"Sizin üçün\" bölməsin gizlət - Sizin üçün cərgəsi gizlidir - Sizin üçün cərgəsi görünür - - Qoşulun düyməsini gizlət - Qoşul düyməsi gizlidir - Qoşul düyməsi görünür - Keçidlərin önizləməsini gizlət - Keçidlər önizləməsi gizlədilib - Keçidlər önizləməsi görünür - Üzvlər cərgəsini gizlət - Üzvlər cərgəsi gizlidir - Üzvlər cərgəsi görünür - - Mağaza düyməsini gizlət - Mağaza düyməsi gizlidir - Mağaza düyməsi görünür - - Abunə ol düyməsini gizlət - Abunə ol düyməsi gizlidir - Abunə ol düyməsi görünür - Şərhlər - Şərhlər bölməsi elementlərin gizlət və ya göstər - Sİ söhbət xülasəsini gizlət - Sİ söhbət xülasəsi gizlidir - Sİ söhbət xülasəsi görünür - AI şərhlər xülasəsini gizlət - Sİ şərhlər xülasəsi gizlidir - Sİ şərhlər xülasəsi görünür - Kanal təlimatlarını gizlət - Kanal təlimatları gizlidir - Kanal təlimatları görünür - \'Üzvlərin şərhləri\' başlığını gizlət - Üzvlərin şərhləri başlığı gizlidir - Üzvlərin şərhləri başlığı görünür - Şərhlər bölməsini gizlət - Şərhlər bölməsi gizlidir - Şərhlər bölməsi göstərilir - İcma təlimatlarını gizlət - İcma təlimatları gizlidir - İcma təlimatları görünür - \"Shorts Yarat\" düyməsini gizlət - Short yarat düyməsi gizlidir - Short yarat düyməsi görünür - Emoji və Vaxt damğası düymələrini gizlət - Emoji və Vaxt damğası düymələri gizlədilib - Emoji və Vaxt damğası düymələri görünür - Önbaxış şərhin gizlət - Önbaxış şərhi gizlədilib - Önbaxış şərhi göstərilir - Təşəkkür Düyməsini Gizlət - Təşəkkür düyməsi gizlidir - Təşəkkür düyməsi göstərilir - Baxış sayını gizlət - Baxış sayı axın və axtarış nəticələrində gizlidir - Baxış sayı axın və axtarış nəticələrində görünür - - "Məhdudiyyətlər: + Qoşul düyməsin gizlət + Qoşul düyməsi gizlidir + Qoşul düyməsi görünür + Tibbi lövhələri gizlət + Tibbi lövhələr gizlidir + Tibbi lövhələr göstərilir + Cəld fəaliyyətləri gizlət + Tam ekranda cəld fəaliyyətlər gizlədilib + Tam ekranda cəld fəaliyyətlər görünür + Əlaqəli videoları gizlət + Əlaqəli videolar cəld fəaliyyətlərdə gizlədilib + Əlaqəli videolar cəld fəaliyyətlərdə görünür + Abunəçi təlimatlarını gizlət + Abunəliklərin icma təlimatları gizlidir + Abunəliklərin icma təlimatları göstərilir + Vaxtlı reaksiyaları gizlət + Zamanlanmış reaksiyalar gizlədilir + Zamanlanmış reaksiyalar göstərilir + \"AI ilə yaradılan video xülasəsini\" gizlət + Sİ ilə yaradılan video xülasə bölməsi gizlədilib + Sİ ilə yaradılan video xülasə bölməsi görünür + Soruş\'u Gizlət + Soruş bölməsi gizlidir + \"Soruş\" bölməsi göstərilir + Atributları Gizlət + Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri gizlədilir + Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bölmələri görünür + Fəsilləri Gizlət + Bölümlər bölməsi gizlidir + Bölümlər bölməsi göstərilir + \'Bu kontent necə hazırlanıb\'ı Gizlət + Bu məzmunun necə hazırlandığı bölməsi gizlidir + Bu məzmunun necə hazırlandığı bölməsi görünür + Coşqu xalların gizlət + Coşqu xalları gizlədilib + Coşqu xalları göstərilir + \'Podkastı araşdırın\"-ı Gizlət + Podkast bölməsin araşdırın gizlidir + Podkast bölməsin araşdırın görünür + Seçilən keçidləri gizlət + Seçilən keçidlər bölməsi gizlidir + Seçilən keçidlər bölməsi göstərilir + Seçilən videoları gizlət + Seçilən videolar bölməsi gizlidir + Seçilən videolar bölməsi göstərilir + Məlumat Kartlarını Gizlət + Məlumat kartları bölməsi gizlədilir + Məlumat kartları bölməsi göstərilir + \"Əsas konseptlər-i\" gizlət + Əsas konseptlər bölməsi gizlidir + Əsas konseptlər bölməsi görünür + Abunə ol düyməsini gizlət + Abunə ol düyməsi gizlidir + Abunə ol düyməsi görünür + Transkript-i Gizlət + Transkripsiya bölməsi gizlidir + Transkripsiya bölməsi göstərilir + Video təsviri + Video təsviri elementlərini gizlət və ya göstər + Filtr çubuğu + Axınlar, əlaqəli videolar, axtarış nəticələri və baxış tarixçəsində filtr cərgəsin gizlət və ya göstər + Axınlarda gizlət + Axınlarda gizlidir + Axınlarda göstər + Əlaqəli videolarda gizlət + Əlaqəli videolarda gizlidir + Əlaqəli videolarda görünür + Axtarış nəticələrində gizlət + Axtarış nəticələrində gizlədilib + Axtarış nəticələrində göstərilir + Baxış tarixçəsində gizlət + Baxış tarixçəsində gizlədilib + Baxış tarixçəsində görünür + Kanal səhifəsi + Kanal səhifə elementlərini gizlət və ya göstər + + İcma düyməsini gizlət + İcmaya düyməsi gizlidir + İcmaya düyməsi görünür + + \"Sizin üçün\" bölməsin gizlət + Sizin üçün cərgəsi gizlidir + Sizin üçün cərgəsi görünür + + Qoşulun düyməsini gizlət + Qoşul düyməsi gizlidir + Qoşul düyməsi görünür + Keçidlərin önizləməsini gizlət + Keçidlər önizləməsi gizlədilib + Keçidlər önizləməsi görünür + Üzvlər cərgəsini gizlət + Üzvlər cərgəsi gizlidir + Üzvlər cərgəsi görünür + + Mağaza düyməsini gizlət + Mağaza düyməsi gizlidir + Mağaza düyməsi görünür + + Abunə ol düyməsini gizlət + Abunə ol düyməsi gizlidir + Abunə ol düyməsi görünür + Şərhlər + Şərhlər bölməsi elementlərin gizlət və ya göstər + Sİ söhbət xülasəsini gizlət + Sİ söhbət xülasəsi gizlidir + Sİ söhbət xülasəsi görünür + AI şərhlər xülasəsini gizlət + Sİ şərhlər xülasəsi gizlidir + Sİ şərhlər xülasəsi görünür + Kanal təlimatlarını gizlət + Kanal təlimatları gizlidir + Kanal təlimatları görünür + \'Üzvlərin şərhləri\' başlığını gizlət + Üzvlərin şərhləri başlığı gizlidir + Üzvlərin şərhləri başlığı görünür + Şərhlər bölməsini gizlət + Şərhlər bölməsi gizlidir + Şərhlər bölməsi göstərilir + İcma təlimatlarını gizlət + İcma təlimatları gizlidir + İcma təlimatları görünür + \"Shorts Yarat\" düyməsini gizlət + Short yarat düyməsi gizlidir + Short yarat düyməsi görünür + Emoji və Vaxt damğası düymələrini gizlət + Emoji və Vaxt damğası düymələri gizlədilib + Emoji və Vaxt damğası düymələri görünür + Önbaxış şərhin gizlət + Önbaxış şərhi gizlədilib + Önbaxış şərhi göstərilir + Təşəkkür Düyməsini Gizlət + Təşəkkür düyməsi gizlidir + Təşəkkür düyməsi göstərilir + Baxış sayını gizlət + Baxış sayı axın və axtarış nəticələrində gizlidir + Baxış sayı axın və axtarış nəticələrində görünür + + "Məhdudiyyətlər: • Shorts bölmələri, kanal səhifələri və axtarış nəticələri yenə də baxış sayını göstərə bilər • Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" - Yüklənilmə vaxtını gizlət - Yüklənilmə vaxtı axın və axtarış nəticələrində gizlidir - Yüklənilmə vaxtı axın və axtarış nəticələrində göstərilir - - "Məhdudiyyətlər: + Yüklənilmə vaxtını gizlət + Yüklənilmə vaxtı axın və axtarış nəticələrində gizlidir + Yüklənilmə vaxtı axın və axtarış nəticələrində göstərilir + + "Məhdudiyyətlər: • Shorts bölmələri, kanal səhifələri və axtarış nəticələri yüklənilən vaxtı yenə də göstərə bilər • Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" - Açar söz məzmununu gizlət - Açar söz filtrləri ilə axtarış və axın videolarını gizlət - Ev videolarını açar sözlərə görə gizlət - Ev bölməsindəki videolar açar sözlərlə filtrlənir - Ev bölməsindəki videolar açar sözlərlə filtrlənmir - Axtarış nəticələrini açar sözlərlə gizlət - Axtarış nəticələri açar sözlərə görə çeşidlənir - Axtarış nəticələri açar sözlərə görə çeşidlənmir - Abunəlik videolarını açar sözlərlə gizlət - Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənir - Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənmir - Gizlədiləcək açar sözlər - - "Yeni sətirlərlə ayrılan, gizlədiləcək açar sözlər və ifadələr + "Yeni sətirlərlə ayrılan, gizlədiləcək açar sözlər və ifadələr Açar sözlər kanal adları və ya video adlarında göstərilən istənilən mətn ola bilər. Ortada böyük hərflli sözlər belə yerləşdirilməlidir (yəni: iPhone, TikTok, LeBlanc)" - Açar söz filtrləməsi haqqında - "Ev/Abunəlik/Axtarış nəticələri açar söz ifadələrinə uyğun olan məzmunu gizlətmək üçün çeşidlənir + Açar söz filtrləməsi haqqında + "Ev/Abunəlik/Axtarış nəticələri açar söz ifadələrinə uyğun olan məzmunu gizlətmək üçün çeşidlənir Məhdudiyyətlər • Shorts-lar kanal adı ilə gizlənə bilməz • Bəzi UI hissəcikləri gizlənə bilməz • Açar söz axtarma nəticə verməyə bilər" - Bütün sözləri uyğunlaşdır - - Açar söz/frazanın qoşa dırnaqlarla əhatə olunması video adları və kanal adlarının qismən uyğunlaşmasına mane olacaq <br><br>Məsələn,<br><b>\"ai\"</b> videonu gizlədəcək:<b>How does AI work?</b><br> lakin gizlətməyəcək: Düzgün;<b>What does fair use mean?</b> - - Açar söz istifadə edilə bilmir: %s - Açar söz istifadəsi üçün istinad əlavə et: %s - Açar sözün ziddiyyətli hissəcikləri var: %s - Açar söz çox qısadır və istinad tələb edir: %s - Açar söz, bütün videoları gizlədəcək: %s - - - Yaradıcı mağaza bölümün gizlət - Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir - Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür - Son ekran mağaza afişasın gizlət - Son ekran mağaza afişası gizlidir - Son ekran mağaza afişası görünür - Tam ekran reklamlarını gizlət - "Tam ekran reklamları gizlidir + Bütün sözləri uyğunlaşdır + + Açar söz/frazanın qoşa dırnaqlarla əhatə olunması video adları və kanal adlarının qismən uyğunlaşmasına mane olacaq <br><br>Məsələn,<br><b>\"ai\"</b> videonu gizlədəcək:<b>How does AI work?</b><br> lakin gizlətməyəcək: Düzgün;<b>What does fair use mean?</b> + + Açar söz istifadə edilə bilmir: %s + Açar söz istifadəsi üçün istinad əlavə et: %s + Açar sözün ziddiyyətli hissəcikləri var: %s + Açar söz çox qısadır və istinad tələb edir: %s + Açar söz, bütün videoları gizlədəcək: %s + + + Yaradıcı mağaza bölümün gizlət + Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir + Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür + Son ekran mağaza afişasın gizlət + Son ekran mağaza afişası gizlidir + Son ekran mağaza afişası görünür + Tam ekran reklamlarını gizlət + "Tam ekran reklamları gizlidir Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" - Tam ekran reklamları göstərilir - - Tam ekran reklamları gizlətmə yalnız köhnə cihazlarda işləyir - Ümumi reklamları gizlət - Ümumi reklamlar gizlidir - Ümumi reklamlar göstərilir - Məhsul afişaların gizlət - Məhsul afişaları gizlədilir - Məhsul afişaları görünür - Ödənişli tanıtım etiketini gizlət - Ödənişli reklam etiketi gizlədilib - Ödənişli reklam etiketi göstərilir - Öz-sponsorlu kartları gizlət - Özünə sponsorluq edilən kartlar gizlidir - Özünə sponsorluq edilən kartlar göstərilir - Alış-veriş linklərini gizlət - Alış-veriş linkləri video təsvirdə gizlidir - Alış-veriş linkləri video təsvirdə görünür - “Məhsullara baxın” afişasın gizlət - Məhsullara baxış etiketi video örtüyündə gizlidir - Məhsullara baxış etiketi video örtüyündə görünür - Veb axtarış nəticələrini gizlət - Veb axtarış nəticələri gizlədilir - Veb axtarış nəticələri göstərilir - - - YouTube Premium reklamlarını gizlət - Video oynadıcı altında YouTube Premium elanları gizlidir - Video oynadıcı altındakı YouTube Premium elanları göstərilir - - - Video reklamlarını gizlət - Video reklamlar gizlədilir - Video reklamlar göstərilir - - - URL buferə köçürüldü - Vaxt möhürlü URL köçürüldü - Video URL-i köçürmə düyməsin göstər - Video URL-ini kopyala düyməsi görünür. Video URL-ini kopyalamaq üçün toxunun. Zaman nişanı ilə kopyalamaq üçün toxunub saxlayın - Video URL-ini kopyala düyməsi görünmür - Vaxt möhürü URL köçür düyməsi göstər - Zaman nişanı URL-ini kopyala düyməsi görünür. Zaman nişanı ilə video URL-ini kopyalamaq üçün toxunun. Zaman nişanı olmadan kopyalamaq üçün toxunub saxlayın - Zaman nişanı URL-ini kopyala düyməsi görünmür - - - İzləyici mülahizə dialoqun sil - Dialoq silindi - Dialoq göstərilir - Bu, yaş məhdudiyyətini ötürmür. Sadəcə birbaşa qəbul edir. - - - TV ani görüntüsü girişin qapat - TV ani görüntüyə giriş qapadılıb - TV ani görüntüyə giriş işləkdir - - - Cüt toxunuşla fəsil ötürməsini qapat - Cüt toxunma heç vaxt növbəti/əvvəlki fəsilə keçidi zorlaya bilməz - Cüt toxunma bəzən növbəti/əvvəlki fəsilə keçidi zorlaya bilər - - - Xarici yükləmələr - Xarici yükləyici istifadəsi üçün tənzimləmələr - Xarici yükləmə düyməsini göstər - Endirin düyməsi oynadıcıda göstərilir - Endirin düyməsi oynadıcıda göstərilmir - - Yükləmə fəaliyyət düyməsin qəbul etmə - Yükləmə düyməsi, xarici yükləyicinizi açır - Yükləmə düyməsi tətbiqə xas yükləyicini açır - Yükləyici paketi adı - Quraşdırılan xarici yükləyici tətbiqinizin paket adı - Paket adını yerləşdir - Digər - Tətbiq quraşdırılmayıb - %s quraşdırılmayıb. Lütfən, bunu quraşdır. - "Paket adı ilə quraşdırılan tətbiq tapılmadı: %s + Tam ekran reklamları göstərilir + + Tam ekran reklamları gizlətmə yalnız köhnə cihazlarda işləyir + Ümumi reklamları gizlət + Ümumi reklamlar gizlidir + Ümumi reklamlar göstərilir + Məhsul afişaların gizlət + Məhsul afişaları gizlədilir + Məhsul afişaları görünür + Ödənişli tanıtım etiketini gizlət + Ödənişli reklam etiketi gizlədilib + Ödənişli reklam etiketi göstərilir + Öz-sponsorlu kartları gizlət + Özünə sponsorluq edilən kartlar gizlidir + Özünə sponsorluq edilən kartlar göstərilir + Alış-veriş linklərini gizlət + Alış-veriş linkləri video təsvirdə gizlidir + Alış-veriş linkləri video təsvirdə görünür + “Məhsullara baxın” afişasın gizlət + Məhsullara baxış etiketi video örtüyündə gizlidir + Məhsullara baxış etiketi video örtüyündə görünür + Veb axtarış nəticələrini gizlət + Veb axtarış nəticələri gizlədilir + Veb axtarış nəticələri göstərilir + + + YouTube Premium reklamlarını gizlət + Video oynadıcı altında YouTube Premium elanları gizlidir + Video oynadıcı altındakı YouTube Premium elanları göstərilir + + + Video reklamlarını gizlət + Video reklamlar gizlədilir + Video reklamlar göstərilir + + + URL buferə köçürüldü + Vaxt möhürlü URL köçürüldü + Video URL-i köçürmə düyməsin göstər + Video URL-ini kopyala düyməsi görünür. Video URL-ini kopyalamaq üçün toxunun. Zaman nişanı ilə kopyalamaq üçün toxunub saxlayın + Video URL-ini kopyala düyməsi görünmür + Vaxt möhürü URL köçür düyməsi göstər + Zaman nişanı URL-ini kopyala düyməsi görünür. Zaman nişanı ilə video URL-ini kopyalamaq üçün toxunun. Zaman nişanı olmadan kopyalamaq üçün toxunub saxlayın + Zaman nişanı URL-ini kopyala düyməsi görünmür + + + İzləyici mülahizə dialoqun sil + Dialoq silindi + Dialoq göstərilir + Bu, yaş məhdudiyyətini ötürmür. Sadəcə birbaşa qəbul edir. + + + TV ani görüntüsü girişin qapat + TV ani görüntüyə giriş qapadılıb + TV ani görüntüyə giriş işləkdir + + + Cüt toxunuşla fəsil ötürməsini qapat + Cüt toxunma heç vaxt növbəti/əvvəlki fəsilə keçidi zorlaya bilməz + Cüt toxunma bəzən növbəti/əvvəlki fəsilə keçidi zorlaya bilər + + + Xarici yükləmələr + Xarici yükləyici istifadəsi üçün tənzimləmələr + Xarici yükləmə düyməsini göstər + Endirin düyməsi oynadıcıda göstərilir + Endirin düyməsi oynadıcıda göstərilmir + + Yükləmə fəaliyyət düyməsin qəbul etmə + Yükləmə düyməsi, xarici yükləyicinizi açır + Yükləmə düyməsi tətbiqə xas yükləyicini açır + Yükləyici paketi adı + Quraşdırılan xarici yükləyici tətbiqinizin paket adı + Paket adını yerləşdir + Digər + Tətbiq quraşdırılmayıb + %s quraşdırılmayıb. Lütfən, bunu quraşdır. + "Paket adı ilə quraşdırılan tətbiq tapılmadı: %s Paket adının düzgün olduğun yoxla və tətbiqi quraşdırın" - Paket adı boş ola bilməz - - - Dəqiq axtarış jestini qapadın - Jest qeyri-aktiv edilib - Jest aktivləşdirilib - - - Axtarmaq üçün toxun\'u aktivləşdir - Axtarmaq üçün toxun, aktivdir - Axtarmaq üçün toxun qapalıdır - - - Parlaqlıq jestini aktivləşdir - "Tam ekran parlaqlıq sürüşdürməsi aktivdir + Paket adı boş ola bilməz + + + Dəqiq axtarış jestini qapadın + Jest qeyri-aktiv edilib + Jest aktivləşdirilib + + + Axtarmaq üçün toxun\'u aktivləşdir + Axtarmaq üçün toxun, aktivdir + Axtarmaq üçün toxun qapalıdır + + + Parlaqlıq jestini aktivləşdir + "Tam ekran parlaqlıq sürüşdürməsi aktivdir Ekranın sol tərəfində dikinə sürüşdürərək parlaqlığı tənzimləyin" - Tam ekran parlaqlıq sürüşdürməsi qapalıdır - Səs səviyyəsi jestini aktivləşdir - "Tam ekran səs sürüşdürməsi aktivdir + Tam ekran parlaqlıq sürüşdürməsi qapalıdır + Səs səviyyəsi jestini aktivləşdir + "Tam ekran səs sürüşdürməsi aktivdir Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənzimlə" - Tam ekran səs sürüşdürməsi qapalıdır - Sürüşdürmə jesti üçün sıxmanı aktiv et - Sürüşdürmə üçün sıxma aktivdir - Sürüşdürmə üçün sıxma qapalıdır - Əks-əlaqə reaksiyasını aktivləşdir - Əks-əlaqə reaksiyası aktivləşdirilib - Əks-əlaqə reaksiyası qeyri-aktivdir - Parlaqlığı saxla və bərpa et - Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxla və bərpa et - Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxlama və bərpa etmə - Avto-parlaqlıq jestini aktivləşdir - Parlaqlıq ən aşağı dəyərinə sürüşdürüləndə avto-parlaqlıq aktivləşir - Parlaqlığı ən aşağı dəyərə sürüşdürəndə avto-parlaqlıq aktivləşmir - Avtomatik - Sürüşdürmə örtüyü müddəti - Örtüyün göründüyü millisaniyələrin sayı - Sürüşdürmə cildi arxa plan qeyri-şəffaflığı - 0-100 arası qeyri-şəffaflıq dəyəri - Sürüşmə qeyri-şəffaflığı 0-100 arası olmalıdır - Sürüşdürmə örtüyü parlaqlıq rəngi - Parlaqlığa nəzarət üçün irəliləyiş zolağının rəngi - Sürüşdürmə örtüyü səs səviyyəsi rəngi - Səs səviyyəsinə nəzarət üçün irəliləyiş zolağının rəngi - Sürüşdürmə örtüyü mətn ölçüsü - Sürüşmə üçün mətn ölçüsü 1-30 arasındadır - Mətn ölçüsü 1-30 arası olmalıdır - Sürüşdürmə böyüklük həddi - Sürüşdürmənin icra edilməsi üçün son dəyər - Səs səviyyəsin sürüşdürmə təzyiqi - Hər sürüşdürmədə səs səviyyəsi nə qədər dəyişir - Sürüşmə örtüyü üslubu - Üfüqi örtük - Üfüqi örtük (ən kiçik- yüksək) - Üfüqi örtük (ən kiçik - mərkəz) - Dairəvi örtük - Dairəvi örtük (ən kiçik) - Şaquli örtük - Şaquli örtük (ən kiçik) - Videoları ötürmək üçün sürüşdürməni aktiv et - Tam ekran rejimində sürüşdürmə növbəti/əvvəlki videoya ötürəcək - Tam ekran rejimində sürüşdürmə növbəti/əvvəlki videoya ötürməyəcək - - - Avtomatik titrləri qapat - Avtomatik titrlər qapalıdır - Avtomatik titrlər aktivdir - - - Fəaliyyət düymələri - Videonun altındakı düymələri gizlət və ya göstər - Bəyən və Abunə Ol parıltısını söndür - Bəyən və Abunə ol düyməsinə toxunanda parlamayacaq - Bəyən və Abunə ol düyməsinə toxunanda parlayacaq - \"Bəyənmə\" və \"Bəyənməmə\"ni gizlət - Bəyənmə və Bəyənməmə düymələri gizlidir - Bəyənmə və Bəyənməmə düymələri göstərilir - - \"Paylaş\"ı gizlət - Paylaş düyməsi gizlidir - Paylaş düyməsi göstərilir - - Reklamları Dayandırın-ı gizlət - Reklamları dayandır düyməsi gizlidir - Reklamları dayandır düyməsi görünür - - Şərhləri Gizlət - Şərhlər düyməsi gizlidir - Şərhlər düyməsi görünür - + \"Paylaş\"ı gizlət + Paylaş düyməsi gizlidir + Paylaş düyməsi göstərilir + + Reklamları Dayandırın-ı gizlət + Reklamları dayandır düyməsi gizlidir + Reklamları dayandır düyməsi görünür + + Şərhləri Gizlət + Şərhlər düyməsi gizlidir + Şərhlər düyməsi görünür + - \"Xəbər verin\"i gizlət - Xəbər ver/düyməsi gizlidir - Xəbər ver/düyməsi göstərilir - - \"Remiks\"i gizlət - Remix düyməsi gizlidir - Remiks düyməsi göstərilir - - \"Endirin\"i gizlət - Yükləmə düyməsi gizlidir - Yükləmə düyməsi göstərilir - + \"Remiks\"i gizlət + Remix düyməsi gizlidir + Remiks düyməsi göstərilir + + \"Endirin\"i gizlət + Yükləmə düyməsi gizlidir + Yükləmə düyməsi göstərilir + - Coşqu Gizlət - Coşqu düyməsi gizlidir - Coşqu düyməsi görünür - - Sponsor-u Gizlət - Sponsor düyməsi gizlidir - Sponsor düyməsi görünür - - \"Təşəkkürlər\"i gizlət - Təşəkkür düyməsi gizlidir - Təşəkkür düyməsi göstərilir - + Sponsor-u Gizlət + Sponsor düyməsi gizlidir + Sponsor düyməsi görünür + + \"Təşəkkürlər\"i gizlət + Təşəkkür düyməsi gizlidir + Təşəkkür düyməsi göstərilir + - Soruş\'u Gizlət - Soruş düyməsi gizlidir - \"Soruş\" düyməsi göstərilir - - Kəsmə/ gizlət - Kəsmə düyməsi gizlidir - Kəsmə düyməsi göstərilir - - Mağazanı Gizlət - Mağaza düyməsi gizlidir - Mağaza düyməsi görünür - - Saxlayın-ı Gizlət - Saxlayın düyməsi gizlidir - Saxlayın düyməsi görünür - - - Fəaliyyət düymələri - Fəaliyyət cərgəsindəki düymələri gizlət və ya dəyiş - - \"Ev\"i gizlət - Əsas səhifə düyməsi gizlidir - Əsas səhifə düyməsi göstərilir - - \"Shorts\"u gizlət - Shorts düyməsi gizlidir - Shorts düyməsi göstərilir - - \"Yarat\"ı gizlət - Yarat düyməsi gizlidir - Yarat düyməsi göstərilir - - \"Abunəliklər\"i gizlət - Abunəliklər düyməsi gizlidir - Abunəliklər düyməsi göstərilir - Bildirişləri Gizlət - Bildirişlər düyməsi gizlidir - Bildirişlər düyməsi görünür - - \"Yarat\"ı \"Bildirişlər\" ilə dəyişdir - "Yarat düyməsi Bildirişlər düyməsi ilə dəyişdirilir + Soruş\'u Gizlət + Soruş düyməsi gizlidir + \"Soruş\" düyməsi göstərilir + + Kəsmə/ gizlət + Kəsmə düyməsi gizlidir + Kəsmə düyməsi göstərilir + + Mağazanı Gizlət + Mağaza düyməsi gizlidir + Mağaza düyməsi görünür + + Saxlayın-ı Gizlət + Saxlayın düyməsi gizlidir + Saxlayın düyməsi görünür + + + Fəaliyyət düymələri + Fəaliyyət cərgəsindəki düymələri gizlət və ya dəyiş + + \"Ev\"i gizlət + Əsas səhifə düyməsi gizlidir + Əsas səhifə düyməsi göstərilir + + \"Shorts\"u gizlət + Shorts düyməsi gizlidir + Shorts düyməsi göstərilir + + \"Yarat\"ı gizlət + Yarat düyməsi gizlidir + Yarat düyməsi göstərilir + + \"Abunəliklər\"i gizlət + Abunəliklər düyməsi gizlidir + Abunəliklər düyməsi göstərilir + Bildirişləri Gizlət + Bildirişlər düyməsi gizlidir + Bildirişlər düyməsi görünür + + \"Yarat\"ı \"Bildirişlər\" ilə dəyişdir + "Yarat düyməsi Bildirişlər düyməsi ilə dəyişdirilir Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir" - \"Yarat\" düyməsi, \"Bildirişlər\" düyməsi ilə əvəzlənmir - "Bu seçimin qapanması Shorts reklam əngəllənməsin də qapadacaq. + \"Yarat\" düyməsi, \"Bildirişlər\" düyməsi ilə əvəzlənmir + "Bu seçimin qapanması Shorts reklam əngəllənməsin də qapadacaq. Bu seçimi dəyişdirmə işə düşmürsə, Gizli rejimə keçməyə çalışın." - Fəaliyyət düymə etiketlərini gizlət - Etiketlər gizlidir - Etiketlər göstərilir - Yarımşəffaf mövqe cizgisin qapat - Mövqe cizgisi qeyri-şəffafdır - Mövqe cizgisi qeyri-şəffaf və ya şəffafdır - Bəzi cihazlarda bu xüsusiyyət aktivləşməsi sistem fəaliyyət cərgəsini şəffaf-a dəyişə bilər. - Açıq temada şəffaf cizgini qapat - İşıqlı rejim fəaliyyət cərgəsi qeyri-şəffafdır - İşıqlı rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdır - Qaranlıq rejimdə şəffaf cərgəni qapat - Qaranlıq rejimdə fəaliyyət cərgəsi qeyri-şəffafdır - Qaranlıq rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdır - - - Açılan menyu - Oynadıcı açılan menyu elementlərini gizlət və ya göstər - - Titrləri Gizlət - Titrlər menyusu gizlidir - Titrlər menyusu göstərilir - - Əlavə ayarları gizlət - Əlavə ayarlar menyusu gizlidir - Əlavə ayarlar menyusu göstərilir - - Yuxu Taymerini Gizlət - Yuxu taymeri menyusu gizlidir - Yuxu taymeri menyusu göstərilir - - Videonu təkrarlanı, gizlət - Təkrarlama video menyusu gizlidir - Təkrarlama video menyusu göstərilir - - Ambient rejimini gizlət - Ambient rejimi menyusu gizlidir - Ambient rejimi menyusu göstərilir - Stabil səs səviyyəsin gizlət - Sabit səs menyusu göstərilir - Stabil səs menyusu gizlidir - - Kömək və əks əlaqəni gizlət - Kömək və əks əlaqə menyusu gizlidir - Kömək və əks əlaqə menyusu göstərilir - - \"Oynatma sürəti\"ni gizlət - Oynatma sürəti menyusu gizlidir - Oynatma sürəti menyusu göstərilir - - Kilid ekranını gizlət - Kilid ekranı menyusu gizlidir - Kilid ekranı menyusu göstərilir - - YouTube Music ilə dinləməni gizlət - YouTube Music ilə dinlə menyusu gizlədilib - YouTube Music ilə dinlə menyusu göstərilir - - Səs trekini gizlət - Səs axını menyusu gizlidir - Səs axını menyusu göstərilir - + Titrləri Gizlət + Titrlər menyusu gizlidir + Titrlər menyusu göstərilir + + Əlavə ayarları gizlət + Əlavə ayarlar menyusu gizlidir + Əlavə ayarlar menyusu göstərilir + + Yuxu Taymerini Gizlət + Yuxu taymeri menyusu gizlidir + Yuxu taymeri menyusu göstərilir + + Videonu təkrarlanı, gizlət + Təkrarlama video menyusu gizlidir + Təkrarlama video menyusu göstərilir + + Ambient rejimini gizlət + Ambient rejimi menyusu gizlidir + Ambient rejimi menyusu göstərilir + Stabil səs səviyyəsin gizlət + Sabit səs menyusu göstərilir + Stabil səs menyusu gizlidir + + Kömək və əks əlaqəni gizlət + Kömək və əks əlaqə menyusu gizlidir + Kömək və əks əlaqə menyusu göstərilir + + \"Oynatma sürəti\"ni gizlət + Oynatma sürəti menyusu gizlidir + Oynatma sürəti menyusu göstərilir + + Kilid ekranını gizlət + Kilid ekranı menyusu gizlidir + Kilid ekranı menyusu göstərilir + + YouTube Music ilə dinləməni gizlət + YouTube Music ilə dinlə menyusu gizlədilib + YouTube Music ilə dinlə menyusu göstərilir + + Səs trekini gizlət + Səs axını menyusu gizlidir + Səs axını menyusu göstərilir + - "Səs axını menyusu gizlidir + "Səs axını menyusu gizlidir Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı 'Android No SDK'-a dəyiş" - - \"VR-da İzləni\" gizlət - VR menyusunda izləmə gizlidir - VR menyusunda izləmə göstərilir - Video keyfiyyət menyusunu gizlət - Video keyfiyyət menyusu gizlidir - Video keyfiyyət menyusu görünür - Video keyfiyyət menyusu alt məlumatını gizlət - Video keyfiyyət menyusu alt məlumatı gizlidir - Video keyfiyyət menyusu alt məlumatı göstərilir - - - Avtomatik oynatma düyməsini gizlət - Avtomatik oynatma düyməsi gizlidir - Avtomatik oynatma düyməsi göstərilir - - Titrlər Düyməsin Gizlət - Titrlər düyməsi gizlidir - Titrlər düyməsi göstərilir - Yayımla düyməsini gizlət - Yayım düyməsi gizlidir - Yayım düyməsi göstərilir - Oynadıcı idarəetmələri fonunu gizlət - Oynadıcı idarəetmə fonu gizlədilib - Oynadıcı idarəetmə fonu görünür - Əvvəlki və Növbəti düymələrin gizlət - Düymələr gizlidir - Düymələr göstərilir - - - Son ekran kartlarını gizlət - Son ekran kartları gizlidir - Son ekran kartları göstərilir - - - Tam ekranda Ambient rejimini qapat - Ambient rejimi qeyri-aktiv edilib - Ambient rejimi aktivləşdirildi - - - Məlumat kartlarını gizlət - Məlumat kartları gizlidir - Məlumat kartları göstərilir - - - Sürüşən rəqəm animasiyaların söndür - Sürüşən say animasiyası bağlıdır - Sürüşən say animasiyası açıqdır - - - Video oynadıcı irəliləyiş cizgisin gizlət - Video oynadıcı irəliləyiş cizgisi gizlidir - Video oynadıcı irəliləyiş cizgisi göstərilir - - Video miniatür irəliləyiş cizgisin gizlət - Video miniatür irəliləyiş cizgisi gizlidir - Video miniatür irəliləyiş cizgisi görünür - - - Shorts oynadıcı - Shorts oynadıcı elementlərini gizlət və ya göstər - - Shorts-u Ev axınında gizlət - Ev axını və əlaqəli videolarda gizlidir - Ev axını və əlaqəli videolarda görünür - Axtarış nəticələrindəki \"Shorts\"u gizlət - Axtarış nəticələrində gizlidir - Axtarış nəticələrində görünür - - Shorts-u Abunəliklər axınında gizlət - Abunəliklər axınında gizlidir - Abunəliklər axınında görünür - Baxış tarixçəsində Shorts-u gizlət - Baxış tarixçəsində gizlidir - Baxış tarixçəsində göstərilib - \'Avtomatik dublyaj olunmuş\' etiketini gizlət - Avto-dublyaj etiketi gizlidir - Avto-dublyaj etiketi göstərilir - \'Super Təşəkkür Al\' düyməsini gizlət - Super Təşəkkürlər Al düyməsi gizlidir - Super Təşəkkürlər Al düyməsi görünür - Effekt düyməsini gizlət - Effekt düyməsi gizlidir - Effekt düyməsi görünür - \'Yaşıl ekran\' düyməsini gizlət - \"Yaşıl ekran\" düyməsi gizlidir - \"Yaşıl ekran\" düyməsi göstərilir - Mövzu etiketi düyməsini gizlət - Mövzu etiketi düyməsi gizlidir - Mövzu etiketi düyməsi göstərilir - - Qoşul düyməsin gizlə - Qoşulma düyməsi gizlidir - Qoşulma düyməsi göstərilir - Canlı önizləməni gizlət - Canlı önizləmə gizlədilib - Canlı önizləmə göstərilir - Məkan etiketini gizlət - Məkan etiketi gizlidir - Məkan etiketi göstərilir - Yeni elanlar düyməsini gizlət - Yeni elanlar düyməsi gizlidir - Yeni elanlar düyməsi göstərilir - Dayandırma örtük düymələrini gizlət - Dayandırma örtük düymələri gizlədilir - Dayandırma örtük düymələri göstərilir - Öncül baxış şərhini gizlət - Öncül baxış şərhi gizlidir - Öncül baxış şərhi göstərilir - \'Musiqini yadda saxla\' düyməsini gizlət - \"Musiqini saxla\" düyməsi gizlidir - \"Musiqini saxla\" düyməsi göstərilir - Axtarış təkliflərini gizlət - Axtarış təklifləri gizlədilib - Axtarış təklifləri göstərilir - Mağaza düyməsini gizlət - Mağaza düyməsi gizlidir - Mağaza düyməsi göstərilir - Stikerləri gizlət - Stikerlər gizlidir - Stikerlər göstərilir - Abunə ol düyməsini gizlət - Abunə ol düyməsi gizlidir - Abunə ol düyməsi göstərilir - Etiketlənmiş məhsulları gizlət - Etiketlənmiş məhsullar gizlədilir - Etiketlənmiş məhsullar göstərilir - Yaxınlaşan düyməsini gizlət - \"Yaxınlaşan\" düyməsi gizlidir - \"Yaxınlaşan\" düyməsi göstərilir - Bu səsi işlət düyməsini gizlət - Bu səsi işlət düyməsi gizlidir - Bu səsi işlət düyməsi görünür - Bu şablonu işlət düyməsini gizlət - Bu şablonu işlət düyməsi gizlidir - Bu şablonu işlət düyməsi görünür - Bəyənmə düyməsi fontan animasiyasın gizlət - \"Bəyən\" fontan animasiyası gizlidir - \"Bəyən\" fontan animasiyası göstərilir - Bəyənmə düyməsini gizlət - Bəyənmə düyməsi gizlidir - Bəyənmə düyməsi göstərilir - Bəyənməmə düyməsini gizlət - Bəyənməmə düyməsi gizlidir - Bəyənməmə düyməsi göstərilir - Şərhlər düyməsin gizlət - Şərhlər düyməsi gizlidir - Şərhlər düyməsi göstərilir - - Paylaş düyməsini gizlət - Paylaş düyməsi gizlidir - Paylaş düyməsi göstərilir - - Remix düyməsini gizlət - Remix düyməsi gizlidir - Remix düyməsi göstərilir - Səs düyməsini gizlət - Səs düyməsi gizlidir - Səs düyməsi göstərilir - Məlumat panelini gizlət - Məlumat paneli gizlidir - Məlumat paneli göstərilir - Kanal çubuğunu gizlət - Kanal çubuğu gizlidir - Kanal çubuğu göstərilir - Video başlığını gizlət - Video başlığı gizlidir - Video başlığı görünür - Səs üst məlumat etiketini gizlət - Səs üst məlumat etiketi gizlədilib - Səs üst məlumat etiketi görünür - Video keçidi etiketini gizlət - Video linki etiketi gizlidir - Video link etiketi göstərilir - Fəaliyyət çubuğunu gizlət - Fəaliyyət çubuğu gizlidir - Fəaliyyət çubuğu göstərilir - - - Son ekran bildirilən videonu gizlət - "Avtomatik oynatma qapadılanda son ekran bildirilən video gizlədilir + + \"VR-da İzləni\" gizlət + VR menyusunda izləmə gizlidir + VR menyusunda izləmə göstərilir + Video keyfiyyət menyusunu gizlət + Video keyfiyyət menyusu gizlidir + Video keyfiyyət menyusu görünür + Video keyfiyyət menyusu alt məlumatını gizlət + Video keyfiyyət menyusu alt məlumatı gizlidir + Video keyfiyyət menyusu alt məlumatı göstərilir + + + Avtomatik oynatma düyməsini gizlət + Avtomatik oynatma düyməsi gizlidir + Avtomatik oynatma düyməsi göstərilir + + Titrlər Düyməsin Gizlət + Titrlər düyməsi gizlidir + Titrlər düyməsi göstərilir + Yayımla düyməsini gizlət + Yayım düyməsi gizlidir + Yayım düyməsi göstərilir + Oynadıcı idarəetmələri fonunu gizlət + Oynadıcı idarəetmə fonu gizlədilib + Oynadıcı idarəetmə fonu görünür + Əvvəlki və Növbəti düymələrin gizlət + Düymələr gizlidir + Düymələr göstərilir + + + Son ekran kartlarını gizlət + Son ekran kartları gizlidir + Son ekran kartları göstərilir + + + Tam ekranda Ambient rejimini qapat + Ambient rejimi qeyri-aktiv edilib + Ambient rejimi aktivləşdirildi + + + Məlumat kartlarını gizlət + Məlumat kartları gizlidir + Məlumat kartları göstərilir + + + Sürüşən rəqəm animasiyaların söndür + Sürüşən say animasiyası bağlıdır + Sürüşən say animasiyası açıqdır + + + Video oynadıcı irəliləyiş cizgisin gizlət + Video oynadıcı irəliləyiş cizgisi gizlidir + Video oynadıcı irəliləyiş cizgisi göstərilir + + Video miniatür irəliləyiş cizgisin gizlət + Video miniatür irəliləyiş cizgisi gizlidir + Video miniatür irəliləyiş cizgisi görünür + + + Shorts oynadıcı + Shorts oynadıcı elementlərini gizlət və ya göstər + + Shorts-u Ev axınında gizlət + Ev axını və əlaqəli videolarda gizlidir + Ev axını və əlaqəli videolarda görünür + Axtarış nəticələrindəki \"Shorts\"u gizlət + Axtarış nəticələrində gizlidir + Axtarış nəticələrində görünür + + Shorts-u Abunəliklər axınında gizlət + Abunəliklər axınında gizlidir + Abunəliklər axınında görünür + Baxış tarixçəsində Shorts-u gizlət + Baxış tarixçəsində gizlidir + Baxış tarixçəsində göstərilib + \'Avtomatik dublyaj olunmuş\' etiketini gizlət + Avto-dublyaj etiketi gizlidir + Avto-dublyaj etiketi göstərilir + \'Super Təşəkkür Al\' düyməsini gizlət + Super Təşəkkürlər Al düyməsi gizlidir + Super Təşəkkürlər Al düyməsi görünür + Effekt düyməsini gizlət + Effekt düyməsi gizlidir + Effekt düyməsi görünür + \'Yaşıl ekran\' düyməsini gizlət + \"Yaşıl ekran\" düyməsi gizlidir + \"Yaşıl ekran\" düyməsi göstərilir + Mövzu etiketi düyməsini gizlət + Mövzu etiketi düyməsi gizlidir + Mövzu etiketi düyməsi göstərilir + + Qoşul düyməsin gizlə + Qoşulma düyməsi gizlidir + Qoşulma düyməsi göstərilir + Canlı önizləməni gizlət + Canlı önizləmə gizlədilib + Canlı önizləmə göstərilir + Məkan etiketini gizlət + Məkan etiketi gizlidir + Məkan etiketi göstərilir + Yeni elanlar düyməsini gizlət + Yeni elanlar düyməsi gizlidir + Yeni elanlar düyməsi göstərilir + Dayandırma örtük düymələrini gizlət + Dayandırma örtük düymələri gizlədilir + Dayandırma örtük düymələri göstərilir + Öncül baxış şərhini gizlət + Öncül baxış şərhi gizlidir + Öncül baxış şərhi göstərilir + \'Musiqini yadda saxla\' düyməsini gizlət + \"Musiqini saxla\" düyməsi gizlidir + \"Musiqini saxla\" düyməsi göstərilir + Axtarış təkliflərini gizlət + Axtarış təklifləri gizlədilib + Axtarış təklifləri göstərilir + Mağaza düyməsini gizlət + Mağaza düyməsi gizlidir + Mağaza düyməsi göstərilir + Stikerləri gizlət + Stikerlər gizlidir + Stikerlər göstərilir + Abunə ol düyməsini gizlət + Abunə ol düyməsi gizlidir + Abunə ol düyməsi göstərilir + Etiketlənmiş məhsulları gizlət + Etiketlənmiş məhsullar gizlədilir + Etiketlənmiş məhsullar göstərilir + Yaxınlaşan düyməsini gizlət + \"Yaxınlaşan\" düyməsi gizlidir + \"Yaxınlaşan\" düyməsi göstərilir + Bu səsi işlət düyməsini gizlət + Bu səsi işlət düyməsi gizlidir + Bu səsi işlət düyməsi görünür + Bu şablonu işlət düyməsini gizlət + Bu şablonu işlət düyməsi gizlidir + Bu şablonu işlət düyməsi görünür + Bəyənmə düyməsi fontan animasiyasın gizlət + \"Bəyən\" fontan animasiyası gizlidir + \"Bəyən\" fontan animasiyası göstərilir + Bəyənmə düyməsini gizlət + Bəyənmə düyməsi gizlidir + Bəyənmə düyməsi göstərilir + Bəyənməmə düyməsini gizlət + Bəyənməmə düyməsi gizlidir + Bəyənməmə düyməsi göstərilir + Şərhlər düyməsin gizlət + Şərhlər düyməsi gizlidir + Şərhlər düyməsi göstərilir + + Paylaş düyməsini gizlət + Paylaş düyməsi gizlidir + Paylaş düyməsi göstərilir + + Remix düyməsini gizlət + Remix düyməsi gizlidir + Remix düyməsi göstərilir + Səs düyməsini gizlət + Səs düyməsi gizlidir + Səs düyməsi göstərilir + Məlumat panelini gizlət + Məlumat paneli gizlidir + Məlumat paneli göstərilir + Kanal çubuğunu gizlət + Kanal çubuğu gizlidir + Kanal çubuğu göstərilir + Video başlığını gizlət + Video başlığı gizlidir + Video başlığı görünür + Səs üst məlumat etiketini gizlət + Səs üst məlumat etiketi gizlədilib + Səs üst məlumat etiketi görünür + Video keçidi etiketini gizlət + Video linki etiketi gizlidir + Video link etiketi göstərilir + Fəaliyyət çubuğunu gizlət + Fəaliyyət çubuğu gizlidir + Fəaliyyət çubuğu göstərilir + + + Son ekran bildirilən videonu gizlət + "Avtomatik oynatma qapadılanda son ekran bildirilən video gizlədilir Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunuş → Növbəti videonu avtomatik oxudun" - Son ekranda bildirilən video göstərilir - - - Əlaqəli videolar örtüyünü gizlət - Əlaqəli videolar yerləşməsi tam ekranda gizlidir - Əlaqəli videolar yerləşməsi tam ekranda görünür - - - Video vaxt möhürünü gizlət - Vaxt möhürü gizlidir - Vaxt möhürü göstərilir - - - Oynadıcı açılan pəncərə panellərin gizlə - Oynadıcı açılan pəncərə panelləri gizlidir - Oynadıcı açılan pəncərə panelləri göstərilir - - - Video sonunda tam ekran rejimindən çıx - Qapalı - Şaquli - Üfüqi - Şaquli və üfüqi - - - Videoları şaquli tam ekranda aç - Videolar tam ekranda açılır - Videolar tam ekranda açılmır - - - Oynadıcı örtüyünün qeyri-şəffaflığı - 0-100 arası qeyri-şəffaflıq dəyəri, 0 şəffafdır - Oynadıcı örtüyü qeyri-şəffaflığı 0-100 arası olmalıdır - - - - \"Bəyənməmə\" müvəqqəti əlçatmazdır (API vaxtı bitdi) - Bəyənməmə əlçatmazdır (status %d) - Bəyənməmələr mövcud deyil (qəbuledici API limiti) - Bəyənməmə əlçatmazdır (%s) - - Ryd ilə səsvermə üçün videonu yenidən yüklə - - Sahib tərəfindən gizlədilib - Bəyənməmələr göstərilir - Bəyənməmələr göstərilmir - \"Shorts\"da bəyənməmə sayını göstər - "Bəyənməmələr Shorts-da göstərilir + Son ekranda bildirilən video göstərilir + + + Əlaqəli videolar örtüyünü gizlət + Əlaqəli videolar yerləşməsi tam ekranda gizlidir + Əlaqəli videolar yerləşməsi tam ekranda görünür + + + Video vaxt möhürünü gizlət + Vaxt möhürü gizlidir + Vaxt möhürü göstərilir + + + Oynadıcı açılan pəncərə panellərin gizlə + Oynadıcı açılan pəncərə panelləri gizlidir + Oynadıcı açılan pəncərə panelləri göstərilir + + + Video sonunda tam ekran rejimindən çıx + Qapalı + Şaquli + Üfüqi + Şaquli və üfüqi + + + Videoları şaquli tam ekranda aç + Videolar tam ekranda açılır + Videolar tam ekranda açılmır + + + Oynadıcı örtüyünün qeyri-şəffaflığı + 0-100 arası qeyri-şəffaflıq dəyəri, 0 şəffafdır + Oynadıcı örtüyü qeyri-şəffaflığı 0-100 arası olmalıdır + + + + \"Bəyənməmə\" müvəqqəti əlçatmazdır (API vaxtı bitdi) + Bəyənməmə əlçatmazdır (status %d) + Bəyənməmələr mövcud deyil (qəbuledici API limiti) + Bəyənməmə əlçatmazdır (%s) + + Ryd ilə səsvermə üçün videonu yenidən yüklə + + Sahib tərəfindən gizlədilib + Bəyənməmələr göstərilir + Bəyənməmələr göstərilmir + \"Shorts\"da bəyənməmə sayını göstər + "Bəyənməmələr Shorts-da göstərilir Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər" - Bəyənməmələr Shorts-da göstərilmir - \"Bəyənməmə\"lər faiz olaraq - Bəyənməmələr faiz kimi göstərilir - Bəyənməmələr nömrə kimi göstərilir - - Yığcam Bəyən Düyməsi - Daha kiçik en üçün hazırlanmış Bəyən düyməsi - Ən yaxşı görünüş üçün tərtib edilmiş Bəyən düyməsi - Təxmini bəyənmələri göstər - Bəyənmələri olmayan videolar təxmini bəyənmə sayını göstərir - Təxmini bəyənmələr göstərilmir - API əlçatan deyilsə ani bildiriş göstər - Return YouTube Dislike əlçatan deyilsə ani bildiriş göstər - Return YouTube Dislike əlçatan deyilsə ani bildiriş göstərmə - Məlumat Return YouTube Dislike API vasitəsilə alınır. Ətraflı öyrənmək üçün bura toxun - - Bu cihazda Return YouTube Dislike API statistikası - Orta hesabla API cavab müddəti - Ən aşağı API cavab müddəti - Ən yüksək API cavab müddəti - Son video üzrə API cavab müddəti - Bəyənməmələr müvəqqəti olaraq əlçatmazdır - Qəbuledici API sürət limiti var - API alınan səsvermədə zəng sayı - Heç bir şəbəkə istəyi olmadı - %d şəbəkə istəyi oldu - API alınan səsvermədə bitən müddət - Heç bir şəbəkə istəyi üçün vaxt bitmədi - %d şəbəkə istəyi üçün vaxt bitdi - API qəbuledici sürət məhdudiyyətləri - Qəbuledici sürət məhdudiyyəti olmadı - Qəbuledici sürət limiti %d dəfə baş verdi - %d millisaniyə - - - Geniş axtarış cizgisin aktivləşdir - Geniş axtarış cizgisi aktivdir - Geniş axtarış cizgisi qeyri-aktivdir - - - Yüksək keyfiyyətli miniatürləri aktivləşdir - İrəliləyiş cizgisi miniatürləri yüksək keyfiyyətlidir - İrəliləyiş cizgisi miniatürləri orta keyfiyyətlidir - "Bu, həmçinin irəliləyiş cizgisi miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək. + Bəyənməmələr Shorts-da göstərilmir + \"Bəyənməmə\"lər faiz olaraq + Bəyənməmələr faiz kimi göstərilir + Bəyənməmələr nömrə kimi göstərilir + + Yığcam Bəyən Düyməsi + Daha kiçik en üçün hazırlanmış Bəyən düyməsi + Ən yaxşı görünüş üçün tərtib edilmiş Bəyən düyməsi + Təxmini bəyənmələri göstər + Bəyənmələri olmayan videolar təxmini bəyənmə sayını göstərir + Təxmini bəyənmələr göstərilmir + API əlçatan deyilsə ani bildiriş göstər + Return YouTube Dislike əlçatan deyilsə ani bildiriş göstər + Return YouTube Dislike əlçatan deyilsə ani bildiriş göstərmə + Məlumat Return YouTube Dislike API vasitəsilə alınır. Ətraflı öyrənmək üçün bura toxun + + Bu cihazda Return YouTube Dislike API statistikası + Orta hesabla API cavab müddəti + Ən aşağı API cavab müddəti + Ən yüksək API cavab müddəti + Son video üzrə API cavab müddəti + Bəyənməmələr müvəqqəti olaraq əlçatmazdır - Qəbuledici API sürət limiti var + API alınan səsvermədə zəng sayı + Heç bir şəbəkə istəyi olmadı + %d şəbəkə istəyi oldu + API alınan səsvermədə bitən müddət + Heç bir şəbəkə istəyi üçün vaxt bitmədi + %d şəbəkə istəyi üçün vaxt bitdi + API qəbuledici sürət məhdudiyyətləri + Qəbuledici sürət məhdudiyyəti olmadı + Qəbuledici sürət limiti %d dəfə baş verdi + %d millisaniyə + + + Geniş axtarış cizgisin aktivləşdir + Geniş axtarış cizgisi aktivdir + Geniş axtarış cizgisi qeyri-aktivdir + + + Yüksək keyfiyyətli miniatürləri aktivləşdir + İrəliləyiş cizgisi miniatürləri yüksək keyfiyyətlidir + İrəliləyiş cizgisi miniatürləri orta keyfiyyətlidir + "Bu, həmçinin irəliləyiş cizgisi miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək. İrəliləyiş cizgisi miniatürləri cari video kimi eyni keyfiyyəti işlədəcək. Bu funksiya 720p və ya daha aşağı video keyfiyyəti ilə və çox sürətli internet bağlantısı işlədərkən yaxşı işləyir." - Köhnə irəliləmə cizgi miniatürün al - Axtarış cizgisi miniatürləri axtarış çubuğu üstündə görünəcək - Axtarış cizgisi miniatürləri tam ekranda görünəcək - - - \"SponsorBlock\"u aktivləşdir - SponsorBlock YouTube videolarının cansıxıcı hissələrini ötürmək üçün toplu sistemdir - Görünüş - Səsvermə düyməsini göstər - Bölümə səsvermə düyməsi göstərilir - Bölümə səsvermə düyməsi göstərilmir - Kvadrat düzümü istifadə et - Düymələr və idarəedicilər kvadratdır - Düymələr və idarəedicilər dairəvidir - - Yığcam Ötürmə düyməsini istifadə et - Ən kiçik en üçün hazırlanmış ötürmə düyməsi - Ən yaxşı görünüş üçün hazırlanan ötürmə düyməsi - Ötürmə düyməsini avtomatik gizlət - Ötürmə düyməsi bir neçə saniyə sonra gizlənir - Ötürmə düyməsi bütün bölüm ərzində göstərilir - Ötür düyməsi müddəti - Avtomatik gizlənmədən əvvəl ötür və vurğulamaya keç düymələri nə qədər görünür - Ötürməni geri al bildirişin göstər - Ani bildiriş bölüm birbaşa ötürüldükdə görünür. Ötürməni geri qaytarmaq üçün bildirişə toxun - Ani bildiriş görünmür - Ötür ani bildiriş müddəti - Ötür ani bildirişin ləğv etmə göstərilməsi müddəti - 1 saniyə - 2 saniyə - 3 saniyə - 4 saniyə - 5 saniyə - 6 saniyə - 7 saniyə - 8 saniyə - 9 saniyə - 10 saniyə - Bölümsüz video uzunluğun göstər - Video uzunluğu bütün bölümləri çıxarır, irəliləyiş cizgisində göstərir - Tam video uzunluğu göstərilir - Yeni bölümlər yaradılır - Yeni Bölüm Yarat Düyməsini Göstər - Yeni bölüm yarat düyməsi göstərilir - Yeni bölüm yarat düyməsi göstərilmir - Yeni bölüm irəliləyişini tənzimlə - Yeni bölüm yaradarkən vaxt qurma düymələrinin sərf etdiyi millisaniyə sayı - Dəyər, müsbət rəqəm olmalıdır - Təlimatlara bax - Təlimatlar, yeni bölümlərin yaradılması üçün qaydalar və məsləhətlər ehtiva edir - Təlimatları izləyin - Yeni bölümlər yaratmazdan əvvəl SponsorBlock təlimatlarını oxuyun - Artıq oxudum - Mənə göstər - Ümumi - API əlçatan deyilsə ani bildirişi göstər - SponsorBlock əlçatan deyilsə bildiriş göstərilir - SponsorBlock əlçatan deyilsə, bildiriş göstərilmir - Ötürmə sayının izlənməsini aktivləşdir - SponsorBlock liderlik lövhəsinin nə qədər vaxta qənaət edildiyini bilməsinə icazə verir. Hər dəfə bölüm ötürüləndə liderlik lövhəsinə məlumat göndərilir - Ötürmə sayının izlənməsi aktiv deyil - Minimum bölüm müddəti - Bölümlər bu dəyərdən (saniyə olaraq) daha qısadırsa göstərilməyəcək və ya ötürülməyəcək - Etibarsız vaxt müddəti - Şəxsi istifadəçi id - Bu gizli saxlanılmalıdır. Bu, parol kimidir və heç kimlə paylaşılmamalıdır. Kimsə bunu bilsə, onlar sizi təqlid edə bilər - Şəxsi istifadəçi kimliyiniz ən az 30 simvol uzunluğunda olmalıdır - API URL-ni dəyişdirin - SponsorBlock\'un serverə bağlanması üçün istifadə etdiyi ünvan - API URL sıfırlaması - API URL etibarsızdır - API URL dəyişdirildi - İdxal/İxrac etmə tənzimləmələri - Köçür - ReVanced və digər SponsorBlock platformalarına idxal/ixrac edilə bilən SponsorBlock JSON qurmanız - ReVanced və digər SponsorBlock platformalarına idxal/ixrac edilə bilən SponsorBlock JSON qurmanız. Bu şəxsi istifadəçi kimliyinizi saxlayır. Bunu düzgün şəkildə paylaşdığınıza əmin olun - Tənzimləmələr uğurla idxal edildi - %s idxal uğursuz - %s ixrac uğursuz - "Tənzimləmələrdə şəxsi SponsorBlock istifadəçi Id-niz var. + Köhnə irəliləmə cizgi miniatürün al + Axtarış cizgisi miniatürləri axtarış çubuğu üstündə görünəcək + Axtarış cizgisi miniatürləri tam ekranda görünəcək + + + \"SponsorBlock\"u aktivləşdir + SponsorBlock YouTube videolarının cansıxıcı hissələrini ötürmək üçün toplu sistemdir + Görünüş + Səsvermə düyməsini göstər + Bölümə səsvermə düyməsi göstərilir + Bölümə səsvermə düyməsi göstərilmir + Kvadrat düzümü istifadə et + Düymələr və idarəedicilər kvadratdır + Düymələr və idarəedicilər dairəvidir + + Yığcam Ötürmə düyməsini istifadə et + Ən kiçik en üçün hazırlanmış ötürmə düyməsi + Ən yaxşı görünüş üçün hazırlanan ötürmə düyməsi + Ötürmə düyməsini avtomatik gizlət + Ötürmə düyməsi bir neçə saniyə sonra gizlənir + Ötürmə düyməsi bütün bölüm ərzində göstərilir + Ötür düyməsi müddəti + Avtomatik gizlənmədən əvvəl ötür və vurğulamaya keç düymələri nə qədər görünür + Ötürməni geri al bildirişin göstər + Ani bildiriş bölüm birbaşa ötürüldükdə görünür. Ötürməni geri qaytarmaq üçün bildirişə toxun + Ani bildiriş görünmür + Ötür ani bildiriş müddəti + Ötür ani bildirişin ləğv etmə göstərilməsi müddəti + 1 saniyə + 2 saniyə + 3 saniyə + 4 saniyə + 5 saniyə + 6 saniyə + 7 saniyə + 8 saniyə + 9 saniyə + 10 saniyə + Bölümsüz video uzunluğun göstər + Video uzunluğu bütün bölümləri çıxarır, irəliləyiş cizgisində göstərir + Tam video uzunluğu göstərilir + Yeni bölümlər yaradılır + Yeni Bölüm Yarat Düyməsini Göstər + Yeni bölüm yarat düyməsi göstərilir + Yeni bölüm yarat düyməsi göstərilmir + Yeni bölüm irəliləyişini tənzimlə + Yeni bölüm yaradarkən vaxt qurma düymələrinin sərf etdiyi millisaniyə sayı + Dəyər, müsbət rəqəm olmalıdır + Təlimatlara bax + Təlimatlar, yeni bölümlərin yaradılması üçün qaydalar və məsləhətlər ehtiva edir + Təlimatları izləyin + Yeni bölümlər yaratmazdan əvvəl SponsorBlock təlimatlarını oxuyun + Artıq oxudum + Mənə göstər + Ümumi + API əlçatan deyilsə ani bildirişi göstər + SponsorBlock əlçatan deyilsə bildiriş göstərilir + SponsorBlock əlçatan deyilsə, bildiriş göstərilmir + Ötürmə sayının izlənməsini aktivləşdir + SponsorBlock liderlik lövhəsinin nə qədər vaxta qənaət edildiyini bilməsinə icazə verir. Hər dəfə bölüm ötürüləndə liderlik lövhəsinə məlumat göndərilir + Ötürmə sayının izlənməsi aktiv deyil + Minimum bölüm müddəti + Bölümlər bu dəyərdən (saniyə olaraq) daha qısadırsa göstərilməyəcək və ya ötürülməyəcək + Etibarsız vaxt müddəti + Şəxsi istifadəçi id + Bu gizli saxlanılmalıdır. Bu, parol kimidir və heç kimlə paylaşılmamalıdır. Kimsə bunu bilsə, onlar sizi təqlid edə bilər + Şəxsi istifadəçi kimliyiniz ən az 30 simvol uzunluğunda olmalıdır + API URL-ni dəyişdirin + SponsorBlock\'un serverə bağlanması üçün istifadə etdiyi ünvan + API URL sıfırlaması + API URL etibarsızdır + API URL dəyişdirildi + İdxal/İxrac etmə tənzimləmələri + Köçür + ReVanced və digər SponsorBlock platformalarına idxal/ixrac edilə bilən SponsorBlock JSON qurmanız + ReVanced və digər SponsorBlock platformalarına idxal/ixrac edilə bilən SponsorBlock JSON qurmanız. Bu şəxsi istifadəçi kimliyinizi saxlayır. Bunu düzgün şəkildə paylaşdığınıza əmin olun + Tənzimləmələr uğurla idxal edildi + %s idxal uğursuz + %s ixrac uğursuz + "Tənzimləmələrdə şəxsi SponsorBlock istifadəçi Id-niz var. Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz. " - Təkrar göstərmə - Bölüm davranışını dəyişdir - Ödənişli tanıtım, ödənişli yönləndirmələr və birbaşa reklamlar. Öz reklamı və ya bəyəndikləri səbəblərə/yaradıcılara/veb saytlara/məhsullara ödənişsiz çağırışlar etmək üçün deyil - Ödənişsiz/Öz reklamı - Ödənişsiz və ya öz reklamı istisna olmaqla, Sponsor-a bənzər. Mallar, ianələr və ya onların kiminlə əməkdaşlıq etdiyi məzmunda məlumatlar haqqında bölmələr daxildir - Qarşılıqlı Əlaqə Xatırlatma (Abunə ol) - Məzmun ortasında onları bəyənmək, izləmək və ya abunə olmaq üçün qısa xatırlatma. Əgər uzun və ya xüsusi bir şey haqqındadırsa, bu əvəzində öz reklamı olmalıdır - Vurğulama - Əksər insanların axtardığı video bölümü - Fasilə/Giriş Animasiyası - Həqiqi məzmunu olmayan aralıq. Fasilə, statik kadr və ya təkrarlanan animasiya ola bilər. Məlumat ehtiva edən keçidlər daxil deyil - Son kartlar / Zaminlər - Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil - Giriş / Salamlar - Yaxınlaşan video üçün danışılan kadrlar, salamlama və sağollaşma. Əlavə məzmun əlavə edən bölmələr daxil deyil - Önizləmə / Anons - Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusu - Əlaqəsiz / Zarafatlar - Videonun əsas məzmunun başa düşmək tələb olunmayan əlaqəsiz səhnələr və ya zarafatlar. Məzmun və ya arxa plan təfərrüatlarını təmin edən bölmələr daxil deyil - Musiqi: Musiqi olmayan bölmə - Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri - Ötür - Vurğulama - Sponsoru ötür - Öz reklamın ötür - Əlaqələndirməni ötür - Vurğulanana keç - Girişi ötür - Fasiləni ötür - Fasiləni ötür - Bitişi ötür - Girişi ötür - Önizləməni ötür - Önizləməni ötür - Anonsu ötür - Əlaqəsiz olanı ötür - Musiqisiz hissəni ötür - Bölümü ötür - Sponsorlu hissə ötürüldü - Öz reklamı, ötürüldü - Cansıxıcı xatırlatma ötürüldü - Vurğulanan hissəyə keçildi - Giriş ötürüldü - Fasilə ötürüldü - Fasilə ötürüldü - Bitiş ötürüldü - Giriş ötürüldü - Önbaxış ötürüldü - Önbaxış ötürüldü - Anons ötürüldü - Əlaqəsiz ötürüldü - Musiqi olmayan bölmə ötürüldü - Göndərilməmiş bölüm ötürüldü - Çoxlu bölümlər ötürüldü - Birbaşa ötür - Bir dəfə avtomatik ötür - Ötürmə Düyməsini Göstər - İrəliləmə cizgisində göstər - Qapadın - Bölüm göndərilmir: %s - SponsorBlock müvəqqəti olaraq zəifləyir - Bölüm göndərilmir (status: %1$d %2$s) - Bölüm təqdim etmək olmur. Sürət Məhduddur (eyni istifadəçi və ya IP-dən artıq) - Bölüm göndərilmir: %s - "Bölüm təqdim etmək olmur. + Təkrar göstərmə + Bölüm davranışını dəyişdir + Ödənişli tanıtım, ödənişli yönləndirmələr və birbaşa reklamlar. Öz reklamı və ya bəyəndikləri səbəblərə/yaradıcılara/veb saytlara/məhsullara ödənişsiz çağırışlar etmək üçün deyil + Ödənişsiz/Öz reklamı + Ödənişsiz və ya öz reklamı istisna olmaqla, Sponsor-a bənzər. Mallar, ianələr və ya onların kiminlə əməkdaşlıq etdiyi məzmunda məlumatlar haqqında bölmələr daxildir + Qarşılıqlı Əlaqə Xatırlatma (Abunə ol) + Məzmun ortasında onları bəyənmək, izləmək və ya abunə olmaq üçün qısa xatırlatma. Əgər uzun və ya xüsusi bir şey haqqındadırsa, bu əvəzində öz reklamı olmalıdır + Vurğulama + Əksər insanların axtardığı video bölümü + Fasilə/Giriş Animasiyası + Həqiqi məzmunu olmayan aralıq. Fasilə, statik kadr və ya təkrarlanan animasiya ola bilər. Məlumat ehtiva edən keçidlər daxil deyil + Son kartlar / Zaminlər + Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil + Giriş / Salamlar + Yaxınlaşan video üçün danışılan kadrlar, salamlama və sağollaşma. Əlavə məzmun əlavə edən bölmələr daxil deyil + Önizləmə / Anons + Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusu + Əlaqəsiz / Zarafatlar + Videonun əsas məzmunun başa düşmək tələb olunmayan əlaqəsiz səhnələr və ya zarafatlar. Məzmun və ya arxa plan təfərrüatlarını təmin edən bölmələr daxil deyil + Musiqi: Musiqi olmayan bölmə + Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri + Ötür + Vurğulama + Sponsoru ötür + Öz reklamın ötür + Əlaqələndirməni ötür + Vurğulanana keç + Girişi ötür + Fasiləni ötür + Fasiləni ötür + Bitişi ötür + Girişi ötür + Önizləməni ötür + Önizləməni ötür + Anonsu ötür + Əlaqəsiz olanı ötür + Musiqisiz hissəni ötür + Bölümü ötür + Sponsorlu hissə ötürüldü + Öz reklamı, ötürüldü + Cansıxıcı xatırlatma ötürüldü + Vurğulanan hissəyə keçildi + Giriş ötürüldü + Fasilə ötürüldü + Fasilə ötürüldü + Bitiş ötürüldü + Giriş ötürüldü + Önbaxış ötürüldü + Önbaxış ötürüldü + Anons ötürüldü + Əlaqəsiz ötürüldü + Musiqi olmayan bölmə ötürüldü + Göndərilməmiş bölüm ötürüldü + Çoxlu bölümlər ötürüldü + Birbaşa ötür + Bir dəfə avtomatik ötür + Ötürmə Düyməsini Göstər + İrəliləmə cizgisində göstər + Qapadın + Bölüm göndərilmir: %s + SponsorBlock müvəqqəti olaraq zəifləyir + Bölüm göndərilmir (status: %1$d %2$s) + Bölüm təqdim etmək olmur. Sürət Məhduddur (eyni istifadəçi və ya IP-dən artıq) + Bölüm göndərilmir: %s + "Bölüm təqdim etmək olmur. Artıq mövcuddur" - Bölüm uğurla göndərildi - - SponsorBlock müvəqqəti əlçatmazdır (API vaxtı bitdi) - SponsorBlock müvəqqəti olaraq əlçatan deyil (status %d) - SponsorBlock müvəqqəti olaraq əlçatan deyil - Bölüm üçün səsvermə alınmır (API vaxtı bitdi) - Bölüm üçün səsvermə alınmır (status: %1$d %2$s) - Bölüm üçün səsvermə alınmır: %s - Müsbət səs - Mənfi səs - Kateqoriyanı dəyişdir - Səsvermə üçün bölüm yoxdur - - %1$s - %2$s - Bölüm kateqoriyasını seçin - Seçimlərdə kateqoriya qeyri-aktivdir. Göndərmək üçün kateqoriyanı aktiv et. - Yeni SponsorBlock bölümü - %s, yeni bölümün başlanğıcı və ya sonu kimi təyin edilsin? - Başlanğıc - Bitmə - İndi - Bölüm başladığı vaxt - Bölümün bitmə vaxtı - Vaxtlar düzgündür? - "Bölüm + Bölüm uğurla göndərildi + + SponsorBlock müvəqqəti əlçatmazdır (API vaxtı bitdi) + SponsorBlock müvəqqəti olaraq əlçatan deyil (status %d) + SponsorBlock müvəqqəti olaraq əlçatan deyil + Bölüm üçün səsvermə alınmır (API vaxtı bitdi) + Bölüm üçün səsvermə alınmır (status: %1$d %2$s) + Bölüm üçün səsvermə alınmır: %s + Müsbət səs + Mənfi səs + Kateqoriyanı dəyişdir + Səsvermə üçün bölüm yoxdur + + %1$s - %2$s + Bölüm kateqoriyasını seçin + Seçimlərdə kateqoriya qeyri-aktivdir. Göndərmək üçün kateqoriyanı aktiv et. + Yeni SponsorBlock bölümü + %s, yeni bölümün başlanğıcı və ya sonu kimi təyin edilsin? + Başlanğıc + Bitmə + İndi + Bölüm başladığı vaxt + Bölümün bitmə vaxtı + Vaxtlar düzgündür? + "Bölüm %1$s ilə @@ -1278,46 +1277,46 @@ ilə (%3$s) Təqdim etməyə hazırdır?" - Başlanğıc sondan əvvəl olmalıdır - Əvvəlcə vaxt cizgisində iki yeri doldur - Bölümü izləyin, düzgün ötürüldüyünə əmin olun - Bölüm vaxtına əl ilə düzəliş et - Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz? - Yanlış vaxt verilmişdir - Statistikalar - - Statistikalar müvəqqəti mövcud deyil (API işləmir) - Yüklənir... - SponsorBlock qapadıldı - İstifadəçi adınız: <b>%s</b> - İstifadəçi adınızı dəyişdirmək üçün bura toxunun - İstifadəçi adı dəyişdirilə bilmir: Status: %1$d %2$s - İstifadəçi adı uğurla dəyişdirildi - Nüfuzunuz: <b>%.2f</b> - <b>%s</b> bölüm yaratdınız - Bölümlərinizə baxmaq üçün bura toxunun - SponsorBlock liderlik lövhəsi - İnsanları <b>%s</b> bölümdən azad etdiniz - Qlobal statistikaları və başlıca töhfəçiləri görmək üçün bura toxunun - Bu, həyatlarının <b>%s</b> qədəridir. <br>Liderlik lövhəsinə baxmaq üçün toxunun - <b>%s</b> bölümü ötürdünüz - Bu, <b>%s</b> deməkdir - Ötürülən bölüm hesablayıcı sıfırlansın? - %1$s saat %2$s dəqiqə - %1$s dəqiqə %2$s saniyə - %s saniyə - Qeyri-şəffaflıq: - Rəng: - Haqqında - Məlumat SponsorBlock API tərəfindən təqdim edilir. Daha ətraflı öyrənmək və digər platformalar üzrə yükləmələrə baxmaq üçün bura toxunun - - - Tərtibat forma göstəricisi - İlkin - Telefon - Planşet - Avtomobil - "Dəyişikliklər ehtiva edir: + Başlanğıc sondan əvvəl olmalıdır + Əvvəlcə vaxt cizgisində iki yeri doldur + Bölümü izləyin, düzgün ötürüldüyünə əmin olun + Bölüm vaxtına əl ilə düzəliş et + Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz? + Yanlış vaxt verilmişdir + Statistikalar + + Statistikalar müvəqqəti mövcud deyil (API işləmir) + Yüklənir... + SponsorBlock qapadıldı + İstifadəçi adınız: <b>%s</b> + İstifadəçi adınızı dəyişdirmək üçün bura toxunun + İstifadəçi adı dəyişdirilə bilmir: Status: %1$d %2$s + İstifadəçi adı uğurla dəyişdirildi + Nüfuzunuz: <b>%.2f</b> + <b>%s</b> bölüm yaratdınız + Bölümlərinizə baxmaq üçün bura toxunun + SponsorBlock liderlik lövhəsi + İnsanları <b>%s</b> bölümdən azad etdiniz + Qlobal statistikaları və başlıca töhfəçiləri görmək üçün bura toxunun + Bu, həyatlarının <b>%s</b> qədəridir. <br>Liderlik lövhəsinə baxmaq üçün toxunun + <b>%s</b> bölümü ötürdünüz + Bu, <b>%s</b> deməkdir + Ötürülən bölüm hesablayıcı sıfırlansın? + %1$s saat %2$s dəqiqə + %1$s dəqiqə %2$s saniyə + %s saniyə + Qeyri-şəffaflıq: + Rəng: + Haqqında + Məlumat SponsorBlock API tərəfindən təqdim edilir. Daha ətraflı öyrənmək və digər platformalar üzrə yükləmələrə baxmaq üçün bura toxunun + + + Tərtibat forma göstəricisi + İlkin + Telefon + Planşet + Avtomobil + "Dəyişikliklər ehtiva edir: Planşet tərtibatı • İcma elanları gizlədilib @@ -1325,314 +1324,312 @@ Planşet tərtibatı Avtomobil tərtibatı • Shorts müntəzəm oynadıcıda açılır • Axın mövzular və kanallardan ibarətdir" - - - Tətbiq versiyasını saxtalaşdır - Versiya saxtalaşdırıldı - Versiya saxtalaşdırılmadı - "Tətbiq versiyası köhnə YouTube versiyasına saxtalaşdırılacaq. + + + Tətbiq versiyasını saxtalaşdır + Versiya saxtalaşdırıldı + Versiya saxtalaşdırılmadı + "Tətbiq versiyası köhnə YouTube versiyasına saxtalaşdırılacaq. Bu tətbiqin görünüşün və xüsusiyyətlərin dəyişdirəcək, lakin bilinməyən yan təsirlər ola bilər. Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların silmək tövsiyə olunur." - Saxta tətbiq versiyası hədəfi - 20.13.41 - Yığılmayan video fəaliyyət cizgisin bərpa et - 20.05.46 - Transkript xüsusiyyətin bərpa et - 19.35.36 - Köhnə Shorts oynadıcı işarələrin bərpa et - 19.01.34 - Köhnə fəaliyyət simvolların bərpa et - - - Başlatma səhifəsini dəyişdir - İlkin - Bütün abunəliklər - Kanallara nəzər yetir - Kurslar / Öyrənmə - Kəşf et - Dəb və Gözəllik - Oyun - Tarixçə - Kitabxana - Bəyənilən videolar - Canlı - Filmlər - Musiqi - Xəbərlər - Bildirişlər - Pleylistlər - Axtarış - Mağaza - İdman - Abunəliklər - Trendlər - Faktiki Həyat - Sonra izlə - Klipləriniz - Başlatma səhifəsini həmişə dəyişdir - "Başlatma səhifəsi həmişə dəyişdirilir + Saxta tətbiq versiyası hədəfi + 20.13.41 - Yığılmayan video fəaliyyət cizgisin bərpa et + 20.05.46 - Transkript xüsusiyyətin bərpa et + 19.35.36 - Köhnə Shorts oynadıcı işarələrin bərpa et + 19.01.34 - Köhnə fəaliyyət simvolların bərpa et + + + Başlatma səhifəsini dəyişdir + İlkin + Bütün abunəliklər + Kanallara nəzər yetir + Kurslar / Öyrənmə + Kəşf et + Dəb və Gözəllik + Oyun + Tarixçə + Kitabxana + Bəyənilən videolar + Canlı + Filmlər + Musiqi + Xəbərlər + Bildirişlər + Pleylistlər + Axtarış + Mağaza + İdman + Abunəliklər + Trendlər + Faktiki Həyat + Sonra izlə + Klipləriniz + Başlatma səhifəsini həmişə dəyişdir + "Başlatma səhifəsi həmişə dəyişdirilir Məhdudiyyət: Alətlər cizgisindəki geri düyməsin istifadə işləməyə bilər" - Başlatma səhifəsi yalnız tətbiq işə salındıqda dəyişdirilir - - - Shorts oynadıcı başladıcını qapat - Tətbiq açılanda Shorts oynadıcı davam etməyəcək - Tətbiq açılanda Shorts oynadıcı davam edəcək - - - Shorts-u bununla aç - Shorts oynadıcı - Müntəzəm oynadıcı - Müntəzəm oynadıcı tam ekran - - - Shorts-ları avto-oynatma - Shorts-lar avto-oynadılacaq - Shorts-lar təkrarlanacaq - Shorts-ları arxa planda avto-oynat - Shorts-lar arxa planda avto-oynadılacaq - Shorts-lar arxa planda təkrarlanacaq - - - Kiçik oynadıcı - Tətbiqdaxili kiçilən oynadıcı üslubunu dəyişdir - Kiçik oynadıcı növü - Qeyri-aktivdir - İlkin - Ən kiçik - Planşet - Müasir 1 - Müasir 2 - Müasir 3 - Müasir 4 - Dəyirmi küncləri qapat - Künclər kvadratdır - Künclər dairəvidir - Ölçüsünü dəyişmək üçün cüt toxunmanı və çimdikləməni aktiv et - "Ölçüsün dəyişmək üçün cüt kliklə və çimdiklə + Başlatma səhifəsi yalnız tətbiq işə salındıqda dəyişdirilir + + + Shorts oynadıcı başladıcını qapat + Tətbiq açılanda Shorts oynadıcı davam etməyəcək + Tətbiq açılanda Shorts oynadıcı davam edəcək + + + Shorts-u bununla aç + Shorts oynadıcı + Müntəzəm oynadıcı + Müntəzəm oynadıcı tam ekran + + + Shorts-ları avto-oynatma + Shorts-lar avto-oynadılacaq + Shorts-lar təkrarlanacaq + Shorts-ları arxa planda avto-oynat + Shorts-lar arxa planda avto-oynadılacaq + Shorts-lar arxa planda təkrarlanacaq + + + Kiçik oynadıcı + Tətbiqdaxili kiçilən oynadıcı üslubunu dəyişdir + Kiçik oynadıcı növü + Qeyri-aktivdir + İlkin + Ən kiçik + Planşet + Müasir 1 + Müasir 2 + Müasir 3 + Müasir 4 + Dəyirmi küncləri qapat + Künclər kvadratdır + Künclər dairəvidir + Ölçüsünü dəyişmək üçün cüt toxunmanı və çimdikləməni aktiv et + "Ölçüsün dəyişmək üçün cüt kliklə və çimdiklə • Kiçik oynadıcı ölçüsün artırmaq üçün cüt toxun • Orijinal ölçünü bərpa etmək üçün təkrar cüt toxun" - Ölçüsünü dəyişdirmək üçün cüt toxunma fəaliyyəti və çimdikləmə yoxdur - Sürüklə və burax-ı qapat - \"Sürüklə və burax\" aktiv deyil - "Sürüklə və burax aktivdir + Ölçüsünü dəyişdirmək üçün cüt toxunma fəaliyyəti və çimdikləmə yoxdur + Sürüklə və burax-ı qapat + \"Sürüklə və burax\" aktiv deyil + "Sürüklə və burax aktivdir Kiçik oynadıcı ekranın istənilən küncünə sürüklənə bilər" - Üfüqi sürükləmə jestini qapat - Üfüqi sürükləmə jesti qapatıldı - "Üfüqi sürükləmə jesti aktivdir + Üfüqi sürükləmə jestini qapat + Üfüqi sürükləmə jesti qapatıldı + "Üfüqi sürükləmə jesti aktivdir Kiçik oynadıcı ekrandan sola və ya sağa sürüklənə bilər" - Örtük düymələrini gizlət - Örtük düymələri gizlidir - Örtük düymələri görünür - Alt mətnləri gizlət - Alt mətnlər gizlədilir - Alt mətnlər göstərilir - İrəli və geri ötür düymələrini gizlət - İrəli və geri ötürücülər gizlidir - İrəli və geri ötürücülər göstərilir - İlkin ölçü - Piksel olaraq ekranda ilkin ölçü - Piksel ölçüsü, %1$s - %2$s arası olmalıdır - Örtük qeyri-şəffaflığı - 0-100 arası qeyri-şəffaflıq dəyəri, 0 şəffafdır - Kiçik Oynadıcı örtük qeyri-şəffaflığı 0-100 arası olmalıdır - - - Dəyişkən yükləmə ekranını aktivləşdir - Yükləmə ekranı, dəyişkən arxa plana malik olacaq - Yükləmə ekranı, vahid arxa plana malik olacaq - Sıçrama ekran üslubu - Rəng - Qara və ağ - Fərdi irəliləmə cizgisi rəngini aktivləşdir - Fərdi irəliləmə cizgisi rəngi göstərilir - Orijinal irəliləmə cizgisi rəngi göstərilir - Fərdi irəliləmə cizgisi rəngi - İrəliləmə cizgisi rəngi - Fərdi irəliləyiş cizgisi vurğu rəngi - İrəliləyiş cizgisi vurğu rəngi - Etibarsız irəliləmə cizgisi rəng dəyəri - - - - - Başlıq simvolu - İlkin - Müntəzəm - - Ən kiçik ReVanced - Fərdi - - - Təsvir bölgə məhdudiyyətlərini ötür - Yt4.ggpht.com təsvir serveri istifadə edilir - "Orijinal şəkil təminatçısın işlətmə + Örtük düymələrini gizlət + Örtük düymələri gizlidir + Örtük düymələri görünür + Alt mətnləri gizlət + Alt mətnlər gizlədilir + Alt mətnlər göstərilir + İrəli və geri ötür düymələrini gizlət + İrəli və geri ötürücülər gizlidir + İrəli və geri ötürücülər göstərilir + İlkin ölçü + Piksel olaraq ekranda ilkin ölçü + Piksel ölçüsü, %1$s - %2$s arası olmalıdır + Örtük qeyri-şəffaflığı + 0-100 arası qeyri-şəffaflıq dəyəri, 0 şəffafdır + Kiçik Oynadıcı örtük qeyri-şəffaflığı 0-100 arası olmalıdır + + + Dəyişkən yükləmə ekranını aktivləşdir + Yükləmə ekranı, dəyişkən arxa plana malik olacaq + Yükləmə ekranı, vahid arxa plana malik olacaq + Sıçrama ekran üslubu + Rəng + Qara və ağ + Fərdi irəliləmə cizgisi rəngini aktivləşdir + Fərdi irəliləmə cizgisi rəngi göstərilir + Orijinal irəliləmə cizgisi rəngi göstərilir + Fərdi irəliləmə cizgisi rəngi + İrəliləmə cizgisi rəngi + Fərdi irəliləyiş cizgisi vurğu rəngi + İrəliləyiş cizgisi vurğu rəngi + Etibarsız irəliləmə cizgisi rəng dəyəri + + + + Başlıq simvolu + İlkin + Müntəzəm + + Ən kiçik ReVanced + Fərdi + + + Təsvir bölgə məhdudiyyətlərini ötür + Yt4.ggpht.com təsvir serveri istifadə edilir + "Orijinal şəkil təminatçısın işlətmə Bunu aktivləşdirmə, bəzi regionlarda əngəllənib silinən şəkilləri düzəldə bilər" - - - - Ev paneli - - Abunəliklər bölməsi - - \"Siz\" paneli - Oynadıcı pleylistləri & tövsiyələri - Axtarış nəticələri - Orijinal miniatürlər - DeArrow & Orijinal miniatürlər - DeArrow & Kadr çəkilişlər - Kadr çəkilişləri - "DeArrow YouTube videoları üçün çox mənbəli miniatürlər təqdim edir. Bu miniatürlər YouTube tərəfindən təqdim edilənlərdən dəfələrlə daha uyğundur. + + + + Ev paneli + + Abunəliklər bölməsi + + \"Siz\" paneli + Oynadıcı pleylistləri & tövsiyələri + Axtarış nəticələri + Orijinal miniatürlər + DeArrow & Orijinal miniatürlər + DeArrow & Kadr çəkilişlər + Kadr çəkilişləri + "DeArrow YouTube videoları üçün çox mənbəli miniatürlər təqdim edir. Bu miniatürlər YouTube tərəfindən təqdim edilənlərdən dəfələrlə daha uyğundur. Aktivləşdirilərsə, video URL-lər API alıcısına göndəriləcək və başqa məlumat göndərilməyəcək. Videonun DeArrow miniatürləri yoxdursa, orijinal və ya hələ də çəkilişlər göstərilir. DeArrow haqqında ətraflı öyrənmək üçün bura toxun" - API əlçatan deyilsə ani bildiriş göstər - DeArrow əlçatan deyilsə bildiriş göstərilir - DeArrow əlçatan deyilsə bildiriş göstərilmir - DeArrow API\'nin sonuncu əlaqəsi - DeArrow miniatür keşinin son əlaqəsinin URL-si - Statik video kadrları - Durğun kadrlar, hər videonun əvvəlindən/ortasından/sonundan götürülür. Bu təsvirlər YouTube-da qurulu gəlir və xarici API istifadə edilmir - Sürətli kadr çəkilişləri istifadə et - Orta keyfiyyətli durğun kadrlar istifadə edilir. Miniatürlər, daha sürətli yüklənəcək, ancaq canlı yayımlar, buraxılmayan və ya çox köhnə videolar boş miniatürləri göstərə bilər - Yüksək keyfiyyətli durğun kadrlar istifadə edilir - Durğun kadrın götürüləcəyi video müddəti - Videonun başlanğıcı - Videonun ortası - Videonun sonu - - DeArrow müvəqqəti mövcud deyil (status kodu: %s) - DeArrow müvəqqəti olaraq mövcud deyil - - - ReVanced elanlarını göstər - Elanlar başlanğıcda göstərilir - Elanlar başlanğıcda göstərilmir - Elanları açılışda göstər - Elan provayderinə bağlanmaq olmadı - Ləğv et - - - Video təkrarlamanı aktivləşdir - Video təkrarlanacaq - Video təkrarlanmayacaq - - - Video təkrarlama düyməsini göstər - Düymə görünür - Düymə görünmür - Video təkrarlama açıqdır - Video təkrarlama qapalıdır - - - - - Cihaz ölçülərini saxtalaşdır - "Cihaz ölçüləri saxtalaşdırıldı + API əlçatan deyilsə ani bildiriş göstər + DeArrow əlçatan deyilsə bildiriş göstərilir + DeArrow əlçatan deyilsə bildiriş göstərilmir + DeArrow API\'nin sonuncu əlaqəsi + DeArrow miniatür keşinin son əlaqəsinin URL-si + Statik video kadrları + Durğun kadrlar, hər videonun əvvəlindən/ortasından/sonundan götürülür. Bu təsvirlər YouTube-da qurulu gəlir və xarici API istifadə edilmir + Sürətli kadr çəkilişləri istifadə et + Orta keyfiyyətli durğun kadrlar istifadə edilir. Miniatürlər, daha sürətli yüklənəcək, ancaq canlı yayımlar, buraxılmayan və ya çox köhnə videolar boş miniatürləri göstərə bilər + Yüksək keyfiyyətli durğun kadrlar istifadə edilir + Durğun kadrın götürüləcəyi video müddəti + Videonun başlanğıcı + Videonun ortası + Videonun sonu + + DeArrow müvəqqəti mövcud deyil (status kodu: %s) + DeArrow müvəqqəti olaraq mövcud deyil + + + ReVanced elanlarını göstər + Elanlar başlanğıcda göstərilir + Elanlar başlanğıcda göstərilmir + Elanları açılışda göstər + Elan provayderinə bağlanmaq olmadı + Ləğv et + + + Video təkrarlamanı aktivləşdir + Video təkrarlanacaq + Video təkrarlanmayacaq + + + Video təkrarlama düyməsini göstər + Düymə görünür + Düymə görünmür + Video təkrarlama açıqdır + Video təkrarlama qapalıdır + + + + Cihaz ölçülərini saxtalaşdır + "Cihaz ölçüləri saxtalaşdırıldı Yüksək video keyfiyyətlər görünə bilər, ancaq video oynadılmasında qırılma, daha pis batareya ömrü və bilinməyən yan təsirləri sezə bilərsiniz" - "Cihaz ölçüləri saxtalaşdırılmayıb + "Cihaz ölçüləri saxtalaşdırılmayıb Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər" - Bunu aktivləşdirmə, video oynatma donmalarına, daha pis batareya istismarına və bilinməyən yan təsirlərə səbəb ola bilər. - - - Əks-əlaqə reaksiyası - Əks-əlaqə reaksiyasını dəyişdir - Fəsillər reaksiyasın qapat - Fəsillər reaksiyası qapalıdır - Fəsillər reaksiyası aktivdir - Dəqiq axtarış reaksiyasın qapat - Dəqiq axtarış reaksiyası qapalıdır - Dəqiq axtarış reaksiyası aktivdir - Axtarış geriyə reaksiyasın qapat - Axtarış geri reaksiyası qapalıdır - Axtarış geri reaksiyası aktivdir - Yaxınlaşdırma reaksiyasın qapat - Yaxınlaşdırma reaksiyası qapalıdır - Yaxınlaşdırma reaksiyası aktivdir - - - Bu yaxınlarda hesabınıza giriş məlumatlarınızı dəyişmisinizsə, MicroG-ni silin və təkrar quraşdırın. - - - URL yönləndirmələrini ötür - URL yönləndirmələri ötürülür - URL yönləndirmələri ötürülmür - - - Bağlantıları brauzerdə aç - Xarici brauzerdə bağlantıların açılması - Tətbiqdaxili brauzerdə bağlantıların açılması - - - - Avtomatik - Video keyfiyyəti dəyişikliklərini xatırla - Keyfiyyət dəyişiklikləri bütün videolara tətbiq edilir - Keyfiyyət dəyişiklikləri yalnız cari videoya tətbiq edilir - Video keyfiyyət dəyişikliklərində ani bildiriş göstər - İlkin video keyfiyyəti dəyişdirildikdə bildiriş göstərilir - İlkin video keyfiyyəti dəyişdirildikdə bildiriş göstərilmir - Wi-Fi şəbəkəsində ilkin video keyfiyyəti - Mobil şəbəkədə ilkin video keyfiyyəti - Shorts keyfiyyət dəyişikliklərini xatırla - Keyfiyyət dəyişiklikləri bütün Shorts-a tətbiq edilir - Keyfiyyət dəyişiklikləri yalnız cari Short-a tətbiq edilir - Wi-Fi şəbəkəsində ilkin Shorts keyfiyyəti - Mobil şəbəkədə ilkin Shorts keyfiyyəti - mobil - wi-fi - İlkin %1$s keyfiyyəti %2$s kimi dəyişdi - Shorts-un %1$s keyfiyyəti %2$s olaraq dəyişdirildi - - - Sürət dialoq düyməsini göstər - Sürət dialoqu düyməsi görünür. Oxutma sürətini ilkin vəziyyətinə qaytarmaq üçün toxunub saxlayın - Sürət dialoqu düyməsi görünmür - - - Video keyfiyyəti düyməsini göstər - Video keyfiyyəti düyməsi görünür. Keyfiyyəti ilkin vəziyyətinə qaytarmaq üçün toxunub saxlayın - Video keyfiyyəti düyməsi görünmür - - - Fərdi oynatma sürəti siyahısı - Fərdi sürət siyahısı göstərilir - Fərdi sürət siyahısı göstərilmir - Köhnə oynatma sürəti menyusunu bərpa et - Köhnə sürət menyusu göstərilir - Müasir sürət menyusu göstərilir - Fərdi oynatma sürəti - Fərdi oynatma sürətlərini əlavə et və ya dəyiş - Fərdi sürətlər %s dəyərindən az olmalıdır - Fərdi oynatma sürətləri etibarsızdır - Avtomatik - Xüsusi toxunma və saxlanılma sürəti - 0-8 arası oynatma sürəti - - - Oynatma sürəti dəyişikliklərin xatırla - Oynatma sürəti dəyişiklikləri bütün videolara aiddir - Oynatma sürəti dəyişiklikləri yalnız cari videoya aiddir - Oynatma sürəti dəyişikliklərində ani bildiriş göstər - İlkin oynatma sürəti dəyişdirildikdə bildiriş göstərilir - İlkin oynatma sürəti dəyişdirildikdə bildiriş göstərilmir - İlkin oynatma sürəti - İlkin sürət %s kimi dəyişdirildi - - - HDR Videonu Qapat - HDR video qapalıdır - HDR video aktivdir - AVC (H.264) -i Məcbur et - Video kodlayıcı AVC (H.264) - ə məcbur edilir - Video kodlayıcı birbaşa müəyyən edilir - "Faydalar: + Bunu aktivləşdirmə, video oynatma donmalarına, daha pis batareya istismarına və bilinməyən yan təsirlərə səbəb ola bilər. + + + Əks-əlaqə reaksiyası + Əks-əlaqə reaksiyasını dəyişdir + Fəsillər reaksiyasın qapat + Fəsillər reaksiyası qapalıdır + Fəsillər reaksiyası aktivdir + Dəqiq axtarış reaksiyasın qapat + Dəqiq axtarış reaksiyası qapalıdır + Dəqiq axtarış reaksiyası aktivdir + Axtarış geriyə reaksiyasın qapat + Axtarış geri reaksiyası qapalıdır + Axtarış geri reaksiyası aktivdir + Yaxınlaşdırma reaksiyasın qapat + Yaxınlaşdırma reaksiyası qapalıdır + Yaxınlaşdırma reaksiyası aktivdir + + + Bu yaxınlarda hesabınıza giriş məlumatlarınızı dəyişmisinizsə, MicroG-ni silin və təkrar quraşdırın. + + + URL yönləndirmələrini ötür + URL yönləndirmələri ötürülür + URL yönləndirmələri ötürülmür + + + Bağlantıları brauzerdə aç + Xarici brauzerdə bağlantıların açılması + Tətbiqdaxili brauzerdə bağlantıların açılması + + + + Avtomatik + Video keyfiyyəti dəyişikliklərini xatırla + Keyfiyyət dəyişiklikləri bütün videolara tətbiq edilir + Keyfiyyət dəyişiklikləri yalnız cari videoya tətbiq edilir + Video keyfiyyət dəyişikliklərində ani bildiriş göstər + İlkin video keyfiyyəti dəyişdirildikdə bildiriş göstərilir + İlkin video keyfiyyəti dəyişdirildikdə bildiriş göstərilmir + Wi-Fi şəbəkəsində ilkin video keyfiyyəti + Mobil şəbəkədə ilkin video keyfiyyəti + Shorts keyfiyyət dəyişikliklərini xatırla + Keyfiyyət dəyişiklikləri bütün Shorts-a tətbiq edilir + Keyfiyyət dəyişiklikləri yalnız cari Short-a tətbiq edilir + Wi-Fi şəbəkəsində ilkin Shorts keyfiyyəti + Mobil şəbəkədə ilkin Shorts keyfiyyəti + mobil + wi-fi + İlkin %1$s keyfiyyəti %2$s kimi dəyişdi + Shorts-un %1$s keyfiyyəti %2$s olaraq dəyişdirildi + + + Sürət dialoq düyməsini göstər + Sürət dialoqu düyməsi görünür. Oxutma sürətini ilkin vəziyyətinə qaytarmaq üçün toxunub saxlayın + Sürət dialoqu düyməsi görünmür + + + Video keyfiyyəti düyməsini göstər + Video keyfiyyəti düyməsi görünür. Keyfiyyəti ilkin vəziyyətinə qaytarmaq üçün toxunub saxlayın + Video keyfiyyəti düyməsi görünmür + + + Fərdi oynatma sürəti siyahısı + Fərdi sürət siyahısı göstərilir + Fərdi sürət siyahısı göstərilmir + Köhnə oynatma sürəti menyusunu bərpa et + Köhnə sürət menyusu göstərilir + Müasir sürət menyusu göstərilir + Fərdi oynatma sürəti + Fərdi oynatma sürətlərini əlavə et və ya dəyiş + Fərdi sürətlər %s dəyərindən az olmalıdır + Fərdi oynatma sürətləri etibarsızdır + Avtomatik + Xüsusi toxunma və saxlanılma sürəti + 0-8 arası oynatma sürəti + + + Oynatma sürəti dəyişikliklərin xatırla + Oynatma sürəti dəyişiklikləri bütün videolara aiddir + Oynatma sürəti dəyişiklikləri yalnız cari videoya aiddir + Oynatma sürəti dəyişikliklərində ani bildiriş göstər + İlkin oynatma sürəti dəyişdirildikdə bildiriş göstərilir + İlkin oynatma sürəti dəyişdirildikdə bildiriş göstərilmir + İlkin oynatma sürəti + İlkin sürət %s kimi dəyişdirildi + + + HDR Videonu Qapat + HDR video qapalıdır + HDR video aktivdir + AVC (H.264) -i Məcbur et + Video kodlayıcı AVC (H.264) - ə məcbur edilir + Video kodlayıcı birbaşa müəyyən edilir + "Faydalar: • Batareya ömrünü uzada bilər • Köhnə cihazlarda çatışmayan video ayırdetmələrin bərpa edə bilər @@ -1641,178 +1638,177 @@ Məhdudiyyətlər: • Video oynatma VP9 və ya AV1-dən daha çox internet məlumatı işlədəcək • HDR videoları AVC istifadə etməyəcək • Bəzi cihazlar AVC-ni zorlaya bilməz" - - - Qabaqcıl video keyfiyyət siyahısın göstər - Qabaqcıl video keyfiyyət siyahısı göstərilir - Qabaqcıl video keyfiyyət siyahısı göstərilmir - - - Axtarmaq üçün sürüşdürməni aktiv et - Axtarmaq üçün sürüşdürmə aktivdir - Axtarmaq üçün sürüşdürmə aktiv deyil - - - Android VR AV1-ə icazə ver - "Video kodlayıcı AVC (H.264), VP9 və ya AV1-dir + + + Qabaqcıl video keyfiyyət siyahısın göstər + Qabaqcıl video keyfiyyət siyahısı göstərilir + Qabaqcıl video keyfiyyət siyahısı göstərilmir + + + Axtarmaq üçün sürüşdürməni aktiv et + Axtarmaq üçün sürüşdürmə aktivdir + Axtarmaq üçün sürüşdürmə aktiv deyil + + + Android VR AV1-ə icazə ver + "Video kodlayıcı AVC (H.264), VP9 və ya AV1-dir Oynatma ilişə bilər və ya kadrlar buraxıla bilər" - Video kodlayıcı AVC (H.264) və ya VP9-dur - "Bu tənzimləməni aktivləşdirmə proqram təminatlı AV1 kodlayıcı istifadə edə bilər. + Video kodlayıcı AVC (H.264) və ya VP9-dur + "Bu tənzimləməni aktivləşdirmə proqram təminatlı AV1 kodlayıcı istifadə edə bilər. Video oynatma AV1 ilə ilişə bilər və ya kadrlar buraxıla bilər." - Saxtakarlıq yan təsirləri - • Təcrübi qəbuledici və hər vaxt işləməyi dayandıra bilər - • Video 01:00-da dayana bilər və ya bəzi bölgələrdə mövcud olmaya bilər - • Səs treki menyusu çatışmır - • AV1 video kodlayıcı yoxdur - • Sabit səs yoxdur - • Giriş edilməyəndə və ya gizli rejimdə uşaq videoları oynadıla bilməz - - • \"Orijinal səsi zorla\" əlçatmazdır - İstək üçün Statistikada göstər - Qəbuledici növü İstək üçün statistikada göstərilir - Qəbuledici nerd üçün Statistikada gizlidir - - - - - - - Haqqında - Reklamlar - Ümumi - Oynadıcı - Çoxvariantlı - - - Video reklamlarını gizlət - Video reklamları gizlidir - Video reklamları görünür - - - Kəsintisiz təkrarlamanı aktivləşdir - Kəsintisiz təkrarlama aktivdir - Kəsintisiz təkrarlama qapalıdır - - - Yayım düyməsini gizlət - Yayım düyməsi gizlidir - Yayım düyməsi göstərilir - Tarixçə düyməsini gizlət - Tarixçə düyməsi gizlidir - Tarixçə düyməsi görünür - Bildiriş düyməsini gizlət - Bildiriş düyməsi gizlidir - Bildiriş düyməsi görünür - Axtarış düyməsini gizlət - Axtarış düyməsi gizlidir - Axtarış düyməsi görünür - - - Kateqoriya cizgisin gizlət - Kateqoriya cizgisi gizlidir - Kateqoriya cizgisi görünür - - - Kiçik oynadıcı rəngini dəyişdir - Kiçik oynadıcı rəngi tam ekran oynadıcıya bərabərdir - Kiçik oynadıcı ilkin rəngi istifadə edir - - - Fəaliyyət cizgisi - Fəaliyyət cizgisi düymələrini gizlət və ya dəyiş - - Ev-i Gizlət - Ev düyməsi gizlidir - Ev düyməsi görünür - - Nümunələri Gizlət - Nümunələr düyməsi gizlidir - Nümunələr düyməsi görünür - - Kəşf edin-i gizlət - Kəşf et düyməsi gizlidir - Kəşf et düyməsi görünür - - Kitabxananı gizlət - Kitabxana düyməsi gizlidir - Kitabxana düyməsi görünür - - Təkmilləşdirməni Gizlət - Təkmilləşdirmə düyməsi gizlidir - Təkmilləşdirmə düyməsi görünür - Fəaliyyət cizgisin gizlət - Fəaliyyət cizgisi gizlidir - Fəaliyyət cizgisi görünür - Fəaliyyət düyməsi etiketlərini gizlət - Etiketlər gizlidir - Etiketlər görünür - - - \'Musiqi Premiumu Əldə et\' etiketini gizlət - Etiket gizlidir - Etiket görünür - - - Təkmilləşdirmə düyməsini gizlət - Düymə gizlidir - Düymə görünür - - - - - Səs reklamların əngəllə - Səs reklamları bloklanıb - Səs reklamları bloklanmayıb - - - %s əlçatmazdır, reklamlar göstərilə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın. - %s xəta qaytardı, reklamlar görünə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın. - Yerləşdirilən video reklamlarını əngəllə - Qeyri-aktiv edildi - PurpleAdBlock proksi - - - Video reklamları əngəllə - Video reklamlar bloklanıb - Video reklamlar bloklanmır - - - Məlumat silindi - Silinən mesajları göstər - Silinən mesajlar göstərilməsin - Silinmiş mesajları boz panel arxasında gizlət - Silinən mesajları cızılmış mətn kimi göstər - - - Kanal Xallarını avtomatik təsdiqlə - Kanal Xalları avtomatik olaraq təsdiqlənir - Kanal Xalları avtomatik olaraq təsdiqlənmir - - - - Twitch sazlama rejimini aktivləşdir - Twitch sazlama rejimi aktivdir (tövsiyə edilmir) - Twitch sazlama rejimi qeyri-aktiv edilib - - - ReVanced Tənzimləmələri - Haqqında - ReVanced Haqqında - Reklam Əngəlləmə - Reklam Əngəlləmə tənzimləmələri - Söhbət - Söhbət tənzimləmələri - Çoxvariantlı - Müxtəlif tənzimləmələr - Ümumi tənzimləmələr - Digər tənzimləmələr - Qəbuledici dəstəkli reklamlar - Server dəstəkli dəqiq yayım reklamları - Sazlama jurnalı - Sazlama jurnalları aktivləşdirilib - Sazlama jurnalları qeyri-aktiv edilib - - + Saxtakarlıq yan təsirləri + • Təcrübi qəbuledici və hər vaxt işləməyi dayandıra bilər + • Video 01:00-da dayana bilər və ya bəzi bölgələrdə mövcud olmaya bilər + • Səs treki menyusu çatışmır + • AV1 video kodlayıcı yoxdur + • Sabit səs yoxdur + • Giriş edilməyəndə və ya gizli rejimdə uşaq videoları oynadıla bilməz + + • \"Orijinal səsi zorla\" əlçatmazdır + İstək üçün Statistikada göstər + Qəbuledici növü İstək üçün statistikada göstərilir + Qəbuledici nerd üçün Statistikada gizlidir + + + + + + Haqqında + Reklamlar + Ümumi + Oynadıcı + Çoxvariantlı + + + Video reklamlarını gizlət + Video reklamları gizlidir + Video reklamları görünür + + + Kəsintisiz təkrarlamanı aktivləşdir + Kəsintisiz təkrarlama aktivdir + Kəsintisiz təkrarlama qapalıdır + + + Yayım düyməsini gizlət + Yayım düyməsi gizlidir + Yayım düyməsi göstərilir + Tarixçə düyməsini gizlət + Tarixçə düyməsi gizlidir + Tarixçə düyməsi görünür + Bildiriş düyməsini gizlət + Bildiriş düyməsi gizlidir + Bildiriş düyməsi görünür + Axtarış düyməsini gizlət + Axtarış düyməsi gizlidir + Axtarış düyməsi görünür + + + Kateqoriya cizgisin gizlət + Kateqoriya cizgisi gizlidir + Kateqoriya cizgisi görünür + + + Kiçik oynadıcı rəngini dəyişdir + Kiçik oynadıcı rəngi tam ekran oynadıcıya bərabərdir + Kiçik oynadıcı ilkin rəngi istifadə edir + + + Fəaliyyət cizgisi + Fəaliyyət cizgisi düymələrini gizlət və ya dəyiş + + Ev-i Gizlət + Ev düyməsi gizlidir + Ev düyməsi görünür + + Nümunələri Gizlət + Nümunələr düyməsi gizlidir + Nümunələr düyməsi görünür + + Kəşf edin-i gizlət + Kəşf et düyməsi gizlidir + Kəşf et düyməsi görünür + + Kitabxananı gizlət + Kitabxana düyməsi gizlidir + Kitabxana düyməsi görünür + + Təkmilləşdirməni Gizlət + Təkmilləşdirmə düyməsi gizlidir + Təkmilləşdirmə düyməsi görünür + Fəaliyyət cizgisin gizlət + Fəaliyyət cizgisi gizlidir + Fəaliyyət cizgisi görünür + Fəaliyyət düyməsi etiketlərini gizlət + Etiketlər gizlidir + Etiketlər görünür + + + \'Musiqi Premiumu Əldə et\' etiketini gizlət + Etiket gizlidir + Etiket görünür + + + Təkmilləşdirmə düyməsini gizlət + Düymə gizlidir + Düymə görünür + + + + + Səs reklamların əngəllə + Səs reklamları bloklanıb + Səs reklamları bloklanmayıb + + + %s əlçatmazdır, reklamlar göstərilə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın. + %s xəta qaytardı, reklamlar görünə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın. + Yerləşdirilən video reklamlarını əngəllə + Qeyri-aktiv edildi + PurpleAdBlock proksi + + + Video reklamları əngəllə + Video reklamlar bloklanıb + Video reklamlar bloklanmır + + + Məlumat silindi + Silinən mesajları göstər + Silinən mesajlar göstərilməsin + Silinmiş mesajları boz panel arxasında gizlət + Silinən mesajları cızılmış mətn kimi göstər + + + Kanal Xallarını avtomatik təsdiqlə + Kanal Xalları avtomatik olaraq təsdiqlənir + Kanal Xalları avtomatik olaraq təsdiqlənmir + + + + Twitch sazlama rejimini aktivləşdir + Twitch sazlama rejimi aktivdir (tövsiyə edilmir) + Twitch sazlama rejimi qeyri-aktiv edilib + + + ReVanced Tənzimləmələri + Haqqında + ReVanced Haqqında + Reklam Əngəlləmə + Reklam Əngəlləmə tənzimləmələri + Söhbət + Söhbət tənzimləmələri + Çoxvariantlı + Müxtəlif tənzimləmələr + Ümumi tənzimləmələr + Digər tənzimləmələr + Qəbuledici dəstəkli reklamlar + Server dəstəkli dəqiq yayım reklamları + Sazlama jurnalı + Sazlama jurnalları aktivləşdirilib + Sazlama jurnalları qeyri-aktiv edilib + + diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 7854c0d78b..01e3acf65d 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -17,1263 +17,1262 @@ "First 'item' text Second \"item\" text" ---> - - - - Назва праграмы - - Карыстальніцкая - Значок праграмы - Арыгінал - - ReVanced мінімальны - ReVanced маштабаваны - - Карыстальніцкі - - - Праверкі не пройдзены - Адкрыць афіцыйны вэб-сайт - Ігнараваць - <h5>Гэта дадатак відавочна не з\'яўляецца патчам.</h5><br>Гэта дадатак можа працаваць няправільна, а таксама можа быць <b>небяспечным або нават небяспечным у выкарыстанні</b>.<br><br>Гэтыя праверкі азначаюць, што гэта дадатак было загаддзя перароблена або атрымана ад кагосьці іншага:<br><br><small>%1$s</small><br>Настойліва рэкамендуецца <b>выдаліць гэты дадатак і перарабіць яго самастойна</b>, каб пераканацца, што вы выкарыстоўваеце правераны і бяспечны дадатак.<p><br>Калі ігнараваць, гэта папярэджанне будзе паказана толькі два разы. - Адкарэктавана на іншай прыладзе - Не ўстаноўлена ReVanced Manager - Адкарэктавана больш чым 10 хвілін таму - Адкарэктавана %s дзён таму - Дата стварэння APK пашкоджана - - - Заўвага ReVanced - Ваша гісторыя прагляду не захоўваецца.<br><br>Гэта, хутчэй за ўсё, выклікана DNS-блакіроўшчыкам рэкламы або сеткавым праксі.<br><br>Каб выправіць гэта, дадайце <b>s.youtube.com</b> у белы спіс або адключыце ўсе DNS-блакіроўшчыкі і праксі. - Больш не паказваць - - - Налады - Вы ўпэўнены, што хочаце працягнуць? - Захаваць - Скінуць - Скінуць колер - Несапраўдны колер - Неабходны перазапуск - Перазапусціце праграму, каб змены ўступілі ў сілу. - Перазапуск - Імпарт - Копія - Налады ReVanced скінуты да стандартных - Імпартавана %d налад - Памылка імпарту: %s - Пошук налад - Нічога не знойдзена для \",%s\" - Паспрабуйце іншае ключавое слова - Апошнія пошукі - Выдаліць з гісторыі пошуку? - Ачысціць гісторыю пошуку - Вы ўпэўнены, што хочаце ачысціць усю гісторыю пошуку? - Парады па пошуку - "• Націсніце шлях, каб перайсці да яго +--> + + + Назва праграмы + + Карыстальніцкая + Значок праграмы + Арыгінал + + ReVanced мінімальны + ReVanced маштабаваны + + Карыстальніцкі + + + Праверкі не пройдзены + Адкрыць афіцыйны вэб-сайт + Ігнараваць + <h5>Гэта дадатак відавочна не з\'яўляецца патчам.</h5><br>Гэта дадатак можа працаваць няправільна, а таксама можа быць <b>небяспечным або нават небяспечным у выкарыстанні</b>.<br><br>Гэтыя праверкі азначаюць, што гэта дадатак было загаддзя перароблена або атрымана ад кагосьці іншага:<br><br><small>%1$s</small><br>Настойліва рэкамендуецца <b>выдаліць гэты дадатак і перарабіць яго самастойна</b>, каб пераканацца, што вы выкарыстоўваеце правераны і бяспечны дадатак.<p><br>Калі ігнараваць, гэта папярэджанне будзе паказана толькі два разы. + Адкарэктавана на іншай прыладзе + Не ўстаноўлена ReVanced Manager + Адкарэктавана больш чым 10 хвілін таму + Адкарэктавана %s дзён таму + Дата стварэння APK пашкоджана + + + Заўвага ReVanced + Ваша гісторыя прагляду не захоўваецца.<br><br>Гэта, хутчэй за ўсё, выклікана DNS-блакіроўшчыкам рэкламы або сеткавым праксі.<br><br>Каб выправіць гэта, дадайце <b>s.youtube.com</b> у белы спіс або адключыце ўсе DNS-блакіроўшчыкі і праксі. + Больш не паказваць + + + Налады + Вы ўпэўнены, што хочаце працягнуць? + Захаваць + Скінуць + Скінуць колер + Несапраўдны колер + Неабходны перазапуск + Перазапусціце праграму, каб змены ўступілі ў сілу. + Перазапуск + Імпарт + Копія + Налады ReVanced скінуты да стандартных + Імпартавана %d налад + Памылка імпарту: %s + Пошук налад + Нічога не знойдзена для \",%s\" + Паспрабуйце іншае ключавое слова + Апошнія пошукі + Выдаліць з гісторыі пошуку? + Ачысціць гісторыю пошуку + Вы ўпэўнены, што хочаце ачысціць усю гісторыю пошуку? + Парады па пошуку + "• Націсніце шлях, каб перайсці да яго • Доўга націсніце настройку, каб перайсці да яе • Націсніце Enter, каб захаваць пошукавы запыт у гісторыю • Пошук ігнаруе рэгістр і пунктуацыю • Бацькоўскія налады з'яўляюцца над адключанымі даччынымі наладамі" - Гісторыя пошуку пустая - Каб захаваць гісторыю пошуку, увядзіце пошукавы запыт і націсніце Enter - Паказваць гісторыю пошуку ў наладах - Паказваецца гісторыя пошуку ў наладах - Гісторыя пошуку налад не паказваецца - Паказваць значкі налад ReVanced - Значкі налад паказваюцца - Значкі налад не паказваюцца - Мова ReVanced - "Пераклады для некаторых моў могуць адсутнічаць або быць няпоўнымі. + Гісторыя пошуку пустая + Каб захаваць гісторыю пошуку, увядзіце пошукавы запыт і націсніце Enter + Паказваць гісторыю пошуку ў наладах + Паказваецца гісторыя пошуку ў наладах + Гісторыя пошуку налад не паказваецца + Паказваць значкі налад ReVanced + Значкі налад паказваюцца + Значкі налад не паказваюцца + Мова ReVanced + "Пераклады для некаторых моў могуць адсутнічаць або быць няпоўнымі. Каб перакласці новыя мовы або палепшыць існуючыя пераклады, наведайце translate.revanced.app" - Мова праграмы - Імпарт / Экспарт - Імпарт / Экспарт налад ReVanced - - Вы выкарыстоўваеце версію ReVanced Patches <i>%s</i> - Нататка - Гэтая версія з\"яўляецца папярэдняй версіяй, і вы можаце сутыкнуцца з непрадбачанымі праблемамі - Афіцыйныя спасылкі - + Вы выкарыстоўваеце версію ReVanced Patches <i>%s</i> + Нататка + Гэтая версія з\"яўляецца папярэдняй версіяй, і вы можаце сутыкнуцца з непрадбачанымі праблемамі + Афіцыйныя спасылкі + - - - Налады GmsCore - Налады для GmsCore - - MicroG GmsCore не ўсталяваны. Усталюйце яго. - Патрабуецца дзеянне - "MicroG GmsCore не мае дазволу на працу ў фонавым рэжыме. + + + Налады GmsCore + Налады для GmsCore + + MicroG GmsCore не ўсталяваны. Усталюйце яго. + Патрабуецца дзеянне + "MicroG GmsCore не мае дазволу на працу ў фонавым рэжыме. Выконвайце інструкцыі \"Не забівай маё прыкладанне\" для вашага тэлефона і прымяніце іх да вашай ўстаноўкі MicroG. Гэта неабходна для працы прыкладання." - Адкрыць сайт - "Неабходна адключыць аптымізацыю батарэі для MicroG GmsCore, каб пазбегнуць праблем. + Адкрыць сайт + "Неабходна адключыць аптымізацыю батарэі для MicroG GmsCore, каб пазбегнуць праблем. Адключэнне аптымізацыі батарэі для MicroG не паўплывае на выкарыстанне батарэі. Націсніце кнопку \"Працягнуць\" і дазвольце змяніць аптымізацыю." - Працягнуць - - - Падмена відэапатокаў - Падмена відэапатокаў кліента для прадухілення праблем з прайграваннем - Подделывать потоки видео - "Відэаструмені падроблены + Працягнуць + + + Падмена відэапатокаў + Падмена відэапатокаў кліента для прадухілення праблем з прайграваннем + Подделывать потоки видео + "Відэаструмені падроблены Калі вы карыстаецеся YouTube Premium, гэтая налада можа не спатрэбіцца" - "Відэапатокі не падменены + "Відэапатокі не падменены Прайграванне можа не працаваць" - Адключэнне гэтай налады можа выклікаць праблемы з прайграваннем. - Клиент по умолчанию - - - Вымушаная арыгінальная мова аўдыё - Выкарыстоўваць арыгінальную мову аўдыя - Выкарыстанне аўдыё па змаўчанні - - Каб выкарыстаць гэтую функцыю, змяніце \'Падмена відэаструменяў\' на любога кліента, акрамя Android Studio - - - Адладка - Уключыць або выключыць параметры адладкі - Запіс адладкі - Журналы адладкі ўключаны - Журналы адладкі адключаны - Сляды стэка журнала - Журналы адладкі ўключаюць трасіроўку стэка - Журналы адладкі не ўключаюць трасіроўку стэка - Паказаць тост пры памылцы ReVanced - Паказваць toast у выпадку памылкі - Не паказваць toast у выпадку памылкі - "Адключэнне паведамленняў пра памылкі схавае ўсе апавяшчэнні ReVanced пра памылкі. + Адключэнне гэтай налады можа выклікаць праблемы з прайграваннем. + Клиент по умолчанию + + + Вымушаная арыгінальная мова аўдыё + Выкарыстоўваць арыгінальную мову аўдыя + Выкарыстанне аўдыё па змаўчанні + + Каб выкарыстаць гэтую функцыю, змяніце \'Падмена відэаструменяў\' на любога кліента, акрамя Android Studio + + + Адладка + Уключыць або выключыць параметры адладкі + Запіс адладкі + Журналы адладкі ўключаны + Журналы адладкі адключаны + Сляды стэка журнала + Журналы адладкі ўключаюць трасіроўку стэка + Журналы адладкі не ўключаюць трасіроўку стэка + Паказаць тост пры памылцы ReVanced + Паказваць toast у выпадку памылкі + Не паказваць toast у выпадку памылкі + "Адключэнне паведамленняў пра памылкі схавае ўсе апавяшчэнні ReVanced пра памылкі. Вы не будзеце атрымліваць апавяшчэнні пра нечаканыя падзеі." - Экспартаваць адладачныя лагі - Капіруе адладачныя лагі ReVanced у буфер абмену - Адладачнае лагаванне адключана - Лагі не знойдзены - Лагі скапіяваны - Не ўдалося экспартаваць журналы: %s - Ачысціць адладачныя лагі - Ачышчае ўсе захаваныя адладачныя лагі ReVanced - Лагі ачышчаны - Менеджэр функцыйных сцягоў - Кіраванне лагічнымі функцыйнымі сцягамі - Актыўныя сцягі (%d) - Заблакаваныя сцягі (%d) - Пошук сцягоў... - Сцягі захаваны - Сцягі скінуты - Сцягі скапіяваны ў буфер абмену - Буфер пратаколу часопіса - Журналы адладкі ўключаюць пратабуфер - Журналы адладкі не ўключаюць пратабуфер - "Уключэнне гэтага параметра будзе запісваць дадатковыя даныя макета, у тым ліку тэкст на экране для некаторых кампанентаў інтэрфейсу. + Экспартаваць адладачныя лагі + Капіруе адладачныя лагі ReVanced у буфер абмену + Адладачнае лагаванне адключана + Лагі не знойдзены + Лагі скапіяваны + Не ўдалося экспартаваць журналы: %s + Ачысціць адладачныя лагі + Ачышчае ўсе захаваныя адладачныя лагі ReVanced + Лагі ачышчаны + Менеджэр функцыйных сцягоў + Кіраванне лагічнымі функцыйнымі сцягамі + Актыўныя сцягі (%d) + Заблакаваныя сцягі (%d) + Пошук сцягоў... + Сцягі захаваны + Сцягі скінуты + Сцягі скапіяваны ў буфер абмену + Буфер пратаколу часопіса + Журналы адладкі ўключаюць пратабуфер + Журналы адладкі не ўключаюць пратабуфер + "Уключэнне гэтага параметра будзе запісваць дадатковыя даныя макета, у тым ліку тэкст на экране для некаторых кампанентаў інтэрфейсу. Гэта можа дапамагчы ідэнтыфікаваць кампаненты пры стварэнні карыстацкіх фільтраў. Аднак уключэнне гэтага параметра таксама будзе запісваць некаторыя даныя карыстальніка, такія як ваш IP-адрас." - - - Ачысціць спасылкі для абагульвання - Параметр запыту адсочвання выдалены з абагуленых спасылак - Параметр запыту адсочвання не выдалены з абагуленых спасылак - Змяніць спасылкі для абагульвання на youtube.com - Агульныя спасылкі выкарыстоўваюць youtube.com - Агульныя спасылкі выкарыстоўваюць music.youtube.com - - - Карыстальніцкі фільтр - Схавайце кампаненты з дапамогай карыстацкіх фільтраў - Уключыць карыстальніцкі фільтр - Карыстальніцкі фільтр уключаны - Карыстальніцкі фільтр адключаны - Карыстальніцкі фільтр - - Спіс радкоў канструктара шляхоў кампанентаў для фільтрацыі, раздзеленых новым радком - Няправільны карыстацкі фільтр: %s - - - - - Пра праграму - Аб\"явы - Альтэрнатыўныя мініяцюры - Карміць - Агульнае - Плэер - Панэль пошуку - Элементы кіравання пальцам - Рознае - Відэа - Аднавіць старое меню налад - Старыя меню налад паказваюцца - Старыя меню налад не паказваюцца - - - Адключыць прайграванне Shorts у фонавым - Прайграванне Shorts у фонавым адключана - Фоновый плейлист Shorts включен - - - Схаваць карты альбома - Карткі альбомаў схаваныя - Паказваюцца альбомныя карткі - Схаваць карткі выканаўцаў - Карткі выканаўцаў схаваныя - Паказваюцца карткі выканаўцаў - Схавайце паліцу для чыпсаў - Паліца для чыпсаў схаваная - Паказана паліца для чыпсаў - Схаваць паведамленні ў супольнасці - Паведамленні ў супольнасці схаваны - Паказваюцца паведамленні ў супольнасці - Схаваць кампактныя банеры - Кампактныя банеры схаваныя - Паказваюцца кампактныя банеры - Схаваць раскладвальную картку - Раскладвальная картка пад відэа схаваная - Раскладвальная картка пад відэа паказаная - Схаваць плаваючую кнопку мікрафона - Плаваючая кнопка мікрафона ў пошуку схаваная - Плаваючая кнопка мікрафона ў пошуку паказана - Схавайце гарызантальныя паліцы - "Гарызантальныя паліцы схаваны, такія як: + + + Ачысціць спасылкі для абагульвання + Параметр запыту адсочвання выдалены з абагуленых спасылак + Параметр запыту адсочвання не выдалены з абагуленых спасылак + Змяніць спасылкі для абагульвання на youtube.com + Агульныя спасылкі выкарыстоўваюць youtube.com + Агульныя спасылкі выкарыстоўваюць music.youtube.com + + + Карыстальніцкі фільтр + Схавайце кампаненты з дапамогай карыстацкіх фільтраў + Уключыць карыстальніцкі фільтр + Карыстальніцкі фільтр уключаны + Карыстальніцкі фільтр адключаны + Карыстальніцкі фільтр + + Спіс радкоў канструктара шляхоў кампанентаў для фільтрацыі, раздзеленых новым радком + Няправільны карыстацкі фільтр: %s + + + + + Пра праграму + Аб\"явы + Альтэрнатыўныя мініяцюры + Карміць + Агульнае + Плэер + Панэль пошуку + Элементы кіравання пальцам + Рознае + Відэа + Аднавіць старое меню налад + Старыя меню налад паказваюцца + Старыя меню налад не паказваюцца + + + Адключыць прайграванне Shorts у фонавым + Прайграванне Shorts у фонавым адключана + Фоновый плейлист Shorts включен + + + Схаваць карты альбома + Карткі альбомаў схаваныя + Паказваюцца альбомныя карткі + Схаваць карткі выканаўцаў + Карткі выканаўцаў схаваныя + Паказваюцца карткі выканаўцаў + Схавайце паліцу для чыпсаў + Паліца для чыпсаў схаваная + Паказана паліца для чыпсаў + Схаваць паведамленні ў супольнасці + Паведамленні ў супольнасці схаваны + Паказваюцца паведамленні ў супольнасці + Схаваць кампактныя банеры + Кампактныя банеры схаваныя + Паказваюцца кампактныя банеры + Схаваць раскладвальную картку + Раскладвальная картка пад відэа схаваная + Раскладвальная картка пад відэа паказаная + Схаваць плаваючую кнопку мікрафона + Плаваючая кнопка мікрафона ў пошуку схаваная + Плаваючая кнопка мікрафона ў пошуку паказана + Схавайце гарызантальныя паліцы + "Гарызантальныя паліцы схаваны, такія як: • Апошнія навіны • Працягнуць прагляд • Даследаваць больш каналаў • Самыя адпаведныя • Пакупкі • Паглядзець яшчэ раз" - Гарызантальныя паліцы паказаныя - Схаваць паліцу малюнкаў - Паліца малюнкаў у выніках пошуку схаваная - Паліца малюнкаў у выніках пошуку паказаная - Схаваць апошнія паведамленні - Апошнія паведамленні схаваны - Паказваюцца апошнія паведамленні - Схаваць міксавыя плэйлісты - Спісы міксаў схаваны - Паказваюцца міксавыя плэйлісты - Схаваць раздзел фільмаў - Раздзел фільмаў схаваны - Паказваецца раздзел фільмаў - - Схаваць кнопку \"Паведаміць мне\" - Кнопка «Паведаміць мне» схаваная - Кнопка «Паведаміць мне» паказаная - Схаваць гульнявыя элементы - Ігравыя элементы схаваны - Паказваюцца гульнявыя магчымасці - - Схаваць кнопку \"Паказаць больш\" - Кнопка «Паказаць больш» у выніках пошуку схаваная - Кнопка «Паказаць больш» у выніках пошуку паказаная - Схаваць апытанні - Апытанні схаваныя - Апытанні паказаны - Схаваць паліцу білетаў - Паліца білетаў схавана - Паліца білетаў паказана - - Схаваць меткі рэкамендацый відэа - Меткі «Людзі таксама глядзелі» і «Вам таксама можа спадабацца» ў выніках пошуку схаваныя - Меткі «Людзі таксама глядзелі» і «Вам таксама можа спадабацца» ў выніках пошуку паказаныя - Схаваць візуальны падзельнік - Візуальны падзельнік схаваны - Візуальны падзельнік паказаны - - Схаваць YouTube Doodles - Анімацыя YouTube Doodles на лагатыпе схаваная - Анімацыя YouTube Doodles на лагатыпе паказана - "Doodles па YouTube паказваюцца некалькі дзён у год. + Схаваць кнопку \"Паказаць больш\" + Кнопка «Паказаць больш» у выніках пошуку схаваная + Кнопка «Паказаць больш» у выніках пошуку паказаная + Схаваць апытанні + Апытанні схаваныя + Апытанні паказаны + Схаваць паліцу білетаў + Паліца білетаў схавана + Паліца білетаў паказана + + Схаваць меткі рэкамендацый відэа + Меткі «Людзі таксама глядзелі» і «Вам таксама можа спадабацца» ў выніках пошуку схаваныя + Меткі «Людзі таксама глядзелі» і «Вам таксама можа спадабацца» ў выніках пошуку паказаныя + Схаваць візуальны падзельнік + Візуальны падзельнік схаваны + Візуальны падзельнік паказаны + + Схаваць YouTube Doodles + Анімацыя YouTube Doodles на лагатыпе схаваная + Анімацыя YouTube Doodles на лагатыпе паказана + "Doodles па YouTube паказваюцца некалькі дзён у год. Калі Doodle зараз паказваецца ў вашым рэгіёне і гэты параметр схаваны, панэль фільтраў ніжэй радка пошуку таксама будзе схавана." - Схаваць панэль канала - Панэль канала схавана - Паказана панэль канала - Схаваць вадзяны знак канала - Вадзяны знак схаваны - Паказаны вадзяны знак - Схаваць скрыню краўдфандынгу - Краўдфандынгавая скрыня схавана - Паказана скрыня краўдфандынгу - Схаваць экстранныя скрыні - Аварыйныя скрыні схаваныя - Паказваюцца скрыні экстранай дапамогі - Схаваць інфармацыйныя панэлі - Інфармацыйныя панэлі схаваныя - Паказваюцца інфармацыйныя панэлі - - Схаваць кнопку «Далучыцца» - Кнопка «Далучыцца» схаваная - Кнопка «Далучыцца» паказаная - Схаваць медыцынскія панэлі - Медпанэлі схаваныя - Паказваюцца медыцынскія панэлі - Схаваць хуткія дзеянні - Хуткія дзеянні ў поўнаэкранным рэжыме схаваныя - Хуткія дзеянні ў поўнаэкранным рэжыме паказаныя - Схаваць звязаныя відэа - Звязаныя відэа ў хуткіх дзеяннях схаваныя - Звязаныя відэа ў хуткіх дзеяннях паказаныя - Схаваць рэкамендацыі для падпісчыкаў - Правілы супольнасці падпісчыкаў схаваны - Паказаны правілы супольнасці падпісчыкаў - Схаваць рэакцыі па часе - Часовыя рэакцыі схаваныя - Паказваюцца рэакцыі па часе - Схаваць «Зводку відэа, згенэраваную штучным інтэлектам» - Раздзел згенераваных штучным інтэлектам відэа-рэзюмэ схаваны - Паказаны раздзел зводкі відэа, створанай штучным інтэлектам - Схаваць «Спытаць» - Раздзел «Спытаць» схаваны - Раздзел «Спытаць» паказаны - Схаваць атрыбуты - Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» схаваныя - Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» паказаныя - Схаваць раздзелы - Раздзел раздзелаў схаваны - Паказваецца раздзел раздзелаў - Схаваць «Як быў створаны гэты кантэнт» - Раздзел «Як быў створаны гэты кантэнт» схаваны - Раздзел «Як быў створаны гэты кантэнт» паказаны - Схаваць Hype балы - Hype балы схаваны - Hype балы паказаны - Схаваць «Пазнаёмцеся з падкастам» - Раздзел «Пазнаёмцеся з падкастам» схаваны - Раздзел «Пазнаёмцеся з падкастам» паказаны - Схаваць выбраныя спасылкі - Раздзел з рэкамендаванымі спасылкамі схаваны - Раздзел з рэкамендаванымі спасылкамі паказаны - Схаваць рэкамендаваныя відэа - Раздзел з рэкамендаванымі відэа схаваны - Раздзел з рэкамендаванымі відэа паказаны - Схаваць інфармацыйныя карткі - Раздзел інфармацыйных картак схаваны - Паказваецца раздзел інфармацыйных карт - Схаваць «Ключавыя канцэпцыі» - Раздзел «Ключавыя канцэпцыі» схаваны - Раздзел «Ключавыя канцэпцыі» паказаны - Схаваць кнопку «Падпісацца» - Кнопка «Падпісацца» схавана - Кнопка «Падпісацца» паказана - Схаваць стэнаграму - Раздзел стэнаграмы схаваны - Паказваецца раздзел стэнаграмы - Апісанне відэа - Схаваць або паказаць кампаненты апісання відэа - Панэль фільтраў - Схаваць або паказаць панэль фільтраў у стужках, звязаных відэа, выніках пошуку і гісторыі праглядаў - Схаваць у стужках - Схавана ў стужках - Паказана ў стужках - Схаваць у звязаных відэа - Схавана ў звязаных відэа - Паказана ў звязаных відэа - Схаваць у выніках пошуку - Схавана ў выніках пошуку - Паказана ў выніках пошуку - Схаваць у гісторыі праглядаў - Схавана ў гісторыі праглядаў - Паказаны ў гісторыі праглядаў - Старонка канала - Схаваць або паказаць кампаненты старонкі канала - - Схаваць кнопку «Супольнасць» - Кнопка супольнасці схавана - Кнопка супольнасці паказана - - Схаваць паліцу «Для вас» - Паліца \"Для вас\" схаваная - Паліца \"Для вас\" паказаная - - Схаваць кнопку Далучыцца - Кнопка Далучыцца схавана - Кнопка Далучыцца паказана - Схаваць папярэдні прагляд спасылак - Папярэдні прагляд спасылак схаваны - Папярэдні прагляд спасылак паказаны - Схаваць паліцу ўдзельнікаў - Паліца ўдзельнікаў схаваная - Паліца ўдзельнікаў паказана - - Схаваць кнопку Крама - Кнопка Крама схавана - Кнопка Крама паказана - - Схаваць кнопку Падпісацца - Кнопка Падпісацца схавана - Кнопка Падпісацца паказана - Каментарыі - Схаваць або паказаць кампаненты раздзела каментарыяў - Схаваць зводку чата са штучным інтэлектам - Зводка чата са штучным інтэлектам схавана - Зводка чата са штучным інтэлектам паказана - Схаваць зводку каментарыяў са штучным інтэлектам - Зводка каментарыяў штучнага інтэлекту схавана - Зводка каментарыяў штучнага інтэлекту паказана - Схаваць правілы канала - Рэкамендацыі канала схаваны - Рэкамендацыі канала паказаны - Схаваць загаловак \"Каментарыі ўдзельнікаў\" - Загаловак «Каментары ўдзельнікаў» схаваны - Загаловак «Каментары ўдзельнікаў» паказаны - Схаваць раздзел каментарыяў - Раздзел каментарыяў схаваны - Паказваецца раздзел каментарыяў - Схаваць рэкамендацыі супольнасці - Правілы супольнасці схаваныя - Правілы супольнасці паказаныя - Схаваць кнопку \"Створиць Short\" - Кнопка «Стварыць Shorts» схаваная - Кнопка «Стварыць Shorts» паказаная - Схаваць кнопкі эмодзі і пазнак часу - Кнопкі эмодзі і пазнак часу схаваны - Кнопкі эмодзі і пазнак часу паказаны - Схаваць каментарый для папярэдняга прагляду - Каментарый перад праглядам схаваны - Паказваецца папярэдні прагляд каментарыя - Схаваць кнопку \"Дзякуй\"\" - Кнопка падзякі схавана - Паказана кнопка падзякі - Схаваць колькасць праглядаў - Колькасць праглядаў схавана ў стужцы і выніках пошуку - Колькасць праглядаў паказана ў стужцы і выніках пошуку - - "Абмежаванні: + Схаваць кнопку «Далучыцца» + Кнопка «Далучыцца» схаваная + Кнопка «Далучыцца» паказаная + Схаваць медыцынскія панэлі + Медпанэлі схаваныя + Паказваюцца медыцынскія панэлі + Схаваць хуткія дзеянні + Хуткія дзеянні ў поўнаэкранным рэжыме схаваныя + Хуткія дзеянні ў поўнаэкранным рэжыме паказаныя + Схаваць звязаныя відэа + Звязаныя відэа ў хуткіх дзеяннях схаваныя + Звязаныя відэа ў хуткіх дзеяннях паказаныя + Схаваць рэкамендацыі для падпісчыкаў + Правілы супольнасці падпісчыкаў схаваны + Паказаны правілы супольнасці падпісчыкаў + Схаваць рэакцыі па часе + Часовыя рэакцыі схаваныя + Паказваюцца рэакцыі па часе + Схаваць «Зводку відэа, згенэраваную штучным інтэлектам» + Раздзел згенераваных штучным інтэлектам відэа-рэзюмэ схаваны + Паказаны раздзел зводкі відэа, створанай штучным інтэлектам + Схаваць «Спытаць» + Раздзел «Спытаць» схаваны + Раздзел «Спытаць» паказаны + Схаваць атрыбуты + Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» схаваныя + Раздзелы «Папулярныя месцы», «Гульні», «Музыка» і «Людзі, якіх згадвалі» паказаныя + Схаваць раздзелы + Раздзел раздзелаў схаваны + Паказваецца раздзел раздзелаў + Схаваць «Як быў створаны гэты кантэнт» + Раздзел «Як быў створаны гэты кантэнт» схаваны + Раздзел «Як быў створаны гэты кантэнт» паказаны + Схаваць Hype балы + Hype балы схаваны + Hype балы паказаны + Схаваць «Пазнаёмцеся з падкастам» + Раздзел «Пазнаёмцеся з падкастам» схаваны + Раздзел «Пазнаёмцеся з падкастам» паказаны + Схаваць выбраныя спасылкі + Раздзел з рэкамендаванымі спасылкамі схаваны + Раздзел з рэкамендаванымі спасылкамі паказаны + Схаваць рэкамендаваныя відэа + Раздзел з рэкамендаванымі відэа схаваны + Раздзел з рэкамендаванымі відэа паказаны + Схаваць інфармацыйныя карткі + Раздзел інфармацыйных картак схаваны + Паказваецца раздзел інфармацыйных карт + Схаваць «Ключавыя канцэпцыі» + Раздзел «Ключавыя канцэпцыі» схаваны + Раздзел «Ключавыя канцэпцыі» паказаны + Схаваць кнопку «Падпісацца» + Кнопка «Падпісацца» схавана + Кнопка «Падпісацца» паказана + Схаваць стэнаграму + Раздзел стэнаграмы схаваны + Паказваецца раздзел стэнаграмы + Апісанне відэа + Схаваць або паказаць кампаненты апісання відэа + Панэль фільтраў + Схаваць або паказаць панэль фільтраў у стужках, звязаных відэа, выніках пошуку і гісторыі праглядаў + Схаваць у стужках + Схавана ў стужках + Паказана ў стужках + Схаваць у звязаных відэа + Схавана ў звязаных відэа + Паказана ў звязаных відэа + Схаваць у выніках пошуку + Схавана ў выніках пошуку + Паказана ў выніках пошуку + Схаваць у гісторыі праглядаў + Схавана ў гісторыі праглядаў + Паказаны ў гісторыі праглядаў + Старонка канала + Схаваць або паказаць кампаненты старонкі канала + + Схаваць кнопку «Супольнасць» + Кнопка супольнасці схавана + Кнопка супольнасці паказана + + Схаваць паліцу «Для вас» + Паліца \"Для вас\" схаваная + Паліца \"Для вас\" паказаная + + Схаваць кнопку Далучыцца + Кнопка Далучыцца схавана + Кнопка Далучыцца паказана + Схаваць папярэдні прагляд спасылак + Папярэдні прагляд спасылак схаваны + Папярэдні прагляд спасылак паказаны + Схаваць паліцу ўдзельнікаў + Паліца ўдзельнікаў схаваная + Паліца ўдзельнікаў паказана + + Схаваць кнопку Крама + Кнопка Крама схавана + Кнопка Крама паказана + + Схаваць кнопку Падпісацца + Кнопка Падпісацца схавана + Кнопка Падпісацца паказана + Каментарыі + Схаваць або паказаць кампаненты раздзела каментарыяў + Схаваць зводку чата са штучным інтэлектам + Зводка чата са штучным інтэлектам схавана + Зводка чата са штучным інтэлектам паказана + Схаваць зводку каментарыяў са штучным інтэлектам + Зводка каментарыяў штучнага інтэлекту схавана + Зводка каментарыяў штучнага інтэлекту паказана + Схаваць правілы канала + Рэкамендацыі канала схаваны + Рэкамендацыі канала паказаны + Схаваць загаловак \"Каментарыі ўдзельнікаў\" + Загаловак «Каментары ўдзельнікаў» схаваны + Загаловак «Каментары ўдзельнікаў» паказаны + Схаваць раздзел каментарыяў + Раздзел каментарыяў схаваны + Паказваецца раздзел каментарыяў + Схаваць рэкамендацыі супольнасці + Правілы супольнасці схаваныя + Правілы супольнасці паказаныя + Схаваць кнопку \"Створиць Short\" + Кнопка «Стварыць Shorts» схаваная + Кнопка «Стварыць Shorts» паказаная + Схаваць кнопкі эмодзі і пазнак часу + Кнопкі эмодзі і пазнак часу схаваны + Кнопкі эмодзі і пазнак часу паказаны + Схаваць каментарый для папярэдняга прагляду + Каментарый перад праглядам схаваны + Паказваецца папярэдні прагляд каментарыя + Схаваць кнопку \"Дзякуй\"\" + Кнопка падзякі схавана + Паказана кнопка падзякі + Схаваць колькасць праглядаў + Колькасць праглядаў схавана ў стужцы і выніках пошуку + Колькасць праглядаў паказана ў стужцы і выніках пошуку + + "Абмежаванні: • На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца колькасць праглядаў • Гэта функцыя не працуе з аўтамабільным форм-фактарам" - Схаваць час загрузкі - Час загрузкі схаваны ў стужцы і выніках пошуку - Час загрузкі паказаны ў стужцы і выніках пошуку - - "Абмежаванні: + Схаваць час загрузкі + Час загрузкі схаваны ў стужцы і выніках пошуку + Час загрузкі паказаны ў стужцы і выніках пошуку + + "Абмежаванні: • На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца час загрузкі • Гэтая функцыя не працуе з аўтамабільным форм-фактарам" - Схаваць змест ключавых слоў - Схавайце відэа для пошуку і стужкі з дапамогай фільтраў па ключавых словах - Схаваць хатняе відэа па ключавых словах - Відэа на ўкладцы \"Галоўная\" фільтруюцца па ключавых словах - Відэа на ўкладцы \"Галоўная\" не фільтруюцца па ключавых словах - Схаваць вынікі пошуку па ключавых словах - Вынікі пошуку фільтруюцца па ключавых словах - Вынікі пошуку не фільтруюцца па ключавых словах - Схаваць відэа з падпіскі па ключавых словах - Відэа ва ўкладцы «Падпіскі» фільтруюцца па ключавых словах - Відэа ва ўкладцы \"Падпіскі\" не фільтруюцца па ключавых словах - Ключавыя словы, якія трэба схаваць - - "Ключавыя словы і фразы для схавання, падзеленыя пераходамі на новую радок + "Ключавыя словы і фразы для схавання, падзеленыя пераходамі на новую радок Ключавыя словы могуць быць назвамі каналаў або любым тэкстам, які паказаны ў назвах відэа Словы з вялікімі літарамі пасярэдзіне павінны ўводзіцца з вялікай літары (напрыклад: iPhone, TikTok, LeBlanc)" - Аб фільтрацыі ключавых слоў - "Вынікі дома/падпіскі/пошуку фільтруюцца, каб схаваць змест, які адпавядае ключавым словам і фразам + Аб фільтрацыі ключавых слоў + "Вынікі дома/падпіскі/пошуку фільтруюцца, каб схаваць змест, які адпавядае ключавым словам і фразам Абмежаванні • Shorts нельга схаваць па назве канала • Некаторыя элементы інтэрфейсу могуць не быць схаваны • Пошук па ключавым слове можа не паказаць вынікі" - Супадзенне цэлых слоў - - Калі вы ахінеце ключавое слова або фразу ў двухразовыя лапкі, гэта перашкодзіць частковаму супадзенню назваў відэа і каналаў<br><br>Напрыклад,<br><b>\"ai\"</b> схавае відэа: <b>How does AI work?</b><br>але не схавае: <b>What does fair use mean?</b> - - Нельга выкарыстоўваць ключавое слова: %s - Дадайце цытаты да ключавога слова: %s - Ключавое слова мае супярэчлівыя дэкларацыі: %s - Ключавое слова занадта кароткае і патрабуе цытат: %s - Ключавое слова схавае ўсе відэа: %s - - - Схаваць паліцу крамы стваральнікаў - Паліца крамы стваральніка пад відэапрайгравальнікам схаваная - Паліца крамы стваральніка пад відэапрайгравальнікам паказана - Схаваць банер крамы на канчатковым экране - Банер крамы на канцавым экране схаваны - Банер крамы на канцавым экране паказаны - Схаваць поўнаэкранную рэкламу - "Схаваны поўнаэкранныя рэкламныя ролікі + Супадзенне цэлых слоў + + Калі вы ахінеце ключавое слова або фразу ў двухразовыя лапкі, гэта перашкодзіць частковаму супадзенню назваў відэа і каналаў<br><br>Напрыклад,<br><b>\"ai\"</b> схавае відэа: <b>How does AI work?</b><br>але не схавае: <b>What does fair use mean?</b> + + Нельга выкарыстоўваць ключавое слова: %s + Дадайце цытаты да ключавога слова: %s + Ключавое слова мае супярэчлівыя дэкларацыі: %s + Ключавое слова занадта кароткае і патрабуе цытат: %s + Ключавое слова схавае ўсе відэа: %s + + + Схаваць паліцу крамы стваральнікаў + Паліца крамы стваральніка пад відэапрайгравальнікам схаваная + Паліца крамы стваральніка пад відэапрайгравальнікам паказана + Схаваць банер крамы на канчатковым экране + Банер крамы на канцавым экране схаваны + Банер крамы на канцавым экране паказаны + Схаваць поўнаэкранную рэкламу + "Схаваны поўнаэкранныя рэкламныя ролікі Гэтая функцыя даступная толькі для старых прылад" - Адлюстроўваецца поўнаэкранная рэклама - - Схаваць поўнаэкранную рэкламу працуе толькі са старымі прыладамі - Схаваць агульную рэкламу - Агульныя аб\"явы схаваныя - Паказваюцца агульныя аб\"явы - Схаваць банеры з таварамі - Таварныя банеры схаваныя - Паказваюцца таварныя банеры - Схаваць метку аплачанай акцыі - Пазнака платнай акцыі схавана - Адлюстроўваецца ярлык платнай акцыі - Схаваць самі спансаваныя карты - Спонсарскія карткі схаваныя - Паказваюцца ўласныя карты - Схаваць спасылкі для пакупак - Спасылкі на пакупкі ў апісанні відэа схаваныя - Спасылкі на пакупкі ў апісанні відэа паказаны - Схаваць банэр \"Прагледзець тавары\" - Банер «Паглядзець тавары» ў накладцы відэа схаваны - Банер «Паглядзець тавары» ў накладцы відэа паказаны - Схаваць вынікі вэб-пошуку - Вынікі вэб-пошуку схаваныя - Паказваюцца вынікі вэб-пошуку - - - Схаваць акцыі YouTube Premium - Акцыі YouTube Premium пад відэаплэерам схаваны - Пад відэаплэерам паказваюцца акцыі YouTube Premium - - - Схаваць відэарэкламу - Відэарэклама схаваная - Паказваецца відэарэклама - - - URL скапіраваны ў буфер абмену - URL-адрас з пазнакай часу скапіраваны - Паказаць кнопку скапіравання URL відэа - Кнопка \"Капіяваць URL відэа\" паказана. Націсніце, каб скапіяваць URL відэа. Націсніце і ўтрымлівайце, каб скапіяваць з пазнакай часу - Кнопка \"Капіяваць URL відэа\" не паказана - Паказаць кнопку URL-адрас з часовай пазнакай - Кнопка \"Капіяваць URL з пазнакай часу\" паказана. Націсніце, каб скапіяваць URL відэа з пазнакай часу. Націсніце і ўтрымлівайце, каб скапіяваць без пазнакі часу - Кнопка \"Капіяваць URL з пазнакай часу\" не паказана - - - Выдаліць дыялогавае акно права прагляду - Дыялог будзе выдалены - Будзе паказана дыялогавае акно - Гэта не абыходзіць узроставае абмежаванне. Ён проста прымае гэта аўтаматычна. - - - Адключыць усплываючае акно \"Увайсці ў ТБ\" - Усплывальнае акно «Уваход у ТБ» адключана - Усплывальнае акно «Уваход у ТБ» уключана - - - Адключыць прапуск раздзела па двайным націску - Двайны націск ніколі не можа выклікаць прапуск да наступнага/папярэдняга раздзела - Двайны націск можа час ад часу выклікаць прапуск да наступнага/папярэдняга раздзела - - - Знешнія загрузкі - Налады для выкарыстання вонкавага загрузніка - Паказаць знешнюю кнопку загрузкі - Кнопка загрузкі ў прайгравальніку паказаная - Кнопка загрузкі ў прайгравальніку не паказаная - - Перавызначыць кнопку дзеянні спампоўкі - Кнопка \"Спампаваць\" адкрывае ваш знешні загрузнік - Кнопка \"Спампаваць\" адкрывае ўласную праграму загрузкі ў праграме - Назва пакета загрузніка - Назва пакета вашага ўсталяванага знешняга спампоўшчыка праграмы - Увядзіце назву пакета - Іншае - Праграма не ўстаноўлена - %s не ўсталяваны. Калі ласка, усталюйце яго. - "Не ўдалося знайсці ўстаноўленую праграму з назвай пакета: %s + Адлюстроўваецца поўнаэкранная рэклама + + Схаваць поўнаэкранную рэкламу працуе толькі са старымі прыладамі + Схаваць агульную рэкламу + Агульныя аб\"явы схаваныя + Паказваюцца агульныя аб\"явы + Схаваць банеры з таварамі + Таварныя банеры схаваныя + Паказваюцца таварныя банеры + Схаваць метку аплачанай акцыі + Пазнака платнай акцыі схавана + Адлюстроўваецца ярлык платнай акцыі + Схаваць самі спансаваныя карты + Спонсарскія карткі схаваныя + Паказваюцца ўласныя карты + Схаваць спасылкі для пакупак + Спасылкі на пакупкі ў апісанні відэа схаваныя + Спасылкі на пакупкі ў апісанні відэа паказаны + Схаваць банэр \"Прагледзець тавары\" + Банер «Паглядзець тавары» ў накладцы відэа схаваны + Банер «Паглядзець тавары» ў накладцы відэа паказаны + Схаваць вынікі вэб-пошуку + Вынікі вэб-пошуку схаваныя + Паказваюцца вынікі вэб-пошуку + + + Схаваць акцыі YouTube Premium + Акцыі YouTube Premium пад відэаплэерам схаваны + Пад відэаплэерам паказваюцца акцыі YouTube Premium + + + Схаваць відэарэкламу + Відэарэклама схаваная + Паказваецца відэарэклама + + + URL скапіраваны ў буфер абмену + URL-адрас з пазнакай часу скапіраваны + Паказаць кнопку скапіравання URL відэа + Кнопка \"Капіяваць URL відэа\" паказана. Націсніце, каб скапіяваць URL відэа. Націсніце і ўтрымлівайце, каб скапіяваць з пазнакай часу + Кнопка \"Капіяваць URL відэа\" не паказана + Паказаць кнопку URL-адрас з часовай пазнакай + Кнопка \"Капіяваць URL з пазнакай часу\" паказана. Націсніце, каб скапіяваць URL відэа з пазнакай часу. Націсніце і ўтрымлівайце, каб скапіяваць без пазнакі часу + Кнопка \"Капіяваць URL з пазнакай часу\" не паказана + + + Выдаліць дыялогавае акно права прагляду + Дыялог будзе выдалены + Будзе паказана дыялогавае акно + Гэта не абыходзіць узроставае абмежаванне. Ён проста прымае гэта аўтаматычна. + + + Адключыць усплываючае акно \"Увайсці ў ТБ\" + Усплывальнае акно «Уваход у ТБ» адключана + Усплывальнае акно «Уваход у ТБ» уключана + + + Адключыць прапуск раздзела па двайным націску + Двайны націск ніколі не можа выклікаць прапуск да наступнага/папярэдняга раздзела + Двайны націск можа час ад часу выклікаць прапуск да наступнага/папярэдняга раздзела + + + Знешнія загрузкі + Налады для выкарыстання вонкавага загрузніка + Паказаць знешнюю кнопку загрузкі + Кнопка загрузкі ў прайгравальніку паказаная + Кнопка загрузкі ў прайгравальніку не паказаная + + Перавызначыць кнопку дзеянні спампоўкі + Кнопка \"Спампаваць\" адкрывае ваш знешні загрузнік + Кнопка \"Спампаваць\" адкрывае ўласную праграму загрузкі ў праграме + Назва пакета загрузніка + Назва пакета вашага ўсталяванага знешняга спампоўшчыка праграмы + Увядзіце назву пакета + Іншае + Праграма не ўстаноўлена + %s не ўсталяваны. Калі ласка, усталюйце яго. + "Не ўдалося знайсці ўстаноўленую праграму з назвай пакета: %s Праверце, ці правільная назва пакета і ці ўстаноўлена праграма" - Назва пакета не можа быць пустой - - - Адключыць жэст дакладнага пошуку - Жэст адключаны - Жэст уключаны - - - Уключыць націсканне для пошуку - Націсніце, каб уключыць пошук - Націсканне для пошуку адключана - - - Уключыць жэст яркасці - "Поўнаэкранны жэст правядзення для яркасці ўключаны + Назва пакета не можа быць пустой + + + Адключыць жэст дакладнага пошуку + Жэст адключаны + Жэст уключаны + + + Уключыць націсканне для пошуку + Націсніце, каб уключыць пошук + Націсканне для пошуку адключана + + + Уключыць жэст яркасці + "Поўнаэкранны жэст правядзення для яркасці ўключаны Наладжвайце яркасць, праводзячы вертыкальна па левым баку экрана" - Поўнаэкранны жэст правядзення для яркасці выключаны - Уключыць жэст гучнасці - "Правядзенне пальцам для рэгулявання гучнасці ва ўвесь экран уключана + Поўнаэкранны жэст правядзення для яркасці выключаны + Уключыць жэст гучнасці + "Правядзенне пальцам для рэгулявання гучнасці ва ўвесь экран уключана Рэгулюйце гучнасць, праводзячы пальцам вертыкальна па правай частцы экрана" - Правядзенне пальцам для рэгулявання гучнасці ва ўвесь экран выключана - Уключыць жэст правядзення націскам - Правядзенне націскам уключана - Правядзенне націскам адключана - Уключыць тактыльную зваротную сувязь - Тактыльная зваротная сувязь уключана - Тактыльная зваротная сувязь адключана - Захавайце і аднаўляйце яркасць - Захаванне і аднаўленне яркасці пры выхадзе або ўваходзе ў поўнаэкранны рэжым - Не захоўваць і не аднаўляць яркасць пры выхадзе або ўваходзе ў поўнаэкранны рэжым - Уключыць жэст аўтаматычнай яркасці - Правядзіце пальцам уніз да самага нізкага значэння яркасці, каб уключыць аўтаматычную яркасць - Правядзенне пальцам уніз да самага нізкага значэння не ўключае аўтаматычную яркасць - Аўто - Тайм-аўт накладання пальцам - Працягласць бачнага накладання ў мілісекундах - Непразрыстасць фону накладкі пракруткі - Значэнне непразрыстасці паміж 0-100 - Непразрыстасць пракруткі павінна быць паміж 0-100 - Колер яркасці накладкі правядзення - Колер шкалы прагрэсу для элементаў кіравання яркасцю - Колер гучнасці накладкі правядзення - Колер шкалы прагрэсу для элементаў кіравання гучнасцю - Памер тэксту накладкі правядзення - Памер тэксту для накладкі правядзення ад 1 да 30 - Памер тэксту павінен быць у межах ад 1 да 30 - Парог велічыні пальцам - Велічыня парогавага значэння для правядзення пальцам - Адчувальнасць правядзення для гучнасці - Наколькі змяняецца гучнасць пры кожным правядзенні - Стыль накладкі правядзення - Гарызантальная накладка - Гарызантальная накладка (мінімальная — зверху) - Гарызантальная накладка (мінімальная — па цэнтры) - Кругавая накладка - Кругавая накладка (мінімальная) - Вертыкальная накладка - Вертыкальная накладка (мінімальная) - Уключыць зьмену відэа праз правядзенне пальцам - Правядзенне пальцам у рэжыме поўнага экрана зьменіць відэа на наступнае/папярэдняе - Правядзенне пальцам у рэжыме поўнага экрана не зьменіць відэа на наступнае/папярэдняе - - - Адключыць аўтаматычныя цітры - Аўтаматычныя субцітры адключаны - Аўтаматычныя субцітры ўключаны - - - Кнопкі дзеянняў - Схаваць або паказаць кнопкі пад відэа - Адключыць свецянне кнопак «Мне падабаецца» і «Падпісацца» - Кнопкі «Падабаецца» і «Падпісацца» не будуць мігцець пры згадванні - Кнопкі «Падабаецца» і «Падпісацца» будуць мігцець пры згадванні - Схаваць \"Падабаецца\" і \"Не падабаецца\" - Кнопкі \"Падабаецца\" і \"Не падабаецца\" схаваны - Паказваюцца кнопкі \"Падабаецца\" і \"Не падабаецца\" - - Схаваць Share - Кнопка \"Падзяліцца\" схавана - Паказана кнопка \"Падзяліцца\" - - Схаваць Спыніць рэкламу - Кнопка \"Спыніць рэкламу\" схавана - Кнопка \"Спыніць рэкламу\" паказана - - Схаваць каментарыі - Кнопка каментарыяў схавана - Кнопка каментарыяў паказана - + Схаваць Share + Кнопка \"Падзяліцца\" схавана + Паказана кнопка \"Падзяліцца\" + + Схаваць Спыніць рэкламу + Кнопка \"Спыніць рэкламу\" схавана + Кнопка \"Спыніць рэкламу\" паказана + + Схаваць каментарыі + Кнопка каментарыяў схавана + Кнопка каментарыяў паказана + - Схаваць справаздачу - Кнопка \"Паведаміць\" схавана - Паказана кнопка \"Паведаміць\" - - Схаваць рэмікс - Кнопка \"Рэмікс\" схавана - Паказана кнопка \"Рэмікс\" - - Схаваць загрузку - Кнопка загрузкі схавана - Паказана кнопка загрузкі - + Схаваць рэмікс + Кнопка \"Рэмікс\" схавана + Паказана кнопка \"Рэмікс\" + + Схаваць загрузку + Кнопка загрузкі схавана + Паказана кнопка загрузкі + - Схаваць хайп - Кнопка Hype схаваная - Кнопка хайпу паказана - - Схаваць Рэкламу - Кнопка \"Прасоўваць\" схавана - Кнопка \"Прасоўваць\" паказана - - Схаваць Дзякуй - Кнопка падзякі схавана - Паказана кнопка падзякі - + Схаваць Рэкламу + Кнопка \"Прасоўваць\" схавана + Кнопка \"Прасоўваць\" паказана + + Схаваць Дзякуй + Кнопка падзякі схавана + Паказана кнопка падзякі + - Схаваць кнопку «Запытацца» - Кнопка «Запытацца» схаваная - Кнопка «Запытацца» паказаная - - Схаваць кліп - Кнопка кліпа схавана - Паказана кнопка кліпа - - Схаваць Краму - Кнопка \"Крама\" схавана - Кнопка \"Крама\" паказана - - Схаваць \"Захаваць\" - Кнопка \"Захаваць\" схавана - Кнопка \"Захаваць\" паказана - - - Кнопкі навігацыі - Схаваць або змяніць кнопкі на панэлі навігацыі - - Схаваць галоўную - Кнопка \"Дадому\" схавана - Паказана кнопка \"Дадому\" - - Схаваць Shorts - Кнопка Shorts схавана - Кнопка shorts паказваецца - - Схаваць Стварыць - Кнопка \"Стварыць\" схавана - Паказана кнопка \"Стварыць\" - - Схаваць падпіскі - Кнопка \"Падпіскі\" схавана - Паказана кнопка \"Падпіскі\" - Схаваць апавяшчэнні - Кнопка апавяшчэнняў схаваная - Кнопка апавяшчэнняў паказаная - - Пераключальнік \"Стварыць з апавяшчэннямі\" - "Кнопка «Стварыць» заменена кнопкай «Апавяшчэнні» + Схаваць кнопку «Запытацца» + Кнопка «Запытацца» схаваная + Кнопка «Запытацца» паказаная + + Схаваць кліп + Кнопка кліпа схавана + Паказана кнопка кліпа + + Схаваць Краму + Кнопка \"Крама\" схавана + Кнопка \"Крама\" паказана + + Схаваць \"Захаваць\" + Кнопка \"Захаваць\" схавана + Кнопка \"Захаваць\" паказана + + + Кнопкі навігацыі + Схаваць або змяніць кнопкі на панэлі навігацыі + + Схаваць галоўную + Кнопка \"Дадому\" схавана + Паказана кнопка \"Дадому\" + + Схаваць Shorts + Кнопка Shorts схавана + Кнопка shorts паказваецца + + Схаваць Стварыць + Кнопка \"Стварыць\" схавана + Паказана кнопка \"Стварыць\" + + Схаваць падпіскі + Кнопка \"Падпіскі\" схавана + Паказана кнопка \"Падпіскі\" + Схаваць апавяшчэнні + Кнопка апавяшчэнняў схаваная + Кнопка апавяшчэнняў паказаная + + Пераключальнік \"Стварыць з апавяшчэннямі\" + "Кнопка «Стварыць» заменена кнопкай «Апавяшчэнні» Заўвага: Уключэнне гэтага таксама прымусова схавае відэарэкламу" - Кнопка \"Стварыць\" не ўзаемадзейнічае з кнопкай \"Апавяшчэнні\" - "Адключэнне гэтай налады таксама адключыць блакіроўку рэкламы Shorts. + Кнопка \"Стварыць\" не ўзаемадзейнічае з кнопкай \"Апавяшчэнні\" + "Адключэнне гэтай налады таксама адключыць блакіроўку рэкламы Shorts. Калі змена гэтай налады не ўступае ў сілу, паспрабуйце пераключыцца ў рэжым інкогніта." - Схаваць меткі кнопак навігацыі - Цэтлікі схаваныя - Этыкеткі паказаны - Адключыць празрыстую панэль стану - Панэль стану непразрыстая. - Панэль стану няпразрыстая ці празрыстая. - На некаторых прыладах уключэнне гэтай функцыі можа змяніць панэль навігацыі сістэмы на празрыстую. - Адключыць светлую празрыстую панэль - Панэль навігацыі ў светлым рэжыме непразрыстая - Панэль навігацыі ў светлай тэме няпразрыстая ці празрыстая. - Адключыць цёмную непразрыстую панэль. - Панэль навігацыі ў цёмным рэжыме непразрыстая - Панэль навігацыі ў цёмнай тэме няпразрыстая. - - - Выпадаючае меню - Схаваць або паказаць элементы ўсплываючага меню гульца - - Схаваць подпісы - Меню субцітраў схавана - Паказана меню субцітраў - - Схаваць дадатковыя налады - Меню дадатковых налад схавана - Адлюструецца меню дадатковых налад - - Схаваць таймер сну - Меню таймера сну схавана - Меню таймера сну паказана - - Схаваць цыкл відэа - Меню цыклічнага відэа схавана - Паказана меню цыклічнага відэа - - Схаваць неактыўны рэжым - Меню неактыўнага рэжыму схавана - Адлюстроўваецца меню рэжыму навакольнага асяроддзя - Схаваць стабільны гук - Меню стабільнага гуку паказана - Меню стабільнага гуку схавана - - Схаваць Даведку & зваротная сувязь - Дапамога & меню зваротнай сувязі схавана - Дапамога & паказана меню зваротнай сувязі - - Схаваць хуткасць прайгравання - Меню хуткасці прайгравання схавана - Адлюструецца меню хуткасці прайгравання - - Схаваць экран блакіроўкі - Меню экрана блакіроўкі схавана - Адлюстроўваецца меню блакіроўкі экрана - - Схаваць \'Слухаць у YouTube Music\' - Меню \'Слухаць у YouTube Music\' схавана - Меню \'Слухаць у YouTube Music\' паказана - - Схаваць гукавую дарожку - Меню гукавой дарожкі схавана - Адлюструецца меню гукавой дарожкі - + Схаваць подпісы + Меню субцітраў схавана + Паказана меню субцітраў + + Схаваць дадатковыя налады + Меню дадатковых налад схавана + Адлюструецца меню дадатковых налад + + Схаваць таймер сну + Меню таймера сну схавана + Меню таймера сну паказана + + Схаваць цыкл відэа + Меню цыклічнага відэа схавана + Паказана меню цыклічнага відэа + + Схаваць неактыўны рэжым + Меню неактыўнага рэжыму схавана + Адлюстроўваецца меню рэжыму навакольнага асяроддзя + Схаваць стабільны гук + Меню стабільнага гуку паказана + Меню стабільнага гуку схавана + + Схаваць Даведку & зваротная сувязь + Дапамога & меню зваротнай сувязі схавана + Дапамога & паказана меню зваротнай сувязі + + Схаваць хуткасць прайгравання + Меню хуткасці прайгравання схавана + Адлюструецца меню хуткасці прайгравання + + Схаваць экран блакіроўкі + Меню экрана блакіроўкі схавана + Адлюстроўваецца меню блакіроўкі экрана + + Схаваць \'Слухаць у YouTube Music\' + Меню \'Слухаць у YouTube Music\' схавана + Меню \'Слухаць у YouTube Music\' паказана + + Схаваць гукавую дарожку + Меню гукавой дарожкі схавана + Адлюструецца меню гукавой дарожкі + - "Меню аўдыядарожкі схавана + "Меню аўдыядарожкі схавана Каб паказаць меню аўдыядарожкі, зменіце \"Імітацыя відэапатокаў\" на \"Android No SDK\"" - - Схаваць гадзіннік у VR - Меню прагляду ў VR схавана - Паказана меню \"Глядзець у VR\" - Схаваць меню якасці відэа - Меню якасці відэа схавана - Меню якасці відэа паказана - Схаваць калонтытул меню якасці відэа - Ніжні калонтытул меню якасці відэа схаваны - Паказваецца ніжні калонтытул меню якасці відэа - - - Схаваць кнопку «Аўтапрайграванне» - Кнопка аўтазапуску схавана - Паказана кнопка аўтазапуску - - Схаваць кнопку «Субцітры» - Кнопка субцітраў схавана - Паказана кнопка субцітраў - Схаваць кнопку «Трансляцыя» - Кнопка Cast схавана - Паказана кнопка Cast - Схаваць фон элементаў кіравання прайгравальнікам - Фон элементаў кіравання плэерам схаваны - Фон элементаў кіравання паказаны - Схаваць папярэднія & кнопкі «Далей» - Кнопкі схаваныя - Паказваюцца кнопкі - - - Схаваць карткі канцавога экрана - Карткі канцавога экрана схаваны - Паказваюцца карткі канцавога экрана - - - Адключыць рэжым навакольнага асяроддзя ў поўнаэкранным рэжыме - Навакольны рэжым адключаны - Неактыўны рэжым уключаны - - - Схаваць інфармацыйныя карткі - Інфармацыйныя карткі схаваны - Паказваюцца інфармацыйныя карткі - - - Адключыць анімацыю рухомых лікаў - Лічбы без анімацыі - Пракатныя лічбы аніміраваныя - - - Схаваць панэль прагрэсу відэапрайгравальніка - Панэль пошуку відэаплэера схавана - Адлюстроўваецца панэль пошуку відэаплэера - - Схаваць панэль прагрэсу з эскізамі відэа - Панэль прагрэсу з эскізамі відэа схавана - Панэль прагрэсу з эскізамі відэа паказана - - - Прайгравальнік Shorts - Схаваць або паказаць кампаненты прайгравальніка Shorts - - Схаваць Shorts у стужцы «Галоўная» - Схавана ў стужцы «Галоўная» і звязаных відэа - Паказана ў стужцы «Галоўная» і звязаных відэа - Схаваць Shorts у выніках пошуку - Схаваны ў выніках пошуку - Паказана ў выніках пошуку - - Схаваць Shorts у стужцы «Падпіскі» - Схавана ў стужцы «Падпіскі» - Паказана ў стужцы «Падпіскі» - Схаваць Shorts з гісторыі праглядаў - Схавана ў гісторыі праглядаў - Паказаны ў гісторыі праглядаў - Схаваць метку \"Аўтаматычны дубляж\" - Надпіс з аўтадубляжом схаваны - Надпіс з аўтадубляжом паказаны - Схаваць кнопку \"Набыць Super Thanks\" - Кнопка «Набыць Super Thanks» схавана - Кнопка «Набыць Super Thanks» паказана - Схаваць кнопку эфекту - Кнопка эфекту схавана - Кнопка эфекту паказана - Схаваць кнопку \"Зялёны экран\" - Кнопка с зелёным экраном Shorts скрыта - Кнопка с зелёным экраном Shorts отображается - Скрыть хештег-кнопку Shorts - Хештег-кнопка Shorts скрыта - Хештег-кнопка Shorts отображается - - Схаваць кнопку «Далучыцца» - Кнопка «Далучыцца» схавана - Паказана кнопка «Далучыцца» - Схаваць жывы папярэдні прагляд - Папярэдні прагляд у рэальным часе схаваны - Папярэдні прагляд у рэальным часе паказаны - Схаваць метку месцазнаходжання - Метка месцазнаходжання схавана - Паказана метка месцазнаходжання - Схаваць кнопку \"Новыя паведамленні\" - Кнопка «Новыя паведамленні» схавана - Кнопка «Новыя паведамленні» паказана - Схаваць прыпыненыя кнопкі накладання - Прыпыненыя кнопкі накладання схаваны - Паказваюцца прыпыненыя кнопкі накладання - Схаваць папярэдні прагляд каментарыя - Папярэдні прагляд каментарыя схаваны - Паказваецца папярэдні прагляд каментарыя - Схаваць кнопку \"Захаваць музыку\" - Кнопка захавання музыкі схавана - Кнопка захавання музыкі паказана - Схаваць прапановы пошуку - Пошукавыя прапановы схаваны - Паказваюцца прапановы пошуку - Схаваць кнопку «Крама» - Кнопка крамы схавана - Паказваецца кнопка крамы - Скрыть стикеры - Стикеры Shorts скрыты - Стикеры Shorts отображаются - Схаваць кнопку «Падпісацца» - Кнопка \"Падпісацца\" схавана - Паказана кнопка «Падпісацца» - Схаваць пазначаныя прадукты - Пазначаныя прадукты схаваны - Прадукты з тэгамі паказаны - Схаваць кнопку «Наступныя» - Кнопка Будущие ролики скрыта - Кнопка Будущие ролики отображается - Схаваць кнопку \"Выкарыстаць гэты гук\" - Кнопка \"Выкарыстаць гэты гук\" схавана - Кнопка \"Выкарыстаць гэты гук\" паказана - Схаваць кнопку \"Выкарыстаць гэты шаблон\" - Кнопка \"Выкарыстаць гэты шаблон\" схавана - Кнопка \"Выкарыстаць гэты шаблон\" паказана - Схаваць анімацыю кнопкі «Падабаецца» - Анимация всплывающего окна с лайками Shorts скрыта - Анимация всплывающего окна с лайками Shorts отображается - Схаваць кнопку «Падабаецца» - Кнопка \"Падабаецца\" схавана - Паказана кнопка \"Падабаецца\" - Схаваць кнопку «Не падабаецца» - Кнопка \"Не падабаецца\" схавана - Паказана кнопка \"Не падабаецца\" - Схаваць кнопку «Каментарыі» - Кнопка каментарыяў схавана - Паказана кнопка каментарыяў - - Схаваць кнопку «Падзяліцца» - Кнопка \"Падзяліцца\" схавана - Паказана кнопка \"Падзяліцца\" - - Схаваць кнопку «Рэмікс» - Кнопка \"Рэмікс\" схавана - Паказана кнопка \"Рэмікс\" - Кнопка \"Схаваць гук\" - Кнопка гуку схавана - Паказана кнопка гуку - Схаваць інфармацыйную панэль - Інфармацыйная панэль схавана - Паказана інфармацыйная панэль - Схаваць панэль канала - Панэль канала схавана - Паказана панэль канала - Схаваць назву відэа - Назва відэа схавана - Назва відэа паказана - Схаваць метку метаданых гуку - Метка метададзеных гуку схавана - Метка метададзеных гуку паказана - Схаваць надпіс са спасылкай на відэа - Метка спасылкі на відэа схавана - Адлюструецца метка спасылкі на відэа - Схаваць панэль навігацыі - Панэль навігацыі схавана - Паказана панэль навігацыі - - - Схаваць прапанаванае відэа на канчатковым экране - "Прапанаванае відэа на канчатковым экране будзе схавана, калі аўтаматычнае прайграванне выключана. + + Схаваць гадзіннік у VR + Меню прагляду ў VR схавана + Паказана меню \"Глядзець у VR\" + Схаваць меню якасці відэа + Меню якасці відэа схавана + Меню якасці відэа паказана + Схаваць калонтытул меню якасці відэа + Ніжні калонтытул меню якасці відэа схаваны + Паказваецца ніжні калонтытул меню якасці відэа + + + Схаваць кнопку «Аўтапрайграванне» + Кнопка аўтазапуску схавана + Паказана кнопка аўтазапуску + + Схаваць кнопку «Субцітры» + Кнопка субцітраў схавана + Паказана кнопка субцітраў + Схаваць кнопку «Трансляцыя» + Кнопка Cast схавана + Паказана кнопка Cast + Схаваць фон элементаў кіравання прайгравальнікам + Фон элементаў кіравання плэерам схаваны + Фон элементаў кіравання паказаны + Схаваць папярэднія & кнопкі «Далей» + Кнопкі схаваныя + Паказваюцца кнопкі + + + Схаваць карткі канцавога экрана + Карткі канцавога экрана схаваны + Паказваюцца карткі канцавога экрана + + + Адключыць рэжым навакольнага асяроддзя ў поўнаэкранным рэжыме + Навакольны рэжым адключаны + Неактыўны рэжым уключаны + + + Схаваць інфармацыйныя карткі + Інфармацыйныя карткі схаваны + Паказваюцца інфармацыйныя карткі + + + Адключыць анімацыю рухомых лікаў + Лічбы без анімацыі + Пракатныя лічбы аніміраваныя + + + Схаваць панэль прагрэсу відэапрайгравальніка + Панэль пошуку відэаплэера схавана + Адлюстроўваецца панэль пошуку відэаплэера + + Схаваць панэль прагрэсу з эскізамі відэа + Панэль прагрэсу з эскізамі відэа схавана + Панэль прагрэсу з эскізамі відэа паказана + + + Прайгравальнік Shorts + Схаваць або паказаць кампаненты прайгравальніка Shorts + + Схаваць Shorts у стужцы «Галоўная» + Схавана ў стужцы «Галоўная» і звязаных відэа + Паказана ў стужцы «Галоўная» і звязаных відэа + Схаваць Shorts у выніках пошуку + Схаваны ў выніках пошуку + Паказана ў выніках пошуку + + Схаваць Shorts у стужцы «Падпіскі» + Схавана ў стужцы «Падпіскі» + Паказана ў стужцы «Падпіскі» + Схаваць Shorts з гісторыі праглядаў + Схавана ў гісторыі праглядаў + Паказаны ў гісторыі праглядаў + Схаваць метку \"Аўтаматычны дубляж\" + Надпіс з аўтадубляжом схаваны + Надпіс з аўтадубляжом паказаны + Схаваць кнопку \"Набыць Super Thanks\" + Кнопка «Набыць Super Thanks» схавана + Кнопка «Набыць Super Thanks» паказана + Схаваць кнопку эфекту + Кнопка эфекту схавана + Кнопка эфекту паказана + Схаваць кнопку \"Зялёны экран\" + Кнопка с зелёным экраном Shorts скрыта + Кнопка с зелёным экраном Shorts отображается + Скрыть хештег-кнопку Shorts + Хештег-кнопка Shorts скрыта + Хештег-кнопка Shorts отображается + + Схаваць кнопку «Далучыцца» + Кнопка «Далучыцца» схавана + Паказана кнопка «Далучыцца» + Схаваць жывы папярэдні прагляд + Папярэдні прагляд у рэальным часе схаваны + Папярэдні прагляд у рэальным часе паказаны + Схаваць метку месцазнаходжання + Метка месцазнаходжання схавана + Паказана метка месцазнаходжання + Схаваць кнопку \"Новыя паведамленні\" + Кнопка «Новыя паведамленні» схавана + Кнопка «Новыя паведамленні» паказана + Схаваць прыпыненыя кнопкі накладання + Прыпыненыя кнопкі накладання схаваны + Паказваюцца прыпыненыя кнопкі накладання + Схаваць папярэдні прагляд каментарыя + Папярэдні прагляд каментарыя схаваны + Паказваецца папярэдні прагляд каментарыя + Схаваць кнопку \"Захаваць музыку\" + Кнопка захавання музыкі схавана + Кнопка захавання музыкі паказана + Схаваць прапановы пошуку + Пошукавыя прапановы схаваны + Паказваюцца прапановы пошуку + Схаваць кнопку «Крама» + Кнопка крамы схавана + Паказваецца кнопка крамы + Скрыть стикеры + Стикеры Shorts скрыты + Стикеры Shorts отображаются + Схаваць кнопку «Падпісацца» + Кнопка \"Падпісацца\" схавана + Паказана кнопка «Падпісацца» + Схаваць пазначаныя прадукты + Пазначаныя прадукты схаваны + Прадукты з тэгамі паказаны + Схаваць кнопку «Наступныя» + Кнопка Будущие ролики скрыта + Кнопка Будущие ролики отображается + Схаваць кнопку \"Выкарыстаць гэты гук\" + Кнопка \"Выкарыстаць гэты гук\" схавана + Кнопка \"Выкарыстаць гэты гук\" паказана + Схаваць кнопку \"Выкарыстаць гэты шаблон\" + Кнопка \"Выкарыстаць гэты шаблон\" схавана + Кнопка \"Выкарыстаць гэты шаблон\" паказана + Схаваць анімацыю кнопкі «Падабаецца» + Анимация всплывающего окна с лайками Shorts скрыта + Анимация всплывающего окна с лайками Shorts отображается + Схаваць кнопку «Падабаецца» + Кнопка \"Падабаецца\" схавана + Паказана кнопка \"Падабаецца\" + Схаваць кнопку «Не падабаецца» + Кнопка \"Не падабаецца\" схавана + Паказана кнопка \"Не падабаецца\" + Схаваць кнопку «Каментарыі» + Кнопка каментарыяў схавана + Паказана кнопка каментарыяў + + Схаваць кнопку «Падзяліцца» + Кнопка \"Падзяліцца\" схавана + Паказана кнопка \"Падзяліцца\" + + Схаваць кнопку «Рэмікс» + Кнопка \"Рэмікс\" схавана + Паказана кнопка \"Рэмікс\" + Кнопка \"Схаваць гук\" + Кнопка гуку схавана + Паказана кнопка гуку + Схаваць інфармацыйную панэль + Інфармацыйная панэль схавана + Паказана інфармацыйная панэль + Схаваць панэль канала + Панэль канала схавана + Паказана панэль канала + Схаваць назву відэа + Назва відэа схавана + Назва відэа паказана + Схаваць метку метаданых гуку + Метка метададзеных гуку схавана + Метка метададзеных гуку паказана + Схаваць надпіс са спасылкай на відэа + Метка спасылкі на відэа схавана + Адлюструецца метка спасылкі на відэа + Схаваць панэль навігацыі + Панэль навігацыі схавана + Паказана панэль навігацыі + + + Схаваць прапанаванае відэа на канчатковым экране + "Прапанаванае відэа на канчатковым экране будзе схавана, калі аўтаматычнае прайграванне выключана. Аўтаматычнае прайграванне можна змяніць у наладах YouTube: Налады → Прайграванне → Аўтаматычнае прайграванне наступнага відэа" - Паказваць прапанаванае відэа на канчатковым экране - - - Схаваць накладку звязаных відэа - Накладка звязаных відэа ў поўнаэкранным рэжыме схавана - Накладка звязаных відэа ў поўнаэкранным рэжыме паказана - - - Схаваць метку часу відэа - Метка часу схавана - Адлюстроўваецца метка часу - - - Схаваць усплывальныя панэлі прайгравальніка - Усплывальныя панэлі прайгравальніка схаваныя - Паказваюцца ўсплывальныя панэлі прайгравальніка - - - Выйсці з поўнаэкраннага рэжыму ў канцы відэа - Адключана - Партрэт - Ландшафт - Партрэт і ландшафт - - - Открывать видео на весь экран в портретном режиме - Видео открываются на весь экран - Видео не открываются на весь экран - - - Непразрыстасць накладання прайгравальніка - Значэнне непразрыстасці паміж 0-100, дзе 0 - празрысты - Непразрыстасць накладання прайгравальніка павінна быць паміж 0-100 - - - - Адзнакі \"Не падабаецца\" часова недаступныя (час чакання API скончыўся) - Дызлайкі недаступныя (статус %d) - Недаступныя дызлайкі (ліміт API кліента) - Не падабаецца (%s) - - Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\" - - Схавана ўладальнікам - Дызлайкі паказаны - Дызлайкі не паказваюцца - Паказвайце \"не падабаецца\" на Shorts - "Дызлайкі на Shorts паказаныя + Паказваць прапанаванае відэа на канчатковым экране + + + Схаваць накладку звязаных відэа + Накладка звязаных відэа ў поўнаэкранным рэжыме схавана + Накладка звязаных відэа ў поўнаэкранным рэжыме паказана + + + Схаваць метку часу відэа + Метка часу схавана + Адлюстроўваецца метка часу + + + Схаваць усплывальныя панэлі прайгравальніка + Усплывальныя панэлі прайгравальніка схаваныя + Паказваюцца ўсплывальныя панэлі прайгравальніка + + + Выйсці з поўнаэкраннага рэжыму ў канцы відэа + Адключана + Партрэт + Ландшафт + Партрэт і ландшафт + + + Открывать видео на весь экран в портретном режиме + Видео открываются на весь экран + Видео не открываются на весь экран + + + Непразрыстасць накладання прайгравальніка + Значэнне непразрыстасці паміж 0-100, дзе 0 - празрысты + Непразрыстасць накладання прайгравальніка павінна быць паміж 0-100 + + + + Адзнакі \"Не падабаецца\" часова недаступныя (час чакання API скончыўся) + Дызлайкі недаступныя (статус %d) + Недаступныя дызлайкі (ліміт API кліента) + Не падабаецца (%s) + + Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\" + + Схавана ўладальнікам + Дызлайкі паказаны + Дызлайкі не паказваюцца + Паказвайце \"не падабаецца\" на Shorts + "Дызлайкі на Shorts паказаныя Абмежаванне: дызлайкі могуць не адлюстроўвацца ў рэжыме інкогніта" - Дызлайкі на Shorts не паказаныя - Дызлайкі ў працэнтах - Дызлайкі паказаны ў працэнтах - Дызлайкі паказаны лічбай - - Кампактны дызайн кнопак «Падабаецца» і «Не падабаецца» - Кнопка \"Падабаецца\" ў стылі мінімальнай шырыні - Кнопка \"Падабаецца\", аформленая для лепшага выгляду - Паказваць прыблізную колькасць падабаек - У відэа з адключанымі лайкамі паказваецца прыблізная колькасць лайкаў - Прыблізныя лайкі не паказваюцца - Паказаць тост, калі API недаступны - Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная - Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная - Дадзеныя прадастаўляюцца Return YouTube Dislikes API. Націсніце тут, каб даведацца больш - - Статыстыка ReturnYouTubeDislike API гэтай прылады - Час водгуку API, сярэдні - Мінімальны час адказу API - Час адказу API, максімум - Час адказу API, апошняе відэа - Адзнакі \"Не падабаецца\" часова недаступныя - дзейнічае абмежаванне на частату API кліента - API выбарка галасоў, колькасць выклікаў - Сеткавыя выклікі не зроблены - Зроблена %d сеткавых выклікаў - API выбаркі галасоў, колькасць тайм-аўтаў - Час чакання сеткавых выклікаў не скончыўся - %d сеткавы выклік скончыўся - Абмежаванні хуткасці кліента API - Няма абмежаванняў кліенцкіх ставак - Ліміт кліенцкай хуткасці сустракаецца %d разоў - %d мілісекунд - - - Уключыць шырокую панэль пошуку - Уключана шырокая панэль пошуку - Шырокая панэль пошуку адключана - - - Включить миниатюры высокого качества - Миниатюры ползунка прогресса — высокого качества - Миниатюры ползунка прогресса — среднего качества - "Гэта таксама аднавіць мініатюры на трансляцыях у прамым эфіры, якія не маюць мініатюр з магчымасцю перамоткі. + Дызлайкі на Shorts не паказаныя + Дызлайкі ў працэнтах + Дызлайкі паказаны ў працэнтах + Дызлайкі паказаны лічбай + + Кампактны дызайн кнопак «Падабаецца» і «Не падабаецца» + Кнопка \"Падабаецца\" ў стылі мінімальнай шырыні + Кнопка \"Падабаецца\", аформленая для лепшага выгляду + Паказваць прыблізную колькасць падабаек + У відэа з адключанымі лайкамі паказваецца прыблізная колькасць лайкаў + Прыблізныя лайкі не паказваюцца + Паказаць тост, калі API недаступны + Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная + Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная + Дадзеныя прадастаўляюцца Return YouTube Dislikes API. Націсніце тут, каб даведацца больш + + Статыстыка ReturnYouTubeDislike API гэтай прылады + Час водгуку API, сярэдні + Мінімальны час адказу API + Час адказу API, максімум + Час адказу API, апошняе відэа + Адзнакі \"Не падабаецца\" часова недаступныя - дзейнічае абмежаванне на частату API кліента + API выбарка галасоў, колькасць выклікаў + Сеткавыя выклікі не зроблены + Зроблена %d сеткавых выклікаў + API выбаркі галасоў, колькасць тайм-аўтаў + Час чакання сеткавых выклікаў не скончыўся + %d сеткавы выклік скончыўся + Абмежаванні хуткасці кліента API + Няма абмежаванняў кліенцкіх ставак + Ліміт кліенцкай хуткасці сустракаецца %d разоў + %d мілісекунд + + + Уключыць шырокую панэль пошуку + Уключана шырокая панэль пошуку + Шырокая панэль пошуку адключана + + + Включить миниатюры высокого качества + Миниатюры ползунка прогресса — высокого качества + Миниатюры ползунка прогресса — среднего качества + "Гэта таксама аднавіць мініатюры на трансляцыях у прамым эфіры, якія не маюць мініатюр з магчымасцю перамоткі. Мініатюры з магчымасцю перамоткі будуць выкарыстоўваць тую ж якасць, што і бягучае відэа. Гэтая функцыя лепш за ўсё працуе з якасцю відэа 720p або ніжэй і пры выкарыстанні вельмі хуткага Інтэрнэт-злучэння." - Аднавіць старыя мініяцюры панэлі пошуку - Эскізы панэлі пошуку з\"явяцца над панэллю пошуку - Мініяцюры панэлі пошуку з\"явяцца ў поўнаэкранным рэжыме - - - Уключыць SponsorBlock - SponsorBlock — гэта краўдсорсінгавая сістэма, якая дазваляе прапускаць раздражняльныя фрагменты відэа на YouTube - Паглядзіце - Паказаць кнопку галасавання - Паказана кнопка сегментнага галасавання - Кнопка сегментнага галасавання не паказваецца - Выкарыстоўваць квадратную схему - Кнопкі і элементы кіравання квадратныя - Кнопкі і элементы кіравання закруглены - - Выкарыстоўваць кампактную кнопку «Прапусціць» - Кнопка \"Прапусціць\" у стылі мінімальнай шырыні - Кнопка \"Прапусціць\" аформлена для лепшага выгляду - Аўтаматычна хаваць кнопку «Прапусціць» - Кнопка \"Прапусціць\" скрываецца праз некалькі секунд - Кнопка «Прапусціць» паказана для ўсяго сегмента - Працягласць кнопкі пропуску - Як доўга паказваць кнопкі прапусціць і прапусціць да асноўнага моманту перад аўтаматычным схаваннем - Паказаць усплываючае паведамленне для адмены прапуску - Усплываючае паведамленне паказваецца, калі сегмент аўтаматычна прапускаецца. Націсніце на ўсплываючае паведамленне, каб адмяніць прапуск - Усплывальнае апавяшчэнне не паказваецца - Працягласць усплывальнага апавяшчэння пра пропуск - Як доўга паказваць паведамленне пра адмену пропуску - 1 секунда - 2 секунды - 3 секунды - 4 секунды - 5 секунд - 6 секунд - 7 секунд - 8 секунд - 9 секунд - 10 секунд - Паказаць працягласць відэа без сегментаў - Даўжыня відэа без усіх сегментаў паказваецца на шкале пракруткі - Паказана поўная даўжыня відэа - Стварэнне новых сегментаў - Паказваць кнопку «Стварыць новы сегмент» - Паказана кнопка \"Стварыць новы сегмент\" - Кнопка \"Стварыць новы сегмент\" не паказваецца - Адрэгулюйце новы крок сегмента - Колькасць мілісекунд, на якую перамяшчаюцца кнопкі рэгулявання часу пры стварэнні новых сегментаў - Значэнне павінна быць дадатным лікам - Прагляд рэкамендацый - Кіраўніцтва змяшчае правілы і парады па стварэнні новых сегментаў - Выконвайце інструкцыі - Прачытайце рэкамендацыі SponsorBlock перад стварэннем новых сегментаў - Ужо прачытаў - Пакажы мне - Генерал - Паказаць тост, калі API недаступны - Тост паказваецца, калі SponsorBlock недаступны - Тост не паказваецца, калі SponsorBlock недаступны - Уключыць адсочванне колькасці пропускаў - Дазваляе табліцы лідэраў SponsorBlock ведаць, колькі часу зэканомлена. Паведамленне адпраўляецца ў спіс лідэраў кожны раз, калі сегмент прапускаецца - Адсочванне колькасці пропускаў не ўключана - Мінімальная працягласць сегмента - Сегменты, карацейшыя за гэта значэнне (у секундах), не будуць паказвацца або прапускацца - Неверная продолжительность - Ваш асабісты ідэнтыфікатар карыстальніка - Гэта павінна быць прыватным. Гэта як пароль, і яго нельга нікому паведамляць. Калі ў кагосьці гэта ёсць, ён можа выдаваць сябе за вас - Прыватны ідэнтыфікатар карыстальніка павінен быць не менш за 30 сімвалаў - Змяніць URL API - Адрас, які SponsorBlock выкарыстоўвае для званкоў на сервер - Скід URL API - URL API няправільны - URL API зменены - Налады імпарту/экспарту - Копія - Ваша канфігурацыя JSON SponsorBlock, якую можна імпартаваць/экспартаваць у ReVanced і іншыя платформы SponsorBlock - Ваша канфігурацыя JSON SponsorBlock, якую можна імпартаваць/экспартаваць у ReVanced і іншыя платформы SponsorBlock. Гэта ўключае ў сябе ваш асабісты ідэнтыфікатар карыстальніка. Абавязкова падзяліцеся гэтым з розумам - Налады паспяхова імпартаваны - Не ўдалося імпартаваць: %s - Не ўдалося экспартаваць: %s - "Вашы налады ўтрымліваюць асабісты ідэнтыфікатар SponsorBlock. + Аднавіць старыя мініяцюры панэлі пошуку + Эскізы панэлі пошуку з\"явяцца над панэллю пошуку + Мініяцюры панэлі пошуку з\"явяцца ў поўнаэкранным рэжыме + + + Уключыць SponsorBlock + SponsorBlock — гэта краўдсорсінгавая сістэма, якая дазваляе прапускаць раздражняльныя фрагменты відэа на YouTube + Паглядзіце + Паказаць кнопку галасавання + Паказана кнопка сегментнага галасавання + Кнопка сегментнага галасавання не паказваецца + Выкарыстоўваць квадратную схему + Кнопкі і элементы кіравання квадратныя + Кнопкі і элементы кіравання закруглены + + Выкарыстоўваць кампактную кнопку «Прапусціць» + Кнопка \"Прапусціць\" у стылі мінімальнай шырыні + Кнопка \"Прапусціць\" аформлена для лепшага выгляду + Аўтаматычна хаваць кнопку «Прапусціць» + Кнопка \"Прапусціць\" скрываецца праз некалькі секунд + Кнопка «Прапусціць» паказана для ўсяго сегмента + Працягласць кнопкі пропуску + Як доўга паказваць кнопкі прапусціць і прапусціць да асноўнага моманту перад аўтаматычным схаваннем + Паказаць усплываючае паведамленне для адмены прапуску + Усплываючае паведамленне паказваецца, калі сегмент аўтаматычна прапускаецца. Націсніце на ўсплываючае паведамленне, каб адмяніць прапуск + Усплывальнае апавяшчэнне не паказваецца + Працягласць усплывальнага апавяшчэння пра пропуск + Як доўга паказваць паведамленне пра адмену пропуску + 1 секунда + 2 секунды + 3 секунды + 4 секунды + 5 секунд + 6 секунд + 7 секунд + 8 секунд + 9 секунд + 10 секунд + Паказаць працягласць відэа без сегментаў + Даўжыня відэа без усіх сегментаў паказваецца на шкале пракруткі + Паказана поўная даўжыня відэа + Стварэнне новых сегментаў + Паказваць кнопку «Стварыць новы сегмент» + Паказана кнопка \"Стварыць новы сегмент\" + Кнопка \"Стварыць новы сегмент\" не паказваецца + Адрэгулюйце новы крок сегмента + Колькасць мілісекунд, на якую перамяшчаюцца кнопкі рэгулявання часу пры стварэнні новых сегментаў + Значэнне павінна быць дадатным лікам + Прагляд рэкамендацый + Кіраўніцтва змяшчае правілы і парады па стварэнні новых сегментаў + Выконвайце інструкцыі + Прачытайце рэкамендацыі SponsorBlock перад стварэннем новых сегментаў + Ужо прачытаў + Пакажы мне + Генерал + Паказаць тост, калі API недаступны + Тост паказваецца, калі SponsorBlock недаступны + Тост не паказваецца, калі SponsorBlock недаступны + Уключыць адсочванне колькасці пропускаў + Дазваляе табліцы лідэраў SponsorBlock ведаць, колькі часу зэканомлена. Паведамленне адпраўляецца ў спіс лідэраў кожны раз, калі сегмент прапускаецца + Адсочванне колькасці пропускаў не ўключана + Мінімальная працягласць сегмента + Сегменты, карацейшыя за гэта значэнне (у секундах), не будуць паказвацца або прапускацца + Неверная продолжительность + Ваш асабісты ідэнтыфікатар карыстальніка + Гэта павінна быць прыватным. Гэта як пароль, і яго нельга нікому паведамляць. Калі ў кагосьці гэта ёсць, ён можа выдаваць сябе за вас + Прыватны ідэнтыфікатар карыстальніка павінен быць не менш за 30 сімвалаў + Змяніць URL API + Адрас, які SponsorBlock выкарыстоўвае для званкоў на сервер + Скід URL API + URL API няправільны + URL API зменены + Налады імпарту/экспарту + Копія + Ваша канфігурацыя JSON SponsorBlock, якую можна імпартаваць/экспартаваць у ReVanced і іншыя платформы SponsorBlock + Ваша канфігурацыя JSON SponsorBlock, якую можна імпартаваць/экспартаваць у ReVanced і іншыя платформы SponsorBlock. Гэта ўключае ў сябе ваш асабісты ідэнтыфікатар карыстальніка. Абавязкова падзяліцеся гэтым з розумам + Налады паспяхова імпартаваны + Не ўдалося імпартаваць: %s + Не ўдалося экспартаваць: %s + "Вашы налады ўтрымліваюць асабісты ідэнтыфікатар SponsorBlock. Ваш ідэнтыфікатар карыстальніка падобны да пароля, і яго ніколі не варта дзяліцца. " - Больш не паказваць - Змяніць паводзіны сегмента - Спонсар - Платнае прасоўванне, платныя рэфералы і прамая рэклама. Не для самарэкламы або бясплатных выкрыкаў справам/стваральнікам/вэб-сайтам/прадуктам, якія ім падабаюцца - Неаплатнае/самарэклама - Аналогічна спонсарству, але для неаплачваемай або ўласнай рэкламы. Уключае раздзелы аб таварах, ахвяраваннях або інфармацыі аб тым, з кім яны супрацоўнічалі - Напамін аб узаемадзеянні (падпісацца) - Кароткі напамін паставіць лайкі, падпісацца або падпісацца на іх у сярэдзіне кантэнту. Калі ён доўгі або прысвечаны нечаму канкрэтнаму, ён павінен адпавядаць самарэкламе - Вылучыць - Частка відэа, якую шукае большасць людзей - Антракт/Уступная анімацыя - Інтэрвал без фактычнага зместу. Гэта можа быць паўза, статычны кадр або паўтаральная анімацыя. Не ўключае пераходы, якія змяшчаюць інфармацыю - Канцоўкі / Цітры - Крэдыты або калі з\"яўляюцца канцавыя карткі YouTube. Не для высноў з інфармацыяй - Уступ / Прывітанні - Агучаныя трэйлеры для будучага відэа, прывітанні і развітанні. Не ўключае раздзелы, якія дадаюць дадатковы змест - Прадпрагляд / Паўтарэнне - Калекцыя кліпаў, якія паказваюць, што адбываецца або што адбылося ў відэа ці ў іншых відэа серыі, дзе ўся інфармацыя паўтараецца ў іншым месцы - Лірычнае адступленне / Жарты - Тангенцыяльныя сцэны або жарты, якія не патрабуюцца для разумення асноўнага зместу відэа. Не ўключае раздзелы, якія прадастаўляюць кантэкст або фонавыя дэталі - Музыка: немузычны раздзел - Толькі для выкарыстання ў музычных відэа. Раздзелы музычных відэа без музыкі, якія яшчэ не ахоплены іншай катэгорыяй - Прапусціць - Вылучыць - Прапусціць спонсар - Прапусціць прома - Прапусціць ўзаемадзеянне - Перайсці да вылучэння - Прапусціць уступ - Прапусціць антракт - Прапусціць антракт - Прапусціць іншы - Прапусціць уступ - Прапусціць папярэдні прагляд - Прапусціць папярэдні прагляд - Прапусціць рэзюмэ - Прапусціць тангенс - Прапусціць не музыку - Прапусціць сегмент - Прапусціў спонсара - Прапусціў самарэкламу - Прапушчаны надакучлівы напамін - Прапушчана, каб вылучыць - Прапушчаны ўступ - Прапушчаны антракт - Прапушчаны антракт - Прапушчаны выхад - Уступ прапушчаны - Прапушчаны папярэдні прагляд - Прапушчаны папярэдні прагляд - Прапушчаны рэзюмэ - Тангенс прапушчаны - Прапусціў немузычны раздзел - Прапушчаны неадпраўлены сегмент - Прапушчаны некалькі сегментаў - Прапусціць аўтаматычна - Прапусціць аўтаматычна адзін раз - Паказваць кнопку «Прапусціць» - Паказаць на панэлі пошуку - Адключыць - Немагчыма адправіць сегмент: %s - SponsorBlock часова не працуе - Немагчыма адправіць сегмент (статус: %1$d %2$s) - Немагчыма адправіць сегмент. Абмежаванне па хуткасці (занадта шмат ад аднаго і таго ж карыстальніка або IP-адраса) - Немагчыма адправіць сегмент: %s - "Немагчыма адправіць сегмент. + Больш не паказваць + Змяніць паводзіны сегмента + Спонсар + Платнае прасоўванне, платныя рэфералы і прамая рэклама. Не для самарэкламы або бясплатных выкрыкаў справам/стваральнікам/вэб-сайтам/прадуктам, якія ім падабаюцца + Неаплатнае/самарэклама + Аналогічна спонсарству, але для неаплачваемай або ўласнай рэкламы. Уключае раздзелы аб таварах, ахвяраваннях або інфармацыі аб тым, з кім яны супрацоўнічалі + Напамін аб узаемадзеянні (падпісацца) + Кароткі напамін паставіць лайкі, падпісацца або падпісацца на іх у сярэдзіне кантэнту. Калі ён доўгі або прысвечаны нечаму канкрэтнаму, ён павінен адпавядаць самарэкламе + Вылучыць + Частка відэа, якую шукае большасць людзей + Антракт/Уступная анімацыя + Інтэрвал без фактычнага зместу. Гэта можа быць паўза, статычны кадр або паўтаральная анімацыя. Не ўключае пераходы, якія змяшчаюць інфармацыю + Канцоўкі / Цітры + Крэдыты або калі з\"яўляюцца канцавыя карткі YouTube. Не для высноў з інфармацыяй + Уступ / Прывітанні + Агучаныя трэйлеры для будучага відэа, прывітанні і развітанні. Не ўключае раздзелы, якія дадаюць дадатковы змест + Прадпрагляд / Паўтарэнне + Калекцыя кліпаў, якія паказваюць, што адбываецца або што адбылося ў відэа ці ў іншых відэа серыі, дзе ўся інфармацыя паўтараецца ў іншым месцы + Лірычнае адступленне / Жарты + Тангенцыяльныя сцэны або жарты, якія не патрабуюцца для разумення асноўнага зместу відэа. Не ўключае раздзелы, якія прадастаўляюць кантэкст або фонавыя дэталі + Музыка: немузычны раздзел + Толькі для выкарыстання ў музычных відэа. Раздзелы музычных відэа без музыкі, якія яшчэ не ахоплены іншай катэгорыяй + Прапусціць + Вылучыць + Прапусціць спонсар + Прапусціць прома + Прапусціць ўзаемадзеянне + Перайсці да вылучэння + Прапусціць уступ + Прапусціць антракт + Прапусціць антракт + Прапусціць іншы + Прапусціць уступ + Прапусціць папярэдні прагляд + Прапусціць папярэдні прагляд + Прапусціць рэзюмэ + Прапусціць тангенс + Прапусціць не музыку + Прапусціць сегмент + Прапусціў спонсара + Прапусціў самарэкламу + Прапушчаны надакучлівы напамін + Прапушчана, каб вылучыць + Прапушчаны ўступ + Прапушчаны антракт + Прапушчаны антракт + Прапушчаны выхад + Уступ прапушчаны + Прапушчаны папярэдні прагляд + Прапушчаны папярэдні прагляд + Прапушчаны рэзюмэ + Тангенс прапушчаны + Прапусціў немузычны раздзел + Прапушчаны неадпраўлены сегмент + Прапушчаны некалькі сегментаў + Прапусціць аўтаматычна + Прапусціць аўтаматычна адзін раз + Паказваць кнопку «Прапусціць» + Паказаць на панэлі пошуку + Адключыць + Немагчыма адправіць сегмент: %s + SponsorBlock часова не працуе + Немагчыма адправіць сегмент (статус: %1$d %2$s) + Немагчыма адправіць сегмент. Абмежаванне па хуткасці (занадта шмат ад аднаго і таго ж карыстальніка або IP-адраса) + Немагчыма адправіць сегмент: %s + "Немагчыма адправіць сегмент. Ужо існуе" - Сегмент паспяхова адпраўлены - - SponsorBlock часова недаступны (час чакання API скончыўся) - SponsorBlock часова недаступны (статус %d) - SponsorBlock часова недаступны - Немагчыма прагаласаваць за сегмент (тайм-аўт API скончыўся) - Немагчыма прагаласаваць за сегмент (статус: %1$d %2$s) - Немагчыма прагаласаваць за сегмент: %s - Прагаласаваць за - Галасаваць супраць - Змяніць катэгорыю - Няма сегментаў для галасавання - - %1$s да %2$s - Выберыце катэгорыю сегмента - Катэгорыя адключана ў наладах. Уключыце катэгорыю для адпраўкі. - Новы сегмент SponsorBlock - Усталяваць %s у якасці пачатку або канца новага сегмента? - Пачатак - Канец - Цяпер - Час пачатку сегмента - Час заканчэння сегмента - Ці правільны час? - "Сэгмэнт знаходзіцца паміж + Сегмент паспяхова адпраўлены + + SponsorBlock часова недаступны (час чакання API скончыўся) + SponsorBlock часова недаступны (статус %d) + SponsorBlock часова недаступны + Немагчыма прагаласаваць за сегмент (тайм-аўт API скончыўся) + Немагчыма прагаласаваць за сегмент (статус: %1$d %2$s) + Немагчыма прагаласаваць за сегмент: %s + Прагаласаваць за + Галасаваць супраць + Змяніць катэгорыю + Няма сегментаў для галасавання + + %1$s да %2$s + Выберыце катэгорыю сегмента + Катэгорыя адключана ў наладах. Уключыце катэгорыю для адпраўкі. + Новы сегмент SponsorBlock + Усталяваць %s у якасці пачатку або канца новага сегмента? + Пачатак + Канец + Цяпер + Час пачатку сегмента + Час заканчэння сегмента + Ці правільны час? + "Сэгмэнт знаходзіцца паміж %1$s да @@ -1282,46 +1281,46 @@ Second \"item\" text" (%3$s) Гатовыя адправіць?" - Пачынаць трэба раней за канец - Спачатку адзначце два месцы на панэлі часу - Папярэдні прагляд сегмента і пераканайцеся, што ён праходзіць плаўна - Рэдагаваць час сегмента ўручную - Вы жадаеце змяніць час для пачатку або канца сегмента? - Указаны няправільны час - Статыстыка - - Статыстыка часова недаступная (API не працуе) - Загрузка... - SponsorBlock адключаны - Ваша імя карыстальніка: <b>%s</b> - Націсніце тут, каб змяніць імя карыстальніка - Немагчыма змяніць імя карыстальніка: Статус: %1$d %2$s - Імя карыстальніка паспяхова зменена - Ваша рэпутацыя <b>%.2f</b> - Вы стварылі <b>%s</b> сегменты - Коснитесь, чтобы просмотреть ваши сегменты - Табліца лідэраў SponsorBlock - Вы выратавалі людзей з <b>%s</b> сегменты - Націсніце тут, каб убачыць глабальную статыстыку і вядучых удзельнікаў - Гэта <b>%s</b> іх жыцця.<br>Націсніце тут, каб убачыць табліцу лідэраў - Вы прапусцілі <b>%s</b> сегменты - Гэта <b>%s</b> - Скінуць лічыльнік прапушчаных сегментаў? - %1$s гадзін %2$s хвілін - %1$s хвілін %2$s секунд - %s секунд - Непразрыстасць: - колер: - Пра праграму - Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў - - - Фармат экрана - Па змаўчанню - Тэлефон - Планшэт - Аўтамабільны - "Змены ўключаюць: + Пачынаць трэба раней за канец + Спачатку адзначце два месцы на панэлі часу + Папярэдні прагляд сегмента і пераканайцеся, што ён праходзіць плаўна + Рэдагаваць час сегмента ўручную + Вы жадаеце змяніць час для пачатку або канца сегмента? + Указаны няправільны час + Статыстыка + + Статыстыка часова недаступная (API не працуе) + Загрузка... + SponsorBlock адключаны + Ваша імя карыстальніка: <b>%s</b> + Націсніце тут, каб змяніць імя карыстальніка + Немагчыма змяніць імя карыстальніка: Статус: %1$d %2$s + Імя карыстальніка паспяхова зменена + Ваша рэпутацыя <b>%.2f</b> + Вы стварылі <b>%s</b> сегменты + Коснитесь, чтобы просмотреть ваши сегменты + Табліца лідэраў SponsorBlock + Вы выратавалі людзей з <b>%s</b> сегменты + Націсніце тут, каб убачыць глабальную статыстыку і вядучых удзельнікаў + Гэта <b>%s</b> іх жыцця.<br>Націсніце тут, каб убачыць табліцу лідэраў + Вы прапусцілі <b>%s</b> сегменты + Гэта <b>%s</b> + Скінуць лічыльнік прапушчаных сегментаў? + %1$s гадзін %2$s хвілін + %1$s хвілін %2$s секунд + %s секунд + Непразрыстасць: + колер: + Пра праграму + Дадзеныя прадастаўляюцца API SponsorBlock. Націсніце тут, каб даведацца больш і паглядзець спампоўкі для іншых платформаў + + + Фармат экрана + Па змаўчанню + Тэлефон + Планшэт + Аўтамабільны + "Змены ўключаюць: Макет для планшэта • Паведамленні супольнасці схаваныя @@ -1329,314 +1328,312 @@ Second \"item\" text" Аўтамабільны макет • Shorts адкрываюцца ў звычайным плэеры • Стужка арганізавана па тэмах і каналах" - - - Версія праграмы Spoof - Версія падробленая - Версія не падробленая - "Версія прыкладання будзе падроблены да старэйшай версіі YouTube. + + + Версія праграмы Spoof + Версія падробленая + Версія не падробленая + "Версія прыкладання будзе падроблены да старэйшай версіі YouTube. Гэта зменіць знешні выгляд і функцыі прыкладання, але могуць узнікнуць невядомыя пабочныя эфекты. Калі пазней будзе адключана, рэкамендуецца ачысціць даныя прыкладання, каб пазбегнуць памылак у інтэрфейсе." - Падробка мэтавай версіі праграмы - 20.13.41 - Аднавіць не згорнуты радок дзеянняў відэа - 20.05.46 - Аднавіць функцыянальнасць стэнаграмы - 19.35.36 — Восстановить старые значки плеера Shorts - 19.01.34 - Аднаўленне старых значкоў навігацыі - - - Змяніць стартавую старонку - Па змаўчанні - Усе падпіскі - Обзор каналов - Курсы / Адукацыя - Дасьледуйце - Мода і прыгажосць - Игры - Гісторыя - Библиотека - Спадабаліся відэа - В прямом эфире - Фильмы - Музыка - Навіны - Апавяшчэнні - Спісы прайгравання - Пошук - Пакупкі - Спорт - Падпіскі - У трэндзе - Віртуальная рэальнасць - Посмотреть позже - Вашыя кліпы - Заўсёды змяняць стартавую старонку - "Стартавая старонка заўсёды зменена + Падробка мэтавай версіі праграмы + 20.13.41 - Аднавіць не згорнуты радок дзеянняў відэа + 20.05.46 - Аднавіць функцыянальнасць стэнаграмы + 19.35.36 — Восстановить старые значки плеера Shorts + 19.01.34 - Аднаўленне старых значкоў навігацыі + + + Змяніць стартавую старонку + Па змаўчанні + Усе падпіскі + Обзор каналов + Курсы / Адукацыя + Дасьледуйце + Мода і прыгажосць + Игры + Гісторыя + Библиотека + Спадабаліся відэа + В прямом эфире + Фильмы + Музыка + Навіны + Апавяшчэнні + Спісы прайгравання + Пошук + Пакупкі + Спорт + Падпіскі + У трэндзе + Віртуальная рэальнасць + Посмотреть позже + Вашыя кліпы + Заўсёды змяняць стартавую старонку + "Стартавая старонка заўсёды зменена Абмежаванне: выкарыстанне кнопкі «Назад» на панэлі інструментаў можа не працаваць" - Стартавая старонка змяняецца толькі пры запуску праграмы - - - Адключыць аднаўленне прайгравання Shorts - Прайгравальнік Shorts не аднаўляецца пры запуску праграмы - Прайгравальнік Shorts адновіцца пры запуску праграмы - - - Адкрыць Shorts з - Прайгравальнік Shorts - Звычайны прайгравальнік - Звычайны прайгравальнік на ўвесь экран - - - Автовоспроизведение Shorts - Shorts будут воспроизводиться автоматически - Shorts будут повторяться - Автовоспроизведение Shorts в фоновом режиме - Shorts в фоновом режиме будут воспроизводиться автоматически - Shorts в фоновом режиме будут повторяться - - - Міні-плэер - Змяніць стыль згорнутага прайгравальніка ў праграме - Тып мініплэера - Інваліды - Па змаўчанні - Минимальный - Планшэт - Сучасны 1 - Сучасны 2 - Сучасны 3 - Сучасны 4 - Адключыць закругленыя вуглы - Углы квадратные - Углы закруглены - Включить двойное нажатие и масштабирование с помощьющипка - "Уключана дзеянне «подвойнае націсканне» і «шчыпкі для змены памеру» + Стартавая старонка змяняецца толькі пры запуску праграмы + + + Адключыць аднаўленне прайгравання Shorts + Прайгравальнік Shorts не аднаўляецца пры запуску праграмы + Прайгравальнік Shorts адновіцца пры запуску праграмы + + + Адкрыць Shorts з + Прайгравальнік Shorts + Звычайны прайгравальнік + Звычайны прайгравальнік на ўвесь экран + + + Автовоспроизведение Shorts + Shorts будут воспроизводиться автоматически + Shorts будут повторяться + Автовоспроизведение Shorts в фоновом режиме + Shorts в фоновом режиме будут воспроизводиться автоматически + Shorts в фоновом режиме будут повторяться + + + Міні-плэер + Змяніць стыль згорнутага прайгравальніка ў праграме + Тып мініплэера + Інваліды + Па змаўчанні + Минимальный + Планшэт + Сучасны 1 + Сучасны 2 + Сучасны 3 + Сучасны 4 + Адключыць закругленыя вуглы + Углы квадратные + Углы закруглены + Включить двойное нажатие и масштабирование с помощьющипка + "Уключана дзеянне «подвойнае націсканне» і «шчыпкі для змены памеру» • Подвойнае націсканне, каб павялічыць памер міні-прайгравальніка • Подвойнае націсканне яшчэ раз, каб аднавіць першапачатковы памер" - Двойное нажатие и scalewithpinch отключены - Адключыць перацягванне - Перетаскивание отключено - "Уключана перацягванне і кіданне + Двойное нажатие и scalewithpinch отключены + Адключыць перацягванне + Перетаскивание отключено + "Уключана перацягванне і кіданне Міні-прайгравальнік можна перацягнуць у любы куток экрана" - Адключыць гарызантальны жэст перацягвання - Горизонтальный жест перетаскивания отключен - "Уключаны жэст гарызантальнага перацягвання + Адключыць гарызантальны жэст перацягвання + Горизонтальный жест перетаскивания отключен + "Уключаны жэст гарызантальнага перацягвання Міні-прайгравальнік можна перацягнуць за межы экрана ўлева ці ўправа" - Схаваць кнопкі накладання - Кнопкі накладання схаваныя - Кнопкі накладання паказаны - Схаваць падтэксты - Падтэксты схаваныя - Паказваюцца падтэксты - Схаваць кнопкі пераходу наперад і назад - Пераход наперад і назад схаваны - Паказваецца пераход наперад і назад - Размер по умолчанию - Начальная размер на экране в пикселях - Размер пикселя должен быть в пределах %1$s и %2$s - Непразрыстасць накладання - Значэнне непразрыстасці паміж 0-100, дзе 0 - празрысты - Непразрыстасць накладання міні-плэера павінна быць ад 0 да 100 - - - Уключыць градыентны экран загрузкі - Экран загрузкі будзе мець градыентны фон - Экран загрузкі будзе мець суцэльны фон - Стыль застаўкі - Колер - Чорна-белы - Уключыць уласны колер панэлі пошуку - Паказваецца карыстальніцкі колер панэлі пошуку - Паказаны зыходны колер панэлі пошуку - Спецыяльны колер пошуку - Колер пошуку - Спецыяльны акцэнтны колер пошуку - Акцэнтны колер пошуку - Неверное значение цвета ползунка прогресса - - - - - Лагатып загалоўка - Па змаўчанні - Звычайны - - ReVanced мінімальны - Карыстальніцкі - - - Абыход абмежаванняў рэгіёну - Выкарыстанне хаста відарысаў yt4.ggpht.com - "Выкарыстоўваецца арыгінальны хост малюнкаў + Схаваць кнопкі накладання + Кнопкі накладання схаваныя + Кнопкі накладання паказаны + Схаваць падтэксты + Падтэксты схаваныя + Паказваюцца падтэксты + Схаваць кнопкі пераходу наперад і назад + Пераход наперад і назад схаваны + Паказваецца пераход наперад і назад + Размер по умолчанию + Начальная размер на экране в пикселях + Размер пикселя должен быть в пределах %1$s и %2$s + Непразрыстасць накладання + Значэнне непразрыстасці паміж 0-100, дзе 0 - празрысты + Непразрыстасць накладання міні-плэера павінна быць ад 0 да 100 + + + Уключыць градыентны экран загрузкі + Экран загрузкі будзе мець градыентны фон + Экран загрузкі будзе мець суцэльны фон + Стыль застаўкі + Колер + Чорна-белы + Уключыць уласны колер панэлі пошуку + Паказваецца карыстальніцкі колер панэлі пошуку + Паказаны зыходны колер панэлі пошуку + Спецыяльны колер пошуку + Колер пошуку + Спецыяльны акцэнтны колер пошуку + Акцэнтны колер пошуку + Неверное значение цвета ползунка прогресса + + + + Лагатып загалоўка + Па змаўчанні + Звычайны + + ReVanced мінімальны + Карыстальніцкі + + + Абыход абмежаванняў рэгіёну + Выкарыстанне хаста відарысаў yt4.ggpht.com + "Выкарыстоўваецца арыгінальны хост малюнкаў Уключэнне гэтага можа выправіць праблему з адсутнасцю малюнкаў, якія заблакаваны ў некаторых рэгіёнах" - - - - Галоўная ўкладка - - Укладка «Падпіскі» - - Вы ўкладка - Плэйлісты прайгравальніка & рэкамендацыі - Вынікі пошуку - Арыгінальныя мініяцюры - DeArrow & Арыгінальныя мініяцюры - DeArrow & Усё ж захоплівае - Усё ж захоплівае - "DeArrow забяспечвае мініатюры для відэа YouTube, якія збіраюцца ад карыстальнікаў. Гэтыя мініатюры часта больш актуальныя, чым тыя, якія прадастаўляецца YouTube. + + + + Галоўная ўкладка + + Укладка «Падпіскі» + + Вы ўкладка + Плэйлісты прайгравальніка & рэкамендацыі + Вынікі пошуку + Арыгінальныя мініяцюры + DeArrow & Арыгінальныя мініяцюры + DeArrow & Усё ж захоплівае + Усё ж захоплівае + "DeArrow забяспечвае мініатюры для відэа YouTube, якія збіраюцца ад карыстальнікаў. Гэтыя мініатюры часта больш актуальныя, чым тыя, якія прадастаўляецца YouTube. Калі ўключана, URL відэа будуць адпраўлены на сервер API, і ніякія іншыя даныя не адпраўляюцца. Калі відэа не мае мініатюр DeArrow, то паказваюцца арыгінальныя або здымкі. Націсніце тут, каб даведацца больш пра DeArrow" - Паказаць тост, калі API недаступны - Тост паказваецца, калі DeArrow недаступны - Тост не паказваецца, калі DeArrow недаступны - Канчатковая кропка DeArrow API - URL канчатковай кропкі кэша мініяцюр DeArrow - Захопы нерухомага відэа - Нерухомыя здымкі робяцца з пачатку/сярэдзіны/канца кожнага відэа. Гэтыя выявы ўбудаваны ў YouTube, і знешні API не выкарыстоўваецца - Выкарыстоўвайце хуткія фотаздымкі - Выкарыстанне сярэдняй якасці па-ранейшаму захоплівае. Эскізы будуць загружацца хутчэй, але жывыя трансляцыі, невыдадзеныя або вельмі старыя відэа могуць паказваць пустыя мініяцюры - Выкарыстанне высакаякасных здымкаў - Час відэа для здымкі кадраў - Пачатак відэа - Сярэдзіна відэа - Канец відэа - - DeArrow часова недаступны (код стану: %s) - DeArrow часова недаступны - - - Паказаць аб\"явы ReVanced - Анонсы пры запуску паказаны - Анонсы пры запуску не паказаны - Паказваць аб\"явы пры запуску - Не ўдалося падключыцца да пастаўшчыка аб\"яў - расслабіцца - - - Уключыць зацыкленае відэа - Відэа будзе зацыклена - Відэа не будзе зацыклена - - - Паказаць кнопку зацыклення відэа - Кнопка паказана - Кнопка не паказваецца - Зацыкленне відэа ўключана - Зацыкленне відэа выключана - - - - - Памеры падманнага прылады - "Памеры прылады падроблены + Паказаць тост, калі API недаступны + Тост паказваецца, калі DeArrow недаступны + Тост не паказваецца, калі DeArrow недаступны + Канчатковая кропка DeArrow API + URL канчатковай кропкі кэша мініяцюр DeArrow + Захопы нерухомага відэа + Нерухомыя здымкі робяцца з пачатку/сярэдзіны/канца кожнага відэа. Гэтыя выявы ўбудаваны ў YouTube, і знешні API не выкарыстоўваецца + Выкарыстоўвайце хуткія фотаздымкі + Выкарыстанне сярэдняй якасці па-ранейшаму захоплівае. Эскізы будуць загружацца хутчэй, але жывыя трансляцыі, невыдадзеныя або вельмі старыя відэа могуць паказваць пустыя мініяцюры + Выкарыстанне высакаякасных здымкаў + Час відэа для здымкі кадраў + Пачатак відэа + Сярэдзіна відэа + Канец відэа + + DeArrow часова недаступны (код стану: %s) + DeArrow часова недаступны + + + Паказаць аб\"явы ReVanced + Анонсы пры запуску паказаны + Анонсы пры запуску не паказаны + Паказваць аб\"явы пры запуску + Не ўдалося падключыцца да пастаўшчыка аб\"яў + расслабіцца + + + Уключыць зацыкленае відэа + Відэа будзе зацыклена + Відэа не будзе зацыклена + + + Паказаць кнопку зацыклення відэа + Кнопка паказана + Кнопка не паказваецца + Зацыкленне відэа ўключана + Зацыкленне відэа выключана + + + + Памеры падманнага прылады + "Памеры прылады падроблены Магчыма, будуць разблакаваны больш высокія якасці відэа, але вы можаце сутыкнуцца з заіканнем відэа, горшым тэрмінам службы батарэі і невядомымі пабочнымі эфектамі" - "Памеры прылады не падроблены + "Памеры прылады не падроблены Уключэнне гэтага можа разблакаваць больш высокія якасці відэа" - Уключэнне гэтага можа прывесці да прыпынкаў прайгравання відэа, пагаршэння тэрміну службы батарэі і невядомых пабочных эфектаў. - - - Тактыльная зваротная сувязь - Змяніць тактыльную зваротную сувязь - Адключыць тактыльныя эфекты раздзелаў - Тактыльныя эфекты раздзелаў адключаны - Тактыльныя эфекты раздзелаў уключаны - Адключыць тактыльны эфект дакладнага пошуку - Дакладны тактыльны эфект пошуку адключаны - Тактыльны эфект дакладнага пошуку ўключаны - Адключыць тактыльны эфект адмены пошуку - Тактыльны эфект адмены пошуку адключаны - Тактыльны эфект адмены пошуку ўключаны - Адключыць тактыльны эфект маштабавання - Тактыльны эфект маштабавання адключаны - Тактыльны эфект маштабавання ўключаны - - - Калі вы нядаўна змянілі даныя для ўваходу ў свой уліковы запіс, выдаліце і пераўсталюйце MicroG. - - - Абыход URL-перанакіраванняў - Перанакіраванне URL абыходзіць - URL-перанакіраванні не абыходзяць - - - Адкрываць спасылкі ў браўзеры - Адкрыццё спасылак у знешнім браўзеры - Адкрыццё спасылак ва ўбудаваным браўзеры - - - - Аўто - Запомніце змены якасці відэа - Змены якасці распаўсюджваюцца на ўсе відэа - Змены якасці прымяняюцца толькі да бягучага відэа - Паказваць усплывальнае паведамленне пры змене якасці відэа - Усплывальнае паведамленне паказваецца пры змене якасці відэа па змаўчанні - Усплывальнае паведамленне не паказваецца пры змене якасці відэа па змаўчанні - Стандартная якасць відэа ў сетцы Wi-Fi - Стандартная якасць відэа ў мабільнай сетцы - Запомніць змены якасці Shorts - Змены якасці прымяняюцца да ўсіх Shorts - Змены якасці прымяняюцца толькі да бягучага Short - Якасць Shorts па змаўчанні ў сетцы Wi-Fi - Якасць Shorts па змаўчанні ў мабільнай сетцы - мабільны - wi-fi - Стандартная якасць %1$s зменена на: %2$s - Якасць Shorts %1$s зменена на: %2$s - - - Паказаць дыялогавую кнопку хуткасці - Кнопка дыялогу хуткасці паказана. Націсніце і ўтрымлівайце, каб скінуць хуткасць прайгравання да значэння па змаўчанні - Кнопка дыялогу хуткасці не паказана - - - Паказаць кнопку якасці відэа - Кнопка якасці відэа паказана. Націсніце і ўтрымлівайце, каб скінуць якасць да значэння па змаўчанні - Кнопка якасці відэа не паказана - - - Меню пользовательской скорости воспроизведения - Меню пользовательской скорости отображается - Меню пользовательской скорости не отображается - Аднавіць старое меню хуткасці прайгравання - Паказана старое меню хуткасці - Паказана сучаснае меню хуткасці - Карыстальніцкія хуткасці прайгравання - Добавьте или измените пользовательскую скорость воспроизведения - Нестандартныя хуткасці павінны быць менш за %s - Несапраўдныя нестандартныя хуткасці прайгравання - Аўто - Уласны хуткасць націску і ўтрымання - Хуткасць прайгравання між 0-8 - - - Запомніце змены хуткасці прайгравання - Змяненні хуткасці прайгравання прымяняюцца да ўсіх відэа - Змены хуткасці прайгравання прымяняюцца толькі да бягучага відэа - Паказваць усплывальнае паведамленне пры змене хуткасці прайгравання - Усплывальнае паведамленне паказваецца пры змене хуткасці прайгравання па змаўчанні - Усплывальнае паведамленне не паказваецца, калі хуткасць прайгравання па змаўчанні зменена - Стандартная хуткасць прайгравання - Хуткасць па змаўчанні зменена на: %s - - - Адключыць відэа ў фармаце HDR - Відэа ў фармаце HDR адключана - Відэа ў фармаце HDR уключана - Прымусіць AVC (H.264) - Відэакодэк прымусова ўсталяваны на AVC (H.264) - Відэакодэк вызначаецца аўтаматычна - "Перавагі: + Уключэнне гэтага можа прывесці да прыпынкаў прайгравання відэа, пагаршэння тэрміну службы батарэі і невядомых пабочных эфектаў. + + + Тактыльная зваротная сувязь + Змяніць тактыльную зваротную сувязь + Адключыць тактыльныя эфекты раздзелаў + Тактыльныя эфекты раздзелаў адключаны + Тактыльныя эфекты раздзелаў уключаны + Адключыць тактыльны эфект дакладнага пошуку + Дакладны тактыльны эфект пошуку адключаны + Тактыльны эфект дакладнага пошуку ўключаны + Адключыць тактыльны эфект адмены пошуку + Тактыльны эфект адмены пошуку адключаны + Тактыльны эфект адмены пошуку ўключаны + Адключыць тактыльны эфект маштабавання + Тактыльны эфект маштабавання адключаны + Тактыльны эфект маштабавання ўключаны + + + Калі вы нядаўна змянілі даныя для ўваходу ў свой уліковы запіс, выдаліце і пераўсталюйце MicroG. + + + Абыход URL-перанакіраванняў + Перанакіраванне URL абыходзіць + URL-перанакіраванні не абыходзяць + + + Адкрываць спасылкі ў браўзеры + Адкрыццё спасылак у знешнім браўзеры + Адкрыццё спасылак ва ўбудаваным браўзеры + + + + Аўто + Запомніце змены якасці відэа + Змены якасці распаўсюджваюцца на ўсе відэа + Змены якасці прымяняюцца толькі да бягучага відэа + Паказваць усплывальнае паведамленне пры змене якасці відэа + Усплывальнае паведамленне паказваецца пры змене якасці відэа па змаўчанні + Усплывальнае паведамленне не паказваецца пры змене якасці відэа па змаўчанні + Стандартная якасць відэа ў сетцы Wi-Fi + Стандартная якасць відэа ў мабільнай сетцы + Запомніць змены якасці Shorts + Змены якасці прымяняюцца да ўсіх Shorts + Змены якасці прымяняюцца толькі да бягучага Short + Якасць Shorts па змаўчанні ў сетцы Wi-Fi + Якасць Shorts па змаўчанні ў мабільнай сетцы + мабільны + wi-fi + Стандартная якасць %1$s зменена на: %2$s + Якасць Shorts %1$s зменена на: %2$s + + + Паказаць дыялогавую кнопку хуткасці + Кнопка дыялогу хуткасці паказана. Націсніце і ўтрымлівайце, каб скінуць хуткасць прайгравання да значэння па змаўчанні + Кнопка дыялогу хуткасці не паказана + + + Паказаць кнопку якасці відэа + Кнопка якасці відэа паказана. Націсніце і ўтрымлівайце, каб скінуць якасць да значэння па змаўчанні + Кнопка якасці відэа не паказана + + + Меню пользовательской скорости воспроизведения + Меню пользовательской скорости отображается + Меню пользовательской скорости не отображается + Аднавіць старое меню хуткасці прайгравання + Паказана старое меню хуткасці + Паказана сучаснае меню хуткасці + Карыстальніцкія хуткасці прайгравання + Добавьте или измените пользовательскую скорость воспроизведения + Нестандартныя хуткасці павінны быць менш за %s + Несапраўдныя нестандартныя хуткасці прайгравання + Аўто + Уласны хуткасць націску і ўтрымання + Хуткасць прайгравання між 0-8 + + + Запомніце змены хуткасці прайгравання + Змяненні хуткасці прайгравання прымяняюцца да ўсіх відэа + Змены хуткасці прайгравання прымяняюцца толькі да бягучага відэа + Паказваць усплывальнае паведамленне пры змене хуткасці прайгравання + Усплывальнае паведамленне паказваецца пры змене хуткасці прайгравання па змаўчанні + Усплывальнае паведамленне не паказваецца, калі хуткасць прайгравання па змаўчанні зменена + Стандартная хуткасць прайгравання + Хуткасць па змаўчанні зменена на: %s + + + Адключыць відэа ў фармаце HDR + Відэа ў фармаце HDR адключана + Відэа ў фармаце HDR уключана + Прымусіць AVC (H.264) + Відэакодэк прымусова ўсталяваны на AVC (H.264) + Відэакодэк вызначаецца аўтаматычна + "Перавагі: • Можа палепшыць час працы батарэі • Можа аднавіць адсутныя разрозненні відэа на старой прыладзе @@ -1645,179 +1642,178 @@ Second \"item\" text" • Прайграванне відэа будзе выкарыстоўваць больш інтэрнэт-дадзеных, чым VP9 або AV1 • HDR-відэа не будуць выкарыстоўваць AVC • Некаторыя прылады не могуць прымусова выкарыстоўваць AVC" - - - Паказаць пашыранае меню якасці відэа - Пашыранае меню якасці відэа паказана - Пашыранае меню якасці відэа не паказана - - - Уключыць слайд для пошуку - Слайд для пошуку ўключаны - Слайд для пошуку не ўключаны - - - Дазволіць Android VR AV1 - "Відэакодэк — AVC (H.264), VP9 або AV1 + + + Паказаць пашыранае меню якасці відэа + Пашыранае меню якасці відэа паказана + Пашыранае меню якасці відэа не паказана + + + Уключыць слайд для пошуку + Слайд для пошуку ўключаны + Слайд для пошуку не ўключаны + + + Дазволіць Android VR AV1 + "Відэакодэк — AVC (H.264), VP9 або AV1 Праграмаванне можа заікацца або прапускаць кадры" - Відэакодэк — AVC (H.264) або VP9 - "Уключэнне гэтай налады можа выкарыстоўваць праграмнае дэкадаванне AV1. + Відэакодэк — AVC (H.264) або VP9 + "Уключэнне гэтай налады можа выкарыстоўваць праграмнае дэкадаванне AV1. Прайграванне відэа з AV1 можа заікацца або прапускаць кадры." - Пабочныя эфекты падробкі - • Эксперыментальны кліент і можа спыніць працу ў любы час - • Відэа можа спыніцца на 1:00, ці можа быць недаступным у некаторых рэгіёнах - • Меню аўдыядарожкі адсутнічае - • Няма відэакідавання AV1 - • Стабільная гучнасць недаступная - • Дзіцячыя відэа могуць не прайгравацца ў стане выхаду з акаўнта або ў рэжыме інкогніта - - • Прымусовы арыгінальны аўдыё недаступны - Паказаць у статыстыцы для спецыялістаў - Тып кліента адлюстроўваецца ў статыстыцы для спецыялістаў - Кліент схаваны ў статыстыцы для спецыялістаў - - - - - - - Пра - Рэклама - Агульныя - Плэер - Рознае - - - Схаваць відэарэкламу - Відэарэклама схаваная - Відэарэклама паказаная - - - Уключыць пастаянны паўтор - Пастаянны паўтор уключаны - Пастаянны паўтор адключаны - - - Схаваць кнопку трансляцыі - Кнопка трансляцыі схавана - Кнопка трансляцыі паказана - Схаваць кнопку гісторыі - Кнопка гісторыі схавана - Кнопка гісторыі паказана - Схаваць кнопку апавяшчэння - Кнопка апавяшчэння схаваная - Кнопка апавяшчэння паказаная - Схаваць кнопку пошуку - Кнопка пошуку схаваная - Кнопка пошуку паказаная - - - Схаваць панэль катэгорый - Панэль катэгорый схаваная - Панэль катэгорый паказаная - - - Змяніць колер міні-плэера - Колер міні-плэера супадае з поўнаэкранным плэерам - Міні-плэер выкарыстоўвае колер па змаўчанні - - - Панэль навігацыі - Схаваць або змяніць кнопкі панэлі навігацыі - - Схаваць Галоўную - Кнопка \"Галоўная\" схавана - Кнопка \"Галоўная\" паказана - - Схаваць Узоры - Кнопка \"Узоры\" схавана - Кнопка \"Узоры\" паказана - - Схаваць Агляд - Кнопка \"Агляд\" схавана - Кнопка \"Агляд\" паказана - - Схаваць Бібліятэку - Кнопка \"Бібліятэка\" схавана - Кнопка \"Бібліятэка\" паказана - - Схаваць Прэміум - Кнопка \"Абнавіць\" схавана - Кнопка \"Абнавіць\" паказана - Схаваць панэль навігацыі - Панэль навігацыі схавана - Панэль навігацыі паказана - Схаваць подпісы кнопак навігацыі - Подпісы схаваны - Подпісы паказаны - - - Схаваць надпіс \"Атрымаць Music Premium\" - Надпіс схаваны - Надпіс паказаны - - - Схаваць кнопку абнаўлення - Кнопка схаваная - Кнопка паказаная - - - - - Блакіраваць аўдыярэкламу - Аўдыярэклама заблакіравана - Аўдыёрэклама разблакіравана - - - %s недаступны, рэклама можа паказвацца. Паспрабуйце змяніць службу блакавання рэкламы ў наладах. - %s выдаў памылку, рэклама можа паказвацца. Паспрабуйце змяніць службу блакавання рэкламы ў наладах. - Блакіраваць убудаваную відэарэкламу - Інваліды - Светлавы проксі - Проксі PurpleAdBlock - - - Блакіраваць відэарэкламу - Відэарэклама заблакіравана - Відэарэклама разблакіравана - - - Паведамленне выдалена - Паказаць выдаленыя паведамленні - Не паказваць выдаленыя паведамленні - Схаваць выдаленыя паведамленні за спойлерам - Паказаць выдаленыя паведамленні ў выглядзе закрэсленага тэксту - - - Аўтаматычна патрабаваць балы канала - Канальныя балы зарабляюцца аўтаматычна - Ачкі канала не запытваюцца аўтаматычна - - - - Уключыце рэжым адладкі Twitch - Рэжым адладкі Twitch уключаны (не рэкамендуецца) - Рэжым адладкі Twitch адключаны - - - Налады ReVanced - Пра нас - Раскажыць “ReVanced” - Блакіроўка рэкламы - Налады блакіроўкі рэкламы - Чат - Налады чата - Рознае - Розныя налады - Агульныя налады - Іншыя налады - Аб\"явы на баку кліента - Рэклама Surestream на баку сервера - Запіс адладкі - Журналы адладкі ўключаны - Журналы адладкі адключаны - - + Пабочныя эфекты падробкі + • Эксперыментальны кліент і можа спыніць працу ў любы час + • Відэа можа спыніцца на 1:00, ці можа быць недаступным у некаторых рэгіёнах + • Меню аўдыядарожкі адсутнічае + • Няма відэакідавання AV1 + • Стабільная гучнасць недаступная + • Дзіцячыя відэа могуць не прайгравацца ў стане выхаду з акаўнта або ў рэжыме інкогніта + + • Прымусовы арыгінальны аўдыё недаступны + Паказаць у статыстыцы для спецыялістаў + Тып кліента адлюстроўваецца ў статыстыцы для спецыялістаў + Кліент схаваны ў статыстыцы для спецыялістаў + + + + + + Пра + Рэклама + Агульныя + Плэер + Рознае + + + Схаваць відэарэкламу + Відэарэклама схаваная + Відэарэклама паказаная + + + Уключыць пастаянны паўтор + Пастаянны паўтор уключаны + Пастаянны паўтор адключаны + + + Схаваць кнопку трансляцыі + Кнопка трансляцыі схавана + Кнопка трансляцыі паказана + Схаваць кнопку гісторыі + Кнопка гісторыі схавана + Кнопка гісторыі паказана + Схаваць кнопку апавяшчэння + Кнопка апавяшчэння схаваная + Кнопка апавяшчэння паказаная + Схаваць кнопку пошуку + Кнопка пошуку схаваная + Кнопка пошуку паказаная + + + Схаваць панэль катэгорый + Панэль катэгорый схаваная + Панэль катэгорый паказаная + + + Змяніць колер міні-плэера + Колер міні-плэера супадае з поўнаэкранным плэерам + Міні-плэер выкарыстоўвае колер па змаўчанні + + + Панэль навігацыі + Схаваць або змяніць кнопкі панэлі навігацыі + + Схаваць Галоўную + Кнопка \"Галоўная\" схавана + Кнопка \"Галоўная\" паказана + + Схаваць Узоры + Кнопка \"Узоры\" схавана + Кнопка \"Узоры\" паказана + + Схаваць Агляд + Кнопка \"Агляд\" схавана + Кнопка \"Агляд\" паказана + + Схаваць Бібліятэку + Кнопка \"Бібліятэка\" схавана + Кнопка \"Бібліятэка\" паказана + + Схаваць Прэміум + Кнопка \"Абнавіць\" схавана + Кнопка \"Абнавіць\" паказана + Схаваць панэль навігацыі + Панэль навігацыі схавана + Панэль навігацыі паказана + Схаваць подпісы кнопак навігацыі + Подпісы схаваны + Подпісы паказаны + + + Схаваць надпіс \"Атрымаць Music Premium\" + Надпіс схаваны + Надпіс паказаны + + + Схаваць кнопку абнаўлення + Кнопка схаваная + Кнопка паказаная + + + + + Блакіраваць аўдыярэкламу + Аўдыярэклама заблакіравана + Аўдыёрэклама разблакіравана + + + %s недаступны, рэклама можа паказвацца. Паспрабуйце змяніць службу блакавання рэкламы ў наладах. + %s выдаў памылку, рэклама можа паказвацца. Паспрабуйце змяніць службу блакавання рэкламы ў наладах. + Блакіраваць убудаваную відэарэкламу + Інваліды + Светлавы проксі + Проксі PurpleAdBlock + + + Блакіраваць відэарэкламу + Відэарэклама заблакіравана + Відэарэклама разблакіравана + + + Паведамленне выдалена + Паказаць выдаленыя паведамленні + Не паказваць выдаленыя паведамленні + Схаваць выдаленыя паведамленні за спойлерам + Паказаць выдаленыя паведамленні ў выглядзе закрэсленага тэксту + + + Аўтаматычна патрабаваць балы канала + Канальныя балы зарабляюцца аўтаматычна + Ачкі канала не запытваюцца аўтаматычна + + + + Уключыце рэжым адладкі Twitch + Рэжым адладкі Twitch уключаны (не рэкамендуецца) + Рэжым адладкі Twitch адключаны + + + Налады ReVanced + Пра нас + Раскажыць “ReVanced” + Блакіроўка рэкламы + Налады блакіроўкі рэкламы + Чат + Налады чата + Рознае + Розныя налады + Агульныя налады + Іншыя налады + Аб\"явы на баку кліента + Рэклама Surestream на баку сервера + Запіс адладкі + Журналы адладкі ўключаны + Журналы адладкі адключаны + + diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index c932fc0232..acec23d43b 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -17,1262 +17,1261 @@ "First 'item' text Second \"item\" text" ---> - - - - Име на приложението - - Персонализиран - Икона на приложението - Оригинален - - ReVanced минимален - ReVanced мащабиран - - Персонализиран - - - Проверката е неуспешна - Отворете официалния уебсайт - Пропусни - <h5>Изглежда, че това приложение не е коригирано от вас.</h5><br>Това приложение може да не функционира правилно, <b>може да бъде вредно или дори опасно за използване</b>.< br><br>Тези проверки предполагат, че това приложение е предварително коригирано или получено от някой друг:<br><br><small>%1$s</small><br>Силно се препоръчва да <b>деинсталирайте това приложение и го поправете сами</b> за да сте сигурни, че използвате валидирано и защитено приложение.<p><br>Ако бъде пренебрегнато, това предупреждение ще се покаже само два пъти. - Коригирано на друго устройство - Не е инсталиран ReVanced Manager - Редактирано преди повече от 10 минути - Коригирано преди %s дни - Датата на компилация на APK е повредена - - - Известие от ReVanced - Историята ви на гледане не се запазва.<br><br>Това най-вероятно е причинено от DNS блокиращ реклами или мрежов прокси.<br><br>За да коригирате това, поставете <b>s.youtube в белия списък.com</b> или изключете всички DNS блокери и проксита. - Не показвай отново - - - Настройки - Сигурни ли сте, че искате да продължите? - Запазване - Възстанови - Нулиране на цвета - Невалиден цвят - Необходимо е рестартиране - Рестартирайте приложението, за да влязат в сила тези промени. - Рестартиране - Импортиране - Копирай - Настройките на ReVanced бяха нулирани - Следните настройки бяха импортирани успешно: %d - Импортирането беше неуспешно: %s - Търсене на настройки - Няма намерени резултати за \",%s\" - Опитайте друга ключова дума - Скорошни търсения - Премахване от историята на търсенията? - Изчистване на историята на търсенията - Сигурни ли сте, че искате да изчистите цялата история на търсенията? - Съвети за търсене - "• Докоснете път, за да отидете до него +--> + + + Име на приложението + + Персонализиран + Икона на приложението + Оригинален + + ReVanced минимален + ReVanced мащабиран + + Персонализиран + + + Проверката е неуспешна + Отворете официалния уебсайт + Пропусни + <h5>Изглежда, че това приложение не е коригирано от вас.</h5><br>Това приложение може да не функционира правилно, <b>може да бъде вредно или дори опасно за използване</b>.< br><br>Тези проверки предполагат, че това приложение е предварително коригирано или получено от някой друг:<br><br><small>%1$s</small><br>Силно се препоръчва да <b>деинсталирайте това приложение и го поправете сами</b> за да сте сигурни, че използвате валидирано и защитено приложение.<p><br>Ако бъде пренебрегнато, това предупреждение ще се покаже само два пъти. + Коригирано на друго устройство + Не е инсталиран ReVanced Manager + Редактирано преди повече от 10 минути + Коригирано преди %s дни + Датата на компилация на APK е повредена + + + Известие от ReVanced + Историята ви на гледане не се запазва.<br><br>Това най-вероятно е причинено от DNS блокиращ реклами или мрежов прокси.<br><br>За да коригирате това, поставете <b>s.youtube в белия списък.com</b> или изключете всички DNS блокери и проксита. + Не показвай отново + + + Настройки + Сигурни ли сте, че искате да продължите? + Запазване + Възстанови + Нулиране на цвета + Невалиден цвят + Необходимо е рестартиране + Рестартирайте приложението, за да влязат в сила тези промени. + Рестартиране + Импортиране + Копирай + Настройките на ReVanced бяха нулирани + Следните настройки бяха импортирани успешно: %d + Импортирането беше неуспешно: %s + Търсене на настройки + Няма намерени резултати за \",%s\" + Опитайте друга ключова дума + Скорошни търсения + Премахване от историята на търсенията? + Изчистване на историята на търсенията + Сигурни ли сте, че искате да изчистите цялата история на търсенията? + Съвети за търсене + "• Докоснете път, за да отидете до него • Натиснете продължително настройка, за да отидете до нея • Натиснете Enter, за да запазите заявка за търсене в историята • Търсенето не отчита главни/малки букви и препинателни знаци • Родителските настройки се появяват над деактивираните дъщерни настройки" - Историята на търсене е празна - За да запазите историята на търсене, въведете заявка за търсене и натиснете Enter - Показване на историята на търсенията в настройките - Историята на търсенията в настройките е показана - Историята на търсенията в настройките не се показва - Показване на иконите на настройките на ReVanced - Иконите на настройките се показват - Иконите на настройките не се показват - Език на ReVanced - "Преводите за някои езици може да липсват или да са непълни. + Историята на търсене е празна + За да запазите историята на търсене, въведете заявка за търсене и натиснете Enter + Показване на историята на търсенията в настройките + Историята на търсенията в настройките е показана + Историята на търсенията в настройките не се показва + Показване на иконите на настройките на ReVanced + Иконите на настройките се показват + Иконите на настройките не се показват + Език на ReVanced + "Преводите за някои езици може да липсват или да са непълни. За да преведете нови езици или да подобрите съществуващите преводи, посетете translate.revanced.app" - Език на приложението - Импортиране / Експортиране - Импортиране / Експортиране на ReVanced настройките - - Вие използвате версията на ReVanced Patches<i>%s</i> - Забележка - Тази версия е предварителна, така че може да срещнете неочаквани проблеми - Официални линкове - + Вие използвате версията на ReVanced Patches<i>%s</i> + Забележка + Тази версия е предварителна, така че може да срещнете неочаквани проблеми + Официални линкове + - - - GmsCore Настройки - Настройки на GmsCore - - GmsCore не е инсталиран. Инсталирайте го. - Нужно е действие - "MicroG GmsCore няма разрешение да работи във фонов режим. + + + GmsCore Настройки + Настройки на GmsCore + + GmsCore не е инсталиран. Инсталирайте го. + Нужно е действие + "MicroG GmsCore няма разрешение да работи във фонов режим. Следвайте ръководството \"Не убивай моето приложение\" за вашия телефон и приложете инструкциите към вашата инсталация на MicroG. Това е необходимо, за да работи приложението." - Отвори сайта - "Оптимизациите на батерията за MicroG GmsCore трябва да бъдат деактивирани, за да се избегнат проблеми. + Отвори сайта + "Оптимизациите на батерията за MicroG GmsCore трябва да бъдат деактивирани, за да се избегнат проблеми. Деактивирането на оптимизациите на батерията за MicroG няма да повлияе отрицателно на използването на батерията. Докоснете бутона за продължаване и разрешете промени в оптимизацията." - Продължи - - - Имитиране на видео потоци - Имитирайте видео потоците на клиента, за да предотвратите проблеми с възпроизвеждането - Подправяне на видео потоци - "Видео потоците са подменени + Продължи + + + Имитиране на видео потоци + Имитирайте видео потоците на клиента, за да предотвратите проблеми с възпроизвеждането + Подправяне на видео потоци + "Видео потоците са подменени Ако сте потребител на YouTube Premium, тази настройка може да не е необходима" - "Видеопотоците не са подправени + "Видеопотоците не са подправени Възпроизвеждането може да не работи" - Изключването на тази настройка може да причини проблеми с възпроизвеждането. - Клиент по подразбиране - - - Принудително оригинално аудио език - Използване на оригиналния език на аудиото - Използване на аудио по подразбиране - - За да използвате тази функция, променете \'Фалшифициране на видео потоци\' на всеки клиент, освен Android Studio - - - Отстраняване на грешки - Активиране или деактивиране на отстраняването на грешки - Дневник на отстраняването на грешки - Дневникът за остраняване на грешки е активиран - Дневникът за остраняване на грешки е деактивиран - Следи от стека на дневника - Дневникът за отстраняване на грешки съдържа следи от стека - Дневникът за отстраняване на грешки не съдържа следи от стека - Покажи системно съобщение при ReVanced грешка - Показва се toast, ако възникне грешка - Не се показва toast, ако възникне грешка - "Изключването на изскачащи съобщения за грешки крие всички известия за грешки на ReVanced. + Изключването на тази настройка може да причини проблеми с възпроизвеждането. + Клиент по подразбиране + + + Принудително оригинално аудио език + Използване на оригиналния език на аудиото + Използване на аудио по подразбиране + + За да използвате тази функция, променете \'Фалшифициране на видео потоци\' на всеки клиент, освен Android Studio + + + Отстраняване на грешки + Активиране или деактивиране на отстраняването на грешки + Дневник на отстраняването на грешки + Дневникът за остраняване на грешки е активиран + Дневникът за остраняване на грешки е деактивиран + Следи от стека на дневника + Дневникът за отстраняване на грешки съдържа следи от стека + Дневникът за отстраняване на грешки не съдържа следи от стека + Покажи системно съобщение при ReVanced грешка + Показва се toast, ако възникне грешка + Не се показва toast, ако възникне грешка + "Изключването на изскачащи съобщения за грешки крие всички известия за грешки на ReVanced. Няма да бъдете уведомени за неочаквани събития." - Експортиране на логове за отстраняване на грешки - Копира логовете за отстраняване на грешки на ReVanced в клипборда - Отстраняването на грешки е деактивирано - Не са намерени логове - Логовете са копирани - Неуспешно експортиране на логове: %s - Изчистване на логовете за отстраняване на грешки - Изчиства всички съхранени логове за отстраняване на грешки на ReVanced - Логовете са изчистени - Мениджър на флагове за функции - Управление на булеви флагове за функции - Активни флагове (%d) - Блокирани флагове (%d) - Търсене на флагове... - Флаговете са запазени - Флаговете са нулирани - Флаговете са копирани в клипборда - Буфер на протокола за дневника - Файлове с дневници за грешки включват буфера - Файлове с дневници за грешки не включват буфера - "Активирането на тази настройка ще регистрира допълнителни данни за оформлението, включително текст на екрана за някои компоненти на потребителския интерфейс. + Експортиране на логове за отстраняване на грешки + Копира логовете за отстраняване на грешки на ReVanced в клипборда + Отстраняването на грешки е деактивирано + Не са намерени логове + Логовете са копирани + Неуспешно експортиране на логове: %s + Изчистване на логовете за отстраняване на грешки + Изчиства всички съхранени логове за отстраняване на грешки на ReVanced + Логовете са изчистени + Мениджър на флагове за функции + Управление на булеви флагове за функции + Активни флагове (%d) + Блокирани флагове (%d) + Търсене на флагове... + Флаговете са запазени + Флаговете са нулирани + Флаговете са копирани в клипборда + Буфер на протокола за дневника + Файлове с дневници за грешки включват буфера + Файлове с дневници за грешки не включват буфера + "Активирането на тази настройка ще регистрира допълнителни данни за оформлението, включително текст на екрана за някои компоненти на потребителския интерфейс. Това може да помогне за идентифициране на компоненти при създаване на персонализирани филтри. Активирането на тази настройка обаче ще регистрира и някои потребителски данни, като например вашия IP адрес." - - - Почистване на връзки за споделяне - Параметърът за проследяване се премахва от споделените връзки - Параметърът за проследяване не се премахва от споделените връзки - Промяна на връзките за споделяне към youtube.com - Споделените връзки използват youtube.com - Споделените връзки използват music.youtube.com - - - Потребителски филтър - Скриване на компоненти с помощта на потребителски филтри - Активиране на потребителските филтри - Потребителският филтър е активиран - Потребителският филтър е деактивиран - Потребителски филтър - - Списък с низове за изграждане на пътя на компонента, които да се филтрират, разделени с нов ред - Невалиден потребителски филтър: %s - - - - - За програмата - Реклами - Алтернативни миниатюри - Поток - Общи - Плеър - Лента за прогрес на видеото - Контроли с плъзгане - Разни - Видео - Възстановяване на старите менюта за настройки - Старите менюта с настройки се показват - Старите менюта с настройки не се показват - - - Възпроизвеждане на Shorts в фонов режим - Фоновото възпроизвеждане на Shorts е деактивирано - Фоновото възпроизвеждане на Shorts е активирано - - - \"Карти на албумите\" - Албумните карти са скрити - Албумните карти се показват - Скриване на картите на артистите - Картите на изпълнителите са скрити - Показват се карти на артисти - Скриване на филмовите рафтове - Рафтът \"Chip\" е скрит - Рафтовете със снимки се показват - Скриване на публикациите от общността - Насоките на общността са скрити - Последните публикации са показани - Скриване на компактните банери - Информационните панели са скрити - Информационните панели се показват - Скриване на разгъваемата карта - Разгъваемата карта под видеоклиповете е скрита - Разгъваемата карта под видеоклиповете е показана - Плаващ бутон за микрофона - Плаващ бутон за микрофон при търсене е скрит - Плаващият бутон за микрофон в търсенето е показан - Хоризонтални секции - "Хоризонтални рафтове са скрити, като: + + + Почистване на връзки за споделяне + Параметърът за проследяване се премахва от споделените връзки + Параметърът за проследяване не се премахва от споделените връзки + Промяна на връзките за споделяне към youtube.com + Споделените връзки използват youtube.com + Споделените връзки използват music.youtube.com + + + Потребителски филтър + Скриване на компоненти с помощта на потребителски филтри + Активиране на потребителските филтри + Потребителският филтър е активиран + Потребителският филтър е деактивиран + Потребителски филтър + + Списък с низове за изграждане на пътя на компонента, които да се филтрират, разделени с нов ред + Невалиден потребителски филтър: %s + + + + + За програмата + Реклами + Алтернативни миниатюри + Поток + Общи + Плеър + Лента за прогрес на видеото + Контроли с плъзгане + Разни + Видео + Възстановяване на старите менюта за настройки + Старите менюта с настройки се показват + Старите менюта с настройки не се показват + + + Възпроизвеждане на Shorts в фонов режим + Фоновото възпроизвеждане на Shorts е деактивирано + Фоновото възпроизвеждане на Shorts е активирано + + + \"Карти на албумите\" + Албумните карти са скрити + Албумните карти се показват + Скриване на картите на артистите + Картите на изпълнителите са скрити + Показват се карти на артисти + Скриване на филмовите рафтове + Рафтът \"Chip\" е скрит + Рафтовете със снимки се показват + Скриване на публикациите от общността + Насоките на общността са скрити + Последните публикации са показани + Скриване на компактните банери + Информационните панели са скрити + Информационните панели се показват + Скриване на разгъваемата карта + Разгъваемата карта под видеоклиповете е скрита + Разгъваемата карта под видеоклиповете е показана + Плаващ бутон за микрофона + Плаващ бутон за микрофон при търсене е скрит + Плаващият бутон за микрофон в търсенето е показан + Хоризонтални секции + "Хоризонтални рафтове са скрити, като: • Извънредни новини • Продължи гледането • Разгледайте още канали • Най-подходящи • Пазаруване • Гледайте отново" - Хоризонталните рафтове са показани - Скриване на рафта с изображения - Рафтът с изображения в резултатите от търсенето е скрит - Рафтът с изображения в резултатите от търсенето е показан - Скриване на последните публикации - Най-новите публикации са скрити - Последните публикации са показани - Скриване на микс плейлист - Плейлист микса е скрит - Плейлист микса се показва - Скриване на раздела за филми - Секцията с коментари е скрита - Разделът за филми е показан - - Скриване на бутона \"Уведоми ме\" - Бутонът за уведомяване е скрит - Бутонът за уведомяване е показан - Игри в YouTube - Игри в YouTube са скрити - Игрите в YouTube се показват - - Скриване на бутона \"Покажи още\" - Бутонът за показване на още в резултатите от търсене е скрит - Бутонът за показване на още в резултатите от търсене е показан - Скриване на проучвания - Анкетите са скрити - Анкетите са показани - Скриване на рафта за билети - Рафтът за билети е скрит - Рафтът за билети е показан - - Скриване на етикетите за препоръчани видеоклипове - \'Хората също така гледаха\' и \'Може също да харесате\' етикетите в резултатите от търсене са скрити - \'Хората също така гледаха\' и \'Може също да харесате\' етикетите в резултатите от търсене са показани - Скрий визуалния разделител - Визуалният разделител е скрит - Визуалният разделител е показан - - YouTube Doodles - Анимацията на YouTube Doodles върху логото е скрита - Анимацията на YouTube Doodles върху логото е показана - "Doodles в YouTube се показват няколко дни в годината. + Скриване на бутона \"Покажи още\" + Бутонът за показване на още в резултатите от търсене е скрит + Бутонът за показване на още в резултатите от търсене е показан + Скриване на проучвания + Анкетите са скрити + Анкетите са показани + Скриване на рафта за билети + Рафтът за билети е скрит + Рафтът за билети е показан + + Скриване на етикетите за препоръчани видеоклипове + \'Хората също така гледаха\' и \'Може също да харесате\' етикетите в резултатите от търсене са скрити + \'Хората също така гледаха\' и \'Може също да харесате\' етикетите в резултатите от търсене са показани + Скрий визуалния разделител + Визуалният разделител е скрит + Визуалният разделител е показан + + YouTube Doodles + Анимацията на YouTube Doodles върху логото е скрита + Анимацията на YouTube Doodles върху логото е показана + "Doodles в YouTube се показват няколко дни в годината. Ако в момента се показва Doodle във вашия регион и тази настройка за скриване е включена, тогава лентата за филтриране под лентата за търсене също ще бъде скрита." - Скриване на лентата на канала - Лентата на канала е скрита - Лентата на канала е показана - Воден знак на канала - Водният знак на канала е скрит - Водният знак на канала се показва - Дарителска кутия - Кутията за дарения е скрита - Кутията за дарения се показва - Скриване аварийните кутии - Спешни кутии са скрити - Спешни кутии са показани - Скриване на информационните панели - Информационните панели са скрити - Информационните панели са показани - - Скриване на бутона \"Присъединяване\" - Бутонът за присъединяване е скрит - Бутонът за присъединяване е показан - Скриване на медицинските панели - Медицинските панели са скрити - Медицинските панели са показани - Скриване на бързите действия - Бързите действия на цял екран са скрити - Бързите действия на цял екран са показани - Скриване на свързани видеоклипове - Свързаните видеоклипове в бързите действия са скрити - Свързаните видеоклипове в бързите действия са показани - Скриване на указанията за абонатори - Насоките за общността са скрити - Насоките за общността са показани - Скриване на времевите реакции - Времевите реакции са скрити - Времевите реакции се показват - Скриване на \"AI-генерирано видео резюме\" - Разделът за резюме на видеоклипове, генерирани от AI, е скрит - Разделът с генерирани от AI резюмета на видеоклипове е показан - Скриване на „Попитай“ - Скрит раздел „Попитай“ - Показване на раздел „Попитай“ - Скриване на атрибути - Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са скрити - Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са показани - Скриване на глави - Секцията с заглавия е скрита - Секцията с заглавия се показва - Скриване на \"Как е създадено това съдържание\" - Секцията \"Как е създадено това съдържание\" е скрита - Секцията \"Как е създадено това съдържание\" е показана - Скриване на точките на хайп - Точките на хайп са скрити - Точките на хайп са показани - Скриване на \"Разгледайте подкаста\" - Секцията \"Разгледайте подкаста\" е скрита - Секцията \"Разгледайте подкаста\" е показана - Скриване на препоръчени връзки - Секцията с представени връзки е скрита - Секцията с представени връзки е показана - Скриване на представени видеоклипове - Секцията с представени видеоклипове е скрита - Секцията с представени видеоклипове е показана - Скриване на инфо. карти - Разделът за информационни карти е скрит - Разделът за информационни карти е показан - Скриване на \"Основни концепции\" - Секцията \"Основни концепции\" е скрита - Секцията \"Основни концепции\" е показана - Скриване на бутона за абониране - Бутонът за абониране е скрит - Бутонът за абониране е показан - Скриване на транскрипт - Разделът за транскрипция е скрит - Разделът за транскрипция е показан - Описание на видеото - Скриване или показване на компонентите за описание на видеоклиповете - Лента с филтри - Скриване или показване на лентата за филтри в емисиите, свързаните видеоклипове, резултатите от търсенето и историята на гледане - Скриване в емисии - Скрити в емисии - Показани в емисии - Скриване в сродни видеоклипове - Скриване в сродни видеоклипове - Показано в сродни видеоклипове - Скриване в резултатите от търсенето - Скрито в резултатите от търсенето - Показано в резултатите от търсенето - Скриване в историята на гледанията - Скрито в историята на гледане - Показано в историята на гледанията - Страница на канала - Скриване или показване на компоненти на страницата на канала - - Скрий бутона за Общност - Бутонът за общност е скрит - Бутонът за общност е показан - - Скриване на рафта \"За вас\" - Рафтът „За Вас“ е скрит - Рафтът „За Вас“ е показан - - Скриване на бутона Присъединяване - Бутонът Присъединяване е скрит - Бутонът Присъединяване е показан - Скриване на преглед на връзки - Прегледът на връзки е скрит - Прегледът на връзки е показан - Скриване на рафта за членове - Рафтът за членове е скрит - Рафтът за членове е показан - - Скриване на бутона Магазин - Бутонът Магазин е скрит - Бутонът Магазин е показан - - Скриване на бутона Абониране - Бутонът Абониране е скрит - Бутонът Абониране е показан - Коментари - Скриване или показване на секцията за коментари - Скриване на резюмето на AI чата - Резюмето на AI чата е скрито - Резюмето на AI чата е показано - Скриване на резюмето на AI коментарите - Резюмето на AI коментари е скрито - Резюмето на AI коментари е показано - Скриване на насоките на канала - Указанията за канала са скрити - Указанията за канала са показани - Скриване на „Коментари, направени от членове“ - Заглавието на коментарите от членове е скрито - Заглавието на коментарите от членове е показано - Скриване на секцията с коментари - Секцията с коментари е скрита - Секцията с коментари се показва - Скриване на указанията за общността - Насоките на общността са скрити - Насоките на общността са показани - Бутон за създаване на Shorts - Бутонът \"Създаване на Short\" е скрит - Бутонът \"Създаване на Short\" е показан - Скриване на бутоните за емоджи и клеймо за време - Бутоните за емоджи и клеймо за време са скрити - Бутоните за емоджи и клеймо за време са показани - Преглед на коментари - Прегледа на коментари е скрит - Прегледа на коментари се показва - Скрий бутона за харесване - Бутона за благодарност е скрит - Бутона за благодарност се показва - Скриване на броя на преглежданията - Броят на преглежданията е скрит във фийда и резултатите от търсенето - Броят на преглежданията е показан във фийда и резултатите от търсенето - - "Ограничения: + Скриване на бутона \"Присъединяване\" + Бутонът за присъединяване е скрит + Бутонът за присъединяване е показан + Скриване на медицинските панели + Медицинските панели са скрити + Медицинските панели са показани + Скриване на бързите действия + Бързите действия на цял екран са скрити + Бързите действия на цял екран са показани + Скриване на свързани видеоклипове + Свързаните видеоклипове в бързите действия са скрити + Свързаните видеоклипове в бързите действия са показани + Скриване на указанията за абонатори + Насоките за общността са скрити + Насоките за общността са показани + Скриване на времевите реакции + Времевите реакции са скрити + Времевите реакции се показват + Скриване на \"AI-генерирано видео резюме\" + Разделът за резюме на видеоклипове, генерирани от AI, е скрит + Разделът с генерирани от AI резюмета на видеоклипове е показан + Скриване на „Попитай“ + Скрит раздел „Попитай“ + Показване на раздел „Попитай“ + Скриване на атрибути + Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са скрити + Секциите \"Препоръчани места\", \"Игри\", \"Музика\" и \"Споменати хора\" са показани + Скриване на глави + Секцията с заглавия е скрита + Секцията с заглавия се показва + Скриване на \"Как е създадено това съдържание\" + Секцията \"Как е създадено това съдържание\" е скрита + Секцията \"Как е създадено това съдържание\" е показана + Скриване на точките на хайп + Точките на хайп са скрити + Точките на хайп са показани + Скриване на \"Разгледайте подкаста\" + Секцията \"Разгледайте подкаста\" е скрита + Секцията \"Разгледайте подкаста\" е показана + Скриване на препоръчени връзки + Секцията с представени връзки е скрита + Секцията с представени връзки е показана + Скриване на представени видеоклипове + Секцията с представени видеоклипове е скрита + Секцията с представени видеоклипове е показана + Скриване на инфо. карти + Разделът за информационни карти е скрит + Разделът за информационни карти е показан + Скриване на \"Основни концепции\" + Секцията \"Основни концепции\" е скрита + Секцията \"Основни концепции\" е показана + Скриване на бутона за абониране + Бутонът за абониране е скрит + Бутонът за абониране е показан + Скриване на транскрипт + Разделът за транскрипция е скрит + Разделът за транскрипция е показан + Описание на видеото + Скриване или показване на компонентите за описание на видеоклиповете + Лента с филтри + Скриване или показване на лентата за филтри в емисиите, свързаните видеоклипове, резултатите от търсенето и историята на гледане + Скриване в емисии + Скрити в емисии + Показани в емисии + Скриване в сродни видеоклипове + Скриване в сродни видеоклипове + Показано в сродни видеоклипове + Скриване в резултатите от търсенето + Скрито в резултатите от търсенето + Показано в резултатите от търсенето + Скриване в историята на гледанията + Скрито в историята на гледане + Показано в историята на гледанията + Страница на канала + Скриване или показване на компоненти на страницата на канала + + Скрий бутона за Общност + Бутонът за общност е скрит + Бутонът за общност е показан + + Скриване на рафта \"За вас\" + Рафтът „За Вас“ е скрит + Рафтът „За Вас“ е показан + + Скриване на бутона Присъединяване + Бутонът Присъединяване е скрит + Бутонът Присъединяване е показан + Скриване на преглед на връзки + Прегледът на връзки е скрит + Прегледът на връзки е показан + Скриване на рафта за членове + Рафтът за членове е скрит + Рафтът за членове е показан + + Скриване на бутона Магазин + Бутонът Магазин е скрит + Бутонът Магазин е показан + + Скриване на бутона Абониране + Бутонът Абониране е скрит + Бутонът Абониране е показан + Коментари + Скриване или показване на секцията за коментари + Скриване на резюмето на AI чата + Резюмето на AI чата е скрито + Резюмето на AI чата е показано + Скриване на резюмето на AI коментарите + Резюмето на AI коментари е скрито + Резюмето на AI коментари е показано + Скриване на насоките на канала + Указанията за канала са скрити + Указанията за канала са показани + Скриване на „Коментари, направени от членове“ + Заглавието на коментарите от членове е скрито + Заглавието на коментарите от членове е показано + Скриване на секцията с коментари + Секцията с коментари е скрита + Секцията с коментари се показва + Скриване на указанията за общността + Насоките на общността са скрити + Насоките на общността са показани + Бутон за създаване на Shorts + Бутонът \"Създаване на Short\" е скрит + Бутонът \"Създаване на Short\" е показан + Скриване на бутоните за емоджи и клеймо за време + Бутоните за емоджи и клеймо за време са скрити + Бутоните за емоджи и клеймо за време са показани + Преглед на коментари + Прегледа на коментари е скрит + Прегледа на коментари се показва + Скрий бутона за харесване + Бутона за благодарност е скрит + Бутона за благодарност се показва + Скриване на броя на преглежданията + Броят на преглежданията е скрит във фийда и резултатите от търсенето + Броят на преглежданията е показан във фийда и резултатите от търсенето + + "Ограничения: • Рафтовете с Shorts, страниците на каналите и резултатите от търсенето може все още да показват броя на преглежданията • Тази функция не работи с автомобилен форм фактор" - Скриване на часа на качване - Часът на качване е скрит в емисията и резултатите от търсенето - Часът на качване е показан в емисията и резултатите от търсенето - - "Ограничения: + Скриване на часа на качване + Часът на качване е скрит в емисията и резултатите от търсенето + Часът на качване е показан в емисията и резултатите от търсенето + + "Ограничения: • Рафтовете с Shorts, страниците на канали и резултатите от търсене може все още да показват часове на качване • Тази функция не работи с автомобилни форм-фактори" - Скриване на съдържанието с ключови думи - Скриване на видеоклипове в резултатите от търсенуя и в новинарския поток с помощта на филтри с ключови думи - Скриване на видеоклипове в началната страница с ключови думи - Видеоклиповете в раздела Начало се филтрират с помощта на ключови думи - Видеоклиповете в раздела Начало не се филтрират по ключови думи - Скриване на резултати от търсения с ключови думи - Резултатите от търсенето се филтрират с помощта на ключови думи - Резултатите от търсенето не се филтрират по ключови думи - Скриване на видеоклипове от абонаменти с ключови думи - Видеоклиповете в раздела за абонаменти са са филтрирани с ключови думи - Видеоклиповете в емисията за абонаменти не се филтрират - Ключови думи, които да бъдат скрити - - "Ключови думи и фрази за скриване, разделени от нов ред + "Ключови думи и фрази за скриване, разделени от нов ред Ключовите думи могат да бъдат имена на канали или всякакъв текст, показан в заглавията на видеоклиповете Думите с главни букви в средата трябва да бъдат въведени с главни букви (напр.: iPhone, TikTok, LeBlanc)" - За филтриране с ключови думи - "Резултатите от търсенето в Начало/Абонамент/Търсене се филтрират, за да се скрие съдържанието, което съвпада с фрази с ключови думи + За филтриране с ключови думи + "Резултатите от търсенето в Начало/Абонамент/Търсене се филтрират, за да се скрие съдържанието, което съвпада с фрази с ключови думи Ограничения • Шорти не могат да бъдат скрити по име на канала • Някои UI компоненти може да не са скрити • Търсенето на ключова дума може да не покаже резултати" - Съвпадение на всички думи - - Ограждането на ключова дума/фраза с двойни кавички ще предотврати частични съвпадения на заглавия на видеоклипове и имена на канали<br><br>Например,<br><b>\"ai\"</b> ще скрие видеоклипа: <b>How does AI work?</b><br>но няма да скрие: <b>What does fair use mean?</b> - - Не можете да използвате ключовата дума: %s - Добавете кавички, за да използвате ключова дума: %s - Ключовата дума има противоречиви твърдения: %s - Ключовата дума е твърде кратка и изисква кавички: %s - Всички видеа с ключовата дума ще бъдат скрити: %s - - - Скриване на рафта на магазина на създателя - Рафтът на магазина на създателя под видео плейъра е скрит - Рафтът на магазина на създателя под видеоплейъра е показан - Скрий банера за реклама в края на екрана - Банерът на магазина на крайния екран е скрит - Банерът на магазина на крайния екран е показан - Скриване на рекламите в режим на цял екран - "Всички реклами на цял екран са скрити + Съвпадение на всички думи + + Ограждането на ключова дума/фраза с двойни кавички ще предотврати частични съвпадения на заглавия на видеоклипове и имена на канали<br><br>Например,<br><b>\"ai\"</b> ще скрие видеоклипа: <b>How does AI work?</b><br>но няма да скрие: <b>What does fair use mean?</b> + + Не можете да използвате ключовата дума: %s + Добавете кавички, за да използвате ключова дума: %s + Ключовата дума има противоречиви твърдения: %s + Ключовата дума е твърде кратка и изисква кавички: %s + Всички видеа с ключовата дума ще бъдат скрити: %s + + + Скриване на рафта на магазина на създателя + Рафтът на магазина на създателя под видео плейъра е скрит + Рафтът на магазина на създателя под видеоплейъра е показан + Скрий банера за реклама в края на екрана + Банерът на магазина на крайния екран е скрит + Банерът на магазина на крайния екран е показан + Скриване на рекламите в режим на цял екран + "Всички реклами на цял екран са скрити Тази функция е налична само за по-стари устройства" - Рекламите в режим на цял екран са показани - - Скр. на реклами на цял екран, за по-стари устройства - Скриване на общите реклами - Общите реклами са скрити - Общите реклами се показват - Скриване на банерите за стоки - Рекламните банери за стоки са скрити - Банерите за стоки се показват - Скриване на платените промоции - Промоционалните етикети са скрити - Промоционалните етикети се показват - Скриване на самоспонсорирани карти - Самоспонсорираните карти са скрити - Самоспонсорираните карти са показани - Скриване на връзки за пазаруване - Линковете за пазаруване във видео описанието са скрити - Линковете за пазаруване в описанието на видеоклипа са показани - Скриване на банера „Преглед на продукти“ - Банерът за преглед на продукти във видео наслагването е скрит - Банерът за преглед на продукти във видео наслагването е показан - Скриване на резултатите от уеб търсенето - Резултатите от уеб търсенето са скрити - Резултатите от уеб търсенето са показани. - - - Скриване на YouTube Premium промоциите - YouTube Premium промоциите са скрити. - YouTube Premium промоциите се показват. - - - Скриване на видео рекламите - Видео рекламите са скрити. - Видео рекламите се показват. - - - Връзката е копирана в клипборда. - URL адрес с отметка за време, копиран в клипборда. - Показване на бутона за копиране на URL адреса на видеоклипа - Бутонът за копиране на URL адрес на видео е показан. Докоснете, за да копирате URL адреса на видеото. Докоснете и задръжте, за да копирате с времева отметка - Бутонът за копиране на URL адрес на видео не е показан - Показване на бутона за копиране на URL адреса на времевия отпечатък на видеоклипа - Бутонът за копиране на URL адрес с времева отметка е показан. Докоснете, за да копирате URL адрес на видео с времева отметка. Докоснете и задръжте, за да копирате без времева отметка - Бутонът за копиране на URL адрес с времева отметка не е показан - - - Прозорец за възрастово ограничение - Диалоговият прозорец ще бъде премахнат - Диалоговият прозорец ще бъде показан - Тази функция не заобикаля възрастовото ограничение. Тя просто приема възрастовата граница автоматично. - - - Деактивиране на изскачащия прозорец „Вход в телевизор“ - Изскачащият прозорец „Влизане в телевизора“ е деактивиран - Изскачащият прозорец „Влизане в телевизора“ е активиран - - - Деактивиране на пропускане на глава с двойно докосване - Двойното докосване никога не може да предизвика пропускане до следваща/предишна глава - Двойното докосване може понякога да предизвика пропускане до следваща/предишна глава - - - Външни изтегляния - Настройки за използване на външно приложение за изтегляне - Показване на бутона за изтегляне чрез външно приложение - Бутонът за изтегляне в плейъра е показан - Бутонът за изтегляне в плейъра не е показан - - Заместване на бутона Download - Бутонът за изтегляне отваря избраното от Вас външно приложение за изтегляне - Бутонът за изтегляне отваря вграденото приложение за изтегляне - Име на пакета на изтеглящото приложение - Име на пакета на вашето инсталирано външно приложение за изтегляне - Въведете името на пакета - Други - Приложението не е инсталирано - %s не е инсталиран. Инсталирайте го. - "Не може да бъде намерено инсталирано приложение с име на пакет: %s + Рекламите в режим на цял екран са показани + + Скр. на реклами на цял екран, за по-стари устройства + Скриване на общите реклами + Общите реклами са скрити + Общите реклами се показват + Скриване на банерите за стоки + Рекламните банери за стоки са скрити + Банерите за стоки се показват + Скриване на платените промоции + Промоционалните етикети са скрити + Промоционалните етикети се показват + Скриване на самоспонсорирани карти + Самоспонсорираните карти са скрити + Самоспонсорираните карти са показани + Скриване на връзки за пазаруване + Линковете за пазаруване във видео описанието са скрити + Линковете за пазаруване в описанието на видеоклипа са показани + Скриване на банера „Преглед на продукти“ + Банерът за преглед на продукти във видео наслагването е скрит + Банерът за преглед на продукти във видео наслагването е показан + Скриване на резултатите от уеб търсенето + Резултатите от уеб търсенето са скрити + Резултатите от уеб търсенето са показани. + + + Скриване на YouTube Premium промоциите + YouTube Premium промоциите са скрити. + YouTube Premium промоциите се показват. + + + Скриване на видео рекламите + Видео рекламите са скрити. + Видео рекламите се показват. + + + Връзката е копирана в клипборда. + URL адрес с отметка за време, копиран в клипборда. + Показване на бутона за копиране на URL адреса на видеоклипа + Бутонът за копиране на URL адрес на видео е показан. Докоснете, за да копирате URL адреса на видеото. Докоснете и задръжте, за да копирате с времева отметка + Бутонът за копиране на URL адрес на видео не е показан + Показване на бутона за копиране на URL адреса на времевия отпечатък на видеоклипа + Бутонът за копиране на URL адрес с времева отметка е показан. Докоснете, за да копирате URL адрес на видео с времева отметка. Докоснете и задръжте, за да копирате без времева отметка + Бутонът за копиране на URL адрес с времева отметка не е показан + + + Прозорец за възрастово ограничение + Диалоговият прозорец ще бъде премахнат + Диалоговият прозорец ще бъде показан + Тази функция не заобикаля възрастовото ограничение. Тя просто приема възрастовата граница автоматично. + + + Деактивиране на изскачащия прозорец „Вход в телевизор“ + Изскачащият прозорец „Влизане в телевизора“ е деактивиран + Изскачащият прозорец „Влизане в телевизора“ е активиран + + + Деактивиране на пропускане на глава с двойно докосване + Двойното докосване никога не може да предизвика пропускане до следваща/предишна глава + Двойното докосване може понякога да предизвика пропускане до следваща/предишна глава + + + Външни изтегляния + Настройки за използване на външно приложение за изтегляне + Показване на бутона за изтегляне чрез външно приложение + Бутонът за изтегляне в плейъра е показан + Бутонът за изтегляне в плейъра не е показан + + Заместване на бутона Download + Бутонът за изтегляне отваря избраното от Вас външно приложение за изтегляне + Бутонът за изтегляне отваря вграденото приложение за изтегляне + Име на пакета на изтеглящото приложение + Име на пакета на вашето инсталирано външно приложение за изтегляне + Въведете името на пакета + Други + Приложението не е инсталирано + %s не е инсталиран. Инсталирайте го. + "Не може да бъде намерено инсталирано приложение с име на пакет: %s Проверете дали името на пакета е правилно и приложението е инсталирано" - Името на пакета не може да бъде празно - - - Деактивиране на жеста за точно търсене - Жест отключен - Жест включен - - - Активиране на докосване за превъртане - Докоснете, за да търсите е активирано - Докосването за превъртане е деактивирано - - - Задаване на яркост чрез плъзгане - "Плъзгането за яркост на цял екран е активирано + Името на пакета не може да бъде празно + + + Деактивиране на жеста за точно търсене + Жест отключен + Жест включен + + + Активиране на докосване за превъртане + Докоснете, за да търсите е активирано + Докосването за превъртане е деактивирано + + + Задаване на яркост чрез плъзгане + "Плъзгането за яркост на цял екран е активирано Регулирайте яркостта, като плъзгате вертикално от лявата страна на екрана" - Плъзгането за яркост на цял екран е деактивирано - Настройване на звука чрез плъзгане - "Плъзгането за сила на звука на цял екран е активирано + Плъзгането за яркост на цял екран е деактивирано + Настройване на звука чрез плъзгане + "Плъзгането за сила на звука на цял екран е активирано Регулирайте силата на звука, като плъзнете вертикално от дясната страна на екрана" - Плъзгането за сила на звука на цял екран е деактивирано - Активиране на натискане, за да плъзнете - Натискането, за да плъзнете, е активирано - Натискането, за да плъзнете, е деактивирано - Активиране на хептичната обратна връзка - Тактилната обратна връзка е активирана - Тактилната обратна връзка е деактивирана - Запазване и възстановяване на яркостта - Запазване и възстаовяване яркостта при включване или изключване на цял екран - Не се запазва или възстаовява яркостта при включване или изключване на цял екран - Задаване на яркост чрез плъзгане - Плъзгането надолу до най-ниската стойност на жеста за яркост, за да се активира автоматичната яркост - Плъзгането надолу до най-ниската стойност на жеста за яркост, без дасе активира автоматичната яркост - Авто - Задръжка на плъзгащата контрола за показване - Време за което плъзгащата контрола е видима. - Плъзгане на фона на наслагването непрозрачност - Стойност на непрозрачността между 0-100 - Непрозрачността на плъзгането трябва да е между 0-100 - Цвят на наслагването за яркост при плъзгане - Цветът на лентата за състояние при контролиране на яркостта - Цвят на наслагването за сила на звука при плъзгане - Цветът на лентата за състояние при контролиране на силата на звука - Размер на текста на наслагването при плъзгане - Размерът на текста за наслагването при плъзгане между 1-30 - Размерът на текста трябва да е между 1-30 - Праг на величината на плъзгане - Праг преди да се осъществи плъзгането - Чувствителност при плъзгане за сила на звука - Колко се променя силата на звука при всяко плъзгане - Стил на наслагване при плъзгане - Хоризонтално наслагване - Хоризонтално наслагване (минимално – отгоре) - Хоризонтално наслагване (минимално – център) - Кръгово наслагване - Кръгово наслагване (минимално) - Вертикално наслагване - Вертикално наслагване (минимално) - Включване на превключване на видеото чрез плъзване - Плъзването в режим на цял екран ще превключи към следващото/предишно видео - Плъзването в режим на цял екран няма да превключи към следващото/предишно видео - - - Автоматични Субтитри - Автоматичните надписи са деактивирани - Автоматичните надписи са активирани - - - Бутони за действия - Скриване или показване на бутони под видеото - Деактивиране на светенето на бутон Like и Subscribe - Бутон Like и Subscribe няма да светят при споменаване - Бутон Like и Subscribe ще светят при споменаване - Бутони \"Харесвам\" и \"Не харесвам\" - Бутоните \"Харесвам\" и \"Не харесвам\" са скрити - Бутоните \"Харесвам\" и \"Не харесвам\" се показват - - Скриване на споделянето - Бутона за споделяне е скрит - Бутона за споделяне се показва - - Скриване на „Спиране на реклами“ - Бутонът за спиране на реклами е скрит - Бутонът за спиране на реклами е показан - - Скрий коментари - Бутонът за коментари е скрит - Бутонът за коментари е показан - + Скриване на споделянето + Бутона за споделяне е скрит + Бутона за споделяне се показва + + Скриване на „Спиране на реклами“ + Бутонът за спиране на реклами е скрит + Бутонът за спиране на реклами е показан + + Скрий коментари + Бутонът за коментари е скрит + Бутонът за коментари е показан + - Бутон за доклади - Бутона за докладване е скрит - Бутона за докладване се показва - - Бутон за ремикс - Бутона за ремикс е скрит - Бутона за ремикс се показва - - Бутон за изтегляне - Бутона за изтегляне е скрит - Бутона за изтегляне се показва - + Бутон за ремикс + Бутона за ремикс е скрит + Бутона за ремикс се показва + + Бутон за изтегляне + Бутона за изтегляне е скрит + Бутона за изтегляне се показва + - Скрий хайпа - Бутонът за хайп е скрит - Бутонът за хайп е показан - - Скриване на промоция - Бутонът за популяризиране е скрит - Бутонът за популяризиране е показан - - Бутон за благодарност - Бутона за благодарност е скрит - Бутона за благодарност се показва - + Скриване на промоция + Бутонът за популяризиране е скрит + Бутонът за популяризиране е показан + + Бутон за благодарност + Бутона за благодарност е скрит + Бутона за благодарност се показва + - Скриване на \"Попитай\" - Бутонът \"Попитай\" е скрит - Бутонът \"Попитай\" е показан - - Бутон за създаване на клип - Бутона за клип е скрит - Бутона за клип се показва - - Скрий магазин - Бутонът за магазин е скрит - Бутонът за магазин е показан - - Скриване на Запазване - Бутонът за запазване е скрит - Бутонът за запазване е показан - - - Бутони за навигация - Скриване или промяна на бутоните в лентата за навигация - - Бутон за Начало - Бутона за начало е скрит - Бутона за начало се показва - - Скриване на Shorts - Бутонът Shorts е скрит - Показан е бутон Shorts - - Бутон за създаване на клип - Бутонът за създаване е скрит - Бутона за създаване се показва - - Абонаменти - Бутона за абонаменти е скрит - Бутона за абонаменти се показва - Скриване на известията - Бутонът за известия е скрит - Бутонът за известия е показан - - Заменете бутона „Създаване“ с бутона „Известия“ - "Бутонът за създаване е сменен с бутона Известия + Скриване на \"Попитай\" + Бутонът \"Попитай\" е скрит + Бутонът \"Попитай\" е показан + + Бутон за създаване на клип + Бутона за клип е скрит + Бутона за клип се показва + + Скрий магазин + Бутонът за магазин е скрит + Бутонът за магазин е показан + + Скриване на Запазване + Бутонът за запазване е скрит + Бутонът за запазване е показан + + + Бутони за навигация + Скриване или промяна на бутоните в лентата за навигация + + Бутон за Начало + Бутона за начало е скрит + Бутона за начало се показва + + Скриване на Shorts + Бутонът Shorts е скрит + Показан е бутон Shorts + + Бутон за създаване на клип + Бутонът за създаване е скрит + Бутона за създаване се показва + + Абонаменти + Бутона за абонаменти е скрит + Бутона за абонаменти се показва + Скриване на известията + Бутонът за известия е скрит + Бутонът за известия е показан + + Заменете бутона „Създаване“ с бутона „Известия“ + "Бутонът за създаване е сменен с бутона Известия Забележка: Активирането на това също принудително скрива видео рекламите" - Бутоните \"Създаване\" и \"Известия\" не са разменени - "Деактивирането на тази настройка също ще деактивира блокирането на рекламите за Shorts. + Бутоните \"Създаване\" и \"Известия\" не са разменени + "Деактивирането на тази настройка също ще деактивира блокирането на рекламите за Shorts. Ако промяната на тази настройка не влезе в сила, опитайте да превключите в режим „инкогнито“." - Имена на бутоните на лентата за навигация - Етикетите са скрити - Етикетите се показват - Деактивирай полупрозрачната лента на състоянието - Статусная лента е непрозрачна - Статусная лента е непрозрачна или прозрачна - На някои устройства активирането на тази функция може да промени навигационната лента на системата на прозрачна. - Деактивирай полупрозрачната светла лента за навигация - Светлата лента за навигация е непрозрачна - Светлата лента за навигация е непрозрачна или прозрачна - Деактивиране на тъмната полупрозрачна лента - Тъмната лента за навигация е непрозрачна - Тъмната лента за навигация е непрозрачна или прозрачна - - - Падащо меню - Скриване или показване на елементи от падащото меню на плейъра - - Меню \"Субтитри\" - Менюто за субтитрие скрито - Менюто за субтитрие се показва - - Меню \"Допълнителни настройки\" - Допълнителните настройки са скрити - Допълнителните настройки се показват - - Менюто на таймера за заспиване - Менюто на таймера за заспиване е скрито - Менюто на таймера за заспиване се показва - - \"Повторно възпроизвеждане\" - Менюто за повторение е скрито - Менюто за повторение се показва - - Подсветка около видеото - Менюто за подсветка около видеото е скрито - Менюто за подсветка около видеото се показва - Меню за постоянна сила на звука - Постоянно ниво на звука се показва - Постоянно ниво на звука е скрито - - Помощ & Отзиви - Менюто & за помощ е скрито - Менюто & за помощ се показва - - Скриване на скоростта на възпроизвеждане - Менюто за скорост на видеото е скрито - Менюто за скорост на видеото се показва - - \"Заключен екран\" - Менюто на заключен екран е скрито - Менюто на заключен екран се показва - - Скриване на Слушане с YouTube Music - Менюто Слушане с YouTube Music е скрито - Менюто Слушане с YouTube Music е показано - - Избор на Аудио - Менюто за избор на Аудио е скрито - Менюто за избор на Аудио се показва - + Меню \"Субтитри\" + Менюто за субтитрие скрито + Менюто за субтитрие се показва + + Меню \"Допълнителни настройки\" + Допълнителните настройки са скрити + Допълнителните настройки се показват + + Менюто на таймера за заспиване + Менюто на таймера за заспиване е скрито + Менюто на таймера за заспиване се показва + + \"Повторно възпроизвеждане\" + Менюто за повторение е скрито + Менюто за повторение се показва + + Подсветка около видеото + Менюто за подсветка около видеото е скрито + Менюто за подсветка около видеото се показва + Меню за постоянна сила на звука + Постоянно ниво на звука се показва + Постоянно ниво на звука е скрито + + Помощ & Отзиви + Менюто & за помощ е скрито + Менюто & за помощ се показва + + Скриване на скоростта на възпроизвеждане + Менюто за скорост на видеото е скрито + Менюто за скорост на видеото се показва + + \"Заключен екран\" + Менюто на заключен екран е скрито + Менюто на заключен екран се показва + + Скриване на Слушане с YouTube Music + Менюто Слушане с YouTube Music е скрито + Менюто Слушане с YouTube Music е показано + + Избор на Аудио + Менюто за избор на Аудио е скрито + Менюто за избор на Аудио се показва + - "Менюто за аудиозапис е скрито + "Менюто за аудиозапис е скрито За да покажете менюто за аудиозапис, променете „Подправяне на видео потоци“ на „Android No SDK“" - - Гледайте във VR - Менюто за гледане в VR е скрито - Менюто за гледане в VR се показва - Скриване на менюто за качество на видеото - Менюто за качество на видеото е скрито - Менюто за качество на видеото е показано - Скриване на футъра на менюто за качество на видеото - Долният колонтитул на менюто за качество на видеото е скрит - Долният колонтитул на менюто за качество на видеото се показва - - - Скриване на бутона Autoplay - Бутона за авт. изпълнение е скрит - Бутона за авт. изпълнение се показва - - Скриване на бутона Captions - Бутона за субтити е скрит - Бутона за субтити се показва - Скриване на бутона Cast - Бутонът за предаване е скрит - Бутонът за предаване се показва - Скриване на фона на контролите на плейъра - Фонът на контролите на плейъра е скрит - Фонът на контролите на плейъра е показан - Скриване на бутоните \"Предишен и Следващ\" - Бутоните са скрити - Бутоните се показват - - - Скриване на препоръките в края - Препоръките в края са скрити - Препоръките в края се показват - - - Деактивиране на Ambient режим в цял екран - Подсветката в режим на цял екран е деактивирана - Подсветката в режим на цял екран е активирана - - - Скриване на инфо. карти - Информационните карти са скрити - Информационните карти се показват - - - Анимация на числа в реално време - Анимацията е деактивирана - Анимацията е активирана - - - Скриване на лентата за търсене на видео плейър - Лентата за време на плейъра е скрита - Лентата за време на плейъра се показва - - Скриване на лентата за търсене на миниатюри на видеоклипове - Лентата за търсене на миниатюри на видеоклипове е скрита - Лентата за търсене на миниатюри на видеоклипове е показана - - - Играч на Shorts - Скриване или показване на компонентите на плейъра за Shorts - - Скриване на Shorts в емисията Начало - Скрито в емисията Начало и свързани видеоклипове - Показано в емисията Начало и свързани видеоклипове - Shorts в резултатите от търсенето - Скрити в резултатите от търсенето - Показано в резултатите от търсенето - - Скриване на Shorts в емисията Абонаменти - Скрито в емисията Абонаменти - Показано в емисията Абонаменти - Скриване на шортите в историята на гледане - Скрито в историята на гледане - Показва се в историята на гледане - Скриване на етикета „Автоматично озвучено“ - Етикетът за автоматично озвучаване е скрит - Етикетът за автоматично озвучаване е показан - Скриване на бутона „Купете супер благодарности“ - Бутонът за Купи Super Thanks е скрит - Бутонът за Купи Super Thanks е показан - Скрий бутона за ефект - Бутонът за ефекти е скрит - Бутонът за ефекти е видим - Скриване на бутона „Зелен екран“ - Бутон \"Зелен екран\" е скрит - Бутон \"Зелен екран\" се показва - Скриване на бутона за хаштаг - Бутона за хаштаг е скрит - Бутона за хаштаг се показва - - Скриване на бутона Join - Бутона за присъединяване е скрит - Бутона за присъединяване се показва - Скриване на прегледа на живо - Прегледът на живо е скрит - Прегледът на живо е показан - Етикет за местоположение - Етикет за местоположение е скрит - Етикет за местоположение се показва - Скриване на бутона „Нови публикации“ - Бутонът \"Нови публикации\" е скрит - Бутонът \"Нови публикации\" се показва - Показване на бутони при пауза - Бутоните при пауза се скриват - Бутоните при пауза се показват - Скриване на коментара за визуализация - Коментарът за визуализация е скрит - Показва се визуализация на коментара - Скриване на бутона „Запазване на музика“ - Бутонът за запазване на музика е скрит - Показан е бутонът за запазване на музика - Скриване на предложенията за търсене - Предложенията за търсене са скрити - Предложенията за търсене се показват - Скриване на бутона Shop - Бутона за пазаруване е скрит - Бутона за пазаруване се показва - Скриване на стикери - Стикерите са скрити - Стикери са показани - Скриване на бутона Subscribe - Бутонът „Абониране“ е скрит - Бутонът „Абониране“ се показва - Скриване на маркираните продукти - Скрити - Показват се - Скриване на бутона Upcoming - Бутон \"Предстоящи събития\" е скрит - Бутон \"Предстоящи събития\" се показва - Скриване на бутона „Използване на този звук“ - Бутонът \"Използвайте този звук\" е скрит - Бутонът \"Използвайте този звук\" е показан - Скриване на бутона „Използване на този шаблон“ - Бутонът \"Използвайте този шаблон\" е скрит - Бутонът „Използване на този шаблон“ е видим - Скриване на анимацията на Like бутона - Анимацията на бутона „Харесва ми“ е скрита - Анимацията на бутона „Харесва ми“ се показва - Скриване на бутона Like - Бутона за харесване е скрит - Бутона за харесване се показва - Скриване на бутона Dislike - Бутона за нехаресване е скрит - Бутона за нехаресване се показва - Скриване на бутона Comments - Бутон за коментари е скрит - Бутон за коментари се показва - - Скриване на бутона Share - Бутона за споделяне е скрит - Бутона за споделяне се показва - - Скриване на бутона Remix - Бутона за ремикс е скрит - Бутона за ремикс се показва - Скрийте бутона „Звук“ - Бутона за Звук е скрит - Бутона за Звук се показва - Информационни панели - Информационните панели са скрити - Информационните панели се показват - Скриване на лентата на канала - Лентата на канала е скрита. - Лентата на канала е показана. - Заглавие на видеото - Заглавието на видеоклипа е скрито - Заглавието на видеоклипа е показано - Скриване на музикални метаданни - Етикетът за метаданни за звук е скрит - Етикетът за метаданни за звук е показан - Скриване на етикета на видеовръзката - Етикетът за видео връзка е скрит - Етикетът за видео връзка се показва - Скриване лентата за навигация - Навигационната лента е скрита - Навигационната лента се показва - - - Скриване на предложеното видео в края на екрана - "Предложеното видео в края на екрана е скрито, когато автоматичното пускане е изключено + + Гледайте във VR + Менюто за гледане в VR е скрито + Менюто за гледане в VR се показва + Скриване на менюто за качество на видеото + Менюто за качество на видеото е скрито + Менюто за качество на видеото е показано + Скриване на футъра на менюто за качество на видеото + Долният колонтитул на менюто за качество на видеото е скрит + Долният колонтитул на менюто за качество на видеото се показва + + + Скриване на бутона Autoplay + Бутона за авт. изпълнение е скрит + Бутона за авт. изпълнение се показва + + Скриване на бутона Captions + Бутона за субтити е скрит + Бутона за субтити се показва + Скриване на бутона Cast + Бутонът за предаване е скрит + Бутонът за предаване се показва + Скриване на фона на контролите на плейъра + Фонът на контролите на плейъра е скрит + Фонът на контролите на плейъра е показан + Скриване на бутоните \"Предишен и Следващ\" + Бутоните са скрити + Бутоните се показват + + + Скриване на препоръките в края + Препоръките в края са скрити + Препоръките в края се показват + + + Деактивиране на Ambient режим в цял екран + Подсветката в режим на цял екран е деактивирана + Подсветката в режим на цял екран е активирана + + + Скриване на инфо. карти + Информационните карти са скрити + Информационните карти се показват + + + Анимация на числа в реално време + Анимацията е деактивирана + Анимацията е активирана + + + Скриване на лентата за търсене на видео плейър + Лентата за време на плейъра е скрита + Лентата за време на плейъра се показва + + Скриване на лентата за търсене на миниатюри на видеоклипове + Лентата за търсене на миниатюри на видеоклипове е скрита + Лентата за търсене на миниатюри на видеоклипове е показана + + + Играч на Shorts + Скриване или показване на компонентите на плейъра за Shorts + + Скриване на Shorts в емисията Начало + Скрито в емисията Начало и свързани видеоклипове + Показано в емисията Начало и свързани видеоклипове + Shorts в резултатите от търсенето + Скрити в резултатите от търсенето + Показано в резултатите от търсенето + + Скриване на Shorts в емисията Абонаменти + Скрито в емисията Абонаменти + Показано в емисията Абонаменти + Скриване на шортите в историята на гледане + Скрито в историята на гледане + Показва се в историята на гледане + Скриване на етикета „Автоматично озвучено“ + Етикетът за автоматично озвучаване е скрит + Етикетът за автоматично озвучаване е показан + Скриване на бутона „Купете супер благодарности“ + Бутонът за Купи Super Thanks е скрит + Бутонът за Купи Super Thanks е показан + Скрий бутона за ефект + Бутонът за ефекти е скрит + Бутонът за ефекти е видим + Скриване на бутона „Зелен екран“ + Бутон \"Зелен екран\" е скрит + Бутон \"Зелен екран\" се показва + Скриване на бутона за хаштаг + Бутона за хаштаг е скрит + Бутона за хаштаг се показва + + Скриване на бутона Join + Бутона за присъединяване е скрит + Бутона за присъединяване се показва + Скриване на прегледа на живо + Прегледът на живо е скрит + Прегледът на живо е показан + Етикет за местоположение + Етикет за местоположение е скрит + Етикет за местоположение се показва + Скриване на бутона „Нови публикации“ + Бутонът \"Нови публикации\" е скрит + Бутонът \"Нови публикации\" се показва + Показване на бутони при пауза + Бутоните при пауза се скриват + Бутоните при пауза се показват + Скриване на коментара за визуализация + Коментарът за визуализация е скрит + Показва се визуализация на коментара + Скриване на бутона „Запазване на музика“ + Бутонът за запазване на музика е скрит + Показан е бутонът за запазване на музика + Скриване на предложенията за търсене + Предложенията за търсене са скрити + Предложенията за търсене се показват + Скриване на бутона Shop + Бутона за пазаруване е скрит + Бутона за пазаруване се показва + Скриване на стикери + Стикерите са скрити + Стикери са показани + Скриване на бутона Subscribe + Бутонът „Абониране“ е скрит + Бутонът „Абониране“ се показва + Скриване на маркираните продукти + Скрити + Показват се + Скриване на бутона Upcoming + Бутон \"Предстоящи събития\" е скрит + Бутон \"Предстоящи събития\" се показва + Скриване на бутона „Използване на този звук“ + Бутонът \"Използвайте този звук\" е скрит + Бутонът \"Използвайте този звук\" е показан + Скриване на бутона „Използване на този шаблон“ + Бутонът \"Използвайте този шаблон\" е скрит + Бутонът „Използване на този шаблон“ е видим + Скриване на анимацията на Like бутона + Анимацията на бутона „Харесва ми“ е скрита + Анимацията на бутона „Харесва ми“ се показва + Скриване на бутона Like + Бутона за харесване е скрит + Бутона за харесване се показва + Скриване на бутона Dislike + Бутона за нехаресване е скрит + Бутона за нехаресване се показва + Скриване на бутона Comments + Бутон за коментари е скрит + Бутон за коментари се показва + + Скриване на бутона Share + Бутона за споделяне е скрит + Бутона за споделяне се показва + + Скриване на бутона Remix + Бутона за ремикс е скрит + Бутона за ремикс се показва + Скрийте бутона „Звук“ + Бутона за Звук е скрит + Бутона за Звук се показва + Информационни панели + Информационните панели са скрити + Информационните панели се показват + Скриване на лентата на канала + Лентата на канала е скрита. + Лентата на канала е показана. + Заглавие на видеото + Заглавието на видеоклипа е скрито + Заглавието на видеоклипа е показано + Скриване на музикални метаданни + Етикетът за метаданни за звук е скрит + Етикетът за метаданни за звук е показан + Скриване на етикета на видеовръзката + Етикетът за видео връзка е скрит + Етикетът за видео връзка се показва + Скриване лентата за навигация + Навигационната лента е скрита + Навигационната лента се показва + + + Скриване на предложеното видео в края на екрана + "Предложеното видео в края на екрана е скрито, когато автоматичното пускане е изключено Автоматичното пускане може да бъде променено в настройките на YouTube: Настройки → Възпроизвеждане → Автоматично пускане на следващото видео" - Предложеното видео в края на екрана е показано - - - Скриване на наслагването със свързани видеоклипове - Наслагването със свързани видеоклипове на цял екран е скрито - Наслагването със свързани видеоклипове на цял екран е показано - - - Скриване на клеймото за време на видеоклипа - Скрито - Показва се - - - Изскачащи панели на плейъра - Изскачащите панели на плейъра са скрити - Изскачащите панели на плейъра се показват - - - Изход от режим на цял екран в края на видеото - Деактивирано - Портрет - Пейзаж - Портрет и пейзаж - - - Отваряне на видеоклипове в портретен режим на цял екран - Видеоклиповете се отварят на цял екран - Видеоклиповете Не се отварят на цял екран - - - Прозрачност на настройките в Плеара - Стойност на прозрачност между 0-100, където 0 е прозрачно - Прозрачността на менюто на плейъра трябва да бъде между 0-100 - - - - Нехаресванията временно не са налични (API timed out) - Нехаресванията не са налични (status %d) - Не са налични нехаресвания (ограничение на клиентския API) - Нехаресванията не са налични (%s) - - Презареди видеото за гласуване с ReturnYouTubeDislike - - Скрито от собственика - Нехаресванията се показват - Нехаресванията не се показват - Пок. нехаресвания в кратките клипове - "Нехаресванията на Shorts са показани + Предложеното видео в края на екрана е показано + + + Скриване на наслагването със свързани видеоклипове + Наслагването със свързани видеоклипове на цял екран е скрито + Наслагването със свързани видеоклипове на цял екран е показано + + + Скриване на клеймото за време на видеоклипа + Скрито + Показва се + + + Изскачащи панели на плейъра + Изскачащите панели на плейъра са скрити + Изскачащите панели на плейъра се показват + + + Изход от режим на цял екран в края на видеото + Деактивирано + Портрет + Пейзаж + Портрет и пейзаж + + + Отваряне на видеоклипове в портретен режим на цял екран + Видеоклиповете се отварят на цял екран + Видеоклиповете Не се отварят на цял екран + + + Прозрачност на настройките в Плеара + Стойност на прозрачност между 0-100, където 0 е прозрачно + Прозрачността на менюто на плейъра трябва да бъде между 0-100 + + + + Нехаресванията временно не са налични (API timed out) + Нехаресванията не са налични (status %d) + Не са налични нехаресвания (ограничение на клиентския API) + Нехаресванията не са налични (%s) + + Презареди видеото за гласуване с ReturnYouTubeDislike + + Скрито от собственика + Нехаресванията се показват + Нехаресванията не се показват + Пок. нехаресвания в кратките клипове + "Нехаресванията на Shorts са показани Ограничение: Нехаресванията може да не се показват в режим инкогнито" - Нехаресванията на Shorts не са показани - Нехаресвания като процент - Нехаресванията са показани като процент - Нехаресванията са показани като число - - Компактен Like бутон - Включен компактен бутон \"Харесва ми\" - Най-добър изглед на бутона за харесване - Показване на прогнозни харесвания - Видеата с деактивирани харесвания показват прогнозен брой харесвания - Прогнозните харесвания не се показват - Показване на известие, ако API не е наличен - Показва известие, ако Return YouTube Dislike не е наличен - Не се показва известие, ако ReturnYouTube Dislike не е наличен - Данните за нехаресване са от Return YouTube Dislike API. Докоснете за да научите повече - - Статистика Return YouTube Dislike API на това устройство - Време за отговор на API, средно - Време за отговор на API, минимално - Време за отговор на API, максимално - Време за отговор на API, последно видео - Нехаресванията временно не са налични - в сила е лимитът API клиента - API получава гласове, брой заявки - Неуспешни мрежови заявки - %d мрежови заявки - API извлича гласове, брой изчаквания - Мрежовите заявки нямаха изчакване - %d изтече времето за изчакване на мрежовите повиквания - Ограничения на скоростта на API клиент - Ограниченията на скоростта на клиента на Api не са открити - Открити са ограничения на скоростта на клиента на Api %d пъти - %d милисекунди - - - Широка лента за търсене - Широката лента за търсене е включена - Широката лента за търсене е изключена - - - Активиране на висококачествени миниатюри - Миниатюри с високо качество в лентата на възпроизвеждане - Миниатюри с средно качество в лентата на възпроизвеждане - "Това също ще възстанови миниатюрите на предавания на живо, които нямат миниатюри на плъзгача. + Нехаресванията на Shorts не са показани + Нехаресвания като процент + Нехаресванията са показани като процент + Нехаресванията са показани като число + + Компактен Like бутон + Включен компактен бутон \"Харесва ми\" + Най-добър изглед на бутона за харесване + Показване на прогнозни харесвания + Видеата с деактивирани харесвания показват прогнозен брой харесвания + Прогнозните харесвания не се показват + Показване на известие, ако API не е наличен + Показва известие, ако Return YouTube Dislike не е наличен + Не се показва известие, ако ReturnYouTube Dislike не е наличен + Данните за нехаресване са от Return YouTube Dislike API. Докоснете за да научите повече + + Статистика Return YouTube Dislike API на това устройство + Време за отговор на API, средно + Време за отговор на API, минимално + Време за отговор на API, максимално + Време за отговор на API, последно видео + Нехаресванията временно не са налични - в сила е лимитът API клиента + API получава гласове, брой заявки + Неуспешни мрежови заявки + %d мрежови заявки + API извлича гласове, брой изчаквания + Мрежовите заявки нямаха изчакване + %d изтече времето за изчакване на мрежовите повиквания + Ограничения на скоростта на API клиент + Ограниченията на скоростта на клиента на Api не са открити + Открити са ограничения на скоростта на клиента на Api %d пъти + %d милисекунди + + + Широка лента за търсене + Широката лента за търсене е включена + Широката лента за търсене е изключена + + + Активиране на висококачествени миниатюри + Миниатюри с високо качество в лентата на възпроизвеждане + Миниатюри с средно качество в лентата на възпроизвеждане + "Това също ще възстанови миниатюрите на предавания на живо, които нямат миниатюри на плъзгача. Миниатюрите на плъзгача ще използват същото качество като текущото видео. Тази функция работи най-добре с видео качество от 720p или по-ниско и при използване на много бърза интернет връзка." - Стари миниатюри на времевата линия - Над лентата за възпроизвеждане се появяват миниатюри - Миниатюрите се показват в режим на цял екран - - - Включване на SponsorBlock - SponsorBlock е система с отворен код за прескачане на досадни части от видеоклипове в YouTube - Външен вид - Бутона за гласуване - Бутона за гласуване на част се показва - Бутона за гласуване на част е скрит - Използване на квадратно оформление - Бутоните и контролите са квадратни - Бутоните и контролите са заоблени - - Използване на компактен бутон \"Пропускане\" - Мин. ширина на бутона за пропускане - Най-добър изглед на бутона за пропускане - Автоматично скриване на бутона \"Пропускане\" - Бутона за пропускане се скрива след няколко секунди - Бутонът \"Пропускане\" е показан за целия сегмент - Продължителност на бутона за пропускане - Колко дълго да се показват бутоните за пропускане и преминаване към акцент, преди да се скрият автоматично - Показване на известие за отмяна на пропускането - Показва се известие, когато сегмент е автоматично пропуснат. Докоснете известието, за да отмените пропускането - Изскачащо съобщение не се показва - Продължителност на изскачащото съобщение за пропускане - Колко дълго да се показва известието за отмяна на пропускането - 1 секунда - 2 секунди - 3 секунди - 4 секунди - 5 секунди - 6 секунди - 7 секунди - 8 секунди - 9 секунди - 10 секунди - Показване на дължината на видеото без сигментите - Дължината на видеото без всички сегменти се показва на лентата за напредък - Цялата дължина на видето се показва - Създаване на нови части - Показване на бутон \"Създаване на нов сегмент\" - Бутона създаване за нова част се показва - Бутона създаване за нова част не се показва - Настройване стъпка на новата част - Милисекундите с който се преместват бутоните за настройка при създаване на част - Стойността трябва да е положително число - Вижте указанията - Указанията съдържат правила и съвети за създаване на нови части - Следвайте указанията - Прочетете указанията на SponsorBlock преди да създадете нови части - Вече ги прочетох - Покажи ми - Основен - Показване на известие, ако API не е наличен - Показва се известие, ако SponsorBlock не е наличен - Показва се известие, ако SponsorBlock не е наличен - Прослед. на броя пропускания - Показва в класацията на SponsorBlock колко време е спестено. Съобщение се изпраща при всяка пропусната част - Прослед. на броя пропускания е изключен - Минимална продължителност на сегмента - Части, по-кратки от тази стойност (в секунди) няма да бъдат пропускани или показвани - Невалидна времетраене - Вашият уникален потребителски id - Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи вместо вас. - Личният Id трябва да е с дължина поне 30 знака - Промяна URL на API - Адресът, който SponsorBlock използва за свързване към сървъра - Нулиране URL адреса, на API. - URL адресът е невалиден - URL API е променен. - Импортиране / Експортиране на настройките - Копирай - Вашата JSON конфигурация на SponsorBlock може да бъде импортирана/експортирана в ReVanced и други платформи на SponsorBlock - Вашата SponsorBlock JSON конфигурация която може да се импортира/експортира до ReVanced или други платформи ползващи SponsorBlock. Това включва вашия потребителски id. Споделяйте това разумно - Настройките са успешно въстановени - Неуспешно импортиране: %s - Неуспешно експортиране на %s - "Вашите настройки съдържат поверителен идентификатор на потребител на SponsorBlock. + Стари миниатюри на времевата линия + Над лентата за възпроизвеждане се появяват миниатюри + Миниатюрите се показват в режим на цял екран + + + Включване на SponsorBlock + SponsorBlock е система с отворен код за прескачане на досадни части от видеоклипове в YouTube + Външен вид + Бутона за гласуване + Бутона за гласуване на част се показва + Бутона за гласуване на част е скрит + Използване на квадратно оформление + Бутоните и контролите са квадратни + Бутоните и контролите са заоблени + + Използване на компактен бутон \"Пропускане\" + Мин. ширина на бутона за пропускане + Най-добър изглед на бутона за пропускане + Автоматично скриване на бутона \"Пропускане\" + Бутона за пропускане се скрива след няколко секунди + Бутонът \"Пропускане\" е показан за целия сегмент + Продължителност на бутона за пропускане + Колко дълго да се показват бутоните за пропускане и преминаване към акцент, преди да се скрият автоматично + Показване на известие за отмяна на пропускането + Показва се известие, когато сегмент е автоматично пропуснат. Докоснете известието, за да отмените пропускането + Изскачащо съобщение не се показва + Продължителност на изскачащото съобщение за пропускане + Колко дълго да се показва известието за отмяна на пропускането + 1 секунда + 2 секунди + 3 секунди + 4 секунди + 5 секунди + 6 секунди + 7 секунди + 8 секунди + 9 секунди + 10 секунди + Показване на дължината на видеото без сигментите + Дължината на видеото без всички сегменти се показва на лентата за напредък + Цялата дължина на видето се показва + Създаване на нови части + Показване на бутон \"Създаване на нов сегмент\" + Бутона създаване за нова част се показва + Бутона създаване за нова част не се показва + Настройване стъпка на новата част + Милисекундите с който се преместват бутоните за настройка при създаване на част + Стойността трябва да е положително число + Вижте указанията + Указанията съдържат правила и съвети за създаване на нови части + Следвайте указанията + Прочетете указанията на SponsorBlock преди да създадете нови части + Вече ги прочетох + Покажи ми + Основен + Показване на известие, ако API не е наличен + Показва се известие, ако SponsorBlock не е наличен + Показва се известие, ако SponsorBlock не е наличен + Прослед. на броя пропускания + Показва в класацията на SponsorBlock колко време е спестено. Съобщение се изпраща при всяка пропусната част + Прослед. на броя пропускания е изключен + Минимална продължителност на сегмента + Части, по-кратки от тази стойност (в секунди) няма да бъдат пропускани или показвани + Невалидна времетраене + Вашият уникален потребителски id + Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи вместо вас. + Личният Id трябва да е с дължина поне 30 знака + Промяна URL на API + Адресът, който SponsorBlock използва за свързване към сървъра + Нулиране URL адреса, на API. + URL адресът е невалиден + URL API е променен. + Импортиране / Експортиране на настройките + Копирай + Вашата JSON конфигурация на SponsorBlock може да бъде импортирана/експортирана в ReVanced и други платформи на SponsorBlock + Вашата SponsorBlock JSON конфигурация която може да се импортира/експортира до ReVanced или други платформи ползващи SponsorBlock. Това включва вашия потребителски id. Споделяйте това разумно + Настройките са успешно въстановени + Неуспешно импортиране: %s + Неуспешно експортиране на %s + "Вашите настройки съдържат поверителен идентификатор на потребител на SponsorBlock. Идентификаторът на потребителя е като парола и никога не трябва да се споделя. " - Не показвай отново - Промени поведението на сигмента - Спонсори - Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора - Неплатена/Самореклама - Подобно на Sponsor, но за неплатена или собствена промоция. Включва секции за стоки, дарения или информация за това с кого са си сътрудничили - Напомняне за действие (абониране) - Кратко напомняне да харесате, абонирате или последвате в средата на съдържанието. Ако е дълго или за нещо конкретно, вместо това трябва да бъде самореклама - Акценти - Частта от видеото която повечето хора търсят - Пауза / Начална анимация - Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация - Край на клипа / Надписи - Информация или когато се показват крайните карти на YouTube. Не за заключения с информация - Начало / Поздрави - Озвучени трейлъри за предстоящото видео, поздрави и сбогувания. Не включва секции, които добавят допълнително съдържание - Предварителен преглед / Резюме - Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа - Отклонение / Шеги - Странични сцени или шеги, които не са необходими за разбиране на основното съдържание на видеоклипа. Не включва секции, предоставящи контекст или фонови детайли - Музика: Част без музика - За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория - Пропусни - Акценти - Пропусни спонсор - Пропусни промоция - Пропусни подканване - Пропусни до акценти - Пропуснете въведението - Пропусни пауза - Пропусни пауза - Пропусни заключение - Пропускане на увод - Пропусни преглед - Пропусни преглед - Пропуснете обобщението - Пропускане на отклонение - Пропусни част без музика - Пропускане на сегмент - Пропуснат спонсор - Пропусната самореклама - Пропуснато досадно напомняне - Пропуснато до акцент - Пропуснато въведение - Пропусни паузи - Пропусни паузи - Пропуснато заключение - Пропуснато увод - Пропуснат преглед - Пропуснат преглед - Пропуснато повторение - Пропуснато отклонение - Пропусната част без музика - Пропуснат неизпратен сегмент - Пропуснати множество части - Автоматично пропускане - Авт. пропускане веднъж - Показване на бутон \"Пропускане\" - Показв. в лентата за време - Деактивиране - Не може да се изпрати сегмент: %s - SponsorBlock временно не работи - Не могат да се изпратят сигменти: (статус:%1$d %2$s) - Неуспешно изпращане на сегмент. Ограничена скорост (твърде много от един и същ потребител или IP) - Не може да се изпрати частта: %s - "Не може да се изпрати сегментът. + Не показвай отново + Промени поведението на сигмента + Спонсори + Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора + Неплатена/Самореклама + Подобно на Sponsor, но за неплатена или собствена промоция. Включва секции за стоки, дарения или информация за това с кого са си сътрудничили + Напомняне за действие (абониране) + Кратко напомняне да харесате, абонирате или последвате в средата на съдържанието. Ако е дълго или за нещо конкретно, вместо това трябва да бъде самореклама + Акценти + Частта от видеото която повечето хора търсят + Пауза / Начална анимация + Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация + Край на клипа / Надписи + Информация или когато се показват крайните карти на YouTube. Не за заключения с информация + Начало / Поздрави + Озвучени трейлъри за предстоящото видео, поздрави и сбогувания. Не включва секции, които добавят допълнително съдържание + Предварителен преглед / Резюме + Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа + Отклонение / Шеги + Странични сцени или шеги, които не са необходими за разбиране на основното съдържание на видеоклипа. Не включва секции, предоставящи контекст или фонови детайли + Музика: Част без музика + За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория + Пропусни + Акценти + Пропусни спонсор + Пропусни промоция + Пропусни подканване + Пропусни до акценти + Пропуснете въведението + Пропусни пауза + Пропусни пауза + Пропусни заключение + Пропускане на увод + Пропусни преглед + Пропусни преглед + Пропуснете обобщението + Пропускане на отклонение + Пропусни част без музика + Пропускане на сегмент + Пропуснат спонсор + Пропусната самореклама + Пропуснато досадно напомняне + Пропуснато до акцент + Пропуснато въведение + Пропусни паузи + Пропусни паузи + Пропуснато заключение + Пропуснато увод + Пропуснат преглед + Пропуснат преглед + Пропуснато повторение + Пропуснато отклонение + Пропусната част без музика + Пропуснат неизпратен сегмент + Пропуснати множество части + Автоматично пропускане + Авт. пропускане веднъж + Показване на бутон \"Пропускане\" + Показв. в лентата за време + Деактивиране + Не може да се изпрати сегмент: %s + SponsorBlock временно не работи + Не могат да се изпратят сигменти: (статус:%1$d %2$s) + Неуспешно изпращане на сегмент. Ограничена скорост (твърде много от един и същ потребител или IP) + Не може да се изпрати частта: %s + "Не може да се изпрати сегментът. Вече съществува" - Частта е изпратена успешно - - SponsorBlock временно не е наличен (API timed out) - SponsorBlock временно не е наличен (status %d) - SponsorBlock временно не е наличен - Не може да се гласува за сегмент (API timed out) - Не може да се гласува за частите: (статус: %1$d %2$s) - Не може да се гласува за част: %s - Положителен вот - Отрицателен вот - Промяна на категорията - Няма сегменти, за които да гласувате - - %1$s до %2$s - Изберете категория сегмент - Категорията е изкл. в настройките. Вкл. я за да можете да изпратите. - Нова част в SponsorBlock - Задаване на %s като начало или край на нов раздел? - Начало - Край - Сега - Частта започва от - Частта свършва до - Времената точни ли са? - "Сегментът е от + Частта е изпратена успешно + + SponsorBlock временно не е наличен (API timed out) + SponsorBlock временно не е наличен (status %d) + SponsorBlock временно не е наличен + Не може да се гласува за сегмент (API timed out) + Не може да се гласува за частите: (статус: %1$d %2$s) + Не може да се гласува за част: %s + Положителен вот + Отрицателен вот + Промяна на категорията + Няма сегменти, за които да гласувате + + %1$s до %2$s + Изберете категория сегмент + Категорията е изкл. в настройките. Вкл. я за да можете да изпратите. + Нова част в SponsorBlock + Задаване на %s като начало или край на нов раздел? + Начало + Край + Сега + Частта започва от + Частта свършва до + Времената точни ли са? + "Сегментът е от \"%1$s\" до @@ -1281,46 +1280,46 @@ Second \"item\" text" (\"%3$s\") Готови ли сте да го изпратите?" - Началото трябва да бъде преди края - Първо маркирайте две места в лентата за времето - Преглед и проверка на частта за нормално пропускане - Ръчно редактиране на времената на частта - Желаете ли да редактирате времената за начало или край на частта? - Зададено е невалидно време - Статистика - - Статистиките временно не са налични (API не работи) - Зареждане... - SponsorBlock е деактивиран. - Вашето потреб. име: <b>%s</b> - Докоснете за промяна потребителското име - Не може да се промени потреб. име: Състояние: %1$d%2$s - Потребителското име е успешно променено. - Репутацията ви е <b>%.2f</b> - Създадохте <b>%s</b> части - Докоснете тук, за да видите вашите сегменти - SponsorBlock класация - Спасихте хората от <b>%s</b> части - Докоснете за да видите статистиката и тези допринесли най-много - Това е <b>%s</b> от живота им.<br>Щракнете, за да видите класацията - Пропуснали сте <b>%s</b> части - Това е <b>%s</b> - Нулиране на брояча на пропуснати части? - %1$s часове %2$s минути - %1$s минути %2$s секунди - %s секунди - Непрозрачност: - Цвят: - За програмата - Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния - - - Формат на екрана /Таблет, Телфон, .../ - По подразбиране - Телефон - Таблет - Автомобил - "Промените включват: + Началото трябва да бъде преди края + Първо маркирайте две места в лентата за времето + Преглед и проверка на частта за нормално пропускане + Ръчно редактиране на времената на частта + Желаете ли да редактирате времената за начало или край на частта? + Зададено е невалидно време + Статистика + + Статистиките временно не са налични (API не работи) + Зареждане... + SponsorBlock е деактивиран. + Вашето потреб. име: <b>%s</b> + Докоснете за промяна потребителското име + Не може да се промени потреб. име: Състояние: %1$d%2$s + Потребителското име е успешно променено. + Репутацията ви е <b>%.2f</b> + Създадохте <b>%s</b> части + Докоснете тук, за да видите вашите сегменти + SponsorBlock класация + Спасихте хората от <b>%s</b> части + Докоснете за да видите статистиката и тези допринесли най-много + Това е <b>%s</b> от живота им.<br>Щракнете, за да видите класацията + Пропуснали сте <b>%s</b> части + Това е <b>%s</b> + Нулиране на брояча на пропуснати части? + %1$s часове %2$s минути + %1$s минути %2$s секунди + %s секунди + Непрозрачност: + Цвят: + За програмата + Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния + + + Формат на екрана /Таблет, Телфон, .../ + По подразбиране + Телефон + Таблет + Автомобил + "Промените включват: Оформление за таблет • Публикациите на общността са скрити @@ -1328,314 +1327,312 @@ Second \"item\" text" Автомобилно оформление • Shorts се отварят в обикновения плейър • Каналът е организиран по теми и канали" - - - Подлъгване за версията на приложението - Подправена версия - Не подправена версия - "Версията на приложението ще бъде фалшифицирана по-стара версия на YouTube. + + + Подлъгване за версията на приложението + Подправена версия + Не подправена версия + "Версията на приложението ще бъде фалшифицирана по-стара версия на YouTube. Това ще промени външния вид и функциите на приложението, но може да възникнат неизвестни странични ефекти. Ако по-късно бъде изключено, препоръчително е да изчистите данните на приложението, за да предотвратите грешки в потребителския интерфейс." - Подлъгване за версията на - 20.13.41 - Възстановяване на несгъваема лента с действия за видео - 20.05.46 - Възстановяване на функционалността на преписа - 19.35.36 - Възстановете старите икони на Shorts в плейъра - 19.01.34 - Възстановяване на стари икони за навигация - - - Промяна на началната страница - По подразбиране - Всички абонаменти - Разглеждане на канала - Курсове / Учене - Разгледайте - Мода и Красота - Игри - История - Библиотека - Харесани видеа - На Живо - Филми - Музика - Новини - Известия - Списъци за възпроизвеждане - Търсене - Пазаруване - Спорт - Абонаменти - Популярни - Виртуална реалност - Гледай по-късно - Вашите клипове - Винаги променяйте началната страница - "Началната страница винаги се променя + Подлъгване за версията на + 20.13.41 - Възстановяване на несгъваема лента с действия за видео + 20.05.46 - Възстановяване на функционалността на преписа + 19.35.36 - Възстановете старите икони на Shorts в плейъра + 19.01.34 - Възстановяване на стари икони за навигация + + + Промяна на началната страница + По подразбиране + Всички абонаменти + Разглеждане на канала + Курсове / Учене + Разгледайте + Мода и Красота + Игри + История + Библиотека + Харесани видеа + На Живо + Филми + Музика + Новини + Известия + Списъци за възпроизвеждане + Търсене + Пазаруване + Спорт + Абонаменти + Популярни + Виртуална реалност + Гледай по-късно + Вашите клипове + Винаги променяйте началната страница + "Началната страница винаги се променя Ограничение: Използването на бутона за връщане назад в лентата с инструменти може да не работи" - Началната страница се променя само при стартиране на приложението - - - Скриване на Shorts плейъра при стартиране - Shorts плейъра при стартиране на приложението е скрит - Shorts плейъра при стартиране на приложението се показва - - - Отворете Shorts с - Играч на Shorts - Обикновен плейър - Обикновен плейър на цял екран - - - Автоматично пускане Shorts - Shorts ще се пускат автоматично - Shorts ще се повторят - Автоматично пускане на Shorts във фонов режим - Shorts ще се възпроизвеждат автоматично един след друг във фонов режим - Shorts ще се повтори във фонов режим - - - Минимизиран екран за възпроизвеждане - Промяна на стила на минимизиран плейър в приложението - Минимизиран тип екран за гледане - Деактивирано - По подразбиране - Минимално - Таблет - Модерен 1 - Модерен 2 - Модерен 3 - Модерен 4 - Деактивиране на заоблени ъгли - Ъглите са нормални - Ъглите са заоблени - Активирайте двойното докосване и щипване за преоразмеряване - "Активирано е двойно докосване и щипка за преоразмеряване + Началната страница се променя само при стартиране на приложението + + + Скриване на Shorts плейъра при стартиране + Shorts плейъра при стартиране на приложението е скрит + Shorts плейъра при стартиране на приложението се показва + + + Отворете Shorts с + Играч на Shorts + Обикновен плейър + Обикновен плейър на цял екран + + + Автоматично пускане Shorts + Shorts ще се пускат автоматично + Shorts ще се повторят + Автоматично пускане на Shorts във фонов режим + Shorts ще се възпроизвеждат автоматично един след друг във фонов режим + Shorts ще се повтори във фонов режим + + + Минимизиран екран за възпроизвеждане + Промяна на стила на минимизиран плейър в приложението + Минимизиран тип екран за гледане + Деактивирано + По подразбиране + Минимално + Таблет + Модерен 1 + Модерен 2 + Модерен 3 + Модерен 4 + Деактивиране на заоблени ъгли + Ъглите са нормални + Ъглите са заоблени + Активирайте двойното докосване и щипване за преоразмеряване + "Активирано е двойно докосване и щипка за преоразмеряване • Двойно докосване за увеличаване на размера на мини плейъра • Двойно докосване отново, за да възстановите оригиналния размер" - Двойно докосване и щипване за преоразмеряване е деактивирано - Деактивиране на плъзгане и пускане - Плъзгането и преместването е деактивирано - "Включено е плъзгане и пускане + Двойно докосване и щипване за преоразмеряване е деактивирано + Деактивиране на плъзгане и пускане + Плъзгането и преместването е деактивирано + "Включено е плъзгане и пускане Мини плейърът може да бъде плъзган до всеки ъгъл на екрана" - Деактивиране на хоризонтален жест за плъзгане - Жестът за хоризонтално плъзгане е деактивиран - "Активиран е хоризонтален жест за плъзгане + Деактивиране на хоризонтален жест за плъзгане + Жестът за хоризонтално плъзгане е деактивиран + "Активиран е хоризонтален жест за плъзгане Мини плейърът може да бъде плъзган извън екрана наляво или надясно" - Скриване на бутоните за наслагване - Бутоните за наслагване са скрити - Бутоните за наслагване са показани - Екранни текстове, етикети - Скрити - Показват се - Бутони за напред и назад - Бутони за напред и назад са скрити - Бутони за напред и назад са показани - Първоначален размер - Първоначален размер на екрана, в пиксели - Размерът на пиксела трябва да бъде между %1$s и %2$s - Прозрачност на менютата - Стойност на прозрачност между 0-100, където 0 е прозрачно - Прозрачността на менюто трябва да бъде между 0-100 - - - Фон на екрана при зареждане на видео - Екранът за зареждане ще има градиентен фон - Екранът за зареждане ще има плътен фон - Стил на началния екран - Цвят - Черно и бяло - Промяна на цвета на индикатора за време - Показва се персонализиран цвят на лентата за напредък - Показва се оригиналния цвят на лентата за напредък - Цвят на лентата за търсене по избор - Цветът на лентата за търсене - Цвят на лентата за търсене по избор - Цветът на лентата за търсене - Невалидна стойност за цвят на лентата на прогреса - - - - - Лого в заглавката - По подразбиране - Обикновено - - ReVanced минимално - По избор - - - Прескочете забраната за зареждане на изображение - Домейнът yt4.ggpht.com се използва за зареждане на изображения - "Използва се оригинален хост на изображения + Скриване на бутоните за наслагване + Бутоните за наслагване са скрити + Бутоните за наслагване са показани + Екранни текстове, етикети + Скрити + Показват се + Бутони за напред и назад + Бутони за напред и назад са скрити + Бутони за напред и назад са показани + Първоначален размер + Първоначален размер на екрана, в пиксели + Размерът на пиксела трябва да бъде между %1$s и %2$s + Прозрачност на менютата + Стойност на прозрачност между 0-100, където 0 е прозрачно + Прозрачността на менюто трябва да бъде между 0-100 + + + Фон на екрана при зареждане на видео + Екранът за зареждане ще има градиентен фон + Екранът за зареждане ще има плътен фон + Стил на началния екран + Цвят + Черно и бяло + Промяна на цвета на индикатора за време + Показва се персонализиран цвят на лентата за напредък + Показва се оригиналния цвят на лентата за напредък + Цвят на лентата за търсене по избор + Цветът на лентата за търсене + Цвят на лентата за търсене по избор + Цветът на лентата за търсене + Невалидна стойност за цвят на лентата на прогреса + + + + Лого в заглавката + По подразбиране + Обикновено + + ReVanced минимално + По избор + + + Прескочете забраната за зареждане на изображение + Домейнът yt4.ggpht.com се използва за зареждане на изображения + "Използва се оригинален хост на изображения Активирането на това може да поправи липсващите изображения, които са блокирани в някои региони" - - - - Раздел Начало - - Раздел Абонаменти - - Раздел \"Вие\" - Плейлисти на плейъра & препоръки - Резултати от търсенето - Оригинални миниатюри - DeArrow & оригинални миниатюри - DeArrow & Неподвижни кадри - Неподвижни кадри - "DeArrow предоставя миниатюри от краудсорсинг за видеоклипове в YouTube. Тези миниатюри често са по-подходящи от тези, предоставени от YouTube + + + + Раздел Начало + + Раздел Абонаменти + + Раздел \"Вие\" + Плейлисти на плейъра & препоръки + Резултати от търсенето + Оригинални миниатюри + DeArrow & оригинални миниатюри + DeArrow & Неподвижни кадри + Неподвижни кадри + "DeArrow предоставя миниатюри от краудсорсинг за видеоклипове в YouTube. Тези миниатюри често са по-подходящи от тези, предоставени от YouTube Ако е разрешено, URL адресите на видеоклиповете ще бъдат изпратени до API сървъра и няма да бъдат изпращани други данни. Ако един видеоклип няма миниатюри на DeArrow, тогава се показват оригиналните или заснемащите кадри Докоснете тук, за да научите повече за DeArrow" - Показване на известие, ако API не е наличен - Показва се известие, ако DeArrow не е наличен - Показва се известие, ако DeArrow не е наличен - Крайна точка на API на DeArrow - URL адресът на крайната точка за съхранение на миниатюри DeArrow - Неподвижни миниатюри - Неподвижните снимки се правят от началото / средата / края на всеки видеоклип. Тези изображения са вградени в YouTube и не се използва външен API - Използване на бързо заснемане на кадри - Използват се кадри със средно качество. Миниатюрите ще се зареждат по-бързо, но видеоклипове на живо, неиздадени или много стари може да показват празни миниатюри - Използване на висококачествени снимки - Времето на видеоклипа, от който ще бъдат взети кадрите - Начало на видеото - Средата на видеото - Края на видеото - - DeArrow временно не е наличен (код на състоянието: %s) - DeArrow временно не е наличен - - - Показване на ReVanced съобщения - Обявите при стартиране са показани - Обявите при стартиране не са показани - Показване на съобщения при стартиране - Неуспешно свързване с доставчик на съобщения - Отхвърли - - - Активиране на повторение на видеото - Видеоклипът ще се повтаря - Видеоклипът няма да се повтаря - - - Показване на бутона за повторение на видеото - Бутонът е показан - Бутонът не е показан - Повторението на видеото е включено - Повторението на видеото е изключено - - - - - Лъжливи параметри на устройството - "Размерите на устройството са фалшифицирани + Показване на известие, ако API не е наличен + Показва се известие, ако DeArrow не е наличен + Показва се известие, ако DeArrow не е наличен + Крайна точка на API на DeArrow + URL адресът на крайната точка за съхранение на миниатюри DeArrow + Неподвижни миниатюри + Неподвижните снимки се правят от началото / средата / края на всеки видеоклип. Тези изображения са вградени в YouTube и не се използва външен API + Използване на бързо заснемане на кадри + Използват се кадри със средно качество. Миниатюрите ще се зареждат по-бързо, но видеоклипове на живо, неиздадени или много стари може да показват празни миниатюри + Използване на висококачествени снимки + Времето на видеоклипа, от който ще бъдат взети кадрите + Начало на видеото + Средата на видеото + Края на видеото + + DeArrow временно не е наличен (код на състоянието: %s) + DeArrow временно не е наличен + + + Показване на ReVanced съобщения + Обявите при стартиране са показани + Обявите при стартиране не са показани + Показване на съобщения при стартиране + Неуспешно свързване с доставчик на съобщения + Отхвърли + + + Активиране на повторение на видеото + Видеоклипът ще се повтаря + Видеоклипът няма да се повтаря + + + Показване на бутона за повторение на видеото + Бутонът е показан + Бутонът не е показан + Повторението на видеото е включено + Повторението на видеото е изключено + + + + Лъжливи параметри на устройството + "Размерите на устройството са фалшифицирани По-високите видео качества може да бъдат отключени, но може да изпитате заекване на видеовъзпроизвеждане, по-лоша издръжливост на батерията и неизвестни странични ефекти" - "Размерите на устройството не са фалшифицирани + "Размерите на устройството не са фалшифицирани Активирането на това може да отключи по-високи видео качества" - Разрешаването на това може да причини прекъсване на възпроизвеждането на видео, влошен живот на батерията и неизвестни странични ефекти. - - - Вибрационна обратна връзка - Промяна на вибрационната обратна връзка - Деактивиране на вибрацията при главите - Вибрацията при главите е деактивирана - Вибрацията при главите е активирана - Деактивиране на вибрацията при прецизното търсене - Прецизната вибрация при търсене е деактивирана - Вибрацията при прецизното търсене е активирана - Деактивиране на вибрация при отмяна на търсене - Вибрацията при отмяна на търсене е деактивирана - Вибрацията при отмяна на търсене е активирана - Деактивиране на вибрация при мащабиране - Вибрацията при мащабиране е деактивирана - Вибрацията при мащабиране е активирана - - - Ако наскоро сте променили данните си за вход в профила, деинсталирайте и инсталирайте отново MicroG. - - - Заобикаляне на URL пренасочване - URL пренасочванията се заобикалят - URL пренасочванията не се заобикалят - - - Отваряне на връзки в браузъра - Отваряне на връзки във външен браузър - Отваряне на връзки във вграден браузър - - - - Авто - Запомни промените в качеството на видеото - Промените в качеството се отнасят за всички видеоклипове - Промените в качеството се отнасят само за текущия видеоклип - Показване на известие при промени в качеството на видеото - Показва се известие, когато се промени качеството на видеото по подразбиране - Не се показва известие, когато се промени качеството на видеото по подразбиране - Предпочитано качество при Wi-Fi - Предпочитано качество при мобилни данни - Запомняне на промените в качеството на Shorts - Промените в качеството се прилагат за всички Shorts - Промените в качеството се прилагат само за текущия Short - Качество по подразбиране на Shorts във Wi-Fi мрежа - Качество по подразбиране на Shorts в мобилна мрежа - мобилни данни - wi-fi - Променено стандартно %1$s качество на: %2$s - Променено качество на Shorts %1$s на: %2$s - - - Показване бутон за скорост - Бутонът за диалогов прозорец за скорост е показан. Докоснете и задръжте, за да възстановите скоростта на възпроизвеждане до по подразбиране - Бутонът за диалогов прозорец за скорост не е показан - - - Покажи бутона за качество на видеото - Бутонът за качество на видеото е показан. Докоснете и задръжте, за да възстановите качеството до по подразбиране - Бутонът за качество на видеото не е показан - - - Менюто за потребителска скорост - Менюто за потребителска скорост се показва - Менюто за потребителска скорост не се показва - Възстановяване на старото меню за скорост на възпроизвеждане - Показва се старото меню за скорост - Показва се модерното меню за скорост - Персонализирани скорости на възпроизвеждане - Добавете или променете скоростa на възпроизвеждане - Персонализираните скорости трябва да са по-малки от %s - Невалидни персонализирани скорости на възпроизвеждане - Авто - Персонализирана скорост при докосване и задържане - Скорост на възпроизвеждане между 0-8 - - - Запомни промените в скоростта на възпроизвеждане - Промените в скоростта на възпроизвеждане се отнасят за всички видеоклипове - Промените в скоростта на възпроизвеждане се отнасят само за текущия видеоклип - Показване на известие при промени в скоростта на възпроизвеждане - Показва се известие, когато се промени скоростта на възпроизвеждане по подразбиране - Известие не се показва, когато скоростта на възпроизвеждане по подразбиране се промени - Скорост на възпроизвеждане по подразбиране - Скоростта по подразбиране е променена на: %s - - - Деактивиране на HDR видео - HDR видеото е деактивирано - HDR видеото е активирано - Принуди AVC (H.264) - Видео кодекът е принуден да бъде AVC (H.264) - Видео кодекът се определя автоматично - "Предимства: + Разрешаването на това може да причини прекъсване на възпроизвеждането на видео, влошен живот на батерията и неизвестни странични ефекти. + + + Вибрационна обратна връзка + Промяна на вибрационната обратна връзка + Деактивиране на вибрацията при главите + Вибрацията при главите е деактивирана + Вибрацията при главите е активирана + Деактивиране на вибрацията при прецизното търсене + Прецизната вибрация при търсене е деактивирана + Вибрацията при прецизното търсене е активирана + Деактивиране на вибрация при отмяна на търсене + Вибрацията при отмяна на търсене е деактивирана + Вибрацията при отмяна на търсене е активирана + Деактивиране на вибрация при мащабиране + Вибрацията при мащабиране е деактивирана + Вибрацията при мащабиране е активирана + + + Ако наскоро сте променили данните си за вход в профила, деинсталирайте и инсталирайте отново MicroG. + + + Заобикаляне на URL пренасочване + URL пренасочванията се заобикалят + URL пренасочванията не се заобикалят + + + Отваряне на връзки в браузъра + Отваряне на връзки във външен браузър + Отваряне на връзки във вграден браузър + + + + Авто + Запомни промените в качеството на видеото + Промените в качеството се отнасят за всички видеоклипове + Промените в качеството се отнасят само за текущия видеоклип + Показване на известие при промени в качеството на видеото + Показва се известие, когато се промени качеството на видеото по подразбиране + Не се показва известие, когато се промени качеството на видеото по подразбиране + Предпочитано качество при Wi-Fi + Предпочитано качество при мобилни данни + Запомняне на промените в качеството на Shorts + Промените в качеството се прилагат за всички Shorts + Промените в качеството се прилагат само за текущия Short + Качество по подразбиране на Shorts във Wi-Fi мрежа + Качество по подразбиране на Shorts в мобилна мрежа + мобилни данни + wi-fi + Променено стандартно %1$s качество на: %2$s + Променено качество на Shorts %1$s на: %2$s + + + Показване бутон за скорост + Бутонът за диалогов прозорец за скорост е показан. Докоснете и задръжте, за да възстановите скоростта на възпроизвеждане до по подразбиране + Бутонът за диалогов прозорец за скорост не е показан + + + Покажи бутона за качество на видеото + Бутонът за качество на видеото е показан. Докоснете и задръжте, за да възстановите качеството до по подразбиране + Бутонът за качество на видеото не е показан + + + Менюто за потребителска скорост + Менюто за потребителска скорост се показва + Менюто за потребителска скорост не се показва + Възстановяване на старото меню за скорост на възпроизвеждане + Показва се старото меню за скорост + Показва се модерното меню за скорост + Персонализирани скорости на възпроизвеждане + Добавете или променете скоростa на възпроизвеждане + Персонализираните скорости трябва да са по-малки от %s + Невалидни персонализирани скорости на възпроизвеждане + Авто + Персонализирана скорост при докосване и задържане + Скорост на възпроизвеждане между 0-8 + + + Запомни промените в скоростта на възпроизвеждане + Промените в скоростта на възпроизвеждане се отнасят за всички видеоклипове + Промените в скоростта на възпроизвеждане се отнасят само за текущия видеоклип + Показване на известие при промени в скоростта на възпроизвеждане + Показва се известие, когато се промени скоростта на възпроизвеждане по подразбиране + Известие не се показва, когато скоростта на възпроизвеждане по подразбиране се промени + Скорост на възпроизвеждане по подразбиране + Скоростта по подразбиране е променена на: %s + + + Деактивиране на HDR видео + HDR видеото е деактивирано + HDR видеото е активирано + Принуди AVC (H.264) + Видео кодекът е принуден да бъде AVC (H.264) + Видео кодекът се определя автоматично + "Предимства: • Може да подобри живота на батерията • Може да възстанови липсващи видео резолюции на по-стари устройства @@ -1644,179 +1641,178 @@ Second \"item\" text" • Възпроизвеждането на видео ще използва повече интернет данни от VP9 или AV1 • HDR видеоклиповете няма да използват AVC • Някои устройства не могат да принудят AVC" - - - Показване на менюто за разширено качество на видеото - Показва се менюто за разширено качество на видеото - Менюто за разширено качество на видеото не се показва - - - Активиране на слайд за превъртане - Слайд за превъртане е активиран - Слайд за превъртане е деактивиран - - - Разрешаване на Android VR AV1 - "Видеокодекът е AVC (H.264), VP9 или AV1 + + + Показване на менюто за разширено качество на видеото + Показва се менюто за разширено качество на видеото + Менюто за разширено качество на видеото не се показва + + + Активиране на слайд за превъртане + Слайд за превъртане е активиран + Слайд за превъртане е деактивиран + + + Разрешаване на Android VR AV1 + "Видеокодекът е AVC (H.264), VP9 или AV1 Възпроизвеждането може да заеква или да пропуска кадри" - Видеокодекът е AVC (H.264) или VP9 - "Разрешаването на тази настройка може да използва софтуерно AV1 декодиране. + Видеокодекът е AVC (H.264) или VP9 + "Разрешаването на тази настройка може да използва софтуерно AV1 декодиране. Възпроизвеждането на видео с AV1 може да заеква или да пропуска кадри." - Странични ефекти от подменянето - • Експериментален клиент и може да спре да работи по всяко време - • Видеото може да спре на 1:00 или може да не е налично в някои региони - • Менюто за аудиозаписи липсва - • Без AV1 видео кодек - • Стабилният звук не е наличен - • Детските видеоклипове може да не се възпроизвеждат, когато сте излезли от профила си или в режим \"инкогнито\" - - • Принудителният оригинален звук не е наличен - Poka6i v Statistiki za nerds - Tipът na klienta se poka6va v Statistiki za nerds - Klientът e skriт v Statistiki za nerds - - - - - - - Относно - Реклами - Общи - Плейър - Разни - - - Скриване на видеореклами - Видеорекламите са скрити - Видеорекламите са показани - - - Активиране на постоянно повтаряне - Постоянното повтаряне е активирано - Постоянното повтаряне е деактивирано - - - Скриване на бутона за предаване - Бутонът за предаване е скрит - Бутонът за предаване е показан - Скриване на бутона за история - Бутонът за история е скрит - Бутонът за история е показан - Скриване на бутона за известия - Бутонът за известия е скрит - Бутонът за известия е показан - Скриване на бутона за търсене - Бутонът за търсене е скрит - Бутонът за търсене е показан - - - Скриване на лентата с категории - Лентата с категории е скрита - Лентата с категории е показана - - - Промяна на цвета на миниплейъра - Цветът на миниплейъра съвпада с този на плейъра на цял екран - Миниплейърът използва цвят по подразбиране - - - Навигационна лента - Скриване или промяна на бутоните на навигационната лента - - Скриване на Начало - Бутонът Начало е скрит - Бутонът Начало е показан - - Скриване на Мостри - Бутонът Мостри е скрит - Бутонът Мостри е показан - - Скриване на Разглеждане - Бутонът Проучване е скрит - Бутонът Проучване е показан - - Скриване на Библиотека - Бутонът Библиотека е скрит - Бутонът Библиотека е показан - - Скриване на Надстройка - Бутонът Надграждане е скрит - Бутонът Надграждане е показан - Скриване на навигационната лента - Навигационната лента е скрита - Навигационната лента е показана - Скриване на етикетите на навигационните бутони - Етикетите са скрити - Етикетите са показани - - - Скриване на етикета „Вземете Music Premium“ - Етикетът е скрит - Етикетът е показан - - - Скриване на бутона за надстройка - Бутонът е скрит - Бутонът е показан - - - - - Аудио реклами - Аудио рекламата е блокирана - Аудио рекламата е разблокирана - - - %s не е наличен, може да се появят реклами. Опитайте да промените услугата за блокиране на реклами в настройките. - %s върна грешка, може да се появят реклами. Опитайте да промените услугата за блокиране на реклами в настройките. - Блокиране на вградени видеореклами - Деактивирано - Luminous прокси - PurpleAdBlock прокси - - - Видео реклами - Видео рекламата е блокирана - Видео рекламата е разблокирана - - - Съобщението е изтрито - Покажи изтритите съобщения - Не показвай изтритите съобщения - Скрийте изтритите съобщения зад спойлер - Показване на изтритите съобщения като зачеркнат текст - - - Автоматично изискване на Channel Points - Автоматично изискване на Channel Points - Channel Points в канала не се изискват автоматично - - - - Активирайте режима за отстраняване на грешки в Twitch - Режимът за отстраняване на грешки в Twitch е активиран (не се препоръчва) - Режимът за отстраняване на грешки в Twitch е деактивиран - - - Настройки на ReVanced - Относно - За ReVanced - Блокиране на реклами - Настройки за блокиране на реклами - Чатове - Настройки на чата - Разни - Допълнителни настройки - Основни настройки - Други настройки - Клиентска реклама - Сърварна реклама - Дневник на отстраняването на грешки - Дневникът за остраняване на грешки е активиран - Дневникът за остраняване на грешки е деактивиран - - + Странични ефекти от подменянето + • Експериментален клиент и може да спре да работи по всяко време + • Видеото може да спре на 1:00 или може да не е налично в някои региони + • Менюто за аудиозаписи липсва + • Без AV1 видео кодек + • Стабилният звук не е наличен + • Детските видеоклипове може да не се възпроизвеждат, когато сте излезли от профила си или в режим \"инкогнито\" + + • Принудителният оригинален звук не е наличен + Poka6i v Statistiki za nerds + Tipът na klienta se poka6va v Statistiki za nerds + Klientът e skriт v Statistiki za nerds + + + + + + Относно + Реклами + Общи + Плейър + Разни + + + Скриване на видеореклами + Видеорекламите са скрити + Видеорекламите са показани + + + Активиране на постоянно повтаряне + Постоянното повтаряне е активирано + Постоянното повтаряне е деактивирано + + + Скриване на бутона за предаване + Бутонът за предаване е скрит + Бутонът за предаване е показан + Скриване на бутона за история + Бутонът за история е скрит + Бутонът за история е показан + Скриване на бутона за известия + Бутонът за известия е скрит + Бутонът за известия е показан + Скриване на бутона за търсене + Бутонът за търсене е скрит + Бутонът за търсене е показан + + + Скриване на лентата с категории + Лентата с категории е скрита + Лентата с категории е показана + + + Промяна на цвета на миниплейъра + Цветът на миниплейъра съвпада с този на плейъра на цял екран + Миниплейърът използва цвят по подразбиране + + + Навигационна лента + Скриване или промяна на бутоните на навигационната лента + + Скриване на Начало + Бутонът Начало е скрит + Бутонът Начало е показан + + Скриване на Мостри + Бутонът Мостри е скрит + Бутонът Мостри е показан + + Скриване на Разглеждане + Бутонът Проучване е скрит + Бутонът Проучване е показан + + Скриване на Библиотека + Бутонът Библиотека е скрит + Бутонът Библиотека е показан + + Скриване на Надстройка + Бутонът Надграждане е скрит + Бутонът Надграждане е показан + Скриване на навигационната лента + Навигационната лента е скрита + Навигационната лента е показана + Скриване на етикетите на навигационните бутони + Етикетите са скрити + Етикетите са показани + + + Скриване на етикета „Вземете Music Premium“ + Етикетът е скрит + Етикетът е показан + + + Скриване на бутона за надстройка + Бутонът е скрит + Бутонът е показан + + + + + Аудио реклами + Аудио рекламата е блокирана + Аудио рекламата е разблокирана + + + %s не е наличен, може да се появят реклами. Опитайте да промените услугата за блокиране на реклами в настройките. + %s върна грешка, може да се появят реклами. Опитайте да промените услугата за блокиране на реклами в настройките. + Блокиране на вградени видеореклами + Деактивирано + Luminous прокси + PurpleAdBlock прокси + + + Видео реклами + Видео рекламата е блокирана + Видео рекламата е разблокирана + + + Съобщението е изтрито + Покажи изтритите съобщения + Не показвай изтритите съобщения + Скрийте изтритите съобщения зад спойлер + Показване на изтритите съобщения като зачеркнат текст + + + Автоматично изискване на Channel Points + Автоматично изискване на Channel Points + Channel Points в канала не се изискват автоматично + + + + Активирайте режима за отстраняване на грешки в Twitch + Режимът за отстраняване на грешки в Twitch е активиран (не се препоръчва) + Режимът за отстраняване на грешки в Twitch е деактивиран + + + Настройки на ReVanced + Относно + За ReVanced + Блокиране на реклами + Настройки за блокиране на реклами + Чатове + Настройки на чата + Разни + Допълнителни настройки + Основни настройки + Други настройки + Клиентска реклама + Сърварна реклама + Дневник на отстраняването на грешки + Дневникът за остраняване на грешки е активиран + Дневникът за остраняване на грешки е деактивиран + + diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index f773a3b68d..7108483442 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -17,1257 +17,1256 @@ "First 'item' text Second \"item\" text" ---> - - - - অ্যাপের নাম - - কাস্টম - অ্যাপ আইকন - মূল - - রিভ্যান্সড মিনিমাল - রিভ্যান্সড স্কেলড - - কাস্টম - - - চেক ফেইল করেছে - অফিশ্যাল ওয়েবসাইট খুলুন - অবজ্ঞা করুন - <h5>এই অ্যাপটি আপনার দ্বারা প্যাচ করা হয়েছে বলে মনে হচ্ছে না।</h5><br>এই অ্যাপটি সঠিকভাবে কাজ নাও করতে পারে, <b>ক্ষতিকারক বা এমনকি ব্যবহারের জন্য বিপজ্জনক হতে পারে</b>।<br><br>এই চেকগুলি ইঙ্গিত দেয় যে এই অ্যাপটি পূর্ববর্তীভাবে প্যাচ করা হয়েছে বা অন্য কাউকে থেকে পাওয়া গেছে:<br><br><small>%1$s</small><br>এটি দৃঢ়ভাবে সুপারিশ করা হয় যে <b>এই অ্যাপটি আনইনস্টল করা হোক এবং নিজেই প্যাচ করা হোক</b> যাতে নিশ্চিত করা হয় যে আপনি একটি যাচাইকৃত এবং সুরক্ষিত অ্যাপ ব্যবহার করছেন।<p><br>যদি উপেক্ষা করা হয়, তাহলে এই সতর্কতাটি শুধুমাত্র দু\'বার দেখানো হবে। - অন্য ডিভাইসে প্যাচ করা হয়েছে - ReVanced Manager দ্বারা প্যাচ করা হয়নি - ১০ মিনিটেরও বেশি আগে প্যাচ করা হয়েছে - %s দিন আগে প্যাচ করা হয়েছে - APK তৈরির তারিখ ত্রুটিপূর্ণ - - - ReVanced নোটিশ - আপনার দেখার ইতিহাস সংরক্ষিত হচ্ছে না।<br><br>এটি সম্ভবত DNS অ্যাড ব্লকার অথবা নেটওয়ার্ক প্রক্সির কারণে।<br><br>এটি ঠিক করার জন্য, <b>s.youtube.com</b> সাদা তালিকাভুক্ত করুন অথবা সকল DNS ব্লকার এবং প্রক্সি বন্ধ করুন। - আবার দেখাবেন না - - - সেটিংস - আপনি কি এগিয়ে যেতে চান? - সংরক্ষণ করুন - আবার সেট করুন - রঙ রিসেট করুন - অবৈধ রঙ - পুনরায় আরম্ভ করা আবশ্যক - এই পরিবর্তন কার্যকর করার জন্য অ্যাপটি পুনরায় চালু করুন। - আবার চালু করুন - আমদানি করুন - অনুলিপি করুন - ReVanced সেটিং ডিফল্ট সেট করা হয়েছে - %d সেটিং আমদানি হয়েছে - আমদানি করা যায়নি: %s - অনুসন্ধান সেটিংস - \'%s\'-এর জন্য কোন ফলাফল পাওয়া যায়নি - অন্য কোনো কীওয়ার্ড চেষ্টা করুন - সাম্প্রতিক অনুসন্ধানগুলি - অনুসন্ধান ইতিহাস থেকে সরাবেন? - অনুসন্ধানের ইতিহাস মুছুন - আপনি কি আপনার সমস্ত অনুসন্ধানের ইতিহাস মুছে ফেলতে চান? - অনুসন্ধানের টিপস - "• এটিতে নেভিগেট করতে একটি পাথে ট্যাপ করুন +--> + + + অ্যাপের নাম + + কাস্টম + অ্যাপ আইকন + মূল + + রিভ্যান্সড মিনিমাল + রিভ্যান্সড স্কেলড + + কাস্টম + + + চেক ফেইল করেছে + অফিশ্যাল ওয়েবসাইট খুলুন + অবজ্ঞা করুন + <h5>এই অ্যাপটি আপনার দ্বারা প্যাচ করা হয়েছে বলে মনে হচ্ছে না।</h5><br>এই অ্যাপটি সঠিকভাবে কাজ নাও করতে পারে, <b>ক্ষতিকারক বা এমনকি ব্যবহারের জন্য বিপজ্জনক হতে পারে</b>।<br><br>এই চেকগুলি ইঙ্গিত দেয় যে এই অ্যাপটি পূর্ববর্তীভাবে প্যাচ করা হয়েছে বা অন্য কাউকে থেকে পাওয়া গেছে:<br><br><small>%1$s</small><br>এটি দৃঢ়ভাবে সুপারিশ করা হয় যে <b>এই অ্যাপটি আনইনস্টল করা হোক এবং নিজেই প্যাচ করা হোক</b> যাতে নিশ্চিত করা হয় যে আপনি একটি যাচাইকৃত এবং সুরক্ষিত অ্যাপ ব্যবহার করছেন।<p><br>যদি উপেক্ষা করা হয়, তাহলে এই সতর্কতাটি শুধুমাত্র দু\'বার দেখানো হবে। + অন্য ডিভাইসে প্যাচ করা হয়েছে + ReVanced Manager দ্বারা প্যাচ করা হয়নি + ১০ মিনিটেরও বেশি আগে প্যাচ করা হয়েছে + %s দিন আগে প্যাচ করা হয়েছে + APK তৈরির তারিখ ত্রুটিপূর্ণ + + + ReVanced নোটিশ + আপনার দেখার ইতিহাস সংরক্ষিত হচ্ছে না।<br><br>এটি সম্ভবত DNS অ্যাড ব্লকার অথবা নেটওয়ার্ক প্রক্সির কারণে।<br><br>এটি ঠিক করার জন্য, <b>s.youtube.com</b> সাদা তালিকাভুক্ত করুন অথবা সকল DNS ব্লকার এবং প্রক্সি বন্ধ করুন। + আবার দেখাবেন না + + + সেটিংস + আপনি কি এগিয়ে যেতে চান? + সংরক্ষণ করুন + আবার সেট করুন + রঙ রিসেট করুন + অবৈধ রঙ + পুনরায় আরম্ভ করা আবশ্যক + এই পরিবর্তন কার্যকর করার জন্য অ্যাপটি পুনরায় চালু করুন। + আবার চালু করুন + আমদানি করুন + অনুলিপি করুন + ReVanced সেটিং ডিফল্ট সেট করা হয়েছে + %d সেটিং আমদানি হয়েছে + আমদানি করা যায়নি: %s + অনুসন্ধান সেটিংস + \'%s\'-এর জন্য কোন ফলাফল পাওয়া যায়নি + অন্য কোনো কীওয়ার্ড চেষ্টা করুন + সাম্প্রতিক অনুসন্ধানগুলি + অনুসন্ধান ইতিহাস থেকে সরাবেন? + অনুসন্ধানের ইতিহাস মুছুন + আপনি কি আপনার সমস্ত অনুসন্ধানের ইতিহাস মুছে ফেলতে চান? + অনুসন্ধানের টিপস + "• এটিতে নেভিগেট করতে একটি পাথে ট্যাপ করুন • এটিতে নেভিগেট করতে একটি সেটিং-এ লং-প্রেস করুন • অনুসন্ধানের প্রশ্ন ইতিহাসে সংরক্ষণ করতে এন্টার চাপুন • অনুসন্ধান কেসিং এবং বিরামচিহ্ন উপেক্ষা করে • অক্ষম শিশু সেটিংসের উপরে মূল সেটিংস দেখা যায়" - অনুসন্ধান ইতিহাস খালি - অনুসন্ধান ইতিহাস সংরক্ষণ করতে, একটি অনুসন্ধানের প্রশ্ন টাইপ করুন এবং এন্টার চাপুন - অনুসন্ধান সেটিংসের ইতিহাস দেখান - সেটিংস অনুসন্ধান ইতিহাস দেখানো হয়েছে - সেটিংস অনুসন্ধান ইতিহাস দেখানো হয় না - ReVanced সেটিং আইকন দেখান - সেটিং আইকন দেখানো হয়েছে - সেটিং আইকন দেখানো হচ্ছে না - ReVanced ভাষা - "কিছু ভাষার অনুবাদ অনুপস্থিত বা অসম্পূর্ণ হতে পারে। + অনুসন্ধান ইতিহাস খালি + অনুসন্ধান ইতিহাস সংরক্ষণ করতে, একটি অনুসন্ধানের প্রশ্ন টাইপ করুন এবং এন্টার চাপুন + অনুসন্ধান সেটিংসের ইতিহাস দেখান + সেটিংস অনুসন্ধান ইতিহাস দেখানো হয়েছে + সেটিংস অনুসন্ধান ইতিহাস দেখানো হয় না + ReVanced সেটিং আইকন দেখান + সেটিং আইকন দেখানো হয়েছে + সেটিং আইকন দেখানো হচ্ছে না + ReVanced ভাষা + "কিছু ভাষার অনুবাদ অনুপস্থিত বা অসম্পূর্ণ হতে পারে। নতুন ভাষা অনুবাদ করতে বা বিদ্যমান অনুবাদ উন্নত করতে, translate.revanced.app এ ভিজিট করুন" - অ্যাপ্লিকেশনের ভাষা - আমদানি এবং রপ্তানি - ReVanced সেটিং আমদানি বা রপ্তানি করুন - - আপনি ReVanced প্যাচ সংস্করণ <i>%s</i> ব্যবহার করছেন - দ্রষ্টব্য - এই সংস্করণ একটি প্রাক-প্রকাশনা এবং এতে আপনি অনাকাঙ্খিত সমস্যার সম্মুখিন হতে পারেন - অফিশ্যাল লিংকসমূহ - + আপনি ReVanced প্যাচ সংস্করণ <i>%s</i> ব্যবহার করছেন + দ্রষ্টব্য + এই সংস্করণ একটি প্রাক-প্রকাশনা এবং এতে আপনি অনাকাঙ্খিত সমস্যার সম্মুখিন হতে পারেন + অফিশ্যাল লিংকসমূহ + - - - GmsCore সেটিং - GmsCore এর জন্য সেটিং - - MicroG GmsCore ইনস্টল করা হয়নি। ইনস্টল করুন। - পদক্ষেপ প্রয়োজন - "MicroG GmsCore-এর পটভূমিতে চালানোর অনুমতি নেই। + + + GmsCore সেটিং + GmsCore এর জন্য সেটিং + + MicroG GmsCore ইনস্টল করা হয়নি। ইনস্টল করুন। + পদক্ষেপ প্রয়োজন + "MicroG GmsCore-এর পটভূমিতে চালানোর অনুমতি নেই। আপনার ফোনের জন্য \"Don't kill my app\" গাইড অনুসরণ করুন এবং MicroG ইনস্টলেশনের জন্য নির্দেশাবলী প্রয়োগ করুন। এটি অ্যাপ্লিকেশনটি কাজ করার জন্য প্রয়োজন।" - ওয়েবসাইট খুলুন - "সমস্যা এড়াতে MicroG GmsCore-এর ব্যাটারি অপ্টিমাইজেশন অক্ষম করতে হবে। + ওয়েবসাইট খুলুন + "সমস্যা এড়াতে MicroG GmsCore-এর ব্যাটারি অপ্টিমাইজেশন অক্ষম করতে হবে। MicroG-এর জন্য ব্যাটারি অপ্টিমাইজেশন অক্ষম করা ব্যাটারি ব্যবহারকে নেতিবাচকভাবে প্রভাবিত করবে না। চালিয়ে যান বোতামটি ট্যাপ করুন এবং অপ্টিমাইজেশন পরিবর্তনগুলি অনুমোদন করুন।" - এগিয়ে যান - - - ভিডিও স্ট্রিম স্পুফ করুন - প্লেব্যাক সংক্রান্ত সমস্যা রোধ করতে ক্লায়েন্টের ভিডিও স্ট্রিমগুলি স্পুফ করুন - ভিডিও স্ট্রিমিং স্পুফ করুন - "ভিডিও স্ট্রিম স্পুফ করা হয়েছে + এগিয়ে যান + + + ভিডিও স্ট্রিম স্পুফ করুন + প্লেব্যাক সংক্রান্ত সমস্যা রোধ করতে ক্লায়েন্টের ভিডিও স্ট্রিমগুলি স্পুফ করুন + ভিডিও স্ট্রিমিং স্পুফ করুন + "ভিডিও স্ট্রিম স্পুফ করা হয়েছে আপনি যদি YouTube Premium ব্যবহারকারী হন, তাহলে এই সেটিংটির প্রয়োজন নাও হতে পারে" - "ভিডিও স্ট্রিম স্পুফ করা হয়নি + "ভিডিও স্ট্রিম স্পুফ করা হয়নি প্লেব্যাক কাজ নাও করতে পারে" - এই সেটিং বন্ধ করলে প্লেব্যাক সমস্যা হতে পারে। - ডিফল্ট ক্লায়েন্ট - - - মূল অডিও ভাষা বলপূর্বক চালু করুন - মূল অডিও ভাষা ব্যবহার করা হচ্ছে - ডিফল্ট অডিও ব্যবহার করছে - - এই বৈশিষ্ট্যটি ব্যবহার করতে, \'ভিডিও স্ট্রিম স্পুফ করুন\' অ্যান্ড্রয়েড স্টুডিও ছাড়া অন্য কোনো ক্লায়েন্টে পরিবর্তন করুন - - - ডিবাগিং - ডিবাগিং অপশন সক্রিয় বা নিষ্ক্রিয় করুন - ডিবাগ লগিং - ডিবাগ লগ সক্রিয় হয়েছে - ডিবাগ লগ নিষ্ক্রিয় হয়েছে - স্টেক ট্রেস লগ - ডিবাগ লগ স্টেক ট্রেস সংযুক্ত করবে - ডিবাগ লগ স্টেক ট্রেস সংযুক্ত করবে না - ReVanced এর ত্রুটির ক্ষেত্রে টোস্ট দেখান - যদি ত্রুটি ঘটে তবে toast দেখানো হবে - যদি ত্রুটি ঘটে তবে toast দেখানো হবে না - "ত্রুটি \"toast\" বন্ধ করে ReVanced ত্রুটি বিজ্ঞপ্তিগুলি লুকানো হয়। + এই সেটিং বন্ধ করলে প্লেব্যাক সমস্যা হতে পারে। + ডিফল্ট ক্লায়েন্ট + + + মূল অডিও ভাষা বলপূর্বক চালু করুন + মূল অডিও ভাষা ব্যবহার করা হচ্ছে + ডিফল্ট অডিও ব্যবহার করছে + + এই বৈশিষ্ট্যটি ব্যবহার করতে, \'ভিডিও স্ট্রিম স্পুফ করুন\' অ্যান্ড্রয়েড স্টুডিও ছাড়া অন্য কোনো ক্লায়েন্টে পরিবর্তন করুন + + + ডিবাগিং + ডিবাগিং অপশন সক্রিয় বা নিষ্ক্রিয় করুন + ডিবাগ লগিং + ডিবাগ লগ সক্রিয় হয়েছে + ডিবাগ লগ নিষ্ক্রিয় হয়েছে + স্টেক ট্রেস লগ + ডিবাগ লগ স্টেক ট্রেস সংযুক্ত করবে + ডিবাগ লগ স্টেক ট্রেস সংযুক্ত করবে না + ReVanced এর ত্রুটির ক্ষেত্রে টোস্ট দেখান + যদি ত্রুটি ঘটে তবে toast দেখানো হবে + যদি ত্রুটি ঘটে তবে toast দেখানো হবে না + "ত্রুটি \"toast\" বন্ধ করে ReVanced ত্রুটি বিজ্ঞপ্তিগুলি লুকানো হয়। আপনি কোনও অপ্রত্যাশিত ঘটনার বিষয়ে অবহিত হবেন না।" - ডিবাগ লগগুলি রফতানি করুন - ক্লিপবোর্ডে ReVanced ডিবাগ লগগুলি অনুলিপি করে - ডিবাগ লগিং নিষ্ক্রিয় করা হয়েছে - কোনো লগ পাওয়া যায়নি - লগ অনুলিপি করা হয়েছে - লগ এক্সপোর্ট করা যায়নি: %s - ডিবাগ লগগুলি সাফ করুন - সমস্ত সঞ্চিত ReVanced ডিবাগ লগ সাফ করে - লগ সাফ করা হয়েছে - ফিচার ফ্ল্যাগ Manager - বুলিয়ান ফিচার ফ্ল্যাগ পরিচালনা করুন - সক্রিয় ফ্ল্যাগ (%d) - ব্লক করা ফ্ল্যাগ (%d) - ফ্ল্যাগ খুঁজুন... - ফ্ল্যাগ সংরক্ষণ করা হয়েছে - ফ্ল্যাগ রিসেট করা হয়েছে - ফ্ল্যাগ ক্লিপবোর্ডে কপি করা হয়েছে - প্রটোকল বাফার লগ - ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে - ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে না - "এই সেটিংস সক্ষম করলে কিছু UI উপাদানের জন্য অন-স্ক্রীন পাঠ্য সহ অতিরিক্ত লেআউট ডেটা লগ করা হবে।\n\nএটি কাস্টম ফিল্টার তৈরি করার সময় উপাদান সনাক্ত করতে সাহায্য করতে পারে।\n\nতবে, এটি সক্রিয় করলে আপনার আইপি ঠিকানার মতো কিছু ব্যবহারকারীর ডেটাও লগ করা হবে।" - - - শেয়ারিং লিঙ্ক স্যানিটাইজ করুন - শেয়ার করা লিঙ্ক থেকে ট্র্যাকিং ক্যোয়ারি প্যারামিটার সরানো হয়েছে - শেয়ার করা লিঙ্ক থেকে ট্র্যাকিং ক্যোয়ারি প্যারামিটার সরানো হয়নি - শেয়ার লিঙ্কগুলি youtube.com-এ পরিবর্তন করুন - শেয়ার করা লিঙ্কগুলি youtube.com ব্যবহার করে - শেয়ার করা লিঙ্কগুলি music.youtube.com ব্যবহার করে - - - কাস্টম ফিল্টার - কাস্টম ফিল্টার ব্যবহার করে বিভিন্ন উপাদান লুকান - কাস্টম ফিল্টার সক্রিয় করুন - কাস্টম ফিল্টার সক্রিয় আছে - কাস্টম ফিল্টার নিস্ক্রিয় আছে - কাস্টম ফিল্টার - - নতুন লাইন দ্বারা পৃথক করা ফিল্টার করার জন্য উপাদান পাথ বিল্ডার স্ট্রিং এর তালিকা - ত্রুটিপূর্ণ কাস্টম ফিল্টার: %s - - - - - সম্পর্কিত - বিজ্ঞাপন - বিকল্প থাম্বনেইল - ফিড - সাধারণ - প্লেয়ার - সিকবার - সোয়াইপ কন্ট্রোল - বিবিধ - ভিডিও - পুরানো সেটিংস মেনু পুনরুদ্ধার করুন - পুরাতন সেটিংস মেনু দেখানো হচ্ছে - পুরাতন সেটিংস মেনু দেখানো হচ্ছে না - - - Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করুন - Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করা হয়েছে - Shorts ব্যাকগ্রাউন্ড প্লে সক্ষম করা হয়েছে - - - অ্যালবাম কার্ড লুকান - অ্যালবাম কার্ড লুকিয়ে রয়েছে - অ্যালবাম কার্ড প্রদর্শিত হয়েছে - আর্টিস্ট কার্ড লুকান - আর্টিস্ট কার্ড লুকিয়ে রয়েছে - আর্টিস্ট কার্ড প্রদর্শিত হয়েছে - চিপ শেলপ লুকান - চিপ শেলপ লুকিয়ে রয়েছে - চিপ শেলপ প্রদর্শিত হয়েছে - সম্প্রদায় পোস্ট লুকান - সম্প্রদায় পোস্ট লুকিয়ে রয়েছে - সম্প্রদায় পোস্ট প্রদর্শিত হয়েছে - সংক্ষিপ্ত ব্যানার লুকান - সংক্ষিপ্ত ব্যানার লুকিয়ে রয়েছে - সংক্ষিপ্ত ব্যানার প্রদর্শিত হয়েছে - প্রসারিত কার্ড লুকান - ভিডিওর নিচে প্রসারিত কার্ড লুকানো আছে - ভিডিওর নিচে প্রসারিত কার্ড দেখানো আছে - ভাসমান মাইক্রোফোন বোতাম লুকান - অনুসন্ধানে ফ্লোটিং মাইক্রোফোন বোতাম লুকানো আছে - অনুসন্ধানে ভাসমান মাইক্রোফোন বোতাম দেখানো হয় - আনুভূমিক শেলফ লুকান - "অনুভূমিক তাকগুলি লুকানো আছে, যেমন: + ডিবাগ লগগুলি রফতানি করুন + ক্লিপবোর্ডে ReVanced ডিবাগ লগগুলি অনুলিপি করে + ডিবাগ লগিং নিষ্ক্রিয় করা হয়েছে + কোনো লগ পাওয়া যায়নি + লগ অনুলিপি করা হয়েছে + লগ এক্সপোর্ট করা যায়নি: %s + ডিবাগ লগগুলি সাফ করুন + সমস্ত সঞ্চিত ReVanced ডিবাগ লগ সাফ করে + লগ সাফ করা হয়েছে + ফিচার ফ্ল্যাগ Manager + বুলিয়ান ফিচার ফ্ল্যাগ পরিচালনা করুন + সক্রিয় ফ্ল্যাগ (%d) + ব্লক করা ফ্ল্যাগ (%d) + ফ্ল্যাগ খুঁজুন... + ফ্ল্যাগ সংরক্ষণ করা হয়েছে + ফ্ল্যাগ রিসেট করা হয়েছে + ফ্ল্যাগ ক্লিপবোর্ডে কপি করা হয়েছে + প্রটোকল বাফার লগ + ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে + ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে না + "এই সেটিংস সক্ষম করলে কিছু UI উপাদানের জন্য অন-স্ক্রীন পাঠ্য সহ অতিরিক্ত লেআউট ডেটা লগ করা হবে।\n\nএটি কাস্টম ফিল্টার তৈরি করার সময় উপাদান সনাক্ত করতে সাহায্য করতে পারে।\n\nতবে, এটি সক্রিয় করলে আপনার আইপি ঠিকানার মতো কিছু ব্যবহারকারীর ডেটাও লগ করা হবে।" + + + শেয়ারিং লিঙ্ক স্যানিটাইজ করুন + শেয়ার করা লিঙ্ক থেকে ট্র্যাকিং ক্যোয়ারি প্যারামিটার সরানো হয়েছে + শেয়ার করা লিঙ্ক থেকে ট্র্যাকিং ক্যোয়ারি প্যারামিটার সরানো হয়নি + শেয়ার লিঙ্কগুলি youtube.com-এ পরিবর্তন করুন + শেয়ার করা লিঙ্কগুলি youtube.com ব্যবহার করে + শেয়ার করা লিঙ্কগুলি music.youtube.com ব্যবহার করে + + + কাস্টম ফিল্টার + কাস্টম ফিল্টার ব্যবহার করে বিভিন্ন উপাদান লুকান + কাস্টম ফিল্টার সক্রিয় করুন + কাস্টম ফিল্টার সক্রিয় আছে + কাস্টম ফিল্টার নিস্ক্রিয় আছে + কাস্টম ফিল্টার + + নতুন লাইন দ্বারা পৃথক করা ফিল্টার করার জন্য উপাদান পাথ বিল্ডার স্ট্রিং এর তালিকা + ত্রুটিপূর্ণ কাস্টম ফিল্টার: %s + + + + + সম্পর্কিত + বিজ্ঞাপন + বিকল্প থাম্বনেইল + ফিড + সাধারণ + প্লেয়ার + সিকবার + সোয়াইপ কন্ট্রোল + বিবিধ + ভিডিও + পুরানো সেটিংস মেনু পুনরুদ্ধার করুন + পুরাতন সেটিংস মেনু দেখানো হচ্ছে + পুরাতন সেটিংস মেনু দেখানো হচ্ছে না + + + Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করুন + Shorts ব্যাকগ্রাউন্ড প্লে অক্ষম করা হয়েছে + Shorts ব্যাকগ্রাউন্ড প্লে সক্ষম করা হয়েছে + + + অ্যালবাম কার্ড লুকান + অ্যালবাম কার্ড লুকিয়ে রয়েছে + অ্যালবাম কার্ড প্রদর্শিত হয়েছে + আর্টিস্ট কার্ড লুকান + আর্টিস্ট কার্ড লুকিয়ে রয়েছে + আর্টিস্ট কার্ড প্রদর্শিত হয়েছে + চিপ শেলপ লুকান + চিপ শেলপ লুকিয়ে রয়েছে + চিপ শেলপ প্রদর্শিত হয়েছে + সম্প্রদায় পোস্ট লুকান + সম্প্রদায় পোস্ট লুকিয়ে রয়েছে + সম্প্রদায় পোস্ট প্রদর্শিত হয়েছে + সংক্ষিপ্ত ব্যানার লুকান + সংক্ষিপ্ত ব্যানার লুকিয়ে রয়েছে + সংক্ষিপ্ত ব্যানার প্রদর্শিত হয়েছে + প্রসারিত কার্ড লুকান + ভিডিওর নিচে প্রসারিত কার্ড লুকানো আছে + ভিডিওর নিচে প্রসারিত কার্ড দেখানো আছে + ভাসমান মাইক্রোফোন বোতাম লুকান + অনুসন্ধানে ফ্লোটিং মাইক্রোফোন বোতাম লুকানো আছে + অনুসন্ধানে ভাসমান মাইক্রোফোন বোতাম দেখানো হয় + আনুভূমিক শেলফ লুকান + "অনুভূমিক তাকগুলি লুকানো আছে, যেমন: • ব্রেকিং নিউজ • দেখা চালিয়ে যান • আরও চ্যানেল এক্সপ্লোর করুন • সবচেয়ে প্রাসঙ্গিক • কেনাকাটা • আবার দেখুন" - অনুভূমিক শেলফগুলি দেখানো হয়েছে - ছবি শেল্ফ লুকান - সার্চ ফলাফলে ছবি শেল্ফ লুকানো আছে - সার্চ ফলাফলে ছবি শেল্ফ দেখানো আছে - সর্বশেষ পোস্ট লুকান - সর্বশেষ পোস্ট লুকিয়ে রয়েছে - সর্বশেষ পোস্ট প্রদর্শিত হয়েছে - মিক্স প্লেলিস্ট লুকান - মিক্স প্লেলিস্ট লুকিয়ে রয়েছে - মিক্স প্লেলিস্ট প্রদর্শিত হয়েছে - চলচ্চিত্র বিভাগ লুকান - চলচ্চিত্র বিভাগ লুকিয়ে রয়েছে - চলচ্চিত্র বিভাগ প্রদর্শিত হয়েছে - - \'আমাকে জানান\' বোতাম লুকান - আমাকে জানান বোতামটি লুকানো আছে - আমাকে জানান বোতামটি দেখানো হয়েছে - খেলার উপযুক্ত লুকান - খেলার উপযুক্ত লুকিয়ে রয়েছে - খেলার উপযুক্ত প্রদর্শিত হয়েছে - - \'আরও দেখান\' বোতাম লুকান - অনুসন্ধান ফলাফলে \"আরও দেখান\" বোতামটি লুকানো আছে - অনুসন্ধান ফলাফলে \"আরও দেখান\" বোতামটি দেখানো হয়েছে - সার্ভে লুকান - জরিপগুলি লুকানো হয়েছে - জরিপগুলি দেখানো হয়েছে - টিকিট তাক লুকান - টিকিট তাক লুকানো আছে - টিকিট তাক দেখানো হয়েছে - - ভিডিও সুপারিশ লেবেল লুকান - \"অন্যান্য দর্শক দেখেছেন\" এবং \"আপনার পছন্দ হতে পারে\" লেবেলগুলি অনুসন্ধান ফলাফলে লুকানো আছে - \"অন্যান্য দর্শক দেখেছেন\" এবং \"আপনার পছন্দ হতে পারে\" লেবেলগুলি অনুসন্ধান ফলাফলে দেখানো হয়েছে - ভিজ্যুয়াল স্পেসার লুকান - ভিজ্যুয়াল স্পেসার লুকানো হয়েছে - ভিজ্যুয়াল স্পেসার দেখানো হয়েছে - - YouTube Doodles छिपाएँ - লোগোতে YouTube Doodles অ্যানিমেশন লুকানো আছে - লোগোতে YouTube Doodles অ্যানিমেশন দেখানো হয় - "YouTube Doodles প্রতি বছর কয়েক দিনের জন্য দেখানো হয়। + \'আরও দেখান\' বোতাম লুকান + অনুসন্ধান ফলাফলে \"আরও দেখান\" বোতামটি লুকানো আছে + অনুসন্ধান ফলাফলে \"আরও দেখান\" বোতামটি দেখানো হয়েছে + সার্ভে লুকান + জরিপগুলি লুকানো হয়েছে + জরিপগুলি দেখানো হয়েছে + টিকিট তাক লুকান + টিকিট তাক লুকানো আছে + টিকিট তাক দেখানো হয়েছে + + ভিডিও সুপারিশ লেবেল লুকান + \"অন্যান্য দর্শক দেখেছেন\" এবং \"আপনার পছন্দ হতে পারে\" লেবেলগুলি অনুসন্ধান ফলাফলে লুকানো আছে + \"অন্যান্য দর্শক দেখেছেন\" এবং \"আপনার পছন্দ হতে পারে\" লেবেলগুলি অনুসন্ধান ফলাফলে দেখানো হয়েছে + ভিজ্যুয়াল স্পেসার লুকান + ভিজ্যুয়াল স্পেসার লুকানো হয়েছে + ভিজ্যুয়াল স্পেসার দেখানো হয়েছে + + YouTube Doodles छिपाएँ + লোগোতে YouTube Doodles অ্যানিমেশন লুকানো আছে + লোগোতে YouTube Doodles অ্যানিমেশন দেখানো হয় + "YouTube Doodles প্রতি বছর কয়েক দিনের জন্য দেখানো হয়। আপনার অঞ্চলে যদি কোনও Doodle বর্তমানে দেখানো হচ্ছে এবং এই লুকানো সেটিং চালু থাকে, তাহলে সার্চ বারের নীচে ফিল্টার বারটিও লুকানো থাকবে।" - চ্যানেল বার লুকান - চ্যানেল বার লুকিয়ে রয়েছে - চ্যানেল বার প্রদর্শিত হয়েছে - চ্যানেল জলছাপ লুকান - জলছাপ লুকানো আছে - জলছাপ দেখানো আছে - গণ-অর্থায়ন বাক্স লুকান - গণ-অর্থায়ন বাক্স লুকিয়ে রয়েছে - গণ-অর্থায়ন বাক্স প্রদর্শিত হয়েছে - জরুরী বাক্সগুলো লুকান - জরুরী বাক্সগুলো লুকিয়ে রয়েছে - জরুরী বাক্সগুলো প্রদর্শিত হয়েছে - তথ্য প্যানেল লুকান - তথ্য প্যানেল লুকিয়ে রয়েছে - তথ্য প্যানেল প্রদর্শিত হয়েছে - - যোগদান বোতাম লুকান - যোগদান বোতামটি লুকানো আছে - যোগদান বোতামটি দেখানো হয়েছে - মেডিকেল প্যানেল লুকান - মেডিকেল প্যানেল লুকিয়ে রয়েছে - মেডিকেল প্যানেল প্রদর্শিত হয়েছে - দ্রুত অ্যাকশন লুকান - ফুলস্ক্রিনে দ্রুত অ্যাকশন লুকানো আছে - ফুলস্ক্রিনে দ্রুত অ্যাকশন দেখানো আছে - সম্পর্কিত ভিডিও লুকান - দ্রুত অ্যাকশনে সম্পর্কিত ভিডিও লুকানো আছে - দ্রুত অ্যাকশনে সম্পর্কিত ভিডিও দেখানো আছে - সাবস্ক্রাইবার নির্দেশিকা লুকান - সাবস্ক্রাইবারদের সম্পদ্রায় নির্দেশিকা লুকিয়ে রয়েছে - সাবস্ক্রাইবারদের সম্পদ্রায় নির্দেশিকা প্রদর্শিত হয়েছে - সময় অনুযায়ী প্রতিক্রিয়া লুকান - সময় অনুযায়ী প্রতিক্রিয়া লুকিয়ে রয়েছে - সময় অনুযায়ী প্রতিক্রিয়া প্রদর্শিত হয়েছে - \'AI-জেনারেটেড ভিডিও সারসংক্ষেপ\' লুকান - এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ লুকানো আছে - এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ দেখানো হয়েছে - জিজ্ঞাসা লুকান - জিজ্ঞাসা বিভাগ লুকানো আছে - জিজ্ঞাসা বিভাগ দেখানো হয়েছে - বৈশিষ্ট্যাবলী লুকান - বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি লুকানো আছে - বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি দেখানো হয়েছে - অধ্যায় লুকান - চ্যাপ্টার বিভাগ লুকিয়ে রয়েছে - চ্যাপ্টার বিভাগ প্রদর্শিত হয়েছে - \'How this content was made\' লুকান - How this content was made বিভাগটি লুকানো আছে - How this content was made বিভাগটি দেখানো হয়েছে - হাইপ পয়েন্ট লুকান - হাইপ পয়েন্ট লুকানো আছে - হাইপ পয়েন্ট দেখানো আছে - \'Explore the podcast\' লুকান - Explore the podcast বিভাগটি লুকানো আছে - Explore the podcast বিভাগটি দেখানো হয়েছে - ফিচার লিঙ্ক লুকান - বিশেষ লিঙ্ক বিভাগ লুকানো আছে - বিশেষ লিঙ্ক বিভাগ দেখানো আছে - বিশেষ ভিডিও লুকান - বিশেষ ভিডিও বিভাগ লুকানো আছে - বিশেষ ভিডিও বিভাগ দেখানো আছে - তথ্য কার্ড লুকান - তথ্য কার্ড সেকশন লুকিয়ে রয়েছে - তথ্য কার্ড সেকশন প্রদর্শিত হয়েছে - \'Key concepts\' লুকান - Key concepts বিভাগটি লুকানো আছে - Key concepts বিভাগটি দেখানো হয়েছে - সাবস্ক্রাইব বোতাম লুকান - সাবস্ক্রাইব বোতাম লুকানো আছে - সাবস্ক্রাইব বোতাম দেখানো আছে - নথি লুকান - ট্রান্সস্ক্রিপ্ট বিভাগ লুকিয়ে রয়েছে - ট্রান্সস্ক্রিপ্ট বিভাগ প্রদর্শিত হয়েছে - ভিডিওর বিবরণ - ভিডিও বিবরণ এর উপাদান লুকান বা প্রদর্শন করুন - ফিল্টার বার - ফিড, সম্পর্কিত ভিডিও, অনুসন্ধান ফলাফল এবং দেখার ইতিহাসে ফিল্টার বার লুকান বা দেখান - ফিডে লুকান - ফিডে লুকানো - ফিডে দেখানো হয়েছে - সম্পর্কিত ভিডিওতে লুকান - সম্পর্কিত ভিডিওতে লুকিয়ে রয়েছে - সম্পর্কিত ভিডিওতে প্রদর্শিত হয়েছে - অনুসন্ধান ফলাফলে লুকান - অনুসন্ধান ফলাফলে লুকানো আছে - অনুসন্ধান ফলাফলে দেখানো হয়েছে - দেখার ইতিহাসে লুকান - দেখার ইতিহাসে লুকানো - দেখার ইতিহাসে দেখানো হয়েছে - চ্যানেল পৃষ্ঠা - চ্যানেল পৃষ্ঠার উপাদানগুলি লুকান বা দেখান - - কমিউনিটি বোতাম লুকান - কমিউনিটি বোতাম লুকানো আছে - কমিউনিটি বোতাম দেখানো আছে - - \'আপনার জন্য\' শেল্ফ লুকান - আপনার জন্য শেল্ফ লুকানো আছে - আপনার জন্য শেল্ফ দেখানো আছে - - যোগদান বোতাম লুকান - যোগদান বোতাম লুকানো আছে - যোগদান বোতাম দেখানো আছে - লিঙ্ক পূর্বরূপ লুকান - লিঙ্ক পূর্বরূপ লুকানো আছে - লিঙ্ক পূর্বরূপ দেখানো আছে - সদস্য শেল্ফ লুকান - সদস্য শেল্ফ লুকানো আছে - সদস্যদের শেল্ফ দেখানো হয়েছে - - স্টোর বোতাম লুকান - স্টোর বোতাম লুকানো আছে - স্টোর বোতাম দেখানো আছে - - সাবস্ক্রাইব বোতাম লুকান - সাবস্ক্রাইব বোতাম লুকানো আছে - সাবস্ক্রাইব বোতাম দেখানো আছে - মন্তব্য - মন্তব্য বিভাগের উপাদানগুলি লুকান বা দেখান৷ - এআই চ্যাট সারাংশ লুকান - এআই চ্যাট সারাংশ লুকানো আছে - এআই চ্যাট সারাংশ দেখানো হয়েছে - এআই মন্তব্য সংক্ষিপ্তসার লুকান - এআই মন্তব্য সারাংশ লুকানো আছে - এআই মন্তব্য সারাংশ দেখানো হয়েছে - চ্যানেল নির্দেশিকা লুকান - চ্যানেল নির্দেশিকা লুকানো হয়েছে - চ্যানেল নির্দেশিকা দেখানো হয়েছে - \'মেম্বারদের মন্তব্য\' হেডার লুকান - সদস্যদের দ্বারা মন্তব্য হেডার লুকানো আছে - সদস্যদের দ্বারা মন্তব্য হেডার দেখানো হয়েছে - মন্তব্য বিভাগ লুকান - মন্তব্য বিভাগ লুকিয়ে রয়েছে - মন্তব্য বিভাগ প্রদর্শিত হয়েছে - কমিউনিটি নির্দেশিকা লুকান - কমিউনিটি নির্দেশিকা লুকানো আছে - কমিউনিটি নির্দেশিকা দেখানো আছে - \'Short তৈরি করুন\' বোতাম লুকান - একটি Shorts বোতাম তৈরি করুন লুকানো আছে - একটি Shorts বোতাম তৈরি করুন দেখানো হয়েছে - ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি লুকান - ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি লুকানো আছে - ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি দেখানো আছে - মন্তব্যের পূর্বরূপ লুকান - মন্তব্যের পূর্বরূপ লুকিয়ে রয়েছে - মন্তব্যের পূর্বরূপ প্রদর্শিত হয়েছে - ধন্যবাদ বাটন লুকান - ধন্যবাদ বোতাম লুকিয়ে রয়েছে - ধন্যবাদ বোতাম প্রদর্শিত হয়েছে - দেখার সংখ্যা লুকান - ফিড এবং অনুসন্ধানের ফলাফলে দেখার সংখ্যা লুকানো আছে - ফিড এবং অনুসন্ধানের ফলাফলে দেখার সংখ্যা দেখানো আছে - - "সীমাবদ্ধতা: + যোগদান বোতাম লুকান + যোগদান বোতামটি লুকানো আছে + যোগদান বোতামটি দেখানো হয়েছে + মেডিকেল প্যানেল লুকান + মেডিকেল প্যানেল লুকিয়ে রয়েছে + মেডিকেল প্যানেল প্রদর্শিত হয়েছে + দ্রুত অ্যাকশন লুকান + ফুলস্ক্রিনে দ্রুত অ্যাকশন লুকানো আছে + ফুলস্ক্রিনে দ্রুত অ্যাকশন দেখানো আছে + সম্পর্কিত ভিডিও লুকান + দ্রুত অ্যাকশনে সম্পর্কিত ভিডিও লুকানো আছে + দ্রুত অ্যাকশনে সম্পর্কিত ভিডিও দেখানো আছে + সাবস্ক্রাইবার নির্দেশিকা লুকান + সাবস্ক্রাইবারদের সম্পদ্রায় নির্দেশিকা লুকিয়ে রয়েছে + সাবস্ক্রাইবারদের সম্পদ্রায় নির্দেশিকা প্রদর্শিত হয়েছে + সময় অনুযায়ী প্রতিক্রিয়া লুকান + সময় অনুযায়ী প্রতিক্রিয়া লুকিয়ে রয়েছে + সময় অনুযায়ী প্রতিক্রিয়া প্রদর্শিত হয়েছে + \'AI-জেনারেটেড ভিডিও সারসংক্ষেপ\' লুকান + এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ লুকানো আছে + এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ দেখানো হয়েছে + জিজ্ঞাসা লুকান + জিজ্ঞাসা বিভাগ লুকানো আছে + জিজ্ঞাসা বিভাগ দেখানো হয়েছে + বৈশিষ্ট্যাবলী লুকান + বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি লুকানো আছে + বৈশিষ্ট্যযুক্ত স্থান, গেমস, সঙ্গীত, এবং উল্লিখিত ব্যক্তি বিভাগগুলি দেখানো হয়েছে + অধ্যায় লুকান + চ্যাপ্টার বিভাগ লুকিয়ে রয়েছে + চ্যাপ্টার বিভাগ প্রদর্শিত হয়েছে + \'How this content was made\' লুকান + How this content was made বিভাগটি লুকানো আছে + How this content was made বিভাগটি দেখানো হয়েছে + হাইপ পয়েন্ট লুকান + হাইপ পয়েন্ট লুকানো আছে + হাইপ পয়েন্ট দেখানো আছে + \'Explore the podcast\' লুকান + Explore the podcast বিভাগটি লুকানো আছে + Explore the podcast বিভাগটি দেখানো হয়েছে + ফিচার লিঙ্ক লুকান + বিশেষ লিঙ্ক বিভাগ লুকানো আছে + বিশেষ লিঙ্ক বিভাগ দেখানো আছে + বিশেষ ভিডিও লুকান + বিশেষ ভিডিও বিভাগ লুকানো আছে + বিশেষ ভিডিও বিভাগ দেখানো আছে + তথ্য কার্ড লুকান + তথ্য কার্ড সেকশন লুকিয়ে রয়েছে + তথ্য কার্ড সেকশন প্রদর্শিত হয়েছে + \'Key concepts\' লুকান + Key concepts বিভাগটি লুকানো আছে + Key concepts বিভাগটি দেখানো হয়েছে + সাবস্ক্রাইব বোতাম লুকান + সাবস্ক্রাইব বোতাম লুকানো আছে + সাবস্ক্রাইব বোতাম দেখানো আছে + নথি লুকান + ট্রান্সস্ক্রিপ্ট বিভাগ লুকিয়ে রয়েছে + ট্রান্সস্ক্রিপ্ট বিভাগ প্রদর্শিত হয়েছে + ভিডিওর বিবরণ + ভিডিও বিবরণ এর উপাদান লুকান বা প্রদর্শন করুন + ফিল্টার বার + ফিড, সম্পর্কিত ভিডিও, অনুসন্ধান ফলাফল এবং দেখার ইতিহাসে ফিল্টার বার লুকান বা দেখান + ফিডে লুকান + ফিডে লুকানো + ফিডে দেখানো হয়েছে + সম্পর্কিত ভিডিওতে লুকান + সম্পর্কিত ভিডিওতে লুকিয়ে রয়েছে + সম্পর্কিত ভিডিওতে প্রদর্শিত হয়েছে + অনুসন্ধান ফলাফলে লুকান + অনুসন্ধান ফলাফলে লুকানো আছে + অনুসন্ধান ফলাফলে দেখানো হয়েছে + দেখার ইতিহাসে লুকান + দেখার ইতিহাসে লুকানো + দেখার ইতিহাসে দেখানো হয়েছে + চ্যানেল পৃষ্ঠা + চ্যানেল পৃষ্ঠার উপাদানগুলি লুকান বা দেখান + + কমিউনিটি বোতাম লুকান + কমিউনিটি বোতাম লুকানো আছে + কমিউনিটি বোতাম দেখানো আছে + + \'আপনার জন্য\' শেল্ফ লুকান + আপনার জন্য শেল্ফ লুকানো আছে + আপনার জন্য শেল্ফ দেখানো আছে + + যোগদান বোতাম লুকান + যোগদান বোতাম লুকানো আছে + যোগদান বোতাম দেখানো আছে + লিঙ্ক পূর্বরূপ লুকান + লিঙ্ক পূর্বরূপ লুকানো আছে + লিঙ্ক পূর্বরূপ দেখানো আছে + সদস্য শেল্ফ লুকান + সদস্য শেল্ফ লুকানো আছে + সদস্যদের শেল্ফ দেখানো হয়েছে + + স্টোর বোতাম লুকান + স্টোর বোতাম লুকানো আছে + স্টোর বোতাম দেখানো আছে + + সাবস্ক্রাইব বোতাম লুকান + সাবস্ক্রাইব বোতাম লুকানো আছে + সাবস্ক্রাইব বোতাম দেখানো আছে + মন্তব্য + মন্তব্য বিভাগের উপাদানগুলি লুকান বা দেখান৷ + এআই চ্যাট সারাংশ লুকান + এআই চ্যাট সারাংশ লুকানো আছে + এআই চ্যাট সারাংশ দেখানো হয়েছে + এআই মন্তব্য সংক্ষিপ্তসার লুকান + এআই মন্তব্য সারাংশ লুকানো আছে + এআই মন্তব্য সারাংশ দেখানো হয়েছে + চ্যানেল নির্দেশিকা লুকান + চ্যানেল নির্দেশিকা লুকানো হয়েছে + চ্যানেল নির্দেশিকা দেখানো হয়েছে + \'মেম্বারদের মন্তব্য\' হেডার লুকান + সদস্যদের দ্বারা মন্তব্য হেডার লুকানো আছে + সদস্যদের দ্বারা মন্তব্য হেডার দেখানো হয়েছে + মন্তব্য বিভাগ লুকান + মন্তব্য বিভাগ লুকিয়ে রয়েছে + মন্তব্য বিভাগ প্রদর্শিত হয়েছে + কমিউনিটি নির্দেশিকা লুকান + কমিউনিটি নির্দেশিকা লুকানো আছে + কমিউনিটি নির্দেশিকা দেখানো আছে + \'Short তৈরি করুন\' বোতাম লুকান + একটি Shorts বোতাম তৈরি করুন লুকানো আছে + একটি Shorts বোতাম তৈরি করুন দেখানো হয়েছে + ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি লুকান + ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি লুকানো আছে + ইমোজি এবং টাইমস্ট্যাম্প বোতামগুলি দেখানো আছে + মন্তব্যের পূর্বরূপ লুকান + মন্তব্যের পূর্বরূপ লুকিয়ে রয়েছে + মন্তব্যের পূর্বরূপ প্রদর্শিত হয়েছে + ধন্যবাদ বাটন লুকান + ধন্যবাদ বোতাম লুকিয়ে রয়েছে + ধন্যবাদ বোতাম প্রদর্শিত হয়েছে + দেখার সংখ্যা লুকান + ফিড এবং অনুসন্ধানের ফলাফলে দেখার সংখ্যা লুকানো আছে + ফিড এবং অনুসন্ধানের ফলাফলে দেখার সংখ্যা দেখানো আছে + + "সীমাবদ্ধতা: • Shorts শেল্ফ, চ্যানেল পেজ এবং অনুসন্ধানের ফলাফলে এখনও দেখার সংখ্যা দেখানো হতে পারে • এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না" - আপলোডের সময় লুকান - আপলোডের সময় ফিড এবং সার্চ ফলাফলে লুকানো আছে - আপলোডের সময় ফিড এবং সার্চ ফলাফলে দেখানো আছে - - "সীমাবদ্ধতা: + আপলোডের সময় লুকান + আপলোডের সময় ফিড এবং সার্চ ফলাফলে লুকানো আছে + আপলোডের সময় ফিড এবং সার্চ ফলাফলে দেখানো আছে + + "সীমাবদ্ধতা: • Shorts শেলফ, চ্যানেল পেজ এবং সার্চ ফলাফলে এখনও আপলোডের সময় দেখানো হতে পারে • এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না" - কীওয়ার্ড কনটেন্ট লুকান - কীওয়ার্ড ফিল্টার ব্যবহার করে অনুসন্ধান এবং ফিড ভিডিও লুকান - কীওয়ার্ড ব্যবহার করে প্রধান পাতার ভিডিও লুকান - প্রধান পাতার ভিডিও কীওয়ার্ড দ্বারা ফিল্টার করা হয়েছে - প্রধান পাতার ভিডিও কীওয়ার্ড দ্বারা ফিল্টার করা হয়নি - কীওয়ার্ড ব্যবহার করে অনুসন্ধান ফলাফল লুকান - অনুসন্ধান ফলাফল কীওয়ার্ড দ্বারা ফিল্টার করা হয়েছে - অনুসন্ধান ফলাফল কীওয়ার্ড দ্বারা ফিল্টার করা হয়নি - কীওয়ার্ড ব্যবহার করে সাবস্ক্রিপশন ভিডিও লুকান - সাবস্ক্রিপশন পাতার ভিডিও কীওয়ার্ড দ্বারা ফিল্টার করা হয়েছে - সাবস্ক্রিপশন পাতার ভিডিও কীওয়ার্ড দ্বারা ফিল্টার করা হয়নি - লুকানোর জন্য কীওয়ার্ড - - "নতুন লাইন দ্বারা পৃথক করা লুকানোর জন্য কিওয়ার্ড এবং বাক্যাংশ + "নতুন লাইন দ্বারা পৃথক করা লুকানোর জন্য কিওয়ার্ড এবং বাক্যাংশ কিওয়ার্ড চ্যানেলের নাম বা ভিডিও শিরোনামে দেখানো কোনও পাঠ্য হতে পারে মাঝখানে বড় হাতের অক্ষর সম্বলিত শব্দগুলি কেসিং দিয়ে প্রবেশ করতে হবে (যেমন: iPhone, TikTok, LeBlanc)" - কীওয়ার্ড ফিল্টারিং সম্পর্কে - "হোম / সাবস্ক্রিপশন / অনুসন্ধানের ফলাফলগুলি কিওয়ার্ড বাক্যাংশের সাথে মিলে যাওয়া সামগ্রী লুকানোর জন্য ফিল্টার করা হয় + কীওয়ার্ড ফিল্টারিং সম্পর্কে + "হোম / সাবস্ক্রিপশন / অনুসন্ধানের ফলাফলগুলি কিওয়ার্ড বাক্যাংশের সাথে মিলে যাওয়া সামগ্রী লুকানোর জন্য ফিল্টার করা হয় সীমাবদ্ধতা • চ্যানেলের নাম দ্বারা Shorts লুকানো যাবে না • কিছু UI উপাদান লুকানো নাও হতে পারে • কোনও কিওয়ার্ড অনুসন্ধান করলে কোনও ফলাফল নাও দেখাতে পারে" - সম্পূর্ণ শব্দ মেলাও - - ডাবল কোটের মধ্যে একটি কীওয়ার্ড/ফ্রেজ রাখলে ভিডিও শিরোনাম এবং চ্যানেলের নামের আংশিক মিল সনাক্ত করা বন্ধ হয়ে যাবে<br><br>উদাহরণস্বরূপ,<br><b>\"ai\"</b> ভিডিওটি লুকিয়ে দেবে: <b>How does AI work?</b><br>কিন্তু লুকিয়ে দেবে না: <b>What does fair use mean?</b> - - কিওয়ার্ড ব্যবহার করা যাবে না: %s - কিওয়ার্ড ব্যবহার করার জন্য উদ্ধৃতি যোগ করুন: %s - কিওয়ার্ডের দ্বন্দ্বপূর্ণ ঘোষণা আছে: %s - কিওয়ার্ড খুব ছোট এবং উদ্ধৃতি প্রয়োজন: %s - কিওয়ার্ড সমস্ত ভিডিও লুকিয়ে রাখবে: %s - - - ক্রিয়েটর স্টোর শেল্ফ লুকান - ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেলফ লুকানো আছে - ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেল্ফ দেখানো হয় - শেষ পর্দার স্টোর ব্যানার লুকান - এন্ড স্ক্রিন স্টোর ব্যানার লুকানো আছে - এন্ড স্ক্রিন স্টোর ব্যানার দেখানো হয়েছে - পূর্ণ স্ক্রীন প্যানেল লুকান - "পূর্ণ পর্দার বিজ্ঞাপন লুকানো হয় + সম্পূর্ণ শব্দ মেলাও + + ডাবল কোটের মধ্যে একটি কীওয়ার্ড/ফ্রেজ রাখলে ভিডিও শিরোনাম এবং চ্যানেলের নামের আংশিক মিল সনাক্ত করা বন্ধ হয়ে যাবে<br><br>উদাহরণস্বরূপ,<br><b>\"ai\"</b> ভিডিওটি লুকিয়ে দেবে: <b>How does AI work?</b><br>কিন্তু লুকিয়ে দেবে না: <b>What does fair use mean?</b> + + কিওয়ার্ড ব্যবহার করা যাবে না: %s + কিওয়ার্ড ব্যবহার করার জন্য উদ্ধৃতি যোগ করুন: %s + কিওয়ার্ডের দ্বন্দ্বপূর্ণ ঘোষণা আছে: %s + কিওয়ার্ড খুব ছোট এবং উদ্ধৃতি প্রয়োজন: %s + কিওয়ার্ড সমস্ত ভিডিও লুকিয়ে রাখবে: %s + + + ক্রিয়েটর স্টোর শেল্ফ লুকান + ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেলফ লুকানো আছে + ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেল্ফ দেখানো হয় + শেষ পর্দার স্টোর ব্যানার লুকান + এন্ড স্ক্রিন স্টোর ব্যানার লুকানো আছে + এন্ড স্ক্রিন স্টোর ব্যানার দেখানো হয়েছে + পূর্ণ স্ক্রীন প্যানেল লুকান + "পূর্ণ পর্দার বিজ্ঞাপন লুকানো হয় এই বৈশিষ্ট্যটি কেবল পুরনো ডিভাইসের জন্য উপলব্ধ" - পূর্ণ স্ক্রীন বিজ্ঞাপন প্রদর্শিত হয়েছে - - পূর্ণস্ক্রীন বিজ্ঞাপন লুকানো পুরোনো ডিভাইসে কাজ করে - সাধারণ বিজ্ঞাপন লুকান - সাধারণ বিজ্ঞাপন লুকিয়ে রয়েছে - সাধারণ বিজ্ঞাপন প্রদর্শিত হয়েছে - পণ্যদ্রব্য ব্যানার লুকান - পণ্যদ্রব্যের ব্যানার লুকিয়ে রয়েছে - পণ্যদ্রব্যের ব্যানার প্রদর্শিত হয়েছে - অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকান - অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকিয়ে রয়েছে - অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার প্রদর্শিত হয়েছে - স্ব-স্পন্সর কার্ড লুকান - স্ব-স্পন্সর কার্ড লুকিয়ে রয়েছে - স্ব-স্পন্সর কার্ড প্রদর্শিত হয়েছে - কেনাকাটার লিঙ্ক লুকান - ভিডিও বিবরণে কেনাকাটার লিঙ্ক লুকানো আছে - ভিডিও বর্ণনায় কেনাকাটার লিঙ্ক দেখানো হয় - \'পণ্য দেখুন\' ব্যানার লুকান - ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার লুকানো আছে - ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার দেখানো হয়েছে - লোকেরা এইগুলিও সার্চ করছে লুকান - লোকেরা এইগুলিও সার্চ করছে লুকিয়ে রয়েছে - লোকেরা এইগুলিও সার্চ করছে প্রদর্শিত হয়েছে - - - YouTube প্রিমিয়াম প্রচারণা লুকান - ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা লুকিয়ে রয়েছে - ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা প্রদর্শিত হয়েছে - - - ভিডিও বিজ্ঞাপন লুকান - ভিডিও বিজ্ঞাপন লুকিয়ে রয়েছে - ভিডিও বিজ্ঞাপন প্রদর্শিত হয়েছে - - - ক্লিপবোর্ডে URL অনুলিপি করা হয়েছে - টাইমস্ট্যাম্প সহ URL অনুলিপি করা হয়েছে - ভিডিও URL অনুলিপি বোতাম দেখান - ভিডিও ইউআরএল কপি বোতাম দেখানো আছে। ভিডিও ইউআরএল কপি করতে ট্যাপ করুন। টাইমস্ট্যাম্প সহ কপি করতে ট্যাপ করে ধরে রাখুন - ভিডিও ইউআরএল কপি বোতাম দেখানো নেই - টাইমস্ট্যাম্প URL অনুলিপি বোতাম দেখান - টাইমস্ট্যাম্প ইউআরএল কপি বোতাম দেখানো আছে। টাইমস্ট্যাম্প সহ ভিডিও ইউআরএল কপি করতে ট্যাপ করুন। টাইমস্ট্যাম্প ছাড়া কপি করতে ট্যাপ করে ধরে রাখুন - টাইমস্ট্যাম্প ইউআরএল কপি বোতাম দেখানো নেই - - - দর্শকের বিচক্ষণতা ডায়ালগ সরান - ডায়ালগ সরানো হবে - ডায়ালগ প্রদর্শিত হবে - এটি বয়সের সীমাবদ্ধতাকে বাইপাস করে না। এটা শুধু স্বয়ংক্রিয়ভাবে গ্রহণ করে। - - - \'টিভি-তে সাইন ইন করুন\' পপআপ নিষ্ক্রিয় করুন - টিভিতে সাইন ইন পপআপ অক্ষম করা হয়েছে - টিভিতে সাইন ইন পপআপ সক্ষম করা হয়েছে - - - ডাবল ট্যাপ অধ্যায় স্কিপ অক্ষম করুন - ডাবল ট্যাপ কখনও পরবর্তী/পূর্ববর্তী অধ্যায়ে স্কিপ ট্রিগার করতে পারে না - ডাবল ট্যাপ মাঝে মাঝে পরবর্তী/পূর্ববর্তী অধ্যায়ে স্কিপ ট্রিগার করতে পারে - - - বাহিরে ডাউনলোড - বাহিরের ডাউনলোডার ব্যবহার করার সেটিং - বাহিরের ডাউনলোডার বাটন দেখান - প্লেয়ারে ডাউনলোড বোতাম দেখানো হয়েছে - প্লেয়ারে ডাউনলোড বোতাম দেখানো হয়নি - - ডাউনলোড অ্যাকশন বোতামটি ওভাররাইড করুন - ডাউনলোড বোতামটি আপনার বাহিরের ডাউনলোডার খুলবে - ডাউনলোড বোতামটি নেটিভ ইন-অ্যাপ ডাউনলোডার খুলবে - ডাউনলোডারের প্যাকেজ নাম - আপনার ইনস্টল করা বাহ্যিক ডাউনলোডার অ্যাপের প্যাকেজের নাম - প্যাকেজের নাম লিখুন - অন্যান্য - অ্যাপ ইনস্টল করা নেই - %s ইনস্টল করা নেই, ইনস্টল করুন। - "প্যাকেজের নাম: %s সহ ইনস্টল করা অ্যাপটি খুঁজে পাওয়া যায়নি + পূর্ণ স্ক্রীন বিজ্ঞাপন প্রদর্শিত হয়েছে + + পূর্ণস্ক্রীন বিজ্ঞাপন লুকানো পুরোনো ডিভাইসে কাজ করে + সাধারণ বিজ্ঞাপন লুকান + সাধারণ বিজ্ঞাপন লুকিয়ে রয়েছে + সাধারণ বিজ্ঞাপন প্রদর্শিত হয়েছে + পণ্যদ্রব্য ব্যানার লুকান + পণ্যদ্রব্যের ব্যানার লুকিয়ে রয়েছে + পণ্যদ্রব্যের ব্যানার প্রদর্শিত হয়েছে + অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকান + অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকিয়ে রয়েছে + অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার প্রদর্শিত হয়েছে + স্ব-স্পন্সর কার্ড লুকান + স্ব-স্পন্সর কার্ড লুকিয়ে রয়েছে + স্ব-স্পন্সর কার্ড প্রদর্শিত হয়েছে + কেনাকাটার লিঙ্ক লুকান + ভিডিও বিবরণে কেনাকাটার লিঙ্ক লুকানো আছে + ভিডিও বর্ণনায় কেনাকাটার লিঙ্ক দেখানো হয় + \'পণ্য দেখুন\' ব্যানার লুকান + ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার লুকানো আছে + ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার দেখানো হয়েছে + লোকেরা এইগুলিও সার্চ করছে লুকান + লোকেরা এইগুলিও সার্চ করছে লুকিয়ে রয়েছে + লোকেরা এইগুলিও সার্চ করছে প্রদর্শিত হয়েছে + + + YouTube প্রিমিয়াম প্রচারণা লুকান + ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা লুকিয়ে রয়েছে + ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা প্রদর্শিত হয়েছে + + + ভিডিও বিজ্ঞাপন লুকান + ভিডিও বিজ্ঞাপন লুকিয়ে রয়েছে + ভিডিও বিজ্ঞাপন প্রদর্শিত হয়েছে + + + ক্লিপবোর্ডে URL অনুলিপি করা হয়েছে + টাইমস্ট্যাম্প সহ URL অনুলিপি করা হয়েছে + ভিডিও URL অনুলিপি বোতাম দেখান + ভিডিও ইউআরএল কপি বোতাম দেখানো আছে। ভিডিও ইউআরএল কপি করতে ট্যাপ করুন। টাইমস্ট্যাম্প সহ কপি করতে ট্যাপ করে ধরে রাখুন + ভিডিও ইউআরএল কপি বোতাম দেখানো নেই + টাইমস্ট্যাম্প URL অনুলিপি বোতাম দেখান + টাইমস্ট্যাম্প ইউআরএল কপি বোতাম দেখানো আছে। টাইমস্ট্যাম্প সহ ভিডিও ইউআরএল কপি করতে ট্যাপ করুন। টাইমস্ট্যাম্প ছাড়া কপি করতে ট্যাপ করে ধরে রাখুন + টাইমস্ট্যাম্প ইউআরএল কপি বোতাম দেখানো নেই + + + দর্শকের বিচক্ষণতা ডায়ালগ সরান + ডায়ালগ সরানো হবে + ডায়ালগ প্রদর্শিত হবে + এটি বয়সের সীমাবদ্ধতাকে বাইপাস করে না। এটা শুধু স্বয়ংক্রিয়ভাবে গ্রহণ করে। + + + \'টিভি-তে সাইন ইন করুন\' পপআপ নিষ্ক্রিয় করুন + টিভিতে সাইন ইন পপআপ অক্ষম করা হয়েছে + টিভিতে সাইন ইন পপআপ সক্ষম করা হয়েছে + + + ডাবল ট্যাপ অধ্যায় স্কিপ অক্ষম করুন + ডাবল ট্যাপ কখনও পরবর্তী/পূর্ববর্তী অধ্যায়ে স্কিপ ট্রিগার করতে পারে না + ডাবল ট্যাপ মাঝে মাঝে পরবর্তী/পূর্ববর্তী অধ্যায়ে স্কিপ ট্রিগার করতে পারে + + + বাহিরে ডাউনলোড + বাহিরের ডাউনলোডার ব্যবহার করার সেটিং + বাহিরের ডাউনলোডার বাটন দেখান + প্লেয়ারে ডাউনলোড বোতাম দেখানো হয়েছে + প্লেয়ারে ডাউনলোড বোতাম দেখানো হয়নি + + ডাউনলোড অ্যাকশন বোতামটি ওভাররাইড করুন + ডাউনলোড বোতামটি আপনার বাহিরের ডাউনলোডার খুলবে + ডাউনলোড বোতামটি নেটিভ ইন-অ্যাপ ডাউনলোডার খুলবে + ডাউনলোডারের প্যাকেজ নাম + আপনার ইনস্টল করা বাহ্যিক ডাউনলোডার অ্যাপের প্যাকেজের নাম + প্যাকেজের নাম লিখুন + অন্যান্য + অ্যাপ ইনস্টল করা নেই + %s ইনস্টল করা নেই, ইনস্টল করুন। + "প্যাকেজের নাম: %s সহ ইনস্টল করা অ্যাপটি খুঁজে পাওয়া যায়নি প্যাকেজের নামটি সঠিক এবং অ্যাপটি ইনস্টল করা আছে কিনা তা যাচাই করুন" - প্যাকেজের নাম খালি রাখা যাবে না - - - ভিডিওর নির্দিষ্ট অংশে যাওয়ার অঙ্গভঙ্গি নিষ্ক্রিয় করুন - অঙ্গভঙ্গি নিষ্ক্রিয় করা হয়েছে - অঙ্গভঙ্গি সক্রিয় করা হয়েছে - - - ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা সক্রিয় করুন - ট্যাপ করে খোঁজা সক্রিয় করা হয়েছে - ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা নিষ্ক্রিয় করা হয়েছে - - - উজ্জ্বলতার সোয়াইপ অঙ্গভঙ্গি সক্রিয় করুন - "Fullscreen brightness swipe enabled আছে + প্যাকেজের নাম খালি রাখা যাবে না + + + ভিডিওর নির্দিষ্ট অংশে যাওয়ার অঙ্গভঙ্গি নিষ্ক্রিয় করুন + অঙ্গভঙ্গি নিষ্ক্রিয় করা হয়েছে + অঙ্গভঙ্গি সক্রিয় করা হয়েছে + + + ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা সক্রিয় করুন + ট্যাপ করে খোঁজা সক্রিয় করা হয়েছে + ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা নিষ্ক্রিয় করা হয়েছে + + + উজ্জ্বলতার সোয়াইপ অঙ্গভঙ্গি সক্রিয় করুন + "Fullscreen brightness swipe enabled আছে স্ক্রিনের বাম দিকে উল্লম্বভাবে সোয়াইপ করে উজ্জ্বলতা সামঞ্জস্য করুন" - Fullscreen brightness swipe disabled করা হয়েছে - ভলিউম অঙ্গভঙ্গি সক্রিয় করুন - "পূর্ণ স্ক্রীন ভলিউম সোয়াইপ সক্রিয় করা হয়েছে + Fullscreen brightness swipe disabled করা হয়েছে + ভলিউম অঙ্গভঙ্গি সক্রিয় করুন + "পূর্ণ স্ক্রীন ভলিউম সোয়াইপ সক্রিয় করা হয়েছে স্ক্রিনের ডান দিকে উল্লম্বভাবে সোয়াইপ করে ভলিউম সামঞ্জস্য করুন" - পূর্ণ স্ক্রীন ভলিউম সোয়াইপ নিষ্ক্রিয় করা হয়েছে - সোয়াইপ করার জন্য প্রেস করা অঙ্গভঙ্গি সক্রিয় করুন - সোয়াইপ করার জন্য প্রেস করা সক্রিয় করা হয়েছে - সোয়াইপ করার জন্য প্রেস করা নিষ্ক্রিয় করা হয়েছে - কম্পন প্রতিক্রিয়া সক্রিয় করুন - কম্পন প্রতিক্রিয়া সক্রিয় করা হয়েছে - কম্পন প্রতিক্রিয়া নিষ্ক্রিয় করা হয়েছে - উজ্জ্বলতা সংরক্ষণ এবং পুনরুদ্ধার করুন - পূর্ণস্ক্রিনে প্রবেশ বা পূর্ণস্ক্রিন থেকে বাহির হওয়ার সময়, উজ্জ্বলতা সংরক্ষণ এবং পুনরুদ্ধার করবে - পূর্ণস্ক্রিনে প্রবেশ বা পূর্ণস্ক্রিন থেকে বাহির হওয়ার সময়, উজ্জ্বলতা সংরক্ষণ এবং পুনরুদ্ধার করবে না - স্বয়ংক্রিয়-উজ্জ্বলতার অঙ্গভঙ্গি সক্রিয় করুন - উজ্জ্বলতার অঙ্গভঙ্গির সর্বনিম্ন মানে সোয়াইপ ডাউন করলে অটো-উজ্জ্বলতা সক্ষম হয় - সর্বনিম্ন মানে সোয়াইপ ডাউন করলে অটো-উজ্জ্বলতা সক্ষম হয় না - স্বতস্ফূর্তভাবে - ওভার-লে টাইম আউট - কত মিলিসেকেন্ডের জন্য ওভারলে দৃশ্যমান হবে - অস্বচ্ছতা - 0-100 এর মধ্যে অস্বচ্ছতার মান - সোয়াইপের অস্বচ্ছতা অবশ্যই 0-100 এর মধ্যে হতে হবে - সোয়াইপ ওভারলে উজ্জ্বলতা রঙ - উজ্জ্বলতা নিয়ন্ত্রণের জন্য প্রগ্রেস বারের রঙ - সোয়াইপ ওভারলে ভলিউম রঙ - ভলিউম নিয়ন্ত্রণের জন্য প্রগ্রেস বারের রঙ - সোয়াইপ ওভারলে টেক্সট সাইজ - সোয়াইপ ওভারলে-এর জন্য টেক্সট সাইজ ১-৩০ এর মধ্যে - টেক্সট সাইজ অবশ্যই ১-৩০ এর মধ্যে হতে হবে - সোয়াইপ থ্রেশহোল্ড এর মাত্রা - সোয়াইপ করার থ্রেশহোল্ডের পরিমাণ - ভলিউম সোয়াইপ সংবেদনশীলতা - প্রতি সোয়াইপে ভলিউম কতটা পরিবর্তিত হয় - সোয়াইপ ওভারলে শৈলী - অনুভূমিক ওভারলে - অনুভূমিক ওভারলে (ন্যূনতম - উপরে) - অনুভূমিক ওভারলে (ন্যূনতম - কেন্দ্র) - বৃত্তাকার ওভারলে - বৃত্তাকার ওভারলে (ন্যূনতম) - উল্লম্ব ওভারলে - উল্লম্ব ওভারলে (ন্যূনতম) - ভিডিও পরিবর্তন করতে সোয়াইপ করে সক্ষম করুন - ফুলস্ক্রিন মোডে সোয়াইপ করলে পরবর্তী/পূর্ববর্তী ভিডিওতে পরিবর্তন হবে - ফুলস্ক্রিন মোডে সোয়াইপ করলে পরবর্তী /পূর্ববর্তী ভিডিওতে পরিবর্তন হবে না - - - স্বয়ংক্রিয় ক্যাপশন বন্ধ করুন - অটো ক্যাপশনগুলি নিষ্ক্রিয় করা হয়েছে - অটো ক্যাপশনগুলি সক্রিয় করা হয়েছে - - - অ্যাকশন বোতাম - ভিডিওর নীচে বোতাম লুকানো বা দেখানো - লাইক এবং সাবস্ক্রাইব বোতাম গ্লো বন্ধ করুন - উল্লেখ করলে সক্রিয়করন এবং সাবস্ক্রাইব বোতাম উজ্জ্বল হবে না - উল্লেখ করলে সক্রিয়করন এবং সাবস্ক্রাইব বোতাম উজ্জ্বল হবে - Like এবং Dislike লুকান - Like এবং Dislike বোতাম লুকানো আছে - Like এবং Dislike বোতাম দেখানো হচ্ছে - - Share লুকান - শেয়ার করুন বোতাম লুকিয়ে রয়েছে - শেয়ার বাটন প্রদর্শিত হয়েছে - - বিজ্ঞাপন বন্ধ করুন লুকান - বিজ্ঞাপন বন্ধ করুন বোতামটি লুকানো আছে - বিজ্ঞাপন বন্ধ করুন বোতামটি দেখানো হচ্ছে - - মন্তব্য লুকান - মন্তব্য বোতাম লুকানো আছে - মন্তব্য বোতাম দেখানো আছে - + Share লুকান + শেয়ার করুন বোতাম লুকিয়ে রয়েছে + শেয়ার বাটন প্রদর্শিত হয়েছে + + বিজ্ঞাপন বন্ধ করুন লুকান + বিজ্ঞাপন বন্ধ করুন বোতামটি লুকানো আছে + বিজ্ঞাপন বন্ধ করুন বোতামটি দেখানো হচ্ছে + + মন্তব্য লুকান + মন্তব্য বোতাম লুকানো আছে + মন্তব্য বোতাম দেখানো আছে + - Report লুকান - রিপোর্ট বাটন লুকিয়ে রয়েছে - রিপোর্ট বাটন প্রদর্শিত - - Remix লুকান - রিমিক্স বাটন লুকিয়ে রয়েছে - রিমিক্স বাটন প্রদর্শিত হয়েছে - - ডাউনলোডগুলো হাইড করাও - ডাউনলোড বোতাম লুকানো আছে - ডাউনলোড বোতাম দেখানো হয়েছে - + Remix লুকান + রিমিক্স বাটন লুকিয়ে রয়েছে + রিমিক্স বাটন প্রদর্শিত হয়েছে + + ডাউনলোডগুলো হাইড করাও + ডাউনলোড বোতাম লুকানো আছে + ডাউনলোড বোতাম দেখানো হয়েছে + - হাইপ লুকান - হাইপ বোতাম লুকানো আছে - হাইপ বাটন দেখানো হয়েছে - - প্রমোট লুকান - প্রোমোশন বাটন লুকানো আছে - প্রোমোশন বাটন দেখানো আছে - - ধন্যবাদ লুকান - ধন্যবাদ বোতাম লুকানো আছে - ধন্যবাদ বোতাম দেখানো হয় - + প্রমোট লুকান + প্রোমোশন বাটন লুকানো আছে + প্রোমোশন বাটন দেখানো আছে + + ধন্যবাদ লুকান + ধন্যবাদ বোতাম লুকানো আছে + ধন্যবাদ বোতাম দেখানো হয় + - জিজ্ঞাসা লুকান - জিজ্ঞাসা বোতাম লুকানো আছে - জিজ্ঞাসা বোতাম দেখানো হয়েছে - - ক্লিপ লুকান - ক্লিপ বোতাম লুকিয়ে রয়েছে - ক্লিপ বোতাম প্রদর্শিত হয়েছে - - শপ লুকান - শপ বাটন লুকানো আছে - শপ বাটন দেখানো আছে - - সংরক্ষণ লুকান - সংরক্ষণ বোতাম লুকানো আছে - সংরক্ষণ বোতাম দেখানো হচ্ছে - - - নেভিগেশন বোতাম - নেভিগেশন বারে বোতাম লুকান বা পরিবর্তন করুন - - হোম লুকান - হোম বোতাম লুকানো আছে - হোম বোতাম দেখানো হয় - - Shorts লুকান - Shorts বোতাম লুকিয়ে রয়েছে - Shorts বোতাম প্রদর্শিত হয়েছে - - লুকান তৈরি করুন - তৈরি বোতাম লুকানো আছে - ক্রিয়েট বাটন প্রদর্শিত হয়েছে - - সদস্যতা লুকান - সদস্যতা নিন বোতাম লুকিয়ে রয়েছে - সদস্যতা নিন বোতাম প্রদর্শিত হয়েছে - বিজ্ঞপ্তি লুকান - বিজ্ঞপ্তি বোতাম লুকানো আছে - বিজ্ঞপ্তি বোতাম দেখানো হয়েছে - - তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করুন - "তৈরি বোতামটি বিজ্ঞপ্তি বোতামের সাথে পরিবর্তন করা হয় + জিজ্ঞাসা লুকান + জিজ্ঞাসা বোতাম লুকানো আছে + জিজ্ঞাসা বোতাম দেখানো হয়েছে + + ক্লিপ লুকান + ক্লিপ বোতাম লুকিয়ে রয়েছে + ক্লিপ বোতাম প্রদর্শিত হয়েছে + + শপ লুকান + শপ বাটন লুকানো আছে + শপ বাটন দেখানো আছে + + সংরক্ষণ লুকান + সংরক্ষণ বোতাম লুকানো আছে + সংরক্ষণ বোতাম দেখানো হচ্ছে + + + নেভিগেশন বোতাম + নেভিগেশন বারে বোতাম লুকান বা পরিবর্তন করুন + + হোম লুকান + হোম বোতাম লুকানো আছে + হোম বোতাম দেখানো হয় + + Shorts লুকান + Shorts বোতাম লুকিয়ে রয়েছে + Shorts বোতাম প্রদর্শিত হয়েছে + + লুকান তৈরি করুন + তৈরি বোতাম লুকানো আছে + ক্রিয়েট বাটন প্রদর্শিত হয়েছে + + সদস্যতা লুকান + সদস্যতা নিন বোতাম লুকিয়ে রয়েছে + সদস্যতা নিন বোতাম প্রদর্শিত হয়েছে + বিজ্ঞপ্তি লুকান + বিজ্ঞপ্তি বোতাম লুকানো আছে + বিজ্ঞপ্তি বোতাম দেখানো হয়েছে + + তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করুন + "তৈরি বোতামটি বিজ্ঞপ্তি বোতামের সাথে পরিবর্তন করা হয় মনে রাখবেন: এটি সক্রিয় করা ভিডিও বিজ্ঞাপনগুলিও জোর করে লুকিয়ে দেয়" - তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করা হয়নি - "এই সেটিংস নিষ্ক্রিয় করলে Shorts বিজ্ঞাপন ব্লকিংও নিষ্ক্রিয় হয়ে যাবে। + তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করা হয়নি + "এই সেটিংস নিষ্ক্রিয় করলে Shorts বিজ্ঞাপন ব্লকিংও নিষ্ক্রিয় হয়ে যাবে। যদি এই সেটিংস পরিবর্তন করার পরে কাজ না করে, তাহলে Incognito মোডে চেষ্টা করুন।" - নেভিগেশন বোতাম লেবেল লুকান - লেবেল লুকিয়ে রয়েছে - লেবেল প্রদর্শিত হয়েছে - অর্ধস্বচ্ছ স্থিতি বার নিষ্ক্রিয় করুন - স্ট্যাটাস বারটি অস্বচ্ছ - স্ট্যাটাস বারটি অস্বচ্ছ বা স্বচ্ছ - কিছু ডিভাইসে, এই বৈশিষ্ট্যটি সক্ষম করলে সিস্টেম নেভিগেশন বার স্বচ্ছ হয়ে যেতে পারে। - অর্ধস্বচ্ছ হালকা বার নিষ্ক্রিয় করুন - হালকা মোড নেভিগেশন বার অস্বচ্ছ - লাইট মোড ন্যাভিগেশন বারটি অস্বচ্ছ বা স্বচ্ছ - গাঢ় স্বচ্ছ বার অক্ষম করুন - গাঢ় মোড নেভিগেশন বার অস্বচ্ছ - গাঢ় মোড ন্যাভিগেশন বারটি অস্বচ্ছ বা স্বচ্ছ - - - ফ্লাইআউট মেনু - ফ্লাইআউট মেনুর আইটেম দেখান বা লুকান - - ক্যাপশন লুকান - ক্যাপশন মেনু লুকিয়ে রয়েছে - ক্যাপশন মেনু প্রদর্শিত হয়েছে - - আরও সেটিংস দেখুন লুকান - আরও সেটিংস দেখুন মেনু লুকিয়ে রয়েছে - আরও সেটিংস দেখুন মেনু প্রদর্শিত হয়েছে - - Sleep timer লুকান - Sleep timer মেনু লুকানো আছে - Sleep timer মেনু দেখানো হচ্ছে - - ভিডিও লুপ করুন লুকান - ভিডিও লুপ করুন মেনু লুকিয়ে রয়েছে - ভিডিও লুপ করুন মেনু প্রদর্শিত হয়েছে - - অ্যাম্বিয়েন্ট মোড লুকান - অ্যাম্বিয়েন্ট মোড মেনু লুকিয়ে রয়েছে - অ্যাম্বিয়েন্ট মোড মেনু প্রদর্শিত হয়েছে - Stable volume লুকান - Stable volume মেনু দেখানো হচ্ছে - Stable volume মেনু লুকানো আছে - - সাহায্য এবং ফিডব্যাক মেনু লুকান - সহায়তা ও প্রতিক্রিয়া মেনু লুকিয়ে রয়েছে - সহায়তা ও প্রতিক্রিয়া মেনু প্রদর্শিত হয়েছে - - প্লেব্যাকের স্পিড লুকান - প্লেব্যাকের স্পিড মেনু লুকিয়ে রয়েছে - প্লেব্যাকের স্পিড মেনু প্রদর্শিত হয়েছে - - লক স্ক্রীন লুকান - লক স্ক্রীন মেনু লুকানো আছে - লক স্ক্রিন মেনু দেখানো হয়েছে - - ইউটিউব মিউজিক দিয়ে শুনুন লুকান - ইউটিউব মিউজিক দিয়ে শুনুন মেনু লুকানো আছে - ইউটিউব মিউজিক দিয়ে শুনুন মেনু দেখানো আছে - - অডিও ট্র্যাক লুকান - অডিও ট্র্যাক মেনু লুকানো আছে - অডিও ট্র্যাক মেনু দেখানো হয় - + ক্যাপশন লুকান + ক্যাপশন মেনু লুকিয়ে রয়েছে + ক্যাপশন মেনু প্রদর্শিত হয়েছে + + আরও সেটিংস দেখুন লুকান + আরও সেটিংস দেখুন মেনু লুকিয়ে রয়েছে + আরও সেটিংস দেখুন মেনু প্রদর্শিত হয়েছে + + Sleep timer লুকান + Sleep timer মেনু লুকানো আছে + Sleep timer মেনু দেখানো হচ্ছে + + ভিডিও লুপ করুন লুকান + ভিডিও লুপ করুন মেনু লুকিয়ে রয়েছে + ভিডিও লুপ করুন মেনু প্রদর্শিত হয়েছে + + অ্যাম্বিয়েন্ট মোড লুকান + অ্যাম্বিয়েন্ট মোড মেনু লুকিয়ে রয়েছে + অ্যাম্বিয়েন্ট মোড মেনু প্রদর্শিত হয়েছে + Stable volume লুকান + Stable volume মেনু দেখানো হচ্ছে + Stable volume মেনু লুকানো আছে + + সাহায্য এবং ফিডব্যাক মেনু লুকান + সহায়তা ও প্রতিক্রিয়া মেনু লুকিয়ে রয়েছে + সহায়তা ও প্রতিক্রিয়া মেনু প্রদর্শিত হয়েছে + + প্লেব্যাকের স্পিড লুকান + প্লেব্যাকের স্পিড মেনু লুকিয়ে রয়েছে + প্লেব্যাকের স্পিড মেনু প্রদর্শিত হয়েছে + + লক স্ক্রীন লুকান + লক স্ক্রীন মেনু লুকানো আছে + লক স্ক্রিন মেনু দেখানো হয়েছে + + ইউটিউব মিউজিক দিয়ে শুনুন লুকান + ইউটিউব মিউজিক দিয়ে শুনুন মেনু লুকানো আছে + ইউটিউব মিউজিক দিয়ে শুনুন মেনু দেখানো আছে + + অডিও ট্র্যাক লুকান + অডিও ট্র্যাক মেনু লুকানো আছে + অডিও ট্র্যাক মেনু দেখানো হয় + - "অডিও ট্র্যাক মেনু লুকানো আছে + "অডিও ট্র্যাক মেনু লুকানো আছে অডিও ট্র্যাক মেনু দেখাতে, 'Spoof video streams' কে 'Android No SDK'-তে পরিবর্তন করুন।" - - ভিআর-এ ঘড়ি লুকান - ভিআর মেনুতে দেখুন লুকানো আছে - ভিআর মেনুতে দেখুন দেখানো হয়েছে - ভিডিও গুণমান মেনু লুকান - ভিডিও মানের মেনু লুকানো আছে - ভিডিও মানের মেনু দেখানো হয়েছে - ভিডিও গুণমান মেনুর ফুটার লুকান - ভিডিও গুণমান মেনু ফুটার লুকানো আছে - ভিডিও গুণমান মেনু ফুটার দেখানো হচ্ছে - - - অটোপ্লে বোতামটি লুকান - autoplay বোতাম লুকানো আছে - autoplay বোতাম দেখানো হচ্ছে - - ক্যাপশন বোতামটি লুকান - ক্যাপশন বোতাম লুকানো আছে - ক্যাপশন বোতাম দেখানো হচ্ছে - কাস্ট বোতামটি লুকান - কাস্ট বাটন লুকিয়ে রয়েছে - কাস্ট বাটন প্রদর্শিত হয়েছে - প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড লুকান - প্লেয়ার নিয়ন্ত্রণের পটভূমি লুকানো আছে - প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড দেখানো হয়েছে - পূর্ববর্তী লুকান & পরবর্তী বোতাম - বোতাম লুকানো হয় - বোতাম দেখানো হয় - - - শেষ স্ক্রীন কার্ড লুকান - শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে - শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে - - - ফুলস্ক্রিনে অ্যাম্বিয়েন্ট মোডটি অক্ষম করুন - অ্যাম্বিয়েন্ট মোড নিষ্ক্রিয় করা হয়েছে - অ্যাম্বিয়েন্ট মোড সক্রিয় করা হয়েছে - - - তথ্য কার্ড লুকান - তথ্য কার্ড লুকিয়ে রয়েছে - তথ্য কার্ড প্রদর্শিত হয়েছে - - - রোলিং নাম্বার অ্যানিমেশন নিষ্ক্রিয় করুন - রোলিং নাম্বার অ্যানিমেটেড নয় - রোলিং নাম্বার অ্যানিমেটেড - - - ভিডিও প্লেয়ারের সিকবার লুকান - ভিডিও প্লেয়ারে সিকবার লুকিয়ে রয়েছে - ভিডিও প্লেয়ারে সিকবার প্রদর্শিত হয়েছে - - ভিডিও থাম্বনেইল সিকবার লুকান - ভিডিও থাম্বনেইল সিকবার লুকানো আছে - ভিডিও থাম্বনেইল সিকবার দেখানো হয়েছে - - - Shorts প্লেয়ার - Shorts প্লেয়ারের উপাদান লুকান বা দেখান - - হোম ফিডে Shorts লুকান - হোম ফিড এবং সম্পর্কিত ভিডিওতে লুকানো আছে - হোম ফিড এবং সম্পর্কিত ভিডিওতে দেখানো হয়েছে - অনুসন্ধান ফলাফলে Shorts লুকান - অনুসন্ধান ফলাফলে লুকানো - সার্চ রেজাল্টে দেখানো হয়েছে - - সাবস্ক্রিপশনস ফিডে Shorts লুকান - সাবস্ক্রিপশনস ফিডে লুকানো আছে - সাবস্ক্রিপশনস ফিডে দেখানো হয়েছে - Shortsগুলিকে ওয়াচ ইতিহাসে লুকান - ওয়াচ হিস্ট্রিতে লুকানো - ওয়াচ ইতিহাসে দেখানো - \'স্বয়ংক্রিয়-ডাবড\' লেবেল লুকান - স্বয়ংক্রিয় ডাব করা লেবেল লুকানো হয়েছে - স্বয়ংক্রিয় ডাব করা লেবেল দেখা যাচ্ছে - \'সুপার থ্যাঙ্কস কিনুন\' বোতাম লুকান - সুপার থ্যাঙ্কস কিনুন বোতামটি লুকানো আছে - সুপার থ্যাঙ্কস কিনুন বোতামটি দেখানো হয়েছে - ইফেক্ট বোতাম লুকান - ইফেক্ট বাটন লুকানো আছে - ইফেক্ট বাটন দেখানো আছে - \'গ্রিন স্ক্রিন\' বোতাম লুকান - সবুজ পর্দা বোতাম লুকানো আছে - সবুজ পর্দা বোতাম দেখানো হচ্ছে - হ্যাশট্যাগ বোতাম লুকান - হ্যাশট্যাগ বোতাম লুকানো আছে - হ্যাশট্যাগ বোতাম দেখানো হচ্ছে - - সামিল হও বোতামটি লুকান - জয়েন করুন বোতাম লুকিয়ে রয়েছে - জয়েন করুন বোতাম প্রদর্শিত হয়েছে - সরাসরি পূর্বরূপ লুকান - লাইভ প্রিভিউ লুকানো আছে - লাইভ প্রিভিউ দেখানো হয়েছে - অবস্থান লেবেল লুকান - অবস্থান লেবেল লুকিয়ে রয়েছে - অবস্থান লেবেল প্রদর্শিত হয়েছে - \'নতুন পোস্ট\' বোতাম লুকান - নতুন পোস্ট বোতাম লুকানো হয়েছে - নতুন পোস্ট বোতাম দেখানো হয়েছে - থেমে থাকা ওভারলে বোতাম লুকান - থেমে থাকা ওভারলে বোতাম লুকিয়ে রয়েছে - থেমে থাকা ওভারলে বোতাম প্রদর্শিত হয়েছে - Preview comment লুকান - Preview comment লুকানো আছে - Preview comment দেখানো হয়েছে - \'মিউজিক সেভ করুন\' বোতাম লুকান - Save music বোতাম লুকানো আছে - Save music বোতাম দেখানো হচ্ছে - অনুসন্ধান পরামর্শগুলি লুকান - অনুসন্ধান পরামর্শগুলি লুকিয়ে রয়েছে - অনুসন্ধান পরামর্শগুলি প্রদর্শিত হয়েছে - শপ বোতামটি লুকান - কেনাকাটা বোতাম লুকিয়ে রয়েছে - কেনাকাটা বোতাম প্রদর্শিত হয়েছে - স্টিকার লুকান - স্টিকার লুকিয়ে রয়েছে - স্টিকার প্রদর্শিত হয়েছে - সাবস্ক্রাইব বোতামটি লুকান - সদস্যতা নিন বোতাম লুকিয়ে রয়েছে - সদস্যতা নিন বোতাম প্রদর্শিত হয়েছে - ট্যাগ করা প্রোডাক্টগুলি লুকান - ট্যাগ করা প্রোডাক্টগুলি লুকিয়ে রয়েছে - ট্যাগ করা প্রোডাক্টগুলি প্রদর্শিত হয়েছে - আসন্ন বোতামটি লুকান - আগামী বোতাম লুকানো আছে - আগামী বোতাম দেখানো হচ্ছে - \'এই সাউন্ড ব্যবহার করুন\' বোতাম লুকান - এই সাউন্ড বাটনটি লুকানো আছে - এই সাউন্ড বাটনটি দেখা যাচ্ছে - \'এই টেমপ্লেট ব্যবহার করুন\' বোতাম লুকান - এই টেমপ্লেট বাটনটি লুকানো আছে - \"এই টেমপ্লেট ব্যবহার করুন\" বোতামটি দেখানো হয়েছে - লাইক বোতাম ফাউন্টেন অ্যানিমেশনটি লুকান - পছন্দ বোতাম ঝর্ণা অ্যানিমেশন লুকিয়ে রয়েছে - পছন্দ বোতাম ঝর্ণা অ্যানিমেশন প্রদর্শিত হয়েছে - লাইক বোতামটি লুকান - পছন্দ বোতাম লুকিয়ে রয়েছে - পছন্দ বোতাম প্রদর্শিত হয়েছে - ডিসলাইক বোতামটি লুকান - অপছন্দ বোতাম লুকিয়ে রয়েছে - অপছন্দ বোতাম প্রদর্শিত হয়েছে - কমেন্টস বোতামটি লুকান - মন্তব্য বোতাম লুকিয়ে রয়েছে - মন্তব্য বোতাম প্রদর্শিত হয়েছে - - শেয়ার বোতামটি লুকান - শেয়ার করুন বোতাম লুকিয়ে রয়েছে - শেয়ার করুন বোতাম প্রদর্শিত হয়েছে - - রিমিক্স বোতামটি লুকান - রিমিক্স করুন বোতাম লুকিয়ে রয়েছে - রিমিক্স করুন বোতাম প্রদর্শিত হয়েছে - সাউন্ড বোতাম লুকান - সাউন্ড বোতাম লুকিয়ে রয়েছে - সাউন্ড বোতাম লুকান প্রদর্শিত হয়েছে - তথ্য প্যানেল লুকান - তথ্য প্যানেল লুকিয়ে রয়েছে - তথ্য প্যানেল প্রদর্শিত হয়েছে - চ্যানেল বার লুকান - চ্যানেল বার লুকিয়ে রয়েছে - চ্যানেল বার প্রদর্শিত হয়েছে - ভিডিওর শিরোনাম লুকান - ভিডিও শিরোনাম লুকানো আছে - ভিডিও শিরোনাম দেখানো হয়েছে - সাউন্ড মেটাডাটা লেবেল লুকান - সাউন্ড মেটাডেটা লেবেল লুকানো আছে - সাউন্ড মেটাডেটা লেবেল দেখানো হয়েছে - ভিডিও লিঙ্ক লেবেল লুকান - ভিডিও লিঙ্ক লেবেল লুকিয়ে রয়েছে - ভিডিও লিঙ্ক লেবেল প্রদর্শিত হয়েছে - নেভিগেশন বার লুকান - নেভিগেশন বার লুকিয়ে রয়েছে - পনেভিগেশন বার প্রদর্শিত হয়েছে - - - শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো হবে - "অটো প্লে বন্ধ থাকলে শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো থাকে + + ভিআর-এ ঘড়ি লুকান + ভিআর মেনুতে দেখুন লুকানো আছে + ভিআর মেনুতে দেখুন দেখানো হয়েছে + ভিডিও গুণমান মেনু লুকান + ভিডিও মানের মেনু লুকানো আছে + ভিডিও মানের মেনু দেখানো হয়েছে + ভিডিও গুণমান মেনুর ফুটার লুকান + ভিডিও গুণমান মেনু ফুটার লুকানো আছে + ভিডিও গুণমান মেনু ফুটার দেখানো হচ্ছে + + + অটোপ্লে বোতামটি লুকান + autoplay বোতাম লুকানো আছে + autoplay বোতাম দেখানো হচ্ছে + + ক্যাপশন বোতামটি লুকান + ক্যাপশন বোতাম লুকানো আছে + ক্যাপশন বোতাম দেখানো হচ্ছে + কাস্ট বোতামটি লুকান + কাস্ট বাটন লুকিয়ে রয়েছে + কাস্ট বাটন প্রদর্শিত হয়েছে + প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড লুকান + প্লেয়ার নিয়ন্ত্রণের পটভূমি লুকানো আছে + প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড দেখানো হয়েছে + পূর্ববর্তী লুকান & পরবর্তী বোতাম + বোতাম লুকানো হয় + বোতাম দেখানো হয় + + + শেষ স্ক্রীন কার্ড লুকান + শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে + শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে + + + ফুলস্ক্রিনে অ্যাম্বিয়েন্ট মোডটি অক্ষম করুন + অ্যাম্বিয়েন্ট মোড নিষ্ক্রিয় করা হয়েছে + অ্যাম্বিয়েন্ট মোড সক্রিয় করা হয়েছে + + + তথ্য কার্ড লুকান + তথ্য কার্ড লুকিয়ে রয়েছে + তথ্য কার্ড প্রদর্শিত হয়েছে + + + রোলিং নাম্বার অ্যানিমেশন নিষ্ক্রিয় করুন + রোলিং নাম্বার অ্যানিমেটেড নয় + রোলিং নাম্বার অ্যানিমেটেড + + + ভিডিও প্লেয়ারের সিকবার লুকান + ভিডিও প্লেয়ারে সিকবার লুকিয়ে রয়েছে + ভিডিও প্লেয়ারে সিকবার প্রদর্শিত হয়েছে + + ভিডিও থাম্বনেইল সিকবার লুকান + ভিডিও থাম্বনেইল সিকবার লুকানো আছে + ভিডিও থাম্বনেইল সিকবার দেখানো হয়েছে + + + Shorts প্লেয়ার + Shorts প্লেয়ারের উপাদান লুকান বা দেখান + + হোম ফিডে Shorts লুকান + হোম ফিড এবং সম্পর্কিত ভিডিওতে লুকানো আছে + হোম ফিড এবং সম্পর্কিত ভিডিওতে দেখানো হয়েছে + অনুসন্ধান ফলাফলে Shorts লুকান + অনুসন্ধান ফলাফলে লুকানো + সার্চ রেজাল্টে দেখানো হয়েছে + + সাবস্ক্রিপশনস ফিডে Shorts লুকান + সাবস্ক্রিপশনস ফিডে লুকানো আছে + সাবস্ক্রিপশনস ফিডে দেখানো হয়েছে + Shortsগুলিকে ওয়াচ ইতিহাসে লুকান + ওয়াচ হিস্ট্রিতে লুকানো + ওয়াচ ইতিহাসে দেখানো + \'স্বয়ংক্রিয়-ডাবড\' লেবেল লুকান + স্বয়ংক্রিয় ডাব করা লেবেল লুকানো হয়েছে + স্বয়ংক্রিয় ডাব করা লেবেল দেখা যাচ্ছে + \'সুপার থ্যাঙ্কস কিনুন\' বোতাম লুকান + সুপার থ্যাঙ্কস কিনুন বোতামটি লুকানো আছে + সুপার থ্যাঙ্কস কিনুন বোতামটি দেখানো হয়েছে + ইফেক্ট বোতাম লুকান + ইফেক্ট বাটন লুকানো আছে + ইফেক্ট বাটন দেখানো আছে + \'গ্রিন স্ক্রিন\' বোতাম লুকান + সবুজ পর্দা বোতাম লুকানো আছে + সবুজ পর্দা বোতাম দেখানো হচ্ছে + হ্যাশট্যাগ বোতাম লুকান + হ্যাশট্যাগ বোতাম লুকানো আছে + হ্যাশট্যাগ বোতাম দেখানো হচ্ছে + + সামিল হও বোতামটি লুকান + জয়েন করুন বোতাম লুকিয়ে রয়েছে + জয়েন করুন বোতাম প্রদর্শিত হয়েছে + সরাসরি পূর্বরূপ লুকান + লাইভ প্রিভিউ লুকানো আছে + লাইভ প্রিভিউ দেখানো হয়েছে + অবস্থান লেবেল লুকান + অবস্থান লেবেল লুকিয়ে রয়েছে + অবস্থান লেবেল প্রদর্শিত হয়েছে + \'নতুন পোস্ট\' বোতাম লুকান + নতুন পোস্ট বোতাম লুকানো হয়েছে + নতুন পোস্ট বোতাম দেখানো হয়েছে + থেমে থাকা ওভারলে বোতাম লুকান + থেমে থাকা ওভারলে বোতাম লুকিয়ে রয়েছে + থেমে থাকা ওভারলে বোতাম প্রদর্শিত হয়েছে + Preview comment লুকান + Preview comment লুকানো আছে + Preview comment দেখানো হয়েছে + \'মিউজিক সেভ করুন\' বোতাম লুকান + Save music বোতাম লুকানো আছে + Save music বোতাম দেখানো হচ্ছে + অনুসন্ধান পরামর্শগুলি লুকান + অনুসন্ধান পরামর্শগুলি লুকিয়ে রয়েছে + অনুসন্ধান পরামর্শগুলি প্রদর্শিত হয়েছে + শপ বোতামটি লুকান + কেনাকাটা বোতাম লুকিয়ে রয়েছে + কেনাকাটা বোতাম প্রদর্শিত হয়েছে + স্টিকার লুকান + স্টিকার লুকিয়ে রয়েছে + স্টিকার প্রদর্শিত হয়েছে + সাবস্ক্রাইব বোতামটি লুকান + সদস্যতা নিন বোতাম লুকিয়ে রয়েছে + সদস্যতা নিন বোতাম প্রদর্শিত হয়েছে + ট্যাগ করা প্রোডাক্টগুলি লুকান + ট্যাগ করা প্রোডাক্টগুলি লুকিয়ে রয়েছে + ট্যাগ করা প্রোডাক্টগুলি প্রদর্শিত হয়েছে + আসন্ন বোতামটি লুকান + আগামী বোতাম লুকানো আছে + আগামী বোতাম দেখানো হচ্ছে + \'এই সাউন্ড ব্যবহার করুন\' বোতাম লুকান + এই সাউন্ড বাটনটি লুকানো আছে + এই সাউন্ড বাটনটি দেখা যাচ্ছে + \'এই টেমপ্লেট ব্যবহার করুন\' বোতাম লুকান + এই টেমপ্লেট বাটনটি লুকানো আছে + \"এই টেমপ্লেট ব্যবহার করুন\" বোতামটি দেখানো হয়েছে + লাইক বোতাম ফাউন্টেন অ্যানিমেশনটি লুকান + পছন্দ বোতাম ঝর্ণা অ্যানিমেশন লুকিয়ে রয়েছে + পছন্দ বোতাম ঝর্ণা অ্যানিমেশন প্রদর্শিত হয়েছে + লাইক বোতামটি লুকান + পছন্দ বোতাম লুকিয়ে রয়েছে + পছন্দ বোতাম প্রদর্শিত হয়েছে + ডিসলাইক বোতামটি লুকান + অপছন্দ বোতাম লুকিয়ে রয়েছে + অপছন্দ বোতাম প্রদর্শিত হয়েছে + কমেন্টস বোতামটি লুকান + মন্তব্য বোতাম লুকিয়ে রয়েছে + মন্তব্য বোতাম প্রদর্শিত হয়েছে + + শেয়ার বোতামটি লুকান + শেয়ার করুন বোতাম লুকিয়ে রয়েছে + শেয়ার করুন বোতাম প্রদর্শিত হয়েছে + + রিমিক্স বোতামটি লুকান + রিমিক্স করুন বোতাম লুকিয়ে রয়েছে + রিমিক্স করুন বোতাম প্রদর্শিত হয়েছে + সাউন্ড বোতাম লুকান + সাউন্ড বোতাম লুকিয়ে রয়েছে + সাউন্ড বোতাম লুকান প্রদর্শিত হয়েছে + তথ্য প্যানেল লুকান + তথ্য প্যানেল লুকিয়ে রয়েছে + তথ্য প্যানেল প্রদর্শিত হয়েছে + চ্যানেল বার লুকান + চ্যানেল বার লুকিয়ে রয়েছে + চ্যানেল বার প্রদর্শিত হয়েছে + ভিডিওর শিরোনাম লুকান + ভিডিও শিরোনাম লুকানো আছে + ভিডিও শিরোনাম দেখানো হয়েছে + সাউন্ড মেটাডাটা লেবেল লুকান + সাউন্ড মেটাডেটা লেবেল লুকানো আছে + সাউন্ড মেটাডেটা লেবেল দেখানো হয়েছে + ভিডিও লিঙ্ক লেবেল লুকান + ভিডিও লিঙ্ক লেবেল লুকিয়ে রয়েছে + ভিডিও লিঙ্ক লেবেল প্রদর্শিত হয়েছে + নেভিগেশন বার লুকান + নেভিগেশন বার লুকিয়ে রয়েছে + পনেভিগেশন বার প্রদর্শিত হয়েছে + + + শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো হবে + "অটো প্লে বন্ধ থাকলে শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো থাকে YouTube সেটিংসে অটো প্লে পরিবর্তন করা যেতে পারে: সেটিংস → প্লেব্যাক → অটো প্লে পরবর্তী ভিডিও" - শেষ স্ক্রীনে প্রস্তাবিত ভিডিও দেখানো হয়েছে - - - সম্পর্কিত ভিডিও ওভারলে লুকান - ফুলস্ক্রিনে সম্পর্কিত ভিডিও ওভারলে লুকানো আছে - ফুলস্ক্রিনে সম্পর্কিত ভিডিও ওভারলে দেখানো হয়েছে - - - ভিডিওর সময়স্ট্যাম্প লুকান - সময়স্ট্যাম্প লুকিয়ে রয়েছে - সময়স্ট্যাম্প প্রদর্শিত হয়েছে - - - প্লেয়ার পপআপ প্যানেলগুলো লুকান - প্লেয়ার পপআপ প্যানেলগুলো লুকিয়ে রয়েছে - প্লেয়ার পপআপ প্যানেলগুলো প্রদর্শিত হয়েছে - - - ভিডিও শেষ হওয়ার সময় পূর্ণ পর্দা মোড থেকে বেরিয়ে যান - নিষ্ক্রিয় - আনুভূমিক - ল্যান্ডস্কেপ - আনুভূমিক এবং ল্যান্ডস্কেপ - - - পূর্ণ পর্দায় ভিডিও খুলুন - ভিডিও পূর্ণ পর্দায় খুলবে - ভিডিও পূর্ণ পর্দায় খুলবে না - - - প্লেয়ার ওভারলে অস্বচ্ছতা - অসচ্ছতা মান ০-১০০ এর মধ্যে, যেখানে ০ হল সম্পূর্ণ স্বচ্ছ - প্লেয়ার ওভারলে অস্বচ্ছতা অবশ্যই ০-১০০ এর মধ্যে হতে হবে - - - - অপছন্দ সাময়িকভাবে উপলভ্য নয় (API সময় শেষ হয়েছে) - অপছন্দ উপলভ্য নয় (অবস্থা %d) - অপছন্দগুলি উপলব্ধ নেই (ক্লায়েন্ট API সীমা) - অপছন্দ উপলভ্য নয় (%s) - - ReturnYouTubeDislike দিয়ে ভোট দিতে ভিডিও আবার লোড করুন - - মালিক কর্তৃক লুকানো - অপছন্দগুলো প্রদর্শিত হয়েছে - অপছন্দগুলো প্রদর্শিত হয়নি - Shorts এ অপছন্দ দেখান - "Shorts-এ অপছন্দগুলি দেখানো হয়েছে + শেষ স্ক্রীনে প্রস্তাবিত ভিডিও দেখানো হয়েছে + + + সম্পর্কিত ভিডিও ওভারলে লুকান + ফুলস্ক্রিনে সম্পর্কিত ভিডিও ওভারলে লুকানো আছে + ফুলস্ক্রিনে সম্পর্কিত ভিডিও ওভারলে দেখানো হয়েছে + + + ভিডিওর সময়স্ট্যাম্প লুকান + সময়স্ট্যাম্প লুকিয়ে রয়েছে + সময়স্ট্যাম্প প্রদর্শিত হয়েছে + + + প্লেয়ার পপআপ প্যানেলগুলো লুকান + প্লেয়ার পপআপ প্যানেলগুলো লুকিয়ে রয়েছে + প্লেয়ার পপআপ প্যানেলগুলো প্রদর্শিত হয়েছে + + + ভিডিও শেষ হওয়ার সময় পূর্ণ পর্দা মোড থেকে বেরিয়ে যান + নিষ্ক্রিয় + আনুভূমিক + ল্যান্ডস্কেপ + আনুভূমিক এবং ল্যান্ডস্কেপ + + + পূর্ণ পর্দায় ভিডিও খুলুন + ভিডিও পূর্ণ পর্দায় খুলবে + ভিডিও পূর্ণ পর্দায় খুলবে না + + + প্লেয়ার ওভারলে অস্বচ্ছতা + অসচ্ছতা মান ০-১০০ এর মধ্যে, যেখানে ০ হল সম্পূর্ণ স্বচ্ছ + প্লেয়ার ওভারলে অস্বচ্ছতা অবশ্যই ০-১০০ এর মধ্যে হতে হবে + + + + অপছন্দ সাময়িকভাবে উপলভ্য নয় (API সময় শেষ হয়েছে) + অপছন্দ উপলভ্য নয় (অবস্থা %d) + অপছন্দগুলি উপলব্ধ নেই (ক্লায়েন্ট API সীমা) + অপছন্দ উপলভ্য নয় (%s) + + ReturnYouTubeDislike দিয়ে ভোট দিতে ভিডিও আবার লোড করুন + + মালিক কর্তৃক লুকানো + অপছন্দগুলো প্রদর্শিত হয়েছে + অপছন্দগুলো প্রদর্শিত হয়নি + Shorts এ অপছন্দ দেখান + "Shorts-এ অপছন্দগুলি দেখানো হয়েছে সীমাবদ্ধতা: ছদ্মবেশী মোডে অপছন্দগুলি নাও দেখা যেতে পারে" - Shorts-এ অপছন্দগুলি দেখানো হয়নি - অপছন্দগুলো শতাংশ অনুযায়ী - অপছন্দগুলি শতাংশ হিসাবে দেখানো হয়েছে - অপছন্দগুলি একটি সংখ্যা হিসাবে দেখানো হয়েছে - - কম্প্যাক্ট লাইক বোতাম - পছন্দ বোতামটি ন্যূনতম প্রস্থের জন্য সাজানো হয়েছে - পছন্দ বোতামটি সেরা চেহারার জন্য সাজানো হয়েছে - অনুমানিত লাইক দেখান - পছন্দগুলি অক্ষম করা ভিডিওগুলি একটি আনুমানিক পছন্দের সংখ্যা দেখায় - আনুমানিক পছন্দগুলি দেখানো হয় না - API উপলভ্য না থাকলে একটি টোস্ট দেখান - Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে - Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে না - তথ্য প্রদান করা হয় Return YouTube Dislike API দ্বারা। আরও জানতে এখানে ট্যাপ করুন - - এই ডিভাইসের ReturnYouTubeDislike API পরিসংখ্যান - API প্রতিক্রিয়া সময়, স্বাভাবিক - API প্রতিক্রিয়া সময়, নূন্যতম - API প্রতিক্রিয়া সময়, সর্বোচ্চ - API প্রতিক্রিয়া সময়, পূর্বের ভিডিওর ন্যায় - অপছন্দগুলো সাময়িকভাবে উপলভ্য নয় - ক্লায়েন্ট API রেট লিমিট এর প্রভাব - API ভোট, কল সংখ্যা - কোন নেটওয়ার্ক কল তৈরি করা হয়নি - %d নেটওয়ার্ক কল তৈরি হয়েছে - এপিআই ভোট, টাইমআউটের সংখ্যা - কোন নেটওয়ার্ক কল সময় শেষ হয়নি - %d নেটওয়ার্ক কল সময় শেষ হয়েছে - API ক্লায়েন্ট রেট লিমিট - কোন ক্লায়েন্ট লিমিট এর সম্মুখীন হয়নি - %d বার ক্লায়েন্ট রেট লিমিট এর সম্মুখীন হয়েছে - %d মিলিসেকেন্ড - - - প্রশস্ত অনুসন্ধান বার সক্রিয় করুন - প্রশস্ত অনুসন্ধান বার সক্রিয় হয়েছে - প্রশস্ত অনুসন্ধান বার নিষ্ক্রিয় হয়েছে - - - উচ্চমানের থাম্বনেইল সক্ষম করুন - সিকবার থাম্বনেইল উচ্চমানের - সিকবার থাম্বনেইল মাঝারিমানের - "এটি সেই লাইভস্ট্রিমগুলিতে থাম্বনেইল পুনরুদ্ধার করবে যেখানে সিকবার থাম্বনেইল নেই। + Shorts-এ অপছন্দগুলি দেখানো হয়নি + অপছন্দগুলো শতাংশ অনুযায়ী + অপছন্দগুলি শতাংশ হিসাবে দেখানো হয়েছে + অপছন্দগুলি একটি সংখ্যা হিসাবে দেখানো হয়েছে + + কম্প্যাক্ট লাইক বোতাম + পছন্দ বোতামটি ন্যূনতম প্রস্থের জন্য সাজানো হয়েছে + পছন্দ বোতামটি সেরা চেহারার জন্য সাজানো হয়েছে + অনুমানিত লাইক দেখান + পছন্দগুলি অক্ষম করা ভিডিওগুলি একটি আনুমানিক পছন্দের সংখ্যা দেখায় + আনুমানিক পছন্দগুলি দেখানো হয় না + API উপলভ্য না থাকলে একটি টোস্ট দেখান + Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে + Return YouTube Dislike উপলভ্য না থাকলে টোস্ট দেখানো হবে না + তথ্য প্রদান করা হয় Return YouTube Dislike API দ্বারা। আরও জানতে এখানে ট্যাপ করুন + + এই ডিভাইসের ReturnYouTubeDislike API পরিসংখ্যান + API প্রতিক্রিয়া সময়, স্বাভাবিক + API প্রতিক্রিয়া সময়, নূন্যতম + API প্রতিক্রিয়া সময়, সর্বোচ্চ + API প্রতিক্রিয়া সময়, পূর্বের ভিডিওর ন্যায় + অপছন্দগুলো সাময়িকভাবে উপলভ্য নয় - ক্লায়েন্ট API রেট লিমিট এর প্রভাব + API ভোট, কল সংখ্যা + কোন নেটওয়ার্ক কল তৈরি করা হয়নি + %d নেটওয়ার্ক কল তৈরি হয়েছে + এপিআই ভোট, টাইমআউটের সংখ্যা + কোন নেটওয়ার্ক কল সময় শেষ হয়নি + %d নেটওয়ার্ক কল সময় শেষ হয়েছে + API ক্লায়েন্ট রেট লিমিট + কোন ক্লায়েন্ট লিমিট এর সম্মুখীন হয়নি + %d বার ক্লায়েন্ট রেট লিমিট এর সম্মুখীন হয়েছে + %d মিলিসেকেন্ড + + + প্রশস্ত অনুসন্ধান বার সক্রিয় করুন + প্রশস্ত অনুসন্ধান বার সক্রিয় হয়েছে + প্রশস্ত অনুসন্ধান বার নিষ্ক্রিয় হয়েছে + + + উচ্চমানের থাম্বনেইল সক্ষম করুন + সিকবার থাম্বনেইল উচ্চমানের + সিকবার থাম্বনেইল মাঝারিমানের + "এটি সেই লাইভস্ট্রিমগুলিতে থাম্বনেইল পুনরুদ্ধার করবে যেখানে সিকবার থাম্বনেইল নেই। সিকবার থাম্বনেইল বর্তমান ভিডিওর একই মান ব্যবহার করবে। এই বৈশিষ্ট্যটি 720p অথবা তার চেয়ে কম ভিডিও মান এবং খুব দ্রুত ইন্টারনেট সংযোগ ব্যবহার করার সময় সবচেয়ে ভালো কাজ করে।" - পুরোনো সিকবার থাম্বনেইল পুনরুদ্ধার করুন - সিকবার এর উপরে সিকবার থাম্বনেইল দেখানো হবে - পূর্ণস্ক্রীণে সিকবার থাম্বনেইল দেখানো হবে - - - SponsorBlock সক্রিয় করুন - SponsorBlock হল YouTube ভিডিওর বিরক্তিকর অংশগুলি স্কিপ করার জন্য একটি ক্রাউডসোর্সড সিস্টেম - রূপ - ভোটিং বাটন দেখান - সেগমেন্ট ভোটিং বাটন প্রদর্শিত রয়েছে - সেগমেন্ট ভোটিং বাটন প্রদর্শিত হয়নি - বর্গাকার লেআউট ব্যবহার করুন - বোতাম এবং নিয়ন্ত্রণগুলি বর্গক্ষেত্র - বোতাম এবং নিয়ন্ত্রণগুলি গোলাকার - - সংক্ষিপ্ত Skip বোতাম ব্যবহার করুন - স্কিপ বোতামটি ন্যূনতম প্রস্থের জন্য সাজানো হয়েছে - স্কিপ বোতামটি সেরা চেহারার জন্য সাজানো হয়েছে - Skip বোতামটি স্বয়ংক্রিয়ভাবে লুকান - কয়েক সেকেন্ড পরে স্কিপ বোতাম লুকিয়ে যায় - পুরো অংশের জন্য Skip বোতাম দেখানো হয়েছে - স্কিপ বোতামের সময়কাল - স্বয়ংক্রিয়ভাবে লুকানোর আগে এড়িয়ে যাওয়া এবং হাইলাইট করা বোতামগুলি কতক্ষণ দেখানো হবে - স্কিপ পূর্বাবস্থায় ফিরিয়ে আনার টোস্ট দেখান - যখন একটি সেগমেন্ট স্বয়ংক্রিয়ভাবে এড়িয়ে যাওয়া হয় তখন টোস্ট দেখানো হয়। স্কিপ পূর্বাবস্থায় ফিরিয়ে আনতে টোস্ট বিজ্ঞপ্তিতে ট্যাপ করুন - টোস্ট দেখানো হয়নি - টোস্ট এড়িয়ে যাওয়ার সময়কাল - এড়িয়ে যাওয়া বাতিল করার টোস্ট কতক্ষণ দেখানো হবে - ১ সেকেন্ড - ২ সেকেন্ড - ৩ সেকেন্ড - ৪ সেকেন্ড - ৫ সেকেন্ড - ৬ সেকেন্ড - ৭ সেকেন্ড - ৮ সেকেন্ড - ৯ সেকেন্ড - ১০ সেকেন্ড - সেগমেন্ট ছাড়া ভিডিওর দৈর্ঘ্য দেখান - ভিডিওর দৈর্ঘ্য থেকে সব অংশ বাদ দিয়ে সিকারবারে দেখানো হবে - সম্পূর্ণ ভিডিও দৈর্ঘ্য প্রদর্শিত হয়েছে - নতুন সেগমন্ট তৈরি হচ্ছে - নতুন বিভাগ তৈরি করুন বোতামটি দেখান - নতুন সেগমেন্ট তৈরির বাটন প্রদর্শিত হয়েছে - নতুন সেগমেন্ট তৈরির বাটন প্রদর্শিত হয়নি - নতুন সেগমেন্টের পদক্ষেপ সামঞ্জস্য করুন - নতুন সেগমেন্ট তৈরি করার সময় সময় সমন্বয় বাটন কত মিলিসেকেন্ড পরিবর্তন করে - মানটি অবশ্যই একটি ধনাত্মক সংখ্যা হতে হবে - নির্দেশিকা দেখুন - নির্দেশিকাতে সেগমেন্ট জমা দেওয়ার বিষয়ে টিপস এবং নিয়ম রয়েছে - নির্দেশিকা অনুসরণ করুন - কোন সেগমেন্ট জমা দেয়ার আগে SponsorBlock নির্দেশিকা পড়ার পরামর্শ দেয়া হয় - ইতোমধ্যে পড়া হয়েছে - আমাকে দেখান - সাধারণ - API উপলভ্য না থাকলে একটি টোস্ট দেখান - SponsorBlock উপলভ্য না হলে টোস্ট দেখানো হয় - SponsorBlock উপলভ্য না হলে টোস্ট দেখানো হয় না - স্কিপ কাউন্ট ট্র্যাকিং সক্রিয় করুন - SponsorBlock লিডারবোর্ডে জানান যে কত সময় সংরক্ষিত হয়েছে। সেগমেন্ট স্কিপ করা হলে লিডারবোর্ডে একটি বার্তা প্রেরণ করা হয় - স্কিপ কাউন্ট ট্র্যাকিং সক্রিয় হয়নি - ন্যূনতম সেগমেন্ট সময়কাল - এই মান (সেকেন্ড) হতে কম দৈর্ঘ্যের সেগমেন্ট প্রদর্শিত বা স্কিপ করা হবে না - অবৈধ সময়কাল - আপনার ব্যক্তিগত ব্যবহারকারী আইডি - এটি গোপন রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে শেয়ার করা উচিত নয়। যদি কারও কাছে এটি থাকে, তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে - ব্যক্তিগত ব্যবহাকারী আইডি অবশ্যই ৩০ অক্ষর লম্বা হতে হবে - API URL পরিবর্তন করুন - এই ঠিকানা ব্যবহার করে SponsorBlock সার্ভারের সাথে যুক্ত হতে কল করে - API URL আবার সেট করুন - API URL টি ভুল - API URL পরিবর্তন হয়েছে - সেটিং আমদানি/রপ্তানি - অনুলিপি করুন - আপনার SponsorBlock JSON কনফিগারেশন যা ReVanced বা অন্য কোন SponsorBlock প্ল্যাটফর্মে আমদানি/রপ্তানি করা যাবে - এটি আপনার একটি SponsorBlock JSON কনফিগারেশন যা ReVanced এবং অন্যান্য SponsorBlock প্ল্যাটফর্মে ইমপোর্ট / এক্সপোর্ট করা যেতে পারে। এটিতে আপনার ব্যক্তিগত ব্যবহারকারী আইডিও রয়েছে। এটি কোথাও শেয়ার করার সময় বিবেচনা করে করবেন - সেটিং সফলভাবে আমদানি করা হয়েছে - %s আমদানি করতে ব্যর্থ হয়েছে - %s রপ্তানি করতে ব্যর্থ হয়েছে - "আপনার সেটিংসে একটি ব্যক্তিগত SponsorBlock ব্যবহারকারী ID রয়েছে। + পুরোনো সিকবার থাম্বনেইল পুনরুদ্ধার করুন + সিকবার এর উপরে সিকবার থাম্বনেইল দেখানো হবে + পূর্ণস্ক্রীণে সিকবার থাম্বনেইল দেখানো হবে + + + SponsorBlock সক্রিয় করুন + SponsorBlock হল YouTube ভিডিওর বিরক্তিকর অংশগুলি স্কিপ করার জন্য একটি ক্রাউডসোর্সড সিস্টেম + রূপ + ভোটিং বাটন দেখান + সেগমেন্ট ভোটিং বাটন প্রদর্শিত রয়েছে + সেগমেন্ট ভোটিং বাটন প্রদর্শিত হয়নি + বর্গাকার লেআউট ব্যবহার করুন + বোতাম এবং নিয়ন্ত্রণগুলি বর্গক্ষেত্র + বোতাম এবং নিয়ন্ত্রণগুলি গোলাকার + + সংক্ষিপ্ত Skip বোতাম ব্যবহার করুন + স্কিপ বোতামটি ন্যূনতম প্রস্থের জন্য সাজানো হয়েছে + স্কিপ বোতামটি সেরা চেহারার জন্য সাজানো হয়েছে + Skip বোতামটি স্বয়ংক্রিয়ভাবে লুকান + কয়েক সেকেন্ড পরে স্কিপ বোতাম লুকিয়ে যায় + পুরো অংশের জন্য Skip বোতাম দেখানো হয়েছে + স্কিপ বোতামের সময়কাল + স্বয়ংক্রিয়ভাবে লুকানোর আগে এড়িয়ে যাওয়া এবং হাইলাইট করা বোতামগুলি কতক্ষণ দেখানো হবে + স্কিপ পূর্বাবস্থায় ফিরিয়ে আনার টোস্ট দেখান + যখন একটি সেগমেন্ট স্বয়ংক্রিয়ভাবে এড়িয়ে যাওয়া হয় তখন টোস্ট দেখানো হয়। স্কিপ পূর্বাবস্থায় ফিরিয়ে আনতে টোস্ট বিজ্ঞপ্তিতে ট্যাপ করুন + টোস্ট দেখানো হয়নি + টোস্ট এড়িয়ে যাওয়ার সময়কাল + এড়িয়ে যাওয়া বাতিল করার টোস্ট কতক্ষণ দেখানো হবে + ১ সেকেন্ড + ২ সেকেন্ড + ৩ সেকেন্ড + ৪ সেকেন্ড + ৫ সেকেন্ড + ৬ সেকেন্ড + ৭ সেকেন্ড + ৮ সেকেন্ড + ৯ সেকেন্ড + ১০ সেকেন্ড + সেগমেন্ট ছাড়া ভিডিওর দৈর্ঘ্য দেখান + ভিডিওর দৈর্ঘ্য থেকে সব অংশ বাদ দিয়ে সিকারবারে দেখানো হবে + সম্পূর্ণ ভিডিও দৈর্ঘ্য প্রদর্শিত হয়েছে + নতুন সেগমন্ট তৈরি হচ্ছে + নতুন বিভাগ তৈরি করুন বোতামটি দেখান + নতুন সেগমেন্ট তৈরির বাটন প্রদর্শিত হয়েছে + নতুন সেগমেন্ট তৈরির বাটন প্রদর্শিত হয়নি + নতুন সেগমেন্টের পদক্ষেপ সামঞ্জস্য করুন + নতুন সেগমেন্ট তৈরি করার সময় সময় সমন্বয় বাটন কত মিলিসেকেন্ড পরিবর্তন করে + মানটি অবশ্যই একটি ধনাত্মক সংখ্যা হতে হবে + নির্দেশিকা দেখুন + নির্দেশিকাতে সেগমেন্ট জমা দেওয়ার বিষয়ে টিপস এবং নিয়ম রয়েছে + নির্দেশিকা অনুসরণ করুন + কোন সেগমেন্ট জমা দেয়ার আগে SponsorBlock নির্দেশিকা পড়ার পরামর্শ দেয়া হয় + ইতোমধ্যে পড়া হয়েছে + আমাকে দেখান + সাধারণ + API উপলভ্য না থাকলে একটি টোস্ট দেখান + SponsorBlock উপলভ্য না হলে টোস্ট দেখানো হয় + SponsorBlock উপলভ্য না হলে টোস্ট দেখানো হয় না + স্কিপ কাউন্ট ট্র্যাকিং সক্রিয় করুন + SponsorBlock লিডারবোর্ডে জানান যে কত সময় সংরক্ষিত হয়েছে। সেগমেন্ট স্কিপ করা হলে লিডারবোর্ডে একটি বার্তা প্রেরণ করা হয় + স্কিপ কাউন্ট ট্র্যাকিং সক্রিয় হয়নি + ন্যূনতম সেগমেন্ট সময়কাল + এই মান (সেকেন্ড) হতে কম দৈর্ঘ্যের সেগমেন্ট প্রদর্শিত বা স্কিপ করা হবে না + অবৈধ সময়কাল + আপনার ব্যক্তিগত ব্যবহারকারী আইডি + এটি গোপন রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে শেয়ার করা উচিত নয়। যদি কারও কাছে এটি থাকে, তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে + ব্যক্তিগত ব্যবহাকারী আইডি অবশ্যই ৩০ অক্ষর লম্বা হতে হবে + API URL পরিবর্তন করুন + এই ঠিকানা ব্যবহার করে SponsorBlock সার্ভারের সাথে যুক্ত হতে কল করে + API URL আবার সেট করুন + API URL টি ভুল + API URL পরিবর্তন হয়েছে + সেটিং আমদানি/রপ্তানি + অনুলিপি করুন + আপনার SponsorBlock JSON কনফিগারেশন যা ReVanced বা অন্য কোন SponsorBlock প্ল্যাটফর্মে আমদানি/রপ্তানি করা যাবে + এটি আপনার একটি SponsorBlock JSON কনফিগারেশন যা ReVanced এবং অন্যান্য SponsorBlock প্ল্যাটফর্মে ইমপোর্ট / এক্সপোর্ট করা যেতে পারে। এটিতে আপনার ব্যক্তিগত ব্যবহারকারী আইডিও রয়েছে। এটি কোথাও শেয়ার করার সময় বিবেচনা করে করবেন + সেটিং সফলভাবে আমদানি করা হয়েছে + %s আমদানি করতে ব্যর্থ হয়েছে + %s রপ্তানি করতে ব্যর্থ হয়েছে + "আপনার সেটিংসে একটি ব্যক্তিগত SponsorBlock ব্যবহারকারী ID রয়েছে। আপনার ব্যবহারকারী ID একটি পাসওয়ার্ডের মতো এবং এটি কখনও ভাগ করা উচিত নয়।" - আবার দেখাবেন না - সেগমেন্ট আচরণ পরিবর্তন করুন - স্পন্সর - পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়। - বিনা অর্থপ্রাপ্ত/স্ব-প্রচার - অর্থপ্রদান না করা বা নিজের প্রচার ছাড়া স্পনসরের মতো। পণ্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কিত বিভাগ অন্তর্ভুক্ত করে - কথোপথন অনুস্মারক (সাবস্ক্রাইব) - যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত - লক্ষণীয় করা - ভিডিওর অংশ যা বেশিরবাগ মানুষই দেখছে - অন্তর্বর্তীকরণ/পরিচয় বিভাগের অ্যানিমেশন - প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয় - এন্ডকার্ডস / কৃতজ্ঞতা স্বীকার - ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয় - হুক / শুভেচ্ছা - আসন্ন ভিডিওর জন্য বর্ণিত ট্রেলার, শুভেচ্ছা এবং বিদায়। এমন অংশগুলি অন্তর্ভুক্ত নয় যা অতিরিক্ত সামগ্রী যোগ করে। - পূর্বরূপ / সারসংক্ষেপ - একটি সমষ্টি ক্লিপ সমূহ যা ভিডিওতে এসে যা হচ্ছে বা অন্য ভিডিও সিরিজে ঘটেছে সেগুলি দেখায় যেখানে সমস্ত তথ্য অন্যত্র পুনরাবৃত্তি করা হয় - অপ্রাসঙ্গিক / কৌতুক - পার্শ্বীয় দৃশ্য বা কৌতুক যা ভিডিওর মূল বিষয়বস্তু বোঝার জন্য অপরিহার্য নয়। প্রসঙ্গ বা পটভূমি বিশদ প্রদানকারী অংশগুলি অন্তর্ভুক্ত নয়। - সঙ্গীত: সঙ্গীতবিহীন অংশ - শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়। - এড়িয়ে যান - লক্ষণীয় করা - স্পন্সর এড়িয়ে যান - প্রচারণা এড়িয়ে যান - ইন্টারঅ্যাক্ট এড়িয়ে যান - গুরুত্বপূর্ণ অংশে এড়িয়ে যান - সূচনা এড়িয়ে যান - উপসংহার এড়িয়ে যান - উপসংহার এড়িয়ে যান - শেষ অংশ এড়িয়ে যান - হুক এড়িয়ে যান - প্রিভিউ এড়িয়ে যান - প্রিভিউ এড়িয়ে যান - সংক্ষিপ্তবৃত্তি এড়িয়ে যান - প্রাসঙ্গিকতা এড়িয়ে যান - সঙ্গীত-বিহীন অংশ এড়িয়ে যান - সেগমেন্ট এড়িয়ে যান - স্পন্সর এড়িয়ে গেছে - স্ব-প্রচার এড়িয়ে গেছে - বিরক্তিকর অনুস্মারক এড়িয়ে গেছে - গুরুত্বপূর্ণ অংশে এড়িয়ে গেছে - সূচনা এড়িয়ে গেছে - উপসংহার এড়িয়ে গেছে - উপসংহার এড়িয়ে গেছে - শেষ অংশ এড়িয়ে গেছে - হুক এড়িয়ে যাওয়া হয়েছে - প্রাকদর্শন এড়িয়ে গেছে - প্রাকদর্শন এড়িয়ে গেছে - সংক্ষিপ্তবৃত্তি এড়িয়ে গেছে - প্রাসঙ্গিকতা এড়িয়ে যাওয়া হয়েছে - একটি সঙ্গীতবিহীন অংশ এড়িয়ে গেছে - জমা না হওয়া সেগমেন্ট এড়িয়ে গেছে - একটানা একাধিক সেগমেন্ট এড়িয়ে গেছে - স্বয়ংক্রিয়ভাবে এড়িয়ে যান - একবার স্বয়ংক্রিয়ভাবে এড়িয়ে যান - একটি Skip বোতাম দেখান - সিকবারে দেখান - নিষ্ক্রিয় করুন - %s সেগমেন্ট জমা দিতে সক্ষম হয়নি - SponsorBlock সাময়িকভাবে বন্ধ আছে - সেগমেন্ট জমা দিতে সক্ষম হয়নি (অবস্থা: %1$d %2$s) - সেগমেন্ট জমা দিতে পারছি না। হার সীমাবদ্ধ (একই ব্যবহারকারী বা IP থেকে খুব বেশি)। - সেগমেন্ট জমা করা যাবে না: %s - "সেগমেন্ট জমা দিতে পারছি না। + আবার দেখাবেন না + সেগমেন্ট আচরণ পরিবর্তন করুন + স্পন্সর + পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়। + বিনা অর্থপ্রাপ্ত/স্ব-প্রচার + অর্থপ্রদান না করা বা নিজের প্রচার ছাড়া স্পনসরের মতো। পণ্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কিত বিভাগ অন্তর্ভুক্ত করে + কথোপথন অনুস্মারক (সাবস্ক্রাইব) + যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত + লক্ষণীয় করা + ভিডিওর অংশ যা বেশিরবাগ মানুষই দেখছে + অন্তর্বর্তীকরণ/পরিচয় বিভাগের অ্যানিমেশন + প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয় + এন্ডকার্ডস / কৃতজ্ঞতা স্বীকার + ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয় + হুক / শুভেচ্ছা + আসন্ন ভিডিওর জন্য বর্ণিত ট্রেলার, শুভেচ্ছা এবং বিদায়। এমন অংশগুলি অন্তর্ভুক্ত নয় যা অতিরিক্ত সামগ্রী যোগ করে। + পূর্বরূপ / সারসংক্ষেপ + একটি সমষ্টি ক্লিপ সমূহ যা ভিডিওতে এসে যা হচ্ছে বা অন্য ভিডিও সিরিজে ঘটেছে সেগুলি দেখায় যেখানে সমস্ত তথ্য অন্যত্র পুনরাবৃত্তি করা হয় + অপ্রাসঙ্গিক / কৌতুক + পার্শ্বীয় দৃশ্য বা কৌতুক যা ভিডিওর মূল বিষয়বস্তু বোঝার জন্য অপরিহার্য নয়। প্রসঙ্গ বা পটভূমি বিশদ প্রদানকারী অংশগুলি অন্তর্ভুক্ত নয়। + সঙ্গীত: সঙ্গীতবিহীন অংশ + শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়। + এড়িয়ে যান + লক্ষণীয় করা + স্পন্সর এড়িয়ে যান + প্রচারণা এড়িয়ে যান + ইন্টারঅ্যাক্ট এড়িয়ে যান + গুরুত্বপূর্ণ অংশে এড়িয়ে যান + সূচনা এড়িয়ে যান + উপসংহার এড়িয়ে যান + উপসংহার এড়িয়ে যান + শেষ অংশ এড়িয়ে যান + হুক এড়িয়ে যান + প্রিভিউ এড়িয়ে যান + প্রিভিউ এড়িয়ে যান + সংক্ষিপ্তবৃত্তি এড়িয়ে যান + প্রাসঙ্গিকতা এড়িয়ে যান + সঙ্গীত-বিহীন অংশ এড়িয়ে যান + সেগমেন্ট এড়িয়ে যান + স্পন্সর এড়িয়ে গেছে + স্ব-প্রচার এড়িয়ে গেছে + বিরক্তিকর অনুস্মারক এড়িয়ে গেছে + গুরুত্বপূর্ণ অংশে এড়িয়ে গেছে + সূচনা এড়িয়ে গেছে + উপসংহার এড়িয়ে গেছে + উপসংহার এড়িয়ে গেছে + শেষ অংশ এড়িয়ে গেছে + হুক এড়িয়ে যাওয়া হয়েছে + প্রাকদর্শন এড়িয়ে গেছে + প্রাকদর্শন এড়িয়ে গেছে + সংক্ষিপ্তবৃত্তি এড়িয়ে গেছে + প্রাসঙ্গিকতা এড়িয়ে যাওয়া হয়েছে + একটি সঙ্গীতবিহীন অংশ এড়িয়ে গেছে + জমা না হওয়া সেগমেন্ট এড়িয়ে গেছে + একটানা একাধিক সেগমেন্ট এড়িয়ে গেছে + স্বয়ংক্রিয়ভাবে এড়িয়ে যান + একবার স্বয়ংক্রিয়ভাবে এড়িয়ে যান + একটি Skip বোতাম দেখান + সিকবারে দেখান + নিষ্ক্রিয় করুন + %s সেগমেন্ট জমা দিতে সক্ষম হয়নি + SponsorBlock সাময়িকভাবে বন্ধ আছে + সেগমেন্ট জমা দিতে সক্ষম হয়নি (অবস্থা: %1$d %2$s) + সেগমেন্ট জমা দিতে পারছি না। হার সীমাবদ্ধ (একই ব্যবহারকারী বা IP থেকে খুব বেশি)। + সেগমেন্ট জমা করা যাবে না: %s + "সেগমেন্ট জমা দিতে পারছি না। পূর্বেই বিদ্যমান" - সেগমেন্ট সফলভাবে জমা হয়েছে - - SponsorBlock সাময়িকভাবে উপলভ্য নয় (API সময় শেষ হয়েছে) - SponsorBlock সাময়িকভাবে উপলভ্য নয় (অবস্থা %d) - SponsorBlock সাময়িকভাবে উপলভ্য নয় - সেগমেন্ট এর জন্য ভোট করা সম্ভব হয়নি (API সময় শেষ) - সেগমেন্টের জন্য ভোট সম্ভব নয় (অবস্থা: %1$d %2$s) - সেগমেন্টের জন্য ভোট দেয়া সম্ভব নয়: %s - আপ ভোট - ডাউন ভোট - বিভাগ পরিবর্তন করুন - ভোট দেয়ার জন্য আর কোন সেগমেন্ট নেই - - %1$s থেকে %2$s - সেগমেন্টের বিভাগ নির্বাচন করুন - সেটিং থেকে বিভাগ নিস্ক্রিয় করা হয়েছে। জমা দিতে বিভাগ সক্রিয় করুন। - নতুন স্পন্সরব্লক সেগমেন্ট - %s কে নতুন সেগমেন্টের শুরু অথবা শেষ হিসেবে সেট করুন? - শুরু - শেষ - এখন - সেগমেন্টটি শুরু হওয়ার সময় - সেগমেন্টটি শেষ হওয়ার সময় - সময়কাল কি সঠিক? - "সেগমেন্টটি + সেগমেন্ট সফলভাবে জমা হয়েছে + + SponsorBlock সাময়িকভাবে উপলভ্য নয় (API সময় শেষ হয়েছে) + SponsorBlock সাময়িকভাবে উপলভ্য নয় (অবস্থা %d) + SponsorBlock সাময়িকভাবে উপলভ্য নয় + সেগমেন্ট এর জন্য ভোট করা সম্ভব হয়নি (API সময় শেষ) + সেগমেন্টের জন্য ভোট সম্ভব নয় (অবস্থা: %1$d %2$s) + সেগমেন্টের জন্য ভোট দেয়া সম্ভব নয়: %s + আপ ভোট + ডাউন ভোট + বিভাগ পরিবর্তন করুন + ভোট দেয়ার জন্য আর কোন সেগমেন্ট নেই + + %1$s থেকে %2$s + সেগমেন্টের বিভাগ নির্বাচন করুন + সেটিং থেকে বিভাগ নিস্ক্রিয় করা হয়েছে। জমা দিতে বিভাগ সক্রিয় করুন। + নতুন স্পন্সরব্লক সেগমেন্ট + %s কে নতুন সেগমেন্টের শুরু অথবা শেষ হিসেবে সেট করুন? + শুরু + শেষ + এখন + সেগমেন্টটি শুরু হওয়ার সময় + সেগমেন্টটি শেষ হওয়ার সময় + সময়কাল কি সঠিক? + "সেগমেন্টটি %1$s থেকে @@ -1277,46 +1276,46 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন (%3$s) জমা দিতে প্রস্তুত।" - শুরু অবশ্যই শেষের আগে হতে হবে - আগে সময় বারে দুটি অবস্থান চিহ্নিত করুন - সেগমেন্টটি পূর্বরূপ দেখুন এবং নিশ্চিত হোন যে এটি মসৃণভাবে এড়িয়ে যাচ্ছে - সেগমেন্টের সময় ম্যানুয়ালি সম্পাদনা করুন - আপনি কি সেগমেন্টের শুরু বা শেষের সময় সম্পাদনা করতে চান? - ভুল সময় দেয়া হয়েছে - পরিসংখ্যান - - পরিসংখ্যান সাময়িকভাবে উপলব্ধ নেই (API ডাউন) - লোড হচ্ছে... - SponsorBlock নিস্ক্রিয় হয়েছে - আপনার ব্যবহারকারী নাম: <b>%s</b> - আপনার ব্যবহারকারী নাম পরিবর্তন করতে ট্যাপ করুন - ব্যবহারকারীর নাম পরিবর্তন সফল হয়নি: অবস্থা: %1$d %2$s - ব্যবহারকারীর নাম সফলভাবে পরিবর্তন হয়েছে - আপনার রিপুটেশন হল <b>%.2f</b> - আপনি <b>%s</b> সেগমেন্ট তৈরি করেছেন - আপনার সেগমেন্ট দেখতে এখানে ট্যাপ করুন - SponsorBlock লিডারবোর্ড - আপনি মানুষকে <b>%s</b> সেগমেন্ট থেকে বাঁচিয়েছেন - বৈশ্বিক পরিসংখ্যান এবং শীর্ষ অবদানকারীদের দেখতে এখানে ট্যাপ করুন - এটি তাদের জীবনের <b>%s</b> সময়।<br> লিডারবোর্ড দেখতে ট্যাপ করুন - আপনি <b>%s</b> সেগমেন্ট এড়িয়ে গেছেন - তাহলো <b>%s</b> - এড়িয়ে যাওয়া করা সেগমেন্টের হিসাব রাখা আবার সেট করতে চান? - %1$s ঘন্টা %2$s মিনিট - %1$s মিনিট %2$s সেকেন্ড - %s সেকেন্ড - স্বচ্ছতা: - রং: - সম্পর্কিত - ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন - - - লেআউট ফর্ম ফ্যাক্টর - ডিফল্ট - ফোন - ট্যাবলেট - স্বয়ংচালিত - "পরিবর্তনগুলির মধ্যে রয়েছে: + শুরু অবশ্যই শেষের আগে হতে হবে + আগে সময় বারে দুটি অবস্থান চিহ্নিত করুন + সেগমেন্টটি পূর্বরূপ দেখুন এবং নিশ্চিত হোন যে এটি মসৃণভাবে এড়িয়ে যাচ্ছে + সেগমেন্টের সময় ম্যানুয়ালি সম্পাদনা করুন + আপনি কি সেগমেন্টের শুরু বা শেষের সময় সম্পাদনা করতে চান? + ভুল সময় দেয়া হয়েছে + পরিসংখ্যান + + পরিসংখ্যান সাময়িকভাবে উপলব্ধ নেই (API ডাউন) + লোড হচ্ছে... + SponsorBlock নিস্ক্রিয় হয়েছে + আপনার ব্যবহারকারী নাম: <b>%s</b> + আপনার ব্যবহারকারী নাম পরিবর্তন করতে ট্যাপ করুন + ব্যবহারকারীর নাম পরিবর্তন সফল হয়নি: অবস্থা: %1$d %2$s + ব্যবহারকারীর নাম সফলভাবে পরিবর্তন হয়েছে + আপনার রিপুটেশন হল <b>%.2f</b> + আপনি <b>%s</b> সেগমেন্ট তৈরি করেছেন + আপনার সেগমেন্ট দেখতে এখানে ট্যাপ করুন + SponsorBlock লিডারবোর্ড + আপনি মানুষকে <b>%s</b> সেগমেন্ট থেকে বাঁচিয়েছেন + বৈশ্বিক পরিসংখ্যান এবং শীর্ষ অবদানকারীদের দেখতে এখানে ট্যাপ করুন + এটি তাদের জীবনের <b>%s</b> সময়।<br> লিডারবোর্ড দেখতে ট্যাপ করুন + আপনি <b>%s</b> সেগমেন্ট এড়িয়ে গেছেন + তাহলো <b>%s</b> + এড়িয়ে যাওয়া করা সেগমেন্টের হিসাব রাখা আবার সেট করতে চান? + %1$s ঘন্টা %2$s মিনিট + %1$s মিনিট %2$s সেকেন্ড + %s সেকেন্ড + স্বচ্ছতা: + রং: + সম্পর্কিত + ডেটা SponsorBlock API দ্বারা সরবরাহ করা হয়। আরও জানতে এবং অন্যান্য প্ল্যাটফর্মের ডাউনলোড দেখতে এখানে ট্যাপ করুন + + + লেআউট ফর্ম ফ্যাক্টর + ডিফল্ট + ফোন + ট্যাবলেট + স্বয়ংচালিত + "পরিবর্তনগুলির মধ্যে রয়েছে: ট্যাবলেট লেআউট • কমিউনিটির পোস্টগুলি লুকানো আছে @@ -1324,314 +1323,312 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন অটোমোটিভ লেআউট • Shorts নিয়মিত প্লেয়ারে খোলে • ফিড বিষয় এবং চ্যানেল দ্বারা সংগঠিত" - - - অ্যাপ সংস্করণ স্পুফ করুন - সংস্করণ স্পুফ করা হয়েছে - সংস্করণ স্পুফ করা হয়নি - "অ্যাপ্লিকেশন সংস্করণটি YouTube-এর পুরনো সংস্করণে ভুয়া হবে। + + + অ্যাপ সংস্করণ স্পুফ করুন + সংস্করণ স্পুফ করা হয়েছে + সংস্করণ স্পুফ করা হয়নি + "অ্যাপ্লিকেশন সংস্করণটি YouTube-এর পুরনো সংস্করণে ভুয়া হবে। এটি অ্যাপ্লিকেশনটির চেহারা এবং বৈশিষ্ট্য পরিবর্তন করবে, তবে অজানা পার্শ্ব প্রতিক্রিয়া হতে পারে। পরে যদি বন্ধ করা হয়, UI বাগ এড়াতে অ্যাপ্লিকেশন ডেটা পরিষ্কার করার পরামর্শ দেওয়া হয়।" - স্পুফ অ্যাপ সংস্করণ লক্ষ্য - 20.13.41 - প্রসারিত নয় এমন ভিডিও অ্যাকশন বার পুনরুদ্ধার করুন - 20.05.46 - প্রতিলিপি কার্যকারিতা পুনরুদ্ধার করুন - 19.35.36 - পুরনো Shorts প্লেয়ার আইকন পুনরুদ্ধার করুন - 19.01.34 - পুরনো নেভিগেশন আইকন পুনরুদ্ধার করুন - - - শুরুর পৃষ্ঠা পরিবর্তন করুন - পূর্ব-নির্ধারিত - অন্য়াসব রভর্বাশার চিয়ুট - চ্যানেল ব্রাউজ করুন - কোর্সু চবুভায় চা চেরারুকে - ঘুরে দেখুন - แฟชั่น & ความงาม - গেমিং - ইতিহাস - লাইব্রেরি - পছন্দ করা ভিডিওগুলি - লাইভ - মুভি - সঙ্গীত - প্রাষুগ - নোটিস্য়াসেগ - চ্লাস ন৊টিস্য়াসেগ - অনুসন্ধান - শোপিংগ - খেলাধুলা - সদস্যতা - এখন জনপ্রিয় - বির্চুভ্য়াল টিএলিটি - পরে দেখুন - আপ্নার কলিপ - সর্বদা শুরুর পৃষ্ঠা পরিবর্তন করুন - "শুরুর পৃষ্ঠা সবসময় পরিবর্তিত হয় + স্পুফ অ্যাপ সংস্করণ লক্ষ্য + 20.13.41 - প্রসারিত নয় এমন ভিডিও অ্যাকশন বার পুনরুদ্ধার করুন + 20.05.46 - প্রতিলিপি কার্যকারিতা পুনরুদ্ধার করুন + 19.35.36 - পুরনো Shorts প্লেয়ার আইকন পুনরুদ্ধার করুন + 19.01.34 - পুরনো নেভিগেশন আইকন পুনরুদ্ধার করুন + + + শুরুর পৃষ্ঠা পরিবর্তন করুন + পূর্ব-নির্ধারিত + অন্য়াসব রভর্বাশার চিয়ুট + চ্যানেল ব্রাউজ করুন + কোর্সু চবুভায় চা চেরারুকে + ঘুরে দেখুন + แฟชั่น & ความงาม + গেমিং + ইতিহাস + লাইব্রেরি + পছন্দ করা ভিডিওগুলি + লাইভ + মুভি + সঙ্গীত + প্রাষুগ + নোটিস্য়াসেগ + চ্লাস ন৊টিস্য়াসেগ + অনুসন্ধান + শোপিংগ + খেলাধুলা + সদস্যতা + এখন জনপ্রিয় + বির্চুভ্য়াল টিএলিটি + পরে দেখুন + আপ্নার কলিপ + সর্বদা শুরুর পৃষ্ঠা পরিবর্তন করুন + "শুরুর পৃষ্ঠা সবসময় পরিবর্তিত হয় সীমাবদ্ধতা: টুলবারে পিছনের বোতাম ব্যবহার করলে কাজ নাও করতে পারে" - অ্যাপ শুরু করার সময় শুধুমাত্র শুরুর পৃষ্ঠা পরিবর্তন করা হয় - - - Shorts প্লেয়ার আবার চালানো নিষ্ক্রিয় করুন - অ্যাপের শুরুতে Shorts প্লেয়ার আবার চলবে না - অ্যাপের শুরুতে Shorts প্লেয়ার আবার চলবে - - - Shorts সঙ্গে খুলুন - Shorts প্লেয়ার - নিয়মিত প্লেয়ার - নিয়মিত প্লেয়ার পূর্ণ পর্দা - - - অটোপ্লে Shorts - Shorts অটোপ্লে হবে - Shorts পুনরাবৃত্তি হবে - পটভূমিতে Shorts অটোপ্লে - পটভূমিতে Shorts অটোপ্লে হবে - পটভূমিতে Shorts পুনরাবৃত্তি হবে - - - মিনিপ্লেয়ার - ইন-অ্যাপ মিনিমাইজড প্লেয়ারের শৈলী পরিবর্তন করুন - মিনিপ্লেয়ার ধরণ - নিষ্ক্রিয় হয়েছে - পূর্ব-নির্ধারিত - ন্যূনতম - ট্যাবলেট - মর্ডান ১ - মর্ডান ২ - মর্ডান ৩ - আধুনিক ৪ - গোলাকার কোণা নিষ্ক্রিয় করুন - কোণগুলি বর্গাকার - কোণগুলি গোলাকার - ডাবল-ট্যাপ এবং পিঞ্চ টু রিসাইজ সক্ষম করুন - "ডাবল-ট্যাপ করার ক্রিয়া এবং আকার পরিবর্তন করার জন্য চিমটি দেওয়া সক্রিয় + অ্যাপ শুরু করার সময় শুধুমাত্র শুরুর পৃষ্ঠা পরিবর্তন করা হয় + + + Shorts প্লেয়ার আবার চালানো নিষ্ক্রিয় করুন + অ্যাপের শুরুতে Shorts প্লেয়ার আবার চলবে না + অ্যাপের শুরুতে Shorts প্লেয়ার আবার চলবে + + + Shorts সঙ্গে খুলুন + Shorts প্লেয়ার + নিয়মিত প্লেয়ার + নিয়মিত প্লেয়ার পূর্ণ পর্দা + + + অটোপ্লে Shorts + Shorts অটোপ্লে হবে + Shorts পুনরাবৃত্তি হবে + পটভূমিতে Shorts অটোপ্লে + পটভূমিতে Shorts অটোপ্লে হবে + পটভূমিতে Shorts পুনরাবৃত্তি হবে + + + মিনিপ্লেয়ার + ইন-অ্যাপ মিনিমাইজড প্লেয়ারের শৈলী পরিবর্তন করুন + মিনিপ্লেয়ার ধরণ + নিষ্ক্রিয় হয়েছে + পূর্ব-নির্ধারিত + ন্যূনতম + ট্যাবলেট + মর্ডান ১ + মর্ডান ২ + মর্ডান ৩ + আধুনিক ৪ + গোলাকার কোণা নিষ্ক্রিয় করুন + কোণগুলি বর্গাকার + কোণগুলি গোলাকার + ডাবল-ট্যাপ এবং পিঞ্চ টু রিসাইজ সক্ষম করুন + "ডাবল-ট্যাপ করার ক্রিয়া এবং আকার পরিবর্তন করার জন্য চিমটি দেওয়া সক্রিয় • miniplayer আকার বৃদ্ধি করতে ডাবল ট্যাপ করুন • মূল আকার পুনরুদ্ধার করতে আবার ডাবল ট্যাপ করুন" - ডাবল-ট্যাপ অ্যাকশন এবং পিঞ্চ টু রিসাইজ অক্ষম - টেনে-ছেড়ে দেওয়া নিষ্ক্রিয় করুন - ড্র্যাগ এবং ড্রপ অক্ষম - "ড্র্যাগ এবং ড্রপ সক্রিয় + ডাবল-ট্যাপ অ্যাকশন এবং পিঞ্চ টু রিসাইজ অক্ষম + টেনে-ছেড়ে দেওয়া নিষ্ক্রিয় করুন + ড্র্যাগ এবং ড্রপ অক্ষম + "ড্র্যাগ এবং ড্রপ সক্রিয় Miniplayer স্ক্রিনের যেকোনো কোণে টানা যাবে" - অনুভূমিক টেনে নেওয়ার ভঙ্গি নিষ্ক্রিয় করুন - অনুভূমিক ড্র্যাগ অঙ্গভঙ্গি অক্ষম - "ক্ষैতিকভাবে টানার ভঙ্গি সক্রিয় + অনুভূমিক টেনে নেওয়ার ভঙ্গি নিষ্ক্রিয় করুন + অনুভূমিক ড্র্যাগ অঙ্গভঙ্গি অক্ষম + "ক্ষैতিকভাবে টানার ভঙ্গি সক্রিয় Miniplayer স্ক্রিন থেকে বামে বা ডানে টানা যাবে" - ওভারলে বোতাম লুকান - ওভারলে বোতাম লুকানো আছে - ওভারলে বোতাম দেখানো হয়েছে - উপপাঠ লুকান - উপপাঠ লুকিয়ে রয়েছে - উপপাঠ প্রদর্শিত হয়েছে - সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম লুকান - সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম লুকিয়ে রয়েছে - সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম প্রদর্শিত হয়েছে - প্রাথমিক আকার - প্রাথমিক পর্দার আকার, পিক্সেলে - পিক্সেল আকার %1$s এবং %2$s এর মধ্যে হতে হবে - ওভারলে অস্বচ্ছতা - অসচ্ছতা মান ০-১০০ এর মধ্যে, যেখানে ০ হল সম্পূর্ণ স্বচ্ছ - মিনিপ্লেয়ার ওভারলে অস্বচ্ছতা অবশ্যই ০-১০০ এর মধ্যে হতে হবে - - - গ্রেডিয়েন্ট লোডিং স্ক্রিণ সক্রিয় করুন - লোডিং স্ক্রিণে একটি গ্রেডিয়েন্ড ব্যাকগ্রাউন্ড থাকবে - লোডিং স্ক্রিণে একটি সলিড ব্যাকগ্রাউন্ড থাকবে - স্প্ল্যাশ স্ক্রিন শৈলী - রং - কালো এবং সাদা - সিকবারে নিজস্ব রং সক্রিয় করুন - সিকবারে নিজস্ব রং প্রদর্শিত হয়েছে - সিকবারে মূল রং প্রদর্শিত হয়েছে - সিলেক্ট কাস্টম সিকবার কালার - সিকবারের রঙ - সিলেক্ট কাস্টম সিকবার এক্সেন্ট কালার - সিকবারের এক্সেন্ট রঙ - অবৈধ সিকবার রঙ মান - - - - - হেডার লোগো - ডিফল্ট - সাধারণ - - রিভ্যান্সড মিনিমাল - কাস্টম - - - ছবি অঞ্চল সীমাবদ্ধতা বাইপাস করুন - yt4.ggpht.com ছবি হোস্ট ব্যবহার করে - "মূল ছবি হোস্ট ব্যবহার করে + ওভারলে বোতাম লুকান + ওভারলে বোতাম লুকানো আছে + ওভারলে বোতাম দেখানো হয়েছে + উপপাঠ লুকান + উপপাঠ লুকিয়ে রয়েছে + উপপাঠ প্রদর্শিত হয়েছে + সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম লুকান + সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম লুকিয়ে রয়েছে + সামনে বা পেছনে এড়িয়ে যাওয়ার বোতাম প্রদর্শিত হয়েছে + প্রাথমিক আকার + প্রাথমিক পর্দার আকার, পিক্সেলে + পিক্সেল আকার %1$s এবং %2$s এর মধ্যে হতে হবে + ওভারলে অস্বচ্ছতা + অসচ্ছতা মান ০-১০০ এর মধ্যে, যেখানে ০ হল সম্পূর্ণ স্বচ্ছ + মিনিপ্লেয়ার ওভারলে অস্বচ্ছতা অবশ্যই ০-১০০ এর মধ্যে হতে হবে + + + গ্রেডিয়েন্ট লোডিং স্ক্রিণ সক্রিয় করুন + লোডিং স্ক্রিণে একটি গ্রেডিয়েন্ড ব্যাকগ্রাউন্ড থাকবে + লোডিং স্ক্রিণে একটি সলিড ব্যাকগ্রাউন্ড থাকবে + স্প্ল্যাশ স্ক্রিন শৈলী + রং + কালো এবং সাদা + সিকবারে নিজস্ব রং সক্রিয় করুন + সিকবারে নিজস্ব রং প্রদর্শিত হয়েছে + সিকবারে মূল রং প্রদর্শিত হয়েছে + সিলেক্ট কাস্টম সিকবার কালার + সিকবারের রঙ + সিলেক্ট কাস্টম সিকবার এক্সেন্ট কালার + সিকবারের এক্সেন্ট রঙ + অবৈধ সিকবার রঙ মান + + + + হেডার লোগো + ডিফল্ট + সাধারণ + + রিভ্যান্সড মিনিমাল + কাস্টম + + + ছবি অঞ্চল সীমাবদ্ধতা বাইপাস করুন + yt4.ggpht.com ছবি হোস্ট ব্যবহার করে + "মূল ছবি হোস্ট ব্যবহার করে এটি সক্ষম করলে কিছু অঞ্চলে ব্লক করা থাকা অনুপস্থিত ছবিগুলি সংশোধন করতে পারে" - - - - হোম ট্যাব - - সাবস্ক্রিপশনস ট্যাব - - আপনি ট্যাব - প্লেয়ার প্লেলিস্ট & সুপারিশ - অনুসন্ধানের ফলাফল - মূল থাম্বনেইল - DeArrow এবং মূল থাম্বনেইল - DeArrow এবং স্থির ছবি - স্থির ছবি - "DeArrow YouTube ভিডিওগুলির জন্য জনগণের উৎস থেকে তৈরি থাম্বনেইল সরবরাহ করে। এই থাম্বনেইলগুলি প্রায়শই YouTube দ্বারা সরবরাহ করা থাম্বনেইলগুলির চেয়ে আরও প্রাসঙ্গিক। + + + + হোম ট্যাব + + সাবস্ক্রিপশনস ট্যাব + + আপনি ট্যাব + প্লেয়ার প্লেলিস্ট & সুপারিশ + অনুসন্ধানের ফলাফল + মূল থাম্বনেইল + DeArrow এবং মূল থাম্বনেইল + DeArrow এবং স্থির ছবি + স্থির ছবি + "DeArrow YouTube ভিডিওগুলির জন্য জনগণের উৎস থেকে তৈরি থাম্বনেইল সরবরাহ করে। এই থাম্বনেইলগুলি প্রায়শই YouTube দ্বারা সরবরাহ করা থাম্বনেইলগুলির চেয়ে আরও প্রাসঙ্গিক। যদি সক্রিয় করা হয়, তাহলে ভিডিও URLগুলি API সার্ভারে পাঠানো হবে এবং অন্য কোনও ডেটা পাঠানো হবে না। যদি কোনও ভিডিওতে DeArrow থাম্বনেইল না থাকে, তাহলে মূল বা স্থির ক্যাপচার দেখানো হবে DeArrow সম্পর্কে আরও জানতে এখানে ট্যাপ করুন" - API উপলভ্য না থাকলে একটি টোস্ট দেখান - যদি DeArrow অনুপস্থিত থাকে তবে টোস্ট বার্তা প্রদর্শিত হয় - যদি DeArrow অনুপস্থিত থাকে তবে টোস্ট বার্তা প্রদর্শিত হয় না - DeArrow API এন্ডপয়েন্ট - DeArrow থাম্বনেইল ক্যাশ এন্ডপয়েন্টের URL - ভিডিওর স্থির ছবি - স্টিল ক্যাপচার প্রতিটি ভিডিওর শুরু/মাঝামাঝি/শেষ থেকে নেওয়া হয়। এই ছবিগুলি YouTube-এ তৈরি করা হয়েছে এবং কোনও বাহ্যিক API ব্যবহার করা হয় না - দ্রুততম স্থির চিত্র ব্যবহার করুন - মাঝামাঝি মানের স্থিরচিত্র ব্যবহার করা হচ্ছে। থাম্বনেইল তাড়াতাড়ি লোড হবে, কিন্তু লাইভ স্ট্রিম, অপ্রকাশিত বা অনেক পুরোনো ভিডিওর ক্ষেত্রে ফাঁকা থাম্বনেইল দেখাতে পারে - উচ্চ মানের স্থির চিত্র ব্যবহার করা হচ্ছে - ভিডিওর যে সময় থেকে স্থির চিত্র নেওয়া হবে - ভিডিওর শুরুর অংশ - ভিডিওর মধ্যাংশ - ভিডিওর শেষাংশ - - DeArrow সাময়িকভাবে উপলব্ধ নেই (স্ট্যাটাস কোড: %s) - DeArrow সাময়িকভাবে উপলব্ধ নেই - - - ReVanced ঘোষণা দেখান - স্টার্টআপে ঘোষণাগুলি দেখানো হয়েছে - স্টার্টআপে ঘোষণাগুলি দেখানো হয়নি - শুরুতে ঘোষণা দেখান - ঘোষনাদাতার সাথে সম্পর্ক স্থাপন ব্যর্থ হয়েছে - বাতিল করুন - - - লুপ ভিডিও সক্ষম করুন - ভিডিও লুপ হবে - ভিডিও লুপ হবে না - - - লুপ ভিডিও বোতাম দেখান - বোতামটি দেখানো হয়েছে - বোতামটি দেখানো হয়নি - লুপ ভিডিও চালু আছে - লুপ ভিডিও বন্ধ আছে - - - - - ডিভাইস ডাইমেনশন স্পুফ করুন - "ডিভাইসের মাত্রা ভুয়া + API উপলভ্য না থাকলে একটি টোস্ট দেখান + যদি DeArrow অনুপস্থিত থাকে তবে টোস্ট বার্তা প্রদর্শিত হয় + যদি DeArrow অনুপস্থিত থাকে তবে টোস্ট বার্তা প্রদর্শিত হয় না + DeArrow API এন্ডপয়েন্ট + DeArrow থাম্বনেইল ক্যাশ এন্ডপয়েন্টের URL + ভিডিওর স্থির ছবি + স্টিল ক্যাপচার প্রতিটি ভিডিওর শুরু/মাঝামাঝি/শেষ থেকে নেওয়া হয়। এই ছবিগুলি YouTube-এ তৈরি করা হয়েছে এবং কোনও বাহ্যিক API ব্যবহার করা হয় না + দ্রুততম স্থির চিত্র ব্যবহার করুন + মাঝামাঝি মানের স্থিরচিত্র ব্যবহার করা হচ্ছে। থাম্বনেইল তাড়াতাড়ি লোড হবে, কিন্তু লাইভ স্ট্রিম, অপ্রকাশিত বা অনেক পুরোনো ভিডিওর ক্ষেত্রে ফাঁকা থাম্বনেইল দেখাতে পারে + উচ্চ মানের স্থির চিত্র ব্যবহার করা হচ্ছে + ভিডিওর যে সময় থেকে স্থির চিত্র নেওয়া হবে + ভিডিওর শুরুর অংশ + ভিডিওর মধ্যাংশ + ভিডিওর শেষাংশ + + DeArrow সাময়িকভাবে উপলব্ধ নেই (স্ট্যাটাস কোড: %s) + DeArrow সাময়িকভাবে উপলব্ধ নেই + + + ReVanced ঘোষণা দেখান + স্টার্টআপে ঘোষণাগুলি দেখানো হয়েছে + স্টার্টআপে ঘোষণাগুলি দেখানো হয়নি + শুরুতে ঘোষণা দেখান + ঘোষনাদাতার সাথে সম্পর্ক স্থাপন ব্যর্থ হয়েছে + বাতিল করুন + + + লুপ ভিডিও সক্ষম করুন + ভিডিও লুপ হবে + ভিডিও লুপ হবে না + + + লুপ ভিডিও বোতাম দেখান + বোতামটি দেখানো হয়েছে + বোতামটি দেখানো হয়নি + লুপ ভিডিও চালু আছে + লুপ ভিডিও বন্ধ আছে + + + + ডিভাইস ডাইমেনশন স্পুফ করুন + "ডিভাইসের মাত্রা ভুয়া উচ্চ ভিডিও গুণমানগুলি আনলক করা যেতে পারে তবে আপনি ভিডিও প্লেব্যাক হোঁচট খাওয়া, খারাপ ব্যাটারি লাইফ এবং অজানা পার্শ্ব প্রতিক্রিয়া অনুভব করতে পারেন" - "ডিভাইসের মাত্রা ভুয়া নয় + "ডিভাইসের মাত্রা ভুয়া নয় এটি সক্রিয় করা উচ্চ ভিডিও গুণমানগুলি আনলক করতে পারে" - এটি সক্রিয় করার ফলে আপনি ভিডিও চলার ক্ষেত্রে আটকে চলা, খারাপ ব্যাটারি লাইফ এবং অজানা পার্শ্ব-প্রতিক্রিয়ার সম্মুখিন হতে পারেন। - - - কম্পন প্রতিক্রিয়া - কম্পন প্রতিক্রিয়া পরিবর্তন করুন - অধ্যায়গুলোর কম্পন নিষ্ক্রিয় করুন - অধ্যায়গুলোর কম্পন নিষ্ক্রিয় করা হয়েছে - অধ্যায়গুলোর কম্পন সক্রিয় করা হয়েছে - নির্দিষ্ট স্থানে খোঁজার কম্পন নিষ্ক্রিয় করুন - সূক্ষ্ম সিকিং কম্পন নিষ্ক্রিয় করা হয়েছে - নির্দিষ্ট স্থানে খোঁজার কম্পন সক্রিয় করা হয়েছে - সীক আনডু কম্পন নিষ্ক্রিয় করুন - সীক আনডু কম্পন নিষ্ক্রিয় করা হয়েছে - সীক আনডু কম্পন সক্রিয় করা হয়েছে - জুম করার কম্পন নিষ্ক্রিয় করুন - জুম করার কম্পন নিষ্ক্রিয় করা হয়েছে - জুম করার কম্পন সক্রিয় করা হয়েছে - - - আপনি যদি সম্প্রতি আপনার অ্যাকাউন্ট লগইন বিশদ পরিবর্তন করে থাকেন, তবে MicroG আনইনস্টল করুন এবং পুনরায় ইনস্টল করুন। - - - URL পুনঃনির্দেশ বাইপাস করুন - URL পুনঃনির্দেশ বাইপাস করছে - URL পুনঃনির্দেশ বাইপাস করেনি - - - লিংক ব্রাউজারে খুলুন - বাহ্যিক ব্রাউজারে লিঙ্ক খোলা হচ্ছে - ইন-অ্যাপ ব্রাউজারে লিঙ্ক খোলা হচ্ছে - - - - স্বতস্ফূর্তভাবে - ভিডিও গুণমান পরিবর্তন মনে রাখুন - গুণমান পরিবর্তন সব ভিডিওতে প্রয়োগ করা হয়েছে - গুণমান পরিবর্তন বর্তমান ভিডিওতে প্রয়োগ করা হয়েছে - ভিডিও গুণমান পরিবর্তনে টোস্ট দেখান - ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয় - ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয় না - ওয়াই-ফাই নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান - মোবাইল নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান - Shorts গুণমান পরিবর্তনের কথা মনে রাখুন - গুণমানের পরিবর্তনগুলি সমস্ত Shorts-এর জন্য প্রযোজ্য - গুণমানের পরিবর্তনগুলি শুধুমাত্র বর্তমান Short-এর জন্য প্রযোজ্য - Wi-Fi নেটওয়ার্কে ডিফল্ট Shorts গুণমান - মোবাইল নেটওয়ার্কে ডিফল্ট Shorts গুণমান - মোবাইল - ওয়াই-ফাই - ডিফল্ট %1$s গুণমান পরিবর্তন হচ্ছে: %2$s - Shorts %1$s এর গুণমান পরিবর্তন করে: %2$s - - - স্পিড ডায়ালগ বোতাম দেখান - স্পিড ডায়ালগ বোতাম দেখানো আছে। প্লেব্যাক স্পিড ডিফল্টে রিসেট করতে ট্যাপ করে ধরে রাখুন - স্পিড ডায়ালগ বোতাম দেখানো নেই - - - ভিডিও গুণমান বোতাম দেখান - ভিডিও কোয়ালিটি বোতাম দেখানো আছে। কোয়ালিটি ডিফল্টে রিসেট করতে ট্যাপ করে ধরে রাখুন - ভিডিও কোয়ালিটি বোতাম দেখানো নেই - - - কাস্টম প্লেব্যাক গতি মেনু - কাস্টম স্পিড মেনু দেখানো হচ্ছে - কাস্টম স্পিড মেনু দেখানো হচ্ছে না - পুরানো প্লেব্যাক গতি মেনু পুনরুদ্ধার করুন - পুরানো গতির মেনু দেখানো হয়েছে - আধুনিক গতির মেনু দেখানো হয়েছে - নিজস্ব প্লেব্যাক স্পিড - কাস্টম প্লেব্যাক গতি যোগ করুন অথবা পরিবর্তন করুন - কাস্টম গতি %s এর চেয়ে কম হতে হবে - অবৈধ কাস্টম প্লেব্যাক গতি - স্বতস্ফূর্তভাবে - কাস্টম ট্যাপ এন্ড হোল্ড স্পিড - ০-৮ এর মধ্যে প্লেব্যাক স্পিড - - - প্লেব্যাকের স্পিড পরিবর্তন মনে রাখুন - প্লেব্যাকের স্পিড পরিবর্তন সকল ভিডিওতে প্রয়োগ হবে - প্লেব্যাকের স্পিড পরিবর্তন এই ভিডিওতে প্রয়োগ হবে - প্লেব্যাক গতি পরিবর্তনে টোস্ট দেখান - ডিফল্ট প্লেব্যাক গতি পরিবর্তন হলে একটি টোস্ট দেখানো হয় - যখন ডিফল্ট প্লেব্যাক গতি পরিবর্তন করা হয় তখন কোনো টোস্ট দেখানো হয় না। - প্লেব্যাকের মূল স্পিড - মূল স্পিড পরিবর্তন হচ্ছে: %s - - - HDR ভিডিও নিষ্ক্রিয় করুন - HDR ভিডিও নিষ্ক্রিয় করা হয়েছে - HDR ভিডিও সক্রিয় হয়েছে - AVC (H.264) প্রয়োগ করুন - ভিডিও কোডেক AVC (H.264) তে প্রয়োগ করা হয়েছে - ভিডিও কোডেক স্বয়ংক্রিয়ভাবে নির্ধারিত হয় - "সুবিধা: + এটি সক্রিয় করার ফলে আপনি ভিডিও চলার ক্ষেত্রে আটকে চলা, খারাপ ব্যাটারি লাইফ এবং অজানা পার্শ্ব-প্রতিক্রিয়ার সম্মুখিন হতে পারেন। + + + কম্পন প্রতিক্রিয়া + কম্পন প্রতিক্রিয়া পরিবর্তন করুন + অধ্যায়গুলোর কম্পন নিষ্ক্রিয় করুন + অধ্যায়গুলোর কম্পন নিষ্ক্রিয় করা হয়েছে + অধ্যায়গুলোর কম্পন সক্রিয় করা হয়েছে + নির্দিষ্ট স্থানে খোঁজার কম্পন নিষ্ক্রিয় করুন + সূক্ষ্ম সিকিং কম্পন নিষ্ক্রিয় করা হয়েছে + নির্দিষ্ট স্থানে খোঁজার কম্পন সক্রিয় করা হয়েছে + সীক আনডু কম্পন নিষ্ক্রিয় করুন + সীক আনডু কম্পন নিষ্ক্রিয় করা হয়েছে + সীক আনডু কম্পন সক্রিয় করা হয়েছে + জুম করার কম্পন নিষ্ক্রিয় করুন + জুম করার কম্পন নিষ্ক্রিয় করা হয়েছে + জুম করার কম্পন সক্রিয় করা হয়েছে + + + আপনি যদি সম্প্রতি আপনার অ্যাকাউন্ট লগইন বিশদ পরিবর্তন করে থাকেন, তবে MicroG আনইনস্টল করুন এবং পুনরায় ইনস্টল করুন। + + + URL পুনঃনির্দেশ বাইপাস করুন + URL পুনঃনির্দেশ বাইপাস করছে + URL পুনঃনির্দেশ বাইপাস করেনি + + + লিংক ব্রাউজারে খুলুন + বাহ্যিক ব্রাউজারে লিঙ্ক খোলা হচ্ছে + ইন-অ্যাপ ব্রাউজারে লিঙ্ক খোলা হচ্ছে + + + + স্বতস্ফূর্তভাবে + ভিডিও গুণমান পরিবর্তন মনে রাখুন + গুণমান পরিবর্তন সব ভিডিওতে প্রয়োগ করা হয়েছে + গুণমান পরিবর্তন বর্তমান ভিডিওতে প্রয়োগ করা হয়েছে + ভিডিও গুণমান পরিবর্তনে টোস্ট দেখান + ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয় + ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয় না + ওয়াই-ফাই নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান + মোবাইল নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান + Shorts গুণমান পরিবর্তনের কথা মনে রাখুন + গুণমানের পরিবর্তনগুলি সমস্ত Shorts-এর জন্য প্রযোজ্য + গুণমানের পরিবর্তনগুলি শুধুমাত্র বর্তমান Short-এর জন্য প্রযোজ্য + Wi-Fi নেটওয়ার্কে ডিফল্ট Shorts গুণমান + মোবাইল নেটওয়ার্কে ডিফল্ট Shorts গুণমান + মোবাইল + ওয়াই-ফাই + ডিফল্ট %1$s গুণমান পরিবর্তন হচ্ছে: %2$s + Shorts %1$s এর গুণমান পরিবর্তন করে: %2$s + + + স্পিড ডায়ালগ বোতাম দেখান + স্পিড ডায়ালগ বোতাম দেখানো আছে। প্লেব্যাক স্পিড ডিফল্টে রিসেট করতে ট্যাপ করে ধরে রাখুন + স্পিড ডায়ালগ বোতাম দেখানো নেই + + + ভিডিও গুণমান বোতাম দেখান + ভিডিও কোয়ালিটি বোতাম দেখানো আছে। কোয়ালিটি ডিফল্টে রিসেট করতে ট্যাপ করে ধরে রাখুন + ভিডিও কোয়ালিটি বোতাম দেখানো নেই + + + কাস্টম প্লেব্যাক গতি মেনু + কাস্টম স্পিড মেনু দেখানো হচ্ছে + কাস্টম স্পিড মেনু দেখানো হচ্ছে না + পুরানো প্লেব্যাক গতি মেনু পুনরুদ্ধার করুন + পুরানো গতির মেনু দেখানো হয়েছে + আধুনিক গতির মেনু দেখানো হয়েছে + নিজস্ব প্লেব্যাক স্পিড + কাস্টম প্লেব্যাক গতি যোগ করুন অথবা পরিবর্তন করুন + কাস্টম গতি %s এর চেয়ে কম হতে হবে + অবৈধ কাস্টম প্লেব্যাক গতি + স্বতস্ফূর্তভাবে + কাস্টম ট্যাপ এন্ড হোল্ড স্পিড + ০-৮ এর মধ্যে প্লেব্যাক স্পিড + + + প্লেব্যাকের স্পিড পরিবর্তন মনে রাখুন + প্লেব্যাকের স্পিড পরিবর্তন সকল ভিডিওতে প্রয়োগ হবে + প্লেব্যাকের স্পিড পরিবর্তন এই ভিডিওতে প্রয়োগ হবে + প্লেব্যাক গতি পরিবর্তনে টোস্ট দেখান + ডিফল্ট প্লেব্যাক গতি পরিবর্তন হলে একটি টোস্ট দেখানো হয় + যখন ডিফল্ট প্লেব্যাক গতি পরিবর্তন করা হয় তখন কোনো টোস্ট দেখানো হয় না। + প্লেব্যাকের মূল স্পিড + মূল স্পিড পরিবর্তন হচ্ছে: %s + + + HDR ভিডিও নিষ্ক্রিয় করুন + HDR ভিডিও নিষ্ক্রিয় করা হয়েছে + HDR ভিডিও সক্রিয় হয়েছে + AVC (H.264) প্রয়োগ করুন + ভিডিও কোডেক AVC (H.264) তে প্রয়োগ করা হয়েছে + ভিডিও কোডেক স্বয়ংক্রিয়ভাবে নির্ধারিত হয় + "সুবিধা: • ব্যাটারির আয়ু উন্নত করতে পারে • পুরনো ডিভাইসে অনুপস্থিত ভিডিও রেজোলিউশন পুনরুদ্ধার করতে পারে @@ -1640,179 +1637,178 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট • VP9 বা AV1 এর চেয়ে ভিডিও প্লেব্যাকে বেশি ইন্টারনেট ডেটা ব্যবহার হবে • HDR ভিডিও AVC ব্যবহার করবে না • কিছু ডিভাইস AVC জোর করে ব্যবহার করতে পারে না" - - - উন্নত ভিডিও গুণমান মেনু দেখান - উন্নত ভিডিও গুণমান মেনু দেখানো হয়েছে - উন্নত ভিডিও গুণমান মেনু দেখানো হয়নি - - - ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করুন - ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়েছে - ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়নি - - - অ্যান্ড্রয়েড VR AV1 অনুমতি দিন - "ভিডিও কোডেক হল AVC (H.264), VP9, অথবা AV1 + + + উন্নত ভিডিও গুণমান মেনু দেখান + উন্নত ভিডিও গুণমান মেনু দেখানো হয়েছে + উন্নত ভিডিও গুণমান মেনু দেখানো হয়নি + + + ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করুন + ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়েছে + ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়নি + + + অ্যান্ড্রয়েড VR AV1 অনুমতি দিন + "ভিডিও কোডেক হল AVC (H.264), VP9, অথবা AV1 প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে" - ভিডিও কোডেক হল AVC (H.264) অথবা VP9 - "এই সেটিংটি চালু করলে সফটওয়্যার AV1 ডিকোডিং ব্যবহার হতে পারে। + ভিডিও কোডেক হল AVC (H.264) অথবা VP9 + "এই সেটিংটি চালু করলে সফটওয়্যার AV1 ডিকোডিং ব্যবহার হতে পারে। AV1 সহ ভিডিও প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে।" - স্পুফিংয়ের পার্শ্বপ্রতিক্রিয়া - • পরীক্ষামূলক ক্লায়েন্ট এবং যেকোনো সময় কাজ করা বন্ধ করতে পারে - • ভিডিও ১:০০ মিনিটে বন্ধ হতে পারে, অথবা কিছু অঞ্চলে উপলব্ধ নাও হতে পারে - • অডিও ট্র্যাক মেনু অনুপস্থিত - • কোনো AV1 ভিডিও কোডেক নেই - • স্থিতিশীল ভলিউম উপলব্ধ নেই - • লগআউট করা হলে বা ছদ্মবেশী মোডে বাচ্চাদের ভিডিও চলতে নাও পারে - - • মূল অডিও জোরপূর্বক উপলব্ধ নেই - স্ট্যাটস ফর নার্ডসে দেখান - স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট প্রকার দেখানো হবে - স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট লুকানো হবে - - - - - - - সম্পর্কে - বিজ্ঞাপন - সাধারণ - প্লেয়ার - বিবিধ - - - ভিডিও বিজ্ঞাপন লুকান - ভিডিও বিজ্ঞাপন লুকানো আছে - ভিডিও বিজ্ঞাপন দেখানো আছে - - - স্থায়ী পুনরাবৃত্তি সক্ষম করুন - স্থায়ী পুনরাবৃত্তি সক্ষম করা হয়েছে - স্থায়ী পুনরাবৃত্তি অক্ষম করা হয়েছে - - - কাস্ট বোতাম লুকান - কাস্ট বোতাম লুকানো আছে - কাস্ট বোতাম দেখানো আছে - ইতিহাস বোতাম লুকান - ইতিহাস বোতাম লুকানো আছে - ইতিহাস বোতাম দেখানো আছে - বিজ্ঞপ্তি বাটন লুকান - বিজ্ঞপ্তি বাটন লুকানো আছে - বিজ্ঞপ্তি বাটন দেখানো হয়েছে - অনুসন্ধান বাটন লুকান - অনুসন্ধান বাটন লুকানো আছে - অনুসন্ধান বাটন দেখানো হয়েছে - - - ক্যাটাগরি বার লুকান - ক্যাটাগরি বার লুকানো আছে - ক্যাটাগরি বার দেখানো আছে - - - মিনিপ্লেয়ারের রঙ পরিবর্তন করুন - মিনিপ্লেয়ারের রঙ ফুলস্ক্রিন প্লেয়ারের সাথে মেলে - মিনিপ্লেয়ার ডিফল্ট রঙ ব্যবহার করে - - - নেভিগেশন বার - নেভিগেশন বারের বোতামগুলি লুকান বা পরিবর্তন করুন - - হোম লুকান - হোম বোতাম লুকানো আছে - হোম বোতাম দেখানো আছে - - স্যাম্পল লুকান - স্যাম্পল বোতাম লুকানো আছে - স্যাম্পল বোতাম দেখানো আছে - - এক্সপ্লোর লুকান - অনুসন্ধান বোতাম লুকানো আছে - অনুসন্ধান বোতাম দেখানো আছে - - লাইব্রেরি লুকান - লাইব্রেরি বোতাম লুকানো আছে - লাইব্রেরি বোতাম দেখানো আছে - - আপগ্রেড লুকান - আপগ্রেড বোতাম লুকানো আছে - আপগ্রেড বোতাম দেখানো আছে - নেভিগেশন বার লুকান - নেভিগেশন বার লুকানো আছে - নেভিগেশন বার দেখানো আছে - নেভিগেশন বোতামের লেবেলগুলি লুকান - লেবেলগুলি লুকানো আছে - লেবেলগুলি দেখানো আছে - - - \'গেট মিউজিক প্রিমিয়াম\' লেবেল লুকান - লেবেল লুকানো আছে - লেবেল দেখানো আছে - - - আপগ্রেড বাটন লুকান - বাটন লুকানো আছে - বাটন দেখানো আছে - - - - - অডিও বিজ্ঞাপন আটকান - অডিও বিজ্ঞাপন আটকানো হয়েছে - অডিও বিজ্ঞাপন আনবব্লক করা হয়েছে - - - %s উপলব্ধ নয়, বিজ্ঞাপন দেখানো হতে পারে। সেটিংসে বিজ্ঞাপন ব্লক পরিষেবা পরিবর্তন করার চেষ্টা করুন। - %s একটি ত্রুটি ফিরিয়েছে, বিজ্ঞাপন দেখানো হতে পারে। সেটিংসে বিজ্ঞাপন ব্লক পরিষেবা পরিবর্তন করার চেষ্টা করুন। - এমবেড করা ভিডিও বিজ্ঞাপন আটকান - নিষ্ক্রিয় হয়েছে - Luminous প্রক্সি - PurpleAdBlock প্রক্সি - - - ভিডিও বিজ্ঞাপন আটকান - ভিডিও বিজ্ঞাপন আটকানো হয়েছে - ভিডিও বিজ্ঞাপন আটকানো হয়নি - - - বার্তা মুছে ফেলা হয়েছে - মুছে ফেলা বার্তা দেখান - মুছে ফেলা বার্তা দেখাবেন না - স্পয়লার এর পেছনে থাকা মুছে ফেলা বার্তা লুকান - মুছে ফেলা বার্তাগুলো ক্রসড-আউট পাঠ্য হিসেবে দেখান - - - স্বয়ংক্রিয়ভাবে চ্যানেল পয়েন্ট নিয়ে নিন - চ্যানেল পয়েন্ট স্বয়ংক্রিয়ভাবে নেওয়া হয়েছে - চ্যানেল পয়েন্ট স্বয়ংক্রিয়ভাবে নেওয়া হয়নি - - - - Twitch ডিবাগ মোড সক্রিয় করুন - Twitch ডিবাগ মোড সক্রিয় করুন (প্রস্তাবিত নয়) - Twitch ডিবাগ মোড নিষ্ক্রিয় করা হয়েছে - - - ReVanced সেটিং - সম্পর্কিত - ReVanced সম্পর্কে - বিজ্ঞাপন ব্লক করা - বিজ্ঞাপন ব্লক করার সেটিংস - আলাপচারি - চ্যাট সেটিং - অন্যান্য - বিবিধ সেটিং - সাধারণ সেটিংস - অন্যান্য সেটিংস - ক্লায়েন্ট-সাইড বিজ্ঞাপন - সার্ভার-সাইড নিশ্চিত স্ট্রিম বিজ্ঞাপন - ডিবাগ লগিং - ডিবাগ লগ সক্রিয় হয়েছে - ডিবাগ লগ নিষ্ক্রিয় হয়েছে - - + স্পুফিংয়ের পার্শ্বপ্রতিক্রিয়া + • পরীক্ষামূলক ক্লায়েন্ট এবং যেকোনো সময় কাজ করা বন্ধ করতে পারে + • ভিডিও ১:০০ মিনিটে বন্ধ হতে পারে, অথবা কিছু অঞ্চলে উপলব্ধ নাও হতে পারে + • অডিও ট্র্যাক মেনু অনুপস্থিত + • কোনো AV1 ভিডিও কোডেক নেই + • স্থিতিশীল ভলিউম উপলব্ধ নেই + • লগআউট করা হলে বা ছদ্মবেশী মোডে বাচ্চাদের ভিডিও চলতে নাও পারে + + • মূল অডিও জোরপূর্বক উপলব্ধ নেই + স্ট্যাটস ফর নার্ডসে দেখান + স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট প্রকার দেখানো হবে + স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট লুকানো হবে + + + + + + সম্পর্কে + বিজ্ঞাপন + সাধারণ + প্লেয়ার + বিবিধ + + + ভিডিও বিজ্ঞাপন লুকান + ভিডিও বিজ্ঞাপন লুকানো আছে + ভিডিও বিজ্ঞাপন দেখানো আছে + + + স্থায়ী পুনরাবৃত্তি সক্ষম করুন + স্থায়ী পুনরাবৃত্তি সক্ষম করা হয়েছে + স্থায়ী পুনরাবৃত্তি অক্ষম করা হয়েছে + + + কাস্ট বোতাম লুকান + কাস্ট বোতাম লুকানো আছে + কাস্ট বোতাম দেখানো আছে + ইতিহাস বোতাম লুকান + ইতিহাস বোতাম লুকানো আছে + ইতিহাস বোতাম দেখানো আছে + বিজ্ঞপ্তি বাটন লুকান + বিজ্ঞপ্তি বাটন লুকানো আছে + বিজ্ঞপ্তি বাটন দেখানো হয়েছে + অনুসন্ধান বাটন লুকান + অনুসন্ধান বাটন লুকানো আছে + অনুসন্ধান বাটন দেখানো হয়েছে + + + ক্যাটাগরি বার লুকান + ক্যাটাগরি বার লুকানো আছে + ক্যাটাগরি বার দেখানো আছে + + + মিনিপ্লেয়ারের রঙ পরিবর্তন করুন + মিনিপ্লেয়ারের রঙ ফুলস্ক্রিন প্লেয়ারের সাথে মেলে + মিনিপ্লেয়ার ডিফল্ট রঙ ব্যবহার করে + + + নেভিগেশন বার + নেভিগেশন বারের বোতামগুলি লুকান বা পরিবর্তন করুন + + হোম লুকান + হোম বোতাম লুকানো আছে + হোম বোতাম দেখানো আছে + + স্যাম্পল লুকান + স্যাম্পল বোতাম লুকানো আছে + স্যাম্পল বোতাম দেখানো আছে + + এক্সপ্লোর লুকান + অনুসন্ধান বোতাম লুকানো আছে + অনুসন্ধান বোতাম দেখানো আছে + + লাইব্রেরি লুকান + লাইব্রেরি বোতাম লুকানো আছে + লাইব্রেরি বোতাম দেখানো আছে + + আপগ্রেড লুকান + আপগ্রেড বোতাম লুকানো আছে + আপগ্রেড বোতাম দেখানো আছে + নেভিগেশন বার লুকান + নেভিগেশন বার লুকানো আছে + নেভিগেশন বার দেখানো আছে + নেভিগেশন বোতামের লেবেলগুলি লুকান + লেবেলগুলি লুকানো আছে + লেবেলগুলি দেখানো আছে + + + \'গেট মিউজিক প্রিমিয়াম\' লেবেল লুকান + লেবেল লুকানো আছে + লেবেল দেখানো আছে + + + আপগ্রেড বাটন লুকান + বাটন লুকানো আছে + বাটন দেখানো আছে + + + + + অডিও বিজ্ঞাপন আটকান + অডিও বিজ্ঞাপন আটকানো হয়েছে + অডিও বিজ্ঞাপন আনবব্লক করা হয়েছে + + + %s উপলব্ধ নয়, বিজ্ঞাপন দেখানো হতে পারে। সেটিংসে বিজ্ঞাপন ব্লক পরিষেবা পরিবর্তন করার চেষ্টা করুন। + %s একটি ত্রুটি ফিরিয়েছে, বিজ্ঞাপন দেখানো হতে পারে। সেটিংসে বিজ্ঞাপন ব্লক পরিষেবা পরিবর্তন করার চেষ্টা করুন। + এমবেড করা ভিডিও বিজ্ঞাপন আটকান + নিষ্ক্রিয় হয়েছে + Luminous প্রক্সি + PurpleAdBlock প্রক্সি + + + ভিডিও বিজ্ঞাপন আটকান + ভিডিও বিজ্ঞাপন আটকানো হয়েছে + ভিডিও বিজ্ঞাপন আটকানো হয়নি + + + বার্তা মুছে ফেলা হয়েছে + মুছে ফেলা বার্তা দেখান + মুছে ফেলা বার্তা দেখাবেন না + স্পয়লার এর পেছনে থাকা মুছে ফেলা বার্তা লুকান + মুছে ফেলা বার্তাগুলো ক্রসড-আউট পাঠ্য হিসেবে দেখান + + + স্বয়ংক্রিয়ভাবে চ্যানেল পয়েন্ট নিয়ে নিন + চ্যানেল পয়েন্ট স্বয়ংক্রিয়ভাবে নেওয়া হয়েছে + চ্যানেল পয়েন্ট স্বয়ংক্রিয়ভাবে নেওয়া হয়নি + + + + Twitch ডিবাগ মোড সক্রিয় করুন + Twitch ডিবাগ মোড সক্রিয় করুন (প্রস্তাবিত নয়) + Twitch ডিবাগ মোড নিষ্ক্রিয় করা হয়েছে + + + ReVanced সেটিং + সম্পর্কিত + ReVanced সম্পর্কে + বিজ্ঞাপন ব্লক করা + বিজ্ঞাপন ব্লক করার সেটিংস + আলাপচারি + চ্যাট সেটিং + অন্যান্য + বিবিধ সেটিং + সাধারণ সেটিংস + অন্যান্য সেটিংস + ক্লায়েন্ট-সাইড বিজ্ঞাপন + সার্ভার-সাইড নিশ্চিত স্ট্রিম বিজ্ঞাপন + ডিবাগ লগিং + ডিবাগ লগ সক্রিয় হয়েছে + ডিবাগ লগ নিষ্ক্রিয় হয়েছে + + diff --git a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml +++ b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index e467cd066b..e14f6d3aba 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - Název aplikace - - Vlastní - Ikona aplikace - Původní - - ReVanced minimální - ReVanced škálované - - Vlastní - - - Kontrola proběhla neúspěšně - Otevřít oficiální webovou stránku - Ignorovat - <h5>Zdá se, že jste tuto upravenou verzi aplikace nevygenerovali vy.</h5><br>Aplikace nemusí fungovat správně, <b>může být škodlivá nebo nebezpečná</b>.<br><br>Z následujících kontrol vyplývá, že úpravy této aplikace byly provedeny někým jiným:<br><br><small>%1$s</small><br>Je důrazně doporučeno <b>odinstalovat tuto aplikaci a vygenerovat ji sami</b>, abyste měli jistotu, že je aplikace ověřená a bezpečná.<p><br>Pokud zvolíte Ignorovat, toto varování se zobrazí pouze dvakrát. - Vygenerována na jiném zařízení - Nebyla nainstalována skrze ReVanced Manager - Vygenerována před více než 10 minutami - Vygenerována před %s dny - Datum sestavení souboru APK je poškozeno - - - Upozornění ReVanced - Vaše historie sledování není ukládána.<br><br>Příčinou je s největší pravděpodobností DNS blokátor reklam nebo síťový proxy server.<br><br>Chcete-li to opravit, přidejte<b>s.youtube.com</b> na whitelist nebo vypněte všechny DNS blokátory a proxy servery. - Už nezobrazovat - - - Nastavení - Opravdu chcete pokračovat? - Uložit - Výchozí - Obnovit barvu - Neplatná barva - Je vyžadován restart - Aby se tato změna projevila, restartujte aplikaci. - Restartovat - Importovat - Kopírovat - Nastavení ReVanced obnoveno do výchozího stavu - Importováno %d nastavení - Importováni selhalo: %s - Hledat nastavení - Nebyly nalezeny žádné výsledky pro \",%s\" - Zkuste jiné klíčové slovo - Nedávná hledání - Odebrat z historie vyhledávání? - Vymazat historii hledání - Opravdu chcete vymazat celou historii hledání? - Tipy pro vyhledávání - "• Klepnutím na cestu k ní přejdete +--> + + + Název aplikace + + Vlastní + Ikona aplikace + Původní + + ReVanced minimální + ReVanced škálované + + Vlastní + + + Kontrola proběhla neúspěšně + Otevřít oficiální webovou stránku + Ignorovat + <h5>Zdá se, že jste tuto upravenou verzi aplikace nevygenerovali vy.</h5><br>Aplikace nemusí fungovat správně, <b>může být škodlivá nebo nebezpečná</b>.<br><br>Z následujících kontrol vyplývá, že úpravy této aplikace byly provedeny někým jiným:<br><br><small>%1$s</small><br>Je důrazně doporučeno <b>odinstalovat tuto aplikaci a vygenerovat ji sami</b>, abyste měli jistotu, že je aplikace ověřená a bezpečná.<p><br>Pokud zvolíte Ignorovat, toto varování se zobrazí pouze dvakrát. + Vygenerována na jiném zařízení + Nebyla nainstalována skrze ReVanced Manager + Vygenerována před více než 10 minutami + Vygenerována před %s dny + Datum sestavení souboru APK je poškozeno + + + Upozornění ReVanced + Vaše historie sledování není ukládána.<br><br>Příčinou je s největší pravděpodobností DNS blokátor reklam nebo síťový proxy server.<br><br>Chcete-li to opravit, přidejte<b>s.youtube.com</b> na whitelist nebo vypněte všechny DNS blokátory a proxy servery. + Už nezobrazovat + + + Nastavení + Opravdu chcete pokračovat? + Uložit + Výchozí + Obnovit barvu + Neplatná barva + Je vyžadován restart + Aby se tato změna projevila, restartujte aplikaci. + Restartovat + Importovat + Kopírovat + Nastavení ReVanced obnoveno do výchozího stavu + Importováno %d nastavení + Importováni selhalo: %s + Hledat nastavení + Nebyly nalezeny žádné výsledky pro \",%s\" + Zkuste jiné klíčové slovo + Nedávná hledání + Odebrat z historie vyhledávání? + Vymazat historii hledání + Opravdu chcete vymazat celou historii hledání? + Tipy pro vyhledávání + "• Klepnutím na cestu k ní přejdete • Dlouhým stisknutím nastavení k němu přejdete • Stisknutím klávesy Enter uložíte vyhledávací dotaz do historie • Vyhledávání ignoruje velikost písmen a interpunkci • Nadřazená nastavení se zobrazují nad zakázanými podřízenými nastaveními" - Historie vyhledávání je prázdná - Chcete-li uložit historii vyhledávání, zadejte vyhledávací dotaz a stiskněte Enter - Zobrazit historii vyhledávání v nastavení - Historie vyhledávání v nastavení je zobrazena - Historie vyhledávání nastavení se nezobrazuje - Zobrazit ikony nastavení ReVanced - Ikony nastavení se zobrazují - Ikony nastavení se nezobrazují - Jazyk ReVanced - "Překlady pro některé jazyky mohou chybět nebo být neúplné. + Historie vyhledávání je prázdná + Chcete-li uložit historii vyhledávání, zadejte vyhledávací dotaz a stiskněte Enter + Zobrazit historii vyhledávání v nastavení + Historie vyhledávání v nastavení je zobrazena + Historie vyhledávání nastavení se nezobrazuje + Zobrazit ikony nastavení ReVanced + Ikony nastavení se zobrazují + Ikony nastavení se nezobrazují + Jazyk ReVanced + "Překlady pro některé jazyky mohou chybět nebo být neúplné. Chcete-li přeložit nové jazyky nebo zlepšit stávající překlady, navštivte translate.revanced.app" - Jazyk aplikace - Importovat / Exportovat - Importovat/exportovat nastavení ReVanced - - Používáte verzi ReVanced Patches <i>%s</i> - Poznámka - Tato verze je předběžná a můžete narazit na neočekávané problémy - Odkazy na oficiální stránky - + Používáte verzi ReVanced Patches <i>%s</i> + Poznámka + Tato verze je předběžná a můžete narazit na neočekávané problémy + Odkazy na oficiální stránky + - - - Nastavení GmsCore - Nastavení pro GmsCore - - MicroG GmsCore není nainstalován. Nainstalujte jej. - Požadovaná akce - "MicroG GmsCore nemá oprávnění běžet na pozadí. + + + Nastavení GmsCore + Nastavení pro GmsCore + + MicroG GmsCore není nainstalován. Nainstalujte jej. + Požadovaná akce + "MicroG GmsCore nemá oprávnění běžet na pozadí. Postupujte podle návodu \"Nezabíjej mou aplikaci\" pro váš telefon a použijte pokyny pro instalaci MicroG. To je nutné pro fungování aplikace." - Otevřít web - "Optimalizace baterie MicroG GmsCore musí být zakázány, aby se zabránilo problémům. + Otevřít web + "Optimalizace baterie MicroG GmsCore musí být zakázány, aby se zabránilo problémům. Zakázání optimalizace baterie pro MicroG nebude mít negativní vliv na spotřebu baterie. Klepněte na tlačítko Pokračovat a povolte změny optimalizace." - Pokračovat - - - Falšovat video streamy - Falšovat video streamy klienta, aby se předešlo problémům s přehráváním. - Napodobovat video streamy - "Video streamy jsou maskovány + Pokračovat + + + Falšovat video streamy + Falšovat video streamy klienta, aby se předešlo problémům s přehráváním. + Napodobovat video streamy + "Video streamy jsou maskovány Pokud jste uživatelem YouTube Premium, toto nastavení nemusí být vyžadováno." - "Video streamy nejsou falšované + "Video streamy nejsou falšované Přehrávání nemusí fungovat" - Vypnutí tohoto nastavení může způsobit problémy s přehráváním. - Výchozí klient - - - Vynutit původní jazyk zvuku - Použít původní jazyk zvuku - Používání výchozího zvuku - - Chcete-li použít tuto funkci, změňte \'Zfalšovat video streamy\' na libovolného klienta kromě Android Studia - - - Debugování - Povolit nebo zakázat debugovací možnosti - Debugovací záznamy - Debugovací záznamy jsou zapnuty - Debugovací záznamy jsou vypnuty - Protokolovat trasování zásobníku - Protokoly ladění obsahují trasování zásobníku - Ladící protokoly nezahrnují sledování zásobníku - Zobrazit oznámení v případě chyby ReVanced - Zobrazí se toast, pokud dojde k chybě - Toast se nezobrazí, pokud dojde k chybě - "Vypnutí chybových toastů skryje všechna chybová oznámení ReVanced. + Vypnutí tohoto nastavení může způsobit problémy s přehráváním. + Výchozí klient + + + Vynutit původní jazyk zvuku + Použít původní jazyk zvuku + Používání výchozího zvuku + + Chcete-li použít tuto funkci, změňte \'Zfalšovat video streamy\' na libovolného klienta kromě Android Studia + + + Debugování + Povolit nebo zakázat debugovací možnosti + Debugovací záznamy + Debugovací záznamy jsou zapnuty + Debugovací záznamy jsou vypnuty + Protokolovat trasování zásobníku + Protokoly ladění obsahují trasování zásobníku + Ladící protokoly nezahrnují sledování zásobníku + Zobrazit oznámení v případě chyby ReVanced + Zobrazí se toast, pokud dojde k chybě + Toast se nezobrazí, pokud dojde k chybě + "Vypnutí chybových toastů skryje všechna chybová oznámení ReVanced. Nebudete informováni o žádné neočekávané události." - Exportovat ladicí protokoly - Zkopíruje ladicí protokoly ReVanced do schránky - Ladění je vypnuto - Nebyly nalezeny žádné protokoly - Protokoly zkopírovány - Nepodařilo se exportovat protokoly: %s - Vymazat ladicí protokoly - Vymaže všechny uložené ladicí protokoly ReVanced - Protokoly vymazány - Příznaky funkcí Manager - Spravovat boolean příznaky funkcí - Aktivní přepínače (%d) - Zablokované přepínače (%d) - Hledat přepínače... - Přepínače uloženy - Přepínače resetovány - Přepínače zkopírovány do schránky - Záznam bufferu protokolu - Debugovací záznamy obsahují proto buffer - Debugovací záznamy neobsahují proto buffer - "Povolením tohoto nastavení se bude zaznamenávat další data rozvržení, včetně textu na obrazovce pro některé komponenty uživatelského rozhraní. + Exportovat ladicí protokoly + Zkopíruje ladicí protokoly ReVanced do schránky + Ladění je vypnuto + Nebyly nalezeny žádné protokoly + Protokoly zkopírovány + Nepodařilo se exportovat protokoly: %s + Vymazat ladicí protokoly + Vymaže všechny uložené ladicí protokoly ReVanced + Protokoly vymazány + Příznaky funkcí Manager + Spravovat boolean příznaky funkcí + Aktivní přepínače (%d) + Zablokované přepínače (%d) + Hledat přepínače... + Přepínače uloženy + Přepínače resetovány + Přepínače zkopírovány do schránky + Záznam bufferu protokolu + Debugovací záznamy obsahují proto buffer + Debugovací záznamy neobsahují proto buffer + "Povolením tohoto nastavení se bude zaznamenávat další data rozvržení, včetně textu na obrazovce pro některé komponenty uživatelského rozhraní. To může pomoci identifikovat komponenty při vytváření vlastních filtrů. Povolením této možnosti se však budou zaznamenávat i některá uživatelská data, jako je vaše IP adresa." - - - Vyčistit sdílené odkazy - Parametr sledování je odstraněn ze sdílených odkazů - Parametr sledování není odstraněn ze sdílených odkazů - Změnit odkazy pro sdílení na youtube.com - Sdílené odkazy používají youtube.com - Sdílené odkazy používají music.youtube.com - - - Vlastní filtr - Skrýt komponenty pomocí vlastních filtrů - Povolit vlastní filtr - Vlastní filtr je povolen - Vlastní filtr je zakázán - Vlastní filtr - - Seznam řetězců builderu cest komponent oddělených novým řádkem - Neplatný vlastní filtr: %s - - - - - O aplikaci - Reklamy - Alternativní náhledy - Přísun - Obecné - Přehrávač - Lišta - Ovládání gesty - Různé - Obnovit staré menu nastavení - Staré menu nastavení se zobrazují - Staré menu nastavení se nezobrazují - - - Zakázat automatické přehrávání Shorts v pozadí - Přehrávání Shorts v pozadí je zakázáno - Přehrávání Shorts v pozadí je povoleno - - - Skrýt karty alb - Karty alb jsou skryté - Karty alb jsou zobrazeny - Skrýt karty umělců - Karty umělců jsou skryty - Karty umělců se zobrazují - Skryť police \"Ďalsej videá\" - Police \"Další videá\" sa nezobrazuje - Zobrazuje sa polícia \"Další videá\" - Skrýt příspěvky komunity - Příspěvky komunity jsou skryté - Příspěvky komunity jsou zobrazeny - Skrýt kompaktní bannery - Kompaktní bannery jsou skryté - Kompaktní bannery jsou zobrazeny - Skrýt rozbalitelnou kartu - Rozbalitelná karta pod videi je skryta - Rozbalitelná karta pod videi je zobrazena - Skrýt plovoucí tlačítko mikrofonu - Plovoucí tlačítko mikrofonu ve vyhledávání je skryto - Plovoucí tlačítko mikrofonu ve vyhledávání je zobrazeno - Skrýt horizontální police - "Vodorovné police jsou skryté, například: + + + Vyčistit sdílené odkazy + Parametr sledování je odstraněn ze sdílených odkazů + Parametr sledování není odstraněn ze sdílených odkazů + Změnit odkazy pro sdílení na youtube.com + Sdílené odkazy používají youtube.com + Sdílené odkazy používají music.youtube.com + + + Vlastní filtr + Skrýt komponenty pomocí vlastních filtrů + Povolit vlastní filtr + Vlastní filtr je povolen + Vlastní filtr je zakázán + Vlastní filtr + + Seznam řetězců builderu cest komponent oddělených novým řádkem + Neplatný vlastní filtr: %s + + + + + O aplikaci + Reklamy + Alternativní náhledy + Přísun + Obecné + Přehrávač + Lišta + Ovládání gesty + Různé + Obnovit staré menu nastavení + Staré menu nastavení se zobrazují + Staré menu nastavení se nezobrazují + + + Zakázat automatické přehrávání Shorts v pozadí + Přehrávání Shorts v pozadí je zakázáno + Přehrávání Shorts v pozadí je povoleno + + + Skrýt karty alb + Karty alb jsou skryté + Karty alb jsou zobrazeny + Skrýt karty umělců + Karty umělců jsou skryty + Karty umělců se zobrazují + Skryť police \"Ďalsej videá\" + Police \"Další videá\" sa nezobrazuje + Zobrazuje sa polícia \"Další videá\" + Skrýt příspěvky komunity + Příspěvky komunity jsou skryté + Příspěvky komunity jsou zobrazeny + Skrýt kompaktní bannery + Kompaktní bannery jsou skryté + Kompaktní bannery jsou zobrazeny + Skrýt rozbalitelnou kartu + Rozbalitelná karta pod videi je skryta + Rozbalitelná karta pod videi je zobrazena + Skrýt plovoucí tlačítko mikrofonu + Plovoucí tlačítko mikrofonu ve vyhledávání je skryto + Plovoucí tlačítko mikrofonu ve vyhledávání je zobrazeno + Skrýt horizontální police + "Vodorovné police jsou skryté, například: • Nejnovější zprávy • Pokračovat ve sledování • Prozkoumat další kanály • Nejdůležitější • Nakupování • Znovu zhlédnout" - Horizontální police jsou zobrazeny - Skrýt obrázkovou poličku - Obrázková polička ve výsledcích vyhledávání je skryta - Obrázková polička ve výsledcích vyhledávání je zobrazena - Skrýt nejnovější příspěvky - Nejnovější příspěvky jsou skryty - Nejnovější příspěvky jsou zobrazeny - Skrýt seznamy přehrávání Mix - Mix seznamy skladeb jsou skryty - Mix seznamy skladeb se zobrazují - Skrýt sekci Filmy - Sekce Filmy je skrytá - Sekce Filmy je viditelná - - Skrýt tlačitko \'Upozorněte mě\' - Tlačítko \"Upozornit mě\" je skryto - Tlačítko \"Upozornit mě\" je zobrazeno - Skrýt Playables - Playables jsou skryté - Přehrávání se zobrazuje - - Skrýt tlačítko „Zobrazit více“ - Tlačítko \"Zobrazit více\" ve výsledcích vyhledávání je skryto - Tlačítko \"Zobrazit více\" ve výsledcích vyhledávání je zobrazeno - Skrýt průzkumy - Průzkumy jsou skryté - Průzkumy jsou zobrazené - Skrýt panel Vstupenek - Panel Vstupenek je skrytý - Panel Vstupenek je zobrazen - - Skrýt štítky doporučení videí - Štítky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ ve výsledcích vyhledávání jsou skryty - Štítky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ ve výsledcích vyhledávání jsou zobrazeny - Skrýt vizuální oddělovač - Vizuální oddělovač je skryt - Vizuální oddělovač je zobrazen - - Skrýt YouTube Doodles - Animace \"Doodles\" YouTube na logu je skryta - Animace YouTube Doodles na logu je zobrazena - "YouTube Doodles se zobrazují několik dní v roce. + Skrýt tlačítko „Zobrazit více“ + Tlačítko \"Zobrazit více\" ve výsledcích vyhledávání je skryto + Tlačítko \"Zobrazit více\" ve výsledcích vyhledávání je zobrazeno + Skrýt průzkumy + Průzkumy jsou skryté + Průzkumy jsou zobrazené + Skrýt panel Vstupenek + Panel Vstupenek je skrytý + Panel Vstupenek je zobrazen + + Skrýt štítky doporučení videí + Štítky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ ve výsledcích vyhledávání jsou skryty + Štítky „Lidé také sledovali“ a „Mohlo by se vám také líbit“ ve výsledcích vyhledávání jsou zobrazeny + Skrýt vizuální oddělovač + Vizuální oddělovač je skryt + Vizuální oddělovač je zobrazen + + Skrýt YouTube Doodles + Animace \"Doodles\" YouTube na logu je skryta + Animace YouTube Doodles na logu je zobrazena + "YouTube Doodles se zobrazují několik dní v roce. Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení skrytí je zapnuto, bude také skrytý panel s filtry pod vyhledávacím panelem." - Skrýt lištu kanálu - Lišta kanálu je skrytá - Lišta kanálu je zobrazena - Skrýt vodoznak kanálu - Vodoznak kanálu je skrytý - Vodoznak je zobrazen - Skrýt pole krátkých videí - Pole krátkých videí je skryté - Pole krátkých videí se zobrazuje - Skrýt nouzová pole - Nouzová pole jsou skrytá - Nouzová pole jsou zobrazena - Skrýt informační panely - Informační panely jsou skryté - Informační panely jsou zobrazeny - - Skrýt tlačítko Připojit se - Tlačítko \"Připojit se\" je skryto - Tlačítko \"Připojit se\" je zobrazeno - Skrýt informační panely o zdravotnictví - Informační panely o zdravotnictví jsou skryty - Informační panely o zdravotnictví jsou zobrazeny - Skrýt rychlé akce - Rychlé akce na celé obrazovce jsou skryty - Rychlé akce na celé obrazovce jsou zobrazeny - Skrýt související videa - Související videa v rychlých akcích jsou skryta - Související videa v rychlých akcích jsou zobrazena - Skrýt pokyny pro odběratele - Pokyny pro komunitu předplatitelů jsou skryté - Pokyny pro komunitu odběratelů se zobrazují - Skrýt reakce zobrazené po čase - Reakce zobrazené po čase jsou skryty - Reakce se zobrazují po čase - Skrýt „Souhrn videa generovaný pomocí AI“ - Sekce souhrnu videa generovaná AI je skryta - Sekce se souhrnem videa generovaným umělou inteligencí je zobrazena - Skrýt sekci Zeptat se - Sekce Zeptat se je skrytá - Sekce Zeptat se je zobrazena - Skrýt atributy - Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou skryté - Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou zobrazené - Skrýt kapitoly - Sekcja Rozdziały jest ukryta - Sekcja Rozdziały jest widoczna - Skrýt „Jak tento obsah vznikl“ - Sekce Jak tento obsah vznikl je skrytá - Sekce Jak tento obsah vznikl je zobrazena - Skrýt Hype body - Hype body jsou skryté - Hype body jsou zobrazené - Skrýt „Prozkoumat podcast“ - Sekce Prozkoumat podcast je skrytá - Sekce Prozkoumat podcast je zobrazena - Skrýt doporučené odkazy - Sekce doporučených odkazů je skrytá - Sekce doporučených odkazů je zobrazena - Skrýt doporučená videa - Sekce doporučených videí je skrytá - Sekce doporučených videí je zobrazena - Skrýt informační karty - Sekce informačních karet je skrytá - Sekce informačních karet je zobrazena - Skrýt „Klíčové koncepty“ - Sekce Klíčové koncepty je skrytá - Sekce Klíčové koncepty je zobrazena - Skrýt tlačítko Odebírat - Tlačítko Odebírat je skryté - Tlačítko Odebírat je zobrazeno - Skrýt přepis - Sekce přepisu je skrytá - Sekce přepisu je zobrazena - Popis videa - Skrýt nebo zobrazit komponenty popisu videa - Lišta filtrů - Skrýt nebo zobrazit lištu filtru ve zdrojích, souvisejících videích, výsledcích vyhledávání a historii sledování - Skrýt v kanálech - Skryto v kanálech - Zobrazeno v kanálech - Skrýt v souvisejících videích - V souvisejících videích skryto - V souvisejících videích zobrazeno - Skrýt ve výsledcích vyhledávání - Skryto ve výsledcích vyhledávání - Zobrazeno ve výsledcích vyhledávání - Skrýt v historii sledování - Skryto v historii sledování - Zobrazeno v historii sledování - Stránka kanálu - Skrýt nebo zobrazit komponenty stránky kanálu - - Skrýt tlačítko Komunita - Tlačítko Komunita je skryto - Tlačítko Komunita je zobrazeno - - Skrýt panel „Pro vás“ - Polička Pro vás je skryta - Polička Pro vás je zobrazena - - Skrýt tlačítko Připojit se - Tlačítko Připojit se je skryto - Tlačítko Připojit se je zobrazeno - Skrýt náhled odkazů - Náhled odkazů je skryt - Náhled odkazů je zobrazen - Skrýt poličku členů - Polička členů je skryta - Police pro členy je zobrazena - - Skrýt tlačítko Obchod - Tlačítko Obchod je skryto - Tlačítko Obchod je zobrazeno - - Skrýt tlačítko Odebírat - Tlačítko Odebírat je skryto - Tlačítko Odebírat je zobrazeno - Komentáře - Skrýt nebo zobrazit komponenty sekce komentářů - Skrýt souhrn chatu s AI - Souhrn chatu s AI je skryt - Souhrn chatu s AI je zobrazen - Skrýt souhrn komentářů AI - Souhrn komentářů AI je skryt - Souhrn komentářů AI je zobrazen - Skrýt pravidla kanálu - Pokyny ke kanálu jsou skryty - Pokyny ke kanálu jsou zobrazeny - Skrýt záhlaví \"Komentáře od členů\" - Záhlaví Komentáře od členů je skryto - Záhlaví Komentáře od členů je zobrazeno - Skrýt sekci komentářů - Sekce komentářů je skrytá - Sekce komentářů je zobrazena - Skrýt pokyny pro komunitu - Pravidla komunity jsou skryta - Pravidla komunity jsou zobrazena - Skrýt tlačítko \"Vytvořit Short\" - Tlačítko Vytvořit Short je skryté - Tlačítko Vytvořit Short je zobrazeno - Skrýt tlačítka emotikonů a časových značek - Tlačítka emotikonů a časových značek jsou skryta - Tlačítka emotikonů a časových značek jsou zobrazena - Skrýt náhled komentáře - Náhled komentáře je skryt - Náhled komentáře je zobrazen - Skrýt tlačítko děk」、「 - Tlačítko poděkování je skryto - Tlačítko poděkování je zobrazeno - Skrýt počet zhlédnutí - Počet zhlédnutí je skrytý ve zdroji a výsledcích vyhledávání - Počet zhlédnutí je zobrazený ve zdroji a výsledcích vyhledávání - - "Omezení: + Skrýt tlačítko Připojit se + Tlačítko \"Připojit se\" je skryto + Tlačítko \"Připojit se\" je zobrazeno + Skrýt informační panely o zdravotnictví + Informační panely o zdravotnictví jsou skryty + Informační panely o zdravotnictví jsou zobrazeny + Skrýt rychlé akce + Rychlé akce na celé obrazovce jsou skryty + Rychlé akce na celé obrazovce jsou zobrazeny + Skrýt související videa + Související videa v rychlých akcích jsou skryta + Související videa v rychlých akcích jsou zobrazena + Skrýt pokyny pro odběratele + Pokyny pro komunitu předplatitelů jsou skryté + Pokyny pro komunitu odběratelů se zobrazují + Skrýt reakce zobrazené po čase + Reakce zobrazené po čase jsou skryty + Reakce se zobrazují po čase + Skrýt „Souhrn videa generovaný pomocí AI“ + Sekce souhrnu videa generovaná AI je skryta + Sekce se souhrnem videa generovaným umělou inteligencí je zobrazena + Skrýt sekci Zeptat se + Sekce Zeptat se je skrytá + Sekce Zeptat se je zobrazena + Skrýt atributy + Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou skryté + Sekce Doporučená místa, Hry, Hudba a Zmínění lidé jsou zobrazené + Skrýt kapitoly + Sekcja Rozdziały jest ukryta + Sekcja Rozdziały jest widoczna + Skrýt „Jak tento obsah vznikl“ + Sekce Jak tento obsah vznikl je skrytá + Sekce Jak tento obsah vznikl je zobrazena + Skrýt Hype body + Hype body jsou skryté + Hype body jsou zobrazené + Skrýt „Prozkoumat podcast“ + Sekce Prozkoumat podcast je skrytá + Sekce Prozkoumat podcast je zobrazena + Skrýt doporučené odkazy + Sekce doporučených odkazů je skrytá + Sekce doporučených odkazů je zobrazena + Skrýt doporučená videa + Sekce doporučených videí je skrytá + Sekce doporučených videí je zobrazena + Skrýt informační karty + Sekce informačních karet je skrytá + Sekce informačních karet je zobrazena + Skrýt „Klíčové koncepty“ + Sekce Klíčové koncepty je skrytá + Sekce Klíčové koncepty je zobrazena + Skrýt tlačítko Odebírat + Tlačítko Odebírat je skryté + Tlačítko Odebírat je zobrazeno + Skrýt přepis + Sekce přepisu je skrytá + Sekce přepisu je zobrazena + Popis videa + Skrýt nebo zobrazit komponenty popisu videa + Lišta filtrů + Skrýt nebo zobrazit lištu filtru ve zdrojích, souvisejících videích, výsledcích vyhledávání a historii sledování + Skrýt v kanálech + Skryto v kanálech + Zobrazeno v kanálech + Skrýt v souvisejících videích + V souvisejících videích skryto + V souvisejících videích zobrazeno + Skrýt ve výsledcích vyhledávání + Skryto ve výsledcích vyhledávání + Zobrazeno ve výsledcích vyhledávání + Skrýt v historii sledování + Skryto v historii sledování + Zobrazeno v historii sledování + Stránka kanálu + Skrýt nebo zobrazit komponenty stránky kanálu + + Skrýt tlačítko Komunita + Tlačítko Komunita je skryto + Tlačítko Komunita je zobrazeno + + Skrýt panel „Pro vás“ + Polička Pro vás je skryta + Polička Pro vás je zobrazena + + Skrýt tlačítko Připojit se + Tlačítko Připojit se je skryto + Tlačítko Připojit se je zobrazeno + Skrýt náhled odkazů + Náhled odkazů je skryt + Náhled odkazů je zobrazen + Skrýt poličku členů + Polička členů je skryta + Police pro členy je zobrazena + + Skrýt tlačítko Obchod + Tlačítko Obchod je skryto + Tlačítko Obchod je zobrazeno + + Skrýt tlačítko Odebírat + Tlačítko Odebírat je skryto + Tlačítko Odebírat je zobrazeno + Komentáře + Skrýt nebo zobrazit komponenty sekce komentářů + Skrýt souhrn chatu s AI + Souhrn chatu s AI je skryt + Souhrn chatu s AI je zobrazen + Skrýt souhrn komentářů AI + Souhrn komentářů AI je skryt + Souhrn komentářů AI je zobrazen + Skrýt pravidla kanálu + Pokyny ke kanálu jsou skryty + Pokyny ke kanálu jsou zobrazeny + Skrýt záhlaví \"Komentáře od členů\" + Záhlaví Komentáře od členů je skryto + Záhlaví Komentáře od členů je zobrazeno + Skrýt sekci komentářů + Sekce komentářů je skrytá + Sekce komentářů je zobrazena + Skrýt pokyny pro komunitu + Pravidla komunity jsou skryta + Pravidla komunity jsou zobrazena + Skrýt tlačítko \"Vytvořit Short\" + Tlačítko Vytvořit Short je skryté + Tlačítko Vytvořit Short je zobrazeno + Skrýt tlačítka emotikonů a časových značek + Tlačítka emotikonů a časových značek jsou skryta + Tlačítka emotikonů a časových značek jsou zobrazena + Skrýt náhled komentáře + Náhled komentáře je skryt + Náhled komentáře je zobrazen + Skrýt tlačítko děk」、「 + Tlačítko poděkování je skryto + Tlačítko poděkování je zobrazeno + Skrýt počet zhlédnutí + Počet zhlédnutí je skrytý ve zdroji a výsledcích vyhledávání + Počet zhlédnutí je zobrazený ve zdroji a výsledcích vyhledávání + + "Omezení: • Police Shorts, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat počty zhlédnutí • Tato funkce nefunguje s automobilovým provedením" - Skrýt čas nahrání - Čas nahrání je skryt ve feedu a výsledcích vyhledávání - Čas nahrání je zobrazen ve feedu a výsledcích vyhledávání - - "Omezení: + Skrýt čas nahrání + Čas nahrání je skryt ve feedu a výsledcích vyhledávání + Čas nahrání je zobrazen ve feedu a výsledcích vyhledávání + + "Omezení: • Police Shorts, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat časy nahrání • Tato funkce nefunguje s automobilovým provedením" - Skrýt obsah s klíčovými slovy - Skrýt videa ve vyhledávání a feedu pomocí filtrů klíčových slov - Skrýt domácí videa podle klíčových slov - Videa na kartě domov jsou filtrována podle klíčových slov - Videa na kartě domov nejsou filtrována podle klíčových slov - Skrýt výsledky vyhledávání podle klíčových slov - Výsledky vyhledávání jsou filtrovány podle klíčových slov - Výsledky vyhledávání nejsou filtrovány podle klíčových slov - Skrýt videa z odběrů podle klíčových slov - Videa na kartě odběrů jsou filtrována podle klíčových slov - Videa na kartě odběrů nejsou filtrována podle klíčových slov - Klíčová slova ke skrytí - - "Klíčová slova a fráze, které mají být skryty, oddělené novými řádky + "Klíčová slova a fráze, které mají být skryty, oddělené novými řádky Klíčová slova mohou být názvy kanálů nebo jakýkoli text zobrazený v názvech videí Slova s velkými písmeny na začátku musí být zadána s velkými písmeny (např.: iPhone, TikTok, LeBlanc)" - O filtrování klíčových slov - "Výsledky vyhledávání Domů/Přihlášení/ jsou filtrovány tak, aby se skryl obsah, který odpovídá klíčovým frázím + O filtrování klíčových slov + "Výsledky vyhledávání Domů/Přihlášení/ jsou filtrovány tak, aby se skryl obsah, který odpovídá klíčovým frázím Omezení: • Krátká videa nelze skrýt podle názvu kanálu • Některé komponenty uživatelského rozhraní nemusí být skryty • Hledání klíčového slova nemusí zobrazit žádné výsledky" - Hledat shodu v celých slovech - - Zaokrouhlení klíčového slova/fráze s dvojitými uvozovkami zabrání částečným shodám s názvy videí a kanálů<br><br>Například<br><b>\"ai\"</b> skryje video: <b>How does AI work?</b><br>, ale nebude skrýt: <b>What does fair use mean?</b> - - Nelze použít klíčové slovo: %s - Přidejte uvozovky k použití klíčového slova: %s - Klíčové slovo má konfliktní deklarace: %s - Klíčové slovo je příliš krátké a vyžaduje uvozovky: %s - Klíčové slovo skryje všechna videa: %s - - - Skrýt poličku obchodu tvůrce - Police s obchodem tvůrce pod přehrávačem videa je skryta - Police obchodu pro tvůrce pod přehrávačem videa je zobrazena - Skrýt koncový banner obchodu - Banner obchodu na závěrečné obrazovce je skryt - Banner obchodu na závěrečné obrazovce je zobrazen - Skrýt celostránkové reklamy - "Celoobrazovkové reklamy jsou skryty + Hledat shodu v celých slovech + + Zaokrouhlení klíčového slova/fráze s dvojitými uvozovkami zabrání částečným shodám s názvy videí a kanálů<br><br>Například<br><b>\"ai\"</b> skryje video: <b>How does AI work?</b><br>, ale nebude skrýt: <b>What does fair use mean?</b> + + Nelze použít klíčové slovo: %s + Přidejte uvozovky k použití klíčového slova: %s + Klíčové slovo má konfliktní deklarace: %s + Klíčové slovo je příliš krátké a vyžaduje uvozovky: %s + Klíčové slovo skryje všechna videa: %s + + + Skrýt poličku obchodu tvůrce + Police s obchodem tvůrce pod přehrávačem videa je skryta + Police obchodu pro tvůrce pod přehrávačem videa je zobrazena + Skrýt koncový banner obchodu + Banner obchodu na závěrečné obrazovce je skryt + Banner obchodu na závěrečné obrazovce je zobrazen + Skrýt celostránkové reklamy + "Celoobrazovkové reklamy jsou skryty Tato funkce je dostupná pouze pro starší zařízení" - Celostránkové reklamy jsou zobrazeny - - Blokování reklam na celou obrazovku je funkční pouze na starších zařízeních - Skrýt běžné reklamy - Běžné reklamy jsou skryty - Běžné reklamy jsou zobrazeny - Skrýt reklamní bannery - Merchandise bannery jsou skryty - Merchandise bannery jsou zobrazeny - Skrýt štítek placené propagace - Štítek placené propagace je skryt - Štítek placené propagace je zobrazen - Skrýt karty se sponzorovanými produkty - Karty se sponzorovanými produkty jsou skryty - Karty se sponzorovanými produkty jsou zobrazeny - Skrýt nákupní odkazy - Nákupní odkazy v popisu videa jsou skryty - Nákupní odkazy v popisu videa jsou zobrazeny - Skrýt banner „Zobrazit produkty“ - Banner \"Zobrazit produkty\" v překrytí videa je skryt - Banner \"Zobrazit produkty\" v překrytí videa je zobrazen - Skryté webové výsledky vyhledávání - Webové výsledky vyhledávání jsou skryté - Webové výsledky vyhledávání jsou zobrazeny - - - Skrýt nabídky YouTube Premium - Nabídky YouTube Premium pod videem jsou skryty - Nabídky YouTube Premium pod videem jsou zobrazeny - - - Skrýt reklamy ve videu - Reklamy ve videu jsou skryty - Reklamy ve videu jsou zobrazeny - - - URL zkopírováno do schránky - Adresa URL s časovým razítkem zkopírována - Zobrazit tlačítko pro kopírování adresy URL videa - Tlačítko Kopírovat URL videa je zobrazeno. Klepnutím zkopírujete URL videa. Klepnutím a podržením zkopírujete s časovou značkou - Tlačítko Kopírovat URL videa není zobrazeno - Zobrazit tlačítko pro kopírování adresy URL videa s časovým razítkem - Tlačítko Kopírovat URL s časovou značkou je zobrazeno. Klepnutím zkopírujete URL videa s časovou značkou. Klepnutím a podržením zkopírujete bez časové značky - Tlačítko Kopírovat URL s časovou značkou není zobrazeno - - - Odstranit dialog s upozorněním na věkové omezení - Dialog bude odstraněn - Dialog bude zobrazen - Tímto krokem neobcházíte věkové omezení. Pouze jej automaticky akceptujete. - - - Zakázat vyskakovací okno „Přihlásit se k televizi“ - Vyskakovací okno Přihlásit se k televizi je zakázáno - Vyskakovací okno Přihlásit se k televizi je povoleno - - - Zakázat přeskočení kapitoly dvojitým klepnutím - Dvojité klepnutí nikdy nespustí přeskočení na další/předchozí kapitolu - Dvojité klepnutí může občas spustit přeskočení na další/předchozí kapitolu - - - Externí stahování - Nastavení pro použití externího stahování - Zobrazit tlačítko pro externí stahování - Tlačítko stahování v přehrávači je zobrazeno - Tlačítko stahování v přehrávači není zobrazeno - - Přepsat tlačítko akce Stahování - Tlačítko pro stahování otevře váš externí stahovač - Tlačítko pro stahování otevře nativní stahovač v aplikaci - Název balíčku stahovače - Název balíčku vaší nainstalované externí aplikace pro stahování - Zadejte název balíčku - Jiné - Aplikace není nainstalována - %s není nainstalováno. Prosím, nainstalujte. - "Nepodařilo se najít nainstalovanou aplikaci s názvem balíčku: %s + Celostránkové reklamy jsou zobrazeny + + Blokování reklam na celou obrazovku je funkční pouze na starších zařízeních + Skrýt běžné reklamy + Běžné reklamy jsou skryty + Běžné reklamy jsou zobrazeny + Skrýt reklamní bannery + Merchandise bannery jsou skryty + Merchandise bannery jsou zobrazeny + Skrýt štítek placené propagace + Štítek placené propagace je skryt + Štítek placené propagace je zobrazen + Skrýt karty se sponzorovanými produkty + Karty se sponzorovanými produkty jsou skryty + Karty se sponzorovanými produkty jsou zobrazeny + Skrýt nákupní odkazy + Nákupní odkazy v popisu videa jsou skryty + Nákupní odkazy v popisu videa jsou zobrazeny + Skrýt banner „Zobrazit produkty“ + Banner \"Zobrazit produkty\" v překrytí videa je skryt + Banner \"Zobrazit produkty\" v překrytí videa je zobrazen + Skryté webové výsledky vyhledávání + Webové výsledky vyhledávání jsou skryté + Webové výsledky vyhledávání jsou zobrazeny + + + Skrýt nabídky YouTube Premium + Nabídky YouTube Premium pod videem jsou skryty + Nabídky YouTube Premium pod videem jsou zobrazeny + + + Skrýt reklamy ve videu + Reklamy ve videu jsou skryty + Reklamy ve videu jsou zobrazeny + + + URL zkopírováno do schránky + Adresa URL s časovým razítkem zkopírována + Zobrazit tlačítko pro kopírování adresy URL videa + Tlačítko Kopírovat URL videa je zobrazeno. Klepnutím zkopírujete URL videa. Klepnutím a podržením zkopírujete s časovou značkou + Tlačítko Kopírovat URL videa není zobrazeno + Zobrazit tlačítko pro kopírování adresy URL videa s časovým razítkem + Tlačítko Kopírovat URL s časovou značkou je zobrazeno. Klepnutím zkopírujete URL videa s časovou značkou. Klepnutím a podržením zkopírujete bez časové značky + Tlačítko Kopírovat URL s časovou značkou není zobrazeno + + + Odstranit dialog s upozorněním na věkové omezení + Dialog bude odstraněn + Dialog bude zobrazen + Tímto krokem neobcházíte věkové omezení. Pouze jej automaticky akceptujete. + + + Zakázat vyskakovací okno „Přihlásit se k televizi“ + Vyskakovací okno Přihlásit se k televizi je zakázáno + Vyskakovací okno Přihlásit se k televizi je povoleno + + + Zakázat přeskočení kapitoly dvojitým klepnutím + Dvojité klepnutí nikdy nespustí přeskočení na další/předchozí kapitolu + Dvojité klepnutí může občas spustit přeskočení na další/předchozí kapitolu + + + Externí stahování + Nastavení pro použití externího stahování + Zobrazit tlačítko pro externí stahování + Tlačítko stahování v přehrávači je zobrazeno + Tlačítko stahování v přehrávači není zobrazeno + + Přepsat tlačítko akce Stahování + Tlačítko pro stahování otevře váš externí stahovač + Tlačítko pro stahování otevře nativní stahovač v aplikaci + Název balíčku stahovače + Název balíčku vaší nainstalované externí aplikace pro stahování + Zadejte název balíčku + Jiné + Aplikace není nainstalována + %s není nainstalováno. Prosím, nainstalujte. + "Nepodařilo se najít nainstalovanou aplikaci s názvem balíčku: %s Zkontrolujte, zda je název balíčku správný a aplikace je nainstalována" - Název balíčku nemůže být prázdný - - - Zakázat gesto pro přesné hledání - Gesto je zakázáno - Gesto je povoleno - - - Povolit klepnutím přejít na - Klepnutím aktivujete vyhledávání - Klepnutím přejít na je zakázané - - - Povolit gesto pro jas - "Potažení jasu na celou obrazovku je povoleno + Název balíčku nemůže být prázdný + + + Zakázat gesto pro přesné hledání + Gesto je zakázáno + Gesto je povoleno + + + Povolit klepnutím přejít na + Klepnutím aktivujete vyhledávání + Klepnutím přejít na je zakázané + + + Povolit gesto pro jas + "Potažení jasu na celou obrazovku je povoleno Upravte jas přejetím svisle po levé straně obrazovky" - Potažení jasu na celou obrazovku je zakázáno - Povolit gesto pro hlasitost - "Přejetím prstem na celou obrazovku je povoleno + Potažení jasu na celou obrazovku je zakázáno + Povolit gesto pro hlasitost + "Přejetím prstem na celou obrazovku je povoleno Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" - Přejetí prstem na celou obrazovku je zakázáno - Povolit gesto stisknutím pro přejetí - Stisknutím pro přejetí je povoleno - Stisknutím pro přejetí je zakázáno - Povolit haptickou odezvu - Haptická odezva je povolena - Haptická odezva je zakázána - Uložit a obnovit jas - Uložit a obnovit jas při vstupu nebo výstupu z celoobrazovkového režimu - Neukládat a neobnovovat jas při vstupu nebo výstupu z celoobrazovkového režimu - Povolit gesto pro automatický jas - Přejetím dolů na nejnižší hodnotu gesta pro jas aktivujete automatický jas - Přejetím dolů na nejnižší hodnotu neaktivujete automatický jas - Automaticky - Timeout překrytí gesta - Doba v milisekundách, po kterou je překrytí viditelné - Průsvitnost pozadí překrytí tažením - Hodnota průsvitnosti mezi 0-100 - Průsvitnost tažení musí být mezi 0-100 - Barva jasu překryvné vrstvy tažení - Barva ukazatele průběhu pro ovládání jasu - Barva hlasitosti překryvné vrstvy tažení - Barva ukazatele průběhu pro ovládání hlasitosti - Velikost textu překrytí přejetím - Velikost textu překrytí přejetím mezi 1–30 - Velikost textu musí být mezi 1–30 - Práh vynucení gesta - Velikost prahu pro provedení gesta - Citlivost přejetí hlasitosti - O kolik se změní hlasitost na jedno přejetí - Styl překrytí přejetím - Vodorovné překrytí - Vodorovné překrytí (minimalistické – nahoře) - Vodorovné překrytí (minimalistické – uprostřed) - Kruhové překrytí - Kruhové překrytí (minimalistické) - Svislé překrytí - Svislé překrytí (minimalistické) - Povolit přejetí prstem pro změnu videa - Přejetí prstem v režimu celé obrazovky změní video na další/předchozí - Přejetí prstem v režimu celé obrazovky nebude video měnit na další/předchozí - - - Zakázat automatické titulky - Automatické titulky jsou zakázány - Automatické titulky jsou povoleny - - - Akční tlačítka - Skrýt nebo zobrazit tlačítka pod videi - Deaktivovat zvýraznění tlačítek Like a Subscribe - Tlačítka Like a Subscribe po zmínce nebudou zvýrazněna - Tlačítka Like a Subscribe po zmínce budou zvýrazněna - Skrýt Like a Dislike - Tlačítka Like a Dislike jsou skryta - Tlačítka Like a Dislike jsou zobrazena - - Skrýt Sdílení - Tlačítko Sdílení je skryto - Tlačítko Sdílení je zobrazeno - - Skrýt Zastavit reklamy - Tlačítko pro zastavení reklam je skryté - Tlačítko pro zastavení reklam je zobrazeno - - Skrýt komentáře - Tlačítko komentářů je skryto - Tlačítko komentářů je zobrazeno - + Skrýt Sdílení + Tlačítko Sdílení je skryto + Tlačítko Sdílení je zobrazeno + + Skrýt Zastavit reklamy + Tlačítko pro zastavení reklam je skryté + Tlačítko pro zastavení reklam je zobrazeno + + Skrýt komentáře + Tlačítko komentářů je skryto + Tlačítko komentářů je zobrazeno + - Skrýt Nahlásit - Tlačítko Nahlásit je skryto - Tlačítko Nahlásit je zobrazeno - - Skrýt Remix - Tlačítko Remix je skryto - Tlačítko Remix je zobrazeno - - Skrýt Stáhnout - Tlačítko Stáhnout je skryto - Tlačítko Stáhnout je zobrazeno - + Skrýt Remix + Tlačítko Remix je skryto + Tlačítko Remix je zobrazeno + + Skrýt Stáhnout + Tlačítko Stáhnout je skryto + Tlačítko Stáhnout je zobrazeno + - Skrýt Hype - Tlačítko Hype je skryto - Tlačítko Hype je zobrazeno - - Skrýt propagaci - Tlačítko Propagovat je skryto - Tlačítko Propagovat je zobrazeno - - Skrýt Poděkování - Tlačítko Poděkování je skryto - Tlačítko Poděkování je zobrazeno - + Skrýt propagaci + Tlačítko Propagovat je skryto + Tlačítko Propagovat je zobrazeno + + Skrýt Poděkování + Tlačítko Poděkování je skryto + Tlačítko Poděkování je zobrazeno + - Skrýt Zeptat se - Tlačítko Zeptat se je skryté - Tlačítko Zeptat se je zobrazeno - - Skrýt Klip - Tlačítko Klip je skryto - Tlačítko Klip je zobrazeno - - Skrýt Obchod - Tlačítko Obchod je skryté - Tlačítko Obchod je zobrazené - - Skrýt Uložit - Tlačítko Uložit je skryté - Tlačítko Uložit je zobrazeno - - - Navigační tlačítka - Skrýt nebo změnit tlačítka na navigačním panelu - - Skrýt Domov - Tlačítko Domov je skryto - Tlačítko Domov je zobrazeno - - Skrýt Shorts - Tlačítko \"Shorts\" je skryté - Tlačítko \"Shorts\" je viditelné - - Skrýt Vytvořit - Tlačítko Vytvořit je skryto - Tlačítko Vytvořit je zobrazeno - - Skrýt Odběry - Tlačítko Odběry je skryto - Tlačítko Odběry je zobrazeno - Skrýt oznámení - Tlačítko oznámení je skryto - Tlačítko oznámení je zobrazeno - - Zaměnit Vytvořit s Oznámeními - "Tlačítko Vytvořit se přepne s tlačítkem Oznámení + Skrýt Zeptat se + Tlačítko Zeptat se je skryté + Tlačítko Zeptat se je zobrazeno + + Skrýt Klip + Tlačítko Klip je skryto + Tlačítko Klip je zobrazeno + + Skrýt Obchod + Tlačítko Obchod je skryté + Tlačítko Obchod je zobrazené + + Skrýt Uložit + Tlačítko Uložit je skryté + Tlačítko Uložit je zobrazeno + + + Navigační tlačítka + Skrýt nebo změnit tlačítka na navigačním panelu + + Skrýt Domov + Tlačítko Domov je skryto + Tlačítko Domov je zobrazeno + + Skrýt Shorts + Tlačítko \"Shorts\" je skryté + Tlačítko \"Shorts\" je viditelné + + Skrýt Vytvořit + Tlačítko Vytvořit je skryto + Tlačítko Vytvořit je zobrazeno + + Skrýt Odběry + Tlačítko Odběry je skryto + Tlačítko Odběry je zobrazeno + Skrýt oznámení + Tlačítko oznámení je skryto + Tlačítko oznámení je zobrazeno + + Zaměnit Vytvořit s Oznámeními + "Tlačítko Vytvořit se přepne s tlačítkem Oznámení Poznámka: Povolení této funkce také vynuceně skryje video reklamy" - Tlačítko Vytvořit není zaměněno s tlačítkem Oznámení - "Zakázáním tohoto nastavení také zakážete blokování reklam u položek Shorts. + Tlačítko Vytvořit není zaměněno s tlačítkem Oznámení + "Zakázáním tohoto nastavení také zakážete blokování reklam u položek Shorts. Pokud změna tohoto nastavení nemá žádný účinek, zkuste přepnout do režimu anonymního prohlížení." - Skrýt štítky navigačních tlačítek - Štítky jsou skryty - Štítky jsou zobrazeny - Deaktivovat průsvitný stavový řádek - Statusový řádek je neprůhledný - Statusový řádek je neprůhledný nebo průsvitný - Na některých zařízeních může aktivace této funkce změnit navigační lištu systému na průhlednou. - Deaktivovat světlý průsvitný navigační panel - Navigační panel v světlém režimu je neprůhledný - Navigační lišta v světlém režimu je neprůhledná nebo průsvitná - Zakázat tmavý průsvitný panel - Navigační panel v tmavém režimu je neprůhledný - Navigační lišta v tmavém režimu je neprůhledná nebo průsvitná - - - Menu vyskakovacích oken - Skrýt nebo zobrazit položky menu vyskakovacích oken přehrávače - - Skrýt Titulky - Menu Titulky je skryto - Menu Titulky je zobrazeno - - Skrýt Další nastavení - Menu Další nastavení je skryto - Menu Další nastavení je zobrazeno - - Skrýt Časovač vypnutí - Menu Časovač vypnutí je skryto - Menu Časovač vypnutí je zobrazeno - - Skrýt Opakování videa - Menu Opakování videa je skryto - Menu Opakování videa je zobrazeno - - Skrýt Režim Ambient - Menu Režim Ambient je skryto - Menu Režim Ambient je zobrazeno - Skrýt Stabilní hlasitost - Menu Stabilní hlasitost je zobrazeno - Menu Stabilní hlasitost je skryto - - Skrýt Nápověda & zpětná vazba - Menu Nápověda & zpětná vazba je skryto - Menu Nápověda & zpětná vazba je zobrazeno - - Skrýt Rychlost přehrávání - Menu Rychlost přehrávání je skryto - Menu Rychlost přehrávání je zobrazeno - - Skrýt Zamknout obrazovku - Menu Zamknout obrazovku je skryto - Menu Zamknout obrazovku je zobrazeno - - Skrýt Poslouchat v YouTube Music - Nabídka Poslouchat v YouTube Music je skrytá - Nabídka Poslouchat v YouTube Music je zobrazena - - Skrýt Zvuková stopa - Menu Zvuková stopa je skryto - Menu Zvuková stopa je zobrazeno - + Skrýt Titulky + Menu Titulky je skryto + Menu Titulky je zobrazeno + + Skrýt Další nastavení + Menu Další nastavení je skryto + Menu Další nastavení je zobrazeno + + Skrýt Časovač vypnutí + Menu Časovač vypnutí je skryto + Menu Časovač vypnutí je zobrazeno + + Skrýt Opakování videa + Menu Opakování videa je skryto + Menu Opakování videa je zobrazeno + + Skrýt Režim Ambient + Menu Režim Ambient je skryto + Menu Režim Ambient je zobrazeno + Skrýt Stabilní hlasitost + Menu Stabilní hlasitost je zobrazeno + Menu Stabilní hlasitost je skryto + + Skrýt Nápověda & zpětná vazba + Menu Nápověda & zpětná vazba je skryto + Menu Nápověda & zpětná vazba je zobrazeno + + Skrýt Rychlost přehrávání + Menu Rychlost přehrávání je skryto + Menu Rychlost přehrávání je zobrazeno + + Skrýt Zamknout obrazovku + Menu Zamknout obrazovku je skryto + Menu Zamknout obrazovku je zobrazeno + + Skrýt Poslouchat v YouTube Music + Nabídka Poslouchat v YouTube Music je skrytá + Nabídka Poslouchat v YouTube Music je zobrazena + + Skrýt Zvuková stopa + Menu Zvuková stopa je skryto + Menu Zvuková stopa je zobrazeno + - "Nabídka zvukových stop je skryta + "Nabídka zvukových stop je skryta Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy\" na \"Android No SDK\"" - - Skrýt Sledovat ve VR - Menu Sledovat ve VR je skryto - Menu Sledovat ve VR je zobrazeno - Skrýt nabídku kvality videa - Nabídka kvality videa je skryta - Nabídka kvality videa je zobrazena - Skrýt zápatí menu kvality videa - Zápatí menu kvality videa je skryto - Zápatí menu kvality videa je zobrazeno - - - Skrýt tlačítko Automatické přehrávání - Tlačítko automatického přehrávání je skryto - Tlačítko automatického přehrávání je zobrazeno - - Skrýt tlačítko Titulky - Tlačítko titulků je skryto - Tlačítko titulků je zobrazeno - Skrýt tlačítko Odeslat - Tlačítko pro odesílání je skryto - Tlačítko vysílání je viditelné - Skrýt pozadí ovládacích prvků přehrávače - Pozadí ovládacích prvků přehrávače je skryto - Pozadí ovládacích prvků přehrávače je zobrazeno - Skrýt tlačítka Předchozí a Další - Tlačítka jsou skryta - Tlačítka jsou zobrazena - - - Skrýt karty s informacemi o videu - Karty s informacemi o videu jsou skryty - Karty s informacemi o videu jsou zobrazeny - - - Deaktivovat okolní režim v celoobrazovkovém režimu - Režim Ambient je zakázán - Režim Ambient je povolen - - - Skrýt informační karty - Informační karty jsou skryty - Informační karty jsou zobrazeny - - - Zakázat animaci číselného posuvníku - Čísla posuvníku se neanimují - Čísla posuvníku se animují - - - Skrýt posuvník přehrávače videa - Posuvník ve video přehrávači je skryt - Posuvník ve video přehrávači je zobrazen - - Skrýt posuvník miniatur videí - Posuvník miniatur videí je skryt - Posuvník miniatur videí je zobrazen - - - Přehrávač Shorts - Skrýt nebo zobrazit komponenty přehrávače Shorts - - Skrýt Shorts v kanálu Domů - Skryto v kanálu Domů a souvisejících videích - Zobrazeno v kanálu Domů a souvisejících videích - Skrýt Shorts ve výsledcích vyhledávání - Skryté ve výsledcích vyhledávání - Zobrazeno ve výsledcích vyhledávání - - Skrýt Shorts v kanálu Odběry - Skryto v kanálu Odběry - Zobrazeno v kanálu Odběry - Skrýt Shorts z historie sledování - Skryté v historii sledování - Zobrazené v historii sledování - Skrýt štítek „Automatický dabing“ - Štítek s automatickým dabingem je skryt - Štítek s automatickým dabingem je zobrazen - Skrýt tlačítko „Koupit Superdíky“ - Tlačítko \"Koupit Super Thanks\" je skryto - Tlačítko \"Koupit Super Thanks\" je zobrazeno - Skrýt tlačítko efektu - Tlačítko Efekt je skryté - Tlačítko Efekt je zobrazeno - Skrýt tlačítko „Zelené plátno“ - Tlačítko zelené obrazovky je skryté - Tlačítko zelené obrazovky je zobrazeno - Skrýt tlačítko hashtagů - Tlačítko hashtagů je skryté - Tlačítko hashtagů je zobrazeno - - Skrýt tlačítko Připojit se - Tlačítko Připojit se je skryto - Tlačítko Připojit se je zobrazeno - Skrýt živý náhled - Živý náhled je skrytý - Živý náhled je zobrazen - Skrýt štítek umístění - Štítek umístění je skrytý - Štítek umístění je zobrazen - Skrýt tlačítko „Nové příspěvky“ - Tlačítko Nové příspěvky je skryto - Tlačítko Nové příspěvky je zobrazeno - Skrýt tlačítka pozastaveného překrytí - Tlačítka pozastaveného překrytí jsou skrytá - Tlačítka pozastaveného překrytí jsou zobrazena - Skrýt náhled komentáře - Náhled komentáře je skrytý - Zobrazuje se náhled komentáře - Skrýt tlačítko „Uložit hudbu“ - Tlačítko Uložit hudbu je skryté - Tlačítko Uložit hudbu je zobrazeno - Skrýt návrhy vyhledávání - Návrhy vyhledávání jsou skryté - Návrhy vyhledávání jsou zobrazeny - Skrýt tlačítko Obchod - Tlačítko obchodu je skryté - Tlačítko obchodu je zobrazeno - Skrýt nálepky - Nálepky jsou skryté - Nálepky jsou zobrazeny - Skrýt tlačítko Odebírat - Tlačítko Odebírat je skryto - Tlačítko Odebírat je zobrazeno - Skrýt označené produkty - Označené produkty jsou skryté - Označené produkty jsou zobrazeny - Skrýt tlačítko Nadcházející - Tlačítko \"Další\" je skryté - Tlačítko \"Další\" je zobrazeno - Skrýt tlačítko „Použít tento zvuk“ - Tlačítko Použít tento zvuk je skryté - Tlačítko Použít tento zvuk je zobrazené - Skrýt tlačítko „Použít tuto šablonu“ - Tlačítko Použít tuto šablonu je skryté - Tlačítko Použít tuto šablonu je zobrazeno - Skrýt animaci s fontánou u tlačítka To se mi líbí - Animace fontány tlačítka lajku je skrytá - Animace fontány tlačítka lajku je zobrazena - Skrýt tlačítko To se mi líbí - Tlačítko lajku je skryté - Tlačítko lajku je zobrazeno - Skrýt tlačítko Nelíbí se mi to - Tlačítko nelíbí se je skryté - Tlačítko nelíbí se je zobrazeno - Skrýt tlačítko Komentáře - Tlačítko komentářů je skryté - Tlačítko komentářů je zobrazeno - - Skrýt tlačítko Sdílet - Tlačítko sdílení je skryté - Tlačítko sdílení je zobrazeno - - Skrýt tlačítko Remix - Tlačítko remixu je skryté - Tlačítko remixu je zobrazeno - Skrýt tlačítko zvuku - Tlačítko zvuku je skryté - Tlačítko zvuku je zobrazeno - Skrýt informační panel - Informační panel je skrytý - Informační panel je zobrazen - Skrýt kanálový panel - Kanálový panel je skrytý - Kanálový panel je zobrazen - Skrýt název videa - Název videa je skryt - Název videa je zobrazen - Skrýt štítek zvukového metadata - Štítek metadat zvuku je skryt - Štítek metadat zvuku je zobrazen - Skrýt popisek odkazu na video - Štítek odkazu na video je skrytý - Štítek odkazu na video je zobrazen - Skrýt navigační panel - Navigační panel je skrytý - Navigační panel je zobrazen - - - Skrýt navrhované video na konci obrazovky - "Navrhované video na konci obrazovky je skryté, když je automatické přehrávání vypnuté. + + Skrýt Sledovat ve VR + Menu Sledovat ve VR je skryto + Menu Sledovat ve VR je zobrazeno + Skrýt nabídku kvality videa + Nabídka kvality videa je skryta + Nabídka kvality videa je zobrazena + Skrýt zápatí menu kvality videa + Zápatí menu kvality videa je skryto + Zápatí menu kvality videa je zobrazeno + + + Skrýt tlačítko Automatické přehrávání + Tlačítko automatického přehrávání je skryto + Tlačítko automatického přehrávání je zobrazeno + + Skrýt tlačítko Titulky + Tlačítko titulků je skryto + Tlačítko titulků je zobrazeno + Skrýt tlačítko Odeslat + Tlačítko pro odesílání je skryto + Tlačítko vysílání je viditelné + Skrýt pozadí ovládacích prvků přehrávače + Pozadí ovládacích prvků přehrávače je skryto + Pozadí ovládacích prvků přehrávače je zobrazeno + Skrýt tlačítka Předchozí a Další + Tlačítka jsou skryta + Tlačítka jsou zobrazena + + + Skrýt karty s informacemi o videu + Karty s informacemi o videu jsou skryty + Karty s informacemi o videu jsou zobrazeny + + + Deaktivovat okolní režim v celoobrazovkovém režimu + Režim Ambient je zakázán + Režim Ambient je povolen + + + Skrýt informační karty + Informační karty jsou skryty + Informační karty jsou zobrazeny + + + Zakázat animaci číselného posuvníku + Čísla posuvníku se neanimují + Čísla posuvníku se animují + + + Skrýt posuvník přehrávače videa + Posuvník ve video přehrávači je skryt + Posuvník ve video přehrávači je zobrazen + + Skrýt posuvník miniatur videí + Posuvník miniatur videí je skryt + Posuvník miniatur videí je zobrazen + + + Přehrávač Shorts + Skrýt nebo zobrazit komponenty přehrávače Shorts + + Skrýt Shorts v kanálu Domů + Skryto v kanálu Domů a souvisejících videích + Zobrazeno v kanálu Domů a souvisejících videích + Skrýt Shorts ve výsledcích vyhledávání + Skryté ve výsledcích vyhledávání + Zobrazeno ve výsledcích vyhledávání + + Skrýt Shorts v kanálu Odběry + Skryto v kanálu Odběry + Zobrazeno v kanálu Odběry + Skrýt Shorts z historie sledování + Skryté v historii sledování + Zobrazené v historii sledování + Skrýt štítek „Automatický dabing“ + Štítek s automatickým dabingem je skryt + Štítek s automatickým dabingem je zobrazen + Skrýt tlačítko „Koupit Superdíky“ + Tlačítko \"Koupit Super Thanks\" je skryto + Tlačítko \"Koupit Super Thanks\" je zobrazeno + Skrýt tlačítko efektu + Tlačítko Efekt je skryté + Tlačítko Efekt je zobrazeno + Skrýt tlačítko „Zelené plátno“ + Tlačítko zelené obrazovky je skryté + Tlačítko zelené obrazovky je zobrazeno + Skrýt tlačítko hashtagů + Tlačítko hashtagů je skryté + Tlačítko hashtagů je zobrazeno + + Skrýt tlačítko Připojit se + Tlačítko Připojit se je skryto + Tlačítko Připojit se je zobrazeno + Skrýt živý náhled + Živý náhled je skrytý + Živý náhled je zobrazen + Skrýt štítek umístění + Štítek umístění je skrytý + Štítek umístění je zobrazen + Skrýt tlačítko „Nové příspěvky“ + Tlačítko Nové příspěvky je skryto + Tlačítko Nové příspěvky je zobrazeno + Skrýt tlačítka pozastaveného překrytí + Tlačítka pozastaveného překrytí jsou skrytá + Tlačítka pozastaveného překrytí jsou zobrazena + Skrýt náhled komentáře + Náhled komentáře je skrytý + Zobrazuje se náhled komentáře + Skrýt tlačítko „Uložit hudbu“ + Tlačítko Uložit hudbu je skryté + Tlačítko Uložit hudbu je zobrazeno + Skrýt návrhy vyhledávání + Návrhy vyhledávání jsou skryté + Návrhy vyhledávání jsou zobrazeny + Skrýt tlačítko Obchod + Tlačítko obchodu je skryté + Tlačítko obchodu je zobrazeno + Skrýt nálepky + Nálepky jsou skryté + Nálepky jsou zobrazeny + Skrýt tlačítko Odebírat + Tlačítko Odebírat je skryto + Tlačítko Odebírat je zobrazeno + Skrýt označené produkty + Označené produkty jsou skryté + Označené produkty jsou zobrazeny + Skrýt tlačítko Nadcházející + Tlačítko \"Další\" je skryté + Tlačítko \"Další\" je zobrazeno + Skrýt tlačítko „Použít tento zvuk“ + Tlačítko Použít tento zvuk je skryté + Tlačítko Použít tento zvuk je zobrazené + Skrýt tlačítko „Použít tuto šablonu“ + Tlačítko Použít tuto šablonu je skryté + Tlačítko Použít tuto šablonu je zobrazeno + Skrýt animaci s fontánou u tlačítka To se mi líbí + Animace fontány tlačítka lajku je skrytá + Animace fontány tlačítka lajku je zobrazena + Skrýt tlačítko To se mi líbí + Tlačítko lajku je skryté + Tlačítko lajku je zobrazeno + Skrýt tlačítko Nelíbí se mi to + Tlačítko nelíbí se je skryté + Tlačítko nelíbí se je zobrazeno + Skrýt tlačítko Komentáře + Tlačítko komentářů je skryté + Tlačítko komentářů je zobrazeno + + Skrýt tlačítko Sdílet + Tlačítko sdílení je skryté + Tlačítko sdílení je zobrazeno + + Skrýt tlačítko Remix + Tlačítko remixu je skryté + Tlačítko remixu je zobrazeno + Skrýt tlačítko zvuku + Tlačítko zvuku je skryté + Tlačítko zvuku je zobrazeno + Skrýt informační panel + Informační panel je skrytý + Informační panel je zobrazen + Skrýt kanálový panel + Kanálový panel je skrytý + Kanálový panel je zobrazen + Skrýt název videa + Název videa je skryt + Název videa je zobrazen + Skrýt štítek zvukového metadata + Štítek metadat zvuku je skryt + Štítek metadat zvuku je zobrazen + Skrýt popisek odkazu na video + Štítek odkazu na video je skrytý + Štítek odkazu na video je zobrazen + Skrýt navigační panel + Navigační panel je skrytý + Navigační panel je zobrazen + + + Skrýt navrhované video na konci obrazovky + "Navrhované video na konci obrazovky je skryté, když je automatické přehrávání vypnuté. Automatické přehrávání lze změnit v nastavení YouTube: Nastavení → Přehrávání → Automatické přehrávání dalšího videa" - Navrhované video na konci obrazovky se zobrazuje - - - Skrýt překrytí souvisejících videí - Překrytí souvisejících videí v režimu celé obrazovky je skryto - Překrytí souvisejících videí v režimu celé obrazovky je zobrazeno - - - Skrýt čas videa - Čas je skrytý - Čas je zobrazen - - - Skrýt vyskakovací panely přehrávače - Vyskakovací panely přehrávače jsou skryté - Vyskakovací panely přehrávače jsou zobrazeny - - - Ukončete režim celé obrazovky na konci videa - Zakázáno - Na výšku - Na šířku - Na výšku i na šířku - - - Otevřít videa v režimu na celou obrazovku na výšku - Videa se otevírají na celou obrazovku - Videa se neotevírají na celou obrazovku - - - Průhlednost překrytí přehrávače - Hodnota průhlednosti mezi 0-100, kde 0 je průhledné - Průhlednost překrytí přehrávače musí být mezi 0-100 - - - - Nelíbí se se dočasně nedají použít (časový limit API) - Nelíbí se se nedají použít (stav %d) - Počty „Nelíbí se mi“ nejsou k dispozici (limit rozhraní API klienta) - Nelíbí se se nedají použít (%s) - - Načtěte video znovu, abyste hlasovali pomocí Return YouTube Dislike - - Skryto vlastníkem - Nelíbí se se zobrazují - Nelíbí se se nezobrazují - Zobrazit nelíbí se v Shorts - "Počty „Nelíbí se mi“ u Shorts jsou zobrazeny + Navrhované video na konci obrazovky se zobrazuje + + + Skrýt překrytí souvisejících videí + Překrytí souvisejících videí v režimu celé obrazovky je skryto + Překrytí souvisejících videí v režimu celé obrazovky je zobrazeno + + + Skrýt čas videa + Čas je skrytý + Čas je zobrazen + + + Skrýt vyskakovací panely přehrávače + Vyskakovací panely přehrávače jsou skryté + Vyskakovací panely přehrávače jsou zobrazeny + + + Ukončete režim celé obrazovky na konci videa + Zakázáno + Na výšku + Na šířku + Na výšku i na šířku + + + Otevřít videa v režimu na celou obrazovku na výšku + Videa se otevírají na celou obrazovku + Videa se neotevírají na celou obrazovku + + + Průhlednost překrytí přehrávače + Hodnota průhlednosti mezi 0-100, kde 0 je průhledné + Průhlednost překrytí přehrávače musí být mezi 0-100 + + + + Nelíbí se se dočasně nedají použít (časový limit API) + Nelíbí se se nedají použít (stav %d) + Počty „Nelíbí se mi“ nejsou k dispozici (limit rozhraní API klienta) + Nelíbí se se nedají použít (%s) + + Načtěte video znovu, abyste hlasovali pomocí Return YouTube Dislike + + Skryto vlastníkem + Nelíbí se se zobrazují + Nelíbí se se nezobrazují + Zobrazit nelíbí se v Shorts + "Počty „Nelíbí se mi“ u Shorts jsou zobrazeny Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu" - Počty „Nelíbí se mi“ u Shorts nejsou zobrazeny - Nelíbí se v procentech - Počty „Nelíbí se mi“ se zobrazují jako procento - Počty „Nelíbí se mi“ se zobrazují jako číslo - - Kompaktní tlačítko To se mi líbí - Tlačítko lajku stylizované pro minimální šířku - Tlačítko lajku stylizované pro nejlepší vzhled - Zobrazit odhadované počty To se mi líbí - U videí s vypnutými hodnoceními se zobrazuje odhadovaný počet hodnocení - Odhadovaná hodnocení se nezobrazují - Zobrazit toast, pokud API není dostupné - Toast se zobrazí, pokud Return YouTube Dislike není dostupný - Toast se nezobrazí, pokud Return YouTube Dislike není dostupný - Data jsou poskytována API Return YouTube Dislike. Klepnutím se dozvíte více - - Statistiky API ReturnYouTubeDislike tohoto zařízení - Doba odezvy API, průměr - Doba odezvy API, minimum - Čas odezvy rozhraní API, maximální - Čas odezvy rozhraní API, poslední video - Nelíbí se mi to dočasně není k dispozici - Limit rychlosti volání rozhraní API klienta je aktivní - Načítání hlasů rozhraní API, počet volání - Nebyla provedena žádná síťová volání - Bylo provedeno %d síťových volání - Načítání hlasů rozhraní API, počet časových limitů - Žádná síťová volání vypršela časový limit - %d síťových volání vypršelo časový limit - Limity rychlosti klienta rozhraní API - Nebyl zaznamenán žádný limit rychlosti klienta - Limit rychlosti klienta byl zaznamenán %d krát - %d milisekund - - - Povolit široký vyhledávací panel - Široký vyhledávací panel je povolen - Široký vyhledávací panel je zakázán - - - Povolit miniatury vysoké kvality - Miniatury posuvníku jsou vysoké kvality - Miniatury posuvníku jsou střední kvality - Miniatury posuvníku na celou obrazovku jsou vysoké kvality - "Obnoví se také miniatury živých přenosů, které nemají miniatury s posuvníkem. + Počty „Nelíbí se mi“ u Shorts nejsou zobrazeny + Nelíbí se v procentech + Počty „Nelíbí se mi“ se zobrazují jako procento + Počty „Nelíbí se mi“ se zobrazují jako číslo + + Kompaktní tlačítko To se mi líbí + Tlačítko lajku stylizované pro minimální šířku + Tlačítko lajku stylizované pro nejlepší vzhled + Zobrazit odhadované počty To se mi líbí + U videí s vypnutými hodnoceními se zobrazuje odhadovaný počet hodnocení + Odhadovaná hodnocení se nezobrazují + Zobrazit toast, pokud API není dostupné + Toast se zobrazí, pokud Return YouTube Dislike není dostupný + Toast se nezobrazí, pokud Return YouTube Dislike není dostupný + Data jsou poskytována API Return YouTube Dislike. Klepnutím se dozvíte více + + Statistiky API ReturnYouTubeDislike tohoto zařízení + Doba odezvy API, průměr + Doba odezvy API, minimum + Čas odezvy rozhraní API, maximální + Čas odezvy rozhraní API, poslední video + Nelíbí se mi to dočasně není k dispozici - Limit rychlosti volání rozhraní API klienta je aktivní + Načítání hlasů rozhraní API, počet volání + Nebyla provedena žádná síťová volání + Bylo provedeno %d síťových volání + Načítání hlasů rozhraní API, počet časových limitů + Žádná síťová volání vypršela časový limit + %d síťových volání vypršelo časový limit + Limity rychlosti klienta rozhraní API + Nebyl zaznamenán žádný limit rychlosti klienta + Limit rychlosti klienta byl zaznamenán %d krát + %d milisekund + + + Povolit široký vyhledávací panel + Široký vyhledávací panel je povolen + Široký vyhledávací panel je zakázán + + + Povolit miniatury vysoké kvality + Miniatury posuvníku jsou vysoké kvality + Miniatury posuvníku jsou střední kvality + Miniatury posuvníku na celou obrazovku jsou vysoké kvality + "Obnoví se také miniatury živých přenosů, které nemají miniatury s posuvníkem. Miniatury s posuvníkem budou používat stejnou kvalitu jako aktuální video. Tato funkce funguje nejlépe s kvalitou videa 720p nebo nižší a při použití velmi rychlého internetového připojení." - Obnovit staré miniatury posuvníku - Miniatury posuvníku se zobrazí nad posuvníkem - Miniatury posuvníku se zobrazí na celou obrazovku - - - Povolit SponsorBlock - SponsorBlock je systém s participací komunity pro přeskakování otravných částí videí na YouTube - Vzhled - Zobrazit tlačítko pro hlasování - Tlačítko pro hlasování segmentu je zobrazeno - Tlačítko pro hlasování segmentu není zobrazeno - Použít čtvercové rozvržení - Tlačítka a ovládací prvky jsou čtvercové - Tlačítka a ovládací prvky jsou zaoblené - - Použít kompaktní tlačítko Přeskočit - Tlačítko pro přeskočení je stylizováno pro minimální šířku - Tlačítko pro přeskočení je stylizováno pro nejlepší vzhled - Automaticky skrýt tlačítko Přeskočit - Tlačítko pro přeskočení se skrývá po několika sekundách - Tlačítko Přeskočit se zobrazuje pro celý segment - Doba trvání tlačítka přeskočení - Jak dlouho zobrazovat tlačítka přeskočit a přeskočit na zvýraznění před automatickým skrytím - Zobrazit hlásku pro zrušení přeskočení - Hláska se zobrazí, když je segment automaticky přeskočen. Klepněte na hlásku pro zrušení přeskočení - Toast se nezobrazuje - Doba trvání toastu přeskočení - Jak dlouho zobrazovat hlášení o zrušení přeskočení - 1 sekunda - 2 sekundy - 3 sekundy - 4 sekundy - 5 sekund - 6 sekund - 7 sekund - 8 sekund - 9 sekund - 10 sekund - Zobrazit délku videa bez segmentů - Na posuvníku je zobrazena délka videa minus všechny segmenty - Zobrazena úplná délka videa - Vytváření nových segmentů - Zobrazit tlačítko Vytvořit nový segment - Tlačítko pro vytvoření nového segmentu je zobrazeno - Tlačítko pro vytvoření nového segmentu není zobrazeno - Upravit krok nového segmentu - Počet milisekund, o které se posunou tlačítka pro úpravu času při vytváření nových segmentů - Hodnota musí být kladné číslo - Zobrazit pokyny - Pokyny obsahují pravidla a tipy pro vytváření nových segmentů - Dodržovat pokyny - Přečtěte si pokyny SponsorBlock před vytvořením nových segmentů - Již jsem si to přečetl - Ukázat mi - Obecné - Zobrazit \"toast\", pokud rozhraní API není k dispozici - \"Toast\" se zobrazí, pokud SponsorBlock není k dispozici - \"Toast\" se nezobrazí, pokud SponsorBlock není k dispozici - Povolit sledování počtu přeskočení - Nechá žebříček SponsorBlock vědět, kolik času se ušetří. Při každém přeskočení segmentu se na žebříček odešle zpráva - Sledování počtu přeskočení není povoleno - Minimální délka segmentu - Segmenty kratší než tato hodnota (v sekundách) se nezobrazí a nepřeskočí - Neplatná doba trvání - Vaše soukromé uživatelské ID - To by mělo být udržováno v tajnosti. Je to jako heslo a nemělo by se sdílet s nikým. Pokud ho má někdo, může se vydávat za vás - Soukromé uživatelské ID musí být alespoň 30 znaků dlouhé. - Změnit adresu URL rozhraní API - Adresa, kterou SponsorBlock používá k provádění volání na server - Adresa URL rozhraní API resetována - Adresa URL rozhraní API není platná - Adresa URL rozhraní API změněna - Importovat/Exportovat nastavení - Kopírovat - Vaše konfigurace SponsorBlock JSON, kterou lze importovat/exportovat do ReVanced a dalších platforem SponsorBlock - Vaše konfigurace SponsorBlock JSON, kterou lze importovat/exportovat do ReVanced a dalších platforem SponsorBlock. To zahrnuje vaše soukromé uživatelské ID. Nezapomeňte sdílet moudře - Nastavení importováno úspěšně - Nepodařilo se importovat: %s - Nepodařilo se exportovat: %s - "Vaše nastavení obsahují soukromé ID uživatele SponsorBlocku. + Obnovit staré miniatury posuvníku + Miniatury posuvníku se zobrazí nad posuvníkem + Miniatury posuvníku se zobrazí na celou obrazovku + + + Povolit SponsorBlock + SponsorBlock je systém s participací komunity pro přeskakování otravných částí videí na YouTube + Vzhled + Zobrazit tlačítko pro hlasování + Tlačítko pro hlasování segmentu je zobrazeno + Tlačítko pro hlasování segmentu není zobrazeno + Použít čtvercové rozvržení + Tlačítka a ovládací prvky jsou čtvercové + Tlačítka a ovládací prvky jsou zaoblené + + Použít kompaktní tlačítko Přeskočit + Tlačítko pro přeskočení je stylizováno pro minimální šířku + Tlačítko pro přeskočení je stylizováno pro nejlepší vzhled + Automaticky skrýt tlačítko Přeskočit + Tlačítko pro přeskočení se skrývá po několika sekundách + Tlačítko Přeskočit se zobrazuje pro celý segment + Doba trvání tlačítka přeskočení + Jak dlouho zobrazovat tlačítka přeskočit a přeskočit na zvýraznění před automatickým skrytím + Zobrazit hlásku pro zrušení přeskočení + Hláska se zobrazí, když je segment automaticky přeskočen. Klepněte na hlásku pro zrušení přeskočení + Toast se nezobrazuje + Doba trvání toastu přeskočení + Jak dlouho zobrazovat hlášení o zrušení přeskočení + 1 sekunda + 2 sekundy + 3 sekundy + 4 sekundy + 5 sekund + 6 sekund + 7 sekund + 8 sekund + 9 sekund + 10 sekund + Zobrazit délku videa bez segmentů + Na posuvníku je zobrazena délka videa minus všechny segmenty + Zobrazena úplná délka videa + Vytváření nových segmentů + Zobrazit tlačítko Vytvořit nový segment + Tlačítko pro vytvoření nového segmentu je zobrazeno + Tlačítko pro vytvoření nového segmentu není zobrazeno + Upravit krok nového segmentu + Počet milisekund, o které se posunou tlačítka pro úpravu času při vytváření nových segmentů + Hodnota musí být kladné číslo + Zobrazit pokyny + Pokyny obsahují pravidla a tipy pro vytváření nových segmentů + Dodržovat pokyny + Přečtěte si pokyny SponsorBlock před vytvořením nových segmentů + Již jsem si to přečetl + Ukázat mi + Obecné + Zobrazit \"toast\", pokud rozhraní API není k dispozici + \"Toast\" se zobrazí, pokud SponsorBlock není k dispozici + \"Toast\" se nezobrazí, pokud SponsorBlock není k dispozici + Povolit sledování počtu přeskočení + Nechá žebříček SponsorBlock vědět, kolik času se ušetří. Při každém přeskočení segmentu se na žebříček odešle zpráva + Sledování počtu přeskočení není povoleno + Minimální délka segmentu + Segmenty kratší než tato hodnota (v sekundách) se nezobrazí a nepřeskočí + Neplatná doba trvání + Vaše soukromé uživatelské ID + To by mělo být udržováno v tajnosti. Je to jako heslo a nemělo by se sdílet s nikým. Pokud ho má někdo, může se vydávat za vás + Soukromé uživatelské ID musí být alespoň 30 znaků dlouhé. + Změnit adresu URL rozhraní API + Adresa, kterou SponsorBlock používá k provádění volání na server + Adresa URL rozhraní API resetována + Adresa URL rozhraní API není platná + Adresa URL rozhraní API změněna + Importovat/Exportovat nastavení + Kopírovat + Vaše konfigurace SponsorBlock JSON, kterou lze importovat/exportovat do ReVanced a dalších platforem SponsorBlock + Vaše konfigurace SponsorBlock JSON, kterou lze importovat/exportovat do ReVanced a dalších platforem SponsorBlock. To zahrnuje vaše soukromé uživatelské ID. Nezapomeňte sdílet moudře + Nastavení importováno úspěšně + Nepodařilo se importovat: %s + Nepodařilo se exportovat: %s + "Vaše nastavení obsahují soukromé ID uživatele SponsorBlocku. Vaše ID uživatele je jako heslo a nikdy by nemělo být sdíleno." - Už se to nezobrazovat - Změnit chování segmentu - Sponzor - Placená propagace, placené doporučení a přímá reklama. Ne pro autopropagace nebo bezplatné shout-outy k důvodům/tvůrcům/webovým stránkám/produktům, které se jim líbí - Nezpoplatněná/Vlastní propagace - Podobné jako sponzor, ale bez placené nebo vlastní propagace. Zahrnuje sekce o zboží, darech nebo informacích o tom, s kým spolupracovali - Připomenutí interakce (Odebírat) - Krátké připomenutí, aby se vám líbilo, odebírali jste nebo je sledovali uprostřed obsahu. Pokud je to dlouhé nebo se týká něčeho specifického, mělo by být místo toho pod vlastní propagací - Zvýraznění - Část videa, po které většina lidí hledá - Přestávka/Animace úvodu - Interval bez skutečného obsahu. Může to být pauza, statický snímek nebo opakující se animace. Neobsahuje přechody s informacemi - Outro / Závěrečné titulky - Titulky nebo když se objeví závěrečné karty YouTube. Ne pro závěry s informacemi - Úvod / Pozdravy - Komentované upoutávky na nadcházející video, pozdravy a rozloučení. Neobsahuje sekce, které přidávají další obsah - Náhled / Shrnutí - Sbírka klipů, které ukazují, co se chystá nebo co se stalo ve videu nebo v jiných videích série, kde jsou všechny informace opakované jinde - Odbočka / Vtipy - Vedlejší scény nebo vtipy, které nejsou nutné k pochopení hlavního obsahu videa. Neobsahuje sekce poskytující kontext nebo podrobnosti na pozadí - Hudba: nehudební sekce - Pouze pro použití v hudebních videích. Sekce hudebních videí bez hudby, které nejsou již pokryty jinou kategorií - Přeskočit - Zvýraznit - Přeskočit sponzora - Přeskočit reklamu - Přeskočit interakci - Přeskočit na zvýraznění - Přeskočit úvod - Přeskočit přestávku - Přeskočit přestávku - Přeskočit závěr - Přeskočit úvod - Přeskočit náhled - Přeskočit náhled - Přeskočit shrnutí - Přeskočit vedlejší část - Přeskočit bez hudby - Přeskočit segment - Sponzor přeskočen - Přeskočená vlastní propagace - Přeskočeno obtěžující připomenutí - Přeskočeno na zvýraznění - Intro přeskočeno - Přeskočena přestávka - Přeskočena přestávka - Outro přeskočeno - Úvod přeskočen - Přeskočena ukázka/rekapitulace - Přeskočena ukázka/rekapitulace - Přeskočeno shrnutí - Vedlejší část přeskočena - Přeskočena nehudební sekce - Přeskočen neodeslaný segment - Přeskočeno více segmentů - Automaticky přeskočit - Přeskočit automaticky jednou - Zobrazit tlačítko Přeskočit - Zobrazit v posuvníku - Zakázat - Nelze odeslat segment: %s - SponsorBlock je dočasně nedostupný - Nelze odeslat segment (stav: %1$d %2$s) - Nelze odeslat segment. Omezení sazby (příliš mnoho od stejného uživatele nebo IP) - Nelze odeslat segment: %s - "Nelze odeslat segment. + Už se to nezobrazovat + Změnit chování segmentu + Sponzor + Placená propagace, placené doporučení a přímá reklama. Ne pro autopropagace nebo bezplatné shout-outy k důvodům/tvůrcům/webovým stránkám/produktům, které se jim líbí + Nezpoplatněná/Vlastní propagace + Podobné jako sponzor, ale bez placené nebo vlastní propagace. Zahrnuje sekce o zboží, darech nebo informacích o tom, s kým spolupracovali + Připomenutí interakce (Odebírat) + Krátké připomenutí, aby se vám líbilo, odebírali jste nebo je sledovali uprostřed obsahu. Pokud je to dlouhé nebo se týká něčeho specifického, mělo by být místo toho pod vlastní propagací + Zvýraznění + Část videa, po které většina lidí hledá + Přestávka/Animace úvodu + Interval bez skutečného obsahu. Může to být pauza, statický snímek nebo opakující se animace. Neobsahuje přechody s informacemi + Outro / Závěrečné titulky + Titulky nebo když se objeví závěrečné karty YouTube. Ne pro závěry s informacemi + Úvod / Pozdravy + Komentované upoutávky na nadcházející video, pozdravy a rozloučení. Neobsahuje sekce, které přidávají další obsah + Náhled / Shrnutí + Sbírka klipů, které ukazují, co se chystá nebo co se stalo ve videu nebo v jiných videích série, kde jsou všechny informace opakované jinde + Odbočka / Vtipy + Vedlejší scény nebo vtipy, které nejsou nutné k pochopení hlavního obsahu videa. Neobsahuje sekce poskytující kontext nebo podrobnosti na pozadí + Hudba: nehudební sekce + Pouze pro použití v hudebních videích. Sekce hudebních videí bez hudby, které nejsou již pokryty jinou kategorií + Přeskočit + Zvýraznit + Přeskočit sponzora + Přeskočit reklamu + Přeskočit interakci + Přeskočit na zvýraznění + Přeskočit úvod + Přeskočit přestávku + Přeskočit přestávku + Přeskočit závěr + Přeskočit úvod + Přeskočit náhled + Přeskočit náhled + Přeskočit shrnutí + Přeskočit vedlejší část + Přeskočit bez hudby + Přeskočit segment + Sponzor přeskočen + Přeskočená vlastní propagace + Přeskočeno obtěžující připomenutí + Přeskočeno na zvýraznění + Intro přeskočeno + Přeskočena přestávka + Přeskočena přestávka + Outro přeskočeno + Úvod přeskočen + Přeskočena ukázka/rekapitulace + Přeskočena ukázka/rekapitulace + Přeskočeno shrnutí + Vedlejší část přeskočena + Přeskočena nehudební sekce + Přeskočen neodeslaný segment + Přeskočeno více segmentů + Automaticky přeskočit + Přeskočit automaticky jednou + Zobrazit tlačítko Přeskočit + Zobrazit v posuvníku + Zakázat + Nelze odeslat segment: %s + SponsorBlock je dočasně nedostupný + Nelze odeslat segment (stav: %1$d %2$s) + Nelze odeslat segment. Omezení sazby (příliš mnoho od stejného uživatele nebo IP) + Nelze odeslat segment: %s + "Nelze odeslat segment. Již existuje" - Segment úspěšně odeslán - - SponsorBlock je dočasně nedostupný (API vypršel časový limit) - SponsorBlock je dočasně nedostupný (stav %d) - SponsorBlock je dočasně nedostupný - Nelze hlasovat pro segment (API vypršel časový limit) - Nelze hlasovat pro segment (stav: %1$d %2$s) - Nelze hlasovat pro segment: %s - Hlasovat nahoru - Hlasovat dolů - Změnit kategorii - Nejsou žádné segmenty, pro které by se dalo hlasovat - - %1$s až %2$s - Zvolte kategorii segmentu - Kategorie je v nastavení zakázána. Povolte kategorii, abyste ji mohli odeslat. - Nový segment SponsorBlock - Nastavit %s jako začátek nebo konec nového segmentu? - Začátek - Konec - Teď - Čas, kdy segment začíná - Čas, kdy segment končí - Jsou časy správné? - "Segment pochází z + Segment úspěšně odeslán + + SponsorBlock je dočasně nedostupný (API vypršel časový limit) + SponsorBlock je dočasně nedostupný (stav %d) + SponsorBlock je dočasně nedostupný + Nelze hlasovat pro segment (API vypršel časový limit) + Nelze hlasovat pro segment (stav: %1$d %2$s) + Nelze hlasovat pro segment: %s + Hlasovat nahoru + Hlasovat dolů + Změnit kategorii + Nejsou žádné segmenty, pro které by se dalo hlasovat + + %1$s až %2$s + Zvolte kategorii segmentu + Kategorie je v nastavení zakázána. Povolte kategorii, abyste ji mohli odeslat. + Nový segment SponsorBlock + Nastavit %s jako začátek nebo konec nového segmentu? + Začátek + Konec + Teď + Čas, kdy segment začíná + Čas, kdy segment končí + Jsou časy správné? + "Segment pochází z %1$s do @@ -1280,45 +1279,45 @@ do (%3$s) Jste připraveni k odeslání?" - Začátek musí být před koncem - Nejprve označte dvě místa na časové liště - Zobrazte náhled segmentu a ujistěte se, že se hladce přeskakuje - Upravit načasování segmentu ručně - Chcete upravit načasování pro začátek nebo konec segmentu? - Zadán neplatný čas - Statistiky - - Statistiky jsou dočasně nedostupné (server API je mimo provoz) - Načítání... - SponsorBlock je zakázán - Vaše uživatelské jméno: <b>%s</b> - Klepněte zde pro změnu uživatelského jména - Nelze změnit uživatelské jméno: Stav: %1$d %2$s - Uživatelské jméno bylo úspěšně změněno - Vaše reputace je <b>%.2f</b> - Vytvořili jste <b>%s</b> segmentů - Klepněte zde pro zobrazení vašich segmentů - Žebříček SponsorBlock - Ušetřili jste lidi od <b>%s</b> segmentů - Klepněte zde pro zobrazení globálních statistik a nejlepších přispěvatelů - To je <b>%s</b> z jejich životů.<br>Klepněte zde pro zobrazení žebříčku - Přeskočili jste <b>%s</b> segmentů - To je <b>%s</b> - Resetovat počítadlo přeskočených segmentů? - %1$s hodin %2$s minut - %1$s minut %2$s sekund - %s sekund - Průhlednost: - Barva: - O aplikaci - Data poskytuje rozhraní API SponsorBlock. Klepněte zde, abyste se dozvěděli více a zobrazili si soubory ke stažení pro další platformy - - - Rozvržení formuláře - Výchozí - Telefon - Automobilový - "Změny zahrnují: + Začátek musí být před koncem + Nejprve označte dvě místa na časové liště + Zobrazte náhled segmentu a ujistěte se, že se hladce přeskakuje + Upravit načasování segmentu ručně + Chcete upravit načasování pro začátek nebo konec segmentu? + Zadán neplatný čas + Statistiky + + Statistiky jsou dočasně nedostupné (server API je mimo provoz) + Načítání... + SponsorBlock je zakázán + Vaše uživatelské jméno: <b>%s</b> + Klepněte zde pro změnu uživatelského jména + Nelze změnit uživatelské jméno: Stav: %1$d %2$s + Uživatelské jméno bylo úspěšně změněno + Vaše reputace je <b>%.2f</b> + Vytvořili jste <b>%s</b> segmentů + Klepněte zde pro zobrazení vašich segmentů + Žebříček SponsorBlock + Ušetřili jste lidi od <b>%s</b> segmentů + Klepněte zde pro zobrazení globálních statistik a nejlepších přispěvatelů + To je <b>%s</b> z jejich životů.<br>Klepněte zde pro zobrazení žebříčku + Přeskočili jste <b>%s</b> segmentů + To je <b>%s</b> + Resetovat počítadlo přeskočených segmentů? + %1$s hodin %2$s minut + %1$s minut %2$s sekund + %s sekund + Průhlednost: + Barva: + O aplikaci + Data poskytuje rozhraní API SponsorBlock. Klepněte zde, abyste se dozvěděli více a zobrazili si soubory ke stažení pro další platformy + + + Rozvržení formuláře + Výchozí + Telefon + Automobilový + "Změny zahrnují: Rozložení tabletu • Příspěvky komunity jsou skryté @@ -1326,313 +1325,311 @@ Rozložení tabletu Rozložení automobilu • Shorts se otevírají v běžném přehrávači • Kanál je uspořádán podle témat a kanálů" - - - Napodobit verzi aplikace - Verze napodobena - Verze není napodobena - "Verze aplikace bude změněna na starší verzi YouTube. + + + Napodobit verzi aplikace + Verze napodobena + Verze není napodobena + "Verze aplikace bude změněna na starší verzi YouTube. To změní vzhled a funkce aplikace, ale mohou se objevit neznámé vedlejší efekty. Pokud bude později vypnuta, doporučujeme vymazat data aplikace, aby se zabránilo chybám uživatelského rozhraní." - Cíl napodobení verze aplikace - 20.13.41 - Obnovit nerozbalený panel akcí videa - 20.05.46 - Obnovit funkci přepisu - 19.35.36 - Obnovuje staré ikony Shorts přehrávače - 19.01.34 – Obnovit staré ikony navigace - - - Změnit úvodní stránku - Výchozí - Všechna předplatná - Procházet kanály - Kurzy / Vzdělávání - Prozkoumat - Móda a krása - Hraní - Historie - Knihovna - Líbilo se mi - Živě - Filmy - Hudba - Zprávy - Oznámení - Playlisty - Hledat - Nakupování - Sport - Odběry - Trendy - Virtuální realita - Sledovat později - Vaše klipy - Vždy změnit úvodní stránku - "Úvodní stránka je vždy změněna + Cíl napodobení verze aplikace + 20.13.41 - Obnovit nerozbalený panel akcí videa + 20.05.46 - Obnovit funkci přepisu + 19.35.36 - Obnovuje staré ikony Shorts přehrávače + 19.01.34 – Obnovit staré ikony navigace + + + Změnit úvodní stránku + Výchozí + Všechna předplatná + Procházet kanály + Kurzy / Vzdělávání + Prozkoumat + Móda a krása + Hraní + Historie + Knihovna + Líbilo se mi + Živě + Filmy + Hudba + Zprávy + Oznámení + Playlisty + Hledat + Nakupování + Sport + Odběry + Trendy + Virtuální realita + Sledovat později + Vaše klipy + Vždy změnit úvodní stránku + "Úvodní stránka je vždy změněna Omezení: Použití tlačítka zpět na panelu nástrojů nemusí fungovat" - Úvodní stránka se změní pouze při spuštění aplikace - - - Zakázat obnovení přehrávače Shorts - Přehrávač Shorts nebude obnoven při spuštění aplikace - Přehrávač Shorts se po spuštění aplikace znovu spustí - - - Otevřít Shorts s - Přehrávač Shorts - Běžný přehrávač - Normální přehrávač (celá obrazovka) - - - Automatické přehrávání Shorts - Shorts se budou automaticky přehrávat - Shorts se budou opakovat - Automatické přehrávání Shorts v pozadí - Přehrávání Shorts v pozadí se bude automaticky přehrávat - Přehrávání Shorts v pozadí se bude opakovat - - - Mini přehrávač - Změnit styl minimalizovaného přehrávače v aplikaci - Typ přehrávače - Vypnuto - Výchozí - Minimální - Moderní 1 - Moderní 2 - Moderní 3 - Moderní 4 - Zakázat zaoblené rohy - Rohy jsou čtvercové - Rohy jsou zaoblené - Povolit dvojitý klepnutí a přiblížení pro změnu velikosti - "Aktivováno dvojitým klepnutím a přiblížením pro změnu velikosti + Úvodní stránka se změní pouze při spuštění aplikace + + + Zakázat obnovení přehrávače Shorts + Přehrávač Shorts nebude obnoven při spuštění aplikace + Přehrávač Shorts se po spuštění aplikace znovu spustí + + + Otevřít Shorts s + Přehrávač Shorts + Běžný přehrávač + Normální přehrávač (celá obrazovka) + + + Automatické přehrávání Shorts + Shorts se budou automaticky přehrávat + Shorts se budou opakovat + Automatické přehrávání Shorts v pozadí + Přehrávání Shorts v pozadí se bude automaticky přehrávat + Přehrávání Shorts v pozadí se bude opakovat + + + Mini přehrávač + Změnit styl minimalizovaného přehrávače v aplikaci + Typ přehrávače + Vypnuto + Výchozí + Minimální + Moderní 1 + Moderní 2 + Moderní 3 + Moderní 4 + Zakázat zaoblené rohy + Rohy jsou čtvercové + Rohy jsou zaoblené + Povolit dvojitý klepnutí a přiblížení pro změnu velikosti + "Aktivováno dvojitým klepnutím a přiblížením pro změnu velikosti • Dvojitým klepnutím zvětšíte velikost \"miniplayeru\" • Dvojitým klepnutím znovu obnovíte původní velikost" - Dvojitý klepnutí a přiblížení pro změnu velikosti je zakázáno - Zakázat přetahování - Přetažení je zakázáno - "Aktivováno přetahování + Dvojitý klepnutí a přiblížení pro změnu velikosti je zakázáno + Zakázat přetahování + Přetažení je zakázáno + "Aktivováno přetahování \"Miniplayer\" lze přetáhnout do libovolného rohu obrazovky" - Zakázat horizontální gesto přetahování - Horizontální posun je zakázán - "Aktivováno horizontální přetahování + Zakázat horizontální gesto přetahování + Horizontální posun je zakázán + "Aktivováno horizontální přetahování \"Miniplayer\" lze přetáhnout z obrazovky doleva nebo doprava" - Skrýt tlačítka překrytí - Tlačítka překrytí jsou skrytá - Tlačítka překrytí jsou zobrazena - Skrýt podtexty - Podtexty jsou skryty - Podtexty jsou zobrazeny - Skrýt tlačítka pro přeskočení vpřed a vzad - Přeskočení vpřed a vzad je skryto - Přeskočení vpřed a vzad je zobrazeno - Počáteční velikost - Počáteční velikost na obrazovce, v pixelech - Velikost v pixelech musí být mezi %1$s a %2$s - Neprůhlednost překrytí - Hodnota průhlednosti v rozmezí 0-100, kde 0 je průhledné - Průhlednost překrytí přehrávače musí být v rozmezí 0-100 - - - Povolit přechodovou obrazovku načítání - Obrazovka načítání bude mít přechodové pozadí - Obrazovka načítání bude mít pevné pozadí - Styl úvodní obrazovky - Barva - Černobílá - Povolit vlastní barvu posuvníku - Vlasní barva posuvníku je zobrazena - Původní barva posuvníku je zobrazena - Vlastní barva posuvníku - Barva posuvníku - Vlastní zvýrazněná barva posuvníku - Zvýrazněná barva posuvníku - Neplatná hodnota barvy posuvníku - - - - - Logo záhlaví - Výchozí - Běžné - - ReVanced minimální - Vlastní - - - Obcházet omezení oblasti obrázků - Používá se hostitel obrázků yt4.ggpht.com - "Používá se původní hostitel obrázků + Skrýt tlačítka překrytí + Tlačítka překrytí jsou skrytá + Tlačítka překrytí jsou zobrazena + Skrýt podtexty + Podtexty jsou skryty + Podtexty jsou zobrazeny + Skrýt tlačítka pro přeskočení vpřed a vzad + Přeskočení vpřed a vzad je skryto + Přeskočení vpřed a vzad je zobrazeno + Počáteční velikost + Počáteční velikost na obrazovce, v pixelech + Velikost v pixelech musí být mezi %1$s a %2$s + Neprůhlednost překrytí + Hodnota průhlednosti v rozmezí 0-100, kde 0 je průhledné + Průhlednost překrytí přehrávače musí být v rozmezí 0-100 + + + Povolit přechodovou obrazovku načítání + Obrazovka načítání bude mít přechodové pozadí + Obrazovka načítání bude mít pevné pozadí + Styl úvodní obrazovky + Barva + Černobílá + Povolit vlastní barvu posuvníku + Vlasní barva posuvníku je zobrazena + Původní barva posuvníku je zobrazena + Vlastní barva posuvníku + Barva posuvníku + Vlastní zvýrazněná barva posuvníku + Zvýrazněná barva posuvníku + Neplatná hodnota barvy posuvníku + + + + Logo záhlaví + Výchozí + Běžné + + ReVanced minimální + Vlastní + + + Obcházet omezení oblasti obrázků + Používá se hostitel obrázků yt4.ggpht.com + "Používá se původní hostitel obrázků Povolení této funkce může opravit chybějící obrázky, které jsou v některých oblastech blokovány" - - - - Karta Domů - - Karta Odběry - - Karta Vy - Seznamy skladeb přehrávače & doporučení - Výsledky hledání - Původní náhledy - DeArrow & Původní náhledy - DeArrow & Zachycení snímků - Zachycení snímků - "DeArrow poskytuje miniatury videí YouTube z crowdsourcingu. Tyto miniatury jsou často relevantnější než ty, které poskytuje YouTube + + + + Karta Domů + + Karta Odběry + + Karta Vy + Seznamy skladeb přehrávače & doporučení + Výsledky hledání + Původní náhledy + DeArrow & Původní náhledy + DeArrow & Zachycení snímků + Zachycení snímků + "DeArrow poskytuje miniatury videí YouTube z crowdsourcingu. Tyto miniatury jsou často relevantnější než ty, které poskytuje YouTube Pokud je tato funkce povolena, budou adresy URL videí odeslány na server API a nebudou odesílány žádné další údaje. Pokud video nemá miniatury DeArrow, zobrazí se originální nebo statické snímky Klepnutím sem se dozvíte více o DeArrow" - Zobrazit toast, pokud API není k dispozici - Toast se zobrazí, pokud DeArrow není k dispozici - Toast se nezobrazí, pokud DeArrow není k dispozici - Koncový bod DeArrow API - URL koncového bodu mezipaměti náhledů DeArrow - Zachycení statických videí - Zachycení snímků se provádí z počátku/prostředku/konce každého videa. Tyto obrázky jsou vestavěny do YouTube a nepoužívá se žádné externí API - Použít rychlé zachycení snímků - Používá se zachycení snímků ve střední kvalitě. Náhledy se budou načítat rychleji, ale živé streamy, nezveřejněná nebo velmi stará videa můžou zobrazit prázdné náhledy - Používá se zachycení snímků ve vysoké kvalitě - Doba videa pro zachycení snímků - Počátek videa - Střed videa - Konec videa - - DeArrow je dočasně nedostupný (kód stavu: %s) - DeArrow je dočasně nedostupný - - - Zobrazit oznámení ReVanced - Oznámení při spuštění jsou zobrazena - Oznámení při spuštění nejsou zobrazena - Zobrazit oznámení při spuštění - Nepodařilo se připojit k poskytovateli oznámení - Zrušit - - - Povolit smyčku videa - Video se bude přehrávat ve smyčce - Video se nebude přehrávat ve smyčce - - - Zobrazit tlačítko pro smyčku videa - Tlačítko je zobrazeno - Tlačítko není zobrazeno - Smyčka videa je zapnuta - Smyčka videa je vypnuta - - - - - Napodobovat rozměry zařízení - "Rozměry zařízení jsou zfalšovány + Zobrazit toast, pokud API není k dispozici + Toast se zobrazí, pokud DeArrow není k dispozici + Toast se nezobrazí, pokud DeArrow není k dispozici + Koncový bod DeArrow API + URL koncového bodu mezipaměti náhledů DeArrow + Zachycení statických videí + Zachycení snímků se provádí z počátku/prostředku/konce každého videa. Tyto obrázky jsou vestavěny do YouTube a nepoužívá se žádné externí API + Použít rychlé zachycení snímků + Používá se zachycení snímků ve střední kvalitě. Náhledy se budou načítat rychleji, ale živé streamy, nezveřejněná nebo velmi stará videa můžou zobrazit prázdné náhledy + Používá se zachycení snímků ve vysoké kvalitě + Doba videa pro zachycení snímků + Počátek videa + Střed videa + Konec videa + + DeArrow je dočasně nedostupný (kód stavu: %s) + DeArrow je dočasně nedostupný + + + Zobrazit oznámení ReVanced + Oznámení při spuštění jsou zobrazena + Oznámení při spuštění nejsou zobrazena + Zobrazit oznámení při spuštění + Nepodařilo se připojit k poskytovateli oznámení + Zrušit + + + Povolit smyčku videa + Video se bude přehrávat ve smyčce + Video se nebude přehrávat ve smyčce + + + Zobrazit tlačítko pro smyčku videa + Tlačítko je zobrazeno + Tlačítko není zobrazeno + Smyčka videa je zapnuta + Smyčka videa je vypnuta + + + + Napodobovat rozměry zařízení + "Rozměry zařízení jsou zfalšovány Mohou být odemčeny vyšší kvality videa, ale může dojít k zadrhávání přehrávání videa, horší výdrži baterie a neznámým vedlejším efektům" - "Rozměry zařízení nejsou zfalšovány + "Rozměry zařízení nejsou zfalšovány Povolením této funkce lze odemknout vyšší kvality videa" - Povolení může způsobit zasekávání přehrávání, zhoršenou výdrž baterie a neznámé vedlejší účinky. - - - Haptická odezva - Změnit haptickou odezvu - Zakázat haptiku kapitol - Haptika kapitol je zakázána - Haptika kapitol je povolena - Zakázat haptiku pro přesné hledání - Haptická odezva při přesném vyhledávání je vypnutá - Haptika pro přesné hledání je povolena - Zakázat haptiku pro vrácení zpět vyhledávání - Haptika pro vrácení zpět vyhledávání je vypnutá - Haptika pro vrácení zpět vyhledávání je zapnutá - Zakázat haptiku pro zoom - Haptika zoomu je vypnutá - Haptika zoomu je zapnutá - - - Pokud jste nedávno změnili přihlašovací údaje svého účtu, odinstalujte a znovu nainstalujte MicroG. - - - Obcházet přesměrování URL - Přesměrování URL jsou obcházena - Přesměrování URL nejsou obcházena - - - Otevírat odkazy v prohlížeči - Otevírání odkazů v externím prohlížeči - Otevírání odkazů v prohlížeči v aplikaci - - - - Automaticky - Pamatovat si změny kvality videa - Změny kvality se vztahují na všechna videa - Změny kvality se vztahují pouze na aktuální video - Zobrazit hlášku při změnách kvality videa - Zobrazí se hláška, když je změněna výchozí kvalita videa - Nezobrazí se hláška, když je změněna výchozí kvalita videa - Výchozí kvalita videa v síti Wi-Fi - Výchozí kvalita videa v mobilní síti - Zapamatovat si změny kvality u položky Shorts - Změny kvality se vztahují na všechny {Shorts} - Změny kvality se vztahují pouze na aktuální {Shorts} - Výchozí kvalita Shorts v síti Wi-Fi - Výchozí kvalita Shorts v mobilní síti - mobilní - Wi-Fi - Výchozí kvalita %1$s změněna na: %2$s - Změněna kvalita Shorts %1$s na: %2$s - - - Zobrazit tlačítko dialogu rychlosti - Tlačítko dialogu rychlosti je zobrazeno. Klepnutím a podržením obnovíte rychlost přehrávání na výchozí - Tlačítko dialogu rychlosti není zobrazeno - - - Zobrazit tlačítko kvality videa - Tlačítko kvality videa je zobrazeno. Klepnutím a podržením obnovíte kvalitu na výchozí - Tlačítko kvality videa není zobrazeno - - - Menu vlastní rychlosti přehrávání - Menu vlastní rychlosti se zobrazuje - Menu vlastní rychlosti se nezobrazuje - Obnovit staré menu rychlosti přehrávání - Zobrazeno staré menu rychlosti - Zobrazeno moderní menu rychlosti - Vlastní rychlosti přehrávání - Přidat nebo změnit vlastní rychlosti přehrávání - Vlastní rychlosti musí být menší než %s - Neplatné vlastní rychlosti přehrávání - Automaticky - Vlastní rychlost stisknutí a podržení - Rychlost přehrávání 0 až 8 - - - Pamatovat si změny rychlosti přehrávání - Změny rychlosti přehrávání se vztahují na všechna videa - Změny rychlosti přehrávání se vztahují pouze na aktuální video - Zobrazit hlášku při změnách rychlosti přehrávání - Zobrazí se hláška, když je změněna výchozí rychlost přehrávání - Oznámení se nezobrazí, když je změněna výchozí rychlost přehrávání - Výchozí rychlost přehrávání - Výchozí rychlost změněna na: %s - - - Vypnout HDR video - HDR video je vypnuté. - HDR video je zapnuté. - Vynutit AVC (H.264) - Video kodek je vynucen na AVC (H.264) - Video kodek je určen automaticky - "Výhody: + Povolení může způsobit zasekávání přehrávání, zhoršenou výdrž baterie a neznámé vedlejší účinky. + + + Haptická odezva + Změnit haptickou odezvu + Zakázat haptiku kapitol + Haptika kapitol je zakázána + Haptika kapitol je povolena + Zakázat haptiku pro přesné hledání + Haptická odezva při přesném vyhledávání je vypnutá + Haptika pro přesné hledání je povolena + Zakázat haptiku pro vrácení zpět vyhledávání + Haptika pro vrácení zpět vyhledávání je vypnutá + Haptika pro vrácení zpět vyhledávání je zapnutá + Zakázat haptiku pro zoom + Haptika zoomu je vypnutá + Haptika zoomu je zapnutá + + + Pokud jste nedávno změnili přihlašovací údaje svého účtu, odinstalujte a znovu nainstalujte MicroG. + + + Obcházet přesměrování URL + Přesměrování URL jsou obcházena + Přesměrování URL nejsou obcházena + + + Otevírat odkazy v prohlížeči + Otevírání odkazů v externím prohlížeči + Otevírání odkazů v prohlížeči v aplikaci + + + + Automaticky + Pamatovat si změny kvality videa + Změny kvality se vztahují na všechna videa + Změny kvality se vztahují pouze na aktuální video + Zobrazit hlášku při změnách kvality videa + Zobrazí se hláška, když je změněna výchozí kvalita videa + Nezobrazí se hláška, když je změněna výchozí kvalita videa + Výchozí kvalita videa v síti Wi-Fi + Výchozí kvalita videa v mobilní síti + Zapamatovat si změny kvality u položky Shorts + Změny kvality se vztahují na všechny {Shorts} + Změny kvality se vztahují pouze na aktuální {Shorts} + Výchozí kvalita Shorts v síti Wi-Fi + Výchozí kvalita Shorts v mobilní síti + mobilní + Wi-Fi + Výchozí kvalita %1$s změněna na: %2$s + Změněna kvalita Shorts %1$s na: %2$s + + + Zobrazit tlačítko dialogu rychlosti + Tlačítko dialogu rychlosti je zobrazeno. Klepnutím a podržením obnovíte rychlost přehrávání na výchozí + Tlačítko dialogu rychlosti není zobrazeno + + + Zobrazit tlačítko kvality videa + Tlačítko kvality videa je zobrazeno. Klepnutím a podržením obnovíte kvalitu na výchozí + Tlačítko kvality videa není zobrazeno + + + Menu vlastní rychlosti přehrávání + Menu vlastní rychlosti se zobrazuje + Menu vlastní rychlosti se nezobrazuje + Obnovit staré menu rychlosti přehrávání + Zobrazeno staré menu rychlosti + Zobrazeno moderní menu rychlosti + Vlastní rychlosti přehrávání + Přidat nebo změnit vlastní rychlosti přehrávání + Vlastní rychlosti musí být menší než %s + Neplatné vlastní rychlosti přehrávání + Automaticky + Vlastní rychlost stisknutí a podržení + Rychlost přehrávání 0 až 8 + + + Pamatovat si změny rychlosti přehrávání + Změny rychlosti přehrávání se vztahují na všechna videa + Změny rychlosti přehrávání se vztahují pouze na aktuální video + Zobrazit hlášku při změnách rychlosti přehrávání + Zobrazí se hláška, když je změněna výchozí rychlost přehrávání + Oznámení se nezobrazí, když je změněna výchozí rychlost přehrávání + Výchozí rychlost přehrávání + Výchozí rychlost změněna na: %s + + + Vypnout HDR video + HDR video je vypnuté. + HDR video je zapnuté. + Vynutit AVC (H.264) + Video kodek je vynucen na AVC (H.264) + Video kodek je určen automaticky + "Výhody: • Může zlepšit životnost baterie • Může obnovit chybějící rozlišení videa na starším zařízení @@ -1641,178 +1638,177 @@ Omezení: • Přehrávání videa spotřebuje více internetových dat než VP9 nebo AV1 • HDR videa nebudou používat AVC • Některá zařízení nemohou vynutit AVC" - - - Zobrazit rozšířené menu kvality videa - Zobrazuje se rozšířené menu kvality videa - Nezobrazuje se rozšířené menu kvality videa - - - Povolit posun pro hledání - Posun pro hledání je povolen - Posun pro hledání není povolen - - - Povolit Android VR AV1 - "Video kodek je AVC (H.264), VP9 nebo AV1 + + + Zobrazit rozšířené menu kvality videa + Zobrazuje se rozšířené menu kvality videa + Nezobrazuje se rozšířené menu kvality videa + + + Povolit posun pro hledání + Posun pro hledání je povolen + Posun pro hledání není povolen + + + Povolit Android VR AV1 + "Video kodek je AVC (H.264), VP9 nebo AV1 Přehrávání se může zasekávat nebo přeskakovat snímky" - Video kodek je AVC (H.264) nebo VP9 - "Povolení tohoto nastavení může využívat softwarové dekódování AV1. + Video kodek je AVC (H.264) nebo VP9 + "Povolení tohoto nastavení může využívat softwarové dekódování AV1. Přehrávání videa s AV1 se může sekat nebo vypadávat snímky." - Vedlejší účinky maskování - • Experimentální klient a může kdykoli přestat fungovat - • Video se může zastavit v 1:00 nebo nemusí být dostupné v některých oblastech - • Chybí nabídka zvukových stop - • Žádný video kodek AV1 - • Stabilní hlasitost není k dispozici - • Dětská videa se nemusí přehrávat, když jste odhlášení nebo v anonymním režimu - - • Vynutit původní zvuk není k dispozici - Zobrazit ve statistikách pro nadšence - Typ klienta se zobrazuje ve statistikách pro nadšence - Klient je skrytý ve statistikách pro nadšence - - - - - - - O aplikaci - Reklamy - Obecné - Přehrávač - Různé - - - Skrýt videoreklamy - Videoreklamy jsou skryty - Videoreklamy jsou zobrazeny - - - Povolit trvalé opakování - Trvalé opakování je povoleno - Trvalé opakování je zakázáno - - - Skrýt tlačítko Odesílat - Tlačítko Odesílat je skryté - Tlačítko Odesílat je zobrazené - Skrýt tlačítko historie - Tlačítko historie je skryté - Tlačítko historie je zobrazeno - Skrýt tlačítko oznámení - Tlačítko oznámení je skryté - Tlačítko oznámení je zobrazené - Skrýt tlačítko vyhledávání - Tlačítko vyhledávání je skryté - Tlačítko vyhledávání je zobrazené - - - Skrýt panel kategorií - Panel kategorií je skryt - Panel kategorií je zobrazen - - - Změnit barvu minipřehrávače - Barva minipřehrávače odpovídá přehrávači na celou obrazovku - Minipřehrávač používá výchozí barvu - - - Navigační panel - Skrýt nebo změnit tlačítka navigačního panelu - - Skrýt Domů - Tlačítko Domů je skryté - Tlačítko Domů je zobrazeno - - Skrýt Ukázky - Tlačítko Ukázky je skryté - Tlačítko Ukázky je zobrazeno - - Skrýt Prozkoumat - Tlačítko Prozkoumat je skryté - Tlačítko Prozkoumat je zobrazeno - - Skrýt Knihovnu - Tlačítko Knihovna je skryté - Tlačítko Knihovna je zobrazeno - - Skrýt Upgradovat - Tlačítko Vylepšit je skryté - Tlačítko Vylepšit je zobrazeno - Skrýt navigační panel - Navigační panel je skrytý - Navigační panel je zobrazen - Skrýt popisky navigačních tlačítek - Popisky jsou skryté - Popisky jsou zobrazeny - - - Skrýt štítek \"Získat Music Premium\" - Štítek je skryt - Štítek je zobrazen - - - Skrýt tlačítko pro upgrade - Tlačítko je skryto - Tlačítko je zobrazeno - - - - - Blokovat zvukové reklamy - Zvukové reklamy jsou blokovány - Zvukové reklamy jsou neblokované - - - %s nedostupný, reklamy se mohou zobrazit. Zkuste změnit službu blokování reklam v nastavení. - %s vrátil chybu, reklamy se mohou zobrazit. Zkuste změnit službu blokování reklam v nastavení. - Blokovat vložené video reklamy - Vypnuto - Proxy Luminous - Proxy PurpleAdBlock - - - Blokovat video reklamy - Video reklamy jsou blokovány - Video reklamy jsou neblokované - - - Zpráva smazána - Zobrazit smazané zprávy - Nezobrazovat smazané zprávy - Skrýt smazané zprávy za spoiler - Zobrazit smazané zprávy jako přeškrtnutý text - - - Automaticky získat Channel Points - Channel Points se získávají automaticky - Channel Points se nezískávají automaticky - - - - Povolit režim ladění Twitch - Režim ladění Twitch je povolen (nedoporučeno) - Režim ladění Twitch je zakázán - - - Nastavení ReVanced - O aplikaci - O ReVanced - Blokování reklam - Nastavení blokování reklam - Nastavení chatu - Různé - Různé nastavení - Obecné nastavení - Další nastavení - Reklamy na straně klienta - Reklamy Surestream na straně serveru - Debugovací záznamy - Debugovací záznamy jsou zapnuty - Debugovací záznamy jsou vypnuty - - + Vedlejší účinky maskování + • Experimentální klient a může kdykoli přestat fungovat + • Video se může zastavit v 1:00 nebo nemusí být dostupné v některých oblastech + • Chybí nabídka zvukových stop + • Žádný video kodek AV1 + • Stabilní hlasitost není k dispozici + • Dětská videa se nemusí přehrávat, když jste odhlášení nebo v anonymním režimu + + • Vynutit původní zvuk není k dispozici + Zobrazit ve statistikách pro nadšence + Typ klienta se zobrazuje ve statistikách pro nadšence + Klient je skrytý ve statistikách pro nadšence + + + + + + O aplikaci + Reklamy + Obecné + Přehrávač + Různé + + + Skrýt videoreklamy + Videoreklamy jsou skryty + Videoreklamy jsou zobrazeny + + + Povolit trvalé opakování + Trvalé opakování je povoleno + Trvalé opakování je zakázáno + + + Skrýt tlačítko Odesílat + Tlačítko Odesílat je skryté + Tlačítko Odesílat je zobrazené + Skrýt tlačítko historie + Tlačítko historie je skryté + Tlačítko historie je zobrazeno + Skrýt tlačítko oznámení + Tlačítko oznámení je skryté + Tlačítko oznámení je zobrazené + Skrýt tlačítko vyhledávání + Tlačítko vyhledávání je skryté + Tlačítko vyhledávání je zobrazené + + + Skrýt panel kategorií + Panel kategorií je skryt + Panel kategorií je zobrazen + + + Změnit barvu minipřehrávače + Barva minipřehrávače odpovídá přehrávači na celou obrazovku + Minipřehrávač používá výchozí barvu + + + Navigační panel + Skrýt nebo změnit tlačítka navigačního panelu + + Skrýt Domů + Tlačítko Domů je skryté + Tlačítko Domů je zobrazeno + + Skrýt Ukázky + Tlačítko Ukázky je skryté + Tlačítko Ukázky je zobrazeno + + Skrýt Prozkoumat + Tlačítko Prozkoumat je skryté + Tlačítko Prozkoumat je zobrazeno + + Skrýt Knihovnu + Tlačítko Knihovna je skryté + Tlačítko Knihovna je zobrazeno + + Skrýt Upgradovat + Tlačítko Vylepšit je skryté + Tlačítko Vylepšit je zobrazeno + Skrýt navigační panel + Navigační panel je skrytý + Navigační panel je zobrazen + Skrýt popisky navigačních tlačítek + Popisky jsou skryté + Popisky jsou zobrazeny + + + Skrýt štítek \"Získat Music Premium\" + Štítek je skryt + Štítek je zobrazen + + + Skrýt tlačítko pro upgrade + Tlačítko je skryto + Tlačítko je zobrazeno + + + + + Blokovat zvukové reklamy + Zvukové reklamy jsou blokovány + Zvukové reklamy jsou neblokované + + + %s nedostupný, reklamy se mohou zobrazit. Zkuste změnit službu blokování reklam v nastavení. + %s vrátil chybu, reklamy se mohou zobrazit. Zkuste změnit službu blokování reklam v nastavení. + Blokovat vložené video reklamy + Vypnuto + Proxy Luminous + Proxy PurpleAdBlock + + + Blokovat video reklamy + Video reklamy jsou blokovány + Video reklamy jsou neblokované + + + Zpráva smazána + Zobrazit smazané zprávy + Nezobrazovat smazané zprávy + Skrýt smazané zprávy za spoiler + Zobrazit smazané zprávy jako přeškrtnutý text + + + Automaticky získat Channel Points + Channel Points se získávají automaticky + Channel Points se nezískávají automaticky + + + + Povolit režim ladění Twitch + Režim ladění Twitch je povolen (nedoporučeno) + Režim ladění Twitch je zakázán + + + Nastavení ReVanced + O aplikaci + O ReVanced + Blokování reklam + Nastavení blokování reklam + Nastavení chatu + Různé + Různé nastavení + Obecné nastavení + Další nastavení + Reklamy na straně klienta + Reklamy Surestream na straně serveru + Debugovací záznamy + Debugovací záznamy jsou zapnuty + Debugovací záznamy jsou vypnuty + + diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index b774663218..b3104307b3 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -17,1258 +17,1257 @@ "First 'item' text Second \"item\" text" ---> - - - - Appnavn - - Tilpasset - Appikon - - ReVanced skaleret - - Tilpasset - - - Kontrol mislykkedes - Åbn officiel hjemmeside - Ignorer - <h5>Denne app ser ikke ud til at være blevet patcht af dig.</h5><br>Denne app fungerer muligvis ikke korrekt, og den <b style=\"color: red;\">kan være skadelig eller endda farlig at bruge.</b><br><br>Disse kontroller indikerer, at denne app er for-patched eller erhvervet fra en anden person:<br><br><small>%1$s</small><br>Det anbefales kraftigt at <b style=\"color: blue;\">afinstallere denne app og patche den selv</b> for at sikre, at du bruger en valideret og sikker app.<p><br>Hvis det ignoreres, vises denne advarsel kun to gange. - Rettet på en anden enhed - Ikke installeret af ReVanced Manager - Patched mere end 10 minutter siden - Patched for %s dage siden - APK byggedato er ødelagt - - - ReVanced Meddelelse - Din urhistorik gemmes ikke.<br><br>Dette skyldes sandsynligvis en DNS-annonceblokker eller netværksproxy.<br><br>For at løse dette, whitelist <b>s.youtube.com</b> eller slå alle DNS-blokkere og fuldmagter fra. - Vis ikke igen - - - Indstillinger - Er du sikker på, at du vil fortsætte? - Gem - Nulstil - Nulstil farve - Ugyldig farve - Genstart kræves - Genstart appen for at denne ændring træder i kraft. - Genstart - Importer - Kopier - ReVanced-indstillinger nulstillet til standard - %d indstillinger importeret - Import mislykkedes: %s - Søg i indstillinger - Ingen resultater fundet for \'%s\' - Prøv et andet søgeord - Seneste søgninger - Fjern fra søgehistorik? - Ryd søgehistorik - Er du sikker på, at du vil rydde al søgehistorik? - Søgetips - "• Tryk på en sti for at navigere til den +--> + + + Appnavn + + Tilpasset + Appikon + + ReVanced skaleret + + Tilpasset + + + Kontrol mislykkedes + Åbn officiel hjemmeside + Ignorer + <h5>Denne app ser ikke ud til at være blevet patcht af dig.</h5><br>Denne app fungerer muligvis ikke korrekt, og den <b style=\"color: red;\">kan være skadelig eller endda farlig at bruge.</b><br><br>Disse kontroller indikerer, at denne app er for-patched eller erhvervet fra en anden person:<br><br><small>%1$s</small><br>Det anbefales kraftigt at <b style=\"color: blue;\">afinstallere denne app og patche den selv</b> for at sikre, at du bruger en valideret og sikker app.<p><br>Hvis det ignoreres, vises denne advarsel kun to gange. + Rettet på en anden enhed + Ikke installeret af ReVanced Manager + Patched mere end 10 minutter siden + Patched for %s dage siden + APK byggedato er ødelagt + + + ReVanced Meddelelse + Din urhistorik gemmes ikke.<br><br>Dette skyldes sandsynligvis en DNS-annonceblokker eller netværksproxy.<br><br>For at løse dette, whitelist <b>s.youtube.com</b> eller slå alle DNS-blokkere og fuldmagter fra. + Vis ikke igen + + + Indstillinger + Er du sikker på, at du vil fortsætte? + Gem + Nulstil + Nulstil farve + Ugyldig farve + Genstart kræves + Genstart appen for at denne ændring træder i kraft. + Genstart + Importer + Kopier + ReVanced-indstillinger nulstillet til standard + %d indstillinger importeret + Import mislykkedes: %s + Søg i indstillinger + Ingen resultater fundet for \'%s\' + Prøv et andet søgeord + Seneste søgninger + Fjern fra søgehistorik? + Ryd søgehistorik + Er du sikker på, at du vil rydde al søgehistorik? + Søgetips + "• Tryk på en sti for at navigere til den • Tryk længe på en indstilling for at navigere til den • Tryk på Enter for at gemme en søgeforespørgsel i historikken • Søgning ignorerer store/små bogstaver og tegnsætning • Overordnede indstillinger vises over deaktiverede underordnede indstillinger" - Søgehistorikken er tom - For at gemme søgehistorik skal du skrive en søgeforespørgsel og trykke på Enter - Vis indstillingssøgehistorik - Indstillingssøgehistorik vises - Søgehistorik for indstillinger vises ikke - Vis ReVanced-indstillingsikoner - Indstillingsikoner vises - Indstillingsikoner vises ikke - ReVanced-sprog - "Oversættelser for nogle sprog kan mangle eller være ufuldstændige. + Søgehistorikken er tom + For at gemme søgehistorik skal du skrive en søgeforespørgsel og trykke på Enter + Vis indstillingssøgehistorik + Indstillingssøgehistorik vises + Søgehistorik for indstillinger vises ikke + Vis ReVanced-indstillingsikoner + Indstillingsikoner vises + Indstillingsikoner vises ikke + ReVanced-sprog + "Oversættelser for nogle sprog kan mangle eller være ufuldstændige. For at oversætte nye sprog eller forbedre de eksisterende oversættelser, besøg translate.revanced.app" - App-sprog - Importér/Eksportér - Importér/Eksportér ReVanced-indstillinger - - Du bruger ReVanced-patches version <i>%s</i> - Bemærk - Denne version er en pre-release, og du kan opleve uventede problemer - Officielle links - + Du bruger ReVanced-patches version <i>%s</i> + Bemærk + Denne version er en pre-release, og du kan opleve uventede problemer + Officielle links + - - - GmsCore Indstillinger - Indstillinger for GmsCore - - MicroG GmsCore er ikke installeret. Installer det. - Handling påkrævet - "MicroG GmsCore har ikke tilladelse til at køre i baggrunden. + + + GmsCore Indstillinger + Indstillinger for GmsCore + + MicroG GmsCore er ikke installeret. Installer det. + Handling påkrævet + "MicroG GmsCore har ikke tilladelse til at køre i baggrunden. Følg \"Dræb ikke min app\"-vejledningen til din telefon, og anvend instruktionerne på din MicroG-installation. Dette er påkrævet for, at appen fungerer." - Åbn hjemmeside - "MicroG GmsCore-batterioptimeringer skal deaktiveres for at forhindre problemer. + Åbn hjemmeside + "MicroG GmsCore-batterioptimeringer skal deaktiveres for at forhindre problemer. Deaktivering af batterioptimeringer for MicroG vil ikke påvirke batteriforbruget negativt. Tap på knappen Fortsæt, og tillad optimeringsændringer." - Fortsæt - - - Simuler videostreams - Simuler klientens videostreams for at forhindre afspilningsproblemer - Spoof videostreams - "Videostreams er spoofede + Fortsæt + + + Simuler videostreams + Simuler klientens videostreams for at forhindre afspilningsproblemer + Spoof videostreams + "Videostreams er spoofede Hvis du er en YouTube Premium-bruger, er denne indstilling muligvis ikke påkrævet" - "Videostreams simuleres ikke + "Videostreams simuleres ikke Afspilning fungerer muligvis ikke" - Deaktivering af denne indstilling kan forårsage afspilningsproblemer. - Standard klient - - - Tving originalt lydsprog - Bruger originalt lydsprog - Brug standard lyd - - For at bruge denne funktion skal du ændre \"Forfalsk videostreams\" til en hvilken som helst klient undtagen Android Studio - - - Fejlfinding - Aktivér eller deaktiver fejlfindingsindstillinger - Fejlfindingslogning - Fejlfindingslogge er aktiveret - Fejlfindingslogge er deaktiveret - Logstakspor - Fejlfindingslogge inkluderer stakspor - Fejlfindingslogge inkluderer ikke stakspor - Vis toastbesked ved ReVanced-fejl - Toast vises, hvis der opstår en fejl - Toast vises ikke, hvis der opstår en fejl - "Hvis du deaktiverer fejl-toasts, skjules alle ReVanced-fejlmeddelelser. + Deaktivering af denne indstilling kan forårsage afspilningsproblemer. + Standard klient + + + Tving originalt lydsprog + Bruger originalt lydsprog + Brug standard lyd + + For at bruge denne funktion skal du ændre \"Forfalsk videostreams\" til en hvilken som helst klient undtagen Android Studio + + + Fejlfinding + Aktivér eller deaktiver fejlfindingsindstillinger + Fejlfindingslogning + Fejlfindingslogge er aktiveret + Fejlfindingslogge er deaktiveret + Logstakspor + Fejlfindingslogge inkluderer stakspor + Fejlfindingslogge inkluderer ikke stakspor + Vis toastbesked ved ReVanced-fejl + Toast vises, hvis der opstår en fejl + Toast vises ikke, hvis der opstår en fejl + "Hvis du deaktiverer fejl-toasts, skjules alle ReVanced-fejlmeddelelser. Du modtager ikke notifikationer om uventede hændelser." - Eksportér fejlsøgningslogfiler - Kopierer ReVanced-fejlsøgningslogfiler til udklipsholderen - Fejlsøgningslogning er deaktiveret - Ingen logfiler fundet - Logfiler kopieret - Kunne ikke eksportere logfiler: %s - Ryd fejlsøgningslogfiler - Rydder alle gemte ReVanced-fejlsøgningslogfiler - Logfiler ryddet - Funktionsflag Manager - Administrer booleske funktionsflag - Aktive flag (%d) - Blokerede flag (%d) - Søg flag... - Flag gemt - Flag nulstillet - Flag kopieret til udklipsholder - Logprotokolbuffer - Fejlfindingslogge inkluderer protobuffer - Fejlfindingslogge inkluderer ikke protobuffer - "Aktivering af denne indstilling logger yderligere layoutdata, inklusive tekst på skærmen for nogle UI-komponenter. + Eksportér fejlsøgningslogfiler + Kopierer ReVanced-fejlsøgningslogfiler til udklipsholderen + Fejlsøgningslogning er deaktiveret + Ingen logfiler fundet + Logfiler kopieret + Kunne ikke eksportere logfiler: %s + Ryd fejlsøgningslogfiler + Rydder alle gemte ReVanced-fejlsøgningslogfiler + Logfiler ryddet + Funktionsflag Manager + Administrer booleske funktionsflag + Aktive flag (%d) + Blokerede flag (%d) + Søg flag... + Flag gemt + Flag nulstillet + Flag kopieret til udklipsholder + Logprotokolbuffer + Fejlfindingslogge inkluderer protobuffer + Fejlfindingslogge inkluderer ikke protobuffer + "Aktivering af denne indstilling logger yderligere layoutdata, inklusive tekst på skærmen for nogle UI-komponenter. Dette kan hjælpe med at identificere komponenter, når der oprettes brugerdefinerede filtre. Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse." - - - Rens delingslinks - Sporingsforespørgselsparameter er fjernet fra delte links - Sporingsforespørgselsparameter er ikke fjernet fra delte links - Skift delingslinks til youtube.com - Delte links bruger youtube.com - Delte links bruger music.youtube.com - - - Tilpasset filter - Skjul komponenter ved hjælp af brugerdefinerede filtre - Aktiver brugerdefineret filter - Brugerdefineret filter er aktiveret - Brugerdefineret filter er deaktiveret - Tilpasset filter - - Liste over stigenereringsstrenge til filtrering adskilt af ny linje - Ugyldigt brugerdefineret filter: %s - - - - - Om - Annoncer - Alternative miniaturebilleder - Generelt - Afspiller - Søg i videon - Strygekontroller - Diverse - Gendan gamle indstillingsmenuer - Gamle indstillingsmenuer er vist - Gamle indstillingsmenuer er ikke vist - - - Deaktiver baggrundsafspilning af Shorts - Baggrundsafspilning af Shorts er deaktiveret - Baggrundsafspilning af Shorts er aktiveret - - - Skjul albumkort - Albumkort er skjult - Albumkort vises - Skjul kunstnerkort - Kunstnerkort er skjult - Kunstnerkort vises - Skjul chips hylde - Chips hylde er skjult - Chips hylde er vist - Skjul fællesskabs indlæg - Fællesskabs indlæg er skjult - Fællesskabs indlæg er vist - Skjul kompakte bannere - Kompakte bannere er skjult - Kompakte bannere vises - Skjul udvideligt kort - Udvideligt kort under videoer er skjult - Udvideligt kort under videoer er vist - Skjul flydende mikrofonknap - Svævende mikrofonknap i søgning er skjult - Flydende mikrofonknap i søgning vises - Skjul vandrette hylder - "Horisontale hylder er skjult, såsom: + + + Rens delingslinks + Sporingsforespørgselsparameter er fjernet fra delte links + Sporingsforespørgselsparameter er ikke fjernet fra delte links + Skift delingslinks til youtube.com + Delte links bruger youtube.com + Delte links bruger music.youtube.com + + + Tilpasset filter + Skjul komponenter ved hjælp af brugerdefinerede filtre + Aktiver brugerdefineret filter + Brugerdefineret filter er aktiveret + Brugerdefineret filter er deaktiveret + Tilpasset filter + + Liste over stigenereringsstrenge til filtrering adskilt af ny linje + Ugyldigt brugerdefineret filter: %s + + + + + Om + Annoncer + Alternative miniaturebilleder + Generelt + Afspiller + Søg i videon + Strygekontroller + Diverse + Gendan gamle indstillingsmenuer + Gamle indstillingsmenuer er vist + Gamle indstillingsmenuer er ikke vist + + + Deaktiver baggrundsafspilning af Shorts + Baggrundsafspilning af Shorts er deaktiveret + Baggrundsafspilning af Shorts er aktiveret + + + Skjul albumkort + Albumkort er skjult + Albumkort vises + Skjul kunstnerkort + Kunstnerkort er skjult + Kunstnerkort vises + Skjul chips hylde + Chips hylde er skjult + Chips hylde er vist + Skjul fællesskabs indlæg + Fællesskabs indlæg er skjult + Fællesskabs indlæg er vist + Skjul kompakte bannere + Kompakte bannere er skjult + Kompakte bannere vises + Skjul udvideligt kort + Udvideligt kort under videoer er skjult + Udvideligt kort under videoer er vist + Skjul flydende mikrofonknap + Svævende mikrofonknap i søgning er skjult + Flydende mikrofonknap i søgning vises + Skjul vandrette hylder + "Horisontale hylder er skjult, såsom: • Seneste nyheder • Fortsæt med at se • Udforsk flere kanaler • Mest relevante • Shopping • Se igen" - Vandrette hylder vises - Skjul billedhylde - Billedhylde i søgeresultater er skjult - Billedhylde i søgeresultater er vist - Skjul seneste indlæg - Seneste indlæg er skjult - Seneste indlæg vises - Skjul miks afspilningslister - Mix afspilningslister er skjult - Mix afspilningslister vises - Skjul filmsektion - Afsnittet Film er skjult - Afsnittet Film vises - - Skjul knappen \'Underret mig\' - Giv mig besked-knap er skjult - Giv mig besked-knap vises - Skjul Spilleobjekter - Spilleobjekter er skjult - Afspilningstabeller vises - - Skjul knappen \'Vis mere\' - Vis mere-knap i søgeresultater er skjult - Vis mere-knap i søgeresultater vises - Skjul undersøgelser - Spørgeundersøgelser er skjult - Spørgeundersøgelser vises - Skjul billetreolen - Billetreolen er skjult - Billetreolen vises - - Skjul etiketter for videoanbefalinger - \'Folk har også set\'- og \'Du vil måske også synes om\'-etiketter i søgeresultater er skjult - \'Folk har også set\'- og \'Du vil måske også synes om\'-etiketter i søgeresultater vises - Skjul visuelt mellemrum - Visuelt mellemrum er skjult - Visuelt mellemrum vises - - Skjul YouTube-Doudler - YouTube Doodles-animation på logoet er skjult - YouTube Doodles-animation på logoet vises - "YouTube-doodles vises et par dage om året. + Skjul knappen \'Vis mere\' + Vis mere-knap i søgeresultater er skjult + Vis mere-knap i søgeresultater vises + Skjul undersøgelser + Spørgeundersøgelser er skjult + Spørgeundersøgelser vises + Skjul billetreolen + Billetreolen er skjult + Billetreolen vises + + Skjul etiketter for videoanbefalinger + \'Folk har også set\'- og \'Du vil måske også synes om\'-etiketter i søgeresultater er skjult + \'Folk har også set\'- og \'Du vil måske også synes om\'-etiketter i søgeresultater vises + Skjul visuelt mellemrum + Visuelt mellemrum er skjult + Visuelt mellemrum vises + + Skjul YouTube-Doudler + YouTube Doodles-animation på logoet er skjult + YouTube Doodles-animation på logoet vises + "YouTube-doodles vises et par dage om året. Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er aktiveret, skjules filterfeltet under søgefeltet også." - Skjul kanallinje - Kanalbjælken er skjult - Kanalbjælken vises - Skjul kanalvandmærke - Vandmærke er skjult - Vandmærke er vist - Skjul crowdfunding-boks - Crowdfunding-boks er skjult - Crowdfunding-boks er vist - Skjul nødbokse - Nødbokse er skjult - Nødbokse vises - Skjul infopaneler - Infopaneler er skjult - Infopaneler vises - - Skjul knappen \"Deltag\" - Tilmeld-knap er skjult - Tilmeld-knap vises - Skjul medicinske paneler - Medicinske paneler er skjult - Medicinske paneler er vist - Skjul hurtige handlinger - Hurtige handlinger i fuldskærm er skjult - Hurtige handlinger i fuldskærm er vist - Skjul relaterede videoer - Relaterede videoer i hurtige handlinger er skjult - Relaterede videoer i hurtige handlinger er vist - Skjul retningslinjer for abonnenter - Abonnenter community retningslinjer er skjult - Abonnenter community retningslinjer er vist - Skjul tidsreaktioner - Tidsreaktioner skjules - Tidsreaktioner vises - Skjul \"AI-genereret videooversigt\" - AI-genereret videooversigt er skjult - AI-genereret videooversigtssektion vises - Skjul Spørg - Spørgsmål sektionen er skjult - Spørgsmål sektionen vises - Skjul attributter - Fremhævede steder, spil, musik og sektioner med omtalte personer er skjult - Fremhævede steder, spil, musik og sektioner med omtalte personer vises - Skjul kapitler - Kapitler sektion er skjult - Kapitel afsnit er vist - Skjul \"Hvordan dette indhold blev lavet\" - Sektionen Sådan blev dette indhold lavet er skjult - Sektionen Sådan blev dette indhold lavet vises - Skjul Hype-point - Hype-point er skjult - Hype-point er vist - Skjul \"Udforsk podcasten\" - Sektionen Udforsk podcasten er skjult - Sektionen Udforsk podcasten vises - Skjul fremhævede links - Sektionen med fremhævede links er skjult - Sektionen med fremhævede links er vist - Skjul fremhævede videoer - Sektionen med fremhævede videoer er skjult - Sektionen med fremhævede videoer er vist - Skjul infokort - Info-kort sektion er skjult - Info-kort sektion er vist - Skjul \"Nøglebegreber\" - Nøglebegrebssektionen er skjult - Nøglebegrebssektionen vises - Skjul abonner-knappen - Abonner-knappen er skjult - Abonner-knappen er vist - Skjul udskrift - Afsnittet er skjult - Afsnittet er vist - Video beskrivelse - Skjul eller vis komponenter til videobeskrivelse - Filtrer bjælke - Skjul eller vis filterlinjen i feeds, relaterede videoer, søgeresultater og seerhistorik - Skjul i feeds - Skjult i feeds - Vist i feeds - Skjul i relaterede videoer - Skjult i relaterede videoer - Vist i relaterede videoer - Skjul i søgeresultater - Skjult i søgeresultater - Vises i søgeresultater - Skjul i seerhistorik - Skjult i seerhistorik - Vist i seerhistorik - Kanalside - Skjul eller vis kanalsidekomponenter - - Skjul knappen Fællesskab - Fællesskabs-knap er skjult - Fællesskabs-knap vises - - Skjul hylden \"Til dig\" - Til dig-hylden er skjult - Til dig-hylden er vist - - Skjul Tilmeld-knap - Tilmeld-knap er skjult - Tilmeld-knap vises - Skjul forhåndsvisning af links - Forhåndsvisning af links er skjult - Forhåndsvisning af links er vist - Skjul medlemshylden - Medlemshylden er skjult - Medlemsvisning er vist - - Skjul Butik-knap - Butik-knap er skjult - Butik-knap vises - - Skjul Abonner-knap - Abonner-knap er skjult - Abonner-knap vises - Kommentarer - Skjul eller vis kommentarer sektion komponenter - Skjul AI-chatsammendrag - AI-chatsammendrag er skjult - AI-chatsammendrag vises - Skjul AI Kommentar-oversigt - AI-kommentarsammendrag er skjult - AI-kommentarsammendrag vises - Skjul kanalretningslinjer - Kanalretningslinjer er skjult - Kanalretningslinjer er vist - Skjul \'Kommentarer fra medlemmer\' header - Kommentarer fra medlemmers overskrift er skjult - Kommentarer fra medlemmers overskrift vises - Skjul kommentarsektion - Kommentarer sektion er skjult - Kommentarer sektion er vist - Skjul fællesskabsretningslinjer - Fællesskabsretningslinjer er skjult - Fællesskabsretningslinjer er vist - Skjul knappen \"Opret en Short\" - Opret en Short knap er skjult - Opret en Short knap vises - Skjul Emoji- og Tidsstempelknapper - Emoji- og Tidsstempelknapper er skjult - Emoji- og Tidsstempelknapper vises - Skjul forhåndsvisning kommentar - Forhåndsvisning kommentar er skjult - Forhåndsvis kommentar er vist - Skjul \"Tak\"-knap - Tak knappen er skjult - Tak knappen er vist - Skjul antal visninger - Antal visninger er skjult i feed og søgeresultater - Antal visninger vises i feed og søgeresultater - - "Begrænsninger: + Skjul knappen \"Deltag\" + Tilmeld-knap er skjult + Tilmeld-knap vises + Skjul medicinske paneler + Medicinske paneler er skjult + Medicinske paneler er vist + Skjul hurtige handlinger + Hurtige handlinger i fuldskærm er skjult + Hurtige handlinger i fuldskærm er vist + Skjul relaterede videoer + Relaterede videoer i hurtige handlinger er skjult + Relaterede videoer i hurtige handlinger er vist + Skjul retningslinjer for abonnenter + Abonnenter community retningslinjer er skjult + Abonnenter community retningslinjer er vist + Skjul tidsreaktioner + Tidsreaktioner skjules + Tidsreaktioner vises + Skjul \"AI-genereret videooversigt\" + AI-genereret videooversigt er skjult + AI-genereret videooversigtssektion vises + Skjul Spørg + Spørgsmål sektionen er skjult + Spørgsmål sektionen vises + Skjul attributter + Fremhævede steder, spil, musik og sektioner med omtalte personer er skjult + Fremhævede steder, spil, musik og sektioner med omtalte personer vises + Skjul kapitler + Kapitler sektion er skjult + Kapitel afsnit er vist + Skjul \"Hvordan dette indhold blev lavet\" + Sektionen Sådan blev dette indhold lavet er skjult + Sektionen Sådan blev dette indhold lavet vises + Skjul Hype-point + Hype-point er skjult + Hype-point er vist + Skjul \"Udforsk podcasten\" + Sektionen Udforsk podcasten er skjult + Sektionen Udforsk podcasten vises + Skjul fremhævede links + Sektionen med fremhævede links er skjult + Sektionen med fremhævede links er vist + Skjul fremhævede videoer + Sektionen med fremhævede videoer er skjult + Sektionen med fremhævede videoer er vist + Skjul infokort + Info-kort sektion er skjult + Info-kort sektion er vist + Skjul \"Nøglebegreber\" + Nøglebegrebssektionen er skjult + Nøglebegrebssektionen vises + Skjul abonner-knappen + Abonner-knappen er skjult + Abonner-knappen er vist + Skjul udskrift + Afsnittet er skjult + Afsnittet er vist + Video beskrivelse + Skjul eller vis komponenter til videobeskrivelse + Filtrer bjælke + Skjul eller vis filterlinjen i feeds, relaterede videoer, søgeresultater og seerhistorik + Skjul i feeds + Skjult i feeds + Vist i feeds + Skjul i relaterede videoer + Skjult i relaterede videoer + Vist i relaterede videoer + Skjul i søgeresultater + Skjult i søgeresultater + Vises i søgeresultater + Skjul i seerhistorik + Skjult i seerhistorik + Vist i seerhistorik + Kanalside + Skjul eller vis kanalsidekomponenter + + Skjul knappen Fællesskab + Fællesskabs-knap er skjult + Fællesskabs-knap vises + + Skjul hylden \"Til dig\" + Til dig-hylden er skjult + Til dig-hylden er vist + + Skjul Tilmeld-knap + Tilmeld-knap er skjult + Tilmeld-knap vises + Skjul forhåndsvisning af links + Forhåndsvisning af links er skjult + Forhåndsvisning af links er vist + Skjul medlemshylden + Medlemshylden er skjult + Medlemsvisning er vist + + Skjul Butik-knap + Butik-knap er skjult + Butik-knap vises + + Skjul Abonner-knap + Abonner-knap er skjult + Abonner-knap vises + Kommentarer + Skjul eller vis kommentarer sektion komponenter + Skjul AI-chatsammendrag + AI-chatsammendrag er skjult + AI-chatsammendrag vises + Skjul AI Kommentar-oversigt + AI-kommentarsammendrag er skjult + AI-kommentarsammendrag vises + Skjul kanalretningslinjer + Kanalretningslinjer er skjult + Kanalretningslinjer er vist + Skjul \'Kommentarer fra medlemmer\' header + Kommentarer fra medlemmers overskrift er skjult + Kommentarer fra medlemmers overskrift vises + Skjul kommentarsektion + Kommentarer sektion er skjult + Kommentarer sektion er vist + Skjul fællesskabsretningslinjer + Fællesskabsretningslinjer er skjult + Fællesskabsretningslinjer er vist + Skjul knappen \"Opret en Short\" + Opret en Short knap er skjult + Opret en Short knap vises + Skjul Emoji- og Tidsstempelknapper + Emoji- og Tidsstempelknapper er skjult + Emoji- og Tidsstempelknapper vises + Skjul forhåndsvisning kommentar + Forhåndsvisning kommentar er skjult + Forhåndsvis kommentar er vist + Skjul \"Tak\"-knap + Tak knappen er skjult + Tak knappen er vist + Skjul antal visninger + Antal visninger er skjult i feed og søgeresultater + Antal visninger vises i feed og søgeresultater + + "Begrænsninger: • Shorts-hylder, kanalsider og søgeresultater kan stadig vise antal visninger • Denne funktion virker ikke med bilformat" - Skjul uploadtid - Uploadtid er skjult i feed og søgeresultater - Uploadtid vises i feed og søgeresultater - - "Begrænsninger: + Skjul uploadtid + Uploadtid er skjult i feed og søgeresultater + Uploadtid vises i feed og søgeresultater + + "Begrænsninger: • Shorts hylder, kanalsider og søgeresultater kan stadig vise uploadtider • Denne funktion virker ikke med bilformat" - Skjul nøgleordsindhold - Skjul søge- og feed videoer ved hjælp af søgeordsfiltre - Skjul hjemmevideoer med søgeord - Videoer i fanen hjemme filtreres af søgeord - Videoer i fanen Hjem er ikke filtreret af søgeord - Skjul søgeresultater efter søgeord - Søgeresultater filtreres af søgeord - Søgeresultater filtreres ikke af søgeord - Skjul abonnementsvideoer med søgeord - Videoer i fanen Abonnementer filtreres af søgeord - Videoer i fanen Abonnementer filtreres ikke af søgeord - Nøgleord at skjule - - "Søgeord og sætninger, der skal skjules, adskilt af nye linjer + "Søgeord og sætninger, der skal skjules, adskilt af nye linjer Søgeord kan være kanalnavne eller tekst, der vises i videotitler Ord med store bogstaver i midten skal indtastes med store og små bogstaver (f.eks.: iPhone, TikTok, LeBlanc)" - Om søgeord filtrering - "Hjem-/abonnement-/søgeresultater filtreres for at skjule indhold, der svarer til søgeordssætninger + Om søgeord filtrering + "Hjem-/abonnement-/søgeresultater filtreres for at skjule indhold, der svarer til søgeordssætninger Begrænsninger ● Shorts kan ikke skjules efter kanalnavn ● Nogle UI-komponenter skjules muligvis ikke ● Søgning efter et søgeord viser muligvis ingen resultater" - Match hele ord - - Omkring et nøgleord/sætning med dobbelt-citater vil forhindre partielle kampe af videotitler og kanalnavne<br><br>For eksempel<br><b>\"ai\"</b> vil skjule videoen: <b>How does AI work?</b><br>, men skjuler ikke: <b>What does fair use mean?</b> - - Kan ikke bruge søgeord: %s - Tilføj tilbud for at bruge søgeord: %s - Nøgleord har modstridende erklæringer: %s - Søgeordet er for kort og kræver anførselstegn: %s - Nøgleord vil skjule alle videoer: %s - - - Skjul butikshylde for skabere - Opretterbutikshylde under videoafspiller er skjult - Butikshylde for skaber under videoafspiller vises - Skjul banner fra butikken på slutskærmen - Slutskærmsbutiksbanner er skjult - Slutskærmsbutiksbanner vises - Skjul fuldskærmsannoncer - "Fuldsskærmsannoncer er skjult + Match hele ord + + Omkring et nøgleord/sætning med dobbelt-citater vil forhindre partielle kampe af videotitler og kanalnavne<br><br>For eksempel<br><b>\"ai\"</b> vil skjule videoen: <b>How does AI work?</b><br>, men skjuler ikke: <b>What does fair use mean?</b> + + Kan ikke bruge søgeord: %s + Tilføj tilbud for at bruge søgeord: %s + Nøgleord har modstridende erklæringer: %s + Søgeordet er for kort og kræver anførselstegn: %s + Nøgleord vil skjule alle videoer: %s + + + Skjul butikshylde for skabere + Opretterbutikshylde under videoafspiller er skjult + Butikshylde for skaber under videoafspiller vises + Skjul banner fra butikken på slutskærmen + Slutskærmsbutiksbanner er skjult + Slutskærmsbutiksbanner vises + Skjul fuldskærmsannoncer + "Fuldsskærmsannoncer er skjult Denne funktion er kun tilgængelig for ældre enheder" - Fuldskærms annoncer vises - - Skjul reklamer på fuld skærm virker kun med ældre enheder - Skjul generelle annoncer - Generelle annoncer er skjult - Generelle annoncer vises - Skjul merchandise bannere - Varer bannere er skjult - Varer bannere er vist - Skjul betalt kampagneetiket - Betalt reklamemærke er skjult - Betalt salgsfremmende mærke er vist - Skjul selvsponsorerede kort - Selvsponsorerede kort er skjult - Selvsponsorerede kort vises - Skjul shopping-links - Shoppinglinks i videobeskrivelse er skjult - Shoppinglinks i videobeskrivelsen vises - Skjul banneret \"Se produkter\" - Se produkter-banner i videooverlay er skjult - Se produkter-banner i videooverlay vises - Skjul søgeresultater - Websøgeresultater er skjult - Websøgeresultater vises - - - Skjul YouTube Premium kampagner - YouTube Premium kampagner under videoafspiller er skjult - YouTube Premium kampagner under videoafspiller vises - - - Skjul videoannoncer - Videoannoncer er skjult - Videoannoncer vises - - - URL kopieret til udklipsholder - URL med tidsstempel kopieret - Vis kopiér video URL knap - Kopier video-URL-knap vises. Tryk for at kopiere video-URL. Tryk og hold nede for at kopiere med tidsstempel - Kopier video-URL-knap vises ikke - Vis kopi tidsstempel URL knap - Kopier tidsstempel-URL-knap vises. Tryk for at kopiere video-URL med tidsstempel. Tryk og hold nede for at kopiere uden tidsstempel - Kopier tidsstempel-URL-knap vises ikke - - - Fjern visningsdialog - Dialog vil blive fjernet - Dialog vil blive vist - Dette går ikke uden om aldersbegrænsningen. Det accepterer bare det automatisk. - - - Deaktiver \'Log ind på TV\'-popup - Log ind på TV-pop op er deaktiveret - Log ind på TV-pop op er aktiveret - - - Deaktiver dobbeltklik kapitelspring - Dobbeltklik kan aldrig udløse et spring til næste/forrige kapitel - Dobbeltklik kan lejlighedsvis udløse et spring til næste/forrige kapitel - - - Eksterne downloads - Indstillinger for brug af en ekstern downloader - Vis ekstern download-knap - Download-knappen i afspilleren vises - Download-knappen i afspilleren vises ikke - - Overskriv knappen Download-handling - Download-knappen åbner din eksterne downloader - Download-knappen åbner den indfødte in-app downloader - Downloader pakkenavn - Pakkenavn på din installerede eksterne download-app - Indtast pakkenavnet - Andet - Appen er ikke installeret - %s er ikke installeret. Installér den. - "Kunne ikke finde installeret app med pakkenavn: %s + Fuldskærms annoncer vises + + Skjul reklamer på fuld skærm virker kun med ældre enheder + Skjul generelle annoncer + Generelle annoncer er skjult + Generelle annoncer vises + Skjul merchandise bannere + Varer bannere er skjult + Varer bannere er vist + Skjul betalt kampagneetiket + Betalt reklamemærke er skjult + Betalt salgsfremmende mærke er vist + Skjul selvsponsorerede kort + Selvsponsorerede kort er skjult + Selvsponsorerede kort vises + Skjul shopping-links + Shoppinglinks i videobeskrivelse er skjult + Shoppinglinks i videobeskrivelsen vises + Skjul banneret \"Se produkter\" + Se produkter-banner i videooverlay er skjult + Se produkter-banner i videooverlay vises + Skjul søgeresultater + Websøgeresultater er skjult + Websøgeresultater vises + + + Skjul YouTube Premium kampagner + YouTube Premium kampagner under videoafspiller er skjult + YouTube Premium kampagner under videoafspiller vises + + + Skjul videoannoncer + Videoannoncer er skjult + Videoannoncer vises + + + URL kopieret til udklipsholder + URL med tidsstempel kopieret + Vis kopiér video URL knap + Kopier video-URL-knap vises. Tryk for at kopiere video-URL. Tryk og hold nede for at kopiere med tidsstempel + Kopier video-URL-knap vises ikke + Vis kopi tidsstempel URL knap + Kopier tidsstempel-URL-knap vises. Tryk for at kopiere video-URL med tidsstempel. Tryk og hold nede for at kopiere uden tidsstempel + Kopier tidsstempel-URL-knap vises ikke + + + Fjern visningsdialog + Dialog vil blive fjernet + Dialog vil blive vist + Dette går ikke uden om aldersbegrænsningen. Det accepterer bare det automatisk. + + + Deaktiver \'Log ind på TV\'-popup + Log ind på TV-pop op er deaktiveret + Log ind på TV-pop op er aktiveret + + + Deaktiver dobbeltklik kapitelspring + Dobbeltklik kan aldrig udløse et spring til næste/forrige kapitel + Dobbeltklik kan lejlighedsvis udløse et spring til næste/forrige kapitel + + + Eksterne downloads + Indstillinger for brug af en ekstern downloader + Vis ekstern download-knap + Download-knappen i afspilleren vises + Download-knappen i afspilleren vises ikke + + Overskriv knappen Download-handling + Download-knappen åbner din eksterne downloader + Download-knappen åbner den indfødte in-app downloader + Downloader pakkenavn + Pakkenavn på din installerede eksterne download-app + Indtast pakkenavnet + Andet + Appen er ikke installeret + %s er ikke installeret. Installér den. + "Kunne ikke finde installeret app med pakkenavn: %s Kontrollér, at pakkenavnet er korrekt, og at appen er installeret" - Pakkenavnet må ikke være tomt - - - Deaktivér præcis søgemåde - Bevægelse er deaktiveret - Bevægelse er aktiveret - - - Aktivér tryk for at søge - Tryk for at søge er aktiveret - Tryk for at søge er deaktiveret - - - Aktivér lysstyrke-bevægelse - "Fuldskaermens lysstyrke-swipe er aktiveret + Pakkenavnet må ikke være tomt + + + Deaktivér præcis søgemåde + Bevægelse er deaktiveret + Bevægelse er aktiveret + + + Aktivér tryk for at søge + Tryk for at søge er aktiveret + Tryk for at søge er deaktiveret + + + Aktivér lysstyrke-bevægelse + "Fuldskaermens lysstyrke-swipe er aktiveret Juster lysstyrken ved at swipe lodret i venstre side af skærmen" - Fuldskaermens lysstyrke-swipe er deaktiveret - Aktiver lydstyrke-bevægelse - "Fuldskærmslydstyrkesvip er aktiveret + Fuldskaermens lysstyrke-swipe er deaktiveret + Aktiver lydstyrke-bevægelse + "Fuldskærmslydstyrkesvip er aktiveret Juster lydstyrken ved at swipe lodret i højre side af skærmen" - Fuldskærmslydstyrkesvip er deaktiveret - Aktivér tryk for at swipe-bevægelse - Tryk for at swipe er aktiveret - Tryk for at swipe er deaktiveret - Aktiver haptisk feedback - Haptisk feedback er aktiveret - Haptisk feedback er deaktiveret - Gem og gendan lysstyrke - Gem og gendan lysstyrke, når du afslutter eller indtaster fuld skærm - Gem og gendan ikke lysstyrke, når du afslutter eller indtaster fuld skærm - Aktivér auto-lysstyrke-bevægelse - Stryg ned til den laveste værdi af lysstyrke-bevægelsen aktiverer auto-lysstyrke - Stryg ned til den laveste værdi aktiverer ikke auto-lysstyrke - Automatisk - Stryg overlay timeout - Mængden af millisekunder, overlayet er synlig - Baggrundsgennemsigtighed for swipe-overlay - Gennemsigtighedsværdi mellem 0-100 - Gennemsigtighed for swipe skal være mellem 0-100 - Farve på lysstyrke for strygeoverlejring - Farven på statuslinjen for lysstyrkekontroller - Farve på lydstyrke for strygeoverlejring - Farven på statuslinjen for lydstyrkekontroller - Tekststørrelse for strygeoverlejring - Tekststørrelsen for strygeoverlejring mellem 1-30 - Tekststørrelsen skal være mellem 1-30 - Stryg størrelse tærskel - Beløbet for tærskelværdi for stryg der skal ske - Volumen strygefølsomhed - Hvor meget lydstyrken ændres pr. strygning - Stil for stryge-overlay - Horisontalt overlay - Horisontalt overlay (minimal - top) - Horisontalt overlay (minimal - center) - Cirkulært overlay - Cirkulært overlay (minimal) - Vertikalt overlay - Vertikalt overlay (minimal) - Aktivér swipe for at skifte videoer - Strygning i fuldskærmstilstand vil ændre til den næste/forrige video - Strygning i fuldskærmstilstand vil ikke ændre til den næste/forrige video - - - Deaktivér auto-billedtekster - Automatiske billedtekster er deaktiveret - Automatiske billedtekster er aktiveret - - - Handlingsknapper - Skjul eller vis knapper under videoer - Deaktiver Like og Abonner-knappen glød - Lykke- og abonnér-knappen gløder ikke, når den nævnes - Lykke- og abonnér-knappen gløder, når den nævnes - Skjul Like og Dislike - Lige- og Dislike knapper er skjult - Lige- og Dislike knapper vises - - Skjul Del - Deleknappen er skjult - Deleknappen vises - - Skjul Stop reklamer - Knappen \"Stop annoncer\" er skjult - Knappen \"Stop annoncer\" vises - - Skjul kommentarer - Kommentarknappen er skjult - Kommentarknappen vises - + Skjul Del + Deleknappen er skjult + Deleknappen vises + + Skjul Stop reklamer + Knappen \"Stop annoncer\" er skjult + Knappen \"Stop annoncer\" vises + + Skjul kommentarer + Kommentarknappen er skjult + Kommentarknappen vises + - Skjul Rapport - Rapport-knappen er skjult - Rapport-knappen er vist - - Skjul Remix - Remix knap er skjult - Remix knap vises - - Skjul Download - Download-knappen er skjult - Download-knappen vises - + Skjul Remix + Remix knap er skjult + Remix knap vises + + Skjul Download + Download-knappen er skjult + Download-knappen vises + - Skjul Hype - Hype-knappen er skjult - Hype-knappen vises - - Skjul fremhævelse - Promoveringsknappen er skjult - Promoveringsknappen vises - - Skjul Tak - Tak knappen er skjult - Tak knappen er vist - + Skjul fremhævelse + Promoveringsknappen er skjult + Promoveringsknappen vises + + Skjul Tak + Tak knappen er skjult + Tak knappen er vist + - Skjul Spørg - Spørg-knappen er skjult - Spørg-knappen vises - - Skjul klip - Klip knappen er skjult - Klip knappen er vist - - Skjul butik - Butiksknappen er skjult - Butiksknappen vises - - Skjul Gem - Knappen \"Gem\" er skjult - Knappen \"Gem\" vises - - - Navigationsknapper - Skjul eller skift knapper i navigationsbjælken - - Skjul Hjem - Hjem-knap er skjult - Hjem-knap vises - - Skjul Shorts - Shorts knap er skjult - Shorts knap vises - - Skjul Opret - Opret knap er skjult - Opret knap vises - - Skjul Abonnementer - Abonnementer knappen er skjult - Abonnementer knappen vises - Skjul notifikationer - Notifikationsknappen er skjult - Notifikationsknappen vises - - Skift Opret med notifikationer - "Opret-knappen er skiftet med knappen Meddelelser + Skjul Spørg + Spørg-knappen er skjult + Spørg-knappen vises + + Skjul klip + Klip knappen er skjult + Klip knappen er vist + + Skjul butik + Butiksknappen er skjult + Butiksknappen vises + + Skjul Gem + Knappen \"Gem\" er skjult + Knappen \"Gem\" vises + + + Navigationsknapper + Skjul eller skift knapper i navigationsbjælken + + Skjul Hjem + Hjem-knap er skjult + Hjem-knap vises + + Skjul Shorts + Shorts knap er skjult + Shorts knap vises + + Skjul Opret + Opret knap er skjult + Opret knap vises + + Skjul Abonnementer + Abonnementer knappen er skjult + Abonnementer knappen vises + Skjul notifikationer + Notifikationsknappen er skjult + Notifikationsknappen vises + + Skift Opret med notifikationer + "Opret-knappen er skiftet med knappen Meddelelser Bemærk: Aktivering af dette skjuler også videoannoncer" - Opret knappen er ikke skiftet med Notifikationer knappen - "Deaktivering af denne indstilling vil også deaktivere Shorts-annonceblokering. + Opret knappen er ikke skiftet med Notifikationer knappen + "Deaktivering af denne indstilling vil også deaktivere Shorts-annonceblokering. Hvis ændring af denne indstilling ikke træder i kraft, kan du prøve at skifte til inkognitotilstand." - Skjul navigationsknappens etiketter - Etiketter er skjult - Etiketter er vist - Deaktiver gennemsigtig statuslinje - Statuslinjen er opak - Statuslinjen er opak eller gennemsigtig - På nogle enheder kan aktivering af denne funktion ændre systemets navigationslinje til gennemsigtig. - Deaktiver lys gennemsigtig linje - Navigationslinjen i lys tilstand er ikke gennemsigtig - Lys tilstand navigationslinjen er opak eller gennemsigtig - Deaktiver mørk gennemsigtig linje - Navigationslinjen i mørk tilstand er ikke gennemsigtig - Mørk tilstand navigationslinjen er opak eller gennemsigtig - - - Udfyldningsmenu - Skjul eller vis spiller flyout menupunkter - - Skjul Billedtekster - Undertekster menu er skjult - Undertekster menu er vist - - Skjul yderligere indstillinger - Yderligere indstillingsmenu er skjult - Yderligere indstillingsmenu er vist - - Skjul dvaletimer - Menuen Søvntimer er skjult - Menuen Søvntimer vises - - Skjul Loop video - Loop video menu er skjult - Loop video menu er vist - - Skjul omgivende tilstand - Menuen Omgivende tilstand er skjult - Menuen Omgivende tilstand vises - Skjul stabil lydstyrke - Stabil lydstyrke-menu vises - Stabil lydstyrke-menu er skjult - - Skjul Hjælp & feedback - Hjælp & feedback-menuen er skjult - Hjælp & feedback-menuen vises - - Skjul afspilningshastighed - Afspilningshastighedsmenu er skjult - Afspilningshastighed menuen vises - - Skjul låseskærm - Menuen Låseskærm er skjult - Låseskærmsmenuen vises - - Skjul Lyt med YouTube Music - Lyt med YouTube Music-menuen er skjult - Lyt med YouTube Music-menuen vises - - Skjul lydspor - Menuen for lydspor er skjult - Menuen Lydspor vises - + Skjul Billedtekster + Undertekster menu er skjult + Undertekster menu er vist + + Skjul yderligere indstillinger + Yderligere indstillingsmenu er skjult + Yderligere indstillingsmenu er vist + + Skjul dvaletimer + Menuen Søvntimer er skjult + Menuen Søvntimer vises + + Skjul Loop video + Loop video menu er skjult + Loop video menu er vist + + Skjul omgivende tilstand + Menuen Omgivende tilstand er skjult + Menuen Omgivende tilstand vises + Skjul stabil lydstyrke + Stabil lydstyrke-menu vises + Stabil lydstyrke-menu er skjult + + Skjul Hjælp & feedback + Hjælp & feedback-menuen er skjult + Hjælp & feedback-menuen vises + + Skjul afspilningshastighed + Afspilningshastighedsmenu er skjult + Afspilningshastighed menuen vises + + Skjul låseskærm + Menuen Låseskærm er skjult + Låseskærmsmenuen vises + + Skjul Lyt med YouTube Music + Lyt med YouTube Music-menuen er skjult + Lyt med YouTube Music-menuen vises + + Skjul lydspor + Menuen for lydspor er skjult + Menuen Lydspor vises + - "Audiorspormenuen er skjult + "Audiorspormenuen er skjult For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'" - - Skjul vagt i VR - Se i VR-menuen er skjult - Se i VR-menuen vises - Skjul menu for videokvalitet - Videokvalitetsmenuen er skjult - Videokvalitetsmenuen vises - Skjul sidefod til videokvalitet - Videokvalitetsmenuens sidefod er skjult - Videokvalitet menu footer er vist - - - Skjul knappen Automatisk afspilning - Automatisk spil-knap er skjult - Automatisk afspilningsknap vises - - Skjul undertekstknappen - Undertekster knappen er skjult - Underskriftsknappen vises - Skjul Cast-knappen - Cast-knappen er skjult - Cast knap er vist - Skjul baggrund for afspillerkontroller - Baggrund for afspilningskontroller er skjult - Baggrund for afspillerkontroller vises - Skjul Forrige & Næste knapper - Knapper er skjult - Knapper vises - - - Skjul slutskærmkort - Slutskærmskortene er skjult - Kort til slutskærm vises - - - Deaktiver Ambient-tilstand i fuldskærm - Omgivelsestilstand deaktiveret - Omgivelsestilstand aktiveret - - - Skjul informationskort - Info kort er skjult - Info kort er vist - - - Deaktivér animationer med rullenummer - Rullende numre er ikke animeret - Rullende numre er animeret - - - Skjul videoafspillerens søgelinje - Videoafspillerens søgelinje er skjult - Videoafspillerens søgelinje vises - - Skjul video-miniaturebilledernes søgelinje - Video-miniaturebilledernes søgelinje er skjult - Video-miniaturebilledernes søgelinje vises - - - Shorts-afspiller - Skjul eller vis Shorts-afspillerkomponenter - - Skjul Shorts i \'Hjem\'-feed - Skjult i \'Hjem\'-feed og relaterede videoer - Vises i \'Hjem\'-feed og relaterede videoer - Skjul Shorts i søgeresultater - Skjult i søgeresultater - Vises i søgeresultater - - Skjul Shorts i \'Abonnementer\'-feed - Skjult i \'Abonnementer\'-feed - Vises i \'Abonnementer\'-feed - Skjul shorts i historik - Skjult i historikken - Vises i historik - Skjul \'Auto-dubbet\'-etiket - Automatisk dubbet etiket er skjult - Automatisk dubbet etiket vises - Skjul \'Køb Super Thanks\'-knap - Køb Super Thanks-knap er skjult - Køb Super Thanks-knap vises - Skjul effektknap - Effektknap er skjult - Effektknap er vist - Skjul \'Green screen\'-knap - Grøn skærmknap er skjult - Grøn skærmknap vises - Skjul hashtag knap - Hashtag knap er skjult - Hashtag knappen er vist - - Skjul knappen Deltag - Deltag-knappen er skjult - Tilmeldingsknappen vises - Skjul live forhåndsvisning - Live-forhåndsvisning er skjult - Live-forhåndsvisning vises - Skjul placeringsetiket - Placeringsetiket er skjult - Placeringsetiket er vist - Skjul \'Nye indlæg\'-knap - Knappen Nye indlæg er skjult - Knappen Nye indlæg vises - Skjul overlay knapper på pause - Overlay-knapper på pause er skjult - Overlay-knapper på pause vises - Skjul forhåndsvisning af kommentar - Forhåndsvisning af kommentar er skjult - Forhåndsvisningskommentar vises - Skjul \'Gem musik\'-knap - Gem musik knap er skjult - Gem musik knap er vist - Skjul søgeforslag - Søgeforslag er skjult - Søgeforslag er vist - Skjul knappen Shop - Butiksknap er skjult - Butiksknappen er vist - Skjul klistermærker - Klistermærker er skjult - Klistermærker vises - Skjul knappen Abonner - Abonnement knappen er skjult - Knappen Abonnér vises - Skjul taggede varer - Tagged produkter er skjult - Tagged produkter er vist - Skjul knappen Kommende - Kommende knap er skjult - Kommende knap vises - Skjul \'Brug denne lyd\'-knap - Knappen \"Brug denne lyd\" er skjult - Knappen \"Brug denne lyd\" vises - Skjul \'Brug denne skabelon\'-knap - Knappen \"Brug denne skabelon\" er skjult - Knappen Brug denne skabelon vises - Skjul knap for springvand-animation af like-knap - Ligesom knap springvand animation er skjult - Animation af springvand vises som knap - Skjul knappen Like - Ligesom knappen er skjult - Lideknap vises - Skjul knappen Dislike - Dislike knap er skjult - Dislike knappen er vist - Skjul knappen Kommentarer - Knappen Kommentarer er skjult - Knappen Kommentarer vises - - Skjul knappen Del - Deleknappen er skjult - Deleknappen vises - - Skjul knappen Remix - Remix knap er skjult - Remix knap vises - Skjul lydknap - Lydknappen er skjult - Lydknappen er vist - Skjul infopanel - Infopanelet er skjult - Info panel er vist - Skjul kanallinje - Kanalbjælken er skjult - Kanalbjælken vises - Skjul videotitel - Videotitel er skjult - Videotitel vises - Skjul lyd metadata etiket - Lydmetadataetiket er skjult - Lydmetadataetiket vises - Skjul videolinketiket - Videolink etiket er skjult - Videolink etiket er vist - Skjul navigationslinje - Navigationsbjælken er skjult - Navigationsbjælken vises - - - Skjul foreslået video på slutskærmen - "Foreslået video på slutskærmen er skjult, når automatisk afspilning er slået fra + + Skjul vagt i VR + Se i VR-menuen er skjult + Se i VR-menuen vises + Skjul menu for videokvalitet + Videokvalitetsmenuen er skjult + Videokvalitetsmenuen vises + Skjul sidefod til videokvalitet + Videokvalitetsmenuens sidefod er skjult + Videokvalitet menu footer er vist + + + Skjul knappen Automatisk afspilning + Automatisk spil-knap er skjult + Automatisk afspilningsknap vises + + Skjul undertekstknappen + Undertekster knappen er skjult + Underskriftsknappen vises + Skjul Cast-knappen + Cast-knappen er skjult + Cast knap er vist + Skjul baggrund for afspillerkontroller + Baggrund for afspilningskontroller er skjult + Baggrund for afspillerkontroller vises + Skjul Forrige & Næste knapper + Knapper er skjult + Knapper vises + + + Skjul slutskærmkort + Slutskærmskortene er skjult + Kort til slutskærm vises + + + Deaktiver Ambient-tilstand i fuldskærm + Omgivelsestilstand deaktiveret + Omgivelsestilstand aktiveret + + + Skjul informationskort + Info kort er skjult + Info kort er vist + + + Deaktivér animationer med rullenummer + Rullende numre er ikke animeret + Rullende numre er animeret + + + Skjul videoafspillerens søgelinje + Videoafspillerens søgelinje er skjult + Videoafspillerens søgelinje vises + + Skjul video-miniaturebilledernes søgelinje + Video-miniaturebilledernes søgelinje er skjult + Video-miniaturebilledernes søgelinje vises + + + Shorts-afspiller + Skjul eller vis Shorts-afspillerkomponenter + + Skjul Shorts i \'Hjem\'-feed + Skjult i \'Hjem\'-feed og relaterede videoer + Vises i \'Hjem\'-feed og relaterede videoer + Skjul Shorts i søgeresultater + Skjult i søgeresultater + Vises i søgeresultater + + Skjul Shorts i \'Abonnementer\'-feed + Skjult i \'Abonnementer\'-feed + Vises i \'Abonnementer\'-feed + Skjul shorts i historik + Skjult i historikken + Vises i historik + Skjul \'Auto-dubbet\'-etiket + Automatisk dubbet etiket er skjult + Automatisk dubbet etiket vises + Skjul \'Køb Super Thanks\'-knap + Køb Super Thanks-knap er skjult + Køb Super Thanks-knap vises + Skjul effektknap + Effektknap er skjult + Effektknap er vist + Skjul \'Green screen\'-knap + Grøn skærmknap er skjult + Grøn skærmknap vises + Skjul hashtag knap + Hashtag knap er skjult + Hashtag knappen er vist + + Skjul knappen Deltag + Deltag-knappen er skjult + Tilmeldingsknappen vises + Skjul live forhåndsvisning + Live-forhåndsvisning er skjult + Live-forhåndsvisning vises + Skjul placeringsetiket + Placeringsetiket er skjult + Placeringsetiket er vist + Skjul \'Nye indlæg\'-knap + Knappen Nye indlæg er skjult + Knappen Nye indlæg vises + Skjul overlay knapper på pause + Overlay-knapper på pause er skjult + Overlay-knapper på pause vises + Skjul forhåndsvisning af kommentar + Forhåndsvisning af kommentar er skjult + Forhåndsvisningskommentar vises + Skjul \'Gem musik\'-knap + Gem musik knap er skjult + Gem musik knap er vist + Skjul søgeforslag + Søgeforslag er skjult + Søgeforslag er vist + Skjul knappen Shop + Butiksknap er skjult + Butiksknappen er vist + Skjul klistermærker + Klistermærker er skjult + Klistermærker vises + Skjul knappen Abonner + Abonnement knappen er skjult + Knappen Abonnér vises + Skjul taggede varer + Tagged produkter er skjult + Tagged produkter er vist + Skjul knappen Kommende + Kommende knap er skjult + Kommende knap vises + Skjul \'Brug denne lyd\'-knap + Knappen \"Brug denne lyd\" er skjult + Knappen \"Brug denne lyd\" vises + Skjul \'Brug denne skabelon\'-knap + Knappen \"Brug denne skabelon\" er skjult + Knappen Brug denne skabelon vises + Skjul knap for springvand-animation af like-knap + Ligesom knap springvand animation er skjult + Animation af springvand vises som knap + Skjul knappen Like + Ligesom knappen er skjult + Lideknap vises + Skjul knappen Dislike + Dislike knap er skjult + Dislike knappen er vist + Skjul knappen Kommentarer + Knappen Kommentarer er skjult + Knappen Kommentarer vises + + Skjul knappen Del + Deleknappen er skjult + Deleknappen vises + + Skjul knappen Remix + Remix knap er skjult + Remix knap vises + Skjul lydknap + Lydknappen er skjult + Lydknappen er vist + Skjul infopanel + Infopanelet er skjult + Info panel er vist + Skjul kanallinje + Kanalbjælken er skjult + Kanalbjælken vises + Skjul videotitel + Videotitel er skjult + Videotitel vises + Skjul lyd metadata etiket + Lydmetadataetiket er skjult + Lydmetadataetiket vises + Skjul videolinketiket + Videolink etiket er skjult + Videolink etiket er vist + Skjul navigationslinje + Navigationsbjælken er skjult + Navigationsbjælken vises + + + Skjul foreslået video på slutskærmen + "Foreslået video på slutskærmen er skjult, når automatisk afspilning er slået fra Automatisk afspilning kan ændres i YouTube-indstillinger: Indstillinger → Afspilning → Afspil næste video automatisk" - Foreslået video på slutskærmen vises - - - Skjul overlay for relaterede videoer - Overlay for relaterede videoer i fuldskærm er skjult - Overlay for relaterede videoer i fuldskærm vises - - - Skjul tidsstempel på video - Tidsstempel er skjult - Tidsstempel er vist - - - Skjul pop op- paneler - Spiller popup paneler er skjult - Spiller popup paneler vises - - - Afslut fuldskærmstilstand ved videoens afslutning - Deaktiveret - Portræt - Landskab - Portræt og landskab - - - Åbn videoer i fuldskærm portræt - Videoer åbne fuld skærm - Videoer åbner ikke fuld skærm - - - Spiller overlay gennemsigtighed - Gennemsigtighedsværdi mellem 0-100, hvor 0 er gennemsigtig - Spiller overlay gennemsigtighed skal være mellem 0-100 - - - - Dislikerer midlertidigt ikke tilgængelig (API-timeout ud) - Dislikationer er ikke tilgængelige (status %d) - Synes ikke godt om er ikke tilgængelige (klient API-grænse) - Dislikationer ikke tilgængelige (%s) - - Genindlæs video for at stemme ved hjælp af Return YouTube Dislike - - Skjult af ejer - Dislikationer vises - Dislikationer vises ikke - Vis ikke på Shorts - "Synes ikke godt om på Shorts vises + Foreslået video på slutskærmen vises + + + Skjul overlay for relaterede videoer + Overlay for relaterede videoer i fuldskærm er skjult + Overlay for relaterede videoer i fuldskærm vises + + + Skjul tidsstempel på video + Tidsstempel er skjult + Tidsstempel er vist + + + Skjul pop op- paneler + Spiller popup paneler er skjult + Spiller popup paneler vises + + + Afslut fuldskærmstilstand ved videoens afslutning + Deaktiveret + Portræt + Landskab + Portræt og landskab + + + Åbn videoer i fuldskærm portræt + Videoer åbne fuld skærm + Videoer åbner ikke fuld skærm + + + Spiller overlay gennemsigtighed + Gennemsigtighedsværdi mellem 0-100, hvor 0 er gennemsigtig + Spiller overlay gennemsigtighed skal være mellem 0-100 + + + + Dislikerer midlertidigt ikke tilgængelig (API-timeout ud) + Dislikationer er ikke tilgængelige (status %d) + Synes ikke godt om er ikke tilgængelige (klient API-grænse) + Dislikationer ikke tilgængelige (%s) + + Genindlæs video for at stemme ved hjælp af Return YouTube Dislike + + Skjult af ejer + Dislikationer vises + Dislikationer vises ikke + Vis ikke på Shorts + "Synes ikke godt om på Shorts vises Begrænsning: Synes ikke godt om vises muligvis ikke i inkognitotilstand" - Synes ikke godt om på Shorts vises ikke - Synes ikke som procent - Synes ikke godt om vises som en procentdel - Synes ikke godt om vises som et tal - - Kompakt like-knap - Lideknap stylet for mindste bredde - Ligesom knap stylet for bedste udseende - Vis anslåede Synes godt om - Videoer med deaktiverede Synes godt om viser et anslået antal Synes godt om - Anslåede Synes godt om vises ikke - Vis en toast hvis API ikke er tilgængelig - Toast vises, hvis Return YouTube Dislike ikke er tilgængelig - Toast vises ikke, hvis Return YouTube Dislike ikke er tilgængelig - Data leveres af Return YouTube Dislike API. Tryk her for at få mere at vide - - ReturnYouTubeDislike API statistikker for denne enhed - API svartid, gennemsnit - API svartid, minimum - API responstid, maksimum - API svartid, sidste video - Dislikerer midlertidigt ikke tilgængelig - Client API sats grænse i kraft - API henter stemmer, antal opkald - Ingen netværksopkald foretaget - %d netværksopkald foretaget - API henter stemmer, antal timeouts - Ingen netværksopkald udløb - %d netværksopkald udløb - API klient sats grænser - Ingen klientrategrænser stødt på - Klient sats grænse stødt %d gange - %d millisekunder - - - Aktiver bred søgelinje - Bred søgelinje er aktiveret - Bred søgelinje er deaktiveret - - - Aktiver miniaturer af høj kvalitet - Seekbar miniaturer er af høj kvalitet - Seekbar miniaturer er af middel kvalitet - Fuldskærmssøgerbar miniaturer er af høj kvalitet - Fuldskærmssøgerbar miniaturer er af middel kvalitet - "Dette vil også gendanne miniaturebilleder på livestreams, der ikke har miniaturebilleder i søgefeltet. + Synes ikke godt om på Shorts vises ikke + Synes ikke som procent + Synes ikke godt om vises som en procentdel + Synes ikke godt om vises som et tal + + Kompakt like-knap + Lideknap stylet for mindste bredde + Ligesom knap stylet for bedste udseende + Vis anslåede Synes godt om + Videoer med deaktiverede Synes godt om viser et anslået antal Synes godt om + Anslåede Synes godt om vises ikke + Vis en toast hvis API ikke er tilgængelig + Toast vises, hvis Return YouTube Dislike ikke er tilgængelig + Toast vises ikke, hvis Return YouTube Dislike ikke er tilgængelig + Data leveres af Return YouTube Dislike API. Tryk her for at få mere at vide + + ReturnYouTubeDislike API statistikker for denne enhed + API svartid, gennemsnit + API svartid, minimum + API responstid, maksimum + API svartid, sidste video + Dislikerer midlertidigt ikke tilgængelig - Client API sats grænse i kraft + API henter stemmer, antal opkald + Ingen netværksopkald foretaget + %d netværksopkald foretaget + API henter stemmer, antal timeouts + Ingen netværksopkald udløb + %d netværksopkald udløb + API klient sats grænser + Ingen klientrategrænser stødt på + Klient sats grænse stødt %d gange + %d millisekunder + + + Aktiver bred søgelinje + Bred søgelinje er aktiveret + Bred søgelinje er deaktiveret + + + Aktiver miniaturer af høj kvalitet + Seekbar miniaturer er af høj kvalitet + Seekbar miniaturer er af middel kvalitet + Fuldskærmssøgerbar miniaturer er af høj kvalitet + Fuldskærmssøgerbar miniaturer er af middel kvalitet + "Dette vil også gendanne miniaturebilleder på livestreams, der ikke har miniaturebilleder i søgefeltet. Miniaturebilleder i søgefeltet bruger den samme kvalitet som den aktuelle video. Denne funktion fungerer bedst med en videokvalitet på 720p eller lavere og ved brug af en meget hurtig internetforbindelse." - Gendan gamle miniaturer på søgelinjen - Seekbar miniaturer vises over søgelinjen - Seekbar miniaturer vises i fuld skærm - - - Aktiver SponsorBloker - SponsorBlock er et crowdsourcet system, der springer irriterende dele af YouTube-videoer over - Udseende - Vis afstemningsknap - Segmentafstemningsknap vises - Segmentafstemningsknappen vises ikke - Brug firkantet layout - Knapper og kontrolelementer er firkantede - Knapper og kontrolelementer er afrundede - - Brug kompakt Spring over-knap - Skip knap stylet for mindste bredde - Skip knap stylet for bedste udseende - Skjul automatisk Spring over-knap - Skip knap skjuler efter et par sekunder - Spring over-knappen vises for hele segmentet - Spring over-knap varighed - Hvor længe skal knapperne til at springe over og springe til højdepunkt vises, før de automatisk skjules - Vis fortryd oversprings-toast - Toast vises, når et segment automatisk springes over. Tryk på toast-meddelelsen for at fortryde overspringelsen - Toast vises ikke - Spring over-toast varighed - Hvor længe skal fortryd spring over-meddelelsen vises - 1 sekund - 2 sekunder - 3 sekunder - 4 sekunder - 5 sekunder - 6 sekunder - 7 sekunder - 8 sekunder - 9 sekunder - 10 sekunder - Vis videolængde uden segmenter - Videolængde minus alle segmenter vises på tidslinjen - Fuld videolængde vist - Opretter nye segmenter - Vis Opret nyt segment-knap - Opret ny segmentknap vises - Opret ny segmentknap vises ikke - Juster nyt segment trin - Antal millisekunder knapperne til justering af tid flyttes når der oprettes nye segmenter - Værdien skal være et positivt tal - Se retningslinjer - Retningslinjer indeholder regler og tips til oprettelse af nye segmenter - Følg retningslinjerne - Læs SponsorBlock retningslinjer før du opretter nye segmenter - Allerede læst - Vis mig - Generelt - Vis en toast hvis API ikke er tilgængelig - Toast vises, hvis SponsorBlock ikke er tilgængelig - Toast vises ikke, hvis SponsorBlock ikke er tilgængelig - Aktiver overspring tæller sporing - Lader SponsorBlock pointtavlen vide, hvor meget tid der er gemt. En besked sendes til pointtavlen, hver gang et segment springes over - Overspring tælling er ikke aktiveret - Minimum linjestykketid - Segmenter kortere end denne værdi (i sekunder) vil ikke blive vist eller sprunget over - Ugyldig tidsvarighed - Dit private bruger-id - Dette bør holdes privat. Dette er ligesom en adgangskode og bør ikke deles med nogen. Hvis nogen har dette, kan de udgive dig - Privat bruger-id skal være mindst 30 tegn langt - Skift API-URL - Adressen SponsorBlock bruger til at foretage opkald til serveren - API-URL nulstillet - API URL er ugyldig - API URL ændret - Importér/eksport indstillinger - Kopiér - Din SponsorBlock JSON konfiguration, der kan importeres/eksporteres til ReVanced og andre SponsorBlock platforme - Din SponsorBlock JSON konfiguration, der kan importeres/eksporteres til ReVanced og andre SponsorBlock platforme. Dette omfatter din private bruger id. Sørg for at dele dette klogt - Indstillinger importeret med succes - Mislykkedes at importere: %s - Mislykkedes at eksportere: %s - "Dine indstillinger indeholder et privat SponsorBlock-bruger-id. + Gendan gamle miniaturer på søgelinjen + Seekbar miniaturer vises over søgelinjen + Seekbar miniaturer vises i fuld skærm + + + Aktiver SponsorBloker + SponsorBlock er et crowdsourcet system, der springer irriterende dele af YouTube-videoer over + Udseende + Vis afstemningsknap + Segmentafstemningsknap vises + Segmentafstemningsknappen vises ikke + Brug firkantet layout + Knapper og kontrolelementer er firkantede + Knapper og kontrolelementer er afrundede + + Brug kompakt Spring over-knap + Skip knap stylet for mindste bredde + Skip knap stylet for bedste udseende + Skjul automatisk Spring over-knap + Skip knap skjuler efter et par sekunder + Spring over-knappen vises for hele segmentet + Spring over-knap varighed + Hvor længe skal knapperne til at springe over og springe til højdepunkt vises, før de automatisk skjules + Vis fortryd oversprings-toast + Toast vises, når et segment automatisk springes over. Tryk på toast-meddelelsen for at fortryde overspringelsen + Toast vises ikke + Spring over-toast varighed + Hvor længe skal fortryd spring over-meddelelsen vises + 1 sekund + 2 sekunder + 3 sekunder + 4 sekunder + 5 sekunder + 6 sekunder + 7 sekunder + 8 sekunder + 9 sekunder + 10 sekunder + Vis videolængde uden segmenter + Videolængde minus alle segmenter vises på tidslinjen + Fuld videolængde vist + Opretter nye segmenter + Vis Opret nyt segment-knap + Opret ny segmentknap vises + Opret ny segmentknap vises ikke + Juster nyt segment trin + Antal millisekunder knapperne til justering af tid flyttes når der oprettes nye segmenter + Værdien skal være et positivt tal + Se retningslinjer + Retningslinjer indeholder regler og tips til oprettelse af nye segmenter + Følg retningslinjerne + Læs SponsorBlock retningslinjer før du opretter nye segmenter + Allerede læst + Vis mig + Generelt + Vis en toast hvis API ikke er tilgængelig + Toast vises, hvis SponsorBlock ikke er tilgængelig + Toast vises ikke, hvis SponsorBlock ikke er tilgængelig + Aktiver overspring tæller sporing + Lader SponsorBlock pointtavlen vide, hvor meget tid der er gemt. En besked sendes til pointtavlen, hver gang et segment springes over + Overspring tælling er ikke aktiveret + Minimum linjestykketid + Segmenter kortere end denne værdi (i sekunder) vil ikke blive vist eller sprunget over + Ugyldig tidsvarighed + Dit private bruger-id + Dette bør holdes privat. Dette er ligesom en adgangskode og bør ikke deles med nogen. Hvis nogen har dette, kan de udgive dig + Privat bruger-id skal være mindst 30 tegn langt + Skift API-URL + Adressen SponsorBlock bruger til at foretage opkald til serveren + API-URL nulstillet + API URL er ugyldig + API URL ændret + Importér/eksport indstillinger + Kopiér + Din SponsorBlock JSON konfiguration, der kan importeres/eksporteres til ReVanced og andre SponsorBlock platforme + Din SponsorBlock JSON konfiguration, der kan importeres/eksporteres til ReVanced og andre SponsorBlock platforme. Dette omfatter din private bruger id. Sørg for at dele dette klogt + Indstillinger importeret med succes + Mislykkedes at importere: %s + Mislykkedes at eksportere: %s + "Dine indstillinger indeholder et privat SponsorBlock-bruger-id. Dit bruger-id er som en adgangskode, og det må aldrig deles. " - Vis ikke igen - Ændr segmentadfærd - Betalt kampagne, betalte henvisninger og direkte reklamer. Ikke for selvpromoverende eller gratis råb til årsager/skabere/websteder/produkter, de kan lide - Ubetalt/Self Promotion - Ligner Sponsor, men omfatter ikke ubetalt eller selvreklame. Indeholder sektioner om merchandise, donationer eller oplysninger om, hvem de har samarbejdet med - Interaktion Påmindelse (Abonner) - En kort påmindelse om at lide, abonnere eller følge dem midt i indholdet. Hvis den er lang eller om noget specifik, bør den i stedet være under selvforfremmelse - Fremhæv - Den del af videoen, som de fleste mennesker er på udkig efter - Pause/Intro-animation - Et interval uden reelt indhold. Kunne være en pause, statisk ramme eller gentagelse af animation. Omfatter ikke overgange indeholdende information - Slutkort / Kredit - Medvirkende eller når YouTube-endcards vises. Ikke for konklusioner med information - Intro / Hilsener - Fortalte trailere for den kommende video, hilsener og farvel. Indeholder ikke afsnit, der tilføjer yderligere indhold - Forhåndsvisning / Resumé - Indsamling af klip, der viser, hvad der kommer op, eller hvad der skete i videoen eller i andre videoer af en serie, hvor alle oplysninger gentages andetsteds - Sidespor / Vittigheder - Tangentielle scener eller vittigheder, der ikke er nødvendige for at forstå videoens hovedindhold. Indeholder ikke afsnit, der giver kontekst eller baggrundsoplysninger - Musik: Ikke-Musik Sektion - Kun til brug i musikvideoer. Sektioner af musikvideoer uden musik, der ikke allerede er dækket af en anden kategori - Overspring - Fremhæv - Spring sponsor over - Spring over promo - Spring interact over - Spring over for fremhævning - Spring intro over - Spring intermission over - Spring intermission over - Spring outro over - Spring hook over - Spring forhåndsvisning over - Spring forhåndsvisning over - Spring resumé over - Spring tangent over - Spring over ikke-musik - Overspring segment - Sponsor sprunget over - Selv-forfremmelse sprunget over - Sprunget over irriterende påmindelse - Sprunget over for at fremhæve - Intro sprunget over - Intermission sprunget over - Intermission sprunget over - Sprunget over outro - Hook sprunget over - Forklaring sprunget over - Forklaring sprunget over - Oversprunget resumé - Tangent sprunget over - Oversprunget en ikke-musiksektion over - Uindsendt segment sprunget over - Oversprunget over flere segmenter - Spring automatisk over - Spring automatisk over én gang - Vis en Spring over-knap - Vis i søgelinjen - Deaktivér - Kan ikke indsende segment: %s - SponsorBlock er midlertidigt nede - Kan ikke indsende segment (status: %1$d %2$s) - Kan ikke indsende segment. Hastighedsbegrænset (for mange fra den samme bruger eller IP-adresse) - Kan ikke indsende segmentet: %s - "Kan ikke indsende segmentet. + Vis ikke igen + Ændr segmentadfærd + Betalt kampagne, betalte henvisninger og direkte reklamer. Ikke for selvpromoverende eller gratis råb til årsager/skabere/websteder/produkter, de kan lide + Ubetalt/Self Promotion + Ligner Sponsor, men omfatter ikke ubetalt eller selvreklame. Indeholder sektioner om merchandise, donationer eller oplysninger om, hvem de har samarbejdet med + Interaktion Påmindelse (Abonner) + En kort påmindelse om at lide, abonnere eller følge dem midt i indholdet. Hvis den er lang eller om noget specifik, bør den i stedet være under selvforfremmelse + Fremhæv + Den del af videoen, som de fleste mennesker er på udkig efter + Pause/Intro-animation + Et interval uden reelt indhold. Kunne være en pause, statisk ramme eller gentagelse af animation. Omfatter ikke overgange indeholdende information + Slutkort / Kredit + Medvirkende eller når YouTube-endcards vises. Ikke for konklusioner med information + Intro / Hilsener + Fortalte trailere for den kommende video, hilsener og farvel. Indeholder ikke afsnit, der tilføjer yderligere indhold + Forhåndsvisning / Resumé + Indsamling af klip, der viser, hvad der kommer op, eller hvad der skete i videoen eller i andre videoer af en serie, hvor alle oplysninger gentages andetsteds + Sidespor / Vittigheder + Tangentielle scener eller vittigheder, der ikke er nødvendige for at forstå videoens hovedindhold. Indeholder ikke afsnit, der giver kontekst eller baggrundsoplysninger + Musik: Ikke-Musik Sektion + Kun til brug i musikvideoer. Sektioner af musikvideoer uden musik, der ikke allerede er dækket af en anden kategori + Overspring + Fremhæv + Spring sponsor over + Spring over promo + Spring interact over + Spring over for fremhævning + Spring intro over + Spring intermission over + Spring intermission over + Spring outro over + Spring hook over + Spring forhåndsvisning over + Spring forhåndsvisning over + Spring resumé over + Spring tangent over + Spring over ikke-musik + Overspring segment + Sponsor sprunget over + Selv-forfremmelse sprunget over + Sprunget over irriterende påmindelse + Sprunget over for at fremhæve + Intro sprunget over + Intermission sprunget over + Intermission sprunget over + Sprunget over outro + Hook sprunget over + Forklaring sprunget over + Forklaring sprunget over + Oversprunget resumé + Tangent sprunget over + Oversprunget en ikke-musiksektion over + Uindsendt segment sprunget over + Oversprunget over flere segmenter + Spring automatisk over + Spring automatisk over én gang + Vis en Spring over-knap + Vis i søgelinjen + Deaktivér + Kan ikke indsende segment: %s + SponsorBlock er midlertidigt nede + Kan ikke indsende segment (status: %1$d %2$s) + Kan ikke indsende segment. Hastighedsbegrænset (for mange fra den samme bruger eller IP-adresse) + Kan ikke indsende segmentet: %s + "Kan ikke indsende segmentet. Eksisterer allerede" - Segment indsendt med succes - - SponsorBloker midlertidigt ikke tilgængelig (API-tid ud) - SponsorBloker midlertidigt ikke tilgængelig (status %d) - SponsorBloker midlertidigt ikke tilgængelig - Kan ikke stemme på segment (API-timede ud) - Kan ikke stemme på segment (status: %1$d %2$s) - Ikke i stand til at stemme på segmentet: %s - Op - Ned - Skift kategori - Der er ingen segmenter at stemme for - - %1$s til %2$s - Vælg segmentkategori - Kategori er deaktiveret i indstillinger. Aktivér kategori for at indsende. - Nyt SponsorBlock segment - Sæt %s som start eller afslutning af et nyt segment? - Slut - Nu - Tidspunkt for segmentet begynder på - Tidspunkt for segmentet slutter på - Er tiderne korrekte? - "Segmentet er fra + Segment indsendt med succes + + SponsorBloker midlertidigt ikke tilgængelig (API-tid ud) + SponsorBloker midlertidigt ikke tilgængelig (status %d) + SponsorBloker midlertidigt ikke tilgængelig + Kan ikke stemme på segment (API-timede ud) + Kan ikke stemme på segment (status: %1$d %2$s) + Ikke i stand til at stemme på segmentet: %s + Op + Ned + Skift kategori + Der er ingen segmenter at stemme for + + %1$s til %2$s + Vælg segmentkategori + Kategori er deaktiveret i indstillinger. Aktivér kategori for at indsende. + Nyt SponsorBlock segment + Sæt %s som start eller afslutning af et nyt segment? + Slut + Nu + Tidspunkt for segmentet begynder på + Tidspunkt for segmentet slutter på + Er tiderne korrekte? + "Segmentet er fra %1$s til @@ -1277,45 +1276,45 @@ til (%3$s) Er du klar til at indsende?" - Start skal være før slutningen - Markér to steder på tidsbjælken først - Forhåndsvisning af segmentet, og sikre, at det springer glat - Rediger timing af segment manuelt - Vil du redigere timingen for start eller afslutning af segmentet? - Ugyldig tid givet - Statistik - - Statistikker er midlertidigt ikke tilgængelige (API er nede) - Indlæser... - SponsorBloker er deaktiveret - Dit brugernavn: <b>%s</b> - Tryk her for at ændre dit brugernavn - Kan ikke ændre brugernavn: Status: %1$d %2$s - Brugernavn ændret - Dit omdømme er <b>%.2f</b> - Du har oprettet <b>%s</b> segmenter - Tryk her for at se dine segmenter - SponsorBlokér leaderboard - Du har gemt folk fra <b>%s</b> segmenter - Tryk her for at se de globale statistikker og topbidragsydere - Det er <b>%s</b> af deres liv.<br>Tryk her for at se leaderboardet - Du har spundet <b>%s</b> segmenter - Det Er <b>%s</b> - Nulstil oversprungne segmenter tæller? - %1$s timer %2$s minutter - %1$s minutter %2$s sekunder - %s sekunder - Opacitet: - Farve: - Om - Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme - - - Layout-formfaktor - Standard - Telefon - Bil - "Ændringer omfatter: + Start skal være før slutningen + Markér to steder på tidsbjælken først + Forhåndsvisning af segmentet, og sikre, at det springer glat + Rediger timing af segment manuelt + Vil du redigere timingen for start eller afslutning af segmentet? + Ugyldig tid givet + Statistik + + Statistikker er midlertidigt ikke tilgængelige (API er nede) + Indlæser... + SponsorBloker er deaktiveret + Dit brugernavn: <b>%s</b> + Tryk her for at ændre dit brugernavn + Kan ikke ændre brugernavn: Status: %1$d %2$s + Brugernavn ændret + Dit omdømme er <b>%.2f</b> + Du har oprettet <b>%s</b> segmenter + Tryk her for at se dine segmenter + SponsorBlokér leaderboard + Du har gemt folk fra <b>%s</b> segmenter + Tryk her for at se de globale statistikker og topbidragsydere + Det er <b>%s</b> af deres liv.<br>Tryk her for at se leaderboardet + Du har spundet <b>%s</b> segmenter + Det Er <b>%s</b> + Nulstil oversprungne segmenter tæller? + %1$s timer %2$s minutter + %1$s minutter %2$s sekunder + %s sekunder + Opacitet: + Farve: + Om + Data leveres af SponsorBlock API. Tryk her for at få flere oplysninger og se downloads til andre platforme + + + Layout-formfaktor + Standard + Telefon + Bil + "Ændringer omfatter: Tabletlayout • Fællesskabsopslag er skjulte @@ -1323,310 +1322,308 @@ Tabletlayout Automotive-layout • Shorts åbnes i den almindelige afspiller • Feed er organiseret efter emner og kanaler" - - - Spoof app-version - Version-manipulering - Version ikke spoofed - "App-versionen forfalskes til en ældre version af YouTube. + + + Spoof app-version + Version-manipulering + Version ikke spoofed + "App-versionen forfalskes til en ældre version af YouTube. Dette ændrer appens udseende og funktioner, men ukendte bivirkninger kan forekomme. Hvis det senere slås fra, anbefales det at rydde app-dataene for at forhindre UI-fejl." - Spoof app version mål - 20.13.41 - Gendan ikke-kollapset videohandlingslinje - 20.05.46 - Gendan transkriptionsfunktionalitet - 19.35.36 - Gendan gamle Shorts player ikoner - 19.01.34 - Gendan gamle navigationsikoner - - - Skift startside - Standard - Alle abonnementer - Gennemse kanaler - Kurser \/ Læring - Udforsk - Mode \& Skønhed - Spil - Historik - Bibliotek - Syntes om videoer - Levende - Film - Musik - Nyheder - Notifikationer - Playlister - Søg - Køb ind - Sport - Abonnementer - Populære - Se senere - Dine klip - Skift altid startside - "Startside ændres altid + Spoof app version mål + 20.13.41 - Gendan ikke-kollapset videohandlingslinje + 20.05.46 - Gendan transkriptionsfunktionalitet + 19.35.36 - Gendan gamle Shorts player ikoner + 19.01.34 - Gendan gamle navigationsikoner + + + Skift startside + Standard + Alle abonnementer + Gennemse kanaler + Kurser \/ Læring + Udforsk + Mode \& Skønhed + Spil + Historik + Bibliotek + Syntes om videoer + Levende + Film + Musik + Nyheder + Notifikationer + Playlister + Søg + Køb ind + Sport + Abonnementer + Populære + Se senere + Dine klip + Skift altid startside + "Startside ændres altid Begrænsning: Brug af tilbage-knappen på værktøjslinjen fungerer muligvis ikke" - Startsiden ændres kun ved appstart - - - Deaktivér genoptagelse af Shorts spiller - Shorts-afspilleren genoptages ikke ved app-start - Kortspilleren vil genoptage ved app-opstart - - - Åbne Shorts med - Shorts-afspiller - Standardafspiller - Standardafspiller i fuld skærm - - - Automatisk afspilning af Shorts - Shorts afspilles automatisk - Shorts gentages - Automatisk afspilning af Shorts i baggrunden - Shorts i baggrunden afspilles automatisk - Shorts i baggrunden gentages - - - Mini-afspiller - Skift stilen på den minimerede afspiller i appen - Type af miniplayer - Deaktiveret - Standard - Moderne 1 - Moderne 2 - Moderne 3 - Moderne 4 - Deaktiver afrundede hjørner - Hjørner er firkantede - Hjørner er afrundede - Aktiver dobbelttryk og klemme for at ændre størrelse - "Dobbelttrykshandling og knib for at ændre størrelse er aktiveret + Startsiden ændres kun ved appstart + + + Deaktivér genoptagelse af Shorts spiller + Shorts-afspilleren genoptages ikke ved app-start + Kortspilleren vil genoptage ved app-opstart + + + Åbne Shorts med + Shorts-afspiller + Standardafspiller + Standardafspiller i fuld skærm + + + Automatisk afspilning af Shorts + Shorts afspilles automatisk + Shorts gentages + Automatisk afspilning af Shorts i baggrunden + Shorts i baggrunden afspilles automatisk + Shorts i baggrunden gentages + + + Mini-afspiller + Skift stilen på den minimerede afspiller i appen + Type af miniplayer + Deaktiveret + Standard + Moderne 1 + Moderne 2 + Moderne 3 + Moderne 4 + Deaktiver afrundede hjørner + Hjørner er firkantede + Hjørner er afrundede + Aktiver dobbelttryk og klemme for at ændre størrelse + "Dobbelttrykshandling og knib for at ændre størrelse er aktiveret ● Dobbelttryk for at øge miniafspillerstørrelsen ● Dobbelttryk igen for at gendanne den oprindelige størrelse" - Dobbelttryk handling og klemme for at ændre størrelse er deaktiveret - Deaktiver træk og slip - Træk og slip er deaktiveret - "Træk og slip er aktiveret + Dobbelttryk handling og klemme for at ændre størrelse er deaktiveret + Deaktiver træk og slip + Træk og slip er deaktiveret + "Træk og slip er aktiveret Miniafspiller kan trækkes til et hvilket som helst hjørne af skærmen" - Deaktiver vandret trækbevægelse - Vandret trækbevægelse deaktiveret - "Vandret træk-bevægelse aktiveret + Deaktiver vandret trækbevægelse + Vandret trækbevægelse deaktiveret + "Vandret træk-bevægelse aktiveret Miniafspiller kan trækkes ud over skærmen til venstre eller højre" - Skjul overlay-knapper - Overlay-knapper er skjult - Overlay-knapper vises - Skjul undertekster - Undertekster er skjult - Undertekster er vist - Skjul overspring fremad og tilbage knapper - Spring frem og tilbage er skjult - Spring frem og tilbage vises - Oprindelig størrelse - Indledende på skærmstørrelse, i pixels - Pixel størrelse skal være mellem %1$s og %2$s - Overlay uigennemsigtighed - Gennemsigtighedsværdi mellem 0-100, hvor 0 er gennemsigtig - Miniplayer overlay gennemsigtighed skal være mellem 0-100 - - - Aktiver gradient indlæsning af skærmen - Indlæser skærmen vil have en gradient baggrund - Indlæser skærmen vil have en solid baggrund - Splash screens udseende - Farve - Sort og hvid - Aktivér brugerdefineret søgelinjefarve - Brugerdefineret søgelinje farve vises - Original søgelinje farve vises - Brugerdefineret farve på søgelinje - Farven på søgelinjen - Brugerdefineret accentfarve på søgelinje - Søgelinjens accentfarve - Ugyldig søgelinje farveværdi - - - - - Sidehovedlogo - Standard - Normal - - Brugerdefineret - - - Bypass billede region restriktioner - Bruger billedvært yt4.ggpht.com - "Bruger original billedevært + Skjul overlay-knapper + Overlay-knapper er skjult + Overlay-knapper vises + Skjul undertekster + Undertekster er skjult + Undertekster er vist + Skjul overspring fremad og tilbage knapper + Spring frem og tilbage er skjult + Spring frem og tilbage vises + Oprindelig størrelse + Indledende på skærmstørrelse, i pixels + Pixel størrelse skal være mellem %1$s og %2$s + Overlay uigennemsigtighed + Gennemsigtighedsværdi mellem 0-100, hvor 0 er gennemsigtig + Miniplayer overlay gennemsigtighed skal være mellem 0-100 + + + Aktiver gradient indlæsning af skærmen + Indlæser skærmen vil have en gradient baggrund + Indlæser skærmen vil have en solid baggrund + Splash screens udseende + Farve + Sort og hvid + Aktivér brugerdefineret søgelinjefarve + Brugerdefineret søgelinje farve vises + Original søgelinje farve vises + Brugerdefineret farve på søgelinje + Farven på søgelinjen + Brugerdefineret accentfarve på søgelinje + Søgelinjens accentfarve + Ugyldig søgelinje farveværdi + + + + Sidehovedlogo + Standard + Normal + + Brugerdefineret + + + Bypass billede region restriktioner + Bruger billedvært yt4.ggpht.com + "Bruger original billedevært Aktivering af dette kan løse manglende billeder, der er blokeret i nogle regioner" - - - - Hjem fane - - \'Abonnementer\'-fane - - Dig fane - Afspiller-afspilningslister & anbefalinger - Søgeresultater - Originale miniaturebilleder - DeArrow & Originale miniaturer - DeArrow & stadig fanger - Fangster stadig - "DeArrow leverer crowdsourcede miniaturebilleder til YouTube-videoer. Disse miniaturebilleder er ofte mere relevante end dem, der er tilgængelige fra YouTube + + + + Hjem fane + + \'Abonnementer\'-fane + + Dig fane + Afspiller-afspilningslister & anbefalinger + Søgeresultater + Originale miniaturebilleder + DeArrow & Originale miniaturer + DeArrow & stadig fanger + Fangster stadig + "DeArrow leverer crowdsourcede miniaturebilleder til YouTube-videoer. Disse miniaturebilleder er ofte mere relevante end dem, der er tilgængelige fra YouTube Hvis aktiveret, sendes videolinks til API-serveren, og ingen andre data sendes. Hvis en video ikke har DeArrow-miniaturebilleder, vises de originale eller stillbilleder Tryk her for at lære mere om DeArrow" - Vis en toast hvis API ikke er tilgængelig - Toast vises hvis DeArrow ikke er tilgængelig - Toast er ikke vist hvis DeArrow ikke er tilgængelig - DeArrow API-slutpunkt - Webadressen på DeArrow thumbnail cache endpoint - Stadig video indfanger - Stadig optagelser er taget fra begyndelsen / midten / slutningen af hver video. Disse billeder er indbygget i YouTube og ingen ekstern API bruges - Brug stadig hurtige optagelser - Brug stadig medium kvalitet. Miniaturer vil indlæse hurtigere, men live-streams, ufrigivet, eller meget gamle videoer kan vise tomme miniaturer - Brug af høj kvalitet stadig fanger - Video tid til at tage stadig fanger fra - Begyndelse af video - Midten af video - Slut på video - - DeArrow er midlertidigt ikke tilgængelig (statuskode: %s) - DeArrow er midlertidigt ikke tilgængelig - - - Vis ReVanced meddelelser - Meddelelser ved opstart vises - Meddelelser ved opstart vises ikke - Vis meddelelser ved opstart - Kunne ikke forbinde til udbyder af annonceringer - Luk - - - Aktiver loop-video - Videoen vil loope - Videoen vil ikke loope - - - Vis knap for loop-video - Knappen vises - Knappen vises ikke - Loop-video er slået til - Loop-video er slået fra - - - - - Spoof enhedens dimensioner - "Enhedens dimensioner er forfalsket + Vis en toast hvis API ikke er tilgængelig + Toast vises hvis DeArrow ikke er tilgængelig + Toast er ikke vist hvis DeArrow ikke er tilgængelig + DeArrow API-slutpunkt + Webadressen på DeArrow thumbnail cache endpoint + Stadig video indfanger + Stadig optagelser er taget fra begyndelsen / midten / slutningen af hver video. Disse billeder er indbygget i YouTube og ingen ekstern API bruges + Brug stadig hurtige optagelser + Brug stadig medium kvalitet. Miniaturer vil indlæse hurtigere, men live-streams, ufrigivet, eller meget gamle videoer kan vise tomme miniaturer + Brug af høj kvalitet stadig fanger + Video tid til at tage stadig fanger fra + Begyndelse af video + Midten af video + Slut på video + + DeArrow er midlertidigt ikke tilgængelig (statuskode: %s) + DeArrow er midlertidigt ikke tilgængelig + + + Vis ReVanced meddelelser + Meddelelser ved opstart vises + Meddelelser ved opstart vises ikke + Vis meddelelser ved opstart + Kunne ikke forbinde til udbyder af annonceringer + Luk + + + Aktiver loop-video + Videoen vil loope + Videoen vil ikke loope + + + Vis knap for loop-video + Knappen vises + Knappen vises ikke + Loop-video er slået til + Loop-video er slået fra + + + + Spoof enhedens dimensioner + "Enhedens dimensioner er forfalsket Højere videokvalitet kan låses op, men du kan opleve videoafspilningshakkethed, dårligere batterilevetid og ukendte bivirkninger" - "Enhedens dimensioner forfalskes ikke + "Enhedens dimensioner forfalskes ikke Aktivering af dette kan låse op for højere videokvalitet" - Aktivering af dette kan forårsage videoafspilning stuttering, værre batterilevetid og ukendte bivirkninger. - - - Haptisk feedback - Skift haptisk feedback - Deaktivér haptics for kapitler - Haptics for kapitler er deaktiveret - Haptics for kapitler er aktiveret - Deaktivér præcis søge-haptics - Præcis søge-haptik er deaktiveret - Præcis søge-haptics er aktiveret - Deaktivér fortryd søge-haptik - Fortryd søge-haptik er deaktiveret - Fortryd søge-haptik er aktiveret - Deaktivér zoom haptics - Zoom haptics er deaktiveret - Zoom haptics er aktiveret - - - Hvis du for nylig har ændret dine kontooplysninger, skal du afinstallere og geninstallere MicroG. - - - Bypass URL omdirigeringer - URL omdirigeringer er omgået - URL omdirigeringer er ikke omgået - - - Åbn links i browser - Åbner links i ekstern browser - Åbner links i browser i appen - - - - Automatisk - Husk ændringer i videokvalitet - Kvalitetsændringer gælder for alle videoer - Kvalitetsændringer gælder kun for den aktuelle video - Vis notifikation ved ændring af videokvalitet - En notifikation vises, når standardvideokvaliteten ændres - Der vises ikke en notifikation, når standardvideokvaliteten ændres - Standard videokvalitet på Wi-Fi-netværk - Standard videokvalitet på mobilnetværk - Husk kvalitetsændringer for Shorts - Kvalitetsændringer gælder for alle Shorts - Kvalitetsændringer gælder kun for den aktuelle Short - Standard Shorts-kvalitet på Wi-Fi-netværk - Standard Shorts-kvalitet på mobilnetværk - mobil - Wi-Fi - Ændrede standard %1$s kvalitet til: %2$s - Ændrede Shorts %1$s kvalitet til: %2$s - - - Vis hastigheds dialogknap - Hastighedsdialogknap vises. Tryk og hold nede for at nulstille afspilningshastigheden til standard - Hastighedsdialogknap vises ikke - - - Vis videokvalitetsknap - Videokvalitetsknap vises. Tryk og hold nede for at nulstille kvaliteten til standard - Videokvalitetsknap vises ikke - - - Tilpasset afspilningshastighed menu - Tilpasset hastighed menu er vist - Brugerdefineret hastighedsmenu vises ikke - Gendan gammel afspilningshastighedsmenu - Gammel hastighedsmenu vises - Moderne hastighedsmenu vises - Tilpasset afspilningshastighed - Tilføj eller ændr den brugerdefinerede afspilningshastighed - Brugerdefinerede hastigheder skal være mindre end %s - Ugyldige brugerdefinerede afspilningshastigheder - Automatisk - Brugerdefineret hastighed, når du holder den nede - Afspilningshastighed mellem 0-8 - - - Husk ændringer i afspilningshastighed - Ændring af afspilningshastighed gælder for alle videoer - Ændringerne i afspilningshastighed gælder kun for den aktuelle video - Vis notifikation ved ændring af afspilningshastighed - En notifikation vises, når standardafspilningshastigheden ændres - Meddelelse vises ikke, når standardafspilningshastigheden ændres - Standard afspilningshastighed - Ændrede standardhastighed til: %s - - - Deaktiver HDR-video - HDR-video er deaktiveret - HDR-video er aktiveret - Gennemtving AVC (H.264) - Video-codec er tvunget til AVC (H.264) - Video-codec bestemmes automatisk - "Fordele: + Aktivering af dette kan forårsage videoafspilning stuttering, værre batterilevetid og ukendte bivirkninger. + + + Haptisk feedback + Skift haptisk feedback + Deaktivér haptics for kapitler + Haptics for kapitler er deaktiveret + Haptics for kapitler er aktiveret + Deaktivér præcis søge-haptics + Præcis søge-haptik er deaktiveret + Præcis søge-haptics er aktiveret + Deaktivér fortryd søge-haptik + Fortryd søge-haptik er deaktiveret + Fortryd søge-haptik er aktiveret + Deaktivér zoom haptics + Zoom haptics er deaktiveret + Zoom haptics er aktiveret + + + Hvis du for nylig har ændret dine kontooplysninger, skal du afinstallere og geninstallere MicroG. + + + Bypass URL omdirigeringer + URL omdirigeringer er omgået + URL omdirigeringer er ikke omgået + + + Åbn links i browser + Åbner links i ekstern browser + Åbner links i browser i appen + + + + Automatisk + Husk ændringer i videokvalitet + Kvalitetsændringer gælder for alle videoer + Kvalitetsændringer gælder kun for den aktuelle video + Vis notifikation ved ændring af videokvalitet + En notifikation vises, når standardvideokvaliteten ændres + Der vises ikke en notifikation, når standardvideokvaliteten ændres + Standard videokvalitet på Wi-Fi-netværk + Standard videokvalitet på mobilnetværk + Husk kvalitetsændringer for Shorts + Kvalitetsændringer gælder for alle Shorts + Kvalitetsændringer gælder kun for den aktuelle Short + Standard Shorts-kvalitet på Wi-Fi-netværk + Standard Shorts-kvalitet på mobilnetværk + mobil + Wi-Fi + Ændrede standard %1$s kvalitet til: %2$s + Ændrede Shorts %1$s kvalitet til: %2$s + + + Vis hastigheds dialogknap + Hastighedsdialogknap vises. Tryk og hold nede for at nulstille afspilningshastigheden til standard + Hastighedsdialogknap vises ikke + + + Vis videokvalitetsknap + Videokvalitetsknap vises. Tryk og hold nede for at nulstille kvaliteten til standard + Videokvalitetsknap vises ikke + + + Tilpasset afspilningshastighed menu + Tilpasset hastighed menu er vist + Brugerdefineret hastighedsmenu vises ikke + Gendan gammel afspilningshastighedsmenu + Gammel hastighedsmenu vises + Moderne hastighedsmenu vises + Tilpasset afspilningshastighed + Tilføj eller ændr den brugerdefinerede afspilningshastighed + Brugerdefinerede hastigheder skal være mindre end %s + Ugyldige brugerdefinerede afspilningshastigheder + Automatisk + Brugerdefineret hastighed, når du holder den nede + Afspilningshastighed mellem 0-8 + + + Husk ændringer i afspilningshastighed + Ændring af afspilningshastighed gælder for alle videoer + Ændringerne i afspilningshastighed gælder kun for den aktuelle video + Vis notifikation ved ændring af afspilningshastighed + En notifikation vises, når standardafspilningshastigheden ændres + Meddelelse vises ikke, når standardafspilningshastigheden ændres + Standard afspilningshastighed + Ændrede standardhastighed til: %s + + + Deaktiver HDR-video + HDR-video er deaktiveret + HDR-video er aktiveret + Gennemtving AVC (H.264) + Video-codec er tvunget til AVC (H.264) + Video-codec bestemmes automatisk + "Fordele: • Kan forbedre batterilevetiden • Kan gendanne manglende videoopløsninger på ældre enheder @@ -1635,178 +1632,177 @@ Begrænsninger: • Videoafspilning vil bruge mere internetdata end VP9 eller AV1 • HDR-videoer vil ikke bruge AVC • Nogle enheder kan ikke tvinge AVC" - - - Vis avanceret menu for videokvalitet - Avanceret menu for videokvalitet vises - Avanceret menu for videokvalitet vises ikke - - - Aktivér dias for at søge - Dias for at søge er aktiveret - Dias til søgning er ikke aktiveret - - - Tillad Android VR AV1 - "Videocodec er AVC (H.264), VP9 eller AV1 + + + Vis avanceret menu for videokvalitet + Avanceret menu for videokvalitet vises + Avanceret menu for videokvalitet vises ikke + + + Aktivér dias for at søge + Dias for at søge er aktiveret + Dias til søgning er ikke aktiveret + + + Tillad Android VR AV1 + "Videocodec er AVC (H.264), VP9 eller AV1 Afspilning kan hakke eller miste billeder" - Videocodec er AVC (H.264) eller VP9 - "Aktivering af denne indstilling kan bruge software AV1-afkodning. + Videocodec er AVC (H.264) eller VP9 + "Aktivering af denne indstilling kan bruge software AV1-afkodning. Videoafspilning med AV1 kan hakke eller tabe billeder." - Bivirkninger ved spoofing - • Eksperimentel klient og kan stoppe med at fungere når som helst - • Videoen kan stoppe ved 1:00, eller er muligvis ikke tilgængelig i visse regioner - • Lydspormenu mangler - • Intet AV1-videokodek - • Stabil lydstyrke er ikke tilgængelig - • Videoer til børn afspilles muligvis ikke, når du er logget ud eller i inkognitotilstand - - • Tving original lyd er ikke tilgængelig - Vis i Statistik for nørder - Klienttypen vises i Statistik for nørder - Klienten er skjult i Statistik for nørder - - - - - - - Om - Annoncer - Generelt - Afspiller - Diverse - - - Skjul videoannoncer - Videoannoncer er skjult - Videoannoncer vises - - - Aktiver permanent gentagelse - Permanent gentagelse er aktiveret - Permanent gentagelse er deaktiveret - - - Skjul cast-knap - Cast-knappen er skjult - Cast-knappen vises - Skjul historikknap - Historikknappen er skjult - Historikknappen vises - Skjul notifikationsknap - Notifikationsknappen er skjult - Notifikationsknappen vises - Skjul søgeknap - Søgeknappen er skjult - Søgeknappen vises - - - Skjul kategorilinje - Kategorilinjen er skjult - Kategorilinjen vises - - - Skift miniafspillerfarve - Miniafspillerfarven matcher fuldskærmsafspilleren - Miniafspilleren bruger standardfarven - - - Navigationslinje - Skjul eller skift navigationslinjeknapper - - Skjul Startside - Startside-knappen er skjult - Startside-knappen vises - - Skjul Uddrag - Kortklip-knappen er skjult - Kortklip-knappen vises - - Skjul Udforsk - Udforsk-knappen er skjult - Udforsk-knappen vises - - Skjul Bibliotek - Bibliotek-knappen er skjult - Bibliotek-knappen vises - - Skjul Opgrader - Opgrader-knappen er skjult - Opgrader-knappen vises - Skjul navigationslinje - Navigationslinjen er skjult - Navigationslinjen vises - Skjul etiketter for navigationsknapper - Etiketter er skjult - Etiketter vises - - - Skjul \'Få Music Premium\'-etiket - Etiketten er skjult - Etiketten vises - - - Skjul opgraderingsknap - Knappen er skjult - Knappen vises - - - - - Blokér lydannoncer - Lydannoncer er blokeret - Lydannoncer er ublokeret - - - %s er ikke tilgængelig, annoncer vises muligvis. Prøv at skifte annonceblokeringstjeneste i indstillinger. - %s returnerede en fejl, annoncer vises muligvis. Prøv at skifte annonceblokeringstjeneste i indstillinger. - Bloker indlejrede videoannoncer - Deaktiveret - Lysende proxy - PurpleAdBlock-proxy - - - Blokér videoannoncer - Videoreklamer er blokeret - Videoannoncer er ublokerede - - - Meddelelse slettet - Vis slettede beskeder - Vis ikke slettede beskeder - Skjul slettede beskeder bag en spoiler - Vis slettede beskeder som krydset tekst - - - Auto-hævde Kanalpunkter - Kanalpunkter afhentes automatisk - Kanalpunkter afhentes ikke automatisk - - - - Aktiver Twitch-fejlfindingstilstand - Twitch-fejlfindingstilstand er aktiveret (ikke anbefalet) - Twitch-fejlfindingstilstand er deaktiveret - - - Vigtigste Indstillinger - Om - Om ReVanced - Annonceblokering - Indstillinger for annonceblokering - Chat indstillinger - Diverse - Diverse indstillinger - Generelle indstillinger - Andre indstillinger - Annoncer på klientsiden - Server-side surestream annoncer - Debug logning - Debug logs er aktiveret - Debug logs er deaktiveret - - + Bivirkninger ved spoofing + • Eksperimentel klient og kan stoppe med at fungere når som helst + • Videoen kan stoppe ved 1:00, eller er muligvis ikke tilgængelig i visse regioner + • Lydspormenu mangler + • Intet AV1-videokodek + • Stabil lydstyrke er ikke tilgængelig + • Videoer til børn afspilles muligvis ikke, når du er logget ud eller i inkognitotilstand + + • Tving original lyd er ikke tilgængelig + Vis i Statistik for nørder + Klienttypen vises i Statistik for nørder + Klienten er skjult i Statistik for nørder + + + + + + Om + Annoncer + Generelt + Afspiller + Diverse + + + Skjul videoannoncer + Videoannoncer er skjult + Videoannoncer vises + + + Aktiver permanent gentagelse + Permanent gentagelse er aktiveret + Permanent gentagelse er deaktiveret + + + Skjul cast-knap + Cast-knappen er skjult + Cast-knappen vises + Skjul historikknap + Historikknappen er skjult + Historikknappen vises + Skjul notifikationsknap + Notifikationsknappen er skjult + Notifikationsknappen vises + Skjul søgeknap + Søgeknappen er skjult + Søgeknappen vises + + + Skjul kategorilinje + Kategorilinjen er skjult + Kategorilinjen vises + + + Skift miniafspillerfarve + Miniafspillerfarven matcher fuldskærmsafspilleren + Miniafspilleren bruger standardfarven + + + Navigationslinje + Skjul eller skift navigationslinjeknapper + + Skjul Startside + Startside-knappen er skjult + Startside-knappen vises + + Skjul Uddrag + Kortklip-knappen er skjult + Kortklip-knappen vises + + Skjul Udforsk + Udforsk-knappen er skjult + Udforsk-knappen vises + + Skjul Bibliotek + Bibliotek-knappen er skjult + Bibliotek-knappen vises + + Skjul Opgrader + Opgrader-knappen er skjult + Opgrader-knappen vises + Skjul navigationslinje + Navigationslinjen er skjult + Navigationslinjen vises + Skjul etiketter for navigationsknapper + Etiketter er skjult + Etiketter vises + + + Skjul \'Få Music Premium\'-etiket + Etiketten er skjult + Etiketten vises + + + Skjul opgraderingsknap + Knappen er skjult + Knappen vises + + + + + Blokér lydannoncer + Lydannoncer er blokeret + Lydannoncer er ublokeret + + + %s er ikke tilgængelig, annoncer vises muligvis. Prøv at skifte annonceblokeringstjeneste i indstillinger. + %s returnerede en fejl, annoncer vises muligvis. Prøv at skifte annonceblokeringstjeneste i indstillinger. + Bloker indlejrede videoannoncer + Deaktiveret + Lysende proxy + PurpleAdBlock-proxy + + + Blokér videoannoncer + Videoreklamer er blokeret + Videoannoncer er ublokerede + + + Meddelelse slettet + Vis slettede beskeder + Vis ikke slettede beskeder + Skjul slettede beskeder bag en spoiler + Vis slettede beskeder som krydset tekst + + + Auto-hævde Kanalpunkter + Kanalpunkter afhentes automatisk + Kanalpunkter afhentes ikke automatisk + + + + Aktiver Twitch-fejlfindingstilstand + Twitch-fejlfindingstilstand er aktiveret (ikke anbefalet) + Twitch-fejlfindingstilstand er deaktiveret + + + Vigtigste Indstillinger + Om + Om ReVanced + Annonceblokering + Indstillinger for annonceblokering + Chat indstillinger + Diverse + Diverse indstillinger + Generelle indstillinger + Andre indstillinger + Annoncer på klientsiden + Server-side surestream annoncer + Debug logning + Debug logs er aktiveret + Debug logs er deaktiveret + + diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index 3bf33c1384..a5f1ec3812 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -17,1250 +17,1249 @@ "First 'item' text Second \"item\" text" ---> - - - - App-Name - - Benutzerdefiniert - App-Symbol - - ReVanced skaliert - - Benutzerdefiniert - - - Prüfungen fehlgeschlagen - Offizielle Website öffnen - Ignorieren - <h5>Diese App wurde offenbar nicht von Ihnen gepatcht.</h5><br>Diese App funktioniert möglicherweise nicht richtig, <b>könnte schädlich oder sogar gefährlich in der Verwendung sein</b>.< br><br>Diese Prüfungen deuten darauf hin, dass diese App vorab gepatcht wurde oder von jemandem bezogen wurde:<br><br><small>%1$s</small><br>Es wird dringend empfohlen, <b>diese App zu deinstallieren und selbst zu patchen</b> um sicherzustellen, dass Sie eine validierte und sichere App verwenden.<p><br>Wenn Sie diese Warnung ignorieren, wird sie nur zweimal angezeigt. - Auf einem anderen Gerät gepatcht - Nicht durch ReVanced Manager installiert - Vor mehr als 10 Minuten gepatcht - Vor %s Tagen gepatcht - APK Erstellungsdatum ist beschädigt - - - ReVanced Hinweis - Ihr Verlauf wird nicht gespeichert.<br><br>Dies wird höchstwahrscheinlich durch einen DNS-Werbeblocker oder einen Netzwerkproxy verursacht.<br><br>Um dies zu beheben, setze <b>s.youtube.com</b> auf die Whitelist oder schalten Sie alle DNS-Blocker und Proxies aus. - Nicht wieder anzeigen - - - Einstellungen - Bist du sicher, dass du fortfahren möchtest? - Speichern - Zurücksetzen - Farbe zurücksetzen - Ungültige Farbe - Neustart erforderlich - Starte die App neu, damit diese Änderung wirksam wird. - Neustart - Importieren - Kopieren - ReVanced-Einstellungen auf Standardwerte zurückgesetzt - %d Einstellungen importiert - Import fehlgeschlagen: %s - Sucheinstellungen - Keine Ergebnisse für „%s“ gefunden - Versuche ein anderes Schlüsselwort - Kürzliche Suchen - Aus Suchverlauf entfernen? - Suchverlauf löschen - Möchten Sie wirklich den gesamten Suchverlauf löschen? - Suchtipps - "• Tippen Sie auf einen Pfad, um dorthin zu navigieren +--> + + + App-Name + + Benutzerdefiniert + App-Symbol + + ReVanced skaliert + + Benutzerdefiniert + + + Prüfungen fehlgeschlagen + Offizielle Website öffnen + Ignorieren + <h5>Diese App wurde offenbar nicht von Ihnen gepatcht.</h5><br>Diese App funktioniert möglicherweise nicht richtig, <b>könnte schädlich oder sogar gefährlich in der Verwendung sein</b>.< br><br>Diese Prüfungen deuten darauf hin, dass diese App vorab gepatcht wurde oder von jemandem bezogen wurde:<br><br><small>%1$s</small><br>Es wird dringend empfohlen, <b>diese App zu deinstallieren und selbst zu patchen</b> um sicherzustellen, dass Sie eine validierte und sichere App verwenden.<p><br>Wenn Sie diese Warnung ignorieren, wird sie nur zweimal angezeigt. + Auf einem anderen Gerät gepatcht + Nicht durch ReVanced Manager installiert + Vor mehr als 10 Minuten gepatcht + Vor %s Tagen gepatcht + APK Erstellungsdatum ist beschädigt + + + ReVanced Hinweis + Ihr Verlauf wird nicht gespeichert.<br><br>Dies wird höchstwahrscheinlich durch einen DNS-Werbeblocker oder einen Netzwerkproxy verursacht.<br><br>Um dies zu beheben, setze <b>s.youtube.com</b> auf die Whitelist oder schalten Sie alle DNS-Blocker und Proxies aus. + Nicht wieder anzeigen + + + Einstellungen + Bist du sicher, dass du fortfahren möchtest? + Speichern + Zurücksetzen + Farbe zurücksetzen + Ungültige Farbe + Neustart erforderlich + Starte die App neu, damit diese Änderung wirksam wird. + Neustart + Importieren + Kopieren + ReVanced-Einstellungen auf Standardwerte zurückgesetzt + %d Einstellungen importiert + Import fehlgeschlagen: %s + Sucheinstellungen + Keine Ergebnisse für „%s“ gefunden + Versuche ein anderes Schlüsselwort + Kürzliche Suchen + Aus Suchverlauf entfernen? + Suchverlauf löschen + Möchten Sie wirklich den gesamten Suchverlauf löschen? + Suchtipps + "• Tippen Sie auf einen Pfad, um dorthin zu navigieren • Halten Sie eine Einstellung gedrückt, um dorthin zu navigieren • Drücken Sie Enter, um eine Suchanfrage im Verlauf zu speichern • Die Suche ignoriert Groß- und Kleinschreibung sowie Satzzeichen • Übergeordnete Einstellungen erscheinen über deaktivierten untergeordneten Einstellungen" - Suchverlauf ist leer - Um den Suchverlauf zu speichern, geben Sie eine Suchanfrage ein und drücken Sie Enter - Suchverlauf der Einstellungen anzeigen - Suchverlauf der Einstellungen wird angezeigt - Der Suchverlauf der Einstellungen wird nicht angezeigt - ReVanced-Einstellungssymbole anzeigen - Einstellungssymbole werden angezeigt - Einstellungssymbole werden nicht angezeigt - ReVanced-Sprache - "Übersetzungen für einige Sprachen fehlen möglicherweise oder sind unvollständig. + Suchverlauf ist leer + Um den Suchverlauf zu speichern, geben Sie eine Suchanfrage ein und drücken Sie Enter + Suchverlauf der Einstellungen anzeigen + Suchverlauf der Einstellungen wird angezeigt + Der Suchverlauf der Einstellungen wird nicht angezeigt + ReVanced-Einstellungssymbole anzeigen + Einstellungssymbole werden angezeigt + Einstellungssymbole werden nicht angezeigt + ReVanced-Sprache + "Übersetzungen für einige Sprachen fehlen möglicherweise oder sind unvollständig. Um neue Sprachen zu übersetzen oder die vorhandenen Übersetzungen zu verbessern, besuchen Sie translate.revanced.app" - App-Sprache - Import/Export - ReVanced-Einstellungen importieren/exportieren - - Sie verwenden ReVanced-Patches Version <i>%s</i> - Hinweis - Diese Version ist eine Vorabversion, es kann zu unerwarteten Problemen kommen - Offizielle Links - + Sie verwenden ReVanced-Patches Version <i>%s</i> + Hinweis + Diese Version ist eine Vorabversion, es kann zu unerwarteten Problemen kommen + Offizielle Links + - - - GmsCore Einstellungen - Einstellungen für GmsCore - - MicroG GmsCore ist nicht installiert. Installieren Sie es. - Aktion notwendig - "MicroG GmsCore hat keine Berechtigung, im Hintergrund zu laufen. + + + GmsCore Einstellungen + Einstellungen für GmsCore + + MicroG GmsCore ist nicht installiert. Installieren Sie es. + Aktion notwendig + "MicroG GmsCore hat keine Berechtigung, im Hintergrund zu laufen. Folgen Sie der Anleitung \"Don't kill my app\" für Ihr Gerät und wenden Sie die Anweisungen auf Ihre MicroG-Installation an. Dies ist erforderlich, damit die App funktioniert." - Website öffnen - "Die Akku-Optimierung muss für MicroG GmsCore deaktiviert werden, um Probleme zu vermeiden. + Website öffnen + "Die Akku-Optimierung muss für MicroG GmsCore deaktiviert werden, um Probleme zu vermeiden. Die Deaktivierung der Akku-Optimierung für MicroG hat keinen negativen Einfluss auf den Akkuverbrauch. Tippen Sie auf die Schaltfläche \"Fortfahren\" und erlauben Sie die Optimierungsänderungen." - Weiter - - - Spoofe Video-Streams - Spoofe die Client-Video-Streams, um Wiedergabeprobleme zu verhindern - Spoofe Video-Streams - "Videostreams werden gespooft + Weiter + + + Spoofe Video-Streams + Spoofe die Client-Video-Streams, um Wiedergabeprobleme zu verhindern + Spoofe Video-Streams + "Videostreams werden gespooft Wenn Sie ein YouTube Premium-Nutzer sind, ist diese Einstellung möglicherweise nicht erforderlich" - "Video-Streams werden nicht gespooft + "Video-Streams werden nicht gespooft Die Wiedergabe funktioniert möglicherweise nicht" - Das Deaktivieren dieser Einstellung kann Wiedergabeprobleme verursachen. - Standard-Client - - - Original Audio erzwingen - Original-Audiosprache verwenden - Standardaudio verwenden - - Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" auf einen beliebigen Client außer Android Studio - - - Fehlerbehebung - Aktiviert oder deaktiviert Debugging-Optionen - Debug-Protokollierung - Debug-Protokolle sind aktiviert - Debug-Protokolle sind deaktiviert - Stacktraces protokollieren - Debug-Protokolle enthalten Stacktrace - Debug-Logs enthalten keine Stack-Traces - Toast bei ReVanced Fehler anzeigen - Ein Toast wird angezeigt, wenn ein Fehler auftritt - Es wird keine Toast-Nachricht angezeigt, wenn ein Fehler auftritt - "Das Ausschalten von Fehler-Toasts blendet alle Benachrichtigungen über Fehler in ReVanced aus. + Das Deaktivieren dieser Einstellung kann Wiedergabeprobleme verursachen. + Standard-Client + + + Original Audio erzwingen + Original-Audiosprache verwenden + Standardaudio verwenden + + Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" auf einen beliebigen Client außer Android Studio + + + Fehlerbehebung + Aktiviert oder deaktiviert Debugging-Optionen + Debug-Protokollierung + Debug-Protokolle sind aktiviert + Debug-Protokolle sind deaktiviert + Stacktraces protokollieren + Debug-Protokolle enthalten Stacktrace + Debug-Logs enthalten keine Stack-Traces + Toast bei ReVanced Fehler anzeigen + Ein Toast wird angezeigt, wenn ein Fehler auftritt + Es wird keine Toast-Nachricht angezeigt, wenn ein Fehler auftritt + "Das Ausschalten von Fehler-Toasts blendet alle Benachrichtigungen über Fehler in ReVanced aus. Sie werden nicht über unerwartete Ereignisse informiert." - Debug-Protokolle exportieren - Kopiert ReVanced-Debug-Protokolle in die Zwischenablage - Debug-Protokollierung ist deaktiviert - Keine Protokolle gefunden - Protokolle kopiert - Fehler beim Exportieren der Protokolle: %s - Debug-Protokolle löschen - Löscht alle gespeicherten ReVanced-Debug-Protokolle - Protokolle gelöscht - Feature-Flags Manager - Boolesche Feature-Flags verwalten - Aktive Flags (%d) - Blockierte Flags (%d) - Flags suchen... - Flags gespeichert - Flags zurückgesetzt - Flags in die Zwischenablage kopiert - Protokollpuffer protokollieren - Debug-Protokolle enthalten Protokollpuffer - Debug-Protokolle enthalten kein Protokollpuffer - "Wenn Sie diese Einstellung aktivieren, werden zusätzliche Layoutdaten protokolliert, einschließlich Text auf dem Bildschirm für einige UI-Komponenten. + Debug-Protokolle exportieren + Kopiert ReVanced-Debug-Protokolle in die Zwischenablage + Debug-Protokollierung ist deaktiviert + Keine Protokolle gefunden + Protokolle kopiert + Fehler beim Exportieren der Protokolle: %s + Debug-Protokolle löschen + Löscht alle gespeicherten ReVanced-Debug-Protokolle + Protokolle gelöscht + Feature-Flags Manager + Boolesche Feature-Flags verwalten + Aktive Flags (%d) + Blockierte Flags (%d) + Flags suchen... + Flags gespeichert + Flags zurückgesetzt + Flags in die Zwischenablage kopiert + Protokollpuffer protokollieren + Debug-Protokolle enthalten Protokollpuffer + Debug-Protokolle enthalten kein Protokollpuffer + "Wenn Sie diese Einstellung aktivieren, werden zusätzliche Layoutdaten protokolliert, einschließlich Text auf dem Bildschirm für einige UI-Komponenten. Dies kann helfen, Komponenten bei der Erstellung benutzerdefinierter Filter zu identifizieren. Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Adresse protokolliert." - - - Freigabelinks säubern - Tracking-Abfrageparameter wird aus freigegebenen Links entfernt - Tracking-Abfrageparameter wird nicht aus freigegebenen Links entfernt - Teilen-Links zu youtube.com ändern - Geteilte Links verwenden youtube.com - Geteilte Links verwenden music.youtube.com - - - Eigener Filter - Komponenten mit benutzerdefinierten Filtern ausblenden - Eigenen Filter aktivieren - Eigener Filter ist aktiviert - Eigener Filter ist deaktiviert - Eigener Filter - - Liste der Komponenten-Pfad-Generator-Zeichenketten zum Filtern durch neue Zeile getrennt - Ungültiger benutzerdefinierter Filter: %s - - - - - Über - Werbung - Alternative Thumbnails - Allgemein - Spieler - Fortschrittsbalken - Wischsteuerung - Verschiedenes - Alte Einstellungsmenüs wiederherstellen - Alte Einstellungsmenüs werden angezeigt - Alte Einstellungsmenüs werden nicht angezeigt - - - Hintergrundwiedergabe von Shorts deaktivieren - Hintergrundwiedergabe von Shorts ist deaktiviert - Hintergrundwiedergabe von Shorts ist aktiviert - - - Albumkarten ausblenden - Albumkarten werden ausgeblendet - Albumkarten werden angezeigt - Interpretenkarten ausblenden - Interpretenkarten sind ausgeblendet - Interpretenkarten werden angezeigt - Chips ausblenden - Chips werden ausgeblendet - Chips werden angezeigt - Communitybeiträge ausblenden - Communitybeiträge sind ausgeblendet - Communitybeiträge werden angezeigt - Kompakte Banner ausblenden - Kompakte Banner sind ausgeblendet - Kompakte Banner werden angezeigt - Ausklappbare Karte ausblenden - Ausklappbare Karte unter Videos ist ausgeblendet - Ausklappbare Karte unter Videos wird angezeigt - Schwebende Mikrofon-Schaltfläche ausblenden - Schwebende Mikrofon-Schaltfläche wird in der Suche ausgeblendet - Schwebende Mikrofon-Schaltfläche wird in der Suche angezeigt - Horizontale Reihe ausblenden - "Horizontale Regale sind ausgeblendet, wie zum Beispiel: + + + Freigabelinks säubern + Tracking-Abfrageparameter wird aus freigegebenen Links entfernt + Tracking-Abfrageparameter wird nicht aus freigegebenen Links entfernt + Teilen-Links zu youtube.com ändern + Geteilte Links verwenden youtube.com + Geteilte Links verwenden music.youtube.com + + + Eigener Filter + Komponenten mit benutzerdefinierten Filtern ausblenden + Eigenen Filter aktivieren + Eigener Filter ist aktiviert + Eigener Filter ist deaktiviert + Eigener Filter + + Liste der Komponenten-Pfad-Generator-Zeichenketten zum Filtern durch neue Zeile getrennt + Ungültiger benutzerdefinierter Filter: %s + + + + + Über + Werbung + Alternative Thumbnails + Allgemein + Spieler + Fortschrittsbalken + Wischsteuerung + Verschiedenes + Alte Einstellungsmenüs wiederherstellen + Alte Einstellungsmenüs werden angezeigt + Alte Einstellungsmenüs werden nicht angezeigt + + + Hintergrundwiedergabe von Shorts deaktivieren + Hintergrundwiedergabe von Shorts ist deaktiviert + Hintergrundwiedergabe von Shorts ist aktiviert + + + Albumkarten ausblenden + Albumkarten werden ausgeblendet + Albumkarten werden angezeigt + Interpretenkarten ausblenden + Interpretenkarten sind ausgeblendet + Interpretenkarten werden angezeigt + Chips ausblenden + Chips werden ausgeblendet + Chips werden angezeigt + Communitybeiträge ausblenden + Communitybeiträge sind ausgeblendet + Communitybeiträge werden angezeigt + Kompakte Banner ausblenden + Kompakte Banner sind ausgeblendet + Kompakte Banner werden angezeigt + Ausklappbare Karte ausblenden + Ausklappbare Karte unter Videos ist ausgeblendet + Ausklappbare Karte unter Videos wird angezeigt + Schwebende Mikrofon-Schaltfläche ausblenden + Schwebende Mikrofon-Schaltfläche wird in der Suche ausgeblendet + Schwebende Mikrofon-Schaltfläche wird in der Suche angezeigt + Horizontale Reihe ausblenden + "Horizontale Regale sind ausgeblendet, wie zum Beispiel: • Aktuelle Nachrichten • Weiter ansehen • Weitere Kanäle entdecken • Relevanteste • Einkaufen • Erneut ansehen" - Horizontale Regale werden angezeigt - Bild-Regal ausblenden - Bild-Regal in den Suchergebnissen ist ausgeblendet - Bild-Regal in den Suchergebnissen ist angezeigt - Neueste Beiträge ausblenden - Neueste Beiträge werden ausgeblendet - Neueste Beiträge werden angezeigt - Mix-Wiedergabelisten ausblenden - Mix-Wiedergabelisten werden ausgeblendet - Mix-Wiedergabelisten werden angezeigt - Film-Bereich ausblenden - Film-Bereich wird ausgeblendet - Film-Bereich wird angezeigt - - Schaltfläche \"Benachrichtige mich\" ausblenden - Schaltfläche \"Benachrichtige mich\" wird ausgeblendet - Schaltfläche \"Benachrichtige mich\" wird angezeigt - Playables ausblenden - Playables sind ausgeblendet - Playables werden angezeigt - - \'Mehr anzeigen\' Button ausblenden - Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen ist ausgeblendet - Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen wird angezeigt - Umfragen ausblenden - Umfragen werden ausgeblendet - Umfragen werden angezeigt - Ticket-Reihe ausblenden - Ticket-Reihe ist ausgeblendet - Ticket-Reihe wird angezeigt - - Videovorschlagsbeschriftungen ausblenden - \'Das haben andere auch angesehen\' und \'Dir könnten auch gefallen\' Beschriftungen in den Suchergebnissen sind ausgeblendet - \'Das haben andere auch angesehen\' und \'Dir könnten auch gefallen\' Beschriftungen in den Suchergebnissen werden angezeigt - Visuellen Abstandshalter ausblenden - Visueller Abstandshalter ist ausgeblendet - Visueller Abstandshalter ist sichtbar - - YouTube Doodles ausblenden - YouTube Doodles-Animation auf dem Logo ist ausgeblendet - YouTube Doodles Animation auf dem Logo wird angezeigt - "YouTube-Doodles werden ein paar Tage im Jahr angezeigt. + \'Mehr anzeigen\' Button ausblenden + Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen ist ausgeblendet + Schaltfläche \"Mehr anzeigen\" in den Suchergebnissen wird angezeigt + Umfragen ausblenden + Umfragen werden ausgeblendet + Umfragen werden angezeigt + Ticket-Reihe ausblenden + Ticket-Reihe ist ausgeblendet + Ticket-Reihe wird angezeigt + + Videovorschlagsbeschriftungen ausblenden + \'Das haben andere auch angesehen\' und \'Dir könnten auch gefallen\' Beschriftungen in den Suchergebnissen sind ausgeblendet + \'Das haben andere auch angesehen\' und \'Dir könnten auch gefallen\' Beschriftungen in den Suchergebnissen werden angezeigt + Visuellen Abstandshalter ausblenden + Visueller Abstandshalter ist ausgeblendet + Visueller Abstandshalter ist sichtbar + + YouTube Doodles ausblenden + YouTube Doodles-Animation auf dem Logo ist ausgeblendet + YouTube Doodles Animation auf dem Logo wird angezeigt + "YouTube-Doodles werden ein paar Tage im Jahr angezeigt. Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Ausblenden aktiviert ist, wird auch die Filterleiste unterhalb der Suchleiste ausgeblendet." - Senderleiste ausblenden - Kanalleiste ist ausgeblendet - Kanalleiste wird angezeigt - Kanal-Wasserzeichen ausblenden - Wasserzeichen ist ausgeblendet - Wasserzeichen wird angezeigt - Crowdfunding Box ausblenden - Crowdfunding-Box ist ausgeblendet - Crowdfunding-Box wird angezeigt - Notfall-Boxen ausblenden - Notfall-Boxen sind ausgeblendet - Notfall-Boxen werden angezeigt - Info-Panels ausblenden - Info-Panels sind ausgeblendet - Info-Panels werden angezeigt - - \"Abonnieren\"-Button ausblenden - Schaltfläche \"Beitreten\" ist ausgeblendet - Schaltfläche \"Beitreten\" wird angezeigt - Verstecke medizinische Panels - Medizinische Panels sind ausgeblendet - Medizinische Panels werden angezeigt - Schnelle Aktionen ausblenden - Schnelle Aktionen im Vollbildmodus sind ausgeblendet - Schnelle Aktionen im Vollbildmodus sind angezeigt - Ähnliche Videos ausblenden - Ähnliche Videos in den schnellen Aktionen sind ausgeblendet - Ähnliche Videos in den schnellen Aktionen sind angezeigt - Abonnentenrichtlinien ausblenden - Abonnenten-Community-Richtlinien sind ausgeblendet - Abonnenten-Community-Richtlinien werden angezeigt - Zeitliche Reaktionen ausblenden - Zeitgesteuerte Reaktionen sind ausgeblendet - Zeitgesteuerte Reaktionen werden angezeigt - \'KI-generierte Videozusammenfassung\' ausblenden - KI-generierter Videozusammenfassungsbereich ist ausgeblendet - Abschnitt mit KI-generierter Videozusammenfassung wird angezeigt - Ask ausblenden - Ask Abschnitt ist ausgeblendet - Ask Abschnitt wird angezeigt - Attribute ausblenden - Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen sind ausgeblendet - Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen werden angezeigt - Kapitel ausblenden - Kapitel ist ausgeblendet - Kapitel wird angezeigt - \"Wie dieser Inhalt erstellt wurde\" ausblenden - Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" ist ausgeblendet - Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" wird angezeigt - Hype-Punkte ausblenden - Hype-Punkte sind ausgeblendet - Hype-Punkte werden angezeigt - \'Podcast entdecken\' ausblenden - Der Abschnitt \"Podcast entdecken\" ist ausgeblendet - Der Abschnitt \"Podcast entdecken\" wird angezeigt - Empfohlene Links ausblenden - Bereich „Empfohlene Links“ wird ausgeblendet - Bereich „Empfohlene Links“ wird angezeigt - Empfohlene Videos ausblenden - Bereich „Empfohlene Videos“ wird ausgeblendet - Bereich „Empfohlene Videos“ wird angezeigt - Infokarten ausblenden - Info-Kartenbereich ist ausgeblendet - Info-Kartenbereich wird angezeigt - \'Schlüsselkonzepte\' ausblenden - Abschnitt \"Schlüsselkonzepte\" ist ausgeblendet - Abschnitt \"Schlüsselkonzepte\" wird angezeigt - Schaltfläche „Abonnieren“ ausblenden - Schaltfläche „Abonnieren“ wird ausgeblendet - Schaltfläche „Abonnieren“ wird angezeigt - Transkript ausblenden - Transkript-Abschnitt ist ausgeblendet - Sektion Transkripte wird angezeigt - Videobeschreibung - Komponenten der Videobeschreibung ausblenden oder anzeigen - Filterleiste - Filterleiste in Feeds, ähnlichen Videos, Suchergebnissen und im Wiedergabeverlauf aus- oder einblenden - In Feeds ausblenden - In Feeds ausgeblendet - In Feeds angezeigt - In verwandten Videos ausblenden - Versteckt in verwandten Videos - In verwandten Videos angezeigt - In Suchergebnissen ausblenden - In Suchergebnissen versteckt - In den Suchergebnissen angezeigt - Im Wiedergabeverlauf ausblenden - Im Wiedergabeverlauf ausgeblendet - Im Wiedergabeverlauf angezeigt - Kanalseite - Kanalseitenkomponenten ausblenden oder anzeigen - - Schaltfläche \"Community\" ausblenden - Community-Schaltfläche ist ausgeblendet - Community-Schaltfläche wird angezeigt - - \"Für dich\" Bereich ausblenden - \"Für dich\" Bereich ist ausgeblendet - \"Für dich\" Bereich ist angezeigt - - Schaltfläche \"Mitglied werden\" ausblenden - Schaltfläche \"Mitglied werden\" ist ausgeblendet - Schaltfläche \"Mitglied werden\" wird angezeigt - Linkvorschau ausblenden - Linkvorschau ist ausgeblendet - Linkvorschau ist angezeigt - Mitglieder-Regal ausblenden - Mitglieder-Regal ist ausgeblendet - Mitglieder-Regal wird angezeigt - - Schaltfläche \"Shop\" ausblenden - Schaltfläche \"Shop\" ist ausgeblendet - Schaltfläche \"Shop\" wird angezeigt - - Schaltfläche \"Abonnieren\" ausblenden - Schaltfläche \"Abonnieren\" ist ausgeblendet - Schaltfläche \"Abonnieren\" wird angezeigt - Kommentare - Komponenten der Kommentar-Sektion ausblenden oder anzeigen - KI-Chat-Zusammenfassung ausblenden - KI-Chat-Zusammenfassung ist ausgeblendet - KI-Chat-Zusammenfassung ist eingeblendet - KI-Kommentarübersicht ausblenden - KI-Kommentar-Zusammenfassung ist ausgeblendet - KI-Kommentar-Zusammenfassung ist eingeblendet - Kanalrichtlinien ausblenden - Kanalrichtlinien sind ausgeblendet - Kanalrichtlinien werden angezeigt - \'Kommentare von Mitglieder\' im Kopfbereich ausblenden - Kopfzeile \"Kommentare von Mitgliedern\" ist ausgeblendet - Kopfzeile \"Kommentare von Mitgliedern\" wird angezeigt - Kommentarbereich ausblenden - Kommentarbereich ist ausgeblendet - Kommentarbereich wird angezeigt - Community-Richtlinien ausblenden - Community-Richtlinien sind ausgeblendet - Community-Richtlinien sind angezeigt - \'Verknüpfung erstellen\'-Button ausblenden - Schaltfläche \" Short erstellen\" ist ausgeblendet - Schaltfläche \" Short erstellen\" wird angezeigt - Emoji- und Zeitstempel-Schaltflächen ausblenden - Emoji- und Zeitstempel-Schaltflächen sind ausgeblendet - Emoji- und Zeitstempel-Schaltflächen werden angezeigt - Vorschaukommentar ausblenden - Vorschaukommentar ist ausgeblendet - Vorschau des Kommentars wird angezeigt - Schließe die Dankeschön-Schaltfläche aus - Dankeschön-Taste ist ausgeblendet - Dankeschön Button wird angezeigt - Aufrufe ausblenden - Aufrufe sind im Feed und in den Suchergebnissen ausgeblendet - Aufrufe werden im Feed und in den Suchergebnissen angezeigt - - "Einschränkungen: + \"Abonnieren\"-Button ausblenden + Schaltfläche \"Beitreten\" ist ausgeblendet + Schaltfläche \"Beitreten\" wird angezeigt + Verstecke medizinische Panels + Medizinische Panels sind ausgeblendet + Medizinische Panels werden angezeigt + Schnelle Aktionen ausblenden + Schnelle Aktionen im Vollbildmodus sind ausgeblendet + Schnelle Aktionen im Vollbildmodus sind angezeigt + Ähnliche Videos ausblenden + Ähnliche Videos in den schnellen Aktionen sind ausgeblendet + Ähnliche Videos in den schnellen Aktionen sind angezeigt + Abonnentenrichtlinien ausblenden + Abonnenten-Community-Richtlinien sind ausgeblendet + Abonnenten-Community-Richtlinien werden angezeigt + Zeitliche Reaktionen ausblenden + Zeitgesteuerte Reaktionen sind ausgeblendet + Zeitgesteuerte Reaktionen werden angezeigt + \'KI-generierte Videozusammenfassung\' ausblenden + KI-generierter Videozusammenfassungsbereich ist ausgeblendet + Abschnitt mit KI-generierter Videozusammenfassung wird angezeigt + Ask ausblenden + Ask Abschnitt ist ausgeblendet + Ask Abschnitt wird angezeigt + Attribute ausblenden + Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen sind ausgeblendet + Empfohlene Orte, Spiele, Musik und Erwähnungen von Personen werden angezeigt + Kapitel ausblenden + Kapitel ist ausgeblendet + Kapitel wird angezeigt + \"Wie dieser Inhalt erstellt wurde\" ausblenden + Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" ist ausgeblendet + Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" wird angezeigt + Hype-Punkte ausblenden + Hype-Punkte sind ausgeblendet + Hype-Punkte werden angezeigt + \'Podcast entdecken\' ausblenden + Der Abschnitt \"Podcast entdecken\" ist ausgeblendet + Der Abschnitt \"Podcast entdecken\" wird angezeigt + Empfohlene Links ausblenden + Bereich „Empfohlene Links“ wird ausgeblendet + Bereich „Empfohlene Links“ wird angezeigt + Empfohlene Videos ausblenden + Bereich „Empfohlene Videos“ wird ausgeblendet + Bereich „Empfohlene Videos“ wird angezeigt + Infokarten ausblenden + Info-Kartenbereich ist ausgeblendet + Info-Kartenbereich wird angezeigt + \'Schlüsselkonzepte\' ausblenden + Abschnitt \"Schlüsselkonzepte\" ist ausgeblendet + Abschnitt \"Schlüsselkonzepte\" wird angezeigt + Schaltfläche „Abonnieren“ ausblenden + Schaltfläche „Abonnieren“ wird ausgeblendet + Schaltfläche „Abonnieren“ wird angezeigt + Transkript ausblenden + Transkript-Abschnitt ist ausgeblendet + Sektion Transkripte wird angezeigt + Videobeschreibung + Komponenten der Videobeschreibung ausblenden oder anzeigen + Filterleiste + Filterleiste in Feeds, ähnlichen Videos, Suchergebnissen und im Wiedergabeverlauf aus- oder einblenden + In Feeds ausblenden + In Feeds ausgeblendet + In Feeds angezeigt + In verwandten Videos ausblenden + Versteckt in verwandten Videos + In verwandten Videos angezeigt + In Suchergebnissen ausblenden + In Suchergebnissen versteckt + In den Suchergebnissen angezeigt + Im Wiedergabeverlauf ausblenden + Im Wiedergabeverlauf ausgeblendet + Im Wiedergabeverlauf angezeigt + Kanalseite + Kanalseitenkomponenten ausblenden oder anzeigen + + Schaltfläche \"Community\" ausblenden + Community-Schaltfläche ist ausgeblendet + Community-Schaltfläche wird angezeigt + + \"Für dich\" Bereich ausblenden + \"Für dich\" Bereich ist ausgeblendet + \"Für dich\" Bereich ist angezeigt + + Schaltfläche \"Mitglied werden\" ausblenden + Schaltfläche \"Mitglied werden\" ist ausgeblendet + Schaltfläche \"Mitglied werden\" wird angezeigt + Linkvorschau ausblenden + Linkvorschau ist ausgeblendet + Linkvorschau ist angezeigt + Mitglieder-Regal ausblenden + Mitglieder-Regal ist ausgeblendet + Mitglieder-Regal wird angezeigt + + Schaltfläche \"Shop\" ausblenden + Schaltfläche \"Shop\" ist ausgeblendet + Schaltfläche \"Shop\" wird angezeigt + + Schaltfläche \"Abonnieren\" ausblenden + Schaltfläche \"Abonnieren\" ist ausgeblendet + Schaltfläche \"Abonnieren\" wird angezeigt + Kommentare + Komponenten der Kommentar-Sektion ausblenden oder anzeigen + KI-Chat-Zusammenfassung ausblenden + KI-Chat-Zusammenfassung ist ausgeblendet + KI-Chat-Zusammenfassung ist eingeblendet + KI-Kommentarübersicht ausblenden + KI-Kommentar-Zusammenfassung ist ausgeblendet + KI-Kommentar-Zusammenfassung ist eingeblendet + Kanalrichtlinien ausblenden + Kanalrichtlinien sind ausgeblendet + Kanalrichtlinien werden angezeigt + \'Kommentare von Mitglieder\' im Kopfbereich ausblenden + Kopfzeile \"Kommentare von Mitgliedern\" ist ausgeblendet + Kopfzeile \"Kommentare von Mitgliedern\" wird angezeigt + Kommentarbereich ausblenden + Kommentarbereich ist ausgeblendet + Kommentarbereich wird angezeigt + Community-Richtlinien ausblenden + Community-Richtlinien sind ausgeblendet + Community-Richtlinien sind angezeigt + \'Verknüpfung erstellen\'-Button ausblenden + Schaltfläche \" Short erstellen\" ist ausgeblendet + Schaltfläche \" Short erstellen\" wird angezeigt + Emoji- und Zeitstempel-Schaltflächen ausblenden + Emoji- und Zeitstempel-Schaltflächen sind ausgeblendet + Emoji- und Zeitstempel-Schaltflächen werden angezeigt + Vorschaukommentar ausblenden + Vorschaukommentar ist ausgeblendet + Vorschau des Kommentars wird angezeigt + Schließe die Dankeschön-Schaltfläche aus + Dankeschön-Taste ist ausgeblendet + Dankeschön Button wird angezeigt + Aufrufe ausblenden + Aufrufe sind im Feed und in den Suchergebnissen ausgeblendet + Aufrufe werden im Feed und in den Suchergebnissen angezeigt + + "Einschränkungen: • Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Aufrufe anzeigen • Diese Funktion funktioniert nicht mit dem Automotive-Formfaktor" - Upload-Zeit ausblenden - Die Upload-Zeit ist im Feed und in den Suchergebnissen ausgeblendet - Die Upload-Zeit wird im Feed und in den Suchergebnissen angezeigt - - "Einschränkungen: + Upload-Zeit ausblenden + Die Upload-Zeit ist im Feed und in den Suchergebnissen ausgeblendet + Die Upload-Zeit wird im Feed und in den Suchergebnissen angezeigt + + "Einschränkungen: • Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Upload-Zeiten anzeigen • Diese Funktion funktioniert nicht mit dem Automobil-Formfaktor" - Keyword-Inhalt ausblenden - Verstecke Such- und Feed-Videos mit Schlüsselwortfilter - Home-Videos nach Schlüsselwörtern ausblenden - Videos im Home-Tab werden nach Schlüsselwörtern gefiltert - Videos im Home-Tab werden nicht nach Schlüsselwörtern gefiltert - Suchergebnisse mit Schlüsselwörtern ausblenden - Suchergebnisse werden nach Schlüsselwörtern gefiltert - Suchergebnisse werden nicht nach Schlüsselwörtern gefiltert - Abonnement-Videos mit Schlüsselwörtern ausblenden - Videos auf der Registerkarte Abonnements werden nach Schlüsselwörtern gefiltert - Videos auf der Registerkarte Abonnements werden nicht nach Schlüsselwörtern gefiltert - Zu versteckende Stichwörter - - "Stichwörter und Ausdrücke, die ausgeblendet werden sollen, durch neue Zeilen getrennt + "Stichwörter und Ausdrücke, die ausgeblendet werden sollen, durch neue Zeilen getrennt Stichwörter können Kanalnamen oder alle Texte sein, die in Videobeschreibungen angezeigt werden Wörter mit Großbuchstaben in der Mitte müssen mit der Groß- und Kleinschreibung eingegeben werden (z. B.: iPhone, TikTok, LeBlanc)" - Über Keyword-Filterung - "Startseite/Abonnements/Suchergebnisse werden gefiltert, um Inhalte auszublenden, die mit Stichwortphrasen übereinstimmen + Über Keyword-Filterung + "Startseite/Abonnements/Suchergebnisse werden gefiltert, um Inhalte auszublenden, die mit Stichwortphrasen übereinstimmen Einschränkungen • Shorts können nicht nach Kanalnamen ausgeblendet werden • Einige UI-Komponenten können nicht ausgeblendet werden • Die Suche nach einem Stichwort kann zu keinen Ergebnissen führen" - Ganze Wörter abgleichen - - Durch das Umschließen mit doppelten Anführungszeichen wird verhindert, dass teilweise Videotitel und Kanalnamen<br><br><br><b>\"ai\"</b> wird das Video ausblenden: <b>How does AI work?</b><br>aber nicht versteckt: <b>What does fair use mean?</b> - - Kann Schlüsselwort nicht verwenden: %s - Zitate hinzufügen, um Schlüsselwort zu verwenden: %s - Schlüsselwort hat widersprüchliche Erklärungen: %s - Keyword ist zu kurz und erfordert Anführungszeichen: %s - Stichwort wird alle Videos ausblenden: %s - - - Creator-Shop-Regal ausblenden - Creator Store-Regal unter dem Videoplayer ist ausgeblendet - Creator Store-Regal unter dem Videoplayer wird angezeigt - Endbild-Banner ausblenden - Endbildschirm-Shop-Banner ist ausgeblendet - Endbildschirm-Shop-Banner wird angezeigt - Vollbild-Werbung ausblenden - "Vollbildwerbung wird ausgeblendet + Ganze Wörter abgleichen + + Durch das Umschließen mit doppelten Anführungszeichen wird verhindert, dass teilweise Videotitel und Kanalnamen<br><br><br><b>\"ai\"</b> wird das Video ausblenden: <b>How does AI work?</b><br>aber nicht versteckt: <b>What does fair use mean?</b> + + Kann Schlüsselwort nicht verwenden: %s + Zitate hinzufügen, um Schlüsselwort zu verwenden: %s + Schlüsselwort hat widersprüchliche Erklärungen: %s + Keyword ist zu kurz und erfordert Anführungszeichen: %s + Stichwort wird alle Videos ausblenden: %s + + + Creator-Shop-Regal ausblenden + Creator Store-Regal unter dem Videoplayer ist ausgeblendet + Creator Store-Regal unter dem Videoplayer wird angezeigt + Endbild-Banner ausblenden + Endbildschirm-Shop-Banner ist ausgeblendet + Endbildschirm-Shop-Banner wird angezeigt + Vollbild-Werbung ausblenden + "Vollbildwerbung wird ausgeblendet Diese Funktion ist nur für ältere Geräte verfügbar" - Vollbild-Anzeigen werden angezeigt - - Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten - Allgemeine Werbung ausblenden - Allgemeine Werbung werden ausgeblendet - Allgemeine Werbung werden angezeigt - Merchandise-Banner ausblenden - Merchandise-Banner sind ausgeblendet - Warenbanner werden angezeigt - \"Enthält bezahlte Werbung\"-Hinweis ausblenden - \"Enthält bezahlte Werbung\"-Hinweis wird ausgeblendet - \"Enthält bezahlte Werbung\"-Hinweis wird angezeigt - Selbst gesponserte Karten ausblenden - Selbst gesponserte Karten sind ausgeblendet - Selbstgesponserte Karten werden angezeigt - Shopping-Links ausblenden - Shopping-Links in der Videobeschreibung sind ausgeblendet - Shopping-Links in der Videobeschreibung werden angezeigt - „Produkte ansehen“-Banner ausblenden - Produkte anzeigen-Banner im Video-Overlay ist ausgeblendet - Produkte anzeigen-Banner im Video-Overlay wird angezeigt - Suchergebnisse ausblenden - Web-Suchergebnisse sind ausgeblendet - Web-Suchergebnisse werden angezeigt - - - YouTube Premium-Aktionen ausblenden - YouTube-Premium-Angebote unterm Video-Player sind ausgeblendet - YouTube-Premium-Aktionen unter Video-Player werden angezeigt - - - Videowerbung ausblenden - Video-Anzeigen sind ausgeblendet - Video-Anzeigen werden angezeigt - - - URL in Zwischenablage kopiert - URL mit Zeitstempel kopiert - Video-URL-Schaltfläche kopieren anzeigen - Schaltfläche \"Video-URL kopieren\" wird angezeigt. Tippen, um Video-URL zu kopieren. Tippen und halten, um mit Zeitstempel zu kopieren. - Schaltfläche \"Video-URL kopieren\" wird nicht angezeigt - Kopiere Zeitstempel URL-Schaltfläche anzeigen - Schaltfläche \"URL mit Zeitstempel kopieren\" wird angezeigt. Tippen, um Video-URL mit Zeitstempel zu kopieren. Tippen und halten, um ohne Zeitstempel zu kopieren. - Schaltfläche \"URL mit Zeitstempel kopieren\" wird nicht angezeigt - - - Diskretion des Betrachters entfernen - Dialog wird entfernt - Dialog wird angezeigt - Dies umgeht nicht die Altersbeschränkung, sondern akzeptiert sie nur automatisch. - - - Pop-up \"Beim Fernseher anmelden\" deaktivieren - Pop-up \"Bei TV anmelden\" ist deaktiviert - Pop-up \"Bei TV anmelden\" ist aktiviert - - - Doppeltippen zum Kapitelüberspringen deaktivieren - Doppeltippen kann niemals ein Überspringen zum nächsten/vorherigen Kapitel auslösen - Doppeltippen kann gelegentlich ein Überspringen zum nächsten/vorherigen Kapitel auslösen - - - Externe Downloads - Einstellungen für die Verwendung eines externen Downloaders - Externen Download-Button anzeigen - Download-Button im Player wird angezeigt - Download-Button im Player wird nicht angezeigt - - Download-Aktionsknopf überschreiben - Download-Button öffnet den externen Downloader - Download-Button öffnet den nativen In-App-Downloader - Paketname des Downloaders - Paketname Ihrer installierten externen Downloader-App - Paketnamen eingeben - Andere - App nicht installiert - %s ist nicht installiert. Installier es. - "Installierte App mit Paketnamen nicht gefunden: %s + Vollbild-Anzeigen werden angezeigt + + Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten + Allgemeine Werbung ausblenden + Allgemeine Werbung werden ausgeblendet + Allgemeine Werbung werden angezeigt + Merchandise-Banner ausblenden + Merchandise-Banner sind ausgeblendet + Warenbanner werden angezeigt + \"Enthält bezahlte Werbung\"-Hinweis ausblenden + \"Enthält bezahlte Werbung\"-Hinweis wird ausgeblendet + \"Enthält bezahlte Werbung\"-Hinweis wird angezeigt + Selbst gesponserte Karten ausblenden + Selbst gesponserte Karten sind ausgeblendet + Selbstgesponserte Karten werden angezeigt + Shopping-Links ausblenden + Shopping-Links in der Videobeschreibung sind ausgeblendet + Shopping-Links in der Videobeschreibung werden angezeigt + „Produkte ansehen“-Banner ausblenden + Produkte anzeigen-Banner im Video-Overlay ist ausgeblendet + Produkte anzeigen-Banner im Video-Overlay wird angezeigt + Suchergebnisse ausblenden + Web-Suchergebnisse sind ausgeblendet + Web-Suchergebnisse werden angezeigt + + + YouTube Premium-Aktionen ausblenden + YouTube-Premium-Angebote unterm Video-Player sind ausgeblendet + YouTube-Premium-Aktionen unter Video-Player werden angezeigt + + + Videowerbung ausblenden + Video-Anzeigen sind ausgeblendet + Video-Anzeigen werden angezeigt + + + URL in Zwischenablage kopiert + URL mit Zeitstempel kopiert + Video-URL-Schaltfläche kopieren anzeigen + Schaltfläche \"Video-URL kopieren\" wird angezeigt. Tippen, um Video-URL zu kopieren. Tippen und halten, um mit Zeitstempel zu kopieren. + Schaltfläche \"Video-URL kopieren\" wird nicht angezeigt + Kopiere Zeitstempel URL-Schaltfläche anzeigen + Schaltfläche \"URL mit Zeitstempel kopieren\" wird angezeigt. Tippen, um Video-URL mit Zeitstempel zu kopieren. Tippen und halten, um ohne Zeitstempel zu kopieren. + Schaltfläche \"URL mit Zeitstempel kopieren\" wird nicht angezeigt + + + Diskretion des Betrachters entfernen + Dialog wird entfernt + Dialog wird angezeigt + Dies umgeht nicht die Altersbeschränkung, sondern akzeptiert sie nur automatisch. + + + Pop-up \"Beim Fernseher anmelden\" deaktivieren + Pop-up \"Bei TV anmelden\" ist deaktiviert + Pop-up \"Bei TV anmelden\" ist aktiviert + + + Doppeltippen zum Kapitelüberspringen deaktivieren + Doppeltippen kann niemals ein Überspringen zum nächsten/vorherigen Kapitel auslösen + Doppeltippen kann gelegentlich ein Überspringen zum nächsten/vorherigen Kapitel auslösen + + + Externe Downloads + Einstellungen für die Verwendung eines externen Downloaders + Externen Download-Button anzeigen + Download-Button im Player wird angezeigt + Download-Button im Player wird nicht angezeigt + + Download-Aktionsknopf überschreiben + Download-Button öffnet den externen Downloader + Download-Button öffnet den nativen In-App-Downloader + Paketname des Downloaders + Paketname Ihrer installierten externen Downloader-App + Paketnamen eingeben + Andere + App nicht installiert + %s ist nicht installiert. Installier es. + "Installierte App mit Paketnamen nicht gefunden: %s Stellen Sie sicher, dass der Paketname korrekt ist und die App installiert ist" - Der Paketname darf nicht leer sein - - - Genaue Suchgeste deaktivieren - Geste ist deaktiviert - Geste ist aktiviert - - - Tippen zum Suchen aktivieren - Tippen zum Suchen ist aktiviert - Tippen zum Suchen ist deaktiviert - - - Helligkeitsgeste aktivieren - "Vollbild-Helligkeits-Swipe ist aktiviert + Der Paketname darf nicht leer sein + + + Genaue Suchgeste deaktivieren + Geste ist deaktiviert + Geste ist aktiviert + + + Tippen zum Suchen aktivieren + Tippen zum Suchen ist aktiviert + Tippen zum Suchen ist deaktiviert + + + Helligkeitsgeste aktivieren + "Vollbild-Helligkeits-Swipe ist aktiviert Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms vertikal wischen" - Vollbild-Helligkeits-Swipe ist deaktiviert - Lautstärke-Geste aktivieren - "Die Vollbild-Lautstärkegeste ist aktiviert\n\nPassen Sie die Lautstärke an, indem Sie auf der rechten Seite des Bildschirms vertikal wischen" - Die Vollbild-Lautstärkegeste ist deaktiviert - Wischen durch Drücken aktivieren - Wischen durch Drücken ist aktiviert - Wischgeste durch Drücken ist deaktiviert - Haptisches Feedback aktivieren - Haptisches Feedback ist aktiviert - Haptisches Feedback ist deaktiviert - Helligkeit speichern und wiederherstellen - Helligkeit speichern und wiederherstellen, wenn Vollbild verlassen oder betreten wird - Helligkeit beim Beenden oder Einschalten des Vollbildes nicht speichern und wiederherstellen - Auto-Helligkeit Geste aktivieren - Wische runter auf den niedrigsten Wert der Helligkeitsgeste, um die automatische Helligkeit zu aktivieren - Wenn man zum niedrigsten Wert wischt, aktiviert man die automatische Helligkeit nicht - Autom - Wischüberlagerungs-Timeout - Die Anzahl der Millisekunden, die das Overlay sichtbar ist - Bildschirmüberlagerung Deckkraft Swipe - Deckkraftwert zwischen 0-100 - Die Wischdeckkraft muss zwischen 0 und 100 liegen - Farbe der Helligkeit des Wisch-Overlays - Die Farbe der Fortschrittsanzeige für Helligkeitsregler - Farbe der Lautstärke des Wisch-Overlays - Die Farbe der Fortschrittsanzeige für Lautstärkeregler - Textgröße der Wischgesten-Überlagerung - Die Textgröße für die Wischgesten-Überlagerung zwischen 1 und 30 - Die Textgröße muss zwischen 1 und 30 liegen - Wischgrößenschwelle - Der Schwellenwert für Wischen - Lautstärke-Wischgestenempfindlichkeit - Wie stark sich die Lautstärke pro Wisch ändert - Design des Wisch-Overlays - Horizontales Overlay - Horizontales Overlay (minimal - oben) - Horizontales Overlay (minimal - Mitte) - Kreisförmiges Overlay - Kreisförmiges Overlay (minimal) - Vertikales Overlay - Vertikales Overlay (minimal) - Mit Wischen wechseln Sie zu den Videos - Im Vollbildmodus wischen, um zum nächsten/vorherigen Video zu wechseln - Im Vollbildmodus wischen, um nicht zum nächsten/vorherigen Video zu wechseln - - - Autounterschriften deaktivieren - Automatische Untertitel sind deaktiviert - Automatische Untertitel sind aktiviert - - - Aktionstasten - Verstecke oder zeige Schaltflächen unter Videos - Like und Subscribe Button leuchten nicht mehr, wenn sie erwähnt werden - Like- und Subscribe-Button leuchten nicht, wenn sie erwähnt werden - Like- und Subscribe-Button leuchten, wenn sie erwähnt werden - Verstecke Likes und Dislikes - \"Gefällt mir\"-Tasten sind ausgeblendet - \"Gefällt mir\"-Tasten werden angezeigt - - Teilen ausblenden - Teilen-Schaltfläche ist ausgeblendet - Teilen-Schaltfläche wird angezeigt - - Werbung stoppen ausblenden - Schaltfläche \"Werbung stoppen\" ist ausgeblendet - Schaltfläche \"Werbung stoppen\" ist sichtbar - - Kommentare ausblenden - Kommentare-Schaltfläche ist ausgeblendet - Kommentare-Schaltfläche wird angezeigt - + Teilen ausblenden + Teilen-Schaltfläche ist ausgeblendet + Teilen-Schaltfläche wird angezeigt + + Werbung stoppen ausblenden + Schaltfläche \"Werbung stoppen\" ist ausgeblendet + Schaltfläche \"Werbung stoppen\" ist sichtbar + + Kommentare ausblenden + Kommentare-Schaltfläche ist ausgeblendet + Kommentare-Schaltfläche wird angezeigt + - Bericht ausblenden - Bericht-Button ist ausgeblendet - Bericht-Button wird angezeigt - - Remix ausblenden - Remix Button ist ausgeblendet - Remix-Taste wird angezeigt - - Download ausblenden - Download-Button ist ausgeblendet - Download-Button wird angezeigt - + Remix ausblenden + Remix Button ist ausgeblendet + Remix-Taste wird angezeigt + + Download ausblenden + Download-Button ist ausgeblendet + Download-Button wird angezeigt + - Hypen ausblenden - Hypen-Button ist ausgeblendet - Hypen-Button wird angezeigt - - Werbung ausblenden - Schaltfläche \"Promoten\" ist ausgeblendet - Schaltfläche \"Promoten\" ist sichtbar - - Dank ausblenden - Dankeschön-Taste ist ausgeblendet - Dankeschön Button wird angezeigt - + Werbung ausblenden + Schaltfläche \"Promoten\" ist ausgeblendet + Schaltfläche \"Promoten\" ist sichtbar + + Dank ausblenden + Dankeschön-Taste ist ausgeblendet + Dankeschön Button wird angezeigt + - Ask ausblenden - Ask-Button ist ausgeblendet - Ask-Button wird angezeigt - - Clip ausblenden - Clip-Button ist ausgeblendet - Clip-Taste wird angezeigt - - Shop ausblenden - Shop-Button ist ausgeblendet - Shop-Button wird angezeigt - - Speichern ausblenden - Schaltfläche \"Speichern\" ist ausgeblendet - Schaltfläche \"Speichern\" ist sichtbar - - - Navigationstasten - Verstecke oder ändere Schaltflächen in der Navigationsleiste - - Haus ausblenden - Home-Taste ist ausgeblendet - Home-Taste wird angezeigt - - Shorts ausblenden - Shorts Button ist ausgeblendet - Shorts Button wird angezeigt - - Erstellen ausblenden - Erstellen-Button ist ausgeblendet - Erstelle Schaltfläche wird angezeigt - - Abonnements ausblenden - Abonnement-Button ist ausgeblendet - Abonnement-Button wird angezeigt - Benachrichtigungen ausblenden - Benachrichtigungs-Button ist ausgeblendet - Benachrichtigungs-Button wird angezeigt - - Tauscht Erstellen mit Benachrichtigungen - "Die Schaltfläche \"Erstellen\" wird mit der Schaltfläche \"Benachrichtigungen\" vertauscht + Ask ausblenden + Ask-Button ist ausgeblendet + Ask-Button wird angezeigt + + Clip ausblenden + Clip-Button ist ausgeblendet + Clip-Taste wird angezeigt + + Shop ausblenden + Shop-Button ist ausgeblendet + Shop-Button wird angezeigt + + Speichern ausblenden + Schaltfläche \"Speichern\" ist ausgeblendet + Schaltfläche \"Speichern\" ist sichtbar + + + Navigationstasten + Verstecke oder ändere Schaltflächen in der Navigationsleiste + + Haus ausblenden + Home-Taste ist ausgeblendet + Home-Taste wird angezeigt + + Shorts ausblenden + Shorts Button ist ausgeblendet + Shorts Button wird angezeigt + + Erstellen ausblenden + Erstellen-Button ist ausgeblendet + Erstelle Schaltfläche wird angezeigt + + Abonnements ausblenden + Abonnement-Button ist ausgeblendet + Abonnement-Button wird angezeigt + Benachrichtigungen ausblenden + Benachrichtigungs-Button ist ausgeblendet + Benachrichtigungs-Button wird angezeigt + + Tauscht Erstellen mit Benachrichtigungen + "Die Schaltfläche \"Erstellen\" wird mit der Schaltfläche \"Benachrichtigungen\" vertauscht Hinweis: Durch Aktivieren dieser Option wird auch die Videowerbung zwangsweise ausgeblendet" - Erstellen-Button ist nicht mit Benachrichtigungs-Button getauscht - "Wenn Sie diese Einstellung deaktivieren, wird auch die Anzeigenblockierung für \"Shorts\" deaktiviert. + Erstellen-Button ist nicht mit Benachrichtigungs-Button getauscht + "Wenn Sie diese Einstellung deaktivieren, wird auch die Anzeigenblockierung für \"Shorts\" deaktiviert. Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus zu wechseln." - Navigationstastenbezeichnungen ausblenden - Labels sind ausgeblendet - Labels werden angezeigt - Transluzente Statusleiste deaktivieren - Statusleiste ist undurchsichtig - Die Statusleiste ist undurchsichtig oder durchscheinend - Auf einigen Geräten kann die Aktivierung dieser Funktion die Systemnavigationsleiste in transparent ändern. - Hellen, lichtdurchlässigen Balken deaktivieren - Heller Navigationsbalken ist opak - Die Navigationsleiste im hellen Modus ist undurchsichtig oder durchscheinend - Deaktiviere die dunkle, durchscheinende Leiste - Dunkler Navigationsbalken ist opak - Die Navigationsleiste im dunklen Modus ist undurchsichtig oder durchscheinend - - - Einblendmenü - Verstecke oder zeige Player-Flyout-Menüeinträge - - Bildunterschriften ausblenden - Unterlagen-Menü ist ausgeblendet - Unterlagen-Menü wird angezeigt - - Zusätzliche Einstellungen ausblenden - Zusätzliches Einstellungsmenü ist ausgeblendet - Zusätzliches Einstellungsmenü wird angezeigt - - Sleep-Timer ausblenden - Schlaf-Timer-Menü ist ausgeblendet - Schlaf-Timer-Menü wird angezeigt - - Schleifenvideo ausblenden - Loop Video Menü ist ausgeblendet - Videomenü wird angezeigt - - Ambient-Modus ausblenden - Ambient Modus Menü ist ausgeblendet - Inaktivitätsmodus Menü wird angezeigt - Stabile Lautstärke ausblenden - Stabile Lautstärke Menü wird angezeigt - Stabile Lautstärke Menü ist ausgeblendet - - Hilfe- & -Feedback ausblenden - Hilfe & Feedback-Menü ist ausgeblendet - Hilfe & Feedback-Menü wird angezeigt - - Wiedergabegeschwindigkeit ausblenden - Wiedergabegeschwindigkeit ist ausgeblendet - Wiedergabegeschwindigkeit wird angezeigt - - Sperrbildschirm ausblenden - Sperrbildschirm-Menü ist ausgeblendet - Sperrbildschirm-Menü wird angezeigt - - „Mit YouTube Music hören“ ausblenden - „Mit YouTube Music hören“-Menü ist ausgeblendet - „Mit YouTube Music hören“-Menü wird angezeigt - - Audiospur ausblenden - Audiospur-Menü ist ausgeblendet - Audiospurmenü wird angezeigt - + Bildunterschriften ausblenden + Unterlagen-Menü ist ausgeblendet + Unterlagen-Menü wird angezeigt + + Zusätzliche Einstellungen ausblenden + Zusätzliches Einstellungsmenü ist ausgeblendet + Zusätzliches Einstellungsmenü wird angezeigt + + Sleep-Timer ausblenden + Schlaf-Timer-Menü ist ausgeblendet + Schlaf-Timer-Menü wird angezeigt + + Schleifenvideo ausblenden + Loop Video Menü ist ausgeblendet + Videomenü wird angezeigt + + Ambient-Modus ausblenden + Ambient Modus Menü ist ausgeblendet + Inaktivitätsmodus Menü wird angezeigt + Stabile Lautstärke ausblenden + Stabile Lautstärke Menü wird angezeigt + Stabile Lautstärke Menü ist ausgeblendet + + Hilfe- & -Feedback ausblenden + Hilfe & Feedback-Menü ist ausgeblendet + Hilfe & Feedback-Menü wird angezeigt + + Wiedergabegeschwindigkeit ausblenden + Wiedergabegeschwindigkeit ist ausgeblendet + Wiedergabegeschwindigkeit wird angezeigt + + Sperrbildschirm ausblenden + Sperrbildschirm-Menü ist ausgeblendet + Sperrbildschirm-Menü wird angezeigt + + „Mit YouTube Music hören“ ausblenden + „Mit YouTube Music hören“-Menü ist ausgeblendet + „Mit YouTube Music hören“-Menü wird angezeigt + + Audiospur ausblenden + Audiospur-Menü ist ausgeblendet + Audiospurmenü wird angezeigt + - "\"Audiotrack-Menü ist ausgeblendet\n\nUm das Audiotrack-Menü anzuzeigen, ändern Sie \"" - - Überwachung in VR ausblenden - Im VR-Menü beobachten ist ausgeblendet - Im VR-Menü beobachten wird angezeigt - Videoqualitätsmenü ausblenden - Videomenü ist ausgeblendet - Videomenü ist sichtbar - Videoqualitätsmenüfußzeile ausblenden - Video-Qualität Menü-Fußzeile ist ausgeblendet - Video-Qualität Menü-Fußzeile wird angezeigt - - - Autoplay-Button ausblenden - Autoplay Button ist ausgeblendet - Autoplay Button wird angezeigt - - Untertitel-Button ausblenden - Beschriftungs-Button ist ausgeblendet - Schaltfläche für Untertitel wird angezeigt - Cast-Button ausblenden - Der Cast button ist ausgeblendet - Der Cast button wird angezeigt - Hintergrund der Player-Steuerelemente ausblenden - Hintergrund der Wiedergabesteuerung ist ausgeblendet - Hintergrund der Player-Steuerelemente wird angezeigt - Vorherige & Nächste Tasten ausblenden - Buttons sind ausgeblendet - Tasten werden angezeigt - - - Endkarte ausblenden - Endbildschirmkarten sind ausgeblendet - Endbildschirmkarten werden angezeigt - - - Ambient-Modus im Vollbildmodus deaktivieren - Ambient-Modus deaktiviert - Ambient-Modus aktiviert - - - Infokarten ausblenden - Infokarten sind ausgeblendet - Infokarten werden angezeigt - - - Rollladen-Animationen deaktivieren - Rollende Zahlen sind nicht animiert - Rollende Zahlen sind animiert - - - Video-Player-Suchleiste ausblenden - Video-Player-Suchleiste ist ausgeblendet - Suchleiste für Video-Player wird angezeigt - - Suchleiste für Video-Thumbnails ausblenden - Suchleiste für Video-Thumbnails ist ausgeblendet - Suchleiste für Video-Thumbnails ist eingeblendet - - - Shorts Spieler - Shorts-Player-Komponenten aus- oder einblenden - - Shorts im Startseiten-Feed ausblenden - Im Startseiten-Feed und verwandten Videos ausgeblendet - Im Startseiten-Feed und verwandten Videos angezeigt - Shorts in den Suchergebnissen ausblenden - In Suchergebnissen versteckt - In den Suchergebnissen angezeigt - - Shorts im Abos-Feed ausblenden - Im Abos-Feed ausgeblendet - Im Abos-Feed angezeigt - Shorts im Verlauf verstecken - Im Verlauf versteckt - Im Verlauf angezeigt - Label \"Automatisch synchronisiert\" ausblenden - Automatisch synchronisiertes Label ist ausgeblendet - Automatisch synchronisiertes Label wird angezeigt - Schaltfläche \"Super Thanks kaufen\" ausblenden - Schaltfläche \"Super Thanks kaufen\" ist ausgeblendet - Schaltfläche \"Super Thanks kaufen\" wird angezeigt - Effekt-Schaltfläche ausblenden - Effekt-Taste ist ausgeblendet - Effekt-Taste ist eingeblendet - Schaltfläche \"Greenscreen\" ausblenden - Grünbildschirm-Taste ist ausgeblendet - Grünbildschirm-Taste wird angezeigt - Hashtag Button ausblenden - Hashtag Button ist ausgeblendet - Hashtag Button wird angezeigt - - \'Beitreten\'-Button ausblenden - Join Button ist ausgeblendet - Schaltfläche beitreten wird angezeigt - Live-Vorschau ausblenden - Live-Vorschau ist ausgeblendet - Live-Vorschau wird angezeigt - Standortbezeichnung ausblenden - Ortsbezeichnung ist ausgeblendet - Ortsbezeichnung wird angezeigt - Schaltfläche \"Neue Beiträge\" ausblenden - Schaltfläche \"Neue Beiträge\" ist ausgeblendet - Schaltfläche \"Neue Beiträge\" wird angezeigt - Pausierte Overlay-Tasten ausblenden - Pausierte Overlay-Tasten sind ausgeblendet - Angehaltene Overlay-Tasten werden angezeigt - Kommentarvorschau ausblenden - Vorschaukommentar ist ausgeblendet - Vorschaukommentar wird angezeigt - Schaltfläche \"Musik speichern\" ausblenden - Musikspeicher Button ist ausgeblendet - Musikspeicher Button wird angezeigt - Suchvorschläge ausblenden - Suchvorschläge sind ausgeblendet - Suchvorschläge werden angezeigt - Shop-Button ausblenden - Shop-Button ist ausgeblendet - Shop-Button wird angezeigt - Sticker ausblenden - Sticker sind versteckt - Sticker werden angezeigt - \'Abonnieren\'-Button ausblenden - Abonnieren Button ist ausgeblendet - Abonnieren Button wird angezeigt - Markierte Artikel ausblenden - Markierte Produkte sind ausgeblendet - Markierte Produkte werden angezeigt - \'Demnächst\'-Button ausblenden - Kommender Button ist ausgeblendet - Kommende Schaltfläche wird angezeigt - Schaltfläche \"Diesen Sound verwenden\" ausblenden - Schaltfläche \"Diesen Sound verwenden\" ist ausgeblendet - Schaltfläche \"Diesen Sound verwenden\" ist angezeigt - Schaltfläche \"Diese Vorlage verwenden\" ausblenden - Schaltfläche \"Diese Vorlage verwenden\" ist ausgeblendet - Schaltfläche „Diese Vorlage verwenden“ wird angezeigt - \'Like\'-Button-Fontäne ausblenden - Wie Knopf Fontänen-Animation ist ausgeblendet - Wie Button Fontänen-Animation wird angezeigt - \'Like\'-Button ausblenden - \"Gefällt mir\" Button ist ausgeblendet - \"Gefällt mir\" Button wird angezeigt - \'Dislike\'-Button ausblenden - \"Gefällt mir nicht\" Button ist ausgeblendet - \"Gefällt mir nicht\" Button wird angezeigt - Kommentar-Button ausblenden - Kommentar-Button ist ausgeblendet - Kommentar-Button wird angezeigt - - \'Teilen\'-Button ausblenden - Teilen-Schaltfläche ist ausgeblendet - Teilen-Schaltfläche wird angezeigt - - \'Remix\'-Button ausblenden - Remix Button ist ausgeblendet - Remix-Taste wird angezeigt - Tonschaltfläche ausblenden - Sound-Taste ist ausgeblendet - Tonschaltfläche wird angezeigt - Info-Panel ausblenden - Info-Panel ist ausgeblendet - Info-Panel wird angezeigt - Senderleiste ausblenden - Kanalleiste ist ausgeblendet - Kanalleiste wird angezeigt - Videotitel ausblenden - Videotitel ist ausgeblendet - Videotitel wird angezeigt - Sound-Metadaten-Label ausblenden - Sound-Metadaten-Beschriftung ist ausgeblendet - Sound-Metadaten-Beschriftung wird angezeigt - Video-Link-Label ausblenden - Video-Link-Label ist ausgeblendet - Video-Link-Label wird angezeigt - Navigationsleiste ausblenden - Navigationsleiste ist ausgeblendet - Navigationsleiste wird angezeigt - - - Vorgeschlagenes Video auf dem Endbildschirm ausblenden - "Das vorgeschlagene Video auf dem Endbildschirm wird ausgeblendet, wenn die automatische Wiedergabe deaktiviert ist. + "\"Audiotrack-Menü ist ausgeblendet\n\nUm das Audiotrack-Menü anzuzeigen, ändern Sie \"" + + Überwachung in VR ausblenden + Im VR-Menü beobachten ist ausgeblendet + Im VR-Menü beobachten wird angezeigt + Videoqualitätsmenü ausblenden + Videomenü ist ausgeblendet + Videomenü ist sichtbar + Videoqualitätsmenüfußzeile ausblenden + Video-Qualität Menü-Fußzeile ist ausgeblendet + Video-Qualität Menü-Fußzeile wird angezeigt + + + Autoplay-Button ausblenden + Autoplay Button ist ausgeblendet + Autoplay Button wird angezeigt + + Untertitel-Button ausblenden + Beschriftungs-Button ist ausgeblendet + Schaltfläche für Untertitel wird angezeigt + Cast-Button ausblenden + Der Cast button ist ausgeblendet + Der Cast button wird angezeigt + Hintergrund der Player-Steuerelemente ausblenden + Hintergrund der Wiedergabesteuerung ist ausgeblendet + Hintergrund der Player-Steuerelemente wird angezeigt + Vorherige & Nächste Tasten ausblenden + Buttons sind ausgeblendet + Tasten werden angezeigt + + + Endkarte ausblenden + Endbildschirmkarten sind ausgeblendet + Endbildschirmkarten werden angezeigt + + + Ambient-Modus im Vollbildmodus deaktivieren + Ambient-Modus deaktiviert + Ambient-Modus aktiviert + + + Infokarten ausblenden + Infokarten sind ausgeblendet + Infokarten werden angezeigt + + + Rollladen-Animationen deaktivieren + Rollende Zahlen sind nicht animiert + Rollende Zahlen sind animiert + + + Video-Player-Suchleiste ausblenden + Video-Player-Suchleiste ist ausgeblendet + Suchleiste für Video-Player wird angezeigt + + Suchleiste für Video-Thumbnails ausblenden + Suchleiste für Video-Thumbnails ist ausgeblendet + Suchleiste für Video-Thumbnails ist eingeblendet + + + Shorts Spieler + Shorts-Player-Komponenten aus- oder einblenden + + Shorts im Startseiten-Feed ausblenden + Im Startseiten-Feed und verwandten Videos ausgeblendet + Im Startseiten-Feed und verwandten Videos angezeigt + Shorts in den Suchergebnissen ausblenden + In Suchergebnissen versteckt + In den Suchergebnissen angezeigt + + Shorts im Abos-Feed ausblenden + Im Abos-Feed ausgeblendet + Im Abos-Feed angezeigt + Shorts im Verlauf verstecken + Im Verlauf versteckt + Im Verlauf angezeigt + Label \"Automatisch synchronisiert\" ausblenden + Automatisch synchronisiertes Label ist ausgeblendet + Automatisch synchronisiertes Label wird angezeigt + Schaltfläche \"Super Thanks kaufen\" ausblenden + Schaltfläche \"Super Thanks kaufen\" ist ausgeblendet + Schaltfläche \"Super Thanks kaufen\" wird angezeigt + Effekt-Schaltfläche ausblenden + Effekt-Taste ist ausgeblendet + Effekt-Taste ist eingeblendet + Schaltfläche \"Greenscreen\" ausblenden + Grünbildschirm-Taste ist ausgeblendet + Grünbildschirm-Taste wird angezeigt + Hashtag Button ausblenden + Hashtag Button ist ausgeblendet + Hashtag Button wird angezeigt + + \'Beitreten\'-Button ausblenden + Join Button ist ausgeblendet + Schaltfläche beitreten wird angezeigt + Live-Vorschau ausblenden + Live-Vorschau ist ausgeblendet + Live-Vorschau wird angezeigt + Standortbezeichnung ausblenden + Ortsbezeichnung ist ausgeblendet + Ortsbezeichnung wird angezeigt + Schaltfläche \"Neue Beiträge\" ausblenden + Schaltfläche \"Neue Beiträge\" ist ausgeblendet + Schaltfläche \"Neue Beiträge\" wird angezeigt + Pausierte Overlay-Tasten ausblenden + Pausierte Overlay-Tasten sind ausgeblendet + Angehaltene Overlay-Tasten werden angezeigt + Kommentarvorschau ausblenden + Vorschaukommentar ist ausgeblendet + Vorschaukommentar wird angezeigt + Schaltfläche \"Musik speichern\" ausblenden + Musikspeicher Button ist ausgeblendet + Musikspeicher Button wird angezeigt + Suchvorschläge ausblenden + Suchvorschläge sind ausgeblendet + Suchvorschläge werden angezeigt + Shop-Button ausblenden + Shop-Button ist ausgeblendet + Shop-Button wird angezeigt + Sticker ausblenden + Sticker sind versteckt + Sticker werden angezeigt + \'Abonnieren\'-Button ausblenden + Abonnieren Button ist ausgeblendet + Abonnieren Button wird angezeigt + Markierte Artikel ausblenden + Markierte Produkte sind ausgeblendet + Markierte Produkte werden angezeigt + \'Demnächst\'-Button ausblenden + Kommender Button ist ausgeblendet + Kommende Schaltfläche wird angezeigt + Schaltfläche \"Diesen Sound verwenden\" ausblenden + Schaltfläche \"Diesen Sound verwenden\" ist ausgeblendet + Schaltfläche \"Diesen Sound verwenden\" ist angezeigt + Schaltfläche \"Diese Vorlage verwenden\" ausblenden + Schaltfläche \"Diese Vorlage verwenden\" ist ausgeblendet + Schaltfläche „Diese Vorlage verwenden“ wird angezeigt + \'Like\'-Button-Fontäne ausblenden + Wie Knopf Fontänen-Animation ist ausgeblendet + Wie Button Fontänen-Animation wird angezeigt + \'Like\'-Button ausblenden + \"Gefällt mir\" Button ist ausgeblendet + \"Gefällt mir\" Button wird angezeigt + \'Dislike\'-Button ausblenden + \"Gefällt mir nicht\" Button ist ausgeblendet + \"Gefällt mir nicht\" Button wird angezeigt + Kommentar-Button ausblenden + Kommentar-Button ist ausgeblendet + Kommentar-Button wird angezeigt + + \'Teilen\'-Button ausblenden + Teilen-Schaltfläche ist ausgeblendet + Teilen-Schaltfläche wird angezeigt + + \'Remix\'-Button ausblenden + Remix Button ist ausgeblendet + Remix-Taste wird angezeigt + Tonschaltfläche ausblenden + Sound-Taste ist ausgeblendet + Tonschaltfläche wird angezeigt + Info-Panel ausblenden + Info-Panel ist ausgeblendet + Info-Panel wird angezeigt + Senderleiste ausblenden + Kanalleiste ist ausgeblendet + Kanalleiste wird angezeigt + Videotitel ausblenden + Videotitel ist ausgeblendet + Videotitel wird angezeigt + Sound-Metadaten-Label ausblenden + Sound-Metadaten-Beschriftung ist ausgeblendet + Sound-Metadaten-Beschriftung wird angezeigt + Video-Link-Label ausblenden + Video-Link-Label ist ausgeblendet + Video-Link-Label wird angezeigt + Navigationsleiste ausblenden + Navigationsleiste ist ausgeblendet + Navigationsleiste wird angezeigt + + + Vorgeschlagenes Video auf dem Endbildschirm ausblenden + "Das vorgeschlagene Video auf dem Endbildschirm wird ausgeblendet, wenn die automatische Wiedergabe deaktiviert ist. Die automatische Wiedergabe kann in den YouTube-Einstellungen geändert werden: Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen" - Das vorgeschlagene Video auf dem Endbildschirm wird angezeigt - - - Overlay für verwandte Videos ausblenden - Overlay für verwandte Videos im Vollbild ist ausgeblendet - Overlay für verwandte Videos im Vollbild wird angezeigt - - - Verstecke Video-Zeitstempel - Zeitstempel ist ausgeblendet - Zeitstempel wird angezeigt - - - Player-Popup-Panels ausblenden - Player-Popup-Fenster sind ausgeblendet - Player-Popup-Fenster werden angezeigt - - - Beenden Sie den Vollbildmodus am Ende des Videos - Deaktiviert - Hochformat - Querformat - Hoch- und Querformat - - - Videos im Vollbild-Hochformat öffnen - Videos im Vollbild öffnen - Videos öffnen nicht Vollbild - - - Spieler-Überlagerung Deckkraft - Deckkraft Wert zwischen 0-100, wobei 0 transparent ist - Spieler-Overlay-Deckkraft muss zwischen 0-100 liegen - - - - Dislikes vorläufig nicht verfügbar (API Timeout) - Dislikes nicht verfügbar (Status %d) - Dislikes sind nicht verfügbar (Limit der Client-API) - Dislikes nicht verfügbar (%s) - - Video neu laden, um mit Return YouTube Dislike abzustimmen - - Vom Eigentümer verborgen - Dislikes werden angezeigt - Dislikes werden nicht angezeigt - Dislikes auf Shorts anzeigen - "Dislikes für Shorts werden angezeigt + Das vorgeschlagene Video auf dem Endbildschirm wird angezeigt + + + Overlay für verwandte Videos ausblenden + Overlay für verwandte Videos im Vollbild ist ausgeblendet + Overlay für verwandte Videos im Vollbild wird angezeigt + + + Verstecke Video-Zeitstempel + Zeitstempel ist ausgeblendet + Zeitstempel wird angezeigt + + + Player-Popup-Panels ausblenden + Player-Popup-Fenster sind ausgeblendet + Player-Popup-Fenster werden angezeigt + + + Beenden Sie den Vollbildmodus am Ende des Videos + Deaktiviert + Hochformat + Querformat + Hoch- und Querformat + + + Videos im Vollbild-Hochformat öffnen + Videos im Vollbild öffnen + Videos öffnen nicht Vollbild + + + Spieler-Überlagerung Deckkraft + Deckkraft Wert zwischen 0-100, wobei 0 transparent ist + Spieler-Overlay-Deckkraft muss zwischen 0-100 liegen + + + + Dislikes vorläufig nicht verfügbar (API Timeout) + Dislikes nicht verfügbar (Status %d) + Dislikes sind nicht verfügbar (Limit der Client-API) + Dislikes nicht verfügbar (%s) + + Video neu laden, um mit Return YouTube Dislike abzustimmen + + Vom Eigentümer verborgen + Dislikes werden angezeigt + Dislikes werden nicht angezeigt + Dislikes auf Shorts anzeigen + "Dislikes für Shorts werden angezeigt Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezeigt" - Dislikes für Shorts werden nicht angezeigt - Ablehnt als Prozentsatz - Dislikes werden als Prozentsatz angezeigt - Dislikes werden als Zahl angezeigt - - Kompakter Like-Button - \"Gefällt mir\" Button für minimale Breite - \"Gefällt mir\" Button für das beste Aussehen - Geschätzte \"Gefällt mir\"-Angaben anzeigen - Videos mit deaktivierten \"Gefällt mir\"-Angaben zeigen eine geschätzte Anzahl von \"Gefällt mir\"-Angaben - Geschätzte \"Gefällt mir\"-Angaben werden nicht angezeigt - Einen Toast anzeigen, wenn die API nicht verfügbar ist - Toast wird angezeigt, wenn YouTube-Ablehnung nicht verfügbar ist - Toast wird nicht angezeigt, wenn YouTube-Dislike nicht verfügbar ist - Daten werden von der YouTube Dislike API zurückgegeben. Tippe hier, um mehr zu erfahren - - Gibt die API-Statistiken dieses Geräts zurück - API-Antwortzeit, Durchschnitt - API-Antwortzeit, Minimum - API-Antwortzeit, Maximum - API-Antwortzeit, letztes Video - Dislikes vorübergehend nicht verfügbar - Client-API-Rate Limit in der Tat - API-Abstimmungen abrufen, Anzahl der Aufrufe - Keine Netzwerkanrufe durchgeführt - %d Netzwerkanrufe getätigt - API-Abstimmungen abrufen, Anzahl der Timeouts - Keine Zeitüberschreitung für Netzwerkanrufe - %d Netzwerkanrufe Timeout - Limit API-Client-Rate - Keine Limit für Kundenrate gefunden - Client-Ratenlimit %d-mal erreicht - %d Millisekunden - - - breite Suchleiste aktivieren - Breite Suchleiste ist aktiviert - Breite Suchleiste ist deaktiviert - - - Aktiviere hochwertige Vorschaubilder - Thumbnails der Suchleiste sind hohe Qualität - Thumbnails in der Suchleiste sind mittlere Qualität - "Dadurch werden auch Miniaturansichten in Livestreams wiederhergestellt, die keine Miniaturansichten mit Suchleiste haben. + Dislikes für Shorts werden nicht angezeigt + Ablehnt als Prozentsatz + Dislikes werden als Prozentsatz angezeigt + Dislikes werden als Zahl angezeigt + + Kompakter Like-Button + \"Gefällt mir\" Button für minimale Breite + \"Gefällt mir\" Button für das beste Aussehen + Geschätzte \"Gefällt mir\"-Angaben anzeigen + Videos mit deaktivierten \"Gefällt mir\"-Angaben zeigen eine geschätzte Anzahl von \"Gefällt mir\"-Angaben + Geschätzte \"Gefällt mir\"-Angaben werden nicht angezeigt + Einen Toast anzeigen, wenn die API nicht verfügbar ist + Toast wird angezeigt, wenn YouTube-Ablehnung nicht verfügbar ist + Toast wird nicht angezeigt, wenn YouTube-Dislike nicht verfügbar ist + Daten werden von der YouTube Dislike API zurückgegeben. Tippe hier, um mehr zu erfahren + + Gibt die API-Statistiken dieses Geräts zurück + API-Antwortzeit, Durchschnitt + API-Antwortzeit, Minimum + API-Antwortzeit, Maximum + API-Antwortzeit, letztes Video + Dislikes vorübergehend nicht verfügbar - Client-API-Rate Limit in der Tat + API-Abstimmungen abrufen, Anzahl der Aufrufe + Keine Netzwerkanrufe durchgeführt + %d Netzwerkanrufe getätigt + API-Abstimmungen abrufen, Anzahl der Timeouts + Keine Zeitüberschreitung für Netzwerkanrufe + %d Netzwerkanrufe Timeout + Limit API-Client-Rate + Keine Limit für Kundenrate gefunden + Client-Ratenlimit %d-mal erreicht + %d Millisekunden + + + breite Suchleiste aktivieren + Breite Suchleiste ist aktiviert + Breite Suchleiste ist deaktiviert + + + Aktiviere hochwertige Vorschaubilder + Thumbnails der Suchleiste sind hohe Qualität + Thumbnails in der Suchleiste sind mittlere Qualität + "Dadurch werden auch Miniaturansichten in Livestreams wiederhergestellt, die keine Miniaturansichten mit Suchleiste haben. Miniaturansichten mit Suchleiste verwenden die gleiche Qualität wie das aktuelle Video. Diese Funktion funktioniert am besten mit einer Videoqualität von 720p oder niedriger und bei Verwendung einer sehr schnellen Internetverbindung." - Alte Suchleisten-Thumbnails wiederherstellen - Suchleisten-Thumbnails werden über der Suchleiste angezeigt - Miniaturansichten werden im Vollbild angezeigt - - - SponsorBlock aktivieren - SponsorBlock ist ein Crowdsourcing-System zum Überspringen von nervigen Segmenten von YouTube-Videos - Darstellung - Like-Button anzeigen - Segmentbewertungs-Button wird angezeigt - Segmentbewertungs-Button wird nicht angezeigt - Quadratische Bedienelemente verwenden - Schaltflächen und Steuerelemente sind quadratisch - Schaltflächen und Bedienelemente sind abgerundet - - Kompakten Überspringen-Button verwenden - Überspringen-Button wird mit minimale Breite angezeigt - Überspringen-Button wird mit bestem Aussehen angezeigt - Überspringen-Button automatisch ausblenden - Überspringen-Button wird nach ein paar Sekunden ausgeblendet - Überspringen-Button wird während des ganzen Segmentes angezeigt - Anzeigedauer des Überspringen-Buttons - Wie lange die Schaltflächen zum Überspringen und zum Hervorheben angezeigt werden sollen, bevor sie automatisch ausgeblendet werden - Toast zum Rückgängigmachen des Überspringens anzeigen - Ein Toast wird angezeigt, wenn ein Segment automatisch übersprungen wird. Tippen Sie auf die Toast-Benachrichtigung, um das Überspringen rückgängig zu machen - Toast-Nachricht wird nicht angezeigt - Dauer der Überspring-Toastmeldung - Wie lange der Hinweis zum Rückgängigmachen des Überspringens angezeigt werden soll - 1 Sekunde - 2 Sekunden - 3 Sekunden - 4 Sekunden - 5 Sekunden - 6 Sekunden - 7 Sekunden - 8 Sekunden - 9 Sekunden - 10 Sekunden - Videolänge ohne Segmente anzeigen - Videolänge abzüglich aller Segmente wird in der Suchleiste angezeigt - Vollständige Videolänge angezeigt - Neue Segmente erstellen - Schaltfläche \"Neues Segment erstellen\" anzeigen - Neue Segmentschaltfläche erstellen wird angezeigt - Neue Segmentschaltfläche erstellen wird nicht angezeigt - Neuen Segmentschritt anpassen - Anzahl der Millisekunden, die sich die Zeitanpassungsschaltflächen bewegen, wenn neue Segmente erstellt werden - Wert muss eine positive Zahl sein - Richtlinien anzeigen - Richtlinien enthalten Regeln und Tipps zum Erstellen neuer Segmente - Den Richtlinien folgen - Lies die SponsorBlock Richtlinien bevor du neue Segmente erstellst - Bereits gelesen - Zeig sie mir - Allgemein - Einen Toast anzeigen, wenn die API nicht verfügbar ist - Toast wird angezeigt, wenn SponsorBlock nicht verfügbar ist - Toast wird nicht angezeigt, wenn SponsorBlock nicht verfügbar ist - Aktiviere Sprungzähler-Tracking - Lässt die SponsorBlock Rangliste wissen, wie viel Zeit gespeichert wird. Jedes Mal, wenn ein Segment übersprungen wird, wird eine Nachricht an die Rangliste gesendet - Überspringungszähler ist nicht aktiviert - Mindestdauer der Segmente - Segmente kürzer als dieser Wert (in Sekunden) werden nicht angezeigt oder übersprungen - Ungültige Zeitdauer - Ihre private Benutzer-Id - Das sollte vertraulich behandelt werden. Das ist wie ein Passwort und sollte mit niemandem geteilt werden. Wenn jemand das hat, kann er sich für dich ausgeben - Private Benutzer-Id muss mindestens 30 Zeichen lang sein - API URL ändern - Die Adresse des SponsorBlocks für Anrufe an den Server - API-URL zurückgesetzt - API URL ist ungültig - API-URL geändert - Einstellungen importieren/exportieren - Kopieren - Ihre SponsorBlock JSON-Konfiguration, die auf ReVanced und andere SponsorBlock-Plattformen importiert oder exportiert werden kann - Deine SponsorBlock JSON-Konfiguration, die auf ReVanced und andere SponsorBlock Plattformen importiert oder exportiert werden kann. Dies schließt deine private Benutzer-ID ein. Stelle sicher, dass du diese weise teilst - Einstellungen erfolgreich importiert - Import fehlgeschlagen: %s - Export fehlgeschlagen: %s - "Ihre Einstellungen enthalten eine private SponsorBlock-Benutzer-ID. + Alte Suchleisten-Thumbnails wiederherstellen + Suchleisten-Thumbnails werden über der Suchleiste angezeigt + Miniaturansichten werden im Vollbild angezeigt + + + SponsorBlock aktivieren + SponsorBlock ist ein Crowdsourcing-System zum Überspringen von nervigen Segmenten von YouTube-Videos + Darstellung + Like-Button anzeigen + Segmentbewertungs-Button wird angezeigt + Segmentbewertungs-Button wird nicht angezeigt + Quadratische Bedienelemente verwenden + Schaltflächen und Steuerelemente sind quadratisch + Schaltflächen und Bedienelemente sind abgerundet + + Kompakten Überspringen-Button verwenden + Überspringen-Button wird mit minimale Breite angezeigt + Überspringen-Button wird mit bestem Aussehen angezeigt + Überspringen-Button automatisch ausblenden + Überspringen-Button wird nach ein paar Sekunden ausgeblendet + Überspringen-Button wird während des ganzen Segmentes angezeigt + Anzeigedauer des Überspringen-Buttons + Wie lange die Schaltflächen zum Überspringen und zum Hervorheben angezeigt werden sollen, bevor sie automatisch ausgeblendet werden + Toast zum Rückgängigmachen des Überspringens anzeigen + Ein Toast wird angezeigt, wenn ein Segment automatisch übersprungen wird. Tippen Sie auf die Toast-Benachrichtigung, um das Überspringen rückgängig zu machen + Toast-Nachricht wird nicht angezeigt + Dauer der Überspring-Toastmeldung + Wie lange der Hinweis zum Rückgängigmachen des Überspringens angezeigt werden soll + 1 Sekunde + 2 Sekunden + 3 Sekunden + 4 Sekunden + 5 Sekunden + 6 Sekunden + 7 Sekunden + 8 Sekunden + 9 Sekunden + 10 Sekunden + Videolänge ohne Segmente anzeigen + Videolänge abzüglich aller Segmente wird in der Suchleiste angezeigt + Vollständige Videolänge angezeigt + Neue Segmente erstellen + Schaltfläche \"Neues Segment erstellen\" anzeigen + Neue Segmentschaltfläche erstellen wird angezeigt + Neue Segmentschaltfläche erstellen wird nicht angezeigt + Neuen Segmentschritt anpassen + Anzahl der Millisekunden, die sich die Zeitanpassungsschaltflächen bewegen, wenn neue Segmente erstellt werden + Wert muss eine positive Zahl sein + Richtlinien anzeigen + Richtlinien enthalten Regeln und Tipps zum Erstellen neuer Segmente + Den Richtlinien folgen + Lies die SponsorBlock Richtlinien bevor du neue Segmente erstellst + Bereits gelesen + Zeig sie mir + Allgemein + Einen Toast anzeigen, wenn die API nicht verfügbar ist + Toast wird angezeigt, wenn SponsorBlock nicht verfügbar ist + Toast wird nicht angezeigt, wenn SponsorBlock nicht verfügbar ist + Aktiviere Sprungzähler-Tracking + Lässt die SponsorBlock Rangliste wissen, wie viel Zeit gespeichert wird. Jedes Mal, wenn ein Segment übersprungen wird, wird eine Nachricht an die Rangliste gesendet + Überspringungszähler ist nicht aktiviert + Mindestdauer der Segmente + Segmente kürzer als dieser Wert (in Sekunden) werden nicht angezeigt oder übersprungen + Ungültige Zeitdauer + Ihre private Benutzer-Id + Das sollte vertraulich behandelt werden. Das ist wie ein Passwort und sollte mit niemandem geteilt werden. Wenn jemand das hat, kann er sich für dich ausgeben + Private Benutzer-Id muss mindestens 30 Zeichen lang sein + API URL ändern + Die Adresse des SponsorBlocks für Anrufe an den Server + API-URL zurückgesetzt + API URL ist ungültig + API-URL geändert + Einstellungen importieren/exportieren + Kopieren + Ihre SponsorBlock JSON-Konfiguration, die auf ReVanced und andere SponsorBlock-Plattformen importiert oder exportiert werden kann + Deine SponsorBlock JSON-Konfiguration, die auf ReVanced und andere SponsorBlock Plattformen importiert oder exportiert werden kann. Dies schließt deine private Benutzer-ID ein. Stelle sicher, dass du diese weise teilst + Einstellungen erfolgreich importiert + Import fehlgeschlagen: %s + Export fehlgeschlagen: %s + "Ihre Einstellungen enthalten eine private SponsorBlock-Benutzer-ID. Ihre Benutzer-ID ist wie ein Passwort und sollte niemals weitergegeben werden. " - Nicht wieder anzeigen - Segmentverhalten ändern - Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung. Nicht für Eigenwerbung oder kostenlose Shoutouts an Zwecke/Webseiten/Produkte, die ihnen gefallen - Unbezahlte oder Eigenwerbung - Ähnlich wie Sponsor, jedoch für unbezahlte oder Eigenwerbung. Enthält Abschnitte über Merchandise, Spenden oder Informationen darüber, mit wem sie zusammengearbeitet haben - Interaktionserinnerung (Abonnieren) - Eine kurze Erinnerung, sie in der Mitte des Inhalts zu liken, abonnieren oder folgen. Wenn er lang ist oder es um etwas Bestimmtes geht, sollte es stattdessen als Eigenwerbung gekennzeichnet sein - Der Teil des Videos, nach dem die meisten Menschen suchen - Unterbrechung/Introanimation - Ein Intervall ohne aktuellen Inhalt. Kann eine Pause, ein statischer Frame oder eine wiederholende Animation sein. Enthält keine Übergänge mit Informationen - Endkarte / Credits - Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für Fazite mit Informationen - Hook / Begrüßungen - Erzählte Trailer für das kommende Video, Begrüßungen und Verabschiedungen. Enthält keine Segmente, die zusätzlichen Inhalt hinzufügen - Vorschau / Rückblick - Sammlung von Clips, die zeigen, was im Video oder in anderen Videos einer Serie passiert ist, wo alle Informationen andernorts wiederholt werden - Abschweifung / Witze - Tangentiale Szenen oder Witze, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Enthält keine Segmente, die Kontext oder Hintergrunddetails liefern - Musikvideos: Nicht-Musik-Passagen - Nur für die Verwendung in Musikvideos. Abschnitte von Musikvideos ohne Musik, die noch nicht von einer anderen Kategorie abgedeckt werden - Überspringen - Hervorheben - Sponsor überspringen - Promo überspringen - Interaktion überspringen - Zum Hervorheben springen - Einleitung überspringen - Unterbrechung überspringen - Unterbrechung überspringen - Überspringen - Hook überspringen - Vorschau überspringen - Vorschau überspringen - Rückfall überspringen - Abschweifung überspringen - Nicht-Musik überspringen - Segment überspringen - Sponsor übersprungen - Eigenwerbung übersprungen - Nervige Erinnerung übersprungen - Zum Hervorheben übersprungen - Intro übersprungen - Übersprungene Unterbrechung - Übersprungene Unterbrechung - Outro übersprungen - Hook übersprungen - Vorschau übersprungen - Vorschau übersprungen - Übersprungene Rücklage - Abschweifung übersprungen - Nicht-Musik-Sektion übersprungen - Nicht übermitteltes Segment übersprungen - Mehrere Segmente übersprungen - Automatisch überspringen - Automatisch einmal überspringen - Einen Skip-Button anzeigen - In Suchleiste anzeigen - Deaktivieren - Segment kann nicht gesendet werden: %s - SponsorBlock ist vorübergehend nicht verfügbar - Segment kann nicht gesendet werden (Status: %1$d %2$s) - Segment kann nicht übermittelt werden. Rate Limited (zu viele vom selben Benutzer oder der gleichen IP) - Das Segment kann nicht gesendet werden: %s - "Segment kann nicht übermittelt werden. + Nicht wieder anzeigen + Segmentverhalten ändern + Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung. Nicht für Eigenwerbung oder kostenlose Shoutouts an Zwecke/Webseiten/Produkte, die ihnen gefallen + Unbezahlte oder Eigenwerbung + Ähnlich wie Sponsor, jedoch für unbezahlte oder Eigenwerbung. Enthält Abschnitte über Merchandise, Spenden oder Informationen darüber, mit wem sie zusammengearbeitet haben + Interaktionserinnerung (Abonnieren) + Eine kurze Erinnerung, sie in der Mitte des Inhalts zu liken, abonnieren oder folgen. Wenn er lang ist oder es um etwas Bestimmtes geht, sollte es stattdessen als Eigenwerbung gekennzeichnet sein + Der Teil des Videos, nach dem die meisten Menschen suchen + Unterbrechung/Introanimation + Ein Intervall ohne aktuellen Inhalt. Kann eine Pause, ein statischer Frame oder eine wiederholende Animation sein. Enthält keine Übergänge mit Informationen + Endkarte / Credits + Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für Fazite mit Informationen + Hook / Begrüßungen + Erzählte Trailer für das kommende Video, Begrüßungen und Verabschiedungen. Enthält keine Segmente, die zusätzlichen Inhalt hinzufügen + Vorschau / Rückblick + Sammlung von Clips, die zeigen, was im Video oder in anderen Videos einer Serie passiert ist, wo alle Informationen andernorts wiederholt werden + Abschweifung / Witze + Tangentiale Szenen oder Witze, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Enthält keine Segmente, die Kontext oder Hintergrunddetails liefern + Musikvideos: Nicht-Musik-Passagen + Nur für die Verwendung in Musikvideos. Abschnitte von Musikvideos ohne Musik, die noch nicht von einer anderen Kategorie abgedeckt werden + Überspringen + Hervorheben + Sponsor überspringen + Promo überspringen + Interaktion überspringen + Zum Hervorheben springen + Einleitung überspringen + Unterbrechung überspringen + Unterbrechung überspringen + Überspringen + Hook überspringen + Vorschau überspringen + Vorschau überspringen + Rückfall überspringen + Abschweifung überspringen + Nicht-Musik überspringen + Segment überspringen + Sponsor übersprungen + Eigenwerbung übersprungen + Nervige Erinnerung übersprungen + Zum Hervorheben übersprungen + Intro übersprungen + Übersprungene Unterbrechung + Übersprungene Unterbrechung + Outro übersprungen + Hook übersprungen + Vorschau übersprungen + Vorschau übersprungen + Übersprungene Rücklage + Abschweifung übersprungen + Nicht-Musik-Sektion übersprungen + Nicht übermitteltes Segment übersprungen + Mehrere Segmente übersprungen + Automatisch überspringen + Automatisch einmal überspringen + Einen Skip-Button anzeigen + In Suchleiste anzeigen + Deaktivieren + Segment kann nicht gesendet werden: %s + SponsorBlock ist vorübergehend nicht verfügbar + Segment kann nicht gesendet werden (Status: %1$d %2$s) + Segment kann nicht übermittelt werden. Rate Limited (zu viele vom selben Benutzer oder der gleichen IP) + Das Segment kann nicht gesendet werden: %s + "Segment kann nicht übermittelt werden. Existiert bereits" - Segment erfolgreich übertragen - - SponsorBlock vorübergehend nicht verfügbar (API Timeout) - SponsorBlock vorübergehend nicht verfügbar (Status %d) - SponsorBlock vorübergehend nicht verfügbar - Abstimmung für Segment nicht möglich (API Timeout) - Segment kann nicht gewählt werden (Status: %1$d %2$s) - Kann nicht für Segment abstimmen: %s - Gut bewerten - Schlecht bewerten - Kategorie ändern - Es gibt keine Segmente zur Abstimmung - - %1$s bis %2$s - Wähle die Segmentkategorie - Kategorie ist in den Einstellungen deaktiviert. Aktivieren zum Senden. - Neues SponsorBlock Segment - %s als Start oder Ende eines neuen Segments festlegen? - Ende - Jetzt - Das Segiment beginnt ab - Das Segiment endet bei - Sind diese Zeiten richtig? - "Das Segment ist von + Segment erfolgreich übertragen + + SponsorBlock vorübergehend nicht verfügbar (API Timeout) + SponsorBlock vorübergehend nicht verfügbar (Status %d) + SponsorBlock vorübergehend nicht verfügbar + Abstimmung für Segment nicht möglich (API Timeout) + Segment kann nicht gewählt werden (Status: %1$d %2$s) + Kann nicht für Segment abstimmen: %s + Gut bewerten + Schlecht bewerten + Kategorie ändern + Es gibt keine Segmente zur Abstimmung + + %1$s bis %2$s + Wähle die Segmentkategorie + Kategorie ist in den Einstellungen deaktiviert. Aktivieren zum Senden. + Neues SponsorBlock Segment + %s als Start oder Ende eines neuen Segments festlegen? + Ende + Jetzt + Das Segiment beginnt ab + Das Segiment endet bei + Sind diese Zeiten richtig? + "Das Segment ist von %1$s nach @@ -1269,46 +1268,46 @@ nach (%3$s) Bereit zum Einreichen?" - Start muss vor dem Ende sein - Markieren sie zuerst zwei Punkte auf der Zeitleiste - Vorschau des Segments und sorgt dafür, dass es reibungslos überspringt - Timing des Segments manuell bearbeiten - Möchtest du den Zeitpunkt für den Anfang oder das Ende des Segments bearbeiten? - Ungültige Zeit angegeben - Statistiken - - Statistiken sind vorübergehend nicht verfügbar (API ist ausgefallen) - Lädt... - SponsorBlock ist deaktiviert - Ihr Benutzername: <b>%s</b> - Tippe hier, um deinen Benutzernamen zu ändern - Benutzername konnte nicht geändert werden; Status: %1$d %2$s - Benutzername wurde geändert - Dein Ruf ist <b>%.2f</b> - Du hast <b>%s</b> Segmente erstellt - Tippen Sie hier, um Ihre Segmente anzuzeigen - SponsorBlock Rangliste - Du hast den Leuten <b>%s</b> Segmente erspart - Hier tippen, um die globalen Statistiken und Top-Beitragszahler zu sehen - Das ist <b>%s</b> ihres Lebens.<br>Tippe hier, um die Rangliste zu sehen - Du hast <b>%s</b> Segmente übersprungen - Das ist <b>%s</b> - Zähler übersprungener Segmente zurücksetzen? - %1$s Stunden %2$s Minuten - %1$s Minuten %2$s Sekunden - %s Sekunden - Deckkraft: - Farbe: - Über - Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen - - - Anordnungsformfactor - Standard - Telefon - Tablets - Automobil - "Zu den Änderungen gehören: + Start muss vor dem Ende sein + Markieren sie zuerst zwei Punkte auf der Zeitleiste + Vorschau des Segments und sorgt dafür, dass es reibungslos überspringt + Timing des Segments manuell bearbeiten + Möchtest du den Zeitpunkt für den Anfang oder das Ende des Segments bearbeiten? + Ungültige Zeit angegeben + Statistiken + + Statistiken sind vorübergehend nicht verfügbar (API ist ausgefallen) + Lädt... + SponsorBlock ist deaktiviert + Ihr Benutzername: <b>%s</b> + Tippe hier, um deinen Benutzernamen zu ändern + Benutzername konnte nicht geändert werden; Status: %1$d %2$s + Benutzername wurde geändert + Dein Ruf ist <b>%.2f</b> + Du hast <b>%s</b> Segmente erstellt + Tippen Sie hier, um Ihre Segmente anzuzeigen + SponsorBlock Rangliste + Du hast den Leuten <b>%s</b> Segmente erspart + Hier tippen, um die globalen Statistiken und Top-Beitragszahler zu sehen + Das ist <b>%s</b> ihres Lebens.<br>Tippe hier, um die Rangliste zu sehen + Du hast <b>%s</b> Segmente übersprungen + Das ist <b>%s</b> + Zähler übersprungener Segmente zurücksetzen? + %1$s Stunden %2$s Minuten + %1$s Minuten %2$s Sekunden + %s Sekunden + Deckkraft: + Farbe: + Über + Daten werden von der SponsorBlock API bereitgestellt. Tippe hier, um mehr zu erfahren und Downloads für andere Plattformen zu sehen + + + Anordnungsformfactor + Standard + Telefon + Tablets + Automobil + "Zu den Änderungen gehören: Tablet-Layout • Community-Beiträge sind ausgeblendet @@ -1316,308 +1315,306 @@ Tablet-Layout Automotive-Layout • Shorts werden im normalen Player geöffnet • Feed ist nach Themen und Kanälen geordnet" - - - Spoof-App-Version - Version gefälscht - Version nicht gefälscht - "Die App-Version wird zu einer älteren Version von YouTube gefälscht. + + + Spoof-App-Version + Version gefälscht + Version nicht gefälscht + "Die App-Version wird zu einer älteren Version von YouTube gefälscht. Dadurch ändert sich das Erscheinungsbild und die Funktionen der App, es können jedoch unbekannte Nebeneffekte auftreten. Wenn Sie die Funktion später deaktivieren, wird empfohlen, die App-Daten zu löschen, um UI-Fehler zu vermeiden." - Spoof-App-Versionsziel - 20.13.41 - Nicht eingeklappte Video-Aktionsleiste wiederherstellen - 20.05.46 - Funktionalität der Transkription wiederherstellen - 19.35.36 - Alte Shorts Spielersymbole wiederherstellen - 19.01.34 - Alte Navigations-Symbole wiederherstellen - - - Startseite ändern - Standard - Alle Abonnements - Kanäle durchsuchen - Kurse / Lernen - Erforschen - Mode & Schönheit - Spielen - Verlauf - Bibliothek - Videos, die ich mag - Filme - Musik - Nachrichten - Benachrichtigungen - Playlisten - Suchen - Einkaufen - Sport - Abonnements - Beliebt - Virtuelle Realität - Später ansehen - Deine Clips - Startseite immer ändern - "Die Startseite wird immer geändert. + Spoof-App-Versionsziel + 20.13.41 - Nicht eingeklappte Video-Aktionsleiste wiederherstellen + 20.05.46 - Funktionalität der Transkription wiederherstellen + 19.35.36 - Alte Shorts Spielersymbole wiederherstellen + 19.01.34 - Alte Navigations-Symbole wiederherstellen + + + Startseite ändern + Standard + Alle Abonnements + Kanäle durchsuchen + Kurse / Lernen + Erforschen + Mode & Schönheit + Spielen + Verlauf + Bibliothek + Videos, die ich mag + Filme + Musik + Nachrichten + Benachrichtigungen + Playlisten + Suchen + Einkaufen + Sport + Abonnements + Beliebt + Virtuelle Realität + Später ansehen + Deine Clips + Startseite immer ändern + "Die Startseite wird immer geändert. Einschränkung: Die Verwendung der Zurück-Taste auf der Symbolleiste funktioniert möglicherweise nicht." - Die Startseite wird nur beim Start der App geändert - - - Fortsetzen des Shorts Players deaktivieren - Der Shorts Player wird beim Start der App nicht fortgesetzt - Shorts-Player wird beim Start der App fortgesetzt - - - Shorts mit - Shorts Spieler - Normaler Spieler - Normaler Spieler im Vollbildmodus - - - Shorts automatisch abspielen - Shorts werden autoplay - Shorts wiederholen - Autoplay Shorts Hintergrund spielen - Shorts-Hintergrund spielen wird automatisch abgespielt - Shorts-Hintergrundwiedergabe wiederholt sich - - - Minispieler - Das Aussehen des minimierten In-App-Players ändern - Minispielertyp - Deaktiviert - Standard - Tablets - Abgerundete Ecken deaktivieren - Ecken sind Quadrat - Ecken sind abgerundet - Aktiviere doppeltes Tippen und Pratzen um die Größe zu ändern - "Doppeltippen und mit zwei Fingern vergrößern/verkleinern ist aktiviert + Die Startseite wird nur beim Start der App geändert + + + Fortsetzen des Shorts Players deaktivieren + Der Shorts Player wird beim Start der App nicht fortgesetzt + Shorts-Player wird beim Start der App fortgesetzt + + + Shorts mit + Shorts Spieler + Normaler Spieler + Normaler Spieler im Vollbildmodus + + + Shorts automatisch abspielen + Shorts werden autoplay + Shorts wiederholen + Autoplay Shorts Hintergrund spielen + Shorts-Hintergrund spielen wird automatisch abgespielt + Shorts-Hintergrundwiedergabe wiederholt sich + + + Minispieler + Das Aussehen des minimierten In-App-Players ändern + Minispielertyp + Deaktiviert + Standard + Tablets + Abgerundete Ecken deaktivieren + Ecken sind Quadrat + Ecken sind abgerundet + Aktiviere doppeltes Tippen und Pratzen um die Größe zu ändern + "Doppeltippen und mit zwei Fingern vergrößern/verkleinern ist aktiviert • Doppeltippen, um die Größe des Mini-Players zu vergrößern • Nochmals doppeltippen, um die ursprüngliche Größe wiederherzustellen" - Doppel-Tipp-Aktion und Pinch um die Größe zu verändern, ist deaktiviert - Drag & Drop deaktivieren - Drag and Drop ist deaktiviert - "Drag-and-Drop ist aktiviert + Doppel-Tipp-Aktion und Pinch um die Größe zu verändern, ist deaktiviert + Drag & Drop deaktivieren + Drag and Drop ist deaktiviert + "Drag-and-Drop ist aktiviert Der Mini-Player kann in jede Ecke des Bildschirms gezogen werden" - Horizontale Ziehgeste deaktivieren - Horizontale Drag Geste deaktiviert - "Horizontale Ziehgeste aktiviert + Horizontale Ziehgeste deaktivieren + Horizontale Drag Geste deaktiviert + "Horizontale Ziehgeste aktiviert Der Mini-Player kann mit einer Wischgeste vom Bildschirm nach links oder rechts gezogen werden" - Overlay-Buttons ausblenden - Overlay-Buttons sind ausgeblendet - Overlay-Buttons werden angezeigt - Untertexte ausblenden - Subtexte sind ausgeblendet - Untertexte werden angezeigt - Vorwärts- und Rückwärts-Buttons ausblenden - Vorwärts skippen und zurück sind ausgeblendet - Vorwärts und zurück springen werden angezeigt - Anfangsgröße - Initiale Bildschirmgröße, in Pixeln - Pixelgröße muss zwischen %1$s und %2$s liegen - Deckkraft der Überlagerung - Deckkraft Wert zwischen 0-100, wobei 0 transparent ist - Miniplayer-Overlay-Deckkraft muss zwischen 0-100 liegen - - - Gradientenladebildschirm aktivieren - Lade Bildschirm hat einen Farbverlauf Hintergrund - Das Laden des Bildschirms wird einen soliden Hintergrund haben - Art des Begrüßungsbildschirms - Farbe - Schwarz und Weiß - Eigene Suchleistenfarbe aktivieren - Angepasste Suchleistenfarbe wird angezeigt - Originalfarbe der Suchleiste wird angezeigt - Farbliche Anpassung der Fortschrittsanzeige - Die Farbe der Fortschrittsanzeige - Farbliche Anpassung des Fortschrittsanzeige-Akzents - Die Akzentfarbe der Fortschrittsanzeige - Ungültiger Suchleisten-Farbwert - - - - - Header-Logo - Standard - Regulär - - ReVanced Minimal - Benutzerdefiniert - - - Bildgebietsbeschränkungen umgehen - Bild-Host yt4.ggpht.com verwenden - "Ursprünglicher Bildhost wird verwendet + Overlay-Buttons ausblenden + Overlay-Buttons sind ausgeblendet + Overlay-Buttons werden angezeigt + Untertexte ausblenden + Subtexte sind ausgeblendet + Untertexte werden angezeigt + Vorwärts- und Rückwärts-Buttons ausblenden + Vorwärts skippen und zurück sind ausgeblendet + Vorwärts und zurück springen werden angezeigt + Anfangsgröße + Initiale Bildschirmgröße, in Pixeln + Pixelgröße muss zwischen %1$s und %2$s liegen + Deckkraft der Überlagerung + Deckkraft Wert zwischen 0-100, wobei 0 transparent ist + Miniplayer-Overlay-Deckkraft muss zwischen 0-100 liegen + + + Gradientenladebildschirm aktivieren + Lade Bildschirm hat einen Farbverlauf Hintergrund + Das Laden des Bildschirms wird einen soliden Hintergrund haben + Art des Begrüßungsbildschirms + Farbe + Schwarz und Weiß + Eigene Suchleistenfarbe aktivieren + Angepasste Suchleistenfarbe wird angezeigt + Originalfarbe der Suchleiste wird angezeigt + Farbliche Anpassung der Fortschrittsanzeige + Die Farbe der Fortschrittsanzeige + Farbliche Anpassung des Fortschrittsanzeige-Akzents + Die Akzentfarbe der Fortschrittsanzeige + Ungültiger Suchleisten-Farbwert + + + + Header-Logo + Standard + Regulär + + ReVanced Minimal + Benutzerdefiniert + + + Bildgebietsbeschränkungen umgehen + Bild-Host yt4.ggpht.com verwenden + "Ursprünglicher Bildhost wird verwendet Durch Aktivieren dieser Option können fehlende Bilder behoben werden, die in einigen Regionen blockiert sind" - - - - Home-Tab - - Abos-Tab - - Mein YouTube-Tab - Player-Wiedergabelisten & Empfehlungen - Suchergebnisse - Original-Vorschaubilder - Pfeil & Original-Vorschaubilder - Pfeil & Standbild - Standbild - "DeArrow bietet von der Community bereitgestellte Vorschaubilder für YouTube-Videos. Diese Vorschaubilder sind oft relevanter als die von YouTube bereitgestellten. + + + + Home-Tab + + Abos-Tab + + Mein YouTube-Tab + Player-Wiedergabelisten & Empfehlungen + Suchergebnisse + Original-Vorschaubilder + Pfeil & Original-Vorschaubilder + Pfeil & Standbild + Standbild + "DeArrow bietet von der Community bereitgestellte Vorschaubilder für YouTube-Videos. Diese Vorschaubilder sind oft relevanter als die von YouTube bereitgestellten. Wenn diese Option aktiviert ist, werden Video-URLs an den API-Server gesendet und keine anderen Daten werden gesendet. Wenn ein Video keine DeArrow-Vorschaubilder hat, wird das originale Vorschaubild oder ein Standbild angezeigt. Tippen Sie hier, um mehr über DeArrow zu erfahren" - Ein Toast anzeigen, wenn die API nicht verfügbar ist - Toast wird angezeigt, wenn DeArrow nicht verfügbar ist - Toast wird nicht angezeigt, wenn DeArrow nicht verfügbar ist - DeArrow API-Endpunkt - Die URL des Cache Endpunkts der DeArrow Thumbnails - Standbilder - Die Standbilder werden vom Anfang / Mitte / Ende jedes Videos erstellt. Diese Bilder stammen von YouTube und es wird keine externe API verwendet - Schnelle Standbilder verwenden - Standbilder in mittlerer Qualität verwenden. Die Vorschaubilder werden schneller geladen, aber Livestreams, unveröffentlichte oder sehr alte Videos können leere Vorschaubilder anzeigen. - Standbilder in hoher Qualität verwenden - Videozeitpunkt von dem Standbilder aufgenommen werden - Beginn des Videos - Mitte des Videos - Ende des Videos - - DeArrow ist vorübergehend nicht verfügbar (Statuscode: %s) - DeArrow ist vorübergehend nicht verfügbar - - - Verbesserte Ankündigungen anzeigen - Ankündigungen beim Start werden angezeigt - Ankündigungen beim Start werden nicht angezeigt - Ankündigungen beim Start anzeigen - Verbindung zum Ankündigungsanbieter fehlgeschlagen - Verwerfen - - - Loop-Video aktivieren - Video wird wiederholt - Video wird nicht wiederholt - - - Loop-Video-Schaltfläche anzeigen - Schaltfläche wird angezeigt - Schaltfläche wird nicht angezeigt - Loop-Video ist aktiviert - Loop-Video ist deaktiviert - - - - - Spoof-Gerätegröße - "Gerätemessungen gefälscht + Ein Toast anzeigen, wenn die API nicht verfügbar ist + Toast wird angezeigt, wenn DeArrow nicht verfügbar ist + Toast wird nicht angezeigt, wenn DeArrow nicht verfügbar ist + DeArrow API-Endpunkt + Die URL des Cache Endpunkts der DeArrow Thumbnails + Standbilder + Die Standbilder werden vom Anfang / Mitte / Ende jedes Videos erstellt. Diese Bilder stammen von YouTube und es wird keine externe API verwendet + Schnelle Standbilder verwenden + Standbilder in mittlerer Qualität verwenden. Die Vorschaubilder werden schneller geladen, aber Livestreams, unveröffentlichte oder sehr alte Videos können leere Vorschaubilder anzeigen. + Standbilder in hoher Qualität verwenden + Videozeitpunkt von dem Standbilder aufgenommen werden + Beginn des Videos + Mitte des Videos + Ende des Videos + + DeArrow ist vorübergehend nicht verfügbar (Statuscode: %s) + DeArrow ist vorübergehend nicht verfügbar + + + Verbesserte Ankündigungen anzeigen + Ankündigungen beim Start werden angezeigt + Ankündigungen beim Start werden nicht angezeigt + Ankündigungen beim Start anzeigen + Verbindung zum Ankündigungsanbieter fehlgeschlagen + Verwerfen + + + Loop-Video aktivieren + Video wird wiederholt + Video wird nicht wiederholt + + + Loop-Video-Schaltfläche anzeigen + Schaltfläche wird angezeigt + Schaltfläche wird nicht angezeigt + Loop-Video ist aktiviert + Loop-Video ist deaktiviert + + + + Spoof-Gerätegröße + "Gerätemessungen gefälscht Höhere Videoqualitäten können freigeschaltet werden, aber es kann zu Stottern bei der Videowiedergabe, kürzerer Akkulaufzeit und unbekannten Nebeneffekten kommen" - "Gerätemessungen nicht gefälscht + "Gerätemessungen nicht gefälscht Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet werden" - Aktivieren kann dazu führen, dass Videowiedergabe blockiert, die Batterielebensdauer verschlechtert und unbekannte Nebeneffekte entstehen. - - - Haptisches Feedback - Haptisches Feedback ändern - Kapitelhaptik deaktivieren - Kapitelhaptik ist deaktiviert - Kapitelhaptik ist aktiviert - Präzise Suchhaptik deaktivieren - Die präzise Suchhaptik ist deaktiviert - Präzise Suchhaptik ist aktiviert - Haptik für das Rückgängigmachen der Suche deaktivieren - Die Haptik für das Rückgängigmachen der Suche ist deaktiviert - Die Haptik für das Rückgängigmachen der Suche ist aktiviert - Zoomhaptik deaktivieren - Zoomhaptik ist deaktiviert - Zoomhaptik ist aktiviert - - - Wenn Sie kürzlich Ihre Kontoanmeldedaten geändert haben, deinstallieren Sie MicroG und installieren Sie es erneut. - - - URL-Weiterleitungen umgehen - URL-Umleitungen werden umgangen - URL-Umleitungen werden nicht umgangen - - - Links im Browser öffnen - Links im externen Browser öffnen - Links im In-App-Browser öffnen - - - - Autom - Änderungen der Videoqualität merken - Qualitätsänderungen gelten für alle Videos - Qualitätsänderungen gelten nur für das aktuelle Video - Toast bei Änderungen der Videoqualität anzeigen - Ein Toast wird angezeigt, wenn die Standard-Videoqualität geändert wird - Ein Toast wird nicht angezeigt, wenn die Standard-Videoqualität geändert wird - Standard-Videoqualität im Wi-Fi-Netzwerk - Standard-Videoqualität im Mobilfunknetz - Änderungen der Shorts-Qualität speichern - Qualitätsänderungen gelten für alle Shorts - Qualitätsänderungen gelten nur für den aktuellen Short - Standardmäßige Shorts-Qualität im WLAN - Standard-Shorts-Qualität im Mobilfunknetz - Mobile - WLAN - Standard %1$s Qualität geändert zu: %2$s - Shorts-Qualität von %1$s geändert in: %2$s - - - Zeige Geschwindigkeitsdialog Taste - Schaltfläche für Geschwindigkeitsdialog wird angezeigt. Tippen und halten, um die Wiedergabegeschwindigkeit auf Standard zurückzusetzen. - Schaltfläche für Geschwindigkeitsdialog wird nicht angezeigt - - - Videoqualität-Schaltfläche anzeigen - Schaltfläche für Videoqualität wird angezeigt. Tippen und halten, um die Qualität auf Standard zurückzusetzen. - Schaltfläche für Videoqualität wird nicht angezeigt - - - Benutzerdefiniertes Wiedergabegeschwindigkeitsmenü - Benutzerdefiniertes Geschwindigkeitsmenü wird angezeigt - Benutzerdefiniertes Geschwindigkeitsmenü wird nicht angezeigt - Altes Wiedergabegeschwindigkeitsmenü wiederherstellen - Altes Geschwindigkeitsmenü wird angezeigt - Modernes Geschwindigkeitsmenü wird angezeigt - Benutzerdefinierte Wiedergabegeschwindigkeiten - Hinzufügen oder Ändern der benutzerdefinierten Wiedergabegeschwindigkeit - Benutzerdefinierte Geschwindigkeiten müssen kleiner als %s sein - Ungültige benutzerdefinierte Wiedergabegeschwindigkeiten - Autom - Benutzerdefinierte Geschwindigkeit bei Tippen und Halten - Abspielgeschwindigkeit zwischen 0-8x - - - Änderungen der Wiedergabegeschwindigkeit merken - Änderungen der Wiedergabegeschwindigkeit gelten für alle Videos - Änderungen der Wiedergabegeschwindigkeit gelten nur für das aktuelle Video - Toast bei Änderungen der Wiedergabegeschwindigkeit anzeigen - Ein Toast wird angezeigt, wenn die Standard-Wiedergabegeschwindigkeit geändert wird - Ein Toast wird nicht angezeigt, wenn die Standardwiedergabegeschwindigkeit geändert wird. - Standard Wiedergabegeschwindigkeit - Standardgeschwindigkeit geändert zu: %s - - - Deaktiviere HDR-Video - HDR-Video ist deaktiviert - HDR-Video ist aktiviert - AVC (H.264) erzwingen - Videocodec wird auf AVC (H.264) erzwungen - Videocodec wird automatisch bestimmt - "Vorteile: + Aktivieren kann dazu führen, dass Videowiedergabe blockiert, die Batterielebensdauer verschlechtert und unbekannte Nebeneffekte entstehen. + + + Haptisches Feedback + Haptisches Feedback ändern + Kapitelhaptik deaktivieren + Kapitelhaptik ist deaktiviert + Kapitelhaptik ist aktiviert + Präzise Suchhaptik deaktivieren + Die präzise Suchhaptik ist deaktiviert + Präzise Suchhaptik ist aktiviert + Haptik für das Rückgängigmachen der Suche deaktivieren + Die Haptik für das Rückgängigmachen der Suche ist deaktiviert + Die Haptik für das Rückgängigmachen der Suche ist aktiviert + Zoomhaptik deaktivieren + Zoomhaptik ist deaktiviert + Zoomhaptik ist aktiviert + + + Wenn Sie kürzlich Ihre Kontoanmeldedaten geändert haben, deinstallieren Sie MicroG und installieren Sie es erneut. + + + URL-Weiterleitungen umgehen + URL-Umleitungen werden umgangen + URL-Umleitungen werden nicht umgangen + + + Links im Browser öffnen + Links im externen Browser öffnen + Links im In-App-Browser öffnen + + + + Autom + Änderungen der Videoqualität merken + Qualitätsänderungen gelten für alle Videos + Qualitätsänderungen gelten nur für das aktuelle Video + Toast bei Änderungen der Videoqualität anzeigen + Ein Toast wird angezeigt, wenn die Standard-Videoqualität geändert wird + Ein Toast wird nicht angezeigt, wenn die Standard-Videoqualität geändert wird + Standard-Videoqualität im Wi-Fi-Netzwerk + Standard-Videoqualität im Mobilfunknetz + Änderungen der Shorts-Qualität speichern + Qualitätsänderungen gelten für alle Shorts + Qualitätsänderungen gelten nur für den aktuellen Short + Standardmäßige Shorts-Qualität im WLAN + Standard-Shorts-Qualität im Mobilfunknetz + Mobile + WLAN + Standard %1$s Qualität geändert zu: %2$s + Shorts-Qualität von %1$s geändert in: %2$s + + + Zeige Geschwindigkeitsdialog Taste + Schaltfläche für Geschwindigkeitsdialog wird angezeigt. Tippen und halten, um die Wiedergabegeschwindigkeit auf Standard zurückzusetzen. + Schaltfläche für Geschwindigkeitsdialog wird nicht angezeigt + + + Videoqualität-Schaltfläche anzeigen + Schaltfläche für Videoqualität wird angezeigt. Tippen und halten, um die Qualität auf Standard zurückzusetzen. + Schaltfläche für Videoqualität wird nicht angezeigt + + + Benutzerdefiniertes Wiedergabegeschwindigkeitsmenü + Benutzerdefiniertes Geschwindigkeitsmenü wird angezeigt + Benutzerdefiniertes Geschwindigkeitsmenü wird nicht angezeigt + Altes Wiedergabegeschwindigkeitsmenü wiederherstellen + Altes Geschwindigkeitsmenü wird angezeigt + Modernes Geschwindigkeitsmenü wird angezeigt + Benutzerdefinierte Wiedergabegeschwindigkeiten + Hinzufügen oder Ändern der benutzerdefinierten Wiedergabegeschwindigkeit + Benutzerdefinierte Geschwindigkeiten müssen kleiner als %s sein + Ungültige benutzerdefinierte Wiedergabegeschwindigkeiten + Autom + Benutzerdefinierte Geschwindigkeit bei Tippen und Halten + Abspielgeschwindigkeit zwischen 0-8x + + + Änderungen der Wiedergabegeschwindigkeit merken + Änderungen der Wiedergabegeschwindigkeit gelten für alle Videos + Änderungen der Wiedergabegeschwindigkeit gelten nur für das aktuelle Video + Toast bei Änderungen der Wiedergabegeschwindigkeit anzeigen + Ein Toast wird angezeigt, wenn die Standard-Wiedergabegeschwindigkeit geändert wird + Ein Toast wird nicht angezeigt, wenn die Standardwiedergabegeschwindigkeit geändert wird. + Standard Wiedergabegeschwindigkeit + Standardgeschwindigkeit geändert zu: %s + + + Deaktiviere HDR-Video + HDR-Video ist deaktiviert + HDR-Video ist aktiviert + AVC (H.264) erzwingen + Videocodec wird auf AVC (H.264) erzwungen + Videocodec wird automatisch bestimmt + "Vorteile: • Kann die Akkulaufzeit verbessern • Kann fehlende Videoauflösungen auf älteren Geräten wiederherstellen @@ -1626,178 +1623,177 @@ Einschränkungen: • Die Videowiedergabe verbraucht mehr Internetdaten als VP9 oder AV1 • HDR-Videos verwenden kein AVC • Einige Geräte können AVC nicht erzwingen" - - - Erweitertes Videoqualitätsmenü anzeigen - Erweitertes Videoqualitätsmenü wird angezeigt - Erweitertes Videoqualitätsmenü wird nicht angezeigt - - - Folie zum Suchen aktivieren - Slide zum Suchen ist aktiviert - Slide zum Suchen ist nicht aktiviert - - - Android VR AV1 zulassen - "Video-Codec ist AVC (H.264), VP9 oder AV1 + + + Erweitertes Videoqualitätsmenü anzeigen + Erweitertes Videoqualitätsmenü wird angezeigt + Erweitertes Videoqualitätsmenü wird nicht angezeigt + + + Folie zum Suchen aktivieren + Slide zum Suchen ist aktiviert + Slide zum Suchen ist nicht aktiviert + + + Android VR AV1 zulassen + "Video-Codec ist AVC (H.264), VP9 oder AV1 Die Wiedergabe kann stottern oder Frames verlieren" - Video-Codec ist AVC (H.264) oder VP9 - "Durch Aktivierung dieser Einstellung kann Software-AV1-Decodierung verwendet werden. + Video-Codec ist AVC (H.264) oder VP9 + "Durch Aktivierung dieser Einstellung kann Software-AV1-Decodierung verwendet werden. Die Videowiedergabe mit AV1 kann stottern oder Bilder überspringen." - Nebenwirkungen des Spoofings - • Experimenteller Client und kann jederzeit aufhören zu funktionieren - • Video kann um 1:00 Uhr stoppen oder ist möglicherweise in einigen Regionen nicht verfügbar - • Audiotrack-Menü fehlt - • Kein AV1-Videocodec - • Stabile Lautstärke ist nicht verfügbar - • Kinder-Videos werden möglicherweise nicht abgespielt, wenn du abgemeldet bist oder den Inkognito-Modus verwendest. - - • Originalton erzwingen ist nicht verfügbar - In Statistiken für Nerds anzeigen - Der Client-Typ wird in den Statistiken für Nerds angezeigt - Der Client wird in den Statistiken für Nerds ausgeblendet - - - - - - - Über - Werbung - Allgemein - Spieler - Sonstiges - - - Videoanzeigen ausblenden - Videoanzeigen sind ausgeblendet - Videoanzeigen werden angezeigt - - - Dauerwiederholung aktivieren - Dauerwiederholung ist aktiviert - Dauerwiederholung ist deaktiviert - - - Übertragen-Taste ausblenden - Übertragen-Taste ist ausgeblendet - Übertragen-Taste wird angezeigt - Verlauf-Schaltfläche ausblenden - Verlauf-Schaltfläche ist ausgeblendet - Verlauf-Schaltfläche wird angezeigt - Benachrichtigungsschaltfläche ausblenden - Benachrichtigungsschaltfläche wird ausgeblendet - Benachrichtigungsschaltfläche wird angezeigt - Suchschaltfläche ausblenden - Suchschaltfläche wird ausgeblendet - Suchschaltfläche wird angezeigt - - - Kategorieleiste ausblenden - Kategorieleiste ist ausgeblendet - Kategorieleiste wird angezeigt - - - Miniplayer-Farbe ändern - Miniplayer-Farbe entspricht dem Vollbild-Player - Miniplayer verwendet Standardfarbe - - - Navigationsleiste - Navigationsleisten-Schaltflächen ausblenden oder ändern - - Startseite ausblenden - Start-Schaltfläche ist ausgeblendet - Start-Schaltfläche wird angezeigt - - Kurzvideos ausblenden - Samples-Schaltfläche ist ausgeblendet - Samples-Schaltfläche wird angezeigt - - Erkunden ausblenden - Entdecken-Schaltfläche ist ausgeblendet - Entdecken-Schaltfläche wird angezeigt - - Mediathek ausblenden - Mediathek-Schaltfläche ist ausgeblendet - Mediathek-Schaltfläche wird angezeigt - - Upgrade ausblenden - Upgrade-Schaltfläche ist ausgeblendet - Upgrade-Schaltfläche wird angezeigt - Navigationsleiste ausblenden - Navigationsleiste ist ausgeblendet - Navigationsleiste wird angezeigt - Beschriftungen der Navigationsschaltflächen ausblenden - Beschriftungen sind ausgeblendet - Beschriftungen werden angezeigt - - - \"Music Premium holen\"-Label ausblenden - Label ist ausgeblendet - Label wird angezeigt - - - Upgrade-Button ausblenden - Button ist ausgeblendet - Button wird angezeigt - - - - - Audio-Werbung blockieren - Audiowerbung ist gesperrt - Audiowerbung ist entsperrt - - - %s nicht verfügbar, Werbung wird möglicherweise angezeigt. Versuchen Sie, den Werbesperrdienst in den Einstellungen zu ändern. - %s hat einen Fehler zurückgegeben, Werbung wird möglicherweise angezeigt. Versuchen Sie, den Werbesperrdienst in den Einstellungen zu ändern. - Blockiere eingebettete Video-Anzeigen - Deaktiviert - Leuchtender Proxy - PurpleAdBlock Proxy - - - Videowerbung blockieren - Videowerbung ist gesperrt - Video-Anzeigen sind entsperrt - - - Nachricht gelöscht - Gelöschte Nachrichten anzeigen - Gelöschte Nachrichten nicht anzeigen - Gelöschte Nachrichten hinter einem Spoiler ausblenden - Gelöschte Nachrichten als überschneidenden Text anzeigen - - - Kanalpunkte automatisch beanspruchen - Kanalpunkte werden automatisch abgeholt - Kanalpunkte werden nicht automatisch abgeholt - - - - Twitch-Debug-Modus aktivieren - Twitch-Debug-Modus ist aktiviert (nicht empfohlen) - Twitch-Debug-Modus ist deaktiviert - - - Verbesserte Einstellungen - Über - Über ReVanced - Werbeblocker - Werbeblocker-Einstellungen - Chat-Einstellungen - Sonstiges - Verschiedene Einstellungen - Allgemeine Einstellungen - Andere Einstellungen - Client-seitige Werbung - Serverseitige surestream Anzeigen - Debug-Logging - Debug-Logs sind aktiviert - Debug-Logs sind deaktiviert - - + Nebenwirkungen des Spoofings + • Experimenteller Client und kann jederzeit aufhören zu funktionieren + • Video kann um 1:00 Uhr stoppen oder ist möglicherweise in einigen Regionen nicht verfügbar + • Audiotrack-Menü fehlt + • Kein AV1-Videocodec + • Stabile Lautstärke ist nicht verfügbar + • Kinder-Videos werden möglicherweise nicht abgespielt, wenn du abgemeldet bist oder den Inkognito-Modus verwendest. + + • Originalton erzwingen ist nicht verfügbar + In Statistiken für Nerds anzeigen + Der Client-Typ wird in den Statistiken für Nerds angezeigt + Der Client wird in den Statistiken für Nerds ausgeblendet + + + + + + Über + Werbung + Allgemein + Spieler + Sonstiges + + + Videoanzeigen ausblenden + Videoanzeigen sind ausgeblendet + Videoanzeigen werden angezeigt + + + Dauerwiederholung aktivieren + Dauerwiederholung ist aktiviert + Dauerwiederholung ist deaktiviert + + + Übertragen-Taste ausblenden + Übertragen-Taste ist ausgeblendet + Übertragen-Taste wird angezeigt + Verlauf-Schaltfläche ausblenden + Verlauf-Schaltfläche ist ausgeblendet + Verlauf-Schaltfläche wird angezeigt + Benachrichtigungsschaltfläche ausblenden + Benachrichtigungsschaltfläche wird ausgeblendet + Benachrichtigungsschaltfläche wird angezeigt + Suchschaltfläche ausblenden + Suchschaltfläche wird ausgeblendet + Suchschaltfläche wird angezeigt + + + Kategorieleiste ausblenden + Kategorieleiste ist ausgeblendet + Kategorieleiste wird angezeigt + + + Miniplayer-Farbe ändern + Miniplayer-Farbe entspricht dem Vollbild-Player + Miniplayer verwendet Standardfarbe + + + Navigationsleiste + Navigationsleisten-Schaltflächen ausblenden oder ändern + + Startseite ausblenden + Start-Schaltfläche ist ausgeblendet + Start-Schaltfläche wird angezeigt + + Kurzvideos ausblenden + Samples-Schaltfläche ist ausgeblendet + Samples-Schaltfläche wird angezeigt + + Erkunden ausblenden + Entdecken-Schaltfläche ist ausgeblendet + Entdecken-Schaltfläche wird angezeigt + + Mediathek ausblenden + Mediathek-Schaltfläche ist ausgeblendet + Mediathek-Schaltfläche wird angezeigt + + Upgrade ausblenden + Upgrade-Schaltfläche ist ausgeblendet + Upgrade-Schaltfläche wird angezeigt + Navigationsleiste ausblenden + Navigationsleiste ist ausgeblendet + Navigationsleiste wird angezeigt + Beschriftungen der Navigationsschaltflächen ausblenden + Beschriftungen sind ausgeblendet + Beschriftungen werden angezeigt + + + \"Music Premium holen\"-Label ausblenden + Label ist ausgeblendet + Label wird angezeigt + + + Upgrade-Button ausblenden + Button ist ausgeblendet + Button wird angezeigt + + + + + Audio-Werbung blockieren + Audiowerbung ist gesperrt + Audiowerbung ist entsperrt + + + %s nicht verfügbar, Werbung wird möglicherweise angezeigt. Versuchen Sie, den Werbesperrdienst in den Einstellungen zu ändern. + %s hat einen Fehler zurückgegeben, Werbung wird möglicherweise angezeigt. Versuchen Sie, den Werbesperrdienst in den Einstellungen zu ändern. + Blockiere eingebettete Video-Anzeigen + Deaktiviert + Leuchtender Proxy + PurpleAdBlock Proxy + + + Videowerbung blockieren + Videowerbung ist gesperrt + Video-Anzeigen sind entsperrt + + + Nachricht gelöscht + Gelöschte Nachrichten anzeigen + Gelöschte Nachrichten nicht anzeigen + Gelöschte Nachrichten hinter einem Spoiler ausblenden + Gelöschte Nachrichten als überschneidenden Text anzeigen + + + Kanalpunkte automatisch beanspruchen + Kanalpunkte werden automatisch abgeholt + Kanalpunkte werden nicht automatisch abgeholt + + + + Twitch-Debug-Modus aktivieren + Twitch-Debug-Modus ist aktiviert (nicht empfohlen) + Twitch-Debug-Modus ist deaktiviert + + + Verbesserte Einstellungen + Über + Über ReVanced + Werbeblocker + Werbeblocker-Einstellungen + Chat-Einstellungen + Sonstiges + Verschiedene Einstellungen + Allgemeine Einstellungen + Andere Einstellungen + Client-seitige Werbung + Serverseitige surestream Anzeigen + Debug-Logging + Debug-Logs sind aktiviert + Debug-Logs sind deaktiviert + + diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index a68bff4e18..8bca06358a 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -17,239 +17,238 @@ "First 'item' text Second \"item\" text" ---> - - - - Όνομα εφαρμογής - - Προσαρμοσμένο - Εικονίδιο εφαρμογής - Αρχικό - ReVanced - - ReVanced απλό - ReVanced κλιμακωμένο - - Προσαρμοσμένο - - - Αποτυχία ελέγχων - Άνοιγμα επίσημης ιστοσελίδας - Παράλειψη - <h5>Αυτή η εφαρμογή δεν φαίνεται να έχει τροποποιηθεί από εσάς.</h5><br>Η εφαρμογή μπορεί να μη λειτουργεί σωστά, <b>θα μπορούσε να είναι επιβλαβής ή ακόμα και επικίνδυνη για χρήση</b>.<br><br>Αυτοί οι έλεγχοι υποδηλώνουν ότι αυτή η εφαρμογή έχει τροποποιηθεί στο παρελθόν ή λήφθηκε από κάποιον άλλο:<br><br><small>%1$s</small><br>Συνιστάται έντονα να απεγκαταστήσετε την εφαρμογή <br>και να την τροποποιήσετε μόνοι σας<br> για να διασφαλίσετε ότι χρησιμοποιείτε μια επικυρωμένη και ασφαλή εφαρμογή.<p><br>Εάν αγνοηθεί, αυτή η προειδοποίηση θα εμφανιστεί μόνο δύο φορές. - Τροποποιήθηκε σε διαφορετική συσκευή - Δεν έχει εγκατασταθεί μέσω του ReVanced Manager - Τροποποιήθηκε πάνω από 10 λεπτά πριν - Τροποποιήθηκε πριν %s μέρες - Η ημερομηνία κατασκευής του APK είναι κατεστραμμένη - - - Ειδοποίηση ReVanced - Το ιστορικό παρακολούθησης δεν αποθηκεύεται.<br><br>Πιθανό να συμβαίνει λόγω αποκλεισμού διαφημίσεων μέσω DNS ή μέσω διακομιστή μεσολάβησης δικτύου.<br><br>Μια λύση γι\'αυτό θα ήταν να προσθέσετε σε whitelist το <b>s.youtube.com</b> ή να απενεργοποιήστε τους DNS/proxy blockers. - Να μην εμφανιστεί ξανά - - - Ρυθμίσεις - ReVanced - Είστε βέβαιοι ότι θέλετε να συνεχίσετε; - Αποθήκευση - Επαναφορά - Επαναφορά χρώματος - Μη έγκυρο χρώμα - Απαιτείται επανεκκίνηση - Επανεκκινήστε την εφαρμογή για να εφαρμοστεί αυτή η αλλαγή. - Επανεκκίνηση - Εισαγωγή - Αντιγραφή - Επαναφέρθηκαν οι προεπιλεγμένες ρυθμίσεις ReVanced - Έγινε εισαγωγή %d ρυθμίσεων - Η εισαγωγή απέτυχε: %s - Αναζήτηση ρυθμίσεων - Δεν βρέθηκαν αποτελέσματα για \'%s\' - Δοκιμάστε άλλη λέξη-κλειδί - Πρόσφατες αναζητήσεις - Κατάργηση από το ιστορικό αναζήτησης; - Εκκαθάριση ιστορικού αναζήτησης - Είστε βέβαιοι ότι θέλετε να εκκαθαρίσετε όλο το ιστορικό αναζήτησης; - Συμβουλές Αναζήτησης - "• Πατήστε μια διαδρομή για να μεταβείτε σε αυτήν +--> + + + Όνομα εφαρμογής + + Προσαρμοσμένο + Εικονίδιο εφαρμογής + Αρχικό + ReVanced + + ReVanced απλό + ReVanced κλιμακωμένο + + Προσαρμοσμένο + + + Αποτυχία ελέγχων + Άνοιγμα επίσημης ιστοσελίδας + Παράλειψη + <h5>Αυτή η εφαρμογή δεν φαίνεται να έχει τροποποιηθεί από εσάς.</h5><br>Η εφαρμογή μπορεί να μη λειτουργεί σωστά, <b>θα μπορούσε να είναι επιβλαβής ή ακόμα και επικίνδυνη για χρήση</b>.<br><br>Αυτοί οι έλεγχοι υποδηλώνουν ότι αυτή η εφαρμογή έχει τροποποιηθεί στο παρελθόν ή λήφθηκε από κάποιον άλλο:<br><br><small>%1$s</small><br>Συνιστάται έντονα να απεγκαταστήσετε την εφαρμογή <br>και να την τροποποιήσετε μόνοι σας<br> για να διασφαλίσετε ότι χρησιμοποιείτε μια επικυρωμένη και ασφαλή εφαρμογή.<p><br>Εάν αγνοηθεί, αυτή η προειδοποίηση θα εμφανιστεί μόνο δύο φορές. + Τροποποιήθηκε σε διαφορετική συσκευή + Δεν έχει εγκατασταθεί μέσω του ReVanced Manager + Τροποποιήθηκε πάνω από 10 λεπτά πριν + Τροποποιήθηκε πριν %s μέρες + Η ημερομηνία κατασκευής του APK είναι κατεστραμμένη + + + Ειδοποίηση ReVanced + Το ιστορικό παρακολούθησης δεν αποθηκεύεται.<br><br>Πιθανό να συμβαίνει λόγω αποκλεισμού διαφημίσεων μέσω DNS ή μέσω διακομιστή μεσολάβησης δικτύου.<br><br>Μια λύση γι\'αυτό θα ήταν να προσθέσετε σε whitelist το <b>s.youtube.com</b> ή να απενεργοποιήστε τους DNS/proxy blockers. + Να μην εμφανιστεί ξανά + + + Ρυθμίσεις + ReVanced + Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + Αποθήκευση + Επαναφορά + Επαναφορά χρώματος + Μη έγκυρο χρώμα + Απαιτείται επανεκκίνηση + Επανεκκινήστε την εφαρμογή για να εφαρμοστεί αυτή η αλλαγή. + Επανεκκίνηση + Εισαγωγή + Αντιγραφή + Επαναφέρθηκαν οι προεπιλεγμένες ρυθμίσεις ReVanced + Έγινε εισαγωγή %d ρυθμίσεων + Η εισαγωγή απέτυχε: %s + Αναζήτηση ρυθμίσεων + Δεν βρέθηκαν αποτελέσματα για \'%s\' + Δοκιμάστε άλλη λέξη-κλειδί + Πρόσφατες αναζητήσεις + Κατάργηση από το ιστορικό αναζήτησης; + Εκκαθάριση ιστορικού αναζήτησης + Είστε βέβαιοι ότι θέλετε να εκκαθαρίσετε όλο το ιστορικό αναζήτησης; + Συμβουλές Αναζήτησης + "• Πατήστε μια διαδρομή για να μεταβείτε σε αυτήν • Πατήστε παρατεταμένα μια ρύθμιση για να μεταβείτε σε αυτήν • Πατήστε Enter για να αποθηκεύσετε ένα ερώτημα αναζήτησης στο ιστορικό • Η αναζήτηση αγνοεί πεζά/κεφαλαία και σημεία στίξης • Οι γονικές ρυθμίσεις εμφανίζονται πάνω από τις απενεργοποιημένες θυγατρικές ρυθμίσεις" - Το ιστορικό αναζήτησης είναι κενό - Για να αποθηκεύσετε το ιστορικό αναζήτησης, πληκτρολογήστε ένα ερώτημα αναζήτησης και πατήστε Enter - Εμφάνιση ιστορικού αναζήτησης ρυθμίσεων - Το ιστορικό αναζήτησης ρυθμίσεων εμφανίζεται - Το ιστορικό αναζήτησης ρυθμίσεων δεν εμφανίζεται - Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced - Τα εικονίδια ρυθμίσεων εμφανίζονται - Τα εικονίδια ρυθμίσεων δεν εμφανίζονται - Γλώσσα ρυθμίσεων ReVanced - "Οι μεταφράσεις για κάποιες γλώσσες ενδέχεται να λείπουν ή να είναι ελλιπείς. + Το ιστορικό αναζήτησης είναι κενό + Για να αποθηκεύσετε το ιστορικό αναζήτησης, πληκτρολογήστε ένα ερώτημα αναζήτησης και πατήστε Enter + Εμφάνιση ιστορικού αναζήτησης ρυθμίσεων + Το ιστορικό αναζήτησης ρυθμίσεων εμφανίζεται + Το ιστορικό αναζήτησης ρυθμίσεων δεν εμφανίζεται + Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced + Τα εικονίδια ρυθμίσεων εμφανίζονται + Τα εικονίδια ρυθμίσεων δεν εμφανίζονται + Γλώσσα ρυθμίσεων ReVanced + "Οι μεταφράσεις για κάποιες γλώσσες ενδέχεται να λείπουν ή να είναι ελλιπείς. Για να μεταφράσετε σε νέες γλώσσες ή να βελτιώσετε τις υπάρχουσες μεταφράσεις, επισκεφθείτε τη διεύθυνση translate.revanced.app" - Γλώσσα εφαρμογής - Εισαγωγή / Εξαγωγή - Εισαγωγή / Εξαγωγή ρυθμίσεων ReVanced - - Χρησιμοποιείτε τις τροποποιήσεις ReVanced έκδοσης <i>%s</i> - Σημείωση - Αυτή η έκδοση είναι σε πρώιμο στάδιο, επομένως πιθανότατα να αντιμετωπίσετε απρόοπτα προβλήματα - Επίσημοι σύνδεσμοι - + Χρησιμοποιείτε τις τροποποιήσεις ReVanced έκδοσης <i>%s</i> + Σημείωση + Αυτή η έκδοση είναι σε πρώιμο στάδιο, επομένως πιθανότατα να αντιμετωπίσετε απρόοπτα προβλήματα + Επίσημοι σύνδεσμοι + - - - Ρυθμίσεις GmsCore - Ρυθμίσεις για το MicroG GmsCore - - Το MicroG GmsCore δεν έχει εγκατασταθεί. Εγκαταστήστε το. - Απαιτείται ενέργεια - "Το MicroG GmsCore δεν έχει άδεια να εκτελείται στο παρασκήνιο. + + + Ρυθμίσεις GmsCore + Ρυθμίσεις για το MicroG GmsCore + + Το MicroG GmsCore δεν έχει εγκατασταθεί. Εγκαταστήστε το. + Απαιτείται ενέργεια + "Το MicroG GmsCore δεν έχει άδεια να εκτελείται στο παρασκήνιο. Ακολουθήστε τον οδηγό \"Don't kill my app\" για το τηλέφωνό σας και εφαρμόστε τις οδηγίες στο MicroG. Αυτό είναι απαραίτητο για τη σωστή λειτουργία της εφαρμογής." - Άνοιγμα ιστοσελίδας - "Οι βελτιστοποιήσεις μπαταρίας πρέπει να απενεργοποιηθούν για το MicroG GmsCore ώστε να αποφευχθούν προβλήματα. + Άνοιγμα ιστοσελίδας + "Οι βελτιστοποιήσεις μπαταρίας πρέπει να απενεργοποιηθούν για το MicroG GmsCore ώστε να αποφευχθούν προβλήματα. Η απενεργοποίηση των βελτιστοποιήσεων μπαταρίας για το MicroG δεν θα επηρεάσει αρνητικά την κατανάλωση ενέργειας. Πατήστε το κουμπί «Συνέχεια» και επιτρέψτε τις αλλαγές βελτιστοποίησης." - Συνέχεια - - - Παραποίηση ροών βίντεο - Παραποίηση ροών βίντεο του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής - Παραποίηση ροών βίντεο - Παραποίηση ροών βίντεο του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής - Παραποίηση ροών βίντεο - "Οι ροές βίντεο παραποιούνται + Συνέχεια + + + Παραποίηση ροών βίντεο + Παραποίηση ροών βίντεο του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής + Παραποίηση ροών βίντεο + Παραποίηση ροών βίντεο του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής + Παραποίηση ροών βίντεο + "Οι ροές βίντεο παραποιούνται Αν είστε χρήστης YouTube Premium, αυτή η ρύθμιση μπορεί να μην απαιτείται" - "Οι ροές βίντεο δεν παραποιούνται + "Οι ροές βίντεο δεν παραποιούνται Η αναπαραγωγή ενδέχεται να μην λειτουργεί" - Η απενεργοποίηση αυτής της ρύθμισης ενδέχεται να προκαλέσει προβλήματα αναπαραγωγής. - Προεπιλεγμένο πρόγραμμα πελάτη - - - Εξαναγκασμός αρχικής γλώσσας ήχου - Χρησιμοποιείται η αρχική γλώσσα ήχου - Χρησιμοποιείται ο προεπιλεγμένος ήχος - - Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε οποιονδήποτε πελάτη εκτός από το Android Studio - - - Εντοπισμός σφαλμάτων - Ενεργοποίηση ή απενεργοποίηση επιλογών εντοπισμού σφαλμάτων - Καταγραφή εντοπισμού σφαλμάτων - Η καταγραφή εντοπισμού σφαλμάτων είναι ενεργοποιημένη - Η καταγραφή εντοπισμού σφαλμάτων είναι απενεργοποιημένη - Καταγραφή ιχνών στοίβας - Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν ίχνη στοίβας - Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν ίχνη στοίβας - Εμφάνιση μηνυμάτων σφαλμάτων ReVanced - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν προκύψει σφάλμα - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν προκύψει σφάλμα - "Η απενεργοποίηση των μηνυμάτων σφαλμάτων κρύβει όλες τις ειδοποιήσεις σφαλμάτων που αφορούν το ReVanced. + Η απενεργοποίηση αυτής της ρύθμισης ενδέχεται να προκαλέσει προβλήματα αναπαραγωγής. + Προεπιλεγμένο πρόγραμμα πελάτη + + + Εξαναγκασμός αρχικής γλώσσας ήχου + Χρησιμοποιείται η αρχική γλώσσα ήχου + Χρησιμοποιείται ο προεπιλεγμένος ήχος + + Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε οποιονδήποτε πελάτη εκτός από το Android Studio + + + Εντοπισμός σφαλμάτων + Ενεργοποίηση ή απενεργοποίηση επιλογών εντοπισμού σφαλμάτων + Καταγραφή εντοπισμού σφαλμάτων + Η καταγραφή εντοπισμού σφαλμάτων είναι ενεργοποιημένη + Η καταγραφή εντοπισμού σφαλμάτων είναι απενεργοποιημένη + Καταγραφή ιχνών στοίβας + Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν ίχνη στοίβας + Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν ίχνη στοίβας + Εμφάνιση μηνυμάτων σφαλμάτων ReVanced + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν προκύψει σφάλμα + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν προκύψει σφάλμα + "Η απενεργοποίηση των μηνυμάτων σφαλμάτων κρύβει όλες τις ειδοποιήσεις σφαλμάτων που αφορούν το ReVanced. Δεν θα ειδοποιηθείτε για τυχόν απρόβλεπτα γεγονότα." - Εξαγωγή αρχείων καταγραφής εντοπισμού σφαλμάτων - Αντιγραφή των αρχείων καταγραφής εντοπισμού σφαλμάτων ReVanced στο πρόχειρο - Η καταγραφή εντοπισμού σφαλμάτων είναι απενεργοποιημένη - Δεν βρέθηκαν αρχεία καταγραφής - Τα αρχεία καταγραφής αντιγράφηκαν - Αποτυχία εξαγωγής αρχείων καταγραφής: %s - Εκκαθάριση αρχείων καταγραφής εντοπισμού σφαλμάτων - Εκκαθάριση όλων των αποθηκευμένων αρχειών καταγραφής εντοπισμού σφαλμάτων ReVanced - Τα αρχεία καταγραφής εκκαθαρίστηκαν - Διαχειριστής σημαιών λειτουργιών - Διαχείριση των boolean σημαιών λειτουργιών - Ενεργές σημαίες (%d) - Αποκλεισμένες σημαίες (%d) - Αναζήτηση σημαιών... - Οι σημαίες αποθηκεύτηκαν - Οι σημαίες επαναφέρθηκαν - Οι σημαίες αντιγράφηκαν στο πρόχειρο - Καταγραφή του buffer πρωτοκόλλου - Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν το buffer του πρωτοκόλλου - Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν τον buffer πρωτοκόλλου - "Η ενεργοποίηση αυτής της ρύθμισης θα καταγράψει επιπλέον δεδομένα διάταξης, συμπεριλαμβανομένου του κειμένου στην οθόνη για ορισμένα στοιχεία διεπαφής χρήστη. + Εξαγωγή αρχείων καταγραφής εντοπισμού σφαλμάτων + Αντιγραφή των αρχείων καταγραφής εντοπισμού σφαλμάτων ReVanced στο πρόχειρο + Η καταγραφή εντοπισμού σφαλμάτων είναι απενεργοποιημένη + Δεν βρέθηκαν αρχεία καταγραφής + Τα αρχεία καταγραφής αντιγράφηκαν + Αποτυχία εξαγωγής αρχείων καταγραφής: %s + Εκκαθάριση αρχείων καταγραφής εντοπισμού σφαλμάτων + Εκκαθάριση όλων των αποθηκευμένων αρχειών καταγραφής εντοπισμού σφαλμάτων ReVanced + Τα αρχεία καταγραφής εκκαθαρίστηκαν + Διαχειριστής σημαιών λειτουργιών + Διαχείριση των boolean σημαιών λειτουργιών + Ενεργές σημαίες (%d) + Αποκλεισμένες σημαίες (%d) + Αναζήτηση σημαιών... + Οι σημαίες αποθηκεύτηκαν + Οι σημαίες επαναφέρθηκαν + Οι σημαίες αντιγράφηκαν στο πρόχειρο + Καταγραφή του buffer πρωτοκόλλου + Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν το buffer του πρωτοκόλλου + Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν τον buffer πρωτοκόλλου + "Η ενεργοποίηση αυτής της ρύθμισης θα καταγράψει επιπλέον δεδομένα διάταξης, συμπεριλαμβανομένου του κειμένου στην οθόνη για ορισμένα στοιχεία διεπαφής χρήστη. Αυτό μπορεί να βοηθήσει στον εντοπισμό στοιχείων κατά τη δημιουργία προσαρμοσμένων φίλτρων. Ωστόσο, η ενεργοποίηση αυτής της ρύθμισης θα καταγράψει επίσης ορισμένα δεδομένα χρήστη, όπως τη διεύθυνση IP σας." - - - Καθαρισμός συνδέσμων κοινοποίησης - Η παράμετρος παρακολούθησης αφαιρείται από τους συνδέσμους κατά την κοινοποίηση - Η παράμετρος παρακολούθησης δεν αφαιρείται από τους συνδέσμους κατά την κοινοποίηση - Αλλαγή συνδέσμων κοινοποίησης σε youtube.com - Οι κοινοποιημένοι σύνδεσμοι χρησιμοποιούν το youtube.com - Οι κοινοποιημένοι σύνδεσμοι χρησιμοποιούν το music.youtube.com - - - Προσαρμοσμένο φίλτρο - Απόκρυψη στοιχείων χρησιμοποιώντας προσαρμοσμένα φίλτρα - Χρήση προσαρμοσμένου φίλτρου - Το προσαρμοσμένο φίλτρο είναι ενεργοποιημένο - Το προσαρμοσμένο φίλτρο είναι απενεργοποιημένο - Προσαρμοσμένο φίλτρο - - Λίστα από συμβολοσειρές στοιχείων για φιλτράρισμα, διαχωρισμένες σε νέες γραμμές - Μη έγκυρο προσαρμοσμένο φίλτρο: %s - - - - - Σχετικά με - Διαφημίσεις - Εναλλακτικές μικρογραφίες - Ροή - Γενικά - Οθόνη αναπαραγωγής - Shorts - Γραμμή προόδου - Έλεγχος με σάρωση οθόνης - Return YouΤube Dislike - Διάφορα - Βίντεο - Επαναφορά παλιών μενού ρυθμίσεων - Τα παλιά μενού ρυθμίσεων εμφανίζονται - Τα νέα μενού ρυθμίσεων εμφανίζονται - - - Απενεργοποίηση αναπαραγωγής παρασκηνίου για τα Shorts - Η αναπαραγωγή παρασκηνίου είναι απενεργοποιημένη για τα Shorts - Η αναπαραγωγή παρασκηνίου είναι ενεργοποιημένη για τα Shorts - - - Κάρτες άλμπουμ - Κρυμμένες - Εμφανίζονται - Κάρτες καλλιτεχνών - Κρυμμένες - Εμφανίζονται - Ενότητα σχετιζόμενων λέξεων - Κρυμμένη - Εμφανίζεται - Δημοσιεύσεις κοινότητας - Κρυμμένες - Εμφανίζονται - Αναγγελίες κάτω από τα βίντεο - Κρυμμένες - Εμφανίζονται - Επεκτάσιμο πλαίσιο κάτω από τα βίντεο - Κρυμμένο - Εμφανίζεται - Αιωρούμενο κουμπί μικροφώνου στην αναζήτηση - Κρυμμένο - Εμφανίζεται - Οριζόντιες ενότητες προτάσεων - "Κρυμμένες + + + Καθαρισμός συνδέσμων κοινοποίησης + Η παράμετρος παρακολούθησης αφαιρείται από τους συνδέσμους κατά την κοινοποίηση + Η παράμετρος παρακολούθησης δεν αφαιρείται από τους συνδέσμους κατά την κοινοποίηση + Αλλαγή συνδέσμων κοινοποίησης σε youtube.com + Οι κοινοποιημένοι σύνδεσμοι χρησιμοποιούν το youtube.com + Οι κοινοποιημένοι σύνδεσμοι χρησιμοποιούν το music.youtube.com + + + Προσαρμοσμένο φίλτρο + Απόκρυψη στοιχείων χρησιμοποιώντας προσαρμοσμένα φίλτρα + Χρήση προσαρμοσμένου φίλτρου + Το προσαρμοσμένο φίλτρο είναι ενεργοποιημένο + Το προσαρμοσμένο φίλτρο είναι απενεργοποιημένο + Προσαρμοσμένο φίλτρο + + Λίστα από συμβολοσειρές στοιχείων για φιλτράρισμα, διαχωρισμένες σε νέες γραμμές + Μη έγκυρο προσαρμοσμένο φίλτρο: %s + + + + + Σχετικά με + Διαφημίσεις + Εναλλακτικές μικρογραφίες + Ροή + Γενικά + Οθόνη αναπαραγωγής + Shorts + Γραμμή προόδου + Έλεγχος με σάρωση οθόνης + Return YouΤube Dislike + Διάφορα + Βίντεο + Επαναφορά παλιών μενού ρυθμίσεων + Τα παλιά μενού ρυθμίσεων εμφανίζονται + Τα νέα μενού ρυθμίσεων εμφανίζονται + + + Απενεργοποίηση αναπαραγωγής παρασκηνίου για τα Shorts + Η αναπαραγωγή παρασκηνίου είναι απενεργοποιημένη για τα Shorts + Η αναπαραγωγή παρασκηνίου είναι ενεργοποιημένη για τα Shorts + + + Κάρτες άλμπουμ + Κρυμμένες + Εμφανίζονται + Κάρτες καλλιτεχνών + Κρυμμένες + Εμφανίζονται + Ενότητα σχετιζόμενων λέξεων + Κρυμμένη + Εμφανίζεται + Δημοσιεύσεις κοινότητας + Κρυμμένες + Εμφανίζονται + Αναγγελίες κάτω από τα βίντεο + Κρυμμένες + Εμφανίζονται + Επεκτάσιμο πλαίσιο κάτω από τα βίντεο + Κρυμμένο + Εμφανίζεται + Αιωρούμενο κουμπί μικροφώνου στην αναζήτηση + Κρυμμένο + Εμφανίζεται + Οριζόντιες ενότητες προτάσεων + "Κρυμμένες Αφορά τις οριζόντιες ενότητες προτάσεων, όπως: • Έκτακτη είδηση @@ -258,1033 +257,1033 @@ Second \"item\" text" • Πιο σχετικά • Shopping • Παρακολούθηση ξανά" - Εμφανίζονται - Ενότητα εικόνων στα αποτελέσματα αναζήτησης - Κρυμμένη - Εμφανίζεται - Τελευταίες δημοσιεύσεις - Κρυμμένες - Εμφανίζονται - Λίστες αναπαραγωγής μίξης - Κρυμμένες - Εμφανίζονται - Ενότητα ταινιών - Κρυμμένη - Εμφανίζεται - - Κουμπί «Να λαμβάνω ειδοποιήσεις» - Κρυμμένο - Εμφανίζεται - Παιχνίδια YouTube - Κρυμμένα - Εμφανίζονται - - Κουμπί «Εμφάνιση περισσότερων» - Κρυμμένο\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης - Εμφανίζεται\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης - Έρευνες - Κρυμμένες - Εμφανίζονται - Ενότητα εισιτηρίων - Κρυμμένη - Εμφανίζεται - - Ετικέτες προτάσεων βίντεο - Κρυμμένες\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης - Εμφανίζονται\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης - Οπτικό διαχωριστικό - Κρυμμένο - Εμφανίζεται - - YouTube Doodles - Κρυμμένα\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο - Εμφανίζεται\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο - "Τα YouTube Doodles εμφανίζονται για μερικές μέρες κάθε χρόνο. + Κουμπί «Εμφάνιση περισσότερων» + Κρυμμένο\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης + Εμφανίζεται\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης + Έρευνες + Κρυμμένες + Εμφανίζονται + Ενότητα εισιτηρίων + Κρυμμένη + Εμφανίζεται + + Ετικέτες προτάσεων βίντεο + Κρυμμένες\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης + Εμφανίζονται\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης + Οπτικό διαχωριστικό + Κρυμμένο + Εμφανίζεται + + YouTube Doodles + Κρυμμένα\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο + Εμφανίζεται\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο + "Τα YouTube Doodles εμφανίζονται για μερικές μέρες κάθε χρόνο. Αν ένα YouTube Doodle εμφανίζεται αυτή τη στιγμή στην περιοχή σας και αυτή η ρύθμιση είναι ενεργοποιημένη, τότε η γραμμή φίλτρων κάτω από τη γραμμή αναζήτησης θα είναι κρυμμένη επίσης." - Γραμμή καναλιού - Κρυμμένη - Εμφανίζεται - Υδατογράφημα καναλιού - Κρυμμένο - Εμφανίζεται - Πλαίσιο δωρεών - Κρυμμένο - Εμφανίζεται - Πλαίσια έκτακτης ανάγκης - Κρυμμένα - Εμφανίζονται - Πάνελ πληροφοριών - Κρυμμένα - Εμφανίζονται - - Κουμπί «Συμμετοχή» - Κρυμμένο - Εμφανίζεται - Πάνελ ιατρικών πληροφοριών - Κρυμμένα - Εμφανίζονται - Γρήγορες ενέργειες - Κρυμμένες - Εμφανίζονται - Περισσότερα βίντεο στις γρήγορες ενέργειες - Κρυμμένα - Εμφανίζονται - Οδηγίες συνδρομητών - Κρυμμένες - Εμφανίζονται - Συγχρονισμένες αντιδράσεις - Κρυμμένες - Εμφανίζονται - Σύνοψη βίντεο που δημιουργήθηκε από AI - Κρυμμένη - Εμφανίζεται - Ενότητα «Ερώτηση» - Κρυμμένη - Εμφανίζεται - Ενότητα ιδιοτήτων - Κρυμμένη.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» - Εμφανίζεται.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» - Κεφάλαια του βίντεο - Κρυμμένη - Εμφανίζεται - Ενότητα «Πως δημιουργήθηκε» - Κρυμμένη - Εμφανίζεται - Πόντοι Hype - Κρυμμένοι - Εμφανίζονται - Ενότητα «Εξερευνήστε το podcast» - Κρυμμένη - Εμφανίζεται - Ενότητα προτεινόμενων συνδέσμων - Κρυμμένη - Εμφανίζεται - Ενότητα προτεινόμενων βίντεο - Κρυμμένη - Εμφανίζεται - Ενότητα καρτών πληροφοριών - Κρυμμένη - Εμφανίζεται - Ενότητα «Βασικές έννοιες» - Κρυμμένη - Εμφανίζεται - Κουμπί «Εγγραφή» - Κρυμμένο - Εμφανίζεται - Ενότητα «Μεταγραφή» - Κρυμμένη - Εμφανίζεται - Περιγραφή βίντεο - Απόκρυψη ή εμφάνιση στοιχείων περιγραφής βίντεο - Γραμμή φίλτρων - Απόκρυψη ή εμφάνιση της γραμμής φίλτρων στις ροές, στα σχετικά βίντεο, στα αποτελέσματα αναζήτησης και στο ιστορικό παρακολούθησης - Γραμμή φίλτρων στις ροές - Κρυμμένη - Εμφανίζεται - Γραμμή φίλτρων στα σχετικά βίντεο - Κρυμμένη - Εμφανίζεται - Γραμμή φίλτρων στα αποτελέσματα αναζήτησης - Κρυμμένη - Εμφανίζεται - Γραμμή φίλτρων στο ιστορικό παρακολούθησης - Κρυμμένη - Εμφανίζεται - Σελίδα καναλιού - Απόκρυψη ή εμφάνιση στοιχείων της σελίδας καναλιού - - Κουμπί «Κοινότητα» - Κρυμμένο - Εμφανίζεται - - Ενότητα «Για εσάς» στη σελίδα καναλιού - Κρυμμένη - Εμφανίζεται - - Κουμπί «Συμμετοχή» - Κρυμμένο - Εμφανίζεται - Προεπισκόπηση συνδέσμων - Κρυμμένη - Εμφανίζεται - Ενότητα μελών - Κρυμμένη - Εμφανίζεται - - Κουμπί «Κατάστημα» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Εγγραφή» - Κρυμμένο - Εμφανίζεται - Σχόλια - Απόκρυψη ή εμφάνιση στοιχείων στα σχόλια - Σύνοψη συζήτησης που δημιουργήθηκε από AI - Κρυμμένη - Εμφανίζεται - Σύνοψη σχολίων που δημιουργήθηκε από AI - Κρυμμένη - Εμφανίζεται - Οδηγίες καναλιού - Κρυμμένες - Εμφανίζονται - Κεφαλίδα «Σχόλια από μέλη» - Κρυμμένη - Εμφανίζεται - Ενότητα σχολίων - Κρυμμένη - Εμφανίζεται - Οδηγίες κοινότητας - Κρυμμένες - Εμφανίζονται - Κουμπί «Δημιουργία Short» - Κρυμμένο - Εμφανίζεται - Κουμπιά χρονοσήμανσης και emoji - Κρυμμένα - Εμφανίζονται - Προεπισκόπηση σχολίου - Κρυμμένη - Εμφανίζεται - Κουμπί «Σας ευχαριστούμε» - Κρυμμένο - Εμφανίζεται - Αριθμός προβολών στη ροή και στα αποτελέσματα αναζήτησης - Κρυμμένος - Εμφανίζεται - - "Περιορισμοί: + Κουμπί «Συμμετοχή» + Κρυμμένο + Εμφανίζεται + Πάνελ ιατρικών πληροφοριών + Κρυμμένα + Εμφανίζονται + Γρήγορες ενέργειες + Κρυμμένες + Εμφανίζονται + Περισσότερα βίντεο στις γρήγορες ενέργειες + Κρυμμένα + Εμφανίζονται + Οδηγίες συνδρομητών + Κρυμμένες + Εμφανίζονται + Συγχρονισμένες αντιδράσεις + Κρυμμένες + Εμφανίζονται + Σύνοψη βίντεο που δημιουργήθηκε από AI + Κρυμμένη + Εμφανίζεται + Ενότητα «Ερώτηση» + Κρυμμένη + Εμφανίζεται + Ενότητα ιδιοτήτων + Κρυμμένη.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» + Εμφανίζεται.\n\nΑφορά τις ιδιότητες: Επιλεγμένα μέρη, Παιχνίδια, Μουσική, και «Οι χρήστες ανέφεραν» + Κεφάλαια του βίντεο + Κρυμμένη + Εμφανίζεται + Ενότητα «Πως δημιουργήθηκε» + Κρυμμένη + Εμφανίζεται + Πόντοι Hype + Κρυμμένοι + Εμφανίζονται + Ενότητα «Εξερευνήστε το podcast» + Κρυμμένη + Εμφανίζεται + Ενότητα προτεινόμενων συνδέσμων + Κρυμμένη + Εμφανίζεται + Ενότητα προτεινόμενων βίντεο + Κρυμμένη + Εμφανίζεται + Ενότητα καρτών πληροφοριών + Κρυμμένη + Εμφανίζεται + Ενότητα «Βασικές έννοιες» + Κρυμμένη + Εμφανίζεται + Κουμπί «Εγγραφή» + Κρυμμένο + Εμφανίζεται + Ενότητα «Μεταγραφή» + Κρυμμένη + Εμφανίζεται + Περιγραφή βίντεο + Απόκρυψη ή εμφάνιση στοιχείων περιγραφής βίντεο + Γραμμή φίλτρων + Απόκρυψη ή εμφάνιση της γραμμής φίλτρων στις ροές, στα σχετικά βίντεο, στα αποτελέσματα αναζήτησης και στο ιστορικό παρακολούθησης + Γραμμή φίλτρων στις ροές + Κρυμμένη + Εμφανίζεται + Γραμμή φίλτρων στα σχετικά βίντεο + Κρυμμένη + Εμφανίζεται + Γραμμή φίλτρων στα αποτελέσματα αναζήτησης + Κρυμμένη + Εμφανίζεται + Γραμμή φίλτρων στο ιστορικό παρακολούθησης + Κρυμμένη + Εμφανίζεται + Σελίδα καναλιού + Απόκρυψη ή εμφάνιση στοιχείων της σελίδας καναλιού + + Κουμπί «Κοινότητα» + Κρυμμένο + Εμφανίζεται + + Ενότητα «Για εσάς» στη σελίδα καναλιού + Κρυμμένη + Εμφανίζεται + + Κουμπί «Συμμετοχή» + Κρυμμένο + Εμφανίζεται + Προεπισκόπηση συνδέσμων + Κρυμμένη + Εμφανίζεται + Ενότητα μελών + Κρυμμένη + Εμφανίζεται + + Κουμπί «Κατάστημα» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Εγγραφή» + Κρυμμένο + Εμφανίζεται + Σχόλια + Απόκρυψη ή εμφάνιση στοιχείων στα σχόλια + Σύνοψη συζήτησης που δημιουργήθηκε από AI + Κρυμμένη + Εμφανίζεται + Σύνοψη σχολίων που δημιουργήθηκε από AI + Κρυμμένη + Εμφανίζεται + Οδηγίες καναλιού + Κρυμμένες + Εμφανίζονται + Κεφαλίδα «Σχόλια από μέλη» + Κρυμμένη + Εμφανίζεται + Ενότητα σχολίων + Κρυμμένη + Εμφανίζεται + Οδηγίες κοινότητας + Κρυμμένες + Εμφανίζονται + Κουμπί «Δημιουργία Short» + Κρυμμένο + Εμφανίζεται + Κουμπιά χρονοσήμανσης και emoji + Κρυμμένα + Εμφανίζονται + Προεπισκόπηση σχολίου + Κρυμμένη + Εμφανίζεται + Κουμπί «Σας ευχαριστούμε» + Κρυμμένο + Εμφανίζεται + Αριθμός προβολών στη ροή και στα αποτελέσματα αναζήτησης + Κρυμμένος + Εμφανίζεται + + "Περιορισμοί: • Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τους αριθμούς προβολών • Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου" - Χρόνος μεταμόρφωσης στη ροή και στα αποτελέσματα αναζήτησης - Κρυμμένος - Εμφανίζεται - - "Περιορισμοί: + Χρόνος μεταμόρφωσης στη ροή και στα αποτελέσματα αναζήτησης + Κρυμμένος + Εμφανίζεται + + "Περιορισμοί: • Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τον χρόνο μεταμόρφωσης • Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου" - Απόκρυψη περιεχομένου λέξεων-κλειδιών - Απόκρυψη βίντεο ροής και αναζήτησης χρησιμοποιώντας φίλτρα λέξεων-κλειδιών - Φιλτράρισμα αρχικής ροής - Τα βίντεο στην αρχική ροή φιλτράρονται με τη χρήση λέξεων-κλειδιών - Τα βίντεο στην αρχική ροή δε φιλτράρονται από λέξεις-κλειδιά - Φιλτράρισμα αποτελεσμάτων αναζήτησης - Τα αποτελέσματα αναζήτησης φιλτράρονται με τη χρήση λέξεων-κλειδιών - Τα αποτελέσματα αναζήτησης δε φιλτράρονται από λέξεις-κλειδιά - Φιλτράρισμα σελίδας εγγραφών - Τα βίντεο στη σελίδα εγγραφών φιλτράρονται με τη χρήση λέξεων-κλειδιών - Τα βίντεο στη σελίδα εγγραφών δε φιλτράρονται από λέξεις-κλειδιά - Λέξεις-κλειδιά για απόκρυψη - - "Λέξεις-κλειδιά και φράσεις προς απόκρυψη, διαχωρισμένες σε νέες γραμμές + "Λέξεις-κλειδιά και φράσεις προς απόκρυψη, διαχωρισμένες σε νέες γραμμές Οι λέξεις-κλειδιά μπορεί να είναι ονόματα καναλιών ή κείμενο που εμφανίζεται σε τίτλους των βίντεο Οι λέξεις με κεφαλαία γράμματα στη μέση πρέπει να είναι ευαίσθητες στην πεζότητα (π.χ: iPhone, TikTok, LeBlanc)" - Σχετικά με το φιλτράρισμα λέξεων-κλειδιών - "Οι καρτέλες «Αρχική», «Εγγραφές» και τα αποτελέσματα αναζήτησης φιλτράρονται για απόκρυψη περιεχομένου που ταιριάζει με τις λέξεις-κλειδιά + Σχετικά με το φιλτράρισμα λέξεων-κλειδιών + "Οι καρτέλες «Αρχική», «Εγγραφές» και τα αποτελέσματα αναζήτησης φιλτράρονται για απόκρυψη περιεχομένου που ταιριάζει με τις λέξεις-κλειδιά Περιορισμοί: • Δεν γίνεται απόκρυψη των Shorts με βάση το όνομα καναλιού • Κάποια στοιχεία UI ενδέχεται να μην είναι κρυμμένα • Η αναζήτηση για μια λέξη-κλειδί ενδέχεται να μην εμφανίζει κανένα αποτέλεσμα" - Ταίριασμα ολόκληρων λέξεων - - Περιβάλλοντας μια λέξη-κλειδί / φράση με διπλά εισαγωγικά θα αποτρέψει μερικές αντιστοιχίες των τίτλων βίντεο και των ονομάτων καναλιών<br><br>Για παράδειγμα,<br><b>\"ai\"</b> θα κρύψει το βίντεο: <b>How does AI work?</b><br>αλλά δεν θα κρύψει: <b>What does fair use mean?</b> - - Αδυναμία χρήσης λέξης-κλειδί: %s - Προσθήκη εισαγωγικών για χρήση λέξης-κλειδί: %s - Λέξη-κλειδί έχει αντικρουόμενες δηλώσεις: %s - Η λέξη-κλειδί είναι πολύ σύντομη και απαιτεί εισαγωγικά: %s - Θα κρυφτούν όλα τα βίντεο με την λέξη-κλειδί: %s - - - Ενότητα καταστήματος δημιουργού - Κρυμμένη\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής - Εμφανίζεται\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής - Ετικέτα καταστήματος στην τελική οθόνη - Κρυμμένη - Εμφανίζεται - Διαφημίσεις πλήρους οθόνης - "Κρυμμένες + Ταίριασμα ολόκληρων λέξεων + + Περιβάλλοντας μια λέξη-κλειδί / φράση με διπλά εισαγωγικά θα αποτρέψει μερικές αντιστοιχίες των τίτλων βίντεο και των ονομάτων καναλιών<br><br>Για παράδειγμα,<br><b>\"ai\"</b> θα κρύψει το βίντεο: <b>How does AI work?</b><br>αλλά δεν θα κρύψει: <b>What does fair use mean?</b> + + Αδυναμία χρήσης λέξης-κλειδί: %s + Προσθήκη εισαγωγικών για χρήση λέξης-κλειδί: %s + Λέξη-κλειδί έχει αντικρουόμενες δηλώσεις: %s + Η λέξη-κλειδί είναι πολύ σύντομη και απαιτεί εισαγωγικά: %s + Θα κρυφτούν όλα τα βίντεο με την λέξη-κλειδί: %s + + + Ενότητα καταστήματος δημιουργού + Κρυμμένη\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής + Εμφανίζεται\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής + Ετικέτα καταστήματος στην τελική οθόνη + Κρυμμένη + Εμφανίζεται + Διαφημίσεις πλήρους οθόνης + "Κρυμμένες Αυτή η λειτουργία είναι διαθέσιμη μόνο για παλιότερες συσκευές" - Οι διαφημίσεις πλήρους οθόνης εμφανίζονται - - Η απόκρυψη διαφημίσεων πλήρους οθόνης λειτουργεί μόνο με παλαιότερες συσκευές - Γενικές διαφημίσεις - Κρυμμένες - Εμφανίζονται - Εμβλήματα εμπορευμάτων - Κρυμμένα - Εμφανίζονται - Ετικέτες προώθησης επί πληρωμή - Κρυμμένες - Εμφανίζονται - Κάρτες αυτοπροώθησης - Κρυμμένες - Εμφανίζονται - Σύνδεσμοι αγορών στην περιγραφή βίντεο - Κρυμμένοι - Εμφανίζονται - Ετικέτα «Προβολή προϊόντων» στην οθόνη αναπαραγωγής - Κρυμμένη - Εμφανίζεται - Αποτελέσματα αναζήτησης στο διαδίκτυο - Κρυμμένα - Εμφανίζονται - - - Προωθήσεις για απόκτηση YouTube Premium - Κρυμμένες - Εμφανίζονται - - - Διαφημίσεις βίντεο - Κρυμμένες - Εμφανίζονται - - - Η διεύθυνση URL αντιγράφηκε στο πρόχειρο - Η διεύθυνση URL αντιγράφηκε με χρονική σήμανση - Εμφάνιση κουμπιού αντιγραφής URL του βίντεο - Το κουμπί αντιγραφής URL βίντεο εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL με χρονική σήμανση - Το κουμπί αντιγραφής URL βίντεο δεν εμφανίζεται - Εμφάνιση κουμπιού αντιγραφής URL με χρονική σήμανση - Το κουμπί αντιγραφής URL με χρονική σήμανση εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο με χρονική σήμανση. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL χωρίς χρονική σήμανση - Το κουμπί αντιγραφής URL με χρονική σήμανση δεν εμφανίζεται - - - Παράθυρο ηλικιακού περιορισμού - Κρυμμένο - Εμφανίζεται - Αυτό δεν παρακάμπτει τον ηλικιακό περιορισμό. Απλώς τον αποδέχεται αυτόματα. - - - Απενεργοποίηση αναδυόμενου παραθύρου σύνδεσης στην τηλεόραση - Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι απενεργοποιημένο - Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι ενεργοποιημένο - - - Απενεργοποίηση παράλειψης κεφαλαίου με διπλό πάτημα - Το διπλό πάτημα δεν παραλείπει ποτέ στο επόμενο/προηγούμενο κεφάλαιο - Το διπλό πάτημα μπορεί περιστασιακά να παραλείψει στο επόμενο/προηγούμενο κεφάλαιο - - - Εξωτερικές λήψεις - Ρυθμίσεις για χρήση εξωτερικής εφαρμογής λήψης - Εμφάνιση κουμπιού εξωτερικής λήψης - Το κουμπί λήψης εμφανίζεται στην οθόνη αναπαραγωγής - Το κουμπί λήψης δεν εμφανίζεται στην οθόνη αναπαραγωγής - - Αλλαγή λειτουργίας κουμπιού ενέργειας «Λήψη» - Το κουμπί «Λήψη» ανοίγει την εξωτερική εφαρμογή λήψης σας - Το κουμπί «Λήψη» ανοίγει το ενσωματωμένο πρόγραμμα λήψης του YouTube - Όνομα πακέτου εφαρμογής λήψης - Το όνομα πακέτου της εγκατεστημένης σας εξωτερικής εφαρμογής λήψης - Εισάγετε το όνομα πακέτου - Άλλο - Η εφαρμογή δεν έχει εγκατασταθεί - Το %s δεν είναι εγκατεστημένο. Παρακαλούμε εγκαταστήστε το. - "Δεν ήταν δυνατή η εύρεση εγκατεστημένης εφαρμογής με όνομα πακέτου: %s + Οι διαφημίσεις πλήρους οθόνης εμφανίζονται + + Η απόκρυψη διαφημίσεων πλήρους οθόνης λειτουργεί μόνο με παλαιότερες συσκευές + Γενικές διαφημίσεις + Κρυμμένες + Εμφανίζονται + Εμβλήματα εμπορευμάτων + Κρυμμένα + Εμφανίζονται + Ετικέτες προώθησης επί πληρωμή + Κρυμμένες + Εμφανίζονται + Κάρτες αυτοπροώθησης + Κρυμμένες + Εμφανίζονται + Σύνδεσμοι αγορών στην περιγραφή βίντεο + Κρυμμένοι + Εμφανίζονται + Ετικέτα «Προβολή προϊόντων» στην οθόνη αναπαραγωγής + Κρυμμένη + Εμφανίζεται + Αποτελέσματα αναζήτησης στο διαδίκτυο + Κρυμμένα + Εμφανίζονται + + + Προωθήσεις για απόκτηση YouTube Premium + Κρυμμένες + Εμφανίζονται + + + Διαφημίσεις βίντεο + Κρυμμένες + Εμφανίζονται + + + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο + Η διεύθυνση URL αντιγράφηκε με χρονική σήμανση + Εμφάνιση κουμπιού αντιγραφής URL του βίντεο + Το κουμπί αντιγραφής URL βίντεο εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL με χρονική σήμανση + Το κουμπί αντιγραφής URL βίντεο δεν εμφανίζεται + Εμφάνιση κουμπιού αντιγραφής URL με χρονική σήμανση + Το κουμπί αντιγραφής URL με χρονική σήμανση εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο με χρονική σήμανση. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL χωρίς χρονική σήμανση + Το κουμπί αντιγραφής URL με χρονική σήμανση δεν εμφανίζεται + + + Παράθυρο ηλικιακού περιορισμού + Κρυμμένο + Εμφανίζεται + Αυτό δεν παρακάμπτει τον ηλικιακό περιορισμό. Απλώς τον αποδέχεται αυτόματα. + + + Απενεργοποίηση αναδυόμενου παραθύρου σύνδεσης στην τηλεόραση + Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι απενεργοποιημένο + Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι ενεργοποιημένο + + + Απενεργοποίηση παράλειψης κεφαλαίου με διπλό πάτημα + Το διπλό πάτημα δεν παραλείπει ποτέ στο επόμενο/προηγούμενο κεφάλαιο + Το διπλό πάτημα μπορεί περιστασιακά να παραλείψει στο επόμενο/προηγούμενο κεφάλαιο + + + Εξωτερικές λήψεις + Ρυθμίσεις για χρήση εξωτερικής εφαρμογής λήψης + Εμφάνιση κουμπιού εξωτερικής λήψης + Το κουμπί λήψης εμφανίζεται στην οθόνη αναπαραγωγής + Το κουμπί λήψης δεν εμφανίζεται στην οθόνη αναπαραγωγής + + Αλλαγή λειτουργίας κουμπιού ενέργειας «Λήψη» + Το κουμπί «Λήψη» ανοίγει την εξωτερική εφαρμογή λήψης σας + Το κουμπί «Λήψη» ανοίγει το ενσωματωμένο πρόγραμμα λήψης του YouTube + Όνομα πακέτου εφαρμογής λήψης + Το όνομα πακέτου της εγκατεστημένης σας εξωτερικής εφαρμογής λήψης + Εισάγετε το όνομα πακέτου + Άλλο + Η εφαρμογή δεν έχει εγκατασταθεί + Το %s δεν είναι εγκατεστημένο. Παρακαλούμε εγκαταστήστε το. + "Δεν ήταν δυνατή η εύρεση εγκατεστημένης εφαρμογής με όνομα πακέτου: %s Επιβεβαιώστε ότι το όνομα πακέτου είναι σωστό και ότι η εφαρμογή είναι εγκατεστημένη" - Το όνομα πακέτου δεν μπορεί να είναι κενό - - - Απενεργοποίηση ακριβής αναζήτησης - Η χειρονομία αναζήτησης καρέ-καρέ είναι απενεργοποιημένη - Η χειρονομία αναζήτησης καρέ-καρέ είναι ενεργοποιημένη - - - Πάτημα για αναζήτηση στη γραμμή προόδου - Το πάτημα για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένο - Το πάτημα για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένο - - - Σάρωση οθόνης για φωτεινότητα - "Η χειρονομία σάρωσης για αλλαγή φωτεινότητας στην πλήρη οθόνη είναι ενεργοποιημένη + Το όνομα πακέτου δεν μπορεί να είναι κενό + + + Απενεργοποίηση ακριβής αναζήτησης + Η χειρονομία αναζήτησης καρέ-καρέ είναι απενεργοποιημένη + Η χειρονομία αναζήτησης καρέ-καρέ είναι ενεργοποιημένη + + + Πάτημα για αναζήτηση στη γραμμή προόδου + Το πάτημα για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένο + Το πάτημα για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένο + + + Σάρωση οθόνης για φωτεινότητα + "Η χειρονομία σάρωσης για αλλαγή φωτεινότητας στην πλήρη οθόνη είναι ενεργοποιημένη Προσαρμόστε τη φωτεινότητα σαρώνοντας κάθετα στην αριστερή πλευρά της οθόνης" - Η χειρονομία σάρωσης για αλλαγή φωτεινότητας στην πλήρη οθόνη είναι απενεργοποιημένη - Σάρωση οθόνης για ένταση ήχου - "Η χειρονομία σάρωσης για αλλαγή έντασης ήχου στην πλήρη οθόνη είναι ενεργοποιημένη + Η χειρονομία σάρωσης για αλλαγή φωτεινότητας στην πλήρη οθόνη είναι απενεργοποιημένη + Σάρωση οθόνης για ένταση ήχου + "Η χειρονομία σάρωσης για αλλαγή έντασης ήχου στην πλήρη οθόνη είναι ενεργοποιημένη Προσαρμόστε την ένταση ήχου σαρώνοντας κάθετα στη δεξιά πλευρά της οθόνης" - Η χειρονομία σάρωσης για αλλαγή έντασης ήχου στην πλήρη οθόνη είναι απενεργοποιημένη - Παρατεταμένο πάτημα για σάρωση - Η χειρονομία παρατεταμένου πατήματος για σάρωση είναι ενεργοποιημένη - Η χειρονομία παρατεταμένου πατήματος για σάρωση είναι απενεργοποιημένη - Απόκριση δόνησης - Η απόκριση δόνησης είναι ενεργοποιημένη - Η απόκριση δόνησης είναι απενεργοποιημένη - Αποθήκευση και επαναφορά φωτεινότητας - Η φωτεινότητα αποθηκεύεται και επαναφέρεται κατά την έξοδο ή την είσοδο σε πλήρη οθόνη - Η φωτεινότητα δεν αποθηκεύεται ούτε επαναφέρεται κατά την έξοδο ή την είσοδο σε πλήρη οθόνη - Αυτόματη φωτεινότητα με σάρωση - Η σάρωση προς τα κάτω στη χαμηλότερη τιμή της χειρονομίας φωτεινότητας ενεργοποιεί την αυτόματη φωτεινότητα - Η σάρωση προς τα κάτω στη χαμηλότερη τιμή της χειρονομίας φωτεινότητας δεν ενεργοποιεί την αυτόματη φωτεινότητα - Αυτόματη - Χρονικό όριο εμφάνισης πλαισίου σάρωσης - Το χρονικό διάστημα χιλιοστών του δευτερολέπτου που είναι ορατό το πλαίσιο σάρωσης - Αδιαφάνεια φόντου σάρωσης - Τιμή αδιαφάνειας μεταξύ 0-100 - Η αδιαφάνεια σάρωσης πρέπει να είναι μεταξύ 0-100 - Χρώμα γραμμής σάρωσης για φωτεινότητα - Το χρώμα της γραμμής προόδου για τον έλεγχο της φωτεινότητας - Χρώμα γραμμής σάρωσης για ένταση ήχου - Το χρώμα της γραμμής προόδου για τον έλεγχο της έντασης ήχου - Μέγεθος κειμένου φόντου σάρωσης - Το μέγεθος κειμένου στο φόντο της σάρωσης μεταξύ 1-30 - Το μέγεθος κειμένου πρέπει να είναι μεταξύ 1-30 - Κατώτατο όριο μεγέθους σάρωσης - Η ελάχιστη απόσταση που πρέπει να διανυστεί με το δάκτυλο για να είναι αναγνωρίσιμη η χειρονομία σάρωσης - Ευαισθησία σάρωσης έντασης ήχου - Πόσο αλλάζει η ένταση ήχου ανά σάρωση - Στυλ διάταξης σάρωσης - Οριζόντια διάταξη - Οριζόντια διάταξη (μινιμαλιστική - κορυφή) - Οριζόντια διάταξη (μινιμαλιστική - κέντρο) - Κυκλική διάταξη - Κυκλική διάταξη (μινιμαλιστική) - Κάθετη διάταξη - Κάθετη διάταξη (μινιμαλιστική) - Χειρονομία εναλλαγής βίντεο στην πλήρη οθόνη - Σάρωση αριστερά/δεξιά κατά τη λειτουργία πλήρους οθόνης για αλλαγή σε επόμενο/προηγούμενο βίντεο - Η χειρονομία αλλαγής βίντεο κατά τη λειτουργία πλήρους οθόνης είναι ανενεργή - - - Απενεργοποίηση αυτόματων υπότιτλων - Οι αυτόματοι υπότιτλοι είναι απενεργοποιημένοι - Οι αυτόματοι υπότιτλοι είναι ενεργοποιημένοι - - - Κουμπιά ενεργειών - Απόκρυψη ή εμφάνιση κουμπιών κάτω από βίντεο - Απενεργοποίηση λάμψης κουμπιών «Μου αρέσει» και «Εγγραφή» - Τα κουμπιά «Μου αρέσει» και «Εγγραφή» δεν θα λάμπουν όταν αναφέρονται - Τα κουμπιά «Μου αρέσει» και «Εγγραφή» θα λάμπουν όταν αναφέρονται - Κουμπιά «Μου αρέσει» και «Δεν μου αρέσει» - Κρυμμένα - Εμφανίζονται - - Κουμπί «Κοινοποίηση» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Διακοπή διαφημίσεων» - Κρυμμένο - Εμφανίζεται - - Απόκρυψη σχολίων - Κρυμμένο - Εμφανίζεται - + Κουμπί «Κοινοποίηση» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Διακοπή διαφημίσεων» + Κρυμμένο + Εμφανίζεται + + Απόκρυψη σχολίων + Κρυμμένο + Εμφανίζεται + - Μενού «Αναφορά» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Remix» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Λήψη» - Κρυμμένο - Εμφανίζεται - + Κουμπί «Remix» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Λήψη» + Κρυμμένο + Εμφανίζεται + - Κουμπί «Hype» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Προώθηση» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Σας ευχαριστούμε» - Κρυμμένο - Εμφανίζεται - + Κουμπί «Προώθηση» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Σας ευχαριστούμε» + Κρυμμένο + Εμφανίζεται + - Κουμπί «Ερώτηση» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Κλιπ» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Αγορές» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Αποθήκευση» - Κρυμμένο - Εμφανίζεται - - - Κουμπιά γραμμής πλοήγησης - Απόκρυψη ή αλλαγή κουμπιών στη γραμμή πλοήγησης - - Κουμπί «Αρχική» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Shorts» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Δημιουργία» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Εγγραφές» - Κρυμμένο - Εμφανίζεται - Κουμπί «Ειδοποιήσεις» - Κρυμμένο - Εμφανίζεται - - Εναλλαγή κουμπιού «Δημιουργία» με κουμπί «Ειδοποιήσεις» - "Γίνεται εναλλαγή θέσεων των κουμπιών «Δημιουργία» και «Ειδοποιήσεις» + Κουμπί «Ερώτηση» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Κλιπ» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Αγορές» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Αποθήκευση» + Κρυμμένο + Εμφανίζεται + + + Κουμπιά γραμμής πλοήγησης + Απόκρυψη ή αλλαγή κουμπιών στη γραμμή πλοήγησης + + Κουμπί «Αρχική» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Shorts» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Δημιουργία» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Εγγραφές» + Κρυμμένο + Εμφανίζεται + Κουμπί «Ειδοποιήσεις» + Κρυμμένο + Εμφανίζεται + + Εναλλαγή κουμπιού «Δημιουργία» με κουμπί «Ειδοποιήσεις» + "Γίνεται εναλλαγή θέσεων των κουμπιών «Δημιουργία» και «Ειδοποιήσεις» Σημείωση: Η ενεργοποίηση αυτής της ρύθμισης εξαναγκάζει επίσης την απόκρυψη των διαφημίσεων βίντεο" - Δε γίνεται εναλλαγή του κουμπιού δημιουργίας σε κουμπί ειδοποιήσεων - "Η απενεργοποίηση αυτής της ρύθμισης θα έχει ως αποτέλεσμα την εμφάνιση διαφημίσεων Shorts. + Δε γίνεται εναλλαγή του κουμπιού δημιουργίας σε κουμπί ειδοποιήσεων + "Η απενεργοποίηση αυτής της ρύθμισης θα έχει ως αποτέλεσμα την εμφάνιση διαφημίσεων Shorts. Εάν η αλλαγή αυτής της ρύθμισης δεν έχει αποτέλεσμα, δοκιμάστε να μεταβείτε σε λειτουργία ανώνυμης περιήγησης." - Ονομασίες κουμπιών γραμμής πλοήγησης - Κρυμμένες - Εμφανίζονται - Απενεργοποίηση διαφανούς γραμμής κατάστασης - Η γραμμή κατάστασης δεν είναι διαφανής - Η διαφάνεια της γραμμής κατάστασης ορίζεται αυτόματα - Σε ορισμένες συσκευές, η ενεργοποίηση αυτής της λειτουργίας μπορεί να αλλάξει τη γραμμή πλοήγησης του συστήματος σε διαφανή. - Απενεργοποίηση διαφανούς γραμμής στο φωτεινό θέμα - Η γραμμή πλοήγησης στο φωτεινό θέμα δεν είναι διαφανής - Η διαφάνεια της γραμμής πλοήγησης στο φωτεινό θέμα ορίζεται αυτόματα - Απενεργοποίηση διαφανούς γραμμής στο σκούρο θέμα - Η γραμμή πλοήγησης στο σκούρο θέμα δεν είναι διαφανής - Η διαφάνεια της γραμμής πλοήγησης στο σκούρο θέμα ορίζεται αυτόματα - - - Αναδυόμενο μενού ρυθμίσεων - Απόκρυψη ή εμφάνιση στοιχείων του αναδυόμενου μενού στην οθόνη αναπαραγωγής - - Μενού «Υπότιτλοι» - Κρυμμένο - Εμφανίζεται - - Μενού «Πρόσθετες ρυθμίσεις» - Κρυμμένο - Εμφανίζεται - - Μενού «Χρονόμετρο ύπνου» - Κρυμμένο - Εμφανίζεται - - Μενού «Επανάληψη βίντεο» - Κρυμμένο - Εμφανίζεται - - Μενού «Λειτουργία περιβάλλοντος» - Κρυμμένο - Εμφανίζεται - Μενού «Σταθερή ένταση» - Εμφανίζεται - Κρυμμένο - - Μενού «Βοήθεια & σχόλια» - Κρυμμένο - Εμφανίζεται - - Μενού «Ταχύτητα αναπαραγωγής» - Κρυμμένο - Εμφανίζεται - - Μενού «Οθόνη κλειδώματος» - Κρυμμένο - Εμφανίζεται - - Μενού «Ακρόαση με YouTube Music» - Κρυμμένο - Εμφανίζεται - - Μενού «Κομμάτι ήχου» - Κρυμμένο - Εμφανίζεται - + Μενού «Υπότιτλοι» + Κρυμμένο + Εμφανίζεται + + Μενού «Πρόσθετες ρυθμίσεις» + Κρυμμένο + Εμφανίζεται + + Μενού «Χρονόμετρο ύπνου» + Κρυμμένο + Εμφανίζεται + + Μενού «Επανάληψη βίντεο» + Κρυμμένο + Εμφανίζεται + + Μενού «Λειτουργία περιβάλλοντος» + Κρυμμένο + Εμφανίζεται + Μενού «Σταθερή ένταση» + Εμφανίζεται + Κρυμμένο + + Μενού «Βοήθεια & σχόλια» + Κρυμμένο + Εμφανίζεται + + Μενού «Ταχύτητα αναπαραγωγής» + Κρυμμένο + Εμφανίζεται + + Μενού «Οθόνη κλειδώματος» + Κρυμμένο + Εμφανίζεται + + Μενού «Ακρόαση με YouTube Music» + Κρυμμένο + Εμφανίζεται + + Μενού «Κομμάτι ήχου» + Κρυμμένο + Εμφανίζεται + - "Κρυμμένο + "Κρυμμένο Για να εμφανίζεται το μενού κομματιού ήχου, αλλάξτε την «Παραποίηση ροών βίντεο» σε 'Android No SDK'" - - Μενού «Προβολή σε VR» - Κρυμμένο - Εμφανίζεται - Μενού «Ποιότητα» - Κρυμμένο - Εμφανίζεται - Οδηγίες του μενού ποιότητας βίντεο - Κρυμμένες - Εμφανίζονται - - - Κουμπί αυτόματης αναπαραγωγής - Κρυμμένο - Εμφανίζεται - - Κουμπί υπότιτλων - Κρυμμένο - Εμφανίζεται - Κουμπί μετάδοσης - Κρυμμένο - Εμφανίζεται - Φόντο κουμπιών ελέγχου οθόνης αναπαραγωγής - Κρυμμένο - Εμφανίζεται - Κουμπιά προηγούμενου & επόμενου βίντεο - Κρυμμένα - Εμφανίζονται - - - Κάρτες τελικής οθόνης - Κρυμμένες - Εμφανίζονται - - - Απενεργοποίηση λειτουργίας περιβάλλοντος σε πλήρη οθόνη - Η λειτουργία περιβάλλοντος σε πλήρη οθόνη είναι απενεργοποιημένη - Η λειτουργία περιβάλλοντος σε πλήρη οθόνη είναι ενεργοποιημένη - - - Κάρτες πληροφοριών - Κρυμμένες - Εμφανίζονται - - - Απενεργοποίηση κινήσεων αριθμών - Οι αριθμοί δε θα κινούνται αυξανόμενοι εκθετικά - Οι αριθμοί κινούνται αυξανόμενοι εκθετικά - - - Γραμμή προόδου στην οθόνη αναπαραγωγής - Κρυμμένη - Εμφανίζεται - - Γραμμή προόδου στις μικρογραφίες βίντεο - Κρυμμένη - Εμφανίζεται - - - Οθόνη αναπαραγωγής Shorts - Απόκρυψη ή εμφάνιση στοιχείων στην οθόνη αναπαραγωγής Shorts - - Shorts στην αρχική ροή και στα σχετικά βίντεο - Κρυμμένα - Εμφανίζονται - Shorts στα αποτελέσματα αναζήτησης - Κρυμμένα - Εμφανίζονται - - Shorts στην καρτέλα «Εγγραφές» - Κρυμμένα - Εμφανίζονται - Shorts στο ιστορικό παρακολούθησης - Κρυμμένα - Εμφανίζονται - Ετικέτα αυτόματης μεταγλώττισης - Κρυμμένη - Εμφανίζεται - Κουμπί «Αγορά Super Thanks» - Κρυμμένο - Εμφανίζεται - Κουμπί «Εφέ» - Κρυμμένο - Εμφανίζεται - Κουμπί «Green screen» - Κρυμμένο - Εμφανίζεται - Κουμπί hashtag - Κρυμμένο - Εμφανίζεται - - Κουμπί «Συμμετοχή» - Κρυμμένο - Εμφανίζεται - Προεπισκόπηση live - Κρυμμένη - Εμφανίζεται - Ετικέτα τοποθεσίας - Κρυμμένη - Εμφανίζεται - Κουμπί «Νέες αναρτήσεις» - Κρυμμένο - Εμφανίζεται - Κουμπιά εμφάνισης κατά την παύση - Κρυμμένα - Εμφανίζονται - Προεπισκόπηση σχολίου - Κρυμμένη - Εμφανίζεται - Κουμπί «Αποθήκευση μουσικής» - Κρυμμένο - Εμφανίζεται - Προτάσεις αναζήτησης - Κρυμμένες - Εμφανίζονται - Κουμπί «Κατάστημα» - Κρυμμένο - Εμφανίζεται - Αυτοκόλλητα - Κρυμμένα - Εμφανίζονται - Κουμπί «Εγγραφή» - Κρυμμένο - Εμφανίζεται - Ετικέτες προϊόντων - Κρυμμένες - Εμφανίζονται - Κουμπί επερχόμενης πρεμιέρας/ζωντανής ροής - Κρυμμένο - Εμφανίζεται - Κουμπί «Χρήση αυτού του ήχου» - Κρυμμένο - Εμφανίζεται - Κουμπί «Χρήση αυτού του προτύπου» - Κρυμμένο - Εμφανίζεται - Εφέ κουμπιού «Μου αρέσει» - Κρυμμένο - Εμφανίζεται - Κουμπί «Μου αρέσει» - Κρυμμένο - Εμφανίζεται - Κουμπί «Δεν μου αρέσει» - Κρυμμένο - Εμφανίζεται - Κουμπί σχολίων - Κρυμμένο - Εμφανίζεται - - Κουμπί «Κοινοποίηση» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Remix» - Κρυμμένο - Εμφανίζεται - Κουμπί ήχου - Κρυμμένο - Εμφανίζεται - Πίνακας πληροφοριών - Κρυμμένος - Εμφανίζεται - Γραμμή καναλιού - Κρυμμένη - Εμφανίζεται - Τίτλος του βίντεο - Κρυμμένος - Εμφανίζεται - Ετικέτες μεταδεδομένων ήχου - Κρυμμένη - Εμφανίζεται - Ετικέτα συνδέσμου βίντεο - Κρυμμένες - Εμφανίζονται - Γραμμή πλοήγησης - Η γραμμή πλοήγησης θα είναι κρυμμένη κατά την αναπαραγωγή Shorts - Η γραμμή πλοήγησης εμφανίζεται κατά την αναπαραγωγή Shorts - - - Προτεινόμενο βίντεο τελικής οθόνης - "Κρυμμένο όταν η αυτόματη αναπαραγωγή είναι απενεργοποιημένη + + Μενού «Προβολή σε VR» + Κρυμμένο + Εμφανίζεται + Μενού «Ποιότητα» + Κρυμμένο + Εμφανίζεται + Οδηγίες του μενού ποιότητας βίντεο + Κρυμμένες + Εμφανίζονται + + + Κουμπί αυτόματης αναπαραγωγής + Κρυμμένο + Εμφανίζεται + + Κουμπί υπότιτλων + Κρυμμένο + Εμφανίζεται + Κουμπί μετάδοσης + Κρυμμένο + Εμφανίζεται + Φόντο κουμπιών ελέγχου οθόνης αναπαραγωγής + Κρυμμένο + Εμφανίζεται + Κουμπιά προηγούμενου & επόμενου βίντεο + Κρυμμένα + Εμφανίζονται + + + Κάρτες τελικής οθόνης + Κρυμμένες + Εμφανίζονται + + + Απενεργοποίηση λειτουργίας περιβάλλοντος σε πλήρη οθόνη + Η λειτουργία περιβάλλοντος σε πλήρη οθόνη είναι απενεργοποιημένη + Η λειτουργία περιβάλλοντος σε πλήρη οθόνη είναι ενεργοποιημένη + + + Κάρτες πληροφοριών + Κρυμμένες + Εμφανίζονται + + + Απενεργοποίηση κινήσεων αριθμών + Οι αριθμοί δε θα κινούνται αυξανόμενοι εκθετικά + Οι αριθμοί κινούνται αυξανόμενοι εκθετικά + + + Γραμμή προόδου στην οθόνη αναπαραγωγής + Κρυμμένη + Εμφανίζεται + + Γραμμή προόδου στις μικρογραφίες βίντεο + Κρυμμένη + Εμφανίζεται + + + Οθόνη αναπαραγωγής Shorts + Απόκρυψη ή εμφάνιση στοιχείων στην οθόνη αναπαραγωγής Shorts + + Shorts στην αρχική ροή και στα σχετικά βίντεο + Κρυμμένα + Εμφανίζονται + Shorts στα αποτελέσματα αναζήτησης + Κρυμμένα + Εμφανίζονται + + Shorts στην καρτέλα «Εγγραφές» + Κρυμμένα + Εμφανίζονται + Shorts στο ιστορικό παρακολούθησης + Κρυμμένα + Εμφανίζονται + Ετικέτα αυτόματης μεταγλώττισης + Κρυμμένη + Εμφανίζεται + Κουμπί «Αγορά Super Thanks» + Κρυμμένο + Εμφανίζεται + Κουμπί «Εφέ» + Κρυμμένο + Εμφανίζεται + Κουμπί «Green screen» + Κρυμμένο + Εμφανίζεται + Κουμπί hashtag + Κρυμμένο + Εμφανίζεται + + Κουμπί «Συμμετοχή» + Κρυμμένο + Εμφανίζεται + Προεπισκόπηση live + Κρυμμένη + Εμφανίζεται + Ετικέτα τοποθεσίας + Κρυμμένη + Εμφανίζεται + Κουμπί «Νέες αναρτήσεις» + Κρυμμένο + Εμφανίζεται + Κουμπιά εμφάνισης κατά την παύση + Κρυμμένα + Εμφανίζονται + Προεπισκόπηση σχολίου + Κρυμμένη + Εμφανίζεται + Κουμπί «Αποθήκευση μουσικής» + Κρυμμένο + Εμφανίζεται + Προτάσεις αναζήτησης + Κρυμμένες + Εμφανίζονται + Κουμπί «Κατάστημα» + Κρυμμένο + Εμφανίζεται + Αυτοκόλλητα + Κρυμμένα + Εμφανίζονται + Κουμπί «Εγγραφή» + Κρυμμένο + Εμφανίζεται + Ετικέτες προϊόντων + Κρυμμένες + Εμφανίζονται + Κουμπί επερχόμενης πρεμιέρας/ζωντανής ροής + Κρυμμένο + Εμφανίζεται + Κουμπί «Χρήση αυτού του ήχου» + Κρυμμένο + Εμφανίζεται + Κουμπί «Χρήση αυτού του προτύπου» + Κρυμμένο + Εμφανίζεται + Εφέ κουμπιού «Μου αρέσει» + Κρυμμένο + Εμφανίζεται + Κουμπί «Μου αρέσει» + Κρυμμένο + Εμφανίζεται + Κουμπί «Δεν μου αρέσει» + Κρυμμένο + Εμφανίζεται + Κουμπί σχολίων + Κρυμμένο + Εμφανίζεται + + Κουμπί «Κοινοποίηση» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Remix» + Κρυμμένο + Εμφανίζεται + Κουμπί ήχου + Κρυμμένο + Εμφανίζεται + Πίνακας πληροφοριών + Κρυμμένος + Εμφανίζεται + Γραμμή καναλιού + Κρυμμένη + Εμφανίζεται + Τίτλος του βίντεο + Κρυμμένος + Εμφανίζεται + Ετικέτες μεταδεδομένων ήχου + Κρυμμένη + Εμφανίζεται + Ετικέτα συνδέσμου βίντεο + Κρυμμένες + Εμφανίζονται + Γραμμή πλοήγησης + Η γραμμή πλοήγησης θα είναι κρυμμένη κατά την αναπαραγωγή Shorts + Η γραμμή πλοήγησης εμφανίζεται κατά την αναπαραγωγή Shorts + + + Προτεινόμενο βίντεο τελικής οθόνης + "Κρυμμένο όταν η αυτόματη αναπαραγωγή είναι απενεργοποιημένη Η αυτόματη αναπαραγωγή μπορεί να αλλαχτεί στις ρυθμίσεις YouTube: Ρυθμίσεις → Αναπαραγωγή→ Αυτόματη αναπαραγωγή επόμενου βίντεο" - Εμφανίζεται - - - Σχετικά βίντεο στην πλήρη οθόνη - Κρυμμένα - Εμφανίζονται - - - Χρονική πρόοδος βίντεο - Κρυμμένη - Εμφανίζεται - - - Αναδυόμενα παράθυρα οθόνης αναπαραγωγής - Κρυμμένα - Εμφανίζονται - - - Έξοδος από την λειτουργία πλήρους οθόνης στο τέλος του βίντεο - Ανενεργό - Κατακόρυφη - Οριζόντια - Κατακόρυφη και οριζόντια - - - Άνοιγμα των βίντεο σε πλήρη οθόνη με κατακόρυφη προβολή - Τα βίντεο ανοίγουν αυτόματα σε λειτουργία πλήρους οθόνης - Τα βίντεο δεν ανοίγουν αυτόματα σε λειτουργία πλήρους οθόνης - - - Αδιαφάνεια φόντου οθόνης αναπαραγωγής - Τιμή αδιαφάνειας μεταξύ 0-100, όπου το 0 είναι διαφανές - Η αδιαφάνεια φόντου οθόνης αναπαραγωγής πρέπει να είναι μεταξύ 0-100 - - - - Dislike προσωρινά μη διαθέσιμα (καθυστέρηση API) - Δεδομένα dislike μη διαθέσιμα (κατάσταση %d) - Δεδομένα dislike μη διαθέσιμα (όριο API πελάτη) - Δεδομένα dislike μη διαθέσιμα (%s) - - Επαναφορτώστε το βίντεο για να ψηφίσετε χρησιμοποιώντας το Return YouTube Dislike - - Κρυμμένα από τον ιδιοκτήτη - Return YouΤube Dislike - Τα «Δεν μου αρέσει» εμφανίζονται - Τα «Δεν μου αρέσει» δεν εμφανίζονται - Εμφάνιση στα Shorts - "Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts + Εμφανίζεται + + + Σχετικά βίντεο στην πλήρη οθόνη + Κρυμμένα + Εμφανίζονται + + + Χρονική πρόοδος βίντεο + Κρυμμένη + Εμφανίζεται + + + Αναδυόμενα παράθυρα οθόνης αναπαραγωγής + Κρυμμένα + Εμφανίζονται + + + Έξοδος από την λειτουργία πλήρους οθόνης στο τέλος του βίντεο + Ανενεργό + Κατακόρυφη + Οριζόντια + Κατακόρυφη και οριζόντια + + + Άνοιγμα των βίντεο σε πλήρη οθόνη με κατακόρυφη προβολή + Τα βίντεο ανοίγουν αυτόματα σε λειτουργία πλήρους οθόνης + Τα βίντεο δεν ανοίγουν αυτόματα σε λειτουργία πλήρους οθόνης + + + Αδιαφάνεια φόντου οθόνης αναπαραγωγής + Τιμή αδιαφάνειας μεταξύ 0-100, όπου το 0 είναι διαφανές + Η αδιαφάνεια φόντου οθόνης αναπαραγωγής πρέπει να είναι μεταξύ 0-100 + + + + Dislike προσωρινά μη διαθέσιμα (καθυστέρηση API) + Δεδομένα dislike μη διαθέσιμα (κατάσταση %d) + Δεδομένα dislike μη διαθέσιμα (όριο API πελάτη) + Δεδομένα dislike μη διαθέσιμα (%s) + + Επαναφορτώστε το βίντεο για να ψηφίσετε χρησιμοποιώντας το Return YouTube Dislike + + Κρυμμένα από τον ιδιοκτήτη + Return YouΤube Dislike + Τα «Δεν μου αρέσει» εμφανίζονται + Τα «Δεν μου αρέσει» δεν εμφανίζονται + Εμφάνιση στα Shorts + "Τα «Δεν μου αρέσει» εμφανίζονται στα Shorts Περιορισμός: Ενδέχεται να μην εμφανίζονται σε ανώνυμη λειτουργία" - Τα «Δεν μου αρέσει» δεν εμφανίζονται στα Shorts - Εμφάνιση ως ποσοστό - Τα «Δεν μου αρέσει» εμφανίζονται ως ποσοστό - Τα «Δεν μου αρέσει» εμφανίζονται ως αριθμός - - Κουμπί «Μου αρέσει» μικρότερου στυλ - Το κουμπί «Μου αρέσει» είναι διαμορφωμένο για ελάχιστο μέγεθος - Το κουμπί «Μου αρέσει» είναι διαμορφωμένο για καλύτερη εμφάνιση - Εμφάνιση των εκτιμώμενων «Μου αρέσει» - Τα βίντεο με απενεργοποιημένα «Μου αρέσει» εμφανίζουν έναν εκτιμώμενο αριθμό «Μου αρέσει» - Τα εκτιμώμενα «Μου αρέσει» δεν εμφανίζονται - Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο - ReturnYouTubeDislike.com - Τα δεδομένα Dislike παρέχονται από το API του Return YouTube Dislike. Πατήστε εδώ για να μάθετε περισσότερα - - Στατιστικά ReturnYouTubeDislike API αυτής της συσκευής - Χρόνος απόκρισης API, μέσος όρος - Χρόνος απόκρισης API, ελάχιστος - Χρόνος απόκρισης API, μέγιστος - Χρόνος απόκρισης API, τελευταίου βίντεο - Δεδομένα dislike προσωρινά μη διαθέσιμα - Όριο ρυθμού πελάτη API σε ισχύ - API ανάκτηση ψήφων, αριθμός κλήσεων - Δεν πραγματοποιήθηκαν κλήσεις δικτύου - Πραγματοποιήθηκαν %d κλήσεις δικτύου - API ανάκτηση ψήφων, αριθμός αποτυχιών - Δεν απέτυχαν κλήσεις δικτύου - απέτυχαν %d κλήσεις δικτύου - Όρια πελατών API - Δεν ανιχνεύτηκαν περιορισμοί ορίου πελάτη - Ανιχνεύθηκαν %d φορές περιορισμοί ορίου πελάτη - %d χιλιοστά δευτερολέπτου - - - Ευρεία γραμμή αναζήτησης - Η ευρεία γραμμή αναζήτησης είναι ενεργοποιημένη - Η ευρεία γραμμή αναζήτησης είναι απενεργοποιημένη - - - Μικρογραφίες υψηλής ποιότητας - Οι μικρογραφίες της γραμμής προόδου είναι υψηλής ποιότητας - Οι μικρογραφίες της γραμμής προόδου είναι μέτριας ποιότητας - Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι υψηλής ποιότητας - Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι μέτριας ποιότητας - "Αυτό θα επαναφέρει επίσης τις μικρογραφίες σε ζωντανές μεταδόσεις που δεν έχουν μικρογραφίες γραμμής προόδου. + Τα «Δεν μου αρέσει» δεν εμφανίζονται στα Shorts + Εμφάνιση ως ποσοστό + Τα «Δεν μου αρέσει» εμφανίζονται ως ποσοστό + Τα «Δεν μου αρέσει» εμφανίζονται ως αριθμός + + Κουμπί «Μου αρέσει» μικρότερου στυλ + Το κουμπί «Μου αρέσει» είναι διαμορφωμένο για ελάχιστο μέγεθος + Το κουμπί «Μου αρέσει» είναι διαμορφωμένο για καλύτερη εμφάνιση + Εμφάνιση των εκτιμώμενων «Μου αρέσει» + Τα βίντεο με απενεργοποιημένα «Μου αρέσει» εμφανίζουν έναν εκτιμώμενο αριθμό «Μου αρέσει» + Τα εκτιμώμενα «Μου αρέσει» δεν εμφανίζονται + Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το Return YouTube Dislike δεν είναι διαθέσιμο + ReturnYouTubeDislike.com + Τα δεδομένα Dislike παρέχονται από το API του Return YouTube Dislike. Πατήστε εδώ για να μάθετε περισσότερα + + Στατιστικά ReturnYouTubeDislike API αυτής της συσκευής + Χρόνος απόκρισης API, μέσος όρος + Χρόνος απόκρισης API, ελάχιστος + Χρόνος απόκρισης API, μέγιστος + Χρόνος απόκρισης API, τελευταίου βίντεο + Δεδομένα dislike προσωρινά μη διαθέσιμα - Όριο ρυθμού πελάτη API σε ισχύ + API ανάκτηση ψήφων, αριθμός κλήσεων + Δεν πραγματοποιήθηκαν κλήσεις δικτύου + Πραγματοποιήθηκαν %d κλήσεις δικτύου + API ανάκτηση ψήφων, αριθμός αποτυχιών + Δεν απέτυχαν κλήσεις δικτύου + απέτυχαν %d κλήσεις δικτύου + Όρια πελατών API + Δεν ανιχνεύτηκαν περιορισμοί ορίου πελάτη + Ανιχνεύθηκαν %d φορές περιορισμοί ορίου πελάτη + %d χιλιοστά δευτερολέπτου + + + Ευρεία γραμμή αναζήτησης + Η ευρεία γραμμή αναζήτησης είναι ενεργοποιημένη + Η ευρεία γραμμή αναζήτησης είναι απενεργοποιημένη + + + Μικρογραφίες υψηλής ποιότητας + Οι μικρογραφίες της γραμμής προόδου είναι υψηλής ποιότητας + Οι μικρογραφίες της γραμμής προόδου είναι μέτριας ποιότητας + Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι υψηλής ποιότητας + Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι μέτριας ποιότητας + "Αυτό θα επαναφέρει επίσης τις μικρογραφίες σε ζωντανές μεταδόσεις που δεν έχουν μικρογραφίες γραμμής προόδου. Οι μικρογραφίες γραμμής αναζήτησης θα χρησιμοποιούν την ίδια ποιότητα με το τρέχον βίντεο. Αυτή η δυνατότητα λειτουργεί καλύτερα με ποιότητα βίντεο 720p ή χαμηλότερη και όταν χρησιμοποιείται μια πολύ γρήγορη σύνδεση στο διαδίκτυο." - Παλιές μικρογραφίες γραμμής προόδου - Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται πάνω από τη γραμμή προόδου - Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται σε πλήρη οθόνη - - - SponsorBlock - Ενεργοποίηση του SponsorBlock - Το SponsorBlock είναι ένα σύστημα που προέρχεται από το κοινό για παράλειψη ενοχλητικών τμημάτων σε βίντεο YouTube - Εμφάνιση - Κουμπί ψηφοφορίας τμημάτων - Το κουμπί ψηφοφορίας τμημάτων εμφανίζεται - Το κουμπί ψηφοφορίας τμημάτων δεν εμφανίζεται - Χρήση τετράγωνης διάταξης - Τα κουμπιά και τα στοιχεία ελέγχου είναι τετράγωνα - Τα κουμπιά και τα στοιχεία ελέγχου είναι στρογγυλεμένα - - Κουμπί παράλειψης μικρότερου στυλ - Το κουμπί παράλειψης είναι διαμορφωμένο για ελάχιστο μέγεθος - Το κουμπί παράλειψης είναι διαμορφωμένο για καλύτερη εμφάνιση - Αυτόματη απόκρυψη κουμπιού παράλειψης - Το κουμπί παράλειψης κρύβεται μετά από μερικά δευτερόλεπτα - Το κουμπί παράλειψης εμφανίζεται σε όλο το τμήμα - Διάρκεια κουμπιού παράλειψης - Διάρκεια εμφάνισης των κουμπιών παράλειψης και μετάβασης στο αποκορύφωμα πριν την αυτόματη απόκρυψη - Εμφάνιση μηνύματος αναίρεσης παράλειψης - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε το μήνυμα για αναίρεση της παράλειψης - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα - Διάρκεια μηνύματος παράλειψης - Διάρκεια εμφάνισης του μηνύματος αναίρεσης παράλειψης - 1 δευτερόλεπτο - 2 δευτερόλεπτα - 3 δευτερόλεπτα - 4 δευτερόλεπτα - 5 δευτερόλεπτα - 6 δευτερόλεπτα - 7 δευτερόλεπτα - 8 δευτερόλεπτα - 9 δευτερόλεπτα - 10 δευτερόλεπτα - Εμφάνιση μήκους βίντεο χωρίς τα τμήματα - Το μήκος του βίντεο χωρίς όλα τα τμήματα εμφανίζεται πάνω στη γραμμή προόδου - Εμφανίζεται το πλήρες μήκος του βίντεο - Δημιουργία νέων τμημάτων - Εμφάνιση κουμπιού δημιουργίας νέου τμήματος - Το κουμπί δημιουργίας νέου τμήματος εμφανίζεται - Το κουμπί δημιουργίας νέου τμήματος δεν εμφανίζεται - Ρύθμιση βήματος νέου τμήματος - Ο αριθμός των χιλιοστών του δευτερολέπτου που θα μετακινείται η ρύθμιση χρόνου κατά τη δημιουργία νέων τμημάτων - Η τιμή πρέπει να είναι θετικός αριθμός - Προβολή οδηγιών - Οι οδηγίες περιέχουν κανόνες και συμβουλές σχετικά με την υποβολή τμημάτων - Ακολουθήστε τις οδηγίες - Διαβάστε τις οδηγίες του SponsorBlock πριν δημιουργήσετε νέα τμήματα - Τις έχω διαβάσει - Δείξτε μου - Γενικά - Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο - Mετρητής παραλείψεων τμημάτων - Επιτρέπει στον πίνακα κατάταξης SponsorBlock να γνωρίζει πόσος χρόνος εξοικονομήθηκε. Αποστέλλεται ένα μήνυμα στον πίνακα κατάταξης κάθε φορά που παραλείπεται ένα τμήμα - Ο μετρητής παραλείψεων δεν είναι ενεργός - Ελάχιστη διάρκεια τμήματος - Τμήματα μικρότερα από την καθορισμένη τιμή (σε δευτερόλεπτα) δεν θα εμφανίζονται ούτε θα παραλείπονται - Μη έγκυρη διάρκεια χρόνου - Το ιδιωτικό σας αναγνωριστικό χρήστη - Αυτό πρέπει να μείνει μυστικό. Είναι σαν έναν κωδικό που δεν πρέπει να μοιραστείτε με κανέναν. Εάν κάποιος αποκτήσει αυτόν τον κωδικό, μπορεί να σας υποδυθεί - Το ιδιωτικό αναγνωριστικό χρήστη πρέπει να είναι τουλάχιστον 30 χαρακτήρες - Αλλαγή διεύθυνσης API - Η διεύθυνση που χρησιμοποιεί το SponsorBlock για να κάνει κλήσεις στο διακομιστή - Η διεύθυνση URL του API επαναφέρθηκε - Η διεύθυνση URL του API δεν είναι έγκυρη - Η διεύθυνση URL του API άλλαξε - Εισαγωγή/Εξαγωγή ρυθμίσεων - Αντιγραφή - Οι ρυθμίσεις SponsorBlock σας σε μορφή JSON που μπορούν να εισαχθούν/εξαχθούν στο ReVanced και σε άλλες πλατφόρμες SponsorBlock - Οι ρυθμίσεις SponsorBlock σας σε μορφή JSON που μπορούν να εισαχθούν/εξαχθούν στο ReVanced και σε άλλες πλατφόρμες SponsorBlock. Αυτό περιλαμβάνει το ιδιωτικό σας αναγνωριστικό χρήστη. Φροντίστε να το μοιραστείτε με σύνεση - Οι ρυθμίσεις εισήχθησαν επιτυχώς - Η εισαγωγή απέτυχε: %s - Η εξαγωγή απέτυχε: %s - "Οι ρυθμίσεις σας περιέχουν ένα ιδιωτικό αναγνωριστικό χρήστη SponsorBlock. + Παλιές μικρογραφίες γραμμής προόδου + Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται πάνω από τη γραμμή προόδου + Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται σε πλήρη οθόνη + + + SponsorBlock + Ενεργοποίηση του SponsorBlock + Το SponsorBlock είναι ένα σύστημα που προέρχεται από το κοινό για παράλειψη ενοχλητικών τμημάτων σε βίντεο YouTube + Εμφάνιση + Κουμπί ψηφοφορίας τμημάτων + Το κουμπί ψηφοφορίας τμημάτων εμφανίζεται + Το κουμπί ψηφοφορίας τμημάτων δεν εμφανίζεται + Χρήση τετράγωνης διάταξης + Τα κουμπιά και τα στοιχεία ελέγχου είναι τετράγωνα + Τα κουμπιά και τα στοιχεία ελέγχου είναι στρογγυλεμένα + + Κουμπί παράλειψης μικρότερου στυλ + Το κουμπί παράλειψης είναι διαμορφωμένο για ελάχιστο μέγεθος + Το κουμπί παράλειψης είναι διαμορφωμένο για καλύτερη εμφάνιση + Αυτόματη απόκρυψη κουμπιού παράλειψης + Το κουμπί παράλειψης κρύβεται μετά από μερικά δευτερόλεπτα + Το κουμπί παράλειψης εμφανίζεται σε όλο το τμήμα + Διάρκεια κουμπιού παράλειψης + Διάρκεια εμφάνισης των κουμπιών παράλειψης και μετάβασης στο αποκορύφωμα πριν την αυτόματη απόκρυψη + Εμφάνιση μηνύματος αναίρεσης παράλειψης + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα. Πατήστε το μήνυμα για αναίρεση της παράλειψης + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν ένα τμήμα παραλείπεται αυτόματα + Διάρκεια μηνύματος παράλειψης + Διάρκεια εμφάνισης του μηνύματος αναίρεσης παράλειψης + 1 δευτερόλεπτο + 2 δευτερόλεπτα + 3 δευτερόλεπτα + 4 δευτερόλεπτα + 5 δευτερόλεπτα + 6 δευτερόλεπτα + 7 δευτερόλεπτα + 8 δευτερόλεπτα + 9 δευτερόλεπτα + 10 δευτερόλεπτα + Εμφάνιση μήκους βίντεο χωρίς τα τμήματα + Το μήκος του βίντεο χωρίς όλα τα τμήματα εμφανίζεται πάνω στη γραμμή προόδου + Εμφανίζεται το πλήρες μήκος του βίντεο + Δημιουργία νέων τμημάτων + Εμφάνιση κουμπιού δημιουργίας νέου τμήματος + Το κουμπί δημιουργίας νέου τμήματος εμφανίζεται + Το κουμπί δημιουργίας νέου τμήματος δεν εμφανίζεται + Ρύθμιση βήματος νέου τμήματος + Ο αριθμός των χιλιοστών του δευτερολέπτου που θα μετακινείται η ρύθμιση χρόνου κατά τη δημιουργία νέων τμημάτων + Η τιμή πρέπει να είναι θετικός αριθμός + Προβολή οδηγιών + Οι οδηγίες περιέχουν κανόνες και συμβουλές σχετικά με την υποβολή τμημάτων + Ακολουθήστε τις οδηγίες + Διαβάστε τις οδηγίες του SponsorBlock πριν δημιουργήσετε νέα τμήματα + Τις έχω διαβάσει + Δείξτε μου + Γενικά + Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το SponsorBlock δεν είναι διαθέσιμο + Mετρητής παραλείψεων τμημάτων + Επιτρέπει στον πίνακα κατάταξης SponsorBlock να γνωρίζει πόσος χρόνος εξοικονομήθηκε. Αποστέλλεται ένα μήνυμα στον πίνακα κατάταξης κάθε φορά που παραλείπεται ένα τμήμα + Ο μετρητής παραλείψεων δεν είναι ενεργός + Ελάχιστη διάρκεια τμήματος + Τμήματα μικρότερα από την καθορισμένη τιμή (σε δευτερόλεπτα) δεν θα εμφανίζονται ούτε θα παραλείπονται + Μη έγκυρη διάρκεια χρόνου + Το ιδιωτικό σας αναγνωριστικό χρήστη + Αυτό πρέπει να μείνει μυστικό. Είναι σαν έναν κωδικό που δεν πρέπει να μοιραστείτε με κανέναν. Εάν κάποιος αποκτήσει αυτόν τον κωδικό, μπορεί να σας υποδυθεί + Το ιδιωτικό αναγνωριστικό χρήστη πρέπει να είναι τουλάχιστον 30 χαρακτήρες + Αλλαγή διεύθυνσης API + Η διεύθυνση που χρησιμοποιεί το SponsorBlock για να κάνει κλήσεις στο διακομιστή + Η διεύθυνση URL του API επαναφέρθηκε + Η διεύθυνση URL του API δεν είναι έγκυρη + Η διεύθυνση URL του API άλλαξε + Εισαγωγή/Εξαγωγή ρυθμίσεων + Αντιγραφή + Οι ρυθμίσεις SponsorBlock σας σε μορφή JSON που μπορούν να εισαχθούν/εξαχθούν στο ReVanced και σε άλλες πλατφόρμες SponsorBlock + Οι ρυθμίσεις SponsorBlock σας σε μορφή JSON που μπορούν να εισαχθούν/εξαχθούν στο ReVanced και σε άλλες πλατφόρμες SponsorBlock. Αυτό περιλαμβάνει το ιδιωτικό σας αναγνωριστικό χρήστη. Φροντίστε να το μοιραστείτε με σύνεση + Οι ρυθμίσεις εισήχθησαν επιτυχώς + Η εισαγωγή απέτυχε: %s + Η εξαγωγή απέτυχε: %s + "Οι ρυθμίσεις σας περιέχουν ένα ιδιωτικό αναγνωριστικό χρήστη SponsorBlock. Το αναγνωριστικό χρήστη σας είναι σαν κωδικός πρόσβασης και δεν πρέπει ποτέ να μοιράζεται." - Να μην εμφανιστεί ξανά - Αλλαγή συμπεριφοράς τμημάτων - Χορηγός - Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι για αυτοπροώθηση ή δωρεάν αναφορές σε σκοπούς/δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν - Αυτοπροώθηση Αφιλοκερδώς - Παρόμοιο με το «Χορηγός» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Περιλαμβάνει τμήματα σχετικά με εμπορεύματα, δωρεές ή πληροφορίες για το με ποιους συνεργάστηκαν - Υπενθύμιση Αλληλεπίδρασης (Εγγραφή) - Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στην μέση του περιεχομένου. Αν είναι μεγάλο ή αφορά κάτι συγκεκριμένο, θα πρέπει να είναι στην κατηγορία αυτοπροώθησης - Αποκορύφωμα - Το μέρος του βίντεο που ψάχνουν οι περισσότεροι άνθρωποι - Διάλειμμα/Εισαγωγή - Χρονικό διάστημα χωρίς πραγματικό περιεχόμενο. Θα μπορούσε να είναι μια παύση, ένα στατικό καρέ ή μια επαναλαμβανόμενη κίνηση. Δεν περιλαμβάνει μεταβάσεις που περιέχουν πληροφορίες - Τελική Οθόνη / Συντελεστές - Όταν εμφανίζονται οι συντελεστές ή τα προτεινόμενα βίντεο των καναλιών. Όχι για επίλογους που περιέχουν πληροφορίες - Έναρξη / Χαιρετισμοί - Αφηγηματικά τρέιλερ για το επερχόμενο βίντεο, χαιρετισμοί και αποχαιρετισμοί. Δεν περιλαμβάνει τμήματα που προσθέτουν επιπλέον περιεχόμενο - Προεπισκόπηση / Περίληψη - Συλλογή από κλιπ που δείχνουν τι έρχεται ή τι συνέβη στο βίντεο ή σε άλλα βίντεο μιας σειράς, όπου όλες οι πληροφορίες επαναλαμβάνονται αλλού - Εφαπτομενικές Σκηνές / Αστεία - Παρεμβατικές σκηνές ή αστεία που δεν είναι απαραίτητα για την κατανόηση του κύριου περιεχομένου του βίντεο. Δεν περιλαμβάνει τμήματα που παρέχουν πλαίσιο ή λεπτομέρειες υποβάθρου - Μουσική: Τμήμα χωρίς μουσική - Μόνο για χρήση σε βίντεο μουσικής. Τμήματα χωρίς μουσική σε βίντεο μουσικής, που δεν καλύπτονται ήδη από άλλη κατηγορία - Παράλειψη - Αποκορύφωμα - Παράλειψη χορηγού - Παράλειψη προώθησης - Παράλειψη αλληλεπίδρασης - Μετάβαση στο αποκορύφωμα - Παράλειψη εισαγωγής - Παράλειψη διακοπής - Παράλειψη διακοπής - Παράλειψη επιλόγου - Παράλειψη έναρξης - Παράλειψη προεπισκόπησης - Παράλειψη προεπισκόπησης - Παράλειψη περίληψης - Παράλειψη σπατάλης χρόνου - Παράλειψη μη-μουσικού - Παράλειψη τμήματος - Παραλείφθηκε ο χορηγός - Παραλείφθηκε η αυτοπροώθηση - Παραλείφθηκε η ενοχλητική υπενθύμιση - Έγινε μετάβαση στο αποκορύφωμα - Παραλείφθηκε η εισαγωγή - Παραλείφθηκε η διακοπή - Παραλείφθηκε η διακοπή - Παραλείφθηκε ο επίλογος - Παραλείφθηκε η έναρξη - Παραλείφθηκε η προεπισκόπηση - Παραλείφθηκε η προεπισκόπηση - Παραλείφθηκε η περίληψη - Παραλείφθηκε η σπατάλη χρόνου - Παραλείφθηκε τμήμα χωρίς μουσική - Παραλήφθηκε μη υποβληθέν τμήμα - Παραλείφθηκαν πολλαπλά τμήματα - Αυτόματη παράλειψη - Αυτόματη παράλειψη μία φορά - Εμφάνιση κουμπιού παράλειψης - Εμφάνιση στη γραμμή προόδου - Απενεργοποίηση - Αδυναμία υποβολής τμήματος: %s - Το SponsorBlock είναι προσωρινά εκτός λειτουργίας - Αδυναμία υποβολής τμήματος (κατάσταση: %1$d %2$s) - Αδυναμία υποβολής τμήματος. Όριο Συχνότητας (πάρα πολλά από τον ίδιο χρήστη ή την IP) - Αδυναμία υποβολής του τμήματος: %s - "Δεν είναι δυνατή η υποβολή του τμήματος. + Να μην εμφανιστεί ξανά + Αλλαγή συμπεριφοράς τμημάτων + Χορηγός + Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι για αυτοπροώθηση ή δωρεάν αναφορές σε σκοπούς/δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν + Αυτοπροώθηση Αφιλοκερδώς + Παρόμοιο με το «Χορηγός» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Περιλαμβάνει τμήματα σχετικά με εμπορεύματα, δωρεές ή πληροφορίες για το με ποιους συνεργάστηκαν + Υπενθύμιση Αλληλεπίδρασης (Εγγραφή) + Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στην μέση του περιεχομένου. Αν είναι μεγάλο ή αφορά κάτι συγκεκριμένο, θα πρέπει να είναι στην κατηγορία αυτοπροώθησης + Αποκορύφωμα + Το μέρος του βίντεο που ψάχνουν οι περισσότεροι άνθρωποι + Διάλειμμα/Εισαγωγή + Χρονικό διάστημα χωρίς πραγματικό περιεχόμενο. Θα μπορούσε να είναι μια παύση, ένα στατικό καρέ ή μια επαναλαμβανόμενη κίνηση. Δεν περιλαμβάνει μεταβάσεις που περιέχουν πληροφορίες + Τελική Οθόνη / Συντελεστές + Όταν εμφανίζονται οι συντελεστές ή τα προτεινόμενα βίντεο των καναλιών. Όχι για επίλογους που περιέχουν πληροφορίες + Έναρξη / Χαιρετισμοί + Αφηγηματικά τρέιλερ για το επερχόμενο βίντεο, χαιρετισμοί και αποχαιρετισμοί. Δεν περιλαμβάνει τμήματα που προσθέτουν επιπλέον περιεχόμενο + Προεπισκόπηση / Περίληψη + Συλλογή από κλιπ που δείχνουν τι έρχεται ή τι συνέβη στο βίντεο ή σε άλλα βίντεο μιας σειράς, όπου όλες οι πληροφορίες επαναλαμβάνονται αλλού + Εφαπτομενικές Σκηνές / Αστεία + Παρεμβατικές σκηνές ή αστεία που δεν είναι απαραίτητα για την κατανόηση του κύριου περιεχομένου του βίντεο. Δεν περιλαμβάνει τμήματα που παρέχουν πλαίσιο ή λεπτομέρειες υποβάθρου + Μουσική: Τμήμα χωρίς μουσική + Μόνο για χρήση σε βίντεο μουσικής. Τμήματα χωρίς μουσική σε βίντεο μουσικής, που δεν καλύπτονται ήδη από άλλη κατηγορία + Παράλειψη + Αποκορύφωμα + Παράλειψη χορηγού + Παράλειψη προώθησης + Παράλειψη αλληλεπίδρασης + Μετάβαση στο αποκορύφωμα + Παράλειψη εισαγωγής + Παράλειψη διακοπής + Παράλειψη διακοπής + Παράλειψη επιλόγου + Παράλειψη έναρξης + Παράλειψη προεπισκόπησης + Παράλειψη προεπισκόπησης + Παράλειψη περίληψης + Παράλειψη σπατάλης χρόνου + Παράλειψη μη-μουσικού + Παράλειψη τμήματος + Παραλείφθηκε ο χορηγός + Παραλείφθηκε η αυτοπροώθηση + Παραλείφθηκε η ενοχλητική υπενθύμιση + Έγινε μετάβαση στο αποκορύφωμα + Παραλείφθηκε η εισαγωγή + Παραλείφθηκε η διακοπή + Παραλείφθηκε η διακοπή + Παραλείφθηκε ο επίλογος + Παραλείφθηκε η έναρξη + Παραλείφθηκε η προεπισκόπηση + Παραλείφθηκε η προεπισκόπηση + Παραλείφθηκε η περίληψη + Παραλείφθηκε η σπατάλη χρόνου + Παραλείφθηκε τμήμα χωρίς μουσική + Παραλήφθηκε μη υποβληθέν τμήμα + Παραλείφθηκαν πολλαπλά τμήματα + Αυτόματη παράλειψη + Αυτόματη παράλειψη μία φορά + Εμφάνιση κουμπιού παράλειψης + Εμφάνιση στη γραμμή προόδου + Απενεργοποίηση + Αδυναμία υποβολής τμήματος: %s + Το SponsorBlock είναι προσωρινά εκτός λειτουργίας + Αδυναμία υποβολής τμήματος (κατάσταση: %1$d %2$s) + Αδυναμία υποβολής τμήματος. Όριο Συχνότητας (πάρα πολλά από τον ίδιο χρήστη ή την IP) + Αδυναμία υποβολής του τμήματος: %s + "Δεν είναι δυνατή η υποβολή του τμήματος. Υπάρχει ήδη" - Το τμήμα υποβλήθηκε επιτυχώς - - SponsorBlock προσωρινά μη διαθέσιμο (καθυστέρηση API) - SponsorBlock προσωρινά μη διαθέσιμο (κατάσταση %d) - SponsorBlock προσωρινά μη διαθέσιμο - Αδυναμία ψηφοφορίας για το τμήμα (χρονοκαθυστέρηση API) - Αδυναμία ψηφοφορίας για το τμήμα (κατάσταση: %1$d %2$s) - Αδυναμία ψηφοφορίας για το τμήμα: %s - Θετική ψήφος - Αρνητική ψήφος - Αλλαγή κατηγορίας - Δεν υπάρχουν τμήματα για να ψηφίσετε - - %1$s έως %2$s - Επιλέξτε την κατηγορία του τμήματος - Η κατηγορία είναι απενεργοποιημένη στις ρυθμίσεις. Ενεργοποιήστε την κατηγορία για υποβολή. - Νέο τμήμα SponsorBlock - Ορισμός %s ως αρχή ή τέλος ενός νέου τμήματος; - Αρχή - Τέλος - Τώρα - Χρόνος έναρξης του τμήματος - Χρόνος λήξης του τμήματος - Είναι σωστοί οι χρόνοι; - "Το τμήμα είναι από το + Το τμήμα υποβλήθηκε επιτυχώς + + SponsorBlock προσωρινά μη διαθέσιμο (καθυστέρηση API) + SponsorBlock προσωρινά μη διαθέσιμο (κατάσταση %d) + SponsorBlock προσωρινά μη διαθέσιμο + Αδυναμία ψηφοφορίας για το τμήμα (χρονοκαθυστέρηση API) + Αδυναμία ψηφοφορίας για το τμήμα (κατάσταση: %1$d %2$s) + Αδυναμία ψηφοφορίας για το τμήμα: %s + Θετική ψήφος + Αρνητική ψήφος + Αλλαγή κατηγορίας + Δεν υπάρχουν τμήματα για να ψηφίσετε + + %1$s έως %2$s + Επιλέξτε την κατηγορία του τμήματος + Η κατηγορία είναι απενεργοποιημένη στις ρυθμίσεις. Ενεργοποιήστε την κατηγορία για υποβολή. + Νέο τμήμα SponsorBlock + Ορισμός %s ως αρχή ή τέλος ενός νέου τμήματος; + Αρχή + Τέλος + Τώρα + Χρόνος έναρξης του τμήματος + Χρόνος λήξης του τμήματος + Είναι σωστοί οι χρόνοι; + "Το τμήμα είναι από το %1$s έως το @@ -1293,47 +1292,47 @@ Second \"item\" text" (%3$s) Είστε έτοιμοι για υποβολή;" - Η αρχή πρέπει να είναι πριν από το τέλος - Σημειώστε δύο σημεία στην γραμμή προόδου πρώτα - Κάντε προεπισκόπηση του τμήματος, και σιγουρευτείτε ότι παραλείπεται σωστά - Επεξεργασία χρονισμού του τμήματος χειροκίνητα - Θέλετε να επεξεργαστείτε τον χρονισμό του τμήματος από την αρχή ή από το τέλος του τμήματος; - Δόθηκε μη έγκυρος χρόνος - Στατιστικά - - Στατιστικά προσωρινά μη διαθέσιμα (API εκτός λειτουργίας) - Φόρτωση... - Το SponsorBlock είναι απενεργοποιημένο - Το όνομα χρήστη σας: <b>%s</b> - Πατήστε για να αλλάξετε το όνομα χρήστη σας - Αδυναμία αλλαγής ονόματος χρήστη: Κατάσταση: %1$d %2$s - Το όνομα χρήστη άλλαξε επιτυχώς - Η φήμη σας είναι <b>%.2f</b> - Δημιουργήσατε <b>%s</b> τμήματα - Πατήστε για να δείτε τα τμήματα σας - Πίνακας κατάταξης SponsorBlock - Έχετε σώσει τους συνανθρώπους σας από <b>%s</b> τμήματα - Πατήστε για να δείτε τα παγκόσμια στατιστικά και τους κορυφαίους συνεισφέροντες - Αυτό είναι <b>%s</b> από τις ζωές τους.<br>Πατήστε για να δείτε τον πίνακα κατάταξης - Έχετε παραλείψει <b>%s</b> τμήματα - Δηλαδή <b>%s</b> - Επαναφορά του μετρητή τμημάτων που παραλείφθηκαν; - %1$s ώρες %2$s λεπτά - %1$s λεπτά %2$s δευτερόλεπτα - %s δευτερόλεπτα - Αδιαφάνεια: - Χρώμα: - Σχετικά με - sponsor.ajay.app - Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες - - - Αλλαγή μορφής διάταξης - Προεπιλογή - Τηλέφωνο - Ταμπλετ - Αυτοκίνητο - "Οι αλλαγές περιλαμβάνουν: + Η αρχή πρέπει να είναι πριν από το τέλος + Σημειώστε δύο σημεία στην γραμμή προόδου πρώτα + Κάντε προεπισκόπηση του τμήματος, και σιγουρευτείτε ότι παραλείπεται σωστά + Επεξεργασία χρονισμού του τμήματος χειροκίνητα + Θέλετε να επεξεργαστείτε τον χρονισμό του τμήματος από την αρχή ή από το τέλος του τμήματος; + Δόθηκε μη έγκυρος χρόνος + Στατιστικά + + Στατιστικά προσωρινά μη διαθέσιμα (API εκτός λειτουργίας) + Φόρτωση... + Το SponsorBlock είναι απενεργοποιημένο + Το όνομα χρήστη σας: <b>%s</b> + Πατήστε για να αλλάξετε το όνομα χρήστη σας + Αδυναμία αλλαγής ονόματος χρήστη: Κατάσταση: %1$d %2$s + Το όνομα χρήστη άλλαξε επιτυχώς + Η φήμη σας είναι <b>%.2f</b> + Δημιουργήσατε <b>%s</b> τμήματα + Πατήστε για να δείτε τα τμήματα σας + Πίνακας κατάταξης SponsorBlock + Έχετε σώσει τους συνανθρώπους σας από <b>%s</b> τμήματα + Πατήστε για να δείτε τα παγκόσμια στατιστικά και τους κορυφαίους συνεισφέροντες + Αυτό είναι <b>%s</b> από τις ζωές τους.<br>Πατήστε για να δείτε τον πίνακα κατάταξης + Έχετε παραλείψει <b>%s</b> τμήματα + Δηλαδή <b>%s</b> + Επαναφορά του μετρητή τμημάτων που παραλείφθηκαν; + %1$s ώρες %2$s λεπτά + %1$s λεπτά %2$s δευτερόλεπτα + %s δευτερόλεπτα + Αδιαφάνεια: + Χρώμα: + Σχετικά με + sponsor.ajay.app + Τα δεδομένα παρέχονται από το SponsorBlock API. Πατήστε για να μάθετε περισσότερα και να δείτε λήψεις για άλλες πλατφόρμες + + + Αλλαγή μορφής διάταξης + Προεπιλογή + Τηλέφωνο + Ταμπλετ + Αυτοκίνητο + "Οι αλλαγές περιλαμβάνουν: Διάταξη tablet • Οι δημοσιεύσεις κοινότητας δεν εμφανίζονται @@ -1341,327 +1340,327 @@ Second \"item\" text" Διάταξη αυτοκινήτου • Τα Shorts ανοίγουν στην κανονική οθόνη αναπαραγωγής • Η ροή οργανώνεται ανά θέματα και κανάλια" - - - Παραποίηση έκδοσης εφαρμογής - Η έκδοση παραποιείται - Η έκδοση δεν παραποιείται - "Η έκδοση της εφαρμογής YouTube θα παραποιηθεί σε παλιότερη. + + + Παραποίηση έκδοσης εφαρμογής + Η έκδοση παραποιείται + Η έκδοση δεν παραποιείται + "Η έκδοση της εφαρμογής YouTube θα παραποιηθεί σε παλιότερη. Αυτό θα αλλάξει την εμφάνιση και τα χαρακτηριστικά της εφαρμογής, αλλά ενδέχεται να εμφανιστούν άγνωστες παρενέργειες. Αν αργότερα απενεργοποιηθεί, συνιστάται η εκκαθάριση δεδομένων της εφαρμογής για την αποφυγή σφαλμάτων UI." - Έκδοση παραποίησης της εφαρμογής - 20.13.41 - Επαναφορά της μη συμπτυγμένης γραμμής ενεργειών βίντεο - 20.05.46 - Επαναφορά λειτουργικότητας μεταγραφής - 19.35.36 - Επαναφορά των παλιών εικονιδίων της οθόνης αναπαραγωγής Shorts - 19.01.34 - Επαναφορά παλιών εικονιδίων γραμμής πλοήγησης - - - Αλλαγή αρχικής σελίδας - Προεπιλογή - Όλες οι εγγραφές - Περιήγηση καναλιών - Μαθήματα / Εκμάθηση - Εξερεύνηση - Μόδα & ομορφιά - Παιχνίδια - Ιστορικό - Βιβλιοθήκη - Βίντεο που σας αρέσουν - Ζωντανά - Ταινίες - Μουσική - Ειδήσεις - Ειδοποιήσεις - Λίστες αναπαραγωγής - Αναζήτηση - Shopping - Shorts - Αθλητικά - Εγγραφές - Τάσεις - Εικονική Πραγματικότητα - Παρακολούθηση αργότερα - Τα κλιπ σας - Να αλλάζει πάντα η αρχική σελίδα - "Η αρχική σελίδα αλλάζει πάντα + Έκδοση παραποίησης της εφαρμογής + 20.13.41 - Επαναφορά της μη συμπτυγμένης γραμμής ενεργειών βίντεο + 20.05.46 - Επαναφορά λειτουργικότητας μεταγραφής + 19.35.36 - Επαναφορά των παλιών εικονιδίων της οθόνης αναπαραγωγής Shorts + 19.01.34 - Επαναφορά παλιών εικονιδίων γραμμής πλοήγησης + + + Αλλαγή αρχικής σελίδας + Προεπιλογή + Όλες οι εγγραφές + Περιήγηση καναλιών + Μαθήματα / Εκμάθηση + Εξερεύνηση + Μόδα & ομορφιά + Παιχνίδια + Ιστορικό + Βιβλιοθήκη + Βίντεο που σας αρέσουν + Ζωντανά + Ταινίες + Μουσική + Ειδήσεις + Ειδοποιήσεις + Λίστες αναπαραγωγής + Αναζήτηση + Shopping + Shorts + Αθλητικά + Εγγραφές + Τάσεις + Εικονική Πραγματικότητα + Παρακολούθηση αργότερα + Τα κλιπ σας + Να αλλάζει πάντα η αρχική σελίδα + "Η αρχική σελίδα αλλάζει πάντα Περιορισμός: Η χρήση του κουμπιού επιστροφής στη γραμμή εργαλείων ενδέχεται να μην λειτουργεί" - Η αρχική σελίδα αλλάζει μόνο κατά την εκκίνηση της εφαρμογής - - - Απενεργοποίηση συνέχισης των Shorts - Η αναπαραγωγή Shorts δε θα συνεχίζεται κατά την εκκίνηση της εφαρμογής - Η αναπαραγωγή Shorts θα συνεχίζεται κατά την εκκίνηση της εφαρμογής - - - Άνοιγμα Shorts με - Οθόνη αναπαραγωγής Shorts - Οθόνη αναπαραγωγής κανονικών βίντεο - Πλήρη οθόνη αναπαραγωγής κανονικών βίντεο - - - Αυτόματη αναπαραγωγή Shorts - Τα επόμενα Shorts θα αναπαράγονται αυτόματα - Τα Shorts θα επαναλαμβάνονται - Αυτόματη αναπαραγωγή Shorts στο παρασκήνιο - Τα επόμενα Shorts θα αναπαράγονται αυτόματα στο παρασκήνιο - Τα Shorts στο παρασκήνιο θα επαναλαμβάνονται - - - Ελαχιστοποιημένη οθόνη αναπαραγωγής - Αλλαγή του στυλ της ελαχιστοποιημένης οθόνης αναπαραγωγής της εφαρμογής - Τύπος ελαχιστοποιημένης οθόνης αναπαραγωγής - Απενεργοποιημένη - Προεπιλογή - Μινιμαλιστική - Ταμπλετ - Μοντέρνος 1 - Μοντέρνος 2 - Μοντέρνος 3 - Μοντέρνος 4 - Απενεργοποίηση στρογγυλεμένων γωνιών - Οι γωνίες είναι τετράγωνες - Οι γωνίες είναι στρογγυλεμένες - Διπλό πάτημα & τσίμπημα για αλλαγή μεγέθους - "Η λειτουργία διπλού πατήματος και τσιμπήματος για αλλαγή μεγέθους είναι ενεργοποιημένη + Η αρχική σελίδα αλλάζει μόνο κατά την εκκίνηση της εφαρμογής + + + Απενεργοποίηση συνέχισης των Shorts + Η αναπαραγωγή Shorts δε θα συνεχίζεται κατά την εκκίνηση της εφαρμογής + Η αναπαραγωγή Shorts θα συνεχίζεται κατά την εκκίνηση της εφαρμογής + + + Άνοιγμα Shorts με + Οθόνη αναπαραγωγής Shorts + Οθόνη αναπαραγωγής κανονικών βίντεο + Πλήρη οθόνη αναπαραγωγής κανονικών βίντεο + + + Αυτόματη αναπαραγωγή Shorts + Τα επόμενα Shorts θα αναπαράγονται αυτόματα + Τα Shorts θα επαναλαμβάνονται + Αυτόματη αναπαραγωγή Shorts στο παρασκήνιο + Τα επόμενα Shorts θα αναπαράγονται αυτόματα στο παρασκήνιο + Τα Shorts στο παρασκήνιο θα επαναλαμβάνονται + + + Ελαχιστοποιημένη οθόνη αναπαραγωγής + Αλλαγή του στυλ της ελαχιστοποιημένης οθόνης αναπαραγωγής της εφαρμογής + Τύπος ελαχιστοποιημένης οθόνης αναπαραγωγής + Απενεργοποιημένη + Προεπιλογή + Μινιμαλιστική + Ταμπλετ + Μοντέρνος 1 + Μοντέρνος 2 + Μοντέρνος 3 + Μοντέρνος 4 + Απενεργοποίηση στρογγυλεμένων γωνιών + Οι γωνίες είναι τετράγωνες + Οι γωνίες είναι στρογγυλεμένες + Διπλό πάτημα & τσίμπημα για αλλαγή μεγέθους + "Η λειτουργία διπλού πατήματος και τσιμπήματος για αλλαγή μεγέθους είναι ενεργοποιημένη • Πατήστε δύο φορές για να αυξήσετε το μέγεθος της ελαχιστοποιημένης οθόνης • Πατήστε ξανά δύο φορές για επαναφορά στο αρχικό της μέγεθος" - Η λειτουργία διπλού πατήματος και τσιμπήματος για αλλαγή μεγέθους είναι απενεργοποιημένη - Απενεργοποίηση λειτουργίας μεταφοράς και απόθεσης - Η λειτουργία μεταφοράς και απόθεσης είναι απενεργοποιημένη - "Η λειτουργία μεταφοράς και απόθεσης είναι ενεργοποιημένη + Η λειτουργία διπλού πατήματος και τσιμπήματος για αλλαγή μεγέθους είναι απενεργοποιημένη + Απενεργοποίηση λειτουργίας μεταφοράς και απόθεσης + Η λειτουργία μεταφοράς και απόθεσης είναι απενεργοποιημένη + "Η λειτουργία μεταφοράς και απόθεσης είναι ενεργοποιημένη Η ελαχιστοποιημένη οθόνη αναπαραγωγής μπορεί να μετακινηθεί σε οποιαδήποτε γωνία της οθόνης" - Απενεργοποίηση χειρονομίας οριζόντιας σύρσης - Η χειρονομία οριζόντιας σύρσης είναι απενεργοποιημένη - "Η χειρονομία οριζόντιας σύρσης είναι ενεργοποιημένη + Απενεργοποίηση χειρονομίας οριζόντιας σύρσης + Η χειρονομία οριζόντιας σύρσης είναι απενεργοποιημένη + "Η χειρονομία οριζόντιας σύρσης είναι ενεργοποιημένη Η ελαχιστοποιημένη οθόνη μπορεί να συρθεί εκτός οθόνης προς τα αριστερά ή δεξιά" - Κουμπιά επικάλυψης οθόνης αναπαραγωγής - Κρυμμένα - Εμφανίζονται - Κουμπιά επέκτασης και κλεισίματος - "Κρυμμένα. + Κουμπιά επικάλυψης οθόνης αναπαραγωγής + Κρυμμένα + Εμφανίζονται + Κουμπιά επέκτασης και κλεισίματος + "Κρυμμένα. Σύρετε την ελαχιστοποιημένη οθόνη αναπαραγωγής για επέκταση ή κλείσιμο του βίντεο." - Εμφανίζονται. - Κείμενα οθόνης αναπαραγωγής - Κρυμμένα - Εμφανίζονται - Κουμπιά παράλειψης και επιστροφής - Κρυμμένα - Εμφανίζονται - Αρχικό μέγεθος - Αρχικό μέγεθος οθόνης, σε pixel - Τα pixel πρέπει να είναι μεταξύ %1$s και %2$s - Αδιαφάνεια φόντου παρασκηνίου - Τιμή αδιαφάνειας μεταξύ 0-100, όπου το 0 είναι διαφανές - Η αδιαφάνεια φόντου οθόνης αναπαραγωγής πρέπει να είναι μεταξύ 0-100 - - - Διαβάθμιση οθόνης φόρτωσης - Η οθόνη φόρτωσης θα έχει σταδιακές αποχρώσεις φόντο - Η οθόνη φόρτωσης θα έχει στατική απόχρωση φόντο - Στυλ οθόνης εκκίνησης - Χρωματιστή - Ασπρόμαυρη - Προσαρμοσμένο χρώμα γραμμής προόδου - Η γραμμή προόδου εμφανίζεται με προσαρμοσμένο χρώμα - Η γραμμή προόδου εμφανίζεται με το αρχικό χρώμα - Προσαρμοσμένο χρώμα γραμμής προόδου - Το χρώμα της γραμμής προόδου - Προσαρμοσμένο χρώμα έμφασης γραμμής προόδου - Το χρώμα έμφασης της γραμμής προόδου - Μη έγκυρη τιμή χρώματος γραμμής προόδου - - - YouTube ReVanced - YT ReVanced - YT - - - Λογότυπο επικεφαλίδας - Προεπιλογή - Κανονικό - Premium - ReVanced - - ReVanced απλό - Προσαρμοσμένο - - - Παράκαμψη μπλοκαρίσματος φόρτωσης εικόνων - Χρησιμοποιείται το domain yt4.ggpht.com για την φόρτωση εικόνων - "Χρησιμοποιείται το αρχικό domain για την φόρτωση εικόνων + Εμφανίζονται. + Κείμενα οθόνης αναπαραγωγής + Κρυμμένα + Εμφανίζονται + Κουμπιά παράλειψης και επιστροφής + Κρυμμένα + Εμφανίζονται + Αρχικό μέγεθος + Αρχικό μέγεθος οθόνης, σε pixel + Τα pixel πρέπει να είναι μεταξύ %1$s και %2$s + Αδιαφάνεια φόντου παρασκηνίου + Τιμή αδιαφάνειας μεταξύ 0-100, όπου το 0 είναι διαφανές + Η αδιαφάνεια φόντου οθόνης αναπαραγωγής πρέπει να είναι μεταξύ 0-100 + + + Διαβάθμιση οθόνης φόρτωσης + Η οθόνη φόρτωσης θα έχει σταδιακές αποχρώσεις φόντο + Η οθόνη φόρτωσης θα έχει στατική απόχρωση φόντο + Στυλ οθόνης εκκίνησης + Χρωματιστή + Ασπρόμαυρη + Προσαρμοσμένο χρώμα γραμμής προόδου + Η γραμμή προόδου εμφανίζεται με προσαρμοσμένο χρώμα + Η γραμμή προόδου εμφανίζεται με το αρχικό χρώμα + Προσαρμοσμένο χρώμα γραμμής προόδου + Το χρώμα της γραμμής προόδου + Προσαρμοσμένο χρώμα έμφασης γραμμής προόδου + Το χρώμα έμφασης της γραμμής προόδου + Μη έγκυρη τιμή χρώματος γραμμής προόδου + + + YouTube ReVanced + YT ReVanced + YT + + + Λογότυπο επικεφαλίδας + Προεπιλογή + Κανονικό + Premium + ReVanced + + ReVanced απλό + Προσαρμοσμένο + + + Παράκαμψη μπλοκαρίσματος φόρτωσης εικόνων + Χρησιμοποιείται το domain yt4.ggpht.com για την φόρτωση εικόνων + "Χρησιμοποιείται το αρχικό domain για την φόρτωση εικόνων Η ενεργοποίηση αυτής της ρύθμισης μπορεί να διορθώσει την φόρτωση εικόνων που είναι μπλοκαρισμένες σε ορισμένες περιοχές" - - - - Καρτέλα «Αρχική» - - Καρτέλα «Εγγραφές» - - Καρτέλα «Εσείς» - Λίστες αναπαραγωγής & προτάσεις - Αποτελέσματα αναζήτησης - Αρχικές μικρογραφίες - DeArrow & Αρχικές μικρογραφίες - DeArrow & Ακίνητα καρέ - Ακίνητα καρέ - DeArrow - "Το DeArrow παρέχει μικρογραφίες από το κοινό για τα βίντεο. Οι μικρογραφίες αυτές είναι συχνά πιο σχετικές από εκείνες που παρέχει το ίδιο το YouTube. Αν ενεργοποιηθεί, οι διευθύνσεις URL των βίντεο θα στέλνονται στον διακομιστή API χωρίς να στέλνονται άλλα δεδομένα. Αν κάποιο βίντεο δεν έχει μικρογραφίες DeArrow, θα εμφανιστούν είτε οι αρχικές του μικρογραφίες είτε λήψεις ακίνητων καρέ. + + + + Καρτέλα «Αρχική» + + Καρτέλα «Εγγραφές» + + Καρτέλα «Εσείς» + Λίστες αναπαραγωγής & προτάσεις + Αποτελέσματα αναζήτησης + Αρχικές μικρογραφίες + DeArrow & Αρχικές μικρογραφίες + DeArrow & Ακίνητα καρέ + Ακίνητα καρέ + DeArrow + "Το DeArrow παρέχει μικρογραφίες από το κοινό για τα βίντεο. Οι μικρογραφίες αυτές είναι συχνά πιο σχετικές από εκείνες που παρέχει το ίδιο το YouTube. Αν ενεργοποιηθεί, οι διευθύνσεις URL των βίντεο θα στέλνονται στον διακομιστή API χωρίς να στέλνονται άλλα δεδομένα. Αν κάποιο βίντεο δεν έχει μικρογραφίες DeArrow, θα εμφανιστούν είτε οι αρχικές του μικρογραφίες είτε λήψεις ακίνητων καρέ. Πατήστε για να μάθετε περισσότερα για το DeArrow" - Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο - Διεύθυνση API του DeArrow - Η διεύθυνση URL του τελικού σημείου αποθήκευσης μικρογραφιών DeArrow - Λήψεις ακίνητων καρέ - Τα ακίνητα καρέ λαμβάνονται από την αρχή/μέση/τέλος κάθε βίντεο. Αυτές οι εικόνες είναι ενσωματωμένες στο YouTube και δεν χρησιμοποιείται εξωτερικό API - Χρήση γρήγορων λήψεων καρέ - Χρησιμοποιούνται ακίνητα καρέ μέτριας ποιότητας. Οι μικρογραφίες θα φορτώνουν γρηγορότερα, αλλά τα ζωντανά, μη κυκλοφορημένα η πολύ παλιά βίντεο ενδέχεται να εμφανίζουν κενές μικρογραφίες - Χρησιμοποιούνται ακίνητα καρέ υψηλής ποιότητας - Ο χρόνος του βίντεο από τον οποίο θα ληφθούν τα καρέ - Αρχή του βίντεο - Μέση του βίντεο - Τέλος του βίντεο - - DeArrow προσωρινά μη διαθέσιμο (κωδικός: %s) - DeArrow προσωρινά μη διαθέσιμο - - - Εμφάνιση ανακοινώσεων ReVanced - Οι ανακοινώσεις κατά την εκκίνηση εμφανίζονται - Οι ανακοινώσεις κατά την εκκίνηση δεν εμφανίζονται - Εμφάνιση ανακοινώσεων κατά την εκκίνηση - Αποτυχία σύνδεσης με τον πάροχο ανακοινώσεων - Παράλειψη - - - Αυτόματη επανάληψη βίντεο - Το βίντεο θα αναπαράγεται σε επανάληψη - Το βίντεο δεν θα επαναληφθεί - - - Εμφάνιση κουμπιού επανάληψης βίντεο - Το κουμπί εμφανίζεται - Το κουμπί δεν εμφανίζεται - Η επανάληψη βίντεο είναι ενεργοποιημένη - Η επανάληψη βίντεο είναι απενεργοποιημένη - - - Αυτόματη παύση κατά τη διακοπή ήχου - Η αναπαραγωγή τίθεται σε παύση όταν παίζει άλλος ήχος (π.χ. πλοήγηση) - Η ένταση μειώνεται όταν αναπαράγεται άλλος ήχος - - - Παραποίηση διαστάσεων συσκευής - "Οι διαστάσεις συσκευής παραποιούνται + Εμφάνιση μηνύματος αν το API δεν είναι διαθέσιμο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης αν το DeArrow δεν είναι διαθέσιμο + Διεύθυνση API του DeArrow + Η διεύθυνση URL του τελικού σημείου αποθήκευσης μικρογραφιών DeArrow + Λήψεις ακίνητων καρέ + Τα ακίνητα καρέ λαμβάνονται από την αρχή/μέση/τέλος κάθε βίντεο. Αυτές οι εικόνες είναι ενσωματωμένες στο YouTube και δεν χρησιμοποιείται εξωτερικό API + Χρήση γρήγορων λήψεων καρέ + Χρησιμοποιούνται ακίνητα καρέ μέτριας ποιότητας. Οι μικρογραφίες θα φορτώνουν γρηγορότερα, αλλά τα ζωντανά, μη κυκλοφορημένα η πολύ παλιά βίντεο ενδέχεται να εμφανίζουν κενές μικρογραφίες + Χρησιμοποιούνται ακίνητα καρέ υψηλής ποιότητας + Ο χρόνος του βίντεο από τον οποίο θα ληφθούν τα καρέ + Αρχή του βίντεο + Μέση του βίντεο + Τέλος του βίντεο + + DeArrow προσωρινά μη διαθέσιμο (κωδικός: %s) + DeArrow προσωρινά μη διαθέσιμο + + + Εμφάνιση ανακοινώσεων ReVanced + Οι ανακοινώσεις κατά την εκκίνηση εμφανίζονται + Οι ανακοινώσεις κατά την εκκίνηση δεν εμφανίζονται + Εμφάνιση ανακοινώσεων κατά την εκκίνηση + Αποτυχία σύνδεσης με τον πάροχο ανακοινώσεων + Παράλειψη + + + Αυτόματη επανάληψη βίντεο + Το βίντεο θα αναπαράγεται σε επανάληψη + Το βίντεο δεν θα επαναληφθεί + + + Εμφάνιση κουμπιού επανάληψης βίντεο + Το κουμπί εμφανίζεται + Το κουμπί δεν εμφανίζεται + Η επανάληψη βίντεο είναι ενεργοποιημένη + Η επανάληψη βίντεο είναι απενεργοποιημένη + + + Αυτόματη παύση κατά τη διακοπή ήχου + Η αναπαραγωγή τίθεται σε παύση όταν παίζει άλλος ήχος (π.χ. πλοήγηση) + Η ένταση μειώνεται όταν αναπαράγεται άλλος ήχος + + + Παραποίηση διαστάσεων συσκευής + "Οι διαστάσεις συσκευής παραποιούνται Ενδέχεται να ξεκλειδωθούν υψηλότερες ποιότητες βίντεο, αλλά μπορεί να αντιμετωπίσετε κολλήματα αναπαραγωγής βίντεο, χειρότερη διάρκεια ζωής μπαταρίας και άλλες άγνωστες παρενέργειες" - "Οι διαστάσεις συσκευής δεν παραποιούνται + "Οι διαστάσεις συσκευής δεν παραποιούνται Η ενεργοποίηση αυτής της λειτουργίας μπορεί να ξεκλειδώσει υψηλότερες ποιότητες βίντεο" - Η ενεργοποίηση αυτής της λειτουργίας μπορεί να προκαλέσει μικρο-κολλήματα κατά την αναπαραγωγή, χειρότερη διάρκεια ζωής μπαταρίας, και άλλες άγνωστες παρενέργειες. - - - Απόκριση δόνησης - Αλλαγή απόκρισης δόνησης - Απενεργοποίηση απόκρισης δόνησης κατά την αλλαγή κεφαλαίων - Η απόκριση δόνησης κατά την αλλαγή κεφαλαίων είναι απενεργοποιημένη - Η απόκριση δόνησης κατά την αλλαγή κεφαλαίων είναι ενεργοποιημένη - Απενεργοποίηση απόκρισης δόνησης κατά τη λειτουργία ακριβής αναζήτησης - Η απόκριση δόνησης κατά τη λειτουργία ακριβής αναζήτησης είναι απενεργοποιημένη - Η απόκριση δόνησης κατά τη λειτουργία ακριβής αναζήτησης είναι ενεργοποιημένη - Απενεργοποίηση απόκρισης δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» - Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι απενεργοποιημένη - Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι ενεργοποιημένη - Απενεργοποίηση απόκρισης δόνησης χειρονομίας ζουμ - Η απόκριση δόνησης της χειρονομίας ζουμ είναι απενεργοποιημένη - Η απόκριση δόνησης της χειρονομίας ζουμ είναι ενεργοποιημένη - - - Εάν αλλάξατε πρόσφατα τα στοιχεία σύνδεσης του λογαριασμού σας, απεγκαταστήστε και εγκαταστήστε ξανά το MicroG. - - - Παράκαμψη ανακατευθύνσεων συνδέσμων - Οι ανακατευθύνσεις συνδέσμων URL παρακάμπτονται - Οι ανακατευθύνσεις συνδέσμων URL δεν παρακάμπτονται - - - Άνοιγμα συνδέσμων σε πρόγραμμα περιήγησης - Οι σύνδεσμοι ανοίγουν σε εξωτερικό πρόγραμμα περιήγησης - Οι σύνδεσμοι ανοίγουν στο εσωτερικό πρόγραμμα περιήγησης της εφαρμογής - - - - Αυτόματη - Απομνημόνευση αλλαγών ποιότητας βίντεο - Οι αλλαγές ποιότητας ισχύουν για όλα τα βίντεο - Οι αλλαγές ποιότητας ισχύουν μόνο για το τρέχον βίντεο - Εμφάνιση μηνύματος κατά την αλλαγή ποιότητας βίντεο - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ποιότητα βίντεο - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ποιότητα βίντεο - Προεπιλεγμένη ποιότητα βίντεο σε δίκτυο Wi-Fi - Προεπιλεγμένη ποιότητα βίντεο με δεδομένα κινητής τηλεφωνίας - Απομνημόνευση αλλαγών ποιότητας στα Shorts - Οι αλλαγές ποιότητας ισχύουν για όλα τα Shorts - Οι αλλαγές ποιότητας ισχύουν μόνο για το τρέχον Short - Προεπιλεγμένη ποιότητα Shorts σε δίκτυο Wi-Fi - Προεπιλεγμένη ποιότητα Shorts σε δίκτυο κινητής τηλεφωνίας - δεδομένων - Wi-Fi - Η προεπιλεγμένη ποιότητα %1$s άλλαξε σε: %2$s - Η ποιότητα Shorts με %1$s άλλαξε σε: %2$s - - - Εμφάνιση κουμπιού αλλαγής ταχύτητας - Το κουμπί αλλαγής ταχύτητας εμφανίζεται. Πατήστε παρατεταμένα για επαναφορά της ταχύτητας αναπαραγωγής στην προεπιλογή - Το κουμπί αλλαγής ταχύτητας δεν εμφανίζεται - - - Εμφάνιση κουμπιού αλλαγής ποιότητας βίντεο - Το κουμπί ποιότητας βίντεο εμφανίζεται. Πατήστε παρατεταμένα για επαναφορά της ποιότητας στην προεπιλογή - Το κουμπί ποιότητας βίντεο δεν εμφανίζεται - - - Μενού προσαρμοσμένης ταχύτητας αναπαραγωγής - Το μενού προσαρμοσμένης ταχύτητας αναπαραγωγής εμφανίζεται - Το μενού προσαρμοσμένης ταχύτητας αναπαραγωγής δεν εμφανίζεται - Επαναφορά παλιού μενού ταχύτητας αναπαραγωγής - Το παλιό μενού ταχύτητας εμφανίζεται - Το σύγχρονο μενού ταχύτητας εμφανίζεται - Προσαρμοσμένες ταχύτητες αναπαραγωγής - Προσθέστε ή αλλάξτε τις προσαρμοσμένες ταχύτητες αναπαραγωγής - Οι ταχύτητες πρέπει να είναι μικρότερες από %sx - Μη έγκυρες προσαρμοσμένες ταχύτητες αναπαραγωγής - Αυτόματη - Προσαρμοσμένη ταχύτητα παρατεταμένου πατήματος - Ταχύτητα αναπαραγωγής μεταξύ 0-8 - - - Απομνημόνευση αλλαγών ταχύτητας αναπαραγωγής - Οι αλλαγές ταχύτητας αναπαραγωγής ισχύουν για όλα τα βίντεο - Οι αλλαγές ταχύτητας αναπαραγωγής ισχύουν μόνο για το τρέχον βίντεο - Εμφάνιση μηνύματος κατά την αλλαγή ταχύτητας αναπαραγωγής - Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ταχύτητα αναπαραγωγής - Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ταχύτητα αναπαραγωγής - Προεπιλεγμένη ταχύτητα αναπαραγωγής - Η προεπιλεγμένη ταχύτητα άλλαξε σε: %s - - - Απενεργοποίηση βίντεο HDR - Τα βίντεο HDR είναι απενεργοποιημένα - Τα βίντεο HDR είναι ενεργοποιημένα - Εξαναγκασμός κωδικοποιητή AVC (H.264) - Ο κωδικοποιητής βίντεο έχει οριστεί υποχρεωτικά σε AVC (H.264) - Ο κωδικοποιητής βίντεο ορίζεται αυτόματα - "Οφέλη: + Η ενεργοποίηση αυτής της λειτουργίας μπορεί να προκαλέσει μικρο-κολλήματα κατά την αναπαραγωγή, χειρότερη διάρκεια ζωής μπαταρίας, και άλλες άγνωστες παρενέργειες. + + + Απόκριση δόνησης + Αλλαγή απόκρισης δόνησης + Απενεργοποίηση απόκρισης δόνησης κατά την αλλαγή κεφαλαίων + Η απόκριση δόνησης κατά την αλλαγή κεφαλαίων είναι απενεργοποιημένη + Η απόκριση δόνησης κατά την αλλαγή κεφαλαίων είναι ενεργοποιημένη + Απενεργοποίηση απόκρισης δόνησης κατά τη λειτουργία ακριβής αναζήτησης + Η απόκριση δόνησης κατά τη λειτουργία ακριβής αναζήτησης είναι απενεργοποιημένη + Η απόκριση δόνησης κατά τη λειτουργία ακριβής αναζήτησης είναι ενεργοποιημένη + Απενεργοποίηση απόκρισης δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» + Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι απενεργοποιημένη + Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι ενεργοποιημένη + Απενεργοποίηση απόκρισης δόνησης χειρονομίας ζουμ + Η απόκριση δόνησης της χειρονομίας ζουμ είναι απενεργοποιημένη + Η απόκριση δόνησης της χειρονομίας ζουμ είναι ενεργοποιημένη + + + Εάν αλλάξατε πρόσφατα τα στοιχεία σύνδεσης του λογαριασμού σας, απεγκαταστήστε και εγκαταστήστε ξανά το MicroG. + + + Παράκαμψη ανακατευθύνσεων συνδέσμων + Οι ανακατευθύνσεις συνδέσμων URL παρακάμπτονται + Οι ανακατευθύνσεις συνδέσμων URL δεν παρακάμπτονται + + + Άνοιγμα συνδέσμων σε πρόγραμμα περιήγησης + Οι σύνδεσμοι ανοίγουν σε εξωτερικό πρόγραμμα περιήγησης + Οι σύνδεσμοι ανοίγουν στο εσωτερικό πρόγραμμα περιήγησης της εφαρμογής + + + + Αυτόματη + Απομνημόνευση αλλαγών ποιότητας βίντεο + Οι αλλαγές ποιότητας ισχύουν για όλα τα βίντεο + Οι αλλαγές ποιότητας ισχύουν μόνο για το τρέχον βίντεο + Εμφάνιση μηνύματος κατά την αλλαγή ποιότητας βίντεο + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ποιότητα βίντεο + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ποιότητα βίντεο + Προεπιλεγμένη ποιότητα βίντεο σε δίκτυο Wi-Fi + Προεπιλεγμένη ποιότητα βίντεο με δεδομένα κινητής τηλεφωνίας + Απομνημόνευση αλλαγών ποιότητας στα Shorts + Οι αλλαγές ποιότητας ισχύουν για όλα τα Shorts + Οι αλλαγές ποιότητας ισχύουν μόνο για το τρέχον Short + Προεπιλεγμένη ποιότητα Shorts σε δίκτυο Wi-Fi + Προεπιλεγμένη ποιότητα Shorts σε δίκτυο κινητής τηλεφωνίας + δεδομένων + Wi-Fi + Η προεπιλεγμένη ποιότητα %1$s άλλαξε σε: %2$s + Η ποιότητα Shorts με %1$s άλλαξε σε: %2$s + + + Εμφάνιση κουμπιού αλλαγής ταχύτητας + Το κουμπί αλλαγής ταχύτητας εμφανίζεται. Πατήστε παρατεταμένα για επαναφορά της ταχύτητας αναπαραγωγής στην προεπιλογή + Το κουμπί αλλαγής ταχύτητας δεν εμφανίζεται + + + Εμφάνιση κουμπιού αλλαγής ποιότητας βίντεο + Το κουμπί ποιότητας βίντεο εμφανίζεται. Πατήστε παρατεταμένα για επαναφορά της ποιότητας στην προεπιλογή + Το κουμπί ποιότητας βίντεο δεν εμφανίζεται + + + Μενού προσαρμοσμένης ταχύτητας αναπαραγωγής + Το μενού προσαρμοσμένης ταχύτητας αναπαραγωγής εμφανίζεται + Το μενού προσαρμοσμένης ταχύτητας αναπαραγωγής δεν εμφανίζεται + Επαναφορά παλιού μενού ταχύτητας αναπαραγωγής + Το παλιό μενού ταχύτητας εμφανίζεται + Το σύγχρονο μενού ταχύτητας εμφανίζεται + Προσαρμοσμένες ταχύτητες αναπαραγωγής + Προσθέστε ή αλλάξτε τις προσαρμοσμένες ταχύτητες αναπαραγωγής + Οι ταχύτητες πρέπει να είναι μικρότερες από %sx + Μη έγκυρες προσαρμοσμένες ταχύτητες αναπαραγωγής + Αυτόματη + Προσαρμοσμένη ταχύτητα παρατεταμένου πατήματος + Ταχύτητα αναπαραγωγής μεταξύ 0-8 + + + Απομνημόνευση αλλαγών ταχύτητας αναπαραγωγής + Οι αλλαγές ταχύτητας αναπαραγωγής ισχύουν για όλα τα βίντεο + Οι αλλαγές ταχύτητας αναπαραγωγής ισχύουν μόνο για το τρέχον βίντεο + Εμφάνιση μηνύματος κατά την αλλαγή ταχύτητας αναπαραγωγής + Εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ταχύτητα αναπαραγωγής + Δεν εμφανίζεται μήνυμα στο κάτω μέρος της οθόνης όταν αλλάζει η προεπιλεγμένη ταχύτητα αναπαραγωγής + Προεπιλεγμένη ταχύτητα αναπαραγωγής + Η προεπιλεγμένη ταχύτητα άλλαξε σε: %s + + + Απενεργοποίηση βίντεο HDR + Τα βίντεο HDR είναι απενεργοποιημένα + Τα βίντεο HDR είναι ενεργοποιημένα + Εξαναγκασμός κωδικοποιητή AVC (H.264) + Ο κωδικοποιητής βίντεο έχει οριστεί υποχρεωτικά σε AVC (H.264) + Ο κωδικοποιητής βίντεο ορίζεται αυτόματα + "Οφέλη: • Μπορεί να βελτιώσει τη διάρκεια ζωής της μπαταρίας • Μπορεί να αποκαταστήσει αναλύσεις βίντεο που λείπουν σε παλαιότερες συσκευές @@ -1670,182 +1669,182 @@ Second \"item\" text" • Η αναπαραγωγή βίντεο θα χρησιμοποιεί περισσότερα δεδομένα διαδικτύου από τον VP9 ή AV1 • Τα βίντεο HDR δεν θα χρησιμοποιούν τον κωδικοποιητή AVC • Ορισμένες συσκευές δεν μπορούν να επιβάλλουν τον κωδικοποιητή AVC" - - - Εμφάνιση προχωρημένου μενού ποιότητας βίντεο - Εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο - Δεν εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο - - - Χειρονομία συρσίματος για αναζήτηση - Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένη - Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένη - - - Να επιτρέπεται ο κωδικοποιητής Android VR AV1 - "Ο κωδικοποιητής βίντεο είναι ο AVC (H.264), ο VP9 ή ο AV1 + + + Εμφάνιση προχωρημένου μενού ποιότητας βίντεο + Εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο + Δεν εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο + + + Χειρονομία συρσίματος για αναζήτηση + Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένη + Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένη + + + Να επιτρέπεται ο κωδικοποιητής Android VR AV1 + "Ο κωδικοποιητής βίντεο είναι ο AVC (H.264), ο VP9 ή ο AV1 Η αναπαραγωγή μπορεί να κομπιάζει ή να χάνει καρέ" - Ο κωδικοποιητής βίντεο είναι ο AVC (H.264) ή ο VP9 - "Η ενεργοποίηση αυτής της ρύθμισης ενδέχεται να χρησιμοποιήσει αποκωδικοποίηση λογισμικού AV1. + Ο κωδικοποιητής βίντεο είναι ο AVC (H.264) ή ο VP9 + "Η ενεργοποίηση αυτής της ρύθμισης ενδέχεται να χρησιμοποιήσει αποκωδικοποίηση λογισμικού AV1. Η αναπαραγωγή βίντεο μπορεί να κομπιάζει ή να χάνει καρέ." - Παρενέργειες παραποίησης - • Πειραματικός πελάτης και μπορεί να σταματήσει να λειτουργεί ανά πάσα στιγμή - • Το βίντεο μπορεί να σταματήσει στο 1:00 ή να μην είναι διαθέσιμο σε ορισμένες περιοχές - • Το μενού «Κομμάτι ήχου» λείπει - • Δεν υπάρχει ο κωδικοποιητής βίντεο AV1 - • Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη - • Τα βίντεο για παιδιά ενδέχεται να μην αναπαράγονται αν είστε αποσυνδεδεμένοι ή σε λειτουργία ανώνυμης περιήγησης - - • Ο εξαναγκασμός αρχικής γλώσσας ήχου δεν είναι διαθέσιμος - Εμφάνιση στο μενού «Στατιστικά για σπασίκλες» - Το πρόγραμμα πελάτη εμφανίζεται στο μενού «Στατιστικά για σπασίκλες» - Το πρόγραμμα πελάτη δεν εμφανίζεται στο μενού «Στατιστικά για σπασίκλες» - - - - - YT Music ReVanced - Music ReVanced - Music - - - Σχετικά με - Διαφημίσεις - Γενικά - Οθόνη αναπαραγωγής - Διάφορα - - - Διαφημίσεις βίντεο - Κρυμμένες - Εμφανίζονται - - - Ενεργοποίηση μόνιμης επανάληψης - Η μόνιμη επανάληψη είναι ενεργοποιημένη - Η μόνιμη επανάληψη είναι απενεργοποιημένη - - - Κουμπί μετάδοσης - Κρυμμένο - Εμφανίζεται - Κουμπί ιστορικού - Κρυμμένο - Εμφανίζεται - Κουμπί ειδοποιήσεων - Κρυμμένο - Εμφανίζεται - Κουμπί αναζήτησης - Κρυμμένο - Εμφανίζεται - - - Γραμμή κατηγοριών - Κρυμμένη - Εμφανίζεται - - - Αλλαγή χρώματος ελαχιστοποιημένης οθόνης αναπαραγωγής - Το χρώμα της ελαχιστοποιημένης οθόνης αναπαραγωγής ταιριάζει με αυτό της οθόνης αναπαραγωγής πλήρους οθόνης - Η ελαχιστοποιημένη οθόνη αναπαραγωγής χρησιμοποιεί το προεπιλεγμένο χρώμα - - - Γραμμή πλοήγησης - Απόκρυψη ή αλλαγή κουμπιών της γραμμής πλοήγησης - - Κουμπί «Αρχική» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Δείγματα» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Εξερεύνηση» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Βιβλιοθήκη» - Κρυμμένο - Εμφανίζεται - - Κουμπί «Αναβάθμιση» - Κρυμμένο - Εμφανίζεται - Γραμμή πλοήγησης - Κρυμμένη - Εμφανίζεται - Ονομασίες κουμπιών γραμμής πλοήγησης - Κρυμμένες - Εμφανίζονται - - - Ετικέτα «Αποκτήστε το Music Premium» - Κρυμμένη - Εμφανίζεται - - - Κουμπί «Αναβάθμιση» - Κρυμμένο - Εμφανίζεται - - - - - Αποκλεισμός διαφημίσεων ήχου - Οι διαφημίσεις ήχου έχουν αποκλειστεί - Οι διαφημίσεις ήχου δεν έχουν αποκλειστεί - - - %s δεν είναι διαθέσιμο, ενδέχεται να εμφανιστούν διαφημίσεις. Δοκιμάστε να αλλάξετε την υπηρεσία αποκλεισμού διαφημίσεων στις ρυθμίσεις. - %s επέστρεψε ένα σφάλμα, ενδέχεται να εμφανιστούν διαφημίσεις. Δοκιμάστε να αλλάξετε την υπηρεσία αποκλεισμού διαφημίσεων στις ρυθμίσεις. - Αποκλεισμός ενσωματωμένων διαφημίσεων βίντεο - Ανενεργό - Διαμεσολαβητής Luminous - Διαμεσολαβητής PurpleAdBlock - - - Αποκλεισμός διαφημίσεων βίντεο - Οι διαφημίσεις βίντεο έχουν αποκλειστεί - Οι διαφημίσεις βίντεο δεν έχουν αποκλειστεί - - - Το μήνυμα διαγράφηκε - Εμφάνιση διαγραμμένων μηνυμάτων - Να μην εμφανίζονται διαγραμμένα μηνύματα - Απόκρυψη διαγραμμένων μηνυμάτων πίσω από ένα spoiler - Εμφάνιση διαγραμμένων μηνυμάτων ως σβησμένο κείμενο - - - Αυτόματη εξαργύρωση Πόντων Καναλιού - Οι Πόντοι Καναλιών εξαργυρώνονται αυτόματα - Οι Πόντοι Καναλιών δεν εξαργυρώνονται αυτόματα - - - - Λειτουργία εντοπισμού σφαλμάτων Twitch - Η λειτουργία εντοπισμού σφαλμάτων Twitch είναι ενεργοποιημένη (δε συνιστάται) - Η λειτουργία εντοπισμού σφαλμάτων Twitch είναι απενεργοποιημένη - - - Ρυθμίσεις ReVanced - Ομάδα προγραμματιστών - Σχετικά με το ReVanced - Αποκλεισμός διαφημίσεων - Ρυθμίσεις αποκλεισμού διαφημίσεων - Συνομιλία - Ρυθμίσεις συνομιλίας - Διάφορα - Διάφορες ρυθμίσεις - Γενικές ρυθμίσεις - Άλλες ρυθμίσεις - Διαφημίσεις από πλευράς πελάτη - Διαφημίσεις διακομιστή - Καταγραφή εντοπισμού σφαλμάτων - Η καταγραφή σφαλμάτων είναι ενεργή - Η καταγραφή σφαλμάτων είναι ανενεργή - - + Παρενέργειες παραποίησης + • Πειραματικός πελάτης και μπορεί να σταματήσει να λειτουργεί ανά πάσα στιγμή + • Το βίντεο μπορεί να σταματήσει στο 1:00 ή να μην είναι διαθέσιμο σε ορισμένες περιοχές + • Το μενού «Κομμάτι ήχου» λείπει + • Δεν υπάρχει ο κωδικοποιητής βίντεο AV1 + • Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη + • Τα βίντεο για παιδιά ενδέχεται να μην αναπαράγονται αν είστε αποσυνδεδεμένοι ή σε λειτουργία ανώνυμης περιήγησης + + • Ο εξαναγκασμός αρχικής γλώσσας ήχου δεν είναι διαθέσιμος + Εμφάνιση στο μενού «Στατιστικά για σπασίκλες» + Το πρόγραμμα πελάτη εμφανίζεται στο μενού «Στατιστικά για σπασίκλες» + Το πρόγραμμα πελάτη δεν εμφανίζεται στο μενού «Στατιστικά για σπασίκλες» + + + + + YT Music ReVanced + Music ReVanced + Music + + + Σχετικά με + Διαφημίσεις + Γενικά + Οθόνη αναπαραγωγής + Διάφορα + + + Διαφημίσεις βίντεο + Κρυμμένες + Εμφανίζονται + + + Ενεργοποίηση μόνιμης επανάληψης + Η μόνιμη επανάληψη είναι ενεργοποιημένη + Η μόνιμη επανάληψη είναι απενεργοποιημένη + + + Κουμπί μετάδοσης + Κρυμμένο + Εμφανίζεται + Κουμπί ιστορικού + Κρυμμένο + Εμφανίζεται + Κουμπί ειδοποιήσεων + Κρυμμένο + Εμφανίζεται + Κουμπί αναζήτησης + Κρυμμένο + Εμφανίζεται + + + Γραμμή κατηγοριών + Κρυμμένη + Εμφανίζεται + + + Αλλαγή χρώματος ελαχιστοποιημένης οθόνης αναπαραγωγής + Το χρώμα της ελαχιστοποιημένης οθόνης αναπαραγωγής ταιριάζει με αυτό της οθόνης αναπαραγωγής πλήρους οθόνης + Η ελαχιστοποιημένη οθόνη αναπαραγωγής χρησιμοποιεί το προεπιλεγμένο χρώμα + + + Γραμμή πλοήγησης + Απόκρυψη ή αλλαγή κουμπιών της γραμμής πλοήγησης + + Κουμπί «Αρχική» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Δείγματα» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Εξερεύνηση» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Βιβλιοθήκη» + Κρυμμένο + Εμφανίζεται + + Κουμπί «Αναβάθμιση» + Κρυμμένο + Εμφανίζεται + Γραμμή πλοήγησης + Κρυμμένη + Εμφανίζεται + Ονομασίες κουμπιών γραμμής πλοήγησης + Κρυμμένες + Εμφανίζονται + + + Ετικέτα «Αποκτήστε το Music Premium» + Κρυμμένη + Εμφανίζεται + + + Κουμπί «Αναβάθμιση» + Κρυμμένο + Εμφανίζεται + + + + + Αποκλεισμός διαφημίσεων ήχου + Οι διαφημίσεις ήχου έχουν αποκλειστεί + Οι διαφημίσεις ήχου δεν έχουν αποκλειστεί + + + %s δεν είναι διαθέσιμο, ενδέχεται να εμφανιστούν διαφημίσεις. Δοκιμάστε να αλλάξετε την υπηρεσία αποκλεισμού διαφημίσεων στις ρυθμίσεις. + %s επέστρεψε ένα σφάλμα, ενδέχεται να εμφανιστούν διαφημίσεις. Δοκιμάστε να αλλάξετε την υπηρεσία αποκλεισμού διαφημίσεων στις ρυθμίσεις. + Αποκλεισμός ενσωματωμένων διαφημίσεων βίντεο + Ανενεργό + Διαμεσολαβητής Luminous + Διαμεσολαβητής PurpleAdBlock + + + Αποκλεισμός διαφημίσεων βίντεο + Οι διαφημίσεις βίντεο έχουν αποκλειστεί + Οι διαφημίσεις βίντεο δεν έχουν αποκλειστεί + + + Το μήνυμα διαγράφηκε + Εμφάνιση διαγραμμένων μηνυμάτων + Να μην εμφανίζονται διαγραμμένα μηνύματα + Απόκρυψη διαγραμμένων μηνυμάτων πίσω από ένα spoiler + Εμφάνιση διαγραμμένων μηνυμάτων ως σβησμένο κείμενο + + + Αυτόματη εξαργύρωση Πόντων Καναλιού + Οι Πόντοι Καναλιών εξαργυρώνονται αυτόματα + Οι Πόντοι Καναλιών δεν εξαργυρώνονται αυτόματα + + + + Λειτουργία εντοπισμού σφαλμάτων Twitch + Η λειτουργία εντοπισμού σφαλμάτων Twitch είναι ενεργοποιημένη (δε συνιστάται) + Η λειτουργία εντοπισμού σφαλμάτων Twitch είναι απενεργοποιημένη + + + Ρυθμίσεις ReVanced + Ομάδα προγραμματιστών + Σχετικά με το ReVanced + Αποκλεισμός διαφημίσεων + Ρυθμίσεις αποκλεισμού διαφημίσεων + Συνομιλία + Ρυθμίσεις συνομιλίας + Διάφορα + Διάφορες ρυθμίσεις + Γενικές ρυθμίσεις + Άλλες ρυθμίσεις + Διαφημίσεις από πλευράς πελάτη + Διαφημίσεις διακομιστή + Καταγραφή εντοπισμού σφαλμάτων + Η καταγραφή σφαλμάτων είναι ενεργή + Η καταγραφή σφαλμάτων είναι ανενεργή + + diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index f516a14b01..550d7b4f8f 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -17,1308 +17,1307 @@ "First 'item' text Second \"item\" text" ---> - - - - Nombre de la aplicación - - Personalizado - Icono de la aplicación - Original - ReVanced - - ReVanced mínimo - ReVanced escalado - - Personalizado - - - Comprobaciones fallidas - Ir al sitio web oficial - Ignorar - <h5>Esta app no parece estar parcheada por ti.</h5><br>Esta app podría no funcionar correctamente, <b> podría ser perjudicial o incluso peligrosa de usar</b>.<br><br>Estas comprobaciones implican que esta app está pre-parcheada o se ha obtenido de alguien más:<br><br><small>%1$s</small><br>Se recomienda mucho <b>desinstalar esta app y parchearla por ti mismo</b> para asegurarte de que estás usando una app segura y validada.<p><br>Si se ignora, este aviso se mostrará solo dos veces. - Parcheado en un dispositivo diferente - No instalado por ReVanced Manager - Parcheado hace más de 10 minutos - Parcheado hace %s días - La fecha de compilación del APK está corrupta - - - Aviso de ReVanced - Tu historial no está siendo guardado.<br><br>Esto puede ser por un bloqueador de anuncios DNS o Proxy.<br><br>Para arreglarlo, permita el dominio <b>s.youtube.com</b> o desactive el bloqueador DNS o Proxy. - No mostrar de nuevo - - - Ajustes - ReVanced - ¿Estás seguro de que quieres continuar? - Guardar - Restablecer - Restablecer color - Color no válido - Reinicio necesario - Reinicia la aplicación para que este cambio surta efecto. - Reiniciar - Importar - Copiar - Ajustes de ReVanced restablecidos a los valores predeterminados - Configuración importada de %d - Importación fallida: %s - Buscar ajustes - No se encontraron resultados para «%s» - Prueba con otra palabra clave - Búsquedas recientes - ¿Eliminar del historial de búsqueda? - Borrar historial de búsqueda - ¿Estás seguro de que quieres borrar todo el historial de búsqueda? - Consejos de búsqueda - "• Toca una ruta para navegar a ella +--> + + + Nombre de la aplicación + + Personalizado + Icono de la aplicación + Original + ReVanced + + ReVanced mínimo + ReVanced escalado + + Personalizado + + + Comprobaciones fallidas + Ir al sitio web oficial + Ignorar + <h5>Esta app no parece estar parcheada por ti.</h5><br>Esta app podría no funcionar correctamente, <b> podría ser perjudicial o incluso peligrosa de usar</b>.<br><br>Estas comprobaciones implican que esta app está pre-parcheada o se ha obtenido de alguien más:<br><br><small>%1$s</small><br>Se recomienda mucho <b>desinstalar esta app y parchearla por ti mismo</b> para asegurarte de que estás usando una app segura y validada.<p><br>Si se ignora, este aviso se mostrará solo dos veces. + Parcheado en un dispositivo diferente + No instalado por ReVanced Manager + Parcheado hace más de 10 minutos + Parcheado hace %s días + La fecha de compilación del APK está corrupta + + + Aviso de ReVanced + Tu historial no está siendo guardado.<br><br>Esto puede ser por un bloqueador de anuncios DNS o Proxy.<br><br>Para arreglarlo, permita el dominio <b>s.youtube.com</b> o desactive el bloqueador DNS o Proxy. + No mostrar de nuevo + + + Ajustes + ReVanced + ¿Estás seguro de que quieres continuar? + Guardar + Restablecer + Restablecer color + Color no válido + Reinicio necesario + Reinicia la aplicación para que este cambio surta efecto. + Reiniciar + Importar + Copiar + Ajustes de ReVanced restablecidos a los valores predeterminados + Configuración importada de %d + Importación fallida: %s + Buscar ajustes + No se encontraron resultados para «%s» + Prueba con otra palabra clave + Búsquedas recientes + ¿Eliminar del historial de búsqueda? + Borrar historial de búsqueda + ¿Estás seguro de que quieres borrar todo el historial de búsqueda? + Consejos de búsqueda + "• Toca una ruta para navegar a ella • Mantén pulsado un ajuste para navegar a él • Pulsa Enter para guardar una consulta de búsqueda en el historial • La búsqueda ignora mayúsculas/minúsculas y puntuación • Los ajustes principales aparecen sobre los ajustes secundarios deshabilitados" - El historial de búsqueda está vacío - Para guardar el historial de búsqueda, escribe una consulta de búsqueda y pulsa Enter - Mostrar el historial de búsqueda de ajustes - El historial de búsqueda de los ajustes es visible - El historial de búsqueda de ajustes está oculto - Mostrar iconos de configuración de ReVanced - Se muestran los iconos de configuración - No se muestran los iconos de configuración - Idioma de ReVanced - "Las traducciones para algunos idiomas pueden faltar o estar incompletas. + El historial de búsqueda está vacío + Para guardar el historial de búsqueda, escribe una consulta de búsqueda y pulsa Enter + Mostrar el historial de búsqueda de ajustes + El historial de búsqueda de los ajustes es visible + El historial de búsqueda de ajustes está oculto + Mostrar iconos de configuración de ReVanced + Se muestran los iconos de configuración + No se muestran los iconos de configuración + Idioma de ReVanced + "Las traducciones para algunos idiomas pueden faltar o estar incompletas. Para traducir nuevos idiomas o mejorar las traducciones existentes, visita translate.revanced.app" - Idioma de la aplicación - Importar / Exportar - Importar / Exportar ajustes de ReVanced - - Estás usando la versión de ReVanced Patches: <i>%s</i> - Nota - Esta versión es un pre-lanzamiento y podrías experimentar problemas inesperados - Enlaces oficiales - + Estás usando la versión de ReVanced Patches: <i>%s</i> + Nota + Esta versión es un pre-lanzamiento y podrías experimentar problemas inesperados + Enlaces oficiales + - - - Ajustes de GmsCore - Configuración de GmsCore - - MicroG GmsCore no está instalado. Instálalo. - Acción necesaria - "MicroG GmsCore no tiene permiso para ejecutarse en segundo plano. + + + Ajustes de GmsCore + Configuración de GmsCore + + MicroG GmsCore no está instalado. Instálalo. + Acción necesaria + "MicroG GmsCore no tiene permiso para ejecutarse en segundo plano. Sigue la guía \"Don't kill my app\" para tu teléfono, y aplica las instrucciones a tu instalación de MicroG Esto es requerido para el funcionamiento de la aplicación." - Abrir sitio web - "Las optimizaciones de batería para MicroG GmsCore deben estar desactivadas para evitar problemas. + Abrir sitio web + "Las optimizaciones de batería para MicroG GmsCore deben estar desactivadas para evitar problemas. Deshabilitar las optimizaciones de batería para MicroG no afectará negativamente el uso de la batería. Toca el botón continuar y permite los cambios de optimización." - Continuar - - - Falsificar transmisiones de vídeo - Falsifica las transmisiones de vídeo del cliente para evitar problemas de reproducción - Falsificar transmisiones de vídeo - "Las transmisiones de vídeo están falsificadas. + Continuar + + + Falsificar transmisiones de vídeo + Falsifica las transmisiones de vídeo del cliente para evitar problemas de reproducción + Falsificar transmisiones de vídeo + "Las transmisiones de vídeo están falsificadas. Si eres un usuario de YouTube Premium, esta configuración podría no ser necesaria" - "Las transmisiones de video no están suplantadas + "Las transmisiones de video no están suplantadas La reproducción podría no funcionar" - Desactivar esta configuración puede causar problemas de reproducción. - Cliente por defecto - - - Forzar idioma de audio original - Usar el idioma de audio original - Utilizando audio predeterminado - - Para usar esta función, cambia \'Falsificar transmisiones de vídeo\' a cualquier cliente excepto Android Studio - - - Depuración - Activar o desactivar las opciones de depuración - Registro de depuración - Los registros de depuración están habilitados - Los registros de depuración están desactivados - Registrar stack traces - Los registros de depuración incluyen stack trace - Los registros de depuración no incluyen stack trace - Mostrar aviso de error en ReVanced - Se mostrará un aviso si se produce un error - No se mostrará un aviso si se produce un error - "Desactivar los avisos de error oculta todas las notificaciones de error de ReVanced. + Desactivar esta configuración puede causar problemas de reproducción. + Cliente por defecto + + + Forzar idioma de audio original + Usar el idioma de audio original + Utilizando audio predeterminado + + Para usar esta función, cambia \'Falsificar transmisiones de vídeo\' a cualquier cliente excepto Android Studio + + + Depuración + Activar o desactivar las opciones de depuración + Registro de depuración + Los registros de depuración están habilitados + Los registros de depuración están desactivados + Registrar stack traces + Los registros de depuración incluyen stack trace + Los registros de depuración no incluyen stack trace + Mostrar aviso de error en ReVanced + Se mostrará un aviso si se produce un error + No se mostrará un aviso si se produce un error + "Desactivar los avisos de error oculta todas las notificaciones de error de ReVanced. No se le notificará de ningún evento inesperado." - Exportar registros de depuración - Copia los registros de depuración de ReVanced al portapapeles - El registro de depuración está desactivado - No se encontraron registros - Registros copiados - Error al exportar registros: %s - Borrar registros de depuración - Borra todos los registros de depuración de ReVanced almacenados - Registros borrados - Manager de indicadores de funciones - Gestionar indicadores de funciones booleanos - Banderas activas (%d) - Banderas bloqueadas (%d) - Buscar banderas... - Banderas guardadas - Banderas restablecidas - Banderas copiadas al portapapeles - Búfer de protocolo de registro - Los registros de depuración incluyen el búfer proto - Los registros de depuración no incluyen el búfer proto - "Si activas este ajuste, se registrarán datos de diseño adicionales, incluido el texto en pantalla de algunos componentes de la IU. + Exportar registros de depuración + Copia los registros de depuración de ReVanced al portapapeles + El registro de depuración está desactivado + No se encontraron registros + Registros copiados + Error al exportar registros: %s + Borrar registros de depuración + Borra todos los registros de depuración de ReVanced almacenados + Registros borrados + Manager de indicadores de funciones + Gestionar indicadores de funciones booleanos + Banderas activas (%d) + Banderas bloqueadas (%d) + Buscar banderas... + Banderas guardadas + Banderas restablecidas + Banderas copiadas al portapapeles + Búfer de protocolo de registro + Los registros de depuración incluyen el búfer proto + Los registros de depuración no incluyen el búfer proto + "Si activas este ajuste, se registrarán datos de diseño adicionales, incluido el texto en pantalla de algunos componentes de la IU. Esto puede ayudar a identificar componentes al crear filtros personalizados. Sin embargo, si activas esto, también se registrarán algunos datos del usuario, como tu dirección IP." - - - Sanear enlaces compartidos - El parámetro de consulta de seguimiento se elimina de los enlaces compartidos - El parámetro de consulta de seguimiento no se elimina de los enlaces compartidos - Cambiar enlaces compartidos a youtube.com - Los enlaces compartidos usan youtube.com - Los enlaces compartidos usan music.youtube.com - - - Filtro personalizado - Ocultar componentes usando filtros personalizados - Activar filtro personalizado - Filtro personalizado activado - Filtro personalizado desactivado - Filtro personalizado - - Lista de cadenas del constructor de rutas del componente para filtrar separadas por una nueva línea - Filtro personalizado no válido: %s - - - - - Acerca de - Anuncios - Miniaturas alternativas - Feed - General - Reproductor - Shorts - Barra de progreso - Controles de deslizamiento - Return YouTube Dislike - Otros - Vídeo - Restaurar menús de configuración antiguos - Los menús de configuración antiguos son visibles - Los menús de configuración antiguos están ocultos - - - Desactivar la reproducción en segundo plano de Shorts - La reproducción en segundo plano de Shorts está deshabilitada - La reproducción en segundo plano de Shorts está habilitada - - - Ocultar tarjetas de álbum - Las tarjetas de álbum están ocultas - Se muestran las tarjetas de álbum - Ocultar tarjetas de artista - Las tarjetas de artista están ocultas - Se muestran las tarjetas de artista - Ocultar \"Más como esto\" - \"Más como esto\" está oculto - \"Más como esto\" es visible - Ocultar publicaciones de comunidad - Las publicaciones de la comunidad están ocultas - Las publicaciones de la comunidad se muestran - Ocultar banners compactos - Los banners compactos están ocultos - Se muestran los banners compactos - Ocultar tarjeta expandible - La tarjeta expandible debajo de los vídeos está oculta - La tarjeta expandible debajo de los vídeos es visible - Ocultar botón de micrófono flotante - El botón flotante del micrófono en la búsqueda está oculto - Se muestra el botón flotante del micrófono en la búsqueda - Ocultar estantes horizontales - "Los estantes horizontales están ocultos, como: + + + Sanear enlaces compartidos + El parámetro de consulta de seguimiento se elimina de los enlaces compartidos + El parámetro de consulta de seguimiento no se elimina de los enlaces compartidos + Cambiar enlaces compartidos a youtube.com + Los enlaces compartidos usan youtube.com + Los enlaces compartidos usan music.youtube.com + + + Filtro personalizado + Ocultar componentes usando filtros personalizados + Activar filtro personalizado + Filtro personalizado activado + Filtro personalizado desactivado + Filtro personalizado + + Lista de cadenas del constructor de rutas del componente para filtrar separadas por una nueva línea + Filtro personalizado no válido: %s + + + + + Acerca de + Anuncios + Miniaturas alternativas + Feed + General + Reproductor + Shorts + Barra de progreso + Controles de deslizamiento + Return YouTube Dislike + Otros + Vídeo + Restaurar menús de configuración antiguos + Los menús de configuración antiguos son visibles + Los menús de configuración antiguos están ocultos + + + Desactivar la reproducción en segundo plano de Shorts + La reproducción en segundo plano de Shorts está deshabilitada + La reproducción en segundo plano de Shorts está habilitada + + + Ocultar tarjetas de álbum + Las tarjetas de álbum están ocultas + Se muestran las tarjetas de álbum + Ocultar tarjetas de artista + Las tarjetas de artista están ocultas + Se muestran las tarjetas de artista + Ocultar \"Más como esto\" + \"Más como esto\" está oculto + \"Más como esto\" es visible + Ocultar publicaciones de comunidad + Las publicaciones de la comunidad están ocultas + Las publicaciones de la comunidad se muestran + Ocultar banners compactos + Los banners compactos están ocultos + Se muestran los banners compactos + Ocultar tarjeta expandible + La tarjeta expandible debajo de los vídeos está oculta + La tarjeta expandible debajo de los vídeos es visible + Ocultar botón de micrófono flotante + El botón flotante del micrófono en la búsqueda está oculto + Se muestra el botón flotante del micrófono en la búsqueda + Ocultar estantes horizontales + "Los estantes horizontales están ocultos, como: • Noticias de última hora • Seguir viendo • Explorar más canales • Más relevantes • Compras • Ver de nuevo" - Los estantes horizontales son visibles - Ocultar estantería de imágenes - La estantería de imágenes en los resultados de búsqueda está oculta - La estantería de imágenes en los resultados de búsqueda es visible - Ocultar últimas publicaciones - Las últimas publicaciones están ocultas - Se muestran las últimas publicaciones - Ocultar lista de reproducción Mix - Las listas de reproducción Mix están ocultas - La lista de reproducción Mix es visible - Ocultar sección de películas - La sección de películas está oculta - La sección de películas es visible - - Ocultar el botón \"Notificarme\" - El botón Notificarme está oculto - El botón Notificarme es visible - Ocultar jugables - Los jugables están ocultos - Los jugables son visibles - - Ocultar botón \'Mostrar más\' - El botón Mostrar más en los resultados de búsqueda está oculto - El botón Mostrar más en los resultados de búsqueda es visible - Ocultar encuestas - Las encuestas están ocultas - Las encuestas son visibles - Ocultar estantes de tickets - La estantería de tickets está oculta - La estantería de tickets es visible - - Ocultar etiquetas de recomendación de vídeo - Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda están ocultas - Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda son visibles - Ocultar espaciador visual - El espaciador visual está oculto - El espaciador visual está visible - - Ocultar YouTube Doodles - La animación de los Doodles de YouTube en el logotipo está oculta - Se muestra la animación de Doodles de YouTube en el logo - "Los doodles de YouTube se muestran durante unos días al año. + Ocultar botón \'Mostrar más\' + El botón Mostrar más en los resultados de búsqueda está oculto + El botón Mostrar más en los resultados de búsqueda es visible + Ocultar encuestas + Las encuestas están ocultas + Las encuestas son visibles + Ocultar estantes de tickets + La estantería de tickets está oculta + La estantería de tickets es visible + + Ocultar etiquetas de recomendación de vídeo + Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda están ocultas + Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda son visibles + Ocultar espaciador visual + El espaciador visual está oculto + El espaciador visual está visible + + Ocultar YouTube Doodles + La animación de los Doodles de YouTube en el logotipo está oculta + Se muestra la animación de Doodles de YouTube en el logo + "Los doodles de YouTube se muestran durante unos días al año. Si un doodle se está mostrando actualmente en tu región y este ajuste de ocultación está activado, la barra de filtro situada debajo de la barra de búsqueda también estará oculta." - Ocultar barra de canal - La barra de canales está oculta - Barra de canales mostrada - Ocultar marca de agua del canal - La marca de agua está oculta - Marca de agua mostrada - Ocultar caja de Crowdfunding - La caja de Crowdfunding está oculta - La caja de Crowdfunding es visible - Ocultar cajas de emergencia - Las cajas de emergencia están ocultas - Se muestran cajas de emergencia - Ocultar paneles de información - Los paneles de información están ocultos - Los paneles de información se muestran - - Ocultar el botón \"Unirse\" - El botón Unirse está oculto - El botón Unirse es visible - Ocultar paneles médicos - Los paneles médicos están ocultos - Se muestran paneles médicos - Ocultar acciones rápidas - Las rápidas en pantalla completa están ocultas - Acciones rápidas en pantalla completa visibles - Ocultar videos relacionados - Los vídeos relacionados en acciones rápidas están ocultos - Videos relacionados en acciones rápidas visibles - Ocultar las directrices para suscriptores - Las pautas comunitarias de los suscriptores están ocultas - Se muestran las pautas de la comunidad de suscriptores - Ocultar reacciones temporizadas - Las reacciones temporizadas están ocultas - Se muestran reacciones temporizadas - Ocultar \"Resumen de vídeo generado por IA\" - La sección de resumen de vídeo generada por IA está oculta - Sección de resumen de vídeo generada por IA está mostrada - Ocultar pregunta - La sección de preguntas está oculta - Se muestra la sección de preguntas - Ocultar atributos - Las secciones Lugares destacados, Juegos, Música y Personas mencionadas están ocultas - Las secciones Lugares destacados, Juegos, Música y Personas mencionadas se muestran - Ocultar capítulos - La sección de capítulos está oculta - Se muestra la sección de capítulos - Ocultar \"Cómo se hizo este contenido\" - La sección Cómo se hizo este contenido está oculta - Se muestra la sección Cómo se hizo este contenido - Ocultar puntos de Hype - Los puntos de Hype están ocultos - Los puntos de Hype están visibles - Ocultar \"Explora el pódcast\" - La sección Explora el pódcast está oculta - Se muestra la sección Explora el pódcast - Ocultar enlaces destacados - La sección de enlaces destacados está oculta - La sección de enlaces destacados es visible - Ocultar vídeos destacados - La sección de vídeos destacados está oculta - La sección de vídeos destacados es visible - Ocultar tarjetas de información - La sección de tarjetas de información está oculta - Se muestra la sección de tarjetas de información - Ocultar \"Conceptos clave\" - La sección Conceptos clave está oculta - Se muestra la sección Conceptos clave - Ocultar botón de Suscribirse - El botón de Suscribirse está oculto - El botón de Suscribirse es visible - Ocultar transcripción - La sección transcripción está oculta - Se muestra la sección transcripción - Descripción del vídeo - Ocultar o mostrar componentes de descripción de vídeo - Barra de filtros - Ocultar o mostrar la barra de filtros en las fuentes, vídeos relacionados, resultados de búsqueda e historial de reproducciones - Ocultar en feeds - Oculto en feeds - Visible en feeds - Ocultar en vídeos relacionados - Oculto en vídeos relacionados - Mostrar en vídeos relacionados - Ocultar en los resultados de búsqueda - Oculto en los resultados de búsqueda - Mostrado en los resultados de búsqueda - Ocultar en el historial de reproducciones - Oculto en el historial de reproducciones - Mostrado en el historial de reproducciones - Página del canal - Ocultar o mostrar componentes de la página del canal - - Ocultar botón de Comunidad - El botón de la comunidad está oculto - El botón de la comunidad es visible - - Ocultar la sección \"Para ti\" - La estantería \"Para ti\" está oculta - La estantería \"Para ti\" es visible - - Ocultar el botón \"Unirse\" - El botón Unirse está oculto - El botón Unirse es visible - Ocultar vista previa de enlaces - La vista previa de enlaces está oculta - Vista previa de enlaces visible - Ocultar estantería de miembros - La estantería de miembros está oculta - La estantería de miembros se muestra - - Ocultar el botón Tienda - El botón Tienda está oculto - El botón Tienda es visible - - Ocultar el botón Suscribirse - El botón Suscribirse está oculto - El botón Suscribirse es visible - Comentarios - Ocultar o mostrar los componentes de sección de comentarios - Ocultar resumen de chat de IA - El resumen del chat de IA está oculto - El resumen del chat de IA es visible - Ocultar el resumen de los comentarios de la IA - El resumen de comentarios de IA está oculto - El resumen de comentarios de IA es visible - Ocultar directrices del canal - Las directrices del canal están ocultas - Las directrices del canal se muestran - Ocultar encabezado \'Comentarios por miembros\' - El encabezado Comentarios de los miembros está oculto - Se muestra el encabezado Comentarios de los miembros - Ocultar sección de comentarios - La sección de comentarios está oculta - Sección de comentarios mostrada - Ocultar directrices de la comunidad - Directrices de la comunidad ocultas - Directrices de la comunidad visibles - Ocultar botón \'Crear un Short\' - El botón Crear un Short está oculto - Se muestra el botón Crear un Short - Ocultar botones de Emoji y Marca de tiempo - Los botones de Emoji y Marca de tiempo están ocultos - Los botones de Emoji y Marca de tiempo están visibles - Ocultar vista previa de comentarios - La vista previa de comentarios está oculta - La vista previa de comentarios es visible - Ocultar botón Gracias - El botón de gracias está oculto - Se muestra el botón de gracias - Ocultar recuento de visualizaciones - El recuento de visualizaciones está oculto en el feed y los resultados de búsqueda - El recuento de visualizaciones se muestra en el feed y los resultados de búsqueda - - "Limitaciones: + Ocultar el botón \"Unirse\" + El botón Unirse está oculto + El botón Unirse es visible + Ocultar paneles médicos + Los paneles médicos están ocultos + Se muestran paneles médicos + Ocultar acciones rápidas + Las rápidas en pantalla completa están ocultas + Acciones rápidas en pantalla completa visibles + Ocultar videos relacionados + Los vídeos relacionados en acciones rápidas están ocultos + Videos relacionados en acciones rápidas visibles + Ocultar las directrices para suscriptores + Las pautas comunitarias de los suscriptores están ocultas + Se muestran las pautas de la comunidad de suscriptores + Ocultar reacciones temporizadas + Las reacciones temporizadas están ocultas + Se muestran reacciones temporizadas + Ocultar \"Resumen de vídeo generado por IA\" + La sección de resumen de vídeo generada por IA está oculta + Sección de resumen de vídeo generada por IA está mostrada + Ocultar pregunta + La sección de preguntas está oculta + Se muestra la sección de preguntas + Ocultar atributos + Las secciones Lugares destacados, Juegos, Música y Personas mencionadas están ocultas + Las secciones Lugares destacados, Juegos, Música y Personas mencionadas se muestran + Ocultar capítulos + La sección de capítulos está oculta + Se muestra la sección de capítulos + Ocultar \"Cómo se hizo este contenido\" + La sección Cómo se hizo este contenido está oculta + Se muestra la sección Cómo se hizo este contenido + Ocultar puntos de Hype + Los puntos de Hype están ocultos + Los puntos de Hype están visibles + Ocultar \"Explora el pódcast\" + La sección Explora el pódcast está oculta + Se muestra la sección Explora el pódcast + Ocultar enlaces destacados + La sección de enlaces destacados está oculta + La sección de enlaces destacados es visible + Ocultar vídeos destacados + La sección de vídeos destacados está oculta + La sección de vídeos destacados es visible + Ocultar tarjetas de información + La sección de tarjetas de información está oculta + Se muestra la sección de tarjetas de información + Ocultar \"Conceptos clave\" + La sección Conceptos clave está oculta + Se muestra la sección Conceptos clave + Ocultar botón de Suscribirse + El botón de Suscribirse está oculto + El botón de Suscribirse es visible + Ocultar transcripción + La sección transcripción está oculta + Se muestra la sección transcripción + Descripción del vídeo + Ocultar o mostrar componentes de descripción de vídeo + Barra de filtros + Ocultar o mostrar la barra de filtros en las fuentes, vídeos relacionados, resultados de búsqueda e historial de reproducciones + Ocultar en feeds + Oculto en feeds + Visible en feeds + Ocultar en vídeos relacionados + Oculto en vídeos relacionados + Mostrar en vídeos relacionados + Ocultar en los resultados de búsqueda + Oculto en los resultados de búsqueda + Mostrado en los resultados de búsqueda + Ocultar en el historial de reproducciones + Oculto en el historial de reproducciones + Mostrado en el historial de reproducciones + Página del canal + Ocultar o mostrar componentes de la página del canal + + Ocultar botón de Comunidad + El botón de la comunidad está oculto + El botón de la comunidad es visible + + Ocultar la sección \"Para ti\" + La estantería \"Para ti\" está oculta + La estantería \"Para ti\" es visible + + Ocultar el botón \"Unirse\" + El botón Unirse está oculto + El botón Unirse es visible + Ocultar vista previa de enlaces + La vista previa de enlaces está oculta + Vista previa de enlaces visible + Ocultar estantería de miembros + La estantería de miembros está oculta + La estantería de miembros se muestra + + Ocultar el botón Tienda + El botón Tienda está oculto + El botón Tienda es visible + + Ocultar el botón Suscribirse + El botón Suscribirse está oculto + El botón Suscribirse es visible + Comentarios + Ocultar o mostrar los componentes de sección de comentarios + Ocultar resumen de chat de IA + El resumen del chat de IA está oculto + El resumen del chat de IA es visible + Ocultar el resumen de los comentarios de la IA + El resumen de comentarios de IA está oculto + El resumen de comentarios de IA es visible + Ocultar directrices del canal + Las directrices del canal están ocultas + Las directrices del canal se muestran + Ocultar encabezado \'Comentarios por miembros\' + El encabezado Comentarios de los miembros está oculto + Se muestra el encabezado Comentarios de los miembros + Ocultar sección de comentarios + La sección de comentarios está oculta + Sección de comentarios mostrada + Ocultar directrices de la comunidad + Directrices de la comunidad ocultas + Directrices de la comunidad visibles + Ocultar botón \'Crear un Short\' + El botón Crear un Short está oculto + Se muestra el botón Crear un Short + Ocultar botones de Emoji y Marca de tiempo + Los botones de Emoji y Marca de tiempo están ocultos + Los botones de Emoji y Marca de tiempo están visibles + Ocultar vista previa de comentarios + La vista previa de comentarios está oculta + La vista previa de comentarios es visible + Ocultar botón Gracias + El botón de gracias está oculto + Se muestra el botón de gracias + Ocultar recuento de visualizaciones + El recuento de visualizaciones está oculto en el feed y los resultados de búsqueda + El recuento de visualizaciones se muestra en el feed y los resultados de búsqueda + + "Limitaciones: • Las estanterías de Shorts, las páginas de canal y los resultados de búsqueda aún pueden mostrar el recuento de visualizaciones • Esta característica no funciona con el factor de forma automotriz" - Ocultar hora de subida - La hora de subida está oculta en el feed y los resultados de búsqueda - La hora de subida se muestra en el feed y los resultados de búsqueda - - "Limitaciones: + Ocultar hora de subida + La hora de subida está oculta en el feed y los resultados de búsqueda + La hora de subida se muestra en el feed y los resultados de búsqueda + + "Limitaciones: • Las estanterías de Shorts, las páginas de canales y los resultados de búsqueda aún pueden mostrar los tiempos de subida • Esta función no funciona con el factor de forma automotriz" - Ocultar contenido de palabra clave - Ocultar videos de búsqueda y feed usando filtros de palabras clave - Ocultar videos domésticos por palabras clave - Los vídeos en la pestaña \'Inicio\' son filtrados por palabras clave - Los vídeos en la pestaña \'Inicio\' no son filtrados por palabras clave - Ocultar resultados de búsqueda por palabras clave - Los resultados de la búsqueda son filtrados por palabras clave - Los resultados de la búsqueda no son filtrados por palabras clave - Ocultar vídeos de suscripción por palabras clave - Los vídeos en la pestaña \'Suscripciones\' son filtrados por palabras clave - Los vídeos en la pestaña \'Suscripciones\' no son filtrados por palabras clave - Palabras clave a ocultar - - "Las palabras y frases que se ocultan, separadas por nuevas líneas + "Las palabras y frases que se ocultan, separadas por nuevas líneas Las palabras clave pueden ser nombres de canales o cualquier texto que aparezca en los títulos de los vídeos Las palabras con mayúsculas en medio deben introducirse con las mayúsculas (es decir, iPhone, TikTok, LeBlanc)" - Acerca del filtrado de palabras clave - "Los resultados de búsqueda de Home/Suscripción/Búsqueda se filtran para ocultar el contenido que coincida con las frases de palabras clave + Acerca del filtrado de palabras clave + "Los resultados de búsqueda de Home/Suscripción/Búsqueda se filtran para ocultar el contenido que coincida con las frases de palabras clave Limitaciones • Los vídeos cortos no se pueden ocultar por nombre de canal • Es posible que algunos componentes de la interfaz de usuario no estén ocultos • La búsqueda de una palabra clave puede no mostrar ningún resultado" - Coincidir palabras completas - - Rodear una palabra clave/frase con comillas dobles evitará las coincidencias parciales de títulos de vídeo y nombres de canales<br><br>Por ejemplo,<br><b>\"ai\"</b> ocultará el vídeo: <b>¿Cómo funciona la AI?</b><br>pero no ocultará: <b>¿Quieres aprender a bailar?</b> - - No se puede usar la palabra clave: %s - Añadir comillas para usar palabra clave: %s - La palabra clave tiene declaraciones conflictivas: %s - La palabra clave es demasiado corta y requiere comillas: %s - La palabra clave ocultará todos los vídeos: %s - - - Ocultar estantería de la tienda del creador - La estantería de la tienda del creador debajo del reproductor de vídeo está oculta - La estantería de la tienda del creador debajo del reproductor de vídeo es visible - Ocultar banner de la tienda en la pantalla final - El banner de la tienda de la pantalla final está oculto - El banner de la tienda de la pantalla final es visible - Ocultar anuncios a pantalla completa - "Los anuncios a pantalla completa están ocultos + Coincidir palabras completas + + Rodear una palabra clave/frase con comillas dobles evitará las coincidencias parciales de títulos de vídeo y nombres de canales<br><br>Por ejemplo,<br><b>\"ai\"</b> ocultará el vídeo: <b>¿Cómo funciona la AI?</b><br>pero no ocultará: <b>¿Quieres aprender a bailar?</b> + + No se puede usar la palabra clave: %s + Añadir comillas para usar palabra clave: %s + La palabra clave tiene declaraciones conflictivas: %s + La palabra clave es demasiado corta y requiere comillas: %s + La palabra clave ocultará todos los vídeos: %s + + + Ocultar estantería de la tienda del creador + La estantería de la tienda del creador debajo del reproductor de vídeo está oculta + La estantería de la tienda del creador debajo del reproductor de vídeo es visible + Ocultar banner de la tienda en la pantalla final + El banner de la tienda de la pantalla final está oculto + El banner de la tienda de la pantalla final es visible + Ocultar anuncios a pantalla completa + "Los anuncios a pantalla completa están ocultos Esta función solo está disponible para dispositivos antiguos" - Se muestran anuncios a pantalla completa - - Ocultar anuncios a pantalla completa solo funciona con dispositivos antiguos - Ocultar anuncios generales - Los anuncios generales están ocultos - Se muestran anuncios generales - Ocultar banners publicitarios - Los banners publicitarios están ocultos - Se muestran los banners publicitarios - Ocultar etiqueta de promoción de pago - Etiqueta de promoción pagada está oculta - Etiqueta de promoción pagada se muestra - Ocultar tarjetas autopatrocinadas - Las tarjetas autopatrocinadas están ocultas - Se muestran las tarjetas autopatrocinadas - Ocultar enlaces de compras - Los enlaces de compra en la descripción del vídeo están ocultos - Se muestran los enlaces de compras en la descripción del video - Ocultar el banner \"Ver productos\" - El banner \"Ver productos\" en la superposición de vídeo está oculto - El banner \"Ver productos\" en la superposición de vídeo es visible - Ocultar resultados de búsqueda web - Los resultados de búsqueda web están ocultos - Se muestran los resultados de la búsqueda web - - - Ocultar promociones de YouTube Premium - Las promociones de YouTube Premium en el reproductor de vídeo están ocultas - Se muestran las promociones de YouTube Premium en el reproductor de vídeo - - - Ocultar anuncios de vídeo - Los anuncios de vídeo están ocultos - Los anuncios de vídeo se muestran - - - URL copiada al portapapeles - URL con marca de tiempo copiada - Mostrar botón URL de copia de vídeo - El botón Copiar URL del vídeo es visible. Toca para copiar la URL del vídeo. Mantén pulsado para copiar con marca de tiempo - El botón Copiar URL del vídeo no es visible - Mostrar botón URL de la marca de tiempo - El botón Copiar URL con marca de tiempo es visible. Toca para copiar la URL del vídeo con marca de tiempo. Mantén pulsado para copiar sin marca de tiempo - El botón Copiar URL con marca de tiempo no es visible - - - Eliminar diálogo de discreción del espectador - Se quitará el diálogo - Se mostrará el diálogo - Esto no evita la restricción de edad. Solo la acepta automáticamente. - - - Desactivar la ventana emergente \"Iniciar sesión en TV\" - La ventana emergente de Iniciar sesión en TV está desactivada - La ventana emergente de Iniciar sesión en TV está activada - - - Deshabilitar el salto de capítulo con doble toque - El doble toque nunca puede activar un salto al capítulo siguiente/anterior - El doble toque puede ocasionalmente activar un salto al capítulo siguiente/anterior - - - Descargas externas - Configuración para el uso de un descargador externo - Mostrar botón externo de descarga - Se muestra el botón de descarga en el reproductor - No se muestra el botón de descarga en el reproductor - - Anular el botón de acción de descarga - El botón de descarga abre su descarga externa - El botón de descarga abre el descargador nativo en la aplicación - Nombre del paquete del descargado - Nombre del paquete de tu aplicación de descarga externa instalada - Introduce el nombre del paquete - Otro - Aplicación no instalada - %s no está instalado. Por favor, instálelo. - "No se pudo encontrar la aplicación instalada con el nombre de paquete: %s + Se muestran anuncios a pantalla completa + + Ocultar anuncios a pantalla completa solo funciona con dispositivos antiguos + Ocultar anuncios generales + Los anuncios generales están ocultos + Se muestran anuncios generales + Ocultar banners publicitarios + Los banners publicitarios están ocultos + Se muestran los banners publicitarios + Ocultar etiqueta de promoción de pago + Etiqueta de promoción pagada está oculta + Etiqueta de promoción pagada se muestra + Ocultar tarjetas autopatrocinadas + Las tarjetas autopatrocinadas están ocultas + Se muestran las tarjetas autopatrocinadas + Ocultar enlaces de compras + Los enlaces de compra en la descripción del vídeo están ocultos + Se muestran los enlaces de compras en la descripción del video + Ocultar el banner \"Ver productos\" + El banner \"Ver productos\" en la superposición de vídeo está oculto + El banner \"Ver productos\" en la superposición de vídeo es visible + Ocultar resultados de búsqueda web + Los resultados de búsqueda web están ocultos + Se muestran los resultados de la búsqueda web + + + Ocultar promociones de YouTube Premium + Las promociones de YouTube Premium en el reproductor de vídeo están ocultas + Se muestran las promociones de YouTube Premium en el reproductor de vídeo + + + Ocultar anuncios de vídeo + Los anuncios de vídeo están ocultos + Los anuncios de vídeo se muestran + + + URL copiada al portapapeles + URL con marca de tiempo copiada + Mostrar botón URL de copia de vídeo + El botón Copiar URL del vídeo es visible. Toca para copiar la URL del vídeo. Mantén pulsado para copiar con marca de tiempo + El botón Copiar URL del vídeo no es visible + Mostrar botón URL de la marca de tiempo + El botón Copiar URL con marca de tiempo es visible. Toca para copiar la URL del vídeo con marca de tiempo. Mantén pulsado para copiar sin marca de tiempo + El botón Copiar URL con marca de tiempo no es visible + + + Eliminar diálogo de discreción del espectador + Se quitará el diálogo + Se mostrará el diálogo + Esto no evita la restricción de edad. Solo la acepta automáticamente. + + + Desactivar la ventana emergente \"Iniciar sesión en TV\" + La ventana emergente de Iniciar sesión en TV está desactivada + La ventana emergente de Iniciar sesión en TV está activada + + + Deshabilitar el salto de capítulo con doble toque + El doble toque nunca puede activar un salto al capítulo siguiente/anterior + El doble toque puede ocasionalmente activar un salto al capítulo siguiente/anterior + + + Descargas externas + Configuración para el uso de un descargador externo + Mostrar botón externo de descarga + Se muestra el botón de descarga en el reproductor + No se muestra el botón de descarga en el reproductor + + Anular el botón de acción de descarga + El botón de descarga abre su descarga externa + El botón de descarga abre el descargador nativo en la aplicación + Nombre del paquete del descargado + Nombre del paquete de tu aplicación de descarga externa instalada + Introduce el nombre del paquete + Otro + Aplicación no instalada + %s no está instalado. Por favor, instálelo. + "No se pudo encontrar la aplicación instalada con el nombre de paquete: %s Verifica que el nombre del paquete sea correcto y que la aplicación esté instalada" - El nombre del paquete no puede estar vacío - - - Desactivar gesto de búsqueda preciso - El gesto está desactivado - Gesto activado - - - Habilitar tocar para buscar - Tocar para buscar está activado - Tocar para buscar está desactivado - - - Activar gesto de brillo - "El deslizamiento de brillo a pantalla completa está activado + El nombre del paquete no puede estar vacío + + + Desactivar gesto de búsqueda preciso + El gesto está desactivado + Gesto activado + + + Habilitar tocar para buscar + Tocar para buscar está activado + Tocar para buscar está desactivado + + + Activar gesto de brillo + "El deslizamiento de brillo a pantalla completa está activado Ajusta el brillo deslizando verticalmente en el lado izquierdo de la pantalla" - El deslizamiento de brillo a pantalla completa está desactivado - Activar gesto de volumen - "Deslizar el volumen en pantalla completa está activado + El deslizamiento de brillo a pantalla completa está desactivado + Activar gesto de volumen + "Deslizar el volumen en pantalla completa está activado Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla" - Deslizar volumen está desactivado - Activar gesto de pulsar para deslizar - Pulsar para deslizar está activado - Pulsar para deslizar está desactivado - Activar respuesta háptica - Comentarios hápticos habilitados - Respuesta háptica deshabilitada - Guardar y restaurar brillo - Guardar y restaurar brillo al salir o entrar en pantalla completa - No guardar ni restaurar brillo al salir o entrar en pantalla completa - Activar gesto de brillo automático - Deslizar hacia abajo hasta el valor más bajo del gesto de brillo permite el brillo automático - Deslizar hacia abajo hasta el valor más bajo no habilita el brillo automático - Automático - Tiempo de espera del deslizado - La cantidad de milisegundos que la superposición es visible - Opacidad del fondo de la superposición de deslizamiento - Valor de opacidad entre 0-100 - La opacidad de superposición de deslizamiento debe ser de entre 0-100 - Color del brillo de la superposición de deslizamiento - El color de la barra de progreso para los controles de brillo - Color del volumen de la superposición de deslizamiento - El color de la barra de progreso para los controles de volumen - Tamaño del texto de la superposición de deslizamiento - El tamaño del texto para la superposición de deslizamiento entre 1 y 30 - El tamaño del texto debe estar entre 1 y 30 - Umbral de magnitud del deslizamiento - La cantidad de umbral para que se desliza - Sensibilidad del deslizamiento de volumen - Cuánto cambia el volumen por deslizamiento - Estilo de superposición de deslizamiento - Superposición horizontal - Superposición horizontal (mínima - superior) - Superposición horizontal (mínima - centro) - Superposición circular - Superposición circular (mínima) - Superposición vertical - Superposición vertical (mínima) - Habilita el deslizamiento para cambiar videos - Deslizar en modo de pantalla completa cambiará al video siguiente/anterior - Deslizar en modo de pantalla completa no cambiará al video siguiente/anterior - - - Desactivar auto subtítulos - Los subtítulos Auto están desactivados - Los subtítulos Auto están activados - - - Botones de acción - Ocultar o mostrar botones en videos - Desactivar el brillo de los botones Me gusta y Suscribirse - Los botones Me gusta y Suscribirse no brillarán cuando se mencionen - Los botones Me gusta y Suscribirse brillarán cuando se mencionen - Ocultar me gusta y no me gusta - Botones \"Me gusta\" y \"No me gusta\" están ocultos - Se muestran botones \"Me gusta\" y \"No me gusta\" - - Ocultar Compartir - El botón Compartir está oculto - Se muestra el botón Compartir - - Ocultar Detener anuncios - El botón de detener anuncios está oculto - El botón de detener anuncios está mostrado - - Ocultar comentarios - El botón de comentarios está oculto - El botón de comentarios es visible - + Ocultar Compartir + El botón Compartir está oculto + Se muestra el botón Compartir + + Ocultar Detener anuncios + El botón de detener anuncios está oculto + El botón de detener anuncios está mostrado + + Ocultar comentarios + El botón de comentarios está oculto + El botón de comentarios es visible + - Ocultar informe - El botón Reportar está oculto - Se muestra el botón Reportar - - Ocultar Remix - El botón Remix está oculto - Se muestra el botón Remix - - Ocultar descarga - El botón de descarga está oculto - Se muestra el botón de descarga - + Ocultar Remix + El botón Remix está oculto + Se muestra el botón Remix + + Ocultar descarga + El botón de descarga está oculto + Se muestra el botón de descarga + - Ocultar Hype - El botón Hype está oculto - El botón de hype es visible - - Ocultar pestaña \'Promocionar\' - El botón de Promocionar está oculto - El botón de Promocionar es visible - - Ocultar Gracias - El botón de gracias está oculto - Se muestra el botón de gracias - + Ocultar pestaña \'Promocionar\' + El botón de Promocionar está oculto + El botón de Promocionar es visible + + Ocultar Gracias + El botón de gracias está oculto + Se muestra el botón de gracias + - Ocultar pregunta - El botón \"Preguntar\" está oculto - Se muestra el botón \"Preguntar\" - - Ocultar Recortar - El botón del recortar está oculto - Se muestra el botón de recortar - - Ocultar Tienda - El botón de la Tienda está oculto - El botón de la Tienda es visible - - Ocultar Guardar - El botón de Guardar está oculto - El botón de Guardar está mostrado - - - Botones de navegación - Ocultar o cambiar botones en la barra de navegación - - Ocultar pestaña \'Inicio\' - El botón de inicio está oculto - El botón de inicio es visible - - Ocultar pestaña \'Shorts\' - El botón de Shorts está oculto - El botón de Shorts es visible - - Ocultar Crear - El botón Crear está oculto - Se muestra el botón Crear - - Ocultar pestaña \'Suscripciones\' - El botón Suscripciones está oculto - Se muestra el botón Suscripciones - Ocultar Notificaciones - El botón de Notificaciones está oculto - Se muestra el botón de Notificaciones - - Cambiar botón Crear con el de Notificaciones - "El botón Crear se cambia por el botón Notificaciones + Ocultar pregunta + El botón \"Preguntar\" está oculto + Se muestra el botón \"Preguntar\" + + Ocultar Recortar + El botón del recortar está oculto + Se muestra el botón de recortar + + Ocultar Tienda + El botón de la Tienda está oculto + El botón de la Tienda es visible + + Ocultar Guardar + El botón de Guardar está oculto + El botón de Guardar está mostrado + + + Botones de navegación + Ocultar o cambiar botones en la barra de navegación + + Ocultar pestaña \'Inicio\' + El botón de inicio está oculto + El botón de inicio es visible + + Ocultar pestaña \'Shorts\' + El botón de Shorts está oculto + El botón de Shorts es visible + + Ocultar Crear + El botón Crear está oculto + Se muestra el botón Crear + + Ocultar pestaña \'Suscripciones\' + El botón Suscripciones está oculto + Se muestra el botón Suscripciones + Ocultar Notificaciones + El botón de Notificaciones está oculto + Se muestra el botón de Notificaciones + + Cambiar botón Crear con el de Notificaciones + "El botón Crear se cambia por el botón Notificaciones Nota: Habilitar esto también ocultará forzosamente los anuncios de vídeo" - El botón Crear no se cambia con el botón de notificaciones - "Deshabilitar este ajuste también deshabilitará el bloqueo de anuncios de Shorts. + El botón Crear no se cambia con el botón de notificaciones + "Deshabilitar este ajuste también deshabilitará el bloqueo de anuncios de Shorts. Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito." - Ocultar etiquetas de navegación - Las etiquetas están ocultas - Las etiquetas son visibles - Desactivar la barra de estado translúcida - La barra de estado es opaca - La barra de estado es opaca o translúcida - En algunos dispositivos, habilitar esta función puede cambiar la barra de navegación del sistema a transparente. - Desactivar la barra translúcida clara - La barra de navegación en modo claro es opaca - La barra de navegación en modo claro es opaca o translúcida - Desactivar la barra translúcida oscura - La barra de navegación en modo oscuro es opaca - La barra de navegación en modo oscuro es opaca o translúcida - - - Menú desplegable - Ocultar o mostrar elementos del menú desplegable del reproductor - - Ocultar Subtítulos - Menú de subtítulos oculto - Se muestra el menú de subtítulos - - Ocultar ajustes adicionales - Menú de configuración adicional oculto - Se muestra el menú de configuración adicional - - Ocultar temporizador de sueño - Menú de temporizador de sueño oculto - El menú de temporizador de sueño se muestra - - Ocultar video de bucle - El menú de vídeo en bucle está oculto - El menú de vídeo en bucle se muestra - - Ocultar Modo ambiente - Menú de Modo ambiente oculto - Se muestra el menú de Modo ambiente - Ocultar \'Volumen estable\' - El menú de volumen estable es visible - El menú de volumen estable está oculto - - Ocultar Ayuda & comentarios - El menú Ayuda & comentarios está oculto - Se muestra el menú Ayuda & comentarios - - Ocultar velocidad de reproducción - Menú de velocidad de reproducción oculto - Mostrar menú de velocidad de reproducción - - Ocultar pantalla de bloqueo - El menú de la pantalla de bloqueo está oculto - Se muestra el menú de pantalla de bloqueo - - Ocultar Escuchar con YouTube Music - El menú Escuchar con YouTube Music está oculto - El menú Escuchar con YouTube Music está visible - - Ocultar pista de audio - El menú de pista de audio está oculto - El menú de pista de audio se muestra - + Ocultar Subtítulos + Menú de subtítulos oculto + Se muestra el menú de subtítulos + + Ocultar ajustes adicionales + Menú de configuración adicional oculto + Se muestra el menú de configuración adicional + + Ocultar temporizador de sueño + Menú de temporizador de sueño oculto + El menú de temporizador de sueño se muestra + + Ocultar video de bucle + El menú de vídeo en bucle está oculto + El menú de vídeo en bucle se muestra + + Ocultar Modo ambiente + Menú de Modo ambiente oculto + Se muestra el menú de Modo ambiente + Ocultar \'Volumen estable\' + El menú de volumen estable es visible + El menú de volumen estable está oculto + + Ocultar Ayuda & comentarios + El menú Ayuda & comentarios está oculto + Se muestra el menú Ayuda & comentarios + + Ocultar velocidad de reproducción + Menú de velocidad de reproducción oculto + Mostrar menú de velocidad de reproducción + + Ocultar pantalla de bloqueo + El menú de la pantalla de bloqueo está oculto + Se muestra el menú de pantalla de bloqueo + + Ocultar Escuchar con YouTube Music + El menú Escuchar con YouTube Music está oculto + El menú Escuchar con YouTube Music está visible + + Ocultar pista de audio + El menú de pista de audio está oculto + El menú de pista de audio se muestra + - "El menú de la pista de audio está oculto + "El menú de la pista de audio está oculto Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de video' a 'Android No SDK'" - - Ocultar reloj en VR - Ver en el menú VR está oculto - Ver en el menú VR se muestra - Ocultar menú de calidad de vídeo - El menú de calidad de vídeo está oculto - El menú de calidad de vídeo es visible - Ocultar pie de página del menú de calidad de vídeo - Pie de menú de calidad de vídeo oculto - El pie del menú de calidad de vídeo se muestra - - - Ocultar el botón Reproducción automática - El botón de reproducción automática está oculto - Se muestra el botón de reproducción automática - - Ocultar el botón Subtítulos - Botón de subtítulos oculto - Botón de subtítulos mostrado - Ocultar el botón Transmitir - El botón de envío a otros dispositivos está oculto - El botón de envío a otros dispositivos es visible - Ocultar fondo de los controles del reproductor - El fondo de los controles del reproductor está oculto - Se muestra el fondo de los controles del reproductor - Ocultar botones Anterior & Siguiente - Los botones están ocultos - Los botones se muestran - - - Ocultar tarjetas de pantalla final - Las tarjetas de pantalla de fin están ocultas - Se muestran las tarjetas de la pantalla final - - - Desactivar el modo Ambiente en pantalla completa - Modo ambiente desactivado - Modo ambiente activado - - - Ocultar tarjetas de información - Las tarjetas de información están ocultas - Las tarjetas de información son visibles - - - Desactivar animaciones de número de rodamiento - Los números de registro no están animados - Los números de registro son animados - - - Ocultar barra de búsqueda del reproductor de vídeo - La barra de búsqueda del reproductor de vídeo está oculta - La barra de búsqueda del reproductor de vídeo se muestra - - Ocultar barra de búsqueda de miniaturas de vídeo - La barra de búsqueda de miniaturas de vídeo está oculta - La barra de búsqueda de miniaturas de vídeo es visible - - - Reproductor de Shorts - Ocultar o mostrar componentes del reproductor de Shorts - - Ocultar Shorts en la pestaña de Inicio - Oculto en la página principal y vídeos relacionados - Visible en la página principal y vídeos relacionados - Ocultar Shorts en los resultados de búsqueda - Ocultos en los resultados de búsqueda - Mostrar en los resultados de búsqueda - - Ocultar Shorts en la pestaña de Suscripciones - Oculto en el feed de Suscripciones - Visible en el feed de Suscripciones - Ocultar Shorts en el historial de visualización - Oculto en el historial de visualización - Mostrado en el historial de visualización - Ocultar la etiqueta \"Doblado automáticamente\" - La etiqueta de doblaje automático está oculta - La etiqueta de doblaje automático está visible - Ocultar el botón \"Comprar Super Gracias\" - El botón Comprar Super Thanks está oculto - El botón Comprar Super Thanks es visible - Ocultar botón de efecto - El botón de efecto está oculto - El botón de efecto es visible - Ocultar el botón \"Pantalla verde\" - El botón verde de pantalla está oculto - Se muestra el botón verde de pantalla - Ocultar botón de hashtag - El botón Hashtag está oculto - Se muestra el botón Hashtag - - Ocultar el botón Unirse - Botón de unión oculto - Se muestra el botón de unirse - Ocultar vista previa en vivo - La vista previa en vivo está oculta - La vista previa en vivo se muestra - Ocultar etiqueta de ubicación - Etiqueta de ubicación oculta - Etiqueta de ubicación mostrada - Ocultar el botón \"Nuevas publicaciones\" - El botón Publicaciones nuevas está oculto - Se muestra el botón Publicaciones nuevas - Ocultar botones de superposición en pausa - Los botones de superposición pausados están ocultos - Se muestran los botones de superposición pausados - Ocultar vista previa de comentarios - La vista previa de comentarios está oculta - La vista previa de comentarios es visible - Ocultar el botón \"Guardar música\" - El botón Guardar música está oculto - Mostrar el botón de guardar música - Ocultar sugerencias de búsqueda - Las sugerencias de búsqueda están ocultas - Se muestran sugerencias de búsqueda - Ocultar el botón Comprar - El botón de la tienda está oculto - Se muestra el botón de la tienda - Ocultar stickers - Los pegatinas están ocultos - Se muestran pegatinas - Ocultar el botón Suscribirse - El botón de suscripción está oculto - Se muestra el botón de suscripción - Ocultar productos etiquetados - Los productos etiquetados están ocultos - Los productos etiquetados se muestran - Ocultar el botón Próximos - El botón próximo está oculto - Se muestra el botón próximo - Ocultar el botón \"Usar este sonido\" - El botón Usar este sonido está oculto - El botón Usar este sonido es visible - Ocultar el botón \"Usar esta plantilla\" - El botón Usar esta plantilla está oculto - El botón Usar esta plantilla se muestra - Ocultar la animación de la fuente de Me gusta - La animación de fuente de botón \"Me gusta\" está oculta - Se muestra la animación de fuente de botón \"Me gusta\" - Ocultar el botón Me gusta - El botón Me gusta está oculto - Se muestra el botón Me Gusta - Ocultar el botón No me gusta - El botón no me gusta está oculto - El botón no me gusta se muestra - Ocultar el botón Comentarios - El botón de comentarios está oculto - Se muestra el botón de comentarios - - Ocultar el botón Compartir - El botón Compartir está oculto - Se muestra el botón Compartir - - Ocultar el botón Remix - El botón Remix está oculto - Se muestra el botón Remix - Ocultar botón de sonido - Botón de sonido oculto - Se muestra el botón de sonido - Ocultar panel de información - Panel de información oculto - Se muestra el panel de información - Ocultar barra de canal - Barra de canales oculta - Barra de canales mostrada - Ocultar título de vídeo - El título del vídeo está oculto - El título del vídeo es visible - Ocultar etiqueta de metadatos de sonido - La etiqueta de metadatos de sonido está oculta - La etiqueta de metadatos de sonido es visible - Ocultar la etiqueta del enlace del video - Etiqueta de enlace de vídeo oculto - Etiqueta de enlace de vídeo mostrada - Ocultar barra de navegación - La barra de navegación está oculta - La barra de navegación es visible - - - Ocultar el vídeo sugerido de la pantalla final - "El vídeo sugerido de la pantalla final se oculta cuando la reproducción automática está desactivada + + Ocultar reloj en VR + Ver en el menú VR está oculto + Ver en el menú VR se muestra + Ocultar menú de calidad de vídeo + El menú de calidad de vídeo está oculto + El menú de calidad de vídeo es visible + Ocultar pie de página del menú de calidad de vídeo + Pie de menú de calidad de vídeo oculto + El pie del menú de calidad de vídeo se muestra + + + Ocultar el botón Reproducción automática + El botón de reproducción automática está oculto + Se muestra el botón de reproducción automática + + Ocultar el botón Subtítulos + Botón de subtítulos oculto + Botón de subtítulos mostrado + Ocultar el botón Transmitir + El botón de envío a otros dispositivos está oculto + El botón de envío a otros dispositivos es visible + Ocultar fondo de los controles del reproductor + El fondo de los controles del reproductor está oculto + Se muestra el fondo de los controles del reproductor + Ocultar botones Anterior & Siguiente + Los botones están ocultos + Los botones se muestran + + + Ocultar tarjetas de pantalla final + Las tarjetas de pantalla de fin están ocultas + Se muestran las tarjetas de la pantalla final + + + Desactivar el modo Ambiente en pantalla completa + Modo ambiente desactivado + Modo ambiente activado + + + Ocultar tarjetas de información + Las tarjetas de información están ocultas + Las tarjetas de información son visibles + + + Desactivar animaciones de número de rodamiento + Los números de registro no están animados + Los números de registro son animados + + + Ocultar barra de búsqueda del reproductor de vídeo + La barra de búsqueda del reproductor de vídeo está oculta + La barra de búsqueda del reproductor de vídeo se muestra + + Ocultar barra de búsqueda de miniaturas de vídeo + La barra de búsqueda de miniaturas de vídeo está oculta + La barra de búsqueda de miniaturas de vídeo es visible + + + Reproductor de Shorts + Ocultar o mostrar componentes del reproductor de Shorts + + Ocultar Shorts en la pestaña de Inicio + Oculto en la página principal y vídeos relacionados + Visible en la página principal y vídeos relacionados + Ocultar Shorts en los resultados de búsqueda + Ocultos en los resultados de búsqueda + Mostrar en los resultados de búsqueda + + Ocultar Shorts en la pestaña de Suscripciones + Oculto en el feed de Suscripciones + Visible en el feed de Suscripciones + Ocultar Shorts en el historial de visualización + Oculto en el historial de visualización + Mostrado en el historial de visualización + Ocultar la etiqueta \"Doblado automáticamente\" + La etiqueta de doblaje automático está oculta + La etiqueta de doblaje automático está visible + Ocultar el botón \"Comprar Super Gracias\" + El botón Comprar Super Thanks está oculto + El botón Comprar Super Thanks es visible + Ocultar botón de efecto + El botón de efecto está oculto + El botón de efecto es visible + Ocultar el botón \"Pantalla verde\" + El botón verde de pantalla está oculto + Se muestra el botón verde de pantalla + Ocultar botón de hashtag + El botón Hashtag está oculto + Se muestra el botón Hashtag + + Ocultar el botón Unirse + Botón de unión oculto + Se muestra el botón de unirse + Ocultar vista previa en vivo + La vista previa en vivo está oculta + La vista previa en vivo se muestra + Ocultar etiqueta de ubicación + Etiqueta de ubicación oculta + Etiqueta de ubicación mostrada + Ocultar el botón \"Nuevas publicaciones\" + El botón Publicaciones nuevas está oculto + Se muestra el botón Publicaciones nuevas + Ocultar botones de superposición en pausa + Los botones de superposición pausados están ocultos + Se muestran los botones de superposición pausados + Ocultar vista previa de comentarios + La vista previa de comentarios está oculta + La vista previa de comentarios es visible + Ocultar el botón \"Guardar música\" + El botón Guardar música está oculto + Mostrar el botón de guardar música + Ocultar sugerencias de búsqueda + Las sugerencias de búsqueda están ocultas + Se muestran sugerencias de búsqueda + Ocultar el botón Comprar + El botón de la tienda está oculto + Se muestra el botón de la tienda + Ocultar stickers + Los pegatinas están ocultos + Se muestran pegatinas + Ocultar el botón Suscribirse + El botón de suscripción está oculto + Se muestra el botón de suscripción + Ocultar productos etiquetados + Los productos etiquetados están ocultos + Los productos etiquetados se muestran + Ocultar el botón Próximos + El botón próximo está oculto + Se muestra el botón próximo + Ocultar el botón \"Usar este sonido\" + El botón Usar este sonido está oculto + El botón Usar este sonido es visible + Ocultar el botón \"Usar esta plantilla\" + El botón Usar esta plantilla está oculto + El botón Usar esta plantilla se muestra + Ocultar la animación de la fuente de Me gusta + La animación de fuente de botón \"Me gusta\" está oculta + Se muestra la animación de fuente de botón \"Me gusta\" + Ocultar el botón Me gusta + El botón Me gusta está oculto + Se muestra el botón Me Gusta + Ocultar el botón No me gusta + El botón no me gusta está oculto + El botón no me gusta se muestra + Ocultar el botón Comentarios + El botón de comentarios está oculto + Se muestra el botón de comentarios + + Ocultar el botón Compartir + El botón Compartir está oculto + Se muestra el botón Compartir + + Ocultar el botón Remix + El botón Remix está oculto + Se muestra el botón Remix + Ocultar botón de sonido + Botón de sonido oculto + Se muestra el botón de sonido + Ocultar panel de información + Panel de información oculto + Se muestra el panel de información + Ocultar barra de canal + Barra de canales oculta + Barra de canales mostrada + Ocultar título de vídeo + El título del vídeo está oculto + El título del vídeo es visible + Ocultar etiqueta de metadatos de sonido + La etiqueta de metadatos de sonido está oculta + La etiqueta de metadatos de sonido es visible + Ocultar la etiqueta del enlace del video + Etiqueta de enlace de vídeo oculto + Etiqueta de enlace de vídeo mostrada + Ocultar barra de navegación + La barra de navegación está oculta + La barra de navegación es visible + + + Ocultar el vídeo sugerido de la pantalla final + "El vídeo sugerido de la pantalla final se oculta cuando la reproducción automática está desactivada La reproducción automática se puede cambiar en la configuración de YouTube: Configuración → Reproducción → Reproducir el siguiente vídeo automáticamente" - Se muestra el vídeo sugerido de la pantalla final - - - Ocultar la superposición de vídeos relacionados - La superposición de vídeos relacionados en pantalla completa está oculta - La superposición de vídeos relacionados en pantalla completa es visible - - - Ocultar fecha y hora de vídeo - Marca de tiempo oculta - Marca de tiempo mostrada - - - Ocultar paneles emergentes del reproductor - Los paneles emergentes del reproductor están ocultos - Se muestran paneles emergentes del reproductor - - - Salir del modo de pantalla completa al final del vídeo - Desactivado - Salir de pantalla completa - Paisaje - Retrato y paisaje - - - Abrir vídeos en el retrato de pantalla completa - Videos abiertos a pantalla completa - Los vídeos no se abren en pantalla completa - - - Opacidad de superposición del reproductor - Valor de potencia entre 0-100, donde 0 es transparente - Opacidad del reproductor debe estar entre 0 y 100 - - - - No me gusta no disponible temporalmente - Dislikes no disponibles (estado %d) - Los Dislikes no están disponibles (límite de la API del cliente) - Dislikes no disponibles (%s) - - Recargar vídeo para votar usando Return YouTube Dislike - - Oculto por el propietario - Return YouTube Dislike - Dislikes son mostrados - No se muestran Dislikes - Mostrar no me gusta en Shorts - "Los Dislikes en los Shorts se muestran + Se muestra el vídeo sugerido de la pantalla final + + + Ocultar la superposición de vídeos relacionados + La superposición de vídeos relacionados en pantalla completa está oculta + La superposición de vídeos relacionados en pantalla completa es visible + + + Ocultar fecha y hora de vídeo + Marca de tiempo oculta + Marca de tiempo mostrada + + + Ocultar paneles emergentes del reproductor + Los paneles emergentes del reproductor están ocultos + Se muestran paneles emergentes del reproductor + + + Salir del modo de pantalla completa al final del vídeo + Desactivado + Salir de pantalla completa + Paisaje + Retrato y paisaje + + + Abrir vídeos en el retrato de pantalla completa + Videos abiertos a pantalla completa + Los vídeos no se abren en pantalla completa + + + Opacidad de superposición del reproductor + Valor de potencia entre 0-100, donde 0 es transparente + Opacidad del reproductor debe estar entre 0 y 100 + + + + No me gusta no disponible temporalmente + Dislikes no disponibles (estado %d) + Los Dislikes no están disponibles (límite de la API del cliente) + Dislikes no disponibles (%s) + + Recargar vídeo para votar usando Return YouTube Dislike + + Oculto por el propietario + Return YouTube Dislike + Dislikes son mostrados + No se muestran Dislikes + Mostrar no me gusta en Shorts + "Los Dislikes en los Shorts se muestran Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito" - No se muestran los Dislikes en los Shorts - Desliza como porcentaje - Los Dislikes se muestran como un porcentaje - Los Dislikes se muestran como un número - - Botón Me gusta compacto - Botón \"Me gusta\" para el ancho mínimo - Botón \"Me gusta\" para una mejor apariencia - Mostrar estimación de \"me gusta\" - Los vídeos con \"me gusta\" desactivados muestran un recuento estimado de \"me gusta\" - No se muestran los \"me gusta\" estimados - Mostrar un brindis si la API no está disponible - Toast se muestra si Devolución de YouTube Dislike no está disponible - Toast no se muestra si Devolución de YouTube Dislike no está disponible - ReturnYouTubeDislike.com - Los datos son proporcionados por la API de Retorno de YouTube. Pulse aquí para aprender más - - Devuelve las estadísticas de la API de este dispositivo - Tiempo de respuesta de la API, promedio - Tiempo de respuesta de API, mínimo - Tiempo de respuesta de la API, máximo - Tiempo de respuesta API, último vídeo - Dislikes temporalmente no disponible - Límite de tasa de cliente API en efecto - Votaciones de la API, número de llamadas - No hay llamadas de red - Llamadas de red %d realizadas - Votos de búsqueda de API, número de tiempos de espera - No hay llamadas de red agotadas - Tiempo de espera de llamadas de red %d - Límites de velocidad del cliente API - No se encontraron límites de tasa de clientes - Límite de tasa de cliente encontrado %d veces - %d milisegundos - - - Habilitar barra de búsqueda ancha - Barra de búsqueda ancha habilitada - La barra de búsqueda ancha está desactivada - - - Habilitar miniaturas de alta calidad - Las miniuñas Seekbar son de alta calidad - Las miniuñas Seekbar son de calidad media - "Esto también restaurará las miniaturas en las transmisiones en vivo que no tengan miniaturas de la barra de búsqueda. + No se muestran los Dislikes en los Shorts + Desliza como porcentaje + Los Dislikes se muestran como un porcentaje + Los Dislikes se muestran como un número + + Botón Me gusta compacto + Botón \"Me gusta\" para el ancho mínimo + Botón \"Me gusta\" para una mejor apariencia + Mostrar estimación de \"me gusta\" + Los vídeos con \"me gusta\" desactivados muestran un recuento estimado de \"me gusta\" + No se muestran los \"me gusta\" estimados + Mostrar un brindis si la API no está disponible + Toast se muestra si Devolución de YouTube Dislike no está disponible + Toast no se muestra si Devolución de YouTube Dislike no está disponible + ReturnYouTubeDislike.com + Los datos son proporcionados por la API de Retorno de YouTube. Pulse aquí para aprender más + + Devuelve las estadísticas de la API de este dispositivo + Tiempo de respuesta de la API, promedio + Tiempo de respuesta de API, mínimo + Tiempo de respuesta de la API, máximo + Tiempo de respuesta API, último vídeo + Dislikes temporalmente no disponible - Límite de tasa de cliente API en efecto + Votaciones de la API, número de llamadas + No hay llamadas de red + Llamadas de red %d realizadas + Votos de búsqueda de API, número de tiempos de espera + No hay llamadas de red agotadas + Tiempo de espera de llamadas de red %d + Límites de velocidad del cliente API + No se encontraron límites de tasa de clientes + Límite de tasa de cliente encontrado %d veces + %d milisegundos + + + Habilitar barra de búsqueda ancha + Barra de búsqueda ancha habilitada + La barra de búsqueda ancha está desactivada + + + Habilitar miniaturas de alta calidad + Las miniuñas Seekbar son de alta calidad + Las miniuñas Seekbar son de calidad media + "Esto también restaurará las miniaturas en las transmisiones en vivo que no tengan miniaturas de la barra de búsqueda. Las miniaturas de la barra de búsqueda utilizarán la misma calidad que el vídeo actual. Esta función funciona mejor con una calidad de vídeo de 720p o inferior y cuando se utiliza una conexión a Internet muy rápida." - Restaurar antiguas miniaturas de la barra de búsqueda - Las miniaturas de la barra de búsqueda aparecerán por encima de la barra de búsqueda - Las miniaturas de Seekbar aparecerán en pantalla completa - - - Activar SponsorBlock - SponsorBlock es un sistema de colaboración abierta para omitir partes molestas de los vídeos de YouTube - Apariencia - Mostrar botón de voto - Se muestra el botón de voto del segmento - El botón de voto del segmento no se muestra - Usar diseño cuadrado - Los botones y los controles son cuadrados - Los botones y controles están redondeados - - Usar botón Saltar compacto - Omitir botón con estilo para el ancho mínimo - Omitir botón con estilo para la mejor apariencia - Ocultar automáticamente el botón Saltar - Omitir botón se oculta después de unos segundos - Se muestra el botón Saltar para todo el segmento - Duración del botón Omitir - Cuánto tiempo se deben mostrar los botones de \"saltar\" y \"saltar al momento destacado\" antes de ocultarse automáticamente - Mostrar mensaje emergente para deshacer omisión - Se muestra un mensaje emergente cuando un segmento se omite automáticamente. Toca la notificación de mensaje emergente para deshacer la omisión - El mensaje emergente no se muestra - Duración del mensaje emergente al omitir - Cuánto tiempo se debe mostrar el mensaje emergente de \"deshacer salto\" - 1 segundo - 2 segundos - 3 segundos - 4 segundos - 5 segundos - 6 segundos - 7 segundos - 8 segundos - 9 segundos - 10 segundos - Mostrar longitud de vídeo sin segmentos - La duración del vídeo, excluyendo todos los segmentos, se muestra en la barra de progreso - Longitud completa del vídeo mostrada - Creando nuevos segmentos - Mostrar el botón Crear nuevo segmento - Se muestra el botón de crear un nuevo segmento - No se muestra el botón de crear un nuevo segmento - Ajustar nuevo paso de segmento - Número de milisegundos que los botones de ajuste de tiempo se mueven al crear nuevos segmentos - El valor debe ser un número positivo - Ver normas - Las pautas contienen reglas y consejos para crear nuevos segmentos - Siga las pautas - Lee las pautas de SponsorBlock antes de crear nuevos segmentos - Ya leído - Múestrame - General - Mostrar un brindis si la API no está disponible - Toast se muestra si SponsorBlock no está disponible - Toast no se muestra si SponsorBlock no está disponible - Habilitar rastreo del conteo de saltos - Permite que la tabla de clasificación de SponsorBlock sepa cuánto tiempo se ha ahorrado. Un mensaje se envía al tablero de clasificación cada vez que se omite un segmento - El rastreo del conteo de saltos no está activado - Duración mínima del segmento - Los segmentos más cortos que este valor (en segundos) no se mostrarán o se omitirán - Duración de tiempo no válida - Tu id de usuario privado - Esto debería mantenerse privado. Es como una contraseña y no debe ser compartido con nadie. Si alguien obtiene esto, podran usarlo para suplantarte - El id de usuario privado debe tener al menos 30 caracteres - Cambiar la URL de la API - La dirección que SponsorBlock utiliza para hacer llamadas al servidor - URL de la API restablecida - La URL de API no es válida - La URL de la API cambió - Importar/Exportar Opciones - Copiar - Su configuración JSON de SponsorBlock que puede importarse/exportarse a ReVanced y otras plataformas SponsorBlock - Su configuración JSON de SponsorBlock que puede importarse/exportarse a ReVanced y otras plataformas SponsorBlock. Esto incluye tu id de usuario privado. Asegúrate de compartirlo sabiamente - Configuración importada correctamente - Error al importar: %s - Error al exportar: %s - "Tu configuración contiene una ID de usuario de SponsorBlock privada. + Restaurar antiguas miniaturas de la barra de búsqueda + Las miniaturas de la barra de búsqueda aparecerán por encima de la barra de búsqueda + Las miniaturas de Seekbar aparecerán en pantalla completa + + + Activar SponsorBlock + SponsorBlock es un sistema de colaboración abierta para omitir partes molestas de los vídeos de YouTube + Apariencia + Mostrar botón de voto + Se muestra el botón de voto del segmento + El botón de voto del segmento no se muestra + Usar diseño cuadrado + Los botones y los controles son cuadrados + Los botones y controles están redondeados + + Usar botón Saltar compacto + Omitir botón con estilo para el ancho mínimo + Omitir botón con estilo para la mejor apariencia + Ocultar automáticamente el botón Saltar + Omitir botón se oculta después de unos segundos + Se muestra el botón Saltar para todo el segmento + Duración del botón Omitir + Cuánto tiempo se deben mostrar los botones de \"saltar\" y \"saltar al momento destacado\" antes de ocultarse automáticamente + Mostrar mensaje emergente para deshacer omisión + Se muestra un mensaje emergente cuando un segmento se omite automáticamente. Toca la notificación de mensaje emergente para deshacer la omisión + El mensaje emergente no se muestra + Duración del mensaje emergente al omitir + Cuánto tiempo se debe mostrar el mensaje emergente de \"deshacer salto\" + 1 segundo + 2 segundos + 3 segundos + 4 segundos + 5 segundos + 6 segundos + 7 segundos + 8 segundos + 9 segundos + 10 segundos + Mostrar longitud de vídeo sin segmentos + La duración del vídeo, excluyendo todos los segmentos, se muestra en la barra de progreso + Longitud completa del vídeo mostrada + Creando nuevos segmentos + Mostrar el botón Crear nuevo segmento + Se muestra el botón de crear un nuevo segmento + No se muestra el botón de crear un nuevo segmento + Ajustar nuevo paso de segmento + Número de milisegundos que los botones de ajuste de tiempo se mueven al crear nuevos segmentos + El valor debe ser un número positivo + Ver normas + Las pautas contienen reglas y consejos para crear nuevos segmentos + Siga las pautas + Lee las pautas de SponsorBlock antes de crear nuevos segmentos + Ya leído + Múestrame + General + Mostrar un brindis si la API no está disponible + Toast se muestra si SponsorBlock no está disponible + Toast no se muestra si SponsorBlock no está disponible + Habilitar rastreo del conteo de saltos + Permite que la tabla de clasificación de SponsorBlock sepa cuánto tiempo se ha ahorrado. Un mensaje se envía al tablero de clasificación cada vez que se omite un segmento + El rastreo del conteo de saltos no está activado + Duración mínima del segmento + Los segmentos más cortos que este valor (en segundos) no se mostrarán o se omitirán + Duración de tiempo no válida + Tu id de usuario privado + Esto debería mantenerse privado. Es como una contraseña y no debe ser compartido con nadie. Si alguien obtiene esto, podran usarlo para suplantarte + El id de usuario privado debe tener al menos 30 caracteres + Cambiar la URL de la API + La dirección que SponsorBlock utiliza para hacer llamadas al servidor + URL de la API restablecida + La URL de API no es válida + La URL de la API cambió + Importar/Exportar Opciones + Copiar + Su configuración JSON de SponsorBlock que puede importarse/exportarse a ReVanced y otras plataformas SponsorBlock + Su configuración JSON de SponsorBlock que puede importarse/exportarse a ReVanced y otras plataformas SponsorBlock. Esto incluye tu id de usuario privado. Asegúrate de compartirlo sabiamente + Configuración importada correctamente + Error al importar: %s + Error al exportar: %s + "Tu configuración contiene una ID de usuario de SponsorBlock privada. Tu ID de usuario es como una contraseña y nunca debe compartirse." - No mostrar de nuevo - Cambiar comportamiento del segmento - Patrocinador - Promoción pagada, referencias pagadas y anuncios directos. No para autopromoción o gritos gratuitos a causas/creadores/sitios web/productos que les gustan - Promoción Propia/No Remunerada - Similar al patrocinador, pero excluye la promoción propia o no remunerada. Incluye secciones sobre productos, donaciones o información sobre con quién han colaborado - Recordatorio de interacción (Subscríbete) - Un pequeño recordatorio para gustar, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo autopromoción - Resaltar - La parte del vídeo que la mayoría de la gente está buscando - Intermisión/Animación de introducción - Un intervalo sin contenido real. Podría ser una pausa, marco estático o animación de repetición. No incluye transiciones que contengan información - Tarjetas finales / Créditos - Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información - Enganche / Saludos - Tráilers narrados para el próximo video, saludos y despedidas. No incluye secciones que añadan contenido adicional - Vista previa / Resumen - Colección de clips que muestran lo que viene o lo que pasó en el vídeo o en otros videos de una serie, donde toda la información se repite en otro lugar - Digresión / Chistes - Escenas o chistes tangenciales que no son necesarios para entender el contenido principal del video. No incluye secciones que proporcionen contexto o detalles de fondo - Música: Sección sin música - Sólo para usar en vídeos de música. Secciones de vídeos de música sin música, que no están cubiertas por otra categoría - Saltar - Resaltar - Saltar patrocinador - Saltar promoción - Saltar interacción - Omitir a resaltado - Saltar intro - Omitir intermisión - Omitir intermisión - Saltar outro - Omitir gancho - Saltar vista previa - Saltar vista previa - Saltar resumen - Omitir tangencial - Omitir no música - Saltar Segmento - Omitir patrocinio - Auto promoción omitida - Recordatorio irritante omitido - Saltado a destacar - Introduccion omitida - Intermisión omitida - Intermisión omitida - Outro omitida - Gancho omitido - Vista previa omitida - Vista previa omitida - Resumen omitido - Tangencial omitido - Se omitió una sección de no musical - Un segmento no enviado fue omitido - Se omitieron varios segmentos - Omitir automáticamente - Saltar automáticamente una vez - Mostrar un botón Saltar - Mostrar en la barra de búsqueda - Deshabilitar - No se puede enviar el segmento: %s - SponsorBlock está temporalmente abajo - No se puede enviar el segmento (estado: %1$d %2$s) - No se puede enviar el segmento. Límite de velocidad (demasiados del mismo usuario o IP) - No se puede enviar el segmento: %s - "No se puede enviar el segmento. + No mostrar de nuevo + Cambiar comportamiento del segmento + Patrocinador + Promoción pagada, referencias pagadas y anuncios directos. No para autopromoción o gritos gratuitos a causas/creadores/sitios web/productos que les gustan + Promoción Propia/No Remunerada + Similar al patrocinador, pero excluye la promoción propia o no remunerada. Incluye secciones sobre productos, donaciones o información sobre con quién han colaborado + Recordatorio de interacción (Subscríbete) + Un pequeño recordatorio para gustar, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo autopromoción + Resaltar + La parte del vídeo que la mayoría de la gente está buscando + Intermisión/Animación de introducción + Un intervalo sin contenido real. Podría ser una pausa, marco estático o animación de repetición. No incluye transiciones que contengan información + Tarjetas finales / Créditos + Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información + Enganche / Saludos + Tráilers narrados para el próximo video, saludos y despedidas. No incluye secciones que añadan contenido adicional + Vista previa / Resumen + Colección de clips que muestran lo que viene o lo que pasó en el vídeo o en otros videos de una serie, donde toda la información se repite en otro lugar + Digresión / Chistes + Escenas o chistes tangenciales que no son necesarios para entender el contenido principal del video. No incluye secciones que proporcionen contexto o detalles de fondo + Música: Sección sin música + Sólo para usar en vídeos de música. Secciones de vídeos de música sin música, que no están cubiertas por otra categoría + Saltar + Resaltar + Saltar patrocinador + Saltar promoción + Saltar interacción + Omitir a resaltado + Saltar intro + Omitir intermisión + Omitir intermisión + Saltar outro + Omitir gancho + Saltar vista previa + Saltar vista previa + Saltar resumen + Omitir tangencial + Omitir no música + Saltar Segmento + Omitir patrocinio + Auto promoción omitida + Recordatorio irritante omitido + Saltado a destacar + Introduccion omitida + Intermisión omitida + Intermisión omitida + Outro omitida + Gancho omitido + Vista previa omitida + Vista previa omitida + Resumen omitido + Tangencial omitido + Se omitió una sección de no musical + Un segmento no enviado fue omitido + Se omitieron varios segmentos + Omitir automáticamente + Saltar automáticamente una vez + Mostrar un botón Saltar + Mostrar en la barra de búsqueda + Deshabilitar + No se puede enviar el segmento: %s + SponsorBlock está temporalmente abajo + No se puede enviar el segmento (estado: %1$d %2$s) + No se puede enviar el segmento. Límite de velocidad (demasiados del mismo usuario o IP) + No se puede enviar el segmento: %s + "No se puede enviar el segmento. Ya existe" - Segmento enviado correctamente - - SponsorBlock temporalmente no está disponible (API) - SponsorBlock temporalmente no disponible (estado %d) - SponsorBlock temporalmente no está disponible - No se puede votar por el segmento (API) - No se puede votar por el segmento (estado: %1$d %2$s) - No se puede votar por el segmento: %s - Votar positivamente - Voto negativo - Cambiar categoría - No hay segmentos para votar - - %1$s a %2$s - Elige la categoría del segmento - Categoría está desactivada en la configuración. Habilitar la categoría para enviar. - Nuevo segmento de SponsorBlock - ¿Establecer %s como inicio o fin de un nuevo segmento? - Comienzo - Fin - Ahora - Segundo en el que el segmento comienza - Segundo en el que el segmento finaliza - ¿Los tiempos son correctos? - "El segmento es de %1$s a %2$s (%3$s) ¿Listo para enviar?" - Inicio debe ser antes del final - Primero, marca dos instantes en la barra de tiempo - Previsualizar el segmento y asegurarse de que se salta sin problemas - Modificar el tiempo del segmento manualmente - ¿Quieres modificar el tiempo de inicio o final del segmento? - Tiempo dado no válido - Estadísticas - - Las estadísticas no están disponibles temporalmente (la API está inactiva) - Cargando... - SponsorBlock está desactivado - Tu nombre de usuario: <b>%s</b> - Pulsa aquí para cambiar tu nombre de usuario - No se puede cambiar el nombre de usuario: Estado: %1$d %2$s - Nombre de usuario cambiado con éxito - Tu reputación es <b>%.2f</b> - Has creado segmentos <b>%s</b> - Pulsa aquí para ver tus segmentos - Tabla de clasificación de SponsorBlock - Has salvado personas de segmentos <b>%s</b> - Pulsa aquí para ver las estadísticas globales y los mejores colaboradores - Eso es <b>%s</b> de sus vidas.<br>Toca aquí para ver la tabla de clasificación - Has omitido <b>%s</b> segmentos - Eso es <b>%s</b> - ¿Restablecer contador de segmentos saltados? - %1$s horas %2$s minutos - %1$s minutos %2$s segundos - %s segundos - Opacidad: - Color: - Acerca de - sponsor.ajay.app - Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas - - - Factor de forma del diseño - Predeterminado - Teléfono - Tableta - Automóvil - "Los cambios incluyen: + Segmento enviado correctamente + + SponsorBlock temporalmente no está disponible (API) + SponsorBlock temporalmente no disponible (estado %d) + SponsorBlock temporalmente no está disponible + No se puede votar por el segmento (API) + No se puede votar por el segmento (estado: %1$d %2$s) + No se puede votar por el segmento: %s + Votar positivamente + Voto negativo + Cambiar categoría + No hay segmentos para votar + + %1$s a %2$s + Elige la categoría del segmento + Categoría está desactivada en la configuración. Habilitar la categoría para enviar. + Nuevo segmento de SponsorBlock + ¿Establecer %s como inicio o fin de un nuevo segmento? + Comienzo + Fin + Ahora + Segundo en el que el segmento comienza + Segundo en el que el segmento finaliza + ¿Los tiempos son correctos? + "El segmento es de %1$s a %2$s (%3$s) ¿Listo para enviar?" + Inicio debe ser antes del final + Primero, marca dos instantes en la barra de tiempo + Previsualizar el segmento y asegurarse de que se salta sin problemas + Modificar el tiempo del segmento manualmente + ¿Quieres modificar el tiempo de inicio o final del segmento? + Tiempo dado no válido + Estadísticas + + Las estadísticas no están disponibles temporalmente (la API está inactiva) + Cargando... + SponsorBlock está desactivado + Tu nombre de usuario: <b>%s</b> + Pulsa aquí para cambiar tu nombre de usuario + No se puede cambiar el nombre de usuario: Estado: %1$d %2$s + Nombre de usuario cambiado con éxito + Tu reputación es <b>%.2f</b> + Has creado segmentos <b>%s</b> + Pulsa aquí para ver tus segmentos + Tabla de clasificación de SponsorBlock + Has salvado personas de segmentos <b>%s</b> + Pulsa aquí para ver las estadísticas globales y los mejores colaboradores + Eso es <b>%s</b> de sus vidas.<br>Toca aquí para ver la tabla de clasificación + Has omitido <b>%s</b> segmentos + Eso es <b>%s</b> + ¿Restablecer contador de segmentos saltados? + %1$s horas %2$s minutos + %1$s minutos %2$s segundos + %s segundos + Opacidad: + Color: + Acerca de + sponsor.ajay.app + Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas + + + Factor de forma del diseño + Predeterminado + Teléfono + Tableta + Automóvil + "Los cambios incluyen: Diseño para tablets • Las publicaciones de la comunidad están ocultas @@ -1326,320 +1325,319 @@ Diseño para tablets Diseño para automóviles • Los Shorts se abren en el reproductor normal • El feed está organizado por temas y canales" - - - Versión de la aplicación falseada - Versión falseada - Versión no falseada - "La versión de la aplicación se falsificará a una versión anterior de YouTube. + + + Versión de la aplicación falseada + Versión falseada + Versión no falseada + "La versión de la aplicación se falsificará a una versión anterior de YouTube. Esto cambiará la apariencia y las características de la aplicación, pero pueden producirse efectos secundarios desconocidos. Si se desactiva posteriormente, se recomienda borrar los datos de la aplicación para evitar errores en la interfaz de usuario." - Versión objetiva de aplicación falsificada - 20.13.41 - Restaurar barra de acciones de vídeo no colapsada - 20.05.46 - Restaurar la funcionalidad de la transcripción - 19.35.36 - Restaurar iconos antiguos del reproductor de Shorts - 19.01.34 - Restaurar iconos de navegación antiguos - - - Cambiar página de inicio - Predeterminado - Todas las suscripciones - Navegar canales - Cursos / Aprendizaje - Explorar - Moda y Belleza - Juegos - Historial - Biblioteca - Vídeos que me gustan - En directo - Películas - Música - Noticias - Notificaciones - Listas de reproducción - Buscar - Compras - Shorts - Deportes - Suscripciones - Tendencias - Realidad virtual - Ver más tarde - Tus clips - Cambiar siempre la página de inicio - "La página de inicio siempre se cambia + Versión objetiva de aplicación falsificada + 20.13.41 - Restaurar barra de acciones de vídeo no colapsada + 20.05.46 - Restaurar la funcionalidad de la transcripción + 19.35.36 - Restaurar iconos antiguos del reproductor de Shorts + 19.01.34 - Restaurar iconos de navegación antiguos + + + Cambiar página de inicio + Predeterminado + Todas las suscripciones + Navegar canales + Cursos / Aprendizaje + Explorar + Moda y Belleza + Juegos + Historial + Biblioteca + Vídeos que me gustan + En directo + Películas + Música + Noticias + Notificaciones + Listas de reproducción + Buscar + Compras + Shorts + Deportes + Suscripciones + Tendencias + Realidad virtual + Ver más tarde + Tus clips + Cambiar siempre la página de inicio + "La página de inicio siempre se cambia Limitación: Es posible que el uso del botón de retroceso en la barra de herramientas no funcione" - La página de inicio se cambia solo al iniciar la aplicación - - - Desactivar reanudación del reproductor de Shorts - El reproductor de Shorts no se reanudará al iniciar la aplicación - El reproductor de Shorts se reanudará al iniciar la aplicación - - - Abre Shorts con - Reproductor de Shorts - Reproductor normal - Reproductor normal en pantalla completa - - - Reproducción automática de Shorts - Los Shorts se reproducirán automáticamente - Los Shorts se repetirán - Reproducción automática de Shorts en segundo plano - Los Shorts se reproducirán automáticamente en segundo plano - Los Shorts se repetirán en segundo plano - - - Minireproductor - Cambiar el estilo del reproductor minimizado en la aplicación - Tipo de minireproductor - Desactivado - Predeterminado - Mínimo - Tableta - Moderna 1 - Moderna 2 - Moderna 3 - Moderno 4 - Desactivar esquinas redondeadas - Las esquinas son cuadradas - Las esquinas están redondeadas - Habilitar doble toque y pellizco para redimensionar - "La acción de doble toque y el pellizco para cambiar el tamaño están activados + La página de inicio se cambia solo al iniciar la aplicación + + + Desactivar reanudación del reproductor de Shorts + El reproductor de Shorts no se reanudará al iniciar la aplicación + El reproductor de Shorts se reanudará al iniciar la aplicación + + + Abre Shorts con + Reproductor de Shorts + Reproductor normal + Reproductor normal en pantalla completa + + + Reproducción automática de Shorts + Los Shorts se reproducirán automáticamente + Los Shorts se repetirán + Reproducción automática de Shorts en segundo plano + Los Shorts se reproducirán automáticamente en segundo plano + Los Shorts se repetirán en segundo plano + + + Minireproductor + Cambiar el estilo del reproductor minimizado en la aplicación + Tipo de minireproductor + Desactivado + Predeterminado + Mínimo + Tableta + Moderna 1 + Moderna 2 + Moderna 3 + Moderno 4 + Desactivar esquinas redondeadas + Las esquinas son cuadradas + Las esquinas están redondeadas + Habilitar doble toque y pellizco para redimensionar + "La acción de doble toque y el pellizco para cambiar el tamaño están activados • Toca dos veces para aumentar el tamaño del minireproductor • Toca dos veces de nuevo para restaurar el tamaño original" - Acción de doble toque y pellizco para redimensionar está desactivado - Desactivar arrastrar y soltar - Arrastre y suelte está desactivado - "La función de arrastrar y soltar está activada + Acción de doble toque y pellizco para redimensionar está desactivado + Desactivar arrastrar y soltar + Arrastre y suelte está desactivado + "La función de arrastrar y soltar está activada El minireproductor se puede arrastrar a cualquier esquina de la pantalla" - Desactivar gesto de arrastre horizontal - Gesto de arrastre horizontal desactivado - "El gesto de arrastre horizontal está activado + Desactivar gesto de arrastre horizontal + Gesto de arrastre horizontal desactivado + "El gesto de arrastre horizontal está activado El minireproductor se puede arrastrar fuera de la pantalla hacia la izquierda o la derecha" - Ocultar botones de superposición - Los botones de superposición están ocultos - Se muestran los botones de superposición - Ocultar subtextos - Los subtextos están ocultos - Los subtextos se muestran - Ocultar botones de omitir hacia adelante y atrás - Saltar adelante y atrás están ocultos - Saltar adelante y atrás se muestran - Tamaño inicial - Inicial en tamaño de pantalla, en píxeles - El tamaño del píxel debe estar entre %1$s y %2$s - Opacidad de la capa superpuesta - Valor de potencia entre 0-100, donde 0 es transparente - Opacidad de reproductor debe estar en 0 -100 - - - Activar la pantalla de carga gradiente - La pantalla de carga tendrá un fondo gradiente - La pantalla de carga tendrá un fondo sólido - Estilo de la pantalla de presentación - Color - Blanco y negro - Activar el color personalizado de la barra de búsqueda - Se muestra el color personalizado de la barra de búsqueda - Se muestra el color original de la barra de búsqueda - Color personalizado de la barra de búsqueda - El color de la barra de búsqueda - Color de acento personalizado de la barra de búsqueda - El color de acento de la barra de búsqueda - Valor de color de la barra de búsqueda inválido - - - YouTube ReVanced - YT ReVanced - YT - - - Logotipo del encabezado - Predeterminado - Normal - Premium - ReVanced - - ReVanced mínimo - Personalizado - - - Evitar restricción regional de imágenes - Usando host de imagen yt4.ggpht.com - "Usando el servidor de imágenes original + Ocultar botones de superposición + Los botones de superposición están ocultos + Se muestran los botones de superposición + Ocultar subtextos + Los subtextos están ocultos + Los subtextos se muestran + Ocultar botones de omitir hacia adelante y atrás + Saltar adelante y atrás están ocultos + Saltar adelante y atrás se muestran + Tamaño inicial + Inicial en tamaño de pantalla, en píxeles + El tamaño del píxel debe estar entre %1$s y %2$s + Opacidad de la capa superpuesta + Valor de potencia entre 0-100, donde 0 es transparente + Opacidad de reproductor debe estar en 0 -100 + + + Activar la pantalla de carga gradiente + La pantalla de carga tendrá un fondo gradiente + La pantalla de carga tendrá un fondo sólido + Estilo de la pantalla de presentación + Color + Blanco y negro + Activar el color personalizado de la barra de búsqueda + Se muestra el color personalizado de la barra de búsqueda + Se muestra el color original de la barra de búsqueda + Color personalizado de la barra de búsqueda + El color de la barra de búsqueda + Color de acento personalizado de la barra de búsqueda + El color de acento de la barra de búsqueda + Valor de color de la barra de búsqueda inválido + + + YouTube ReVanced + YT ReVanced + YT + + + Logotipo del encabezado + Predeterminado + Normal + Premium + ReVanced + + ReVanced mínimo + Personalizado + + + Evitar restricción regional de imágenes + Usando host de imagen yt4.ggpht.com + "Usando el servidor de imágenes original Habilitar esto puede solucionar las imágenes que faltan que están bloqueadas en algunas regiones" - - - - Pestaña de Inicio - - Pestaña de Suscripciones - - Pestaña - Listas de reproducción del reproductor & recomendaciones - Resultados de búsqueda - Miniaturas originales - Deflecha & miniaturas originales - Flecha & Todavía capturas - Sigue capturando - "DeArrow proporciona miniaturas de vídeos de YouTube obtenidas mediante crowdsourcing. Estas miniaturas suelen ser más relevantes que las que proporciona YouTube + + + + Pestaña de Inicio + + Pestaña de Suscripciones + + Pestaña + Listas de reproducción del reproductor & recomendaciones + Resultados de búsqueda + Miniaturas originales + Deflecha & miniaturas originales + Flecha & Todavía capturas + Sigue capturando + "DeArrow proporciona miniaturas de vídeos de YouTube obtenidas mediante crowdsourcing. Estas miniaturas suelen ser más relevantes que las que proporciona YouTube Si está activado, las URL de los vídeos se enviarán al servidor de la API y no se envían otros datos. Si un vídeo no tiene miniaturas de DeArrow, se mostrarán las originales o las capturas fijas Toca aquí para obtener más información sobre DeArrow" - Mostrar un brindis si la API no está disponible - Toast se muestra si DeFlecha no está disponible - Toast no se muestra si DeFlecha no está disponible - Punto final de la API DeArrow - La URL del final de la caché en miniatura de DeArrow - Capturas estáticas de vídeo - Las capturas se toman desde el principio/medio/final de cada vídeo. Estas imágenes están incorporadas en YouTube y no se utiliza ninguna API externa - Usar capturas aún rápidas - Usar captura de calidad media todavía. Las miniaturas se cargarán más rápido, pero streams en vivo, no liberados o vídeos muy antiguos pueden mostrar miniaturas en blanco - Usando capturas de alta calidad - Tiempo de vídeo desde el que tomar aún las capturas - Inicio del vídeo - Medio del vídeo - Fin del vídeo - - DeArrow no está disponible temporalmente (código de estado: %s) - DeArrow no está disponible temporalmente - - - Mostrar anuncios de ReVanced - Se muestran los anuncios al inicio - No se muestran los anuncios al inicio - Mostrar anuncios al iniciar - Error al conectar con el proveedor de anuncios - Descartar - - - Activar bucle de vídeo - El vídeo se reproducirá en bucle - El vídeo no se reproducirá en bucle - - - Mostrar botón de bucle de vídeo - El botón es visible - El botón no es visible - Bucle de vídeo activado - Bucle de vídeo desactivado - - - - - Dimensiones del dispositivo - "Las dimensiones del dispositivo están falsificadas + Mostrar un brindis si la API no está disponible + Toast se muestra si DeFlecha no está disponible + Toast no se muestra si DeFlecha no está disponible + Punto final de la API DeArrow + La URL del final de la caché en miniatura de DeArrow + Capturas estáticas de vídeo + Las capturas se toman desde el principio/medio/final de cada vídeo. Estas imágenes están incorporadas en YouTube y no se utiliza ninguna API externa + Usar capturas aún rápidas + Usar captura de calidad media todavía. Las miniaturas se cargarán más rápido, pero streams en vivo, no liberados o vídeos muy antiguos pueden mostrar miniaturas en blanco + Usando capturas de alta calidad + Tiempo de vídeo desde el que tomar aún las capturas + Inicio del vídeo + Medio del vídeo + Fin del vídeo + + DeArrow no está disponible temporalmente (código de estado: %s) + DeArrow no está disponible temporalmente + + + Mostrar anuncios de ReVanced + Se muestran los anuncios al inicio + No se muestran los anuncios al inicio + Mostrar anuncios al iniciar + Error al conectar con el proveedor de anuncios + Descartar + + + Activar bucle de vídeo + El vídeo se reproducirá en bucle + El vídeo no se reproducirá en bucle + + + Mostrar botón de bucle de vídeo + El botón es visible + El botón no es visible + Bucle de vídeo activado + Bucle de vídeo desactivado + + + + Dimensiones del dispositivo + "Las dimensiones del dispositivo están falsificadas Es posible que se desbloqueen calidades de vídeo más altas, pero es posible que experimentes pausas en la reproducción de vídeo, una peor duración de la batería y efectos secundarios desconocidos" - "Las dimensiones del dispositivo no están falsificadas + "Las dimensiones del dispositivo no están falsificadas Habilitar esto puede desbloquear calidades de vídeo más altas" - Activar esto puede causar retraso en la reproducción de vídeo, peor duración de la batería y efectos secundarios desconocidos. - - - Vibración háptica - Cambiar la vibración háptica - Desactivar la respuesta háptica de los capítulos - La respuesta háptica de los capítulos está desactivada - La respuesta háptica de los capítulos está activada - Desactivar la respuesta háptica de la búsqueda precisa - La respuesta háptica de búsqueda precisa está desactivada - La respuesta háptica de la búsqueda precisa está activada - Desactivar la respuesta háptica de deshacer la búsqueda - La respuesta háptica de deshacer la búsqueda está desactivada - La respuesta háptica de deshacer la búsqueda está activada - Desactivar la respuesta háptica del zoom - La respuesta háptica del zoom está desactivada - La respuesta háptica del zoom está activada - - - Si has cambiado recientemente los datos de inicio de sesión de tu cuenta, desinstala y vuelve a instalar MicroG. - - - Evitar redirecciones de URL - Se omiten las redirecciones de URL - No se omiten las redirecciones de URL - - - Abrir enlaces en el navegador - Abrir enlaces en el navegador externo - Abrir enlaces en el navegador integrado en la aplicación - - - - Automático - Recordar cambios de calidad de vídeo - Los cambios de calidad se aplican a todos los vídeos - Los cambios de calidad sólo se aplican al vídeo actual - Mostrar notificación al cambiar la calidad de vídeo - Se muestra una notificación cuando se cambia la calidad de vídeo predeterminada - No se muestra una notificación cuando se cambia la calidad de vídeo predeterminada - Calidad de vídeo predeterminada en la red Wi-Fi - Calidad de vídeo predeterminada en la red móvil - Recordar cambios en la calidad de Shorts - Los cambios de calidad se aplican a todos los Shorts - Los cambios de calidad solo se aplican al Short actual - Calidad predeterminada de Shorts en la red Wi-Fi - Calidad predeterminada de Shorts en la red móvil - móvil - wifi - Cambió la calidad predeterminada %1$s a: %2$s - Calidad de Shorts %1$s cambiada a: %2$s - - - Mostrar botón de diálogo de velocidad - El botón del diálogo de velocidad es visible. Mantén pulsado para restablecer la velocidad de reproducción a la predeterminada - El botón del diálogo de velocidad no es visible - - - Mostrar botón de calidad de vídeo - El botón de calidad de vídeo es visible. Mantén pulsado para restablecer la calidad a la predeterminada - El botón de calidad de vídeo no es visible - - - Menú de velocidad de reproducción personalizada - El menú de velocidad personalizada se muestra - El menú de velocidad personalizada no se muestra - Restaurar el menú de velocidad de reproducción antiguo - Se muestra el menú de velocidad antiguo - Se muestra el menú de velocidad moderno - Velocidades de reproducción personalizadas - Añadir o cambiar las velocidades de reproducción personalizadas - Las velocidades personalizadas deben ser menores que %s - Velocidades de reproducción personalizadas no válidas - Automático - Velocidad personalizada al tocar y mantener - Velocidad de reproducción entre 0-8 - - - Recordar cambios de velocidad de reproducción - Los cambios de velocidad de reproducción se aplican a todos los vídeos - Los cambios de velocidad de reproducción sólo se aplican al vídeo actual - Mostrar notificación al cambiar la velocidad de reproducción - Se muestra una notificación cuando se cambia la velocidad de reproducción predeterminada - Un mensaje no se muestra cuando se cambia la velocidad de reproducción predeterminada - Velocidad de reproducción por defecto - Cambió la velocidad predeterminada a: %s - - - Desactivar el vídeo HDR - El vídeo HDR está desactivado - El vídeo HDR está activado - Forzar AVC (H.264) - El códec de vídeo se fuerza a AVC (H.264) - El códec de vídeo se determina automáticamente - "Ventajas: + Activar esto puede causar retraso en la reproducción de vídeo, peor duración de la batería y efectos secundarios desconocidos. + + + Vibración háptica + Cambiar la vibración háptica + Desactivar la respuesta háptica de los capítulos + La respuesta háptica de los capítulos está desactivada + La respuesta háptica de los capítulos está activada + Desactivar la respuesta háptica de la búsqueda precisa + La respuesta háptica de búsqueda precisa está desactivada + La respuesta háptica de la búsqueda precisa está activada + Desactivar la respuesta háptica de deshacer la búsqueda + La respuesta háptica de deshacer la búsqueda está desactivada + La respuesta háptica de deshacer la búsqueda está activada + Desactivar la respuesta háptica del zoom + La respuesta háptica del zoom está desactivada + La respuesta háptica del zoom está activada + + + Si has cambiado recientemente los datos de inicio de sesión de tu cuenta, desinstala y vuelve a instalar MicroG. + + + Evitar redirecciones de URL + Se omiten las redirecciones de URL + No se omiten las redirecciones de URL + + + Abrir enlaces en el navegador + Abrir enlaces en el navegador externo + Abrir enlaces en el navegador integrado en la aplicación + + + + Automático + Recordar cambios de calidad de vídeo + Los cambios de calidad se aplican a todos los vídeos + Los cambios de calidad sólo se aplican al vídeo actual + Mostrar notificación al cambiar la calidad de vídeo + Se muestra una notificación cuando se cambia la calidad de vídeo predeterminada + No se muestra una notificación cuando se cambia la calidad de vídeo predeterminada + Calidad de vídeo predeterminada en la red Wi-Fi + Calidad de vídeo predeterminada en la red móvil + Recordar cambios en la calidad de Shorts + Los cambios de calidad se aplican a todos los Shorts + Los cambios de calidad solo se aplican al Short actual + Calidad predeterminada de Shorts en la red Wi-Fi + Calidad predeterminada de Shorts en la red móvil + móvil + wifi + Cambió la calidad predeterminada %1$s a: %2$s + Calidad de Shorts %1$s cambiada a: %2$s + + + Mostrar botón de diálogo de velocidad + El botón del diálogo de velocidad es visible. Mantén pulsado para restablecer la velocidad de reproducción a la predeterminada + El botón del diálogo de velocidad no es visible + + + Mostrar botón de calidad de vídeo + El botón de calidad de vídeo es visible. Mantén pulsado para restablecer la calidad a la predeterminada + El botón de calidad de vídeo no es visible + + + Menú de velocidad de reproducción personalizada + El menú de velocidad personalizada se muestra + El menú de velocidad personalizada no se muestra + Restaurar el menú de velocidad de reproducción antiguo + Se muestra el menú de velocidad antiguo + Se muestra el menú de velocidad moderno + Velocidades de reproducción personalizadas + Añadir o cambiar las velocidades de reproducción personalizadas + Las velocidades personalizadas deben ser menores que %s + Velocidades de reproducción personalizadas no válidas + Automático + Velocidad personalizada al tocar y mantener + Velocidad de reproducción entre 0-8 + + + Recordar cambios de velocidad de reproducción + Los cambios de velocidad de reproducción se aplican a todos los vídeos + Los cambios de velocidad de reproducción sólo se aplican al vídeo actual + Mostrar notificación al cambiar la velocidad de reproducción + Se muestra una notificación cuando se cambia la velocidad de reproducción predeterminada + Un mensaje no se muestra cuando se cambia la velocidad de reproducción predeterminada + Velocidad de reproducción por defecto + Cambió la velocidad predeterminada a: %s + + + Desactivar el vídeo HDR + El vídeo HDR está desactivado + El vídeo HDR está activado + Forzar AVC (H.264) + El códec de vídeo se fuerza a AVC (H.264) + El códec de vídeo se determina automáticamente + "Ventajas: • Puede mejorar la duración de la batería • Puede restaurar resoluciones de vídeo perdidas en dispositivos antiguos @@ -1648,180 +1646,180 @@ Limitaciones: • La reproducción de vídeo utilizará más datos de internet que VP9 o AV1 • Los vídeos HDR no utilizarán AVC • Algunos dispositivos no pueden forzar AVC" - - - Mostrar menú de calidad de vídeo avanzado - Se muestra el menú de calidad de vídeo avanzado - No se muestra el menú de calidad de vídeo avanzado - - - Habilitar diapositiva para buscar - Deslizar para buscar está activado - Slide to seek no está activado - - - Permitir Android VR AV1 - "El códec de video es AVC (H.264), VP9 o AV1 + + + Mostrar menú de calidad de vídeo avanzado + Se muestra el menú de calidad de vídeo avanzado + No se muestra el menú de calidad de vídeo avanzado + + + Habilitar diapositiva para buscar + Deslizar para buscar está activado + Slide to seek no está activado + + + Permitir Android VR AV1 + "El códec de video es AVC (H.264), VP9 o AV1 La reproducción puede tartamudear o perder fotogramas" - El códec de video es AVC (H.264) o VP9 - "Habilitar esta configuración puede usar la decodificación de software AV1.\n\nLa reproducción de video con AV1 puede tartamudear o perder fotogramas." - Efectos secundarios de la falsificación - • El cliente es experimental y puede dejar de funcionar en cualquier momento - • El video puede detenerse en 1:00, o puede no estar disponible en algunas regiones - • Falta el menú de la pista de audio - • Sin códec de vídeo AV1 - • Volumen estable no disponible - • Es posible que los vídeos infantiles no se reproduzcan cuando se cierra la sesión o se está en modo incógnito - - • Forzar audio original no está disponible - Mostrar en Estadísticas para nerds - El tipo de cliente se muestra en Estadísticas para nerds - El cliente está oculto en Estadísticas para nerds - - - - - YT Music ReVanced - Music ReVanced - Música - - - Acerca de - Anuncios - General - Reproductor - Otros - - - Ocultar anuncios de vídeo - Los anuncios de video están ocultos - Los anuncios de video son visibles - - - Habilitar repetición permanente - La repetición permanente está habilitada - La repetición permanente está deshabilitada - - - Ocultar el botón de emisión - El botón de emisión está oculto - El botón de emisión es visible - Ocultar el botón \"Historial\" - El botón de Historial está oculto - El botón de Historial es visible - Ocultar el botón de notificación - El botón de notificación está oculto - Se muestra el botón de notificación - Ocultar el botón de búsqueda - El botón de búsqueda está oculto - Se muestra el botón de búsqueda - - - Ocultar barra de categorías - La barra de categorías está oculta - La barra de categorías es visible - - - Cambiar color del minirreproductor - El color del minirreproductor coincide con el del reproductor de pantalla completa - El minirreproductor utiliza el color predeterminado - - - Barra de navegación - Ocultar o cambiar los botones de la barra de navegación - - Ocultar pestaña \'Inicio\' - El botón Inicio está oculto - El botón Inicio es visible - - Ocultar muestras - El botón Muestras está oculto - El botón Muestras es visible - - Ocultar Explorar - El botón Explorar está oculto - El botón Explorar es visible - - Ocultar Biblioteca - El botón Biblioteca está oculto - El botón Biblioteca es visible - - Ocultar Premium - El botón Actualizar está oculto - El botón Actualizar es visible - Ocultar la barra de navegación - La barra de navegación está oculta - La barra de navegación es visible - Ocultar etiquetas de navegación - Las etiquetas están ocultas - Las etiquetas son visibles - - - Ocultar la etiqueta \'Obtener Music Premium\' - La etiqueta está oculta - La etiqueta es visible - - - Ocultar botón de actualización - El botón está oculto - El botón es visible - - - - - Bloquear anuncios de audio - Anuncios de audio bloqueados - Anuncios de audio desbloqueados - - - %s no disponible, es posible que se muestren anuncios. Intenta cambiar el servicio de bloqueo de anuncios en los ajustes. - %s ha devuelto un error, es posible que se muestren anuncios. Intenta cambiar el servicio de bloqueo de anuncios en los ajustes. - Bloquear anuncios de vídeo incrustados - Desactivado - Proxy luminoso - Proxy MoradoAdBlock - - - Bloquear anuncios de vídeo - Los anuncios de vídeo están bloqueados - Los anuncios de vídeo están desbloqueados - - - Mensaje eliminado - Mostrar mensajes borrados - No mostrar mensajes borrados - Ocultar mensajes eliminados detrás de un spoiler - Mostrar mensajes borrados como texto cruzado - - - Reclamar automáticamente los puntos de canal - Los puntos de canal se reclaman automáticamente - Los puntos de canal no se reclaman automáticamente - - - - Activar modo de depuración de Twitch - El modo de depuración de Twitch está activado (no recomendado) - El modo de depuración de Twitch está desactivado - - - Ajustes de ReVanced - Acerca de - Acerca de ReVanced - Bloqueo de anuncios - Ajustes de bloqueo de anuncios - Chatear - Ajustes del chat - Varios - Ajustes multifuncionales - Ajustes generales - Otros ajustes - Anuncios del cliente - Anuncios del lado del servidor - Depurar registro - Los registros de depuración están habilitados - Los registros de depuración están desactivados - - + El códec de video es AVC (H.264) o VP9 + "Habilitar esta configuración puede usar la decodificación de software AV1.\n\nLa reproducción de video con AV1 puede tartamudear o perder fotogramas." + Efectos secundarios de la falsificación + • El cliente es experimental y puede dejar de funcionar en cualquier momento + • El video puede detenerse en 1:00, o puede no estar disponible en algunas regiones + • Falta el menú de la pista de audio + • Sin códec de vídeo AV1 + • Volumen estable no disponible + • Es posible que los vídeos infantiles no se reproduzcan cuando se cierra la sesión o se está en modo incógnito + + • Forzar audio original no está disponible + Mostrar en Estadísticas para nerds + El tipo de cliente se muestra en Estadísticas para nerds + El cliente está oculto en Estadísticas para nerds + + + + + YT Music ReVanced + Music ReVanced + Música + + + Acerca de + Anuncios + General + Reproductor + Otros + + + Ocultar anuncios de vídeo + Los anuncios de video están ocultos + Los anuncios de video son visibles + + + Habilitar repetición permanente + La repetición permanente está habilitada + La repetición permanente está deshabilitada + + + Ocultar el botón de emisión + El botón de emisión está oculto + El botón de emisión es visible + Ocultar el botón \"Historial\" + El botón de Historial está oculto + El botón de Historial es visible + Ocultar el botón de notificación + El botón de notificación está oculto + Se muestra el botón de notificación + Ocultar el botón de búsqueda + El botón de búsqueda está oculto + Se muestra el botón de búsqueda + + + Ocultar barra de categorías + La barra de categorías está oculta + La barra de categorías es visible + + + Cambiar color del minirreproductor + El color del minirreproductor coincide con el del reproductor de pantalla completa + El minirreproductor utiliza el color predeterminado + + + Barra de navegación + Ocultar o cambiar los botones de la barra de navegación + + Ocultar pestaña \'Inicio\' + El botón Inicio está oculto + El botón Inicio es visible + + Ocultar muestras + El botón Muestras está oculto + El botón Muestras es visible + + Ocultar Explorar + El botón Explorar está oculto + El botón Explorar es visible + + Ocultar Biblioteca + El botón Biblioteca está oculto + El botón Biblioteca es visible + + Ocultar Premium + El botón Actualizar está oculto + El botón Actualizar es visible + Ocultar la barra de navegación + La barra de navegación está oculta + La barra de navegación es visible + Ocultar etiquetas de navegación + Las etiquetas están ocultas + Las etiquetas son visibles + + + Ocultar la etiqueta \'Obtener Music Premium\' + La etiqueta está oculta + La etiqueta es visible + + + Ocultar botón de actualización + El botón está oculto + El botón es visible + + + + + Bloquear anuncios de audio + Anuncios de audio bloqueados + Anuncios de audio desbloqueados + + + %s no disponible, es posible que se muestren anuncios. Intenta cambiar el servicio de bloqueo de anuncios en los ajustes. + %s ha devuelto un error, es posible que se muestren anuncios. Intenta cambiar el servicio de bloqueo de anuncios en los ajustes. + Bloquear anuncios de vídeo incrustados + Desactivado + Proxy luminoso + Proxy MoradoAdBlock + + + Bloquear anuncios de vídeo + Los anuncios de vídeo están bloqueados + Los anuncios de vídeo están desbloqueados + + + Mensaje eliminado + Mostrar mensajes borrados + No mostrar mensajes borrados + Ocultar mensajes eliminados detrás de un spoiler + Mostrar mensajes borrados como texto cruzado + + + Reclamar automáticamente los puntos de canal + Los puntos de canal se reclaman automáticamente + Los puntos de canal no se reclaman automáticamente + + + + Activar modo de depuración de Twitch + El modo de depuración de Twitch está activado (no recomendado) + El modo de depuración de Twitch está desactivado + + + Ajustes de ReVanced + Acerca de + Acerca de ReVanced + Bloqueo de anuncios + Ajustes de bloqueo de anuncios + Chatear + Ajustes del chat + Varios + Ajustes multifuncionales + Ajustes generales + Otros ajustes + Anuncios del cliente + Anuncios del lado del servidor + Depurar registro + Los registros de depuración están habilitados + Los registros de depuración están desactivados + + diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index 5277e65e04..1f3450589c 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - Rakenduse nimi - - Kohandatud - Rakenduse ikoon - Algne - - ReVanced minimaalne - ReVanced skaleeritud - - Kohandatud - - - Kontrollid ebaõnnestusid - Ava oficial veebileht - Eira - <h5>See rakendus ei paista olevat teie poolt parandatud.</h5><br>See rakendus ei pruugi korrektselt töötada, <b>võib olla kahjulik või isegi ohtlik kasutada</b>.<br><br>Need kontrollid viitavad sellele, et see rakendus on eelnevalt parandatud või saadud kellegi teise käest:<br><br><small>%1$s</small><br>Tugevalt soovitatakse <b>see rakendus desinstallida ja ise parandada</b>, et tagada valideeritud ja turvalise rakenduse kasutamine.<p><br>Kui ignoreeritakse, kuvatakse see hoiatus ainult kaks korda. - Parandatud teisel seadmel - Pole installitud ReVanced Manageri poolt - Parandatud rohkem kui 10 minutit tagasi - Parandatud %s päeva tagasi - APK ehituskuupäev on rikutud - - - ReVancedi Teade - Teie vaatamise ajalugu ei salvestata.<br><br>See on tõenäoliselt tingitud DNS-i reklaamiblokeerijast või võrguproksilt.<br><br>Selle parandamiseks lisage valgesse nimekirja <b>s.youtube.com</b> või lülitage kõik DNS-i reklaamiblokeerijad ja proksid välja. - Ära kuva uuesti - - - Seaded - Kas sa oled kindel, et soovid jätkata? - Salvesta - Lähtesta - Lähtesta värv - Vigane värv - Vajalik taaskäivitamine - Selle muudatuse jõustumiseks on vaja rakendus taaskäivitada. - Taaskäivita - Impordi - Kopeeri - ReVancedi seaded on lähtestatud - Imporditi %d seadet - Importimine ebaõnnestus: %s - Otsi seadetest - Otsingule „%s” ei leitud tulemusi - Proovi mõnda muud märksõna - Viimased otsingud - Kas eemaldada otsinguajaloost? - Tühjenda otsinguajalugu - Kas olete kindel, et soovite kogu otsinguajaloo kustutada? - Otsingunõuanded - "• Puudutage rada, et sinna navigeerida +--> + + + Rakenduse nimi + + Kohandatud + Rakenduse ikoon + Algne + + ReVanced minimaalne + ReVanced skaleeritud + + Kohandatud + + + Kontrollid ebaõnnestusid + Ava oficial veebileht + Eira + <h5>See rakendus ei paista olevat teie poolt parandatud.</h5><br>See rakendus ei pruugi korrektselt töötada, <b>võib olla kahjulik või isegi ohtlik kasutada</b>.<br><br>Need kontrollid viitavad sellele, et see rakendus on eelnevalt parandatud või saadud kellegi teise käest:<br><br><small>%1$s</small><br>Tugevalt soovitatakse <b>see rakendus desinstallida ja ise parandada</b>, et tagada valideeritud ja turvalise rakenduse kasutamine.<p><br>Kui ignoreeritakse, kuvatakse see hoiatus ainult kaks korda. + Parandatud teisel seadmel + Pole installitud ReVanced Manageri poolt + Parandatud rohkem kui 10 minutit tagasi + Parandatud %s päeva tagasi + APK ehituskuupäev on rikutud + + + ReVancedi Teade + Teie vaatamise ajalugu ei salvestata.<br><br>See on tõenäoliselt tingitud DNS-i reklaamiblokeerijast või võrguproksilt.<br><br>Selle parandamiseks lisage valgesse nimekirja <b>s.youtube.com</b> või lülitage kõik DNS-i reklaamiblokeerijad ja proksid välja. + Ära kuva uuesti + + + Seaded + Kas sa oled kindel, et soovid jätkata? + Salvesta + Lähtesta + Lähtesta värv + Vigane värv + Vajalik taaskäivitamine + Selle muudatuse jõustumiseks on vaja rakendus taaskäivitada. + Taaskäivita + Impordi + Kopeeri + ReVancedi seaded on lähtestatud + Imporditi %d seadet + Importimine ebaõnnestus: %s + Otsi seadetest + Otsingule „%s” ei leitud tulemusi + Proovi mõnda muud märksõna + Viimased otsingud + Kas eemaldada otsinguajaloost? + Tühjenda otsinguajalugu + Kas olete kindel, et soovite kogu otsinguajaloo kustutada? + Otsingunõuanded + "• Puudutage rada, et sinna navigeerida • Vajutage pikalt seadet, et sinna navigeerida • Vajutage sisestusklahvi, et salvestada otsingupäring ajalukku • Otsing ignoreerib suurtähti ja kirjavahemärke • Vanemseaded kuvatakse keelatud alamseadete kohal" - Otsinguajalugu on tühi - Otsinguajaloo salvestamiseks tippige otsingupäring ja vajutage sisestusklahvi - Kuva seadete otsinguajalugu - Seadete otsinguajalugu on näidatud - Seadete otsingu ajalugu ei kuvata - Näita ReVancedi seadete ikoone - Seadete ikoonid on näidatud - Seadete ikoonid ei ole nähtavad - Revancedi keel - "Mõnede keelte tõlked võivad olla puudu või mittetäielikud. + Otsinguajalugu on tühi + Otsinguajaloo salvestamiseks tippige otsingupäring ja vajutage sisestusklahvi + Kuva seadete otsinguajalugu + Seadete otsinguajalugu on näidatud + Seadete otsingu ajalugu ei kuvata + Näita ReVancedi seadete ikoone + Seadete ikoonid on näidatud + Seadete ikoonid ei ole nähtavad + Revancedi keel + "Mõnede keelte tõlked võivad olla puudu või mittetäielikud. Uute keelte tõlkimiseks või olemasolevate tõlgete parandamiseks külastage translate.revanced.app" - Rakenduse keel - Impordi / Ekspordi - Impordi / Ekspordi ReVanced seadeteid - - Te kasutad ReVanced Patchide versiooni <i>%s</i> - Märkus - See versioon on eelversioon ja teil võib tekkida ootamatuid probleeme - Ametlikud lingid - + Te kasutad ReVanced Patchide versiooni <i>%s</i> + Märkus + See versioon on eelversioon ja teil võib tekkida ootamatuid probleeme + Ametlikud lingid + - - - GmsCore seaded - GmsCore seaded - - MicroG GmsCore pole installitud. Installi see. - Tegevus on vajalik - "MicroG GmsCore l ei ole taustal töötamiseks luba. + + + GmsCore seaded + GmsCore seaded + + MicroG GmsCore pole installitud. Installi see. + Tegevus on vajalik + "MicroG GmsCore l ei ole taustal töötamiseks luba. Järgige oma telefoni \"Ära tapa minu rakendust\" juhendit ja rakendage juhiseid oma MicroG installile. See on rakenduse toimimiseks vajalik." - Ava veebisait - "MicroG GmsCore aku optimeerimised peavad olema keelatud, et vältida probleeme. + Ava veebisait + "MicroG GmsCore aku optimeerimised peavad olema keelatud, et vältida probleeme. MicroG aku optimeerimise keelamine ei mõjuta aku kestvust negatiivselt. Vajutage jätkamise nuppu ja lubage optimeerimismuutused." - Jätka - - - Võltsitud videovood - Kliendi videovoogude võltsimine taasesitusprobleemide vältimiseks - Võltsitud video voogedastused - "Videovood on võltsitud + Jätka + + + Võltsitud videovood + Kliendi videovoogude võltsimine taasesitusprobleemide vältimiseks + Võltsitud video voogedastused + "Videovood on võltsitud Kui olete YouTube Premiumi kasutaja, ei pruugi see säte vajalik olla" - "Videovooge ei võltsita + "Videovooge ei võltsita Taasesitus ei pruugi töötada" - Selle sätte väljalülitamine võib põhjustada taasesitusprobleeme. - Vaikimisi klient - - - Sunni originaalheli keel - Algse helikeele kasutamine - Kasutan vaikeheli - - Selle funktsiooni kasutamiseks muutke „Võltsitud videovood” mis tahes muule kliendile peale Android Studio. - - - Veaotsing - Veaotsinguvalikud lubamiseks või keelamiseks - Veaotsingulogimine - Veaotsingulogimine on lubatud - Vea logid on keelatud - Logi stekira jäljed - Silumispäevikud sisaldavad virna jäljendamise - Silumispäevikud ei sisalda virna jäljendamise - ReVanced veaga ilmumisel kuvag - Toast kuvatakse, kui ilmneb tõrge - Toast ei kuvata, kui ilmneb tõrge - "Vea teadete väljalülitamine peidab kõik ReVanced i veateadete märguanded. + Selle sätte väljalülitamine võib põhjustada taasesitusprobleeme. + Vaikimisi klient + + + Sunni originaalheli keel + Algse helikeele kasutamine + Kasutan vaikeheli + + Selle funktsiooni kasutamiseks muutke „Võltsitud videovood” mis tahes muule kliendile peale Android Studio. + + + Veaotsing + Veaotsinguvalikud lubamiseks või keelamiseks + Veaotsingulogimine + Veaotsingulogimine on lubatud + Vea logid on keelatud + Logi stekira jäljed + Silumispäevikud sisaldavad virna jäljendamise + Silumispäevikud ei sisalda virna jäljendamise + ReVanced veaga ilmumisel kuvag + Toast kuvatakse, kui ilmneb tõrge + Toast ei kuvata, kui ilmneb tõrge + "Vea teadete väljalülitamine peidab kõik ReVanced i veateadete märguanded. Teid ei teavitata ühestki ootamatust sündmusest." - Ekspordi silumislogid - Kopeerib ReVanced silumislogid lõikelauale - Silumislogimine on keelatud - Logisid ei leitud - Logid kopeeritud - Logide eksportimine ebaõnnestus: %s - Puhasta silumislogid - Puhastab kõik salvestatud ReVanced silumislogid - Logid puhastatud - Funktsioonilipikute Manager - Halda booleani funktsioonilipikuid - Aktiivsed lipud (%d) - Blokeeritud lipud (%d) - Otsi lippe... - Lipud salvestatud - Lipud lähtestatud - Lipud kopeeritud lõikelauale - Logi protokolipuffari - Vea logid sisaldavad protokolipuffari - Vea logid ei sisalda protokolipuffari - "Selle sätte lubamine logib täiendavaid paigutuse andmeid, sealhulgas mõne kasutajaliidese komponendi ekraanil kuvatavat teksti. + Ekspordi silumislogid + Kopeerib ReVanced silumislogid lõikelauale + Silumislogimine on keelatud + Logisid ei leitud + Logid kopeeritud + Logide eksportimine ebaõnnestus: %s + Puhasta silumislogid + Puhastab kõik salvestatud ReVanced silumislogid + Logid puhastatud + Funktsioonilipikute Manager + Halda booleani funktsioonilipikuid + Aktiivsed lipud (%d) + Blokeeritud lipud (%d) + Otsi lippe... + Lipud salvestatud + Lipud lähtestatud + Lipud kopeeritud lõikelauale + Logi protokolipuffari + Vea logid sisaldavad protokolipuffari + Vea logid ei sisalda protokolipuffari + "Selle sätte lubamine logib täiendavaid paigutuse andmeid, sealhulgas mõne kasutajaliidese komponendi ekraanil kuvatavat teksti. See võib aidata komponente tuvastada kohandatud filtrite loomisel. Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadressi." - - - Puhasta jagamislingid - Jälgimispäringu parameeter on jagatud linkidest eemaldatud - Jälgimispäringu parameetrit ei eemaldata jagatud linkidest - Muuda jagamislingid youtube.com-iks - Jagatud lingid kasutavad youtube.com-i - Jagatud lingid kasutavad music.youtube.com-i - - - Kohandatud filter - Peida komponendid, kasutades kohandatud filtreid - Aktiveeri kohandatud filter - Kohandatud filter on sisse lülitatud - Kohandatud filter on välja lülitatud - Kohandatud filter - - Rea ridadega eraldatud elementide loendi filtreerimiseks - Kehtetu kohandatud filter: %s - - - - - Teave - Reklaamid - Alternatiivsed pisipildid - Voog - Üldine - Mängija - Otsinguriba - Pühkimisjuhtimine - Mitmesugused - Taasta vanad seadete menüüd - Vanad seadete menüüd on kuvatud - Vanad seadete menüüd ei ole kuvatud - - - Shorts taustavideo esitamine lülitada - Lühivideod taasesitus taustal on keelatud - Lühivideod taasesitus taustal on lubatud - - - Peida albumikaardid - Albumikaardid on peidetud - Albumikaardid on nähtavad - Peida artisti kaardid - Kunstnerkortene er skjult - Kunstnerkortene vises - Peida kiibi riiul - Kiibid on peidetud - Kiipe on nähtaval - Peida ühenduse postitused - Ühenduse postitused on peidetud - Ühenduse postitused on nähtavad - Peida kompaktsed bännerid - Kompaktsed bännerid on peidetud - Kompaktised bännerid on kuvatud - Peida laiendatav kaart - Laiendatav kaart videote all on peidetud - Laiendatav kaart videote all on nähtav - Peida ujuv mikrofoninupp - Ujuv mikrofoni nupp otsingus on peidetud - Ujuv mikrofoni nupp otsingus on nähtav - Peida horisontaalsed riiulid - "Riiulid on peidetud, näiteks: + + + Puhasta jagamislingid + Jälgimispäringu parameeter on jagatud linkidest eemaldatud + Jälgimispäringu parameetrit ei eemaldata jagatud linkidest + Muuda jagamislingid youtube.com-iks + Jagatud lingid kasutavad youtube.com-i + Jagatud lingid kasutavad music.youtube.com-i + + + Kohandatud filter + Peida komponendid, kasutades kohandatud filtreid + Aktiveeri kohandatud filter + Kohandatud filter on sisse lülitatud + Kohandatud filter on välja lülitatud + Kohandatud filter + + Rea ridadega eraldatud elementide loendi filtreerimiseks + Kehtetu kohandatud filter: %s + + + + + Teave + Reklaamid + Alternatiivsed pisipildid + Voog + Üldine + Mängija + Otsinguriba + Pühkimisjuhtimine + Mitmesugused + Taasta vanad seadete menüüd + Vanad seadete menüüd on kuvatud + Vanad seadete menüüd ei ole kuvatud + + + Shorts taustavideo esitamine lülitada + Lühivideod taasesitus taustal on keelatud + Lühivideod taasesitus taustal on lubatud + + + Peida albumikaardid + Albumikaardid on peidetud + Albumikaardid on nähtavad + Peida artisti kaardid + Kunstnerkortene er skjult + Kunstnerkortene vises + Peida kiibi riiul + Kiibid on peidetud + Kiipe on nähtaval + Peida ühenduse postitused + Ühenduse postitused on peidetud + Ühenduse postitused on nähtavad + Peida kompaktsed bännerid + Kompaktsed bännerid on peidetud + Kompaktised bännerid on kuvatud + Peida laiendatav kaart + Laiendatav kaart videote all on peidetud + Laiendatav kaart videote all on nähtav + Peida ujuv mikrofoninupp + Ujuv mikrofoni nupp otsingus on peidetud + Ujuv mikrofoni nupp otsingus on nähtav + Peida horisontaalsed riiulid + "Riiulid on peidetud, näiteks: • Värsked uudised • Jätka vaatamist • Avasta rohkem kanaleid • Kõige asjakohasemad • Ostlemine • Vaata uuesti" - Horisontaalsed riiulid on nähtaval - Peida pildiriiul - Pildiriiul otsingutulemustes on peidetud - Pildiriiul otsingutulemustes on nähtav - Peida Shortsid - Shortsid on peidetud - Shortsid on nähtavad - Peida segapleilistid - Segapleilistid on peidetud - Segapleilistid on nähtavad - Peida filmide jaotis - Filmide jaotis on peidetud - Filmide jaotis on nähtav - - Peida nupu \"Teata mulle\" - Teata mulle nupp on peidetud - Teata mulle nupp on nähtaval - Peida Playables - Playables on varjatud - Playables on kuvatud - - Peida nupp \"Kuva rohkem\" - Kuva rohkem nupp otsingutulemustes on peidetud - Kuva rohkem nupp otsingutulemustes on nähtaval - Peida küsitlused - Küsitlused on peidetud - Küsitlused on nähtaval - Peida pääsmeriiul - Pääsmeriiul on peidetud - Pääsmeriiul on nähtav - - Peida videosoovituste sildid - \'Inimesed vaatasid ka\' ja \'Võib sulle meeldida\' sildid otsingutulemustes on peidetud - \'Inimesed vaatasid ka\' ja \'Võib sulle meeldida\' sildid otsingutulemustes on nähtaval - Peida visuaalne eraldaja - Visuaalne eraldaja on peidetud - Visuaalne eraldaja on nähtav - - Peida YouTube Doodles - YouTube Doodles animatsioon logol on peidetud - YouTube Doodles animatsioon logol on nähtav - "YouTube Doodles on näidatud paar päeva aastas. + Peida nupp \"Kuva rohkem\" + Kuva rohkem nupp otsingutulemustes on peidetud + Kuva rohkem nupp otsingutulemustes on nähtaval + Peida küsitlused + Küsitlused on peidetud + Küsitlused on nähtaval + Peida pääsmeriiul + Pääsmeriiul on peidetud + Pääsmeriiul on nähtav + + Peida videosoovituste sildid + \'Inimesed vaatasid ka\' ja \'Võib sulle meeldida\' sildid otsingutulemustes on peidetud + \'Inimesed vaatasid ka\' ja \'Võib sulle meeldida\' sildid otsingutulemustes on nähtaval + Peida visuaalne eraldaja + Visuaalne eraldaja on peidetud + Visuaalne eraldaja on nähtav + + Peida YouTube Doodles + YouTube Doodles animatsioon logol on peidetud + YouTube Doodles animatsioon logol on nähtav + "YouTube Doodles on näidatud paar päeva aastas. Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lülitatud, siis otsinguriba all olev filtreerimisriba peidetakse samuti." - Peida kanali riba - Kanali riba on peidetud - Kanaliribas on näidatud - Peida kanali vesimärk - Kanali vesimärk on peidetud - Kanali vesimärk on nähtav - Peida crowdfunding kast - Crowdfunding kast on peidetud - Crowdfunding kast on nähtav - Peida eriolukastid - Eriolukastid on peidetud - Eriolukastid on nähtav - Peida infopane elid - Teabepaneelid on peidetud - Teabepaneelid on nähtavad - - Peida Liitu nupp - Liitumisnupp on peidetud - Liitumisnupp on nähtaval - Peida meditsiinipaneelid - Meditsiinipaneelid on peidetud - Meditsiinipaneelid on nähtavad - Peida kiirtoimingud - Kiirtoimingud täisekraanil on peidetud - Kiirtoimingud täisekraanil on nähtavad - Peida seotud videod - Seotud videod kiirtoimingutes on peidetud - Seotud videod kiirtoimingutes on nähtavad - Peida tellijate juhised - Tellijate kogukonna juhised on peidetud - Tellijate kogukonna juhised on kuvatud - Peida ajastatud reaktsioonid - Ajastatud reaktsioonid on peidetud - Ajastatud reaktsioonid on nähtavad - Peida „AI-ga loodud video kokkuvõte” - Tehisintellekti loodud videokokkuvõtete jaotis on peidetud - AI-ga loodud videokokkuvõtte jaotis on nähtaval - Peida küsi - Küsi osa on peidetud - Küsi osa on nähtav - Peida atribuudid - Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on peidetud - Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on kuvatud - Peida peatükid - Peatükide jaotis on peidetud - Peatükide jaotis on näidatud - Peida \"Kuidas see sisu loodi\" - Kuidas see sisu loodi jaotis on peidetud - Kuidas see sisu loodi jaotis on kuvatud - Peida Hype\'i punktid - Hype\'i punktid on peidetud - Hype\'i punktid on nähtavad - Peida \"Avasta taskuhäälingut\" - Avasta taskuhäälingut jaotis on peidetud - Avasta taskuhäälingut jaotis on kuvatud - Peida esiletoodud lingid - Esiletõstetud linkide sektsioon on peidetud - Esiletõstetud linkide sektsioon on nähtav - Peida esiletõstetud videod - Esiletõstetud videote sektsioon on peidetud - Esiletõstetud videote sektsioon on nähtav - Peida infokaardid - Teabekaartide jaotis on peidetud - Kuvatakse teabekaartide jaotis - Peida \"Põhimõisted\" - Põhimõisted jaotis on peidetud - Põhimõisted jaotis on kuvatud - Peida tellimisnupp - Tellimisnupp on peidetud - Tellimisnupp on nähtav - Peida transkriptsioon - Skriptiosa on peidetud - Skriptiosa on näidatud - Video kirjeldus - Peida videokirjelduse komponendid või kuva need - Filtriseriba - Peida või näita filtririba voogudes, seotud videotes, otsingutulemustes ja vaatamiste ajaloos - Peida voogudes - Peidetud voogudes - Näidatud voogudes - Peida seotud videotes - Peidetud seotud videotes - Näidatakse seotud videotes - Peida otsingutulemustes - Peidetud otsingutulemustes - Kuvatakse otsingutulemustes - Peida vaatamisajaloos - Peidetud vaatamiste ajaloos - Nähtav vaatamisajaloos - Kanali leht - Peida või näita kanali lehe komponente - - Peida kogukonna nupp - Kogukonna nupp on peidetud - Kogukonna nupp on nähtaval - - Peida \"Sulle\" riiul - Sulle mõeldud riiul on peidetud - Sulle mõeldud riiul on nähtav - - Peida nupp „Liitu” - Nupp „Liitu” on peidetud - Nupp „Liitu” on nähtaval - Peida linkide eelvaade - Linkide eelvaade on peidetud - Linkide eelvaade on nähtav - Peida liikmete riiul - Liikmete riiul on peidetud - Liikmete riiul on nähtav - - Peida nupp „Pood” - Nupp „Pood” on peidetud - Nupp „Pood” on nähtaval - - Peida nupp „Telli” - Nupp „Telli” on peidetud - Nupp „Telli” on nähtaval - Kommentaarid - Peida või kuva kommentaaride sektsiooni komponendid - Peida AI vestluse kokkuvõte - AI vestluse kokkuvõte on peidetud - AI vestluse kokkuvõte on nähtav - Peida tehisintellekti kommentaaride kokkuv\u00f5te - AI kommentaaride kokkuvõte on peidetud - AI kommentaaride kokkuvõte on nähtav - Peida kanali juhised - Kanali juhised on peidetud - Kanali juhised on nähtaval - Peida päis \'Liikmete kommentaarid\' - Liikmete kommentaaride päis on peidetud - Liikmete kommentaaride päis on kuvatud - Peida kommentaaride jaotis - Kommentaaride jaotis on peidetud - Kommentaaride jaotis on näidatud - Peida kogukonna juhised - Kogukonna juhised on peidetud - Kogukonna juhised on nähtavad - Peida nupp \"Loo lühis\" - Nupp Loo lühivideo on peidetud - Nupp Loo lühivideo on kuvatud - Peida emotikonide ja ajatempli nupud - Emotikonide ja ajatempli nupud on peidetud - Emotikonide ja ajatempli nupud on nähtavad - Peida eelvaate kommentaar - Eelvaate kommentaar on peidetud - Eelvaate kommentaar on kuvatud - Peida tänunupp - Tänu nupp on peidetud - Tänu nupp on kuvatud - Peida vaatamiste arv - Vaatamiste arv on peidetud voos ja otsingutulemustes - Vaatamiste arv on nähtav voos ja otsingutulemustes - - "Piirangud: + Peida Liitu nupp + Liitumisnupp on peidetud + Liitumisnupp on nähtaval + Peida meditsiinipaneelid + Meditsiinipaneelid on peidetud + Meditsiinipaneelid on nähtavad + Peida kiirtoimingud + Kiirtoimingud täisekraanil on peidetud + Kiirtoimingud täisekraanil on nähtavad + Peida seotud videod + Seotud videod kiirtoimingutes on peidetud + Seotud videod kiirtoimingutes on nähtavad + Peida tellijate juhised + Tellijate kogukonna juhised on peidetud + Tellijate kogukonna juhised on kuvatud + Peida ajastatud reaktsioonid + Ajastatud reaktsioonid on peidetud + Ajastatud reaktsioonid on nähtavad + Peida „AI-ga loodud video kokkuvõte” + Tehisintellekti loodud videokokkuvõtete jaotis on peidetud + AI-ga loodud videokokkuvõtte jaotis on nähtaval + Peida küsi + Küsi osa on peidetud + Küsi osa on nähtav + Peida atribuudid + Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on peidetud + Esiletõstetud kohad, mängud, muusika ja inimeste mainimise jaotised on kuvatud + Peida peatükid + Peatükide jaotis on peidetud + Peatükide jaotis on näidatud + Peida \"Kuidas see sisu loodi\" + Kuidas see sisu loodi jaotis on peidetud + Kuidas see sisu loodi jaotis on kuvatud + Peida Hype\'i punktid + Hype\'i punktid on peidetud + Hype\'i punktid on nähtavad + Peida \"Avasta taskuhäälingut\" + Avasta taskuhäälingut jaotis on peidetud + Avasta taskuhäälingut jaotis on kuvatud + Peida esiletoodud lingid + Esiletõstetud linkide sektsioon on peidetud + Esiletõstetud linkide sektsioon on nähtav + Peida esiletõstetud videod + Esiletõstetud videote sektsioon on peidetud + Esiletõstetud videote sektsioon on nähtav + Peida infokaardid + Teabekaartide jaotis on peidetud + Kuvatakse teabekaartide jaotis + Peida \"Põhimõisted\" + Põhimõisted jaotis on peidetud + Põhimõisted jaotis on kuvatud + Peida tellimisnupp + Tellimisnupp on peidetud + Tellimisnupp on nähtav + Peida transkriptsioon + Skriptiosa on peidetud + Skriptiosa on näidatud + Video kirjeldus + Peida videokirjelduse komponendid või kuva need + Filtriseriba + Peida või näita filtririba voogudes, seotud videotes, otsingutulemustes ja vaatamiste ajaloos + Peida voogudes + Peidetud voogudes + Näidatud voogudes + Peida seotud videotes + Peidetud seotud videotes + Näidatakse seotud videotes + Peida otsingutulemustes + Peidetud otsingutulemustes + Kuvatakse otsingutulemustes + Peida vaatamisajaloos + Peidetud vaatamiste ajaloos + Nähtav vaatamisajaloos + Kanali leht + Peida või näita kanali lehe komponente + + Peida kogukonna nupp + Kogukonna nupp on peidetud + Kogukonna nupp on nähtaval + + Peida \"Sulle\" riiul + Sulle mõeldud riiul on peidetud + Sulle mõeldud riiul on nähtav + + Peida nupp „Liitu” + Nupp „Liitu” on peidetud + Nupp „Liitu” on nähtaval + Peida linkide eelvaade + Linkide eelvaade on peidetud + Linkide eelvaade on nähtav + Peida liikmete riiul + Liikmete riiul on peidetud + Liikmete riiul on nähtav + + Peida nupp „Pood” + Nupp „Pood” on peidetud + Nupp „Pood” on nähtaval + + Peida nupp „Telli” + Nupp „Telli” on peidetud + Nupp „Telli” on nähtaval + Kommentaarid + Peida või kuva kommentaaride sektsiooni komponendid + Peida AI vestluse kokkuvõte + AI vestluse kokkuvõte on peidetud + AI vestluse kokkuvõte on nähtav + Peida tehisintellekti kommentaaride kokkuv\u00f5te + AI kommentaaride kokkuvõte on peidetud + AI kommentaaride kokkuvõte on nähtav + Peida kanali juhised + Kanali juhised on peidetud + Kanali juhised on nähtaval + Peida päis \'Liikmete kommentaarid\' + Liikmete kommentaaride päis on peidetud + Liikmete kommentaaride päis on kuvatud + Peida kommentaaride jaotis + Kommentaaride jaotis on peidetud + Kommentaaride jaotis on näidatud + Peida kogukonna juhised + Kogukonna juhised on peidetud + Kogukonna juhised on nähtavad + Peida nupp \"Loo lühis\" + Nupp Loo lühivideo on peidetud + Nupp Loo lühivideo on kuvatud + Peida emotikonide ja ajatempli nupud + Emotikonide ja ajatempli nupud on peidetud + Emotikonide ja ajatempli nupud on nähtavad + Peida eelvaate kommentaar + Eelvaate kommentaar on peidetud + Eelvaate kommentaar on kuvatud + Peida tänunupp + Tänu nupp on peidetud + Tänu nupp on kuvatud + Peida vaatamiste arv + Vaatamiste arv on peidetud voos ja otsingutulemustes + Vaatamiste arv on nähtav voos ja otsingutulemustes + + "Piirangud: • Shorts-i riiulid, kanalilehed ja otsingutulemused võivad endiselt kuvada vaatamiste arvu • See funktsioon ei tööta autotööstuse vormiteguriga" - Peida üleslaadimisaeg - Üleslaadimisaeg on peidetud voost ja otsingutulemustest - Üleslaadimisaeg on nähtav voos ja otsingutulemustes - - "Piirangud: + Peida üleslaadimisaeg + Üleslaadimisaeg on peidetud voost ja otsingutulemustest + Üleslaadimisaeg on nähtav voos ja otsingutulemustes + + "Piirangud: • Shorts riiulitel, kanalilehtedel ja otsingutulemustes võib üleslaadimisaeg endiselt nähtav olla • See funktsioon ei tööta autodele mõeldud vorminguga" - Peida video sisu märksõna abil - Peida otsingu ja voo videod, kasutades märksõna filtreid - Peida kodu videod märksõnade abil - Kodu vahekaardi videod on filtreeritud märksõnade järgi - Avalehe videoid pole filtreeritud võtmesõnade abil - Peida otsingutulemid võtmesõnade järgi - Otsingutulemid on filtreeritud võtmesõnade järgi - Otsingutulemid ei ole filtreeritud võtmesõnade järgi - Peida videod, mis sisaldavad võtmesõnu - Avalehe videoid filtreeritakse võtmesõnade abil - Tellivideote ei filtreeritakse vastavalt võtmesõnadele - Võtmesõnad peitmiseks - - "Peidetavad märksõnad ja fraasid, eraldatud reavahetustega + "Peidetavad märksõnad ja fraasid, eraldatud reavahetustega Märksõnad võivad olla kanalite nimed või mis tahes tekst, mis kuvatakse videote pealkirjades Sõnad, millel on keskel suurtähed, tuleb sisestada suurtähega (nt iPhone, TikTok, LeBlanc)" - Märksõnade filtreerimise kohta - "Kodu/Tellimuste/Otsingutulemused filtreeritakse, et peita sisu, mis vastab märksõnadele ja fraasidele + Märksõnade filtreerimise kohta + "Kodu/Tellimuste/Otsingutulemused filtreeritakse, et peita sisu, mis vastab märksõnadele ja fraasidele Piirangud • Shorts ei saa peita kanali nime järgi • Mõnda kasutajaliidese komponenti ei pruugi peita • Märksõna otsing ei pruugi anda tulemusi" - Sobita täpsed sõnad - - Märksõna/fraasi ümbritsemine kahe topeltpakkumis märgiga takistab video pealkirjade ja kanali nimede osalist vastet.<br><br>Näiteks<br><b>\"ai\"</b> peidab video: <b>How does AI work?</b><br>aga ei peida: <b>What does fair use mean?</b> - - Võti sõna: %s ei saa kasutada - Lisa jutumärgid järgmiste võtmesõnade jaoks: %s - Võtmesõnal on vastuolulised deklareeringud: %s - Võtmesõna on liiga lühike ja vajab jutumärke: %s - Võti sõna: %s peidab kõik videod - - - Peida looja poe riiul - Looja poe riiul videopleieri all on peidetud - Looja poeriiul videopleieri all on nähtav - Peida lõpuekraani poe bänner - Lõpuekraani poebänner on peidetud - Lõpuekraani poebänner on nähtaval - Peida täisekraanireklaamid - "Täisekraani reklaamid on peidetud + Sobita täpsed sõnad + + Märksõna/fraasi ümbritsemine kahe topeltpakkumis märgiga takistab video pealkirjade ja kanali nimede osalist vastet.<br><br>Näiteks<br><b>\"ai\"</b> peidab video: <b>How does AI work?</b><br>aga ei peida: <b>What does fair use mean?</b> + + Võti sõna: %s ei saa kasutada + Lisa jutumärgid järgmiste võtmesõnade jaoks: %s + Võtmesõnal on vastuolulised deklareeringud: %s + Võtmesõna on liiga lühike ja vajab jutumärke: %s + Võti sõna: %s peidab kõik videod + + + Peida looja poe riiul + Looja poe riiul videopleieri all on peidetud + Looja poeriiul videopleieri all on nähtav + Peida lõpuekraani poe bänner + Lõpuekraani poebänner on peidetud + Lõpuekraani poebänner on nähtaval + Peida täisekraanireklaamid + "Täisekraani reklaamid on peidetud See funktsioon on saadaval ainult vanemates seadmetes" - Täisekraanireklaamid kuvatakse - - Terveekraanireklaamide peitmine toimib ainult vanemate seadmetega - Peida üldine reklaamid - Üldine reklaamid on peidetud - Üldreklaamid kuvatakse - Peida reklaamipõhjad - Reklaamipõhjad on peidetud - Reklaamipõhjad on nähtavad - Peida makstud edendamise silt - Makstud edendamise silt on peidus - Makstud edendamise silt on näidatud - Peida ise-sponsoritud kaardid - Ise-sponsoritud kaardid on peidus - Ise-sponsoritud kaardid on näidatud - Peida ostulingid - Ostulingid video kirjelduses on peidetud - Ostlemise lingid videokirjelduses on nähtavad - Peida bänner \"Vaata tooteid\" - Vaata tooteid bänner videokattel on peidetud - Vaata tooteid bänner videokattel on nähtaval - Peida veebiotsingu tulemused - Veebiotsingu tulemused on peidetud - Veebiotsingu tulemused on nähtavad - - - Peida YouTube Premiumi reklaamid - Videoall mängija all olevad YouTube Premiumi reklaamid on peidetud - YouTube Premium reklaamide alla esitatakse YouTube Premiumi reklaamkampaaniad - - - Peida video reklaamid - Videoreklaamid on peidetud - Videoreklaamid on kuvatud - - - URL kopeeritud clipboardi - Aadres URL ajaga kopeeritud - Kuva video URL kopeerimise nupp - Video URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i kopeerimiseks. Puudutage pikalt, et kopeerida ajatempliga - Video URL-i kopeerimise nupp pole nähtaval - Näita video URL-i ajatempliga kopeerimise nuppu - Ajatempliga URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i ajatempliga kopeerimiseks. Puudutage pikalt, et kopeerida ilma ajatemplita - Ajatempliga URL-i kopeerimise nupp pole nähtaval - - - Eemalda vaataja arvamuse dialoog - Dialoog eemaldatakse - Dialoog kuvatakse - See ei mööda vanusepiirangust. See lihtsalt aktsepteerib seda automaatselt. - - - Keela hüpikaken „Logi telerisse sisse” - Telerisse sisselogimise hüpikaken on keelatud - Telerisse sisselogimise hüpikaken on lubatud - - - Keela topeltpuudutusega peatüki vahelejätmine - Topeltpuudutus ei saa kunagi käivitada järgmise/eelmise peatüki vahelejätmist - Topeltpuudutus võib aeg-ajalt käivitada järgmise/eelmise peatüki vahelejätmise - - - Välised allalaadimised - Seaded välise allalaadija kasutamiseks - Näita välise allalaadimise nuppu - Allalaadimise nupp pleieris on kuvatud - Allalaadimise nupp pleieris ei ole kuvatud - - Muuda allalaadimisnupu toimingut - Allalaadimise nupp avab teie välise allalaadija - Allalaadimise nupp avab seadme sisseehitatud allalaadija - Allalaadija paketi nimi - Paigaldatud välise allalaadimisrakenduse paketi nimi - Sisesta paketi nimi - Muu - Rakendus pole installitud - %s ei ole installitud. Palun installige see. - "Installitud rakendust ei leitud paketi nimega: %s + Täisekraanireklaamid kuvatakse + + Terveekraanireklaamide peitmine toimib ainult vanemate seadmetega + Peida üldine reklaamid + Üldine reklaamid on peidetud + Üldreklaamid kuvatakse + Peida reklaamipõhjad + Reklaamipõhjad on peidetud + Reklaamipõhjad on nähtavad + Peida makstud edendamise silt + Makstud edendamise silt on peidus + Makstud edendamise silt on näidatud + Peida ise-sponsoritud kaardid + Ise-sponsoritud kaardid on peidus + Ise-sponsoritud kaardid on näidatud + Peida ostulingid + Ostulingid video kirjelduses on peidetud + Ostlemise lingid videokirjelduses on nähtavad + Peida bänner \"Vaata tooteid\" + Vaata tooteid bänner videokattel on peidetud + Vaata tooteid bänner videokattel on nähtaval + Peida veebiotsingu tulemused + Veebiotsingu tulemused on peidetud + Veebiotsingu tulemused on nähtavad + + + Peida YouTube Premiumi reklaamid + Videoall mängija all olevad YouTube Premiumi reklaamid on peidetud + YouTube Premium reklaamide alla esitatakse YouTube Premiumi reklaamkampaaniad + + + Peida video reklaamid + Videoreklaamid on peidetud + Videoreklaamid on kuvatud + + + URL kopeeritud clipboardi + Aadres URL ajaga kopeeritud + Kuva video URL kopeerimise nupp + Video URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i kopeerimiseks. Puudutage pikalt, et kopeerida ajatempliga + Video URL-i kopeerimise nupp pole nähtaval + Näita video URL-i ajatempliga kopeerimise nuppu + Ajatempliga URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i ajatempliga kopeerimiseks. Puudutage pikalt, et kopeerida ilma ajatemplita + Ajatempliga URL-i kopeerimise nupp pole nähtaval + + + Eemalda vaataja arvamuse dialoog + Dialoog eemaldatakse + Dialoog kuvatakse + See ei mööda vanusepiirangust. See lihtsalt aktsepteerib seda automaatselt. + + + Keela hüpikaken „Logi telerisse sisse” + Telerisse sisselogimise hüpikaken on keelatud + Telerisse sisselogimise hüpikaken on lubatud + + + Keela topeltpuudutusega peatüki vahelejätmine + Topeltpuudutus ei saa kunagi käivitada järgmise/eelmise peatüki vahelejätmist + Topeltpuudutus võib aeg-ajalt käivitada järgmise/eelmise peatüki vahelejätmise + + + Välised allalaadimised + Seaded välise allalaadija kasutamiseks + Näita välise allalaadimise nuppu + Allalaadimise nupp pleieris on kuvatud + Allalaadimise nupp pleieris ei ole kuvatud + + Muuda allalaadimisnupu toimingut + Allalaadimise nupp avab teie välise allalaadija + Allalaadimise nupp avab seadme sisseehitatud allalaadija + Allalaadija paketi nimi + Paigaldatud välise allalaadimisrakenduse paketi nimi + Sisesta paketi nimi + Muu + Rakendus pole installitud + %s ei ole installitud. Palun installige see. + "Installitud rakendust ei leitud paketi nimega: %s Veendu, et paketi nimi on õige ja rakendus on installitud" - Paketi nimi ei tohi olla tühi - - - Keela täpne otsingu žest - Žest on keelatud - Žest on lubatud - - - Puudutusega otsimise lubamine - Puudutusega otsimine on lubatud - Puudutusega otsimine on keelatud - - - Luba heleduse žest - "Täisekraani heleduse pühkimine on lubatud + Paketi nimi ei tohi olla tühi + + + Keela täpne otsingu žest + Žest on keelatud + Žest on lubatud + + + Puudutusega otsimise lubamine + Puudutusega otsimine on lubatud + Puudutusega otsimine on keelatud + + + Luba heleduse žest + "Täisekraani heleduse pühkimine on lubatud Reguleeri heledust ekraani vasakul küljel vertikaalselt pühkides" - Täisekraani heleduse pühkimine on keelatud - Luba helitugevuse žest - "Täisekraani helitugevuse pühkimine on lubatud + Täisekraani heleduse pühkimine on keelatud + Luba helitugevuse žest + "Täisekraani helitugevuse pühkimine on lubatud Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt" - Täisekraani helitugevuse pühkimine on keelatud - Luba vajutusega libistamise žest - Vajutusega libistamine on lubatud - Vajutusega libistamine on keelatud - Luba haptilise tagasiside - Haptilise tagasiside on lubatud - Haptilise tagasiside on keelatud - Salvesta ja taasta heleduse - Salvesta ja taasta heleduse täisekraani väljumisel või sisselülitamisel - Ära salvesta ja taasta heleduse täisekraani väljumisel või sisselülitamisel - Luba automaatse heleduse žest - Pühkige alla heleduse žesti madalaima väärtuseni, et lubada automaatne heleduse - Pühkimine alla madalaima väärtuseni ei luba automaatset heleduse - Automaatne - Pühkimise katte aegumisaeg - Katte näitamise millisekundite arv - Pühkiva katte tausta läbipaistvus - Läbipaistvuse väärtus vahemikus 0-100 - Pühkiva katte läbipaistvus peab olema vahemikus 0-100 - Pühkige ekraani heleduse värvi - Heleduse juhtnuppude edenemisriba värv - Pühkige ekraani helitugevuse värvi - Helitugevuse juhtnuppude edenemisriba värv - Liigutamise ülekatte teksti suurus - Liigutamise ülekatte teksti suurus vahemikus 1–30 - Teksti suurus peab olema vahemikus 1–30 - Pühkimise suuruse lävi - Lävi väärtus pühkimise toimimiseks - Helitugevuse libistamise tundlikkus - Kui palju helitugevus ühe libistusega muutub - Nipsa ülekattestiil - Horisontaalne ülekate - Horisontaalne ülekate (minimaalne – üleval) - Horisontaalne ülekate (minimaalne – keskel) - Ümmargune ülekate - Ümmargune ülekate (minimaalne) - Vertikaalne ülekate - Vertikaalne ülekate (minimaalne) - Luba pühkimine videote vahetamiseks - Täisekraanrežiimis pühkimine vahetab järgmise/eelmise video - Täisekraanrežiimis pühkimine ei vaheta järgmise/eelmise video - - - Keela automaatsed pealdised - Automaatsed subtiitrid on keelatud - Automaatsed subtiitrid on lubatud - - - Tegevuse nupud - Peida või näita videote all olevaid nuppe - Eemalda Meeldi ja Telli nuppude helk - Meeldi ja Telli nupud ei heida mainitmisel - Meeldi ja Telli nupud heidavad mainitmisel - Peida Meeldib ja Ei meeldi - Meeldib ja Ei meeldi nupud on peidetud - Meeldib ja Ei meeldi nupud on nähtavad - - Peida Jaga - Jaga nupp on peidetud - Jaga nupp on nähtav - - Peida reklaamide peatamine - Peata reklaamide nupp on peidetud - Peata reklaamide nupp on nähtav - - Peida kommentaarid - Kommentaaride nupp on peidetud - Kommentaaride nupp on nähtav - + Peida Jaga + Jaga nupp on peidetud + Jaga nupp on nähtav + + Peida reklaamide peatamine + Peata reklaamide nupp on peidetud + Peata reklaamide nupp on nähtav + + Peida kommentaarid + Kommentaaride nupp on peidetud + Kommentaaride nupp on nähtav + - Peida Teata - Teata nupp on peidetud - Teata nupp on nähtav - - Peida Remix - Remix nupp on peidetud - Remix nupp on nähtav - - Peida Laadi alla - Laadi alla nupp on peidetud - Laadi alla nupp on nähtav - + Peida Remix + Remix nupp on peidetud + Remix nupp on nähtav + + Peida Laadi alla + Laadi alla nupp on peidetud + Laadi alla nupp on nähtav + - Peida Hype - Hype nupp on peidetud - Hype\'i nupp on nähtav - - Peida reklaam - Reklaami nupp on peidetud - Reklaami nupp on nähtav - - Peida Tänan - Tänan nupp on peidetud - Tänan nupp on nähtav - + Peida reklaam + Reklaami nupp on peidetud + Reklaami nupp on nähtav + + Peida Tänan + Tänan nupp on peidetud + Tänan nupp on nähtav + - Peida küsi - Küsi nupp on peidetud - Küsi nupp on nähtav - - Peida Lõik - Lõigu nupp on peidetud - Lõigu nupp on nähtav - - Peida pood - Poe nupp on peidetud - Poe nupp on nähtaval - - Peida Salvesta - Nupp Salvesta on peidetud - Nupp Salvesta on nähtav - - - Navigeerimisnupud - Peida või muuda navigeerimisriba nuppe - - Peida Avaleht - Avalehe nupp on peidetud - Avalehe nupp on nähtav - - Peida Shorts - Shorts nupp on peidetud - Shorts nupp on nähtav - - Peida Loo - Loo nupp on peidetud - Loo nupp on nähtav - - Peida Tellimuste - Tellimuste nupp on peidetud - Tellimuste nupp on nähtav - Peida teavitused - Teavituste nupp on peidetud - Teavituste nupp on nähtav - - Vaheta Loo ja Teated - "Looda nupp on vahetatud teavituste nupuga + Peida küsi + Küsi nupp on peidetud + Küsi nupp on nähtav + + Peida Lõik + Lõigu nupp on peidetud + Lõigu nupp on nähtav + + Peida pood + Poe nupp on peidetud + Poe nupp on nähtaval + + Peida Salvesta + Nupp Salvesta on peidetud + Nupp Salvesta on nähtav + + + Navigeerimisnupud + Peida või muuda navigeerimisriba nuppe + + Peida Avaleht + Avalehe nupp on peidetud + Avalehe nupp on nähtav + + Peida Shorts + Shorts nupp on peidetud + Shorts nupp on nähtav + + Peida Loo + Loo nupp on peidetud + Loo nupp on nähtav + + Peida Tellimuste + Tellimuste nupp on peidetud + Tellimuste nupp on nähtav + Peida teavitused + Teavituste nupp on peidetud + Teavituste nupp on nähtav + + Vaheta Loo ja Teated + "Looda nupp on vahetatud teavituste nupuga Märkus: selle lubamine peidab ka sunniviisiliselt video reklaamid" - Loo nuppu ei ole vahetatud Teadete nupuga - "Selle sätte keelamine keelab ka Shorts reklaamide blokeerimise. + Loo nuppu ei ole vahetatud Teadete nupuga + "Selle sätte keelamine keelab ka Shorts reklaamide blokeerimise. Kui selle sätte muutmine ei avalda mõju, proovige lülituda Inkognito režiimile." - Peida navigeerimisnupude sildistused - Sildistused on peidetud - Sildistused on nähtavad - Keela läbipaistev olekuriba - Staatusriba on läbipaistev - Olekubuuri on matt või läbipaistev - Mõnedes seadmetes võib selle funktsiooni lubamine muuta süsteemi navigeerimisriba läbipaistvaks. - Keela hele läbipaistev riba - Heleda režiimi navigeerimisriba on läbipaistmatu - Hele režiimi navigeerimisriba on matt või läbipaistev - Keela tume õhuke riba - Tumeda režiimi navigeerimisriba on läbipaistmatu - Tume režiimi navigeerimisriba on matt või läbipaistev - - - Väljuv menüü - Peida või näita esitusprogrammi väljaulatuva menüü esemeid - - Peida subtiitrid - Subtiitrite menüü on peidetud - Subtiitrite menüü on nähtav - - Peida Täiendavad seaded - Täiendavate seadete menüü on peidetud - Täiendavate seadete menüü on nähtav - - Peida Unetaimer - Unetaimeri menüü on peidetud - Unetaimeri menüü on nähtav - - Peida Loopi video - Loopi video menüü on peidetud - Loopi video menüü on nähtav - - Peida Ümbritseva režiimi - Ümbritseva režiimi menüü on peidetud - Ümbritseva režiimi menüü on nähtav - Peida Stabiilne helitugevus - Stabiilse helitugevuse menüü on nähtav - Stabiilse helitugevuse menüü on peidetud - - Peida Abi & tagasiside - Abi & tagasiside menüü on peidetud - Abi & tagasiside menüü on nähtav - - Peida Esituse kiirus - Esituse kiiruse menüü on peidetud - Esituse kiiruse menüü on nähtav - - Peida Ekraani lukustus - Ekraani lukustuse menüü on peidetud - Ekraani lukustuse menüü on nähtav - - Peida Kuula YouTube Musicuga - Kuula YouTube Musicuga menüü on peidetud - Kuula YouTube Musicuga menüü on nähtav - - Peida Helitraek - Helitraekide menüü on peidetud - Helitraekide menüü on nähtav - + Peida subtiitrid + Subtiitrite menüü on peidetud + Subtiitrite menüü on nähtav + + Peida Täiendavad seaded + Täiendavate seadete menüü on peidetud + Täiendavate seadete menüü on nähtav + + Peida Unetaimer + Unetaimeri menüü on peidetud + Unetaimeri menüü on nähtav + + Peida Loopi video + Loopi video menüü on peidetud + Loopi video menüü on nähtav + + Peida Ümbritseva režiimi + Ümbritseva režiimi menüü on peidetud + Ümbritseva režiimi menüü on nähtav + Peida Stabiilne helitugevus + Stabiilse helitugevuse menüü on nähtav + Stabiilse helitugevuse menüü on peidetud + + Peida Abi & tagasiside + Abi & tagasiside menüü on peidetud + Abi & tagasiside menüü on nähtav + + Peida Esituse kiirus + Esituse kiiruse menüü on peidetud + Esituse kiiruse menüü on nähtav + + Peida Ekraani lukustus + Ekraani lukustuse menüü on peidetud + Ekraani lukustuse menüü on nähtav + + Peida Kuula YouTube Musicuga + Kuula YouTube Musicuga menüü on peidetud + Kuula YouTube Musicuga menüü on nähtav + + Peida Helitraek + Helitraekide menüü on peidetud + Helitraekide menüü on nähtav + - "Heliriba menüü on peidetud + "Heliriba menüü on peidetud Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „Android No SDK”" - - Peida Vaata VR-is - Vaata VR-is menüü on peidetud - Vaata VR-is menüü on nähtav - Peida videokvaliteedi menüü - Videokvaliteedi menüü on peidetud - Videokvaliteedi menüü on nähtav - Peida video kvaliteedi menüü jalg - Video kvaliteedi menüü jalg on peidetud - Video kvaliteedi menüü jalg on nähtav - - - Peida Automaatse esitamise nupp - Automaatse esituse nupp on peidetud - Automaatse esituse nupp on nähtav - - Peida Subtiitrid nupp - Subtiitrite nupp on peidetud - Subtiitrite nupp on nähtav - Peida Saada kätte nupp - Ülekandmise nupp on peidetud - Ülekandmise nupp on nähtav - Peida pleieri juhtnuppude taust - Mängija juhtnuppude taust on peidetud - Pleieri juhtnuppude taust on nähtav - Peida eelmine & järgmine nupp - Nupud on peidetud - Nupud on nähtavad - - - Peida lõpukujunduse kaardid - Lõpukujunduse kaardid on peidetud - Lõpukujunduse kaardid on nähtavad - - - Keela ümbritseva režiim täisekraanil - Ümbritseva režiimi keelatud - Ümbritseva režiimi lubatud - - - Peida infokaardid - Infokaardid on peidetud - Infokaardid on nähtaval - - - Keela rulluvate numbrite animatsioonid - Rulluvad numbrid ei ole animeeritud - Rulluvad numbrid on animeeritud - - - Peida videopleieri edenemisriba - Videopleieri otsimisriba on peidetud - Videopleieri otsimisriba on nähtav - - Peida video pisipiltide edenemisriba - Video pisipiltide edenemisriba on peidetud - Video pisipiltide edenemisriba on nähtav - - - Shorts esitusprogramm - Peida või näita Shortside pleieri komponente - - Peida Shorts esilehel - Peidetud esilehel ja seotud videotes - Nähtaval esilehel ja seotud videotes - Peida Shorts otsingutulemustes - Peida otsingutulemustest - Näidatud otsingutulemustes - - Peida Shorts tellimuste voos - Peidetud tellimuste voos - Nähtaval tellimuste voos - Peida Shortsid vaatamisaegadust - Peidetud vaatamise ajaloos - Näidatud vaatamisaegadus - Peida silt „Automaatselt dubleeritud” - Automaatselt dubleeritud silt on peidetud - Automaatselt dubleeritud silt on nähtav - Peida nupp „Osta Super Tänud” - Osta Super Thanks nupp on peidetud - Osta Super Thanks nupp on nähtaval - Peida efekti nupp - Efekti nupp on peidetud - Efekti nupp on nähtav - Peida nupp „Roheline ekraan” - Rohelise ekraani nupp on peidetud - Rohelise ekraani nupp on nähtav - Peida räsimärgi nupp - Räsimärgi nupp on peidetud - Räsimärgi nupp on nähtav - - Peida Liitu nupp - Liitumisnupp on peidetud - Liitumisnupp on nähtav - Peida reaalajas eelvaade - Otse eelvaade on peidetud - Otse eelvaade on nähtav - Peida asukoha silt - Asukoha silt on peidetud - Asukoha silt on nähtav - Peida nupp „Uued postitused” - Uute postituste nupp on peidetud - Uute postituste nupp on nähtav - Peida peatatud ülekatte nupud - Peatatud ülekatte nupud on peidetud - Peatatud ülekatte nupud on nähtavad - Peida eelvaate kommentaar - Kommentaari eelvaade on peidetud - Kommentaari eelvaade on nähtav - Peida nupp „Salvesta muusika” - Muusika salvestamise nupp on peidetud - Muusika salvestamise nupp on nähtav - Peida otsingusoovitused - Otsingusoovitused on peidetud - Otsingusoovitused on nähtavad - Peida Poe nupp - Poenupp on peidetud - Poenupp on nähtav - Peida kleebised - Kleebised on peidetud - Kleebised on nähtavad - Peida Telli nupp - Tellimise nupp on peidetud - Tellimise nupp on nähtav - Peida sildistatud tooted - Sildistatud tooted on peidetud - Sildistatud tooted on nähtavad - Peida Eelseisvad nupp - Eelseisva nuppu on peidetud - Eelseisva nuppu on nähtav - Peida nupp „Kasuta seda heli” - Nupp \"Kasuta seda heli\" on peidetud - Nupp \"Kasuta seda heli\" on nähtav - Peida nupp „Kasuta seda malli” - Nupp \"Kasuta seda malli\" on peidetud - Kasuta seda malli nupp on nähtav - Peida Meeldi nupu purskkaevu animatsioon - Meeldimise nupu fontääni animatsioon on peidetud - Meeldimise nupu fontääni animatsioon on nähtav - Peida Meeldi nupp - Meeldimise nupp on peidetud - Meeldimise nupp on nähtav - Peida Ei meeldi nupp - Mittemeeldimise nupp on peidetud - Mittemeeldimise nupp on nähtav - Peida Kommentaarid nupp - Kommentaaride nupp on peidetud - Kommentaaride nupp on nähtav - - Peida Jaga nupp - Jagamise nupp on peidetud - Jagamise nupp on nähtav - - Peida Remiksi nupp - Remix-nupp on peidetud - Remix-nupp on nähtav - Peida heli nupp - Heli nupp on peidetud - Heli nupp on nähtav - Peida infopaan - Infopaan on peidetud - Infopaan on nähtav - Peida kanaliriba - Kanaliriba on peidetud - Kanaliriba on nähtav - Peida video pealkiri - Video pealkiri on peidetud - Video pealkiri on nähtaval - Peida heli metaandmete silt - Heli metaandmete silt on peidetud - Heli metaandmete silt on nähtaval - Peida videolingi silt - Video lingi silt on peidetud - Video lingi silt on nähtav - Peida navigeerimisriba - Navigeerimisriba on peidetud - Navigeerimisriba on nähtav - - - Peida lõpuekraani soovitatud video - "Lõpuekraani soovitatud video on peidetud, kui automaatesitus on välja lülitatud. + + Peida Vaata VR-is + Vaata VR-is menüü on peidetud + Vaata VR-is menüü on nähtav + Peida videokvaliteedi menüü + Videokvaliteedi menüü on peidetud + Videokvaliteedi menüü on nähtav + Peida video kvaliteedi menüü jalg + Video kvaliteedi menüü jalg on peidetud + Video kvaliteedi menüü jalg on nähtav + + + Peida Automaatse esitamise nupp + Automaatse esituse nupp on peidetud + Automaatse esituse nupp on nähtav + + Peida Subtiitrid nupp + Subtiitrite nupp on peidetud + Subtiitrite nupp on nähtav + Peida Saada kätte nupp + Ülekandmise nupp on peidetud + Ülekandmise nupp on nähtav + Peida pleieri juhtnuppude taust + Mängija juhtnuppude taust on peidetud + Pleieri juhtnuppude taust on nähtav + Peida eelmine & järgmine nupp + Nupud on peidetud + Nupud on nähtavad + + + Peida lõpukujunduse kaardid + Lõpukujunduse kaardid on peidetud + Lõpukujunduse kaardid on nähtavad + + + Keela ümbritseva režiim täisekraanil + Ümbritseva režiimi keelatud + Ümbritseva režiimi lubatud + + + Peida infokaardid + Infokaardid on peidetud + Infokaardid on nähtaval + + + Keela rulluvate numbrite animatsioonid + Rulluvad numbrid ei ole animeeritud + Rulluvad numbrid on animeeritud + + + Peida videopleieri edenemisriba + Videopleieri otsimisriba on peidetud + Videopleieri otsimisriba on nähtav + + Peida video pisipiltide edenemisriba + Video pisipiltide edenemisriba on peidetud + Video pisipiltide edenemisriba on nähtav + + + Shorts esitusprogramm + Peida või näita Shortside pleieri komponente + + Peida Shorts esilehel + Peidetud esilehel ja seotud videotes + Nähtaval esilehel ja seotud videotes + Peida Shorts otsingutulemustes + Peida otsingutulemustest + Näidatud otsingutulemustes + + Peida Shorts tellimuste voos + Peidetud tellimuste voos + Nähtaval tellimuste voos + Peida Shortsid vaatamisaegadust + Peidetud vaatamise ajaloos + Näidatud vaatamisaegadus + Peida silt „Automaatselt dubleeritud” + Automaatselt dubleeritud silt on peidetud + Automaatselt dubleeritud silt on nähtav + Peida nupp „Osta Super Tänud” + Osta Super Thanks nupp on peidetud + Osta Super Thanks nupp on nähtaval + Peida efekti nupp + Efekti nupp on peidetud + Efekti nupp on nähtav + Peida nupp „Roheline ekraan” + Rohelise ekraani nupp on peidetud + Rohelise ekraani nupp on nähtav + Peida räsimärgi nupp + Räsimärgi nupp on peidetud + Räsimärgi nupp on nähtav + + Peida Liitu nupp + Liitumisnupp on peidetud + Liitumisnupp on nähtav + Peida reaalajas eelvaade + Otse eelvaade on peidetud + Otse eelvaade on nähtav + Peida asukoha silt + Asukoha silt on peidetud + Asukoha silt on nähtav + Peida nupp „Uued postitused” + Uute postituste nupp on peidetud + Uute postituste nupp on nähtav + Peida peatatud ülekatte nupud + Peatatud ülekatte nupud on peidetud + Peatatud ülekatte nupud on nähtavad + Peida eelvaate kommentaar + Kommentaari eelvaade on peidetud + Kommentaari eelvaade on nähtav + Peida nupp „Salvesta muusika” + Muusika salvestamise nupp on peidetud + Muusika salvestamise nupp on nähtav + Peida otsingusoovitused + Otsingusoovitused on peidetud + Otsingusoovitused on nähtavad + Peida Poe nupp + Poenupp on peidetud + Poenupp on nähtav + Peida kleebised + Kleebised on peidetud + Kleebised on nähtavad + Peida Telli nupp + Tellimise nupp on peidetud + Tellimise nupp on nähtav + Peida sildistatud tooted + Sildistatud tooted on peidetud + Sildistatud tooted on nähtavad + Peida Eelseisvad nupp + Eelseisva nuppu on peidetud + Eelseisva nuppu on nähtav + Peida nupp „Kasuta seda heli” + Nupp \"Kasuta seda heli\" on peidetud + Nupp \"Kasuta seda heli\" on nähtav + Peida nupp „Kasuta seda malli” + Nupp \"Kasuta seda malli\" on peidetud + Kasuta seda malli nupp on nähtav + Peida Meeldi nupu purskkaevu animatsioon + Meeldimise nupu fontääni animatsioon on peidetud + Meeldimise nupu fontääni animatsioon on nähtav + Peida Meeldi nupp + Meeldimise nupp on peidetud + Meeldimise nupp on nähtav + Peida Ei meeldi nupp + Mittemeeldimise nupp on peidetud + Mittemeeldimise nupp on nähtav + Peida Kommentaarid nupp + Kommentaaride nupp on peidetud + Kommentaaride nupp on nähtav + + Peida Jaga nupp + Jagamise nupp on peidetud + Jagamise nupp on nähtav + + Peida Remiksi nupp + Remix-nupp on peidetud + Remix-nupp on nähtav + Peida heli nupp + Heli nupp on peidetud + Heli nupp on nähtav + Peida infopaan + Infopaan on peidetud + Infopaan on nähtav + Peida kanaliriba + Kanaliriba on peidetud + Kanaliriba on nähtav + Peida video pealkiri + Video pealkiri on peidetud + Video pealkiri on nähtaval + Peida heli metaandmete silt + Heli metaandmete silt on peidetud + Heli metaandmete silt on nähtaval + Peida videolingi silt + Video lingi silt on peidetud + Video lingi silt on nähtav + Peida navigeerimisriba + Navigeerimisriba on peidetud + Navigeerimisriba on nähtav + + + Peida lõpuekraani soovitatud video + "Lõpuekraani soovitatud video on peidetud, kui automaatesitus on välja lülitatud. Automaatesitust saab muuta YouTube'i seadetes: Seaded → Taasesitus → Esita järgmine video automaatselt" - Lõpuekraani soovitatud video on näidatud - - - Peida seotud videote kate - Seotud videote kate täisekraanil on peidetud - Seotud videote kate täisekraanil on nähtaval - - - Peida video ajamärk - Ajamärk on peidetud - Ajamärk on nähtav - - - Peida esitaja hüpikaknad - Esitaja hüpikaknad on peidetud - Esitaja hüpikaknad on nähtavad - - - Video lõpus välju täisekraanirežiimist - Keelatud - Portree - Maastiku - Portree ja maastiku - - - Ava videod täisekraani portreerežiimis - Videod avanevad täisekraani režiimis - Videod ei avane täisekraani režiimis - - - Esitaja kattekihi läbipaistvus - Läbipaistvuse väärtus vahemikus 0-100, kus 0 on läbipaistev - Mängija kattekihi läbipaistvus peab olema 0-100 vahel - - - - Mittemeeldimised pole ajutiselt saadaval (API aegus) - Mittemeeldimised pole saadaval (olek %d) - Ei meeldimised pole saadaval (kliendi API limiit) - Mittemeeldimised pole saadaval (%s) - - Laadi video uuesti, et hääletada Return YouTube Dislike\'i abil - - Peidetud omaniku poolt - Mittemeeldimised on nähtavad - Mittemeeldimised pole nähtavad - Näita mittemeeldimisi Shorts\'il - "Ei meeldimised on kuvatud teenuses Shorts + Lõpuekraani soovitatud video on näidatud + + + Peida seotud videote kate + Seotud videote kate täisekraanil on peidetud + Seotud videote kate täisekraanil on nähtaval + + + Peida video ajamärk + Ajamärk on peidetud + Ajamärk on nähtav + + + Peida esitaja hüpikaknad + Esitaja hüpikaknad on peidetud + Esitaja hüpikaknad on nähtavad + + + Video lõpus välju täisekraanirežiimist + Keelatud + Portree + Maastiku + Portree ja maastiku + + + Ava videod täisekraani portreerežiimis + Videod avanevad täisekraani režiimis + Videod ei avane täisekraani režiimis + + + Esitaja kattekihi läbipaistvus + Läbipaistvuse väärtus vahemikus 0-100, kus 0 on läbipaistev + Mängija kattekihi läbipaistvus peab olema 0-100 vahel + + + + Mittemeeldimised pole ajutiselt saadaval (API aegus) + Mittemeeldimised pole saadaval (olek %d) + Ei meeldimised pole saadaval (kliendi API limiit) + Mittemeeldimised pole saadaval (%s) + + Laadi video uuesti, et hääletada Return YouTube Dislike\'i abil + + Peidetud omaniku poolt + Mittemeeldimised on nähtavad + Mittemeeldimised pole nähtavad + Näita mittemeeldimisi Shorts\'il + "Ei meeldimised on kuvatud teenuses Shorts Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada" - Ei meeldimised pole kuvatud teenuses Shorts - Mittemeeldimised protsendina - Ei meeldimised on kuvatud protsendina - Ei meeldimised on kuvatud numbrina - - Kompaktne Meeldi nupp - Meeldimise nupp on stiilitud minimaalse laiusena - Meeldimise nupp on stiilitud parima välimusega - Näita hinnangulisi meeldimisi - Videod, millel on keelatud meeldimised, näitavad meeldimiste arvu ligikaudset väärtust - Ligikaudsed meeldimised ei ole näidatud - Näita teadet, kui API pole saadaval - Teade näidatakse, kui Return YouTube Dislike pole saadaval - Teadet ei näidata, kui Return YouTube Dislike pole saadaval - Andmed on pakutud Return YouTube Dislike API poolt. Puuduta siia, et saada lisateavet - - ReturnYouTubeDislike API statistika sellel seadmel - API vastuse aeg, keskmine - API vastuse aeg, minimaalne - API vastusaja maksimum - API vastusaja, viimane video - Dislikes ajutiselt pole saadaval - kliendi API kiirusepiirang on jõustunud - API hääletuste hankimine, kõnede arv - Võrguühendust ei ole tehtud - %d võrguühendust on tehtud - API hääletuste hankimine, aegumiste arv - Võrguühendus ei ole aegunud - %d võrguühendus on aegunud - API kliendi kiirusepiirangud - Kliendi kiirusepiiranguid ei ole kohatud - Kliendi kiirusepiirang on kohatud %d korda - %d millisekundit - - - Luba lai otsinguriba - Lai otsinguriba on lubatud - Lai otsinguriba on keelatud - - - Luba kvaliteetsed pisipildid - Pisipildid on kvaliteetsed - Pisipildid on keskmiselt kvaliteetsed - "See taastab ka eelvaated otseülekannetel, millel pole otsinguriba eelvaateid. + Ei meeldimised pole kuvatud teenuses Shorts + Mittemeeldimised protsendina + Ei meeldimised on kuvatud protsendina + Ei meeldimised on kuvatud numbrina + + Kompaktne Meeldi nupp + Meeldimise nupp on stiilitud minimaalse laiusena + Meeldimise nupp on stiilitud parima välimusega + Näita hinnangulisi meeldimisi + Videod, millel on keelatud meeldimised, näitavad meeldimiste arvu ligikaudset väärtust + Ligikaudsed meeldimised ei ole näidatud + Näita teadet, kui API pole saadaval + Teade näidatakse, kui Return YouTube Dislike pole saadaval + Teadet ei näidata, kui Return YouTube Dislike pole saadaval + Andmed on pakutud Return YouTube Dislike API poolt. Puuduta siia, et saada lisateavet + + ReturnYouTubeDislike API statistika sellel seadmel + API vastuse aeg, keskmine + API vastuse aeg, minimaalne + API vastusaja maksimum + API vastusaja, viimane video + Dislikes ajutiselt pole saadaval - kliendi API kiirusepiirang on jõustunud + API hääletuste hankimine, kõnede arv + Võrguühendust ei ole tehtud + %d võrguühendust on tehtud + API hääletuste hankimine, aegumiste arv + Võrguühendus ei ole aegunud + %d võrguühendus on aegunud + API kliendi kiirusepiirangud + Kliendi kiirusepiiranguid ei ole kohatud + Kliendi kiirusepiirang on kohatud %d korda + %d millisekundit + + + Luba lai otsinguriba + Lai otsinguriba on lubatud + Lai otsinguriba on keelatud + + + Luba kvaliteetsed pisipildid + Pisipildid on kvaliteetsed + Pisipildid on keskmiselt kvaliteetsed + "See taastab ka eelvaated otseülekannetel, millel pole otsinguriba eelvaateid. Otsinguriba eelvaated kasutavad sama kvaliteeti kui praegune video. See funktsioon toimib kõige paremini 720p või madalama video kvaliteedi ja väga kiiresti internetühendusega." - Taasta vanad pisipildid - Pisipildid ilmuvad otsinguriba kohale - Pisipildid ilmuvad täisekraanil - - - Luba SponsorBlock - SponsorBlock on rahvahulga loodud süsteem YouTube\'i videote tüütute osade vahelejätmiseks - Välimus - Näita hääletamisnuppu - Segmendi hääletamisnupp on näidatud - Segmendi hääletamisnupp ei ole näidatud - Kasuta ruudukujulist paigutust - Nupud ja juhtnupud on kandilised - Nupud ja juhtnupud on ümardatud - - Kasuta kompaktset Vahelejätmise nuppu - Vahelejätmisnupp on kujundatud minimaalse laiusena - Vahelejätmisnupp on kujundatud parima välimusega - Peida vahelejätmisnupp automaatselt - Vahelejätmisnupp peitub mõne sekundi pärast - Vahelejätmise nupp on kuvatud kogu segmendi jaoks - Vahelejätnud nupu kestus - Kui kaua näidata vahelejätmise ja esiletõstmise nuppe enne automaatset peitmist - Kuva tühista vahelejätmise teavitus (toast) - Teavitus kuvatakse, kui segment jäetakse automaatselt vahele. Vahelejätmise tühistamiseks puudutage teavitust - Hüpikut ei kuvata - Vahelejätnud hüpiku kestus - Kui kaua näidata vahelejätmise tagasivõtmise hüpikut - 1 sekund - 2 sekundit - 3 sekundit - 4 sekundit - 5 sekundit - 6 sekundit - 7 sekundit - 8 sekundit - 9 sekundit - 10 sekundit - Näita video pikkust ilma segmentideta - Video pikkus miinus kõik segmendid kuvatakse edenemisribal - Näidatakse täispikk video pikkust - Uute segmentide loomine - Näita Uue segmendi loomise nuppu - Uue segmendi loomise nupp on näidatud - Uue segmendi loomise nupp ei ole näidatud - Kohanda uue segmendi sammu - Millisekundite arv, mille võrra aja reguleerimise nupud uute segmentide loomisel liiguvad - Väärtus peab olema positiivne arv - Vaadake juhiseid - Juhised sisaldavad reegleid ja näpunäiteid uute segmentide loomiseks - Järgige juhiseid - Enne uute segmentide loomist lugege SponsorBlocki juhiseid - Olen juba lugenud - Näita mulle - Üldine - Näita teatist, kui API pole saadaval - Teatis näidatakse, kui SponsorBlock pole saadaval - Teatist ei näidata, kui SponsorBlock pole saadaval - Luba vahelejätmiste arvu jälgimine - Teavitab SponsorBlocki edetabelit, kui palju aega säästetakse. Iga segmendi vahelejätmisel saadetakse edetabelisse teade - Vahelejätmiste arvu jälgimine pole lubatud - Min. segmendi pikkus - Segmente, mis on lühemad kui see väärtus (sekundites), ei kuvata ega vahele jäeta - Kehtetu aja pikkus - Teie privaatne kasutaja ID - Seda tuleks hoida konfidentsiaalsena. See on nagu parool ja seda ei tohiks kellelegi jagada. Kui kellelgi on see olemas, saab ta teid teesklema - Privaatne kasutaja ID peab olema vähemalt 30 tähemärki pikk - Muuda API URL-i - Aadress, mida SponsorBlock kasutab serveriga ühenduse loomiseks - API URL-i lähtestamine - API URL-i pole kehtiv - API URL-i on muudetud - Seadistuste importimine/eksportimine - Kopeeri - Teie SponsorBlocki JSON konfiguratsioon, mida saab importida/ekspordi ReVanced ja teiste SponsorBlocki platvormidele - Teie SponsorBlocki JSON konfiguratsioon, mida saab importida/ekspordi ReVanced ja teiste SponsorBlocki platvormidele. See sisaldab teie privaatset kasutaja ID-d. Olge selle jagamisel ettevaatlik - Seadistused imporditud edukalt - Importimine nurjus: %s - Eksportimine nurjus: %s - "Teie seaded sisaldavad privaatset SponsorBlocki kasutajatunnust. + Taasta vanad pisipildid + Pisipildid ilmuvad otsinguriba kohale + Pisipildid ilmuvad täisekraanil + + + Luba SponsorBlock + SponsorBlock on rahvahulga loodud süsteem YouTube\'i videote tüütute osade vahelejätmiseks + Välimus + Näita hääletamisnuppu + Segmendi hääletamisnupp on näidatud + Segmendi hääletamisnupp ei ole näidatud + Kasuta ruudukujulist paigutust + Nupud ja juhtnupud on kandilised + Nupud ja juhtnupud on ümardatud + + Kasuta kompaktset Vahelejätmise nuppu + Vahelejätmisnupp on kujundatud minimaalse laiusena + Vahelejätmisnupp on kujundatud parima välimusega + Peida vahelejätmisnupp automaatselt + Vahelejätmisnupp peitub mõne sekundi pärast + Vahelejätmise nupp on kuvatud kogu segmendi jaoks + Vahelejätnud nupu kestus + Kui kaua näidata vahelejätmise ja esiletõstmise nuppe enne automaatset peitmist + Kuva tühista vahelejätmise teavitus (toast) + Teavitus kuvatakse, kui segment jäetakse automaatselt vahele. Vahelejätmise tühistamiseks puudutage teavitust + Hüpikut ei kuvata + Vahelejätnud hüpiku kestus + Kui kaua näidata vahelejätmise tagasivõtmise hüpikut + 1 sekund + 2 sekundit + 3 sekundit + 4 sekundit + 5 sekundit + 6 sekundit + 7 sekundit + 8 sekundit + 9 sekundit + 10 sekundit + Näita video pikkust ilma segmentideta + Video pikkus miinus kõik segmendid kuvatakse edenemisribal + Näidatakse täispikk video pikkust + Uute segmentide loomine + Näita Uue segmendi loomise nuppu + Uue segmendi loomise nupp on näidatud + Uue segmendi loomise nupp ei ole näidatud + Kohanda uue segmendi sammu + Millisekundite arv, mille võrra aja reguleerimise nupud uute segmentide loomisel liiguvad + Väärtus peab olema positiivne arv + Vaadake juhiseid + Juhised sisaldavad reegleid ja näpunäiteid uute segmentide loomiseks + Järgige juhiseid + Enne uute segmentide loomist lugege SponsorBlocki juhiseid + Olen juba lugenud + Näita mulle + Üldine + Näita teatist, kui API pole saadaval + Teatis näidatakse, kui SponsorBlock pole saadaval + Teatist ei näidata, kui SponsorBlock pole saadaval + Luba vahelejätmiste arvu jälgimine + Teavitab SponsorBlocki edetabelit, kui palju aega säästetakse. Iga segmendi vahelejätmisel saadetakse edetabelisse teade + Vahelejätmiste arvu jälgimine pole lubatud + Min. segmendi pikkus + Segmente, mis on lühemad kui see väärtus (sekundites), ei kuvata ega vahele jäeta + Kehtetu aja pikkus + Teie privaatne kasutaja ID + Seda tuleks hoida konfidentsiaalsena. See on nagu parool ja seda ei tohiks kellelegi jagada. Kui kellelgi on see olemas, saab ta teid teesklema + Privaatne kasutaja ID peab olema vähemalt 30 tähemärki pikk + Muuda API URL-i + Aadress, mida SponsorBlock kasutab serveriga ühenduse loomiseks + API URL-i lähtestamine + API URL-i pole kehtiv + API URL-i on muudetud + Seadistuste importimine/eksportimine + Kopeeri + Teie SponsorBlocki JSON konfiguratsioon, mida saab importida/ekspordi ReVanced ja teiste SponsorBlocki platvormidele + Teie SponsorBlocki JSON konfiguratsioon, mida saab importida/ekspordi ReVanced ja teiste SponsorBlocki platvormidele. See sisaldab teie privaatset kasutaja ID-d. Olge selle jagamisel ettevaatlik + Seadistused imporditud edukalt + Importimine nurjus: %s + Eksportimine nurjus: %s + "Teie seaded sisaldavad privaatset SponsorBlocki kasutajatunnust. Teie kasutajatunnis on nagu parool ja seda ei tohiks kunagi jagada. " - Ära näita enam - Muuda segmendi käitumist - Toetaja - Tasuline reklaam, tasulised suunamised ja otsereklaamid. Ei ole mõeldud enesereklaamimiseks ega tasuta hüüatusteks asjade/loojate/veebilehtede/toodete kohta, mis neile meeldivad - Tasuta/Enesereklaam - Sarnane Sponsoriga, kuid ilma tasu või enesereklaamita. Hõlmab jaotisi kaupade, annetuste või koostööpartnerite kohta - Interaktsiooni meeldetuletus (Telli) - Lühike meeldetuletus, et anda neile meeldib, tellida või jälgida neid sisu keskel. Kui see on pikk või millegi konkreetse kohta, peaks see olema hoopis enesereklaami all - Esitlus - Video osa, mida enamik inimesi otsib - Vaheaeg/Intro animatsioon - Ajavahemik, millel pole tegelikku sisu. Võib olla paus, staatiline kaader või korduv animatsioon. Ei sisalda üleminekuid, mis sisaldavad teavet - Lõpukaardid / Tiitrid - Tiitrid või YouTube\'i lõppkaardid. Ei ole mõeldud järelduste jaoks, mis sisaldavad teavet - Konks / Tervitused - Jutustatud treilerid eelseisvatele videotele, tervitused ja hüvasti jätmised. Ei hõlma osi, mis lisavad täiendavat sisu - Eelvaade / Kokkuvõte - Klipi kogum, mis näitab, mis tulemas on või mis juhtus videos või teistes sarja videotes, kus kogu teave on korduv - Kõrvalepõige / Naljad - Kõrvalised stseenid või naljad, mis pole video peamise sisu mõistmiseks vajalikud. Ei hõlma osi, mis pakuvad konteksti või taustateavet - Muusika: Muusikavaba osa - Ainult muusikavideote puhul. Muusikavideote osad ilma muusikata, mis ei ole juba kaetud mõne teise kategooriaga - Jäta vahele - Esita - Jäta reklaam vahele - Jäta enesereklaam vahele - Jäta suhtlus vahele - Jäta esitluseni - Jäta sissejuhatuseni - Jäta vahepausini - Jäta vahepausini - Jäta lõppuni - Jäta sissejuhatus vahele - Jäta eelvaatesse - Jäta eelvaatesse - Jäta kokkuvõttes - Jäta kõrvalepõige vahele - Jäta muusikavaba osa vahele - Jäta segment vahele - Reklaam vahele jäetud - Enesereklaam vahele jäetud - Ärritav meeldetuletus vahele jäetud - Esitluseni vahele jäetud - Sissejuhatus vahele jäetud - Vahepaus vahele jäetud - Vahepaus vahele jäetud - Lõpp vahele jäetud - Sissejuhatus vahele jäetud - Eelvaade vahele jäetud - Eelvaade vahele jäetud - Kokkuvõte vahele jäetud - Kõrvalepõige vahele jäetud - Muusikavaba osa vahele jäetud - Esitamata segment vahele jäetud - Mitmed segmendid vahele jäetud - Jäta automaatselt vahele - Jäta automaatselt üks kord vahele - Näita vahelejätmise nuppu - Näita otsimisribal - Keela - Segmendi esitamine ebaõnnestus: %s - SponsorBlock on ajutiselt maas - Segmendi esitamine ebaõnnestus (olek: %1$d %2$s) - Segmenti ei saa esitada. Määra piirang (liiga palju samast kasutajast või IP-aadressilt) - Segmendi esitamine ebaõnnestus: %s - "Segmenti ei saa esitada. + Ära näita enam + Muuda segmendi käitumist + Toetaja + Tasuline reklaam, tasulised suunamised ja otsereklaamid. Ei ole mõeldud enesereklaamimiseks ega tasuta hüüatusteks asjade/loojate/veebilehtede/toodete kohta, mis neile meeldivad + Tasuta/Enesereklaam + Sarnane Sponsoriga, kuid ilma tasu või enesereklaamita. Hõlmab jaotisi kaupade, annetuste või koostööpartnerite kohta + Interaktsiooni meeldetuletus (Telli) + Lühike meeldetuletus, et anda neile meeldib, tellida või jälgida neid sisu keskel. Kui see on pikk või millegi konkreetse kohta, peaks see olema hoopis enesereklaami all + Esitlus + Video osa, mida enamik inimesi otsib + Vaheaeg/Intro animatsioon + Ajavahemik, millel pole tegelikku sisu. Võib olla paus, staatiline kaader või korduv animatsioon. Ei sisalda üleminekuid, mis sisaldavad teavet + Lõpukaardid / Tiitrid + Tiitrid või YouTube\'i lõppkaardid. Ei ole mõeldud järelduste jaoks, mis sisaldavad teavet + Konks / Tervitused + Jutustatud treilerid eelseisvatele videotele, tervitused ja hüvasti jätmised. Ei hõlma osi, mis lisavad täiendavat sisu + Eelvaade / Kokkuvõte + Klipi kogum, mis näitab, mis tulemas on või mis juhtus videos või teistes sarja videotes, kus kogu teave on korduv + Kõrvalepõige / Naljad + Kõrvalised stseenid või naljad, mis pole video peamise sisu mõistmiseks vajalikud. Ei hõlma osi, mis pakuvad konteksti või taustateavet + Muusika: Muusikavaba osa + Ainult muusikavideote puhul. Muusikavideote osad ilma muusikata, mis ei ole juba kaetud mõne teise kategooriaga + Jäta vahele + Esita + Jäta reklaam vahele + Jäta enesereklaam vahele + Jäta suhtlus vahele + Jäta esitluseni + Jäta sissejuhatuseni + Jäta vahepausini + Jäta vahepausini + Jäta lõppuni + Jäta sissejuhatus vahele + Jäta eelvaatesse + Jäta eelvaatesse + Jäta kokkuvõttes + Jäta kõrvalepõige vahele + Jäta muusikavaba osa vahele + Jäta segment vahele + Reklaam vahele jäetud + Enesereklaam vahele jäetud + Ärritav meeldetuletus vahele jäetud + Esitluseni vahele jäetud + Sissejuhatus vahele jäetud + Vahepaus vahele jäetud + Vahepaus vahele jäetud + Lõpp vahele jäetud + Sissejuhatus vahele jäetud + Eelvaade vahele jäetud + Eelvaade vahele jäetud + Kokkuvõte vahele jäetud + Kõrvalepõige vahele jäetud + Muusikavaba osa vahele jäetud + Esitamata segment vahele jäetud + Mitmed segmendid vahele jäetud + Jäta automaatselt vahele + Jäta automaatselt üks kord vahele + Näita vahelejätmise nuppu + Näita otsimisribal + Keela + Segmendi esitamine ebaõnnestus: %s + SponsorBlock on ajutiselt maas + Segmendi esitamine ebaõnnestus (olek: %1$d %2$s) + Segmenti ei saa esitada. Määra piirang (liiga palju samast kasutajast või IP-aadressilt) + Segmendi esitamine ebaõnnestus: %s + "Segmenti ei saa esitada. Juba olemas" - Segment esitatud - - SponsorBlock on ajutiselt kättesaamatu (API aeglustub) - SponsorBlock on ajutiselt kättesaamatu (olek %d) - SponsorBlock on ajutiselt kättesaamatu - Segmendi hääletamine ebaõnnestus (API aeglustub) - Segmendi hääletamine ebaõnnestus (olek: %1$d %2$s) - Segmendi hääletamine ebaõnnestus: %s - Hääleta üles - Hääleta alla - Muuda kategooriat - Hääletamiseks pole segmente - - %1$s kuni %2$s - Vali segmendi kategooria - Kategooria on seadetes keelatud. Luba kategooria esitamiseks. - Uus SponsorBlock segment - Määra %s uue segmendi algus- või lõpppunktiks? - Algus - Lõpp - Nüüd - Aeg, millal segment algab - Aeg, millal segment lõpeb - Kas ajad on õiged? - "Lõik on vahemikus + Segment esitatud + + SponsorBlock on ajutiselt kättesaamatu (API aeglustub) + SponsorBlock on ajutiselt kättesaamatu (olek %d) + SponsorBlock on ajutiselt kättesaamatu + Segmendi hääletamine ebaõnnestus (API aeglustub) + Segmendi hääletamine ebaõnnestus (olek: %1$d %2$s) + Segmendi hääletamine ebaõnnestus: %s + Hääleta üles + Hääleta alla + Muuda kategooriat + Hääletamiseks pole segmente + + %1$s kuni %2$s + Vali segmendi kategooria + Kategooria on seadetes keelatud. Luba kategooria esitamiseks. + Uus SponsorBlock segment + Määra %s uue segmendi algus- või lõpppunktiks? + Algus + Lõpp + Nüüd + Aeg, millal segment algab + Aeg, millal segment lõpeb + Kas ajad on õiged? + "Lõik on vahemikus %1$s kuni @@ -1280,46 +1279,46 @@ kuni (%3$s) Kas olete esitamiseks valmis?" - Algus peab olema enne lõppu - Märkige esmalt kaks asukohta aja ribal - Vaadake eelvaadet ja veenduge, et see hüppab sujuvalt - Muuda segmendi ajastust käsitsi - Kas soovite muuta segmendi algus- või lõpppunkti ajastust? - Sisestatud aega ei ole võimalik analüüsida - Statistika - - Statistika pole ajutiselt saadaval (API on maas) - Laen... - SponsorBlock on keelatud - Teie kasutajanimi: <b>%s</b> - Puuduta siia, et muuta oma kasutajanime - Kasutajanime muutmine ebaõnnestus: Olek: %1$d %2$s - Kasutajanimi muudetud - Teie maine on <b>%.2f</b> - Olete loonud <b>%s</b> segmenti - Puuduta siia, et vaadata oma segmente - SponsorBlock edetabel - Olete päästnud inimesi <b>%s</b> segmendist - Puuduta siia, et vaadata ülemaailmseid statistikat ja parimaid panustajaid - See on <b>%s</b> nende elust.<br>Puuduta siia, et vaadata edetabelit - Olete vahele jätnud <b>%s</b> segmenti - See on <b>%s</b> - Lähtesta vahelejäetud segmentide loendur? - %1$s tundi %2$s minutit - %1$s minutit %2$s sekundit - %s sekundit - Läbipaistmatus: - Värv: - Teave - Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele - - - Paigutuse vormitegur - Vaikimisi - Telefon - Tahvelarvuti - Automotiiv - "Muudatused hõlmavad: + Algus peab olema enne lõppu + Märkige esmalt kaks asukohta aja ribal + Vaadake eelvaadet ja veenduge, et see hüppab sujuvalt + Muuda segmendi ajastust käsitsi + Kas soovite muuta segmendi algus- või lõpppunkti ajastust? + Sisestatud aega ei ole võimalik analüüsida + Statistika + + Statistika pole ajutiselt saadaval (API on maas) + Laen... + SponsorBlock on keelatud + Teie kasutajanimi: <b>%s</b> + Puuduta siia, et muuta oma kasutajanime + Kasutajanime muutmine ebaõnnestus: Olek: %1$d %2$s + Kasutajanimi muudetud + Teie maine on <b>%.2f</b> + Olete loonud <b>%s</b> segmenti + Puuduta siia, et vaadata oma segmente + SponsorBlock edetabel + Olete päästnud inimesi <b>%s</b> segmendist + Puuduta siia, et vaadata ülemaailmseid statistikat ja parimaid panustajaid + See on <b>%s</b> nende elust.<br>Puuduta siia, et vaadata edetabelit + Olete vahele jätnud <b>%s</b> segmenti + See on <b>%s</b> + Lähtesta vahelejäetud segmentide loendur? + %1$s tundi %2$s minutit + %1$s minutit %2$s sekundit + %s sekundit + Läbipaistmatus: + Värv: + Teave + Andmed on pärit SponsorBlock API-st. Puudutage siia, et saada lisateavet ja vaadata allalaadimisi teistele platvormidele + + + Paigutuse vormitegur + Vaikimisi + Telefon + Tahvelarvuti + Automotiiv + "Muudatused hõlmavad: Tahvelarvuti paigutus • Kogukonna postitused on peidetud @@ -1327,314 +1326,312 @@ Tahvelarvuti paigutus Autode paigutus • Shorts avanevad tavalises pleieris • Voog on korraldatud teemade ja kanalite järgi" - - - Võltsitud rakenduse versioon - Versioon on võltsitud - Versiooni ei ole võltsitud - "Rakenduse versioon võltsitakse vanemaks YouTube i versiooniks. + + + Võltsitud rakenduse versioon + Versioon on võltsitud + Versiooni ei ole võltsitud + "Rakenduse versioon võltsitakse vanemaks YouTube i versiooniks. See muudab rakenduse välimust ja funktsioone, kuid võivad esineda tundmatud kõrvalmõjud. Kui see hiljem välja lülitatakse, on soovitatav rakenduse andmed kustutada, et vältida kasutajaliidese vigu." - Võltsitud rakenduse versiooni siht - 20.13.41 - Taasta mittekokkuvarisenud video tegevusriba - 20.05.46 - Taasta transkriptsioonifunktsionaalsus - 19.35.36 - Taastage vanad Shortsi esitajaikoonid - 19.01.34 – Taasta vanad navigeerimisikoonid - - - Muuda alguslehte - Vaikimisi - Kõik tellimused - Sirvi kanaleid - Kursused / Õppimine - Avasta - Mood ja Ilu - Mängud - Ajalugu - Raamatukogu - Meeldinud videod - Otseülekanne - Filmid - Muusika - Uudised - Teatised - Esitusloendid - Otsi - Ostlemine - Sport - Tellimused - Trendikas - Virtuaalne Reaalsus - Vaata hiljem - Teie klipid - Muuda alati avalehte - "Alguslehte muudetakse alati + Võltsitud rakenduse versiooni siht + 20.13.41 - Taasta mittekokkuvarisenud video tegevusriba + 20.05.46 - Taasta transkriptsioonifunktsionaalsus + 19.35.36 - Taastage vanad Shortsi esitajaikoonid + 19.01.34 – Taasta vanad navigeerimisikoonid + + + Muuda alguslehte + Vaikimisi + Kõik tellimused + Sirvi kanaleid + Kursused / Õppimine + Avasta + Mood ja Ilu + Mängud + Ajalugu + Raamatukogu + Meeldinud videod + Otseülekanne + Filmid + Muusika + Uudised + Teatised + Esitusloendid + Otsi + Ostlemine + Sport + Tellimused + Trendikas + Virtuaalne Reaalsus + Vaata hiljem + Teie klipid + Muuda alati avalehte + "Alguslehte muudetakse alati Piirang: tööriistaribal tagasinupp ei pruugi töötada" - Avalehte muudetakse ainult rakenduse käivitamisel - - - Keela Shortsi esitaja jätkamine - Shortsi esitaja ei jätka rakenduse käivitamisel - Shortsi esitaja jätkub rakenduse käivitamisel - - - Ava Shorts - Shorts esitusprogramm - Tavaline mängija - Tavaline mängija täisekraanil - - - Shortsi automaatne esitus - Shortsid esitatakse automaatselt - Shortsid korratakse - Shortsi automaatne esitus taustal - Shortsi taustal esitamine toimub automaatselt - Shortsi taustal esitamine korratakse - - - Minimängija - Muuda rakendusesisese minipleieri stiili - Miniplayeri tüüp - Väljas - Vaikimisi - Minimaalne - Tahvelarvuti - Kaasaegne 1 - Kaasaegne 2 - Kaasaegne 3 - Moodne 4 - Keela ümarad nurgad - Nurgad on ruudukujulised - Nurgad on ümarad - Lülita kahekordne puudutus ja pigistamine suuruse muutmiseks sisse - "Topeltklõpsamise toiming ja tihendamisega suuruse muutmine on lubatud + Avalehte muudetakse ainult rakenduse käivitamisel + + + Keela Shortsi esitaja jätkamine + Shortsi esitaja ei jätka rakenduse käivitamisel + Shortsi esitaja jätkub rakenduse käivitamisel + + + Ava Shorts + Shorts esitusprogramm + Tavaline mängija + Tavaline mängija täisekraanil + + + Shortsi automaatne esitus + Shortsid esitatakse automaatselt + Shortsid korratakse + Shortsi automaatne esitus taustal + Shortsi taustal esitamine toimub automaatselt + Shortsi taustal esitamine korratakse + + + Minimängija + Muuda rakendusesisese minipleieri stiili + Miniplayeri tüüp + Väljas + Vaikimisi + Minimaalne + Tahvelarvuti + Kaasaegne 1 + Kaasaegne 2 + Kaasaegne 3 + Moodne 4 + Keela ümarad nurgad + Nurgad on ruudukujulised + Nurgad on ümarad + Lülita kahekordne puudutus ja pigistamine suuruse muutmiseks sisse + "Topeltklõpsamise toiming ja tihendamisega suuruse muutmine on lubatud • Topeltklõpsake, et suurendada minimaalse mängija suurust • Topeltklõpsake uuesti, et taastada algne suurus" - Kahekordse puudutuse toiming ja pigistamine suuruse muutmiseks on keelatud - Keela lohistamine - Lohistamine on keelatud - "Lohistamine on lubatud + Kahekordse puudutuse toiming ja pigistamine suuruse muutmiseks on keelatud + Keela lohistamine + Lohistamine on keelatud + "Lohistamine on lubatud Minimaalset mängijat saab lohistada ekraani mis tahes nurka" - Keela horisontaalne lohistamisžest - Horisontaalse lohistamise žest on keelatud - "Horisontaalne lohistamise žest on lubatud + Keela horisontaalne lohistamisžest + Horisontaalse lohistamise žest on keelatud + "Horisontaalne lohistamise žest on lubatud Minimaalset mängijat saab lohistada ekraanilt vasakule või paremale" - Peida ülekatteliidese nupud - Ülekatteliidese nupud on peidetud - Ülekatteliidese nupud on nähtaval - Peida alatähed - Alatähed on peidetud - Alatähed on nähtavad - Peida edasi- ja tagasikerimisnupud - Edasi- ja tagasikerimine on peidetud - Edasi- ja tagasikerimine on nähtavad - Algse suurus - Algse suurus ekraanil, pikslites - Pikslite suurus peab olema vahemikus %1$s ja %2$s - Katte läbipaistvus - Läbipaistvuse väärtus vahemikus 0-100, kus 0 on läbipaistev - Miniplayeri katte läbipaistvus peab olema vahemikus 0-100 - - - Lülita gradientega laadimiskuva sisse - Laadimiskuval on gradientega taust - Laadimiskuval on tahke taust - Sissejuhatava ekraani stiil - Värv - Mustvalge - Lülita kohandatud edastusriba värv sisse - Kohandatud edastusriba värv on nähtav - Originaal edastusriba värv on nähtav - Kohandatud otsinguriba värv - Otsinguriba värv - Kohandatud otsinguriba esiletõiduv värv - Otsinguriba esiletõiduv värv - Vigane edastusriba värvi väärtus - - - - - Päise logo - Vaikimisi - Tavaline - - ReVanced minimaalne - Kohandatud - - - Ületa pildi piirkondlike piirangute keelud - Kasutatakse pildi hosti yt4.ggpht.com - "Kasutatakse originaalset piltide hosti + Peida ülekatteliidese nupud + Ülekatteliidese nupud on peidetud + Ülekatteliidese nupud on nähtaval + Peida alatähed + Alatähed on peidetud + Alatähed on nähtavad + Peida edasi- ja tagasikerimisnupud + Edasi- ja tagasikerimine on peidetud + Edasi- ja tagasikerimine on nähtavad + Algse suurus + Algse suurus ekraanil, pikslites + Pikslite suurus peab olema vahemikus %1$s ja %2$s + Katte läbipaistvus + Läbipaistvuse väärtus vahemikus 0-100, kus 0 on läbipaistev + Miniplayeri katte läbipaistvus peab olema vahemikus 0-100 + + + Lülita gradientega laadimiskuva sisse + Laadimiskuval on gradientega taust + Laadimiskuval on tahke taust + Sissejuhatava ekraani stiil + Värv + Mustvalge + Lülita kohandatud edastusriba värv sisse + Kohandatud edastusriba värv on nähtav + Originaal edastusriba värv on nähtav + Kohandatud otsinguriba värv + Otsinguriba värv + Kohandatud otsinguriba esiletõiduv värv + Otsinguriba esiletõiduv värv + Vigane edastusriba värvi väärtus + + + + Päise logo + Vaikimisi + Tavaline + + ReVanced minimaalne + Kohandatud + + + Ületa pildi piirkondlike piirangute keelud + Kasutatakse pildi hosti yt4.ggpht.com + "Kasutatakse originaalset piltide hosti Selle lubamine võib parandada puuduvate piltide probleemi, mis mõnes piirkonnas on blokeeritud" - - - - Avalehe vaheleht - - Tellimuste vaheleht - - Sinu vaheleht - Mängija esitusloendid & soovitused - Otsimis tulemused - Originaalsed pisipildid - DeArrow & Originaalsed pisipildid - DeArrow & Vaikpiltide jäädvustused - Vaikpiltide jäädvustused - "DeArrow pakub rahvahääletusel põhinevaid eelvaateid YouTube i videotele. Need eelvaated on sageli asjakohasemad kui need, mida pakub YouTube + + + + Avalehe vaheleht + + Tellimuste vaheleht + + Sinu vaheleht + Mängija esitusloendid & soovitused + Otsimis tulemused + Originaalsed pisipildid + DeArrow & Originaalsed pisipildid + DeArrow & Vaikpiltide jäädvustused + Vaikpiltide jäädvustused + "DeArrow pakub rahvahääletusel põhinevaid eelvaateid YouTube i videotele. Need eelvaated on sageli asjakohasemad kui need, mida pakub YouTube Kui see on lubatud, saadetakse videote URL-id API serverisse ja muid andmeid ei saadeta. Kui videol pole DeArrow eelvaateid, siis kuvatakse originaalsed või staatilsed jäädvustused Puudutage siia, et saada lisateavet DeArrow kohta" - Kuva teatis, kui API pole kättesaadav - Teatis kuvatakse, kui DeArrow pole kättesaadav - Teatist ei kuvata, kui DeArrow pole kättesaadav - DeArrow API lõpp-punkt - DeArrow pisipiltide vahemälu lõpp-punkti URL - Vaikpiltide jäädvustused - Vaikpiltide jäädvustused tehakse iga video algusest/keskpaigast/lõpust. Need pildid on YouTube\'i sisseehitatud ja välist API-d ei kasutata - Kasuta kiireid vaikpiltide jäädvustusi - Kasutatakse keskmise kvaliteediga vaikpiltide jäädvustusi. Pisipildid laadivad kiiremini, aga otseülekanded, avaldamata või väga vanad videod võivad kuvada tühje pisipilte - Kasutatakse kõrge kvaliteediga vaikpiltide jäädvustusi - Video aeg vaikpiltide jäädvustamiseks - Video algus - Video keskpaik - Video lõpp - - DeArrow pole ajutiselt kättesaadav (oleku kood: %s) - DeArrow pole ajutiselt kättesaadav - - - Kuva ReVancedi teated - Teadaanded käivitamisel on kuvatud - Teadaanded käivitamisel pole kuvatud - Kuva teated käivitamisel - Ühenduse loomine teatepakkujaga ebaõnnestus - Loobu - - - Luba video kordamine - Video kordub - Video ei kordu - - - Näita video korduse nuppu - Nuppu kuvatakse - Nuppu ei kuvata - Video kordus on sees - Video kordus on väljas - - - - - Võltsitud seadme mõõtmed - "Seadme mõõtmed võltsitakse + Kuva teatis, kui API pole kättesaadav + Teatis kuvatakse, kui DeArrow pole kättesaadav + Teatist ei kuvata, kui DeArrow pole kättesaadav + DeArrow API lõpp-punkt + DeArrow pisipiltide vahemälu lõpp-punkti URL + Vaikpiltide jäädvustused + Vaikpiltide jäädvustused tehakse iga video algusest/keskpaigast/lõpust. Need pildid on YouTube\'i sisseehitatud ja välist API-d ei kasutata + Kasuta kiireid vaikpiltide jäädvustusi + Kasutatakse keskmise kvaliteediga vaikpiltide jäädvustusi. Pisipildid laadivad kiiremini, aga otseülekanded, avaldamata või väga vanad videod võivad kuvada tühje pisipilte + Kasutatakse kõrge kvaliteediga vaikpiltide jäädvustusi + Video aeg vaikpiltide jäädvustamiseks + Video algus + Video keskpaik + Video lõpp + + DeArrow pole ajutiselt kättesaadav (oleku kood: %s) + DeArrow pole ajutiselt kättesaadav + + + Kuva ReVancedi teated + Teadaanded käivitamisel on kuvatud + Teadaanded käivitamisel pole kuvatud + Kuva teated käivitamisel + Ühenduse loomine teatepakkujaga ebaõnnestus + Loobu + + + Luba video kordamine + Video kordub + Video ei kordu + + + Näita video korduse nuppu + Nuppu kuvatakse + Nuppu ei kuvata + Video kordus on sees + Video kordus on väljas + + + + Võltsitud seadme mõõtmed + "Seadme mõõtmed võltsitakse Võib avada kõrgema video kvaliteedi, kuid see võib põhjustada video taasesituse peatumist, halvemat aku kestvust ja tundmatuid kõrvalmõjusid" - "Seadme mõõtmed ei ole võltsitud + "Seadme mõõtmed ei ole võltsitud Selle lubamine võib avada kõrgema video kvaliteedi" - Selle funktsiooni lubamine võib põhjustada videote taasesituse häireid, kehvema aku kestvuse ja tundmatud kõrvalmõjud. - - - Haptiline tagasiside - Muuda haptilist tagasisidet - Keela peatükkide hääled - Peatükkide hääled on keelatud - Peatükkide hääled on lubatud - Keela täpse otsingu hääled - Täpse otsimise haptika on keelatud - Täpse otsingu hääled on lubatud - Keela otsimise tagasivõtmise haptika - Otsimise tagasivõtmise haptika on keelatud - Otsimise tagasivõtmise haptika on lubatud - Keela suumimise hääled - Suumi haptika on keelatud - Suumi haptika on lubatud - - - Kui sa hiljuti muutsid oma konto sisselogimisandmeid, siis eemalda ja installeeri MicroG uuesti. - - - Ümbersuunamiste URL-id mööda minna - Ümbersuunamiste URL-id mööda minnakse - Ümbersuunamiste URL-id ei mööda minnakse - - - Ava lingid brauseris - Linkide avamine välises brauseris - Linkide avamine rakendusesiseses brauseris - - - - Automaatne - Määle video kvaliteedi muudatused meelde - Kvaliteedi muudatused kehtivad kõigile videotele - Kvaliteedi muudatused kehtivad ainult praegusele videole - Näita teavitust videokvaliteedi muutumisel - Teavitus kuvatakse, kui vaikevideokvaliteeti muudetakse - Teavitust ei kuvata, kui vaikevideokvaliteeti muudetakse - Vaikimisi video kvaliteet Wi-Fi võrgus - Vaikimisi video kvaliteet mobiilsidevõrgus - Jäta meelde Shorts\'i kvaliteedimuudatused - Kvaliteedimuudatused kehtivad kõigile videotele Shorts - Kvaliteedimuudatused kehtivad ainult praegusele videole Short - Vaikimisi [Shorts] kvaliteet WiFi võrgus - Vaikimisi [Shorts] kvaliteet mobiilivõrgus - mobiil - WiFi - Vaikimisi %1$s kvaliteet muudeti: %2$s - Muudetud Shorts %1$s kvaliteet: %2$s - - - Kuva kiiruse dialoogi nupp - Kiiruse dialoogi nupp on nähtaval. Puudutage pikalt, et taasesituskiirus vaikeseadeks lähtestada - Kiiruse dialoogi nupp pole nähtaval - - - Näita video kvaliteedi nuppu - Video kvaliteedi nupp on nähtaval. Kvaliteedi lähtestamiseks vaikeseadeteks puudutage ja hoidke - Video kvaliteedi nupp pole nähtaval - - - Kohandatud taasesituse kiiruse menüü - Kohandatud kiiruse menüü kuvatakse - Kohandatud kiiruse menüüd ei kuvata - Taasta vana taasesituse kiiruse menüü - Kuvatakse vana kiiruse menüü - Kuvatakse kaasaegne kiiruse menüü - Kohandatud taasesituse kiirused - Lisa või muuda kohandatud taasesituse kiirusi - Kohandatud kiirused peavad olema alla %s - Kehtetud kohandatud video taasesituse kiirused - Automaatne - Kohandatud puuduta ja hoia kiiruse tase - Taasesituse kiirus vahemikus 0-8 - - - Määle taasesituse kiiruse muudatused meelde - Taasesituse kiiruse muudatused kehtivad kõigile videotele - Taasesituse kiiruse muudatused kehtivad ainult praegusele videole - Näita teavitust taasesituskiiruse muutumisel - Teavitus kuvatakse, kui vaike-esituskiirust muudetakse - Teavitust ei kuvata, kui vaike taasesituskiirust muudetakse. - Vaikimisi taasesituse kiirus - Vaikimisi kiirus muudeti: %s - - - Keela HDR video - HDR video on keelatud - HDR video on lubatud - Sunni AVC (H.264) - Videokodek sunnitakse AVC-le (H.264) - Videokodek määratakse automaatselt - "Eelised: + Selle funktsiooni lubamine võib põhjustada videote taasesituse häireid, kehvema aku kestvuse ja tundmatud kõrvalmõjud. + + + Haptiline tagasiside + Muuda haptilist tagasisidet + Keela peatükkide hääled + Peatükkide hääled on keelatud + Peatükkide hääled on lubatud + Keela täpse otsingu hääled + Täpse otsimise haptika on keelatud + Täpse otsingu hääled on lubatud + Keela otsimise tagasivõtmise haptika + Otsimise tagasivõtmise haptika on keelatud + Otsimise tagasivõtmise haptika on lubatud + Keela suumimise hääled + Suumi haptika on keelatud + Suumi haptika on lubatud + + + Kui sa hiljuti muutsid oma konto sisselogimisandmeid, siis eemalda ja installeeri MicroG uuesti. + + + Ümbersuunamiste URL-id mööda minna + Ümbersuunamiste URL-id mööda minnakse + Ümbersuunamiste URL-id ei mööda minnakse + + + Ava lingid brauseris + Linkide avamine välises brauseris + Linkide avamine rakendusesiseses brauseris + + + + Automaatne + Määle video kvaliteedi muudatused meelde + Kvaliteedi muudatused kehtivad kõigile videotele + Kvaliteedi muudatused kehtivad ainult praegusele videole + Näita teavitust videokvaliteedi muutumisel + Teavitus kuvatakse, kui vaikevideokvaliteeti muudetakse + Teavitust ei kuvata, kui vaikevideokvaliteeti muudetakse + Vaikimisi video kvaliteet Wi-Fi võrgus + Vaikimisi video kvaliteet mobiilsidevõrgus + Jäta meelde Shorts\'i kvaliteedimuudatused + Kvaliteedimuudatused kehtivad kõigile videotele Shorts + Kvaliteedimuudatused kehtivad ainult praegusele videole Short + Vaikimisi [Shorts] kvaliteet WiFi võrgus + Vaikimisi [Shorts] kvaliteet mobiilivõrgus + mobiil + WiFi + Vaikimisi %1$s kvaliteet muudeti: %2$s + Muudetud Shorts %1$s kvaliteet: %2$s + + + Kuva kiiruse dialoogi nupp + Kiiruse dialoogi nupp on nähtaval. Puudutage pikalt, et taasesituskiirus vaikeseadeks lähtestada + Kiiruse dialoogi nupp pole nähtaval + + + Näita video kvaliteedi nuppu + Video kvaliteedi nupp on nähtaval. Kvaliteedi lähtestamiseks vaikeseadeteks puudutage ja hoidke + Video kvaliteedi nupp pole nähtaval + + + Kohandatud taasesituse kiiruse menüü + Kohandatud kiiruse menüü kuvatakse + Kohandatud kiiruse menüüd ei kuvata + Taasta vana taasesituse kiiruse menüü + Kuvatakse vana kiiruse menüü + Kuvatakse kaasaegne kiiruse menüü + Kohandatud taasesituse kiirused + Lisa või muuda kohandatud taasesituse kiirusi + Kohandatud kiirused peavad olema alla %s + Kehtetud kohandatud video taasesituse kiirused + Automaatne + Kohandatud puuduta ja hoia kiiruse tase + Taasesituse kiirus vahemikus 0-8 + + + Määle taasesituse kiiruse muudatused meelde + Taasesituse kiiruse muudatused kehtivad kõigile videotele + Taasesituse kiiruse muudatused kehtivad ainult praegusele videole + Näita teavitust taasesituskiiruse muutumisel + Teavitus kuvatakse, kui vaike-esituskiirust muudetakse + Teavitust ei kuvata, kui vaike taasesituskiirust muudetakse. + Vaikimisi taasesituse kiirus + Vaikimisi kiirus muudeti: %s + + + Keela HDR video + HDR video on keelatud + HDR video on lubatud + Sunni AVC (H.264) + Videokodek sunnitakse AVC-le (H.264) + Videokodek määratakse automaatselt + "Eelised: • Võib parandada aku eluiga • Saab taastada puuduvad videolahendused vanematel seadmetel @@ -1643,179 +1640,178 @@ Piirangud: • Video taasesitus kasutab rohkem internetiandmeid kui VP9 või AV1 • HDR-videod ei kasuta AVC-d • Mõned seadmed ei saa AVC-d sundida" - - - Kuva täiustatud video kvaliteedi menüü - Täiustatud video kvaliteedi menüü on kuvatud - Täiustatud video kvaliteedi menüü ei ole kuvatud - - - Luba libistamine otsimiseks - Libistamine otsimiseks on lubatud - Libistamine otsimiseks on keelatud - - - Luba Android VR AV1 - "Videokodek on AVC (H.264), VP9 või AV1 + + + Kuva täiustatud video kvaliteedi menüü + Täiustatud video kvaliteedi menüü on kuvatud + Täiustatud video kvaliteedi menüü ei ole kuvatud + + + Luba libistamine otsimiseks + Libistamine otsimiseks on lubatud + Libistamine otsimiseks on keelatud + + + Luba Android VR AV1 + "Videokodek on AVC (H.264), VP9 või AV1 Taasesitus võib hakata kokutama või kaotada kaadreid" - Videokodek on AVC (H.264) või VP9 - "Selle seade lubamine võib kasutada tarkvara AV1 dekodeerimist. + Videokodek on AVC (H.264) või VP9 + "Selle seade lubamine võib kasutada tarkvara AV1 dekodeerimist. AV1-ga videotaasesitus võib hakitud olla või kaadreid vahele jätta." - Võltsimise kõrvalmõjud - • Eksperimentaalne klient ja võib igal ajal töötamast lakata - • Video võib peatuda kell 1:00 või ei pruugi olla teatud piirkondades saadaval - • Heliraja menüü puudub - • Puuduv AV1 videokoodek - • Stabiilne helitugevus pole saadaval - • Video lastele ei pruugi taasesitada, kui olete välja logitud või inkognito režiimis - - • Sunni algne heli pole saadaval - Kuva statistikas \"Nerdide jaoks\" - Klienditüüp on statistikas \"Nerdide jaoks\" nähtav - Klient on statistikas \"Nerdide jaoks\" peidetud - - - - - - - Teave - Reklaamid - Üldine - Mängija - Muu - - - Peida videoreklaamid - Videoreklaamid on peidetud - Videoreklaamid on nähtaval - - - Luba püsiv kordus - Püsiv kordus on lubatud - Püsiv kordus on keelatud - - - Peida edastusnupp - Edastusnupp on peidetud - Edastusnupp on nähtav - Peida ajaloo nupp - Ajaloo nupp on peidetud - Ajaloo nupp on nähtaval - Peida teavituse nupp - Teavituse nupp on peidetud - Teavituse nupp on nähtav - Peida otsingunupp - Otsingunupp on peidetud - Otsingunupp on nähtav - - - Peida kategooriariba - Kategooriariba on peidetud - Kategooriariba on nähtaval - - - Muuda minipleieri värvi - Minipleieri värv ühtib täisekraanipleieri omaga - Minipleier kasutab vaikevärvi - - - Navigeerimisriba - Peida või muuda navigeerimisriba nuppe - - Peida Avaleht - Avalehe nupp on peidetud - Avalehe nupp on nähtav - - Peida Näidised - Näidiste nupp on peidetud - Näidiste nupp on nähtav - - Peida Avasta - Avasta nupp on peidetud - Avasta nupp on nähtav - - Peida Kogu - Kogu nupp on peidetud - Kogu nupp on nähtav - - Peida Uuenda - Uuenda nupp on peidetud - Uuenda nupp on nähtav - Peida navigeerimisriba - Navigeerimisriba on peidetud - Navigeerimisriba on nähtav - Peida navigeerimisnuppude sildid - Sildid on peidetud - Sildid on nähtavale toodud - - - Peida sildike \"Hangi Music Premium\" - Silt on peidetud - Silt on nähtaval - - - Peida uuendamise nupp - Nupp on peidetud - Nupp on nähtaval - - - - - Blokeeri helireklaamid - Helireklaamid on blokeeritud - Helireklaamid on avatud - - - %s pole saadaval, reklaamid võivad kuvada. Proovige muuta reklaamiblokeerimise teenust seadetes. - %s tagastas vea, reklaamid võivad kuvada. Proovige muuta reklaamiblokeerimise teenust seadetes. - Blokeeri videoreklaamid videotes - Väljas - Luminous proksi - PurpleAdBlock proksi - - - Blokeeri videoreklaamid - Videoreklaamid on blokeeritud - Videoreklaamid on avatud - - - Sõnum kustutatud - Näita kustutatud sõnumeid - Ära näita kustutatud sõnumeid - Peida kustutatud sõnumid spoileri taha - Näita kustutatud sõnumeid läbistatud tekstina - - - Nõua Kanalipunkte automaatselt - Kanalipunkte nõutakse automaatselt - Kanalipunkte ei nõuta automaatselt - - - - Luba Twitchi debug režiim - Twitchi debug režiim on lubatud (ei ole soovitatav) - Twitchi debug režiim on keelatud - - - ReVancedi seaded - Teave - ReVancedi kohta - Reklaamide blokeerimine - Reklaamide blokeerimise sätted - Vestlus - Vestusette seaded - Muu - Mitmesugused seaded - Üldseaded - Muud seaded - Kliendipoolsed reklaamid - Serveripoolsed surestream reklaamid - Debug logi - Debug logid on lubatud - Debug logid on keelatud - - + Võltsimise kõrvalmõjud + • Eksperimentaalne klient ja võib igal ajal töötamast lakata + • Video võib peatuda kell 1:00 või ei pruugi olla teatud piirkondades saadaval + • Heliraja menüü puudub + • Puuduv AV1 videokoodek + • Stabiilne helitugevus pole saadaval + • Video lastele ei pruugi taasesitada, kui olete välja logitud või inkognito režiimis + + • Sunni algne heli pole saadaval + Kuva statistikas \"Nerdide jaoks\" + Klienditüüp on statistikas \"Nerdide jaoks\" nähtav + Klient on statistikas \"Nerdide jaoks\" peidetud + + + + + + Teave + Reklaamid + Üldine + Mängija + Muu + + + Peida videoreklaamid + Videoreklaamid on peidetud + Videoreklaamid on nähtaval + + + Luba püsiv kordus + Püsiv kordus on lubatud + Püsiv kordus on keelatud + + + Peida edastusnupp + Edastusnupp on peidetud + Edastusnupp on nähtav + Peida ajaloo nupp + Ajaloo nupp on peidetud + Ajaloo nupp on nähtaval + Peida teavituse nupp + Teavituse nupp on peidetud + Teavituse nupp on nähtav + Peida otsingunupp + Otsingunupp on peidetud + Otsingunupp on nähtav + + + Peida kategooriariba + Kategooriariba on peidetud + Kategooriariba on nähtaval + + + Muuda minipleieri värvi + Minipleieri värv ühtib täisekraanipleieri omaga + Minipleier kasutab vaikevärvi + + + Navigeerimisriba + Peida või muuda navigeerimisriba nuppe + + Peida Avaleht + Avalehe nupp on peidetud + Avalehe nupp on nähtav + + Peida Näidised + Näidiste nupp on peidetud + Näidiste nupp on nähtav + + Peida Avasta + Avasta nupp on peidetud + Avasta nupp on nähtav + + Peida Kogu + Kogu nupp on peidetud + Kogu nupp on nähtav + + Peida Uuenda + Uuenda nupp on peidetud + Uuenda nupp on nähtav + Peida navigeerimisriba + Navigeerimisriba on peidetud + Navigeerimisriba on nähtav + Peida navigeerimisnuppude sildid + Sildid on peidetud + Sildid on nähtavale toodud + + + Peida sildike \"Hangi Music Premium\" + Silt on peidetud + Silt on nähtaval + + + Peida uuendamise nupp + Nupp on peidetud + Nupp on nähtaval + + + + + Blokeeri helireklaamid + Helireklaamid on blokeeritud + Helireklaamid on avatud + + + %s pole saadaval, reklaamid võivad kuvada. Proovige muuta reklaamiblokeerimise teenust seadetes. + %s tagastas vea, reklaamid võivad kuvada. Proovige muuta reklaamiblokeerimise teenust seadetes. + Blokeeri videoreklaamid videotes + Väljas + Luminous proksi + PurpleAdBlock proksi + + + Blokeeri videoreklaamid + Videoreklaamid on blokeeritud + Videoreklaamid on avatud + + + Sõnum kustutatud + Näita kustutatud sõnumeid + Ära näita kustutatud sõnumeid + Peida kustutatud sõnumid spoileri taha + Näita kustutatud sõnumeid läbistatud tekstina + + + Nõua Kanalipunkte automaatselt + Kanalipunkte nõutakse automaatselt + Kanalipunkte ei nõuta automaatselt + + + + Luba Twitchi debug režiim + Twitchi debug režiim on lubatud (ei ole soovitatav) + Twitchi debug režiim on keelatud + + + ReVancedi seaded + Teave + ReVancedi kohta + Reklaamide blokeerimine + Reklaamide blokeerimise sätted + Vestlus + Vestusette seaded + Muu + Mitmesugused seaded + Üldseaded + Muud seaded + Kliendipoolsed reklaamid + Serveripoolsed surestream reklaamid + Debug logi + Debug logid on lubatud + Debug logid on keelatud + + diff --git a/patches/src/main/resources/addresources/values-eu-rES/strings.xml b/patches/src/main/resources/addresources/values-eu-rES/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-eu-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-eu-rES/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml index 783a055c43..4828816296 100644 --- a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml +++ b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml @@ -17,351 +17,283 @@ "First 'item' text Second \"item\" text" ---> - - - - نام برنامه - - آیکون برنامه - - - - - بررسی ناموفق بود - رفتن به وبسایت رسمی - نادیده بگیر - <h5>به نظر نمی‌رسد این برنامه توسط شما وصله شده باشد.</h5><br>این برنامه ممکن است به درستی کار نکند، <b>ممکن است استفاده از آن مضر یا حتی خطرناک باشد</b>.<br><بر>این برنامه از قبل دریافت شده است یا این چک از قبل دریافت شده است else:<br><br><small>%1$s</small><br>اکیداً توصیه می‌شود که <b>این برنامه را حذف نصب کنید و خودتان آن را وصله کنید</b> برای اطمینان از اینکه از یک برنامه معتبر و ایمن استفاده می‌کنید.<p><br>اگر نادیده گرفته شود، این هشدار فقط دو بار نشان داده می‌شود. - روی دستگاه دیگری وصله شده است - به وسیله ReVanced Manager نصب نشده است - بیشتر از ۱۰ دقیقه پیش وصله شده است - %s روز پیش وصله شده است - تاریخ ایجاد APK مخدوش شده است - - - - - تنظیمات - بازنشانی - راه‌اندازی مجدد - واردکردن - رونوشت‌ - بازگرداندن تنظیمات ReVanced به پیش‌فرض - %d تنظیمات وارد شدند - واردکردن انجام نشد: %s - تنظیمات جستجو - نتایجی برای %s یافت نشد - کلیدواژه دیگری را امتحان کنید - حذف از تاریخچه جستجو؟ - تاریخچه جستجو خالی است - نمایش تاریخچه جستجوی تنظیمات - نمایش آیکون تنظیمات ReVanced - نمادهای تنظیمات نشان داده می‌شوند - نمادهای تنظیمات نمایش داده نمی شوند - زبان ReVanced - زبان برنامه - وارد کردن/صادر کردن - وارد کردن / صادر کردن تنظیمات ReVanced - - شما درحال استفاده از نسخه <i>%s</i> از پچ Revanced هستید - توجه - لینک‌های رسمی - + + + نام برنامه + + آیکون برنامه + + + + + بررسی ناموفق بود + رفتن به وبسایت رسمی + نادیده بگیر + <h5>به نظر نمی‌رسد این برنامه توسط شما وصله شده باشد.</h5><br>این برنامه ممکن است به درستی کار نکند، <b>ممکن است استفاده از آن مضر یا حتی خطرناک باشد</b>.<br><بر>این برنامه از قبل دریافت شده است یا این چک از قبل دریافت شده است else:<br><br><small>%1$s</small><br>اکیداً توصیه می‌شود که <b>این برنامه را حذف نصب کنید و خودتان آن را وصله کنید</b> برای اطمینان از اینکه از یک برنامه معتبر و ایمن استفاده می‌کنید.<p><br>اگر نادیده گرفته شود، این هشدار فقط دو بار نشان داده می‌شود. + روی دستگاه دیگری وصله شده است + به وسیله ReVanced Manager نصب نشده است + بیشتر از ۱۰ دقیقه پیش وصله شده است + %s روز پیش وصله شده است + تاریخ ایجاد APK مخدوش شده است + + + + تنظیمات + بازنشانی + راه‌اندازی مجدد + واردکردن + رونوشت‌ + بازگرداندن تنظیمات ReVanced به پیش‌فرض + %d تنظیمات وارد شدند + واردکردن انجام نشد: %s + تنظیمات جستجو + نتایجی برای %s یافت نشد + کلیدواژه دیگری را امتحان کنید + حذف از تاریخچه جستجو؟ + تاریخچه جستجو خالی است + نمایش تاریخچه جستجوی تنظیمات + نمایش آیکون تنظیمات ReVanced + نمادهای تنظیمات نشان داده می‌شوند + نمادهای تنظیمات نمایش داده نمی شوند + زبان ReVanced + زبان برنامه + وارد کردن/صادر کردن + وارد کردن / صادر کردن تنظیمات ReVanced + + شما درحال استفاده از نسخه <i>%s</i> از پچ Revanced هستید + توجه + لینک‌های رسمی + - - - - MicroG GmsCore نصب نشده است. آنرا نصب کنید. - اقدام لازم است - باز کردن تارنما - ادامه - - - - - - - - عیب‌یابی - فعال یا غیرفعال کردن گزینه‌های عیب یابی - گزارش عیب - لاگ عیب فعال است - لاگ عیب غیرفعال است - - - - - - - - - - درباره - عمومی - اجراکننده - نوار جریان پخش - ويدئو - - - - - + MicroG GmsCore نصب نشده است. آنرا نصب کنید. + اقدام لازم است + باز کردن تارنما + ادامه + + + + + + + عیب‌یابی + فعال یا غیرفعال کردن گزینه‌های عیب یابی + گزارش عیب + لاگ عیب فعال است + لاگ عیب غیرفعال است + + + + + + + + + درباره + عمومی + اجراکننده + نوار جریان پخش + ويدئو + + + + - - پنهان سازی دکمه \'نمایش بیشتر\' - پنهان سازی قفسه بلیط - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - عمومی - رونوشت‌ - - - - درباره - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - درباره - گزارش عیب - لاگ عیب فعال است - لاگ عیب غیرفعال است - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + عمومی + رونوشت‌ + + + + درباره + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + درباره + گزارش عیب + لاگ عیب فعال است + لاگ عیب غیرفعال است + + diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index b68cf5dad7..3778c5a71e 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -17,1273 +17,1272 @@ "First 'item' text Second \"item\" text" ---> - - - - Sovelluksen nimi - - Mukautettu - Sovelluskuvake - Alkuperäinen - ReVanced - - ReVanced, minimaalinen - ReVanced, skaalattu - - Mukautettu - - - Tarkastuksia epäonnistui - Avaa virallinen sivusto - Ohita - <h5>Tämä sovellus ei näytä olevan sinun paikkaamasi.</h5><br>Tämä sovellus ei ehkä toimi oikein, <b>voi olla haitallinen tai jopa vaarallinen käyttää</b>.<br><br>Nämä tarkastukset viittaavat siihen, että tämä sovellus on valmiiksi paikattu tai saatu joltakulta muulta:<br><br><small>%1$s</small><br>On erittäin suositeltavaa, että <b>poistat tämän sovelluksen ja paikkaat sen itse</b> varmistaaksesi, että käytät tarkistettua ja turvallista sovellusta.<p><br>Jos tämä varoitus jätetään huomiotta, se näytetään vain kahdesti. - Paikattu toisella laitteella - Ei ReVanced Managerin asentama - Paikattu yli 10 minuuttia sitten - Paikattu %s päivää sitten - APK käännöspäivä on vioittunut - - - ReVanced-ilmoitus - Kellon historiaa ei tallenneta.<br><br>Tämä todennäköisesti johtuu DNS mainosten estäjä tai verkkovälityspalvelin.<br><br>Korjataksesi tämän, valkoiselle listalle <b>s.youtube.com</b> tai poistaaksesi kaikki DNS-estäjät ja -profiilit. - Älä näytä uudelleen - - - Asetukset - ReVanced - Haluatko varmasti jatkaa? - Tallenna - Nollaa - Nollaa väri - Virheellinen väri - Uudelleenkäynnistys vaaditaan - Käynnistä sovellus uudelleen, jotta muutos tulee voimaan. - Käynnistä uudelleen - Tuo - Kopioi - Revanced-asetukset nollattiin - %d asetusta tuotiin - Tuonti epäonnistui: %s - Hae asetuksista - Tuloksia ei löytynyt haulle \"%s\" - Kokeile toista hakusanaa - Viimeisimmät haut - Poistetaanko hakuhistoriasta? - Tyhjennä hakuhistoria - Haluatko varmasti tyhjentää kaiken hakuhistorian? - Hakuvinkit - "• Napauta polkua siirtyäksesi siihen +--> + + + Sovelluksen nimi + + Mukautettu + Sovelluskuvake + Alkuperäinen + ReVanced + + ReVanced, minimaalinen + ReVanced, skaalattu + + Mukautettu + + + Tarkastuksia epäonnistui + Avaa virallinen sivusto + Ohita + <h5>Tämä sovellus ei näytä olevan sinun paikkaamasi.</h5><br>Tämä sovellus ei ehkä toimi oikein, <b>voi olla haitallinen tai jopa vaarallinen käyttää</b>.<br><br>Nämä tarkastukset viittaavat siihen, että tämä sovellus on valmiiksi paikattu tai saatu joltakulta muulta:<br><br><small>%1$s</small><br>On erittäin suositeltavaa, että <b>poistat tämän sovelluksen ja paikkaat sen itse</b> varmistaaksesi, että käytät tarkistettua ja turvallista sovellusta.<p><br>Jos tämä varoitus jätetään huomiotta, se näytetään vain kahdesti. + Paikattu toisella laitteella + Ei ReVanced Managerin asentama + Paikattu yli 10 minuuttia sitten + Paikattu %s päivää sitten + APK käännöspäivä on vioittunut + + + ReVanced-ilmoitus + Kellon historiaa ei tallenneta.<br><br>Tämä todennäköisesti johtuu DNS mainosten estäjä tai verkkovälityspalvelin.<br><br>Korjataksesi tämän, valkoiselle listalle <b>s.youtube.com</b> tai poistaaksesi kaikki DNS-estäjät ja -profiilit. + Älä näytä uudelleen + + + Asetukset + ReVanced + Haluatko varmasti jatkaa? + Tallenna + Nollaa + Nollaa väri + Virheellinen väri + Uudelleenkäynnistys vaaditaan + Käynnistä sovellus uudelleen, jotta muutos tulee voimaan. + Käynnistä uudelleen + Tuo + Kopioi + Revanced-asetukset nollattiin + %d asetusta tuotiin + Tuonti epäonnistui: %s + Hae asetuksista + Tuloksia ei löytynyt haulle \"%s\" + Kokeile toista hakusanaa + Viimeisimmät haut + Poistetaanko hakuhistoriasta? + Tyhjennä hakuhistoria + Haluatko varmasti tyhjentää kaiken hakuhistorian? + Hakuvinkit + "• Napauta polkua siirtyäksesi siihen • Pidä asetusta painettuna siirtyäksesi siihen • Paina Enter-näppäintä tallentaaksesi hakukyselyn historiaan • Haku ei huomioi kirjainkokoa eikä välimerkkejä • Ylätason asetukset näkyvät käytöstä poistettujen ala-asetusten yläpuolella" - Hakuhistoria on tyhjä - Tallennaaksesi hakuhistorian, kirjoita hakukysely ja paina Enter-näppäintä - Näytä asetusten hakuhistoria - Asetusten hakuhistoria näytetään - Asetusten hakuhistoriaa ei näytetä - Näytä ReVanced-asetuskuvakkeet - Asetuskuvakkeet näytetään - Asetuskuvakkeita ei näytetä - ReVancedin kieli - "Joidenkin kielten käännökset saattavat puuttua tai olla puutteellisia. + Hakuhistoria on tyhjä + Tallennaaksesi hakuhistorian, kirjoita hakukysely ja paina Enter-näppäintä + Näytä asetusten hakuhistoria + Asetusten hakuhistoria näytetään + Asetusten hakuhistoriaa ei näytetä + Näytä ReVanced-asetuskuvakkeet + Asetuskuvakkeet näytetään + Asetuskuvakkeita ei näytetä + ReVancedin kieli + "Joidenkin kielten käännökset saattavat puuttua tai olla puutteellisia. Kääntääksesi uusia kieliä tai parantaaksesi olemassa olevia käännöksiä, vieraile osoitteessa translate.revanced.app" - Sovelluksen kieli - Tuonti/vienti - Tuo/vie ReVanced-asetukset - - Käytät ReVanced Patchesin versiota <i>%s</i> - Huomautus - Tämä versio on ennakkojulkaisuversio, joten voit kokea odottamattomia ongelmia - Viralliset linkit - + Käytät ReVanced Patchesin versiota <i>%s</i> + Huomautus + Tämä versio on ennakkojulkaisuversio, joten voit kokea odottamattomia ongelmia + Viralliset linkit + - - - GmsCore-asetukset - GmsCoren asetukset - - MicroG GmsCorea ei ole asennettu. Asenna se. - Vaatii toimenpiteitä - "MicroG GmsCorella ei ole lupaa pysyä käynnissä taustalla. + + + GmsCore-asetukset + GmsCoren asetukset + + MicroG GmsCorea ei ole asennettu. Asenna se. + Vaatii toimenpiteitä + "MicroG GmsCorella ei ole lupaa pysyä käynnissä taustalla. Seuraa puhelimeesi sopivaa \"Don't kill my app\" -opasta ja sovella sen ohjeita MicroG-asennukseesi. Tämä on välttämätöntä sovelluksen toiminnalle." - Avaa verkkosivusto - "MicroG GmsCoren akun optimoinnit on poistettava käytöstä ongelmien välttämiseksi. + Avaa verkkosivusto + "MicroG GmsCoren akun optimoinnit on poistettava käytöstä ongelmien välttämiseksi. MicroG:n akun optimointien poistaminen käytöstä ei vaikuta akun käyttöön negatiivisesti. Napauta jatka-painiketta ja salli optimoinnin muutokset." - Jatka - - - Naamioi videovirrat - Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi - Naamioi videovirrat - Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi - Naamioi videovirrat - "Videovirrat on naamioitu + Jatka + + + Naamioi videovirrat + Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi + Naamioi videovirrat + Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi + Naamioi videovirrat + "Videovirrat on naamioitu Jos olet YouTube Premium -käyttäjä, tätä asetusta ei välttämättä tarvita" - "Videovirtoja ei naamioida + "Videovirtoja ei naamioida Toisto ei välttämättä toimi" - Tämän asetuksen poistaminen käytöstä voi aiheuttaa toisto-ongelmia. - Oletusasiakasohjelma - - - Pakota alkuperäinen äänen kieli - Käytetään alkuperäistä ääntä - Käytetään oletusääntä - - Käyttääksesi tätä ominaisuutta, muuta \"Naamioi videovirrat\" mihin tahansa asiakasohjelmaan paitsi Android Studioon - - - Virheenkorjaus - Ota tai poista virheenkorjausasetukset käytöstä - Virheenkorjauksen kirjaaminen - Virheenkorjauslokit ovat käytössä - Virheenkorjauslokit eivät ole käytössä - Loki pinojäljet - Vianetsintälokit sisältävät pinojäljet - Vianetsintälokit eivät sisällä pinojälkiä - Näytä ponnahdusilmoitus ReVanced-virheen tapahtuessa - Ponnahdusilmoitus näytetään virheen tapahtuessa - Ponnahdusilmoitusta ei näytetä virheen tapahtuessa - "Virheilmoitusten poistaminen käytöstä piilottaa kaikki ReVancedin virheilmoitukset. + Tämän asetuksen poistaminen käytöstä voi aiheuttaa toisto-ongelmia. + Oletusasiakasohjelma + + + Pakota alkuperäinen äänen kieli + Käytetään alkuperäistä ääntä + Käytetään oletusääntä + + Käyttääksesi tätä ominaisuutta, muuta \"Naamioi videovirrat\" mihin tahansa asiakasohjelmaan paitsi Android Studioon + + + Virheenkorjaus + Ota tai poista virheenkorjausasetukset käytöstä + Virheenkorjauksen kirjaaminen + Virheenkorjauslokit ovat käytössä + Virheenkorjauslokit eivät ole käytössä + Loki pinojäljet + Vianetsintälokit sisältävät pinojäljet + Vianetsintälokit eivät sisällä pinojälkiä + Näytä ponnahdusilmoitus ReVanced-virheen tapahtuessa + Ponnahdusilmoitus näytetään virheen tapahtuessa + Ponnahdusilmoitusta ei näytetä virheen tapahtuessa + "Virheilmoitusten poistaminen käytöstä piilottaa kaikki ReVancedin virheilmoitukset. Et saa ilmoituksia odottamattomista tapahtumista." - Vie virheenkorjauslokit - Kopioi ReVancedin virheenkorjauslokit leikepöydälle - Virheenkorjausloki ei ole käytössä - Lokeja ei löytynyt - Lokit kopioitu - Lokien vienti epäonnistui: %s - Tyhjennä virheenkorjauslokit - Tyhjentää kaikki tallennetut ReVanced-virheenkorjauslokit - Lokit tyhjennetty - Ominaisuuslippujen hallinta - Hallitse totuusarvo-ominaisuuslippuja - Aktiiviset liput (%d) - Estetyt liput (%d) - Hae lippuja... - Liput tallennettu - Liput nollattu - Liput kopioitu leikepöydälle - Kirjaa protokollapuskuri - Virheenkorjauslokit sisältävät proto-puskurin - Virheenkorjauslokit eivät sisällä proto-puskuria - "Tämän asetuksen käyttöönotto kirjaa lisätietoja asettelusta, mm. joidenkin käyttöliittymän osien näyttötekstiä. + Vie virheenkorjauslokit + Kopioi ReVancedin virheenkorjauslokit leikepöydälle + Virheenkorjausloki ei ole käytössä + Lokeja ei löytynyt + Lokit kopioitu + Lokien vienti epäonnistui: %s + Tyhjennä virheenkorjauslokit + Tyhjentää kaikki tallennetut ReVanced-virheenkorjauslokit + Lokit tyhjennetty + Ominaisuuslippujen hallinta + Hallitse totuusarvo-ominaisuuslippuja + Aktiiviset liput (%d) + Estetyt liput (%d) + Hae lippuja... + Liput tallennettu + Liput nollattu + Liput kopioitu leikepöydälle + Kirjaa protokollapuskuri + Virheenkorjauslokit sisältävät proto-puskurin + Virheenkorjauslokit eivät sisällä proto-puskuria + "Tämän asetuksen käyttöönotto kirjaa lisätietoja asettelusta, mm. joidenkin käyttöliittymän osien näyttötekstiä. Tämä voi auttaa komponenttien tunnistamisessa, kun luot mukautettuja suodattimia. Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoitteesi." - - - Puhdista jakamislinkit - Seurantakyselyparametrit poistetaan jaetuista linkeistä - Seurantakyselyparametrejä ei poisteta jaetuista linkeistä - Muuta jakolinkit youtube.com-sivustoksi - Jaetut linkit käyttävät youtube.com-sivustoa - Jaetut linkit käyttävät music.youtube.com-sivustoa - - - Mukautettu suodatin - Piilota osia mukautetuilla suodattimilla - Ota mukautettu suodatin käyttöön - Mukautettu suodatin on käytössä - Mukautettu suodatin ei ole käytössä - Mukautettu suodatin - - Luettelo komponentin polun rakentajan merkkijonoista suodatettavaksi uudella rivillä erotettuna - Virheellinen mukautettu suodatin: %s - - - - - Tietoja - Mainokset - Vaihtoehtoiset pikkukuvat - Syöte - Yleiset - Soitin - Shorts - Etenemispalkki - Pyyhkäisyohjaus - Return YouTube Dislike - Sekalaiset - Video - Palauta vanhat asetusvalikot - Vanhat asetusvalikot näytetään - Vanhoja asetusvalikoita ei näytetä - - - Poista Shortsien taustatoisto käytöstä - Shortsien taustatoisto ei ole käytössä - Shortsien taustatoisto on käytössä - - - Piilota albumikortit - Albumikortit piilotetaan - Albumikortit näytetään - Piilota artistikortit - Artistikortit piilotetaan - Artistikortit näytetään - Piilota siruhylly - Siruhylly piilotetaan - Siruhylly näytetään - Piilota yhteisöpostaukset - Yhteisöpostaukset piilotetaan - Yhteisöpostaukset näytetään - Piilota kompaktit bannerit - Kompaktit bannerit piilotetaan - Kompaktit bannerit näytetään - Piilota laajennettava kortti - Laajennettava kortti videoiden alla piilotetaan - Laajennettava kortti näytetään videoiden alla - Piilota kelluva mikrofonipainike - Kelluva mikrofonipainike piilotetaan haussa - Kelluva mikrofonipainike näytetään haussa - Piilota vaakasuuntaiset hyllyt - "Vaakahyllyt piilotetaan: + + + Puhdista jakamislinkit + Seurantakyselyparametrit poistetaan jaetuista linkeistä + Seurantakyselyparametrejä ei poisteta jaetuista linkeistä + Muuta jakolinkit youtube.com-sivustoksi + Jaetut linkit käyttävät youtube.com-sivustoa + Jaetut linkit käyttävät music.youtube.com-sivustoa + + + Mukautettu suodatin + Piilota osia mukautetuilla suodattimilla + Ota mukautettu suodatin käyttöön + Mukautettu suodatin on käytössä + Mukautettu suodatin ei ole käytössä + Mukautettu suodatin + + Luettelo komponentin polun rakentajan merkkijonoista suodatettavaksi uudella rivillä erotettuna + Virheellinen mukautettu suodatin: %s + + + + + Tietoja + Mainokset + Vaihtoehtoiset pikkukuvat + Syöte + Yleiset + Soitin + Shorts + Etenemispalkki + Pyyhkäisyohjaus + Return YouTube Dislike + Sekalaiset + Video + Palauta vanhat asetusvalikot + Vanhat asetusvalikot näytetään + Vanhoja asetusvalikoita ei näytetä + + + Poista Shortsien taustatoisto käytöstä + Shortsien taustatoisto ei ole käytössä + Shortsien taustatoisto on käytössä + + + Piilota albumikortit + Albumikortit piilotetaan + Albumikortit näytetään + Piilota artistikortit + Artistikortit piilotetaan + Artistikortit näytetään + Piilota siruhylly + Siruhylly piilotetaan + Siruhylly näytetään + Piilota yhteisöpostaukset + Yhteisöpostaukset piilotetaan + Yhteisöpostaukset näytetään + Piilota kompaktit bannerit + Kompaktit bannerit piilotetaan + Kompaktit bannerit näytetään + Piilota laajennettava kortti + Laajennettava kortti videoiden alla piilotetaan + Laajennettava kortti näytetään videoiden alla + Piilota kelluva mikrofonipainike + Kelluva mikrofonipainike piilotetaan haussa + Kelluva mikrofonipainike näytetään haussa + Piilota vaakasuuntaiset hyllyt + "Vaakahyllyt piilotetaan: • Tuoreimmat uutiset • Jatka katselua • Tutustu muihin kanaviin • Osuvimmat • Ostokset • Katso uudelleen" - Vaakasuuntaiset hyllyt näytetään - Piilota kuvahylly - Kuvahylly piilotetaan\' hakutuloksissa - Kuvahylly näytetään hakutuloksissa - Piilota uusimmat postaukset - Uusimmat postaukset piilotetaan - Uusimmat postaukset näytetään - Piilota mix-soittolistat - Mix-soittolistat piilotetaan - Mix-soittolistat näytetään - Piilota elokuvat-osio - Elokuvat-osio piilotetaan - Elokuvat-osio näytetään - - Piilota \"Ilmoita minulle\" -painike - Ilmoita minulle -painike piilotetaan - Ilmoita minulle -painike näytetään - Piilota Pelattavat - Pelattavat piilotetaan - Pelattavat näytetään - - Piilota \"Näytä lisää\" -painike - Näytä lisää -painike piilotetaan hakutuloksissa - Näytä lisää -painike näytetään hakutuloksissa - Piilota kyselyt - Kyselyt piilotetaan - Kyselyt näytetään - Piilota lippuhylly - Lippuhylly piilotetaan - Lippuhylly näytetään - - Piilota videosuositusten tunnisteet - \'Ihmiset katsoivat myös\' ja \'Saatat myös pitää\' -tunnisteet piilotetaan hakutuloksissa - \"Ihmiset katsoivat myös\" ja \"Saatat myös pitää\" -otsikot näkyvät hakutuloksissa - Piilota visuaalinen väliosa - Visuaalinen väliosa on piilotettu - Visuaalinen väliosa on näkyvissä - - Piilota YouTube Doodlet - Logon YouTube Doodles -animaatio piilotetaan - Logon YouTube Doodles -animaatio näytetään - "YouTube Doodlet näkyvät muutamana päivänä vuodessa. + Piilota \"Näytä lisää\" -painike + Näytä lisää -painike piilotetaan hakutuloksissa + Näytä lisää -painike näytetään hakutuloksissa + Piilota kyselyt + Kyselyt piilotetaan + Kyselyt näytetään + Piilota lippuhylly + Lippuhylly piilotetaan + Lippuhylly näytetään + + Piilota videosuositusten tunnisteet + \'Ihmiset katsoivat myös\' ja \'Saatat myös pitää\' -tunnisteet piilotetaan hakutuloksissa + \"Ihmiset katsoivat myös\" ja \"Saatat myös pitää\" -otsikot näkyvät hakutuloksissa + Piilota visuaalinen väliosa + Visuaalinen väliosa on piilotettu + Visuaalinen väliosa on näkyvissä + + Piilota YouTube Doodlet + Logon YouTube Doodles -animaatio piilotetaan + Logon YouTube Doodles -animaatio näytetään + "YouTube Doodlet näkyvät muutamana päivänä vuodessa. Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käytössä, myös hakupalkin alla oleva suodatinpalkki piilotetaan." - Piilota kanavapalkki - Kanavapalkki piilotetaan - Kanavapalkki näytetään - Piilota kanavan vesileima - Vesileima piilotetaan - Vesileima näytetään - Piilota joukkorahoituslaatikko - Joukkorahoituslaatikko piilotetaan - Joukkorahoituslaatikko näytetään - Piilota hätätilannelaatikot - Hätätilannelaatikot piilotetaan - Hätätilannelaatikot näytetään - Piilota tietopaneelit - Tietopaneelit piilotetaan - Tietopaneelit näytetään - - Piilota Liity-painike - Liity-painike piilotetaan - Liity-painike näytetään - Piilota lääketieteelliset paneelit - Lääketieteelliset paneelit piilotetaan - Lääketieteelliset paneelit näytetään - Piilota pikatoiminnot - Pikatoiminnot piilotetaan kokoruututilassa - Pikatoiminnot näytetään kokoruututilassa - Piilota liittyvät videot - Liittyvät videot piilotetaan pikatoiminnoissa - Liittyvät videot näytetään pikatoiminnoissa - Piilota tilaajien säännöt - Tilaajien yhteisön säännöt piilotetaan - Tilaajien yhteisön säännöt näytetään - Piilota ajoitetut reaktiot - Ajoitetut reaktiot piilotetaan - Ajoitetut reaktiot näytetään - Piilota \"tekoälyn luoma videoyhteenveto\" - Tekoälyn luoma videon yhteenveto-osio piilotetaan - Tekoälyn luoma videon yhteenveto-osio näytetään - Piilota Ask - Ask-osio piilotetaan - Ask-osio näytetään - Piilota Määritteet - Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot piilotetaan - Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot näytetään - Piilota Videon osat - Videon osat -osio piilotetaan - Videon osat -osio näytetään - Piilota \"Miten sisältö on luotu\" - Miten sisältö on luotu -osio piilotetaan - Miten sisältö on luotu -osio näytetään - Piilota Hype-pisteet - Hype-pisteet piilotetaan - Hype-pisteet näytetään - Piilota \"Tutustu podcastiin\" - Tutustu podcastiin -osio piilotetaan - Tutustu podcastiin -osio näytetään - Piilota esitellyt linkit - Suositeltujen linkkien osio piilotetaan - Suositeltujen linkkien osio näytetään - Piilota suositellut videot - Suositeltujen videoiden osio piilotetaan - Suositeltujen videoiden osio näytetään - Piilota tietokortit - Infokortit-osio piilotetaan - Infokortit-osio näytetään - Piilota \"Keskeiset käsitteet\" - Keskeiset käsitteet -osio piilotetaan - Keskeiset käsitteet -osio näytetään - Piilota Tilaa-painike - Tilaa-painike piilotetaan - Tilaa-painike näytetään - Piilota transkriptio - Transkriptio-osio piilotetaan - Transkriptio-osio näytetään - Videon kuvaus - Piilota tai näytä videon kuvauksen osia - Suodatinpalkki - Piilota tai näytä suodatinpalkki syötteissä, liittyvissä videoissa, hakutuloksissa ja katseluhistoriassa - Piilota syötteissä - Piilotettu syötteissä - Näytetään syötteissä - Piilota liittyvissä videoissa - Piilotetaan liittyvissä videoissa - Näytetään liittyvissä videoissa - Piilota hakutuloksissa - Piilotetaan hakutuloksissa - Näytetään hakutuloksissa - Piilota katseluhistoriassa - Piilotettu katseluhistoriassa - Näytetään katseluhistoriassa - Kanavasivu - Piilota tai näytä kanavasivun osia - - Piilota yhteisöpainike - Yhteisö-painike piilotetaan - Yhteisö-painike näytetään - - Piilota \"\'Sinulle\" -hylly - Sinulle-hylly piilotetaan - Sinulle-hylly näytetään - - Piilota Liity-painike - Liity-painike piilotetaan - Liity-painike näytetään - Piilota linkkien esikatselu - Linkkien esikatselu piilotetaan - Linkkien esikatselu näytetään - Piilota jäsenet-hylly - Jäsenet-hylly piilotetaan - Jäsenet-hylly näytetään - - Piilota Kauppa-painike - Kauppa-painike piilotetaan - Kauppa-painike näytetään - - Piilota Tilaa-painike - Tilaa-painike piilotetaan - Tilaa-painike näytetään - Kommentit - Piilota tai näytä kommenttiosion osia - Piilota tekoälyn luoma chat-yhteenveto - Tekoälyn luoma chat-yhteenveto piilotetaan - Tekoälyn luoma chat-yhteenveto näytetään - Piilota tekoälyn luoma kommenttiyhteenveto - Tekoälyn luoma kommenttien yhteenveto piilotetaan - Tekoälyn luoma kommenttien yhteenveto näytetään - Piilota kanavan säännöt - Kanavan säännöt piilotetaan - Kanavan säännöt näytetään - Piilota \"Jäsenten kommentit\" -ylätunniste - Jäsenten kommentit -ylätunniste piilotetaan - Jäsenten kommentit -ylätunniste näytetään - Piilota kommenttiosio - Kommenttiosio piilotetaan - Kommenttiosio näytetään - Piilota yhteisön säännöt - Yhteisön säännöt piilotetaan - Yhteisön säännöt näytetään - Piilota \"Luo Shorts-video\" -painike - Luo Shorts-video -painike on piilotettu - Luo Shorts-video -painike näytetään - Piilota emoji- ja aikaleima-painikkeet - Emoji- ja aikaleima-painikkeet piilotetaan - Emoji- ja aikaleima-painikkeet näytetään - Piilota kommentin esikatselu - Kommentin esikatselu piilotetaan - Kommentin esikatselu näytetään - Piilota Kiitos-painike - Kiitos-painike piilotetaan - Kiitos-painike näytetään - Piilota katselukerrat - Katselukerrat piilotetaan syötteessä ja hakutuloksissa - Katselukerrat näytetään syötteessä ja hakutuloksissa - - "Rajoitukset: + Piilota Liity-painike + Liity-painike piilotetaan + Liity-painike näytetään + Piilota lääketieteelliset paneelit + Lääketieteelliset paneelit piilotetaan + Lääketieteelliset paneelit näytetään + Piilota pikatoiminnot + Pikatoiminnot piilotetaan kokoruututilassa + Pikatoiminnot näytetään kokoruututilassa + Piilota liittyvät videot + Liittyvät videot piilotetaan pikatoiminnoissa + Liittyvät videot näytetään pikatoiminnoissa + Piilota tilaajien säännöt + Tilaajien yhteisön säännöt piilotetaan + Tilaajien yhteisön säännöt näytetään + Piilota ajoitetut reaktiot + Ajoitetut reaktiot piilotetaan + Ajoitetut reaktiot näytetään + Piilota \"tekoälyn luoma videoyhteenveto\" + Tekoälyn luoma videon yhteenveto-osio piilotetaan + Tekoälyn luoma videon yhteenveto-osio näytetään + Piilota Ask + Ask-osio piilotetaan + Ask-osio näytetään + Piilota Määritteet + Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot piilotetaan + Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot näytetään + Piilota Videon osat + Videon osat -osio piilotetaan + Videon osat -osio näytetään + Piilota \"Miten sisältö on luotu\" + Miten sisältö on luotu -osio piilotetaan + Miten sisältö on luotu -osio näytetään + Piilota Hype-pisteet + Hype-pisteet piilotetaan + Hype-pisteet näytetään + Piilota \"Tutustu podcastiin\" + Tutustu podcastiin -osio piilotetaan + Tutustu podcastiin -osio näytetään + Piilota esitellyt linkit + Suositeltujen linkkien osio piilotetaan + Suositeltujen linkkien osio näytetään + Piilota suositellut videot + Suositeltujen videoiden osio piilotetaan + Suositeltujen videoiden osio näytetään + Piilota tietokortit + Infokortit-osio piilotetaan + Infokortit-osio näytetään + Piilota \"Keskeiset käsitteet\" + Keskeiset käsitteet -osio piilotetaan + Keskeiset käsitteet -osio näytetään + Piilota Tilaa-painike + Tilaa-painike piilotetaan + Tilaa-painike näytetään + Piilota transkriptio + Transkriptio-osio piilotetaan + Transkriptio-osio näytetään + Videon kuvaus + Piilota tai näytä videon kuvauksen osia + Suodatinpalkki + Piilota tai näytä suodatinpalkki syötteissä, liittyvissä videoissa, hakutuloksissa ja katseluhistoriassa + Piilota syötteissä + Piilotettu syötteissä + Näytetään syötteissä + Piilota liittyvissä videoissa + Piilotetaan liittyvissä videoissa + Näytetään liittyvissä videoissa + Piilota hakutuloksissa + Piilotetaan hakutuloksissa + Näytetään hakutuloksissa + Piilota katseluhistoriassa + Piilotettu katseluhistoriassa + Näytetään katseluhistoriassa + Kanavasivu + Piilota tai näytä kanavasivun osia + + Piilota yhteisöpainike + Yhteisö-painike piilotetaan + Yhteisö-painike näytetään + + Piilota \"\'Sinulle\" -hylly + Sinulle-hylly piilotetaan + Sinulle-hylly näytetään + + Piilota Liity-painike + Liity-painike piilotetaan + Liity-painike näytetään + Piilota linkkien esikatselu + Linkkien esikatselu piilotetaan + Linkkien esikatselu näytetään + Piilota jäsenet-hylly + Jäsenet-hylly piilotetaan + Jäsenet-hylly näytetään + + Piilota Kauppa-painike + Kauppa-painike piilotetaan + Kauppa-painike näytetään + + Piilota Tilaa-painike + Tilaa-painike piilotetaan + Tilaa-painike näytetään + Kommentit + Piilota tai näytä kommenttiosion osia + Piilota tekoälyn luoma chat-yhteenveto + Tekoälyn luoma chat-yhteenveto piilotetaan + Tekoälyn luoma chat-yhteenveto näytetään + Piilota tekoälyn luoma kommenttiyhteenveto + Tekoälyn luoma kommenttien yhteenveto piilotetaan + Tekoälyn luoma kommenttien yhteenveto näytetään + Piilota kanavan säännöt + Kanavan säännöt piilotetaan + Kanavan säännöt näytetään + Piilota \"Jäsenten kommentit\" -ylätunniste + Jäsenten kommentit -ylätunniste piilotetaan + Jäsenten kommentit -ylätunniste näytetään + Piilota kommenttiosio + Kommenttiosio piilotetaan + Kommenttiosio näytetään + Piilota yhteisön säännöt + Yhteisön säännöt piilotetaan + Yhteisön säännöt näytetään + Piilota \"Luo Shorts-video\" -painike + Luo Shorts-video -painike on piilotettu + Luo Shorts-video -painike näytetään + Piilota emoji- ja aikaleima-painikkeet + Emoji- ja aikaleima-painikkeet piilotetaan + Emoji- ja aikaleima-painikkeet näytetään + Piilota kommentin esikatselu + Kommentin esikatselu piilotetaan + Kommentin esikatselu näytetään + Piilota Kiitos-painike + Kiitos-painike piilotetaan + Kiitos-painike näytetään + Piilota katselukerrat + Katselukerrat piilotetaan syötteessä ja hakutuloksissa + Katselukerrat näytetään syötteessä ja hakutuloksissa + + "Rajoitukset: • Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää katselukertoja • Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa" - Piilota julkaisuaika - Julkaisuaika piilotetaan syötteessä ja hakutuloksissa - Julkaisuaika näytetään syötteessä ja hakutuloksissa - - "Rajoitukset: + Piilota julkaisuaika + Julkaisuaika piilotetaan syötteessä ja hakutuloksissa + Julkaisuaika näytetään syötteessä ja hakutuloksissa + + "Rajoitukset: • Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää julkaisuaikoja • Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa" - Piilota sisältöä avainsanojen mukaan - Piilota haku- ja syötevideoita avainsanasuodattimilla - Piilota koti-videoita avainsanojen mukaan - Koti-välilehden videoita suodatetaan avainsanojen mukaan - Koti-välilehden videoita ei suodateta avainsanojen mukaan - Piilota hakutuloksia avainsanojen mukaan - Hakutuloksia suodatetaan avainsanojen mukaan - Hakutuloksia ei suodateta avainsanojen mukaan - Piilota tilaukset-videoita avainsanojen mukaan - Tilaukset-välilehden videoita suodatetaan avainsanojen mukaan - Tilaukset-välilehden videoita ei suodateta avainsanojen mukaan - Piilotettavat avainsanat - - "Piilotettavat avainsanat ja lausekkeet, erotettuina rivinvaihdoilla + "Piilotettavat avainsanat ja lausekkeet, erotettuina rivinvaihdoilla Avainsanat voivat olla kanavanimiä tai mitä tahansa videootsikoissa näkyvää tekstiä Sana, jossa on isoja kirjaimia keskellä, on syötettävä samalla kirjainkokoisella (esim: iPhone, TikTok, LeBlanc)" - Tietoja avainsanoilla suodatuksesta - "Etusivu/Tilaus/Hakutulokset suodatetaan niin, että avainsanoja vastaava sisältö piilotetaan + Tietoja avainsanoilla suodatuksesta + "Etusivu/Tilaus/Hakutulokset suodatetaan niin, että avainsanoja vastaava sisältö piilotetaan Rajoitukset • Shorts-videoita ei voi piilottaa kanavan nimen perusteella • Joitain käyttöliittymän osia ei välttämättä piiloteta • Avainsanan haku ei välttämättä näytä tuloksia" - Täsmää koko sanaan - - Hakusanan/lauseen ympäröiminen kaksoislainauksilla estää videon oitsikoiden ja kanavien nimien osittaisia vastaavuuksia<br><br>Esimerkiksi,<br><b>\"ai\"</b> piilottaa videon: <b>How does AI work?</b><br>mutta ei piilota: <b>What does fair use mean?</b> - - Ei voi käyttää avainsanaa: %s - Lisää lainausmerkit käyttääksesi avainsanaa: %s - Avainsanalla on ristiriitaiset ilmoitukset: %s - Avainsana on liian lyhyt ja vaatii lainausmerkkejä: %s - Avainsana piilottaa kaikki videot: %s - - - Piilota sisällöntuottajan kauppahylly - Sisällöntuottajan kauppahylly piilotetaan videosoittimen alla - Sisällöntuottajan kauppahylly videosoittimen alla näytetään - Piilota loppunäytön kauppabanneri - Loppunäytön kauppabanneri piilotetaan - Loppunäytön kauppabanneri näytetään - Piilota koko näytön mainokset - "Koko näytön mainokset piilotetaan + Täsmää koko sanaan + + Hakusanan/lauseen ympäröiminen kaksoislainauksilla estää videon oitsikoiden ja kanavien nimien osittaisia vastaavuuksia<br><br>Esimerkiksi,<br><b>\"ai\"</b> piilottaa videon: <b>How does AI work?</b><br>mutta ei piilota: <b>What does fair use mean?</b> + + Ei voi käyttää avainsanaa: %s + Lisää lainausmerkit käyttääksesi avainsanaa: %s + Avainsanalla on ristiriitaiset ilmoitukset: %s + Avainsana on liian lyhyt ja vaatii lainausmerkkejä: %s + Avainsana piilottaa kaikki videot: %s + + + Piilota sisällöntuottajan kauppahylly + Sisällöntuottajan kauppahylly piilotetaan videosoittimen alla + Sisällöntuottajan kauppahylly videosoittimen alla näytetään + Piilota loppunäytön kauppabanneri + Loppunäytön kauppabanneri piilotetaan + Loppunäytön kauppabanneri näytetään + Piilota koko näytön mainokset + "Koko näytön mainokset piilotetaan Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" - Koko näytön mainokset näytetään - - Koko näytön mainosten piilottaminen toimii vain vanhemmilla laitteilla - Piilota yleiset mainokset - Yleiset mainokset piilotetaan - Yleiset mainokset näytetään - Piilota tuotebannerit - Tuotebannerit piilotetaan - Tuotebannerit näytetään - Piilota maksetun mainostuksen tunniste - Maksetun mainostuksen tunniste piilotetaan - Maksetun mainostuksen tunniste näytetään - Piilota itse-sponsoroidut kortit - Itse-sponsoroidut kortit piilotetaan - Itse-sponsoroidut kortit näytetään - Piilota ostoslinkit - Ostoslinkit videon kuvauksessa piilotetaan - Ostoslinkit videon kuvauksessa näytetään - Piilota \"Näytä tuotteet\" -banneri - Videon peittokuvan tuotebannerit piilotetaan - Videon peittokuvan tuotebannerit näytetään - Piilota verkkohakutulokset - Verkkohakutulokset piilotetaan - Verkkohakutulokset näytetään - - - Piilota YouTube Premium -mainokset - YouTube Premium -mainokset videosoittimen alla piilotetaan - YouTube Premium -mainokset videosoittimen alla näytetään - - - Piilota videomainokset - Videomainokset piilotetaan - Videomainokset näytetään - - - URL-osoite kopioitiin leikepöydälle - Aikaleimattu URL-osoite kopioitiin - Näytä videon URL-osoitteen kopiointipainike - Kopioi videon URL -painike näytetään. Napauta kopioidaksesi videon URL:n. Paina pitkään kopioidaksesi aikaleimalla. - Kopioi videon URL -painiketta ei näytetä - Näytä videon aikaleimatun URL-osoitteen kopiointipainike - Kopioi aikaleiman URL -painike näytetään. Napauta kopioidaksesi videon URL:n aikaleimalla. Paina pitkään kopioidaksesi ilman aikaleimaa. - Kopioi aikaleiman URL -painiketta ei näytetä - - - Poista katsojan harkinta -valintaikkuna - Valintaikkuna poistetaan - Valintaikkuna näytetään - Tämä ei ohita ikärajoitusta. Se vain hyväksyy sen automaattisesti. - - - Poista \"Kirjaudu TV:hen\" -ponnahdusikkuna käytöstä - Kirjaudu televisioon -ponnahdusikkuna on poistettu käytöstä - Kirjaudu televisioon -ponnahdusikkuna on käytössä - - - Poista videon osan ohittaminen kaksoisnapauttamalla käytöstä - Kaksoisnapautus ei voi koskaan aiheuttaa siirtymistä videon seuraavaan/edelliseen osaan - Kaksoisnapautus voi joskus aiheuttaa siirtymisen videon seuraavaan/edelliseen osaan - - - Ulkoiset lataukset - Asetukset ulkoisen lataajan käyttämiselle - Näytä ulkoinen lataus -painike - Lataa-painike näytetään soittimessa - Lataa-painike piilotetaan soittimessa - - Korvaa Lataa-toimintopainike - Lataa-painike avaa ulkoisen lataajan - Lataa-painike avaa sovelluksen sisäisen lataajan - Lataajan paketin nimi - Asennetun ulkoisen lataussovelluksen paketin nimi - Anna paketin nimi - Muu - Sovellusta ei ole asennettu - %s ei ole asennettu. Asenna se. - "Ei löytynyt asennettua sovellusta paketin nimellä: %s + Koko näytön mainokset näytetään + + Koko näytön mainosten piilottaminen toimii vain vanhemmilla laitteilla + Piilota yleiset mainokset + Yleiset mainokset piilotetaan + Yleiset mainokset näytetään + Piilota tuotebannerit + Tuotebannerit piilotetaan + Tuotebannerit näytetään + Piilota maksetun mainostuksen tunniste + Maksetun mainostuksen tunniste piilotetaan + Maksetun mainostuksen tunniste näytetään + Piilota itse-sponsoroidut kortit + Itse-sponsoroidut kortit piilotetaan + Itse-sponsoroidut kortit näytetään + Piilota ostoslinkit + Ostoslinkit videon kuvauksessa piilotetaan + Ostoslinkit videon kuvauksessa näytetään + Piilota \"Näytä tuotteet\" -banneri + Videon peittokuvan tuotebannerit piilotetaan + Videon peittokuvan tuotebannerit näytetään + Piilota verkkohakutulokset + Verkkohakutulokset piilotetaan + Verkkohakutulokset näytetään + + + Piilota YouTube Premium -mainokset + YouTube Premium -mainokset videosoittimen alla piilotetaan + YouTube Premium -mainokset videosoittimen alla näytetään + + + Piilota videomainokset + Videomainokset piilotetaan + Videomainokset näytetään + + + URL-osoite kopioitiin leikepöydälle + Aikaleimattu URL-osoite kopioitiin + Näytä videon URL-osoitteen kopiointipainike + Kopioi videon URL -painike näytetään. Napauta kopioidaksesi videon URL:n. Paina pitkään kopioidaksesi aikaleimalla. + Kopioi videon URL -painiketta ei näytetä + Näytä videon aikaleimatun URL-osoitteen kopiointipainike + Kopioi aikaleiman URL -painike näytetään. Napauta kopioidaksesi videon URL:n aikaleimalla. Paina pitkään kopioidaksesi ilman aikaleimaa. + Kopioi aikaleiman URL -painiketta ei näytetä + + + Poista katsojan harkinta -valintaikkuna + Valintaikkuna poistetaan + Valintaikkuna näytetään + Tämä ei ohita ikärajoitusta. Se vain hyväksyy sen automaattisesti. + + + Poista \"Kirjaudu TV:hen\" -ponnahdusikkuna käytöstä + Kirjaudu televisioon -ponnahdusikkuna on poistettu käytöstä + Kirjaudu televisioon -ponnahdusikkuna on käytössä + + + Poista videon osan ohittaminen kaksoisnapauttamalla käytöstä + Kaksoisnapautus ei voi koskaan aiheuttaa siirtymistä videon seuraavaan/edelliseen osaan + Kaksoisnapautus voi joskus aiheuttaa siirtymisen videon seuraavaan/edelliseen osaan + + + Ulkoiset lataukset + Asetukset ulkoisen lataajan käyttämiselle + Näytä ulkoinen lataus -painike + Lataa-painike näytetään soittimessa + Lataa-painike piilotetaan soittimessa + + Korvaa Lataa-toimintopainike + Lataa-painike avaa ulkoisen lataajan + Lataa-painike avaa sovelluksen sisäisen lataajan + Lataajan paketin nimi + Asennetun ulkoisen lataussovelluksen paketin nimi + Anna paketin nimi + Muu + Sovellusta ei ole asennettu + %s ei ole asennettu. Asenna se. + "Ei löytynyt asennettua sovellusta paketin nimellä: %s Tarkista, että paketin nimi on oikein ja sovellus on asennettu" - Paketin nimi ei voi olla tyhjä - - - Poista tarkka etsintäele käytöstä - Ele ei ole käytössä - Ele on käytössä - - - Ota etsintä napauttamalla käyttöön - Etsintä napauttamalla on käytössä - Etsintä napauttamalla ei ole käytössä - - - Ota kirkkauden ele käyttöön - "Koko näytön kirkkauspyyhkäisy on käytössä + Paketin nimi ei voi olla tyhjä + + + Poista tarkka etsintäele käytöstä + Ele ei ole käytössä + Ele on käytössä + + + Ota etsintä napauttamalla käyttöön + Etsintä napauttamalla on käytössä + Etsintä napauttamalla ei ole käytössä + + + Ota kirkkauden ele käyttöön + "Koko näytön kirkkauspyyhkäisy on käytössä Säädä kirkkautta pyyhkäisemällä pystysuoraan näytön vasemmalla puolella" - Koko näytön kirkkauspyyhkäisy ei ole käytössä - Ota äänenvoimakkuuden ele käyttöön - "Koko näytön äänenvoimakkuuspyyhkäisy on käytössä + Koko näytön kirkkauspyyhkäisy ei ole käytössä + Ota äänenvoimakkuuden ele käyttöön + "Koko näytön äänenvoimakkuuspyyhkäisy on käytössä Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta puolella" - Koko näytön äänenvoimakkuuspyyhkäisy ei ole käytössä - Ota pyyhkäise painamalla -ele käyttöön - Pyyhkäise painamalla -ele on käytössä - Pyyhkäise painamalla -ele ei ole käytössä - Ota haptinen palaute käyttöön - Haptinen palaute on käytössä - Haptinen palaute ei ole käytössä - Tallenna ja palauta kirkkaus - Tallenna ja palauta kirkkaus kokoruututilasta poistuttaessa tai siihen siirryttäessä - Älä tallenna ja palauta kirkkautta kokoruututilasta poistuttaessa tai siihen siirryttäessä - Ota automaattisen kirkkauden ele käyttöön - Automaattinen kirkkaus otetaan käyttöön pyyhkäisemällä alhaisimpaan arvoon - Pienimpään arvoon alas pyyhkäiseminen ei ota käyttöön automaattista kirkkautta - Automaattinen - Pyyhkäisyn peittokuvan aikakatkaisu - Kuinka monta millisekuntia ikkuna on näkyvissä - Pyyhkäisyn peittokuvan taustan läpinäkymättömyys - Läpinäkymättömyysarvo 0–100 välillä - Pyyhkäisyn peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä - Kirkkauspyyhkäisyn peittokuvan väri - Kirkkauden liukusäätimien väri - Äänenvoimakkuuspyyhkäisyn peittokuvan väri - Äänenvoimakkuuden liukusäätimien väri - Pyyhkäisyn peittokuvan tekstin koko - Pyyhkäisyn peittokuvan tekstin koko 1–30 välillä - Tekstin koon tulee olla 1–30 välillä - Pyyhkäisyn kynnysraja - Pyyhkäisyä varten tarvittavan kynnyksen määrä - Äänenvoimakkuuspyyhkäisyn herkkyys - Kuinka paljon äänenvoimakkuus muuttuu pyyhkäisyä kohden - Pyyhkäisyn peittokuvan tyyli - Vaakasuuntainen peittokuva - Vaakasuuntainen peittokuva (minimaalinen – ylhäällä) - Vaakasuuntainen peittokuva (minimaalinen – keskellä) - Pyöreä peittokuva - Pyöreä peittokuva (minimaalinen) - Pystysuuntainen peittokuva - Pystysuuntainen peittokuva (minimaalinen) - Ota videon vaihto pyyhkäisemällä käyttöön - Pyyhkäisemällä kokoruututilassa siirrytään seuraavaan/edelliseen videoon - Pyyhkäisemällä kokoruututilassa ei siirrytä seuraavaan/edelliseen videoon - - - Poista automaattiset tekstitykset käytöstä - Automaattiset tekstitykset eivät ole käytössä - Automaattiset tekstitykset ovat käytössä - - - Toimintopainikkeet - Piilota tai näytä painikkeet videoiden alla - Poista Tykkää- ja Tilaa-painikkeiden hehku - Tykkää- ja Tilaa-painikkeet eivät hehku mainittaessa - Tykkää- ja Tilaa-painikkeet hehkuvat mainittaessa - Piilota Tykkää ja En tykkää - Tykkää- ja En tykkää -painikkeet piilotetaan - Tykkää- ja En tykkää -painikkeet näytetään - - Piilota Jaa - Jaa-painike piilotetaan - Jaa-painike näytetään - - Piilota \"Estä mainokset\" - Estä mainokset -painike piilotetaan - Estä mainokset -painike näytetään - - Piilota Kommentit - Kommentit-painike piilotetaan - Kommentit-painike näytetään - + Piilota Jaa + Jaa-painike piilotetaan + Jaa-painike näytetään + + Piilota \"Estä mainokset\" + Estä mainokset -painike piilotetaan + Estä mainokset -painike näytetään + + Piilota Kommentit + Kommentit-painike piilotetaan + Kommentit-painike näytetään + - Piilota Tee ilmoitus - Tee ilmoitus -painike piilotetaan - Tee ilmoitus -painike näytetään - - Piilota Remix - Remix-painike piilotetaan - Remix-painike näytetään - - Piilota Lataa - Lataa-painike piilotetaan - Lataa-painike näytetään - + Piilota Remix + Remix-painike piilotetaan + Remix-painike näytetään + + Piilota Lataa + Lataa-painike piilotetaan + Lataa-painike näytetään + - Piilota Hypetä - Hypetä-painike piilotetaan - Hypetä-painike näytetään - - Piilota Mainosta - Mainosta-painike piilotetaan - Mainosta-painike näytetään - - Piilota Kiitos - Kiitos-painike piilotetaan - Kiitos-painike näytetään - + Piilota Mainosta + Mainosta-painike piilotetaan + Mainosta-painike näytetään + + Piilota Kiitos + Kiitos-painike piilotetaan + Kiitos-painike näytetään + - Piilota Ask - Ask-painike piilotetaan - Ask-painike näytetään - - Piilota Klippi - Klippi-painike piilotetaan - Klippi-painike näytetään - - Piilota Kauppa - Kauppa-painike piilotetaan - Kauppa-painike näytetään - - Piilota Tallenna - Tallenna-painike piilotetaan - Tallenna-painike näytetään - - - Navigointipainikkeet - Piilota tai muuta navigointipalkin painikkeita - - Piilota Koti - Koti-painike piilotetaan - Koti-painike näytetään - - Piilota Shorts - Shorts-painike piilotetaan - Shorts-painike näytetään - - Piilota Luo - Luo-painike piilotetaan - Luo-painike näytetään - - Piilota Tilaukset - Tilaukset-painike piilotetaan - Tilaukset-painike näytetään - Piilota Ilmoitukset - Ilmoitukset-painike piilotetaan - Ilmoitukset-painike näytetään - - Vaihda Luo ja Ilmoitukset - "Luo- ja Ilmoitukset-painikkeet vaihdetaan + Piilota Ask + Ask-painike piilotetaan + Ask-painike näytetään + + Piilota Klippi + Klippi-painike piilotetaan + Klippi-painike näytetään + + Piilota Kauppa + Kauppa-painike piilotetaan + Kauppa-painike näytetään + + Piilota Tallenna + Tallenna-painike piilotetaan + Tallenna-painike näytetään + + + Navigointipainikkeet + Piilota tai muuta navigointipalkin painikkeita + + Piilota Koti + Koti-painike piilotetaan + Koti-painike näytetään + + Piilota Shorts + Shorts-painike piilotetaan + Shorts-painike näytetään + + Piilota Luo + Luo-painike piilotetaan + Luo-painike näytetään + + Piilota Tilaukset + Tilaukset-painike piilotetaan + Tilaukset-painike näytetään + Piilota Ilmoitukset + Ilmoitukset-painike piilotetaan + Ilmoitukset-painike näytetään + + Vaihda Luo ja Ilmoitukset + "Luo- ja Ilmoitukset-painikkeet vaihdetaan Huomaa: Tämä piilottaa väkisin myös videomainokset" - Luo- ja Ilmoitukset-painikkeita ei vaihdeta - "Tämän asetuksen poistaminen käytöstä poistaa myös Shorts-mainosten eston käytöstä. + Luo- ja Ilmoitukset-painikkeita ei vaihdeta + "Tämän asetuksen poistaminen käytöstä poistaa myös Shorts-mainosten eston käytöstä. Jos tämän asetuksen muuttaminen ei tule voimaan, kokeile vaihtaa Incognito-tilaan." - Piilota navigointipainikkeiden tunnisteet - Tunnisteet piilotetaan - Tunnisteet näytetään - Poista läpikuultava tilapalkki käytöstä - Tilapalkki on läpinäkymätön - Tilapalkki on läpinäkymätön tai läpikuultava - Joillakin laitteilla tämän ominaisuuden käyttöönotto voi muuttaa järjestelmän navigointipalkin läpinäkyväksi. - Poista vaalea läpikuultava palkki käytöstä - Vaalean tilan navigointipalkki on läpinäkymätön - Vaalean tilan navigointipalkki on läpinäkymätön tai läpikuultava - Poista tumma läpikuultava palkki käytöstä - Tumman tilan navigointipalkki on läpinäkymätön - Tumman tilan navigointipalkki on läpinäkymätön tai läpikuultava - - - Flyout-valikko - Piilota tai näytä soittimen flyout-valikon kohteita - - Piilota Tekstitykset - Tekstitykset-valinta piilotetaan - Tekstitykset-valikko näytetään - - Piilota Lisäasetukset - Lisäasetukset-valinta piilotetaan - Lisäasetukset-valikko näytetään - - Piilota Nukahtamisajastin - Nukahtamisajastin-valinta piilotetaan - Nukahtamisajastimen valikko näytetään - - Piilota Toista videota jatkuvasti - Toista videota jatkuvasti -valinta piilotetaan - Toista videota jatkuvasti -valinta näytetään - - Piilota Elokuvatila - Elokuvatila-valinta piilotetaan - Elokuvatila-valinta näytetään - Piilota Tasainen äänenvoimakkuus - Tasainen äänenvoimakkuus -valinta näytetään - Tasainen äänenvoimakkuus -valinta piilotetaan - - Piilota Ohjeet ja palaute - Ohjeet ja palaute -valinta piilotetaan - Ohjeet ja palaute -valinta näytetään - - Piilota Toistonopeus - Toistonopeusvalikko piilotetaan - Toistonopeusvalikko näytetään - - Piilota Näytön lukitus - Näytön lukitus -valinta piilotetaan - Näytön lukitus -valinta näytetään - - Piilota Kuuntele YouTube Musicissa - Kuuntele YouTube Musicissa -valinta piilotetaan - Kuuntele YouTube Musicissa -valinta näytetään - - Piilota Ääniraita - Ääniraitavalikko piilotetaan - Ääniraitavalikko näytetään - + Piilota Tekstitykset + Tekstitykset-valinta piilotetaan + Tekstitykset-valikko näytetään + + Piilota Lisäasetukset + Lisäasetukset-valinta piilotetaan + Lisäasetukset-valikko näytetään + + Piilota Nukahtamisajastin + Nukahtamisajastin-valinta piilotetaan + Nukahtamisajastimen valikko näytetään + + Piilota Toista videota jatkuvasti + Toista videota jatkuvasti -valinta piilotetaan + Toista videota jatkuvasti -valinta näytetään + + Piilota Elokuvatila + Elokuvatila-valinta piilotetaan + Elokuvatila-valinta näytetään + Piilota Tasainen äänenvoimakkuus + Tasainen äänenvoimakkuus -valinta näytetään + Tasainen äänenvoimakkuus -valinta piilotetaan + + Piilota Ohjeet ja palaute + Ohjeet ja palaute -valinta piilotetaan + Ohjeet ja palaute -valinta näytetään + + Piilota Toistonopeus + Toistonopeusvalikko piilotetaan + Toistonopeusvalikko näytetään + + Piilota Näytön lukitus + Näytön lukitus -valinta piilotetaan + Näytön lukitus -valinta näytetään + + Piilota Kuuntele YouTube Musicissa + Kuuntele YouTube Musicissa -valinta piilotetaan + Kuuntele YouTube Musicissa -valinta näytetään + + Piilota Ääniraita + Ääniraitavalikko piilotetaan + Ääniraitavalikko näytetään + - "Ääniraitavalikko piilotetaan + "Ääniraitavalikko piilotetaan Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetukseksi \"Android No SDK\"" - - Piilota Katso VR-tilassa - Katso VR-tilassa -valinta piilotetaan - Katso VR-tilassa -valinta näytetään - Piilota videolaatuvalikko - Videolaatuvalikko piilotetaan - Videolaatuvalikko näytetään - Piilota videolaatuvalikon alatunniste - Videolaatuvalikon alatunniste piilotetaan - Videolaatuvalikon alatunniste näytetään - - - Piilota Automaattinen toisto -painike - Automaattinen toisto -painike piilotetaan - Automaattinen toisto -painike näytetään - - Piilota Tekstitykset -painike - Tekstitykset-painike piilotetaan - Tekstitykset-painike näytetään - Piilota Cast-painike - Cast-painike piilotetaan - Cast-painike näytetään - Piilota soittimen ohjainten tausta - Soittimen ohjainten tausta piilotetaan - Soittimen ohjainten tausta näytetään - Piilota Edellinen & Seuraava -painikkeet - Edellinen- ja Seuraava-painikkeet piilotetaan - Painikkeet näytetään - - - Piilota loppunäytön kortit - Loppunäytön kortit piilotetaan - Loppunäytön kortit näytetään - - - Poista Tunnelmavalaistus käytöstä kokoruututilassa - Elokuvatila ei ole käytössä - Elokuvatila on käytössä - - - Piilota tietokortit - Tietokortit piilotetaan - Tietokortit näytetään - - - Poista vierivät numeroanimaatiot käytöstä - Vieriviä numeroita ei animoida - Vierivät numerot animoidaan - - - Piilota videosoittimen etenemispalkki - Videosoittimen etenemispalkki piilotetaan - Videosoittimen etenemispalkki näytetään - - Piilota videoiden pikkukuvien etenemispalkki - Videoiden pikkukuvien etenemispalkki piilotetaan - Videoiden pikkukuvien etenemispalkki näytetään - - - Shorts-soitin - Piilota tai näytä Shorts-soittimen osia - - Piilota Shortsit Koti-syötteessä - Piilotetaan Koti-syötteessä ja liittyvissä videoissa - Näytetään Koti-syötteessä ja liittyvissä videoissa - Piilota Shortsit hakutuloksissa - Piilotetaan hakutuloksissa - Näytetään hakutuloksissa - - Piilota Shortsit Tilaukset-syötteessä - Piilotetaan Tilaukset-syötteessä - Näytetään tilaukset-syötteessä - Piilota Shortsit katseluhistoriassa - Piilotetaan katseluhistoriassa - Näytetään katseluhistoriassa - Piilota \"Automaattisesti jälkiäänitetty\" -merkintä - Automaattisesti jälkiäänitetty merkintä on piilotettu - Automaattisesti jälkiäänitetty merkintä näytetään - Piilota \"Osta Super Kiitokset\" -painike - Osta Superkiitos -painike piilotetaan - Osta Superkiitos -painike näytetään - Piilota Tehoste-painike - Tehoste-painike piilotetaan - Tehoste-painike näytetään - Piilota \"Vihreä ruutu\" -painike - Vihertausta-painike piilotetaan - Vihertausta-painike näytetään - Piilota Hashtag-painike - Hashtag-painike piilotetaan - Hashtag-painike näytetään - - Piilota Liity-painike - Liity-painike piilotetaan - Liity-painike näytetään - Piilota live-esikatselu - Live-esikatselu piilotetaan - Live-esikatselu näytetään - Piilota sijaintitieto - Sijaintitieto piilotetaan - Sijaintitieto näytetään - Piilota \"Uudet julkaisut\" -painike - Uudet postaukset -painike piilotetaan - Uudet postaukset -painike näytetään - Piilota pysäytysruudun painikkeet - Pysäytysruudun painikkeet piilotetaan - Pysäytysruudun painikkeet näytetään - Piilota kommentin esikatselu - Kommentin esikatselu piilotetaan - Kommentin esikatselu näytetään - Piilota \"Tallenna musiikki\" -painike - Tallenna musiikki -painike piilotetaan - Tallenna musiikki -painike näytetään - Piilota hakuehdotukset - Hakuehdotukset piilotetaan - Hakuehdotukset näytetään - Piilota Kauppa-painike - Kauppa-painike piilotetaan - Kauppa-painike näytetään - Piilota tarrat - Tarrat piilotetaan - Tarrat näytetään - Piilota Tilaa-painike - Tilaa-painike piilotetaan - Tilaa-painike näytetään - Piilota tagatut tuotteet - Tagatut tuotteet piilotetaan - Tagatut tuotteet näytetään - Piilota Tulossa-painike - Tulossa-painike piilotetaan - Tulossa-painike näytetään - Piilota \"Käytä tätä ääntä\" -painike - Käytä tätä ääntä -painike piilotetaan - Käytä tätä ääntä -painike näytetään - Piilota \"Käytä tätä mallia\" -painike - Käytä tätä mallia -painike piilotetaan - Käytä tätä mallia -painike näytetään - Piilota Tykkää-painikkeen suihkulähdeanimaatio - Tykkää-painikkeen suihkulähdeanimaatio piilotetaan - Tykkää-painikkeen suihkulähdeanimaatio näytetään - Piilota Tykkää-painike - Tykkää-painike piilotetaan - Tykkää-painike näytetään - Piilota En tykkää -painike - En tykkää -painike piilotetaan - En tykkää -painike näytetään - Piilota Kommentit-painike - Kommentit-painike piilotetaan - Kommentit-painike näytetään - - Piilota Jaa-painike - Jaa-painike piilotetaan - Jaa-painike näytetään - - Piilota Remix-painike - Remix-painike piilotetaan - Remix-painike näytetään - Piilota äänipainike - Äänipainike piilotetaan - Äänipainike näytetään - Piilota tietopaneeli - Tietopaneeli piilotetaan - Tietopaneeli näytetään - Piilota kanavapalkki - Kanavapalkki piilotetaan - Kanavapalkki näytetään - Piilota videon otsikko - Videon otsikko piilotetaan - Videon otsikko näytetään - Piilota äänen metadata-tunniste - Äänen metatietojen tunniste piilotetaan - Äänen metatietojen tunniste näytetään - Piilota videolinkin tunniste - Videolinkin tunniste piilotetaan - Videolinkin tunniste näytetään - Piilota navigointipalkki - Navigointipalkki piilotetaan - Navigointipalkki näytetään - - - Piilota loppunäytön ehdotettu video - "Loppunäytön ehdotettu video on piilotettu, kun automaattinen toisto ei ole käytössä + + Piilota Katso VR-tilassa + Katso VR-tilassa -valinta piilotetaan + Katso VR-tilassa -valinta näytetään + Piilota videolaatuvalikko + Videolaatuvalikko piilotetaan + Videolaatuvalikko näytetään + Piilota videolaatuvalikon alatunniste + Videolaatuvalikon alatunniste piilotetaan + Videolaatuvalikon alatunniste näytetään + + + Piilota Automaattinen toisto -painike + Automaattinen toisto -painike piilotetaan + Automaattinen toisto -painike näytetään + + Piilota Tekstitykset -painike + Tekstitykset-painike piilotetaan + Tekstitykset-painike näytetään + Piilota Cast-painike + Cast-painike piilotetaan + Cast-painike näytetään + Piilota soittimen ohjainten tausta + Soittimen ohjainten tausta piilotetaan + Soittimen ohjainten tausta näytetään + Piilota Edellinen & Seuraava -painikkeet + Edellinen- ja Seuraava-painikkeet piilotetaan + Painikkeet näytetään + + + Piilota loppunäytön kortit + Loppunäytön kortit piilotetaan + Loppunäytön kortit näytetään + + + Poista Tunnelmavalaistus käytöstä kokoruututilassa + Elokuvatila ei ole käytössä + Elokuvatila on käytössä + + + Piilota tietokortit + Tietokortit piilotetaan + Tietokortit näytetään + + + Poista vierivät numeroanimaatiot käytöstä + Vieriviä numeroita ei animoida + Vierivät numerot animoidaan + + + Piilota videosoittimen etenemispalkki + Videosoittimen etenemispalkki piilotetaan + Videosoittimen etenemispalkki näytetään + + Piilota videoiden pikkukuvien etenemispalkki + Videoiden pikkukuvien etenemispalkki piilotetaan + Videoiden pikkukuvien etenemispalkki näytetään + + + Shorts-soitin + Piilota tai näytä Shorts-soittimen osia + + Piilota Shortsit Koti-syötteessä + Piilotetaan Koti-syötteessä ja liittyvissä videoissa + Näytetään Koti-syötteessä ja liittyvissä videoissa + Piilota Shortsit hakutuloksissa + Piilotetaan hakutuloksissa + Näytetään hakutuloksissa + + Piilota Shortsit Tilaukset-syötteessä + Piilotetaan Tilaukset-syötteessä + Näytetään tilaukset-syötteessä + Piilota Shortsit katseluhistoriassa + Piilotetaan katseluhistoriassa + Näytetään katseluhistoriassa + Piilota \"Automaattisesti jälkiäänitetty\" -merkintä + Automaattisesti jälkiäänitetty merkintä on piilotettu + Automaattisesti jälkiäänitetty merkintä näytetään + Piilota \"Osta Super Kiitokset\" -painike + Osta Superkiitos -painike piilotetaan + Osta Superkiitos -painike näytetään + Piilota Tehoste-painike + Tehoste-painike piilotetaan + Tehoste-painike näytetään + Piilota \"Vihreä ruutu\" -painike + Vihertausta-painike piilotetaan + Vihertausta-painike näytetään + Piilota Hashtag-painike + Hashtag-painike piilotetaan + Hashtag-painike näytetään + + Piilota Liity-painike + Liity-painike piilotetaan + Liity-painike näytetään + Piilota live-esikatselu + Live-esikatselu piilotetaan + Live-esikatselu näytetään + Piilota sijaintitieto + Sijaintitieto piilotetaan + Sijaintitieto näytetään + Piilota \"Uudet julkaisut\" -painike + Uudet postaukset -painike piilotetaan + Uudet postaukset -painike näytetään + Piilota pysäytysruudun painikkeet + Pysäytysruudun painikkeet piilotetaan + Pysäytysruudun painikkeet näytetään + Piilota kommentin esikatselu + Kommentin esikatselu piilotetaan + Kommentin esikatselu näytetään + Piilota \"Tallenna musiikki\" -painike + Tallenna musiikki -painike piilotetaan + Tallenna musiikki -painike näytetään + Piilota hakuehdotukset + Hakuehdotukset piilotetaan + Hakuehdotukset näytetään + Piilota Kauppa-painike + Kauppa-painike piilotetaan + Kauppa-painike näytetään + Piilota tarrat + Tarrat piilotetaan + Tarrat näytetään + Piilota Tilaa-painike + Tilaa-painike piilotetaan + Tilaa-painike näytetään + Piilota tagatut tuotteet + Tagatut tuotteet piilotetaan + Tagatut tuotteet näytetään + Piilota Tulossa-painike + Tulossa-painike piilotetaan + Tulossa-painike näytetään + Piilota \"Käytä tätä ääntä\" -painike + Käytä tätä ääntä -painike piilotetaan + Käytä tätä ääntä -painike näytetään + Piilota \"Käytä tätä mallia\" -painike + Käytä tätä mallia -painike piilotetaan + Käytä tätä mallia -painike näytetään + Piilota Tykkää-painikkeen suihkulähdeanimaatio + Tykkää-painikkeen suihkulähdeanimaatio piilotetaan + Tykkää-painikkeen suihkulähdeanimaatio näytetään + Piilota Tykkää-painike + Tykkää-painike piilotetaan + Tykkää-painike näytetään + Piilota En tykkää -painike + En tykkää -painike piilotetaan + En tykkää -painike näytetään + Piilota Kommentit-painike + Kommentit-painike piilotetaan + Kommentit-painike näytetään + + Piilota Jaa-painike + Jaa-painike piilotetaan + Jaa-painike näytetään + + Piilota Remix-painike + Remix-painike piilotetaan + Remix-painike näytetään + Piilota äänipainike + Äänipainike piilotetaan + Äänipainike näytetään + Piilota tietopaneeli + Tietopaneeli piilotetaan + Tietopaneeli näytetään + Piilota kanavapalkki + Kanavapalkki piilotetaan + Kanavapalkki näytetään + Piilota videon otsikko + Videon otsikko piilotetaan + Videon otsikko näytetään + Piilota äänen metadata-tunniste + Äänen metatietojen tunniste piilotetaan + Äänen metatietojen tunniste näytetään + Piilota videolinkin tunniste + Videolinkin tunniste piilotetaan + Videolinkin tunniste näytetään + Piilota navigointipalkki + Navigointipalkki piilotetaan + Navigointipalkki näytetään + + + Piilota loppunäytön ehdotettu video + "Loppunäytön ehdotettu video on piilotettu, kun automaattinen toisto ei ole käytössä Automaattista toistoa voidaan muuttaa YouTube-asetuksissa: Asetukset → Toisto → Toista seuraava video automaattisesti" - Loppunäytön ehdotettu video näytetään - - - Piilota liittyvät videot -peittokuva - Liittyvät videot -peittokuva piilotetaan kokoruututilassa - Liittyvät videot -peittokuva näytetään kokoruututilassa - - - Piilota videon aikaleima - Aikaleima piilotetaan - Aikaleima näytetään - - - Piilota soittimen ponnahdusikkunat - Soittimen ponnahdusikkunat piilotetaan - Soittimen ponnahdusikkunat näytetään - - - Poistu kokoruututilasta videon lopussa - Pois käytöstä - Pysty - Vaaka - Pysty ja vaaka - - - Avaa videot koko näytöllä pystyasennossa - Videot avataan koko näytöllä - Videoita ei avata koko näytöllä - - - Soittimen peittokuvan läpinäkymättömyys - Läpinäkymättömyysarvo välillä 0–100, jossa 0 on läpinäkyvä - Soittimen peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä - - - - Ei-tykkäykset eivät ole tilapäisesti käytettävissä - Ei-tykkäykset eivät ole saatavilla (tila %d) - Ei-tykkäykset eivät ole saatavilla (asiakkaan API-raja) - Ei-tykkäykset eivät ole saatavilla (%s) - - Lataa video uudelleen äänestääksesi Return YouTube Dislikellä - - Omistajan piilottama - Return YouTube Dislike - Ei-tykkäykset näytetään - Ei-tykkäyksiä ei näytetä - Näytä ei-tykkykset Shortseissa - "Ei-tykkäykset näytetään Shortseissa + Loppunäytön ehdotettu video näytetään + + + Piilota liittyvät videot -peittokuva + Liittyvät videot -peittokuva piilotetaan kokoruututilassa + Liittyvät videot -peittokuva näytetään kokoruututilassa + + + Piilota videon aikaleima + Aikaleima piilotetaan + Aikaleima näytetään + + + Piilota soittimen ponnahdusikkunat + Soittimen ponnahdusikkunat piilotetaan + Soittimen ponnahdusikkunat näytetään + + + Poistu kokoruututilasta videon lopussa + Pois käytöstä + Pysty + Vaaka + Pysty ja vaaka + + + Avaa videot koko näytöllä pystyasennossa + Videot avataan koko näytöllä + Videoita ei avata koko näytöllä + + + Soittimen peittokuvan läpinäkymättömyys + Läpinäkymättömyysarvo välillä 0–100, jossa 0 on läpinäkyvä + Soittimen peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä + + + + Ei-tykkäykset eivät ole tilapäisesti käytettävissä + Ei-tykkäykset eivät ole saatavilla (tila %d) + Ei-tykkäykset eivät ole saatavilla (asiakkaan API-raja) + Ei-tykkäykset eivät ole saatavilla (%s) + + Lataa video uudelleen äänestääksesi Return YouTube Dislikellä + + Omistajan piilottama + Return YouTube Dislike + Ei-tykkäykset näytetään + Ei-tykkäyksiä ei näytetä + Näytä ei-tykkykset Shortseissa + "Ei-tykkäykset näytetään Shortseissa Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa" - Ei-tykkäyksiä ei näytetä Shortseissa - Ei-tykkäykset prosentteina - Ei-tykkäykset näytetään prosenttina - Ei-tykkäykset näytetään numerona - - Kompakti Tykkää-painike - Tykkää-painike on muotoiltu mahdollisimman kapeaksi - Tykkää-painike on muotoiltu parhaan näköiseksi - Näytä arvioidut tykkäykset - Videot, joiden tykkäykset on poistettu käytöstä, näyttävät arvioidun tykkäysten määrän - Arvioituja tykkäyksiä ei näytetä - Näytä ponnahdusilmoitus, jos API ei ole käytettävissä - Ponnahdusilmoitus näytetään, jos Return YouTube Dislike ei ole käytettävissä - Ponnahdusilmoitusta ei näytetä, jos Return YouTube Dislike ei ole käytettävissä - ReturnYouTubeDislike.com - Tiedot ovat peräisin Return YouTube Disliken API:sta. Napauta tästä lukeaksesi lisää - - Tämän laitteen ReturnYouTubeDislike API -tilastot - API-vasteaika, keskiarvo - API-vasteaika, minimi - API-vasteaika, maksimi - API-vasteaika, viimeisin video - Ei ole tilapäisesti käytettävissä - Asiakkaan API-rajaa voimassa - API noutaa äänet, puhelujen määrä - Verkkokutsuja ei ole tehty - %d verkkokutsua tehty - API noutaa äänet, aikataulujen määrä - Verkkokutsuja ei ole aikakatkaistu - %d verkkokutsua aikakatkaistiin - API:n asiakashintojen raja-arvot - Asiakasmäärän rajoja ei havaittu - Asiakkaan hintaraja kohdistettu %d kertaa - %d millisekuntia - - - Ota leveä hakupalkki käyttöön - Leveä hakupalkki on käytössä - Leveä hakupalkki ei ole käytössä - - - Ota korkealaatuiset pikkukuvat käyttöön - Etenemispalkin pikkukuvat ovat korkealaatuisia - Etenemispalkin pikkukuvat ovat keskilaatuisia - Koko näytön etenemispalkin pikkukuvat ovat korkealaatuisia - Koko näytön etenemispalkin pikkukuvat ovat keskilaatuisia - "Tämä palauttaa myös pienoiskuvat livestriimeissä, joilla ei ole etenemispalkin pikkukuvia. + Ei-tykkäyksiä ei näytetä Shortseissa + Ei-tykkäykset prosentteina + Ei-tykkäykset näytetään prosenttina + Ei-tykkäykset näytetään numerona + + Kompakti Tykkää-painike + Tykkää-painike on muotoiltu mahdollisimman kapeaksi + Tykkää-painike on muotoiltu parhaan näköiseksi + Näytä arvioidut tykkäykset + Videot, joiden tykkäykset on poistettu käytöstä, näyttävät arvioidun tykkäysten määrän + Arvioituja tykkäyksiä ei näytetä + Näytä ponnahdusilmoitus, jos API ei ole käytettävissä + Ponnahdusilmoitus näytetään, jos Return YouTube Dislike ei ole käytettävissä + Ponnahdusilmoitusta ei näytetä, jos Return YouTube Dislike ei ole käytettävissä + ReturnYouTubeDislike.com + Tiedot ovat peräisin Return YouTube Disliken API:sta. Napauta tästä lukeaksesi lisää + + Tämän laitteen ReturnYouTubeDislike API -tilastot + API-vasteaika, keskiarvo + API-vasteaika, minimi + API-vasteaika, maksimi + API-vasteaika, viimeisin video + Ei ole tilapäisesti käytettävissä - Asiakkaan API-rajaa voimassa + API noutaa äänet, puhelujen määrä + Verkkokutsuja ei ole tehty + %d verkkokutsua tehty + API noutaa äänet, aikataulujen määrä + Verkkokutsuja ei ole aikakatkaistu + %d verkkokutsua aikakatkaistiin + API:n asiakashintojen raja-arvot + Asiakasmäärän rajoja ei havaittu + Asiakkaan hintaraja kohdistettu %d kertaa + %d millisekuntia + + + Ota leveä hakupalkki käyttöön + Leveä hakupalkki on käytössä + Leveä hakupalkki ei ole käytössä + + + Ota korkealaatuiset pikkukuvat käyttöön + Etenemispalkin pikkukuvat ovat korkealaatuisia + Etenemispalkin pikkukuvat ovat keskilaatuisia + Koko näytön etenemispalkin pikkukuvat ovat korkealaatuisia + Koko näytön etenemispalkin pikkukuvat ovat keskilaatuisia + "Tämä palauttaa myös pienoiskuvat livestriimeissä, joilla ei ole etenemispalkin pikkukuvia. Etenemispalkin pikkukuvat käyttävät samaa laatua kuin nykyinen video. Tämä ominaisuus toimii parhaiten, kun videon laatu on 720p tai alhaisempi ja kun käytössä on erittäin nopea Internet-yhteys." - Palauta vanhat etenemispalkin pikkukuvat - Etenemispalkin pikkukuvat näkyvät etenemispalkin yläpuolella - Etenemispalkin pikkukuvat näkyvät kokoruututilassa - - - SponsorBlock - Ota SponsorBlock käyttöön - SponsorBlock on joukkoistettu järjestelmä, jolla voidaan ohittaa YouTube-videoiden ärsyttäviä osia - Ulkoasu - Näytä äänestyspainike - Osion äänestyspainike näytetään - Osion äänestyspainiketta ei näytetä - Käytä nelikulmaista asettelua - Painikkeet ja ohjaimet ovat nelikulmaisia - Painikkeet ja ohjaimet ovat pyöreitä - - Käytä kompaktia ohita-painiketta - Ohita-painike on muotoiltu mahdollisimman kapeaksi - Ohita-painike on muotoiltu parhaan näköiseksi - Piilota ohita-painike automaattisesti - Ohita-painike piiloutuu muutaman sekunnin kuluttua - Ohita-painike näytetään koko osion ajan - Ohita-painikkeen kesto - Kuinka kauan ohita- ja ohita-kohokohtaan-painikkeita näytetään ennen automaattista piilottamista - Näytä kumoa ohitus -ponnahdusilmoitus - Ponnahdusilmoitus näytetään, kun osio ohitetaan automaattisesti. Napauta ponnahdusilmoitusta kumotaksesi ohituksen - Ponnahdusilmoitusta ei näytetä - Ohita-ponnahdusilmoituksen kesto - Kuinka kauan kumoa ohitus -ponnahdusilmoitus näytetään - 1 sekunti - 2 sekuntia - 3 sekuntia - 4 sekuntia - 5 sekuntia - 6 sekuntia - 7 sekuntia - 8 sekuntia - 9 sekuntia - 10 sekuntia - Näytä videon pituus ilman osioita - Videon pituus ilman kaikkia osioita näkyy etenemispalkissa - Videon koko pituus näytetään - Uusien osioiden luominen - Näytä Luo uusi osio -painike - Luo uusi osio -painike näytetään - Luo uusi osio -painiketta ei näytetä - Uuden osion ajoituksen säätö - Kuinka monta millisekuntia ajansäätöpainikkeet liikkuvat uusia osioita luotaessa - Arvon tulee olla positiivinen luku - Näytä ohjeet - Ohjeet sisältävät sääntöjä ja vinkkejä uusien osioiden luomiseen - Noudata ohjeita - Lue SponsorBlock-ohjeet ennen uusien osioiden luomista - Luettu jo - Näytä minulle - Yleiset - Näytä ponnahdusilmoitus, jos API ei ole käytettävissä - Ponnahdusilmoitus näytetään, jos SponsorBlock ei ole käytettävissä - Ponnahdusilmoitusta ei näytetä, jos SponsorBlock ei ole käytettävissä - Ota ohitusten lukumäärän seuranta käyttöön - Antaa SponsorBlock-tulostaulun tietää, kuinka paljon aikaa säästyy. Tulostaululle lähetetään viesti aina, kun osio ohitetaan - Ohitusten lukumäärän seuranta ei ole käytössä - Osion vähimmäiskesto - Tätä arvoa (sekunteina) lyhyempiä osioita ei näytetä tai ohiteta - Virheellinen kestoaika - Yksityinen UserID:si - Tämä on pidettävä yksityisenä. Tämä on kuin salasana, eikä sitä tule jakaa kenenkään kanssa. Jos jollakulla on tämä, he voivat esiintyä sinuna - Yksityisen UserID:n tulee olla vähintään 30 merkkiä pitkä - Muuta API:n URL-osoitetta - Osoite, jota SponsorBlock käyttää kutsujen lähettämiseen palvelimelle - API:n URL-osoitteen nollaus - API:n URL-osoite on virheellinen - API:n URL-osoitetta muutettiin - Tuo/Vie asetukset - Kopioi - SponsorBlockin JSON-konfiguraatiosi, joka voidaan tuoda/viedä ReVancediin ja muihin SponsorBlock-alustoihin - SponsorBlockin JSON-konfiguraatiosi, joka voidaan tuoda/viedä ReVancediin ja muihin SponsorBlock-alustoihin. Tämä sisältää yksityisen UserID:si. Jaa tämä harkiten - Asetusten tuonti onnistui - Tuonti epäonnistui: %s - Vienti epäonnistui: %s - "Asetuksesi sisältävät yksityisen SponsorBlockin UserID:si. + Palauta vanhat etenemispalkin pikkukuvat + Etenemispalkin pikkukuvat näkyvät etenemispalkin yläpuolella + Etenemispalkin pikkukuvat näkyvät kokoruututilassa + + + SponsorBlock + Ota SponsorBlock käyttöön + SponsorBlock on joukkoistettu järjestelmä, jolla voidaan ohittaa YouTube-videoiden ärsyttäviä osia + Ulkoasu + Näytä äänestyspainike + Osion äänestyspainike näytetään + Osion äänestyspainiketta ei näytetä + Käytä nelikulmaista asettelua + Painikkeet ja ohjaimet ovat nelikulmaisia + Painikkeet ja ohjaimet ovat pyöreitä + + Käytä kompaktia ohita-painiketta + Ohita-painike on muotoiltu mahdollisimman kapeaksi + Ohita-painike on muotoiltu parhaan näköiseksi + Piilota ohita-painike automaattisesti + Ohita-painike piiloutuu muutaman sekunnin kuluttua + Ohita-painike näytetään koko osion ajan + Ohita-painikkeen kesto + Kuinka kauan ohita- ja ohita-kohokohtaan-painikkeita näytetään ennen automaattista piilottamista + Näytä kumoa ohitus -ponnahdusilmoitus + Ponnahdusilmoitus näytetään, kun osio ohitetaan automaattisesti. Napauta ponnahdusilmoitusta kumotaksesi ohituksen + Ponnahdusilmoitusta ei näytetä + Ohita-ponnahdusilmoituksen kesto + Kuinka kauan kumoa ohitus -ponnahdusilmoitus näytetään + 1 sekunti + 2 sekuntia + 3 sekuntia + 4 sekuntia + 5 sekuntia + 6 sekuntia + 7 sekuntia + 8 sekuntia + 9 sekuntia + 10 sekuntia + Näytä videon pituus ilman osioita + Videon pituus ilman kaikkia osioita näkyy etenemispalkissa + Videon koko pituus näytetään + Uusien osioiden luominen + Näytä Luo uusi osio -painike + Luo uusi osio -painike näytetään + Luo uusi osio -painiketta ei näytetä + Uuden osion ajoituksen säätö + Kuinka monta millisekuntia ajansäätöpainikkeet liikkuvat uusia osioita luotaessa + Arvon tulee olla positiivinen luku + Näytä ohjeet + Ohjeet sisältävät sääntöjä ja vinkkejä uusien osioiden luomiseen + Noudata ohjeita + Lue SponsorBlock-ohjeet ennen uusien osioiden luomista + Luettu jo + Näytä minulle + Yleiset + Näytä ponnahdusilmoitus, jos API ei ole käytettävissä + Ponnahdusilmoitus näytetään, jos SponsorBlock ei ole käytettävissä + Ponnahdusilmoitusta ei näytetä, jos SponsorBlock ei ole käytettävissä + Ota ohitusten lukumäärän seuranta käyttöön + Antaa SponsorBlock-tulostaulun tietää, kuinka paljon aikaa säästyy. Tulostaululle lähetetään viesti aina, kun osio ohitetaan + Ohitusten lukumäärän seuranta ei ole käytössä + Osion vähimmäiskesto + Tätä arvoa (sekunteina) lyhyempiä osioita ei näytetä tai ohiteta + Virheellinen kestoaika + Yksityinen UserID:si + Tämä on pidettävä yksityisenä. Tämä on kuin salasana, eikä sitä tule jakaa kenenkään kanssa. Jos jollakulla on tämä, he voivat esiintyä sinuna + Yksityisen UserID:n tulee olla vähintään 30 merkkiä pitkä + Muuta API:n URL-osoitetta + Osoite, jota SponsorBlock käyttää kutsujen lähettämiseen palvelimelle + API:n URL-osoitteen nollaus + API:n URL-osoite on virheellinen + API:n URL-osoitetta muutettiin + Tuo/Vie asetukset + Kopioi + SponsorBlockin JSON-konfiguraatiosi, joka voidaan tuoda/viedä ReVancediin ja muihin SponsorBlock-alustoihin + SponsorBlockin JSON-konfiguraatiosi, joka voidaan tuoda/viedä ReVancediin ja muihin SponsorBlock-alustoihin. Tämä sisältää yksityisen UserID:si. Jaa tämä harkiten + Asetusten tuonti onnistui + Tuonti epäonnistui: %s + Vienti epäonnistui: %s + "Asetuksesi sisältävät yksityisen SponsorBlockin UserID:si. UserID on kuin salasana, eikä sitä pidä jakaa kenellekään. " - Älä näytä uudelleen - Muuta osion käyttäytymistä - Sponsori - Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/sisällöntuottajista/nettisivuista/tuotteista, joista he pitävät - Maksamaton/Itsensä mainostus - Samankaltainen \"Sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä - Vuorovaikutusmuistutus (tilaaminen) - Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi - Kohokohta - Se osa videota, jota useimmat ihmiset etsivät - Tauko/Introanimaatio - Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys tai toistuva animaatio. Ei sisällä siirtymiä, jotka sisältävät tietoa - Loppukortit / -tekstit - Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille, joissa on tietoa - Koukku / Tervehdykset - Kertovat trailerit tulevasta videosta, tervehdykset ja hyvästelyt. Ei sisällä osioita, jotka lisäävät lisäsisältöä - Esikatselu / Kertaus - Kokoelma leikkeitä, jotka osoittavat, mitä on tulossa tai mitä tapahtui videossa tai muissa sarjan videoissa, joiden kaikki informaatio toistuu muualla - Toissijaiset kohtaukset / Vitsit - Epäolennaiset kohtaukset tai vitsit, joita ei tarvita videon pääsisällön ymmärtämiseen. Ei sisällä osioita, jotka tarjoavat kontekstia tai taustatietoja - Musiikki: Musiikiton osa - Vain musiikkivideoille. Musiikkivideoiden osiot ilman musiikkia, jotka eivät jo kuulu toiseen kategoriaan - Ohita - Kohokohta - Ohita sponsori - Ohita mainostus - Ohita vuorovaikutus - Ohita kohokohtaan - Ohita intro - Ohita tauko - Ohita tauko - Ohita outro - Ohita koukku - Ohita esikatselu - Ohita esikatselu - Ohita kertaus - Ohita toissijainen kohtaus - Ohita musiikiton - Ohita osio - Sponsori ohitettiin - Itsensä mainostus ohitettiin - Ärsyttävä muistutus ohitettiin - Ohitettiin kohokohtaan - Intro ohitettiin - Tauko ohitettiin - Tauko ohitettiin - Outro ohitettiin - Koukku ohitettiin - Esikatselu ohitettiin - Esikatselu ohitettiin - Kertaus ohitettiin - Toissijainen kohtaus ohitettiin - Musiikiton osio ohitettiin - Lähettämätön osio ohitettiin - Useita osioita ohitettiin - Ohita automaattisesti - Ohita automaattisesti kerran - Näytä Ohita-painike - Näytä etenemispalkissa - Poista käytöstä - Osiota ei voitu lähettää: %s - SponsorBlock on tilapäisesti poissa käytöstä - Osiota ei voitu lähettää (tila: %1$d %2$s) - Segmenttiä ei voida lähettää. Nopeuden rajoitus (liian monta samalta käyttäjältä tai IP-osoitteesta) - Osiota ei voi lähettää: %s - "Segmenttiä ei voi lähettää. + Älä näytä uudelleen + Muuta osion käyttäytymistä + Sponsori + Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/sisällöntuottajista/nettisivuista/tuotteista, joista he pitävät + Maksamaton/Itsensä mainostus + Samankaltainen \"Sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä + Vuorovaikutusmuistutus (tilaaminen) + Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi + Kohokohta + Se osa videota, jota useimmat ihmiset etsivät + Tauko/Introanimaatio + Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys tai toistuva animaatio. Ei sisällä siirtymiä, jotka sisältävät tietoa + Loppukortit / -tekstit + Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille, joissa on tietoa + Koukku / Tervehdykset + Kertovat trailerit tulevasta videosta, tervehdykset ja hyvästelyt. Ei sisällä osioita, jotka lisäävät lisäsisältöä + Esikatselu / Kertaus + Kokoelma leikkeitä, jotka osoittavat, mitä on tulossa tai mitä tapahtui videossa tai muissa sarjan videoissa, joiden kaikki informaatio toistuu muualla + Toissijaiset kohtaukset / Vitsit + Epäolennaiset kohtaukset tai vitsit, joita ei tarvita videon pääsisällön ymmärtämiseen. Ei sisällä osioita, jotka tarjoavat kontekstia tai taustatietoja + Musiikki: Musiikiton osa + Vain musiikkivideoille. Musiikkivideoiden osiot ilman musiikkia, jotka eivät jo kuulu toiseen kategoriaan + Ohita + Kohokohta + Ohita sponsori + Ohita mainostus + Ohita vuorovaikutus + Ohita kohokohtaan + Ohita intro + Ohita tauko + Ohita tauko + Ohita outro + Ohita koukku + Ohita esikatselu + Ohita esikatselu + Ohita kertaus + Ohita toissijainen kohtaus + Ohita musiikiton + Ohita osio + Sponsori ohitettiin + Itsensä mainostus ohitettiin + Ärsyttävä muistutus ohitettiin + Ohitettiin kohokohtaan + Intro ohitettiin + Tauko ohitettiin + Tauko ohitettiin + Outro ohitettiin + Koukku ohitettiin + Esikatselu ohitettiin + Esikatselu ohitettiin + Kertaus ohitettiin + Toissijainen kohtaus ohitettiin + Musiikiton osio ohitettiin + Lähettämätön osio ohitettiin + Useita osioita ohitettiin + Ohita automaattisesti + Ohita automaattisesti kerran + Näytä Ohita-painike + Näytä etenemispalkissa + Poista käytöstä + Osiota ei voitu lähettää: %s + SponsorBlock on tilapäisesti poissa käytöstä + Osiota ei voitu lähettää (tila: %1$d %2$s) + Segmenttiä ei voida lähettää. Nopeuden rajoitus (liian monta samalta käyttäjältä tai IP-osoitteesta) + Osiota ei voi lähettää: %s + "Segmenttiä ei voi lähettää. On jo olemassa" - Osion lähetys onnistui - - SponsorBlock ei ole tilapäisesti käytettävissä (API-timeout) - SponsorBlock ei ole tilapäisesti käytettävissä (tila %d) - SponsorBlock ei ole tilapäisesti käytettävissä - Osiota ei voitu äänestää (API aikakatkaistu) - Osiota ei voitu äänestää (tila: %1$d %2$s) - Osiota ei voitu äänestää: %s - Ylä-ääni - Alaääni - Muuta kategoriaa - Äänestettäviä osioita ei ole - - %1$s–%2$s - Valitse osion kategoria - Kategoria on poistettu käytöstä asetuksissa. Salli kategoria lähettääksesi. - Uusi SponsorBlock-osio - Asetetaanko %s uuden osion aluksi vai lopuksi? - Alku - Loppu - Nyt - Aika, jolloin osio alkaa - Aika, jolloin osio päättyy - Ovatko ajat oikein? - "Osio alkaa + Osion lähetys onnistui + + SponsorBlock ei ole tilapäisesti käytettävissä (API-timeout) + SponsorBlock ei ole tilapäisesti käytettävissä (tila %d) + SponsorBlock ei ole tilapäisesti käytettävissä + Osiota ei voitu äänestää (API aikakatkaistu) + Osiota ei voitu äänestää (tila: %1$d %2$s) + Osiota ei voitu äänestää: %s + Ylä-ääni + Alaääni + Muuta kategoriaa + Äänestettäviä osioita ei ole + + %1$s–%2$s + Valitse osion kategoria + Kategoria on poistettu käytöstä asetuksissa. Salli kategoria lähettääksesi. + Uusi SponsorBlock-osio + Asetetaanko %s uuden osion aluksi vai lopuksi? + Alku + Loppu + Nyt + Aika, jolloin osio alkaa + Aika, jolloin osio päättyy + Ovatko ajat oikein? + "Osio alkaa %1$s ja päättyy @@ -1292,47 +1291,47 @@ ja päättyy (%3$s) Oletko valmis lähettämään?" - Alun on oltava ennen loppua - Merkitse ensin kaksi kohtaa aikapalkissa - Esikatsele osio ja varmista, että se ohitetaan sujuvasti - Muokkaa osion ajoitusta manuaalisesti - Haluatko muokata osion alku- vai loppuaikaa? - Annettu aika on virheellinen - Tilastot - - Tilastot eivät ole tilapäisesti saatavilla (API ei ole käytettävissä) - Ladataan... - SponsorBlock ei ole käytössä - Käyttäjänimesi: <b>%s</b> - Vaihda käyttäjänimeä napauttamalla tästä - Käyttäjänimeä ei voitu vaihtaa: Tila: %1$d %2$s - Käyttäjänimen vaihto onnistui - Maineesi on <b>%.2f</b> - Olet luonut <b>%s</b> osiota - Napauta tästä nähdäksesi osiosi - SponsorBlock-tulostaulu - Olet pelastanut ihmisiä <b>%s</b> osiolta - Napauta tästä nähdäksesi globaalit tilastot ja parhaat osallistujat - Se on <b>%s</b> heidän elämistään.<br>Napauta tästä nähdäksesi tulostaulun - Olet ohittanut <b>%s</b> osiota - Se on <b>%s</b> - Nollataanko ohitettujen osioiden laskuri? - %1$s tuntia %2$s minuuttia - %1$s minuuttia %2$s sekuntia - %s sekuntia - Läpikuultamattomuus: - Väri: - Tietoja - sponsor.ajay.app - Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille - - - Käyttöliittymän asettelu - Oletus - Puhelin - Tabletti - Ajoneuvo - "Muutokset sisältävät: + Alun on oltava ennen loppua + Merkitse ensin kaksi kohtaa aikapalkissa + Esikatsele osio ja varmista, että se ohitetaan sujuvasti + Muokkaa osion ajoitusta manuaalisesti + Haluatko muokata osion alku- vai loppuaikaa? + Annettu aika on virheellinen + Tilastot + + Tilastot eivät ole tilapäisesti saatavilla (API ei ole käytettävissä) + Ladataan... + SponsorBlock ei ole käytössä + Käyttäjänimesi: <b>%s</b> + Vaihda käyttäjänimeä napauttamalla tästä + Käyttäjänimeä ei voitu vaihtaa: Tila: %1$d %2$s + Käyttäjänimen vaihto onnistui + Maineesi on <b>%.2f</b> + Olet luonut <b>%s</b> osiota + Napauta tästä nähdäksesi osiosi + SponsorBlock-tulostaulu + Olet pelastanut ihmisiä <b>%s</b> osiolta + Napauta tästä nähdäksesi globaalit tilastot ja parhaat osallistujat + Se on <b>%s</b> heidän elämistään.<br>Napauta tästä nähdäksesi tulostaulun + Olet ohittanut <b>%s</b> osiota + Se on <b>%s</b> + Nollataanko ohitettujen osioiden laskuri? + %1$s tuntia %2$s minuuttia + %1$s minuuttia %2$s sekuntia + %s sekuntia + Läpikuultamattomuus: + Väri: + Tietoja + sponsor.ajay.app + Tiedot tarjoaa SponsorBlock API. Napauta tätä saadaksesi lisätietoja ja nähdäksesi lataukset muille alustoille + + + Käyttöliittymän asettelu + Oletus + Puhelin + Tabletti + Ajoneuvo + "Muutokset sisältävät: Tabletti-asettelu • Yhteisöpostaukset on piilotettu @@ -1340,329 +1339,329 @@ Tabletti-asettelu Ajoneuvo-asettelu • Shortsit avataan tavallisessa soittimessa • Syöte on järjestetty aiheiden ja kanavien mukaan" - - - Naamioi sovellusversio - Versio on naamioitu - Versiota ei ole naamioitu - "Sovellusversio naamioidaan vanhemmaksi YouTube-versioksi. + + + Naamioi sovellusversio + Versio on naamioitu + Versiota ei ole naamioitu + "Sovellusversio naamioidaan vanhemmaksi YouTube-versioksi. Tämä muuttaa sovelluksen ulkoasua ja ominaisuuksia, mutta tuntemattomia sivuvaikutuksia saattaa esiintyä. Jos tämä poistetaan myöhemmin käytöstä, on suositeltavaa tyhjentää sovelluksen tiedot käyttöliittymävirheiden välttämiseksi." - Naamioitava kohdeversio - 20.13.41 - Palauta laajennettu videon toimintopalkki - 20.05.46 - Palauta transkriptiotoiminto - 19.35.36 - Palauta vanhat Shorts-soittimen kuvakkeet - 19.01.34 - Palauta vanhat navigointikuvakkeet - - - Vaihda aloitussivua - Oletus - Kaikki tilaukset - Selaa kanavia - Kurssit/Oppiminen - Tutustu - Muoti ja Kauneus - Pelaaminen - Historia - Kirjasto - Tykätyt videot - Suora - Elokuvat - Musiikki - Uutiset - Ilmoitukset - Soittolistat - Haku - Shopping - Shorts - Urheilu - Tilaukset - Nousussa - Virtuaalitodellisuus - Katso myöhemmin - Omat klipit - Vaihda aloitussivu aina - "Aloitussivu vaihdetaan aina + Naamioitava kohdeversio + 20.13.41 - Palauta laajennettu videon toimintopalkki + 20.05.46 - Palauta transkriptiotoiminto + 19.35.36 - Palauta vanhat Shorts-soittimen kuvakkeet + 19.01.34 - Palauta vanhat navigointikuvakkeet + + + Vaihda aloitussivua + Oletus + Kaikki tilaukset + Selaa kanavia + Kurssit/Oppiminen + Tutustu + Muoti ja Kauneus + Pelaaminen + Historia + Kirjasto + Tykätyt videot + Suora + Elokuvat + Musiikki + Uutiset + Ilmoitukset + Soittolistat + Haku + Shopping + Shorts + Urheilu + Tilaukset + Nousussa + Virtuaalitodellisuus + Katso myöhemmin + Omat klipit + Vaihda aloitussivu aina + "Aloitussivu vaihdetaan aina Rajoitus: Työkalupalkin takaisin-painikkeen käyttäminen ei välttämättä toimi" - Aloitussivu vaihdetaan vain sovelluksen käynnistyessä - - - Poista Shorts-soittimen jatkaminen käytöstä - Shorts-soitin ei jatka sovelluksen käynnistyessä - Shorts-soitin jatkaa sovelluksen käynnistyessä - - - Shortsien avaustapa - Shorts-soitin - Tavallinen soitin - Tavallinen soitin kokoruututilassa - - - Toista Shortsit automaattisesti - Shortsit toistetaan automaattisesti - Shortsit toistuvat uudelleen - Shortsien automaattinen toisto taustalla - Shortsit toistetaan automaattisesti taustalla - Shortsit toistuvat uudelleen taustalla - - - Minisoitin - Muuta sovelluksen sisäisen pienennetyn soittimen tyyliä - Minisoittimen tyyppi - Pois käytöstä - Oletus - Minimaalinen - Tabletti - Moderni 1 - Moderni 2 - Moderni 3 - Moderni 4 - Poista pyöristetyt kulmat käytöstä - Kulmat ovat suorakulmaisia - Kulmat on pyöristetty - Ota kaksoisnapautus ja koon muuttaminen nipistämällä käyttöön - "Kaksoisnapautustoiminto ja koon muuttaminen nipistämällä ovat käytössä + Aloitussivu vaihdetaan vain sovelluksen käynnistyessä + + + Poista Shorts-soittimen jatkaminen käytöstä + Shorts-soitin ei jatka sovelluksen käynnistyessä + Shorts-soitin jatkaa sovelluksen käynnistyessä + + + Shortsien avaustapa + Shorts-soitin + Tavallinen soitin + Tavallinen soitin kokoruututilassa + + + Toista Shortsit automaattisesti + Shortsit toistetaan automaattisesti + Shortsit toistuvat uudelleen + Shortsien automaattinen toisto taustalla + Shortsit toistetaan automaattisesti taustalla + Shortsit toistuvat uudelleen taustalla + + + Minisoitin + Muuta sovelluksen sisäisen pienennetyn soittimen tyyliä + Minisoittimen tyyppi + Pois käytöstä + Oletus + Minimaalinen + Tabletti + Moderni 1 + Moderni 2 + Moderni 3 + Moderni 4 + Poista pyöristetyt kulmat käytöstä + Kulmat ovat suorakulmaisia + Kulmat on pyöristetty + Ota kaksoisnapautus ja koon muuttaminen nipistämällä käyttöön + "Kaksoisnapautustoiminto ja koon muuttaminen nipistämällä ovat käytössä • Kaksoisnapauta suurentaaksesi minisoittimen kokoa • Kaksoisnapauta uudelleen alkuperäisen koon palauttamiseksi" - Kaksoisnapautustoiminto ja koon muuttaminen nipistämällä eivät olet käytössä - Poista vedä ja pudota käytöstä - Vedä ja pudota ei ole käytössä - "Vedä ja pudota on käytössä + Kaksoisnapautustoiminto ja koon muuttaminen nipistämällä eivät olet käytössä + Poista vedä ja pudota käytöstä + Vedä ja pudota ei ole käytössä + "Vedä ja pudota on käytössä Minisoitin voidaan vetää mihin tahansa näytön kulmaan" - Poista vaakasuuntainen vetoele käytöstä - Vaakasuuntainen vetoele ei ole käytössä - "Vaakasuuntainen vetoele on käytössä + Poista vaakasuuntainen vetoele käytöstä + Vaakasuuntainen vetoele ei ole käytössä + "Vaakasuuntainen vetoele on käytössä Minisoitin voidaan vetää pois näytöltä vasemmalle tai oikealle" - Piilota peittokuvan painikkeet - Peittokuvan painikkeet piilotetaan - Peittokuvan painikkeet näytetään - Piilota laajenna- ja sulje-painikkeet - "Painikkeet on piilotettu + Piilota peittokuvan painikkeet + Peittokuvan painikkeet piilotetaan + Peittokuvan painikkeet näytetään + Piilota laajenna- ja sulje-painikkeet + "Painikkeet on piilotettu Pyyhkäise laajentaaksesi tai sulkeaksesi" - Laajenna- ja sulje-painikkeet näytetään - Piilota alatekstit - Alatekstit piilotetaan - Alatekstit näytetään - Piilota eteenpäin- ja taaksepäin-painikkeet - Eteenpäin ja taaksepäin on piilotettu - Eteenpäin ja taaksepäin näytetään - Aloituskoko - Alkuperäinen näyttökoko pikseleinä - Pikselikoon tulee olla %1$s ja %2$s välillä - Peittokuvan läpinäkymättömyys - Läpinäkymättömyysarvo välillä 0–100, jossa 0 on läpinäkyvä - Minisoittimen peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä - - - Ota liukuvärillinen latausruutu käyttöön - Latausruudulla on liukuvärillinen tausta - Latausruudulla on yksivärinen tausta - Aloitussivun tyyli - Väri - Mustavalkoinen - Ota mukautettu etenemispalkin väri käyttöön - Mukautettu etenemispalkin väri näytetään - Alkuperäinen etenemispalkin väri näytetään - Mukautettu etenemispalkin väri - Etenemispalkin väri - Mukautettu etenemispalkin korostusväri - Etenemispalkin korostusväri - Virheellinen etenemispalkin väriarvo - - - YouTube ReVanced - YT ReVanced - YT - - - Ylätunnisteen logo - Oletus - Tavallinen - Premium - ReVanced - - ReVanced, minimaalinen - Mukautettu - - - Ohita kuvien alueelliset rajoitukset - Käyttämällä kuvan isäntä yt4.ggpht.com - "Käytetään alkuperäistä kuvien isäntää + Laajenna- ja sulje-painikkeet näytetään + Piilota alatekstit + Alatekstit piilotetaan + Alatekstit näytetään + Piilota eteenpäin- ja taaksepäin-painikkeet + Eteenpäin ja taaksepäin on piilotettu + Eteenpäin ja taaksepäin näytetään + Aloituskoko + Alkuperäinen näyttökoko pikseleinä + Pikselikoon tulee olla %1$s ja %2$s välillä + Peittokuvan läpinäkymättömyys + Läpinäkymättömyysarvo välillä 0–100, jossa 0 on läpinäkyvä + Minisoittimen peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä + + + Ota liukuvärillinen latausruutu käyttöön + Latausruudulla on liukuvärillinen tausta + Latausruudulla on yksivärinen tausta + Aloitussivun tyyli + Väri + Mustavalkoinen + Ota mukautettu etenemispalkin väri käyttöön + Mukautettu etenemispalkin väri näytetään + Alkuperäinen etenemispalkin väri näytetään + Mukautettu etenemispalkin väri + Etenemispalkin väri + Mukautettu etenemispalkin korostusväri + Etenemispalkin korostusväri + Virheellinen etenemispalkin väriarvo + + + YouTube ReVanced + YT ReVanced + YT + + + Ylätunnisteen logo + Oletus + Tavallinen + Premium + ReVanced + + ReVanced, minimaalinen + Mukautettu + + + Ohita kuvien alueelliset rajoitukset + Käyttämällä kuvan isäntä yt4.ggpht.com + "Käytetään alkuperäistä kuvien isäntää Tämä voi korjata puuttuvat kuvat, jotka on estetty tietyillä alueilla" - - - - Koti-välilehti - - Tilaukset-välilehti - - Sinä-välilehti - Soittimen soittolistat ja suositukset - Hakutulokset - Alkuperäiset pikkukuvat - Alkuperäiset ja DeArrow-pikkukuvat - DeArrow- ja kuvakaappaukset - Kuvakaappaukset - DeArrow - "DeArrow tarjoaa YouTube-videoille joukkoistettuja pikkukuvia. Nämä pikkukuvat ovat usein osuvampia kuin YouTuben tarjoamat pikkukuvat. + + + + Koti-välilehti + + Tilaukset-välilehti + + Sinä-välilehti + Soittimen soittolistat ja suositukset + Hakutulokset + Alkuperäiset pikkukuvat + Alkuperäiset ja DeArrow-pikkukuvat + DeArrow- ja kuvakaappaukset + Kuvakaappaukset + DeArrow + "DeArrow tarjoaa YouTube-videoille joukkoistettuja pikkukuvia. Nämä pikkukuvat ovat usein osuvampia kuin YouTuben tarjoamat pikkukuvat. Jos tämä on käytössä, videoiden URL-osoitteet lähetetään API-palvelimelle, mutta muita tietoja ei lähetetä. Jos videolla ei ole DeArrow- pikkukuvia, näytetään alkuperäisiä pikkukuvia tai kuvakaappauksia. Napauta tästä saadaksesi lisätietoja DeArrowista" - Näytä ponnahdusilmoitus, jos API ei ole käytettävissä - Ponnahdusilmoitus näytetään, jos DeArrow ei ole käytettävissä - Ponnahdusilmoitusta ei näytetä, jos DeArrow ei ole käytettävissä - DeArrow:n API-päätepiste - DeArrow-pikkukuvien välimuistipäätepisteen URL-osoite - Videon kuvakaappaukset - Kuvakaappaukset otetaan kunkin videon alusta/keskeltä/lopusta. Nämä kuvat on sisäänrakennettu YouTubeen, eikä ulkoista API:a käytetä - Ota nopeat kuvakaappaukset käyttöön - Käytetään keskilaatuisia kuvakaappauksia. Pikkukuvat latautuvat nopeammin, mutta livestriimeillä, julkaisemattomilla, tai hyvin vanhoilla videoilla saattaa näkyä tyhjiä pikkukuvia - Käytetään korkealaatuisia kuvakaappauksia - Videon aika, josta kuvakaappaukset otetaan - Videon alku - Videon keskikohta - Videon loppu - - DeArrow ei ole tilapäisesti käytettävissä (tila: %s) - DeArrow ei ole tilapäisesti käytettävissä - - - Näytä ReVanced-tiedotukset - Tiedotukset näytetään käynnistettäessä - Tiedotuksia ei näytetä käynnistettäessä - Näytä tiedotukset käynnistettäessä - Yhteyden muodostaminen tietodusten tarjoajaan epäonnistui - Hylkää - - - Ota jatkuva toisto käyttöön - Videota toistetaan jatkuvasti - Videota ei toisteta jatkuvasti - - - Näytä jatkuva toisto -painike - Painike näytetään - Painiketta ei näytetä - Jatkuva toisto on käytössä - Jatkuva toisto ei ole käytössä - - - Keskeytä muun äänen alkaessa - Toisto keskeytyy, kun toistetaan muuta ääntä (esim. navigointi) - Äänenvoimakkuus laskee, kun muuta ääntä toistetaan - - - Naamioi laitteen mitat - "Laitteen mitat naamioidaan + Näytä ponnahdusilmoitus, jos API ei ole käytettävissä + Ponnahdusilmoitus näytetään, jos DeArrow ei ole käytettävissä + Ponnahdusilmoitusta ei näytetä, jos DeArrow ei ole käytettävissä + DeArrow:n API-päätepiste + DeArrow-pikkukuvien välimuistipäätepisteen URL-osoite + Videon kuvakaappaukset + Kuvakaappaukset otetaan kunkin videon alusta/keskeltä/lopusta. Nämä kuvat on sisäänrakennettu YouTubeen, eikä ulkoista API:a käytetä + Ota nopeat kuvakaappaukset käyttöön + Käytetään keskilaatuisia kuvakaappauksia. Pikkukuvat latautuvat nopeammin, mutta livestriimeillä, julkaisemattomilla, tai hyvin vanhoilla videoilla saattaa näkyä tyhjiä pikkukuvia + Käytetään korkealaatuisia kuvakaappauksia + Videon aika, josta kuvakaappaukset otetaan + Videon alku + Videon keskikohta + Videon loppu + + DeArrow ei ole tilapäisesti käytettävissä (tila: %s) + DeArrow ei ole tilapäisesti käytettävissä + + + Näytä ReVanced-tiedotukset + Tiedotukset näytetään käynnistettäessä + Tiedotuksia ei näytetä käynnistettäessä + Näytä tiedotukset käynnistettäessä + Yhteyden muodostaminen tietodusten tarjoajaan epäonnistui + Hylkää + + + Ota jatkuva toisto käyttöön + Videota toistetaan jatkuvasti + Videota ei toisteta jatkuvasti + + + Näytä jatkuva toisto -painike + Painike näytetään + Painiketta ei näytetä + Jatkuva toisto on käytössä + Jatkuva toisto ei ole käytössä + + + Keskeytä muun äänen alkaessa + Toisto keskeytyy, kun toistetaan muuta ääntä (esim. navigointi) + Äänenvoimakkuus laskee, kun muuta ääntä toistetaan + + + Naamioi laitteen mitat + "Laitteen mitat naamioidaan Korkealaatuisemmat videot saattavat avautua, mutta videotoisto voi tökkiä, akun kesto voi huonontua ja tuntemattomia sivuvaikutuksia voi esiintyä" - "Laitteen mittoja ei naamioida + "Laitteen mittoja ei naamioida Tämä voi avata korkealaatuisemmat videot" - Tämän käyttöönotto voi aiheuttaa videotoiston tökkimistä, huonompaa akun kestoa ja tuntemattomia sivuvaikutuksia. - - - Haptinen palaute - Muuta haptista palautetta - Poista videon osien haptiikka käytöstä - Videon osien haptiikka ei ole käytössä - Videon osien haptiikka on käytössä - Poista tarkan etsintäeleen haptiikka käytöstä - Tarkan etsinnän haptiikka ei ole käytössä - Tarkan etsinnän haptiikka on käytössä - Poista etsinnän kumoamisen haptiikka käytöstä - Etsinnän kumoamisen haptiikka ei ole käytössä - Etsinnän kumoamisen haptiikka on käytössä - Poista zoomaushaptiikka käytöstä - Zoomaushaptiikka ei ole käytössä - Zoomaushaptiikka on käytössä - - - Jos olet äskettäin muuttanut tilisi kirjautumistietoja, poista ja asenna MicroG uudelleen. - - - Ohita URL-osoitteen uudelleenohjaukset - URL-osoitteen uudelleenohjaukset ohitetaan - URL-osoitteen uudelleenohjauksia ei ohiteta - - - Avaa linkit selaimessa - Linkit avataan ulkoisessa selaimessa - Linkit avataan sovelluksen sisäisessä selaimessa - - - - Automaattinen - Muista videolaadun muutokset - Laatumuutokset koskevat kaikkia videoita - Laatumuutokset koskevat vain nykyistä videota - Näytä ponnahdusilmoitus videon laatua muutettaessa - Ponnahdusilmoitus näytetään videon oletuslaatua muutettaessa - Ponnahdusilmoitusta ei näytetä videon oletuslaatua muutettaessa - Videon oletuslaatu Wi-Fi-verkossa - Videon oletuslaatu mobiiliverkossa - Muista Shortsien laadun muutokset - Laatumuutokset koskevat kaikkia Shortseja - Laatumuutokset koskevat vain nykyistä Shorttia - Shorts-oletuslaatu Wi-Fi-verkossa - Shorts-oletuslaatu mobiiliverkossa - mobiili - Wi-Fi - %1$s-oletuslaatu muutettiin: %2$s - Shortsien %1$s-laatu muutettiin: %2$s - - - Näytä nopeuden valintapainike - Nopeusasetusten painike näytetään. Paina pitkään palauttaaksesi toistonopeuden oletukseksi. - Nopeusasetusten painiketta ei näytetä - - - Näytä videolaatupainike - Videolaadun painike näytetään. Paina pitkään palauttaaksesi laadun oletukseksi. - Videolaadun painiketta ei näytetä - - - Mukautettu toistonopeusvalikko - Mukautettu nopeusvalikko näytetään - Mukautettua nopeusvalikkoa ei näytetä - Palauta vanha toistonopeusvalikko - Vanha nopeusvalikko näytetään - Moderni nopeusvalikko näytetään - Mukautetut toistonopeudet - Lisää tai muuta mukautettuja toistonopeuksia - Mukautettujen nopeuksien tulee olla alle %s - Virheelliset mukautetut toistonopeudet - Automaattinen - Mukautettu napauta ja pidä pohjassa -nopeus - Toistonopeus 0–8 välillä - - - Muista toistonopeuden muutokset - Toistonopeuden muutokset koskevat kaikkia videoita - Toistonopeuden muutokset koskevat vain nykyistä videota - Näytä ponnahdusilmoitus toistonopeutta muutettaessa - Ponnahdusilmoitus näytetään oletustoistonopeutta muutettaessa - Ponnahdusilmoitus ei näytetä oletustoistonopeutta muutettaessa - Toiston oletusnopeus - Toiston oletusnopeus muutettiin: %s - - - Poista HDR-video käytöstä - HDR-video ei ole käytössä - HDR-video on käytössä - Pakota AVC (H.264) - Videokoodekiksi pakotetaan AVC (H.264) - Videokoodekki määritetään automaattisesti - "Hyödyt: + Tämän käyttöönotto voi aiheuttaa videotoiston tökkimistä, huonompaa akun kestoa ja tuntemattomia sivuvaikutuksia. + + + Haptinen palaute + Muuta haptista palautetta + Poista videon osien haptiikka käytöstä + Videon osien haptiikka ei ole käytössä + Videon osien haptiikka on käytössä + Poista tarkan etsintäeleen haptiikka käytöstä + Tarkan etsinnän haptiikka ei ole käytössä + Tarkan etsinnän haptiikka on käytössä + Poista etsinnän kumoamisen haptiikka käytöstä + Etsinnän kumoamisen haptiikka ei ole käytössä + Etsinnän kumoamisen haptiikka on käytössä + Poista zoomaushaptiikka käytöstä + Zoomaushaptiikka ei ole käytössä + Zoomaushaptiikka on käytössä + + + Jos olet äskettäin muuttanut tilisi kirjautumistietoja, poista ja asenna MicroG uudelleen. + + + Ohita URL-osoitteen uudelleenohjaukset + URL-osoitteen uudelleenohjaukset ohitetaan + URL-osoitteen uudelleenohjauksia ei ohiteta + + + Avaa linkit selaimessa + Linkit avataan ulkoisessa selaimessa + Linkit avataan sovelluksen sisäisessä selaimessa + + + + Automaattinen + Muista videolaadun muutokset + Laatumuutokset koskevat kaikkia videoita + Laatumuutokset koskevat vain nykyistä videota + Näytä ponnahdusilmoitus videon laatua muutettaessa + Ponnahdusilmoitus näytetään videon oletuslaatua muutettaessa + Ponnahdusilmoitusta ei näytetä videon oletuslaatua muutettaessa + Videon oletuslaatu Wi-Fi-verkossa + Videon oletuslaatu mobiiliverkossa + Muista Shortsien laadun muutokset + Laatumuutokset koskevat kaikkia Shortseja + Laatumuutokset koskevat vain nykyistä Shorttia + Shorts-oletuslaatu Wi-Fi-verkossa + Shorts-oletuslaatu mobiiliverkossa + mobiili + Wi-Fi + %1$s-oletuslaatu muutettiin: %2$s + Shortsien %1$s-laatu muutettiin: %2$s + + + Näytä nopeuden valintapainike + Nopeusasetusten painike näytetään. Paina pitkään palauttaaksesi toistonopeuden oletukseksi. + Nopeusasetusten painiketta ei näytetä + + + Näytä videolaatupainike + Videolaadun painike näytetään. Paina pitkään palauttaaksesi laadun oletukseksi. + Videolaadun painiketta ei näytetä + + + Mukautettu toistonopeusvalikko + Mukautettu nopeusvalikko näytetään + Mukautettua nopeusvalikkoa ei näytetä + Palauta vanha toistonopeusvalikko + Vanha nopeusvalikko näytetään + Moderni nopeusvalikko näytetään + Mukautetut toistonopeudet + Lisää tai muuta mukautettuja toistonopeuksia + Mukautettujen nopeuksien tulee olla alle %s + Virheelliset mukautetut toistonopeudet + Automaattinen + Mukautettu napauta ja pidä pohjassa -nopeus + Toistonopeus 0–8 välillä + + + Muista toistonopeuden muutokset + Toistonopeuden muutokset koskevat kaikkia videoita + Toistonopeuden muutokset koskevat vain nykyistä videota + Näytä ponnahdusilmoitus toistonopeutta muutettaessa + Ponnahdusilmoitus näytetään oletustoistonopeutta muutettaessa + Ponnahdusilmoitus ei näytetä oletustoistonopeutta muutettaessa + Toiston oletusnopeus + Toiston oletusnopeus muutettiin: %s + + + Poista HDR-video käytöstä + HDR-video ei ole käytössä + HDR-video on käytössä + Pakota AVC (H.264) + Videokoodekiksi pakotetaan AVC (H.264) + Videokoodekki määritetään automaattisesti + "Hyödyt: • Voi parantaa akunkestoa • Voi palauttaa puuttuvia videoresoluutioita vanhemmilla laitteilla @@ -1671,182 +1670,182 @@ Rajoitukset: • Videon toisto kuluttaa enemmän mobiilidataa kuin VP9 tai AV1 • HDR-videot eivät käytä AVC:tä • Jotkin laitteet eivät voi pakottaa AVC:tä" - - - Näytä edistynyt videolaatuvalikko - Edistynyt videolaatuvalikko näytetään - Edistynyttä videolaatuvalikkoa ei näytetä - - - Ota kelaus liu\'uttamalla käyttöön - Kelaus liu\'uttamalla on käytössä - Kelaus liu\'uttamalla ei ole käytössä - - - Salli Android VR AV1 - "Videokoodekki on AVC (H.264), VP9 tai AV1 + + + Näytä edistynyt videolaatuvalikko + Edistynyt videolaatuvalikko näytetään + Edistynyttä videolaatuvalikkoa ei näytetä + + + Ota kelaus liu\'uttamalla käyttöön + Kelaus liu\'uttamalla on käytössä + Kelaus liu\'uttamalla ei ole käytössä + + + Salli Android VR AV1 + "Videokoodekki on AVC (H.264), VP9 tai AV1 Toisto saattaa pätkiä" - Videokoodekki on AVC (H.264) tai VP9 - "Tämän asetuksen käyttöönotto saattaa käyttää ohjelmistopohjaista AV1-dekoodausta. + Videokoodekki on AVC (H.264) tai VP9 + "Tämän asetuksen käyttöönotto saattaa käyttää ohjelmistopohjaista AV1-dekoodausta. AV1-videon toisto saattaa pätkiä." - Naamioimisen sivuvaikutukset - • Kokeellinen asiakasohjelma, joka saattaa lakata toimimasta milloin tahansa - • Video saattaa pysähtyä aikaan 1:00, tai ei välttämättä ole saatavilla joillakin alueilla - • Ääniraitavalikko puuttuu - • Ei AV1-videokoodekkia - • Tasainen äänenvoimakkuus ei ole käytettävissä - • Lasten videot eivät ehkä toistu, kun olet kirjautunut ulos tai incognito-tilassa - - • Pakota alkuperäinen ääni ei ole käytettävissä - Näytä teknisissä tiedoissa - Asiakastyyppi näytetään teknisissä tiedoissa - Asiakastyyppi piilotetaan teknisissä tiedoissa - - - - - YT Music ReVanced - Music ReVanced - Music - - - Tietoja - Mainokset - Yleiset - Soitin - Sekalaiset - - - Piilota videomainokset - Videomainokset piilotetaan - Videomainokset näytetään - - - Ota pysyvä toisto käyttöön - Pysyvä toisto on käytössä - Pysyvä toisto ei ole käytössä - - - Piilota Cast-painike - Cast-painike piilotetaan - Cast-painike näytetään - Piilota historia-painike - Historia-painike piilotetaan - Historia-painike näytetään - Piilota ilmoituspainike - Ilmoituspainike piilotetaan - Ilmoituspainike näytetään - Piilota hakupainike - Hakupainike piilotetaan - Hakupainike näytetään - - - Piilota kategoriapalkki - Kategoriapalkki piilotetaan - Kategoriapalkki näytetään - - - Muuta minisoittimen väriä - Minisoittimen väri vastaa kokoruudun soitinta - Minisoitin käyttää oletusväriä - - - Navigointipalkki - Piilota tai muuta navigointipalkin painikkeita - - Piilota Koti - Koti-painike piilotetaan - Koti-painike näytetään - - Piilota Samples - Samples-painike piilotetaan - Samples-painike näytetään - - Piilota Tutki - Tutustu-painike piilotetaan - Tutki-painike näytetään - - Piilota Kirjasto - Kirjasto-painike piilotetaan - Kirjasto-painike näytetään - - Piilota Päivitä - Päivitä-painike piilotetaan - Päivitä-painike näytetään - Piilota navigointipalkki - Navigointipalkki piilotetaan - Navigointipalkki näytetään - Piilota navigointipainikkeiden tunnisteet - Tunnisteet on piilotettu - Tunnisteet näytetään - - - Piilota \"Hanki Music Premium\" -tunniste - Tunniste piilotetaan - Tunniste näytetään - - - Piilota päivitä-painike - Painike piilotetaan - Painike näytetään - - - - - Estä äänimainokset - Äänimainokset estetään - Äänimainoksia ei estetä - - - %s ei ole käytettävissä, mainoksia saattaa näkyä. Kokeile muuttaa mainosten estopalvelua asetuksissa. - %s palautti virheen, mainoksia saattaa näkyä. Kokeile muuttaa mainosten estopalvelua asetuksissa. - Estä upotetut videomainokset - Pois käytöstä - Luminous-välityspalvelin - PurpleAdBlock-välityspalvelin - - - Estä videomainokset - Videomainokset estetään - Videomainoksia ei estetä - - - Viesti poistettiin - Näytä poistetut viestit - Älä näytä poistettuja viestejä - Piilota poistetut viestit spoilereilla - Näytä poistetut viestit yliviivattuna tekstinä - - - Lunasta kanavapisteet automaattisesti - Kanavapisteet lunastetaan automaattisesti - Kanavapisteitä ei lunasteta automaattisesti - - - - Ota Twitch-virheenkorjaustila käyttöön - Twitch-virheenkorjaustila on käytössä (ei suositeltu) - Twitch-virheenkorjaustila ei ole käytössä - - - ReVanced-asetukset - Tietoja - Tietoja ReVancedista - Mainostenesto - Mainostenestoasetukset - Chat - Chat-asetukset - Sekalaiset - Sekalaiset asetukset - Yleiset asetukset - Muut asetukset - Asiakaspuolen mainokset - Palvelinpuolen surestream-mainokset - Virheenkorjauksen kirjaaminen - Virheenkorjauslokit ovat käytössä - Virheenkorjauslokit eivät ole käytössä - - + Naamioimisen sivuvaikutukset + • Kokeellinen asiakasohjelma, joka saattaa lakata toimimasta milloin tahansa + • Video saattaa pysähtyä aikaan 1:00, tai ei välttämättä ole saatavilla joillakin alueilla + • Ääniraitavalikko puuttuu + • Ei AV1-videokoodekkia + • Tasainen äänenvoimakkuus ei ole käytettävissä + • Lasten videot eivät ehkä toistu, kun olet kirjautunut ulos tai incognito-tilassa + + • Pakota alkuperäinen ääni ei ole käytettävissä + Näytä teknisissä tiedoissa + Asiakastyyppi näytetään teknisissä tiedoissa + Asiakastyyppi piilotetaan teknisissä tiedoissa + + + + + YT Music ReVanced + Music ReVanced + Music + + + Tietoja + Mainokset + Yleiset + Soitin + Sekalaiset + + + Piilota videomainokset + Videomainokset piilotetaan + Videomainokset näytetään + + + Ota pysyvä toisto käyttöön + Pysyvä toisto on käytössä + Pysyvä toisto ei ole käytössä + + + Piilota Cast-painike + Cast-painike piilotetaan + Cast-painike näytetään + Piilota historia-painike + Historia-painike piilotetaan + Historia-painike näytetään + Piilota ilmoituspainike + Ilmoituspainike piilotetaan + Ilmoituspainike näytetään + Piilota hakupainike + Hakupainike piilotetaan + Hakupainike näytetään + + + Piilota kategoriapalkki + Kategoriapalkki piilotetaan + Kategoriapalkki näytetään + + + Muuta minisoittimen väriä + Minisoittimen väri vastaa kokoruudun soitinta + Minisoitin käyttää oletusväriä + + + Navigointipalkki + Piilota tai muuta navigointipalkin painikkeita + + Piilota Koti + Koti-painike piilotetaan + Koti-painike näytetään + + Piilota Samples + Samples-painike piilotetaan + Samples-painike näytetään + + Piilota Tutki + Tutustu-painike piilotetaan + Tutki-painike näytetään + + Piilota Kirjasto + Kirjasto-painike piilotetaan + Kirjasto-painike näytetään + + Piilota Päivitä + Päivitä-painike piilotetaan + Päivitä-painike näytetään + Piilota navigointipalkki + Navigointipalkki piilotetaan + Navigointipalkki näytetään + Piilota navigointipainikkeiden tunnisteet + Tunnisteet on piilotettu + Tunnisteet näytetään + + + Piilota \"Hanki Music Premium\" -tunniste + Tunniste piilotetaan + Tunniste näytetään + + + Piilota päivitä-painike + Painike piilotetaan + Painike näytetään + + + + + Estä äänimainokset + Äänimainokset estetään + Äänimainoksia ei estetä + + + %s ei ole käytettävissä, mainoksia saattaa näkyä. Kokeile muuttaa mainosten estopalvelua asetuksissa. + %s palautti virheen, mainoksia saattaa näkyä. Kokeile muuttaa mainosten estopalvelua asetuksissa. + Estä upotetut videomainokset + Pois käytöstä + Luminous-välityspalvelin + PurpleAdBlock-välityspalvelin + + + Estä videomainokset + Videomainokset estetään + Videomainoksia ei estetä + + + Viesti poistettiin + Näytä poistetut viestit + Älä näytä poistettuja viestejä + Piilota poistetut viestit spoilereilla + Näytä poistetut viestit yliviivattuna tekstinä + + + Lunasta kanavapisteet automaattisesti + Kanavapisteet lunastetaan automaattisesti + Kanavapisteitä ei lunasteta automaattisesti + + + + Ota Twitch-virheenkorjaustila käyttöön + Twitch-virheenkorjaustila on käytössä (ei suositeltu) + Twitch-virheenkorjaustila ei ole käytössä + + + ReVanced-asetukset + Tietoja + Tietoja ReVancedista + Mainostenesto + Mainostenestoasetukset + Chat + Chat-asetukset + Sekalaiset + Sekalaiset asetukset + Yleiset asetukset + Muut asetukset + Asiakaspuolen mainokset + Palvelinpuolen surestream-mainokset + Virheenkorjauksen kirjaaminen + Virheenkorjauslokit ovat käytössä + Virheenkorjauslokit eivät ole käytössä + + diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 63bbcd0a7f..29e52989e5 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -17,1256 +17,1255 @@ "First 'item' text Second \"item\" text" ---> - - - - Pangalan ng app - - Pasadyang - Icon ng app - Orihinal - - ReVanced naka-scale - - Pasadyang - - - Nabigo ang mga pagsusuri - Buksan ang Opisyal na Website - Balewalain - <h5>Ang app na ito ay tila hindi mo na-patch.</h5><br>Ang app na ito ay maaaring hindi gumana nang maayos, <b>maaaring mapanganib o maging delikado gamitin</b>.<br><br>Ang mga tseke na ito ay nagpapahiwatig na ang app na ito ay na-pre-patch o nakuha mula sa ibang tao:<br><br><small>%1$s</small><br>Malakas na inirerekomenda na <b>i-uninstall ang app na ito at i-patch ito sa iyong sarili</b> upang matiyak na gumagamit ka ng isang na-validate at ligtas na app.<p><br>Kung hindi papansinin, ang babalang ito ay ipapakita lamang nang dalawang beses. - Naka-patch sa ibang device - Hindi naka-install sa pamamagitan ng ReVanced Manager - Naka-patch mahigit sa 10 minuto ang nakararaan - Naka-patch %s araw ang nakalipas - Ang petsa ng pagbuo ng APK ay sira - - - Paunawa ng ReVanced - Hindi nai-save ang iyong kasaysayan ng panonood.<br><br>Karaniwang sanhi nito ay ang DNS ad blocker o network proxy.<br><br>Para maayos ito, i-whitelist ang <b>s.youtube.com</b> o i-off ang lahat ng DNS blocker at proxy. - Huwag ipakitang muli - - - Mga Setting - Sigurado ka bang gusto mong magpatuloy? - I-save - I-reset - I-reset ang kulay - Hindi wasto ang kulay - Kinakailangan ang pag-restart - I-restart ang app para magkabisa ang pagbabagong ito. - I-restart - Angkat - Kopya - I-reset ang mga ReVanced na setting sa default - Na-import ang %d na mga setting - Nabigo ang pag-import: %s - Maghanap ng mga setting - Walang nakitang resulta para sa \'%s\' - Subukan ang ibang keyword - Mga kamakailang paghahanap - Alisin sa history ng paghahanap? - I-clear ang history ng paghahanap - Sigurado ka bang gusto mong i-clear ang lahat ng history ng paghahanap? - Mga Tip sa Paghahanap - "• I-tap ang isang landas upang mag-navigate dito +--> + + + Pangalan ng app + + Pasadyang + Icon ng app + Orihinal + + ReVanced naka-scale + + Pasadyang + + + Nabigo ang mga pagsusuri + Buksan ang Opisyal na Website + Balewalain + <h5>Ang app na ito ay tila hindi mo na-patch.</h5><br>Ang app na ito ay maaaring hindi gumana nang maayos, <b>maaaring mapanganib o maging delikado gamitin</b>.<br><br>Ang mga tseke na ito ay nagpapahiwatig na ang app na ito ay na-pre-patch o nakuha mula sa ibang tao:<br><br><small>%1$s</small><br>Malakas na inirerekomenda na <b>i-uninstall ang app na ito at i-patch ito sa iyong sarili</b> upang matiyak na gumagamit ka ng isang na-validate at ligtas na app.<p><br>Kung hindi papansinin, ang babalang ito ay ipapakita lamang nang dalawang beses. + Naka-patch sa ibang device + Hindi naka-install sa pamamagitan ng ReVanced Manager + Naka-patch mahigit sa 10 minuto ang nakararaan + Naka-patch %s araw ang nakalipas + Ang petsa ng pagbuo ng APK ay sira + + + Paunawa ng ReVanced + Hindi nai-save ang iyong kasaysayan ng panonood.<br><br>Karaniwang sanhi nito ay ang DNS ad blocker o network proxy.<br><br>Para maayos ito, i-whitelist ang <b>s.youtube.com</b> o i-off ang lahat ng DNS blocker at proxy. + Huwag ipakitang muli + + + Mga Setting + Sigurado ka bang gusto mong magpatuloy? + I-save + I-reset + I-reset ang kulay + Hindi wasto ang kulay + Kinakailangan ang pag-restart + I-restart ang app para magkabisa ang pagbabagong ito. + I-restart + Angkat + Kopya + I-reset ang mga ReVanced na setting sa default + Na-import ang %d na mga setting + Nabigo ang pag-import: %s + Maghanap ng mga setting + Walang nakitang resulta para sa \'%s\' + Subukan ang ibang keyword + Mga kamakailang paghahanap + Alisin sa history ng paghahanap? + I-clear ang history ng paghahanap + Sigurado ka bang gusto mong i-clear ang lahat ng history ng paghahanap? + Mga Tip sa Paghahanap + "• I-tap ang isang landas upang mag-navigate dito • Pindutin nang matagal ang isang setting upang mag-navigate dito • Pindutin ang Enter upang i-save ang isang query sa paghahanap sa kasaysayan • Hindi isinasaalang-alang ng paghahanap ang casing at bantas • Lumilitaw ang mga setting ng magulang sa itaas ng mga disabled na setting ng anak" - Walang laman ang kasaysayan ng paghahanap - Upang i-save ang kasaysayan ng paghahanap, mag-type ng query sa paghahanap at pindutin ang Enter - Ipakita ang history ng paghahanap sa mga setting - Ipinapakita ang history ng paghahanap sa mga setting - Hindi ipinapakita ang kasaysayan ng paghahanap sa Mga Setting - Ipakita ang mga icon ng setting ng ReVanced - Ipinapakita ang mga icon ng setting - Hindi ipinapakita ang mga icon ng setting - Wika ng ReVanced - "Maaaring nawawala o hindi kumpleto ang mga pagsasalin para sa ilang wika. + Walang laman ang kasaysayan ng paghahanap + Upang i-save ang kasaysayan ng paghahanap, mag-type ng query sa paghahanap at pindutin ang Enter + Ipakita ang history ng paghahanap sa mga setting + Ipinapakita ang history ng paghahanap sa mga setting + Hindi ipinapakita ang kasaysayan ng paghahanap sa Mga Setting + Ipakita ang mga icon ng setting ng ReVanced + Ipinapakita ang mga icon ng setting + Hindi ipinapakita ang mga icon ng setting + Wika ng ReVanced + "Maaaring nawawala o hindi kumpleto ang mga pagsasalin para sa ilang wika. Upang isalin ang mga bagong wika o pagbutihin ang kasalukuyang mga pagsasalin, bisitahin ang translate.revanced.app" - Wika ng app - Mag-import / Mag-export - I-import / I-export ang mga setting ng ReVanced - - Gumagamit ka ng bersyon ng ReVanced Patches <i>%s</i> - Tandaan - Ang bersyon na ito ay isang pre-release at maaari kang makaranas ng mga hindi inaasahang isyu - Mga opisyal na link - + Gumagamit ka ng bersyon ng ReVanced Patches <i>%s</i> + Tandaan + Ang bersyon na ito ay isang pre-release at maaari kang makaranas ng mga hindi inaasahang isyu + Mga opisyal na link + - - - Mga Setting ng GmsCore - Mga setting para sa GmsCore - - Hindi naka-install ang MicroG GmsCore. I-install ito. - Kailangan ng aksyon - "Ang MicroG GmsCore ay walang pahintulot na tumakbo sa background. + + + Mga Setting ng GmsCore + Mga setting para sa GmsCore + + Hindi naka-install ang MicroG GmsCore. I-install ito. + Kailangan ng aksyon + "Ang MicroG GmsCore ay walang pahintulot na tumakbo sa background. Sundin ang gabay na \"Huwag patayin ang aking app\" para sa iyong telepono, at ilapat ang mga tagubilin sa iyong pag-install ng MicroG. Kinakailangan ito para gumana ang app." - Buksan ang website - "Ang mga pag-optimize ng baterya ng MicroG GmsCore ay dapat na hindi pinagana upang maiwasan ang mga problema. + Buksan ang website + "Ang mga pag-optimize ng baterya ng MicroG GmsCore ay dapat na hindi pinagana upang maiwasan ang mga problema. Ang pag-disable ng mga pag-optimize ng baterya para sa MicroG ay hindi makakaapekto sa paggamit ng baterya. Tapikin ang pindutan ng pagpapatuloy at payagan ang mga pagbabago sa pag-optimize." - Magpatuloy - - - Pekein ang mga video stream - Pekein ang mga video stream ng client upang maiwasan ang mga isyu sa pag-playback - Spoof ng mga video stream - "Ang mga video stream ay pinapanggap. + Magpatuloy + + + Pekein ang mga video stream + Pekein ang mga video stream ng client upang maiwasan ang mga isyu sa pag-playback + Spoof ng mga video stream + "Ang mga video stream ay pinapanggap. Kung ikaw ay isang user ng YouTube Premium, maaaring hindi kailangan ang setting na ito" - "Hindi pinepeke ang mga video stream + "Hindi pinepeke ang mga video stream Maaaring hindi gumana ang pag-playback" - Ang pag-off sa setting na ito ay maaaring magdulot ng mga isyu sa pag-playback. - Default na kliyente - - - Pilitin ang orihinal na wika ng audio - Ginagamit ang orihinal na wika ng audio - Gumagamit ng default audio - - Para magamit ang feature na ito, palitan ang \'Panggagaya ng mga video stream\' sa anumang client maliban sa Android Studio - - - Pagde-debug - Paganahin o huwag paganahin ang mga opsyon sa pag-debug - Pag-log sa pag-debug - Ang mga debug log ay pinagana - Ang mga debug log ay hindi pinagana - Mga bakas ng stack ng log - Kasama sa mga debug log ang stack trace - Hindi kasama sa mga debug log ang stack trace - Ipakita ang toast sa ReVanced error - Ipinapakita ang Toast kung may naganap na error - Hindi ipinapakita ang Toast kung may naganap na error - "Ang pag-off ng mga toast ng error ay nagtatago ng lahat ng mga abiso ng error ng ReVanced. + Ang pag-off sa setting na ito ay maaaring magdulot ng mga isyu sa pag-playback. + Default na kliyente + + + Pilitin ang orihinal na wika ng audio + Ginagamit ang orihinal na wika ng audio + Gumagamit ng default audio + + Para magamit ang feature na ito, palitan ang \'Panggagaya ng mga video stream\' sa anumang client maliban sa Android Studio + + + Pagde-debug + Paganahin o huwag paganahin ang mga opsyon sa pag-debug + Pag-log sa pag-debug + Ang mga debug log ay pinagana + Ang mga debug log ay hindi pinagana + Mga bakas ng stack ng log + Kasama sa mga debug log ang stack trace + Hindi kasama sa mga debug log ang stack trace + Ipakita ang toast sa ReVanced error + Ipinapakita ang Toast kung may naganap na error + Hindi ipinapakita ang Toast kung may naganap na error + "Ang pag-off ng mga toast ng error ay nagtatago ng lahat ng mga abiso ng error ng ReVanced. Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan." - I-export ang mga debug log - Kinokopya ang mga ReVanced debug log sa clipboard - Hindi pinagana ang pag-log ng debug - Walang nakitang mga log - Nakopya ang mga log - Nabigo ang pag-export ng mga log: %s - I-clear ang mga debug log - Iki-clear ang lahat ng nakaimbak na ReVanced debug log - Na-clear ang mga log - Manager ng Mga Flag ng Tampok - Pamahalaan ang mga boolean na flag ng tampok - Mga aktibong flag (%d) - Mga harang na flag (%d) - Maghanap ng mga flag... - Na-save ang mga flag - Na-reset ang mga flag - Nakopya ang mga flag sa clipboard - Mag-log protocol buffer - Kasama sa mga debug log ang proto buffer - Ang mga debug log ay hindi kasama ang proto buffer - "Ang pagpapagana sa setting na ito ay magtatala ng karagdagang data ng layout, kabilang ang on-screen na teksto para sa ilang bahagi ng UI. + I-export ang mga debug log + Kinokopya ang mga ReVanced debug log sa clipboard + Hindi pinagana ang pag-log ng debug + Walang nakitang mga log + Nakopya ang mga log + Nabigo ang pag-export ng mga log: %s + I-clear ang mga debug log + Iki-clear ang lahat ng nakaimbak na ReVanced debug log + Na-clear ang mga log + Manager ng Mga Flag ng Tampok + Pamahalaan ang mga boolean na flag ng tampok + Mga aktibong flag (%d) + Mga harang na flag (%d) + Maghanap ng mga flag... + Na-save ang mga flag + Na-reset ang mga flag + Nakopya ang mga flag sa clipboard + Mag-log protocol buffer + Kasama sa mga debug log ang proto buffer + Ang mga debug log ay hindi kasama ang proto buffer + "Ang pagpapagana sa setting na ito ay magtatala ng karagdagang data ng layout, kabilang ang on-screen na teksto para sa ilang bahagi ng UI. Maaaring makatulong ito na matukoy ang mga bahagi kapag lumilikha ng mga custom na filter. Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng iyong IP address." - - - Linisin ang mga link sa pagbabahagi - Ang parameter ng query sa pagsubaybay ay tinanggal mula sa mga ibinahaging link - Ang parameter ng query sa pagsubaybay ay hindi tinanggal mula sa mga ibinahaging link - Baguhin ang mga link ng pagbabahagi sa youtube.com - Gumagamit ang mga nakabahaging link ng youtube.com - Gumagamit ang mga nakabahaging link ng music.youtube.com - - - Custom na filter - Itago ang mga bahagi gamit ang mga custom na filter - Paganahin ang custom na filter - Naka-enable ang custom na filter - Naka-disable ang custom na filter - Custom na filter - - Listahan ng mga string ng tagabuo ng bahagi ng path na i-filter na pinaghihiwalay ng bagong linya - Di-wastong custom na filter: %s - - - - - Tungkol - Mga ad - Mga alternatibong thumbnail - Magpakain - Pangkalahatan - Manlalaro - Mga kontrol sa pag-swipe - Iba pa - Ibalik ang dating mga menu ng setting - Ipinapakita ang mga lumang menu ng setting - Hindi ipinapakita ang mga lumang menu ng setting - - - I-disable ang pag-playback ng Shorts sa background - Ang pag-playback ng Shorts sa background ay hindi pinagana - Ang pag-playback ng Shorts sa background ay pinagana - - - Itago ang mga album card - Nakatago ang mga card ng album - Ipinapakita ang mga album card - Itago ang mga card ng artist - Nakatago ang mga artist card - Ipinapakita ang mga card ng artist - Itago ang shelf ng chips - Nakatago ang istante ng chips - Ipinapakita ang istante ng chips - Itago ang mga post sa komunidad - Nakatago ang mga post sa komunidad - Ipinapakita ang mga post sa komunidad - Itago ang mga compact na banner - Nakatago ang mga compact na banner - Ang mga compact na banner ay ipinapakita - Itago ang expandable card - Nakago na ang expandable card sa ilalim ng mga video - Ipinapakita ang expandable card sa ilalim ng mga video - Itago ang lumulutang na pindutan ng mikropono - Nakatago ang lumulutang na pindutan ng mikropono sa paghahanap - Ang lumulutang na pindutan ng mikropono sa paghahanap ay ipinapakita - Itago ang mga pahalang na istante - "Ang mga pahalang na shelf ay nakatago, tulad ng: + + + Linisin ang mga link sa pagbabahagi + Ang parameter ng query sa pagsubaybay ay tinanggal mula sa mga ibinahaging link + Ang parameter ng query sa pagsubaybay ay hindi tinanggal mula sa mga ibinahaging link + Baguhin ang mga link ng pagbabahagi sa youtube.com + Gumagamit ang mga nakabahaging link ng youtube.com + Gumagamit ang mga nakabahaging link ng music.youtube.com + + + Custom na filter + Itago ang mga bahagi gamit ang mga custom na filter + Paganahin ang custom na filter + Naka-enable ang custom na filter + Naka-disable ang custom na filter + Custom na filter + + Listahan ng mga string ng tagabuo ng bahagi ng path na i-filter na pinaghihiwalay ng bagong linya + Di-wastong custom na filter: %s + + + + + Tungkol + Mga ad + Mga alternatibong thumbnail + Magpakain + Pangkalahatan + Manlalaro + Mga kontrol sa pag-swipe + Iba pa + Ibalik ang dating mga menu ng setting + Ipinapakita ang mga lumang menu ng setting + Hindi ipinapakita ang mga lumang menu ng setting + + + I-disable ang pag-playback ng Shorts sa background + Ang pag-playback ng Shorts sa background ay hindi pinagana + Ang pag-playback ng Shorts sa background ay pinagana + + + Itago ang mga album card + Nakatago ang mga card ng album + Ipinapakita ang mga album card + Itago ang mga card ng artist + Nakatago ang mga artist card + Ipinapakita ang mga card ng artist + Itago ang shelf ng chips + Nakatago ang istante ng chips + Ipinapakita ang istante ng chips + Itago ang mga post sa komunidad + Nakatago ang mga post sa komunidad + Ipinapakita ang mga post sa komunidad + Itago ang mga compact na banner + Nakatago ang mga compact na banner + Ang mga compact na banner ay ipinapakita + Itago ang expandable card + Nakago na ang expandable card sa ilalim ng mga video + Ipinapakita ang expandable card sa ilalim ng mga video + Itago ang lumulutang na pindutan ng mikropono + Nakatago ang lumulutang na pindutan ng mikropono sa paghahanap + Ang lumulutang na pindutan ng mikropono sa paghahanap ay ipinapakita + Itago ang mga pahalang na istante + "Ang mga pahalang na shelf ay nakatago, tulad ng: • Nagbabagang balita • Ipagpatuloy ang panonood • Galugarin ang higit pang channel • Pinakanauugnay • Pamimili • Panoorin muli" - Ipinapakita ang mga pahalang na istante - Itago ang image shelf - Nakago na ang image shelf sa mga resulta ng paghahanap - Ipinapakita ang image shelf sa mga resulta ng paghahanap - Itago ang mga pinakabagong post - Nakatago ang pinakabagong mga post - Pinakabagong mga post ay ipinapakita - Itago ang mga mix playlist - Nakatago ang mga mix playlist - Ang mga mix playlist ay ipinapakita - Itago ang seksyon ng mga pelikula - Nakatago ang seksyon ng mga pelikula - Ipinapakita ang seksyon ng mga pelikula - - Itago ang button na \"Abisuhan ako\" - Nakatago ang pindutan na Abisuhan ako - Ipinapakita ang pindutan na Abisuhan ako - Itago ang mga Playable - Nakatago ang mga laruin - Ipinapakita ang mga puwedeng laruin - - Itago ang button na \"Ipakita ang higit pa\" - Nakatago ang pindutan na Ipakita pa sa mga resulta ng paghahanap - Ipinapakita ang pindutan na Ipakita pa sa mga resulta ng paghahanap - Itago ang mga survey - Nakatago ang mga survey - Ipinapakita ang mga survey - Itago ang shelf ng ticket - Nakatago ang ticket shelf - Ipinapakita ang ticket shelf - - Itago ang mga label ng rekomendasyon ng video - Ang mga label na \'Pinanood din ng iba\' at \'Maaaring magustuhan mo rin\' sa mga resulta ng paghahanap ay nakatago - Ang mga label na \'Pinanood din ng iba\' at \'Maaaring magustuhan mo rin\' sa mga resulta ng paghahanap ay ipinapakita - Itago ang biswal na espasyo - Ang biswal na espasyo ay nakatago - Ang biswal na espasyo ay ipinapakita - - Itago ang mga Doodles ng YouTube - Nakatago ang animasyon ng YouTube Doodles sa logo - Ang animasyon ng YouTube Doodles sa logo ay ipinapakita - "Ang mga Doodles ng YouTube ay ipinapakita ng ilang araw bawat taon. + Itago ang button na \"Ipakita ang higit pa\" + Nakatago ang pindutan na Ipakita pa sa mga resulta ng paghahanap + Ipinapakita ang pindutan na Ipakita pa sa mga resulta ng paghahanap + Itago ang mga survey + Nakatago ang mga survey + Ipinapakita ang mga survey + Itago ang shelf ng ticket + Nakatago ang ticket shelf + Ipinapakita ang ticket shelf + + Itago ang mga label ng rekomendasyon ng video + Ang mga label na \'Pinanood din ng iba\' at \'Maaaring magustuhan mo rin\' sa mga resulta ng paghahanap ay nakatago + Ang mga label na \'Pinanood din ng iba\' at \'Maaaring magustuhan mo rin\' sa mga resulta ng paghahanap ay ipinapakita + Itago ang biswal na espasyo + Ang biswal na espasyo ay nakatago + Ang biswal na espasyo ay ipinapakita + + Itago ang mga Doodles ng YouTube + Nakatago ang animasyon ng YouTube Doodles sa logo + Ang animasyon ng YouTube Doodles sa logo ay ipinapakita + "Ang mga Doodles ng YouTube ay ipinapakita ng ilang araw bawat taon. Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang setting na ito ng pagtatago ay naka-on, kung gayon ang filter bar sa ibaba ng search bar ay itatago rin." - Itago ang channel bar - Nakatago ang channel bar - Ipinapakita ang channel bar - Itago ang watermark ng channel - Nakatago ang watermark - Ipinapakita ang watermark - Itago ang crowdfunding box - Nakatago ang crowdfunding box - Ipinapakita ang kahon ng crowdfunding - Itago ang mga emergency box - Nakatago ang mga emergency box - Ipinapakita ang mga emergency box - Itago ang mga panel ng impormasyon - Nakatago ang mga panel ng impormasyon - Ang mga panel ng impormasyon ay ipinapakita - - Itago ang button na Sumali - Nakatago ang pindutan na Sumali - Ipinapakita ang pindutan na Sumali - Itago ang mga medikal na panel - Nakatago ang mga medikal na panel - Ipinapakita ang mga medikal na panel - Itago ang mga mabilisang pagkilos - Nakago na ang mga mabilisang pagkilos sa fullscreen - Ipinapakita ang mga mabilisang pagkilos sa fullscreen - Itago ang mga kaugnay na video - Nakago na ang mga kaugnay na video sa mga mabilisang pagkilos - Ipinapakita ang mga kaugnay na video sa mga mabilisang pagkilos - Itago ang mga alituntunin ng mga subscriber - Nakatago ang mga alituntunin ng komunidad ng mga subscriber - Ang mga alituntunin ng komunidad ng mga subscriber ay ipinapakita - Itago ang mga naka-time na reaksyon - Nakatago ang mga naka-time na reaksyon - Ang mga naka-time na reaksyon ay ipinapakita - Itago ang \'Buod ng video na binuo ng AI\' - Ang seksyon ng buod ng video na binuo ng AI ay nakatago - Ipinapakita ang seksyon ng buod ng video na nabuo ng AI - Itago ang Magtanong - Nakatago ang seksyon ng Magtanong - Ipinapakita ang seksyon ng Magtanong - Itago ang Mga Katangian - Nakatago ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit - Ipinapakita ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit - Itago ang Mga Kabanata - Nakatago ang seksyon ng mga kabanata - Ang seksyon ng mga kabanata ay ipinapakita - Itago ang \'Paano ginawa ang content na ito\' - Nakatago ang seksyon ng Paano ginawa ang content na ito - Ipinapakita ang seksyon ng Paano ginawa ang content na ito - Itago ang mga Puntos ng Hype - Nakatago ang mga Puntos ng Hype - Ipinapakita ang mga Puntos ng Hype - Itago ang \'I-explore ang podcast\' - Nakatago ang seksyon ng I-explore ang podcast - Ipinapakita ang seksyon ng I-explore ang podcast - Itago ang Mga Itinatampok na link - Nakatago ang seksyon ng mga itinatampok na link - Ipinapakita ang seksyon ng mga itinatampok na link - Itago ang Mga Itinatampok na Video - Nakatago ang seksyon ng mga itinatampok na video - Ipinapakita ang seksyon ng mga itinatampok na video - Itago ang Mga card ng impormasyon - Nakatago ang seksyon ng mga card ng impormasyon - Ang seksyon ng mga card ng impormasyon ay ipinapakita - Itago ang \'Mga pangunahing konsepto\' - Nakatago ang seksyon ng Mga pangunahing konsepto - Ipinapakita ang seksyon ng Mga pangunahing konsepto - Itago ang button na Mag-subscribe - Nakatago ang button na Mag-subscribe - Ipinapakita ang button na Mag-subscribe - Itago ang Transcript - Nakatago ang seksyon ng transcript - Ipinapakita ang seksyon ng transcript - Paglalarawan ng video - Itago o ipakita ang mga bahagi ng paglalarawan ng video - Bar ng filter - Itago o ipakita ang filter bar sa mga feed, mga kaugnay na video, mga resulta ng paghahanap, at history ng panonood - Itago sa mga feed - Nakatago sa mga feed - Ipinapakita sa mga feed - Itago sa mga kaugnay na video - Nakatago sa mga kaugnay na video - Ipinapakita sa mga kaugnay na video - Itago sa mga resulta ng paghahanap - Nakatago sa mga resulta ng paghahanap - Ipinapakita sa mga resulta ng paghahanap - Itago sa history ng panonood - Nakatago sa history ng panonood - Ipinapakita sa history ng panonood - Pahina ng Channel - Itago o ipakita ang mga bahagi ng pahina ng channel - - Itago ang pindutan ng Komunidad - Nakatago ang button ng Komunidad - Nakalabas ang button ng Komunidad - - Itago ang shelf na \'Para sa iyo\' - Nakago na ang For You shelf - Ipinapakita ang For You shelf - - Itago ang button na Sumali - Nakatago ang button na Sumali - Nakalabas ang button na Sumali - Itago ang preview ng mga link - Nakago na ang preview ng mga link - Ipinapakita ang preview ng mga link - Itago ang members shelf - Nakago na ang members shelf - Ipinapakita ang shelf ng Mga Miyembro - - Itago ang button ng Tindahan - Nakatago ang button ng Tindahan - Nakalabas ang button ng Tindahan - - Itago ang button na Mag-subscribe - Nakatago ang button na Mag-subscribe - Nakalabas ang button na Mag-subscribe - Mga komento - Itago o ipakita ang mga bahagi ng seksyon ng komento - Itago ang buod ng AI chat - Ang buod ng AI chat ay nakatago - Ang buod ng AI chat ay ipinapakita - Itago ang Buod ng Mga Komento ng AI - Ang buod ng komento ng AI ay nakatago - Ang buod ng komento ng AI ay ipinapakita - Itago ang mga guideline ng channel - Nakatago ang mga alituntunin ng channel - Ipinapakita ang mga alituntunin ng channel - Itago ang header ng \"Mga komento ng mga miyembro\" - Nakatago ang header ng Mga komento ng mga miyembro - Ipinapakita ang header ng Mga komento ng mga miyembro - Itago ang seksyon ng mga komento - Nakatago ang seksyon ng mga komento - Ipinapakita ang seksyon ng mga komento - Itago ang mga alituntunin ng komunidad - Nakago na ang mga guideline ng komunidad - Ipinapakita ang mga guideline ng komunidad - Itago ang butong \'Gumawa ng Short\' - Nakatago ang button na Gumawa ng isang Short - Ipinapakita ang button na Gumawa ng isang Short - Itago ang mga button ng Emoji at Timestamp - Nakatago ang mga button ng Emoji at Timestamp - Ipinapakita ang mga button ng Emoji at Timestamp - Itago ang preview na komento - Nakatago ang preview ng komento - Ang pag-preview ng komento ay ipinapakita - Itago ang pindutang Salamat - Nakatago ang buton ng salamat - Ang pindutan ng salamat ay ipinapakita - Itago ang bilang ng panonood - Ang bilang ng panonood ay nakatago sa feed at mga resulta ng paghahanap - Ang bilang ng panonood ay ipinapakita sa feed at mga resulta ng paghahanap - - "Mga Limitasyon: + Itago ang button na Sumali + Nakatago ang pindutan na Sumali + Ipinapakita ang pindutan na Sumali + Itago ang mga medikal na panel + Nakatago ang mga medikal na panel + Ipinapakita ang mga medikal na panel + Itago ang mga mabilisang pagkilos + Nakago na ang mga mabilisang pagkilos sa fullscreen + Ipinapakita ang mga mabilisang pagkilos sa fullscreen + Itago ang mga kaugnay na video + Nakago na ang mga kaugnay na video sa mga mabilisang pagkilos + Ipinapakita ang mga kaugnay na video sa mga mabilisang pagkilos + Itago ang mga alituntunin ng mga subscriber + Nakatago ang mga alituntunin ng komunidad ng mga subscriber + Ang mga alituntunin ng komunidad ng mga subscriber ay ipinapakita + Itago ang mga naka-time na reaksyon + Nakatago ang mga naka-time na reaksyon + Ang mga naka-time na reaksyon ay ipinapakita + Itago ang \'Buod ng video na binuo ng AI\' + Ang seksyon ng buod ng video na binuo ng AI ay nakatago + Ipinapakita ang seksyon ng buod ng video na nabuo ng AI + Itago ang Magtanong + Nakatago ang seksyon ng Magtanong + Ipinapakita ang seksyon ng Magtanong + Itago ang Mga Katangian + Nakatago ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit + Ipinapakita ang mga seksyon ng Mga itinatampok na lugar, Mga Laro, Musika, at Mga taong binanggit + Itago ang Mga Kabanata + Nakatago ang seksyon ng mga kabanata + Ang seksyon ng mga kabanata ay ipinapakita + Itago ang \'Paano ginawa ang content na ito\' + Nakatago ang seksyon ng Paano ginawa ang content na ito + Ipinapakita ang seksyon ng Paano ginawa ang content na ito + Itago ang mga Puntos ng Hype + Nakatago ang mga Puntos ng Hype + Ipinapakita ang mga Puntos ng Hype + Itago ang \'I-explore ang podcast\' + Nakatago ang seksyon ng I-explore ang podcast + Ipinapakita ang seksyon ng I-explore ang podcast + Itago ang Mga Itinatampok na link + Nakatago ang seksyon ng mga itinatampok na link + Ipinapakita ang seksyon ng mga itinatampok na link + Itago ang Mga Itinatampok na Video + Nakatago ang seksyon ng mga itinatampok na video + Ipinapakita ang seksyon ng mga itinatampok na video + Itago ang Mga card ng impormasyon + Nakatago ang seksyon ng mga card ng impormasyon + Ang seksyon ng mga card ng impormasyon ay ipinapakita + Itago ang \'Mga pangunahing konsepto\' + Nakatago ang seksyon ng Mga pangunahing konsepto + Ipinapakita ang seksyon ng Mga pangunahing konsepto + Itago ang button na Mag-subscribe + Nakatago ang button na Mag-subscribe + Ipinapakita ang button na Mag-subscribe + Itago ang Transcript + Nakatago ang seksyon ng transcript + Ipinapakita ang seksyon ng transcript + Paglalarawan ng video + Itago o ipakita ang mga bahagi ng paglalarawan ng video + Bar ng filter + Itago o ipakita ang filter bar sa mga feed, mga kaugnay na video, mga resulta ng paghahanap, at history ng panonood + Itago sa mga feed + Nakatago sa mga feed + Ipinapakita sa mga feed + Itago sa mga kaugnay na video + Nakatago sa mga kaugnay na video + Ipinapakita sa mga kaugnay na video + Itago sa mga resulta ng paghahanap + Nakatago sa mga resulta ng paghahanap + Ipinapakita sa mga resulta ng paghahanap + Itago sa history ng panonood + Nakatago sa history ng panonood + Ipinapakita sa history ng panonood + Pahina ng Channel + Itago o ipakita ang mga bahagi ng pahina ng channel + + Itago ang pindutan ng Komunidad + Nakatago ang button ng Komunidad + Nakalabas ang button ng Komunidad + + Itago ang shelf na \'Para sa iyo\' + Nakago na ang For You shelf + Ipinapakita ang For You shelf + + Itago ang button na Sumali + Nakatago ang button na Sumali + Nakalabas ang button na Sumali + Itago ang preview ng mga link + Nakago na ang preview ng mga link + Ipinapakita ang preview ng mga link + Itago ang members shelf + Nakago na ang members shelf + Ipinapakita ang shelf ng Mga Miyembro + + Itago ang button ng Tindahan + Nakatago ang button ng Tindahan + Nakalabas ang button ng Tindahan + + Itago ang button na Mag-subscribe + Nakatago ang button na Mag-subscribe + Nakalabas ang button na Mag-subscribe + Mga komento + Itago o ipakita ang mga bahagi ng seksyon ng komento + Itago ang buod ng AI chat + Ang buod ng AI chat ay nakatago + Ang buod ng AI chat ay ipinapakita + Itago ang Buod ng Mga Komento ng AI + Ang buod ng komento ng AI ay nakatago + Ang buod ng komento ng AI ay ipinapakita + Itago ang mga guideline ng channel + Nakatago ang mga alituntunin ng channel + Ipinapakita ang mga alituntunin ng channel + Itago ang header ng \"Mga komento ng mga miyembro\" + Nakatago ang header ng Mga komento ng mga miyembro + Ipinapakita ang header ng Mga komento ng mga miyembro + Itago ang seksyon ng mga komento + Nakatago ang seksyon ng mga komento + Ipinapakita ang seksyon ng mga komento + Itago ang mga alituntunin ng komunidad + Nakago na ang mga guideline ng komunidad + Ipinapakita ang mga guideline ng komunidad + Itago ang butong \'Gumawa ng Short\' + Nakatago ang button na Gumawa ng isang Short + Ipinapakita ang button na Gumawa ng isang Short + Itago ang mga button ng Emoji at Timestamp + Nakatago ang mga button ng Emoji at Timestamp + Ipinapakita ang mga button ng Emoji at Timestamp + Itago ang preview na komento + Nakatago ang preview ng komento + Ang pag-preview ng komento ay ipinapakita + Itago ang pindutang Salamat + Nakatago ang buton ng salamat + Ang pindutan ng salamat ay ipinapakita + Itago ang bilang ng panonood + Ang bilang ng panonood ay nakatago sa feed at mga resulta ng paghahanap + Ang bilang ng panonood ay ipinapakita sa feed at mga resulta ng paghahanap + + "Mga Limitasyon: • Ang mga Shorts shelves, mga pahina ng channel, at mga resulta ng paghahanap ay maaari pa ring magpakita ng mga bilang ng panonood • Ang tampok na ito ay hindi gumagana sa automotive form factor" - Itago ang oras ng pag-upload - Nakatago ang oras ng pag-upload sa feed at mga resulta ng paghahanap - Ipinapakita ang oras ng pag-upload sa feed at mga resulta ng paghahanap - - "Mga Limitasyon: + Itago ang oras ng pag-upload + Nakatago ang oras ng pag-upload sa feed at mga resulta ng paghahanap + Ipinapakita ang oras ng pag-upload sa feed at mga resulta ng paghahanap + + "Mga Limitasyon: • Ang mga seksyon ng Shorts, mga pahina ng channel, at mga resulta ng paghahanap ay maaaring magpakita pa rin ng mga oras ng pag-upload • Hindi gumagana ang feature na ito sa form factor ng sasakyan" - Itago ang nilalaman ng keyword - Itago ang paghahanap at feed ng mga video gamit ang mga filter ng keyword - Itago ang mga home video sa pamamagitan ng mga keyword - Ang mga video sa tab na home ay sinasala ng mga keyword - Ang mga video sa tab na home ay hindi sinasala ng mga keyword - Itago ang mga resulta ng paghahanap ayon sa mga keyword - Ang mga resulta ng paghahanap ay sinasala ng mga keyword - Ang mga resulta ng paghahanap ay hindi sinasala ng mga keyword - Itago ang mga video ng subscription sa pamamagitan ng mga keyword - Ang mga video sa tab na mga subscription ay sinasala ng mga keyword - Ang mga video sa tab na mga subscription ay hindi sinasala ng mga keyword - Mga keyword na itatago - - "Mga keyword at parirala upang itago, pinaghiwalay ng mga bagong linya + "Mga keyword at parirala upang itago, pinaghiwalay ng mga bagong linya Ang mga keyword ay maaaring mga pangalan ng channel o anumang text na ipinapakita sa mga pamagat ng video Ang mga salita na may malalaking titik sa gitna ay dapat ipasok gamit ang casing (halimbawa: iPhone, TikTok, LeBlanc)" - Tungkol sa pag-filter ng keyword - "Ang mga resulta ng Home/Subscription/Search ay na-filter upang itago ang nilalamang tumutugma sa mga parirala ng keyword + Tungkol sa pag-filter ng keyword + "Ang mga resulta ng Home/Subscription/Search ay na-filter upang itago ang nilalamang tumutugma sa mga parirala ng keyword Mga limitasyon • Ang mga Shorts ay hindi maaaring itago sa pamamagitan ng pangalan ng channel • Ang ilang mga bahagi ng UI ay maaaring hindi maitago • Ang paghahanap para sa isang keyword ay maaaring walang resulta" - I-match ang mga buong salita - - Ang paglalagay ng keyword/parirala sa loob ng mga panipi ay pipigil sa mga bahagyang pagtutugma ng mga pamagat ng video at pangalan ng channel<br><br>Halimbawa,<br><b>\"ai\"</b> itatago ang video: <b>Paano gumagana ang AI?</b><br>ngunit hindi itatago: <b>What does fair use mean?</b> - - Hindi magagamit ang keyword: %s - Magdagdag ng mga quote upang gamitin ang keyword: %s - Ang keyword ay may mga salungat na deklarasyon: %s - Masyadong maikli ang keyword at nangangailangan ng mga quote: %s - Ang keyword ay magtatago ng lahat ng mga video: %s - - - Itago ang creator store shelf - Nakatago ang istante ng store ng creator sa ilalim ng video player - Ang shelf ng creator store sa ilalim ng video player ay ipinapakita - Itago ang banner ng tindahan ng end screen - Nakatago ang banner ng store sa end screen - Ipinapakita ang banner ng store sa end screen - Itago ang mga fullscreen na ad - "Ang mga fullscreen ad ay nakatago + I-match ang mga buong salita + + Ang paglalagay ng keyword/parirala sa loob ng mga panipi ay pipigil sa mga bahagyang pagtutugma ng mga pamagat ng video at pangalan ng channel<br><br>Halimbawa,<br><b>\"ai\"</b> itatago ang video: <b>Paano gumagana ang AI?</b><br>ngunit hindi itatago: <b>What does fair use mean?</b> + + Hindi magagamit ang keyword: %s + Magdagdag ng mga quote upang gamitin ang keyword: %s + Ang keyword ay may mga salungat na deklarasyon: %s + Masyadong maikli ang keyword at nangangailangan ng mga quote: %s + Ang keyword ay magtatago ng lahat ng mga video: %s + + + Itago ang creator store shelf + Nakatago ang istante ng store ng creator sa ilalim ng video player + Ang shelf ng creator store sa ilalim ng video player ay ipinapakita + Itago ang banner ng tindahan ng end screen + Nakatago ang banner ng store sa end screen + Ipinapakita ang banner ng store sa end screen + Itago ang mga fullscreen na ad + "Ang mga fullscreen ad ay nakatago Ang tampok na ito ay magagamit lamang para sa mga mas lumang device" - Ipinapakita ang mga fullscreen na ad - - Gumagana lang ang Itago ang mga fullscreen na ad sa mga mas lumang device - Itago ang mga pangkalahatang ad - Nakatago ang mga pangkalahatang ad - Ipinapakita ang mga pangkalahatang ad - Itago ang mga merchandise banner - Nakatago ang mga banner ng merchandise - Ipinapakita ang mga banner ng merchandise - Itago ang may bayad na label ng promosyon - Nakatago ang label ng bayad na promosyon - Ipinapakita ang may bayad na label ng promosyon - Itago ang mga self sponsored card - Nakatago ang mga self sponsored card - Ipinapakita ang mga self sponsored card - Itago ang mga link ng pamimili - Nakatago ang mga link ng shopping sa description ng video - Ang mga link sa pamimili sa paglalarawan ng video ay ipinapakita - Itago ang banner na \"Tingnan ang mga produkto\" - Nakatago ang banner na Tingnan ang mga produkto sa overlay ng video - Ipinapakita ang banner na Tingnan ang mga produkto sa overlay ng video - Itago ang mga resulta ng paghahanap sa web - Nakatago ang mga resulta ng paghahanap sa web - Ipinapakita ang mga resulta ng paghahanap sa web - - - Itago ang mga promosyon sa YouTube Premium - Nakatago ang mga promosyon ng YouTube Premium sa ilalim ng video player - Ipinapakita ang mga promosyon sa YouTube Premium sa ilalim ng video player - - - Itago ang mga video ad - Nakatago ang mga video ad - Ipinapakita ang mga video ad - - - Nakopya ang URL sa clipboard - URL na may timestamp na kinopya - Ipakita ang pindutan ng URL ng kopya ng video - Nakalabas ang button para kopyahin ang URL ng video. Pindutin para kopyahin ang URL ng video. Pindutin nang matagal para kopyahin kasama ang timestamp - Hindi nakalabas ang button para kopyahin ang URL ng video - Ipakita ang pindutan ng URL ng kopya ng timestamp - Nakalabas ang button para kopyahin ang URL na may timestamp. Pindutin para kopyahin ang URL ng video kasama ang timestamp. Pindutin nang matagal para kopyahin nang walang timestamp - Hindi nakalabas ang button para kopyahin ang URL na may timestamp - - - Alisin ang dialog ng paghuhusga ng manonood - Aalisin ang dialog - Ipapakita ang dialog - Hindi nito nilalampasan ang paghihigpit sa edad. Awtomatiko lang itong tinatanggap. - - - I-disable ang popup na \"Mag-sign in sa TV\" - Hindi pinagana ang popup ng Pag-sign in sa TV - Pinagana ang popup ng Pag-sign in sa TV - - - Huwag paganahin ang paglaktaw ng kabanata sa doble tap - Ang doble tap ay hindi kailanman maaaring mag-trigger ng paglaktaw sa susunod/nakaraang kabanata - Ang doble tap ay paminsan-minsan ay maaaring mag-trigger ng paglaktaw sa susunod/nakaraang kabanata - - - Mga panlabas na pag-download - Mga setting para sa paggamit ng external na downloader - Ipakita ang external na button sa pag-download - Ipinapakita ang button na Mag-download sa player - Hindi ipinapakita ang button na Mag-download sa player - - Lagpasan ang button ng aksyon ng Pag-download - Binubuksan ng button sa pag-download ang iyong external na downloader - Binubuksan ng button sa pag-download ang native na in-app na downloader - Pangalan ng package ng downloader - Pangalan ng package ng iyong naka-install na panlabas na downloader app - Ilagay ang pangalan ng package - Iba pa - Hindi naka-install ang app - Hindi naka-install ang %s. Mangyaring i-install ito. - "Hindi makita ang naka-install na app na may pangalan ng package: %s + Ipinapakita ang mga fullscreen na ad + + Gumagana lang ang Itago ang mga fullscreen na ad sa mga mas lumang device + Itago ang mga pangkalahatang ad + Nakatago ang mga pangkalahatang ad + Ipinapakita ang mga pangkalahatang ad + Itago ang mga merchandise banner + Nakatago ang mga banner ng merchandise + Ipinapakita ang mga banner ng merchandise + Itago ang may bayad na label ng promosyon + Nakatago ang label ng bayad na promosyon + Ipinapakita ang may bayad na label ng promosyon + Itago ang mga self sponsored card + Nakatago ang mga self sponsored card + Ipinapakita ang mga self sponsored card + Itago ang mga link ng pamimili + Nakatago ang mga link ng shopping sa description ng video + Ang mga link sa pamimili sa paglalarawan ng video ay ipinapakita + Itago ang banner na \"Tingnan ang mga produkto\" + Nakatago ang banner na Tingnan ang mga produkto sa overlay ng video + Ipinapakita ang banner na Tingnan ang mga produkto sa overlay ng video + Itago ang mga resulta ng paghahanap sa web + Nakatago ang mga resulta ng paghahanap sa web + Ipinapakita ang mga resulta ng paghahanap sa web + + + Itago ang mga promosyon sa YouTube Premium + Nakatago ang mga promosyon ng YouTube Premium sa ilalim ng video player + Ipinapakita ang mga promosyon sa YouTube Premium sa ilalim ng video player + + + Itago ang mga video ad + Nakatago ang mga video ad + Ipinapakita ang mga video ad + + + Nakopya ang URL sa clipboard + URL na may timestamp na kinopya + Ipakita ang pindutan ng URL ng kopya ng video + Nakalabas ang button para kopyahin ang URL ng video. Pindutin para kopyahin ang URL ng video. Pindutin nang matagal para kopyahin kasama ang timestamp + Hindi nakalabas ang button para kopyahin ang URL ng video + Ipakita ang pindutan ng URL ng kopya ng timestamp + Nakalabas ang button para kopyahin ang URL na may timestamp. Pindutin para kopyahin ang URL ng video kasama ang timestamp. Pindutin nang matagal para kopyahin nang walang timestamp + Hindi nakalabas ang button para kopyahin ang URL na may timestamp + + + Alisin ang dialog ng paghuhusga ng manonood + Aalisin ang dialog + Ipapakita ang dialog + Hindi nito nilalampasan ang paghihigpit sa edad. Awtomatiko lang itong tinatanggap. + + + I-disable ang popup na \"Mag-sign in sa TV\" + Hindi pinagana ang popup ng Pag-sign in sa TV + Pinagana ang popup ng Pag-sign in sa TV + + + Huwag paganahin ang paglaktaw ng kabanata sa doble tap + Ang doble tap ay hindi kailanman maaaring mag-trigger ng paglaktaw sa susunod/nakaraang kabanata + Ang doble tap ay paminsan-minsan ay maaaring mag-trigger ng paglaktaw sa susunod/nakaraang kabanata + + + Mga panlabas na pag-download + Mga setting para sa paggamit ng external na downloader + Ipakita ang external na button sa pag-download + Ipinapakita ang button na Mag-download sa player + Hindi ipinapakita ang button na Mag-download sa player + + Lagpasan ang button ng aksyon ng Pag-download + Binubuksan ng button sa pag-download ang iyong external na downloader + Binubuksan ng button sa pag-download ang native na in-app na downloader + Pangalan ng package ng downloader + Pangalan ng package ng iyong naka-install na panlabas na downloader app + Ilagay ang pangalan ng package + Iba pa + Hindi naka-install ang app + Hindi naka-install ang %s. Mangyaring i-install ito. + "Hindi makita ang naka-install na app na may pangalan ng package: %s Suriin kung tama ang pangalan ng package at kung naka-install ang app" - Hindi maaaring walang laman ang pangalan ng package - - - Huwag paganahin ang tumpak na kilos sa paghahanap - Naka-disable ang galaw - Naka-enable ang galaw - - - Paganahin ang pag-tap para maghanap - Naka-enable ang Tap para maghanap - Hindi naka-enable ang pag-tap para maghanap - - - I-enable ang brightness gesture - "Naka-enable ang pag-swipe ng brightness sa fullscreen + Hindi maaaring walang laman ang pangalan ng package + + + Huwag paganahin ang tumpak na kilos sa paghahanap + Naka-disable ang galaw + Naka-enable ang galaw + + + Paganahin ang pag-tap para maghanap + Naka-enable ang Tap para maghanap + Hindi naka-enable ang pag-tap para maghanap + + + I-enable ang brightness gesture + "Naka-enable ang pag-swipe ng brightness sa fullscreen Aayos ang brightness sa pamamagitan ng pag-swipe nang patayo sa kaliwang bahagi ng screen" - Naka-disable ang pag-swipe ng brightness sa fullscreen - I-enable ang volume gesture - "Pinagana ang pag-swipe ng volume sa fullscreen + Naka-disable ang pag-swipe ng brightness sa fullscreen + I-enable ang volume gesture + "Pinagana ang pag-swipe ng volume sa fullscreen Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng screen" - Hindi pinagana ang pag-swipe ng volume sa fullscreen - I-enable ang gesture na pindutin para mag-swipe - Naka-enable ang pindutin para mag-swipe - Hindi naka-enable ang pindutin para mag-swipe - Paganahin ang haptic na feedback - Naka-enable ang haptic feedback - Naka-disable ang haptic feedback - I-save at ibalik ang liwanag - I-save at ibalik ang liwanag kapag lalabas o papasok sa fullscreen - Huwag i-save at ibalik ang liwanag kapag lalabas o papasok sa fullscreen - I-enable ang galaw ng auto-brightness - Ang pag-swipe pababa sa pinakamababang halaga ng brightness gesture ay nagbibigay-daan sa auto-brightness - Ang pag-swipe pababa sa pinakamababang halaga ay hindi nagpapagana ng auto-brightness - Awtomatik - Mag-swipe overlay timeout - Ang dami ng millisecond na nakikita ang overlay - Transparency ng background ng swipe overlay - Halaga ng opacity sa pagitan ng 0-100 - Ang opacity ng swipe ay dapat nasa pagitan ng 0-100 - Kulay ng liwanag ng swipe overlay - Ang kulay ng progress bar para sa mga kontrol ng liwanag - Kulay ng volume ng swipe overlay - Ang kulay ng progress bar para sa mga kontrol ng volume - Laki ng teksto ng swipe overlay - Ang laki ng teksto para sa swipe overlay sa pagitan ng 1-30 - Ang laki ng teksto ay dapat sa pagitan ng 1-30 - I-swipe ang magnitude threshold - Ang halaga ng threshold para sa pag-swipe na magaganap - Pagkasensitibo sa pag-swipe ng volume - Gaano karami ang pagbabago ng volume sa bawat swipe - Estilo ng swipe overlay - Pahalang na overlay - Pahalang na overlay (minimal - itaas) - Pahalang na overlay (minimal - gitna) - Pabilog na overlay - Pabilog na overlay (minimal) - Patayong overlay - Patayong overlay (minimal) - I-enable ang swipe para magpalit ng mga video - Ang pag-swipe sa full screen mode ay magpapalit sa susunod/nakaraang video - Ang pag-swipe sa full screen ay hindi magpapalit sa susunod/nakaraang video - - - Huwag paganahin ang mga auto caption - Naka-disable ang mga Auto caption - Naka-enable ang mga Auto caption - - - Mga pindutan ng pagkilos - Itago o ipakita ang mga button sa ilalim ng mga video - Huwag paganahin ang glow ng Like at Subscribe - Ang Like at Subscribe na button ay hindi mag-glow kapag nabanggit - Ang Like at Subscribe na button ay mag-glow kapag nabanggit - Itago ang Like at Dislike - Nakatago ang mga button na Like at Dislike - Ang mga button na Like at Dislike ay ipinapakita - - Itago ang Ibahagi - Nakatago ang share button - Ang pindutan ng pagbabahagi ay ipinapakita - - Itago ang Ihinto ang mga ad - Nakatago ang button ng pagtigil sa mga ad - Napakita ang button ng pagtigil sa mga ad - - Itago ang mga Komento - Nakatago ang pindutan ng Mga Komento - Ipinapakita ang pindutan ng Mga Komento - + Itago ang Ibahagi + Nakatago ang share button + Ang pindutan ng pagbabahagi ay ipinapakita + + Itago ang Ihinto ang mga ad + Nakatago ang button ng pagtigil sa mga ad + Napakita ang button ng pagtigil sa mga ad + + Itago ang mga Komento + Nakatago ang pindutan ng Mga Komento + Ipinapakita ang pindutan ng Mga Komento + - Itago ang Ulat - Nakatago ang button ng ulat - Ang pindutan ng ulat ay ipinapakita - - Itago ang Remix - Nakatago ang remix button - Ang remix button ay ipinapakita - - Itago ang Download - Nakatago ang button sa pag-download - Ang pindutan ng pag-download ay ipinapakita - + Itago ang Remix + Nakatago ang remix button + Ang remix button ay ipinapakita + + Itago ang Download + Nakatago ang button sa pag-download + Ang pindutan ng pag-download ay ipinapakita + - Itago ang Ingay - Nakatago ang hype button - Ipinapakita ang Hype button - - Itago ang I-promote - Nakatago ang button na Promote - Nakikita ang button na Promote - - Itago Salamat - Nakatago ang buton ng salamat - Ang pindutan ng salamat ay ipinapakita - + Itago ang I-promote + Nakatago ang button na Promote + Nakikita ang button na Promote + + Itago Salamat + Nakatago ang buton ng salamat + Ang pindutan ng salamat ay ipinapakita + - Itago ang Tanong - Nakatago ang button na Tanong - Ipinapakita ang button na Tanong - - Itago ang Clip - Nakatago ang clip button - Ang pindutan ng clip ay ipinapakita - - Itago ang Tindahan - Ang pindutan ng Tindahan ay nakatago - Ang pindutan ng Tindahan ay nakikita - - Itago ang I-save - Nakatago ang button ng I-save - Napakita ang button ng I-save - - - Mga pindutan ng nabigasyon - Itago o baguhin ang mga button sa navigation bar - - Itago ang Tahanan - Nakatago ang home button - Ipinapakita ang home button - - Itago ang Shorts - Nakatago ang pindutan sa Shorts - Nakikita ang Shorts button - - Itago ang Gumawa - Nakatago ang button na Lumikha - Ang pindutan ng Lumikha ay ipinapakita - - Itago ang Mga Subscription - Nakatago ang button ng mga subscription - Ang pindutan ng mga subscription ay ipinapakita - Itago ang Mga Notification - Nakatago ang button ng Mga Notification - Ipinapakita ang button ng Mga Notification - - Lumipat ng Gumawa gamit ang Mga Notification - "Ang pindutan ng Lumikha ay pinalitan ng pindutan ng Mga Notification + Itago ang Tanong + Nakatago ang button na Tanong + Ipinapakita ang button na Tanong + + Itago ang Clip + Nakatago ang clip button + Ang pindutan ng clip ay ipinapakita + + Itago ang Tindahan + Ang pindutan ng Tindahan ay nakatago + Ang pindutan ng Tindahan ay nakikita + + Itago ang I-save + Nakatago ang button ng I-save + Napakita ang button ng I-save + + + Mga pindutan ng nabigasyon + Itago o baguhin ang mga button sa navigation bar + + Itago ang Tahanan + Nakatago ang home button + Ipinapakita ang home button + + Itago ang Shorts + Nakatago ang pindutan sa Shorts + Nakikita ang Shorts button + + Itago ang Gumawa + Nakatago ang button na Lumikha + Ang pindutan ng Lumikha ay ipinapakita + + Itago ang Mga Subscription + Nakatago ang button ng mga subscription + Ang pindutan ng mga subscription ay ipinapakita + Itago ang Mga Notification + Nakatago ang button ng Mga Notification + Ipinapakita ang button ng Mga Notification + + Lumipat ng Gumawa gamit ang Mga Notification + "Ang pindutan ng Lumikha ay pinalitan ng pindutan ng Mga Notification Tandaan: Ang pagpapagana nito ay nagtatago rin ng mga ad ng video" - Ang pindutan ng Lumikha ay hindi inililipat gamit ang pindutan ng Mga Notification - "Kung hindi gagana ang pagpapalit ng setting na ito, subukang lumipat sa Incognito mode." - Itago ang mga label ng navigation button - Nakatago ang mga label - Ang mga label ay ipinapakita - Huwag paganahin ang translucent status bar - Ang status bar ay opaque - Ang status bar ay opaque o translucent - Sa ilang device, ang pagpapagana sa feature na ito ay maaaring magpabago sa navigation bar ng system sa transparent. - Huwag paganahin ang light translucent bar - Ang light mode navigation bar ay opaque - Ang light mode navigation bar ay opaque o translucent - Huwag paganahin ang dark translucent bar - Ang dark mode navigation bar ay opaque - Ang dark mode navigation bar ay opaque o translucent - - - Menu ng flyout - Itago o ipakita ang mga item sa menu ng player flyout - - Itago ang Mga Caption - Nakatago ang menu ng mga caption - Ang menu ng mga caption ay ipinapakita - - Itago ang mga Karagdagang setting - Nakatago ang menu ng mga karagdagang setting - Ang karagdagang menu ng mga setting ay ipinapakita - - Itago ang Sleep timer - Ang menu ng Sleep timer ay nakatago - Ang menu ng Sleep timer ay ipinapakita - - Itago ang Loop na video - Nakatago ang menu ng loop na video - Ipinapakita ang loop na menu ng video - - Itago ang Ambient mode - Nakatago ang menu ng ambient mode - Ipinapakita ang menu ng ambient mode - Itago ang Stable volume - Ang menu ng Stable volume ay ipinapakita - Ang menu ng Stable volume ay nakatago - - Itago ang Tulong & puna - Tulong & nakatago ang menu ng feedback - Tulong & ipinapakita ang menu ng feedback - - Itago ang bilis ng pag-playback - Nakatago ang menu ng bilis ng pag-playback - Ang menu ng bilis ng pag-playback ay ipinapakita - - Itago ang Lock screen - Nakatago ang menu ng lock screen - Ipinapakita ang menu ng lock screen - - Itago ang Makinig gamit ang YouTube Music - Nakatago ang menu ng Makinig gamit ang YouTube Music - Ipinapakita ang menu ng Makinig gamit ang YouTube Music - - Itago ang Audio track - Nakatago ang menu ng audio track - Ipinapakita ang menu ng audio track - + Itago ang Mga Caption + Nakatago ang menu ng mga caption + Ang menu ng mga caption ay ipinapakita + + Itago ang mga Karagdagang setting + Nakatago ang menu ng mga karagdagang setting + Ang karagdagang menu ng mga setting ay ipinapakita + + Itago ang Sleep timer + Ang menu ng Sleep timer ay nakatago + Ang menu ng Sleep timer ay ipinapakita + + Itago ang Loop na video + Nakatago ang menu ng loop na video + Ipinapakita ang loop na menu ng video + + Itago ang Ambient mode + Nakatago ang menu ng ambient mode + Ipinapakita ang menu ng ambient mode + Itago ang Stable volume + Ang menu ng Stable volume ay ipinapakita + Ang menu ng Stable volume ay nakatago + + Itago ang Tulong & puna + Tulong & nakatago ang menu ng feedback + Tulong & ipinapakita ang menu ng feedback + + Itago ang bilis ng pag-playback + Nakatago ang menu ng bilis ng pag-playback + Ang menu ng bilis ng pag-playback ay ipinapakita + + Itago ang Lock screen + Nakatago ang menu ng lock screen + Ipinapakita ang menu ng lock screen + + Itago ang Makinig gamit ang YouTube Music + Nakatago ang menu ng Makinig gamit ang YouTube Music + Ipinapakita ang menu ng Makinig gamit ang YouTube Music + + Itago ang Audio track + Nakatago ang menu ng audio track + Ipinapakita ang menu ng audio track + - "Ang menu ng Audio track ay nakatago + "Ang menu ng Audio track ay nakatago Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'Android No SDK'" - - Itago ang Panoorin sa VR - Nakatago ang panonood sa VR menu - Ang panonood sa VR menu ay ipinapakita - Itago ang menu ng kalidad ng video - Nakatago ang menu ng kalidad ng video - Ipinapakita ang menu ng kalidad ng video - Itago ang footer ng menu ng kalidad ng video - Nakatago ang footer ng menu ng kalidad ng video - Ang footer ng menu ng kalidad ng video ay ipinapakita - - - Itago ang Autoplay button - Nakatago ang autoplay button - Ang autoplay na button ay ipinapakita - - Itago ang Captions button - Nakatago ang button ng mga caption - Ang pindutan ng mga caption ay ipinapakita - Itago ang Cast button - Ang buton ng Cast ay nakatago - Nakikita ang cast button - Itago ang background ng mga kontrol ng manlalaro - Nakatago ang background ng mga kontrol ng manlalaro - Ipinapakita ang background ng mga kontrol ng manlalaro - Itago ang Nakaraan at Susunod na mga pindutan - Nakatago ang mga pindutan - Ang mga pindutan ay ipinapakita - - - Itago ang mga end screen card - Nakatago ang mga end screen card - Ipinapakita ang mga end screen card - - - Huwag paganahin ang Ambient mode sa fullscreen - Naka-disable ang ambient mode - Pinagana ang ambient mode - - - Itago ang mga card ng impormasyon - Nakatago ang info cards - Nakalabas ang info cards - - - Huwag paganahin ang rolling number animation - Ang mga rolling number ay hindi animated - Ang mga rolling number ay animated - - - Itago ang seekbar ng video player - Nakatago ang seekbar ng video player - Ipinapakita ang seekbar ng video player - - Itago ang seekbar ng mga thumbnail ng video - Ang seekbar ng mga thumbnail ng video ay nakatago - Ang seekbar ng mga thumbnail ng video ay ipinapakita - - - Shorts Manlalaro - Itago o ipakita ang mga bahagi ng Shorts player - - Itago ang Shorts sa Home feed - Nakatago sa Home feed at mga kaugnay na video - Ipinapakita sa Home feed at mga kaugnay na video - Itago ang Shorts sa mga resulta ng paghahanap - Nakatago sa mga resulta ng paghahanap - Ipinakita sa mga resulta ng paghahanap - - Itago ang Shorts sa feed ng Mga Subscription - Nakatago sa feed ng Mga Subscription - Ipinapakita sa feed ng Mga Subscription - Itago ang Shorts sa watch history - Nakatago sa kasaysayan ng panonood - Ipinapakita sa watch history - Itago ang label na \"Naka-auto-dub\" - Nakatago ang label na auto-dubbed - Ipinapakita ang label na auto-dubbed - Itago ang button na \"Bumili ng Super Thanks\" - Nakatago ang pindutan na Bumili ng Super Thanks - Ipinapakita ang pindutan na Bumili ng Super Thanks - Itago ang Button ng Epekto - Nakatago ang button ng epekto - Nakikita ang button ng epekto - Itago ang button na \"Green screen\" - Nakatago ang pindutan ng \"Green screen\" - Ipinapakita ang pindutan ng \"Green screen\" - Itago ang pindutan ng \"Hashtag\" - Nakatago ang pindutan ng \"Hashtag\" - Ipinapakita ang pindutan ng \"Hashtag\" - - Itago ang Join button - Nakatago ang button na sumali - Ang pindutan ng pagsali ay ipinapakita - Itago ang live preview - Ang live preview ay nakatago - Ang live preview ay ipinapakita - Itago ang label ng lokasyon - Nakatago ang label ng lokasyon - Ipinapakita ang label ng lokasyon - Itago ang button na \"Bagong post\" - Nakatago ang button na Mga bagong post - Ipinapakita ang button na Mga bagong post - Itago ang mga naka-pause na pindutan ng overlay - Nakatago ang mga naka-pause na pindutan ng overlay - Ang mga naka-pause na pindutan ng overlay ay ipinapakita - Itago ang komento sa preview - Nakatago ang komento sa preview - Ipinapakita ang preview na komento - Itago ang button na \"I-save ang musika\" - Ang buton ng pag-save ng musika ay nakatago - Ang buton ng pag-save ng musika ay ipinapakita - Itago ang mga mungkahi sa paghahanap - Nakatago ang mga mungkahi sa paghahanap - Ipinapakita ang mga mungkahi sa paghahanap - Itago ang Shop button - Nakatago ang pindutan ng tindahan - Ang pindutan ng tindahan ay ipinapakita - Itago ang mga sticker - Nakatago ang mga sticker - Ipinapakita ang mga sticker - Itago ang Subscribe button - Nakatago ang button na mag-subscribe - Ang pindutan ng pag-subscribe ay ipinapakita - Itago ang mga naka-tag na produkto - Nakatago ang mga naka-tag na produkto - Ipinapakita ang mga naka-tag na produkto - Itago ang Upcoming button - Nakatago ang pindutan ng \"Upcoming\" - Ipinapakita ang pindutan ng \"Upcoming\" - Itago ang button na \"Gamitin ang tunog na ito\" - Nakatago ang button na Gamitin ang tunog na ito - Nakikita ang button na Gamitin ang tunog na ito - Itago ang button na \"Gamitin ang template na ito\" - Nakatago ang button na Gamitin ang template na ito - Ipinapakita ang button na Gamitin ang template na ito - Itago ang Like button fountain animation - Nakatago ang animation ng \"like button fountain\" - Ipinapakita ang animation ng \"like button fountain\" - Itago ang Like button - Nakatago ang like button - Ipapakita ang like button - Itago ang Dislike button - Nakatago ang dislike button - Ang dislike button ay ipinapakita - Itago ang Comments button - Nakatago ang button ng mga komento - Ang pindutan ng mga komento ay ipinapakita - - Itago ang Share button - Nakatago ang share button - Ang pindutan ng pagbabahagi ay ipinapakita - - Itago ang Remix button - Nakatago ang remix button - Ang remix button ay ipinapakita - Itago ang pindutan ng tunog - Nakatago ang sound button - Ang pindutan ng tunog ay ipinapakita - Itago ang panel ng impormasyon - Nakatago ang panel ng impormasyon - Ang panel ng impormasyon ay ipinapakita - Itago ang channel bar - Nakatago ang channel bar - Ipinapakita ang channel bar - Itago ang pamagat ng video - Nakatago ang pamagat ng video - Ipinapakita ang pamagat ng video - Itago ang sound metadata label - Nakatago ang label ng sound metadata - Ipinapakita ang label ng sound metadata - Itago ang label ng link ng video - Nakatago ang label ng link ng video - Ipinapakita ang label ng link ng video - Itago ang navigation bar - Nakatago ang navigation bar - Ipinapakita ang navigation bar - - - Itago ang iminungkahing video sa dulo ng screen - "Nakatago ang iminungkahing video sa dulo ng screen kapag nakapatay ang autoplay + + Itago ang Panoorin sa VR + Nakatago ang panonood sa VR menu + Ang panonood sa VR menu ay ipinapakita + Itago ang menu ng kalidad ng video + Nakatago ang menu ng kalidad ng video + Ipinapakita ang menu ng kalidad ng video + Itago ang footer ng menu ng kalidad ng video + Nakatago ang footer ng menu ng kalidad ng video + Ang footer ng menu ng kalidad ng video ay ipinapakita + + + Itago ang Autoplay button + Nakatago ang autoplay button + Ang autoplay na button ay ipinapakita + + Itago ang Captions button + Nakatago ang button ng mga caption + Ang pindutan ng mga caption ay ipinapakita + Itago ang Cast button + Ang buton ng Cast ay nakatago + Nakikita ang cast button + Itago ang background ng mga kontrol ng manlalaro + Nakatago ang background ng mga kontrol ng manlalaro + Ipinapakita ang background ng mga kontrol ng manlalaro + Itago ang Nakaraan at Susunod na mga pindutan + Nakatago ang mga pindutan + Ang mga pindutan ay ipinapakita + + + Itago ang mga end screen card + Nakatago ang mga end screen card + Ipinapakita ang mga end screen card + + + Huwag paganahin ang Ambient mode sa fullscreen + Naka-disable ang ambient mode + Pinagana ang ambient mode + + + Itago ang mga card ng impormasyon + Nakatago ang info cards + Nakalabas ang info cards + + + Huwag paganahin ang rolling number animation + Ang mga rolling number ay hindi animated + Ang mga rolling number ay animated + + + Itago ang seekbar ng video player + Nakatago ang seekbar ng video player + Ipinapakita ang seekbar ng video player + + Itago ang seekbar ng mga thumbnail ng video + Ang seekbar ng mga thumbnail ng video ay nakatago + Ang seekbar ng mga thumbnail ng video ay ipinapakita + + + Shorts Manlalaro + Itago o ipakita ang mga bahagi ng Shorts player + + Itago ang Shorts sa Home feed + Nakatago sa Home feed at mga kaugnay na video + Ipinapakita sa Home feed at mga kaugnay na video + Itago ang Shorts sa mga resulta ng paghahanap + Nakatago sa mga resulta ng paghahanap + Ipinakita sa mga resulta ng paghahanap + + Itago ang Shorts sa feed ng Mga Subscription + Nakatago sa feed ng Mga Subscription + Ipinapakita sa feed ng Mga Subscription + Itago ang Shorts sa watch history + Nakatago sa kasaysayan ng panonood + Ipinapakita sa watch history + Itago ang label na \"Naka-auto-dub\" + Nakatago ang label na auto-dubbed + Ipinapakita ang label na auto-dubbed + Itago ang button na \"Bumili ng Super Thanks\" + Nakatago ang pindutan na Bumili ng Super Thanks + Ipinapakita ang pindutan na Bumili ng Super Thanks + Itago ang Button ng Epekto + Nakatago ang button ng epekto + Nakikita ang button ng epekto + Itago ang button na \"Green screen\" + Nakatago ang pindutan ng \"Green screen\" + Ipinapakita ang pindutan ng \"Green screen\" + Itago ang pindutan ng \"Hashtag\" + Nakatago ang pindutan ng \"Hashtag\" + Ipinapakita ang pindutan ng \"Hashtag\" + + Itago ang Join button + Nakatago ang button na sumali + Ang pindutan ng pagsali ay ipinapakita + Itago ang live preview + Ang live preview ay nakatago + Ang live preview ay ipinapakita + Itago ang label ng lokasyon + Nakatago ang label ng lokasyon + Ipinapakita ang label ng lokasyon + Itago ang button na \"Bagong post\" + Nakatago ang button na Mga bagong post + Ipinapakita ang button na Mga bagong post + Itago ang mga naka-pause na pindutan ng overlay + Nakatago ang mga naka-pause na pindutan ng overlay + Ang mga naka-pause na pindutan ng overlay ay ipinapakita + Itago ang komento sa preview + Nakatago ang komento sa preview + Ipinapakita ang preview na komento + Itago ang button na \"I-save ang musika\" + Ang buton ng pag-save ng musika ay nakatago + Ang buton ng pag-save ng musika ay ipinapakita + Itago ang mga mungkahi sa paghahanap + Nakatago ang mga mungkahi sa paghahanap + Ipinapakita ang mga mungkahi sa paghahanap + Itago ang Shop button + Nakatago ang pindutan ng tindahan + Ang pindutan ng tindahan ay ipinapakita + Itago ang mga sticker + Nakatago ang mga sticker + Ipinapakita ang mga sticker + Itago ang Subscribe button + Nakatago ang button na mag-subscribe + Ang pindutan ng pag-subscribe ay ipinapakita + Itago ang mga naka-tag na produkto + Nakatago ang mga naka-tag na produkto + Ipinapakita ang mga naka-tag na produkto + Itago ang Upcoming button + Nakatago ang pindutan ng \"Upcoming\" + Ipinapakita ang pindutan ng \"Upcoming\" + Itago ang button na \"Gamitin ang tunog na ito\" + Nakatago ang button na Gamitin ang tunog na ito + Nakikita ang button na Gamitin ang tunog na ito + Itago ang button na \"Gamitin ang template na ito\" + Nakatago ang button na Gamitin ang template na ito + Ipinapakita ang button na Gamitin ang template na ito + Itago ang Like button fountain animation + Nakatago ang animation ng \"like button fountain\" + Ipinapakita ang animation ng \"like button fountain\" + Itago ang Like button + Nakatago ang like button + Ipapakita ang like button + Itago ang Dislike button + Nakatago ang dislike button + Ang dislike button ay ipinapakita + Itago ang Comments button + Nakatago ang button ng mga komento + Ang pindutan ng mga komento ay ipinapakita + + Itago ang Share button + Nakatago ang share button + Ang pindutan ng pagbabahagi ay ipinapakita + + Itago ang Remix button + Nakatago ang remix button + Ang remix button ay ipinapakita + Itago ang pindutan ng tunog + Nakatago ang sound button + Ang pindutan ng tunog ay ipinapakita + Itago ang panel ng impormasyon + Nakatago ang panel ng impormasyon + Ang panel ng impormasyon ay ipinapakita + Itago ang channel bar + Nakatago ang channel bar + Ipinapakita ang channel bar + Itago ang pamagat ng video + Nakatago ang pamagat ng video + Ipinapakita ang pamagat ng video + Itago ang sound metadata label + Nakatago ang label ng sound metadata + Ipinapakita ang label ng sound metadata + Itago ang label ng link ng video + Nakatago ang label ng link ng video + Ipinapakita ang label ng link ng video + Itago ang navigation bar + Nakatago ang navigation bar + Ipinapakita ang navigation bar + + + Itago ang iminungkahing video sa dulo ng screen + "Nakatago ang iminungkahing video sa dulo ng screen kapag nakapatay ang autoplay Maaaring baguhin ang Autoplay sa mga setting ng YouTube: Mga Setting → Pag-playback → I-autoplay ang susunod na video" - Ipinapakita ang iminungkahing video sa dulo ng screen - - - Itago ang overlay ng mga kaugnay na video - Nakatago ang overlay ng mga kaugnay na video sa fullscreen - Ipinapakita ang overlay ng mga kaugnay na video sa fullscreen - - - Itago ang timestamp ng video - Nakatago ang timestamp - Ipinapakita ang timestamp - - - Itago ang mga popup panel ng player - Nakatago ang mga popup panel ng player - Ipinapakita ang mga popup panel ng player - - - Lumabas sa fullscreen mode sa katapusan ng video - Na-disable - Patayo - Pahalang - Portrait at landscape - - - Buksan ang mga video sa fullscreen portrait - Binubuksan ang mga video sa fullscreen - Hindi binubuksan ang mga video sa fullscreen - - - Opacity ng overlay ng player - Ang halaga ng opacity sa pagitan ng 0-100, kung saan ang 0 ay transparent - Ang opacity ng overlay ng player ay dapat nasa pagitan ng 0-100 - - - - Pansamantalang hindi available ang mga hindi gusto (nag-time out ang API) - Hindi available ang mga hindi gusto (status %d) - Hindi available ang mga dislike (limitasyon sa client API) - Hindi available ang mga hindi gusto (%s) - - I-reload ang video para bumoto gamit ang Return YouTube Dislike - - Nakatago ng may-ari - Ang mga hindi gusto ay ipinapakita - Hindi ipinapakita ang mga hindi gusto - Ipakita ang mga hindi gusto sa Shorts - "Ipinapakita ang mga Dislike sa Shorts + Ipinapakita ang iminungkahing video sa dulo ng screen + + + Itago ang overlay ng mga kaugnay na video + Nakatago ang overlay ng mga kaugnay na video sa fullscreen + Ipinapakita ang overlay ng mga kaugnay na video sa fullscreen + + + Itago ang timestamp ng video + Nakatago ang timestamp + Ipinapakita ang timestamp + + + Itago ang mga popup panel ng player + Nakatago ang mga popup panel ng player + Ipinapakita ang mga popup panel ng player + + + Lumabas sa fullscreen mode sa katapusan ng video + Na-disable + Patayo + Pahalang + Portrait at landscape + + + Buksan ang mga video sa fullscreen portrait + Binubuksan ang mga video sa fullscreen + Hindi binubuksan ang mga video sa fullscreen + + + Opacity ng overlay ng player + Ang halaga ng opacity sa pagitan ng 0-100, kung saan ang 0 ay transparent + Ang opacity ng overlay ng player ay dapat nasa pagitan ng 0-100 + + + + Pansamantalang hindi available ang mga hindi gusto (nag-time out ang API) + Hindi available ang mga hindi gusto (status %d) + Hindi available ang mga dislike (limitasyon sa client API) + Hindi available ang mga hindi gusto (%s) + + I-reload ang video para bumoto gamit ang Return YouTube Dislike + + Nakatago ng may-ari + Ang mga hindi gusto ay ipinapakita + Hindi ipinapakita ang mga hindi gusto + Ipakita ang mga hindi gusto sa Shorts + "Ipinapakita ang mga Dislike sa Shorts Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode" - Hindi ipinapakita ang mga Dislike sa Shorts - Hindi gusto bilang porsyento - Ipinapakita ang mga Dislike bilang isang porsyento - Ipinapakita ang mga Dislike bilang isang numero - - Siksik na Pindutan ng Like - Like button na naka-istilong para sa minimum na lapad - I-style na button para sa pinakamahusay na hitsura - Ipakita ang tinantyang mga gusto - Ipinapakita ng mga video na naka-disable ang mga like ang tinatayang bilang ng mga like - Hindi ipinapakita ang mga tinatayang like - Magpakita ng toast kung hindi available ang API - Ipapakita ang toast kung hindi available ang Return YouTube Dislike - Hindi ipinapakita ang toast kung hindi available ang Return YouTube Dislike - Ang data ay ibinibigay ng Return YouTube Dislike API. Mag-tap dito para matuto pa - - ReturnYouTubeDislike API statistics ng device na ito - Oras ng pagtugon ng API, karaniwan - Oras ng pagtugon ng API, minimum - Oras ng pagtugon ng API, maximum - Oras ng pagtugon ng API, huling video - Pansamantalang hindi available ang mga hindi gusto - May bisa ang limitasyon sa rate ng Client API - Mga boto sa pagkuha ng API, bilang ng mga tawag - Walang ginawang mga tawag sa network - %d tawag sa network ang ginawa - Mga boto sa pagkuha ng API, bilang ng mga timeout - Walang mga tawag sa network na nag-time out - Nag-time out ang %d na tawag sa network - Mga limitasyon sa rate ng kliyente ng API - Walang nakatagpo na limitasyon sa rate ng kliyente - Nakatagpo ng %d beses ang limitasyon sa rate ng kliyente - %d millisecond - - - Paganahin ang malawak na search bar - Ang malawak na search bar ay pinagana - Naka-disable ang malawak na search bar - - - Paganahin ang mataas na kalidad na mga thumbnail - Mataas ang kalidad ng mga thumbnail ng seekbar - Katamtaman ang kalidad ng mga thumbnail ng seekbar - "Ito ay magpapanumbalik din ng mga thumbnail sa mga livestream na walang mga thumbnail ng seekbar. + Hindi ipinapakita ang mga Dislike sa Shorts + Hindi gusto bilang porsyento + Ipinapakita ang mga Dislike bilang isang porsyento + Ipinapakita ang mga Dislike bilang isang numero + + Siksik na Pindutan ng Like + Like button na naka-istilong para sa minimum na lapad + I-style na button para sa pinakamahusay na hitsura + Ipakita ang tinantyang mga gusto + Ipinapakita ng mga video na naka-disable ang mga like ang tinatayang bilang ng mga like + Hindi ipinapakita ang mga tinatayang like + Magpakita ng toast kung hindi available ang API + Ipapakita ang toast kung hindi available ang Return YouTube Dislike + Hindi ipinapakita ang toast kung hindi available ang Return YouTube Dislike + Ang data ay ibinibigay ng Return YouTube Dislike API. Mag-tap dito para matuto pa + + ReturnYouTubeDislike API statistics ng device na ito + Oras ng pagtugon ng API, karaniwan + Oras ng pagtugon ng API, minimum + Oras ng pagtugon ng API, maximum + Oras ng pagtugon ng API, huling video + Pansamantalang hindi available ang mga hindi gusto - May bisa ang limitasyon sa rate ng Client API + Mga boto sa pagkuha ng API, bilang ng mga tawag + Walang ginawang mga tawag sa network + %d tawag sa network ang ginawa + Mga boto sa pagkuha ng API, bilang ng mga timeout + Walang mga tawag sa network na nag-time out + Nag-time out ang %d na tawag sa network + Mga limitasyon sa rate ng kliyente ng API + Walang nakatagpo na limitasyon sa rate ng kliyente + Nakatagpo ng %d beses ang limitasyon sa rate ng kliyente + %d millisecond + + + Paganahin ang malawak na search bar + Ang malawak na search bar ay pinagana + Naka-disable ang malawak na search bar + + + Paganahin ang mataas na kalidad na mga thumbnail + Mataas ang kalidad ng mga thumbnail ng seekbar + Katamtaman ang kalidad ng mga thumbnail ng seekbar + "Ito ay magpapanumbalik din ng mga thumbnail sa mga livestream na walang mga thumbnail ng seekbar. Ang mga thumbnail ng seekbar ay gagamit ng parehong kalidad ng kasalukuyang video. Ang tampok na ito ay pinakamahusay na gumagana sa kalidad ng video na 720p o mas mababa at kapag gumagamit ng napakabilis na koneksyon sa internet." - Ibalik ang mga lumang thumbnail ng seekbar - Lalabas ang mga thumbnail ng Seekbar sa itaas ng seekbar - Lalabas ang mga thumbnail ng Seekbar sa fullscreen - - - I-enable ang SponsorBlock - Ang SponsorBlock ay isang crowdsourced system para sa pag-skip ng mga nakakainis na bahagi ng mga video sa YouTube - Hitsura - Ipakita ang pindutan ng pagboto - Ang pindutan ng pagboto ng segment ay ipinapakita - Hindi ipinapakita ang pindutan ng pagboto ng segment - Gumamit ng layout na parisukat - Ang mga button at kontrol ay parisukat - Bilog ang mga button at control - - Gumamit ng compact na button na Laktawan - Laktawan ang button na naka-istilo para sa minimum na lapad - Laktawan ang button na may istilo para sa pinakamahusay na hitsura - Awtomatikong itago ang button na Laktawan - Tinatago ang pindutan ng skip pagkatapos ng ilang segundo - Ipinapakita ang button na Laktawan para sa buong segment - Tagal ng pindutan ng Paglaktaw - Gaano katagal ipakita ang mga pindutan ng paglaktaw at paglaktaw sa highlight bago awtomatikong itago - Ipakita ang undo skip toast - Ipinapakita ang toast kapag awtomatikong nilaktawan ang isang segment. Tapikin ang notipikasyon ng toast upang i-undo ang paglaktaw - Hindi ipinapakita ang toast - Tagal ng toast sa paglaktaw - Gaano katagal ipakita ang paalala ng pag-undo ng paglaktaw - 1 segundo - 2 segundo - 3 segundo - 4 segundo - 5 segundo - 6 segundo - 7 segundo - 8 segundo - 9 segundo - 10 segundo - Ipakita ang haba ng video nang walang mga segment - Ang haba ng video nang walang lahat ng segment ay ipinapakita sa seekbar - Ipinapakita ang buong haba ng video - Paglikha ng mga bagong segment - Ipakita ang button na Gumawa ng bagong segment - Ang pindutan ng Lumikha ng bagong segment ay ipinapakita - Hindi ipinapakita ang button na Lumikha ng bagong segment - Ayusin ang bagong segment na hakbang - Bilang ng mga millisecond na gumagalaw ang mga button sa pagsasaayos ng oras kapag gumagawa ng mga bagong segment - Dapat ay isang positibong numero ang value - Tingnan ang mga alituntunin - Ang mga alituntunin ay naglalaman ng mga panuntunan at tip para sa paggawa ng mga bagong segment - Sundin ang mga alituntunin - Basahin ang mga alituntunin sa SponsorBlock bago gumawa ng mga bagong segment - Nabasa na - Ipakita mo saakin - Pangkalahatan - Magpakita ng toast kung hindi available ang API - Ang toast ay ipinapakita kung hindi available ang SponsorBlock - Hindi ipinapakita ang toast kung hindi available ang SponsorBlock - Paganahin ang pagsubaybay sa bilang ng laktawan - Hinahayaan ang SponsorBlock leaderboard na malaman kung gaano karaming oras ang nai-save. Ang isang mensahe ay ipinapadala sa leaderboard sa tuwing ang isang segment ay lalaktawan - Hindi pinagana ang pagsubaybay sa bilang ng laktawan - Minimum na tagal ng segment - Ang mga segment na mas maikli kaysa sa halagang ito (sa mga segundo) ay hindi ipapakita o lalaktawan - Hindi wastong tagal ng oras - Ang iyong pribadong user id - Gawin itong pribado. Ito ay gaya ng password na hindi dapat ibinabahagi sa iba. Kapag ito ay hawak ng iba, maaari ka nilang gayahin - Dapat na hindi bababa sa 30 character ang haba ng pribadong user id - Baguhin ang URL ng API - Ang address na ginagamit ng SponsorBlock upang tumawag sa server - Pag-reset ng URL ng API - Di-wasto ang URL ng API - Binago ang URL ng API - Mga setting ng import/export - Kopya - Ang iyong configuration ng SponsorBlock JSON na maaaring i-import/i-export sa ReVanced at iba pang mga platform ng SponsorBlock - Ang iyong configuration ng SponsorBlock JSON na maaaring i-import/i-export sa ReVanced at iba pang mga platform ng SponsorBlock. Kasama dito ang iyong pribadong user id. Siguraduhing ibahagi ito nang matalino - Matagumpay na na-import ang mga setting - Nabigong i-import: %s - Nabigong i-export: %s - "Ang iyong mga setting ay naglalaman ng isang pribadong SponsorBlock userid. + Ibalik ang mga lumang thumbnail ng seekbar + Lalabas ang mga thumbnail ng Seekbar sa itaas ng seekbar + Lalabas ang mga thumbnail ng Seekbar sa fullscreen + + + I-enable ang SponsorBlock + Ang SponsorBlock ay isang crowdsourced system para sa pag-skip ng mga nakakainis na bahagi ng mga video sa YouTube + Hitsura + Ipakita ang pindutan ng pagboto + Ang pindutan ng pagboto ng segment ay ipinapakita + Hindi ipinapakita ang pindutan ng pagboto ng segment + Gumamit ng layout na parisukat + Ang mga button at kontrol ay parisukat + Bilog ang mga button at control + + Gumamit ng compact na button na Laktawan + Laktawan ang button na naka-istilo para sa minimum na lapad + Laktawan ang button na may istilo para sa pinakamahusay na hitsura + Awtomatikong itago ang button na Laktawan + Tinatago ang pindutan ng skip pagkatapos ng ilang segundo + Ipinapakita ang button na Laktawan para sa buong segment + Tagal ng pindutan ng Paglaktaw + Gaano katagal ipakita ang mga pindutan ng paglaktaw at paglaktaw sa highlight bago awtomatikong itago + Ipakita ang undo skip toast + Ipinapakita ang toast kapag awtomatikong nilaktawan ang isang segment. Tapikin ang notipikasyon ng toast upang i-undo ang paglaktaw + Hindi ipinapakita ang toast + Tagal ng toast sa paglaktaw + Gaano katagal ipakita ang paalala ng pag-undo ng paglaktaw + 1 segundo + 2 segundo + 3 segundo + 4 segundo + 5 segundo + 6 segundo + 7 segundo + 8 segundo + 9 segundo + 10 segundo + Ipakita ang haba ng video nang walang mga segment + Ang haba ng video nang walang lahat ng segment ay ipinapakita sa seekbar + Ipinapakita ang buong haba ng video + Paglikha ng mga bagong segment + Ipakita ang button na Gumawa ng bagong segment + Ang pindutan ng Lumikha ng bagong segment ay ipinapakita + Hindi ipinapakita ang button na Lumikha ng bagong segment + Ayusin ang bagong segment na hakbang + Bilang ng mga millisecond na gumagalaw ang mga button sa pagsasaayos ng oras kapag gumagawa ng mga bagong segment + Dapat ay isang positibong numero ang value + Tingnan ang mga alituntunin + Ang mga alituntunin ay naglalaman ng mga panuntunan at tip para sa paggawa ng mga bagong segment + Sundin ang mga alituntunin + Basahin ang mga alituntunin sa SponsorBlock bago gumawa ng mga bagong segment + Nabasa na + Ipakita mo saakin + Pangkalahatan + Magpakita ng toast kung hindi available ang API + Ang toast ay ipinapakita kung hindi available ang SponsorBlock + Hindi ipinapakita ang toast kung hindi available ang SponsorBlock + Paganahin ang pagsubaybay sa bilang ng laktawan + Hinahayaan ang SponsorBlock leaderboard na malaman kung gaano karaming oras ang nai-save. Ang isang mensahe ay ipinapadala sa leaderboard sa tuwing ang isang segment ay lalaktawan + Hindi pinagana ang pagsubaybay sa bilang ng laktawan + Minimum na tagal ng segment + Ang mga segment na mas maikli kaysa sa halagang ito (sa mga segundo) ay hindi ipapakita o lalaktawan + Hindi wastong tagal ng oras + Ang iyong pribadong user id + Gawin itong pribado. Ito ay gaya ng password na hindi dapat ibinabahagi sa iba. Kapag ito ay hawak ng iba, maaari ka nilang gayahin + Dapat na hindi bababa sa 30 character ang haba ng pribadong user id + Baguhin ang URL ng API + Ang address na ginagamit ng SponsorBlock upang tumawag sa server + Pag-reset ng URL ng API + Di-wasto ang URL ng API + Binago ang URL ng API + Mga setting ng import/export + Kopya + Ang iyong configuration ng SponsorBlock JSON na maaaring i-import/i-export sa ReVanced at iba pang mga platform ng SponsorBlock + Ang iyong configuration ng SponsorBlock JSON na maaaring i-import/i-export sa ReVanced at iba pang mga platform ng SponsorBlock. Kasama dito ang iyong pribadong user id. Siguraduhing ibahagi ito nang matalino + Matagumpay na na-import ang mga setting + Nabigong i-import: %s + Nabigong i-export: %s + "Ang iyong mga setting ay naglalaman ng isang pribadong SponsorBlock userid. Ang iyong user id ay parang isang password at hindi dapat ibahagi. " - Huwag ipakitang muli - Baguhin ang gawi ng segment - Bayad na promosyon, bayad na referral at direktang advertisement. Hindi para sa self-promote o libreng shout-out sa mga sanhi/creator/website/produktong gusto nila - Walang bayad/Pag-promote sa Sarili - Katulad ng Sponsor maliban sa hindi bayad o self promotion. Kasama ang mga seksyon tungkol sa merchandise, donasyon, o impormasyon tungkol sa kung sino ang kanilang nakasama - Paalala sa Pakikipag-ugnayan (Mag-subscribe) - Isang maikling paalala na i-like, i-subscribe o sundan sila sa gitna ng content. Kung ito ay mahaba o tungkol sa isang partikular na bagay, dapat ay nasa ilalim ito ng self-promote - I-highlight - Ang bahagi ng video na hinahanap ng karamihan - Animasyon ng Intermission/Intro - Isang agwat na walang aktwal na nilalaman. Maaaring isang pause, static na frame, o umuulit na animation. Hindi kasama ang mga transition na naglalaman ng impormasyon - Mga Endcard / Credit - Mga kredito o kapag lumitaw ang mga endcard ng YouTube. Hindi para sa mga konklusyon na may impormasyon - Panimula / Pagbati - Mga sinasalaysay na trailer para sa paparating na video, pagbati at pamamaalam. Hindi kasama ang mga seksyon na nagdaragdag ng karagdagang nilalaman - Preview / Balik-tanaw - Koleksyon ng mga clip na nagpapakita kung ano ang paparating o kung ano ang nangyari sa video o sa iba pang mga video ng isang serye, kung saan ang lahat ng impormasyon ay inuulit sa ibang lugar - Paglihis / Mga Biro - Mga eksena o biro na hindi kinakailangan upang maunawaan ang pangunahing nilalaman ng video. Hindi kasama ang mga seksyon na nagbibigay ng konteksto o detalye sa background - Musika: Seksyon na Hindi Musika - Para lang gamitin sa mga music video. Mga seksyon ng mga music video na walang musika, na hindi pa sakop ng isa pang kategorya - Laktawan - I-highlight - Laktawan ang sponsor - Laktawan ang promo - Laktawan ang pakikipag-ugnayan - Laktawan upang i-highlight - Lagpasan ang introduksyon - Laktawan ang intermission - Laktawan ang intermission - Laktawan ang isa pa - Laktawan ang hook - Laktawan ang preview - Laktawan ang preview - Laktawan ang recap - Laktawan ang tangent - Laktawan ang hindi musika - Laktawan ang segment - Nilagpasang isponsor - Nilagpasang sariling promosyon - Nilagpasang sagabal na paalala - Nilaktawan upang i-highlight - Nilagpasang intro - Nilaktawan ang intermission - Nilaktawan ang intermission - Nilagpasang wakas - Nalaktawan ang hook - Nilaktawan ang preview - Nilaktawan ang preview - Nilaktawan ang recap - Nalaktawan ang tangent - Nilaktawan ang isang seksyon na hindi musika - Nilaktawan ang hindi naisumiteng segment - Nilaktawan ang maraming segment - Awtomatikong lumaktaw - Awtomatikong lumaktaw nang isang beses - Magpakita ng button na Laktawan - Ipakita sa seekbar - Huwag paganahin - Hindi maisumite ang segment: %s - Pansamantalang hindi gumagana ang SponsorBlock - Hindi maisumite ang segment (status: %1$d %2$s) - Hindi maipadala ang segment. Rate Limited (masyadong marami mula sa parehong user o IP) - Hindi maisumite ang segment: %s - "Hindi maipadala ang segment. + Huwag ipakitang muli + Baguhin ang gawi ng segment + Bayad na promosyon, bayad na referral at direktang advertisement. Hindi para sa self-promote o libreng shout-out sa mga sanhi/creator/website/produktong gusto nila + Walang bayad/Pag-promote sa Sarili + Katulad ng Sponsor maliban sa hindi bayad o self promotion. Kasama ang mga seksyon tungkol sa merchandise, donasyon, o impormasyon tungkol sa kung sino ang kanilang nakasama + Paalala sa Pakikipag-ugnayan (Mag-subscribe) + Isang maikling paalala na i-like, i-subscribe o sundan sila sa gitna ng content. Kung ito ay mahaba o tungkol sa isang partikular na bagay, dapat ay nasa ilalim ito ng self-promote + I-highlight + Ang bahagi ng video na hinahanap ng karamihan + Animasyon ng Intermission/Intro + Isang agwat na walang aktwal na nilalaman. Maaaring isang pause, static na frame, o umuulit na animation. Hindi kasama ang mga transition na naglalaman ng impormasyon + Mga Endcard / Credit + Mga kredito o kapag lumitaw ang mga endcard ng YouTube. Hindi para sa mga konklusyon na may impormasyon + Panimula / Pagbati + Mga sinasalaysay na trailer para sa paparating na video, pagbati at pamamaalam. Hindi kasama ang mga seksyon na nagdaragdag ng karagdagang nilalaman + Preview / Balik-tanaw + Koleksyon ng mga clip na nagpapakita kung ano ang paparating o kung ano ang nangyari sa video o sa iba pang mga video ng isang serye, kung saan ang lahat ng impormasyon ay inuulit sa ibang lugar + Paglihis / Mga Biro + Mga eksena o biro na hindi kinakailangan upang maunawaan ang pangunahing nilalaman ng video. Hindi kasama ang mga seksyon na nagbibigay ng konteksto o detalye sa background + Musika: Seksyon na Hindi Musika + Para lang gamitin sa mga music video. Mga seksyon ng mga music video na walang musika, na hindi pa sakop ng isa pang kategorya + Laktawan + I-highlight + Laktawan ang sponsor + Laktawan ang promo + Laktawan ang pakikipag-ugnayan + Laktawan upang i-highlight + Lagpasan ang introduksyon + Laktawan ang intermission + Laktawan ang intermission + Laktawan ang isa pa + Laktawan ang hook + Laktawan ang preview + Laktawan ang preview + Laktawan ang recap + Laktawan ang tangent + Laktawan ang hindi musika + Laktawan ang segment + Nilagpasang isponsor + Nilagpasang sariling promosyon + Nilagpasang sagabal na paalala + Nilaktawan upang i-highlight + Nilagpasang intro + Nilaktawan ang intermission + Nilaktawan ang intermission + Nilagpasang wakas + Nalaktawan ang hook + Nilaktawan ang preview + Nilaktawan ang preview + Nilaktawan ang recap + Nalaktawan ang tangent + Nilaktawan ang isang seksyon na hindi musika + Nilaktawan ang hindi naisumiteng segment + Nilaktawan ang maraming segment + Awtomatikong lumaktaw + Awtomatikong lumaktaw nang isang beses + Magpakita ng button na Laktawan + Ipakita sa seekbar + Huwag paganahin + Hindi maisumite ang segment: %s + Pansamantalang hindi gumagana ang SponsorBlock + Hindi maisumite ang segment (status: %1$d %2$s) + Hindi maipadala ang segment. Rate Limited (masyadong marami mula sa parehong user o IP) + Hindi maisumite ang segment: %s + "Hindi maipadala ang segment. Umiiral na" - Matagumpay na naisumite ang segment - - Pansamantalang hindi available ang SponsorBlock (nag-time out ang API) - Pansamantalang hindi available ang SponsorBlock (status %d) - Pansamantalang hindi available ang SponsorBlock - Hindi makaboto para sa segment (nag-time out ang API) - Hindi makaboto para sa segment (status: %1$d %2$s) - Hindi makaboto para sa segment: %s - Itaas na Boto - I-downvote - Baguhin ang kategorya - Walang mga segment na iboboto - - %1$s hanggang %2$s - Piliin ang kategorya ng segment - Naka-disable ang kategorya sa mga setting. Paganahin ang kategoryang isumite. - Bagong segment ng SponsorBlock - Itakda ang %s bilang simula o katapusan ng isang bagong segment? - Simula - Dulo - Ngayon - Oras na magsisimula ang segment sa - Oras na nagtatapos ang segment sa - Tama ba ang mga oras? - "Ang segment ay mula sa + Matagumpay na naisumite ang segment + + Pansamantalang hindi available ang SponsorBlock (nag-time out ang API) + Pansamantalang hindi available ang SponsorBlock (status %d) + Pansamantalang hindi available ang SponsorBlock + Hindi makaboto para sa segment (nag-time out ang API) + Hindi makaboto para sa segment (status: %1$d %2$s) + Hindi makaboto para sa segment: %s + Itaas na Boto + I-downvote + Baguhin ang kategorya + Walang mga segment na iboboto + + %1$s hanggang %2$s + Piliin ang kategorya ng segment + Naka-disable ang kategorya sa mga setting. Paganahin ang kategoryang isumite. + Bagong segment ng SponsorBlock + Itakda ang %s bilang simula o katapusan ng isang bagong segment? + Simula + Dulo + Ngayon + Oras na magsisimula ang segment sa + Oras na nagtatapos ang segment sa + Tama ba ang mga oras? + "Ang segment ay mula sa %1$s papunta sa @@ -1275,44 +1274,44 @@ papunta sa (%3$s) Isumite na ba?" - Ang simula ay dapat bago ang katapusan - Markahan muna ang dalawang lokasyon sa time bar - Silipin ang segment, at tiyaking lumalaktaw ito nang maayos - Manu-manong i-edit ang timing ng segment - Gusto mo bang i-edit ang timing para sa pagsisimula o pagtatapos ng segment? - Hindi wastong oras ang ibinigay - Istatistika - - Pansamantalang hindi available ang mga Stats (down ang API) - Naglo-load... - Ang SponsorBlock ay hindi pinagana - Ang iyong username: <b>%s</b> - Mag-tap dito para baguhin ang iyong username - Hindi mapalitan ang username: Status: %1$d %2$s - Matagumpay na nabago ang username - Ang iyong reputasyon ay <b>%.2f</b> - Nilikha mo ang <b>%s</b> mga segment - Tapikin dito upang tingnan ang iyong mga segment - SponsorBlock Talaan ng mga Nangunguna - Nailigtas mo ang mga tao mula sa <b>%s</b> mga segment - Mag-tap dito para makita ang mga pandaigdigang istatistika at nangungunang contributor - Iyon ay <b>%s</b> ng kanilang buhay.<br>Mag-tap dito para makita ang leaderboard - Nilaktawan mo ang <b>%s</b> mga segment - Iyon ay <b>%s</b> - I-reset ang counter ng mga nilaktawan na segment? - %1$s oras %2$s minuto - %1$s minuto %2$s segundo - %s segundo - Kulay: - Tungkol - Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform - - - Kaayusan ng Form Factor - Regular - Telepono - Awtomatiko - "Kasama sa mga pagbabago: + Ang simula ay dapat bago ang katapusan + Markahan muna ang dalawang lokasyon sa time bar + Silipin ang segment, at tiyaking lumalaktaw ito nang maayos + Manu-manong i-edit ang timing ng segment + Gusto mo bang i-edit ang timing para sa pagsisimula o pagtatapos ng segment? + Hindi wastong oras ang ibinigay + Istatistika + + Pansamantalang hindi available ang mga Stats (down ang API) + Naglo-load... + Ang SponsorBlock ay hindi pinagana + Ang iyong username: <b>%s</b> + Mag-tap dito para baguhin ang iyong username + Hindi mapalitan ang username: Status: %1$d %2$s + Matagumpay na nabago ang username + Ang iyong reputasyon ay <b>%.2f</b> + Nilikha mo ang <b>%s</b> mga segment + Tapikin dito upang tingnan ang iyong mga segment + SponsorBlock Talaan ng mga Nangunguna + Nailigtas mo ang mga tao mula sa <b>%s</b> mga segment + Mag-tap dito para makita ang mga pandaigdigang istatistika at nangungunang contributor + Iyon ay <b>%s</b> ng kanilang buhay.<br>Mag-tap dito para makita ang leaderboard + Nilaktawan mo ang <b>%s</b> mga segment + Iyon ay <b>%s</b> + I-reset ang counter ng mga nilaktawan na segment? + %1$s oras %2$s minuto + %1$s minuto %2$s segundo + %s segundo + Kulay: + Tungkol + Ang data ay ibinibigay ng SponsorBlock API. Mag-tap dito para matuto pa at makakita ng mga download para sa iba pang platform + + + Kaayusan ng Form Factor + Regular + Telepono + Awtomatiko + "Kasama sa mga pagbabago: Layout ng tablet • Nakatago ang mga post sa Community @@ -1320,303 +1319,301 @@ Layout ng tablet Layout ng automotive • Nagbubukas ang Shorts sa regular na player • Inorganisa ang feed ayon sa mga paksa at channel" - - - Spoof na bersyon ng app - Na-spoof ang bersyon - Hindi na-spoof ang bersyon - "Ang bersyon ng app ay mapapang-ulol sa isang mas lumang bersyon ng YouTube. + + + Spoof na bersyon ng app + Na-spoof ang bersyon + Hindi na-spoof ang bersyon + "Ang bersyon ng app ay mapapang-ulol sa isang mas lumang bersyon ng YouTube. Ito ay magbabago sa hitsura at mga tampok ng app, ngunit maaaring mangyari ang mga hindi kilalang epekto. Kung mamaya ay patayin, inirerekumenda na i-clear ang data ng app upang maiwasan ang mga bug ng UI." - Target na bersyon ng Spoof app - 20.13.41 - Ibalik ang hindi nakatiklop na video action bar - 20.05.46 - Ibalik ang paggana ng transcript - 19.35.36 - Ibalik ang mga lumang icon ng Shorts player - 19.01.34 - Ibalik ang mga lumang icon ng navigation - - - Baguhin ang panimulang pahina - Regular - Lahat ng mga subscription - Mag-browse ng mga channel - Mga Kurso/Pag-aaral - Galugarin - Fashion at& Kagandahan - Paglalaro - Kasaysayan - Aklatan - Nagustuhan ang mga video - Mga Pelikula - Musika - Mga Balita - Mga Abiso - Mga Playlist - Maghanap - Pamimili - Isports - Mga subscription - Uso - Birtuwal na Katotohanan - Panoorin mamaya - Mga clip mo - Palaging baguhin ang panimulang pahina - "Palaging binabago ang panimulang pahina + Target na bersyon ng Spoof app + 20.13.41 - Ibalik ang hindi nakatiklop na video action bar + 20.05.46 - Ibalik ang paggana ng transcript + 19.35.36 - Ibalik ang mga lumang icon ng Shorts player + 19.01.34 - Ibalik ang mga lumang icon ng navigation + + + Baguhin ang panimulang pahina + Regular + Lahat ng mga subscription + Mag-browse ng mga channel + Mga Kurso/Pag-aaral + Galugarin + Fashion at& Kagandahan + Paglalaro + Kasaysayan + Aklatan + Nagustuhan ang mga video + Mga Pelikula + Musika + Mga Balita + Mga Abiso + Mga Playlist + Maghanap + Pamimili + Isports + Mga subscription + Uso + Birtuwal na Katotohanan + Panoorin mamaya + Mga clip mo + Palaging baguhin ang panimulang pahina + "Palaging binabago ang panimulang pahina Limitasyon: Maaaring hindi gumana ang paggamit ng back button sa toolbar" - Binago ang panimulang pahina sa pagbukas lang ng app - - - Huwag paganahin ang pagpapatuloy na manlalaro ng Shorts - Hindi magpapatuloy ang Shorts player sa pagsisimula ng app - Magpapatuloy ang manlalaro ng shorts sa pagsisimula ng app - - - Buksan ang Shorts gamit ang - - - Awtomatikong pag-play ng Shorts - Awtomatikong magpa-play ang mga Shorts - Uulitin ang mga Shorts - Awtomatikong pag-play ng Shorts sa background - Awtomatikong magpa-play ang mga Shorts sa background - Uulitin ang mga Shorts sa background - - - Baguhin ang estilo ng naka-minimize na in-app player - Uri ng miniplayer - Hindi - Regular - Tableta - Moderno 1 - Moderno 2 - Moderno 3 - Makabagong 4 - Huwag paganahin ang bilog na mga sulok - Parihaba ang mga sulok - Bilugan ang mga sulok - Paganahin ang pag-resize gamit ang double-tap at pinch - "Ang pagkilos ng double-tap at pinch upang baguhin ang laki ay pinagana + Binago ang panimulang pahina sa pagbukas lang ng app + + + Huwag paganahin ang pagpapatuloy na manlalaro ng Shorts + Hindi magpapatuloy ang Shorts player sa pagsisimula ng app + Magpapatuloy ang manlalaro ng shorts sa pagsisimula ng app + + + Buksan ang Shorts gamit ang + + + Awtomatikong pag-play ng Shorts + Awtomatikong magpa-play ang mga Shorts + Uulitin ang mga Shorts + Awtomatikong pag-play ng Shorts sa background + Awtomatikong magpa-play ang mga Shorts sa background + Uulitin ang mga Shorts sa background + + + Baguhin ang estilo ng naka-minimize na in-app player + Uri ng miniplayer + Hindi + Regular + Tableta + Moderno 1 + Moderno 2 + Moderno 3 + Makabagong 4 + Huwag paganahin ang bilog na mga sulok + Parihaba ang mga sulok + Bilugan ang mga sulok + Paganahin ang pag-resize gamit ang double-tap at pinch + "Ang pagkilos ng double-tap at pinch upang baguhin ang laki ay pinagana • Double tap upang dagdagan ang laki ng \"miniplayer\" • Double tap muli upang ibalik ang orihinal na laki" - Hindi pinagana ang pagkilos ng double-tap at pag-resize gamit ang pinch - Huwag paganahin ang pagkaladkad at paghulog - Hindi pinagana ang drag and drop - "Ang drag and drop ay pinagana + Hindi pinagana ang pagkilos ng double-tap at pag-resize gamit ang pinch + Huwag paganahin ang pagkaladkad at paghulog + Hindi pinagana ang drag and drop + "Ang drag and drop ay pinagana Ang \"miniplayer\" ay maaaring i-drag sa anumang sulok ng screen" - Huwag paganahin ang pahalang na kilos ng pagkaladkad - Hindi pinagana ang pahalang na drag gesture - "Ang horizontal drag gesture ay pinagana + Huwag paganahin ang pahalang na kilos ng pagkaladkad + Hindi pinagana ang pahalang na drag gesture + "Ang horizontal drag gesture ay pinagana Ang \"miniplayer\" ay maaaring i-drag palabas ng screen sa kaliwa o kanan" - Itago ang mga button ng overlay - Nakatago ang mga button ng overlay - Ipinapakita ang mga button ng overlay - Itago ang mga subtext - Nakatago ang mga subtext - Ipinapakita ang mga subtext - Itago ang mga pindutan ng paglaktaw pasulong at pabalik - Lumaktaw pasulong at pabalik ay nakatago - Lumaktaw pasulong at pabalik ay ipinapakita - Paunang laki - Paunang laki sa screen, sa pixels - Ang laki ng pixel ay dapat nasa pagitan ng %1$s at %2$s - Opacity ng overlay - Ang halaga ng opacity sa pagitan ng 0-100, kung saan ang 0 ay transparent - Ang opacity ng miniplayer overlay ay dapat nasa pagitan ng 0-100 - - - Paganahin ang gradient loading screen - Ang paglo-load ng screen ay magkakaroon ng gradient na background - Ang paglo-load ng screen ay magkakaroon ng solidong background - Estilo ng splash screen - Kulay - Itim at puti - Paganahin ang custom na kulay ng seekbar - Ipinapakita ang kulay ng custom na seekbar - Ipinapakita ang orihinal na kulay ng seekbar - Kulay ng pasadyang seekbar - Kulay ng seekbar - Kulay ng pasadyang accent ng seekbar - Ang accent na kulay ng seekbar - Hindi wastong halaga ng kulay ng seekbar - - - - - Logo ng Header - - Pasadyang - - - Bypass ang mga paghihigpit sa rehiyon ng imahe - Ginagamit ang image host yt4.ggpht.com - "Gumagamit ng orihinal na image host + Itago ang mga button ng overlay + Nakatago ang mga button ng overlay + Ipinapakita ang mga button ng overlay + Itago ang mga subtext + Nakatago ang mga subtext + Ipinapakita ang mga subtext + Itago ang mga pindutan ng paglaktaw pasulong at pabalik + Lumaktaw pasulong at pabalik ay nakatago + Lumaktaw pasulong at pabalik ay ipinapakita + Paunang laki + Paunang laki sa screen, sa pixels + Ang laki ng pixel ay dapat nasa pagitan ng %1$s at %2$s + Opacity ng overlay + Ang halaga ng opacity sa pagitan ng 0-100, kung saan ang 0 ay transparent + Ang opacity ng miniplayer overlay ay dapat nasa pagitan ng 0-100 + + + Paganahin ang gradient loading screen + Ang paglo-load ng screen ay magkakaroon ng gradient na background + Ang paglo-load ng screen ay magkakaroon ng solidong background + Estilo ng splash screen + Kulay + Itim at puti + Paganahin ang custom na kulay ng seekbar + Ipinapakita ang kulay ng custom na seekbar + Ipinapakita ang orihinal na kulay ng seekbar + Kulay ng pasadyang seekbar + Kulay ng seekbar + Kulay ng pasadyang accent ng seekbar + Ang accent na kulay ng seekbar + Hindi wastong halaga ng kulay ng seekbar + + + + Logo ng Header + + Pasadyang + + + Bypass ang mga paghihigpit sa rehiyon ng imahe + Ginagamit ang image host yt4.ggpht.com + "Gumagamit ng orihinal na image host Ang pagpapagana nito ay maaaring ayusin ang mga nawawalang imahe na hinarangan sa ilang mga rehiyon" - - - - Tab ng tahanan - - Tab ng Mga Subscription - - Tab mo - Mga playlist & rekomendasyon ng player - Mga Resulta ng Paghahanap - Mga orihinal na thumbnail - DeArrow & Mga orihinal na thumbnail - DeArrow & Kinukuha pa rin - Kinukuha pa rin - "Ang DeArrow ay nagbibigay ng mga crowd-sourced na thumbnail para sa mga video ng YouTube. Ang mga thumbnail na ito ay madalas na mas may kaugnayan kaysa sa mga ibinigay ng YouTube + + + + Tab ng tahanan + + Tab ng Mga Subscription + + Tab mo + Mga playlist & rekomendasyon ng player + Mga Resulta ng Paghahanap + Mga orihinal na thumbnail + DeArrow & Mga orihinal na thumbnail + DeArrow & Kinukuha pa rin + Kinukuha pa rin + "Ang DeArrow ay nagbibigay ng mga crowd-sourced na thumbnail para sa mga video ng YouTube. Ang mga thumbnail na ito ay madalas na mas may kaugnayan kaysa sa mga ibinigay ng YouTube Kung pinagana, ang mga URL ng video ay ipapadala sa API server at walang ibang data ang ipapadala. Kung ang isang video ay walang mga thumbnail ng DeArrow, kung gayon ang mga orihinal o still capture ay ipapakita Mag-tap dito upang matuto nang higit pa tungkol sa DeArrow" - Magpakita ng toast kung hindi available ang API - Ang toast ay ipinapakita kung hindi available ang DeArrow - Hindi ipinapakita ang toast kung hindi available ang DeArrow - Ang URL ng DeArrow thumbnail cache endpoint - Nakakuha pa rin ng video - Kinukuha ang mga still capture mula sa simula/gitna/katapusan ng bawat video. Ang mga larawang ito ay binuo sa YouTube at walang panlabas na API na ginagamit - Gumamit ng mabilis na mga pagkuha pa rin - Ang paggamit ng katamtamang kalidad ay nakakakuha pa rin. Maglo-load nang mas mabilis ang mga thumbnail, ngunit maaaring magpakita ng mga blangkong thumbnail ang mga live stream, hindi pa nailalabas, o napakatandang mga video - Ang paggamit ng mataas na kalidad ay nakakakuha pa rin - Ang tagal ng pagkuha ng video mula sa mga pagkuha pa rin - Simula ng video - Gitna ng video - Katapusan ng video - - Pansamantalang hindi available ang DeArrow (status code: %s) - Pansamantalang hindi available ang DeArrow - - - Ipakita ang mga anunsyo ng ReVanced - Ipinapakita ang mga Anunsyo sa pagsisimula - Hindi ipinapakita ang mga Anunsyo sa pagsisimula - Ipakita ang mga anunsyo sa startup - Nabigong kumonekta sa provider ng mga anunsyo - Kalimutan - - - Paganahin ang loop ng video - Maglo-loop ang video - Hindi maglo-loop ang video - - - Ipakita ang button ng loop ng video - Ipinapakita ang button - Hindi ipinapakita ang buton - Naka-on ang loop ng video - Naka-off ang loop ng video - - - - - Mga dimensyon ng spoof device - "Ang mga sukat ng device ay mapapang-ulol + Magpakita ng toast kung hindi available ang API + Ang toast ay ipinapakita kung hindi available ang DeArrow + Hindi ipinapakita ang toast kung hindi available ang DeArrow + Ang URL ng DeArrow thumbnail cache endpoint + Nakakuha pa rin ng video + Kinukuha ang mga still capture mula sa simula/gitna/katapusan ng bawat video. Ang mga larawang ito ay binuo sa YouTube at walang panlabas na API na ginagamit + Gumamit ng mabilis na mga pagkuha pa rin + Ang paggamit ng katamtamang kalidad ay nakakakuha pa rin. Maglo-load nang mas mabilis ang mga thumbnail, ngunit maaaring magpakita ng mga blangkong thumbnail ang mga live stream, hindi pa nailalabas, o napakatandang mga video + Ang paggamit ng mataas na kalidad ay nakakakuha pa rin + Ang tagal ng pagkuha ng video mula sa mga pagkuha pa rin + Simula ng video + Gitna ng video + Katapusan ng video + + Pansamantalang hindi available ang DeArrow (status code: %s) + Pansamantalang hindi available ang DeArrow + + + Ipakita ang mga anunsyo ng ReVanced + Ipinapakita ang mga Anunsyo sa pagsisimula + Hindi ipinapakita ang mga Anunsyo sa pagsisimula + Ipakita ang mga anunsyo sa startup + Nabigong kumonekta sa provider ng mga anunsyo + Kalimutan + + + Paganahin ang loop ng video + Maglo-loop ang video + Hindi maglo-loop ang video + + + Ipakita ang button ng loop ng video + Ipinapakita ang button + Hindi ipinapakita ang buton + Naka-on ang loop ng video + Naka-off ang loop ng video + + + + Mga dimensyon ng spoof device + "Ang mga sukat ng device ay mapapang-ulol Ang mas mataas na kalidad ng video ay maaaring mabuksan ngunit maaari kang makaranas ng pag-stutter ng paglalaro ng video, mas masamang buhay ng baterya, at mga hindi kilalang epekto" - "Ang mga sukat ng device ay hindi mapapang-ulol + "Ang mga sukat ng device ay hindi mapapang-ulol Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video" - Ang pagpapagana nito ay maaaring magdulot ng pagkautal sa pag-playback ng video, mas malala ang buhay ng baterya, at hindi kilalang mga side effect. - - - Baguhin ang haptic feedback - Huwag paganahin ang chapters haptics - Hindi pinagana ang Chapters haptics - Pinagana ang Chapters haptics - Huwag paganahin ang tumpak na paghahanap ng haptics - Hindi pinagana ang tumpak na paghahanap ng haptics - Pinagana ang tumpak na paghahanap ng haptics - Huwag paganahin ang seek undo haptics - Hindi pinagana ang seek undo haptics - Pinagana ang seek undo haptics - Huwag paganahin ang zoom haptics - Hindi pinagana ang zoom haptics - Pinagana ang zoom haptics - - - Kung kamakailan mo lang binago ang mga detalye sa pag-login sa iyong account, i-uninstall at muling i-install ang MicroG. - - - I-bypass ang mga pag-redirect ng URL - Ang mga pag-redirect ng URL ay na-bypass - Hindi na-bypass ang mga pag-redirect ng URL - - - Buksan ang mga link sa browser - Binubuksan ang mga link sa panlabas na browser - Binubuksan ang mga link sa in-app na browser - - - - Awtomatik - Tandaan ang mga pagbabago sa kalidad ng video - Nalalapat ang mga pagbabago sa kalidad sa lahat ng video - Nalalapat lang ang mga pagbabago sa kalidad sa kasalukuyang video - Ipakita ang toast kapag nagbago ang kalidad ng video - May ipinapakitang toast kapag binago ang default na kalidad ng video - Walang ipinapakitang toast kapag binago ang default na kalidad ng video - Default na kalidad ng video sa Wi-Fi network - Default na kalidad ng video sa mobile network - Tandaan ang mga pagbabago sa kalidad ng Shorts - Nalalapat ang mga pagbabago sa kalidad sa lahat ng Shorts - Nalalapat lamang ang mga pagbabago sa kalidad sa kasalukuyang Short - Default na kalidad ng Shorts sa Wi-Fi network - Default na kalidad ng Shorts sa mobile network - Mobile - Wifi - Binago ang default na kalidad ng %1$s sa: %2$s - Binago ang kalidad ng Shorts %1$s sa: %2$s - - - Ipakita ang pindutan ng dialog ng bilis - Nakalabas ang button ng dialog ng bilis. Pindutin nang matagal para ibalik sa default ang bilis ng pag-playback. - Hindi nakalabas ang button ng dialog ng bilis - - - Ipakita ang button ng kalidad ng video - Nakalabas ang button ng kalidad ng video. Pindutin nang matagal para ibalik sa default ang kalidad. - Hindi nakalabas ang button ng kalidad ng video - - - Menu ng pasadyang bilis ng pag-playback - Ipinapakita ang menu ng pasadyang bilis - Hindi ipinapakita ang menu ng pasadyang bilis - Ibalik ang lumang menu ng bilis ng pag-playback - Ipinapakita ang lumang menu ng bilis - Ipinapakita ang modernong menu ng bilis - Mga custom na bilis ng pag-playback - Magdagdag o baguhin ang mga pasadyang bilis ng pag-playback - Ang mga custom na bilis ay dapat na mas mababa sa %s - Hindi wastong custom na bilis ng paglalaro - Awtomatik - Custom speed para sa pag-tap at pag-hold - Tugtugin ang bilis ng playback sa pagitan ng 0-8 - - - Tandaan ang mga pagbabago sa bilis ng pag-playback - Nalalapat ang mga pagbabago sa bilis ng pag-playback sa lahat ng video - Nalalapat lamang ang mga pagbabago sa bilis ng pag-playback sa kasalukuyang video - Ipakita ang toast kapag nagbago ang bilis ng pag-playback - May ipinapakitang toast kapag binago ang default na bilis ng pag-playback - Hindi ipinapakita ang paalala kapag binago ang default na bilis ng pag-playback. - Default na bilis ng pag-playback - Binago ang default na bilis sa: %s - - - Huwag paganahin ang HDR video - Hindi pinagana ang HDR video - Pinagana ang HDR video - Piliting gamitin ang AVC (H.264) - Ang video codec ay pinilit na gumamit ng AVC (H.264) - Awtomatikong tinutukoy ang video codec - "Mga Benepisyo: + Ang pagpapagana nito ay maaaring magdulot ng pagkautal sa pag-playback ng video, mas malala ang buhay ng baterya, at hindi kilalang mga side effect. + + + Baguhin ang haptic feedback + Huwag paganahin ang chapters haptics + Hindi pinagana ang Chapters haptics + Pinagana ang Chapters haptics + Huwag paganahin ang tumpak na paghahanap ng haptics + Hindi pinagana ang tumpak na paghahanap ng haptics + Pinagana ang tumpak na paghahanap ng haptics + Huwag paganahin ang seek undo haptics + Hindi pinagana ang seek undo haptics + Pinagana ang seek undo haptics + Huwag paganahin ang zoom haptics + Hindi pinagana ang zoom haptics + Pinagana ang zoom haptics + + + Kung kamakailan mo lang binago ang mga detalye sa pag-login sa iyong account, i-uninstall at muling i-install ang MicroG. + + + I-bypass ang mga pag-redirect ng URL + Ang mga pag-redirect ng URL ay na-bypass + Hindi na-bypass ang mga pag-redirect ng URL + + + Buksan ang mga link sa browser + Binubuksan ang mga link sa panlabas na browser + Binubuksan ang mga link sa in-app na browser + + + + Awtomatik + Tandaan ang mga pagbabago sa kalidad ng video + Nalalapat ang mga pagbabago sa kalidad sa lahat ng video + Nalalapat lang ang mga pagbabago sa kalidad sa kasalukuyang video + Ipakita ang toast kapag nagbago ang kalidad ng video + May ipinapakitang toast kapag binago ang default na kalidad ng video + Walang ipinapakitang toast kapag binago ang default na kalidad ng video + Default na kalidad ng video sa Wi-Fi network + Default na kalidad ng video sa mobile network + Tandaan ang mga pagbabago sa kalidad ng Shorts + Nalalapat ang mga pagbabago sa kalidad sa lahat ng Shorts + Nalalapat lamang ang mga pagbabago sa kalidad sa kasalukuyang Short + Default na kalidad ng Shorts sa Wi-Fi network + Default na kalidad ng Shorts sa mobile network + Mobile + Wifi + Binago ang default na kalidad ng %1$s sa: %2$s + Binago ang kalidad ng Shorts %1$s sa: %2$s + + + Ipakita ang pindutan ng dialog ng bilis + Nakalabas ang button ng dialog ng bilis. Pindutin nang matagal para ibalik sa default ang bilis ng pag-playback. + Hindi nakalabas ang button ng dialog ng bilis + + + Ipakita ang button ng kalidad ng video + Nakalabas ang button ng kalidad ng video. Pindutin nang matagal para ibalik sa default ang kalidad. + Hindi nakalabas ang button ng kalidad ng video + + + Menu ng pasadyang bilis ng pag-playback + Ipinapakita ang menu ng pasadyang bilis + Hindi ipinapakita ang menu ng pasadyang bilis + Ibalik ang lumang menu ng bilis ng pag-playback + Ipinapakita ang lumang menu ng bilis + Ipinapakita ang modernong menu ng bilis + Mga custom na bilis ng pag-playback + Magdagdag o baguhin ang mga pasadyang bilis ng pag-playback + Ang mga custom na bilis ay dapat na mas mababa sa %s + Hindi wastong custom na bilis ng paglalaro + Awtomatik + Custom speed para sa pag-tap at pag-hold + Tugtugin ang bilis ng playback sa pagitan ng 0-8 + + + Tandaan ang mga pagbabago sa bilis ng pag-playback + Nalalapat ang mga pagbabago sa bilis ng pag-playback sa lahat ng video + Nalalapat lamang ang mga pagbabago sa bilis ng pag-playback sa kasalukuyang video + Ipakita ang toast kapag nagbago ang bilis ng pag-playback + May ipinapakitang toast kapag binago ang default na bilis ng pag-playback + Hindi ipinapakita ang paalala kapag binago ang default na bilis ng pag-playback. + Default na bilis ng pag-playback + Binago ang default na bilis sa: %s + + + Huwag paganahin ang HDR video + Hindi pinagana ang HDR video + Pinagana ang HDR video + Piliting gamitin ang AVC (H.264) + Ang video codec ay pinilit na gumamit ng AVC (H.264) + Awtomatikong tinutukoy ang video codec + "Mga Benepisyo: • Maaaring mapabuti ang buhay ng baterya • Maaaring maibalik ang nawawalang resolusyon ng video sa mas lumang device @@ -1625,176 +1622,175 @@ Mga Limitasyon: • Ang pag-playback ng video ay gagamit ng mas maraming data ng internet kaysa sa VP9 o AV1 • Ang mga HDR video ay hindi gagamit ng AVC • Hindi kayang ipilit ng ilang device ang AVC" - - - Ipakita ang advanced na menu ng kalidad ng video - Ipinapakita ang advanced na menu ng kalidad ng video - Hindi ipinapakita ang advanced na menu ng kalidad ng video - - - Paganahin ang slide para maghanap - Naka-enable ang slide to seek - Hindi pinagana ang slide to seek - - - Payagan ang Android VR AV1 - "Ang video codec ay AVC (H.264), VP9, o AV1 + + + Ipakita ang advanced na menu ng kalidad ng video + Ipinapakita ang advanced na menu ng kalidad ng video + Hindi ipinapakita ang advanced na menu ng kalidad ng video + + + Paganahin ang slide para maghanap + Naka-enable ang slide to seek + Hindi pinagana ang slide to seek + + + Payagan ang Android VR AV1 + "Ang video codec ay AVC (H.264), VP9, o AV1 Maaaring mag-stutter o mag-drop ng frames ang playback" - Ang video codec ay AVC (H.264) o VP9 - "Ang pagpapagana sa setting na ito ay maaaring gumamit ng software AV1 decoding. + Ang video codec ay AVC (H.264) o VP9 + "Ang pagpapagana sa setting na ito ay maaaring gumamit ng software AV1 decoding. Maaaring mag-stutter o mag-drop ng frames ang pag-playback ng video na may AV1." - Mga epekto ng pagpapanggap - • Pang-eksperimentong kliyente at maaaring huminto sa paggana anumang oras - • Maaaring huminto ang video sa 1:00, o maaaring hindi available sa ilang rehiyon - • Nawawala ang menu ng audio track - • Walang AV1 video codec - • Hindi available ang stable volume - • Mga video ng mga bata ay maaaring hindi ma-play kapag naka-log out o nasa incognito mode - - • Ang Pilitin ang orihinal na audio ay hindi magagamit - Ipakita sa Mga Istatistika para sa mga nerds - Ipinapakita ang uri ng kliyente sa Mga Istatistika para sa mga nerds - Nakatago ang kliyente sa Mga Istatistika para sa mga nerds - - - - - - - Tungkol - Mga Ad - Pangkalahatan - Manlalaro - Iba-iba - - - Itago ang mga video ad - Nakatago ang mga video ad - Ipinapakita ang mga video ad - - - Paganahin ang permanenteng pag-ulit - Pinagana ang permanenteng pag-ulit - Hindi pinagana ang permanenteng pag-ulit - - - Itago ang pindutan ng Cast - Nakatago ang pindutan ng Cast - Ipinapakita ang pindutan ng Cast - Itago ang button ng history - Nakatago ang button ng history - Naka-display ang button ng history - Itago ang button ng notification - Nakakubli ang button ng notification - Ipinapakita ang button ng notification - Itago ang button ng paghahanap - Nakakubli ang button ng paghahanap - Ipinapakita ang button ng paghahanap - - - Itago ang category bar - Nakatago ang category bar - Ipinapakita ang category bar - - - Palitan ang kulay ng miniplayer - Ang kulay ng miniplayer ay tumutugma sa fullscreen player - Gumagamit ang miniplayer ng default na kulay - - - Itago o baguhin ang mga pindutan ng navigation bar - - Itago ang Tahanan - Nakatago ang pindutan ng Home - Nakalabas ang pindutan ng Home - - Itago ang Mga Sample - Nakatago ang pindutan ng Samples - Nakalabas ang pindutan ng Samples - - Itago ang Galugarin - Nakatago ang pindutan ng Explore - Nakalabas ang pindutan ng Explore - - Itago ang Aklatan - Nakatago ang pindutan ng Library - Nakalabas ang pindutan ng Library - - Itago ang I-upgrade - Nakatago ang pindutan ng Upgrade - Nakalabas ang pindutan ng Upgrade - Itago ang navigation bar - Nakatago ang navigation bar - Nakalabas ang navigation bar - Itago ang mga label ng pindutan ng navigation - Nakatago ang mga label - Nakalabas ang mga label - - - Itago ang label na \'Kumuha ng Music Premium\' - Nakatago ang label - Ipinapakita ang label - - - Itago ang pindutan ng upgrade - Nakatago ang buton - Ipinapakita ang buton - - - - - I-block ang mga audio ad - Naka-block ang mga audio ad - Na-unblock ang mga audio ad - - - %s hindi magagamit, maaaring magpakita ng mga ad. Subukang baguhin ang serbisyo ng ad block sa mga setting. - %s nagbalik ng isang error, maaaring magpakita ng mga ad. Subukang baguhin ang serbisyo ng ad block sa mga setting. - I-block ang mga naka-embed na video ad - Hindi - Luminous na proxy - - - I-block ang mga video ad - Naka-block ang mga video ad - Na-unblock ang mga video ad - - - Tinanggal ang mensahe - Ipakita ang mga tinanggal na mensahe - Huwag ipakita ang mga tinanggal na mensahe - Itago ang mga tinanggal na mensahe sa likod ng isang spoiler - Ipakita ang mga tinanggal na mensahe bilang naka-cross-out na text - - - Awtomatikong i-claim ang Channel Points - Awtomatikong kine-claim ang Mga Channel Point - Hindi awtomatikong kine-claim ang Mga Channel Point - - - - Paganahin ang Twitch debug mode - Naka-enable ang twitch debug mode (hindi inirerekomenda) - Naka-disable ang twitch debug mode - - - Mga Setting ng ReVanced - Mga Tungkol - Tungkol sa ReVanced - Pagba-block ng Ad - Mga setting ng Pagba-block ng Ad - Mga setting ng chat - Iba pa - Sari-saring mga setting - Pangkalahatang mga Setting - Iba pang mga setting - Mga ad sa panig ng kliyente - Mga ad na surestream sa panig ng server - Pag-log sa pag-debug - Ang mga debug log ay pinagana - Ang mga debug log ay hindi pinagana - - + Mga epekto ng pagpapanggap + • Pang-eksperimentong kliyente at maaaring huminto sa paggana anumang oras + • Maaaring huminto ang video sa 1:00, o maaaring hindi available sa ilang rehiyon + • Nawawala ang menu ng audio track + • Walang AV1 video codec + • Hindi available ang stable volume + • Mga video ng mga bata ay maaaring hindi ma-play kapag naka-log out o nasa incognito mode + + • Ang Pilitin ang orihinal na audio ay hindi magagamit + Ipakita sa Mga Istatistika para sa mga nerds + Ipinapakita ang uri ng kliyente sa Mga Istatistika para sa mga nerds + Nakatago ang kliyente sa Mga Istatistika para sa mga nerds + + + + + + Tungkol + Mga Ad + Pangkalahatan + Manlalaro + Iba-iba + + + Itago ang mga video ad + Nakatago ang mga video ad + Ipinapakita ang mga video ad + + + Paganahin ang permanenteng pag-ulit + Pinagana ang permanenteng pag-ulit + Hindi pinagana ang permanenteng pag-ulit + + + Itago ang pindutan ng Cast + Nakatago ang pindutan ng Cast + Ipinapakita ang pindutan ng Cast + Itago ang button ng history + Nakatago ang button ng history + Naka-display ang button ng history + Itago ang button ng notification + Nakakubli ang button ng notification + Ipinapakita ang button ng notification + Itago ang button ng paghahanap + Nakakubli ang button ng paghahanap + Ipinapakita ang button ng paghahanap + + + Itago ang category bar + Nakatago ang category bar + Ipinapakita ang category bar + + + Palitan ang kulay ng miniplayer + Ang kulay ng miniplayer ay tumutugma sa fullscreen player + Gumagamit ang miniplayer ng default na kulay + + + Itago o baguhin ang mga pindutan ng navigation bar + + Itago ang Tahanan + Nakatago ang pindutan ng Home + Nakalabas ang pindutan ng Home + + Itago ang Mga Sample + Nakatago ang pindutan ng Samples + Nakalabas ang pindutan ng Samples + + Itago ang Galugarin + Nakatago ang pindutan ng Explore + Nakalabas ang pindutan ng Explore + + Itago ang Aklatan + Nakatago ang pindutan ng Library + Nakalabas ang pindutan ng Library + + Itago ang I-upgrade + Nakatago ang pindutan ng Upgrade + Nakalabas ang pindutan ng Upgrade + Itago ang navigation bar + Nakatago ang navigation bar + Nakalabas ang navigation bar + Itago ang mga label ng pindutan ng navigation + Nakatago ang mga label + Nakalabas ang mga label + + + Itago ang label na \'Kumuha ng Music Premium\' + Nakatago ang label + Ipinapakita ang label + + + Itago ang pindutan ng upgrade + Nakatago ang buton + Ipinapakita ang buton + + + + + I-block ang mga audio ad + Naka-block ang mga audio ad + Na-unblock ang mga audio ad + + + %s hindi magagamit, maaaring magpakita ng mga ad. Subukang baguhin ang serbisyo ng ad block sa mga setting. + %s nagbalik ng isang error, maaaring magpakita ng mga ad. Subukang baguhin ang serbisyo ng ad block sa mga setting. + I-block ang mga naka-embed na video ad + Hindi + Luminous na proxy + + + I-block ang mga video ad + Naka-block ang mga video ad + Na-unblock ang mga video ad + + + Tinanggal ang mensahe + Ipakita ang mga tinanggal na mensahe + Huwag ipakita ang mga tinanggal na mensahe + Itago ang mga tinanggal na mensahe sa likod ng isang spoiler + Ipakita ang mga tinanggal na mensahe bilang naka-cross-out na text + + + Awtomatikong i-claim ang Channel Points + Awtomatikong kine-claim ang Mga Channel Point + Hindi awtomatikong kine-claim ang Mga Channel Point + + + + Paganahin ang Twitch debug mode + Naka-enable ang twitch debug mode (hindi inirerekomenda) + Naka-disable ang twitch debug mode + + + Mga Setting ng ReVanced + Mga Tungkol + Tungkol sa ReVanced + Pagba-block ng Ad + Mga setting ng Pagba-block ng Ad + Mga setting ng chat + Iba pa + Sari-saring mga setting + Pangkalahatang mga Setting + Iba pang mga setting + Mga ad sa panig ng kliyente + Mga ad na surestream sa panig ng server + Pag-log sa pag-debug + Ang mga debug log ay pinagana + Ang mga debug log ay hindi pinagana + + diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index d17c3ac74a..0d728c7083 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -17,1272 +17,1271 @@ "First 'item' text Second \"item\" text" ---> - - - - Nom de l\'application - - Personnalisé - Icône de l\'application - Originale - ReVanced - - ReVanced minimaliste - ReVanced mise à l\'échelle - - Personnalisée - - - Les vérifications ont échoué - Ouvrir le site officiel - Ignorer - <h5>Cette application ne semble pas avoir été patchée par vous.</h5><br>Cette application pourrait ne pas fonctionner correctement, <b>être nocive ou même dangereuse à utiliser</b>.<br><br>Ces vérifications impliquent que cette application a été pré-patchée ou obtenue auprès de quelqu\'un d\'autre :<br><br><small>%1$s</small><br>Il est fortement recommandé de <b>désinstaller cette application et de la patcher vous-même</b> pour garantir le fait que vous utilisez une application vérifiée et sécurisée.<p><br>S\'il est ignoré, cet avertissement ne sera affiché que deux fois. - Patché sur un appareil différent - Non installé par ReVanced Manager - Patché il y a plus de 10 minutes - Patché il y a %s jours - La date de construction de l\'APK est corrompue - - - Avis ReVanced - Les vidéos que vous regardez ne sont pas enregistrées dans votre historique.<br><br>La cause la plus probable est l\'utilisation d\'un serveur DNS bloqueur de publicités ou d\'un proxy.<br><br>Pour résoudre ce problème, autorisez l\'accès à <b>s.youtube.com</b> ou désactivez tous vos bloqueurs DNS et proxys. - Ne plus afficher - - - Paramètres - ReVanced - Voulez-vous vraiment continuer ? - Enregistrer - Réinitialiser - Réinitialiser la couleur - Couleur invalide - Redémarrage requis - Redémarrez l\'application pour que cette modification prenne effet. - Redémarrer - Importer - Copier - Paramètres ReVanced réinitialisés aux valeurs par défaut - %d paramètres importés - Importation échouée : %s - Rechercher dans les paramètres - Aucun résultat trouvé pour \"%s\" - Essayez un autre mot-clé - Recherches récentes - Supprimer de l\'historique des recherches ? - Effacer l\'historique des recherches - Voulez-vous vraiment effacer tout l\'historique des recherches ? - Conseils de recherche - "• Appuyez sur un chemin pour y naviguer +--> + + + Nom de l\'application + + Personnalisé + Icône de l\'application + Originale + ReVanced + + ReVanced minimaliste + ReVanced mise à l\'échelle + + Personnalisée + + + Les vérifications ont échoué + Ouvrir le site officiel + Ignorer + <h5>Cette application ne semble pas avoir été patchée par vous.</h5><br>Cette application pourrait ne pas fonctionner correctement, <b>être nocive ou même dangereuse à utiliser</b>.<br><br>Ces vérifications impliquent que cette application a été pré-patchée ou obtenue auprès de quelqu\'un d\'autre :<br><br><small>%1$s</small><br>Il est fortement recommandé de <b>désinstaller cette application et de la patcher vous-même</b> pour garantir le fait que vous utilisez une application vérifiée et sécurisée.<p><br>S\'il est ignoré, cet avertissement ne sera affiché que deux fois. + Patché sur un appareil différent + Non installé par ReVanced Manager + Patché il y a plus de 10 minutes + Patché il y a %s jours + La date de construction de l\'APK est corrompue + + + Avis ReVanced + Les vidéos que vous regardez ne sont pas enregistrées dans votre historique.<br><br>La cause la plus probable est l\'utilisation d\'un serveur DNS bloqueur de publicités ou d\'un proxy.<br><br>Pour résoudre ce problème, autorisez l\'accès à <b>s.youtube.com</b> ou désactivez tous vos bloqueurs DNS et proxys. + Ne plus afficher + + + Paramètres + ReVanced + Voulez-vous vraiment continuer ? + Enregistrer + Réinitialiser + Réinitialiser la couleur + Couleur invalide + Redémarrage requis + Redémarrez l\'application pour que cette modification prenne effet. + Redémarrer + Importer + Copier + Paramètres ReVanced réinitialisés aux valeurs par défaut + %d paramètres importés + Importation échouée : %s + Rechercher dans les paramètres + Aucun résultat trouvé pour \"%s\" + Essayez un autre mot-clé + Recherches récentes + Supprimer de l\'historique des recherches ? + Effacer l\'historique des recherches + Voulez-vous vraiment effacer tout l\'historique des recherches ? + Conseils de recherche + "• Appuyez sur un chemin pour y naviguer • Appuyez longuement sur un paramètre pour y naviguer • Appuyez sur Entrée pour enregistrer une requête de recherche dans l'historique • La recherche ignore la casse et la ponctuation • Les paramètres parents apparaissent au-dessus des paramètres enfants désactivés" - L\'historique des recherches est vide - Pour enregistrer l\'historique des recherches, saisissez une requête de recherche et appuyez sur Entrée - Afficher l\'historique des recherches dans les paramètres - L\'historique des recherches dans les paramètres est affiché - L\'historique des recherches dans les paramètres n\'est pas affiché - Afficher les icônes des paramètres ReVanced - Les icônes des paramètres sont affichées - Les icônes des paramètres ne sont pas affichées - Langue de ReVanced - "Les traductions en certaines langues peuvent être manquantes ou incomplètes. + L\'historique des recherches est vide + Pour enregistrer l\'historique des recherches, saisissez une requête de recherche et appuyez sur Entrée + Afficher l\'historique des recherches dans les paramètres + L\'historique des recherches dans les paramètres est affiché + L\'historique des recherches dans les paramètres n\'est pas affiché + Afficher les icônes des paramètres ReVanced + Les icônes des paramètres sont affichées + Les icônes des paramètres ne sont pas affichées + Langue de ReVanced + "Les traductions en certaines langues peuvent être manquantes ou incomplètes. Pour traduire l'application en de nouvelles langues ou améliorer les traductions existantes, visitez translate.revanced.app" - Langue de l\'application - Importer/Exporter - Importer/Exporter les paramètres ReVanced - - Vous utilisez la version <i>%s</i> de ReVanced Patches - Remarque - Vous utilisez actuellement une préversion, il se peut que vous rencontriez des problèmes inattendus - Liens officiels - + Vous utilisez la version <i>%s</i> de ReVanced Patches + Remarque + Vous utilisez actuellement une préversion, il se peut que vous rencontriez des problèmes inattendus + Liens officiels + - - - Paramètres GmsCore - Paramètres relatifs à GmsCore - - MicroG GmsCore n\'est pas installé. Veuillez l’installer. - Action requise - "MicroG GmsCore n'est pas autorisé à s'exécuter en arrière-plan. + + + Paramètres GmsCore + Paramètres relatifs à GmsCore + + MicroG GmsCore n\'est pas installé. Veuillez l’installer. + Action requise + "MicroG GmsCore n'est pas autorisé à s'exécuter en arrière-plan. Suivez le guide \"Don't kill my app\" pour votre téléphone et appliquez les instructions à votre installation MicroG. Cette opération est nécessaire au bon fonctionnement de l'application." - Ouvrir le site Web - "Les optimisations de la batterie doivent être désactivées pour MicroG GmsCore afin d'éviter des problèmes. + Ouvrir le site Web + "Les optimisations de la batterie doivent être désactivées pour MicroG GmsCore afin d'éviter des problèmes. Désactiver les optimisations de la batterie pour MicroG n'aura pas d'impact négatif sur l'utilisation de la batterie. Appuyez sur le bouton Continuer et autorisez les modifications." - Continuer - - - Falsifier les flux vidéo - Falsifiez les flux vidéo client pour éviter les problèmes de lecture - Falsifier les flux vidéo - Falsifiez les flux vidéo client pour éviter les problèmes de lecture - Falsifier les flux vidéo - "Les flux vidéo sont falsifiés + Continuer + + + Falsifier les flux vidéo + Falsifiez les flux vidéo client pour éviter les problèmes de lecture + Falsifier les flux vidéo + Falsifiez les flux vidéo client pour éviter les problèmes de lecture + Falsifier les flux vidéo + "Les flux vidéo sont falsifiés Si vous êtes abonné à YouTube Premium, ce paramètre n'est peut-être pas nécessaire" - "Les flux vidéo ne sont pas falsifiés + "Les flux vidéo ne sont pas falsifiés Il est possible que la lecture ne fonctionne pas" - La désactivation de ce paramètre peut entraîner des problèmes de lecture. - Client par défaut - - - Forcer la langue audio d\'origine - Utilisation de la langue audio d\'origine - Utilisation de l\'audio par défaut - - Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur n\'importe quel client, sauf Android Studio - - - Débogage - Activez ou désactivez les options de débogage - Journalisation de débogage - Les journaux de débogage sont activés - Les journaux de débogage sont désactivés - Journaliser les stack traces - Les journaux de débogage incluent les stack traces - Les journaux de débogage n\'incluent pas les stack traces - Afficher un message toast en cas d\'erreur ReVanced - Un message toast est affiché en cas d\'erreur - Aucun message toast n\'est affiché en cas d\'erreur - "La désactivation des messages toasts d'erreur masque toutes les notifications d'erreur ReVanced. + La désactivation de ce paramètre peut entraîner des problèmes de lecture. + Client par défaut + + + Forcer la langue audio d\'origine + Utilisation de la langue audio d\'origine + Utilisation de l\'audio par défaut + + Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur n\'importe quel client, sauf Android Studio + + + Débogage + Activez ou désactivez les options de débogage + Journalisation de débogage + Les journaux de débogage sont activés + Les journaux de débogage sont désactivés + Journaliser les stack traces + Les journaux de débogage incluent les stack traces + Les journaux de débogage n\'incluent pas les stack traces + Afficher un message toast en cas d\'erreur ReVanced + Un message toast est affiché en cas d\'erreur + Aucun message toast n\'est affiché en cas d\'erreur + "La désactivation des messages toasts d'erreur masque toutes les notifications d'erreur ReVanced. Vous ne serez pas informé des événements inattendus." - Exporter les journaux de débogage - Copie les journaux de débogage ReVanced dans le presse-papiers - La journalisation de débogage est désactivée - Aucun journal trouvé - Journaux copiés - Échec de l\'exportation des journaux : %s - Effacer les journaux de débogage - Efface tous les journaux de débogage ReVanced stockés - Journaux effacés - Gestionnaire des flags de fonctionnalités - Gérez les flags de fonctionnalités booléens - Flags actifs (%d) - Flags bloqués (%d) - Rechercher des flags... - Flags enregistrés - Flags réinitialisés - Flags copiés dans le presse-papiers - Journaliser les protobufs - Les journaux de débogage incluent les protocol buffers - Les journaux de débogage n\'incluent pas les protocol buffers - "En activant cette option, des données supplémentaires relatives à la mise en page seront enregistrées, dont le texte à l'écran de certains composants de l'interface utilisateur. + Exporter les journaux de débogage + Copie les journaux de débogage ReVanced dans le presse-papiers + La journalisation de débogage est désactivée + Aucun journal trouvé + Journaux copiés + Échec de l\'exportation des journaux : %s + Effacer les journaux de débogage + Efface tous les journaux de débogage ReVanced stockés + Journaux effacés + Gestionnaire des flags de fonctionnalités + Gérez les flags de fonctionnalités booléens + Flags actifs (%d) + Flags bloqués (%d) + Rechercher des flags... + Flags enregistrés + Flags réinitialisés + Flags copiés dans le presse-papiers + Journaliser les protobufs + Les journaux de débogage incluent les protocol buffers + Les journaux de débogage n\'incluent pas les protocol buffers + "En activant cette option, des données supplémentaires relatives à la mise en page seront enregistrées, dont le texte à l'écran de certains composants de l'interface utilisateur. Cela peut aider à identifier les composants lors de la création de filtres personnalisés. Toutefois, l'activation de cette option entraînera également l'enregistrement de certaines données utilisateur, telles que votre adresse IP." - - - Nettoyer les liens de partage - Le paramètre de requête dédié au suivi est supprimé des liens partagés - Le paramètre de requête dédié au suivi n\'est pas supprimé des liens partagés - Utiliser youtube.com dans les liens partagés - Les liens partagés utilisent youtube.com - Les liens partagés utilisent music.youtube.com - - - Filtre personnalisé - Masquez des composants en utilisant des filtres personnalisés - Activer les filtres personnalisés - Les filtres personnalisés sont activés - Les filtres personnalisés sont désactivés - Filtre personnalisé - - Liste des chemins des composants à filtrer, séparés par un retour à la ligne - Filtre personnalisé invalide : %s - - - - - À propos - Annonces - Miniatures alternatives - Flux - Général - Lecteur - Shorts - Barre de progression - Contrôle par balayage - Return YouTube Dislike - Divers - Vidéo - Restaurer les anciens menus des paramètres - Les anciens menus des paramètres sont affichés - Les anciens menus des paramètres ne sont pas affichés - - - Désactiver la lecture en arrière-plan des Shorts - La lecture en arrière-plan des Shorts est désactivée - La lecture en arrière-plan des Shorts est activée - - - Masquer les fiches d\'album - Les fiches d\'album sont masquées - Les fiches d\'album sont affichées - Masquer les fiches d\'artiste - Les fiches d\'artiste sont masquées - Les fiches d\'artiste sont affichées - Masquer l\'étagère des filtres - L\'étagère des filtres est masquée - L\'étagère des filtres est affichée - Masquer les posts - Les posts destinés à la communauté sont masqués - Les posts destinés à la communauté sont affichés - Masquer les bannières compactes - Les bannières compactes sont masquées - Les bannières compactes sont affichées - Masquer la carte extensible - La carte extensible sous les vidéos est masquée - La carte extensible sous les vidéos est affichée - Masquer le bouton micro flottant - Le bouton micro flottant dans la recherche est masqué - Le bouton micro flottant dans la recherche est affiché - Masquer les étagères horizontales - "Des étagères horizontales sont masquées, telles que : + + + Nettoyer les liens de partage + Le paramètre de requête dédié au suivi est supprimé des liens partagés + Le paramètre de requête dédié au suivi n\'est pas supprimé des liens partagés + Utiliser youtube.com dans les liens partagés + Les liens partagés utilisent youtube.com + Les liens partagés utilisent music.youtube.com + + + Filtre personnalisé + Masquez des composants en utilisant des filtres personnalisés + Activer les filtres personnalisés + Les filtres personnalisés sont activés + Les filtres personnalisés sont désactivés + Filtre personnalisé + + Liste des chemins des composants à filtrer, séparés par un retour à la ligne + Filtre personnalisé invalide : %s + + + + + À propos + Annonces + Miniatures alternatives + Flux + Général + Lecteur + Shorts + Barre de progression + Contrôle par balayage + Return YouTube Dislike + Divers + Vidéo + Restaurer les anciens menus des paramètres + Les anciens menus des paramètres sont affichés + Les anciens menus des paramètres ne sont pas affichés + + + Désactiver la lecture en arrière-plan des Shorts + La lecture en arrière-plan des Shorts est désactivée + La lecture en arrière-plan des Shorts est activée + + + Masquer les fiches d\'album + Les fiches d\'album sont masquées + Les fiches d\'album sont affichées + Masquer les fiches d\'artiste + Les fiches d\'artiste sont masquées + Les fiches d\'artiste sont affichées + Masquer l\'étagère des filtres + L\'étagère des filtres est masquée + L\'étagère des filtres est affichée + Masquer les posts + Les posts destinés à la communauté sont masqués + Les posts destinés à la communauté sont affichés + Masquer les bannières compactes + Les bannières compactes sont masquées + Les bannières compactes sont affichées + Masquer la carte extensible + La carte extensible sous les vidéos est masquée + La carte extensible sous les vidéos est affichée + Masquer le bouton micro flottant + Le bouton micro flottant dans la recherche est masqué + Le bouton micro flottant dans la recherche est affiché + Masquer les étagères horizontales + "Des étagères horizontales sont masquées, telles que : • Alerte info • Continuer à regarder • Explorer plus de chaînes • Les plus pertinentes • Shopping • Regarder à nouveau" - Les étagères horizontales sont affichées - Masquer l\'étagère d\'images - L\'étagère d\'images dans les résultats de recherche est masquée - L\'étagère d\'images dans les résultats de recherche est affichée - Masquer les posts récents - Les posts récents sont masqués - Les posts récents sont affichés - Masquer les playlists mix - Les playlists mix sont masquées - Les playlists mix sont affichées - Masquer la section dédiée aux films - La section dédiée aux films est masquée - La section dédiée aux films est affichée - - Masquer le bouton M\'avertir - Le bouton M\'avertir est masqué - Le bouton M\'avertir est affiché - Masquer les jeux intégrés - Les jeux intégrés sont masqués - Les jeux intégrés sont affichés - - Masquer le bouton Afficher plus - Le bouton Afficher plus dans les résultats de recherche est masqué - Le bouton Afficher plus dans les résultats de recherche est affiché - Masquer les enquêtes - Les enquêtes sont masquées - Les enquêtes sont affichées - Masquer l\'étagère des billets - L\'étagère des billets est masquée - L\'étagère des billets est affichée - - Masquer les libellés de recommandation de vidéos - Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont masqués - Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont affichés - Masquer l\'espace séparateur - L\'espace séparateur est masqué - L\'espace séparateur est affiché - - Masquer les Doodles YouTube - L\'animation Doodles sur le logo YouTube est masquée - L\'animation Doodles sur le logo YouTube est affichée - "Les Doodles YouTube sont affichés quelques jours par an. + Masquer le bouton Afficher plus + Le bouton Afficher plus dans les résultats de recherche est masqué + Le bouton Afficher plus dans les résultats de recherche est affiché + Masquer les enquêtes + Les enquêtes sont masquées + Les enquêtes sont affichées + Masquer l\'étagère des billets + L\'étagère des billets est masquée + L\'étagère des billets est affichée + + Masquer les libellés de recommandation de vidéos + Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont masqués + Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont affichés + Masquer l\'espace séparateur + L\'espace séparateur est masqué + L\'espace séparateur est affiché + + Masquer les Doodles YouTube + L\'animation Doodles sur le logo YouTube est masquée + L\'animation Doodles sur le logo YouTube est affichée + "Les Doodles YouTube sont affichés quelques jours par an. Si un Doodle est actuellement affiché dans votre région et que cette option de masquage est activée, la barre des filtres sous la barre de recherche sera également masquée." - Masquer la barre de chaîne - La barre de chaîne est masquée - La barre de chaîne est affichée - Masquer le filigrane de la chaîne - Le filigrane est masqué - Le filigrane est affiché - Masquer la boîte de financement participatif - La boîte de financement participatif est masquée - La boîte de financement participatif est affichée - Masquer les boîtes d\'urgence - Les boîtes d\'urgence sont masquées - Les boîtes d\'urgence sont affichées - Masquer les panneaux d\'information - Les panneaux d\'information sont masqués - Les panneaux d\'information sont affichés - - Masquer le bouton Rejoindre - Le bouton Rejoindre est masqué - Le bouton Rejoindre est affiché - Masquer les panneaux d\'infos médicales - Les panneaux d\'infos médicales sont masqués - Les panneaux d\'infos médicales sont affichés - Masquer les actions rapides - Les actions rapides en plein écran sont masquées - Les actions rapides en plein écran sont affichées - Masquer les vidéos associées - Les vidéos associées dans les actions rapides sont masquées - Les vidéos associées dans les actions rapides sont affichées - Masquer les consignes pour les abonnés - Les consignes de la communauté des abonnés sont masquées - Les consignes de la communauté des abonnés sont affichées - Masquer les réactions minutées - Les réactions minutées sont masquées - Les réactions minutées sont affichées - Masquer \"Résumé de la vidéo généré par IA\" - La section du résumé de la vidéo généré par IA est masquée - La section du résumé de la vidéo généré par IA est affichée - Masquer \"Demander\" - La section Demander est masquée - La section Demander est affichée - Masquer les attributions - Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont masquées - Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont affichées - Masquer \"Chapitres\" - La section Chapitres est masquée - La section Chapitres est affichée - Masquer \"Comment ce contenu a été créé\" - La section \"Comment ce contenu a été créé\" est masquée - La section \"Comment ce contenu a été créé\" est affichée - Masquer les points Boost - Les points Boost sont masqués - Les points Boost sont affichés - Masquer \"Découvrir le podcast\" - La section \"Découvrir le podcast\" est masquée - La section \"Découvrir le podcast\" est affichée - Masquer les liens mis en avant - La section des liens mis en avant est masquée - La section des liens mis en avant est affichée - Masquer les vidéos mises en avant - La section des vidéos mises en avant est masquée - La section des vidéos mises en avant est affichée - Masquer \"Fiches info\" - La section \"Fiches info\" est masquée - La section \"Fiches info\" est affichée - Masquer \"Concepts clés\" - La section \"Concepts clés\" est masquée - La section \"Concepts clés\" est affichée - Masquer le bouton S\'abonner - Le bouton S\'abonner est masqué - Le bouton S\'abonner est affiché - Masquer \"Transcription\" - La section Transcription est masquée - La section Transcription est affichée - Description de la vidéo - Masquez ou affichez des éléments dans la description des vidéos - Barre des filtres - Masquez ou affichez la barre des filtres dans les flux, l\'historique des vidéos regardées, les résultats de recherche et les vidéos associées - Masquer dans les flux - Masquée dans les flux - Affichée dans les flux - Masquer dans les vidéos similaires - Masquée dans les vidéos similaires - Affichée dans les vidéos similaires - Masquer dans les résultats de recherche - Masquée dans les résultats de recherche - Affichée dans les résultats de recherche - Masquer dans l\'historique des vidéos regardées - Masquée dans l\'historique des vidéos regardées - Affichée dans l\'historique des vidéos regardées - Page de chaîne - Masquez ou affichez des composants des pages de chaîne - - Masquer le bouton Communauté - Le bouton Communauté est masqué - Le bouton Communauté est affiché - - Masquer l\'étagère \"Pour vous\" - L\'étagère Pour vous est masquée - L\'étagère Pour vous est affichée - - Masquer le bouton Rejoindre - Le bouton Rejoindre est masqué - Le bouton Rejoindre est affiché - Masquer l\'aperçu des liens - L\'aperçu des liens est masqué - L\'aperçu des liens est affiché - Masquer l\'étagère des membres - L\'étagère des membres est masquée - L\'étagère des membres est affichée - - Masquer le bouton Boutique - Le bouton Boutique est masqué - Le bouton Boutique est affiché - - Masquer le bouton S\'abonner - Le bouton S\'abonner est masqué - Le bouton S\'abonner est affiché - Commentaires - Masquez ou affichez des composants de la section commentaires - Masquer le résumé IA du chat - Le résumé IA du chat est masqué - Le résumé IA du chat est affiché - Masquer le résumé IA des commentaires - Le résumé IA des commentaires est masqué - Le résumé IA des commentaires est affiché - Masquer les consignes de chaîne - Les consignes de chaîne sont masquées - Les consignes de chaîne sont affichées - Masquer l\'en-tête \"Commentaires des membres\" - L\'en-tête \"Commentaires des membres\" est masqué - L\'en-tête \"Commentaires des membres\" est affiché - Masquer la section Commentaires - La section Commentaires est masquée - La section Commentaires est affichée - Masquer le règlement de la communauté - Le règlement de la communauté est masqué - Le règlement de la communauté est affiché - Masquer le bouton Créer un Short - Le bouton \"Créer un Short\" est masqué - Le bouton \"Créer un Short\" est affiché - Masquer les boutons Emoji et Horodatage - Les boutons Emoji et Horodatage sont masqués - Les boutons Emoji et Horodatage sont affichés - Masquer le commentaire servant d\'aperçu - Le commentaire servant d\'aperçu est masqué - Le commentaire servant d\'aperçu est affiché - Masquer le bouton Merci - Le bouton Merci est masqué - Le bouton Merci est affiché - Masquer le nombre de vues - Le nombre de vues est masqué dans le fil d\'actualité et les résultats de recherche - Le nombre de vues est affiché dans le fil d\'actualité et les résultats de recherche - - "Limitations : + Masquer le bouton Rejoindre + Le bouton Rejoindre est masqué + Le bouton Rejoindre est affiché + Masquer les panneaux d\'infos médicales + Les panneaux d\'infos médicales sont masqués + Les panneaux d\'infos médicales sont affichés + Masquer les actions rapides + Les actions rapides en plein écran sont masquées + Les actions rapides en plein écran sont affichées + Masquer les vidéos associées + Les vidéos associées dans les actions rapides sont masquées + Les vidéos associées dans les actions rapides sont affichées + Masquer les consignes pour les abonnés + Les consignes de la communauté des abonnés sont masquées + Les consignes de la communauté des abonnés sont affichées + Masquer les réactions minutées + Les réactions minutées sont masquées + Les réactions minutées sont affichées + Masquer \"Résumé de la vidéo généré par IA\" + La section du résumé de la vidéo généré par IA est masquée + La section du résumé de la vidéo généré par IA est affichée + Masquer \"Demander\" + La section Demander est masquée + La section Demander est affichée + Masquer les attributions + Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont masquées + Les sections Lieux mentionnés, Jeux, Musique et Personnes mentionnées sont affichées + Masquer \"Chapitres\" + La section Chapitres est masquée + La section Chapitres est affichée + Masquer \"Comment ce contenu a été créé\" + La section \"Comment ce contenu a été créé\" est masquée + La section \"Comment ce contenu a été créé\" est affichée + Masquer les points Boost + Les points Boost sont masqués + Les points Boost sont affichés + Masquer \"Découvrir le podcast\" + La section \"Découvrir le podcast\" est masquée + La section \"Découvrir le podcast\" est affichée + Masquer les liens mis en avant + La section des liens mis en avant est masquée + La section des liens mis en avant est affichée + Masquer les vidéos mises en avant + La section des vidéos mises en avant est masquée + La section des vidéos mises en avant est affichée + Masquer \"Fiches info\" + La section \"Fiches info\" est masquée + La section \"Fiches info\" est affichée + Masquer \"Concepts clés\" + La section \"Concepts clés\" est masquée + La section \"Concepts clés\" est affichée + Masquer le bouton S\'abonner + Le bouton S\'abonner est masqué + Le bouton S\'abonner est affiché + Masquer \"Transcription\" + La section Transcription est masquée + La section Transcription est affichée + Description de la vidéo + Masquez ou affichez des éléments dans la description des vidéos + Barre des filtres + Masquez ou affichez la barre des filtres dans les flux, l\'historique des vidéos regardées, les résultats de recherche et les vidéos associées + Masquer dans les flux + Masquée dans les flux + Affichée dans les flux + Masquer dans les vidéos similaires + Masquée dans les vidéos similaires + Affichée dans les vidéos similaires + Masquer dans les résultats de recherche + Masquée dans les résultats de recherche + Affichée dans les résultats de recherche + Masquer dans l\'historique des vidéos regardées + Masquée dans l\'historique des vidéos regardées + Affichée dans l\'historique des vidéos regardées + Page de chaîne + Masquez ou affichez des composants des pages de chaîne + + Masquer le bouton Communauté + Le bouton Communauté est masqué + Le bouton Communauté est affiché + + Masquer l\'étagère \"Pour vous\" + L\'étagère Pour vous est masquée + L\'étagère Pour vous est affichée + + Masquer le bouton Rejoindre + Le bouton Rejoindre est masqué + Le bouton Rejoindre est affiché + Masquer l\'aperçu des liens + L\'aperçu des liens est masqué + L\'aperçu des liens est affiché + Masquer l\'étagère des membres + L\'étagère des membres est masquée + L\'étagère des membres est affichée + + Masquer le bouton Boutique + Le bouton Boutique est masqué + Le bouton Boutique est affiché + + Masquer le bouton S\'abonner + Le bouton S\'abonner est masqué + Le bouton S\'abonner est affiché + Commentaires + Masquez ou affichez des composants de la section commentaires + Masquer le résumé IA du chat + Le résumé IA du chat est masqué + Le résumé IA du chat est affiché + Masquer le résumé IA des commentaires + Le résumé IA des commentaires est masqué + Le résumé IA des commentaires est affiché + Masquer les consignes de chaîne + Les consignes de chaîne sont masquées + Les consignes de chaîne sont affichées + Masquer l\'en-tête \"Commentaires des membres\" + L\'en-tête \"Commentaires des membres\" est masqué + L\'en-tête \"Commentaires des membres\" est affiché + Masquer la section Commentaires + La section Commentaires est masquée + La section Commentaires est affichée + Masquer le règlement de la communauté + Le règlement de la communauté est masqué + Le règlement de la communauté est affiché + Masquer le bouton Créer un Short + Le bouton \"Créer un Short\" est masqué + Le bouton \"Créer un Short\" est affiché + Masquer les boutons Emoji et Horodatage + Les boutons Emoji et Horodatage sont masqués + Les boutons Emoji et Horodatage sont affichés + Masquer le commentaire servant d\'aperçu + Le commentaire servant d\'aperçu est masqué + Le commentaire servant d\'aperçu est affiché + Masquer le bouton Merci + Le bouton Merci est masqué + Le bouton Merci est affiché + Masquer le nombre de vues + Le nombre de vues est masqué dans le fil d\'actualité et les résultats de recherche + Le nombre de vues est affiché dans le fil d\'actualité et les résultats de recherche + + "Limitations : • Les nombres de vues peuvent encore être affichés dans les étagères à Shorts, les pages de chaînes et les résultats de recherche • Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive" - Masquer l\'heure de mise en ligne - L\'heure de mise en ligne est masquée dans le flux et les résultats de recherche - L\'heure de mise en ligne est affichée dans le flux et les résultats de recherche - - "Limitations : + Masquer l\'heure de mise en ligne + L\'heure de mise en ligne est masquée dans le flux et les résultats de recherche + L\'heure de mise en ligne est affichée dans le flux et les résultats de recherche + + "Limitations : • Les heures de mise en ligne peuvent encore être affichées dans les étagères à Shorts, les pages de chaînes et les résultats de recherche • Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive" - Masquer des contenus par mot-clé - Filtrez les vidéos par mot-clé dans les recherches et le flux - Filtrer les vidéos de l\'accueil par mot-clé - Les vidéos de l\'onglet Accueil sont filtrées par mot-clé - Les vidéos de l\'onglet Accueil ne sont pas filtrées par mot-clé - Filtrer les résultats de recherche par mot-clé - Les résultats de recherche sont filtrés par mot-clé - Les résultats de recherche ne sont pas filtrés par mot-clé - Filtrer les vidéos dans les abonnements par mot-clé - Les vidéos de l\'onglet Abonnements sont filtrées par mot-clé - Les vidéos de l\'onglet Abonnements ne sont pas filtrées par mot-clé - Mots-clés à masquer - - "Mots-clés et phrases à masquer, séparés par des sauts de ligne + "Mots-clés et phrases à masquer, séparés par des sauts de ligne Les mots-clés peuvent être des noms de chaînes, ou tout texte présent dans le titre des vidéos Les mots avec des majuscules au milieu doivent être saisis en respectant la casse (par exemple : iPhone, TikTok, LeBlanc)" - À propos du filtrage par mot-clé - "Les résultats de recherche, l'accueil et les abonnements sont filtrés pour masquer le contenu correspondant aux mots-clés + À propos du filtrage par mot-clé + "Les résultats de recherche, l'accueil et les abonnements sont filtrés pour masquer le contenu correspondant aux mots-clés Limitations • Les Shorts ne peuvent pas être masqués par nom de chaîne • Impossible de masquer certains composants de l'interface • Rechercher un mot-clé peut ne pas fonctionner" - Correspondance par mots entiers - - Mettre un mot-clé ou une expression entre guillemets permet d\'empêcher les correspondances partielles avec le titre des vidéos et le nom des chaînes.<br><br>Par exemple,<br><b>\"ia\"</b> masquera la vidéo : <b>Comment fonctionnent les IA ?</b><br>mais ne masquera pas : <b>Quelles études pour devenir commercial ?</b> - - Impossible d\'utiliser ce mot-clé : %s - Ajoutez des guillemets pour utiliser : %s - Le mot-clé a des déclarations conflictuelles : %s - Le mot-clé est trop court et nécessite des guillemets : %s - Ce mot-clé va masquer toutes les vidéos : %s - - - Masquer l\'étagère de la boutique du créateur - L\'étagère de la boutique du créateur sous le lecteur vidéo est masquée - L\'étagère de la boutique du créateur sous le lecteur vidéo est affichée - Masquer l\'écran de fin de bannière de boutique - L\'écran de fin de bannière de boutique est masqué - L\'écran de fin de bannière de boutique est affiché - Masquer les annonces plein écran - "Les annonces plein écran sont masquées + Correspondance par mots entiers + + Mettre un mot-clé ou une expression entre guillemets permet d\'empêcher les correspondances partielles avec le titre des vidéos et le nom des chaînes.<br><br>Par exemple,<br><b>\"ia\"</b> masquera la vidéo : <b>Comment fonctionnent les IA ?</b><br>mais ne masquera pas : <b>Quelles études pour devenir commercial ?</b> + + Impossible d\'utiliser ce mot-clé : %s + Ajoutez des guillemets pour utiliser : %s + Le mot-clé a des déclarations conflictuelles : %s + Le mot-clé est trop court et nécessite des guillemets : %s + Ce mot-clé va masquer toutes les vidéos : %s + + + Masquer l\'étagère de la boutique du créateur + L\'étagère de la boutique du créateur sous le lecteur vidéo est masquée + L\'étagère de la boutique du créateur sous le lecteur vidéo est affichée + Masquer l\'écran de fin de bannière de boutique + L\'écran de fin de bannière de boutique est masqué + L\'écran de fin de bannière de boutique est affiché + Masquer les annonces plein écran + "Les annonces plein écran sont masquées Cette fonctionnalité est disponible uniquement pour les appareils anciens" - Les annonces plein écran sont affichées - - Masquer les annonces plein écran ne fonctionne que sur les appareils anciens - Masquer les annonces générales - Les annonces générales sont masquées - Les annonces générales sont affichées - Masquer les bannières Produits dérivés - Les bannières Produits dérivés sont masquées - Les bannières Produits dérivés sont affichées - Masquer la bannière de promotion rémunérée - La bannière \"Inclut une promotion rémunérée\" est masquée - La bannière \"Inclut une promotion rémunérée\" est affichée - Masquer les cartes d\'autopromotion - Les cartes d\'autopromotion sont masquées - Les cartes d\'autopromotion sont affichées - Masquer les liens de shopping - Les liens de shopping dans la description de la vidéo sont masqués - Les liens de shopping dans la description de la vidéo sont affichés - Masquer la bannière \"Afficher les produits\" - La bannière Afficher les produits dans l\'overlay de la vidéo est masquée - La bannière Afficher les produits dans l\'overlay de la vidéo est affichée - Masquer les résultats Web - Les résultats Web sont masqués - Les résultats Web sont affichés - - - Masquer les publicités pour YouTube Premium - Les publicités pour YouTube Premium sous le lecteur vidéo sont masquées - Les publicités pour YouTube Premium sous le lecteur vidéo sont affichées - - - Masquer les annonces vidéo - Les annonces vidéo sont masquées - Les annonces vidéo sont affichées - - - URL copiée dans le presse-papiers - URL avec horodatage copiée - Afficher le bouton \"Copier l\'URL de la vidéo\" - Le bouton Copier l\'URL de la vidéo est affiché. Appuyez pour copier l\'URL de la vidéo. Appuyez longuement pour copier avec horodatage. - Le bouton Copier l\'URL de la vidéo n\'est pas affiché - Afficher un bouton \"Copier URL avec horodatage\" - Le bouton Copier l\'URL avec horodatage est affiché. Appuyez pour copier l\'URL de la vidéo avec horodatage. Appuyez longuement pour copier sans horodatage. - Le bouton Copier l\'URL avec horodatage n\'est pas affiché - - - Supprimer le message de vérification de l\'âge - Le message sera supprimé - Le message sera affiché - Cette option ne contourne pas la vérification de l\'âge. Elle est juste confirmée automatiquement. - - - Désactiver le pop-up \"Connectez-vous à la TV\" - Le pop-up \"Connectez-vous à la TV\" est désactivé - Le pop-up \"Connectez-vous à la TV\" est activé - - - Désactiver le double appui pour passer à un chapitre - Le double appui ne peut jamais déclencher de saut vers le chapitre suivant/précédent - Le double appui peut occasionnellement déclencher un saut vers le chapitre suivant/précédent - - - Téléchargements externes - Paramètres pour l\'utilisation d\'un outil externe de téléchargement - Afficher le bouton de téléchargement externe - Le bouton Télécharger est affiché dans le lecteur - Le bouton Télécharger n\'est pas affiché dans le lecteur - - Remplacement du bouton d\'action de téléchargement - Le bouton de téléchargement ouvre votre outil externe - Le bouton de téléchargement ouvre l\'outil intégré à l\'application - Nom de paquet de l\'outil de téléchargement - Nom de paquet de votre application de téléchargement externe installée - Saisir le nom du paquet - Autre - Application non installée - %s n\'est pas installé. Veuillez l\'installer. - "Impossible de trouver une application installée ayant pour nom de paquet : %s + Les annonces plein écran sont affichées + + Masquer les annonces plein écran ne fonctionne que sur les appareils anciens + Masquer les annonces générales + Les annonces générales sont masquées + Les annonces générales sont affichées + Masquer les bannières Produits dérivés + Les bannières Produits dérivés sont masquées + Les bannières Produits dérivés sont affichées + Masquer la bannière de promotion rémunérée + La bannière \"Inclut une promotion rémunérée\" est masquée + La bannière \"Inclut une promotion rémunérée\" est affichée + Masquer les cartes d\'autopromotion + Les cartes d\'autopromotion sont masquées + Les cartes d\'autopromotion sont affichées + Masquer les liens de shopping + Les liens de shopping dans la description de la vidéo sont masqués + Les liens de shopping dans la description de la vidéo sont affichés + Masquer la bannière \"Afficher les produits\" + La bannière Afficher les produits dans l\'overlay de la vidéo est masquée + La bannière Afficher les produits dans l\'overlay de la vidéo est affichée + Masquer les résultats Web + Les résultats Web sont masqués + Les résultats Web sont affichés + + + Masquer les publicités pour YouTube Premium + Les publicités pour YouTube Premium sous le lecteur vidéo sont masquées + Les publicités pour YouTube Premium sous le lecteur vidéo sont affichées + + + Masquer les annonces vidéo + Les annonces vidéo sont masquées + Les annonces vidéo sont affichées + + + URL copiée dans le presse-papiers + URL avec horodatage copiée + Afficher le bouton \"Copier l\'URL de la vidéo\" + Le bouton Copier l\'URL de la vidéo est affiché. Appuyez pour copier l\'URL de la vidéo. Appuyez longuement pour copier avec horodatage. + Le bouton Copier l\'URL de la vidéo n\'est pas affiché + Afficher un bouton \"Copier URL avec horodatage\" + Le bouton Copier l\'URL avec horodatage est affiché. Appuyez pour copier l\'URL de la vidéo avec horodatage. Appuyez longuement pour copier sans horodatage. + Le bouton Copier l\'URL avec horodatage n\'est pas affiché + + + Supprimer le message de vérification de l\'âge + Le message sera supprimé + Le message sera affiché + Cette option ne contourne pas la vérification de l\'âge. Elle est juste confirmée automatiquement. + + + Désactiver le pop-up \"Connectez-vous à la TV\" + Le pop-up \"Connectez-vous à la TV\" est désactivé + Le pop-up \"Connectez-vous à la TV\" est activé + + + Désactiver le double appui pour passer à un chapitre + Le double appui ne peut jamais déclencher de saut vers le chapitre suivant/précédent + Le double appui peut occasionnellement déclencher un saut vers le chapitre suivant/précédent + + + Téléchargements externes + Paramètres pour l\'utilisation d\'un outil externe de téléchargement + Afficher le bouton de téléchargement externe + Le bouton Télécharger est affiché dans le lecteur + Le bouton Télécharger n\'est pas affiché dans le lecteur + + Remplacement du bouton d\'action de téléchargement + Le bouton de téléchargement ouvre votre outil externe + Le bouton de téléchargement ouvre l\'outil intégré à l\'application + Nom de paquet de l\'outil de téléchargement + Nom de paquet de votre application de téléchargement externe installée + Saisir le nom du paquet + Autre + Application non installée + %s n\'est pas installé. Veuillez l\'installer. + "Impossible de trouver une application installée ayant pour nom de paquet : %s Vérifiez que le nom de paquet est correct et que l'application est installée." - Le nom du paquet ne peut pas être vide - - - Désactiver le geste de recherche précise - Le geste est désactivé - Le geste est activé - - - Activer Appuyer pour rechercher - Appuyer pour rechercher est activé - Appuyer pour rechercher est désactivé - - - Activer le geste de contrôle de la luminosité - "Le geste de contrôle de la luminosité en plein écran est activé + Le nom du paquet ne peut pas être vide + + + Désactiver le geste de recherche précise + Le geste est désactivé + Le geste est activé + + + Activer Appuyer pour rechercher + Appuyer pour rechercher est activé + Appuyer pour rechercher est désactivé + + + Activer le geste de contrôle de la luminosité + "Le geste de contrôle de la luminosité en plein écran est activé Réglez la luminosité en faisant glisser verticalement sur le côté gauche de l'écran" - Le geste de contrôle de la luminosité en plein écran est désactivé - Activer le geste de contrôle du volume - "Le geste de contrôle du volume en plein écran est activé + Le geste de contrôle de la luminosité en plein écran est désactivé + Activer le geste de contrôle du volume + "Le geste de contrôle du volume en plein écran est activé Réglez le volume en balayant verticalement sur le côté droit de l'écran" - Le geste de contrôle du volume en plein écran est désactivé - Activer le geste Appuyer puis balayer - Appuyer puis balayer est activé - Appuyer puis balayer est désactivé - Activer le retour haptique - Le retour haptique est activé - Le retour haptique est désactivé - Enregistrer et restaurer la luminosité - Enregistrer et restaurer la luminosité en quittant ou entrant en mode plein écran - Ne pas enregistrer et restaurer la luminosité en quittant ou entrant en mode plein écran - Activer le geste de luminosité automatique - Balayer vers le bas jusqu\'à la valeur minimum du geste de contrôle de la luminosité active la luminosité automatique - Balayer vers le bas jusqu\'à la valeur minimum n\'active pas la luminosité automatique - Automatique - Délai avant disparition de l\'overlay des gestes - La durée en millisecondes pendant laquelle l\'overlay est visible - Opacité de l\'arrière-plan de l\'overlay des gestes - Valeur de l\'opacité entre 0 et 100 - L\'opacité doit être comprise entre 0 et 100 pour les gestes - Couleur de l\'overlay des gestes de contrôle de la luminosité - La couleur de la barre de progression des commandes de luminosité - Couleur de l\'overlay des gestes de contrôle du volume - La couleur de la barre de progression des commandes de volume - Taille du texte de l\'overlay des gestes - La taille du texte de l\'overlay des gestes comprise entre 1 et 30 - La taille du texte doit être comprise entre 1 et 30 - Seuil d\'intensité des balayages - L\'intensité du mouvement à effectuer pour qu\'un balayage soit pris en compte - Sensibilité du geste de contrôle du volume - Quantité de modification du volume à chaque balayage - Style de l\'overlay des gestes - Overlay horizontal - Overlay horizontal (minimal, haut) - Overlay horizontal (minimal, centre) - Overlay circulaire - Overlay circulaire (minimal) - Overlay vertical - Overlay vertical (minimal) - Activer Balayer pour changer de vidéo - En mode plein écran, vous passerez à la vidéo précédente/suivante en balayant l\'écran - En mode plein écran, vous ne changerez pas de vidéo en balayant l\'écran - - - Désactiver les sous-titres automatiques - Les sous-titres automatiques sont désactivés - Les sous-titres automatiques sont activés - - - Boutons d\'action - Masquez ou affichez les boutons sous les vidéos - Désactiver l\'effet de lueur des boutons J\'aime et S\'abonner - Les boutons J\'aime et S\'abonner ne seront pas mis en surbrillance lorsqu\'ils seront mentionnés - Les boutons J\'aime et S\'abonner seront mis en surbrillance lorsqu\'ils seront mentionnés - Masquer \"J\'aime\" et \"Je n\'aime pas\" - Les boutons J\'aime et Je n\'aime pas sont masqués - Les boutons J\'aime et Je n\'aime pas sont affichés - - Masquer \"Partager\" - Le bouton Partager est masqué - Le bouton Partager est affiché - - Masquer \"Zéro annonce\" - Le bouton Zéro annonce est masqué - Le bouton Zéro annonce est affiché - - Masquer \"Commentaires\" - Le bouton Commentaires est masqué - Le bouton Commentaires est affiché - + Masquer \"Partager\" + Le bouton Partager est masqué + Le bouton Partager est affiché + + Masquer \"Zéro annonce\" + Le bouton Zéro annonce est masqué + Le bouton Zéro annonce est affiché + + Masquer \"Commentaires\" + Le bouton Commentaires est masqué + Le bouton Commentaires est affiché + - Masquer \"Signaler\" - Le bouton Signaler est masqué - Le bouton Signaler est affiché - - Masquer \"Remixer\" - Le bouton Remixer est masqué - Le bouton Remixer est affiché - - Masquer \"Télécharger\" - Le bouton Télécharger est masqué - Le bouton Télécharger est affiché - + Masquer \"Remixer\" + Le bouton Remixer est masqué + Le bouton Remixer est affiché + + Masquer \"Télécharger\" + Le bouton Télécharger est masqué + Le bouton Télécharger est affiché + - Masquer \"Booster\" - Le bouton Booster est masqué - Le bouton Booster est affiché - - Masquer \"Promouvoir\" - Le bouton Promouvoir est masqué - Le bouton Promouvoir est affiché - - Masquer \"Merci\" - Le bouton Merci est masqué - Le bouton Merci est affiché - + Masquer \"Promouvoir\" + Le bouton Promouvoir est masqué + Le bouton Promouvoir est affiché + + Masquer \"Merci\" + Le bouton Merci est masqué + Le bouton Merci est affiché + - Masquer \"Demander\" - Le bouton Demander est masqué - Le bouton Demander est affiché - - Masquer \"Clip\" - Le bouton Clip est masqué - Le bouton Clip est affiché - - Masquer \"Magasin\" - Le bouton Magasin est masqué - Le bouton Magasin est affiché - - Masquer \"Enregistrer\" - Le bouton Enregistrer est masqué - Le bouton Enregistrer est affiché - - - Boutons de navigation - Masquez ou modifiez les boutons dans la barre de navigation - - Masquer \"Accueil\" - Le bouton Accueil est masqué - Le bouton Accueil est affiché - - Masquer \"Shorts\" - Le bouton Shorts est masqué - Le bouton Shorts est affiché - - Masquer \"Créer\" - Le bouton Créer est masqué - Le bouton Créer est affiché - - Masquer \"Abonnements\" - Le bouton Abonnements est masqué - Le bouton Abonnements est affiché - Masquer \"Notifications\" - Le bouton Notifications est masqué - Le bouton Notifications est affiché - - Échanger Créer et Notifications - "Le bouton Créer est échangé avec le bouton Notifications + Masquer \"Demander\" + Le bouton Demander est masqué + Le bouton Demander est affiché + + Masquer \"Clip\" + Le bouton Clip est masqué + Le bouton Clip est affiché + + Masquer \"Magasin\" + Le bouton Magasin est masqué + Le bouton Magasin est affiché + + Masquer \"Enregistrer\" + Le bouton Enregistrer est masqué + Le bouton Enregistrer est affiché + + + Boutons de navigation + Masquez ou modifiez les boutons dans la barre de navigation + + Masquer \"Accueil\" + Le bouton Accueil est masqué + Le bouton Accueil est affiché + + Masquer \"Shorts\" + Le bouton Shorts est masqué + Le bouton Shorts est affiché + + Masquer \"Créer\" + Le bouton Créer est masqué + Le bouton Créer est affiché + + Masquer \"Abonnements\" + Le bouton Abonnements est masqué + Le bouton Abonnements est affiché + Masquer \"Notifications\" + Le bouton Notifications est masqué + Le bouton Notifications est affiché + + Échanger Créer et Notifications + "Le bouton Créer est échangé avec le bouton Notifications Remarque : Activer cette option masque également de force les annonces vidéo" - Le bouton Créer n\'est pas échangé avec le bouton Notifications - "La désactivation de ce paramètre désactivera également le blocage des publicités Shorts. + Le bouton Créer n\'est pas échangé avec le bouton Notifications + "La désactivation de ce paramètre désactivera également le blocage des publicités Shorts. Si la modification de ce paramètre ne prend pas effet, essayez de passer en mode navigation privée." - Masquer le nom des boutons de navigation - Les noms sont masqués - Les noms sont affichés - Désactiver la barre d\'état translucide - La barre d\'état est opaque - La barre d\'état est opaque ou translucide - Sur certains appareils, l\'activation de cette fonctionnalité peut rendre la barre de navigation du système transparente. - Désactiver la barre claire translucide - La barre de navigation en mode clair est opaque - La barre de navigation en mode clair est opaque ou translucide - Désactiver la barre sombre translucide - La barre de navigation en mode sombre est opaque - La barre de navigation en mode sombre est opaque ou translucide - - - Menu déroulant - Masquez ou affichez des éléments du menu déroulant du lecteur - - Masquer \"Sous-titres\" - Le menu Sous-titres est masqué - Le menu Sous-titres est affiché - - Masquer \"Autres paramètres\" - Le menu Autres paramètres est masqué - Le menu Autres paramètres est affiché - - Masquer \"Délai de mise en veille\" - Le menu Délai de mise en veille est masqué - Le menu Délai de mise en veille est affiché - - Masquer \"Lecture en boucle\" - Le menu Lecture en boucle est masqué - Le menu Lecture en boucle est affiché - - Masquer \"Mode ambiant\" - Le menu Mode ambiant est masqué - Le menu Mode ambiant est affiché - Masquer \"Volume stable\" - Le menu Volume stable est affiché - Le menu Volume stable est masqué - - Masquer \"Aide et commentaires\" - Le menu Aide et commentaires est masqué - Le menu Aide et commentaires est affiché - - Masquer \"Vitesse de lecture\" - Le menu Vitesse de lecture est masqué - Le menu Vitesse de lecture est affiché - - Masquer \"Verrouiller l\'écran\" - Le menu Verrouiller l\'écran est masqué - Le menu Verrouiller l\'écran est affiché - - Masquer \"Écouter avec YouTube Music\" - Le menu Écouter avec YouTube Music est masqué - Le menu Écouter avec YouTube Music est affiché - - Masquer \"Piste audio\" - Le menu Piste audio est masqué - Le menu Piste audio est affiché - + Masquer \"Sous-titres\" + Le menu Sous-titres est masqué + Le menu Sous-titres est affiché + + Masquer \"Autres paramètres\" + Le menu Autres paramètres est masqué + Le menu Autres paramètres est affiché + + Masquer \"Délai de mise en veille\" + Le menu Délai de mise en veille est masqué + Le menu Délai de mise en veille est affiché + + Masquer \"Lecture en boucle\" + Le menu Lecture en boucle est masqué + Le menu Lecture en boucle est affiché + + Masquer \"Mode ambiant\" + Le menu Mode ambiant est masqué + Le menu Mode ambiant est affiché + Masquer \"Volume stable\" + Le menu Volume stable est affiché + Le menu Volume stable est masqué + + Masquer \"Aide et commentaires\" + Le menu Aide et commentaires est masqué + Le menu Aide et commentaires est affiché + + Masquer \"Vitesse de lecture\" + Le menu Vitesse de lecture est masqué + Le menu Vitesse de lecture est affiché + + Masquer \"Verrouiller l\'écran\" + Le menu Verrouiller l\'écran est masqué + Le menu Verrouiller l\'écran est affiché + + Masquer \"Écouter avec YouTube Music\" + Le menu Écouter avec YouTube Music est masqué + Le menu Écouter avec YouTube Music est affiché + + Masquer \"Piste audio\" + Le menu Piste audio est masqué + Le menu Piste audio est affiché + - "Le menu Piste audio est masqué + "Le menu Piste audio est masqué Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur \"Android No SDK\"" - - Masquer \"Regarder en RV\" - Le menu Regarder en RV est masqué - Le menu Regarder en RV est affiché - Masquer le menu de qualité vidéo - Le menu de qualité vidéo est masqué - Le menu de qualité vidéo est affiché - Masquer le pied de page du menu de qualité vidéo - Le pied de page du menu de qualité vidéo est masqué - Le pied de page du menu de qualité vidéo est affiché - - - Masquer le bouton Lecture automatique - Le bouton Lecture automatique est masqué - Le bouton Lecture automatique est affiché - - Masquer le bouton Sous-titres - Le bouton Sous-titres est masqué - Le bouton Sous-titres est affiché - Masquer le bouton Caster - Le bouton Caster est masqué - Le bouton Caster est affiché - Masquer l\'arrière-plan des commandes du lecteur - L\'arrière-plan des commandes du lecteur est masqué - L\'arrière-plan des commandes du lecteur est affiché - Masquer les boutons Précédent et Suivant - Les boutons sont masqués - Les boutons sont affichés - - - Masquer les écrans de fin au format fiche - Les écrans de fin au format fiche sont masqués - Les écrans de fin au format fiche sont affichés - - - Désactiver le mode ambiant en plein écran - Mode ambiant désactivé - Mode ambiant activé - - - Masquer les fiches info - Les fiches info sont masquées - Les fiches info sont affichées - - - Désactiver l\'animation des statistiques numériques - Les statistiques numériques ne sont pas animées - Les statistiques numériques sont animées - - - Masquer la barre de progression du lecteur vidéo - La barre de progression du lecteur vidéo est masquée - La barre de progression du lecteur vidéo est affichée - - Masquer la barre de progression dans la miniature des vidéos - La barre de progression dans la miniature des vidéos est masquée - La barre de progression dans la miniature des vidéos est affichée - - - Lecteur Shorts - Masquez ou affichez des composants du lecteur Shorts - - Masquer les Shorts dans le flux Accueil - Masqués dans le flux Accueil et dans les vidéos associées - Affichés dans le flux Accueil et dans les vidéos associées - Masquer les Shorts dans les résultats de recherche - Masqués dans les résultats de recherche - Affichés dans les résultats de recherche - - Masquer les Shorts dans le flux Abonnements - Masqués dans le flux Abonnements - Affichés dans le flux Abonnements - Masquer les Shorts dans l\'historique des vidéos regardées - Masqués dans l\'historique des vidéos regardées - Affichés dans l\'historique des vidéos regardées - Masquer le libellé \"Doublée automatiquement\" - Le libellé Doublée automatiquement est masqué - Le libellé Doublée automatiquement est affiché - Masquer le bouton \"Acheter un Super Thanks\" - Le bouton Acheter un Super Thanks est masqué - Le bouton Acheter un Super Thanks est affiché - Masquer le bouton d\'effet - Le bouton d\'effet est masqué - Le bouton d\'effet est affiché - Masquer le bouton \"Écran vert\" - Le bouton Écran vert est masqué - Le bouton Écran vert est affiché - Masquer le bouton de hashtag - Le bouton de hashtag est masqué - Le bouton de hashtag est affiché - - Masquer le bouton Rejoindre - Le bouton Rejoindre est masqué - Le bouton Rejoindre est affiché - Masquer les aperçus de diffusions en direct - Les aperçus de diffusions en direct sont masqués - Les aperçus de diffusions en direct sont affichés - Masquer le libellé de lieu - Le libellé de lieu est masqué - Le libellé de lieu est affiché - Masquer le bouton \"Nouveaux posts\" - Le bouton Nouveaux posts est masqué - Le bouton Nouveaux posts est affiché - Masquer les boutons affichés en pause - Les boutons qui s\'affichent lorsqu\'un Short est mis en pause sont masqués - Les boutons qui s\'affichent lorsqu\'un Short est mis en pause sont affichés - Masquer le commentaire servant d\'aperçu - Le commentaire servant d\'aperçu est masqué - Le commentaire servant d\'aperçu est affiché - Masquer le bouton \"Enregistrer la musique\" - Le bouton Enregistrer la musique est masqué - Le bouton Enregistrer la musique est affiché - Masquer les recherches suggérées - Les recherches suggérées sont masquées - Les recherches suggérées sont affichées - Masquer le bouton Magasin - Le bouton Magasin est masqué - Le bouton Magasin est affiché - Masquer les autocollants - Les autocollants sont masqués - Les autocollants sont affichés - Masquer le bouton S\'abonner - Le bouton S\'abonner est masqué - Le bouton S\'abonner est affiché - Masquer les produits tagués - Les produits tagués sont masqués - Les produits tagués sont affichés - Masquer le bouton Diffusion prévue - Le bouton Diffusion prévue est masqué - Le bouton Diffusion prévue est affiché - Masquer le bouton \"Utiliser ce son\" - Le bouton Utiliser ce son est masqué - Le bouton Utiliser ce son est affiché - Masquer le bouton \"Utiliser ce modèle\" - Le bouton Utiliser ce modèle est masqué - Le bouton Utiliser ce modèle est affiché - Masquer l\'animation de fontaine du bouton J\'aime - L\'animation de fontaine du bouton J\'aime est masquée - L\'animation de fontaine du bouton J\'aime est affichée - Masquer le bouton J\'aime - Le bouton J\'aime est masqué - Le bouton J\'aime est affiché - Masquer le bouton Je n\'aime pas - Le bouton Je n\'aime pas est masqué - Le bouton Je n\'aime pas est affiché - Masquer le bouton Commentaires - Le bouton Commentaires est masqué - Le bouton Commentaires est affiché - - Masquer le bouton Partager - Le bouton Partager est masqué - Le bouton Partager est affiché - - Masquer le bouton Remixer - Le bouton Remixer est masqué - Le bouton Remixer est affiché - Masquer le bouton du son - Le bouton permettant d\'accéder au son est masqué - Le bouton permettant d\'accéder au son est affiché - Masquer le panneau d\'informations - Le panneau d\'informations est masqué - Le panneau d\'informations est affiché - Masquer la barre de chaîne - La barre de chaîne est masquée - La barre de chaîne est affichée - Masquer le titre de la vidéo - Le titre de la vidéo est masqué - Le titre de la vidéo est affiché - Masquer le libellé des métadonnées audio - Le libellé des métadonnées audio est masqué - Le libellé des métadonnées audio est affiché - Masquer le libellé du lien vidéo - Le libellé de lien est masqué - Le libellé de lien est affiché - Masquer la barre de navigation - La barre de navigation est masquée - La barre de navigation est affichée - - - Masquer l\'écran de fin suggérant une vidéo - "L'écran de fin suggérant une vidéo est masqué lorsque la lecture automatique est désactivée + + Masquer \"Regarder en RV\" + Le menu Regarder en RV est masqué + Le menu Regarder en RV est affiché + Masquer le menu de qualité vidéo + Le menu de qualité vidéo est masqué + Le menu de qualité vidéo est affiché + Masquer le pied de page du menu de qualité vidéo + Le pied de page du menu de qualité vidéo est masqué + Le pied de page du menu de qualité vidéo est affiché + + + Masquer le bouton Lecture automatique + Le bouton Lecture automatique est masqué + Le bouton Lecture automatique est affiché + + Masquer le bouton Sous-titres + Le bouton Sous-titres est masqué + Le bouton Sous-titres est affiché + Masquer le bouton Caster + Le bouton Caster est masqué + Le bouton Caster est affiché + Masquer l\'arrière-plan des commandes du lecteur + L\'arrière-plan des commandes du lecteur est masqué + L\'arrière-plan des commandes du lecteur est affiché + Masquer les boutons Précédent et Suivant + Les boutons sont masqués + Les boutons sont affichés + + + Masquer les écrans de fin au format fiche + Les écrans de fin au format fiche sont masqués + Les écrans de fin au format fiche sont affichés + + + Désactiver le mode ambiant en plein écran + Mode ambiant désactivé + Mode ambiant activé + + + Masquer les fiches info + Les fiches info sont masquées + Les fiches info sont affichées + + + Désactiver l\'animation des statistiques numériques + Les statistiques numériques ne sont pas animées + Les statistiques numériques sont animées + + + Masquer la barre de progression du lecteur vidéo + La barre de progression du lecteur vidéo est masquée + La barre de progression du lecteur vidéo est affichée + + Masquer la barre de progression dans la miniature des vidéos + La barre de progression dans la miniature des vidéos est masquée + La barre de progression dans la miniature des vidéos est affichée + + + Lecteur Shorts + Masquez ou affichez des composants du lecteur Shorts + + Masquer les Shorts dans le flux Accueil + Masqués dans le flux Accueil et dans les vidéos associées + Affichés dans le flux Accueil et dans les vidéos associées + Masquer les Shorts dans les résultats de recherche + Masqués dans les résultats de recherche + Affichés dans les résultats de recherche + + Masquer les Shorts dans le flux Abonnements + Masqués dans le flux Abonnements + Affichés dans le flux Abonnements + Masquer les Shorts dans l\'historique des vidéos regardées + Masqués dans l\'historique des vidéos regardées + Affichés dans l\'historique des vidéos regardées + Masquer le libellé \"Doublée automatiquement\" + Le libellé Doublée automatiquement est masqué + Le libellé Doublée automatiquement est affiché + Masquer le bouton \"Acheter un Super Thanks\" + Le bouton Acheter un Super Thanks est masqué + Le bouton Acheter un Super Thanks est affiché + Masquer le bouton d\'effet + Le bouton d\'effet est masqué + Le bouton d\'effet est affiché + Masquer le bouton \"Écran vert\" + Le bouton Écran vert est masqué + Le bouton Écran vert est affiché + Masquer le bouton de hashtag + Le bouton de hashtag est masqué + Le bouton de hashtag est affiché + + Masquer le bouton Rejoindre + Le bouton Rejoindre est masqué + Le bouton Rejoindre est affiché + Masquer les aperçus de diffusions en direct + Les aperçus de diffusions en direct sont masqués + Les aperçus de diffusions en direct sont affichés + Masquer le libellé de lieu + Le libellé de lieu est masqué + Le libellé de lieu est affiché + Masquer le bouton \"Nouveaux posts\" + Le bouton Nouveaux posts est masqué + Le bouton Nouveaux posts est affiché + Masquer les boutons affichés en pause + Les boutons qui s\'affichent lorsqu\'un Short est mis en pause sont masqués + Les boutons qui s\'affichent lorsqu\'un Short est mis en pause sont affichés + Masquer le commentaire servant d\'aperçu + Le commentaire servant d\'aperçu est masqué + Le commentaire servant d\'aperçu est affiché + Masquer le bouton \"Enregistrer la musique\" + Le bouton Enregistrer la musique est masqué + Le bouton Enregistrer la musique est affiché + Masquer les recherches suggérées + Les recherches suggérées sont masquées + Les recherches suggérées sont affichées + Masquer le bouton Magasin + Le bouton Magasin est masqué + Le bouton Magasin est affiché + Masquer les autocollants + Les autocollants sont masqués + Les autocollants sont affichés + Masquer le bouton S\'abonner + Le bouton S\'abonner est masqué + Le bouton S\'abonner est affiché + Masquer les produits tagués + Les produits tagués sont masqués + Les produits tagués sont affichés + Masquer le bouton Diffusion prévue + Le bouton Diffusion prévue est masqué + Le bouton Diffusion prévue est affiché + Masquer le bouton \"Utiliser ce son\" + Le bouton Utiliser ce son est masqué + Le bouton Utiliser ce son est affiché + Masquer le bouton \"Utiliser ce modèle\" + Le bouton Utiliser ce modèle est masqué + Le bouton Utiliser ce modèle est affiché + Masquer l\'animation de fontaine du bouton J\'aime + L\'animation de fontaine du bouton J\'aime est masquée + L\'animation de fontaine du bouton J\'aime est affichée + Masquer le bouton J\'aime + Le bouton J\'aime est masqué + Le bouton J\'aime est affiché + Masquer le bouton Je n\'aime pas + Le bouton Je n\'aime pas est masqué + Le bouton Je n\'aime pas est affiché + Masquer le bouton Commentaires + Le bouton Commentaires est masqué + Le bouton Commentaires est affiché + + Masquer le bouton Partager + Le bouton Partager est masqué + Le bouton Partager est affiché + + Masquer le bouton Remixer + Le bouton Remixer est masqué + Le bouton Remixer est affiché + Masquer le bouton du son + Le bouton permettant d\'accéder au son est masqué + Le bouton permettant d\'accéder au son est affiché + Masquer le panneau d\'informations + Le panneau d\'informations est masqué + Le panneau d\'informations est affiché + Masquer la barre de chaîne + La barre de chaîne est masquée + La barre de chaîne est affichée + Masquer le titre de la vidéo + Le titre de la vidéo est masqué + Le titre de la vidéo est affiché + Masquer le libellé des métadonnées audio + Le libellé des métadonnées audio est masqué + Le libellé des métadonnées audio est affiché + Masquer le libellé du lien vidéo + Le libellé de lien est masqué + Le libellé de lien est affiché + Masquer la barre de navigation + La barre de navigation est masquée + La barre de navigation est affichée + + + Masquer l\'écran de fin suggérant une vidéo + "L'écran de fin suggérant une vidéo est masqué lorsque la lecture automatique est désactivée La lecture automatique peut être modifiée dans les paramètres de YouTube : Paramètres → Lecture → Lecture automatique de la vidéo suivante" - L\'écran de fin suggérant une vidéo est affiché - - - Masquer l\'overlay des vidéos associées - L\'overlay des vidéos associées en mode plein écran est masqué - L\'overlay des vidéos associées en mode plein écran est affiché - - - Masquer le temps écoulé et la durée totale - Le temps écoulé et la durée totale sont masqués - Le temps écoulé et la durée totale sont affichés - - - Masquer les panneaux pop-up du lecteur - Les panneaux pop-up du lecteur sont masqués - Les panneaux pop-up du lecteur sont affichés - - - Sortir du mode plein écran à la fin de la vidéo - Désactivé - Portrait - Paysage - Portrait et paysage - - - Ouvrir les vidéos en plein écran portrait - Les vidéos s\'ouvrent en plein écran - Les vidéos ne s\'ouvrent pas en plein écran - - - Opacité de l\'overlay du lecteur - Valeur d\'opacité comprise entre 0 et 100, 0 est transparent - L\'opacité de l\'overlay du lecteur doit être comprise entre 0 et 100 - - - - \"Je n\'aime pas\" temp. indisponibles (pas de réponse) - \"Je n\'aime pas\" indisponibles (statut %d) - Les \"Je n\'aime pas\" sont indisponibles (limite de requêtes atteinte) - \"Je n\'aime pas\" indisponibles (%s) - - Rechargez la vidéo pour voter avec Return YouTube Dislike - - Masqué par le propriétaire - Return YouTube Dislike - Les \"Je n\'aime pas\" sont affichés - Les \"Je n\'aime pas\" ne sont pas affichés - Afficher les \"Je n\'aime pas\" sur les Shorts - "Les \"Je n'aime pas\" sont affichés sur les Shorts + L\'écran de fin suggérant une vidéo est affiché + + + Masquer l\'overlay des vidéos associées + L\'overlay des vidéos associées en mode plein écran est masqué + L\'overlay des vidéos associées en mode plein écran est affiché + + + Masquer le temps écoulé et la durée totale + Le temps écoulé et la durée totale sont masqués + Le temps écoulé et la durée totale sont affichés + + + Masquer les panneaux pop-up du lecteur + Les panneaux pop-up du lecteur sont masqués + Les panneaux pop-up du lecteur sont affichés + + + Sortir du mode plein écran à la fin de la vidéo + Désactivé + Portrait + Paysage + Portrait et paysage + + + Ouvrir les vidéos en plein écran portrait + Les vidéos s\'ouvrent en plein écran + Les vidéos ne s\'ouvrent pas en plein écran + + + Opacité de l\'overlay du lecteur + Valeur d\'opacité comprise entre 0 et 100, 0 est transparent + L\'opacité de l\'overlay du lecteur doit être comprise entre 0 et 100 + + + + \"Je n\'aime pas\" temp. indisponibles (pas de réponse) + \"Je n\'aime pas\" indisponibles (statut %d) + Les \"Je n\'aime pas\" sont indisponibles (limite de requêtes atteinte) + \"Je n\'aime pas\" indisponibles (%s) + + Rechargez la vidéo pour voter avec Return YouTube Dislike + + Masqué par le propriétaire + Return YouTube Dislike + Les \"Je n\'aime pas\" sont affichés + Les \"Je n\'aime pas\" ne sont pas affichés + Afficher les \"Je n\'aime pas\" sur les Shorts + "Les \"Je n'aime pas\" sont affichés sur les Shorts Limitation : Il se peut que les \"Je n'aime pas\" n'apparaissent pas en mode navigation privée" - Les \"Je n\'aime pas\" ne sont pas affichés sur les Shorts - Pourcentage de \"Je n\'aime pas\" - Les \"Je n\'aime pas\" sont affichés sous forme de pourcentage - Les \"Je n\'aime pas\" sont affichés sous forme de total - - Bouton J\'aime compact - Bouton J\'aime optimisé pour minimiser la taille - Bouton J\'aime optimisé pour l\'apparence - Afficher les \"J\'aime\" estimés - Un nombre estimé de \"J\'aime\" est affiché sous les vidéos où les \"J\'aime\" sont désactivés - Les \"J\'aime\" estimés ne sont pas affichés - Afficher un message toast si l\'API n\'est pas disponible - Un message toast est affiché si Return YouTube Dislike n\'est pas disponible - Aucun message toast affiché si Return YouTube Dislike n\'est pas disponible - ReturnYouTubeDislike.com - Les données sont fournies par l\'API Return YouTube Dislike. Appuyez ici pour en savoir plus. - - Statistiques de l\'API Return Youtube Dislike pour cet appareil - Temps de réponse de l\'API, moyenne - Temps de réponse de l\'API, minimum - Temps de réponse de l\'API, maximum - Temps de réponse de l\'API, dernière vidéo - \"Je n\'aime pas\" temporairement indisponibles – Limite de requêtes API appliquée - Récupération des votes auprès de l\'API, nombre d\'appels - Aucun appel réseau effectué - %d appels réseau effectués - Récupération des votes auprès de l\'API, nombre de requêtes expirées - Aucun appel réseau n\'a expiré - %d appels réseau ont expiré - Limites de requêtes API appliquées au client - Aucune limite de requêtes appliquée au client - Limite de requêtes appliquée %d fois au client - %d millisecondes - - - Activer la barre de recherche élargie - La barre de recherche élargie est activée - La barre de recherche élargie est désactivée - - - Activer les miniatures haute qualité - Les miniatures de la barre de progression sont en haute qualité - Les miniatures de la barre de progression sont en qualité moyenne - Les miniatures plein écran de la barre de progression sont en haute qualité - Les miniatures plein écran de la barre de progression sont en qualité moyenne - "Cela restaurera également les miniatures sur les diffusions en direct, qui ne sont normalement pas dotées de miniatures de barre de progression. + Les \"Je n\'aime pas\" ne sont pas affichés sur les Shorts + Pourcentage de \"Je n\'aime pas\" + Les \"Je n\'aime pas\" sont affichés sous forme de pourcentage + Les \"Je n\'aime pas\" sont affichés sous forme de total + + Bouton J\'aime compact + Bouton J\'aime optimisé pour minimiser la taille + Bouton J\'aime optimisé pour l\'apparence + Afficher les \"J\'aime\" estimés + Un nombre estimé de \"J\'aime\" est affiché sous les vidéos où les \"J\'aime\" sont désactivés + Les \"J\'aime\" estimés ne sont pas affichés + Afficher un message toast si l\'API n\'est pas disponible + Un message toast est affiché si Return YouTube Dislike n\'est pas disponible + Aucun message toast affiché si Return YouTube Dislike n\'est pas disponible + ReturnYouTubeDislike.com + Les données sont fournies par l\'API Return YouTube Dislike. Appuyez ici pour en savoir plus. + + Statistiques de l\'API Return Youtube Dislike pour cet appareil + Temps de réponse de l\'API, moyenne + Temps de réponse de l\'API, minimum + Temps de réponse de l\'API, maximum + Temps de réponse de l\'API, dernière vidéo + \"Je n\'aime pas\" temporairement indisponibles – Limite de requêtes API appliquée + Récupération des votes auprès de l\'API, nombre d\'appels + Aucun appel réseau effectué + %d appels réseau effectués + Récupération des votes auprès de l\'API, nombre de requêtes expirées + Aucun appel réseau n\'a expiré + %d appels réseau ont expiré + Limites de requêtes API appliquées au client + Aucune limite de requêtes appliquée au client + Limite de requêtes appliquée %d fois au client + %d millisecondes + + + Activer la barre de recherche élargie + La barre de recherche élargie est activée + La barre de recherche élargie est désactivée + + + Activer les miniatures haute qualité + Les miniatures de la barre de progression sont en haute qualité + Les miniatures de la barre de progression sont en qualité moyenne + Les miniatures plein écran de la barre de progression sont en haute qualité + Les miniatures plein écran de la barre de progression sont en qualité moyenne + "Cela restaurera également les miniatures sur les diffusions en direct, qui ne sont normalement pas dotées de miniatures de barre de progression. La qualité des miniatures de la barre de progression sera identique à la qualité de la vidéo. Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo de 720p ou inférieur et lorsque votre connexion Internet est très rapide." - Restaurer les anciennes miniatures de la barre de progression - Les miniatures de la barre de progression apparaîtront au-dessus de la barre - Les miniatures de la barre de progression apparaîtront en plein écran - - - SponsorBlock - Activer SponsorBlock - SponsorBlock est un système collaboratif permettant d\'ignorer les passages indésirables des vidéos YouTube - Apparence - Afficher le bouton de vote - Le bouton permettant de voter sur un segment est affiché - Le bouton permettant de voter sur un segment est masqué - Utiliser la disposition à angles droits - Les boutons et les commandes sont à angles droits - Les boutons et les commandes sont arrondis - - Utiliser le bouton Passer compact - Bouton Passer optimisé pour minimiser la largeur - Bouton Passer optimisé pour l\'apparence - Masquer automatiquement le bouton Passer - Le bouton Passer est masqué après quelques secondes - Le bouton Passer est affiché pendant toute la durée du segment - Durée du bouton Passer - Durée d\'affichage des boutons \"Passer\" et \"Passer au temps fort\" avant masquage automatique - Afficher le message toast d\'annulation de saut - Un message toast est affiché lorsqu\'un segment est automatiquement passé. Appuyez dessus pour annuler le saut. - Le message toast n\'est pas affiché - Durée du message toast de saut - Durée d\'affichage du message toast d\'annulation de saut - 1 seconde - 2 secondes - 3 secondes - 4 secondes - 5 secondes - 6 secondes - 7 secondes - 8 secondes - 9 secondes - 10 secondes - Afficher la durée de la vidéo sans les segments - La durée de la vidéo moins tous les segments est affichée sur la barre de progression - La durée totale de la vidéo est affichée - Création de nouveaux segments - Afficher le bouton Créer un segment - Le bouton de création de segment est affiché - Le bouton de création de segment n\'est pas affiché - Durée du pas d\'ajustement des nouveaux segments - Durée en millisecondes utilisée par les boutons permettant de régler finement la durée des nouveaux segments - La valeur doit être un nombre positif - Voir les directives - Les directives contiennent des règles et des conseils pour la création de segments - Respectez les directives - Lisez les directives SponsorBlock avant de créer de nouveaux segments - Déjà lues - Montrez-les-moi - Général - Afficher un message toast si l\'API n\'est pas disponible - Un message toast est affiché si SponsorBlock n\'est pas disponible - Pas d\'affichage de message toast si SponsorBlock n\'est pas disponible - Activer le comptage des segments ignorés - Permet à SponsorBlock d\'afficher sur son classement le temps total épargné à ses utilisateurs. Un message est envoyé au classement à chaque fois qu\'un segment est ignoré. - Le comptage des segments ignorés n\'est pas activé - Durée minimale d\'un segment - Les segments dont la durée est inférieure à cette valeur (en secondes) ne seront ni affichés ni ignorés - Durée invalide - Votre ID d\'utilisateur privé - Cet identifiant doit rester confidentiel. Cet identifiant est comme un mot de passe et ne doit être partagé avec qui que ce soit. Si quelqu\'un venait à mettre la main dessus, il pourrait usurper votre identité. - ID d\'utilisateur privé trop court (30+ caractères) - Modifier l\'URL de l\'API - L\'adresse utilisée par SponsorBlock pour contacter son serveur - URL de l\'API réinitialisée - L\'URL de l\'API est invalide - URL de l\'API modifiée - Importer/Exporter les paramètres - Copier - Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et les autres plateformes SponsorBlock - Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et d\'autres plateformes SponsorBlock. Votre ID d\'utilisateur privé y est présent, partagez-la avec prudence. - Paramètres importés avec succès - Échec de l\'importation : %s - Échec de l\'exportation : %s - "Vos paramètres contiennent un ID d'utilisateur SponsorBlock privé. + Restaurer les anciennes miniatures de la barre de progression + Les miniatures de la barre de progression apparaîtront au-dessus de la barre + Les miniatures de la barre de progression apparaîtront en plein écran + + + SponsorBlock + Activer SponsorBlock + SponsorBlock est un système collaboratif permettant d\'ignorer les passages indésirables des vidéos YouTube + Apparence + Afficher le bouton de vote + Le bouton permettant de voter sur un segment est affiché + Le bouton permettant de voter sur un segment est masqué + Utiliser la disposition à angles droits + Les boutons et les commandes sont à angles droits + Les boutons et les commandes sont arrondis + + Utiliser le bouton Passer compact + Bouton Passer optimisé pour minimiser la largeur + Bouton Passer optimisé pour l\'apparence + Masquer automatiquement le bouton Passer + Le bouton Passer est masqué après quelques secondes + Le bouton Passer est affiché pendant toute la durée du segment + Durée du bouton Passer + Durée d\'affichage des boutons \"Passer\" et \"Passer au temps fort\" avant masquage automatique + Afficher le message toast d\'annulation de saut + Un message toast est affiché lorsqu\'un segment est automatiquement passé. Appuyez dessus pour annuler le saut. + Le message toast n\'est pas affiché + Durée du message toast de saut + Durée d\'affichage du message toast d\'annulation de saut + 1 seconde + 2 secondes + 3 secondes + 4 secondes + 5 secondes + 6 secondes + 7 secondes + 8 secondes + 9 secondes + 10 secondes + Afficher la durée de la vidéo sans les segments + La durée de la vidéo moins tous les segments est affichée sur la barre de progression + La durée totale de la vidéo est affichée + Création de nouveaux segments + Afficher le bouton Créer un segment + Le bouton de création de segment est affiché + Le bouton de création de segment n\'est pas affiché + Durée du pas d\'ajustement des nouveaux segments + Durée en millisecondes utilisée par les boutons permettant de régler finement la durée des nouveaux segments + La valeur doit être un nombre positif + Voir les directives + Les directives contiennent des règles et des conseils pour la création de segments + Respectez les directives + Lisez les directives SponsorBlock avant de créer de nouveaux segments + Déjà lues + Montrez-les-moi + Général + Afficher un message toast si l\'API n\'est pas disponible + Un message toast est affiché si SponsorBlock n\'est pas disponible + Pas d\'affichage de message toast si SponsorBlock n\'est pas disponible + Activer le comptage des segments ignorés + Permet à SponsorBlock d\'afficher sur son classement le temps total épargné à ses utilisateurs. Un message est envoyé au classement à chaque fois qu\'un segment est ignoré. + Le comptage des segments ignorés n\'est pas activé + Durée minimale d\'un segment + Les segments dont la durée est inférieure à cette valeur (en secondes) ne seront ni affichés ni ignorés + Durée invalide + Votre ID d\'utilisateur privé + Cet identifiant doit rester confidentiel. Cet identifiant est comme un mot de passe et ne doit être partagé avec qui que ce soit. Si quelqu\'un venait à mettre la main dessus, il pourrait usurper votre identité. + ID d\'utilisateur privé trop court (30+ caractères) + Modifier l\'URL de l\'API + L\'adresse utilisée par SponsorBlock pour contacter son serveur + URL de l\'API réinitialisée + L\'URL de l\'API est invalide + URL de l\'API modifiée + Importer/Exporter les paramètres + Copier + Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et les autres plateformes SponsorBlock + Votre configuration SponsorBlock au format JSON qui peut être importée/exportée vers ReVanced et d\'autres plateformes SponsorBlock. Votre ID d\'utilisateur privé y est présent, partagez-la avec prudence. + Paramètres importés avec succès + Échec de l\'importation : %s + Échec de l\'exportation : %s + "Vos paramètres contiennent un ID d'utilisateur SponsorBlock privé. Votre ID d'utilisateur est comme un mot de passe et ne doit jamais être partagé." - Ne plus afficher - Modifier le comportement par segment - Sponsor - Promotions rémunérées, parrainages rémunérés et simples publicités. Non destinée à l\'autopromotion ou aux simples mentions de causes/créateurs/sites Web/produits. - Non rémunéré / Autopromotion - Catégorie similaire à Sponsor, sauf qu\'elle est destinée aux promotions non rémunérées et à l\'autopromotion. Cela inclut les sections à propos des produits dérivés, des dons ou des personnalités invitées. - Rappel d\'interaction (Abonnez-vous) - Rappel rapide d\'aimer, de s\'abonner ou de suivre le créateur en plein milieu du contenu. Si le rappel dure longtemps ou qu\'il est à propos d\'un sujet particulier, il doit être considéré comme de l\'autopromotion et être catégorisé comme tel. - Temps fort - La partie de la vidéo qui intéresse la majorité des spectateurs - Entracte / Animation d\'intro - Un intervalle sans contenu réel. Il peut s\'agir d\'une pause, d\'une image statique ou d\'une animation répétitive. N\'inclut pas les transitions contenant des informations. - Écrans de fin / Crédits - Crédits ou moment où apparaissent les écrans de fin YouTube. Pas pour les conclusions contenant des informations. - Accroche / Salutations - Présentation de la vidéo actuelle ou d\'une prochaine vidéo par le créateur, salutations et au revoir. N\'inclut pas les sections qui ajoutent du contenu supplémentaire. - Aperçu / Résumé - Collection de clips qui présentent ce qui va suivre ou ce qui s\'est passé dans la vidéo ou dans d\'autres vidéos d\'une série, où toutes les informations sont répétées ailleurs - Digression / Blagues - Digressions ou blagues non nécessaires à la compréhension du contenu principal de la vidéo. N\'inclut pas les sections fournissant du contexte ou des détails secondaires. - Musique : Segment non musical - Uniquement pour utilisation dans les vidéos musicales. Sections non musicales dans les clips, qui ne sont pas déjà couvertes par une autre catégorie. - Passer - Temps fort - Passer le sponsor - Passer la promotion - Passer le rappel - Passer au temps fort - Passer l\'intro - Passer l\'entracte - Passer l\'entracte - Passer l\'outro - Passer l\'accroche - Passer l\'aperçu - Passer l\'aperçu - Passer le résumé - Passer la digression - Passer non musical - Passer le segment - Sponsor ignoré - Autopromotion ignorée - Rappel d\'interaction ignoré - Passé au temps fort - Intro ignorée - Entracte ignoré - Entracte ignoré - Outro ignorée - Accroche ignorée - Aperçu ignoré - Aperçu ignoré - Résumé ignoré - Digression ignorée - Section non musicale ignorée - Segment non soumis ignoré - Plusieurs segments ignorés - Passer automatiquement - Passer automatiquement une seule fois - Afficher le bouton Passer - Afficher dans la barre de progression - Désactiver - Impossible de soumettre le segment : %s - SponsorBlock est temporairement indisponible - Impossible de soumettre le segment (statut : %1$d %2$s) - Impossible de soumettre le segment. Requêtes limitées (trop du même utilisateur ou de la même IP). - Impossible de soumettre le segment : %s - "Impossible de soumettre le segment. + Ne plus afficher + Modifier le comportement par segment + Sponsor + Promotions rémunérées, parrainages rémunérés et simples publicités. Non destinée à l\'autopromotion ou aux simples mentions de causes/créateurs/sites Web/produits. + Non rémunéré / Autopromotion + Catégorie similaire à Sponsor, sauf qu\'elle est destinée aux promotions non rémunérées et à l\'autopromotion. Cela inclut les sections à propos des produits dérivés, des dons ou des personnalités invitées. + Rappel d\'interaction (Abonnez-vous) + Rappel rapide d\'aimer, de s\'abonner ou de suivre le créateur en plein milieu du contenu. Si le rappel dure longtemps ou qu\'il est à propos d\'un sujet particulier, il doit être considéré comme de l\'autopromotion et être catégorisé comme tel. + Temps fort + La partie de la vidéo qui intéresse la majorité des spectateurs + Entracte / Animation d\'intro + Un intervalle sans contenu réel. Il peut s\'agir d\'une pause, d\'une image statique ou d\'une animation répétitive. N\'inclut pas les transitions contenant des informations. + Écrans de fin / Crédits + Crédits ou moment où apparaissent les écrans de fin YouTube. Pas pour les conclusions contenant des informations. + Accroche / Salutations + Présentation de la vidéo actuelle ou d\'une prochaine vidéo par le créateur, salutations et au revoir. N\'inclut pas les sections qui ajoutent du contenu supplémentaire. + Aperçu / Résumé + Collection de clips qui présentent ce qui va suivre ou ce qui s\'est passé dans la vidéo ou dans d\'autres vidéos d\'une série, où toutes les informations sont répétées ailleurs + Digression / Blagues + Digressions ou blagues non nécessaires à la compréhension du contenu principal de la vidéo. N\'inclut pas les sections fournissant du contexte ou des détails secondaires. + Musique : Segment non musical + Uniquement pour utilisation dans les vidéos musicales. Sections non musicales dans les clips, qui ne sont pas déjà couvertes par une autre catégorie. + Passer + Temps fort + Passer le sponsor + Passer la promotion + Passer le rappel + Passer au temps fort + Passer l\'intro + Passer l\'entracte + Passer l\'entracte + Passer l\'outro + Passer l\'accroche + Passer l\'aperçu + Passer l\'aperçu + Passer le résumé + Passer la digression + Passer non musical + Passer le segment + Sponsor ignoré + Autopromotion ignorée + Rappel d\'interaction ignoré + Passé au temps fort + Intro ignorée + Entracte ignoré + Entracte ignoré + Outro ignorée + Accroche ignorée + Aperçu ignoré + Aperçu ignoré + Résumé ignoré + Digression ignorée + Section non musicale ignorée + Segment non soumis ignoré + Plusieurs segments ignorés + Passer automatiquement + Passer automatiquement une seule fois + Afficher le bouton Passer + Afficher dans la barre de progression + Désactiver + Impossible de soumettre le segment : %s + SponsorBlock est temporairement indisponible + Impossible de soumettre le segment (statut : %1$d %2$s) + Impossible de soumettre le segment. Requêtes limitées (trop du même utilisateur ou de la même IP). + Impossible de soumettre le segment : %s + "Impossible de soumettre le segment. Il existe déjà." - Segment soumis avec succès - - SponsorBlock est indisponible (temps d\'attente expiré) - SponsorBlock est temporairement indisponible (code %d) - SponsorBlock est temporairement indisponible - Impossible de voter sur le segment (temps d\'attente expiré) - Impossible de voter sur le segment (statut : %1$d %2$s) - Impossible de voter sur le segment : %s - Voter pour - Voter contre - Modifier la catégorie - Il n\'y a pas de segments sur lesquels voter - - %1$s – %2$s - Choisissez la catégorie du segment - Catégorie désact. ds paramètres. Activer pr soumettre. - Nouveau segment SponsorBlock - Définir %s comme début ou fin d\'un nouveau segment ? - Début - Fin - Maintenant - Instant de début du segment - Instant de fin du segment - Ces valeurs sont-elles correctes ? - "Le segment s'étend de + Segment soumis avec succès + + SponsorBlock est indisponible (temps d\'attente expiré) + SponsorBlock est temporairement indisponible (code %d) + SponsorBlock est temporairement indisponible + Impossible de voter sur le segment (temps d\'attente expiré) + Impossible de voter sur le segment (statut : %1$d %2$s) + Impossible de voter sur le segment : %s + Voter pour + Voter contre + Modifier la catégorie + Il n\'y a pas de segments sur lesquels voter + + %1$s – %2$s + Choisissez la catégorie du segment + Catégorie désact. ds paramètres. Activer pr soumettre. + Nouveau segment SponsorBlock + Définir %s comme début ou fin d\'un nouveau segment ? + Début + Fin + Maintenant + Instant de début du segment + Instant de fin du segment + Ces valeurs sont-elles correctes ? + "Le segment s'étend de %1$s à @@ -1291,47 +1290,47 @@ Il existe déjà." (%3$s) Prêt à le soumettre ?" - Le début doit précéder la fin - Marquez d\'abord deux emplacements sur la barre de progression - Prévisualisez segment + contrôlez fluidité du saut - Modifier la durée du segment manuellement - Voulez-vous modifier le début ou la fin du segment ? - Temps fourni invalide - Statistiques - - Les statistiques sont temporairement indisponibles (API injoignable) - Chargement... - SponsorBlock est désactivé - Votre nom d\'utilisateur : <b>%s</b> - Appuyez ici pour modifier votre nom d\'utilisateur - Impossible de modifier le nom d\'utilisateur : Statut : %1$d %2$s - Nom d\'utilisateur modifié avec succès - Votre réputation est de <b>%.2f</b> - Vous avez créé <b>%s</b> segments - Appuyez ici pour voir vos segments - Classement SponsorBlock - Vous avez épargné <b>%s</b> segments aux autres spectateurs - Appuyez ici pour voir les statistiques globales et les meilleurs contributeurs - Cela représente <b>%s</b> de leur vie.<br>Appuyez ici pour voir le classement - Vous avez passé <b>%s</b> segments - Pour un total de <b>%s</b> - Réinitialiser le compteur de segments passés ? - %1$s heures et %2$s minutes - %1$s minutes et %2$s secondes - %s secondes - Opacité : - Couleur : - À propos - sponsor.ajay.app - Les données sont fournies par l\'API SponsorBlock. Appuyez ici pour en savoir plus et pour voir les téléchargements pour les autres plateformes. - - - Format de mise en page - Par défaut - Téléphone - Tablette - Automotive - "Les modifications comprennent : + Le début doit précéder la fin + Marquez d\'abord deux emplacements sur la barre de progression + Prévisualisez segment + contrôlez fluidité du saut + Modifier la durée du segment manuellement + Voulez-vous modifier le début ou la fin du segment ? + Temps fourni invalide + Statistiques + + Les statistiques sont temporairement indisponibles (API injoignable) + Chargement... + SponsorBlock est désactivé + Votre nom d\'utilisateur : <b>%s</b> + Appuyez ici pour modifier votre nom d\'utilisateur + Impossible de modifier le nom d\'utilisateur : Statut : %1$d %2$s + Nom d\'utilisateur modifié avec succès + Votre réputation est de <b>%.2f</b> + Vous avez créé <b>%s</b> segments + Appuyez ici pour voir vos segments + Classement SponsorBlock + Vous avez épargné <b>%s</b> segments aux autres spectateurs + Appuyez ici pour voir les statistiques globales et les meilleurs contributeurs + Cela représente <b>%s</b> de leur vie.<br>Appuyez ici pour voir le classement + Vous avez passé <b>%s</b> segments + Pour un total de <b>%s</b> + Réinitialiser le compteur de segments passés ? + %1$s heures et %2$s minutes + %1$s minutes et %2$s secondes + %s secondes + Opacité : + Couleur : + À propos + sponsor.ajay.app + Les données sont fournies par l\'API SponsorBlock. Appuyez ici pour en savoir plus et pour voir les téléchargements pour les autres plateformes. + + + Format de mise en page + Par défaut + Téléphone + Tablette + Automotive + "Les modifications comprennent : Format Tablette • Les posts destinés à la communauté sont masqués @@ -1339,329 +1338,329 @@ Format Tablette Format Automotive • Les Shorts s'ouvrent dans le lecteur standard • Le flux est organisé par sujets et par chaînes" - - - Falsifier la version de l\'appli - Version falsifiée - Version non falsifiée - "La version de l'application sera falsifiée par une ancienne version de YouTube. + + + Falsifier la version de l\'appli + Version falsifiée + Version non falsifiée + "La version de l'application sera falsifiée par une ancienne version de YouTube. Cela modifiera l'apparence et les fonctionnalités de l'application, mais il peut y avoir des effets secondaires inconnus. Si désactivé ultérieurement, il est recommandé d'effacer les données de l'application pour éviter des bugs d'interface." - Version cible - 20.13.41 - Restaurer la barre d\'actions vidéo non réduite - 20.05.46 - Restaurer la fonctionnalité de transcription - 19.35.36 - Restaurer les anciennes icônes du lecteur Shorts - 19.01.34 - Restaurer les anciennes icônes de navigation - - - Modifier la page de démarrage - Par défaut - Tous les abonnements - Parcourir les chaînes - Savoirs & Cultures - Explorer - Mode et beauté - Jeux vidéo - Historique - Bibliothèque - Vidéos \"J\'aime\" - Direct - Films - Musique - Actualités - Notifications - Playlists - Recherche - Shopping - Shorts - Sport - Abonnements - Tendances - Réalité virtuelle - À regarder plus tard - Vos clips - Toujours modifier la page de démarrage - "La page de démarrage est toujours modifiée + Version cible + 20.13.41 - Restaurer la barre d\'actions vidéo non réduite + 20.05.46 - Restaurer la fonctionnalité de transcription + 19.35.36 - Restaurer les anciennes icônes du lecteur Shorts + 19.01.34 - Restaurer les anciennes icônes de navigation + + + Modifier la page de démarrage + Par défaut + Tous les abonnements + Parcourir les chaînes + Savoirs & Cultures + Explorer + Mode et beauté + Jeux vidéo + Historique + Bibliothèque + Vidéos \"J\'aime\" + Direct + Films + Musique + Actualités + Notifications + Playlists + Recherche + Shopping + Shorts + Sport + Abonnements + Tendances + Réalité virtuelle + À regarder plus tard + Vos clips + Toujours modifier la page de démarrage + "La page de démarrage est toujours modifiée Limitation : Il se peut que le bouton Retour dans la barre d'outils ne fonctionne pas" - La page de démarrage est modifiée uniquement au démarrage de l\'application - - - Désactiver la reprise du lecteur Shorts - Le lecteur Shorts ne se relancera pas au démarrage de l\'application - Le lecteur Shorts reprendra au démarrage de l\'application - - - Ouvrir les Shorts avec - Lecteur Shorts - Lecteur standard - Lecteur standard en plein écran - - - Lire automatiquement les Shorts - Les Shorts seront lus automatiquement - Les Shorts se répéteront - Lecture auto. des Shorts en arrière-plan - La lecture automatique sera activée pour les Shorts en arrière-plan - Les Shorts en arrière-plan seront lus en boucle - - - Lecteur réduit - Modifiez le style du lecteur réduit intégré à l\'application - Type de lecteur réduit - Désactivé - Par défaut - Minimum - Tablette - Moderne 1 - Moderne 2 - Moderne 3 - Moderne 4 - Désactiver les coins arrondis - Les coins sont carrés - Les coins sont arrondis - Activer le double appui et Pincer pour redimensionner - "L'action de double appui et Pincer pour redimensionner sont activés + La page de démarrage est modifiée uniquement au démarrage de l\'application + + + Désactiver la reprise du lecteur Shorts + Le lecteur Shorts ne se relancera pas au démarrage de l\'application + Le lecteur Shorts reprendra au démarrage de l\'application + + + Ouvrir les Shorts avec + Lecteur Shorts + Lecteur standard + Lecteur standard en plein écran + + + Lire automatiquement les Shorts + Les Shorts seront lus automatiquement + Les Shorts se répéteront + Lecture auto. des Shorts en arrière-plan + La lecture automatique sera activée pour les Shorts en arrière-plan + Les Shorts en arrière-plan seront lus en boucle + + + Lecteur réduit + Modifiez le style du lecteur réduit intégré à l\'application + Type de lecteur réduit + Désactivé + Par défaut + Minimum + Tablette + Moderne 1 + Moderne 2 + Moderne 3 + Moderne 4 + Désactiver les coins arrondis + Les coins sont carrés + Les coins sont arrondis + Activer le double appui et Pincer pour redimensionner + "L'action de double appui et Pincer pour redimensionner sont activés • Appuyez deux fois pour augmenter la taille du lecteur réduit • Appuyez deux fois à nouveau pour rétablir la taille d'origine" - Action de double appui et Pincer pour redimensionner sont désactivés - Désactiver le glisser-déposer - Le glisser-déposer est désactivé - "Le glisser-déposer est activé + Action de double appui et Pincer pour redimensionner sont désactivés + Désactiver le glisser-déposer + Le glisser-déposer est désactivé + "Le glisser-déposer est activé Le lecteur réduit peut être déplacé vers n'importe quel coin de l'écran" - Désactiver le geste de glissement horizontal - Geste de glissement horizontal désactivé - "Geste de glissement horizontal activé + Désactiver le geste de glissement horizontal + Geste de glissement horizontal désactivé + "Geste de glissement horizontal activé Le lecteur réduit peut être glissé hors de l'écran, à gauche comme à droite" - Masquer les boutons en superposition - Les boutons en superposition sont masqués - Les boutons en superposition sont affichés - Masquer les boutons Développer et Fermer - "Les boutons sont masqués + Masquer les boutons en superposition + Les boutons en superposition sont masqués + Les boutons en superposition sont affichés + Masquer les boutons Développer et Fermer + "Les boutons sont masqués Balayez pour développer ou fermer" - Les boutons Développer et Fermer sont affichés - Masquer les sous-textes - Les sous-textes sont masqués - Les sous-textes sont affichés - Masquer les boutons Avancer et Reculer - Les boutons Avancer et Reculer sont masqués - Les boutons Avancer et Reculer sont affichés - Taille initiale - Taille occupée initialement sur l\'écran, en pixels - La taille en pixels doit être comprise entre %1$s et %2$s - Opacité de l\'overlay - Valeur d\'opacité comprise entre 0 et 100, 0 est transparent - L\'opacité de l\'overlay doit être comprise entre 0 et 100 - - - Activer le dégradé sur l\'écran de chargement - Le fond de l\'écran de chargement sera un dégradé de couleurs - Le fond de l\'écran de chargement sera une couleur unie - Style de l\'écran de lancement - Couleur  - Noir et blanc - Personnaliser la couleur de la barre de progression - La couleur de la barre de progression est personnalisée - La couleur originale de la barre de progression est affichée - Couleur personnalisée de la barre de progression - La couleur de la barre de progression - Couleur d\'accentuation personnalisée de la barre de progression - La couleur d\'accentuation de la barre de progression - Valeur invalide pour la couleur de la barre de progression - - - YouTube ReVanced - YT ReVanced - YT - - - Logo d\'en-tête - Par défaut - Standard - Premium - ReVanced - - ReVanced minimaliste - Personnalisé - - - Contourner les restrictions d\'accès aux images basées sur la région - Utiliser l\'hôte d\'images yt4.ggpht.com - "Utiliser l'hôte d'images d'origine + Les boutons Développer et Fermer sont affichés + Masquer les sous-textes + Les sous-textes sont masqués + Les sous-textes sont affichés + Masquer les boutons Avancer et Reculer + Les boutons Avancer et Reculer sont masqués + Les boutons Avancer et Reculer sont affichés + Taille initiale + Taille occupée initialement sur l\'écran, en pixels + La taille en pixels doit être comprise entre %1$s et %2$s + Opacité de l\'overlay + Valeur d\'opacité comprise entre 0 et 100, 0 est transparent + L\'opacité de l\'overlay doit être comprise entre 0 et 100 + + + Activer le dégradé sur l\'écran de chargement + Le fond de l\'écran de chargement sera un dégradé de couleurs + Le fond de l\'écran de chargement sera une couleur unie + Style de l\'écran de lancement + Couleur  + Noir et blanc + Personnaliser la couleur de la barre de progression + La couleur de la barre de progression est personnalisée + La couleur originale de la barre de progression est affichée + Couleur personnalisée de la barre de progression + La couleur de la barre de progression + Couleur d\'accentuation personnalisée de la barre de progression + La couleur d\'accentuation de la barre de progression + Valeur invalide pour la couleur de la barre de progression + + + YouTube ReVanced + YT ReVanced + YT + + + Logo d\'en-tête + Par défaut + Standard + Premium + ReVanced + + ReVanced minimaliste + Personnalisé + + + Contourner les restrictions d\'accès aux images basées sur la région + Utiliser l\'hôte d\'images yt4.ggpht.com + "Utiliser l'hôte d'images d'origine L'activation de cette option peut corriger les images manquantes qui sont bloquées dans certaines régions" - - - - Onglet Accueil - - Onglet Abonnements - - Onglet Vous - Playlists et recommandations du lecteur - Résultats de recherche - Miniatures originales - DeArrow et miniatures originales - DeArrow et images extraites - Images extraites - DeArrow - "DeArrow fournit des miniatures crowdsourcées pour les vidéos YouTube. Ces miniatures sont souvent plus pertinentes que celles fournies par YouTube. + + + + Onglet Accueil + + Onglet Abonnements + + Onglet Vous + Playlists et recommandations du lecteur + Résultats de recherche + Miniatures originales + DeArrow et miniatures originales + DeArrow et images extraites + Images extraites + DeArrow + "DeArrow fournit des miniatures crowdsourcées pour les vidéos YouTube. Ces miniatures sont souvent plus pertinentes que celles fournies par YouTube. En cas d'activation, seules les URL des vidéos sont envoyées au serveur d'API. Si une miniature DeArrow est indisponible, la miniature originale ou des images extraites la remplacent. Appuyez ici pour en savoir plus sur DeArrow." - Afficher un message toast si l\'API n\'est pas disponible - Message toast affiché si DeArrow n\'est pas disponible - Message toast non affiché si DeArrow n\'est pas disponible - Endpoint d\'API DeArrow - L\'URL de l\'endpoint d\'accès au cache de miniatures DeArrow - Images extraites des vidéos - Ces images sont extraites au début, au milieu et à la fin de chaque vidéo. Elles sont intégrées à YouTube : aucune API externe n\'est utilisée. - Utiliser les images à extraction rapide - Utilisation des images extraites de qualité moyenne. Les miniatures seront chargées plus rapidement, mais il se peut qu\'aucune miniature ne s\'affiche pour les diffusions en direct ou les vidéos non publiées / très anciennes. - Utilisation des images extraites de qualité élevée - Moment de la vidéo où extraire les images - Début de la vidéo - Milieu de la vidéo - Fin de la vidéo - - DeArrow est temporairement indisponible (code de statut : %s) - DeArrow est temporairement indisponible - - - Afficher les annonces ReVanced - Les annonces sont affichées au démarrage - Les annonces ne sont pas affichées au démarrage - Afficher les annonces au lancement de l\'application - Échec de la connexion au fournisseur d\'annonces - Fermer - - - Activer la lecture en boucle - La vidéo sera lue en boucle - La vidéo ne sera pas lue en boucle - - - Afficher le bouton de lecture en boucle - Le bouton est affiché - Le bouton n\'est pas affiché - La lecture en boucle est activée - La lecture en boucle est désactivée - - - Pause lors d\'une interruption audio - La lecture se met en pause lors de la lecture d\'autres sons (navigation, etc.) - Le volume est diminué lorsque d\'autres sons sont lus - - - Falsifier les dimensions de l\'appareil - "Dimensions de l'appareil falsifiées + Afficher un message toast si l\'API n\'est pas disponible + Message toast affiché si DeArrow n\'est pas disponible + Message toast non affiché si DeArrow n\'est pas disponible + Endpoint d\'API DeArrow + L\'URL de l\'endpoint d\'accès au cache de miniatures DeArrow + Images extraites des vidéos + Ces images sont extraites au début, au milieu et à la fin de chaque vidéo. Elles sont intégrées à YouTube : aucune API externe n\'est utilisée. + Utiliser les images à extraction rapide + Utilisation des images extraites de qualité moyenne. Les miniatures seront chargées plus rapidement, mais il se peut qu\'aucune miniature ne s\'affiche pour les diffusions en direct ou les vidéos non publiées / très anciennes. + Utilisation des images extraites de qualité élevée + Moment de la vidéo où extraire les images + Début de la vidéo + Milieu de la vidéo + Fin de la vidéo + + DeArrow est temporairement indisponible (code de statut : %s) + DeArrow est temporairement indisponible + + + Afficher les annonces ReVanced + Les annonces sont affichées au démarrage + Les annonces ne sont pas affichées au démarrage + Afficher les annonces au lancement de l\'application + Échec de la connexion au fournisseur d\'annonces + Fermer + + + Activer la lecture en boucle + La vidéo sera lue en boucle + La vidéo ne sera pas lue en boucle + + + Afficher le bouton de lecture en boucle + Le bouton est affiché + Le bouton n\'est pas affiché + La lecture en boucle est activée + La lecture en boucle est désactivée + + + Pause lors d\'une interruption audio + La lecture se met en pause lors de la lecture d\'autres sons (navigation, etc.) + Le volume est diminué lorsque d\'autres sons sont lus + + + Falsifier les dimensions de l\'appareil + "Dimensions de l'appareil falsifiées Des qualités vidéo supérieures pourraient être déverrouillées, mais la lecture vidéo peut être saccadée, l'autonomie de votre appareil peut être réduite, et il peut y avoir des effets secondaires inconnus" - "Dimensions de l'appareil non falsifiées + "Dimensions de l'appareil non falsifiées Activer cette option peut déverrouiller des qualités vidéo supérieures" - Activer cette option peut engendrer des saccades durant la lecture de vidéos, une dégradation de l\'autonomie de la batterie et des effets secondaires inconnus. - - - Retour haptique - Modifiez les retours haptiques - Désactiver le retour haptique des chapitres - Le retour haptique des chapitres est désactivé - Le retour haptique des chapitres est activé - Désactiver le retour haptique de la recherche précise - Le retour haptique de la recherche précise est désactivé - Le retour haptique de la recherche précise est activé - Désactiver le retour haptique d\'annulation de la recherche - Le retour haptique d\'annulation de la recherche est désactivé - Le retour haptique d\'annulation de la recherche est activé - Désactiver le retour haptique des actions de zoom - Le retour haptique du zoom est désactivé - Le retour haptique du zoom est activé - - - Si vous avez récemment modifié vos informations de connexion, désinstallez et réinstallez MicroG. - - - Contourner les redirections d\'URL - Les redirections d\'URL sont contournées - Les redirections d\'URL ne sont pas contournées - - - Ouvrir les liens dans le navigateur - Les liens sont ouverts dans le navigateur externe - Les liens sont ouverts dans le navigateur intégré à l\'application - - - - Automatique - Mémoriser les changements de qualité vidéo - Les changements de qualité s\'appliquent à toutes les vidéos - Les changements de qualité s\'appliquent uniquement à la vidéo actuelle - Afficher un message toast lors des changements de qualité vidéo - Un message toast est affiché lorsque la qualité vidéo par défaut est modifiée - Aucun message toast n\'est affiché lorsque la qualité vidéo par défaut est modifiée - Qualité vidéo par défaut sur les réseaux Wi-Fi - Qualité vidéo par défaut sur le réseau mobile - Mémoriser les changements de qualité des Shorts - Les changements de qualité s\'appliquent à tous les Shorts - Les changements de qualité s\'appliquent uniquement au Short actuel - Qualité par défaut des Shorts sur les réseaux Wi-Fi - Qualité par défaut des Shorts sur le réseau mobile - mobile - Wi-Fi - Nouvelle qualité %1$s par défaut : %2$s - Nouvelle qualité %1$s des Shorts par défaut : %2$s - - - Afficher un bouton Vitesse - Le bouton Vitesse est affiché. Appuyez longuement pour rétablir la vitesse de lecture par défaut. - Le bouton Vitesse n\'est pas affiché - - - Afficher le bouton de qualité vidéo - Le bouton de qualité vidéo est affiché. Appuyez longuement pour rétablir la qualité par défaut. - Le bouton de qualité vidéo n\'est pas affiché - - - Menu de vitesse de lecture personnalisée - Le menu de vitesse personnalisée est affiché - Le menu de vitesse personnalisée n\'est pas affiché - Restaurer l\'ancien menu de vitesse de lecture - L\'ancien menu de vitesse est affiché - Le menu de vitesse moderne est affiché - Vitesses de lecture personnalisées - Ajouter ou modifier les vitesses de lecture personnalisées - Les vitesses personnalisées doivent être inférieures à %s - Vitesses de lecture personnalisées invalides - Automatique - Vitesse personnalisée d\'accélération sur appui long - Vitesse de lecture comprise entre 0 et 8 - - - Mémoriser les changements de vitesse de lecture - Les changements de vitesse de lecture s\'appliquent à toutes les vidéos - Les changements de vitesse de lecture s\'appliquent uniquement à la vidéo actuelle - Afficher un message toast lors des changements de vitesse de lecture - Un message toast est affiché lorsque la vitesse de lecture par défaut est modifiée - Aucun message toast n\'est affiché lorsque la vitesse de lecture par défaut est modifiée - Vitesse de lecture par défaut - Nouvelle vitesse par défaut : %s - - - Désactiver le HDR dans les vidéos - Le HDR est désactivé dans les vidéos - Le HDR est activé dans les vidéos - Forcer AVC (H.264) - Le codec vidéo est défini de force sur AVC (H.264) - Le codec vidéo est déterminé automatiquement - "Avantages : + Activer cette option peut engendrer des saccades durant la lecture de vidéos, une dégradation de l\'autonomie de la batterie et des effets secondaires inconnus. + + + Retour haptique + Modifiez les retours haptiques + Désactiver le retour haptique des chapitres + Le retour haptique des chapitres est désactivé + Le retour haptique des chapitres est activé + Désactiver le retour haptique de la recherche précise + Le retour haptique de la recherche précise est désactivé + Le retour haptique de la recherche précise est activé + Désactiver le retour haptique d\'annulation de la recherche + Le retour haptique d\'annulation de la recherche est désactivé + Le retour haptique d\'annulation de la recherche est activé + Désactiver le retour haptique des actions de zoom + Le retour haptique du zoom est désactivé + Le retour haptique du zoom est activé + + + Si vous avez récemment modifié vos informations de connexion, désinstallez et réinstallez MicroG. + + + Contourner les redirections d\'URL + Les redirections d\'URL sont contournées + Les redirections d\'URL ne sont pas contournées + + + Ouvrir les liens dans le navigateur + Les liens sont ouverts dans le navigateur externe + Les liens sont ouverts dans le navigateur intégré à l\'application + + + + Automatique + Mémoriser les changements de qualité vidéo + Les changements de qualité s\'appliquent à toutes les vidéos + Les changements de qualité s\'appliquent uniquement à la vidéo actuelle + Afficher un message toast lors des changements de qualité vidéo + Un message toast est affiché lorsque la qualité vidéo par défaut est modifiée + Aucun message toast n\'est affiché lorsque la qualité vidéo par défaut est modifiée + Qualité vidéo par défaut sur les réseaux Wi-Fi + Qualité vidéo par défaut sur le réseau mobile + Mémoriser les changements de qualité des Shorts + Les changements de qualité s\'appliquent à tous les Shorts + Les changements de qualité s\'appliquent uniquement au Short actuel + Qualité par défaut des Shorts sur les réseaux Wi-Fi + Qualité par défaut des Shorts sur le réseau mobile + mobile + Wi-Fi + Nouvelle qualité %1$s par défaut : %2$s + Nouvelle qualité %1$s des Shorts par défaut : %2$s + + + Afficher un bouton Vitesse + Le bouton Vitesse est affiché. Appuyez longuement pour rétablir la vitesse de lecture par défaut. + Le bouton Vitesse n\'est pas affiché + + + Afficher le bouton de qualité vidéo + Le bouton de qualité vidéo est affiché. Appuyez longuement pour rétablir la qualité par défaut. + Le bouton de qualité vidéo n\'est pas affiché + + + Menu de vitesse de lecture personnalisée + Le menu de vitesse personnalisée est affiché + Le menu de vitesse personnalisée n\'est pas affiché + Restaurer l\'ancien menu de vitesse de lecture + L\'ancien menu de vitesse est affiché + Le menu de vitesse moderne est affiché + Vitesses de lecture personnalisées + Ajouter ou modifier les vitesses de lecture personnalisées + Les vitesses personnalisées doivent être inférieures à %s + Vitesses de lecture personnalisées invalides + Automatique + Vitesse personnalisée d\'accélération sur appui long + Vitesse de lecture comprise entre 0 et 8 + + + Mémoriser les changements de vitesse de lecture + Les changements de vitesse de lecture s\'appliquent à toutes les vidéos + Les changements de vitesse de lecture s\'appliquent uniquement à la vidéo actuelle + Afficher un message toast lors des changements de vitesse de lecture + Un message toast est affiché lorsque la vitesse de lecture par défaut est modifiée + Aucun message toast n\'est affiché lorsque la vitesse de lecture par défaut est modifiée + Vitesse de lecture par défaut + Nouvelle vitesse par défaut : %s + + + Désactiver le HDR dans les vidéos + Le HDR est désactivé dans les vidéos + Le HDR est activé dans les vidéos + Forcer AVC (H.264) + Le codec vidéo est défini de force sur AVC (H.264) + Le codec vidéo est déterminé automatiquement + "Avantages : • Peut améliorer l'autonomie de la batterie • Peut restaurer les résolutions vidéo manquantes sur les appareils plus anciens @@ -1670,182 +1669,182 @@ Limitations : • La lecture vidéo utilisera plus de données Internet qu'avec VP9 ou AV1 • Les vidéos HDR n'utiliseront pas AVC • Certains appareils ne peuvent pas forcer l'utilisation d'AVC" - - - Afficher le menu de qualité vidéo avancé - Le menu de qualité vidéo avancé est affiché - Le menu de qualité vidéo avancé n\'est pas affiché - - - Activer Glisser pour rechercher - Glisser pour rechercher est activé - Glisser pour rechercher est désactivé - - - Autoriser Android VR AV1 - "Le codec vidéo est AVC (H.264), VP9 ou AV1 + + + Afficher le menu de qualité vidéo avancé + Le menu de qualité vidéo avancé est affiché + Le menu de qualité vidéo avancé n\'est pas affiché + + + Activer Glisser pour rechercher + Glisser pour rechercher est activé + Glisser pour rechercher est désactivé + + + Autoriser Android VR AV1 + "Le codec vidéo est AVC (H.264), VP9 ou AV1 La lecture peut être saccadée et des images peuvent être perdues" - Le codec vidéo est AVC (H.264) ou VP9 - "L'activation de ce paramètre permet l'utilisation du décodage AV1 logiciel. + Le codec vidéo est AVC (H.264) ou VP9 + "L'activation de ce paramètre permet l'utilisation du décodage AV1 logiciel. La lecture vidéo avec AV1 peut être saccadée et des images peuvent être perdues." - Effets secondaires de la falsification - • Client expérimental, peut cesser de fonctionner à tout moment - • Les vidéos sont susceptibles de s\'arrêter à 1:00, ou de ne pas être disponibles dans certaines régions - • Le menu Piste audio est absent - • Codec vidéo AV1 indisponible - • Le volume stable n\'est pas disponible - • La lecture des vidéos pour enfants peut ne pas fonctionner lorsque vous êtes déconnecté ou en mode navigation privée - - • Forcer la langue audio d\'origine n\'est pas disponible - Afficher dans les Statistiques avancées - Le type de client est affiché dans les Statistiques avancées - Le client est masqué dans les Statistiques avancées - - - - - YT Music ReVanced - Music ReVanced - Music - - - À propos - Annonces - Général - Lecteur - Divers - - - Masquer les annonces vidéo - Les annonces vidéo sont masquées - Les annonces vidéo sont affichées - - - Activer la lecture en boucle permanente - La lecture en boucle permanente est activée - La lecture en boucle permanente est désactivée - - - Masquer le bouton Diffuser - Le bouton Diffuser est masqué - Le bouton Diffuser est affiché - Masquer le bouton Historique - Le bouton Historique est masqué - Le bouton Historique est affiché - Masquer le bouton des notifications - Le bouton des notifications est masqué - Le bouton des notifications est affiché - Masquer le bouton de recherche - Le bouton de recherche est masqué - Le bouton de recherche est affiché - - - Masquer la barre des catégories - La barre des catégories est masquée - La barre des catégories est affichée - - - Changer la couleur du lecteur réduit - La couleur du lecteur réduit correspond à celle du lecteur plein écran - Le lecteur réduit utilise la couleur par défaut - - - Barre de navigation - Masquez ou modifiez les boutons de la barre de navigation - - Masquer \"Accueil\" - Le bouton Accueil est masqué - Le bouton Accueil est affiché - - Masquer \"Samples\" - Le bouton Samples est masqué - Le bouton Samples est affiché - - Masquer \"Explorer\" - Le bouton Explorer est masqué - Le bouton Explorer est affiché - - Masquer \"Bibliothèque\" - Le bouton Bibliothèque est masqué - Le bouton Bibliothèque est affiché - - Masquer \"S\'abonner\" - Le bouton S\'abonner est masqué - Le bouton S\'abonner est affiché - Masquer la barre de navigation - La barre de navigation est masquée - La barre de navigation est affichée - Masquer les libellés des boutons de navigation - Les libellés sont masqués - Les libellés sont affichés - - - Masquer le libellé \"S\'abonner à Music Premium\" - Le libellé est masqué - Le libellé est affiché - - - Masquer le bouton S\'abonner - Le bouton est masqué - Le bouton est affiché - - - - - Bloquer les annonces audio - Les annonces audio sont bloquées - Les annonces audio sont débloquées - - - %s indisponible, des annonces peuvent s\'afficher. Essayez de changer de service de blocage des annonces dans les paramètres. - %s a renvoyé une erreur, des annonces peuvent s\'afficher. Essayez de changer de service de blocage des annonces dans les paramètres. - Bloquer les annonces vidéo intégrées - Désactivé - Proxy Luminous - Proxy PurpleAdBlock - - - Bloquer les annonces vidéo - Les annonces vidéo sont bloquées - Les annonces vidéo ne sont pas bloquées - - - Message supprimé - Afficher les messages supprimés - Ne pas afficher les messages supprimés - Cacher les messages supprimés derrière un spoiler - Afficher les messages supprimés sous forme de texte barré - - - Réclamer automatiquement les points de chaîne - Les points de chaîne sont réclamés automatiquement - Les points de chaîne ne sont pas réclamés automatiquement - - - - Activer le mode débogage de Twitch - Le mode débogage de Twitch est activé (non recommandé) - Le mode débogage de Twitch est désactivé - - - Paramètres ReVanced - À propos - À propos de ReVanced - Blocage des annonces - Paramètres de blocage des annonces - Chat - Paramètres du chat - Divers - Paramètres divers - Paramètres généraux - Autres paramètres - Annonces côté client - Annonces SureStream côté serveur - Journalisation de débogage - Les journaux de débogage sont activés - Les journaux de débogage sont désactivés - - + Effets secondaires de la falsification + • Client expérimental, peut cesser de fonctionner à tout moment + • Les vidéos sont susceptibles de s\'arrêter à 1:00, ou de ne pas être disponibles dans certaines régions + • Le menu Piste audio est absent + • Codec vidéo AV1 indisponible + • Le volume stable n\'est pas disponible + • La lecture des vidéos pour enfants peut ne pas fonctionner lorsque vous êtes déconnecté ou en mode navigation privée + + • Forcer la langue audio d\'origine n\'est pas disponible + Afficher dans les Statistiques avancées + Le type de client est affiché dans les Statistiques avancées + Le client est masqué dans les Statistiques avancées + + + + + YT Music ReVanced + Music ReVanced + Music + + + À propos + Annonces + Général + Lecteur + Divers + + + Masquer les annonces vidéo + Les annonces vidéo sont masquées + Les annonces vidéo sont affichées + + + Activer la lecture en boucle permanente + La lecture en boucle permanente est activée + La lecture en boucle permanente est désactivée + + + Masquer le bouton Diffuser + Le bouton Diffuser est masqué + Le bouton Diffuser est affiché + Masquer le bouton Historique + Le bouton Historique est masqué + Le bouton Historique est affiché + Masquer le bouton des notifications + Le bouton des notifications est masqué + Le bouton des notifications est affiché + Masquer le bouton de recherche + Le bouton de recherche est masqué + Le bouton de recherche est affiché + + + Masquer la barre des catégories + La barre des catégories est masquée + La barre des catégories est affichée + + + Changer la couleur du lecteur réduit + La couleur du lecteur réduit correspond à celle du lecteur plein écran + Le lecteur réduit utilise la couleur par défaut + + + Barre de navigation + Masquez ou modifiez les boutons de la barre de navigation + + Masquer \"Accueil\" + Le bouton Accueil est masqué + Le bouton Accueil est affiché + + Masquer \"Samples\" + Le bouton Samples est masqué + Le bouton Samples est affiché + + Masquer \"Explorer\" + Le bouton Explorer est masqué + Le bouton Explorer est affiché + + Masquer \"Bibliothèque\" + Le bouton Bibliothèque est masqué + Le bouton Bibliothèque est affiché + + Masquer \"S\'abonner\" + Le bouton S\'abonner est masqué + Le bouton S\'abonner est affiché + Masquer la barre de navigation + La barre de navigation est masquée + La barre de navigation est affichée + Masquer les libellés des boutons de navigation + Les libellés sont masqués + Les libellés sont affichés + + + Masquer le libellé \"S\'abonner à Music Premium\" + Le libellé est masqué + Le libellé est affiché + + + Masquer le bouton S\'abonner + Le bouton est masqué + Le bouton est affiché + + + + + Bloquer les annonces audio + Les annonces audio sont bloquées + Les annonces audio sont débloquées + + + %s indisponible, des annonces peuvent s\'afficher. Essayez de changer de service de blocage des annonces dans les paramètres. + %s a renvoyé une erreur, des annonces peuvent s\'afficher. Essayez de changer de service de blocage des annonces dans les paramètres. + Bloquer les annonces vidéo intégrées + Désactivé + Proxy Luminous + Proxy PurpleAdBlock + + + Bloquer les annonces vidéo + Les annonces vidéo sont bloquées + Les annonces vidéo ne sont pas bloquées + + + Message supprimé + Afficher les messages supprimés + Ne pas afficher les messages supprimés + Cacher les messages supprimés derrière un spoiler + Afficher les messages supprimés sous forme de texte barré + + + Réclamer automatiquement les points de chaîne + Les points de chaîne sont réclamés automatiquement + Les points de chaîne ne sont pas réclamés automatiquement + + + + Activer le mode débogage de Twitch + Le mode débogage de Twitch est activé (non recommandé) + Le mode débogage de Twitch est désactivé + + + Paramètres ReVanced + À propos + À propos de ReVanced + Blocage des annonces + Paramètres de blocage des annonces + Chat + Paramètres du chat + Divers + Paramètres divers + Paramètres généraux + Autres paramètres + Annonces côté client + Annonces SureStream côté serveur + Journalisation de débogage + Les journaux de débogage sont activés + Les journaux de débogage sont désactivés + + diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index 23d3d43072..4713c439c1 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -17,1271 +17,1270 @@ "First 'item' text Second \"item\" text" ---> - - - - Ainm an aip - - Saincheaptha - Deilbhín aip - Bunaidh - ReVanced - - ReVanced Íosmhéid - ReVanced scálaithe - - Saincheaptha - - - Theip ar sheiceálacha - Oscailt láithreán gréasáin oifigiúil - Déan neamhaird de - <h5>Ní cosúil gur tusa a rinne paiste ar an aip seo.</h5><br>B’fhéidir nach bhfeidhmeoidh an aip seo i gceart, <b>agus d’fhéadfadh sé a bheith díobhálach nó fiú contúirteach le húsáid</b>< br><br>.Tugann na seiceálacha seo le fios go bhfuil an aip seo patáilte roimh ré nó gur thángthas uirthi ó dhuine eile:<br><br><small>%1$s</small><br> <b>Moltar go láidir duit an aip seo a dhíshuiteáil agus í a phaisteáil leat féin</b> chun a chinntiú go bhfuil tú ag úsáid aip bailíochtaithe agus slán.<p><br>Mura ndéanann tú aird ar an rabhadh seo, ní thaispeánfar é ach faoi dhó. - Paisteáilte ar ghléas eile - Gan a bheith suiteáilte ag ReVanced Manager - Paisteáilte níos mó ná 10 nóiméad ó shin - Paisteáilte %s lá ó shin - Tá dáta tógála APK truaillithe - - - Fógra ReVanced - Níl do stair faire á sábháil.<br><br>Is é is dóichí gur seachfhreastalaí fógraí DNS nó seachfhreastalaí líonra is cúis leis seo.<br><br> Chun é seo a réiteach, déan liosta bán <b>s.youtube.com</b> nó gach seachfhreastalaí DNS a mhúchadh. - Ná taispeáin arís - - - Socruithe - ReVanced - An bhfuil tú cinnte gur mhaith leat dul ar aghaidh? - Sábháil - Athshocraigh - Athshocraigh dath - Dath neamhbhailí - Atosú ag teastáil - Atosaigh an aip chun go mbeidh an t-athrú seo i bhfeidhm. - Atosaigh - Iompórtáil - Cóipeáil - Athshocraigh socruithe ReVanced go réamhshocrú - Iompórtáladh %d socruithe - Theip ar allmhairiú: %s - Cuardaigh socruithe - Ní bhfuarthas aon toradh ar \'%s\' - Bain triail as eochairfhocal eile - Cuardaigh le déanaí - Bain as stair an chuardaigh? - Glan stair chuardaigh - An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? - Leideanna Cuardaigh - "• Tapáil cosán chun nascleanúint a dhéanamh chuige +--> + + + Ainm an aip + + Saincheaptha + Deilbhín aip + Bunaidh + ReVanced + + ReVanced Íosmhéid + ReVanced scálaithe + + Saincheaptha + + + Theip ar sheiceálacha + Oscailt láithreán gréasáin oifigiúil + Déan neamhaird de + <h5>Ní cosúil gur tusa a rinne paiste ar an aip seo.</h5><br>B’fhéidir nach bhfeidhmeoidh an aip seo i gceart, <b>agus d’fhéadfadh sé a bheith díobhálach nó fiú contúirteach le húsáid</b>< br><br>.Tugann na seiceálacha seo le fios go bhfuil an aip seo patáilte roimh ré nó gur thángthas uirthi ó dhuine eile:<br><br><small>%1$s</small><br> <b>Moltar go láidir duit an aip seo a dhíshuiteáil agus í a phaisteáil leat féin</b> chun a chinntiú go bhfuil tú ag úsáid aip bailíochtaithe agus slán.<p><br>Mura ndéanann tú aird ar an rabhadh seo, ní thaispeánfar é ach faoi dhó. + Paisteáilte ar ghléas eile + Gan a bheith suiteáilte ag ReVanced Manager + Paisteáilte níos mó ná 10 nóiméad ó shin + Paisteáilte %s lá ó shin + Tá dáta tógála APK truaillithe + + + Fógra ReVanced + Níl do stair faire á sábháil.<br><br>Is é is dóichí gur seachfhreastalaí fógraí DNS nó seachfhreastalaí líonra is cúis leis seo.<br><br> Chun é seo a réiteach, déan liosta bán <b>s.youtube.com</b> nó gach seachfhreastalaí DNS a mhúchadh. + Ná taispeáin arís + + + Socruithe + ReVanced + An bhfuil tú cinnte gur mhaith leat dul ar aghaidh? + Sábháil + Athshocraigh + Athshocraigh dath + Dath neamhbhailí + Atosú ag teastáil + Atosaigh an aip chun go mbeidh an t-athrú seo i bhfeidhm. + Atosaigh + Iompórtáil + Cóipeáil + Athshocraigh socruithe ReVanced go réamhshocrú + Iompórtáladh %d socruithe + Theip ar allmhairiú: %s + Cuardaigh socruithe + Ní bhfuarthas aon toradh ar \'%s\' + Bain triail as eochairfhocal eile + Cuardaigh le déanaí + Bain as stair an chuardaigh? + Glan stair chuardaigh + An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? + Leideanna Cuardaigh + "• Tapáil cosán chun nascleanúint a dhéanamh chuige • Brúigh socrú ar feadh i bhfad chun nascleanúint a dhéanamh chuige • Brúigh Iontráil chun fiosrúchán cuardaigh a shábháil sa stair • Ní dhéanann an cuardach aon aird ar cháslitreacha ná ar phoncaíocht • Feictear socruithe tuismitheora os cionn socruithe linbh atá díchumasaithe" - Tá stair an chuardaigh folamh - Chun stair an chuardaigh a shábháil, clóscríobh iarratas cuardaigh agus brúigh Iontráil - Taispeáin stair cuardaigh na socruithe - Taispeántar stair cuardaigh na socruithe - Ní thaispeántar stair chuardaigh na socruithe - Taispeáin deilbhíní socruithe ReVanced - Taispeántar deilbhíní socruithe - Ní thaispeántar deilbhíní socraithe - Teanga ReVanced - "D'fhéadfadh aistriúcháin do roinnt teangacha a bheith ar iarraidh nó mí-iomlán. + Tá stair an chuardaigh folamh + Chun stair an chuardaigh a shábháil, clóscríobh iarratas cuardaigh agus brúigh Iontráil + Taispeáin stair cuardaigh na socruithe + Taispeántar stair cuardaigh na socruithe + Ní thaispeántar stair chuardaigh na socruithe + Taispeáin deilbhíní socruithe ReVanced + Taispeántar deilbhíní socruithe + Ní thaispeántar deilbhíní socraithe + Teanga ReVanced + "D'fhéadfadh aistriúcháin do roinnt teangacha a bheith ar iarraidh nó mí-iomlán. Chun teangacha nua a aistriú nó chun na haistriúcháin atá ann cheana a fheabhsú, tabhair cuairt ar translate.revanced.app" - Teanga aip - Iompórtáil / Easpórtáil - Iompórtáil / Easpórtáil socruithe ReVanced - - Tá tú ag baint úsáide as leagan <i>%s</i> ReVanced Patches - Nóta - Is réamh-eisiúint é an leagan seo agus d\'fhéadfadh fadhbanna gan choinne a bheith agat - Naisc oifigiúla - + Tá tú ag baint úsáide as leagan <i>%s</i> ReVanced Patches + Nóta + Is réamh-eisiúint é an leagan seo agus d\'fhéadfadh fadhbanna gan choinne a bheith agat + Naisc oifigiúla + - - - Socruithe GmsCore - Socruithe le haghaidh GmsCore - - Níl MicroG GmsCore suiteáilte. Suiteáil é. - Gníomh riachtanach - "Níl cead ag MicroG GmsCore rith sa chúlra. + + + Socruithe GmsCore + Socruithe le haghaidh GmsCore + + Níl MicroG GmsCore suiteáilte. Suiteáil é. + Gníomh riachtanach + "Níl cead ag MicroG GmsCore rith sa chúlra. Lean an treoir \"Ná maraigh mo aip\" do do ghuthán, agus cuir na treoracha i bhfeidhm ar do shuiteáil MicroG. Is gá seo chun go n-oibreoidh an aip." - Oscail láithreán gréasáin - "Caithfidh tú optúimíochtaí ceallraí MicroG GmsCore a dhíchumasú chun fadhbanna a sheachaint. + Oscail láithreán gréasáin + "Caithfidh tú optúimíochtaí ceallraí MicroG GmsCore a dhíchumasú chun fadhbanna a sheachaint. Ní chuirfidh díghníomhachtú optúimíochtaí ceallraí do MicroG isteach ar úsáid ceallraí ar bhealach diúltach. Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta." - Lean ar aghaidh - - - Sruthanna físe bréige - Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc - Sruthanna físe bréige - Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc - Sruthanna físe bréige - "Déantar sruthanna físe a bhréagnú + Lean ar aghaidh + + + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + "Déantar sruthanna físe a bhréagnú Mura bhfuil tú i d’úsáideoir YouTube Premium, b’fhéidir nach mbeidh an socrú seo ag teastáil" - "Ní dhéantar sruthanna físeáin a bhréagnú + "Ní dhéantar sruthanna físeáin a bhréagnú Seans nach n-oibreoidh an t-athsheinm" - Má mhúchann tú an socrú seo, d\'fhéadfadh saincheisteanna athsheinm a theacht chun cinn. - Cliant réamhshocraithe - - - Fórsaigh teanga bhunaidh na fuaime - Ag úsáid teanga bhunaidh na fuaime - Ag úsáid fuaim réamhshocraithe - - Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio - - - Dífhabhtú - Cumasaigh nó díchumasaigh roghanna dífhabhtú - Dífhabhtú logáil - Tá logaí dífhabhtaithe cumasaithe - Tá logaí dífhabhtaithe díchumasaithe - Rianta cruach logála - Cuimsíonn logaí dífhabhtaithe rian cruach - Ní chuimsíonn logaí dífhabhtaithe rian cruach - Taispeáin tósta ar earráid ReVanced - Taispeántar tósta má tharlaíonn earráid - Ní thaispeántar tósta má tharlaíonn earráid - "Má mhúchtar tóstaí earráide, folaítear gach fógra earráide ReVanced. + Má mhúchann tú an socrú seo, d\'fhéadfadh saincheisteanna athsheinm a theacht chun cinn. + Cliant réamhshocraithe + + + Fórsaigh teanga bhunaidh na fuaime + Ag úsáid teanga bhunaidh na fuaime + Ag úsáid fuaim réamhshocraithe + + Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio + + + Dífhabhtú + Cumasaigh nó díchumasaigh roghanna dífhabhtú + Dífhabhtú logáil + Tá logaí dífhabhtaithe cumasaithe + Tá logaí dífhabhtaithe díchumasaithe + Rianta cruach logála + Cuimsíonn logaí dífhabhtaithe rian cruach + Ní chuimsíonn logaí dífhabhtaithe rian cruach + Taispeáin tósta ar earráid ReVanced + Taispeántar tósta má tharlaíonn earráid + Ní thaispeántar tósta má tharlaíonn earráid + "Má mhúchtar tóstaí earráide, folaítear gach fógra earráide ReVanced. Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne." - Easpórtáil logaí dífhabhtaithe - Cóipeálann sé logaí dífhabhtaithe ReVanced chuig an gearrthaisce - Tá logáil dífhabhtaithe díchumasaithe - Níor aimsíodh aon logaí - Lógaí cóipeáilte - Theip ar logaí a easpórtáil: %s - Glan logaí dífhabhtaithe - Glanann sé gach loga dífhabhtaithe ReVanced stóráilte - Lógaí glanta - Bainisteoir bratacha gnéithe - Bainistigh bratacha gné booléacha - Bratacha gníomhacha (%d) - Bratacha blocáilte (%d) - Cuardaigh bratacha... - Bratacha sábháilte - Bratacha athshocraithe - Bratacha cóipeáilte chuig an ngearrthaisce - Maolán prótacal logála - Cuimsíonn logaí dífhabhtaithe maolán - Ní chuimsíonn logaí dífhabhtaithe maolán proto - "Logálfaidh an socrú seo sonraí breise leagain amach, lena n-áirítear téacs ar an scáileán do chomhpháirteanna UI áirithe. + Easpórtáil logaí dífhabhtaithe + Cóipeálann sé logaí dífhabhtaithe ReVanced chuig an gearrthaisce + Tá logáil dífhabhtaithe díchumasaithe + Níor aimsíodh aon logaí + Lógaí cóipeáilte + Theip ar logaí a easpórtáil: %s + Glan logaí dífhabhtaithe + Glanann sé gach loga dífhabhtaithe ReVanced stóráilte + Lógaí glanta + Bainisteoir bratacha gnéithe + Bainistigh bratacha gné booléacha + Bratacha gníomhacha (%d) + Bratacha blocáilte (%d) + Cuardaigh bratacha... + Bratacha sábháilte + Bratacha athshocraithe + Bratacha cóipeáilte chuig an ngearrthaisce + Maolán prótacal logála + Cuimsíonn logaí dífhabhtaithe maolán + Ní chuimsíonn logaí dífhabhtaithe maolán proto + "Logálfaidh an socrú seo sonraí breise leagain amach, lena n-áirítear téacs ar an scáileán do chomhpháirteanna UI áirithe. Is féidir leis seo cabhrú le comhpháirteanna a aithint agus scagairí saincheaptha á gcruthú. Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shampla do sheoladh IP." - - - Glan na naisc roinnte - Baintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte - Ní bhaintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte - Athraigh na naisc comhroinnte go youtube.com - Úsáideann naisc chomhroinnte youtube.com - Úsáideann naisc chomhroinnte music.youtube.com - - - Scagaire saincheaptha - Folaigh comhpháirteanna ag baint úsáide as scagairí saincheaptha - Cumasaigh scagaire saincheaptha - Tá scagaire saincheaptha cumasaithe - Tá scagaire saincheaptha míchumasaithe - Scagaire saincheaptha - - Liosta de na teaghráin tógálaí cosáin chomhpháirte le scagadh scartha le líne nua - Scagaire saincheaptha neamhbhailí: %s - - - - - Maidir - Fógraí - Mionsamhlacha malartacha - Fotha - Ginearálta - Seinnteoir - Shorts - Barra Cuardaigh - Rialuithe Svaidhpeála - Return YouTube Dislike - Ilchineálach - Físeán - Athchóirigh sean-roghchláir socruithe - Taispeántar sean-roghchláir socruithe - Ní thaispeántar sean-roghchláir socruithe - - - Díchumasaigh seinnte Cúlra Shorts - Tá seinm chúlra Shorts díchumasaithe - Tá seinm chúlra Shorts cumasaithe - - - Folaigh cártaí albam - Tá cártaí albam i bhfolach - Taispeántar cártaí albam - Folaigh cártaí ealaíontóra - Tá cártaí ealaíontóirí i bhfolach - Taispeántar cártaí ealaíonta - Folaigh seilf sceallóga - Tá seilf scagairí i bhfolach - Taispeántar seilf scagairí - Folaigh postálacha pobail - Tá postálacha pobail i bhfolach - Taispeántar postálacha pobail - Folaigh meirgí dlúth - Tá meirgí dlúth i bhfolach - Taispeántar meirgí dlúth - Folaigh cárta inleathnaithe - Tá cárta insínte faoi fhíseáin i bhfolach - Taispeántar cárta inleathnaithe faoi fhíseáin - Folaigh an cnaipe micreafón ar snámh - Cnaipe micreafóin ar snámh sa chuardach i bhfolach - Taispeántar cnaipe micreafóin ar snámh sa chuardach - Folaigh seilfeanna cothrománacha - "Tá seilfeanna cothrománacha i bhfolach, amhail: + + + Glan na naisc roinnte + Baintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte + Ní bhaintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte + Athraigh na naisc comhroinnte go youtube.com + Úsáideann naisc chomhroinnte youtube.com + Úsáideann naisc chomhroinnte music.youtube.com + + + Scagaire saincheaptha + Folaigh comhpháirteanna ag baint úsáide as scagairí saincheaptha + Cumasaigh scagaire saincheaptha + Tá scagaire saincheaptha cumasaithe + Tá scagaire saincheaptha míchumasaithe + Scagaire saincheaptha + + Liosta de na teaghráin tógálaí cosáin chomhpháirte le scagadh scartha le líne nua + Scagaire saincheaptha neamhbhailí: %s + + + + + Maidir + Fógraí + Mionsamhlacha malartacha + Fotha + Ginearálta + Seinnteoir + Shorts + Barra Cuardaigh + Rialuithe Svaidhpeála + Return YouTube Dislike + Ilchineálach + Físeán + Athchóirigh sean-roghchláir socruithe + Taispeántar sean-roghchláir socruithe + Ní thaispeántar sean-roghchláir socruithe + + + Díchumasaigh seinnte Cúlra Shorts + Tá seinm chúlra Shorts díchumasaithe + Tá seinm chúlra Shorts cumasaithe + + + Folaigh cártaí albam + Tá cártaí albam i bhfolach + Taispeántar cártaí albam + Folaigh cártaí ealaíontóra + Tá cártaí ealaíontóirí i bhfolach + Taispeántar cártaí ealaíonta + Folaigh seilf sceallóga + Tá seilf scagairí i bhfolach + Taispeántar seilf scagairí + Folaigh postálacha pobail + Tá postálacha pobail i bhfolach + Taispeántar postálacha pobail + Folaigh meirgí dlúth + Tá meirgí dlúth i bhfolach + Taispeántar meirgí dlúth + Folaigh cárta inleathnaithe + Tá cárta insínte faoi fhíseáin i bhfolach + Taispeántar cárta inleathnaithe faoi fhíseáin + Folaigh an cnaipe micreafón ar snámh + Cnaipe micreafóin ar snámh sa chuardach i bhfolach + Taispeántar cnaipe micreafóin ar snámh sa chuardach + Folaigh seilfeanna cothrománacha + "Tá seilfeanna cothrománacha i bhfolach, amhail: • Nuacht is déanaí • Lean ar aghaidh ag féachaint • Déan iniúchadh ar níos mó cainéal • Is ábhartha • Siopadóireacht • Féach arís air" - Taispeántar seilfeanna cothrománacha - Folaigh seilf íomhá - Tá seilf íomhá i dtorthaí cuardaigh i bhfolach - Taispeántar seilf íomhánna i dtorthaí cuardaigh - Folaigh na poist is déanaí - Tá na poist is déanaí i bhfolach - Taispeántar na poist is déanaí - Folaigh seinmliostaí meascán - Tá seinmliostaí measctha i bhfolach - Taispeántar seinmliostaí measctha - Folaigh rannóg scannán - Tá rannóg na scannán i bhfolach - Taispeántar rannóg na scannán - - Folaigh cnaipe \'Cuir in iúl dom\' - Cnaipe \'Cuir in iúl dom\' i bhfolach - Cnaipe \'Cuir in iúl dom\' taispeánta - Folaigh na heilimintí inseinnte - Tá na heilimintí inseinnte i bhfolach - Taispeántar na heilimintí inseinnte - - Folaigh an cnaipe \'Taispeáin níos mó\' - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh i bhfolach - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh thaispeánta - Folaigh suirbhéanna - Tá suirbhéanna i bhfolach - Taispeántar suirbhéanna - Folaigh an seilf ticéad - Tá an seilf ticéad i bhfolach - Taispeántar seilf ticéad - - Folaigh lipéid mholtaí físeáin - Tá lipéid \'D\'fhéach daoine freisin ar\' agus \'B\'fhéidir gur mhaith leat freisin\' sna torthaí cuardaigh i bhfolach - Taispeántar lipéid ‘Daoine a d’fhéach freisin’ agus ‘B’fhéidir gur mhaith leat freisin’ i dtorthaí cuardaigh - Folaigh spásaire amhairc - Tá spásaire amhairc i bhfolach - Taispeántar spásaire amhairc - - Folaigh YouTube Doodles - Tá beochan YouTube Doodles ar an lógó i bhfolach - Taispeántar beochan YouTube Doodles ar an lógó - "Taispeántar Doodles ó YouTube cúpla lá gach bliain. + Folaigh an cnaipe \'Taispeáin níos mó\' + Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh i bhfolach + Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh thaispeánta + Folaigh suirbhéanna + Tá suirbhéanna i bhfolach + Taispeántar suirbhéanna + Folaigh an seilf ticéad + Tá an seilf ticéad i bhfolach + Taispeántar seilf ticéad + + Folaigh lipéid mholtaí físeáin + Tá lipéid \'D\'fhéach daoine freisin ar\' agus \'B\'fhéidir gur mhaith leat freisin\' sna torthaí cuardaigh i bhfolach + Taispeántar lipéid ‘Daoine a d’fhéach freisin’ agus ‘B’fhéidir gur mhaith leat freisin’ i dtorthaí cuardaigh + Folaigh spásaire amhairc + Tá spásaire amhairc i bhfolach + Taispeántar spásaire amhairc + + Folaigh YouTube Doodles + Tá beochan YouTube Doodles ar an lógó i bhfolach + Taispeántar beochan YouTube Doodles ar an lógó + "Taispeántar Doodles ó YouTube cúpla lá gach bliain. Má tá Doodle á thaispeáint faoi láthair i do réigiún agus má tá an tsuíomh seo a chumasc, ansin cuirfear an barra scagaire faoin bharra cuardaigh i bhfolach freisin." - Folaigh barra cainéal - Tá an barra Cainéal i bhfolach - Taispeántar barra an chainéil - Folaigh comhartha uisce cainéal - Tá comhartha uisce i bhfolach - Taispeántar comhartha uisce - Folaigh bosca slua-mhaoiniú - Tá bosca slua-mhaoiniú i bhfolach - Taispeántar bosca slua-mhaoiniú - Folaigh boscaí éigeandála - Tá bosca éigeandála i bhfolach - Taispeántar boscaí éigeandála - Folaigh painéil faisnéise - Tá painéil faisnéise i bhfolach - Taispeántar painéil faisnéise - - Folaigh cnaipe Ballraíochta - Tá an cnaipe Glac páirt i bhfolach - Taispeántar an cnaipe Glac páirt - Folaigh painéil leighis - Tá painéil leighis i bhfolach - Taispeántar painéil leighis - Folaigh gníomhartha tapa - Tá gníomhartha tapa sa scáileán iomlán i bhfolach - Taispeántar gníomhartha tapa i lánscáileán - Folaigh físeáin ghaolmhara - Tá físeáin ghaolmhara i ngníomhartha tapa i bhfolach - Taispeántar físeáin ghaolmhara i ngníomhartha tapa - Folaigh treoirlínte síntiúsóirí - Tá treoirlínte pobail síntiúsóirí i bhfolach - Taispeántar treoirlínte pobail do shíntiúsóirí - Folaigh imoibrithe uainithe - Tá imoibrithe uainithe i bhfolach - Taispeántar imoibrithe uainithe - Folaigh \'Achoimre físeáin arna giniúint ag AI\' - Tá an chuid achoimre físe IS-ghinte i bhfolach - Taispeántar an chuid achoimre físe a ghintear ag AI - Folaigh Iarr - Tá an rannán Iarratas i bhfolach - Taispeántar an rannán Iarratas - Folaigh Tréithe - Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach - Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear - Folaigh Caibidlí - Tá an chuid Caibidil i bhfolach - Taispeántar alt na gcaibidlí - Folaigh \'Conas a rinneadh an t-ábhar seo\' - Tá an chuid Conas a rinneadh an t-ábhar seo i bhfolach - Taispeántar an chuid Conas a rinneadh an t-ábhar seo - Folaigh pointí Hype - Tá pointí Hype i bhfolach - Taispeántar pointí Hype - Folaigh \'Déan iniúchadh ar an bpodchraoladh\' - Tá an chuid Déan iniúchadh ar an bpodchraoladh i bhfolach - Taispeántar an chuid Déan iniúchadh ar an bpodchraoladh - Folaigh naisc le feiceáil - Tá an chuid nasc le feiceáil i bhfolach - Taispeántar an chuid nasc le feiceáil - Folaigh físeáin le feiceáil - Tá an chuid físeán le feiceáil i bhfolach - Taispeántar an chuid físeán le feiceáil - Folaigh cártaí eolais - Tá an chuid cártaí faisnéise i bhfolach - Taispeántar rannán cártaí faisnéise - Folaigh \'Príomhchoincheapa\' - Tá an chuid Príomhchoincheapa i bhfolach - Taispeántar an chuid coincheapa lárnacha - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Folaigh Tras-scríbhinn - Tá alt an tras-scríbhinn i bhfolach - Taispeántar alt an tras-scríbhinn - Cur síos físeán - Folaigh nó taispeáin comhpháirteanna cur síos físe - Barra scagaire - Folaigh nó taispeáin an barra scagaire i bhfothaí, físeáin ghaolmhara, torthaí cuardaigh, agus stair féachana - Folaigh i bhfothaí - I bhfolach i bhfothaí - Taispeántar i bhfothaí - Folaigh i bhfíseáin gaolmhara - I bhfolach i bhfíseáin ghaolmhara - Taispeántar i bhfíseáin ghaolmhara - Folaigh i dtorthaí cuardaigh - Folaigh i dtorthaí cuardaigh - Taispeántar i dtorthaí cuardaigh - Folaigh i stair faire - I bhfolach i stair féachana - Taispeántar i stair faire - Leathanach cainéil - Folaigh nó taispeáin comhpháirteanna leathanach cainéil - - Folaigh cnaipe an Phobail - Tá cnaipe an Phobail i bhfolach - Taispeántar cnaipe an Phobail - - Folaigh seilf \'Duitse\' - Tá seilf \'Maidir Leat\' i bhfolach - Tá seilf \'Maidir Leat\' le feiceáil - - Folaigh cnaipe Glac páirt - Tá cnaipe Glac páirt i bhfolach - Taispeántar cnaipe Glac páirt - Folaigh réamhamharc naisc - Tá réamhamharc naisc i bhfolach - Taispeántar réamhamharc naisc - Folaigh seilf na mball - Tá seilf na mball i bhfolach - Taispeántar seilf na gcomhaltaí - - Folaigh cnaipe an tSiopa - Tá cnaipe an tSiopa i bhfolach - Taispeántar cnaipe an tSiopa - - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Tráchtanna - Folaigh nó taispeáin comhpháirteanna na rannóige tráchtanna - Folaigh achoimre comhrá IS - Tá achoimre comhrá IS i bhfolach - Taispeántar achoimre ar chomhrá AI - Folaigh achoimre ar thráchtanna AI - Tá achoimre tráchtanna IS i bhfolach - Taispeántar achoimre ar thráchtanna IS - Folaigh treoirlínte an chainéil - Tá treoirlínte an chainéil i bhfolach - Taispeántar treoirlínte an chainéil - Folaigh ceanntásc \'Tuairimí ag baill \' - Tá ceanntásc na dtuairimí ó chomhaltaí i bhfolach - Taispeántar ceanntásc na dtuairimí ó chomhaltaí - Folaigh roinn tuairimí - Tá an chuid tuairimí i bhfolach - Taispeántar an chuid tuairimí - Folaigh treoirlínte an chomhphobail - Tá treoirlínte an phobail i bhfolach - Taispeántar treoirlínte an phobail - Folaigh an cnaipe \'Cruthaigh Short\' - Tá cnaipe Cruthaigh gearrscéal i bhfolach - Taispeántar cnaipe Cruthaigh gearrscéal - Folaigh cnaipí Emoji agus Stampa Ama - Tá cnaipí Emoji agus Stampa Ama i bhfolach - Taispeántar cnaipí Emoji agus Stampa Ama - Folaigh trácht réamhamharc - Tá trácht réamhamhar i bhfolach - Taispeántar trácht réamhamharc - Folaigh cnaipe Buíochas - Tá cnaipe buíochas i bhfolach - Taispeántar cnaipe buíochas - Folaigh líon radharcanna - Tá líon radharcanna i bhfolach sa fhotha agus sna torthaí cuardaigh - Taispeántar líon radharcanna sa fhotha agus sna torthaí cuardaigh - - "Teorainneacha: + Folaigh cnaipe Ballraíochta + Tá an cnaipe Glac páirt i bhfolach + Taispeántar an cnaipe Glac páirt + Folaigh painéil leighis + Tá painéil leighis i bhfolach + Taispeántar painéil leighis + Folaigh gníomhartha tapa + Tá gníomhartha tapa sa scáileán iomlán i bhfolach + Taispeántar gníomhartha tapa i lánscáileán + Folaigh físeáin ghaolmhara + Tá físeáin ghaolmhara i ngníomhartha tapa i bhfolach + Taispeántar físeáin ghaolmhara i ngníomhartha tapa + Folaigh treoirlínte síntiúsóirí + Tá treoirlínte pobail síntiúsóirí i bhfolach + Taispeántar treoirlínte pobail do shíntiúsóirí + Folaigh imoibrithe uainithe + Tá imoibrithe uainithe i bhfolach + Taispeántar imoibrithe uainithe + Folaigh \'Achoimre físeáin arna giniúint ag AI\' + Tá an chuid achoimre físe IS-ghinte i bhfolach + Taispeántar an chuid achoimre físe a ghintear ag AI + Folaigh Iarr + Tá an rannán Iarratas i bhfolach + Taispeántar an rannán Iarratas + Folaigh Tréithe + Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach + Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear + Folaigh Caibidlí + Tá an chuid Caibidil i bhfolach + Taispeántar alt na gcaibidlí + Folaigh \'Conas a rinneadh an t-ábhar seo\' + Tá an chuid Conas a rinneadh an t-ábhar seo i bhfolach + Taispeántar an chuid Conas a rinneadh an t-ábhar seo + Folaigh pointí Hype + Tá pointí Hype i bhfolach + Taispeántar pointí Hype + Folaigh \'Déan iniúchadh ar an bpodchraoladh\' + Tá an chuid Déan iniúchadh ar an bpodchraoladh i bhfolach + Taispeántar an chuid Déan iniúchadh ar an bpodchraoladh + Folaigh naisc le feiceáil + Tá an chuid nasc le feiceáil i bhfolach + Taispeántar an chuid nasc le feiceáil + Folaigh físeáin le feiceáil + Tá an chuid físeán le feiceáil i bhfolach + Taispeántar an chuid físeán le feiceáil + Folaigh cártaí eolais + Tá an chuid cártaí faisnéise i bhfolach + Taispeántar rannán cártaí faisnéise + Folaigh \'Príomhchoincheapa\' + Tá an chuid Príomhchoincheapa i bhfolach + Taispeántar an chuid coincheapa lárnacha + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Folaigh Tras-scríbhinn + Tá alt an tras-scríbhinn i bhfolach + Taispeántar alt an tras-scríbhinn + Cur síos físeán + Folaigh nó taispeáin comhpháirteanna cur síos físe + Barra scagaire + Folaigh nó taispeáin an barra scagaire i bhfothaí, físeáin ghaolmhara, torthaí cuardaigh, agus stair féachana + Folaigh i bhfothaí + I bhfolach i bhfothaí + Taispeántar i bhfothaí + Folaigh i bhfíseáin gaolmhara + I bhfolach i bhfíseáin ghaolmhara + Taispeántar i bhfíseáin ghaolmhara + Folaigh i dtorthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeántar i dtorthaí cuardaigh + Folaigh i stair faire + I bhfolach i stair féachana + Taispeántar i stair faire + Leathanach cainéil + Folaigh nó taispeáin comhpháirteanna leathanach cainéil + + Folaigh cnaipe an Phobail + Tá cnaipe an Phobail i bhfolach + Taispeántar cnaipe an Phobail + + Folaigh seilf \'Duitse\' + Tá seilf \'Maidir Leat\' i bhfolach + Tá seilf \'Maidir Leat\' le feiceáil + + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt + Folaigh réamhamharc naisc + Tá réamhamharc naisc i bhfolach + Taispeántar réamhamharc naisc + Folaigh seilf na mball + Tá seilf na mball i bhfolach + Taispeántar seilf na gcomhaltaí + + Folaigh cnaipe an tSiopa + Tá cnaipe an tSiopa i bhfolach + Taispeántar cnaipe an tSiopa + + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Tráchtanna + Folaigh nó taispeáin comhpháirteanna na rannóige tráchtanna + Folaigh achoimre comhrá IS + Tá achoimre comhrá IS i bhfolach + Taispeántar achoimre ar chomhrá AI + Folaigh achoimre ar thráchtanna AI + Tá achoimre tráchtanna IS i bhfolach + Taispeántar achoimre ar thráchtanna IS + Folaigh treoirlínte an chainéil + Tá treoirlínte an chainéil i bhfolach + Taispeántar treoirlínte an chainéil + Folaigh ceanntásc \'Tuairimí ag baill \' + Tá ceanntásc na dtuairimí ó chomhaltaí i bhfolach + Taispeántar ceanntásc na dtuairimí ó chomhaltaí + Folaigh roinn tuairimí + Tá an chuid tuairimí i bhfolach + Taispeántar an chuid tuairimí + Folaigh treoirlínte an chomhphobail + Tá treoirlínte an phobail i bhfolach + Taispeántar treoirlínte an phobail + Folaigh an cnaipe \'Cruthaigh Short\' + Tá cnaipe Cruthaigh gearrscéal i bhfolach + Taispeántar cnaipe Cruthaigh gearrscéal + Folaigh cnaipí Emoji agus Stampa Ama + Tá cnaipí Emoji agus Stampa Ama i bhfolach + Taispeántar cnaipí Emoji agus Stampa Ama + Folaigh trácht réamhamharc + Tá trácht réamhamhar i bhfolach + Taispeántar trácht réamhamharc + Folaigh cnaipe Buíochas + Tá cnaipe buíochas i bhfolach + Taispeántar cnaipe buíochas + Folaigh líon radharcanna + Tá líon radharcanna i bhfolach sa fhotha agus sna torthaí cuardaigh + Taispeántar líon radharcanna sa fhotha agus sna torthaí cuardaigh + + "Teorainneacha: • Is féidir le seilfeanna Shorts, leathanaigh cainéil, agus torthaí cuardaigh líon na radharcanna a thaispeáint fós • Ní oibríonn an ghné seo le fachtóir foirme feithicleach" - Folaigh am uaslódála - Tá am uaslódála folaithe i bhfotha agus i dtorthaí cuardaigh - Tá am uaslódála le feiceáil i bhfotha agus i dtorthaí cuardaigh - - "Teorainneacha: + Folaigh am uaslódála + Tá am uaslódála folaithe i bhfotha agus i dtorthaí cuardaigh + Tá am uaslódála le feiceáil i bhfotha agus i dtorthaí cuardaigh + + "Teorainneacha: • Is féidir le seilfeanna Shorts, leathanaigh chainéal, agus torthaí cuardaigh fós amanna uaslódála a thaispeáint • Ní oibríonn an ghné seo le fachtóir foirme feithicleach" - Folaigh ábhair eochairfhocal - Folaigh físeáin chuardaigh agus fotha ag baint úsáide as scagairí eochairfhocail - Folaigh físeáin bhaile de réir eochair - Déantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail - Ní dhéantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail - Folaigh torthaí cuardaigh de réir eochairfhocail - Déantar torthaí cuardaigh a scagadh de réir eochairfhocail - Ní dhéantar torthaí cuardaigh a scagadh de réir eochairfhocail - Folaigh físeáin síntiúis de réir eochairfhocail - Déantar físeáin sa chluaisín síntiús a scagadh de réir eochairfhocail - Ní dhéantar físeáin sa chluaisín Síntiúis a scagadh de réir eochairfhocail - Eochairfhocail le cur i bhfolach - - "Focail agus frásaí le cur i bhfolach, ar leithligh le líne nua + "Focail agus frásaí le cur i bhfolach, ar leithligh le líne nua Is féidir le focail a bheith ina ainmneacha cainéil nó aon fhocal a thaispeántar i dteidil físeán Ní mór focail le litreacha móra sa lár a chur isteach leis an gcású (ie: iPhone, TikTok, LeBlanc)" - Maidir le scagadh eochairfhocal - "Baile/Síntiúis/Déantar torthaí cuardaigh a scagadh chun ábhar a mheaitseálann frásaí eochairfhocail a cheilt + Maidir le scagadh eochairfhocal + "Baile/Síntiúis/Déantar torthaí cuardaigh a scagadh chun ábhar a mheaitseálann frásaí eochairfhocail a cheilt Teorainneacha • Ní féidir Shorts a chur i bhfolach de réir ainm cainéil • Ní fhéadfar cuid de chomhpháirteanna UI a chur i bhfolach • D'fhéadfadh gan aon torthaí a thaispeáint má chuirtear cuardach ar fhocal eochair" - Meaitseáil focail iomlána - - Má bhaineann tú eochairfhocal/frása le comharthaí athfhriotail dhúbailte, cuirfear cosc ​​ar mheaitseáil pháirteach de theidil físeáin agus ainmneacha cainéal<br><br>Mar shampla,<br><b>\"ai\"</b> ceilteoidh sé an físeán: <b>Conas a oibríonn AI?</b><br>ach ní cheiltfidh sé: <b>Cad is brí le hainm féinig?</b> - - Ní féidir eochairfhocal a úsáid: %s - Cuir luachana leis chun an eochairfhocal a úsáid: %s - Tá dearbhuithe contrártha ag eochairfhocal: %s - Eochairfhocal ró-ghearr, teastaíonn luachana: %s - Folaigh eochairfhocal gach físeán: %s - - - Folaigh seilf siopa an chruthaitheora - Seilf siopa an chruthaitheora faoin imreoir físeáin i bhfolach - Taispeántar seilf siopa na gcruthaitheoirí faoin seinnteoir físeáin - Folaigh brat bhranda siopa scáileáin deiridh - Meirge siopa scáileáin deiridh i bhfolach - Taispeántar meirge siopa scáileáin deiridh - Folaigh fógraí lánscáileáin - "Tá fógraí lána scáileáin i bhfolach + Meaitseáil focail iomlána + + Má bhaineann tú eochairfhocal/frása le comharthaí athfhriotail dhúbailte, cuirfear cosc ​​ar mheaitseáil pháirteach de theidil físeáin agus ainmneacha cainéal<br><br>Mar shampla,<br><b>\"ai\"</b> ceilteoidh sé an físeán: <b>Conas a oibríonn AI?</b><br>ach ní cheiltfidh sé: <b>Cad is brí le hainm féinig?</b> + + Ní féidir eochairfhocal a úsáid: %s + Cuir luachana leis chun an eochairfhocal a úsáid: %s + Tá dearbhuithe contrártha ag eochairfhocal: %s + Eochairfhocal ró-ghearr, teastaíonn luachana: %s + Folaigh eochairfhocal gach físeán: %s + + + Folaigh seilf siopa an chruthaitheora + Seilf siopa an chruthaitheora faoin imreoir físeáin i bhfolach + Taispeántar seilf siopa na gcruthaitheoirí faoin seinnteoir físeáin + Folaigh brat bhranda siopa scáileáin deiridh + Meirge siopa scáileáin deiridh i bhfolach + Taispeántar meirge siopa scáileáin deiridh + Folaigh fógraí lánscáileáin + "Tá fógraí lána scáileáin i bhfolach Níl an ghné seo ar fáil ach do ghléasanna níos sine" - Taispeántar fógraí lánscáileáin - - Ní oibríonn folaigh fógraí lánscáileáin ach le gléasanna níos sine - Folaigh fógraí ginearálta - Tá fógraí ginearálta i bhfolach - Taispeántar fógraí ginearálta - Folaigh meirgí marsantais - Tá meirgí marsantais i bhfolach - Taispeántar meirgí marsantais - Folaigh lipéad chun cinn íoctha - Tá an lipéad promóisin íoctha i bhfolach - Taispeántar lipéad an chur chun cinn íoctha - Folaigh cártaí féin-urraithe - Tá cártaí féin-urraithe i bhfolach - Taispeántar cártaí féin-urraithe - Folaigh naisc siopadóireachta - Naisc siopadóireachta i gcur síos físeáin i bhfolach - Tá naisc siopadóireachta i gcur síos an fhíseáin ar taispeáint - Folaigh meirge táirgí - Tá an meirge féach táirgí i bhfolach sa fhorleagan físe - Taispeántar meirge féach táirgí i bhforleagan físe - Folaigh torthaí cuardaigh gréasáin - Tá torthaí cuardaigh gréasáin i bhfolach - Taispeántar torthaí cuardaigh gréasáin - - - Folaigh ardú céime YouTube Premium - Tá cur chun cinn YouTube Premium faoi seinnteoir físe i bhfolach - Taispeántar ardú céime YouTube Premium faoin seinnteoir físe - - - Folaigh fógraí físe - Tá fógraí físe i bhfolach - Taispeántar fógraí físe - - - URL cóipeáilte chuig gearr - URL le stampa ama cóipeáilte - Taispeáin an cnaipe cóipeála URL an fhíseáin - Taispeántar cnaipe Cóipeáil URL físeáin. Tapáil chun URL an fhíseáin a chóipeáil. Tapáil agus coinnigh síos chun cóipeála leis an stampa ama - Ní thaispeántar cnaipe Cóipeáil URL físeáin - Taispeáin cnaipe URL stampa ama cóipeáil - Taispeántar cnaipe Cóipeáil URL stampa ama. Tapáil chun URL físeáin a chóipeáil le stampa ama. Tapáil agus coinnigh chun cóipe a dhéanamh gan stampa ama - Ní thaispeántar cnaipe Cóipeáil URL stampa ama - - - Bain dialóg rogha féachana - Bainfear dialóg - Taispeánfar dialóg - Ní sheachnaíonn sé seo an srian aoise. Ní ghlacann sé leis go huathoibríoch. - - - Díchumasaigh an aníos ‘Sínigh Isteach sa Teilifís’ - Tá preab aníos sínithe isteach sa teilifís díchumasaithe - Tá preab aníos sínithe isteach sa teilifís cumasaithe - - - Díchumasaigh scipeáil caibidle le sconna dúbailte - Ní féidir léim go dtí an chéad chaibidil eile/roimhe seo a spreagadh le tapáil faoi dhó - Is féidir le sconna dúbailte scipeáil chuig an gcéad chaibidil eile/roimhe seo a spreagadh ó am go chéile - - - Íosluchtaigh seachtracha - Socruithe chun íoslódálaí seachtrach a úsáid - Taispeáin cnaipe íoslódála seachtrach - Taispeántar cnaipe íoslódála sa seinnteoir - Ní thaispeántar cnaipe íoslódála sa seinnteoir - - Sáraigh an cnaipe Íosluchtaigh gníomh - Osclaíonn an cnaipe íoslódála do íoslódálaí seachtrach - Osclaíonn an cnaipe íoslódála an íoslódálaí dúchasach san aip - Ainm pacáiste íoslódálaí - Ainm an phacáiste de d\'aip íoslódálaí seachtrach suiteáilte - Iontráil ainm an phacáiste - Eile - Níl an aip suiteáilte - Níl %s suiteáilte. Suiteáil é le do thoil. - "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" - Ní féidir ainm an phacáiste a fhágáil folamh - - - Díchumasaigh comhartha cuardaigh beacht - Tá gotha ​​cuardaigh chruinn díchumasaithe - Tá gotha ​​cuardaigh chruinn cumasaithe - - - Cumasaigh tapáil chun cuardach a dhéanamh - Tá tapáil chun cuardach cumasaithe - Tá tapáil chun cuardach a dhíchumasaithe - - - Cumasaigh gotha ​​gile - "Tá swipeáil gile lánscáileáin cumasaithe + Taispeántar fógraí lánscáileáin + + Ní oibríonn folaigh fógraí lánscáileáin ach le gléasanna níos sine + Folaigh fógraí ginearálta + Tá fógraí ginearálta i bhfolach + Taispeántar fógraí ginearálta + Folaigh meirgí marsantais + Tá meirgí marsantais i bhfolach + Taispeántar meirgí marsantais + Folaigh lipéad chun cinn íoctha + Tá an lipéad promóisin íoctha i bhfolach + Taispeántar lipéad an chur chun cinn íoctha + Folaigh cártaí féin-urraithe + Tá cártaí féin-urraithe i bhfolach + Taispeántar cártaí féin-urraithe + Folaigh naisc siopadóireachta + Naisc siopadóireachta i gcur síos físeáin i bhfolach + Tá naisc siopadóireachta i gcur síos an fhíseáin ar taispeáint + Folaigh meirge táirgí + Tá an meirge féach táirgí i bhfolach sa fhorleagan físe + Taispeántar meirge féach táirgí i bhforleagan físe + Folaigh torthaí cuardaigh gréasáin + Tá torthaí cuardaigh gréasáin i bhfolach + Taispeántar torthaí cuardaigh gréasáin + + + Folaigh ardú céime YouTube Premium + Tá cur chun cinn YouTube Premium faoi seinnteoir físe i bhfolach + Taispeántar ardú céime YouTube Premium faoin seinnteoir físe + + + Folaigh fógraí físe + Tá fógraí físe i bhfolach + Taispeántar fógraí físe + + + URL cóipeáilte chuig gearr + URL le stampa ama cóipeáilte + Taispeáin an cnaipe cóipeála URL an fhíseáin + Taispeántar cnaipe Cóipeáil URL físeáin. Tapáil chun URL an fhíseáin a chóipeáil. Tapáil agus coinnigh síos chun cóipeála leis an stampa ama + Ní thaispeántar cnaipe Cóipeáil URL físeáin + Taispeáin cnaipe URL stampa ama cóipeáil + Taispeántar cnaipe Cóipeáil URL stampa ama. Tapáil chun URL físeáin a chóipeáil le stampa ama. Tapáil agus coinnigh chun cóipe a dhéanamh gan stampa ama + Ní thaispeántar cnaipe Cóipeáil URL stampa ama + + + Bain dialóg rogha féachana + Bainfear dialóg + Taispeánfar dialóg + Ní sheachnaíonn sé seo an srian aoise. Ní ghlacann sé leis go huathoibríoch. + + + Díchumasaigh an aníos ‘Sínigh Isteach sa Teilifís’ + Tá preab aníos sínithe isteach sa teilifís díchumasaithe + Tá preab aníos sínithe isteach sa teilifís cumasaithe + + + Díchumasaigh scipeáil caibidle le sconna dúbailte + Ní féidir léim go dtí an chéad chaibidil eile/roimhe seo a spreagadh le tapáil faoi dhó + Is féidir le sconna dúbailte scipeáil chuig an gcéad chaibidil eile/roimhe seo a spreagadh ó am go chéile + + + Íosluchtaigh seachtracha + Socruithe chun íoslódálaí seachtrach a úsáid + Taispeáin cnaipe íoslódála seachtrach + Taispeántar cnaipe íoslódála sa seinnteoir + Ní thaispeántar cnaipe íoslódála sa seinnteoir + + Sáraigh an cnaipe Íosluchtaigh gníomh + Osclaíonn an cnaipe íoslódála do íoslódálaí seachtrach + Osclaíonn an cnaipe íoslódála an íoslódálaí dúchasach san aip + Ainm pacáiste íoslódálaí + Ainm an phacáiste de d\'aip íoslódálaí seachtrach suiteáilte + Iontráil ainm an phacáiste + Eile + Níl an aip suiteáilte + Níl %s suiteáilte. Suiteáil é le do thoil. + "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" + Ní féidir ainm an phacáiste a fhágáil folamh + + + Díchumasaigh comhartha cuardaigh beacht + Tá gotha ​​cuardaigh chruinn díchumasaithe + Tá gotha ​​cuardaigh chruinn cumasaithe + + + Cumasaigh tapáil chun cuardach a dhéanamh + Tá tapáil chun cuardach cumasaithe + Tá tapáil chun cuardach a dhíchumasaithe + + + Cumasaigh gotha ​​gile + "Tá swipeáil gile lánscáileáin cumasaithe Coigeartaigh gile trí swipeáil go hingearach ar thaobh clé an scáileáin" - Tá svaidhpeáil gile lánscáileáin díchumasaithe - Cumasaigh gotha ​​toirte - "Tá swipeáil toirte lánscáileáin cumasaithe + Tá svaidhpeáil gile lánscáileáin díchumasaithe + Cumasaigh gotha ​​toirte + "Tá swipeáil toirte lánscáileáin cumasaithe Coigeartaigh an toirt trí swipeáil go hingearach ar thaobh na láimhe deise den scáileán" - Tá swipeáil toirte lánscáileáin díchumasaithe - Cumasaigh gotha ​​brúigh chun svaidhpeáil - Tá brúigh chun svaidhpeáil cumasaithe - Tá brúigh chun svaidhpeáil díchumasaithe - Cumasaigh aiseolas haptic - Tá aiseolas haptic cumasaithe - Tá aiseolas haptic díchumasaithe - Sábháil agus athchóirigh gile - Sábháil agus cuir gile ar ais agus tú ag imeacht nó ag dul isteach i lánscáileán - Ná sábháil agus ná hathchóirigh gile agus tú ag imeacht nó ag dul isteach sa lánscáileán - Cumasaigh gotha ​​gile uathoibríoch - Cumasaíonn tú gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle den ghluaiseacht gile - Ní chumasaítear gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle - Uathoibríoch - Am scoir forleagan svaidhpeála - An méid milleasoicind atá an forleagan le feiceáil - Teimhneacht chúlra forleagan svaidhpeála - Luach teimhneachta idir 0-100 - Teimhneacht svaidhpeála idir 0-100 - Dath gile forleagan svaidhpeála - Dath an bharra dul chun cinn le haghaidh rialuithe gile - Dath toirte forleagan svaidhpeála - Dath an bharra dul chun cinn do rialuithe toirte - Méid téacs forleagan svaidhpeála - Méid an téacs le haghaidh forleagan svaidhpeála idir 1-30 - Caithfidh méid an téacs a bheith idir 1-30 - Tairseach méide svaidhpeála - An méid tairsí le go dtarlóidh svaidhpeáil - Íogaireacht svaidhpeáil toirte - Cé mhéad a athraíonn an toirt in aghaidh an svaidhpeála - Stíl forleagan svaidhpeála - Forleagan cothrománach - Forleagan cothrománach (íosmhéid - barr) - Forleagan cothrománach (íosmhéid - lár) - Forleagan ciorclach - Forleagan ciorclach (íosmhéid) - Forleagan ingearach - Forleagan ingearach (íosmhéid) - Cumasaigh svaidhpeáil chun físeáin a athrú - Athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo - Ní athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo - - - Díchumasaigh fotheidil uathoibríocha - Tá fotheidil uathoibríocha díchumasaithe - Tá fotheidil uathoibríocha cumasaithe - - - Cnaipí gníomhaíochta - Folaigh nó taispeáin cnaipí faoi fhíseáin - Díchumasaigh lonradh na cnaipí Cosúil / Liostáil - Ní bheidh na cnaipe Is maith liom agus Liostáil ag lonrú nuair a luaitear iad - Lonróidh na cnaipe Is maith liom agus Liostáil nuair a luaitear iad - Folaigh Like agus Dislike - Tá cnaipí Like agus Dislike i bhfolach - Taispeántar cnaipí Like agus Dislike - - Folaigh Comhroinn - Tá cnaipe Comhroinn i bhfolach - Taispeántar an cnaipe Comhroinn - - Folaigh Stad fógraí - Tá cnaipe stad fógraí i bhfolach - Taispeántar an cnaipe Stad fógraí - - Folaigh Tráchtanna - Tá an cnaipe tráchtanna i bhfolach - Taispeántar an cnaipe tráchtanna - + + Díchumasaigh fotheidil uathoibríocha + Tá fotheidil uathoibríocha díchumasaithe + Tá fotheidil uathoibríocha cumasaithe + + + Cnaipí gníomhaíochta + Folaigh nó taispeáin cnaipí faoi fhíseáin + Díchumasaigh lonradh na cnaipí Cosúil / Liostáil + Ní bheidh na cnaipe Is maith liom agus Liostáil ag lonrú nuair a luaitear iad + Lonróidh na cnaipe Is maith liom agus Liostáil nuair a luaitear iad + Folaigh Like agus Dislike + Tá cnaipí Like agus Dislike i bhfolach + Taispeántar cnaipí Like agus Dislike + + Folaigh Comhroinn + Tá cnaipe Comhroinn i bhfolach + Taispeántar an cnaipe Comhroinn + + Folaigh Stad fógraí + Tá cnaipe stad fógraí i bhfolach + Taispeántar an cnaipe Stad fógraí + + Folaigh Tráchtanna + Tá an cnaipe tráchtanna i bhfolach + Taispeántar an cnaipe tráchtanna + - Folaigh Tuairisc - Tá an cnaipe tuairisce i bhfolach - Taispeántar an cnaipe tuairisce - - Folaigh Remix - Tá cnaipe Remix i bhfolach - Taispeántar cnaipe Remix - - Folaigh Íoslódáil - Tá an cnaipe íosluchtaithe i bhfolach - Taispeántar cnaipe íoslódáil - + Folaigh Remix + Tá cnaipe Remix i bhfolach + Taispeántar cnaipe Remix + + Folaigh Íoslódáil + Tá an cnaipe íosluchtaithe i bhfolach + Taispeántar cnaipe íoslódáil + - Folaigh Hype - Tá cnaipe an Hype i bhfolach - Taispeántar cnaipe Hype - - Folaigh Cur Chun Cinn - Tá an cnaipe cur chun cinn i bhfolach - Taispeántar an cnaipe cur chun cinn - - Folaigh Buíochas - Tá cnaipe buíochas i bhfolach - Taispeántar cnaipe buíochas - + Folaigh Cur Chun Cinn + Tá an cnaipe cur chun cinn i bhfolach + Taispeántar an cnaipe cur chun cinn + + Folaigh Buíochas + Tá cnaipe buíochas i bhfolach + Taispeántar cnaipe buíochas + - Folaigh Iarr - Tá an cnaipe Iarr i bhfolach - Taispeántar cnaipe Iarr - - Folaigh Gearrthóg - Tá an cnaipe gearrthóg i bhfolach - Taispeántar cnaipe gearrthóg - - Folaigh Siopa - Tá cnaipe an tSiopa i bhfolach - Taispeántar an cnaipe siopa - - Folaigh Sábháil - Tá cnaipe sábhála i bhfolach - Taispeántar an cnaipe Sábháil - - - Cnaipí nascleanúna - Folaigh nó athraigh cnaipí sa bharra nascleanúna - - Folaigh Baile - Tá cnaipe baile i bhfolach - Taispeántar cnaipe baile - - Folaigh Shorts - Tá cnaipe Shorts i bhfolach - Taispeántar cnaipe Shorts - - Folaigh Cruthaigh - Tá cnaipe Cruthaigh i bhfolach - Taispeántar cnaipe Cruthaigh - - Folaigh Síntiúis - Tá cnaipe síntiús i bhfolach - Taispeántar cnaipe síntiúis - Folaigh Fógraí - Tá cnaipe fógraí i bhfolach - Taispeántar cnaipe fógraí - - Athraigh Cruthaigh le Fógraí - "Cnaipe Cruthaigh athraithe le cnaipe Fógraí + Folaigh Iarr + Tá an cnaipe Iarr i bhfolach + Taispeántar cnaipe Iarr + + Folaigh Gearrthóg + Tá an cnaipe gearrthóg i bhfolach + Taispeántar cnaipe gearrthóg + + Folaigh Siopa + Tá cnaipe an tSiopa i bhfolach + Taispeántar an cnaipe siopa + + Folaigh Sábháil + Tá cnaipe sábhála i bhfolach + Taispeántar an cnaipe Sábháil + + + Cnaipí nascleanúna + Folaigh nó athraigh cnaipí sa bharra nascleanúna + + Folaigh Baile + Tá cnaipe baile i bhfolach + Taispeántar cnaipe baile + + Folaigh Shorts + Tá cnaipe Shorts i bhfolach + Taispeántar cnaipe Shorts + + Folaigh Cruthaigh + Tá cnaipe Cruthaigh i bhfolach + Taispeántar cnaipe Cruthaigh + + Folaigh Síntiúis + Tá cnaipe síntiús i bhfolach + Taispeántar cnaipe síntiúis + Folaigh Fógraí + Tá cnaipe fógraí i bhfolach + Taispeántar cnaipe fógraí + + Athraigh Cruthaigh le Fógraí + "Cnaipe Cruthaigh athraithe le cnaipe Fógraí Nóta: Trí é seo a chumasú, cuirtear fógraí físeáin i bhfolach freisin" - Ní athraítear cnaipe Cruthaigh le cnaipe Fógraí - "Má dhíchumasaíonn tú an socrú seo, díchumasófar bac fógraí Shorts freisin. + Ní athraítear cnaipe Cruthaigh le cnaipe Fógraí + "Má dhíchumasaíonn tú an socrú seo, díchumasófar bac fógraí Shorts freisin. Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur air." - Folaigh lipéid cnaipe nascleanú - Tá lipéid i bhfolach - Taispeántar lipéid - Díchumasaigh barra stádais tréshoilseach - Tá an barra stádais teimhneach - Tá an barra stádais teimhneach nó tréshoilseach - Ar roinnt gléasanna, is féidir leis an ngné seo a chumasú barra nascleanúna an chórais a athrú go trédhearcach. - Díchumasaigh barra tréshoilseach solais - Tá an barra nascleanúna i mód solais teimhneach - Tá barra nascleanúna mód solais teimhneach nó tréshoilseach - Díchumasaigh barra tréshoilseach dorcha - Tá an barra nascleanúna i mód dorcha teimhneach - Tá barra nascleanúna mód dorcha teimhneach nó tréshoilseach - - - Roghchlár Flyout - Folaigh nó taispeáin míreanna roghchlár flyout an imreora - - Folaigh Fotheidil - Tá roghchlár fotheidil i bhfolach - Taispeántar roghchlár fotheidil - - Folaigh Socruithe Breise - Tá roghchlár socruithe breise i bhfolach - Taispeántar roghchlár socruithe breise - - Folaigh lasc ama codlata - Tá an roghchlár lasc ama codlata i bhfolach - Taispeántar roghchlár an lasc ama codlata - - Físeán Lúb Folaigh - Tá roghchlár físe lúb i bhfolach - Taispeántar roghchlár físe lúb - - Folaigh modh comhthimpeallach - Tá roghchlár mód comhthimpeallach i bhfolach - Taispeántar roghchlár mód comhthimpeallach - Folaigh toirt cobhsaí - Taispeántar roghchlár toirte cobhsaí - Tá roghchlár toirte cobhsaí i bhfolach - - Folaigh Cabhair & aiseolas - Cabhair & Tá an roghchlár aiseolais i bhfolach - Taispeántar roghchlár Cabhrach & Aiseolais - - Folaigh luas athsheinm - Tá roghchlár luas athsheinm i bhfolach - Taispeántar roghchlár luas athsheinm - - Folaigh scáileán Glas - Tá roghchlár scáileán glas i bhfolach - Taispeántar roghchlár an scáileáin ghlasála - - Folaigh Éist le YouTube Music - Tá roghchlár Éist le YouTube Music i bhfolach - Taispeántar an roghchlár Éist le YouTube Music - - Folaigh Rian Fuaime - Tá roghchlár rian fuaime i bhfolach - Taispeántar roghchlár rian fuaime - + + Roghchlár Flyout + Folaigh nó taispeáin míreanna roghchlár flyout an imreora + + Folaigh Fotheidil + Tá roghchlár fotheidil i bhfolach + Taispeántar roghchlár fotheidil + + Folaigh Socruithe Breise + Tá roghchlár socruithe breise i bhfolach + Taispeántar roghchlár socruithe breise + + Folaigh lasc ama codlata + Tá an roghchlár lasc ama codlata i bhfolach + Taispeántar roghchlár an lasc ama codlata + + Físeán Lúb Folaigh + Tá roghchlár físe lúb i bhfolach + Taispeántar roghchlár físe lúb + + Folaigh modh comhthimpeallach + Tá roghchlár mód comhthimpeallach i bhfolach + Taispeántar roghchlár mód comhthimpeallach + Folaigh toirt cobhsaí + Taispeántar roghchlár toirte cobhsaí + Tá roghchlár toirte cobhsaí i bhfolach + + Folaigh Cabhair & aiseolas + Cabhair & Tá an roghchlár aiseolais i bhfolach + Taispeántar roghchlár Cabhrach & Aiseolais + + Folaigh luas athsheinm + Tá roghchlár luas athsheinm i bhfolach + Taispeántar roghchlár luas athsheinm + + Folaigh scáileán Glas + Tá roghchlár scáileán glas i bhfolach + Taispeántar roghchlár an scáileáin ghlasála + + Folaigh Éist le YouTube Music + Tá roghchlár Éist le YouTube Music i bhfolach + Taispeántar an roghchlár Éist le YouTube Music + + Folaigh Rian Fuaime + Tá roghchlár rian fuaime i bhfolach + Taispeántar roghchlár rian fuaime + - "Tá roghchlár an rian fuaime i bhfolach + "Tá roghchlár an rian fuaime i bhfolach Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhréige' go 'Android No SDK'" - - Folaigh Watch i VR - Tá an roghchlár Féach i VR i bhfolach - Taispeántar an roghchlár Féach i VR - Folaigh roghchlár cáilíocht físe - Tá roghchlár cháilíocht na físeáin i bhfolach - Taispeántar roghchlár cáilíochta físe - Folaigh buntásc roghchlár cáilíochta físe - Tá buntásc roghchláir cáilíochta físe i bhfolach - Taispeántar buntásc roghchlár cáilíochta físeáin - - - Folaigh an cnaipe Uath-imirt - Tá an cnaipe uath-sheinm i bhfolach - Taispeántar cnaipe Autoplay - - Folaigh cnaipe fotheidil - Tá cnaipe fotheidil i bhfolach - Taispeántar cnaipe fotheidil - Folaigh cnaipe Cast - Tá cnaipe Cast i bhfolach - Taispeántar cnaipe Cast - Folaigh cúlra rialuithe an imreora - Tá cúlra rialuithe an imreora i bhfolach - Taispeántar cúlra rialuithe an imreora - Folaigh cnaipí Roimhe Seo & Ar Aghaidh - Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach - Taispeántar cnaipí Roimhe Seo & Ar Aghaidh - - - Folaigh cártaí scáileáin deireadh - Tá cártaí scáileáin deiridh i bhfolach - Taispeántar cártaí scáileáin deireadh - - - Díchumasaigh mód comhthimpeallach i lánscáileán - Díchumasaíodh mód comhthimpeallach - Mód comhthimpeallach cumasaithe - - - Folaigh cártaí faisnéise - Tá cártaí faisnéise i bhfolach - Taispeántar cártaí faisnéise - - - Díchumasaigh beochana uimhreacha rollta - Ní bhíonn uimhreacha rollta beoite - Tá uimhreacha rollta beoite - - - Folaigh barra cuardaigh an tseinnteora físeáin - Tá barra cuardaigh seinnteoir físe i bhfolach - Taispeántar barra cuardaigh an t-imreoir físeán - - Folaigh barra cuardaigh mionsamhlacha físeáin - Tá barra cuardaigh mionsamhlacha físeáin i bhfolach - Taispeántar barra cuardaigh mionsamhlacha físe - - - Shorts seinnteoir - Folaigh nó taispeáin comhpháirteanna seinnteora Shorts - - Folaigh Shorts sa fhotha Baile - I bhfolach sa fhotha Baile agus físeáin ghaolmhara - Taispeánta sa fhotha Baile agus físeáin ghaolmhara - Folaigh Shorts i dtorthaí cuardaigh - Folaigh i dtorthaí cuardaigh - Taispeáin i dtorthaí cuardaigh - - Folaigh Shorts sa fhotha Liostálaí - I bhfolach sa fhotha Liostálaí - Taispeánta sa fhotha Liostálaí - Folaigh Shorts i stair féachana - I bhfolach i stair féachana - Taispeántar i stair féachana - Folaigh lipéad ‘Uath-dhúbláilte’ - Tá an lipéad uath-dhúbláilte i bhfolach - Taispeántar an lipéad uath-dhúbláilte - Folaigh cnaipe ‘Ceannaigh Super Thanks’ - Cnaipe Ceannaigh Super Thanks i bhfolach - Taispeántar an cnaipe Ceannaigh Super Thanks - Folaigh cnaipe Éifeacht - Tá cnaipe Éifeacht i bhfolach - Taispeántar cnaipe Éifeacht - Folaigh cnaipe ‘Scáileáin Ghlais’ - Tá cnaipe Scáileáin Ghlais i bhfolach - Taispeántar cnaipe Scáileáin Ghlais - Folaigh cnaipe Hashtag - Tá cnaipe Hashtag i bhfolach - Taispeántar cnaipe hashtag - - Folaigh cnaipe Glac páirt - Tá cnaipe Glac páirt i bhfolach - Taispeántar cnaipe Glac páirt - Folaigh réamhamharc beo - Tá réamhamharc beo i bhfolach - Taispeántar réamhamharc beo - Folaigh lipéad suímh - Tá lipéad suímh i bhfolach - Taispeántar lipéad suímh - Folaigh cnaipe ‘Poist nua’ - Tá cnaipe Poist nua i bhfolach - Taispeántar cnaipe Poist nua - Folaigh cnaipí forleagan ar sos - Tá cnaipí forleagan ar sos i bhfolach - Taispeántar cnaipí forleagan ar sos - Folaigh trácht réamhamhairc - Tá an trácht réamhamhairc i bhfolach - Taispeántar réamhamharc tráchta - Folaigh cnaipe ‘Sábháil Ceoil’ - Tá an cnaipe sábháil ceoil i bhfolach - Taispeántar an cnaipe sábháil ceoil - Folaigh moltaí cuardaigh - Tá moltaí cuardaigh i bhfolach - Taispeántar moltaí cuardaigh - Folaigh cnaipe Siopa - Tá cnaipe siopa i bhfolach - Taispeántar cnaipe siopa - Folaigh greamáin - Tá greamáin i bhfolach - Taispeántar greamáin - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Folaigh táirgí clibeáilte - Tá táirgí clibeáilte i bhfolach - Taispeántar táirgí clibeáilte - Folaigh cnaipe Ag Teacht - Tá cnaipe Ag Teacht i bhfolach - Taispeántar an cnaipe Ag Teacht - Folaigh cnaipe ‘Úsáid an fhuaim seo’ - Tá an cnaipe Úsáid an fhuaim seo i bhfolach - Taispeántar an cnaipe Úsáid an fhuaim seo - Folaigh an cnaipe ‘Úsáid an teimpléad seo’ - Tá an cnaipe Úsáid an teimpléid seo i bhfolach - Taispeántar an cnaipe Úsáid an teimpléid seo - Folaigh an cnaipe Is maith liom \'beochan tobair\' - Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach - Taispeántar an cnaipe Is maith liom \'beochan tobair\' - Folaigh cnaipe Is maith liom - Tá an cnaipe Is maith liom i bhfolach - Taispeántar an cnaipe Is maith liom - Folaigh cnaipe Ní maith liom - Tá an cnaipe Ní maith liom i bhfolach - Taispeántar an cnaipe Ní maith liom - Folaigh cnaipe na Tuairimí - Tá an cnaipe tuairimí i bhfolach - Taispeántar cnaipe tuairimí - - Folaigh cnaipe Roinn - Tá cnaipe Roinn i bhfolach - Taispeántar an cnaipe Roinn - - Folaigh cnaipe Athmheasc - Tá cnaipe Athmheasc i bhfolach - Taispeántar cnaipe Athmheasc - Folaigh cnaipe Fuaime - Tá cnaipe fuaime i bhfolach - Taispeántar cnaipe fuaime - Folaigh painéal faisnéise - Tá painéal faisnéise i bhfolach - Taispeántar painéal faisnéise - Folaigh barra cainéal - Tá barra cainéal i bhfolach - Taispeántar barra cainéal - Folaigh teideal físeáin - Teideal físeáin i bhfolach - Taispeántar teideal físeáin - Folaigh lipéad meiteashonraí fuaime - Lipéad meiteashonraí fuaime i bhfolach - Taispeántar Lipéad meiteashonraí fuaime - Folaigh lipéad nasc físeáin - Tá lipéad nasc físeáin i bhfolach - Taispeántar lipéad nasc físeáin - Folaigh barra nascleanúna - Tá barra nascleanúna i bhfolach - Taispeántar barra nascleanúna - - - Folaigh físeán molta deireadh scáileáin - "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta + + Folaigh Watch i VR + Tá an roghchlár Féach i VR i bhfolach + Taispeántar an roghchlár Féach i VR + Folaigh roghchlár cáilíocht físe + Tá roghchlár cháilíocht na físeáin i bhfolach + Taispeántar roghchlár cáilíochta físe + Folaigh buntásc roghchlár cáilíochta físe + Tá buntásc roghchláir cáilíochta físe i bhfolach + Taispeántar buntásc roghchlár cáilíochta físeáin + + + Folaigh an cnaipe Uath-imirt + Tá an cnaipe uath-sheinm i bhfolach + Taispeántar cnaipe Autoplay + + Folaigh cnaipe fotheidil + Tá cnaipe fotheidil i bhfolach + Taispeántar cnaipe fotheidil + Folaigh cnaipe Cast + Tá cnaipe Cast i bhfolach + Taispeántar cnaipe Cast + Folaigh cúlra rialuithe an imreora + Tá cúlra rialuithe an imreora i bhfolach + Taispeántar cúlra rialuithe an imreora + Folaigh cnaipí Roimhe Seo & Ar Aghaidh + Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach + Taispeántar cnaipí Roimhe Seo & Ar Aghaidh + + + Folaigh cártaí scáileáin deireadh + Tá cártaí scáileáin deiridh i bhfolach + Taispeántar cártaí scáileáin deireadh + + + Díchumasaigh mód comhthimpeallach i lánscáileán + Díchumasaíodh mód comhthimpeallach + Mód comhthimpeallach cumasaithe + + + Folaigh cártaí faisnéise + Tá cártaí faisnéise i bhfolach + Taispeántar cártaí faisnéise + + + Díchumasaigh beochana uimhreacha rollta + Ní bhíonn uimhreacha rollta beoite + Tá uimhreacha rollta beoite + + + Folaigh barra cuardaigh an tseinnteora físeáin + Tá barra cuardaigh seinnteoir físe i bhfolach + Taispeántar barra cuardaigh an t-imreoir físeán + + Folaigh barra cuardaigh mionsamhlacha físeáin + Tá barra cuardaigh mionsamhlacha físeáin i bhfolach + Taispeántar barra cuardaigh mionsamhlacha físe + + + Shorts seinnteoir + Folaigh nó taispeáin comhpháirteanna seinnteora Shorts + + Folaigh Shorts sa fhotha Baile + I bhfolach sa fhotha Baile agus físeáin ghaolmhara + Taispeánta sa fhotha Baile agus físeáin ghaolmhara + Folaigh Shorts i dtorthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeáin i dtorthaí cuardaigh + + Folaigh Shorts sa fhotha Liostálaí + I bhfolach sa fhotha Liostálaí + Taispeánta sa fhotha Liostálaí + Folaigh Shorts i stair féachana + I bhfolach i stair féachana + Taispeántar i stair féachana + Folaigh lipéad ‘Uath-dhúbláilte’ + Tá an lipéad uath-dhúbláilte i bhfolach + Taispeántar an lipéad uath-dhúbláilte + Folaigh cnaipe ‘Ceannaigh Super Thanks’ + Cnaipe Ceannaigh Super Thanks i bhfolach + Taispeántar an cnaipe Ceannaigh Super Thanks + Folaigh cnaipe Éifeacht + Tá cnaipe Éifeacht i bhfolach + Taispeántar cnaipe Éifeacht + Folaigh cnaipe ‘Scáileáin Ghlais’ + Tá cnaipe Scáileáin Ghlais i bhfolach + Taispeántar cnaipe Scáileáin Ghlais + Folaigh cnaipe Hashtag + Tá cnaipe Hashtag i bhfolach + Taispeántar cnaipe hashtag + + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt + Folaigh réamhamharc beo + Tá réamhamharc beo i bhfolach + Taispeántar réamhamharc beo + Folaigh lipéad suímh + Tá lipéad suímh i bhfolach + Taispeántar lipéad suímh + Folaigh cnaipe ‘Poist nua’ + Tá cnaipe Poist nua i bhfolach + Taispeántar cnaipe Poist nua + Folaigh cnaipí forleagan ar sos + Tá cnaipí forleagan ar sos i bhfolach + Taispeántar cnaipí forleagan ar sos + Folaigh trácht réamhamhairc + Tá an trácht réamhamhairc i bhfolach + Taispeántar réamhamharc tráchta + Folaigh cnaipe ‘Sábháil Ceoil’ + Tá an cnaipe sábháil ceoil i bhfolach + Taispeántar an cnaipe sábháil ceoil + Folaigh moltaí cuardaigh + Tá moltaí cuardaigh i bhfolach + Taispeántar moltaí cuardaigh + Folaigh cnaipe Siopa + Tá cnaipe siopa i bhfolach + Taispeántar cnaipe siopa + Folaigh greamáin + Tá greamáin i bhfolach + Taispeántar greamáin + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Folaigh táirgí clibeáilte + Tá táirgí clibeáilte i bhfolach + Taispeántar táirgí clibeáilte + Folaigh cnaipe Ag Teacht + Tá cnaipe Ag Teacht i bhfolach + Taispeántar an cnaipe Ag Teacht + Folaigh cnaipe ‘Úsáid an fhuaim seo’ + Tá an cnaipe Úsáid an fhuaim seo i bhfolach + Taispeántar an cnaipe Úsáid an fhuaim seo + Folaigh an cnaipe ‘Úsáid an teimpléad seo’ + Tá an cnaipe Úsáid an teimpléid seo i bhfolach + Taispeántar an cnaipe Úsáid an teimpléid seo + Folaigh an cnaipe Is maith liom \'beochan tobair\' + Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach + Taispeántar an cnaipe Is maith liom \'beochan tobair\' + Folaigh cnaipe Is maith liom + Tá an cnaipe Is maith liom i bhfolach + Taispeántar an cnaipe Is maith liom + Folaigh cnaipe Ní maith liom + Tá an cnaipe Ní maith liom i bhfolach + Taispeántar an cnaipe Ní maith liom + Folaigh cnaipe na Tuairimí + Tá an cnaipe tuairimí i bhfolach + Taispeántar cnaipe tuairimí + + Folaigh cnaipe Roinn + Tá cnaipe Roinn i bhfolach + Taispeántar an cnaipe Roinn + + Folaigh cnaipe Athmheasc + Tá cnaipe Athmheasc i bhfolach + Taispeántar cnaipe Athmheasc + Folaigh cnaipe Fuaime + Tá cnaipe fuaime i bhfolach + Taispeántar cnaipe fuaime + Folaigh painéal faisnéise + Tá painéal faisnéise i bhfolach + Taispeántar painéal faisnéise + Folaigh barra cainéal + Tá barra cainéal i bhfolach + Taispeántar barra cainéal + Folaigh teideal físeáin + Teideal físeáin i bhfolach + Taispeántar teideal físeáin + Folaigh lipéad meiteashonraí fuaime + Lipéad meiteashonraí fuaime i bhfolach + Taispeántar Lipéad meiteashonraí fuaime + Folaigh lipéad nasc físeáin + Tá lipéad nasc físeáin i bhfolach + Taispeántar lipéad nasc físeáin + Folaigh barra nascleanúna + Tá barra nascleanúna i bhfolach + Taispeántar barra nascleanúna + + + Folaigh físeán molta deireadh scáileáin + "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta Is féidir an t-uathsheinm a athrú i socruithe YouTube: Socruithe → Athsheinm → Uathsheinm an chéad fhíseán eile" - Taispeántar físeán molta deireadh scáileáin - - - Folaigh forleagan físeáin ghaolmhara - Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach - Taispeántar forleagan físeáin ghaolmhara i lánscáileán - - - Folaigh stampa ama an fhíseáin - Tá stampa ama i bhfolach - Taispeántar stampa ama - - - Folaigh painéil preab aníos imreoir - Tá painéil preab aníos imreoir i bhfolach - Taispeántar painéil preab aníos imreoir - - - Scoir an mód lánscáileáin ag deireadh an fhíseáin - Díchumasaithe - Portráid - Tírdhreach - Portráid agus tírdhreach - - - Oscail físeáin i bportráid lánscáileáin - Osclaítear físeáin i mód lánscáileáin - Ní osclaítear físeáin i mód lánscáileáin - - - Teimhneacht fhorleagan imreora - Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht - Teimhneacht fhorleagan an imreora idir 0-100 - - - - Níl dí-mhaith ar fáil faoi láthair (API am istigh) - Níl \'Ní maith liom\' ar fáil (stádas %d) - Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) - Níl \'Ní maith liom\' ar fáil (%s) - - Athlódáil físeán vótáil trí Return YouTube Dislike - - I bhfolach ag an úinéir - Return YouTube Dislike - Taispeántar \'Ní maith liom\' - Ní thaispeántar \'Ní maith liom\' - Taispeáin \'ní maith liom\' ar Shorts - "Taispeántar 'Ní thaitníonn' ar Shorts + Taispeántar físeán molta deireadh scáileáin + + + Folaigh forleagan físeáin ghaolmhara + Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach + Taispeántar forleagan físeáin ghaolmhara i lánscáileán + + + Folaigh stampa ama an fhíseáin + Tá stampa ama i bhfolach + Taispeántar stampa ama + + + Folaigh painéil preab aníos imreoir + Tá painéil preab aníos imreoir i bhfolach + Taispeántar painéil preab aníos imreoir + + + Scoir an mód lánscáileáin ag deireadh an fhíseáin + Díchumasaithe + Portráid + Tírdhreach + Portráid agus tírdhreach + + + Oscail físeáin i bportráid lánscáileáin + Osclaítear físeáin i mód lánscáileáin + Ní osclaítear físeáin i mód lánscáileáin + + + Teimhneacht fhorleagan imreora + Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht + Teimhneacht fhorleagan an imreora idir 0-100 + + + + Níl dí-mhaith ar fáil faoi láthair (API am istigh) + Níl \'Ní maith liom\' ar fáil (stádas %d) + Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) + Níl \'Ní maith liom\' ar fáil (%s) + + Athlódáil físeán vótáil trí Return YouTube Dislike + + I bhfolach ag an úinéir + Return YouTube Dislike + Taispeántar \'Ní maith liom\' + Ní thaispeántar \'Ní maith liom\' + Taispeáin \'ní maith liom\' ar Shorts + "Taispeántar 'Ní thaitníonn' ar Shorts Teorainn: B’fhéidir nach dtaispeánfar 'Ní thaitníonn' i mód incognito" - Ní thaispeántar \'Ní maith liom\' ar Shorts - \'Ní maith liom\' mar chéatadán - Taispeántar \'Ní thaitníonn\' mar chéatadán - Taispeántar \'Ní maith liom\' mar uimhir - - Cnaipe dlúth \'Is maith liom\' - Cnaipe \'Is maith liom\' stílithe don leithead íosta - Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr - Taispeáin \'is maith liom\' measta - Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo - Ní thaispeántar líon na \'is maith leis\' measta - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - ReturnYouTubeDislike.com - Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil - - Staitisticí API ReturnYouTubeDislike an ghléis seo - Am freagartha API, meán - Am freagartha API, íosmhéid - Am freagartha API, uasmhéid - Am freagartha API, físeán deireanach - Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm - Vótaí aisghabhála API, líon na nglaonna - Níor rinneadh aon ghlaonna líonra - %d glaonna líonra déanta - Vótaí aisghabhála API, líon na sosanna ama - Níl aon ghlaonna líonra imithe in éag - %d glaonna líonra imithe thar an am - Teorainneacha ráta cliant API - Níor aimsíodh aon teorainneacha ráta cliant - Teorainn ráta cliant a bhíonn le fáil %d uair - %d milleasoicind - - - Cumasaigh barra cuardaigh leathan - Tá barra cuardaigh leathan cumasaithe - Tá an barra cuardaigh leathan díchumasaithe - - - Cumasaigh mionsamhlacha ardchaighdeáin - Tá mionsamhlacha Seekbar ardchaighdeáin - Tá mionsamhlacha Seekbar ar chaighdeán meánach - Tá mionsamhlacha barra cuardaigh lánscáileáin ardchaighdeáin - Tá mionsamhlacha barra cuardaigh lánscáileáin ar chaighdeán meánach - "Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu. + Ní thaispeántar \'Ní maith liom\' ar Shorts + \'Ní maith liom\' mar chéatadán + Taispeántar \'Ní thaitníonn\' mar chéatadán + Taispeántar \'Ní maith liom\' mar uimhir + + Cnaipe dlúth \'Is maith liom\' + Cnaipe \'Is maith liom\' stílithe don leithead íosta + Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr + Taispeáin \'is maith liom\' measta + Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo + Ní thaispeántar líon na \'is maith leis\' measta + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + ReturnYouTubeDislike.com + Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil + + Staitisticí API ReturnYouTubeDislike an ghléis seo + Am freagartha API, meán + Am freagartha API, íosmhéid + Am freagartha API, uasmhéid + Am freagartha API, físeán deireanach + Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm + Vótaí aisghabhála API, líon na nglaonna + Níor rinneadh aon ghlaonna líonra + %d glaonna líonra déanta + Vótaí aisghabhála API, líon na sosanna ama + Níl aon ghlaonna líonra imithe in éag + %d glaonna líonra imithe thar an am + Teorainneacha ráta cliant API + Níor aimsíodh aon teorainneacha ráta cliant + Teorainn ráta cliant a bhíonn le fáil %d uair + %d milleasoicind + + + Cumasaigh barra cuardaigh leathan + Tá barra cuardaigh leathan cumasaithe + Tá an barra cuardaigh leathan díchumasaithe + + + Cumasaigh mionsamhlacha ardchaighdeáin + Tá mionsamhlacha Seekbar ardchaighdeáin + Tá mionsamhlacha Seekbar ar chaighdeán meánach + Tá mionsamhlacha barra cuardaigh lánscáileáin ardchaighdeáin + Tá mionsamhlacha barra cuardaigh lánscáileáin ar chaighdeán meánach + "Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu. Úsáidfidh miontaispeántais cuardaigh an caighdeán céanna leis an bhfíseán reatha. Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agus nuair a úsáidtear nasc idirlín an-tapa." - Cuir sean-mionsamhlacha barra cuardaigh ar ais - Beidh mionsamhlacha Seekbar le feiceáil os cionn an barra cuardaigh - Beidh mionsamhlacha Seekbar le feiceáil ar an scáileán - - - SponsorBlock - Cumasaigh SponsorBlock - Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais - Dealramh - Taispeáin an cnaipe vótála - Taispeántar cnaipe vótála deighleog - Ní thaispeántar cnaipe vótála deighleog - Úsáid leagan amach cearnach - Tá cnaipí agus rialtáin cearnach - Tá cnaipí agus rialuithe cruinn - - Úsáid an cnaipe Scipeáil dlúth - Cnaipe Scipeáil stílithe don leithead íosta - Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr - Folaigh an cnaipe Scipeáil go huathoibríoch - Folaítear an cnaipe Scipeáil tar éis cúpla soicind - Taispeántar an cnaipe Scipeáil don deighleog iomlán - Fad an chnaipe Scipeáil - Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad - Taispeáin an tósta cealaithe scipeáilte - Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú - Ní thaispeántar tósta - Scipeáil fad an tósta - Cá fhad a thaispeántar an tósta cealaithe scipeála - 1 soicind - 2 soicind - 3 soicind - 4 soicind - 5 soicind - 6 soicind - 7 soicind - 8 soicind - 9 soicind - 10 soicind - Taispeáin fad an fhíseáin gan deighleog - Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh - Taispeántar fad físe iomlán - Deighleoga nua a chruthú - Taispeáin cnaipe Cruthaigh deighleog nua - Taispeántar an cnaipe cruthaigh deighleog nua - Ní thaispeántar an cnaipe cruthaigh deighleog nua - Coigeartaigh céim deighleog nua - Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú - Caithfidh luach a bheith ina uimhir dheimhneach - Féach ar threoirlínte - Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua - Lean na treoirlínte - Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua - Léigh cheana féin - Taispeáin dom - Ginearálta - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil SponsorBlock ar fáil - Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil - Cumasaigh rianú comhaireamh scipeála - Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog - Níl rianú comhaireamh scipeála cumasaithe - Fad íosta deighleog - Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) - Fad ama neamhbhailí - D\'aitheantas úsáideora príobháideach - Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort - Caithfidh Id príobháideach a bheith ≥30 carachtar - Athraigh URL API - An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí - Athshocrú URL API - Tá URL API neamhbhailí - Athraigh URL API - Socruithe Iompórtála/Easpórtála - Cóipeáil - Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile - Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile. Cuimsíonn sé seo d\'aitheantas úsáideora príobháideach. Bí cinnte é seo a roinnt - D\'éirigh leis na socruithe a iompórtáil - Theip ar iompórtáil: %s - Theip ar easpórtáil: %s - "Tá ID úsáideora príobháideach SponsorBlock i do shocruithe. + Cuir sean-mionsamhlacha barra cuardaigh ar ais + Beidh mionsamhlacha Seekbar le feiceáil os cionn an barra cuardaigh + Beidh mionsamhlacha Seekbar le feiceáil ar an scáileán + + + SponsorBlock + Cumasaigh SponsorBlock + Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais + Dealramh + Taispeáin an cnaipe vótála + Taispeántar cnaipe vótála deighleog + Ní thaispeántar cnaipe vótála deighleog + Úsáid leagan amach cearnach + Tá cnaipí agus rialtáin cearnach + Tá cnaipí agus rialuithe cruinn + + Úsáid an cnaipe Scipeáil dlúth + Cnaipe Scipeáil stílithe don leithead íosta + Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr + Folaigh an cnaipe Scipeáil go huathoibríoch + Folaítear an cnaipe Scipeáil tar éis cúpla soicind + Taispeántar an cnaipe Scipeáil don deighleog iomlán + Fad an chnaipe Scipeáil + Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad + Taispeáin an tósta cealaithe scipeáilte + Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú + Ní thaispeántar tósta + Scipeáil fad an tósta + Cá fhad a thaispeántar an tósta cealaithe scipeála + 1 soicind + 2 soicind + 3 soicind + 4 soicind + 5 soicind + 6 soicind + 7 soicind + 8 soicind + 9 soicind + 10 soicind + Taispeáin fad an fhíseáin gan deighleog + Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh + Taispeántar fad físe iomlán + Deighleoga nua a chruthú + Taispeáin cnaipe Cruthaigh deighleog nua + Taispeántar an cnaipe cruthaigh deighleog nua + Ní thaispeántar an cnaipe cruthaigh deighleog nua + Coigeartaigh céim deighleog nua + Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú + Caithfidh luach a bheith ina uimhir dheimhneach + Féach ar threoirlínte + Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua + Lean na treoirlínte + Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua + Léigh cheana féin + Taispeáin dom + Ginearálta + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil SponsorBlock ar fáil + Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil + Cumasaigh rianú comhaireamh scipeála + Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog + Níl rianú comhaireamh scipeála cumasaithe + Fad íosta deighleog + Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) + Fad ama neamhbhailí + D\'aitheantas úsáideora príobháideach + Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort + Caithfidh Id príobháideach a bheith ≥30 carachtar + Athraigh URL API + An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí + Athshocrú URL API + Tá URL API neamhbhailí + Athraigh URL API + Socruithe Iompórtála/Easpórtála + Cóipeáil + Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile + Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile. Cuimsíonn sé seo d\'aitheantas úsáideora príobháideach. Bí cinnte é seo a roinnt + D\'éirigh leis na socruithe a iompórtáil + Theip ar iompórtáil: %s + Theip ar easpórtáil: %s + "Tá ID úsáideora príobháideach SponsorBlock i do shocruithe. Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh. " - Ná taispeáin arís - Athraigh iompar deighleog - Urraitheoir - Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo - Neamhíoctha/Féin-chur chun cinn - Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad - Meabhrúchán Idirghníomhaíochta (Liostáil) - Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin - Aibhsigh - An chuid den fhíseán atá ag cuardach mórchuid na ndaoine - Beochan Eatramh / Réamhrá - Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis - Cártaí Deiridh / Creidmheasanna - Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis - Crúca / Beannachtaí - Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis - Réamhamharc / Achoimre - Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile - Seachrán / Scéalta Grinn - Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra - Ceol: Rannóg Neamh-Cheoil - Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile - Scipeáil - Aibhsigh - Scipeáil urraitheoir - Scipeáil promóisean - Scipeáil idirghníomhú - Scipeáil go dtí aird a tharraingt - Scipeáil réamhrá - Scipeáil briseadh - Scipeáil briseadh - Scipeáil an chuid deiridh - Scipeáil crúca - Scipeáil réamhamharc - Scipeáil réamhamharc - Scipeáil achoimre - Scipeáil tadhlaí - Scipeáil neamh-cheol - Scipeáil deighleog - Scipeáilte urraitheoir - Scipeáilte féin-chur chun cinn - Scipeáilte meabhrúchán cráite - Scipeáilte aird a tharraingt - Scipeáilte réamhrá - Scipeáilte briseadh - Scipeáilte briseadh - Scipeáilte an chuid deiridh - Scipeáilte crúca - Scipeáilte réamhamharc - Scipeáilte réamhamharc - Achoimre scipeáilte - Tadhlaí scipeáilte - Scipeáladh cuid nach ceolmhar í - Deighleog gan curtha isteach scipeáilte - Scipeáilte iomadúil deighleoga - Scipeáil go huathoibríoch - Scipeáil go huathoibríoch uair amháin - Taispeáin cnaipe Scipeáil - Taispeáin i mbarra lorg - Díchumasaigh - Ní féidir deighleog a chur isteach: %s - Tá SponsorBlock síos go sealadach - Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) - Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) - Ní féidir an deighleog a chur isteach: %s - "Ní féidir deighleog a chur isteach. + Ná taispeáin arís + Athraigh iompar deighleog + Urraitheoir + Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo + Neamhíoctha/Féin-chur chun cinn + Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad + Meabhrúchán Idirghníomhaíochta (Liostáil) + Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin + Aibhsigh + An chuid den fhíseán atá ag cuardach mórchuid na ndaoine + Beochan Eatramh / Réamhrá + Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis + Cártaí Deiridh / Creidmheasanna + Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis + Crúca / Beannachtaí + Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis + Réamhamharc / Achoimre + Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile + Seachrán / Scéalta Grinn + Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra + Ceol: Rannóg Neamh-Cheoil + Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile + Scipeáil + Aibhsigh + Scipeáil urraitheoir + Scipeáil promóisean + Scipeáil idirghníomhú + Scipeáil go dtí aird a tharraingt + Scipeáil réamhrá + Scipeáil briseadh + Scipeáil briseadh + Scipeáil an chuid deiridh + Scipeáil crúca + Scipeáil réamhamharc + Scipeáil réamhamharc + Scipeáil achoimre + Scipeáil tadhlaí + Scipeáil neamh-cheol + Scipeáil deighleog + Scipeáilte urraitheoir + Scipeáilte féin-chur chun cinn + Scipeáilte meabhrúchán cráite + Scipeáilte aird a tharraingt + Scipeáilte réamhrá + Scipeáilte briseadh + Scipeáilte briseadh + Scipeáilte an chuid deiridh + Scipeáilte crúca + Scipeáilte réamhamharc + Scipeáilte réamhamharc + Achoimre scipeáilte + Tadhlaí scipeáilte + Scipeáladh cuid nach ceolmhar í + Deighleog gan curtha isteach scipeáilte + Scipeáilte iomadúil deighleoga + Scipeáil go huathoibríoch + Scipeáil go huathoibríoch uair amháin + Taispeáin cnaipe Scipeáil + Taispeáin i mbarra lorg + Díchumasaigh + Ní féidir deighleog a chur isteach: %s + Tá SponsorBlock síos go sealadach + Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) + Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) + Ní féidir an deighleog a chur isteach: %s + "Ní féidir deighleog a chur isteach. Tá sé ann cheana féin" - Cuireadh an deighleog isteach go rathúil - - Níl SponsorBlock ar fáil go sealadach (API am istigh) - Níl SponsorBlock ar fáil go sealadach (stádas %d) - Níl SponsorBlock ar fáil go sealadach - Ní féidir vótáil don deighleog (API am istigh) - Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) - Ní féidir vótáil a dhéanamh don deighleog: %s - Vótáil suas - Vótáil sios - Athraigh catagóir - Níl aon deighleoga le vótáil orthu - - %1$s go %2$s - Roghnaigh catagóir deighleog - Catagóir díchumasaithe. Cumasaigh í le cur isteach. - Deighleog nua SponsorBlock - Socraigh %s mar thús nó deireadh deighleog nua? - Tosaigh - Deireadh - Anois - Am a thosaíonn an deighleog ag - Am a chríochnaíonn an deighleog ag - An bhfuil na hamanna ceart? - "Tá an deighleog ó + Cuireadh an deighleog isteach go rathúil + + Níl SponsorBlock ar fáil go sealadach (API am istigh) + Níl SponsorBlock ar fáil go sealadach (stádas %d) + Níl SponsorBlock ar fáil go sealadach + Ní féidir vótáil don deighleog (API am istigh) + Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) + Ní féidir vótáil a dhéanamh don deighleog: %s + Vótáil suas + Vótáil sios + Athraigh catagóir + Níl aon deighleoga le vótáil orthu + + %1$s go %2$s + Roghnaigh catagóir deighleog + Catagóir díchumasaithe. Cumasaigh í le cur isteach. + Deighleog nua SponsorBlock + Socraigh %s mar thús nó deireadh deighleog nua? + Tosaigh + Deireadh + Anois + Am a thosaíonn an deighleog ag + Am a chríochnaíonn an deighleog ag + An bhfuil na hamanna ceart? + "Tá an deighleog ó %1$s go @@ -1290,47 +1289,47 @@ go (%3$s) Réidh le cur isteach?" - Caithfidh an tús a bheith roimh an deireadh - Marcáil dhá shuíomh ar an mbarra ama ar dtús - Féach ar an deighleog agus cinntigh léim réidh - Cuir am an deighleog in eagar de láimh - Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? - Am neamhbhailí tugtha - Staitisticí - - Níl staitisticí ar fáil faoi láthair (tá an API síos) - Ag lódáil... - Tá SponsorBlock díchumasaithe - D\'ainm úsáideora: <b>%s</b> - Tapáil anseo chun d\'ainm úsáideora a athrú - Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s - Athraíodh ainm úsáideora go rathúil - Is é do chlú <b>%.2f</b> - Chruthaigh tú <b>%s</b> deighleoga - Tapáil anseo chun do dheighleoga a fheiceáil - Clár ceannairí SponsorBlock - Tá daoine sábháilte agat ó <b>%s</b> deighleoga - Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil - Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil - Rinne tú scipeáil ar <b>%s</b> deighleoga - Sin é <b>%s</b> - Athshocrú cuntar deighleoga scipeáilte? - %1$s uaireanta %2$s nóiméad - %1$s nóiméad %2$s soicind - %s soicindí - Teimhneacht: - Dath: - Maidir - sponsor.ajay.app - Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil - - - Fachtóir foirme leagan amach - Réamhshocrú - Guthán - Táibléad - Gluaisteán - "Áirítear leis na hathruithe: + Caithfidh an tús a bheith roimh an deireadh + Marcáil dhá shuíomh ar an mbarra ama ar dtús + Féach ar an deighleog agus cinntigh léim réidh + Cuir am an deighleog in eagar de láimh + Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? + Am neamhbhailí tugtha + Staitisticí + + Níl staitisticí ar fáil faoi láthair (tá an API síos) + Ag lódáil... + Tá SponsorBlock díchumasaithe + D\'ainm úsáideora: <b>%s</b> + Tapáil anseo chun d\'ainm úsáideora a athrú + Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s + Athraíodh ainm úsáideora go rathúil + Is é do chlú <b>%.2f</b> + Chruthaigh tú <b>%s</b> deighleoga + Tapáil anseo chun do dheighleoga a fheiceáil + Clár ceannairí SponsorBlock + Tá daoine sábháilte agat ó <b>%s</b> deighleoga + Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil + Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil + Rinne tú scipeáil ar <b>%s</b> deighleoga + Sin é <b>%s</b> + Athshocrú cuntar deighleoga scipeáilte? + %1$s uaireanta %2$s nóiméad + %1$s nóiméad %2$s soicind + %s soicindí + Teimhneacht: + Dath: + Maidir + sponsor.ajay.app + Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil + + + Fachtóir foirme leagan amach + Réamhshocrú + Guthán + Táibléad + Gluaisteán + "Áirítear leis na hathruithe: Leagan amach táibléid • Tá poist phobail i bhfolach @@ -1338,329 +1337,329 @@ Leagan amach táibléid Leagan amach gluaisteán • Gearrscannáin oscailte sa ghnáth-imreoir • Tá an fotha eagraithe de réir topaicí agus bealaí" - - - Leagan aip bréige - Leagan bréagach - Leagan gan bréag - "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. + + + Leagan aip bréige + Leagan bréagach + Leagan gan bréag + "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. Athróidh sé seo cuma agus gnéithe na haipe, ach d'fhéadfadh fo-iarsmaí anaithnide tarlú. Má mhúchtar é níos déanaí, moltar sonraí na haipe a ghlanadh chun fabhtanna UI a chosc." - Sprioc leagan aip bréagach - 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú - 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn - 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts - 19.01.34 - Athchóirigh deilbhíní nascleanúna sean - - - Athraigh an leathanach tosaigh - Réamhshocrú - Gach síntiús - Brabhsáil cainéil - Cúrsaí / Foghlaim - Taiscéal - Faisean & Áilleacht - Cluichíocht - Stair - Leabharlann - Físeáin a thaitin - Beo - Scannáin - Ceol - Nuacht - Fógraí - Liostaí seinnte - Cuardaigh - Siopadóireacht - Shorts - Spóirt - Síntiúis - Ag treocht - Réaltacht Fhíorúil - Féach níos déanaí - Do ghearrthóga - Athraigh an leathanach tosaigh i gcónaí - "Athraítear an leathanach tosaigh i gcónaí + Sprioc leagan aip bréagach + 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú + 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn + 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts + 19.01.34 - Athchóirigh deilbhíní nascleanúna sean + + + Athraigh an leathanach tosaigh + Réamhshocrú + Gach síntiús + Brabhsáil cainéil + Cúrsaí / Foghlaim + Taiscéal + Faisean & Áilleacht + Cluichíocht + Stair + Leabharlann + Físeáin a thaitin + Beo + Scannáin + Ceol + Nuacht + Fógraí + Liostaí seinnte + Cuardaigh + Siopadóireacht + Shorts + Spóirt + Síntiúis + Ag treocht + Réaltacht Fhíorúil + Féach níos déanaí + Do ghearrthóga + Athraigh an leathanach tosaigh i gcónaí + "Athraítear an leathanach tosaigh i gcónaí Teorainn: Seans nach n-oibreoidh úsáid a bhaint as an gcnaipe cúil ar an mbarra uirlisí" - Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip - - - Díchumasaigh atosú seinnteoir Shorts - Ní atosóidh seinnteoir Shorts nuair a thosófar an aip - Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís - - - Oscail Shorts le - Shorts seinnteoir - Imreoir rialta - Lánscáileáin imreoir rialta - - - Shorts Uathsheinn - Seinnfidh Shorts go huathoibríoch - Déanfaidh Shorts arís - Uathsheinn Shorts Cúlra sheinn - Déanfar súgradh cúlra Shorts go huathoibríoch - Athdhéanfar athsheinm Shorts cúlra sheinn - - - Mion seinnteoir - Athraigh stíl an imreora íoslaghdaithe in-aip - Cineál Mion seinnteoir - Díchumasaithe - Réamhshocraithe - Íosta - Táibléad - Nua-aimseartha 1 - Nua-Aimseartha 2 - Nua-aimseartha 3 - Nua-aimseartha 4 - Díchumasaigh coirnéil chruinn - Tá coirnéil cearnach - Déantar coirnéil a shlánú - Cumasaigh sconna dúbailte agus pinch chun méid a athrú - "Gníomh tap dúbailte agus pinch le méid a athrú cumasaithe + Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip + + + Díchumasaigh atosú seinnteoir Shorts + Ní atosóidh seinnteoir Shorts nuair a thosófar an aip + Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís + + + Oscail Shorts le + Shorts seinnteoir + Imreoir rialta + Lánscáileáin imreoir rialta + + + Shorts Uathsheinn + Seinnfidh Shorts go huathoibríoch + Déanfaidh Shorts arís + Uathsheinn Shorts Cúlra sheinn + Déanfar súgradh cúlra Shorts go huathoibríoch + Athdhéanfar athsheinm Shorts cúlra sheinn + + + Mion seinnteoir + Athraigh stíl an imreora íoslaghdaithe in-aip + Cineál Mion seinnteoir + Díchumasaithe + Réamhshocraithe + Íosta + Táibléad + Nua-aimseartha 1 + Nua-Aimseartha 2 + Nua-aimseartha 3 + Nua-aimseartha 4 + Díchumasaigh coirnéil chruinn + Tá coirnéil cearnach + Déantar coirnéil a shlánú + Cumasaigh sconna dúbailte agus pinch chun méid a athrú + "Gníomh tap dúbailte agus pinch le méid a athrú cumasaithe • Tap dúbailte chun méid an mhion-imreora a mhéadú • Tap dúbailte arís chun an méid bunaidh a athchóiriú" - Díchumasaíodh gníomh tapáil faoi dhó agus pinch chun méid a athrú - Díchumasaigh tarraing agus scaoil - Tá tarraing agus scaoil díchumasaithe - "Tá tarraing agus scaoil cumasaithe + Díchumasaíodh gníomh tapáil faoi dhó agus pinch chun méid a athrú + Díchumasaigh tarraing agus scaoil + Tá tarraing agus scaoil díchumasaithe + "Tá tarraing agus scaoil cumasaithe Is féidir an mini-imreoir a tharraingt chuig aon chúinne den scáileán" - Díchumasaigh gotha tarraingthe cothrománach - Gotha tarraingthe cothrománach díchumasaithe - "Gotha tarraingthe cothrománach cumasaithe + Díchumasaigh gotha tarraingthe cothrománach + Gotha tarraingthe cothrománach díchumasaithe + "Gotha tarraingthe cothrománach cumasaithe Is féidir an mini-imreoir a tharraingt amach as an scáileán ar chlé nó ar dheis" - Folaigh cnaipí forleathana - Tá cnaipí forleathana i bhfolach - Taispeántar cnaipí forleathana - Folaigh cnaipí leathnaithe agus dúnta - "Tá na cnaipí i bhfolach + Folaigh cnaipí forleathana + Tá cnaipí forleathana i bhfolach + Taispeántar cnaipí forleathana + Folaigh cnaipí leathnaithe agus dúnta + "Tá na cnaipí i bhfolach Svaip chun leathnú nó dúnadh" - Taispeántar cnaipí leathnaithe agus dúnta - Folaigh fothéacsanna - Tá fothéacsanna i bhfolach - Taispeántar fothéacsanna - Folaigh cnaipí scipeáil ar aghaidh agus ar ais - Tá scipeanna ar aghaidh agus ar ais i bhfolach - Taispeántar scipeáil ar aghaidh agus ar ais - Méid tosaigh - Tosaigh ar mhéid an scáileáin, i bpicteilíní - Caithfidh méid picteilíní a bheith idir %1$s agus %2$s - Trédhearcacht forleagan - Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach - Caithfidh teimhneacht forleagan mion-imreoir a bheith idir 0-100 - - - Cumasaigh scáileán luchtaithe - Beidh cúlra grádáin ag an scáileán lódála - Beidh cúlra láidir ag scáileán luchtaithe - Stíl scáileáin splancais - Dath - Dubh agus bán - Cumasaigh dath barra cuardaigh saincheaptha - Taispeántar dath barra cuardaigh saincheaptha - Taispeántar dath barr cuardaigh bunaidh - Dath barra cuardaigh saincheaptha - Dath an bharra cuardaigh - Dath béime saincheaptha an bharra cuardaigh - Dath béime an bharra cuardaigh - Luach datha barra cuardaigh neamhbhailí - - - YouTube ReVanced - YT ReVanced - YT - - - Lógó ceanntásca - Réamhshocrú - Rialta - Premium - ReVanced - - ReVanced íosta - Saincheaptha - - - Seachbhóthar srianta réigiún íomhá - Ag baint úsáide as óstach íomhá yt4.ggpht.com - "Óstáil íomhá bhunaidh á úsáid + Taispeántar cnaipí leathnaithe agus dúnta + Folaigh fothéacsanna + Tá fothéacsanna i bhfolach + Taispeántar fothéacsanna + Folaigh cnaipí scipeáil ar aghaidh agus ar ais + Tá scipeanna ar aghaidh agus ar ais i bhfolach + Taispeántar scipeáil ar aghaidh agus ar ais + Méid tosaigh + Tosaigh ar mhéid an scáileáin, i bpicteilíní + Caithfidh méid picteilíní a bheith idir %1$s agus %2$s + Trédhearcacht forleagan + Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach + Caithfidh teimhneacht forleagan mion-imreoir a bheith idir 0-100 + + + Cumasaigh scáileán luchtaithe + Beidh cúlra grádáin ag an scáileán lódála + Beidh cúlra láidir ag scáileán luchtaithe + Stíl scáileáin splancais + Dath + Dubh agus bán + Cumasaigh dath barra cuardaigh saincheaptha + Taispeántar dath barra cuardaigh saincheaptha + Taispeántar dath barr cuardaigh bunaidh + Dath barra cuardaigh saincheaptha + Dath an bharra cuardaigh + Dath béime saincheaptha an bharra cuardaigh + Dath béime an bharra cuardaigh + Luach datha barra cuardaigh neamhbhailí + + + YouTube ReVanced + YT ReVanced + YT + + + Lógó ceanntásca + Réamhshocrú + Rialta + Premium + ReVanced + + ReVanced íosta + Saincheaptha + + + Seachbhóthar srianta réigiún íomhá + Ag baint úsáide as óstach íomhá yt4.ggpht.com + "Óstáil íomhá bhunaidh á úsáid Is féidir le seo íomhánna atá blocáilte i roinnt réigiún a dheisiú" - - - - Cluaisín Baile - - Cluaisín Liostálaí - - Tú cluaisín - Seinmliostaí imreora & moltaí - Torthaí cuardaigh - Mionsamhlacha bunaidh - DeArrow & Mionsamhlacha bunaidh - DeArrow & Gabhálacha fós - Gabhann fós - DeArrow - "Soláthraíonn DeArrow miontaispeántais foinse-phobail do fhíseáin YouTube. Bíonn na miontaispeántais seo níos ábhartha go minic ná na cinn a sholáthraíonn YouTube + + + + Cluaisín Baile + + Cluaisín Liostálaí + + Tú cluaisín + Seinmliostaí imreora & moltaí + Torthaí cuardaigh + Mionsamhlacha bunaidh + DeArrow & Mionsamhlacha bunaidh + DeArrow & Gabhálacha fós + Gabhann fós + DeArrow + "Soláthraíonn DeArrow miontaispeántais foinse-phobail do fhíseáin YouTube. Bíonn na miontaispeántais seo níos ábhartha go minic ná na cinn a sholáthraíonn YouTube Má tá sé cumasaithe, cuirfear URLanna físeán chuig an bhfreastalaí API agus ní sheolfar aon sonraí eile. Má níl aon mhiontaisspeántais DeArrow ag físeán, ansin taispeántar na miontaispeántais bunaidh nó na gafaí fós Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil DeArrow ar fáil - Ní thaispeántar tósta mura bhfuil DeArrow ar fáil - Deirphointe API DeArrow - URL críochphointe taisce mionsamhail DeArrow - Gabhann físeán fós - Tógtar gabhála fós ó thos/lán/deireadh gach físeáin. Tá na híomhánna seo tógtha isteach i YouTube agus ní úsáidtear aon API seachtrach - Úsáid gabhálacha gasta fós - Ag baint úsáide as ardchaighdeán meánach Luchtaítear mionsamhlacha níos gasta, ach d\'fhéadfadh sruthanna beo, físeáin neamh-eisithe nó físeáin an-sean mionsamhlacha bána a thais - Ag baint úsáide as ardchaighdeáin fós gabhálacha - Am físe le gabháil fós a ghlacadh uaidh - Tús an fhíseáin - Lár an fhíseáin - Deireadh an fhíseáin - - Níl DeArrow ar fáil go sealadach (cód stádais: %s) - Níl DeArrow ar fáil go sealadach - - - Taispeáin fógraí ReVanced - Taispeántar fógraí ar thosú - Ní thaispeántar fógraí ar thosú - Taispeáin fógraí ar thosú - Theip ar nascadh le soláthraí fógraí - Díbhe - - - Cumasaigh físeán lúbtha - Lúbfar an físeán - Ní lúbfar an físeán - - - Taispeáin an cnaipe físeáin lúbtha - Taispeántar an cnaipe - Níl an cnaipe ar taispeáint - Tá físeán lúbtha ar siúl - Tá físeán lúbtha as siúl - - - Sos ar chur isteach fuaime - Cuirtear sos ar an athsheinm nuair a sheinneann fuaim eile (m.sh. loingseoireacht) - Laghdaíonn an toirt nuair a sheinneann fuaim eile - - - Toisí gléas a fhalsú - "Toisí na ngléasanna falsaithe + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil DeArrow ar fáil + Ní thaispeántar tósta mura bhfuil DeArrow ar fáil + Deirphointe API DeArrow + URL críochphointe taisce mionsamhail DeArrow + Gabhann físeán fós + Tógtar gabhála fós ó thos/lán/deireadh gach físeáin. Tá na híomhánna seo tógtha isteach i YouTube agus ní úsáidtear aon API seachtrach + Úsáid gabhálacha gasta fós + Ag baint úsáide as ardchaighdeán meánach Luchtaítear mionsamhlacha níos gasta, ach d\'fhéadfadh sruthanna beo, físeáin neamh-eisithe nó físeáin an-sean mionsamhlacha bána a thais + Ag baint úsáide as ardchaighdeáin fós gabhálacha + Am físe le gabháil fós a ghlacadh uaidh + Tús an fhíseáin + Lár an fhíseáin + Deireadh an fhíseáin + + Níl DeArrow ar fáil go sealadach (cód stádais: %s) + Níl DeArrow ar fáil go sealadach + + + Taispeáin fógraí ReVanced + Taispeántar fógraí ar thosú + Ní thaispeántar fógraí ar thosú + Taispeáin fógraí ar thosú + Theip ar nascadh le soláthraí fógraí + Díbhe + + + Cumasaigh físeán lúbtha + Lúbfar an físeán + Ní lúbfar an físeán + + + Taispeáin an cnaipe físeáin lúbtha + Taispeántar an cnaipe + Níl an cnaipe ar taispeáint + Tá físeán lúbtha ar siúl + Tá físeán lúbtha as siúl + + + Sos ar chur isteach fuaime + Cuirtear sos ar an athsheinm nuair a sheinneann fuaim eile (m.sh. loingseoireacht) + Laghdaíonn an toirt nuair a sheinneann fuaim eile + + + Toisí gléas a fhalsú + "Toisí na ngléasanna falsaithe D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" - "Toisí na ngléasanna gan falsaithe + "Toisí na ngléasanna gan falsaithe D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" - Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. - - - Aiseolas haiptice - Athraigh aiseolas haiptice - Díchumasaigh haiptice caibidlí - Tá haiptice caibidlí díchumasaithe - Tá haiptice caibidlí cumasaithe - Díchumasaigh haiptice beacht cuardaigh - Tá haiptice cuardaigh chruinne díchumasaithe - Tá haiptice cuardaigh chruinn cumasaithe - Díchumasaigh haiptice cuardaigh agus cealaithe - Tá haiptice cuardaigh cealaithe díchumasaithe - Tá haiptice cuardaigh cealaithe cumasaithe - Díchumasaigh haiptice súmála - Tá haiptice súmála díchumasaithe - Tá haiptice súmála cumasaithe - - - Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. - - - Seachain atreoruithe URL - Déantar atreoruithe URL a sheachaint - Ní dhéantar seachaint ar atreoruithe URL - - - Oscail naisc sa bhrabhsála - Ag oscailt naisc sa bhrabhsálaí seachtrach - Ag oscailt naisc sa bhrabhsálaí in-aip - - - - Uathoibríoch - Cuimhnigh athruithe ar cháilíocht físe - Baineann athruithe cáilíochta le gach físeán - Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha - Taispeáin tósta ar athruithe cáilíochta físe - Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Cáilíocht físe réamhshocraithe ar líonra Wi-Fi - Cáilíocht físe réamhshocraithe ar líonra soghluaiste - Cuimhnigh ar athruithe cáilíochta Shorts - Baineann athruithe ar an gcáilíocht le gach Shorts - Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha - Cáilíocht réamhshocraithe Shorts ar líonra Wi-Fi - Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste - soghluaiste - Wi-Fi - Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s - Athraíodh cáilíocht Shorts %1$s go: %2$s - - - Taispeáin cnaipe dialóg luais - Taispeántar cnaipe dialóige luais. Tapáil agus coinnigh síos chun luas athsheinm a athshocrú go réamhshocrú - Ní thaispeántar cnaipe dialóige luais - - - Taispeáin cnaipe cáilíochta físeáin - Taispeántar cnaipe cáilíochta físe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe - Ní thaispeántar cnaipe cáilíochta físe - - - Roghchlár luas athsheinm saincheaptha - Taispeántar roghchlár luais saincheaptha - Ní thaispeántar roghchlár luais saincheaptha - Athchóirigh an sean-roghchlár luas athsheinm - Taispeántar an sean-roghchlár luais - Taispeántar roghchlár luais nua-aimseartha - Luas athsheinm saincheaptha - Cuir leis nó athraigh na luasanna athsheinm saincheaptha - Ní mór luas saincheaptha a bheith níos lú ná %s - Luasanna athsheinm saincheaptha neamhbhailí - Uathoibríoch - Luas saincheaptha tapála agus coinnigh - Luas athsheinm eatarthu 0-8 - - - Cuimhnigh athruithe ar luas athsheinm - Baineann athruithe luais athsheinm le gach físeáin - Ní bhaineann athruithe luas athsheinm ach leis an bhfíseán reatha - Taispeáin fógra beag ar athruithe luais athsheinm - Taispeántar fógra beag nuair a athraítear luas réamhshocraithe an athsheinm - Ní thaispeántar fógra nuair a athraítear an luas athsheinm réamhshocraithe. - Luas athsheinm réamhshocraithe - Athraigh luas réamhshocraithe go: %s - - - Díchumasaigh físeán HDR - Tá físeán HDR díchumasaithe - Tá físeán HDR cumasaithe - Fórsa AVC (H.264) - Éigeantar an códóir físeáin go AVC (H.264) - Cinntear an cóideac físe go huathoibríoch - "Sochair: + Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. + + + Aiseolas haiptice + Athraigh aiseolas haiptice + Díchumasaigh haiptice caibidlí + Tá haiptice caibidlí díchumasaithe + Tá haiptice caibidlí cumasaithe + Díchumasaigh haiptice beacht cuardaigh + Tá haiptice cuardaigh chruinne díchumasaithe + Tá haiptice cuardaigh chruinn cumasaithe + Díchumasaigh haiptice cuardaigh agus cealaithe + Tá haiptice cuardaigh cealaithe díchumasaithe + Tá haiptice cuardaigh cealaithe cumasaithe + Díchumasaigh haiptice súmála + Tá haiptice súmála díchumasaithe + Tá haiptice súmála cumasaithe + + + Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. + + + Seachain atreoruithe URL + Déantar atreoruithe URL a sheachaint + Ní dhéantar seachaint ar atreoruithe URL + + + Oscail naisc sa bhrabhsála + Ag oscailt naisc sa bhrabhsálaí seachtrach + Ag oscailt naisc sa bhrabhsálaí in-aip + + + + Uathoibríoch + Cuimhnigh athruithe ar cháilíocht físe + Baineann athruithe cáilíochta le gach físeán + Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha + Taispeáin tósta ar athruithe cáilíochta físe + Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin + Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin + Cáilíocht físe réamhshocraithe ar líonra Wi-Fi + Cáilíocht físe réamhshocraithe ar líonra soghluaiste + Cuimhnigh ar athruithe cáilíochta Shorts + Baineann athruithe ar an gcáilíocht le gach Shorts + Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha + Cáilíocht réamhshocraithe Shorts ar líonra Wi-Fi + Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste + soghluaiste + Wi-Fi + Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s + Athraíodh cáilíocht Shorts %1$s go: %2$s + + + Taispeáin cnaipe dialóg luais + Taispeántar cnaipe dialóige luais. Tapáil agus coinnigh síos chun luas athsheinm a athshocrú go réamhshocrú + Ní thaispeántar cnaipe dialóige luais + + + Taispeáin cnaipe cáilíochta físeáin + Taispeántar cnaipe cáilíochta físe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe + Ní thaispeántar cnaipe cáilíochta físe + + + Roghchlár luas athsheinm saincheaptha + Taispeántar roghchlár luais saincheaptha + Ní thaispeántar roghchlár luais saincheaptha + Athchóirigh an sean-roghchlár luas athsheinm + Taispeántar an sean-roghchlár luais + Taispeántar roghchlár luais nua-aimseartha + Luas athsheinm saincheaptha + Cuir leis nó athraigh na luasanna athsheinm saincheaptha + Ní mór luas saincheaptha a bheith níos lú ná %s + Luasanna athsheinm saincheaptha neamhbhailí + Uathoibríoch + Luas saincheaptha tapála agus coinnigh + Luas athsheinm eatarthu 0-8 + + + Cuimhnigh athruithe ar luas athsheinm + Baineann athruithe luais athsheinm le gach físeáin + Ní bhaineann athruithe luas athsheinm ach leis an bhfíseán reatha + Taispeáin fógra beag ar athruithe luais athsheinm + Taispeántar fógra beag nuair a athraítear luas réamhshocraithe an athsheinm + Ní thaispeántar fógra nuair a athraítear an luas athsheinm réamhshocraithe. + Luas athsheinm réamhshocraithe + Athraigh luas réamhshocraithe go: %s + + + Díchumasaigh físeán HDR + Tá físeán HDR díchumasaithe + Tá físeán HDR cumasaithe + Fórsa AVC (H.264) + Éigeantar an códóir físeáin go AVC (H.264) + Cinntear an cóideac físe go huathoibríoch + "Sochair: • Féadfaidh sé saolré na ceallraí a fheabhsú • Féadfaidh sé réitigh físeáin atá in easnamh a chur ar ais ar ghléasanna níos sine @@ -1669,182 +1668,182 @@ Teorainneacha: • Úsáidfidh athsheinm físeáin níos mó sonraí idirlín ná VP9 nó AV1 • Ní úsáidfidh físeáin HDR AVC • Ní féidir le roinnt gléasanna AVC a bhrú" - - - Taispeáin roghchlár ardcháilíochta físeáin - Taispeántar roghchlár ardcháilíochta físeáin - Ní thaispeántar roghchlár ardcháilíochta físeáin - - - Cumasaigh sleamhnán a lorg - Tá sleamhnán le lorg cumasaithe - Níl sleamhnán le lorg cumasaithe - - - Ceadaigh Android VR AV1 - "Is é an códac físeáin AVC (H.264), VP9, nó AV1 + + + Taispeáin roghchlár ardcháilíochta físeáin + Taispeántar roghchlár ardcháilíochta físeáin + Ní thaispeántar roghchlár ardcháilíochta físeáin + + + Cumasaigh sleamhnán a lorg + Tá sleamhnán le lorg cumasaithe + Níl sleamhnán le lorg cumasaithe + + + Ceadaigh Android VR AV1 + "Is é an códac físeáin AVC (H.264), VP9, nó AV1 D'fhéadfadh go mbeadh fadhbanna le hathsheinm nó go gcaillfí frámaí" - Is é an códac físeáin AVC (H.264) nó VP9 - "D’fhéadfadh sé go n-úsáidfí díchódú bogearraí AV1 agus an socrú seo á chumasú. + Is é an códac físeáin AVC (H.264) nó VP9 + "D’fhéadfadh sé go n-úsáidfí díchódú bogearraí AV1 agus an socrú seo á chumasú. D’fhéadfadh sé go mbeadh stad nó go gcaillfí frámaí ag athsheinm físe le AV1." - Fo-éifeachtaí a fhalsúa - • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith - • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe - • Tá an roghchlár rian fuaime in easnamh - • Níl aon cóideac físe AV1 - • Níl toirt chobhsaí ar fáil - • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid - - • Níl an fuaim bhunaidh iallach ar fáil - Taispeáin i Staitisticí do nerds - Taispeántar cineál an chliaint i Staitisticí do nerds - Tá an cliant curtha i bhfolach i Staitisticí do nerds - - - - - YT Music ReVanced - Music ReVanced - Ceol - - - Maidir - Fógraí - Ginearálta - Seinnteoir - Ilchineálach - - - Folaigh fógraí físeáin - Tá fógraí físeáin i bhfolach - Taispeántar fógraí físeáin - - - Cumasaigh athdhéanamh buan - Tá athrá buan cumasaithe - Tá athrá buan díchumasaithe - - - Folaigh an cnaipe teilgthe - Tá an cnaipe teilgthe i bhfolach - Taispeántar an cnaipe teilgthe - Folaigh cnaipe na staire - Tá cnaipe na staire i bhfolach - Taispeántar cnaipe na staire - Folaigh cnaipe fógraí - Tá cnaipe fógraí i bhfolach - Taispeántar cnaipe fógraí - Folaigh cnaipe cuardaigh - Tá cnaipe cuardaigh i bhfolach - Taispeántar an cnaipe cuardaigh - - - Folaigh an barra catagóirí - Tá an barra catagóirí i bhfolach - Taispeántar an barra catagóirí - - - Athraigh dath an mhion-imreoir - Tá dath an mhion-imreoir ag teacht leis an imreoir lánscáileáin - Úsáideann an mion-imreoir an dath réamhshocraithe - - - Barra nascleanúna - Folaigh nó athraigh cnaipí an bharra nascleanúna - - Folaigh Baile - Tá cnaipe Baile folaithe - Taispeántar an cnaipe baile - - Folaigh Samplaí - Tá cnaipe na samplaí i bhfolach - Taispeántar cnaipe na samplaí - - Folaigh Iniúchadh - Tá an cnaipe iniúchadh i bhfolach - Taispeántar an cnaipe iniúchadh - - Folaigh Leabharlann - Tá cnaipe na leabharlainne i bhfolach - Taispeántar cnaipe na leabharlainne - - Folaigh an tUasghrádú - Tá an cnaipe uasghrádaithe i bhfolach - Taispeántar an cnaipe uasghrádaithe - Folaigh barra nascleanúna - Tá an barra nascleanúna i bhfolach - Taispeántar barra nascleanúna - Folaigh lipéid cnaipí nascleanúna - Tá lipéid i bhfolach - Taispeántar lipéid - - - Folaigh an lipéad \'Faigh Music Premium\' - Tá an lipéad i bhfolach - Taispeántar an lipéad - - - Folaigh an cnaipe uasghrádaithe - Tá an cnaipe i bhfolach - Taispeántar an cnaipe - - - - - Cuir bac ar fógraí fuaime - Cuirtear bac ar fhógraí fuaime - Tá fógraí fuaime díbhlocáilte - - - %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. - Tháinig earráid ar %s, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. - Bloc ar fhógraí físe leabaithe - Díchumasaithe - Proxy lonrúil - Seachfhreastalaí PurpleAdBlock - - - Bloc ar fhógraí físe - Cuirtear bac ar fhógraí físe - Déantar fógraí físe a dhíbhlocáil - - - Teachtaireacht scriosta - Taispeáin teachtaireachtaí scriosta - Ná taispeáin teachtaireachtaí scriosta - Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa - Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach - - - Éiligh Pointí Cainéil go huathoibríoch - Éilítear Pointí Cainéal go huathoibríoch - Ní éilítear Pointí Cainéal go huathoibríoch - - - - Cumasaigh modh dífhabhtú Twitch - Tá modh dífhabhtaithe Twitch cumasaithe (ní mholtar) - Tá modh dífhabhtaithe Twitch díchumasaithe - - - Socruithe ReVanced - Maidir - Maidir ReVanced - Blocáil Fógraí - Socruithe Blocála Fógraí - Comhrá - Socruithe comhrá - Ilchineálach - Socruithe Ilchineálach - Socruithe ginearálta - Socruithe eile - Fógraí taobh an chliaint - Fógraí surestream ar thaobh an fhreastalaí - Tá logaí dífhabhtú cumasaithe - Tá logaí dífhabhtaithe cumasaithe - Tá logaí dífhabhtaithe díchumasaithe - - + Fo-éifeachtaí a fhalsúa + • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith + • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe + • Tá an roghchlár rian fuaime in easnamh + • Níl aon cóideac físe AV1 + • Níl toirt chobhsaí ar fáil + • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid + + • Níl an fuaim bhunaidh iallach ar fáil + Taispeáin i Staitisticí do nerds + Taispeántar cineál an chliaint i Staitisticí do nerds + Tá an cliant curtha i bhfolach i Staitisticí do nerds + + + + + YT Music ReVanced + Music ReVanced + Ceol + + + Maidir + Fógraí + Ginearálta + Seinnteoir + Ilchineálach + + + Folaigh fógraí físeáin + Tá fógraí físeáin i bhfolach + Taispeántar fógraí físeáin + + + Cumasaigh athdhéanamh buan + Tá athrá buan cumasaithe + Tá athrá buan díchumasaithe + + + Folaigh an cnaipe teilgthe + Tá an cnaipe teilgthe i bhfolach + Taispeántar an cnaipe teilgthe + Folaigh cnaipe na staire + Tá cnaipe na staire i bhfolach + Taispeántar cnaipe na staire + Folaigh cnaipe fógraí + Tá cnaipe fógraí i bhfolach + Taispeántar cnaipe fógraí + Folaigh cnaipe cuardaigh + Tá cnaipe cuardaigh i bhfolach + Taispeántar an cnaipe cuardaigh + + + Folaigh an barra catagóirí + Tá an barra catagóirí i bhfolach + Taispeántar an barra catagóirí + + + Athraigh dath an mhion-imreoir + Tá dath an mhion-imreoir ag teacht leis an imreoir lánscáileáin + Úsáideann an mion-imreoir an dath réamhshocraithe + + + Barra nascleanúna + Folaigh nó athraigh cnaipí an bharra nascleanúna + + Folaigh Baile + Tá cnaipe Baile folaithe + Taispeántar an cnaipe baile + + Folaigh Samplaí + Tá cnaipe na samplaí i bhfolach + Taispeántar cnaipe na samplaí + + Folaigh Iniúchadh + Tá an cnaipe iniúchadh i bhfolach + Taispeántar an cnaipe iniúchadh + + Folaigh Leabharlann + Tá cnaipe na leabharlainne i bhfolach + Taispeántar cnaipe na leabharlainne + + Folaigh an tUasghrádú + Tá an cnaipe uasghrádaithe i bhfolach + Taispeántar an cnaipe uasghrádaithe + Folaigh barra nascleanúna + Tá an barra nascleanúna i bhfolach + Taispeántar barra nascleanúna + Folaigh lipéid cnaipí nascleanúna + Tá lipéid i bhfolach + Taispeántar lipéid + + + Folaigh an lipéad \'Faigh Music Premium\' + Tá an lipéad i bhfolach + Taispeántar an lipéad + + + Folaigh an cnaipe uasghrádaithe + Tá an cnaipe i bhfolach + Taispeántar an cnaipe + + + + + Cuir bac ar fógraí fuaime + Cuirtear bac ar fhógraí fuaime + Tá fógraí fuaime díbhlocáilte + + + %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. + Tháinig earráid ar %s, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. + Bloc ar fhógraí físe leabaithe + Díchumasaithe + Proxy lonrúil + Seachfhreastalaí PurpleAdBlock + + + Bloc ar fhógraí físe + Cuirtear bac ar fhógraí físe + Déantar fógraí físe a dhíbhlocáil + + + Teachtaireacht scriosta + Taispeáin teachtaireachtaí scriosta + Ná taispeáin teachtaireachtaí scriosta + Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa + Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach + + + Éiligh Pointí Cainéil go huathoibríoch + Éilítear Pointí Cainéal go huathoibríoch + Ní éilítear Pointí Cainéal go huathoibríoch + + + + Cumasaigh modh dífhabhtú Twitch + Tá modh dífhabhtaithe Twitch cumasaithe (ní mholtar) + Tá modh dífhabhtaithe Twitch díchumasaithe + + + Socruithe ReVanced + Maidir + Maidir ReVanced + Blocáil Fógraí + Socruithe Blocála Fógraí + Comhrá + Socruithe comhrá + Ilchineálach + Socruithe Ilchineálach + Socruithe ginearálta + Socruithe eile + Fógraí taobh an chliaint + Fógraí surestream ar thaobh an fhreastalaí + Tá logaí dífhabhtú cumasaithe + Tá logaí dífhabhtaithe cumasaithe + Tá logaí dífhabhtaithe díchumasaithe + + diff --git a/patches/src/main/resources/addresources/values-gl-rES/strings.xml b/patches/src/main/resources/addresources/values-gl-rES/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-gl-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-gl-rES/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml index 3b4e87f3f4..f9e796069a 100644 --- a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml @@ -17,294 +17,223 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - प्लेबैक समस्याओं को रोकने के लिए क्लाइंट वीडियो स्ट्रीम को स्पूफ करें - - - - - - - - - - - - - - - - - - - + + + प्लेबैक समस्याओं को रोकने के लिए क्लाइंट वीडियो स्ट्रीम को स्पूफ करें + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml index 426dd3a2e8..d18d40cb40 100644 --- a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml +++ b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml @@ -17,295 +17,224 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - Provjere nisu uspjele - - - - - Sačuvaj - - + + + + + + + + Provjere nisu uspjele + + + + Sačuvaj + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 6237727041..01e43dbd55 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -17,1262 +17,1261 @@ "First 'item' text Second \"item\" text" ---> - - - - Alkalmazás neve - - Egyéni - Alkalmazás ikonja - Eredeti - - ReVanced minimális - ReVanced méretezett - - Egyéni - - - Az ellenőrzések sikertelenek - Hivatalos weboldal megnyitása - Mellőzés - <h5>Úgy tűnik, hogy ezt az alkalmazást nem te patchelted.</h5><br>Lehet, hogy az alkalmazás nem fog megfelelően működni, sőt, <b>ártalmas vagy akár veszélyes is lehet a használata</b>.<br><br>Az alábbi ellenőrzések arra utalnak, hogy már előre patchelték az alkalmazást, vagy mástól szerezted be azt:<br><br><small>%1$s</small><br>Ajánlott <b>letörölni és magadnak patchelni</b> az alkalmazást a teljes biztonság érdekében.<p><br>Ha ezt az értesítést mellőzöd, csak kétszer fog megjelenni. - Patchelve egy másik eszközön - Nem a ReVanced Manager telepítette - Több mint 10 perce patchelve - %s napja patchelve - Az APK build dátuma sérült - - - ReVanced Értesítés - A megtekintési előzmények mentése nem történik meg.<br><br>Ezt valószínűleg egy DNS-hirdetésblokkoló vagy hálózati proxy okozza.<br><br>A probléma megoldásához vegye fel az engedélyezőlistára az <b>s.youtube.com</b> domaint vagy kapcsolja ki az összes DNS-blokkolót és proxyt. - Ne jelenjen meg többet - - - Beállítások - Biztosan folytatni szeretné? - Mentés - Visszaállítás - Szín alaphelyzetbe állítása - Érvénytelen szín - Újraindítás szükséges - Indítsa újra az alkalmazást, hogy a változás érvénybe lépjen. - Újraindítás - Importálás - Másolás - A ReVanced beállítások visszaállnak az alapértelmezettre - %d beállítás importálva - Sikertelen importálás: %s - Beállítások keresése - Nincs találat erre: „%s” - Próbáljon ki egy másik kulcsszót - Legutóbbi keresések - Eltávolítja a keresési előzményekből? - Keresési előzmények törlése - Biztosan törölni szeretné az összes keresési előzményt? - Keresési tippek - "• Érintse meg az útvonalat az oda navigáláshoz +--> + + + Alkalmazás neve + + Egyéni + Alkalmazás ikonja + Eredeti + + ReVanced minimális + ReVanced méretezett + + Egyéni + + + Az ellenőrzések sikertelenek + Hivatalos weboldal megnyitása + Mellőzés + <h5>Úgy tűnik, hogy ezt az alkalmazást nem te patchelted.</h5><br>Lehet, hogy az alkalmazás nem fog megfelelően működni, sőt, <b>ártalmas vagy akár veszélyes is lehet a használata</b>.<br><br>Az alábbi ellenőrzések arra utalnak, hogy már előre patchelték az alkalmazást, vagy mástól szerezted be azt:<br><br><small>%1$s</small><br>Ajánlott <b>letörölni és magadnak patchelni</b> az alkalmazást a teljes biztonság érdekében.<p><br>Ha ezt az értesítést mellőzöd, csak kétszer fog megjelenni. + Patchelve egy másik eszközön + Nem a ReVanced Manager telepítette + Több mint 10 perce patchelve + %s napja patchelve + Az APK build dátuma sérült + + + ReVanced Értesítés + A megtekintési előzmények mentése nem történik meg.<br><br>Ezt valószínűleg egy DNS-hirdetésblokkoló vagy hálózati proxy okozza.<br><br>A probléma megoldásához vegye fel az engedélyezőlistára az <b>s.youtube.com</b> domaint vagy kapcsolja ki az összes DNS-blokkolót és proxyt. + Ne jelenjen meg többet + + + Beállítások + Biztosan folytatni szeretné? + Mentés + Visszaállítás + Szín alaphelyzetbe állítása + Érvénytelen szín + Újraindítás szükséges + Indítsa újra az alkalmazást, hogy a változás érvénybe lépjen. + Újraindítás + Importálás + Másolás + A ReVanced beállítások visszaállnak az alapértelmezettre + %d beállítás importálva + Sikertelen importálás: %s + Beállítások keresése + Nincs találat erre: „%s” + Próbáljon ki egy másik kulcsszót + Legutóbbi keresések + Eltávolítja a keresési előzményekből? + Keresési előzmények törlése + Biztosan törölni szeretné az összes keresési előzményt? + Keresési tippek + "• Érintse meg az útvonalat az oda navigáláshoz • Hosszan nyomja meg a beállítást az oda navigáláshoz • Nyomja meg az Entert a keresési lekérdezés előzményekbe mentéséhez • A keresés figyelmen kívül hagyja a kis- és nagybetűket, valamint az írásjeleket • A szülőbeállítások a letiltott gyermekbeállítások felett jelennek meg" - A keresési előzmények üresek - A keresési előzmények mentéséhez írjon be egy keresési lekérdezést, majd nyomja meg az Entert - Beállítások keresési előzményeinek megjelenítése - A beállítások keresési előzményei láthatók - A beállítások keresési előzményei nincsenek megjelenítve - ReVanced beállításikonok megjelenítése - A beállításikonok láthatók - A beállítások ikonjai nem jelennek meg - ReVanced nyelve - "Egyes nyelvek fordításai hiányozhatnak vagy hiányosak lehetnek. + A keresési előzmények üresek + A keresési előzmények mentéséhez írjon be egy keresési lekérdezést, majd nyomja meg az Entert + Beállítások keresési előzményeinek megjelenítése + A beállítások keresési előzményei láthatók + A beállítások keresési előzményei nincsenek megjelenítve + ReVanced beállításikonok megjelenítése + A beállításikonok láthatók + A beállítások ikonjai nem jelennek meg + ReVanced nyelve + "Egyes nyelvek fordításai hiányozhatnak vagy hiányosak lehetnek. Új nyelvek fordításához vagy a meglévő fordítások javításához látogasson el a translate.revanced.app oldalra." - Alkalmazás nyelve - Importálás / exportálás - ReVanced beállítások importálása / exportálása - - A ReVanced Patchek <i>%s<i> verzióját használja - Megjegyzés - Ez a verzió egy előzetes kiadás, és nem kívánt hibákat tapasztalhat - Hivatalos linkek - + A ReVanced Patchek <i>%s<i> verzióját használja + Megjegyzés + Ez a verzió egy előzetes kiadás, és nem kívánt hibákat tapasztalhat + Hivatalos linkek + - - - GmsCore beállítások - A GmsCore beállításai - - MicroG GmsCore nincs telepítve. Telepítse. - Művelet szükséges - "A MicroG GmsCore nem rendelkezik engedéllyel a háttérben történő futáshoz. + + + GmsCore beállítások + A GmsCore beállításai + + MicroG GmsCore nincs telepítve. Telepítse. + Művelet szükséges + "A MicroG GmsCore nem rendelkezik engedéllyel a háttérben történő futáshoz. Kövesse a \"Ne ölj meg az alkalmazásomat\" útmutatót a telefonján, és alkalmazza az utasításokat a MicroG telepítésére. Ez szükséges az alkalmazás működéséhez." - Webhely megnyitása - "A MicroG GmsCore akkumulátor-optimalizálását le kell tiltani a problémák elkerülése érdekében. + Webhely megnyitása + "A MicroG GmsCore akkumulátor-optimalizálását le kell tiltani a problémák elkerülése érdekében. A MicroG akkumulátor-optimalizálásának letiltása nem befolyásolja negatívan az akkumulátor használatát. Kattintson a folytatás gombra, és engedélyezze az optimalizálási módosításokat." - Folytatás - - - Videó streamek hamisítása - A kliens videó streamek hamisítása a lejátszási problémák elkerülése érdekében - Hamis videó stream - "A videó adatfolyamok hamisítva vannak + Folytatás + + + Videó streamek hamisítása + A kliens videó streamek hamisítása a lejátszási problémák elkerülése érdekében + Hamis videó stream + "A videó adatfolyamok hamisítva vannak Ha Ön YouTube Premium felhasználó, ez a beállítás nem feltétlenül szükséges" - "A videó streamek nincsenek hamisítva + "A videó streamek nincsenek hamisítva A lejátszás nem működhet" - Ennek a beállításnak a kikapcsolása lejátszási problémákat okozhat. - Alapértelmezett kliens - - - Eredeti hang kikényszerítése - Eredeti hang használata a hang nyelvén - Alapértelmezett hang használata - - A funkció használatához módosítsa a \"Videóstreamek hamisítása\" beállítást bármely kliensre, kivéve az Android Studiót - - - Hibakeresés - Hibakeresési beállítások engedélyezése vagy letiltása - Hibakeresési naplózás - A hibakeresési naplók engedélyezve vannak - A hibakeresési naplók le vannak tiltva - Naplóverem nyomai - A hibakeresési naplók tartalmazzák a verem nyomkövetését - A hibakeresési naplók nem tartalmazzák a verem nyomkövetését - Üzenet megjelenítése ReVanced hiba esetén - A \"toast\" üzenet jelenik meg, ha hiba történik - Nem jelenik meg \"toast\" üzenet, ha hiba történik - "A hibaüzenetek kikapcsolása elrejti az összes ReVanced hibaértesítést. + Ennek a beállításnak a kikapcsolása lejátszási problémákat okozhat. + Alapértelmezett kliens + + + Eredeti hang kikényszerítése + Eredeti hang használata a hang nyelvén + Alapértelmezett hang használata + + A funkció használatához módosítsa a \"Videóstreamek hamisítása\" beállítást bármely kliensre, kivéve az Android Studiót + + + Hibakeresés + Hibakeresési beállítások engedélyezése vagy letiltása + Hibakeresési naplózás + A hibakeresési naplók engedélyezve vannak + A hibakeresési naplók le vannak tiltva + Naplóverem nyomai + A hibakeresési naplók tartalmazzák a verem nyomkövetését + A hibakeresési naplók nem tartalmazzák a verem nyomkövetését + Üzenet megjelenítése ReVanced hiba esetén + A \"toast\" üzenet jelenik meg, ha hiba történik + Nem jelenik meg \"toast\" üzenet, ha hiba történik + "A hibaüzenetek kikapcsolása elrejti az összes ReVanced hibaértesítést. Nem fog értesülni semmilyen váratlan eseményről." - Hibakeresési naplók exportálása - A ReVanced hibakeresési naplóit a vágólapra másolja - A hibakeresési naplózás ki van kapcsolva - Nem találhatók naplók - Naplók másolva - Nem sikerült exportálni a naplókat: %s - Hibakeresési naplók törlése - Törli az összes tárolt ReVanced hibakeresési naplót - Naplók törölve - Funkciójelzők Manager - Logikai funkciójelzők kezelése - Aktív jelzők (%d) - Blokkolt jelzők (%d) - Jelzők keresése... - Jelzők mentve - Jelzők visszaállítva - Jelzők vágólapra másolva - Napló protokoll puffer - A hibakeresési naplók protopuffert tartalmaznak - A hibakeresési naplók nem tartalmaznak protopuffert - "Ennek a beállításnak az engedélyezése további elrendezési adatokat fog naplózni, beleértve néhány felhasználói felületi komponens képernyőn megjelenő szövegét. + Hibakeresési naplók exportálása + A ReVanced hibakeresési naplóit a vágólapra másolja + A hibakeresési naplózás ki van kapcsolva + Nem találhatók naplók + Naplók másolva + Nem sikerült exportálni a naplókat: %s + Hibakeresési naplók törlése + Törli az összes tárolt ReVanced hibakeresési naplót + Naplók törölve + Funkciójelzők Manager + Logikai funkciójelzők kezelése + Aktív jelzők (%d) + Blokkolt jelzők (%d) + Jelzők keresése... + Jelzők mentve + Jelzők visszaállítva + Jelzők vágólapra másolva + Napló protokoll puffer + A hibakeresési naplók protopuffert tartalmaznak + A hibakeresési naplók nem tartalmaznak protopuffert + "Ennek a beállításnak az engedélyezése további elrendezési adatokat fog naplózni, beleértve néhány felhasználói felületi komponens képernyőn megjelenő szövegét. Ez segíthet azonosítani az összetevőket egyedi szűrők létrehozásakor. Ez a funkció azonban néhány felhasználói adatot is naplóz, például az IP-címét." - - - Megosztási linkek tisztítása - A követési lekérdezési paraméter eltávolításra kerül a megosztott linkekből - A követési lekérdezési paraméter nem kerül eltávolításra a megosztott linkekből - Módosítsa a megosztási linkeket youtube.com-ra - A megosztott linkek a youtube.com-ot használják - A megosztott linkek a music.youtube.com-ot használják - - - Egyedi szűrő - Komponensek elrejtése egyedi szűrők használatával - Egyedi szűrők engedélyezése - Az egyedi szűrő engedélyezve van - Az egyedi szűrő ki van kapcsolva - Egyedi szűrő - - A szűrendő összetevő útvonal építő karakterláncok listája új sorral elválasztva - Érvénytelen egyedi szűrő: %s - - - - - Rólunk - Hirdetések - Alternatív indexképek - Hírfolyam - Általános - Lejátszó - Keresősáv - Csúsztatási vezérlők - Egyéb - Videó - Régi beállítási menük visszaállítása - A régi beállítások menüpontok megjelennek - A régi beállítások menüpontok nem jelennek meg - - - A Shorts háttérben történő lejátszásának letiltása - A Shorts háttérben történő lejátszása le van tiltva - A Shorts háttérben történő lejátszása engedélyezve van - - - Album kártyák elrejtése - Az album kártyák el vannak rejtve - Az album kártyák láthatóak - Előadó kártyák elrejtése - Az előadó kártyák rejtve vannak - A előadó kártyák láthatók - Vágások polc elrejtése - A vágások polc el van rejtve - A részletek polc meg van jelenítve - Közösségi posztok elrejtése - A közösségi bejegyzések el vannak rejtve - A közösségi bejegyzések meg vannak jelenítve - Kompakt szalagképek elrejtése - A kompakt bannerek el vannak rejtve - A kompakt bannerek meg vannak jelenítve - Kibontható kártya elrejtése - A videók alatti kibontható kártya el van rejtve - A videók alatti kibontható kártya meg van jelenítve - Lebegő mikrofon gomb elrejtése - A lebegő mikrofon gomb a keresésben elrejtve - Lebegő mikrofon gomb megjelenik a keresésben - Vízszintes polcok elrejtése - "A vízszintes polcok rejtettek, mint például: + + + Megosztási linkek tisztítása + A követési lekérdezési paraméter eltávolításra kerül a megosztott linkekből + A követési lekérdezési paraméter nem kerül eltávolításra a megosztott linkekből + Módosítsa a megosztási linkeket youtube.com-ra + A megosztott linkek a youtube.com-ot használják + A megosztott linkek a music.youtube.com-ot használják + + + Egyedi szűrő + Komponensek elrejtése egyedi szűrők használatával + Egyedi szűrők engedélyezése + Az egyedi szűrő engedélyezve van + Az egyedi szűrő ki van kapcsolva + Egyedi szűrő + + A szűrendő összetevő útvonal építő karakterláncok listája új sorral elválasztva + Érvénytelen egyedi szűrő: %s + + + + + Rólunk + Hirdetések + Alternatív indexképek + Hírfolyam + Általános + Lejátszó + Keresősáv + Csúsztatási vezérlők + Egyéb + Videó + Régi beállítási menük visszaállítása + A régi beállítások menüpontok megjelennek + A régi beállítások menüpontok nem jelennek meg + + + A Shorts háttérben történő lejátszásának letiltása + A Shorts háttérben történő lejátszása le van tiltva + A Shorts háttérben történő lejátszása engedélyezve van + + + Album kártyák elrejtése + Az album kártyák el vannak rejtve + Az album kártyák láthatóak + Előadó kártyák elrejtése + Az előadó kártyák rejtve vannak + A előadó kártyák láthatók + Vágások polc elrejtése + A vágások polc el van rejtve + A részletek polc meg van jelenítve + Közösségi posztok elrejtése + A közösségi bejegyzések el vannak rejtve + A közösségi bejegyzések meg vannak jelenítve + Kompakt szalagképek elrejtése + A kompakt bannerek el vannak rejtve + A kompakt bannerek meg vannak jelenítve + Kibontható kártya elrejtése + A videók alatti kibontható kártya el van rejtve + A videók alatti kibontható kártya meg van jelenítve + Lebegő mikrofon gomb elrejtése + A lebegő mikrofon gomb a keresésben elrejtve + Lebegő mikrofon gomb megjelenik a keresésben + Vízszintes polcok elrejtése + "A vízszintes polcok rejtettek, mint például: • Friss hírek • Folytassa a megtekintést • Fedezzen fel további csatornákat • Legrelevánsabb • Vásárlás • Nézze meg újra" - A vízszintes polcok láthatók - Képpolc elrejtése - A keresési eredményekben lévő képpolc el van rejtve - A keresési eredményekben lévő képpolc meg van jelenítve - Legutóbbi bejegyzések elrejtése - A legutóbbi bejegyzések rejtve vannak - A legutóbbi bejegyzések láthatóak - Egyveleg lejátszási listák elrejtése - Az egyveleg lejátszási listák el vannak rejtve - Az egyveleg lejátszási listák megjelennek - Filmek szakasz elrejtése - A filmek szakasz el van rejtve - A filmek szakasz látható - - \"Értesítést kérek\" gomb elrejtése - Az „Értesíts” gomb elrejtve - Az „Értesíts” gomb látható - Lejátszható elemek elrejtése - A játékszoba rejtett - A játékszoba megjelenik - - \'Továbbiak megjelenítése\' gomb elrejtése - A „Több megjelenítése” gomb a keresési eredményekben elrejtve - A „Több megjelenítése” gomb a keresési eredményekben látható - Felmérések elrejtése - Felmérések elrejtve - Felmérések megjelenítve - Jegyek polcának elrejtése - A jegyek polca el van rejtve - A jegyek polca látható - - Videóajánló címkék elrejtése - A „Ezt is megnézték” és „Még érdekelhet” címkék a keresési eredményekben elrejtve - A „Ezt is megnézték” és „Még érdekelhet” címkék a keresési eredményekben láthatók - Vizuális távtartó elrejtése - A vizuális távtartó el van rejtve - A vizuális távtartó látható - - YouTube Doodles elrejtése - A YouTube Doodles animáció a logón elrejtve - YouTube Doodles animáció látható a logón - "YouTube Doodles minden évben néhány napig láthatóak. + \'Továbbiak megjelenítése\' gomb elrejtése + A „Több megjelenítése” gomb a keresési eredményekben elrejtve + A „Több megjelenítése” gomb a keresési eredményekben látható + Felmérések elrejtése + Felmérések elrejtve + Felmérések megjelenítve + Jegyek polcának elrejtése + A jegyek polca el van rejtve + A jegyek polca látható + + Videóajánló címkék elrejtése + A „Ezt is megnézték” és „Még érdekelhet” címkék a keresési eredményekben elrejtve + A „Ezt is megnézték” és „Még érdekelhet” címkék a keresési eredményekben láthatók + Vizuális távtartó elrejtése + A vizuális távtartó el van rejtve + A vizuális távtartó látható + + YouTube Doodles elrejtése + A YouTube Doodles animáció a logón elrejtve + YouTube Doodles animáció látható a logón + "YouTube Doodles minden évben néhány napig láthatóak. Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be van kapcsolva, akkor a keresősáv alatti szűrősáv is el lesz rejtve." - Csatornasáv elrejtése - A csatornasáv el van rejtve - A csatornasáv megjelenik - Csatorna vízjel elrejtése - A vízjel el van rejtve - Vízjel látható - Közösségi finanszírozási doboz elrejtése - A közösségi finanszírozási doboz el van rejtve - A közösségi finanszírozási doboz meg van jelenítve - Vészhelyzeti dobozok elrejtése - A vészhelyzeti dobozok el vannak rejtve - A vészhelyzeti dobozok láthatóak - Információs panelek elrejtése - Az információs panelek el vannak rejtve - Az információs táblák meg vannak jelenítve - - Csatlakozás gomb elrejtése - A „Csatlakozás” gomb elrejtve - A „Csatlakozás” gomb látható - Egészségügyi panel elrejtése - Az egészségügyi panelek el vannak rejtve - Az egészségügyi panelek láthatóak - Gyorsműveletek elrejtése - A teljes képernyős gyorsműveletek el vannak rejtve - A teljes képernyős gyorsműveletek meg vannak jelenítve - Kapcsolódó videók elrejtése - A gyorsműveletekben lévő kapcsolódó videók el vannak rejtve - A gyorsműveletekben lévő kapcsolódó videók meg vannak jelenítve - Feliratkozók közösségi irányelveinek elrejtése - A feliratkozók közösségi irányelvei rejtettek - A feliratkozók közösségi irányelvei megjelennek - Időzített reakciók elrejtése - Az időzített reakciók elrejtve - Az időzített reakciók megjelenítve - „AI-generált videó összefoglaló” elrejtése - Az MI által generált videó összefoglaló szakasz elrejtve - AI által generált videó összefoglaló szakasz megjelenítve - Kérdezés elrejtése - A kérdezés szakasz el van rejtve - A kérdezés szakasz megjelenik - Attribútumok elrejtése - A kiemelt helyek, játékok, zene és említett személyek szakaszai rejtettek - A kiemelt helyek, játékok, zene és említett személyek szakaszai láthatók - Fejezetek elrejtése - A fejezetcó szakasz el van rejtve - A fejezetcó szakasz meg van jelenítve - A „Hogyan készült ez a tartalom” elrejtése - A Hogyan készült ez a tartalom szakasz rejtett - A Hogyan készült ez a tartalom szakasz látható - Hype pontok elrejtése - A Hype pontok el vannak rejtve - A Hype pontok láthatóak - A „Podcast felfedezése” elrejtése - A Podcast felfedezése szakasz rejtett - A Podcast felfedezése szakasz látható - Kiemelt hivatkozások elrejtése - A kiemelt linkek szekció rejtett - A kiemelt linkek szekció látható - Kiemelt videók elrejtése - A kiemelt videók szekció rejtett - A kiemelt videók szekció látható - Infó kártyák elrejtése - Az infó kártyák rész el van rejtve - Az infó kártyák rész látható - A „Főbb fogalmak” elrejtése - A Főbb fogalmak szakasz rejtett - A Főbb fogalmak szakasz látható - Feliratkozás gomb elrejtése - A Feliratkozás gomb rejtett - A Feliratkozás gomb látható - Átirat elrejtése - Az átirat rész el van rejtve - Az átirat rész megjelenik - Videóleírás - A videóleírás komponenseinek elrejtése vagy megjelenítése - Szűrősáv - A szűrősáv elrejtése vagy megjelenítése a feedekben, kapcsolódó videókban, keresési eredményekben és a megtekintési előzményekben - Elrejtés a hírcsatornákban - Elrejtve a hírcsatornákban - Megjelenítve a hírcsatornákban - Elrejtés a kapcsolódó videók között - Elrejtve a kapcsolódó videók között - Megjelenik a kapcsolódó videók között - Elrejtés a keresési eredmények között - Elrejtve a keresési eredmények között - Megjelenítve a keresési eredmények között - Elrejtés az előzményekben - Elrejtve a megtekintési előzményekben - Megjelenítve az előzményekben - Csatornaoldal - Csatornaoldal komponenseinek elrejtése vagy megjelenítése - - Közösség gomb elrejtése - A Közösség gomb rejtett - A Közösség gomb látható - - \"Neked\" polc elrejtése - Az Önnek polc el van rejtve - Az Önnek polc meg van jelenítve - - Csatlakozás gomb elrejtése - A Csatlakozás gomb rejtett - A Csatlakozás gomb látható - Hivatkozások előnézetének elrejtése - A hivatkozások előnézete el van rejtve - A hivatkozások előnézete meg van jelenítve - Tagok polcának elrejtése - A tagok polca el van rejtve - Tagok polca látható - - Áruház gomb elrejtése - Az Áruház gomb rejtett - Az Áruház gomb látható - - Feliratkozás gomb elrejtése - A Feliratkozás gomb rejtett - A Feliratkozás gomb látható - Megjegyzések - Megjegyzések rész elrejtése vagy megjelenítése - MI csevegés összefoglaló elrejtése - Az MI csevegés összefoglaló elrejtve - Az MI csevegés összefoglaló megjelenítve - AI-kommentárok összefoglalójának elrejtése - Az MI megjegyzések összefoglaló elrejtve - Az MI megjegyzések összefoglaló megjelenítve - Csatorna irányelveinek elrejtése - A csatorna irányelvei rejtve vannak - A csatorna irányelvei láthatók - A „Tagok megjegyzései” fejléc elrejtése - A tagok hozzászólásainak fejléce rejtett - A tagok hozzászólásainak fejléce látható - A megjegyzések szekció elrejtése - A komment szekció el van rejtve - A megjegyzések szekció megjelenik - Közösségi irányelvek elrejtése - A közösségi irányelvek el vannak rejtve - A közösségi irányelvek meg vannak jelenítve - A „Rövid létrehozása” gomb elrejtése - A Rövidfilm létrehozása gomb rejtett - A Rövidfilm létrehozása gomb látható - Emoji és időbélyeg gombok elrejtése - Az Emoji és időbélyeg gombok elrejtve vannak - Az Emoji és időbélyeg gombok megjelenítve vannak - Megjegyzés előnézet elrejtése - A megjegyzés előnézet el van rejtve - A megjegyzés előnézet megjelenik - Köszönet gomb elrejtése - A köszönet gomb el van rejtve - A köszönet gomb látható - Megtekintések számának elrejtése - A megtekintések száma elrejtve a hírfolyamban és a keresési eredményekben - A megtekintések száma látható a hírfolyamban és a keresési eredményekben - - "Korlátozások: + Csatlakozás gomb elrejtése + A „Csatlakozás” gomb elrejtve + A „Csatlakozás” gomb látható + Egészségügyi panel elrejtése + Az egészségügyi panelek el vannak rejtve + Az egészségügyi panelek láthatóak + Gyorsműveletek elrejtése + A teljes képernyős gyorsműveletek el vannak rejtve + A teljes képernyős gyorsműveletek meg vannak jelenítve + Kapcsolódó videók elrejtése + A gyorsműveletekben lévő kapcsolódó videók el vannak rejtve + A gyorsműveletekben lévő kapcsolódó videók meg vannak jelenítve + Feliratkozók közösségi irányelveinek elrejtése + A feliratkozók közösségi irányelvei rejtettek + A feliratkozók közösségi irányelvei megjelennek + Időzített reakciók elrejtése + Az időzített reakciók elrejtve + Az időzített reakciók megjelenítve + „AI-generált videó összefoglaló” elrejtése + Az MI által generált videó összefoglaló szakasz elrejtve + AI által generált videó összefoglaló szakasz megjelenítve + Kérdezés elrejtése + A kérdezés szakasz el van rejtve + A kérdezés szakasz megjelenik + Attribútumok elrejtése + A kiemelt helyek, játékok, zene és említett személyek szakaszai rejtettek + A kiemelt helyek, játékok, zene és említett személyek szakaszai láthatók + Fejezetek elrejtése + A fejezetcó szakasz el van rejtve + A fejezetcó szakasz meg van jelenítve + A „Hogyan készült ez a tartalom” elrejtése + A Hogyan készült ez a tartalom szakasz rejtett + A Hogyan készült ez a tartalom szakasz látható + Hype pontok elrejtése + A Hype pontok el vannak rejtve + A Hype pontok láthatóak + A „Podcast felfedezése” elrejtése + A Podcast felfedezése szakasz rejtett + A Podcast felfedezése szakasz látható + Kiemelt hivatkozások elrejtése + A kiemelt linkek szekció rejtett + A kiemelt linkek szekció látható + Kiemelt videók elrejtése + A kiemelt videók szekció rejtett + A kiemelt videók szekció látható + Infó kártyák elrejtése + Az infó kártyák rész el van rejtve + Az infó kártyák rész látható + A „Főbb fogalmak” elrejtése + A Főbb fogalmak szakasz rejtett + A Főbb fogalmak szakasz látható + Feliratkozás gomb elrejtése + A Feliratkozás gomb rejtett + A Feliratkozás gomb látható + Átirat elrejtése + Az átirat rész el van rejtve + Az átirat rész megjelenik + Videóleírás + A videóleírás komponenseinek elrejtése vagy megjelenítése + Szűrősáv + A szűrősáv elrejtése vagy megjelenítése a feedekben, kapcsolódó videókban, keresési eredményekben és a megtekintési előzményekben + Elrejtés a hírcsatornákban + Elrejtve a hírcsatornákban + Megjelenítve a hírcsatornákban + Elrejtés a kapcsolódó videók között + Elrejtve a kapcsolódó videók között + Megjelenik a kapcsolódó videók között + Elrejtés a keresési eredmények között + Elrejtve a keresési eredmények között + Megjelenítve a keresési eredmények között + Elrejtés az előzményekben + Elrejtve a megtekintési előzményekben + Megjelenítve az előzményekben + Csatornaoldal + Csatornaoldal komponenseinek elrejtése vagy megjelenítése + + Közösség gomb elrejtése + A Közösség gomb rejtett + A Közösség gomb látható + + \"Neked\" polc elrejtése + Az Önnek polc el van rejtve + Az Önnek polc meg van jelenítve + + Csatlakozás gomb elrejtése + A Csatlakozás gomb rejtett + A Csatlakozás gomb látható + Hivatkozások előnézetének elrejtése + A hivatkozások előnézete el van rejtve + A hivatkozások előnézete meg van jelenítve + Tagok polcának elrejtése + A tagok polca el van rejtve + Tagok polca látható + + Áruház gomb elrejtése + Az Áruház gomb rejtett + Az Áruház gomb látható + + Feliratkozás gomb elrejtése + A Feliratkozás gomb rejtett + A Feliratkozás gomb látható + Megjegyzések + Megjegyzések rész elrejtése vagy megjelenítése + MI csevegés összefoglaló elrejtése + Az MI csevegés összefoglaló elrejtve + Az MI csevegés összefoglaló megjelenítve + AI-kommentárok összefoglalójának elrejtése + Az MI megjegyzések összefoglaló elrejtve + Az MI megjegyzések összefoglaló megjelenítve + Csatorna irányelveinek elrejtése + A csatorna irányelvei rejtve vannak + A csatorna irányelvei láthatók + A „Tagok megjegyzései” fejléc elrejtése + A tagok hozzászólásainak fejléce rejtett + A tagok hozzászólásainak fejléce látható + A megjegyzések szekció elrejtése + A komment szekció el van rejtve + A megjegyzések szekció megjelenik + Közösségi irányelvek elrejtése + A közösségi irányelvek el vannak rejtve + A közösségi irányelvek meg vannak jelenítve + A „Rövid létrehozása” gomb elrejtése + A Rövidfilm létrehozása gomb rejtett + A Rövidfilm létrehozása gomb látható + Emoji és időbélyeg gombok elrejtése + Az Emoji és időbélyeg gombok elrejtve vannak + Az Emoji és időbélyeg gombok megjelenítve vannak + Megjegyzés előnézet elrejtése + A megjegyzés előnézet el van rejtve + A megjegyzés előnézet megjelenik + Köszönet gomb elrejtése + A köszönet gomb el van rejtve + A köszönet gomb látható + Megtekintések számának elrejtése + A megtekintések száma elrejtve a hírfolyamban és a keresési eredményekben + A megtekintések száma látható a hírfolyamban és a keresési eredményekben + + "Korlátozások: • Shorts polcok, csatornaoldalak és a keresési eredmények továbbra is mutathatják a megtekintések számát • Ez a funkció nem működik autóipari formátummal" - Feltöltési idő elrejtése - A feltöltési idő el van rejtve a hírfolyamban és a keresési eredményekben - A feltöltési idő megjelenik a hírfolyamban és a keresési eredményekben - - "Korlátozások: + Feltöltési idő elrejtése + A feltöltési idő el van rejtve a hírfolyamban és a keresési eredményekben + A feltöltési idő megjelenik a hírfolyamban és a keresési eredményekben + + "Korlátozások: • Shorts polcokon, csatornaoldalakon és keresési eredményekben továbbra is megjelenhetnek a feltöltési idők • Ez a funkció nem működik az autós formátummal" - Kulcsszó alapú tartalom elrejtés - Kulcsszó alapú videó elrejtés keresésnél és a feedekben - Videók elrejtése a kezdőlapon kulcsszavak alapján - A videók a kezdőlapon kulcsszavak alapján szűrve - A videók a kezdőlapon nincsenek szűrve - Keresési eredmények elrejtése kulcsszavak alapján - A keresési eredmények kulcsszavak alapján szűrve - A keresési eredmények nincsenek szűrve - Videók elrejtése a feliratkozások lapon kulcsszavak alapján - A videók a feliratkozások lapon kulcsszavak alapján szűrve - A videók a feliratkozások lapon nincsenek szűrve - Elrejtendő kulcsszavak - - "Kulcsszavak és kifejezések a rejtéshez, új sorokkal elválasztva + "Kulcsszavak és kifejezések a rejtéshez, új sorokkal elválasztva Kulcsszavak lehetnek csatorna nevek vagy bármilyen szöveg, amely videó címekben szerepel Nagybetűs szavakat a középső betűkkel együtt kell megadni (pl.: iPhone, TikTok, LeBlanc)" - A kulcsszó alapú szűrésről - "A kezdőlap/előfizetések/keresési eredmények szűrve vannak, hogy elrejtsék a kulcsszó-kifejezéseknek megfelelő tartalmat + A kulcsszó alapú szűrésről + "A kezdőlap/előfizetések/keresési eredmények szűrve vannak, hogy elrejtsék a kulcsszó-kifejezéseknek megfelelő tartalmat Korlátozások • A Shorts nem rejthető el csatorna névvel • Egyes felület elemek nem rejtőknek el • A kulcsszó keresése nem eredményezhet eredményt" - Párosítson egész szavakat - - Ha egy kulcsszót/kifejezést dupla idézőjelekkel vesz körül, akkor elkerülhető a videócímek és a csatornanevek részleges egyezése<br><br>Például:<br><b>\"ai\"</b> elrejti a videót: <b>Hogyan működik az AI?</b><br>de nem rejti el: <b>Mit jelent a fair use?</b> - - Nem használható kulcsszó: %s - Adjon hozzá idézeteket a következő kulcsszóhoz: %s - A kulcsszónak ütköző deklarációi vannak: %s - A kulcsszó túl rövid, és idézőjeleket igényel: %s - A kulcsszó elrejti az összes videót: %s - - - Alkotói áruház polcának elrejtése - Az alkotói bolt polc a videólejátszó alatt elrejtve - Alkotói bolti polc látható a videólejátszó alatt - A befejező képernyőn lévő üzletbanner elrejtése - A végképernyő bolt banner elrejtve - A végképernyő bolt banner látható - Teljes képernyős hirdetések elrejtése - "A teljes képernyős hirdetések el vannak rejtve + Párosítson egész szavakat + + Ha egy kulcsszót/kifejezést dupla idézőjelekkel vesz körül, akkor elkerülhető a videócímek és a csatornanevek részleges egyezése<br><br>Például:<br><b>\"ai\"</b> elrejti a videót: <b>Hogyan működik az AI?</b><br>de nem rejti el: <b>Mit jelent a fair use?</b> + + Nem használható kulcsszó: %s + Adjon hozzá idézeteket a következő kulcsszóhoz: %s + A kulcsszónak ütköző deklarációi vannak: %s + A kulcsszó túl rövid, és idézőjeleket igényel: %s + A kulcsszó elrejti az összes videót: %s + + + Alkotói áruház polcának elrejtése + Az alkotói bolt polc a videólejátszó alatt elrejtve + Alkotói bolti polc látható a videólejátszó alatt + A befejező képernyőn lévő üzletbanner elrejtése + A végképernyő bolt banner elrejtve + A végképernyő bolt banner látható + Teljes képernyős hirdetések elrejtése + "A teljes képernyős hirdetések el vannak rejtve Ez a funkció csak régebbi eszközökön érhető el" - A teljes képernyős hirdetések láthatók - - A teljes képernyős hirdetések elrejtése csak régebbi eszközökön működik - Általános hirdetések elrejtése - Az általános hirdetések el vannak rejtve - Az általános hirdetések megjelennek - Áruszalaghirdetések elrejtése - Az áruszalaghirdetések el vannak rejtve - Az áruszalaghirdetések megjelennek - Fizetett promóció címke elrejtése - A fizetett promóciós címke el van rejtve - A fizetett promóciós címke meg van jelenítve - Önpromóciós kártyák elrejtése - Az önpromóciós kártyák rejtve vannak - Az önpromóciós kártyák megjelennek - Vásárlási hivatkozások elrejtése - A vásárlási linkek a videó leírásában elrejtve - Vásárlási linkek láthatók a videó leírásában - A „Termékek megtekintése” szalaghirdetés elrejtése - A „Termékek megtekintése” banner a videó átfedésében elrejtve - A „Termékek megtekintése” banner a videó átfedésében látható - Webes keresési találatok elrejtése - A webes keresési találatok rejtve vannak - A webes keresési találatok megjelennek - - - YouTube Premium promóciók elrejtése - A YouTube Premium promóciók a videólejátszó alatt el vannak rejtve - A YouTube Premium promóciók a videólejátszó alatt láthatók - - - Videó hirdetések elrejtése - A videó hirdetések el vannak rejtve - A videó hirdetések láthatók - - - Az URL a vágólapra másolva - Az URL időbélyeggel a vágólapra másolva - A videó URL másolása gomb megjelenítése - A videó URL másolása gomb látható. Koppintással másolhatja a videó URL-jét. Koppintson és tartsa lenyomva az időbélyeggel való másoláshoz - A videó URL másolása gomb nem látható - A videó URL másolása időbélyeggel gomb megjelenítése - Az időbélyeges URL másolása gomb látható. Koppintással másolhatja a videó URL-jét időbélyeggel. Koppintson és tartsa lenyomva az időbélyeg nélküli másoláshoz - Az időbélyeges URL másolása gomb nem látható - - - Távolítsa el a nézői diszkréciós párbeszédpanelt - A párbeszédpanel el lesz rejtve - A párbeszédpanel megjelenik - Ez nem kerüli meg a korhatárt, csak automatikusan elfogadja. - - - A \"Bejelentkezés TV-re\" felugró ablak letiltása - A TV-bejelentkezési előugró ablak le van tiltva - A TV-bejelentkezési előugró ablak engedélyezve van - - - Dupla koppintásos fejezetátugrás letiltása - A dupla koppintás soha nem indíthatja el a következő/előző fejezetre való ugrást - A dupla koppintás alkalmanként elindíthatja a következő/előző fejezetre való ugrást - - - Külső letöltések - Beállítások külső letöltő használatához - Külső letöltés gomb megjelenítése - A letöltés gomb látható a lejátszóban - A letöltés gomb nem látható a lejátszóban - - A Letöltés művelet gomb felülírása - A letöltés gomb a külső letöltőt nyitja meg - A letöltés gomb az alkalmazáson belüli letöltőt használja - Letöltő csomag neve - A telepített külső letöltő alkalmazásod csomagneve - Adja meg a csomagnevet - Egyéb - Az alkalmazás nincs telepítve - %s nincs telepítve. Kérjük telepítse. - "Nem található telepített alkalmazás a(z) %s csomagnévvel + A teljes képernyős hirdetések láthatók + + A teljes képernyős hirdetések elrejtése csak régebbi eszközökön működik + Általános hirdetések elrejtése + Az általános hirdetések el vannak rejtve + Az általános hirdetések megjelennek + Áruszalaghirdetések elrejtése + Az áruszalaghirdetések el vannak rejtve + Az áruszalaghirdetések megjelennek + Fizetett promóció címke elrejtése + A fizetett promóciós címke el van rejtve + A fizetett promóciós címke meg van jelenítve + Önpromóciós kártyák elrejtése + Az önpromóciós kártyák rejtve vannak + Az önpromóciós kártyák megjelennek + Vásárlási hivatkozások elrejtése + A vásárlási linkek a videó leírásában elrejtve + Vásárlási linkek láthatók a videó leírásában + A „Termékek megtekintése” szalaghirdetés elrejtése + A „Termékek megtekintése” banner a videó átfedésében elrejtve + A „Termékek megtekintése” banner a videó átfedésében látható + Webes keresési találatok elrejtése + A webes keresési találatok rejtve vannak + A webes keresési találatok megjelennek + + + YouTube Premium promóciók elrejtése + A YouTube Premium promóciók a videólejátszó alatt el vannak rejtve + A YouTube Premium promóciók a videólejátszó alatt láthatók + + + Videó hirdetések elrejtése + A videó hirdetések el vannak rejtve + A videó hirdetések láthatók + + + Az URL a vágólapra másolva + Az URL időbélyeggel a vágólapra másolva + A videó URL másolása gomb megjelenítése + A videó URL másolása gomb látható. Koppintással másolhatja a videó URL-jét. Koppintson és tartsa lenyomva az időbélyeggel való másoláshoz + A videó URL másolása gomb nem látható + A videó URL másolása időbélyeggel gomb megjelenítése + Az időbélyeges URL másolása gomb látható. Koppintással másolhatja a videó URL-jét időbélyeggel. Koppintson és tartsa lenyomva az időbélyeg nélküli másoláshoz + Az időbélyeges URL másolása gomb nem látható + + + Távolítsa el a nézői diszkréciós párbeszédpanelt + A párbeszédpanel el lesz rejtve + A párbeszédpanel megjelenik + Ez nem kerüli meg a korhatárt, csak automatikusan elfogadja. + + + A \"Bejelentkezés TV-re\" felugró ablak letiltása + A TV-bejelentkezési előugró ablak le van tiltva + A TV-bejelentkezési előugró ablak engedélyezve van + + + Dupla koppintásos fejezetátugrás letiltása + A dupla koppintás soha nem indíthatja el a következő/előző fejezetre való ugrást + A dupla koppintás alkalmanként elindíthatja a következő/előző fejezetre való ugrást + + + Külső letöltések + Beállítások külső letöltő használatához + Külső letöltés gomb megjelenítése + A letöltés gomb látható a lejátszóban + A letöltés gomb nem látható a lejátszóban + + A Letöltés művelet gomb felülírása + A letöltés gomb a külső letöltőt nyitja meg + A letöltés gomb az alkalmazáson belüli letöltőt használja + Letöltő csomag neve + A telepített külső letöltő alkalmazásod csomagneve + Adja meg a csomagnevet + Egyéb + Az alkalmazás nincs telepítve + %s nincs telepítve. Kérjük telepítse. + "Nem található telepített alkalmazás a(z) %s csomagnévvel Ellenőrizze, hogy a csomagnév helyes-e és az alkalmazás telepítve van-e" - A csomagnév nem lehet üres - - - Pontos keresési kézmozdulat letiltása - A kézmozdulat letiltva - A kézmozdulat engedélyezve - - - Érintésre keresés engedélyezése - A koppintással történő keresés engedélyezve van - Az érintésre keresés le van tiltva - - - Fényerő kézmozdulat engedélyezése - "A teljes képernyős fényerő-húzás engedélyezve + A csomagnév nem lehet üres + + + Pontos keresési kézmozdulat letiltása + A kézmozdulat letiltva + A kézmozdulat engedélyezve + + + Érintésre keresés engedélyezése + A koppintással történő keresés engedélyezve van + Az érintésre keresés le van tiltva + + + Fényerő kézmozdulat engedélyezése + "A teljes képernyős fényerő-húzás engedélyezve A fényerő beállítása a képernyő bal oldalán történő függőleges húzással" - A teljes képernyős fényerő-húzás le van tiltva - Hangerő kézmozdulat engedélyezése - "A teljes képernyős hangerőhúzás engedélyezve van + A teljes képernyős fényerő-húzás le van tiltva + Hangerő kézmozdulat engedélyezése + "A teljes képernyős hangerőhúzás engedélyezve van A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be" - A teljes képernyős hangerőhúzás le van tiltva - Csúsztatáshoz nyomva tartás engedélyezése - A csúsztatáshoz nyomva tartás engedélyezve - A csúsztatáshoz nyomva tartás le van tiltva - Haptikus visszajelzés engedélyezése - A haptikus visszajelzés engedélyezve van - A haptikus visszajelzés le van tiltva - Fényerő mentése és visszaállítása - A fényerő mentése és visszaállítása teljes képernyőből való kilépéskor vagy belépéskor - Ne mentse és állítsa vissza a fényerőt, amikor kilép vagy belép a teljes képernyőbe - Auto fényerő gesztus engedélyezése - A fényerő kézmozdulat legalacsonyabb értékig csúsztatása engedélyezi az auto fényerőt - A legalacsonyabb értékig csúsztatás nem engedélyezi az auto fényerőt - Automatikus - Csúsztatási átfedés időkorlátja - Az átfedés láthatóságának időtartama ezredmásodpercben - Az áthúzás átfedésének átlátszósága - Az átlátszóság értéke 0-100 között legyen - A csúsztatás átlátszóságának 0 és 100 között kell lennie - A húzással előhívható fedőréteg fényerejének színe - A fényerő-szabályozókhoz tartozó folyamatjelző sáv színe - A húzással előhívható fedőréteg hangerejének színe - A hangerő-szabályozókhoz tartozó folyamatjelző sáv színe - Áthúzás fedvény szövegmérete - Az áthúzás fedvény szövegmérete 1-30 között - A szövegméretnek 1-30 között kell lennie - A csúsztatás küszöbértéke - A csúsztatáshoz szükséges küszöbérték - Hangerő-görgetés érzékenysége - Mennyit változzon a hangerő görgetésenként - Áthúzásos fedvény stílusa - Vízszintes fedvény - Vízszintes fedvény (minimalista – felül) - Vízszintes fedvény (minimalista – középen) - Körkörös fedvény - Körkörös fedvény (minimalista) - Függőleges fedvény - Függőleges fedvény (minimalista) - Engedélyezze az ujjbegyújtással történő videóváltást - Teljes képernyős módban történő ujjbegyújtás megváltoztatja a következő/előző videóra - Teljes képernyős módban történő ujjbegyújtás nem változtatja meg a következő/előző videóra - - - Automatikus feliratok letiltása - Az automatikus feliratok ki vannak kapcsolva - Az automatikus feliratok be vannak kapcsolva - - - Művelet gombok - Gombok megjelenítése vagy elrejtése a videók alatt - A Tetszik és Iratkozz fel gomb fényének kikapcsolása - A Tetszik és Iratkozz fel gombok nem világítanak, ha megemlítik őket - A Tetszik és Iratkozz fel gombok világítanak, ha megemlítik őket - Tetszik és nem tetszik elrejtése - A tetszik és nem tetszik gombok rejtve vannak - A tetszik és nem tetszik gombok láthatóak - - Megosztás elrejtése - A megosztás gomb el van rejtve - A megosztás gomb látható - - Hirdetések leállítása elrejtése - A hirdetésleállítás gomb rejtett - A hirdetésleállítás gomb látható - - Hozzászólások elrejtése - A hozzászólások gomb rejtve van - A hozzászólások gomb látható - + Megosztás elrejtése + A megosztás gomb el van rejtve + A megosztás gomb látható + + Hirdetések leállítása elrejtése + A hirdetésleállítás gomb rejtett + A hirdetésleállítás gomb látható + + Hozzászólások elrejtése + A hozzászólások gomb rejtve van + A hozzászólások gomb látható + - Bejelentés elrejtése - A bejelentés gomb el van rejtve - A bejelentés gomb látható - - Remix elrejtése - A remix gomb el van rejtve - A remix gomb megjelenik - - Letöltés elrejtése - A letöltés gomb el van rejtve - A letöltés gomb látható - + Remix elrejtése + A remix gomb el van rejtve + A remix gomb megjelenik + + Letöltés elrejtése + A letöltés gomb el van rejtve + A letöltés gomb látható + - Aktivitás elrejtése - A Hype gomb rejtett - A hype gomb látható - - Promóció elrejtése - A promóció gomb el van rejtve - A promóció gomb látható - - Köszönet elrejtése - A köszönet gomb el van rejtve - A köszönet gomb látható - + Promóció elrejtése + A promóció gomb el van rejtve + A promóció gomb látható + + Köszönet elrejtése + A köszönet gomb el van rejtve + A köszönet gomb látható + - Ask elrejtése - Az Ask gomb el van rejtve - Az Ask gomb látható - - Vágás gomb elrejtése - A klip gomb el van rejtve - A klip gomb látható - - Bolt elrejtése - A Bolt gomb elrejtve - A Bolt gomb látható - - Mentés elrejtése - A mentés gomb rejtett - A mentés gomb látható - - - Navigációs gombok - Gombok elrejtése vagy módosítása a navigációs sávon - - Kezdőlap elrejtése - A kezdőlap gomb elrejtve - A kezdőlap gomb látható - - Shorts elrejtése - A shorts gomb rejtve van - A shorts gomb látható - - Létrehozás elrejtése - A létrehozás gomb el van rejtve - A létrehozás gomb látható - - Feliratkozások elrejtése - A feliratkozások gomb el van rejtve - A feliratkozások gomb megjelenítve - Értesítések elrejtése - Az értesítések gomb rejtve van - Az értesítések gomb megjelenik - - Létrehozás felcserélése az értesítésekkel - "A Létrehozás gomb kicserélve az Értesítések gombbal + Ask elrejtése + Az Ask gomb el van rejtve + Az Ask gomb látható + + Vágás gomb elrejtése + A klip gomb el van rejtve + A klip gomb látható + + Bolt elrejtése + A Bolt gomb elrejtve + A Bolt gomb látható + + Mentés elrejtése + A mentés gomb rejtett + A mentés gomb látható + + + Navigációs gombok + Gombok elrejtése vagy módosítása a navigációs sávon + + Kezdőlap elrejtése + A kezdőlap gomb elrejtve + A kezdőlap gomb látható + + Shorts elrejtése + A shorts gomb rejtve van + A shorts gomb látható + + Létrehozás elrejtése + A létrehozás gomb el van rejtve + A létrehozás gomb látható + + Feliratkozások elrejtése + A feliratkozások gomb el van rejtve + A feliratkozások gomb megjelenítve + Értesítések elrejtése + Az értesítések gomb rejtve van + Az értesítések gomb megjelenik + + Létrehozás felcserélése az értesítésekkel + "A Létrehozás gomb kicserélve az Értesítések gombbal Megjegyzés: Ez a beállítás a videóhirdetések kényszerű elrejtését is magában foglalja" - A létrehozás gomb nincs felcserélve az értesítések gombbal - "Ennek a beállításnak a letiltása a Shorts hirdetések blokkolását is letiltja. + A létrehozás gomb nincs felcserélve az értesítések gombbal + "Ennek a beállításnak a letiltása a Shorts hirdetések blokkolását is letiltja. Ha a beállítás módosítása nem lép életbe, próbáljon meg Inkognitó módra váltani." - A navigációs gombok címkéinek elrejtése - A címke el vannak rejtve - A címke meg vannak jelenítve - Átlátszó állapotsor letiltása - Az állapotsor nem áttetsző - Az állapotsor nem áttetsző vagy áttetsző - Egyes eszközökön ennek a funkciónak az engedélyezése átlátszóvá teheti a rendszer navigációs sávját. - Világos, átlátszó sáv letiltása - Világos módban az átlátszó navigációs sáv átlátszatlan - A világos módú navigációs sáv nem áttetsző vagy áttetsző - Sötét áttetsző sáv letiltása - Sötét módban az átlátszó navigációs sáv átlátszatlan - A sötét módú navigációs sáv nem áttetsző vagy áttetsző - - - Előugró menü - A lejátszó előugró menüpontjainak elrejtése vagy megjelenítése - - Feliratok elrejtése - A feliratok menü el van rejtve - A feliratok menü megjelenítve - - További beállítások elrejtése - A további beállítások menü el van rejtve - A további beállítások menü látható - - Elalvási időzítő elrejtése - Az elalváskapcsoló menüje el van rejtve - Megjelenik az elalvásidőzítő menü - - Videó folyamatos ismétlése menü elrejtése - A videó folyamatos ismétlése menü el van rejtve - A videó folyamatos ismétlése menü látható - - Mozifilmes világítás elrejtése - A mozifilmes világítás menü el van rejtve - A mozifilmes világítás menü látható - Stabil hangerő elrejtése - Megjelenik a Stabil hangerő menü - A Stabil hangerő menü el van rejtve - - Súgó és visszajelzés elrejtése - A súgó és visszajelzés menü elrejtve - A súgó és visszajelzés menü megjelenítve - - Lejátszási sebesség elrejtése - A lejátszási sebesség menü el van rejtve - A lejátszási sebesség menü látható - - Lezárási képernyő elrejtése - A lezárási képernyő menü el van rejtve - A lezárási képernyő menü megjelenik - - \"Meghallgatás YouTube Music alkalmazással\" elrejtése - A(z) \"Meghallgatás YouTube Music alkalmazással\" menü rejtett - A(z) \"Meghallgatás YouTube Music alkalmazással\" menü megjelenítve - - Hangsáv elrejtése - A hangsáv menü el van rejtve - A hangsáv menü megjelenik - + Feliratok elrejtése + A feliratok menü el van rejtve + A feliratok menü megjelenítve + + További beállítások elrejtése + A további beállítások menü el van rejtve + A további beállítások menü látható + + Elalvási időzítő elrejtése + Az elalváskapcsoló menüje el van rejtve + Megjelenik az elalvásidőzítő menü + + Videó folyamatos ismétlése menü elrejtése + A videó folyamatos ismétlése menü el van rejtve + A videó folyamatos ismétlése menü látható + + Mozifilmes világítás elrejtése + A mozifilmes világítás menü el van rejtve + A mozifilmes világítás menü látható + Stabil hangerő elrejtése + Megjelenik a Stabil hangerő menü + A Stabil hangerő menü el van rejtve + + Súgó és visszajelzés elrejtése + A súgó és visszajelzés menü elrejtve + A súgó és visszajelzés menü megjelenítve + + Lejátszási sebesség elrejtése + A lejátszási sebesség menü el van rejtve + A lejátszási sebesség menü látható + + Lezárási képernyő elrejtése + A lezárási képernyő menü el van rejtve + A lezárási képernyő menü megjelenik + + \"Meghallgatás YouTube Music alkalmazással\" elrejtése + A(z) \"Meghallgatás YouTube Music alkalmazással\" menü rejtett + A(z) \"Meghallgatás YouTube Music alkalmazással\" menü megjelenítve + + Hangsáv elrejtése + A hangsáv menü el van rejtve + A hangsáv menü megjelenik + - "A hangsáv menü elrejtve van + "A hangsáv menü elrejtve van A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamisítása\" beállítást \"Android No SDK\" értékre" - - \"Megtekintés VR-módban\" elrejtése - A megtekintés VR-módban menü el van rejtve - A „Megtekintés VR-módban” menü megjelenik - Videóminőség menü elrejtése - A videóminőség menü elrejtve - A videóminőség menü megjelenítve - A videóminőség menü láblécének elrejtése - A videóminőség menü lábléce el van rejtve - Megjelenik a videóminőség menü lábléce - - - Automatikus lejátszás gomb elrejtése - Az automatikus lejátszás gomb el van rejtve - Az automatikus lejátszás gomb látható - - Felirat gomb elrejtése - A feliratok gomb el van rejtve - A feliratok gomb látható - Küldés gomb elrejtése - Az átküldés gomb rejtve van - Az átküldés gomb látható - Lejátszóvezérlők hátterének elrejtése - A lejátszóvezérlők háttere rejtett - A lejátszóvezérlők háttere látható - Az Előző és a Következő gombok elrejtése - A gombok elrejtve - A gombok megjelennek - - - Záróképernyő kártyák elrejtése - A záróképernyő kártyák el vannak rejtve - A záróképernyő kártyák megjelennek - - - Ambient mód letiltása teljes képernyős módban - Mozifilmes világítás kikapcsolva - Mozifilmes világítás engedélyezve - - - Infó kártyák elrejtése - Az info kártyák el vannak rejtve - Az info kártyák megjelennek - - - Gördülőszám-animációk letiltása - A gördülő számok nem animáltak - A gördülő számok animálva vannak - - - Videólejátszó keresősáv elrejtése - A videólejátszó folyamatsávja el van rejtve - A videólejátszó folyamatsávja megjelenik - - Videó miniatűrök keresősávjának elrejtése - A videó miniatűrök keresősávja elrejtve - A videó miniatűrök keresősávja megjelenítve - - - Shorts lejátszó - A Shorts lejátszó komponensek elrejtése vagy megjelenítése - - Shorts videók elrejtése a Főoldali hírcsatornából - Elrejtve a Főoldali hírcsatornából és a kapcsolódó videókból - Látható a Főoldali hírcsatornában és a kapcsolódó videókban - Shortsok elrejtése a keresési eredményekben - A keresési eredmények között elrejtve - Megjelenik a keresési eredmények között - - Shorts videók elrejtése a Feliratkozások hírcsatornából - Elrejtve a Feliratkozások hírcsatornából - Látható a Feliratkozások hírcsatornában - Shorts elrejtése a megtekintési előzményekben - Elrejtve a megtekintési előzményekben - Megjelenik a megtekintési előzményekben - Az \"Automatikusan szinkronizált\" címke elrejtése - Az automatikus szinkronizálás címke rejtett - Az automatikus szinkronizálás címke megjelenik - A \"Super Thanks vásárlása\" gomb elrejtése - A „Super Thanks vásárlása” gomb elrejtve - A „Super Thanks vásárlása” gomb látható - Effekt gomb elrejtése - Az effekt gomb el van rejtve - Az effekt gomb látható - A \"Zöld háttér\" gomb elrejtése - A zöld képernyő gomb el van rejtve - A zöld képernyő gomb látható - A hashtag gomb elrejtése - A Hashtag gomb el van rejtve - A Hashtag gomb látható - - Csatlakozás gomb elrejtése - A csatlakozás gomb el van rejtve - A csatlakozás gomb meg van jelenítve - Élő előnézet elrejtése - Az élő előnézet rejtve van - Az élő előnézet látható - Helycímke elrejtése - A helycízke címke el van rejtve - A helycízke címke meg van jelenítve - Az \"Új bejegyzések\" gomb elrejtése - Az új bejegyzések gomb rejtve van - Az új bejegyzések gomb megjelenik - Szüneteltetett fedő gombok elrejtése - A szüneteltetett fedő gombok el vannak rejtve - A szüneteltetett fedő gombok megjelennek - Elrejtés előnézeti megjegyzés - Az előnézeti megjegyzés rejtve van - Megjelenik a megjegyzés előnézete - A \"Zene mentése\" gomb elrejtése - A zene mentés gomb el van rejtve - A zene mentés gomb látható - Keresési javaslatok elrejtése - A keresési javaslatok el vannak rejtve - A keresési javaslatok meg vannak jelenítve - Shop gomb elrejtése - A vásárlás gomb el van rejtve - A vásárlás gomb látható - Matricák elrejtése - A matricák el vannak rejtve - A matricák láthatóak - Feliratkozás gomb elrejtése - A feliratkozás gomb el van rejtve - A feliratkozás gomb látható - Címkézett termékek elrejtése - A megjelölt termékek el vannak rejtve - A megjelölt termékek meg vannak jelenítve - Következő videó gomb elrejtése - A közelgő gomb el van rejtve - Megjelenik a Közelgő gomb - Az \"Ez a hang használata\" gomb elrejtése - A \"Hang használata\" gomb el van rejtve - A \"Hang használata\" gomb látható - Az \"Ez a sablon használata\" gomb elrejtése - A \"Sablon használata\" gomb el van rejtve - A „Sablon használata” gomb látható - Tetszik gomb szökőkút animációjának elrejtése - A Like gomb szökőkút animáció el van rejtve - A Like gomb szökőkút animáció látható - Tetszik gomb elrejtése - A tetszik gomb elrejtve - A tetszik gomb megjelenik - Nem tetszik gomb elrejtése - A nem tetszik gomb elrejtve - A nem tetszik gomb látható - Hozzászólások gomb elrejtése - A megjegyzések gomb el van rejtve - A megjegyzések gomb megjelenik - - Megosztás gomb elrejtése - A megosztás gomb el van rejtve - A megosztás gomb látható - - Remix gomb elrejtése - A remix gomb el van rejtve - A remix gomb megjelenik - Hang gomb elrejtése - A hang gomb el van rejtve - A hang gomb megjelenik - Infó panel elrejtése - Az infó panel rejtett - Az infó panel megjelenik - Csatornasáv elrejtése - A csatornasáv el van rejtve - A csatornasáv megjelenik - Videó címének elrejtése - A videócím elrejtve - A videócím látható - Hang metaadatcímke elrejtése - A hang metaadat címke elrejtve - A hang metaadat címke látható - Videóhivatkozás címkéjének elrejtése - A teljes videólink címke el van rejtve - A teljes videólink címke megjelenik - Navigációs sáv elrejtése - A navigációs sáv el van rejtve - A navigációs sáv megjelenik - - - Javasolt videó elrejtése a befejező képernyőn - "A befejező képernyőn lévő javasolt videó el van rejtve, ha az automatikus lejátszás ki van kapcsolva. + + \"Megtekintés VR-módban\" elrejtése + A megtekintés VR-módban menü el van rejtve + A „Megtekintés VR-módban” menü megjelenik + Videóminőség menü elrejtése + A videóminőség menü elrejtve + A videóminőség menü megjelenítve + A videóminőség menü láblécének elrejtése + A videóminőség menü lábléce el van rejtve + Megjelenik a videóminőség menü lábléce + + + Automatikus lejátszás gomb elrejtése + Az automatikus lejátszás gomb el van rejtve + Az automatikus lejátszás gomb látható + + Felirat gomb elrejtése + A feliratok gomb el van rejtve + A feliratok gomb látható + Küldés gomb elrejtése + Az átküldés gomb rejtve van + Az átküldés gomb látható + Lejátszóvezérlők hátterének elrejtése + A lejátszóvezérlők háttere rejtett + A lejátszóvezérlők háttere látható + Az Előző és a Következő gombok elrejtése + A gombok elrejtve + A gombok megjelennek + + + Záróképernyő kártyák elrejtése + A záróképernyő kártyák el vannak rejtve + A záróképernyő kártyák megjelennek + + + Ambient mód letiltása teljes képernyős módban + Mozifilmes világítás kikapcsolva + Mozifilmes világítás engedélyezve + + + Infó kártyák elrejtése + Az info kártyák el vannak rejtve + Az info kártyák megjelennek + + + Gördülőszám-animációk letiltása + A gördülő számok nem animáltak + A gördülő számok animálva vannak + + + Videólejátszó keresősáv elrejtése + A videólejátszó folyamatsávja el van rejtve + A videólejátszó folyamatsávja megjelenik + + Videó miniatűrök keresősávjának elrejtése + A videó miniatűrök keresősávja elrejtve + A videó miniatűrök keresősávja megjelenítve + + + Shorts lejátszó + A Shorts lejátszó komponensek elrejtése vagy megjelenítése + + Shorts videók elrejtése a Főoldali hírcsatornából + Elrejtve a Főoldali hírcsatornából és a kapcsolódó videókból + Látható a Főoldali hírcsatornában és a kapcsolódó videókban + Shortsok elrejtése a keresési eredményekben + A keresési eredmények között elrejtve + Megjelenik a keresési eredmények között + + Shorts videók elrejtése a Feliratkozások hírcsatornából + Elrejtve a Feliratkozások hírcsatornából + Látható a Feliratkozások hírcsatornában + Shorts elrejtése a megtekintési előzményekben + Elrejtve a megtekintési előzményekben + Megjelenik a megtekintési előzményekben + Az \"Automatikusan szinkronizált\" címke elrejtése + Az automatikus szinkronizálás címke rejtett + Az automatikus szinkronizálás címke megjelenik + A \"Super Thanks vásárlása\" gomb elrejtése + A „Super Thanks vásárlása” gomb elrejtve + A „Super Thanks vásárlása” gomb látható + Effekt gomb elrejtése + Az effekt gomb el van rejtve + Az effekt gomb látható + A \"Zöld háttér\" gomb elrejtése + A zöld képernyő gomb el van rejtve + A zöld képernyő gomb látható + A hashtag gomb elrejtése + A Hashtag gomb el van rejtve + A Hashtag gomb látható + + Csatlakozás gomb elrejtése + A csatlakozás gomb el van rejtve + A csatlakozás gomb meg van jelenítve + Élő előnézet elrejtése + Az élő előnézet rejtve van + Az élő előnézet látható + Helycímke elrejtése + A helycízke címke el van rejtve + A helycízke címke meg van jelenítve + Az \"Új bejegyzések\" gomb elrejtése + Az új bejegyzések gomb rejtve van + Az új bejegyzések gomb megjelenik + Szüneteltetett fedő gombok elrejtése + A szüneteltetett fedő gombok el vannak rejtve + A szüneteltetett fedő gombok megjelennek + Elrejtés előnézeti megjegyzés + Az előnézeti megjegyzés rejtve van + Megjelenik a megjegyzés előnézete + A \"Zene mentése\" gomb elrejtése + A zene mentés gomb el van rejtve + A zene mentés gomb látható + Keresési javaslatok elrejtése + A keresési javaslatok el vannak rejtve + A keresési javaslatok meg vannak jelenítve + Shop gomb elrejtése + A vásárlás gomb el van rejtve + A vásárlás gomb látható + Matricák elrejtése + A matricák el vannak rejtve + A matricák láthatóak + Feliratkozás gomb elrejtése + A feliratkozás gomb el van rejtve + A feliratkozás gomb látható + Címkézett termékek elrejtése + A megjelölt termékek el vannak rejtve + A megjelölt termékek meg vannak jelenítve + Következő videó gomb elrejtése + A közelgő gomb el van rejtve + Megjelenik a Közelgő gomb + Az \"Ez a hang használata\" gomb elrejtése + A \"Hang használata\" gomb el van rejtve + A \"Hang használata\" gomb látható + Az \"Ez a sablon használata\" gomb elrejtése + A \"Sablon használata\" gomb el van rejtve + A „Sablon használata” gomb látható + Tetszik gomb szökőkút animációjának elrejtése + A Like gomb szökőkút animáció el van rejtve + A Like gomb szökőkút animáció látható + Tetszik gomb elrejtése + A tetszik gomb elrejtve + A tetszik gomb megjelenik + Nem tetszik gomb elrejtése + A nem tetszik gomb elrejtve + A nem tetszik gomb látható + Hozzászólások gomb elrejtése + A megjegyzések gomb el van rejtve + A megjegyzések gomb megjelenik + + Megosztás gomb elrejtése + A megosztás gomb el van rejtve + A megosztás gomb látható + + Remix gomb elrejtése + A remix gomb el van rejtve + A remix gomb megjelenik + Hang gomb elrejtése + A hang gomb el van rejtve + A hang gomb megjelenik + Infó panel elrejtése + Az infó panel rejtett + Az infó panel megjelenik + Csatornasáv elrejtése + A csatornasáv el van rejtve + A csatornasáv megjelenik + Videó címének elrejtése + A videócím elrejtve + A videócím látható + Hang metaadatcímke elrejtése + A hang metaadat címke elrejtve + A hang metaadat címke látható + Videóhivatkozás címkéjének elrejtése + A teljes videólink címke el van rejtve + A teljes videólink címke megjelenik + Navigációs sáv elrejtése + A navigációs sáv el van rejtve + A navigációs sáv megjelenik + + + Javasolt videó elrejtése a befejező képernyőn + "A befejező képernyőn lévő javasolt videó el van rejtve, ha az automatikus lejátszás ki van kapcsolva. Az automatikus lejátszás a YouTube beállításaiban módosítható: Beállítások → Lejátszás → Következő videó automatikus lejátszása" - A befejező képernyőn lévő javasolt videó látható - - - Kapcsolódó videók átfedésének elrejtése - A kapcsolódó videók átfedése teljes képernyőn elrejtve - A kapcsolódó videók átfedése teljes képernyőn látható - - - Videó időbélyegzőjének elrejtése - Az időbélyegző elrejtve - Az időbélyegző megjelenik - - - Lejátszó előugró paneleinek elrejtése - A lejátszó előugró panelei el vannak rejtve - A lejátszó előugró panelei megjelennek - - - Kilépés a teljes képernyőből - Letiltva - Portré - Tájkép - Portré és tájkép - - - Nyissa meg a videókat teljes képernyős portréban - A videók teljes képernyőn nyílnak meg - A videók nem nyílnak meg teljes képernyőn - - - Lejátszó fedőrétegének átlátszatlansága - Az átlátszatlanság értéke 0 és 100 között van, ahol a 0 átlátszó - A lejátszó fedvény átlátszatlanságának 0 és 100 között kell lennie - - - - A nem tetszik funkció átmenetileg nem elérhető - A nem tetszik funkció nem elérhető (állapot: %d) - A nem tetszések nem érhetők el (ügyfél API korlát) - A nem tetszik funkció nem elérhető (%s) - - Töltse újra a videót a Return YouTube Dislike-hoz - - A tulajdonos elrejtette - A nem tetszések megjelennek - A nem tetszések nem jelennek meg - A nem tetszések megjelenítése a Shorts videóknál - "A nem tetszések a Shorts-on láthatók + A befejező képernyőn lévő javasolt videó látható + + + Kapcsolódó videók átfedésének elrejtése + A kapcsolódó videók átfedése teljes képernyőn elrejtve + A kapcsolódó videók átfedése teljes képernyőn látható + + + Videó időbélyegzőjének elrejtése + Az időbélyegző elrejtve + Az időbélyegző megjelenik + + + Lejátszó előugró paneleinek elrejtése + A lejátszó előugró panelei el vannak rejtve + A lejátszó előugró panelei megjelennek + + + Kilépés a teljes képernyőből + Letiltva + Portré + Tájkép + Portré és tájkép + + + Nyissa meg a videókat teljes képernyős portréban + A videók teljes képernyőn nyílnak meg + A videók nem nyílnak meg teljes képernyőn + + + Lejátszó fedőrétegének átlátszatlansága + Az átlátszatlanság értéke 0 és 100 között van, ahol a 0 átlátszó + A lejátszó fedvény átlátszatlanságának 0 és 100 között kell lennie + + + + A nem tetszik funkció átmenetileg nem elérhető + A nem tetszik funkció nem elérhető (állapot: %d) + A nem tetszések nem érhetők el (ügyfél API korlát) + A nem tetszik funkció nem elérhető (%s) + + Töltse újra a videót a Return YouTube Dislike-hoz + + A tulajdonos elrejtette + A nem tetszések megjelennek + A nem tetszések nem jelennek meg + A nem tetszések megjelenítése a Shorts videóknál + "A nem tetszések a Shorts-on láthatók Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg" - A nem tetszések a Shorts-on nem láthatók - Nem tetszések százalékban - A nem tetszések százalékban jelennek meg - A nem tetszések számként jelennek meg - - Tömör Tetszik gomb - A tetszik gomb minimális szélességre formázva - A tetszik gomb a legjobb megjelenésre formázva - Becsült kedvelések mutatása - A letiltott kedvelésekkel rendelkező videók a becsült kedvelések számát mutatják - A becsült kedvelések nem jelennek meg - Üzenet megjelenítése, ha az API nem elérhető - Üzenet megjelenítése, ha a Return YouTube Dislike nem elérhető - Nem jelenik meg üzenet, ha a Return YouTube Dislike nem elérhető - Az adatokat a Return YouTube Dislike API biztosítja. További információért koppintson ide - - ReturnYouTubeDislike API statisztika az eszközön - API válaszidő, átlagos - API válaszidő, minimális - API válaszidő, maximális - API válaszidő, legutóbbi videó - A nem tetszések átmenetileg nem érhetőek el – Az Ügyfél API sebességkorlátja van érvényben - API lekérési szavazatok, hívások száma - Nem kezdeményezett hálózati hívás - %d kezdeményezett hálózati hívás - API lekérési szavazatok, időtúllépések száma - Nincsenek hálózati hívások időtúllépésben - %d hálózati hívás időtúllépés - API kliens korlátok - Nem történtek kliens korlátozások - Kliens korlátozás %d alkalommal történt - %d ezredmásodperc - - - Széles keresősáv bekapcsolása - Széles keresősáv bekapcsolva - Széles keresősáv kikapcsolva - - - Jó minőségű miniatűrök engedélyezése - A keresősáv bélyegképei kiváló minőségűek - A keresősáv bélyegképei közepes minőségűek - "Ez visszaállítja a miniatűr képeket az élő közvetítéseknél, amelyeknek nincsenek keresősáv miniatűr képei. + A nem tetszések a Shorts-on nem láthatók + Nem tetszések százalékban + A nem tetszések százalékban jelennek meg + A nem tetszések számként jelennek meg + + Tömör Tetszik gomb + A tetszik gomb minimális szélességre formázva + A tetszik gomb a legjobb megjelenésre formázva + Becsült kedvelések mutatása + A letiltott kedvelésekkel rendelkező videók a becsült kedvelések számát mutatják + A becsült kedvelések nem jelennek meg + Üzenet megjelenítése, ha az API nem elérhető + Üzenet megjelenítése, ha a Return YouTube Dislike nem elérhető + Nem jelenik meg üzenet, ha a Return YouTube Dislike nem elérhető + Az adatokat a Return YouTube Dislike API biztosítja. További információért koppintson ide + + ReturnYouTubeDislike API statisztika az eszközön + API válaszidő, átlagos + API válaszidő, minimális + API válaszidő, maximális + API válaszidő, legutóbbi videó + A nem tetszések átmenetileg nem érhetőek el – Az Ügyfél API sebességkorlátja van érvényben + API lekérési szavazatok, hívások száma + Nem kezdeményezett hálózati hívás + %d kezdeményezett hálózati hívás + API lekérési szavazatok, időtúllépések száma + Nincsenek hálózati hívások időtúllépésben + %d hálózati hívás időtúllépés + API kliens korlátok + Nem történtek kliens korlátozások + Kliens korlátozás %d alkalommal történt + %d ezredmásodperc + + + Széles keresősáv bekapcsolása + Széles keresősáv bekapcsolva + Széles keresősáv kikapcsolva + + + Jó minőségű miniatűrök engedélyezése + A keresősáv bélyegképei kiváló minőségűek + A keresősáv bélyegképei közepes minőségűek + "Ez visszaállítja a miniatűr képeket az élő közvetítéseknél, amelyeknek nincsenek keresősáv miniatűr képei. A keresősáv miniatűr képei ugyanazt a minőséget fogják használni, mint az aktuális videó. Ez a funkció a legjobban 720p vagy annál alacsonyabb videóminőség mellett és nagyon gyors internetkapcsolat használatakor működik." - Régi keresősáv bélyegképek visszaállítása - A keresősáv bélyegképei megjelennek a keresősáv felett - A keresősáv bélyegképei megjelennek a teljes képernyőn - - - SponsorBlock bekapcsolása - A SponsorBlock egy közösségi finanszírozású rendszer, amellyel kihagyhatod a YouTube videók idegesítő részeit - Megjelenés - Szavazás gomb megjelenítése - Szegmens szavazás gomb megjelenítve - Szegmens szavazás gomb elrejtve - Négyzetes elrendezés használata - A gombok és vezérlők négyszögletesek - A gombok és vezérlők lekerekítettek - - Kompakt Átugrás gomb használata - A kihagyás gomb minimális szélességre formázva - A kihagyás gomb a legjobb megjelenésre formázva - Az Átugrás gomb automatikus elrejtése - A kihagyás gomb néhány másodperc után eltűnik - Az Átugrás gomb a teljes szegmenshez megjelenik - Átugrás gomb időtartama - Mennyi ideig jelenjenek meg az átugrás és az átugrás kiemeléshez gombok az automatikus elrejtés előtt - Ugrás visszavonása felugró értesítés megjelenítése - Felugró értesítés jelenik meg, amikor egy szegmens automatikusan átugrásra kerül. Érintse meg a felugró értesítést az átugrás visszavonásához - A felugró üzenet nem jelenik meg - Átugrási felugró üzenet időtartama - Mennyi ideig jelenjen meg az átugrás visszavonása felugró üzenet - 1 másodperc - 2 másodperc - 3 másodperc - 4 másodperc - 5 másodperc - 6 másodperc - 7 másodperc - 8 másodperc - 9 másodperc - 10 másodperc - A videó hosszának megjelenítése szegmensek nélkül - A videó hossza az összes szegmens nélkül jelenik meg a csúszkán - A videó teljes hossza látható - Új szegmensek létrehozása - Új szegmens létrehozása gomb megjelenítése - Az új szegmens létrehozása gomb megjelenik - Az új szegmens létrehozása gomb nem jelenik meg - Új szegmens léptetés beállítása - Ezredmásodpercek száma, ameddig az időbeállító gombok léptetnek új szegmensek létrehozásakor - Az értéknek pozitív számnak kell lennie - Irányelvek megtekintése - Az irányelvek tippeket és szabályokat tartalmaznak a szegmensek beküldésével kapcsolatban - Kövesse az irányelveket - Olvassa el a SponsorBlock irányelveket szegmensek beküldése előtt - Már elolvastam - Mutasd - Általános - Üzenet megjelenítése, ha az API nem elérhető - Üzenet látható, ha a SponsorBlock nem elérhető - Nem látható üzenet, ha a SponsorBlock nem elérhető - Átugrásszámláló bekapcsolása - Értesíti a SponsorBlock ranglistáját, hogy mennyi időt takarított meg. Minden egyes szakasz kihagyásakor üzenetet küld a ranglistának - A kihagyások számának követése nem engedélyezett - Minimális szegmens időtartam - A beállított értéknél (másodpercben) rövidebb szakaszokat nem hagyja ki vagy nem jeleníti meg - Érvénytelen időtartam - Az Ön privát felhasználói azonosítója - Ezt bizalmasan kell kezelni. Olyan mint egy jelszó és senkivel sem ajánlott megosztani. Ha valaki megszerzi, meg tudja személyesíteni önt - A privát felhasználói azonosítónak legalább 30 karakter hosszúnak kell lennie - API URL módosítása - Az a cím, amelyet a SponsorBlock a szervere eléréséhez használ - API URL alaphelyzetbe állítása - API URL érvénytelen - API URL megváltoztatva - Beállítások importálása/exportálása - Másolás - Az Ön SponsorBlock JSON-konfigurációja, amely importálható/exportálható ReVanced és más SponsorBlock platformokra - A SponsorBlock JSON-konfigurációja, amely importálható/exportálható a ReVanced és más SponsorBlock platformokra. Ez magában foglalja a privát felhasználói azonosítóját is. Ügyeljen arra, hogy ezt bölcsen ossza meg - A beállítások sikeresen importálva - Nem sikerült importálni ezt: %s - Nem sikerült exportálni ezt: %s - "A beállítások tartalmaznak egy privát SponsorBlock felhasználói azonosítót. + Régi keresősáv bélyegképek visszaállítása + A keresősáv bélyegképei megjelennek a keresősáv felett + A keresősáv bélyegképei megjelennek a teljes képernyőn + + + SponsorBlock bekapcsolása + A SponsorBlock egy közösségi finanszírozású rendszer, amellyel kihagyhatod a YouTube videók idegesítő részeit + Megjelenés + Szavazás gomb megjelenítése + Szegmens szavazás gomb megjelenítve + Szegmens szavazás gomb elrejtve + Négyzetes elrendezés használata + A gombok és vezérlők négyszögletesek + A gombok és vezérlők lekerekítettek + + Kompakt Átugrás gomb használata + A kihagyás gomb minimális szélességre formázva + A kihagyás gomb a legjobb megjelenésre formázva + Az Átugrás gomb automatikus elrejtése + A kihagyás gomb néhány másodperc után eltűnik + Az Átugrás gomb a teljes szegmenshez megjelenik + Átugrás gomb időtartama + Mennyi ideig jelenjenek meg az átugrás és az átugrás kiemeléshez gombok az automatikus elrejtés előtt + Ugrás visszavonása felugró értesítés megjelenítése + Felugró értesítés jelenik meg, amikor egy szegmens automatikusan átugrásra kerül. Érintse meg a felugró értesítést az átugrás visszavonásához + A felugró üzenet nem jelenik meg + Átugrási felugró üzenet időtartama + Mennyi ideig jelenjen meg az átugrás visszavonása felugró üzenet + 1 másodperc + 2 másodperc + 3 másodperc + 4 másodperc + 5 másodperc + 6 másodperc + 7 másodperc + 8 másodperc + 9 másodperc + 10 másodperc + A videó hosszának megjelenítése szegmensek nélkül + A videó hossza az összes szegmens nélkül jelenik meg a csúszkán + A videó teljes hossza látható + Új szegmensek létrehozása + Új szegmens létrehozása gomb megjelenítése + Az új szegmens létrehozása gomb megjelenik + Az új szegmens létrehozása gomb nem jelenik meg + Új szegmens léptetés beállítása + Ezredmásodpercek száma, ameddig az időbeállító gombok léptetnek új szegmensek létrehozásakor + Az értéknek pozitív számnak kell lennie + Irányelvek megtekintése + Az irányelvek tippeket és szabályokat tartalmaznak a szegmensek beküldésével kapcsolatban + Kövesse az irányelveket + Olvassa el a SponsorBlock irányelveket szegmensek beküldése előtt + Már elolvastam + Mutasd + Általános + Üzenet megjelenítése, ha az API nem elérhető + Üzenet látható, ha a SponsorBlock nem elérhető + Nem látható üzenet, ha a SponsorBlock nem elérhető + Átugrásszámláló bekapcsolása + Értesíti a SponsorBlock ranglistáját, hogy mennyi időt takarított meg. Minden egyes szakasz kihagyásakor üzenetet küld a ranglistának + A kihagyások számának követése nem engedélyezett + Minimális szegmens időtartam + A beállított értéknél (másodpercben) rövidebb szakaszokat nem hagyja ki vagy nem jeleníti meg + Érvénytelen időtartam + Az Ön privát felhasználói azonosítója + Ezt bizalmasan kell kezelni. Olyan mint egy jelszó és senkivel sem ajánlott megosztani. Ha valaki megszerzi, meg tudja személyesíteni önt + A privát felhasználói azonosítónak legalább 30 karakter hosszúnak kell lennie + API URL módosítása + Az a cím, amelyet a SponsorBlock a szervere eléréséhez használ + API URL alaphelyzetbe állítása + API URL érvénytelen + API URL megváltoztatva + Beállítások importálása/exportálása + Másolás + Az Ön SponsorBlock JSON-konfigurációja, amely importálható/exportálható ReVanced és más SponsorBlock platformokra + A SponsorBlock JSON-konfigurációja, amely importálható/exportálható a ReVanced és más SponsorBlock platformokra. Ez magában foglalja a privát felhasználói azonosítóját is. Ügyeljen arra, hogy ezt bölcsen ossza meg + A beállítások sikeresen importálva + Nem sikerült importálni ezt: %s + Nem sikerült exportálni ezt: %s + "A beállítások tartalmaznak egy privát SponsorBlock felhasználói azonosítót. A felhasználói azonosítója olyan, mint egy jelszó, és soha nem szabad megosztani. " - Ne jelenjen meg többet - A szegmens viselkedésének módosítása - Szponzor - Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik - Nem fizetett hirdetés/önpromóció - Hasonló a szponzoráláshoz, de a nem fizetett vagy önreklámokhoz. Olyan részeket tartalmaz, amelyek a kereskedelmi termékekről, adományokról vagy együttműködő partnerekről szólnak - Interakció emlékeztető (Feliratkozás) - Egy rövid emlékeztető arról, hogy like-oljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik - Kiemelt - A videónak azon része, amit a legtöbben keresnek - Megszakítás/Intro animáció - Egy részlet tartalom nélkül. Lehet szünet, álló képkocka, vagy ismétlődő animáció. Nem használandó információt tartalmazó átmeneteknél - Záróképernyő / Köszönetek - Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem tartozik bele az információt tartalmazó összegzés - Bevezetés / Üdvözlet - Narrált előzetesek a közelgő videóhoz, üdvözlések és búcsúzások. Nem tartalmaz olyan szakaszokat, amelyek további tartalmat adnak hozzá - Előnézet / Összefoglaló - Olyan klipek gyűjteménye, amik azt mutatják, hogy mi következik majd ebben, vagy a sorozat más videóiban és minden információ megismétlődik később a videóban - Kitérés / Viccek - Mellékes jelenetek vagy viccek, amelyek nem szükségesek a videó fő tartalmának megértéséhez. Ez nem foglalja magában azokat a szegmenseket, amelyek kontextust vagy háttérinformációkat nyújtanak - Zene: zenementes rész - Csak zenei videókhoz használható. Zenei videók zene nélküli részei, amelyek még nem tartoznak más kategóriába - Kihagyás - Kiemelt - Szponzor kihagyása - Promóció kihagyása - Interakció kihagyása - Ugrás az kiemelthez - Intro kihagyása - Szünet kihagyása - Szünet kihagyása - Outro kihagyása - Horog kihagyása - Előnézet kihagyása - Előnézet kihagyása - Recap kihagyása - Mellékes rész kihagyása - Nem zenei rész kihagyása - Szakasz kihagyása - Szponzor kihagyva - Önpromóció kihagyva - Zavaró emlékeztető kihagyva - Kihagyva a kiemelthez - Intro kihagyva - Szünet kihagyva - Szünet kihagyva - Outro kihagyva - Horog kihagyva - Bevezető kihagyva - Bevezető kihagyva - Recap kihagyva - Mellékes rész kihagyva - Zenementes rész kihagyva - Beküldésre váró rész kihagyva - Több szakasz kihagyva - Automatikus kihagyás - Automatikus kihagyás egyszer - Átugrás gomb megjelenítése - Megjelenítés a folyamatsávban - Letiltás - Nem lehet beküldeni a szegmenst: %s - A SponsorBlock átmenetileg nem működik - Nem lehet beküldeni a szegmenst (állapot: %1$d %2$s) - A szegmens nem küldhető be. Korlátozva (túl sok ugyanazon felhasználótól vagy IP-címről) - Nem lehet beküldeni a szegmenst: %s - "A szegmens nem küldhető be. + Ne jelenjen meg többet + A szegmens viselkedésének módosítása + Szponzor + Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik + Nem fizetett hirdetés/önpromóció + Hasonló a szponzoráláshoz, de a nem fizetett vagy önreklámokhoz. Olyan részeket tartalmaz, amelyek a kereskedelmi termékekről, adományokról vagy együttműködő partnerekről szólnak + Interakció emlékeztető (Feliratkozás) + Egy rövid emlékeztető arról, hogy like-oljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik + Kiemelt + A videónak azon része, amit a legtöbben keresnek + Megszakítás/Intro animáció + Egy részlet tartalom nélkül. Lehet szünet, álló képkocka, vagy ismétlődő animáció. Nem használandó információt tartalmazó átmeneteknél + Záróképernyő / Köszönetek + Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem tartozik bele az információt tartalmazó összegzés + Bevezetés / Üdvözlet + Narrált előzetesek a közelgő videóhoz, üdvözlések és búcsúzások. Nem tartalmaz olyan szakaszokat, amelyek további tartalmat adnak hozzá + Előnézet / Összefoglaló + Olyan klipek gyűjteménye, amik azt mutatják, hogy mi következik majd ebben, vagy a sorozat más videóiban és minden információ megismétlődik később a videóban + Kitérés / Viccek + Mellékes jelenetek vagy viccek, amelyek nem szükségesek a videó fő tartalmának megértéséhez. Ez nem foglalja magában azokat a szegmenseket, amelyek kontextust vagy háttérinformációkat nyújtanak + Zene: zenementes rész + Csak zenei videókhoz használható. Zenei videók zene nélküli részei, amelyek még nem tartoznak más kategóriába + Kihagyás + Kiemelt + Szponzor kihagyása + Promóció kihagyása + Interakció kihagyása + Ugrás az kiemelthez + Intro kihagyása + Szünet kihagyása + Szünet kihagyása + Outro kihagyása + Horog kihagyása + Előnézet kihagyása + Előnézet kihagyása + Recap kihagyása + Mellékes rész kihagyása + Nem zenei rész kihagyása + Szakasz kihagyása + Szponzor kihagyva + Önpromóció kihagyva + Zavaró emlékeztető kihagyva + Kihagyva a kiemelthez + Intro kihagyva + Szünet kihagyva + Szünet kihagyva + Outro kihagyva + Horog kihagyva + Bevezető kihagyva + Bevezető kihagyva + Recap kihagyva + Mellékes rész kihagyva + Zenementes rész kihagyva + Beküldésre váró rész kihagyva + Több szakasz kihagyva + Automatikus kihagyás + Automatikus kihagyás egyszer + Átugrás gomb megjelenítése + Megjelenítés a folyamatsávban + Letiltás + Nem lehet beküldeni a szegmenst: %s + A SponsorBlock átmenetileg nem működik + Nem lehet beküldeni a szegmenst (állapot: %1$d %2$s) + A szegmens nem küldhető be. Korlátozva (túl sok ugyanazon felhasználótól vagy IP-címről) + Nem lehet beküldeni a szegmenst: %s + "A szegmens nem küldhető be. Már létezik" - A szakasz sikeresen beküldve - - A SponsorBlock jelenleg nem elérhető (API időtúllépés) - A SponsorBlock jelenleg nem elérhető (állapot %d) - A SponsorBlock átmenetileg nem elérhető - Nem lehet szavazni a szegmensre (API időtúllépés) - Nem lehet szavazni erre (állapot: %1$d %2$s) - Nem lehet szavazni a szegmensre: %s - Pozitív szavazás - Leszavazás - Kategória megváltoztatása - Nincsenek szakaszok, amikre szavazni lehet - - %1$s – %2$s - Válassza ki a szakasz kategóriáját - A kategória letiltva a beállításokban. Engedélyezze a beküldéshez. - Új SponsorBlock szakasz - Beállítja a %s-t egy új szegmens kezdeteként vagy végeként? - Kezdet - Végpont - Most - A rész kezdetének ideje - A rész végének ideje - Helyesek az időpontok? - "A szegmens a + A szakasz sikeresen beküldve + + A SponsorBlock jelenleg nem elérhető (API időtúllépés) + A SponsorBlock jelenleg nem elérhető (állapot %d) + A SponsorBlock átmenetileg nem elérhető + Nem lehet szavazni a szegmensre (API időtúllépés) + Nem lehet szavazni erre (állapot: %1$d %2$s) + Nem lehet szavazni a szegmensre: %s + Pozitív szavazás + Leszavazás + Kategória megváltoztatása + Nincsenek szakaszok, amikre szavazni lehet + + %1$s – %2$s + Válassza ki a szakasz kategóriáját + A kategória letiltva a beállításokban. Engedélyezze a beküldéshez. + Új SponsorBlock szakasz + Beállítja a %s-t egy új szegmens kezdeteként vagy végeként? + Kezdet + Végpont + Most + A rész kezdetének ideje + A rész végének ideje + Helyesek az időpontok? + "A szegmens a %1$s -tól a %2$s -ig terjed @@ -1280,46 +1279,46 @@ Már létezik" (%3$s) Készen állsz a beküldésre?" - A kezdetnek a vége előtt kell lennie - Előbb jelöljön meg két pontot az idősávon - Szakasz előnézete a zökkenőmentesen kihagyás érdekében - A szakasz időzítésének kézi beállítása - Akarja szerkeszteni a rész kezdetének vagy végének időzítését? - Érvénytelen idő van megadva - Statisztikák - - A statisztikák átmenetileg nem érhetők el (az API nem működik) - Betöltés... - A SponsorBlock ki van kapcsolva - Az ön felhasználóneve: <b>%s</b> - Koppintson ide a felhasználónév megváltoztatásához - A felhasználónév nem módosítható: Állapot: %1$d %2$s - A felhasználónév sikeresen módosítva - Az ön hírneve: <b>%.2f</b> - <b>%s</b> szegmenst készítettél - Koppintson ide a szegmensek megtekintéséhez - SponsorBlock ranglista - <b>%s</b> szegmenstől mentettél meg másokat - Koppintson ide a globális statisztikák és a kiemelt közreműködők megtekintéséhez - Ez <b>%s</b> az életükből.<br>Koppintson a ranglista megtekintéséhez - <b>%s</b> szakaszt kihagyott - Ez <b>%s</b> - Visszaállítja a kihagyott szakaszok számlálóját? - %1$s óra %2$s perc - %1$s perc %2$s másodperc - %s másodperc - Áttetszőség: - Szín: - Rólunk - Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra - - - Elrendezési űrlap faktor - Alapértelmezett - Telefon - Táblagép - Autóipari - "A változások a következők: + A kezdetnek a vége előtt kell lennie + Előbb jelöljön meg két pontot az idősávon + Szakasz előnézete a zökkenőmentesen kihagyás érdekében + A szakasz időzítésének kézi beállítása + Akarja szerkeszteni a rész kezdetének vagy végének időzítését? + Érvénytelen idő van megadva + Statisztikák + + A statisztikák átmenetileg nem érhetők el (az API nem működik) + Betöltés... + A SponsorBlock ki van kapcsolva + Az ön felhasználóneve: <b>%s</b> + Koppintson ide a felhasználónév megváltoztatásához + A felhasználónév nem módosítható: Állapot: %1$d %2$s + A felhasználónév sikeresen módosítva + Az ön hírneve: <b>%.2f</b> + <b>%s</b> szegmenst készítettél + Koppintson ide a szegmensek megtekintéséhez + SponsorBlock ranglista + <b>%s</b> szegmenstől mentettél meg másokat + Koppintson ide a globális statisztikák és a kiemelt közreműködők megtekintéséhez + Ez <b>%s</b> az életükből.<br>Koppintson a ranglista megtekintéséhez + <b>%s</b> szakaszt kihagyott + Ez <b>%s</b> + Visszaállítja a kihagyott szakaszok számlálóját? + %1$s óra %2$s perc + %1$s perc %2$s másodperc + %s másodperc + Áttetszőség: + Szín: + Rólunk + Az adatokat a SponsorBlock API biztosítja. Koppintson ide, ha többet szeretne megtudni és megtekintené a letöltéseket más platformokra + + + Elrendezési űrlap faktor + Alapértelmezett + Telefon + Táblagép + Autóipari + "A változások a következők: Tablet elrendezés • A közösségi bejegyzések rejtve vannak @@ -1327,308 +1326,306 @@ Tablet elrendezés Autóipari elrendezés • A \"Shorts\" a szokásos lejátszóban nyílik meg • A hírcsatorna témák és csatornák szerint van rendezve" - - - Alkalmazásverzió hamisítása - A verzió hamisítva - A verzió nincs hamisítva - "Az alkalmazás verziója egy régebbi YouTube-verzióra lesz hamisítva. + + + Alkalmazásverzió hamisítása + A verzió hamisítva + A verzió nincs hamisítva + "Az alkalmazás verziója egy régebbi YouTube-verzióra lesz hamisítva. Ez megváltoztatja az alkalmazás megjelenését és funkcióit, de előfordulhatnak nem várt mellékhatások. Ha később kikapcsolja, akkor ajánlott az alkalmazás adatait törölni, hogy megakadályozza a felhasználói felület hibáit." - Hamisított alkalmazásverzió célja - 20.13.41 - Nem összecsukott videó műveletsáv visszaállítása - 20.05.46 - Átirat funkció visszaállítása - 19.35.36 - A régi Shorts lejátszó ikonok visszaállítása - 19.01.34 - Állítsa vissza a régi navigációs ikonokat - - - Kezdőlap módosítása - Alapértelmezett - Összes feliratkozás - Csatornák böngészése - Tanfolyamok / Tanulás - Felfedezés - Divat és szépség - Játék - Előzmények - Könyvtár - Kedvelt videók - Élő - Filmek - Zene - Hírek - Értesítések - Lejátszási listák - Keresés - Bevásárlás - Sportok - Feliratkozások - Felkapott - Virtuális valóság - Megnézem később - A saját klipjeid - Mindig módosítsa a kezdőoldalt - "A kezdőlap mindig módosítva van\n\nKorlátozás: A visszalépés gomb a eszköztáron nem biztos, hogy működik" - A kezdőoldal csak az alkalmazás indításakor változik meg - - - A Shorts lejátszás folytatásának kikapcsolása - A Shorts lejátszás nem indul el az alkalmazás indításakor - A Shorts lejátszás folytatódik az alkalmazás indításakor - - - Shorts megnyitása ezzel: - Shorts lejátszó - Normál lejátszó - Teljes képernyős normál lejátszó - - - Shorts automatikus lejátszása - Shorts automatikusan elindul - Shorts ismétlődik - Shorts automatikus lejátszása a háttérben - Shorts automatikusan elindul a háttérben - Shorts háttérben történő lejátszása megismétlődik - - - Minilejátszó - Az alkalmazáson belüli minimalizált lejátszó stílusának módosítása - Minilejátszó típus - Kikapcsolva - Alapértelmezett - Minimális - Táblagép - Lekerekített sarkok letiltása - A sarkok négyzet alakúak - A sarkok lekerekítettek - Az átméretezéshez engedélyezze a dupla koppintást és az összehúzást - "A dupla koppintásos művelet és a csippentés a méretezéshez engedélyezve van + Hamisított alkalmazásverzió célja + 20.13.41 - Nem összecsukott videó műveletsáv visszaállítása + 20.05.46 - Átirat funkció visszaállítása + 19.35.36 - A régi Shorts lejátszó ikonok visszaállítása + 19.01.34 - Állítsa vissza a régi navigációs ikonokat + + + Kezdőlap módosítása + Alapértelmezett + Összes feliratkozás + Csatornák böngészése + Tanfolyamok / Tanulás + Felfedezés + Divat és szépség + Játék + Előzmények + Könyvtár + Kedvelt videók + Élő + Filmek + Zene + Hírek + Értesítések + Lejátszási listák + Keresés + Bevásárlás + Sportok + Feliratkozások + Felkapott + Virtuális valóság + Megnézem később + A saját klipjeid + Mindig módosítsa a kezdőoldalt + "A kezdőlap mindig módosítva van\n\nKorlátozás: A visszalépés gomb a eszköztáron nem biztos, hogy működik" + A kezdőoldal csak az alkalmazás indításakor változik meg + + + A Shorts lejátszás folytatásának kikapcsolása + A Shorts lejátszás nem indul el az alkalmazás indításakor + A Shorts lejátszás folytatódik az alkalmazás indításakor + + + Shorts megnyitása ezzel: + Shorts lejátszó + Normál lejátszó + Teljes képernyős normál lejátszó + + + Shorts automatikus lejátszása + Shorts automatikusan elindul + Shorts ismétlődik + Shorts automatikus lejátszása a háttérben + Shorts automatikusan elindul a háttérben + Shorts háttérben történő lejátszása megismétlődik + + + Minilejátszó + Az alkalmazáson belüli minimalizált lejátszó stílusának módosítása + Minilejátszó típus + Kikapcsolva + Alapértelmezett + Minimális + Táblagép + Lekerekített sarkok letiltása + A sarkok négyzet alakúak + A sarkok lekerekítettek + Az átméretezéshez engedélyezze a dupla koppintást és az összehúzást + "A dupla koppintásos művelet és a csippentés a méretezéshez engedélyezve van • Dupla koppintás a miniatűr képernyő méretének növeléséhez • Dupla koppintás az eredeti méret visszaállításához" - A dupla koppintás művelet és az átméretezéshez csípés le van tiltva - Fogd és vidd letiltása - A Fogd és vidd letiltva - "A húzás és elengedés engedélyezve van + A dupla koppintás művelet és az átméretezéshez csípés le van tiltva + Fogd és vidd letiltása + A Fogd és vidd letiltva + "A húzás és elengedés engedélyezve van A miniatűr képernyőt a képernyő bármely sarkába húzhatja" - Vízszintes húzás letiltása - A vízszintes húzómozdulat letiltva - "A vízszintes húzás gesztus engedélyezve van + Vízszintes húzás letiltása + A vízszintes húzómozdulat letiltva + "A vízszintes húzás gesztus engedélyezve van A miniatűr képernyőt a képernyő bal vagy jobb szélére húzhatja" - Fedőgomb elrejtése - A fedőgombok rejtve vannak - A fedőgombok láthatók - Alszövegek elrejtése - Az alfeliratok el vannak rejtve - Az alfeliratok meg vannak jelenítve - Az előre és vissza ugrás gombok elrejtése - Az előre és hátra ugrás el van rejtve - Az előre és hátra ugrás meg van jelenítve - Kezdeti méret - Kezdeti méret a képernyőn, pixelben - A képpont méretének %1$s és %2$s között kell lennie - Átfedés átlátszósága - Az átlátszatlanság értéke 0 és 100 között van, ahol a 0 átlátszó - A minilejátszó fedvény átlátszatlanságának 0 és 100 között kell lennie - - - Színátmenetes betöltési képernyő engedélyezése - A betöltési képernyő színátmenetes hatterű lesz - A betöltési képernyő egyszínű hátterű lesz - Üdvözlőképernyő stílusa - Színes - Fekete-fehér - Egyéni keresősáv szín engedélyezése - Az egyéni keresősáv szín megjelenik - Az egyéni keresősáv szín nem jelenik meg - Egyéni keresősáv színe - A keresősáv színe - Egyéni keresősáv kiemelő színe - A keresősáv kiemelõ színe - Érvénytelen keresősáv színértéke - - - - - Fejléc logó - Alapértelmezett - Normál - - ReVanced minimál - Egyéni - - - Területi kép-korlátozások megkerülése - A yt4.ggpht.com képtár használata - "Az eredeti képgazdagép használatával + Fedőgomb elrejtése + A fedőgombok rejtve vannak + A fedőgombok láthatók + Alszövegek elrejtése + Az alfeliratok el vannak rejtve + Az alfeliratok meg vannak jelenítve + Az előre és vissza ugrás gombok elrejtése + Az előre és hátra ugrás el van rejtve + Az előre és hátra ugrás meg van jelenítve + Kezdeti méret + Kezdeti méret a képernyőn, pixelben + A képpont méretének %1$s és %2$s között kell lennie + Átfedés átlátszósága + Az átlátszatlanság értéke 0 és 100 között van, ahol a 0 átlátszó + A minilejátszó fedvény átlátszatlanságának 0 és 100 között kell lennie + + + Színátmenetes betöltési képernyő engedélyezése + A betöltési képernyő színátmenetes hatterű lesz + A betöltési képernyő egyszínű hátterű lesz + Üdvözlőképernyő stílusa + Színes + Fekete-fehér + Egyéni keresősáv szín engedélyezése + Az egyéni keresősáv szín megjelenik + Az egyéni keresősáv szín nem jelenik meg + Egyéni keresősáv színe + A keresősáv színe + Egyéni keresősáv kiemelő színe + A keresősáv kiemelõ színe + Érvénytelen keresősáv színértéke + + + + Fejléc logó + Alapértelmezett + Normál + + ReVanced minimál + Egyéni + + + Területi kép-korlátozások megkerülése + A yt4.ggpht.com képtár használata + "Az eredeti képgazdagép használatával Ez a beállítás megoldhatja a hiányzó képek problémáját, amelyek blokkolva vannak egyes régiókban" - - - - Kezdőlap - - Feliratkozások fül - - Te lap - Lejátszó lejátszási listák & ajánlások - Keresési eredmények - Eredeti miniatűrök - DeArrow és eredeti miniatűrök - DeArrow és pillanatképek - Pillanatképek - "A DeArrow tömegforrásból származó miniatűr képeket biztosít a YouTube-videókhoz. Ezek a miniatűr képek gyakran relevánsabbak, mint a YouTube által biztosítottak + + + + Kezdőlap + + Feliratkozások fül + + Te lap + Lejátszó lejátszási listák & ajánlások + Keresési eredmények + Eredeti miniatűrök + DeArrow és eredeti miniatűrök + DeArrow és pillanatképek + Pillanatképek + "A DeArrow tömegforrásból származó miniatűr képeket biztosít a YouTube-videókhoz. Ezek a miniatűr képek gyakran relevánsabbak, mint a YouTube által biztosítottak Ha engedélyezve van, akkor a videók URL-jeit elküldjük az API kiszolgálónak, és más adatokat nem küldünk. Ha egy videónak nincs DeArrow miniatűr képe, akkor az eredeti vagy állókép miniatűr kép lesz megjelenítve Érintse meg itt, hogy többet megtudjon a DeArrow-ról" - Üzenet megjelenítése, ha az API nem elérhető - Üzenet megjelenítése, ha a DeArrow nem elérhető - Nem jelenik meg üzenet, ha a DeArrow nem elérhető - DeArrow API végpont - A DeArrow bélyegkép cache végpont URL-je - Videó pillanatképek - Pillanatképek minden videó elejéről/közepéről/végéről készülnek. Ezek a képek be vannak építve a YouTube-ba és nem használnak külső API-t - Gyors pillanatképek használata - Közepes minőségű pillanatképeket használ. A bélyegképek gyorsabban betöltődnek, de az élő közvetítések, kiadatlan vagy nagyon régi videók üres bélyegképeket jeleníthetnek meg - Magas minőségű pillanatképeket használ - Pillanatkép készítésének ideje - Videó kezdete - Videó közepe - Videó vége - - A DeArrow átmenetileg nem érhető el (állapotkód: %s) - A DeArrow átmenetileg nem érhető el - - - ReVanced közlemények megjelenítése - A bejelentések indításkor megjelennek - A bejelentések indításkor nem jelennek meg - Közlemények megjelenítése indításkor - Nem sikerült csatlakozni a közlemény szolgáltatóhoz - Elvetés - - - Hurokismétlés engedélyezése - A videó ismétlődni fog - A videó nem fog ismétlődni - - - Hurokismétlés gomb megjelenítése - A gomb megjelenik - A gomb nem jelenik meg - A hurokismétlés be van kapcsolva - A hurokismétlés ki van kapcsolva - - - - - Eszközméret hamisítása - "Az eszköz méretei hamisítva vannak + Üzenet megjelenítése, ha az API nem elérhető + Üzenet megjelenítése, ha a DeArrow nem elérhető + Nem jelenik meg üzenet, ha a DeArrow nem elérhető + DeArrow API végpont + A DeArrow bélyegkép cache végpont URL-je + Videó pillanatképek + Pillanatképek minden videó elejéről/közepéről/végéről készülnek. Ezek a képek be vannak építve a YouTube-ba és nem használnak külső API-t + Gyors pillanatképek használata + Közepes minőségű pillanatképeket használ. A bélyegképek gyorsabban betöltődnek, de az élő közvetítések, kiadatlan vagy nagyon régi videók üres bélyegképeket jeleníthetnek meg + Magas minőségű pillanatképeket használ + Pillanatkép készítésének ideje + Videó kezdete + Videó közepe + Videó vége + + A DeArrow átmenetileg nem érhető el (állapotkód: %s) + A DeArrow átmenetileg nem érhető el + + + ReVanced közlemények megjelenítése + A bejelentések indításkor megjelennek + A bejelentések indításkor nem jelennek meg + Közlemények megjelenítése indításkor + Nem sikerült csatlakozni a közlemény szolgáltatóhoz + Elvetés + + + Hurokismétlés engedélyezése + A videó ismétlődni fog + A videó nem fog ismétlődni + + + Hurokismétlés gomb megjelenítése + A gomb megjelenik + A gomb nem jelenik meg + A hurokismétlés be van kapcsolva + A hurokismétlés ki van kapcsolva + + + + Eszközméret hamisítása + "Az eszköz méretei hamisítva vannak Lehet, hogy magasabb videóminőségek válnak elérhetővé, de a videólejátszás dadoghat, rosszabb lehet az akkumulátor üzemideje, és előfordulhatnak nem várt mellékhatások" - "Az eszköz méretei nem hamisítva vannak + "Az eszköz méretei nem hamisítva vannak Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását" - Ennek engedélyezése a videólejátszás akadozását, rosszabb akkuidőt és ismeretlen hatásokat okozhat. - - - Haptikus visszajelzés - Haptikus visszajelzés módosítása - Fejezetek haptikus visszajelzésének letiltása - A fejezetek haptikus visszajelzése le van tiltva - A fejezetek haptikus visszajelzése engedélyezve van - Pontos keresés haptikus visszajelzésének letiltása - A pontos keresés haptikus visszajelzése ki van kapcsolva - A pontos keresés haptikus visszajelzése engedélyezve van - Keresés visszavonása haptikus visszajelzésének letiltása - A keresés visszavonása haptikus visszajelzése ki van kapcsolva - A keresés visszavonása haptikus visszajelzése be van kapcsolva - Haptikus zoom letiltása - Haptikus zoom le van tiltva - Haptikus zoom be van kapcsolva - - - Ha nemrég módosította a fiókja bejelentkezési adatait, távolítsa el, majd telepítse újra a MicroG-t. - - - URL átirányítások kikerülése - URL átirányítások kikerülve - Az URL átirányítások nincsenek kikerülve - - - Hivatkozások megnyitása a böngészőben - Hivatkozások megnyitása külső böngészőben - Hivatkozások megnyitása az alkalmazáson belüli böngészőben - - - - Automatikus - Felbontás változtatások mentése - Felbontás változtatások alkalmazása az összes videóra - Felbontás változtatások alkalmazása a jelenlegi videóra - Értesítés megjelenítése videóminőség-változások esetén - Értesítés jelenik meg az alapértelmezett videóminőség megváltoztatásakor - Nem jelenik meg értesítés az alapértelmezett videóminőség megváltoztatásakor - Alapértelmezett videó minőség Wi-Fi hálózaton - Alapértelmezett videó minőség mobilhálózaton - A Shorts minőség módosításainak megjegyzése - A minőségi beállítások az összes Shorts videóra vonatkoznak - A minőségi beállítások csak a jelenlegi Short videóra vonatkoznak - Alapértelmezett Shorts minőség Wi-Fi hálózaton - Alapértelmezett Shorts minőség mobilhálózaton - mobil - wi-fi - A(z) %1$s alapértelmezett felbontása erre módosult: %2$s - A Shorts %1$s minősége megváltozott: %2$s - - - Sebesség párbeszédpanel megjelenítése - A sebesség párbeszédpanel gomb látható. Koppintson és tartsa lenyomva a lejátszási sebesség alaphelyzetbe állításához - A sebesség párbeszédpanel gomb nem látható - - - Videóminőség gomb megjelenítése - A videóminőség gomb látható. Koppintson és tartsa lenyomva a minőség alaphelyzetbe állításához - A videóminőség gomb nem látható - - - Egyedi lejátszási sebesség menü - Megjelenik az egyéni sebesség menü - Az egyéni sebesség menü nem jelenik meg - Régi lejátszási sebesség menü visszaállítása - A régi sebességmenü megjelenik - A modern sebességmenü megjelenik - Egyedi lejátszási sebesség - Egyéni lejátszási sebesség hozzáadása vagy módosítása - Az egyéni sebességeknek kevesebbnek kell lenniük, mint %s - Érvénytelen egyéni lejátszási sebességek - Automatikus - Egyéni koppintás és tartás sebesség - Lejátszási sebesség 0-8 között - - - Lejátszási sebesség módosításainak megjegyzése - A lejátszási sebesség módosítása minden videóra érvényes - A lejátszási sebesség módosítása csak a jelenlegi videóra érvényes - Értesítés megjelenítése lejátszási sebesség változások esetén - Értesítés jelenik meg az alapértelmezett lejátszási sebesség megváltoztatásakor - A felugró üzenet nem jelenik meg, amikor az alapértelmezett lejátszási sebesség megváltozik - Alapértelmezett lejátszási sebesség - Alapértelmezett sebesség módosítva: %s - - - Az HDR videó letiltása - Az HDR videó le van tiltva - Az HDR videó engedélyezve van - AVC kényszerítése (H.264) - A videó kodek kényszerítve van AVC-re (H.264) - A videó kodek automatikusan meghatározásra kerül - "Előnyök: + Ennek engedélyezése a videólejátszás akadozását, rosszabb akkuidőt és ismeretlen hatásokat okozhat. + + + Haptikus visszajelzés + Haptikus visszajelzés módosítása + Fejezetek haptikus visszajelzésének letiltása + A fejezetek haptikus visszajelzése le van tiltva + A fejezetek haptikus visszajelzése engedélyezve van + Pontos keresés haptikus visszajelzésének letiltása + A pontos keresés haptikus visszajelzése ki van kapcsolva + A pontos keresés haptikus visszajelzése engedélyezve van + Keresés visszavonása haptikus visszajelzésének letiltása + A keresés visszavonása haptikus visszajelzése ki van kapcsolva + A keresés visszavonása haptikus visszajelzése be van kapcsolva + Haptikus zoom letiltása + Haptikus zoom le van tiltva + Haptikus zoom be van kapcsolva + + + Ha nemrég módosította a fiókja bejelentkezési adatait, távolítsa el, majd telepítse újra a MicroG-t. + + + URL átirányítások kikerülése + URL átirányítások kikerülve + Az URL átirányítások nincsenek kikerülve + + + Hivatkozások megnyitása a böngészőben + Hivatkozások megnyitása külső böngészőben + Hivatkozások megnyitása az alkalmazáson belüli böngészőben + + + + Automatikus + Felbontás változtatások mentése + Felbontás változtatások alkalmazása az összes videóra + Felbontás változtatások alkalmazása a jelenlegi videóra + Értesítés megjelenítése videóminőség-változások esetén + Értesítés jelenik meg az alapértelmezett videóminőség megváltoztatásakor + Nem jelenik meg értesítés az alapértelmezett videóminőség megváltoztatásakor + Alapértelmezett videó minőség Wi-Fi hálózaton + Alapértelmezett videó minőség mobilhálózaton + A Shorts minőség módosításainak megjegyzése + A minőségi beállítások az összes Shorts videóra vonatkoznak + A minőségi beállítások csak a jelenlegi Short videóra vonatkoznak + Alapértelmezett Shorts minőség Wi-Fi hálózaton + Alapértelmezett Shorts minőség mobilhálózaton + mobil + wi-fi + A(z) %1$s alapértelmezett felbontása erre módosult: %2$s + A Shorts %1$s minősége megváltozott: %2$s + + + Sebesség párbeszédpanel megjelenítése + A sebesség párbeszédpanel gomb látható. Koppintson és tartsa lenyomva a lejátszási sebesség alaphelyzetbe állításához + A sebesség párbeszédpanel gomb nem látható + + + Videóminőség gomb megjelenítése + A videóminőség gomb látható. Koppintson és tartsa lenyomva a minőség alaphelyzetbe állításához + A videóminőség gomb nem látható + + + Egyedi lejátszási sebesség menü + Megjelenik az egyéni sebesség menü + Az egyéni sebesség menü nem jelenik meg + Régi lejátszási sebesség menü visszaállítása + A régi sebességmenü megjelenik + A modern sebességmenü megjelenik + Egyedi lejátszási sebesség + Egyéni lejátszási sebesség hozzáadása vagy módosítása + Az egyéni sebességeknek kevesebbnek kell lenniük, mint %s + Érvénytelen egyéni lejátszási sebességek + Automatikus + Egyéni koppintás és tartás sebesség + Lejátszási sebesség 0-8 között + + + Lejátszási sebesség módosításainak megjegyzése + A lejátszási sebesség módosítása minden videóra érvényes + A lejátszási sebesség módosítása csak a jelenlegi videóra érvényes + Értesítés megjelenítése lejátszási sebesség változások esetén + Értesítés jelenik meg az alapértelmezett lejátszási sebesség megváltoztatásakor + A felugró üzenet nem jelenik meg, amikor az alapértelmezett lejátszási sebesség megváltozik + Alapértelmezett lejátszási sebesség + Alapértelmezett sebesség módosítva: %s + + + Az HDR videó letiltása + Az HDR videó le van tiltva + Az HDR videó engedélyezve van + AVC kényszerítése (H.264) + A videó kodek kényszerítve van AVC-re (H.264) + A videó kodek automatikusan meghatározásra kerül + "Előnyök: • Javíthatja az akkumulátor élettartamát • Visszaállíthatja a hiányzó videófelbontásokat régebbi eszközökön @@ -1637,177 +1634,176 @@ Korlátozások: • A videólejátszás több internetadatot fog használni, mint a VP9 vagy az AV1 • A HDR videók nem fogják használni az AVC-t • Néhány eszköz nem tudja kikényszeríteni az AVC-t" - - - Speciális videóminőség menü megjelenítése - A speciális videóminőség menü látható - A speciális videóminőség menü nem látható - - - Csúsztatás engedélyezése a kereséshez - A csúsztatás a kereséshez engedélyezve van - A csúsztatás a kereséshez nincs engedélyezve - - - Android VR AV1 engedélyezése - "A videó kodek AVC (H.264), VP9 vagy AV1 + + + Speciális videóminőség menü megjelenítése + A speciális videóminőség menü látható + A speciális videóminőség menü nem látható + + + Csúsztatás engedélyezése a kereséshez + A csúsztatás a kereséshez engedélyezve van + A csúsztatás a kereséshez nincs engedélyezve + + + Android VR AV1 engedélyezése + "A videó kodek AVC (H.264), VP9 vagy AV1 A lejátszás akadozhat vagy képkockákat ejthet" - A videokodek AVC (H.264) vagy VP9 - "Ennek a beállításnak az engedélyezése szoftveres AV1 dekódolást használhat. + A videokodek AVC (H.264) vagy VP9 + "Ennek a beállításnak az engedélyezése szoftveres AV1 dekódolást használhat. Az AV1-es videólejátszás akadozhat vagy képkockákat ejthet." - Hamisítás mellékhatásai - • Kísérleti kliens, és bármikor leállhat - • A videó megállhat 1:00-nál, vagy előfordulhat, hogy egyes régiókban nem elérhető - • Hiányzik az hangsáv menü - • Nincs AV1 videokodek - • Stabil hangerő nem elérhető - • A gyermekeknek szóló videók nem játszódnak le, ha a felhasználó kijelentkezett, vagy inkognitómódban van. - - • Eredeti hang kényszerítése nem érhető el - Megjelenítés a Statisztikákban - A kliens típusa a Statisztikákban látható - A kliens el van rejtve a Statisztikákban - - - - - - - Névjegy - Hirdetések - Általános - Lejátszó - Egyéb - - - Videóhirdetések elrejtése - A videóhirdetések rejtve vannak - A videóhirdetések láthatók - - - Állandó ismétlés engedélyezése - Az állandó ismétlés engedélyezve van - Az állandó ismétlés letiltva van - - - Kivetítés gomb elrejtése - Kivetítés gomb elrejtve - Kivetítés gomb látható - Elrejti az előzmények gombot - Az előzmények gomb rejtett - Az előzmények gomb látható - Értesítési gomb elrejtése - Az értesítési gomb el van rejtve - Az értesítési gomb látható - Keresés gomb elrejtése - A keresés gomb el van rejtve - A keresés gomb látható - - - Kategóriasáv elrejtése - A kategóriasáv rejtve van - A kategóriasáv látható - - - Mini lejátszó színének módosítása - A mini lejátszó színe megegyezik a teljes képernyős lejátszóéval - A mini lejátszó alapértelmezett színt használ - - - Navigációs sáv - Navigációs sáv gombjainak elrejtése vagy módosítása - - Főoldal elrejtése - A Kezdőlap gomb elrejtve - A Kezdőlap gomb látható - - Minták elrejtése - A Minták gomb elrejtve - A Minták gomb látható - - Felfedezés elrejtése - A Felfedezés gomb elrejtve - A Felfedezés gomb látható - - Könyvtár elrejtése - A Könyvtár gomb elrejtve - A Könyvtár gomb látható - - Frissítés elrejtése - A Frissítés gomb elrejtve - A Frissítés gomb látható - Navigációs sáv elrejtése - A navigációs sáv elrejtve - A navigációs sáv látható - Navigációs gombok feliratainak elrejtése - A feliratok elrejtve - A feliratok láthatóak - - - A „Music Premium beszerzése” címke elrejtése - A címke rejtve van - A címke látható - - - Frissítés gomb elrejtése - A gomb rejtve van - A gomb látható - - - - - Audio hirdetések letiltása - Az audiohirdetések le vannak tiltva - Az audiohirdetések letiltása fel van oldva - - - %s nem érhető el, a hirdetések megjelennek. Próbáljon meg más hirdetésblokkoló szolgáltatást választani a beállításokban. - %s hiba történt, a hirdetések megjelennek. Próbáljon meg más hirdetésblokkoló szolgáltatást választani a beállításokban. - Beágyazott videóhirdetések blokkolása - Letiltva - - - Videós hirdetések blokkolása - Videós hirdetések blokkolva - A videós hirdetések nincsenek blokkolva - - - Üzenet törölve - Törölt üzenetek megjelenítése - Ne mutassa a törölt üzeneteket - A törölt üzenetek elrejtése egy spoiler mögé - Törölt üzenetek megjelenítése áthúzott szövegként - - - Csatornapontok automatikus gyűjtése - A csatornapontok automatikusan begyűjtődnek - A csatornapontok nem gyűjtődnek be automatikusan - - - - Twitch hibakeresési mód bekapcsolása - Twitch hibakeresési mód bekapcsolva (nem ajánlott) - Twitch hibakeresési mód kikapcsolva - - - ReVanced beállítások - Rólunk - ReVanced névjegy - Hirdetésblokkolás - Hirdetésblokkolási beállítások - Csevegés - Csevegés beállításai - Egyéb - Különféle beállítások - Általános beállítások - Egyéb beállítások - Kliensoldali hirdetések - Szerveroldali surestream hirdetések - Hibakeresési naplózás - A hibakeresési naplók engedélyezve vannak - A hibakeresési naplók le vannak tiltva - - + Hamisítás mellékhatásai + • Kísérleti kliens, és bármikor leállhat + • A videó megállhat 1:00-nál, vagy előfordulhat, hogy egyes régiókban nem elérhető + • Hiányzik az hangsáv menü + • Nincs AV1 videokodek + • Stabil hangerő nem elérhető + • A gyermekeknek szóló videók nem játszódnak le, ha a felhasználó kijelentkezett, vagy inkognitómódban van. + + • Eredeti hang kényszerítése nem érhető el + Megjelenítés a Statisztikákban + A kliens típusa a Statisztikákban látható + A kliens el van rejtve a Statisztikákban + + + + + + Névjegy + Hirdetések + Általános + Lejátszó + Egyéb + + + Videóhirdetések elrejtése + A videóhirdetések rejtve vannak + A videóhirdetések láthatók + + + Állandó ismétlés engedélyezése + Az állandó ismétlés engedélyezve van + Az állandó ismétlés letiltva van + + + Kivetítés gomb elrejtése + Kivetítés gomb elrejtve + Kivetítés gomb látható + Elrejti az előzmények gombot + Az előzmények gomb rejtett + Az előzmények gomb látható + Értesítési gomb elrejtése + Az értesítési gomb el van rejtve + Az értesítési gomb látható + Keresés gomb elrejtése + A keresés gomb el van rejtve + A keresés gomb látható + + + Kategóriasáv elrejtése + A kategóriasáv rejtve van + A kategóriasáv látható + + + Mini lejátszó színének módosítása + A mini lejátszó színe megegyezik a teljes képernyős lejátszóéval + A mini lejátszó alapértelmezett színt használ + + + Navigációs sáv + Navigációs sáv gombjainak elrejtése vagy módosítása + + Főoldal elrejtése + A Kezdőlap gomb elrejtve + A Kezdőlap gomb látható + + Minták elrejtése + A Minták gomb elrejtve + A Minták gomb látható + + Felfedezés elrejtése + A Felfedezés gomb elrejtve + A Felfedezés gomb látható + + Könyvtár elrejtése + A Könyvtár gomb elrejtve + A Könyvtár gomb látható + + Frissítés elrejtése + A Frissítés gomb elrejtve + A Frissítés gomb látható + Navigációs sáv elrejtése + A navigációs sáv elrejtve + A navigációs sáv látható + Navigációs gombok feliratainak elrejtése + A feliratok elrejtve + A feliratok láthatóak + + + A „Music Premium beszerzése” címke elrejtése + A címke rejtve van + A címke látható + + + Frissítés gomb elrejtése + A gomb rejtve van + A gomb látható + + + + + Audio hirdetések letiltása + Az audiohirdetések le vannak tiltva + Az audiohirdetések letiltása fel van oldva + + + %s nem érhető el, a hirdetések megjelennek. Próbáljon meg más hirdetésblokkoló szolgáltatást választani a beállításokban. + %s hiba történt, a hirdetések megjelennek. Próbáljon meg más hirdetésblokkoló szolgáltatást választani a beállításokban. + Beágyazott videóhirdetések blokkolása + Letiltva + + + Videós hirdetések blokkolása + Videós hirdetések blokkolva + A videós hirdetések nincsenek blokkolva + + + Üzenet törölve + Törölt üzenetek megjelenítése + Ne mutassa a törölt üzeneteket + A törölt üzenetek elrejtése egy spoiler mögé + Törölt üzenetek megjelenítése áthúzott szövegként + + + Csatornapontok automatikus gyűjtése + A csatornapontok automatikusan begyűjtődnek + A csatornapontok nem gyűjtődnek be automatikusan + + + + Twitch hibakeresési mód bekapcsolása + Twitch hibakeresési mód bekapcsolva (nem ajánlott) + Twitch hibakeresési mód kikapcsolva + + + ReVanced beállítások + Rólunk + ReVanced névjegy + Hirdetésblokkolás + Hirdetésblokkolási beállítások + Csevegés + Csevegés beállításai + Egyéb + Különféle beállítások + Általános beállítások + Egyéb beállítások + Kliensoldali hirdetések + Szerveroldali surestream hirdetések + Hibakeresési naplózás + A hibakeresési naplók engedélyezve vannak + A hibakeresési naplók le vannak tiltva + + diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 3eec1e3738..1845ace37b 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -17,1265 +17,1264 @@ "First 'item' text Second \"item\" text" ---> - - - - Հավելվածի անվանումը - - Մաքսային - Հավելվածի պատկերակը - Բնօրինակ - ReVanced - - ReVanced մինիմալ - ReVanced սանդղակավորված - - Անհատականացված - - - Վերահսկումները ձախողվել են - Բացել պաշտոնական կայքը - Մերժել - <h5>Այս հավելվածը, ըստ երևույթին, չի մշակվել ձեզ կողմից։</h5><br>Այս հավելվածը կարող է անսպասելիորեն աշխատել կամ <b>վտանգավոր լինել կամ նույնիսկ վտանգավոր լինել օգտագործման համար</b>։<br><br>Այս վերահսկումները ենթադրում են, որ այս հավելվածը նախապես մշակված է կամ ստացվել է մեկ այլ անձից։<br><br><small>%1$s</small><br>Հ強くРекомендуется <b>թվոտացնել այս հավելվածը և ինքնուրույն մշակել այն</b>՝ ապահովելու համար, որ դուք օգտագործում եք վավերացված և անվտանգ հավելված։<p><br>Եթե ​​չեք ուշադրություն դարձնում, այս նախազգուշացումը կցուցադրվի միայն երկու անգամ։ - Պատչված է տարբեր սարքի վրա - ReVanced Manager-ով չի տեղադրվել - Պատչված է ավելի քան 10 րոպե առաջ - Մշակվել է %s օր առաջ - APK-ի կառուցման ամսաթիվը վնասված է - - - ReVanced Ծանուցում - Ձեր դիտման պատմությունը չի պահպանվում.<br><br>Այս հավանական պատճառը DNS գովազդների բլոկավորիչ կամ ցանցային պրոքսի է.<br><br>Խնդրում ենք գործարկել <b>s.youtube.com</b> կամ անջատել DNS բլոկավորիչներ և պրոքսիներ: - Ավելի չցուցադրել - - - Կարգավորումներ - ReVanced - Վստա՞հ եք, որ ցանկանում եք շարունակել: - Պահպանել - Վերականգնել - Գույնը վերականգնել - Անվավեր գույն - Պահանջվում է վերագործարկում - Փոփոխությունն ուժի մեջ մտնելու համար անհրաժեշտ է վերագործարկել հավելվածը: - Վերսկսել - Ներմուծել - Պատճեն - ReVanced կարգավորումները վերադրվել են դեֆոլտային - Import %d կարգավորում - Import-ը ձախողվել է։ %s - Որոնման կարգավորումներ - «%s»-ի համար արդյունքներ չեն գտնվել - Փորձեք այլ հիմնաբառ - Վերջին որոնումները - Հեռացնե՞լ որոնման պատմությունից: - Մաքրել որոնման պատմությունը - Վստա՞հ եք, որ ցանկանում եք մաքրել որոնման ողջ պատմությունը: - Որոնման խորհուրդներ - "• Հպեք ճանապարհին՝ դրանով նավարկելու համար +--> + + + Հավելվածի անվանումը + + Մաքսային + Հավելվածի պատկերակը + Բնօրինակ + ReVanced + + ReVanced մինիմալ + ReVanced սանդղակավորված + + Անհատականացված + + + Վերահսկումները ձախողվել են + Բացել պաշտոնական կայքը + Մերժել + <h5>Այս հավելվածը, ըստ երևույթին, չի մշակվել ձեզ կողմից։</h5><br>Այս հավելվածը կարող է անսպասելիորեն աշխատել կամ <b>վտանգավոր լինել կամ նույնիսկ վտանգավոր լինել օգտագործման համար</b>։<br><br>Այս վերահսկումները ենթադրում են, որ այս հավելվածը նախապես մշակված է կամ ստացվել է մեկ այլ անձից։<br><br><small>%1$s</small><br>Հ強くРекомендуется <b>թվոտացնել այս հավելվածը և ինքնուրույն մշակել այն</b>՝ ապահովելու համար, որ դուք օգտագործում եք վավերացված և անվտանգ հավելված։<p><br>Եթե ​​չեք ուշադրություն դարձնում, այս նախազգուշացումը կցուցադրվի միայն երկու անգամ։ + Պատչված է տարբեր սարքի վրա + ReVanced Manager-ով չի տեղադրվել + Պատչված է ավելի քան 10 րոպե առաջ + Մշակվել է %s օր առաջ + APK-ի կառուցման ամսաթիվը վնասված է + + + ReVanced Ծանուցում + Ձեր դիտման պատմությունը չի պահպանվում.<br><br>Այս հավանական պատճառը DNS գովազդների բլոկավորիչ կամ ցանցային պրոքսի է.<br><br>Խնդրում ենք գործարկել <b>s.youtube.com</b> կամ անջատել DNS բլոկավորիչներ և պրոքսիներ: + Ավելի չցուցադրել + + + Կարգավորումներ + ReVanced + Վստա՞հ եք, որ ցանկանում եք շարունակել: + Պահպանել + Վերականգնել + Գույնը վերականգնել + Անվավեր գույն + Պահանջվում է վերագործարկում + Փոփոխությունն ուժի մեջ մտնելու համար անհրաժեշտ է վերագործարկել հավելվածը: + Վերսկսել + Ներմուծել + Պատճեն + ReVanced կարգավորումները վերադրվել են դեֆոլտային + Import %d կարգավորում + Import-ը ձախողվել է։ %s + Որոնման կարգավորումներ + «%s»-ի համար արդյունքներ չեն գտնվել + Փորձեք այլ հիմնաբառ + Վերջին որոնումները + Հեռացնե՞լ որոնման պատմությունից: + Մաքրել որոնման պատմությունը + Վստա՞հ եք, որ ցանկանում եք մաքրել որոնման ողջ պատմությունը: + Որոնման խորհուրդներ + "• Հպեք ճանապարհին՝ դրանով նավարկելու համար • Երկար սեղմեք կարգավորման վրա՝ դրանով նավարկելու համար • Սեղմեք Enter՝ որոնման հարցումը պատմության մեջ պահելու համար • Որոնումը անտեսում է տառատեսակը և կետադրությունը • Ծնողական կարգավորումները հայտնվում են անջատված ենթակարգավորումներից վերև" - Որոնման պատմությունը դատարկ է - Որոնման պատմությունը պահելու համար մուտքագրեք որոնման հարցում և սեղմեք Enter - Ցույց տալ կարգավորումների որոնման պատմությունը - Կարգավորումների որոնման պատմությունը ցուցադրվում է - Կարգավորումների որոնման պատմությունը ցույց չի տրվում - Ցուցադրել ReVanced-ի կարգավորումների պատկերակները - Կարգավորումների պատկերակները ցուցադրվում են - Կարգավորումների պատկերակները ցուցադրված չեն - ReVanced լեզվի - "Որոշ լեզուների թարգմանությունները կարող են բացակայել կամ թերի լինել: + Որոնման պատմությունը դատարկ է + Որոնման պատմությունը պահելու համար մուտքագրեք որոնման հարցում և սեղմեք Enter + Ցույց տալ կարգավորումների որոնման պատմությունը + Կարգավորումների որոնման պատմությունը ցուցադրվում է + Կարգավորումների որոնման պատմությունը ցույց չի տրվում + Ցուցադրել ReVanced-ի կարգավորումների պատկերակները + Կարգավորումների պատկերակները ցուցադրվում են + Կարգավորումների պատկերակները ցուցադրված չեն + ReVanced լեզվի + "Որոշ լեզուների թարգմանությունները կարող են բացակայել կամ թերի լինել: Նոր լեզուներ թարգմանելու կամ առկա թարգմանությունները բարելավելու համար այցելեք translate.revanced.app" - Հավելվածի լեզու - Ներմուծում/Արտահանում - Import / Export ReVanced կարգավորումներ - - Դուք օգտագործում եք ReVanced Patches version <i>%s</i> - Նշում - Այս տարբերակը նախապես թողարկված է, և դուք կարող եք անսպասելի խնդիրներ ունենալ - Պաշտոնական հղումներ - + Դուք օգտագործում եք ReVanced Patches version <i>%s</i> + Նշում + Այս տարբերակը նախապես թողարկված է, և դուք կարող եք անսպասելի խնդիրներ ունենալ + Պաշտոնական հղումներ + - - - GmsCore կարգավորումներ - GmsCore-ի կարգավորումներ - - MicroG GmsCore-ը տեղադրված չէ։ Տեղադրեք այն։ - Անհրաժեշտ գործողություն - "MicroG GmsCore-ը չունի ֆոնային ռեժիմում աշխատելու թույլտվություն։ + + + GmsCore կարգավորումներ + GmsCore-ի կարգավորումներ + + MicroG GmsCore-ը տեղադրված չէ։ Տեղադրեք այն։ + Անհրաժեշտ գործողություն + "MicroG GmsCore-ը չունի ֆոնային ռեժիմում աշխատելու թույլտվություն։ Հետևեք ձեր հեռախոսի \"Մի սպանեք իմ ծրագիրը\" առաջնորդությանը և կիրառեք հրահանգները ձեր MicroG տեղադրման համար։ Դա անհրաժեշտ է ծրագրի աշխատանքի համար։" - Բացել կայքը - "Խնդիրները կանխելու համար անհրաժեշտ է անջատել MicroG GmsCore մարտկոցի օպտիմալացումը։ + Բացել կայքը + "Խնդիրները կանխելու համար անհրաժեշտ է անջատել MicroG GmsCore մարտկոցի օպտիմալացումը։ MicroG-ի համար մարտկոցի օպտիմալացումը անջատելը բացասաբար չի ազդի մարտկոցի օգտագործման վրա։ Սեղմեք շարունակել կոճակը և թույլ տվեք օպտիմալացման փոփոխությունները։" - Շարունակել - - - Տեսահոսքերի կեղծում - Կեղծել հաճախորդի տեսահոսքերը՝ նվագարկման խնդիրները կանխելու համար - Հնարավոր է տեսանյութի հոսքերը փոփոխել - "Տեսահոսքերը կեղծված են + Շարունակել + + + Տեսահոսքերի կեղծում + Կեղծել հաճախորդի տեսահոսքերը՝ նվագարկման խնդիրները կանխելու համար + Հնարավոր է տեսանյութի հոսքերը փոփոխել + "Տեսահոսքերը կեղծված են Եթե դուք YouTube Premium օգտատեր եք, այս կարգավորումը կարող է անհրաժեշտ չլինել" - "Տեսահոսքերը կեղծված չեն + "Տեսահոսքերը կեղծված չեն Նվագարկումը հնարավոր է՝ չաշխատի" - Այս կարգավորումն անջատելը կարող է նվագարկման խնդիրներ առաջացնել։ - Դեֆոլտ կլիենտ - - - Բնօրինակ ձայն օգտագործել լեզուն - Օգտագործելով ձայնային օրիգինալ լեզուն - Վերջնական ձայն օգտագործվում է - - Այս հնարավորությունն օգտագործելու համար «Կեղծել վիդեո հոսքերը» տարբերակը փոխեք ցանկացած հաճախորդի, բացի Android Studio-ից - - - Debug - Միացնել կամ անջատել առաջնորդման ռեժիմի ֆունկցիաները - Առաջնորդման մատնանշում - Մարմնացման առաջնորդման մատնանշումները ակտիվացված են - Մարմնացման առաջնորդման մատնանշումները անջատված են - Մուտքագրել կուտակային կետերի հետքեր - Մարմնացման առաջնորդման մատնանշումները պարունակում են կուտակային կետի հետք - Մարմնացման առաջնորդման մատնանշումները չեն պարունակում կուտակային կետի հետք - Ցույց տալ toast ReVanced սխալի դեպքում - \"Toast\"-ը ցուցադրվում է, եթե սխալ է առաջանում - \"Toast\"-ը չի ցուցադրվում, եթե սխալ է առաջանում - "Սխալների տոաստի անջատումը թաքցնում է ReVanced-ի բոլոր սխալների ծանուցումները։ + Այս կարգավորումն անջատելը կարող է նվագարկման խնդիրներ առաջացնել։ + Դեֆոլտ կլիենտ + + + Բնօրինակ ձայն օգտագործել լեզուն + Օգտագործելով ձայնային օրիգինալ լեզուն + Վերջնական ձայն օգտագործվում է + + Այս հնարավորությունն օգտագործելու համար «Կեղծել վիդեո հոսքերը» տարբերակը փոխեք ցանկացած հաճախորդի, բացի Android Studio-ից + + + Debug + Միացնել կամ անջատել առաջնորդման ռեժիմի ֆունկցիաները + Առաջնորդման մատնանշում + Մարմնացման առաջնորդման մատնանշումները ակտիվացված են + Մարմնացման առաջնորդման մատնանշումները անջատված են + Մուտքագրել կուտակային կետերի հետքեր + Մարմնացման առաջնորդման մատնանշումները պարունակում են կուտակային կետի հետք + Մարմնացման առաջնորդման մատնանշումները չեն պարունակում կուտակային կետի հետք + Ցույց տալ toast ReVanced սխալի դեպքում + \"Toast\"-ը ցուցադրվում է, եթե սխալ է առաջանում + \"Toast\"-ը չի ցուցադրվում, եթե սխալ է առաջանում + "Սխալների տոաստի անջատումը թաքցնում է ReVanced-ի բոլոր սխալների ծանուցումները։ Դուք չեք ստանա ան予期した出来事ի մասին ծանուցում։" - Արտահանել վրեժխնդրության կարգաբերման մատյանները - Պատճենում է ReVanced-ի կարգաբերման մատյանները սեղմատախտակին - Վրեժխնդրության մատյանների գրանցումն անջատված է - Մատյաններ չեն գտնվել - Մատյանները պատճենված են - Չհաջողվեց արտահանել տեղեկամատյանները՝ %s - Մաքրել վրեժխնդրության մատյանները - Մաքրում է բոլոր պահված ReVanced կարգաբերման մատյանները - Մատյանները մաքրվել են - Գործառույթի դրոշակների Manager - Կառավարել բուլյան գործառույթի դրոշակները - Ակտիվ դրոշակներ (%d) - Արգելափակված դրոշակներ (%d) - Որոնել դրոշակներ... - Դրոշակները պահպանվեցին - Դրոշակները զրոյացվեցին - Դրոշակները պատճենվեցին սեղմատախտակին - Բուֆերի արձանագրությունը մտնել - Մարմնացման առաջնորդման մատնանշումները պարունակում են բուֆերի տարր - Մարմնացման առաջնորդման մատնանշումները ներառում են բուֆերի տարր - "Այս կարգավորումը միացնելը կգրանցի լրացուցիչ դասավորության տվյալներ, ներառյալ էկրանի տեքստը որոշ UI բաղադրիչների համար։ + Արտահանել վրեժխնդրության կարգաբերման մատյանները + Պատճենում է ReVanced-ի կարգաբերման մատյանները սեղմատախտակին + Վրեժխնդրության մատյանների գրանցումն անջատված է + Մատյաններ չեն գտնվել + Մատյանները պատճենված են + Չհաջողվեց արտահանել տեղեկամատյանները՝ %s + Մաքրել վրեժխնդրության մատյանները + Մաքրում է բոլոր պահված ReVanced կարգաբերման մատյանները + Մատյանները մաքրվել են + Գործառույթի դրոշակների Manager + Կառավարել բուլյան գործառույթի դրոշակները + Ակտիվ դրոշակներ (%d) + Արգելափակված դրոշակներ (%d) + Որոնել դրոշակներ... + Դրոշակները պահպանվեցին + Դրոշակները զրոյացվեցին + Դրոշակները պատճենվեցին սեղմատախտակին + Բուֆերի արձանագրությունը մտնել + Մարմնացման առաջնորդման մատնանշումները պարունակում են բուֆերի տարր + Մարմնացման առաջնորդման մատնանշումները ներառում են բուֆերի տարր + "Այս կարգավորումը միացնելը կգրանցի լրացուցիչ դասավորության տվյալներ, ներառյալ էկրանի տեքստը որոշ UI բաղադրիչների համար։ Սա կարող է օգնել բացահայտել բաղադրիչները՝ հատուկ զտիչներ ստեղծելիս։ Այնուամենայնիվ, սա միացնելը կգրանցի նաև օգտատիրոջ որոշ տվյալներ, ինչպիսիք են ձեր IP հասցեն:" - - - Մաքրել համօգտագործման հղումները - Հետևման հարցման պարամետրը հեռացված է համօգտագործված հղումներից - Հետևման հարցման պարամետրը հեռացված չէ համօգտագործված հղումներից - Փոխել համօգտագործման հղումները youtube.com-ի - Համօգտագործվող հղումները օգտագործում են youtube.com - Համօգտագործվող հղումները օգտագործում են music.youtube.com - - - Պատրաստված լրացուցիչ կարգավորումներ - Թաքցնել բաղադրիչները՝ օգտագործելով պատրաստված լրացուցիչ կարգավորումներ - Միացնել պատրաստված լրացուցիչ կարգավորումները - Պատրաստված լրացուցիչ կարգավորումները միացված են - Պատրաստված լրացուցիչ կարգավորումները անջատված են - Պատրաստված լրացուցիչ կարգավորումներ - - Բաղադրիչների ուղիների կառուցողական լարերը, որոնք պետք է լրացուցիչ կարգավորվեն, միմյանցից բաժանված են նոր տողով - Անվավեր պատրաստված լրացուցիչ կարգավորումներ։ %s - - - - - Ծրագրի մասին - Գովազդներ - Ալտերնատիվ մանրապատկերներ - Լրակազմ - Ընդհանուր - Կատարող - Վազքի գիծ - Սահելի վերահսկում - Տարբեր - Տեսանյութ - Վերականգնել հին սահմանումների մենյուները - Նախկին կարգավորումների մենյուները ցուցադրվում են - Նախկին կարգավորումների մենյուները չեն ցուցադրվում - - - Անջատել Shorts-ի ֆոնային վերարտադրությունը - Shorts-ի ֆոնային վերարտադրությունը անջատված է - Shorts-ի ֆոնային վերարտադրությունը հնարավոր է - - - Թաքցնել ալբոմի քարտերը - Ալբոմի քարտերը թաքցված են - Ալբոմի քարտերը ցույց են տրվում - Թաքցնել կատարողների քարտերը - Կատարողների քարտերը թաքցված են - Կատարողների քարտերը երևում են - Թաքցնել չիպսի մարզը - Չիպսերի դարակը թաքցված է - Չիպսերի դարակը երևում է - Թաքցնել համայնքային գրառումները - Համայնքային գրառումները թաքցված են - Համայնքային գրառումները երևում են - Թաքցնել կոմպակտ բաները - Կոմպակտ բաները թաքցված են - Կոմպակտ բաները երևում են - Թաքցնել ընդլայնվող քարտը - Տեսանյութերի տակ գտնվող ընդլայնվող քարտը թաքնված է - Տեսանյութերի տակ գտնվող ընդլայնվող քարտը ցուցադրված է - Թաքցնել միկրոֆոնի ողջ կոճակը - Որոնման լողացող խոսափողի կոճակը թաքնված է - Լողացող խոսափողի կոճակը որոնման մեջ ցուցադրվում է - Թաքցնել հորիզոնական մարզերը - "Հորիզոնական դարակները թաքնված են, ինչպիսիք են: + + + Մաքրել համօգտագործման հղումները + Հետևման հարցման պարամետրը հեռացված է համօգտագործված հղումներից + Հետևման հարցման պարամետրը հեռացված չէ համօգտագործված հղումներից + Փոխել համօգտագործման հղումները youtube.com-ի + Համօգտագործվող հղումները օգտագործում են youtube.com + Համօգտագործվող հղումները օգտագործում են music.youtube.com + + + Պատրաստված լրացուցիչ կարգավորումներ + Թաքցնել բաղադրիչները՝ օգտագործելով պատրաստված լրացուցիչ կարգավորումներ + Միացնել պատրաստված լրացուցիչ կարգավորումները + Պատրաստված լրացուցիչ կարգավորումները միացված են + Պատրաստված լրացուցիչ կարգավորումները անջատված են + Պատրաստված լրացուցիչ կարգավորումներ + + Բաղադրիչների ուղիների կառուցողական լարերը, որոնք պետք է լրացուցիչ կարգավորվեն, միմյանցից բաժանված են նոր տողով + Անվավեր պատրաստված լրացուցիչ կարգավորումներ։ %s + + + + + Ծրագրի մասին + Գովազդներ + Ալտերնատիվ մանրապատկերներ + Լրակազմ + Ընդհանուր + Կատարող + Վազքի գիծ + Սահելի վերահսկում + Տարբեր + Տեսանյութ + Վերականգնել հին սահմանումների մենյուները + Նախկին կարգավորումների մենյուները ցուցադրվում են + Նախկին կարգավորումների մենյուները չեն ցուցադրվում + + + Անջատել Shorts-ի ֆոնային վերարտադրությունը + Shorts-ի ֆոնային վերարտադրությունը անջատված է + Shorts-ի ֆոնային վերարտադրությունը հնարավոր է + + + Թաքցնել ալբոմի քարտերը + Ալբոմի քարտերը թաքցված են + Ալբոմի քարտերը ցույց են տրվում + Թաքցնել կատարողների քարտերը + Կատարողների քարտերը թաքցված են + Կատարողների քարտերը երևում են + Թաքցնել չիպսի մարզը + Չիպսերի դարակը թաքցված է + Չիպսերի դարակը երևում է + Թաքցնել համայնքային գրառումները + Համայնքային գրառումները թաքցված են + Համայնքային գրառումները երևում են + Թաքցնել կոմպակտ բաները + Կոմպակտ բաները թաքցված են + Կոմպակտ բաները երևում են + Թաքցնել ընդլայնվող քարտը + Տեսանյութերի տակ գտնվող ընդլայնվող քարտը թաքնված է + Տեսանյութերի տակ գտնվող ընդլայնվող քարտը ցուցադրված է + Թաքցնել միկրոֆոնի ողջ կոճակը + Որոնման լողացող խոսափողի կոճակը թաքնված է + Լողացող խոսափողի կոճակը որոնման մեջ ցուցադրվում է + Թաքցնել հորիզոնական մարզերը + "Հորիզոնական դարակները թաքնված են, ինչպիսիք են: • Թարմ նորություններ • Շարունակել դիտելը • Բացահայտել ավելի շատ ալիքներ • Ամենաակտուալը • Գնումներ • Կրկին դիտել" - Ցուցադրված են հորիզոնական դարակները - Թաքցնել պատկերների դարակը - Որոնման արդյունքներում պատկերների դարակը թաքնված է - Որոնման արդյունքներում պատկերների դարակը ցուցադրված է - Թաքցնել վերջին գրառումները - Վերջին գրառումները թաքցված են - Վերջին գրառումները երևում են - Թաքցնել խառը ցուցակները - Խառը ցուցակները թաքցված են - Խառը ցուցակները երևում են - Թաքցնել ֆիլմերի բաժինը - Ֆիլմերի բաժինը թաքցված է - Ֆիլմերի բաժինը երևում է - - Թաքցնել \'Notify me\' կոճակը - Ինձ ծանուցել կոճակը թաքնված է - Ինձ ծանուցել կոճակը ցուցադրված է - Թաքցնել խաղերը - Խաղերը թաքցված են - Խաղերը երևում են - - Թաքցնել \'Show more\' կոճակը - Որոնման արդյունքներում «Ավելին ցույց տալ» կոճակը թաքնված է - Որոնման արդյունքներում «Ավելին ցույց տալ» կոճակը ցուցադրված է - Թաքցնել հարցումները - Հարցումները թաքնված են - Հարցումները ցուցադրվում են - Թաքցնել տոմսարկղի մարզը - Տոմսարկղի մարզը թաքցված է - Տոմսարկղի մարզը ցուցադրվում է - - Թաքցնել տեսանյութի առաջարկի պիտակները - «Մարդիկ նույնպես դիտել են» և «Ձեզ կարող է նաև դուր գալ» պիտակները որոնման արդյունքներում թաքնված են - «Մարդիկ նույնպես դիտել են» և «Ձեզ կարող է նաև դուր գալ» պիտակները որոնման արդյունքներում ցուցադրված են - Թաքցնել տեսողական միջակայքը - Տեսողական միջակայքը թաքցված է - Տեսողական միջակայքը ցուցադրված է - - Թաքցնել YouTube-ի Doodles-ները - YouTube Doodles անիմացիան լոգոյի վրա թաքնված է - YouTube Doodles անիմացիան լոգոյի վրա ցուցադրվում է - "YouTube Doodles-ները ցուցադրվում են տարեկան մի քանի օր։ + Թաքցնել \'Show more\' կոճակը + Որոնման արդյունքներում «Ավելին ցույց տալ» կոճակը թաքնված է + Որոնման արդյունքներում «Ավելին ցույց տալ» կոճակը ցուցադրված է + Թաքցնել հարցումները + Հարցումները թաքնված են + Հարցումները ցուցադրվում են + Թաքցնել տոմսարկղի մարզը + Տոմսարկղի մարզը թաքցված է + Տոմսարկղի մարզը ցուցադրվում է + + Թաքցնել տեսանյութի առաջարկի պիտակները + «Մարդիկ նույնպես դիտել են» և «Ձեզ կարող է նաև դուր գալ» պիտակները որոնման արդյունքներում թաքնված են + «Մարդիկ նույնպես դիտել են» և «Ձեզ կարող է նաև դուր գալ» պիտակները որոնման արդյունքներում ցուցադրված են + Թաքցնել տեսողական միջակայքը + Տեսողական միջակայքը թաքցված է + Տեսողական միջակայքը ցուցադրված է + + Թաքցնել YouTube-ի Doodles-ները + YouTube Doodles անիմացիան լոգոյի վրա թաքնված է + YouTube Doodles անիմացիան լոգոյի վրա ցուցադրվում է + "YouTube Doodles-ները ցուցադրվում են տարեկան մի քանի օր։ Եթե Doodle-ը ներկայումս ցուցադրվում է ձեր տարածաշրջանում և այս թաքցնելու առաջադրանքը միացված է, ապա ֆիլտրի գոտին, որը գտնվում է որոնման գոտուց ներքև, նույնպես կթաքնվի։" - Թաքցնել ալիքի գծանշանը - Ալիքի գծանշանը թաքցված է - Ալիքի գծանշանը երևում է - Թաքցնել ալիքի ջրային նշանը - Ջրային նշանը թաքցված է - Ջրային նշանը ցույց է տրվում - Թաքցնել հավաքագրման պատուհանը - Հավաքագրման պատուհանը թաքցված է - Հավաքագրման պատուհանը ցույց է տրվում - Թաքցնել արտակարգ իրավիճակների տուփերը - Արտակարգ իրավիճակների տուփերը թաքցված են - Արտակարգ իրավիճակների տուփերը երևում են - Թաքցնել տեղեկատվական վահանակները - Տեղեկատվական վահանակները թաքցված են - Տեղեկատվական վահանակները երևում են - - Թաքցնել Join կոճակը - Միանալ կոճակը թաքնված է - Միանալ կոճակը ցուցադրված է - Թաքցնել բժշկական վահանակները - Բժշկական վահանակները թաքցված են - Բժշկական վահանակները երևում են - Թաքցնել արագ գործողությունները - Ամբողջ էկրանի արագ գործողությունները թաքնված են - Ամբողջ էկրանի արագ գործողությունները ցուցադրված են - Թաքցնել հարակից տեսանյութերը - Արագ գործողությունների հարակից տեսանյութերը թաքնված են - Արագ գործողությունների հարակից տեսանյութերը ցուցադրված են - Թաքցնել բաժանորդների ուղեցույցները - Բաժանորդագրերի համայնքի կանոնները թաքցված են - Բաժանորդագրերի համայնքի կանոնները երևում են - Թաքցնել ժամանակավոր ռեակցիաները - Ժամանակավոր ռեակցիաները թաքցված են - Ժամանակավոր ռեակցիաները ցույց են տրվում - Թաքցնել «AI-ով ստեղծված տեսանյութի ամփոփումը» - Արհեստական բանականության կողմից ստեղծված տեսանյութի ամփոփման բաժինը թաքցված է - Արհեստական բանականությամբ ստեղծված տեսանյութի ամփոփման բաժինը ցուցադրվում է - Թաքցնել հարցումը - Հարցումների բաժինը թաքցված է - Հարցումների բաժինը ցուցադրվում է - Թաքցնել հատկանիշները - Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները թաքցված են - Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները ցուցադրվում են - Թաքցնել գլուխները - Գլուխների բաժինը թաքցված է - Գլուխների բաժինը երևում է - Թաքցնել \"Ինչպես է պատրաստվել այս բովանդակությունը\" - Ինչպես է պատրաստվել այս բովանդակությունը բաժինը թաքցված է - Ինչպես է պատրաստվել այս բովանդակությունը բաժինը ցուցադրվում է - Թաքցնել Hype միավորները - Hype միավորները թաքնված են - Hype միավորները ցուցադրվում են - Թաքցնել \"Բացահայտեք փոդքասթը\" - Բացահայտեք փոդքասթը բաժինը թաքցված է - Բացահայտեք փոդքասթը բաժինը ցուցադրվում է - Թաքցնել առաջարկվող հղումները - Առանձնահատուկ հղումների բաժինը թաքցված է - Առանձնահատուկ հղումների բաժինը ցուցադրված է - Թաքցնել Առանձնահատուկ տեսանյութերը - Առանձնահատուկ տեսանյութերի բաժինը թաքցված է - Առանձնահատուկ տեսանյութերի բաժինը ցուցադրված է - Թաքցնել Տեղեկատվական քարտերը - Տեղեկատվական քարտերի բաժինը թաքցված է - Տեղեկատվական քարտերի բաժինը երևում է - Թաքցնել \"Հիմնական հասկացությունները\" - Հիմնական հասկացությունների բաժինը թաքցված է - Հիմնական հասկացությունների բաժինը ցուցադրվում է - Թաքցնել Բաժանորդագրվել կոճակը - Բաժանորդագրվել կոճակը թաքցված է - Բաժանորդագրվել կոճակը ցուցադրված է - Թաքցնել վերծանումը - Տեքստի բաժինը թաքցված է - Տեքստի բաժինը երևում է - Տեսանյութի նկարագրություն - Թաքցնել կամ ցույց տալ տեսանյութի նկարագրության բաղադրամասերը - Ֆիլտրի գիծ - Թաքցնել կամ ցուցադրել զտիչի գոտին լրահոսերում, հարակից տեսանյութերում, որոնման արդյունքներում և դիտման պատմության մեջ - Թաքցնել լրահոսերում - Թաքցված է լրահոսերում - Ցուցադրված է լրահոսերում - Թաքցնել կապված տեսանյութերում - Թաքցված է կապված տեսանյութերում - Ցույց է տրվում կապված տեսանյութերում - Թաքցնել որոնման արդյունքներում - Թաքնված է որոնման արդյունքներում - Ցուցադրված է որոնման արդյունքներում - Թաքցնել դիտումների պատմությունում - Թաքցված է դիտման պատմության մեջ - Ցուցադրվում է դիտումների պատմությունում - Ալիքի էջ - Թաքցնել կամ ցուցադրել ալիքի էջի բաղադրիչները - - Թաքցնել Համայնքի կոճակը - Համայնքի կոճակը թաքնված է - Համայնքի կոճակը ցուցադրված է - - Թաքցնել \'Ձեզ համար\' դարակը - «Քեզ համար» դարակը թաքնված է - «Քեզ համար» դարակը ցուցադրված է - - Թաքցնել Միանալ կոճակը - Միանալ կոճակը թաքնված է - Միանալ կոճակը ցուցադրված է - Թաքցնել հղումների նախադիտումը - Հղումների նախադիտումը թաքնված է - Հղումների նախադիտումը ցուցադրված է - Թաքցնել անդամների դարակը - Անդամների դարակը թաքնված է - Մասնակիցների դարակը ցուցադրված է - - Թաքցնել Խանութի կոճակը - Խանութի կոճակը թաքնված է - Խանութի կոճակը ցուցադրված է - - Թաքցնել Բաժանորդագրվել կոճակը - Բաժանորդագրվել կոճակը թաքնված է - Բաժանորդագրվել կոճակը ցուցադրված է - Մեկնաբանություններ - Թաքցնել կամ ցույց տալ մեկնաբանությունների բաժնի բաղադրամասերը - Թաքցնել արհեստական բանականության զրույցի ամփոփումը - Արհեստական բանականության զրույցի ամփոփումը թաքցված է - Արհեստական բանականության զրույցի ամփոփումը ցուցադրված է - Թաքցնել AI մեկնաբանությունների ամփոփումը - Արհեստական բանականության մեկնաբանությունների ամփոփումը թաքցված է - Արհեստական բանականության մեկնաբանությունների ամփոփումը ցուցադրված է - Թաքցնել ալիքի ուղեցույցները - Ալիքի ուղեցույցները թաքցված են - Ալիքի ուղեցույցները ցուցադրված են - Թաքցնել \"Մեկնաբանություններ անդամների կողմից\" վերնագիրը - Մասնակիցների կողմից մեկնաբանությունների վերնագիրը թաքցված է - Մասնակիցների կողմից մեկնաբանությունների վերնագիրը ցուցադրվում է - Թաքցնել մեկնաբանությունների բաժինը - Մեկնաբանությունների բաժինը թաքցված է - Մեկնաբանությունների բաժինը երևում է - Թաքցնել համայնքի ուղեցույցները - Համայնքի ուղեցույցները թաքնված են - Համայնքի ուղեցույցները ցուցադրված են - Թաքցնել \"Ստեղծել Shorts\" կոճակը - \"Ստեղծել Short\" կոճակը թաքցված է - \"Ստեղծել Short\" կոճակը ցուցադրվում է - Թաքցնել Էմոջիի և Ժամանակի նիշի կոճակները - Էմոջիի և Ժամանակի նիշի կոճակները թաքցված են - Էմոջիի և Ժամանակի նիշի կոճակները ցուցադրված են - Թաքցնել նախադիտման մեկնաբանությունը - Նախադիտման մեկնաբանությունը թաքցված է - Նախադիտման մեկնաբանությունը երևում է - Թաքցնել շնորհակալության կոճակը - \"Շնորհակալություն\" կոճակը թաքցված է - \"Շնորհակալություն\" կոճակը երևում է - Թաքցնել դիտումների քանակը - Դիտումների քանակը թաքնված է լրահոսում և որոնման արդյունքներում - Դիտումների քանակը ցուցադրվում է լրահոսում և որոնման արդյունքներում - - "Սահմանափակումներ. + Թաքցնել Join կոճակը + Միանալ կոճակը թաքնված է + Միանալ կոճակը ցուցադրված է + Թաքցնել բժշկական վահանակները + Բժշկական վահանակները թաքցված են + Բժշկական վահանակները երևում են + Թաքցնել արագ գործողությունները + Ամբողջ էկրանի արագ գործողությունները թաքնված են + Ամբողջ էկրանի արագ գործողությունները ցուցադրված են + Թաքցնել հարակից տեսանյութերը + Արագ գործողությունների հարակից տեսանյութերը թաքնված են + Արագ գործողությունների հարակից տեսանյութերը ցուցադրված են + Թաքցնել բաժանորդների ուղեցույցները + Բաժանորդագրերի համայնքի կանոնները թաքցված են + Բաժանորդագրերի համայնքի կանոնները երևում են + Թաքցնել ժամանակավոր ռեակցիաները + Ժամանակավոր ռեակցիաները թաքցված են + Ժամանակավոր ռեակցիաները ցույց են տրվում + Թաքցնել «AI-ով ստեղծված տեսանյութի ամփոփումը» + Արհեստական բանականության կողմից ստեղծված տեսանյութի ամփոփման բաժինը թաքցված է + Արհեստական բանականությամբ ստեղծված տեսանյութի ամփոփման բաժինը ցուցադրվում է + Թաքցնել հարցումը + Հարցումների բաժինը թաքցված է + Հարցումների բաժինը ցուցադրվում է + Թաքցնել հատկանիշները + Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները թաքցված են + Առաջարկվող վայրերը, խաղերը, երաժշտությունը և նշված անձանց բաժինները ցուցադրվում են + Թաքցնել գլուխները + Գլուխների բաժինը թաքցված է + Գլուխների բաժինը երևում է + Թաքցնել \"Ինչպես է պատրաստվել այս բովանդակությունը\" + Ինչպես է պատրաստվել այս բովանդակությունը բաժինը թաքցված է + Ինչպես է պատրաստվել այս բովանդակությունը բաժինը ցուցադրվում է + Թաքցնել Hype միավորները + Hype միավորները թաքնված են + Hype միավորները ցուցադրվում են + Թաքցնել \"Բացահայտեք փոդքասթը\" + Բացահայտեք փոդքասթը բաժինը թաքցված է + Բացահայտեք փոդքասթը բաժինը ցուցադրվում է + Թաքցնել առաջարկվող հղումները + Առանձնահատուկ հղումների բաժինը թաքցված է + Առանձնահատուկ հղումների բաժինը ցուցադրված է + Թաքցնել Առանձնահատուկ տեսանյութերը + Առանձնահատուկ տեսանյութերի բաժինը թաքցված է + Առանձնահատուկ տեսանյութերի բաժինը ցուցադրված է + Թաքցնել Տեղեկատվական քարտերը + Տեղեկատվական քարտերի բաժինը թաքցված է + Տեղեկատվական քարտերի բաժինը երևում է + Թաքցնել \"Հիմնական հասկացությունները\" + Հիմնական հասկացությունների բաժինը թաքցված է + Հիմնական հասկացությունների բաժինը ցուցադրվում է + Թաքցնել Բաժանորդագրվել կոճակը + Բաժանորդագրվել կոճակը թաքցված է + Բաժանորդագրվել կոճակը ցուցադրված է + Թաքցնել վերծանումը + Տեքստի բաժինը թաքցված է + Տեքստի բաժինը երևում է + Տեսանյութի նկարագրություն + Թաքցնել կամ ցույց տալ տեսանյութի նկարագրության բաղադրամասերը + Ֆիլտրի գիծ + Թաքցնել կամ ցուցադրել զտիչի գոտին լրահոսերում, հարակից տեսանյութերում, որոնման արդյունքներում և դիտման պատմության մեջ + Թաքցնել լրահոսերում + Թաքցված է լրահոսերում + Ցուցադրված է լրահոսերում + Թաքցնել կապված տեսանյութերում + Թաքցված է կապված տեսանյութերում + Ցույց է տրվում կապված տեսանյութերում + Թաքցնել որոնման արդյունքներում + Թաքնված է որոնման արդյունքներում + Ցուցադրված է որոնման արդյունքներում + Թաքցնել դիտումների պատմությունում + Թաքցված է դիտման պատմության մեջ + Ցուցադրվում է դիտումների պատմությունում + Ալիքի էջ + Թաքցնել կամ ցուցադրել ալիքի էջի բաղադրիչները + + Թաքցնել Համայնքի կոճակը + Համայնքի կոճակը թաքնված է + Համայնքի կոճակը ցուցադրված է + + Թաքցնել \'Ձեզ համար\' դարակը + «Քեզ համար» դարակը թաքնված է + «Քեզ համար» դարակը ցուցադրված է + + Թաքցնել Միանալ կոճակը + Միանալ կոճակը թաքնված է + Միանալ կոճակը ցուցադրված է + Թաքցնել հղումների նախադիտումը + Հղումների նախադիտումը թաքնված է + Հղումների նախադիտումը ցուցադրված է + Թաքցնել անդամների դարակը + Անդամների դարակը թաքնված է + Մասնակիցների դարակը ցուցադրված է + + Թաքցնել Խանութի կոճակը + Խանութի կոճակը թաքնված է + Խանութի կոճակը ցուցադրված է + + Թաքցնել Բաժանորդագրվել կոճակը + Բաժանորդագրվել կոճակը թաքնված է + Բաժանորդագրվել կոճակը ցուցադրված է + Մեկնաբանություններ + Թաքցնել կամ ցույց տալ մեկնաբանությունների բաժնի բաղադրամասերը + Թաքցնել արհեստական բանականության զրույցի ամփոփումը + Արհեստական բանականության զրույցի ամփոփումը թաքցված է + Արհեստական բանականության զրույցի ամփոփումը ցուցադրված է + Թաքցնել AI մեկնաբանությունների ամփոփումը + Արհեստական բանականության մեկնաբանությունների ամփոփումը թաքցված է + Արհեստական բանականության մեկնաբանությունների ամփոփումը ցուցադրված է + Թաքցնել ալիքի ուղեցույցները + Ալիքի ուղեցույցները թաքցված են + Ալիքի ուղեցույցները ցուցադրված են + Թաքցնել \"Մեկնաբանություններ անդամների կողմից\" վերնագիրը + Մասնակիցների կողմից մեկնաբանությունների վերնագիրը թաքցված է + Մասնակիցների կողմից մեկնաբանությունների վերնագիրը ցուցադրվում է + Թաքցնել մեկնաբանությունների բաժինը + Մեկնաբանությունների բաժինը թաքցված է + Մեկնաբանությունների բաժինը երևում է + Թաքցնել համայնքի ուղեցույցները + Համայնքի ուղեցույցները թաքնված են + Համայնքի ուղեցույցները ցուցադրված են + Թաքցնել \"Ստեղծել Shorts\" կոճակը + \"Ստեղծել Short\" կոճակը թաքցված է + \"Ստեղծել Short\" կոճակը ցուցադրվում է + Թաքցնել Էմոջիի և Ժամանակի նիշի կոճակները + Էմոջիի և Ժամանակի նիշի կոճակները թաքցված են + Էմոջիի և Ժամանակի նիշի կոճակները ցուցադրված են + Թաքցնել նախադիտման մեկնաբանությունը + Նախադիտման մեկնաբանությունը թաքցված է + Նախադիտման մեկնաբանությունը երևում է + Թաքցնել շնորհակալության կոճակը + \"Շնորհակալություն\" կոճակը թաքցված է + \"Շնորհակալություն\" կոճակը երևում է + Թաքցնել դիտումների քանակը + Դիտումների քանակը թաքնված է լրահոսում և որոնման արդյունքներում + Դիտումների քանակը ցուցադրվում է լրահոսում և որոնման արդյունքներում + + "Սահմանափակումներ. • Shorts-ի բաժինները, ալիքի էջերը և որոնման արդյունքները կարող են դեռևս ցուցադրել դիտումների քանակը • Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ" - Թաքցնել վերբեռնման ժամանակը - Վերբեռնման ժամանակը թաքցված է լրահոսում և որոնման արդյունքներում - Վերբեռնման ժամանակը ցուցադրված է լրահոսում և որոնման արդյունքներում - - "Սահմանափակումներ: + Թաքցնել վերբեռնման ժամանակը + Վերբեռնման ժամանակը թաքցված է լրահոսում և որոնման արդյունքներում + Վերբեռնման ժամանակը ցուցադրված է լրահոսում և որոնման արդյունքներում + + "Սահմանափակումներ: • Shorts-ի դարակները, ալիքի էջերը և որոնման արդյունքները կարող են դեռևս ցուցադրել վերբեռնման ժամանակները • Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ" - Թաքցնել բանալի բառերի բովանդակությունը - Թաքցնել որոնումը և կերակրման տեսանյութերը՝ օգտագործելով բանալի բառերի լրացուցիչ կարգավորումներ - Թաքցնել տնային տեսանյութերը բանալի բառերի միջոցով - Տնային ներդիրի տեսանյութերը լրացուցիչ կարգավորվում են բանալի բառերի միջոցով - Տնային ներդիրի տեսանյութերը չեն լրացուցիչ կարգավորվում բանալի բառերի միջոցով - Թաքցնել որոնման արդյունքները բանալի բառերի միջոցով - Որոնման արդյունքները լրացուցիչ կարգավորվում են բանալի բառերի միջոցով - Որոնման արդյունքները չեն լրացուցիչ կարգավորվում բանալի բառերի միջոցով - Թաքցնել արձանագրության տեսանյութերը բանալի բառերի միջոցով - Արձանագրության ներդիրի տեսանյութերը լրացուցիչ կարգավորվում են բանալի բառերի միջոցով - Արձանագրության ներդիրի տեսանյութերը չեն լրացուցիչ կարգավորվում բանալի բառերի միջոցով - Թաքցնելու բանալի բառեր - - "Թաքցնելու բառեր և արտահայտություններ, որոնք բաժանված են նոր տողերով + "Թաքցնելու բառեր և արտահայտություններ, որոնք բաժանված են նոր տողերով Բառերը կարող են լինել ալիքի անուններ կամ տեսանյութի վերնագրերում ցուցադրված ցանկացած տեքստ Միջին մեծատառերով բառերը պետք է մուտքագրվեն իրենց մեծատառով (օրինակ՝ iPhone, TikTok, LeBlanc)" - Բանալի բառերի լրացուցիչ կարգավորման մասին - "«Գլխավոր էջ/Գրառում/Որոնում» արդյունքները զտվում են, որպեսզի թաքցվեն բառերին համապատասխանող բովանդակությունը + Բանալի բառերի լրացուցիչ կարգավորման մասին + "«Գլխավոր էջ/Գրառում/Որոնում» արդյունքները զտվում են, որպեսզի թաքցվեն բառերին համապատասխանող բովանդակությունը Սահմանափակումներ • Shorts-ները չեն կարող թաքցվել ալիքի անունով • Որոշ UI մասեր կարող է չթաքցվեն • Բառով որոնումը կարող է ոչ մի արդյունք չտալ" - Համապատասխանեցնել ամբողջական բառերին - - Կէյվըրդ/պհրազան կրկնակի մեջբերման նշանների մեջ դնելը կանխում է վիդեո վերնագրերի և ալիքների անունների մասնակի համընկնումները<br><br>Օրինակ,<br><b>\"ai\"</b> կը թաքցնի հետևյալ վիդեոն․ <b>How does AI work?</b><br>բայց չի թաքցնի․ <b>What does fair use mean?</b> - - Չի կարող օգտագործվել բանալի բառը։ %s - Ավելացնել մեջբերման նշաններ՝ բանալի բառը օգտագործելու համար։ %s - Բանալի բառը ունի հակասող հայտարարություններ։ %s - Բանալի բառը շատ կարճ է և պահանջում է մեջբերման նշաններ։ %s - Բանալի բառը կթաքցնի բոլոր տեսանյութերը։ %s - - - Թաքցնել ստեղծողի խանութի դարակը - Ստեղծողի խանութի դարակը տեսանվագարկչի տակ թաքնված է - Ստեղծողի խանութի դարակը վիդեո նվագարկչի տակ ցուցադրվում է - Թաքցնել վերջնական էկրանի խանութի բաները - Վերջնական էկրանի խանութի դրոշակը թաքնված է - Վերջնական էկրանի խանութի դրոշակը ցուցադրված է - Թաքցնել լի էկրանի գովազդները - "«Լրիվ էկրան» գովազդները թաքցվում են + Համապատասխանեցնել ամբողջական բառերին + + Կէյվըրդ/պհրազան կրկնակի մեջբերման նշանների մեջ դնելը կանխում է վիդեո վերնագրերի և ալիքների անունների մասնակի համընկնումները<br><br>Օրինակ,<br><b>\"ai\"</b> կը թաքցնի հետևյալ վիդեոն․ <b>How does AI work?</b><br>բայց չի թաքցնի․ <b>What does fair use mean?</b> + + Չի կարող օգտագործվել բանալի բառը։ %s + Ավելացնել մեջբերման նշաններ՝ բանալի բառը օգտագործելու համար։ %s + Բանալի բառը ունի հակասող հայտարարություններ։ %s + Բանալի բառը շատ կարճ է և պահանջում է մեջբերման նշաններ։ %s + Բանալի բառը կթաքցնի բոլոր տեսանյութերը։ %s + + + Թաքցնել ստեղծողի խանութի դարակը + Ստեղծողի խանութի դարակը տեսանվագարկչի տակ թաքնված է + Ստեղծողի խանութի դարակը վիդեո նվագարկչի տակ ցուցադրվում է + Թաքցնել վերջնական էկրանի խանութի բաները + Վերջնական էկրանի խանութի դրոշակը թաքնված է + Վերջնական էկրանի խանութի դրոշակը ցուցադրված է + Թաքցնել լի էկրանի գովազդները + "«Լրիվ էկրան» գովազդները թաքցվում են Այս հատկությունը հասանելի է միայն հին սարքերի համար" - Լի էկրանի գովազդները երևում են - - Լի էկրանի գովազդների թաքցումը գործում է միայն հին սարքերի համար - Թաքցնել ընդհանուր գովազդները - Ընդհանուր գովազդները թաքցված են - Ընդհանուր գովազդները երևում են - Թաքցնել ապրանքների բաները - Ապրանքների բաները թաքցված են - Ապրանքների բաները երևում են - Թաքցնել վճարված խթանման նշանը - Վճարված խթանման նշանը թաքցված է - Վճարված խթանման նշանը երևում է - Թաքցնել ինքնահովանավորված քարտերը - Ինքնահովանավորված քարտերը թաքցված են - Ինքնահովանավորված քարտերը երևում են - Թաքցնել գնումների հղումները - Գնումների հղումները տեսանյութի նկարագրության մեջ թաքնված են - Գնումների հղումները տեսանյութի նկարագրության մեջ ցուցադրվում են - Թաքցնել \"Դիտել ապրանքները\" պաստառը - «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում թաքնված է - «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում ցուցադրված է - Թաքցնել վեբ-որոնման արդյունքները - Վեբ-որոնման արդյունքները թաքցված են - Վեբ-որոնման արդյունքները երևում են - - - Թաքցնել YouTube Premium-ի խթանումները - YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ թաքցված են - YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ երևում են - - - Թաքցնել տեսահոլովակների գովազդները - Տեսահոլովակների գովազդները բլոկավորված են - Տեսահոլովակների գովազդները երևում են - - - URL-ը կրկնօրինակվել է բացման տախտակին - URL-ը ժամանակի կնիքով կրկնօրինակվել է - Ցույց տալ տեսանյութի URL-ի կրկնօրինակման կոճակը - Տեսանյութի URL-ի պատճենման կոճակը ցուցադրված է։ Հպեք՝ տեսանյութի URL-ը պատճենելու համար։ Հպեք և պահեք՝ ժամանակի դրոշմով պատճենելու համար - Տեսանյութի URL-ի պատճենման կոճակը չի ցուցադրվում - Ցույց տալ ժամանակի կնիքով URL-ի կրկնօրինակման կոճակը - Ժամանակի դրոշմով URL-ի պատճենման կոճակը ցուցադրված է։ Հպեք՝ ժամանակի դրոշմով տեսանյութի URL-ը պատճենելու համար։ Հպեք և պահեք՝ առանց ժամանակի դրոշմի պատճենելու համար - Ժամանակի դրոշմով URL-ի պատճենման կոճակը չի ցուցադրվում - - - Հեռացնել դիտողի խոհեմության երկխոսությունը - Երկխոսությունը հեռացվելու է - Զրույցը կցուցադրվի - Սա չի խուսափում տարիքային սահմանափակումից։ Այն պարզապես ավտոմատ կերպով ընդունում է այն։ - - - Անջատել «Մուտք գործել հեռուստացույց» բացվող պատուհանը - Հեռուստացույց մուտքի պատուհանն անջատված է - Հեռուստացույց մուտքի պատուհանը միացված է - - - Անջատել կրկնակի հպումով գլուխը բաց թողնելը - Կրկնակի հպումը երբեք չի կարող առաջացնել հաջորդ/նախորդ գլուխն անցնելը - Կրկնակի հպումը երբեմն կարող է առաջացնել հաջորդ/նախորդ գլուխն անցնելը - - - Արտաքին ներբեռնումներ - Արտաքին ներբեռնող օգտագործելու համար կարգավորումներ - Ցույց տալ արտաքին ներբեռնման կոճակը - Նվագարկչի ներբեռնման կոճակը ցուցադրվում է - Նվագարկչի ներբեռնման կոճակը չի ցուցադրվում - - Վերահսկիր ներբեռնման գործողությունների կոճակը - Ներբեռնման կոճակը բացում է ձեր արտաքին ներբեռնողը - Ներբեռնման կոճակը բացում է ներկառուցված ներբեռնողը - Ներբեռնողի փաթեթի անունը - Ձեր տեղադրված արտաքին ներբեռնիչ հավելվածի փաթեթի անունը - Մուտքագրեք փաթեթի անունը - Այլ - Հավելվածը տեղադրված չէ - %s չի տեղադրված։ Խնդրում ենք տեղադրել այն։ - "Չհաջողվեց գտնել տեղադրված հավելվածը` փաթեթի անվանմամբ՝ %s + Լի էկրանի գովազդները երևում են + + Լի էկրանի գովազդների թաքցումը գործում է միայն հին սարքերի համար + Թաքցնել ընդհանուր գովազդները + Ընդհանուր գովազդները թաքցված են + Ընդհանուր գովազդները երևում են + Թաքցնել ապրանքների բաները + Ապրանքների բաները թաքցված են + Ապրանքների բաները երևում են + Թաքցնել վճարված խթանման նշանը + Վճարված խթանման նշանը թաքցված է + Վճարված խթանման նշանը երևում է + Թաքցնել ինքնահովանավորված քարտերը + Ինքնահովանավորված քարտերը թաքցված են + Ինքնահովանավորված քարտերը երևում են + Թաքցնել գնումների հղումները + Գնումների հղումները տեսանյութի նկարագրության մեջ թաքնված են + Գնումների հղումները տեսանյութի նկարագրության մեջ ցուցադրվում են + Թաքցնել \"Դիտել ապրանքները\" պաստառը + «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում թաքնված է + «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում ցուցադրված է + Թաքցնել վեբ-որոնման արդյունքները + Վեբ-որոնման արդյունքները թաքցված են + Վեբ-որոնման արդյունքները երևում են + + + Թաքցնել YouTube Premium-ի խթանումները + YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ թաքցված են + YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ երևում են + + + Թաքցնել տեսահոլովակների գովազդները + Տեսահոլովակների գովազդները բլոկավորված են + Տեսահոլովակների գովազդները երևում են + + + URL-ը կրկնօրինակվել է բացման տախտակին + URL-ը ժամանակի կնիքով կրկնօրինակվել է + Ցույց տալ տեսանյութի URL-ի կրկնօրինակման կոճակը + Տեսանյութի URL-ի պատճենման կոճակը ցուցադրված է։ Հպեք՝ տեսանյութի URL-ը պատճենելու համար։ Հպեք և պահեք՝ ժամանակի դրոշմով պատճենելու համար + Տեսանյութի URL-ի պատճենման կոճակը չի ցուցադրվում + Ցույց տալ ժամանակի կնիքով URL-ի կրկնօրինակման կոճակը + Ժամանակի դրոշմով URL-ի պատճենման կոճակը ցուցադրված է։ Հպեք՝ ժամանակի դրոշմով տեսանյութի URL-ը պատճենելու համար։ Հպեք և պահեք՝ առանց ժամանակի դրոշմի պատճենելու համար + Ժամանակի դրոշմով URL-ի պատճենման կոճակը չի ցուցադրվում + + + Հեռացնել դիտողի խոհեմության երկխոսությունը + Երկխոսությունը հեռացվելու է + Զրույցը կցուցադրվի + Սա չի խուսափում տարիքային սահմանափակումից։ Այն պարզապես ավտոմատ կերպով ընդունում է այն։ + + + Անջատել «Մուտք գործել հեռուստացույց» բացվող պատուհանը + Հեռուստացույց մուտքի պատուհանն անջատված է + Հեռուստացույց մուտքի պատուհանը միացված է + + + Անջատել կրկնակի հպումով գլուխը բաց թողնելը + Կրկնակի հպումը երբեք չի կարող առաջացնել հաջորդ/նախորդ գլուխն անցնելը + Կրկնակի հպումը երբեմն կարող է առաջացնել հաջորդ/նախորդ գլուխն անցնելը + + + Արտաքին ներբեռնումներ + Արտաքին ներբեռնող օգտագործելու համար կարգավորումներ + Ցույց տալ արտաքին ներբեռնման կոճակը + Նվագարկչի ներբեռնման կոճակը ցուցադրվում է + Նվագարկչի ներբեռնման կոճակը չի ցուցադրվում + + Վերահսկիր ներբեռնման գործողությունների կոճակը + Ներբեռնման կոճակը բացում է ձեր արտաքին ներբեռնողը + Ներբեռնման կոճակը բացում է ներկառուցված ներբեռնողը + Ներբեռնողի փաթեթի անունը + Ձեր տեղադրված արտաքին ներբեռնիչ հավելվածի փաթեթի անունը + Մուտքագրեք փաթեթի անունը + Այլ + Հավելվածը տեղադրված չէ + %s չի տեղադրված։ Խնդրում ենք տեղադրել այն։ + "Չհաջողվեց գտնել տեղադրված հավելվածը` փաթեթի անվանմամբ՝ %s Ստուգեք, որ փաթեթի անունը ճիշտ է և հավելվածը տեղադրված է" - Փաթեթի անունը չի կարող դատարկ լինել - - - Անջատել ճշգրիտ փնտրման ժեստը - Ժեստը անջատված է - Ժեստը միացված է - - - Միացնել հպելը՝ որոնելու համար - Հպեք՝ որոնումը միացնելու համար - Հպելը՝ որոնելու համար, անջատված է - - - Միացնել լուսավորության ժեստը - "Մեծ էկրանով պայծառության սահեցումը միացված է։ + Փաթեթի անունը չի կարող դատարկ լինել + + + Անջատել ճշգրիտ փնտրման ժեստը + Ժեստը անջատված է + Ժեստը միացված է + + + Միացնել հպելը՝ որոնելու համար + Հպեք՝ որոնումը միացնելու համար + Հպելը՝ որոնելու համար, անջատված է + + + Միացնել լուսավորության ժեստը + "Մեծ էկրանով պայծառության սահեցումը միացված է։ Կարգավորեք պայծառությունը՝ էկրանի ձախ կողմում ուղղահայաց սահեցնելով։" - Մեծ էկրանով պայծառության սահեցումն անջատված է - Միացնել ձայնի ժեստը - "Ամբողջ էկրանով ձայնի սահեցումը միացված է + Մեծ էկրանով պայծառության սահեցումն անջատված է + Միացնել ձայնի ժեստը + "Ամբողջ էկրանով ձայնի սահեցումը միացված է Կարգավորեք ձայնի ձայնը՝ ուղղահայաց սահեցնելով էկրանի աջ կողմում" - Ամբողջ էկրանով ձայնի սահեցումը անջատված է - Միացնել սեղմելով սահեցման ժեստը - Սեղմելով սահեցումը միացված է - Սեղմելով սահեցումն անջատված է - Միացնել հապտիկական արձագանքը - Հապտիկական արձագանքը միացված է - Հապտիկական արձագանքը անջատված է - Պահպանել և վերականգնել լուսավորությունը - Պահպանել և վերականգնել լուսավորությունը, երբ դուրս եք գալիս կամ մտնում եք լի էկրանի ռեժիմ - Մի պահպանեք և վերականգնեք լուսավորությունը, երբ դուրս եք գալիս կամ մտնում եք լի էկրանի ռեժիմ - Միացնել ավտոմատ լուսավորության ժեստը - Լուսավորության ժեստի ամենացածր արժեքին իջնելը միացնում է ավտոմատ լուսավորությունը - Լուսավորության ժեստի ամենացածր արժեքին իջնելը չի միացնում ավտոմատ լուսավորությունը - Ավտո - Սահմանման վերածումը հետաձգելու ժամանակը - Վերածման ցուցադրման տևողությունը միլիվայրկյաններով - Սողացման ծածկույթի ֆոնի անթափանցություն - Անթափանցության արժեք 0-100 միջակայքում - Սողալու անթափանցությունը պետք է լինի 0-100 միջակայքում - Սահեցնել վառության գույնի վրադիրը - Վառության կառավարման առաջընթացի սանդղակի գույնը - Սահեցնել ձայնի գույնի վրադիրը - Ձայնի կառավարման առաջընթացի սանդղակի գույնը - Սահեցրեք շերտի տեքստի չափը - Սահեցրեք շերտի տեքստի չափը 1-30 միջակայքում - Տեքստի չափը պետք է լինի 1-30 միջակայքում - Սահմանման վերածման չափը - Սահմանման վերածման չափը - Ձայնի սահեցման զգայունություն - Թե որքան է ձայնի բարձրությունը փոխվում մեկ սահեցմամբ - Սահեցրեք էկրանի ծածկույթի ոճը - Հորիզոնական ծածկույթ - Հորիզոնական ծածկույթ (նվազագույն - վերևում) - Հորիզոնական ծածկույթ (նվազագույն - կենտրոնում) - Շրջանաձև ծածկույթ - Շրջանաձև ծածկույթ (նվազագույն) - Ուղղահայաց ծածկույթ - Ուղղահայաց ծածկույթ (նվազագույն) - Վայրէջքով տեսանյութերը փոխելու ակտիվացում - Լիարժեք ռեժիմով վայրէջքը կփոխվի հաջորդ / նախորդ տեսանյութին - Լիարժեք ռեժիմով վայրէջքը չի փոխվի հաջորդ / նախորդ տեսանյութին - - - Անջատել ավտոմատ ենթագրերը - Auto ենթագրերը անջատված են - Auto ենթագրերը միացված են - - - Գործողության կոճակներ - Թաքցնել կամ ցույց տալ կոճակները տեսանյութերի տակ - Հանել «Like» և «Subscribe» լուսավորումը - «Like» և «Subscribe» կոճակները չեն լուսավորվի, երբ հիշատակվեն - «Like» և «Subscribe» կոճակները կլուսավորվեն, երբ հիշատակվեն - Թաքցնել Like և Dislike - Like և Dislike կոճակները թաքցված են - Like և Dislike կոճակները ցուցադրվում են - - Թաքցնել Share - Share կոճակը թաքցված է - Share կոճակը ցուցադրվում է - - Թաքցնել \"Դադարեցնել գովազդները\" - Գովազդները դադարեցնելու կոճակը թաքցված է - Գովազդները դադարեցնելու կոճակը ցուցադրված է - - Թաքցնել մեկնաբանությունները - Մեկնաբանությունների կոճակը թաքնված է - Մեկնաբանությունների կոճակը ցուցադրված է - + Թաքցնել Share + Share կոճակը թաքցված է + Share կոճակը ցուցադրվում է + + Թաքցնել \"Դադարեցնել գովազդները\" + Գովազդները դադարեցնելու կոճակը թաքցված է + Գովազդները դադարեցնելու կոճակը ցուցադրված է + + Թաքցնել մեկնաբանությունները + Մեկնաբանությունների կոճակը թաքնված է + Մեկնաբանությունների կոճակը ցուցադրված է + - Թաքցնել Report - Report կոճակը թաքցված է - Report կոճակը ցուցադրվում է - - Թաքցնել Remix - Remix կոճակը թաքցված է - Remix կոճակը ցուցադրվում է - - Թաքցնել Download - Download կոճակը թաքցված է - Download կոճակը ցուցադրվում է - + Թաքցնել Remix + Remix կոճակը թաքցված է + Remix կոճակը ցուցադրվում է + + Թաքցնել Download + Download կոճակը թաքցված է + Download կոճակը ցուցադրվում է + - Թաքցնել Հայփը - Հայփ կոճակը թաքնված է - Հայփ կոճակը ցուցադրվում է - - Թաքցնել Գովազդը - Խթանել կոճակը թաքնված է - Խթանել կոճակը ցուցադրված է - - Թաքցնել Thanks - Thanks կոճակը թաքցված է - Thanks կոճակը ցուցադրվում է - + Թաքցնել Գովազդը + Խթանել կոճակը թաքնված է + Խթանել կոճակը ցուցադրված է + + Թաքցնել Thanks + Thanks կոճակը թաքցված է + Thanks կոճակը ցուցադրվում է + - Թաքցնել հարցումը - Հարցման կոճակը թաքցված է - Հարցման կոճակը երևում է - - Թաքցնել Clip - Clip կոճակը թաքցված է - Clip կոճակը ցուցադրվում է - - Թաքցնել Խանութը - Խանութի կոճակը թաքնված է - Խանութի կոճակը ցուցադրվում է - - Թաքցնել պահելը - Պահելու կոճակը թաքցված է - Պահելու կոճակը ցուցադրված է - - - Նավիգացիայի կոճակներ - Թաքցնել կամ փոխել կոճակները նավիգացիայի վանդակում - - Թաքցնել Home - Home կոճակը թաքցված է - Home կոճակը ցուցադրվում է - - Թաքցնել Shorts - Shorts կոճակը թաքցված է - Shorts կոճակը ցուցադրվում է - - Թաքցնել Create - Create կոճակը թաքցված է - Create կոճակը ցուցադրվում է - - Թաքցնել Subscriptions - Subscriptions կոճակը թաքցված է - Subscriptions կոճակը ցուցադրվում է - Թաքցնել Ծանուցումները - Ծանուցումների կոճակը թաքցված է - Ծանուցումների կոճակը ցուցադրվում է - - Փոխել Create-ը Notifications-ի հետ - "«Ստեղծել» կոճակը փոխարինվում է «Հայտարարություններ» կոճակով + Թաքցնել հարցումը + Հարցման կոճակը թաքցված է + Հարցման կոճակը երևում է + + Թաքցնել Clip + Clip կոճակը թաքցված է + Clip կոճակը ցուցադրվում է + + Թաքցնել Խանութը + Խանութի կոճակը թաքնված է + Խանութի կոճակը ցուցադրվում է + + Թաքցնել պահելը + Պահելու կոճակը թաքցված է + Պահելու կոճակը ցուցադրված է + + + Նավիգացիայի կոճակներ + Թաքցնել կամ փոխել կոճակները նավիգացիայի վանդակում + + Թաքցնել Home + Home կոճակը թաքցված է + Home կոճակը ցուցադրվում է + + Թաքցնել Shorts + Shorts կոճակը թաքցված է + Shorts կոճակը ցուցադրվում է + + Թաքցնել Create + Create կոճակը թաքցված է + Create կոճակը ցուցադրվում է + + Թաքցնել Subscriptions + Subscriptions կոճակը թաքցված է + Subscriptions կոճակը ցուցադրվում է + Թաքցնել Ծանուցումները + Ծանուցումների կոճակը թաքցված է + Ծանուցումների կոճակը ցուցադրվում է + + Փոխել Create-ը Notifications-ի հետ + "«Ստեղծել» կոճակը փոխարինվում է «Հայտարարություններ» կոճակով Նշում. Այս կարգավորման միացումը նաև ստիպում է թաքցնել տեսանյութի գովազդները" - Create կոճակը չի փոխվել Notifications կոճակի հետ - "Այս կարգավորումն անջատելը նաև կանջատի Shorts գովազդների արգելափակումը։ + Create կոճակը չի փոխվել Notifications կոճակի հետ + "Այս կարգավորումն անջատելը նաև կանջատի Shorts գովազդների արգելափակումը։ Եթե այս կարգավորումը փոխելը չի ազդում, փորձեք անցնել անհայտ ռեժիմ։" - Թաքցնել նավիգացիայի կոճակների մակագրությունները - Մակագրությունները թաքցված են - Մակագրությունները ցուցադրվում են - Անջատել կիսաթափանց կարգավիճակի տողը - Վիճակի նوارը անթափանց է - Վիճակի նշագիծը անթափանց է կամ կիսաթափանց - Որոշ սարքերում այս գործառույթի միացումը կարող է համակարգի նավիգացիոն տողը դարձնել թափանցիկ։ - Անջատել կիսաթափանց լուսավոր շերտը - Լուսավոր ռեժիմի նավիգացիոն շերտը անթափանց է - Լույսի ռեժիմի նավիգացիոն նշագիծը անթափանց է կամ կիսաթափանց - Անջատել մուգ կիսաթափանց նշագիծ - Մութ ռեժիմի նավիգացիոն շերտը անթափանց է - Մուգ ռեժիմի նավիգացիոն նշագիծը անթափանց է կամ կիսաթափանց - - - Flyout մենյու - Թաքցնել կամ ցույց տալ խաղացողի flyout մենյուի կետերը - - Կրճատումները թաքցնել - Կրճատումների մենյուը թաքցված է - Կրճատումների մենյուը երևում է - - Լրացուցիչ կարգավորումները թաքցնել - Լրացուցիչ կարգավորումների մենյուը թաքցված է - Լրացուցիչ կարգավորումների մենյուը երևում է - - Քնի ժամանակահատը թաքցնել - Քնի ժամանակահատի մենյուը թաքցված է - Քնի ժամանակահատի մենյուը երևում է - - Հատվածային վերարտադրումը թաքցնել - Հատվածային վերարտադրման մենյուը թաքցված է - Հատվածային վերարտադրման մենյուը երևում է - - Ամբիենտ ռեժիմը թաքցնել - Ամբիենտ ռեժիմի մենյուը թաքցված է - Ամբիենտ ռեժիմի մենյուը երևում է - Հաստատուն ծավալը թաքցնել - Հաստատուն ծավալի մենյուը երևում է - Հաստատուն ծավալի մենյուը թաքցված է - - Թաքցնել \"Օգնություն և կարծիք\" - \"Օգնություն և կարծիք\" մենյուը թաքցված է - \"Օգնություն և կարծիք\" մենյուը երևում է - - Վերարտադրման արագությունը թաքցնել - Վերարտադրման արագության մենյուը թաքցված է - Վերարտադրման արագության մենյուը երևում է - - Էկրանի արգելափակումը թաքցնել - Էկրանի արգելափակման մենյուը թաքցված է - Էկրանի արգելափակման մենյուը երևում է - - Թաքցնել Լսել YouTube Music-ով - Լսել YouTube Music-ով մենյուն թաքցված է - Լսել YouTube Music-ով մենյուն ցուցադրված է - - Աուդիո ձայնագրությունը թաքցնել - Աուդիո ձայնագրման մենյուը թաքցված է - Աուդիո ձայնագրման մենյուը երևում է - + Կրճատումները թաքցնել + Կրճատումների մենյուը թաքցված է + Կրճատումների մենյուը երևում է + + Լրացուցիչ կարգավորումները թաքցնել + Լրացուցիչ կարգավորումների մենյուը թաքցված է + Լրացուցիչ կարգավորումների մենյուը երևում է + + Քնի ժամանակահատը թաքցնել + Քնի ժամանակահատի մենյուը թաքցված է + Քնի ժամանակահատի մենյուը երևում է + + Հատվածային վերարտադրումը թաքցնել + Հատվածային վերարտադրման մենյուը թաքցված է + Հատվածային վերարտադրման մենյուը երևում է + + Ամբիենտ ռեժիմը թաքցնել + Ամբիենտ ռեժիմի մենյուը թաքցված է + Ամբիենտ ռեժիմի մենյուը երևում է + Հաստատուն ծավալը թաքցնել + Հաստատուն ծավալի մենյուը երևում է + Հաստատուն ծավալի մենյուը թաքցված է + + Թաքցնել \"Օգնություն և կարծիք\" + \"Օգնություն և կարծիք\" մենյուը թաքցված է + \"Օգնություն և կարծիք\" մենյուը երևում է + + Վերարտադրման արագությունը թաքցնել + Վերարտադրման արագության մենյուը թաքցված է + Վերարտադրման արագության մենյուը երևում է + + Էկրանի արգելափակումը թաքցնել + Էկրանի արգելափակման մենյուը թաքցված է + Էկրանի արգելափակման մենյուը երևում է + + Թաքցնել Լսել YouTube Music-ով + Լսել YouTube Music-ով մենյուն թաքցված է + Լսել YouTube Music-ով մենյուն ցուցադրված է + + Աուդիո ձայնագրությունը թաքցնել + Աուդիո ձայնագրման մենյուը թաքցված է + Աուդիո ձայնագրման մենյուը երևում է + - "Ձայնաուղու ընտրացանկը թաքնված է + "Ձայնաուղու ընտրացանկը թաքնված է Ձայնաուղու ընտրացանկը ցուցադրելու համար «Կեղծել տեսահոսքերը» փոխեք 'Android No SDK'-ի" - - Դիտել VR-ով թաքցնել - VR-ով դիտել մենյուը թաքցված է - VR-ով դիտել մենյուը երևում է - Թաքցնել տեսանյութի որակի ընտրացանկը - Տեսանյութի որակի ընտրացանկը թաքնված է - Տեսանյութի որակի ընտրացանկը ցուցադրված է - Տեսանյութի որակի մենյուի ստորագրությունը թաքցնել - Տեսանյութի որակի մենյուի ստորագրությունը թաքցված է - Տեսանյութի որակի մենյուի ստորագրությունը երևում է - - - Թաքցնել Ավտոմատ կրկնում կոճակը - Ավտոմատ վերարտադրման կոճակը թաքցված է - Ավտոմատ վերարտադրման կոճակը երևում է - - Թաքցնել Սուբտիտրեր կոճակը - Կրճատումների կոճակը թաքցված է - Կրճատումների կոճակը երևում է - Թաքցնել Cast կոճակը - Թափոնելու կոճակը թաքցված է - Թափոնելու կոճակը երևում է - Թաքցնել նվագարկչի կառավարման վահանակի ֆոնը - Նվագարկչի կառավարման վահանակի ֆոնը թաքնված է - Նվագարկչի կառավարման վահանակի ֆոնը ցուցադրվում է - Թաքցնել \"Նախորդ\" և \"Հաջորդ\" կոճակները - Կոճակները թաքցված են - Կոճակները երևում են - - - Էկրանի վերջում քարտերը թաքցնել - Էկրանի վերջում քարտերը թաքցված են - Էկրանի վերջում քարտերը երևում են - - - Անջատել շրջապատող ռեժիմը լիարժեք էկրանում - Ամբիենտ ռեժիմը անջատված է - Ամբիենտ ռեժիմը միացված է - - - Տեղեկատվական քարտերը թաքցնել - Տեղեկատվական քարտերը թաքցված են - Տեղեկատվական քարտերը երևում են - - - Հաշվողական թվերի մուլտիպլիկացիան անջատել - Հաշվողական թվերը մուլտիպլիկացված չեն - Հաշվողական թվերը մուլտիպլիկացված են - - - Թաքցնել տեսանվագարկիչի ժամանակագիծը - Տեսանյութի կրողի վրա տեղաշարժի ձողը թաքցված է - Տեսանյութի կրողի վրա տեղաշարժի ձողը երևում է - - Թաքցնել տեսանյութերի մանրապատկերների ժամանակագիծը - Տեսանյութերի մանրապատկերների ժամանակագիծը թաքցված է - Տեսանյութերի մանրապատկերների ժամանակագիծը ցուցադրված է - - - Shorts կրող - Թաքցնել կամ ցուցադրել Shorts նվագարկիչի բաղադրիչները - - Թաքցնել Shorts-ը Գլխավորի լրահոսում - Թաքնված է Գլխավորի լրահոսում և հարակից տեսանյութերում - Ցուցադրված է Գլխավորի լրահոսում և հարակից տեսանյութերում - Թաքցնել Shorts-ը որոնման արդյունքներում - Որոնման արդյունքներում թաքնված է - Ցուցադրված է որոնման արդյունքներում - - Թաքցնել Shorts-ը Բաժանորդագրությունների լրահոսում - Թաքնված է Բաժանորդագրությունների լրահոսում - Ցուցադրված է Բաժանորդագրությունների լրահոսում - Թաքցնել շորտերը դիտման պատմության մեջ - Թաքնված է դիտման պատմության մեջ - Ցուցադրվում է դիտման պատմության մեջ - Թաքցնել «Ավտոմատ կրկնօրինակված» պիտակը - Ավտոմատ կրկնօրինակված պիտակը թաքնված է - Ավտոմատ կրկնօրինակված պիտակը ցուցադրվում է - Թաքցնել «Գնել Super Thanks» կոճակը - Գնել Super Thanks կոճակը թաքնված է - Գնել Super Thanks կոճակը ցուցադրված է - Թաքցնել Էֆեկտ կոճակը - Էֆեկտի կոճակը թաքնված է - Էֆեկտի կոճակը ցուցադրված է - Թաքցնել «Կանաչ էկրան» կոճակը - \"Green Screen\" կոճակը թաքցված է - \"Green Screen\" կոճակը երևում է - Թաքցնել \"Hashtag\" կոճակը - \"Hashtag\" կոճակը թաքցված է - \"Hashtag\" կոճակը երևում է - - Թաքցնել միանալ կոճակը - Միանալու կոճակը թաքցված է - Միանալու կոճակը երևում է - Թաքցնել ուղիղ եթերի նախադիտումը - Ուղիղ եթերի նախադիտումը թաքնված է - Ուղիղ եթերի նախադիտումը ցուցադրված է - Թաքցնել տեղանքի նշումը - Տեղանքի նշումը թաքցված է - Տեղանքի նշումը ցուցադրվում է - Թաքցնել «Նոր գրառումներ» կոճակը - «Նոր գրառումներ» կոճակը թաքցված է - «Նոր գրառումներ» կոճակը երևում է - Թաքցնել կանգնեցված վերարտադրման ծածկի կոճակները - Կանգնեցված վերարտադրման ծածկի կոճակները թաքցված են - Կանգնեցված էկրանի կոճակները ցուցադրվում են - Թաքցնել նախադիտման մեկնաբանությունը - Նախադիտման մեկնաբանությունը թաքնված է - Ցուցադրվում է մեկնաբանության նախադիտումը - Թաքցնել «Պահպանել երաժշտությունը» կոճակը - «Save music» կոճակը թաքցված է - «Save music» կոճակը ցուցադրվում է - Թաքցնել որոնման առաջարկները - Որոնման առաջարկները թաքցված են - Որոնման առաջարկները երևում են - Թաքցնել խանութ կոճակը - Խանութի կոճակը թաքցված է - Խանութի կոճակը ցուցադրվում է - Թաքցնել սթիկերները - Սթիկերները թաքցված են - Սթիկերները երևում են - Թաքցնել բաժանորդագրվել կոճակը - Բաժանորդագրության կոճակը թաքցված է - Բաժանորդագրության կոճակը երևում է - Թաքցնել նշված ապրանքները - Նշված ապրանքները թաքցված են - Նշված ապրանքները ցուցադրվում են - Թաքցնել Առաջիկա կոճակը - \"Upcoming\" կոճակը թաքցված է - \"Upcoming\" կոճակը երևում է - Թաքցնել «Օգտագործել այս ձայնը» կոճակը - «Օգտագործել այս ձայնը» կոճակը թաքցված է - «Օգտագործել այս ձայնը» կոճակը ցուցադրված է - Թաքցնել «Օգտագործել այս ձևանմուշը» կոճակը - «Օգտագործել այս ձևանմուշը» կոճակը թաքցված է - Օգտագործել այս ձևանմուշի կոճակը ցուցադրված է - Թաքցնել «Like» կոճակի շատրվանի անիմացիան - \"Like\" կոճակի ֆունտանային անիմացիան թաքցված է - \"Like\" կոճակի ֆունտանային անիմացիան երևում է - Թաքցնել «Like» կոճակը - \"Like\" կոճակը թաքցված է - \"Like\" կոճակը երևում է - Թաքցնել «Dislike» կոճակը - \"Dislike\" կոճակը թաքցված է - \"Dislike\" կոճակը երևում է - Թաքցնել մեկնաբանություններ կոճակը - Մեկնաբանությունների կոճակը թաքցված է - Մեկնաբանությունների կոճակը երևում է - - Թաքցնել կիսվել կոճակը - \"Share\" կոճակը թաքցված է - \"Share\" կոճակը երևում է - - Թաքցնել ռեմիքս կոճակը - \"Remix\" կոճակը թաքցված է - \"Remix\" կոճակը երևում է - Թաքցնել ձայնի կոճակը - Ձայնի կոճակը թաքցված է - Ձայնի կոճակը երևում է - Թաքցնել տեղեկատվության վահանակը - Տեղեկատվության վահանակը թաքցված է - Տեղեկատվության վահանակը երևում է - Թաքցնել ալիքի ձողը - Ալիքի ձողը թաքցված է - Ալիքի ձողը երևում է - Թաքցնել տեսանյութի վերնագիրը - Տեսանյութի վերնագիրը թաքնված է - Տեսանյութի վերնագիրը ցուցադրված է - Թաքցնել ձայնի մետատվությունների լեյբլը - Ձայնի մետատվյալների պիտակը թաքնված է - Ձայնի մետատվյալների պիտակը ցուցադրված է - Թաքցնել տեսանյութի հղման պիտակը - Տեսանյութի հղման լեյբլը թաքցված է - Տեսանյութի հղման լեյբլը երևում է - Թաքցնել նավիգացիայի ձողը - Նավիգացիայի ձողը թաքցված է - Նավիգացիայի ձողը երևում է - - - Թաքցնել վերջնական էկրանին առաջարկվող տեսանյութը - "Վերջնական էկրանին առաջարկվող տեսանյութը թաքցված է, երբ ավտոմատ նվագարկումն անջատված է + + Դիտել VR-ով թաքցնել + VR-ով դիտել մենյուը թաքցված է + VR-ով դիտել մենյուը երևում է + Թաքցնել տեսանյութի որակի ընտրացանկը + Տեսանյութի որակի ընտրացանկը թաքնված է + Տեսանյութի որակի ընտրացանկը ցուցադրված է + Տեսանյութի որակի մենյուի ստորագրությունը թաքցնել + Տեսանյութի որակի մենյուի ստորագրությունը թաքցված է + Տեսանյութի որակի մենյուի ստորագրությունը երևում է + + + Թաքցնել Ավտոմատ կրկնում կոճակը + Ավտոմատ վերարտադրման կոճակը թաքցված է + Ավտոմատ վերարտադրման կոճակը երևում է + + Թաքցնել Սուբտիտրեր կոճակը + Կրճատումների կոճակը թաքցված է + Կրճատումների կոճակը երևում է + Թաքցնել Cast կոճակը + Թափոնելու կոճակը թաքցված է + Թափոնելու կոճակը երևում է + Թաքցնել նվագարկչի կառավարման վահանակի ֆոնը + Նվագարկչի կառավարման վահանակի ֆոնը թաքնված է + Նվագարկչի կառավարման վահանակի ֆոնը ցուցադրվում է + Թաքցնել \"Նախորդ\" և \"Հաջորդ\" կոճակները + Կոճակները թաքցված են + Կոճակները երևում են + + + Էկրանի վերջում քարտերը թաքցնել + Էկրանի վերջում քարտերը թաքցված են + Էկրանի վերջում քարտերը երևում են + + + Անջատել շրջապատող ռեժիմը լիարժեք էկրանում + Ամբիենտ ռեժիմը անջատված է + Ամբիենտ ռեժիմը միացված է + + + Տեղեկատվական քարտերը թաքցնել + Տեղեկատվական քարտերը թաքցված են + Տեղեկատվական քարտերը երևում են + + + Հաշվողական թվերի մուլտիպլիկացիան անջատել + Հաշվողական թվերը մուլտիպլիկացված չեն + Հաշվողական թվերը մուլտիպլիկացված են + + + Թաքցնել տեսանվագարկիչի ժամանակագիծը + Տեսանյութի կրողի վրա տեղաշարժի ձողը թաքցված է + Տեսանյութի կրողի վրա տեղաշարժի ձողը երևում է + + Թաքցնել տեսանյութերի մանրապատկերների ժամանակագիծը + Տեսանյութերի մանրապատկերների ժամանակագիծը թաքցված է + Տեսանյութերի մանրապատկերների ժամանակագիծը ցուցադրված է + + + Shorts կրող + Թաքցնել կամ ցուցադրել Shorts նվագարկիչի բաղադրիչները + + Թաքցնել Shorts-ը Գլխավորի լրահոսում + Թաքնված է Գլխավորի լրահոսում և հարակից տեսանյութերում + Ցուցադրված է Գլխավորի լրահոսում և հարակից տեսանյութերում + Թաքցնել Shorts-ը որոնման արդյունքներում + Որոնման արդյունքներում թաքնված է + Ցուցադրված է որոնման արդյունքներում + + Թաքցնել Shorts-ը Բաժանորդագրությունների լրահոսում + Թաքնված է Բաժանորդագրությունների լրահոսում + Ցուցադրված է Բաժանորդագրությունների լրահոսում + Թաքցնել շորտերը դիտման պատմության մեջ + Թաքնված է դիտման պատմության մեջ + Ցուցադրվում է դիտման պատմության մեջ + Թաքցնել «Ավտոմատ կրկնօրինակված» պիտակը + Ավտոմատ կրկնօրինակված պիտակը թաքնված է + Ավտոմատ կրկնօրինակված պիտակը ցուցադրվում է + Թաքցնել «Գնել Super Thanks» կոճակը + Գնել Super Thanks կոճակը թաքնված է + Գնել Super Thanks կոճակը ցուցադրված է + Թաքցնել Էֆեկտ կոճակը + Էֆեկտի կոճակը թաքնված է + Էֆեկտի կոճակը ցուցադրված է + Թաքցնել «Կանաչ էկրան» կոճակը + \"Green Screen\" կոճակը թաքցված է + \"Green Screen\" կոճակը երևում է + Թաքցնել \"Hashtag\" կոճակը + \"Hashtag\" կոճակը թաքցված է + \"Hashtag\" կոճակը երևում է + + Թաքցնել միանալ կոճակը + Միանալու կոճակը թաքցված է + Միանալու կոճակը երևում է + Թաքցնել ուղիղ եթերի նախադիտումը + Ուղիղ եթերի նախադիտումը թաքնված է + Ուղիղ եթերի նախադիտումը ցուցադրված է + Թաքցնել տեղանքի նշումը + Տեղանքի նշումը թաքցված է + Տեղանքի նշումը ցուցադրվում է + Թաքցնել «Նոր գրառումներ» կոճակը + «Նոր գրառումներ» կոճակը թաքցված է + «Նոր գրառումներ» կոճակը երևում է + Թաքցնել կանգնեցված վերարտադրման ծածկի կոճակները + Կանգնեցված վերարտադրման ծածկի կոճակները թաքցված են + Կանգնեցված էկրանի կոճակները ցուցադրվում են + Թաքցնել նախադիտման մեկնաբանությունը + Նախադիտման մեկնաբանությունը թաքնված է + Ցուցադրվում է մեկնաբանության նախադիտումը + Թաքցնել «Պահպանել երաժշտությունը» կոճակը + «Save music» կոճակը թաքցված է + «Save music» կոճակը ցուցադրվում է + Թաքցնել որոնման առաջարկները + Որոնման առաջարկները թաքցված են + Որոնման առաջարկները երևում են + Թաքցնել խանութ կոճակը + Խանութի կոճակը թաքցված է + Խանութի կոճակը ցուցադրվում է + Թաքցնել սթիկերները + Սթիկերները թաքցված են + Սթիկերները երևում են + Թաքցնել բաժանորդագրվել կոճակը + Բաժանորդագրության կոճակը թաքցված է + Բաժանորդագրության կոճակը երևում է + Թաքցնել նշված ապրանքները + Նշված ապրանքները թաքցված են + Նշված ապրանքները ցուցադրվում են + Թաքցնել Առաջիկա կոճակը + \"Upcoming\" կոճակը թաքցված է + \"Upcoming\" կոճակը երևում է + Թաքցնել «Օգտագործել այս ձայնը» կոճակը + «Օգտագործել այս ձայնը» կոճակը թաքցված է + «Օգտագործել այս ձայնը» կոճակը ցուցադրված է + Թաքցնել «Օգտագործել այս ձևանմուշը» կոճակը + «Օգտագործել այս ձևանմուշը» կոճակը թաքցված է + Օգտագործել այս ձևանմուշի կոճակը ցուցադրված է + Թաքցնել «Like» կոճակի շատրվանի անիմացիան + \"Like\" կոճակի ֆունտանային անիմացիան թաքցված է + \"Like\" կոճակի ֆունտանային անիմացիան երևում է + Թաքցնել «Like» կոճակը + \"Like\" կոճակը թաքցված է + \"Like\" կոճակը երևում է + Թաքցնել «Dislike» կոճակը + \"Dislike\" կոճակը թաքցված է + \"Dislike\" կոճակը երևում է + Թաքցնել մեկնաբանություններ կոճակը + Մեկնաբանությունների կոճակը թաքցված է + Մեկնաբանությունների կոճակը երևում է + + Թաքցնել կիսվել կոճակը + \"Share\" կոճակը թաքցված է + \"Share\" կոճակը երևում է + + Թաքցնել ռեմիքս կոճակը + \"Remix\" կոճակը թաքցված է + \"Remix\" կոճակը երևում է + Թաքցնել ձայնի կոճակը + Ձայնի կոճակը թաքցված է + Ձայնի կոճակը երևում է + Թաքցնել տեղեկատվության վահանակը + Տեղեկատվության վահանակը թաքցված է + Տեղեկատվության վահանակը երևում է + Թաքցնել ալիքի ձողը + Ալիքի ձողը թաքցված է + Ալիքի ձողը երևում է + Թաքցնել տեսանյութի վերնագիրը + Տեսանյութի վերնագիրը թաքնված է + Տեսանյութի վերնագիրը ցուցադրված է + Թաքցնել ձայնի մետատվությունների լեյբլը + Ձայնի մետատվյալների պիտակը թաքնված է + Ձայնի մետատվյալների պիտակը ցուցադրված է + Թաքցնել տեսանյութի հղման պիտակը + Տեսանյութի հղման լեյբլը թաքցված է + Տեսանյութի հղման լեյբլը երևում է + Թաքցնել նավիգացիայի ձողը + Նավիգացիայի ձողը թաքցված է + Նավիգացիայի ձողը երևում է + + + Թաքցնել վերջնական էկրանին առաջարկվող տեսանյութը + "Վերջնական էկրանին առաջարկվող տեսանյութը թաքցված է, երբ ավտոմատ նվագարկումն անջատված է Ավտոմատ նվագարկումը կարելի է փոխել YouTube-ի կարգավորումներում. Կարգավորումներ → Վերարտադրում → Ավտոմատ նվագարկել հաջորդ տեսանյութը" - Վերջնական էկրանին առաջարկվող տեսանյութը ցուցադրվում է - - - Թաքցնել հարակից տեսանյութերի վերադիրը - Հարակից տեսանյութերի վերադիրը ամբողջ էկրանով թաքնված է - Հարակից տեսանյութերի վերադիրը ամբողջ էկրանով ցուցադրված է - - - Թաքցնել տեսանյութի ժամանակային կետը - Ժամանակային կետը թաքցված է - Ժամանակային կետը երևում է - - - Թաքցնել հաղորդակցման վահանակների ելնող պատուհանները - Հաղորդակցման վահանակների ելնող պատուհանները թաքցված են - Հաղորդակցման վահանակների ելնող պատուհանները երևում են - - - Տեսանյութի ավարտին դուրս գալ լիաէկրան ռեժիմից - Անջատված - Դիմանկար - Լանդշաֆտ - Դիմանկար և լանդշաֆտ - - - Բացել տեսանյութերը լի էկրանի պորտրետային ռեժիմով - Տեսանյութերը բացվում են լի էկրանով - Տեսանյութերը չեն բացվում լի էկրանով - - - Հաղորդակցման վահանակի թափանցիկություն - Թափանցիկության արժեքը 0-100 միջակայքում, որտեղ 0-ը թափանցիկ է - Խաղացողի վերածածկի թափանցիկությունը պետք է լինի 0-100 միջակայքում - - - - \"Dislike\"-երը մի որոշ ժամանակ հասանելի չեն (API-ն ժամանակի սահմանը անցել է) - \"Dislike\"-երը հասանելի չեն (կարգավիճակ %d) - \"Dislike\"-երը հասանելի չեն (հաճախորդի API-ի սահմանաչափ) - \"Dislike\"-երը հասանելի չեն (%s) - - Վերբեռնել տեսանյութը՝ քվեարկելու համար Return YouTube Dislike-ի միջոցով - - Թաքցված է սեփականատիրոջ կողմից - \"Dislike\"-երը ցուցադրվում են - \"Dislike\"-երը չեն ցուցադրվում - Ցուցադրել \"Dislike\"-երը Shorts-ում - "\"Dislike\"-երը Shorts-ում ցուցադրվում են + Վերջնական էկրանին առաջարկվող տեսանյութը ցուցադրվում է + + + Թաքցնել հարակից տեսանյութերի վերադիրը + Հարակից տեսանյութերի վերադիրը ամբողջ էկրանով թաքնված է + Հարակից տեսանյութերի վերադիրը ամբողջ էկրանով ցուցադրված է + + + Թաքցնել տեսանյութի ժամանակային կետը + Ժամանակային կետը թաքցված է + Ժամանակային կետը երևում է + + + Թաքցնել հաղորդակցման վահանակների ելնող պատուհանները + Հաղորդակցման վահանակների ելնող պատուհանները թաքցված են + Հաղորդակցման վահանակների ելնող պատուհանները երևում են + + + Տեսանյութի ավարտին դուրս գալ լիաէկրան ռեժիմից + Անջատված + Դիմանկար + Լանդշաֆտ + Դիմանկար և լանդշաֆտ + + + Բացել տեսանյութերը լի էկրանի պորտրետային ռեժիմով + Տեսանյութերը բացվում են լի էկրանով + Տեսանյութերը չեն բացվում լի էկրանով + + + Հաղորդակցման վահանակի թափանցիկություն + Թափանցիկության արժեքը 0-100 միջակայքում, որտեղ 0-ը թափանցիկ է + Խաղացողի վերածածկի թափանցիկությունը պետք է լինի 0-100 միջակայքում + + + + \"Dislike\"-երը մի որոշ ժամանակ հասանելի չեն (API-ն ժամանակի սահմանը անցել է) + \"Dislike\"-երը հասանելի չեն (կարգավիճակ %d) + \"Dislike\"-երը հասանելի չեն (հաճախորդի API-ի սահմանաչափ) + \"Dislike\"-երը հասանելի չեն (%s) + + Վերբեռնել տեսանյութը՝ քվեարկելու համար Return YouTube Dislike-ի միջոցով + + Թաքցված է սեփականատիրոջ կողմից + \"Dislike\"-երը ցուցադրվում են + \"Dislike\"-երը չեն ցուցադրվում + Ցուցադրել \"Dislike\"-երը Shorts-ում + "\"Dislike\"-երը Shorts-ում ցուցադրվում են Սահմանափակում. \"Dislike\"-երը կարող են չերևալ անհայտ ռեժիմում" - \"Dislike\"-երը Shorts-ում չեն ցուցադրվում - \"Dislike\"-երը տոկոսային հարաբերակցությամբ - \"Dislike\"-երը ցուցադրվում են որպես տոկոս - \"Dislike\"-երը ցուցադրվում են որպես թիվ - - Միարժեք «Like» կոճակ - \"Like\" կոճակը ոճավորված է մինիմալ մեծության համար - \"Like\" կոճակը ոճավորված է լավագույն հայացքի համար - Ցույց տալ մոտավոր հավանումները - «Հավանումներն» անջատված տեսանյութերը ցույց են տալիս հավանումների մոտավոր քանակը - Մոտավոր հավանումները չեն ցուցադրվում - Ցուցադրել \"toast\", եթե API-ն հասանելի չէ - \"Toast\"-ը ցուցադրվում է, եթե Return YouTube Dislike-ը հասանելի չէ - \"Toast\"-ը չի ցուցադրվում, եթե Return YouTube Dislike-ը հասանելի չէ - Տվյալները տրամադրվում են Return YouTube Dislike API-ի միջոցով. Սեղմեք այստեղ՝ ավելին իմանալու համար - - Return YouTube Dislike API-ի կարգավիճակը այս հարմարանքի համար - API պատասխանի ժամանակը, միջին - API պատասխանի ժամանակը, մինիմալ - API-ի պատասխանի ժամանակը, առավելագույնը - API-ի պատասխանի ժամանակը, վերջին տեսանյութը - Անհավանումների մասին տեղեկությունները ժամանակավորապես հասանելի չեն: Կիրառվում է Client API-ի կողմից սահմանված արագության սահմանափակումը - API-ի ձայների մասին տվյալների ստացումը, կանչերի քանակը - Network կանչեր չեն կատարվել - Կատարվել է %d network կանչ - API-ի ձայների մասին տվյալների ստացումը, ժամանակաչափերի քանակը - Network կանչեր չեն ժամանակաչափվել - %d network կանչ ժամանակաչափվել է - API-ի կողմից սահմանված արագության սահմանափակումներ - Client-ի կողմից սահմանված արագության սահմանափակումներ չեն հանդիպել - Client-ի կողմից սահմանված արագության սահմանափակումը հանդիպել է %d անգամ - %d միլիվայրկյան - - - Ակտիվացնել լայն որոնման տողը - Լայն որոնման տողը ակտիվացված է - Լայն որոնման տողը անակտիվ է - - - Ակտիվացնել բարձր որակի մանրապատկերները - Seekbar-ի մանրապատկերները բարձր որակի են - Seekbar-ի մանրապատկերները միջին որակի են - Fullscreen Seekbar-ի մանրապատկերները միջին որակի են - "Այս կարգավորումը կվերականգնի նաև livestream-ների մեջ մինչև այսօր գոյություն չունեցող thumbnails-ները։ + \"Dislike\"-երը Shorts-ում չեն ցուցադրվում + \"Dislike\"-երը տոկոսային հարաբերակցությամբ + \"Dislike\"-երը ցուցադրվում են որպես տոկոս + \"Dislike\"-երը ցուցադրվում են որպես թիվ + + Միարժեք «Like» կոճակ + \"Like\" կոճակը ոճավորված է մինիմալ մեծության համար + \"Like\" կոճակը ոճավորված է լավագույն հայացքի համար + Ցույց տալ մոտավոր հավանումները + «Հավանումներն» անջատված տեսանյութերը ցույց են տալիս հավանումների մոտավոր քանակը + Մոտավոր հավանումները չեն ցուցադրվում + Ցուցադրել \"toast\", եթե API-ն հասանելի չէ + \"Toast\"-ը ցուցադրվում է, եթե Return YouTube Dislike-ը հասանելի չէ + \"Toast\"-ը չի ցուցադրվում, եթե Return YouTube Dislike-ը հասանելի չէ + Տվյալները տրամադրվում են Return YouTube Dislike API-ի միջոցով. Սեղմեք այստեղ՝ ավելին իմանալու համար + + Return YouTube Dislike API-ի կարգավիճակը այս հարմարանքի համար + API պատասխանի ժամանակը, միջին + API պատասխանի ժամանակը, մինիմալ + API-ի պատասխանի ժամանակը, առավելագույնը + API-ի պատասխանի ժամանակը, վերջին տեսանյութը + Անհավանումների մասին տեղեկությունները ժամանակավորապես հասանելի չեն: Կիրառվում է Client API-ի կողմից սահմանված արագության սահմանափակումը + API-ի ձայների մասին տվյալների ստացումը, կանչերի քանակը + Network կանչեր չեն կատարվել + Կատարվել է %d network կանչ + API-ի ձայների մասին տվյալների ստացումը, ժամանակաչափերի քանակը + Network կանչեր չեն ժամանակաչափվել + %d network կանչ ժամանակաչափվել է + API-ի կողմից սահմանված արագության սահմանափակումներ + Client-ի կողմից սահմանված արագության սահմանափակումներ չեն հանդիպել + Client-ի կողմից սահմանված արագության սահմանափակումը հանդիպել է %d անգամ + %d միլիվայրկյան + + + Ակտիվացնել լայն որոնման տողը + Լայն որոնման տողը ակտիվացված է + Լայն որոնման տողը անակտիվ է + + + Ակտիվացնել բարձր որակի մանրապատկերները + Seekbar-ի մանրապատկերները բարձր որակի են + Seekbar-ի մանրապատկերները միջին որակի են + Fullscreen Seekbar-ի մանրապատկերները միջին որակի են + "Այս կարգավորումը կվերականգնի նաև livestream-ների մեջ մինչև այսօր գոյություն չունեցող thumbnails-ները։ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչպես ընթացիկ տեսանյութը։ Այս հատկությունը լավագույնս աշխատում է 720p կամ ավելի ցածր որակի տեսանյութի դեպքում և արագ ինտերնետ կապի դեպքում։" - Վերականգնել հին Seekbar մանրապատկերները - Seekbar մանրապատկերները կհայտնվեն Seekbar-ի վերևում - Seekbar մանրապատկերները կհայտնվեն fullscreen-ում - - - Ակտիվացնել SponsorBlock - SponsorBlock е կամավարական համակարգ, որը նախատեսված է YouTube տեսանյութերի ձանձրալի հատվածները բաց թողնելու համար - Արտաքին տեսք - Ցույց տալ ձայնի մասին տեղեկությունները - Segment-ի ձայնի մասին տեղեկությունները ցույց են տրվում - Segment-ի ձայնի մասին տեղեկությունները չեն ցույց տրվում - Օգտագործե՛ք քառակուսի դասավորություն - Կոճակները և հսկիչները քառակուսի են - Կոճակները և կառավարման վահանակները կլորացված են - - Օգտագործել կոմպակտ Skip կոճակը - Բաց թողնել կոճակը ոճավորվել է նվազագույն լայնության համար - Բաց թողնել կոճակը ոճավորվել է լավագույն տեսքի համար - Ավտոմատ կերպով թաքցնել Skip կոճակը - Բաց թողնել կոճակը թաքնվում է մի քանի վայրկյանից հետո - Skip կոճակը ցուցադրվում է ամբողջ հատվածի համար - Բաց թողնելու կոճակի տևողությունը - Որքան ժամանակ ցուցադրել բացթողում և բացթողում՝ ընդգծելու կոճակները մինչև ավտոմատ թաքնվելը - Ցուցադրել բաց թողնելը չեղարկելու ծանուցումը։ - Ծանուցում է ցուցադրվում, երբ հատվածն ավտոմատ կերպով բաց է թողնվում։ Հպեք ծանուցմանը՝ բացթողումը չեղարկելու համար - Ծանուցումը չի ցուցադրվում - Բաց թողնելու ծանուցման տևողությունը - Որքան ժամանակ ցուցադրել բացթողումը հետարկելու ծանուցումը - 1 վայրկյան - 2 վայրկյան - 3 վայրկյան - 4 վայրկյան - 5 վայրկյան - 6 վայրկյան - 7 վայրկյան - 8 վայրկյան - 9 վայրկյան - 10 վայրկյան - Ցույց տալ տեսանյութի երկարությունը առանց segment-ների - Տեսանյութի երկարությունը հանած բոլոր հատվածները ցուցադրվում է որոնման գոտում - Ցույց է տրվում ամբողջ տեսանյութի երկարությունը - Նոր segment-ների ստեղծում - Ցուցադրել նոր հատված ստեղծելու կոճակը - Նոր segment-ի ստեղծման կոճակը ցույց է տրվում - Նոր segment-ի ստեղծման կոճակը չի ցույց տրվում - Կարգավորել նոր segment-ի քայլը - Միլիվայրկյանների քանակը, որը ժամանակի կարգավորման կոճակները տեղափոխվում են նոր segment-ներ ստեղծելիս - Արժեքը պետք է լինի դրական թիվ - Դիտել ուղեցույցները - Ուղեցույցները պարունակում են կանոններ և խորհուրդներ նոր segment-ներ ստեղծելու համար - Հետևեք ուղեցույցներին - Կարդացեք SponsorBlock-ի ուղեցույցները, նախքան նոր segment-ներ ստեղծելը - Արդեն կարդացել եմ - Ցույց տվեք ինձ - Ընդհանուր - Ցույց տալ toast, եթե API-ը հասանելի չէ - Toast ցույց է տրվում, եթե SponsorBlock-ը հասանելի չէ - Toast չի ցույց տրվում, եթե SponsorBlock-ը հասանելի չէ - Ակտիվացնել բաց թողնելների հաշվի վարումը - Թույլ է տալիս SponsorBlock-ի առաջատարներին իմանալ, թե որքան ժամանակ է խնայվում: Յուրաքանչյուր անգամ, երբ segment-ը բաց է թողնվում, հաղորդագրություն է ուղարկվում առաջատարներին - Բաց թողնելների հաշվի վարումը չի ակտիվացվել - Segment-ի նվազագույն տևողությունը - Segment-ները, որոնք կարճ են այս արժեքից (վայրկյաններում), չեն ցույց տրվի կամ բաց թողնվի - Անվավեր ժամանակի տևողություն - Ձեր անձնական օգտատիրոջ ID-ն - Սա պետք է պահվի գաղտնի: Սա ինչպես գաղտնաբառ է և չպետք է կիսվի որևէ մեկի հետ: Եթե ​​որևէ մեկը ունի այս ID-ն, կարող է մարմնավորել ձեզ - Անձնական օգտատիրոջ ID-ն պետք է լինի առնվազն 30 նիշ երկար - Փոխել API-ի URL-ը - Հասցեն, որը SponsorBlock-ը օգտագործում է server-ի հետ կապ հաստատելու համար - API-ի URL-ը վերականգնվել է - API URL-ն անվավեր է - API-ի URL-ը փոխվել է - Import/Export կարգավորումներ - Պատճենել - Ձեր SponsorBlock JSON կարգավորումը, որը կարող է import/export արվել ReVanced-ում և SponsorBlock-ի այլ հարթակներում - Ձեր SponsorBlock JSON կարգավորումը, որը կարող է import/export արվել ReVanced-ում և SponsorBlock-ի այլ հարթակներում: Սա ներառում է ձեր անձնական օգտատիրոջ ID-ը: Խնդրում ենք մտածել, թե ում հետ եք կիսվում այս տվյալներով - Կարգավորումները հաջողությամբ import արվել են - Import-ը ձախողվել է: %s - Export-ը ձախողվել է: %s - "Ձեր կարգավորումներում կա SponsorBlock-ի մասնավոր userid։ + Վերականգնել հին Seekbar մանրապատկերները + Seekbar մանրապատկերները կհայտնվեն Seekbar-ի վերևում + Seekbar մանրապատկերները կհայտնվեն fullscreen-ում + + + Ակտիվացնել SponsorBlock + SponsorBlock е կամավարական համակարգ, որը նախատեսված է YouTube տեսանյութերի ձանձրալի հատվածները բաց թողնելու համար + Արտաքին տեսք + Ցույց տալ ձայնի մասին տեղեկությունները + Segment-ի ձայնի մասին տեղեկությունները ցույց են տրվում + Segment-ի ձայնի մասին տեղեկությունները չեն ցույց տրվում + Օգտագործե՛ք քառակուսի դասավորություն + Կոճակները և հսկիչները քառակուսի են + Կոճակները և կառավարման վահանակները կլորացված են + + Օգտագործել կոմպակտ Skip կոճակը + Բաց թողնել կոճակը ոճավորվել է նվազագույն լայնության համար + Բաց թողնել կոճակը ոճավորվել է լավագույն տեսքի համար + Ավտոմատ կերպով թաքցնել Skip կոճակը + Բաց թողնել կոճակը թաքնվում է մի քանի վայրկյանից հետո + Skip կոճակը ցուցադրվում է ամբողջ հատվածի համար + Բաց թողնելու կոճակի տևողությունը + Որքան ժամանակ ցուցադրել բացթողում և բացթողում՝ ընդգծելու կոճակները մինչև ավտոմատ թաքնվելը + Ցուցադրել բաց թողնելը չեղարկելու ծանուցումը։ + Ծանուցում է ցուցադրվում, երբ հատվածն ավտոմատ կերպով բաց է թողնվում։ Հպեք ծանուցմանը՝ բացթողումը չեղարկելու համար + Ծանուցումը չի ցուցադրվում + Բաց թողնելու ծանուցման տևողությունը + Որքան ժամանակ ցուցադրել բացթողումը հետարկելու ծանուցումը + 1 վայրկյան + 2 վայրկյան + 3 վայրկյան + 4 վայրկյան + 5 վայրկյան + 6 վայրկյան + 7 վայրկյան + 8 վայրկյան + 9 վայրկյան + 10 վայրկյան + Ցույց տալ տեսանյութի երկարությունը առանց segment-ների + Տեսանյութի երկարությունը հանած բոլոր հատվածները ցուցադրվում է որոնման գոտում + Ցույց է տրվում ամբողջ տեսանյութի երկարությունը + Նոր segment-ների ստեղծում + Ցուցադրել նոր հատված ստեղծելու կոճակը + Նոր segment-ի ստեղծման կոճակը ցույց է տրվում + Նոր segment-ի ստեղծման կոճակը չի ցույց տրվում + Կարգավորել նոր segment-ի քայլը + Միլիվայրկյանների քանակը, որը ժամանակի կարգավորման կոճակները տեղափոխվում են նոր segment-ներ ստեղծելիս + Արժեքը պետք է լինի դրական թիվ + Դիտել ուղեցույցները + Ուղեցույցները պարունակում են կանոններ և խորհուրդներ նոր segment-ներ ստեղծելու համար + Հետևեք ուղեցույցներին + Կարդացեք SponsorBlock-ի ուղեցույցները, նախքան նոր segment-ներ ստեղծելը + Արդեն կարդացել եմ + Ցույց տվեք ինձ + Ընդհանուր + Ցույց տալ toast, եթե API-ը հասանելի չէ + Toast ցույց է տրվում, եթե SponsorBlock-ը հասանելի չէ + Toast չի ցույց տրվում, եթե SponsorBlock-ը հասանելի չէ + Ակտիվացնել բաց թողնելների հաշվի վարումը + Թույլ է տալիս SponsorBlock-ի առաջատարներին իմանալ, թե որքան ժամանակ է խնայվում: Յուրաքանչյուր անգամ, երբ segment-ը բաց է թողնվում, հաղորդագրություն է ուղարկվում առաջատարներին + Բաց թողնելների հաշվի վարումը չի ակտիվացվել + Segment-ի նվազագույն տևողությունը + Segment-ները, որոնք կարճ են այս արժեքից (վայրկյաններում), չեն ցույց տրվի կամ բաց թողնվի + Անվավեր ժամանակի տևողություն + Ձեր անձնական օգտատիրոջ ID-ն + Սա պետք է պահվի գաղտնի: Սա ինչպես գաղտնաբառ է և չպետք է կիսվի որևէ մեկի հետ: Եթե ​​որևէ մեկը ունի այս ID-ն, կարող է մարմնավորել ձեզ + Անձնական օգտատիրոջ ID-ն պետք է լինի առնվազն 30 նիշ երկար + Փոխել API-ի URL-ը + Հասցեն, որը SponsorBlock-ը օգտագործում է server-ի հետ կապ հաստատելու համար + API-ի URL-ը վերականգնվել է + API URL-ն անվավեր է + API-ի URL-ը փոխվել է + Import/Export կարգավորումներ + Պատճենել + Ձեր SponsorBlock JSON կարգավորումը, որը կարող է import/export արվել ReVanced-ում և SponsorBlock-ի այլ հարթակներում + Ձեր SponsorBlock JSON կարգավորումը, որը կարող է import/export արվել ReVanced-ում և SponsorBlock-ի այլ հարթակներում: Սա ներառում է ձեր անձնական օգտատիրոջ ID-ը: Խնդրում ենք մտածել, թե ում հետ եք կիսվում այս տվյալներով + Կարգավորումները հաջողությամբ import արվել են + Import-ը ձախողվել է: %s + Export-ը ձախողվել է: %s + "Ձեր կարգավորումներում կա SponsorBlock-ի մասնավոր userid։ Ձեր userid-ը նման է գաղտնաբառի, և այն երբեք չպետք է կիսվի։ " - Ավելի չցույց տալ - Փոխել segment-ի վարքը - Հովանավոր - Վճարովի գովազդ, վճարովի ուղղորդումներ և ուղիղ գովազդներ: Չի վերաբերում ինքնագովազդին կամ անվճար հրավերներին կազմակերպություններին/ստեղծողներին/վեբ կայքերին/ապրանքներին, որոնք նրանց դուր են գալիս - Անվճար/Ինքնագովազդ - Հովանավորի նման, բայց վճարովի կամ ինքնագովազդի համար չի օգտագործվում։ ներառում է բաժիններ ապրանքների, նվիրատվությունների կամ համագործակցության մասին տեղեկատվության մասին - Փոխազդեցության հիշեցում (Subscribe) - Կարճ հիշեցում, որպեսզի like-ի, subscribe-ի կամ հետևեն նրանց content-ի կեսին: Եթե ​​այն երկար է կամ վերաբերում է որոշակի բանին, դա պետք է լինի ինքնագովազդի տակ - Ընդգծում - Տեսանյութի այն հատվածը, որը շատերն են փնտրում - Ընդմիջում/Ներածության անիմացիա - Ժամանակահատված, որը չունի իրական content: Կարող է լինել դադար, կայուն կադր կամ կրկնվող անիմացիա: Չի ներառում transitions, որոնք պարունակում են տեղեկություն - Վերջնական տիտրեր / Տիտրեր - Կրեդիտները կամ երբ YouTube-ի վերջնական քարտերը հայտնվում են։ Չի կիրառվում տեղեկատվություն ներառող եզրափակումների համար - Ներածություն / Ողջույններ - Առաջիկա տեսանյութի պատմողական անոնսներ, ողջույններ և հրաժեշտներ։ Չի ներառում լրացուցիչ բովանդակություն ավելացնող հատվածներ - Նախադիտում / Ամփոփում - Կտորների հավաքածու, որոնք ցույց են տալիս, թե ինչ է գալու կամ ինչ է պատահել տեսանյութում կամ սերիայի այլ տեսանյութերում, որտեղ բոլոր տեղեկությունները կրկնվում են այլուր - Շեղում / Կատակներ - Երկրորդական տեսարաններ կամ կատակներ, որոնք անհրաժեշտ չեն տեսանյութի հիմնական բովանդակությունը հասկանալու համար։ Չի ներառում համատեքստ կամ ֆոնային մանրամասներ տրամադրող հատվածներ - Երաժշտություն՝ ոչ երաժշտական բաժին - Միայն երաժշտական տեսահոլովակներում օգտագործելու համար: Երաժշտական տեսահոլովակների բաժիններ առանց երաժշտության, որոնք դեռ չեն ընդգրկված մեկ այլ կատեգորիայի կողմից - Բաց թողնել - Ընդգծել - Բաց թողնել հովանավորը - Բաց թողնել գովազդը - Բաց թողնել փոխազդեցությունը - Բաց թողնել՝ ընդգծելու համար - Բաց թողնել մուտքը - Բաց թողնել ընդմիջումը - Բաց թողնել ընդմիջումը - Բաց թողնել ավարտը - Բաց թողնել ներածությունը - Բաց թողնել նախադիտումը - Բաց թողնել նախադիտումը - Բաց թողնել համառոտ վերանայումը - Բաց թողնել շեղումը - Բաց թողնել ոչ-երաժշտական մասը - Բաց թողնել հատվածը - Բաց թողնված հովանավորը - Բաց թողնված ինքնագովազդը - Բաց թողնված անհարմար հիշեցումը - Բաց թողնել՝ ընդգծելու համար - Բաց թողնված մուտքը - Բաց թողնել ընդմիջումը - Բաց թողնել ընդմիջումը - Բաց թողնված ավարտը - Ներածությունը բաց է թողնված - Բաց թողնված նախադիտումը - Բաց թողնված նախադիտումը - Բաց թողնված համառոտ վերանայումը - Շեղումը բաց է թողնված - Բաց թողնված ոչ-երաժշտական մասը - Բաց թողնված չհաստատված հատվածը - Բաց թողնված մի քանի հատվածներ - Բաց թողնել ավտոմատ - Բաց թողնել ավտոմատ մեկ անգամ - Ցուցադրել Skip կոճակը - Ցույց տալ փնտրելու գծում - Անջատել - Հատվածը չի կարող լրացվել։ %s - SponsorBlock-ը կարճ ժամանակով անհասանելի է - Հատվածը չի կարող լրացվել (կարգավիճակ։ %1$d %2$s) - Չի հնարավոր ուղարկել հատված։ Rate Limited (անձի կամ IP-ի կողմից մեծ քանակությամբ ուղարկում)։ - Հատվածը չի կարող լրացվել։ %s - "Չի հնարավոր ուղարկել հատվածը։ + Ավելի չցույց տալ + Փոխել segment-ի վարքը + Հովանավոր + Վճարովի գովազդ, վճարովի ուղղորդումներ և ուղիղ գովազդներ: Չի վերաբերում ինքնագովազդին կամ անվճար հրավերներին կազմակերպություններին/ստեղծողներին/վեբ կայքերին/ապրանքներին, որոնք նրանց դուր են գալիս + Անվճար/Ինքնագովազդ + Հովանավորի նման, բայց վճարովի կամ ինքնագովազդի համար չի օգտագործվում։ ներառում է բաժիններ ապրանքների, նվիրատվությունների կամ համագործակցության մասին տեղեկատվության մասին + Փոխազդեցության հիշեցում (Subscribe) + Կարճ հիշեցում, որպեսզի like-ի, subscribe-ի կամ հետևեն նրանց content-ի կեսին: Եթե ​​այն երկար է կամ վերաբերում է որոշակի բանին, դա պետք է լինի ինքնագովազդի տակ + Ընդգծում + Տեսանյութի այն հատվածը, որը շատերն են փնտրում + Ընդմիջում/Ներածության անիմացիա + Ժամանակահատված, որը չունի իրական content: Կարող է լինել դադար, կայուն կադր կամ կրկնվող անիմացիա: Չի ներառում transitions, որոնք պարունակում են տեղեկություն + Վերջնական տիտրեր / Տիտրեր + Կրեդիտները կամ երբ YouTube-ի վերջնական քարտերը հայտնվում են։ Չի կիրառվում տեղեկատվություն ներառող եզրափակումների համար + Ներածություն / Ողջույններ + Առաջիկա տեսանյութի պատմողական անոնսներ, ողջույններ և հրաժեշտներ։ Չի ներառում լրացուցիչ բովանդակություն ավելացնող հատվածներ + Նախադիտում / Ամփոփում + Կտորների հավաքածու, որոնք ցույց են տալիս, թե ինչ է գալու կամ ինչ է պատահել տեսանյութում կամ սերիայի այլ տեսանյութերում, որտեղ բոլոր տեղեկությունները կրկնվում են այլուր + Շեղում / Կատակներ + Երկրորդական տեսարաններ կամ կատակներ, որոնք անհրաժեշտ չեն տեսանյութի հիմնական բովանդակությունը հասկանալու համար։ Չի ներառում համատեքստ կամ ֆոնային մանրամասներ տրամադրող հատվածներ + Երաժշտություն՝ ոչ երաժշտական բաժին + Միայն երաժշտական տեսահոլովակներում օգտագործելու համար: Երաժշտական տեսահոլովակների բաժիններ առանց երաժշտության, որոնք դեռ չեն ընդգրկված մեկ այլ կատեգորիայի կողմից + Բաց թողնել + Ընդգծել + Բաց թողնել հովանավորը + Բաց թողնել գովազդը + Բաց թողնել փոխազդեցությունը + Բաց թողնել՝ ընդգծելու համար + Բաց թողնել մուտքը + Բաց թողնել ընդմիջումը + Բաց թողնել ընդմիջումը + Բաց թողնել ավարտը + Բաց թողնել ներածությունը + Բաց թողնել նախադիտումը + Բաց թողնել նախադիտումը + Բաց թողնել համառոտ վերանայումը + Բաց թողնել շեղումը + Բաց թողնել ոչ-երաժշտական մասը + Բաց թողնել հատվածը + Բաց թողնված հովանավորը + Բաց թողնված ինքնագովազդը + Բաց թողնված անհարմար հիշեցումը + Բաց թողնել՝ ընդգծելու համար + Բաց թողնված մուտքը + Բաց թողնել ընդմիջումը + Բաց թողնել ընդմիջումը + Բաց թողնված ավարտը + Ներածությունը բաց է թողնված + Բաց թողնված նախադիտումը + Բաց թողնված նախադիտումը + Բաց թողնված համառոտ վերանայումը + Շեղումը բաց է թողնված + Բաց թողնված ոչ-երաժշտական մասը + Բաց թողնված չհաստատված հատվածը + Բաց թողնված մի քանի հատվածներ + Բաց թողնել ավտոմատ + Բաց թողնել ավտոմատ մեկ անգամ + Ցուցադրել Skip կոճակը + Ցույց տալ փնտրելու գծում + Անջատել + Հատվածը չի կարող լրացվել։ %s + SponsorBlock-ը կարճ ժամանակով անհասանելի է + Հատվածը չի կարող լրացվել (կարգավիճակ։ %1$d %2$s) + Չի հնարավոր ուղարկել հատված։ Rate Limited (անձի կամ IP-ի կողմից մեծ քանակությամբ ուղարկում)։ + Հատվածը չի կարող լրացվել։ %s + "Չի հնարավոր ուղարկել հատվածը։ Արդեն գոյություն ունի։" - Հատվածը հաջողությամբ լրացվել է - - SponsorBlock-ը կարճ ժամանակով անհասանելի է (API-ն ժամանակավորապես անջատվել է) - SponsorBlock-ը կարճ ժամանակով անհասանելի է (կարգավիճակ %d) - SponsorBlock-ը կարճ ժամանակով անհասանելի է - Հատվածի համար քվեարկելը հնարավոր չէ (API-ն ժամանակավորապես անջատվել է) - Հատվածի համար քվեարկելը հնարավոր չէ (կարգավիճակ։ %1$d %2$s) - Հատվածի համար քվեարկելը հնարավոր չէ։ %s - Ավելացնել - Նվազեցնել - Փոխել կատեգորիան - Քվեարկելու համար հատվածներ չկան - - %1$s-ից %2$s - Ընտրեք հատվածի կատեգորիան - Կատեգորիան անջատված է կարգավորումներում։ Անջատել կատեգորիան՝ լրացնելու համար։ - Նոր SponsorBlock հատված - Կարգավորեք %s որպես նոր հատվածի սկիզբ կամ ավարտ։ - Սկիզբ - Ավարտ - Հիմա - Հատվածի սկիզբը - Հատվածի ավարտը - Ժամանակներն ճիշտ են։ - "Հատվածը հետևյալն է + Հատվածը հաջողությամբ լրացվել է + + SponsorBlock-ը կարճ ժամանակով անհասանելի է (API-ն ժամանակավորապես անջատվել է) + SponsorBlock-ը կարճ ժամանակով անհասանելի է (կարգավիճակ %d) + SponsorBlock-ը կարճ ժամանակով անհասանելի է + Հատվածի համար քվեարկելը հնարավոր չէ (API-ն ժամանակավորապես անջատվել է) + Հատվածի համար քվեարկելը հնարավոր չէ (կարգավիճակ։ %1$d %2$s) + Հատվածի համար քվեարկելը հնարավոր չէ։ %s + Ավելացնել + Նվազեցնել + Փոխել կատեգորիան + Քվեարկելու համար հատվածներ չկան + + %1$s-ից %2$s + Ընտրեք հատվածի կատեգորիան + Կատեգորիան անջատված է կարգավորումներում։ Անջատել կատեգորիան՝ լրացնելու համար։ + Նոր SponsorBlock հատված + Կարգավորեք %s որպես նոր հատվածի սկիզբ կամ ավարտ։ + Սկիզբ + Ավարտ + Հիմա + Հատվածի սկիզբը + Հատվածի ավարտը + Ժամանակներն ճիշտ են։ + "Հատվածը հետևյալն է %1$s -ից @@ -1284,46 +1283,46 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ (%3$s) Պատրաստ եք ներկայացնելու՞" - Սկիզբը պետք է լինի ավարտից առաջ - Առաջին հերթին նշեք երկու կետ ժամանակային գծի վրա - Նախադիտեք հատվածը և համոզվեք, որ այն հարթորեն է բաց թողնվում - Խմբագրեք հատվածի ժամանակը ձեռքով - Մի՞թե ցանկանում եք խմբագրել հատվածի սկիզբը կամ ավարտը։ - Նշված ժամանակը անվավեր է - Վիճակագրություն - - Վիճակագրությունը ժամանակավորապես հասանելի չէ (API-ն անջատված է) - Բեռնվում է... - SponsorBlock-ը անջատված է - Ձեր օգտատիրողի անունը։ <b>%s</b> - Սեղմեք այստեղ՝ փոխելու ձեր օգտատիրողի անունը - Օգտատիրողի անունը փոխելը հնարավոր չէ։ Կարգավիճակ։ %1$d %2$s - Օգտատիրողի անունը հաջողությամբ փոխվել է - Ձեր վարկանիշը <b>%.2f</b> է - Դուք ստեղծել եք <b>%s</b> հատվածներ - Սեղմեք այստեղ՝ դիտելու ձեր հատվածները - SponsorBlock-ի առաջատարները - Դուք փրկել եք մարդկանց <b>%s</b> հատվածներից - Սեղմեք այստեղ՝ տեսնելու համաշխարհային վիճակագրությունը և լավագույն մասնակիցներին - Դա <b>%s</b> է նրանց կյանքից։<br>Սեղմեք այստեղ՝ տեսնելու առաջատարների ցանկը - Դուք բաց թողել եք <b>%s</b> հատվածներ - Դա <b>%s</b> է - Վերագործարկել բաց թողնված հատվածների հաշվիչը։ - %1$s ժամ %2$s րոպե - %1$s րոպե %2$s վայրկյան - %s վայրկյան - Թափանցիկություն․ - Գույն։ - Ծրագրի մասին - Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու - - - Ձևաչափի փոփոխություն - Ընտրված - Հեռախոս - Պլանշետ - Ավտոմոբիլային - "Փոփոխությունները ներառում են. + Սկիզբը պետք է լինի ավարտից առաջ + Առաջին հերթին նշեք երկու կետ ժամանակային գծի վրա + Նախադիտեք հատվածը և համոզվեք, որ այն հարթորեն է բաց թողնվում + Խմբագրեք հատվածի ժամանակը ձեռքով + Մի՞թե ցանկանում եք խմբագրել հատվածի սկիզբը կամ ավարտը։ + Նշված ժամանակը անվավեր է + Վիճակագրություն + + Վիճակագրությունը ժամանակավորապես հասանելի չէ (API-ն անջատված է) + Բեռնվում է... + SponsorBlock-ը անջատված է + Ձեր օգտատիրողի անունը։ <b>%s</b> + Սեղմեք այստեղ՝ փոխելու ձեր օգտատիրողի անունը + Օգտատիրողի անունը փոխելը հնարավոր չէ։ Կարգավիճակ։ %1$d %2$s + Օգտատիրողի անունը հաջողությամբ փոխվել է + Ձեր վարկանիշը <b>%.2f</b> է + Դուք ստեղծել եք <b>%s</b> հատվածներ + Սեղմեք այստեղ՝ դիտելու ձեր հատվածները + SponsorBlock-ի առաջատարները + Դուք փրկել եք մարդկանց <b>%s</b> հատվածներից + Սեղմեք այստեղ՝ տեսնելու համաշխարհային վիճակագրությունը և լավագույն մասնակիցներին + Դա <b>%s</b> է նրանց կյանքից։<br>Սեղմեք այստեղ՝ տեսնելու առաջատարների ցանկը + Դուք բաց թողել եք <b>%s</b> հատվածներ + Դա <b>%s</b> է + Վերագործարկել բաց թողնված հատվածների հաշվիչը։ + %1$s ժամ %2$s րոպե + %1$s րոպե %2$s վայրկյան + %s վայրկյան + Թափանցիկություն․ + Գույն։ + Ծրագրի մասին + Տվյալները մատուցվում են SponsorBlock API-ի կողմից։ Սեղմեք այստեղ՝ ավելի շատ իմանալու և այլ հարթակների համար ներբեռնումները տեսնելու + + + Ձևաչափի փոփոխություն + Ընտրված + Հեռախոս + Պլանշետ + Ավտոմոբիլային + "Փոփոխությունները ներառում են. Պլանշետի դասավորություն • Համայնքային գրառումները թաքնված են @@ -1331,315 +1330,314 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Ավտոմեքենայի դասավորություն • Shorts-ը բացվում է սովորական նվագարկչում • Ֆիդը կազմակերպվում է ըստ թեմաների և ալիքների" - - - Կեղծել հավելվածի տարբերակը - Տարբերակը կեղծված է - Տարբերակը կեղծված չէ - "«Հավելվածի տարբերակը» կփոխվի YouTube-ի ավելի հին տարբերակի։ + + + Կեղծել հավելվածի տարբերակը + Տարբերակը կեղծված է + Տարբերակը կեղծված չէ + "«Հավելվածի տարբերակը» կփոխվի YouTube-ի ավելի հին տարբերակի։ Սա կփոխի հավելվածի արտաքին տեսքը և հատկությունները, բայց կարող է առաջացնել անհայտ կողմնակի ազդեցություններ։ Եթե հետագայում անջատվի, խորհուրդ է տրվում մաքրել հավելվածի տվյալները՝ UI սխալներից խուսափելու համար։" - Spoof-ի կիրառության տարբերակի նպատակ - 20.13.41 - Վերականգնել չծալված տեսանյութի գործողությունների տողը - 20.05.46 - Վերականգնել արտագրման ֆունկցիոնալությունը - 19.35.36 - Վերականգնել հին Shorts պլեյերի պատկերակները - 19.01.34 - Վերականգնել հին նավիգացիոն պատկերակները - - - Փոխել մեկնարկային էջը - Ըստ լռելյայնի - Բոլոր բաժանորդագրությունները - Դիտել ալիքները - Դասընթացներ / Ուսուցում - Հետազոտել - Mόδα և գեղեցկություն - Խաղեր - Պատմություն - Գրադարան - Մեծ դուր եկած տեսանյութեր - Անհապաղ - Ֆիլմեր - Երաժշտություն - Նորություններ - Ծանուցումներ - Երգացանկեր - Որոնում - Գնումներ - Սպորտ - Գրանցագրություններ - Trend-ի մեջ - Վիրտուալ իրականություն - Դիտել հետո - Ձեր հոլովակները - Միշտ փոխել մեկնարկային էջը - "Մեկնարկային էջը միշտ փոխված է + Spoof-ի կիրառության տարբերակի նպատակ + 20.13.41 - Վերականգնել չծալված տեսանյութի գործողությունների տողը + 20.05.46 - Վերականգնել արտագրման ֆունկցիոնալությունը + 19.35.36 - Վերականգնել հին Shorts պլեյերի պատկերակները + 19.01.34 - Վերականգնել հին նավիգացիոն պատկերակները + + + Փոխել մեկնարկային էջը + Ըստ լռելյայնի + Բոլոր բաժանորդագրությունները + Դիտել ալիքները + Դասընթացներ / Ուսուցում + Հետազոտել + Mόδα և գեղեցկություն + Խաղեր + Պատմություն + Գրադարան + Մեծ դուր եկած տեսանյութեր + Անհապաղ + Ֆիլմեր + Երաժշտություն + Նորություններ + Ծանուցումներ + Երգացանկեր + Որոնում + Գնումներ + Սպորտ + Գրանցագրություններ + Trend-ի մեջ + Վիրտուալ իրականություն + Դիտել հետո + Ձեր հոլովակները + Միշտ փոխել մեկնարկային էջը + "Մեկնարկային էջը միշտ փոխված է Սահմանափակում. գործիքագոտու վրա հետադարձ կոճակն օգտագործելը կարող է չաշխատել" - Մեկնարկային էջը փոխվում է միայն հավելվածի գործարկման ժամանակ - - - Անջատել Shorts պլեյերի վերսկսումը - Shorts պլեյերը չի վերսկսվի կիրառության մեկնարկի ժամանակ - Shorts պլեյերը կվերսկսվի կիրառության մեկնարկի ժամանակ - - - Բացեք Shorts - Shorts կրող - Կանոնավոր նվագարկիչ - Կանոնավոր նվագարկիչ լիարժեք էկրանով - - - Ավտոմատ կարճ տեսանյութերի միացում - Shorts-ը կվերարտադրվի ավտոմատ կերպով - Shorts-ը կկրկնվի - Autoplay Shorts ֆոնային վերարտադրում - Shorts-ի ֆոնային վերարտադրումը կվերարտադրվի ավտոմատ կերպով - Shorts-ի ֆոնային վերարտադրումը կկրկնվի - - - Մինի նվագարկիչ - Փոխել ներծրագրային փոքրացված նվագարկչի ոճը - Miniplayer-ի տեսակ - Անջատված է - Ըստ լռելյայնի - Մինիմալ - Планшет - Ժամանակակից 1 - Ժամանակակից 2 - Ժամանակակից 3 - Ժամանակակից 4 - Անջատել կլորացված անկյունները - Անկյունները քառակուսի են - Անկյունները կլորացված են - Աктиվացնել կրկնակի սեղմելը և մատների շարժումը չափը փոխելու համար - "Երկու անգամ սեղմելու գործողությունը և չափսի փոփոխման համար սեղմելը միացված են + Մեկնարկային էջը փոխվում է միայն հավելվածի գործարկման ժամանակ + + + Անջատել Shorts պլեյերի վերսկսումը + Shorts պլեյերը չի վերսկսվի կիրառության մեկնարկի ժամանակ + Shorts պլեյերը կվերսկսվի կիրառության մեկնարկի ժամանակ + + + Բացեք Shorts + Shorts կրող + Կանոնավոր նվագարկիչ + Կանոնավոր նվագարկիչ լիարժեք էկրանով + + + Ավտոմատ կարճ տեսանյութերի միացում + Shorts-ը կվերարտադրվի ավտոմատ կերպով + Shorts-ը կկրկնվի + Autoplay Shorts ֆոնային վերարտադրում + Shorts-ի ֆոնային վերարտադրումը կվերարտադրվի ավտոմատ կերպով + Shorts-ի ֆոնային վերարտադրումը կկրկնվի + + + Մինի նվագարկիչ + Փոխել ներծրագրային փոքրացված նվագարկչի ոճը + Miniplayer-ի տեսակ + Անջատված է + Ըստ լռելյայնի + Մինիմալ + Планшет + Ժամանակակից 1 + Ժամանակակից 2 + Ժամանակակից 3 + Ժամանակակից 4 + Անջատել կլորացված անկյունները + Անկյունները քառակուսի են + Անկյունները կլորացված են + Աктиվացնել կրկնակի սեղմելը և մատների շարժումը չափը փոխելու համար + "Երկու անգամ սեղմելու գործողությունը և չափսի փոփոխման համար սեղմելը միացված են • Երկու անգամ սեղմել՝ մեծացնելու mini-player-ի չափսը • Երկու անգամ սեղմել կրկին՝ վերականգնելու սկզբնական չափսը" - Կրկնակի սեղմելու գործողությունը և մատների շարժումը չափը փոխելու համար անջատված են - Անջատել քաշել և գցելը - Քարշել և թողնել անջատված է - "Գրավել և թողնելը միացված է + Կրկնակի սեղմելու գործողությունը և մատների շարժումը չափը փոխելու համար անջատված են + Անջատել քաշել և գցելը + Քարշել և թողնել անջատված է + "Գրավել և թողնելը միացված է Mini-player-ը կարող է գրավվել էկրանի ցանկացած անկյուն։" - Անջատել հորիզոնական քաշելու ժեստը - Հորիզոնական քարշելու ժեստը անջատված է - "Հորիզոնական գրավելու ժեստը միացված է + Անջատել հորիզոնական քաշելու ժեստը + Հորիզոնական քարշելու ժեստը անջատված է + "Հորիզոնական գրավելու ժեստը միացված է Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի ձախ կամ աջ։" - Թաքցնել վերադիր կոճակները - Վերադիր կոճակները թաքցված են - Վերադիր կոճակները ցուցադրվում են - Թաքցնել ենթատեքստերը - Ենթատեքստերը թաքցված են - Ենթատեքստերը ցուցադրվում են - Թաքցնել առաջ և հետ վերադառնալու կոճակները - Առաջ և հետ վերադառնալու կոճակները թաքցված են - Առաջ և հետ վերադառնալու կոճակները ցուցադրվում են - Սկզբնական չափը - Էկրանի վրա սկզբնական չափը, պիքսելներով - Պիքսելի չափը պետք է լինի %1$s-ի և %2$s-ի միջև - Գերդրման թափանցիկություն - Թափանցիկության արժեքը 0-100 միջև, որտեղ 0-ը թափանցիկ է - Miniplayer-ի գերդրման թափանցիկությունը պետք է լինի 0-100 միջև - - - Աктиվացնել գրադիենտի բեռնման էկրանը - Բեռնման էկրանը կունենա գրադիենտի ֆոն - Բեռնման էկրանը կունենա մեկ գույնի ֆոն - Մեկնարկային էկրանի ոճը - Գույն - Սև և սպիտակ - Աктиվացնել հարմարեցված seekbar-ի գույնը - Հարմարեցված seekbar-ի գույնը ցուցադրվում է - Սկզբնական seekbar-ի գույնը ցուցադրվում է - Մարզումից դուրս ողորկության գույն - Մարզումից դուրս ողորկության գույնը - Նշման գույնի ընտրում - Մարզումից դուրս ողորկության նշման գույնը - Սխալ seekbar-ի գույնի արժեք - - - YT - - - Գլխագրի լոգո - Լռակյաց - Սովորական - - ReVanced մինիմալ - Անհատական - - - Անտեսել պատկերի տարածաշրջանի սահմանափակումները - Օգտագործելով yt4.ggpht.com պատկերային հոսքը - "Օգտագործվում է սկզբնական պատկերների հոսքը + Թաքցնել վերադիր կոճակները + Վերադիր կոճակները թաքցված են + Վերադիր կոճակները ցուցադրվում են + Թաքցնել ենթատեքստերը + Ենթատեքստերը թաքցված են + Ենթատեքստերը ցուցադրվում են + Թաքցնել առաջ և հետ վերադառնալու կոճակները + Առաջ և հետ վերադառնալու կոճակները թաքցված են + Առաջ և հետ վերադառնալու կոճակները ցուցադրվում են + Սկզբնական չափը + Էկրանի վրա սկզբնական չափը, պիքսելներով + Պիքսելի չափը պետք է լինի %1$s-ի և %2$s-ի միջև + Գերդրման թափանցիկություն + Թափանցիկության արժեքը 0-100 միջև, որտեղ 0-ը թափանցիկ է + Miniplayer-ի գերդրման թափանցիկությունը պետք է լինի 0-100 միջև + + + Աктиվացնել գրադիենտի բեռնման էկրանը + Բեռնման էկրանը կունենա գրադիենտի ֆոն + Բեռնման էկրանը կունենա մեկ գույնի ֆոն + Մեկնարկային էկրանի ոճը + Գույն + Սև և սպիտակ + Աктиվացնել հարմարեցված seekbar-ի գույնը + Հարմարեցված seekbar-ի գույնը ցուցադրվում է + Սկզբնական seekbar-ի գույնը ցուցադրվում է + Մարզումից դուրս ողորկության գույն + Մարզումից դուրս ողորկության գույնը + Նշման գույնի ընտրում + Մարզումից դուրս ողորկության նշման գույնը + Սխալ seekbar-ի գույնի արժեք + + + YT + + + Գլխագրի լոգո + Լռակյաց + Սովորական + + ReVanced մինիմալ + Անհատական + + + Անտեսել պատկերի տարածաշրջանի սահմանափակումները + Օգտագործելով yt4.ggpht.com պատկերային հոսքը + "Օգտագործվում է սկզբնական պատկերների հոսքը Այս կարգավորման միացումը կարող է լուծել որոշ տարածաշրջաններում կասեցված պատկերների խնդիրը։" - - - - Գլխավոր ներդիր - - Բաժանորդագրություններ ներդիրը - - Դուք ներդիր - Նվագարկչի երգացանկեր & առաջարկություններ - Որոնման արդյունքներ - Սկզբնական էскизներ - DeArrow & Սկզբնական էскизներ - DeArrow & Ֆիքսված լուսանկարներ - Ֆիքսված լուսանկարներ - "DeArrow-ը YouTube-ի տեսանյութերի համար մատուցում է ամբոխային thumbnails-ներ։ Այս thumbnails-ները հաճախ ավելի համապատասխան են, քան YouTube-ի կողմից մատուցվողները։ + + + + Գլխավոր ներդիր + + Բաժանորդագրություններ ներդիրը + + Դուք ներդիր + Նվագարկչի երգացանկեր & առաջարկություններ + Որոնման արդյունքներ + Սկզբնական էскизներ + DeArrow & Սկզբնական էскизներ + DeArrow & Ֆիքսված լուսանկարներ + Ֆիքսված լուսանկարներ + "DeArrow-ը YouTube-ի տեսանյութերի համար մատուցում է ամբոխային thumbnails-ներ։ Այս thumbnails-ները հաճախ ավելի համապատասխան են, քան YouTube-ի կողմից մատուցվողները։ Եթե միացված է, տեսանյութի URL-ները կուղարկվեն API սերվերին, և այլ տվյալներ չեն ուղարկվում։ Եթե տեսանյութը չունի DeArrow thumbnails-ներ, ապա ցուցադրվում են սկզբնական կամ ֆիքսված կադրերը։ Սեղմեք այստեղ՝ ավելին իմանալու DeArrow-ի մասին։" - Ցուցադրել \"toast\", եթե API-ն հասանելի չէ - \"Toast\"-ը ցուցադրվում է, եթե DeArrow-ը հասանելի չէ - \"Toast\"-ը չի ցուցադրվում, եթե DeArrow-ը հասանելի չէ - DeArrow API-ի վերջնակետ - DeArrow մանրապատկերների պահոցի վերջնակետի URL-ը - Կանգնած տեսանյութերի կադրեր - Կանգնած կադրերը վերցվում են յուրաքանչյուր տեսանյութի սկզբից, կենտրոնից կամ վերջից: Այս պատկերները ներկառուցված են YouTube-ում և արտաքին API չի օգտագործվում - Օգտագործել արագ կանգնած կադրեր - Օգտագործելով միջին որակի նկարահանումներ: Մանրապատկերներն ավելի արագ կբեռնվեն, սակայն ուղիղ հեռարձակումները, չհրապարակված կամ շատ հին տեսանյութերը կարող են ցույց տալ դատարկ մանրապատկերներ - Օգտագործել բարձր որակի կանգնած կադրեր - Տեսանյութի ժամանակը, որից կանգնած կադրերը պետք է վերցվեն - Տեսանյութի սկիզբը - Տեսանյութի կենտրոնը - Տեսանյութի վերջը - - DeArrow-ը ժամանակավորապես հասանելի չէ (կարգավիճակի կոդը՝ %s) - DeArrow-ը ժամանակավորապես հասանելի չէ - - - Ցուցադրել ReVanced հայտարարությունները - Գործարկման մասին հայտարարությունները ցուցադրվում են - Գործարկման մասին հայտարարությունները չեն ցուցադրվում - Ցուցադրել հայտարարությունները մեկնարկի ժամանակ - Հայտարարությունների մատակարարի հետ կապի անհաջողություն - Մերժել - - - Միացնել տեսանյութի կրկնությունը - Տեսանյութը կկրկնվի - Տեսանյութը չի կրկնվի - - - Ցուցադրել տեսանյութի կրկնության կոճակը - Կոճակը ցուցադրված է - Կոճակը ցուցադրված չէ - Տեսանյութի կրկնությունը միացված է - Տեսանյութի կրկնությունը անջատված է - - - - - Հեռախոսի չափերը հնարավոր է փոփոխել - "Սարքի չափերը կեղծվում են + Ցուցադրել \"toast\", եթե API-ն հասանելի չէ + \"Toast\"-ը ցուցադրվում է, եթե DeArrow-ը հասանելի չէ + \"Toast\"-ը չի ցուցադրվում, եթե DeArrow-ը հասանելի չէ + DeArrow API-ի վերջնակետ + DeArrow մանրապատկերների պահոցի վերջնակետի URL-ը + Կանգնած տեսանյութերի կադրեր + Կանգնած կադրերը վերցվում են յուրաքանչյուր տեսանյութի սկզբից, կենտրոնից կամ վերջից: Այս պատկերները ներկառուցված են YouTube-ում և արտաքին API չի օգտագործվում + Օգտագործել արագ կանգնած կադրեր + Օգտագործելով միջին որակի նկարահանումներ: Մանրապատկերներն ավելի արագ կբեռնվեն, սակայն ուղիղ հեռարձակումները, չհրապարակված կամ շատ հին տեսանյութերը կարող են ցույց տալ դատարկ մանրապատկերներ + Օգտագործել բարձր որակի կանգնած կադրեր + Տեսանյութի ժամանակը, որից կանգնած կադրերը պետք է վերցվեն + Տեսանյութի սկիզբը + Տեսանյութի կենտրոնը + Տեսանյութի վերջը + + DeArrow-ը ժամանակավորապես հասանելի չէ (կարգավիճակի կոդը՝ %s) + DeArrow-ը ժամանակավորապես հասանելի չէ + + + Ցուցադրել ReVanced հայտարարությունները + Գործարկման մասին հայտարարությունները ցուցադրվում են + Գործարկման մասին հայտարարությունները չեն ցուցադրվում + Ցուցադրել հայտարարությունները մեկնարկի ժամանակ + Հայտարարությունների մատակարարի հետ կապի անհաջողություն + Մերժել + + + Միացնել տեսանյութի կրկնությունը + Տեսանյութը կկրկնվի + Տեսանյութը չի կրկնվի + + + Ցուցադրել տեսանյութի կրկնության կոճակը + Կոճակը ցուցադրված է + Կոճակը ցուցադրված չէ + Տեսանյութի կրկնությունը միացված է + Տեսանյութի կրկնությունը անջատված է + + + + Հեռախոսի չափերը հնարավոր է փոփոխել + "Սարքի չափերը կեղծվում են Կարող է բացվել տեսանյութի ավելի բարձր որակ, բայց կարող է առաջանալ տեսանյութի վերարտադրության կտրուկ մեծացում, վատ մարտկոցի կյանք և անհայտ կողմնակի ազդեցություններ։" - "Սարքի չափերը չեն կեղծվում + "Սարքի չափերը չեն կեղծվում Այս կարգավորման միացումը կարող է բացել տեսանյութի ավելի բարձր որակ։" - Այս ընտրության ակտիվացումը կարող է առաջացնել տեսանյութի վերարտադրման հետ կապված պրոբլեմների, ավելի վատ մարտկոցի վերջնական համարձակության և անհայտ կողմնակի ազդեցությունների - - - Հպումային արձագանք - Փոխել հպումային արձագանքը - Անջատել գլուխների հպումները - Գլուխների հպումներն անջատված են - Գլուխների հպումները միացված են - Անջատել ճշգրիտ փնտրման հպումները - Ճշգրիտ որոնման հպումն անջատված է - Ճշգրիտ փնտրման հպումները միացված են - Անջատել հետարկել որոնման հպումը - Հետարկել որոնման հպումն անջատված է - Հետարկել որոնման հպումը միացված է - Զուումի հպումների ակտիվացումը անջատել - Զուումի հպումն անջատված է - Զուումի հպումը միացված է - - - Եթե վերջերս փոխել եք ձեր հաշվի մուտքի տվյալները, ապա ջնջեք և նորից տեղադրեք MicroG-ն: - - - URL-ի վերահղումների հնարավորությունը անջատել - URL-ի վերահղումները անջատված են - URL-ի վերահղումները անջատված չեն - - - Բրաուզերում հղումներ բացել - Բացել հղումները արտաքին բրաուզերում - Բացել հղումները ներծրագրային բրաուզերում - - - - Ավտո - Հիշել տեսանյութի որակի փոփոխությունները - Որակի փոփոխությունները կիրառվում են բոլոր տեսանյութերի համար - Որակի փոփոխությունները կիրառվում են միայն ներկայիս տեսանյութի համար - Ցուցադրել ծանուցում տեսանյութի որակի փոփոխության ժամանակ - Ծանուցում է ցուցադրվում, երբ փոխվում է լռելյայն տեսանյութի որակը - Ծանուցում չի ցուցադրվում, երբ փոխվում է լռելյայն տեսանյութի որակը - Wi-Fi ցանցի դեֆոլտ տեսանյութի որակը - Մೊբայլ ցանցի դեֆոլտ տեսանյութի որակը - Հիշել Shorts-ի որակի փոփոխությունները - Որակի փոփոխություններն ազդում են բոլոր Shorts-ի վրա - Որակի փոփոխություններն ազդում են միայն ընթացիկ Short-ի վրա - Shorts-ի լռելյայն որակը Wi-Fi ցանցում - Shorts-ի լռելյայն որակը բջջային ցանցում - վարկանիշ - ուայ-ֆայ - Փոփոխվել է դեֆոլտ %1$s որակը: %2$s - Փոխվել է Shorts %1$s-ի որակը հետևյալի վրա. %2$s - - - Ցուցադրել արագության դիալոգի պատուհանի կոճակը - Արագության երկխոսության կոճակը ցուցադրված է։ Հպեք և պահեք՝ նվագարկման արագությունը լռելյայնին վերականգնելու համար - Արագության երկխոսության կոճակը չի ցուցադրվում - - - Ցուցադրել տեսանյութի որակի կոճակը - Տեսանյութի որակի կոճակը ցուցադրված է։ Հպեք և պահեք՝ որակը լռելյայնին վերականգնելու համար - Տեսանյութի որակի կոճակը չի ցուցադրվում - - - Տեսանյութի արագության հարմարեցված մենյու - Հարմարեցված արագության մենյուը ցուցադրվում է - Հարմարեցված արագության մենյուը չի ցուցադրվում - Վերականգնել հին նվագարկման արագության ընտրացանկը - Ցուցադրվում է հին արագության ընտրացանկը - Ցուցադրվում է ժամանակակից արագության ընտրացանկը - Տեսանյութի վերարտադրման հարմարեցված արագություններ - Ավելացնել կամ փոփոխել տեսանյութի վերարտադրման հարմարեցված արագությունները - Պատրաստված արագությունները պետք է լինեն ավելի քիչ քան %s - Չի աշխատում պատրաստված վերարտադրման արագությունները։ - Ավտո - Զգայական վերահսկում՝ անվանափոխման համար - Վերարտադրման արագությունը 0-8 միջակայքում - - - Հիշել տեսանյութի վերարտադրման արագության փոփոխությունները - Վերարտադրման արագության փոփոխությունները կիրառվում են բոլոր տեսանյութերի համար - Վերարտադրման արագության փոփոխությունները կիրառվում են միայն ներկայիս տեսանյութի համար - Ցուցադրել ծանուցում նվագարկման արագության փոփոխությունների ժամանակ - Ծանուցում է ցուցադրվում, երբ փոխվում է լռելյայն նվագարկման արագությունը - Ծանուցումը չի ցուցադրվում, երբ փոխվում է լռելյայն նվագարկման արագությունը - Տեսանյութի վերարտադրման դեֆոլտ արագությունը - Փոփոխվել է դեֆոլտ արագությունը: %s - - - HDR տեսանյութը անջատված է - HDR տեսանյութը անջատված է - HDR տեսանյութը միացված է - Պարտադրել AVC (H.264) - Տեսակոդեկը պարտադրված է AVC-ի (H.264) - Տեսակոդեկն ավտոմատաբար որոշվում է - "Առավելությունները. + Այս ընտրության ակտիվացումը կարող է առաջացնել տեսանյութի վերարտադրման հետ կապված պրոբլեմների, ավելի վատ մարտկոցի վերջնական համարձակության և անհայտ կողմնակի ազդեցությունների + + + Հպումային արձագանք + Փոխել հպումային արձագանքը + Անջատել գլուխների հպումները + Գլուխների հպումներն անջատված են + Գլուխների հպումները միացված են + Անջատել ճշգրիտ փնտրման հպումները + Ճշգրիտ որոնման հպումն անջատված է + Ճշգրիտ փնտրման հպումները միացված են + Անջատել հետարկել որոնման հպումը + Հետարկել որոնման հպումն անջատված է + Հետարկել որոնման հպումը միացված է + Զուումի հպումների ակտիվացումը անջատել + Զուումի հպումն անջատված է + Զուումի հպումը միացված է + + + Եթե վերջերս փոխել եք ձեր հաշվի մուտքի տվյալները, ապա ջնջեք և նորից տեղադրեք MicroG-ն: + + + URL-ի վերահղումների հնարավորությունը անջատել + URL-ի վերահղումները անջատված են + URL-ի վերահղումները անջատված չեն + + + Բրաուզերում հղումներ բացել + Բացել հղումները արտաքին բրաուզերում + Բացել հղումները ներծրագրային բրաուզերում + + + + Ավտո + Հիշել տեսանյութի որակի փոփոխությունները + Որակի փոփոխությունները կիրառվում են բոլոր տեսանյութերի համար + Որակի փոփոխությունները կիրառվում են միայն ներկայիս տեսանյութի համար + Ցուցադրել ծանուցում տեսանյութի որակի փոփոխության ժամանակ + Ծանուցում է ցուցադրվում, երբ փոխվում է լռելյայն տեսանյութի որակը + Ծանուցում չի ցուցադրվում, երբ փոխվում է լռելյայն տեսանյութի որակը + Wi-Fi ցանցի դեֆոլտ տեսանյութի որակը + Մೊբայլ ցանցի դեֆոլտ տեսանյութի որակը + Հիշել Shorts-ի որակի փոփոխությունները + Որակի փոփոխություններն ազդում են բոլոր Shorts-ի վրա + Որակի փոփոխություններն ազդում են միայն ընթացիկ Short-ի վրա + Shorts-ի լռելյայն որակը Wi-Fi ցանցում + Shorts-ի լռելյայն որակը բջջային ցանցում + վարկանիշ + ուայ-ֆայ + Փոփոխվել է դեֆոլտ %1$s որակը: %2$s + Փոխվել է Shorts %1$s-ի որակը հետևյալի վրա. %2$s + + + Ցուցադրել արագության դիալոգի պատուհանի կոճակը + Արագության երկխոսության կոճակը ցուցադրված է։ Հպեք և պահեք՝ նվագարկման արագությունը լռելյայնին վերականգնելու համար + Արագության երկխոսության կոճակը չի ցուցադրվում + + + Ցուցադրել տեսանյութի որակի կոճակը + Տեսանյութի որակի կոճակը ցուցադրված է։ Հպեք և պահեք՝ որակը լռելյայնին վերականգնելու համար + Տեսանյութի որակի կոճակը չի ցուցադրվում + + + Տեսանյութի արագության հարմարեցված մենյու + Հարմարեցված արագության մենյուը ցուցադրվում է + Հարմարեցված արագության մենյուը չի ցուցադրվում + Վերականգնել հին նվագարկման արագության ընտրացանկը + Ցուցադրվում է հին արագության ընտրացանկը + Ցուցադրվում է ժամանակակից արագության ընտրացանկը + Տեսանյութի վերարտադրման հարմարեցված արագություններ + Ավելացնել կամ փոփոխել տեսանյութի վերարտադրման հարմարեցված արագությունները + Պատրաստված արագությունները պետք է լինեն ավելի քիչ քան %s + Չի աշխատում պատրաստված վերարտադրման արագությունները։ + Ավտո + Զգայական վերահսկում՝ անվանափոխման համար + Վերարտադրման արագությունը 0-8 միջակայքում + + + Հիշել տեսանյութի վերարտադրման արագության փոփոխությունները + Վերարտադրման արագության փոփոխությունները կիրառվում են բոլոր տեսանյութերի համար + Վերարտադրման արագության փոփոխությունները կիրառվում են միայն ներկայիս տեսանյութի համար + Ցուցադրել ծանուցում նվագարկման արագության փոփոխությունների ժամանակ + Ծանուցում է ցուցադրվում, երբ փոխվում է լռելյայն նվագարկման արագությունը + Ծանուցումը չի ցուցադրվում, երբ փոխվում է լռելյայն նվագարկման արագությունը + Տեսանյութի վերարտադրման դեֆոլտ արագությունը + Փոփոխվել է դեֆոլտ արագությունը: %s + + + HDR տեսանյութը անջատված է + HDR տեսանյութը անջատված է + HDR տեսանյութը միացված է + Պարտադրել AVC (H.264) + Տեսակոդեկը պարտադրված է AVC-ի (H.264) + Տեսակոդեկն ավտոմատաբար որոշվում է + "Առավելությունները. • Կարող է բարելավել մարտկոցի կյանքը • Կարող է վերականգնել բացակայող տեսանյութի լուծաչափերը հին սարքերում @@ -1648,179 +1646,178 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի • Տեսանյութի նվագարկումը կօգտագործի ավելի շատ ինտերնետ տվյալներ, քան VP9 կամ AV1-ը • HDR տեսանյութերը չեն օգտագործի AVC • Որոշ սարքեր չեն կարող պարտադրել AVC-ն" - - - Ցուցադրել տեսանյութի որակի ընդլայնված մենյուն - Տեսանյութի որակի ընդլայնված մենյուն ցուցադրվում է - Տեսանյութի որակի ընդլայնված մենյուն չի ցուցադրվում - - - Ակտիվացնել սահելը համար ընտրելու - Սահելը համար ընտրելը ակտիվացված է - Սահելը համար ընտրելը անջատված է - - - Թույլատրել Android VR AV1 - "Տեսակոդեկը AVC (H.264), VP9 կամ AV1 է + + + Ցուցադրել տեսանյութի որակի ընդլայնված մենյուն + Տեսանյութի որակի ընդլայնված մենյուն ցուցադրվում է + Տեսանյութի որակի ընդլայնված մենյուն չի ցուցադրվում + + + Ակտիվացնել սահելը համար ընտրելու + Սահելը համար ընտրելը ակտիվացված է + Սահելը համար ընտրելը անջատված է + + + Թույլատրել Android VR AV1 + "Տեսակոդեկը AVC (H.264), VP9 կամ AV1 է Նվագարկումը կարող է կանգ առնել կամ կորցնել կադրեր" - Տեսակոդեկը AVC (H.264) կամ VP9 է - "Այս կարգավորումը միացնելը կարող է օգտագործել AV1 ծրագրային ապակոդավորում: + Տեսակոդեկը AVC (H.264) կամ VP9 է + "Այս կարգավորումը միացնելը կարող է օգտագործել AV1 ծրագրային ապակոդավորում: AV1-ով տեսանյութի նվագարկումը կարող է ընդհատվել կամ կորցնել կադրեր:" - Կեղծելու կողմնակի ազդեցություններ - • Փորձնական հաճախորդ է և կարող է ցանկացած պահի դադարել աշխատել - • Տեսանյութը կարող է դադարել 1:00-ին կամ հասանելի չլինել որոշ տարածաշրջաններում - • Ձայնային ուղու մենյուն բացակայում է - • Հեռացված բոլոր AV1 վիդեո կոդեկները - • Կայուն ձայնի մակարդակը հասանելի չէ - Երեխաների տեսանյութերը կարող են չհամապատասխանել հետևյալ պահանջներին՝ եթե արտոնագրման խախտումներ կան։ - - • Բնօրինակ ձայնի պարտադրումը հասանելի չէ - Ցուցադրել վիճակագրության ակնոցներում - Հաճախորդի տեսակը ցուցադրվում է վիճակագրության ակնոցներում - Հաճախորդը թաքնված է վիճակագրության ակնոցներում - - - - - - - Մասին - Գովազդներ - Ընդհանուր - Նվագարկիչ - Տարբեր - - - Թաքցնել տեսագովազդները - Տեսագովազդները թաքցված են - Տեսագովազդները ցուցադրվում են - - - Միացնել մշտական կրկնություն - Մշտական կրկնությունը միացված է - Մշտական կրկնությունը անջատված է - - - Թաքցնել հեռարձակման կոճակը - Հեռարձակման կոճակը թաքնված է - Հեռարձակման կոճակը ցուցադրված է - Թաքցնել պատմության կոճակը - Պատմության կոճակը թաքցված է - Պատմության կոճակը ցուցադրված է - Թաքցնել ծանուցման կոճակը - Ծանուցման կոճակը թաքցված է - Ծանուցման կոճակը ցուցադրվում է - Թաքցնել որոնման կոճակը - Որոնման կոճակը թաքցված է - Որոնման կոճակը ցուցադրվում է - - - Թաքցնել կատեգորիաների վահանակը - Կատեգորիաների վահանակը թաքցված է - Կատեգորիաների վահանակը ցուցադրվում է - - - Փոխել մինի նվագարկչի գույնը - Մինի նվագարկչի գույնը համապատասխանում է լիաէկրան նվագարկչին - Մինի նվագարկիչը օգտագործում է լռելյայն գույնը - - - Նավիգացիոն գիծ - Թաքցնել կամ փոխել նավիգացիոն գծի կոճակները - - Թաքցնել Գլխավորը - «Գլխավոր» կոճակը թաքնված է - «Գլխավոր» կոճակը ցուցադրված է - - Թաքցնել Նմուշները - «Նմուշներ» կոճակը թաքնված է - «Նմուշներ» կոճակը ցուցադրված է - - Թաքցնել Ուսումնասիրելը - «Բացահայտել» կոճակը թաքնված է - «Բացահայտել» կոճակը ցուցադրված է - - Թաքցնել Գրադարանը - «Գրադարան» կոճակը թաքնված է - «Գրադարան» կոճակը ցուցադրված է - - Թաքցնել Թարմացումը - «Արդիականացնել» կոճակը թաքնված է - «Արդիականացնել» կոճակը ցուցադրված է - Թաքցնել նավիգացիոն գիծը - Նավիգացիոն գիծը թաքնված է - Նավիգացիոն գիծը ցուցադրված է - Թաքցնել նավիգացիոն կոճակների պիտակները - Պիտակները թաքնված են - Պիտակները ցուցադրված են - - - Թաքցնել «Ստացեք Music Premium» պիտակը - Պիտակը թաքցված է - Պիտակը ցուցադրվում է - - - Թաքցնել թարմացման կոճակը - Կոճակը թաքցված է - Կոճակը ցուցադրվում է - - - - - Բլոկել ձայնային գովազդները - Ձայնային գովազդները բլոկավորված են - Ձայնային գովազդները բլոկավորված չեն - - - %s հասանելի չէ, կարող է ցուցադրվել գովազդ։ Փորձեք փոխել գովազդների կասեցման ծառայությունը կարգավորումներում։ - %s-ը սխալ է վերադարձել, կարող է ցուցադրվել գովազդ։ Փորձեք փոխել գովազդների կասեցման ծառայությունը կարգավորումներում։ - Բլոկել ներդրված տեսահոլովակների գովազդները - Անջատված է - Luminous պրոքսի - PurpleAdBlock պրոքսի - - - Բլոկել տեսահոլովակների գովազդները - Տեսահոլովակների գովազդները բլոկավորված են - Տեսահոլովակների գովազդները բլոկավորված չեն - - - Հաղորդագրությունը ջնջված է - Ցուցադրել հեռացված հաղորդագրությունները - Մի ցուցադրել հեռացված հաղորդագրությունները - Թաքցնել ջնջված հաղորդագրությունները սպոիլերով - Ցուցադրել ջնջված հաղորդագրությունները, ինչպես խաչված տեքստ - - - Ավտոմատ կերպով ստանալ ալիքի կետեր - Ալիքի կետերը ստացվում են ավտոմատ կերպով - Ալիքի կետերը ստացվում են ավտոմատ կերպով - - - - Աктиվացնել Twitch-ի լրացուցիչ ռեժիմը - Twitch-ի լրացուցիչ ռեժիմը գործարկված է (չի խորհուրդ տրվում) - Twitch-ի լրացուցիչ ռեժիմը անջատված է - - - ReVanced կարգավորումներ - Ծրագրի մասին - ReVanced-ի մասին - Գովազդի արգելափակում - Գովազդի արգելափակման կարգավորումներ - Չատ - Չատի կարգավորումներ - Տարբեր - Այլ կարգավորումներ - Ընդհանուր կարգավորումներ - Այլ կարգավորումներ - Քլայենթի կողմից գովազդներ - Սերվերի կողմից surestream գովազդներ - Վրիպման օրագիր - Վրիպման օրագիրը միացվել է - Վրիպման օրագիրը անջատվել է - - + Կեղծելու կողմնակի ազդեցություններ + • Փորձնական հաճախորդ է և կարող է ցանկացած պահի դադարել աշխատել + • Տեսանյութը կարող է դադարել 1:00-ին կամ հասանելի չլինել որոշ տարածաշրջաններում + • Ձայնային ուղու մենյուն բացակայում է + • Հեռացված բոլոր AV1 վիդեո կոդեկները + • Կայուն ձայնի մակարդակը հասանելի չէ + Երեխաների տեսանյութերը կարող են չհամապատասխանել հետևյալ պահանջներին՝ եթե արտոնագրման խախտումներ կան։ + + • Բնօրինակ ձայնի պարտադրումը հասանելի չէ + Ցուցադրել վիճակագրության ակնոցներում + Հաճախորդի տեսակը ցուցադրվում է վիճակագրության ակնոցներում + Հաճախորդը թաքնված է վիճակագրության ակնոցներում + + + + + + Մասին + Գովազդներ + Ընդհանուր + Նվագարկիչ + Տարբեր + + + Թաքցնել տեսագովազդները + Տեսագովազդները թաքցված են + Տեսագովազդները ցուցադրվում են + + + Միացնել մշտական կրկնություն + Մշտական կրկնությունը միացված է + Մշտական կրկնությունը անջատված է + + + Թաքցնել հեռարձակման կոճակը + Հեռարձակման կոճակը թաքնված է + Հեռարձակման կոճակը ցուցադրված է + Թաքցնել պատմության կոճակը + Պատմության կոճակը թաքցված է + Պատմության կոճակը ցուցադրված է + Թաքցնել ծանուցման կոճակը + Ծանուցման կոճակը թաքցված է + Ծանուցման կոճակը ցուցադրվում է + Թաքցնել որոնման կոճակը + Որոնման կոճակը թաքցված է + Որոնման կոճակը ցուցադրվում է + + + Թաքցնել կատեգորիաների վահանակը + Կատեգորիաների վահանակը թաքցված է + Կատեգորիաների վահանակը ցուցադրվում է + + + Փոխել մինի նվագարկչի գույնը + Մինի նվագարկչի գույնը համապատասխանում է լիաէկրան նվագարկչին + Մինի նվագարկիչը օգտագործում է լռելյայն գույնը + + + Նավիգացիոն գիծ + Թաքցնել կամ փոխել նավիգացիոն գծի կոճակները + + Թաքցնել Գլխավորը + «Գլխավոր» կոճակը թաքնված է + «Գլխավոր» կոճակը ցուցադրված է + + Թաքցնել Նմուշները + «Նմուշներ» կոճակը թաքնված է + «Նմուշներ» կոճակը ցուցադրված է + + Թաքցնել Ուսումնասիրելը + «Բացահայտել» կոճակը թաքնված է + «Բացահայտել» կոճակը ցուցադրված է + + Թաքցնել Գրադարանը + «Գրադարան» կոճակը թաքնված է + «Գրադարան» կոճակը ցուցադրված է + + Թաքցնել Թարմացումը + «Արդիականացնել» կոճակը թաքնված է + «Արդիականացնել» կոճակը ցուցադրված է + Թաքցնել նավիգացիոն գիծը + Նավիգացիոն գիծը թաքնված է + Նավիգացիոն գիծը ցուցադրված է + Թաքցնել նավիգացիոն կոճակների պիտակները + Պիտակները թաքնված են + Պիտակները ցուցադրված են + + + Թաքցնել «Ստացեք Music Premium» պիտակը + Պիտակը թաքցված է + Պիտակը ցուցադրվում է + + + Թաքցնել թարմացման կոճակը + Կոճակը թաքցված է + Կոճակը ցուցադրվում է + + + + + Բլոկել ձայնային գովազդները + Ձայնային գովազդները բլոկավորված են + Ձայնային գովազդները բլոկավորված չեն + + + %s հասանելի չէ, կարող է ցուցադրվել գովազդ։ Փորձեք փոխել գովազդների կասեցման ծառայությունը կարգավորումներում։ + %s-ը սխալ է վերադարձել, կարող է ցուցադրվել գովազդ։ Փորձեք փոխել գովազդների կասեցման ծառայությունը կարգավորումներում։ + Բլոկել ներդրված տեսահոլովակների գովազդները + Անջատված է + Luminous պրոքսի + PurpleAdBlock պրոքսի + + + Բլոկել տեսահոլովակների գովազդները + Տեսահոլովակների գովազդները բլոկավորված են + Տեսահոլովակների գովազդները բլոկավորված չեն + + + Հաղորդագրությունը ջնջված է + Ցուցադրել հեռացված հաղորդագրությունները + Մի ցուցադրել հեռացված հաղորդագրությունները + Թաքցնել ջնջված հաղորդագրությունները սպոիլերով + Ցուցադրել ջնջված հաղորդագրությունները, ինչպես խաչված տեքստ + + + Ավտոմատ կերպով ստանալ ալիքի կետեր + Ալիքի կետերը ստացվում են ավտոմատ կերպով + Ալիքի կետերը ստացվում են ավտոմատ կերպով + + + + Աктиվացնել Twitch-ի լրացուցիչ ռեժիմը + Twitch-ի լրացուցիչ ռեժիմը գործարկված է (չի խորհուրդ տրվում) + Twitch-ի լրացուցիչ ռեժիմը անջատված է + + + ReVanced կարգավորումներ + Ծրագրի մասին + ReVanced-ի մասին + Գովազդի արգելափակում + Գովազդի արգելափակման կարգավորումներ + Չատ + Չատի կարգավորումներ + Տարբեր + Այլ կարգավորումներ + Ընդհանուր կարգավորումներ + Այլ կարգավորումներ + Քլայենթի կողմից գովազդներ + Սերվերի կողմից surestream գովազդներ + Վրիպման օրագիր + Վրիպման օրագիրը միացվել է + Վրիպման օրագիրը անջատվել է + + diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 841f2a508f..3fac2ca961 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -17,1272 +17,1271 @@ "First 'item' text Second \"item\" text" ---> - - - - Nama aplikasi - - Khusus - Ikon aplikasi - Asli - ReVanced - - ReVanced minimal - ReVanced berskala - - Khusus - - - Pemeriksaan gagal - Buka situs resmi - Abaikan - <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. - Ditambal pada perangkat yang berbeda - Tidak terpasang oleh ReVanced Manager - Ditambal lebih dari 10 menit yang lalu - Ditambal %s hari yang lalu - Tanggal pembuatan APK rusak - - - Pemberitahuan ReVanced - Riwayat tontonan Anda tidak sedang disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. - Jangan tampilkan lagi - - - Pengaturan - ReVanced - Apakah Anda yakin ingin melanjutkan? - Simpan - Setel ulang - Setel ulang warna - Warna tidak sah - Memerlukan mulai ulang - Mulai ulang aplikasi agar perubahan ini dapat diterapkan. - Mulai ulang - Impor - Salin - Pengaturan ReVanced diatur ke bawaan - %d Setelan terimpor - Impor gagal: %s - Pengaturan pencarian - Tidak ada hasil yang ditemukan untuk \'%s\' - Coba kata kunci lain - Pencarian terbaru - Hapus dari riwayat pencarian? - Hapus riwayat pencarian - Apakah Anda yakin ingin menghapus semua riwayat pencarian? - Tips Pencarian - "• Ketuk jalur untuk menelusuri ke jalur tersebut +--> + + + Nama aplikasi + + Khusus + Ikon aplikasi + Asli + ReVanced + + ReVanced minimal + ReVanced berskala + + Khusus + + + Pemeriksaan gagal + Buka situs resmi + Abaikan + <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. + Ditambal pada perangkat yang berbeda + Tidak terpasang oleh ReVanced Manager + Ditambal lebih dari 10 menit yang lalu + Ditambal %s hari yang lalu + Tanggal pembuatan APK rusak + + + Pemberitahuan ReVanced + Riwayat tontonan Anda tidak sedang disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. + Jangan tampilkan lagi + + + Pengaturan + ReVanced + Apakah Anda yakin ingin melanjutkan? + Simpan + Setel ulang + Setel ulang warna + Warna tidak sah + Memerlukan mulai ulang + Mulai ulang aplikasi agar perubahan ini dapat diterapkan. + Mulai ulang + Impor + Salin + Pengaturan ReVanced diatur ke bawaan + %d Setelan terimpor + Impor gagal: %s + Pengaturan pencarian + Tidak ada hasil yang ditemukan untuk \'%s\' + Coba kata kunci lain + Pencarian terbaru + Hapus dari riwayat pencarian? + Hapus riwayat pencarian + Apakah Anda yakin ingin menghapus semua riwayat pencarian? + Tips Pencarian + "• Ketuk jalur untuk menelusuri ke jalur tersebut • Tekan lama pada pengaturan untuk menelusuri ke jalur tersebut • Tekan Enter untuk menyimpan kueri pencarian ke riwayat • Pencarian mengabaikan huruf besar/kecil dan tanda baca • Pengaturan utama muncul di atas pengaturan sampingan yang dinonaktifkan" - Riwayat pencarian kosong - Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter - Tampilkan riwayat pencarian setelan - Riwayat pencarian setelan ditampilkan - Riwayat pencarian setelan tidak ditampilkan - Tampilkan ikon pengaturan ReVanced - Ikon pengaturan ditampilkan - Ikon pengaturan tidak ditampilkan - Bahasa ReVanced - "Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap. + Riwayat pencarian kosong + Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter + Tampilkan riwayat pencarian setelan + Riwayat pencarian setelan ditampilkan + Riwayat pencarian setelan tidak ditampilkan + Tampilkan ikon pengaturan ReVanced + Ikon pengaturan ditampilkan + Ikon pengaturan tidak ditampilkan + Bahasa ReVanced + "Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap. Untuk menerjemahkan bahasa baru atau meningkatkan terjemahan yang sudah ada, kunjungi translate.revanced.app" - Bahasa aplikasi - Impor / Ekspor - Impor / Ekspor setelan ReVanced - - Anda menggunakan ReVanced Patches versi <i>%s</i> - Catatan - Versi ini adalah pra-rilis dan Anda mungkin mengalami masalah yang tidak terduga - Tautan resmi - + Anda menggunakan ReVanced Patches versi <i>%s</i> + Catatan + Versi ini adalah pra-rilis dan Anda mungkin mengalami masalah yang tidak terduga + Tautan resmi + - - - Pengaturan GmsCore - Pengaturan untuk GmsCore - - MicroG GmsCore belum dipasang. Pasang dulu. - Tindakan diperlukan - "MicroG GmsCore tidak memiliki izin untuk berjalan di latar belakang. + + + Pengaturan GmsCore + Pengaturan untuk GmsCore + + MicroG GmsCore belum dipasang. Pasang dulu. + Tindakan diperlukan + "MicroG GmsCore tidak memiliki izin untuk berjalan di latar belakang. Ikuti panduan \"Jangan bunuh aplikasi saya\" untuk ponsel Anda, dan terapkan instruksi ke instalasi MicroG Anda. Ini diperlukan agar aplikasi berfungsi." - Buka situs - "Pengoptimalan baterai MicroG GmsCore harus dinonaktifkan untuk mencegah masalah. + Buka situs + "Pengoptimalan baterai MicroG GmsCore harus dinonaktifkan untuk mencegah masalah. Menonaktifkan pengoptimalan baterai MicroG tidak akan berdampak buruk pada penggunaan baterai. Ketuk tombol lanjutkan dan izinkan perubahan pengoptimalan." - Lanjutkan - - - Palsukan aliran video - Palsukan klien aliran video untuk mencegah masalah pemutaran - Palsukan aliran video - Palsukan klien aliran video untuk mencegah masalah pemutaran - Palsukan aliran video - "Aliran video dipalsukan + Lanjutkan + + + Palsukan aliran video + Palsukan klien aliran video untuk mencegah masalah pemutaran + Palsukan aliran video + Palsukan klien aliran video untuk mencegah masalah pemutaran + Palsukan aliran video + "Aliran video dipalsukan Jika Anda adalah pengguna YouTube Premium, setelan ini mungkin tidak diperlukan" - "Aliran video tidak dipalsukan + "Aliran video tidak dipalsukan Pemutaran mungkin tidak berfungsi" - Mematikan pengaturan ini dapat menyebabkan masalah pemutaran. - Klien bawaan - - - Paksa bahasa audio asli - Menggunakan bahasa audio asli - Menggunakan audio bawaan - - Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio - - - Debug - Mengaktifkan atau menonaktifkan pilihan debugging - Pencatatan debug - Pencatatan debug diaktifkan - Pencatatan debug dinonaktifkan - Jejak catatan stack - Pencatatan debug menyertakan jejak stack - Pencatatan debug tidak menyertakan jejak stack - Tampilkan pesan timbul pada kesalahan ReVanced - Pesan timbul ditampilkan jika terjadi kesalahan - Pesan timbul tidak ditampilkan jika terjadi kesalahan - "Mematikan notifikasi kesalahan menyembunyikan semua notifikasi kesalahan ReVanced. + Mematikan pengaturan ini dapat menyebabkan masalah pemutaran. + Klien bawaan + + + Paksa bahasa audio asli + Menggunakan bahasa audio asli + Menggunakan audio bawaan + + Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio + + + Debug + Mengaktifkan atau menonaktifkan pilihan debugging + Pencatatan debug + Pencatatan debug diaktifkan + Pencatatan debug dinonaktifkan + Jejak catatan stack + Pencatatan debug menyertakan jejak stack + Pencatatan debug tidak menyertakan jejak stack + Tampilkan pesan timbul pada kesalahan ReVanced + Pesan timbul ditampilkan jika terjadi kesalahan + Pesan timbul tidak ditampilkan jika terjadi kesalahan + "Mematikan notifikasi kesalahan menyembunyikan semua notifikasi kesalahan ReVanced. Anda tidak akan diberi tahu tentang kejadian yang tidak terduga." - Ekspor catatan debug - Salin catatan debug ReVanced ke papan klip - Pencatatan debug dinonaktifkan - Tidak ditemukan catatan - Catatan disalin - Gagal mengekspor catatan: %s - Bersihkan catatan debug - Membersihkan semua catatan debug ReVanced yang tersimpan - Catatan dibersihkan - Fitur pengelolaan tanda - Kelola tanda fitur boolean - Tanda aktif (%d) - Tanda diblokir (%d) - Cari tanda... - Tanda disimpan - Tanda diatur ulang - Tanda disalin ke papan klip - Catatan protokol buffer - Pencatatan debug termasuk buffer proto - Pencatatan debug tidak menyertakan buffer proto - "Mengaktifkan setelan ini akan mencatat data tata letak tambahan, termasuk teks pada layar untuk beberapa komponen UI. + Ekspor catatan debug + Salin catatan debug ReVanced ke papan klip + Pencatatan debug dinonaktifkan + Tidak ditemukan catatan + Catatan disalin + Gagal mengekspor catatan: %s + Bersihkan catatan debug + Membersihkan semua catatan debug ReVanced yang tersimpan + Catatan dibersihkan + Fitur pengelolaan tanda + Kelola tanda fitur boolean + Tanda aktif (%d) + Tanda diblokir (%d) + Cari tanda... + Tanda disimpan + Tanda diatur ulang + Tanda disalin ke papan klip + Catatan protokol buffer + Pencatatan debug termasuk buffer proto + Pencatatan debug tidak menyertakan buffer proto + "Mengaktifkan setelan ini akan mencatat data tata letak tambahan, termasuk teks pada layar untuk beberapa komponen UI. Ini dapat membantu mengidentifikasi komponen saat membuat penyaring khusus. Namun, mengaktifkan ini juga akan mencatat beberapa data pengguna seperti alamat IP Anda." - - - Bersihkan tautan berbagi - Parameter kueri pelacakan dihapus dari tautan yang dibagikan - Parameter kueri pelacakan tidak dihapus dari tautan yang dibagikan - Ubah tautan berbagi ke youtube.com - Tautan yang dibagikan menggunakan youtube.com - Tautan yang dibagikan menggunakan music.youtube.com - - - Penyaring khusus - Sembunyikan komponen menggunakan penyaring khusus - Aktifkan penyaring khusus - Penyaring khusus diaktifkan - Penyaring khusus dinonaktifkan - Penyaring khusus - - Daftar untaian pembuat jalur komponen untuk disaring dipisahkan oleh baris baru - Penyaring khusus tidak sah: %s - - - - - Tentang - Iklan - Thumbnail alternatif - Umpan - Umum - Pemutar - Shorts - Seekbar - Kontrol usap - Return YouTube Dislike - Lain-lain - Video - Pulihkan menu pengaturan lama - Menu pengaturan lama ditampilkan - Menu pengaturan lama tidak ditampilkan - - - Nonaktifkan pemutaran Shorts di latar belakang - Pemutaran Shorts di latar belakang dinonaktifkan - Pemutaran Shorts di latar belakang diaktifkan - - - Sembunyikan kartu album - Kartu album disembunyikan - Kartu album ditampilkan - Sembunyikan kartu artis - Kartu artis disembunyikan - Kartu artis ditampilkan - Sembunyikan kepingan rak - Kepingan rak disembunyikan - Kepingan rak ditampilkan - Sembunyikan postingan komunitas - Postingan komunitas disembunyikan - Postingan komunitas ditampilkan - Sembunyikan spanduk ringkas - Spanduk ringkas disembunyikan - Spanduk ringkas ditampilkan - Sembunyikan kartu yang dapat diperluas - Kartu yang dapat diperluas di bawah video disembunyikan - Kartu yang dapat diperluas di bawah video ditampilkan - Sembunyikan tombol mikrofon mengambang - Tombol mikrofon mengambang di pencarian disembunyikan - Tombol mikrofon mengambang dalam pencarian ditampilkan - Sembunyikan rak-rak mendatar - "Rak horizontal disembunyikan, seperti: + + + Bersihkan tautan berbagi + Parameter kueri pelacakan dihapus dari tautan yang dibagikan + Parameter kueri pelacakan tidak dihapus dari tautan yang dibagikan + Ubah tautan berbagi ke youtube.com + Tautan yang dibagikan menggunakan youtube.com + Tautan yang dibagikan menggunakan music.youtube.com + + + Penyaring khusus + Sembunyikan komponen menggunakan penyaring khusus + Aktifkan penyaring khusus + Penyaring khusus diaktifkan + Penyaring khusus dinonaktifkan + Penyaring khusus + + Daftar untaian pembuat jalur komponen untuk disaring dipisahkan oleh baris baru + Penyaring khusus tidak sah: %s + + + + + Tentang + Iklan + Thumbnail alternatif + Umpan + Umum + Pemutar + Shorts + Seekbar + Kontrol usap + Return YouTube Dislike + Lain-lain + Video + Pulihkan menu pengaturan lama + Menu pengaturan lama ditampilkan + Menu pengaturan lama tidak ditampilkan + + + Nonaktifkan pemutaran Shorts di latar belakang + Pemutaran Shorts di latar belakang dinonaktifkan + Pemutaran Shorts di latar belakang diaktifkan + + + Sembunyikan kartu album + Kartu album disembunyikan + Kartu album ditampilkan + Sembunyikan kartu artis + Kartu artis disembunyikan + Kartu artis ditampilkan + Sembunyikan kepingan rak + Kepingan rak disembunyikan + Kepingan rak ditampilkan + Sembunyikan postingan komunitas + Postingan komunitas disembunyikan + Postingan komunitas ditampilkan + Sembunyikan spanduk ringkas + Spanduk ringkas disembunyikan + Spanduk ringkas ditampilkan + Sembunyikan kartu yang dapat diperluas + Kartu yang dapat diperluas di bawah video disembunyikan + Kartu yang dapat diperluas di bawah video ditampilkan + Sembunyikan tombol mikrofon mengambang + Tombol mikrofon mengambang di pencarian disembunyikan + Tombol mikrofon mengambang dalam pencarian ditampilkan + Sembunyikan rak-rak mendatar + "Rak horizontal disembunyikan, seperti: • Berita terkini • Lanjutkan menonton • Jelajahi lebih banyak saluran • Paling relevan • Belanja • Tonton lagi" - Rak horizontal ditampilkan - Sembunyikan rak gambar - Rak gambar dalam hasil pencarian disembunyikan - Rak gambar dalam hasil pencarian ditampilkan - Sembunyikan postingan terbaru - Postingan terbaru disembunyikan - Postingan terbaru ditampilkan - Sembunyikan daftar putar campuran - Daftar putar campuran disembunyikan - Daftar putar campuran ditampilkan - Sembunyikan bagian film - Bagian film disembunyikan - Bagian film ditampilkan - - Sembunyikan \'Beri tahu saya\' - Tombol beri tahu saya disembunyikan - Tombol beri tahu saya ditampilkan - Sembunyikan Permainan - Permainan disembunyikan - Permainan ditampilkan - - Sembunyikan tombol \'Tampilkan selengkapnya\' - Tombol tampilkan lebih banyak di hasil pencarian disembunyikan - Tombol tampilkan lebih banyak di hasil pencarian ditampilkan - Sembunyikan survei - Survei disembunyikan - Survei ditampilkan - Sembunyikan rak tiket - Rak tiket disembunyikan - Rak tiket ditampilkan - - Sembunyikan label rekomendasi video - Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian disembunyikan - Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian ditampilkan - Sembunyikan pemisah visual - Pemisah visual disembunyikan - Pemisah visual ditampilkan - - Sembunyikan YouTube Doodles - Animasi YouTube Doodles pada logo disembunyikan - Animasi YouTube Doodles pada logo ditampilkan - "YouTube Doodle muncul beberapa hari setiap tahun. + Sembunyikan tombol \'Tampilkan selengkapnya\' + Tombol tampilkan lebih banyak di hasil pencarian disembunyikan + Tombol tampilkan lebih banyak di hasil pencarian ditampilkan + Sembunyikan survei + Survei disembunyikan + Survei ditampilkan + Sembunyikan rak tiket + Rak tiket disembunyikan + Rak tiket ditampilkan + + Sembunyikan label rekomendasi video + Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian disembunyikan + Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian ditampilkan + Sembunyikan pemisah visual + Pemisah visual disembunyikan + Pemisah visual ditampilkan + + Sembunyikan YouTube Doodles + Animasi YouTube Doodles pada logo disembunyikan + Animasi YouTube Doodles pada logo ditampilkan + "YouTube Doodle muncul beberapa hari setiap tahun. Jika Doodle saat ini ditampilkan di wilayah Anda dan pengaturan penyembunyi ini aktif, bilah filter di bawah bilah pencarian juga akan disembunyikan." - Sembunyikan bilah saluran - Bilah saluran disembunyikan - Bilah saluran ditampilkan - Sembunyikan tanda air saluran - Tanda air disembunyikan - Tanda air ditampilkan - Sembunyikan kotak penggalangan dana - Kotak penggalangan dana disembunyikan - Kotak penggalangan dana ditampilkan - Sembunyikan kotak darurat - Kotak darurat disembunyikan - Kotak darurat ditampilkan - Sembunyikan panel info - Panel info disembunyikan - Panel info ditampilkan - - Sembunyikan tombol Gabung - Tombol Gabung disembunyikan - Tombol Gabung ditampilkan - Sembunyikan panel medis - Panel medis disembunyikan - Panel medis ditampilkan - Sembunyikan tindakan cepat - Tindakan cepat dalam layar penuh disembunyikan - Tindakan cepat dalam layar penuh ditampilkan - Sembunyikan video terkait - Video terkait dalam tindakan cepat disembunyikan - Video terkait dalam tindakan cepat ditampilkan - Sembunyikan panduan pelanggan - Pedoman komunitas pelanggan disembunyikan - Pedoman komunitas pelanggan ditampilkan - Sembunyikan reaksi terjadwal - Reaksi terjadwal disembunyikan - Reaksi terjadwal ditampilkan - Sembunyikan \'Ringkasan video yang dibuat AI\' - Bagian ringkasan video buatan AI disembunyikan - Bagian ringkasan video buatan AI ditampilkan - Sembunyikan Tanya - Bagian Tanya disembunyikan - Bagian Tanya ditampilkan - Sembunyikan Atribut - Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan - Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan - Sembunyikan Bab - Bagian Bab disembunyikan - Bagian Bab ditampilkan - Sembunyikan \'Cara konten ini dibuat\' - Bagian Cara konten ini dibuat disembunyikan - Bagian Cara konten ini dibuat ditampilkan - Sembunyikan Poin Hype - Poin Hype disembunyikan - Poin Hype ditampilkan - Sembunyikan \'Jelajahi podcast\' - Bagian Jelajahi podcast disembunyikan - Bagian Jelajahi podcast ditampilkan - Sembunyikan tautan unggulan - Bagian tautan unggulan disembunyikan - Bagian tautan unggulan ditampilkan - Sembunyikan video unggulan - Bagian video unggulan disembunyikan - Bagian video unggulan ditampilkan - Sembunyikan kartu Info - Bagian kartu info disembunyikan - Bagian kartu info ditampilkan - Sembunyikan \'Konsep utama\' - Bagian Konsep utama disembunyikan - Bagian Konsep utama ditampilkan - Sembunyikan tombol Berlangganan - Tombol Langganan disembunyikan - Tombol Langganan ditampilkan - Sembunyikan Transkrip - Bagian transkrip disembunyikan - Bagian transkrip ditampilkan - Keterangan video - Sembunyikan atau tampilkan komponen keterangan video - Bilah saring - Sembunyikan atau tampilkan bilah penyaring di umpan, video terkait, hasil pencarian, dan riwayat tontonan - Sembunyikan di umpan - Disembunyikan di umpan - Ditampilkan di umpan - Sembunyikan di video terkait - Disembunyikan di video terkait - Ditampilkan di video terkait - Sembunyikan di hasil penelusuran - Disembunyikan di hasil penelusuran - Ditampilkan di hasil penelusuran - Sembunyikan di riwayat tontonan - Disembunyikan di riwayat tontonan - Ditampilkan di riwayat tontonan - Halaman saluran - Sembunyikan atau tampilkan komponen halaman saluran - - Sembunyikan tombol Komunitas - Tombol Komunitas disembunyikan - Tombol Komunitas ditampilkan - - Sembunyikan rak \'Untuk Anda\' - Rak Untuk Anda disembunyikan - Rak Untuk Anda ditampilkan - - Sembunyikan tombol Gabung - Tombol Gabung disembunyikan - Tombol Gabung ditampilkan - Sembunyikan pratinjau tautan - Pratinjau tautan disembunyikan - Pratinjau tautan ditampilkan - Sembunyikan rak anggota - Rak anggota disembunyikan - Rak anggota ditampilkan - - Sembunyikan tombol Belanja - Tombol Belanja disembunyikan - Tombol Belanja ditampilkan - - Sembunyikan tombol Berlangganan - Tombol Langganan disembunyikan - Tombol Langganan ditampilkan - Komentar - Sembunyikan atau tampilkan komponen bagian komentar - Sembunyikan ringkasan chat AI - Ringkasan chat AI disembunyikan - Ringkasan chat AI ditampilkan - Sembunyikan ringkasan Komentar AI - Ringkasan komentar AI disembunyikan - Ringkasan komentar AI ditampilkan - Sembunyikan pedoman saluran - Pedoman saluran disembunyikan - Pedoman saluran ditampilkan - Sembunyikan header \'Komentar oleh anggota\' - Header Komentar oleh anggota disembunyikan - Header Komentar oleh anggota ditampilkan - Sembunyikan bagian komentar - Bagian komentar disembunyikan - Bagian komentar ditampilkan - Sembunyikan pedoman komunitas - Pedoman komunitas disembunyikan - Pedoman komunitas ditampilkan - Sembunyikan tombol \'Buat Short\' - Tombol Buat Short disembunyikan - Tombol Buat Short ditampilkan - Sembunyikan tombol Emoji dan Penanda Waktu - Tombol Emoji dan Penanda Waktu disembunyikan - Tombol Emoji dan Penanda Waktu ditampilkan - Sembunyikan pratinjau komentar - Pratinjau komentar disembunyikan - Pratinjau komentar ditampilkan - Sembunyikan tombol Terima Kasih - Tombol terima kasih disembunyikan - Tombol terima kasih ditampilkan - Sembunyikan jumlah penayangan - Jumlah penayangan disembunyikan di umpan dan hasil pencarian - Jumlah penayangan ditampilkan di umpan dan hasil pencarian - - "Keterbatasan: + Sembunyikan tombol Gabung + Tombol Gabung disembunyikan + Tombol Gabung ditampilkan + Sembunyikan panel medis + Panel medis disembunyikan + Panel medis ditampilkan + Sembunyikan tindakan cepat + Tindakan cepat dalam layar penuh disembunyikan + Tindakan cepat dalam layar penuh ditampilkan + Sembunyikan video terkait + Video terkait dalam tindakan cepat disembunyikan + Video terkait dalam tindakan cepat ditampilkan + Sembunyikan panduan pelanggan + Pedoman komunitas pelanggan disembunyikan + Pedoman komunitas pelanggan ditampilkan + Sembunyikan reaksi terjadwal + Reaksi terjadwal disembunyikan + Reaksi terjadwal ditampilkan + Sembunyikan \'Ringkasan video yang dibuat AI\' + Bagian ringkasan video buatan AI disembunyikan + Bagian ringkasan video buatan AI ditampilkan + Sembunyikan Tanya + Bagian Tanya disembunyikan + Bagian Tanya ditampilkan + Sembunyikan Atribut + Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan + Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan + Sembunyikan Bab + Bagian Bab disembunyikan + Bagian Bab ditampilkan + Sembunyikan \'Cara konten ini dibuat\' + Bagian Cara konten ini dibuat disembunyikan + Bagian Cara konten ini dibuat ditampilkan + Sembunyikan Poin Hype + Poin Hype disembunyikan + Poin Hype ditampilkan + Sembunyikan \'Jelajahi podcast\' + Bagian Jelajahi podcast disembunyikan + Bagian Jelajahi podcast ditampilkan + Sembunyikan tautan unggulan + Bagian tautan unggulan disembunyikan + Bagian tautan unggulan ditampilkan + Sembunyikan video unggulan + Bagian video unggulan disembunyikan + Bagian video unggulan ditampilkan + Sembunyikan kartu Info + Bagian kartu info disembunyikan + Bagian kartu info ditampilkan + Sembunyikan \'Konsep utama\' + Bagian Konsep utama disembunyikan + Bagian Konsep utama ditampilkan + Sembunyikan tombol Berlangganan + Tombol Langganan disembunyikan + Tombol Langganan ditampilkan + Sembunyikan Transkrip + Bagian transkrip disembunyikan + Bagian transkrip ditampilkan + Keterangan video + Sembunyikan atau tampilkan komponen keterangan video + Bilah saring + Sembunyikan atau tampilkan bilah penyaring di umpan, video terkait, hasil pencarian, dan riwayat tontonan + Sembunyikan di umpan + Disembunyikan di umpan + Ditampilkan di umpan + Sembunyikan di video terkait + Disembunyikan di video terkait + Ditampilkan di video terkait + Sembunyikan di hasil penelusuran + Disembunyikan di hasil penelusuran + Ditampilkan di hasil penelusuran + Sembunyikan di riwayat tontonan + Disembunyikan di riwayat tontonan + Ditampilkan di riwayat tontonan + Halaman saluran + Sembunyikan atau tampilkan komponen halaman saluran + + Sembunyikan tombol Komunitas + Tombol Komunitas disembunyikan + Tombol Komunitas ditampilkan + + Sembunyikan rak \'Untuk Anda\' + Rak Untuk Anda disembunyikan + Rak Untuk Anda ditampilkan + + Sembunyikan tombol Gabung + Tombol Gabung disembunyikan + Tombol Gabung ditampilkan + Sembunyikan pratinjau tautan + Pratinjau tautan disembunyikan + Pratinjau tautan ditampilkan + Sembunyikan rak anggota + Rak anggota disembunyikan + Rak anggota ditampilkan + + Sembunyikan tombol Belanja + Tombol Belanja disembunyikan + Tombol Belanja ditampilkan + + Sembunyikan tombol Berlangganan + Tombol Langganan disembunyikan + Tombol Langganan ditampilkan + Komentar + Sembunyikan atau tampilkan komponen bagian komentar + Sembunyikan ringkasan chat AI + Ringkasan chat AI disembunyikan + Ringkasan chat AI ditampilkan + Sembunyikan ringkasan Komentar AI + Ringkasan komentar AI disembunyikan + Ringkasan komentar AI ditampilkan + Sembunyikan pedoman saluran + Pedoman saluran disembunyikan + Pedoman saluran ditampilkan + Sembunyikan header \'Komentar oleh anggota\' + Header Komentar oleh anggota disembunyikan + Header Komentar oleh anggota ditampilkan + Sembunyikan bagian komentar + Bagian komentar disembunyikan + Bagian komentar ditampilkan + Sembunyikan pedoman komunitas + Pedoman komunitas disembunyikan + Pedoman komunitas ditampilkan + Sembunyikan tombol \'Buat Short\' + Tombol Buat Short disembunyikan + Tombol Buat Short ditampilkan + Sembunyikan tombol Emoji dan Penanda Waktu + Tombol Emoji dan Penanda Waktu disembunyikan + Tombol Emoji dan Penanda Waktu ditampilkan + Sembunyikan pratinjau komentar + Pratinjau komentar disembunyikan + Pratinjau komentar ditampilkan + Sembunyikan tombol Terima Kasih + Tombol terima kasih disembunyikan + Tombol terima kasih ditampilkan + Sembunyikan jumlah penayangan + Jumlah penayangan disembunyikan di umpan dan hasil pencarian + Jumlah penayangan ditampilkan di umpan dan hasil pencarian + + "Keterbatasan: • Rak Shorts, halaman saluran, dan hasil pencarian mungkin masih menampilkan jumlah penayangan • Fitur ini tidak berfungsi dengan faktor bentuk otomotif" - Sembunyikan waktu unggah - Waktu unggah disembunyikan di umpan dan hasil penelusuran - Waktu unggah ditampilkan di umpan dan hasil penelusuran - - "Keterbatasan: + Sembunyikan waktu unggah + Waktu unggah disembunyikan di umpan dan hasil penelusuran + Waktu unggah ditampilkan di umpan dan hasil penelusuran + + "Keterbatasan: • Rak Shorts, halaman saluran, dan hasil penelusuran mungkin masih menampilkan waktu unggah • Fitur ini tidak berfungsi dengan faktor bentuk otomotif" - Sembunyikan kata kunci konten - Sembunyikan pencarian dan feed video menggunakan penyaring kata kunci - Sembunyikan video beranda dengan kata kunci - Video di tab beranda disaring berdasarkan kata kunci - Video di tab beranda tidak disaring berdasarkan kata kunci - Sembunyikan hasil pencarian berdasarkan kata kunci - Hasil pencarian disaring berdasarkan kata kunci - Hasil pencarian tidak disaring berdasarkan kata kunci - Sembunyikan video langganan dengan kata kunci - Video di tab langganan disaring berdasarkan kata kunci - Video di tab langganan tidak disaring berdasarkan kata kunci - Kata kunci yang ingin disembunyikan - - "Kata kunci dan frasa yang akan disembunyikan, dipisahkan oleh baris baru + "Kata kunci dan frasa yang akan disembunyikan, dipisahkan oleh baris baru Kata kunci dapat berupa nama saluran atau teks apa pun yang ditampilkan di judul video Kata-kata dengan huruf besar di tengah harus dimasukkan dengan casing (misalnya: iPhone, TikTok, LeBlanc)" - Tentang penyaringan kata kunci - "Hasil pencarian Beranda/Berlangganan/Pencarian difilter untuk menyembunyikan konten yang cocok dengan frasa kata kunci + Tentang penyaringan kata kunci + "Hasil pencarian Beranda/Berlangganan/Pencarian difilter untuk menyembunyikan konten yang cocok dengan frasa kata kunci Keterbatasan • Shorts tidak dapat disembunyikan berdasarkan nama saluran • Beberapa komponen UI mungkin tidak disembunyikan • Pencarian kata kunci mungkin tidak menampilkan hasil" - Cocokkan seluruh kata - - Melingkupi kata kunci/frasa dengan tanda kutip ganda akan mencegah pencocokan sebagian judul video dan nama saluran<br><br>Misalnya,<br><b>\"ai\"</b> akan menyembunyikan video: <b>Bagaimana cara kerja AI?</b><br>tetapi tidak akan menyembunyikan: <b>Apa yang dimaksud dengan Jakarta Fair?</b> - - Tidak dapat menggunakan kata kunci: %s - Tambahkan tanda kutip untuk menggunakan kata kunci: %s - Kata kunci punya keterangan yang bertentangan: %s - Kata kunci terlalu pendek dan butuh tanda kutip: %s - Kata kunci akan menyembunyikan semua video: %s - - - Sembunyikan rak toko kreator - Rak toko kreator di bawah pemutar video disembunyikan - Rak toko kreator di bawah pemutar video ditampilkan - Sembunyikan spanduk toko di layar akhir - Spanduk toko layar akhir disembunyikan - Spanduk toko layar akhir ditampilkan - Sembunyikan iklan layar penuh - "Iklan layar penuh disembunyikan + Cocokkan seluruh kata + + Melingkupi kata kunci/frasa dengan tanda kutip ganda akan mencegah pencocokan sebagian judul video dan nama saluran<br><br>Misalnya,<br><b>\"ai\"</b> akan menyembunyikan video: <b>Bagaimana cara kerja AI?</b><br>tetapi tidak akan menyembunyikan: <b>Apa yang dimaksud dengan Jakarta Fair?</b> + + Tidak dapat menggunakan kata kunci: %s + Tambahkan tanda kutip untuk menggunakan kata kunci: %s + Kata kunci punya keterangan yang bertentangan: %s + Kata kunci terlalu pendek dan butuh tanda kutip: %s + Kata kunci akan menyembunyikan semua video: %s + + + Sembunyikan rak toko kreator + Rak toko kreator di bawah pemutar video disembunyikan + Rak toko kreator di bawah pemutar video ditampilkan + Sembunyikan spanduk toko di layar akhir + Spanduk toko layar akhir disembunyikan + Spanduk toko layar akhir ditampilkan + Sembunyikan iklan layar penuh + "Iklan layar penuh disembunyikan Fitur ini hanya tersedia untuk perangkat yang lebih lama" - Iklan layar penuh ditampilkan - - Menyembunyikan iklan layar penuh hanya berfungsi pada perangkat lama - Sembunyikan iklan umum - Iklan umum disembunyikan - Iklan umum ditampilkan - Sembunyikan spanduk merchandise - Banner merchandise disembunyikan - Spanduk merchandise ditampilkan - Sembunyikan label promosi berbayar - Label promosi berbayar disembunyikan - Label promosi berbayar ditampilkan - Sembunyikan kartu bersponsor pribadi - Kartu bersponsor pribadi disembunyikan - Kartu bersponsor pribadi ditampilkan - Sembunyikan tautan belanja - Tautan belanja di deskripsi video disembunyikan - Tautan belanja di deskripsi video ditampilkan - Sembunyikan spanduk \'Lihat produk\' - Spanduk lihat produk di hamparan video disembunyikan - Spanduk lihat produk di hamparan video ditampilkan - Sembunyikan hasil pencarian web - Hasil pencarian web disembunyikan - Hasil pencarian web ditampilkan - - - Sembunyikan promosi YouTube Premium - Promosi YouTube Premium di bawah pemutar video disembunyikan - Promosi YouTube Premium di bawah pemutar video ditampilkan - - - Sembunyikan iklan video - Iklan video disembunyikan - Iklan video ditampilkan - - - URL disalin ke papan klip - URL dengan penanda waktu telah disalin - Tampilkan tombol salin URL video - Tombol salin URL video ditampilkan. Ketuk untuk menyalin URL video. Ketuk dan tahan untuk menyalin dengan stempel waktu - Tombol salin URL video tidak ditampilkan - Tampilkan tombol salin penanda waktu URL - Tombol salin URL stempel waktu ditampilkan. Ketuk untuk menyalin URL video dengan stempel waktu. Ketuk dan tahan untuk menyalin tanpa stempel waktu - Tombol salin URL stempel waktu tidak ditampilkan - - - Hapus dialog pembatasan penonton - Dialog akan dihapus - Dialog akan ditampilkan - Ini tidak mengabaikan batasan usia. Ini hanya menerimanya secara otomatis. - - - Nonaktifkan popup \'Masuk ke TV\' - Pop-up Masuk ke TV dinonaktifkan - Pop-up Masuk ke TV diaktifkan - - - Nonaktifkan lewati bab dengan ketuk dua kali - Ketuk dua kali tidak akan pernah memicu lewati ke bab berikutnya/sebelumnya - Ketuk dua kali terkadang dapat memicu lewati ke bab berikutnya/sebelumnya - - - Unduhan eksternal - Pengaturan untuk menggunakan pengunduh eksternal - Tampilkan tombol unduhan eksternal - Tombol Unduh di pemutar ditampilkan - Tombol Unduh di pemutar tidak ditampilkan - - Gantikan tombol tindakan Unduh - Tombol unduh membuka pengunduh eksternal Anda - Tombol unduh membuka pengunduh asli di dalam aplikasi - Nama paket pengunduh - Nama paket aplikasi pengunduh eksternal yang telah Anda pasang - Masukkan nama paket - Lainnya - Aplikasi tidak terpasang - %s belum terpasang. Silahkan pasang. - "Tidak dapat menemukan aplikasi terpasang dengan nama paket: %s + Iklan layar penuh ditampilkan + + Menyembunyikan iklan layar penuh hanya berfungsi pada perangkat lama + Sembunyikan iklan umum + Iklan umum disembunyikan + Iklan umum ditampilkan + Sembunyikan spanduk merchandise + Banner merchandise disembunyikan + Spanduk merchandise ditampilkan + Sembunyikan label promosi berbayar + Label promosi berbayar disembunyikan + Label promosi berbayar ditampilkan + Sembunyikan kartu bersponsor pribadi + Kartu bersponsor pribadi disembunyikan + Kartu bersponsor pribadi ditampilkan + Sembunyikan tautan belanja + Tautan belanja di deskripsi video disembunyikan + Tautan belanja di deskripsi video ditampilkan + Sembunyikan spanduk \'Lihat produk\' + Spanduk lihat produk di hamparan video disembunyikan + Spanduk lihat produk di hamparan video ditampilkan + Sembunyikan hasil pencarian web + Hasil pencarian web disembunyikan + Hasil pencarian web ditampilkan + + + Sembunyikan promosi YouTube Premium + Promosi YouTube Premium di bawah pemutar video disembunyikan + Promosi YouTube Premium di bawah pemutar video ditampilkan + + + Sembunyikan iklan video + Iklan video disembunyikan + Iklan video ditampilkan + + + URL disalin ke papan klip + URL dengan penanda waktu telah disalin + Tampilkan tombol salin URL video + Tombol salin URL video ditampilkan. Ketuk untuk menyalin URL video. Ketuk dan tahan untuk menyalin dengan stempel waktu + Tombol salin URL video tidak ditampilkan + Tampilkan tombol salin penanda waktu URL + Tombol salin URL stempel waktu ditampilkan. Ketuk untuk menyalin URL video dengan stempel waktu. Ketuk dan tahan untuk menyalin tanpa stempel waktu + Tombol salin URL stempel waktu tidak ditampilkan + + + Hapus dialog pembatasan penonton + Dialog akan dihapus + Dialog akan ditampilkan + Ini tidak mengabaikan batasan usia. Ini hanya menerimanya secara otomatis. + + + Nonaktifkan popup \'Masuk ke TV\' + Pop-up Masuk ke TV dinonaktifkan + Pop-up Masuk ke TV diaktifkan + + + Nonaktifkan lewati bab dengan ketuk dua kali + Ketuk dua kali tidak akan pernah memicu lewati ke bab berikutnya/sebelumnya + Ketuk dua kali terkadang dapat memicu lewati ke bab berikutnya/sebelumnya + + + Unduhan eksternal + Pengaturan untuk menggunakan pengunduh eksternal + Tampilkan tombol unduhan eksternal + Tombol Unduh di pemutar ditampilkan + Tombol Unduh di pemutar tidak ditampilkan + + Gantikan tombol tindakan Unduh + Tombol unduh membuka pengunduh eksternal Anda + Tombol unduh membuka pengunduh asli di dalam aplikasi + Nama paket pengunduh + Nama paket aplikasi pengunduh eksternal yang telah Anda pasang + Masukkan nama paket + Lainnya + Aplikasi tidak terpasang + %s belum terpasang. Silahkan pasang. + "Tidak dapat menemukan aplikasi terpasang dengan nama paket: %s Verifikasi nama paket sudah benar dan aplikasi sudah terpasang" - Nama paket tidak boleh kosong - - - Matikan gerakan pencarian presisi - Gerakan dinonaktifkan - Gerakan diaktifkan - - - Aktifkan ketuk untuk mencari - Ketuk untuk mencari diaktifkan - Ketuk untuk mencari dinonaktifkan - - - Aktifkan gerakan kecerahan - "Pengusapan kecerahan layar penuh diaktifkan + Nama paket tidak boleh kosong + + + Matikan gerakan pencarian presisi + Gerakan dinonaktifkan + Gerakan diaktifkan + + + Aktifkan ketuk untuk mencari + Ketuk untuk mencari diaktifkan + Ketuk untuk mencari dinonaktifkan + + + Aktifkan gerakan kecerahan + "Pengusapan kecerahan layar penuh diaktifkan Sesuaikan kecerahan dengan mengusap secara vertikal pada sisi kiri layar" - Pengusapan kecerahan layar penuh dinonaktifkan - Aktifkan gerakan volume - "Pengusapan volume layar penuh diaktifkan + Pengusapan kecerahan layar penuh dinonaktifkan + Aktifkan gerakan volume + "Pengusapan volume layar penuh diaktifkan Menyesuaikan volume dengan mengusap secara vertikal di sisi kanan layar" - Pengusapan volume layar penuh dinonaktifkan - Aktifkan tekan untuk gerakan geser - Tekan untuk menggeser diaktifkan - Tekan untuk menggeser dinonaktifkan - Aktifkan umpan balik sentuhan - Umpan balik sentuhan diaktifkan - Umpan balik sentuhan dinonaktifkan - Simpan dan pulihkan kecerahan - Simpan dan pulihkan kecerahan saat keluar atau memasuki layar penuh - Jangan simpan dan pulihkan kecerahan saat keluar atau memasuki layar penuh - Aktifkan gerakan kecerahan otomatis - Mengusap ke bawah ke nilai terendah dari gerakan kecerahan akan menyalakan kecerahan otomatis - Mengusap ke bawah ke nilai terendah tidak mengaktifkan kecerahan otomatis - Otomatis - Batas waktu hamparan usap - Jumlah milidetik hamparan terlihat - Opasitas latar belakang hamparan geser - Nilai opasitas antara 0-100 - Opasitas geser harus antara 0-100 - Warna kecerahan lapisan usap - Warna bilah kemajuan untuk kontrol kecerahan - Warna volume lapisan usap - Warna bilah kemajuan untuk kontrol volume - Ukuran teks lapisan usap - Ukuran teks untuk lapisan usap antara 1-30 - Ukuran teks harus antara 1-30 - Ambang batas magnitudo usap - Jumlah ambang batas untuk terjadinya usapan - Sensitivitas volume usap - Seberapa besar perubahan volume per usapan - Gaya hamparan usap - Hamparan horizontal - Hamparan horizontal (minimal - atas) - Hamparan horizontal (minimal - tengah) - Hamparan melingkar - Hamparan melingkar (minimal) - Hamparan vertikal - Hamparan vertikal (minimal) - Aktifkan usapan untuk beralih video - Mengusap dalam mode layar penuh akan beralih ke video berikutnya/sebelumnya - Mengusap dalam mode layar penuh tidak akan beralih ke video berikutnya/sebelumnya - - - Matikan teks otomatis - Teks otomatis dinonaktifkan - Teks otomatis diaktifkan - - - Tombol tindakan - Sembunyikan atau tampilkan tombol di bawah video - Nonaktifkan kilauan Suka dan Langganan - Tombol Suka dan Berlangganan tidak akan berkilau saat disebut - Tombol Suka dan Berlangganan akan berkilau saat disebut - Sembunyikan Suka dan Tidak Suka - Tombol Suka dan Tidak suka disembunyikan - Tombol Suka dan Tidak suka ditampilkan - - Sembunyikan Bagikan - Tombol bagikan disembunyikan - Tombol bagikan ditampilkan - - Sembunyikan Hentikan iklan - Tombol hentikan iklan disembunyikan - Tombol hentikan iklan ditampilkan - - Sembunyikan Komentar - Tombol Komentar disembunyikan - Tombol Komentar ditampilkan - + + Matikan teks otomatis + Teks otomatis dinonaktifkan + Teks otomatis diaktifkan + + + Tombol tindakan + Sembunyikan atau tampilkan tombol di bawah video + Nonaktifkan kilauan Suka dan Langganan + Tombol Suka dan Berlangganan tidak akan berkilau saat disebut + Tombol Suka dan Berlangganan akan berkilau saat disebut + Sembunyikan Suka dan Tidak Suka + Tombol Suka dan Tidak suka disembunyikan + Tombol Suka dan Tidak suka ditampilkan + + Sembunyikan Bagikan + Tombol bagikan disembunyikan + Tombol bagikan ditampilkan + + Sembunyikan Hentikan iklan + Tombol hentikan iklan disembunyikan + Tombol hentikan iklan ditampilkan + + Sembunyikan Komentar + Tombol Komentar disembunyikan + Tombol Komentar ditampilkan + - Sembunyikan Laporkan - Tombol laporkan disembunyikan - Tombol laporkan ditampilkan - - Sembunyikan Remix - Tombol remix disembunyikan - Tombol remix ditampilkan - - Sembunyikan Unduhan - Tombol unduh disembunyikan - Tombol unduh ditampilkan - + Sembunyikan Remix + Tombol remix disembunyikan + Tombol remix ditampilkan + + Sembunyikan Unduhan + Tombol unduh disembunyikan + Tombol unduh ditampilkan + - Sembunyikan Hype - Tombol Hype disembunyikan - Tombol Hype ditampilkan - - Sembunyikan Promosi - Tombol Promosi disembunyikan - Tombol Promosi ditampilkan - - Sembunyikan Terima kasih - Tombol terima kasih disembunyikan - Tombol terima kasih ditampilkan - + Sembunyikan Promosi + Tombol Promosi disembunyikan + Tombol Promosi ditampilkan + + Sembunyikan Terima kasih + Tombol terima kasih disembunyikan + Tombol terima kasih ditampilkan + - Sembunyikan Tanya - Tombol Tanya disembunyikan - Tombol Tanya ditampilkan - - Sembunyikan Klip - Tombol klip disembunyikan - Tombol klip ditampilkan - - Sembunyikan Belanja - Tombol belanja disembunyikan - Tombol belanja ditampilkan - - Sembunyikan Simpan - Tombol Simpan disembunyikan - Tombol Simpan ditampilkan - - - Tombol navigasi - Sembunyikan atau ganti tombol di bilah navigasi - - Sembunyikan Beranda - Tombol beranda disembunyikan - Tombol beranda ditampilkan - - Sembunyikan Shorts - Tombol shorts disembunyikan - Tombol shorts ditampilkan - - Sembunyikan Buat - Tombol buat disembunyikan - Tombol buat ditampilkan - - Sembunyikan Langganan - Tombol langganan disembunyikan - Tombol langganan ditampilkan - Sembunyikan Notifikasi - Tombol notifikasi disembunyikan - Tombol notifikasi ditampilkan - - Ganti Buat dengan Notifikasi - "Tombol buat diganti dengan tombol Notifikasi + Sembunyikan Tanya + Tombol Tanya disembunyikan + Tombol Tanya ditampilkan + + Sembunyikan Klip + Tombol klip disembunyikan + Tombol klip ditampilkan + + Sembunyikan Belanja + Tombol belanja disembunyikan + Tombol belanja ditampilkan + + Sembunyikan Simpan + Tombol Simpan disembunyikan + Tombol Simpan ditampilkan + + + Tombol navigasi + Sembunyikan atau ganti tombol di bilah navigasi + + Sembunyikan Beranda + Tombol beranda disembunyikan + Tombol beranda ditampilkan + + Sembunyikan Shorts + Tombol shorts disembunyikan + Tombol shorts ditampilkan + + Sembunyikan Buat + Tombol buat disembunyikan + Tombol buat ditampilkan + + Sembunyikan Langganan + Tombol langganan disembunyikan + Tombol langganan ditampilkan + Sembunyikan Notifikasi + Tombol notifikasi disembunyikan + Tombol notifikasi ditampilkan + + Ganti Buat dengan Notifikasi + "Tombol buat diganti dengan tombol Notifikasi Catatan: Mengaktifkan ini juga akan memaksa menyembunyikan iklan video" - Tombol buat tidak diganti dengan tombol Notifikasi - "Menonaktifkan setelan ini juga akan menonaktifkan pemblokiran iklan di Shorts. + Tombol buat tidak diganti dengan tombol Notifikasi + "Menonaktifkan setelan ini juga akan menonaktifkan pemblokiran iklan di Shorts. Jika mengubah setelan ini tidak berpengaruh, coba beralih ke mode Penyamaran." - Sembunyikan label tombol navigasi - Label disembunyikan - Label ditampilkan - Nonaktifkan bilah status tembus cahaya - Bilah status buram - Bilah status buram atau tembus pandang - Di beberapa perangkat, mengaktifkan fitur ini dapat mengubah bilah navigasi sistem menjadi transparan. - Nonaktifkan bilah tembus cahaya terang - Bilah navigasi mode terang adalah buram - Bilah navigasi mode terang buram atau tembus pandang - Nonaktifkan bilah tembus pandang gelap - Bilah navigasi mode gelap adalah buram - Bilah navigasi mode gelap buram atau tembus pandang - - - Menu flyout - Sembunyikan atau tampilkan item menu pemutar flyout - - Sembunyikan Teks - Menu teks disembunyikan - Menu teks ditampilkan - - Sembunyikan Pengaturan tambahan - Menu pengaturan tambahan disembunyikan - Menu pengaturan tambahan ditampilkan - - Sembunyikan pengatur waktu tidur - Menu pengatur waktu tidur disembunyikan - Menu pengatur waktu tidur ditampilkan - - Sembunyikan Ulangi video - Menu ulangi video disembunyikan - Menu ulangi video ditampilkan - - Sembunyikan mode Sinematik - Menu mode sinematik disembunyikan - Menu mode sinematik ditampilkan - Sembunyikan volume Stabil - Menu volume stabil ditampilkan - Menu volume stabil disembunyikan - - Sembunyikan Bantuan & masukan - Bantuan & menu masukan disembunyikan - Bantuan & menu masukan ditampilkan - - Sembunyikan Kecepatan pemutaran - Menu kecepatan pemutaran disembunyikan - Menu kecepatan pemutaran ditampilkan - - Sembunyikan Kunci layar - Menu kunci layar disembunyikan - Menu kunci layar ditampilkan - - Sembunyikan Dengarkan dengan YouTube Music - Menu Dengarkan dengan YouTube Music disembunyikan - Menu Dengarkan dengan YouTube Music ditampilkan - - Sembunyikan trek Audio - Menu trek audio disembunyikan - Menu trek audio ditampilkan - + + Menu flyout + Sembunyikan atau tampilkan item menu pemutar flyout + + Sembunyikan Teks + Menu teks disembunyikan + Menu teks ditampilkan + + Sembunyikan Pengaturan tambahan + Menu pengaturan tambahan disembunyikan + Menu pengaturan tambahan ditampilkan + + Sembunyikan pengatur waktu tidur + Menu pengatur waktu tidur disembunyikan + Menu pengatur waktu tidur ditampilkan + + Sembunyikan Ulangi video + Menu ulangi video disembunyikan + Menu ulangi video ditampilkan + + Sembunyikan mode Sinematik + Menu mode sinematik disembunyikan + Menu mode sinematik ditampilkan + Sembunyikan volume Stabil + Menu volume stabil ditampilkan + Menu volume stabil disembunyikan + + Sembunyikan Bantuan & masukan + Bantuan & menu masukan disembunyikan + Bantuan & menu masukan ditampilkan + + Sembunyikan Kecepatan pemutaran + Menu kecepatan pemutaran disembunyikan + Menu kecepatan pemutaran ditampilkan + + Sembunyikan Kunci layar + Menu kunci layar disembunyikan + Menu kunci layar ditampilkan + + Sembunyikan Dengarkan dengan YouTube Music + Menu Dengarkan dengan YouTube Music disembunyikan + Menu Dengarkan dengan YouTube Music ditampilkan + + Sembunyikan trek Audio + Menu trek audio disembunyikan + Menu trek audio ditampilkan + - "Menu trek audio disembunyikan + "Menu trek audio disembunyikan Untuk menampilkan menu trek audio, ubah 'Palsukan aliran video' ke 'Android No SDK'" - - Sembunyikan Tonton di VR - Menu tonton di VR disembunyikan - Menu tonton di VR ditampilkan - Sembunyikan menu kualitas video - Menu kualitas video disembunyikan - Menu kualitas video ditampilkan - Sembunyikan footer menu kualitas video - Footer menu kualitas video disembunyikan - Footer menu kualitas video ditampilkan - - - Sembunyikan tombol Putar Otomatis - Tombol putar otomatis disembunyikan - Tombol putar otomatis ditampilkan - - Sembunyikan tombol Teks - Tombol teks disembunyikan - Tombol teks ditampilkan - Sembunyikan tombol Transmisi - Tombol transmisi disembunyikan - Tombol transmisi ditampilkan - Sembunyikan latar belakang kontrol pemutar - Latar belakang kontrol pemutar disembunyikan - Latar belakang kontrol pemutar ditampilkan - Sembunyikan tombol Sebelumnya & Berikutnya - Tombol disembunyikan - Tombol ditampilkan - - - Sembunyikan kartu layar akhir - Kartu layar akhir disembunyikan - Kartu layar akhir ditampilkan - - - Nonaktifkan mode Senematik dalam layar penuh - Mode sinematik dinonaktifkan - Mode sinematik diaktifkan - - - Sembunyikan kartu info - Kartu info disembunyikan - Kartu info ditampilkan - - - Nonaktifkan animasi angka bergulir - Angka bergulir tidak dianimasikan - Angka bergulir dianimasikan - - - Sembunyikan bilah pencari pemutar video - Seekbar pemutar video disembunyikan - Seekbar pemutar video ditampilkan - - Sembunyikan bilah pencari thumbnail video - Bilah pencari thumbnail video disembunyikan - Bilah pencari thumbnail video ditampilkan - - - Pemutar Shorts - Sembunyikan atau tampilkan komponen pemutar Shorts - - Sembunyikan Shorts di umpan Beranda - Disembunyikan di umpan Beranda dan video terkait - Ditampilkan di umpan Beranda dan video terkait - Sembunyikan Shorts di hasil pencarian - Disembunyikan dalam hasil penelusuran - Ditampilkan dalam hasil penelusuran - - Sembunyikan Shorts di umpan Langganan - Disembunyikan di umpan Langganan - Ditampilkan di umpan Langganan - Sembunyikan Shorts dalam riwayat tontonan - Disembunyikan dalam riwayat tontonan - Ditampilkan dalam riwayat tontonan - Sembunyikan label \'Dubbing Otomatis\' - Label sulih suara otomatis disembunyikan - Label sulih suara otomatis ditampilkan - Sembunyikan tombol \'Beli Super Thanks\' - Tombol Beli Super Thanks disembunyikan - Tombol Beli Super Thanks ditampilkan - Sembunyikan tombol Efek - Tombol Efek disembunyikan - Tombol Efek ditampilkan - Sembunyikan tombol \'Layar hijau\' - Tombol layar hijau disembunyikan - Tombol layar hijau ditampilkan - Sembunyikan tombol tagar - Tombol tagar disembunyikan - Tombol tagar ditampilkan - - Sembunyikan tombol Gabung - Tombol gabung disembunyikan - Tombol gabung ditampilkan - Sembunyikan pratinjau langsung - Pratinjau langsung disembunyikan - Pratinjau langsung ditampilkan - Sembunyikan label lokasi - Label lokasi disembunyikan - Label lokasi ditampilkan - Sembunyikan tombol \'Postingan baru\' - Tombol postingan baru disembunyikan - Tombol postingan baru ditampilkan - Sembunyikan tombol hamparan terjeda - Tombol hamparan terjeda disembunyikan - Tombol hamparan terjeda ditampilkan - Sembunyikan pratinjau komentar - Pratinjau komentar disembunyikan - Pratinjau komentar ditampilkan - Sembunyikan tombol \'Simpan musik\' - Tombol simpan musik disembunyikan - Tombol simpan musik ditampilkan - Sembunyikan saran penelusuran - Saran penelusuran disembunyikan - Saran penelusuran ditampilkan - Sembunyikan tombol Belanja - Tombol belanja disembunyikan - Tombol belanja ditampilkan - Sembunyikan stiker - Stiker disembunyikan - Stiker ditampilkan - Sembunyikan tombol Berlangganan - Tombol berlangganan disembunyikan - Tombol berlangganan ditampilkan - Sembunyikan produk yang ditandai - Produk yang ditandai disembunyikan - Produk yang ditandai ditampilkan - Sembunyikan tombol Mendatang - Tombol yang akan datang disembunyikan - Tombol yang akan datang ditampilkan - Sembunyikan tombol \'Gunakan suara ini\' - Tombol gunakan suara ini disembunyikan - Tombol gunakan suara ini ditampilkan - Sembunyikan tombol \'Gunakan template ini\' - Tombol gunakan template ini disembunyikan - Tombol gunakan template ini ditampilkan - Sembunyikan tombol Suka yang memancar - Animasi tombol suka yang memancar disembunyikan - Animasi tombol suka yang memancar ditampilkan - Sembunyikan tombol Suka - Tombol suka disembunyikan - Tombol suka ditampilkan - Sembunyikan tombol Tidak Suka - Tombol tidak suka disembunyikan - Tombol tidak suka ditampilkan - Sembunyikan tombol Komentar - Tombol komentar disembunyikan - Tombol komentar ditampilkan - - Sembunyikan tombol Bagikan - Tombol bagikan disembunyikan - Tombol bagikan ditampilkan - - Sembunyikan tombol Remix - Tombol remix disembunyikan - Tombol remix ditampilkan - Sembunyikan tombol suara - Tombol suara disembunyikan - Tombol suara ditampilkan - Sembunyikan panel info - Panel info disembunyikan - Panel info ditampilkan - Sembunyikan bilah saluran - Bilah saluran disembunyikan - Bilah saluran ditampilkan - Sembunyikan judul video - Judul video disembunyikan - Judul video ditampilkan - Sembunyikan label metadata suara - Label metadata suara disembunyikan - Label metadata suara ditampilkan - Sembunyikan label tautan video - Label tautan video disembunyikan - Label tautan video ditampilkan - Sembunyikan bilah navigasi - Bilah navigasi disembunyikan - Bilah navigasi ditampilkan - - - Sembunyikan video yang disarankan di layar akhir - "Video yang disarankan di layar akhir disembunyikan saat pemutaran otomatis dimatikan + + Sembunyikan Tonton di VR + Menu tonton di VR disembunyikan + Menu tonton di VR ditampilkan + Sembunyikan menu kualitas video + Menu kualitas video disembunyikan + Menu kualitas video ditampilkan + Sembunyikan footer menu kualitas video + Footer menu kualitas video disembunyikan + Footer menu kualitas video ditampilkan + + + Sembunyikan tombol Putar Otomatis + Tombol putar otomatis disembunyikan + Tombol putar otomatis ditampilkan + + Sembunyikan tombol Teks + Tombol teks disembunyikan + Tombol teks ditampilkan + Sembunyikan tombol Transmisi + Tombol transmisi disembunyikan + Tombol transmisi ditampilkan + Sembunyikan latar belakang kontrol pemutar + Latar belakang kontrol pemutar disembunyikan + Latar belakang kontrol pemutar ditampilkan + Sembunyikan tombol Sebelumnya & Berikutnya + Tombol disembunyikan + Tombol ditampilkan + + + Sembunyikan kartu layar akhir + Kartu layar akhir disembunyikan + Kartu layar akhir ditampilkan + + + Nonaktifkan mode Senematik dalam layar penuh + Mode sinematik dinonaktifkan + Mode sinematik diaktifkan + + + Sembunyikan kartu info + Kartu info disembunyikan + Kartu info ditampilkan + + + Nonaktifkan animasi angka bergulir + Angka bergulir tidak dianimasikan + Angka bergulir dianimasikan + + + Sembunyikan bilah pencari pemutar video + Seekbar pemutar video disembunyikan + Seekbar pemutar video ditampilkan + + Sembunyikan bilah pencari thumbnail video + Bilah pencari thumbnail video disembunyikan + Bilah pencari thumbnail video ditampilkan + + + Pemutar Shorts + Sembunyikan atau tampilkan komponen pemutar Shorts + + Sembunyikan Shorts di umpan Beranda + Disembunyikan di umpan Beranda dan video terkait + Ditampilkan di umpan Beranda dan video terkait + Sembunyikan Shorts di hasil pencarian + Disembunyikan dalam hasil penelusuran + Ditampilkan dalam hasil penelusuran + + Sembunyikan Shorts di umpan Langganan + Disembunyikan di umpan Langganan + Ditampilkan di umpan Langganan + Sembunyikan Shorts dalam riwayat tontonan + Disembunyikan dalam riwayat tontonan + Ditampilkan dalam riwayat tontonan + Sembunyikan label \'Dubbing Otomatis\' + Label sulih suara otomatis disembunyikan + Label sulih suara otomatis ditampilkan + Sembunyikan tombol \'Beli Super Thanks\' + Tombol Beli Super Thanks disembunyikan + Tombol Beli Super Thanks ditampilkan + Sembunyikan tombol Efek + Tombol Efek disembunyikan + Tombol Efek ditampilkan + Sembunyikan tombol \'Layar hijau\' + Tombol layar hijau disembunyikan + Tombol layar hijau ditampilkan + Sembunyikan tombol tagar + Tombol tagar disembunyikan + Tombol tagar ditampilkan + + Sembunyikan tombol Gabung + Tombol gabung disembunyikan + Tombol gabung ditampilkan + Sembunyikan pratinjau langsung + Pratinjau langsung disembunyikan + Pratinjau langsung ditampilkan + Sembunyikan label lokasi + Label lokasi disembunyikan + Label lokasi ditampilkan + Sembunyikan tombol \'Postingan baru\' + Tombol postingan baru disembunyikan + Tombol postingan baru ditampilkan + Sembunyikan tombol hamparan terjeda + Tombol hamparan terjeda disembunyikan + Tombol hamparan terjeda ditampilkan + Sembunyikan pratinjau komentar + Pratinjau komentar disembunyikan + Pratinjau komentar ditampilkan + Sembunyikan tombol \'Simpan musik\' + Tombol simpan musik disembunyikan + Tombol simpan musik ditampilkan + Sembunyikan saran penelusuran + Saran penelusuran disembunyikan + Saran penelusuran ditampilkan + Sembunyikan tombol Belanja + Tombol belanja disembunyikan + Tombol belanja ditampilkan + Sembunyikan stiker + Stiker disembunyikan + Stiker ditampilkan + Sembunyikan tombol Berlangganan + Tombol berlangganan disembunyikan + Tombol berlangganan ditampilkan + Sembunyikan produk yang ditandai + Produk yang ditandai disembunyikan + Produk yang ditandai ditampilkan + Sembunyikan tombol Mendatang + Tombol yang akan datang disembunyikan + Tombol yang akan datang ditampilkan + Sembunyikan tombol \'Gunakan suara ini\' + Tombol gunakan suara ini disembunyikan + Tombol gunakan suara ini ditampilkan + Sembunyikan tombol \'Gunakan template ini\' + Tombol gunakan template ini disembunyikan + Tombol gunakan template ini ditampilkan + Sembunyikan tombol Suka yang memancar + Animasi tombol suka yang memancar disembunyikan + Animasi tombol suka yang memancar ditampilkan + Sembunyikan tombol Suka + Tombol suka disembunyikan + Tombol suka ditampilkan + Sembunyikan tombol Tidak Suka + Tombol tidak suka disembunyikan + Tombol tidak suka ditampilkan + Sembunyikan tombol Komentar + Tombol komentar disembunyikan + Tombol komentar ditampilkan + + Sembunyikan tombol Bagikan + Tombol bagikan disembunyikan + Tombol bagikan ditampilkan + + Sembunyikan tombol Remix + Tombol remix disembunyikan + Tombol remix ditampilkan + Sembunyikan tombol suara + Tombol suara disembunyikan + Tombol suara ditampilkan + Sembunyikan panel info + Panel info disembunyikan + Panel info ditampilkan + Sembunyikan bilah saluran + Bilah saluran disembunyikan + Bilah saluran ditampilkan + Sembunyikan judul video + Judul video disembunyikan + Judul video ditampilkan + Sembunyikan label metadata suara + Label metadata suara disembunyikan + Label metadata suara ditampilkan + Sembunyikan label tautan video + Label tautan video disembunyikan + Label tautan video ditampilkan + Sembunyikan bilah navigasi + Bilah navigasi disembunyikan + Bilah navigasi ditampilkan + + + Sembunyikan video yang disarankan di layar akhir + "Video yang disarankan di layar akhir disembunyikan saat pemutaran otomatis dimatikan Pemutaran otomatis dapat diubah di pengaturan YouTube: Pengaturan → Pemutaran → Putar otomatis video berikutnya" - Video yang disarankan di layar akhir ditampilkan - - - Sembunyikan hamparan video terkait - Hamparan video terkait dalam layar penuh disembunyikan - Hamparan video terkait dalam layar penuh ditampilkan - - - Sembunyikan penanda waktu video - Penanda waktu disembunyikan - Penanda waktu ditampilkan - - - Sembunyikan panel popup pemutar - Panel popup pemutar disembunyikan - Panel popup pemutar ditampilkan - - - Keluar dari mode layar penuh di akhir video - Nonaktif - Potret - Lanskap - Potret dan lanskap - - - Buka video dalam potret layar penuh - Video terbuka dalam layar penuh - Video tidak terbuka dalam layar penuh - - - Opasitas hamparan pemutar - Nilai opasitas antara 0-100, dimana 0 adalah transparan - Opasitas hamparan pemutar harus di antara 0-100 - - - - Dislike sementara tidak tersedia (waktu API habis) - Dislike tidak tersedia (status %d) - Dislike tidak tersedia (pembatasan API klien) - Dislike tidak tersedia (%s) - - Muat ulang video untuk memilih Return YouTube Dislike - - Disembunyikan oleh pemilik - Return YouTube Dislike - Dislike ditampilkan - Dislike tidak ditampilkan - Tampilkan dislike di Shorts - "Dislike pada Shorts ditampilkan + Video yang disarankan di layar akhir ditampilkan + + + Sembunyikan hamparan video terkait + Hamparan video terkait dalam layar penuh disembunyikan + Hamparan video terkait dalam layar penuh ditampilkan + + + Sembunyikan penanda waktu video + Penanda waktu disembunyikan + Penanda waktu ditampilkan + + + Sembunyikan panel popup pemutar + Panel popup pemutar disembunyikan + Panel popup pemutar ditampilkan + + + Keluar dari mode layar penuh di akhir video + Nonaktif + Potret + Lanskap + Potret dan lanskap + + + Buka video dalam potret layar penuh + Video terbuka dalam layar penuh + Video tidak terbuka dalam layar penuh + + + Opasitas hamparan pemutar + Nilai opasitas antara 0-100, dimana 0 adalah transparan + Opasitas hamparan pemutar harus di antara 0-100 + + + + Dislike sementara tidak tersedia (waktu API habis) + Dislike tidak tersedia (status %d) + Dislike tidak tersedia (pembatasan API klien) + Dislike tidak tersedia (%s) + + Muat ulang video untuk memilih Return YouTube Dislike + + Disembunyikan oleh pemilik + Return YouTube Dislike + Dislike ditampilkan + Dislike tidak ditampilkan + Tampilkan dislike di Shorts + "Dislike pada Shorts ditampilkan Batasan: Dislike mungkin tidak muncul dalam mode penyamaran" - Dislike pada Shorts tidak ditampilkan - Dislike sebagai persentase - Dislike ditampilkan sebagai persentase - Dislike ditampilkan sebagai angka - - Tombol Suka Ringkas - Tombol suka ditata untuk lebar minimum - Tombol suka ditata untuk tampilan terbaik - Tampilkan perkiraan suka - Video dengan suka yang dinonaktifkan menampilkan perkiraan jumlah suka - Perkiraan jumlah suka tidak ditampilkan - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia - Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia - ReturnYouTubeDislike.com - Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut - - Statistik API ReturnYoutubeDislike dari perangkat ini - Waktu respons API, rata-rata - Waktu respons API, minimum - Waktu respons API, maksimum - Waktu respons API, video terakhir - Dislike sementara tidak tersedia - Pembatasan tarif API klien berlaku - API mengambil vote, jumlah dari panggilan - Tidak ada panggilan jaringan yang terjadi - %d panggilan jaringan terjadi - API mengambil vote, jumlah dari waktu habis - Tidak ada panggilan jaringan yang kehabisan waktu - %d panggilan jaringan yang kehabisan waktu - Pembatasan tarif API klien - Tidak ada pembatasan tarif klien terjadi - Pembatasan tarif klien terjadi %d kali - %d milidetik - - - Aktifkan bilah pencarian lebar - Bilah pencarian lebar diaktifkan - Bilah pencarian lebar dinonaktifkan - - - Aktifkan thumbnail berkualitas tinggi - Thumbnail seekbar berkualitas tinggi - Thumbnail seekbar berkualitas sedang - Seekbar layar penuh memiliki thumbnail berkualitas tinggi - Seekbar layar penuh memiliki thumbnail berkualitas menengah - "Ini juga akan memulihkan thumbnail pada livestream yang tidak memiliki gambar mini seekbar. + Dislike pada Shorts tidak ditampilkan + Dislike sebagai persentase + Dislike ditampilkan sebagai persentase + Dislike ditampilkan sebagai angka + + Tombol Suka Ringkas + Tombol suka ditata untuk lebar minimum + Tombol suka ditata untuk tampilan terbaik + Tampilkan perkiraan suka + Video dengan suka yang dinonaktifkan menampilkan perkiraan jumlah suka + Perkiraan jumlah suka tidak ditampilkan + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia + Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia + ReturnYouTubeDislike.com + Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut + + Statistik API ReturnYoutubeDislike dari perangkat ini + Waktu respons API, rata-rata + Waktu respons API, minimum + Waktu respons API, maksimum + Waktu respons API, video terakhir + Dislike sementara tidak tersedia - Pembatasan tarif API klien berlaku + API mengambil vote, jumlah dari panggilan + Tidak ada panggilan jaringan yang terjadi + %d panggilan jaringan terjadi + API mengambil vote, jumlah dari waktu habis + Tidak ada panggilan jaringan yang kehabisan waktu + %d panggilan jaringan yang kehabisan waktu + Pembatasan tarif API klien + Tidak ada pembatasan tarif klien terjadi + Pembatasan tarif klien terjadi %d kali + %d milidetik + + + Aktifkan bilah pencarian lebar + Bilah pencarian lebar diaktifkan + Bilah pencarian lebar dinonaktifkan + + + Aktifkan thumbnail berkualitas tinggi + Thumbnail seekbar berkualitas tinggi + Thumbnail seekbar berkualitas sedang + Seekbar layar penuh memiliki thumbnail berkualitas tinggi + Seekbar layar penuh memiliki thumbnail berkualitas menengah + "Ini juga akan memulihkan thumbnail pada livestream yang tidak memiliki gambar mini seekbar. Thumbnail seekbar akan menggunakan kualitas yang sama dengan video saat ini. Fitur ini bekerja paling baik dengan kualitas video 720p atau lebih rendah dan saat menggunakan sambungan internet yang sangat cepat." - Pulihkan thumbnail seekbar yang lama - Thumbnail seekbar akan muncul di atas seekbar - Thumbnail seekbar akan muncul di layar penuh - - - SponsorBlock - Aktifkan SponsorBlock - SponsorBlock adalah sistem yang bersumber dari banyak orang untuk melewatkan bagian video YouTube yang mengganggu - Tampilan - Tampilkan tombol voting - Tombol segmen voting ditampilkan - Tombol segmen voting tidak ditampilkan - Gunakan tata letak persegi - Tombol dan kontrol berbentuk persegi - Tombol dan kontrol berbentuk bulat - - Gunakan tombol Lewati ringkas - Tombol lewati ditata untuk lebar minimum - Tombol lewati ditata untuk penampilan terbaik - Sembunyikan tombol Lewati secara otomatis - Tombol lewati disembunyikan setelah beberapa detik - Tombol Lewati ditampilkan untuk seluruh segmen - Durasi tombol Lewati - Berapa lama untuk menampilkan tombol lewati dan lewati ke sorotan sebelum bersembunyi secara otomatis - Tampilkan pembatalan pesan timbul lewati - Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Ketuk notifikasi pesan timbul untuk membatalkan lewati - Pesan timbul tidak ditampilkan - Durasi pesan timbul lewati - Berapa lama waktu yang dibutuhkan untuk menampilkan pembatalan pesan timbul - 1 detik - 2 detik - 3 detik - 4 detik - 5 detik - 6 detik - 7 detik - 8 detik - 9 detik - 10 detik - Tampilkan durasi video tanpa segmen - Durasi video tanpa semua segmen ditampilkan pada bilah pencarian - Durasi video penuh ditampilkan - Membuat segmen baru - Tampilkan tombol Buat segmen baru - Tombol buat segmen baru ditampilkan - Tombol buat segmen baru tidak ditampilkan - Sesuaikan langkah segmen baru - Jumlah milidetik tombol penyesuaian waktu bergerak saat membuat segmen baru - Nilainya harus berupa angka positif - Lihat pedoman - Pedoman berisi aturan dan saran untuk membuat segmen baru - Ikuti pedoman - Bacalah panduan SponsorBlock sebelum membuat segmen baru - Sudah dibaca - Tunjukkan - Umum - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul ditampilkan jika SponsorBlock tidak tersedia - Pesan timbul tidak ditampilkan jika SponsorBlock tidak tersedia - Aktifkan pelacakan melewati hitungan - Mengizinkan papan peringkat SponsorBlock mengetahui berapa banyak waktu yang dihemat. Pesan dikirim ke papan peringkat setiap kali sebuah segmen dilewati - Lewati pelacakan jumlah tidak diaktifkan - Durasi minimum segmen - Segmen yang lebih pendek pada dari nilai ini (detik) tidak akan ditampilkan atau dilewati - Durasi waktu tidak sah - ID pengguna pribadi Anda - Ini harus dijaga kerahasiaannya. Seperti kata sandi dan tidak disarankan untuk dibagikan dengan siapa pun. Jika seseorang mendapatkan ini, mereka dapat menyamar sebagai Anda - ID pengguna tidak boleh lebih dari 30 karakter - Ubah URL API - Alamat yang digunakan SponsorBlock untuk membuat panggilan ke server - Atur ulang URL API - URL API tidak sah - URL API diubah - Impor/Ekspor pengaturan - Salin - Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya - Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya, termasuk ID pengguna Anda. Pastikan untuk membagikannya dengan bijak - Pengaturan berhasil diimpor - Gagal mengimpor: %s - Gagal mengekspor: %s - "Pengaturan Anda berisi Id pengguna pribadi SponsorBlock. + Pulihkan thumbnail seekbar yang lama + Thumbnail seekbar akan muncul di atas seekbar + Thumbnail seekbar akan muncul di layar penuh + + + SponsorBlock + Aktifkan SponsorBlock + SponsorBlock adalah sistem yang bersumber dari banyak orang untuk melewatkan bagian video YouTube yang mengganggu + Tampilan + Tampilkan tombol voting + Tombol segmen voting ditampilkan + Tombol segmen voting tidak ditampilkan + Gunakan tata letak persegi + Tombol dan kontrol berbentuk persegi + Tombol dan kontrol berbentuk bulat + + Gunakan tombol Lewati ringkas + Tombol lewati ditata untuk lebar minimum + Tombol lewati ditata untuk penampilan terbaik + Sembunyikan tombol Lewati secara otomatis + Tombol lewati disembunyikan setelah beberapa detik + Tombol Lewati ditampilkan untuk seluruh segmen + Durasi tombol Lewati + Berapa lama untuk menampilkan tombol lewati dan lewati ke sorotan sebelum bersembunyi secara otomatis + Tampilkan pembatalan pesan timbul lewati + Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Ketuk notifikasi pesan timbul untuk membatalkan lewati + Pesan timbul tidak ditampilkan + Durasi pesan timbul lewati + Berapa lama waktu yang dibutuhkan untuk menampilkan pembatalan pesan timbul + 1 detik + 2 detik + 3 detik + 4 detik + 5 detik + 6 detik + 7 detik + 8 detik + 9 detik + 10 detik + Tampilkan durasi video tanpa segmen + Durasi video tanpa semua segmen ditampilkan pada bilah pencarian + Durasi video penuh ditampilkan + Membuat segmen baru + Tampilkan tombol Buat segmen baru + Tombol buat segmen baru ditampilkan + Tombol buat segmen baru tidak ditampilkan + Sesuaikan langkah segmen baru + Jumlah milidetik tombol penyesuaian waktu bergerak saat membuat segmen baru + Nilainya harus berupa angka positif + Lihat pedoman + Pedoman berisi aturan dan saran untuk membuat segmen baru + Ikuti pedoman + Bacalah panduan SponsorBlock sebelum membuat segmen baru + Sudah dibaca + Tunjukkan + Umum + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul ditampilkan jika SponsorBlock tidak tersedia + Pesan timbul tidak ditampilkan jika SponsorBlock tidak tersedia + Aktifkan pelacakan melewati hitungan + Mengizinkan papan peringkat SponsorBlock mengetahui berapa banyak waktu yang dihemat. Pesan dikirim ke papan peringkat setiap kali sebuah segmen dilewati + Lewati pelacakan jumlah tidak diaktifkan + Durasi minimum segmen + Segmen yang lebih pendek pada dari nilai ini (detik) tidak akan ditampilkan atau dilewati + Durasi waktu tidak sah + ID pengguna pribadi Anda + Ini harus dijaga kerahasiaannya. Seperti kata sandi dan tidak disarankan untuk dibagikan dengan siapa pun. Jika seseorang mendapatkan ini, mereka dapat menyamar sebagai Anda + ID pengguna tidak boleh lebih dari 30 karakter + Ubah URL API + Alamat yang digunakan SponsorBlock untuk membuat panggilan ke server + Atur ulang URL API + URL API tidak sah + URL API diubah + Impor/Ekspor pengaturan + Salin + Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya + Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya, termasuk ID pengguna Anda. Pastikan untuk membagikannya dengan bijak + Pengaturan berhasil diimpor + Gagal mengimpor: %s + Gagal mengekspor: %s + "Pengaturan Anda berisi Id pengguna pribadi SponsorBlock. Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan." - Jangan tampilkan lagi - Ubah perilaku segmen - Sponsor - Promosi berbayar, rujukan berbayar, dan iklan langsung. Bukan untuk promosi diri atau promosi gratis untuk gerakan/kreator/situs web/produk yang mereka sukai - Tidak Dibayar/Promosi Diri Sendiri - Serupa dengan Sponsor kecuali tidak dibayar atau promosi diri sendiri. Termasuk bagian merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka - Pengingat Interaksi (Berlangganan) - Pengingat singkat untuk menyukai, berlangganan, atau mengikuti mereka di tengah-tengah konten. Jika berdurasi panjang atau tentang sesuatu yang spesifik, sebaiknya berada di bawah promosi diri sendiri - Sorotan - Bagian video yang paling dilihat oleh orang - Jeda/Animasi Intro - Interval tanpa konten yang sebenarnya. Bisa berupa jeda, bingkai statis, atau animasi berulang. Tidak termasuk transisi yang berisi informasi - Kartu Akhir / Kredit - Kredit atau ketika layar akhir YouTube muncul. Bukan kesimpulan dengan informasi - Pengantar / Sapaan - Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan - Pratinjau / Rekap - Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain - Singgungan / Lelucon - Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang - Musik: Bagian Non-Musik - Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain - Lewati - Sorotan - Lewati sponsor - Lewati promo - Lewati interaksi - Lewati ke sorotan - Lewati intro - Lewati jeda - Lewati jeda - Lewati outro - Lewati pengantar - Lewati pratinjau - Lewati pratinjau - Lewati rekap - Lewati singgungan - Lewati non-musik - Lewati segmen - Sponsor dilewati - Promosi diri sendiri dilewati - Pengingat mengganggu dilewati - Dilewati ke sorotan - Intro dilewati - Jeda dilewati - Jeda dilewati - Outro dilewati - Sapaan dilewati - Pratinjau dilewati - Pratinjau dilewati - Rekap dilewati - Singgungan dilewati - Melewati bagian non-musik - Melewati segmen yang belum dikirim - Beberapa segmen dilewati - Lewati otomatis - Lewati otomatis sekali - Tampilkan tombol Lewati - Tampilkan di seekbar - Nonaktifkan - Tak dapat mengirim segmen: %s - SponsorBlock sementara tidak tersedia - Tak dapat mengirim segmen (status: %1$d %2$s) - Tidak dapat mengirimkan segmen. Rate Limited (terlalu banyak dari pengguna atau IP yang sama) - Tidak dapat mengirim segmen: %s - "Tidak dapat mengirimkan segmen. + Jangan tampilkan lagi + Ubah perilaku segmen + Sponsor + Promosi berbayar, rujukan berbayar, dan iklan langsung. Bukan untuk promosi diri atau promosi gratis untuk gerakan/kreator/situs web/produk yang mereka sukai + Tidak Dibayar/Promosi Diri Sendiri + Serupa dengan Sponsor kecuali tidak dibayar atau promosi diri sendiri. Termasuk bagian merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka + Pengingat Interaksi (Berlangganan) + Pengingat singkat untuk menyukai, berlangganan, atau mengikuti mereka di tengah-tengah konten. Jika berdurasi panjang atau tentang sesuatu yang spesifik, sebaiknya berada di bawah promosi diri sendiri + Sorotan + Bagian video yang paling dilihat oleh orang + Jeda/Animasi Intro + Interval tanpa konten yang sebenarnya. Bisa berupa jeda, bingkai statis, atau animasi berulang. Tidak termasuk transisi yang berisi informasi + Kartu Akhir / Kredit + Kredit atau ketika layar akhir YouTube muncul. Bukan kesimpulan dengan informasi + Pengantar / Sapaan + Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan + Pratinjau / Rekap + Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain + Singgungan / Lelucon + Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang + Musik: Bagian Non-Musik + Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain + Lewati + Sorotan + Lewati sponsor + Lewati promo + Lewati interaksi + Lewati ke sorotan + Lewati intro + Lewati jeda + Lewati jeda + Lewati outro + Lewati pengantar + Lewati pratinjau + Lewati pratinjau + Lewati rekap + Lewati singgungan + Lewati non-musik + Lewati segmen + Sponsor dilewati + Promosi diri sendiri dilewati + Pengingat mengganggu dilewati + Dilewati ke sorotan + Intro dilewati + Jeda dilewati + Jeda dilewati + Outro dilewati + Sapaan dilewati + Pratinjau dilewati + Pratinjau dilewati + Rekap dilewati + Singgungan dilewati + Melewati bagian non-musik + Melewati segmen yang belum dikirim + Beberapa segmen dilewati + Lewati otomatis + Lewati otomatis sekali + Tampilkan tombol Lewati + Tampilkan di seekbar + Nonaktifkan + Tak dapat mengirim segmen: %s + SponsorBlock sementara tidak tersedia + Tak dapat mengirim segmen (status: %1$d %2$s) + Tidak dapat mengirimkan segmen. Rate Limited (terlalu banyak dari pengguna atau IP yang sama) + Tidak dapat mengirim segmen: %s + "Tidak dapat mengirimkan segmen. Sudah ada" - Segmen berhasil terkirim - - SponsorBlock tidak tersedia (API kehabisan waktu) - SponsorBlock sementara tidak tersedia (status %d) - SponsorBlock sementara tidak tersedia - Tidak dapat memilih segmen (API kehabisan waktu) - Tidak dapat memilih segmen (status: %1$d %2$s) - Tidak dapat memilih segmen: %s - Sukai - Tidak sukai - Ubah kategori - Tidak ada segmen untuk dipilih - - %1$s ke %2$s - Pilih kategori segmen - Kategori dinonaktifkan di pengaturan. Aktifkan kategori untuk dikirim. - Segmen SponsorBlock Baru - Tetapkan %s sebagai awal atau akhir segmen baru? - Mulai - Akhir - Sekarang - Waktu segmen dimulai pada - Waktu segmen diakhiri pada - Apakah waktunya benar? - "Bagian ini terdiri dari + Segmen berhasil terkirim + + SponsorBlock tidak tersedia (API kehabisan waktu) + SponsorBlock sementara tidak tersedia (status %d) + SponsorBlock sementara tidak tersedia + Tidak dapat memilih segmen (API kehabisan waktu) + Tidak dapat memilih segmen (status: %1$d %2$s) + Tidak dapat memilih segmen: %s + Sukai + Tidak sukai + Ubah kategori + Tidak ada segmen untuk dipilih + + %1$s ke %2$s + Pilih kategori segmen + Kategori dinonaktifkan di pengaturan. Aktifkan kategori untuk dikirim. + Segmen SponsorBlock Baru + Tetapkan %s sebagai awal atau akhir segmen baru? + Mulai + Akhir + Sekarang + Waktu segmen dimulai pada + Waktu segmen diakhiri pada + Apakah waktunya benar? + "Bagian ini terdiri dari %1$s sampai @@ -1291,47 +1290,47 @@ sampai (%3$s) Siap mengirim?" - Awal harus sebelum akhir - Tandai dua lokasi pada bilah waktu terlebih dahulu - Pratinjau segmen, dan pastikan segmen dilewati dengan lancar - Ubah waktu segmen secara manual - Apakah Anda ingin menubah waktu awal atau akhir segmen? - Waktu yang diberikan tidak sah - Statistik - - Statistik sementara tidak tersedia (API tidak aktif) - Memuat... - SponsorBlock dinonaktifkan - Nama pengguna Anda: <b>%s</b> - Tekan di sini untuk mengubah nama pengguna Anda - Tidak dapat mengubah nama pengguna: Status: %1$d %2$s - Nama pengguna berhasil diubah - Reputasi Anda: <b>%.2f</b> - Anda telah membuat <b>%s</b> segmen - Ketuk di sini untuk melihat segmen Anda - Papan peringkat SponsorBlock - Anda menghindarkan orang dari <b>%s</b> segmen - Tekan di sini untuk melihat data global dan kontributor utama - Itu <b>%s</b> dari hidup mereka.<br>Tekan di sini untuk melihat papan peringkat - Anda melewati <b>%s</b> segmen - Itu <b>%s</b> - Atur ulang penghitungan segmen terlewati? - %1$s jam %2$s menit - %1$s menit %2$s detik - %s detik - Opasitas: - Warna: - Tentang - sponsor.ajay.app - Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain - - - Faktor bentuk tata letak - Bawaan - Ponsel - Tablet - Otomotif - "Perubahan meliputi: + Awal harus sebelum akhir + Tandai dua lokasi pada bilah waktu terlebih dahulu + Pratinjau segmen, dan pastikan segmen dilewati dengan lancar + Ubah waktu segmen secara manual + Apakah Anda ingin menubah waktu awal atau akhir segmen? + Waktu yang diberikan tidak sah + Statistik + + Statistik sementara tidak tersedia (API tidak aktif) + Memuat... + SponsorBlock dinonaktifkan + Nama pengguna Anda: <b>%s</b> + Tekan di sini untuk mengubah nama pengguna Anda + Tidak dapat mengubah nama pengguna: Status: %1$d %2$s + Nama pengguna berhasil diubah + Reputasi Anda: <b>%.2f</b> + Anda telah membuat <b>%s</b> segmen + Ketuk di sini untuk melihat segmen Anda + Papan peringkat SponsorBlock + Anda menghindarkan orang dari <b>%s</b> segmen + Tekan di sini untuk melihat data global dan kontributor utama + Itu <b>%s</b> dari hidup mereka.<br>Tekan di sini untuk melihat papan peringkat + Anda melewati <b>%s</b> segmen + Itu <b>%s</b> + Atur ulang penghitungan segmen terlewati? + %1$s jam %2$s menit + %1$s menit %2$s detik + %s detik + Opasitas: + Warna: + Tentang + sponsor.ajay.app + Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain + + + Faktor bentuk tata letak + Bawaan + Ponsel + Tablet + Otomotif + "Perubahan meliputi: Tata letak tablet • Postingan komunitas disembunyikan @@ -1339,329 +1338,329 @@ Tata letak tablet Tata letak otomotif • Shorts dibuka di pemutar biasa • Umpan diatur berdasarkan topik dan channel" - - - Palsukan versi app - Versi yang dipalsukan - Versi asli - "Versi aplikasi akan dipalsukan ke versi lama YouTube. + + + Palsukan versi app + Versi yang dipalsukan + Versi asli + "Versi aplikasi akan dipalsukan ke versi lama YouTube. Ini akan mengubah tampilan dan fitur aplikasi, tetapi efek samping yang tidak diketahui dapat terjadi. Jika kemudian dimatikan, disarankan untuk menghapus data aplikasi untuk mencegah bug UI." - Target versi app yang dipalsukan - 20.13.41 - Pulihkan bilah tindakan video yang tidak diciutkan - 20.05.46 - Pulihkan fungsionalitas transkrip - 19.35.36 - Pulihkan ikon pemutar Shorts lama - 19.01.34 - Pulihkan ikon navigasi lama - - - Ubah halaman awal - Bawaan - Semua langganan - Jelajahi saluran - Kursus / Pembelajaran - Jelajahi - Fashion & Kecantikan - Permainan - Riwayat - Pustaka - Video yang disukai - Siaran langsunng - Film - Musik - Berita - Pemberitahuan - Daftar Putar - Pencarian - Belanja - Shorts - Olahraga - Langganan - Sedang tren - Realitas Virtual - Tonton nanti - Klip Anda - Selalu ubah halaman awal - "Halaman awal selalu diubah + Target versi app yang dipalsukan + 20.13.41 - Pulihkan bilah tindakan video yang tidak diciutkan + 20.05.46 - Pulihkan fungsionalitas transkrip + 19.35.36 - Pulihkan ikon pemutar Shorts lama + 19.01.34 - Pulihkan ikon navigasi lama + + + Ubah halaman awal + Bawaan + Semua langganan + Jelajahi saluran + Kursus / Pembelajaran + Jelajahi + Fashion & Kecantikan + Permainan + Riwayat + Pustaka + Video yang disukai + Siaran langsunng + Film + Musik + Berita + Pemberitahuan + Daftar Putar + Pencarian + Belanja + Shorts + Olahraga + Langganan + Sedang tren + Realitas Virtual + Tonton nanti + Klip Anda + Selalu ubah halaman awal + "Halaman awal selalu diubah Batasan: Menggunakan tombol kembali pada toolbar mungkin tidak berfungsi" - Halaman awal hanya diubah saat aplikasi dimulai - - - Matikan melanjutkan pemutar video Shorts - Pemutaran Shorts tidak akan dilanjutkan saat aplikasi dimulai - Pemutaran Shorts akan dilanjutkan saat aplikasi dimulai - - - Buka Shorts dengan - Pemutar Shorts - Pemutar biasa - Pemutar biasa layar penuh - - - Putar otomatis Shorts - Shorts akan diputar otomatis - Shorts akan diulangi - Putar otomatis Shorts di latar belakang - Pemutaran latar belakang Shorts akan diputar otomatis - Pemutaran latar belakang Shorts akan diulangi - - - Pemutar Mini - Ubah gaya pemutar mini dalam aplikasi - Jenis pemutar mini - Nonaktif - Bawaan - Minimal - Tablet - Modern 1 - Modern 2 - Modern 3 - Modern 4 - Nonaktifkan sudut membulat - Sudutnya persegi - Sudutnya membulat - Aktifkan ketuk dua kali dan cubit untuk mengubah ukuran - "Tindakan ketuk dua kali dan cubit untuk mengubah ukuran diaktifkan + Halaman awal hanya diubah saat aplikasi dimulai + + + Matikan melanjutkan pemutar video Shorts + Pemutaran Shorts tidak akan dilanjutkan saat aplikasi dimulai + Pemutaran Shorts akan dilanjutkan saat aplikasi dimulai + + + Buka Shorts dengan + Pemutar Shorts + Pemutar biasa + Pemutar biasa layar penuh + + + Putar otomatis Shorts + Shorts akan diputar otomatis + Shorts akan diulangi + Putar otomatis Shorts di latar belakang + Pemutaran latar belakang Shorts akan diputar otomatis + Pemutaran latar belakang Shorts akan diulangi + + + Pemutar Mini + Ubah gaya pemutar mini dalam aplikasi + Jenis pemutar mini + Nonaktif + Bawaan + Minimal + Tablet + Modern 1 + Modern 2 + Modern 3 + Modern 4 + Nonaktifkan sudut membulat + Sudutnya persegi + Sudutnya membulat + Aktifkan ketuk dua kali dan cubit untuk mengubah ukuran + "Tindakan ketuk dua kali dan cubit untuk mengubah ukuran diaktifkan • Ketuk dua kali untuk memperbesar ukuran miniplayer • Ketuk dua kali lagi untuk mengembalikan ukuran asli" - Tindakan ketuk dua kali dan cubit untuk mengubah ukuran dinonaktifkan - Nonaktifkan seret dan lepas - Seret dan lepas dinonaktifkan - "Seret dan lepas diaktifkan + Tindakan ketuk dua kali dan cubit untuk mengubah ukuran dinonaktifkan + Nonaktifkan seret dan lepas + Seret dan lepas dinonaktifkan + "Seret dan lepas diaktifkan Miniplayer dapat diseret ke sudut layar mana pun" - Nonaktifkan gerakan seret horizontal - Gerakan seret horizontal dinonaktifkan - "Gerakan seret horizontal diaktifkan + Nonaktifkan gerakan seret horizontal + Gerakan seret horizontal dinonaktifkan + "Gerakan seret horizontal diaktifkan Miniplayer dapat diseret keluar layar ke kiri atau kanan" - Sembunyikan tombol hamparan - Tombol hamparan disembunyikan - Tombol hamparan ditampilkan - Sembunyikan tombol perluas dan tutup - "Tombol disembunyikan + Sembunyikan tombol hamparan + Tombol hamparan disembunyikan + Tombol hamparan ditampilkan + Sembunyikan tombol perluas dan tutup + "Tombol disembunyikan Seret untuk memperluas atau menutup" - Tombol perluas dan tutup ditampilkan - Sembunyikan subteks - Subteks disembunyikan - Subteks ditampilkan - Sembunyikan tombol maju dan mundur - Lewati maju dan mundur disembunyikan - Lewati maju dan mundur ditampilkan - Ukuran awal - Awal pada ukuran layar, dalam piksel - Ukuran piksel harus antara %1$s dan %2$s - Opasitas hamparan - Nilai opasitas antara 0-100, dimana 0 adalah transparan - Opasitas hamparan pemutar mini antara 0-100 - - - Aktifkan layar pemuatan gradien - Layar pemuatan akan memiliki latar belakang gradien - Layar pemuatan akan memiliki latar belakang yang solid - Gaya layar pembuka - Berwarna - Hitam dan putih - Aktifkan warna seekbar khusus - Warna seekbar khusus ditampilkan - Warna seekbar asli ditampilkan - Warna seekbar khusus - Warna seekbar - Warna aksen seekbar khusus - Warna aksen seekbar - Nilai warna seekbar tidak sah - - - YouTube ReVanced - YT ReVanced - YT - - - Logo Header - Bawaan - Reguler - Premium - ReVanced - - ReVanced minimal - Khusus - - - Abaikan pembatasan wilayah gambar - Menggunakan sumber gambar yt4.ggpht.com - "Menggunakan host gambar asli + Tombol perluas dan tutup ditampilkan + Sembunyikan subteks + Subteks disembunyikan + Subteks ditampilkan + Sembunyikan tombol maju dan mundur + Lewati maju dan mundur disembunyikan + Lewati maju dan mundur ditampilkan + Ukuran awal + Awal pada ukuran layar, dalam piksel + Ukuran piksel harus antara %1$s dan %2$s + Opasitas hamparan + Nilai opasitas antara 0-100, dimana 0 adalah transparan + Opasitas hamparan pemutar mini antara 0-100 + + + Aktifkan layar pemuatan gradien + Layar pemuatan akan memiliki latar belakang gradien + Layar pemuatan akan memiliki latar belakang yang solid + Gaya layar pembuka + Berwarna + Hitam dan putih + Aktifkan warna seekbar khusus + Warna seekbar khusus ditampilkan + Warna seekbar asli ditampilkan + Warna seekbar khusus + Warna seekbar + Warna aksen seekbar khusus + Warna aksen seekbar + Nilai warna seekbar tidak sah + + + YouTube ReVanced + YT ReVanced + YT + + + Logo Header + Bawaan + Reguler + Premium + ReVanced + + ReVanced minimal + Khusus + + + Abaikan pembatasan wilayah gambar + Menggunakan sumber gambar yt4.ggpht.com + "Menggunakan host gambar asli Mengaktifkan ini dapat memperbaiki gambar yang hilang yang diblokir di beberapa wilayah" - - - - Tab beranda - - Bilah Langganan - - Tab Anda - Daftar putar & rekomendasi pemutar - Hasil pencarian - Thumbnail asli - DeArrow & Thumbnail asli - DeArrow & Tangkapan diam - Tangkapan diam - DeArrow - "DeArrow menyediakan gambar mini crowdsourced untuk video YouTube. Gambar mini ini seringkali lebih relevan daripada yang disediakan oleh YouTube + + + + Tab beranda + + Bilah Langganan + + Tab Anda + Daftar putar & rekomendasi pemutar + Hasil pencarian + Thumbnail asli + DeArrow & Thumbnail asli + DeArrow & Tangkapan diam + Tangkapan diam + DeArrow + "DeArrow menyediakan gambar mini crowdsourced untuk video YouTube. Gambar mini ini seringkali lebih relevan daripada yang disediakan oleh YouTube Jika diaktifkan, URL video akan dikirim ke server API dan tidak ada data lain yang dikirim. Jika video tidak memiliki gambar mini DeArrow, maka gambar asli atau tangkapan statis yang ditampilkan Ketuk di sini untuk mempelajari lebih lanjut tentang DeArrow" - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul ditampilkan jika DeArrow tidak tersedia - Pesan timbul tidak ditampilkan jika DeArrow tidak tersedia - Titik akhir API DeArrow - URL titik akhir cache thumbnail DeArrow - Tangkapan video diam - Tangkapan diam diambil dari awal/tengah/akhir setiap video. Gambar-gambar ini dibuat di YouTube dan tidak ada API eksternal yang digunakan - Gunakan tangkapan diam cepat - Menggunakan tangkapan diam kualitas sedang. Thumbnail akan dimuat lebih cepat, tetapi siaran langsung, video yang belum dirilis, atau video yang sangat lama mungkin menampilkan thumbnail kosong - Menggunakan tangkapan diam berkualitas tinggi - Waktu video untuk mengambil gambar diam - Awal video - Pertengahan video - Akhir video - - DeArrow sementara tidak tersedia (kode status: %s) - DeArrow sementara tidak tersedia - - - Tampilkan pengumuman ReVanced - Pengumuman saat memulai ditampilkan - Pengumuman saat memulai tidak ditampilkan - Tampilkan pengumuman saat memulai - Gagal menghubungkan ke penyedia pengumuman - Abaikan - - - Aktifkan pengulangan video - Video akan diulangi - Video tidak akan diulangi - - - Tampilkan tombol pengulangan video - Tombol ditampilkan - Tombol tidak ditampilkan - Pengulangan video aktif - Pengulangan video tidak aktif - - - Jeda saat terjadi gangguan audio - Pemutaran terjeda saat audio lain diputar (mis. navigasi) - Volume berkurang saat audio lain diputar - - - Palsukan dimensi perangkat - "Dimensi perangkat dipalsukan + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul ditampilkan jika DeArrow tidak tersedia + Pesan timbul tidak ditampilkan jika DeArrow tidak tersedia + Titik akhir API DeArrow + URL titik akhir cache thumbnail DeArrow + Tangkapan video diam + Tangkapan diam diambil dari awal/tengah/akhir setiap video. Gambar-gambar ini dibuat di YouTube dan tidak ada API eksternal yang digunakan + Gunakan tangkapan diam cepat + Menggunakan tangkapan diam kualitas sedang. Thumbnail akan dimuat lebih cepat, tetapi siaran langsung, video yang belum dirilis, atau video yang sangat lama mungkin menampilkan thumbnail kosong + Menggunakan tangkapan diam berkualitas tinggi + Waktu video untuk mengambil gambar diam + Awal video + Pertengahan video + Akhir video + + DeArrow sementara tidak tersedia (kode status: %s) + DeArrow sementara tidak tersedia + + + Tampilkan pengumuman ReVanced + Pengumuman saat memulai ditampilkan + Pengumuman saat memulai tidak ditampilkan + Tampilkan pengumuman saat memulai + Gagal menghubungkan ke penyedia pengumuman + Abaikan + + + Aktifkan pengulangan video + Video akan diulangi + Video tidak akan diulangi + + + Tampilkan tombol pengulangan video + Tombol ditampilkan + Tombol tidak ditampilkan + Pengulangan video aktif + Pengulangan video tidak aktif + + + Jeda saat terjadi gangguan audio + Pemutaran terjeda saat audio lain diputar (mis. navigasi) + Volume berkurang saat audio lain diputar + + + Palsukan dimensi perangkat + "Dimensi perangkat dipalsukan Kualitas video yang lebih tinggi mungkin tidak terkunci, tetapi Anda mungkin mengalami masalah pemutaran video, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui" - "Dimensi perangkat tidak dipalsukan + "Dimensi perangkat tidak dipalsukan Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi" - Mengaktifkan ini dapat menyebabkan pemutaran video tersendat-sendat, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui. - - - Umpan balik sentuh getar - Ubah umpan balik sentuh getar - Nonaktifkan sentuh getar bab - Sentuh getar bab dinonaktifkan - Sentuh getar bab diaktifkan - Nonaktifkan sentuh getar pencarian presisi - Sentuh getar pencarian presisi dinonaktifkan - Sentuh getar pencarian presisi diaktifkan - Nonaktifkan sentuh getar urungkan pencarian - Sentuh getar urungkan pencarian dinonaktifkan - Sentuh getar urungkan pencarian diaktifkan - Matikan sentuh getar zoom - Sentuh getar zoom dinonaktifkan - Sentuh getar zoom diaktifkan - - - Jika Anda baru saja mengubah detail login akun Anda, hapus pemasangan dan ulangi memasang MicroG. - - - Abaikan pengalihan URL - Pengalihan URL diabaikan - Pengalihan URL tidak diabaikan - - - Buka tautan di peramban - Membuka tautan di peramban eksternal - Membuka tautan di peramban dalam aplikasi - - - - Otomatis - Ingat perubahan kualitas video - Perubahan kualitas diatur ke semua video - Perubahan kualitas hanya diatur di video saat ini - Tampilkan pesan timbul saat kualitas video berubah - Pesan timbul ditampilkan saat kualitas video bawaan diubah - Pesan timbul tidak ditampilkan saat kualitas video bawaan diubah - Kualitas video bawaan di jaringan Wi-Fi - Kualitas video bawaan di jaringan selular - Ingat perubahan kualitas Shorts - Perubahan kualitas berlaku untuk semua Shorts - Perubahan kualitas hanya berlaku untuk Short saat ini - Kualitas Shorts bawaan di jaringan Wi-Fi - Kualitas Shorts bawaan di jaringan seluler - seluler - wifi - Kualitas bawaan %1$s diubah ke: %2$s - Kualitas Shorts %1$s diubah menjadi: %2$s - - - Tampilkan tombol dialog kecepatan - Tombol dialog kecepatan ditampilkan. Ketuk dan tahan untuk mengatur ulang kecepatan pemutaran ke bawaan - Tombol dialog kecepatan tidak ditampilkan - - - Tampilkan tombol kualitas video - Tombol kualitas video ditampilkan. Ketuk dan tahan untuk mengatur ulang kualitas ke bawaan - Tombol kualitas video tidak ditampilkan - - - Menu kecepatan pemutaran khusus - Menu kecepatan khusus ditampilkan - Menu kecepatan khusus tidak ditampilkan - Pulihkan menu kecepatan pemutaran lama - Menu kecepatan lama ditampilkan - Menu kecepatan modern ditampilkan - Kecepatan pemutaran khusus - Tambah atau ubah kecepatan pemutaran khusus - Kecepatan khusus harus kurang dari %s - Kecepatan pemutaran khusus tidak valid - Otomatis - Kecepatan ketuk dan tahan khusus - Kecepatan pemutaran antara 0-8 - - - Ingat perubahan kecepatan pemutaran - Perubahan kecepatan pemutaran berlaku untuk semua video - Perubahan kecepatan pemutaran berlaku untuk video saat ini - Tampilkan pesan timbul saat kecepatan pemutaran berubah - Pesan timbul ditampilkan saat kecepatan pemutaran bawaan diubah - Pesan timbul tidak ditampilkan ketika kecepatan pemutaran bawaan diubah - Kecepatan pemutaran bawaan - Mengubah kecepatan bawaan menjadi: %s - - - Nonaktifkan video HDR - Video HDR dinonaktifkan - Video HDR diaktifkan - Paksa AVC (H.264) - Codec video dipaksa ke AVC (H.264) - Codec video ditentukan secara otomatis - "Manfaat: + Mengaktifkan ini dapat menyebabkan pemutaran video tersendat-sendat, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui. + + + Umpan balik sentuh getar + Ubah umpan balik sentuh getar + Nonaktifkan sentuh getar bab + Sentuh getar bab dinonaktifkan + Sentuh getar bab diaktifkan + Nonaktifkan sentuh getar pencarian presisi + Sentuh getar pencarian presisi dinonaktifkan + Sentuh getar pencarian presisi diaktifkan + Nonaktifkan sentuh getar urungkan pencarian + Sentuh getar urungkan pencarian dinonaktifkan + Sentuh getar urungkan pencarian diaktifkan + Matikan sentuh getar zoom + Sentuh getar zoom dinonaktifkan + Sentuh getar zoom diaktifkan + + + Jika Anda baru saja mengubah detail login akun Anda, hapus pemasangan dan ulangi memasang MicroG. + + + Abaikan pengalihan URL + Pengalihan URL diabaikan + Pengalihan URL tidak diabaikan + + + Buka tautan di peramban + Membuka tautan di peramban eksternal + Membuka tautan di peramban dalam aplikasi + + + + Otomatis + Ingat perubahan kualitas video + Perubahan kualitas diatur ke semua video + Perubahan kualitas hanya diatur di video saat ini + Tampilkan pesan timbul saat kualitas video berubah + Pesan timbul ditampilkan saat kualitas video bawaan diubah + Pesan timbul tidak ditampilkan saat kualitas video bawaan diubah + Kualitas video bawaan di jaringan Wi-Fi + Kualitas video bawaan di jaringan selular + Ingat perubahan kualitas Shorts + Perubahan kualitas berlaku untuk semua Shorts + Perubahan kualitas hanya berlaku untuk Short saat ini + Kualitas Shorts bawaan di jaringan Wi-Fi + Kualitas Shorts bawaan di jaringan seluler + seluler + wifi + Kualitas bawaan %1$s diubah ke: %2$s + Kualitas Shorts %1$s diubah menjadi: %2$s + + + Tampilkan tombol dialog kecepatan + Tombol dialog kecepatan ditampilkan. Ketuk dan tahan untuk mengatur ulang kecepatan pemutaran ke bawaan + Tombol dialog kecepatan tidak ditampilkan + + + Tampilkan tombol kualitas video + Tombol kualitas video ditampilkan. Ketuk dan tahan untuk mengatur ulang kualitas ke bawaan + Tombol kualitas video tidak ditampilkan + + + Menu kecepatan pemutaran khusus + Menu kecepatan khusus ditampilkan + Menu kecepatan khusus tidak ditampilkan + Pulihkan menu kecepatan pemutaran lama + Menu kecepatan lama ditampilkan + Menu kecepatan modern ditampilkan + Kecepatan pemutaran khusus + Tambah atau ubah kecepatan pemutaran khusus + Kecepatan khusus harus kurang dari %s + Kecepatan pemutaran khusus tidak valid + Otomatis + Kecepatan ketuk dan tahan khusus + Kecepatan pemutaran antara 0-8 + + + Ingat perubahan kecepatan pemutaran + Perubahan kecepatan pemutaran berlaku untuk semua video + Perubahan kecepatan pemutaran berlaku untuk video saat ini + Tampilkan pesan timbul saat kecepatan pemutaran berubah + Pesan timbul ditampilkan saat kecepatan pemutaran bawaan diubah + Pesan timbul tidak ditampilkan ketika kecepatan pemutaran bawaan diubah + Kecepatan pemutaran bawaan + Mengubah kecepatan bawaan menjadi: %s + + + Nonaktifkan video HDR + Video HDR dinonaktifkan + Video HDR diaktifkan + Paksa AVC (H.264) + Codec video dipaksa ke AVC (H.264) + Codec video ditentukan secara otomatis + "Manfaat: • Dapat meningkatkan daya tahan baterai • Dapat memulihkan resolusi video yang hilang pada perangkat lama @@ -1670,182 +1669,182 @@ Batasan: • Pemutaran video akan menggunakan lebih banyak data internet dibandingkan VP9 atau AV1 • Video HDR tidak akan menggunakan AVC • Beberapa perangkat tidak dapat memaksakan AVC" - - - Tampilkan menu kualitas video lanjutan - Menu kualitas video lanjutan ditampilkan - Menu kualitas video lanjutan tidak ditampilkan - - - Aktifkan geser untuk mencari - Geser untuk mencari diaktifkan - Geser untuk mencari tidak diaktifkan - - - Izinkan Android VR AV1 - "Codec video adalah AVC (H.264), VP9, atau AV1 + + + Tampilkan menu kualitas video lanjutan + Menu kualitas video lanjutan ditampilkan + Menu kualitas video lanjutan tidak ditampilkan + + + Aktifkan geser untuk mencari + Geser untuk mencari diaktifkan + Geser untuk mencari tidak diaktifkan + + + Izinkan Android VR AV1 + "Codec video adalah AVC (H.264), VP9, atau AV1 Pemutaran mungkin tersendat atau kehilangan bingkai" - Codec video adalah AVC (H.264) atau VP9 - "Mengaktifkan pengaturan ini mungkin menggunakan perangkat lunak decoding AV1. + Codec video adalah AVC (H.264) atau VP9 + "Mengaktifkan pengaturan ini mungkin menggunakan perangkat lunak decoding AV1. Pemutaran video dengan AV1 mungkin tersendat atau kehilangan bingkai." - Efek samping pemalsuan - • Klien eksperimental dan dapat berhenti berfungsi kapan saja - • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah - • Menu trek audio hilang - • Tidak ada codec video AV1 - • Volume stabil tidak tersedia - • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran - - • Paksa audio asli tidak tersedia - Tampilkan di Statistik untuk nerds - Jenis klien ditampilkan di Statistik untuk nerds - Klien disembunyikan di Statistik untuk nerds - - - - - YT Musik ReVanced - Musik ReVanced - Musik - - - Tentang - Iklan - Umum - Pemutar - Lain-lain - - - Sembunyikan iklan video - Iklan video disembunyikan - Iklan video ditampilkan - - - Aktifkan pengulangan permanen - Pengulangan permanen diaktifkan - Pengulangan permanen dinonaktifkan - - - Sembunyikan tombol transmisi - Tombol transmisi disembunyikan - Tombol transmisi ditampilkan - Sembunyikan tombol Riwayat - Tombol Riwayat disembunyikan - Tombol Riwayat ditampilkan - Sembunyikan tombol notifikasi - Tombol notifikasi disembunyikan - Tombol notifikasi ditampilkan - Sembunyikan tombol pencarian - Tombol pencarian disembunyikan - Tombol pencarian ditampilkan - - - Sembunyikan bilah kategori - Bilah kategori disembunyikan - Bilah kategori ditampilkan - - - Ubah warna pemutar mini - Warna pemutar mini sesuai dengan pemutar layar penuh - Pemutar mini menggunakan warna standar - - - Bilah navigasi - Sembunyikan atau ubah tombol bilah navigasi - - Sembunyikan Beranda - Tombol Beranda disembunyikan - Tombol Beranda ditampilkan - - Sembunyikan Sampel - Tombol Sampel disembunyikan - Tombol Sampel ditampilkan - - Sembunyikan Jelajahi - Tombol Jelajahi disembunyikan - Tombol Jelajahi ditampilkan - - Sembunyikan Pustaka - Tombol Pustaka disembunyikan - Tombol Pustaka ditampilkan - - Sembunyikan Upgrade - Tombol Upgrade disembunyikan - Tombol Upgrade ditampilkan - Sembunyikan bilah navigasi - Bilah navigasi disembunyikan - Bilah navigasi ditampilkan - Sembunyikan label tombol navigasi - Label disembunyikan - Label ditampilkan - - - Sembunyikan label \'Dapatkan Music Premium\' - Label disembunyikan - Label ditampilkan - - - Sembunyikan tombol Upgrade - Tombol disembunyikan - Tombol ditampilkan - - - - - Blokir iklan audio - Iklan audio diblokir - Iklan audio tidak diblokir - - - %s tidak tersedia, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. - %s mengembalikan kesalahan, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. - Blokir iklan video yang disematkan - Nonaktif - Proksi Luminous - Proksi PurpleAdBlock - - - Blokir iklan video - Iklan video diblokir - Iklan video tidak diblokir - - - Pesan dihapus - Tampilkan pesan yang terhapus - Jangan tampilkan pesan yang terhapus - Sembunyikan pesan yang dihapus di balik spoiler - Tampilkan pesan yang dihapus sebagai teks yang dicoret - - - Klaim Poin Saluran secara otomatis - Poin Saluran diklaim secara otomatis - Poin Saluran tidak diklaim secara otomatis - - - - Nyalakan mode debug Twitch - Mode debug Twitch diaktifkan (tidak disarankan) - Mode debug Twitch dinonaktifkan - - - Pengaturan ReVanced - Tentang - Tentang ReVanced - Pemblokiran Iklan - Setelan Pemblokiran Iklan - Obrolan - Pengaturan obrolan - Lain-lain - Pengaturan lain-lain - Pengaturan umum - Pengaturan lainnya - Iklan sisi klien - Iklan surestream di sisi server - Pencatatan debug - Pencatatan debug diaktifkan - Pencatatan debug dinonaktifkan - - + Efek samping pemalsuan + • Klien eksperimental dan dapat berhenti berfungsi kapan saja + • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah + • Menu trek audio hilang + • Tidak ada codec video AV1 + • Volume stabil tidak tersedia + • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran + + • Paksa audio asli tidak tersedia + Tampilkan di Statistik untuk nerds + Jenis klien ditampilkan di Statistik untuk nerds + Klien disembunyikan di Statistik untuk nerds + + + + + YT Musik ReVanced + Musik ReVanced + Musik + + + Tentang + Iklan + Umum + Pemutar + Lain-lain + + + Sembunyikan iklan video + Iklan video disembunyikan + Iklan video ditampilkan + + + Aktifkan pengulangan permanen + Pengulangan permanen diaktifkan + Pengulangan permanen dinonaktifkan + + + Sembunyikan tombol transmisi + Tombol transmisi disembunyikan + Tombol transmisi ditampilkan + Sembunyikan tombol Riwayat + Tombol Riwayat disembunyikan + Tombol Riwayat ditampilkan + Sembunyikan tombol notifikasi + Tombol notifikasi disembunyikan + Tombol notifikasi ditampilkan + Sembunyikan tombol pencarian + Tombol pencarian disembunyikan + Tombol pencarian ditampilkan + + + Sembunyikan bilah kategori + Bilah kategori disembunyikan + Bilah kategori ditampilkan + + + Ubah warna pemutar mini + Warna pemutar mini sesuai dengan pemutar layar penuh + Pemutar mini menggunakan warna standar + + + Bilah navigasi + Sembunyikan atau ubah tombol bilah navigasi + + Sembunyikan Beranda + Tombol Beranda disembunyikan + Tombol Beranda ditampilkan + + Sembunyikan Sampel + Tombol Sampel disembunyikan + Tombol Sampel ditampilkan + + Sembunyikan Jelajahi + Tombol Jelajahi disembunyikan + Tombol Jelajahi ditampilkan + + Sembunyikan Pustaka + Tombol Pustaka disembunyikan + Tombol Pustaka ditampilkan + + Sembunyikan Upgrade + Tombol Upgrade disembunyikan + Tombol Upgrade ditampilkan + Sembunyikan bilah navigasi + Bilah navigasi disembunyikan + Bilah navigasi ditampilkan + Sembunyikan label tombol navigasi + Label disembunyikan + Label ditampilkan + + + Sembunyikan label \'Dapatkan Music Premium\' + Label disembunyikan + Label ditampilkan + + + Sembunyikan tombol Upgrade + Tombol disembunyikan + Tombol ditampilkan + + + + + Blokir iklan audio + Iklan audio diblokir + Iklan audio tidak diblokir + + + %s tidak tersedia, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. + %s mengembalikan kesalahan, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. + Blokir iklan video yang disematkan + Nonaktif + Proksi Luminous + Proksi PurpleAdBlock + + + Blokir iklan video + Iklan video diblokir + Iklan video tidak diblokir + + + Pesan dihapus + Tampilkan pesan yang terhapus + Jangan tampilkan pesan yang terhapus + Sembunyikan pesan yang dihapus di balik spoiler + Tampilkan pesan yang dihapus sebagai teks yang dicoret + + + Klaim Poin Saluran secara otomatis + Poin Saluran diklaim secara otomatis + Poin Saluran tidak diklaim secara otomatis + + + + Nyalakan mode debug Twitch + Mode debug Twitch diaktifkan (tidak disarankan) + Mode debug Twitch dinonaktifkan + + + Pengaturan ReVanced + Tentang + Tentang ReVanced + Pemblokiran Iklan + Setelan Pemblokiran Iklan + Obrolan + Pengaturan obrolan + Lain-lain + Pengaturan lain-lain + Pengaturan umum + Pengaturan lainnya + Iklan sisi klien + Iklan surestream di sisi server + Pencatatan debug + Pencatatan debug diaktifkan + Pencatatan debug dinonaktifkan + + diff --git a/patches/src/main/resources/addresources/values-is-rIS/strings.xml b/patches/src/main/resources/addresources/values-is-rIS/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-is-rIS/strings.xml +++ b/patches/src/main/resources/addresources/values-is-rIS/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 9c02e01333..3c41ba8e56 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -17,1272 +17,1271 @@ "First 'item' text Second \"item\" text" ---> - - - - Nome dell\'app - - Personalizzato - Icona dell\'app - Originale - ReVanced - - ReVanced minimale - ReVanced ridimensionato - - Personalizzato - - - Controlli non riusciti - Apri sito ufficiale - Ignora - <h5>Quest\'app non sembra essere stata patchata da te.</h5><br>Quest\'app potrebbe non funzionare correttamente, <b>potrebbe essere dannosa o addirittura pericolosa</b>.<br><br>Questi controlli implicano che quest\'app sia pre-patchata o ottenuta da qualcun altro:<br><br><small>%1$s</small><br>Si consiglia vivamente di <b>disinstallare quest\'app</b> per assicurarsi di utilizzare un\'app valida e sicura.<p><br>Se ignorato, questo avviso verrà visualizzato solo due volte. - Patchato su un altro dispositivo - Non installato da ReVanced Manager - Patchato più di 10 minuti fa - Patchato %s giorni fa - La data di compilazione dell\'APK è corrotta - - - Avviso ReVanced - La tua cronologia di visualizzazione non sta venendo salvata.<br><br>Questo è molto probabilmente causato da un blocco annunci DNS o da un proxy di rete.<br><br>Per risolvere, inserisci nella whitelist <b>s.youtube.com</b> o disattiva tutti i blocchi DNS e proxy. - Non mostrare più - - - Impostazioni - ReVanced - Sei sicuro di voler procedere? - Salva - Reimposta - Reimposta colore - Colore non valido - Riavvio necessario - Riavvia l\'app affinché questa modifica abbia effetto. - Riavvia - Importa - Copia - Reimposta le impostazioni di ReVanced a quelle predefinite - Importate %d impostazioni - Importazione non riuscita: %s - Cerca impostazioni - Nessun risultato trovato per \".%s\" - Prova un\'altra parola chiave - Ricerche recenti - Rimuovere dalla cronologia di ricerca? - Cancella cronologia ricerche - Sei sicuro di voler cancellare tutta la cronologia delle ricerche? - Suggerimenti per la ricerca - "• Tocca un percorso per accedervi +--> + + + Nome dell\'app + + Personalizzato + Icona dell\'app + Originale + ReVanced + + ReVanced minimale + ReVanced ridimensionato + + Personalizzato + + + Controlli non riusciti + Apri sito ufficiale + Ignora + <h5>Quest\'app non sembra essere stata patchata da te.</h5><br>Quest\'app potrebbe non funzionare correttamente, <b>potrebbe essere dannosa o addirittura pericolosa</b>.<br><br>Questi controlli implicano che quest\'app sia pre-patchata o ottenuta da qualcun altro:<br><br><small>%1$s</small><br>Si consiglia vivamente di <b>disinstallare quest\'app</b> per assicurarsi di utilizzare un\'app valida e sicura.<p><br>Se ignorato, questo avviso verrà visualizzato solo due volte. + Patchato su un altro dispositivo + Non installato da ReVanced Manager + Patchato più di 10 minuti fa + Patchato %s giorni fa + La data di compilazione dell\'APK è corrotta + + + Avviso ReVanced + La tua cronologia di visualizzazione non sta venendo salvata.<br><br>Questo è molto probabilmente causato da un blocco annunci DNS o da un proxy di rete.<br><br>Per risolvere, inserisci nella whitelist <b>s.youtube.com</b> o disattiva tutti i blocchi DNS e proxy. + Non mostrare più + + + Impostazioni + ReVanced + Sei sicuro di voler procedere? + Salva + Reimposta + Reimposta colore + Colore non valido + Riavvio necessario + Riavvia l\'app affinché questa modifica abbia effetto. + Riavvia + Importa + Copia + Reimposta le impostazioni di ReVanced a quelle predefinite + Importate %d impostazioni + Importazione non riuscita: %s + Cerca impostazioni + Nessun risultato trovato per \".%s\" + Prova un\'altra parola chiave + Ricerche recenti + Rimuovere dalla cronologia di ricerca? + Cancella cronologia ricerche + Sei sicuro di voler cancellare tutta la cronologia delle ricerche? + Suggerimenti per la ricerca + "• Tocca un percorso per accedervi • Premi a lungo un'impostazione per accedervi • Premi Invio per salvare una query di ricerca nella cronologia • La ricerca ignora maiuscole/minuscole e punteggiatura • Le impostazioni padre appaiono sopra le impostazioni figlio disabilitate" - La cronologia delle ricerche è vuota - Per salvare la cronologia delle ricerche, digita una query di ricerca e premi Invio - Mostra la cronologia di ricerca delle impostazioni - La cronologia di ricerca delle impostazioni è visualizzata - La cronologia di ricerca delle impostazioni non viene mostrata - Mostra le icone delle impostazioni di ReVanced - Le icone delle impostazioni vengono mostrate - Le icone delle impostazioni non vengono mostrate - Lingua di ReVanced - "Le traduzioni per alcune lingue potrebbero mancare o essere incomplete. + La cronologia delle ricerche è vuota + Per salvare la cronologia delle ricerche, digita una query di ricerca e premi Invio + Mostra la cronologia di ricerca delle impostazioni + La cronologia di ricerca delle impostazioni è visualizzata + La cronologia di ricerca delle impostazioni non viene mostrata + Mostra le icone delle impostazioni di ReVanced + Le icone delle impostazioni vengono mostrate + Le icone delle impostazioni non vengono mostrate + Lingua di ReVanced + "Le traduzioni per alcune lingue potrebbero mancare o essere incomplete. Per tradurre nuove lingue o migliorare le traduzioni esistenti, visita translate.revanced.app" - Lingua dell\'app - Importa / Esporta - Importa / Esporta impostazioni ReVanced - - Stai usando la versione <i>%s</i> delle Patch ReVanced - Nota - Questa versione è una pre-release e potresti riscontrare problemi inaspettati - Link ufficiali - + Stai usando la versione <i>%s</i> delle Patch ReVanced + Nota + Questa versione è una pre-release e potresti riscontrare problemi inaspettati + Link ufficiali + - - - Impostazioni di GmsCore - Impostazioni per GmsCore - - MicroG GmsCore non è installato. Installalo. - Azione necessaria - "MicroG GmsCore non ha l'autorizzazione per essere eseguito in background. + + + Impostazioni di GmsCore + Impostazioni per GmsCore + + MicroG GmsCore non è installato. Installalo. + Azione necessaria + "MicroG GmsCore non ha l'autorizzazione per essere eseguito in background. Segui la guida \"Don't kill my app\" per il tuo telefono e applica le istruzioni all'installazione di MicroG. Questo è necessario per il funzionamento dell'app." - Apri sito web - "Le ottimizzazioni della batteria di MicroG GmsCore devono essere disabilitate per evitare problemi. + Apri sito web + "Le ottimizzazioni della batteria di MicroG GmsCore devono essere disabilitate per evitare problemi. Disabilitare le ottimizzazioni della batteria per MicroG non influirà negativamente sull'utilizzo della batteria. Tocca il pulsante Continua e consenti le modifiche di ottimizzazione." - Continua - - - Falsifica i flussi video - Falsifica i flussi video del client per prevenire problemi di riproduzione - Falsifica i flussi video - Altera i flussi video del client per evitare problemi di riproduzione - Simula il client del flusso video - "I flussi video sono falsificati + Continua + + + Falsifica i flussi video + Falsifica i flussi video del client per prevenire problemi di riproduzione + Falsifica i flussi video + Altera i flussi video del client per evitare problemi di riproduzione + Simula il client del flusso video + "I flussi video sono falsificati Se sei un utente YouTube Premium, questa impostazione potrebbe non essere necessaria" - "I flussi video non sono falsificati + "I flussi video non sono falsificati La riproduzione potrebbe non funzionare" - La disattivazione di questa impostazione potrebbe causare problemi di riproduzione. - Client predefinito - - - Forza la lingua audio originale - Utilizza la lingua audio originale - Utilizzo audio predefinito - - Per usare questa funzionalità, cambia \"Falsifica i flussi video\" a qualsiasi client eccetto Android Studio - - - Debug - Abilita o disabilita impostazioni di debug - Log di debug - I log di debug sono abilitati - I log di debug sono disabilitati - Registra stack trace - I log di debug includono lo stack trace - I log di debug non includono lo stack trace - Mostra notifica per errore di ReVanced - Il toast viene mostrato se si verifica un errore - Il toast non viene mostrato se si verifica un errore - "Disabilitare i toast di errore nasconde tutte le notifiche di errore di ReVanced. + La disattivazione di questa impostazione potrebbe causare problemi di riproduzione. + Client predefinito + + + Forza la lingua audio originale + Utilizza la lingua audio originale + Utilizzo audio predefinito + + Per usare questa funzionalità, cambia \"Falsifica i flussi video\" a qualsiasi client eccetto Android Studio + + + Debug + Abilita o disabilita impostazioni di debug + Log di debug + I log di debug sono abilitati + I log di debug sono disabilitati + Registra stack trace + I log di debug includono lo stack trace + I log di debug non includono lo stack trace + Mostra notifica per errore di ReVanced + Il toast viene mostrato se si verifica un errore + Il toast non viene mostrato se si verifica un errore + "Disabilitare i toast di errore nasconde tutte le notifiche di errore di ReVanced. Non sarai notificato di eventi imprevisti." - Esporta i log di debug - Copia i log di debug di ReVanced negli Appunti - La registrazione di debug è disabilitata - Nessun log trovato - Log copiati - Esportazione dei log non riuscita: %s - Cancella i log di debug - Cancella tutti i log di debug di ReVanced memorizzati - Log cancellati - Manager dei flag di funzionalità - Gestisci flag di funzionalità booleani - Flag attivi (%d) - Flag bloccati (%d) - Cerca flag... - Flag salvati - Flag ripristinati - Flag copiati negli appunti - Buffer di protocollo per log - I log di debug includono proto buffer - I log di debug non includono proto buffer - "L'abilitazione di questa impostazione registrerà dati di layout aggiuntivi, incluso il testo su schermo per alcuni componenti dell'interfaccia utente. + Esporta i log di debug + Copia i log di debug di ReVanced negli Appunti + La registrazione di debug è disabilitata + Nessun log trovato + Log copiati + Esportazione dei log non riuscita: %s + Cancella i log di debug + Cancella tutti i log di debug di ReVanced memorizzati + Log cancellati + Manager dei flag di funzionalità + Gestisci flag di funzionalità booleani + Flag attivi (%d) + Flag bloccati (%d) + Cerca flag... + Flag salvati + Flag ripristinati + Flag copiati negli appunti + Buffer di protocollo per log + I log di debug includono proto buffer + I log di debug non includono proto buffer + "L'abilitazione di questa impostazione registrerà dati di layout aggiuntivi, incluso il testo su schermo per alcuni componenti dell'interfaccia utente. Questo può aiutare a identificare i componenti durante la creazione di filtri personalizzati. Tuttavia, l'abilitazione di questa opzione registrerà anche alcuni dati dell'utente come il tuo indirizzo IP." - - - Sanifica collegamenti di condivisione - Il parametro di query di tracciamento viene rimosso dai collegamenti condivisi - Il parametro di query di tracciamento non viene rimosso dai collegamenti condivisi - Cambia i link di condivisione in youtube.com - I link condivisi usano youtube.com - I link condivisi usano music.youtube.com - - - Filtro personalizzato - Nascondi i componenti usando i filtri personalizzati - Attiva il filtro personalizzato - Il filtro personalizzato è attivo - Il filtro personalizzato è disattivo - Filtro personalizzato - - L\'elenco dei componenti da filtrare separati da nuove righe - Filtro personalizzato non valido: %s - - - - - Informazioni - Pubblicità - Miniature alternative - Feed - Generale - Lettore - Shorts - Barra di avanzamento - Controlli a gesti - Return YouTube Dislike - Varie - Video - Ripristina i vecchi menu delle impostazioni - I vecchi menu delle impostazioni vengono mostrati - I vecchi menu delle impostazioni non vengono mostrati - - - Disattiva la riproduzione degli Shorts in background - La riproduzione in background degli Shorts è disattivata - La riproduzione in background degli Shorts è abilitata - - - Nascondi le schede degli album - Le schede album sono nascoste - Le schede degli album sono visibili - Nascondi le schede artista - Le schede artista sono nascoste - Le schede artista sono visibili - Nascondi la sezione chip - La sezione dei chip è nascosta - La sezione dei chip è visibile - Nascondi i post della community - I post della community sono nascosti - I post della community sono visibili - Nascondi i banner compatti - I banner compatti sono nascosti - I banner compatti sono visibili - Nascondi scheda espandibile - La scheda espandibile sotto i video è nascosta - La scheda espandibile sotto i video è mostrata - Nascondi il pulsante flottante del microfono - Il pulsante del microfono fluttuante nella ricerca è nascosto - Il pulsante del microfono fluttuante nella ricerca è mostrato - Nascondi sezioni orizzontali - "I ripiani orizzontali sono nascosti, come: + + + Sanifica collegamenti di condivisione + Il parametro di query di tracciamento viene rimosso dai collegamenti condivisi + Il parametro di query di tracciamento non viene rimosso dai collegamenti condivisi + Cambia i link di condivisione in youtube.com + I link condivisi usano youtube.com + I link condivisi usano music.youtube.com + + + Filtro personalizzato + Nascondi i componenti usando i filtri personalizzati + Attiva il filtro personalizzato + Il filtro personalizzato è attivo + Il filtro personalizzato è disattivo + Filtro personalizzato + + L\'elenco dei componenti da filtrare separati da nuove righe + Filtro personalizzato non valido: %s + + + + + Informazioni + Pubblicità + Miniature alternative + Feed + Generale + Lettore + Shorts + Barra di avanzamento + Controlli a gesti + Return YouTube Dislike + Varie + Video + Ripristina i vecchi menu delle impostazioni + I vecchi menu delle impostazioni vengono mostrati + I vecchi menu delle impostazioni non vengono mostrati + + + Disattiva la riproduzione degli Shorts in background + La riproduzione in background degli Shorts è disattivata + La riproduzione in background degli Shorts è abilitata + + + Nascondi le schede degli album + Le schede album sono nascoste + Le schede degli album sono visibili + Nascondi le schede artista + Le schede artista sono nascoste + Le schede artista sono visibili + Nascondi la sezione chip + La sezione dei chip è nascosta + La sezione dei chip è visibile + Nascondi i post della community + I post della community sono nascosti + I post della community sono visibili + Nascondi i banner compatti + I banner compatti sono nascosti + I banner compatti sono visibili + Nascondi scheda espandibile + La scheda espandibile sotto i video è nascosta + La scheda espandibile sotto i video è mostrata + Nascondi il pulsante flottante del microfono + Il pulsante del microfono fluttuante nella ricerca è nascosto + Il pulsante del microfono fluttuante nella ricerca è mostrato + Nascondi sezioni orizzontali + "I ripiani orizzontali sono nascosti, come: • Ultime notizie • Continua a guardare • Esplora altri canali • Più pertinenti • Shopping • Guarda di nuovo" - Le scaffalature orizzontali sono mostrate - Nascondi sezione immagini - La sezione immagini nei risultati di ricerca è nascosta - La sezione immagini nei risultati di ricerca è mostrata - Nascondi i post più recenti - I post più recenti sono nascosti - I post più recenti sono visibili - Nascondi le playlist miste - Le playlist miste sono nascoste - Le playlist miste sono visibili - Nascondi la sezione film - La sezione film è nascosta - La sezione film è visibile - - Nascondi il pulsante \'Avvisami\' - Il pulsante Avvisami è nascosto - Il pulsante Avvisami è mostrato - Nascondi Sala Giochi - I giochi sono nascosti - I giochi sono visibili - - Nascondi il pulsante \'Mostra di più\' - Il pulsante Mostra altro nei risultati di ricerca è nascosto - Il pulsante Mostra altro nei risultati di ricerca è mostrato - Nascondi sondaggi - Sondaggi nascosti - Sondaggi mostrati - Nascondi la sezione dei biglietti - La sezione dei biglietti è nascosta - La sezione dei biglietti è visibile - - Nascondi etichette di video consigliati - Le etichette \'Le persone hanno anche guardato\' e \'Potrebbe piacerti anche\' nei risultati di ricerca sono nascoste - Le etichette \'Le persone hanno anche guardato\' e \'Potrebbe piacerti anche\' nei risultati di ricerca sono mostrate - Nascondi il separatore visivo - Il separatore visivo è nascosto - Il separatore visivo è mostrato - - Nascondi Doodles di YouTube - L\'animazione YouTube Doodles sul logo è nascosta - L\'animazione di YouTube Doodles sul logo è mostrata - "I Doodle di YouTube vengono visualizzati alcuni giorni all'anno. + Nascondi il pulsante \'Mostra di più\' + Il pulsante Mostra altro nei risultati di ricerca è nascosto + Il pulsante Mostra altro nei risultati di ricerca è mostrato + Nascondi sondaggi + Sondaggi nascosti + Sondaggi mostrati + Nascondi la sezione dei biglietti + La sezione dei biglietti è nascosta + La sezione dei biglietti è visibile + + Nascondi etichette di video consigliati + Le etichette \'Le persone hanno anche guardato\' e \'Potrebbe piacerti anche\' nei risultati di ricerca sono nascoste + Le etichette \'Le persone hanno anche guardato\' e \'Potrebbe piacerti anche\' nei risultati di ricerca sono mostrate + Nascondi il separatore visivo + Il separatore visivo è nascosto + Il separatore visivo è mostrato + + Nascondi Doodles di YouTube + L\'animazione YouTube Doodles sul logo è nascosta + L\'animazione di YouTube Doodles sul logo è mostrata + "I Doodle di YouTube vengono visualizzati alcuni giorni all'anno. Se al momento un Doodle è visibile nella tua regione e questa impostazione nascondi è attiva, la barra dei filtri sotto la barra di ricerca verrà anch'essa nascosta." - Nascondi barra del canale - La barra del canale è nascosta - La barra dei canali è visibile - Nascondi la filigrana del canale - La filigrana è nascosta - La filigrana è visibile - Nascondi il riquadro Raccolta fondi - Il riquadro Raccolta fondii è nascosto - Il riquadro Raccolta fondi è visibile - Nascondi riquadri di emergenza - I riquadri di emergenza sono nascosti - I riquadri di emergenza sono visibili - Nascondi i pannelli informativi - I pannelli informativi sono nascosti - I pannelli informativi sono visibili - - Nascondi il pulsante Abbonati - Il pulsante Unisciti è nascosto - Il pulsante Unisciti è mostrato - Nascondi i pannelli medici - I pannelli medici sono nascosti - I pannelli medici sono visibili - Nascondi azioni rapide - Le azioni rapide a schermo intero sono nascoste - Le azioni rapide a schermo intero sono mostrate - Nascondi video correlati - I video correlati nelle azioni rapide sono nascosti - I video correlati nelle azioni rapide sono mostrati - Nascondi le linee guida per gli iscritti - Le linee guida degli iscritti alla community sono nascoste - Le linee guida degli iscritti alla community sono visibili - Nascondi le reazioni a tempo - Le reazioni a tempo sono nascoste - Le reazioni a tempo sono visibili - Nascondi \"Riepilogo video generato dall\'AI\" - La sezione del riepilogo video generato dall\'IA è nascosta - Sezione di riepilogo video generata dall\'IA mostrata - Nascondi \"Chiedi\" - La sezione \"Chiedi\" è nascosta - La sezione \"Chiedi\" è visibile - Nascondi Attributi - Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono nascoste - Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono visibili - Nascondi Capitoli - La sezione Capitoli è nascosta - La sezione Capitoli è visibile - Nascondi \"Come è stato realizzato questo contenuto\" - La sezione Come è stato realizzato questo contenuto è nascosta - La sezione Come è stato realizzato questo contenuto è visibile - Nascondi i punti Hype - I punti Hype sono nascosti - I punti Hype sono mostrati - Nascondi \"Esplora il podcast\" - La sezione Esplora il podcast è nascosta - La sezione Esplora il podcast è visibile - Nascondi i link in primo piano - La sezione dei link in evidenza è nascosta - La sezione dei link in evidenza è mostrata - Nascondi i video in evidenza - La sezione dei video in evidenza è nascosta - La sezione dei video in evidenza è mostrata - Nascondi le schede informative - La sezione Schede Informative è nascosta - La sezione Schede Informative è visibile - Nascondi \"Concetti chiave\" - La sezione Concetti chiave è nascosta - La sezione Concetti chiave è visibile - Nascondi il pulsante Iscriviti - Il pulsante Iscriviti è nascosto - Il pulsante Iscriviti è mostrato - Nascondi Trascrizione - La sezione Trascrizione è nascosta - La sezione Trascrizione è visibile - Descrizione del video - Mostra o nascondi i componenti della descrizione del video - Barra dei filtri - Nascondi o mostra la barra dei filtri nei feed, nei video correlati, nei risultati di ricerca e nella cronologia delle visualizzazioni - Nascondi nei feed - Nascosto nei feed - Mostrato nei feed - Nascondi nei video correlati - Nascosto nei video correlati - È visibile nei video correlati - Nascondi nei risultati di ricerca - Nascosto nei risultati di ricerca - Mostrato nei risultati di ricerca - Nascondi nella cronologia visualizzazioni - Nascosto nella cronologia delle visualizzazioni - Mostrato nella cronologia visualizzazioni - Pagina canale - Nascondi o mostra i componenti della pagina del canale - - Nascondi il pulsante Community - Il pulsante Community è nascosto - Il pulsante Community è visualizzato - - Nascondi sezione \"Per te\" - La sezione Per Te è nascosta - La sezione Per Te è mostrata - - Nascondi pulsante Unisciti - Il pulsante Unisciti è nascosto - Il pulsante Unisciti è visualizzato - Nascondi anteprima link - L\'anteprima dei link è nascosta - L\'anteprima dei link è mostrata - Nascondi sezione membri - La sezione membri è nascosta - La sezione Membri è mostrata - - Nascondi pulsante Acquista - Il pulsante Acquista è nascosto - Il pulsante Acquista è visualizzato - - Nascondi pulsante Iscriviti - Il pulsante Iscriviti è nascosto - Il pulsante Iscriviti è visualizzato - Commenti - Mostra o nascondi i componenti della sezione commenti - Nascondi riepilogo chat IA - Il riepilogo chat IA è nascosto - Il riepilogo chat IA è mostrato - Nascondi il riepilogo dei commenti AI - Il riepilogo dei commenti IA è nascosto - Il riepilogo dei commenti IA è mostrato - Nascondi linee guida canale - Le linee guida del canale sono nascoste - Le linee guida del canale sono mostrate - Nascondi l\'intestazione \'Commenti dai membri\' - L\'intestazione dei commenti dei membri è nascosta - L\'intestazione dei commenti dei membri è visibile - Nascondi la sezione Commenti - La sezione Commenti è nascosta - La sezione Commenti è visibile - Nascondi le linee guida della community - Le linee guida della community sono nascoste - Le linee guida della community sono mostrate - Nascondi il pulsante \'Crea uno Short\' - Il pulsante Crea uno Short è nascosto - Il pulsante Crea uno Short è visibile - Nascondi i pulsanti Emoji e Timestamp - I pulsanti Emoji e Timestamp sono nascosti - I pulsanti Emoji e Timestamp sono mostrati - Nascondi il commento di anteprima - Il commento di anteprima è nascosto - Il commento di anteprima è visibile - Nascondi il pulsante Grazie - Il pulsante Grazie è nascosto - Il pulsante Grazie è visibile - Nascondi il numero di visualizzazioni - Il numero di visualizzazioni è nascosto nel feed e nei risultati di ricerca - Il numero di visualizzazioni è mostrato nel feed e nei risultati di ricerca - - "Limitazioni: + Nascondi il pulsante Abbonati + Il pulsante Unisciti è nascosto + Il pulsante Unisciti è mostrato + Nascondi i pannelli medici + I pannelli medici sono nascosti + I pannelli medici sono visibili + Nascondi azioni rapide + Le azioni rapide a schermo intero sono nascoste + Le azioni rapide a schermo intero sono mostrate + Nascondi video correlati + I video correlati nelle azioni rapide sono nascosti + I video correlati nelle azioni rapide sono mostrati + Nascondi le linee guida per gli iscritti + Le linee guida degli iscritti alla community sono nascoste + Le linee guida degli iscritti alla community sono visibili + Nascondi le reazioni a tempo + Le reazioni a tempo sono nascoste + Le reazioni a tempo sono visibili + Nascondi \"Riepilogo video generato dall\'AI\" + La sezione del riepilogo video generato dall\'IA è nascosta + Sezione di riepilogo video generata dall\'IA mostrata + Nascondi \"Chiedi\" + La sezione \"Chiedi\" è nascosta + La sezione \"Chiedi\" è visibile + Nascondi Attributi + Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono nascoste + Le sezioni Luoghi in evidenza, Giochi, Musica e Persone menzionate sono visibili + Nascondi Capitoli + La sezione Capitoli è nascosta + La sezione Capitoli è visibile + Nascondi \"Come è stato realizzato questo contenuto\" + La sezione Come è stato realizzato questo contenuto è nascosta + La sezione Come è stato realizzato questo contenuto è visibile + Nascondi i punti Hype + I punti Hype sono nascosti + I punti Hype sono mostrati + Nascondi \"Esplora il podcast\" + La sezione Esplora il podcast è nascosta + La sezione Esplora il podcast è visibile + Nascondi i link in primo piano + La sezione dei link in evidenza è nascosta + La sezione dei link in evidenza è mostrata + Nascondi i video in evidenza + La sezione dei video in evidenza è nascosta + La sezione dei video in evidenza è mostrata + Nascondi le schede informative + La sezione Schede Informative è nascosta + La sezione Schede Informative è visibile + Nascondi \"Concetti chiave\" + La sezione Concetti chiave è nascosta + La sezione Concetti chiave è visibile + Nascondi il pulsante Iscriviti + Il pulsante Iscriviti è nascosto + Il pulsante Iscriviti è mostrato + Nascondi Trascrizione + La sezione Trascrizione è nascosta + La sezione Trascrizione è visibile + Descrizione del video + Mostra o nascondi i componenti della descrizione del video + Barra dei filtri + Nascondi o mostra la barra dei filtri nei feed, nei video correlati, nei risultati di ricerca e nella cronologia delle visualizzazioni + Nascondi nei feed + Nascosto nei feed + Mostrato nei feed + Nascondi nei video correlati + Nascosto nei video correlati + È visibile nei video correlati + Nascondi nei risultati di ricerca + Nascosto nei risultati di ricerca + Mostrato nei risultati di ricerca + Nascondi nella cronologia visualizzazioni + Nascosto nella cronologia delle visualizzazioni + Mostrato nella cronologia visualizzazioni + Pagina canale + Nascondi o mostra i componenti della pagina del canale + + Nascondi il pulsante Community + Il pulsante Community è nascosto + Il pulsante Community è visualizzato + + Nascondi sezione \"Per te\" + La sezione Per Te è nascosta + La sezione Per Te è mostrata + + Nascondi pulsante Unisciti + Il pulsante Unisciti è nascosto + Il pulsante Unisciti è visualizzato + Nascondi anteprima link + L\'anteprima dei link è nascosta + L\'anteprima dei link è mostrata + Nascondi sezione membri + La sezione membri è nascosta + La sezione Membri è mostrata + + Nascondi pulsante Acquista + Il pulsante Acquista è nascosto + Il pulsante Acquista è visualizzato + + Nascondi pulsante Iscriviti + Il pulsante Iscriviti è nascosto + Il pulsante Iscriviti è visualizzato + Commenti + Mostra o nascondi i componenti della sezione commenti + Nascondi riepilogo chat IA + Il riepilogo chat IA è nascosto + Il riepilogo chat IA è mostrato + Nascondi il riepilogo dei commenti AI + Il riepilogo dei commenti IA è nascosto + Il riepilogo dei commenti IA è mostrato + Nascondi linee guida canale + Le linee guida del canale sono nascoste + Le linee guida del canale sono mostrate + Nascondi l\'intestazione \'Commenti dai membri\' + L\'intestazione dei commenti dei membri è nascosta + L\'intestazione dei commenti dei membri è visibile + Nascondi la sezione Commenti + La sezione Commenti è nascosta + La sezione Commenti è visibile + Nascondi le linee guida della community + Le linee guida della community sono nascoste + Le linee guida della community sono mostrate + Nascondi il pulsante \'Crea uno Short\' + Il pulsante Crea uno Short è nascosto + Il pulsante Crea uno Short è visibile + Nascondi i pulsanti Emoji e Timestamp + I pulsanti Emoji e Timestamp sono nascosti + I pulsanti Emoji e Timestamp sono mostrati + Nascondi il commento di anteprima + Il commento di anteprima è nascosto + Il commento di anteprima è visibile + Nascondi il pulsante Grazie + Il pulsante Grazie è nascosto + Il pulsante Grazie è visibile + Nascondi il numero di visualizzazioni + Il numero di visualizzazioni è nascosto nel feed e nei risultati di ricerca + Il numero di visualizzazioni è mostrato nel feed e nei risultati di ricerca + + "Limitazioni: • Le sezioni Shorts, le pagine dei canali e i risultati di ricerca potrebbero mostrare comunque il numero di visualizzazioni • Questa funzionalità non è compatibile con i fattori di forma automobilistici" - Nascondi l\'ora di caricamento - L\'ora di caricamento è nascosta nel feed e nei risultati di ricerca - L\'ora di caricamento è mostrata nel feed e nei risultati di ricerca - - "Limitazioni: + Nascondi l\'ora di caricamento + L\'ora di caricamento è nascosta nel feed e nei risultati di ricerca + L\'ora di caricamento è mostrata nel feed e nei risultati di ricerca + + "Limitazioni: • Le sezioni Shorts, le pagine del canale e i risultati di ricerca potrebbero ancora mostrare gli orari di caricamento. • Questa funzione non funziona con il fattore di forma automotive." - Nascondi contenuto di parole chiave - Nascondi la ricerca e proponi video usando i filtri per le parole chiave - Nascondi i video della Home in base alle parole chiave - I video nella scheda Home sono filtrati per parole chiave - I video nella scheda Home non sono filtrati per parole chiave - Nascondi i risultati della ricerca per parole chiave - I risultati della ricerca sono filtrati per parole chiave - I risultati della ricerca non sono filtrati per parole chiave - Nascondi i video della scheda Iscrizioni in base alle parole chiave - I video nella scheda Iscrizioni sono filtrati per parole chiave - I video nella scheda Iscrizioni non sono filtrati per parole chiave - Parole chiave da nascondere - - "L'elenco delle parole chiave e frasi da nascondere, separate da nuove righe + "L'elenco delle parole chiave e frasi da nascondere, separate da nuove righe Le parole chiave possono essere nomi di canali o qualsiasi testo mostrato nei titoli dei video Le parole con lettere maiuscole all'interno devono essere inserite con il maiuscolo (ad esempio: iPhone, TikTok, LeBlanc)" - Informazioni sul filtro delle parole chiave - "Le schede Home ed Iscrizioni ed i risultati di ricerca sono filtrati per nascondere i video che corrispondono alle parole chiave + Informazioni sul filtro delle parole chiave + "Le schede Home ed Iscrizioni ed i risultati di ricerca sono filtrati per nascondere i video che corrispondono alle parole chiave Note: • Gli Shorts non possono essere nascosti in base al nome del canale • Alcuni componenti dell'interfaccia potrebbero non essere nascosti • La ricerca di una parola chiave potrebbe non mostrare alcun risultato" - Solo parole intere - - Racchiudendo una parola chiave o frase tra virgolette doppie si impediranno corrispondenze parziali dei titoli dei video e dei nomi dei canali<br><br>Ad esempio:<br><b>\"ia\"</b> nasconderà il video <b>\"Come funziona la IA?\"</b><br>Ma non nasconderà il video <b>\"Cosa significa imparzialità?\"</b> - - Impossibile usare la parola chiave: %s - Aggiungi le virgolette per usare la parola chiave: %s - La parola chiave ha dichiarazioni in conflitto: %s - La parola chiave è troppo corta e richiede le virgolette: %s - La parola chiave nasconderà tutti i video: %s - - - Nascondi sezione negozio del creatore - La sezione del negozio del creator sotto il riproduttore video è nascosta - La mensola del negozio del creatore sotto il riproduttore video è mostrata - Nascondi banner del negozio della schermata finale - Il banner del negozio nella schermata finale è nascosto - Il banner del negozio nella schermata finale è mostrato - Nascondi le pubblicità a schermo intero - "Le pubblicità a schermo intero sono nascoste + Solo parole intere + + Racchiudendo una parola chiave o frase tra virgolette doppie si impediranno corrispondenze parziali dei titoli dei video e dei nomi dei canali<br><br>Ad esempio:<br><b>\"ia\"</b> nasconderà il video <b>\"Come funziona la IA?\"</b><br>Ma non nasconderà il video <b>\"Cosa significa imparzialità?\"</b> + + Impossibile usare la parola chiave: %s + Aggiungi le virgolette per usare la parola chiave: %s + La parola chiave ha dichiarazioni in conflitto: %s + La parola chiave è troppo corta e richiede le virgolette: %s + La parola chiave nasconderà tutti i video: %s + + + Nascondi sezione negozio del creatore + La sezione del negozio del creator sotto il riproduttore video è nascosta + La mensola del negozio del creatore sotto il riproduttore video è mostrata + Nascondi banner del negozio della schermata finale + Il banner del negozio nella schermata finale è nascosto + Il banner del negozio nella schermata finale è mostrato + Nascondi le pubblicità a schermo intero + "Le pubblicità a schermo intero sono nascoste Questa funzione è disponibile solo per i dispositivi più vecchi" - Le pubblicità a schermo intero sono visibili - - Nascondi gli annunci a schermo intero funziona solo con dispositivi più vecchi - Nascondi pubblicità generali - Le pubblicità generali sono nascoste - Le pubblicità generali sono visibili - Nascondi i banner sul merchandising - I banner sul merchandising sono nascosti - I banner sul merchandising sono visibili - Nascondi l\'etichetta della promozione a pagamento - L\'etichetta della promozione a pagamento è nascosta - L\'etichetta della promozione a pagamento è visibile - Nascondi le schede autopromozionali - Le schede autopromozionali sono nascoste - Le schede autopromozionali sono visibili - Nascondi link shopping - I link per lo shopping nella descrizione del video sono nascosti - I link per lo shopping nella descrizione del video sono mostrati - Nascondi il banner \'Visualizza prodotti\' - Il banner Visualizza prodotti nell\'overlay del video è nascosto - Il banner Visualizza prodotti nell\'overlay del video è mostrato - Nascondi i risultati della ricerca web - I risultati della ricerca web sono nascosti - I risultati della ricerca web sono visibili - - - Nascondi la promozione di YouTube Premium - Le promozioni di YouTube Premium sotto il video player sono nascoste - Le promozioni di YouTube Premium sotto il lettore video sono mostrate - - - Nascondi le pubblicità del video - Le pubblicità del video sono nascoste - Le pubblicità del video sono visibili - - - URL copiato negli appunti - URL con timestamp copiato - Mostra il pulsante Copia URL Video - Il pulsante Copia URL video è visualizzato. Tocca per copiare l\'URL del video. Tieni premuto per copiare con timestamp - Il pulsante Copia URL video non è visualizzato - Mostra il pulsante Copia URL Video con Timestamp - Il pulsante Copia URL con timestamp è visualizzato. Tocca per copiare l\'URL del video con timestamp. Tieni premuto per copiare senza timestamp - Il pulsante Copia URL con timestamp non è visualizzato - - - Rimuovi la finestra sulla discrezione dello spettatore - La finestra di dialogo verrà rimossa - La finestra di dialogo verrà mostrata - Questo non aggira la restrizione di età. Lo accetta solo automaticamente. - - - Disabilita il popup \'Accedi alla TV\' - Il popup \"Accedi alla TV\" è disabilitato - Il popup \"Accedi alla TV\" è abilitato - - - Disabilita salto capitolo con doppio tocco - Il doppio tocco non può mai attivare il salto al capitolo successivo/precedente - Il doppio tocco può occasionalmente attivare il salto al capitolo successivo/precedente - - - Download esterni - Impostazioni per l\'utilizzo di un downloader esterno - Mostra il pulsante Scarica esterno - Il pulsante di download nel player è visibile - Il pulsante di download nel player non è visibile - - Sovrascrivi il pulsante azione Download - Il pulsante Scarica apre il tuo downloader esterno - Il pulsante Scarica apre il nativo in-app downloader - Nome pacchetto downloader - Nome del pacchetto della tua app di downloader esterno installata - Inserisci il nome del pacchetto - Altro - App non installata - %s non è installato. Installalo. - "Impossibile trovare l'app installata con il nome del pacchetto: %s + Le pubblicità a schermo intero sono visibili + + Nascondi gli annunci a schermo intero funziona solo con dispositivi più vecchi + Nascondi pubblicità generali + Le pubblicità generali sono nascoste + Le pubblicità generali sono visibili + Nascondi i banner sul merchandising + I banner sul merchandising sono nascosti + I banner sul merchandising sono visibili + Nascondi l\'etichetta della promozione a pagamento + L\'etichetta della promozione a pagamento è nascosta + L\'etichetta della promozione a pagamento è visibile + Nascondi le schede autopromozionali + Le schede autopromozionali sono nascoste + Le schede autopromozionali sono visibili + Nascondi link shopping + I link per lo shopping nella descrizione del video sono nascosti + I link per lo shopping nella descrizione del video sono mostrati + Nascondi il banner \'Visualizza prodotti\' + Il banner Visualizza prodotti nell\'overlay del video è nascosto + Il banner Visualizza prodotti nell\'overlay del video è mostrato + Nascondi i risultati della ricerca web + I risultati della ricerca web sono nascosti + I risultati della ricerca web sono visibili + + + Nascondi la promozione di YouTube Premium + Le promozioni di YouTube Premium sotto il video player sono nascoste + Le promozioni di YouTube Premium sotto il lettore video sono mostrate + + + Nascondi le pubblicità del video + Le pubblicità del video sono nascoste + Le pubblicità del video sono visibili + + + URL copiato negli appunti + URL con timestamp copiato + Mostra il pulsante Copia URL Video + Il pulsante Copia URL video è visualizzato. Tocca per copiare l\'URL del video. Tieni premuto per copiare con timestamp + Il pulsante Copia URL video non è visualizzato + Mostra il pulsante Copia URL Video con Timestamp + Il pulsante Copia URL con timestamp è visualizzato. Tocca per copiare l\'URL del video con timestamp. Tieni premuto per copiare senza timestamp + Il pulsante Copia URL con timestamp non è visualizzato + + + Rimuovi la finestra sulla discrezione dello spettatore + La finestra di dialogo verrà rimossa + La finestra di dialogo verrà mostrata + Questo non aggira la restrizione di età. Lo accetta solo automaticamente. + + + Disabilita il popup \'Accedi alla TV\' + Il popup \"Accedi alla TV\" è disabilitato + Il popup \"Accedi alla TV\" è abilitato + + + Disabilita salto capitolo con doppio tocco + Il doppio tocco non può mai attivare il salto al capitolo successivo/precedente + Il doppio tocco può occasionalmente attivare il salto al capitolo successivo/precedente + + + Download esterni + Impostazioni per l\'utilizzo di un downloader esterno + Mostra il pulsante Scarica esterno + Il pulsante di download nel player è visibile + Il pulsante di download nel player non è visibile + + Sovrascrivi il pulsante azione Download + Il pulsante Scarica apre il tuo downloader esterno + Il pulsante Scarica apre il nativo in-app downloader + Nome pacchetto downloader + Nome del pacchetto della tua app di downloader esterno installata + Inserisci il nome del pacchetto + Altro + App non installata + %s non è installato. Installalo. + "Impossibile trovare l'app installata con il nome del pacchetto: %s Verifica che il nome del pacchetto sia corretto e che l'app sia installata" - Il nome del pacchetto non può essere vuoto - - - Disabilita il gesto di ricerca preciso - Il gesto è disabilitato - Il gesto è abilitato - - - Abilita tocco per cercare - Tocco per cercare è abilitato - Tocco per cercare è disabilitato - - - Attiva il gesto per modificare la luminosità - "Lo scorrimento per la luminosità a schermo intero è abilitato + Il nome del pacchetto non può essere vuoto + + + Disabilita il gesto di ricerca preciso + Il gesto è disabilitato + Il gesto è abilitato + + + Abilita tocco per cercare + Tocco per cercare è abilitato + Tocco per cercare è disabilitato + + + Attiva il gesto per modificare la luminosità + "Lo scorrimento per la luminosità a schermo intero è abilitato Regola la luminosità scorrendo verticalmente sul lato sinistro dello schermo" - Lo scorrimento per la luminosità a schermo intero è disabilitato - Attiva il gesto per modificare il volume - "Lo scorrimento del volume a schermo intero è abilitato + Lo scorrimento per la luminosità a schermo intero è disabilitato + Attiva il gesto per modificare il volume + "Lo scorrimento del volume a schermo intero è abilitato Regola il volume scorrendo verticalmente sul lato destro dello schermo" - Lo scorrimento del volume a schermo intero è disabilitato - Abilita gesto di pressione per scorrere - Pressione per scorrere è abilitata - Pressione per scorrere è disabilitata - Abilita il feedback aptico - Il feedback aptico è abilitato - Il feedback aptico è disabilitato - Salva e ripristina la luminosità - Salva e ripristina la luminosità quando esci o entri a schermo intero - Non salvare e ripristinare la luminosità quando esci o entri a schermo intero - Attiva il gesto della luminosità automatica - Scorri verso il basso fino al valore più basso del gesto luminosità per abilitare la luminosità automatica - Scorrendo verso il basso, il valore più basso non abilita la luminosità automatica - Automatico - Timeout sovrapposizione dello scorrimento - La visibilità in millisecondi della sovrapposizione - Opacità di sfondo della sovrapposizione di scorrimento - Valore di opacità tra 0-100 - L\'opacità di scorrimento deve essere tra 0-100 - Colore della luminosit dell\'overlay a scorrimento - Il colore della barra di avanzamento per i controlli della luminosit - Colore del volume dell\'overlay a scorrimento - Il colore della barra di avanzamento per i controlli del volume - Dimensione del testo della sovrapposizione a scorrimento - La dimensione del testo per la sovrapposizione a scorrimento tra 1 e 30 - La dimensione del testo deve essere compresa tra 1 e 30 - Ampiezza limite della soglia di scorrimento - Il limite di ampiezza entro cui deve avvenire lo scorrimento - Sensibilità allo scorrimento del volume - La quantità di volume che cambia per scorrimento - Stile sovrapposizione a scorrimento - Sovrapposizione orizzontale - Sovrapposizione orizzontale (minima - in alto) - Sovrapposizione orizzontale (minima - al centro) - Sovrapposizione circolare - Sovrapposizione circolare (minima) - Sovrapposizione verticale - Sovrapposizione verticale (minima) - Attiva il gesto per cambiare video - Lo scorrimento in modalità a schermo intero passerà al video successivo/precedente - Lo scorrimento in modalità schermo intero non cambierà al video successivo/precedente - - - Disabilita i sottotitoli automatici - I sottotitoli Auto sono disabilitati - I sottotitoli Auto sono abilitati - - - Pulsanti azione - Mostra o nascondi i pulsanti sotto i video - Disabilita l\'effetto glow per \"Mi piace\" e \"Iscriviti\" - I pulsanti Mi piace e Iscriviti non saranno evidenziati quando menzionati - I pulsanti Mi piace e Iscriviti saranno evidenziati quando menzionati - Nascondi Mi Piace e Non Mi Piace - I pulsanti Mi Piace e Non Mi Piace sono nascosti - I pulsanti Mi Piace e Non Mi Piace sono visibili - - Nascondi Condividi - Il pulsante Condividi è nascosto - Il pulsante Condividi è visibile - - Nascondi Interrompi annunci - Il pulsante per interrompere gli annunci è nascosto - Il pulsante per interrompere gli annunci è mostrato - - Nascondi commenti - Il pulsante Commenti è nascosto - Il pulsante Commenti è mostrato - + Nascondi Condividi + Il pulsante Condividi è nascosto + Il pulsante Condividi è visibile + + Nascondi Interrompi annunci + Il pulsante per interrompere gli annunci è nascosto + Il pulsante per interrompere gli annunci è mostrato + + Nascondi commenti + Il pulsante Commenti è nascosto + Il pulsante Commenti è mostrato + - Nascondi Segnala - Il pulsante Segnala è nascosto - Il pulsante Segnala è visibile - - Nascondi Remix - Il pulsante Remix è nascosto - Il pulsante Remix è visibile - - Nascondi Scarica - Il pulsante Scarica è nascosto - Il pulsante Scarica è visibile - + Nascondi Remix + Il pulsante Remix è nascosto + Il pulsante Remix è visibile + + Nascondi Scarica + Il pulsante Scarica è nascosto + Il pulsante Scarica è visibile + - Nascondi Hype - Il pulsante Hype è nascosto - Pulsante Hype è mostrato - - Nascondi Promuovi - Il pulsante Promuovi è nascosto - Il pulsante Promuovi è mostrato - - Nascondi Grazie - Grazie pulsante è nascosto - Il pulsante Grazie è visibile - + Nascondi Promuovi + Il pulsante Promuovi è nascosto + Il pulsante Promuovi è mostrato + + Nascondi Grazie + Grazie pulsante è nascosto + Il pulsante Grazie è visibile + - Nascondi richiesta - Il pulsante Richiedi è nascosto - Il pulsante Richiedi è visibile - - Nascondi Clip - Il pulsante Clip è nascosto - Il pulsante Clip è visibile - - Nascondi Acquisti - Il pulsante Acquisti è nascosto - Il pulsante Acquisti è visibile - - Nascondi Salva - Il pulsante Salva è nascosto - Il pulsante Salva è mostrato - - - Pulsanti di navigazione - Nascondi o cambia i pulsanti nella barra di navigazione - - Nascondi Home - Il pulsante Home è nascosto - Il pulsante Home è visibile - - Nascondi Shorts - Il pulsante Shorts è nascosto - Il pulsante Shorts è visibile - - Nascondi Crea - Il pulsante Crea è nascosto - Il pulsante Crea è visibile - - Nascondi Iscrizioni - Il pulsante Iscrizioni è nascosto - Il pulsante Iscrizioni è visibile - Nascondi Notifiche - Il pulsante Notifiche è nascosto - Il pulsante Notifiche è visibile - - Cambia Crea con le notifiche - "Il pulsante Crea viene sostituito con il pulsante Notifiche + Nascondi richiesta + Il pulsante Richiedi è nascosto + Il pulsante Richiedi è visibile + + Nascondi Clip + Il pulsante Clip è nascosto + Il pulsante Clip è visibile + + Nascondi Acquisti + Il pulsante Acquisti è nascosto + Il pulsante Acquisti è visibile + + Nascondi Salva + Il pulsante Salva è nascosto + Il pulsante Salva è mostrato + + + Pulsanti di navigazione + Nascondi o cambia i pulsanti nella barra di navigazione + + Nascondi Home + Il pulsante Home è nascosto + Il pulsante Home è visibile + + Nascondi Shorts + Il pulsante Shorts è nascosto + Il pulsante Shorts è visibile + + Nascondi Crea + Il pulsante Crea è nascosto + Il pulsante Crea è visibile + + Nascondi Iscrizioni + Il pulsante Iscrizioni è nascosto + Il pulsante Iscrizioni è visibile + Nascondi Notifiche + Il pulsante Notifiche è nascosto + Il pulsante Notifiche è visibile + + Cambia Crea con le notifiche + "Il pulsante Crea viene sostituito con il pulsante Notifiche Nota: Abilitare questa opzione nasconde anche le pubblicità video" - Il pulsante Crea non è cambiato con il pulsante Notifiche - "La disattivazione di questa impostazione disabiliterà anche il blocco degli annunci per gli Shorts. + Il pulsante Crea non è cambiato con il pulsante Notifiche + "La disattivazione di questa impostazione disabiliterà anche il blocco degli annunci per gli Shorts. Se la modifica di questa impostazione non ha effetto, prova a passare alla modalità di navigazione in incognito." - Nascondi etichette dei pulsanti di navigazione - Le etichette sono nascoste - Le etichette sono visibili - Disabilita la barra di stato traslucida - La barra di stato è opaca - La barra di stato è opaca o traslucida - Su alcuni dispositivi, l\'abilitazione di questa funzione può rendere trasparente la barra di navigazione del sistema. - Disabilita la barra traslucida chiara - La barra di navigazione in modalità chiara è opaca - La barra di navigazione in modalità chiara è opaca o traslucida - Disabilita la barra traslucida scura - La barra di navigazione in modalità scura è opaca - La barra di navigazione in modalità scura è opaca o traslucida - - - Menù a comparsa - Mostra o nascondi le voci del menu di flyout del player - - Nascondi Sottotitoli - Il menu Sottotitoli è nascosto - Il menu Sottotitoli è visibile - - Nascondi Impostazioni aggiuntive - Il menu Impostazioni aggiuntive è nascosto - Il menu Impostazioni aggiuntive è visibile - - Nascondi Timer di sospensione - Il menu Timer di sospensione è nascosto - Il menu Timer di sospensione è visibile - - Nascondi Loop del video - Il menu Loop del video è nascosto - Il menu Loop del video è visibile - - Nascondi la modalità Ambient - Il menu Modalità Ambient è nascosto - Il menu Modalità Ambient è visibile - Nascondi Volume Stabile - Il menu Volume Stabile è visibile - Il menu Volume Stabile è nascosto - - Nascondi Guida e feedback - Il menu Guida e feedback è nascosto - Il menu Guida e feedback è visibile - - Nascondi Velocità di riproduzione - Il menu Velocità di riproduzione è nascosto - Il menu Velocità di riproduzione è visibile - - Nascondi Blocca schermo - Il menu Blocca Schermo è nascosto - Il menu Blocca Schermo è visibile - - Nascondi Ascolta con YouTube Music - Il menu Ascolta con YouTube Music è nascosto - Il menu Ascolta con YouTube Music è visualizzato - - Nascondi Traccia audio - Il menu Traccia audio è nascosto - Il menu Traccia audio è visibile - + Nascondi Sottotitoli + Il menu Sottotitoli è nascosto + Il menu Sottotitoli è visibile + + Nascondi Impostazioni aggiuntive + Il menu Impostazioni aggiuntive è nascosto + Il menu Impostazioni aggiuntive è visibile + + Nascondi Timer di sospensione + Il menu Timer di sospensione è nascosto + Il menu Timer di sospensione è visibile + + Nascondi Loop del video + Il menu Loop del video è nascosto + Il menu Loop del video è visibile + + Nascondi la modalità Ambient + Il menu Modalità Ambient è nascosto + Il menu Modalità Ambient è visibile + Nascondi Volume Stabile + Il menu Volume Stabile è visibile + Il menu Volume Stabile è nascosto + + Nascondi Guida e feedback + Il menu Guida e feedback è nascosto + Il menu Guida e feedback è visibile + + Nascondi Velocità di riproduzione + Il menu Velocità di riproduzione è nascosto + Il menu Velocità di riproduzione è visibile + + Nascondi Blocca schermo + Il menu Blocca Schermo è nascosto + Il menu Blocca Schermo è visibile + + Nascondi Ascolta con YouTube Music + Il menu Ascolta con YouTube Music è nascosto + Il menu Ascolta con YouTube Music è visualizzato + + Nascondi Traccia audio + Il menu Traccia audio è nascosto + Il menu Traccia audio è visibile + - "Il menu della traccia audio è nascosto + "Il menu della traccia audio è nascosto Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \"Android No SDK\"" - - Nascondi Guarda in VR - Il menu Guarda in VR è nascosto - Il menu Guarda in VR è visibile - Nascondi menu qualità video - Il menu della qualità video è nascosto - Il menu della qualità video è visualizzato - Nascondi piè di pagina del menu qualità video - Il piè di pagina del menu di qualità video è nascosto - Il piè di pagina del menu di qualità video è visibile - - - Nascondi il pulsante Riproduzione Automatica - Il pulsante Riproduzione Automatica è nascosto - Il pulsante Riproduzione Automatica è visibile - - Nascondi il pulsante Sottotitoli - Il pulsante Sottotitoli è nascosto - Il pulsante Sottotitoli è visibile - Nascondi il pulsante Trasmetti - Il pulsante Trasmetti è nascosto - Il pulsante Trasmetti è visibile - Nascondi lo sfondo dei controlli del player - Lo sfondo dei controlli del player è nascosto - Lo sfondo dei controlli del player è mostrato - Nascondi i pulsanti Precedente e Successivo - I pulsanti sono nascosti - I pulsanti sono visibili - - - Nascondi le schede della schermata finale - Le schede della schermata finale sono nascoste - Le schede della schermata finale sono visibili - - - Disattiva la modalità Ambient a schermo intero - Modalità Ambient disabilitata - Modalità Ambient abilitata - - - Nascondi schede info - Le schede informative verranno nascoste - Le schede informative verranno mostrate - - - Disattiva l\'effetto contatore dei numeri - L\'effetto contatore dei numeri è disattivato - L\'effetto contatore dei numeri è attivato - - - Nascondi barra di ricerca del lettore video - La barra di avanzamento nel player video è nascosta - La barra di avanzamento nel player video video è visibile - - Nascondi barra di ricerca delle miniature video - La barra di ricerca delle miniature video è nascosta - La barra di ricerca delle miniature video è mostrata - - - Player Shorts - Nascondi o mostra i componenti del lettore Shorts - - Nascondi Shorts nel feed Home - Nascosto nel feed Home e nei video correlati - Mostrato nel feed Home e nei video correlati - Nascondi gli Shorts dei risultati di ricerca - Nascosti nei risultati di ricerca - Mostrati nei risultati di ricerca - - Nascondi Shorts nel feed Iscrizioni - Nascosto nel feed Iscrizioni - Mostrato nel feed Iscrizioni - Nascondi Shorts nella cronologia - Nascosti nella cronologia di visualizzazione - Mostrato nella cronologia - Nascondi l\'etichetta \'Doppiato automaticamente\' - L\'etichetta doppiata automaticamente è nascosta - L\'etichetta doppiata automaticamente è mostrata - Nascondi il pulsante \'Acquista Super Grazie\' - Il pulsante Acquista Super Grazie è nascosto - Il pulsante Acquista Super Grazie è mostrato - Nascondi pulsante effetto - Il pulsante Effetto è nascosto - Il pulsante Effetto è mostrato - Nascondi il pulsante \'Schermo verde\' - Il pulsante Schermo verde è nascosto - Il pulsante Schermo verde è visibile - Nascondi il pulsante Hashtag - Il pulsante Hashtag è nascosto - Il pulsante Hashtag è visibile - - Nascondi il pulsante Abbonati - Il pulsante Abbonati è nascosto - Il pulsante Abbonati è visibile - Nascondi anteprima dal vivo - L\'anteprima dal vivo è nascosta - L\'anteprima dal vivo è mostrata - Nascondi etichetta di posizione - L\'etichetta di posizione è nascosta - L\'etichetta di posizione è visibile - Nascondi il pulsante \'Nuovi post\' - Il pulsante Nuovi post è nascosto - Il pulsante Nuovi post è visibile - Nascondi i pulsanti di sovrapposizione quando il video è in pausa - I pulsanti di sovrapposizione in pausa sono nascosti - I pulsanti di sovrapposizione in pausa sono visibili - Nascondi commento di anteprima - Il commento di anteprima è nascosto - Viene mostrata l\'anteprima del commento - Nascondi il pulsante \'Salva musica\' - Il pulsante Salva traccia è nascosto - Il pulsante Salva traccia è visibile - Nascondi i suggerimenti di ricerca - I suggerimenti di ricerca sono nascosti - I suggerimenti di ricerca sono visibili - Nascondi il pulsante Negozio - Il pulsante Negozio è nascosto - Il pulsante Negozio è visibile - Nascondi adesivi - Gli adesivi sono nascosti - Gli adesivi sono visibili - Nascondi il pulsante Iscriviti - Il pulsante Iscriviti è nascosto - Il pulsante Iscriviti è visibile - Nascondi i prodotti etichettati - I prodotti etichettati sono nascosti - Prodotti etichettati sono mostrati - Nascondi il pulsante Prossimamente - Il pulsante Imminente è nascosto - Il pulsante Imminente è visibile - Nascondi il pulsante \'Usa questo suono\' - Il pulsante \"Usa questo suono\" è nascosto - Il pulsante \"Usa questo suono\" è mostrato - Nascondi il pulsante \'Usa questo modello\' - Il pulsante \"Usa questo modello\" è nascosto - Il pulsante \"Usa questo modello\" è mostrato - Nascondi animazione fontana Mi piace - L\'animazione della fontana di Mi Piace è nascosta - L\'animazione della fontana di Mi Piace è visibile - Nascondi il pulsante Mi piace - Il pulsante Mi Piace è nascosto - Il pulsante Mi Piace è visibile - Nascondi il pulsante Non mi piace - Il pulsante Non Mi Piace è nascosto - Il pulsante Non Mi Piace è visibile - Nascondi il pulsante Commenti - Il pulsante Commenti è nascosto - Il pulsante Commenti è visibile - - Nascondi il pulsante Condividi - Il pulsante Condividi è nascosto - Il pulsante Condividi è visibile - - Nascondi il pulsante Remix - Il pulsante Remix è nascosto - Il pulsante Remix è visibile - Nascondi il pulsante Suono - Il pulsante Suono è nascosto - Il pulsante Suono è visibile - Nascondi pannello Informazioni - Il pannello Informazioni è nascosto - Il pannello Informazioni è visibile - Nascondi barra del canale - La barra del canale è nascosta - La barra dei canali è visibile - Nascondi il titolo del video - Il titolo del video è nascosto - Il titolo del video è mostrato - Nascondi etichetta dei metadati sonori - L\'etichetta dei metadati audio è nascosta - L\'etichetta dei metadati audio è mostrata - Nascondi etichetta link video - L\'etichetta del link del video è nascosta - L\'etichetta del link del video è visibile - Nascondi la barra di navigazione - La barra di navigazione è nascosta - La barra di navigazione è visibile - - - Nascondi video suggerito nella schermata finale - "Il video suggerito nella schermata finale è nascosto quando l'autoplay è disattivato + + Nascondi Guarda in VR + Il menu Guarda in VR è nascosto + Il menu Guarda in VR è visibile + Nascondi menu qualità video + Il menu della qualità video è nascosto + Il menu della qualità video è visualizzato + Nascondi piè di pagina del menu qualità video + Il piè di pagina del menu di qualità video è nascosto + Il piè di pagina del menu di qualità video è visibile + + + Nascondi il pulsante Riproduzione Automatica + Il pulsante Riproduzione Automatica è nascosto + Il pulsante Riproduzione Automatica è visibile + + Nascondi il pulsante Sottotitoli + Il pulsante Sottotitoli è nascosto + Il pulsante Sottotitoli è visibile + Nascondi il pulsante Trasmetti + Il pulsante Trasmetti è nascosto + Il pulsante Trasmetti è visibile + Nascondi lo sfondo dei controlli del player + Lo sfondo dei controlli del player è nascosto + Lo sfondo dei controlli del player è mostrato + Nascondi i pulsanti Precedente e Successivo + I pulsanti sono nascosti + I pulsanti sono visibili + + + Nascondi le schede della schermata finale + Le schede della schermata finale sono nascoste + Le schede della schermata finale sono visibili + + + Disattiva la modalità Ambient a schermo intero + Modalità Ambient disabilitata + Modalità Ambient abilitata + + + Nascondi schede info + Le schede informative verranno nascoste + Le schede informative verranno mostrate + + + Disattiva l\'effetto contatore dei numeri + L\'effetto contatore dei numeri è disattivato + L\'effetto contatore dei numeri è attivato + + + Nascondi barra di ricerca del lettore video + La barra di avanzamento nel player video è nascosta + La barra di avanzamento nel player video video è visibile + + Nascondi barra di ricerca delle miniature video + La barra di ricerca delle miniature video è nascosta + La barra di ricerca delle miniature video è mostrata + + + Player Shorts + Nascondi o mostra i componenti del lettore Shorts + + Nascondi Shorts nel feed Home + Nascosto nel feed Home e nei video correlati + Mostrato nel feed Home e nei video correlati + Nascondi gli Shorts dei risultati di ricerca + Nascosti nei risultati di ricerca + Mostrati nei risultati di ricerca + + Nascondi Shorts nel feed Iscrizioni + Nascosto nel feed Iscrizioni + Mostrato nel feed Iscrizioni + Nascondi Shorts nella cronologia + Nascosti nella cronologia di visualizzazione + Mostrato nella cronologia + Nascondi l\'etichetta \'Doppiato automaticamente\' + L\'etichetta doppiata automaticamente è nascosta + L\'etichetta doppiata automaticamente è mostrata + Nascondi il pulsante \'Acquista Super Grazie\' + Il pulsante Acquista Super Grazie è nascosto + Il pulsante Acquista Super Grazie è mostrato + Nascondi pulsante effetto + Il pulsante Effetto è nascosto + Il pulsante Effetto è mostrato + Nascondi il pulsante \'Schermo verde\' + Il pulsante Schermo verde è nascosto + Il pulsante Schermo verde è visibile + Nascondi il pulsante Hashtag + Il pulsante Hashtag è nascosto + Il pulsante Hashtag è visibile + + Nascondi il pulsante Abbonati + Il pulsante Abbonati è nascosto + Il pulsante Abbonati è visibile + Nascondi anteprima dal vivo + L\'anteprima dal vivo è nascosta + L\'anteprima dal vivo è mostrata + Nascondi etichetta di posizione + L\'etichetta di posizione è nascosta + L\'etichetta di posizione è visibile + Nascondi il pulsante \'Nuovi post\' + Il pulsante Nuovi post è nascosto + Il pulsante Nuovi post è visibile + Nascondi i pulsanti di sovrapposizione quando il video è in pausa + I pulsanti di sovrapposizione in pausa sono nascosti + I pulsanti di sovrapposizione in pausa sono visibili + Nascondi commento di anteprima + Il commento di anteprima è nascosto + Viene mostrata l\'anteprima del commento + Nascondi il pulsante \'Salva musica\' + Il pulsante Salva traccia è nascosto + Il pulsante Salva traccia è visibile + Nascondi i suggerimenti di ricerca + I suggerimenti di ricerca sono nascosti + I suggerimenti di ricerca sono visibili + Nascondi il pulsante Negozio + Il pulsante Negozio è nascosto + Il pulsante Negozio è visibile + Nascondi adesivi + Gli adesivi sono nascosti + Gli adesivi sono visibili + Nascondi il pulsante Iscriviti + Il pulsante Iscriviti è nascosto + Il pulsante Iscriviti è visibile + Nascondi i prodotti etichettati + I prodotti etichettati sono nascosti + Prodotti etichettati sono mostrati + Nascondi il pulsante Prossimamente + Il pulsante Imminente è nascosto + Il pulsante Imminente è visibile + Nascondi il pulsante \'Usa questo suono\' + Il pulsante \"Usa questo suono\" è nascosto + Il pulsante \"Usa questo suono\" è mostrato + Nascondi il pulsante \'Usa questo modello\' + Il pulsante \"Usa questo modello\" è nascosto + Il pulsante \"Usa questo modello\" è mostrato + Nascondi animazione fontana Mi piace + L\'animazione della fontana di Mi Piace è nascosta + L\'animazione della fontana di Mi Piace è visibile + Nascondi il pulsante Mi piace + Il pulsante Mi Piace è nascosto + Il pulsante Mi Piace è visibile + Nascondi il pulsante Non mi piace + Il pulsante Non Mi Piace è nascosto + Il pulsante Non Mi Piace è visibile + Nascondi il pulsante Commenti + Il pulsante Commenti è nascosto + Il pulsante Commenti è visibile + + Nascondi il pulsante Condividi + Il pulsante Condividi è nascosto + Il pulsante Condividi è visibile + + Nascondi il pulsante Remix + Il pulsante Remix è nascosto + Il pulsante Remix è visibile + Nascondi il pulsante Suono + Il pulsante Suono è nascosto + Il pulsante Suono è visibile + Nascondi pannello Informazioni + Il pannello Informazioni è nascosto + Il pannello Informazioni è visibile + Nascondi barra del canale + La barra del canale è nascosta + La barra dei canali è visibile + Nascondi il titolo del video + Il titolo del video è nascosto + Il titolo del video è mostrato + Nascondi etichetta dei metadati sonori + L\'etichetta dei metadati audio è nascosta + L\'etichetta dei metadati audio è mostrata + Nascondi etichetta link video + L\'etichetta del link del video è nascosta + L\'etichetta del link del video è visibile + Nascondi la barra di navigazione + La barra di navigazione è nascosta + La barra di navigazione è visibile + + + Nascondi video suggerito nella schermata finale + "Il video suggerito nella schermata finale è nascosto quando l'autoplay è disattivato L'autoplay può essere modificato nelle impostazioni di YouTube: Impostazioni → Riproduzione → Riproduzione automatica video successivo" - Il video suggerito nella schermata finale è mostrato - - - Nascondi overlay video correlati - L\'overlay dei video correlati in modalità a schermo intero è nascosto - L\'overlay dei video correlati in modalità a schermo intero è mostrato - - - Nascondi timestamp video - Il timestamp è nascosto - Il timestamp è visibile - - - Nascondi i pannelli popup del player - I pannelli popup del player sono nascosti - I pannelli popup del player sono visibili - - - Esci dalla modalità schermo intero al termine del video - Disabilitato - Verticale - Orizzontale - Verticale e orizzontale - - - Apri i video in verticale a schermo intero - I video vengono aperti a schermo intero - I video non vengono aperti a schermo intero - - - Opacità sovrapposizione del player - Il valore dell\'opacità compreso tra 0 e 100, dove 0 è trasparente - L\'opacità della sovrapposizione del lettore deve essere compresa tra 0-100 - - - - Non Mi Piace temporaneamente non disponibili (API scaduto) - Non Mi Piace non disponibili (stato: %d) - I \"Non mi piace\" non sono disponibili (limite API client) - Non Mi Piace non disponibili (%s) - - Ricarica il video per votare usando Return YouTube Dislike - - Nascosto dal proprietario - Return YouTube Dislike - I Non Mi Piace sono visibili - I Non Mi Piace non sono visibili - Mostra i Non Mi Piace degli Shorts - "I \"Non mi piace\" sugli Shorts sono visualizzati + Il video suggerito nella schermata finale è mostrato + + + Nascondi overlay video correlati + L\'overlay dei video correlati in modalità a schermo intero è nascosto + L\'overlay dei video correlati in modalità a schermo intero è mostrato + + + Nascondi timestamp video + Il timestamp è nascosto + Il timestamp è visibile + + + Nascondi i pannelli popup del player + I pannelli popup del player sono nascosti + I pannelli popup del player sono visibili + + + Esci dalla modalità schermo intero al termine del video + Disabilitato + Verticale + Orizzontale + Verticale e orizzontale + + + Apri i video in verticale a schermo intero + I video vengono aperti a schermo intero + I video non vengono aperti a schermo intero + + + Opacità sovrapposizione del player + Il valore dell\'opacità compreso tra 0 e 100, dove 0 è trasparente + L\'opacità della sovrapposizione del lettore deve essere compresa tra 0-100 + + + + Non Mi Piace temporaneamente non disponibili (API scaduto) + Non Mi Piace non disponibili (stato: %d) + I \"Non mi piace\" non sono disponibili (limite API client) + Non Mi Piace non disponibili (%s) + + Ricarica il video per votare usando Return YouTube Dislike + + Nascosto dal proprietario + Return YouTube Dislike + I Non Mi Piace sono visibili + I Non Mi Piace non sono visibili + Mostra i Non Mi Piace degli Shorts + "I \"Non mi piace\" sugli Shorts sono visualizzati Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito" - I \"Non mi piace\" sugli Shorts non sono visualizzati - I Non Mi piace in percentuale - I \"Non mi piace\" sono visualizzati come percentuale - I \"Non mi piace\" sono visualizzati come numero - - Attiva il pulsante Mi piace compatto - Pulsante Mi Piace riadattato per una larghezza minima - Pulsante Mi Piace riadattato per la migliore visualizzazione - Mostra \"Mi piace\" stimati - I video con - I \"Mi piace\" stimati non sono mostrati - Mostra un toast se l\'API non è disponibile - Una notifica è mostrata se Return YouTube Dislike non è disponibile - Nessuna notifica viene mostrata se Return YouTube Dislike non è disponibile - ReturnYouTubeDislike.com - I dati vengono forniti dall\'API Return YouTube Dislike. Tocca qui per saperne di più - - Statistiche dell\'API di ReturnYouTubeDislike per questo dispositivo - Tempo di risposta dell\'API, media - Tempo di risposta dell\'API, minimo - Tempo di risposta dell\'API, massimo - Tempo di risposta dell\'API, ultimo video - Non Mi Piace temporaneamente non disponibile - Limite di velocità dell\'API client in vigore - Fetch API, numero di chiamate - Nessuna chiamata di rete effettuata - %d chiamate di rete effettuate - Fetch API, numero di timeout - Nessuna chiamata di rete scaduta - Chiamate di rete %d scadute - Limiti di velocità client API - Nessun limite di velocità client riscontrato - Limite di velocità client rilevato %d volte - %d millisecondi - - - Attiva la barra di ricerca estesa - La barra di ricerca estesa è abilitata - La barra di ricerca estesa è disabilitata - - - Abilita miniature di alta qualità - Le miniature della barra di avanzamento sono di alta qualità - Le miniature della barra di avanzamento sono di media qualità - Le miniature della barra di ricerca a schermo intero sono di alta qualità - Le miniature della barra di ricerca a schermo intero sono di media qualità - "Questo ripristinerà anche le miniature sulle dirette che non hanno miniature della barra di avanzamento. + I \"Non mi piace\" sugli Shorts non sono visualizzati + I Non Mi piace in percentuale + I \"Non mi piace\" sono visualizzati come percentuale + I \"Non mi piace\" sono visualizzati come numero + + Attiva il pulsante Mi piace compatto + Pulsante Mi Piace riadattato per una larghezza minima + Pulsante Mi Piace riadattato per la migliore visualizzazione + Mostra \"Mi piace\" stimati + I video con + I \"Mi piace\" stimati non sono mostrati + Mostra un toast se l\'API non è disponibile + Una notifica è mostrata se Return YouTube Dislike non è disponibile + Nessuna notifica viene mostrata se Return YouTube Dislike non è disponibile + ReturnYouTubeDislike.com + I dati vengono forniti dall\'API Return YouTube Dislike. Tocca qui per saperne di più + + Statistiche dell\'API di ReturnYouTubeDislike per questo dispositivo + Tempo di risposta dell\'API, media + Tempo di risposta dell\'API, minimo + Tempo di risposta dell\'API, massimo + Tempo di risposta dell\'API, ultimo video + Non Mi Piace temporaneamente non disponibile - Limite di velocità dell\'API client in vigore + Fetch API, numero di chiamate + Nessuna chiamata di rete effettuata + %d chiamate di rete effettuate + Fetch API, numero di timeout + Nessuna chiamata di rete scaduta + Chiamate di rete %d scadute + Limiti di velocità client API + Nessun limite di velocità client riscontrato + Limite di velocità client rilevato %d volte + %d millisecondi + + + Attiva la barra di ricerca estesa + La barra di ricerca estesa è abilitata + La barra di ricerca estesa è disabilitata + + + Abilita miniature di alta qualità + Le miniature della barra di avanzamento sono di alta qualità + Le miniature della barra di avanzamento sono di media qualità + Le miniature della barra di ricerca a schermo intero sono di alta qualità + Le miniature della barra di ricerca a schermo intero sono di media qualità + "Questo ripristinerà anche le miniature sulle dirette che non hanno miniature della barra di avanzamento. Le miniature della barra di avanzamento utilizzeranno la stessa qualità del video corrente. Questa funzione funziona meglio con una qualità video di 720p o inferiore e quando si utilizza una connessione Internet molto veloce." - Ripristina vecchie miniature della barra di avanzamento - Le miniature della barra di avanzamento appariranno sopra la barra di avanzamento - Le miniature della barra di avanzamento appariranno a schermo intero - - - SponsorBlock - Abilita SponsorBlock - SponsorBlock è un sistema collaborativo creato per saltare le parti fastidiose nei video di YouTube - Aspetto - Mostra il pulsante di voto - Il pulsante di voto del segmento è visibile - Il pulsante di voto del segmento è nascosto - Usa layout squadrato - Pulsanti e controlli sono squadrati - Pulsanti e controlli sono arrotondati - - Usa il pulsante Salta compatto - Pulsante Salta riadattato per una larghezza minima - Pulsante Salta riadattato per la migliore visualizzazione - Nascondi automaticamente il pulsante Salta - Il pulsante Salta si nasconde dopo alcuni secondi - Il pulsante Salta è mostrato per l\'intero segmento - Durata pulsante Salta - Per quanto tempo mostrare i pulsanti Salta e Salta a evidenziazione prima che si nascondano automaticamente - Mostra toast annulla salto - Il toast viene mostrato quando un segmento viene automaticamente saltato. Tocca la notifica toast per annullare il salto - Il toast non viene mostrato - Durata toast Salta - Per quanto tempo mostrare il toast annulla salto - 1 secondo - 2 secondi - 3 secondi - 4 secondi - 5 secondi - 6 secondi - 7 secondi - 8 secondi - 9 secondi - 10 secondi - Mostra la durata del video senza segmenti - La durata del video meno tutti i segmenti è mostrata sulla barra di ricerca - La durata totale del video è visibile - Creazione di nuovi segmenti - Mostra il pulsante Crea nuovo segmento - Il pulsante Crea nuovo segmento è visibile - Il pulsante Crea nuovo segmento non è visibile - Regola passo del nuovo segmento - Il tempo in millisecondi che spostano i pulsanti quando si creano nuovi segmenti - Il valore deve essere un numero positivo - Leggi le linee guida - Le linee guida contengono regole e suggerimenti per la creazione di nuovi segmenti - Segui le linee guida - Leggi le linee guida di SponsorBlock prima di creare nuovi segmenti - Già lette - Mostramele - Generale - Mostra una notifica se l\'API non è disponibile - La notifica è mostrata se SponsorBlock non è disponibile - La notifica è nascosta se SponsorBlock non è disponibile - Attiva il monitoraggio del conteggio dei salti - Quanto permette al sistema di classifica di SponsorBlock di sapere quanto tempo le persone hanno risparmiato. Viene inviato un messaggio al server ogni volta che salti un segmento - Il monitoraggio del contatore dei salti è disattivato - Durata minima del segmento - I segmenti più corti di questo valore (in secondi) non verranno mostrati o saltati - Durata del tempo non valida - Il tuo ID utente privato - Questo dovrebbe essere tenuto privato. Questo è come una password e non dovrebbe essere condiviso con nessuno. Se qualcuno possiede questo ID, ti può impersonare - L\'ID utente privato deve essere lungo almeno 30 caratteri - Modifica l\'URL dell\'API - L\'indirizzo SponsorBlock usato per contattare il server - Reimposta l\'URL dell\'API - URL dell\'API non è valido - URL dell\'API modificato - Importa/Esporta impostazioni - Copia - La tua configurazione di SponsorBlock in JSON può essere importata/esportata su ReVanced ed altre piattaforme SponsorBlock - La tua configurazione di SponsorBlock in JSON che può essere importata o esportata su ReVanced e su altre piattaforme SponsorBlock. Questo include il tuo ID utente univoco, quindi assicurati di condividerlo con saggezza - Impostazioni importate con successo - Importazione non riuscita: %s - Esportazione non riuscita: %s - "Le tue impostazioni contengono un ID utente privato di SponsorBlock. + Ripristina vecchie miniature della barra di avanzamento + Le miniature della barra di avanzamento appariranno sopra la barra di avanzamento + Le miniature della barra di avanzamento appariranno a schermo intero + + + SponsorBlock + Abilita SponsorBlock + SponsorBlock è un sistema collaborativo creato per saltare le parti fastidiose nei video di YouTube + Aspetto + Mostra il pulsante di voto + Il pulsante di voto del segmento è visibile + Il pulsante di voto del segmento è nascosto + Usa layout squadrato + Pulsanti e controlli sono squadrati + Pulsanti e controlli sono arrotondati + + Usa il pulsante Salta compatto + Pulsante Salta riadattato per una larghezza minima + Pulsante Salta riadattato per la migliore visualizzazione + Nascondi automaticamente il pulsante Salta + Il pulsante Salta si nasconde dopo alcuni secondi + Il pulsante Salta è mostrato per l\'intero segmento + Durata pulsante Salta + Per quanto tempo mostrare i pulsanti Salta e Salta a evidenziazione prima che si nascondano automaticamente + Mostra toast annulla salto + Il toast viene mostrato quando un segmento viene automaticamente saltato. Tocca la notifica toast per annullare il salto + Il toast non viene mostrato + Durata toast Salta + Per quanto tempo mostrare il toast annulla salto + 1 secondo + 2 secondi + 3 secondi + 4 secondi + 5 secondi + 6 secondi + 7 secondi + 8 secondi + 9 secondi + 10 secondi + Mostra la durata del video senza segmenti + La durata del video meno tutti i segmenti è mostrata sulla barra di ricerca + La durata totale del video è visibile + Creazione di nuovi segmenti + Mostra il pulsante Crea nuovo segmento + Il pulsante Crea nuovo segmento è visibile + Il pulsante Crea nuovo segmento non è visibile + Regola passo del nuovo segmento + Il tempo in millisecondi che spostano i pulsanti quando si creano nuovi segmenti + Il valore deve essere un numero positivo + Leggi le linee guida + Le linee guida contengono regole e suggerimenti per la creazione di nuovi segmenti + Segui le linee guida + Leggi le linee guida di SponsorBlock prima di creare nuovi segmenti + Già lette + Mostramele + Generale + Mostra una notifica se l\'API non è disponibile + La notifica è mostrata se SponsorBlock non è disponibile + La notifica è nascosta se SponsorBlock non è disponibile + Attiva il monitoraggio del conteggio dei salti + Quanto permette al sistema di classifica di SponsorBlock di sapere quanto tempo le persone hanno risparmiato. Viene inviato un messaggio al server ogni volta che salti un segmento + Il monitoraggio del contatore dei salti è disattivato + Durata minima del segmento + I segmenti più corti di questo valore (in secondi) non verranno mostrati o saltati + Durata del tempo non valida + Il tuo ID utente privato + Questo dovrebbe essere tenuto privato. Questo è come una password e non dovrebbe essere condiviso con nessuno. Se qualcuno possiede questo ID, ti può impersonare + L\'ID utente privato deve essere lungo almeno 30 caratteri + Modifica l\'URL dell\'API + L\'indirizzo SponsorBlock usato per contattare il server + Reimposta l\'URL dell\'API + URL dell\'API non è valido + URL dell\'API modificato + Importa/Esporta impostazioni + Copia + La tua configurazione di SponsorBlock in JSON può essere importata/esportata su ReVanced ed altre piattaforme SponsorBlock + La tua configurazione di SponsorBlock in JSON che può essere importata o esportata su ReVanced e su altre piattaforme SponsorBlock. Questo include il tuo ID utente univoco, quindi assicurati di condividerlo con saggezza + Impostazioni importate con successo + Importazione non riuscita: %s + Esportazione non riuscita: %s + "Le tue impostazioni contengono un ID utente privato di SponsorBlock. Il tuo ID utente è come una password e non dovrebbe mai essere condiviso." - Non mostrare più - Cambia il comportamento del segmento - Sponsorizzazione - Promozione a pagamento, rinvii a pagamento e pubblicità diretta. Non per auto-promozione o gridare gratis a cause/creatori/siti web/prodotti che gradiscono - Non pagata/Auto Promozione - Simili agli Sponsor, ma sono promozioni non pagate o autopromozioni. Questo include segmenti sul merchandising, donazioni o informazioni dei collaboratori del video - Promemoria di interazione (iscrizione) - Un breve promemoria per piacere, iscriversi o seguirli nel mezzo dei contenuti. Se è lungo o su qualcosa di specifico, dovrebbe invece essere sotto auto-promozione - Momento saliente - La parte del video che la maggior parte delle persone sta cercando - Interruzione/Animazione Introduzione - Un intervallo senza contenuto effettivo. Potrebbe essere una pausa, un quadro statico o un\'animazione ripetitiva. Non include transizioni contenenti informazioni - Conclusioni / Titoli di coda - Riconoscimenti o quando appaiono le carte finali di YouTube. Non per conclusioni con informazioni - Introduzione / Saluti - Trailer narrati per il video in arrivo, saluti e addii. Non include sezioni che aggiungono contenuti aggiuntivi - Anteprima / Riepilogo - Raccolta di clip che mostrano ciò che è in arrivo o ciò che è successo nel video o in altri video di una serie, dove tutte le informazioni sono ripetute altrove - Divagazione / Battute - Scene o battute tangenziali che non sono necessarie per comprendere il contenuto principale del video. Non include sezioni che forniscono contesto o dettagli di sfondo - Musica: Sezione Non-Musicale - Solo per l\'uso in video musicali. Sezioni di video musicali senza musica, che non sono già coperti da un\'altra categoria - Salta - Momento saliente - Salta sponsor - Salta promozione - Salta promemoria - Vai al momento saliente - Salta introduzione - Salta intermezzo - Salta intermezzo - Salta conclusione - Salta aggancio - Salta anteprima - Salta anteprima - Salta riepilogo - Salta tangenziale - Salta sezione non-musicale - Salta segmento - Sponsorizzazione saltata - Autopromozione saltata - Promemoria indesiderato saltato - Passato al momento saliente - Introduzione saltata - Intermezzo saltato - Intermezzo saltato - Conclusione saltata - Aggancio saltato - Anteprima saltata - Anteprima saltata - Riepilogo saltato - Tangenziale saltata - Sezione non-musicale saltata - Segmento non inviato saltato - Segmenti multipli saltati - Salta automaticamente - Salta automaticamente una volta - Mostra il pulsante Salta - Mostra nella barra di avanzamento - Disabilita - Impossibile inviare il segmento: %s - SponsorBlock è temporaneamente non disponibile - Impossibile inviare il segmento (stato: %1$d %2$s) - Invio del segmento non riuscito. Frequenza limitata (troppi dello stesso utente o IP) - Impossibile inviare il segmento: %s - "Impossibile inviare il segmento. + Non mostrare più + Cambia il comportamento del segmento + Sponsorizzazione + Promozione a pagamento, rinvii a pagamento e pubblicità diretta. Non per auto-promozione o gridare gratis a cause/creatori/siti web/prodotti che gradiscono + Non pagata/Auto Promozione + Simili agli Sponsor, ma sono promozioni non pagate o autopromozioni. Questo include segmenti sul merchandising, donazioni o informazioni dei collaboratori del video + Promemoria di interazione (iscrizione) + Un breve promemoria per piacere, iscriversi o seguirli nel mezzo dei contenuti. Se è lungo o su qualcosa di specifico, dovrebbe invece essere sotto auto-promozione + Momento saliente + La parte del video che la maggior parte delle persone sta cercando + Interruzione/Animazione Introduzione + Un intervallo senza contenuto effettivo. Potrebbe essere una pausa, un quadro statico o un\'animazione ripetitiva. Non include transizioni contenenti informazioni + Conclusioni / Titoli di coda + Riconoscimenti o quando appaiono le carte finali di YouTube. Non per conclusioni con informazioni + Introduzione / Saluti + Trailer narrati per il video in arrivo, saluti e addii. Non include sezioni che aggiungono contenuti aggiuntivi + Anteprima / Riepilogo + Raccolta di clip che mostrano ciò che è in arrivo o ciò che è successo nel video o in altri video di una serie, dove tutte le informazioni sono ripetute altrove + Divagazione / Battute + Scene o battute tangenziali che non sono necessarie per comprendere il contenuto principale del video. Non include sezioni che forniscono contesto o dettagli di sfondo + Musica: Sezione Non-Musicale + Solo per l\'uso in video musicali. Sezioni di video musicali senza musica, che non sono già coperti da un\'altra categoria + Salta + Momento saliente + Salta sponsor + Salta promozione + Salta promemoria + Vai al momento saliente + Salta introduzione + Salta intermezzo + Salta intermezzo + Salta conclusione + Salta aggancio + Salta anteprima + Salta anteprima + Salta riepilogo + Salta tangenziale + Salta sezione non-musicale + Salta segmento + Sponsorizzazione saltata + Autopromozione saltata + Promemoria indesiderato saltato + Passato al momento saliente + Introduzione saltata + Intermezzo saltato + Intermezzo saltato + Conclusione saltata + Aggancio saltato + Anteprima saltata + Anteprima saltata + Riepilogo saltato + Tangenziale saltata + Sezione non-musicale saltata + Segmento non inviato saltato + Segmenti multipli saltati + Salta automaticamente + Salta automaticamente una volta + Mostra il pulsante Salta + Mostra nella barra di avanzamento + Disabilita + Impossibile inviare il segmento: %s + SponsorBlock è temporaneamente non disponibile + Impossibile inviare il segmento (stato: %1$d %2$s) + Invio del segmento non riuscito. Frequenza limitata (troppi dello stesso utente o IP) + Impossibile inviare il segmento: %s + "Impossibile inviare il segmento. Esiste già" - Segmento inviato con successo - - SponsorBlock temporaneamente non disponibile (API scaduto) - SponsorBlock temporaneamente non disponibile (stato %d) - SponsorBlock temporaneamente non disponibile - Impossibile votare per il segmento (API scaduta) - Impossibile votare per il segmento (stato: %1$d %2$s) - Impossibile votare per il segmento: %s - Mi piace - Non mi piace - Modifica categoria - Non ci sono segmenti da votare - - Da %1$s a %2$s - Scegli la categoria del segmento - La categoria è disabilitata nelle impostazioni. Abilita la categoria da inviare. - Nuovo segmento di SponsorBlock - Impostare %s come inizio o fine di un nuovo segmento? - Inizio - Fine - Ora - Minutaggio dell\'inizio del segmento - Minutaggio della fine del segmento - I valori sono corretti? - "Il segmento va da + Segmento inviato con successo + + SponsorBlock temporaneamente non disponibile (API scaduto) + SponsorBlock temporaneamente non disponibile (stato %d) + SponsorBlock temporaneamente non disponibile + Impossibile votare per il segmento (API scaduta) + Impossibile votare per il segmento (stato: %1$d %2$s) + Impossibile votare per il segmento: %s + Mi piace + Non mi piace + Modifica categoria + Non ci sono segmenti da votare + + Da %1$s a %2$s + Scegli la categoria del segmento + La categoria è disabilitata nelle impostazioni. Abilita la categoria da inviare. + Nuovo segmento di SponsorBlock + Impostare %s come inizio o fine di un nuovo segmento? + Inizio + Fine + Ora + Minutaggio dell\'inizio del segmento + Minutaggio della fine del segmento + I valori sono corretti? + "Il segmento va da %1$s a @@ -1291,47 +1290,47 @@ a (%3$s) Pronto per l'invio?" - L\'inizio deve essere prima della fine - Segna prima due posizioni sulla barra di avanzamento - Guarda l\'anteprima del segmento e verifica che lo salti senza problemi - Modifica manualmente i tempi del segmento - Vuoi modificare il tempo di l\'inizio o la fine del segmento? - Minutaggio fornito non valido - Statistiche - - Le statistiche non sono temporaneamente disponibili (l\'API non è attiva) - Caricamento... - SponsorBlock è disabilitato - Il tuo nome utente: <b>%s</b> - Tocca qui per cambiare il tuo nome utente - Impossibile modificare il nome utente: Stato: %1$d %2$s - Il tuo nome utente è stato correttamente modificato - La tua reputazione è <b>%.2f</b> - Hai creato segmenti <b>%s</b> - Tocca qui per visualizzare i tuoi segmenti - Classifica di SponsorBlock - Hai salvato le persone da <b>%s</b> segmenti - Tocca qui per vedere le statistiche globali e i migliori contributori - Questo è <b>%s</b> della loro vita.<br>Tocca qui per vedere la classifica - Hai saltato i segmenti <b>%s</b> - È <b>%s</b> - Ripristinare il contatore dei segmenti saltati? - %1$s ore %2$s minuti - %1$s minuti %2$s secondi - %s secondi - Opacità: - Colore: - Informazioni - sponsor.ajay.app - I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme - - - Fattore di forma del layout - Predefinito - Telefono - Tablet - Automotive - "Le modifiche includono: + L\'inizio deve essere prima della fine + Segna prima due posizioni sulla barra di avanzamento + Guarda l\'anteprima del segmento e verifica che lo salti senza problemi + Modifica manualmente i tempi del segmento + Vuoi modificare il tempo di l\'inizio o la fine del segmento? + Minutaggio fornito non valido + Statistiche + + Le statistiche non sono temporaneamente disponibili (l\'API non è attiva) + Caricamento... + SponsorBlock è disabilitato + Il tuo nome utente: <b>%s</b> + Tocca qui per cambiare il tuo nome utente + Impossibile modificare il nome utente: Stato: %1$d %2$s + Il tuo nome utente è stato correttamente modificato + La tua reputazione è <b>%.2f</b> + Hai creato segmenti <b>%s</b> + Tocca qui per visualizzare i tuoi segmenti + Classifica di SponsorBlock + Hai salvato le persone da <b>%s</b> segmenti + Tocca qui per vedere le statistiche globali e i migliori contributori + Questo è <b>%s</b> della loro vita.<br>Tocca qui per vedere la classifica + Hai saltato i segmenti <b>%s</b> + È <b>%s</b> + Ripristinare il contatore dei segmenti saltati? + %1$s ore %2$s minuti + %1$s minuti %2$s secondi + %s secondi + Opacità: + Colore: + Informazioni + sponsor.ajay.app + I dati sono forniti dall\'API di SponsorBlock. Tocca qui per saperne di più e vedere i download per altre piattaforme + + + Fattore di forma del layout + Predefinito + Telefono + Tablet + Automotive + "Le modifiche includono: Layout per tablet • I post della community sono nascosti @@ -1339,329 +1338,329 @@ Layout per tablet Layout per auto • Gli Shorts si aprono nel normale player • Il feed è organizzato per argomenti e canali" - - - Simula la versione dell\'app - La simulazione della versione dell\'app è attivata - La simulazione della versione dell\'app è disattivata - "La versione dell'app sarà camuffata ad una versione precedente di YouTube. + + + Simula la versione dell\'app + La simulazione della versione dell\'app è attivata + La simulazione della versione dell\'app è disattivata + "La versione dell'app sarà camuffata ad una versione precedente di YouTube. Questo cambierà l'aspetto e le funzionalità dell'app, ma potrebbero verificarsi effetti collaterali sconosciuti. Se in seguito verrà disattivato, si consiglia di cancellare i dati dell'app per evitare bug dell'interfaccia." - Target della versione dell\'app desiderata - 20.13.41 - Ripristina la barra delle azioni video non compressa - 20.05.46 - Ripristina la funzionalità della trascrizione - 19.35.36 - Ripristinare le vecchie icone del player Shorts - 19.01.34 - Ripristina le vecchie icone di navigazione - - - Cambia pagina iniziale - Predefinito - Tutte le iscrizioni - Sfoglia canali - Corsi / Formazione - Esplora - Moda e bellezza - Giochi - Cronologia - Libreria - Video piaciuti - In diretta - Film - Musica - Notizie - Notifiche - Playlist - Cerca - Acquisti - Shorts - Sport - Iscrizioni - Tendenze - Realtà Virtuale - Guarda più tardi - Le tue clip - Cambia sempre la pagina iniziale - "La pagina iniziale viene sempre modificata + Target della versione dell\'app desiderata + 20.13.41 - Ripristina la barra delle azioni video non compressa + 20.05.46 - Ripristina la funzionalità della trascrizione + 19.35.36 - Ripristinare le vecchie icone del player Shorts + 19.01.34 - Ripristina le vecchie icone di navigazione + + + Cambia pagina iniziale + Predefinito + Tutte le iscrizioni + Sfoglia canali + Corsi / Formazione + Esplora + Moda e bellezza + Giochi + Cronologia + Libreria + Video piaciuti + In diretta + Film + Musica + Notizie + Notifiche + Playlist + Cerca + Acquisti + Shorts + Sport + Iscrizioni + Tendenze + Realtà Virtuale + Guarda più tardi + Le tue clip + Cambia sempre la pagina iniziale + "La pagina iniziale viene sempre modificata Limitazione: l'utilizzo del pulsante Indietro sulla barra degli strumenti potrebbe non funzionare" - La pagina iniziale viene modificata solo all\'avvio dell\'app - - - Disabilita la ripresa del player Shorts - Il player Shorts non riprenderà all\'avvio dell\'app - Il player Shorts riprenderà all\'avvio dell\'app - - - Apri Shorts con - Lettore Shorts - Lettore normale - Lettore normale a schermo intero - - - Riproduci automaticamente gli Short - Gli Short verranno riprodotti automaticamente - Gli Short si ripeteranno - Riproduzione automatica di Shorts in background - Gli Short in background verranno riprodotti automaticamente - Gli Short in background si ripeteranno - - - Riproduttore minimizzato - Modifica lo stile del player minimizzato in-app - Tipo di Miniplayer - Disattivato - Predefinito - Minimale - Tablet - Moderno 1 - Moderno 2 - Moderno 3 - Moderno 4 - Disabilita angoli arrotondati - Gli angoli sono quadrati - Gli angoli sono arrotondati - Abilita il doppio tocco e il pizzico per ridimensionare - "I gesti Doppio Tocco e Pizzico per ridimensionare sono abilitati + La pagina iniziale viene modificata solo all\'avvio dell\'app + + + Disabilita la ripresa del player Shorts + Il player Shorts non riprenderà all\'avvio dell\'app + Il player Shorts riprenderà all\'avvio dell\'app + + + Apri Shorts con + Lettore Shorts + Lettore normale + Lettore normale a schermo intero + + + Riproduci automaticamente gli Short + Gli Short verranno riprodotti automaticamente + Gli Short si ripeteranno + Riproduzione automatica di Shorts in background + Gli Short in background verranno riprodotti automaticamente + Gli Short in background si ripeteranno + + + Riproduttore minimizzato + Modifica lo stile del player minimizzato in-app + Tipo di Miniplayer + Disattivato + Predefinito + Minimale + Tablet + Moderno 1 + Moderno 2 + Moderno 3 + Moderno 4 + Disabilita angoli arrotondati + Gli angoli sono quadrati + Gli angoli sono arrotondati + Abilita il doppio tocco e il pizzico per ridimensionare + "I gesti Doppio Tocco e Pizzico per ridimensionare sono abilitati • Tocca due volte per aumentare la dimensione del riproduttore minimizzato • Tocca di nuovo due volte per ripristinare le dimensioni originali" - L\'azione a doppio tocco e il pizzico da ridimensionare è disabilitato - Disabilita trascinamento - Trascinare e rilasciare è disabilitato - "Il gesto Trascina e Rilascia è attivato + L\'azione a doppio tocco e il pizzico da ridimensionare è disabilitato + Disabilita trascinamento + Trascinare e rilasciare è disabilitato + "Il gesto Trascina e Rilascia è attivato Il riproduttore minimizzato può essere trascinato in qualsiasi angolo dello schermo" - Disabilita gesto di trascinamento orizzontale - Gesto di trascinamento orizzontale disabilitato - "Il gesto Trascina Orizzontalmente è abilitato + Disabilita gesto di trascinamento orizzontale + Gesto di trascinamento orizzontale disabilitato + "Il gesto Trascina Orizzontalmente è abilitato Il riproduttore minimizzato può essere trascinato fuori dallo schermo a sinistra o a destra" - Nascondi i pulsanti di overlay - I pulsanti di overlay sono nascosti - I pulsanti di overlay sono visualizzati - Nascondi i pulsanti Espandi e Chiudi - "I pulsanti sono nascosti + Nascondi i pulsanti di overlay + I pulsanti di overlay sono nascosti + I pulsanti di overlay sono visualizzati + Nascondi i pulsanti Espandi e Chiudi + "I pulsanti sono nascosti Trascina per espandere o chiudere" - I pulsanti Espandi e Chiudi sono visibili - Nascondi sottotitoli - I sottotitoli sono nascosti - I sottotitoli sono visibili - Nascondi i pulsanti salta avanti e indietro - Salta avanti e indietro sono nascosti - Salta avanti e indietro sono visibili - Dimensione iniziale - Dimensione iniziale dello schermo, in pixel - La dimensione del pixel deve essere compresa tra %1$s e %2$s - Opacità di sovrapposizione - Valore di opacità tra 0-100, dove 0 è trasparente - L\'opacità della sovrapposizione Miniplayer deve essere compresa tra 0-100 - - - Abilita la schermata di caricamento col gradiente - La schermata di caricamento avrà uno sfondo col gradiente - La schermata di caricamento avrà uno sfondo a tinta unita - Stile schermata iniziale - Colore - Bianco e nero - Abilita colore personalizzato della barra di avanzamento - Il colore personalizzato della barra di avanzamento è visibile - Il colore originale della barra di avanzamento è visibile - Colore personalizzato della barra di avanzamento - Il colore della barra di avanzamento - Colore primario personalizzato per la barra di avanzamento - Il colore primario della barra di avanzamento - Valore colore barra di avanzamento non valido - - - YouTube ReVanced - YT ReVanced - YT - - - Logo dell\'intestazione - Predefinito - Regolare - Premium - ReVanced - - ReVanced minimale - Personalizzato - - - Aggira le restrizioni regionali delle immagini - Usando l\'host yt4.ggpht.com per le immagini - "Utilizzo dell'host di immagini originale + I pulsanti Espandi e Chiudi sono visibili + Nascondi sottotitoli + I sottotitoli sono nascosti + I sottotitoli sono visibili + Nascondi i pulsanti salta avanti e indietro + Salta avanti e indietro sono nascosti + Salta avanti e indietro sono visibili + Dimensione iniziale + Dimensione iniziale dello schermo, in pixel + La dimensione del pixel deve essere compresa tra %1$s e %2$s + Opacità di sovrapposizione + Valore di opacità tra 0-100, dove 0 è trasparente + L\'opacità della sovrapposizione Miniplayer deve essere compresa tra 0-100 + + + Abilita la schermata di caricamento col gradiente + La schermata di caricamento avrà uno sfondo col gradiente + La schermata di caricamento avrà uno sfondo a tinta unita + Stile schermata iniziale + Colore + Bianco e nero + Abilita colore personalizzato della barra di avanzamento + Il colore personalizzato della barra di avanzamento è visibile + Il colore originale della barra di avanzamento è visibile + Colore personalizzato della barra di avanzamento + Il colore della barra di avanzamento + Colore primario personalizzato per la barra di avanzamento + Il colore primario della barra di avanzamento + Valore colore barra di avanzamento non valido + + + YouTube ReVanced + YT ReVanced + YT + + + Logo dell\'intestazione + Predefinito + Regolare + Premium + ReVanced + + ReVanced minimale + Personalizzato + + + Aggira le restrizioni regionali delle immagini + Usando l\'host yt4.ggpht.com per le immagini + "Utilizzo dell'host di immagini originale Abilitare questa opzione può risolvere le immagini mancanti che sono bloccate in alcune regioni" - - - - Scheda Home - - Scheda Iscrizioni - - Scheda Tu - Playlist e consigli del player - Risultati della ricerca - Miniature originali - DeArrow & miniature originali - DeArrow & Cattura ancora - Istantanea - DeArrow - "DeArrow fornisce miniature crowdsourced per i video di YouTube. Queste miniature sono spesso più pertinenti di quelle fornite da YouTube + + + + Scheda Home + + Scheda Iscrizioni + + Scheda Tu + Playlist e consigli del player + Risultati della ricerca + Miniature originali + DeArrow & miniature originali + DeArrow & Cattura ancora + Istantanea + DeArrow + "DeArrow fornisce miniature crowdsourced per i video di YouTube. Queste miniature sono spesso più pertinenti di quelle fornite da YouTube Se abilitato, gli URL dei video verranno inviati al server API e non verranno inviati altri dati. Se un video non ha miniature DeArrow, vengono mostrati i fermo immagine o le miniature originali Tocca qui per saperne di più su DeArrow" - Mostra una notifica se l\'API non è disponibile - Una notifica è visibile se DeArrow non è disponibile - Nessuna notifica viene mostrata se DeArrow non è disponibile - Endpoint API di DeArrow - L\'URL dell\'endpoint della cache delle miniature di DeArrow - Istantanea - Le istantanee sono prese all\'inizio, metà o fine di ogni video. Queste immagini sono integrate in YouTube e non viene usato nessun API esterno - Usa istantanee veloci - Utilizzando le istantanee di media qualità le miniature caricheranno più velocemente, ma le dirette, i video non rilasciati o molto vecchi possono mostrare miniature vuote - Utilizzando istantanee di alta qualità - Il tempo del video da cui prendere l\'istantanea - Inizio del video - Metà del video - Fine del video - - DeArrow non è temporaneamente disponibile (codice di stato: %s) - DeArrow non è temporaneamente disponibile - - - Mostra annunci ReVanced - Gli annunci all\'avvio sono visualizzati - Gli annunci all\'avvio non sono visualizzati - Mostra annunci all\'avvio - Connessione al provider di annunci non riuscita - Chiudi - - - Abilita riproduzione video in loop - Il video verrà riprodotto in loop - Il video non verrà riprodotto in loop - - - Mostra pulsante riproduzione video in loop - Pulsante mostrato - Pulsante non mostrato - Riproduzione video in loop attivata - Riproduzione video in loop disattivata - - - Pausa se l\'audio si interrompe - La riproduzione si ferma quando vengono riprodotti altri audio (es. il navigatore) - Il volume diminuisce quando si riproducono altri audio - - - Simula le dimensioni del dispositivo - "Dimensioni del dispositivo simulate + Mostra una notifica se l\'API non è disponibile + Una notifica è visibile se DeArrow non è disponibile + Nessuna notifica viene mostrata se DeArrow non è disponibile + Endpoint API di DeArrow + L\'URL dell\'endpoint della cache delle miniature di DeArrow + Istantanea + Le istantanee sono prese all\'inizio, metà o fine di ogni video. Queste immagini sono integrate in YouTube e non viene usato nessun API esterno + Usa istantanee veloci + Utilizzando le istantanee di media qualità le miniature caricheranno più velocemente, ma le dirette, i video non rilasciati o molto vecchi possono mostrare miniature vuote + Utilizzando istantanee di alta qualità + Il tempo del video da cui prendere l\'istantanea + Inizio del video + Metà del video + Fine del video + + DeArrow non è temporaneamente disponibile (codice di stato: %s) + DeArrow non è temporaneamente disponibile + + + Mostra annunci ReVanced + Gli annunci all\'avvio sono visualizzati + Gli annunci all\'avvio non sono visualizzati + Mostra annunci all\'avvio + Connessione al provider di annunci non riuscita + Chiudi + + + Abilita riproduzione video in loop + Il video verrà riprodotto in loop + Il video non verrà riprodotto in loop + + + Mostra pulsante riproduzione video in loop + Pulsante mostrato + Pulsante non mostrato + Riproduzione video in loop attivata + Riproduzione video in loop disattivata + + + Pausa se l\'audio si interrompe + La riproduzione si ferma quando vengono riprodotti altri audio (es. il navigatore) + Il volume diminuisce quando si riproducono altri audio + + + Simula le dimensioni del dispositivo + "Dimensioni del dispositivo simulate Potrebbero essere sbloccate qualità video più elevate, ma potresti riscontrare rallentamenti nella riproduzione video, una durata della batteria peggiore ed effetti collaterali sconosciuti" - "Dimensioni del dispositivo non simulate + "Dimensioni del dispositivo non simulate Abilitare questa opzione può sbloccare qualità video più elevate" - Abilitando questo può causare stuttering nella riproduzione del video, peggiorare la durata della batteria e causare effetti collaterali sconosciuti. - - - Feedback aptico - Modifica feedback aptico - Disabilita aptica capitoli - Aptica capitoli disabilitata - Aptica capitoli abilitata - Disabilita aptica di ricerca precisa - L\'aptica di ricerca precisa è disabilitata - Aptica di ricerca precisa abilitata - Disabilita l\'aptica di annullamento della ricerca - L\'aptica di annullamento della ricerca è disabilitata - L\'aptica di annullamento della ricerca è abilitata - Disabilita zoom aptico - Lo zoom aptico è disabilitato - Lo zoom aptico è abilitato - - - Se di recente hai modificato i dettagli di accesso al tuo account, disinstalla e reinstalla MicroG. - - - Aggira reindirizzamenti dell\'URL - I reindirizzamenti URL sono aggirati - I reindirizzamenti URL non sono aggirati - - - Apri link nel browser - Apertura dei link nel browser esterno - Apertura dei link nel browser in-app - - - - Automatico - Ricorda le modifiche della qualità del video - Le modifiche della qualità si applicano a tutti i video - Le modifiche della qualità si applicano solo al video corrente - Mostra messaggio a comparsa al cambiamento della qualità video - Viene mostrato un messaggio a comparsa quando la qualità video predefinita viene modificata - Un messaggio a comparsa non viene mostrato quando la qualità video predefinita viene modificata - Qualità video predefinita sulla rete Wi-Fi - Qualità video predefinita sulla rete mobile - Ricorda le modifiche alla qualità di Shorts - Le modifiche della qualità si applicano a tutti gli Shorts - Le modifiche della qualità si applicano solo allo Short corrente - Qualità predefinita di Shorts sulla rete Wi-Fi - Qualità predefinita di Shorts sulla rete mobile - cellulare - WiFi - Modificato la qualità predefinita %1$s in: %2$s - Modificata la qualità Shorts %1$s in: %2$s - - - Mostra il pulsante Velocità Video - Il pulsante della finestra di dialogo della velocità è visualizzato. Tieni premuto per ripristinare la velocità di riproduzione predefinita - Il pulsante della finestra di dialogo della velocità non è visualizzato - - - Mostra il pulsante qualità video - Il pulsante della qualità video è visualizzato. Tocca e tieni premuto per ripristinare la qualità predefinita - Il pulsante della qualità video non è visualizzato - - - Menu di velocità di riproduzione personalizzato - Il menu di velocità personalizzato è visibile - Il menu di velocità personalizzato non è visibile - Ripristina il vecchio menu della velocità di riproduzione - Il vecchio menu della velocità è mostrato - Il menu della velocità moderno è mostrato - Velocità di riproduzione personalizzate - Aggiungi o modifica la velocità di riproduzione personalizzata - Le velocità personalizzate devono essere inferiori a %s - Velocità di riproduzione personalizzata non valida - Automatico - Velocità personalizzata di tocca e tieni premuto - Velocità di riproduzione tra 0-8 - - - Ricorda le modifiche della velocità di riproduzione - Le modifiche alla velocità di riproduzione si applicano a tutti i video - Le modifiche della velocità di riproduzione si applicano solo al video corrente - Mostra messaggio a comparsa al cambiamento della velocità di riproduzione - Viene mostrato un messaggio a comparsa quando la velocità di riproduzione predefinita viene modificata - Un messaggio a comparsa non viene mostrato quando la velocità di riproduzione predefinita viene modificata - Velocità di riproduzione predefinita - Cambiato la velocità predefinita a: %s - - - Disattiva video in HDR - I video in HDR sono disabilitati - I video in HDR sono abilitati - Forza AVC (H.264) - Il codec video è forzato ad AVC (H.264) - Il codec video è determinato automaticamente - "Vantaggi: + Abilitando questo può causare stuttering nella riproduzione del video, peggiorare la durata della batteria e causare effetti collaterali sconosciuti. + + + Feedback aptico + Modifica feedback aptico + Disabilita aptica capitoli + Aptica capitoli disabilitata + Aptica capitoli abilitata + Disabilita aptica di ricerca precisa + L\'aptica di ricerca precisa è disabilitata + Aptica di ricerca precisa abilitata + Disabilita l\'aptica di annullamento della ricerca + L\'aptica di annullamento della ricerca è disabilitata + L\'aptica di annullamento della ricerca è abilitata + Disabilita zoom aptico + Lo zoom aptico è disabilitato + Lo zoom aptico è abilitato + + + Se di recente hai modificato i dettagli di accesso al tuo account, disinstalla e reinstalla MicroG. + + + Aggira reindirizzamenti dell\'URL + I reindirizzamenti URL sono aggirati + I reindirizzamenti URL non sono aggirati + + + Apri link nel browser + Apertura dei link nel browser esterno + Apertura dei link nel browser in-app + + + + Automatico + Ricorda le modifiche della qualità del video + Le modifiche della qualità si applicano a tutti i video + Le modifiche della qualità si applicano solo al video corrente + Mostra messaggio a comparsa al cambiamento della qualità video + Viene mostrato un messaggio a comparsa quando la qualità video predefinita viene modificata + Un messaggio a comparsa non viene mostrato quando la qualità video predefinita viene modificata + Qualità video predefinita sulla rete Wi-Fi + Qualità video predefinita sulla rete mobile + Ricorda le modifiche alla qualità di Shorts + Le modifiche della qualità si applicano a tutti gli Shorts + Le modifiche della qualità si applicano solo allo Short corrente + Qualità predefinita di Shorts sulla rete Wi-Fi + Qualità predefinita di Shorts sulla rete mobile + cellulare + WiFi + Modificato la qualità predefinita %1$s in: %2$s + Modificata la qualità Shorts %1$s in: %2$s + + + Mostra il pulsante Velocità Video + Il pulsante della finestra di dialogo della velocità è visualizzato. Tieni premuto per ripristinare la velocità di riproduzione predefinita + Il pulsante della finestra di dialogo della velocità non è visualizzato + + + Mostra il pulsante qualità video + Il pulsante della qualità video è visualizzato. Tocca e tieni premuto per ripristinare la qualità predefinita + Il pulsante della qualità video non è visualizzato + + + Menu di velocità di riproduzione personalizzato + Il menu di velocità personalizzato è visibile + Il menu di velocità personalizzato non è visibile + Ripristina il vecchio menu della velocità di riproduzione + Il vecchio menu della velocità è mostrato + Il menu della velocità moderno è mostrato + Velocità di riproduzione personalizzate + Aggiungi o modifica la velocità di riproduzione personalizzata + Le velocità personalizzate devono essere inferiori a %s + Velocità di riproduzione personalizzata non valida + Automatico + Velocità personalizzata di tocca e tieni premuto + Velocità di riproduzione tra 0-8 + + + Ricorda le modifiche della velocità di riproduzione + Le modifiche alla velocità di riproduzione si applicano a tutti i video + Le modifiche della velocità di riproduzione si applicano solo al video corrente + Mostra messaggio a comparsa al cambiamento della velocità di riproduzione + Viene mostrato un messaggio a comparsa quando la velocità di riproduzione predefinita viene modificata + Un messaggio a comparsa non viene mostrato quando la velocità di riproduzione predefinita viene modificata + Velocità di riproduzione predefinita + Cambiato la velocità predefinita a: %s + + + Disattiva video in HDR + I video in HDR sono disabilitati + I video in HDR sono abilitati + Forza AVC (H.264) + Il codec video è forzato ad AVC (H.264) + Il codec video è determinato automaticamente + "Vantaggi: • Può migliorare la durata della batteria • Può ripristinare risoluzioni video mancanti su dispositivi più vecchi @@ -1670,182 +1669,182 @@ Limitazioni: • La riproduzione video utilizzerà più dati internet rispetto a VP9 o AV1 • I video HDR non utilizzeranno AVC • Alcuni dispositivi non possono forzare AVC" - - - Mostra il menu avanzato della qualità video - Viene mostrato il menu avanzato della qualità video - Il menu avanzato della qualità video non viene mostrato - - - Abilita scorri per avanzare - Scorri per avanzare è abilitato - Scorri per avanzare non è abilitato - - - Consenti Android VR AV1 - "Il codec video è AVC (H.264), VP9 o AV1 + + + Mostra il menu avanzato della qualità video + Viene mostrato il menu avanzato della qualità video + Il menu avanzato della qualità video non viene mostrato + + + Abilita scorri per avanzare + Scorri per avanzare è abilitato + Scorri per avanzare non è abilitato + + + Consenti Android VR AV1 + "Il codec video è AVC (H.264), VP9 o AV1 La riproduzione potrebbe subire interruzioni o perdere fotogrammi" - Il codec video è AVC (H.264) o VP9 - "Abilitando questa impostazione potrebbe essere utilizzata la decodifica AV1 via software. + Il codec video è AVC (H.264) o VP9 + "Abilitando questa impostazione potrebbe essere utilizzata la decodifica AV1 via software. La riproduzione video con AV1 potrebbe rallentare o perdere fotogrammi." - Effetti collaterali della falsificazione - • Client sperimentale e potrebbe smettere di funzionare in qualsiasi momento - • Il video potrebbe interrompersi all\'1:00, o potrebbe non essere disponibile in alcune regioni - • Manca il menu delle tracce audio - • Nessun codec video AV1 - • Il volume stabile non è disponibile - • I video dei bambini potrebbero non essere riprodotti quando si è disconnessi o in modalità di navigazione in incognito - - • L\'audio originale forzato non è disponibile - Mostra nelle statistiche per nerd - Il tipo di client è mostrato nelle statistiche per nerd - Il client è nascosto nelle statistiche per nerd - - - - - YT Music ReVanced - Music ReVanced - Music - - - Informazioni - Annunci - Generale - Lettore - Varie - - - Nascondi annunci video - Gli annunci video sono nascosti - Gli annunci video sono mostrati - - - Abilita ripetizione permanente - La ripetizione permanente è abilitata - La ripetizione permanente è disabilitata - - - Nascondi pulsante trasmissione - Il pulsante di trasmissione è nascosto - Il pulsante di trasmissione è mostrato - Nascondi pulsante cronologia - Il pulsante cronologia è nascosto - Il pulsante cronologia è mostrato - Nascondi pulsante notifica - Il pulsante di notifica è nascosto - Il pulsante di notifica è mostrato - Nascondi pulsante ricerca - Il pulsante di ricerca è nascosto - Il pulsante di ricerca è mostrato - - - Nascondi barra delle categorie - La barra delle categorie è nascosta - La barra delle categorie è mostrata - - - Modifica colore miniplayer - Il colore del miniplayer corrisponde a quello del lettore a schermo intero - Il miniplayer usa il colore predefinito - - - Barra di navigazione - Nascondi o modifica i pulsanti della barra di navigazione - - Nascondi Home - Il pulsante Home è nascosto - Il pulsante Home è mostrato - - Nascondi Esempi - Il pulsante Campioni è nascosto - Il pulsante Campioni è mostrato - - Nascondi Esplora - Il pulsante Esplora è nascosto - Il pulsante Esplora è mostrato - - Nascondi Libreria - Il pulsante Libreria è nascosto - Il pulsante Libreria è mostrato - - Nascondi Aggiorna - Il pulsante Aggiorna è nascosto - Il pulsante Aggiorna è mostrato - Nascondi la barra di navigazione - La barra di navigazione è nascosta - La barra di navigazione è mostrata - Nascondi le etichette dei pulsanti di navigazione - Le etichette sono nascoste - Le etichette sono mostrate - - - Nascondi l\'etichetta \'Ottieni Music Premium\' - L\'etichetta è nascosta - L\'etichetta è mostrata - - - Nascondi pulsante di aggiornamento - Il pulsante è nascosto - Il pulsante è mostrato - - - - - Blocca le pubblicità audio - Le pubblicità audio sono bloccate - Le pubblicità audio sono sbloccate - - - %s non disponibile, le pubblicità potrebbero essere visualizzate. Prova a modificare il servizio di blocco delle pubblicità nelle impostazioni. - %s ha restituito un errore, le pubblicità potrebbero essere visualizzate. Prova a modificare il servizio di blocco delle pubblicità nelle impostazioni. - Blocca pubblicità video incorporata - Disabilitato - Proxy luminoso - Proxy PurpleAdBlock - - - Blocca pubblicità video - Le pubblicità video sono bloccate - Le pubblicità video sono sbloccate - - - Messaggio eliminato - Mostra messaggi eliminati - Non mostrare i messaggi eliminati - Nascondi i messaggi eliminati dietro uno spoiler - Mostra i messaggi eliminati come testo sbarrato - - - Riscatta automaticamente i punti del canale - I punti del canale vengono riscattati automaticamente - I punti del canale non vengono riscattati automaticamente - - - - Abilita la modalità debug di Twitch - La modalità debug di Twitch è abilitata (non consigliato) - La modalità debug di Twitch è disabilitata - - - Impostazioni di ReVanced - Informazioni - Informazioni su ReVanced - Blocco annunci - Impostazioni blocco annunci - Chat - Impostazioni della chat - Varie - Impostazioni varie - Impostazioni generali - Altre impostazioni - Pubblicità lato client - Pubblicità surestream lato server - Log di debug - I log di debug sono abilitati - I log di debug sono disabilitati - - + Effetti collaterali della falsificazione + • Client sperimentale e potrebbe smettere di funzionare in qualsiasi momento + • Il video potrebbe interrompersi all\'1:00, o potrebbe non essere disponibile in alcune regioni + • Manca il menu delle tracce audio + • Nessun codec video AV1 + • Il volume stabile non è disponibile + • I video dei bambini potrebbero non essere riprodotti quando si è disconnessi o in modalità di navigazione in incognito + + • L\'audio originale forzato non è disponibile + Mostra nelle statistiche per nerd + Il tipo di client è mostrato nelle statistiche per nerd + Il client è nascosto nelle statistiche per nerd + + + + + YT Music ReVanced + Music ReVanced + Music + + + Informazioni + Annunci + Generale + Lettore + Varie + + + Nascondi annunci video + Gli annunci video sono nascosti + Gli annunci video sono mostrati + + + Abilita ripetizione permanente + La ripetizione permanente è abilitata + La ripetizione permanente è disabilitata + + + Nascondi pulsante trasmissione + Il pulsante di trasmissione è nascosto + Il pulsante di trasmissione è mostrato + Nascondi pulsante cronologia + Il pulsante cronologia è nascosto + Il pulsante cronologia è mostrato + Nascondi pulsante notifica + Il pulsante di notifica è nascosto + Il pulsante di notifica è mostrato + Nascondi pulsante ricerca + Il pulsante di ricerca è nascosto + Il pulsante di ricerca è mostrato + + + Nascondi barra delle categorie + La barra delle categorie è nascosta + La barra delle categorie è mostrata + + + Modifica colore miniplayer + Il colore del miniplayer corrisponde a quello del lettore a schermo intero + Il miniplayer usa il colore predefinito + + + Barra di navigazione + Nascondi o modifica i pulsanti della barra di navigazione + + Nascondi Home + Il pulsante Home è nascosto + Il pulsante Home è mostrato + + Nascondi Esempi + Il pulsante Campioni è nascosto + Il pulsante Campioni è mostrato + + Nascondi Esplora + Il pulsante Esplora è nascosto + Il pulsante Esplora è mostrato + + Nascondi Libreria + Il pulsante Libreria è nascosto + Il pulsante Libreria è mostrato + + Nascondi Aggiorna + Il pulsante Aggiorna è nascosto + Il pulsante Aggiorna è mostrato + Nascondi la barra di navigazione + La barra di navigazione è nascosta + La barra di navigazione è mostrata + Nascondi le etichette dei pulsanti di navigazione + Le etichette sono nascoste + Le etichette sono mostrate + + + Nascondi l\'etichetta \'Ottieni Music Premium\' + L\'etichetta è nascosta + L\'etichetta è mostrata + + + Nascondi pulsante di aggiornamento + Il pulsante è nascosto + Il pulsante è mostrato + + + + + Blocca le pubblicità audio + Le pubblicità audio sono bloccate + Le pubblicità audio sono sbloccate + + + %s non disponibile, le pubblicità potrebbero essere visualizzate. Prova a modificare il servizio di blocco delle pubblicità nelle impostazioni. + %s ha restituito un errore, le pubblicità potrebbero essere visualizzate. Prova a modificare il servizio di blocco delle pubblicità nelle impostazioni. + Blocca pubblicità video incorporata + Disabilitato + Proxy luminoso + Proxy PurpleAdBlock + + + Blocca pubblicità video + Le pubblicità video sono bloccate + Le pubblicità video sono sbloccate + + + Messaggio eliminato + Mostra messaggi eliminati + Non mostrare i messaggi eliminati + Nascondi i messaggi eliminati dietro uno spoiler + Mostra i messaggi eliminati come testo sbarrato + + + Riscatta automaticamente i punti del canale + I punti del canale vengono riscattati automaticamente + I punti del canale non vengono riscattati automaticamente + + + + Abilita la modalità debug di Twitch + La modalità debug di Twitch è abilitata (non consigliato) + La modalità debug di Twitch è disabilitata + + + Impostazioni di ReVanced + Informazioni + Informazioni su ReVanced + Blocco annunci + Impostazioni blocco annunci + Chat + Impostazioni della chat + Varie + Impostazioni varie + Impostazioni generali + Altre impostazioni + Pubblicità lato client + Pubblicità surestream lato server + Log di debug + I log di debug sono abilitati + I log di debug sono disabilitati + + diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index 2c9e065848..3684eb16e7 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -17,1264 +17,1263 @@ "First 'item' text Second \"item\" text" ---> - - - - שם האפליקציה - - מותאם אישית - אייקון האפליקציה - מקורי - - ReVanced מינימלי - ReVanced מותאם גודל - - מותאם אישית - - - בדיקות נכשלו - פתח אתר רשמי - התעלם - <h5>נראה שיישום זה לא תוקן על ידך.</h5><br>ייתכן שיישום זה לא יפעל כראוי, <b>יכול להיות מזיק ואפילו מסוכן לשימוש</b>.<br><br>בדיקות אלה מרמזות שיישום זה תוקן מראש או הושג ממישהו אחר:<br><br><small>%1$s</small><br>מומלץ בחום <b>להסיר יישום זה ולתקן אותו בעצמך</b> כדי להבטיח שאתה משתמש ביישום מאומת ומאובטח.<p><br>אם תתעלם מכך, אזהרה זו תוצג רק פעמיים. - תוקן במכשיר אחר - לא הותקן על ידי ReVanced Manager - תוקן לפני יותר מ-10 דקות - תוקן לפני %s ימים - תאריך בניית ה-APK פגום - - - הודעת ReVanced - היסטוריית הצפייה שלך לא נשמרת.<br><br>סביר להניח שזה נגרם על ידי חוסם מודעות ברמת DNS או פרוקסי רשת.<br><br>כדי לתקן זאת, רשום את <b>s.youtube.com</b> ברשימת ההיתרים או כבה את כל חוסמי ה-DNS והפרוקסים. - אל תציג שוב - - - הגדרות - האם אתה בטוח שברצונך להמשיך? - שמור - איפוס - אפס צבע - צבע לא חוקי - נדרשת הפעלה מחדש - יש להפעיל מחדש את היישום כדי שהשינוי ייכנס לתוקף. - הפעלה מחדש - ייבוא - העתק - הגדרות ReVanced אופסו לברירת מחדל - %d הגדרות יובאו - ייבוא נכשל: %s - חפש בהגדרות - לא נמצאו תוצאות עבור \'%s\' - נסה מילת מפתח אחרת - חיפושים אחרונים - להסיר מהיסטוריית חיפוש? - נקה היסטוריית חיפושים - האם אתה בטוח שברצונך למחוק את כל היסטוריית החיפושים? - טיפים לחיפוש - "• הקש על נתיב כדי לנווט אליו +--> + + + שם האפליקציה + + מותאם אישית + אייקון האפליקציה + מקורי + + ReVanced מינימלי + ReVanced מותאם גודל + + מותאם אישית + + + בדיקות נכשלו + פתח אתר רשמי + התעלם + <h5>נראה שיישום זה לא תוקן על ידך.</h5><br>ייתכן שיישום זה לא יפעל כראוי, <b>יכול להיות מזיק ואפילו מסוכן לשימוש</b>.<br><br>בדיקות אלה מרמזות שיישום זה תוקן מראש או הושג ממישהו אחר:<br><br><small>%1$s</small><br>מומלץ בחום <b>להסיר יישום זה ולתקן אותו בעצמך</b> כדי להבטיח שאתה משתמש ביישום מאומת ומאובטח.<p><br>אם תתעלם מכך, אזהרה זו תוצג רק פעמיים. + תוקן במכשיר אחר + לא הותקן על ידי ReVanced Manager + תוקן לפני יותר מ-10 דקות + תוקן לפני %s ימים + תאריך בניית ה-APK פגום + + + הודעת ReVanced + היסטוריית הצפייה שלך לא נשמרת.<br><br>סביר להניח שזה נגרם על ידי חוסם מודעות ברמת DNS או פרוקסי רשת.<br><br>כדי לתקן זאת, רשום את <b>s.youtube.com</b> ברשימת ההיתרים או כבה את כל חוסמי ה-DNS והפרוקסים. + אל תציג שוב + + + הגדרות + האם אתה בטוח שברצונך להמשיך? + שמור + איפוס + אפס צבע + צבע לא חוקי + נדרשת הפעלה מחדש + יש להפעיל מחדש את היישום כדי שהשינוי ייכנס לתוקף. + הפעלה מחדש + ייבוא + העתק + הגדרות ReVanced אופסו לברירת מחדל + %d הגדרות יובאו + ייבוא נכשל: %s + חפש בהגדרות + לא נמצאו תוצאות עבור \'%s\' + נסה מילת מפתח אחרת + חיפושים אחרונים + להסיר מהיסטוריית חיפוש? + נקה היסטוריית חיפושים + האם אתה בטוח שברצונך למחוק את כל היסטוריית החיפושים? + טיפים לחיפוש + "• הקש על נתיב כדי לנווט אליו • לחיצה ארוכה על הגדרה כדי לנווט אליה • לחץ על Enter כדי לשמור שאילתת חיפוש להיסטוריה • החיפוש מתעלם מאותיות גדולות/קטנות וסימני פיסוק • הגדרות הורים מופיעות מעל הגדרות ילדים מושבתות" - היסטוריית החיפוש ריקה - כדי לשמור היסטוריית חיפוש, הקלד שאילתת חיפוש ולחץ על Enter - הצג הגדרות היסטוריית חיפוש - הגדרות היסטוריית חיפוש מוצגות - הגדרות היסטוריית חיפוש אינן מוצגות - הצג סמלי הגדרות ReVanced - סמלי ההגדרות מוצגים - סמלי ההגדרות אינם מוצגים - שפת ReVanced - "תרגומים עבור שפות מסוימות עשויים להיות חסרים או לא מלאים. + היסטוריית החיפוש ריקה + כדי לשמור היסטוריית חיפוש, הקלד שאילתת חיפוש ולחץ על Enter + הצג הגדרות היסטוריית חיפוש + הגדרות היסטוריית חיפוש מוצגות + הגדרות היסטוריית חיפוש אינן מוצגות + הצג סמלי הגדרות ReVanced + סמלי ההגדרות מוצגים + סמלי ההגדרות אינם מוצגים + שפת ReVanced + "תרגומים עבור שפות מסוימות עשויים להיות חסרים או לא מלאים. כדי לתרגם שפות חדשות או לשפר את התרגומים הקיימים, בקר ב-translate.revanced.app" - שפת היישום - ייבוא / ייצוא - ייבוא / ייצוא הגדרות ReVanced - - אתה משתמש בגרסת ReVanced Patches <i>%s</i> - הערה - גרסה זו היא קדם-הפצה וייתכן שתיתקל בבעיות בלתי צפויות - קישורים רשמיים - + אתה משתמש בגרסת ReVanced Patches <i>%s</i> + הערה + גרסה זו היא קדם-הפצה וייתכן שתיתקל בבעיות בלתי צפויות + קישורים רשמיים + - - - הגדרות GmsCore - הגדרות עבור GmsCore - - היישום MicroG GmsCore אינו מותקן. התקן אותו. - דרושה פעולה - "ל-MicroG GmsCore אין הרשאה לרוץ ברקע. + + + הגדרות GmsCore + הגדרות עבור GmsCore + + היישום MicroG GmsCore אינו מותקן. התקן אותו. + דרושה פעולה + "ל-MicroG GmsCore אין הרשאה לרוץ ברקע. עקוב אחר המדריך \"Don't kill my app\" עבור הטלפון שלך, והחל את ההוראות על התקנת ה-MicroG שלך. זה נדרש כדי שהיישום יעבוד." - פתח אתר - "מיטובי הסוללה של MicroG GmsCore חייבים להיות מושבתים כדי למנוע בעיות. + פתח אתר + "מיטובי הסוללה של MicroG GmsCore חייבים להיות מושבתים כדי למנוע בעיות. השבתת מיטובי הסוללה עבור MicroG לא תשפיע לרעה על השימוש בסוללה. הקש על הלחצן 'המשך' ואפשר שינויי מיטוב." - המשך - - - זיוף זרמי וידאו - זייף את זרמי הווידאו של הלקוח כדי למנוע בעיות השמעה - זייף זרמי וידאו - "מתבצעת התחזות לזרמי וידאו + המשך + + + זיוף זרמי וידאו + זייף את זרמי הווידאו של הלקוח כדי למנוע בעיות השמעה + זייף זרמי וידאו + "מתבצעת התחזות לזרמי וידאו אם אתה משתמש YouTube Premium, ייתכן שהגדרה זו אינה נחוצה" - "זרמי וידאו אינם מזויפים + "זרמי וידאו אינם מזויפים ההשמעה עשויה שלא לפעול" - כיבוי הגדרה זו עלול לגרום לבעיות השמעה. - לקוח ברירת מחדל - - - כפה שפת שמע מקורית - שימוש בשפת שמע מקורית - שימוש בשמע ברירת מחדל - - כדי להשתמש בתכונה זו, שנה את \'זיוף זרמי וידאו\' לכל לקוח מלבד Android Studio - - - איתור באגים - הפעל או השבת אפשרויות לאיתור באגים - רישום איתור באגים - יומני איתור באגים מופעלים - יומני איתור באגים מושבתים - רשום עקבות מחסנית - יומני איתור באגים כוללים עקבות מחסנית - יומני איתור באגים אינם כוללים עקבות מחסנית - הצג הודעה קופצת בעת שגיאת ReVanced - הודעה קופצת מוצגת אם מתרחשת שגיאה - הודעה קופצת אינה מוצגת אם מתרחשת שגיאה - "השבתת הודעות שגיאה קופצות מסתירה את כל הודעות השגיאה של ReVanced. + כיבוי הגדרה זו עלול לגרום לבעיות השמעה. + לקוח ברירת מחדל + + + כפה שפת שמע מקורית + שימוש בשפת שמע מקורית + שימוש בשמע ברירת מחדל + + כדי להשתמש בתכונה זו, שנה את \'זיוף זרמי וידאו\' לכל לקוח מלבד Android Studio + + + איתור באגים + הפעל או השבת אפשרויות לאיתור באגים + רישום איתור באגים + יומני איתור באגים מופעלים + יומני איתור באגים מושבתים + רשום עקבות מחסנית + יומני איתור באגים כוללים עקבות מחסנית + יומני איתור באגים אינם כוללים עקבות מחסנית + הצג הודעה קופצת בעת שגיאת ReVanced + הודעה קופצת מוצגת אם מתרחשת שגיאה + הודעה קופצת אינה מוצגת אם מתרחשת שגיאה + "השבתת הודעות שגיאה קופצות מסתירה את כל הודעות השגיאה של ReVanced. לא תקבל הודעה על אירועים בלתי צפויים." - ייצוא יומני איתור באגים - מעתיק יומנים לאיתור באגים של Revanced ללוח ההעתקה - תיעוד איתור באגים מושבת - לא נמצאו יומנים - היומנים הועתקו - נכשל לייצא יומנים: %s - נקה יומני איתור באגים - מנקה את כל היומנים לאיתור באגים של Revanced המאוחסנים - היומנים נוקו - Manager דגלי תכונות - נהל דגלי תכונות בוליאניים - דגלים פעילים (%d) - דגלים חסומים (%d) - חפש דגלים... - הדגלים נשמרו - הדגלים אופסו - הדגלים הועתקו ללוח - רשום פרוטוקול חוצץ - יומני איתור באגים כוללים פרוטוקול חוצץ - יומני איתור באגים אינם כוללים פרוטוקול חוצץ - "הפעלת הגדרה זו תתעד נתוני פריסה נוספים, כולל טקסט שעל המסך עבור רכיבי ממשק משתמש מסוימים. + ייצוא יומני איתור באגים + מעתיק יומנים לאיתור באגים של Revanced ללוח ההעתקה + תיעוד איתור באגים מושבת + לא נמצאו יומנים + היומנים הועתקו + נכשל לייצא יומנים: %s + נקה יומני איתור באגים + מנקה את כל היומנים לאיתור באגים של Revanced המאוחסנים + היומנים נוקו + Manager דגלי תכונות + נהל דגלי תכונות בוליאניים + דגלים פעילים (%d) + דגלים חסומים (%d) + חפש דגלים... + הדגלים נשמרו + הדגלים אופסו + הדגלים הועתקו ללוח + רשום פרוטוקול חוצץ + יומני איתור באגים כוללים פרוטוקול חוצץ + יומני איתור באגים אינם כוללים פרוטוקול חוצץ + "הפעלת הגדרה זו תתעד נתוני פריסה נוספים, כולל טקסט שעל המסך עבור רכיבי ממשק משתמש מסוימים. זה יכול לעזור לזהות רכיבים בעת יצירת מסננים מותאמים אישית. עם זאת, הפעלת הגדרה זו תתעד גם כמה נתוני משתמש כמו כתובת ה-IP שלך." - - - טיהור קישורי שיתוף - פרמטר מעקב מוסר מקישורי שיתוף - פרמטר מעקב אינו מוסר מקישורי שיתוף - שנה קישורי שיתוף ל-youtube.com - קישורים משותפים משתמשים ב-youtube.com - קישורים משותפים משתמשים ב-music.youtube.com - - - מסנן מותאם אישית - הסתר רכיבים באמצעות מסננים מותאמים אישית - הפעל מסנן מותאם אישית - מסנן מותאם אישית מופעל - מסנן מותאם אישית מושבת - מסנן מותאם אישית - - רשימה של מחרוזות בונה נתיב רכיבים לסינון מופרדות על ידי שורה חדשה - מסנן מותאם אישית לא חוקי: %s - - - - - אודות - מודעות - תמונות ממוזערות חלופיות - פיד - כללי - נגן - סרגל דילוג - פקדי החלקה - שונות - סרטון - שחזר תפריטי הגדרות ישנים - תפריטי הגדרות ישנים מוצגים - תפריטי הגדרות ישנים אינם מוצגים - - - השבת הפעלה ברקע של Shorts - הפעלה ברקע של Shorts מושבתת - הפעלה ברקע של Shorts מופעלת - - - הסתר כרטיסי אלבום - כרטיסי אלבום מוסתרים - כרטיסי אלבום מוצגים - הסתר כרטיסי אמן - כרטיסי אמן מוסתרים - כרטיסי אמן מוצגים - הסתר מדף צ\'יפים - מדף צ\'יפים מוסתר - מדף צ\'יפים מוצג - הסתר פוסטים קהילתיים - פוסטים קהילתיים מוסתרים - פוסטים קהילתיים מוצגים - הסתר כרזות קומפקטיות - כרזות קומפקטיות מוסתרות - כרזות קומפקטיות מוצגות - הסתר כרטיס הניתן להרחבה - כרטיס הניתן להרחבה מתחת לסרטונים מוסתר - כרטיס הניתן להרחבה מתחת לסרטונים מוצג - הסתר לחצן מיקרופון צף - לחצן מיקרופון צף בחיפוש מוסתר - לחצן מיקרופון צף בחיפוש מוצג - הסתר מדפים אופקיים - "מדפים אופקיים מוסתרים, כגון: + + + טיהור קישורי שיתוף + פרמטר מעקב מוסר מקישורי שיתוף + פרמטר מעקב אינו מוסר מקישורי שיתוף + שנה קישורי שיתוף ל-youtube.com + קישורים משותפים משתמשים ב-youtube.com + קישורים משותפים משתמשים ב-music.youtube.com + + + מסנן מותאם אישית + הסתר רכיבים באמצעות מסננים מותאמים אישית + הפעל מסנן מותאם אישית + מסנן מותאם אישית מופעל + מסנן מותאם אישית מושבת + מסנן מותאם אישית + + רשימה של מחרוזות בונה נתיב רכיבים לסינון מופרדות על ידי שורה חדשה + מסנן מותאם אישית לא חוקי: %s + + + + + אודות + מודעות + תמונות ממוזערות חלופיות + פיד + כללי + נגן + סרגל דילוג + פקדי החלקה + שונות + סרטון + שחזר תפריטי הגדרות ישנים + תפריטי הגדרות ישנים מוצגים + תפריטי הגדרות ישנים אינם מוצגים + + + השבת הפעלה ברקע של Shorts + הפעלה ברקע של Shorts מושבתת + הפעלה ברקע של Shorts מופעלת + + + הסתר כרטיסי אלבום + כרטיסי אלבום מוסתרים + כרטיסי אלבום מוצגים + הסתר כרטיסי אמן + כרטיסי אמן מוסתרים + כרטיסי אמן מוצגים + הסתר מדף צ\'יפים + מדף צ\'יפים מוסתר + מדף צ\'יפים מוצג + הסתר פוסטים קהילתיים + פוסטים קהילתיים מוסתרים + פוסטים קהילתיים מוצגים + הסתר כרזות קומפקטיות + כרזות קומפקטיות מוסתרות + כרזות קומפקטיות מוצגות + הסתר כרטיס הניתן להרחבה + כרטיס הניתן להרחבה מתחת לסרטונים מוסתר + כרטיס הניתן להרחבה מתחת לסרטונים מוצג + הסתר לחצן מיקרופון צף + לחצן מיקרופון צף בחיפוש מוסתר + לחצן מיקרופון צף בחיפוש מוצג + הסתר מדפים אופקיים + "מדפים אופקיים מוסתרים, כגון: • מבזקי חדשות • המשך צפייה • גלה עוד ערוצים • רלוונטיות • קניות • צפה שוב" - מדפים אופקיים מוצגים - הסתר מדף תמונות - מדף תמונות בתוצאות חיפוש מוסתר - מדף תמונות בתוצאות חיפוש מוצג - הסתר פוסטים אחרונים - הפוסטים האחרונים מוסתרים - הפוסטים האחרונים מוצגים - הסתר פלייליסטים של מיקס - פלייליסטים של מיקס מוסתרים - פלייליסטים של מיקס מוצגים - הסתר את מדור הסרטים - מדור הסרטים מוסתר - מדור הסרטים מוצג - - הסתר לחצן \'אני רוצה לקבל התראה\' - הלחצן \'הודע לי\' מוסתר - הלחצן \'הודע לי\' מוצג - הסתר משחקייה - המשחקייה מוסתרת - המשחקייה מוצגת - - הסתר לחצן \'הצג עוד\' - הלחצן \'הצג עוד\' בתוצאות חיפוש מוסתר - הלחצן \'הצג עוד\' בתוצאות החיפוש מוצג - הסתר סקרים - הסקרים מוסתרים - הסקרים מוצגים - הסתר מדף כרטיסים - מדף כרטיסים מוסתר - מדף כרטיסים מוצג - - הסתר תוויות המלצות סרטונים - התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות החיפוש מוסתרות - התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות חיפוש מוצגות - הסתר מפריד חזותי - המפריד החזותי מוסתר - המפריד החזותי מוצג - - הסתר YouTube Doodles - הנפשת YouTube Doodles על הלוגו מוסתרת - הנפשת YouTube Doodles על הלוגו מוצגת - "שרבוטים (Doodles) של YouTube מוצגים למשך כמה ימים בכל שנה. + הסתר לחצן \'הצג עוד\' + הלחצן \'הצג עוד\' בתוצאות חיפוש מוסתר + הלחצן \'הצג עוד\' בתוצאות החיפוש מוצג + הסתר סקרים + הסקרים מוסתרים + הסקרים מוצגים + הסתר מדף כרטיסים + מדף כרטיסים מוסתר + מדף כרטיסים מוצג + + הסתר תוויות המלצות סרטונים + התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות החיפוש מוסתרות + התוויות \'אנשים גם צפו\' ו\'אולי תאהב גם\' בתוצאות חיפוש מוצגות + הסתר מפריד חזותי + המפריד החזותי מוסתר + המפריד החזותי מוצג + + הסתר YouTube Doodles + הנפשת YouTube Doodles על הלוגו מוסתרת + הנפשת YouTube Doodles על הלוגו מוצגת + "שרבוטים (Doodles) של YouTube מוצגים למשך כמה ימים בכל שנה. אם Doodle מוצג כרגע באזור שלך והגדרת ההסתרה הזו מופעלת, אז גם סרגל הסינון שמתחת לסרגל החיפוש יוסתר." - הסתר סרגל ערוץ - סרגל הערוץ מוסתר - סרגל הערוץ מוצג - הסתר סימן מים של ערוץ - סימן מים מוסתר - סימן מים מוצג - הסתר תיבת מימון המונים - תיבת מימון המונים מוסתרת - תיבת מימון המונים מוצגת - הסתר תיבות חירום - תיבות החירום מוסתרות - תיבות החירום מוצגות - הסתר לוחות מידע - לוחות המידע מוסתרים - לוחות המידע מוצגים - - הסתר לחצן להצטרפות - לחצן הצטרפות מוסתר - לחצן הצטרפות מוצג - הסתר לוחות רפואיים - לוחות רפואיים מוסתרים - לוחות רפואיים מוצגים - הסתר פעולות מהירות - פעולות מהירות במסך מלא מוסתרות - פעולות מהירות במסך מלא מוצגות - הסתר סרטונים קשורים - סרטונים קשורים בפעולות מהירות מוסתרים - סרטונים קשורים בפעולות מהירות מוצגים - הסתר את הנחיות המנויים - הנחיות קהילת המנויים מוסרת - הנחיות קהילת המנויים מוצגות - הסתר תגובות באמוג\'י מתוזמנות - תגובות באמוג\'י מתוזמנות מוסתרות - תגובות באמוג\'י מתוזמנות מוצגות - הסתר את \'סיכום הווידאו שנוצר על ידי בינה מלאכותית\' - קטע סיכום סרטון הנוצר על ידי AI מוסתר - קטע סיכום סרטון הנוצר על ידי AI מוצג - הסתר Ask - מדור Ask מוסתר - מדור Ask מוצג - הסתר מאפיינים - המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוסתרים - המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוצגים - הסתר פרקים - מדור הפרקים מוסתר - מדור הפרקים מוצג - הסתר את \'איך התוכן הזה נוצר\' - מדור \'איך התוכן הזה נוצר\' מוסתר - מדור \'איך התוכן הזה נוצר\' מוצג - הסתר נקודות הייפ - נקודות הייפ מוסתרות - נקודות הייפ מוצגות - הסתר את \'גלה את הפודקאסט\' - מדור \'גלה את הפודקאסט\' מוסתר - מדור \'גלה את הפודקאסט\' מוצג - הסתר קישורים מומלצים - קטע קישורים מוצגים מוסתר - קטע קישורים מוצגים מוצג - הסתר סרטונים מוצגים - קטע סרטונים מוצגים מוסתר - קטע סרטונים מוצגים מוצג - הסתר כרטיסי מידע - מדור כרטיסי המידע מוסתר - מדור כרטיסי המידע מוצג - הסתר \'מושגי מפתח\' - מדור מושגי מפתח מוסתר - מדור מושגי מפתח מוצג - הסתר לחצן \'הירשם\' - לחצן \'הירשם\' מוסתר - לחצן \'הירשם\' מוצג - הסתר תמליל - מדור התמליל מוסתר - מדור התמליל מוצג - תיאור סרטון - הסתר או הצג רכיבי תיאור סרטון - סרגל סינון - הסתר או הצג את סרגל הסינון בפידים, סרטונים קשורים, תוצאות חיפוש, והיסטוריית צפייה - הסתר בפידים - מוסתר בפידים - מוצג בפידים - הסתר בסרטונים קשורים - מוסתר בסרטונים קשורים - מוצג בסרטונים קשורים - הסתר בתוצאות חיפוש - מוסתר בתוצאות חיפוש - מוצג בתוצאות חיפוש - הסתר בהיסטוריית הצפייה - מוסתר בהיסטוריית הצפייה - מוצג בהיסטוריית הצפייה - דף ערוץ - הסתר או הצג רכיבי דף ערוץ - - הסתר לחצן קהילה - הלחצן \'קהילה\' מוסתר - הלחצן \'קהילה\' מוצג - - הסתר מדף \'בשבילך\' - המדף \'בשבילך\' מוסתר - המדף \'בשבילך\' מוצג - - הסתר לחצן \'הצטרפות\' - לחצן הצטרפות מוסתר - לחצן הצטרפות מוצג - הסתר תצוגה מקדימה של קישורים - תצוגה מקדימה של קישורים מוסתרת - תצוגה מקדימה של קישורים מוצגת - הסתר מדף חברים - מדף חברים מוסתר - מדף חברים מוצג - - הסתר לחצן \'חנות\' - הלחצן \'חנות\' מוסתר - הלחצן \'חנות\' מוצג - - הסתר לחצן \'הירשם\' - הלחצן \'הירשם\' מוסתר - הלחצן \'הירשם\' מוצג - תגובות - הסתר או הצג רכיבי מדור תגובות - הסתר סיכום AI של צ\'אט - סיכום AI של צ\'אט מוסתר - סיכום AI של צ\'אט מוצג - הסתר סיכום תגובות AI - סיכום AI של תגובות מוסתר - סיכום AI של תגובות מוצג - הסתר הנחיות ערוץ - הנחיות הערוץ מוסתרות - הנחיות הערוץ מוצגות - הסתר כותרת \'תגובות של חברי מועדון\' - כותרת \'תגובות של חברי מועדון\' מוסתרת - כותרת \'תגובות של חברי מועדון\' מוצגת - הסתר מדור תגובות - מדור התגובות מוסתר - מדור התגובות מוצג - הסתר הנחיות קהילה - הנחיות הקהילה מוסתרות - הנחיות הקהילה מוצגות - הסתר לחצן \'יצירת Short\' - לחצן יצירת Short מוסתר - לחצן יצירת Short מוצג - הסתר לחצני אימוג\'י וחותמת זמן - לחצני אימוג\'י וחותמת זמן מוסתרים - לחצני אימוג\'י וחותמת זמן מוצגים - הסתר תצוגה מקדימה של תגובה - תצוגה מקדימה של תגובה מוסתרת - תצוגה מקדימה של תגובה מוצגת - הסתר לחצן תודה - לחצן תודה מוסתר - לחצן תודה מוצג - הסתר ספירת צפיות - ספירת הצפיות מוסתרת בפיד ובתוצאות החיפוש - ספירת הצפיות מוצגת בפיד ובתוצאות החיפוש - - "מגבלות: + הסתר לחצן להצטרפות + לחצן הצטרפות מוסתר + לחצן הצטרפות מוצג + הסתר לוחות רפואיים + לוחות רפואיים מוסתרים + לוחות רפואיים מוצגים + הסתר פעולות מהירות + פעולות מהירות במסך מלא מוסתרות + פעולות מהירות במסך מלא מוצגות + הסתר סרטונים קשורים + סרטונים קשורים בפעולות מהירות מוסתרים + סרטונים קשורים בפעולות מהירות מוצגים + הסתר את הנחיות המנויים + הנחיות קהילת המנויים מוסרת + הנחיות קהילת המנויים מוצגות + הסתר תגובות באמוג\'י מתוזמנות + תגובות באמוג\'י מתוזמנות מוסתרות + תגובות באמוג\'י מתוזמנות מוצגות + הסתר את \'סיכום הווידאו שנוצר על ידי בינה מלאכותית\' + קטע סיכום סרטון הנוצר על ידי AI מוסתר + קטע סיכום סרטון הנוצר על ידי AI מוצג + הסתר Ask + מדור Ask מוסתר + מדור Ask מוצג + הסתר מאפיינים + המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוסתרים + המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוצגים + הסתר פרקים + מדור הפרקים מוסתר + מדור הפרקים מוצג + הסתר את \'איך התוכן הזה נוצר\' + מדור \'איך התוכן הזה נוצר\' מוסתר + מדור \'איך התוכן הזה נוצר\' מוצג + הסתר נקודות הייפ + נקודות הייפ מוסתרות + נקודות הייפ מוצגות + הסתר את \'גלה את הפודקאסט\' + מדור \'גלה את הפודקאסט\' מוסתר + מדור \'גלה את הפודקאסט\' מוצג + הסתר קישורים מומלצים + קטע קישורים מוצגים מוסתר + קטע קישורים מוצגים מוצג + הסתר סרטונים מוצגים + קטע סרטונים מוצגים מוסתר + קטע סרטונים מוצגים מוצג + הסתר כרטיסי מידע + מדור כרטיסי המידע מוסתר + מדור כרטיסי המידע מוצג + הסתר \'מושגי מפתח\' + מדור מושגי מפתח מוסתר + מדור מושגי מפתח מוצג + הסתר לחצן \'הירשם\' + לחצן \'הירשם\' מוסתר + לחצן \'הירשם\' מוצג + הסתר תמליל + מדור התמליל מוסתר + מדור התמליל מוצג + תיאור סרטון + הסתר או הצג רכיבי תיאור סרטון + סרגל סינון + הסתר או הצג את סרגל הסינון בפידים, סרטונים קשורים, תוצאות חיפוש, והיסטוריית צפייה + הסתר בפידים + מוסתר בפידים + מוצג בפידים + הסתר בסרטונים קשורים + מוסתר בסרטונים קשורים + מוצג בסרטונים קשורים + הסתר בתוצאות חיפוש + מוסתר בתוצאות חיפוש + מוצג בתוצאות חיפוש + הסתר בהיסטוריית הצפייה + מוסתר בהיסטוריית הצפייה + מוצג בהיסטוריית הצפייה + דף ערוץ + הסתר או הצג רכיבי דף ערוץ + + הסתר לחצן קהילה + הלחצן \'קהילה\' מוסתר + הלחצן \'קהילה\' מוצג + + הסתר מדף \'בשבילך\' + המדף \'בשבילך\' מוסתר + המדף \'בשבילך\' מוצג + + הסתר לחצן \'הצטרפות\' + לחצן הצטרפות מוסתר + לחצן הצטרפות מוצג + הסתר תצוגה מקדימה של קישורים + תצוגה מקדימה של קישורים מוסתרת + תצוגה מקדימה של קישורים מוצגת + הסתר מדף חברים + מדף חברים מוסתר + מדף חברים מוצג + + הסתר לחצן \'חנות\' + הלחצן \'חנות\' מוסתר + הלחצן \'חנות\' מוצג + + הסתר לחצן \'הירשם\' + הלחצן \'הירשם\' מוסתר + הלחצן \'הירשם\' מוצג + תגובות + הסתר או הצג רכיבי מדור תגובות + הסתר סיכום AI של צ\'אט + סיכום AI של צ\'אט מוסתר + סיכום AI של צ\'אט מוצג + הסתר סיכום תגובות AI + סיכום AI של תגובות מוסתר + סיכום AI של תגובות מוצג + הסתר הנחיות ערוץ + הנחיות הערוץ מוסתרות + הנחיות הערוץ מוצגות + הסתר כותרת \'תגובות של חברי מועדון\' + כותרת \'תגובות של חברי מועדון\' מוסתרת + כותרת \'תגובות של חברי מועדון\' מוצגת + הסתר מדור תגובות + מדור התגובות מוסתר + מדור התגובות מוצג + הסתר הנחיות קהילה + הנחיות הקהילה מוסתרות + הנחיות הקהילה מוצגות + הסתר לחצן \'יצירת Short\' + לחצן יצירת Short מוסתר + לחצן יצירת Short מוצג + הסתר לחצני אימוג\'י וחותמת זמן + לחצני אימוג\'י וחותמת זמן מוסתרים + לחצני אימוג\'י וחותמת זמן מוצגים + הסתר תצוגה מקדימה של תגובה + תצוגה מקדימה של תגובה מוסתרת + תצוגה מקדימה של תגובה מוצגת + הסתר לחצן תודה + לחצן תודה מוסתר + לחצן תודה מוצג + הסתר ספירת צפיות + ספירת הצפיות מוסתרת בפיד ובתוצאות החיפוש + ספירת הצפיות מוצגת בפיד ובתוצאות החיפוש + + "מגבלות: • מדפי Shorts, דפי ערוצים ותוצאות חיפוש עשויים עדיין להציג ספירות צפיות • תכונה זו אינה פועלת עם גורם צורה לרכב" - הסתר זמן העלאה - זמן ההעלאה מוסתר בפיד ובעמודי תוצאות חיפוש - זמן ההעלאה מוצג בפיד ובעמודי תוצאות חיפוש - - "הגבלות: + הסתר זמן העלאה + זמן ההעלאה מוסתר בפיד ובעמודי תוצאות חיפוש + זמן ההעלאה מוצג בפיד ובעמודי תוצאות חיפוש + + "הגבלות: • מדפי Shorts, דפי ערוץ ותוצאות חיפוש עדיין עשויים להציג זמני העלאה • תכונה זו אינה פועלת עם גורם צורה לרכב" - הסתר תוכן מילiת מפתח - הסתר סרטוני פיד וחיפוש באמצעות מסנני מילות מפתח - הסתר סרטוני בית לפי מילות מפתח - סרטונים בכרטיסיית הבית מסוננים לפי מילות מפתח - סרטונים בכרטיסיית הבית אינם מסוננים לפי מילות מפתח - הסתר תוצאות חיפוש לפי מילות מפתח - תוצאות חיפוש מסוננות לפי מילות מפתח - תוצאות חיפוש אינם מסוננות לפי מילות מפתח - הסתר סרטוני מינוי לפי מילות מפתח - סרטונים בכרטיסיית המינויים מסוננים לפי מילות מפתח - סרטונים בכרטיסיית המינויים אינם מסוננים לפי מילות מפתח - מילות מפתח להסתרה - - "מילות מפתח וביטויים להסתרה, מופרדים על ידי שורות חדשות + "מילות מפתח וביטויים להסתרה, מופרדים על ידי שורות חדשות מילות מפתח יכולות להיות שמות ערוצים או כל טקסט המוצג בכותרות סרטונים יש להזין מילים עם אותיות רישיות באמצע עם הרישיות המתאימות (למשל: iPhone, TikTok, LeBlanc)" - אודות סינון מילות מפתח - "תוצאות דף הבית/מינויים/חיפוש מסוננות כדי להסתיר תוכן שתואם ביטויי מילות מפתח + אודות סינון מילות מפתח + "תוצאות דף הבית/מינויים/חיפוש מסוננות כדי להסתיר תוכן שתואם ביטויי מילות מפתח מגבלות • סרטוני Shorts אינם ניתנים להסתרה לפי שם ערוץ • ייתכן שחלק מרכיבי ממשק המשתמש לא יוסתרו • חיפוש אחר מילת מפתח עשוי שלא להציג תוצאות" - התאם מילים שלמות - - הקפת מילת מפתח/ביטוי עם מרכאות כפולות תמנע התאמות חלקיות של כותרות סרטונים ושמות ערוצים<br><br>לדוגמא,<br><b>\"ai\"</b> יסתיר את הסרטון: <b>כיצד פועלת AI?</b><br>אבל אינו יסתיר את: <b>איך נשמעות ה-AirPods החדשות?</b> - - מילת מפתח לא שמישה: %s - הוסף מרכאות כדי להשתמש במילת מפתח: %s - למילת מפתח יש הצהרות סותרות: %s - מילת מפתח קצרה מדי ודורשת מרכאות: %s - מילת מפתח תסתיר את כל הסרטונים: %s - - - הסתר מדף חנות היוצר - מדף חנות היוצר מתחת לנגן הוידאו מוסתר - מדף חנות היוצר מתחת לנגן הוידאו מוצג - הסתר כרזת חנות של מסך סיום - באנר החנות של מסך סיום מוסתר - באנר החנות של מסך הסיום מוצג - הסתר מודעות מסך מלא - "מודעות במסך מלא מוסתרות + התאם מילים שלמות + + הקפת מילת מפתח/ביטוי עם מרכאות כפולות תמנע התאמות חלקיות של כותרות סרטונים ושמות ערוצים<br><br>לדוגמא,<br><b>\"ai\"</b> יסתיר את הסרטון: <b>כיצד פועלת AI?</b><br>אבל אינו יסתיר את: <b>איך נשמעות ה-AirPods החדשות?</b> + + מילת מפתח לא שמישה: %s + הוסף מרכאות כדי להשתמש במילת מפתח: %s + למילת מפתח יש הצהרות סותרות: %s + מילת מפתח קצרה מדי ודורשת מרכאות: %s + מילת מפתח תסתיר את כל הסרטונים: %s + + + הסתר מדף חנות היוצר + מדף חנות היוצר מתחת לנגן הוידאו מוסתר + מדף חנות היוצר מתחת לנגן הוידאו מוצג + הסתר כרזת חנות של מסך סיום + באנר החנות של מסך סיום מוסתר + באנר החנות של מסך הסיום מוצג + הסתר מודעות מסך מלא + "מודעות במסך מלא מוסתרות תכונה זו זמינה רק עבור מכשירים ישנים יותר" - מודעות מסך מלא מוצגות - - הסתר מודעות מסך מלא עובד רק עם מכשירים ישנים יותר - הסתר מודעות כלליות - מודעות כלליות מוסתרות - מודעות כלליות מוצגות - הסתר כרזות מרצ\'נדייז - כרזות מרצ\'נדייז מוסתרות - כרזות מרצ\'נדייז מוצגות - הסתר תווית קידום מכירות בתשלום - תווית קידום מכירות בתשלום מוסתרת - תווית קידום מכירות בתשלום מוצגת - הסתר כרטיסים בחסות עצמית - כרטיסים בחסות עצמית מוסתרים - כרטיסים בחסות עצמית מוצגים - הסתר קישורי קניות - קישורי קניות בתיאור הסרטון מוסתרים - קישורי קניות בתיאור הסרטון מוצגים - הסתר באנר צפייה במוצרים - באנר צפייה במוצרים בשכבת-על של וידאו מוסתר - באנר צפייה במוצרים בשכבת-על של וידאו מוצג - הסתר תוצאות חיפוש באינטרנט - תוצאות חיפוש באינטרנט מוסתרות - תוצאות חיפוש באינטרנט מוצגות - - - הסתר קידומי YouTube Premium - קידומי YouTube Premium תחת נגן הוידאו מוסתרים - קידומי YouTube Premium תחת נגן הוידאו מוצגים - - - הסתר מודעות סרטון - מודעות סרטון מוסתרות - מודעות סרטון מוצגות - - - כתובת URL הועתקה אל הלוח - כתובת URL עם חותמת זמן הועתקה - הצג לחצן העתקת כתובת ה-URL של הסרטון - לחצן \'העתק כתובת URL של הסרטון\' מוצג. הקש כדי להעתיק את כתובת ה-URL של הסרטון. הקש והחזק כדי להעתיק עם חותמת זמן - לחצן \'העתק כתובת URL של הסרטון\' אינו מוצג - הצג לחצן העתקת כתובת ה-URL של הסרטון עם חותמת זמן - לחצן \'העתק כתובת URL עם חותמת זמן\' מוצג. הקש כדי להעתיק את כתובת ה-URL של הסרטון עם חותמת זמן. הקש והחזק כדי להעתיק ללא חותמת זמן - לחצן \'העתק כתובת URL עם חותמת זמן\' אינו מוצג - - - הסר דו-שיח שיקול דעת הצופים - דו-שיח יוסר - דו-שיח יוצג - זה לא עוקף את מגבלת הגיל. זה רק מסכים לזה באופן אוטומטי. - - - השבת חלון קופץ של \'כניסה לטלוויזיה\' - חלון קופץ של כניסה לטלוויזיה מושבת - חלון קופץ של כניסה לטלוויזיה מופעל - - - השבת דילוג פרקים בהקשה כפולה - הקשה כפולה לעולם לא יכולה לגרום דילוג לפרק הבא/הקודם - הקשה כפולה יכולה לגרום מדי פעם דילוג לפרק הבא/הקודם - - - הורדות חיצוניות - הגדרות לשימוש במוריד חיצונית - הצג לחצן הורדה חיצונית - לחצן הורדה בנגן מוצג - לחצן הורדה בנגן אינו מוצג - - עקוף את פעולת לחצן ההורדה - לחצן ההורדה פותח את המוריד החיצוני שלך - לחצן ההורדה פותח את המוריד המקומי בתוך היישום - שם חבילת מוריד - שם החבילה של יישום ההורדות החיצוני המותקן שלך - הזן את שם החבילה - אחר - היישום לא מותקן - %s אינו מותקן. נא להתקין אותו. - "לא ניתן למצוא יישום מותקן עם שם חבילה: %s + מודעות מסך מלא מוצגות + + הסתר מודעות מסך מלא עובד רק עם מכשירים ישנים יותר + הסתר מודעות כלליות + מודעות כלליות מוסתרות + מודעות כלליות מוצגות + הסתר כרזות מרצ\'נדייז + כרזות מרצ\'נדייז מוסתרות + כרזות מרצ\'נדייז מוצגות + הסתר תווית קידום מכירות בתשלום + תווית קידום מכירות בתשלום מוסתרת + תווית קידום מכירות בתשלום מוצגת + הסתר כרטיסים בחסות עצמית + כרטיסים בחסות עצמית מוסתרים + כרטיסים בחסות עצמית מוצגים + הסתר קישורי קניות + קישורי קניות בתיאור הסרטון מוסתרים + קישורי קניות בתיאור הסרטון מוצגים + הסתר באנר צפייה במוצרים + באנר צפייה במוצרים בשכבת-על של וידאו מוסתר + באנר צפייה במוצרים בשכבת-על של וידאו מוצג + הסתר תוצאות חיפוש באינטרנט + תוצאות חיפוש באינטרנט מוסתרות + תוצאות חיפוש באינטרנט מוצגות + + + הסתר קידומי YouTube Premium + קידומי YouTube Premium תחת נגן הוידאו מוסתרים + קידומי YouTube Premium תחת נגן הוידאו מוצגים + + + הסתר מודעות סרטון + מודעות סרטון מוסתרות + מודעות סרטון מוצגות + + + כתובת URL הועתקה אל הלוח + כתובת URL עם חותמת זמן הועתקה + הצג לחצן העתקת כתובת ה-URL של הסרטון + לחצן \'העתק כתובת URL של הסרטון\' מוצג. הקש כדי להעתיק את כתובת ה-URL של הסרטון. הקש והחזק כדי להעתיק עם חותמת זמן + לחצן \'העתק כתובת URL של הסרטון\' אינו מוצג + הצג לחצן העתקת כתובת ה-URL של הסרטון עם חותמת זמן + לחצן \'העתק כתובת URL עם חותמת זמן\' מוצג. הקש כדי להעתיק את כתובת ה-URL של הסרטון עם חותמת זמן. הקש והחזק כדי להעתיק ללא חותמת זמן + לחצן \'העתק כתובת URL עם חותמת זמן\' אינו מוצג + + + הסר דו-שיח שיקול דעת הצופים + דו-שיח יוסר + דו-שיח יוצג + זה לא עוקף את מגבלת הגיל. זה רק מסכים לזה באופן אוטומטי. + + + השבת חלון קופץ של \'כניסה לטלוויזיה\' + חלון קופץ של כניסה לטלוויזיה מושבת + חלון קופץ של כניסה לטלוויזיה מופעל + + + השבת דילוג פרקים בהקשה כפולה + הקשה כפולה לעולם לא יכולה לגרום דילוג לפרק הבא/הקודם + הקשה כפולה יכולה לגרום מדי פעם דילוג לפרק הבא/הקודם + + + הורדות חיצוניות + הגדרות לשימוש במוריד חיצונית + הצג לחצן הורדה חיצונית + לחצן הורדה בנגן מוצג + לחצן הורדה בנגן אינו מוצג + + עקוף את פעולת לחצן ההורדה + לחצן ההורדה פותח את המוריד החיצוני שלך + לחצן ההורדה פותח את המוריד המקומי בתוך היישום + שם חבילת מוריד + שם החבילה של יישום ההורדות החיצוני המותקן שלך + הזן את שם החבילה + אחר + היישום לא מותקן + %s אינו מותקן. נא להתקין אותו. + "לא ניתן למצוא יישום מותקן עם שם חבילה: %s יש לוודא ששם החבילה נכון ושהיישום מותקן" - שם החבילה אינו יכול להיות ריק - - - השבת מחוות דילוג מדויקת - מחווה מושבתת - מחווה מופעלת - - - הפעל הקשה כדי לדלג - הקשה כדי לדלג מופעלת - הקשה כדי לדלג מושבתת - - - הפעל מחוות בהירות - "החלקת בהירות במסך מלא מופעלת + שם החבילה אינו יכול להיות ריק + + + השבת מחוות דילוג מדויקת + מחווה מושבתת + מחווה מופעלת + + + הפעל הקשה כדי לדלג + הקשה כדי לדלג מופעלת + הקשה כדי לדלג מושבתת + + + הפעל מחוות בהירות + "החלקת בהירות במסך מלא מופעלת כוונן את הבהירות על ידי החלקה אנכית בצד השמאלי של המסך" - החלקת בהירות במסך מלא מושבתת - הפעל מחוות עוצמת קול - "החלקת עוצמת קול במסך מלא מופעלת + החלקת בהירות במסך מלא מושבתת + הפעל מחוות עוצמת קול + "החלקת עוצמת קול במסך מלא מופעלת כוונן את עוצמת הקול על ידי החלקה אנכית בצד הימני של המסך" - החלקת עוצמת קול במסך מלא מושבתת - הפעל מחוות לחץ כדי להחליק - לחץ כדי להחליק מופעל - לחץ כדי להחליק מושבת - הפעל משוב ברטט - משוב ברטט מופעל - משוב ברטט מושבת - שמור ושחזר בהירות - שמור ושחזר בהירות בעת יציאה או כניסה למסך מלא - אל תשמור ותשחזר בהירות בעת יציאה או כניסה למסך מלא - הפעל מחוות בהירות אוטומטית - החלקה למטה לערך הנמוך ביותר של מחוות הבהירות מפעילה בהירות אוטומטית - החלקה למטה לערך הנמוך ביותר לא מפעילה בהירות אוטומטית - אוטומטי - פסק זמן לשכבת-על של החלקה - כמות אלפיות השניה ששכבת-העל גלויה - אטימות רקע שכבת-על של החלקה - ערך אטימות בין 0 ל-100 - אטימות החלקה חייבת להיות בין 0 ל-100 - צבע שכבת-על של החלקת בהירות - הצבע של סרגל ההתקדמות עבור בקרות בהירות - צבע שכבת-על של החלקת עוצמת קול - הצבע של סרגל ההתקדמות עבור בקרות עוצמת קול - גודל טקסט שכבת-על של החלקה - גודל הטקסט עבור שכבת-על של החלקה בין 1 ל-30 - גודל הטקסט חייב להיות בין 1 ל-30 - סף גודל החלקה - כמות הסף להתרחשות החלקה - רגישות החלקה בעוצמת הקול - כמה משתנה עוצמת השמע לכל החלקה - סגנון שכבת-על להחלקה - שכבת-על אופקית - שכבת-על אופקית (מזערית - עליונה) - שכבת-על אופקית (מזערית - מרכזית) - שכבת-על מעגלית - שכבת-על מעגלית (מזערית) - שכבת-על אנכית - שכבת-על אנכית (מזערית) - הפעל החלקה כדי לשנות סרטונים - החלקה במצב מסך מלא תשנה לסרטון הבא/הקודם - החלקה במצב מסך מלא לא תשנה לסרטון הבא/הקודם - - - השבת כתוביות אוטומטיות - כתוביות אוטומטיות מופעלות - כתוביות אוטומטיות מושבתות - - - פעולות לחצנים - הסתר או הצג לחצנים תחת סרטונים - השבת זוהר אהבתי והרשמה למינוי - לחצן אהבתי והרשמה למינוי לא יזהר כאשר מוזכר - לחצן אהבתי והרשמה למינוי יזהר כאשר מוזכר - הסתר אהבתי ודיסלייק - לחצני אהבתי ודיסלייק מוסתרים - לחצני אהבתי ודיסלייק מוצגים - - הסתר שיתוף - לחצן שיתוף מוסתר - לחצן שיתוף מוצג - - הסתר עצירת מודעות - לחצן עצירת מודעות מוסתר - לחצן עצירת מודעות מוצג - - הסתר תגובות - הלחצן \'תגובות\' מוסתר - הלחצן \'תגובות\' מוצג - + הסתר שיתוף + לחצן שיתוף מוסתר + לחצן שיתוף מוצג + + הסתר עצירת מודעות + לחצן עצירת מודעות מוסתר + לחצן עצירת מודעות מוצג + + הסתר תגובות + הלחצן \'תגובות\' מוסתר + הלחצן \'תגובות\' מוצג + - הסתר דיווח - לחצן דיווח מוסתר - לחצן דיווח מוצג - - הסתר רמיקס - לחצן רמיקס מוסתר - לחצן רמיקס מוצג - - הסתר הורדה - לחצן הורדה מוסתר - לחצן הורדה מוצג - + הסתר רמיקס + לחצן רמיקס מוסתר + לחצן רמיקס מוצג + + הסתר הורדה + לחצן הורדה מוסתר + לחצן הורדה מוצג + - הסתר באז - לחצן באז מוסתר - לחצן באז מוצג - - הסתר קידום - הלחצן \'קידום\' מוסתר - הלחצן \'קידום\' מוצג - - הסתר תודה - לחצן תודה מוסתר - לחצן תודה מוצג - + הסתר קידום + הלחצן \'קידום\' מוסתר + הלחצן \'קידום\' מוצג + + הסתר תודה + לחצן תודה מוסתר + לחצן תודה מוצג + - הסתר Ask - לחצן Ask מוסתר - לחצן Ask מוצג - - הסתר קליפ - לחצן קליפ מוסתר - לחצן קליפ מוצג - - הסתר \'חנות\' - הלחצן \'חנות\' מוסתר - הלחצן \'חנות\' מוצג - - הסתר \'שמירה\' - הלחצן \'שמירה\' מוסתר - הלחצן שמירה\' מוצג - - - לחצני ניווט - הסתר או שנה לחצנים בסרגל הניווט - - הסתר את דף הבית - לחצן דף הבית מוסתר - לחצן דף הבית מוצג - - הסתר Shorts - לחצן Shorts מוסתר - לחצן Shorts מוצג - - הסתר יצירה - לחצן יצירה מוסתר - לחצן יצירה מוצג - - הסתר מינויים - לחצן מינויים מוסתר - לחצן מינויים מוצג - הסתר עדכונים - לחצן עדכונים מוסתר - לחצן עדכונים מוצג - - החלף יצירה עם עדכונים - "לחצן יצירה מוחלף בלחצן עדכונים + הסתר Ask + לחצן Ask מוסתר + לחצן Ask מוצג + + הסתר קליפ + לחצן קליפ מוסתר + לחצן קליפ מוצג + + הסתר \'חנות\' + הלחצן \'חנות\' מוסתר + הלחצן \'חנות\' מוצג + + הסתר \'שמירה\' + הלחצן \'שמירה\' מוסתר + הלחצן שמירה\' מוצג + + + לחצני ניווט + הסתר או שנה לחצנים בסרגל הניווט + + הסתר את דף הבית + לחצן דף הבית מוסתר + לחצן דף הבית מוצג + + הסתר Shorts + לחצן Shorts מוסתר + לחצן Shorts מוצג + + הסתר יצירה + לחצן יצירה מוסתר + לחצן יצירה מוצג + + הסתר מינויים + לחצן מינויים מוסתר + לחצן מינויים מוצג + הסתר עדכונים + לחצן עדכונים מוסתר + לחצן עדכונים מוצג + + החלף יצירה עם עדכונים + "לחצן יצירה מוחלף בלחצן עדכונים הערה: הפעלת אפשרות זו גם מסתירה באופן כפוי מודעות סרטון" - לחצן יצירה לא יוחלף עם לחצן עדכונים - "השבתת הגדרה זו תשבית גם את חסימת המודעות של Shorts. + לחצן יצירה לא יוחלף עם לחצן עדכונים + "השבתת הגדרה זו תשבית גם את חסימת המודעות של Shorts. אם שינוי הגדרה זו אינו נכנס לתוקף, נסה לעבור למצב פרטי." - הסתר תוויות לחצני ניווט - התוויות מוסתרות - התוויות מוצגות - השבת שורת מצב שקופה - שורת מצב אטומה - שורת מצב אטומה או שקופה - בחלק מהמכשירים, הפעלת תכונה זו עשויה לשנות את סרגל הניווט של המערכת לשקוף. - השבת סרגל בהיר שקוף - סרגל ניווט במצב בהיר הוא אטום - סרגל ניווט במצב בהיר הוא אטום או שקוף - השבת סרגל כהה שקוף - סרגל ניווט במצב כהה הוא אטום - סרגל ניווט במצב כהה הוא אטום או שקוף - - - תפריט נשלף - הסתר או הצג פריטי תפריט נשלף של נגן - - הסתר כתוביות - תפריט כתוביות מוסתר - תפריט כתוביות מוצג - - הסתר הגדרות נוספות - תפריט הגדרות נוספות מוסתר - תפריט הגדרות נוספות מוצג - - הסתר טיימר לשינה - תפריט טיימר לשינה מוסתר - תפריט טיימר לשינה מוצג - - הסתר סרטון בלופ - תפריט סרטון בלופ מוסתר - תפריט סרטון בלופ מוצג - - הסתר תאורת אווירה - תפריט תאורת אווירה מוסתר - תפריט תאורת אווירה מוצג - הסתר עוצמת קול יציבה - תפריט עוצמת קול יציבה מוצג - תפריט עוצמת קול יציבה מוסתר - - הסתר עזרה ומשוב - תפריט עזרה ומשוב מוסתר - תפריט עזרה ומשוב מוצג - - הסתר מהירות ההפעלה - תפריט מהירות ההפעלה מוסתר - תפריט מהירות ההפעלה מוצג - - הסתר נעילת מגע - תפריט נעילת מגע מוסתר - תפריט נעילת מגע מוצג - - הסתר האזנה עם YouTube Music - תפריט \"האזנה עם YouTube Music\" מוסתר - תפריט \"האזנה עם YouTube Music\" מוצג - - הסתר טראק אודיו - תפריט טראק אודיו מוסתר - תפריט טראק אודיו מוצג - + הסתר כתוביות + תפריט כתוביות מוסתר + תפריט כתוביות מוצג + + הסתר הגדרות נוספות + תפריט הגדרות נוספות מוסתר + תפריט הגדרות נוספות מוצג + + הסתר טיימר לשינה + תפריט טיימר לשינה מוסתר + תפריט טיימר לשינה מוצג + + הסתר סרטון בלופ + תפריט סרטון בלופ מוסתר + תפריט סרטון בלופ מוצג + + הסתר תאורת אווירה + תפריט תאורת אווירה מוסתר + תפריט תאורת אווירה מוצג + הסתר עוצמת קול יציבה + תפריט עוצמת קול יציבה מוצג + תפריט עוצמת קול יציבה מוסתר + + הסתר עזרה ומשוב + תפריט עזרה ומשוב מוסתר + תפריט עזרה ומשוב מוצג + + הסתר מהירות ההפעלה + תפריט מהירות ההפעלה מוסתר + תפריט מהירות ההפעלה מוצג + + הסתר נעילת מגע + תפריט נעילת מגע מוסתר + תפריט נעילת מגע מוצג + + הסתר האזנה עם YouTube Music + תפריט \"האזנה עם YouTube Music\" מוסתר + תפריט \"האזנה עם YouTube Music\" מוצג + + הסתר טראק אודיו + תפריט טראק אודיו מוסתר + תפריט טראק אודיו מוצג + - "תפריט ערוץ שמע מוסתר + "תפריט ערוץ שמע מוסתר כדי להציג את תפריט ערוץ השמע, שנה את 'זיוף זרמי וידאו' ל-'Android No SDK'" - - הסתר \'צפה ב-VR\' - תפריט \'צפה ב-VR\' מוסתר - תפריט \'צפה ב-VR\' מוצג - הסתר תפריט איכות סרטון - תפריט איכות סרטון מוסתר - תפריט איכות סרטון מוצג - הסתר כותרת תחתונה של תפריט איכות סרטון - כותרת תחתונה של תפריט איכות סרטון מוסתרת - כותרת תחתונה של תפריט איכות סרטון מוצגת - - - הסתר לחצן הפעלה אוטומטית - לחצן הפעלה אוטומטית מוסתר - לחצן הפעלה אוטומטית מוצג - - הסתר לחצן כתוביות - לחצן כתוביות מוסתר - לחצן כתוביות מוצג - הסתר לחצן העברה - לחצן העברה מוסתר - לחצן העברה מוצג - הסתר רקע פקדי הנגן - רקע פקדי הנגן מוסתר - רקע פקדי הנגן מוצג - הסתר לחצני הקודם & הבא - הלחצנים מוסתרים - הלחצנים מוצגים - - - הסתר כרטיסי מסך סיום - כרטיסי מסך מסיום מוסתרים - כרטיסי מסך מסיום מוצגים - - - השבת תאורת אווירה במסך מלא - תאורת אווירה מושבתת - תאורת אווירה מופעלת - - - הסתר כרטיסי מידע - כרטיסי המידע מוסתרים - כרטיסי המידע מוצגים - - - השבת הנפשות מספר מתגלגל - מספרים מתגלגלים אינם מונפשים - מספרים מתגלגלים מונפשים - - - הסתר סרגל דילוג של נגן וידאו - סרגל דילוג של נגן וידאו מוסתר - סרגל דילוג של נגן וידאו מוצג - - הסתר סרגל דילוג עם תמונות ממוזערות של סרטון - סרגל דילוג עם תמונות ממוזערות של סרטון מוסתר - סרגל דילוג עם תמונות ממוזערות של סרטון מוצג - - - נגן Shorts - הסתר או הצג רכיבי נגן Shorts - - להסתיר Shorts בפיד הבית - מוסתר בפיד הבית ובסרטונים קשורים - מוצג בפיד הבית ובסרטונים קשורים - הסתר Shorts בתוצאות חיפוש - מוסתר בתוצאות חיפוש - מוצג בתוצאות חיפוש - - להסתיר Shorts בפיד המינויים - מוסתר בפיד המנויים - מוצג בפיד המינויים - הסתר Shorts בהיסטוריית הצפייה - מוסתר בהיסטוריית הצפייה - מוצג בהיסטוריית הצפייה - הסתר תווית \'מדובב אוטומטית\' - תווית בדיבוב אוטומטי מוסתרת - תווית בדיבוב אוטומטי מוצגת - הסתר לחצן \'קנה Super Thanks\' - הלחצן \'קנה סופר תודה\' מוסתר - הלחצן \'קנה סופר תודה\' מוצג - הסתר לחצן \'אפקט\' - הלחצן \'אפקט\' מוסתר - הלחצן \'אפקט\' מוצג - הסתר לחצן \'מסך ירוק\' - לחצן מסך ירוק מוסתר - לחצן מסך ירוק מוצג - הסתר לחצן hashtag - לחצן hashtag מוסתר - לחצן hashtag מוצג - - הסתר לחצן להצטרפות - לחצן להצטרפות מוסתר - לחצן להצטרפות מוצג - הסתר תצוגה מקדימה חיה - תצוגה מקדימה חיה מוסתרת - תצוגה מקדימה חיה מוצגת - הסתר תווית מיקום - תווית מיקום מוסתרת - תווית מיקום מוצגת - הסתר לחצן \'פוסטים חדשים\' - לחצן \"פוסטים חדשים\" מוסתר - לחצן \"פוסטים חדשים\" מוצג - הסתר לחצני שכבת-על בעת השהיה - לחצני שכבת-על בעת השהיה מוסתרים - לחצני שכבת-על בעת השהיה מוצגים - הסתר תצוגה מקדימה של תגובה - תצוגה מקדימה של תגובה מוסתרת - תצוגה מקדימה של תגובה מוצגת - הסתר לחצן \'שמור מוזיקה\' - לחצן שמור מוזיקה מוסתר - לחצן שמור מוזיקה מוצג - הסתר הצעות חיפוש - הצעות חיפוש מוסתרות - הצעות חיפוש מוצגות - הסתר לחצן חנות - לחצן חנות מוסתר - לחצן חנות מוצג - הסתר סטיקרים - סטיקרים מוסתרים - סטיקרים מוצגים - הסתר לחצן הרשמה למינוי - לחצן הרשמה למינוי מוסתר - לחצן הרשמה למינוי מוצג - הסתר מוצרים מתויגים - מוצרים מתויגים מוסתרים - מוצגרים מתויגים מוצגים - הסתר לחצן \'בקרוב\' - לחצן \'בקרוב\' מוסתר - לחצן \'בקרוב\' מוצג - הסתר לחצן \'השתמש בצליל זה\' - הלחצן \'השתמש בצליל זה\' מוסתר - הלחצן \'השתמש בצליל זה\' מוצג - הסתר לחצן \'השתמש בתבנית זו\' - הלחצן \'השתמש בתבנית זו\' מוסתר - הלחצן \'השתמש בתבנית זו\' מוצג - הסתר הנפשת מזרקה של לחצן אהבתי - הנפשת מזרקה של לחצן אהבתי מוסתרת - הנפשת מזרקה של לחצן אהבתי מוצגת - הסתר לחצן אהבתי - לחצן אהבתי מוסתר - לחצן אהבתי מוצג - הסתר לחצן דיסלייק - לחצן דיסלייק מוסתר - לחצן דיסלייק מוצג - הסתר לחצן תגובות - לחצן תגובות מוסתר - לחצן תגובות מוצג - - הסתר לחצן שיתוף - לחצן שיתוף מוסתר - לחצן שיתוף מוצג - - הסתר לחצן רמיקס - לחצן רמיקס מוסתר - לחצן רמיקס מוצג - הסתר לחצן סאונד - לחצן סאונד מוסתר - לחצן סאונד מוצג - הסתר לוח מידע - לוח מידע מוסתר - לוח מידע מוצג - הסתר סרגל ערוץ - סרגל הערוץ מוסתר - סרגל הערוץ מוצג - הסתר כותרת סרטון - כותרת הסרטון מוסתרת - כותרת הסרטון מוצגת - הסתר תווית מטא-נתונים של סאונד - תווית מטא-נתונים של שמע מוסתרת - תווית מטא-נתונים של שמע מוצגת - הסתר תווית קישור לסרטון - תווית קישור סרטון מוסתרת - תווית קישור סרטון מוצגת - הסתר סרגל ניווט - סרגל ניווט מוסתר - סרגל ניווט מוצג - - - הסתר סרטון מוצע של מסך סיום - "סרטון מוצע של מסך סיום מוסתר כאשר הפעלה אוטומטית כבויה + + הסתר \'צפה ב-VR\' + תפריט \'צפה ב-VR\' מוסתר + תפריט \'צפה ב-VR\' מוצג + הסתר תפריט איכות סרטון + תפריט איכות סרטון מוסתר + תפריט איכות סרטון מוצג + הסתר כותרת תחתונה של תפריט איכות סרטון + כותרת תחתונה של תפריט איכות סרטון מוסתרת + כותרת תחתונה של תפריט איכות סרטון מוצגת + + + הסתר לחצן הפעלה אוטומטית + לחצן הפעלה אוטומטית מוסתר + לחצן הפעלה אוטומטית מוצג + + הסתר לחצן כתוביות + לחצן כתוביות מוסתר + לחצן כתוביות מוצג + הסתר לחצן העברה + לחצן העברה מוסתר + לחצן העברה מוצג + הסתר רקע פקדי הנגן + רקע פקדי הנגן מוסתר + רקע פקדי הנגן מוצג + הסתר לחצני הקודם & הבא + הלחצנים מוסתרים + הלחצנים מוצגים + + + הסתר כרטיסי מסך סיום + כרטיסי מסך מסיום מוסתרים + כרטיסי מסך מסיום מוצגים + + + השבת תאורת אווירה במסך מלא + תאורת אווירה מושבתת + תאורת אווירה מופעלת + + + הסתר כרטיסי מידע + כרטיסי המידע מוסתרים + כרטיסי המידע מוצגים + + + השבת הנפשות מספר מתגלגל + מספרים מתגלגלים אינם מונפשים + מספרים מתגלגלים מונפשים + + + הסתר סרגל דילוג של נגן וידאו + סרגל דילוג של נגן וידאו מוסתר + סרגל דילוג של נגן וידאו מוצג + + הסתר סרגל דילוג עם תמונות ממוזערות של סרטון + סרגל דילוג עם תמונות ממוזערות של סרטון מוסתר + סרגל דילוג עם תמונות ממוזערות של סרטון מוצג + + + נגן Shorts + הסתר או הצג רכיבי נגן Shorts + + להסתיר Shorts בפיד הבית + מוסתר בפיד הבית ובסרטונים קשורים + מוצג בפיד הבית ובסרטונים קשורים + הסתר Shorts בתוצאות חיפוש + מוסתר בתוצאות חיפוש + מוצג בתוצאות חיפוש + + להסתיר Shorts בפיד המינויים + מוסתר בפיד המנויים + מוצג בפיד המינויים + הסתר Shorts בהיסטוריית הצפייה + מוסתר בהיסטוריית הצפייה + מוצג בהיסטוריית הצפייה + הסתר תווית \'מדובב אוטומטית\' + תווית בדיבוב אוטומטי מוסתרת + תווית בדיבוב אוטומטי מוצגת + הסתר לחצן \'קנה Super Thanks\' + הלחצן \'קנה סופר תודה\' מוסתר + הלחצן \'קנה סופר תודה\' מוצג + הסתר לחצן \'אפקט\' + הלחצן \'אפקט\' מוסתר + הלחצן \'אפקט\' מוצג + הסתר לחצן \'מסך ירוק\' + לחצן מסך ירוק מוסתר + לחצן מסך ירוק מוצג + הסתר לחצן hashtag + לחצן hashtag מוסתר + לחצן hashtag מוצג + + הסתר לחצן להצטרפות + לחצן להצטרפות מוסתר + לחצן להצטרפות מוצג + הסתר תצוגה מקדימה חיה + תצוגה מקדימה חיה מוסתרת + תצוגה מקדימה חיה מוצגת + הסתר תווית מיקום + תווית מיקום מוסתרת + תווית מיקום מוצגת + הסתר לחצן \'פוסטים חדשים\' + לחצן \"פוסטים חדשים\" מוסתר + לחצן \"פוסטים חדשים\" מוצג + הסתר לחצני שכבת-על בעת השהיה + לחצני שכבת-על בעת השהיה מוסתרים + לחצני שכבת-על בעת השהיה מוצגים + הסתר תצוגה מקדימה של תגובה + תצוגה מקדימה של תגובה מוסתרת + תצוגה מקדימה של תגובה מוצגת + הסתר לחצן \'שמור מוזיקה\' + לחצן שמור מוזיקה מוסתר + לחצן שמור מוזיקה מוצג + הסתר הצעות חיפוש + הצעות חיפוש מוסתרות + הצעות חיפוש מוצגות + הסתר לחצן חנות + לחצן חנות מוסתר + לחצן חנות מוצג + הסתר סטיקרים + סטיקרים מוסתרים + סטיקרים מוצגים + הסתר לחצן הרשמה למינוי + לחצן הרשמה למינוי מוסתר + לחצן הרשמה למינוי מוצג + הסתר מוצרים מתויגים + מוצרים מתויגים מוסתרים + מוצגרים מתויגים מוצגים + הסתר לחצן \'בקרוב\' + לחצן \'בקרוב\' מוסתר + לחצן \'בקרוב\' מוצג + הסתר לחצן \'השתמש בצליל זה\' + הלחצן \'השתמש בצליל זה\' מוסתר + הלחצן \'השתמש בצליל זה\' מוצג + הסתר לחצן \'השתמש בתבנית זו\' + הלחצן \'השתמש בתבנית זו\' מוסתר + הלחצן \'השתמש בתבנית זו\' מוצג + הסתר הנפשת מזרקה של לחצן אהבתי + הנפשת מזרקה של לחצן אהבתי מוסתרת + הנפשת מזרקה של לחצן אהבתי מוצגת + הסתר לחצן אהבתי + לחצן אהבתי מוסתר + לחצן אהבתי מוצג + הסתר לחצן דיסלייק + לחצן דיסלייק מוסתר + לחצן דיסלייק מוצג + הסתר לחצן תגובות + לחצן תגובות מוסתר + לחצן תגובות מוצג + + הסתר לחצן שיתוף + לחצן שיתוף מוסתר + לחצן שיתוף מוצג + + הסתר לחצן רמיקס + לחצן רמיקס מוסתר + לחצן רמיקס מוצג + הסתר לחצן סאונד + לחצן סאונד מוסתר + לחצן סאונד מוצג + הסתר לוח מידע + לוח מידע מוסתר + לוח מידע מוצג + הסתר סרגל ערוץ + סרגל הערוץ מוסתר + סרגל הערוץ מוצג + הסתר כותרת סרטון + כותרת הסרטון מוסתרת + כותרת הסרטון מוצגת + הסתר תווית מטא-נתונים של סאונד + תווית מטא-נתונים של שמע מוסתרת + תווית מטא-נתונים של שמע מוצגת + הסתר תווית קישור לסרטון + תווית קישור סרטון מוסתרת + תווית קישור סרטון מוצגת + הסתר סרגל ניווט + סרגל ניווט מוסתר + סרגל ניווט מוצג + + + הסתר סרטון מוצע של מסך סיום + "סרטון מוצע של מסך סיום מוסתר כאשר הפעלה אוטומטית כבויה הפעלה אוטומטית ניתנת לשינוי בהגדרות YouTube: הגדרות ← הפעלה ← הפעלה אוטומטית של הסרטון הבא" - סרטון מוצע של מסך סיום מוצג - - - הסתר שכבת-על של סרטונים קשורים - שכבת-על של סרטונים קשורים במסך מלא מוסתרת - שכבת-על של סרטונים קשורים במסך מלא מוצגת - - - הסתר חותמת זמן של סרטון - חותמת זמן מוסתרת - חותמת זמן מוצגת - - - הסתר לוחות נגן צצים - לוחות נגן צצים מוסתרים - לוחות נגן צצים מוצגים - - - צא ממצב מסך מלא בסוף סרטון - מושבת - לאורך - לרוחב - לאורך ולרוחב - - - פתח סרטונים במסך מלא לאורך - סרטונים פותחים מסך מלא - סרטונים אינם פותחים מסך מלא - - - אטימות שכבת-על של נגן - ערך אטימות בין 0 ל-100, כאשר 0 שקוף - אטימות שכבת-על של נגן חייבת להיות בין 0 ל-100 - - - - דיסלייקים אינם זמינים באופן זמני (תם פסק הזמן של ה-API) - דיסלייקים אינם זמינים (מצב %d) - דיסלייקים אינם זמינים (מגבלה של לקוח API) - דיסלייקים אינם זמינים (%s) - - רענן סרטון כדי להצביע באמצעות Return YouTube Dislike - - מוסתר על ידי הבעלים - דיסלייקים מוצגים - דיסלייקים אינם מוצגים - הצג דיסלייקים ב-Shorts - "דיסלייקים ב-Shorts מוצגים + סרטון מוצע של מסך סיום מוצג + + + הסתר שכבת-על של סרטונים קשורים + שכבת-על של סרטונים קשורים במסך מלא מוסתרת + שכבת-על של סרטונים קשורים במסך מלא מוצגת + + + הסתר חותמת זמן של סרטון + חותמת זמן מוסתרת + חותמת זמן מוצגת + + + הסתר לוחות נגן צצים + לוחות נגן צצים מוסתרים + לוחות נגן צצים מוצגים + + + צא ממצב מסך מלא בסוף סרטון + מושבת + לאורך + לרוחב + לאורך ולרוחב + + + פתח סרטונים במסך מלא לאורך + סרטונים פותחים מסך מלא + סרטונים אינם פותחים מסך מלא + + + אטימות שכבת-על של נגן + ערך אטימות בין 0 ל-100, כאשר 0 שקוף + אטימות שכבת-על של נגן חייבת להיות בין 0 ל-100 + + + + דיסלייקים אינם זמינים באופן זמני (תם פסק הזמן של ה-API) + דיסלייקים אינם זמינים (מצב %d) + דיסלייקים אינם זמינים (מגבלה של לקוח API) + דיסלייקים אינם זמינים (%s) + + רענן סרטון כדי להצביע באמצעות Return YouTube Dislike + + מוסתר על ידי הבעלים + דיסלייקים מוצגים + דיסלייקים אינם מוצגים + הצג דיסלייקים ב-Shorts + "דיסלייקים ב-Shorts מוצגים מגבלה: ייתכן שלא יופיעו דיסלייקים במצב פרטי" - דיסלייקים ב-Shorts אינם מוצגים - דיסלייקים כאחוזים - דיסלייקים מוצגים כאחוזים - דיסלייקים מוצגים כמספר - - לחצן אהבתי קומפקטי - לחצן אהבתי מעוצב לרוחב מינימלי - לחצן אהבתי מעוצב למראה הטוב ביותר - הצג סימוני \'אהבתי\' משוערים - סרטונים עם סימני לייק מושבתים מציגים ספירת לייקים משוערת - סימוני \'אהבתי\' משוערים אינם מוצגים - הצג הודעה קופצת אם ה-API אינו זמין - הודעה קופצת מוצגת אם Return YouTube Dislike אינו זמין - הודעה קופצת אינה מוצגת אם Return YouTube Dislike אינו זמין - הנתונים מסופקים על ידי Return YouTube Dislike API. הקש כאן כדי ללמוד עוד - - סטטיסטיקת ReturnYouTubeDislike API של מכשיר זה - זמן תגובת API, ממוצע - זמן תגובת API, מינימום - זמן תגובת API, מקסימום - זמן תגובת API, סרטון אחרון - דיסלייקים אינם זמינים באופן זמני - מגבלת קצב של לקוח API בתוקף - ממשק API להבאת הצבעות, מספר קריאות - לא נעשו קריאות רשת - נעשו %d קריאות רשת - ממשק API להבאת הצבעות, מספר פסקי זמן - לא תם פסק הזמן של אף קריאת רשת - תם פסק הזמן של %d קריאות רשת - מגבלות קצב של לקוח API - לא נתקלו מגבלות קצב לקוח - מגבלת קצב לקוח נתקלו %d פעמים - %d אלפיות שנייה - - - הפעל סרגל חיפוש רחב - סרגל חיפוש רחב מופעל - סרגל חיפוש רחב מושבת - - - הפעל תמונות ממוזערות באיכות גבוהה - תמונות ממוזערות של סרגל דילוג הן באיכות גבוהה - תמונות ממוזערות של סרגל דילוג הן באיכות בינונית - תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות גבוהה - תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות בינונית - "זה גם ישחזר תמונות ממוזערות בשידורים חיים שאין להם תמונות ממוזערות של סרגל דילוג. + דיסלייקים ב-Shorts אינם מוצגים + דיסלייקים כאחוזים + דיסלייקים מוצגים כאחוזים + דיסלייקים מוצגים כמספר + + לחצן אהבתי קומפקטי + לחצן אהבתי מעוצב לרוחב מינימלי + לחצן אהבתי מעוצב למראה הטוב ביותר + הצג סימוני \'אהבתי\' משוערים + סרטונים עם סימני לייק מושבתים מציגים ספירת לייקים משוערת + סימוני \'אהבתי\' משוערים אינם מוצגים + הצג הודעה קופצת אם ה-API אינו זמין + הודעה קופצת מוצגת אם Return YouTube Dislike אינו זמין + הודעה קופצת אינה מוצגת אם Return YouTube Dislike אינו זמין + הנתונים מסופקים על ידי Return YouTube Dislike API. הקש כאן כדי ללמוד עוד + + סטטיסטיקת ReturnYouTubeDislike API של מכשיר זה + זמן תגובת API, ממוצע + זמן תגובת API, מינימום + זמן תגובת API, מקסימום + זמן תגובת API, סרטון אחרון + דיסלייקים אינם זמינים באופן זמני - מגבלת קצב של לקוח API בתוקף + ממשק API להבאת הצבעות, מספר קריאות + לא נעשו קריאות רשת + נעשו %d קריאות רשת + ממשק API להבאת הצבעות, מספר פסקי זמן + לא תם פסק הזמן של אף קריאת רשת + תם פסק הזמן של %d קריאות רשת + מגבלות קצב של לקוח API + לא נתקלו מגבלות קצב לקוח + מגבלת קצב לקוח נתקלו %d פעמים + %d אלפיות שנייה + + + הפעל סרגל חיפוש רחב + סרגל חיפוש רחב מופעל + סרגל חיפוש רחב מושבת + + + הפעל תמונות ממוזערות באיכות גבוהה + תמונות ממוזערות של סרגל דילוג הן באיכות גבוהה + תמונות ממוזערות של סרגל דילוג הן באיכות בינונית + תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות גבוהה + תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות בינונית + "זה גם ישחזר תמונות ממוזערות בשידורים חיים שאין להם תמונות ממוזערות של סרגל דילוג. תמונות ממוזערות של סרגל דילוג ישתמשו באותה איכות כמו הסרטון הנוכחי. תכונה זו עובדת בצורה הטובה ביותר עם איכות סרטון של 720p או פחות ובעת שימוש בחיבור אינטרנט מהיר מאוד." - שחזר תמונות ממוזערות של סרגל דילוג ישנות - תמונות ממוזערות של סרגל דילוג יופיעו מעל סרגל הדילוג - תמונות ממוזערות של סרגל דילוג יופיעו במסך מלא - - - הפעל את SponsorBlock - המערכת SponsorBlock היא מערכת מיקור המונים לדילוג על חלקים מעצבנים של סרטוני YouTube - מראה - הצג לחצן הצבעה - לחצן הצבעה של מקטע מוצג - לחצן הצבעה של מקטע אינו מוצג - השתמש בפריסה מרובעת - הלחצנים והפקדים מרובעים - הלחצנים והפקדים מעוגלים - - השתמש בלחצן דילוג קומפקטי - לחצן דילוג מעוצב לרוחב מינימלי - לחצן דילוג מעוצב למראה הטוב ביותר - הסתר לחצן דילוג באופן אוטומטי - לחצן דילוג נעלם לאחר כמה שניות - לחצן דילוג מוצג עבור כל המקטע - משך לחצן הדילוג - למשך כמה זמן להציג את לחצני הדילוג והדילוג לגולת הכותרת לפני הסתרה אוטומטית - הצג הודעה קופצת לביטול דילוג - הודעה קופצת מוצגת כאשר קטע מדולג אוטומטית. הקש על ההודעה הקופצת כדי לבטל את הדילוג - ההודעה הקופצת אינה מוצגת - משך הודעת דילוג קופצת - למשך כמה זמן להציג את ההודעה הקופצת לביטול הדילוג - שנייה אחת - 2 שניות - 3 שניות - 4 שניות - 5 שניות - 6 שניות - 7 שניות - 8 שניות - 9 שניות - 10 שניות - הצג אורך סרטון ללא מקטעים - אורך הסרטון פחות כל המקטעים מוצג על סרגל הדילוג - אורך סרטון מלא מוצג - יוצר מקטעים חדשים - הצג לחצן יצירת מקטע חדש - לחצן יצירת מקטע חדש מוצג - לחצן יצירת מקטע חדש אינו מוצג - כוונן מדרגת מקטע חדש - מספר אלפיות השניה שלחצני כוונון הזמן נעים בעת יצירת מקטעים חדשים - ערך חייב להיות מספר חיובי - ראה הנחיות - הנחיות כוללות חוקים וטיפים ליצירת מקטעים חדשים - עקוב אחר ההנחיות - קרא את ההנחיות של SponsorBlock לפני יצירת מקטעים חדשים - כבר קראתי - תראה לי - כללי - הצג הודעה קופצת אם ה-API אינו זמין - הודעה קופצת מוצגת אם SponsorBlock אינו זמין - הודעה קופצת אינה מוצגת אם SponsorBlock אינו זמין - הפעל מעקב ספירת דילוגים - מאפשר ללוח המובילים של SponsorBlock לדעת כמה זמן נחסך. הודעה נשלחת ללוח המובילים בכל פעם שמדלגים על מקטע - מעקב ספירת דילוגים אינו מופעל - משך מקטע מינימלי - מקטעים קצרים יותר מערך זה (בשניות) לא יוצגו או ידולגו - משך זמן לא חוקי - מזהה המשתמש הפרטי שלך - זה צריך להישמר פרטי. זה כמו סיסמה ולא צריך להיות משותף עם אף אחד. אם למישהו יש את זה, הוא יכול להתחזות אליך - מזהה משתמש פרטי חייב להיות באורך של לפחות 30 תווים - שנה כתובת API - הכתובת שבה SponsorBlock משתמש כדי לבצע קריאות לשרת - כתובת API אופסה - כתובת ה-URL של ה-API אינה חוקית - כתובת API שונתה - ייבוא/ייצוא הגדרות - העתק - תצורת JSON של ה-SponsorBlock שלך שניתן לייבא/לייצא אל ReVanced ופלטפורמות SponsorBlock אחרות - תצורת JSON של ה-SponsorBlock שלך שניתן לייבא/לייצא אל ReVanced ופלטפורמות SponsorBlock אחרות. זה כולל את מזהה המשתמש הפרטי שלך. הקפד לשתף את זה בתבונה - ההגדרות יובאו בהצלחה - נכשל לייבא את: %s - נכשל לייצא את: %s - "ההגדרות שלך מכילות מזהה משתמש פרטי של SponsorBlock. + שחזר תמונות ממוזערות של סרגל דילוג ישנות + תמונות ממוזערות של סרגל דילוג יופיעו מעל סרגל הדילוג + תמונות ממוזערות של סרגל דילוג יופיעו במסך מלא + + + הפעל את SponsorBlock + המערכת SponsorBlock היא מערכת מיקור המונים לדילוג על חלקים מעצבנים של סרטוני YouTube + מראה + הצג לחצן הצבעה + לחצן הצבעה של מקטע מוצג + לחצן הצבעה של מקטע אינו מוצג + השתמש בפריסה מרובעת + הלחצנים והפקדים מרובעים + הלחצנים והפקדים מעוגלים + + השתמש בלחצן דילוג קומפקטי + לחצן דילוג מעוצב לרוחב מינימלי + לחצן דילוג מעוצב למראה הטוב ביותר + הסתר לחצן דילוג באופן אוטומטי + לחצן דילוג נעלם לאחר כמה שניות + לחצן דילוג מוצג עבור כל המקטע + משך לחצן הדילוג + למשך כמה זמן להציג את לחצני הדילוג והדילוג לגולת הכותרת לפני הסתרה אוטומטית + הצג הודעה קופצת לביטול דילוג + הודעה קופצת מוצגת כאשר קטע מדולג אוטומטית. הקש על ההודעה הקופצת כדי לבטל את הדילוג + ההודעה הקופצת אינה מוצגת + משך הודעת דילוג קופצת + למשך כמה זמן להציג את ההודעה הקופצת לביטול הדילוג + שנייה אחת + 2 שניות + 3 שניות + 4 שניות + 5 שניות + 6 שניות + 7 שניות + 8 שניות + 9 שניות + 10 שניות + הצג אורך סרטון ללא מקטעים + אורך הסרטון פחות כל המקטעים מוצג על סרגל הדילוג + אורך סרטון מלא מוצג + יוצר מקטעים חדשים + הצג לחצן יצירת מקטע חדש + לחצן יצירת מקטע חדש מוצג + לחצן יצירת מקטע חדש אינו מוצג + כוונן מדרגת מקטע חדש + מספר אלפיות השניה שלחצני כוונון הזמן נעים בעת יצירת מקטעים חדשים + ערך חייב להיות מספר חיובי + ראה הנחיות + הנחיות כוללות חוקים וטיפים ליצירת מקטעים חדשים + עקוב אחר ההנחיות + קרא את ההנחיות של SponsorBlock לפני יצירת מקטעים חדשים + כבר קראתי + תראה לי + כללי + הצג הודעה קופצת אם ה-API אינו זמין + הודעה קופצת מוצגת אם SponsorBlock אינו זמין + הודעה קופצת אינה מוצגת אם SponsorBlock אינו זמין + הפעל מעקב ספירת דילוגים + מאפשר ללוח המובילים של SponsorBlock לדעת כמה זמן נחסך. הודעה נשלחת ללוח המובילים בכל פעם שמדלגים על מקטע + מעקב ספירת דילוגים אינו מופעל + משך מקטע מינימלי + מקטעים קצרים יותר מערך זה (בשניות) לא יוצגו או ידולגו + משך זמן לא חוקי + מזהה המשתמש הפרטי שלך + זה צריך להישמר פרטי. זה כמו סיסמה ולא צריך להיות משותף עם אף אחד. אם למישהו יש את זה, הוא יכול להתחזות אליך + מזהה משתמש פרטי חייב להיות באורך של לפחות 30 תווים + שנה כתובת API + הכתובת שבה SponsorBlock משתמש כדי לבצע קריאות לשרת + כתובת API אופסה + כתובת ה-URL של ה-API אינה חוקית + כתובת API שונתה + ייבוא/ייצוא הגדרות + העתק + תצורת JSON של ה-SponsorBlock שלך שניתן לייבא/לייצא אל ReVanced ופלטפורמות SponsorBlock אחרות + תצורת JSON של ה-SponsorBlock שלך שניתן לייבא/לייצא אל ReVanced ופלטפורמות SponsorBlock אחרות. זה כולל את מזהה המשתמש הפרטי שלך. הקפד לשתף את זה בתבונה + ההגדרות יובאו בהצלחה + נכשל לייבא את: %s + נכשל לייצא את: %s + "ההגדרות שלך מכילות מזהה משתמש פרטי של SponsorBlock. מזהה המשתמש שלך הוא כמו סיסמה ואסור לשתף אותו לעולם." - אל תציג שוב - שנה התנהגות מקטע - נותן חסות - קידום בתשלום, הפניות בתשלום ופרסומות ישירות. לא בשביל מימון עצמי או הכרות תודה בחינם לגורמים/יוצרים/אתרים/מוצרים שהם אוהבים - קידום ללא תשלום/עצמי - דומה לנותן חסות למעט קידום ללא תשלום או קידום עצמי. כולל קטעים על מרצ\'נדייז, תרומות, או מידע לגבי עם מי הם שיתפו פעולה - תזכורת לאינטראקציה (הרשמה למינוי) - תזכורת קצרה לסמן \'אהבתי\', להירשם למינוי או לעקוב אחריהם באמצע התוכן. אם זה ארוך או על משהו ספציפי, זה צריך במקום להיות תחת קידום עצמי - גולת הכותרת - החלק בסרטון שרוב האנשים מחפשים - הנפשת הפסקה/הקדמה - מרווח זמן ללא תוכן ממשי. יכול להיות הפסקה, מסגרת סטטית, או הנפשה חוזרת. אינו כולל מעברים המכילים מידע - כרטיסי סיום / קרדיטים - קרדיטים או כאשר כרטיסי הסיום של YouTube מופיעים. לא בשביל מסקנות עם מידע - פתיח / ברכות - קדימונים מקריינים לסרטון הקרוב, ברכות ופרידות. אינו כולל קטעים המוסיפים תוכן נוסף - תצוגה מקדימה / סיכום - אוסף של קליפים שמראים מה עומד לקרות בקרוב או מה קרה בסרטון או בסרטונים אחרים של סדרה, כאשר כל המידע חוזר על עצמו במקום אחר - סטייה / בדיחות - סצנות או בדיחות צדדיות שאינן נדרשות להבנת התוכן העיקרי של הסרטון. אינו כולל קטעים המספקים הקשר או פרטי רקע - מוזיקה: קטע שאינו מוזיקה - לשימוש בסרטוני מוזיקה בלבד. קטעים של סרטוני מוזיקה ללא מוזיקה, שאינם מכוסים כבר על ידי קטגוריה אחרת - דילוג - גולת הכותרת - דלג על נותן חסות - דלג על פרומו - דלג על אינטראקציה - דלג לגולת הכותרת - דלג על הקדמה - דלג על הפסקה - דלג על הפסקה - דלג על סיום - דלג על פתיח - דלג על קדימון - דלג על קדימון - דלג על סיכום - דלג על קטע טנגנציאלי - דלג על שאינו מוזיקה - דלג על מקטע - דילג על נותן חסות - דילג על קידום עצמי - דילג על תזכורת מעצבנת - דילג לגולת הכותרת - דילג על הקדמה - דילג על הפסקה - דילג על הפסקה - דילג על סיום - פתיח דולג - דילג על קדימון - דילג על קדימון - דילג על סיכום - קטע טנגנציאלי דולג - דילג על קטע שאינו מוזיקה - דילג על מקטעים שלא נשלחו - דילג על מקטעים מרובים - דלג באופן אוטומטי - דלג באופן אוטומטי פעם אחת - הצג לחצן דילוג - הצג בסרגל דילוג - השבת - לא ניתן לשלוח את המקטע: %s - המערכת SponsorBlock מושבתת באופן זמני - לא ניתן לשלוח את המקטע (מצב: %1$d %2$s) - לא ניתן לשלוח מקטע. מוגבל קצב (יותר מדי מאותו המשתמש או כתובת IP) - לא יכול לשלוח את המקטע: %s - "לא יכול לשלוח את המקטע. + אל תציג שוב + שנה התנהגות מקטע + נותן חסות + קידום בתשלום, הפניות בתשלום ופרסומות ישירות. לא בשביל מימון עצמי או הכרות תודה בחינם לגורמים/יוצרים/אתרים/מוצרים שהם אוהבים + קידום ללא תשלום/עצמי + דומה לנותן חסות למעט קידום ללא תשלום או קידום עצמי. כולל קטעים על מרצ\'נדייז, תרומות, או מידע לגבי עם מי הם שיתפו פעולה + תזכורת לאינטראקציה (הרשמה למינוי) + תזכורת קצרה לסמן \'אהבתי\', להירשם למינוי או לעקוב אחריהם באמצע התוכן. אם זה ארוך או על משהו ספציפי, זה צריך במקום להיות תחת קידום עצמי + גולת הכותרת + החלק בסרטון שרוב האנשים מחפשים + הנפשת הפסקה/הקדמה + מרווח זמן ללא תוכן ממשי. יכול להיות הפסקה, מסגרת סטטית, או הנפשה חוזרת. אינו כולל מעברים המכילים מידע + כרטיסי סיום / קרדיטים + קרדיטים או כאשר כרטיסי הסיום של YouTube מופיעים. לא בשביל מסקנות עם מידע + פתיח / ברכות + קדימונים מקריינים לסרטון הקרוב, ברכות ופרידות. אינו כולל קטעים המוסיפים תוכן נוסף + תצוגה מקדימה / סיכום + אוסף של קליפים שמראים מה עומד לקרות בקרוב או מה קרה בסרטון או בסרטונים אחרים של סדרה, כאשר כל המידע חוזר על עצמו במקום אחר + סטייה / בדיחות + סצנות או בדיחות צדדיות שאינן נדרשות להבנת התוכן העיקרי של הסרטון. אינו כולל קטעים המספקים הקשר או פרטי רקע + מוזיקה: קטע שאינו מוזיקה + לשימוש בסרטוני מוזיקה בלבד. קטעים של סרטוני מוזיקה ללא מוזיקה, שאינם מכוסים כבר על ידי קטגוריה אחרת + דילוג + גולת הכותרת + דלג על נותן חסות + דלג על פרומו + דלג על אינטראקציה + דלג לגולת הכותרת + דלג על הקדמה + דלג על הפסקה + דלג על הפסקה + דלג על סיום + דלג על פתיח + דלג על קדימון + דלג על קדימון + דלג על סיכום + דלג על קטע טנגנציאלי + דלג על שאינו מוזיקה + דלג על מקטע + דילג על נותן חסות + דילג על קידום עצמי + דילג על תזכורת מעצבנת + דילג לגולת הכותרת + דילג על הקדמה + דילג על הפסקה + דילג על הפסקה + דילג על סיום + פתיח דולג + דילג על קדימון + דילג על קדימון + דילג על סיכום + קטע טנגנציאלי דולג + דילג על קטע שאינו מוזיקה + דילג על מקטעים שלא נשלחו + דילג על מקטעים מרובים + דלג באופן אוטומטי + דלג באופן אוטומטי פעם אחת + הצג לחצן דילוג + הצג בסרגל דילוג + השבת + לא ניתן לשלוח את המקטע: %s + המערכת SponsorBlock מושבתת באופן זמני + לא ניתן לשלוח את המקטע (מצב: %1$d %2$s) + לא ניתן לשלוח מקטע. מוגבל קצב (יותר מדי מאותו המשתמש או כתובת IP) + לא יכול לשלוח את המקטע: %s + "לא יכול לשלוח את המקטע. כבר קיים" - המקטע נשלח בהצלחה - - המערכת SponsorBlock אינה זמינה באופן זמני (תם פסק זמן ה-API) - המערכת SponsorBlock אינה זמינה באופן זמני (מצב %d) - המערכת SponsorBlock אינה זמינה באופן זמני - לא ניתן להצביע עבור מקטע (תם פסק הזמן של ה-API) - לא ניתן להצביע עבור מקטע (מצב: %1$d %2$s) - לא ניתן להצביע עבור מקטע: %s - הצבע בעד - הצבע נגד - שנה קטגוריה - אין מקטעים להצביע עבורם - - %1$s עד %2$s - בחר את קטגוריית המקטע - קטגוריה מושבתת בהגדרות. הפעל קטגוריה כדי לשלוח. - מקטע חדש של SponsorBloack - להגדיר את %s כתחילת או סיום המקטע החדש? - התחלה - סיום - עכשיו - הזמן בו המקטע מתחיל - הזמן בו המקטע מסתיים - האם הזמנים נכונים? - "המקטע הוא מ + המקטע נשלח בהצלחה + + המערכת SponsorBlock אינה זמינה באופן זמני (תם פסק זמן ה-API) + המערכת SponsorBlock אינה זמינה באופן זמני (מצב %d) + המערכת SponsorBlock אינה זמינה באופן זמני + לא ניתן להצביע עבור מקטע (תם פסק הזמן של ה-API) + לא ניתן להצביע עבור מקטע (מצב: %1$d %2$s) + לא ניתן להצביע עבור מקטע: %s + הצבע בעד + הצבע נגד + שנה קטגוריה + אין מקטעים להצביע עבורם + + %1$s עד %2$s + בחר את קטגוריית המקטע + קטגוריה מושבתת בהגדרות. הפעל קטגוריה כדי לשלוח. + מקטע חדש של SponsorBloack + להגדיר את %s כתחילת או סיום המקטע החדש? + התחלה + סיום + עכשיו + הזמן בו המקטע מתחיל + הזמן בו המקטע מסתיים + האם הזמנים נכונים? + "המקטע הוא מ %1$s עד @@ -1283,46 +1282,46 @@ Second \"item\" text" (%3$s) מוכן להגיש?" - התחלה חייבת להיות לפני הסוף - סמן שני מיקומים על סרגל הזמן תחילה - צפה מראש במקטע, וודא שהוא מדלג בצורה חלקה - ערוך את תזמון המקטע באופן ידני - האם ברצונך לערוך את התזמון עבור ההתחלה או הסיום של המקטע? - ניתן זמן לא חוקי - סטטיסטיקה - - סטטיסטיקה אינה זמינה באופן זמני (API מושבת) - טוען... - SponsorBlock מושבת - שם המשתמש שלך: <b>%s</b> - הקש כאן כדי לשנות את שם המשתמש שלך - לא ניתן לשנות את שם המשתמש: סטטוס: %1$d %2$s - שם משתמש שונה בהצלחה - המוניטין שלך הוא <b>%.2f</b> - יצרת <b>%s</b> מקטעים - הקש כאן כדי להציג את המקטעים שלך - לוח המובילים של SponsorBlock - הצלת אנשים מ-<b>%s</b> מקטעים - הקש כאן כדי לראות את הסטטיסטיקה הגלובלית ותורמים מובילים - זה <b>%s</b> מהחיים שלהם.<br>הקש כאן כדי לראות את לוח המובילים - דילגת על <b>%s</b> מקטעים - זה <b>%s</b> - לאפס את מונה המקטעים המדולגים? - %1$s שעות %2$s דקות - %1$s דקות %2$s שניות - %s שניות - אטימות: - צבע: - אודות - הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות - - - גורם צורת הפריסה - ברירת מחדל - טלפון - טאבלט - רכב - "השינויים כוללים: + התחלה חייבת להיות לפני הסוף + סמן שני מיקומים על סרגל הזמן תחילה + צפה מראש במקטע, וודא שהוא מדלג בצורה חלקה + ערוך את תזמון המקטע באופן ידני + האם ברצונך לערוך את התזמון עבור ההתחלה או הסיום של המקטע? + ניתן זמן לא חוקי + סטטיסטיקה + + סטטיסטיקה אינה זמינה באופן זמני (API מושבת) + טוען... + SponsorBlock מושבת + שם המשתמש שלך: <b>%s</b> + הקש כאן כדי לשנות את שם המשתמש שלך + לא ניתן לשנות את שם המשתמש: סטטוס: %1$d %2$s + שם משתמש שונה בהצלחה + המוניטין שלך הוא <b>%.2f</b> + יצרת <b>%s</b> מקטעים + הקש כאן כדי להציג את המקטעים שלך + לוח המובילים של SponsorBlock + הצלת אנשים מ-<b>%s</b> מקטעים + הקש כאן כדי לראות את הסטטיסטיקה הגלובלית ותורמים מובילים + זה <b>%s</b> מהחיים שלהם.<br>הקש כאן כדי לראות את לוח המובילים + דילגת על <b>%s</b> מקטעים + זה <b>%s</b> + לאפס את מונה המקטעים המדולגים? + %1$s שעות %2$s דקות + %1$s דקות %2$s שניות + %s שניות + אטימות: + צבע: + אודות + הנתונים מסופקים על ידי SponsorBlock API. הקש כאן כדי ללמוד עוד ולראות הורדות עבור פלטפורמות אחרות + + + גורם צורת הפריסה + ברירת מחדל + טלפון + טאבלט + רכב + "השינויים כוללים: פריסת טאבלט • פוסטים קהילתיים מוסתרים @@ -1330,314 +1329,312 @@ Second \"item\" text" פריסת רכב • סרטוני Shorts נפתחים בנגן הרגיל • פיד מאורגן לפי נושאים וערוצים" - - - זייף גרסת יישום - גרסה מזויפת - גרסה לא מזויפת - "גרסת היישום תזויף לגרסה ישנה יותר של YouTube. + + + זייף גרסת יישום + גרסה מזויפת + גרסה לא מזויפת + "גרסת היישום תזויף לגרסה ישנה יותר של YouTube. זה ישנה את המראה והתכונות של היישום, אך תופעות לוואי לא ידועות עלולות להתרחש. אם נכבה מאוחר יותר, מומלץ לנקות את נתוני היישום כדי למנוע באגים של ממשק המשתמש." - יעד גרסת יישום מזויפת - 20.13.41 - שחזור סרגל פעולות וידאו לא מכווץ - 20.05.46 - שחזור פונקציונליות תמלול - 19.35.36 - שחזר סמלי נגן Shorts ישנים - 19.01.34 - שחזר סמלי ניווט ישנים - - - שנה את דף ההתחלה - ברירת מחדל - כל המינויים - עיין בערוצים - קורסים / למידה - מה חדש - אופנה & יופי - גיימינג - היסטוריה - ספרייה - סרטונים שאהבתי - בשידור חי - סרטים - מוזיקה - חדשות - עדכונים - פלייליסטים - חיפוש - שופינג - ספורט - מינויים - הסרטונים החמים - מציאות מדומה - לצפייה בהמשך - הקליפים שלך - לשנות תמיד את דף הפתיחה - "דף הפתיחה תמיד משתנה + יעד גרסת יישום מזויפת + 20.13.41 - שחזור סרגל פעולות וידאו לא מכווץ + 20.05.46 - שחזור פונקציונליות תמלול + 19.35.36 - שחזר סמלי נגן Shorts ישנים + 19.01.34 - שחזר סמלי ניווט ישנים + + + שנה את דף ההתחלה + ברירת מחדל + כל המינויים + עיין בערוצים + קורסים / למידה + מה חדש + אופנה & יופי + גיימינג + היסטוריה + ספרייה + סרטונים שאהבתי + בשידור חי + סרטים + מוזיקה + חדשות + עדכונים + פלייליסטים + חיפוש + שופינג + ספורט + מינויים + הסרטונים החמים + מציאות מדומה + לצפייה בהמשך + הקליפים שלך + לשנות תמיד את דף הפתיחה + "דף הפתיחה תמיד משתנה מגבלה: ייתכן שלחצן החזרה בסרגל הכלים לא יפעל" - דף הפתיחה משתנה רק בעת הפעלת האפליקציה - - - השבת חידוש נגן Shorts - נגן Shorts לא יתחדש בעת הפעלת היישום - נגן Shorts יתחדש בעת הפעלת היישום - - - פתח Shorts עם - נגן Shorts - נגן רגיל - נגן רגיל במסך מלא - - - הפעלה אוטומטית של Shorts - סרטוני Shorts יפעילו אוטומטית - סרטוני Shorts יחזרו על עצמם - הפעלה אוטומטית בעת הפעלה ברקע של Shorts - הפעלה ברקע של Shorts תפעיל אוטומטית - הפעלה ברקע של Shorts תחזור על עצמה - - - מיני-נגן - שנה את הסגנון של הנגן הממוזער בתוך היישום - סוג מיני-נגן - מושבת - ברירת מחדל - מינימלי - טאבלט - מודרני 1 - מודרני 2 - מודרני 3 - מודרני 4 - בטל פינות מעוגלות - הפינות מרובעות - הפינות מעוגלות - הפעל הקשה כפולה וצביטה לשינוי גודל - "פעולת הקשה כפולה וצביטה לשינוי גודל מופעלת + דף הפתיחה משתנה רק בעת הפעלת האפליקציה + + + השבת חידוש נגן Shorts + נגן Shorts לא יתחדש בעת הפעלת היישום + נגן Shorts יתחדש בעת הפעלת היישום + + + פתח Shorts עם + נגן Shorts + נגן רגיל + נגן רגיל במסך מלא + + + הפעלה אוטומטית של Shorts + סרטוני Shorts יפעילו אוטומטית + סרטוני Shorts יחזרו על עצמם + הפעלה אוטומטית בעת הפעלה ברקע של Shorts + הפעלה ברקע של Shorts תפעיל אוטומטית + הפעלה ברקע של Shorts תחזור על עצמה + + + מיני-נגן + שנה את הסגנון של הנגן הממוזער בתוך היישום + סוג מיני-נגן + מושבת + ברירת מחדל + מינימלי + טאבלט + מודרני 1 + מודרני 2 + מודרני 3 + מודרני 4 + בטל פינות מעוגלות + הפינות מרובעות + הפינות מעוגלות + הפעל הקשה כפולה וצביטה לשינוי גודל + "פעולת הקשה כפולה וצביטה לשינוי גודל מופעלת • הקש פעמיים כדי להגדיל את גודל המיני-נגן • הקש פעמיים שוב כדי לשחזר את הגודל המקורי" - פעולת הקשה כפולה וצביטה לשינוי גודל מושבתת - בטל גרירה ושחרור - גרירה ושחרור מושבת - "גרירה ושחרור מופעלים + פעולת הקשה כפולה וצביטה לשינוי גודל מושבתת + בטל גרירה ושחרור + גרירה ושחרור מושבת + "גרירה ושחרור מופעלים מיני-נגן ניתן לגרירה לעבר כל פינה של המסך" - בטל מחוות גרירה אופקית - מחוות גרירה אופקית מושבתת - "מחוות גרירה אופקית מופעלת + בטל מחוות גרירה אופקית + מחוות גרירה אופקית מושבתת + "מחוות גרירה אופקית מופעלת מיני-נגן ניתן לגרירה מחוץ למסך לשמאל או לימין" - הסתר לחצני שכבת-על - לחצני שכבת-על מוסתרים - לחצני שכבת-על מוצגים - הסתר תת-טקסטים - תת-טקסטים מוסתרים - תת-טקסטים מוצגים - הסתר לחצני דילוג קדימה ואחורה - דילוג קדימה או אחורה מוסתרים - דילוג קדימה או אחורה מוצגים - גודל ראשוני - גודל על המסך ראשוני, בפיקסלים - גודל פיקסל חייב להיות בין %1$s ו-%2$s - אטימות שכבת-על - ערך אטימות בין 0 ל-100, כאשר 0 שקוף - אטימות שכבת-על של מיני-נגן חייבת להיות בין 0 ל-100 - - - הפעל מסך טעינה עם מעבר צבע - מסך הטעינה יהיה בעל רקע עם מעבר צבע - מסך הטעינה יהיה בעל רקע מוצק - סגנון מסך פתיחה - צבע - שחור ולבן - הפעל צבע סרגל דילוג מותאם אישית - צבע סרגל דילוג מותאם אישית מוצג - צבע סרגל דילוג מקורי מוצג - צבע סרגל דילוג מותאם אישית - הצבע של סרגל הדילוג - צבע הדגשת סרגל דילוג מותאם אישית - צבע ההדגשה של סרגל הדילוג - ערך צבע סרגל דילוג לא חוקי - - - - - לוגו כותרת - ברירת מחדל - רגיל - - ReVanced מינימלי - מותאם אישית - - - עקוף מגבלות תמונה אזוריות - שימוב במארח תמונות yt4.ggpht.com - "שימוש במארח תמונות מקורי + הסתר לחצני שכבת-על + לחצני שכבת-על מוסתרים + לחצני שכבת-על מוצגים + הסתר תת-טקסטים + תת-טקסטים מוסתרים + תת-טקסטים מוצגים + הסתר לחצני דילוג קדימה ואחורה + דילוג קדימה או אחורה מוסתרים + דילוג קדימה או אחורה מוצגים + גודל ראשוני + גודל על המסך ראשוני, בפיקסלים + גודל פיקסל חייב להיות בין %1$s ו-%2$s + אטימות שכבת-על + ערך אטימות בין 0 ל-100, כאשר 0 שקוף + אטימות שכבת-על של מיני-נגן חייבת להיות בין 0 ל-100 + + + הפעל מסך טעינה עם מעבר צבע + מסך הטעינה יהיה בעל רקע עם מעבר צבע + מסך הטעינה יהיה בעל רקע מוצק + סגנון מסך פתיחה + צבע + שחור ולבן + הפעל צבע סרגל דילוג מותאם אישית + צבע סרגל דילוג מותאם אישית מוצג + צבע סרגל דילוג מקורי מוצג + צבע סרגל דילוג מותאם אישית + הצבע של סרגל הדילוג + צבע הדגשת סרגל דילוג מותאם אישית + צבע ההדגשה של סרגל הדילוג + ערך צבע סרגל דילוג לא חוקי + + + + לוגו כותרת + ברירת מחדל + רגיל + + ReVanced מינימלי + מותאם אישית + + + עקוף מגבלות תמונה אזוריות + שימוב במארח תמונות yt4.ggpht.com + "שימוש במארח תמונות מקורי הפעלת אפשרות זו יכולה לתקן תמונות חסרות שנחסמו באזורים מסוימים" - - - - כרטיסיית דף הבית - - כרטיסיית מינויים - - כרטיסיית הדף שלי - פלייליסטים & המלצות של נגן - תוצאות חיפוש - תמונות ממוזערות מקוריות - תמונות ממוזערות מקוריות & DeArrow - לכידות דוממות & DeArrow - לכידות דוממות - "השירות DeArrow מספק תמונות ממוזערות של מיקור המונים עבור סרטוני YouTube. תמונות ממוזערות אלה הן לעתים קרובות רלוונטיות יותר מאלה שסופקו על ידי YouTube + + + + כרטיסיית דף הבית + + כרטיסיית מינויים + + כרטיסיית הדף שלי + פלייליסטים & המלצות של נגן + תוצאות חיפוש + תמונות ממוזערות מקוריות + תמונות ממוזערות מקוריות & DeArrow + לכידות דוממות & DeArrow + לכידות דוממות + "השירות DeArrow מספק תמונות ממוזערות של מיקור המונים עבור סרטוני YouTube. תמונות ממוזערות אלה הן לעתים קרובות רלוונטיות יותר מאלה שסופקו על ידי YouTube אם מופעל, כתובות URL של סרטונים יישלחו לשרת ה-API ושום נתונים אחרים לא יישלחו. אם לסרטון אין תמונות ממוזערות של DeArrow, אז מוצגות התמונות המקוריות או לכידות דוממות הקש כאן כדי ללמוד עוד על DeArrow" - הצג הודעה קופצת אם ה-API אינו זמין - הודעה קופצת מוצגת אם DeArrow אינו זמין - הודעה קופצת אינו מוצגת אם DeArrow אינו זמין - נקודת קצה של DeArrow API - כתובת ה-URL של הנקודת קצה מטמון תמונות ממוזערות של DeArrow - לכידות סרטון דוממות - לכידות דוממות נלקחות מהתחלת/אמצע/סוף של כל סרטון. תמונות אלו מובנות לתוך YouTube ולא נעשה שימוש ב-API חיצוני - השתמש בלכידות דוממות מהירות - שימוש בלכידות דוממות באיכות בינונית. תמונות ממוזערות יטענו מהר יותר, אבל שידורים חיים וסרטונים שלא פורסמו או ישנים מאוד עשויים להציג תמונות ממוזערות ריקות - שימוש בלכידות דוממות באיכות גבוהה - זמן הסרטון ממנו יש לקחת לכידות דוממות - תחילת הסרטון - אמצע הסרטון - סוף הסרטון - - השירות DeArrow אינו זמין באופן זמני (קוד מצב: %s) - השירות DeArrow אינו זמין באופן זמני - - - הצג הכרזות של ReVanced - הכרזות בעת הפעלה מוצגות - הכרזות בעת הפעלה אינן מוצגות - הצג הכרזות בעת הפעלה - נכשל בהתחברות לספק הכרזות - דחה - - - הפעל סרטון בלולאה - הסרטון יופעל בלולאה - הסרטון לא יופעל בלולאה - - - הצג לחצן הפעלת סרטון בלולאה - הלחצן מוצג - הלחצן אינו מוצג - הפעלת סרטון בלולאה מופעלת - הפעלת סרטון בלולאה כבויה - - - - - זייף ממדי מכשיר - "מימדי המכשיר מזויפים + הצג הודעה קופצת אם ה-API אינו זמין + הודעה קופצת מוצגת אם DeArrow אינו זמין + הודעה קופצת אינו מוצגת אם DeArrow אינו זמין + נקודת קצה של DeArrow API + כתובת ה-URL של הנקודת קצה מטמון תמונות ממוזערות של DeArrow + לכידות סרטון דוממות + לכידות דוממות נלקחות מהתחלת/אמצע/סוף של כל סרטון. תמונות אלו מובנות לתוך YouTube ולא נעשה שימוש ב-API חיצוני + השתמש בלכידות דוממות מהירות + שימוש בלכידות דוממות באיכות בינונית. תמונות ממוזערות יטענו מהר יותר, אבל שידורים חיים וסרטונים שלא פורסמו או ישנים מאוד עשויים להציג תמונות ממוזערות ריקות + שימוש בלכידות דוממות באיכות גבוהה + זמן הסרטון ממנו יש לקחת לכידות דוממות + תחילת הסרטון + אמצע הסרטון + סוף הסרטון + + השירות DeArrow אינו זמין באופן זמני (קוד מצב: %s) + השירות DeArrow אינו זמין באופן זמני + + + הצג הכרזות של ReVanced + הכרזות בעת הפעלה מוצגות + הכרזות בעת הפעלה אינן מוצגות + הצג הכרזות בעת הפעלה + נכשל בהתחברות לספק הכרזות + דחה + + + הפעל סרטון בלולאה + הסרטון יופעל בלולאה + הסרטון לא יופעל בלולאה + + + הצג לחצן הפעלת סרטון בלולאה + הלחצן מוצג + הלחצן אינו מוצג + הפעלת סרטון בלולאה מופעלת + הפעלת סרטון בלולאה כבויה + + + + זייף ממדי מכשיר + "מימדי המכשיר מזויפים איכויות סרטון גבוהות יותר עשויות להיות פתוחות אך ייתכן שתחווה גמגום בהפעלת סרטון, חיי סוללה גרועים יותר, ותופעות לוואי לא ידועות" - "מימדי המכשיר לא מזויפים + "מימדי המכשיר לא מזויפים הפעלת אפשרות זו יכולה לפתוח איכויות סרטון גבוהות יותר" - הפעלת אפשרות זו עלולה לגרום לגמגום בהפעלת סרטון, חיי סוללה גרועים יותר, ותופעות לוואי לא ידועות. - - - משוב ברטט - שנה משוב ברטט - השבת משוב ברטט עבור פרקים - משוב ברטט עבור פרקים מושבת - משוב ברטט עבור פרקים מופעל - השבת משוב ברטט עבור דילוג מדויק - משוב ברטט עבור דילוג מדויק מושבת - משוב ברטט עבור דילוג מדויק מופעל - השבת משוב ברטט עבור ביטול דילוג - משוב ברטט עבור ביטול דילוג מושבת - משוב ברטט עבור ביטול דילוג מופעל - השבת משוב זום ברטט - משוב ברטט עבור זום מושבת - משוב ברטט עבור זום מופעל - - - אם פרטי הכניסה לחשבונך השתנו לאחרונה, אז יש להסיר ולהתקין מחדש את MicroG. - - - עקוף הפניות מחדש של URL - הפניות מחדש של URL נעקפות - הפניות מחדש של URL אינן נעקפות - - - פתח קישורים בדפדפן - פותח קישורים בדפדפן חיצוני - פותח קישורים בדפדפן בתוך היישום - - - - אוטומטי - זכור שינויי איכות סרטון - שינויי איכות חלים על כל הסרטונים - שינויי איכות חלים רק על הסרטון הנוכחי - הצג הודעה קופצת בעת שינויים באיכות הסרטון - מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה - לא מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה - איכות סרטון ברירת מחדל ברשת אלחוטית - איכות סרטון ברירת מחדל ברשת סלולרית - זכור שינויי איכות Shorts - שינויי איכות חלים על כל הסרטוני Shorts - שינויי איכות חלים רק על הסרטון Short הנוכחי - איכות Shorts ברירת מחדל ברשת אלחוטית - איכות Shorts ברירת מחדל ברשת סלולרית - סלולרית - אלחוטית - איכות %1$s ברירת מחדל שונתה ל: %2$s - איכות %1$s Shorts שונתה ל: %2$s - - - הצג לחצן דו-שיח של מהירות - לחצן \'דו-שיח מהירות\' מוצג. הקש והחזק כדי לאפס את מהירות ההפעלה לברירת מחדל - לחצן \'דו-שיח מהירות\' אינו מוצג - - - הצג לחצן איכות סרטון - לחצן \'איכות וידאו\' מוצג. הקש והחזק כדי לאפס את האיכות לברירת מחדל - לחצן \'איכות וידאו\' אינו מוצג - - - תפריט מהירות הפעלה מותאם אישית - תפריט מהירות מותאם אישית מוצג - תפריט מהירות מותאם אישית אינו מוצג - שחזר תפריט מהירות השמעה ישן - תפריט מהירות ישן מוצג - תפריט מהירות מודרני מוצג - מהירויות הפעלה מותאמות אישית - הוסף או שנה את המהירויות הפעלה המותאמות אישית - מהירויות מותאמות אישית חייבות להיות קטנות מ-%s - מהירויות הפעלה מותאמות אישית לא חוקיות - אוטומטי - מהירות הקשה והחזקה מותאמת אישית - מהירות הפעלה בין 0 ל-8 - - - זכור שינויי מהירות הפעלה - שינויי מהירות הפעלה חלים על כל הסרטונים - שינויי מהירות הפעלה חלים רק על הסרטון הנוכחי - הצג הודעה קופצת בעת שינויים במהירות ההפעלה - מוצגת הודעה קופצת כאשר מהירות ההפעלה ברירת המחדל משתנה - לא מוצגת הודעה קוצפת כאשר מהירות ההפעלה ברירת המחדל משתנה - מהירות הפעלה ברירת מחדל - מהירות ברירת המחדל שונתה ל: %s - - - השבת סרטון HDR - סרטון HDR מושבת - סרטון HDR מופעל - כפה AVC (H.264) - קודק הווידאו נכפה ל-AVC (H.264) - קודק הווידאו נקבע אוטומטית - "יתרונות: + הפעלת אפשרות זו עלולה לגרום לגמגום בהפעלת סרטון, חיי סוללה גרועים יותר, ותופעות לוואי לא ידועות. + + + משוב ברטט + שנה משוב ברטט + השבת משוב ברטט עבור פרקים + משוב ברטט עבור פרקים מושבת + משוב ברטט עבור פרקים מופעל + השבת משוב ברטט עבור דילוג מדויק + משוב ברטט עבור דילוג מדויק מושבת + משוב ברטט עבור דילוג מדויק מופעל + השבת משוב ברטט עבור ביטול דילוג + משוב ברטט עבור ביטול דילוג מושבת + משוב ברטט עבור ביטול דילוג מופעל + השבת משוב זום ברטט + משוב ברטט עבור זום מושבת + משוב ברטט עבור זום מופעל + + + אם פרטי הכניסה לחשבונך השתנו לאחרונה, אז יש להסיר ולהתקין מחדש את MicroG. + + + עקוף הפניות מחדש של URL + הפניות מחדש של URL נעקפות + הפניות מחדש של URL אינן נעקפות + + + פתח קישורים בדפדפן + פותח קישורים בדפדפן חיצוני + פותח קישורים בדפדפן בתוך היישום + + + + אוטומטי + זכור שינויי איכות סרטון + שינויי איכות חלים על כל הסרטונים + שינויי איכות חלים רק על הסרטון הנוכחי + הצג הודעה קופצת בעת שינויים באיכות הסרטון + מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה + לא מוצגת הודעה קופצת כאשר איכות הסרטון ברירת המחדל משתנה + איכות סרטון ברירת מחדל ברשת אלחוטית + איכות סרטון ברירת מחדל ברשת סלולרית + זכור שינויי איכות Shorts + שינויי איכות חלים על כל הסרטוני Shorts + שינויי איכות חלים רק על הסרטון Short הנוכחי + איכות Shorts ברירת מחדל ברשת אלחוטית + איכות Shorts ברירת מחדל ברשת סלולרית + סלולרית + אלחוטית + איכות %1$s ברירת מחדל שונתה ל: %2$s + איכות %1$s Shorts שונתה ל: %2$s + + + הצג לחצן דו-שיח של מהירות + לחצן \'דו-שיח מהירות\' מוצג. הקש והחזק כדי לאפס את מהירות ההפעלה לברירת מחדל + לחצן \'דו-שיח מהירות\' אינו מוצג + + + הצג לחצן איכות סרטון + לחצן \'איכות וידאו\' מוצג. הקש והחזק כדי לאפס את האיכות לברירת מחדל + לחצן \'איכות וידאו\' אינו מוצג + + + תפריט מהירות הפעלה מותאם אישית + תפריט מהירות מותאם אישית מוצג + תפריט מהירות מותאם אישית אינו מוצג + שחזר תפריט מהירות השמעה ישן + תפריט מהירות ישן מוצג + תפריט מהירות מודרני מוצג + מהירויות הפעלה מותאמות אישית + הוסף או שנה את המהירויות הפעלה המותאמות אישית + מהירויות מותאמות אישית חייבות להיות קטנות מ-%s + מהירויות הפעלה מותאמות אישית לא חוקיות + אוטומטי + מהירות הקשה והחזקה מותאמת אישית + מהירות הפעלה בין 0 ל-8 + + + זכור שינויי מהירות הפעלה + שינויי מהירות הפעלה חלים על כל הסרטונים + שינויי מהירות הפעלה חלים רק על הסרטון הנוכחי + הצג הודעה קופצת בעת שינויים במהירות ההפעלה + מוצגת הודעה קופצת כאשר מהירות ההפעלה ברירת המחדל משתנה + לא מוצגת הודעה קוצפת כאשר מהירות ההפעלה ברירת המחדל משתנה + מהירות הפעלה ברירת מחדל + מהירות ברירת המחדל שונתה ל: %s + + + השבת סרטון HDR + סרטון HDR מושבת + סרטון HDR מופעל + כפה AVC (H.264) + קודק הווידאו נכפה ל-AVC (H.264) + קודק הווידאו נקבע אוטומטית + "יתרונות: • יכול לשפר את חיי הסוללה • יכול לשחזר רזולוציות וידאו חסרות במכשירים ישנים יותר @@ -1646,179 +1643,178 @@ Second \"item\" text" • הפעלת וידאו תשתמש ביותר נתוני אינטרנט מאשר VP9 או AV1 • סרטוני HDR לא ישתמשו ב-AVC • התקנים מסוימים אינם יכולים לאכוף AVC" - - - הצג תפריט איכות סרטון מתקדם - תפריט איכות סרטון מתקדם מוצג - תפריט איכות סרטון מתקדם אינו מוצג - - - הפעל החלק כדי לדלג - החלק כדי לדלג מופעל - החלק כדי לדלג אינו מופעל - - - אפשר Android VR AV1 - "מקודד וידאו הוא AVC (H.264), VP9, או AV1 + + + הצג תפריט איכות סרטון מתקדם + תפריט איכות סרטון מתקדם מוצג + תפריט איכות סרטון מתקדם אינו מוצג + + + הפעל החלק כדי לדלג + החלק כדי לדלג מופעל + החלק כדי לדלג אינו מופעל + + + אפשר Android VR AV1 + "מקודד וידאו הוא AVC (H.264), VP9, או AV1 ההפעלה עשויה לגמגם או לדלג על פריימים" - מקודד וידאו הוא AVC (H.264) או VP9 - "הפעלת הגדרה זו עשויה להשתמש בפענוח תוכנה של AV1. + מקודד וידאו הוא AVC (H.264) או VP9 + "הפעלת הגדרה זו עשויה להשתמש בפענוח תוכנה של AV1. הפעלת וידאו עם AV1 עלולה לגרום לגמגום או לדלוג על פריימים." - תופעות לוואי של התחזות - • לקוח ניסיוני ועשוי להפסיק לפעול בכל עת - • הווידאו עשוי להיעצר בדקה 1:00, או ייתכן שלא יהיה זמין באזורים מסוימים - • תפריט ערוץ השמע חסר - • אין קודק וידאו מסוג AV1 - • עוצמת קול יציבה אינה זמינה - • ייתכן שסרטוני Kids לא יופעלו כשאתה מנותק או במצב פרטי - - • כפיית שמע מקורי אינה זמינה - הצג בנתונים לגיקים - סוג הלקוח מוצג בנתונים לגיקים - הלקוח מוסתר בנתונים לגיקים - - - - - - - אודות - מודעות - כללי - נגן - שונות - - - הסתר מודעות וידאו - מודעות הווידאו מוסתרות - מודעות הווידאו מוצגות - - - אפשר חזרה קבועה - חזרה קבועה מופעלת - חזרה קבועה מושבתת - - - הסתר לחצן שידור - לחצן השידור מוסתר - לחצן השידור מוצג - הסתר לחצן היסטוריה - הלחצן \'היסטוריה\' מוסתר - הלחצן \'היסטוריה\' מוצג - הסתר לחצן התראה - לחצן ההתראה מוסתר - לחצן ההתראה מוצג - הסתר לחצן חיפוש - לחצן החיפוש מוסתר - לחצן החיפוש מוצג - - - הסתר סרגל קטגוריות - סרגל הקטגוריות מוסתר - סרגל הקטגוריות מוצג - - - שנה צבע מיני-נגן - צבע המיני-נגן תואם לנגן במסך מלא - מיני-נגן משתמש בצבע ברירת המחדל - - - סרגל ניווט - הסתר או שנה לחצני סרגל ניווט - - הסתר דף הבית - לחצן \'דף הבית\' מוסתר - לחצן \'דף הבית\' מוצג - - הסתר דוגמאות - לחצן \'דוגמיות\' מוסתר - לחצן \'דוגמיות\' מוצג - - הסתר גלו - לחצן \'גלו\' מוסתר - לחצן \'גלו\' מוצג - - הסתר ספרייה - לחצן \'ספרייה\' מוסתר - לחצן \'ספרייה\' מוצג - - הסתר שדרוג - לחצן \'שדרוג\' מוסתר - לחצן \'שדרוג\' מוצג - הסתר סרגל ניווט - סרגל הניווט מוסתר - סרגל הניווט מוצג - הסתר תוויות לחצני ניווט - התוויות מוסתרות - התוויות מוצגות - - - הסתר תווית \'קבל Premium למוזיקה\' - התווית מוסתרת - התווית מוצגת - - - הסתר לחצן שדרוג - הלחצן מוסתר - הלחצן מוצג - - - - - חסום מודעות שמע - מודעות שמע חסומות - מודעות שמע אינן חסומות - - - %s אינו זמין, מודעות עשויות להופיע. נסה לשנות את שירות חוסם המודעות בהגדרות. - %s החזיר שגיאה, מודעות עשויות להופיע. נסה לשנות את שירות חוסם המודעות בהגדרות. - חסום מודעות סרטון מוטמעות - מושבת - פרוקסי Luminous - פרוקסי PurpleAdBlock - - - חסום מודעות סרטון - מודעות סרטון חסומות - מודעות סרטון אינן חסומות - - - ההודעה נמחקה - הצג הודעות שנמחקו - אל תציג הודעות שנמחקו - הסתר מודעות שנמחקו מאחורי ספויילר - הצג מודעות שנמחקו כטקסט מחוק - - - קבל נקודות ערוץ באופן אוטומטי - נקודות ערוץ מתקבלות באופן אוטומטי - נקודות ערוץ אינן מתקבלות באופן אוטומטי - - - - הפעל מצב איתור באגים של Twitch - מצב איתור באגים של Twitch מופעל (לא מומלץ) - מצב איתור באגים של Twitch מושבת - - - הגדרות ReVanced - אודות - אודות ReVanced - חסימת מודעות - הגדרות חסימת מודעות - צ\'אט - הגדרות צ\'אט - שונות - הגדרות שונות - הגדרות כלליות - הגדרות אחרות - מודעות מצד הלקוח - מודעות SureStream מצד השרת - רישום איתור באגים - יומני איתור באגים מופעלים - יומני איתור באגים מושבתים - - + תופעות לוואי של התחזות + • לקוח ניסיוני ועשוי להפסיק לפעול בכל עת + • הווידאו עשוי להיעצר בדקה 1:00, או ייתכן שלא יהיה זמין באזורים מסוימים + • תפריט ערוץ השמע חסר + • אין קודק וידאו מסוג AV1 + • עוצמת קול יציבה אינה זמינה + • ייתכן שסרטוני Kids לא יופעלו כשאתה מנותק או במצב פרטי + + • כפיית שמע מקורי אינה זמינה + הצג בנתונים לגיקים + סוג הלקוח מוצג בנתונים לגיקים + הלקוח מוסתר בנתונים לגיקים + + + + + + אודות + מודעות + כללי + נגן + שונות + + + הסתר מודעות וידאו + מודעות הווידאו מוסתרות + מודעות הווידאו מוצגות + + + אפשר חזרה קבועה + חזרה קבועה מופעלת + חזרה קבועה מושבתת + + + הסתר לחצן שידור + לחצן השידור מוסתר + לחצן השידור מוצג + הסתר לחצן היסטוריה + הלחצן \'היסטוריה\' מוסתר + הלחצן \'היסטוריה\' מוצג + הסתר לחצן התראה + לחצן ההתראה מוסתר + לחצן ההתראה מוצג + הסתר לחצן חיפוש + לחצן החיפוש מוסתר + לחצן החיפוש מוצג + + + הסתר סרגל קטגוריות + סרגל הקטגוריות מוסתר + סרגל הקטגוריות מוצג + + + שנה צבע מיני-נגן + צבע המיני-נגן תואם לנגן במסך מלא + מיני-נגן משתמש בצבע ברירת המחדל + + + סרגל ניווט + הסתר או שנה לחצני סרגל ניווט + + הסתר דף הבית + לחצן \'דף הבית\' מוסתר + לחצן \'דף הבית\' מוצג + + הסתר דוגמאות + לחצן \'דוגמיות\' מוסתר + לחצן \'דוגמיות\' מוצג + + הסתר גלו + לחצן \'גלו\' מוסתר + לחצן \'גלו\' מוצג + + הסתר ספרייה + לחצן \'ספרייה\' מוסתר + לחצן \'ספרייה\' מוצג + + הסתר שדרוג + לחצן \'שדרוג\' מוסתר + לחצן \'שדרוג\' מוצג + הסתר סרגל ניווט + סרגל הניווט מוסתר + סרגל הניווט מוצג + הסתר תוויות לחצני ניווט + התוויות מוסתרות + התוויות מוצגות + + + הסתר תווית \'קבל Premium למוזיקה\' + התווית מוסתרת + התווית מוצגת + + + הסתר לחצן שדרוג + הלחצן מוסתר + הלחצן מוצג + + + + + חסום מודעות שמע + מודעות שמע חסומות + מודעות שמע אינן חסומות + + + %s אינו זמין, מודעות עשויות להופיע. נסה לשנות את שירות חוסם המודעות בהגדרות. + %s החזיר שגיאה, מודעות עשויות להופיע. נסה לשנות את שירות חוסם המודעות בהגדרות. + חסום מודעות סרטון מוטמעות + מושבת + פרוקסי Luminous + פרוקסי PurpleAdBlock + + + חסום מודעות סרטון + מודעות סרטון חסומות + מודעות סרטון אינן חסומות + + + ההודעה נמחקה + הצג הודעות שנמחקו + אל תציג הודעות שנמחקו + הסתר מודעות שנמחקו מאחורי ספויילר + הצג מודעות שנמחקו כטקסט מחוק + + + קבל נקודות ערוץ באופן אוטומטי + נקודות ערוץ מתקבלות באופן אוטומטי + נקודות ערוץ אינן מתקבלות באופן אוטומטי + + + + הפעל מצב איתור באגים של Twitch + מצב איתור באגים של Twitch מופעל (לא מומלץ) + מצב איתור באגים של Twitch מושבת + + + הגדרות ReVanced + אודות + אודות ReVanced + חסימת מודעות + הגדרות חסימת מודעות + צ\'אט + הגדרות צ\'אט + שונות + הגדרות שונות + הגדרות כלליות + הגדרות אחרות + מודעות מצד הלקוח + מודעות SureStream מצד השרת + רישום איתור באגים + יומני איתור באגים מופעלים + יומני איתור באגים מושבתים + + diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index 453c9068e5..6c361ef70e 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -17,239 +17,238 @@ "First 'item' text Second \"item\" text" ---> - - - - アプリ名 - - カスタム - アプリアイコン - オリジナル - ReVanced - - ReVanced(シンプル) - ReVanced(ロゴ拡大) - - カスタム - - - チェックに失敗しました - 公式サイトを開く - 無視 - <h5>このアプリはあなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく機能しない可能性があり、<b>使用すると有害または危険になる可能性があります</b>。<br><br>これらのチェックは、このアプリが事前にパッチが適用されているか、または他の誰かから取得されたことを意味します:<br><br><small>%1$s</small><br>検証済みで安全なアプリを使用していることを確認するために、<b>このアプリをアンインストールして自分でパッチを適用する</b>ことを強くおすすめします。<p><br>無視した場合、この警告は 2 回のみ表示されます。 - 別のデバイス上でパッチが適用されている - ReVanced Manager によってインストールされていない - 10 分以上前にパッチが適用されている - %s 日前にパッチが適用されている - APK の作成日時データが破損している - - - ReVanced からの通知 - 再生履歴が保存されていません。<br><br>これはおそらく、DNS 広告ブロッカーまたはネットワーク プロキシが原因です。<br><br>この問題を解決するには、<b>s.youtube.com</b> をホワイトリストに追加するか、すべての DNS ブロッカーとプロキシをオフにしてください。 - 今後表示しない - - - 設定 - ReVanced - 続行してもよろしいですか? - 保存 - リセット - 色をリセット - 色の値が無効です - 再起動が必要です - この変更を適用するには、アプリを再起動してください。 - 再起動 - インポート - コピー - ReVanced の設定をデフォルトにリセット - %d 個の設定をインポートしました - インポートに失敗しました: %s - 設定を検索 - 「%s」に該当する結果は見つかりませんでした - 別のキーワードを試してください - 最近の検索 - 検索履歴から削除しますか? - 検索履歴を消去 - 本当にすべての検索履歴を消去しますか? - 検索のヒント - "• カテゴリをタップするとそのカテゴリの設定メニューに移動する +--> + + + アプリ名 + + カスタム + アプリアイコン + オリジナル + ReVanced + + ReVanced(シンプル) + ReVanced(ロゴ拡大) + + カスタム + + + チェックに失敗しました + 公式サイトを開く + 無視 + <h5>このアプリはあなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく機能しない可能性があり、<b>使用すると有害または危険になる可能性があります</b>。<br><br>これらのチェックは、このアプリが事前にパッチが適用されているか、または他の誰かから取得されたことを意味します:<br><br><small>%1$s</small><br>検証済みで安全なアプリを使用していることを確認するために、<b>このアプリをアンインストールして自分でパッチを適用する</b>ことを強くおすすめします。<p><br>無視した場合、この警告は 2 回のみ表示されます。 + 別のデバイス上でパッチが適用されている + ReVanced Manager によってインストールされていない + 10 分以上前にパッチが適用されている + %s 日前にパッチが適用されている + APK の作成日時データが破損している + + + ReVanced からの通知 + 再生履歴が保存されていません。<br><br>これはおそらく、DNS 広告ブロッカーまたはネットワーク プロキシが原因です。<br><br>この問題を解決するには、<b>s.youtube.com</b> をホワイトリストに追加するか、すべての DNS ブロッカーとプロキシをオフにしてください。 + 今後表示しない + + + 設定 + ReVanced + 続行してもよろしいですか? + 保存 + リセット + 色をリセット + 色の値が無効です + 再起動が必要です + この変更を適用するには、アプリを再起動してください。 + 再起動 + インポート + コピー + ReVanced の設定をデフォルトにリセット + %d 個の設定をインポートしました + インポートに失敗しました: %s + 設定を検索 + 「%s」に該当する結果は見つかりませんでした + 別のキーワードを試してください + 最近の検索 + 検索履歴から削除しますか? + 検索履歴を消去 + 本当にすべての検索履歴を消去しますか? + 検索のヒント + "• カテゴリをタップするとそのカテゴリの設定メニューに移動する • 設定を長押しすると設定メニューに移動してその設定までスクロールする • Enter キーを押すと検索クエリが履歴に保存される • 検索では、大文字・小文字や句読点は無視される • 無効化されている下位設定の上には、その設定を無効化している上位設定が表示される" - 検索履歴はありません - 検索履歴を保存するには、検索クエリを入力して Enter キーを押してください - 設定の検索履歴を表示 - 設定の検索履歴は表示されます - 設定の検索履歴は表示されません - ReVanced の設定にアイコンを表示 - ReVanced の設定メニューにアイコンが表示されます - ReVanced の設定メニューにアイコンは表示されません - ReVanced 設定の言語 - "一部の言語の翻訳が欠落しているまたは不完全である可能性があります。 + 検索履歴はありません + 検索履歴を保存するには、検索クエリを入力して Enter キーを押してください + 設定の検索履歴を表示 + 設定の検索履歴は表示されます + 設定の検索履歴は表示されません + ReVanced の設定にアイコンを表示 + ReVanced の設定メニューにアイコンが表示されます + ReVanced の設定メニューにアイコンは表示されません + ReVanced 設定の言語 + "一部の言語の翻訳が欠落しているまたは不完全である可能性があります。 新しい言語を翻訳する、または既存の翻訳を改善するには、translate.revanced.app にアクセスしてください。" - アプリの言語 - インポート / エクスポート - ReVanced の設定をインポート/エクスポートします - - ReVanced Patches のバージョン <i>%s</i> を使用しています - 注意 - このバージョンはプレリリース版であり、予期しない問題が発生する可能性があります - 公式リンク - + ReVanced Patches のバージョン <i>%s</i> を使用しています + 注意 + このバージョンはプレリリース版であり、予期しない問題が発生する可能性があります + 公式リンク + - - - GmsCore 設定 - GmsCore の設定 - - MicroG GmsCore がインストールされていません。インストールしてください。 - 操作が必要です - "GmsCore はバックグラウンドで実行する権限がありません。 + + + GmsCore 設定 + GmsCore の設定 + + MicroG GmsCore がインストールされていません。インストールしてください。 + 操作が必要です + "GmsCore はバックグラウンドで実行する権限がありません。 お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore に対するデバイスの設定を変更してください。 これはアプリが正常に動作するために必要です。" - ウェブサイトを開く - "問題を防ぐためには、GmsCore の電池の最適化を無効にする必要があります。 + ウェブサイトを開く + "問題を防ぐためには、GmsCore の電池の最適化を無効にする必要があります。 GmsCore の電池の最適化を無効にしても、バッテリーの使用に悪影響を及ぼすことはありません。 [続行] をタップして「電池の最適化」を無効にしてください。" - 続行 - - - 動画ストリームを偽装 - 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します - 動画ストリームを偽装 - 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します - 動画ストリームを偽装 - "動画ストリームは偽装されます + 続行 + + + 動画ストリームを偽装 + 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します + 動画ストリームを偽装 + 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します + 動画ストリームを偽装 + "動画ストリームは偽装されます YouTube Premium ユーザーの場合、この設定は必要ない可能性があります" - "動画ストリームは偽装されません + "動画ストリームは偽装されません 再生に失敗する可能性があります" - この設定を無効にすると、動画の再生に失敗するようになる可能性があります。 - デフォルトのクライアント - - - オリジナルの音声を強制的に使用 - オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用されません - アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックが使用される場合があります - - この機能を使用するには、[動画ストリームを偽装] のクライアントを Android Studio 以外の任意のクライアントに変更してください - - - デバッグ - デバッグ オプションを有効または無効にします - デバッグログを有効化 - デバッグログは有効です - デバッグログは無効です - スタック トレースをログに保存 - デバッグログにはスタック トレースが含まれます - デバッグログにはスタック トレースは含まれません - ReVanced のエラー時にトーストを表示 - エラーが発生した場合にトースト通知が表示されます - エラーが発生した場合にトースト通知は表示されません - "エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。 + この設定を無効にすると、動画の再生に失敗するようになる可能性があります。 + デフォルトのクライアント + + + オリジナルの音声を強制的に使用 + オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用されません + アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックが使用される場合があります + + この機能を使用するには、[動画ストリームを偽装] のクライアントを Android Studio 以外の任意のクライアントに変更してください + + + デバッグ + デバッグ オプションを有効または無効にします + デバッグログを有効化 + デバッグログは有効です + デバッグログは無効です + スタック トレースをログに保存 + デバッグログにはスタック トレースが含まれます + デバッグログにはスタック トレースは含まれません + ReVanced のエラー時にトーストを表示 + エラーが発生した場合にトースト通知が表示されます + エラーが発生した場合にトースト通知は表示されません + "エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。 予期しないイベントが発生した場合でも通知されなくなります。" - デバッグログのエクスポート - ReVanced のデバッグログをクリップボードにコピーします - デバッグログが無効になっています - ログが見つかりませんでした - ログをコピーしました - ログのエクスポートに失敗しました: %s - デバッグログを消去 - 保存されている ReVanced のすべてのデバッグログを消去します - ログを消去しました - feature flag マネージャー - 各機能のオン / オフを制御する feature flag を管理します - 有効な flag (%d) - 無効な flag (%d) - flag を検索 - flag を保存しました - flag をリセットしました - flag をクリップボードにコピーしました - protocol buffer をログに保存 - デバッグログには protocol buffer が含まれます - デバッグログには protocol buffer は含まれません - "この設定を有効にすると、一部の UI コンポーネントの画面上のテキストを含む、追加のレイアウトデータがログに記録されます。 + デバッグログのエクスポート + ReVanced のデバッグログをクリップボードにコピーします + デバッグログが無効になっています + ログが見つかりませんでした + ログをコピーしました + ログのエクスポートに失敗しました: %s + デバッグログを消去 + 保存されている ReVanced のすべてのデバッグログを消去します + ログを消去しました + feature flag マネージャー + 各機能のオン / オフを制御する feature flag を管理します + 有効な flag (%d) + 無効な flag (%d) + flag を検索 + flag を保存しました + flag をリセットしました + flag をクリップボードにコピーしました + protocol buffer をログに保存 + デバッグログには protocol buffer が含まれます + デバッグログには protocol buffer は含まれません + "この設定を有効にすると、一部の UI コンポーネントの画面上のテキストを含む、追加のレイアウトデータがログに記録されます。 これは、カスタムフィルターを作成する際にコンポーネントを識別するのに役立ちます。 ただし、これを有効にすると、IP アドレスなどの一部のユーザーデータもログに記録されます。" - - - 共有リンクを無害化 - 共有リンクから追跡パラメータが削除されます - 共有リンクから追跡パラメータは削除されません - 共有リンクを youtube.com に変更 - 共有リンクには youtube.com が使用されます - 共有リンクには music.youtube.com が使用されます - - - カスタム フィルタ - カスタム フィルタを使用してコンポーネントを非表示にします - カスタム フィルタを有効化 - カスタム フィルタは有効です - カスタム フィルタは無効です - カスタム フィルタ - - 非表示にするコンポーネントの path builder string のリスト (改行区切り) - 無効なカスタム フィルタ: %s - - - - - ReVanced について - 広告 - 代替サムネイル - フィード - 全般 - プレーヤー - ショート - シークバー - スワイプ コントロール - Return YouTube Dislike - その他 - 動画 - 古い設定メニューを復元 - 古いスタイルの設定メニューが表示されます - 新しいスタイルの設定メニューが表示されます - - - ショートのバックグラウンド再生を無効化 - ショート動画のバックグラウンド再生は無効です - ショート動画のバックグラウンド再生は有効です - - - アルバムカードを非表示 - アーティストの概要欄下のアルバムカードは表示されません - アーティストの概要欄下のアルバムカードは表示されます - アーティスト カードを非表示 - アーティスト カードは表示されません - アーティスト カードは表示されます - チップ欄を非表示 - チップ欄は表示されません - チップ欄は表示されます - コミュニティ投稿を非表示 - コミュニティ投稿は表示されません - コミュニティ投稿は表示されます - コンパクトなバナーを非表示 - コンパクトなバナーは表示されません - コンパクトなバナーは表示されます - 展開可能なカードを非表示 - 動画下の展開可能なカードは表示されません - 動画下の展開可能なカードは表示されます - 音声入力のフローティング ボタンを非表示 - 検索時の音声入力のフローティング ボタンは表示されません - 検索時の音声入力のフローティング ボタンは表示されます - 横スクロール欄を非表示 - "横スクロール欄は表示されません + + + 共有リンクを無害化 + 共有リンクから追跡パラメータが削除されます + 共有リンクから追跡パラメータは削除されません + 共有リンクを youtube.com に変更 + 共有リンクには youtube.com が使用されます + 共有リンクには music.youtube.com が使用されます + + + カスタム フィルタ + カスタム フィルタを使用してコンポーネントを非表示にします + カスタム フィルタを有効化 + カスタム フィルタは有効です + カスタム フィルタは無効です + カスタム フィルタ + + 非表示にするコンポーネントの path builder string のリスト (改行区切り) + 無効なカスタム フィルタ: %s + + + + + ReVanced について + 広告 + 代替サムネイル + フィード + 全般 + プレーヤー + ショート + シークバー + スワイプ コントロール + Return YouTube Dislike + その他 + 動画 + 古い設定メニューを復元 + 古いスタイルの設定メニューが表示されます + 新しいスタイルの設定メニューが表示されます + + + ショートのバックグラウンド再生を無効化 + ショート動画のバックグラウンド再生は無効です + ショート動画のバックグラウンド再生は有効です + + + アルバムカードを非表示 + アーティストの概要欄下のアルバムカードは表示されません + アーティストの概要欄下のアルバムカードは表示されます + アーティスト カードを非表示 + アーティスト カードは表示されません + アーティスト カードは表示されます + チップ欄を非表示 + チップ欄は表示されません + チップ欄は表示されます + コミュニティ投稿を非表示 + コミュニティ投稿は表示されません + コミュニティ投稿は表示されます + コンパクトなバナーを非表示 + コンパクトなバナーは表示されません + コンパクトなバナーは表示されます + 展開可能なカードを非表示 + 動画下の展開可能なカードは表示されません + 動画下の展開可能なカードは表示されます + 音声入力のフローティング ボタンを非表示 + 検索時の音声入力のフローティング ボタンは表示されません + 検索時の音声入力のフローティング ボタンは表示されます + 横スクロール欄を非表示 + "横スクロール欄は表示されません 例: ・ニュース速報 ・続きを見る @@ -257,1033 +256,1033 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が ・関連が強い ・ショッピング ・もう一度見る" - 横スクロール欄は表示されます - 画像欄を非表示 - 検索結果の画像欄は表示されません - 検索結果の画像欄は表示されます - 最新の投稿を非表示 - 最新の投稿は表示されません - 最新の投稿は表示されます - ミックスリストを非表示 - ミックスリストは表示されません - ミックスリストは表示されます - 映画セクションを非表示 - 映画セクションは表示されません - 映画セクションは表示されます - - 「通知を受け取る」ボタンを非表示 - 「通知を受け取る」ボタンは表示されません - 「通知を受け取る」ボタンは表示されます - ゲームルームを非表示 - ゲームルームは表示されません - ゲームルームは表示されます - - 「もっと見る」ボタンを非表示 - 「もっと見る」ボタンは検索結果に表示されません - 「もっと見る」ボタンは検索結果に表示されます - アンケートを非表示 - アンケートは表示されません - アンケートは表示されます - チケット欄を非表示 - チケット欄は表示されません - チケット欄は表示されます - - おすすめ動画のラベルを非表示 - 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されません - 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されます - 区切りのスペースを非表示 - コンポーネントを区切るためのスペースは表示されません - コンポーネントを区切るためのスペースが表示されます - - YouTube Doodle を非表示 - ロゴの YouTube Doodle アニメーションは表示されません - ロゴの YouTube Doodle アニメーションは表示されます - "YouTube Doodle は年に数日表示されます。 + 「もっと見る」ボタンを非表示 + 「もっと見る」ボタンは検索結果に表示されません + 「もっと見る」ボタンは検索結果に表示されます + アンケートを非表示 + アンケートは表示されません + アンケートは表示されます + チケット欄を非表示 + チケット欄は表示されません + チケット欄は表示されます + + おすすめ動画のラベルを非表示 + 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されません + 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されます + 区切りのスペースを非表示 + コンポーネントを区切るためのスペースは表示されません + コンポーネントを区切るためのスペースが表示されます + + YouTube Doodle を非表示 + ロゴの YouTube Doodle アニメーションは表示されません + ロゴの YouTube Doodle アニメーションは表示されます + "YouTube Doodle は年に数日表示されます。 あなたの地域で Doodle が表示されているときにこの設定をオンにすると、検索結果にフィルタバーが表示されなくなります。" - チャンネルバーを非表示 - チャンネルバーは表示されません - チャンネルバーは表示されます - チャンネルの透かしを非表示 - チャンネルの透かしは表示されません - チャンネルの透かしは表示されます - クラウドファンディング欄を非表示 - クラウドファンディング欄はプレーヤーと概要欄の間に表示されません - クラウドファンディング欄はプレーヤーと概要欄の間に表示されます - 緊急ボックスを非表示 - 緊急ボックスは表示されません - 緊急ボックスは表示されます - 情報パネルを非表示 - 情報パネルは表示されません - 情報パネルは表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - 医療情報パネルを非表示 - 医療情報パネルは表示されません - 医療情報パネルは表示されます - クイック アクションを非表示 - 全画面表示モードのクイック アクションは表示されません - 全画面表示モードのクイック アクションは表示されます - 関連動画を非表示 - クイック アクション内の関連動画 (その他の動画) は表示されません - クイック アクション内の関連動画 (その他の動画) は表示されます - チャンネル登録者のガイドラインを非表示 - チャンネル登録者のコミュニティ ガイドラインは表示されません - チャンネル登録者のコミュニティ ガイドラインは表示されます - Timed Reaction を非表示 - Timed reaction は表示されません\n\nライブ配信のチャット欄に常駐するハート マーク ボタンが非表示になります - Timed reaction は表示されます\n\nライブ配信のチャット欄にハート マーク ボタンが常駐します - 「AI 生成による動画の要約」を非表示 - 「AI 生成による動画の要約」セクションは表示されません - 「AI 生成による動画の要約」セクションは表示されます - 「質問する」を非表示 - 「質問する」セクションは表示されません - 「質問する」セクションは表示されます - 関連情報を非表示 - 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されません - 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されます - チャプターを非表示 - チャプター セクションは表示されません - チャプター セクションは表示されます - 「作成の裏側」を非表示 - 「作成の裏側」セクションは表示されません - 「作成の裏側」セクションは表示されます - ハイプポイントを非表示 - ハイプポイントは表示されません - ハイプポイントは表示されます - 「ポッドキャストを検索」を非表示 - 「ポッドキャストを検索」セクションは表示されません - 「ポッドキャストを検索」セクションは表示されます - おすすめリンクを非表示 - 情報カード セクション内のおすすめリンク セクションは表示されません - 情報カード セクション内のおすすめリンク セクションは表示されます - おすすめ動画を非表示 - 情報カード セクション内のおすすめ動画セクションは表示されません - 情報カード セクション内のおすすめ動画セクションは表示されます - 情報カードを非表示 - 情報カード セクションは表示されません - 情報カード セクションは表示されます - 「主な概念」を非表示 - 主な概念セクションは表示されません - 主な概念セクションが表示されます - チャンネル登録ボタンを非表示 - 情報カード セクション内のチャンネル登録ボタンは表示されません - 情報カード セクション内のチャンネル登録ボタンは表示されます - 文字起こしを非表示 - 文字起こしセクションは表示されません - 文字起こしセクションは表示されます - 概要欄 - 概要欄のコンポーネントを表示または非表示にします - フィルタバー - フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします - フィードで非表示 - フィードには表示されません - フィードには表示されます - 関連動画で非表示 - 関連動画には表示されません - 関連動画には表示されます - 検索結果で非表示 - 検索結果には表示されません - 検索結果には表示されます - 再生履歴で非表示 - 再生履歴には表示されません - 再生履歴には表示されます - チャンネル ページ - チャンネル ページのコンポーネントを表示または非表示にします - - コミュニティ ボタンを非表示 - コミュニティ ボタンは表示されません - コミュニティ ボタンは表示されます - - 「おすすめ」欄を非表示 - 「おすすめ」欄は表示されません - 「おすすめ」欄は表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - リンクのプレビューを非表示 - リンクのプレビューは表示されません - リンクのプレビューは表示されます - メンバー欄を非表示 - メンバー欄は表示されません - メンバー欄は表示されます - - ストアボタンを非表示 - ストアボタンは表示されません - ストアボタンは表示されます - - チャンネル登録ボタンを非表示 - チャンネル登録ボタンは表示されません - チャンネル登録ボタンは表示されます - コメント - コメント セクションのコンポーネントを表示または非表示にします - AI による「チャットの要約」を非表示 - AI による「チャットの要約」は表示されません - AI による「チャットの要約」は表示されます - AI によるコメントの要約を非表示 - AI によるコメントの要約は表示されません\n\nコメント欄のヘッダーにはトピックボタンは表示されません - AI によるコメントの要約は表示されます\n\nコメント欄のヘッダーにはトピックボタンが表示されます - チャンネルのガイドラインを非表示 - チャンネルのガイドラインは表示されません - チャンネルのガイドラインは表示されます - 「メンバーによるコメント」ヘッダーを非表示 - 「メンバーによるコメント」ヘッダーは表示されません - 「メンバーによるコメント」ヘッダーは表示されます - コメント セクションを非表示 - コメント セクションは表示されません - コメント セクションは表示されます - コミュニティ ガイドラインを非表示 - コミュニティ ガイドラインは表示されません - コミュニティ ガイドラインは表示されます - 「ショートを作成」ボタンを非表示 - 「ショートを作成」ボタンは表示されません - 「ショートを作成」ボタンは表示されます - 絵文字ボタンとタイムスタンプ ボタンを非表示 - 絵文字ボタンとタイムスタンプ ボタンは表示されません - 絵文字ボタンとタイムスタンプ ボタンは表示されます - コメントのプレビューを非表示 - コメントのプレビューは表示されません - コメントのプレビューは表示されます - Thanks ボタンを非表示 - Thanks ボタンは表示されません - Thanks ボタンは表示されます - 視聴回数を非表示 - 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されません - 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されます - - "制限事項: + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + 医療情報パネルを非表示 + 医療情報パネルは表示されません + 医療情報パネルは表示されます + クイック アクションを非表示 + 全画面表示モードのクイック アクションは表示されません + 全画面表示モードのクイック アクションは表示されます + 関連動画を非表示 + クイック アクション内の関連動画 (その他の動画) は表示されません + クイック アクション内の関連動画 (その他の動画) は表示されます + チャンネル登録者のガイドラインを非表示 + チャンネル登録者のコミュニティ ガイドラインは表示されません + チャンネル登録者のコミュニティ ガイドラインは表示されます + Timed Reaction を非表示 + Timed reaction は表示されません\n\nライブ配信のチャット欄に常駐するハート マーク ボタンが非表示になります + Timed reaction は表示されます\n\nライブ配信のチャット欄にハート マーク ボタンが常駐します + 「AI 生成による動画の要約」を非表示 + 「AI 生成による動画の要約」セクションは表示されません + 「AI 生成による動画の要約」セクションは表示されます + 「質問する」を非表示 + 「質問する」セクションは表示されません + 「質問する」セクションは表示されます + 関連情報を非表示 + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されません + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されます + チャプターを非表示 + チャプター セクションは表示されません + チャプター セクションは表示されます + 「作成の裏側」を非表示 + 「作成の裏側」セクションは表示されません + 「作成の裏側」セクションは表示されます + ハイプポイントを非表示 + ハイプポイントは表示されません + ハイプポイントは表示されます + 「ポッドキャストを検索」を非表示 + 「ポッドキャストを検索」セクションは表示されません + 「ポッドキャストを検索」セクションは表示されます + おすすめリンクを非表示 + 情報カード セクション内のおすすめリンク セクションは表示されません + 情報カード セクション内のおすすめリンク セクションは表示されます + おすすめ動画を非表示 + 情報カード セクション内のおすすめ動画セクションは表示されません + 情報カード セクション内のおすすめ動画セクションは表示されます + 情報カードを非表示 + 情報カード セクションは表示されません + 情報カード セクションは表示されます + 「主な概念」を非表示 + 主な概念セクションは表示されません + 主な概念セクションが表示されます + チャンネル登録ボタンを非表示 + 情報カード セクション内のチャンネル登録ボタンは表示されません + 情報カード セクション内のチャンネル登録ボタンは表示されます + 文字起こしを非表示 + 文字起こしセクションは表示されません + 文字起こしセクションは表示されます + 概要欄 + 概要欄のコンポーネントを表示または非表示にします + フィルタバー + フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします + フィードで非表示 + フィードには表示されません + フィードには表示されます + 関連動画で非表示 + 関連動画には表示されません + 関連動画には表示されます + 検索結果で非表示 + 検索結果には表示されません + 検索結果には表示されます + 再生履歴で非表示 + 再生履歴には表示されません + 再生履歴には表示されます + チャンネル ページ + チャンネル ページのコンポーネントを表示または非表示にします + + コミュニティ ボタンを非表示 + コミュニティ ボタンは表示されません + コミュニティ ボタンは表示されます + + 「おすすめ」欄を非表示 + 「おすすめ」欄は表示されません + 「おすすめ」欄は表示されます + + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + リンクのプレビューを非表示 + リンクのプレビューは表示されません + リンクのプレビューは表示されます + メンバー欄を非表示 + メンバー欄は表示されません + メンバー欄は表示されます + + ストアボタンを非表示 + ストアボタンは表示されません + ストアボタンは表示されます + + チャンネル登録ボタンを非表示 + チャンネル登録ボタンは表示されません + チャンネル登録ボタンは表示されます + コメント + コメント セクションのコンポーネントを表示または非表示にします + AI による「チャットの要約」を非表示 + AI による「チャットの要約」は表示されません + AI による「チャットの要約」は表示されます + AI によるコメントの要約を非表示 + AI によるコメントの要約は表示されません\n\nコメント欄のヘッダーにはトピックボタンは表示されません + AI によるコメントの要約は表示されます\n\nコメント欄のヘッダーにはトピックボタンが表示されます + チャンネルのガイドラインを非表示 + チャンネルのガイドラインは表示されません + チャンネルのガイドラインは表示されます + 「メンバーによるコメント」ヘッダーを非表示 + 「メンバーによるコメント」ヘッダーは表示されません + 「メンバーによるコメント」ヘッダーは表示されます + コメント セクションを非表示 + コメント セクションは表示されません + コメント セクションは表示されます + コミュニティ ガイドラインを非表示 + コミュニティ ガイドラインは表示されません + コミュニティ ガイドラインは表示されます + 「ショートを作成」ボタンを非表示 + 「ショートを作成」ボタンは表示されません + 「ショートを作成」ボタンは表示されます + 絵文字ボタンとタイムスタンプ ボタンを非表示 + 絵文字ボタンとタイムスタンプ ボタンは表示されません + 絵文字ボタンとタイムスタンプ ボタンは表示されます + コメントのプレビューを非表示 + コメントのプレビューは表示されません + コメントのプレビューは表示されます + Thanks ボタンを非表示 + Thanks ボタンは表示されません + Thanks ボタンは表示されます + 視聴回数を非表示 + 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されません + 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されます + + "制限事項: • ショート欄、チャンネル ページ、検索結果では、引き続き視聴回数が表示される場合がある • この機能は Automotive レイアウトでは動作しない" - 公開日時を非表示 - 公開日時はフィードおよび検索結果の動画のタイトル下に表示されません\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます - 公開日時はフィードおよび検索結果の動画のタイトル下に表示されます\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます - - "制限事項: + 公開日時を非表示 + 公開日時はフィードおよび検索結果の動画のタイトル下に表示されません\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます + 公開日時はフィードおよび検索結果の動画のタイトル下に表示されます\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます + + "制限事項: • ショート欄、チャンネル ページ、検索結果では、引き続き公開日時が表示される場合がある • この機能は Automotive レイアウトでは動作しない" - キーワードでコンテンツを非表示 - キーワード フィルタを使用してフィード、検索結果に表示される動画を除外します - ホームの動画をキーワードで非表示 - ホームタブの動画はキーワードでフィルタリングされます - ホームタブの動画はキーワードでフィルタリングされません - 検索結果をキーワードで非表示 - 検索結果はキーワードでフィルタリングされます - 検索結果はキーワードでフィルタリングされません - 登録チャンネルの動画をキーワードで非表示 - 登録チャンネルタブの動画はキーワードでフィルタリングされます - 登録チャンネルタブの動画はキーワードでフィルタリングされません - キーワード - - "除外するためのキーワードとなる単語やフレーズのリスト (改行区切り) + "除外するためのキーワードとなる単語やフレーズのリスト (改行区切り) キーワードには、除外したい動画のチャンネル名もしくはタイトルの一部を指定することができます 単語の途中に大文字が含まれる場合は、大文字のまま入力する必要があります (例: iPhone、TikTok、LeBlanc)" - キーワード フィルタリングについて - "ホーム / 登録チャンネル / 検索結果でキーワードに合致する動画を除外します + キーワード フィルタリングについて + "ホーム / 登録チャンネル / 検索結果でキーワードに合致する動画を除外します 制限事項 • ショート動画はチャンネル名の合致では除外できない • 一部の UI コンポーネントが残ってしまう場合がある • キーワードで検索したとき、結果が表示されない場合がある" - 単語全体で合致 - - キーワードを二重引用符で囲むことで、動画のタイトルやチャンネル名に含まれる単語の一部分とキーワードが合致しないようにできます<br><br>例えば、<br><b>\"ai\"</b>は、次の動画を除外します:<b>How does AI work?</b><br>しかし、次の動画は除外しません:<b>What does fair use mean?</b> - - 使用できないキーワード: %s - 二重引用符が必要なキーワード: %s - 矛盾する宣言があるキーワード: %s - 短すぎて引用符が必要なキーワード: %s - 全動画を除外するキーワード: %s - - - クリエイターのストア欄を非表示 - 動画プレーヤー下のクリエイターのストア欄は表示されません - 動画プレーヤー下のクリエイターのストア欄は表示されます - 終了画面のストアバナーを非表示 - 終了画面のストアバナーは表示されません - 終了画面のストアバナーは表示されます - 全画面広告を非表示 - "全画面広告は表示されません + 単語全体で合致 + + キーワードを二重引用符で囲むことで、動画のタイトルやチャンネル名に含まれる単語の一部分とキーワードが合致しないようにできます<br><br>例えば、<br><b>\"ai\"</b>は、次の動画を除外します:<b>How does AI work?</b><br>しかし、次の動画は除外しません:<b>What does fair use mean?</b> + + 使用できないキーワード: %s + 二重引用符が必要なキーワード: %s + 矛盾する宣言があるキーワード: %s + 短すぎて引用符が必要なキーワード: %s + 全動画を除外するキーワード: %s + + + クリエイターのストア欄を非表示 + 動画プレーヤー下のクリエイターのストア欄は表示されません + 動画プレーヤー下のクリエイターのストア欄は表示されます + 終了画面のストアバナーを非表示 + 終了画面のストアバナーは表示されません + 終了画面のストアバナーは表示されます + 全画面広告を非表示 + "全画面広告は表示されません この機能は、古いデバイスでのみ利用できます" - 全画面広告は表示されます - - 全画面広告の非表示は古いデバイス専用です - 一般的な広告を非表示 - 一般的な広告は表示されません - 一般的な広告は表示されます - 商品バナーを非表示 - 商品バナーは表示されません - 商品バナーは表示されます - 「プロモーションを含みます」ラベルを非表示 - 「プロモーションを含みます」ラベルは表示されません - 「プロモーションを含みます」ラベルは表示されます - 自己宣伝カードを非表示 - 自己宣伝カードは表示されません - 自己宣伝カードは表示されます - 商品へのリンクを非表示 - 動画の概要欄の商品へのリンクは表示されません - 動画の概要欄の商品へのリンクは表示されます - 「商品を表示」バナーを非表示 - 「商品を表示」バナーは動画オーバーレイに表示されません - 「商品を表示」バナーは動画オーバーレイに表示されます - ウェブ検索結果を非表示 - ウェブ検索結果は表示されません - ウェブ検索結果は表示されます - - - YouTube Premium の広告を非表示 - 動画プレーヤー下の YouTube Premium の広告は表示されません - 動画プレーヤー下の YouTube Premium の広告は表示されます - - - 動画広告を非表示 - 動画広告は表示されません - 動画広告は表示されます - - - URL をクリップボードにコピーしました - タイムスタンプ付きの URL がコピーされました - 「動画の URL をコピー」ボタンを表示 - 「動画のURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます - 「動画のURLをコピー」ボタンはプレーヤー オーバーレイに表示されません - 「タイムスタンプ付き URL をコピー」ボタンを表示 - 「タイムスタンプ付きURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップするとタイムスタンプ付きの動画の URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます - 「タイムスタンプ付きURLをコピー」ボタンはプレーヤー オーバーレイに表示されません - - - 「ご自身の責任」ダイアログを削除 - ダイアログは削除されます - ダイアログは表示されます - この機能によって年齢制限が回避される訳ではありません。自動的に承認するだけです。 - - - 「テレビでログイン」ポップアップを無効化 - 「テレビでログイン」ポップアップは無効です - 「テレビでログイン」ポップアップは有効です - - - ダブルタップ時のチャプター スキップを無効化 - ダブルタップしたときに、次または前のチャプターへスキップしてしまうことはありません - ダブルタップしたときに、たまに次または前のチャプターへスキップしてしまうことがあります - - - 外部ダウンロード - 外部ダウンローダーの設定 - 外部ダウンロード ボタンを表示 - 外部ダウンロード ボタンがプレーヤー オーバーレイに表示されます - 外部ダウンロード ボタンはプレーヤー オーバーレイに表示されません - - オフライン ボタンの動作を上書き - オフライン ボタンは外部ダウンローダーを呼び出します - オフライン ボタンはアプリ内のダウンローダーを呼び出します - 外部ダウンローダーのパッケージ名 - インストール済みの外部ダウンローダー アプリのパッケージ名 - パッケージ名を入力してください - その他 - アプリがインストールされていません - %s はインストールされていません。インストールしてください。 - "パッケージ名「%s」のインストール済みアプリが見つかりませんでした + 全画面広告は表示されます + + 全画面広告の非表示は古いデバイス専用です + 一般的な広告を非表示 + 一般的な広告は表示されません + 一般的な広告は表示されます + 商品バナーを非表示 + 商品バナーは表示されません + 商品バナーは表示されます + 「プロモーションを含みます」ラベルを非表示 + 「プロモーションを含みます」ラベルは表示されません + 「プロモーションを含みます」ラベルは表示されます + 自己宣伝カードを非表示 + 自己宣伝カードは表示されません + 自己宣伝カードは表示されます + 商品へのリンクを非表示 + 動画の概要欄の商品へのリンクは表示されません + 動画の概要欄の商品へのリンクは表示されます + 「商品を表示」バナーを非表示 + 「商品を表示」バナーは動画オーバーレイに表示されません + 「商品を表示」バナーは動画オーバーレイに表示されます + ウェブ検索結果を非表示 + ウェブ検索結果は表示されません + ウェブ検索結果は表示されます + + + YouTube Premium の広告を非表示 + 動画プレーヤー下の YouTube Premium の広告は表示されません + 動画プレーヤー下の YouTube Premium の広告は表示されます + + + 動画広告を非表示 + 動画広告は表示されません + 動画広告は表示されます + + + URL をクリップボードにコピーしました + タイムスタンプ付きの URL がコピーされました + 「動画の URL をコピー」ボタンを表示 + 「動画のURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます + 「動画のURLをコピー」ボタンはプレーヤー オーバーレイに表示されません + 「タイムスタンプ付き URL をコピー」ボタンを表示 + 「タイムスタンプ付きURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップするとタイムスタンプ付きの動画の URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます + 「タイムスタンプ付きURLをコピー」ボタンはプレーヤー オーバーレイに表示されません + + + 「ご自身の責任」ダイアログを削除 + ダイアログは削除されます + ダイアログは表示されます + この機能によって年齢制限が回避される訳ではありません。自動的に承認するだけです。 + + + 「テレビでログイン」ポップアップを無効化 + 「テレビでログイン」ポップアップは無効です + 「テレビでログイン」ポップアップは有効です + + + ダブルタップ時のチャプター スキップを無効化 + ダブルタップしたときに、次または前のチャプターへスキップしてしまうことはありません + ダブルタップしたときに、たまに次または前のチャプターへスキップしてしまうことがあります + + + 外部ダウンロード + 外部ダウンローダーの設定 + 外部ダウンロード ボタンを表示 + 外部ダウンロード ボタンがプレーヤー オーバーレイに表示されます + 外部ダウンロード ボタンはプレーヤー オーバーレイに表示されません + + オフライン ボタンの動作を上書き + オフライン ボタンは外部ダウンローダーを呼び出します + オフライン ボタンはアプリ内のダウンローダーを呼び出します + 外部ダウンローダーのパッケージ名 + インストール済みの外部ダウンローダー アプリのパッケージ名 + パッケージ名を入力してください + その他 + アプリがインストールされていません + %s はインストールされていません。インストールしてください。 + "パッケージ名「%s」のインストール済みアプリが見つかりませんでした パッケージ名が正しいこと、アプリがインストールされていることを確認してください" - パッケージ名は空欄にはできません - - - 精密シーク ジェスチャーを無効化 - 精密シーク ジェスチャーは無効です。シークバーを上へスワイプしても、「再生位置の細かい調整」モードにはなりません - 精密シーク ジェスチャーは有効です。シークバーを上へスワイプすると、「再生位置の細かい調整」モードになります - - - タップによるシークを有効化 - タップによるシークは有効です。シークバーをタップすると、タップした位置に移動します - タップによるシークは無効です。シークバーをタップしても、タップした位置に移動しません - - - 明るさジェスチャーを有効化 - "全画面表示モードの明るさジェスチャーは有効です + パッケージ名は空欄にはできません + + + 精密シーク ジェスチャーを無効化 + 精密シーク ジェスチャーは無効です。シークバーを上へスワイプしても、「再生位置の細かい調整」モードにはなりません + 精密シーク ジェスチャーは有効です。シークバーを上へスワイプすると、「再生位置の細かい調整」モードになります + + + タップによるシークを有効化 + タップによるシークは有効です。シークバーをタップすると、タップした位置に移動します + タップによるシークは無効です。シークバーをタップしても、タップした位置に移動しません + + + 明るさジェスチャーを有効化 + "全画面表示モードの明るさジェスチャーは有効です 画面左側を縦にスワイプして明るさを調節します" - 全画面表示モードの明るさジェスチャーは無効です - 音量ジェスチャーを有効化 - "全画面表示モードの音量ジェスチャーは有効です + 全画面表示モードの明るさジェスチャーは無効です + 音量ジェスチャーを有効化 + "全画面表示モードの音量ジェスチャーは有効です 画面右側を縦にスワイプして音量を調節します" - 全画面表示モードの音量ジェスチャーは無効です - 長押しスワイプ ジェスチャーを有効化 - 長押しスワイプは有効です\n\n明るさ / 音量ジェスチャーの開始には、画面の長押しが必要です - 長押しスワイプは無効です\n\n明るさ / 音量ジェスチャーの開始には、画面の長押しは必要ありません - 触覚フィードバックを有効化 - 触覚フィードバックは有効です - 触覚フィードバックは無効です - 明るさを保存 & 復元 - 全画面表示を終了 / 開始するときに明るさを保存 / 復元します - 全画面表示を終了 / 開始するときに明るさを保存 / 復元しません - 明るさジェスチャーの自動調節を有効化 - ジェスチャーで明るさを最小値まで下げると、明るさが自動で調節されます - ジェスチャーで明るさを最小値まで下げても、明るさは自動で調節されません - 自動 - オーバーレイの表示時間 - スワイプ オーバーレイが表示される時間 (ミリ秒) - オーバーレイの背景の透明度 - 透明度の範囲は 0-100 で、0 が透明です - スワイプ: 透明度の範囲は 0-100 です - オーバーレイの明るさグラフの色 - スワイプ中の明るさの現在値を視覚的に表示するグラフの色 - オーバーレイの音量グラフの色 - スワイプ中の音量の現在値を視覚的に表示するグラフの色 - オーバーレイのテキストサイズ - スワイプ オーバーレイのテキストサイズ (1-30) - テキストサイズの範囲は 1-30 です - スワイプのしきい値 - ジェスチャーと判定される最小のスワイプ距離 - 音量ジェスチャーのスワイプ感度 - スワイプによる音量の変化量 - オーバーレイのスタイル - 横型 - 横型(シンプル - 画面上部) - 横型(シンプル - 画面中央) - 円形 - 円形(シンプル) - 縦型 - 縦型(シンプル) - スワイプによる動画の切り替えを有効化 - 全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります - 全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません - - - 自動字幕表示を無効化 - 自動字幕表示は無効です\n\n字幕がオフの状態で動画を開きます - 自動字幕表示は有効です\n\n字幕がオンの状態で動画を開く場合があります - - - アクション ボタン - プレーヤー画面下のボタンを表示または非表示にします - 高評価とチャンネル登録のエフェクトを無効化 - 高評価ボタンとチャンネル登録ボタンのエフェクトは無効です - 高評価ボタンとチャンネル登録ボタンのエフェクトは有効です - 高評価ボタンと低評価ボタンを非表示 - 高評価ボタンと低評価ボタンは表示されません - 高評価ボタンと低評価ボタンは表示されます - - 共有ボタンを非表示 - 共有ボタンは表示されません - 共有ボタンは表示されます - - 「広告の停止」ボタンを非表示 - 「広告の停止」ボタンは表示されません - 「広告の停止」ボタンは表示されます - - コメントボタンを非表示 - コメントボタンは表示されません - コメントボタンは表示されます - + + 自動字幕表示を無効化 + 自動字幕表示は無効です\n\n字幕がオフの状態で動画を開きます + 自動字幕表示は有効です\n\n字幕がオンの状態で動画を開く場合があります + + + アクション ボタン + プレーヤー画面下のボタンを表示または非表示にします + 高評価とチャンネル登録のエフェクトを無効化 + 高評価ボタンとチャンネル登録ボタンのエフェクトは無効です + 高評価ボタンとチャンネル登録ボタンのエフェクトは有効です + 高評価ボタンと低評価ボタンを非表示 + 高評価ボタンと低評価ボタンは表示されません + 高評価ボタンと低評価ボタンは表示されます + + 共有ボタンを非表示 + 共有ボタンは表示されません + 共有ボタンは表示されます + + 「広告の停止」ボタンを非表示 + 「広告の停止」ボタンは表示されません + 「広告の停止」ボタンは表示されます + + コメントボタンを非表示 + コメントボタンは表示されません + コメントボタンは表示されます + - 報告ボタンを非表示 - 報告ボタンは表示されません - 報告ボタンは表示されます - - リミックス ボタンを非表示 - リミックス ボタンは表示されません - リミックス ボタンは表示されます - - オフライン ボタンを非表示 - オフライン ボタンは表示されません - オフライン ボタンは表示されます - + リミックス ボタンを非表示 + リミックス ボタンは表示されません + リミックス ボタンは表示されます + + オフライン ボタンを非表示 + オフライン ボタンは表示されません + オフライン ボタンは表示されます + - ハイプボタンを非表示 - ハイプボタンは表示されません - ハイプボタンは表示されます - - プロモーション ボタンを非表示 - プロモーション ボタンは表示されません - プロモーション ボタンは表示されます - - Thanks ボタンを非表示 - Thanks ボタンは表示されません - Thanks ボタンは表示されます - + プロモーション ボタンを非表示 + プロモーション ボタンは表示されません + プロモーション ボタンは表示されます + + Thanks ボタンを非表示 + Thanks ボタンは表示されません + Thanks ボタンは表示されます + - 「質問する」ボタンを非表示 - 「質問する」ボタンは表示されません - 「質問する」ボタンは表示されます - - クリップボタンを非表示 - クリップボタンは表示されません - クリップボタンは表示されます - - 購入ボタンを非表示 - 購入ボタンは表示されません - 購入ボタンは表示されます - - 保存ボタンを非表示 - 保存ボタンは表示されません - 保存ボタンは表示されます - - - ナビゲーション ボタン - ナビゲーション バーのボタンを変更または非表示にします - - 「ホーム」を非表示 - ホームボタンは表示されません - ホームボタンは表示されます - - 「ショート」を非表示 - ショートボタンは表示されません - ショートボタンは表示されます - - 「作成」を非表示 - 作成ボタンは表示されません - 作成ボタンは表示されます - - 「登録チャンネル」を非表示 - 登録チャンネル ボタンは表示されません - 登録チャンネル ボタンは表示されます - 「通知」を非表示 - 通知ボタンは表示されません - 通知ボタンは表示されます - - 「作成」と「通知」を入れ替え - "作成ボタンと通知ボタンが入れ替わります + 「質問する」ボタンを非表示 + 「質問する」ボタンは表示されません + 「質問する」ボタンは表示されます + + クリップボタンを非表示 + クリップボタンは表示されません + クリップボタンは表示されます + + 購入ボタンを非表示 + 購入ボタンは表示されません + 購入ボタンは表示されます + + 保存ボタンを非表示 + 保存ボタンは表示されません + 保存ボタンは表示されます + + + ナビゲーション ボタン + ナビゲーション バーのボタンを変更または非表示にします + + 「ホーム」を非表示 + ホームボタンは表示されません + ホームボタンは表示されます + + 「ショート」を非表示 + ショートボタンは表示されません + ショートボタンは表示されます + + 「作成」を非表示 + 作成ボタンは表示されません + 作成ボタンは表示されます + + 「登録チャンネル」を非表示 + 登録チャンネル ボタンは表示されません + 登録チャンネル ボタンは表示されます + 「通知」を非表示 + 通知ボタンは表示されません + 通知ボタンは表示されます + + 「作成」と「通知」を入れ替え + "作成ボタンと通知ボタンが入れ替わります 注: この設定を有効にすることにより、動画広告も強制的に非表示になります" - 作成ボタンと通知ボタンは入れ替わりません - "この設定を無効にすると、ショート動画の広告ブロックも無効になります。 + 作成ボタンと通知ボタンは入れ替わりません + "この設定を無効にすると、ショート動画の広告ブロックも無効になります。 この設定を変更しても効果がない場合は、シークレット モードに切り替えてみてください。" - ボタンをアイコンのみで表示 - ナビゲーション ボタンはアイコンのみで表示されます - ナビゲーション ボタンはアイコンと文字で表示されます - 半透明ステータスバーを無効化 - ステータスバーは常に透けません - ステータスバーは状況に応じて透けます - 一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう場合があります。 - ライトモードの半透明バーを無効化 - ライトモードではナビゲーション バーは透けません - ライトモードではナビゲーション バーが状況に応じて透けます - ダークモードの半透明バーを無効化 - ダークモードではナビゲーション バーは透けません - ダークモードではナビゲーション バーが状況に応じて透けます - - - フライアウト メニュー - プレーヤー オーバーレイの歯車アイコンボタンから呼び出されるフライアウト メニューの項目を表示または非表示にします - - 「字幕」を非表示 - 「字幕」は表示されません - 「字幕」は表示されます - - 「その他の設定」を非表示 - 「その他の設定」は表示されません - 「その他の設定」は表示されます - - 「スリープ タイマー」を非表示 - 「スリープ タイマー」は表示されません - 「スリープ タイマー」は表示されます - - 「動画のループ再生」を非表示 - 「動画のループ再生」は表示されません - 「動画のループ再生」は表示されます - - 「アンビエント モード」を非表示 - 「アンビエント モード」は表示されません - 「アンビエント モード」は表示されます - 「一定音量」を非表示 - 「一定音量」は表示されます - 「一定音量」は表示されません - - 「ヘルプとフィードバック」を非表示 - 「ヘルプとフィードバック」は表示されません - 「ヘルプとフィードバック」は表示されます - - 「再生速度」を非表示 - 「再生速度」は表示されません - 「再生速度」は表示されます - - 「画面のロック」を非表示 - 「画面のロック」は表示されません - 「画面のロック」は表示されます - - 「YouTube Music で聴く」を非表示 - 「YouTube Music で聴く」は表示されません - 「YouTube Music で聴く」は表示されます - - 「音声トラック」を非表示 - 「音声トラック」は表示されません - 「音声トラック」は表示されます - + + フライアウト メニュー + プレーヤー オーバーレイの歯車アイコンボタンから呼び出されるフライアウト メニューの項目を表示または非表示にします + + 「字幕」を非表示 + 「字幕」は表示されません + 「字幕」は表示されます + + 「その他の設定」を非表示 + 「その他の設定」は表示されません + 「その他の設定」は表示されます + + 「スリープ タイマー」を非表示 + 「スリープ タイマー」は表示されません + 「スリープ タイマー」は表示されます + + 「動画のループ再生」を非表示 + 「動画のループ再生」は表示されません + 「動画のループ再生」は表示されます + + 「アンビエント モード」を非表示 + 「アンビエント モード」は表示されません + 「アンビエント モード」は表示されます + 「一定音量」を非表示 + 「一定音量」は表示されます + 「一定音量」は表示されません + + 「ヘルプとフィードバック」を非表示 + 「ヘルプとフィードバック」は表示されません + 「ヘルプとフィードバック」は表示されます + + 「再生速度」を非表示 + 「再生速度」は表示されません + 「再生速度」は表示されます + + 「画面のロック」を非表示 + 「画面のロック」は表示されません + 「画面のロック」は表示されます + + 「YouTube Music で聴く」を非表示 + 「YouTube Music で聴く」は表示されません + 「YouTube Music で聴く」は表示されます + + 「音声トラック」を非表示 + 「音声トラック」は表示されません + 「音声トラック」は表示されます + - "「音声トラック」は表示されません + "「音声トラック」は表示されません 「音声トラック」を表示するには、[動画ストリームを偽装] を「Android No SDK」に変更してください" - - 「VR で見る」を非表示 - 「VR で見る」は表示されません - 「VR で見る」は表示されます - 「画質」を非表示 - 「画質」は表示されません - 「画質」は表示されます - 画質メニューの脚注を非表示 - 画質メニューの脚注は表示されません - 画質メニューの脚注は表示されます - - - 自動再生ボタンを非表示 - 自動再生ボタンはプレーヤー オーバーレイに表示されません - 自動再生ボタンはプレーヤー オーバーレイに表示されます - - 字幕ボタンを非表示 - 字幕ボタンはプレーヤー オーバーレイに表示されません - 字幕ボタンはプレーヤー オーバーレイに表示されます - キャストボタンを非表示 - キャストボタンはプレーヤー オーバーレイに表示されません - キャストボタンはプレーヤー オーバーレイに表示されます - プレーヤー コントロールの背景を非表示 - プレーヤー コントロールの背景は表示されません - プレーヤー コントロールの背景は表示されます - 前の動画ボタンと次の動画ボタンを非表示 - 前の動画ボタンと次の動画ボタンは表示されません - 前の動画ボタンと次の動画ボタンは表示されます - - - 終了画面カードを非表示 - 終了画面カードは表示されません - 終了画面カードは表示されます - - - 全画面表示中のアンビエント モードを無効化 - 全画面表示中のアンビエント モードは無効です - 全画面表示中のアンビエント モードは有効です - - - 情報カードを非表示 - 情報カードはプレーヤー画面に表示されません - 情報カードはプレーヤー画面に表示されます - - - 数字の回転アニメーションを無効化 - 数字の回転アニメーションは無効です - 数字の回転アニメーションは有効です - - - プレーヤーのシークバーを非表示 - 動画プレーヤーのシークバーは表示されません - 動画プレーヤーのシークバーは表示されます - - サムネイルのシークバーを非表示 - フィードや再生履歴などの動画のサムネイルのシークバーは表示されません - フィードや再生履歴などの動画のサムネイルのシークバーは表示されます - - - ショート プレーヤー - ショート プレーヤーのコンポーネントを表示または非表示にします - - ホームフィードでショートを非表示 - ホームフィードおよび関連動画にはショート動画は表示されません - ホームフィードおよび関連動画にはショート動画が表示されます - 検索結果でショートを非表示 - 検索結果にはショート動画は表示されません - 検索結果にはショート動画が表示されます - - 登録チャンネル フィードでショートを非表示 - 登録チャンネル フィードにはショート動画は表示されません - 登録チャンネル フィードにはショート動画が表示されます - 再生履歴でショートを非表示 - 再生履歴にはショート動画は表示されません - 再生履歴にはショート動画が表示されます - 「吹替版」ラベルを非表示 - 「吹替版」ラベルは表示されません - 「吹替版」ラベルは表示されます - 「Super Thanks を購入する」ボタンを非表示 - 「Super Thanks を購入する」ボタンは表示されません - 「Super Thanks を購入する」ボタンは表示されます - 効果ボタンを非表示 - 効果ボタンは表示されません - 効果ボタンは表示されます - グリーン スクリーン ボタンを非表示 - グリーン スクリーン ボタンは表示されません - グリーン スクリーン ボタンは表示されます - ハッシュタグ ボタンを非表示 - ハッシュタグ ボタンは表示されません - ハッシュタグ ボタンは表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - ライブ プレビューを非表示 - ライブ プレビューは表示されません - ライブ プレビューは表示されます - 位置情報ラベルを非表示 - 位置情報ラベルは表示されません - 位置情報ラベルは表示されます - 「新しい投稿」ボタンを非表示 - 「新しい投稿」ボタンは表示されません - 「新しい投稿」ボタンは表示されます - 一時停止オーバーレイのボタンを非表示 - 一時停止オーバーレイのボタンは表示されません - 一時停止オーバーレイのボタンは表示されます - コメントのプレビューを非表示 - コメントのプレビューは表示されません - コメントのプレビューは表示されます - 「音楽を保存」ボタンを非表示 - 「音楽を保存」ボタンは表示されません - 「音楽を保存」ボタンは表示されます - 検索候補を非表示 - 検索候補は表示されません - 検索候補は表示されます - 購入ボタンを非表示 - 購入ボタンは表示されません - 購入ボタンは表示されます - ステッカーを非表示 - ステッカーは表示されません - ステッカーは表示されます - チャンネル登録ボタンを非表示 - チャンネル登録ボタンは表示されません - チャンネル登録ボタンは表示されます - タグ付けされた商品を非表示 - タグ付けされた商品は表示されません - タグ付けされた商品は表示されます - 今後の動画ボタンを非表示 - 今後の動画ボタンは表示されません - 今後の動画ボタンは表示されます - 「このサウンドを使用する」ボタンを非表示 - 「このサウンドを使用する」ボタンは表示されません - 「このサウンドを使用する」ボタンは表示されます - 「このテンプレートを使用する」ボタンを非表示 - 「このテンプレートを使用する」ボタンは表示されません - 「このテンプレートを使用する」ボタンは表示されます - 高評価ボタンの噴水アニメーションを非表示 - 高評価ボタンの噴水アニメーションは表示されません - 高評価ボタンの噴水アニメーションは表示されます - 高評価ボタンを非表示 - 高評価ボタンは表示されません - 高評価ボタンは表示されます - 低評価ボタンを非表示 - 低評価ボタンは表示されません - 低評価ボタンは表示されます - コメントボタンを非表示 - コメントボタンは表示されません - コメントボタンは表示されます - - 共有ボタンを非表示 - 共有ボタンは表示されません - 共有ボタンは表示されます - - リミックス ボタンを非表示 - リミックス ボタンは表示されません - リミックス ボタンは表示されます - サウンドボタンを非表示 - サウンドボタンは表示されません - サウンドボタンは表示されます - 情報パネルを非表示 - 情報パネルは表示されません - 情報パネルは表示されます - チャンネルバーを非表示 - チャンネルバーは表示されません - チャンネルバーは表示されます - 動画のタイトルを非表示 - 動画のタイトルは表示されません - 動画のタイトルは表示されます - サウンド メタデータ ラベルを非表示 - サウンド メタデータ ラベルは表示されません - サウンド メタデータ ラベルは表示されます - 関連動画へのリンクを非表示 - 関連動画へのリンクは表示されません - 関連動画へのリンクは表示されます - ナビゲーション バーを非表示 - ナビゲーション バーは表示されません - ナビゲーション バーは表示されます - - - 終了画面の「関連動画」を非表示 - "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます + + 「VR で見る」を非表示 + 「VR で見る」は表示されません + 「VR で見る」は表示されます + 「画質」を非表示 + 「画質」は表示されません + 「画質」は表示されます + 画質メニューの脚注を非表示 + 画質メニューの脚注は表示されません + 画質メニューの脚注は表示されます + + + 自動再生ボタンを非表示 + 自動再生ボタンはプレーヤー オーバーレイに表示されません + 自動再生ボタンはプレーヤー オーバーレイに表示されます + + 字幕ボタンを非表示 + 字幕ボタンはプレーヤー オーバーレイに表示されません + 字幕ボタンはプレーヤー オーバーレイに表示されます + キャストボタンを非表示 + キャストボタンはプレーヤー オーバーレイに表示されません + キャストボタンはプレーヤー オーバーレイに表示されます + プレーヤー コントロールの背景を非表示 + プレーヤー コントロールの背景は表示されません + プレーヤー コントロールの背景は表示されます + 前の動画ボタンと次の動画ボタンを非表示 + 前の動画ボタンと次の動画ボタンは表示されません + 前の動画ボタンと次の動画ボタンは表示されます + + + 終了画面カードを非表示 + 終了画面カードは表示されません + 終了画面カードは表示されます + + + 全画面表示中のアンビエント モードを無効化 + 全画面表示中のアンビエント モードは無効です + 全画面表示中のアンビエント モードは有効です + + + 情報カードを非表示 + 情報カードはプレーヤー画面に表示されません + 情報カードはプレーヤー画面に表示されます + + + 数字の回転アニメーションを無効化 + 数字の回転アニメーションは無効です + 数字の回転アニメーションは有効です + + + プレーヤーのシークバーを非表示 + 動画プレーヤーのシークバーは表示されません + 動画プレーヤーのシークバーは表示されます + + サムネイルのシークバーを非表示 + フィードや再生履歴などの動画のサムネイルのシークバーは表示されません + フィードや再生履歴などの動画のサムネイルのシークバーは表示されます + + + ショート プレーヤー + ショート プレーヤーのコンポーネントを表示または非表示にします + + ホームフィードでショートを非表示 + ホームフィードおよび関連動画にはショート動画は表示されません + ホームフィードおよび関連動画にはショート動画が表示されます + 検索結果でショートを非表示 + 検索結果にはショート動画は表示されません + 検索結果にはショート動画が表示されます + + 登録チャンネル フィードでショートを非表示 + 登録チャンネル フィードにはショート動画は表示されません + 登録チャンネル フィードにはショート動画が表示されます + 再生履歴でショートを非表示 + 再生履歴にはショート動画は表示されません + 再生履歴にはショート動画が表示されます + 「吹替版」ラベルを非表示 + 「吹替版」ラベルは表示されません + 「吹替版」ラベルは表示されます + 「Super Thanks を購入する」ボタンを非表示 + 「Super Thanks を購入する」ボタンは表示されません + 「Super Thanks を購入する」ボタンは表示されます + 効果ボタンを非表示 + 効果ボタンは表示されません + 効果ボタンは表示されます + グリーン スクリーン ボタンを非表示 + グリーン スクリーン ボタンは表示されません + グリーン スクリーン ボタンは表示されます + ハッシュタグ ボタンを非表示 + ハッシュタグ ボタンは表示されません + ハッシュタグ ボタンは表示されます + + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + ライブ プレビューを非表示 + ライブ プレビューは表示されません + ライブ プレビューは表示されます + 位置情報ラベルを非表示 + 位置情報ラベルは表示されません + 位置情報ラベルは表示されます + 「新しい投稿」ボタンを非表示 + 「新しい投稿」ボタンは表示されません + 「新しい投稿」ボタンは表示されます + 一時停止オーバーレイのボタンを非表示 + 一時停止オーバーレイのボタンは表示されません + 一時停止オーバーレイのボタンは表示されます + コメントのプレビューを非表示 + コメントのプレビューは表示されません + コメントのプレビューは表示されます + 「音楽を保存」ボタンを非表示 + 「音楽を保存」ボタンは表示されません + 「音楽を保存」ボタンは表示されます + 検索候補を非表示 + 検索候補は表示されません + 検索候補は表示されます + 購入ボタンを非表示 + 購入ボタンは表示されません + 購入ボタンは表示されます + ステッカーを非表示 + ステッカーは表示されません + ステッカーは表示されます + チャンネル登録ボタンを非表示 + チャンネル登録ボタンは表示されません + チャンネル登録ボタンは表示されます + タグ付けされた商品を非表示 + タグ付けされた商品は表示されません + タグ付けされた商品は表示されます + 今後の動画ボタンを非表示 + 今後の動画ボタンは表示されません + 今後の動画ボタンは表示されます + 「このサウンドを使用する」ボタンを非表示 + 「このサウンドを使用する」ボタンは表示されません + 「このサウンドを使用する」ボタンは表示されます + 「このテンプレートを使用する」ボタンを非表示 + 「このテンプレートを使用する」ボタンは表示されません + 「このテンプレートを使用する」ボタンは表示されます + 高評価ボタンの噴水アニメーションを非表示 + 高評価ボタンの噴水アニメーションは表示されません + 高評価ボタンの噴水アニメーションは表示されます + 高評価ボタンを非表示 + 高評価ボタンは表示されません + 高評価ボタンは表示されます + 低評価ボタンを非表示 + 低評価ボタンは表示されません + 低評価ボタンは表示されます + コメントボタンを非表示 + コメントボタンは表示されません + コメントボタンは表示されます + + 共有ボタンを非表示 + 共有ボタンは表示されません + 共有ボタンは表示されます + + リミックス ボタンを非表示 + リミックス ボタンは表示されません + リミックス ボタンは表示されます + サウンドボタンを非表示 + サウンドボタンは表示されません + サウンドボタンは表示されます + 情報パネルを非表示 + 情報パネルは表示されません + 情報パネルは表示されます + チャンネルバーを非表示 + チャンネルバーは表示されません + チャンネルバーは表示されます + 動画のタイトルを非表示 + 動画のタイトルは表示されません + 動画のタイトルは表示されます + サウンド メタデータ ラベルを非表示 + サウンド メタデータ ラベルは表示されません + サウンド メタデータ ラベルは表示されます + 関連動画へのリンクを非表示 + 関連動画へのリンクは表示されません + 関連動画へのリンクは表示されます + ナビゲーション バーを非表示 + ナビゲーション バーは表示されません + ナビゲーション バーは表示されます + + + 終了画面の「関連動画」を非表示 + "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます 自動再生の設定は YouTube の設定で変更できます: [設定] > [再生] > [次の動画を自動再生]" - 終了画面の「関連動画」は表示されます - - - 関連動画オーバーレイを非表示 - 全画面表示モードの関連動画オーバーレイは表示されません - 全画面表示モードの関連動画オーバーレイは表示されます - - - 動画のタイムスタンプを非表示 - 動画の現在位置を示すタイムスタンプは表示されません - 動画の現在位置を示すタイムスタンプは表示されます - - - プレーヤー ポップアップ パネルを非表示 - プレーヤー ポップアップ パネルは表示されません\n\nプレイリストやライブ配信のチャット欄などを閉じた状態で動画を開きます - プレーヤー ポップアップ パネルは表示されます\n\nプレイリストやライブ配信のチャット欄などを展開した状態で動画を開きます - - - 再生終了時に全画面表示を解除 - 無効 - 縦画面 - 横画面 - 縦画面 & 横画面 - - - 縦画面の全画面表示で動画を開く - 縦画面の全画面表示で動画を開きます - 通常表示で動画を開きます - - - プレーヤー オーバーレイの透明度 - 透明度の範囲は 0-100 で、0 が透明です - プレーヤー: 透明度の範囲は 0-100 です - - - - 低評価数表示は一時的に利用できません (API タイムアウト) - 低評価数表示は利用できません (status %d) - 低評価数表示は利用できません (API のレート制限) - 低評価数表示は利用できません (%s) - - Return YouTube Dislike: 投票するには、再読み込みが必要です - - 非公開 - Return YouTube Dislike - 低評価数は表示されます - 低評価数は表示されません - ショート動画の低評価数を表示 - "ショート動画の低評価数は表示されます + 終了画面の「関連動画」は表示されます + + + 関連動画オーバーレイを非表示 + 全画面表示モードの関連動画オーバーレイは表示されません + 全画面表示モードの関連動画オーバーレイは表示されます + + + 動画のタイムスタンプを非表示 + 動画の現在位置を示すタイムスタンプは表示されません + 動画の現在位置を示すタイムスタンプは表示されます + + + プレーヤー ポップアップ パネルを非表示 + プレーヤー ポップアップ パネルは表示されません\n\nプレイリストやライブ配信のチャット欄などを閉じた状態で動画を開きます + プレーヤー ポップアップ パネルは表示されます\n\nプレイリストやライブ配信のチャット欄などを展開した状態で動画を開きます + + + 再生終了時に全画面表示を解除 + 無効 + 縦画面 + 横画面 + 縦画面 & 横画面 + + + 縦画面の全画面表示で動画を開く + 縦画面の全画面表示で動画を開きます + 通常表示で動画を開きます + + + プレーヤー オーバーレイの透明度 + 透明度の範囲は 0-100 で、0 が透明です + プレーヤー: 透明度の範囲は 0-100 です + + + + 低評価数表示は一時的に利用できません (API タイムアウト) + 低評価数表示は利用できません (status %d) + 低評価数表示は利用できません (API のレート制限) + 低評価数表示は利用できません (%s) + + Return YouTube Dislike: 投票するには、再読み込みが必要です + + 非公開 + Return YouTube Dislike + 低評価数は表示されます + 低評価数は表示されません + ショート動画の低評価数を表示 + "ショート動画の低評価数は表示されます 制限事項: シークレット モードでは低評価数が表示されない場合があります" - ショート動画の低評価数は表示されません - 低評価をパーセントで表示 - 低評価はパーセントで表示されます - 低評価は投票数で表示されます - - コンパクトな高評価ボタン - コンパクトな横幅の高評価ボタンが表示されます - 通常の高評価ボタンが表示されます - 高評価の推定値を表示 - 高評価数が非公開の動画には推定値が表示されます - 高評価の推定値は表示されません - API 利用不可時にトーストを表示 - Return YouTube Dislike が利用できない場合にトースト通知が表示されます - Return YouTube Dislike が利用できない場合にトースト通知は表示されません - ReturnYouTubeDislike.com - データは Return YouTube Dislike API によって提供されています。詳細は、ここをタップしてください - - このデバイスの ReturnYouTubeDislike API 統計情報 - API の応答時間 (平均) - API の応答時間 (最小) - API の応答時間 (最大) - API の応答時間 (直近) - 低評価数表示は一時的に利用できません。クライアント API のレート制限が原因です - API の投票数取得 (呼び出し回数) - ネットワーク呼び出しは実行されていません - %d 回のネットワーク呼び出しが実行されました - API の投票数取得 (タイムアウト回数) - ネットワーク呼び出しはタイムアウトしていません - %d 回のネットワーク呼び出しがタイムアウトしました - API クライアントのレート制限 - クライアントのレート制限には遭遇していません - クライアントのレート制限に %d 回遭遇しました - %d ミリ秒 - - - ワイド検索バーを有効化 - ワイド検索バーは有効です - ワイド検索バーは無効です - - - 高画質サムネイルを有効化 - シークバー サムネイルは高画質です - シークバー サムネイルは中画質です - プレーヤー画面全体表示のシークバー サムネイルは高画質です - プレーヤー画面全体表示のシークバー サムネイルは中画質です - "この機能を有効にすると、シークバー サムネイルを保持していないライブ配信でもシークバー サムネイルが表示されるようになります。 + ショート動画の低評価数は表示されません + 低評価をパーセントで表示 + 低評価はパーセントで表示されます + 低評価は投票数で表示されます + + コンパクトな高評価ボタン + コンパクトな横幅の高評価ボタンが表示されます + 通常の高評価ボタンが表示されます + 高評価の推定値を表示 + 高評価数が非公開の動画には推定値が表示されます + 高評価の推定値は表示されません + API 利用不可時にトーストを表示 + Return YouTube Dislike が利用できない場合にトースト通知が表示されます + Return YouTube Dislike が利用できない場合にトースト通知は表示されません + ReturnYouTubeDislike.com + データは Return YouTube Dislike API によって提供されています。詳細は、ここをタップしてください + + このデバイスの ReturnYouTubeDislike API 統計情報 + API の応答時間 (平均) + API の応答時間 (最小) + API の応答時間 (最大) + API の応答時間 (直近) + 低評価数表示は一時的に利用できません。クライアント API のレート制限が原因です + API の投票数取得 (呼び出し回数) + ネットワーク呼び出しは実行されていません + %d 回のネットワーク呼び出しが実行されました + API の投票数取得 (タイムアウト回数) + ネットワーク呼び出しはタイムアウトしていません + %d 回のネットワーク呼び出しがタイムアウトしました + API クライアントのレート制限 + クライアントのレート制限には遭遇していません + クライアントのレート制限に %d 回遭遇しました + %d ミリ秒 + + + ワイド検索バーを有効化 + ワイド検索バーは有効です + ワイド検索バーは無効です + + + 高画質サムネイルを有効化 + シークバー サムネイルは高画質です + シークバー サムネイルは中画質です + プレーヤー画面全体表示のシークバー サムネイルは高画質です + プレーヤー画面全体表示のシークバー サムネイルは中画質です + "この機能を有効にすると、シークバー サムネイルを保持していないライブ配信でもシークバー サムネイルが表示されるようになります。 シークバー サムネイルは、再生中の動画と同じ画質になります。 この機能は、非常に高速なインターネット接続を使用して 720P 以下の画質で動画を視聴する場合に最適です。" - 古いシークバー サムネイルを復元 - シーク中のサムネイルはシークバーの上に表示されます - シーク中のサムネイルはプレーヤー画面全体に表示されます - - - SponsorBlock - SponsorBlock を有効化 - SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です - 外観 - 投票ボタンを表示 - セグメントへの投票ボタンがプレーヤー オーバーレイに表示されます - セグメントへの投票ボタンはプレーヤー オーバーレイに表示されません - ボタンとコントロールを直角化 - ボタンとコントロールの角は直角です - ボタンとコントロールの角は丸角です - - コンパクトなスキップボタンを使用 - コンパクトなスキップボタンが表示されます - 通常のスキップボタンが表示されます - スキップボタンを自動的に非表示 - スキップボタンは、表示された数秒後に自動的に非表示になります - スキップボタンは、セグメントの開始から終了まで表示されます - スキップボタンの表示時間 - 「ハイライトまでスキップ」ボタンと「スキップボタンを自動的に非表示」がオンのときのその他のスキップボタンが、自動的に非表示になるまでの時間の長さ - 自動スキップ時にトーストを表示 - セグメントが自動的にスキップされたときにトースト通知が表示されます。このトースト通知をタップすると、スキップを取り消すことができます - セグメントが自動的にスキップされたときにトースト通知は表示されません。このトースト通知をタップすると、スキップを取り消すことができます - スキップ トーストの表示時間 - セグメントが自動的にスキップされたときに表示されるトースト通知が、自動的に非表示になるまでの時間の長さ - 1 秒 - 2 秒 - 3 秒 - 4 秒 - 5 秒 - 6 秒 - 7 秒 - 8 秒 - 9 秒 - 10 秒 - セグメントを除いた再生時間を表示 - すべてのセグメントを除いた再生時間がシークバーに表示されます - 動画全体の再生時間のみがシークバーに表示されます - 新しいセグメントの作成 - セグメント作成ボタンを表示 - セグメント作成ボタンがプレーヤー オーバーレイに表示されます - セグメント作成ボタンはプレーヤー オーバーレイに表示されません - セグメントの位置調整幅 - セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒) - 値は正の整数でなければなりません - ガイドラインを見る - ガイドラインには、新しいセグメントを作成するためのルールやヒントが記載されています - ガイドラインに従ってください - 新しいセグメントを作成する前に SponsorBlock のガイドラインを確認してください - 既読 - 表示する - その他 - API 利用不可時にトーストを表示 - SponsorBlock が利用できない場合にトースト通知が表示されます - SponsorBlock が利用できない場合にトースト通知は表示されません - スキップデータの収集を有効化 - SponsorBlock リーダーボード にスキップによって節約した時間を送信します。セグメントをスキップする度にデータが送信されます - スキップデータの収集は無効です - セグメントの長さのしきい値 - この値 (秒) よりも短い時間のセグメントは、スキップもプレーヤーに表示もされません - 時間 (長さ) の値が無効です - 非公開ユーザー ID - この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます - 非公開ユーザー ID は 30 文字以上必要です - API URL を変更 - SponsorBlock がサーバーとの通信で使用するアドレス - API URL をリセットしました - API URL が無効です - API URL を変更しました - 設定のインポート / エクスポート - コピー - SponsorBlock の設定を JSON 形式のテキストでインポート / エクスポートします。この JSON テキストは他のプラットフォームでも利用可能です - SponsorBlock の設定を他のプラットフォームでも利用可能な JSON 形式のテキストでインポート / エクスポートします。この JSON テキストには非公開ユーザー ID が含まれています。このテキストを共有する際は十分注意してください - 設定のインポートに成功しました - インポートに失敗しました: %s - エクスポートに失敗しました: %s - "あなたの設定テキストには、SponsorBlock の非公開ユーザー ID が含まれています。 + 古いシークバー サムネイルを復元 + シーク中のサムネイルはシークバーの上に表示されます + シーク中のサムネイルはプレーヤー画面全体に表示されます + + + SponsorBlock + SponsorBlock を有効化 + SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です + 外観 + 投票ボタンを表示 + セグメントへの投票ボタンがプレーヤー オーバーレイに表示されます + セグメントへの投票ボタンはプレーヤー オーバーレイに表示されません + ボタンとコントロールを直角化 + ボタンとコントロールの角は直角です + ボタンとコントロールの角は丸角です + + コンパクトなスキップボタンを使用 + コンパクトなスキップボタンが表示されます + 通常のスキップボタンが表示されます + スキップボタンを自動的に非表示 + スキップボタンは、表示された数秒後に自動的に非表示になります + スキップボタンは、セグメントの開始から終了まで表示されます + スキップボタンの表示時間 + 「ハイライトまでスキップ」ボタンと「スキップボタンを自動的に非表示」がオンのときのその他のスキップボタンが、自動的に非表示になるまでの時間の長さ + 自動スキップ時にトーストを表示 + セグメントが自動的にスキップされたときにトースト通知が表示されます。このトースト通知をタップすると、スキップを取り消すことができます + セグメントが自動的にスキップされたときにトースト通知は表示されません。このトースト通知をタップすると、スキップを取り消すことができます + スキップ トーストの表示時間 + セグメントが自動的にスキップされたときに表示されるトースト通知が、自動的に非表示になるまでの時間の長さ + 1 秒 + 2 秒 + 3 秒 + 4 秒 + 5 秒 + 6 秒 + 7 秒 + 8 秒 + 9 秒 + 10 秒 + セグメントを除いた再生時間を表示 + すべてのセグメントを除いた再生時間がシークバーに表示されます + 動画全体の再生時間のみがシークバーに表示されます + 新しいセグメントの作成 + セグメント作成ボタンを表示 + セグメント作成ボタンがプレーヤー オーバーレイに表示されます + セグメント作成ボタンはプレーヤー オーバーレイに表示されません + セグメントの位置調整幅 + セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒) + 値は正の整数でなければなりません + ガイドラインを見る + ガイドラインには、新しいセグメントを作成するためのルールやヒントが記載されています + ガイドラインに従ってください + 新しいセグメントを作成する前に SponsorBlock のガイドラインを確認してください + 既読 + 表示する + その他 + API 利用不可時にトーストを表示 + SponsorBlock が利用できない場合にトースト通知が表示されます + SponsorBlock が利用できない場合にトースト通知は表示されません + スキップデータの収集を有効化 + SponsorBlock リーダーボード にスキップによって節約した時間を送信します。セグメントをスキップする度にデータが送信されます + スキップデータの収集は無効です + セグメントの長さのしきい値 + この値 (秒) よりも短い時間のセグメントは、スキップもプレーヤーに表示もされません + 時間 (長さ) の値が無効です + 非公開ユーザー ID + この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます + 非公開ユーザー ID は 30 文字以上必要です + API URL を変更 + SponsorBlock がサーバーとの通信で使用するアドレス + API URL をリセットしました + API URL が無効です + API URL を変更しました + 設定のインポート / エクスポート + コピー + SponsorBlock の設定を JSON 形式のテキストでインポート / エクスポートします。この JSON テキストは他のプラットフォームでも利用可能です + SponsorBlock の設定を他のプラットフォームでも利用可能な JSON 形式のテキストでインポート / エクスポートします。この JSON テキストには非公開ユーザー ID が含まれています。このテキストを共有する際は十分注意してください + 設定のインポートに成功しました + インポートに失敗しました: %s + エクスポートに失敗しました: %s + "あなたの設定テキストには、SponsorBlock の非公開ユーザー ID が含まれています。 このユーザー ID は、パスワードのようなものであり、決して共有すべきではありません。" - 今後表示しない - セグメントに対する動作を変更 - スポンサー (広告) - 有料の宣伝、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は、このカテゴリには含まれません - 無報酬の宣伝 / 自己宣伝 - 無報酬または自己宣伝である、という点以外は「スポンサー」と同様です。商品、寄付、コラボ相手に関する宣伝などを含みます - 視聴者への催促 (登録) - 動画内に挿入される、高評価、チャンネル登録、フォローなどを視聴者にうながす短時間の催促。時間的に長い場合またはイベントなどの個別具体的なものに関する催促の場合は、このカテゴリではなく「自己宣伝」に分類すべきです - ハイライト - 動画の中で最も重要な場面 - 幕間 / オープニング (OP) - 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリには含まれません - 終了画面 / クレジット (ED) - クレジットまたは YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリには含まれません - フック / あいさつ - 今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。他の部分に存在しない内容や情報を追加する場面は、このカテゴリには含まれません - 予告編 / 総集編 - その動画またはシリーズ内の他の動画で過去に起きたこと、または今後起こることを示すクリップのコレクション。このクリップ群に含まれるすべての情報は、同じ動画の他の部分やシリーズ内の他の動画で繰り返されます - 余談 / 冗談 - 動画の本筋を理解するために必要のない脱線的な場面または冗談。コンテキストや背景情報を提供する場面は、このカテゴリには含まれません - 音楽: 楽曲以外の区間 - ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間であり、公式や他のメディアの音源に存在しない部分 - スキップ - ハイライト - 広告をスキップ - 自己宣伝をスキップ - 登録をスキップ - ハイライトまでスキップ - OP をスキップ - 幕間をスキップ - 幕間をスキップ - ED をスキップ - フックをスキップ - 予告編をスキップ - 予告編をスキップ - 総集編をスキップ - 余談をスキップ - 楽曲以外をスキップ - セグメントをスキップ - スポンサー (広告) をスキップしました - 自己宣伝をスキップしました - 視聴者への催促 (登録) をスキップしました - ハイライトまでスキップしました - オープニング (OP) をスキップしました - 幕間をスキップしました - 幕間をスキップしました - エンディング (ED) をスキップしました - フックをスキップしました - 予告編をスキップしました - 予告編をスキップしました - 総集編をスキップしました - 余談をスキップしました - 楽曲以外の区間をスキップしました - 未送信のセグメントをスキップしました - 複数のセグメントをスキップしました - 自動的にスキップ - 1 回だけ自動的にスキップ - スキップボタンを表示 - シークバーに表示 - 無効 - セグメントの送信に失敗しました: %s - SponsorBlock は一時的にダウンしています - セグメントの送信に失敗しました (status: %1$d %2$s) - セグメントの送信に失敗しました (レート制限: 同じユーザー / IP からの通信が多すぎます) - セグメントを送信できません: %s - "セグメントを送信できません。 + 今後表示しない + セグメントに対する動作を変更 + スポンサー (広告) + 有料の宣伝、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は、このカテゴリには含まれません + 無報酬の宣伝 / 自己宣伝 + 無報酬または自己宣伝である、という点以外は「スポンサー」と同様です。商品、寄付、コラボ相手に関する宣伝などを含みます + 視聴者への催促 (登録) + 動画内に挿入される、高評価、チャンネル登録、フォローなどを視聴者にうながす短時間の催促。時間的に長い場合またはイベントなどの個別具体的なものに関する催促の場合は、このカテゴリではなく「自己宣伝」に分類すべきです + ハイライト + 動画の中で最も重要な場面 + 幕間 / オープニング (OP) + 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリには含まれません + 終了画面 / クレジット (ED) + クレジットまたは YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリには含まれません + フック / あいさつ + 今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。他の部分に存在しない内容や情報を追加する場面は、このカテゴリには含まれません + 予告編 / 総集編 + その動画またはシリーズ内の他の動画で過去に起きたこと、または今後起こることを示すクリップのコレクション。このクリップ群に含まれるすべての情報は、同じ動画の他の部分やシリーズ内の他の動画で繰り返されます + 余談 / 冗談 + 動画の本筋を理解するために必要のない脱線的な場面または冗談。コンテキストや背景情報を提供する場面は、このカテゴリには含まれません + 音楽: 楽曲以外の区間 + ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間であり、公式や他のメディアの音源に存在しない部分 + スキップ + ハイライト + 広告をスキップ + 自己宣伝をスキップ + 登録をスキップ + ハイライトまでスキップ + OP をスキップ + 幕間をスキップ + 幕間をスキップ + ED をスキップ + フックをスキップ + 予告編をスキップ + 予告編をスキップ + 総集編をスキップ + 余談をスキップ + 楽曲以外をスキップ + セグメントをスキップ + スポンサー (広告) をスキップしました + 自己宣伝をスキップしました + 視聴者への催促 (登録) をスキップしました + ハイライトまでスキップしました + オープニング (OP) をスキップしました + 幕間をスキップしました + 幕間をスキップしました + エンディング (ED) をスキップしました + フックをスキップしました + 予告編をスキップしました + 予告編をスキップしました + 総集編をスキップしました + 余談をスキップしました + 楽曲以外の区間をスキップしました + 未送信のセグメントをスキップしました + 複数のセグメントをスキップしました + 自動的にスキップ + 1 回だけ自動的にスキップ + スキップボタンを表示 + シークバーに表示 + 無効 + セグメントの送信に失敗しました: %s + SponsorBlock は一時的にダウンしています + セグメントの送信に失敗しました (status: %1$d %2$s) + セグメントの送信に失敗しました (レート制限: 同じユーザー / IP からの通信が多すぎます) + セグメントを送信できません: %s + "セグメントを送信できません。 すでに存在します" - セグメントの送信に成功しました - - SponsorBlock は一時的に利用できません (API タイムアウト) - SponsorBlock は一時的に利用できません (status %d) - SponsorBlock は一時的に利用できません - セグメントへの投票に失敗しました (API タイムアウト) - セグメントへの投票に失敗しました (status: %1$d %2$s) - セグメントへの投票に失敗しました: %s - 高評価 - 低評価 - カテゴリの変更 - 投票可能なセグメントがありません - - %1$s ~ %2$s - セグメントのカテゴリを選択してください - カテゴリが「無効」に設定されています。送信するには、設定を変更してください。 - 新しいセグメント - %s を SponsorBlock の新しいセグメントの開始位置 / 終了位置に設定しますか? - 開始位置 - 終了位置 - 現在の再生位置 - セグメントの開始位置 - セグメントの終了位置 - 範囲は正確ですか? - "セグメントの範囲: + セグメントの送信に成功しました + + SponsorBlock は一時的に利用できません (API タイムアウト) + SponsorBlock は一時的に利用できません (status %d) + SponsorBlock は一時的に利用できません + セグメントへの投票に失敗しました (API タイムアウト) + セグメントへの投票に失敗しました (status: %1$d %2$s) + セグメントへの投票に失敗しました: %s + 高評価 + 低評価 + カテゴリの変更 + 投票可能なセグメントがありません + + %1$s ~ %2$s + セグメントのカテゴリを選択してください + カテゴリが「無効」に設定されています。送信するには、設定を変更してください。 + 新しいセグメント + %s を SponsorBlock の新しいセグメントの開始位置 / 終了位置に設定しますか? + 開始位置 + 終了位置 + 現在の再生位置 + セグメントの開始位置 + セグメントの終了位置 + 範囲は正確ですか? + "セグメントの範囲: %1$s から @@ -1292,47 +1291,47 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が (%3$s) 送信しますか?" - 開始位置を終了位置よりも前にしてください - 先に開始位置と終了位置を設定してください - セグメントをテストしてスムーズにスキップすることを確認してください - セグメントの範囲を手動で編集 - セグメントの開始位置または終了位置を編集しますか? - 時間 (位置) の値が無効です - 統計 - - 統計情報は一時的に利用できません (API がダウンしています) - 読み込み中… - SponsorBlock は無効です - ユーザー名: <b>%s</b> - ユーザー名を変更するには、ここをタップしてください - ユーザー名の変更に失敗しました (status: %1$d %2$s) - ユーザー名の変更に成功しました - あなたの評価は <b>%.2f</b> です - 合計で <b>%s</b> 個のセグメントを作成しました - 作成したセグメントを表示するには、ここをタップしてください - SponsorBlock リーダーボード - 合計で <b>%s</b> 個のセグメントからユーザーを救いました - 全体の統計とセグメント作成者のランキングを表示するには、ここをタップしてください - 時間にすると <b>%s</b> です。<br>リーダーボードを表示するには、ここをタップしてください - 合計で <b>%s</b> 個のセグメントをスキップしました - 時間にすると <b>%s</b> です - スキップしたセグメントの合計をリセットしますか? - %1$s 時間 %2$s 分 - %1$s 分 %2$s 秒 - %s 秒 - 透明度: - 色: - SponsorBlock について - sponsor.ajay.app - データは SponsorBlock API によって提供されています。詳細を確認するまたは他のプラットフォーム版をダウンロードするには、ここをタップしてください - - - レイアウトの種類 - デフォルト - スマートフォン - タブレット - Automotive - "以下の変更を伴います: + 開始位置を終了位置よりも前にしてください + 先に開始位置と終了位置を設定してください + セグメントをテストしてスムーズにスキップすることを確認してください + セグメントの範囲を手動で編集 + セグメントの開始位置または終了位置を編集しますか? + 時間 (位置) の値が無効です + 統計 + + 統計情報は一時的に利用できません (API がダウンしています) + 読み込み中… + SponsorBlock は無効です + ユーザー名: <b>%s</b> + ユーザー名を変更するには、ここをタップしてください + ユーザー名の変更に失敗しました (status: %1$d %2$s) + ユーザー名の変更に成功しました + あなたの評価は <b>%.2f</b> です + 合計で <b>%s</b> 個のセグメントを作成しました + 作成したセグメントを表示するには、ここをタップしてください + SponsorBlock リーダーボード + 合計で <b>%s</b> 個のセグメントからユーザーを救いました + 全体の統計とセグメント作成者のランキングを表示するには、ここをタップしてください + 時間にすると <b>%s</b> です。<br>リーダーボードを表示するには、ここをタップしてください + 合計で <b>%s</b> 個のセグメントをスキップしました + 時間にすると <b>%s</b> です + スキップしたセグメントの合計をリセットしますか? + %1$s 時間 %2$s 分 + %1$s 分 %2$s 秒 + %s 秒 + 透明度: + 色: + SponsorBlock について + sponsor.ajay.app + データは SponsorBlock API によって提供されています。詳細を確認するまたは他のプラットフォーム版をダウンロードするには、ここをタップしてください + + + レイアウトの種類 + デフォルト + スマートフォン + タブレット + Automotive + "以下の変更を伴います: タブレット レイアウト • コミュニティ投稿が表示されない @@ -1340,328 +1339,328 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が Automotive レイアウト • ショート動画を通常のプレーヤーで開く • フィードがトピックやチャンネルごとに分類された形で表示される" - - - アプリのバージョンを偽装 - アプリのバージョンは偽装されています - アプリのバージョンは偽装されていません - "アプリのバージョンを YouTube の古いバージョンに偽装します。 + + + アプリのバージョンを偽装 + アプリのバージョンは偽装されています + アプリのバージョンは偽装されていません + "アプリのバージョンを YouTube の古いバージョンに偽装します。 アプリの外観と機能が変化しますが、予期せぬ副作用が発生する可能性があります。 再び偽装を無効にする場合には、UI の不具合を防ぐためにアプリデータを消去することを推奨します。" - アプリバージョンの偽装先 - 20.13.41 - アクション ボタンの文字表示を復元 - 20.05.46 - 文字起こし機能を復元 - 19.35.36 - ショート プレーヤーの古いアイコンを復元 - 19.01.34 - 古いナビゲーション アイコンを復元 - - - スタート画面を変更 - デフォルト - すべての登録チャンネル - チャンネル一覧 - コース / 学び - 探索 - ファッションと美容 - ゲーム - 履歴 - マイページ - 高く評価した動画 - ライブ - 映画とテレビ - 音楽 - ニュース - 通知 - 再生リスト - 検索 - ショッピング - ショート - スポーツ - 登録チャンネル - 急上昇 - バーチャル リアリティ - 後で見る - 自分のクリップ - スタート画面の変更を常時適用 - "スタート画面の変更は常時適用されます + アプリバージョンの偽装先 + 20.13.41 - アクション ボタンの文字表示を復元 + 20.05.46 - 文字起こし機能を復元 + 19.35.36 - ショート プレーヤーの古いアイコンを復元 + 19.01.34 - 古いナビゲーション アイコンを復元 + + + スタート画面を変更 + デフォルト + すべての登録チャンネル + チャンネル一覧 + コース / 学び + 探索 + ファッションと美容 + ゲーム + 履歴 + マイページ + 高く評価した動画 + ライブ + 映画とテレビ + 音楽 + ニュース + 通知 + 再生リスト + 検索 + ショッピング + ショート + スポーツ + 登録チャンネル + 急上昇 + バーチャル リアリティ + 後で見る + 自分のクリップ + スタート画面の変更を常時適用 + "スタート画面の変更は常時適用されます 制限事項: ツールバーの [戻る] ボタンが機能しない可能性があります" - スタート画面の変更はアプリの起動時にのみ適用されます - - - ショート プレーヤーの再開を無効化 - ショート プレーヤーはアプリ起動時に再開されません - ショート プレーヤーはアプリ起動時に再開されます - - - ショートを開くプレーヤー - ショート プレーヤー - 通常のプレーヤー - 通常のプレーヤー (全画面) - - - ショート動画の自動再生 - ショート動画は自動再生されます - ショート動画はループ再生されます - ショート動画の自動再生 (バックグラウンド) - バックグラウンドのショート動画は自動再生されます - バックグラウンドのショート動画はループ再生されます - - - ミニプレーヤー - アプリ内に表示される小さな画面のプレーヤーのスタイルを変更します - ミニプレーヤーの種類 - 無効 - デフォルト - 旧タイプ(横長) - タブレット - 新タイプ 1 - 新タイプ 2 - 新タイプ 3 - 新タイプ 4 - ミニプレーヤーを直角化 - ミニプレーヤーの角は直角です - ミニプレーヤーの角は丸角です - ダブルタップとピンチによるサイズ変更を有効化 - "ダブルタップとピンチによるサイズ変更は有効です + スタート画面の変更はアプリの起動時にのみ適用されます + + + ショート プレーヤーの再開を無効化 + ショート プレーヤーはアプリ起動時に再開されません + ショート プレーヤーはアプリ起動時に再開されます + + + ショートを開くプレーヤー + ショート プレーヤー + 通常のプレーヤー + 通常のプレーヤー (全画面) + + + ショート動画の自動再生 + ショート動画は自動再生されます + ショート動画はループ再生されます + ショート動画の自動再生 (バックグラウンド) + バックグラウンドのショート動画は自動再生されます + バックグラウンドのショート動画はループ再生されます + + + ミニプレーヤー + アプリ内に表示される小さな画面のプレーヤーのスタイルを変更します + ミニプレーヤーの種類 + 無効 + デフォルト + 旧タイプ(横長) + タブレット + 新タイプ 1 + 新タイプ 2 + 新タイプ 3 + 新タイプ 4 + ミニプレーヤーを直角化 + ミニプレーヤーの角は直角です + ミニプレーヤーの角は丸角です + ダブルタップとピンチによるサイズ変更を有効化 + "ダブルタップとピンチによるサイズ変更は有効です • ダブルタップするとミニプレーヤーのサイズが大きくなる • もう一度ダブルタップすると元のサイズに戻る" - ダブルタップとピンチによるサイズ変更は無効です - ドラッグ&ドロップを無効化 - ドラッグ&ドロップは無効です - "ドラッグ&ドロップは有効です + ダブルタップとピンチによるサイズ変更は無効です + ドラッグ&ドロップを無効化 + ドラッグ&ドロップは無効です + "ドラッグ&ドロップは有効です ミニプレーヤーをドラッグして画面の四隅に移動できます" - 横方向ドラッグ ジェスチャーを無効化 - 横方向ドラッグ ジェスチャーは無効です - "横方向ドラッグ ジェスチャーは有効です + 横方向ドラッグ ジェスチャーを無効化 + 横方向ドラッグ ジェスチャーは無効です + "横方向ドラッグ ジェスチャーは有効です ミニプレーヤーを画面の左端または右端までドラッグして最小化できます" - オーバーレイ ボタンを非表示 - オーバーレイ ボタンは表示されません - オーバーレイ ボタンは表示されます - 展開ボタンと閉じるボタンを非表示 - "ボタンは表示されません + オーバーレイ ボタンを非表示 + オーバーレイ ボタンは表示されません + オーバーレイ ボタンは表示されます + 展開ボタンと閉じるボタンを非表示 + "ボタンは表示されません 展開するまたは閉じるには、スワイプしてください" - 展開ボタンと閉じるボタンは表示されます - サブテキストを非表示 - サブテキストは表示されません - サブテキストは表示されます - 早送りボタンと巻き戻しボタンを非表示 - 早送りボタンと巻き戻しボタンは表示されません - 早送りボタンと巻き戻しボタンは表示されます - デフォルトのサイズ - 画面に表示される際の大きさ (ピクセル) - ピクセルサイズの範囲は %1$s-%2$s です - オーバーレイの透明度 - 透明度の範囲は 0-100 で、0 が透明です - ミニプレーヤー: 透明度の範囲は 0-100 です - - - グラデーションの読み込み画面を有効化 - 画面読み込み時にグラデーションの背景が表示されます - 画面読み込み時に通常の背景が表示されます - スプラッシュ画面のスタイル - カラー - 白黒 - 編集したシークバーの色を有効化 - シークバーは編集した色で表示されます - シークバーはデフォルトの色で表示されます - シークバーの色 - シークバーの色を編集します - シークバーのアクセント カラー - シークバーのアクセントカラーを編集します - シークバーの色の値が無効です - - - YouTube ReVanced - YT ReVanced - YT - - - ヘッダーロゴ - デフォルト - 標準 - Premium - ReVanced - - ReVanced(シンプル) - カスタム - - - 画像表示の地域制限を回避 - yt4.ggpht.com から画像を取得します - "オリジナルの画像ホストから画像を取得します + 展開ボタンと閉じるボタンは表示されます + サブテキストを非表示 + サブテキストは表示されません + サブテキストは表示されます + 早送りボタンと巻き戻しボタンを非表示 + 早送りボタンと巻き戻しボタンは表示されません + 早送りボタンと巻き戻しボタンは表示されます + デフォルトのサイズ + 画面に表示される際の大きさ (ピクセル) + ピクセルサイズの範囲は %1$s-%2$s です + オーバーレイの透明度 + 透明度の範囲は 0-100 で、0 が透明です + ミニプレーヤー: 透明度の範囲は 0-100 です + + + グラデーションの読み込み画面を有効化 + 画面読み込み時にグラデーションの背景が表示されます + 画面読み込み時に通常の背景が表示されます + スプラッシュ画面のスタイル + カラー + 白黒 + 編集したシークバーの色を有効化 + シークバーは編集した色で表示されます + シークバーはデフォルトの色で表示されます + シークバーの色 + シークバーの色を編集します + シークバーのアクセント カラー + シークバーのアクセントカラーを編集します + シークバーの色の値が無効です + + + YouTube ReVanced + YT ReVanced + YT + + + ヘッダーロゴ + デフォルト + 標準 + Premium + ReVanced + + ReVanced(シンプル) + カスタム + + + 画像表示の地域制限を回避 + yt4.ggpht.com から画像を取得します + "オリジナルの画像ホストから画像を取得します この機能を有効にすると、一部の地域でブロックされている画像が表示されるようになる可能性があります" - - - - ホームタブ - - 登録チャンネルタブ - - マイページタブ - プレーヤーのプレイリスト & 関連動画 - 検索結果 - オリジナルのサムネイル - DeArrow & オリジナル - DeArrow & 静止画 - 静止画サムネイル - DeArrow - "DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。これを有効にすると、動画の URL が API サーバーに送信されますが、他のデータは送信されません。動画に DeArrow サムネイルがない場合は、オリジナルのサムネイルまたは静止画サムネイルが表示されます + + + + ホームタブ + + 登録チャンネルタブ + + マイページタブ + プレーヤーのプレイリスト & 関連動画 + 検索結果 + オリジナルのサムネイル + DeArrow & オリジナル + DeArrow & 静止画 + 静止画サムネイル + DeArrow + "DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。これを有効にすると、動画の URL が API サーバーに送信されますが、他のデータは送信されません。動画に DeArrow サムネイルがない場合は、オリジナルのサムネイルまたは静止画サムネイルが表示されます 詳細については、ここをタップしてください" - API 利用不可時にトーストを表示 - DeArrow が利用できない場合にトースト通知が表示されます - DeArrow が利用できない場合にトースト通知は表示されません - DeArrow API のエンドポイント - DeArrow がサムネイルのキャッシュを取得するエンドポイントの URL - 静止画サムネイル - 静止画は各動画の序盤 / 中盤 / 終盤から取得されます。これらの画像は YouTube に組み込まれており、外部 API は使用されません - 高速な静止画サムネイルを使用 - 中画質の静止画サムネイルを使用します。サムネイルの読み込みは速くなりますが、ライブ、未公開、または非常に古い動画には空白のサムネイルが表示されることがあります - 高画質の静止画サムネイルを使用します - 静止画サムネイルを取得する位置 - 動画の序盤 - 動画の中盤 - 動画の終盤 - - DeArrow は一時的に利用できません (status code: %s) - DeArrow は一時的に利用できません - - - ReVanced からのお知らせを表示 - アプリの起動時にお知らせが表示されます - アプリの起動時にお知らせは表示されません - アプリの起動時にお知らせを表示します - お知らせの取得に失敗しました - 閉じる - - - 動画のループ再生を有効化 - 動画はループ再生されます - 動画はループ再生されません - - - 動画のループ再生ボタンを表示 - ボタンがプレーヤー オーバーレイに表示されます - ボタンはプレーヤー オーバーレイに表示されません - 動画のループ再生がオンになっています - 動画のループ再生がオフになっています - - - 音声割り込み時に一時停止 - 他の音声が再生されたときに一時停止します(ナビゲーションなど) - 他の音声が再生されたときに音量を下げます - - - デバイスの画面サイズを偽装 - "デバイスの画面サイズは偽装されています + API 利用不可時にトーストを表示 + DeArrow が利用できない場合にトースト通知が表示されます + DeArrow が利用できない場合にトースト通知は表示されません + DeArrow API のエンドポイント + DeArrow がサムネイルのキャッシュを取得するエンドポイントの URL + 静止画サムネイル + 静止画は各動画の序盤 / 中盤 / 終盤から取得されます。これらの画像は YouTube に組み込まれており、外部 API は使用されません + 高速な静止画サムネイルを使用 + 中画質の静止画サムネイルを使用します。サムネイルの読み込みは速くなりますが、ライブ、未公開、または非常に古い動画には空白のサムネイルが表示されることがあります + 高画質の静止画サムネイルを使用します + 静止画サムネイルを取得する位置 + 動画の序盤 + 動画の中盤 + 動画の終盤 + + DeArrow は一時的に利用できません (status code: %s) + DeArrow は一時的に利用できません + + + ReVanced からのお知らせを表示 + アプリの起動時にお知らせが表示されます + アプリの起動時にお知らせは表示されません + アプリの起動時にお知らせを表示します + お知らせの取得に失敗しました + 閉じる + + + 動画のループ再生を有効化 + 動画はループ再生されます + 動画はループ再生されません + + + 動画のループ再生ボタンを表示 + ボタンがプレーヤー オーバーレイに表示されます + ボタンはプレーヤー オーバーレイに表示されません + 動画のループ再生がオンになっています + 動画のループ再生がオフになっています + + + 音声割り込み時に一時停止 + 他の音声が再生されたときに一時停止します(ナビゲーションなど) + 他の音声が再生されたときに音量を下げます + + + デバイスの画面サイズを偽装 + "デバイスの画面サイズは偽装されています より高画質な映像がアンロックされる可能性がありますが、動画のカクつき、バッテリー寿命の悪化、予期せぬ副作用が 発生するかもしれません" - "デバイスの画面サイズは偽装されていません + "デバイスの画面サイズは偽装されていません この機能を有効にすると、より高画質な映像がアンロックされる可能性があります" - この機能を有効にすると、動画のカクつき、バッテリー寿命の悪化、および予期せぬ副作用を引き起こす可能性があります。 - - - 触覚フィードバック - 触覚フィードバックの設定を変更します - チャプターの触覚フィードバックを無効化 - チャプターの触覚フィードバックは無効です - チャプターの触覚フィードバックは有効です - 精密シークの触覚フィードバックを無効化 - 精密シークの触覚フィードバックは無効です - 精密シークの触覚フィードバックは有効です - シーク取り消しの触覚フィードバックを無効化 - シーク取り消しの触覚フィードバックは無効です - シーク取り消しの触覚フィードバックは有効です - ズームの触覚フィードバックを無効化 - ズームの触覚フィードバックは無効です - ズームの触覚フィードバックは有効です - - - 最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。 - - - URL リダイレクトを回避 - YouTube の URL リダイレクトを経由せずにリンク先へ移動します - YouTube の URL リダイレクトを経由してリンク先へ移動します - - - リンクをブラウザで開く - 外部ブラウザでリンクを開きます - アプリ内ブラウザでリンクを開きます - - - - 自動 - 画質の変更を保存 - 画質の変更はすべての動画に適用されます - 画質の変更は現在の動画にのみ適用されます - 画質の変更時にトーストを表示 - デフォルトの画質が変更された場合にトースト通知が表示されます - デフォルトの画質が変更された場合にトースト通知は表示されません - デフォルトの画質 (Wi-Fi) - デフォルトの画質 (携帯回線) - ショートの画質の変更を保存 - 画質の変更はすべてのショート動画に適用されます - 画質の変更は現在のショート動画にのみ適用されます - デフォルトのショートの画質 (Wi-Fi) - デフォルトのショートの画質 (携帯回線) - 携帯回線 - Wi-Fi - デフォルトの画質の変更 (%1$s): %2$s - ショートの画質の変更 (%1$s): %2$s - - - 再生速度設定ボタンを表示 - 再生速度設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、再生速度がデフォルトの値にリセットされます - 再生速度設定ボタンはプレーヤー オーバーレイに表示されません - - - 画質設定ボタンを表示 - 画質設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、画質がデフォルトの値にリセットされます - 画質設定ボタンはプレーヤー オーバーレイに表示されません - - - カスタム再生速度メニュー - カスタム再生速度リストが再生速度メニューに表示されます - デフォルトの再生速度リストが再生速度メニューに表示されます - 古い再生速度メニューを復元 - 古いスタイルの再生速度メニューが表示されます - 新しいスタイルの再生速度メニューが表示されます - カスタム再生速度リスト - カスタム再生速度リストを編集します - 再生速度は %s 未満でなければなりません - カスタム再生速度リストの値が無効です - 自動 - 長押し倍速再生の速度 - 再生速度の範囲は 0-8 で、0 および 8 は含まれません - - - 再生速度の変更を保存 - 再生速度の変更はすべての動画に適用されます - 再生速度の変更は現在の動画にのみ適用されます - 再生速度の変更時にトーストを表示 - デフォルトの再生速度が変更されたときにトースト通知が表示されます - デフォルトの再生速度が変更されたときにトースト通知は表示されません - デフォルトの再生速度 - デフォルトの再生速度の変更: %s - - - HDR 動画を無効化 - HDR 動画は無効です - HDR 動画は有効です - AVC (H.264) を強制的に使用 - ビデオ コーデックは強制的に AVC (H.264) になります - ビデオ コーデックは自動的に決定されます - "利点: + この機能を有効にすると、動画のカクつき、バッテリー寿命の悪化、および予期せぬ副作用を引き起こす可能性があります。 + + + 触覚フィードバック + 触覚フィードバックの設定を変更します + チャプターの触覚フィードバックを無効化 + チャプターの触覚フィードバックは無効です + チャプターの触覚フィードバックは有効です + 精密シークの触覚フィードバックを無効化 + 精密シークの触覚フィードバックは無効です + 精密シークの触覚フィードバックは有効です + シーク取り消しの触覚フィードバックを無効化 + シーク取り消しの触覚フィードバックは無効です + シーク取り消しの触覚フィードバックは有効です + ズームの触覚フィードバックを無効化 + ズームの触覚フィードバックは無効です + ズームの触覚フィードバックは有効です + + + 最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。 + + + URL リダイレクトを回避 + YouTube の URL リダイレクトを経由せずにリンク先へ移動します + YouTube の URL リダイレクトを経由してリンク先へ移動します + + + リンクをブラウザで開く + 外部ブラウザでリンクを開きます + アプリ内ブラウザでリンクを開きます + + + + 自動 + 画質の変更を保存 + 画質の変更はすべての動画に適用されます + 画質の変更は現在の動画にのみ適用されます + 画質の変更時にトーストを表示 + デフォルトの画質が変更された場合にトースト通知が表示されます + デフォルトの画質が変更された場合にトースト通知は表示されません + デフォルトの画質 (Wi-Fi) + デフォルトの画質 (携帯回線) + ショートの画質の変更を保存 + 画質の変更はすべてのショート動画に適用されます + 画質の変更は現在のショート動画にのみ適用されます + デフォルトのショートの画質 (Wi-Fi) + デフォルトのショートの画質 (携帯回線) + 携帯回線 + Wi-Fi + デフォルトの画質の変更 (%1$s): %2$s + ショートの画質の変更 (%1$s): %2$s + + + 再生速度設定ボタンを表示 + 再生速度設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、再生速度がデフォルトの値にリセットされます + 再生速度設定ボタンはプレーヤー オーバーレイに表示されません + + + 画質設定ボタンを表示 + 画質設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、画質がデフォルトの値にリセットされます + 画質設定ボタンはプレーヤー オーバーレイに表示されません + + + カスタム再生速度メニュー + カスタム再生速度リストが再生速度メニューに表示されます + デフォルトの再生速度リストが再生速度メニューに表示されます + 古い再生速度メニューを復元 + 古いスタイルの再生速度メニューが表示されます + 新しいスタイルの再生速度メニューが表示されます + カスタム再生速度リスト + カスタム再生速度リストを編集します + 再生速度は %s 未満でなければなりません + カスタム再生速度リストの値が無効です + 自動 + 長押し倍速再生の速度 + 再生速度の範囲は 0-8 で、0 および 8 は含まれません + + + 再生速度の変更を保存 + 再生速度の変更はすべての動画に適用されます + 再生速度の変更は現在の動画にのみ適用されます + 再生速度の変更時にトーストを表示 + デフォルトの再生速度が変更されたときにトースト通知が表示されます + デフォルトの再生速度が変更されたときにトースト通知は表示されません + デフォルトの再生速度 + デフォルトの再生速度の変更: %s + + + HDR 動画を無効化 + HDR 動画は無効です + HDR 動画は有効です + AVC (H.264) を強制的に使用 + ビデオ コーデックは強制的に AVC (H.264) になります + ビデオ コーデックは自動的に決定されます + "利点: • バッテリー寿命が延びる可能性がある • 古いデバイスで失われた動画解像度を復元できる可能性がある @@ -1670,182 +1669,182 @@ Automotive レイアウト • 動画再生時に VP9 または AV1 よりも多くの通信量を使用する • HDR 動画では AVC が使用されない • 一部のデバイスでは AVC を強制できない" - - - 画質の詳細設定メニューを表示 - 詳細設定メニューが画質メニューとして表示されます - 通常の画質メニューが表示されます - - - スライドによるシークを有効化 - スライドによるシークは有効です。プレーヤー画面を左右にスライドすると、前後にシークします - スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません - - - Android VR で AV1 を許可 - "ビデオ コーデックは AVC (H.264)、VP9、AV1 のいずれかになります + + + 画質の詳細設定メニューを表示 + 詳細設定メニューが画質メニューとして表示されます + 通常の画質メニューが表示されます + + + スライドによるシークを有効化 + スライドによるシークは有効です。プレーヤー画面を左右にスライドすると、前後にシークします + スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません + + + Android VR で AV1 を許可 + "ビデオ コーデックは AVC (H.264)、VP9、AV1 のいずれかになります 再生がカクつくまたはコマ落ちが発生する場合があります" - ビデオ コーデックは AVC (H.264)、VP9 のいずれかになります - "この設定を有効にすると、AV1 のソフトウェア デコードが使用される場合があります。 + ビデオ コーデックは AVC (H.264)、VP9 のいずれかになります + "この設定を有効にすると、AV1 のソフトウェア デコードが使用される場合があります。 AV1 での動画再生は、カクつくまたはコマ落ちが発生する場合があります。" - 偽装による副作用 - • 実験的なクライアントであり、いつでも動作しなくなる可能性がある - • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある - •「音声トラック」がフライアウト メニューに表示されない - • AV1 コーデックが利用できない - •「一定音量」が利用できない - • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある - - •「オリジナルの音声を強制的に使用」が利用できない - 統計情報にクライアントを表示 - 統計情報には現在のクライアントが表示されます - 統計情報には現在のクライアントは表示されません - - - - - YT Music ReVanced - Music ReVanced - Music - - - ReVanced について - 広告 - 全般 - プレーヤー - その他 - - - 動画広告を非表示 - 動画広告は表示されません - 動画広告は表示されます - - - 常時リピートを有効化 - 常時リピートは有効です\n\nリピート設定が保存され常時適用されます - 常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます - - - キャストボタンを非表示 - キャストボタンはプレーヤー オーバーレイに表示されません - キャストボタンはプレーヤー オーバーレイに表示されます - 履歴ボタンを非表示 - 履歴ボタンは表示されません - 履歴ボタンは表示されます - 通知ボタンを非表示 - 通知ボタンは表示されません - 通知ボタンは表示されます - 検索ボタンを非表示 - 検索ボタンは表示されません - 検索ボタンは表示されます - - - カテゴリバーを非表示 - カテゴリバーは表示されません - カテゴリバーは表示されます - - - ミニプレーヤーの色を変更 - ミニプレーヤーはフルスクリーン プレーヤーと同じ色を使用します - ミニプレーヤーはデフォルトの色を使用します - - - ナビゲーション バー - ナビゲーション バーのボタンを変更または非表示にします - - 「ホーム」を非表示 - ホームボタンは表示されません - ホームボタンは表示されます - - 「サンプル」を非表示 - サンプルボタンは表示されません - サンプルボタンは表示されます - - 「探索」を非表示 - 探索ボタンは表示されません - 探索ボタンは表示されます - - 「ライブラリ」を非表示 - ライブラリ ボタンは表示されません - ライブラリ ボタンは表示されます - - 「アップグレード」を非表示 - アップグレード ボタンは表示されません - アップグレード ボタンは表示されます - ナビゲーション バーを非表示 - ナビゲーション バーは表示されません - ナビゲーション バーは表示されます - ボタンをアイコンのみで表示 - ナビゲーション ボタンはアイコンのみで表示されます - ナビゲーション ボタンはアイコンと文字で表示されます - - - 「Music Premium に登録」ラベルを非表示 - ラベルは表示されません - ラベルは表示されます - - - アップグレード ボタンを非表示 - ボタンは表示されません - ボタンは表示されます - - - - - 音声広告をブロック - 音声広告はブロックされます - 音声広告はブロックされません - - - %s は利用できません。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 - %s でエラーが発生しました。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 - 埋め込み動画広告をブロック - 無効 - Luminous プロキシ - PurpleAdBlock プロキシ - - - 動画広告をブロック - 動画広告はブロックされます - 動画広告はブロックされません - - - メッセージを削除しました - 削除されたメッセージの表示方法 - 削除されたメッセージを表示しない - 削除されたメッセージをスポイラー表示で隠して表示する - 削除されたメッセージを取り消し線つきで表示する - - - チャンネルポイントの受け取りを自動化 - チャンネルポイントの受け取りは自動的に行われます - チャンネルポイントの受け取りは自動的には行われません - - - - Twitch デバッグモードを有効化 - Twitch デバッグモードは有効です (非推奨) - Twitch デバッグモードは無効です - - - ReVanced 設定 - 製品情報 - ReVanced について - 広告ブロック - 広告ブロック設定 - チャット - チャット設定 - その他 - その他の設定 - 全般設定 - その他の設定 - クライアントサイド広告 - サーバーサイド SureStream 広告 - デバッグログを有効化 - デバッグログは有効です - デバッグログは無効です - - + 偽装による副作用 + • 実験的なクライアントであり、いつでも動作しなくなる可能性がある + • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある + •「音声トラック」がフライアウト メニューに表示されない + • AV1 コーデックが利用できない + •「一定音量」が利用できない + • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある + + •「オリジナルの音声を強制的に使用」が利用できない + 統計情報にクライアントを表示 + 統計情報には現在のクライアントが表示されます + 統計情報には現在のクライアントは表示されません + + + + + YT Music ReVanced + Music ReVanced + Music + + + ReVanced について + 広告 + 全般 + プレーヤー + その他 + + + 動画広告を非表示 + 動画広告は表示されません + 動画広告は表示されます + + + 常時リピートを有効化 + 常時リピートは有効です\n\nリピート設定が保存され常時適用されます + 常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます + + + キャストボタンを非表示 + キャストボタンはプレーヤー オーバーレイに表示されません + キャストボタンはプレーヤー オーバーレイに表示されます + 履歴ボタンを非表示 + 履歴ボタンは表示されません + 履歴ボタンは表示されます + 通知ボタンを非表示 + 通知ボタンは表示されません + 通知ボタンは表示されます + 検索ボタンを非表示 + 検索ボタンは表示されません + 検索ボタンは表示されます + + + カテゴリバーを非表示 + カテゴリバーは表示されません + カテゴリバーは表示されます + + + ミニプレーヤーの色を変更 + ミニプレーヤーはフルスクリーン プレーヤーと同じ色を使用します + ミニプレーヤーはデフォルトの色を使用します + + + ナビゲーション バー + ナビゲーション バーのボタンを変更または非表示にします + + 「ホーム」を非表示 + ホームボタンは表示されません + ホームボタンは表示されます + + 「サンプル」を非表示 + サンプルボタンは表示されません + サンプルボタンは表示されます + + 「探索」を非表示 + 探索ボタンは表示されません + 探索ボタンは表示されます + + 「ライブラリ」を非表示 + ライブラリ ボタンは表示されません + ライブラリ ボタンは表示されます + + 「アップグレード」を非表示 + アップグレード ボタンは表示されません + アップグレード ボタンは表示されます + ナビゲーション バーを非表示 + ナビゲーション バーは表示されません + ナビゲーション バーは表示されます + ボタンをアイコンのみで表示 + ナビゲーション ボタンはアイコンのみで表示されます + ナビゲーション ボタンはアイコンと文字で表示されます + + + 「Music Premium に登録」ラベルを非表示 + ラベルは表示されません + ラベルは表示されます + + + アップグレード ボタンを非表示 + ボタンは表示されません + ボタンは表示されます + + + + + 音声広告をブロック + 音声広告はブロックされます + 音声広告はブロックされません + + + %s は利用できません。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 + %s でエラーが発生しました。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 + 埋め込み動画広告をブロック + 無効 + Luminous プロキシ + PurpleAdBlock プロキシ + + + 動画広告をブロック + 動画広告はブロックされます + 動画広告はブロックされません + + + メッセージを削除しました + 削除されたメッセージの表示方法 + 削除されたメッセージを表示しない + 削除されたメッセージをスポイラー表示で隠して表示する + 削除されたメッセージを取り消し線つきで表示する + + + チャンネルポイントの受け取りを自動化 + チャンネルポイントの受け取りは自動的に行われます + チャンネルポイントの受け取りは自動的には行われません + + + + Twitch デバッグモードを有効化 + Twitch デバッグモードは有効です (非推奨) + Twitch デバッグモードは無効です + + + ReVanced 設定 + 製品情報 + ReVanced について + 広告ブロック + 広告ブロック設定 + チャット + チャット設定 + その他 + その他の設定 + 全般設定 + その他の設定 + クライアントサイド広告 + サーバーサイド SureStream 広告 + デバッグログを有効化 + デバッグログは有効です + デバッグログは無効です + + diff --git a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml +++ b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml +++ b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-km-rKH/strings.xml b/patches/src/main/resources/addresources/values-km-rKH/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-km-rKH/strings.xml +++ b/patches/src/main/resources/addresources/values-km-rKH/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml index 8389454b2d..f9bd2dd50c 100644 --- a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml @@ -17,308 +17,237 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - ಪರಿಶೀಲನೆ ವಿಫಲವಾಗಿದೆ - ಅಧಿಕೃತ ಜಾಲತಾಣ ತೆರೆಯಿರಿ - ನಿರ್ಲಕ್ಷಿಸು - <h5>ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನೀವು ಪ್ಯಾಚ್ ಮಾಡಿದಂತೆ ಕಾಣುತ್ತಿಲ್ಲ.</h5><br>ಈ ಅಪ್ಲಿಕೇಶನ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು, <b> ಹಾಗು ಉಪಯೋಗಿಸಲು ಹಾನಿಕಾರಕ ಅಥವಾ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು</b>.<br><br>ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೊದಲೇ ಪ್ಯಾಚ್ ಆಗಿದೆ ಅಥವಾ ಬೇರೆಯವರಿಂದ ಪಡೆದದ್ದು ಎಂದು ಈ ಪರಿಶೀಲನೆಗಳು ಸೂಚಿಸುತ್ತವೆ:<br><br><small>%1$s</small><br>ನೀವು ದೃಢೀಕೃತ ಮತ್ತು ಸುರಕ್ಷಿತ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು <b>ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ ಮತ್ತು ನೀವೇ ಪ್ಯಾಚ್ ಮಾಡಿ</b> ಎಂದು ಬಲವಾಗಿ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ.<p><br>ನಿರ್ಲಕ್ಷಿಸಿದರೆ, ಈ ಎಚ್ಚರಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಮಾತ್ರ ತೋರಿಸಲಾಗುತ್ತದೆ. - ಬೇರೆ ಸಾಧನದಲ್ಲಿ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ - ReVanced Manager ನಿಂದ ಸ್ಥಾಪಿಸಿದ್ದಲ್ಲ - 10 ನಿಮಿಷಗಳಿಗಿಂತ ಮುಂಚೆ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ - %s ದಿನಗಳ ಹಿಂದೆ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ - APK ನಿರ್ಮಾಣ ದಿನಾಂಕವು ಭ್ರಷ್ಟಗೊಂಡಿದೆ - - - - - ಸಂಯೋಜನೆಗಳು - ನೀವು ಮುಂದುವರಿಯಲು ಖಚಿತವಾಗಿ ಬಯಸುತ್ತೀರಾ? - ಮರುಹೊಂದಿಸಿ - ಬಣ್ಣ ಮರುಹೊಂದಿಸಿ - ಅಮಾನ್ಯ ಬಣ್ಣ - ಮರುಪ್ರಾರಂಭದ ಅಗತ್ಯವಿದೆ - - + + + + + + + + ಪರಿಶೀಲನೆ ವಿಫಲವಾಗಿದೆ + ಅಧಿಕೃತ ಜಾಲತಾಣ ತೆರೆಯಿರಿ + ನಿರ್ಲಕ್ಷಿಸು + <h5>ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನೀವು ಪ್ಯಾಚ್ ಮಾಡಿದಂತೆ ಕಾಣುತ್ತಿಲ್ಲ.</h5><br>ಈ ಅಪ್ಲಿಕೇಶನ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು, <b> ಹಾಗು ಉಪಯೋಗಿಸಲು ಹಾನಿಕಾರಕ ಅಥವಾ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು</b>.<br><br>ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೊದಲೇ ಪ್ಯಾಚ್ ಆಗಿದೆ ಅಥವಾ ಬೇರೆಯವರಿಂದ ಪಡೆದದ್ದು ಎಂದು ಈ ಪರಿಶೀಲನೆಗಳು ಸೂಚಿಸುತ್ತವೆ:<br><br><small>%1$s</small><br>ನೀವು ದೃಢೀಕೃತ ಮತ್ತು ಸುರಕ್ಷಿತ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು <b>ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ ಮತ್ತು ನೀವೇ ಪ್ಯಾಚ್ ಮಾಡಿ</b> ಎಂದು ಬಲವಾಗಿ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ.<p><br>ನಿರ್ಲಕ್ಷಿಸಿದರೆ, ಈ ಎಚ್ಚರಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಮಾತ್ರ ತೋರಿಸಲಾಗುತ್ತದೆ. + ಬೇರೆ ಸಾಧನದಲ್ಲಿ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ + ReVanced Manager ನಿಂದ ಸ್ಥಾಪಿಸಿದ್ದಲ್ಲ + 10 ನಿಮಿಷಗಳಿಗಿಂತ ಮುಂಚೆ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ + %s ದಿನಗಳ ಹಿಂದೆ ಪ್ಯಾಚ್ ಮಾಡಲಾಗಿದೆ + APK ನಿರ್ಮಾಣ ದಿನಾಂಕವು ಭ್ರಷ್ಟಗೊಂಡಿದೆ + + + + ಸಂಯೋಜನೆಗಳು + ನೀವು ಮುಂದುವರಿಯಲು ಖಚಿತವಾಗಿ ಬಯಸುತ್ತೀರಾ? + ಮರುಹೊಂದಿಸಿ + ಬಣ್ಣ ಮರುಹೊಂದಿಸಿ + ಅಮಾನ್ಯ ಬಣ್ಣ + ಮರುಪ್ರಾರಂಭದ ಅಗತ್ಯವಿದೆ + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 6298ffab56..9f09f16e1e 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -17,239 +17,238 @@ "First 'item' text Second \"item\" text" ---> - - - - 앱 이름 - - 사용자 정의 - 앱 아이콘 - 원본 - ReVanced - - ReVanced 최소화 - ReVanced 스케일 - - 사용자 정의 - - - 환경 검사에 실패하였습니다 - 공식 홈페이지 열기 - 닫기 - <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 다른 사람에 의하여 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 제거하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. - 다른 기기에서 패치되었습니다 - ReVanced Manager에 의해 설치되지 않았습니다 - 10분 이상 전에 패치되었습니다 - %s 일 전에 패치되었습니다 - APK 빌드 날짜가 손상되었습니다 - - - ReVanced 알림 - 시청 기록이 저장되지 않습니다.<br><br> DNS 광고 차단기 또는 네트워크 프록시로 인하여 발생한 문제일 가능성이 높습니다.<br><br> 이 문제를 해결하려면 <b>s.youtube.com</b>을 허용 목록에서 제외하거나 모든 DNS 차단기 및 프록시를 해제하세요. - 다시 보지 않기 - - - 설정 - ReVanced - 계속하시겠습니까? - 저장 - 초기화 - 색상 초기화 - 잘못된 색상입니다 - 다시 시작하세요 - 이 변경 사항을 적용하려면 앱을 다시 시작하세요. - 다시 시작 - 가져오기 - 복사하기 - ReVanced 설정을 기본값으로 초기화합니다 - %d 개의 설정을 가져왔습니다 - 설정을 가져올 수 없습니다: %s - 설정 검색 - \'%s\'에 대한 검색 결과가 없습니다 - 다른 키워드를 검색해 보세요 - 최근 검색어 - 검색 기록에서 제거하시겠습니까? - 검색 기록 지우기 - 모든 검색 기록을 지우시겠습니까? - 검색 팁 - "• 경로를 탭하여 설정 카테고리로 이동할 수 있습니다 +--> + + + 앱 이름 + + 사용자 정의 + 앱 아이콘 + 원본 + ReVanced + + ReVanced 최소화 + ReVanced 스케일 + + 사용자 정의 + + + 환경 검사에 실패하였습니다 + 공식 홈페이지 열기 + 닫기 + <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 다른 사람에 의하여 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 제거하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. + 다른 기기에서 패치되었습니다 + ReVanced Manager에 의해 설치되지 않았습니다 + 10분 이상 전에 패치되었습니다 + %s 일 전에 패치되었습니다 + APK 빌드 날짜가 손상되었습니다 + + + ReVanced 알림 + 시청 기록이 저장되지 않습니다.<br><br> DNS 광고 차단기 또는 네트워크 프록시로 인하여 발생한 문제일 가능성이 높습니다.<br><br> 이 문제를 해결하려면 <b>s.youtube.com</b>을 허용 목록에서 제외하거나 모든 DNS 차단기 및 프록시를 해제하세요. + 다시 보지 않기 + + + 설정 + ReVanced + 계속하시겠습니까? + 저장 + 초기화 + 색상 초기화 + 잘못된 색상입니다 + 다시 시작하세요 + 이 변경 사항을 적용하려면 앱을 다시 시작하세요. + 다시 시작 + 가져오기 + 복사하기 + ReVanced 설정을 기본값으로 초기화합니다 + %d 개의 설정을 가져왔습니다 + 설정을 가져올 수 없습니다: %s + 설정 검색 + \'%s\'에 대한 검색 결과가 없습니다 + 다른 키워드를 검색해 보세요 + 최근 검색어 + 검색 기록에서 제거하시겠습니까? + 검색 기록 지우기 + 모든 검색 기록을 지우시겠습니까? + 검색 팁 + "• 경로를 탭하여 설정 카테고리로 이동할 수 있습니다 • 설정을 길게 탭하여 설정 위치로 이동할 수 있습니다 • 엔터키를 눌러서 검색어를 기록에 저장할 수 있습니다 • 검색할 경우에 대소문자와 구두점이 무시됩니다 • 상위 설정이 비활성화된 하위 설정 위에 표시됩니다" - 검색 기록이 비어 있습니다 - 검색 기록을 저장하려면 검색어를 입력하고 엔터키를 누르세요 - 설정 검색 기록 표시하기 - 설정 검색 기록을 표시합니다 - 설정 검색 기록을 표시하지 않습니다 - ReVanced 설정 아이콘 표시하기 - 설정 아이콘을 표시합니다 - 설정 아이콘을 표시하지 않습니다 - ReVanced 언어 - "일부 언어의 번역이 누락되었거나 완료되지 않았을 수 있습니다. + 검색 기록이 비어 있습니다 + 검색 기록을 저장하려면 검색어를 입력하고 엔터키를 누르세요 + 설정 검색 기록 표시하기 + 설정 검색 기록을 표시합니다 + 설정 검색 기록을 표시하지 않습니다 + ReVanced 설정 아이콘 표시하기 + 설정 아이콘을 표시합니다 + 설정 아이콘을 표시하지 않습니다 + ReVanced 언어 + "일부 언어의 번역이 누락되었거나 완료되지 않았을 수 있습니다. 새 언어를 번역하거나 기존 번역을 개선하려면 translate.revanced.app를 방문하세요." - 앱 언어 - 가져오기 / 내보내기 - ReVanced 설정을 가져오거나 내보낼 수 있습니다 - - ReVanced Patches <i>%s</i><br>버전을 사용 중입니다 - 알림 - Pre-release 버전이므로<br>알려지지 않은 문제점이<br>발생할 수 있습니다 - 공식 링크 - + ReVanced Patches <i>%s</i><br>버전을 사용 중입니다 + 알림 + Pre-release 버전이므로<br>알려지지 않은 문제점이<br>발생할 수 있습니다 + 공식 링크 + - - - GmsCore 설정 - 알림 수신을 위한 클라우드 메시징을 설정할 수 있습니다 - - MicroG GmsCore가 설치되어 있지 않습니다. 설치하세요. - 필수 조치 - "MicroG GmsCore에 백그라운드에서 실행할 수 있는 권한이 없습니다. + + + GmsCore 설정 + 알림 수신을 위한 클라우드 메시징을 설정할 수 있습니다 + + MicroG GmsCore가 설치되어 있지 않습니다. 설치하세요. + 필수 조치 + "MicroG GmsCore에 백그라운드에서 실행할 수 있는 권한이 없습니다. 이 기기에 대한 \"Don't kill my app\" 가이드를 읽어보고, MicroG 설치 지침을 적용하세요. 앱이 실행하려면 이 과정이 필요합니다." - 웹사이트 열기 - "MicroG GmsCore 앱 배터리 최적화를 비활성화(제한 없음)하여 앱 문제를 방지할 수 있습니다. + 웹사이트 열기 + "MicroG GmsCore 앱 배터리 최적화를 비활성화(제한 없음)하여 앱 문제를 방지할 수 있습니다. MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배터리 사용량에 부정적인 영향을 미치지 않습니다. 앱 배터리 최적화를 비활성화(제한 없음)하려면 '계속하기' 버튼을 탭하세요." - 계속하기 - - - 동영상 스트림 속이기 - 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 - 동영상 스트림 속이기 - 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 - 동영상 스트림 속이기 - "동영상 스트림이 속여집니다 + 계속하기 + + + 동영상 스트림 속이기 + 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 + 동영상 스트림 속이기 + 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 + 동영상 스트림 속이기 + "동영상 스트림이 속여집니다 YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니다" - "동영상 스트림이 속여지지 않습니다 + "동영상 스트림이 속여지지 않습니다 재생 문제가 발생할 수 있습니다" - 이 설정을 비활성화하면 재생 문제가 발생할 수 있습니다. - 기본 클라이언트 - - - 원본 오디오 언어 강제로 활성화하기 - 원본 오디오 언어를 사용 중입니다 - 기본 오디오 언어를 사용 중입니다 - - 이 기능을 사용하려면, \'동영상 스트림 속이기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 - - - 디버그 - 디버그 옵션을 활성화하거나 비활성화할 수 있습니다 - 디버그 로그 - 디버그 로그를 활성화합니다 - 디버그 로그를 비활성화합니다 - 로그 스택 트레이스 - 디버그 로그에 로그 스택 트레이스를 포함합니다 - 디버그 로그에 로그 스택 트레이스를 포함하지 않습니다 - ReVanced 오류 메시지 표시하기 - 오류가 발생하면 팝업 메시지를 표시합니다 - 오류가 발생하면 팝업 메시지를 표시하지 않습니다 - "오류 메시지를 비활성화하면 모든 ReVanced 오류 알림이 숨겨집니다. + 이 설정을 비활성화하면 재생 문제가 발생할 수 있습니다. + 기본 클라이언트 + + + 원본 오디오 언어 강제로 활성화하기 + 원본 오디오 언어를 사용 중입니다 + 기본 오디오 언어를 사용 중입니다 + + 이 기능을 사용하려면, \'동영상 스트림 속이기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 + + + 디버그 + 디버그 옵션을 활성화하거나 비활성화할 수 있습니다 + 디버그 로그 + 디버그 로그를 활성화합니다 + 디버그 로그를 비활성화합니다 + 로그 스택 트레이스 + 디버그 로그에 로그 스택 트레이스를 포함합니다 + 디버그 로그에 로그 스택 트레이스를 포함하지 않습니다 + ReVanced 오류 메시지 표시하기 + 오류가 발생하면 팝업 메시지를 표시합니다 + 오류가 발생하면 팝업 메시지를 표시하지 않습니다 + "오류 메시지를 비활성화하면 모든 ReVanced 오류 알림이 숨겨집니다. 예상되지 않은 이벤트에 대한 알림을 받지 못할 수 있습니다." - 디버그 로그 내보내기 - ReVanced 디버그 로그를 클립보드에 복사할 수 있습니다 - 디버그 로그가 비활성화되어 있습니다 - 디버그 로그를 찾을 수 없습니다 - 디버그 로그를 복사하였습니다 - 디버그 로그를 내보낼 수 없습니다: %s - 디버그 로그 지우기 - 저장된 모든 ReVanced 디버그 로그를 지울 수 있습니다 - 디버그 로그가 지워졌습니다 - 기능 플래그 관리자 - 부울 기능 플래그를 관리할 수 있습니다 - 허용된 플래그 (%d) - 차단된 플래그 (%d) - 플래그 검색... - 플래그를 저장하였습니다 - 플래그를 초기화하였습니다 - 플래그를 클립보드에 복사하였습니다 - 로그 프로토콜 버퍼 - 디버그 로그에 프로토콜 버퍼를 포함합니다 - 디버그 로그에 프로토콜 버퍼를 포함하지 않습니다 - "이 설정을 활성화하면 일부 UI 구성 요소에 대한 화면 텍스트를 포함한 추가 레이아웃 데이터가 기록됩니다. + 디버그 로그 내보내기 + ReVanced 디버그 로그를 클립보드에 복사할 수 있습니다 + 디버그 로그가 비활성화되어 있습니다 + 디버그 로그를 찾을 수 없습니다 + 디버그 로그를 복사하였습니다 + 디버그 로그를 내보낼 수 없습니다: %s + 디버그 로그 지우기 + 저장된 모든 ReVanced 디버그 로그를 지울 수 있습니다 + 디버그 로그가 지워졌습니다 + 기능 플래그 관리자 + 부울 기능 플래그를 관리할 수 있습니다 + 허용된 플래그 (%d) + 차단된 플래그 (%d) + 플래그 검색... + 플래그를 저장하였습니다 + 플래그를 초기화하였습니다 + 플래그를 클립보드에 복사하였습니다 + 로그 프로토콜 버퍼 + 디버그 로그에 프로토콜 버퍼를 포함합니다 + 디버그 로그에 프로토콜 버퍼를 포함하지 않습니다 + "이 설정을 활성화하면 일부 UI 구성 요소에 대한 화면 텍스트를 포함한 추가 레이아웃 데이터가 기록됩니다. 이 설정은 사용자 정의 필터를 만들 경우에 구성 요소를 식별하는 데 도움이 될 수 있습니다. 그러나 이 설정을 활성화하면 IP 주소와 같은 일부 사용자 데이터도 기록됩니다." - - - 추적 쿼리를 제거한 링크 공유하기 - 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거합니다 - 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거하지 않습니다 - 공유 링크를 \'youtube.com\'으로 변경하기 - 공유 링크를 \'youtube.com\'으로 사용합니다 - 공유 링크를 \'music.youtube.com\'으로 사용합니다 - - - 사용자 정의 필터 - 사용자 정의 필터를 사용하여 구성요소를 숨길 수 있습니다 - 사용자 정의 필터 활성화하기 - 사용자 정의 필터를 활성화합니다 - 사용자 정의 필터를 비활성화합니다 - 사용자 정의 필터 - - 필터링할 컴포넌트 패스 빌더 문자열을 줄바꿈으로 구분하여 설정합니다 - 잘못된 사용자 정의 필터 값입니다: %s - - - - - 정보 - 광고 - 대체 썸네일 - 피드 - 일반 - 플레이어 - Shorts - 재생바 - 스와이프 제스처 - Return YouTube Dislike - 기타 - 동영상 - 이전 설정 메뉴 복원하기 - 이전 설정 메뉴를 표시합니다 - 이전 설정 메뉴를 표시하지 않습니다 - - - Shorts 백그라운드 재생 비활성화하기 - Shorts 백그라운드 재생을 비활성화합니다 - Shorts 백그라운드 재생을 활성화합니다\n\n알림: Shorts 백그라운드 재생은 PIP 모드를 통해서만 사용할 수 있습니다 - - - 음악 앨범 카드 숨기기 - 검색 결과에서 음악 앨범 카드가 숨겨집니다 - 검색 결과에서 음악 앨범 카드가 표시됩니다 - 아티스트 카드 숨기기 - 아티스트 카드가 숨겨집니다 - 아티스트 카드가 표시됩니다 - \'다른 주제 더 살펴보기\' 선반 숨기기 - \'다른 주제 더 살펴보기\' 선반이 숨겨집니다 - \'다른 주제 더 살펴보기\' 선반이 표시됩니다 - 커뮤니티 게시물 숨기기 - 커뮤니티 게시물이 숨겨집니다 - 커뮤니티 게시물이 표시됩니다 - 소형 배너 숨기기 - 소형 배너가 숨겨집니다 - 소형 배너가 표시됩니다 - 펼쳐볼 수 있는 정보 숨기기 - 썸네일 하단에서 다음 정보들이 숨겨집니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. - 썸네일 하단에서 다음 정보들이 표시됩니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. - 플로팅 마이크 버튼 숨기기 - 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 숨겨집니다 - 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 표시됩니다 - 좌우 슬라이드형 선반 숨기기 - "다음 선반이 숨겨집니다: + + + 추적 쿼리를 제거한 링크 공유하기 + 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거합니다 + 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거하지 않습니다 + 공유 링크를 \'youtube.com\'으로 변경하기 + 공유 링크를 \'youtube.com\'으로 사용합니다 + 공유 링크를 \'music.youtube.com\'으로 사용합니다 + + + 사용자 정의 필터 + 사용자 정의 필터를 사용하여 구성요소를 숨길 수 있습니다 + 사용자 정의 필터 활성화하기 + 사용자 정의 필터를 활성화합니다 + 사용자 정의 필터를 비활성화합니다 + 사용자 정의 필터 + + 필터링할 컴포넌트 패스 빌더 문자열을 줄바꿈으로 구분하여 설정합니다 + 잘못된 사용자 정의 필터 값입니다: %s + + + + + 정보 + 광고 + 대체 썸네일 + 피드 + 일반 + 플레이어 + Shorts + 재생바 + 스와이프 제스처 + Return YouTube Dislike + 기타 + 동영상 + 이전 설정 메뉴 복원하기 + 이전 설정 메뉴를 표시합니다 + 이전 설정 메뉴를 표시하지 않습니다 + + + Shorts 백그라운드 재생 비활성화하기 + Shorts 백그라운드 재생을 비활성화합니다 + Shorts 백그라운드 재생을 활성화합니다\n\n알림: Shorts 백그라운드 재생은 PIP 모드를 통해서만 사용할 수 있습니다 + + + 음악 앨범 카드 숨기기 + 검색 결과에서 음악 앨범 카드가 숨겨집니다 + 검색 결과에서 음악 앨범 카드가 표시됩니다 + 아티스트 카드 숨기기 + 아티스트 카드가 숨겨집니다 + 아티스트 카드가 표시됩니다 + \'다른 주제 더 살펴보기\' 선반 숨기기 + \'다른 주제 더 살펴보기\' 선반이 숨겨집니다 + \'다른 주제 더 살펴보기\' 선반이 표시됩니다 + 커뮤니티 게시물 숨기기 + 커뮤니티 게시물이 숨겨집니다 + 커뮤니티 게시물이 표시됩니다 + 소형 배너 숨기기 + 소형 배너가 숨겨집니다 + 소형 배너가 표시됩니다 + 펼쳐볼 수 있는 정보 숨기기 + 썸네일 하단에서 다음 정보들이 숨겨집니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. + 썸네일 하단에서 다음 정보들이 표시됩니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. + 플로팅 마이크 버튼 숨기기 + 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 숨겨집니다 + 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 표시됩니다 + 좌우 슬라이드형 선반 숨기기 + "다음 선반이 숨겨집니다: • 다시 듣기, 다시 시청하기 • 이어서 시청하기 • 채널 더보기 @@ -259,1029 +258,1029 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 • 라이브 쇼핑 • 보건 정보 출처 • 관련성, etc." - 다음 선반이 표시됩니다:\n• 다시 듣기, 다시 시청하기\n• 이어서 시청하기\n• 채널 더보기\n• 이 게임 더보기\n• 주요 뉴스, 뉴스 속보\n• 맞춤 실시간 스트림\n• 라이브 쇼핑\n• 보건 정보 출처\n• 관련성, etc. - 이미지 선반 숨기기 - 검색 결과에서 이미지 선반이 숨겨집니다 - 검색 결과에서 이미지 선반이 표시됩니다 - 최신 게시물 숨기기 - 최신 게시물이 숨겨집니다 - 최신 게시물이 표시됩니다 - 믹스 재생목록 숨기기 - 믹스 재생목록이 숨겨집니다 - 믹스 재생목록이 표시됩니다 - 영화 선반 숨기기 - 영화 선반이 숨겨집니다 - 영화 선반이 표시됩니다 - - \'알림 받기\' 버튼 숨기기 - 예정 동영상 하단에서 \'알림 받기\' 버튼이 숨겨집니다 - 예정 동영상 하단에서 \'알림 받기\' 버튼이 표시됩니다 - 게임 룸 숨기기 - 게임 룸이 숨겨집니다 - 게임 룸이 표시됩니다 - - \'자세히 보기\' 버튼 숨기기 - 검색 결과에서 \'자세히 보기\' 버튼이 숨겨집니다 - 검색 결과에서 \'자세히 보기\' 버튼이 표시됩니다 - 설문 조사 숨기기 - 설문 조사가 숨겨집니다 - 설문 조사가 표시됩니다 - 콘서트 티켓 선반 숨기기 - 콘서트 티켓 선반이 숨겨집니다 - 콘서트 티켓 선반이 표시됩니다 - - 동영상 추천 라벨 숨기기 - 검색 결과에서 다음 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 - 검색 결과에서 다음 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 - 시각적 공백 숨기기 - 시각적 공백이 숨겨집니다 - 시각적 공백이 표시됩니다 - - YouTube Doodles 숨기기 - 해더 로고에서 YouTube Doodles 애니메이션이 숨겨집니다 - 헤더 로고에서 YouTube Doodles 애니메이션이 표시됩니다 - "YouTube Doodles는 공휴일이나 기념일 등, 그날에 맞춘 디자인으로 변경되는 왼쪽 상단의 YouTube 헤더를 말합니다. + \'자세히 보기\' 버튼 숨기기 + 검색 결과에서 \'자세히 보기\' 버튼이 숨겨집니다 + 검색 결과에서 \'자세히 보기\' 버튼이 표시됩니다 + 설문 조사 숨기기 + 설문 조사가 숨겨집니다 + 설문 조사가 표시됩니다 + 콘서트 티켓 선반 숨기기 + 콘서트 티켓 선반이 숨겨집니다 + 콘서트 티켓 선반이 표시됩니다 + + 동영상 추천 라벨 숨기기 + 검색 결과에서 다음 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 + 검색 결과에서 다음 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 + 시각적 공백 숨기기 + 시각적 공백이 숨겨집니다 + 시각적 공백이 표시됩니다 + + YouTube Doodles 숨기기 + 해더 로고에서 YouTube Doodles 애니메이션이 숨겨집니다 + 헤더 로고에서 YouTube Doodles 애니메이션이 표시됩니다 + "YouTube Doodles는 공휴일이나 기념일 등, 그날에 맞춘 디자인으로 변경되는 왼쪽 상단의 YouTube 헤더를 말합니다. 현재 거주하는 지역에서 YouTube Doodles가 표시되어 있는데 이 설정이 활성화되어 있는 경우에는 검색창 아래에 표시되는 카테고리 바도 숨겨집니다." - 채널바 숨기기 - 채널바가 숨겨집니다 - 채널바가 표시됩니다 - 채널 워터마크 숨기기 - 플레이어 하단에서 채널 워터마크가 숨겨집니다 - 플레이어 하단에서 채널 워터마크가 표시됩니다 - 모금 행사 패널 숨기기 - 모금 행사 패널이 숨겨집니다 - 모금 행사 패널이 표시됩니다 - 긴급 정보 패널 숨기기 - 긴급 정보 패널이 숨겨집니다 - 긴급 정보 패널이 표시됩니다 - 정보 패널 숨기기 - 정보 패널이 숨겨집니다 - 정보 패널이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 보건 정보 패널 숨기기 - 보건 정보 패널이 숨겨집니다 - 보건 정보 패널이 표시됩니다 - 빠른 동작 컨테이너 숨기기 - 전체 화면에서 빠른 동작 컨테이너가 숨겨집니다 - 전체 화면에서 빠른 동작 컨테이너가 표시됩니다 - 관련 동영상 숨기기 - 빠른 동작 컨테이너에서 관련 동영상이 숨겨집니다 - 빠른 동작 컨테이너에서 관련 동영상이 표시됩니다 - 구독자를 위한 커뮤니티 가이드라인 숨기기 - 구독자를 위한 커뮤니티 가이드라인이 숨겨집니다 - 구독자를 위한 커뮤니티 가이드라인이 표시됩니다 - 실시간 이모티콘 리액션 숨기기 - 실시간 이모티콘 리액션이 숨겨집니다 - 실시간 이모티콘 리액션이 표시됩니다 - AI 생성 동영상 요약 숨기기 - AI 생성 동영상 요약 섹션이 숨겨집니다 - AI 생성 동영상 요약 섹션이 표시됩니다 - \'질문하기\' 숨기기 - \'질문하기\' 섹션이 숨겨집니다 - \'질문하기\' 섹션이 표시됩니다 - 속성 숨기기 - 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 숨겨집니다 - 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 표시됩니다 - 챕터 숨기기 - 챕터 섹션이 숨겨집니다 - 챕터 섹션이 표시됩니다 - 이 콘텐츠가 제작된 방식 숨기기 - 이 콘텐츠가 제작된 방식 섹션이 숨겨집니다 - 이 콘텐츠가 제작된 방식 섹션이 표시됩니다 - Hype 점수 숨기기 - Hype 점수가 숨겨집니다 - Hype 점수가 표시됩니다 - \'팟캐스트 살펴보기\' 숨기기 - 팟캐스트 살펴보기 섹션이 숨겨집니다 - 팟캐스트 살펴보기 섹션이 표시됩니다 - 추천 링크 숨기기 - 추천 링크 섹션이 숨겨집니다 - 추천 링크 섹션이 표시됩니다 - 추천 동영상 숨기기 - 추천 동영상 섹션이 숨겨집니다 - 추천 동영상 섹션이 표시됩니다 - 크리에이터 정보 카드 숨기기 - 크리에이터 정보 카드 섹션이 숨겨집니다 - 크리에이터 정보 카드 섹션이 표시됩니다 - 주요 개념 숨기기 - 주요 개념 섹션이 숨겨집니다 - 주요 개념 섹션이 표시됩니다 - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 스크립트 숨기기 - 스크립트 섹션이 숨겨집니다 - 스크립트 섹션이 표시됩니다 - 동영상 설명 - 동영상 설명에서 구성요소를 숨기거나 표시할 수 있습니다 - 카테고리 바 - 피드, 관련 동영상, 검색 결과 그리고 시청 기록에서 카테고리 바를 숨기거나 표시할 수 있습니다 - 피드에서 숨기기 - 피드에서 숨겨집니다 - 피드에서 표시됩니다 - 관련 동영상에서 숨기기 - 관련 동영상에서 숨겨집니다 - 관련 동영상에서 표시됩니다 - 검색 결과에서 숨기기 - 검색 결과에서 숨겨집니다 - 검색 결과에서 표시됩니다 - 시청 기록에서 숨기기 - 시청 기록에서 숨겨집니다 - 시청 기록에서 표시됩니다 - 채널 페이지 - 채널 페이지에서 구성요소를 숨기거나 표시할 수 있습니다 - - 커뮤니티 버튼 숨기기 - 커뮤니티 버튼이 숨겨집니다 - 커뮤니티 버튼이 표시됩니다 - - 추천 선반 숨기기 - 추천 선반이 숨겨집니다 - 추천 선반이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 링크 미리보기 숨기기 - 링크 미리보기가 숨겨집니다 - 링크 미리보기가 표시됩니다 - 멤버십 선반 숨기기 - 멤버십 선반이 숨겨집니다 - 멤버십 선반이 표시됩니다 - - 스토어 버튼 숨기기 - 스토어 버튼이 숨겨집니다 - 스토어 버튼이 표시됩니다 - - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 댓글 - 댓글 섹션에서 구성요소가 숨기거나 표시할 수 있습니다 - AI 채팅 요약 숨기기 - AI 채팅 요약이 숨겨집니다 - AI 채팅 요약이 표시됩니다 - AI 댓글 요약 숨기기 - AI 댓글 요약이 숨겨집니다 - AI 댓글 요약이 표시됩니다 - 채널 가이드라인 숨기기 - 채널 가이드라인이 숨겨집니다 - 채널 가이드라인이 표시됩니다 - 회원별 댓글 헤더 숨기기 - 회원별 댓글 헤더가 숨겨집니다 - 회원별 댓글 헤더가 표시됩니다 - 댓글 섹션 숨기기 - 댓글 섹션이 숨겨집니다 - 댓글 섹션이 표시됩니다 - 커뮤니티 가이드라인 숨기기 - 커뮤니티 가이드라인이 숨겨집니다 - 커뮤니티 가이드라인이 표시됩니다 - Shorts 만들기 버튼 숨기기 - Shorts 만들기 버튼이 숨겨집니다 - Shorts 만들기 버튼이 표시됩니다 - 이모지 & 타임스탬프 버튼 숨기기 - 이모지 & 타임스탬프 버튼이 숨겨집니다 - 이모지 & 타임스탬프 버튼이 표시됩니다 - 댓글 미리보기 숨기기 - 댓글 미리보기가 숨겨집니다 - 댓글 미리보기가 표시됩니다 - Thanks 버튼 숨기기 - Thanks 버튼이 숨겨집니다 - Thanks 버튼이 표시됩니다 - 조회수 숨기기 - 피드 및 검색 결과에서 조회수가 숨겨집니다 - 피드 및 검색 결과에서 조회수가 표시됩니다 - - "제한 사항: + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + 보건 정보 패널 숨기기 + 보건 정보 패널이 숨겨집니다 + 보건 정보 패널이 표시됩니다 + 빠른 동작 컨테이너 숨기기 + 전체 화면에서 빠른 동작 컨테이너가 숨겨집니다 + 전체 화면에서 빠른 동작 컨테이너가 표시됩니다 + 관련 동영상 숨기기 + 빠른 동작 컨테이너에서 관련 동영상이 숨겨집니다 + 빠른 동작 컨테이너에서 관련 동영상이 표시됩니다 + 구독자를 위한 커뮤니티 가이드라인 숨기기 + 구독자를 위한 커뮤니티 가이드라인이 숨겨집니다 + 구독자를 위한 커뮤니티 가이드라인이 표시됩니다 + 실시간 이모티콘 리액션 숨기기 + 실시간 이모티콘 리액션이 숨겨집니다 + 실시간 이모티콘 리액션이 표시됩니다 + AI 생성 동영상 요약 숨기기 + AI 생성 동영상 요약 섹션이 숨겨집니다 + AI 생성 동영상 요약 섹션이 표시됩니다 + \'질문하기\' 숨기기 + \'질문하기\' 섹션이 숨겨집니다 + \'질문하기\' 섹션이 표시됩니다 + 속성 숨기기 + 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 숨겨집니다 + 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 표시됩니다 + 챕터 숨기기 + 챕터 섹션이 숨겨집니다 + 챕터 섹션이 표시됩니다 + 이 콘텐츠가 제작된 방식 숨기기 + 이 콘텐츠가 제작된 방식 섹션이 숨겨집니다 + 이 콘텐츠가 제작된 방식 섹션이 표시됩니다 + Hype 점수 숨기기 + Hype 점수가 숨겨집니다 + Hype 점수가 표시됩니다 + \'팟캐스트 살펴보기\' 숨기기 + 팟캐스트 살펴보기 섹션이 숨겨집니다 + 팟캐스트 살펴보기 섹션이 표시됩니다 + 추천 링크 숨기기 + 추천 링크 섹션이 숨겨집니다 + 추천 링크 섹션이 표시됩니다 + 추천 동영상 숨기기 + 추천 동영상 섹션이 숨겨집니다 + 추천 동영상 섹션이 표시됩니다 + 크리에이터 정보 카드 숨기기 + 크리에이터 정보 카드 섹션이 숨겨집니다 + 크리에이터 정보 카드 섹션이 표시됩니다 + 주요 개념 숨기기 + 주요 개념 섹션이 숨겨집니다 + 주요 개념 섹션이 표시됩니다 + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 스크립트 숨기기 + 스크립트 섹션이 숨겨집니다 + 스크립트 섹션이 표시됩니다 + 동영상 설명 + 동영상 설명에서 구성요소를 숨기거나 표시할 수 있습니다 + 카테고리 바 + 피드, 관련 동영상, 검색 결과 그리고 시청 기록에서 카테고리 바를 숨기거나 표시할 수 있습니다 + 피드에서 숨기기 + 피드에서 숨겨집니다 + 피드에서 표시됩니다 + 관련 동영상에서 숨기기 + 관련 동영상에서 숨겨집니다 + 관련 동영상에서 표시됩니다 + 검색 결과에서 숨기기 + 검색 결과에서 숨겨집니다 + 검색 결과에서 표시됩니다 + 시청 기록에서 숨기기 + 시청 기록에서 숨겨집니다 + 시청 기록에서 표시됩니다 + 채널 페이지 + 채널 페이지에서 구성요소를 숨기거나 표시할 수 있습니다 + + 커뮤니티 버튼 숨기기 + 커뮤니티 버튼이 숨겨집니다 + 커뮤니티 버튼이 표시됩니다 + + 추천 선반 숨기기 + 추천 선반이 숨겨집니다 + 추천 선반이 표시됩니다 + + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + 링크 미리보기 숨기기 + 링크 미리보기가 숨겨집니다 + 링크 미리보기가 표시됩니다 + 멤버십 선반 숨기기 + 멤버십 선반이 숨겨집니다 + 멤버십 선반이 표시됩니다 + + 스토어 버튼 숨기기 + 스토어 버튼이 숨겨집니다 + 스토어 버튼이 표시됩니다 + + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 댓글 + 댓글 섹션에서 구성요소가 숨기거나 표시할 수 있습니다 + AI 채팅 요약 숨기기 + AI 채팅 요약이 숨겨집니다 + AI 채팅 요약이 표시됩니다 + AI 댓글 요약 숨기기 + AI 댓글 요약이 숨겨집니다 + AI 댓글 요약이 표시됩니다 + 채널 가이드라인 숨기기 + 채널 가이드라인이 숨겨집니다 + 채널 가이드라인이 표시됩니다 + 회원별 댓글 헤더 숨기기 + 회원별 댓글 헤더가 숨겨집니다 + 회원별 댓글 헤더가 표시됩니다 + 댓글 섹션 숨기기 + 댓글 섹션이 숨겨집니다 + 댓글 섹션이 표시됩니다 + 커뮤니티 가이드라인 숨기기 + 커뮤니티 가이드라인이 숨겨집니다 + 커뮤니티 가이드라인이 표시됩니다 + Shorts 만들기 버튼 숨기기 + Shorts 만들기 버튼이 숨겨집니다 + Shorts 만들기 버튼이 표시됩니다 + 이모지 & 타임스탬프 버튼 숨기기 + 이모지 & 타임스탬프 버튼이 숨겨집니다 + 이모지 & 타임스탬프 버튼이 표시됩니다 + 댓글 미리보기 숨기기 + 댓글 미리보기가 숨겨집니다 + 댓글 미리보기가 표시됩니다 + Thanks 버튼 숨기기 + Thanks 버튼이 숨겨집니다 + Thanks 버튼이 표시됩니다 + 조회수 숨기기 + 피드 및 검색 결과에서 조회수가 숨겨집니다 + 피드 및 검색 결과에서 조회수가 표시됩니다 + + "제한 사항: • Shorts 선반, 채널 페이지 그리고 검색 결과에서는 조회수가 여전히 표시될 수 있습니다 • 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다" - 업로드 시간 숨기기 - 피드 및 검색 결과에서 업로드 시간이 숨겨집니다 - 피드 및 검색 결과에서 업로드 시간이 표시됩니다 - - "제한 사항: + 업로드 시간 숨기기 + 피드 및 검색 결과에서 업로드 시간이 숨겨집니다 + 피드 및 검색 결과에서 업로드 시간이 표시됩니다 + + "제한 사항: • Shorts 선반, 채널 페이지 그리고 검색 결과에서는 업로드 시간이 여전히 표시될 수 있습니다 • 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다" - 키워드 필터링 - 키워드 필터를 사용하여 검색 결과 및 피드에서 동영상을 숨길 수 있습니다 - 홈 탭에서 키워드 필터 활성화하기 - 홈 탭에서 키워드 필터를 활성화합니다 - 홈 탭에서 키워드 필터를 비활성화합니다 - 검색 결과에서 키워드 필터 활성화하기 - 검색 결과에서 키워드 필터를 활성화합니다 - 검색 결과에서 키워드 필터를 비활성화합니다 - 구독 탭에서 키워드 필터 활성화하기 - 구독 탭에서 키워드 필터를 활성화합니다 - 구독 탭에서 키워드 필터를 비활성화합니다 - 키워드 필터 - - "필터링할 키워드 및 구문을 줄바꿈으로 구분하여 설정합니다 + "필터링할 키워드 및 구문을 줄바꿈으로 구분하여 설정합니다 • 필터링 키워드는 채널 이름 또는 동영상 제목에 표시되는 모든 텍스트가 될 수 있습니다 • 대문자가 있는 단어는 대소문자를 함께 입력해야 합니다 (예: iPhone, TikTok, LeBlanc)" - 키워드 필터링 정보 - "홈 / 구독 / 검색 결과가 필터링되어 키워드 구문과 일치하는 콘텐츠가 숨겨집니다 + 키워드 필터링 정보 + "홈 / 구독 / 검색 결과가 필터링되어 키워드 구문과 일치하는 콘텐츠가 숨겨집니다 제한 사항: • 채널 이름으로 Shorts는 숨길 수 없습니다 • 일부 UI 구성요소는 숨겨지지 않을 수 있습니다 • 필터링 키워드를 검색하면 검색 결과가 표시되지 않을 수 있습니다" - 전체 단어 일치시키기 - - 필터링할 키워드 및 구문을 큰따옴표로 묶으면 동영상 제목과 채널 이름이 부분적으로 일치하지 않도록 방지할 수 있습니다<br><br>예를 들어<br><b>\"ai\"</b>는 다음 동영상을 숨김: <b>AI 커리어 완벽 가이드</b><br>하지만 다음 동영상을 숨기지 못함: <b>생성형AI가 바꿔놓은 세계</b> - - 키워드를 사용할 수 없습니다: %s - 키워드를 사용하려면 따옴표를 추가하세요: %s - 키워드에 충돌하는 선언이 있습니다: %s - 키워드가 너무 짧아서 따옴표가 필요합니다: %s - 키워드가 모든 동영상을 숨길 것입니다: %s - - - 판매자 스토어 선반 숨기기 - 판매자(크리에이터명) 스토어 선반이 숨겨집니다 - 판매자(크리에이터명) 스토어 선반이 표시됩니다 - 최종 화면 스토어 배너 숨기기 - 최종 화면에서 스토어 배너가 숨겨집니다 - 최종 화면에서 스토어 배너가 표시됩니다 - 전체 화면 광고 숨기기 - "전체 화면 광고가 숨겨집니다 + 전체 단어 일치시키기 + + 필터링할 키워드 및 구문을 큰따옴표로 묶으면 동영상 제목과 채널 이름이 부분적으로 일치하지 않도록 방지할 수 있습니다<br><br>예를 들어<br><b>\"ai\"</b>는 다음 동영상을 숨김: <b>AI 커리어 완벽 가이드</b><br>하지만 다음 동영상을 숨기지 못함: <b>생성형AI가 바꿔놓은 세계</b> + + 키워드를 사용할 수 없습니다: %s + 키워드를 사용하려면 따옴표를 추가하세요: %s + 키워드에 충돌하는 선언이 있습니다: %s + 키워드가 너무 짧아서 따옴표가 필요합니다: %s + 키워드가 모든 동영상을 숨길 것입니다: %s + + + 판매자 스토어 선반 숨기기 + 판매자(크리에이터명) 스토어 선반이 숨겨집니다 + 판매자(크리에이터명) 스토어 선반이 표시됩니다 + 최종 화면 스토어 배너 숨기기 + 최종 화면에서 스토어 배너가 숨겨집니다 + 최종 화면에서 스토어 배너가 표시됩니다 + 전체 화면 광고 숨기기 + "전체 화면 광고가 숨겨집니다 이 기능은 구형 기기에서만 사용할 수 있습니다" - 전체 화면 광고가 표시됩니다 - - \'전체 화면 광고 숨기기\'는 구형 기기에서만 사용할 수 있습니다 - 일반 레이아웃 광고 숨기기 - 일반 레이아웃 광고가 숨겨집니다 - 일반 레이아웃 광고가 표시됩니다 - 매장 쇼핑 배너 숨기기 - 매장 쇼핑 배너가 숨겨집니다 - 매장 쇼핑 배너가 표시됩니다 - 유료 광고 포함 라벨 숨기기 - 유료 광고 포함 라벨이 숨겨집니다 - 유료 광고 포함 라벨이 표시됩니다 - 셀프 스폰서 카드 숨기기 - 셀프 스폰서 카드가 숨겨집니다 - 셀프 스폰서 카드가 표시됩니다 - 쇼핑 링크 숨기기 - 동영상 설명에서 쇼핑 링크가 숨겨집니다 - 동영상 설명에서 쇼핑 링크가 표시됩니다 - \'제품 보기\' 배너 숨기기 - 플레이어에서 제품 보기 배너가 숨겨집니다 - 플레이어에서 제품 보기 배너가 표시됩니다 - 웹 검색 결과 숨기기 - 웹 검색 결과가 숨겨집니다 - 웹 검색 결과가 표시됩니다 - - - YouTube Premium 프로모션 숨기기 - YouTube Premium 프로모션이 숨겨집니다 - YouTube Premium 프로모션이 표시됩니다 - - - 동영상 광고 숨기기 - 동영상 광고가 숨겨집니다 - 동영상 광고가 표시됩니다 - - - URL을 클립보드에 복사하였습니다 - 타임스탬프가 표기된 URL을 클립보드에 복사하였습니다 - 동영상 URL 복사 버튼 표시하기 - 동영상 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기된 동영상 URL이 복사됩니다 - 동영상 URL 복사 버튼이 표시되지 않습니다 - 타임스탬프 URL 복사 버튼 표시하기 - 타임스탬프가 표기된 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 타임스탬프가 표기된 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기되지 않은 동영상 URL이 복사됩니다 - 타임스탬프가 표기된 URL 복사 버튼이 표시되지 않습니다 - - - 시청 경고 다이얼로그 제거하기 - 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다 - 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다 - 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다. - - - \'TV에 로그인\' 팝업 비활성화하기 - \'TV에 로그인\' 팝업을 비활성화합니다 - \'TV에 로그인\' 팝업을 활성화합니다 - - - 두 번 탭하여 챕터 건너뛰기 비활성화하기 - 두 번 탭하여 다음/이전 챕터로 건너뛰기가 절대 트리거될 수 없습니다 - 두 번 탭하여 다음/이전 챕터로 건너뛰기가 가끔 트리거될 수 있습니다 - - - 외부 다운로드 - 외부 다운로더를 설정할 수 있습니다 - 외부 다운로드 버튼 표시하기 - 플레이어에서 외부 다운로드 버튼을 표시합니다 - 플레이어에서 외부 다운로드 버튼을 표시하지 않습니다 - - 오프라인 저장 버튼 재정의하기 - 오프라인 저장 버튼으로 외부 다운로더를 실행할 수 있습니다 - 오프라인 저장 버튼으로 기본 다운로더를 실행할 수 있습니다 - 외부 다운로더 앱 패키지명 - 설치된 외부 다운로더 앱 패키지명을 설정하세요 - 앱 패키지명을 입력하세요 - 기타 - 앱이 설치되지 않습니다 - %s 는 설치되어 있지 않습니다. 설치하세요 - "패키지 이름이 '%s'인 설치된 앱을 찾을 수 없습니다 + 전체 화면 광고가 표시됩니다 + + \'전체 화면 광고 숨기기\'는 구형 기기에서만 사용할 수 있습니다 + 일반 레이아웃 광고 숨기기 + 일반 레이아웃 광고가 숨겨집니다 + 일반 레이아웃 광고가 표시됩니다 + 매장 쇼핑 배너 숨기기 + 매장 쇼핑 배너가 숨겨집니다 + 매장 쇼핑 배너가 표시됩니다 + 유료 광고 포함 라벨 숨기기 + 유료 광고 포함 라벨이 숨겨집니다 + 유료 광고 포함 라벨이 표시됩니다 + 셀프 스폰서 카드 숨기기 + 셀프 스폰서 카드가 숨겨집니다 + 셀프 스폰서 카드가 표시됩니다 + 쇼핑 링크 숨기기 + 동영상 설명에서 쇼핑 링크가 숨겨집니다 + 동영상 설명에서 쇼핑 링크가 표시됩니다 + \'제품 보기\' 배너 숨기기 + 플레이어에서 제품 보기 배너가 숨겨집니다 + 플레이어에서 제품 보기 배너가 표시됩니다 + 웹 검색 결과 숨기기 + 웹 검색 결과가 숨겨집니다 + 웹 검색 결과가 표시됩니다 + + + YouTube Premium 프로모션 숨기기 + YouTube Premium 프로모션이 숨겨집니다 + YouTube Premium 프로모션이 표시됩니다 + + + 동영상 광고 숨기기 + 동영상 광고가 숨겨집니다 + 동영상 광고가 표시됩니다 + + + URL을 클립보드에 복사하였습니다 + 타임스탬프가 표기된 URL을 클립보드에 복사하였습니다 + 동영상 URL 복사 버튼 표시하기 + 동영상 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기된 동영상 URL이 복사됩니다 + 동영상 URL 복사 버튼이 표시되지 않습니다 + 타임스탬프 URL 복사 버튼 표시하기 + 타임스탬프가 표기된 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 타임스탬프가 표기된 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기되지 않은 동영상 URL이 복사됩니다 + 타임스탬프가 표기된 URL 복사 버튼이 표시되지 않습니다 + + + 시청 경고 다이얼로그 제거하기 + 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다 + 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다 + 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다. + + + \'TV에 로그인\' 팝업 비활성화하기 + \'TV에 로그인\' 팝업을 비활성화합니다 + \'TV에 로그인\' 팝업을 활성화합니다 + + + 두 번 탭하여 챕터 건너뛰기 비활성화하기 + 두 번 탭하여 다음/이전 챕터로 건너뛰기가 절대 트리거될 수 없습니다 + 두 번 탭하여 다음/이전 챕터로 건너뛰기가 가끔 트리거될 수 있습니다 + + + 외부 다운로드 + 외부 다운로더를 설정할 수 있습니다 + 외부 다운로드 버튼 표시하기 + 플레이어에서 외부 다운로드 버튼을 표시합니다 + 플레이어에서 외부 다운로드 버튼을 표시하지 않습니다 + + 오프라인 저장 버튼 재정의하기 + 오프라인 저장 버튼으로 외부 다운로더를 실행할 수 있습니다 + 오프라인 저장 버튼으로 기본 다운로더를 실행할 수 있습니다 + 외부 다운로더 앱 패키지명 + 설치된 외부 다운로더 앱 패키지명을 설정하세요 + 앱 패키지명을 입력하세요 + 기타 + 앱이 설치되지 않습니다 + %s 는 설치되어 있지 않습니다. 설치하세요 + "패키지 이름이 '%s'인 설치된 앱을 찾을 수 없습니다 패키지 이름이 올바르고 앱이 설치되어 있는지 확인하세요" - 패키지명은 비워둘 수 없습니다 - - - 세밀한 탐색 제스처 비활성화하기 - 세밀한 탐색 제스처를 비활성화합니다 - 세밀한 탐색 제스처를 활성화합니다 - - - 재생바 터치 조작 활성화하기 - 재생바 터치 조작을 활성화합니다 - 재생바 터치 조작을 비활성화합니다 - - - 스와이프 제스처로 밝기 조절 활성화하기 - "전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절합니다" - 전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절하지 않습니다 - 스와이프 제스처로 볼륨 조절 활성화하기 - "전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절합니다" - 전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절하지 않습니다 - 길게 탭하여 스와이프 제스처 사용하기 - 화면을 길게 탭하여 스와이프 제스처를 사용합니다 - 화면을 짧게 탭하여 스와이프 제스처를 사용합니다 - 진동 피드백 활성화하기 - 진동 피드백을 활성화합니다 - 진동 피드백을 비활성화합니다 - 화면 밝기 저장 및 복원 활성화하기 - 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원합니다 - 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원하지 않습니다 - 스와이프 제스처로 자동 밝기 활성화하기 - 전체 화면에서 스와이프하여 밝기가 0이 되면 자동 밝기를 활성화합니다 - 전체 화면에서 스와이프하여 밝기가 0이 되더라도 자동 밝기를 활성화하지 않습니다 - 자동 - 스와이프 오버레이 타임아웃 - 오버레이가 표시되는 시간을 지정할 수 있습니다 (밀리초) - 스와이프 오버레이 배경 불투명도 - 배경 불투명도 값을 0-100 사이에서 지정할 수 있습니다 - 스와이프 배경 불투명도 값은 0-100 사이여야 합니다 - 스와이프 오버레이 밝기 조절바 색상 - 밝기 조절 진행률 색상을 지정할 수 있습니다 - 스와이프 오버레이 볼륨 조절바 색상 - 볼륨 조절 진행률 색상을 지정할 수 있습니다 - 스와이프 오버레이 텍스트 크기 - 텍스트 크기를 1-30 사이에서 지정할 수 있습니다 - 텍스트 크기는 1-30 사이여야 합니다 - 스와이프 한계치 - 제스처 인식을 위해 얼마나 스와이프를 해야 할지를 지정할 수 있으며, 원하지 않은 제스처 인식을 방지할 수 있습니다 - 볼륨 스와이프 민감도 - 스와이프할 때마다 볼륨이 얼마나 변경되는지를 지정할 수 있습니다 - 스와이프 오버레이 스타일 - 가로 - 가로 (최소화 - 상단) - 가로 (최소화 - 중앙) - 원형 - 원형 (최소화) - 세로 - 세로 (최소화) - 스와이프 제스처로 동영상 전환 비활성화하기 - 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환합니다 - 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환하지 않습니다 - - - 자동 자막 비활성화하기 - 자동 자막을 비활성화합니다 - 자동 자막을 활성화합니다 - - - 동작 버튼 - 플레이어 하단에서 동작 버튼을 숨기거나 표시할 수 있습니다 - 빛나는 \'좋아요\' / \'구독\' 비활성화하기 - 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용하지 않습니다 - 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용합니다 - 좋아요 & 싫어요 숨기기 - 좋아요 & 싫어요 버튼이 숨겨집니다 - 좋아요 & 싫어요 버튼이 표시됩니다 - - 공유 숨기기 - 공유 버튼이 숨겨집니다 - 공유 버튼이 표시됩니다 - - 광고 중지 숨기기 - 광고 중지 버튼이 숨겨집니다 - 광고 중지 버튼이 표시됩니다 - - 댓글 숨기기 - 댓글 버튼이 숨겨집니다 - 댓글 버튼이 표시됩니다 - + + 세밀한 탐색 제스처 비활성화하기 + 세밀한 탐색 제스처를 비활성화합니다 + 세밀한 탐색 제스처를 활성화합니다 + + + 재생바 터치 조작 활성화하기 + 재생바 터치 조작을 활성화합니다 + 재생바 터치 조작을 비활성화합니다 + + + 스와이프 제스처로 밝기 조절 활성화하기 + "전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절합니다" + 전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절하지 않습니다 + 스와이프 제스처로 볼륨 조절 활성화하기 + "전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절합니다" + 전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절하지 않습니다 + 길게 탭하여 스와이프 제스처 사용하기 + 화면을 길게 탭하여 스와이프 제스처를 사용합니다 + 화면을 짧게 탭하여 스와이프 제스처를 사용합니다 + 진동 피드백 활성화하기 + 진동 피드백을 활성화합니다 + 진동 피드백을 비활성화합니다 + 화면 밝기 저장 및 복원 활성화하기 + 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원합니다 + 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원하지 않습니다 + 스와이프 제스처로 자동 밝기 활성화하기 + 전체 화면에서 스와이프하여 밝기가 0이 되면 자동 밝기를 활성화합니다 + 전체 화면에서 스와이프하여 밝기가 0이 되더라도 자동 밝기를 활성화하지 않습니다 + 자동 + 스와이프 오버레이 타임아웃 + 오버레이가 표시되는 시간을 지정할 수 있습니다 (밀리초) + 스와이프 오버레이 배경 불투명도 + 배경 불투명도 값을 0-100 사이에서 지정할 수 있습니다 + 스와이프 배경 불투명도 값은 0-100 사이여야 합니다 + 스와이프 오버레이 밝기 조절바 색상 + 밝기 조절 진행률 색상을 지정할 수 있습니다 + 스와이프 오버레이 볼륨 조절바 색상 + 볼륨 조절 진행률 색상을 지정할 수 있습니다 + 스와이프 오버레이 텍스트 크기 + 텍스트 크기를 1-30 사이에서 지정할 수 있습니다 + 텍스트 크기는 1-30 사이여야 합니다 + 스와이프 한계치 + 제스처 인식을 위해 얼마나 스와이프를 해야 할지를 지정할 수 있으며, 원하지 않은 제스처 인식을 방지할 수 있습니다 + 볼륨 스와이프 민감도 + 스와이프할 때마다 볼륨이 얼마나 변경되는지를 지정할 수 있습니다 + 스와이프 오버레이 스타일 + 가로 + 가로 (최소화 - 상단) + 가로 (최소화 - 중앙) + 원형 + 원형 (최소화) + 세로 + 세로 (최소화) + 스와이프 제스처로 동영상 전환 비활성화하기 + 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환합니다 + 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환하지 않습니다 + + + 자동 자막 비활성화하기 + 자동 자막을 비활성화합니다 + 자동 자막을 활성화합니다 + + + 동작 버튼 + 플레이어 하단에서 동작 버튼을 숨기거나 표시할 수 있습니다 + 빛나는 \'좋아요\' / \'구독\' 비활성화하기 + 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용하지 않습니다 + 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용합니다 + 좋아요 & 싫어요 숨기기 + 좋아요 & 싫어요 버튼이 숨겨집니다 + 좋아요 & 싫어요 버튼이 표시됩니다 + + 공유 숨기기 + 공유 버튼이 숨겨집니다 + 공유 버튼이 표시됩니다 + + 광고 중지 숨기기 + 광고 중지 버튼이 숨겨집니다 + 광고 중지 버튼이 표시됩니다 + + 댓글 숨기기 + 댓글 버튼이 숨겨집니다 + 댓글 버튼이 표시됩니다 + - 신고 숨기기 - 신고 버튼이 숨겨집니다 - 신고 버튼이 표시됩니다 - - 리믹스 숨기기 - 리믹스 버튼이 숨겨집니다 - 리믹스 버튼이 표시됩니다 - - 오프라인 저장 숨기기 - 오프라인 저장 버튼이 숨겨집니다 - 오프라인 저장 버튼이 표시됩니다 - + 리믹스 숨기기 + 리믹스 버튼이 숨겨집니다 + 리믹스 버튼이 표시됩니다 + + 오프라인 저장 숨기기 + 오프라인 저장 버튼이 숨겨집니다 + 오프라인 저장 버튼이 표시됩니다 + - Hype 숨기기 - Hype 버튼이 숨겨집니다 - Hype 버튼이 표시됩니다 - - 프로모션 숨기기 - 프로모션 버튼이 숨겨집니다 - 프로모션 버튼이 표시됩니다 - - Thanks 숨기기 - Thanks 버튼이 숨겨집니다 - Thanks 버튼이 표시됩니다 - + 프로모션 숨기기 + 프로모션 버튼이 숨겨집니다 + 프로모션 버튼이 표시됩니다 + + Thanks 숨기기 + Thanks 버튼이 숨겨집니다 + Thanks 버튼이 표시됩니다 + - \'질문하기\' 숨기기 - \'질문하기\' 버튼이 숨겨집니다 - \'질문하기\' 버튼이 표시됩니다 - - 클립 숨기기 - 클립 버튼이 숨겨집니다 - 클립 버튼이 표시됩니다 - - 쇼핑 숨기기 - 쇼핑 버튼이 숨겨집니다 - 쇼핑 버튼이 표시됩니다 - - 저장 숨기기 - 저장 버튼이 숨겨집니다 - 저장 버튼이 표시됩니다 - - - 하단바 버튼 - 하단바에서 버튼을 숨기거나 변경할 수 있습니다 - - 홈 숨기기 - 홈 버튼이 숨겨집니다 - 홈 버튼이 표시됩니다 - - Shorts 숨기기 - Shorts 버튼이 숨겨집니다 - Shorts 버튼이 표시됩니다 - - 만들기 숨기기 - 만들기 버튼이 숨겨집니다 - 만들기 버튼이 표시됩니다 - - 구독 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 알림 숨기기 - 알림 버튼이 숨겨집니다 - 알림 버튼이 표시됩니다 - - 만들기와 알림 위치 교환하기 - "만들기 버튼과 알림 버튼의 위치를 교환합니다 + \'질문하기\' 숨기기 + \'질문하기\' 버튼이 숨겨집니다 + \'질문하기\' 버튼이 표시됩니다 + + 클립 숨기기 + 클립 버튼이 숨겨집니다 + 클립 버튼이 표시됩니다 + + 쇼핑 숨기기 + 쇼핑 버튼이 숨겨집니다 + 쇼핑 버튼이 표시됩니다 + + 저장 숨기기 + 저장 버튼이 숨겨집니다 + 저장 버튼이 표시됩니다 + + + 하단바 버튼 + 하단바에서 버튼을 숨기거나 변경할 수 있습니다 + + 홈 숨기기 + 홈 버튼이 숨겨집니다 + 홈 버튼이 표시됩니다 + + Shorts 숨기기 + Shorts 버튼이 숨겨집니다 + Shorts 버튼이 표시됩니다 + + 만들기 숨기기 + 만들기 버튼이 숨겨집니다 + 만들기 버튼이 표시됩니다 + + 구독 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 알림 숨기기 + 알림 버튼이 숨겨집니다 + 알림 버튼이 표시됩니다 + + 만들기와 알림 위치 교환하기 + "만들기 버튼과 알림 버튼의 위치를 교환합니다 알림: 이 설정을 활성화하면 동영상 광고가 강제로 숨겨집니다" - 만들기 버튼과 알림 버튼의 위치를 교환하지 않습니다 - "이 설정을 비활성화하면 Shorts 광고가 차단되지 않습니다. + 만들기 버튼과 알림 버튼의 위치를 교환하지 않습니다 + "이 설정을 비활성화하면 Shorts 광고가 차단되지 않습니다. 이 설정을 변경해도 적용되지 않는다면 시크릿 모드로 전환해 보세요." - 하단바 버튼 라벨 숨기기 - 하단바 버튼 라벨이 숨겨집니다 - 하단바 버튼 라벨이 표시됩니다 - 반투명 상태바 비활성화하기 - 상태바가 불투명합니다 - 상태바가 불투명하거나 반투명합니다 - 일부 기기에서는 이 기능을 활성화하면 시스템 네비게이션 바가 투명하게 변경될 수 있습니다. - 밝은 반투명 하단바 비활성화하기 - 밝은 테마에서 하단바가 불투명합니다 - 밝은 테마에서 하단바가 불투명하거나 반투명합니다 - 어두운 반투명 하단바 비활성화하기 - 어두운 테마에서 하단바가 불투명합니다 - 어두운 테마에서 하단바가 불투명하거나 반투명합니다 - - - 메뉴 구성요소 - 플레이어에서 메뉴 구성요소를 숨기거나 표시할 수 있습니다 - - 자막 숨기기 - 자막 메뉴가 숨겨집니다 - 자막 메뉴가 표시됩니다 - - 추가 설정 숨기기 - 추가 설정 메뉴가 숨겨집니다 - 추가 설정 메뉴가 표시됩니다 - - 취침 타이머 숨기기 - 취침 타이머 메뉴가 숨겨집니다 - 취침 타이머 메뉴가 표시됩니다 - - 동영상 연속 재생 숨기기 - 동영상 연속 재생 메뉴가 숨겨집니다 - 동영상 연속 재생 메뉴가 표시됩니다 - - 앰비언트 모드 숨기기 - 앰비언트 모드 메뉴가 숨겨집니다 - 앰비언트 모드 메뉴가 표시됩니다 - 안정적인 볼륨 숨기기 - 안정적인 볼륨 메뉴가 표시됩니다 - 안정적인 볼륨 메뉴가 숨겨집니다 - - 고객센터 숨기기 - 고객센터 메뉴가 숨겨집니다 - 고객센터 메뉴가 표시됩니다 - - 재생 속도 숨기기 - 재생 속도 메뉴가 숨겨집니다 - 재생 속도 메뉴가 표시됩니다 - - 잠금 화면 숨기기 - 잠금 화면 메뉴가 숨겨집니다 - 잠금 화면 메뉴가 표시됩니다 - - YouTube Music으로 음악 감상 숨기기 - YouTube Music으로 음악 감상 메뉴가 숨겨집니다 - YouTube Music으로 음악 감상 메뉴가 표시됩니다 - - 오디오 트랙 숨기기 - 오디오 트랙 메뉴가 숨겨집니다 - 오디오 트랙 메뉴가 표시됩니다 - + + 메뉴 구성요소 + 플레이어에서 메뉴 구성요소를 숨기거나 표시할 수 있습니다 + + 자막 숨기기 + 자막 메뉴가 숨겨집니다 + 자막 메뉴가 표시됩니다 + + 추가 설정 숨기기 + 추가 설정 메뉴가 숨겨집니다 + 추가 설정 메뉴가 표시됩니다 + + 취침 타이머 숨기기 + 취침 타이머 메뉴가 숨겨집니다 + 취침 타이머 메뉴가 표시됩니다 + + 동영상 연속 재생 숨기기 + 동영상 연속 재생 메뉴가 숨겨집니다 + 동영상 연속 재생 메뉴가 표시됩니다 + + 앰비언트 모드 숨기기 + 앰비언트 모드 메뉴가 숨겨집니다 + 앰비언트 모드 메뉴가 표시됩니다 + 안정적인 볼륨 숨기기 + 안정적인 볼륨 메뉴가 표시됩니다 + 안정적인 볼륨 메뉴가 숨겨집니다 + + 고객센터 숨기기 + 고객센터 메뉴가 숨겨집니다 + 고객센터 메뉴가 표시됩니다 + + 재생 속도 숨기기 + 재생 속도 메뉴가 숨겨집니다 + 재생 속도 메뉴가 표시됩니다 + + 잠금 화면 숨기기 + 잠금 화면 메뉴가 숨겨집니다 + 잠금 화면 메뉴가 표시됩니다 + + YouTube Music으로 음악 감상 숨기기 + YouTube Music으로 음악 감상 메뉴가 숨겨집니다 + YouTube Music으로 음악 감상 메뉴가 표시됩니다 + + 오디오 트랙 숨기기 + 오디오 트랙 메뉴가 숨겨집니다 + 오디오 트랙 메뉴가 표시됩니다 + - "오디오 트랙 메뉴가 숨겨집니다 + "오디오 트랙 메뉴가 숨겨집니다 오디오 트랙 메뉴를 표시하려면, '동영상 스트림 속이기'에서 기본 클라이언트를 'Android No SDK'로 변경하세요" - - VR로 보기 숨기기 - VR로 보기 메뉴가 숨겨집니다 - VR로 보기 메뉴가 표시됩니다 - 동영상 화질 메뉴 숨기기 - 동영상 화질 메뉴가 숨겨집니다 - 동영상 화질 메뉴가 표시됩니다 - 동영상 화질 메뉴에서 하단 설명 숨기기 - 화질 설정 메뉴에서 하단 설명이 숨겨집니다 - 화질 설정 메뉴에서 하단 설명이 표시됩니다 - - - 자동재생 버튼 숨기기 - 자동재생 버튼이 숨겨집니다 - 자동재생 버튼이 표시됩니다 - - 자막 버튼 숨기기 - 자막 버튼이 숨겨집니다 - 자막 버튼이 표시됩니다 - 크롬캐스트 버튼 숨기기 - 크롬캐스트 버튼이 숨겨집니다 - 크롬캐스트 버튼이 표시됩니다 - 플레이어 컨트롤 버튼 배경 숨기기 - 플레이어 컨트롤 버튼 배경이 숨겨집니다 - 플레이어 컨트롤 버튼 배경이 표시됩니다 - 이전 & 다음 버튼 숨기기 - 이전 & 다음 동영상 버튼이 숨겨집니다 - 이전 & 다음 동영상 버튼이 표시됩니다 - - - 최종 화면 카드 숨기기 - 최종 화면 카드가 숨겨집니다 - 최종 화면 카드가 표시됩니다 - - - 전체 화면 앰비언트 모드 비활성화하기 - 앰비언트 모드를 비활성화합니다 - 앰비언트 모드를 활성화합니다 - - - 정보 카드 숨기기 - 정보 카드가 숨겨집니다 - 정보 카드가 표시됩니다 - - - 롤링 넘버 애니메이션 비활성화하기 - 롤링 넘버 애니메이션을 비활성화합니다 - 롤링 넘버 애니메이션을 활성화합니다 - - - 동영상 플레이어 재생바 숨기기 - 동영상 플레이어 재생바가 숨겨집니다 - 동영상 플레이어 재생바가 표시됩니다 - - 동영상 썸네일 재생바 숨기기 - 동영상 썸네일 재생바가 숨겨집니다 - 동영상 썸네일 재생바가 표시됩니다 - - - Shorts 플레이어 - Shorts 플레이어에서 구성요소를 숨기거나 표시할 수 있습니다 - - 홈 피드에서 Shorts 숨기기 - 홈 피드 및 관련 동영상에서 숨겨집니다 - 홈 피드 및 관련 동영상에서 표시됩니다 - 검색 결과에서 Shorts 숨기기 - 검색 결과에서 숨겨집니다 - 검색 결과에서 표시됩니다 - - 구독 피드에서 Shorts 숨기기 - 구독 피드에서 숨겨집니다 - 구독 피드에서 표시됩니다 - 시청 기록에서 Shorts 숨기기 - 시청 기록에서 숨겨집니다 - 시청 기록에서 표시됩니다 - 자동 더빙 라벨 숨기기 - 자동 더빙 라벨이 숨겨집니다 - 자동 더빙 라벨이 표시됩니다 - Super Thanks 구매 버튼 숨기기 - Super Thanks 구매 버튼이 숨겨집니다 - Super Thanks 구매 버튼이 표시됩니다 - 효과 버튼 숨기기 - 효과 버튼이 숨겨집니다 - 효과 버튼이 표시됩니다 - 그린 스크린 버튼 숨기기 - 그린 스크린 버튼이 숨겨집니다 - 그린 스크린 버튼이 표시됩니다 - 해시태그 버튼 숨기기 - 해시태그 버튼이 숨겨집니다 - 해시태그 버튼이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 라이브 미리보기 숨기기 - 라이브 미리보기가 숨겨집니다 - 라이브 미리보기가 표시됩니다 - 위치 라벨 숨기기 - 위치 라벨이 숨겨집니다 - 위치 라벨이 표시됩니다 - 새로운 게시물 버튼 숨기기 - 새로운 게시물 버튼이 숨겨집니다 - 새로운 게시물 버튼이 표시됩니다 - 일시 정지 오버레이 버튼 숨기기 - 플레이어 왼쪽 상단에서 다음 버튼들이 숨겨집니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 - 플레이어 왼쪽 상단에서 다음 버튼들이 표시됩니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 - 댓글 미리보기 숨기기 - 댓글 미리보기가 숨겨집니다 - 댓글 미리보기가 표시됩니다 - 음악 저장 버튼 숨기기 - 음악 저장 버튼이 숨겨집니다 - 음악 저장 버튼이 표시됩니다 - 검색 추천 숨기기 - 검색 추천이 숨겨집니다 - 검색 추천이 표시됩니다 - 쇼핑 버튼 숨기기 - 쇼핑 버튼이 숨겨집니다 - 쇼핑 버튼이 표시됩니다 - 스티커 숨기기 - 스티커가 숨겨집니다 - 스티커가 표시됩니다 - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 태그된 제품 숨기기 - 태그된 제품이 숨겨집니다 - 태그된 제품이 표시됩니다 - 예정된 라이브 버튼 숨기기 - 예정된 라이브 버튼이 숨겨집니다 - 예정된 라이브 버튼이 표시됩니다 - 이 사운드 사용 버튼 숨기기 - 이 사운드 사용 버튼이 숨겨집니다 - 이 사운드 사용 버튼이 표시됩니다 - 템플릿 사용 버튼 숨기기 - 템플릿 사용 버튼이 숨겨집니다 - 템플릿 사용 버튼이 표시됩니다 - 좋아요 버튼 애니메이션을 비활성화하기 - 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다 - 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다 - 좋아요 버튼 숨기기 - 좋아요 버튼이 숨겨집니다 - 좋아요 버튼이 표시됩니다 - 싫어요 버튼 숨기기 - 싫어요 버튼이 숨겨집니다 - 싫어요 버튼이 표시됩니다 - 댓글 버튼 숨기기 - 댓글 버튼이 숨겨집니다 - 댓글 버튼이 표시됩니다 - - 공유 버튼 숨기기 - 공유 버튼이 숨겨집니다 - 공유 버튼이 표시됩니다 - - 리믹스 버튼 숨기기 - 리믹스 버튼이 숨겨집니다 - 리믹스 버튼이 표시됩니다 - 사운드 버튼 숨기기 - 사운드 버튼이 숨겨집니다 - 사운드 버튼이 표시됩니다 - 정보 패널 숨기기 - 정보 패널이 숨겨집니다 - 정보 패널이 표시됩니다 - 채널바 숨기기 - 채널바가 숨겨집니다 - 채널바가 표시됩니다 - 동영상 제목 숨기기 - 동영상 제목이 숨겨집니다 - 동영상 제목이 표시됩니다 - 사운드 메타데이터 라벨 숨기기 - 사운드 메타데이터 라벨이 숨겨집니다 - 사운드 메타데이터 라벨이 표시됩니다 - 동영상 링크 라벨 숨기기 - 동영상 링크 라벨이 숨겨집니다 - 동영상 링크 라벨이 표시됩니다 - 하단바 숨기기 - 하단바가 숨겨집니다 - 하단바가 표시됩니다 - - - 최종 화면 추천 동영상 숨기기 - "자동재생이 꺼져 있을 경우에 최종 화면에서 추천 동영상이 숨겨집니다 + + VR로 보기 숨기기 + VR로 보기 메뉴가 숨겨집니다 + VR로 보기 메뉴가 표시됩니다 + 동영상 화질 메뉴 숨기기 + 동영상 화질 메뉴가 숨겨집니다 + 동영상 화질 메뉴가 표시됩니다 + 동영상 화질 메뉴에서 하단 설명 숨기기 + 화질 설정 메뉴에서 하단 설명이 숨겨집니다 + 화질 설정 메뉴에서 하단 설명이 표시됩니다 + + + 자동재생 버튼 숨기기 + 자동재생 버튼이 숨겨집니다 + 자동재생 버튼이 표시됩니다 + + 자막 버튼 숨기기 + 자막 버튼이 숨겨집니다 + 자막 버튼이 표시됩니다 + 크롬캐스트 버튼 숨기기 + 크롬캐스트 버튼이 숨겨집니다 + 크롬캐스트 버튼이 표시됩니다 + 플레이어 컨트롤 버튼 배경 숨기기 + 플레이어 컨트롤 버튼 배경이 숨겨집니다 + 플레이어 컨트롤 버튼 배경이 표시됩니다 + 이전 & 다음 버튼 숨기기 + 이전 & 다음 동영상 버튼이 숨겨집니다 + 이전 & 다음 동영상 버튼이 표시됩니다 + + + 최종 화면 카드 숨기기 + 최종 화면 카드가 숨겨집니다 + 최종 화면 카드가 표시됩니다 + + + 전체 화면 앰비언트 모드 비활성화하기 + 앰비언트 모드를 비활성화합니다 + 앰비언트 모드를 활성화합니다 + + + 정보 카드 숨기기 + 정보 카드가 숨겨집니다 + 정보 카드가 표시됩니다 + + + 롤링 넘버 애니메이션 비활성화하기 + 롤링 넘버 애니메이션을 비활성화합니다 + 롤링 넘버 애니메이션을 활성화합니다 + + + 동영상 플레이어 재생바 숨기기 + 동영상 플레이어 재생바가 숨겨집니다 + 동영상 플레이어 재생바가 표시됩니다 + + 동영상 썸네일 재생바 숨기기 + 동영상 썸네일 재생바가 숨겨집니다 + 동영상 썸네일 재생바가 표시됩니다 + + + Shorts 플레이어 + Shorts 플레이어에서 구성요소를 숨기거나 표시할 수 있습니다 + + 홈 피드에서 Shorts 숨기기 + 홈 피드 및 관련 동영상에서 숨겨집니다 + 홈 피드 및 관련 동영상에서 표시됩니다 + 검색 결과에서 Shorts 숨기기 + 검색 결과에서 숨겨집니다 + 검색 결과에서 표시됩니다 + + 구독 피드에서 Shorts 숨기기 + 구독 피드에서 숨겨집니다 + 구독 피드에서 표시됩니다 + 시청 기록에서 Shorts 숨기기 + 시청 기록에서 숨겨집니다 + 시청 기록에서 표시됩니다 + 자동 더빙 라벨 숨기기 + 자동 더빙 라벨이 숨겨집니다 + 자동 더빙 라벨이 표시됩니다 + Super Thanks 구매 버튼 숨기기 + Super Thanks 구매 버튼이 숨겨집니다 + Super Thanks 구매 버튼이 표시됩니다 + 효과 버튼 숨기기 + 효과 버튼이 숨겨집니다 + 효과 버튼이 표시됩니다 + 그린 스크린 버튼 숨기기 + 그린 스크린 버튼이 숨겨집니다 + 그린 스크린 버튼이 표시됩니다 + 해시태그 버튼 숨기기 + 해시태그 버튼이 숨겨집니다 + 해시태그 버튼이 표시됩니다 + + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + 라이브 미리보기 숨기기 + 라이브 미리보기가 숨겨집니다 + 라이브 미리보기가 표시됩니다 + 위치 라벨 숨기기 + 위치 라벨이 숨겨집니다 + 위치 라벨이 표시됩니다 + 새로운 게시물 버튼 숨기기 + 새로운 게시물 버튼이 숨겨집니다 + 새로운 게시물 버튼이 표시됩니다 + 일시 정지 오버레이 버튼 숨기기 + 플레이어 왼쪽 상단에서 다음 버튼들이 숨겨집니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 + 플레이어 왼쪽 상단에서 다음 버튼들이 표시됩니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 + 댓글 미리보기 숨기기 + 댓글 미리보기가 숨겨집니다 + 댓글 미리보기가 표시됩니다 + 음악 저장 버튼 숨기기 + 음악 저장 버튼이 숨겨집니다 + 음악 저장 버튼이 표시됩니다 + 검색 추천 숨기기 + 검색 추천이 숨겨집니다 + 검색 추천이 표시됩니다 + 쇼핑 버튼 숨기기 + 쇼핑 버튼이 숨겨집니다 + 쇼핑 버튼이 표시됩니다 + 스티커 숨기기 + 스티커가 숨겨집니다 + 스티커가 표시됩니다 + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 태그된 제품 숨기기 + 태그된 제품이 숨겨집니다 + 태그된 제품이 표시됩니다 + 예정된 라이브 버튼 숨기기 + 예정된 라이브 버튼이 숨겨집니다 + 예정된 라이브 버튼이 표시됩니다 + 이 사운드 사용 버튼 숨기기 + 이 사운드 사용 버튼이 숨겨집니다 + 이 사운드 사용 버튼이 표시됩니다 + 템플릿 사용 버튼 숨기기 + 템플릿 사용 버튼이 숨겨집니다 + 템플릿 사용 버튼이 표시됩니다 + 좋아요 버튼 애니메이션을 비활성화하기 + 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다 + 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다 + 좋아요 버튼 숨기기 + 좋아요 버튼이 숨겨집니다 + 좋아요 버튼이 표시됩니다 + 싫어요 버튼 숨기기 + 싫어요 버튼이 숨겨집니다 + 싫어요 버튼이 표시됩니다 + 댓글 버튼 숨기기 + 댓글 버튼이 숨겨집니다 + 댓글 버튼이 표시됩니다 + + 공유 버튼 숨기기 + 공유 버튼이 숨겨집니다 + 공유 버튼이 표시됩니다 + + 리믹스 버튼 숨기기 + 리믹스 버튼이 숨겨집니다 + 리믹스 버튼이 표시됩니다 + 사운드 버튼 숨기기 + 사운드 버튼이 숨겨집니다 + 사운드 버튼이 표시됩니다 + 정보 패널 숨기기 + 정보 패널이 숨겨집니다 + 정보 패널이 표시됩니다 + 채널바 숨기기 + 채널바가 숨겨집니다 + 채널바가 표시됩니다 + 동영상 제목 숨기기 + 동영상 제목이 숨겨집니다 + 동영상 제목이 표시됩니다 + 사운드 메타데이터 라벨 숨기기 + 사운드 메타데이터 라벨이 숨겨집니다 + 사운드 메타데이터 라벨이 표시됩니다 + 동영상 링크 라벨 숨기기 + 동영상 링크 라벨이 숨겨집니다 + 동영상 링크 라벨이 표시됩니다 + 하단바 숨기기 + 하단바가 숨겨집니다 + 하단바가 표시됩니다 + + + 최종 화면 추천 동영상 숨기기 + "자동재생이 꺼져 있을 경우에 최종 화면에서 추천 동영상이 숨겨집니다 자동재생은 YouTube 설정에서 변경할 수 있습니다: 설정 → 재생 → 다음 동영상 자동재생" - 최종 화면에서 추천 동영상이 표시됩니다 - - - 관련 동영상 오버레이 숨기기 - 전체 화면에서 관련 동영상 오버레이가 숨겨집니다 - 전체 화면에서 관련 동영상 오버레이가 표시됩니다 - - - 동영상 타임스탬프 숨기기 - 타임스탬프가 숨겨집니다 - 타임스탬프가 표시됩니다 - - - 플레이어 팝업 패널 숨기기 - 다음 플레이어 팝업 패널이 숨겨집니다:\n실시간 채팅, 재생목록, etc. - 다음 플레이어 팝업 패널이 표시됩니다:\n실시간 채팅, 재생목록, etc. - - - 동영상 종료 시 전체 화면에서 나가기 - 사용 안함 - 세로 모드 - 가로 모드 - 세로 및 가로 모드 - - - 동영상을 전체 화면 세로 모드로 열기 - 동영상을 전체 화면으로 엽니다 - 동영상을 전체 화면으로 열지 않습니다 - - - 플레이어 오버레이 불투명도 - 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) - 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 - - - - 싫어요 수를 일시적으로 표시할 수 없습니다 (API 시간 초과) - 싫어요 수를 표시할 수 없습니다 (상태 코드: %d) - 싫어요 수를 표시할 수 없습니다 (클라이언트 API 제한 도달) - 싫어요 수를 표시할 수 없습니다 (%s) - - ReturnYouTubeDislike를 사용하여 투표하려면 동영상을 다시 불러오세요 - - 소유자에 의해 숨겨짐 - Return YouTube Dislike - 싫어요 수를 표시합니다 - 싫어요 수를 표시하지 않습니다 - Shorts에서 싫어요 수 표시하기 - "Shorts에서 싫어요 수를 표시합니다 + 최종 화면에서 추천 동영상이 표시됩니다 + + + 관련 동영상 오버레이 숨기기 + 전체 화면에서 관련 동영상 오버레이가 숨겨집니다 + 전체 화면에서 관련 동영상 오버레이가 표시됩니다 + + + 동영상 타임스탬프 숨기기 + 타임스탬프가 숨겨집니다 + 타임스탬프가 표시됩니다 + + + 플레이어 팝업 패널 숨기기 + 다음 플레이어 팝업 패널이 숨겨집니다:\n실시간 채팅, 재생목록, etc. + 다음 플레이어 팝업 패널이 표시됩니다:\n실시간 채팅, 재생목록, etc. + + + 동영상 종료 시 전체 화면에서 나가기 + 사용 안함 + 세로 모드 + 가로 모드 + 세로 및 가로 모드 + + + 동영상을 전체 화면 세로 모드로 열기 + 동영상을 전체 화면으로 엽니다 + 동영상을 전체 화면으로 열지 않습니다 + + + 플레이어 오버레이 불투명도 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) + 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 + + + + 싫어요 수를 일시적으로 표시할 수 없습니다 (API 시간 초과) + 싫어요 수를 표시할 수 없습니다 (상태 코드: %d) + 싫어요 수를 표시할 수 없습니다 (클라이언트 API 제한 도달) + 싫어요 수를 표시할 수 없습니다 (%s) + + ReturnYouTubeDislike를 사용하여 투표하려면 동영상을 다시 불러오세요 + + 소유자에 의해 숨겨짐 + Return YouTube Dislike + 싫어요 수를 표시합니다 + 싫어요 수를 표시하지 않습니다 + Shorts에서 싫어요 수 표시하기 + "Shorts에서 싫어요 수를 표시합니다 제한 사항: • 사용자가 로그인을 하지 않았거나 시크릿 모드에서는 싫어요 수가 표시되지 않을 수 있습니다" - Shorts에서 싫어요 수를 표시하지 않습니다 - 싫어요 수를 퍼센트로 표시하기 - 싫어요 수를 퍼센트로 표시합니다 - 싫어요 수를 숫자로 표시합니다 - - 좋아요 버튼에서 구분선 숨기기 - 좋아요 버튼에서 구분선을 표시하지 않습니다 - 좋아요 버튼에서 구분선을 표시합니다 - 추정되는 좋아요 수 표시하기 - 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시합니다 - 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시하지 않습니다 - API 사용 불가 메시지 표시하기 - ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - ReturnYouTubeDislike.com - 싫어요 수의 데이터는 Return YouTube Dislike API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 - - 이 기기의 ReturnYouTubeDislike API 사용 통계 - 평균 API 응답 시간 - 최소 API 응답 시간 - 최대 API 응답 시간 - 최근 동영상 API 응답 시간 - 싫어요 수를 일시적으로 표시할 수 없습니다 - 클라이언트 API 속도 제한이 적용됨 - API 투표 가져오기, 호출 횟수 - 네트워크 호출한 적이 없습니다 - %d 건의 네트워크 호출이 이루어졌습니다 - API 투표 가져오기, 시간 초과 횟수 - 네트워크 호출이 시간 초과한 적이 없습니다 - %d 건의 네트워크 호출이 시간 초과하였습니다 - API 클라이언트 비율 제한 - 클라이언트 비율을 제한한 적이 없습니다 - %d 건의 클라이언트 비율 제한이 발생하였습니다 - %d 밀리초 - - - 넓은 검색창 활성화하기 - 넓은 검색창을 활성화합니다 - 넓은 검색창을 비활성화합니다 - - - 고화질 재생바 썸네일 활성화하기 - 고화질 재생바 썸네일을 활성화합니다 - 일반 화질 재생바 썸네일을 활성화합니다 - 전체 화면 고화질 재생바 썸네일을 활성화합니다 - 전체 화면 일반 화질 재생바 썸네일을 활성화합니다 - "이 기능을 활성화하면 재생바 썸네일이 없는 실시간 스트림의 썸네일도 복원됩니다. + Shorts에서 싫어요 수를 표시하지 않습니다 + 싫어요 수를 퍼센트로 표시하기 + 싫어요 수를 퍼센트로 표시합니다 + 싫어요 수를 숫자로 표시합니다 + + 좋아요 버튼에서 구분선 숨기기 + 좋아요 버튼에서 구분선을 표시하지 않습니다 + 좋아요 버튼에서 구분선을 표시합니다 + 추정되는 좋아요 수 표시하기 + 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시합니다 + 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시하지 않습니다 + API 사용 불가 메시지 표시하기 + ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + ReturnYouTubeDislike.com + 싫어요 수의 데이터는 Return YouTube Dislike API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 + + 이 기기의 ReturnYouTubeDislike API 사용 통계 + 평균 API 응답 시간 + 최소 API 응답 시간 + 최대 API 응답 시간 + 최근 동영상 API 응답 시간 + 싫어요 수를 일시적으로 표시할 수 없습니다 - 클라이언트 API 속도 제한이 적용됨 + API 투표 가져오기, 호출 횟수 + 네트워크 호출한 적이 없습니다 + %d 건의 네트워크 호출이 이루어졌습니다 + API 투표 가져오기, 시간 초과 횟수 + 네트워크 호출이 시간 초과한 적이 없습니다 + %d 건의 네트워크 호출이 시간 초과하였습니다 + API 클라이언트 비율 제한 + 클라이언트 비율을 제한한 적이 없습니다 + %d 건의 클라이언트 비율 제한이 발생하였습니다 + %d 밀리초 + + + 넓은 검색창 활성화하기 + 넓은 검색창을 활성화합니다 + 넓은 검색창을 비활성화합니다 + + + 고화질 재생바 썸네일 활성화하기 + 고화질 재생바 썸네일을 활성화합니다 + 일반 화질 재생바 썸네일을 활성화합니다 + 전체 화면 고화질 재생바 썸네일을 활성화합니다 + 전체 화면 일반 화질 재생바 썸네일을 활성화합니다 + "이 기능을 활성화하면 재생바 썸네일이 없는 실시간 스트림의 썸네일도 복원됩니다. 재생바 썸네일에는 현재 동영상과 동일한 화질 값이 사용됩니다. 이 기능은 동영상 화질 값이 720p 이하이고 인터넷 연결 상태가 매우 빠를 때 가장 잘 작동합니다." - 이전 재생바 썸네일 복원하기 - 재생바 상단에서 최소화된 썸네일을 표시합니다 - 플레이어에서 전체 화면으로 된 썸네일을 표시합니다 - - - SponsorBlock - SponsorBlock 활성화하기 - SponsorBlock은 YouTube 동영상의 성가신 부분을 건너뛰기 위한 크라우드소싱 시스템입니다 - 레이아웃 - 구간 투표 버튼 표시하기 - 플레이어에서 구간 투표 버튼을 표시합니다 - 플레이어에서 구간 투표 버튼을 표시하지 않습니다 - 각진 레이아웃 사용하기 - 버튼과 컨트롤을 각지게 활성화합니다 - 버튼과 컨트롤을 둥글게 활성화합니다 - - 최소화된 건너뛰기 버튼 표시하기 - 최소화된 건너뛰기 버튼을 표시합니다 - 일반적인 건너뛰기 버튼을 표시합니다 - 자동으로 건너뛰기 버튼 숨기기 - 건너뛰기 버튼이 몇 초 후에 숨겨집니다 - 건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다 - 건너뛰기 버튼 표시 시간 - 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다 - 건너뛰기 취소 메시지 표시하기 - 구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다 - 팝업 메시지를 표시하지 않습니다 - 건너뛰기 취소 메시지 표시 시간 - 건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다 - 1 초 - 2 초 - 3 초 - 4 초 - 5 초 - 6 초 - 7 초 - 8 초 - 9 초 - 10 초 - 건너뛸 구간이 제외된 시간 표시하기 - 건너뛸 구간이 제외된 동영상 길이를 재생바에 표시합니다 - 건너뛸 구간이 포함된 동영상 길이를 재생바에 표시합니다 - 새 구간 추가하기 - 구간 추가 버튼 표시하기 - 플레이어에서 구간 추가 버튼을 표시합니다 - 플레이어에서 구간 추가 버튼을 표시하지 않습니다 - 구간 추가 시 최소 슬라이더 단위 설정 - 새 구간 추가 시에 시간 앞으로 버튼 또는 뒤로 버튼을 탭하였을 때 이동하는 최소 시간으로, 단위는 밀리초입니다 - 값은 양수여야 합니다 - 가이드라인 보기 - 구간 제출 시의 주의사항에 대한 내용을 포함하고 있습니다 - 가이드라인 읽어보기 - 광고 구간을 제출하기 전에 SponsorBlock 가이드라인을 읽어보시는 것을 추천합니다 - 이미 읽음 - 보기 - 일반 - API 사용 불가 메시지 표시하기 - SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - 건너뛴 횟수 기록 활성화하기 - 구간 건너뛰기를 통해 절약한 시간을 SponsorBlock의 리더보드 시스템에 알려줍니다. 건너뛴 구간에 대한 정보가 서버에 전송됩니다 - 건너뛴 횟수 기록을 비활성화합니다 - 건너뛸 최소 구간 길이 - 설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다 - 잘못된 표시 시간입니다 - 비공개 사용자 아이디 - 비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요 - 비공개 사용자 아이디는 30자 이상이어야 합니다 - API URL 변경하기 - SponsorBlock이 요청을 보낼 서버 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 - API URL 초기화하기 - 잘못된 주소입니다 - API URL을 변경하였습니다 - 설정 가져오기 / 내보내기 - 복사하기 - ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponsorBlock JSON 구성입니다 - ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponserBlock JSON의 전체 구성 파일입니다. 비공개 사용자 아이디를 포함하고 있으므로 주의하세요 - 설정을 성공적으로 가져왔습니다 - 설정을 가져올 수 없습니다: %s - 설정을 내보낼 수 없습니다: %s - "설정에는 비공개 SponsorBlock 사용자 아이디가 포함되어 있습니다 + 이전 재생바 썸네일 복원하기 + 재생바 상단에서 최소화된 썸네일을 표시합니다 + 플레이어에서 전체 화면으로 된 썸네일을 표시합니다 + + + SponsorBlock + SponsorBlock 활성화하기 + SponsorBlock은 YouTube 동영상의 성가신 부분을 건너뛰기 위한 크라우드소싱 시스템입니다 + 레이아웃 + 구간 투표 버튼 표시하기 + 플레이어에서 구간 투표 버튼을 표시합니다 + 플레이어에서 구간 투표 버튼을 표시하지 않습니다 + 각진 레이아웃 사용하기 + 버튼과 컨트롤을 각지게 활성화합니다 + 버튼과 컨트롤을 둥글게 활성화합니다 + + 최소화된 건너뛰기 버튼 표시하기 + 최소화된 건너뛰기 버튼을 표시합니다 + 일반적인 건너뛰기 버튼을 표시합니다 + 자동으로 건너뛰기 버튼 숨기기 + 건너뛰기 버튼이 몇 초 후에 숨겨집니다 + 건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다 + 건너뛰기 버튼 표시 시간 + 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다 + 건너뛰기 취소 메시지 표시하기 + 구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다 + 팝업 메시지를 표시하지 않습니다 + 건너뛰기 취소 메시지 표시 시간 + 건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다 + 1 초 + 2 초 + 3 초 + 4 초 + 5 초 + 6 초 + 7 초 + 8 초 + 9 초 + 10 초 + 건너뛸 구간이 제외된 시간 표시하기 + 건너뛸 구간이 제외된 동영상 길이를 재생바에 표시합니다 + 건너뛸 구간이 포함된 동영상 길이를 재생바에 표시합니다 + 새 구간 추가하기 + 구간 추가 버튼 표시하기 + 플레이어에서 구간 추가 버튼을 표시합니다 + 플레이어에서 구간 추가 버튼을 표시하지 않습니다 + 구간 추가 시 최소 슬라이더 단위 설정 + 새 구간 추가 시에 시간 앞으로 버튼 또는 뒤로 버튼을 탭하였을 때 이동하는 최소 시간으로, 단위는 밀리초입니다 + 값은 양수여야 합니다 + 가이드라인 보기 + 구간 제출 시의 주의사항에 대한 내용을 포함하고 있습니다 + 가이드라인 읽어보기 + 광고 구간을 제출하기 전에 SponsorBlock 가이드라인을 읽어보시는 것을 추천합니다 + 이미 읽음 + 보기 + 일반 + API 사용 불가 메시지 표시하기 + SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + 건너뛴 횟수 기록 활성화하기 + 구간 건너뛰기를 통해 절약한 시간을 SponsorBlock의 리더보드 시스템에 알려줍니다. 건너뛴 구간에 대한 정보가 서버에 전송됩니다 + 건너뛴 횟수 기록을 비활성화합니다 + 건너뛸 최소 구간 길이 + 설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다 + 잘못된 표시 시간입니다 + 비공개 사용자 아이디 + 비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요 + 비공개 사용자 아이디는 30자 이상이어야 합니다 + API URL 변경하기 + SponsorBlock이 요청을 보낼 서버 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 + API URL 초기화하기 + 잘못된 주소입니다 + API URL을 변경하였습니다 + 설정 가져오기 / 내보내기 + 복사하기 + ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponsorBlock JSON 구성입니다 + ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponserBlock JSON의 전체 구성 파일입니다. 비공개 사용자 아이디를 포함하고 있으므로 주의하세요 + 설정을 성공적으로 가져왔습니다 + 설정을 가져올 수 없습니다: %s + 설정을 내보낼 수 없습니다: %s + "설정에는 비공개 SponsorBlock 사용자 아이디가 포함되어 있습니다 절대 다른 이에게 공개하지 마세요" - 다시 보지 않기 - 각 구간에 설정할 동작 - 스폰서 광고 - 유료 광고, 협찬과 같은 직/간접적인 광고 구간입니다 - 자체 홍보 구간 - \'스폰서 광고\' 구간과 비슷하지만, 자발적으로 홍보하는 내용을 포함하는 구간입니다. 채널 굿즈 광고, 기부 광고와 동영상에 참여한 사람들을 홍보하는 광고가 해당됩니다 - 상호 작용 요청 (구독) - 좋아요, 구독, 알림 설정을 요청하는 내용에 관한 구간입니다 - 하이라이트 - 사람들이 동영상에서 가장 많이 찾는 구간입니다 - 무음 / 인트로 구간 - 아무 내용도 없는 구간입니다. 애니메이션이나 정적 프레임과 같은 내용을 포함하고 있습니다 - 최종 화면 / 크레딧 - 엔딩 크레딧이나 최종 화면이 나타나는 구간입니다 - 흥미 유발 / 인사말 - 예정 동영상, 인사말 그리고 마무리 인사말에 대한 내레이션 트레일러 구간입니다. 추가 콘텐츠를 포함하는 부분은 제외됩니다 - 미리 보기 / 요약 - 이전 에피소드를 간략히 요약하거나 현재 동영상의 하이라이트를 미리 보여줍니다 - 주제와 관련 없는 구간 - 전반적인 동영상의 주제를 이해하는데 필요 없는 내용을 포함하고 있습니다 - 음악이 아닌 구간 - 음악 동영상에서 음악이 아닌 구간이 해당됩니다 - 건너뛰기 - 하이라이트 - 스폰서 광고 건너뛰기 - 자체 홍보 구간 건너뛰기 - 상호 작용 요청 건너뛰기 - 하이라이트로 건너뛰기 - 인트로 건너뛰기 - 무음 구간 건너뛰기 - 무음 구간 건너뛰기 - 최종 화면 건너뛰기 - 흥미 유발 건너뛰기 - 미리 보기 건너뛰기 - 미리 보기 건너뛰기 - 요약 건너뛰기 - 주제와 관련 없는 구간 건너뛰기 - 음악이 아닌 구간 건너뛰기 - 미제출한 구간 건너뛰기 - 스폰서 광고를 건너뛰었습니다 - 자체 홍보 구간을 건너뛰었습니다 - 상호 작용 요청을 건너뛰었습니다 - 하이라이트로 건너뛰었습니다 - 인트로를 건너뛰었습니다 - 무음 구간을 건너뛰었습니다 - 무음 구간을 건너뛰었습니다 - 최종 화면을 건너뛰었습니다 - 흥미 유발 구간을 건너뛰었습니다 - 미리 보기를 건너뛰었습니다 - 미리 보기를 건너뛰었습니다 - 요약을 건너뛰었습니다 - 주제와 관련 없는 구간을 건너뛰었습니다 - 음악이 아닌 구간을 건너뛰었습니다 - 미제출한 구간을 건너뛰었습니다 - 여러 구간을 건너뛰었습니다 - 자동으로 건너뛰기 - 한 번만 자동으로 건너뛰기 - 건너뛰기 버튼 표시하기 - 재생바에만 표시하기 - 아무것도 하지 않기 - 구간을 제출할 수 없습니다: %s - SponsorBlock을 일시적으로 사용할 수 없습니다 - 구간을 제출할 수 없습니다 (상태 코드: %1$d %2$s) - 구간을 제출할 수 없습니다. 동일 사용자 또는 동일 IP로 부터 제출된 요청이 너무 많습니다 - 구간을 제출할 수 없습니다: %s - "구간을 제출할 수 없습니다 + 다시 보지 않기 + 각 구간에 설정할 동작 + 스폰서 광고 + 유료 광고, 협찬과 같은 직/간접적인 광고 구간입니다 + 자체 홍보 구간 + \'스폰서 광고\' 구간과 비슷하지만, 자발적으로 홍보하는 내용을 포함하는 구간입니다. 채널 굿즈 광고, 기부 광고와 동영상에 참여한 사람들을 홍보하는 광고가 해당됩니다 + 상호 작용 요청 (구독) + 좋아요, 구독, 알림 설정을 요청하는 내용에 관한 구간입니다 + 하이라이트 + 사람들이 동영상에서 가장 많이 찾는 구간입니다 + 무음 / 인트로 구간 + 아무 내용도 없는 구간입니다. 애니메이션이나 정적 프레임과 같은 내용을 포함하고 있습니다 + 최종 화면 / 크레딧 + 엔딩 크레딧이나 최종 화면이 나타나는 구간입니다 + 흥미 유발 / 인사말 + 예정 동영상, 인사말 그리고 마무리 인사말에 대한 내레이션 트레일러 구간입니다. 추가 콘텐츠를 포함하는 부분은 제외됩니다 + 미리 보기 / 요약 + 이전 에피소드를 간략히 요약하거나 현재 동영상의 하이라이트를 미리 보여줍니다 + 주제와 관련 없는 구간 + 전반적인 동영상의 주제를 이해하는데 필요 없는 내용을 포함하고 있습니다 + 음악이 아닌 구간 + 음악 동영상에서 음악이 아닌 구간이 해당됩니다 + 건너뛰기 + 하이라이트 + 스폰서 광고 건너뛰기 + 자체 홍보 구간 건너뛰기 + 상호 작용 요청 건너뛰기 + 하이라이트로 건너뛰기 + 인트로 건너뛰기 + 무음 구간 건너뛰기 + 무음 구간 건너뛰기 + 최종 화면 건너뛰기 + 흥미 유발 건너뛰기 + 미리 보기 건너뛰기 + 미리 보기 건너뛰기 + 요약 건너뛰기 + 주제와 관련 없는 구간 건너뛰기 + 음악이 아닌 구간 건너뛰기 + 미제출한 구간 건너뛰기 + 스폰서 광고를 건너뛰었습니다 + 자체 홍보 구간을 건너뛰었습니다 + 상호 작용 요청을 건너뛰었습니다 + 하이라이트로 건너뛰었습니다 + 인트로를 건너뛰었습니다 + 무음 구간을 건너뛰었습니다 + 무음 구간을 건너뛰었습니다 + 최종 화면을 건너뛰었습니다 + 흥미 유발 구간을 건너뛰었습니다 + 미리 보기를 건너뛰었습니다 + 미리 보기를 건너뛰었습니다 + 요약을 건너뛰었습니다 + 주제와 관련 없는 구간을 건너뛰었습니다 + 음악이 아닌 구간을 건너뛰었습니다 + 미제출한 구간을 건너뛰었습니다 + 여러 구간을 건너뛰었습니다 + 자동으로 건너뛰기 + 한 번만 자동으로 건너뛰기 + 건너뛰기 버튼 표시하기 + 재생바에만 표시하기 + 아무것도 하지 않기 + 구간을 제출할 수 없습니다: %s + SponsorBlock을 일시적으로 사용할 수 없습니다 + 구간을 제출할 수 없습니다 (상태 코드: %1$d %2$s) + 구간을 제출할 수 없습니다. 동일 사용자 또는 동일 IP로 부터 제출된 요청이 너무 많습니다 + 구간을 제출할 수 없습니다: %s + "구간을 제출할 수 없습니다 이미 존재하는 구간입니다" - 구간을 성공적으로 제출하였습니다 - - SponsorBlock을 일시적으로 사용할 수 없습니다 (응답 시간 초과) - SponsorBlock을 일시적으로 사용할 수 없습니다 (상태 코드: %d) - SponsorBlock을 일시적으로 사용할 수 없습니다 - 구간에 투표할 수 없습니다 (응답 시간 초과) - 구간에 투표할 수 없습니다 (상태 코드: %1$d %2$s) - 구간에 투표할 수 없습니다: %s - 좋아요 - 싫어요 - 카테고리 변경 - 투표할 구간이 없습니다 - - %1$s ~ %2$s - 구간 카테고리를 선택하세요 - 이 카테고리는 비활성화되어 있습니다. 제출하려면 설정에서 활성화해야 합니다. - 새 SponsorBlock 구간 - %s 을 구간의 시작 또는 끝으로 설정하시겠습니까? - 시작 - - 현재 - 구간의 시작 - 구간의 끝 - 설정된 구간이 정확합니까? - "선택한 구간이 + 구간을 성공적으로 제출하였습니다 + + SponsorBlock을 일시적으로 사용할 수 없습니다 (응답 시간 초과) + SponsorBlock을 일시적으로 사용할 수 없습니다 (상태 코드: %d) + SponsorBlock을 일시적으로 사용할 수 없습니다 + 구간에 투표할 수 없습니다 (응답 시간 초과) + 구간에 투표할 수 없습니다 (상태 코드: %1$d %2$s) + 구간에 투표할 수 없습니다: %s + 좋아요 + 싫어요 + 카테고리 변경 + 투표할 구간이 없습니다 + + %1$s ~ %2$s + 구간 카테고리를 선택하세요 + 이 카테고리는 비활성화되어 있습니다. 제출하려면 설정에서 활성화해야 합니다. + 새 SponsorBlock 구간 + %s 을 구간의 시작 또는 끝으로 설정하시겠습니까? + 시작 + + 현재 + 구간의 시작 + 구간의 끝 + 설정된 구간이 정확합니까? + "선택한 구간이 %1$s 부터 @@ -1290,47 +1289,47 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 (%3$s) 까지 입니다 이렇게 제출하시겠습니까?" - 구간의 시작 또는 끝을 잘못 설정하였습니다 - 먼저 재생바에서 시작 지점과 끝 지점을 표시하세요 - 구간 미리 보기 버튼을 탭하여 설정한 구간이 정상적으로 건너뛰기가 되는지 확인하세요 - 직접 시간 구간 편집하기 - 구간의 시작이나 끝을 편집하시겠습니까? - 잘못된 시간 형식입니다 - 기록 - - 기록을 일시적으로 가져올 수 없습니다 (응답 시간 초과) - 불러오는 중... - SponsorBlock을 비활성화하였습니다 - 사용자 이름: <b>%s</b> - 사용자 이름을 변경하려면 여기를 탭하세요 - 사용자 이름을 변경할 수 없습니다. 상태 코드: %1$d %2$s - 사용자 이름을 성공적으로 변경하였습니다 - 사용자의 평판: <b>%.2f</b> - 제출 횟수: <b>%s</b> - 구간을 보려면 여기를 탭하세요 - SponsorBlock 리더보드 - 다른 분들이 <b>%s</b>개의 구간을 건너뛸 수 있게 해주셨습니다 - 글로벌 기록 또는 상위 기여자를 확인하려면 여기를 탭하세요 - 이는 <b>%s</b>에 해당됩니다.<br>리더보드를 보려면 여기를 탭하세요 - 구간 <b>%s</b>개를 건너뛰었습니다 - 이는 <b>%s</b>에 해당됩니다 - 건너뛴 횟수 기록을 초기화하시겠습니까? - %1$s 시간 %2$s 분 - %1$s 분 %2$s 초 - %s 초 - 불투명도: - 색상: - 정보 - sponsor.ajay.app - 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 - - - 레이아웃 폼 팩터 변경하기 - 기본값 - - 태블릿 - 오토모티브 - "변경 사항: + 구간의 시작 또는 끝을 잘못 설정하였습니다 + 먼저 재생바에서 시작 지점과 끝 지점을 표시하세요 + 구간 미리 보기 버튼을 탭하여 설정한 구간이 정상적으로 건너뛰기가 되는지 확인하세요 + 직접 시간 구간 편집하기 + 구간의 시작이나 끝을 편집하시겠습니까? + 잘못된 시간 형식입니다 + 기록 + + 기록을 일시적으로 가져올 수 없습니다 (응답 시간 초과) + 불러오는 중... + SponsorBlock을 비활성화하였습니다 + 사용자 이름: <b>%s</b> + 사용자 이름을 변경하려면 여기를 탭하세요 + 사용자 이름을 변경할 수 없습니다. 상태 코드: %1$d %2$s + 사용자 이름을 성공적으로 변경하였습니다 + 사용자의 평판: <b>%.2f</b> + 제출 횟수: <b>%s</b> + 구간을 보려면 여기를 탭하세요 + SponsorBlock 리더보드 + 다른 분들이 <b>%s</b>개의 구간을 건너뛸 수 있게 해주셨습니다 + 글로벌 기록 또는 상위 기여자를 확인하려면 여기를 탭하세요 + 이는 <b>%s</b>에 해당됩니다.<br>리더보드를 보려면 여기를 탭하세요 + 구간 <b>%s</b>개를 건너뛰었습니다 + 이는 <b>%s</b>에 해당됩니다 + 건너뛴 횟수 기록을 초기화하시겠습니까? + %1$s 시간 %2$s 분 + %1$s 분 %2$s 초 + %s 초 + 불투명도: + 색상: + 정보 + sponsor.ajay.app + 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 + + + 레이아웃 폼 팩터 변경하기 + 기본값 + + 태블릿 + 오토모티브 + "변경 사항: 태블릿 레이아웃 • 커뮤니티 게시물이 숨겨집니다 @@ -1338,330 +1337,330 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 오토모티브 레이아웃 • Shorts가 일반 플레이어에서 재생됩니다 • 피드가 주제와 채널별로 구성됩니다" - - - 앱 버전 속이기 - 앱 버전이 속여집니다 - 앱 버전이 속여지지 않습니다 - "앱 버전이 YouTube 이전 앱 버전으로 속여집니다. + + + 앱 버전 속이기 + 앱 버전이 속여집니다 + 앱 버전이 속여지지 않습니다 + "앱 버전이 YouTube 이전 앱 버전으로 속여집니다. 이 경우 앱 레이아웃과 기능이 변경되지만 알려지지 않은 부작용이 발생할 수 있습니다. 나중에 이 기능을 비활성화하면 앱 UI 버그를 방지하기 위해 앱 데이터를 지우는 것이 좋습니다." - 속이기에 사용될 앱 버전 - 20.13.41 - 접히지 않은 동영상 동작바를 복원합니다 - 20.05.46 - 스크립트 기능을 복원합니다 - 19.35.36 - 이전 Shorts 플레이어 아이콘을 복원합니다 - 19.01.34 - 이전 하단바 아이콘을 복원합니다 - - - 앱 시작 페이지 변경하기 - 기본값 - 모든 구독 채널 - 채널 둘러보기 - 학습 프로그램 - 탐색 - 패션 및 뷰티 - 게임 - 기록 - 내 페이지 - 좋아요 표시한 동영상 - 실시간 - 영화 - 음악 - 뉴스 - 알림 - 재생목록 - 검색 - 쇼핑 - Shorts - 스포츠 - 구독 - 인기 급상승 - 가상 현실 - 나중에 볼 동영상 - 내 클립 - 앱 시작 페이지 항상 변경하기 - "앱 시작 페이지를 항상 변경합니다 + 속이기에 사용될 앱 버전 + 20.13.41 - 접히지 않은 동영상 동작바를 복원합니다 + 20.05.46 - 스크립트 기능을 복원합니다 + 19.35.36 - 이전 Shorts 플레이어 아이콘을 복원합니다 + 19.01.34 - 이전 하단바 아이콘을 복원합니다 + + + 앱 시작 페이지 변경하기 + 기본값 + 모든 구독 채널 + 채널 둘러보기 + 학습 프로그램 + 탐색 + 패션 및 뷰티 + 게임 + 기록 + 내 페이지 + 좋아요 표시한 동영상 + 실시간 + 영화 + 음악 + 뉴스 + 알림 + 재생목록 + 검색 + 쇼핑 + Shorts + 스포츠 + 구독 + 인기 급상승 + 가상 현실 + 나중에 볼 동영상 + 내 클립 + 앱 시작 페이지 항상 변경하기 + "앱 시작 페이지를 항상 변경합니다 제한 사항: • 툴바에서 '뒤로 가기' 버튼이 작동하지 않을 수 있습니다" - 앱 시작 페이지를 앱 시작 시에만 변경합니다 - - - 앱 시작 시 Shorts 플레이어 비활성화하기 - 앱 시작 시 Shorts 플레이어를 다시 실행하지 않습니다 - 앱 시작 시 Shorts 플레이어를 다시 실행합니다 - - - Shorts 재생 플레이어 유형 - Shorts 플레이어 - 일반 플레이어 - 일반 플레이어 전체 화면 - - - Shorts 자동재생 - Shorts가 자동넘김됩니다 - Shorts가 반복재생됩니다 - Shorts 백그라운드 재생 자동넘김 - Shorts 백그라운드 재생이 자동넘김됩니다 - Shorts 백그라운드 재생이 반복재생됩니다 - - - 미니 플레이어 - 앱 내에서 최소화된 플레이어의 스타일을 변경할 수 있습니다 - 미니 플레이어 유형 - 사용 안함 - 기본값 - 최소화 - 태블릿 - 모던 스타일 1 - 모던 스타일 2 - 모던 스타일 3 - 모던 스타일 4 - 둥근 모서리 비활성화하기 - 모서리를 각지게 활성화합니다 - 모서리를 둥글게 활성화합니다 - \'두 번 탭하기\' 및 \'핀치하여 크기 조정\' 활성화하기 - "'두 번 탭하기 동작' 및 '핀치하여 크기 조정'을 활성화합니다 + 앱 시작 페이지를 앱 시작 시에만 변경합니다 + + + 앱 시작 시 Shorts 플레이어 비활성화하기 + 앱 시작 시 Shorts 플레이어를 다시 실행하지 않습니다 + 앱 시작 시 Shorts 플레이어를 다시 실행합니다 + + + Shorts 재생 플레이어 유형 + Shorts 플레이어 + 일반 플레이어 + 일반 플레이어 전체 화면 + + + Shorts 자동재생 + Shorts가 자동넘김됩니다 + Shorts가 반복재생됩니다 + Shorts 백그라운드 재생 자동넘김 + Shorts 백그라운드 재생이 자동넘김됩니다 + Shorts 백그라운드 재생이 반복재생됩니다 + + + 미니 플레이어 + 앱 내에서 최소화된 플레이어의 스타일을 변경할 수 있습니다 + 미니 플레이어 유형 + 사용 안함 + 기본값 + 최소화 + 태블릿 + 모던 스타일 1 + 모던 스타일 2 + 모던 스타일 3 + 모던 스타일 4 + 둥근 모서리 비활성화하기 + 모서리를 각지게 활성화합니다 + 모서리를 둥글게 활성화합니다 + \'두 번 탭하기\' 및 \'핀치하여 크기 조정\' 활성화하기 + "'두 번 탭하기 동작' 및 '핀치하여 크기 조정'을 활성화합니다 • 두 번 탭하여 미니 플레이어 크기를 늘릴 수 있습니다 • 다시 두 번 탭하면 원래 크기로 복원됩니다" - \'두 번 탭하기 동작\' 및 \'핀치하여 크기 조정\'을 비활성화합니다 - 드래그 & 드롭 비활성화하기 - 드래그 & 드롭을 비활성화합니다 - "드래그 & 드롭을 활성화합니다 + \'두 번 탭하기 동작\' 및 \'핀치하여 크기 조정\'을 비활성화합니다 + 드래그 & 드롭 비활성화하기 + 드래그 & 드롭을 비활성화합니다 + "드래그 & 드롭을 활성화합니다 • 미니 플레이어를 화면 구석으로 드래그 할 수 있습니다" - 수평 드래그 제스처 비활성화하기 - 수평 드래그 제스처를 비활성화합니다 - "수평 드래그 제스처를 활성화합니다 + 수평 드래그 제스처 비활성화하기 + 수평 드래그 제스처를 비활성화합니다 + "수평 드래그 제스처를 활성화합니다 • 미니 플레이어 절반 정도를 왼쪽 밖 또는 오른쪽 밖으로 드래그하여 숨길 수 있습니다" - 오버레이 버튼 숨기기 - 오버레이 버튼이 숨겨집니다. - 오버레이 버튼이 표시됩니다. - \'펼치기\' & \'닫기\' 버튼 숨기기 - "'펼치기' & '닫기' 버튼이 숨겨집니다 + 오버레이 버튼 숨기기 + 오버레이 버튼이 숨겨집니다. + 오버레이 버튼이 표시됩니다. + \'펼치기\' & \'닫기\' 버튼 숨기기 + "'펼치기' & '닫기' 버튼이 숨겨집니다 • 미니 플레이어를 스와이프하여 펼치거나 닫을 수 있습니다" - \'펼치기\' & \'닫기\' 버튼이 표시됩니다 - 서브텍스트 숨기기 - 서브텍스트가 숨겨집니다 - 서브텍스트가 표시됩니다 - \'되감기\' & \'빨리 감기\' 버튼 숨기기 - \'되감기\' & \'빨리 감기\' 버튼이 숨겨집니다 - \'되감기\' & \'빨리 감기\' 버튼이 표시됩니다 - 화면 크기 초기값 - 화면 크기 초기값을 지정할 수 있습니다 (픽셀) - 픽셀 크기는 %1$s-%2$s 사이여야 합니다 - 미니 플레이어 오버레이 불투명도 - 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) - 미니 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 - - - 그라데이션 색상 로딩 화면 활성화하기 - 그라데이션 색상 로딩 화면을 활성화합니다 - 기본 로딩 화면을 활성화합니다 - 스플래시 애니메이션 스타일 - 컬러 - 흑백 - 사용자 정의 재생바 색상 활성화하기 - 사용자 정의 재생바 색상을 활성화합니다 - 기본 재생바 색상을 활성화합니다 - 사용자 정의 재생바 메인 색상 - 재생바 메인 색상을 지정할 수 있습니다 - 사용자 정의 재생바 보조 색상 - 재생바 보조 색상을 지정할 수 있습니다 - 잘못된 재생바 색상입니다 - - - YouTube ReVanced - YT ReVanced - YT - - - 헤더 로고 - 기본값 - 일반 - Premium - ReVanced - - ReVanced 최소화 - 사용자 정의 - - - 이미지 표시 제한 지역 우회하기 - 이미지 호스트로 \'yt4.ggpht.com\'를 사용합니다 - "기본 이미지 호스트를 사용합니다 + \'펼치기\' & \'닫기\' 버튼이 표시됩니다 + 서브텍스트 숨기기 + 서브텍스트가 숨겨집니다 + 서브텍스트가 표시됩니다 + \'되감기\' & \'빨리 감기\' 버튼 숨기기 + \'되감기\' & \'빨리 감기\' 버튼이 숨겨집니다 + \'되감기\' & \'빨리 감기\' 버튼이 표시됩니다 + 화면 크기 초기값 + 화면 크기 초기값을 지정할 수 있습니다 (픽셀) + 픽셀 크기는 %1$s-%2$s 사이여야 합니다 + 미니 플레이어 오버레이 불투명도 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) + 미니 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 + + + 그라데이션 색상 로딩 화면 활성화하기 + 그라데이션 색상 로딩 화면을 활성화합니다 + 기본 로딩 화면을 활성화합니다 + 스플래시 애니메이션 스타일 + 컬러 + 흑백 + 사용자 정의 재생바 색상 활성화하기 + 사용자 정의 재생바 색상을 활성화합니다 + 기본 재생바 색상을 활성화합니다 + 사용자 정의 재생바 메인 색상 + 재생바 메인 색상을 지정할 수 있습니다 + 사용자 정의 재생바 보조 색상 + 재생바 보조 색상을 지정할 수 있습니다 + 잘못된 재생바 색상입니다 + + + YouTube ReVanced + YT ReVanced + YT + + + 헤더 로고 + 기본값 + 일반 + Premium + ReVanced + + ReVanced 최소화 + 사용자 정의 + + + 이미지 표시 제한 지역 우회하기 + 이미지 호스트로 \'yt4.ggpht.com\'를 사용합니다 + "기본 이미지 호스트를 사용합니다 이 기능을 활성화하면 일부 지역에서 차단된 이미지를 수신할 수 있습니다" - - - - 홈 탭 - - 구독 탭 - - 내 페이지 탭 - 플레이어 재생목록 & 추천 동영상 - 검색 결과 - 원본 썸네일 - DeArrow & 원본 썸네일 - DeArrow & 스틸 컷 썸네일 - 스틸 컷 썸네일 - DeArrow - "DeArrow는 YouTube 동영상에 크라우드 소싱된 썸네일을 제공합니다. 이러한 썸네일은 YouTube에서 제공하는 썸네일보다 관련성이 높은 경우가 많습니다 + + + + 홈 탭 + + 구독 탭 + + 내 페이지 탭 + 플레이어 재생목록 & 추천 동영상 + 검색 결과 + 원본 썸네일 + DeArrow & 원본 썸네일 + DeArrow & 스틸 컷 썸네일 + 스틸 컷 썸네일 + DeArrow + "DeArrow는 YouTube 동영상에 크라우드 소싱된 썸네일을 제공합니다. 이러한 썸네일은 YouTube에서 제공하는 썸네일보다 관련성이 높은 경우가 많습니다 이 설정을 활성화하면 동영상 URL이 API 서버로 전송되며, 다른 데이터는 전송되지 않습니다. 동영상에 DeArrow 썸네일이 없는 경우에는 원본 썸네일 또는 스틸 컷 썸네일이 표시됩니다 DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" - API 사용 불가 메시지 표시하기 - DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - DeArrow API 엔드포인트 - DeArrow 썸네일 캐시 엔드포인트 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 - 스틸 컷 썸네일 - 스틸 컷 썸네일은 각 동영상의 시작 / 중간 / 끝 부분에서 캡쳐된 이미지입니다. 이러한 이미지는 YouTube에 내장되어 있으며, 외부 API는 사용되지 않습니다 - 일반화질 스틸 컷 썸네일 표시하기 - 일반화질 스틸 컷 썸네일을 표시합니다. 썸네일을 빠르게 불러오지만 실시간 스트림, 비공개, 오래된 동영상에서는 아무것도 표시되지 않은 썸네일이 표시될 수 있습니다 - 고화질 스틸 컷 썸네일을 표시합니다 - 스틸 컷 썸네일에서 표시되는 이미지 - 동영상의 시작 부분 이미지 - 동영상의 중간 부분 이미지 - 동영상의 끝 부분 이미지 - - DeArrow를 일시적으로 사용할 수 없습니다 (상태 코드: %s) - DeArrow를 일시적으로 사용할 수 없습니다 - - - ReVanced 공지 사항 팝업 표시하기 - 앱 시작 시 공지 사항 팝업을 표시합니다 - 앱 시작 시 공지 사항 팝업을 표시하지 않습니다 - 앱 시작 시 공지 사항 팝업을 표시할 수 있습니다 - 공지 사항 제공자와 연결할 수 없습니다 - 닫기 - - - 동영상 연속 재생 활성화하기 - 동영상이 연속 재생됩니다 - 동영상이 연속 재생되지 않습니다 - - - 동영상 연속 재생 버튼 표시하기 - 버튼을 표시합니다 - 버튼을 표시하지 않습니다 - 동영상 연속 재생이 켜집니다 - 동영상 연속 재생이 꺼집니다 - - - 오디오 인터럽트 시 일시 정지 - 다른 오디오가 재생될 경우에 재생이 일시 정지됩니다 (예: 네비게이션) - 다른 오디오가 재생될 경우에 볼륨이 낮아집니다 - - - 기기 크기 정보 속이기 - "기기 크기 정보가 속여집니다 + API 사용 불가 메시지 표시하기 + DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + DeArrow API 엔드포인트 + DeArrow 썸네일 캐시 엔드포인트 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 + 스틸 컷 썸네일 + 스틸 컷 썸네일은 각 동영상의 시작 / 중간 / 끝 부분에서 캡쳐된 이미지입니다. 이러한 이미지는 YouTube에 내장되어 있으며, 외부 API는 사용되지 않습니다 + 일반화질 스틸 컷 썸네일 표시하기 + 일반화질 스틸 컷 썸네일을 표시합니다. 썸네일을 빠르게 불러오지만 실시간 스트림, 비공개, 오래된 동영상에서는 아무것도 표시되지 않은 썸네일이 표시될 수 있습니다 + 고화질 스틸 컷 썸네일을 표시합니다 + 스틸 컷 썸네일에서 표시되는 이미지 + 동영상의 시작 부분 이미지 + 동영상의 중간 부분 이미지 + 동영상의 끝 부분 이미지 + + DeArrow를 일시적으로 사용할 수 없습니다 (상태 코드: %s) + DeArrow를 일시적으로 사용할 수 없습니다 + + + ReVanced 공지 사항 팝업 표시하기 + 앱 시작 시 공지 사항 팝업을 표시합니다 + 앱 시작 시 공지 사항 팝업을 표시하지 않습니다 + 앱 시작 시 공지 사항 팝업을 표시할 수 있습니다 + 공지 사항 제공자와 연결할 수 없습니다 + 닫기 + + + 동영상 연속 재생 활성화하기 + 동영상이 연속 재생됩니다 + 동영상이 연속 재생되지 않습니다 + + + 동영상 연속 재생 버튼 표시하기 + 버튼을 표시합니다 + 버튼을 표시하지 않습니다 + 동영상 연속 재생이 켜집니다 + 동영상 연속 재생이 꺼집니다 + + + 오디오 인터럽트 시 일시 정지 + 다른 오디오가 재생될 경우에 재생이 일시 정지됩니다 (예: 네비게이션) + 다른 오디오가 재생될 경우에 볼륨이 낮아집니다 + + + 기기 크기 정보 속이기 + "기기 크기 정보가 속여집니다 이 설정을 활성화하면 더 높은 동영상 화질 값을 잠금 해제할 수 있지만, 동영상 재생이 끊기거나 배터리 수명이 단축될 수 있으며, 알려지지 않은 부작용도 발생할 수 있습니다" - "기기 크기 정보가 속여지지 않습니다 + "기기 크기 정보가 속여지지 않습니다 이 설정을 활성화하면 더 높은 동영상 화질 값을 잠금 해제할 수 있습니다" - 이 설정을 활성화하면 동영상 재생이 끊기거나 배터리 수명이 단축되고 알려지지 않은 부작용이 발생할 수 있습니다. - - - 진동 피드백 - 진동 피드백을 활성화하거나 비활성화할 수 있습니다 - 챕터 진동 피드백 비활성화하기 - 챕터 진동 피드백을 비활성화합니다 - 챕터 진동 피드백을 활성화합니다 - 세밀한 탐색 진동 피드백 비활성화하기 - 세밀한 탐색 진동 피드백을 비활성화합니다 - 세밀한 탐색 진동 피드백을 활성화합니다 - 탐색 취소 진동 피드백 비활성화하기 - 탐색 취소 진동 피드백을 비활성화합니다 - 탐색 취소 진동 피드백을 활성화합니다 - 동영상 확대 진동 피드백 비활성화하기 - 동영상 확대 진동 피드백을 비활성화합니다 - 동영상 확대 진동 피드백을 활성화합니다 - - - 최근에 계정 로그인 정보를 변경했다면 MicroG를 제거하고 다시 설치하세요. - - - 리다이렉션 없이 링크 바로 열기 - 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거치지 않고 연결됩니다 - 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거쳐서 연결됩니다 - - - 외부 브라우저 사용하기 - 앱 내에서 외부 링크를 열 경우에 외부 브라우저를 사용합니다 - 앱 내에서 외부 링크를 열 경우에 내부 브라우저를 사용합니다 - - - - 자동 - 동영상 화질 저장 활성화하기 - 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장합니다 - 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장하지 않습니다 - 동영상 화질 변경 메시지 표시하기 - 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시합니다 - 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 - Wi-Fi 이용 시 기본 동영상 화질 - 모바일 네트워크 이용 시 기본 동영상 화질 - Shorts 화질 저장 활성화하기 - Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장합니다 - Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장하지 않습니다 - Wi-Fi 이용 시 기본 Shorts 화질 - 모바일 네트워크 이용 시 기본 Shorts 화질 - 모바일 네트워크 - Wi-Fi - %1$s 이용 시 기본 동영상 화질 값을 %2$s 로 변경하였습니다 - %1$s 이용 시 기본 Shorts 화질 값을 %2$s 로 변경하였습니다 - - - 동영상 재생 속도 다이얼로그 버튼 표시하기 - 속도 다이얼로그 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 동영상 재생 속도가 기본값으로 초기화됩니다 - 속도 다이얼로그 버튼이 표시되지 않습니다 - - - 동영상 화질 버튼 표시하기 - 동영상 화질 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 화질이 기본값으로 초기화됩니다 - 동영상 화질 버튼이 표시되지 않습니다 - - - 사용자 정의 동영상 재생 속도 활성화하기 - 사용자 정의 동영상 재생 속도를 활성화합니다 - 사용자 정의 동영상 재생 속도를 비활성화합니다 - 이전 재생 속도 메뉴 복원하기 - 이전 재생 속도 메뉴가 표시됩니다 - 모던 재생 속도 메뉴가 표시됩니다 - 사용자 정의 동영상 재생 속도 편집하기 - 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 - 재생 속도 값은 %s배속보다 작아야 합니다 - 잘못된 사용자 정의 재생 속도 값입니다 - 자동 - 사용자 정의 길게 탭하여 동영상 재생 속도 - 화면을 길게 탭하는 동안에 변경되는 동영상 재생 속도를 0-8 사이에서 지정할 수 있습니다 - - - 동영상 재생 속도 저장 활성화하기 - 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장합니다 - 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장하지 않습니다 - 동영상 재생 속도 변경 메시지 표시하기 - 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시합니다 - 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 - 기본 동영상 재생 속도 - 기본 동영상 재생 속도 값을 %s 로 변경하였습니다 - - - HDR 동영상 비활성화하기 - HDR 동영상을 비활성화합니다 - HDR 동영상을 활성화합니다 - AVC (H.264) 강제로 활성화하기 - 동영상 코덱이 AVC (H.264)로 강제로 결정됩니다 - 동영상 코덱이 자동으로 결정됩니다 - "장점: + 이 설정을 활성화하면 동영상 재생이 끊기거나 배터리 수명이 단축되고 알려지지 않은 부작용이 발생할 수 있습니다. + + + 진동 피드백 + 진동 피드백을 활성화하거나 비활성화할 수 있습니다 + 챕터 진동 피드백 비활성화하기 + 챕터 진동 피드백을 비활성화합니다 + 챕터 진동 피드백을 활성화합니다 + 세밀한 탐색 진동 피드백 비활성화하기 + 세밀한 탐색 진동 피드백을 비활성화합니다 + 세밀한 탐색 진동 피드백을 활성화합니다 + 탐색 취소 진동 피드백 비활성화하기 + 탐색 취소 진동 피드백을 비활성화합니다 + 탐색 취소 진동 피드백을 활성화합니다 + 동영상 확대 진동 피드백 비활성화하기 + 동영상 확대 진동 피드백을 비활성화합니다 + 동영상 확대 진동 피드백을 활성화합니다 + + + 최근에 계정 로그인 정보를 변경했다면 MicroG를 제거하고 다시 설치하세요. + + + 리다이렉션 없이 링크 바로 열기 + 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거치지 않고 연결됩니다 + 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거쳐서 연결됩니다 + + + 외부 브라우저 사용하기 + 앱 내에서 외부 링크를 열 경우에 외부 브라우저를 사용합니다 + 앱 내에서 외부 링크를 열 경우에 내부 브라우저를 사용합니다 + + + + 자동 + 동영상 화질 저장 활성화하기 + 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장합니다 + 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장하지 않습니다 + 동영상 화질 변경 메시지 표시하기 + 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시합니다 + 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 + Wi-Fi 이용 시 기본 동영상 화질 + 모바일 네트워크 이용 시 기본 동영상 화질 + Shorts 화질 저장 활성화하기 + Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장합니다 + Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장하지 않습니다 + Wi-Fi 이용 시 기본 Shorts 화질 + 모바일 네트워크 이용 시 기본 Shorts 화질 + 모바일 네트워크 + Wi-Fi + %1$s 이용 시 기본 동영상 화질 값을 %2$s 로 변경하였습니다 + %1$s 이용 시 기본 Shorts 화질 값을 %2$s 로 변경하였습니다 + + + 동영상 재생 속도 다이얼로그 버튼 표시하기 + 속도 다이얼로그 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 동영상 재생 속도가 기본값으로 초기화됩니다 + 속도 다이얼로그 버튼이 표시되지 않습니다 + + + 동영상 화질 버튼 표시하기 + 동영상 화질 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 화질이 기본값으로 초기화됩니다 + 동영상 화질 버튼이 표시되지 않습니다 + + + 사용자 정의 동영상 재생 속도 활성화하기 + 사용자 정의 동영상 재생 속도를 활성화합니다 + 사용자 정의 동영상 재생 속도를 비활성화합니다 + 이전 재생 속도 메뉴 복원하기 + 이전 재생 속도 메뉴가 표시됩니다 + 모던 재생 속도 메뉴가 표시됩니다 + 사용자 정의 동영상 재생 속도 편집하기 + 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 + 재생 속도 값은 %s배속보다 작아야 합니다 + 잘못된 사용자 정의 재생 속도 값입니다 + 자동 + 사용자 정의 길게 탭하여 동영상 재생 속도 + 화면을 길게 탭하는 동안에 변경되는 동영상 재생 속도를 0-8 사이에서 지정할 수 있습니다 + + + 동영상 재생 속도 저장 활성화하기 + 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장합니다 + 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장하지 않습니다 + 동영상 재생 속도 변경 메시지 표시하기 + 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시합니다 + 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 + 기본 동영상 재생 속도 + 기본 동영상 재생 속도 값을 %s 로 변경하였습니다 + + + HDR 동영상 비활성화하기 + HDR 동영상을 비활성화합니다 + HDR 동영상을 활성화합니다 + AVC (H.264) 강제로 활성화하기 + 동영상 코덱이 AVC (H.264)로 강제로 결정됩니다 + 동영상 코덱이 자동으로 결정됩니다 + "장점: • 배터리 수명을 향상시킬 수 있습니다 • 구형 기기에서 누락된 동영상 화질을 복원할 수 있습니다 @@ -1670,182 +1669,182 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" • 동영상을 재생할 경우에 VP9 또는 AV1보다 더 많은 인터넷 데이터가 사용됩니다 • HDR 동영상에서는 AVC가 사용되지 않습니다 • 일부 기기에서는 AVC를 강제로 활성화할 수 없습니다" - - - 고급 동영상 화질 설정 메뉴 표시하기 - 고급 동영상 화질 설정 메뉴를 표시합니다 - 고급 동영상 화질 설정 메뉴를 표시하지 않습니다 - - - 슬라이드하여 탐색 활성화하기 - 슬라이드하여 탐색을 활성화합니다 - 슬라이드하여 탐색을 비활성화합니다 - - - Android VR AV1 허용하기 - "동영상 코덱이 AVC (H.264), VP9 또는 AV1으로 결정됩니다 + + + 고급 동영상 화질 설정 메뉴 표시하기 + 고급 동영상 화질 설정 메뉴를 표시합니다 + 고급 동영상 화질 설정 메뉴를 표시하지 않습니다 + + + 슬라이드하여 탐색 활성화하기 + 슬라이드하여 탐색을 활성화합니다 + 슬라이드하여 탐색을 비활성화합니다 + + + Android VR AV1 허용하기 + "동영상 코덱이 AVC (H.264), VP9 또는 AV1으로 결정됩니다 동영상 재생이 끊기거나 프레임이 손실될 수 있습니다" - 동영상 코덱이 AVC (H.264) 또는 VP9으로 결정됩니다 - "이 설정을 활성화하면, 소프트웨어 AV1 디코딩이 사용될 수 있습니다. + 동영상 코덱이 AVC (H.264) 또는 VP9으로 결정됩니다 + "이 설정을 활성화하면, 소프트웨어 AV1 디코딩이 사용될 수 있습니다. AV1이 사용된 동영상 재생이 끊기거나 프레임이 손실될 수 있습니다." - 속이기에 따른 부작용 - • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 - • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 - • 오디오 트랙 메뉴가 표시되지 않습니다 - • AV1 코덱이 지원되지 않습니다 - • 안정적인 볼륨을 사용할 수 없습니다 - • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 - - • 원본 오디오를 강제로 활성화할 수 없습니다 - 전문 통계에서 표시하기 - 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 - 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 - - - - - YT Music ReVanced - Music ReVanced - Music - - - 정보 - 광고 - 일반 - 플레이어 - 기타 - - - 동영상 광고 숨기기 - 동영상 광고가 숨겨집니다 - 동영상 광고가 표시됩니다 - - - 영구적인 반복 활성화하기 - 영구적인 반복을 활성화합니다 - 영구적인 반복을 비활성화합니다 - - - 크롬캐스트 버튼 숨기기 - 크롬캐스트 버튼이 숨겨집니다 - 크롬캐스트 버튼이 표시됩니다 - 기록 버튼 숨기기 - 기록 버튼이 숨겨집니다 - 기록 버튼이 표시됩니다 - 알림 버튼 숨기기 - 알림 버튼이 숨겨집니다 - 알림 버튼이 표시됩니다 - 검색 버튼 숨기기 - 검색 버튼이 숨겨집니다 - 검색 버튼이 표시됩니다 - - - 카테고리 바 숨기기 - 카테고리 바가 숨겨집니다 - 카테고리 바가 표시됩니다 - - - 미니 플레이어 색상 변경하기 - 미니 플레이어 색상이 전체 화면 플레이어와 일치합니다 - 미니 플레이어 색상이 기본 색상입니다 - - - 하단바 - 하단바에서 버튼을 숨기거나 변경할 수 있습니다 - - 홈 버튼 숨기기 - 홈 버튼이 숨겨집니다 - 홈 버튼이 표시됩니다 - - 샘플 버튼 숨기기 - 샘플 버튼이 숨겨집니다 - 샘플 버튼이 표시됩니다 - - 둘러보기 버튼 숨기기 - 둘러보기 버튼이 숨겨집니다 - 둘러보기 버튼이 표시됩니다 - - 보관함 버튼 숨기기 - 보관함 버튼이 숨겨집니다 - 보관함 버튼이 표시됩니다 - - 업그레이드 버튼 숨기기 - 업그레이드 버튼이 숨겨집니다 - 업그레이드 버튼이 표시됩니다 - 하단바 숨기기 - 하단바가 숨겨집니다 - 하단바가 표시됩니다 - 하단바 버튼 라벨 숨기기 - 하단바 버튼 라벨이 숨겨집니다 - 하단바 버튼 라벨이 표시됩니다 - - - Music Premium 가입 라벨 숨기기 - Music Premium 가입 라벨이 숨겨집니다 - Music Premium 가입 라벨이 표시됩니다 - - - 업그레이드 버튼 숨기기 - 업그레이드 버튼이 숨겨집니다 - 업그레이드 버튼이 표시됩니다 - - - - - 음성 광고 차단하기 - 음성 광고를 차단합니다 - 음성 광고를 차단하지 않습니다 - - - %s 를 차단할 수 없기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. - %s 에서 오류가 발생했기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. - 광고 차단 Proxy 서버 사용하기 - 사용 안함 - Luminous Proxy - PurpleAdBlock Proxy - - - 동영상 광고 차단하기 - 동영상 광고를 차단합니다 - 동영상 광고를 차단하지 않습니다 - - - 메시지를 삭제하였습니다 - 삭제된 메시지 표시하기 - 삭제된 메시지 표시하지 않기 - 스포일러 뒤에 삭제된 메시지 숨기기 - 삭제된 메시지를 줄이 그어진 텍스트로 표시하기 - - - 채널 포인트 자동 적립하기 - 채널 포인트을 자동으로 적립합니다 - 채널 포인트를 자동으로 적립하지 않습니다 - - - - Twitch 디버그 모드 활성화하기 - Twitch 디버그 모드를 활성화합니다 (추천하지 않음) - Twitch 디버그 모드를 비활성화합니다 - - - ReVanced 설정 - 정보 - ReVanced 정보 - 광고 차단 - 광고 차단 설정을 할 수 있습니다 - 채팅 - 채팅을 설정할 수 있습니다 - 기타 - 그외 부분을 설정할 수 있습니다 - 일반 설정 - 기타 설정 - 클라이언트 광고 - 서버 광고 - 디버그 로그 - 디버그 로그를 활성화합니다 - 디버그 로그를 비활성화합니다 - - + 속이기에 따른 부작용 + • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 + • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 + • 오디오 트랙 메뉴가 표시되지 않습니다 + • AV1 코덱이 지원되지 않습니다 + • 안정적인 볼륨을 사용할 수 없습니다 + • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 + + • 원본 오디오를 강제로 활성화할 수 없습니다 + 전문 통계에서 표시하기 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 + + + + + YT Music ReVanced + Music ReVanced + Music + + + 정보 + 광고 + 일반 + 플레이어 + 기타 + + + 동영상 광고 숨기기 + 동영상 광고가 숨겨집니다 + 동영상 광고가 표시됩니다 + + + 영구적인 반복 활성화하기 + 영구적인 반복을 활성화합니다 + 영구적인 반복을 비활성화합니다 + + + 크롬캐스트 버튼 숨기기 + 크롬캐스트 버튼이 숨겨집니다 + 크롬캐스트 버튼이 표시됩니다 + 기록 버튼 숨기기 + 기록 버튼이 숨겨집니다 + 기록 버튼이 표시됩니다 + 알림 버튼 숨기기 + 알림 버튼이 숨겨집니다 + 알림 버튼이 표시됩니다 + 검색 버튼 숨기기 + 검색 버튼이 숨겨집니다 + 검색 버튼이 표시됩니다 + + + 카테고리 바 숨기기 + 카테고리 바가 숨겨집니다 + 카테고리 바가 표시됩니다 + + + 미니 플레이어 색상 변경하기 + 미니 플레이어 색상이 전체 화면 플레이어와 일치합니다 + 미니 플레이어 색상이 기본 색상입니다 + + + 하단바 + 하단바에서 버튼을 숨기거나 변경할 수 있습니다 + + 홈 버튼 숨기기 + 홈 버튼이 숨겨집니다 + 홈 버튼이 표시됩니다 + + 샘플 버튼 숨기기 + 샘플 버튼이 숨겨집니다 + 샘플 버튼이 표시됩니다 + + 둘러보기 버튼 숨기기 + 둘러보기 버튼이 숨겨집니다 + 둘러보기 버튼이 표시됩니다 + + 보관함 버튼 숨기기 + 보관함 버튼이 숨겨집니다 + 보관함 버튼이 표시됩니다 + + 업그레이드 버튼 숨기기 + 업그레이드 버튼이 숨겨집니다 + 업그레이드 버튼이 표시됩니다 + 하단바 숨기기 + 하단바가 숨겨집니다 + 하단바가 표시됩니다 + 하단바 버튼 라벨 숨기기 + 하단바 버튼 라벨이 숨겨집니다 + 하단바 버튼 라벨이 표시됩니다 + + + Music Premium 가입 라벨 숨기기 + Music Premium 가입 라벨이 숨겨집니다 + Music Premium 가입 라벨이 표시됩니다 + + + 업그레이드 버튼 숨기기 + 업그레이드 버튼이 숨겨집니다 + 업그레이드 버튼이 표시됩니다 + + + + + 음성 광고 차단하기 + 음성 광고를 차단합니다 + 음성 광고를 차단하지 않습니다 + + + %s 를 차단할 수 없기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. + %s 에서 오류가 발생했기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. + 광고 차단 Proxy 서버 사용하기 + 사용 안함 + Luminous Proxy + PurpleAdBlock Proxy + + + 동영상 광고 차단하기 + 동영상 광고를 차단합니다 + 동영상 광고를 차단하지 않습니다 + + + 메시지를 삭제하였습니다 + 삭제된 메시지 표시하기 + 삭제된 메시지 표시하지 않기 + 스포일러 뒤에 삭제된 메시지 숨기기 + 삭제된 메시지를 줄이 그어진 텍스트로 표시하기 + + + 채널 포인트 자동 적립하기 + 채널 포인트을 자동으로 적립합니다 + 채널 포인트를 자동으로 적립하지 않습니다 + + + + Twitch 디버그 모드 활성화하기 + Twitch 디버그 모드를 활성화합니다 (추천하지 않음) + Twitch 디버그 모드를 비활성화합니다 + + + ReVanced 설정 + 정보 + ReVanced 정보 + 광고 차단 + 광고 차단 설정을 할 수 있습니다 + 채팅 + 채팅을 설정할 수 있습니다 + 기타 + 그외 부분을 설정할 수 있습니다 + 일반 설정 + 기타 설정 + 클라이언트 광고 + 서버 광고 + 디버그 로그 + 디버그 로그를 활성화합니다 + 디버그 로그를 비활성화합니다 + + diff --git a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml +++ b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml +++ b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 269fb206e5..526f1ab5ff 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -17,1263 +17,1262 @@ "First 'item' text Second \"item\" text" ---> - - - - Programos pavadinimas - - Pasirinktinis - Programos piktograma - Originalus - - ReVanced minimalus - ReVanced masteliu - - Pasirinktinis - - - Patikrinimai nepavyko - Atidaryti oficialią svetainę - Ignoruoti - <h5>Ši programa, atrodo, nebuvo pataisyta jūsų.</h5><br>Ši programa gali veikti netinkamai, <b>gali būti kenksminga arba net pavojinga naudoti</b>.<br><br>Šie patikrinimai rodo, kad ši programa yra iš anksto pataisyta arba gauta iš kito asmens:<br><br><small>%1$s</small><br>Stipriai rekomenduojama <b>ištrinti šią programą ir ją pataisyti patiems</b>, kad įsitikintumėte, jog naudojate patikrintą ir saugią programą.<p><br>Jei ignoruosite, šis perspėjimas bus rodomas tik du kartus. - Pataisyta kitame įrenginyje - Nėra įdiegta ReVanced Manager - Pataisyta daugiau nei prieš 10 minučių - Pataisyta prieš %s dienas - APK sukurties data yra sugadinta - - - ReVanced pranešimas - Jūsų žiūrėjimo istorija nėra išsaugoma.<br><br>Tikėtina, kad tai sukelia DNS skelbimų blokatorius arba tinklo tarpinis serveris.<br><br>Norėdami išspręsti šią problemą, įtraukite į baltąjį sąrašą <b>s.youtube.com</b> arba išjunkite visus DNS blokatorius ir tarpinį serverį. - Nerodyti daugiau - - - Nustatymai - Ar tikrai norite tęsti? - Išsaugoti - Atstatyti - Atkurti spalvą - Neteisinga spalva - Reikalingas paleidimas iš naujo - Norint, kad šis pakeitimas įsigaliotų, paleiskite programą iš naujo. - Paleisti iš naujo - Importuoti - Kopijuoti - ReVanced nustatymai atstatyti į numatytuosius - Importuota %d nustatymų - Importavimas nepavyko: %s - Ieškoti nustatymų - Nerasta rezultatų pagal „%s“ - Bandykite kitą raktinį žodį - Naujausios paieškos - Pašalinti iš paieškos istorijos? - Išvalyti paieškos istoriją - Ar tikrai norite išvalyti visą paieškos istoriją? - Paieškos patarimai - "• Bakstelėkite kelią, kad pereitumėte į jį +--> + + + Programos pavadinimas + + Pasirinktinis + Programos piktograma + Originalus + + ReVanced minimalus + ReVanced masteliu + + Pasirinktinis + + + Patikrinimai nepavyko + Atidaryti oficialią svetainę + Ignoruoti + <h5>Ši programa, atrodo, nebuvo pataisyta jūsų.</h5><br>Ši programa gali veikti netinkamai, <b>gali būti kenksminga arba net pavojinga naudoti</b>.<br><br>Šie patikrinimai rodo, kad ši programa yra iš anksto pataisyta arba gauta iš kito asmens:<br><br><small>%1$s</small><br>Stipriai rekomenduojama <b>ištrinti šią programą ir ją pataisyti patiems</b>, kad įsitikintumėte, jog naudojate patikrintą ir saugią programą.<p><br>Jei ignoruosite, šis perspėjimas bus rodomas tik du kartus. + Pataisyta kitame įrenginyje + Nėra įdiegta ReVanced Manager + Pataisyta daugiau nei prieš 10 minučių + Pataisyta prieš %s dienas + APK sukurties data yra sugadinta + + + ReVanced pranešimas + Jūsų žiūrėjimo istorija nėra išsaugoma.<br><br>Tikėtina, kad tai sukelia DNS skelbimų blokatorius arba tinklo tarpinis serveris.<br><br>Norėdami išspręsti šią problemą, įtraukite į baltąjį sąrašą <b>s.youtube.com</b> arba išjunkite visus DNS blokatorius ir tarpinį serverį. + Nerodyti daugiau + + + Nustatymai + Ar tikrai norite tęsti? + Išsaugoti + Atstatyti + Atkurti spalvą + Neteisinga spalva + Reikalingas paleidimas iš naujo + Norint, kad šis pakeitimas įsigaliotų, paleiskite programą iš naujo. + Paleisti iš naujo + Importuoti + Kopijuoti + ReVanced nustatymai atstatyti į numatytuosius + Importuota %d nustatymų + Importavimas nepavyko: %s + Ieškoti nustatymų + Nerasta rezultatų pagal „%s“ + Bandykite kitą raktinį žodį + Naujausios paieškos + Pašalinti iš paieškos istorijos? + Išvalyti paieškos istoriją + Ar tikrai norite išvalyti visą paieškos istoriją? + Paieškos patarimai + "• Bakstelėkite kelią, kad pereitumėte į jį • Ilgai paspauskite nustatymą, kad pereitumėte į jį • Paspauskite „Enter“, kad išsaugotumėte paieškos užklausą istorijoje • Paieška ignoruoja didžiąsias/mažąsias raides ir skyrybos ženklus • Tėviniai nustatymai rodomi virš išjungtų vaiko nustatymų" - Paieškos istorija tuščia - Norėdami išsaugoti paieškos istoriją, įveskite paieškos užklausą ir paspauskite „Enter“ - Rodyti nustatymų paieškos istoriją - Nustatymų paieškos istorija rodoma - Nustatymų paieškos istorija nerodoma - Rodyti „ReVanced“ nustatymų piktogramas - Nustatymų piktogramos yra rodomos - Nenurodomos nustatymų piktogramos - ReVanced kalba - "Kai kurių kalbų vertimai gali būti trūkstami arba neišsamūs. + Paieškos istorija tuščia + Norėdami išsaugoti paieškos istoriją, įveskite paieškos užklausą ir paspauskite „Enter“ + Rodyti nustatymų paieškos istoriją + Nustatymų paieškos istorija rodoma + Nustatymų paieškos istorija nerodoma + Rodyti „ReVanced“ nustatymų piktogramas + Nustatymų piktogramos yra rodomos + Nenurodomos nustatymų piktogramos + ReVanced kalba + "Kai kurių kalbų vertimai gali būti trūkstami arba neišsamūs. Norėdami išversti naujas kalbas arba patobulinti esamus vertimus, apsilankykite translate.revanced.app" - Programų kalba - Importuoti / Eksportuoti - Importuoti / Eksportuoti ReVanced nustatymus - - Jūs naudojate ReVanced Patches versiją <i>%s</i> - Pastaba - Ši versija yra ankstyva ir gali kilti netikėtų problemų - Oficialios nuorodos - + Jūs naudojate ReVanced Patches versiją <i>%s</i> + Pastaba + Ši versija yra ankstyva ir gali kilti netikėtų problemų + Oficialios nuorodos + - - - „GmsCore“ nustatymai - „GmsCore“ nustatymai - - MicroG GmsCore nėra įdiegta. Įdiekite. - Reikalingas veiksmas - "„MicroG GmsCore“ neturi leidimo veikti fone. + + + „GmsCore“ nustatymai + „GmsCore“ nustatymai + + MicroG GmsCore nėra įdiegta. Įdiekite. + Reikalingas veiksmas + "„MicroG GmsCore“ neturi leidimo veikti fone. Sekite savo telefonui skirtą vadovą „Don’t kill my app“ ir pritaikykite nurodymus savo „MicroG“ diegimui. Tai būtina, kad programa veiktų." - Atidaryti svetainę - "Kad nekiltų problemų, „MicroG GmsCore“ akumuliatoriaus optimizavimas turi būti išjungtas. + Atidaryti svetainę + "Kad nekiltų problemų, „MicroG GmsCore“ akumuliatoriaus optimizavimas turi būti išjungtas. Išjungus „MicroG“ akumuliatoriaus optimizavimą, akumuliatoriaus naudojimas nebus neigiamai paveiktas. Palieskite mygtuką Tęsti ir leiskite optimizavimo pakeitimus." - Tęsti - - - Klastoti vaizdo srautus - Klastoti kliento vaizdo srautus, kad būtų išvengta atkūrimo problemų - Susifalsifikuoti vaizdo įrašų srautus - "Vaizdo srautai klastojami + Tęsti + + + Klastoti vaizdo srautus + Klastoti kliento vaizdo srautus, kad būtų išvengta atkūrimo problemų + Susifalsifikuoti vaizdo įrašų srautus + "Vaizdo srautai klastojami Jei esate YouTube Premium naudotojas, šis nustatymas gali būti nereikalingas" - "Vaizdo srautai nėra klastojami + "Vaizdo srautai nėra klastojami Grojimas gali neveikti" - Išjungus šį nustatymą, gali kilti atkūrimo problemų. - Numatytasis klientas - - - Priversti originalią garso kalbą - Naudojama originali garso kalba - Naudojamas numatytasis garsas - - Kad naudotumėte šią funkciją, pakeiskite „Klastoti vaizdo įrašų srautus“ į bet kurį klientą, išskyrus „Android Studio“ - - - Debugavimas - Įgalinti arba išjungti derinimo parinktis - Debugavimo žurnalas - Debugavimo žurnalai yra įgalinti - Debugavimo žurnalai yra išjungti - Žurnalų steko pėdsakai - Debugavimo žurnalai apima steko pėdsaką - Debugavimo žurnalai neapima steko pėdsako - Rodyti \"toast\" apie ReVanced klaidą - Jei įvyksta klaida, rodomas pranešimas „toast“ - Jei įvyksta klaida, pranešimas „toast“ nerodomas - "Klaidos isjungimas paslepia visus „ReVanced“ klaidu pranesimus. + Išjungus šį nustatymą, gali kilti atkūrimo problemų. + Numatytasis klientas + + + Priversti originalią garso kalbą + Naudojama originali garso kalba + Naudojamas numatytasis garsas + + Kad naudotumėte šią funkciją, pakeiskite „Klastoti vaizdo įrašų srautus“ į bet kurį klientą, išskyrus „Android Studio“ + + + Debugavimas + Įgalinti arba išjungti derinimo parinktis + Debugavimo žurnalas + Debugavimo žurnalai yra įgalinti + Debugavimo žurnalai yra išjungti + Žurnalų steko pėdsakai + Debugavimo žurnalai apima steko pėdsaką + Debugavimo žurnalai neapima steko pėdsako + Rodyti \"toast\" apie ReVanced klaidą + Jei įvyksta klaida, rodomas pranešimas „toast“ + Jei įvyksta klaida, pranešimas „toast“ nerodomas + "Klaidos isjungimas paslepia visus „ReVanced“ klaidu pranesimus. Apie netikėtus įvykius nebus pranešta." - Eksportuoti derinimo žurnalus - Nukopijuoja „ReVanced“ derinimo žurnalus į mainų sritį - Derinimo žurnalų registravimas išjungtas - Žurnalų nerasta - Žurnalai nukopijuoti - Nepavyko eksportuoti žurnalų: %s - Išvalyti derinimo žurnalus - Išvalo visus išsaugotus „ReVanced“ derinimo žurnalus - Žurnalai išvalyti - Funkcijų žymių Manager - Tvarkyti logines funkcijų žymes - Aktyviosios vėliavėlės (%d) - Užblokuotos vėliavėlės (%d) - Ieškoti vėliavėlių... - Vėliavėlės išsaugotos - Vėliavėlės nustatytos iš naujo - Vėliavėlės nukopijuotos į iškarpinę - Žurnalų protokolo buferis - Debugavimo žurnalai apima protokolo buferį - Debugavimo žurnalai neapima protokolo buferio - "Įjungus šį nustatymą bus registruojami papildomi išdėstymo duomenys, įskaitant ekrane rodomą tekstą kai kuriems vartotojo sąsajos komponentams. + Eksportuoti derinimo žurnalus + Nukopijuoja „ReVanced“ derinimo žurnalus į mainų sritį + Derinimo žurnalų registravimas išjungtas + Žurnalų nerasta + Žurnalai nukopijuoti + Nepavyko eksportuoti žurnalų: %s + Išvalyti derinimo žurnalus + Išvalo visus išsaugotus „ReVanced“ derinimo žurnalus + Žurnalai išvalyti + Funkcijų žymių Manager + Tvarkyti logines funkcijų žymes + Aktyviosios vėliavėlės (%d) + Užblokuotos vėliavėlės (%d) + Ieškoti vėliavėlių... + Vėliavėlės išsaugotos + Vėliavėlės nustatytos iš naujo + Vėliavėlės nukopijuotos į iškarpinę + Žurnalų protokolo buferis + Debugavimo žurnalai apima protokolo buferį + Debugavimo žurnalai neapima protokolo buferio + "Įjungus šį nustatymą bus registruojami papildomi išdėstymo duomenys, įskaitant ekrane rodomą tekstą kai kuriems vartotojo sąsajos komponentams. Tai gali padėti identifikuoti komponentus kuriant pasirinktinius filtrus. Tačiau įjungus šį nustatymą taip pat bus registruojami kai kurie vartotojo duomenys, pvz., jūsų IP adresas." - - - Nuvalyti bendrinimo nuorodas - Stebėjimo užklausos parametras pašalinamas iš bendrinamų nuorodų - Stebėjimo užklausos parametras nepašalinamas iš bendrinamų nuorodų - Pakeisti bendrinimo nuorodas į youtube.com - Bendrinamose nuorodose naudojama youtube.com - Bendrinamose nuorodose naudojama music.youtube.com - - - Pritaikomas filtras - Slėpti komponentus naudojant pritaikomus filtrus - Įjungti pritaikomus filtrus - Pritaikomas filtras įjungtas - Pritaikomas filtras išjungtas - Pritaikomas filtras - - Komponento kelio kūrėjo eilutės, skirtos filtravimui, atskirtos nauja eilute - Netinkamas pritaikomas filtras: %s - - - - - Apie - Skelbimai - Alternatyvūs miniatiūrai - Naujienos - Bendra - Grotuvas - Paieškos juosta - Braukimo valdikliai - Įvairūs - Vaizdo įrašas - Atkurti senus nustatymų meniu - Rodomi seni nustatymų meniu - Seni nustatymų meniu nerodomi - - - Išjungti \"Shorts\" foninį atkūrimą - \"Shorts\" foninis atkūrimas yra išjungtas - \"Shorts\" foninis atkūrimas yra įjungtas - - - Slėpti albumo korteles - Albumo kortelės yra paslėptos - Albumo kortelės yra rodomos - Slėpti atlikėjų korteles - Atlikėjų kortelės yra paslėptos - Atlikėjų kortelės yra rodomos - Slėpti lustų lentyną - Lustų lenta yra paslėpta - Lustų lenta yra rodoma - Slėpti bendruomenės įrašus - Bendruomenės įrašai yra paslėpti - Bendruomenės įrašai yra rodomi - Slėpti kompaktiškus banerius - Kompaktiški baneriai yra paslėpti - Kompaktiški baneriai yra rodomi - Slėpti išskleidžiamą kortelę - Išskleidžiama kortelė po vaizdo įrašais paslėpta - Išskleidžiama kortelė po vaizdo įrašais rodoma - Slėpti plūduriuojantį mikrofono mygtuką - Plaukiojantis mikrofono mygtukas paieškoje yra paslėptas - Plaukiojantis mikrofono mygtukas paieškoje rodomas - Slėpti horizontalius lentynas - "Horizontalios lentynos paslėptos, pvz.: + + + Nuvalyti bendrinimo nuorodas + Stebėjimo užklausos parametras pašalinamas iš bendrinamų nuorodų + Stebėjimo užklausos parametras nepašalinamas iš bendrinamų nuorodų + Pakeisti bendrinimo nuorodas į youtube.com + Bendrinamose nuorodose naudojama youtube.com + Bendrinamose nuorodose naudojama music.youtube.com + + + Pritaikomas filtras + Slėpti komponentus naudojant pritaikomus filtrus + Įjungti pritaikomus filtrus + Pritaikomas filtras įjungtas + Pritaikomas filtras išjungtas + Pritaikomas filtras + + Komponento kelio kūrėjo eilutės, skirtos filtravimui, atskirtos nauja eilute + Netinkamas pritaikomas filtras: %s + + + + + Apie + Skelbimai + Alternatyvūs miniatiūrai + Naujienos + Bendra + Grotuvas + Paieškos juosta + Braukimo valdikliai + Įvairūs + Vaizdo įrašas + Atkurti senus nustatymų meniu + Rodomi seni nustatymų meniu + Seni nustatymų meniu nerodomi + + + Išjungti \"Shorts\" foninį atkūrimą + \"Shorts\" foninis atkūrimas yra išjungtas + \"Shorts\" foninis atkūrimas yra įjungtas + + + Slėpti albumo korteles + Albumo kortelės yra paslėptos + Albumo kortelės yra rodomos + Slėpti atlikėjų korteles + Atlikėjų kortelės yra paslėptos + Atlikėjų kortelės yra rodomos + Slėpti lustų lentyną + Lustų lenta yra paslėpta + Lustų lenta yra rodoma + Slėpti bendruomenės įrašus + Bendruomenės įrašai yra paslėpti + Bendruomenės įrašai yra rodomi + Slėpti kompaktiškus banerius + Kompaktiški baneriai yra paslėpti + Kompaktiški baneriai yra rodomi + Slėpti išskleidžiamą kortelę + Išskleidžiama kortelė po vaizdo įrašais paslėpta + Išskleidžiama kortelė po vaizdo įrašais rodoma + Slėpti plūduriuojantį mikrofono mygtuką + Plaukiojantis mikrofono mygtukas paieškoje yra paslėptas + Plaukiojantis mikrofono mygtukas paieškoje rodomas + Slėpti horizontalius lentynas + "Horizontalios lentynos paslėptos, pvz.: • Naujausios naujienos • Tęsti žiūrėjimą • Naršyti daugiau kanalų • Svarbiausia • Apsipirkimas • Žiūrėti dar kartą" - Rodomos horizontalios lentynos - Slėpti paveikslėlių lentyną - Paveikslėlių lentyna paieškos rezultatuose paslėpta - Paveikslėlių lentyna paieškos rezultatuose rodoma - Slėpti naujausius įrašus - Naujausi įrašai yra paslėpti - Naujausi įrašai yra rodomi - Slėpti mišrius grojaraščius - Mišrūs grojaraščiai yra paslėpti - Mišrūs grojaraščiai yra rodomi - Slėpti filmų skyrių - Filmų skyrius yra paslėptas - Filmų skyrius yra rodomas - - Slėpti mygtuką \"Pranešti man\" - Pranešti mygtukas yra paslėptas - Pranešti mygtukas yra rodomas - Slėpti žaidimus - Žaidimai yra paslėpti - Žaidimai yra rodomi - - Slėpti mygtuką \"Rodyti daugiau\" - Rodyti daugiau mygtukas paieškos rezultatuose yra paslėptas - Rodyti daugiau mygtukas paieškos rezultatuose yra rodomas - Slėpti apklausas - Apklausos paslėptos - Apklausos rodomos - Slėpti bilietų lentyną - Bilietų lentyna yra paslėpta - Bilietų lentyna yra rodoma - - Slėpti rekomenduojamų vaizdo įrašų etiketes - Etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ paieškos rezultatuose yra paslėptos - Etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ paieškos rezultatuose yra rodomos - Slėpti vizualinį tarpiklį - Vizualinis tarpiklis paslėptas - Vizualinis tarpiklis rodomas - - Slėpti YouTube Doodles - YouTube Doodles animacija ant logotipo yra paslėpta - YouTube Doodles animacija ant logotipo rodoma - "YouTube „Doodles“ rodomi kelias dienas per metus. + Slėpti mygtuką \"Rodyti daugiau\" + Rodyti daugiau mygtukas paieškos rezultatuose yra paslėptas + Rodyti daugiau mygtukas paieškos rezultatuose yra rodomas + Slėpti apklausas + Apklausos paslėptos + Apklausos rodomos + Slėpti bilietų lentyną + Bilietų lentyna yra paslėpta + Bilietų lentyna yra rodoma + + Slėpti rekomenduojamų vaizdo įrašų etiketes + Etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ paieškos rezultatuose yra paslėptos + Etiketės „Žmonės taip pat žiūrėjo“ ir „Jums taip pat gali patikti“ paieškos rezultatuose yra rodomos + Slėpti vizualinį tarpiklį + Vizualinis tarpiklis paslėptas + Vizualinis tarpiklis rodomas + + Slėpti YouTube Doodles + YouTube Doodles animacija ant logotipo yra paslėpta + YouTube Doodles animacija ant logotipo rodoma + "YouTube „Doodles“ rodomi kelias dienas per metus. Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas yra įjungtas, tada filtro juosta po paieškos juosta taip pat bus paslėpta." - Slėpti kanalo juostą - Kanalo juosta yra paslėpta - Kanalo juosta yra rodoma - Slėpti kanalo vandens ženklą - Vandens ženklas yra paslėptas - Vandens ženklas yra rodomas - Slėpti finansavimo dėžutę - Finansavimo dėžutė yra paslėpta - Finansavimo dėžutė yra rodoma - Slėpti skubios pagalbos langelius - Skubios pagalbos langai yra paslėpti - Skubios pagalbos langai yra rodomi - Slėpti informacijos plokštes - Informacijos plokštės yra paslėptos - Informacijos plokštės yra rodomos - - Slėpti prisijungimo mygtuką - Prisijungimo mygtukas yra paslėptas - Prisijungimo mygtukas yra rodomas - Slėpti medicinos plokštes - Medicinos plokštės yra paslėptos - Medicinos plokštės yra rodomos - Slėpti greituosius veiksmus - Greitieji veiksmai viso ekrano režimu paslėpti - Greitieji veiksmai viso ekrano režimu rodomi - Slėpti susijusius vaizdo įrašus - Susiję vaizdo įrašai greituosiuose veiksmuose paslėpti - Susiję vaizdo įrašai greituosiuose veiksmuose rodomi - Slėpti prenumeratoriams skirtas gaires - Prenumeratorių bendruomenės gairės yra paslėptos - Prenumeratorių bendruomenės gairės yra rodomos - Slėpti laiku įvykusias reakcijas - Laiku įvykusios reakcijos yra paslėptos - Laiku įvykusios reakcijos yra rodomos - Slėpti „AI sukurtos vaizdo įrašo santraukos“ - Dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius paslėptas - Rodomas dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius - Slėpti \"Klausti\" - Skyrius „Klausti“ yra paslėptas - Skyrius „Klausti“ yra rodomas - Slėpti atributus - Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra paslėpti - Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra rodomi - Slėpti skyrius - Skyrius \"Skyriai\" yra paslėptas - Skyrius \"Skyriai\" yra rodomas - Slėpti „Kaip buvo sukurtas šis turinys“ - Skyrius „Kaip buvo sukurtas šis turinys“ yra paslėptas - Skyrius „Kaip buvo sukurtas šis turinys“ yra rodomas - Slėpti „Hype“ taškus - „Hype“ taškai paslėpti - „Hype“ taškai rodomi - Slėpti „Naršyti podcast\'ą“ - Skyrius „Naršyti podcast\'ą“ yra paslėptas - Skyrius „Naršyti podcast\'ą“ yra rodomas - Slėpti rekomenduojamas nuorodas - Pasiūlytų nuorodų skiltis paslėpta - Pasiūlytų nuorodų skiltis rodoma - Slėpti pasiūlytus vaizdo įrašus - Pasiūlytų vaizdo įrašų skiltis paslėpta - Pasiūlytų vaizdo įrašų skiltis rodoma - Slėpti informacines korteles - Informacijos kortelių skyrius yra paslėptas - Informacijos kortelių skyrius yra rodomas - Slėpti „Pagrindines sąvokas“ - Skyrius „Pagrindinės sąvokos“ yra paslėptas - Skyrius „Pagrindinės sąvokos“ yra rodomas - Slėpti prenumeratos mygtuką - Prenumeratos mygtukas paslėptas - Prenumeratos mygtukas rodomas - Slėpti transkripciją - Transkripcijos skyrius yra paslėptas - Transkripcijos skyrius yra rodomas - Vaizdo įrašo aprašymas - Slėpti arba rodyti vaizdo įrašo aprašymo komponentus - Filtravimo juosta - Slėpti arba rodyti filtro juostą sklaidos kanaluose, susijusiuose vaizdo įrašuose, paieškos rezultatuose ir žiūrėjimo istorijoje - Slėpti sklaidos kanaluose - Paslėpta sklaidos kanaluose - Matoma sklaidos kanaluose - Slėpti susijusiuose vaizdo įrašuose - Paslėpta susijusiuose vaizdo įrašuose - Rodoma susijusiuose vaizdo įrašuose - Slėpti paieškos rezultatuose - Paslėpta paieškos rezultatuose - Rodoma paieškos rezultatuose - Slėpti žiūrėjimo istorijoje - Paslėpta žiūrėjimo istorijoje - Rodoma žiūrėjimo istorijoje - Kanalo puslapis - Slėpti arba rodyti kanalo puslapio komponentus - - Slėpti bendruomenės mygtuką - Bendruomenės mygtukas paslėptas - Bendruomenės mygtukas rodomas - - Slėpti lentyną „Tau skirti“ - Lentyna „Jums“ paslėpta - Lentyna „Jums“ rodoma - - Slėpti Prisijungti mygtuką - Prisijungti mygtukas paslėptas - Prisijungti mygtukas rodomas - Slėpti nuorodų peržiūrą - Nuorodų peržiūra paslėpta - Nuorodų peržiūra rodoma - Slėpti narių lentyną - Narių lentyna paslėpta - Narių lentyna rodoma - - Slėpti Parduotuvės mygtuką - Parduotuvės mygtukas paslėptas - Parduotuvės mygtukas rodomas - - Slėpti Prenumeruoti mygtuką - Prenumeruoti mygtukas paslėptas - Prenumeruoti mygtukas rodomas - Komentarai - Slėpti arba rodyti komentarų skyriaus komponentus - Slėpti AI pokalbių santrauką - AI pokalbių santrauka paslėpta - AI pokalbių santrauka rodoma - Slėpti AI komentarų santrauką - AI komentarų santrauka paslėpta - AI komentarų santrauka rodoma - Slėpti kanalo gaires - Kanalo gairės paslėptos - Kanalo gairės rodomos - Slėpti antraštę \"Narių komentarai\" - Narių komentarų antraštė paslėpta - Narių komentarų antraštė rodoma - Slėpti komentarų skyrių - Komentarų skyrius yra paslėptas - Komentarų skyrius yra rodomas - Slėpti bendruomenės gaires - Bendruomenės gairės paslėptos - Bendruomenės gairės rodomos - Slėpti \"Kurti Short\" mygtuką - Mygtukas „Sukurti Short“ paslėptas - Mygtukas „Sukurti Short“ rodomas - Slėpti jaustukų ir laiko žymos mygtukus - Jaustukų ir laiko žymos mygtukai yra paslėpti - Jaustukų ir laiko žymos mygtukai yra rodomi - Slėpti peržiūros komentarą - Peržiūros komentaras yra paslėptas - Peržiūros komentaras yra rodomas - PaslÄ—pti „Ačių“ mygtukÄ… - \"Ačiū\" mygtukas yra paslėptas - \"Ačiū\" mygtukas yra rodomas - Slėpti peržiūrų skaičių - Peržiūrų skaičius paslėptas kanale ir paieškos rezultatuose - Peržiūrų skaičius rodomas kanale ir paieškos rezultatuose - - "Apribojimai: + Slėpti prisijungimo mygtuką + Prisijungimo mygtukas yra paslėptas + Prisijungimo mygtukas yra rodomas + Slėpti medicinos plokštes + Medicinos plokštės yra paslėptos + Medicinos plokštės yra rodomos + Slėpti greituosius veiksmus + Greitieji veiksmai viso ekrano režimu paslėpti + Greitieji veiksmai viso ekrano režimu rodomi + Slėpti susijusius vaizdo įrašus + Susiję vaizdo įrašai greituosiuose veiksmuose paslėpti + Susiję vaizdo įrašai greituosiuose veiksmuose rodomi + Slėpti prenumeratoriams skirtas gaires + Prenumeratorių bendruomenės gairės yra paslėptos + Prenumeratorių bendruomenės gairės yra rodomos + Slėpti laiku įvykusias reakcijas + Laiku įvykusios reakcijos yra paslėptos + Laiku įvykusios reakcijos yra rodomos + Slėpti „AI sukurtos vaizdo įrašo santraukos“ + Dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius paslėptas + Rodomas dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius + Slėpti \"Klausti\" + Skyrius „Klausti“ yra paslėptas + Skyrius „Klausti“ yra rodomas + Slėpti atributus + Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra paslėpti + Teminių vietų, žaidimų, muzikos ir minimų žmonių skyriai yra rodomi + Slėpti skyrius + Skyrius \"Skyriai\" yra paslėptas + Skyrius \"Skyriai\" yra rodomas + Slėpti „Kaip buvo sukurtas šis turinys“ + Skyrius „Kaip buvo sukurtas šis turinys“ yra paslėptas + Skyrius „Kaip buvo sukurtas šis turinys“ yra rodomas + Slėpti „Hype“ taškus + „Hype“ taškai paslėpti + „Hype“ taškai rodomi + Slėpti „Naršyti podcast\'ą“ + Skyrius „Naršyti podcast\'ą“ yra paslėptas + Skyrius „Naršyti podcast\'ą“ yra rodomas + Slėpti rekomenduojamas nuorodas + Pasiūlytų nuorodų skiltis paslėpta + Pasiūlytų nuorodų skiltis rodoma + Slėpti pasiūlytus vaizdo įrašus + Pasiūlytų vaizdo įrašų skiltis paslėpta + Pasiūlytų vaizdo įrašų skiltis rodoma + Slėpti informacines korteles + Informacijos kortelių skyrius yra paslėptas + Informacijos kortelių skyrius yra rodomas + Slėpti „Pagrindines sąvokas“ + Skyrius „Pagrindinės sąvokos“ yra paslėptas + Skyrius „Pagrindinės sąvokos“ yra rodomas + Slėpti prenumeratos mygtuką + Prenumeratos mygtukas paslėptas + Prenumeratos mygtukas rodomas + Slėpti transkripciją + Transkripcijos skyrius yra paslėptas + Transkripcijos skyrius yra rodomas + Vaizdo įrašo aprašymas + Slėpti arba rodyti vaizdo įrašo aprašymo komponentus + Filtravimo juosta + Slėpti arba rodyti filtro juostą sklaidos kanaluose, susijusiuose vaizdo įrašuose, paieškos rezultatuose ir žiūrėjimo istorijoje + Slėpti sklaidos kanaluose + Paslėpta sklaidos kanaluose + Matoma sklaidos kanaluose + Slėpti susijusiuose vaizdo įrašuose + Paslėpta susijusiuose vaizdo įrašuose + Rodoma susijusiuose vaizdo įrašuose + Slėpti paieškos rezultatuose + Paslėpta paieškos rezultatuose + Rodoma paieškos rezultatuose + Slėpti žiūrėjimo istorijoje + Paslėpta žiūrėjimo istorijoje + Rodoma žiūrėjimo istorijoje + Kanalo puslapis + Slėpti arba rodyti kanalo puslapio komponentus + + Slėpti bendruomenės mygtuką + Bendruomenės mygtukas paslėptas + Bendruomenės mygtukas rodomas + + Slėpti lentyną „Tau skirti“ + Lentyna „Jums“ paslėpta + Lentyna „Jums“ rodoma + + Slėpti Prisijungti mygtuką + Prisijungti mygtukas paslėptas + Prisijungti mygtukas rodomas + Slėpti nuorodų peržiūrą + Nuorodų peržiūra paslėpta + Nuorodų peržiūra rodoma + Slėpti narių lentyną + Narių lentyna paslėpta + Narių lentyna rodoma + + Slėpti Parduotuvės mygtuką + Parduotuvės mygtukas paslėptas + Parduotuvės mygtukas rodomas + + Slėpti Prenumeruoti mygtuką + Prenumeruoti mygtukas paslėptas + Prenumeruoti mygtukas rodomas + Komentarai + Slėpti arba rodyti komentarų skyriaus komponentus + Slėpti AI pokalbių santrauką + AI pokalbių santrauka paslėpta + AI pokalbių santrauka rodoma + Slėpti AI komentarų santrauką + AI komentarų santrauka paslėpta + AI komentarų santrauka rodoma + Slėpti kanalo gaires + Kanalo gairės paslėptos + Kanalo gairės rodomos + Slėpti antraštę \"Narių komentarai\" + Narių komentarų antraštė paslėpta + Narių komentarų antraštė rodoma + Slėpti komentarų skyrių + Komentarų skyrius yra paslėptas + Komentarų skyrius yra rodomas + Slėpti bendruomenės gaires + Bendruomenės gairės paslėptos + Bendruomenės gairės rodomos + Slėpti \"Kurti Short\" mygtuką + Mygtukas „Sukurti Short“ paslėptas + Mygtukas „Sukurti Short“ rodomas + Slėpti jaustukų ir laiko žymos mygtukus + Jaustukų ir laiko žymos mygtukai yra paslėpti + Jaustukų ir laiko žymos mygtukai yra rodomi + Slėpti peržiūros komentarą + Peržiūros komentaras yra paslėptas + Peržiūros komentaras yra rodomas + PaslÄ—pti „Ačių“ mygtukÄ… + \"Ačiū\" mygtukas yra paslėptas + \"Ačiū\" mygtukas yra rodomas + Slėpti peržiūrų skaičių + Peržiūrų skaičius paslėptas kanale ir paieškos rezultatuose + Peržiūrų skaičius rodomas kanale ir paieškos rezultatuose + + "Apribojimai: • Shorts lentynos, kanalų puslapiai ir paieškos rezultatai vis tiek gali rodyti peržiūrų skaičių • Ši funkcija neveikia su automobiline formos išraiška" - Slėpti įkėlimo laiką - Įkėlimo laikas paslėptas sraute ir paieškos rezultatuose - Įkėlimo laikas rodomas sraute ir paieškos rezultatuose - - "Apribojimai: + Slėpti įkėlimo laiką + Įkėlimo laikas paslėptas sraute ir paieškos rezultatuose + Įkėlimo laikas rodomas sraute ir paieškos rezultatuose + + "Apribojimai: • „Shorts“ lentynose, kanalų puslapiuose ir paieškos rezultatuose vis dar gali būti rodomi įkėlimo laikai • Ši funkcija neveikia su automobilių formos faktoriumi" - Slėpti raktinių žodžių turinį - Slėpti paieškos ir sklaidos srauto vaizdo įrašus naudojant raktinių žodžių filtrus - Slėpti namų vaizdo įrašus pagal raktinius žodžius - Vaizdo įrašai namų skirtuke yra filtruojami pagal raktinius žodžius - Vaizdo įrašai namų skirtuke nėra filtruojami pagal raktinius žodžius - Slėpti paieškos rezultatus pagal raktinius žodžius - Paieškos rezultatai yra filtruojami pagal raktinius žodžius - Paieškos rezultatai nėra filtruojami pagal raktinius žodžius - Slėpti prenumeratos vaizdo įrašus pagal raktinius žodžius - Vaizdo įrašai prenumeratos skirtuke yra filtruojami pagal raktinius žodžius - Vaizdo įrašai prenumeratos skirtuke nėra filtruojami pagal raktinius žodžius - Raktinių žodžių slėpimas - - "Raktažodžiai ir frazės, kurias reikia slėpti, atskirti naujomis eilutėmis + "Raktažodžiai ir frazės, kurias reikia slėpti, atskirti naujomis eilutėmis Raktažodžiai gali būti kanalų pavadinimai arba bet koks tekstas, rodomas vaizdo įrašų pavadinimuose Žodžiai su didžiosiomis raidėmis viduryje turi būti įvesti su didžiosiomis raidėmis (pvz.: iPhone, TikTok, LeBlanc)" - Apie raktinių žodžių filtravimą - "„Pagrindinis“ / „Prenumeratos“ / „Paieška“ rezultatai filtruojami, kad būtų paslėptas turinys, atitinkantis raktinių frazių sąrašą. + Apie raktinių žodžių filtravimą + "„Pagrindinis“ / „Prenumeratos“ / „Paieška“ rezultatai filtruojami, kad būtų paslėptas turinys, atitinkantis raktinių frazių sąrašą. Apribojimai • Shorts negali būti paslėpti pagal kanalo pavadinimą • Kai kurie vartotojo sąsajos komponentai gali būti nepaslėpti • Ieškant raktinio žodžio, gali nebūti rezultatų" - Sutapti su visažodžiais - - Pateikto raktinio žodžio arba frazės apribojimas dvigubomis kabutėmis apsaugos nuo dalinio atitikimo vaizdo įrašų pavadinimuose ir kanalų pavadinimuose.<br><br>Pavyzdžiui,<br><b>\"ai\"</b> paslėps vaizdo įrašą: <b>Kaip veikia AI?</b><br>bet nepaslėps: <b>What does fair use mean?</b> - - Neįmanoma naudoti raktinio žodžio: %s - Naudokite kabutes, kad būtų galima naudoti raktinį žodį: %s - Raktiniam žodžiui yra prieštaraujančios deklaracijos: %s - Raktiniam žodžiui per trumpas ilgis ir reikia kabučių: %s - Raktiniu žodžiu bus paslėpti visi vaizdo įrašai: %s - - - Slėpti kūrėjo parduotuvės lentyną - Kūrėjų parduotuvės lentyna po vaizdo grotuvu yra paslėpta - Kūrėjų parduotuvės lentyna po vaizdo įrašo grotuvu rodoma - Paslˁpti pabaigos ekrano parduotuvÄ—s reklaminį juostelÄ™ - Pabaigos ekrano parduotuvės reklaminis skydelis yra paslėptas - Pabaigos ekrano parduotuvės reklaminis skydelis yra rodomas - Slėpti viso ekrano reklamas - "Pilno ekrano reklamos paslėptos + Sutapti su visažodžiais + + Pateikto raktinio žodžio arba frazės apribojimas dvigubomis kabutėmis apsaugos nuo dalinio atitikimo vaizdo įrašų pavadinimuose ir kanalų pavadinimuose.<br><br>Pavyzdžiui,<br><b>\"ai\"</b> paslėps vaizdo įrašą: <b>Kaip veikia AI?</b><br>bet nepaslėps: <b>What does fair use mean?</b> + + Neįmanoma naudoti raktinio žodžio: %s + Naudokite kabutes, kad būtų galima naudoti raktinį žodį: %s + Raktiniam žodžiui yra prieštaraujančios deklaracijos: %s + Raktiniam žodžiui per trumpas ilgis ir reikia kabučių: %s + Raktiniu žodžiu bus paslėpti visi vaizdo įrašai: %s + + + Slėpti kūrėjo parduotuvės lentyną + Kūrėjų parduotuvės lentyna po vaizdo grotuvu yra paslėpta + Kūrėjų parduotuvės lentyna po vaizdo įrašo grotuvu rodoma + Paslˁpti pabaigos ekrano parduotuvÄ—s reklaminį juostelÄ™ + Pabaigos ekrano parduotuvės reklaminis skydelis yra paslėptas + Pabaigos ekrano parduotuvės reklaminis skydelis yra rodomas + Slėpti viso ekrano reklamas + "Pilno ekrano reklamos paslėptos Ši funkcija yra prieinama tik senesniuose įrenginiuose" - Viso ekrano reklamos yra rodomos - - Slėpti viso ekrano reklamas veikia tik senesniuose įrenginiuose - Slėpti bendras reklamas - Bendros reklamos yra paslėptos - Bendros reklamos yra rodomos - Slėpti prekių banerius - Prekių baneriai yra paslėpti - Prekių baneriai yra rodomi - Slėpti apmokėtos reklamos etiketę - Apmokėtos reklamos etiketė yra paslėpta - Apmokėtos reklamos etiketė yra rodoma - Slėpti savarankiškus rėmėjų kortelės - Savarankiški rėmėjų kortelės yra paslėpti - Savarankiški rėmėjų kortelės yra rodomi - Slėpti pirkimo nuorodas - Apsipirkimo nuorodos vaizdo įrašo aprašyme yra paslėptos - Apsipirkimo nuorodos vaizdo įrašo aprašyme rodomos - Slėpti reklamjuostę „Žiūrėti produktus“ - Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra paslėptas - Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra rodomas - Slėpti žiniatinklio paieškos rezultatus - Žiniatinklio paieškos rezultatai yra paslėpti - Žiniatinklio paieškos rezultatai yra rodomi - - - Slėpti YouTube Premium reklamą - YouTube Premium reklama po vaizdo įrašo grotuvu yra paslėpta - YouTube Premium reklama po vaizdo įrašo grotuvu yra rodoma - - - Slėpti vaizdo įrašų reklamas - Vaizdo įrašų reklamos yra paslėptos - Vaizdo įrašų reklamos yra rodomos - - - URL nukopijuotas į iškarpinę - URL su laiko žyma nukopijuotas - Rodyti kopijuoti vaizdo įrašo URL mygtuką - Vaizdo įrašo nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą. Bakstelėkite ir palaikykite norėdami nukopijuoti su laiko žyma - Vaizdo įrašo nuorodos kopijavimo mygtukas nerodomas - Rodyti mygtuką kopijuoti laikrodžio URL - Laiko žymos nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą su laiko žyma. Bakstelėkite ir palaikykite norėdami nukopijuoti be laiko žymos - Laiko žymos nuorodos kopijavimo mygtukas nerodomas - - - Pašalinti žiūrovo nuožiūra dialogo langą - Dialogas bus pašalintas - Dialogas bus rodomas - Tai neaplenkia amžiaus apribojimo. Jis tiesiog jį automatiškai priima. - - - Išjungti „Prisijungti prie TV“ iššokantįjį langą - Prisijungimo prie TV iškylantysis langas išjungtas - Prisijungimo prie TV iškylantysis langas įjungtas - - - Išjungti dvigubo bakstelėjimo skyriaus praleidimą - Dvigubas bakstelėjimas niekada negali suaktyvinti praleidimo į kitą/ankstesnį skyrių - Dvigubas bakstelėjimas kartais gali suaktyvinti praleidimą į kitą/ankstesnį skyrių - - - Išoriniai atsisiuntimai - Nustatymai naudojant išorinį atsisiuntimo įrankį - Rodyti išorinį atsisiuntimo mygtuką - Atsisiuntimo mygtukas grotuve rodomas - Atsisiuntimo mygtukas grotuve nerodomas - - Perrašyti atsisiuntimo veiksmo mygtuką - Atsisiuntimo mygtukas atidaro jūsų išorinį atsisiuntimo įrankį - Atsisiuntimo mygtukas atidaro gimtąjį programėlės atsisiuntimo įrankį - Atsisiuntimo įrankio paketo pavadinimas - Įdiegtos išorinės atsisiuntimo programos paketo pavadinimas - Įveskite paketo pavadinimą - Kita - Programa neįdiegta - %s nėra įdiegtas. Prašome įdiegti. - "Nepavyko rasti įdiegtos programos, turinčios paketo pavadinimą: %s + Viso ekrano reklamos yra rodomos + + Slėpti viso ekrano reklamas veikia tik senesniuose įrenginiuose + Slėpti bendras reklamas + Bendros reklamos yra paslėptos + Bendros reklamos yra rodomos + Slėpti prekių banerius + Prekių baneriai yra paslėpti + Prekių baneriai yra rodomi + Slėpti apmokėtos reklamos etiketę + Apmokėtos reklamos etiketė yra paslėpta + Apmokėtos reklamos etiketė yra rodoma + Slėpti savarankiškus rėmėjų kortelės + Savarankiški rėmėjų kortelės yra paslėpti + Savarankiški rėmėjų kortelės yra rodomi + Slėpti pirkimo nuorodas + Apsipirkimo nuorodos vaizdo įrašo aprašyme yra paslėptos + Apsipirkimo nuorodos vaizdo įrašo aprašyme rodomos + Slėpti reklamjuostę „Žiūrėti produktus“ + Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra paslėptas + Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra rodomas + Slėpti žiniatinklio paieškos rezultatus + Žiniatinklio paieškos rezultatai yra paslėpti + Žiniatinklio paieškos rezultatai yra rodomi + + + Slėpti YouTube Premium reklamą + YouTube Premium reklama po vaizdo įrašo grotuvu yra paslėpta + YouTube Premium reklama po vaizdo įrašo grotuvu yra rodoma + + + Slėpti vaizdo įrašų reklamas + Vaizdo įrašų reklamos yra paslėptos + Vaizdo įrašų reklamos yra rodomos + + + URL nukopijuotas į iškarpinę + URL su laiko žyma nukopijuotas + Rodyti kopijuoti vaizdo įrašo URL mygtuką + Vaizdo įrašo nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą. Bakstelėkite ir palaikykite norėdami nukopijuoti su laiko žyma + Vaizdo įrašo nuorodos kopijavimo mygtukas nerodomas + Rodyti mygtuką kopijuoti laikrodžio URL + Laiko žymos nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą su laiko žyma. Bakstelėkite ir palaikykite norėdami nukopijuoti be laiko žymos + Laiko žymos nuorodos kopijavimo mygtukas nerodomas + + + Pašalinti žiūrovo nuožiūra dialogo langą + Dialogas bus pašalintas + Dialogas bus rodomas + Tai neaplenkia amžiaus apribojimo. Jis tiesiog jį automatiškai priima. + + + Išjungti „Prisijungti prie TV“ iššokantįjį langą + Prisijungimo prie TV iškylantysis langas išjungtas + Prisijungimo prie TV iškylantysis langas įjungtas + + + Išjungti dvigubo bakstelėjimo skyriaus praleidimą + Dvigubas bakstelėjimas niekada negali suaktyvinti praleidimo į kitą/ankstesnį skyrių + Dvigubas bakstelėjimas kartais gali suaktyvinti praleidimą į kitą/ankstesnį skyrių + + + Išoriniai atsisiuntimai + Nustatymai naudojant išorinį atsisiuntimo įrankį + Rodyti išorinį atsisiuntimo mygtuką + Atsisiuntimo mygtukas grotuve rodomas + Atsisiuntimo mygtukas grotuve nerodomas + + Perrašyti atsisiuntimo veiksmo mygtuką + Atsisiuntimo mygtukas atidaro jūsų išorinį atsisiuntimo įrankį + Atsisiuntimo mygtukas atidaro gimtąjį programėlės atsisiuntimo įrankį + Atsisiuntimo įrankio paketo pavadinimas + Įdiegtos išorinės atsisiuntimo programos paketo pavadinimas + Įveskite paketo pavadinimą + Kita + Programa neįdiegta + %s nėra įdiegtas. Prašome įdiegti. + "Nepavyko rasti įdiegtos programos, turinčios paketo pavadinimą: %s Patikrinkite, ar paketo pavadinimas yra teisingas ir programa įdiegta" - Paketo pavadinimas negali būti tuščias - - - Išjungti tikslų slinkties gestą - Gestas išjungtas - Gestas įjungtas - - - Įgalinti palietimą, kad būtų galima ieškoti - Bakstelėkite, kad įgalintumėte paiešką - Palietimas, kad būtų galima ieškoti, yra išjungtas - - - Įjungti ryškumo gestą - "Įjungtas viso ekrano ryškumo perbraukimas + Paketo pavadinimas negali būti tuščias + + + Išjungti tikslų slinkties gestą + Gestas išjungtas + Gestas įjungtas + + + Įgalinti palietimą, kad būtų galima ieškoti + Bakstelėkite, kad įgalintumėte paiešką + Palietimas, kad būtų galima ieškoti, yra išjungtas + + + Įjungti ryškumo gestą + "Įjungtas viso ekrano ryškumo perbraukimas Reguliuokite ryškumą perbraukdami vertikaliai kairėje ekrano pusėje" - Išjungtas viso ekrano ryškumo perbraukimas - Įjungti garsumo gestą - "Įjungtas viso ekrano garsumo perbraukimas + Išjungtas viso ekrano ryškumo perbraukimas + Įjungti garsumo gestą + "Įjungtas viso ekrano garsumo perbraukimas Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" - Išjungtas viso ekrano garsumo perbraukimas - Įgalinti paspaudimo ir perbraukimo gestą - Paspaudimas ir perbraukimas įjungtas - Paspaudimas ir perbraukimas išjungtas - Įjungti vibracijos atsiliepimą - Vibracijos atsiliepimas įjungtas - Vibracijos atsiliepimas išjungtas - Išsaugoti ir atkurti ryškumą - Išsaugoti ir atkurti ryškumą išeinant arba įeinant į viso ekrano režimą - Neišsaugoti ir neatkurti ryškumo išeinant arba įeinant į viso ekrano režimą - Įjungti automatinio ryškumo gestą - Slinkimas žemyn iki mažiausios ryškumo gesto vertės įjungia automatinį ryškumą - Slinkimas žemyn iki mažiausios vertės neįjungia automatinio ryškumo - Automatinis - Slinkties peržiūros išjungimo laikas - Milisekundžių skaičius, kiek laiko peržiūra matoma - Užšliaukite dangos nušveitimo fono permatinumas - Permatnumo vertė nuo 0 iki 100 - Slinkties permatnumas turi būti nuo 0 iki 100 - Perbraukimo perdangos ryškumo spalva - Ryškumo valdiklių eigos juostos spalva - Perbraukimo perdangos garsumo spalva - Garsumo valdiklių eigos juostos spalva - Perbraukimo perdangos teksto dydis - Perbraukimo perdangos teksto dydis turi būti nuo 1 iki 30 - Teksto dydis turi būti nuo 1 iki 30 - Slinkties dydžio slenkstis - Slenkstis, reikalingas slinkčiai - Slinkimo garsumo jautrumas - Kiek garsumas pasikeičia per braukimą - Perbraukimo perdangos stilius - Horizontali perdanga - Horizontali perdanga (minimali – viršuje) - Horizontali perdanga (minimali – centre) - Apskrita perdanga - Apskrita perdanga (minimali) - Vertikali perdanga - Vertikali perdanga (minimali) - Braukimas norint pakeisti vaizdo įrašus - Braukimas viso ekrano režimu pakeis į kitą/ankstesnį vaizdo įrašą - Braukimas viso ekrano režimu nepakeis į kitą/ankstesnį vaizdo įrašą - - - Išjungti automatinius antraštus - Automatiniai subtitrai išjungti - Automatiniai subtitrai įjungti - - - Veiksmo mygtukai - Slėpti arba rodyti mygtukus po vaizdo įrašais - Išjungti „Patinka“ ir „Prenumeruoti“ švytėjimą - Paminėti mygtukai \"Patinka\" ir \"Prenumeruoti\" nešvytės - Paminėti mygtukai \"Patinka\" ir \"Prenumeruoti\" švytės - Slėpti Patinka ir Nepatinka - Patinka ir Nepatinka mygtukai paslėpti - Patinka ir Nepatinka mygtukai rodomi - - Slėpti Bendrinti - Bendrinimo mygtukas paslėptas - Bendrinimo mygtukas rodomas - - Slėpti \"Stabdyti reklamą\" - Skelbimų stabdymo mygtukas paslėptas - Skelbimų stabdymo mygtukas rodomas - - Slėpti komentarus - Komentarų mygtukas paslėptas - Komentarų mygtukas rodomas - + Slėpti Bendrinti + Bendrinimo mygtukas paslėptas + Bendrinimo mygtukas rodomas + + Slėpti \"Stabdyti reklamą\" + Skelbimų stabdymo mygtukas paslėptas + Skelbimų stabdymo mygtukas rodomas + + Slėpti komentarus + Komentarų mygtukas paslėptas + Komentarų mygtukas rodomas + - Slėpti Pranešti - Pranešimo mygtukas paslėptas - Pranešimo mygtukas rodomas - - Slėpti Remiksas - Remikso mygtukas paslėptas - Remikso mygtukas rodomas - - Slėpti Atsisiųsti - Atsisiuntimo mygtukas paslėptas - Atsisiuntimo mygtukas rodomas - + Slėpti Remiksas + Remikso mygtukas paslėptas + Remikso mygtukas rodomas + + Slėpti Atsisiųsti + Atsisiuntimo mygtukas paslėptas + Atsisiuntimo mygtukas rodomas + - Slėpti Ažiotažą - „Hype“ mygtukas paslėptas - Haipo mygtukas rodomas - - Slėpti reklamą - Reklamos mygtukas paslėptas - Reklamos mygtukas rodomas - - Slėpti Ačiū - Ačiū mygtukas paslėptas - Ačiū mygtukas rodomas - + Slėpti reklamą + Reklamos mygtukas paslėptas + Reklamos mygtukas rodomas + + Slėpti Ačiū + Ačiū mygtukas paslėptas + Ačiū mygtukas rodomas + - Slėpti klausimą - Klausimo mygtukas yra paslėptas - Klausimo mygtukas rodomas - - Slėpti Iškarpą - Iškarpos mygtukas paslėptas - Iškarpos mygtukas rodomas - - Slėpti parduotuvę - Parduotuvės mygtukas paslėptas - Parduotuvės mygtukas rodomas - - Slėpti Išsaugoti - Išsaugojimo mygtukas paslėptas - Išsaugojimo mygtukas rodomas - - - Navigacijos mygtukai - Slėpti arba keisti mygtukus navigacijos juostoje - - Slėpti Pagrindinis - Pagrindinio mygtukas paslėptas - Pagrindinio mygtukas rodomas - - Slėpti Shorts - Shorts mygtukas paslėptas - Shorts mygtukas rodomas - - Slėpti Kurti - Kurti mygtukas paslėptas - Kurti mygtukas rodomas - - Slėpti Prenumeratos - Prenumeratų mygtukas paslėptas - Prenumeratų mygtukas rodomas - Slėpti pranešimus - Pranešimų mygtukas yra paslėptas - Pranešimų mygtukas rodomas - - Pakeisti Kurti su Pranešimais - "„Sukurti“ mygtukas pakeistas į „Pranešimai“ mygtuką + Slėpti klausimą + Klausimo mygtukas yra paslėptas + Klausimo mygtukas rodomas + + Slėpti Iškarpą + Iškarpos mygtukas paslėptas + Iškarpos mygtukas rodomas + + Slėpti parduotuvę + Parduotuvės mygtukas paslėptas + Parduotuvės mygtukas rodomas + + Slėpti Išsaugoti + Išsaugojimo mygtukas paslėptas + Išsaugojimo mygtukas rodomas + + + Navigacijos mygtukai + Slėpti arba keisti mygtukus navigacijos juostoje + + Slėpti Pagrindinis + Pagrindinio mygtukas paslėptas + Pagrindinio mygtukas rodomas + + Slėpti Shorts + Shorts mygtukas paslėptas + Shorts mygtukas rodomas + + Slėpti Kurti + Kurti mygtukas paslėptas + Kurti mygtukas rodomas + + Slėpti Prenumeratos + Prenumeratų mygtukas paslėptas + Prenumeratų mygtukas rodomas + Slėpti pranešimus + Pranešimų mygtukas yra paslėptas + Pranešimų mygtukas rodomas + + Pakeisti Kurti su Pranešimais + "„Sukurti“ mygtukas pakeistas į „Pranešimai“ mygtuką Pastaba: įjungus šį nustatymą, vaizdo įrašų reklamos taip pat yra priverstinai paslėptos" - Sukurti mygtukas nėra pakeistas Pranešimų mygtuku - "Išjungus šį nustatymą, bus išjungtas ir „Shorts“ skelbimų blokavimas. + Sukurti mygtukas nėra pakeistas Pranešimų mygtuku + "Išjungus šį nustatymą, bus išjungtas ir „Shorts“ skelbimų blokavimas. Jei pakeitus šį nustatymą neįsigalioja, pabandykite perjungti į inkognito režimą." - Slėpti naršymo mygtukų etiketes - Etiketės yra paslėptos - Etiketės yra rodomos - Išjungti permatomą būsenos juostą - Bžas statuso juosta nepermatoma - Bžas statuso juosta yra nepermatoma arba permatoma - Kai kuriuose įrenginiuose, įgalinus šią funkciją, sistemos naršymo juosta gali tapti permatoma. - Išjungti permatomą šviesią naršymo juostą - Šviesios spalvos naršymo juosta yra nepermatoma - Šviesiosios temos narūybos juosta yra nepermatoma arba permatoma - Išjunkite tamsios temos permatomą narūybos juostą - Tamsios spalvos naršymo juosta yra nepermatoma - Tamsios temos narūybos juosta yra nepermatoma arba permatoma - - - Išskleidžiamasis meniu - Slėpti arba rodyti žaidėjo išskleidžiamojo meniu elementus - - Slėpti Titrus - Titrų meniu yra paslėptas - Titrų meniu yra rodomas - - Slėpti Papildomus nustatymus - Papildomų nustatymų meniu yra paslėptas - Papildomų nustatymų meniu yra rodomas - - Slėpti Miego laikmatį - Miego laikmačio meniu yra paslėptas - Miego laikmačio meniu yra rodomas - - Slėpti Kartoti vaizdo įrašą - Kartoti vaizdo įrašą meniu yra paslėptas - Kartoti vaizdo įrašą meniu yra rodomas - - Slėpti Aplinkos režimą - Aplinkos režimo meniu yra paslėptas - Aplinkos režimo meniu yra rodomas - Slėpti Stabilią garsumą - Stabilaus garso meniu yra rodomas - Stabilaus garso meniu yra paslėptas - - Slėpti Pagalba & atsiliepimai - Pagalbos & atsiliepimų meniu yra paslėptas - Pagalbos & atsiliepimų meniu yra rodomas - - Slėpti Vaizdo įrašo atkūrimo greitį - Vaizdo įrašo atkūrimo greičio meniu yra paslėptas - Vaizdo įrašo atkūrimo greičio meniu yra rodomas - - Slėpti Ekrano užraktą - Ekrano užrakto meniu yra paslėptas - Ekrano užrakto meniu yra rodomas - - Slėpti Klausytis su „YouTube Music“ - „Klausytis su „YouTube Music““ meniu yra paslėptas - „Klausytis su „YouTube Music““ meniu yra rodomas - - Slėpti Garso takelius - Garso takelių meniu yra paslėptas - Garso takelių meniu yra rodomas - + Slėpti Titrus + Titrų meniu yra paslėptas + Titrų meniu yra rodomas + + Slėpti Papildomus nustatymus + Papildomų nustatymų meniu yra paslėptas + Papildomų nustatymų meniu yra rodomas + + Slėpti Miego laikmatį + Miego laikmačio meniu yra paslėptas + Miego laikmačio meniu yra rodomas + + Slėpti Kartoti vaizdo įrašą + Kartoti vaizdo įrašą meniu yra paslėptas + Kartoti vaizdo įrašą meniu yra rodomas + + Slėpti Aplinkos režimą + Aplinkos režimo meniu yra paslėptas + Aplinkos režimo meniu yra rodomas + Slėpti Stabilią garsumą + Stabilaus garso meniu yra rodomas + Stabilaus garso meniu yra paslėptas + + Slėpti Pagalba & atsiliepimai + Pagalbos & atsiliepimų meniu yra paslėptas + Pagalbos & atsiliepimų meniu yra rodomas + + Slėpti Vaizdo įrašo atkūrimo greitį + Vaizdo įrašo atkūrimo greičio meniu yra paslėptas + Vaizdo įrašo atkūrimo greičio meniu yra rodomas + + Slėpti Ekrano užraktą + Ekrano užrakto meniu yra paslėptas + Ekrano užrakto meniu yra rodomas + + Slėpti Klausytis su „YouTube Music“ + „Klausytis su „YouTube Music““ meniu yra paslėptas + „Klausytis su „YouTube Music““ meniu yra rodomas + + Slėpti Garso takelius + Garso takelių meniu yra paslėptas + Garso takelių meniu yra rodomas + - "Garso takelio meniu yra paslėptas + "Garso takelio meniu yra paslėptas Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į „Android No SDK“" - - Slėpti Žiūrėti VR - Žiūrėti VR meniu yra paslėptas - Žiūrėti VR meniu yra rodomas - Slėpti vaizdo kokybės meniu - Vaizdo kokybės meniu yra paslėptas - Vaizdo kokybės meniu yra rodomas - Slėpti vaizdo kokybės meniu apatinę juostą - Vaizdo kokybės meniu apatinė juosta yra paslėpta - Vaizdo kokybės meniu apatinė juosta yra rodoma - - - Paslėpti mygtuką „Automatinis atkūrimas\" - Automatinio paleidimo mygtukas yra paslėptas - Automatinio paleidimo mygtukas yra rodomas - - Paslėpti mygtuką „Titrai\" - Titrų mygtukas yra paslėptas - Titrų mygtukas yra rodomas - Paslėpti mygtuką \"Transliuoti\" - Transliacijos mygtukas yra paslėptas - Transliacijos mygtukas yra rodomas - Slėpti grotuvo valdiklių foną - Grotojo valdiklių fonas paslėptas - Rodomas grotuvo valdiklių fonas - Slėpti ankstesnius ir kitus mygtukus - Mygtukai yra paslėpti - Mygtukai yra rodomi - - - Slėpti ekrano pabaigos korteles - Ekrano pabaigos kortelės yra paslėptos - Ekrano pabaigos kortelės yra rodomos - - - Išjungti aplinkos režimą visame ekrane - Aplinkos režimas išjungtas - Aplinkos režimas įjungtas - - - Slėpti informacines korteles - Informacinės kortelės yra paslėptos - Informacinės kortelės yra rodomos - - - Išjungti besisukančių skaičių animacijas - Besisukantys skaičiai nėra animuoti - Besisukantys skaičiai yra animuoti - - - Slėpti vaizdo įrašo grotuvo paieškos juostą - Vaizdo įrašų grotuvo ieškojimo juosta yra paslėpta - Vaizdo įrašų grotuvo ieškojimo juosta yra rodoma - - Slėpti vaizdo įrašo miniatiūrų paieškos juostą - Vaizdo įrašo miniatiūrų paieškos juosta paslėpta - Vaizdo įrašo miniatiūrų paieškos juosta rodoma - - - Shorts grotuvas - Slėpti arba rodyti Shorts grotuvo komponentus - - Slėpti Shorts pagrindiniame sraute - Paslėpta pagrindiniame sraute ir susijusiuose vaizdo įrašuose - Rodoma pagrindiniame sraute ir susijusiuose vaizdo įrašuose - Slėpti Shorts paieškos rezultatuose - Paslėpti paieškos rezultatuose - Rodoma paieškos rezultatuose - - Slėpti Shorts prenumeratų sraute - Paslėpta prenumeratų sraute - Rodoma prenumeratų sraute - Slėpti šortus žiūrėjimo istorijoje - Paslėpta žiūrėjimo istorijoje - Rodoma žiūrėjimo istorijoje - Slėpti „Automatiškai įgarsinta“ etiketę - Automatiškai dubliuota žymė paslėpta - Automatiškai dubliuota žymė rodoma - Slėpti mygtuką „Pirkti super ačiū“ - Mygtukas „Pirkti Super Ačiū“ yra paslėptas - Mygtukas „Pirkti Super Ačiū“ yra rodomas - Slėpti efekto mygtuką - Efekto mygtukas paslėptas - Efekto mygtukas rodomas - Slėpti „Žaliojo ekrano“ mygtuką - \"Žaliojo ekrano\" mygtukas paslėptas - \"Žaliojo ekrano\" mygtukas rodomas - Slėpti grotažymės mygtuką - Grotažymės mygtukas paslėptas - Grotažymės mygtukas rodomas - - Paslėpti mygtuką „Prisijungti\" - Prisijungimo mygtukas yra paslėptas - Prisijungimo mygtukas rodomas - Slėpti tiesioginę peržiūrą - Tiesioginė peržiūra paslėpta - Tiesioginė peržiūra rodoma - Slėpti vietovės etiketę - Vietovės etiketė paslėpta - Vietovės etiketė rodoma - Slėpti mygtuką „Nauji įrašai“ - Paslėptas mygtukas „Nauji įrašai“ - Rodomas mygtukas „Nauji įrašai“ - Slėpti sustabdyto vaizdo mygtukus - Sustabdyto vaizdo mygtukai paslėpti - Sustabdyto vaizdo mygtukai rodomi - Slėpti peržiūros komentarą - Komentaro peržiūra paslėpta - Parodyta komentaro peržiūra - Slėpti mygtuką „Išsaugoti muziką“ - \"Išsaugoti muziką\" mygtukas paslėptas - \"Išsaugoti muziką\" mygtukas rodomas - Slėpti paieškos pasiūlymus - Paieškos pasiūlymai paslėpti - Paieškos pasiūlymai rodomi - Paslėpti mygtuką „Parduotuvė\" - Parduotuvės mygtukas paslėptas - Parduotuvės mygtukas rodomas - Slėpti lipdukus - Lipdukai paslėpti - Lipdukai rodomi - Paslėpti mygtuką „Prenumeruoti\" - Prenumeratos mygtukas paslėptas - Prenumeratos mygtukas rodomas - Slėpti pažymėtus produktus - Pažymėti produktai paslėpti - Pažymėti produktai rodomi - Paslėpti mygtuką „Ateina\" - \"Ateinančių\" mygtukas paslėptas - \"Ateinančių\" mygtukas rodomas - Slėpti mygtuką „Naudoti šį garsą“ - Mygtukas „Naudoti šį garsą“ paslėptas - Mygtukas „Naudoti šį garsą“ rodomas - Slėpti mygtuką „Naudoti šį šabloną“ - Mygtukas „Naudoti šį šabloną“ paslėptas - Rodomas mygtukas „Naudoti šį šabloną“ - Paslėpti mygtuko „Patinka“ fontaną - \"Patinka\" mygtuko fontano animacija paslėpta - \"Patinka\" mygtuko fontano animacija rodoma - Paslėpti mygtuką „Patinka\" - \"Patinka\" mygtukas paslėptas - \"Patinka\" mygtukas rodomas - Paslėpti mygtuką „Nepatinka\" - \"Nepatinka\" mygtukas paslėptas - \"Nepatinka\" mygtukas rodomas - Paslėpti mygtuką „Komentarai\" - Komentarų mygtukas paslėptas - Komentarų mygtukas rodomas - - Paslėpti mygtuką „Dalintis\" - \"Dalintis\" mygtukas paslėptas - \"Dalintis\" mygtukas rodomas - - Paslėpti mygtuką „Remixuoti\" - \"Remix\" mygtukas paslėptas - \"Remix\" mygtukas rodomas - Slėpti garso mygtuką - Garso mygtukas paslėptas - Garso mygtukas rodomas - Slėpti informacijos skydelį - Informacijos skydelis paslėptas - Informacijos skydelis rodomas - Slėpti kanalo juostą - Kanalo juosta paslėpta - Kanalo juosta rodoma - Slėpti vaizdo įrašo pavadinimą - Vaizdo įrašo pavadinimas yra paslėptas - Vaizdo įrašo pavadinimas yra rodomas - Slėpti garso metaduomenų etiketę - Garso metaduomenų etiketė yra paslėpta - Garso metaduomenų etiketė yra rodoma - Slėpti vaizdo įrašo nuorodos etiketę - Vaizdo įrašo nuorodos etiketė paslėpta - Vaizdo įrašo nuorodos etiketė rodoma - Slėpti naršymo juostą - Naršymo juosta paslėpta - Naršymo juosta rodoma - - - Slėpti pabaigos ekrano siūlomą vaizdo įrašą - "Pabaigos ekrane siūlomas vaizdo įrašas yra paslėptas, kai automatinis paleidimas yra išjungtas. + + Slėpti Žiūrėti VR + Žiūrėti VR meniu yra paslėptas + Žiūrėti VR meniu yra rodomas + Slėpti vaizdo kokybės meniu + Vaizdo kokybės meniu yra paslėptas + Vaizdo kokybės meniu yra rodomas + Slėpti vaizdo kokybės meniu apatinę juostą + Vaizdo kokybės meniu apatinė juosta yra paslėpta + Vaizdo kokybės meniu apatinė juosta yra rodoma + + + Paslėpti mygtuką „Automatinis atkūrimas\" + Automatinio paleidimo mygtukas yra paslėptas + Automatinio paleidimo mygtukas yra rodomas + + Paslėpti mygtuką „Titrai\" + Titrų mygtukas yra paslėptas + Titrų mygtukas yra rodomas + Paslėpti mygtuką \"Transliuoti\" + Transliacijos mygtukas yra paslėptas + Transliacijos mygtukas yra rodomas + Slėpti grotuvo valdiklių foną + Grotojo valdiklių fonas paslėptas + Rodomas grotuvo valdiklių fonas + Slėpti ankstesnius ir kitus mygtukus + Mygtukai yra paslėpti + Mygtukai yra rodomi + + + Slėpti ekrano pabaigos korteles + Ekrano pabaigos kortelės yra paslėptos + Ekrano pabaigos kortelės yra rodomos + + + Išjungti aplinkos režimą visame ekrane + Aplinkos režimas išjungtas + Aplinkos režimas įjungtas + + + Slėpti informacines korteles + Informacinės kortelės yra paslėptos + Informacinės kortelės yra rodomos + + + Išjungti besisukančių skaičių animacijas + Besisukantys skaičiai nėra animuoti + Besisukantys skaičiai yra animuoti + + + Slėpti vaizdo įrašo grotuvo paieškos juostą + Vaizdo įrašų grotuvo ieškojimo juosta yra paslėpta + Vaizdo įrašų grotuvo ieškojimo juosta yra rodoma + + Slėpti vaizdo įrašo miniatiūrų paieškos juostą + Vaizdo įrašo miniatiūrų paieškos juosta paslėpta + Vaizdo įrašo miniatiūrų paieškos juosta rodoma + + + Shorts grotuvas + Slėpti arba rodyti Shorts grotuvo komponentus + + Slėpti Shorts pagrindiniame sraute + Paslėpta pagrindiniame sraute ir susijusiuose vaizdo įrašuose + Rodoma pagrindiniame sraute ir susijusiuose vaizdo įrašuose + Slėpti Shorts paieškos rezultatuose + Paslėpti paieškos rezultatuose + Rodoma paieškos rezultatuose + + Slėpti Shorts prenumeratų sraute + Paslėpta prenumeratų sraute + Rodoma prenumeratų sraute + Slėpti šortus žiūrėjimo istorijoje + Paslėpta žiūrėjimo istorijoje + Rodoma žiūrėjimo istorijoje + Slėpti „Automatiškai įgarsinta“ etiketę + Automatiškai dubliuota žymė paslėpta + Automatiškai dubliuota žymė rodoma + Slėpti mygtuką „Pirkti super ačiū“ + Mygtukas „Pirkti Super Ačiū“ yra paslėptas + Mygtukas „Pirkti Super Ačiū“ yra rodomas + Slėpti efekto mygtuką + Efekto mygtukas paslėptas + Efekto mygtukas rodomas + Slėpti „Žaliojo ekrano“ mygtuką + \"Žaliojo ekrano\" mygtukas paslėptas + \"Žaliojo ekrano\" mygtukas rodomas + Slėpti grotažymės mygtuką + Grotažymės mygtukas paslėptas + Grotažymės mygtukas rodomas + + Paslėpti mygtuką „Prisijungti\" + Prisijungimo mygtukas yra paslėptas + Prisijungimo mygtukas rodomas + Slėpti tiesioginę peržiūrą + Tiesioginė peržiūra paslėpta + Tiesioginė peržiūra rodoma + Slėpti vietovės etiketę + Vietovės etiketė paslėpta + Vietovės etiketė rodoma + Slėpti mygtuką „Nauji įrašai“ + Paslėptas mygtukas „Nauji įrašai“ + Rodomas mygtukas „Nauji įrašai“ + Slėpti sustabdyto vaizdo mygtukus + Sustabdyto vaizdo mygtukai paslėpti + Sustabdyto vaizdo mygtukai rodomi + Slėpti peržiūros komentarą + Komentaro peržiūra paslėpta + Parodyta komentaro peržiūra + Slėpti mygtuką „Išsaugoti muziką“ + \"Išsaugoti muziką\" mygtukas paslėptas + \"Išsaugoti muziką\" mygtukas rodomas + Slėpti paieškos pasiūlymus + Paieškos pasiūlymai paslėpti + Paieškos pasiūlymai rodomi + Paslėpti mygtuką „Parduotuvė\" + Parduotuvės mygtukas paslėptas + Parduotuvės mygtukas rodomas + Slėpti lipdukus + Lipdukai paslėpti + Lipdukai rodomi + Paslėpti mygtuką „Prenumeruoti\" + Prenumeratos mygtukas paslėptas + Prenumeratos mygtukas rodomas + Slėpti pažymėtus produktus + Pažymėti produktai paslėpti + Pažymėti produktai rodomi + Paslėpti mygtuką „Ateina\" + \"Ateinančių\" mygtukas paslėptas + \"Ateinančių\" mygtukas rodomas + Slėpti mygtuką „Naudoti šį garsą“ + Mygtukas „Naudoti šį garsą“ paslėptas + Mygtukas „Naudoti šį garsą“ rodomas + Slėpti mygtuką „Naudoti šį šabloną“ + Mygtukas „Naudoti šį šabloną“ paslėptas + Rodomas mygtukas „Naudoti šį šabloną“ + Paslėpti mygtuko „Patinka“ fontaną + \"Patinka\" mygtuko fontano animacija paslėpta + \"Patinka\" mygtuko fontano animacija rodoma + Paslėpti mygtuką „Patinka\" + \"Patinka\" mygtukas paslėptas + \"Patinka\" mygtukas rodomas + Paslėpti mygtuką „Nepatinka\" + \"Nepatinka\" mygtukas paslėptas + \"Nepatinka\" mygtukas rodomas + Paslėpti mygtuką „Komentarai\" + Komentarų mygtukas paslėptas + Komentarų mygtukas rodomas + + Paslėpti mygtuką „Dalintis\" + \"Dalintis\" mygtukas paslėptas + \"Dalintis\" mygtukas rodomas + + Paslėpti mygtuką „Remixuoti\" + \"Remix\" mygtukas paslėptas + \"Remix\" mygtukas rodomas + Slėpti garso mygtuką + Garso mygtukas paslėptas + Garso mygtukas rodomas + Slėpti informacijos skydelį + Informacijos skydelis paslėptas + Informacijos skydelis rodomas + Slėpti kanalo juostą + Kanalo juosta paslėpta + Kanalo juosta rodoma + Slėpti vaizdo įrašo pavadinimą + Vaizdo įrašo pavadinimas yra paslėptas + Vaizdo įrašo pavadinimas yra rodomas + Slėpti garso metaduomenų etiketę + Garso metaduomenų etiketė yra paslėpta + Garso metaduomenų etiketė yra rodoma + Slėpti vaizdo įrašo nuorodos etiketę + Vaizdo įrašo nuorodos etiketė paslėpta + Vaizdo įrašo nuorodos etiketė rodoma + Slėpti naršymo juostą + Naršymo juosta paslėpta + Naršymo juosta rodoma + + + Slėpti pabaigos ekrano siūlomą vaizdo įrašą + "Pabaigos ekrane siūlomas vaizdo įrašas yra paslėptas, kai automatinis paleidimas yra išjungtas. Automatinį paleidimą galima pakeisti „YouTube“ nustatymuose: Nustatymai → Atkūrimas → Automatiškai leisti kitą vaizdo įrašą" - Pabaigos ekrane siūlomas vaizdo įrašas rodomas - - - Slėpti susijusių vaizdo įrašų perdangą - Susijusių vaizdo įrašų perdanga viso ekrano režimu yra paslėpta - Susijusių vaizdo įrašų perdanga viso ekrano režimu yra rodoma - - - Slėpti vaizdo įrašo laiko žymę - Laiko žymė paslėpta - Laiko žymė rodoma - - - Slėpti grotuvo iššokančius skydelius - Grotuvo iššokančius skydelius paslėpti - Grotuvo iššokančius skydelius rodyti - - - Išeiti iš viso ekrano režimo pasibaigus vaizdo įrašui - Išjungta - Portreto - Kraštovaizdžio - Portreto ir kraštovaizdžio - - - Atidaryti vaizdo įrašus pilno ekrano vertikalioje orientacijoje - Vaizdo įrašai atidaromi pilnu ekranu - Vaizdo įrašai neatsidaro pilnu ekranu - - - Grotuvo persidengimo nepermatomumas - Permatumo vertė nuo 0 iki 100, kur 0 yra skaidrus - Grotuvo persidengimo permatomumas turi būti nuo 0 iki 100 - - - - \"Nepatinka\" laikinai nepasiekiami (API laikas baigėsi) - \"Nepatinka\" nepasiekiami (būsena %d) - Nepritarimai nepasiekiami (kliento API apribojimas) - \"Nepatinka\" nepasiekiami (%s) - - Perkraukite vaizdo įrašą, kad balsuotumėte naudodami „Return YouTube Dislike“ - - Paslėpta savininko - \"Nepatinka\" rodomi - \"Nepatinka\" nerodomi - Rodyti \"Nepatinka\" Shorts - "Nepritarimai „Shorts“ rodomi + Pabaigos ekrane siūlomas vaizdo įrašas rodomas + + + Slėpti susijusių vaizdo įrašų perdangą + Susijusių vaizdo įrašų perdanga viso ekrano režimu yra paslėpta + Susijusių vaizdo įrašų perdanga viso ekrano režimu yra rodoma + + + Slėpti vaizdo įrašo laiko žymę + Laiko žymė paslėpta + Laiko žymė rodoma + + + Slėpti grotuvo iššokančius skydelius + Grotuvo iššokančius skydelius paslėpti + Grotuvo iššokančius skydelius rodyti + + + Išeiti iš viso ekrano režimo pasibaigus vaizdo įrašui + Išjungta + Portreto + Kraštovaizdžio + Portreto ir kraštovaizdžio + + + Atidaryti vaizdo įrašus pilno ekrano vertikalioje orientacijoje + Vaizdo įrašai atidaromi pilnu ekranu + Vaizdo įrašai neatsidaro pilnu ekranu + + + Grotuvo persidengimo nepermatomumas + Permatumo vertė nuo 0 iki 100, kur 0 yra skaidrus + Grotuvo persidengimo permatomumas turi būti nuo 0 iki 100 + + + + \"Nepatinka\" laikinai nepasiekiami (API laikas baigėsi) + \"Nepatinka\" nepasiekiami (būsena %d) + Nepritarimai nepasiekiami (kliento API apribojimas) + \"Nepatinka\" nepasiekiami (%s) + + Perkraukite vaizdo įrašą, kad balsuotumėte naudodami „Return YouTube Dislike“ + + Paslėpta savininko + \"Nepatinka\" rodomi + \"Nepatinka\" nerodomi + Rodyti \"Nepatinka\" Shorts + "Nepritarimai „Shorts“ rodomi Apribojimas: nepritarimai gali būti nerodomi inkognito režimu" - Nepritarimai „Shorts“ nerodomi - \"Nepatinka\" procentais - Nepritarimai rodomi kaip procentinė dalis - Nepritarimai rodomi kaip skaičius - - Kompaktiškas mygtukas „Patinka\" - \"Patinka\" mygtukas suformuotas minimaliam pločiui - \"Patinka\" mygtukas suformuotas geriausiam vaizdui - Rodyti numatomus patiktukus - Vaizdo įrašuose, kuriuose išjungti „Patinka“, rodomas apytikslis „Patinka“ skaičius - Apytiksliai „Patinka“ nerodomi - Rodyti pranešimą, jei API nepasiekiamas - Pranešimas rodomas, jei „Return YouTube Dislike“ nepasiekiamas - Pranešimas nerodomas, jei „Return YouTube Dislike“ nepasiekiamas - Duomenys pateikiami „Return YouTube Dislike“ API. Bakstelėkite čia, norėdami sužinoti daugiau - - „ReturnYouTubeDislike“ API statistika šioje įrenginyje - API atsakymo laikas, vidurkis - API atsakymo laikas, minimumas - API atsakymo laikas, maksimalus - API atsakymo laikas, paskutinis vaizdo įrašas - Nemėgstama laikinai neprieinama - Kliento API normos ribojimas aktyvus - API balsų nuskaitymas, skambučių skaičius - Tinklo skambučių nebuvo - Atlikta %d tinklo skambučių - API balsų nuskaitymas, išjungimų skaičius - Nė vienas tinklo skambutis nebuvo išjungtas - %d tinklo skambučių buvo išjungti - API kliento normos ribojimas - Nėra kliento normos ribojimo - Kliento normos ribojimas įvyko %d kartus - %d milisekundžių - - - Įjungti plačią paieškos juostą - Plačioji paieškos juosta įjungta - Plačioji paieškos juosta išjungta - - - Įjungti aukštos kokybės miniatiūras - Paieškos juostos miniatiūros yra aukštos kokybės - Paieškos juostos miniatiūros yra vidutinės kokybės - "Tai taip pat atkurs miniatiūras tiesioginėse transliacijose, kuriose nėra miniatiūrų paieškos juostoje. + Nepritarimai „Shorts“ nerodomi + \"Nepatinka\" procentais + Nepritarimai rodomi kaip procentinė dalis + Nepritarimai rodomi kaip skaičius + + Kompaktiškas mygtukas „Patinka\" + \"Patinka\" mygtukas suformuotas minimaliam pločiui + \"Patinka\" mygtukas suformuotas geriausiam vaizdui + Rodyti numatomus patiktukus + Vaizdo įrašuose, kuriuose išjungti „Patinka“, rodomas apytikslis „Patinka“ skaičius + Apytiksliai „Patinka“ nerodomi + Rodyti pranešimą, jei API nepasiekiamas + Pranešimas rodomas, jei „Return YouTube Dislike“ nepasiekiamas + Pranešimas nerodomas, jei „Return YouTube Dislike“ nepasiekiamas + Duomenys pateikiami „Return YouTube Dislike“ API. Bakstelėkite čia, norėdami sužinoti daugiau + + „ReturnYouTubeDislike“ API statistika šioje įrenginyje + API atsakymo laikas, vidurkis + API atsakymo laikas, minimumas + API atsakymo laikas, maksimalus + API atsakymo laikas, paskutinis vaizdo įrašas + Nemėgstama laikinai neprieinama - Kliento API normos ribojimas aktyvus + API balsų nuskaitymas, skambučių skaičius + Tinklo skambučių nebuvo + Atlikta %d tinklo skambučių + API balsų nuskaitymas, išjungimų skaičius + Nė vienas tinklo skambutis nebuvo išjungtas + %d tinklo skambučių buvo išjungti + API kliento normos ribojimas + Nėra kliento normos ribojimo + Kliento normos ribojimas įvyko %d kartus + %d milisekundžių + + + Įjungti plačią paieškos juostą + Plačioji paieškos juosta įjungta + Plačioji paieškos juosta išjungta + + + Įjungti aukštos kokybės miniatiūras + Paieškos juostos miniatiūros yra aukštos kokybės + Paieškos juostos miniatiūros yra vidutinės kokybės + "Tai taip pat atkurs miniatiūras tiesioginėse transliacijose, kuriose nėra miniatiūrų paieškos juostoje. Paieškos juostos miniatiūros bus naudojamos tos pačios kokybės kaip dabartinis vaizdo įrašas. Ši funkcija geriausiai veikia su 720p ar žemesnės kokybės vaizdo įrašu ir naudojant labai greitą interneto ryšį." - Atkurti senas paieškos juostos miniatiūras - Paieškos juostos miniatiūros bus rodomos virš paieškos juostos - Paieškos juostos miniatiūros bus rodomos viso ekrano režimu - - - Įjungti SponsorBlock - SponsorBlock – tai sutelktinė sistema, skirta praleisti erzinamam YouTube vaizdo įrašo dalims - Išvaizda - Rodyti balsavimo mygtuką - Segmento balsavimo mygtukas rodomas - Segmento balsavimo mygtukas nerodomas - Naudoti kvadratinę išdėstymo schemą - Mygtukai ir valdikliai yra kvadratiniai - Mygtukai ir valdikliai yra suapvalinti - - Naudoti kompaktišką praleidimo mygtuką - Praleidimo mygtukas suprojektuotas minimaliai pločio - Praleidimo mygtukas suprojektuotas geriausiam vaizdui - Automatiškai slėpti praleidimo mygtuką - Praleidimo mygtukas pasislėps po kelių sekundžių - Praleidimo mygtukas rodomas visam segmentui - Praleidimo mygtuko trukmė - Kiek laiko rodyti praleidimo ir praleidimo iki paryškinimo mygtukus prieš juos automatiškai paslepiant - Rodyti praleidimo anuliavimo pranešimą - Pranešimas rodomas, kai segmentas automatiškai praleidžiamas. Bakstelėkite pranešimą, norėdami anuliuoti praleidimą - Pranešimas nerodomas - Praleidimo pranešimo trukmė - Kiek laiko rodyti pranešimą apie praleidimo atšaukimą - 1 sekundė - 2 sekundės - 3 sekundės - 4 sekundės - 5 sekundės - 6 sekundės - 7 sekundės - 8 sekundės - 9 sekundės - 10 sekundžių - Rodyti vaizdo įrašo trukmę be segmentų - Vaizdo įrašo trukmė be visų segmentų rodoma paieškos juostoje - Rodoma visa vaizdo įrašo trukmė - Kuriant naujus segmentus - Rodyti mygtuką „Kurti naują segmentą“ - Mygtukas „Sukurti naują segmentą“ rodomas - Mygtukas „Sukurti naują segmentą“ nerodomas - Koreguoti naujo segmento žingsnį - Milisekundžių skaičius, kai laiko koregavimo mygtukai juda kuriant naujus segmentus - Reikšmė turi būti teigiamas skaičius - Peržiūrėti gaires - Gairėse pateikiamos taisyklės ir patarimai, kaip kurti naujus segmentus - Laikytis gairių - Prieš kuriant naujus segmentus, perskaitykite SponsorBlock gaires - Jau perskaičiau - Rodyti - Bendrieji - Rodyti pranešimą, jei API neprieinama - Pranešimas rodomas, jei SponsorBlock neprieinama - Pranešimas nerodomas, jei SponsorBlock neprieinama - Įjungti praleidimo skaičiavimo sekimą - Leidžia SponsorBlock reitingui žinoti, kiek laiko sutaupoma. Žinutė siunčiama į reitingą kaskart, kai praleidžiamas segmentas - Praleidimo skaičiavimo sekimas neišjungtas - Minimalus segmento trukmė - Segmentai, trumpesni už šią vertę (sekundėmis), nerodomi ir nepraleidžiami - Netinkamas laiko tarpas - Jūsų privatus vartotojo ID - Šis ID turėtų būti laikomas privatus. Jis panašus į slaptažodį ir neturėtų būti dalijamasi su niekuo. Jei kas nors jį turi, jis gali apsimesti jumis - Privatus vartotojo ID turi būti bent 30 simbolių ilgio - Keisti API URL - Adresas, kurį SponsorBlock naudoja skambindamas į serverį - API URL atstatytas - API URL yra netinkamas - API URL pakeistas - Importavimas/eksportavimas nustatymų - Kopijuoti - Jūsų SponsorBlock JSON konfigūracija, kurią galima importuoti/eksportuoti į ReVanced ir kitas SponsorBlock platformas - Jūsų SponsorBlock JSON konfigūracija, kurią galima importuoti/eksportuoti į ReVanced ir kitas SponsorBlock platformas. Tai apima jūsų privatų vartotojo ID. Būkite atsargūs dalindamiesi šia informacija - Nustatymai importuoti sėkmingai - Nepavyko importuoti: %s - Nepavyko eksportuoti: %s - "Jūsų nustatymuose yra privatus SponsorBlock vartotojo ID. + Atkurti senas paieškos juostos miniatiūras + Paieškos juostos miniatiūros bus rodomos virš paieškos juostos + Paieškos juostos miniatiūros bus rodomos viso ekrano režimu + + + Įjungti SponsorBlock + SponsorBlock – tai sutelktinė sistema, skirta praleisti erzinamam YouTube vaizdo įrašo dalims + Išvaizda + Rodyti balsavimo mygtuką + Segmento balsavimo mygtukas rodomas + Segmento balsavimo mygtukas nerodomas + Naudoti kvadratinę išdėstymo schemą + Mygtukai ir valdikliai yra kvadratiniai + Mygtukai ir valdikliai yra suapvalinti + + Naudoti kompaktišką praleidimo mygtuką + Praleidimo mygtukas suprojektuotas minimaliai pločio + Praleidimo mygtukas suprojektuotas geriausiam vaizdui + Automatiškai slėpti praleidimo mygtuką + Praleidimo mygtukas pasislėps po kelių sekundžių + Praleidimo mygtukas rodomas visam segmentui + Praleidimo mygtuko trukmė + Kiek laiko rodyti praleidimo ir praleidimo iki paryškinimo mygtukus prieš juos automatiškai paslepiant + Rodyti praleidimo anuliavimo pranešimą + Pranešimas rodomas, kai segmentas automatiškai praleidžiamas. Bakstelėkite pranešimą, norėdami anuliuoti praleidimą + Pranešimas nerodomas + Praleidimo pranešimo trukmė + Kiek laiko rodyti pranešimą apie praleidimo atšaukimą + 1 sekundė + 2 sekundės + 3 sekundės + 4 sekundės + 5 sekundės + 6 sekundės + 7 sekundės + 8 sekundės + 9 sekundės + 10 sekundžių + Rodyti vaizdo įrašo trukmę be segmentų + Vaizdo įrašo trukmė be visų segmentų rodoma paieškos juostoje + Rodoma visa vaizdo įrašo trukmė + Kuriant naujus segmentus + Rodyti mygtuką „Kurti naują segmentą“ + Mygtukas „Sukurti naują segmentą“ rodomas + Mygtukas „Sukurti naują segmentą“ nerodomas + Koreguoti naujo segmento žingsnį + Milisekundžių skaičius, kai laiko koregavimo mygtukai juda kuriant naujus segmentus + Reikšmė turi būti teigiamas skaičius + Peržiūrėti gaires + Gairėse pateikiamos taisyklės ir patarimai, kaip kurti naujus segmentus + Laikytis gairių + Prieš kuriant naujus segmentus, perskaitykite SponsorBlock gaires + Jau perskaičiau + Rodyti + Bendrieji + Rodyti pranešimą, jei API neprieinama + Pranešimas rodomas, jei SponsorBlock neprieinama + Pranešimas nerodomas, jei SponsorBlock neprieinama + Įjungti praleidimo skaičiavimo sekimą + Leidžia SponsorBlock reitingui žinoti, kiek laiko sutaupoma. Žinutė siunčiama į reitingą kaskart, kai praleidžiamas segmentas + Praleidimo skaičiavimo sekimas neišjungtas + Minimalus segmento trukmė + Segmentai, trumpesni už šią vertę (sekundėmis), nerodomi ir nepraleidžiami + Netinkamas laiko tarpas + Jūsų privatus vartotojo ID + Šis ID turėtų būti laikomas privatus. Jis panašus į slaptažodį ir neturėtų būti dalijamasi su niekuo. Jei kas nors jį turi, jis gali apsimesti jumis + Privatus vartotojo ID turi būti bent 30 simbolių ilgio + Keisti API URL + Adresas, kurį SponsorBlock naudoja skambindamas į serverį + API URL atstatytas + API URL yra netinkamas + API URL pakeistas + Importavimas/eksportavimas nustatymų + Kopijuoti + Jūsų SponsorBlock JSON konfigūracija, kurią galima importuoti/eksportuoti į ReVanced ir kitas SponsorBlock platformas + Jūsų SponsorBlock JSON konfigūracija, kurią galima importuoti/eksportuoti į ReVanced ir kitas SponsorBlock platformas. Tai apima jūsų privatų vartotojo ID. Būkite atsargūs dalindamiesi šia informacija + Nustatymai importuoti sėkmingai + Nepavyko importuoti: %s + Nepavyko eksportuoti: %s + "Jūsų nustatymuose yra privatus SponsorBlock vartotojo ID. Jūsų vartotojo ID yra kaip slaptažodis ir jo niekada nereikėtų dalintis. " - Nerodyti dar kartą - Keisti segmento elgseną - Rėmėjas - Mokesčių reklama, mokama rekomendacija ir tiesioginė reklama. Ne skirta savireklamos tikslams ar nemokamai paminėti priežastims/kūrėjams/svetainėms/produktams, kurie jiems patinka - Nemokama/Savireklama - Panašiai kaip rėmėjas, išskyrus nemokamas arba asmenines reklamas. Apima skirsnius apie prekes, aukas arba informaciją apie asmenis, su kuriais bendradarbiavo - Sąveikos priminimas (Prenumerata) - Trumpas priminimas, kad turinys būtų patikęs, prenumeruojamas arba sekama. Jei jis ilgas arba susijęs su kažkuo specifiniu, vietoj to jis turėtų būti savireklama - Akcentas - Vaizdo įrašo dalis, kurią dauguma žmonių ieško - Pertraukos / Įvado animacija - Intervalas be tikrojo turinio. Gali būti pauzė, statinis kadras arba kartojama animacija. Neįtraukiami perėjimai su informacija - Pabaigos intarpai / Titrai - Titrai arba kai rodomos „YouTube“ pabaigos kortelės. Netinka išvadoms su informacija - Įžanga / Pasveikinimai - Įgarsinti būsimo vaizdo įrašo anonsai, pasveikinimai ir atsisveikinimai. Neįtraukiamos sekcijos, kurios prideda papildomo turinio - Peržiūra / Santrauka - Ištraukų rinkinys, rodantis, kas bus toliau arba kas įvyko vaizdo įraše ar kituose serijos vaizdo įrašuose, kur visa informacija kartojama kitur - Nukrypimas / Juokeliai - Į šalį nukrypstančios scenos ar anekdotai, kurie nėra būtini pagrindiniam vaizdo įrašo turiniui suprasti. Neįtraukiamos sekcijos, pateikiančios kontekstą ar foninę informaciją - Muzika: Ne muzikos dalis - Tinka tik muzikos vaizdo įrašams. Muzikos vaizdo įrašų dalys be muzikos, kurios dar nėra apimtos kita kategorija - Praleisti - Pažymėti - Praleisti rėmėją - Praleisti reklamą - Praleisti sąveiką - Praleisti iki pažymėtos vietos - Praleisti įvadą - Praleisti pertrauką - Praleisti pertrauką - Praleisti pabaigą - Praleisti įžangą - Praleisti peržiūrą - Praleisti peržiūrą - Praleisti apžvalgą - Praleisti tangentą - Praleisti ne muzikos dalį - Praleisti segmentą - Praleistas rėmėjas - Praleista savireklama - Praleistas erzinantis priminimas - Praleista iki pažymėtos vietos - Praleistas įvadas - Praleista pertrauka - Praleista pertrauka - Praleista pabaiga - Įžanga praleista - Praleista peržiūra - Praleista peržiūra - Praleista apžvalga - Tangentas praleistas - Praleista ne muzikos dalis - Praleistas nepateiktas segmentas - Praleista keli segmentai - Praleisti automatiškai - Praleisti automatiškai vieną kartą - Rodyti praleidimo mygtuką - Rodyti ieškojimo juostoje - Išjungti - Nepavyko pateikti segmento: %s - „SponsorBlock“ laikinai neveikia - Nepavyko pateikti segmento (būsena: %1$d %2$s) - Nepavyko pateikti segmento. Apribota norma (per daug iš to paties vartotojo arba IP) - Nepavyko pateikti segmento: %s - "Nepavyko pateikti segmento. + Nerodyti dar kartą + Keisti segmento elgseną + Rėmėjas + Mokesčių reklama, mokama rekomendacija ir tiesioginė reklama. Ne skirta savireklamos tikslams ar nemokamai paminėti priežastims/kūrėjams/svetainėms/produktams, kurie jiems patinka + Nemokama/Savireklama + Panašiai kaip rėmėjas, išskyrus nemokamas arba asmenines reklamas. Apima skirsnius apie prekes, aukas arba informaciją apie asmenis, su kuriais bendradarbiavo + Sąveikos priminimas (Prenumerata) + Trumpas priminimas, kad turinys būtų patikęs, prenumeruojamas arba sekama. Jei jis ilgas arba susijęs su kažkuo specifiniu, vietoj to jis turėtų būti savireklama + Akcentas + Vaizdo įrašo dalis, kurią dauguma žmonių ieško + Pertraukos / Įvado animacija + Intervalas be tikrojo turinio. Gali būti pauzė, statinis kadras arba kartojama animacija. Neįtraukiami perėjimai su informacija + Pabaigos intarpai / Titrai + Titrai arba kai rodomos „YouTube“ pabaigos kortelės. Netinka išvadoms su informacija + Įžanga / Pasveikinimai + Įgarsinti būsimo vaizdo įrašo anonsai, pasveikinimai ir atsisveikinimai. Neįtraukiamos sekcijos, kurios prideda papildomo turinio + Peržiūra / Santrauka + Ištraukų rinkinys, rodantis, kas bus toliau arba kas įvyko vaizdo įraše ar kituose serijos vaizdo įrašuose, kur visa informacija kartojama kitur + Nukrypimas / Juokeliai + Į šalį nukrypstančios scenos ar anekdotai, kurie nėra būtini pagrindiniam vaizdo įrašo turiniui suprasti. Neįtraukiamos sekcijos, pateikiančios kontekstą ar foninę informaciją + Muzika: Ne muzikos dalis + Tinka tik muzikos vaizdo įrašams. Muzikos vaizdo įrašų dalys be muzikos, kurios dar nėra apimtos kita kategorija + Praleisti + Pažymėti + Praleisti rėmėją + Praleisti reklamą + Praleisti sąveiką + Praleisti iki pažymėtos vietos + Praleisti įvadą + Praleisti pertrauką + Praleisti pertrauką + Praleisti pabaigą + Praleisti įžangą + Praleisti peržiūrą + Praleisti peržiūrą + Praleisti apžvalgą + Praleisti tangentą + Praleisti ne muzikos dalį + Praleisti segmentą + Praleistas rėmėjas + Praleista savireklama + Praleistas erzinantis priminimas + Praleista iki pažymėtos vietos + Praleistas įvadas + Praleista pertrauka + Praleista pertrauka + Praleista pabaiga + Įžanga praleista + Praleista peržiūra + Praleista peržiūra + Praleista apžvalga + Tangentas praleistas + Praleista ne muzikos dalis + Praleistas nepateiktas segmentas + Praleista keli segmentai + Praleisti automatiškai + Praleisti automatiškai vieną kartą + Rodyti praleidimo mygtuką + Rodyti ieškojimo juostoje + Išjungti + Nepavyko pateikti segmento: %s + „SponsorBlock“ laikinai neveikia + Nepavyko pateikti segmento (būsena: %1$d %2$s) + Nepavyko pateikti segmento. Apribota norma (per daug iš to paties vartotojo arba IP) + Nepavyko pateikti segmento: %s + "Nepavyko pateikti segmento. Jau egzistuoja" - Segmentas pateiktas sėkmingai - - SponsorBlock laikinai neprieinamas (API laikas baigėsi) - „SponsorBlock“ laikinai neprieinamas (būsena %d) - „SponsorBlock“ laikinai neprieinamas - Nepavyko balsuoti už segmentą (API laikas baigėsi) - Nepavyko balsuoti už segmentą (būsena: %1$d %2$s) - Nepavyko balsuoti už segmentą: %s - Balsuoti už - Balsuoti prieš - Keisti kategoriją - Nėra segmentų, už kuriuos būtų galima balsuoti - - Nuo %1$s iki %2$s - Pasirinkite segmento kategoriją - Kategorija išjungta nustatymuose. Įjunkite kategoriją, kad galėtumėte pateikti. - Naujas „SponsorBlock“ segmentas - Nustatyti %s kaip naujo segmento pradžią arba pabaigą? - Pradžia - Pabaiga - Dabar - Laikas, nuo kurio prasideda segmentas - Laikas, kuriuo baigiasi segmentas - Ar laikas teisingas? - "Segmentas è è + Segmentas pateiktas sėkmingai + + SponsorBlock laikinai neprieinamas (API laikas baigėsi) + „SponsorBlock“ laikinai neprieinamas (būsena %d) + „SponsorBlock“ laikinai neprieinamas + Nepavyko balsuoti už segmentą (API laikas baigėsi) + Nepavyko balsuoti už segmentą (būsena: %1$d %2$s) + Nepavyko balsuoti už segmentą: %s + Balsuoti už + Balsuoti prieš + Keisti kategoriją + Nėra segmentų, už kuriuos būtų galima balsuoti + + Nuo %1$s iki %2$s + Pasirinkite segmento kategoriją + Kategorija išjungta nustatymuose. Įjunkite kategoriją, kad galėtumėte pateikti. + Naujas „SponsorBlock“ segmentas + Nustatyti %s kaip naujo segmento pradžią arba pabaigą? + Pradžia + Pabaiga + Dabar + Laikas, nuo kurio prasideda segmentas + Laikas, kuriuo baigiasi segmentas + Ar laikas teisingas? + "Segmentas è è %1$s iki @@ -1282,46 +1281,46 @@ iki (%3$s) Ar paruošta pateikti?" - Pradžia turi būti prieš pabaigą - Pirmiausia pažymėkite dvi vietas laiko juostoje - Peržiūrėkite segmentą ir įsitikinkite, kad jis sklandžiai praleidžiamas - Rankiniu būdu redaguoti segmento laiką - Ar norite redaguoti segmento pradžios ar pabaigos laiką? - Nurodytas neteisingas laikas - Statistika - - Statistika laikinai nepasiekiama (API neveikia) - Kraunama... - „SponsorBlock“ išjungtas - Jūsų vartotojo vardas: <b>%s</b> - Bakstelėkite čia, kad pakeistumėte savo vartotojo vardą - Nepavyko pakeisti vartotojo vardo: Būsena: %1$d %2$s - Vartotojo vardas sėkmingai pakeistas - Jūsų reputacija yra <b>%.2f</b> - Sukūrėte <b>%s</b> segmentų - Bakstelėkite čia, kad peržiūrėtumėte savo segmentus - „SponsorBlock“ lyderių lentelė - Išgelbėjote žmones nuo <b>%s</b> segmentų - Bakstelėkite čia, kad pamatytumėte pasaulinę statistiką ir geriausius dalyvius - Tai <b>%s</b> jų gyvenimo laiko.<br>Bakstelėkite čia, kad pamatytumėte lyderių lentelę - Praleidote <b>%s</b> segmentų - Tai <b>%s</b> - Atstatyti praleistų segmentų skaitiklį? - %1$s valandos %2$s minutės - %1$s minutės %2$s sekundės - %s sekundės - Neskaidrumas: - Spalva: - Apie - Duomenys pateikiami per \"SponsorBlock\" API. Bakstelėkite čia, kad sužinotumėte daugiau ir pamatytumėte atsisiuntimus kitoms platformoms - - - Išdėstymas: formos faktorius - Numatyta - Telefonas - Planšetė - Automobilių - "Pakeitimai: + Pradžia turi būti prieš pabaigą + Pirmiausia pažymėkite dvi vietas laiko juostoje + Peržiūrėkite segmentą ir įsitikinkite, kad jis sklandžiai praleidžiamas + Rankiniu būdu redaguoti segmento laiką + Ar norite redaguoti segmento pradžios ar pabaigos laiką? + Nurodytas neteisingas laikas + Statistika + + Statistika laikinai nepasiekiama (API neveikia) + Kraunama... + „SponsorBlock“ išjungtas + Jūsų vartotojo vardas: <b>%s</b> + Bakstelėkite čia, kad pakeistumėte savo vartotojo vardą + Nepavyko pakeisti vartotojo vardo: Būsena: %1$d %2$s + Vartotojo vardas sėkmingai pakeistas + Jūsų reputacija yra <b>%.2f</b> + Sukūrėte <b>%s</b> segmentų + Bakstelėkite čia, kad peržiūrėtumėte savo segmentus + „SponsorBlock“ lyderių lentelė + Išgelbėjote žmones nuo <b>%s</b> segmentų + Bakstelėkite čia, kad pamatytumėte pasaulinę statistiką ir geriausius dalyvius + Tai <b>%s</b> jų gyvenimo laiko.<br>Bakstelėkite čia, kad pamatytumėte lyderių lentelę + Praleidote <b>%s</b> segmentų + Tai <b>%s</b> + Atstatyti praleistų segmentų skaitiklį? + %1$s valandos %2$s minutės + %1$s minutės %2$s sekundės + %s sekundės + Neskaidrumas: + Spalva: + Apie + Duomenys pateikiami per \"SponsorBlock\" API. Bakstelėkite čia, kad sužinotumėte daugiau ir pamatytumėte atsisiuntimus kitoms platformoms + + + Išdėstymas: formos faktorius + Numatyta + Telefonas + Planšetė + Automobilių + "Pakeitimai: Planšetės išdėstymas • Bendruomenės įrašai yra paslėpti @@ -1329,314 +1328,312 @@ Planšetės išdėstymas Automobilinis išdėstymas • „Shorts“ atidaromi įprastame grotuve • Sklaida suskirstyta pagal temas ir kanalus" - - - Programėlės versijos apsimetinėjimas - Versija apsimeta - Versija neapsimeta - "Programos versija bus padirbta į senesnę „YouTube“ versiją. + + + Programėlės versijos apsimetinėjimas + Versija apsimeta + Versija neapsimeta + "Programos versija bus padirbta į senesnę „YouTube“ versiją. Tai pakeis programos išvaizdą ir funkcijas, bet gali atsirasti nežinomų šalutinių poveikių. Jei vėliau išjungta, rekomenduojama išvalyti programos duomenis, kad būtų išvengta vartotojo sąsajos klaidų." - Programėlės versijos apsimetinėjimo tikslas - 20.13.41 – Atkurti neišskleistą vaizdo veiksmų juostą - 20.05.46 - Atkurti transkripto funkcionalumą - 19.35.36 - Atkurti senus \"Shorts\" grotuvo piktogramas - 19.01.34 – Atkurti senas naršymo piktogramas - - - Keisti pradžios puslapį - Numatytasis - Visos Prenumeratos - Naršyti kanalus - Kursai / Mokymasis - Atrasti - Mada ir Grožis - Žaidimai - Istorija - Biblioteka - Patiko vaizdo įrašai - Tiesiogiai - Filmai - Muzika - Naujienos - Pranešimai - Grojaraščių sąrašai - Paieška - Apsipirkimas - Sportas - Prenumeratos - Populiariausi - Virtualioji realybė - Pažiūrėti vėliau - Tavo klipai - Visada keisti pradžios puslapį - "Pradžios puslapis visada pakeičiamas + Programėlės versijos apsimetinėjimo tikslas + 20.13.41 – Atkurti neišskleistą vaizdo veiksmų juostą + 20.05.46 - Atkurti transkripto funkcionalumą + 19.35.36 - Atkurti senus \"Shorts\" grotuvo piktogramas + 19.01.34 – Atkurti senas naršymo piktogramas + + + Keisti pradžios puslapį + Numatytasis + Visos Prenumeratos + Naršyti kanalus + Kursai / Mokymasis + Atrasti + Mada ir Grožis + Žaidimai + Istorija + Biblioteka + Patiko vaizdo įrašai + Tiesiogiai + Filmai + Muzika + Naujienos + Pranešimai + Grojaraščių sąrašai + Paieška + Apsipirkimas + Sportas + Prenumeratos + Populiariausi + Virtualioji realybė + Pažiūrėti vėliau + Tavo klipai + Visada keisti pradžios puslapį + "Pradžios puslapis visada pakeičiamas Ribojimas: įrankių juostoje esantis atgal mygtukas gali neveikti." - Pradžios puslapis keičiamas tik paleidžiant programą - - - Išjungti \"Shorts\" grotuvo atnaujinimą - \"Shorts\" grotuvas nebus atnaujintas paleidžiant programėlę - \"Shorts\" grotuvas bus atnaujintas paleidžiant programėlę - - - Atidarykite Šortus su - Shorts grotuvas - Paprastas grotuvas - Paprastas grotuvo viso ekrano režimas - - - \"Autoplay\" Shorts - \"Shorts\" bus atliekama \"Autoplay\" - \"Shorts\" bus kartojami - \"Autoplay\" Shorts foninis atkūrimas - \"Shorts\" foninis atkūrimas bus atliekama \"Autoplay\" - \"Shorts\" foninis atkūrimas bus kartojamas - - - Mažas grotuvas - Pakeisti programėlėje sumažinto grotuvo stilių - Minigrotuvo tipas - Išjungtas - Numatytasis - Minimalus - Planšetinis - Modernus 1 - Modernus 2 - Modernus 3 - Modernus 4 - Išjungti suapvalintus kampus - Kampai yra kvadratiniai - Kampai yra suapvalinti - Įgalinti dvigubą bakstelėjimą ir suspaudimą, kad būtų galima keisti dydį - "Dvigubas bakstelėjimas ir sugriebimas, kad pakeistumėte dydį, įjungtas + Pradžios puslapis keičiamas tik paleidžiant programą + + + Išjungti \"Shorts\" grotuvo atnaujinimą + \"Shorts\" grotuvas nebus atnaujintas paleidžiant programėlę + \"Shorts\" grotuvas bus atnaujintas paleidžiant programėlę + + + Atidarykite Šortus su + Shorts grotuvas + Paprastas grotuvas + Paprastas grotuvo viso ekrano režimas + + + \"Autoplay\" Shorts + \"Shorts\" bus atliekama \"Autoplay\" + \"Shorts\" bus kartojami + \"Autoplay\" Shorts foninis atkūrimas + \"Shorts\" foninis atkūrimas bus atliekama \"Autoplay\" + \"Shorts\" foninis atkūrimas bus kartojamas + + + Mažas grotuvas + Pakeisti programėlėje sumažinto grotuvo stilių + Minigrotuvo tipas + Išjungtas + Numatytasis + Minimalus + Planšetinis + Modernus 1 + Modernus 2 + Modernus 3 + Modernus 4 + Išjungti suapvalintus kampus + Kampai yra kvadratiniai + Kampai yra suapvalinti + Įgalinti dvigubą bakstelėjimą ir suspaudimą, kad būtų galima keisti dydį + "Dvigubas bakstelėjimas ir sugriebimas, kad pakeistumėte dydį, įjungtas • Dvigubai bakstelėkite, kad padidintumėte \"miniplayer\" dydį • Dar kartą dvigubai bakstelėkite, kad atkurtumėte pradinį dydį" - Dvigubo bakstelėjimo veiksmas ir suspaudimas, kad būtų galima keisti dydį, yra išjungtas - Išjungti vilkimą ir numetimą - Vilkimas ir numetimas yra išjungtas - "„Drag and drop“ įjungtas + Dvigubo bakstelėjimo veiksmas ir suspaudimas, kad būtų galima keisti dydį, yra išjungtas + Išjungti vilkimą ir numetimą + Vilkimas ir numetimas yra išjungtas + "„Drag and drop“ įjungtas \"Miniplayer\" galima perkelti į bet kurį ekrano kampą" - Išjungti horizontalųjį vilkimo gestą - Horizontalaus vilkimo gestas išjungtas - "Horizontalus vilkimo gestas įjungtas + Išjungti horizontalųjį vilkimo gestą + Horizontalaus vilkimo gestas išjungtas + "Horizontalus vilkimo gestas įjungtas \"Miniplayer\" galima vilkti nuo ekrano į kairę arba dešinę" - Slėpti perdangos mygtukus - Perdangos mygtukai paslėpti - Perdangos mygtukai rodomi - Slėpti antraštes - Antraštės yra paslėptos - Antraštės yra rodomos - Slėpti mygtukus \"praleisti į priekį\" ir \"atgal\" - \"Praleisti į priekį\" ir \"atgal\" yra paslėpti - \"Praleisti į priekį\" ir \"atgal\" yra rodomi - Pradinis dydis - Pradinis dydis ekrane, pikseliais - Pikselių dydis turi būti tarp %1$s ir %2$s - Permatomumo lygis - Permatomumo vertė nuo 0 iki 100, kur 0 yra skaidrus - Miniplayer permatomumo lygis turi būti nuo 0 iki 100 - - - Įgalinti gradientinį įkėlimo ekraną - Įkėlimo ekranas turės gradientinį foną - Įkėlimo ekranas turės tvirtą foną - Paleidimo ekrano stilius - Spalva - Juoda ir balta - Įgalinti pritaikytą slankiklio spalvą - Rodoma pritaikyta slankiklio spalva - Rodoma originali slankiklio spalva - Individualizuota ieškojimo juostos spalva - Ieškojimo juostos spalva - Individualizuota ieškojimo juostos akcento spalva - Ieškojimo juostos akcento spalva - Netinkama slankiklio spalvos vertė - - - - - Antraštės logotipas - Numatytasis - Įprastas - - ReVanced minimalus - Pasirinktinis - - - Aplenkti vaizdo regiono apribojimus - Naudojant vaizdo talpinimo svetainę yt4.ggpht.com - "Naudojamas originalus vaizdų šeimininkas + Slėpti perdangos mygtukus + Perdangos mygtukai paslėpti + Perdangos mygtukai rodomi + Slėpti antraštes + Antraštės yra paslėptos + Antraštės yra rodomos + Slėpti mygtukus \"praleisti į priekį\" ir \"atgal\" + \"Praleisti į priekį\" ir \"atgal\" yra paslėpti + \"Praleisti į priekį\" ir \"atgal\" yra rodomi + Pradinis dydis + Pradinis dydis ekrane, pikseliais + Pikselių dydis turi būti tarp %1$s ir %2$s + Permatomumo lygis + Permatomumo vertė nuo 0 iki 100, kur 0 yra skaidrus + Miniplayer permatomumo lygis turi būti nuo 0 iki 100 + + + Įgalinti gradientinį įkėlimo ekraną + Įkėlimo ekranas turės gradientinį foną + Įkėlimo ekranas turės tvirtą foną + Paleidimo ekrano stilius + Spalva + Juoda ir balta + Įgalinti pritaikytą slankiklio spalvą + Rodoma pritaikyta slankiklio spalva + Rodoma originali slankiklio spalva + Individualizuota ieškojimo juostos spalva + Ieškojimo juostos spalva + Individualizuota ieškojimo juostos akcento spalva + Ieškojimo juostos akcento spalva + Netinkama slankiklio spalvos vertė + + + + Antraštės logotipas + Numatytasis + Įprastas + + ReVanced minimalus + Pasirinktinis + + + Aplenkti vaizdo regiono apribojimus + Naudojant vaizdo talpinimo svetainę yt4.ggpht.com + "Naudojamas originalus vaizdų šeimininkas Įjungus šį nustatymą, gali būti ištaisytos trūkstamos nuotraukos, kurios kai kuriuose regionuose yra užblokuotos" - - - - Pagrindinis skirtukas - - Prenumeratos skirtukas - - Jūsų skirtukas - Grotuvo grojaraščiai ir rekomendacijos - Paieškos rezultatai - Originalūs miniatiūriniai vaizdai - DeArrow & Originalūs miniatiūriniai vaizdai - DeArrow & Nejudantys kadrai - Nejudantys kadrai - "DeArrow pateikia miniatiūras, surinktas iš bendruomenės, „YouTube“ vaizdo įrašams. Šios miniatiūros dažnai yra tinkamesnės nei tos, kurias pateikia „YouTube“ + + + + Pagrindinis skirtukas + + Prenumeratos skirtukas + + Jūsų skirtukas + Grotuvo grojaraščiai ir rekomendacijos + Paieškos rezultatai + Originalūs miniatiūriniai vaizdai + DeArrow & Originalūs miniatiūriniai vaizdai + DeArrow & Nejudantys kadrai + Nejudantys kadrai + "DeArrow pateikia miniatiūras, surinktas iš bendruomenės, „YouTube“ vaizdo įrašams. Šios miniatiūros dažnai yra tinkamesnės nei tos, kurias pateikia „YouTube“ Įjungus šį nustatymą, vaizdo įrašų URL bus siunčiami į API serverį ir kiti duomenys nebus siunčiami. Jei vaizdo įraše nėra DeArrow miniatiūrų, tada rodomos originalios arba fiksuotos miniatiūros Palieskite čia, kad sužinotumėte daugiau apie DeArrow" - Rodyti pranešimą, jei API neprieinama - Pranešimas rodomas, jei „DeArrow“ neprieinama - Pranešimas nerodomas, jei „DeArrow“ neprieinama - „DeArrow“ API galutinis taškas - „DeArrow“ miniatiūrinių vaizdų talpyklos galutinio taško URL - Nejudantys vaizdo įrašų kadrai - Nejudantys kadrai imami iš kiekvieno vaizdo įrašo pradžios, vidurio ir pabaigos. Šie vaizdai yra integruoti į „YouTube“ ir naudojamas ne išorinis API - Naudoti greitus nejudančius kadrus - Naudojant vidutinės kokybės nejudančius kadrus. Miniatiūriniai vaizdai bus įkeliami greičiau, tačiau tiesioginės transliacijos, neišleisti arba labai seni vaizdo įrašai gali rodyti tuščius miniatiūrinius vaizdus - Naudojant aukštos kokybės nejudančius kadrus - Vaizdo įrašo laikas, iš kurio bus imami nejudantys kadrai - Vaizdo įrašo pradžia - Vaizdo įrašo vidurys - Vaizdo įrašo pabaiga - - DeArrow laikinai nepasiekiamas (būsenos kodas: %s) - DeArrow laikinai nepasiekiamas - - - Rodyti „ReVanced“ pranešimus - Pranešimai paleidžiant rodomi - Pranešimai paleidžiant nerodomi - Rodyti pranešimus paleidžiant programą - Nepavyko prisijungti prie pranešimų teikėjo - Atmesti - - - Įjungti vaizdo įrašo kartojimą - Vaizdo įrašas bus kartojamas - Vaizdo įrašas nebus kartojamas - - - Rodyti vaizdo įrašo kartojimo mygtuką - Mygtukas rodomas - Mygtukas nerodomas - Vaizdo įrašo kartojimas įjungtas - Vaizdo įrašo kartojimas išjungtas - - - - - Susifalsifikuoti įrenginio matmenis - "Įrenginio matmenys padirbti + Rodyti pranešimą, jei API neprieinama + Pranešimas rodomas, jei „DeArrow“ neprieinama + Pranešimas nerodomas, jei „DeArrow“ neprieinama + „DeArrow“ API galutinis taškas + „DeArrow“ miniatiūrinių vaizdų talpyklos galutinio taško URL + Nejudantys vaizdo įrašų kadrai + Nejudantys kadrai imami iš kiekvieno vaizdo įrašo pradžios, vidurio ir pabaigos. Šie vaizdai yra integruoti į „YouTube“ ir naudojamas ne išorinis API + Naudoti greitus nejudančius kadrus + Naudojant vidutinės kokybės nejudančius kadrus. Miniatiūriniai vaizdai bus įkeliami greičiau, tačiau tiesioginės transliacijos, neišleisti arba labai seni vaizdo įrašai gali rodyti tuščius miniatiūrinius vaizdus + Naudojant aukštos kokybės nejudančius kadrus + Vaizdo įrašo laikas, iš kurio bus imami nejudantys kadrai + Vaizdo įrašo pradžia + Vaizdo įrašo vidurys + Vaizdo įrašo pabaiga + + DeArrow laikinai nepasiekiamas (būsenos kodas: %s) + DeArrow laikinai nepasiekiamas + + + Rodyti „ReVanced“ pranešimus + Pranešimai paleidžiant rodomi + Pranešimai paleidžiant nerodomi + Rodyti pranešimus paleidžiant programą + Nepavyko prisijungti prie pranešimų teikėjo + Atmesti + + + Įjungti vaizdo įrašo kartojimą + Vaizdo įrašas bus kartojamas + Vaizdo įrašas nebus kartojamas + + + Rodyti vaizdo įrašo kartojimo mygtuką + Mygtukas rodomas + Mygtukas nerodomas + Vaizdo įrašo kartojimas įjungtas + Vaizdo įrašo kartojimas išjungtas + + + + Susifalsifikuoti įrenginio matmenis + "Įrenginio matmenys padirbti Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti vaizdo įrašo atkūrimo strigimą, prastesnį baterijos veikimo laiką ir nežinomų šalutinių poveikių" - "Įrenginio matmenys nepadirbti + "Įrenginio matmenys nepadirbti Įjungus šį nustatymą, gali būti atrakinta aukštesnės vaizdo įrašų kokybės" - Įjungus šią funkciją, gali būti pastebimas vaizdo atkūrimo mikčiojimas, blogesnė baterijos trukmė ir nežinomi šalutiniai poveikiai. - - - Vibracijos grįžtamasis ryšys - Keisti vibracijos grįžtamąjį ryšį - Išjungti skyrių vibraciją - Skyrių vibracija išjungta - Skyrių vibracija įjungta - Išjungti tikslaus slinkimo vibraciją - Tikslus ieškojimo vibracijos grįžtamasis ryšys išjungtas - Tikslaus slinkimo vibracija įjungta - Išjungti ieškojimo anuliavimo vibraciją - Ieškojimo anuliavimo vibracijos grįžtamasis ryšys išjungtas - Ieškojimo anuliavimo vibracijos grįžtamasis ryšys įjungtas - Išjungti priartinimo vibraciją - Priartinimo vibracija išjungta - Priartinimo vibracija įjungta - - - Jei neseniai pakeitėte savo paskyros prisijungimo duomenis, išdiekite ir iš naujo įdiekite „MicroG“. - - - Aplenkti URL nukreipimus - URL nukreipimai aplenkiami - URL nukreipimai nėra aplenkiami - - - Atidaryti nuorodas naršyklėje - Nuorodos atidaromos išorinėje naršyklėje - Nuorodos atidaromos programėlės naršyklėje - - - - Automatinis - Atsiminti vaizdo įrašų kokybės pakeitimus - Kokybės pakeitimai taikomi visiems vaizdo įrašams - Kokybės pakeitimai taikomi tik dabartiniam vaizdo įrašui - Rodyti pranešimą keičiant vaizdo kokybę - Pranešimas rodomas, kai pakeičiama numatytoji vaizdo kokybė - Pranešimas nerodomas, kai pakeičiama numatytoji vaizdo kokybė - Numatytoji vaizdo įrašų kokybė „Wi-Fi“ tinkle - Numatytoji vaizdo įrašų kokybė mobiliojo ryšio tinkle - Atsiminti „Shorts“ kokybės pakeitimus - Kokybės pakeitimai taikomi visiems „Shorts“ - Kokybės pakeitimai taikomi tik dabartiniam „Shorts“ - Numatytoji „Shorts“ kokybė naudojant „Wi-Fi“ tinklą - Numatytoji „Shorts“ kokybė mobiliųjų tinklų atveju - mobilusis - Wi-Fi - Pakeista numatytoji %1$s kokybė į: %2$s - Pakeista \"Shorts\" %1$s kokybė į: %2$s - - - Rodyti greičio dialogo mygtuką - Greičio dialogo mygtukas rodomas. Bakstelėkite ir palaikykite norėdami atkurti numatytąjį atkūrimo greitį - Greičio dialogo mygtukas nerodomas - - - Rodyti vaizdo kokybės mygtuką - Vaizdo kokybės mygtukas rodomas. Bakstelėkite ir palaikykite norėdami atkurti numatytąją kokybę - Vaizdo kokybės mygtukas nerodomas - - - Tinkintas atkūrimo greičio meniu - Tinkintas greičio meniu rodomas - Tinkintas greičio meniu nerodomas - Atkurti seną atkūrimo greičio meniu - Rodomas senas greičio meniu - Rodomas modernus greičio meniu - Tinkintas atkūrimo greitis - Pridėti arba pakeisti tinkintą atkūrimo greitį - Pasirinktinis greitis turi būti mažesnis nei %s - Netinkamas pasirinktinis atkūrimo greitis - Automatinis - Pritaikytas bakstelėjimo ir laikymo greitis - Atkūrimo greitis: nuo 0 iki 8 - - - Atsiminti atkūrimo greičio pakeitimus - Atkūrimo greičio pakeitimai taikomi visiems vaizdo įrašams - Atkūrimo greičio pakeitimai taikomi tik dabartiniam vaizdo įrašui - Rodyti pranešimą keičiant atkūrimo spartą - Pranešimas rodomas, kai pakeičiama numatytoji atkūrimo sparta - Pranešimas nerodomas, kai pakeičiamas numatytasis atkūrimo greitis. - Numatytasis atkūrimo greitis - Pakeistas numatytasis greitis į: %s - - - Išjungti HDR vaizdo įrašą - HDR vaizdo įrašas išjungtas - HDR vaizdo įrašas įjungtas - Priversti AVC (H.264) - Vaizdo kodekas priverstinai nustatytas į AVC (H.264) - Vaizdo kodekas nustatomas automatiškai - "Privalumai: + Įjungus šią funkciją, gali būti pastebimas vaizdo atkūrimo mikčiojimas, blogesnė baterijos trukmė ir nežinomi šalutiniai poveikiai. + + + Vibracijos grįžtamasis ryšys + Keisti vibracijos grįžtamąjį ryšį + Išjungti skyrių vibraciją + Skyrių vibracija išjungta + Skyrių vibracija įjungta + Išjungti tikslaus slinkimo vibraciją + Tikslus ieškojimo vibracijos grįžtamasis ryšys išjungtas + Tikslaus slinkimo vibracija įjungta + Išjungti ieškojimo anuliavimo vibraciją + Ieškojimo anuliavimo vibracijos grįžtamasis ryšys išjungtas + Ieškojimo anuliavimo vibracijos grįžtamasis ryšys įjungtas + Išjungti priartinimo vibraciją + Priartinimo vibracija išjungta + Priartinimo vibracija įjungta + + + Jei neseniai pakeitėte savo paskyros prisijungimo duomenis, išdiekite ir iš naujo įdiekite „MicroG“. + + + Aplenkti URL nukreipimus + URL nukreipimai aplenkiami + URL nukreipimai nėra aplenkiami + + + Atidaryti nuorodas naršyklėje + Nuorodos atidaromos išorinėje naršyklėje + Nuorodos atidaromos programėlės naršyklėje + + + + Automatinis + Atsiminti vaizdo įrašų kokybės pakeitimus + Kokybės pakeitimai taikomi visiems vaizdo įrašams + Kokybės pakeitimai taikomi tik dabartiniam vaizdo įrašui + Rodyti pranešimą keičiant vaizdo kokybę + Pranešimas rodomas, kai pakeičiama numatytoji vaizdo kokybė + Pranešimas nerodomas, kai pakeičiama numatytoji vaizdo kokybė + Numatytoji vaizdo įrašų kokybė „Wi-Fi“ tinkle + Numatytoji vaizdo įrašų kokybė mobiliojo ryšio tinkle + Atsiminti „Shorts“ kokybės pakeitimus + Kokybės pakeitimai taikomi visiems „Shorts“ + Kokybės pakeitimai taikomi tik dabartiniam „Shorts“ + Numatytoji „Shorts“ kokybė naudojant „Wi-Fi“ tinklą + Numatytoji „Shorts“ kokybė mobiliųjų tinklų atveju + mobilusis + Wi-Fi + Pakeista numatytoji %1$s kokybė į: %2$s + Pakeista \"Shorts\" %1$s kokybė į: %2$s + + + Rodyti greičio dialogo mygtuką + Greičio dialogo mygtukas rodomas. Bakstelėkite ir palaikykite norėdami atkurti numatytąjį atkūrimo greitį + Greičio dialogo mygtukas nerodomas + + + Rodyti vaizdo kokybės mygtuką + Vaizdo kokybės mygtukas rodomas. Bakstelėkite ir palaikykite norėdami atkurti numatytąją kokybę + Vaizdo kokybės mygtukas nerodomas + + + Tinkintas atkūrimo greičio meniu + Tinkintas greičio meniu rodomas + Tinkintas greičio meniu nerodomas + Atkurti seną atkūrimo greičio meniu + Rodomas senas greičio meniu + Rodomas modernus greičio meniu + Tinkintas atkūrimo greitis + Pridėti arba pakeisti tinkintą atkūrimo greitį + Pasirinktinis greitis turi būti mažesnis nei %s + Netinkamas pasirinktinis atkūrimo greitis + Automatinis + Pritaikytas bakstelėjimo ir laikymo greitis + Atkūrimo greitis: nuo 0 iki 8 + + + Atsiminti atkūrimo greičio pakeitimus + Atkūrimo greičio pakeitimai taikomi visiems vaizdo įrašams + Atkūrimo greičio pakeitimai taikomi tik dabartiniam vaizdo įrašui + Rodyti pranešimą keičiant atkūrimo spartą + Pranešimas rodomas, kai pakeičiama numatytoji atkūrimo sparta + Pranešimas nerodomas, kai pakeičiamas numatytasis atkūrimo greitis. + Numatytasis atkūrimo greitis + Pakeistas numatytasis greitis į: %s + + + Išjungti HDR vaizdo įrašą + HDR vaizdo įrašas išjungtas + HDR vaizdo įrašas įjungtas + Priversti AVC (H.264) + Vaizdo kodekas priverstinai nustatytas į AVC (H.264) + Vaizdo kodekas nustatomas automatiškai + "Privalumai: • Gali pagerinti baterijos veikimo laiką • Gali atkurti trūkstamas vaizdo raiškas senesniuose įrenginiuose @@ -1645,179 +1642,178 @@ Apribojimai: • Vaizdo įrašų atkūrimas naudos daugiau interneto duomenų nei VP9 ar AV1 • HDR vaizdo įrašai nenaudos AVC • Kai kurie įrenginiai negali priverstinai naudoti AVC" - - - Rodyti išplėstinį vaizdo įrašo kokybės meniu - Rodomas išplėstinis vaizdo įrašo kokybės meniu - Nerodomas išplėstinis vaizdo įrašo kokybės meniu - - - Įjungti slinkimą, kad ieškotumėte - Slinkimas, kad ieškotumėte, įjungtas - Slinkimas, kad ieškotumėte, neišjungtas - - - Leisti Android VR AV1 - "Vaizdo kodekas yra AVC (H.264), VP9 arba AV1 + + + Rodyti išplėstinį vaizdo įrašo kokybės meniu + Rodomas išplėstinis vaizdo įrašo kokybės meniu + Nerodomas išplėstinis vaizdo įrašo kokybės meniu + + + Įjungti slinkimą, kad ieškotumėte + Slinkimas, kad ieškotumėte, įjungtas + Slinkimas, kad ieškotumėte, neišjungtas + + + Leisti Android VR AV1 + "Vaizdo kodekas yra AVC (H.264), VP9 arba AV1 Gali strigti arba praleisti kadrus" - Vaizdo kodekas yra AVC (H.264) arba VP9 - "Įjungus šį nustatymą, gali būti naudojamas programinės įrangos AV1 dekodavimas. + Vaizdo kodekas yra AVC (H.264) arba VP9 + "Įjungus šį nustatymą, gali būti naudojamas programinės įrangos AV1 dekodavimas. Vaizdo įrašo atkūrimas su AV1 gali strigti arba praleisti kadrus." - Klastojimo šalutiniai efektai - • Eksperimentinis klientas ir bet kada gali nustoti veikti - • Vaizdo įrašas gali sustoti ties 1:00 arba gali būti nepasiekiamas kai kuriuose regionuose - • Trūksta garso takelio meniu - • Nėra AV1 vaizdo kodeko - • Stabili garso apimtis nepasiekiama - • Vaikų vaizdo įrašai gali būti neatkuriami, kai atsijungiama arba naudojamas inkognito režimas - - • Priverstinai naudoti originalų garsą nepasiekiama - Rodyti statistinėje informacijoje \"tik profesionalams\" - Kliento tipas rodomas statistinėje informacijoje \"tik profesionalams\" - Klientas paslėptas statistinėje informacijoje \"tik profesionalams\" - - - - - - - Apie - Skelbimai - Bendra - Grotuvas - Įvairūs - - - Slėpti vaizdo įrašų skelbimus - Vaizdo įrašų skelbimai yra paslėpti - Vaizdo įrašų skelbimai yra rodomi - - - Įjungti nuolatinį kartojimą - Nuolatinis kartojimas įjungtas - Nuolatinis kartojimas išjungtas - - - Slėpti transliavimo mygtuką - Transliavimo mygtukas paslėptas - Transliavimo mygtukas rodomas - Slėpti istorijos mygtuką - Istorijos mygtukas paslėptas - Istorijos mygtukas rodomas - Slėpti pranešimų mygtuką - Pranešimų mygtukas paslėptas - Pranešimų mygtukas rodomas - Slėpti paieškos mygtuką - Paieškos mygtukas paslėptas - Paieškos mygtukas rodomas - - - Slėpti kategorijų juostą - Kategorijų juosta paslėpta - Kategorijų juosta rodoma - - - Pakeisti mini grotuvo spalvą - Mini grotuvo spalva atitinka viso ekrano grotuvo spalvą - Mini grotuvas naudoja numatytąją spalvą - - - Naršymo juosta - Slėpti arba keisti naršymo juostos mygtukus - - Slėpti Pagrindinį - Mygtukas „Pagrindinis“ yra paslėptas - Mygtukas „Pagrindinis“ yra rodomas - - Slėpti Pavyzdžius - Mygtukas „Pavyzdžiai“ yra paslėptas - Mygtukas „Pavyzdžiai“ yra rodomas - - Slėpti Naršyti - Mygtukas „Naršyti“ yra paslėptas - Mygtukas „Naršyti“ yra rodomas - - Slėpti Biblioteką - Mygtukas „Biblioteka“ yra paslėptas - Mygtukas „Biblioteka“ yra rodomas - - Slėpti Atnaujinti - Mygtukas „Naujinti“ yra paslėptas - Mygtukas „Naujinti“ yra rodomas - Slėpti naršymo juostą - Naršymo juosta yra paslėpta - Naršymo juosta yra rodoma - Slėpti naršymo mygtukų etiketes - Etiketės yra paslėptos - Etiketės yra rodomos - - - Slėpti „Gauti Music Premium“ etiketę - Etiketė paslėpta - Etiketė rodoma - - - Slėpti atnaujinimo mygtuką - Mygtukas paslėptas - Mygtukas rodomas - - - - - Blokuoti garso reklamas - Garso reklamos blokuojamos - Garso reklamos nėra blokuojamos - - - %s neprieinamas, reklamos gali rodytis. Pabandykite pakeisti skelbimų blokavimo paslaugą nustatymuose. - %s grąžino klaidą, reklamos gali rodytis. Pabandykite pakeisti skelbimų blokavimo paslaugą nustatymuose. - Blokuoti įterptas vaizdo reklamas - Išjungta - \"Luminous\" tarpinis serveris - \"PurpleAdBlock\" tarpinis serveris - - - Blokuoti vaizdo reklamas - Vaizdo reklamos blokuojamos - Vaizdo reklamos nėra blokuojamos - - - Pranešimas ištrintas - Rodyti ištrintas žinutes - Nerodyti ištrintų žinučių - Slėpti ištrintas žinutes po spoileriu - Rodyti ištrintas žinutes kaip perbrauktas tekstą - - - Automatiškai gauti kanalo taškus - Kanalo taškai gaunami automatiškai - Kanalo taškai nėra gaunami automatiškai - - - - Įjungti Twitch derinimo režimą - Twitch derinimo režimas yra įjungtas (nerekomenduojama) - Twitch derinimo režimas yra išjungtas - - - ReVanced nustatymai - Apie - Apie ReVanced - Skelbimų blokavimas - Skelbimų blokavimo nustatymai - Pranešimai - Pranešimų nustatymai - Įvairūs - Įvairių nustatymų - Bendrieji nustatymai - Kiti nustatymai - Kliento pusės reklamos - Serverio pusės surestream reklamos - Derinimo žurnalas - Derinimo žurnalai yra įjungti - Derinimo žurnalai yra išjungti - - + Klastojimo šalutiniai efektai + • Eksperimentinis klientas ir bet kada gali nustoti veikti + • Vaizdo įrašas gali sustoti ties 1:00 arba gali būti nepasiekiamas kai kuriuose regionuose + • Trūksta garso takelio meniu + • Nėra AV1 vaizdo kodeko + • Stabili garso apimtis nepasiekiama + • Vaikų vaizdo įrašai gali būti neatkuriami, kai atsijungiama arba naudojamas inkognito režimas + + • Priverstinai naudoti originalų garsą nepasiekiama + Rodyti statistinėje informacijoje \"tik profesionalams\" + Kliento tipas rodomas statistinėje informacijoje \"tik profesionalams\" + Klientas paslėptas statistinėje informacijoje \"tik profesionalams\" + + + + + + Apie + Skelbimai + Bendra + Grotuvas + Įvairūs + + + Slėpti vaizdo įrašų skelbimus + Vaizdo įrašų skelbimai yra paslėpti + Vaizdo įrašų skelbimai yra rodomi + + + Įjungti nuolatinį kartojimą + Nuolatinis kartojimas įjungtas + Nuolatinis kartojimas išjungtas + + + Slėpti transliavimo mygtuką + Transliavimo mygtukas paslėptas + Transliavimo mygtukas rodomas + Slėpti istorijos mygtuką + Istorijos mygtukas paslėptas + Istorijos mygtukas rodomas + Slėpti pranešimų mygtuką + Pranešimų mygtukas paslėptas + Pranešimų mygtukas rodomas + Slėpti paieškos mygtuką + Paieškos mygtukas paslėptas + Paieškos mygtukas rodomas + + + Slėpti kategorijų juostą + Kategorijų juosta paslėpta + Kategorijų juosta rodoma + + + Pakeisti mini grotuvo spalvą + Mini grotuvo spalva atitinka viso ekrano grotuvo spalvą + Mini grotuvas naudoja numatytąją spalvą + + + Naršymo juosta + Slėpti arba keisti naršymo juostos mygtukus + + Slėpti Pagrindinį + Mygtukas „Pagrindinis“ yra paslėptas + Mygtukas „Pagrindinis“ yra rodomas + + Slėpti Pavyzdžius + Mygtukas „Pavyzdžiai“ yra paslėptas + Mygtukas „Pavyzdžiai“ yra rodomas + + Slėpti Naršyti + Mygtukas „Naršyti“ yra paslėptas + Mygtukas „Naršyti“ yra rodomas + + Slėpti Biblioteką + Mygtukas „Biblioteka“ yra paslėptas + Mygtukas „Biblioteka“ yra rodomas + + Slėpti Atnaujinti + Mygtukas „Naujinti“ yra paslėptas + Mygtukas „Naujinti“ yra rodomas + Slėpti naršymo juostą + Naršymo juosta yra paslėpta + Naršymo juosta yra rodoma + Slėpti naršymo mygtukų etiketes + Etiketės yra paslėptos + Etiketės yra rodomos + + + Slėpti „Gauti Music Premium“ etiketę + Etiketė paslėpta + Etiketė rodoma + + + Slėpti atnaujinimo mygtuką + Mygtukas paslėptas + Mygtukas rodomas + + + + + Blokuoti garso reklamas + Garso reklamos blokuojamos + Garso reklamos nėra blokuojamos + + + %s neprieinamas, reklamos gali rodytis. Pabandykite pakeisti skelbimų blokavimo paslaugą nustatymuose. + %s grąžino klaidą, reklamos gali rodytis. Pabandykite pakeisti skelbimų blokavimo paslaugą nustatymuose. + Blokuoti įterptas vaizdo reklamas + Išjungta + \"Luminous\" tarpinis serveris + \"PurpleAdBlock\" tarpinis serveris + + + Blokuoti vaizdo reklamas + Vaizdo reklamos blokuojamos + Vaizdo reklamos nėra blokuojamos + + + Pranešimas ištrintas + Rodyti ištrintas žinutes + Nerodyti ištrintų žinučių + Slėpti ištrintas žinutes po spoileriu + Rodyti ištrintas žinutes kaip perbrauktas tekstą + + + Automatiškai gauti kanalo taškus + Kanalo taškai gaunami automatiškai + Kanalo taškai nėra gaunami automatiškai + + + + Įjungti Twitch derinimo režimą + Twitch derinimo režimas yra įjungtas (nerekomenduojama) + Twitch derinimo režimas yra išjungtas + + + ReVanced nustatymai + Apie + Apie ReVanced + Skelbimų blokavimas + Skelbimų blokavimo nustatymai + Pranešimai + Pranešimų nustatymai + Įvairūs + Įvairių nustatymų + Bendrieji nustatymai + Kiti nustatymai + Kliento pusės reklamos + Serverio pusės surestream reklamos + Derinimo žurnalas + Derinimo žurnalai yra įjungti + Derinimo žurnalai yra išjungti + + diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index ec26cfedca..1b6439021d 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -17,1262 +17,1261 @@ "First 'item' text Second \"item\" text" ---> - - - - Lietotnes nosaukums - - Pielāgots - Lietotnes ikona - Oriģināls - - ReVanced minimāls - ReVanced mērogots - - Pielāgots - - - Pārbaudes neizdevās - Atvērt oficiālo vietni - Ignorēt - <h5>Šī lietotne, šķiet, nav labota jūsu ierīcē.</h5><br>Šī lietotne var nedarboties pareizi, <b>varētu būt kaitīga vai pat bīstama lietošanai</b>.<br><br>Šīs pārbaudes liecina, ka lietotne ir iepriekš labota vai iegūta no kāda cita:<br><br><small>%1$s</small><br>Ir stingri ieteicams <b>atinstalēt šo lietotni un paši to labot</b>, lai pārliecinātos, ka lietojat apstiprinātu un drošu lietotni.<p><br>Ja ignorēsiet, šis brīdinājums tiks parādīts tikai divas reizes. - Labots citā ierīcē - Nav instalēts ar ReVanced Manager - Labots pirms vairāk nekā 10 minūtēm - Labots pirms %s dienām - APK veidošanas datums ir bojāts - - - ReVanced paziņojums - Jūsu skatīšanās vēsture netiek saglabāta.<br><br>Visticamāk, to izraisa DNS reklāmu bloķētājs vai tīkla starpniekserveris.<br><br>Lai to novērstu, pievienojiet baltajam sarakstam <b>s.youtube.com</b> vai izslēdziet visus DNS bloķētājus un starpniekservera serverus. - Nerādīt vēlreiz - - - Iestatījumi - Vai tiešām vēlaties turpināt? - Saglabāt - Atiestatīt - Atiestatīt krāsu - Nederīga krāsa - Nepieciešama restartēšana - Lai šīs izmaiņas stātos spēkā, restartējiet lietotni. - Restartēt - Importēt - Kopēt - ReVanced iestatījumi atiestatīti uz noklusējuma vērtībām - Importēti %d iestatījumi - Importēšana neizdevās: %s - Meklēt iestatījumus - Nav atrasts neviens rezultāts atbilstoši \'%s\' - Mēģiniet citu atslēgvārdu - Pēdējie meklējumi - Noņemt no meklēšanas vēstures? - Notīrīt meklēšanas vēsturi - Vai tiešām vēlaties notīrīt visu meklēšanas vēsturi? - Meklēšanas padomi - "• Pieskarieties ceļam, lai pārietu uz to +--> + + + Lietotnes nosaukums + + Pielāgots + Lietotnes ikona + Oriģināls + + ReVanced minimāls + ReVanced mērogots + + Pielāgots + + + Pārbaudes neizdevās + Atvērt oficiālo vietni + Ignorēt + <h5>Šī lietotne, šķiet, nav labota jūsu ierīcē.</h5><br>Šī lietotne var nedarboties pareizi, <b>varētu būt kaitīga vai pat bīstama lietošanai</b>.<br><br>Šīs pārbaudes liecina, ka lietotne ir iepriekš labota vai iegūta no kāda cita:<br><br><small>%1$s</small><br>Ir stingri ieteicams <b>atinstalēt šo lietotni un paši to labot</b>, lai pārliecinātos, ka lietojat apstiprinātu un drošu lietotni.<p><br>Ja ignorēsiet, šis brīdinājums tiks parādīts tikai divas reizes. + Labots citā ierīcē + Nav instalēts ar ReVanced Manager + Labots pirms vairāk nekā 10 minūtēm + Labots pirms %s dienām + APK veidošanas datums ir bojāts + + + ReVanced paziņojums + Jūsu skatīšanās vēsture netiek saglabāta.<br><br>Visticamāk, to izraisa DNS reklāmu bloķētājs vai tīkla starpniekserveris.<br><br>Lai to novērstu, pievienojiet baltajam sarakstam <b>s.youtube.com</b> vai izslēdziet visus DNS bloķētājus un starpniekservera serverus. + Nerādīt vēlreiz + + + Iestatījumi + Vai tiešām vēlaties turpināt? + Saglabāt + Atiestatīt + Atiestatīt krāsu + Nederīga krāsa + Nepieciešama restartēšana + Lai šīs izmaiņas stātos spēkā, restartējiet lietotni. + Restartēt + Importēt + Kopēt + ReVanced iestatījumi atiestatīti uz noklusējuma vērtībām + Importēti %d iestatījumi + Importēšana neizdevās: %s + Meklēt iestatījumus + Nav atrasts neviens rezultāts atbilstoši \'%s\' + Mēģiniet citu atslēgvārdu + Pēdējie meklējumi + Noņemt no meklēšanas vēstures? + Notīrīt meklēšanas vēsturi + Vai tiešām vēlaties notīrīt visu meklēšanas vēsturi? + Meklēšanas padomi + "• Pieskarieties ceļam, lai pārietu uz to • Turiet nospiestu iestatījumu, lai pārietu uz to • Nospiediet taustiņu Enter, lai saglabātu meklēšanas vaicājumu vēsturē • Meklēšana ignorē lielo/mazo burtu atšķirības un pieturzīmes • Vecāku iestatījumi tiek rādīti virs atspējotiem pakārtotiem iestatījumiem" - Meklēšanas vēsture ir tukša - Lai saglabātu meklēšanas vēsturi, ievadiet meklēšanas vaicājumu un nospiediet taustiņu Enter - Rādīt iestatījumu meklēšanas vēsturi - Iestatījumu meklēšanas vēsture tiek rādīta - Iestatījumu meklēšanas vēsture netiek rādīta - Rādīt ReVanced iestatījumu ikonas - Iestatījumu ikonas tiek rādītas - Ikonas iestatījumos netiek rādītas - ReVanced valoda - "Dažu valodu tulkojumi var būt trūkstoši vai nepilnīgi. + Meklēšanas vēsture ir tukša + Lai saglabātu meklēšanas vēsturi, ievadiet meklēšanas vaicājumu un nospiediet taustiņu Enter + Rādīt iestatījumu meklēšanas vēsturi + Iestatījumu meklēšanas vēsture tiek rādīta + Iestatījumu meklēšanas vēsture netiek rādīta + Rādīt ReVanced iestatījumu ikonas + Iestatījumu ikonas tiek rādītas + Ikonas iestatījumos netiek rādītas + ReVanced valoda + "Dažu valodu tulkojumi var būt trūkstoši vai nepilnīgi. Lai tulkotu jaunās valodas vai uzlabotu esošos tulkojumus, apmeklējiet translate.revanced.app" - Lietotnes valoda - Importēt/Eksportēt - Importēt/Eksportēt ReVanced iestatījumus - - Jūs lietojat ReVanced Patches versiju <i>%s</i> - Piezīme - Šī versija ir pirms izlaiduma, un jūs varētu piedzīvot negaidītas problēmas - Oficiālās saites - + Jūs lietojat ReVanced Patches versiju <i>%s</i> + Piezīme + Šī versija ir pirms izlaiduma, un jūs varētu piedzīvot negaidītas problēmas + Oficiālās saites + - - - GmsCore iestatījumi - GmsCore iestatījumi - - MicroG GmsCore nav instalēts. Instalējiet to. - Nepieciešama darbība - "MicroG GmsCore nav atļauts darboties fonā. + + + GmsCore iestatījumi + GmsCore iestatījumi + + MicroG GmsCore nav instalēts. Instalējiet to. + Nepieciešama darbība + "MicroG GmsCore nav atļauts darboties fonā. Sekojiet sava tālruņa \"Nenoslepkaviet manu lietotni\" rokasgrāmatai un lietojiet norādījumus savam MicroG instalācijai. Tas ir nepieciešams, lai lietotne darbotos." - Atvērt vietni - "MicroG GmsCore akumulatora optimizācijas ir jāatspējo, lai novērstu problēmas. + Atvērt vietni + "MicroG GmsCore akumulatora optimizācijas ir jāatspējo, lai novērstu problēmas. Akumulatora optimizāciju atspējošana MicroG neietekmēs akumulatora lietojumu negatīvi. Nospiediet turpināt pogu un atļaujiet optimizācijas izmaiņas." - Turpināt - - - Viltot video straumes - Viltot klienta video straumes, lai novērstu atskaņošanas problēmas - Viltot video straumes - "Video straumes ir viltotas + Turpināt + + + Viltot video straumes + Viltot klienta video straumes, lai novērstu atskaņošanas problēmas + Viltot video straumes + "Video straumes ir viltotas Ja esat YouTube Premium lietotājs, šis iestatījums, iespējams, nav nepieciešams" - "Video straumes nav viltotas + "Video straumes nav viltotas Atskaņošana var nedarboties" - Šī iestatījuma izslēgšana var izraisīt atskaņošanas problēmas. - Noklusētā klients - - - Piespiest oriģinālo audio valodu - Izmantot oriģinālo audio valodu - Tiek izmantots noklusējuma audio - - Lai izmantotu šo funkciju, mainiet \"Viltotās video plūsmas\" uz jebkuru klientu, izņemot Android Studio - - - Atkļūdošana - Iespējot vai atspējot atkļūdošanas opcijas - Atkļūdošanas žurnāls - Atkļūdošanas žurnāli ir iespējoti - Atkļūdošanas žurnāli ir atspējoti - Reģistrēt steka izsekošanu - Atkļūdošanas žurnāli ietver steka izsekošanu - Atkļūdošanas žurnāli neietver steka izsekošanu - Rādīt paziņojumu par ReVanced kļūdu - Ja rodas kļūda, tiek rādīts toast - Ja rodas kļūda, toast netiek rādīts - "Kļūdu paziņojumu izslēgšana paslēpj visus ReVanced kļūdu paziņojumus. + Šī iestatījuma izslēgšana var izraisīt atskaņošanas problēmas. + Noklusētā klients + + + Piespiest oriģinālo audio valodu + Izmantot oriģinālo audio valodu + Tiek izmantots noklusējuma audio + + Lai izmantotu šo funkciju, mainiet \"Viltotās video plūsmas\" uz jebkuru klientu, izņemot Android Studio + + + Atkļūdošana + Iespējot vai atspējot atkļūdošanas opcijas + Atkļūdošanas žurnāls + Atkļūdošanas žurnāli ir iespējoti + Atkļūdošanas žurnāli ir atspējoti + Reģistrēt steka izsekošanu + Atkļūdošanas žurnāli ietver steka izsekošanu + Atkļūdošanas žurnāli neietver steka izsekošanu + Rādīt paziņojumu par ReVanced kļūdu + Ja rodas kļūda, tiek rādīts toast + Ja rodas kļūda, toast netiek rādīts + "Kļūdu paziņojumu izslēgšana paslēpj visus ReVanced kļūdu paziņojumus. Jūs netiksit informēts par neparedzētiem notikumiem." - Eksportēt atkļūdošanas žurnālus - Kopē ReVanced atkļūdošanas žurnālus starpliktuvē - Atkļūdošanas žurnālu reģistrēšana ir atspējota - Žurnāli nav atrasti - Žurnāli ir kopēti - Neizdevās eksportēt žurnālus: %s - Notīrīt atkļūdošanas žurnālus - Notīra visus saglabātos ReVanced atkļūdošanas žurnālus - Žurnāli ir notīrīti - Funkciju karodziņu Manager - Pārvaldīt Būla funkciju karodziņus - Aktīvie karodziņi (%d) - Bloķētie karodziņi (%d) - Meklēt karodziņus... - Karodziņi saglabāti - Karodziņi atiestatīti - Karodziņi kopēti starpliktuvē - Reģistrēt protokola buferi - Atkļūdošanas žurnāli ietver protokola buferi - Atkļūdošanas žurnāli neietver protokola buferi - "Iespējojot šo iestatījumu, tiks reģistrēti papildu izkārtojuma dati, tostarp teksta attēlojums ekrānā dažiem lietotāja interfeisa komponentiem. + Eksportēt atkļūdošanas žurnālus + Kopē ReVanced atkļūdošanas žurnālus starpliktuvē + Atkļūdošanas žurnālu reģistrēšana ir atspējota + Žurnāli nav atrasti + Žurnāli ir kopēti + Neizdevās eksportēt žurnālus: %s + Notīrīt atkļūdošanas žurnālus + Notīra visus saglabātos ReVanced atkļūdošanas žurnālus + Žurnāli ir notīrīti + Funkciju karodziņu Manager + Pārvaldīt Būla funkciju karodziņus + Aktīvie karodziņi (%d) + Bloķētie karodziņi (%d) + Meklēt karodziņus... + Karodziņi saglabāti + Karodziņi atiestatīti + Karodziņi kopēti starpliktuvē + Reģistrēt protokola buferi + Atkļūdošanas žurnāli ietver protokola buferi + Atkļūdošanas žurnāli neietver protokola buferi + "Iespējojot šo iestatījumu, tiks reģistrēti papildu izkārtojuma dati, tostarp teksta attēlojums ekrānā dažiem lietotāja interfeisa komponentiem. Tas var palīdzēt identificēt komponentus, veidojot pielāgotus filtrus. Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja dati, piemēram, jūsu IP adrese." - - - Tīrīt koplietošanas saites - Izsekošanas vaicājuma parametrs tiek noņemts no koplietotajām saitēm - Izsekošanas vaicājuma parametrs netiek noņemts no koplietotajām saitēm - Mainīt kopīgošanas saites uz youtube.com - Kopīgotās saites izmanto youtube.com - Kopīgotās saites izmanto music.youtube.com - - - Pielāgotais filtrs - Paslēpt komponentus, izmantojot pielāgotos filtrus - Aktivizēt pielāgoto filtru - Pielāgotais filtrs ir aktivizēts - Pielāgotais filtrs ir deaktivizēts - Pielāgotais filtrs - - Komponentu ceļa konstruktoru virkņu saraksts, ko filtrēt, atdalot ar jaunu rindu - Nederīgs pielāgotais filtrs: %s - - - - - Par - Reklāmas - Alternatīvi sīktēli - Lente - Vispārīgi - Atskaņotājs - Slīdņu skala - Pārvelciet vadīklas - Dažādi - Atjaunot vecās iestatījumu izvēlnes - Tiek rādītas vecās iestatījumu izvēlnes - Vecās iestatījumu izvēlnes netiek rādītas - - - Atspējot Shorts fonu atskaņošanu - Shorts fonu atskaņošana ir atspējota - Shorts fonu atskaņošana ir iespējota - - - Paslēpt albumu kartītes - Albumu kartītes ir paslēptas - Albumu kartītes ir redzamas - Slēpt mākslinieku kartītes - Mākslinieku kartītes ir paslēptas - Mākslinieku kartītes ir redzamas - Slēpt mikroshēmu plauktu - Mikroshēmu plaukts ir paslēpts - Mikroshēmu plaukts ir redzams - Slēpt kopienas ierakstus - Kopienas ieraksti ir paslēpti - Kopienas ieraksti ir redzami - Slēpt kompaktus banerus - Kompaktie baneri ir paslēpti - Kompaktie baneri ir redzami - Slēpt izvēršamo kartīti - Izvēršamā kartīte zem video ir paslēpta - Izvēršamā kartīte zem video ir redzama - Paslēpt peldošo mikrofona pogu - Peldošā mikrofona poga meklēšanā ir paslēpta. - Peldošā mikrofona poga meklēšanā ir redzama - Paslēpt horizontālos plauktus - "Horizontālie plaukti ir paslēpti, piemēram: + + + Tīrīt koplietošanas saites + Izsekošanas vaicājuma parametrs tiek noņemts no koplietotajām saitēm + Izsekošanas vaicājuma parametrs netiek noņemts no koplietotajām saitēm + Mainīt kopīgošanas saites uz youtube.com + Kopīgotās saites izmanto youtube.com + Kopīgotās saites izmanto music.youtube.com + + + Pielāgotais filtrs + Paslēpt komponentus, izmantojot pielāgotos filtrus + Aktivizēt pielāgoto filtru + Pielāgotais filtrs ir aktivizēts + Pielāgotais filtrs ir deaktivizēts + Pielāgotais filtrs + + Komponentu ceļa konstruktoru virkņu saraksts, ko filtrēt, atdalot ar jaunu rindu + Nederīgs pielāgotais filtrs: %s + + + + + Par + Reklāmas + Alternatīvi sīktēli + Lente + Vispārīgi + Atskaņotājs + Slīdņu skala + Pārvelciet vadīklas + Dažādi + Atjaunot vecās iestatījumu izvēlnes + Tiek rādītas vecās iestatījumu izvēlnes + Vecās iestatījumu izvēlnes netiek rādītas + + + Atspējot Shorts fonu atskaņošanu + Shorts fonu atskaņošana ir atspējota + Shorts fonu atskaņošana ir iespējota + + + Paslēpt albumu kartītes + Albumu kartītes ir paslēptas + Albumu kartītes ir redzamas + Slēpt mākslinieku kartītes + Mākslinieku kartītes ir paslēptas + Mākslinieku kartītes ir redzamas + Slēpt mikroshēmu plauktu + Mikroshēmu plaukts ir paslēpts + Mikroshēmu plaukts ir redzams + Slēpt kopienas ierakstus + Kopienas ieraksti ir paslēpti + Kopienas ieraksti ir redzami + Slēpt kompaktus banerus + Kompaktie baneri ir paslēpti + Kompaktie baneri ir redzami + Slēpt izvēršamo kartīti + Izvēršamā kartīte zem video ir paslēpta + Izvēršamā kartīte zem video ir redzama + Paslēpt peldošo mikrofona pogu + Peldošā mikrofona poga meklēšanā ir paslēpta. + Peldošā mikrofona poga meklēšanā ir redzama + Paslēpt horizontālos plauktus + "Horizontālie plaukti ir paslēpti, piemēram: • Jaunākās ziņas • Turpināt skatīties • Izpētīt vairāk kanālu • Visatbilstošākais • Iepirkšanās • Skatīties vēlreiz" - Horizontālie plaukti ir redzami. - Slēpt attēlu plauktu - Attēlu plaukts meklēšanas rezultātos ir paslēpts - Attēlu plaukts meklēšanas rezultātos ir redzams - Slēpt jaunākos ierakstus - Jaunākie ieraksti ir paslēpti - Jaunākie ieraksti ir redzami - Slēpt jaukto atskaņošanas sarakstu - Jauktie atskaņošanas saraksti ir paslēpti - Jauktie atskaņošanas saraksti ir redzami - Slēpt filmu sadaļu - Filmu sadaļa ir paslēpta - Filmu sadaļa ir redzama - - Paslēpt \"Paziņot\" pogu - Poga \"Informēt mani\" ir paslēpta. - Poga \"Informēt mani\" ir redzama. - Slēpt spēles - Spēles ir paslēptas - Spēles ir redzamas - - Paslēpt \"Rādīt vairāk\" pogu - Poga \"Rādīt vairāk\" meklēšanas rezultātos ir paslēpta. - Poga \"Rādīt vairāk\" meklēšanas rezultātos ir redzama. - Slēpt aptaujas - Aptaujas ir paslēptas - Aptaujas ir redzamas - Paslēpt biļešu plauktu - Biļešu plaukts ir paslēpts - Biļešu plaukts ir redzams - - Slēpt video ieteikumu etiķetes. - Etiķetes \"Cilvēki skatījās arī\" un \"Jums varētu patikt\" meklēšanas rezultātos ir paslēptas. - Etiķetes \"Cilvēki skatījās arī\" un \"Jums varētu patikt\" meklēšanas rezultātos ir redzamas. - Slēpt vizuālo atstarpi - Vizuālā atstarpe ir paslēpta - Vizuālā atstarpe ir redzama - - Paslēpt YouTube Doodles - YouTube Doodles animācija uz logotipa ir paslēpta. - YouTube Doodles animācija uz logotipa ir redzama - "YouTube Doodles tiek rādīti dažas dienas gadā. + Paslēpt \"Rādīt vairāk\" pogu + Poga \"Rādīt vairāk\" meklēšanas rezultātos ir paslēpta. + Poga \"Rādīt vairāk\" meklēšanas rezultātos ir redzama. + Slēpt aptaujas + Aptaujas ir paslēptas + Aptaujas ir redzamas + Paslēpt biļešu plauktu + Biļešu plaukts ir paslēpts + Biļešu plaukts ir redzams + + Slēpt video ieteikumu etiķetes. + Etiķetes \"Cilvēki skatījās arī\" un \"Jums varētu patikt\" meklēšanas rezultātos ir paslēptas. + Etiķetes \"Cilvēki skatījās arī\" un \"Jums varētu patikt\" meklēšanas rezultātos ir redzamas. + Slēpt vizuālo atstarpi + Vizuālā atstarpe ir paslēpta + Vizuālā atstarpe ir redzama + + Paslēpt YouTube Doodles + YouTube Doodles animācija uz logotipa ir paslēpta. + YouTube Doodles animācija uz logotipa ir redzama + "YouTube Doodles tiek rādīti dažas dienas gadā. Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījums ir ieslēgts, tad filtrēšanas josla zem meklēšanas joslas arī tiks paslēpta." - Slēpt kanāla joslu - Kanāla josla ir paslēpta - Kanāla josla ir redzama - Paslēpt kanāla ūdenszīmi - Ūdenszīme ir paslēpta - Ūdenszīme ir redzama - Paslēpt finansēšanas lodziņu - Finansēšanas lodziņš ir paslēpts - Finansēšanas lodziņš ir redzams - Slēpt ārkārtas lodziņus - Ārkārtas lodziņi ir paslēpti - Ārkārtas lodziņi ir redzami - Slēpt informācijas paneļus - Informācijas paneļi ir paslēpti - Informācijas paneļi ir redzami - - Paslēpt Pievienoties pogu - Poga \"Pievienoties\" ir paslēpta. - Poga \"Pievienoties\" ir redzama. - Slēpt medicīnas paneļus - Medicīnas paneļi ir paslēpti - Medicīnas paneļi ir redzami - Slēpt ātrās darbības - Ātrās darbības pilnekrāna režīmā ir paslēptas - Ātrās darbības pilnekrāna režīmā ir redzamas - Slēpt saistītos video - Saistītie video ātrajās darbībās ir paslēpti - Saistītie video ātrajās darbībās ir redzami - Paslēpt abonentu vadlīnijas - Abonētāju kopienas vadlīnijas ir paslēptas - Abonētāju kopienas vadlīnijas ir redzamas - Paslēpt laika reakcijas - Laika reakcijas ir paslēptas - Laika reakcijas ir redzamas - Paslēpt \"AI ģenerēta video kopsavilkums\" - AI ģenerētā video kopsavilkuma sadaļa ir paslēpta - Tiek rādīta AI ģenerētā video kopsavilkuma sadaļa - Slēpt Jautāt - Jautājumu sadaļa ir paslēpta - Jautājumu sadaļa ir redzama - Paslēpt atribūtus - Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir paslēpti - Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir redzami - Paslēpt nodaļas - Nodaļu sadaļa ir paslēpta - Nodaļu sadaļa ir redzama - Paslēpt \"Kā šis saturs tika veidots\" - Sadaļa \"Kā šis saturs tika veidots\" ir paslēpta - Sadaļa \"Kā šis saturs tika veidots\" ir redzama - Slēpt Hype punktus - Hype punkti ir slēpti - Hype punkti ir redzami - Paslēpt sadaļu \"Izpētiet podkāstu\" - Sadaļa \"Izpētiet podkāstu\" ir paslēpta - Sadaļa \"Izpētiet podkāstu\" ir redzama - Slēpt izceltās saites - Ieteikto saišu sadaļa ir paslēpta - Ieteikto saišu sadaļa ir redzama - Paslēpt ieteiktos videoklipus - Ieteikto videoklipu sadaļa ir paslēpta - Ieteikto videoklipu sadaļa ir redzama - Paslēpt informācijas kartītes - Informācijas karšu sadaļa ir paslēpta - Informācijas karšu sadaļa ir redzama - Paslēpt \"Galvenos jēdzienus\" - Sadaļa \"Galvenie jēdzieni\" ir paslēpta - Sadaļa \"Galvenie jēdzieni\" ir redzama - Paslēpt pogu Abonēt - Abonēšanas poga ir paslēpta - Abonēšanas poga ir redzama - Paslēpt transkriptu - Transkripcijas sadaļa ir paslēpta - Transkripcijas sadaļa ir redzama - Videoklipa apraksts - Slēpt vai parādīt videoklipa apraksta komponentus - Filtra josla - Slēpt vai rādīt filtra joslu plūsmās, saistītajos videoklipos, meklēšanas rezultātos un skatīšanās vēsturē - Slēpt plūsmās - Slēpts plūsmās - Rādīts plūsmās - Slēpt saistītajos videoklipos - Paslēpts saistītajos videoklipos - Redzams saistītajos videoklipos - Paslēpt meklēšanas rezultātos - Paslēpts meklēšanas rezultātos - Redzams meklēšanas rezultātos - Slēpt skatīšanās vēsturē - Paslēpts skatīšanās vēsturē - Parādīts skatīšanās vēsturē - Kanāla lapa - Slēpt vai parādīt kanāla lapas komponentus - - Slēpt pogu Kopiena - Kopienas poga ir paslēpta - Kopienas poga ir redzama - - Paslēpt plauktu \"Tev\" - \"Tev\" plaukts ir paslēpts - \"Tev\" plaukts ir redzams - - Slēpt pogu \"Pievienoties\" - Poga \"Pievienoties\" ir paslēpta - Poga \"Pievienoties\" ir redzama - Slēpt saišu priekšskatījumu - Saišu priekšskatījums ir paslēpts - Saišu priekšskatījums ir redzams - Slēpt dalībnieku plauktu - Dalībnieku plaukts ir paslēpts - Dalībnieku plaukts ir redzams - - Slēpt pogu \"Veikals\" - Poga \"Veikals\" ir paslēpta - Poga \"Veikals\" ir redzama - - Slēpt pogu \"Abonēt\" - Poga \"Abonēt\" ir paslēpta - Poga \"Abonēt\" ir redzama - Komentāri - Slēpt vai parādīt komentāru sadaļas komponentus - Slēpt AI tērzēšanas kopsavilkumu - AI tērzēšanas kopsavilkums ir paslēpts - AI tērzēšanas kopsavilkums ir redzams - Slēpt AI komentāru kopsavilkumu - AI komentāru kopsavilkums ir paslēpts - AI komentāru kopsavilkums ir redzams - Slēpt kanāla vadlīnijas - Kanāla vadlīnijas ir paslēptas - Kanāla vadlīnijas ir redzamas - Slēpt virsrakstu \"Dalībnieku komentāri\" - Dalībnieku komentāru galvene ir paslēpta - Dalībnieku komentāru galvene ir redzama - Slēpt komentāru sadaļu - Komentāru sadaļa ir paslēpta - Komentāru sadaļa ir redzama - Paslēpt kopienas vadlīnijas - Kopienas vadlīnijas ir paslēptas - Kopienas vadlīnijas ir redzamas - Paslēpt \"Izveidot īso\" pogu - Poga Izveidot Short ir paslēpta - Poga Izveidot Short ir redzama - Slēpt emocijzīmju un laika zīmogu pogas - Emocijzīmju un laika zīmogu pogas ir paslēptas - Emocijzīmju un laika zīmogu pogas ir redzamas - Paslēpt priekšskatījuma komentāru - Priekšskatījuma komentārs ir paslēpts - Priekšskatījuma komentārs ir redzams - Paslēpt pateicības pogu - Paldies poga ir paslēpta - Paldies poga ir redzama - Paslēpt skatījumu skaitu - Skatījumu skaits ir paslēpts plūsmā un meklēšanas rezultātos - Skatījumu skaits ir redzams plūsmā un meklēšanas rezultātos - - "Ierobežojumi: + Paslēpt Pievienoties pogu + Poga \"Pievienoties\" ir paslēpta. + Poga \"Pievienoties\" ir redzama. + Slēpt medicīnas paneļus + Medicīnas paneļi ir paslēpti + Medicīnas paneļi ir redzami + Slēpt ātrās darbības + Ātrās darbības pilnekrāna režīmā ir paslēptas + Ātrās darbības pilnekrāna režīmā ir redzamas + Slēpt saistītos video + Saistītie video ātrajās darbībās ir paslēpti + Saistītie video ātrajās darbībās ir redzami + Paslēpt abonentu vadlīnijas + Abonētāju kopienas vadlīnijas ir paslēptas + Abonētāju kopienas vadlīnijas ir redzamas + Paslēpt laika reakcijas + Laika reakcijas ir paslēptas + Laika reakcijas ir redzamas + Paslēpt \"AI ģenerēta video kopsavilkums\" + AI ģenerētā video kopsavilkuma sadaļa ir paslēpta + Tiek rādīta AI ģenerētā video kopsavilkuma sadaļa + Slēpt Jautāt + Jautājumu sadaļa ir paslēpta + Jautājumu sadaļa ir redzama + Paslēpt atribūtus + Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir paslēpti + Piedāvātās vietas, spēles, mūzika un pieminētie cilvēki ir redzami + Paslēpt nodaļas + Nodaļu sadaļa ir paslēpta + Nodaļu sadaļa ir redzama + Paslēpt \"Kā šis saturs tika veidots\" + Sadaļa \"Kā šis saturs tika veidots\" ir paslēpta + Sadaļa \"Kā šis saturs tika veidots\" ir redzama + Slēpt Hype punktus + Hype punkti ir slēpti + Hype punkti ir redzami + Paslēpt sadaļu \"Izpētiet podkāstu\" + Sadaļa \"Izpētiet podkāstu\" ir paslēpta + Sadaļa \"Izpētiet podkāstu\" ir redzama + Slēpt izceltās saites + Ieteikto saišu sadaļa ir paslēpta + Ieteikto saišu sadaļa ir redzama + Paslēpt ieteiktos videoklipus + Ieteikto videoklipu sadaļa ir paslēpta + Ieteikto videoklipu sadaļa ir redzama + Paslēpt informācijas kartītes + Informācijas karšu sadaļa ir paslēpta + Informācijas karšu sadaļa ir redzama + Paslēpt \"Galvenos jēdzienus\" + Sadaļa \"Galvenie jēdzieni\" ir paslēpta + Sadaļa \"Galvenie jēdzieni\" ir redzama + Paslēpt pogu Abonēt + Abonēšanas poga ir paslēpta + Abonēšanas poga ir redzama + Paslēpt transkriptu + Transkripcijas sadaļa ir paslēpta + Transkripcijas sadaļa ir redzama + Videoklipa apraksts + Slēpt vai parādīt videoklipa apraksta komponentus + Filtra josla + Slēpt vai rādīt filtra joslu plūsmās, saistītajos videoklipos, meklēšanas rezultātos un skatīšanās vēsturē + Slēpt plūsmās + Slēpts plūsmās + Rādīts plūsmās + Slēpt saistītajos videoklipos + Paslēpts saistītajos videoklipos + Redzams saistītajos videoklipos + Paslēpt meklēšanas rezultātos + Paslēpts meklēšanas rezultātos + Redzams meklēšanas rezultātos + Slēpt skatīšanās vēsturē + Paslēpts skatīšanās vēsturē + Parādīts skatīšanās vēsturē + Kanāla lapa + Slēpt vai parādīt kanāla lapas komponentus + + Slēpt pogu Kopiena + Kopienas poga ir paslēpta + Kopienas poga ir redzama + + Paslēpt plauktu \"Tev\" + \"Tev\" plaukts ir paslēpts + \"Tev\" plaukts ir redzams + + Slēpt pogu \"Pievienoties\" + Poga \"Pievienoties\" ir paslēpta + Poga \"Pievienoties\" ir redzama + Slēpt saišu priekšskatījumu + Saišu priekšskatījums ir paslēpts + Saišu priekšskatījums ir redzams + Slēpt dalībnieku plauktu + Dalībnieku plaukts ir paslēpts + Dalībnieku plaukts ir redzams + + Slēpt pogu \"Veikals\" + Poga \"Veikals\" ir paslēpta + Poga \"Veikals\" ir redzama + + Slēpt pogu \"Abonēt\" + Poga \"Abonēt\" ir paslēpta + Poga \"Abonēt\" ir redzama + Komentāri + Slēpt vai parādīt komentāru sadaļas komponentus + Slēpt AI tērzēšanas kopsavilkumu + AI tērzēšanas kopsavilkums ir paslēpts + AI tērzēšanas kopsavilkums ir redzams + Slēpt AI komentāru kopsavilkumu + AI komentāru kopsavilkums ir paslēpts + AI komentāru kopsavilkums ir redzams + Slēpt kanāla vadlīnijas + Kanāla vadlīnijas ir paslēptas + Kanāla vadlīnijas ir redzamas + Slēpt virsrakstu \"Dalībnieku komentāri\" + Dalībnieku komentāru galvene ir paslēpta + Dalībnieku komentāru galvene ir redzama + Slēpt komentāru sadaļu + Komentāru sadaļa ir paslēpta + Komentāru sadaļa ir redzama + Paslēpt kopienas vadlīnijas + Kopienas vadlīnijas ir paslēptas + Kopienas vadlīnijas ir redzamas + Paslēpt \"Izveidot īso\" pogu + Poga Izveidot Short ir paslēpta + Poga Izveidot Short ir redzama + Slēpt emocijzīmju un laika zīmogu pogas + Emocijzīmju un laika zīmogu pogas ir paslēptas + Emocijzīmju un laika zīmogu pogas ir redzamas + Paslēpt priekšskatījuma komentāru + Priekšskatījuma komentārs ir paslēpts + Priekšskatījuma komentārs ir redzams + Paslēpt pateicības pogu + Paldies poga ir paslēpta + Paldies poga ir redzama + Paslēpt skatījumu skaitu + Skatījumu skaits ir paslēpts plūsmā un meklēšanas rezultātos + Skatījumu skaits ir redzams plūsmā un meklēšanas rezultātos + + "Ierobežojumi: • Shorts sadaļās, kanālu lapās un meklēšanas rezultātos joprojām var tikt rādīts skatījumu skaits • Šī funkcija nedarbojas ar automobiļu formas faktoru" - Slēpt augšupielādes laiku - Augšupielādes laiks ir paslēpts plūsmā un meklēšanas rezultātos - Augšupielādes laiks tiek rādīts plūsmā un meklēšanas rezultātos - - "Ierobežojumi: + Slēpt augšupielādes laiku + Augšupielādes laiks ir paslēpts plūsmā un meklēšanas rezultātos + Augšupielādes laiks tiek rādīts plūsmā un meklēšanas rezultātos + + "Ierobežojumi: • Shorts plaukti, kanālu lapas un meklēšanas rezultāti joprojām var rādīt augšupielādes laiku • Šī funkcija nedarbojas ar automobiļu formas faktoru" - Paslēpt atslēgvārdu saturu - Paslēpt meklēšanas un plūsmas video, izmantojot atslēgvārdu filtrus - Paslēpt mājas video ar atslēgvārdiem - Mājas cilnes video tiek filtrēti ar atslēgvārdiem - Mājas cilnes video netiek filtrēti ar atslēgvārdiem - Paslēpt meklēšanas rezultātus ar atslēgvārdiem - Meklēšanas rezultāti tiek filtrēti ar atslēgvārdiem - Meklēšanas rezultāti netiek filtrēti ar atslēgvārdiem - Paslēpt abonementu video ar atslēgvārdiem - Abonementu cilnes video tiek filtrēti ar atslēgvārdiem - Abonementu cilnes video netiek filtrēti ar atslēgvārdiem - Atslēgvārdi, kas jāslēpj - - "Atslēgvārdi un frāzes, kas jāslēpj, atdalīti ar jaunām rindām + "Atslēgvārdi un frāzes, kas jāslēpj, atdalīti ar jaunām rindām Atslēgvārdi var būt kanālu nosaukumi vai jebkurš teksts, kas parādīts video nosaukumos Vārdi ar lielo burtu vidū ir jāievada ar lielo burtu (piemēram: iPhone, TikTok, LeBlanc)" - Par atslēgvārdu filtrēšanu - "Mājas/Abonementu/Meklēšanas rezultāti tiek filtrēti, lai slēptu saturu, kas atbilst atslēgvārdu frāzēm + Par atslēgvārdu filtrēšanu + "Mājas/Abonementu/Meklēšanas rezultāti tiek filtrēti, lai slēptu saturu, kas atbilst atslēgvārdu frāzēm Ierobežojumi • Shorts nevar slēpt pēc kanāla nosaukuma • Daži lietotāja saskarnes komponenti var nebūt paslēpti • Meklējot atslēgvārdu, rezultāti var nebūt parādīti" - Atbilst pilniem vārdiem - - Atslēgvārda/frāzes ievietošana dubultpēdiņās novērsīs daļēju video nosaukumu un kanālu nosaukumu sakritību<br><br>Piemēram,<br><b>\"mākslīgais intelekts\"</b> paslēps video: <b>Kā darbojas AI?</b><br>bet nepaslēps: <b>What does fair use mean?</b> - - Nevar izmantot atslēgvārdu: %s - Pievienojiet pēdiņas, lai izmantotu atslēgvārdu: %s - Atslēgvārdam ir pretrunīgi apgalvojumi: %s - Atslēgvārds ir pārāk īss un nepieciešamas pēdiņas: %s - Atslēgvārds paslēps visus video: %s - - - Slēpt veidotāja veikala plauktu - Radītāja veikala plaukts zem video atskaņotāja ir paslēpts. - Radītāja veikala plaukts zem videoklipu atskaņotāja ir redzams - Paslēpt veikala reklāmkarogu ekrāna beigās - Beigu ekrāna veikala reklāmkarogs ir paslēpts. - Beigu ekrāna veikala reklāmkarogs ir redzams. - Paslēpt pilnekrāna reklāmas - "Pilnekrāna reklāmas ir paslēptas + Atbilst pilniem vārdiem + + Atslēgvārda/frāzes ievietošana dubultpēdiņās novērsīs daļēju video nosaukumu un kanālu nosaukumu sakritību<br><br>Piemēram,<br><b>\"mākslīgais intelekts\"</b> paslēps video: <b>Kā darbojas AI?</b><br>bet nepaslēps: <b>What does fair use mean?</b> + + Nevar izmantot atslēgvārdu: %s + Pievienojiet pēdiņas, lai izmantotu atslēgvārdu: %s + Atslēgvārdam ir pretrunīgi apgalvojumi: %s + Atslēgvārds ir pārāk īss un nepieciešamas pēdiņas: %s + Atslēgvārds paslēps visus video: %s + + + Slēpt veidotāja veikala plauktu + Radītāja veikala plaukts zem video atskaņotāja ir paslēpts. + Radītāja veikala plaukts zem videoklipu atskaņotāja ir redzams + Paslēpt veikala reklāmkarogu ekrāna beigās + Beigu ekrāna veikala reklāmkarogs ir paslēpts. + Beigu ekrāna veikala reklāmkarogs ir redzams. + Paslēpt pilnekrāna reklāmas + "Pilnekrāna reklāmas ir paslēptas Šī funkcija ir pieejama tikai vecākiem ierīcēm" - Pilnekrāna reklāmas ir redzamas - - Paslēpt pilnekrāna reklāmas darbojas tikai ar vecākām ierīcēm - Paslēpt vispārējas reklāmas - Vispārējas reklāmas ir paslēptas - Vispārējas reklāmas ir redzamas - Paslēpt preču reklāmas - Preču reklāmas ir paslēptas - Preču reklāmas ir redzamas - Paslēpt apmaksātas reklāmas etiķeti - Apmaksātas reklāmas etiķete ir paslēpta - Apmaksātas reklāmas etiķete ir redzama - Paslēpt pašreklāmas kartītes - Pašreklāmas kartītes ir paslēptas - Pašreklāmas kartītes ir redzamas - Slēpt iepirkšanās saites - Iepirkšanās saites video aprakstā ir paslēptas. - Iepirkšanās saites video aprakstā ir redzamas - Paslēpt reklāmkarogu \"Skatīt produktus\" - Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir paslēpts. - Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir redzams. - Paslēpt tīmekļa meklēšanas rezultātus - Tīmekļa meklēšanas rezultāti ir paslēpti - Tīmekļa meklēšanas rezultāti ir redzami - - - Paslēpt YouTube Premium reklāmas - YouTube Premium reklāmas zem video atskaņotāja ir paslēptas - YouTube Premium reklāmas zem video atskaņotāja ir redzamas - - - Paslēpt video reklāmas - Video reklāmas ir paslēptas - Video reklāmas ir redzamas - - - URL kopēts starpliktuvē - URL ar laika zīmi kopēts - Rādīt video URL kopēšanas pogu - Video URL kopēšanas poga ir redzama. Pieskarieties, lai kopētu video URL. Turiet nospiestu, lai kopētu ar laika zīmogu - Video URL kopēšanas poga nav redzama - Rādīt pogu \"Kopēt saiti ar laika zīmi\" - Laika zīmoga URL kopēšanas poga ir redzama. Pieskarieties, lai kopētu video URL ar laika zīmogu. Turiet nospiestu, lai kopētu bez laika zīmoga - Laika zīmoga URL kopēšanas poga nav redzama - - - Noņemt brīdinājuma dialogu - Dialogs tiks noņemts - Dialogs tiks rādīts - Tas neapiet vecuma ierobežojumu. Tas vienkārši automātiski to pieņem. - - - Atspējot uznirstošo logu \"Pierakstīties televizorā\" - Uznirstošais paziņojums Pierakstīties televizorā ir atspējots - Uznirstošais paziņojums Pierakstīties televizorā ir iespējots - - - Atspējot divkāršu pieskārienu nodaļas izlaišanai - Divkāršs pieskāriens nekad nevar iedarbināt izlaišanu uz nākamo/iepriekšējo nodaļu - Divkāršs pieskāriens reizēm var iedarbināt izlaišanu uz nākamo/iepriekšējo nodaļu - - - Ārējie lejupielādētāji - Iestatījumi, lai izmantotu ārējo lejupielādētāju - Rādīt ārējo lejupielādēšanas pogu - Lejupielādes poga atskaņotājā ir redzama - Lejupielādes poga atskaņotājā nav redzama - - Pārrakstīt lejupielādes darbības pogu - Lejupielādēšanas poga atver jūsu ārējo lejupielādētāju - Lejupielādēšanas poga atver vietējo iebūvēto lejupielādētāju - Lejupielādētāja pakotnes nosaukums - Jūsu instalētās ārējās lejupielādētāja lietotnes pakotnes nosaukums - Ievadiet pakotnes nosaukumu - Cits - Lietotne nav instalēta - %s nav instalēts. Lūdzu, instalējiet to. - "Nevarēja atrast instalēto lietotni ar pakotnes nosaukumu: %s + Pilnekrāna reklāmas ir redzamas + + Paslēpt pilnekrāna reklāmas darbojas tikai ar vecākām ierīcēm + Paslēpt vispārējas reklāmas + Vispārējas reklāmas ir paslēptas + Vispārējas reklāmas ir redzamas + Paslēpt preču reklāmas + Preču reklāmas ir paslēptas + Preču reklāmas ir redzamas + Paslēpt apmaksātas reklāmas etiķeti + Apmaksātas reklāmas etiķete ir paslēpta + Apmaksātas reklāmas etiķete ir redzama + Paslēpt pašreklāmas kartītes + Pašreklāmas kartītes ir paslēptas + Pašreklāmas kartītes ir redzamas + Slēpt iepirkšanās saites + Iepirkšanās saites video aprakstā ir paslēptas. + Iepirkšanās saites video aprakstā ir redzamas + Paslēpt reklāmkarogu \"Skatīt produktus\" + Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir paslēpts. + Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir redzams. + Paslēpt tīmekļa meklēšanas rezultātus + Tīmekļa meklēšanas rezultāti ir paslēpti + Tīmekļa meklēšanas rezultāti ir redzami + + + Paslēpt YouTube Premium reklāmas + YouTube Premium reklāmas zem video atskaņotāja ir paslēptas + YouTube Premium reklāmas zem video atskaņotāja ir redzamas + + + Paslēpt video reklāmas + Video reklāmas ir paslēptas + Video reklāmas ir redzamas + + + URL kopēts starpliktuvē + URL ar laika zīmi kopēts + Rādīt video URL kopēšanas pogu + Video URL kopēšanas poga ir redzama. Pieskarieties, lai kopētu video URL. Turiet nospiestu, lai kopētu ar laika zīmogu + Video URL kopēšanas poga nav redzama + Rādīt pogu \"Kopēt saiti ar laika zīmi\" + Laika zīmoga URL kopēšanas poga ir redzama. Pieskarieties, lai kopētu video URL ar laika zīmogu. Turiet nospiestu, lai kopētu bez laika zīmoga + Laika zīmoga URL kopēšanas poga nav redzama + + + Noņemt brīdinājuma dialogu + Dialogs tiks noņemts + Dialogs tiks rādīts + Tas neapiet vecuma ierobežojumu. Tas vienkārši automātiski to pieņem. + + + Atspējot uznirstošo logu \"Pierakstīties televizorā\" + Uznirstošais paziņojums Pierakstīties televizorā ir atspējots + Uznirstošais paziņojums Pierakstīties televizorā ir iespējots + + + Atspējot divkāršu pieskārienu nodaļas izlaišanai + Divkāršs pieskāriens nekad nevar iedarbināt izlaišanu uz nākamo/iepriekšējo nodaļu + Divkāršs pieskāriens reizēm var iedarbināt izlaišanu uz nākamo/iepriekšējo nodaļu + + + Ārējie lejupielādētāji + Iestatījumi, lai izmantotu ārējo lejupielādētāju + Rādīt ārējo lejupielādēšanas pogu + Lejupielādes poga atskaņotājā ir redzama + Lejupielādes poga atskaņotājā nav redzama + + Pārrakstīt lejupielādes darbības pogu + Lejupielādēšanas poga atver jūsu ārējo lejupielādētāju + Lejupielādēšanas poga atver vietējo iebūvēto lejupielādētāju + Lejupielādētāja pakotnes nosaukums + Jūsu instalētās ārējās lejupielādētāja lietotnes pakotnes nosaukums + Ievadiet pakotnes nosaukumu + Cits + Lietotne nav instalēta + %s nav instalēts. Lūdzu, instalējiet to. + "Nevarēja atrast instalēto lietotni ar pakotnes nosaukumu: %s Pārbaudiet, vai pakotnes nosaukums ir pareizs un lietotne ir instalēta" - Pakotnes nosaukums nevar būt tukšs - - - Atslēgt precīzu meklēšanas žestu - Žests ir atslēgts - Žests ir ieslēgts - - - Iespējot pieskārienu, lai meklētu - Pieskarieties, lai iespējotu meklēšanu - Pieskāriens, lai meklētu, ir atspējots - - - Ieslēgt spilgtuma žestu - "Pilnekrāna spilgtuma slīdēšana ir ieslēgta + Pakotnes nosaukums nevar būt tukšs + + + Atslēgt precīzu meklēšanas žestu + Žests ir atslēgts + Žests ir ieslēgts + + + Iespējot pieskārienu, lai meklētu + Pieskarieties, lai iespējotu meklēšanu + Pieskāriens, lai meklētu, ir atspējots + + + Ieslēgt spilgtuma žestu + "Pilnekrāna spilgtuma slīdēšana ir ieslēgta Regulējiet spilgtumu, velkot vertikāli ekrāna kreisajā pusē" - Pilnekrāna spilgtuma slīdēšana ir atspējota - Ieslēgt skaļuma žestu - "Pilnekrāna skaļuma vilkšana ir iespējota + Pilnekrāna spilgtuma slīdēšana ir atspējota + Ieslēgt skaļuma žestu + "Pilnekrāna skaļuma vilkšana ir iespējota Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" - Pilnekrāna skaļuma vilkšana ir atspējota - Iespējot nospiešanas žestu, lai vilktu - Nospiediet, lai vilktu, ir iespējots - Nospiediet, lai vilktu, ir atspējots - Ieslēgt taktilās atgriezeniskās saites - Taktilā atgriezeniskā saite ir ieslēgta - Taktilā atgriezeniskā saite ir atslēgta - Saglabāt un atjaunot spilgtumu - Saglabāt un atjaunot spilgtumu, izejot vai ieejot pilnekrāna režīmā - Nesaglabāt un neatjaunot spilgtumu, izejot vai ieejot pilnekrāna režīmā - Ieslēgt automātiskā spilgtuma žestu - Slīdot uz leju līdz spilgtuma žesta zemākajai vērtībai, tiek ieslēgts automātiskais spilgtums - Slīdot uz leju līdz zemākajai vērtībai, netiek ieslēgts automātiskais spilgtums - Automātiski - Slīdēšanas pārklājuma laika izbeigšanās - Milisekundes, ko pārklājums ir redzams - Pārvilkšanas pārklājuma fona necaurredzamība - Necaurredzamības vērtība no 0 līdz 100 - Pārvilkšanas necaurredzamībai jābūt no 0 līdz 100 - Velciet pārklājuma spilgtuma krāsu - Spilgtuma vadīklu progresa joslas krāsa - Velciet pārklājuma skaļuma krāsu - Skaļuma vadīklu progresa joslas krāsa - Pārvelciet pārklājuma teksta lielumu - Pārvelciet pārklājuma teksta lielumu starp 1–30 - Teksta lielumam jābūt starp 1–30 - Slīdēšanas lieluma slieksnis - Slieksnis, lai slīdēšana varētu notikt - Svilpes jutīgums skaļuma regulēšanai - Cik daudz skaļums mainās ar katru vilkšanu - Pārvelciet pārklājuma stilu - Horizontāls pārklājums - Horizontāls pārklājums (minimāls – augšā) - Horizontāls pārklājums (minimāls – centrā) - Apļveida pārklājums - Apļveida pārklājums (minimāls) - Vertikāls pārklājums - Vertikāls pārklājums (minimāls) - Iespējot pārvilkšanu, lai mainītu videoklipus - Pārvelkot pilnekrāna režīmā, tiks mainīts nākamais/iepriekšējais videoklips - Pārvelkot pilnekrāna režīmā, nākamais/iepriekšējais videoklips netiks mainīts - - - Atslēgt automātiskos titrus - Automātiskie subtitri ir atspējoti - Automātiskie subtitri ir iespējoti - - - Darbības pogas - Paslēpt vai rādīt pogas zem video - Atspējot pogas \"Like and Subscribe\" mirgošanu - Pogas \"Like and Subscribe\" nemirgos, ja tās tiks pieminētas - Pogas \"Like and Subscribe\" mirgos, ja tās tiks pieminētas - Paslēpt Patīk un Nepatīk - Patīk un Nepatīk pogas ir paslēptas - Patīk un Nepatīk pogas ir redzamas - - Paslēpt Dalīties - Dalīties poga ir paslēpta - Dalīties poga ir redzama - - Slēpt Pārtraukt reklāmas - Apturēt reklāmas poga ir paslēpta - Apturēt reklāmas poga ir redzama - - Slēpt komentārus - Komentāru poga ir paslēpta - Komentāru poga ir redzama - + Paslēpt Dalīties + Dalīties poga ir paslēpta + Dalīties poga ir redzama + + Slēpt Pārtraukt reklāmas + Apturēt reklāmas poga ir paslēpta + Apturēt reklāmas poga ir redzama + + Slēpt komentārus + Komentāru poga ir paslēpta + Komentāru poga ir redzama + - Paslēpt Ziņot - Ziņot poga ir paslēpta - Ziņot poga ir redzama - - Paslēpt Remiksēt - Remiksēt poga ir paslēpta - Remiksēt poga ir redzama - - Paslēpt Lejupielādēt - Lejupielādēt poga ir paslēpta - Lejupielādēt poga ir redzama - + Paslēpt Remiksēt + Remiksēt poga ir paslēpta + Remiksēt poga ir redzama + + Paslēpt Lejupielādēt + Lejupielādēt poga ir paslēpta + Lejupielādēt poga ir redzama + - Paslēpt ažiotāžu - Poga \ - Hype poga tiek rādīta - - Slēpt Reklamēt - Reklāmas poga ir paslēpta - Reklāmas poga ir redzama - - Paslēpt Paldies - Paldies poga ir paslēpta - Paldies poga ir redzama - + Slēpt Reklamēt + Reklāmas poga ir paslēpta + Reklāmas poga ir redzama + + Paslēpt Paldies + Paldies poga ir paslēpta + Paldies poga ir redzama + - Paslēpt jautājumu - Jautājuma poga ir paslēpta - Jautājuma poga ir redzama - - Paslēpt Izgriezt - Izgriezt poga ir paslēpta - Izgriezt poga ir redzama - - Paslēpt veikalu - Veikala poga ir paslēpta - Veikala poga ir redzama - - Paslēpt Saglabāt - Poga Saglabāt ir paslēpta - Poga Saglabāt ir redzama - - - Navigācijas pogas - Paslēpt vai mainīt pogas navigācijas joslā - - Paslēpt Sākums - Sākums poga ir paslēpta - Sākums poga ir redzama - - Paslēpt Shorts - Shorts poga ir paslēpta - Shorts poga ir redzama - - Paslēpt Izveidot - Izveidot poga ir paslēpta - Izveidot poga ir redzama - - Paslēpt Abonementi - Abonementi poga ir paslēpta - Abonementi poga ir redzama - Slēpt paziņojumus - Paziņojumu poga ir paslēpta - Paziņojumu poga ir redzama - - Mainīt Izveidot ar Paziņojumiem - "Izveidot poga tiek pārslēgta ar Paziņojumu pogu + Paslēpt jautājumu + Jautājuma poga ir paslēpta + Jautājuma poga ir redzama + + Paslēpt Izgriezt + Izgriezt poga ir paslēpta + Izgriezt poga ir redzama + + Paslēpt veikalu + Veikala poga ir paslēpta + Veikala poga ir redzama + + Paslēpt Saglabāt + Poga Saglabāt ir paslēpta + Poga Saglabāt ir redzama + + + Navigācijas pogas + Paslēpt vai mainīt pogas navigācijas joslā + + Paslēpt Sākums + Sākums poga ir paslēpta + Sākums poga ir redzama + + Paslēpt Shorts + Shorts poga ir paslēpta + Shorts poga ir redzama + + Paslēpt Izveidot + Izveidot poga ir paslēpta + Izveidot poga ir redzama + + Paslēpt Abonementi + Abonementi poga ir paslēpta + Abonementi poga ir redzama + Slēpt paziņojumus + Paziņojumu poga ir paslēpta + Paziņojumu poga ir redzama + + Mainīt Izveidot ar Paziņojumiem + "Izveidot poga tiek pārslēgta ar Paziņojumu pogu Piezīme: Šī iestatījuma ieslēgšana arī piespiedu kārtā slēpj video reklāmas" - Izveidot pogu nevar pārslēgt ar paziņojumu pogu - "Atspējojot šo iestatījumu, tiks atspējota arī Shorts reklāmu bloķēšana. + Izveidot pogu nevar pārslēgt ar paziņojumu pogu + "Atspējojot šo iestatījumu, tiks atspējota arī Shorts reklāmu bloķēšana. Ja šī iestatījuma maiņa nestājas spēkā, mēģiniet pārslēgties uz inkognito režīmu." - Paslēpt navigācijas pogu etiķetes - Etiķetes ir paslēptas - Etiķetes ir redzamas - Atspējojiet puscaurspīdu statusa joslu - Statusa josla ir necaurspīdīga - Statusa josla ir necaurspīdīga vai caurspīdīga - Dažās ierīcēs, iespējojot šo funkciju, sistēmas navigācijas josla var kļūt caurspīdīga. - Atspējojiet gaišo caurspīdu joslu - Gaišais režīma navigācijas josla ir necaurspīdiga - Gaišā režīma navigācijas josla ir necaurspīdīga vai caurspīdīga - Atspējot tumšo caurspīdīgo joslu - Tumšais režīma navigācijas josla ir necaurspīdiga - Tumšā režīma navigācijas josla ir necaurspīdīga vai caurspīdīga - - - Izvelkamo izvēlni - Paslēpt vai rādīt atskaņotāja izvelkamo izvēlni - - Paslēpt titrus - Titru izvēlne ir paslēpta - Titru izvēlne ir redzama - - Paslēpt Papildus iestatījumus - Papildus iestatījumu izvēlne ir paslēpta - Papildus iestatījumu izvēlne ir redzama - - Paslēpt Miega taimeri - Miega taimera izvēlne ir paslēpta - Miega taimera izvēlne ir redzama - - Paslēpt Video cilpu - Video cilpas izvēlne ir paslēpta - Video cilpas izvēlne ir redzama - - Paslēpt Aptuveni režīmu - Aptuveni režīma izvēlne ir paslēpta - Aptuveni režīma izvēlne ir redzama - Paslēpt Stabilo skaļumu - Stabila skaļuma izvēlne ir redzama - Stabila skaļuma izvēlne ir paslēpta - - Paslēpt Palīdzība un atsauksmes - Palīdzības un atsauksmju izvēlne ir paslēpta - Palīdzības un atsauksmju izvēlne ir redzama - - Paslēpt Atskaņošanas ātrumu - Atskaņošanas ātruma izvēlne ir paslēpta - Atskaņošanas ātruma izvēlne ir redzama - - Paslēpt Bloķēt ekrānu - Bloķēt ekrāna izvēlne ir paslēpta - Bloķēt ekrāna izvēlne ir redzama - - Paslēpt klausīties ar YouTube Music - Izvēlne \"Klausīties ar YouTube Music\" ir paslēpta - Izvēlne \"Klausīties ar YouTube Music\" ir redzama - - Paslēpt Audio ceļu - Audio ceļa izvēlne ir paslēpta - Audio ceļa izvēlne ir redzama - + Paslēpt titrus + Titru izvēlne ir paslēpta + Titru izvēlne ir redzama + + Paslēpt Papildus iestatījumus + Papildus iestatījumu izvēlne ir paslēpta + Papildus iestatījumu izvēlne ir redzama + + Paslēpt Miega taimeri + Miega taimera izvēlne ir paslēpta + Miega taimera izvēlne ir redzama + + Paslēpt Video cilpu + Video cilpas izvēlne ir paslēpta + Video cilpas izvēlne ir redzama + + Paslēpt Aptuveni režīmu + Aptuveni režīma izvēlne ir paslēpta + Aptuveni režīma izvēlne ir redzama + Paslēpt Stabilo skaļumu + Stabila skaļuma izvēlne ir redzama + Stabila skaļuma izvēlne ir paslēpta + + Paslēpt Palīdzība un atsauksmes + Palīdzības un atsauksmju izvēlne ir paslēpta + Palīdzības un atsauksmju izvēlne ir redzama + + Paslēpt Atskaņošanas ātrumu + Atskaņošanas ātruma izvēlne ir paslēpta + Atskaņošanas ātruma izvēlne ir redzama + + Paslēpt Bloķēt ekrānu + Bloķēt ekrāna izvēlne ir paslēpta + Bloķēt ekrāna izvēlne ir redzama + + Paslēpt klausīties ar YouTube Music + Izvēlne \"Klausīties ar YouTube Music\" ir paslēpta + Izvēlne \"Klausīties ar YouTube Music\" ir redzama + + Paslēpt Audio ceļu + Audio ceļa izvēlne ir paslēpta + Audio ceļa izvēlne ir redzama + - "\"Audio celiņa izvēlne ir paslēpta + "\"Audio celiņa izvēlne ir paslēpta Lai parādītu audio celiņa izvēlni, mainiet \"" - - Paslēpt Skatīties VR - Skatīties VR izvēlne ir paslēpta - Skatīties VR izvēlne ir redzama - Paslēpt video kvalitātes izvēlni - Video kvalitātes izvēlne ir paslēpta - Video kvalitātes izvēlne ir redzama - Paslēpt video kvalitātes izvēlnes apakšējo daļu - Video kvalitātes izvēlnes apakšējā daļa ir paslēpta - Video kvalitātes izvēlnes apakšējā daļa ir redzama - - - Paslēpt pogu \"Automātiskā atskaņošana\" - Automātiskās atskaņošanas poga ir paslēpta - Automātiskās atskaņošanas poga ir redzama - - Paslēpt pogu \"Subtitri\" - Titru poga ir paslēpta - Titru poga ir redzama - Paslēpt pogu \"Sūtīt\" - Pārraides poga ir paslēpta - Pārraides poga ir redzama - Paslēpt atskaņotāja vadīklu fonu - Atskaņotāja vadības elementu fons ir paslēpts - Atskaņotāja vadīklu fons tiek rādīts - Paslēpt iepriekšējo un nākamo pogas - Pogas ir paslēptas - Pogas ir redzamas - - - Paslēpt ekrāna beigās esošās kartītes - Ekrāna beigās esošās kartītes ir paslēptas - Ekrāna beigās esošās kartītes ir redzamas - - - Atspējot apkārtējās vides režīmu pilnekrāna režīmā - Aptuveni režīms ir atspējots - Aptuveni režīms ir iespējots - - - Paslēpt informācijas kartītes - Informācijas kartītes ir paslēptas - Informācijas kartītes ir redzamas - - - Atspējot ritināšanas skaitļu animācijas - Ritinošie skaitļi nav animēti - Ritinošie skaitļi ir animēti - - - Slēpt video atskaņotāja laika joslu - Video atskaņotāja meklēšanas josla ir paslēpta - Video atskaņotāja meklēšanas josla ir redzama - - Slēpt video sīktēlu laika joslu - Video sīktēlu laika josla ir paslēpta - Video sīktēlu laika josla ir redzama - - - Shorts atskaņotājs - Slēpt vai rādīt Shorts atskaņotāja komponentus - - Slēpt Shorts sākumlapā. - Paslēpti sākumlapā un saistītajos video. - Redzami sākumlapā un saistītajos video. - Paslēpt Shorts meklēšanas rezultātos - Paslēpts meklēšanas rezultātos - Parādīts meklēšanas rezultātos - - Slēpt Shorts abonementu plūsmā. - Paslēpti abonementu plūsmā. - Redzami abonementu plūsmā. - Paslēpt šortus skatīšanās vēsturē - Slēpts skatīšanās vēsturē - Parādīts skatīšanās vēsturē - Slēpt etiķeti \"Automātiski dublēts\" - Automātiski dublētā iezīme ir paslēpta - Automātiski dublētā iezīme ir redzama - Slēpt pogu \"Pirkt Super Thanks\" - Poga \"Pirkt Super Thanks\" ir paslēpta. - Poga \"Pirkt Super Thanks\" ir redzama. - Paslēpt efekta pogu - Efekta poga ir paslēpta - Efekta poga ir redzama - Slēpt pogu \"Zaļais ekrāns\" - Zaļā ekrāna poga ir paslēpta - Zaļā ekrāna poga ir redzama - Paslēpt hashtags pogu - Hashtags poga ir paslēpta - Hashtags poga ir redzama - - Paslēpt pogu \"Pievienoties\" - Pievienošanās poga ir paslēpta - Pievienošanās poga ir redzama - Slēpt tiešraides priekšskatījumu - Tiešraides priekšskatījums ir paslēpts - Tiešraides priekšskatījums ir redzams - Paslēpt atrašanās vietas nosaukumu - Atrašanās vietas nosaukums ir paslēpts - Atrašanās vietas nosaukums ir redzams - Slēpt pogu \"Jaunas ziņas\" - Poga Jauni ieraksti ir paslēpta - Poga Jauni ieraksti ir redzama - Paslēpt pauzes pārklājuma pogas - Pauzes pārklājuma pogas ir paslēptas - Pauzes pārklājuma pogas ir redzamas - Paslēpt priekšskatījuma komentāru - Komentāra priekšskatījums ir paslēpts - Priekšskatījuma komentārs tiek rādīts - Slēpt pogu \"Saglabāt mūziku\" - “Saglabāt mūziku” poga ir paslēpta - “Saglabāt mūziku” poga ir redzama - Paslēpt meklēšanas ieteikumus - Meklēšanas ieteikumi ir paslēpti - Meklēšanas ieteikumi ir redzami - Paslēpt pogu \"Veikals\" - Veikala poga ir paslēpta - Veikala poga ir redzama - Paslēpt uzlīmes - Uzlīmes ir paslēptas - Uzlīmes ir redzamas - Paslēpt pogu \"Abonēt\" - Abonēšanas poga ir paslēpta - Abonēšanas poga ir redzama - Paslēpt atzīmētos produktus - Atzīmētie produkti ir paslēpti - Atzīmētie produkti ir redzami - Paslēpt pogu \"Gaidāmie\" - Nākamās pogas ir paslēptas - Nākamās pogas ir redzamas - Slēpt pogu \"Izmantot šo skaņu\" - Poga \"Izmantot šo skaņu\" ir paslēpta - Poga \"Izmantot šo skaņu\" ir redzama - Slēpt pogu \"Izmantot šo veidni\" - Poga \"Izmantot šo veidni\" ir paslēpta - Poga \"Izmantot šo veidni\" ir redzama - Paslēpt pogas \"Like\" strūklaku animāciju - Patīk pogas fonteinu animācija ir paslēpta - Patīk pogas fonteinu animācija ir redzama - Paslēpt pogu \"Like\" - Patīk poga ir paslēpta - Patīk poga ir redzama - Paslēpt pogu \"Dislike\" - Nepatīk poga ir paslēpta - Nepatīk poga ir redzama - Paslēpt pogu \"Komentāri\" - Komentāru poga ir paslēpta - Komentāru poga ir redzama - - Paslēpt pogu \"Sūtīt\" - Koplietošanas poga ir paslēpta - Koplietošanas poga ir redzama - - Paslēpt pogu \"Remix\" - Remix poga ir paslēpta - Remix poga ir redzama - Paslēpt skaņas pogu - Skaņas poga ir paslēpta - Skaņas poga ir redzama - Paslēpt informācijas paneli - Informācijas panelis ir paslēpts - Informācijas panelis ir redzams - Paslēpt kanāla joslu - Kanāla josla ir paslēpta - Kanāla josla ir redzama - Paslēpt video nosaukumu - Video nosaukums ir paslēpts. - Video nosaukums ir redzams. - Paslēpt skaņas metadatu nosaukumu - Skaņas metadatu etiķete ir paslēpta. - Skaņas metadatu etiķete ir redzama. - Paslēpt video saites etiķeti - Video saites nosaukums ir paslēpts - Video saites nosaukums ir redzams - Paslēpt navigācijas joslu - Navigācijas josla ir paslēpta - Navigācijas josla ir redzama - - - Slēpt ieteikto video beigu ekrānā - "Ieteiktais video beigu ekrānā ir paslēpts, kad automātiskā atskaņošana ir izslēgta + + Paslēpt Skatīties VR + Skatīties VR izvēlne ir paslēpta + Skatīties VR izvēlne ir redzama + Paslēpt video kvalitātes izvēlni + Video kvalitātes izvēlne ir paslēpta + Video kvalitātes izvēlne ir redzama + Paslēpt video kvalitātes izvēlnes apakšējo daļu + Video kvalitātes izvēlnes apakšējā daļa ir paslēpta + Video kvalitātes izvēlnes apakšējā daļa ir redzama + + + Paslēpt pogu \"Automātiskā atskaņošana\" + Automātiskās atskaņošanas poga ir paslēpta + Automātiskās atskaņošanas poga ir redzama + + Paslēpt pogu \"Subtitri\" + Titru poga ir paslēpta + Titru poga ir redzama + Paslēpt pogu \"Sūtīt\" + Pārraides poga ir paslēpta + Pārraides poga ir redzama + Paslēpt atskaņotāja vadīklu fonu + Atskaņotāja vadības elementu fons ir paslēpts + Atskaņotāja vadīklu fons tiek rādīts + Paslēpt iepriekšējo un nākamo pogas + Pogas ir paslēptas + Pogas ir redzamas + + + Paslēpt ekrāna beigās esošās kartītes + Ekrāna beigās esošās kartītes ir paslēptas + Ekrāna beigās esošās kartītes ir redzamas + + + Atspējot apkārtējās vides režīmu pilnekrāna režīmā + Aptuveni režīms ir atspējots + Aptuveni režīms ir iespējots + + + Paslēpt informācijas kartītes + Informācijas kartītes ir paslēptas + Informācijas kartītes ir redzamas + + + Atspējot ritināšanas skaitļu animācijas + Ritinošie skaitļi nav animēti + Ritinošie skaitļi ir animēti + + + Slēpt video atskaņotāja laika joslu + Video atskaņotāja meklēšanas josla ir paslēpta + Video atskaņotāja meklēšanas josla ir redzama + + Slēpt video sīktēlu laika joslu + Video sīktēlu laika josla ir paslēpta + Video sīktēlu laika josla ir redzama + + + Shorts atskaņotājs + Slēpt vai rādīt Shorts atskaņotāja komponentus + + Slēpt Shorts sākumlapā. + Paslēpti sākumlapā un saistītajos video. + Redzami sākumlapā un saistītajos video. + Paslēpt Shorts meklēšanas rezultātos + Paslēpts meklēšanas rezultātos + Parādīts meklēšanas rezultātos + + Slēpt Shorts abonementu plūsmā. + Paslēpti abonementu plūsmā. + Redzami abonementu plūsmā. + Paslēpt šortus skatīšanās vēsturē + Slēpts skatīšanās vēsturē + Parādīts skatīšanās vēsturē + Slēpt etiķeti \"Automātiski dublēts\" + Automātiski dublētā iezīme ir paslēpta + Automātiski dublētā iezīme ir redzama + Slēpt pogu \"Pirkt Super Thanks\" + Poga \"Pirkt Super Thanks\" ir paslēpta. + Poga \"Pirkt Super Thanks\" ir redzama. + Paslēpt efekta pogu + Efekta poga ir paslēpta + Efekta poga ir redzama + Slēpt pogu \"Zaļais ekrāns\" + Zaļā ekrāna poga ir paslēpta + Zaļā ekrāna poga ir redzama + Paslēpt hashtags pogu + Hashtags poga ir paslēpta + Hashtags poga ir redzama + + Paslēpt pogu \"Pievienoties\" + Pievienošanās poga ir paslēpta + Pievienošanās poga ir redzama + Slēpt tiešraides priekšskatījumu + Tiešraides priekšskatījums ir paslēpts + Tiešraides priekšskatījums ir redzams + Paslēpt atrašanās vietas nosaukumu + Atrašanās vietas nosaukums ir paslēpts + Atrašanās vietas nosaukums ir redzams + Slēpt pogu \"Jaunas ziņas\" + Poga Jauni ieraksti ir paslēpta + Poga Jauni ieraksti ir redzama + Paslēpt pauzes pārklājuma pogas + Pauzes pārklājuma pogas ir paslēptas + Pauzes pārklājuma pogas ir redzamas + Paslēpt priekšskatījuma komentāru + Komentāra priekšskatījums ir paslēpts + Priekšskatījuma komentārs tiek rādīts + Slēpt pogu \"Saglabāt mūziku\" + “Saglabāt mūziku” poga ir paslēpta + “Saglabāt mūziku” poga ir redzama + Paslēpt meklēšanas ieteikumus + Meklēšanas ieteikumi ir paslēpti + Meklēšanas ieteikumi ir redzami + Paslēpt pogu \"Veikals\" + Veikala poga ir paslēpta + Veikala poga ir redzama + Paslēpt uzlīmes + Uzlīmes ir paslēptas + Uzlīmes ir redzamas + Paslēpt pogu \"Abonēt\" + Abonēšanas poga ir paslēpta + Abonēšanas poga ir redzama + Paslēpt atzīmētos produktus + Atzīmētie produkti ir paslēpti + Atzīmētie produkti ir redzami + Paslēpt pogu \"Gaidāmie\" + Nākamās pogas ir paslēptas + Nākamās pogas ir redzamas + Slēpt pogu \"Izmantot šo skaņu\" + Poga \"Izmantot šo skaņu\" ir paslēpta + Poga \"Izmantot šo skaņu\" ir redzama + Slēpt pogu \"Izmantot šo veidni\" + Poga \"Izmantot šo veidni\" ir paslēpta + Poga \"Izmantot šo veidni\" ir redzama + Paslēpt pogas \"Like\" strūklaku animāciju + Patīk pogas fonteinu animācija ir paslēpta + Patīk pogas fonteinu animācija ir redzama + Paslēpt pogu \"Like\" + Patīk poga ir paslēpta + Patīk poga ir redzama + Paslēpt pogu \"Dislike\" + Nepatīk poga ir paslēpta + Nepatīk poga ir redzama + Paslēpt pogu \"Komentāri\" + Komentāru poga ir paslēpta + Komentāru poga ir redzama + + Paslēpt pogu \"Sūtīt\" + Koplietošanas poga ir paslēpta + Koplietošanas poga ir redzama + + Paslēpt pogu \"Remix\" + Remix poga ir paslēpta + Remix poga ir redzama + Paslēpt skaņas pogu + Skaņas poga ir paslēpta + Skaņas poga ir redzama + Paslēpt informācijas paneli + Informācijas panelis ir paslēpts + Informācijas panelis ir redzams + Paslēpt kanāla joslu + Kanāla josla ir paslēpta + Kanāla josla ir redzama + Paslēpt video nosaukumu + Video nosaukums ir paslēpts. + Video nosaukums ir redzams. + Paslēpt skaņas metadatu nosaukumu + Skaņas metadatu etiķete ir paslēpta. + Skaņas metadatu etiķete ir redzama. + Paslēpt video saites etiķeti + Video saites nosaukums ir paslēpts + Video saites nosaukums ir redzams + Paslēpt navigācijas joslu + Navigācijas josla ir paslēpta + Navigācijas josla ir redzama + + + Slēpt ieteikto video beigu ekrānā + "Ieteiktais video beigu ekrānā ir paslēpts, kad automātiskā atskaņošana ir izslēgta Automātisko atskaņošanu var mainīt YouTube iestatījumos: Iestatījumi → Atskaņošana → Automātiski atskaņot nākamo video" - Ieteiktais video beigu ekrānā ir redzams - - - Slēpt saistīto video pārklājumu. - Saistīto video pārklājums pilnekrāna režīmā ir paslēpts. - Saistīto video pārklājums pilnekrāna režīmā ir redzams. - - - Paslēpt video laika zīmi - Laika zīme ir paslēpta - Laika zīme ir redzama - - - Paslēpt atskaņotāja uznirstošos paneļus - Atskaņotāja uznirstošie paneļi ir paslēpti - Atskaņotāja uznirstošie paneļi ir redzami - - - Iziet no pilnekrāna režīma video beigās - Atspējots - Portrets - Ainava - Portrets un ainava - - - Atvērt video pilnekrāna portreta režīmā - Video tiek atvērti pilnekrāna režīmā - Video netiek atvērti pilnekrāna režīmā - - - Atskaņotāja pārklājuma caurspīdīgums - Caurspīdīguma vērtība no 0 līdz 100, kur 0 ir caurspīdīgs - Atskaņotāja pārklājuma caurspīdīgumam jābūt no 0 līdz 100 - - - - Nepatīk pogas īslaicīgi nav pieejamas (API savienojuma termiņš ir beidzies) - Nepatīk pogas nav pieejamas (statuss %d) - Nepatīk nav pieejami (klienta API limits) - Nepatīk pogas nav pieejamas (%s) - - Pārstartējiet video, lai balsotu, izmantojot Return YouTube Dislike - - Slēpts no īpašnieka - Nepatīk pogas ir redzamas - Nepatīk pogas nav redzamas - Rādīt nepatīk pogas Shorts - "Nepatīk pie Shorts ir redzami + Ieteiktais video beigu ekrānā ir redzams + + + Slēpt saistīto video pārklājumu. + Saistīto video pārklājums pilnekrāna režīmā ir paslēpts. + Saistīto video pārklājums pilnekrāna režīmā ir redzams. + + + Paslēpt video laika zīmi + Laika zīme ir paslēpta + Laika zīme ir redzama + + + Paslēpt atskaņotāja uznirstošos paneļus + Atskaņotāja uznirstošie paneļi ir paslēpti + Atskaņotāja uznirstošie paneļi ir redzami + + + Iziet no pilnekrāna režīma video beigās + Atspējots + Portrets + Ainava + Portrets un ainava + + + Atvērt video pilnekrāna portreta režīmā + Video tiek atvērti pilnekrāna režīmā + Video netiek atvērti pilnekrāna režīmā + + + Atskaņotāja pārklājuma caurspīdīgums + Caurspīdīguma vērtība no 0 līdz 100, kur 0 ir caurspīdīgs + Atskaņotāja pārklājuma caurspīdīgumam jābūt no 0 līdz 100 + + + + Nepatīk pogas īslaicīgi nav pieejamas (API savienojuma termiņš ir beidzies) + Nepatīk pogas nav pieejamas (statuss %d) + Nepatīk nav pieejami (klienta API limits) + Nepatīk pogas nav pieejamas (%s) + + Pārstartējiet video, lai balsotu, izmantojot Return YouTube Dislike + + Slēpts no īpašnieka + Nepatīk pogas ir redzamas + Nepatīk pogas nav redzamas + Rādīt nepatīk pogas Shorts + "Nepatīk pie Shorts ir redzami Ierobežojums: Nepatīk var neparādīties inkognito režīmā" - Nepatīk pie Shorts nav redzami - Nepatīk pogas kā procenti - Nepatīk ir redzami kā procentuālā vērtība - Nepatīk ir redzami kā skaitlis - - Kompaktpoga \"Like\" - Patīk poga ir stilizēta minimālam platumam - Patīk poga ir stilizēta labākam izskatam - Rādīt aptuvenos \"Patīk\" - Videoklipi ar atspējotām atzīmēm Patīk rāda aptuveno atzīmju Patīk skaitu - Aptuvenais atzīmju Patīk skaits netiek rādīts - Rādīt paziņojumu, ja API nav pieejama - Paziņojums tiks rādīts, ja Return YouTube Dislike nav pieejams - Paziņojums netiks rādīts, ja Return YouTube Dislike nav pieejams - Dati ir nodrošināti ar Return YouTube Dislike API. Pieskarieties šeit, lai uzzinātu vairāk - - ReturnYouTubeDislike API statistika šai ierīcei - API atbildes laiks, vidēji - API atbildes laiks, minimāli - API atbildes laiks, maksimālais - API atbildes laiks, pēdējais video - Nevēlējumi pašlaik nav pieejami - Klienta API ātruma ierobežojums ir spēkā - API balsojumu iegūšana, zvanu skaits - Nav veikti tīkla zvani - %d tīkla zvani veikti - API balsojumu iegūšana, laika ierobežojumu skaits - Neviens tīkla zvans nav beidzies ar laika ierobežojumu - %d tīkla zvani ir beigušies ar laika ierobežojumu - API klienta ātruma ierobežojumi - Nav sastapts neviens klienta ātruma ierobežojums - Klienta ātruma ierobežojums sastapts %d reizes - %d milisekundes - - - Iespējot platu meklēšanas joslu - Plata meklēšanas josla ir iespējota - Plata meklēšanas josla ir atspējota - - - Iespējot augstas kvalitātes sīktēlus - Meklēšanas joslas sīktēli ir augstas kvalitātes - Meklēšanas joslas sīktēli ir vidējas kvalitātes - Pilnekrāna meklēšanas joslas sīktēli ir augstas kvalitātes - Pilnekrāna meklēšanas joslas sīktēli ir vidējas kvalitātes - "Tādējādi tiks atjaunotas miniatūras tiešraides straumēs, kurām nav laika skalas miniatūru. + Nepatīk pie Shorts nav redzami + Nepatīk pogas kā procenti + Nepatīk ir redzami kā procentuālā vērtība + Nepatīk ir redzami kā skaitlis + + Kompaktpoga \"Like\" + Patīk poga ir stilizēta minimālam platumam + Patīk poga ir stilizēta labākam izskatam + Rādīt aptuvenos \"Patīk\" + Videoklipi ar atspējotām atzīmēm Patīk rāda aptuveno atzīmju Patīk skaitu + Aptuvenais atzīmju Patīk skaits netiek rādīts + Rādīt paziņojumu, ja API nav pieejama + Paziņojums tiks rādīts, ja Return YouTube Dislike nav pieejams + Paziņojums netiks rādīts, ja Return YouTube Dislike nav pieejams + Dati ir nodrošināti ar Return YouTube Dislike API. Pieskarieties šeit, lai uzzinātu vairāk + + ReturnYouTubeDislike API statistika šai ierīcei + API atbildes laiks, vidēji + API atbildes laiks, minimāli + API atbildes laiks, maksimālais + API atbildes laiks, pēdējais video + Nevēlējumi pašlaik nav pieejami - Klienta API ātruma ierobežojums ir spēkā + API balsojumu iegūšana, zvanu skaits + Nav veikti tīkla zvani + %d tīkla zvani veikti + API balsojumu iegūšana, laika ierobežojumu skaits + Neviens tīkla zvans nav beidzies ar laika ierobežojumu + %d tīkla zvani ir beigušies ar laika ierobežojumu + API klienta ātruma ierobežojumi + Nav sastapts neviens klienta ātruma ierobežojums + Klienta ātruma ierobežojums sastapts %d reizes + %d milisekundes + + + Iespējot platu meklēšanas joslu + Plata meklēšanas josla ir iespējota + Plata meklēšanas josla ir atspējota + + + Iespējot augstas kvalitātes sīktēlus + Meklēšanas joslas sīktēli ir augstas kvalitātes + Meklēšanas joslas sīktēli ir vidējas kvalitātes + Pilnekrāna meklēšanas joslas sīktēli ir augstas kvalitātes + Pilnekrāna meklēšanas joslas sīktēli ir vidējas kvalitātes + "Tādējādi tiks atjaunotas miniatūras tiešraides straumēs, kurām nav laika skalas miniatūru. Laika skalas miniatūras izmantos tādu pašu kvalitāti kā pašreizējais video. Šī funkcija darbojas vislabāk ar video kvalitāti 720p vai zemāku un, ja tiek izmantots ļoti ātrs interneta savienojums." - Atjaunot vecās meklēšanas joslas sīktēlus - Meklēšanas joslas sīktēli parādīsies virs meklēšanas joslas - Meklēšanas joslas sīktēli parādīsies pilnekrānā - - - Iespējot SponsorBlock - SponsorBlock ir kopienas sistēma YouTube videoklipu kaitinošo daļu izlaišanai - Izskats - Rādīt balsošanas pogu - Segmenta balsošanas poga ir redzama - Segmenta balsošanas poga nav redzama - Izmantot kvadrātveida izkārtojumu - Pogām un vadīklām ir kvadrātveida forma - Pogas un vadīklas ir noapaļotas - - Izmantot kompakto pogu Izlaist - Izlaides poga ir veidota minimālajam platumam - Izlaides poga ir veidota labākajam izskatam - Automātiski paslēpt pogu Izlaist - Izlaides poga paslēpjas pēc dažām sekundēm - Poga Izlaist ir redzama visam segmentam - Izlaišanas pogas ilgums - Cik ilgi rādīt pogas \"Izlaist\" un \"Izlaist uz izcelt\", pirms tās automātiski paslēpjas - Rādīt atsaukt izlaišanas paziņojumu - Paziņojums tiek rādīts, kad segments tiek automātiski izlaists. Pieskarieties paziņojumam, lai atsauktu izlaišanu - Paziņojums netiek rādīts - Izlaišanas paziņojuma ilgums - Cik ilgi rādīt paziņojumu par izlaišanas atcelšanu - 1 sekunde - 2 sekundes - 3 sekundes - 4 sekundes - 5 sekundes - 6 sekundes - 7 sekundes - 8 sekundes - 9 sekundes - 10 sekundes - Parādīt video garumu bez segmentiem - Video garums bez visiem segmentiem tiek rādīts meklēšanas joslā - Pilns video garums parādīts - Jaunu segmentu izveide - Rādīt pogu Izveidot jaunu segmentu - Pogu jaunam segmentam ir redzama - Pogu jaunam segmentam nav redzama - Pielāgot jaunā segmenta soli - Milisekundes skaits, par kuru laika pielāgošanas pogas pārvietojas, veidojot jaunus segmentus - Vērtībai jābūt pozitīvam skaitlim - Skatīt vadlīnijas - Vadlīnijas satur noteikumus un padomus jaunu segmentu izveidei - Sekojiet vadlīnijām - Pirms jaunu segmentu izveides izlasiet SponsorBlock vadlīnijas - Jau izlasīts - Parādīt man - Vispārīgi - Parādīt paziņojumu, ja API nav pieejama - Paziņojums parādās, ja SponsorBlock nav pieejams - Paziņojums netiek parādīts, ja SponsorBlock nav pieejams - Iespējot izlaides skaita uzskaiti - Atļauj SponsorBlock līderu sarakstam uzzināt, cik daudz laika tiek ietaupīts. Ziņojums tiek nosūtīts līderu sarakstam katru reizi, kad tiek izlaists segments - Izlaides skaita uzskaite nav iespējota - Minimālais segmenta ilgums - Segmenti, kas ir īsāki par šo vērtību (sekundēs), netiks parādīti vai izlaisti - Nederīgs laika ilgums - Jūsu privātais lietotāja ID - Tas jātur privāti. Tas ir kā parole, un to nedrīkst dalīties ar citiem. Ja kādam tā ir, viņi var jūs impersonēt - Privātā lietotāja ID garumam jābūt vismaz 30 rakstzīmēm - Mainīt API URL - Adrese, ko SponsorBlock izmanto, lai veiktu zvanus uz serveri - API URL atiestatīts - API URL nav derīgs - API URL mainīts - Importēt/eksportēt iestatījumus - Kopēt - Jūsu SponsorBlock JSON konfigurācija, ko var importēt/eksportēt uz ReVanced un citām SponsorBlock platformām - Jūsu SponsorBlock JSON konfigurācija, ko var importēt/eksportēt uz ReVanced un citām SponsorBlock platformām. Tas ietver jūsu privāto lietotāja ID. Esiet uzmanīgs, daloties ar šo informāciju - Iestatījumi importēti veiksmīgi - Importēšana neizdevās: %s - Eksportēšana neizdevās: %s - "Jūsu iestatījumos ir privāts SponsorBlock lietotāja ID. + Atjaunot vecās meklēšanas joslas sīktēlus + Meklēšanas joslas sīktēli parādīsies virs meklēšanas joslas + Meklēšanas joslas sīktēli parādīsies pilnekrānā + + + Iespējot SponsorBlock + SponsorBlock ir kopienas sistēma YouTube videoklipu kaitinošo daļu izlaišanai + Izskats + Rādīt balsošanas pogu + Segmenta balsošanas poga ir redzama + Segmenta balsošanas poga nav redzama + Izmantot kvadrātveida izkārtojumu + Pogām un vadīklām ir kvadrātveida forma + Pogas un vadīklas ir noapaļotas + + Izmantot kompakto pogu Izlaist + Izlaides poga ir veidota minimālajam platumam + Izlaides poga ir veidota labākajam izskatam + Automātiski paslēpt pogu Izlaist + Izlaides poga paslēpjas pēc dažām sekundēm + Poga Izlaist ir redzama visam segmentam + Izlaišanas pogas ilgums + Cik ilgi rādīt pogas \"Izlaist\" un \"Izlaist uz izcelt\", pirms tās automātiski paslēpjas + Rādīt atsaukt izlaišanas paziņojumu + Paziņojums tiek rādīts, kad segments tiek automātiski izlaists. Pieskarieties paziņojumam, lai atsauktu izlaišanu + Paziņojums netiek rādīts + Izlaišanas paziņojuma ilgums + Cik ilgi rādīt paziņojumu par izlaišanas atcelšanu + 1 sekunde + 2 sekundes + 3 sekundes + 4 sekundes + 5 sekundes + 6 sekundes + 7 sekundes + 8 sekundes + 9 sekundes + 10 sekundes + Parādīt video garumu bez segmentiem + Video garums bez visiem segmentiem tiek rādīts meklēšanas joslā + Pilns video garums parādīts + Jaunu segmentu izveide + Rādīt pogu Izveidot jaunu segmentu + Pogu jaunam segmentam ir redzama + Pogu jaunam segmentam nav redzama + Pielāgot jaunā segmenta soli + Milisekundes skaits, par kuru laika pielāgošanas pogas pārvietojas, veidojot jaunus segmentus + Vērtībai jābūt pozitīvam skaitlim + Skatīt vadlīnijas + Vadlīnijas satur noteikumus un padomus jaunu segmentu izveidei + Sekojiet vadlīnijām + Pirms jaunu segmentu izveides izlasiet SponsorBlock vadlīnijas + Jau izlasīts + Parādīt man + Vispārīgi + Parādīt paziņojumu, ja API nav pieejama + Paziņojums parādās, ja SponsorBlock nav pieejams + Paziņojums netiek parādīts, ja SponsorBlock nav pieejams + Iespējot izlaides skaita uzskaiti + Atļauj SponsorBlock līderu sarakstam uzzināt, cik daudz laika tiek ietaupīts. Ziņojums tiek nosūtīts līderu sarakstam katru reizi, kad tiek izlaists segments + Izlaides skaita uzskaite nav iespējota + Minimālais segmenta ilgums + Segmenti, kas ir īsāki par šo vērtību (sekundēs), netiks parādīti vai izlaisti + Nederīgs laika ilgums + Jūsu privātais lietotāja ID + Tas jātur privāti. Tas ir kā parole, un to nedrīkst dalīties ar citiem. Ja kādam tā ir, viņi var jūs impersonēt + Privātā lietotāja ID garumam jābūt vismaz 30 rakstzīmēm + Mainīt API URL + Adrese, ko SponsorBlock izmanto, lai veiktu zvanus uz serveri + API URL atiestatīts + API URL nav derīgs + API URL mainīts + Importēt/eksportēt iestatījumus + Kopēt + Jūsu SponsorBlock JSON konfigurācija, ko var importēt/eksportēt uz ReVanced un citām SponsorBlock platformām + Jūsu SponsorBlock JSON konfigurācija, ko var importēt/eksportēt uz ReVanced un citām SponsorBlock platformām. Tas ietver jūsu privāto lietotāja ID. Esiet uzmanīgs, daloties ar šo informāciju + Iestatījumi importēti veiksmīgi + Importēšana neizdevās: %s + Eksportēšana neizdevās: %s + "Jūsu iestatījumos ir privāts SponsorBlock lietotāja ID. Jūsu lietotāja ID ir kā parole, un to nekad nedrīkst dalīties." - Nerādīt vēlreiz - Mainīt segmenta darbību - Sponsorēšana - Maksāta reklāma, maksātas ieteikumi un tiešās reklāmas. Nav paredzēts pašreklāmai vai bezmaksas saucieniem uz cēloņiem/radītājiem/mājas lapām/produktiem, kas viņiem patīk - Nemaksāta/Pašreklāma - Līdzīgi kā sponsorētajam saturam, bet bezmaksas vai pašreklāmai. Ietver sadaļas par produktiem, ziedojumiem vai informāciju par to, ar ko viņi sadarbojās - Mijiedarbības atgādinājums (Abonēt) - Īss atgādinājums patīk, abonēt vai sekot viņiem satura vidū. Ja tas ir garš vai par kaut ko konkrētu, tam jābūt pašreklāmā - Izcelšana - Video daļa, ko lielākā daļa cilvēku meklē - Pārtraukums/Ievada animācija - Intervāls bez faktiska satura. Var būt pauze, statisks kadrs vai atkārtota animācija. Neietver pārejas, kas satur informāciju - Noslēguma kartītes / Titri - Titri vai tad, kad parādās YouTube noslēguma ekrāni. Neietver secinājumus ar informāciju - Ievads / Sveicieni - Stāstīti reklāmas rullīši gaidāmajam video, sveicieni un atvadas. Neietver sadaļas, kas pievieno papildu saturu - Priekšskatījums / Kopsavilkums - Klipu kolekcija, kas parāda, kas notiks tālāk vai kas notika video vai citās sērijas video, kur visa informācija ir atkārtota citur - Atkāpes / Joki - Sānu ainas vai joki, kas nav nepieciešami, lai saprastu video galveno saturu. Neietver sadaļas, kas sniedz kontekstu vai fona informāciju - Mūzika: Ne-mūzikas sadaļa - Lietojams tikai mūzikas video. Mūzikas video sadaļas bez mūzikas, kas jau nav aptvertas citā kategorijā - Izlaist - Izcelt - Izlaist sponsorēšanu - Izlaist reklāmu - Izlaist mijiedarbību - Izlaist uz izcelšanu - Izlaist ievadu - Izlaist pārtraukumu - Izlaist pārtraukumu - Izlaist noslēgumu - Izlaist ievadu - Izlaist priekšskatījumu - Izlaist priekšskatījumu - Izlaist atgriezenisko saiti - Izlaist sānu - Izlaist ne-mūzikas sadaļu - Izlaist segmentu - Izlaista sponsorēšana - Izlaista reklāma - Izlaists kaitinošs atgādinājums - Izlaists uz izcelšanu - Izlaists ievads - Izlaists pārtraukums - Izlaists pārtraukums - Izlaists noslēgums - Izlaists ievads - Izlaists priekšskatījums - Izlaists priekšskatījums - Izlaista atgriezeniskā saite - Izlaists sānu - Izlaista ne-mūzikas sadaļa - Izlaists neiesniegts segments - Izlaisti vairāki segmenti - Izlaist automātiski - Izlaist automātiski vienreiz - Rādīt pogu Izlaist - Rādīt meklēšanas joslā - Atspējot - Nevar iesniegt segmentu: %s - SponsorBlock ir īslaicīgi nepieejams - Nevar iesniegt segmentu (status: %1$d %2$s) - Nevar iesniegt segmentu. Ātruma ierobežojums (pārāk daudz no viena un tā paša lietotāja vai IP adreses) - Nevar iesniegt segmentu: %s - "Nevar iesniegt segmentu. + Nerādīt vēlreiz + Mainīt segmenta darbību + Sponsorēšana + Maksāta reklāma, maksātas ieteikumi un tiešās reklāmas. Nav paredzēts pašreklāmai vai bezmaksas saucieniem uz cēloņiem/radītājiem/mājas lapām/produktiem, kas viņiem patīk + Nemaksāta/Pašreklāma + Līdzīgi kā sponsorētajam saturam, bet bezmaksas vai pašreklāmai. Ietver sadaļas par produktiem, ziedojumiem vai informāciju par to, ar ko viņi sadarbojās + Mijiedarbības atgādinājums (Abonēt) + Īss atgādinājums patīk, abonēt vai sekot viņiem satura vidū. Ja tas ir garš vai par kaut ko konkrētu, tam jābūt pašreklāmā + Izcelšana + Video daļa, ko lielākā daļa cilvēku meklē + Pārtraukums/Ievada animācija + Intervāls bez faktiska satura. Var būt pauze, statisks kadrs vai atkārtota animācija. Neietver pārejas, kas satur informāciju + Noslēguma kartītes / Titri + Titri vai tad, kad parādās YouTube noslēguma ekrāni. Neietver secinājumus ar informāciju + Ievads / Sveicieni + Stāstīti reklāmas rullīši gaidāmajam video, sveicieni un atvadas. Neietver sadaļas, kas pievieno papildu saturu + Priekšskatījums / Kopsavilkums + Klipu kolekcija, kas parāda, kas notiks tālāk vai kas notika video vai citās sērijas video, kur visa informācija ir atkārtota citur + Atkāpes / Joki + Sānu ainas vai joki, kas nav nepieciešami, lai saprastu video galveno saturu. Neietver sadaļas, kas sniedz kontekstu vai fona informāciju + Mūzika: Ne-mūzikas sadaļa + Lietojams tikai mūzikas video. Mūzikas video sadaļas bez mūzikas, kas jau nav aptvertas citā kategorijā + Izlaist + Izcelt + Izlaist sponsorēšanu + Izlaist reklāmu + Izlaist mijiedarbību + Izlaist uz izcelšanu + Izlaist ievadu + Izlaist pārtraukumu + Izlaist pārtraukumu + Izlaist noslēgumu + Izlaist ievadu + Izlaist priekšskatījumu + Izlaist priekšskatījumu + Izlaist atgriezenisko saiti + Izlaist sānu + Izlaist ne-mūzikas sadaļu + Izlaist segmentu + Izlaista sponsorēšana + Izlaista reklāma + Izlaists kaitinošs atgādinājums + Izlaists uz izcelšanu + Izlaists ievads + Izlaists pārtraukums + Izlaists pārtraukums + Izlaists noslēgums + Izlaists ievads + Izlaists priekšskatījums + Izlaists priekšskatījums + Izlaista atgriezeniskā saite + Izlaists sānu + Izlaista ne-mūzikas sadaļa + Izlaists neiesniegts segments + Izlaisti vairāki segmenti + Izlaist automātiski + Izlaist automātiski vienreiz + Rādīt pogu Izlaist + Rādīt meklēšanas joslā + Atspējot + Nevar iesniegt segmentu: %s + SponsorBlock ir īslaicīgi nepieejams + Nevar iesniegt segmentu (status: %1$d %2$s) + Nevar iesniegt segmentu. Ātruma ierobežojums (pārāk daudz no viena un tā paša lietotāja vai IP adreses) + Nevar iesniegt segmentu: %s + "Nevar iesniegt segmentu. Jau pastāv" - Segments veiksmīgi iesniegts - - SponsorBlock īslaicīgi nepieejams (API laika izbeigšanās) - SponsorBlock īslaicīgi nepieejams (status %d) - SponsorBlock īslaicīgi nepieejams - Nevar balsot par segmentu (API laika izbeigšanās) - Nevar balsot par segmentu (status: %1$d %2$s) - Nevar balsot par segmentu: %s - Novērtēt uz augšu - Novērtēt uz leju - Mainīt kategoriju - Nav segmentu, par kuriem balsot - - %1$s līdz %2$s - Izvēlieties segmenta kategoriju - Kategorija ir atspējota iestatījumos. Iespējojiet kategoriju, lai iesniegtu. - Jauns SponsorBlock segments - Iestatīt %s kā jauna segmenta sākumu vai beigas? - Sākums - Beigas - Tagad - Laiks, kad segments sākas - Laiks, kad segments beidzas - Vai laiki ir pareizi? - "Segments ir no + Segments veiksmīgi iesniegts + + SponsorBlock īslaicīgi nepieejams (API laika izbeigšanās) + SponsorBlock īslaicīgi nepieejams (status %d) + SponsorBlock īslaicīgi nepieejams + Nevar balsot par segmentu (API laika izbeigšanās) + Nevar balsot par segmentu (status: %1$d %2$s) + Nevar balsot par segmentu: %s + Novērtēt uz augšu + Novērtēt uz leju + Mainīt kategoriju + Nav segmentu, par kuriem balsot + + %1$s līdz %2$s + Izvēlieties segmenta kategoriju + Kategorija ir atspējota iestatījumos. Iespējojiet kategoriju, lai iesniegtu. + Jauns SponsorBlock segments + Iestatīt %s kā jauna segmenta sākumu vai beigas? + Sākums + Beigas + Tagad + Laiks, kad segments sākas + Laiks, kad segments beidzas + Vai laiki ir pareizi? + "Segments ir no %1$s uz @@ -1281,46 +1280,46 @@ uz (%3$s) Vai esat gatavs iesniegt?" - Sākums ir jābūt pirms beigām - Vispirms atzīmējiet divas vietas uz laika joslas - Priekšskatīt segmentu un pārliecināties, ka tas vienmērīgi izlaiž - Rediģēt segmenta laika iestatījumus manuāli - Vai vēlaties rediģēt segmenta sākuma vai beigu laika iestatījumus? - Norādīts nepareizs laiks - Statistika - - Statistika īslaicīgi nav pieejama (API ir izslēgts) - Ielādē... - SponsorBlock ir atspējots - Jūsu lietotājvārds: <b>%s</b> - Nospiediet šeit, lai mainītu lietotājvārdu - Nevar mainīt lietotājvārdu: Status: %1$d %2$s - Lietotājvārds veiksmīgi mainīts - Jūsu reputācija ir <b>%.2f</b> - Jūs esat izveidojis <b>%s</b> segmentus - Nospiediet šeit, lai skatītu savus segmentus - SponsorBlock līderu saraksts - Jūs esat ietaupījis cilvēkus no <b>%s</b> segmentiem - Nospiediet šeit, lai skatītu globālo statistiku un labākos dalībniekus - Tas ir <b>%s</b> no viņu dzīves.<br>Nospiediet šeit, lai skatītu līderu sarakstu - Jūs esat izlaidis <b>%s</b> segmentus - Tas ir <b>%s</b> - Atiestatīt izlaisto segmentu skaitītāju? - %1$s stundas %2$s minūtes - %1$s minūtes %2$s sekundes - %s sekundes - Necaurredzamība: - Krāsa: - Par - Dati tiek sniegti no SponsorBlock API. Pieskarieties šeit, lai uzzinātu vairāk un skatītu lejupielādes citām platformām - - - Izmēģinājuma formāts - Noklusējums - Tālrunis - Planšetdators - Automobiļu - "Izmaiņas iekļauj: + Sākums ir jābūt pirms beigām + Vispirms atzīmējiet divas vietas uz laika joslas + Priekšskatīt segmentu un pārliecināties, ka tas vienmērīgi izlaiž + Rediģēt segmenta laika iestatījumus manuāli + Vai vēlaties rediģēt segmenta sākuma vai beigu laika iestatījumus? + Norādīts nepareizs laiks + Statistika + + Statistika īslaicīgi nav pieejama (API ir izslēgts) + Ielādē... + SponsorBlock ir atspējots + Jūsu lietotājvārds: <b>%s</b> + Nospiediet šeit, lai mainītu lietotājvārdu + Nevar mainīt lietotājvārdu: Status: %1$d %2$s + Lietotājvārds veiksmīgi mainīts + Jūsu reputācija ir <b>%.2f</b> + Jūs esat izveidojis <b>%s</b> segmentus + Nospiediet šeit, lai skatītu savus segmentus + SponsorBlock līderu saraksts + Jūs esat ietaupījis cilvēkus no <b>%s</b> segmentiem + Nospiediet šeit, lai skatītu globālo statistiku un labākos dalībniekus + Tas ir <b>%s</b> no viņu dzīves.<br>Nospiediet šeit, lai skatītu līderu sarakstu + Jūs esat izlaidis <b>%s</b> segmentus + Tas ir <b>%s</b> + Atiestatīt izlaisto segmentu skaitītāju? + %1$s stundas %2$s minūtes + %1$s minūtes %2$s sekundes + %s sekundes + Necaurredzamība: + Krāsa: + Par + Dati tiek sniegti no SponsorBlock API. Pieskarieties šeit, lai uzzinātu vairāk un skatītu lejupielādes citām platformām + + + Izmēģinājuma formāts + Noklusējums + Tālrunis + Planšetdators + Automobiļu + "Izmaiņas iekļauj: Planšetdatora izkārtojums • Kopienas ieraksti ir paslēpti @@ -1328,314 +1327,312 @@ Planšetdatora izkārtojums Automobiļu izkārtojums • Shorts tiek atvērti parastajā atskaņotājā • Plūsma ir sakārtota pēc tēmām un kanāliem" - - - Vilto lietotnes versiju - Versija viltota - Versija nav viltota - "Lietotnes versija tiks viltota uz vecāku YouTube versiju. + + + Vilto lietotnes versiju + Versija viltota + Versija nav viltota + "Lietotnes versija tiks viltota uz vecāku YouTube versiju. Tas mainīs lietotnes izskatu un funkcijas, taču var rasties nezināmas blakusparādības. Ja vēlāk tiks izslēgts, ieteicams notīrīt lietotnes datus, lai novērstu lietotāja saskarnes kļūdas." - Viltot lietotnes versijas mērķis - 20.13.41 - Atjaunot nesaspiestu video darbību joslu - 20.05.46 - Atjaunot transkripta funkcionalitāti - 19.35.36 - Atjaunot vecās Shorts spēlētāja ikonas - 19.01.34 - Atjaunot vecās navigācijas ikonas - - - Mainīt sākuma lapu - Noklusētais - Visi abonementi - Pārlūkot kanālus - Kursi / Mācīšanās - Pētīt - Mode un skaistums - Spēles - Vēsture - Bibliotēka - Patīk video - Tiešraide - Filmas - Mūzika - Ziņas - Paziņojumi - Atskaņošanas saraksti - Meklēt - Iepirkšanās - Sporta - Abonementi - Trendējošais - Virtuālā realitāte - Skaties vēlāk - Tavi klipi - Vienmēr mainīt sākuma lapu - "Sākuma lapa vienmēr tiek mainīta + Viltot lietotnes versijas mērķis + 20.13.41 - Atjaunot nesaspiestu video darbību joslu + 20.05.46 - Atjaunot transkripta funkcionalitāti + 19.35.36 - Atjaunot vecās Shorts spēlētāja ikonas + 19.01.34 - Atjaunot vecās navigācijas ikonas + + + Mainīt sākuma lapu + Noklusētais + Visi abonementi + Pārlūkot kanālus + Kursi / Mācīšanās + Pētīt + Mode un skaistums + Spēles + Vēsture + Bibliotēka + Patīk video + Tiešraide + Filmas + Mūzika + Ziņas + Paziņojumi + Atskaņošanas saraksti + Meklēt + Iepirkšanās + Sporta + Abonementi + Trendējošais + Virtuālā realitāte + Skaties vēlāk + Tavi klipi + Vienmēr mainīt sākuma lapu + "Sākuma lapa vienmēr tiek mainīta Ierobežojums: Atpakaļpoga rīkjoslā var nedarboties" - Sākuma lapa tiek mainīta tikai lietotnes startēšanas reizē - - - Atspējot Shorts atskaņotāja atsākšanu - Shorts atskaņotājs neatjaunosies lietotnes palaišanas laikā - Shorts atskaņotājs tiks atsākts lietotnes palaišanas laikā - - - Atvērt Shorts ar - Shorts atskaņotājs - Parastais atskaņotājs - Pilnekrāna parastais atskaņotājs - - - Automātiskā īso videoklipu atskaņošana - Shorts tiks atskaņoti automātiski - Shorts tiks atkārtoti - Autoplay Shorts fonā atskaņošana - Shorts fonā atskaņošana tiks atskaņota automātiski - Shorts fonā atskaņošana tiks atkārtota - - - Minispēlētājs - Mainīt lietotnē minimizētā atskaņotāja stilu - Miniplayer tips - Atspējots - Noklusētais - Minimāls - Planšete - Moderns 1 - Moderns 2 - Moderns 3 - Moderns 4 - Atspējot noapaļotos stūrus - Stūri ir kvadrātveida - Stūri ir noapaļoti - Iespējot divkāršu pieskaršanos un saspiešanu, lai mainītu izmēru - "Dubultpieskāriena darbība un saspiešana, lai mainītu izmēru, ir iespējota + Sākuma lapa tiek mainīta tikai lietotnes startēšanas reizē + + + Atspējot Shorts atskaņotāja atsākšanu + Shorts atskaņotājs neatjaunosies lietotnes palaišanas laikā + Shorts atskaņotājs tiks atsākts lietotnes palaišanas laikā + + + Atvērt Shorts ar + Shorts atskaņotājs + Parastais atskaņotājs + Pilnekrāna parastais atskaņotājs + + + Automātiskā īso videoklipu atskaņošana + Shorts tiks atskaņoti automātiski + Shorts tiks atkārtoti + Autoplay Shorts fonā atskaņošana + Shorts fonā atskaņošana tiks atskaņota automātiski + Shorts fonā atskaņošana tiks atkārtota + + + Minispēlētājs + Mainīt lietotnē minimizētā atskaņotāja stilu + Miniplayer tips + Atspējots + Noklusētais + Minimāls + Planšete + Moderns 1 + Moderns 2 + Moderns 3 + Moderns 4 + Atspējot noapaļotos stūrus + Stūri ir kvadrātveida + Stūri ir noapaļoti + Iespējot divkāršu pieskaršanos un saspiešanu, lai mainītu izmēru + "Dubultpieskāriena darbība un saspiešana, lai mainītu izmēru, ir iespējota • Dubultpieskarieties, lai palielinātu miniatskaņotāja izmēru • Atkārtojiet dubultpieskārienu, lai atjaunotu sākotnējo izmēru" - Divkāršas pieskaršanās darbība un saspiešana, lai mainītu izmēru, ir atspējota - Atspējot vilkšanu un nomešanu - Velciet un nometiet ir atspējots - "Pārvilkšana un nomešana ir iespējota + Divkāršas pieskaršanās darbība un saspiešana, lai mainītu izmēru, ir atspējota + Atspējot vilkšanu un nomešanu + Velciet un nometiet ir atspējots + "Pārvilkšana un nomešana ir iespējota Miniatskaņotāju var pārvilkt uz jebkuru ekrāna stūri" - Atspējot horizontālās vilkšanas žestu - Horizontāls velci ir atspējots - "Horizontālas pārvilkšanas žests ir iespējots + Atspējot horizontālās vilkšanas žestu + Horizontāls velci ir atspējots + "Horizontālas pārvilkšanas žests ir iespējots Miniatskaņotāju var pārvilkt no ekrāna uz kreiso vai labo pusi" - Paslēpt pārklājuma pogas - Pārklājuma pogas ir paslēptas - Pārklājuma pogas ir redzamas - Slēpt apakštekstu - Apakšteksts ir paslēpts - Apakšteksts ir redzams - Slēpt pārlēkt uz priekšu un atpakaļ pogas - Pārlēkt uz priekšu un atpakaļ ir paslēpts - Pārlēkt uz priekšu un atpakaļ ir redzams - Sākotnējais izmērs - Sākotnējais izmērs ekrānā, pikseļos - Pikseļu izmēram jābūt no %1$s līdz %2$s - Pārklājuma caurspīdīgums - Caurspīdīguma vērtība no 0-100, kur 0 ir caurspīdīgs - Miniplayer pārklājuma caurspīdīgumam jābūt no 0-100 - - - Iespējot gradientu ielādes ekrānu - Ielādes ekrānam būs gradientu fons - Ielādes ekrānam būs ciets fons - Sākuma ekrāna stils - Krāsa - Melnbalts - Iespējot pielāgotu meklēšanas joslas krāsu - Pielāgota meklēšanas joslas krāsa ir redzama - Oriģinālā meklēšanas joslas krāsa ir redzama - Pielāgots meklētājjoslas fons - Meklētājjoslas krāsa - Pielāgots meklētājjoslas akcenta fons - Meklētājjoslas akcenta krāsa - Nederīga meklētāja joslas krāsas vērtība - - - - - Galvenes logotips - Noklusējums - Parasts - - ReVanced minimāls - Pielāgots - - - Apsaisīt attēlu reģiona ierobežojumus - Izmantojot attēlu mitināšanas pakalpojumu yt4.ggpht.com - "Izmantojot sākotnējo attēla mitināšanas pakalpojumu + Paslēpt pārklājuma pogas + Pārklājuma pogas ir paslēptas + Pārklājuma pogas ir redzamas + Slēpt apakštekstu + Apakšteksts ir paslēpts + Apakšteksts ir redzams + Slēpt pārlēkt uz priekšu un atpakaļ pogas + Pārlēkt uz priekšu un atpakaļ ir paslēpts + Pārlēkt uz priekšu un atpakaļ ir redzams + Sākotnējais izmērs + Sākotnējais izmērs ekrānā, pikseļos + Pikseļu izmēram jābūt no %1$s līdz %2$s + Pārklājuma caurspīdīgums + Caurspīdīguma vērtība no 0-100, kur 0 ir caurspīdīgs + Miniplayer pārklājuma caurspīdīgumam jābūt no 0-100 + + + Iespējot gradientu ielādes ekrānu + Ielādes ekrānam būs gradientu fons + Ielādes ekrānam būs ciets fons + Sākuma ekrāna stils + Krāsa + Melnbalts + Iespējot pielāgotu meklēšanas joslas krāsu + Pielāgota meklēšanas joslas krāsa ir redzama + Oriģinālā meklēšanas joslas krāsa ir redzama + Pielāgots meklētājjoslas fons + Meklētājjoslas krāsa + Pielāgots meklētājjoslas akcenta fons + Meklētājjoslas akcenta krāsa + Nederīga meklētāja joslas krāsas vērtība + + + + Galvenes logotips + Noklusējums + Parasts + + ReVanced minimāls + Pielāgots + + + Apsaisīt attēlu reģiona ierobežojumus + Izmantojot attēlu mitināšanas pakalpojumu yt4.ggpht.com + "Izmantojot sākotnējo attēla mitināšanas pakalpojumu Šī iestatījuma ieslēgšana var novērst trūkstošus attēlus, kas dažu reģionu lietotājiem ir bloķēti" - - - - Sākums - - Abonementu cilne. - - Jūs - Atskaņotāja atskaņošanas saraksti & ieteikumi. - Meklēšanas rezultāti - Sākotnējie sīktēli - DeArrow & sākotnējie sīktēli - DeArrow & nekustīgi kadri - Nekustīgi kadri - "DeArrow piedāvā pūļa avotu miniatūras YouTube videoklipiem. Šīs miniatūras bieži vien ir atbilstošākas nekā tās, ko piedāvā YouTube + + + + Sākums + + Abonementu cilne. + + Jūs + Atskaņotāja atskaņošanas saraksti & ieteikumi. + Meklēšanas rezultāti + Sākotnējie sīktēli + DeArrow & sākotnējie sīktēli + DeArrow & nekustīgi kadri + Nekustīgi kadri + "DeArrow piedāvā pūļa avotu miniatūras YouTube videoklipiem. Šīs miniatūras bieži vien ir atbilstošākas nekā tās, ko piedāvā YouTube Ja šis iestatījums ir ieslēgts, video URL tiks nosūtīti API serverim, un netiek sūtīti citi dati. Ja videoklipam nav DeArrow miniatūras, tad tiek parādītas sākotnējās vai statiskās miniatūras Nospiediet šeit, lai uzzinātu vairāk par DeArrow" - Rādīt paziņojumu, ja API nav pieejama - Paziņojums tiek rādīts, ja DeArrow nav pieejams - Paziņojums netiek rādīts, ja DeArrow nav pieejams - DeArrow API galapunkts - DeArrow sīktēlu kešatmiņas galapunkta URL - Nekustīgi video kadri - Nekustīgi kadri tiek ņemti no katra video sākuma/vidus/beigām. Šie attēli ir iebūvēti YouTube, un netiek izmantota ārējā API - Izmantot ātrus nekustīgus kadrus - Izmantojot vidējas kvalitātes nekustīgus kadrus. Sīktēli tiks ielādēti ātrāk, bet tiešraides, neizdoti vai ļoti seni videoklipi var parādīt tukšus sīktēlus - Izmantojot augstas kvalitātes nekustīgus kadrus - Video laiks, no kura ņemt nekustīgus kadrus - Video sākums - Video vidus - Video beigas - - DeArrow īslaicīgi nav pieejams (statusa kods: %s) - DeArrow īslaicīgi nav pieejams - - - Rādīt ReVanced paziņojumus - Paziņojumi startējot ir redzami - Paziņojumi startējot nav redzami - Rādīt paziņojumus palaišanas laikā - Neizdevās izveidot savienojumu ar paziņojumu nodrošinātāju - Aizvērt - - - Iespējot video atkārtošanu - Video tiks atkārtots - Video netiks atkārtots - - - Rādīt video atkārtošanas pogu - Poga ir redzama - Poga nav redzama - Video atkārtošana ir ieslēgta - Video atkārtošana ir izslēgta - - - - - Viltot ierīces izmērus - "Ierīces izmēri ir viltoti + Rādīt paziņojumu, ja API nav pieejama + Paziņojums tiek rādīts, ja DeArrow nav pieejams + Paziņojums netiek rādīts, ja DeArrow nav pieejams + DeArrow API galapunkts + DeArrow sīktēlu kešatmiņas galapunkta URL + Nekustīgi video kadri + Nekustīgi kadri tiek ņemti no katra video sākuma/vidus/beigām. Šie attēli ir iebūvēti YouTube, un netiek izmantota ārējā API + Izmantot ātrus nekustīgus kadrus + Izmantojot vidējas kvalitātes nekustīgus kadrus. Sīktēli tiks ielādēti ātrāk, bet tiešraides, neizdoti vai ļoti seni videoklipi var parādīt tukšus sīktēlus + Izmantojot augstas kvalitātes nekustīgus kadrus + Video laiks, no kura ņemt nekustīgus kadrus + Video sākums + Video vidus + Video beigas + + DeArrow īslaicīgi nav pieejams (statusa kods: %s) + DeArrow īslaicīgi nav pieejams + + + Rādīt ReVanced paziņojumus + Paziņojumi startējot ir redzami + Paziņojumi startējot nav redzami + Rādīt paziņojumus palaišanas laikā + Neizdevās izveidot savienojumu ar paziņojumu nodrošinātāju + Aizvērt + + + Iespējot video atkārtošanu + Video tiks atkārtots + Video netiks atkārtots + + + Rādīt video atkārtošanas pogu + Poga ir redzama + Poga nav redzama + Video atkārtošana ir ieslēgta + Video atkārtošana ir izslēgta + + + + Viltot ierīces izmērus + "Ierīces izmēri ir viltoti Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atskaņošanas stostīšanās, īsāks akumulatora darbības laiks un nezināmas blakusparādības" - "Ierīces izmēri nav viltoti + "Ierīces izmēri nav viltoti Šī iestatījuma ieslēgšana var atbloķēt augstākas video kvalitātes" - Šīs iespējošana var izraisīt video atskaņošanas aizķeršanos, īsāku akumulatora darbības laiku un nezināmas blakusparādības. - - - Haptiskā atgriezeniskā saite - Mainīt haptisko atgriezenisko saiti - Atspējot nodaļu haptisko atgriezenisko saiti - Nodaļu haptiskā atgriezeniskā saite ir atspējota - Nodaļu haptiskā atgriezeniskā saite ir iespējota - Atspējot precīzas meklēšanas haptisko atgriezenisko saiti - Precīza meklēšanas haptiskā atgriezeniskā saite ir atspējota - Precīzas meklēšanas haptiskā atgriezeniskā saite ir iespējota - Atspējot meklēšanas atsaukšanas haptisko atgriezenisko saiti - Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir atspējota - Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir iespējota - Atspējot tālummaiņas haptisko atgriezenisko saiti - Tālummaiņas haptiskā atgriezeniskā saite ir atspējota - Tālummaiņas haptiskā atgriezeniskā saite ir iespējota - - - Ja nesen mainījāt sava konta pieteikšanās informāciju, atinstalējiet un atkārtoti instalējiet MicroG. - - - Aiziet garām URL pāradresācijai - URL pāradresācija tiek apiet - URL pāradresācija netiek apiet - - - Atvērt saites pārlūkprogrammā - Saišu atvēršana ārējā pārlūkprogrammā - Saišu atvēršana lietotnes pārlūkprogrammā - - - - Automātiski - Atcerēties video kvalitātes izmaiņas - Kvalitātes izmaiņas attiecas uz visiem videoklipiem - Kvalitātes izmaiņas attiecas tikai uz pašreizējo videoklipu - Rādīt paziņojumu par video kvalitātes izmaiņām - Tiek parādīts paziņojums, kad tiek mainīta noklusējuma video kvalitāte - Paziņojums netiek parādīts, kad tiek mainīta noklusējuma video kvalitāte - Noklusējuma video kvalitāte Wi-Fi tīklā - Noklusējuma video kvalitāte mobilajā tīklā - Atcerēties Shorts kvalitātes izmaiņas - Kvalitātes izmaiņas attiecas uz visiem Shorts - Kvalitātes izmaiņas attiecas tikai uz pašreizējo Short - Noklusējuma Shorts kvalitāte Wi-Fi tīklā - Noklusējuma Shorts kvalitāte mobilajā tīklā - mobilais - bezvadu tīkls - Izmainīta noklusējuma %1$s kvalitāte uz: %2$s - Mainīta Shorts %1$s kvalitāte uz: %2$s - - - Rādīt ātruma dialoga pogu - Ātruma dialoglodziņa poga ir redzama. Turiet nospiestu, lai atiestatītu atskaņošanas ātrumu uz noklusējumu - Ātruma dialoglodziņa poga nav redzama - - - Rādīt video kvalitātes pogu - Video kvalitātes poga ir redzama. Turiet nospiestu, lai atiestatītu kvalitāti uz noklusējumu - Video kvalitātes poga nav redzama - - - Pielāgotas atskaņošanas ātruma izvēlne - Pielāgotas ātruma izvēlne tiek rādīta - Pielāgotas ātruma izvēlne netiek rādīta - Atjaunot veco atskaņošanas ātruma izvēlni - Tiek rādīta vecā ātruma izvēlne - Tiek rādīta modernā ātruma izvēlne - Pielāgotie atskaņošanas ātrumi - Pievienojiet vai mainiet pielāgotos atskaņošanas ātrumus - Pielāgoti ātrumi ir jābūt mazākiem par %s - Nederīgi pielāgoti video atskaņošanas ātrumi - Automātiski - Pielāgots pieskaršanās un turēšanas ātrums - Atskaņošanas ātrums no 0 līdz 8 - - - Atcerēties atskaņošanas ātruma izmaiņas - Atskaņošanas ātruma izmaiņas attiecas uz visiem videoklipiem - Atskaņošanas ātruma izmaiņas attiecas tikai uz pašreizējo videoklipu - Rādīt paziņojumu par atskaņošanas ātruma izmaiņām - Tiek parādīts paziņojums, kad tiek mainīts noklusējuma atskaņošanas ātrums - Paziņojums netiek rādīts, kad noklusējuma atskaņošanas ātrums tiek mainīts - Noklusējuma atskaņošanas ātrums - Izmainīts noklusējuma ātrums uz: %s - - - Deaktivējiet HDR video - HDR video ir deaktivizēts - HDR video ir aktivizēts - Piespiest AVC (H.264) - Video kodeks ir piespiests uz AVC (H.264) - Video kodeks tiek noteikts automātiski - "Ieguvumi: + Šīs iespējošana var izraisīt video atskaņošanas aizķeršanos, īsāku akumulatora darbības laiku un nezināmas blakusparādības. + + + Haptiskā atgriezeniskā saite + Mainīt haptisko atgriezenisko saiti + Atspējot nodaļu haptisko atgriezenisko saiti + Nodaļu haptiskā atgriezeniskā saite ir atspējota + Nodaļu haptiskā atgriezeniskā saite ir iespējota + Atspējot precīzas meklēšanas haptisko atgriezenisko saiti + Precīza meklēšanas haptiskā atgriezeniskā saite ir atspējota + Precīzas meklēšanas haptiskā atgriezeniskā saite ir iespējota + Atspējot meklēšanas atsaukšanas haptisko atgriezenisko saiti + Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir atspējota + Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir iespējota + Atspējot tālummaiņas haptisko atgriezenisko saiti + Tālummaiņas haptiskā atgriezeniskā saite ir atspējota + Tālummaiņas haptiskā atgriezeniskā saite ir iespējota + + + Ja nesen mainījāt sava konta pieteikšanās informāciju, atinstalējiet un atkārtoti instalējiet MicroG. + + + Aiziet garām URL pāradresācijai + URL pāradresācija tiek apiet + URL pāradresācija netiek apiet + + + Atvērt saites pārlūkprogrammā + Saišu atvēršana ārējā pārlūkprogrammā + Saišu atvēršana lietotnes pārlūkprogrammā + + + + Automātiski + Atcerēties video kvalitātes izmaiņas + Kvalitātes izmaiņas attiecas uz visiem videoklipiem + Kvalitātes izmaiņas attiecas tikai uz pašreizējo videoklipu + Rādīt paziņojumu par video kvalitātes izmaiņām + Tiek parādīts paziņojums, kad tiek mainīta noklusējuma video kvalitāte + Paziņojums netiek parādīts, kad tiek mainīta noklusējuma video kvalitāte + Noklusējuma video kvalitāte Wi-Fi tīklā + Noklusējuma video kvalitāte mobilajā tīklā + Atcerēties Shorts kvalitātes izmaiņas + Kvalitātes izmaiņas attiecas uz visiem Shorts + Kvalitātes izmaiņas attiecas tikai uz pašreizējo Short + Noklusējuma Shorts kvalitāte Wi-Fi tīklā + Noklusējuma Shorts kvalitāte mobilajā tīklā + mobilais + bezvadu tīkls + Izmainīta noklusējuma %1$s kvalitāte uz: %2$s + Mainīta Shorts %1$s kvalitāte uz: %2$s + + + Rādīt ātruma dialoga pogu + Ātruma dialoglodziņa poga ir redzama. Turiet nospiestu, lai atiestatītu atskaņošanas ātrumu uz noklusējumu + Ātruma dialoglodziņa poga nav redzama + + + Rādīt video kvalitātes pogu + Video kvalitātes poga ir redzama. Turiet nospiestu, lai atiestatītu kvalitāti uz noklusējumu + Video kvalitātes poga nav redzama + + + Pielāgotas atskaņošanas ātruma izvēlne + Pielāgotas ātruma izvēlne tiek rādīta + Pielāgotas ātruma izvēlne netiek rādīta + Atjaunot veco atskaņošanas ātruma izvēlni + Tiek rādīta vecā ātruma izvēlne + Tiek rādīta modernā ātruma izvēlne + Pielāgotie atskaņošanas ātrumi + Pievienojiet vai mainiet pielāgotos atskaņošanas ātrumus + Pielāgoti ātrumi ir jābūt mazākiem par %s + Nederīgi pielāgoti video atskaņošanas ātrumi + Automātiski + Pielāgots pieskaršanās un turēšanas ātrums + Atskaņošanas ātrums no 0 līdz 8 + + + Atcerēties atskaņošanas ātruma izmaiņas + Atskaņošanas ātruma izmaiņas attiecas uz visiem videoklipiem + Atskaņošanas ātruma izmaiņas attiecas tikai uz pašreizējo videoklipu + Rādīt paziņojumu par atskaņošanas ātruma izmaiņām + Tiek parādīts paziņojums, kad tiek mainīts noklusējuma atskaņošanas ātrums + Paziņojums netiek rādīts, kad noklusējuma atskaņošanas ātrums tiek mainīts + Noklusējuma atskaņošanas ātrums + Izmainīts noklusējuma ātrums uz: %s + + + Deaktivējiet HDR video + HDR video ir deaktivizēts + HDR video ir aktivizēts + Piespiest AVC (H.264) + Video kodeks ir piespiests uz AVC (H.264) + Video kodeks tiek noteikts automātiski + "Ieguvumi: • Var uzlabot akumulatora darbības laiku • Var atjaunot trūkstošās video izšķirtspējas vecākās ierīcēs @@ -1644,179 +1641,178 @@ Ierobežojumi: • Video atskaņošana patērēs vairāk interneta datu nekā VP9 vai AV1 • HDR video neizmantos AVC • Dažas ierīces nevar piespiest AVC" - - - Rādīt izvērsto video kvalitātes izvēlni - Tiek rādīta izvērstā video kvalitātes izvēlne - Izvērstā video kvalitātes izvēlne netiek rādīta - - - Iespējot slīdēšanu, lai meklētu - Slīdēšana, lai meklētu, ir iespējota - Slīdēšana, lai meklētu, nav iespējota - - - Atļaut Android VR AV1 - "Video kodeks ir AVC (H.264), VP9 vai AV1 + + + Rādīt izvērsto video kvalitātes izvēlni + Tiek rādīta izvērstā video kvalitātes izvēlne + Izvērstā video kvalitātes izvēlne netiek rādīta + + + Iespējot slīdēšanu, lai meklētu + Slīdēšana, lai meklētu, ir iespējota + Slīdēšana, lai meklētu, nav iespējota + + + Atļaut Android VR AV1 + "Video kodeks ir AVC (H.264), VP9 vai AV1 Atskaņošana var raustīties vai izlaist kadrus" - Video kodeks ir AVC (H.264) vai VP9 - "Šī iestatījuma iespējošana var izmantot programmatūras AV1 dekodēšanu. + Video kodeks ir AVC (H.264) vai VP9 + "Šī iestatījuma iespējošana var izmantot programmatūras AV1 dekodēšanu. AV1 video atskaņošana var raustīties vai izlaist kadrus." - Viltotu straumju blakusparādības - • Eksperimentāls klients un jebkurā brīdī var pārtraukt darbu - • Video var apstāties pulksten 1:00 vai nebūt pieejams dažos reģionos - • Trūkst audio celiņa izvēlnes - • Nav pieejams AV1 video kodeks - • Nav pieejams stabils skaļums - • Bērnu videoklipi var netikt atskaņoti, kad esat izrakstījies vai inkognito režīmā. - - • Piespiest oriģinālo skaņu nav pieejams - Rādīt statistiskos datos entuziastiem - Klienta tips tiek rādīts statistiskos datos entuziastiem - Klients ir paslēpts statistiskos datos entuziastiem - - - - - - - Par - Reklāmas - Vispārīgi - Atskaņotājs - Dažādi - - - Slēpt videoreklāmas - Videoreklāmas ir paslēptas - Videoreklāmas ir redzamas - - - Iespējot pastāvīgu atkārtošanu - Pastāvīgā atkārtošana ir iespējota - Pastāvīgā atkārtošana ir atspējota - - - Slēpt apraides pogu - Apraides poga ir paslēpta - Apraides poga ir redzama - Slēpt vēstures pogu - Vēstures poga ir slēpta - Vēstures poga ir redzama - Slēpt paziņojumu pogu - Paziņojumu poga ir paslēpta - Paziņojumu poga ir redzama - Slēpt meklēšanas pogu - Meklēšanas poga ir paslēpta - Meklēšanas poga ir redzama - - - Slēpt kategoriju joslu - Kategoriju josla ir paslēpta - Kategoriju josla ir redzama - - - Mainīt mini atskaņotāja krāsu - Mini atskaņotāja krāsa atbilst pilnekrāna atskaņotāja krāsai - Mini atskaņotājs izmanto noklusējuma krāsu - - - Navigācijas josla - Slēpt vai mainīt navigācijas joslas pogas - - Paslēpt Sākumlapu - Poga Sākums ir paslēpta - Poga Sākums ir redzama - - Paslēpt Īsos klipus - Poga Paraugi ir paslēpta - Poga Paraugi ir redzama - - Slēpt Izpētīt - Poga Izpētīt ir paslēpta - Poga Izpētīt ir redzama - - Slēpt bibliotēku - Poga Bibliotēka ir paslēpta - Poga Bibliotēka ir redzama - - Slēpt jaunināšanu - Poga Jaunināt ir paslēpta - Poga Jaunināt ir redzama - Slēpt navigācijas joslu - Navigācijas josla ir paslēpta - Navigācijas josla ir redzama - Slēpt navigācijas pogu etiķetes - Etiķetes ir paslēptas - Etiķetes ir redzamas - - - Slēpt uzrakstu \"Iegūt Music Premium\" - Uzraksts ir paslēpts - Uzraksts ir redzams - - - Slēpt jaunināšanas pogu - Poga ir paslēpta - Poga ir redzama - - - - - Bloķēt audio reklāmas - Audio reklāmas ir bloķētas - Audio reklāmas ir atbloķētas - - - %s nav pieejams, var parādīties reklāmas. Mēģiniet mainīt reklāmu bloķēšanas pakalpojumu iestatījumos. - %s radās kļūda, var parādīties reklāmas. Mēģiniet mainīt reklāmu bloķēšanas pakalpojumu iestatījumos. - Bloķēt iebūvētās video reklāmas - Atspējots - Luminous starpniekserveris - PurpleAdBlock starpniekserveris - - - Bloķēt video reklāmas - Video reklāmas ir bloķētas - Video reklāmas ir atbloķētas - - - Ziņojums dzēsts. - Rādīt izdzēstās ziņas - Nerādīt izdzēstās ziņas - Slēpt izdzēstās ziņas aiz spoileriem - Rādīt izdzēstās ziņas kā pārvilktas - - - Automātiski pieprasīt kanāla punktus - Kanāla punkti tiek pieprasīti automātiski - Kanāla punkti netiek pieprasīti automātiski - - - - Iespējot Twitch debug režīmu - Twitch debug režīms ir iespējots (nav ieteicams) - Twitch debug režīms ir atspējots - - - ReVanced iestatījumi - Par - Par ReVanced - Reklāmu bloķēšana. - Reklāmu bloķēšanas iestatījumi. - Čats - Čata iestatījumi - Dažādi. - Dažādi iestatījumi - Vispārējie iestatījumi - Citi iestatījumi - Klienta puses reklāmas - Servera puses \"surestream\" reklāmas - Debug žurnāls - Debug žurnāli ir iespējoti - Debug žurnāli ir atspējoti - - + Viltotu straumju blakusparādības + • Eksperimentāls klients un jebkurā brīdī var pārtraukt darbu + • Video var apstāties pulksten 1:00 vai nebūt pieejams dažos reģionos + • Trūkst audio celiņa izvēlnes + • Nav pieejams AV1 video kodeks + • Nav pieejams stabils skaļums + • Bērnu videoklipi var netikt atskaņoti, kad esat izrakstījies vai inkognito režīmā. + + • Piespiest oriģinālo skaņu nav pieejams + Rādīt statistiskos datos entuziastiem + Klienta tips tiek rādīts statistiskos datos entuziastiem + Klients ir paslēpts statistiskos datos entuziastiem + + + + + + Par + Reklāmas + Vispārīgi + Atskaņotājs + Dažādi + + + Slēpt videoreklāmas + Videoreklāmas ir paslēptas + Videoreklāmas ir redzamas + + + Iespējot pastāvīgu atkārtošanu + Pastāvīgā atkārtošana ir iespējota + Pastāvīgā atkārtošana ir atspējota + + + Slēpt apraides pogu + Apraides poga ir paslēpta + Apraides poga ir redzama + Slēpt vēstures pogu + Vēstures poga ir slēpta + Vēstures poga ir redzama + Slēpt paziņojumu pogu + Paziņojumu poga ir paslēpta + Paziņojumu poga ir redzama + Slēpt meklēšanas pogu + Meklēšanas poga ir paslēpta + Meklēšanas poga ir redzama + + + Slēpt kategoriju joslu + Kategoriju josla ir paslēpta + Kategoriju josla ir redzama + + + Mainīt mini atskaņotāja krāsu + Mini atskaņotāja krāsa atbilst pilnekrāna atskaņotāja krāsai + Mini atskaņotājs izmanto noklusējuma krāsu + + + Navigācijas josla + Slēpt vai mainīt navigācijas joslas pogas + + Paslēpt Sākumlapu + Poga Sākums ir paslēpta + Poga Sākums ir redzama + + Paslēpt Īsos klipus + Poga Paraugi ir paslēpta + Poga Paraugi ir redzama + + Slēpt Izpētīt + Poga Izpētīt ir paslēpta + Poga Izpētīt ir redzama + + Slēpt bibliotēku + Poga Bibliotēka ir paslēpta + Poga Bibliotēka ir redzama + + Slēpt jaunināšanu + Poga Jaunināt ir paslēpta + Poga Jaunināt ir redzama + Slēpt navigācijas joslu + Navigācijas josla ir paslēpta + Navigācijas josla ir redzama + Slēpt navigācijas pogu etiķetes + Etiķetes ir paslēptas + Etiķetes ir redzamas + + + Slēpt uzrakstu \"Iegūt Music Premium\" + Uzraksts ir paslēpts + Uzraksts ir redzams + + + Slēpt jaunināšanas pogu + Poga ir paslēpta + Poga ir redzama + + + + + Bloķēt audio reklāmas + Audio reklāmas ir bloķētas + Audio reklāmas ir atbloķētas + + + %s nav pieejams, var parādīties reklāmas. Mēģiniet mainīt reklāmu bloķēšanas pakalpojumu iestatījumos. + %s radās kļūda, var parādīties reklāmas. Mēģiniet mainīt reklāmu bloķēšanas pakalpojumu iestatījumos. + Bloķēt iebūvētās video reklāmas + Atspējots + Luminous starpniekserveris + PurpleAdBlock starpniekserveris + + + Bloķēt video reklāmas + Video reklāmas ir bloķētas + Video reklāmas ir atbloķētas + + + Ziņojums dzēsts. + Rādīt izdzēstās ziņas + Nerādīt izdzēstās ziņas + Slēpt izdzēstās ziņas aiz spoileriem + Rādīt izdzēstās ziņas kā pārvilktas + + + Automātiski pieprasīt kanāla punktus + Kanāla punkti tiek pieprasīti automātiski + Kanāla punkti netiek pieprasīti automātiski + + + + Iespējot Twitch debug režīmu + Twitch debug režīms ir iespējots (nav ieteicams) + Twitch debug režīms ir atspējots + + + ReVanced iestatījumi + Par + Par ReVanced + Reklāmu bloķēšana. + Reklāmu bloķēšanas iestatījumi. + Čats + Čata iestatījumi + Dažādi. + Dažādi iestatījumi + Vispārējie iestatījumi + Citi iestatījumi + Klienta puses reklāmas + Servera puses \"surestream\" reklāmas + Debug žurnāls + Debug žurnāli ir iespējoti + Debug žurnāli ir atspējoti + + diff --git a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml +++ b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml +++ b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml index 5c1e1d51e0..ead3215d88 100644 --- a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml +++ b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml @@ -17,294 +17,223 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Melepaskan - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Melepaskan + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-my-rMM/strings.xml b/patches/src/main/resources/addresources/values-my-rMM/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-my-rMM/strings.xml +++ b/patches/src/main/resources/addresources/values-my-rMM/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml +++ b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml index eb20da6f2a..2f512c82ba 100644 --- a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml @@ -17,295 +17,224 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - ReVanced Manager द्वारा स्थापित छैन - APK निर्माण मिति खराब भएको छ - - - - - - + + + + + + + + ReVanced Manager द्वारा स्थापित छैन + APK निर्माण मिति खराब भएको छ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index c0d10a83b2..4d6b97e6e2 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -17,1258 +17,1257 @@ "First 'item' text Second \"item\" text" ---> - - - - Appnaam - - Aangepast - App-pictogram - Origineel - - ReVanced minimaal - ReVanced geschaald - - Aangepast - - - Controle mislukt - Open officiële website - Negeren - <h5>Deze app lijkt niet door u te zijn gepatcht.</h5><br>Deze app werkt mogelijk niet goed, is **mogelijk schadelijk of zelfs gevaarlijk om te gebruiken**.<br><br>Deze checks geven aan dat deze app is gepatcht of van iemand anders is verkregen:<br><br><small>%1$s</small><br>Het is sterk aan te raden om **deze app te verwijderen en zelf te patchen** om er zeker van te zijn dat u een gevalideerde en veilige app gebruikt.<p><br>Indien genegeerd, zal deze waarschuwing nog slechts twee keer worden getoond. - Op een ander apparaat gepatcht - Niet geïnstalleerd door ReVanced Manager - Meer dan 10 minuten geleden gepatcht - Gepatcht %s dagen geleden - APK-bouwdatum is beschadigd - - - ReVanced Melding - Uw kijkgeschiedenis wordt niet opgeslagen.<br><br>Dit wordt hoogstwaarschijnlijk veroorzaakt door een DNS-adblocker of netwerkproxy.<br><br>Om dit te verhelpen, voegt u <b>s.youtube.com</b> toe aan de witte lijst of schakelt u alle DNS-blokkers en proxies uit. - Niet meer weergeven - - - Instellingen - Weet je zeker dat je door wilt gaan? - Opslaan - Terugzetten - Kleur opnieuw instellen - Ongeldige kleur - Opnieuw opstarten vereist - Start de app opnieuw op om deze wijziging door te voeren. - Opnieuw starten - Importeren - Kopiëren - ReVanced-instellingen zijn teruggezet naar de standaardinstellingen - %d instellingen geïmporteerd - Importeren mislukt: %s - Zoekinstellingen - Geen resultaten gevonden voor \", %s\" - Probeer een ander trefwoord - Recente zoekopdrachten - Verwijderen uit zoekgeschiedenis? - Zoekgeschiedenis wissen - Weet u zeker dat u alle zoekgeschiedenis wilt wissen? - Zoektips - "• Tik op een pad om ernaartoe te navigeren +--> + + + Appnaam + + Aangepast + App-pictogram + Origineel + + ReVanced minimaal + ReVanced geschaald + + Aangepast + + + Controle mislukt + Open officiële website + Negeren + <h5>Deze app lijkt niet door u te zijn gepatcht.</h5><br>Deze app werkt mogelijk niet goed, is **mogelijk schadelijk of zelfs gevaarlijk om te gebruiken**.<br><br>Deze checks geven aan dat deze app is gepatcht of van iemand anders is verkregen:<br><br><small>%1$s</small><br>Het is sterk aan te raden om **deze app te verwijderen en zelf te patchen** om er zeker van te zijn dat u een gevalideerde en veilige app gebruikt.<p><br>Indien genegeerd, zal deze waarschuwing nog slechts twee keer worden getoond. + Op een ander apparaat gepatcht + Niet geïnstalleerd door ReVanced Manager + Meer dan 10 minuten geleden gepatcht + Gepatcht %s dagen geleden + APK-bouwdatum is beschadigd + + + ReVanced Melding + Uw kijkgeschiedenis wordt niet opgeslagen.<br><br>Dit wordt hoogstwaarschijnlijk veroorzaakt door een DNS-adblocker of netwerkproxy.<br><br>Om dit te verhelpen, voegt u <b>s.youtube.com</b> toe aan de witte lijst of schakelt u alle DNS-blokkers en proxies uit. + Niet meer weergeven + + + Instellingen + Weet je zeker dat je door wilt gaan? + Opslaan + Terugzetten + Kleur opnieuw instellen + Ongeldige kleur + Opnieuw opstarten vereist + Start de app opnieuw op om deze wijziging door te voeren. + Opnieuw starten + Importeren + Kopiëren + ReVanced-instellingen zijn teruggezet naar de standaardinstellingen + %d instellingen geïmporteerd + Importeren mislukt: %s + Zoekinstellingen + Geen resultaten gevonden voor \", %s\" + Probeer een ander trefwoord + Recente zoekopdrachten + Verwijderen uit zoekgeschiedenis? + Zoekgeschiedenis wissen + Weet u zeker dat u alle zoekgeschiedenis wilt wissen? + Zoektips + "• Tik op een pad om ernaartoe te navigeren • Lang indrukken op een instelling om ernaartoe te navigeren • Druk op Enter om een zoekopdracht op te slaan in de geschiedenis • Zoeken negeert hoofdletters en leestekens • Bovenliggende instellingen verschijnen boven uitgeschakelde onderliggende instellingen" - Zoekgeschiedenis is leeg - Om zoekgeschiedenis op te slaan, typ een zoekopdracht en druk op Enter - Zoekgeschiedenis instellingen weergeven - Zoekgeschiedenis instellingen wordt weergegeven - De zoekgeschiedenis van de instellingen wordt niet weergegeven - Pictogrammen voor ReVanced-instellingen weergeven - Instellingspictogrammen worden weergegeven - Pictogrammen voor instellingen worden niet weergegeven - ReVanced-taal - "Vertalingen voor sommige talen kunnen ontbreken of onvolledig zijn. + Zoekgeschiedenis is leeg + Om zoekgeschiedenis op te slaan, typ een zoekopdracht en druk op Enter + Zoekgeschiedenis instellingen weergeven + Zoekgeschiedenis instellingen wordt weergegeven + De zoekgeschiedenis van de instellingen wordt niet weergegeven + Pictogrammen voor ReVanced-instellingen weergeven + Instellingspictogrammen worden weergegeven + Pictogrammen voor instellingen worden niet weergegeven + ReVanced-taal + "Vertalingen voor sommige talen kunnen ontbreken of onvolledig zijn. Om nieuwe talen te vertalen of bestaande vertalingen te verbeteren, bezoek translate.revanced.app" - App-taal - Importeren / Exporteren - ReVanced-instellingen importeren / exporteren - - U gebruikt ReVanced Patches versie <i>%s</i> - Opmerking - Deze versie is een pre-release en u kunt onverwachte problemen ondervinden - Officiële links - + U gebruikt ReVanced Patches versie <i>%s</i> + Opmerking + Deze versie is een pre-release en u kunt onverwachte problemen ondervinden + Officiële links + - - - GmsCore-instellingen - Instellingen voor GmsCore - - MicroG GmsCore is niet geïnstalleerd. Installeer het. - Actie vereist - "MicroG GmsCore heeft geen toestemming om op de achtergrond te draaien. + + + GmsCore-instellingen + Instellingen voor GmsCore + + MicroG GmsCore is niet geïnstalleerd. Installeer het. + Actie vereist + "MicroG GmsCore heeft geen toestemming om op de achtergrond te draaien. Volg de \"Don't kill my app\"-handleiding voor uw telefoon en pas de instructies toe op uw MicroG-installatie. Dit is vereist om de app te laten werken." - Website openen - "Batterijoptimalisaties voor MicroG GmsCore moeten worden uitgeschakeld om problemen te voorkomen. + Website openen + "Batterijoptimalisaties voor MicroG GmsCore moeten worden uitgeschakeld om problemen te voorkomen. Door batterijoptimalisaties voor MicroG uit te schakelen, wordt het batterijgebruik niet negatief beïnvloed. Tik op de knop Doorgaan en sta wijzigingen in de optimalisatie toe." - Doorgaan - - - Videostreams spoofen - Spoof de client-videostreams om afspeelproblemen te voorkomen - Videostreams vervalsen - "Videostreams worden gespooft + Doorgaan + + + Videostreams spoofen + Spoof de client-videostreams om afspeelproblemen te voorkomen + Videostreams vervalsen + "Videostreams worden gespooft Als je een YouTube Premium-gebruiker bent, is deze instelling mogelijk niet vereist" - "Videostreams worden niet gespoofed + "Videostreams worden niet gespoofed Afspeelproblemen kunnen optreden" - Het uitschakelen van deze instelling kan afspeelproblemen veroorzaken. - Standaard client - - - Forceer de originele audiotaal - De oorspronkelijke audiotaal gebruiken - Standaard audio gebruiken - - Om deze functie te gebruiken, wijzig \'Videostreams spoofen\' naar elke client behalve Android Studio - - - Debuggen - Schakel debugopties in of uit - Debuglogboek - Debuglogboeken zijn ingeschakeld - Debuglogboeken zijn uitgeschakeld - Stacktraces loggen - Debuglogboeken bevatten stacktrace - Debuglogs bevatten geen stacktrace - Toon toastmelding bij ReVanced error - Toastmelding wordt weergegeven als er een fout optreedt - Toastmelding wordt niet weergegeven als er een fout optreedt - "Het uitschakelen van foutmeldingen verbergt alle ReVanced-foutmeldingen. + Het uitschakelen van deze instelling kan afspeelproblemen veroorzaken. + Standaard client + + + Forceer de originele audiotaal + De oorspronkelijke audiotaal gebruiken + Standaard audio gebruiken + + Om deze functie te gebruiken, wijzig \'Videostreams spoofen\' naar elke client behalve Android Studio + + + Debuggen + Schakel debugopties in of uit + Debuglogboek + Debuglogboeken zijn ingeschakeld + Debuglogboeken zijn uitgeschakeld + Stacktraces loggen + Debuglogboeken bevatten stacktrace + Debuglogs bevatten geen stacktrace + Toon toastmelding bij ReVanced error + Toastmelding wordt weergegeven als er een fout optreedt + Toastmelding wordt niet weergegeven als er een fout optreedt + "Het uitschakelen van foutmeldingen verbergt alle ReVanced-foutmeldingen. U wordt niet op de hoogte gesteld van onverwachte gebeurtenissen." - Foutopsporingslogboeken exporteren - Kopieert ReVanced-foutopsporingslogboeken naar het klembord - Foutopsporing is uitgeschakeld - Geen logboeken gevonden - Logboeken gekopieerd - Mislukt om logboeken te exporteren: %s - Foutopsporingslogboeken wissen - Wist alle opgeslagen ReVanced-foutopsporingslogboeken - Logboeken gewist - Functievlaggen Manager - Beheer booleaanse functievlaggen - Actieve vlaggen (%d) - Geblokkeerde vlaggen (%d) - Vlaggen zoeken... - Vlaggen opgeslagen - Vlaggen gereset - Vlaggen gekopieerd naar klembord - Stamlogboek - Debuglogboeken bevatten stamlogboek - Debuglogboeken bevatten geen stamlogboek - "Als u deze instelling inschakelt, worden extra lay-outgegevens geregistreerd, waaronder tekst op het scherm voor sommige UI-componenten. + Foutopsporingslogboeken exporteren + Kopieert ReVanced-foutopsporingslogboeken naar het klembord + Foutopsporing is uitgeschakeld + Geen logboeken gevonden + Logboeken gekopieerd + Mislukt om logboeken te exporteren: %s + Foutopsporingslogboeken wissen + Wist alle opgeslagen ReVanced-foutopsporingslogboeken + Logboeken gewist + Functievlaggen Manager + Beheer booleaanse functievlaggen + Actieve vlaggen (%d) + Geblokkeerde vlaggen (%d) + Vlaggen zoeken... + Vlaggen opgeslagen + Vlaggen gereset + Vlaggen gekopieerd naar klembord + Stamlogboek + Debuglogboeken bevatten stamlogboek + Debuglogboeken bevatten geen stamlogboek + "Als u deze instelling inschakelt, worden extra lay-outgegevens geregistreerd, waaronder tekst op het scherm voor sommige UI-componenten. Dit kan helpen bij het identificeren van componenten bij het maken van aangepaste filters. Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP-adres, vastgelegd." - - - Deelbare links opschonen - Tracking queryparameter wordt verwijderd uit gedeelde links - Tracking queryparameter wordt niet verwijderd uit gedeelde links - Deelkoppelingen wijzigen naar youtube.com - Gedeelde koppelingen gebruiken youtube.com - Gedeelde koppelingen gebruiken music.youtube.com - - - Aangepaste filter - Componenten verbergen met aangepaste filters - Aangepaste filter inschakelen - Aangepast filter is ingeschakeld - Aangepast filter is uitgeschakeld - Aangepast filter - - Lijst met component pad builder strings om te filteren gescheiden door een nieuwe regel - Ongeldig aangepast filter: %s - - - - - Info - Advertenties - Alternatieve miniaturen - Algemeen - Speler - Zoekbalk - Veegbediening - Diversen - Oude instellingenmenu\'s herstellen - Oude instellingenmenu\'s worden getoond - Oude instellingenmenu\'s worden niet getoond - - - Shorts-achtergrondafspelen uitschakelen - Shorts-achtergrondafspelen is uitgeschakeld - Shorts-achtergrondafspelen is ingeschakeld - - - Verberg albumkaarten - Albumkaarten zijn verborgen - Albumkaarten worden getoond - Verberg artistkaarten - De artistkaarten zijn verborgen - De artistkaarten worden weergegeven - Chipsrek verbergen - Chipsrek is verborgen - Chip Schap Zichtbaar - Community berichten verbergen - Community berichten zijn verborgen - Community berichten worden weergegeven - Verberg compacte banners - Compacte banners zijn verborgen - Compacte banners worden weergegeven - Uitklapbare kaart verbergen - Uitklapbare kaart onder video\'s is verborgen - Uitklapbare kaart onder video\'s is getoond - Verberg zwevende microfoonknop - Zwevende microfoonknop in zoeken is verborgen - Zwevende microfoonknop in zoeken wordt getoond - Horizontale planken verbergen - "Horizontale planken zijn verborgen, zoals: + + + Deelbare links opschonen + Tracking queryparameter wordt verwijderd uit gedeelde links + Tracking queryparameter wordt niet verwijderd uit gedeelde links + Deelkoppelingen wijzigen naar youtube.com + Gedeelde koppelingen gebruiken youtube.com + Gedeelde koppelingen gebruiken music.youtube.com + + + Aangepaste filter + Componenten verbergen met aangepaste filters + Aangepaste filter inschakelen + Aangepast filter is ingeschakeld + Aangepast filter is uitgeschakeld + Aangepast filter + + Lijst met component pad builder strings om te filteren gescheiden door een nieuwe regel + Ongeldig aangepast filter: %s + + + + + Info + Advertenties + Alternatieve miniaturen + Algemeen + Speler + Zoekbalk + Veegbediening + Diversen + Oude instellingenmenu\'s herstellen + Oude instellingenmenu\'s worden getoond + Oude instellingenmenu\'s worden niet getoond + + + Shorts-achtergrondafspelen uitschakelen + Shorts-achtergrondafspelen is uitgeschakeld + Shorts-achtergrondafspelen is ingeschakeld + + + Verberg albumkaarten + Albumkaarten zijn verborgen + Albumkaarten worden getoond + Verberg artistkaarten + De artistkaarten zijn verborgen + De artistkaarten worden weergegeven + Chipsrek verbergen + Chipsrek is verborgen + Chip Schap Zichtbaar + Community berichten verbergen + Community berichten zijn verborgen + Community berichten worden weergegeven + Verberg compacte banners + Compacte banners zijn verborgen + Compacte banners worden weergegeven + Uitklapbare kaart verbergen + Uitklapbare kaart onder video\'s is verborgen + Uitklapbare kaart onder video\'s is getoond + Verberg zwevende microfoonknop + Zwevende microfoonknop in zoeken is verborgen + Zwevende microfoonknop in zoeken wordt getoond + Horizontale planken verbergen + "Horizontale planken zijn verborgen, zoals: • Breaking news • Verder kijken • Meer kanalen ontdekken • Meest relevant • Winkelen • Opnieuw bekijken" - Horizontale planken worden getoond - Afbeeldingenplank verbergen - Afbeeldingenplank in zoekresultaten is verborgen - Afbeeldingenplank in zoekresultaten is getoond - Nieuwste berichten verbergen - Nieuwste berichten zijn verborgen - Nieuwste berichten worden weergegeven - Mix-afspeellijsten verbergen - De mix-afspeellijsten zijn verborgen - De mix-afspeellijsten worden weergegeven - Verberg films sectie - Films sectie is verborgen - De sectie Films wordt weergegeven - - \'Herinnering sturen\' knop verbergen - Meld mij-knop is verborgen - Meld mij-knop wordt getoond - Speelbare items verbergen - Speelbare items zijn verborgen - Spellen worden getoond - - Verberg knop \'Meer weergeven\' - Meer weergeven-knop in zoekresultaten is verborgen - Meer weergeven-knop in zoekresultaten wordt getoond - Enquêtes verbergen - Enquêtes zijn verborgen - Enquêtes worden getoond - Ticketsectie verbergen - Ticketsectie is verborgen - Ticketsectie is getoond - - Videobevellabels verbergen - Labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' in zoekresultaten zijn verborgen - Labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' in zoekresultaten worden getoond - Visuele afstandhouder verbergen - Visuele afstandhouder is verborgen - Visuele afstandhouder is weergegeven - - YouTube Doodles verbergen - YouTube Doodles-animatie op het logo is verborgen - YouTube Doodles-animatie op het logo wordt getoond - "YouTube Doodles worden een paar dagen per jaar getoond. + Verberg knop \'Meer weergeven\' + Meer weergeven-knop in zoekresultaten is verborgen + Meer weergeven-knop in zoekresultaten wordt getoond + Enquêtes verbergen + Enquêtes zijn verborgen + Enquêtes worden getoond + Ticketsectie verbergen + Ticketsectie is verborgen + Ticketsectie is getoond + + Videobevellabels verbergen + Labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' in zoekresultaten zijn verborgen + Labels \'Mensen keken ook\' en \'Misschien vind je dit ook leuk\' in zoekresultaten worden getoond + Visuele afstandhouder verbergen + Visuele afstandhouder is verborgen + Visuele afstandhouder is weergegeven + + YouTube Doodles verbergen + YouTube Doodles-animatie op het logo is verborgen + YouTube Doodles-animatie op het logo wordt getoond + "YouTube Doodles worden een paar dagen per jaar getoond. Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor verbergen is ingeschakeld, dan wordt de filterbalk onder de zoekbalk ook verborgen." - Kanaalbalk verbergen - Kanaalbalk is verborgen - Kanaalbalk wordt getoond - Verberg kanaal watermerk - Watermerk is verborgen - Watermerk wordt getoond - Crowdfunding box verbergen - Crowdfundingbox is verborgen - Crowdfundingbox wordt getoond - Nooddozen verbergen - Nooddozen zijn verborgen - Nooddozen worden getoond - Informatiepanelen verbergen - Informatiepanelen zijn verborgen - Informatiepanelen worden getoond - - Verberg knop \"Lid worden\" - Lid worden-knop is verborgen - Lid worden-knop wordt getoond - Medische panelen verbergen - Medische panelen zijn verborgen - Medische panelen worden getoond - Snelle acties verbergen - Snelle acties in volledig scherm zijn verborgen - Snelle acties in volledig scherm zijn getoond - Gerelateerde video\'s verbergen - Gerelateerde video\'s in snelle acties zijn verborgen - Gerelateerde video\'s in snelle acties zijn getoond - Richtlijnen voor abonnees verbergen - Abonnementsrichtlijnen voor de community zijn verborgen - Abonnementsrichtlijnen voor de community worden getoond - Verberg getimede reacties - Gectimed reacties worden verborgen - Gectimed reacties worden getoond - \'AI-gegenereerde videosamenvatting\' verbergen - AI-gegenereerde videosamenvattingssectie is verborgen - Sectie met door AI gegenereerde videosamenvatting wordt getoond - Vraag verbergen - Vraaggedeelte is verborgen - Vraaggedeelte wordt weergegeven - Kenmerken verbergen - Specifieke plaatsen, Games, Muziek en Mensen genoemd secties zijn verborgen - Specifieke plaatsen, Games, Muziek en Mensen genoemd secties worden weergegeven - Hoofdstukken verbergen - Hoofdstukken sectie is verborgen - Hoofdstukken sectie wordt getoond - \'Zo is deze content gemaakt\' verbergen - Het gedeelte \"Zo is deze content gemaakt\" is verborgen - Het gedeelte \"Zo is deze content gemaakt\" is zichtbaar - Verberg Hype-punten - Hype-punten zijn verborgen - Hype-punten worden getoond - \'Ontdek de podcast\' verbergen - Het gedeelte \'Ontdek de podcast\' is verborgen - Het gedeelte \'Ontdek de podcast\' wordt weergegeven - Aanbevolen links verbergen - Sectie met aanbevolen links is verborgen - Sectie met aanbevolen links is zichtbaar - Verberg aanbevolen video\'s - Sectie met aanbevolen video\'s is verborgen - Sectie met aanbevolen video\'s is zichtbaar - Infokaarten verbergen - Sectie info-kaarten is verborgen - Sectie info-kaarten is zichtbaar - \'Belangrijkste begrippen\' verbergen - Het gedeelte \'Belangrijkste begrippen\' is verborgen - Het gedeelte \'Belangrijkste begrippen\' is zichtbaar - Verberg abonneerknop - Abonneerknop is verborgen - Abonneerknop is zichtbaar - Transcript verbergen - Transcriptgedeelte is verborgen - Transcriptgedeelte is zichtbaar - Videobeschrijving - Skjul eller vis komponentene i videoens beskrivelse - Filterbaren - Filterbalk verbergen of tonen in feeds, gerelateerde video\'s, zoekresultaten en kijkgeschiedenis - Verbergen in feeds - Verborgen in feeds - Weergegeven in feeds - Verbergen in gerelateerde video\'s - Verborgen in gerelateerde video\'s - Weergegeven in gerelateerde video\'s - Verbergen in zoekresultaten - Verborgen in zoekresultaten - Weergegeven in zoekresultaten - Verbergen in kijkgeschiedenis - Verborgen in kijkgeschiedenis - Getoond in kijkgeschiedenis - Kanaalpagina - Kanaalpagina-componenten verbergen of tonen - - Community-knop verbergen - Communityknop is verborgen - Communityknop wordt weergegeven - - Verberg \"Voor jou\"-schap - Voor jou-plank is verborgen - Voor jou-plank is getoond - - Knop \'Lid worden\' verbergen - Knop \'Lid worden\' is verborgen - Knop \'Lid worden\' wordt weergegeven - Linksvoorbeeld verbergen - Linksvoorbeeld is verborgen - Linksvoorbeeld is getoond - Ledenplank verbergen - Ledenplank is verborgen - Ledenplank wordt weergegeven - - Knop \'Winkel\' verbergen - Knop \'Winkel\' is verborgen - Knop \'Winkel\' wordt weergegeven - - Knop \'Abonneren\' verbergen - Knop \'Abonneren\' is verborgen - Knop \'Abonneren\' wordt weergegeven - Reacties - Reacties verbergen of tonen - AI-chatsamenvatting verbergen - AI-chatsamenvatting is verborgen - AI-chatsamenvatting is getoond - AI-opmerkingensamenvatting verbergen - AI-opmerkingensamenvatting is verborgen - AI-opmerkingensamenvatting is getoond - Kanaalrichtlijnen verbergen - Kanaalrichtlijnen zijn verborgen - Kanaalrichtlijnen worden weergegeven - Verberg kop \'Comments by members\' - Koptekst \'Reacties van leden\' is verborgen - Koptekst \'Reacties van leden\' wordt weergegeven - Reacties sectie verbergen - Reacties sectie is verborgen - Reacties sectie is getoond - Communityrichtlijnen verbergen - Communityrichtlijnen zijn verborgen - Communityrichtlijnen zijn getoond - Verberg \'Create a Short\' knop - Knop \'Een Short maken\' is verborgen - Knop \'Een Short maken\' wordt weergegeven - Emoji- en tijdstempelknoppen verbergen - Emoji- en tijdstempelknoppen zijn verborgen - Emoji- en tijdstempelknoppen zijn weergegeven - Reactie in preview verbergen - Preview reactie is verborgen - Preview reactie wordt getoond - Verberg de knop \'Bedankt\' - Bedankknop is verborgen - De knop \'Bedankt\' wordt weergegeven - Aantal weergaven verbergen - Aantal weergaven is verborgen in feed en zoekresultaten - Aantal weergaven wordt getoond in feed en zoekresultaten - - "Beperkingen: + Verberg knop \"Lid worden\" + Lid worden-knop is verborgen + Lid worden-knop wordt getoond + Medische panelen verbergen + Medische panelen zijn verborgen + Medische panelen worden getoond + Snelle acties verbergen + Snelle acties in volledig scherm zijn verborgen + Snelle acties in volledig scherm zijn getoond + Gerelateerde video\'s verbergen + Gerelateerde video\'s in snelle acties zijn verborgen + Gerelateerde video\'s in snelle acties zijn getoond + Richtlijnen voor abonnees verbergen + Abonnementsrichtlijnen voor de community zijn verborgen + Abonnementsrichtlijnen voor de community worden getoond + Verberg getimede reacties + Gectimed reacties worden verborgen + Gectimed reacties worden getoond + \'AI-gegenereerde videosamenvatting\' verbergen + AI-gegenereerde videosamenvattingssectie is verborgen + Sectie met door AI gegenereerde videosamenvatting wordt getoond + Vraag verbergen + Vraaggedeelte is verborgen + Vraaggedeelte wordt weergegeven + Kenmerken verbergen + Specifieke plaatsen, Games, Muziek en Mensen genoemd secties zijn verborgen + Specifieke plaatsen, Games, Muziek en Mensen genoemd secties worden weergegeven + Hoofdstukken verbergen + Hoofdstukken sectie is verborgen + Hoofdstukken sectie wordt getoond + \'Zo is deze content gemaakt\' verbergen + Het gedeelte \"Zo is deze content gemaakt\" is verborgen + Het gedeelte \"Zo is deze content gemaakt\" is zichtbaar + Verberg Hype-punten + Hype-punten zijn verborgen + Hype-punten worden getoond + \'Ontdek de podcast\' verbergen + Het gedeelte \'Ontdek de podcast\' is verborgen + Het gedeelte \'Ontdek de podcast\' wordt weergegeven + Aanbevolen links verbergen + Sectie met aanbevolen links is verborgen + Sectie met aanbevolen links is zichtbaar + Verberg aanbevolen video\'s + Sectie met aanbevolen video\'s is verborgen + Sectie met aanbevolen video\'s is zichtbaar + Infokaarten verbergen + Sectie info-kaarten is verborgen + Sectie info-kaarten is zichtbaar + \'Belangrijkste begrippen\' verbergen + Het gedeelte \'Belangrijkste begrippen\' is verborgen + Het gedeelte \'Belangrijkste begrippen\' is zichtbaar + Verberg abonneerknop + Abonneerknop is verborgen + Abonneerknop is zichtbaar + Transcript verbergen + Transcriptgedeelte is verborgen + Transcriptgedeelte is zichtbaar + Videobeschrijving + Skjul eller vis komponentene i videoens beskrivelse + Filterbaren + Filterbalk verbergen of tonen in feeds, gerelateerde video\'s, zoekresultaten en kijkgeschiedenis + Verbergen in feeds + Verborgen in feeds + Weergegeven in feeds + Verbergen in gerelateerde video\'s + Verborgen in gerelateerde video\'s + Weergegeven in gerelateerde video\'s + Verbergen in zoekresultaten + Verborgen in zoekresultaten + Weergegeven in zoekresultaten + Verbergen in kijkgeschiedenis + Verborgen in kijkgeschiedenis + Getoond in kijkgeschiedenis + Kanaalpagina + Kanaalpagina-componenten verbergen of tonen + + Community-knop verbergen + Communityknop is verborgen + Communityknop wordt weergegeven + + Verberg \"Voor jou\"-schap + Voor jou-plank is verborgen + Voor jou-plank is getoond + + Knop \'Lid worden\' verbergen + Knop \'Lid worden\' is verborgen + Knop \'Lid worden\' wordt weergegeven + Linksvoorbeeld verbergen + Linksvoorbeeld is verborgen + Linksvoorbeeld is getoond + Ledenplank verbergen + Ledenplank is verborgen + Ledenplank wordt weergegeven + + Knop \'Winkel\' verbergen + Knop \'Winkel\' is verborgen + Knop \'Winkel\' wordt weergegeven + + Knop \'Abonneren\' verbergen + Knop \'Abonneren\' is verborgen + Knop \'Abonneren\' wordt weergegeven + Reacties + Reacties verbergen of tonen + AI-chatsamenvatting verbergen + AI-chatsamenvatting is verborgen + AI-chatsamenvatting is getoond + AI-opmerkingensamenvatting verbergen + AI-opmerkingensamenvatting is verborgen + AI-opmerkingensamenvatting is getoond + Kanaalrichtlijnen verbergen + Kanaalrichtlijnen zijn verborgen + Kanaalrichtlijnen worden weergegeven + Verberg kop \'Comments by members\' + Koptekst \'Reacties van leden\' is verborgen + Koptekst \'Reacties van leden\' wordt weergegeven + Reacties sectie verbergen + Reacties sectie is verborgen + Reacties sectie is getoond + Communityrichtlijnen verbergen + Communityrichtlijnen zijn verborgen + Communityrichtlijnen zijn getoond + Verberg \'Create a Short\' knop + Knop \'Een Short maken\' is verborgen + Knop \'Een Short maken\' wordt weergegeven + Emoji- en tijdstempelknoppen verbergen + Emoji- en tijdstempelknoppen zijn verborgen + Emoji- en tijdstempelknoppen zijn weergegeven + Reactie in preview verbergen + Preview reactie is verborgen + Preview reactie wordt getoond + Verberg de knop \'Bedankt\' + Bedankknop is verborgen + De knop \'Bedankt\' wordt weergegeven + Aantal weergaven verbergen + Aantal weergaven is verborgen in feed en zoekresultaten + Aantal weergaven wordt getoond in feed en zoekresultaten + + "Beperkingen: • Shorts-planken, kanaalpagina's en zoekresultaten kunnen nog steeds het aantal weergaven tonen • Deze functie werkt niet met de automotive form factor" - Verberg uploadtijd - Uploadtijd is verborgen in feed en zoekresultaten - Uploadtijd wordt getoond in feed en zoekresultaten - - "Beperkingen: + Verberg uploadtijd + Uploadtijd is verborgen in feed en zoekresultaten + Uploadtijd wordt getoond in feed en zoekresultaten + + "Beperkingen: • Shorts-schappen, kanaalpagina's en zoekresultaten kunnen nog steeds uploadtijden tonen • Deze functie werkt niet met de automotive vormfactor" - Keyword content verbergen - Zoek- en feed-video\'s verbergen met behulp van keyword filters - Home-video\'s verbergen door keywords - Video\'s in het tabblad Home worden gefilterd door keywords - Video\'s in het tabblad Home worden niet gefilterd door keywords - Zoekresultaten verbergen door keywords - Zoekresultaten worden gefilterd door keywords - Zoekresultaten worden niet gefilterd door keywords - Abonnementsvideo\'s verbergen door keywords - Video\'s in het tabblad Abonnements worden gefilterd door keywords - Video\'s in het tabblad Abonnements worden niet gefilterd door keywords - Keywords om te verbergen - - "Trefwoorden en zinnen om te verbergen, gescheiden door nieuwe regels + "Trefwoorden en zinnen om te verbergen, gescheiden door nieuwe regels Trefwoorden kunnen kanaalnamen of alle tekst zijn die wordt weergegeven in videotitels Woorden met hoofdletters in het midden moeten met de hoofdletter worden ingevoerd (bijv.: iPhone, TikTok, LeBlanc)" - Over keyword filtering - "Home/Abonnementen/Zoekresultaten worden gefilterd om inhoud te verbergen die overeenkomt met trefwoordzinnen + Over keyword filtering + "Home/Abonnementen/Zoekresultaten worden gefilterd om inhoud te verbergen die overeenkomt met trefwoordzinnen Beperkingen • Shorts kunnen niet worden verborgen op kanaalnaam • Sommige UI-componenten zijn mogelijk niet verborgen • Zoeken naar een trefwoord kan geen resultaten opleveren" - Match hele woorden - - Omkeren van een trefwoord/zin met dubbele aanhalingstekens zal voorkomen dat deel-matches van videotitels en kanaalnamen<br><br>Bijvoorbeeld,<br><b>\"ai\"</b> verbergt de video: <b>How does AI work?</b><br>maar zal deze niet verbergen: <b>What does fair use mean?</b> - - Keyword kan niet worden gebruikt: %s - Voeg aanhalingstekens toe om keyword te gebruiken: %s - Keyword heeft tegenstrijdige verklaringen: %s - Keyword is te kort en vereist aanhalingstekens: %s - Keyword verbergt alle video\'s: %s - - - Makerswinkelplank verbergen - Creator store-plank onder videospeler is verborgen - Creator-winkelplank onder videospeler wordt getoond - Verberg de Store-banner op het eindscherm - Eindscherm winkelbanner is verborgen - Eindscherm winkelbanner wordt getoond - Volledig scherm advertenties verbergen - "Volledig schermadvertenties zijn verborgen + Match hele woorden + + Omkeren van een trefwoord/zin met dubbele aanhalingstekens zal voorkomen dat deel-matches van videotitels en kanaalnamen<br><br>Bijvoorbeeld,<br><b>\"ai\"</b> verbergt de video: <b>How does AI work?</b><br>maar zal deze niet verbergen: <b>What does fair use mean?</b> + + Keyword kan niet worden gebruikt: %s + Voeg aanhalingstekens toe om keyword te gebruiken: %s + Keyword heeft tegenstrijdige verklaringen: %s + Keyword is te kort en vereist aanhalingstekens: %s + Keyword verbergt alle video\'s: %s + + + Makerswinkelplank verbergen + Creator store-plank onder videospeler is verborgen + Creator-winkelplank onder videospeler wordt getoond + Verberg de Store-banner op het eindscherm + Eindscherm winkelbanner is verborgen + Eindscherm winkelbanner wordt getoond + Volledig scherm advertenties verbergen + "Volledig schermadvertenties zijn verborgen Deze functie is alleen beschikbaar voor oudere apparaten" - Volledig scherm advertenties worden getoond - - Volledig scherm advertenties werkt alleen met oudere apparaten - Algemene advertenties verbergen - Algemene advertenties zijn verborgen - Algemene advertenties worden getoond - Merchandise banners verbergen - Merchandise banners zijn verborgen - Merchandise banners worden getoond - Betaalde promotielabel verbergen - Betaalde promotielabel is verborgen - Betaalde promotielabel wordt getoond - Zelf gesponsorde kaarten verbergen - Zelf gesponsorde kaarten zijn verborgen - Zelf gesponsorde kaarten worden getoond - Winkellinks verbergen - Winkellinks in videobeschrijving zijn verborgen - Winkellinks in videobeschrijving worden getoond - Banner \'Producten bekijken\' verbergen - Producten bekijken-banner in video-overlay is verborgen - Producten bekijken-banner in video-overlay wordt getoond - Webzoekresultaten verbergen - Webzoekresultaten zijn verborgen - Webzoekresultaten worden getoond - - - YouTube Premium promoties verbergen - YouTube Premium promoties onder de videospeler zijn verborgen - YouTube Premium promoties onder de videospeler worden getoond - - - Video-advertenties verbergen - Video-advertenties zijn verborgen - Video-advertenties worden getoond - - - URL gekopieerd naar klembord - URL met tijdstempel gekopieerd - Knop \"Video-URL kopiëren\" weergeven - Knop \'Video-URL kopiëren\' wordt weergegeven. Tik om de video-URL te kopiëren. Tik en houd vast om te kopiëren met tijdstempel - Knop \'Video-URL kopiëren\' wordt niet weergegeven - Knop \"Tijdstempel URL kopiëren\" weergeven - Knop \'Tijdstempel-URL kopiëren\' wordt weergegeven. Tik om de video-URL met tijdstempel te kopiëren. Tik en houd vast om te kopiëren zonder tijdstempel - Knop \'Tijdstempel-URL kopiëren\' wordt niet weergegeven - - - Dialog van kijker discretie verwijderen - Dialog wordt verwijderd - Dialog wordt getoond - Dit omzeilt de leeftijdsbeperking niet. Het accepteert het alleen automatisch. - - - Pop-up \'Inloggen op tv\' uitschakelen - Pop-up \'Inloggen op tv\' is uitgeschakeld - Pop-up \'Inloggen op tv\' is ingeschakeld - - - Dubbeltik om hoofdstukken over te slaan uitschakelen - Dubbeltikken kan nooit leiden tot het overslaan naar het volgende/vorige hoofdstuk. - Dubbeltikken kan af en toe leiden tot het overslaan naar het volgende/vorige hoofdstuk. - - - Externe downloads - Instellingen voor het gebruik van een externe downloader - Externe downloadknop weergeven - Downloadknop in speler wordt weergegeven - Downloadknop in speler wordt niet weergegeven - - Downloadactieknop overschrijven - Downloadknop opent je externe downloader - Downloadknop opent de native in-app downloader - Downloader pakketnaam - Pakketnaam van uw geïnstalleerde externe downloader-app - Voer de pakketnaam in - Overige - App niet geïnstalleerd - %s is niet geïnstalleerd. Installeer het. - "Kon geïnstalleerde app met pakketnaam niet vinden: %s + Volledig scherm advertenties worden getoond + + Volledig scherm advertenties werkt alleen met oudere apparaten + Algemene advertenties verbergen + Algemene advertenties zijn verborgen + Algemene advertenties worden getoond + Merchandise banners verbergen + Merchandise banners zijn verborgen + Merchandise banners worden getoond + Betaalde promotielabel verbergen + Betaalde promotielabel is verborgen + Betaalde promotielabel wordt getoond + Zelf gesponsorde kaarten verbergen + Zelf gesponsorde kaarten zijn verborgen + Zelf gesponsorde kaarten worden getoond + Winkellinks verbergen + Winkellinks in videobeschrijving zijn verborgen + Winkellinks in videobeschrijving worden getoond + Banner \'Producten bekijken\' verbergen + Producten bekijken-banner in video-overlay is verborgen + Producten bekijken-banner in video-overlay wordt getoond + Webzoekresultaten verbergen + Webzoekresultaten zijn verborgen + Webzoekresultaten worden getoond + + + YouTube Premium promoties verbergen + YouTube Premium promoties onder de videospeler zijn verborgen + YouTube Premium promoties onder de videospeler worden getoond + + + Video-advertenties verbergen + Video-advertenties zijn verborgen + Video-advertenties worden getoond + + + URL gekopieerd naar klembord + URL met tijdstempel gekopieerd + Knop \"Video-URL kopiëren\" weergeven + Knop \'Video-URL kopiëren\' wordt weergegeven. Tik om de video-URL te kopiëren. Tik en houd vast om te kopiëren met tijdstempel + Knop \'Video-URL kopiëren\' wordt niet weergegeven + Knop \"Tijdstempel URL kopiëren\" weergeven + Knop \'Tijdstempel-URL kopiëren\' wordt weergegeven. Tik om de video-URL met tijdstempel te kopiëren. Tik en houd vast om te kopiëren zonder tijdstempel + Knop \'Tijdstempel-URL kopiëren\' wordt niet weergegeven + + + Dialog van kijker discretie verwijderen + Dialog wordt verwijderd + Dialog wordt getoond + Dit omzeilt de leeftijdsbeperking niet. Het accepteert het alleen automatisch. + + + Pop-up \'Inloggen op tv\' uitschakelen + Pop-up \'Inloggen op tv\' is uitgeschakeld + Pop-up \'Inloggen op tv\' is ingeschakeld + + + Dubbeltik om hoofdstukken over te slaan uitschakelen + Dubbeltikken kan nooit leiden tot het overslaan naar het volgende/vorige hoofdstuk. + Dubbeltikken kan af en toe leiden tot het overslaan naar het volgende/vorige hoofdstuk. + + + Externe downloads + Instellingen voor het gebruik van een externe downloader + Externe downloadknop weergeven + Downloadknop in speler wordt weergegeven + Downloadknop in speler wordt niet weergegeven + + Downloadactieknop overschrijven + Downloadknop opent je externe downloader + Downloadknop opent de native in-app downloader + Downloader pakketnaam + Pakketnaam van uw geïnstalleerde externe downloader-app + Voer de pakketnaam in + Overige + App niet geïnstalleerd + %s is niet geïnstalleerd. Installeer het. + "Kon geïnstalleerde app met pakketnaam niet vinden: %s Controleer of de pakketnaam correct is en de app is geïnstalleerd" - De pakketnaam kan niet leeg zijn - - - Precisie-zoekbeweging uitschakelen - Beweging is uitgeschakeld - Beweging is ingeschakeld - - - Tikken om te zoeken inschakelen - Tikken om te zoeken is ingeschakeld - Tikken om te zoeken is uitgeschakeld - - - Helderheidsbeweging inschakelen - "Volledig scherm helderheid swipe is ingeschakeld + De pakketnaam kan niet leeg zijn + + + Precisie-zoekbeweging uitschakelen + Beweging is uitgeschakeld + Beweging is ingeschakeld + + + Tikken om te zoeken inschakelen + Tikken om te zoeken is ingeschakeld + Tikken om te zoeken is uitgeschakeld + + + Helderheidsbeweging inschakelen + "Volledig scherm helderheid swipe is ingeschakeld Pas de helderheid aan door verticaal te swipen aan de linkerkant van het scherm" - Volledig scherm helderheid swipe is uitgeschakeld - Volumebeweging inschakelen - "Volume aanpassen in volledig scherm is ingeschakeld + Volledig scherm helderheid swipe is uitgeschakeld + Volumebeweging inschakelen + "Volume aanpassen in volledig scherm is ingeschakeld Pas het volume aan door verticaal over de rechterkant van het scherm te vegen" - Volume aanpassen in volledig scherm is uitgeschakeld - \"Druk om te vegen\" beweging inschakelen - Druk-om-te-swipen is ingeschakeld - Druk-om-te-swipen is uitgeschakeld - Haptische feedback inschakelen - Haptische feedback is ingeschakeld - Haptische feedback is uitgeschakeld - Helderheid opslaan en herstellen - Helderheid opslaan en herstellen bij het verlaten of betreden van volledig scherm - Helderheid niet opslaan en herstellen bij het verlaten of betreden van volledig scherm - Automatische helderheidsbeweging inschakelen - Omlaag swipen naar de laagste waarde van de helderheidsbeweging activeert automatische helderheid - Omlaag swipen naar de laagste waarde activeert automatische helderheid niet - Automatisch - Swipe-overlay time-out - Het aantal milliseconden dat de overlay zichtbaar is - Dekking van de Swipe overlay - Dekking tussen 0-100 - Dekking moet tussen 0-100 zijn - Veeg-overlay helderheidskleur - De kleur van de voortgangsbalk voor helderheidsbediening - Veeg-overlay volumekleur - De kleur van de voortgangsbalk voor volumebediening - Tekengrootte swipe-overlay - De tekstgrootte voor swipe-overlay tussen 1-30 - De tekstgrootte moet tussen 1-30 liggen - Drempelwaarde swipe-sterkte - De hoeveelheid drempelwaarde voor swipe om te gebeuren - Gevoeligheid volumegest - Hoeveel het volume verandert per swipe - Swipe-overlaystijl - Horizontale overlay - Horizontale overlay (minimaal - boven) - Horizontale overlay (minimaal - midden) - Circulaire overlay - Circulaire overlay (minimaal) - Verticale overlay - Verticale overlay (minimaal) - Schakel vegen in om te wisselen tussen video\'s - Vegen in de modus volledig scherm weergegeven, verandert naar de volgende/vorige video - Vegen in de modus volledig scherm weergegeven, verandert niet naar de volgende/vorige video - - - Automatische ondertitels uitschakelen - Automatische ondertiteling is uitgeschakeld - Automatische ondertiteling is ingeschakeld - - - Actieknoppen - Knoppen onder video\'s verbergen of weergeven - Schakel de gloed van Vind ik leuk en Abonneren uit - De knop \"Vind ik leuk\" en \"Abonneren\" zullen niet gloeien wanneer ze worden genoemd - De knop \"Vind ik leuk\" en \"Abonneren\" zullen gloeien wanneer ze worden genoemd - Vind ik leuk en vind ik niet leuk verbergen - Vind ik leuk en vind ik niet leuk knoppen zijn verborgen - Vind ik leuk en vind ik niet leuk knoppen worden weergegeven - - Verberg delen - Deel knop is verborgen - Deel knop wordt weergegeven - - Advertenties stoppen verbergen - Knop \"Advertenties stoppen\" is verborgen - Knop \"Advertenties stoppen\" is zichtbaar - - Reacties verbergen - De reactieknop is verborgen - De reactieknop wordt weergegeven - + Verberg delen + Deel knop is verborgen + Deel knop wordt weergegeven + + Advertenties stoppen verbergen + Knop \"Advertenties stoppen\" is verborgen + Knop \"Advertenties stoppen\" is zichtbaar + + Reacties verbergen + De reactieknop is verborgen + De reactieknop wordt weergegeven + - Melden verbergen - Melden is verborgen - Melden wordt weergegeven - - Remix verbergen - Remix-knop is verborgen - Remix-knop wordt weergegeven - - Downloaden verbergen - Downloaden knop is verborgen - Downloaden knop wordt weergegeven - + Remix verbergen + Remix-knop is verborgen + Remix-knop wordt weergegeven + + Downloaden verbergen + Downloaden knop is verborgen + Downloaden knop wordt weergegeven + - Verberg Hype - Hype-knop is verborgen - Hype-knop is zichtbaar - - Promotie verbergen - Promootknop is verborgen - Promootknop is weergegeven - - Bedankt verbergen - Bedankt-knop is verborgen - Bedankt-knop wordt weergegeven - + Promotie verbergen + Promootknop is verborgen + Promootknop is weergegeven + + Bedankt verbergen + Bedankt-knop is verborgen + Bedankt-knop wordt weergegeven + - Vraag verbergen - Knop \"Vraag\" is verborgen - Knop \"Vraag\" wordt weergegeven - - Fragment verbergen - Fragment knop is verborgen - Fragment knop wordt weergegeven - - Winkel verbergen - Winkelknop is verborgen - Winkelknop is weergegeven - - Opslaan verbergen - Knop \"Opslaan\" is verborgen - Knop \"Opslaan\" is zichtbaar - - - Navigatieknoppen - Knoppen in de navigatiebalk verbergen of wijzigen - - Startpagina verbergen - Startpagina-knop is verborgen - Startpagina-knop wordt weergegeven - - Verberg Shorts - Shorts knop is verborgen - Shorts knop wordt weergegeven - - Maak verbergen - Maak-knop is verborgen - Maak-knop wordt weergegeven - - Abonnementen verbergen - Abonnementen-knop is verborgen - Abonnementen-knop wordt weergegeven - Meldingen verbergen - Meldingsknop is verborgen - Meldingsknop wordt weergegeven - - Maak wisselen met Meldingen - "Maken-knop wordt gewisseld met meldingen-knop + Vraag verbergen + Knop \"Vraag\" is verborgen + Knop \"Vraag\" wordt weergegeven + + Fragment verbergen + Fragment knop is verborgen + Fragment knop wordt weergegeven + + Winkel verbergen + Winkelknop is verborgen + Winkelknop is weergegeven + + Opslaan verbergen + Knop \"Opslaan\" is verborgen + Knop \"Opslaan\" is zichtbaar + + + Navigatieknoppen + Knoppen in de navigatiebalk verbergen of wijzigen + + Startpagina verbergen + Startpagina-knop is verborgen + Startpagina-knop wordt weergegeven + + Verberg Shorts + Shorts knop is verborgen + Shorts knop wordt weergegeven + + Maak verbergen + Maak-knop is verborgen + Maak-knop wordt weergegeven + + Abonnementen verbergen + Abonnementen-knop is verborgen + Abonnementen-knop wordt weergegeven + Meldingen verbergen + Meldingsknop is verborgen + Meldingsknop wordt weergegeven + + Maak wisselen met Meldingen + "Maken-knop wordt gewisseld met meldingen-knop Opmerking: Als u dit inschakelt, worden videoadvertenties ook geforceerd verborgen" - Maak-knop wordt niet gewisseld met Meldingen-knop - "Als u deze instelling uitschakelt, wordt ook het blokkeren van Shorts-advertenties uitgeschakeld. + Maak-knop wordt niet gewisseld met Meldingen-knop + "Als u deze instelling uitschakelt, wordt ook het blokkeren van Shorts-advertenties uitgeschakeld. Als het wijzigen van deze instelling geen effect heeft, probeer dan over te schakelen naar de incognitomodus." - Navigatieknoppenlabels verbergen - Labels zijn verborgen - Labels worden weergegeven - Transparante statusbalk uitschakelen - Statusbalk is ondoorzichtig - Statusbalk is ondoorzichtig of doorschijnend - Op sommige apparaten kan het inschakelen van deze functie de systeemnavigatiebalk transparant maken. - Transparante lichte navigatiebalk uitschakelen - De lichte navigatiebalk is ondoorzichtig - De lichtmodus navigatiebalk is ondoorzichtig of doorschijnend - Schakel de donkere doorschijnende balk uit - De donkere navigatiebalk is ondoorzichtig - De donkermodus navigatiebalk is ondoorzichtig of doorschijnend - - - Uitklapmenu - Items in het uitklapmenu van de speler verbergen of weergeven - - Ondertitels verbergen - Ondertitels-menu is verborgen - Ondertitels-menu wordt weergegeven - - Extra instellingen verbergen - Extra instellingen-menu is verborgen - Extra instellingen-menu wordt weergegeven - - Slaaptimer verbergen - Slaaptimer-menu is verborgen - Slaaptimer-menu wordt weergegeven - - Video herhalen verbergen - Video herhalen-menu is verborgen - Video herhalen-menu wordt weergegeven - - Sfeervolle modus verbergen - Sfeervolle modus-menu is verborgen - Sfeervolle modus-menu wordt weergegeven - Stabiel volume verbergen - Stabiel volume-menu wordt weergegeven - Stabiel volume-menu is verborgen - - Help en feedback verbergen - Help en feedback-menu is verborgen - Help en feedback-menu wordt weergegeven - - Afspeel snelheid verbergen - Afspeel snelheid-menu is verborgen - Menu met afspeelsnelheid wordt weergegeven - - Verberg Vergrendelscherm - Menu Vergrendelscherm is verborgen - Menu Vergrendelscherm wordt weergegeven - - Verberg Luisteren met YouTube Music - Het menu \'Luisteren met YouTube Music\' is verborgen - Het menu \'Luisteren met YouTube Music\' is zichtbaar - - Verberg Audiotrack - Menu Audiotrack is verborgen - Menu Audiotrack wordt weergegeven - + Ondertitels verbergen + Ondertitels-menu is verborgen + Ondertitels-menu wordt weergegeven + + Extra instellingen verbergen + Extra instellingen-menu is verborgen + Extra instellingen-menu wordt weergegeven + + Slaaptimer verbergen + Slaaptimer-menu is verborgen + Slaaptimer-menu wordt weergegeven + + Video herhalen verbergen + Video herhalen-menu is verborgen + Video herhalen-menu wordt weergegeven + + Sfeervolle modus verbergen + Sfeervolle modus-menu is verborgen + Sfeervolle modus-menu wordt weergegeven + Stabiel volume verbergen + Stabiel volume-menu wordt weergegeven + Stabiel volume-menu is verborgen + + Help en feedback verbergen + Help en feedback-menu is verborgen + Help en feedback-menu wordt weergegeven + + Afspeel snelheid verbergen + Afspeel snelheid-menu is verborgen + Menu met afspeelsnelheid wordt weergegeven + + Verberg Vergrendelscherm + Menu Vergrendelscherm is verborgen + Menu Vergrendelscherm wordt weergegeven + + Verberg Luisteren met YouTube Music + Het menu \'Luisteren met YouTube Music\' is verborgen + Het menu \'Luisteren met YouTube Music\' is zichtbaar + + Verberg Audiotrack + Menu Audiotrack is verborgen + Menu Audiotrack wordt weergegeven + - "Audiotracks-menu is verborgen + "Audiotracks-menu is verborgen Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Android No SDK'" - - Verberg Bekijk in VR - Menu Bekijk in VR is verborgen - Menu Bekijk in VR wordt weergegeven - Videokwaliteitsmenu verbergen - Videokwaliteitsmenu is verborgen - Videokwaliteitsmenu is zichtbaar - Verberg voettekst van video-kwaliteitsmenu - Voettekst van video-kwaliteitsmenu is verborgen - Voettekst van video-kwaliteitsmenu wordt weergegeven - - - Verberg knop voor automatisch afspelen - Automatische afspeelknop is verborgen - Automatische afspeelknop wordt weergegeven - - Verberg ondertitelknop - Ondertitelingknop is verborgen - Ondertitelingknop wordt weergegeven - Verberg Cast-knop - Castknop is verborgen - Castknop wordt weergegeven - Achtergrond van spelerbediening verbergen - Achtergrond van spelerbediening is verborgen - Achtergrond van spelerbediening wordt weergegeven - Verberg Vorige & Volgende knoppen - Knoppen zijn verborgen - Knoppen worden weergegeven - - - Verberg eindschermkaarten - Eindschermkaarten zijn verborgen - Eindschermkaarten worden weergegeven - - - Schakel de ambientmodus in volledig scherm uit - Omgevingsmodus uitgeschakeld - Omgevingsmodus ingeschakeld - - - Verberg infokaarten - Infokaarten zijn verborgen - Infokaarten worden weergegeven - - - Schakel rollende nummeranimaties uit - Rollende nummers zijn niet geanimeerd - Rollende nummers zijn geanimeerd - - - Zoekbalk videospeler verbergen - Zoekbalk videospeler verborgen - Zoekbalk videospeler is weergegeven - - Zoekbalk videominiaturen verbergen - Zoekbalk videominiaturen is verborgen - Zoekbalk videominiaturen is getoond - - - Shorts-speler - Shorts-spelercomponenten verbergen of tonen - - Shorts verbergen in Home-feed - Verborgen in Home-feed en gerelateerde video\'s - Getoond in Home-feed en gerelateerde video\'s - Verberg Shorts in zoekresultaten - Verborgen in zoekresultaten - Wordt weergegeven in zoekresultaten - - Shorts verbergen in Abonnementen-feed - Verborgen in Abonnementen-feed - Getoond in Abonnementen-feed - Verberg Shorts in geschiedenis bekijken - Verborgen in de kijkgeschiedenis - Getoond in geschiedenis bekijken - \'Automatisch nagesynchroniseerd\'-label verbergen - Automatisch nagesynchroniseerd label is verborgen - Automatisch nagesynchroniseerd label wordt getoond - Knop \'Super Thanks kopen\' verbergen - Super Thanks kopen-knop is verborgen - Super Thanks kopen-knop wordt getoond - Verberg effectknop - Effectknop is verborgen - Effectknop is weergegeven - Knop \'Groen scherm\' verbergen - De knop \"Groen scherm\" is verborgen - De knop \"Groen scherm\" is zichtbaar - Verberg de knop \"Hashtag\" - De knop \"Hashtag\" is verborgen - De knop \"Hashtag\" is zichtbaar - - Verberg de knop \"Word lid\" - Join-knop is verborgen - Join-knop wordt weergegeven - Verberg livevoorbeeld - Livevoorbeeld is verborgen - Livevoorbeeld is zichtbaar - Verberg locatie-etiket - Locatie-etiket is verborgen - Locatie-etiket wordt weergegeven - Knop \'Nieuwe posts\' verbergen - Knop Nieuwe berichten is verborgen - Knop Nieuwe berichten wordt weergegeven - Verberg knoppen van de pauze-overlay - Knoppen van de pauze-overlay zijn verborgen - Knoppen van de pauze-overlay worden weergegeven - Voorbeeldcommentaar verbergen - Voorbeeldcommentaar is verborgen - Voorbeeldcommentaar wordt weergegeven - Knop \'Muziek opslaan\' verbergen - Muziek opslaan-knop is verborgen - Muziek opslaan-knop wordt weergegeven - Verberg zoeksuggesties - Zoeksuggesties zijn verborgen - Zoeksuggesties zijn zichtbaar - Verberg Winkelknop - Winkelknop is verborgen - Winkelknop wordt weergegeven - Verberg stickers - Stickers zijn verborgen - Stickers zijn zichtbaar - Verberg de knop \"Abonneren\" - Abonneerknop is verborgen - Abonneerknop wordt weergegeven - Verberg getagde producten - Getagde producten zijn verborgen - Getagde producten worden weergegeven - Verberg de knop \"Aanstaande\" - De \"Volgende\" knop is verborgen - De \"Volgende\" knop is zichtbaar - Knop \'Dit geluid gebruiken\' verbergen - Knop Geluid gebruiken is verborgen - Knop Geluid gebruiken is weergegeven - Knop \'Deze sjabloon gebruiken\' verbergen - Knop Sjabloon gebruiken is verborgen - De knop Dit sjabloon gebruiken wordt weergegeven - Verberg de fonteinanimatie van de vind-ik-leukknop - De animatie van de \"like fountain\" is verborgen - De animatie van de \"like fountain\" is zichtbaar - Verberg de knop \"Vind ik leuk\" - De \"like\" knop is verborgen - De \"like\" knop is zichtbaar - Verberg de knop \"Niet leuk\" - De \"dislike\" knop is verborgen - De \"dislike\" knop is zichtbaar - Verberg de knop \"Reacties\" - De knop \"Reacties\" is verborgen - De knop \"Reacties\" is zichtbaar - - Verberg de knop \"Delen\" - Deel knop is verborgen - Deel knop wordt weergegeven - - Verberg de knop \"Remixen\" - De knop \"Remix\" is verborgen - De knop \"Remix\" is zichtbaar - Verberg de geluidsknop - De geluidsknop is verborgen - De geluidsknop is zichtbaar - Verberg het informatiepaneel - Het informatiepaneel is verborgen - Het informatiepaneel is zichtbaar - Verberg de kanaalbalk - De kanaalbalk is verborgen - De kanaalbalk is zichtbaar - Verberg de videotitel - Videotitel is verborgen - Videotitel wordt getoond - Verberg het label \"Geluidsinformatie\" - Geluid metadatylabel is verborgen - Geluid metadatylabel wordt getoond - Videolinklabel verbergen - Het label \"Volledige videolink\" is verborgen - Het label \"Volledige videolink\" is zichtbaar - Verberg de navigatiebalk - De navigatiebalk is verborgen - De navigatiebalk is zichtbaar - - - Voorgestelde video op eindscherm verbergen - "De voorgestelde video op het eindscherm is verborgen wanneer automatisch afspelen is uitgeschakeld. + + Verberg Bekijk in VR + Menu Bekijk in VR is verborgen + Menu Bekijk in VR wordt weergegeven + Videokwaliteitsmenu verbergen + Videokwaliteitsmenu is verborgen + Videokwaliteitsmenu is zichtbaar + Verberg voettekst van video-kwaliteitsmenu + Voettekst van video-kwaliteitsmenu is verborgen + Voettekst van video-kwaliteitsmenu wordt weergegeven + + + Verberg knop voor automatisch afspelen + Automatische afspeelknop is verborgen + Automatische afspeelknop wordt weergegeven + + Verberg ondertitelknop + Ondertitelingknop is verborgen + Ondertitelingknop wordt weergegeven + Verberg Cast-knop + Castknop is verborgen + Castknop wordt weergegeven + Achtergrond van spelerbediening verbergen + Achtergrond van spelerbediening is verborgen + Achtergrond van spelerbediening wordt weergegeven + Verberg Vorige & Volgende knoppen + Knoppen zijn verborgen + Knoppen worden weergegeven + + + Verberg eindschermkaarten + Eindschermkaarten zijn verborgen + Eindschermkaarten worden weergegeven + + + Schakel de ambientmodus in volledig scherm uit + Omgevingsmodus uitgeschakeld + Omgevingsmodus ingeschakeld + + + Verberg infokaarten + Infokaarten zijn verborgen + Infokaarten worden weergegeven + + + Schakel rollende nummeranimaties uit + Rollende nummers zijn niet geanimeerd + Rollende nummers zijn geanimeerd + + + Zoekbalk videospeler verbergen + Zoekbalk videospeler verborgen + Zoekbalk videospeler is weergegeven + + Zoekbalk videominiaturen verbergen + Zoekbalk videominiaturen is verborgen + Zoekbalk videominiaturen is getoond + + + Shorts-speler + Shorts-spelercomponenten verbergen of tonen + + Shorts verbergen in Home-feed + Verborgen in Home-feed en gerelateerde video\'s + Getoond in Home-feed en gerelateerde video\'s + Verberg Shorts in zoekresultaten + Verborgen in zoekresultaten + Wordt weergegeven in zoekresultaten + + Shorts verbergen in Abonnementen-feed + Verborgen in Abonnementen-feed + Getoond in Abonnementen-feed + Verberg Shorts in geschiedenis bekijken + Verborgen in de kijkgeschiedenis + Getoond in geschiedenis bekijken + \'Automatisch nagesynchroniseerd\'-label verbergen + Automatisch nagesynchroniseerd label is verborgen + Automatisch nagesynchroniseerd label wordt getoond + Knop \'Super Thanks kopen\' verbergen + Super Thanks kopen-knop is verborgen + Super Thanks kopen-knop wordt getoond + Verberg effectknop + Effectknop is verborgen + Effectknop is weergegeven + Knop \'Groen scherm\' verbergen + De knop \"Groen scherm\" is verborgen + De knop \"Groen scherm\" is zichtbaar + Verberg de knop \"Hashtag\" + De knop \"Hashtag\" is verborgen + De knop \"Hashtag\" is zichtbaar + + Verberg de knop \"Word lid\" + Join-knop is verborgen + Join-knop wordt weergegeven + Verberg livevoorbeeld + Livevoorbeeld is verborgen + Livevoorbeeld is zichtbaar + Verberg locatie-etiket + Locatie-etiket is verborgen + Locatie-etiket wordt weergegeven + Knop \'Nieuwe posts\' verbergen + Knop Nieuwe berichten is verborgen + Knop Nieuwe berichten wordt weergegeven + Verberg knoppen van de pauze-overlay + Knoppen van de pauze-overlay zijn verborgen + Knoppen van de pauze-overlay worden weergegeven + Voorbeeldcommentaar verbergen + Voorbeeldcommentaar is verborgen + Voorbeeldcommentaar wordt weergegeven + Knop \'Muziek opslaan\' verbergen + Muziek opslaan-knop is verborgen + Muziek opslaan-knop wordt weergegeven + Verberg zoeksuggesties + Zoeksuggesties zijn verborgen + Zoeksuggesties zijn zichtbaar + Verberg Winkelknop + Winkelknop is verborgen + Winkelknop wordt weergegeven + Verberg stickers + Stickers zijn verborgen + Stickers zijn zichtbaar + Verberg de knop \"Abonneren\" + Abonneerknop is verborgen + Abonneerknop wordt weergegeven + Verberg getagde producten + Getagde producten zijn verborgen + Getagde producten worden weergegeven + Verberg de knop \"Aanstaande\" + De \"Volgende\" knop is verborgen + De \"Volgende\" knop is zichtbaar + Knop \'Dit geluid gebruiken\' verbergen + Knop Geluid gebruiken is verborgen + Knop Geluid gebruiken is weergegeven + Knop \'Deze sjabloon gebruiken\' verbergen + Knop Sjabloon gebruiken is verborgen + De knop Dit sjabloon gebruiken wordt weergegeven + Verberg de fonteinanimatie van de vind-ik-leukknop + De animatie van de \"like fountain\" is verborgen + De animatie van de \"like fountain\" is zichtbaar + Verberg de knop \"Vind ik leuk\" + De \"like\" knop is verborgen + De \"like\" knop is zichtbaar + Verberg de knop \"Niet leuk\" + De \"dislike\" knop is verborgen + De \"dislike\" knop is zichtbaar + Verberg de knop \"Reacties\" + De knop \"Reacties\" is verborgen + De knop \"Reacties\" is zichtbaar + + Verberg de knop \"Delen\" + Deel knop is verborgen + Deel knop wordt weergegeven + + Verberg de knop \"Remixen\" + De knop \"Remix\" is verborgen + De knop \"Remix\" is zichtbaar + Verberg de geluidsknop + De geluidsknop is verborgen + De geluidsknop is zichtbaar + Verberg het informatiepaneel + Het informatiepaneel is verborgen + Het informatiepaneel is zichtbaar + Verberg de kanaalbalk + De kanaalbalk is verborgen + De kanaalbalk is zichtbaar + Verberg de videotitel + Videotitel is verborgen + Videotitel wordt getoond + Verberg het label \"Geluidsinformatie\" + Geluid metadatylabel is verborgen + Geluid metadatylabel wordt getoond + Videolinklabel verbergen + Het label \"Volledige videolink\" is verborgen + Het label \"Volledige videolink\" is zichtbaar + Verberg de navigatiebalk + De navigatiebalk is verborgen + De navigatiebalk is zichtbaar + + + Voorgestelde video op eindscherm verbergen + "De voorgestelde video op het eindscherm is verborgen wanneer automatisch afspelen is uitgeschakeld. Automatisch afspelen kan worden gewijzigd in de YouTube-instellingen: Instellingen → Afspelen → Volgende video automatisch afspelen" - Voorgestelde video op eindscherm wordt getoond - - - Overlay van gerelateerde video\'s verbergen - Overlay van gerelateerde video\'s in volledig scherm is verborgen - Overlay van gerelateerde video\'s in volledig scherm wordt getoond - - - Verberg de videotijd - De tijd is verborgen - De tijd is zichtbaar - - - Verberg de pop-upvensters van de speler - De pop-upvensters van de speler zijn verborgen - De pop-upvensters van de speler zijn zichtbaar - - - Afsluiten van volledig scherm modus bij einde van de video - Uitgeschakeld - Portret - Landschap - Portret en landschap - - - Open video\'s in volledig schermmodus (portret) - Video\'s openen in volledig schermmodus - Video\'s openen niet in volledig schermmodus - - - Speler-overlaytransparantie - Transparantiewaarde tussen 0-100, waarbij 0 transparant is - De transparantie van de speler-overlay moet tussen 0-100 liggen - - - - \"Dislikes\" tijdelijk niet beschikbaar (API-time-out) - \"Dislikes\" niet beschikbaar (status %d) - Vind ik niet leuk is niet beschikbaar (limiet van client-API) - \"Dislikes\" niet beschikbaar (%s) - - Herlaad video om te stemmen via Return YouTube Dislike - - Verborgen door eigenaar - \"Dislikes\" worden weergegeven - \"Dislikes\" worden niet weergegeven - Toon onlikes op Shorts - "Vind ik niet leuk op Shorts worden weergegeven + Voorgestelde video op eindscherm wordt getoond + + + Overlay van gerelateerde video\'s verbergen + Overlay van gerelateerde video\'s in volledig scherm is verborgen + Overlay van gerelateerde video\'s in volledig scherm wordt getoond + + + Verberg de videotijd + De tijd is verborgen + De tijd is zichtbaar + + + Verberg de pop-upvensters van de speler + De pop-upvensters van de speler zijn verborgen + De pop-upvensters van de speler zijn zichtbaar + + + Afsluiten van volledig scherm modus bij einde van de video + Uitgeschakeld + Portret + Landschap + Portret en landschap + + + Open video\'s in volledig schermmodus (portret) + Video\'s openen in volledig schermmodus + Video\'s openen niet in volledig schermmodus + + + Speler-overlaytransparantie + Transparantiewaarde tussen 0-100, waarbij 0 transparant is + De transparantie van de speler-overlay moet tussen 0-100 liggen + + + + \"Dislikes\" tijdelijk niet beschikbaar (API-time-out) + \"Dislikes\" niet beschikbaar (status %d) + Vind ik niet leuk is niet beschikbaar (limiet van client-API) + \"Dislikes\" niet beschikbaar (%s) + + Herlaad video om te stemmen via Return YouTube Dislike + + Verborgen door eigenaar + \"Dislikes\" worden weergegeven + \"Dislikes\" worden niet weergegeven + Toon onlikes op Shorts + "Vind ik niet leuk op Shorts worden weergegeven Beperking: Vind ik niet leuk verschijnen mogelijk niet in de incognitomodus" - Vind ik niet leuk op Shorts worden niet weergegeven - \"Dislikes\" als percentage - Vind ik niet leuk wordt weergegeven als percentage - Vind ik niet leuk wordt weergegeven als een getal - - Compacte vind-ik-leukknop - \"Like\" knop met minimale breedte - \"Like\" knop met beste uiterlijk - Geschatte likes weergeven - Video\'s met uitgeschakelde vind-ik-leuks tonen een geschat aantal vind-ik-leuks - Geschatte vind-ik-leuks worden niet getoond - Toon een \"toast\" als de API niet beschikbaar is - \"Toast\" wordt getoond als Return YouTube Dislike niet beschikbaar is - \"Toast\" wordt niet getoond als Return YouTube Dislike niet beschikbaar is - Data wordt aangeleverd door de Return YouTube Dislike API. Tik hier voor meer informatie - - ReturnYouTubeDislike API-statistieken van dit apparaat - API-reactiet tijd, gemiddelde - API-reactiet tijd, minimum - API-reactiet tijd, maximum - API-reactiet tijd, laatste video - \"Dislikes\" tijdelijk niet beschikbaar - Client-API-snelheidslimiet van kracht - API-ophalen stemmen, aantal oproepen - Geen netwerko oproepen gedaan - %d netwerko oproepen gedaan - API-stemmen ophalen, aantal time-outs - Geen netwerkoproepen zijn verlopen - %d netwerkoproepen zijn verlopen - API-client limieten - Geen client limieten zijn geconstateerd - Client limiet %d keer geconstateerd - %d milliseconden - - - Schakel de brede zoekbalk in - De brede zoekbalk is ingeschakeld - De brede zoekbalk is uitgeschakeld - - - Schakel miniatuurweergaven van hoge kwaliteit in - Miniatuurweergaven van de zoekbalk zijn van hoge kwaliteit - Miniatuurweergaven van de zoekbalk zijn van gemiddelde kwaliteit - "Dit zal ook miniatuurweergaven herstellen op livestreams die geen miniatuurweergaven van de zoekbalk hebben. + Vind ik niet leuk op Shorts worden niet weergegeven + \"Dislikes\" als percentage + Vind ik niet leuk wordt weergegeven als percentage + Vind ik niet leuk wordt weergegeven als een getal + + Compacte vind-ik-leukknop + \"Like\" knop met minimale breedte + \"Like\" knop met beste uiterlijk + Geschatte likes weergeven + Video\'s met uitgeschakelde vind-ik-leuks tonen een geschat aantal vind-ik-leuks + Geschatte vind-ik-leuks worden niet getoond + Toon een \"toast\" als de API niet beschikbaar is + \"Toast\" wordt getoond als Return YouTube Dislike niet beschikbaar is + \"Toast\" wordt niet getoond als Return YouTube Dislike niet beschikbaar is + Data wordt aangeleverd door de Return YouTube Dislike API. Tik hier voor meer informatie + + ReturnYouTubeDislike API-statistieken van dit apparaat + API-reactiet tijd, gemiddelde + API-reactiet tijd, minimum + API-reactiet tijd, maximum + API-reactiet tijd, laatste video + \"Dislikes\" tijdelijk niet beschikbaar - Client-API-snelheidslimiet van kracht + API-ophalen stemmen, aantal oproepen + Geen netwerko oproepen gedaan + %d netwerko oproepen gedaan + API-stemmen ophalen, aantal time-outs + Geen netwerkoproepen zijn verlopen + %d netwerkoproepen zijn verlopen + API-client limieten + Geen client limieten zijn geconstateerd + Client limiet %d keer geconstateerd + %d milliseconden + + + Schakel de brede zoekbalk in + De brede zoekbalk is ingeschakeld + De brede zoekbalk is uitgeschakeld + + + Schakel miniatuurweergaven van hoge kwaliteit in + Miniatuurweergaven van de zoekbalk zijn van hoge kwaliteit + Miniatuurweergaven van de zoekbalk zijn van gemiddelde kwaliteit + "Dit zal ook miniatuurweergaven herstellen op livestreams die geen miniatuurweergaven van de zoekbalk hebben. Miniatuurweergaven van de zoekbalk gebruiken dezelfde kwaliteit als de huidige video. Deze functie werkt het beste met een videokwaliteit van 720p of lager en wanneer u een zeer snelle internetverbinding gebruikt." - Herstel oude miniatuurweergaven van de zoekbalk - Miniatuurweergaven van de zoekbalk worden boven de zoekbalk weergegeven - Miniatuurweergaven van de zoekbalk worden in volledig scherm weergegeven - - - Schakel SponsorBlock in - SponsorBlock is een crowdsourced systeem om vervelende delen van YouTube-video\'s over te slaan - Uiterlijk - Toon de stemknop - De stemknop voor segmenten wordt weergegeven - De stemknop voor segmenten wordt niet weergegeven - Vierkante lay-out gebruiken - Knoppen en bedieningselementen zijn vierkant - Knoppen en bedieningselementen zijn afgerond - - Compacte Skip-knop gebruiken - Oversla-knop gestyled voor minimale breedte - Oversla-knop gestyled voor optimale weergave - Skip-knop automatisch verbergen - Oversla-knop wordt na een paar seconden verborgen - Skip-knop wordt weergegeven voor het hele segment - Duur van overslaan-knop - Hoe lang de knoppen \"overslaan\" en \"overslaan naar hoogtepunt\" moeten worden weergegeven voordat ze automatisch worden verborgen - Toon \"overslaan ongedaan maken\"-melding - Een melding wordt getoond wanneer een segment automatisch wordt overgeslagen. Tik op de melding om het overslaan ongedaan te maken - Toast wordt niet getoond - Duur van overslaan-toast - Hoe lang de \"overslaan ongedaan maken\"-melding moet worden weergegeven - 1 seconde - 2 seconden - 3 seconden - 4 seconden - 5 seconden - 6 seconden - 7 seconden - 8 seconden - 9 seconden - 10 seconden - Toon de videolengte zonder segmenten - Videolengte minus alle segmenten wordt getoond op de voortgangsbalk - Volledige videolengte weergegeven - Nieuwe segmenten maken - Knop \'Nieuw segment maken\' weergeven - Knop voor het maken van nieuwe segmenten wordt weergegeven - Knop voor het maken van nieuwe segmenten wordt niet weergegeven - Pas de nieuwe segmentstap aan - Aantal milliseconden dat de knoppen voor tijdcorrectie bewegen bij het maken van nieuwe segmenten - De waarde moet een positief getal zijn - Bekijk de richtlijnen - Richtlijnen bevatten regels en tips voor het maken van nieuwe segmenten - Volg de richtlijnen - Lees de SponsorBlock-richtlijnen voordat u nieuwe segmenten maakt - Al gelezen - Toon mij - Algemeen - Toon een \"toast\" als de API niet beschikbaar is - \"Toast\" wordt weergegeven als SponsorBlock niet beschikbaar is - \"Toast\" wordt niet weergegeven als SponsorBlock niet beschikbaar is - Schakel het bijhouden van het aantal overslaan in - Laat het SponsorBlock-klassement weten hoeveel tijd wordt bespaard. Er wordt een bericht naar het klassement verzonden telkens wanneer een segment wordt overgeslagen - Het bijhouden van het aantal overslaan is niet ingeschakeld - Minimale segmentduur - Segmenten die korter zijn dan deze waarde (in seconden) worden niet weergegeven of overgeslagen - Ongeldige tijdduur - Uw persoonlijke gebruikers-ID - Deze moet privé worden gehouden. Dit is als een wachtwoord en moet niet met iemand worden gedeeld. Als iemand dit heeft, kan hij zich voordoen als u - Uw persoonlijke gebruikers-ID moet minimaal 30 tekens lang zijn - Verander API-URL - Het adres dat SponsorBlock gebruikt om oproepen naar de server te doen - API-URL opnieuw ingesteld - API-URL is ongeldig - API-URL gewijzigd - Instellingen importeren/exporteren - Kopiëren - Uw SponsorBlock JSON-configuratie die kan worden geïmporteerd/geëxporteerd naar ReVanced en andere SponsorBlock-platforms - Uw SponsorBlock JSON-configuratie die kan worden geïmporteerd/geëxporteerd naar ReVanced en andere SponsorBlock-platforms. Dit omvat uw persoonlijke gebruikers-ID. Deel dit verstandig - Instellingen met succes geïmporteerd - Importeren mislukt: %s - Exporteren mislukt: %s - "Uw instellingen bevatten een privé SponsorBlock-gebruikers-ID. + Herstel oude miniatuurweergaven van de zoekbalk + Miniatuurweergaven van de zoekbalk worden boven de zoekbalk weergegeven + Miniatuurweergaven van de zoekbalk worden in volledig scherm weergegeven + + + Schakel SponsorBlock in + SponsorBlock is een crowdsourced systeem om vervelende delen van YouTube-video\'s over te slaan + Uiterlijk + Toon de stemknop + De stemknop voor segmenten wordt weergegeven + De stemknop voor segmenten wordt niet weergegeven + Vierkante lay-out gebruiken + Knoppen en bedieningselementen zijn vierkant + Knoppen en bedieningselementen zijn afgerond + + Compacte Skip-knop gebruiken + Oversla-knop gestyled voor minimale breedte + Oversla-knop gestyled voor optimale weergave + Skip-knop automatisch verbergen + Oversla-knop wordt na een paar seconden verborgen + Skip-knop wordt weergegeven voor het hele segment + Duur van overslaan-knop + Hoe lang de knoppen \"overslaan\" en \"overslaan naar hoogtepunt\" moeten worden weergegeven voordat ze automatisch worden verborgen + Toon \"overslaan ongedaan maken\"-melding + Een melding wordt getoond wanneer een segment automatisch wordt overgeslagen. Tik op de melding om het overslaan ongedaan te maken + Toast wordt niet getoond + Duur van overslaan-toast + Hoe lang de \"overslaan ongedaan maken\"-melding moet worden weergegeven + 1 seconde + 2 seconden + 3 seconden + 4 seconden + 5 seconden + 6 seconden + 7 seconden + 8 seconden + 9 seconden + 10 seconden + Toon de videolengte zonder segmenten + Videolengte minus alle segmenten wordt getoond op de voortgangsbalk + Volledige videolengte weergegeven + Nieuwe segmenten maken + Knop \'Nieuw segment maken\' weergeven + Knop voor het maken van nieuwe segmenten wordt weergegeven + Knop voor het maken van nieuwe segmenten wordt niet weergegeven + Pas de nieuwe segmentstap aan + Aantal milliseconden dat de knoppen voor tijdcorrectie bewegen bij het maken van nieuwe segmenten + De waarde moet een positief getal zijn + Bekijk de richtlijnen + Richtlijnen bevatten regels en tips voor het maken van nieuwe segmenten + Volg de richtlijnen + Lees de SponsorBlock-richtlijnen voordat u nieuwe segmenten maakt + Al gelezen + Toon mij + Algemeen + Toon een \"toast\" als de API niet beschikbaar is + \"Toast\" wordt weergegeven als SponsorBlock niet beschikbaar is + \"Toast\" wordt niet weergegeven als SponsorBlock niet beschikbaar is + Schakel het bijhouden van het aantal overslaan in + Laat het SponsorBlock-klassement weten hoeveel tijd wordt bespaard. Er wordt een bericht naar het klassement verzonden telkens wanneer een segment wordt overgeslagen + Het bijhouden van het aantal overslaan is niet ingeschakeld + Minimale segmentduur + Segmenten die korter zijn dan deze waarde (in seconden) worden niet weergegeven of overgeslagen + Ongeldige tijdduur + Uw persoonlijke gebruikers-ID + Deze moet privé worden gehouden. Dit is als een wachtwoord en moet niet met iemand worden gedeeld. Als iemand dit heeft, kan hij zich voordoen als u + Uw persoonlijke gebruikers-ID moet minimaal 30 tekens lang zijn + Verander API-URL + Het adres dat SponsorBlock gebruikt om oproepen naar de server te doen + API-URL opnieuw ingesteld + API-URL is ongeldig + API-URL gewijzigd + Instellingen importeren/exporteren + Kopiëren + Uw SponsorBlock JSON-configuratie die kan worden geïmporteerd/geëxporteerd naar ReVanced en andere SponsorBlock-platforms + Uw SponsorBlock JSON-configuratie die kan worden geïmporteerd/geëxporteerd naar ReVanced en andere SponsorBlock-platforms. Dit omvat uw persoonlijke gebruikers-ID. Deel dit verstandig + Instellingen met succes geïmporteerd + Importeren mislukt: %s + Exporteren mislukt: %s + "Uw instellingen bevatten een privé SponsorBlock-gebruikers-ID. Uw gebruikers-ID is als een wachtwoord en mag nooit worden gedeeld. " - Niet meer tonen - Verander het segmentgedrag - Betaalde promotie, betaalde verwijzingen en directe advertenties. Niet voor zelfpromotie of gratis shout-outs naar oorzaken/makers/websites/producten die ze leuk vinden - Onbetaalde/Zelfpromotie - Vergelijkbaar met Sponsor, maar dan voor onbetaalde of zelfpromotie. Inclusief secties over merchandise, donaties of informatie over met wie ze hebben samengewerkt - Interactieherinnering (abonneren) - Een korte herinnering om te liken, te abonneren of te volgen tussen de inhoud in. Als het lang of iets specifieks is, moet het in plaats daarvan onder zelfpromotie vallen - Markeren - Het deel van de video waar de meeste mensen naar op zoek zijn - Pauze/Intro-animatie - Een interval zonder daadwerkelijke inhoud. Kan een pauze, statisch frame of een herhalende animatie zijn. Bevat geen overgangen met informatie - Eindkaarten / Credits - Credits of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie - Intro / Groeten - Vertelde trailers voor de aanstaande video, groeten en afscheid. Exclusief secties die extra inhoud toevoegen - Voorbeeld / Samenvatting - Collectie van clips die laten zien wat er gaat komen of wat er in de video of in andere video\'s van een serie is gebeurd, waar alle informatie elders wordt herhaald - Terzijde / Grappen - Tangentiaële scènes of grappen die niet nodig zijn om de hoofdinhoud van de video te begrijpen. Exclusief secties die context of achtergronddetails bieden - Muziek: Niet-muziekgedeelte - Alleen voor gebruik in muziekvideo\'s. Secties van muziekvideo\'s zonder muziek, die niet al onder een andere categorie vallen - Overslaan - Markeren - Sponsor overslaan - Promo overslaan - Interactie overslaan - Naar markering overslaan - Intro overslaan - Pauze overslaan - Pauze overslaan - Outro overslaan - Haakje overslaan - Voorbeeld overslaan - Voorbeeld overslaan - Samenvatting overslaan - Tangent overslaan - Niet-muziek overslaan - Segment overslaan - Sponsor overgeslagen - Zelfpromotie overgeslagen - Vervelende herinnering overgeslagen - Naar markering overgeslagen - Intro overgeslagen - Pauze overgeslagen - Pauze overgeslagen - Outro overgeslagen - Haakje overgeslagen - Voorbeeld overgeslagen - Voorbeeld overgeslagen - Samenvatting overgeslagen - Tangent overgeslagen - Een niet-muzieksectie overgeslagen - Niet-ingediend segment overgeslagen - Meerdere segmenten overgeslagen - Automatisch overslaan - Eén keer automatisch overslaan - Een Skip-knop weergeven - Toon in zoekbalk - Uitschakelen - Kan segment niet indienen: %s - SponsorBlock is tijdelijk niet beschikbaar - Kan segment niet indienen (status: %1$d %2$s) - Kan segment niet verzenden. Snelheidsbeperking (te veel van dezelfde gebruiker of IP) - Kan het segment niet indienen: %s - "Kan het segment niet verzenden. + Niet meer tonen + Verander het segmentgedrag + Betaalde promotie, betaalde verwijzingen en directe advertenties. Niet voor zelfpromotie of gratis shout-outs naar oorzaken/makers/websites/producten die ze leuk vinden + Onbetaalde/Zelfpromotie + Vergelijkbaar met Sponsor, maar dan voor onbetaalde of zelfpromotie. Inclusief secties over merchandise, donaties of informatie over met wie ze hebben samengewerkt + Interactieherinnering (abonneren) + Een korte herinnering om te liken, te abonneren of te volgen tussen de inhoud in. Als het lang of iets specifieks is, moet het in plaats daarvan onder zelfpromotie vallen + Markeren + Het deel van de video waar de meeste mensen naar op zoek zijn + Pauze/Intro-animatie + Een interval zonder daadwerkelijke inhoud. Kan een pauze, statisch frame of een herhalende animatie zijn. Bevat geen overgangen met informatie + Eindkaarten / Credits + Credits of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie + Intro / Groeten + Vertelde trailers voor de aanstaande video, groeten en afscheid. Exclusief secties die extra inhoud toevoegen + Voorbeeld / Samenvatting + Collectie van clips die laten zien wat er gaat komen of wat er in de video of in andere video\'s van een serie is gebeurd, waar alle informatie elders wordt herhaald + Terzijde / Grappen + Tangentiaële scènes of grappen die niet nodig zijn om de hoofdinhoud van de video te begrijpen. Exclusief secties die context of achtergronddetails bieden + Muziek: Niet-muziekgedeelte + Alleen voor gebruik in muziekvideo\'s. Secties van muziekvideo\'s zonder muziek, die niet al onder een andere categorie vallen + Overslaan + Markeren + Sponsor overslaan + Promo overslaan + Interactie overslaan + Naar markering overslaan + Intro overslaan + Pauze overslaan + Pauze overslaan + Outro overslaan + Haakje overslaan + Voorbeeld overslaan + Voorbeeld overslaan + Samenvatting overslaan + Tangent overslaan + Niet-muziek overslaan + Segment overslaan + Sponsor overgeslagen + Zelfpromotie overgeslagen + Vervelende herinnering overgeslagen + Naar markering overgeslagen + Intro overgeslagen + Pauze overgeslagen + Pauze overgeslagen + Outro overgeslagen + Haakje overgeslagen + Voorbeeld overgeslagen + Voorbeeld overgeslagen + Samenvatting overgeslagen + Tangent overgeslagen + Een niet-muzieksectie overgeslagen + Niet-ingediend segment overgeslagen + Meerdere segmenten overgeslagen + Automatisch overslaan + Eén keer automatisch overslaan + Een Skip-knop weergeven + Toon in zoekbalk + Uitschakelen + Kan segment niet indienen: %s + SponsorBlock is tijdelijk niet beschikbaar + Kan segment niet indienen (status: %1$d %2$s) + Kan segment niet verzenden. Snelheidsbeperking (te veel van dezelfde gebruiker of IP) + Kan het segment niet indienen: %s + "Kan het segment niet verzenden. Bestaat al" - Segment succesvol ingediend - - SponsorBlock tijdelijk niet beschikbaar (API-time-out) - SponsorBlock is tijdelijk niet beschikbaar (status %d) - SponsorBlock is tijdelijk niet beschikbaar - Kan niet voor segment stemmen (API-time-out) - Kan niet voor segment stemmen (status: %1$d %2$s) - Kan niet voor segment stemmen: %s - Stem omhoog - Stem omlaag - Verander categorie - Er zijn geen segmenten om voor te stemmen - - %1$s tot %2$s - Kies de segmentcategorie - Categorie is uitgeschakeld in de instellingen. Schakel de categorie in om in te dienen. - Nieuw SponsorBlock-segment - %s instellen als begin of einde van een nieuw segment? - Einde - Nu - Tijd waarop het segment begint - Tijd waarop het segment eindigt - Zijn de tijden correct? - "Het segment is van + Segment succesvol ingediend + + SponsorBlock tijdelijk niet beschikbaar (API-time-out) + SponsorBlock is tijdelijk niet beschikbaar (status %d) + SponsorBlock is tijdelijk niet beschikbaar + Kan niet voor segment stemmen (API-time-out) + Kan niet voor segment stemmen (status: %1$d %2$s) + Kan niet voor segment stemmen: %s + Stem omhoog + Stem omlaag + Verander categorie + Er zijn geen segmenten om voor te stemmen + + %1$s tot %2$s + Kies de segmentcategorie + Categorie is uitgeschakeld in de instellingen. Schakel de categorie in om in te dienen. + Nieuw SponsorBlock-segment + %s instellen als begin of einde van een nieuw segment? + Einde + Nu + Tijd waarop het segment begint + Tijd waarop het segment eindigt + Zijn de tijden correct? + "Het segment is van %1$s naar @@ -1277,45 +1276,45 @@ naar (%3$s) Klaar om in te dienen?" - Begin moet vóór het einde zijn - Markeer eerst twee locaties op de tijdbalk - Bekijk het segment en zorg ervoor dat het soepel overslaat - Bewerk timing van segment handmatig - Wil je de timing van het begin of einde van het segment bewerken? - Ongeldige tijd opgegeven - Statistieken - - Statistieken zijn tijdelijk niet beschikbaar (API is down) - Bezig met laden... - SponsorBlock is uitgeschakeld - Uw gebruikersnaam: <b>%s</b> - Tik hier om uw gebruikersnaam te wijzigen - Kan gebruikersnaam niet wijzigen: Status: %1$d %2$s - Gebruikersnaam succesvol gewijzigd - Uw reputatie is <b>%.2f</b> - U heeft <b>%s</b> segmenten gemaakt - Tik hier om uw segmenten te bekijken - SponsorBlock-klassement - U heeft mensen van <b>%s</b> segmenten gered - Tik hier om de globale statistieken en top-bijdragers te bekijken - Dat is <b>%s</b> van hun leven. <br> klik hier om het scorebord te zien - U heeft <b>%s</b> segmenten overgeslagen - Dat is <b>%s</b> - Teller voor overgeslagen segmenten resetten? - %1$s uren %2$s minuten - %1$s minuten %2$s seconden - %s seconden - Ondoorzichtigheid: - Kleur: - Over - Gegevens worden geleverd door de SponsorBlock API. Tik hier om meer te weten te komen en downloads te bekijken voor andere platforms - - - Indelingsvormfactor - Standaard - Telefoon - Automobiel - "Wijzigingen omvatten: + Begin moet vóór het einde zijn + Markeer eerst twee locaties op de tijdbalk + Bekijk het segment en zorg ervoor dat het soepel overslaat + Bewerk timing van segment handmatig + Wil je de timing van het begin of einde van het segment bewerken? + Ongeldige tijd opgegeven + Statistieken + + Statistieken zijn tijdelijk niet beschikbaar (API is down) + Bezig met laden... + SponsorBlock is uitgeschakeld + Uw gebruikersnaam: <b>%s</b> + Tik hier om uw gebruikersnaam te wijzigen + Kan gebruikersnaam niet wijzigen: Status: %1$d %2$s + Gebruikersnaam succesvol gewijzigd + Uw reputatie is <b>%.2f</b> + U heeft <b>%s</b> segmenten gemaakt + Tik hier om uw segmenten te bekijken + SponsorBlock-klassement + U heeft mensen van <b>%s</b> segmenten gered + Tik hier om de globale statistieken en top-bijdragers te bekijken + Dat is <b>%s</b> van hun leven. <br> klik hier om het scorebord te zien + U heeft <b>%s</b> segmenten overgeslagen + Dat is <b>%s</b> + Teller voor overgeslagen segmenten resetten? + %1$s uren %2$s minuten + %1$s minuten %2$s seconden + %s seconden + Ondoorzichtigheid: + Kleur: + Over + Gegevens worden geleverd door de SponsorBlock API. Tik hier om meer te weten te komen en downloads te bekijken voor andere platforms + + + Indelingsvormfactor + Standaard + Telefoon + Automobiel + "Wijzigingen omvatten: Tablet lay-out • Community posts zijn verborgen @@ -1323,305 +1322,303 @@ Tablet lay-out Automotive lay-out • Shorts worden geopend in de normale speler • Feed is georganiseerd op onderwerp en kanalen" - - - App-versie vervalsen - Versie vervalst - Versie niet vervalst - "App-versie wordt gespoofed naar een oudere versie van YouTube. + + + App-versie vervalsen + Versie vervalst + Versie niet vervalst + "App-versie wordt gespoofed naar een oudere versie van YouTube. Dit zal het uiterlijk en de functies van de app veranderen, maar er kunnen onbekende neveneffecten optreden. Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen om UI-fouten te voorkomen." - Doel voor vervalsen app-versie - 20.13.41 - Herstel niet-ingeklapte videobalk - 20.05.46 - Transcriptfunctionaliteit herstellen - 19.35.36 - Herstel oude pictogrammen voor Shorts-speler - 19.01.34 - Herstel oude navigatie-iconen - - - Startpagina wijzigen - Standaard - Alle abonnementen - Kanalen browsen - Cursussen / Leren - Verkennen - Mode & Beauty - Gamen - Geschiedenis - Bibliotheek - Gelikte video\'s - Films - Muziek - Nieuws - Meldingen - Afspeellijsten - Zoeken - Winkelen - Sport - Abonnements - Trends - Virtuele realiteit - Later bekijken - Je clips - Startpagina altijd wijzigen - "De startpagina wordt altijd gewijzigd\n\nBeperking: Het gebruik van de terugknop op de werkbalk werkt mogelijk niet" - Startpagina wordt alleen gewijzigd bij het opstarten van de app - - - Schakel het hervatten van Shorts-speler uit - Shorts-speler wordt niet hervat bij het opstarten van de app - Shorts-speler wordt hervat bij het opstarten van de app - - - Shorts openen met - Shorts-speler - Normale speler - Normale speler op volledig scherm - - - Shorts automatisch afspelen - Shorts worden automatisch afgespeeld - Shorts worden herhaald - Automatisch afspelen van Shorts op de achtergrond - Shorts op de achtergrond worden automatisch afgespeeld - Shorts op de achtergrond worden herhaald - - - Minispeler - De stijl van de geminimaliseerde speler in de app wijzigen - \"miniplayer\"-type - Uitgeschakeld - Standaard - Minimaal - Afgeronde hoeken uitschakelen - Hoeken zijn vierkant - Hoeken zijn afgerond - Schakel dubbeltikken en knijpen om te verkleinen in - "Dubbeltikactie en knijpen om te verkleinen is ingeschakeld + Doel voor vervalsen app-versie + 20.13.41 - Herstel niet-ingeklapte videobalk + 20.05.46 - Transcriptfunctionaliteit herstellen + 19.35.36 - Herstel oude pictogrammen voor Shorts-speler + 19.01.34 - Herstel oude navigatie-iconen + + + Startpagina wijzigen + Standaard + Alle abonnementen + Kanalen browsen + Cursussen / Leren + Verkennen + Mode & Beauty + Gamen + Geschiedenis + Bibliotheek + Gelikte video\'s + Films + Muziek + Nieuws + Meldingen + Afspeellijsten + Zoeken + Winkelen + Sport + Abonnements + Trends + Virtuele realiteit + Later bekijken + Je clips + Startpagina altijd wijzigen + "De startpagina wordt altijd gewijzigd\n\nBeperking: Het gebruik van de terugknop op de werkbalk werkt mogelijk niet" + Startpagina wordt alleen gewijzigd bij het opstarten van de app + + + Schakel het hervatten van Shorts-speler uit + Shorts-speler wordt niet hervat bij het opstarten van de app + Shorts-speler wordt hervat bij het opstarten van de app + + + Shorts openen met + Shorts-speler + Normale speler + Normale speler op volledig scherm + + + Shorts automatisch afspelen + Shorts worden automatisch afgespeeld + Shorts worden herhaald + Automatisch afspelen van Shorts op de achtergrond + Shorts op de achtergrond worden automatisch afgespeeld + Shorts op de achtergrond worden herhaald + + + Minispeler + De stijl van de geminimaliseerde speler in de app wijzigen + \"miniplayer\"-type + Uitgeschakeld + Standaard + Minimaal + Afgeronde hoeken uitschakelen + Hoeken zijn vierkant + Hoeken zijn afgerond + Schakel dubbeltikken en knijpen om te verkleinen in + "Dubbeltikactie en knijpen om te verkleinen is ingeschakeld • Dubbeltik om de miniplayer-grootte te vergroten • Dubbeltik opnieuw om de oorspronkelijke grootte te herstellen" - Dubbeltikken en knijpen om te verkleinen is uitgeschakeld - Slepen en neerzetten uitschakelen - Slepen en neerzetten is uitgeschakeld - "Sleep-en-neerzetten is ingeschakeld + Dubbeltikken en knijpen om te verkleinen is uitgeschakeld + Slepen en neerzetten uitschakelen + Slepen en neerzetten is uitgeschakeld + "Sleep-en-neerzetten is ingeschakeld De miniplayer kan naar elke hoek van het scherm worden gesleept" - Horizontale sleepbeweging uitschakelen - Horizontaal sleepgebaar uitgeschakeld - "Horizontale sleepbeweging ingeschakeld + Horizontale sleepbeweging uitschakelen + Horizontaal sleepgebaar uitgeschakeld + "Horizontale sleepbeweging ingeschakeld De miniplayer kan naar links of rechts van het scherm worden gesleept" - Overlayknoppen verbergen - Overlayknoppen zijn verborgen - Overlayknoppen worden weergegeven - Verberg subteksten - Subteksten zijn verborgen - Subteksten zijn zichtbaar - Verberg knoppen voor door- en terugspoelen - Door- en terugspoelen zijn verborgen - Door- en terugspoelen zijn zichtbaar - Beginmaat - Beginmaat op het scherm, in pixels - Pixelgrootte moet tussen %1$s en %2$s zijn - Dekking van de overlay - De waarde van de dekking moet tussen 0-100 liggen, waarbij 0 transparant is - Minispeler overlay transparantie moet tussen de 0-100 zijn - - - Schakel het laden van het verloopscherm in - Het laadscherm heeft een verlopende achtergrond - Het laadscherm heeft een effen achtergrond - Stijl van opstartscherm - Kleur - Zwart-wit - Schakel aangepaste schuifregelaar kleur in - De aangepaste kleur van de schuifregelaar is zichtbaar - De oorspronkelijke kleur van de schuifregelaar is zichtbaar - Aangepaste kleur van de zoekbalk - De kleur van de zoekbalk - Aangepaste accentkleur van de zoekbalk - De accentkleur van de zoekbalk - Ongeldige waarde voor de kleur van de schuifregelaar - - - - - Headerlogo - Standaard - Normaal - - ReVanced minimaal - Aangepast - - - Omzeil beperkingen voor het weergeven van afbeeldingen in bepaalde regio\'s - Gebruik de afbeeldinghost yt4.ggpht.com - "Gebruik oorspronkelijke afbeeldingshost + Overlayknoppen verbergen + Overlayknoppen zijn verborgen + Overlayknoppen worden weergegeven + Verberg subteksten + Subteksten zijn verborgen + Subteksten zijn zichtbaar + Verberg knoppen voor door- en terugspoelen + Door- en terugspoelen zijn verborgen + Door- en terugspoelen zijn zichtbaar + Beginmaat + Beginmaat op het scherm, in pixels + Pixelgrootte moet tussen %1$s en %2$s zijn + Dekking van de overlay + De waarde van de dekking moet tussen 0-100 liggen, waarbij 0 transparant is + Minispeler overlay transparantie moet tussen de 0-100 zijn + + + Schakel het laden van het verloopscherm in + Het laadscherm heeft een verlopende achtergrond + Het laadscherm heeft een effen achtergrond + Stijl van opstartscherm + Kleur + Zwart-wit + Schakel aangepaste schuifregelaar kleur in + De aangepaste kleur van de schuifregelaar is zichtbaar + De oorspronkelijke kleur van de schuifregelaar is zichtbaar + Aangepaste kleur van de zoekbalk + De kleur van de zoekbalk + Aangepaste accentkleur van de zoekbalk + De accentkleur van de zoekbalk + Ongeldige waarde voor de kleur van de schuifregelaar + + + + Headerlogo + Standaard + Normaal + + ReVanced minimaal + Aangepast + + + Omzeil beperkingen voor het weergeven van afbeeldingen in bepaalde regio\'s + Gebruik de afbeeldinghost yt4.ggpht.com + "Gebruik oorspronkelijke afbeeldingshost Het inschakelen hiervan kan ontbrekende afbeeldingen oplossen die in sommige regio's worden geblokkeerd" - - - - \"Home\"-tabblad - - Tabblad Abonnementen - - \"Jij\"-tabblad - Afspeellijsten & aanbevelingen van speler - Zoekresultaten - Oorspronkelijke miniaturen - DeArrow & Oorspronkelijke miniaturen - DeArrow & Stilstaande opnames - Stilstaande opnames - "DeArrow biedt door de menigte gecrowdsourcede miniaturen voor YouTube-video's. Deze miniaturen zijn vaak relevanter dan die van YouTube. + + + + \"Home\"-tabblad + + Tabblad Abonnementen + + \"Jij\"-tabblad + Afspeellijsten & aanbevelingen van speler + Zoekresultaten + Oorspronkelijke miniaturen + DeArrow & Oorspronkelijke miniaturen + DeArrow & Stilstaande opnames + Stilstaande opnames + "DeArrow biedt door de menigte gecrowdsourcede miniaturen voor YouTube-video's. Deze miniaturen zijn vaak relevanter dan die van YouTube. Als dit is ingeschakeld, worden video-URL's naar de API-server verzonden en worden geen andere gegevens verzonden. Als een video geen DeArrow-miniaturen heeft, worden de originele of stilstaande opnames weergegeven. Tik hier om meer te weten te komen over DeArrow" - Toon een \"toast\" als de API niet beschikbaar is - \"Toast\" wordt weergegeven als DeArrow niet beschikbaar is - \"Toast\" wordt niet weergegeven als DeArrow niet beschikbaar is - DeArrow API-eindpunt - De URL van het DeArrow-miniaturencache-eindpunt - Stilstaande video-opnames - Nog steeds opgenomen worden vanaf het begin/midden/einde van elke video. Deze afbeeldingen zijn in YouTube ingebouwd en er wordt geen externe API gebruikt - Gebruik snelle stilstaande opnames - Gebruik stilstaande opnames van gemiddelde kwaliteit. Miniaturen worden sneller geladen, maar live-streams, niet-uitgebrachte of zeer oude video\'s kunnen lege miniaturen weergeven - Gebruik stilstaande opnames van hoge kwaliteit - Tijdstip in video om stilstaande opnames van te maken - Begin van video - Midden van video - Einde van video - - DeArrow is tijdelijk niet beschikbaar (statuscode: %s) - DeArrow is tijdelijk niet beschikbaar - - - Toon ReVanced aankondigingen - Aankondigingen bij opstarten worden weergegeven - Aankondigingen bij opstarten worden niet weergegeven - Toon aankondigingen bij het opstarten - Kan geen verbinding maken met de leverancier van aankondigingen - Afwijzen - - - Loopvideo inschakelen - Video zal herhalen - Video zal niet herhalen - - - Knop voor loopvideo weergeven - Knop wordt weergegeven - Knop wordt niet weergegeven - Loopvideo is ingeschakeld - Loopvideo is uitgeschakeld - - - - - Spoof apparaatdimensies - "Apparaatdimensies gespoofed + Toon een \"toast\" als de API niet beschikbaar is + \"Toast\" wordt weergegeven als DeArrow niet beschikbaar is + \"Toast\" wordt niet weergegeven als DeArrow niet beschikbaar is + DeArrow API-eindpunt + De URL van het DeArrow-miniaturencache-eindpunt + Stilstaande video-opnames + Nog steeds opgenomen worden vanaf het begin/midden/einde van elke video. Deze afbeeldingen zijn in YouTube ingebouwd en er wordt geen externe API gebruikt + Gebruik snelle stilstaande opnames + Gebruik stilstaande opnames van gemiddelde kwaliteit. Miniaturen worden sneller geladen, maar live-streams, niet-uitgebrachte of zeer oude video\'s kunnen lege miniaturen weergeven + Gebruik stilstaande opnames van hoge kwaliteit + Tijdstip in video om stilstaande opnames van te maken + Begin van video + Midden van video + Einde van video + + DeArrow is tijdelijk niet beschikbaar (statuscode: %s) + DeArrow is tijdelijk niet beschikbaar + + + Toon ReVanced aankondigingen + Aankondigingen bij opstarten worden weergegeven + Aankondigingen bij opstarten worden niet weergegeven + Toon aankondigingen bij het opstarten + Kan geen verbinding maken met de leverancier van aankondigingen + Afwijzen + + + Loopvideo inschakelen + Video zal herhalen + Video zal niet herhalen + + + Knop voor loopvideo weergeven + Knop wordt weergegeven + Knop wordt niet weergegeven + Loopvideo is ingeschakeld + Loopvideo is uitgeschakeld + + + + Spoof apparaatdimensies + "Apparaatdimensies gespoofed Hogere videokwaliteiten kunnen worden ontgrendeld, maar u kunt video-playback haperen, een slechtere batterijduur en onbekende neveneffecten ervaren" - "Apparaatdimensies niet gespoofed + "Apparaatdimensies niet gespoofed Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen" - Het inschakelen hiervan kan haperingen tijdens het afspelen van video\'s, een kortere batterijduur en onbekende bijwerkingen veroorzaken. - - - Haptische feedback - Haptische feedback wijzigen - Hoofdstuk-haptiek uitschakelen - Hoofdstuk-haptiek is uitgeschakeld - Hoofdstuk-haptiek is ingeschakeld - Precisie-zoekhaptiek uitschakelen - Precieze haptiek voor zoeken is uitgeschakeld - Precisie-zoekhaptiek is ingeschakeld - Haptiek voor ongedaan maken van zoeken uitschakelen - Haptiek voor ongedaan maken van zoeken is uitgeschakeld - Haptiek voor ongedaan maken van zoeken is ingeschakeld - Zoom-haptics uitschakelen - Zoom-haptics is uitgeschakeld - Zoom-haptics is ingeschakeld - - - Als u onlangs de inloggegevens van uw account hebt gewijzigd, verwijder dan MicroG en installeer het opnieuw. - - - Omzeil URL-omleidingen - URL-omleidingen worden omzeild - URL-doorverwijzingen worden niet omzeild - - - Koppelingen openen in browser - Koppelingen openen in externe browser - Koppelingen openen in in-app browser - - - - Automatisch - Onthoud wijzigingen in videokwaliteit - Kwaliteitswijzigingen worden op alle video\'s toegepast - Kwaliteitswijzigingen worden alleen op de huidige video toegepast - Toon melding bij wijzigingen in videokwaliteit - Er wordt een melding getoond wanneer de standaard videokwaliteit wordt gewijzigd - Er wordt geen melding getoond wanneer de standaard videokwaliteit wordt gewijzigd - Standaard videokwaliteit op Wi-Fi-netwerk - Standaard videokwaliteit op mobiel netwerk - Onthoud kwaliteitswijzigingen voor Shorts - Kwaliteitswijzigingen zijn van toepassing op alle Shorts - Kwaliteitswijzigingen zijn alleen van toepassing op de huidige Short - Standaardkwaliteit voor Shorts op wifi-netwerk - Standaardkwaliteit voor Shorts op mobiel netwerk - mobiel - Standaard %1$s-kwaliteit gewijzigd naar: %2$s - De kwaliteit van Shorts %1$s is gewijzigd in: %2$s - - - Snelheidsdialoogknop weergeven - Knop \'Snelheidsdialoogvenster\' wordt weergegeven. Tik en houd vast om de afspeelsnelheid terug te zetten naar standaard - Knop \'Snelheidsdialoogvenster\' wordt niet weergegeven - - - Toon videokwaliteitknop - Knop \'Videokwaliteit\' wordt weergegeven. Tik en houd vast om de kwaliteit terug te zetten naar standaard - Knop \'Videokwaliteit\' wordt niet weergegeven - - - Menu voor aangepaste afspeelsnelheid - Menu voor aangepaste snelheid wordt weergegeven - Menu voor aangepaste snelheid wordt niet weergegeven - Oud afspeelsnelheidsmenu herstellen - Oud snelheidsmenu wordt getoond - Modern snelheidsmenu wordt getoond - Aangepaste afspeelsnelheden - Voeg aangepaste afspeelsnelheden toe of wijzig ze - Aangepaste snelheden moeten lager zijn dan %s - Ongeldige aangepaste afspeelsnelheden - Automatisch - De snelheid van aangepast tikken en vasthouden - Afspeelsnelheid tussen 0-8 - - - Onthoud wijzigingen in afspeelsnelheid - Wijzigingen in afspeelsnelheid worden op alle video\'s toegepast - Wijzigingen in afspeelsnelheid worden alleen op de huidige video toegepast - Toon melding bij wijzigingen in afspeelsnelheid - Er wordt een melding getoond wanneer de standaard afspeelsnelheid wordt gewijzigd - Een toast wordt niet weergegeven wanneer de standaard afspeelsnelheid wordt gewijzigd - Standaard afspeelsnelheid - Standaard snelheid gewijzigd naar: %s - - - HDR-video uitschakelen - HDR-video is uitgeschakeld - HDR-video is ingeschakeld - Forceer AVC (H.264) - Videocodec wordt geforceerd naar AVC (H.264) - Videocodec wordt automatisch bepaald - "Voordelen: + Het inschakelen hiervan kan haperingen tijdens het afspelen van video\'s, een kortere batterijduur en onbekende bijwerkingen veroorzaken. + + + Haptische feedback + Haptische feedback wijzigen + Hoofdstuk-haptiek uitschakelen + Hoofdstuk-haptiek is uitgeschakeld + Hoofdstuk-haptiek is ingeschakeld + Precisie-zoekhaptiek uitschakelen + Precieze haptiek voor zoeken is uitgeschakeld + Precisie-zoekhaptiek is ingeschakeld + Haptiek voor ongedaan maken van zoeken uitschakelen + Haptiek voor ongedaan maken van zoeken is uitgeschakeld + Haptiek voor ongedaan maken van zoeken is ingeschakeld + Zoom-haptics uitschakelen + Zoom-haptics is uitgeschakeld + Zoom-haptics is ingeschakeld + + + Als u onlangs de inloggegevens van uw account hebt gewijzigd, verwijder dan MicroG en installeer het opnieuw. + + + Omzeil URL-omleidingen + URL-omleidingen worden omzeild + URL-doorverwijzingen worden niet omzeild + + + Koppelingen openen in browser + Koppelingen openen in externe browser + Koppelingen openen in in-app browser + + + + Automatisch + Onthoud wijzigingen in videokwaliteit + Kwaliteitswijzigingen worden op alle video\'s toegepast + Kwaliteitswijzigingen worden alleen op de huidige video toegepast + Toon melding bij wijzigingen in videokwaliteit + Er wordt een melding getoond wanneer de standaard videokwaliteit wordt gewijzigd + Er wordt geen melding getoond wanneer de standaard videokwaliteit wordt gewijzigd + Standaard videokwaliteit op Wi-Fi-netwerk + Standaard videokwaliteit op mobiel netwerk + Onthoud kwaliteitswijzigingen voor Shorts + Kwaliteitswijzigingen zijn van toepassing op alle Shorts + Kwaliteitswijzigingen zijn alleen van toepassing op de huidige Short + Standaardkwaliteit voor Shorts op wifi-netwerk + Standaardkwaliteit voor Shorts op mobiel netwerk + mobiel + Standaard %1$s-kwaliteit gewijzigd naar: %2$s + De kwaliteit van Shorts %1$s is gewijzigd in: %2$s + + + Snelheidsdialoogknop weergeven + Knop \'Snelheidsdialoogvenster\' wordt weergegeven. Tik en houd vast om de afspeelsnelheid terug te zetten naar standaard + Knop \'Snelheidsdialoogvenster\' wordt niet weergegeven + + + Toon videokwaliteitknop + Knop \'Videokwaliteit\' wordt weergegeven. Tik en houd vast om de kwaliteit terug te zetten naar standaard + Knop \'Videokwaliteit\' wordt niet weergegeven + + + Menu voor aangepaste afspeelsnelheid + Menu voor aangepaste snelheid wordt weergegeven + Menu voor aangepaste snelheid wordt niet weergegeven + Oud afspeelsnelheidsmenu herstellen + Oud snelheidsmenu wordt getoond + Modern snelheidsmenu wordt getoond + Aangepaste afspeelsnelheden + Voeg aangepaste afspeelsnelheden toe of wijzig ze + Aangepaste snelheden moeten lager zijn dan %s + Ongeldige aangepaste afspeelsnelheden + Automatisch + De snelheid van aangepast tikken en vasthouden + Afspeelsnelheid tussen 0-8 + + + Onthoud wijzigingen in afspeelsnelheid + Wijzigingen in afspeelsnelheid worden op alle video\'s toegepast + Wijzigingen in afspeelsnelheid worden alleen op de huidige video toegepast + Toon melding bij wijzigingen in afspeelsnelheid + Er wordt een melding getoond wanneer de standaard afspeelsnelheid wordt gewijzigd + Een toast wordt niet weergegeven wanneer de standaard afspeelsnelheid wordt gewijzigd + Standaard afspeelsnelheid + Standaard snelheid gewijzigd naar: %s + + + HDR-video uitschakelen + HDR-video is uitgeschakeld + HDR-video is ingeschakeld + Forceer AVC (H.264) + Videocodec wordt geforceerd naar AVC (H.264) + Videocodec wordt automatisch bepaald + "Voordelen: • Kan de levensduur van de batterij verbeteren • Kan ontbrekende videoresoluties op oudere apparaten herstellen @@ -1630,178 +1627,177 @@ Beperkingen: • Het afspelen van video verbruikt meer internetdata dan VP9 of AV1 • HDR-video's gebruiken geen AVC • Sommige apparaten kunnen AVC niet forceren" - - - Geavanceerd menu voor videokwaliteit weergeven - Geavanceerd menu voor videokwaliteit wordt weergegeven - Geavanceerd menu voor videokwaliteit wordt niet weergegeven - - - Schuiven om te zoeken inschakelen - Schuiven om te zoeken is ingeschakeld - Schuiven om te zoeken is niet ingeschakeld - - - Sta Android VR AV1 toe - "Videocodec is AVC (H.264), VP9 of AV1 + + + Geavanceerd menu voor videokwaliteit weergeven + Geavanceerd menu voor videokwaliteit wordt weergegeven + Geavanceerd menu voor videokwaliteit wordt niet weergegeven + + + Schuiven om te zoeken inschakelen + Schuiven om te zoeken is ingeschakeld + Schuiven om te zoeken is niet ingeschakeld + + + Sta Android VR AV1 toe + "Videocodec is AVC (H.264), VP9 of AV1 Afspelen kan haperen of frames overslaan" - Videocodec is AVC (H.264) of VP9 - "Het inschakelen van deze instelling kan gebruikmaken van softwarematige AV1-decodering. + Videocodec is AVC (H.264) of VP9 + "Het inschakelen van deze instelling kan gebruikmaken van softwarematige AV1-decodering. Het afspelen van video met AV1 kan haperen of frames overslaan." - Spoofing-neveneffecten - • Experimentele client en kan elk moment stoppen met werken - • Video kan stoppen om 1:00, of is mogelijk niet beschikbaar in sommige regio\'s - • Audiotrack-menu ontbreekt - • Geen AV1-videocodec - • Stabiel volume is niet beschikbaar - • \"Kinder\"​-Video’s worden mogelijk niet afgespeeld wanneer u bent uitgelogd of de incognitomodus gebruikt - - • Oorspronkelijke audio forceren is niet beschikbaar - Weergeven in Stats for nerds - Het clienttype wordt getoond in Stats for nerds - Client is verborgen in Stats for nerds - - - - - - - Over - Advertenties - Algemeen - Speler - Overige - - - Videoadvertenties verbergen - Videoadvertenties zijn verborgen - Videoadvertenties worden weergegeven - - - Permanent herhalen inschakelen - Permanent herhalen is ingeschakeld - Permanent herhalen is uitgeschakeld - - - Cast-knop verbergen - Cast-knop is verborgen - Cast-knop is weergegeven - Geschiedenisknop verbergen - Geschiedenisknop is verborgen - Geschiedenisknop wordt weergegeven - Meldingsknop verbergen - Meldingsknop is verborgen - Meldingsknop is weergegeven - Zoekknop verbergen - Zoekknop is verborgen - Zoekknop is weergegeven - - - Categoriebalk verbergen - Categoriebalk is verborgen - Categoriebalk wordt weergegeven - - - Wijzig miniplayerkleur - Miniplayerkleur komt overeen met de volledigschermspeler - Miniplayer gebruikt standaardkleur - - - Navigatiebalk - Navigatiebalkknoppen verbergen of wijzigen - - Startpagina verbergen - Startknop is verborgen - Startknop wordt weergegeven - - Fragmenten verbergen - Knop Voorbeelden is verborgen - Knop Voorbeelden wordt weergegeven - - Verberg Ontdekken - Knop Ontdekken is verborgen - Knop Ontdekken wordt weergegeven - - Verberg Bibliotheek - Knop Bibliotheek is verborgen - Knop Bibliotheek wordt weergegeven - - Verberg Upgraden - Upgrade-knop is verborgen - Upgrade-knop wordt weergegeven - Navigatiebalk verbergen - Navigatiebalk is verborgen - Navigatiebalk wordt weergegeven - Labels van navigatieknoppen verbergen - Labels zijn verborgen - Labels worden weergegeven - - - \'Muziek Premium krijgen\' label verbergen - Label is verborgen - Label wordt weergegeven - - - Upgrade-knop verbergen - Knop is verborgen - Knop wordt weergegeven - - - - - Blokkeer audio-advertenties - Audio-advertenties zijn geblokkeerd - Audio-advertenties zijn niet geblokkeerd - - - %s niet beschikbaar, advertenties kunnen worden weergegeven. Probeer de advertentieblokkeerservice in de instellingen te wijzigen. - %s heeft een fout geretourneerd, advertenties kunnen worden weergegeven. Probeer de advertentieblokkeerservice in de instellingen te wijzigen. - Blokkeer ingesloten videoadvertenties - Uitgeschakeld - Luminous-proxy - PurpleAdBlock-proxy - - - Blokkeer video-advertenties - Video-advertenties zijn geblokkeerd - Video-advertenties zijn niet geblokkeerd - - - Bericht verwijderd - Toon verwijderde berichten - Toon geen verwijderde berichten - Verberg verwijderde berichten achter een spoiler - Toon verwijderde berichten als doorgestreept tekst - - - Claim Channel Points automatisch - Channel Points worden automatisch geclaimd - Channel Points worden niet automatisch geclaimd - - - - Schakel Twitch debug-modus in - Twitch debug-modus is ingeschakeld (niet aanbevolen) - Twitch debug-modus is uitgeschakeld - - - ReVanced-instellingen - Over - Over ReVanced - Advertentieblokkering - Instellingen advertentieblokkering - Chat-instellingen - Overige - Diverse instellingen - Algemene instellingen - Andere instellingen - Client-side advertenties - Server-side surestream-advertenties - Logboek foutopsporing - Debug logboeken zijn ingeschakeld - Debug logboeken zijn uitgeschakeld - - + Spoofing-neveneffecten + • Experimentele client en kan elk moment stoppen met werken + • Video kan stoppen om 1:00, of is mogelijk niet beschikbaar in sommige regio\'s + • Audiotrack-menu ontbreekt + • Geen AV1-videocodec + • Stabiel volume is niet beschikbaar + • \"Kinder\"​-Video’s worden mogelijk niet afgespeeld wanneer u bent uitgelogd of de incognitomodus gebruikt + + • Oorspronkelijke audio forceren is niet beschikbaar + Weergeven in Stats for nerds + Het clienttype wordt getoond in Stats for nerds + Client is verborgen in Stats for nerds + + + + + + Over + Advertenties + Algemeen + Speler + Overige + + + Videoadvertenties verbergen + Videoadvertenties zijn verborgen + Videoadvertenties worden weergegeven + + + Permanent herhalen inschakelen + Permanent herhalen is ingeschakeld + Permanent herhalen is uitgeschakeld + + + Cast-knop verbergen + Cast-knop is verborgen + Cast-knop is weergegeven + Geschiedenisknop verbergen + Geschiedenisknop is verborgen + Geschiedenisknop wordt weergegeven + Meldingsknop verbergen + Meldingsknop is verborgen + Meldingsknop is weergegeven + Zoekknop verbergen + Zoekknop is verborgen + Zoekknop is weergegeven + + + Categoriebalk verbergen + Categoriebalk is verborgen + Categoriebalk wordt weergegeven + + + Wijzig miniplayerkleur + Miniplayerkleur komt overeen met de volledigschermspeler + Miniplayer gebruikt standaardkleur + + + Navigatiebalk + Navigatiebalkknoppen verbergen of wijzigen + + Startpagina verbergen + Startknop is verborgen + Startknop wordt weergegeven + + Fragmenten verbergen + Knop Voorbeelden is verborgen + Knop Voorbeelden wordt weergegeven + + Verberg Ontdekken + Knop Ontdekken is verborgen + Knop Ontdekken wordt weergegeven + + Verberg Bibliotheek + Knop Bibliotheek is verborgen + Knop Bibliotheek wordt weergegeven + + Verberg Upgraden + Upgrade-knop is verborgen + Upgrade-knop wordt weergegeven + Navigatiebalk verbergen + Navigatiebalk is verborgen + Navigatiebalk wordt weergegeven + Labels van navigatieknoppen verbergen + Labels zijn verborgen + Labels worden weergegeven + + + \'Muziek Premium krijgen\' label verbergen + Label is verborgen + Label wordt weergegeven + + + Upgrade-knop verbergen + Knop is verborgen + Knop wordt weergegeven + + + + + Blokkeer audio-advertenties + Audio-advertenties zijn geblokkeerd + Audio-advertenties zijn niet geblokkeerd + + + %s niet beschikbaar, advertenties kunnen worden weergegeven. Probeer de advertentieblokkeerservice in de instellingen te wijzigen. + %s heeft een fout geretourneerd, advertenties kunnen worden weergegeven. Probeer de advertentieblokkeerservice in de instellingen te wijzigen. + Blokkeer ingesloten videoadvertenties + Uitgeschakeld + Luminous-proxy + PurpleAdBlock-proxy + + + Blokkeer video-advertenties + Video-advertenties zijn geblokkeerd + Video-advertenties zijn niet geblokkeerd + + + Bericht verwijderd + Toon verwijderde berichten + Toon geen verwijderde berichten + Verberg verwijderde berichten achter een spoiler + Toon verwijderde berichten als doorgestreept tekst + + + Claim Channel Points automatisch + Channel Points worden automatisch geclaimd + Channel Points worden niet automatisch geclaimd + + + + Schakel Twitch debug-modus in + Twitch debug-modus is ingeschakeld (niet aanbevolen) + Twitch debug-modus is uitgeschakeld + + + ReVanced-instellingen + Over + Over ReVanced + Advertentieblokkering + Instellingen advertentieblokkering + Chat-instellingen + Overige + Diverse instellingen + Algemene instellingen + Andere instellingen + Client-side advertenties + Server-side surestream-advertenties + Logboek foutopsporing + Debug logboeken zijn ingeschakeld + Debug logboeken zijn uitgeschakeld + + diff --git a/patches/src/main/resources/addresources/values-or-rIN/strings.xml b/patches/src/main/resources/addresources/values-or-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-or-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-or-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 1612f37983..8eb424ad6a 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -17,1269 +17,1268 @@ "First 'item' text Second \"item\" text" ---> - - - - Nazwa aplikacji - - Własna - Ikona aplikacji - Oryginalna - ReVanced - - ReVanced minimalna - ReVanced skalowana - - Niestandardowa - - - Sprawdzanie nie powiodło się - Otwórz oficjalną stronę internetową - Ignoruj - <h5>Ta aplikacja nie wydaje się być przez ciebie załatana.</h5><br>Ta aplikacja może nie działać poprawnie, <b>może być szkodliwa lub nawet niebezpieczna dla użycia</b>.<br><br>Te sprawdzenia oznaczają, że ta aplikacja jest wstępnie przygotowana lub uzyskana od kogoś innego:<br><br><small>%1$s</small><br>Zdecydowanie zaleca się odinstalować aplikację <b>i załatać ją samodzielnie</b>, aby upewnić się, że używasz zweryfikowanej i bezpiecznej aplikacji.<p><br>Jeśli zostanie to zignorowane, ostrzeżenie wyskoczy tylko dwukrotnie. - Załatano na innym urządzeniu - Nie zainstalowany przez ReVanced Manager - Załatano ponad 10 minut temu - Załatano %s dni temu - Data kompilacji APK jest uszkodzona - - - Powiadomienie ReVanced - Twoja historia oglądania nie jest zapisywana.<br><br>Najprawdopodobniej jest to spowodowane blokadą reklam DNS lub serwer proxy.<br><br>Aby to naprawić, dodaj do białej listy<b>s.youtube.com</b> lub wyłącz wszystkie blokady DNS i proxy. - Nie pokazuj ponownie - - - Ustawienia - ReVanced - Czy na pewno chcesz kontynuować? - Zapisz - Zresetuj - Zresetuj kolor - Nieprawidłowy kolor - Wymagane ponowne uruchomienie - Aby zmiany zostały wprowadzone, uruchom ponownie aplikację. - Uruchom ponownie - Zaimportuj - Skopiuj - Przywrócono domyślne ustawienia ReVanced - Zaimportowano %d ustawień - Importowanie nie powiodło się: %s - Szukaj w ustawieniach - Brak wyników dla „%s” - Spróbuj innego słowa kluczowego - Ostatnie wyszukiwania - Usunąć z historii wyszukiwania? - Wyczyść historię wyszukiwania - Czy na pewno chcesz wyczyścić całą historię wyszukiwania? - Wskazówki dotyczące wyszukiwania - "• Dotknij ścieżki, aby do niej przejść +--> + + + Nazwa aplikacji + + Własna + Ikona aplikacji + Oryginalna + ReVanced + + ReVanced minimalna + ReVanced skalowana + + Niestandardowa + + + Sprawdzanie nie powiodło się + Otwórz oficjalną stronę internetową + Ignoruj + <h5>Ta aplikacja nie wydaje się być przez ciebie załatana.</h5><br>Ta aplikacja może nie działać poprawnie, <b>może być szkodliwa lub nawet niebezpieczna dla użycia</b>.<br><br>Te sprawdzenia oznaczają, że ta aplikacja jest wstępnie przygotowana lub uzyskana od kogoś innego:<br><br><small>%1$s</small><br>Zdecydowanie zaleca się odinstalować aplikację <b>i załatać ją samodzielnie</b>, aby upewnić się, że używasz zweryfikowanej i bezpiecznej aplikacji.<p><br>Jeśli zostanie to zignorowane, ostrzeżenie wyskoczy tylko dwukrotnie. + Załatano na innym urządzeniu + Nie zainstalowany przez ReVanced Manager + Załatano ponad 10 minut temu + Załatano %s dni temu + Data kompilacji APK jest uszkodzona + + + Powiadomienie ReVanced + Twoja historia oglądania nie jest zapisywana.<br><br>Najprawdopodobniej jest to spowodowane blokadą reklam DNS lub serwer proxy.<br><br>Aby to naprawić, dodaj do białej listy<b>s.youtube.com</b> lub wyłącz wszystkie blokady DNS i proxy. + Nie pokazuj ponownie + + + Ustawienia + ReVanced + Czy na pewno chcesz kontynuować? + Zapisz + Zresetuj + Zresetuj kolor + Nieprawidłowy kolor + Wymagane ponowne uruchomienie + Aby zmiany zostały wprowadzone, uruchom ponownie aplikację. + Uruchom ponownie + Zaimportuj + Skopiuj + Przywrócono domyślne ustawienia ReVanced + Zaimportowano %d ustawień + Importowanie nie powiodło się: %s + Szukaj w ustawieniach + Brak wyników dla „%s” + Spróbuj innego słowa kluczowego + Ostatnie wyszukiwania + Usunąć z historii wyszukiwania? + Wyczyść historię wyszukiwania + Czy na pewno chcesz wyczyścić całą historię wyszukiwania? + Wskazówki dotyczące wyszukiwania + "• Dotknij ścieżki, aby do niej przejść • Długo naciśnij ustawienie, aby do niego przejść • Naciśnij Enter, aby zapisać wyszukiwane hasło w historii • Wyszukiwanie ignoruje wielkość liter i interpunkcję • Ustawienia nadrzędne pojawiają się powyżej wyłączonych ustawień podrzędnych" - Historia wyszukiwania jest pusta - Aby zapisać historię wyszukiwania, wpisz zapytanie i naciśnij Enter - Pokaż historię wyszukiwania ustawień - Historia wyszukiwania ustawień jest wyświetlana - Historia wyszukiwania w ustawieniach jest niewidoczna - Pokaż ikony ustawień ReVanced - Ikony ustawień są widoczne - Ikony ustawień nie są wyświetlane - Język ReVanced - "Tłumaczenia dla niektórych języków mogą być brakujące lub niekompletne. + Historia wyszukiwania jest pusta + Aby zapisać historię wyszukiwania, wpisz zapytanie i naciśnij Enter + Pokaż historię wyszukiwania ustawień + Historia wyszukiwania ustawień jest wyświetlana + Historia wyszukiwania w ustawieniach jest niewidoczna + Pokaż ikony ustawień ReVanced + Ikony ustawień są widoczne + Ikony ustawień nie są wyświetlane + Język ReVanced + "Tłumaczenia dla niektórych języków mogą być brakujące lub niekompletne. Aby przetłumaczyć nowe języki lub poprawić istniejące tłumaczenia, odwiedź translate.revanced.app" - Język aplikacji - Zaimportuj / Wyeksportuj - Zaimportuj / Wyeksportuj ustawienia ReVanced - - Używasz łatek ReVanced w wersji <i>%s</i> - Notka - Ta wersja jest wersją wstępną i mogą wystąpić nieoczekiwane problemy - Oficjalne linki - + Używasz łatek ReVanced w wersji <i>%s</i> + Notka + Ta wersja jest wersją wstępną i mogą wystąpić nieoczekiwane problemy + Oficjalne linki + - - - Ustawienia GmsCore - Ustawienia GmsCore - - MicroG GmsCore nie jest zainstalowany, zainstaluj. - Wymagane działanie - "MicroG GmsCore nie posiada uprawnień do działania w tle. + + + Ustawienia GmsCore + Ustawienia GmsCore + + MicroG GmsCore nie jest zainstalowany, zainstaluj. + Wymagane działanie + "MicroG GmsCore nie posiada uprawnień do działania w tle. Postępuj zgodnie z instrukcją \"Don't kill my app\" dla swojego telefonu i zastosuj instrukcje do swojej instalacji MicroG. Jest to wymagane do działania aplikacji." - Otwórz stronę - "Aby uniknąć problemów, musisz wyłączyć optymalizację baterii dla MicroG GmsCore. + Otwórz stronę + "Aby uniknąć problemów, musisz wyłączyć optymalizację baterii dla MicroG GmsCore. Wyłączenie optymalizacji baterii dla MicroG nie wpłynie negatywnie na zużycie baterii. Naciśnij przycisk Kontynuuj i zezwól na zmiany optymalizacji." - Kontynuuj - - - Fałszuj strumienie wideo - Fałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem - Sfałszuj strumienie wideo - Sfałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem - Oszukaj strumienie filmu - "Strumienie wideo są fałszowane + Kontynuuj + + + Fałszuj strumienie wideo + Fałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem + Sfałszuj strumienie wideo + Sfałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem + Oszukaj strumienie filmu + "Strumienie wideo są fałszowane Jeśli jesteś użytkownikiem YouTube Premium, to ustawienie może nie być wymagane" - "Strumienie wideo nie są fałszowane + "Strumienie wideo nie są fałszowane Odtwarzanie może nie działać" - Wyłączenie tego ustawienia może spowodować problemy z odtwarzaniem. - Domyślny klient - - - Wymuś język oryginalnego dźwięku - Używanie oryginalnego języka audio - Używanie domyślnego dźwięku - - Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio - - - Debugowanie - Włącz lub wyłącz opcje debugowania - Logi do debugowania - Logi debugowania są włączone - Logi debugowania są wyłączone - Logi śladów stosów - Logi do debugowania zawierają ślady stosów - Logi do debugowania nie zawierają śladów stosów - Komunikaty o błędach ReVanced - Wyświetlany jest toast, jeśli wystąpi błąd - Toast nie jest wyświetlany, jeśli wystąpi błąd - "Wyłączenie notyfikacji błędów ukrywa wszystkie powiadomienia o błędach ReVanced. + Wyłączenie tego ustawienia może spowodować problemy z odtwarzaniem. + Domyślny klient + + + Wymuś język oryginalnego dźwięku + Używanie oryginalnego języka audio + Używanie domyślnego dźwięku + + Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio + + + Debugowanie + Włącz lub wyłącz opcje debugowania + Logi do debugowania + Logi debugowania są włączone + Logi debugowania są wyłączone + Logi śladów stosów + Logi do debugowania zawierają ślady stosów + Logi do debugowania nie zawierają śladów stosów + Komunikaty o błędach ReVanced + Wyświetlany jest toast, jeśli wystąpi błąd + Toast nie jest wyświetlany, jeśli wystąpi błąd + "Wyłączenie notyfikacji błędów ukrywa wszystkie powiadomienia o błędach ReVanced. Nie będziesz informowany o żadnych nieoczekiwanych zdarzeniach." - Eksportuj dzienniki debugowania - Kopiuje dzienniki debugowania ReVanced do schowka - Rejestrowanie debugowania jest wyłączone - Nie znaleziono dzienników - Dzienniki skopiowane - Nie udało się wyeksportować logów: %s - Wyczyść dzienniki debugowania - Czyści wszystkie zapisane dzienniki debugowania ReVanced - Dzienniki wyczyszczone - Manager flag funkcji - Zarządzaj flagami funkcji typu boolean - Aktywne flagi (%d) - Zablokowane flagi (%d) - Szukaj flag... - Flagi zapisane - Flagi zresetowane - Flagi skopiowane do schowka - Logi protokołu bufora - Logi do debugowania zawierają bufory - Logi do debugowania nie zawierają buforów - "Włączenie tego ustawienia spowoduje rejestrowanie dodatkowych danych układu, w tym tekstu na ekranie dla niektórych komponentów interfejsu użytkownika.\n\nMoże to pomóc w identyfikacji komponentów podczas tworzenia filtrów niestandardowych.\n\nWłączenie tej opcji spowoduje jednak również rejestrowanie niektórych danych użytkownika, takich jak adres IP." - - - Oczyść linki udostępniania - Parametr zapytania śledzenia jest usuwany z udostępnianych linków - Parametr zapytania śledzenia nie jest usuwany z udostępnianych linków - Zmień linki udostępniania na youtube.com - Udostępnione linki używają youtube.com - Udostępnione linki używają music.youtube.com - - - Własny filtr - Ukryj komponenty za pomocą własnego filtra - Włącz własny filtr - Filtr niestandardowy jest włączony - Filtr niestandardowy jest wyłączony - Własny filtr - - Lista tekstów tworzących ścieżkę komponentów do filtrowania, oddzielone nowymi wierszami - Nieprawidłowy niestandardowy filtr: %s - - - - - O aplikacji - Reklamy - Alternatywne miniaturki - Strona główna - Ogólne - Odtwarzacz - Shorts - Pasek postępu filmu - Sterowanie przesuwaniem - Przywróć YouTube Dislike - Różne - Film - Przywróć stare menu ustawień - Wyświetlane są stare menu ustawień - Stare menu ustawień nie są wyświetlane - - - Wyłącz odtwarzanie Shortsów w tle - Odtwarzanie w tle Shortsów jest wyłączone - Odtwarzanie w tle Shortsów jest włączone - - - Ukryj karty albumów - Karty albumów są ukryte - Karty albumów są widoczne - Ukryj karty artystów - Karty artystów są ukryte - Karty artystów są widoczne - Ukryj paski z kategoriami - Paski z kategoriami są ukryte - Paski z kategoriami są widoczne - Ukryj posty społeczności - Posty społeczności są ukryte - Posty społeczności są widoczne - Ukryj kompaktowe banery - Kompaktowe banery są ukryte - Kompaktowe banery są widoczne - Ukryj rozwijaną kartę - Rozwijana karta pod filmami jest ukryta - Rozwijana karta pod filmami jest widoczna - Ukryj pływający przycisk mikrofonu - Pływający przycisk mikrofonu w wyszukiwarce jest ukryty - Pływający przycisk mikrofonu w wyszukiwaniu jest widoczny - Ukryj poziome półki - "Półki są ukryte, takie jak: + Eksportuj dzienniki debugowania + Kopiuje dzienniki debugowania ReVanced do schowka + Rejestrowanie debugowania jest wyłączone + Nie znaleziono dzienników + Dzienniki skopiowane + Nie udało się wyeksportować logów: %s + Wyczyść dzienniki debugowania + Czyści wszystkie zapisane dzienniki debugowania ReVanced + Dzienniki wyczyszczone + Manager flag funkcji + Zarządzaj flagami funkcji typu boolean + Aktywne flagi (%d) + Zablokowane flagi (%d) + Szukaj flag... + Flagi zapisane + Flagi zresetowane + Flagi skopiowane do schowka + Logi protokołu bufora + Logi do debugowania zawierają bufory + Logi do debugowania nie zawierają buforów + "Włączenie tego ustawienia spowoduje rejestrowanie dodatkowych danych układu, w tym tekstu na ekranie dla niektórych komponentów interfejsu użytkownika.\n\nMoże to pomóc w identyfikacji komponentów podczas tworzenia filtrów niestandardowych.\n\nWłączenie tej opcji spowoduje jednak również rejestrowanie niektórych danych użytkownika, takich jak adres IP." + + + Oczyść linki udostępniania + Parametr zapytania śledzenia jest usuwany z udostępnianych linków + Parametr zapytania śledzenia nie jest usuwany z udostępnianych linków + Zmień linki udostępniania na youtube.com + Udostępnione linki używają youtube.com + Udostępnione linki używają music.youtube.com + + + Własny filtr + Ukryj komponenty za pomocą własnego filtra + Włącz własny filtr + Filtr niestandardowy jest włączony + Filtr niestandardowy jest wyłączony + Własny filtr + + Lista tekstów tworzących ścieżkę komponentów do filtrowania, oddzielone nowymi wierszami + Nieprawidłowy niestandardowy filtr: %s + + + + + O aplikacji + Reklamy + Alternatywne miniaturki + Strona główna + Ogólne + Odtwarzacz + Shorts + Pasek postępu filmu + Sterowanie przesuwaniem + Przywróć YouTube Dislike + Różne + Film + Przywróć stare menu ustawień + Wyświetlane są stare menu ustawień + Stare menu ustawień nie są wyświetlane + + + Wyłącz odtwarzanie Shortsów w tle + Odtwarzanie w tle Shortsów jest wyłączone + Odtwarzanie w tle Shortsów jest włączone + + + Ukryj karty albumów + Karty albumów są ukryte + Karty albumów są widoczne + Ukryj karty artystów + Karty artystów są ukryte + Karty artystów są widoczne + Ukryj paski z kategoriami + Paski z kategoriami są ukryte + Paski z kategoriami są widoczne + Ukryj posty społeczności + Posty społeczności są ukryte + Posty społeczności są widoczne + Ukryj kompaktowe banery + Kompaktowe banery są ukryte + Kompaktowe banery są widoczne + Ukryj rozwijaną kartę + Rozwijana karta pod filmami jest ukryta + Rozwijana karta pod filmami jest widoczna + Ukryj pływający przycisk mikrofonu + Pływający przycisk mikrofonu w wyszukiwarce jest ukryty + Pływający przycisk mikrofonu w wyszukiwaniu jest widoczny + Ukryj poziome półki + "Półki są ukryte, takie jak: • Najświeższe wiadomości • Kontynuuj oglądanie • Odkryj więcej kanałów • Najtrafniejsze • Zakupy • Obejrzyj ponownie" - Półki poziome są widoczne - Ukryj półkę obrazów - Półka obrazów w wynikach wyszukiwania jest ukryta - Półka obrazów w wynikach wyszukiwania jest widoczna - Ukryj najnowsze posty - Najnowsze posty są ukryte - Najnowsze posty są widoczne - Ukryj składanki - Składanki są ukryte - Składanki są widoczne - Ukryj sekcję filmów kinowych - Sekcja filmów kinowych jest ukryta - Sekcja filmów kinowych jest widoczna - - Ukryj przycisk \'Powiadom mnie\' - Przycisk „Powiadom mnie” jest ukryty - Przycisk „Powiadom mnie” jest widoczny - Ukryj pokój gier - Pokój gier jest widoczny - Pokój gier jest ukryty - - Ukryj przycisk \'Pokaż więcej\' - Przycisk „Pokaż więcej” w wynikach wyszukiwania jest ukryty - Przycisk „Pokaż więcej” w wynikach wyszukiwania jest widoczny - Ukryj ankiety - Ankiety są ukryte - Ankiety są widoczne - Ukryj pasek z biletami - Pasek z biletami jest ukryty - Pasek z biletami jest widoczny - - Ukryj etykiety rekomendacji wideo - Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są ukryte - Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są widoczne - Ukryj odstęp wizualny - Odstęp wizualny jest ukryty - Odstęp wizualny jest widoczny - - Ukryj YouTube Doodles - Animacja Doodles YouTube na logo jest ukryta - Animacja YouTube Doodles na logo jest widoczna - "'YouTube Doodles' są wyświetlane kilka dni w roku. + Ukryj przycisk \'Pokaż więcej\' + Przycisk „Pokaż więcej” w wynikach wyszukiwania jest ukryty + Przycisk „Pokaż więcej” w wynikach wyszukiwania jest widoczny + Ukryj ankiety + Ankiety są ukryte + Ankiety są widoczne + Ukryj pasek z biletami + Pasek z biletami jest ukryty + Pasek z biletami jest widoczny + + Ukryj etykiety rekomendacji wideo + Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są ukryte + Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są widoczne + Ukryj odstęp wizualny + Odstęp wizualny jest ukryty + Odstęp wizualny jest widoczny + + Ukryj YouTube Doodles + Animacja Doodles YouTube na logo jest ukryta + Animacja YouTube Doodles na logo jest widoczna + "'YouTube Doodles' są wyświetlane kilka dni w roku. Jeśli Doodle jest obecnie wyświetlany w Twoim regionie, a to ustawienie ukrycia jest włączone, pasek filtrów pod paskiem wyszukiwania również zostanie ukryty." - Ukryj pasek kanału - Pasek kanału jest ukryty - Pasek kanału jest widoczny - Ukryj znaki wodne kanałów - Znaki wodne są ukryte - Znaki wodne są widoczne - Ukryj ramki ze zbiórkami - Ramki ze zbiórkami pieniędzy są ukryte - Ramki ze zbiórkami pieniędzy są widoczne - Ukryj ramki alarmowe - Ramki alarmowe są ukryte - Ramki alarmowe są widoczne - Ukryj panele informacyjne - Panele informacyjne są ukryte - Panele informacyjne są widoczne - - Ukryj przycisk Dołącz - Przycisk „Dołącz” jest ukryty - Przycisk „Dołącz” jest widoczny - Ukryj panele medyczne - Panele medyczne są ukryte - Panele medyczne są widoczne - Ukryj szybkie akcje - Szybkie akcje na pełnym ekranie są ukryte - Szybkie akcje na pełnym ekranie są widoczne - Ukryj powiązane filmy - Powiązane filmy w szybkich akcjach są ukryte - Powiązane filmy w szybkich akcjach są widoczne - Ukryj wytyczne dla subskrybentów - Wytyczne społeczności subskrybentów są widoczne - Wytyczne społeczności subskrybentów są widoczne - Ukryj reakcje czasowe - Reakcje czasowe są ukryte - Reakcje czasowe są widoczne - Ukryj sekcję „Podsumowanie wideo wygenerowane przez AI” - Sekcja podsumowania wideo wygenerowana przez AI jest ukryta - Sekcja podsumowania wideo generowanego przez AI jest widoczna - Ukryj Pytanie - Sekcja Pytania jest ukryta - Sekcja Pytania jest widoczna - Ukryj atrybuty - Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są ukryte - Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są widoczne - Ukryj rozdziały - Sekcja rozdziałów jest ukryta - Sekcja rozdziałów jest widoczna - Ukryj „Jak powstała ta treść” - Sekcja „Jak powstała ta treść” jest ukryta - Sekcja „Jak powstała ta treść” jest widoczna - Ukryj punkty Hype - Punkty Hype są ukryte - Punkty Hype są pokazane - Ukryj „Odkryj podcast” - Sekcja „Odkryj podcast” jest ukryta - Sekcja „Odkryj podcast” jest widoczna - Ukryj wyróżnione linki - Sekcja polecanych linków jest ukryta - Sekcja polecanych linków jest wyświetlona - Ukryj polecane filmy - Sekcja polecanych filmów jest ukryta - Sekcja polecanych filmów jest wyświetlona - Ukryj karty informacyjne - Sekcja kart informacyjnych jest ukryta - Sekcja kart informacyjnych jest widoczna - Ukryj „Kluczowe koncepcje” - Sekcja „Kluczowe koncepcje” jest ukryta - Sekcja „Kluczowe koncepcje” jest widoczna - Ukryj przycisk Subskrybuj - Przycisk Subskrybuj jest ukryty - Przycisk Subskrybuj jest wyświetlony - Ukryj transkrypcję - Sekcja transkrypcji jest ukryta - Sekcja transkrypcji jest widoczna - Opis filmu - Ukryj lub pokaż elementy opisu filmu - Pasek filtrowania - Ukryj lub pokaż pasek filtrów w kanałach, powiązanych filmach, wynikach wyszukiwania i historii oglądania - Ukryj w kanałach - Ukryte w kanałach - Pokazane w kanałach - W powiązanych filmach - Ukryte w powiązanych filmach - Widoczne w powiązanych filmach - Ukryj w wynikach wyszukiwania - Ukryte w wynikach wyszukiwania - Wyświetlane w wynikach wyszukiwania - Ukryj w historii oglądania - Ukryty w historii oglądania - Widoczne w historii oglądania - Strona kanału - Ukryj lub pokaż komponenty strony kanału - - Ukryj przycisk Społeczność - Przycisk Społeczność jest ukryty - Przycisk Społeczność jest widoczny - - Ukryj półkę \"Dla Ciebie\" - Półka \"Dla Ciebie\" jest ukryta - Półka \"Dla Ciebie\" jest widoczna - - Ukryj przycisk Dołącz - Przycisk Dołącz jest ukryty - Przycisk Dołącz jest widoczny - Ukryj podgląd linków - Podgląd linków jest ukryty - Podgląd linków jest widoczny - Ukryj półkę członków - Półka członków jest ukryta - Półka dla członków jest widoczna - - Ukryj przycisk Sklep - Przycisk Sklep jest ukryty - Przycisk Sklep jest widoczny - - Ukryj przycisk Subskrybuj - Przycisk Subskrybuj jest ukryty - Przycisk Subskrybuj jest widoczny - Komentarze - Ukryj lub pokazuj komentarze - Ukryj podsumowanie czatu AI - Podsumowanie czatu AI jest ukryte - Podsumowanie czatu AI jest pokazane - Ukryj podsumowanie komentarzy AI - Podsumowanie komentarzy AI jest ukryte - Podsumowanie komentarzy AI jest pokazane - Ukryj wytyczne kanału - Wytyczne kanału są ukryte - Wytyczne kanału są widoczne - Ukryj nagłówki komentarzy sponsorów - Nagłówek komentarzy od członków jest ukryty - Nagłówek komentarzy od członków jest widoczny - Ukryj sekcję komentarzy - Sekcja komentarzy jest ukryta - Sekcja komentarzy jest widoczna - Ukryj wytyczne dla społeczności - Wytyczne społeczności są ukryte - Wytyczne społeczności są widoczne - Przycisk od tworzenia Shortsów - Przycisk Utwórz Short jest ukryty - Przycisk Utwórz Short jest widoczny - Ukryj przyciski emoji i znacznika czasu - Przyciski emoji i znacznika czasu są ukryte - Przyciski emoji i znacznika czasu są widoczne - Ukryj podgląd komentarzy - Podgląd komentarzy jest ukryty - Podgląd komentarzy jest widoczny - Ukryj przycisk superpodziękowania - Przycisk superpodziękowania jest ukryty - Przycisk superpodziękowania jest widoczny - Ukryj liczbę wyświetleń - Liczba wyświetleń jest ukryta w kanale i wynikach wyszukiwania - Liczba wyświetleń jest widoczna w kanale i wynikach wyszukiwania - - "Ograniczenia: + Ukryj przycisk Dołącz + Przycisk „Dołącz” jest ukryty + Przycisk „Dołącz” jest widoczny + Ukryj panele medyczne + Panele medyczne są ukryte + Panele medyczne są widoczne + Ukryj szybkie akcje + Szybkie akcje na pełnym ekranie są ukryte + Szybkie akcje na pełnym ekranie są widoczne + Ukryj powiązane filmy + Powiązane filmy w szybkich akcjach są ukryte + Powiązane filmy w szybkich akcjach są widoczne + Ukryj wytyczne dla subskrybentów + Wytyczne społeczności subskrybentów są widoczne + Wytyczne społeczności subskrybentów są widoczne + Ukryj reakcje czasowe + Reakcje czasowe są ukryte + Reakcje czasowe są widoczne + Ukryj sekcję „Podsumowanie wideo wygenerowane przez AI” + Sekcja podsumowania wideo wygenerowana przez AI jest ukryta + Sekcja podsumowania wideo generowanego przez AI jest widoczna + Ukryj Pytanie + Sekcja Pytania jest ukryta + Sekcja Pytania jest widoczna + Ukryj atrybuty + Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są ukryte + Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są widoczne + Ukryj rozdziały + Sekcja rozdziałów jest ukryta + Sekcja rozdziałów jest widoczna + Ukryj „Jak powstała ta treść” + Sekcja „Jak powstała ta treść” jest ukryta + Sekcja „Jak powstała ta treść” jest widoczna + Ukryj punkty Hype + Punkty Hype są ukryte + Punkty Hype są pokazane + Ukryj „Odkryj podcast” + Sekcja „Odkryj podcast” jest ukryta + Sekcja „Odkryj podcast” jest widoczna + Ukryj wyróżnione linki + Sekcja polecanych linków jest ukryta + Sekcja polecanych linków jest wyświetlona + Ukryj polecane filmy + Sekcja polecanych filmów jest ukryta + Sekcja polecanych filmów jest wyświetlona + Ukryj karty informacyjne + Sekcja kart informacyjnych jest ukryta + Sekcja kart informacyjnych jest widoczna + Ukryj „Kluczowe koncepcje” + Sekcja „Kluczowe koncepcje” jest ukryta + Sekcja „Kluczowe koncepcje” jest widoczna + Ukryj przycisk Subskrybuj + Przycisk Subskrybuj jest ukryty + Przycisk Subskrybuj jest wyświetlony + Ukryj transkrypcję + Sekcja transkrypcji jest ukryta + Sekcja transkrypcji jest widoczna + Opis filmu + Ukryj lub pokaż elementy opisu filmu + Pasek filtrowania + Ukryj lub pokaż pasek filtrów w kanałach, powiązanych filmach, wynikach wyszukiwania i historii oglądania + Ukryj w kanałach + Ukryte w kanałach + Pokazane w kanałach + W powiązanych filmach + Ukryte w powiązanych filmach + Widoczne w powiązanych filmach + Ukryj w wynikach wyszukiwania + Ukryte w wynikach wyszukiwania + Wyświetlane w wynikach wyszukiwania + Ukryj w historii oglądania + Ukryty w historii oglądania + Widoczne w historii oglądania + Strona kanału + Ukryj lub pokaż komponenty strony kanału + + Ukryj przycisk Społeczność + Przycisk Społeczność jest ukryty + Przycisk Społeczność jest widoczny + + Ukryj półkę \"Dla Ciebie\" + Półka \"Dla Ciebie\" jest ukryta + Półka \"Dla Ciebie\" jest widoczna + + Ukryj przycisk Dołącz + Przycisk Dołącz jest ukryty + Przycisk Dołącz jest widoczny + Ukryj podgląd linków + Podgląd linków jest ukryty + Podgląd linków jest widoczny + Ukryj półkę członków + Półka członków jest ukryta + Półka dla członków jest widoczna + + Ukryj przycisk Sklep + Przycisk Sklep jest ukryty + Przycisk Sklep jest widoczny + + Ukryj przycisk Subskrybuj + Przycisk Subskrybuj jest ukryty + Przycisk Subskrybuj jest widoczny + Komentarze + Ukryj lub pokazuj komentarze + Ukryj podsumowanie czatu AI + Podsumowanie czatu AI jest ukryte + Podsumowanie czatu AI jest pokazane + Ukryj podsumowanie komentarzy AI + Podsumowanie komentarzy AI jest ukryte + Podsumowanie komentarzy AI jest pokazane + Ukryj wytyczne kanału + Wytyczne kanału są ukryte + Wytyczne kanału są widoczne + Ukryj nagłówki komentarzy sponsorów + Nagłówek komentarzy od członków jest ukryty + Nagłówek komentarzy od członków jest widoczny + Ukryj sekcję komentarzy + Sekcja komentarzy jest ukryta + Sekcja komentarzy jest widoczna + Ukryj wytyczne dla społeczności + Wytyczne społeczności są ukryte + Wytyczne społeczności są widoczne + Przycisk od tworzenia Shortsów + Przycisk Utwórz Short jest ukryty + Przycisk Utwórz Short jest widoczny + Ukryj przyciski emoji i znacznika czasu + Przyciski emoji i znacznika czasu są ukryte + Przyciski emoji i znacznika czasu są widoczne + Ukryj podgląd komentarzy + Podgląd komentarzy jest ukryty + Podgląd komentarzy jest widoczny + Ukryj przycisk superpodziękowania + Przycisk superpodziękowania jest ukryty + Przycisk superpodziękowania jest widoczny + Ukryj liczbę wyświetleń + Liczba wyświetleń jest ukryta w kanale i wynikach wyszukiwania + Liczba wyświetleń jest widoczna w kanale i wynikach wyszukiwania + + "Ograniczenia: • Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać liczby wyświetleń • Ta funkcja nie działa z wersją dla pojazdów" - Ukryj czas przesłania - Czas przesłania jest ukryty w kanale i wynikach wyszukiwania - Czas przesłania jest widoczny w kanale i wynikach wyszukiwania - - "Ograniczenia: + Ukryj czas przesłania + Czas przesłania jest ukryty w kanale i wynikach wyszukiwania + Czas przesłania jest widoczny w kanale i wynikach wyszukiwania + + "Ograniczenia: • Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać czasy przesłania • Ta funkcja nie działa z formatem samochodowym" - Filtrowanie słów - Ukryj wyszukiwanie i filmy na stronie głównej za pomocą filtrów słów - Filtruj filmy na stronie głównej - Filmy na stronie głównej są filtrowane przez słowa - Filmy na stronie głównej nie są filtrowane przez słowa - Filtruj wyniki wyszukiwania - Wyniki wyszukiwania są filtrowane przez słowa - Wyniki wyszukiwania nie są filtrowane przez słowa - Filtruj filmy na stronie subskrypcji - Filmy na stronie subskrypcji są filtrowane przez słowa - Filmy na stronie subskrypcji nie są filtrowane przez słowa - Słowa do ukrycia - - "Słowa kluczowe i wyrażenia do ukrycia, oddzielone nowymi wierszami + "Słowa kluczowe i wyrażenia do ukrycia, oddzielone nowymi wierszami Słowa kluczowe mogą być nazwami kanałów lub dowolnym tekstem wyświetlanym w tytułach filmów Słowa zawierające duże litery w środku muszą być wprowadzane z wielkością liter (np. iPhone, TikTok, LeBlanc)" - O filtrowaniu słów - "Strona główna/Subskrybcje/Wyniki wyszukiwania są filtrowane, by ukryć zawartość, która pasuje do fraz kluczowych + O filtrowaniu słów + "Strona główna/Subskrybcje/Wyniki wyszukiwania są filtrowane, by ukryć zawartość, która pasuje do fraz kluczowych Ograniczenia • Filmy Shorts nie mogą być ukrywane przez nazwę kanału • Niektóre komponenty interfejsu mogą nie zostać ukryte • Wpisanie słowa kluczowego do pola wyszukiwania może nie pokazać żadnych wyników" - Uwzględnij całe wyrazy - - Otoczenie słowa/frazy podwójnym cudzysłowem może zapobiec częściowemu dopasowywaniu tytułów filmów i nazw kanałów<br><br>Dla przykładu,<br><b>\"ai\"</b> ukryje film: <b>Jak działa AI?</b><br>lecz nie ukryje: <b>Co oznacza aikido?</b> - - Nie można użyć słowa: %s - Dodaj cudzysłowy, aby użyć słowa: %s - Słowo zawiera sprzeczne deklaracje: %s - Słowo jest za krótkie i wymaga cudzysłowu: %s - Słowo ukryje wszystkie filmy: %s - - - Ukryj półkę sklepu twórcy - Półka sklepu twórcy pod odtwarzaczem wideo jest ukryta - Półka sklepu twórców pod odtwarzaczem wideo jest widoczna - Ukryj baner sklepu na ekranie końcowym - Baner sklepu na ekranie końcowym jest ukryty - Baner sklepu na ekranie końcowym jest widoczny - Reklamy pełnoekranowe - "Reklamy pełnoekranowe są ukryte + Uwzględnij całe wyrazy + + Otoczenie słowa/frazy podwójnym cudzysłowem może zapobiec częściowemu dopasowywaniu tytułów filmów i nazw kanałów<br><br>Dla przykładu,<br><b>\"ai\"</b> ukryje film: <b>Jak działa AI?</b><br>lecz nie ukryje: <b>Co oznacza aikido?</b> + + Nie można użyć słowa: %s + Dodaj cudzysłowy, aby użyć słowa: %s + Słowo zawiera sprzeczne deklaracje: %s + Słowo jest za krótkie i wymaga cudzysłowu: %s + Słowo ukryje wszystkie filmy: %s + + + Ukryj półkę sklepu twórcy + Półka sklepu twórcy pod odtwarzaczem wideo jest ukryta + Półka sklepu twórców pod odtwarzaczem wideo jest widoczna + Ukryj baner sklepu na ekranie końcowym + Baner sklepu na ekranie końcowym jest ukryty + Baner sklepu na ekranie końcowym jest widoczny + Reklamy pełnoekranowe + "Reklamy pełnoekranowe są ukryte Ta funkcja jest dostępna tylko dla starszych urządzeń" - Reklamy pełnoekranowe są widoczne - - Ukrycie pełnoekranowych reklam działa tylko na starszych urządzeniach - Reklamy ogólne - Ogólne reklamy są ukryte - Ogólne reklamy są widoczne - Banery towarowe - Banery z towarami są ukryte - Banery z towarami są widoczne - Etykiety płatnej promocji - Etykiety płatnej promocji są ukryte - Etykiety płatnej promocji są widoczne - Karty z autopromocją - Karty z autopromocją są ukryte - Karty z autopromocją są widoczne - Ukryj linki do zakupów - Linki do zakupów w opisie wideo są ukryte - Linki zakupowe w opisie filmu są widoczne - Ukryj baner \'Zobacz produkty\' - Baner „Zobacz produkty” w nakładce wideo jest ukryty - Baner „Zobacz produkty” w nakładce wideo jest widoczny - Wyniki wyszukiwania stron internetowych - Wyniki wyszukiwania stron są ukryte - Wyniki wyszukiwania stron są widoczne - - - Promocje YouTube Premium - Promocje YouTube Premium w odtwarzaczu filmów są ukryte - Promocje YouTube Premium w odtwarzaczu filmów są widoczne - - - Reklamy filmu - Reklamy filmu są ukryte - Reklamy filmu są widoczne - - - Adres URL skopiowany do schowka - URL ze znacznikiem czasu skopiowany - Przycisk od kopiowania URL filmu - Przycisk Kopiuj adres URL filmu jest widoczny. Dotknij, aby skopiować adres URL filmu. Dotknij i przytrzymaj, aby skopiować z sygnaturą czasową - Przycisk Kopiuj adres URL filmu nie jest widoczny - Przycisk od kopiowania URL filmu z czasem - Przycisk Kopiuj adres URL z sygnaturą czasową jest widoczny. Dotknij, aby skopiować adres URL filmu z sygnaturą czasową. Dotknij i przytrzymaj, aby skopiować bez sygnatury czasowej - Przycisk Kopiuj adres URL z sygnaturą czasową nie jest widoczny - - - Okno dialogowe treści ograniczonej do oglądania - Okno dialogowe zostanie usunięte - Okno dialogowe zostanie wyświetlone - To nie pomija ograniczeń wiekowych i akceptuje je automatycznie. - - - Wyłącz wyskakujące okienko „Zaloguj się do telewizora” - Wyskakujące okienko Zaloguj się do telewizora jest wyłączone - Wyskakujące okienko Zaloguj się do telewizora jest włączone - - - Wyłącz pomijanie rozdziałów dwukrotnym stuknięciem - Dwukrotne stuknięcie nigdy nie spowoduje przejścia do następnego/poprzedniego rozdziału - Dwukrotne stuknięcie może sporadycznie spowodować przejście do następnego/poprzedniego rozdziału - - - Zewnętrzna aplikacja od pobierania - Ustawienia dla zewnętrznej aplikacji - Przycisk zewnętrznego pobierania - Przycisk pobierania w odtwarzaczu jest widoczny - Przycisk pobierania w odtwarzaczu nie jest widoczny - - Zamień przycisk akcji pobierania - Przycisk pobierania otwiera zewnętrzną aplikację - Przycisk pobierania otwiera natywne pobieranie w aplikacji - Nazwa pakietu aplikacji od pobierania - Nazwa pakietu zainstalowanej zewnętrznej aplikacji do pobierania - Wprowadź nazwę pakietu - Inne - Aplikacja nie jest zainstalowana - %s nie jest zainstalowany, zainstaluj. - "Nie znaleziono zainstalowanej aplikacji o nazwie pakietu: %s + Reklamy pełnoekranowe są widoczne + + Ukrycie pełnoekranowych reklam działa tylko na starszych urządzeniach + Reklamy ogólne + Ogólne reklamy są ukryte + Ogólne reklamy są widoczne + Banery towarowe + Banery z towarami są ukryte + Banery z towarami są widoczne + Etykiety płatnej promocji + Etykiety płatnej promocji są ukryte + Etykiety płatnej promocji są widoczne + Karty z autopromocją + Karty z autopromocją są ukryte + Karty z autopromocją są widoczne + Ukryj linki do zakupów + Linki do zakupów w opisie wideo są ukryte + Linki zakupowe w opisie filmu są widoczne + Ukryj baner \'Zobacz produkty\' + Baner „Zobacz produkty” w nakładce wideo jest ukryty + Baner „Zobacz produkty” w nakładce wideo jest widoczny + Wyniki wyszukiwania stron internetowych + Wyniki wyszukiwania stron są ukryte + Wyniki wyszukiwania stron są widoczne + + + Promocje YouTube Premium + Promocje YouTube Premium w odtwarzaczu filmów są ukryte + Promocje YouTube Premium w odtwarzaczu filmów są widoczne + + + Reklamy filmu + Reklamy filmu są ukryte + Reklamy filmu są widoczne + + + Adres URL skopiowany do schowka + URL ze znacznikiem czasu skopiowany + Przycisk od kopiowania URL filmu + Przycisk Kopiuj adres URL filmu jest widoczny. Dotknij, aby skopiować adres URL filmu. Dotknij i przytrzymaj, aby skopiować z sygnaturą czasową + Przycisk Kopiuj adres URL filmu nie jest widoczny + Przycisk od kopiowania URL filmu z czasem + Przycisk Kopiuj adres URL z sygnaturą czasową jest widoczny. Dotknij, aby skopiować adres URL filmu z sygnaturą czasową. Dotknij i przytrzymaj, aby skopiować bez sygnatury czasowej + Przycisk Kopiuj adres URL z sygnaturą czasową nie jest widoczny + + + Okno dialogowe treści ograniczonej do oglądania + Okno dialogowe zostanie usunięte + Okno dialogowe zostanie wyświetlone + To nie pomija ograniczeń wiekowych i akceptuje je automatycznie. + + + Wyłącz wyskakujące okienko „Zaloguj się do telewizora” + Wyskakujące okienko Zaloguj się do telewizora jest wyłączone + Wyskakujące okienko Zaloguj się do telewizora jest włączone + + + Wyłącz pomijanie rozdziałów dwukrotnym stuknięciem + Dwukrotne stuknięcie nigdy nie spowoduje przejścia do następnego/poprzedniego rozdziału + Dwukrotne stuknięcie może sporadycznie spowodować przejście do następnego/poprzedniego rozdziału + + + Zewnętrzna aplikacja od pobierania + Ustawienia dla zewnętrznej aplikacji + Przycisk zewnętrznego pobierania + Przycisk pobierania w odtwarzaczu jest widoczny + Przycisk pobierania w odtwarzaczu nie jest widoczny + + Zamień przycisk akcji pobierania + Przycisk pobierania otwiera zewnętrzną aplikację + Przycisk pobierania otwiera natywne pobieranie w aplikacji + Nazwa pakietu aplikacji od pobierania + Nazwa pakietu zainstalowanej zewnętrznej aplikacji do pobierania + Wprowadź nazwę pakietu + Inne + Aplikacja nie jest zainstalowana + %s nie jest zainstalowany, zainstaluj. + "Nie znaleziono zainstalowanej aplikacji o nazwie pakietu: %s Sprawdź, czy nazwa pakietu jest prawidłowa i czy aplikacja jest zainstalowana" - Nazwa pakietu nie może być pusta - - - Gest precyzyjnego przewijania - Gest jest wyłączony - Gest jest włączony - - - Włącz dotknięcie, aby przewinąć - Dotknij, aby włączyć przewijanie - Dotknięcie, aby przewinąć, jest wyłączone - - - Gest jasności - "Przesuwanie jasności na pełnym ekranie jest włączone + Nazwa pakietu nie może być pusta + + + Gest precyzyjnego przewijania + Gest jest wyłączony + Gest jest włączony + + + Włącz dotknięcie, aby przewinąć + Dotknij, aby włączyć przewijanie + Dotknięcie, aby przewinąć, jest wyłączone + + + Gest jasności + "Przesuwanie jasności na pełnym ekranie jest włączone Dostosuj jasność, przesuwając pionowo po lewej stronie ekranu" - Przesuwanie jasności na pełnym ekranie jest wyłączone - Gest głośności - "Przesuwanie głośności na pełnym ekranie jest włączone + Przesuwanie jasności na pełnym ekranie jest wyłączone + Gest głośności + "Przesuwanie głośności na pełnym ekranie jest włączone Dostosuj głośność, przesuwając pionowo po prawej stronie ekranu" - Przesuwanie głośności na pełnym ekranie jest wyłączone - Włącz gest przesuwania przez naciśnięcie - Przesuwanie przez naciśnięcie jest włączone - Przesuwanie przez naciśnięcie jest wyłączone - Wibracje - Wibracje są włączone - Wibracje są wyłączone - Zapisywanie i przywracanie jasności - Zapisuj i przywracaj jasność podczas zamykania lub wchodzenia w tryb pełnoekranowy - Nie zapisuj i nie przywracaj jasności podczas zamykania lub wchodzenia w tryb pełnoekranowy - Gest automatycznej jasności - Przesunięcie w dół do najniższej wartości gestu jasności włącza automatyczną jasność - Przesunięcie w dół do najniższej wartości nie włącza automatycznej jasności - Automatycznie - Limit czasu widoczności nakładki - Liczba milisekund, przez które nakładka jest widoczna - Przejrzystość tła nakładki przesuwania - Wartość przezroczystości od 0 do 100 - Przezroczystość przesuwania musi być między 0 a 100 - Kolor nakładki przesunięcia dla jasności - Kolor paska postępu dla elementów sterujących jasnością - Kolor nakładki przesunięcia dla głośności - Kolor paska postępu dla elementów sterujących głośnością - Rozmiar tekstu nakładki przesuwania - Rozmiar tekstu dla nakładki przesunięcia między 1-30 - Rozmiar tekstu musi mieścić się w przedziale 1-30 - Minimalna długość przesunięcia - Wartość wymagana do wykonania gestu przesunięcia - Czułość przesunięcia głośności - O ile zmienia się głośność na przesunięcie - Styl nakładki przesuwania - Nakładka pozioma - Nakładka pozioma (minimalna - góra) - Nakładka pozioma (minimalna - środek) - Nakładka okrągła - Nakładka okrągła (minimalna) - Nakładka pionowa - Nakładka pionowa (minimalna) - Włącz przesuwanie palcem, aby zmienić filmy - Przesunięcie palcem w trybie pełnoekranowym spowoduje przejście do następnego lub poprzedniego filmu - Przesunięcie palcem w trybie pełnoekranowym nie spowoduje przejścia do następnego lub poprzedniego filmu - - - Automatyczne napisy - Automatyczne podpisy są wyłączone - Automatyczne podpisy są włączone - - - Przyciski akcji - Ukryj lub pokaż przyciski pod filmami - Wyłącz poświatę przycisków polubienia i subskrypcji - Przyciski polubienia i subskrypcji nie będą świecić po ich wzmiankowaniu - Przyciski polubienia i subskrypcji będą świecić po ich wzmiankowaniu - Przycisk od łapek w górę i w dół - Przyciski łapki w górę i w dół są ukryte - Przyciski łapki w górę i w dół są widoczne - - Przycisk od udostępniania - Przycisk udostępniania jest ukryty - Przycisk udostępniania jest widoczny - - Ukryj \"Zatrzymaj reklamy\" - Przycisk zatrzymania reklam jest ukryty - Przycisk zatrzymania reklam jest widoczny - - Ukryj komentarze - Przycisk komentarzy jest ukryty - Przycisk komentarzy jest widoczny - + + Automatyczne napisy + Automatyczne podpisy są wyłączone + Automatyczne podpisy są włączone + + + Przyciski akcji + Ukryj lub pokaż przyciski pod filmami + Wyłącz poświatę przycisków polubienia i subskrypcji + Przyciski polubienia i subskrypcji nie będą świecić po ich wzmiankowaniu + Przyciski polubienia i subskrypcji będą świecić po ich wzmiankowaniu + Przycisk od łapek w górę i w dół + Przyciski łapki w górę i w dół są ukryte + Przyciski łapki w górę i w dół są widoczne + + Przycisk od udostępniania + Przycisk udostępniania jest ukryty + Przycisk udostępniania jest widoczny + + Ukryj \"Zatrzymaj reklamy\" + Przycisk zatrzymania reklam jest ukryty + Przycisk zatrzymania reklam jest widoczny + + Ukryj komentarze + Przycisk komentarzy jest ukryty + Przycisk komentarzy jest widoczny + - Przycisk od zgłaszania - Przycisk zgłaszania jest ukryty - Przycisk zgłaszania jest widoczny - - Przycisk od remiksu - Przycisk remiksu jest ukryty - Przycisk remiksu jest widoczny - - Przycisk od pobierania - Przycisk pobierania jest ukryty - Przycisk pobierania jest widoczny - + Przycisk od remiksu + Przycisk remiksu jest ukryty + Przycisk remiksu jest widoczny + + Przycisk od pobierania + Przycisk pobierania jest ukryty + Przycisk pobierania jest widoczny + - Ukryj Hype - Przycisk Hype jest ukryty - Przycisk Hype jest wyświetlony - - Ukryj Promuj - Przycisk promocji jest ukryty - Przycisk promocji jest widoczny - - Przycisk od dziękowania - Przycisk od dziękowania jest ukryty - Przycisk od dziękowania jest widoczny - + Ukryj Promuj + Przycisk promocji jest ukryty + Przycisk promocji jest widoczny + + Przycisk od dziękowania + Przycisk od dziękowania jest ukryty + Przycisk od dziękowania jest widoczny + - Ukryj Zapytaj - Przycisk Zapytaj jest ukryty - Przycisk Zapytaj jest widoczny - - Przycisk od klipów - Przycisk tworzenia klipów jest ukryty - Przycisk tworzenia klipów jest widoczny - - Ukryj Sklep - Przycisk Sklep jest ukryty - Przycisk Sklep jest widoczny - - Ukryj Zapisz - Przycisk Zapisz jest ukryty - Przycisk Zapisz jest widoczny - - - Przyciski nawigacyjne - Ukryj lub zmień przyciski na pasku nawigacji - - Przycisk od głównej - Przycisk strony głównej jest ukryty - Przycisk strony głównej jest widoczny - - Przycisk od Shortsów - Przycisk Shortsów jest ukryty - Przycisk Shortsów jest widoczny - - Przycisk od przesyłania - Przycisk przesyłania jest ukryty - Przycisk przesyłania jest widoczny - - Przycisk od strony subskrypcji - Przycisk subskrypcji jest ukryty - Przycisk subskrypcji jest widoczny - Ukryj powiadomienia - Przycisk powiadomień jest ukryty - Przycisk powiadomień jest widoczny - - Przełącz przyciski Przesyłania z Powiadomieniami - "Przycisk Utwórz jest zamieniony z przyciskiem Powiadomienia + Ukryj Zapytaj + Przycisk Zapytaj jest ukryty + Przycisk Zapytaj jest widoczny + + Przycisk od klipów + Przycisk tworzenia klipów jest ukryty + Przycisk tworzenia klipów jest widoczny + + Ukryj Sklep + Przycisk Sklep jest ukryty + Przycisk Sklep jest widoczny + + Ukryj Zapisz + Przycisk Zapisz jest ukryty + Przycisk Zapisz jest widoczny + + + Przyciski nawigacyjne + Ukryj lub zmień przyciski na pasku nawigacji + + Przycisk od głównej + Przycisk strony głównej jest ukryty + Przycisk strony głównej jest widoczny + + Przycisk od Shortsów + Przycisk Shortsów jest ukryty + Przycisk Shortsów jest widoczny + + Przycisk od przesyłania + Przycisk przesyłania jest ukryty + Przycisk przesyłania jest widoczny + + Przycisk od strony subskrypcji + Przycisk subskrypcji jest ukryty + Przycisk subskrypcji jest widoczny + Ukryj powiadomienia + Przycisk powiadomień jest ukryty + Przycisk powiadomień jest widoczny + + Przełącz przyciski Przesyłania z Powiadomieniami + "Przycisk Utwórz jest zamieniony z przyciskiem Powiadomienia Uwaga: Włączenie tej opcji również ukrywa reklamy wideo" - Przycisk Przesyłania nie jest przełączony z przyciskiem Powiadomienia - "Wyłączenie tego ustawienia spowoduje również wyłączenie blokowania reklam w usłudze Shorts. + Przycisk Przesyłania nie jest przełączony z przyciskiem Powiadomienia + "Wyłączenie tego ustawienia spowoduje również wyłączenie blokowania reklam w usłudze Shorts. Jeśli zmiana tego ustawienia nie przyniesie efektu, spróbuj przełączyć się w tryb incognito." - Etykiety przycisków nawigacji - Etykiety są ukryte - Etykiety są widoczne - Wyłącz przezroczysty pasek statusu - Pasek statusu jest nieprzezroczysty - Pasek statusu jest nieprzezroczysty lub półprzezroczysty - Na niektórych urządzeniach włączenie tej funkcji może zmienić przezroczystość systemowego paska nawigacyjnego. - Wyłącz świetny, przezroczysty pasek - Pasek nawigacyjny w trybie świetnym jest nieprzezroczysty - Pasek nawigacji w trybie jasnym jest nieprzezroczysty lub półprzezroczysty - Wyłącz ciemny półprzezroczysty pasek - Pasek nawigacyjny w trybie ciemnym jest nieprzezroczysty - Pasek nawigacji w trybie ciemnym jest nieprzezroczysty lub półprzezroczysty - - - Menu ustawień - Ukryj lub pokaż elementy menu ustawień - - Menu napisów - Menu napisów jest ukryte - Menu napisów jest widoczne - - Menu dodatkowych ustawień - Menu dodatkowych ustawień jest ukryte - Menu dodatkowych ustawień jest widoczne - - Menu wyłącznika czasowego - Menu wyłącznika czasowego jest ukryte - Menu wyłącznika czasowego jest widoczne - - Menu pętli filmu - Menu pętli filmu jest ukryte - Menu pętli filmu jest widoczne - - Menu oświetlenia kinowego - Menu oświetlenia kinowego jest ukryte - Menu oświetlenia kinowego jest widoczne - Menu stabilnej głośności - Menu stabilnej głośności jest widoczne - Menu stabilnej głośności jest ukryte - - Menu pomocy i opinii - Menu pomocy i opinii jest ukryte - Menu pomocy i opinii jest widoczne - - Menu prędkości odtwarzania - Menu prędkości odtwarzania jest ukryte - Menu prędkości odtwarzania jest widoczne - - Menu blokady ekranu - Menu blokady ekranu jest ukryte - Menu blokady ekranu jest widoczne - - Ukryj Słuchaj w YouTube Music - Menu Słuchaj w YouTube Music jest ukryte - Menu Słuchaj w YouTube Music jest widoczne - - Menu ścieżki dźwiękowej - Menu ścieżki dźwiękowej jest ukryte - Menu ścieżki dźwiękowej jest widoczne - + + Menu ustawień + Ukryj lub pokaż elementy menu ustawień + + Menu napisów + Menu napisów jest ukryte + Menu napisów jest widoczne + + Menu dodatkowych ustawień + Menu dodatkowych ustawień jest ukryte + Menu dodatkowych ustawień jest widoczne + + Menu wyłącznika czasowego + Menu wyłącznika czasowego jest ukryte + Menu wyłącznika czasowego jest widoczne + + Menu pętli filmu + Menu pętli filmu jest ukryte + Menu pętli filmu jest widoczne + + Menu oświetlenia kinowego + Menu oświetlenia kinowego jest ukryte + Menu oświetlenia kinowego jest widoczne + Menu stabilnej głośności + Menu stabilnej głośności jest widoczne + Menu stabilnej głośności jest ukryte + + Menu pomocy i opinii + Menu pomocy i opinii jest ukryte + Menu pomocy i opinii jest widoczne + + Menu prędkości odtwarzania + Menu prędkości odtwarzania jest ukryte + Menu prędkości odtwarzania jest widoczne + + Menu blokady ekranu + Menu blokady ekranu jest ukryte + Menu blokady ekranu jest widoczne + + Ukryj Słuchaj w YouTube Music + Menu Słuchaj w YouTube Music jest ukryte + Menu Słuchaj w YouTube Music jest widoczne + + Menu ścieżki dźwiękowej + Menu ścieżki dźwiękowej jest ukryte + Menu ścieżki dźwiękowej jest widoczne + - "Menu ścieżek audio jest ukryte + "Menu ścieżek audio jest ukryte Aby wyświetlić menu ścieżek audio, zmień „Fałszowanie strumieni wideo” na 'Android No SDK'" - - Menu oglądania w VR - Menu oglądania w VR jest ukryte - Menu oglądania w VR jest widoczne - Ukryj menu jakości wideo - Menu jakości wideo jest ukryte - Menu jakości wideo jest wyświetlane - Opis menu jakości filmu - Opis menu jakości filmu jest ukryty - Opis menu jakości filmu jest widoczny - - - Ukryj przycisk automatycznego odtwarzania - Przycisk automatycznego odtwarzania jest ukryty - Przycisk automatycznego odtwarzania jest widoczny - - Ukryj przycisk napisów - Przycisk napisów jest ukryty - Przycisk napisów jest widoczny - Ukryj przycisk transmisji - Przycisk powielania jest ukryty - Przycisk powielania jest widoczny - Ukryj tło sterowania odtwarzacza - Tło elementów sterujących odtwarzacza jest ukryte - Tło sterowania odtwarzacza jest widoczne - Ukryj przyciski Poprzedni i Następny - Przyciski są ukryte - Przyciski są widoczne - - - Karty ekranu końcowego - Karty ekranu końcowego są ukryte - Karty ekranu końcowego są widoczne - - - Wyłącz tryb Ambient na pełnym ekranie - Oświetlenie kinowe wyłączone - Oświetlenie kinowe włączone - - - Karty informacyjne - Karty informacyjne są ukryte - Karty informacyjne są widoczne - - - Animacje liczb - Liczby nie są animowane - Liczby są animowane - - - Ukryj pasek przewijania odtwarzacza wideo - Pasek postępu w odtwarzaczu jest ukryty - Pasek postępu w odtwarzaczu jest widoczny - - Ukryj pasek przewijania miniatur wideo - Pasek przewijania miniatur wideo jest ukryty - Pasek przewijania miniatur wideo jest pokazany - - - Odtwarzacz Shortsów - Ukryj lub pokaż komponenty odtwarzacza Shorts - - Ukryj Shorts na stronie głównej - Ukryte na stronie głównej i w powiązanych filmach - Widoczne na stronie głównej i w powiązanych filmach - Shortsy w wynikach wyszukiwania - Ukryte w wynikach wyszukiwania - Wyświetlane w wynikach wyszukiwania - - Ukryj Shorts w subskrypcjach - Ukryte w subskrypcjach - Widoczne w subskrypcjach - Ukryj Shortsy w historii oglądania - Ukryte w historii oglądania - Wyświetlone w historii oglądania - Ukryj etykietę „Zautomatyzowane dubbingowanie” - Etykieta z automatycznym dubbingiem jest ukryta - Etykieta z automatycznym dubbingiem jest widoczna - Ukryj przycisk „Kup Superpodziękowania” - Przycisk „Kup Super podziękowania” jest ukryty - Przycisk „Kup Super podziękowania” jest widoczny - Ukryj przycisk efektu - Przycisk efektu jest ukryty - Przycisk efektu jest widoczny - Ukryj przycisk „Zielony ekran” - Przycisk od greenscreena jest ukryty - Przycisk od greenscreena jest widoczny - Przycisk hashtagu - Przycisk hashtagu jest ukryty - Przycisk hashtagu jest widoczny - - Ukryj przycisk \"Dołącz\" - Przycisk od sponsorowania jest ukryty - Przycisk od sponsorowania jest widoczny - Ukryj podgląd na żywo - Podgląd na żywo jest ukryty - Podgląd na żywo jest widoczny - Etykieta lokalizacji - Etykieta lokalizacji jest ukryta - Etykieta lokalizacji jest widoczna - Ukryj przycisk „Nowe posty” - Przycisk Nowe posty jest ukryty - Przycisk Nowe posty jest widoczny - Wstrzymane przyciski nakładki - Zatrzymane przyciski nakładki są ukryte - Wyświetlane są wstrzymane przyciski nakładki - Ukryj komentarz podglądu - Komentarz podglądu jest ukryty - Podgląd komentarza jest wyświetlany - Ukryj przycisk „Zapisz dźwięk” - Przycisk od zapisywania muzyki jest ukryty - Przycisk od zapisywania muzyki jest widoczny - Sugestie wyszukiwania - Sugestie wyszukiwania są ukryte - Sugestie wyszukiwania są widoczne - Ukryj przycisk \"Sklep\" - Przycisk sklepu jest ukryty - Przycisk sklepu jest widoczny - Naklejki - Naklejki są ukryte - Naklejki są widoczne - Ukryj przycisk \"Subskrybuj\" - Przycisk od subskrybowania jest ukryty - Przycisk od subskrybowania jest widoczny - Oznaczone produkty - Oznaczone produkty są ukryte - Oznaczone produkty są widoczne - Ukryj przycisk \"Nadchodzące\" - Przycisk nadchodzących jest ukryty - Przycisk nadchodzących jest widoczny - Ukryj przycisk „Użyj tego dźwięku” - Przycisk Użyj tego dźwięku jest ukryty - Przycisk Użyj tego dźwięku jest widoczny - Ukryj przycisk „Użyj tego szablonu” - Przycisk Użyj tego szablonu jest ukryty - Przycisk \"Użyj tego szablonu\" jest widoczny - Ukryj animację fontanny przycisku \"Lubię to\" - Animacja przycisku polubienia jest ukryta - Animacja przycisku polubienia jest widoczna - Ukryj przycisk \"Lubię to\" - Przycisk łapki w górę jest ukryty - Przycisk łapki w górę jest widoczny - Ukryj przycisk \"Nie lubię\" - Przycisk łapki w dół jest ukryty - Przycisk łapki w dół jest widoczny - Ukryj przycisk \"Komentarze\" - Przycisk komentarzy jest ukryty - Przycisk komentarzy jest widoczny - - Ukryj przycisk \"Udostępnij\" - Przycisk udostępniania jest ukryty - Przycisk udostępniania jest widoczny - - Ukryj przycisk \"Remiksuj\" - Przycisk remiksu jest ukryty - Przycisk remiksu jest widoczny - Przycisk dźwięku - Przycisk dźwięku jest ukryty - Przycisk dźwięku jest widoczny - Panel z informacjami - Panel informacji jest ukryty - Panel informacji jest widoczny - Pasek kanału - Pasek kanału jest ukryty - Pasek kanału jest widoczny - Tytuł filmu - Tytuł filmu jest ukryty - Tytuł filmu jest widoczny - Etykieta z metadanymi dźwięku - Etykieta metadanych dźwięku jest ukryta - Etykieta metadanych dźwięku jest widoczna - Ukryj etykietę linku do filmu - Etykieta linku do filmu jest ukryta - Etykieta linku do filmu jest widoczna - Pasek nawigacji - Pasek nawigacji jest ukryty - Pasek nawigacji jest widoczny - - - Ukryj sugerowane wideo na ekranie końcowym - "Sugerowane wideo na ekranie końcowym jest ukryte, gdy automatyczne odtwarzanie jest wyłączone + + Menu oglądania w VR + Menu oglądania w VR jest ukryte + Menu oglądania w VR jest widoczne + Ukryj menu jakości wideo + Menu jakości wideo jest ukryte + Menu jakości wideo jest wyświetlane + Opis menu jakości filmu + Opis menu jakości filmu jest ukryty + Opis menu jakości filmu jest widoczny + + + Ukryj przycisk automatycznego odtwarzania + Przycisk automatycznego odtwarzania jest ukryty + Przycisk automatycznego odtwarzania jest widoczny + + Ukryj przycisk napisów + Przycisk napisów jest ukryty + Przycisk napisów jest widoczny + Ukryj przycisk transmisji + Przycisk powielania jest ukryty + Przycisk powielania jest widoczny + Ukryj tło sterowania odtwarzacza + Tło elementów sterujących odtwarzacza jest ukryte + Tło sterowania odtwarzacza jest widoczne + Ukryj przyciski Poprzedni i Następny + Przyciski są ukryte + Przyciski są widoczne + + + Karty ekranu końcowego + Karty ekranu końcowego są ukryte + Karty ekranu końcowego są widoczne + + + Wyłącz tryb Ambient na pełnym ekranie + Oświetlenie kinowe wyłączone + Oświetlenie kinowe włączone + + + Karty informacyjne + Karty informacyjne są ukryte + Karty informacyjne są widoczne + + + Animacje liczb + Liczby nie są animowane + Liczby są animowane + + + Ukryj pasek przewijania odtwarzacza wideo + Pasek postępu w odtwarzaczu jest ukryty + Pasek postępu w odtwarzaczu jest widoczny + + Ukryj pasek przewijania miniatur wideo + Pasek przewijania miniatur wideo jest ukryty + Pasek przewijania miniatur wideo jest pokazany + + + Odtwarzacz Shortsów + Ukryj lub pokaż komponenty odtwarzacza Shorts + + Ukryj Shorts na stronie głównej + Ukryte na stronie głównej i w powiązanych filmach + Widoczne na stronie głównej i w powiązanych filmach + Shortsy w wynikach wyszukiwania + Ukryte w wynikach wyszukiwania + Wyświetlane w wynikach wyszukiwania + + Ukryj Shorts w subskrypcjach + Ukryte w subskrypcjach + Widoczne w subskrypcjach + Ukryj Shortsy w historii oglądania + Ukryte w historii oglądania + Wyświetlone w historii oglądania + Ukryj etykietę „Zautomatyzowane dubbingowanie” + Etykieta z automatycznym dubbingiem jest ukryta + Etykieta z automatycznym dubbingiem jest widoczna + Ukryj przycisk „Kup Superpodziękowania” + Przycisk „Kup Super podziękowania” jest ukryty + Przycisk „Kup Super podziękowania” jest widoczny + Ukryj przycisk efektu + Przycisk efektu jest ukryty + Przycisk efektu jest widoczny + Ukryj przycisk „Zielony ekran” + Przycisk od greenscreena jest ukryty + Przycisk od greenscreena jest widoczny + Przycisk hashtagu + Przycisk hashtagu jest ukryty + Przycisk hashtagu jest widoczny + + Ukryj przycisk \"Dołącz\" + Przycisk od sponsorowania jest ukryty + Przycisk od sponsorowania jest widoczny + Ukryj podgląd na żywo + Podgląd na żywo jest ukryty + Podgląd na żywo jest widoczny + Etykieta lokalizacji + Etykieta lokalizacji jest ukryta + Etykieta lokalizacji jest widoczna + Ukryj przycisk „Nowe posty” + Przycisk Nowe posty jest ukryty + Przycisk Nowe posty jest widoczny + Wstrzymane przyciski nakładki + Zatrzymane przyciski nakładki są ukryte + Wyświetlane są wstrzymane przyciski nakładki + Ukryj komentarz podglądu + Komentarz podglądu jest ukryty + Podgląd komentarza jest wyświetlany + Ukryj przycisk „Zapisz dźwięk” + Przycisk od zapisywania muzyki jest ukryty + Przycisk od zapisywania muzyki jest widoczny + Sugestie wyszukiwania + Sugestie wyszukiwania są ukryte + Sugestie wyszukiwania są widoczne + Ukryj przycisk \"Sklep\" + Przycisk sklepu jest ukryty + Przycisk sklepu jest widoczny + Naklejki + Naklejki są ukryte + Naklejki są widoczne + Ukryj przycisk \"Subskrybuj\" + Przycisk od subskrybowania jest ukryty + Przycisk od subskrybowania jest widoczny + Oznaczone produkty + Oznaczone produkty są ukryte + Oznaczone produkty są widoczne + Ukryj przycisk \"Nadchodzące\" + Przycisk nadchodzących jest ukryty + Przycisk nadchodzących jest widoczny + Ukryj przycisk „Użyj tego dźwięku” + Przycisk Użyj tego dźwięku jest ukryty + Przycisk Użyj tego dźwięku jest widoczny + Ukryj przycisk „Użyj tego szablonu” + Przycisk Użyj tego szablonu jest ukryty + Przycisk \"Użyj tego szablonu\" jest widoczny + Ukryj animację fontanny przycisku \"Lubię to\" + Animacja przycisku polubienia jest ukryta + Animacja przycisku polubienia jest widoczna + Ukryj przycisk \"Lubię to\" + Przycisk łapki w górę jest ukryty + Przycisk łapki w górę jest widoczny + Ukryj przycisk \"Nie lubię\" + Przycisk łapki w dół jest ukryty + Przycisk łapki w dół jest widoczny + Ukryj przycisk \"Komentarze\" + Przycisk komentarzy jest ukryty + Przycisk komentarzy jest widoczny + + Ukryj przycisk \"Udostępnij\" + Przycisk udostępniania jest ukryty + Przycisk udostępniania jest widoczny + + Ukryj przycisk \"Remiksuj\" + Przycisk remiksu jest ukryty + Przycisk remiksu jest widoczny + Przycisk dźwięku + Przycisk dźwięku jest ukryty + Przycisk dźwięku jest widoczny + Panel z informacjami + Panel informacji jest ukryty + Panel informacji jest widoczny + Pasek kanału + Pasek kanału jest ukryty + Pasek kanału jest widoczny + Tytuł filmu + Tytuł filmu jest ukryty + Tytuł filmu jest widoczny + Etykieta z metadanymi dźwięku + Etykieta metadanych dźwięku jest ukryta + Etykieta metadanych dźwięku jest widoczna + Ukryj etykietę linku do filmu + Etykieta linku do filmu jest ukryta + Etykieta linku do filmu jest widoczna + Pasek nawigacji + Pasek nawigacji jest ukryty + Pasek nawigacji jest widoczny + + + Ukryj sugerowane wideo na ekranie końcowym + "Sugerowane wideo na ekranie końcowym jest ukryte, gdy automatyczne odtwarzanie jest wyłączone Automatyczne odtwarzanie można zmienić w ustawieniach YouTube: Ustawienia → Odtwarzanie → Autoodtwarzanie następnego filmu" - Sugerowane wideo na ekranie końcowym jest wyświetlane - - - Ukryj nakładkę powiązanych filmów - Nakładka powiązanych filmów na pełnym ekranie jest ukryta - Nakładka powiązanych filmów na pełnym ekranie jest widoczna - - - Znacznik czasu filmu - Znacznik czasu jest ukryty - Znacznik czasu jest widoczny - - - Wyskakujące panele - Wyskakujące panele odtwarzacza są ukryte - Wyskakujące panele odtwarzacza są widoczne - - - Wyjdź z trybu pełnoekranowego pod koniec filmu - Wyłączone - Portret - Pejzaż - Portret i pejzaż - - - Filmy w trybie pełnoekranowym - Filmy otwierają się w trybie pełnoekranowym - Filmy nie otwierają się w trybie pełnoekranowym - - - Przezroczystość nakładki odtwarzacza - Wartość przezroczystości między 0-100, gdzie 0 jest przezroczysty - Przezroczystość nakładki odtwarzacza musi być pomiędzy 0-100 - - - - Łapki w dół są tymczasowo niedostępne (API nie reaguje) - Łapki w dół niedostępne (status %d) - Oceny negatywne są niedostępne (limit API klienta) - Łapki w dół niedostępne (%s) - - Odśwież film, aby zagłosować za pomocą Return YouTube Dislike - - Ukryte przez właściciela - Przywróć YouTube Dislike - Łapki w dół są widoczne - Łapki w dół są ukryte - Łapki w dół na Shortsach - "Oceny negatywne na Shorts są widoczne + Sugerowane wideo na ekranie końcowym jest wyświetlane + + + Ukryj nakładkę powiązanych filmów + Nakładka powiązanych filmów na pełnym ekranie jest ukryta + Nakładka powiązanych filmów na pełnym ekranie jest widoczna + + + Znacznik czasu filmu + Znacznik czasu jest ukryty + Znacznik czasu jest widoczny + + + Wyskakujące panele + Wyskakujące panele odtwarzacza są ukryte + Wyskakujące panele odtwarzacza są widoczne + + + Wyjdź z trybu pełnoekranowego pod koniec filmu + Wyłączone + Portret + Pejzaż + Portret i pejzaż + + + Filmy w trybie pełnoekranowym + Filmy otwierają się w trybie pełnoekranowym + Filmy nie otwierają się w trybie pełnoekranowym + + + Przezroczystość nakładki odtwarzacza + Wartość przezroczystości między 0-100, gdzie 0 jest przezroczysty + Przezroczystość nakładki odtwarzacza musi być pomiędzy 0-100 + + + + Łapki w dół są tymczasowo niedostępne (API nie reaguje) + Łapki w dół niedostępne (status %d) + Oceny negatywne są niedostępne (limit API klienta) + Łapki w dół niedostępne (%s) + + Odśwież film, aby zagłosować za pomocą Return YouTube Dislike + + Ukryte przez właściciela + Przywróć YouTube Dislike + Łapki w dół są widoczne + Łapki w dół są ukryte + Łapki w dół na Shortsach + "Oceny negatywne na Shorts są widoczne Ograniczenie: Oceny negatywne mogą nie pojawiać się w trybie incognito" - Oceny negatywne na Shorts nie są widoczne - Łapki w dół jako procent - Oceny negatywne są wyświetlane jako procent - Oceny negatywne są wyświetlane jako liczba - - Kompaktowy przycisk \"Lubię to\" - Przycisk łapki stylizowany dla minimalnej szerokości - Przycisk łapki stylizowany dla najlepszego wyglądu - Pokaż szacunkową liczbę polubień - Filmy z wyłączonymi polubieniami wyświetlają szacunkową liczbę polubień - Szacunkowa liczba polubień nie jest wyświetlana - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny - Komunikat nie jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny - ReturnYouTubeDislike.com - Dane są dostarczane przez API Return YouTube Dislike. Dotknij tutaj, aby dowiedzieć się więcej - - Statystyki ReturnYouTubeDislike tego urządzenia - Średni czas odpowiedzi API - Minimalny czas odpowiedzi API - Maksymalny czas odpowiedzi API - Czas odpowiedzi API z ostatniego filmu - Łapki w dół tymczasowo niedostępne - wprowadzono limit żądań klienta API - Liczba połączeń do API podczas pobierania łapek - Nie wykonano połączeń sieciowych - %d wykonanych połączeń sieciowych - Liczba przekroczeń czasu API podczas pobierania łapek - Brak połączeń sieciowych zakończonych upływem czasu - %d połączeń sieciowych zakończonych upływem czasu - Limity żądań klienta API - Nie napotkano limitów żądań klienta - Limit żądania klient przekroczony %d razy - %d milisekund - - - Szeroki pasek wyszukiwania - Szeroki pasek wyszukiwania jest włączony - Szeroki pasek wyszukiwania jest wyłączony - - - Miniaturki wysokiej jakości - Podgląd filmu w wysokiej jakości - Podgląd filmu w średniej jakości - Miniatury paska wyszukiwania na pełnym ekranie są wysokiej jakości - Miniatury paska wyszukiwania na pełnym ekranie są średniej jakości - "Przywróci to również miniatury w transmisjach na żywo, które nie mają miniatury paska postępu. + Oceny negatywne na Shorts nie są widoczne + Łapki w dół jako procent + Oceny negatywne są wyświetlane jako procent + Oceny negatywne są wyświetlane jako liczba + + Kompaktowy przycisk \"Lubię to\" + Przycisk łapki stylizowany dla minimalnej szerokości + Przycisk łapki stylizowany dla najlepszego wyglądu + Pokaż szacunkową liczbę polubień + Filmy z wyłączonymi polubieniami wyświetlają szacunkową liczbę polubień + Szacunkowa liczba polubień nie jest wyświetlana + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny + Komunikat nie jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny + ReturnYouTubeDislike.com + Dane są dostarczane przez API Return YouTube Dislike. Dotknij tutaj, aby dowiedzieć się więcej + + Statystyki ReturnYouTubeDislike tego urządzenia + Średni czas odpowiedzi API + Minimalny czas odpowiedzi API + Maksymalny czas odpowiedzi API + Czas odpowiedzi API z ostatniego filmu + Łapki w dół tymczasowo niedostępne - wprowadzono limit żądań klienta API + Liczba połączeń do API podczas pobierania łapek + Nie wykonano połączeń sieciowych + %d wykonanych połączeń sieciowych + Liczba przekroczeń czasu API podczas pobierania łapek + Brak połączeń sieciowych zakończonych upływem czasu + %d połączeń sieciowych zakończonych upływem czasu + Limity żądań klienta API + Nie napotkano limitów żądań klienta + Limit żądania klient przekroczony %d razy + %d milisekund + + + Szeroki pasek wyszukiwania + Szeroki pasek wyszukiwania jest włączony + Szeroki pasek wyszukiwania jest wyłączony + + + Miniaturki wysokiej jakości + Podgląd filmu w wysokiej jakości + Podgląd filmu w średniej jakości + Miniatury paska wyszukiwania na pełnym ekranie są wysokiej jakości + Miniatury paska wyszukiwania na pełnym ekranie są średniej jakości + "Przywróci to również miniatury w transmisjach na żywo, które nie mają miniatury paska postępu. Miniatury paska postępu będą używać takiej samej jakości jak aktualny film. Ta funkcja działa najlepiej przy jakości wideo 720p lub niższej i przy korzystaniu z bardzo szybkiego połączenia internetowego." - Stare miniatury paska nawigacji - Podgląd filmu pojawia się nad paskiem postępu filmów - Podgląd filmu pojawia się w trybie pełnoekranowym - - - SponsorBlock - SponsorBlock - SponsorBlock to system społecznościowy służący do pomijania irytujących części filmów na YouTube - Wygląd - Przycisk głosowania - Przycisk głosowania jest widoczny - Przycisk głosowania nie jest widoczny - Użyj kwadratowego układu - Przyciski i elementy sterujące są kwadratowe - Przyciski i elementy sterujące są zaokrąglone - - Użyj kompaktowego przycisku pomijania - Przycisk od pomijania stylizowany dla minimalnej szerokości - Przycisk od pomijania stylizowany dla najlepszego wyglądu - Automatycznie ukryj przycisk pomijania - Przycisk od pomijania ukrywa się po kilku sekundach - Przycisk pomijania jest wyświetlany dla całego segmentu - Czas trwania przycisku pominięcia - Jak długo wyświetlać przyciski pomijania i przechodzenia do wyróżnienia przed automatycznym ukryciem - Pokaż komunikat o cofnięciu pominięcia - Komunikat jest wyświetlany, gdy segment zostanie automatycznie pominięty. Dotknij powiadomienia, aby cofnąć pominięcie - Komunikat nie jest wyświetlany - Czas trwania komunikatu pominięcia - Jak długo wyświetlać komunikat wyskakujący o cofnięciu pominięcia - 1 sekunda - 2 sekundy - 3 sekundy - 4 sekundy - 5 sekund - 6 sekund - 7 sekund - 8 sekund - 9 sekund - 10 sekund - Długość filmu bez segmentów - Długość wideo pomniejszona o wszystkie segmenty jest wyświetlana na pasku przewijania - Pełna długość wideo wyświetlana - Tworzenie nowych segmentów - Pokaż przycisk „Utwórz nowy segment” - Przycisk tworzenia jest widoczny - Przycisk tworzenia nie jest widoczny - Dokładność tworzenia nowego segmentu - Ilość milisekund, o którą przeskakuje czas podczas używania przycisków od tworzenia segmentów - Wartość musi być liczbą dodatnią - Wyświetl wytyczne - Wytyczne zawierają zasady i wskazówki dotyczące tworzenia nowych segmentów - Postępuj zgodnie z wytycznymi - Przeczytaj wytyczne SponsorBlock przed tworzeniem nowych segmentów - Przeczytano - Pokaż mi - Ogólne - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli SponsorBlock nie jest dostępny - Komunikat nie jest wyświetlany, jeśli SponsorBlock nie jest dostępny - Śledzenie licznika pominięć - Pozwala tabeli wyników SponsorBlock\'a wiedzieć, ile czasu zostało zaoszczędzone. Wiadomość jest wysyłana do tabeli wyników za każdym razem, gdy segment zostanie pominięty - Śledzenie licznika pominięć nie jest włączone - Minimalna długość segmentu - Segmenty krótsze niż ta wartość (w sekundach) nie będą wyświetlane lub pominięte - Nieprawidłowy czas trwania - Twój prywatny identyfikator użytkownika - Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty - Identyfikator użytkownika prywatnego musi mieć co najmniej 30 znaków - Zmień adres URL API - Adres, który jest używany przez SponsorBlock do wykonywania połączeń z serwerem - Zresetuj adres API - Adres API jest nieprawidłowy - Adres API został zmieniony - Importuj/Eksportuj ustawienia - Kopiuj - Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka - Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka. Obejmuje to Twój identyfikator użytkownika prywatnego. Dziel się nim mądrze. - Ustawienia zaimportowane pomyślnie - Nie udało się zaimportować: %s - Nie udało się wyeksportować: %s - "Twoje ustawienia zawierają prywatny identyfikator użytkownika SponsorBlock. + Stare miniatury paska nawigacji + Podgląd filmu pojawia się nad paskiem postępu filmów + Podgląd filmu pojawia się w trybie pełnoekranowym + + + SponsorBlock + SponsorBlock + SponsorBlock to system społecznościowy służący do pomijania irytujących części filmów na YouTube + Wygląd + Przycisk głosowania + Przycisk głosowania jest widoczny + Przycisk głosowania nie jest widoczny + Użyj kwadratowego układu + Przyciski i elementy sterujące są kwadratowe + Przyciski i elementy sterujące są zaokrąglone + + Użyj kompaktowego przycisku pomijania + Przycisk od pomijania stylizowany dla minimalnej szerokości + Przycisk od pomijania stylizowany dla najlepszego wyglądu + Automatycznie ukryj przycisk pomijania + Przycisk od pomijania ukrywa się po kilku sekundach + Przycisk pomijania jest wyświetlany dla całego segmentu + Czas trwania przycisku pominięcia + Jak długo wyświetlać przyciski pomijania i przechodzenia do wyróżnienia przed automatycznym ukryciem + Pokaż komunikat o cofnięciu pominięcia + Komunikat jest wyświetlany, gdy segment zostanie automatycznie pominięty. Dotknij powiadomienia, aby cofnąć pominięcie + Komunikat nie jest wyświetlany + Czas trwania komunikatu pominięcia + Jak długo wyświetlać komunikat wyskakujący o cofnięciu pominięcia + 1 sekunda + 2 sekundy + 3 sekundy + 4 sekundy + 5 sekund + 6 sekund + 7 sekund + 8 sekund + 9 sekund + 10 sekund + Długość filmu bez segmentów + Długość wideo pomniejszona o wszystkie segmenty jest wyświetlana na pasku przewijania + Pełna długość wideo wyświetlana + Tworzenie nowych segmentów + Pokaż przycisk „Utwórz nowy segment” + Przycisk tworzenia jest widoczny + Przycisk tworzenia nie jest widoczny + Dokładność tworzenia nowego segmentu + Ilość milisekund, o którą przeskakuje czas podczas używania przycisków od tworzenia segmentów + Wartość musi być liczbą dodatnią + Wyświetl wytyczne + Wytyczne zawierają zasady i wskazówki dotyczące tworzenia nowych segmentów + Postępuj zgodnie z wytycznymi + Przeczytaj wytyczne SponsorBlock przed tworzeniem nowych segmentów + Przeczytano + Pokaż mi + Ogólne + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli SponsorBlock nie jest dostępny + Komunikat nie jest wyświetlany, jeśli SponsorBlock nie jest dostępny + Śledzenie licznika pominięć + Pozwala tabeli wyników SponsorBlock\'a wiedzieć, ile czasu zostało zaoszczędzone. Wiadomość jest wysyłana do tabeli wyników za każdym razem, gdy segment zostanie pominięty + Śledzenie licznika pominięć nie jest włączone + Minimalna długość segmentu + Segmenty krótsze niż ta wartość (w sekundach) nie będą wyświetlane lub pominięte + Nieprawidłowy czas trwania + Twój prywatny identyfikator użytkownika + Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty + Identyfikator użytkownika prywatnego musi mieć co najmniej 30 znaków + Zmień adres URL API + Adres, który jest używany przez SponsorBlock do wykonywania połączeń z serwerem + Zresetuj adres API + Adres API jest nieprawidłowy + Adres API został zmieniony + Importuj/Eksportuj ustawienia + Kopiuj + Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka + Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka. Obejmuje to Twój identyfikator użytkownika prywatnego. Dziel się nim mądrze. + Ustawienia zaimportowane pomyślnie + Nie udało się zaimportować: %s + Nie udało się wyeksportować: %s + "Twoje ustawienia zawierają prywatny identyfikator użytkownika SponsorBlock. Twój identyfikator użytkownika jest jak hasło i nigdy nie powinno być udostępniane. " - Nie pokazuj ponownie - Zmień zachowanie segmentu - Treści sponsorowane - Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają - Nieopłacona/Autopromocja - Podobny do SponsorBlock, ale dotyczący nieopłaconej lub autoreklamowanej treści. Obejmuje sekcje dotyczące towarów, darowizn lub informacji o tym, z kim współpracowali - Przypomnienie o interakcji - Krótkie przypomnienie o łapce w górę, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja - Najważniejsze - Część filmu, której szuka większość osób - Przerywnik/Animowane intro - Fragment bez aktualnej zawartości. Może to być pauza, statyczna klatka lub powtarzająca się animacja. Nie dotyczy przejść zawierających informacje - Ekran końcowy / Napisy - Napisy końcowe lub gdy pojawia się ekran końcowy. Nie dotyczy zakończeń zawierających informacje - Wprowadzenie / Pozdrowienia - Zwiastuny nadchodzącego wideo z narracją, pozdrowienia i pożegnania. Nie obejmuje sekcji, które dodają dodatkową treść - Zapowiedź / Podsumowanie - Zbiór klipów pokazujących to, co pojawi się lub co pojawiło się w tym filmie, oraz innych fiilmach z tej serii, w którym wszystkie informacje są gdzieś powielane - Dygresja / Żarty - Sceny poboczne lub żarty, które nie są wymagane do zrozumienia głównej treści filmu. Nie obejmuje sekcji dostarczających kontekstu lub szczegółów tła - Muzyka: Sekcja bez muzyki - Tylko do użytku w teledyskach. Sekcje teledysków, które nie są uwzględnione w innej kategorii - Pomiń - Najważniejsze informacje - Pomiń sponsora - Pomiń promocję - Pomiń przypomnienie o interakcji - Pomiń do najważniejszych informacji - Pomiń wprowadzenie - Pomiń przerywnik - Pomiń przerywnik - Pomiń zakończenie - Pomiń haczyk - Pomiń podgląd - Pomiń podgląd - Pomiń podsumowanie - Pomiń wątek poboczny - Pomiń fragment bez muzyki - Pomiń segment - Pominięto treści sponsorowane - Pominięto autopromocję - Pominięto irytujące przypomnienie - Pominięto do najważniejszych informacji - Pominięto wstęp - Pominięto przerywnik - Pominięto przerywnik - Pominięto zakończenie - Pominięto haczyk - Pominięto podgląd - Pominięto podgląd - Pominięto podsumowanie - Pominięto wątek poboczny - Pominięto fragment bez muzyki - Pominięto niezgłoszony segment - Pominięto wiele segmentów - Pomiń automatycznie - Pomiń automatycznie raz - Pokaż przycisk „Pomiń” - Pokaż w pasku postępu filmu - Wyłącz - Nie można przesłać segmentu: %s - SponsorBlock jest tymczasowo niedostępny - Nie można przesłać segmentu (status: %1$d %2$s) - Nie można wysłać segmentu. Ograniczono szybkość (za dużo od tego samego użytkownika lub IP) - Nie można przesłać segmentu: %s - "Nie można wysłać segmentu. + Nie pokazuj ponownie + Zmień zachowanie segmentu + Treści sponsorowane + Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają + Nieopłacona/Autopromocja + Podobny do SponsorBlock, ale dotyczący nieopłaconej lub autoreklamowanej treści. Obejmuje sekcje dotyczące towarów, darowizn lub informacji o tym, z kim współpracowali + Przypomnienie o interakcji + Krótkie przypomnienie o łapce w górę, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja + Najważniejsze + Część filmu, której szuka większość osób + Przerywnik/Animowane intro + Fragment bez aktualnej zawartości. Może to być pauza, statyczna klatka lub powtarzająca się animacja. Nie dotyczy przejść zawierających informacje + Ekran końcowy / Napisy + Napisy końcowe lub gdy pojawia się ekran końcowy. Nie dotyczy zakończeń zawierających informacje + Wprowadzenie / Pozdrowienia + Zwiastuny nadchodzącego wideo z narracją, pozdrowienia i pożegnania. Nie obejmuje sekcji, które dodają dodatkową treść + Zapowiedź / Podsumowanie + Zbiór klipów pokazujących to, co pojawi się lub co pojawiło się w tym filmie, oraz innych fiilmach z tej serii, w którym wszystkie informacje są gdzieś powielane + Dygresja / Żarty + Sceny poboczne lub żarty, które nie są wymagane do zrozumienia głównej treści filmu. Nie obejmuje sekcji dostarczających kontekstu lub szczegółów tła + Muzyka: Sekcja bez muzyki + Tylko do użytku w teledyskach. Sekcje teledysków, które nie są uwzględnione w innej kategorii + Pomiń + Najważniejsze informacje + Pomiń sponsora + Pomiń promocję + Pomiń przypomnienie o interakcji + Pomiń do najważniejszych informacji + Pomiń wprowadzenie + Pomiń przerywnik + Pomiń przerywnik + Pomiń zakończenie + Pomiń haczyk + Pomiń podgląd + Pomiń podgląd + Pomiń podsumowanie + Pomiń wątek poboczny + Pomiń fragment bez muzyki + Pomiń segment + Pominięto treści sponsorowane + Pominięto autopromocję + Pominięto irytujące przypomnienie + Pominięto do najważniejszych informacji + Pominięto wstęp + Pominięto przerywnik + Pominięto przerywnik + Pominięto zakończenie + Pominięto haczyk + Pominięto podgląd + Pominięto podgląd + Pominięto podsumowanie + Pominięto wątek poboczny + Pominięto fragment bez muzyki + Pominięto niezgłoszony segment + Pominięto wiele segmentów + Pomiń automatycznie + Pomiń automatycznie raz + Pokaż przycisk „Pomiń” + Pokaż w pasku postępu filmu + Wyłącz + Nie można przesłać segmentu: %s + SponsorBlock jest tymczasowo niedostępny + Nie można przesłać segmentu (status: %1$d %2$s) + Nie można wysłać segmentu. Ograniczono szybkość (za dużo od tego samego użytkownika lub IP) + Nie można przesłać segmentu: %s + "Nie można wysłać segmentu. Istnieje już" - Pomyślnie przesłano segment - - SponsorBlock jest niedostępny (API nie reaguje) - SponsorBlock tymczasowo niedostępny (status %d) - SponsorBlock tymczasowo niedostępny - Nie można zagłosować na segment (limit czasu) - Nie można zagłosować na segment (status: %1$d %2$s) - Nie można zagłosować na segment: %s - Głos za - Głos przeciw - Zmień kategorię - Brak segmentów do zagłosowania - - %1$s do %2$s - Wybierz kategorię segmentu - Kategoria jest wyłączona w ustawieniach. Włącz kategorię do wysłania. - Nowy segment SponsorBlocka - Ustawić %s jako początek lub koniec nowego segmentu? - Start - Koniec - Teraz - Czas rozpoczęcia segmentu od - Czas zakończenia segmentu od - Czy te czasy są poprawne? - "Segment pochodzi z + Pomyślnie przesłano segment + + SponsorBlock jest niedostępny (API nie reaguje) + SponsorBlock tymczasowo niedostępny (status %d) + SponsorBlock tymczasowo niedostępny + Nie można zagłosować na segment (limit czasu) + Nie można zagłosować na segment (status: %1$d %2$s) + Nie można zagłosować na segment: %s + Głos za + Głos przeciw + Zmień kategorię + Brak segmentów do zagłosowania + + %1$s do %2$s + Wybierz kategorię segmentu + Kategoria jest wyłączona w ustawieniach. Włącz kategorię do wysłania. + Nowy segment SponsorBlocka + Ustawić %s jako początek lub koniec nowego segmentu? + Start + Koniec + Teraz + Czas rozpoczęcia segmentu od + Czas zakończenia segmentu od + Czy te czasy są poprawne? + "Segment pochodzi z od %1$s do @@ -1288,47 +1287,47 @@ do (%3$s) Gotowy do przesłania?" - Początek musi być przed końcem - Zaznacz dwa miejsca na pasku czasu - Zobacz i dopilnuj, aby segment pomijał się płynnie - Edytuj ręcznie czas segmentu - Czy chcesz edytować czas rozpoczęcia lub zakończenia segmentu? - Podano nieprawidłowy format czasu - Statystyki - - Statystyki są tymczasowo niedostępne (API nie działa) - Wczytywanie... - SponsorBlock jest wyłączony - Twoja nazwa użytkownika: <b>%s</b> - Dotknij tutaj, aby zmienić nazwę użytkownika - Nie można zmienić nazwy użytkownika: Status: %1$d %2$s - Nazwa użytkownika została zmieniona - Twoja reputacja to <b>%.2f</b> - Stworzyłeś <b>%s</b> segmentów - Dotknij tutaj, aby zobaczyć swoje segmenty - Tablica wyników SponsorBlock - Uchroniłeś ludzi przed <b>%s</b> segmentami - Dotknij tutaj, aby zobaczyć globalne statystyki i najlepszych współtwórców - To <b>%s</b> ich życia.<br>Dotknij tutaj, aby zobaczyć tabelę wyników - Pominąłeś(aś) <b>%s</b> segmentów - To <b>%s</b> - Czy chcesz zresetować ilość pominiętych segmentów? - %1$s godzin %2$s minut - %1$s minut %2$s sekund - %s sekund - Krycie: - Kolor: - O aplikacji - sponsor.ajay.app - Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy - - - Współczynnik kształtu - Domyślny - Telefon - Tabletowy - Motoryzacja - "Zmiany obejmują: + Początek musi być przed końcem + Zaznacz dwa miejsca na pasku czasu + Zobacz i dopilnuj, aby segment pomijał się płynnie + Edytuj ręcznie czas segmentu + Czy chcesz edytować czas rozpoczęcia lub zakończenia segmentu? + Podano nieprawidłowy format czasu + Statystyki + + Statystyki są tymczasowo niedostępne (API nie działa) + Wczytywanie... + SponsorBlock jest wyłączony + Twoja nazwa użytkownika: <b>%s</b> + Dotknij tutaj, aby zmienić nazwę użytkownika + Nie można zmienić nazwy użytkownika: Status: %1$d %2$s + Nazwa użytkownika została zmieniona + Twoja reputacja to <b>%.2f</b> + Stworzyłeś <b>%s</b> segmentów + Dotknij tutaj, aby zobaczyć swoje segmenty + Tablica wyników SponsorBlock + Uchroniłeś ludzi przed <b>%s</b> segmentami + Dotknij tutaj, aby zobaczyć globalne statystyki i najlepszych współtwórców + To <b>%s</b> ich życia.<br>Dotknij tutaj, aby zobaczyć tabelę wyników + Pominąłeś(aś) <b>%s</b> segmentów + To <b>%s</b> + Czy chcesz zresetować ilość pominiętych segmentów? + %1$s godzin %2$s minut + %1$s minut %2$s sekund + %s sekund + Krycie: + Kolor: + O aplikacji + sponsor.ajay.app + Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy + + + Współczynnik kształtu + Domyślny + Telefon + Tabletowy + Motoryzacja + "Zmiany obejmują: Układ tabletu • Posty społeczności są ukryte @@ -1336,329 +1335,329 @@ Układ tabletu Układ samochodowy • Shorts otwierają się w zwykłym odtwarzaczu • Kanał jest uporządkowany według tematów i kanałów" - - - Oszukiwanie wersji aplikacji - Oszukiwanie wersji jest włączone - Oszukiwanie wersji jest wyłączone - "Wersja aplikacji zostanie zmieniona na starszą wersję YouTube. + + + Oszukiwanie wersji aplikacji + Oszukiwanie wersji jest włączone + Oszukiwanie wersji jest wyłączone + "Wersja aplikacji zostanie zmieniona na starszą wersję YouTube. Spowoduje to zmianę wyglądu i funkcjonalności aplikacji, ale mogą wystąpić nieznane efekty uboczne. Jeśli później zostanie wyłączony, zaleca się wyczyszczenie danych aplikacji, aby zapobiec błędom interfejsu użytkownika." - Docelowa oszukiwana wersja aplikacji - 20.13.41 - Przywróć niezwinięty pasek akcji wideo - 20.05.46 - Przywróć funkcję transkrypcji - 19.35.36 - Przywraca stare ikony odtwarzacza Shortsów - 19.01.34 – Przywróć stare ikony nawigacji - - - Zmień stronę startową - Domyślna - Wszystkie subskrypcje - Przeglądaj kanały - Kursy / Nauka - Odkrywanie - Moda i uroda - Gry - Historia - Biblioteka - Polubione filmy - Na żywo - Filmy - Muzyka - Wiadomości - Powiadomienia - Playlisty - Szukaj - Zakupy - Shorts - Sport - Subskrypcje - Na czasie - Wirtualna rzeczywistość - Do obejrzenia - Twoje klipy - Zawsze zmieniaj stronę startową - "Strona startowa jest zawsze zmieniana + Docelowa oszukiwana wersja aplikacji + 20.13.41 - Przywróć niezwinięty pasek akcji wideo + 20.05.46 - Przywróć funkcję transkrypcji + 19.35.36 - Przywraca stare ikony odtwarzacza Shortsów + 19.01.34 – Przywróć stare ikony nawigacji + + + Zmień stronę startową + Domyślna + Wszystkie subskrypcje + Przeglądaj kanały + Kursy / Nauka + Odkrywanie + Moda i uroda + Gry + Historia + Biblioteka + Polubione filmy + Na żywo + Filmy + Muzyka + Wiadomości + Powiadomienia + Playlisty + Szukaj + Zakupy + Shorts + Sport + Subskrypcje + Na czasie + Wirtualna rzeczywistość + Do obejrzenia + Twoje klipy + Zawsze zmieniaj stronę startową + "Strona startowa jest zawsze zmieniana Ograniczenie: użycie przycisku wstecz na pasku narzędzi może nie działać" - Strona startowa jest zmieniana tylko przy uruchomieniu aplikacji - - - Wznawianie odtwarzacza Shortsów - Odtwarzacz Shortsów nie będzie wznawiany przy starcie aplikacji - Odtwarzacz Shortsów zostanie wznowiony przy starcie aplikacji - - - Otwórz Shorts z - Odtwarzacz Shortsów - Odtwarzacz regularny - Odtwarzacz regularny na pełnym ekranie - - - Autoodtwarzanie Shortsów - Shortsy będą odtwarzane automatycznie - Shortsy będą się powtarzać - Autoodtwarzanie Shortsów w tle - Odtwarzanie w tle Shortsów będzie automatyczne - Odtwarzanie w tle Shortsów będzie się powtarzać - - - Miniodtwarzacz - Zmień styl zminimalizowanego odtwarzacza aplikacji - Typ miniodtwarzacza - Wyłączony - Domyślny - Minimalny - Tabletowy - Nowoczesny 1 - Nowoczesny 2 - Nowoczesny 3 - Nowoczesny 4 - Wyłącz zaokrąglone rogi - Narożniki są kwadratowe - Narożniki są zaokrąglone - Podwójne stuknięcie i uszczypnięcie, aby zmienić rozmiar - "Akcja dwukrotnego dotknięcia i gest szczypania w celu zmiany rozmiaru są włączone + Strona startowa jest zmieniana tylko przy uruchomieniu aplikacji + + + Wznawianie odtwarzacza Shortsów + Odtwarzacz Shortsów nie będzie wznawiany przy starcie aplikacji + Odtwarzacz Shortsów zostanie wznowiony przy starcie aplikacji + + + Otwórz Shorts z + Odtwarzacz Shortsów + Odtwarzacz regularny + Odtwarzacz regularny na pełnym ekranie + + + Autoodtwarzanie Shortsów + Shortsy będą odtwarzane automatycznie + Shortsy będą się powtarzać + Autoodtwarzanie Shortsów w tle + Odtwarzanie w tle Shortsów będzie automatyczne + Odtwarzanie w tle Shortsów będzie się powtarzać + + + Miniodtwarzacz + Zmień styl zminimalizowanego odtwarzacza aplikacji + Typ miniodtwarzacza + Wyłączony + Domyślny + Minimalny + Tabletowy + Nowoczesny 1 + Nowoczesny 2 + Nowoczesny 3 + Nowoczesny 4 + Wyłącz zaokrąglone rogi + Narożniki są kwadratowe + Narożniki są zaokrąglone + Podwójne stuknięcie i uszczypnięcie, aby zmienić rozmiar + "Akcja dwukrotnego dotknięcia i gest szczypania w celu zmiany rozmiaru są włączone • Dwukrotnie naciśnij, aby powiększyć rozmiar odtwarzacza • Ponownie dotknij dwukrotnie, aby przywrócić oryginalny rozmiar" - Wyłączone - Wyłącz przeciąganie i upuszczanie - Gest przeciągnięcia i upuszczenia wyłączony - "Przeciąganie i upuszczanie jest włączone + Wyłączone + Wyłącz przeciąganie i upuszczanie + Gest przeciągnięcia i upuszczenia wyłączony + "Przeciąganie i upuszczanie jest włączone Odtwarzacz można przeciągnąć do dowolnego rogu ekranu" - Wyłącz gest przeciągania w poziomie - Gest przeciągania w poziomie jest wyłączony - "Włączony gest przeciągania w poziomie + Wyłącz gest przeciągania w poziomie + Gest przeciągania w poziomie jest wyłączony + "Włączony gest przeciągania w poziomie Odtwarzacz można przeciągnąć poza ekran w lewo lub w prawo" - Ukryj przyciski nakładki - Przyciski nakładki są ukryte - Przyciski nakładki są widoczne - Ukryj przyciski rozwijania i zamykania - "Przyciski są ukryte + Ukryj przyciski nakładki + Przyciski nakładki są ukryte + Przyciski nakładki są widoczne + Ukryj przyciski rozwijania i zamykania + "Przyciski są ukryte Przesuń, aby rozwinąć lub zamknąć" - Przyciski rozwijania i zamykania są widoczne - Podteksty - Podteksty są ukryte - Podteksty są widoczne - Przyciski przewijania do przodu i do tyłu - Przyciski przewijania do przodu i do tyłu są ukryte - Przyciski przewijania do przodu i do tyłu są widoczne - Rozmiar początkowy - Początkowy rozmiar ekranu, w pikselach - Rozmiar piksela musi być pomiędzy %1$s i %2$s - Przezroczystość nakładki - Wartość przezroczystości, gdzie 0 to pełna przezroczystość - Przezroczystość nakładki musi być od 0 do 100 - - - Kolorowy ekran ładowania - Ekran ładowania będzie miał kolorowe tło - Ekran ładowania będzie miał stałe tło - Styl ekranu powitalnego - Kolor - Czarno-biały - Niestandardowy kolor paska postępu - Niestandardowy - Oryginalny - Niestandardowy kolor paska postępu - Kolor paska postępu - Niestandardowy kolor akcentu paska postępu - Kolor akcentu paska postępu - Nieprawidłowa wartość koloru paska postępu - - - YouTube ReVanced - YT ReVanced - YT - - - Logo nagłówka - Domyślne - Zwykłe - Premium - ReVanced - - ReVanced minimalistyczne - Niestandardowe - - - Host dla obrazów - Używanie hosta obrazu yt4.ggpht.com - "Używanie oryginalnego hosta obrazów + Przyciski rozwijania i zamykania są widoczne + Podteksty + Podteksty są ukryte + Podteksty są widoczne + Przyciski przewijania do przodu i do tyłu + Przyciski przewijania do przodu i do tyłu są ukryte + Przyciski przewijania do przodu i do tyłu są widoczne + Rozmiar początkowy + Początkowy rozmiar ekranu, w pikselach + Rozmiar piksela musi być pomiędzy %1$s i %2$s + Przezroczystość nakładki + Wartość przezroczystości, gdzie 0 to pełna przezroczystość + Przezroczystość nakładki musi być od 0 do 100 + + + Kolorowy ekran ładowania + Ekran ładowania będzie miał kolorowe tło + Ekran ładowania będzie miał stałe tło + Styl ekranu powitalnego + Kolor + Czarno-biały + Niestandardowy kolor paska postępu + Niestandardowy + Oryginalny + Niestandardowy kolor paska postępu + Kolor paska postępu + Niestandardowy kolor akcentu paska postępu + Kolor akcentu paska postępu + Nieprawidłowa wartość koloru paska postępu + + + YouTube ReVanced + YT ReVanced + YT + + + Logo nagłówka + Domyślne + Zwykłe + Premium + ReVanced + + ReVanced minimalistyczne + Niestandardowe + + + Host dla obrazów + Używanie hosta obrazu yt4.ggpht.com + "Używanie oryginalnego hosta obrazów Włączenie tego może naprawić brakujące obrazy, które są zablokowane w niektórych regionach" - - - - Na stronie głównej - - Karta Subskrypcje - - Na stronie Ty - Listy odtwarzania odtwarzacza i rekomendacje - W wynikach wyszukiwania - Oryginalne miniaturki - DeArrow i oryginalne miniatury - DeArrow i miniaturki przechwycone z filmu - Miniaturki przechwycone z filmu - DeArrow - "DeArrow udostępnia zewnętrzne miniatury filmów YouTube. Te miniatury są często bardziej trafne niż te dostarczane przez YouTube + + + + Na stronie głównej + + Karta Subskrypcje + + Na stronie Ty + Listy odtwarzania odtwarzacza i rekomendacje + W wynikach wyszukiwania + Oryginalne miniaturki + DeArrow i oryginalne miniatury + DeArrow i miniaturki przechwycone z filmu + Miniaturki przechwycone z filmu + DeArrow + "DeArrow udostępnia zewnętrzne miniatury filmów YouTube. Te miniatury są często bardziej trafne niż te dostarczane przez YouTube Jeśli włączone, adresy URL filmów zostaną wysłane do serwera API i żadne inne dane nie zostaną wysłane. Jeśli film nie ma miniatur DeArrow, wyświetlane są miniatury oryginalne lub nieruchome Naciśnij tutaj, aby dowiedzieć się więcej o DeArrow" - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli DeArrow nie jest dostępny - Komunikat nie jest wyświetlany, jeśli DeArrow nie jest dostępny - Punkt końcowy API DeArrow - Adres URL punktu końcowego do miniaturek DeArrow - Miniaturki przechwycone z filmu - Przechwytywanie jest nadal pobierane od początku/środka/końca każdego filmu. Te obrazy są wbudowane w YouTube i żadne zewnętrzne API nie jest używane - Szybkie przechwytywanie miniaturek z filmu - Używasz przechwytywania średniej jakości. Miniaturki będą ładować się szybciej, lecz mogą pozostać puste w przypadku transmisji na żywo, niewydanych i bardzo starych filmów - Używasz przechwytywania wysokiej jakości - Czas, z którego ma być przechwycona miniaturka z filmu - Początek filmu - Środek filmu - Koniec filmu - - DeArrow jest tymczasowo niedostępny (kod statusu: %s) - DeArrow jest tymczasowo niedostępny - - - Ogłoszenia ReVanced - Ogłoszenia przy uruchomieniu są wyświetlane - Ogłoszenia przy uruchomieniu nie są wyświetlane - Ogłoszenia przy starcie - Nie udało się połączyć z dostawcą ogłoszeń - Odrzuć - - - Włącz zapętlanie wideo - Wideo będzie się zapętlać - Wideo nie będzie się zapętlać - - - Pokaż przycisk zapętlania wideo - Przycisk jest widoczny - Przycisk nie jest widoczny - Zapętlanie wideo jest włączone - Zapętlanie wideo jest wyłączone - - - Wstrzymaj w przypadku innych dźwięków - Odtwarzanie zostaje wstrzymane, gdy odtwarzany jest inny dźwięk (np. nawigacja) - Głośność zostaje zmniejszona, kiedy odtwarzane są inne dźwięki - - - Oszukaj rozdzielczość urządzenia - "Wymiary urządzenia sfałszowane + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli DeArrow nie jest dostępny + Komunikat nie jest wyświetlany, jeśli DeArrow nie jest dostępny + Punkt końcowy API DeArrow + Adres URL punktu końcowego do miniaturek DeArrow + Miniaturki przechwycone z filmu + Przechwytywanie jest nadal pobierane od początku/środka/końca każdego filmu. Te obrazy są wbudowane w YouTube i żadne zewnętrzne API nie jest używane + Szybkie przechwytywanie miniaturek z filmu + Używasz przechwytywania średniej jakości. Miniaturki będą ładować się szybciej, lecz mogą pozostać puste w przypadku transmisji na żywo, niewydanych i bardzo starych filmów + Używasz przechwytywania wysokiej jakości + Czas, z którego ma być przechwycona miniaturka z filmu + Początek filmu + Środek filmu + Koniec filmu + + DeArrow jest tymczasowo niedostępny (kod statusu: %s) + DeArrow jest tymczasowo niedostępny + + + Ogłoszenia ReVanced + Ogłoszenia przy uruchomieniu są wyświetlane + Ogłoszenia przy uruchomieniu nie są wyświetlane + Ogłoszenia przy starcie + Nie udało się połączyć z dostawcą ogłoszeń + Odrzuć + + + Włącz zapętlanie wideo + Wideo będzie się zapętlać + Wideo nie będzie się zapętlać + + + Pokaż przycisk zapętlania wideo + Przycisk jest widoczny + Przycisk nie jest widoczny + Zapętlanie wideo jest włączone + Zapętlanie wideo jest wyłączone + + + Wstrzymaj w przypadku innych dźwięków + Odtwarzanie zostaje wstrzymane, gdy odtwarzany jest inny dźwięk (np. nawigacja) + Głośność zostaje zmniejszona, kiedy odtwarzane są inne dźwięki + + + Oszukaj rozdzielczość urządzenia + "Wymiary urządzenia sfałszowane Mogą zostać odblokowane wyższe jakości wideo, ale możesz doświadczyć zacinania się wideo, gorszego czasu pracy na baterii i nieznanych efektów ubocznych" - "Wymiary urządzenia nie są sfałszowane + "Wymiary urządzenia nie są sfałszowane Włączenie tego może odblokować wyższe jakości wideo" - Włączenie tego może spowodować zacinanie się odtwarzanego filmu, pogorszenie żywotności baterii i nieznane efekty uboczne. - - - Informacje zwrotne haptyczne - Zmień informacje zwrotne haptyczne - Wyłącz haptykę rozdziałów - Haptyka rozdziałów jest wyłączona - Haptyka rozdziałów jest włączona - Wyłącz haptykę precyzyjnego przewijania - Haptyka precyzyjnego wyszukiwania jest wyłączona - Haptyka precyzyjnego przewijania jest włączona - Wyłącz haptykę cofania wyszukiwania - Haptyka cofania wyszukiwania jest wyłączona - Haptyka cofania wyszukiwania jest włączona - Haptyka przy zoomowaniu - Haptyka przybliżania jest wyłączona - Haptyka przybliżania jest włączona - - - Jeśli niedawno zmieniono dane logowania do konta, odinstaluj i zainstaluj ponownie MicroG. - - - Omijanie przekierowań URL - Przekierowanie URL jest omijane - Przekierowanie URL nie jest omijane - - - Otwieranie linków - Otwieranie linków w zewnętrznej przeglądarce - Otwieranie linków w przeglądarce w aplikacji - - - - Automatycznie - Zapamiętaj zmiany jakości filmu - Zmiany jakości dotyczą wszystkich filmów - Zmiany jakości dotyczą tylko bieżącego filmu - Pokaż komunikat przy zmianach jakości wideo - Komunikat jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona - Komunikat nie jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona - Domyślna jakość filmu w sieci Wi-Fi - Domyślna jakość filmu w sieci komórkowej - Zapamiętaj zmiany jakości w Shorts - Zmiany jakości dotyczą wszystkich filmów Shorts - Zmiany jakości dotyczą tylko bieżącego Short - Domyślna jakość Shorts w sieci Wi-Fi - Domyślna jakość Shorts w sieci komórkowej - telefonu - Wi-Fi - Zmieniono domyślną jakość %1$s na: %2$s - Zmieniono jakość Shorts %1$s na: %2$s - - - Przycisk od prędkości - Przycisk dialogu prędkości jest widoczny. Dotknij i przytrzymaj, aby zresetować prędkość odtwarzania do wartości domyślnych - Przycisk dialogu prędkości nie jest widoczny - - - Pokaż przycisk jakości wideo - Przycisk jakości wideo jest widoczny. Dotknij i przytrzymaj, aby zresetować jakość do wartości domyślnych - Przycisk jakości wideo nie jest widoczny - - - Niestandardowe menu prędkości odtwarzania - Niestandardowe menu prędkości jest widoczne - Niestandardowe menu prędkości nie jest widoczne - Przywróć stare menu prędkości odtwarzania - Pokazane jest stare menu prędkości - Pokazane jest nowoczesne menu prędkości - Niestandardowe prędkości odtwarzania - Dodaj lub zmień niestandardowe prędkości odtwarzania - Prędkości niestandardowe muszą być mniejsze niż %s - Nieprawidłowe prędkości odtwarzania niestandardowego - Automatyczne - Szybkość dostosowywania dotknięciem i przytrzymaniem - Prędkość odtwarzania w granicach 0-8 - - - Zapamiętuj zmiany prędkości odtwarzania - Zmiany prędkości odtwarzania dotyczą wszystkich filmów - Zmiany prędkości odtwarzania dotyczą tylko bieżącego filmu - Pokaż komunikat przy zmianach szybkości odtwarzania - Komunikat jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona - Komunikat nie jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona - Domyślna prędkość odtwarzania - Zmieniono domyślną prędkość na: %s - - - Wyłącz wideo HDR - Wideo HDR jest wyłączone - Wideo HDR jest włączone - Wymuś AVC (H.264) - Kodek wideo jest wymuszony na AVC (H.264) - Kodek wideo jest określany automatycznie - "Korzyści: + Włączenie tego może spowodować zacinanie się odtwarzanego filmu, pogorszenie żywotności baterii i nieznane efekty uboczne. + + + Informacje zwrotne haptyczne + Zmień informacje zwrotne haptyczne + Wyłącz haptykę rozdziałów + Haptyka rozdziałów jest wyłączona + Haptyka rozdziałów jest włączona + Wyłącz haptykę precyzyjnego przewijania + Haptyka precyzyjnego wyszukiwania jest wyłączona + Haptyka precyzyjnego przewijania jest włączona + Wyłącz haptykę cofania wyszukiwania + Haptyka cofania wyszukiwania jest wyłączona + Haptyka cofania wyszukiwania jest włączona + Haptyka przy zoomowaniu + Haptyka przybliżania jest wyłączona + Haptyka przybliżania jest włączona + + + Jeśli niedawno zmieniono dane logowania do konta, odinstaluj i zainstaluj ponownie MicroG. + + + Omijanie przekierowań URL + Przekierowanie URL jest omijane + Przekierowanie URL nie jest omijane + + + Otwieranie linków + Otwieranie linków w zewnętrznej przeglądarce + Otwieranie linków w przeglądarce w aplikacji + + + + Automatycznie + Zapamiętaj zmiany jakości filmu + Zmiany jakości dotyczą wszystkich filmów + Zmiany jakości dotyczą tylko bieżącego filmu + Pokaż komunikat przy zmianach jakości wideo + Komunikat jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona + Komunikat nie jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona + Domyślna jakość filmu w sieci Wi-Fi + Domyślna jakość filmu w sieci komórkowej + Zapamiętaj zmiany jakości w Shorts + Zmiany jakości dotyczą wszystkich filmów Shorts + Zmiany jakości dotyczą tylko bieżącego Short + Domyślna jakość Shorts w sieci Wi-Fi + Domyślna jakość Shorts w sieci komórkowej + telefonu + Wi-Fi + Zmieniono domyślną jakość %1$s na: %2$s + Zmieniono jakość Shorts %1$s na: %2$s + + + Przycisk od prędkości + Przycisk dialogu prędkości jest widoczny. Dotknij i przytrzymaj, aby zresetować prędkość odtwarzania do wartości domyślnych + Przycisk dialogu prędkości nie jest widoczny + + + Pokaż przycisk jakości wideo + Przycisk jakości wideo jest widoczny. Dotknij i przytrzymaj, aby zresetować jakość do wartości domyślnych + Przycisk jakości wideo nie jest widoczny + + + Niestandardowe menu prędkości odtwarzania + Niestandardowe menu prędkości jest widoczne + Niestandardowe menu prędkości nie jest widoczne + Przywróć stare menu prędkości odtwarzania + Pokazane jest stare menu prędkości + Pokazane jest nowoczesne menu prędkości + Niestandardowe prędkości odtwarzania + Dodaj lub zmień niestandardowe prędkości odtwarzania + Prędkości niestandardowe muszą być mniejsze niż %s + Nieprawidłowe prędkości odtwarzania niestandardowego + Automatyczne + Szybkość dostosowywania dotknięciem i przytrzymaniem + Prędkość odtwarzania w granicach 0-8 + + + Zapamiętuj zmiany prędkości odtwarzania + Zmiany prędkości odtwarzania dotyczą wszystkich filmów + Zmiany prędkości odtwarzania dotyczą tylko bieżącego filmu + Pokaż komunikat przy zmianach szybkości odtwarzania + Komunikat jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona + Komunikat nie jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona + Domyślna prędkość odtwarzania + Zmieniono domyślną prędkość na: %s + + + Wyłącz wideo HDR + Wideo HDR jest wyłączone + Wideo HDR jest włączone + Wymuś AVC (H.264) + Kodek wideo jest wymuszony na AVC (H.264) + Kodek wideo jest określany automatycznie + "Korzyści: • Może poprawić żywotność baterii • Może przywrócić brakujące rozdzielczości wideo na starszych urządzeniach @@ -1667,182 +1666,182 @@ Ograniczenia: • Odtwarzanie wideo będzie zużywać więcej danych internetowych niż VP9 lub AV1 • Filmy HDR nie będą używać AVC • Niektóre urządzenia nie mogą wymusić użycia AVC" - - - Pokaż zaawansowane menu jakości filmu - Zaawansowane menu jakości filmu jest wyświetlane - Zaawansowane menu jakości filmu nie jest wyświetlane - - - Przesuń, by przewinąć - Gest przesuwania jest włączony - Przesuń, aby przeszukiwać nie jest włączony - - - Zezwól na Android VR AV1 - "Kodek wideo to AVC (H.264), VP9 lub AV1 + + + Pokaż zaawansowane menu jakości filmu + Zaawansowane menu jakości filmu jest wyświetlane + Zaawansowane menu jakości filmu nie jest wyświetlane + + + Przesuń, by przewinąć + Gest przesuwania jest włączony + Przesuń, aby przeszukiwać nie jest włączony + + + Zezwól na Android VR AV1 + "Kodek wideo to AVC (H.264), VP9 lub AV1 Odtwarzanie może się zacinać lub gubić klatki" - Kodek wideo to AVC (H.264) lub VP9 - "Włączenie tego ustawienia może używać programowego dekodowania AV1. + Kodek wideo to AVC (H.264) lub VP9 + "Włączenie tego ustawienia może używać programowego dekodowania AV1. Odtwarzanie wideo z AV1 może powodować zacinanie się lub gubienie klatek." - Skutki uboczne fałszowania - • Eksperymentalny klient i może przestać działać w każdej chwili - • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach - • Brakuje menu ścieżek audio - • Žádný video kodek AV1 - • Stabilna głośność nie jest dostępna - • Filmy dla dzieci mogą nie być odtwarzane po wylogowaniu lub w trybie incognito - - • Wymuś oryginalny dźwięk jest niedostępny - Pokaż w statystykach dla nerdów - Typ klienta jest wyświetlany w Statystykach dla nerdów - Klient jest ukryty w statystykach dla nerdów - - - - - YT Music ReVanced - Music ReVanced - Music - - - O programie - Reklamy - Ogólne - Odtwarzacz - Różne - - - Ukryj reklamy wideo - Reklamy wideo są ukryte - Reklamy wideo są widoczne - - - Włącz stałe powtarzanie - Stałe powtarzanie jest włączone - Stałe powtarzanie jest wyłączone - - - Ukryj przycisk Cast - Przycisk Cast jest ukryty - Przycisk Cast jest widoczny - Ukryj przycisk historii - Przycisk historii jest ukryty - Przycisk historii jest widoczny - Ukryj przycisk powiadomień - Przycisk powiadomień jest ukryty - Przycisk powiadomień jest widoczny - Ukryj przycisk wyszukiwania - Przycisk wyszukiwania jest ukryty - Przycisk wyszukiwania jest widoczny - - - Ukryj pasek kategorii - Pasek kategorii jest ukryty - Pasek kategorii jest widoczny - - - Zmień kolor miniplayera - Kolor miniplayera dopasowany do odtwarzacza pełnoekranowego - Miniplayer używa domyślnego koloru - - - Pasek nawigacji - Ukryj lub zmień przyciski paska nawigacji - - Ukryj Główną - Przycisk Główna jest ukryty - Przycisk Główna jest pokazany - - Ukryj Fragmenty - Przycisk Wycinki jest ukryty - Przycisk Wycinki jest pokazany - - Ukryj Odkrywaj - Przycisk Przeglądaj jest ukryty - Przycisk Przeglądaj jest pokazany - - Ukryj Bibliotekę - Przycisk Biblioteka jest ukryty - Przycisk Biblioteka jest pokazany - - Ukryj Ulepsz - Przycisk Ulepsz jest ukryty - Przycisk Ulepsz jest pokazany - Ukryj pasek nawigacji - Pasek nawigacji jest ukryty - Pasek nawigacji jest pokazany - Ukryj etykiety przycisków nawigacji - Etykiety są ukryte - Etykiety są pokazane - - - Ukryj etykietę „Uzyskaj Music Premium” - Etykieta jest ukryta - Etykieta jest widoczna - - - Ukryj przycisk uaktualnienia - Przycisk jest ukryty - Przycisk jest widoczny - - - - - Reklamy dźwiękowe - Reklamy dźwiękowe są zablokowane - Reklamy dźwiękowe są odblokowane - - - %s niedostępne, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. - %s zwrócił błąd, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. - Osadzone reklamy w filmie - Nieaktywne - Proxy Luminous - Proxy PurpleAdBlock - - - Reklamy w filmie - Reklamy w filmie są zablokowane - Reklamy w filmie są odblokowane - - - Wiadomość usunięta - Usunięte wiadomości - Nie pokazuj usuniętych wiadomości - Ukryj usunięte wiadomości za spoilerem - Pokaż usunięte wiadomości jako przekreślony tekst - - - Automatyczne przyznawanie punktów kanału - Punkty kanału są przyznawane automatycznie - Punkty kanału nie są przyznawane automatycznie - - - - Tryb debugowania - Tryb debugowania jest włączony (niezalecane) - Tryb debugowania jest wyłączony - - - Ustawienia ReVanced - O nas - O ReVanced - Blokowanie reklam - Ustawienia blokowania reklam - Czat - Ustawienia czatu - Różne - Różne ustawienia - Ustawienia ogólne - Inne ustawienia - Reklamy po stronie klienta - Reklamy po stronie serwera - Logi do debugowania - Logi do debugowania są włączone - Logi do debugowania są wyłączone - - + Skutki uboczne fałszowania + • Eksperymentalny klient i może przestać działać w każdej chwili + • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach + • Brakuje menu ścieżek audio + • Žádný video kodek AV1 + • Stabilna głośność nie jest dostępna + • Filmy dla dzieci mogą nie być odtwarzane po wylogowaniu lub w trybie incognito + + • Wymuś oryginalny dźwięk jest niedostępny + Pokaż w statystykach dla nerdów + Typ klienta jest wyświetlany w Statystykach dla nerdów + Klient jest ukryty w statystykach dla nerdów + + + + + YT Music ReVanced + Music ReVanced + Music + + + O programie + Reklamy + Ogólne + Odtwarzacz + Różne + + + Ukryj reklamy wideo + Reklamy wideo są ukryte + Reklamy wideo są widoczne + + + Włącz stałe powtarzanie + Stałe powtarzanie jest włączone + Stałe powtarzanie jest wyłączone + + + Ukryj przycisk Cast + Przycisk Cast jest ukryty + Przycisk Cast jest widoczny + Ukryj przycisk historii + Przycisk historii jest ukryty + Przycisk historii jest widoczny + Ukryj przycisk powiadomień + Przycisk powiadomień jest ukryty + Przycisk powiadomień jest widoczny + Ukryj przycisk wyszukiwania + Przycisk wyszukiwania jest ukryty + Przycisk wyszukiwania jest widoczny + + + Ukryj pasek kategorii + Pasek kategorii jest ukryty + Pasek kategorii jest widoczny + + + Zmień kolor miniplayera + Kolor miniplayera dopasowany do odtwarzacza pełnoekranowego + Miniplayer używa domyślnego koloru + + + Pasek nawigacji + Ukryj lub zmień przyciski paska nawigacji + + Ukryj Główną + Przycisk Główna jest ukryty + Przycisk Główna jest pokazany + + Ukryj Fragmenty + Przycisk Wycinki jest ukryty + Przycisk Wycinki jest pokazany + + Ukryj Odkrywaj + Przycisk Przeglądaj jest ukryty + Przycisk Przeglądaj jest pokazany + + Ukryj Bibliotekę + Przycisk Biblioteka jest ukryty + Przycisk Biblioteka jest pokazany + + Ukryj Ulepsz + Przycisk Ulepsz jest ukryty + Przycisk Ulepsz jest pokazany + Ukryj pasek nawigacji + Pasek nawigacji jest ukryty + Pasek nawigacji jest pokazany + Ukryj etykiety przycisków nawigacji + Etykiety są ukryte + Etykiety są pokazane + + + Ukryj etykietę „Uzyskaj Music Premium” + Etykieta jest ukryta + Etykieta jest widoczna + + + Ukryj przycisk uaktualnienia + Przycisk jest ukryty + Przycisk jest widoczny + + + + + Reklamy dźwiękowe + Reklamy dźwiękowe są zablokowane + Reklamy dźwiękowe są odblokowane + + + %s niedostępne, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. + %s zwrócił błąd, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. + Osadzone reklamy w filmie + Nieaktywne + Proxy Luminous + Proxy PurpleAdBlock + + + Reklamy w filmie + Reklamy w filmie są zablokowane + Reklamy w filmie są odblokowane + + + Wiadomość usunięta + Usunięte wiadomości + Nie pokazuj usuniętych wiadomości + Ukryj usunięte wiadomości za spoilerem + Pokaż usunięte wiadomości jako przekreślony tekst + + + Automatyczne przyznawanie punktów kanału + Punkty kanału są przyznawane automatycznie + Punkty kanału nie są przyznawane automatycznie + + + + Tryb debugowania + Tryb debugowania jest włączony (niezalecane) + Tryb debugowania jest wyłączony + + + Ustawienia ReVanced + O nas + O ReVanced + Blokowanie reklam + Ustawienia blokowania reklam + Czat + Ustawienia czatu + Różne + Różne ustawienia + Ustawienia ogólne + Inne ustawienia + Reklamy po stronie klienta + Reklamy po stronie serwera + Logi do debugowania + Logi do debugowania są włączone + Logi do debugowania są wyłączone + + diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index 5db01b7f3c..99f9dad979 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -17,1259 +17,1258 @@ "First 'item' text Second \"item\" text" ---> - - - - Nome do aplicativo - - Personalizado - Ícone do aplicativo - - ReVanced mínimo - ReVanced escalado - - Personalizado - - - Verificação falhou - Abrir o site oficial - Ignorar - <h5>Este aplicativo não parece ter sido patcheado por você.</h5><br>Este app pode não funcionar corretamente, <b>pode ser prejudicial ou até mesmo perigoso de usar</b>.<br><br>Essas verificações indicam que este app foi pré-patcheado ou obtido de outra pessoa<br><br><small>%1$s</small><br>É altamente recomendável <b>desinstalar este app e você mesmo patchear</b> para garantir que você esteja usando um app validado e seguro.<p><br>Se ignorado, este aviso será exibido apenas duas vezes. - Patcheado em um dispositivo diferente - Não instalado pelo ReVanced Manager - Patcheado há mais de 10 minutos - Patcheado há %s dias - Data de compilação do APK está corrompida - - - Aviso do ReVanced - Seu histórico de exibição não está sendo salvo.<br><br>Na maioria dos casos isso é causado por um bloqueador de anúncios por DNS ou proxy de rede.<br><br>Para corrigir isso, permita <b>s.youtube.com</b> na sua lista ou desative todos os bloqueadores de DNS e proxies. - Não exibir novamente - - - Configurações - Tem certeza de que deseja continuar? - Salvar - Resetar - Redefinir cor - Cor inválida - Reinício necessário - Reinicie o aplicativo para que esta alteração tenha efeito. - Reiniciar - Importar - Copiar - Configurações do ReVanced redefinidas para o padrão - Configurações %d importadas - Importação falhou: %s - Configurações de pesquisa - Nenhum resultado encontrado para \",%s\" - Tente outra palavra-chave - Pesquisas recentes - Remover do histórico de pesquisa? - Limpar histórico de pesquisa - Tem certeza de que deseja limpar todo o histórico de pesquisa? - Dicas de Pesquisa - "• Toque em um caminho para navegar até ele +--> + + + Nome do aplicativo + + Personalizado + Ícone do aplicativo + + ReVanced mínimo + ReVanced escalado + + Personalizado + + + Verificação falhou + Abrir o site oficial + Ignorar + <h5>Este aplicativo não parece ter sido patcheado por você.</h5><br>Este app pode não funcionar corretamente, <b>pode ser prejudicial ou até mesmo perigoso de usar</b>.<br><br>Essas verificações indicam que este app foi pré-patcheado ou obtido de outra pessoa<br><br><small>%1$s</small><br>É altamente recomendável <b>desinstalar este app e você mesmo patchear</b> para garantir que você esteja usando um app validado e seguro.<p><br>Se ignorado, este aviso será exibido apenas duas vezes. + Patcheado em um dispositivo diferente + Não instalado pelo ReVanced Manager + Patcheado há mais de 10 minutos + Patcheado há %s dias + Data de compilação do APK está corrompida + + + Aviso do ReVanced + Seu histórico de exibição não está sendo salvo.<br><br>Na maioria dos casos isso é causado por um bloqueador de anúncios por DNS ou proxy de rede.<br><br>Para corrigir isso, permita <b>s.youtube.com</b> na sua lista ou desative todos os bloqueadores de DNS e proxies. + Não exibir novamente + + + Configurações + Tem certeza de que deseja continuar? + Salvar + Resetar + Redefinir cor + Cor inválida + Reinício necessário + Reinicie o aplicativo para que esta alteração tenha efeito. + Reiniciar + Importar + Copiar + Configurações do ReVanced redefinidas para o padrão + Configurações %d importadas + Importação falhou: %s + Configurações de pesquisa + Nenhum resultado encontrado para \",%s\" + Tente outra palavra-chave + Pesquisas recentes + Remover do histórico de pesquisa? + Limpar histórico de pesquisa + Tem certeza de que deseja limpar todo o histórico de pesquisa? + Dicas de Pesquisa + "• Toque em um caminho para navegar até ele • Mantenha pressionada uma configuração para navegar até ela • Pressione Enter para salvar uma consulta de pesquisa no histórico • A pesquisa ignora maiúsculas/minúsculas e pontuação • As configurações pai aparecem acima das configurações filhas desabilitadas" - O histórico de pesquisa está vazio - Para salvar o histórico de pesquisa, digite uma consulta de pesquisa e pressione Enter - Mostrar histórico de pesquisa das configurações - O histórico de pesquisa das configurações é mostrado - O histórico de pesquisa de configurações não é exibido - Mostrar ícones de configuração do ReVanced - Ícones de configuração são mostrados - Os ícones de configuração não são mostrados - Idioma do ReVanced - "Traduções para alguns idiomas podem estar faltando ou incompletas. + O histórico de pesquisa está vazio + Para salvar o histórico de pesquisa, digite uma consulta de pesquisa e pressione Enter + Mostrar histórico de pesquisa das configurações + O histórico de pesquisa das configurações é mostrado + O histórico de pesquisa de configurações não é exibido + Mostrar ícones de configuração do ReVanced + Ícones de configuração são mostrados + Os ícones de configuração não são mostrados + Idioma do ReVanced + "Traduções para alguns idiomas podem estar faltando ou incompletas. Para traduzir novos idiomas ou melhorar as traduções existentes, visite translate.revanced.app" - Idioma do aplicativo - Importar / Exportar - Importar / Exportar Configurações do ReVanced - - Você está usando os Patches ReVanced versão <i>%s</i> - Observação - Esta versão é um pré-lançamento e você pode ter problemas inesperados - Links oficiais - + Você está usando os Patches ReVanced versão <i>%s</i> + Observação + Esta versão é um pré-lançamento e você pode ter problemas inesperados + Links oficiais + - - - Configurações do GmsCore - Configurações do GmsCore - - O MicroG GmsCore não está instalado. Instale-o. - Ação necessária - "MicroG GmsCore não tem permissão para rodar em segundo plano. + + + Configurações do GmsCore + Configurações do GmsCore + + O MicroG GmsCore não está instalado. Instale-o. + Ação necessária + "MicroG GmsCore não tem permissão para rodar em segundo plano. Siga o guia \"Não mate meu app\" para seu celular e aplique as instruções para sua instalação do MicroG. Isso é necessário para o aplicativo funcionar. " - Abrir site - "As otimizações de bateria do MicroG GmsCore devem ser desabilitadas para evitar problemas. + Abrir site + "As otimizações de bateria do MicroG GmsCore devem ser desabilitadas para evitar problemas. Desabilitar as otimizações de bateria para o MicroG não afetará negativamente o uso da bateria. Toque no botão continuar e permita as mudanças de otimização. " - Continuar - - - Simular fluxos de vídeo - Simular os fluxos de vídeo do cliente para evitar problemas de reprodução - Spoofing do fluxo de vídeo - "Streams de vídeo são falsificados + Continuar + + + Simular fluxos de vídeo + Simular os fluxos de vídeo do cliente para evitar problemas de reprodução + Spoofing do fluxo de vídeo + "Streams de vídeo são falsificados Se você é um usuário do YouTube Premium, esta configuração pode não ser necessária" - "Os fluxos de vídeo não estão sendo simulados + "Os fluxos de vídeo não estão sendo simulados A reprodução pode não funcionar" - Desativar esta configuração pode causar problemas de reprodução. - Cliente padrão - - - Forçar idioma do áudio original - Usar o idioma original do áudio - Usando áudio padrão - - Para usar este recurso, mude \'Falsificar fluxos de vídeo\' para qualquer cliente, exceto o Android Studio - - - Depuração - Ativar ou desativar opções de depuração - Registro de depuração - Registro de depuração está ativado - Registro de depuração está desativado - Registro de rastreamento em pilha - Registro de depuração incluem rastreamento em pilha - Registro de depuração não incluem rastreamento em pilha - Mostrar notificação flutuante de erro do ReVanced - O toast é exibido se ocorrer um erro - O toast não é exibido se ocorrer um erro - "Desligar as notificações de erro oculta todas as notificações de erro do ReVanced. + Desativar esta configuração pode causar problemas de reprodução. + Cliente padrão + + + Forçar idioma do áudio original + Usar o idioma original do áudio + Usando áudio padrão + + Para usar este recurso, mude \'Falsificar fluxos de vídeo\' para qualquer cliente, exceto o Android Studio + + + Depuração + Ativar ou desativar opções de depuração + Registro de depuração + Registro de depuração está ativado + Registro de depuração está desativado + Registro de rastreamento em pilha + Registro de depuração incluem rastreamento em pilha + Registro de depuração não incluem rastreamento em pilha + Mostrar notificação flutuante de erro do ReVanced + O toast é exibido se ocorrer um erro + O toast não é exibido se ocorrer um erro + "Desligar as notificações de erro oculta todas as notificações de erro do ReVanced. Você não será notificado sobre nenhum evento inesperado." - Exportar registros de depuração - Copia os registros de depuração do ReVanced para a área de transferência - O registro de depuração está desativado - Nenhum registro encontrado - Registros copiados - Falha ao exportar registros: %s - Limpar registros de depuração - Limpa todos os registros de depuração do ReVanced armazenados - Registros limpos - Gerenciador de sinalizadores de recursos - Gerenciar sinalizadores de recursos booleanos - Flags ativas (%d) - Flags bloqueadas (%d) - Pesquisar flags... - Flags salvas - Flags redefinidas - Flags copiadas para a área de transferência - Registro de buffer de protocolo - Registro de depuração incluem buffer de protocolo - Registro de depuração não incluem buffer de protocolo - "Ativar esta configuração registrará dados de layout adicionais, incluindo texto na tela para alguns componentes da IU. + Exportar registros de depuração + Copia os registros de depuração do ReVanced para a área de transferência + O registro de depuração está desativado + Nenhum registro encontrado + Registros copiados + Falha ao exportar registros: %s + Limpar registros de depuração + Limpa todos os registros de depuração do ReVanced armazenados + Registros limpos + Gerenciador de sinalizadores de recursos + Gerenciar sinalizadores de recursos booleanos + Flags ativas (%d) + Flags bloqueadas (%d) + Pesquisar flags... + Flags salvas + Flags redefinidas + Flags copiadas para a área de transferência + Registro de buffer de protocolo + Registro de depuração incluem buffer de protocolo + Registro de depuração não incluem buffer de protocolo + "Ativar esta configuração registrará dados de layout adicionais, incluindo texto na tela para alguns componentes da IU. Isso pode ajudar a identificar componentes ao criar filtros personalizados. No entanto, ativar isso também registrará alguns dados do usuário, como seu endereço IP." - - - Higienizar links de compartilhamento - Parâmetro de consulta de rastreamento é removido dos links compartilhados - Parâmetro de consulta de rastreamento não é removido dos links compartilhados - Alterar links de compartilhamento para youtube.com - Links compartilhados usam youtube.com - Links compartilhados usam music.youtube.com - - - Filtro personalizado - Ocultar componentes usando filtros personalizados - Ativar filtro personalizado - Filtro personalizado está ativado - Filtro personalizado está desativado - Filtro personalizado - - Lista de strings de componente de construção de caminhos separados, para filtrar nova linha - Filtro personalizado inválido: %s - - - - - Sobre - Anúncios - Miniaturas alternativas - Geral - Reprodutor - Barra de busca - Controles deslizantes - Diversos - Vídeo - Restaurar menus de configurações antigos - Os menus de configurações antigos são mostrados. - Os menus de configurações antigos não são mostrados. - - - Desativar reprodução de fundo dos Shorts - Reprodução de fundo dos Shorts está desativada - Reprodução de fundo dos Shorts está ativada - - - Ocultar cartões de álbum - Cartões de álbum estão ocultos - Cartões de álbum não estão ocultos - Ocultar cartões do artista - Cartões do artista estão ocultas - Os cartões de artista são mostrados - Ocultar prateleira de cartões - Prateleira de cartões estão ocultas - A prateleira de cartões são mostradas - Ocultar publicações da comunidade - Publicações da comunidade está oculto - Publicações da comunidade não está oculto - Ocultar banners compactos - Banners compactos está oculto - Banners compactos não estão ocultos - Ocultar cartão expansível - Cartão expansível sob vídeos está oculto - Cartão expansível sob vídeos está exibido - Ocultar botão de microfone flutuante - O botão flutuante do microfone na pesquisa está oculto - Botão flutuante do microfone na pesquisa é exibido - Ocultar prateleiras horizontais - "As prateleiras horizontais estão ocultas, como: + + + Higienizar links de compartilhamento + Parâmetro de consulta de rastreamento é removido dos links compartilhados + Parâmetro de consulta de rastreamento não é removido dos links compartilhados + Alterar links de compartilhamento para youtube.com + Links compartilhados usam youtube.com + Links compartilhados usam music.youtube.com + + + Filtro personalizado + Ocultar componentes usando filtros personalizados + Ativar filtro personalizado + Filtro personalizado está ativado + Filtro personalizado está desativado + Filtro personalizado + + Lista de strings de componente de construção de caminhos separados, para filtrar nova linha + Filtro personalizado inválido: %s + + + + + Sobre + Anúncios + Miniaturas alternativas + Geral + Reprodutor + Barra de busca + Controles deslizantes + Diversos + Vídeo + Restaurar menus de configurações antigos + Os menus de configurações antigos são mostrados. + Os menus de configurações antigos não são mostrados. + + + Desativar reprodução de fundo dos Shorts + Reprodução de fundo dos Shorts está desativada + Reprodução de fundo dos Shorts está ativada + + + Ocultar cartões de álbum + Cartões de álbum estão ocultos + Cartões de álbum não estão ocultos + Ocultar cartões do artista + Cartões do artista estão ocultas + Os cartões de artista são mostrados + Ocultar prateleira de cartões + Prateleira de cartões estão ocultas + A prateleira de cartões são mostradas + Ocultar publicações da comunidade + Publicações da comunidade está oculto + Publicações da comunidade não está oculto + Ocultar banners compactos + Banners compactos está oculto + Banners compactos não estão ocultos + Ocultar cartão expansível + Cartão expansível sob vídeos está oculto + Cartão expansível sob vídeos está exibido + Ocultar botão de microfone flutuante + O botão flutuante do microfone na pesquisa está oculto + Botão flutuante do microfone na pesquisa é exibido + Ocultar prateleiras horizontais + "As prateleiras horizontais estão ocultas, como: • Notícias de última hora • Continuar assistindo • Explorar mais canais • Mais relevantes • Compras • Assistir novamente" - Prateleiras horizontais são exibidas - Ocultar prateleira de imagens - Prateleira de imagens nos resultados da pesquisa está oculta - Prateleira de imagens nos resultados da pesquisa está exibida - Ocultar últimas publicações - Últimas publicações estão ocultas - Últimas publicações não estão ocultas - Ocultar playlists de mix - Playlists de mix estão ocultas - As playlists de mix são mostradas - Ocultar seção de filmes - Seção de filmes está oculto - A seção de filmes é mostrada - - Ocultar botão \'Notificar-me\' - O botão Notificar-me está oculto - O botão Notificar-me é exibido - Ocultar Playables - Os Playables estão ocultos - Os Playables são mostrados - - Ocultar botão \'Mostrar mais\' - O botão Mostrar mais nos resultados da pesquisa está oculto - O botão Mostrar mais nos resultados da pesquisa é exibido - Ocultar pesquisas - Pesquisas estão ocultas - Pesquisas estão visíveis - Ocultar seção de ingressos - Seção de ingressos oculta - Seção de ingressos exibida - - Ocultar marcadores de recomendação de vídeo - Os marcadores \'As pessoas também assistiram\' e \'Você pode gostar também\' nos resultados da pesquisa estão ocultos - Os marcadores \'As pessoas também assistiram\' e \'Você pode gostar também\' nos resultados da pesquisa são exibidos - Ocultar espaçador visual - Espaçador visual está oculto - Espaçador visual está visível - - Ocultar Doodles do YouTube - A animação de Doodles do YouTube no logotipo está oculta - A animação dos Doodles do YouTube no logotipo é exibida - "Os Doodles do YouTube são exibidos alguns dias por ano. + Ocultar botão \'Mostrar mais\' + O botão Mostrar mais nos resultados da pesquisa está oculto + O botão Mostrar mais nos resultados da pesquisa é exibido + Ocultar pesquisas + Pesquisas estão ocultas + Pesquisas estão visíveis + Ocultar seção de ingressos + Seção de ingressos oculta + Seção de ingressos exibida + + Ocultar marcadores de recomendação de vídeo + Os marcadores \'As pessoas também assistiram\' e \'Você pode gostar também\' nos resultados da pesquisa estão ocultos + Os marcadores \'As pessoas também assistiram\' e \'Você pode gostar também\' nos resultados da pesquisa são exibidos + Ocultar espaçador visual + Espaçador visual está oculto + Espaçador visual está visível + + Ocultar Doodles do YouTube + A animação de Doodles do YouTube no logotipo está oculta + A animação dos Doodles do YouTube no logotipo é exibida + "Os Doodles do YouTube são exibidos alguns dias por ano. Se um Doodle estiver sendo exibido atualmente em sua região e esta configuração de ocultação estiver ativada, a barra de filtros abaixo da barra de pesquisa também será ocultada." - Ocultar barra de canais - Barra de canal está oculta - A barra de canal é mostrada - Ocultar marca d\'água do canal - Marca d\'água está oculta - Marca d\'água é mostrada - Ocultar caixa de financiamento coletivo - Caixa de financiamento coletivo está oculta - Caixa de financiamento coletivo é mostrada - Ocultar caixas de emergência - Caixas de emergência estão oculto - Caixas de emergência não estão ocultas - Ocultar painel de informações - Painel de informações está oculto - O painel de informações é mostrado - - Ocultar botão \"Participar\" - O botão \'Seja membro\' está oculto - O botão \'Seja membro\' é exibido - Ocultar painel médico - Painel médico está oculto - Os painéis médicos são mostrados - Ocultar ações rápidas - Ações rápidas em tela cheia estão ocultas - Ações rápidas em tela cheia estão exibidas - Ocultar vídeos relacionados - Vídeos relacionados em ações rápidas estão ocultos - Vídeos relacionados em ações rápidas estão exibidos - Ocultar diretrizes de inscritos - Diretrizes da comunidade de inscritos está oculto - Diretrizes da comunidade de inscritos não está oculto - Ocultar reações cronometradas - Reações cronometradas estão ocultas - Reações cronometradas não estão ocultas - Ocultar \"Resumo de vídeo gerado por IA\" - A seção de resumo de vídeo gerada por IA está oculta - A seção de resumo de vídeo gerado por IA é exibida - Ocultar Perguntar - A seção de perguntas está oculta - A seção de perguntas é mostrada - Ocultar atributos - As seções de lugares em destaque, jogos, música e pessoas mencionadas estão ocultas - As seções de lugares em destaque, jogos, música e pessoas mencionadas são mostradas - Ocultar capítulos - Seção de capítulos está oculta - Seção de capítulos é mostrada - Ocultar \"Como este conteúdo foi feito\" - A seção Como este conteúdo foi feito está oculta - A seção Como este conteúdo foi feito é mostrada - Ocultar pontos de Hype - Pontos de Hype estão ocultos - Pontos de Hype estão visíveis - Ocultar \"Explore o podcast\" - A seção Explore o podcast está oculta - A seção Explore o podcast é mostrada - Ocultar links em destaque - A seção de links em destaque está oculta - A seção de links em destaque está visível - Ocultar vídeos em destaque - A seção de vídeos em destaque está oculta - A seção de vídeos em destaque está visível - Ocultar cartões de informações - Seção de cartões de informações está oculto - A seção de cartões de informações é mostrada - Ocultar \"Conceitos-chave\" - A seção Conceitos-chave está oculta - A seção Conceitos-chave é mostrada - Ocultar botão de Inscrição - O botão de Inscrição está oculto - O botão de Inscrição está visível - Ocultar transcrição - Seção de transcrição está oculta - A seção de transcrição é mostrada - Descrição do vídeo - Ocultar ou mostrar componentes de descrição do vídeo - Barra de filtro - Ocultar ou mostrar a barra de filtro em feeds, vídeos relacionados, resultados de pesquisa e histórico de exibição - Ocultar em feeds - Oculto em feeds - Exibido em feeds - Ocultar nos vídeos relacionados - Está oculto nos vídeos relacionados - Não está oculto nos vídeos relacionados - Ocultar nos resultados da pesquisa - Oculto nos resultados da pesquisa - Exibido nos resultados da pesquisa - Ocultar no histórico de exibição - Oculto no histórico de exibição - Exibido no histórico de exibição - Página do canal - Ocultar ou exibir componentes da página do canal - - Ocultar botão Comunidade - Botão de Comunidade está oculto - Botão de Comunidade está visível - - Ocultar a estante \"Para você\" - Prateleira Para você está oculta - Prateleira Para você está exibida - - Ocultar botão de Participar - Botão de Participar está oculto - Botão de Participar está visível - Ocultar prévia de links - Prévia de links está oculta - Prévia de links está exibida - Ocultar prateleira de membros - Prateleira de membros está oculta - Prateleira de membros é mostrada - - Ocultar botão de Loja - Botão de Loja está oculto - Botão de Loja está visível - - Ocultar botão de Inscrever-se - Botão de Inscrever-se está oculto - Botão de Inscrever-se está visível - Comentários - Ocultar ou mostrar componentes da seção de comentários - Ocultar resumo de chat de IA - O resumo do chat de IA está oculto - O resumo do chat de IA é mostrado - Ocultar resumo dos comentários da IA - O resumo dos comentários de IA está oculto - O resumo dos comentários de IA é mostrado - Ocultar diretrizes do canal - Diretrizes do canal estão ocultas - Diretrizes do canal são mostradas - Ocultar cabeçalho \'Comentários por membros\' - O cabeçalho de comentários por membros está oculto - O cabeçalho de comentários por membros é mostrado - Ocultar seção de comentários - Seção de comentários está oculta - A seção de comentários é mostrada - Ocultar diretrizes da comunidade - Diretrizes da comunidade estão ocultas - Diretrizes da comunidade estão exibidas - Ocultar botão \'Criar um Short\' - O botão Criar um Short está oculto - O botão Criar um Short é mostrado - Ocultar botões de Emoji e Carimbo de data/hora - Botões de Emoji e Carimbo de data/hora ocultos - Botões de Emoji e Carimbo de data/hora visíveis - Ocultar prévia de comentário - Prévia de comentário está oculta - A prévia de comentário é exibida - Ocultar o botão \"Obrigado\" - Botão valeu está oculto - O botão valeu é mostrada - Ocultar contagem de visualizações - A contagem de visualizações está oculta no feed e nos resultados da pesquisa - A contagem de visualizações é mostrada no feed e nos resultados da pesquisa - - "Limitações: + Ocultar botão \"Participar\" + O botão \'Seja membro\' está oculto + O botão \'Seja membro\' é exibido + Ocultar painel médico + Painel médico está oculto + Os painéis médicos são mostrados + Ocultar ações rápidas + Ações rápidas em tela cheia estão ocultas + Ações rápidas em tela cheia estão exibidas + Ocultar vídeos relacionados + Vídeos relacionados em ações rápidas estão ocultos + Vídeos relacionados em ações rápidas estão exibidos + Ocultar diretrizes de inscritos + Diretrizes da comunidade de inscritos está oculto + Diretrizes da comunidade de inscritos não está oculto + Ocultar reações cronometradas + Reações cronometradas estão ocultas + Reações cronometradas não estão ocultas + Ocultar \"Resumo de vídeo gerado por IA\" + A seção de resumo de vídeo gerada por IA está oculta + A seção de resumo de vídeo gerado por IA é exibida + Ocultar Perguntar + A seção de perguntas está oculta + A seção de perguntas é mostrada + Ocultar atributos + As seções de lugares em destaque, jogos, música e pessoas mencionadas estão ocultas + As seções de lugares em destaque, jogos, música e pessoas mencionadas são mostradas + Ocultar capítulos + Seção de capítulos está oculta + Seção de capítulos é mostrada + Ocultar \"Como este conteúdo foi feito\" + A seção Como este conteúdo foi feito está oculta + A seção Como este conteúdo foi feito é mostrada + Ocultar pontos de Hype + Pontos de Hype estão ocultos + Pontos de Hype estão visíveis + Ocultar \"Explore o podcast\" + A seção Explore o podcast está oculta + A seção Explore o podcast é mostrada + Ocultar links em destaque + A seção de links em destaque está oculta + A seção de links em destaque está visível + Ocultar vídeos em destaque + A seção de vídeos em destaque está oculta + A seção de vídeos em destaque está visível + Ocultar cartões de informações + Seção de cartões de informações está oculto + A seção de cartões de informações é mostrada + Ocultar \"Conceitos-chave\" + A seção Conceitos-chave está oculta + A seção Conceitos-chave é mostrada + Ocultar botão de Inscrição + O botão de Inscrição está oculto + O botão de Inscrição está visível + Ocultar transcrição + Seção de transcrição está oculta + A seção de transcrição é mostrada + Descrição do vídeo + Ocultar ou mostrar componentes de descrição do vídeo + Barra de filtro + Ocultar ou mostrar a barra de filtro em feeds, vídeos relacionados, resultados de pesquisa e histórico de exibição + Ocultar em feeds + Oculto em feeds + Exibido em feeds + Ocultar nos vídeos relacionados + Está oculto nos vídeos relacionados + Não está oculto nos vídeos relacionados + Ocultar nos resultados da pesquisa + Oculto nos resultados da pesquisa + Exibido nos resultados da pesquisa + Ocultar no histórico de exibição + Oculto no histórico de exibição + Exibido no histórico de exibição + Página do canal + Ocultar ou exibir componentes da página do canal + + Ocultar botão Comunidade + Botão de Comunidade está oculto + Botão de Comunidade está visível + + Ocultar a estante \"Para você\" + Prateleira Para você está oculta + Prateleira Para você está exibida + + Ocultar botão de Participar + Botão de Participar está oculto + Botão de Participar está visível + Ocultar prévia de links + Prévia de links está oculta + Prévia de links está exibida + Ocultar prateleira de membros + Prateleira de membros está oculta + Prateleira de membros é mostrada + + Ocultar botão de Loja + Botão de Loja está oculto + Botão de Loja está visível + + Ocultar botão de Inscrever-se + Botão de Inscrever-se está oculto + Botão de Inscrever-se está visível + Comentários + Ocultar ou mostrar componentes da seção de comentários + Ocultar resumo de chat de IA + O resumo do chat de IA está oculto + O resumo do chat de IA é mostrado + Ocultar resumo dos comentários da IA + O resumo dos comentários de IA está oculto + O resumo dos comentários de IA é mostrado + Ocultar diretrizes do canal + Diretrizes do canal estão ocultas + Diretrizes do canal são mostradas + Ocultar cabeçalho \'Comentários por membros\' + O cabeçalho de comentários por membros está oculto + O cabeçalho de comentários por membros é mostrado + Ocultar seção de comentários + Seção de comentários está oculta + A seção de comentários é mostrada + Ocultar diretrizes da comunidade + Diretrizes da comunidade estão ocultas + Diretrizes da comunidade estão exibidas + Ocultar botão \'Criar um Short\' + O botão Criar um Short está oculto + O botão Criar um Short é mostrado + Ocultar botões de Emoji e Carimbo de data/hora + Botões de Emoji e Carimbo de data/hora ocultos + Botões de Emoji e Carimbo de data/hora visíveis + Ocultar prévia de comentário + Prévia de comentário está oculta + A prévia de comentário é exibida + Ocultar o botão \"Obrigado\" + Botão valeu está oculto + O botão valeu é mostrada + Ocultar contagem de visualizações + A contagem de visualizações está oculta no feed e nos resultados da pesquisa + A contagem de visualizações é mostrada no feed e nos resultados da pesquisa + + "Limitações: • As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar as contagens de visualizações • Este recurso não funciona com o fator de forma automotivo" - Ocultar tempo de upload - O tempo de upload está oculto no feed e nos resultados da pesquisa - O tempo de upload é mostrado no feed e nos resultados da pesquisa - - "Limitações: + Ocultar tempo de upload + O tempo de upload está oculto no feed e nos resultados da pesquisa + O tempo de upload é mostrado no feed e nos resultados da pesquisa + + "Limitações: • As prateleiras de Shorts, páginas de canais e resultados da pesquisa ainda podem mostrar os tempos de upload • Este recurso não funciona com o fator de forma automotivo" - Ocultar conteúdo usando palavra-chave - Ocultar pesquisa e vídeos na tela inicial usando palavras-chave como filtros - Ocultar vídeos na tela inicial com palavras-chave - Vídeos na aba inicio são filtrados por palavras-chave - Vídeos na aba inicio não são filtrados por palavras-chave - Ocultar resultados de busca com palavras-chave - Resultados de busca são filtrados por palavras-chave - Resultados de busca não são filtrados por palavras-chave - Ocultar vídeos de inscrições com palavras-chave - Vídeos na aba inscrições são filtrados com palavras-chave - Vídeos na aba de inscrições não são filtrados com palavras-chave - Palavras-chave para ocultar - - "Palavras-chave e frases para ocultar, separadas por novas linhas + "Palavras-chave e frases para ocultar, separadas por novas linhas As palavras-chave podem ser nomes de canais ou qualquer texto mostrado nos títulos dos vídeos As palavras com letras maiúsculas no meio devem ser inseridas com a caixa (por exemplo: iPhone, TikTok, LeBlanc)" - Sobre a filtragem com palavra-chave - "Os resultados da página inicial/assinatura/pesquisa são filtrados para ocultar o conteúdo que corresponde às frases de palavras-chave + Sobre a filtragem com palavra-chave + "Os resultados da página inicial/assinatura/pesquisa são filtrados para ocultar o conteúdo que corresponde às frases de palavras-chave Linitações • Shorts não podem ser ocultados pelo nome do canal • Alguns componentes da IU podem não ser ocultados • A pesquisa por uma palavra-chave pode não mostrar resultados" - Corresponder palavras inteiras - - Colocar uma palavra-chave/frase entre aspas duplas impedirá correspondências parciais de títulos de vídeos e nomes de canais<br><br>Por exemplo,<br><b>\"ia\"</b> ocultará o vídeo: <b>Como funciona a IA?</b><br>mas não ocultará: <b>Como criar um canal do zero?</b> - - Impossível usar a palavra-chave: %s - Adicionar aspas para usar a palavra-chave: %s - A palavra-chave tem declarações conflitantes: %s - A palavra-chave é muito curta e requer aspas: %s - A palavra-chave irá ocultar todos os vídeos: %s - - - Ocultar prateleira da loja do criador - A prateleira da loja do criador sob o player de vídeo está oculta - Prateleira da loja do criador sob o reprodutor de vídeo é exibida - Ocultar banners da loja na tela final - O banner da loja na tela final está oculto - O banner da loja na tela final é exibido - Ocultar anúncios em tela cheia - "Os anúncios em tela cheia estão ocultos + Corresponder palavras inteiras + + Colocar uma palavra-chave/frase entre aspas duplas impedirá correspondências parciais de títulos de vídeos e nomes de canais<br><br>Por exemplo,<br><b>\"ia\"</b> ocultará o vídeo: <b>Como funciona a IA?</b><br>mas não ocultará: <b>Como criar um canal do zero?</b> + + Impossível usar a palavra-chave: %s + Adicionar aspas para usar a palavra-chave: %s + A palavra-chave tem declarações conflitantes: %s + A palavra-chave é muito curta e requer aspas: %s + A palavra-chave irá ocultar todos os vídeos: %s + + + Ocultar prateleira da loja do criador + A prateleira da loja do criador sob o player de vídeo está oculta + Prateleira da loja do criador sob o reprodutor de vídeo é exibida + Ocultar banners da loja na tela final + O banner da loja na tela final está oculto + O banner da loja na tela final é exibido + Ocultar anúncios em tela cheia + "Os anúncios em tela cheia estão ocultos Este recurso está disponível apenas para dispositivos mais antigos" - Anúncios em tela cheia não estão ocultos - - Ocultar anúncios em tela cheia só funciona com dispositivos antigos - Ocultar anúncios gerais - Anúncios gerais estão ocultos - Os anúncios gerais são mostrados - Ocultar banners de mercadoria - Os banners de mercadoria estão ocultos - Os banners de mercadorias são mostrados - Ocultar o rótulo de promoção paga - O rótulo de promoção paga está oculto - O rótulo de promoção paga é mostrada - Ocultar cartões auto-patrocinados - Cartões autopatrocinados estão ocultos - Cartões autopatrocinados não estão ocultos - Ocultar links de compras - Links de compras na descrição do vídeo estão ocultos - Links de compras na descrição do vídeo são exibidos - Ocultar banner \"Ver produtos\" - O banner Ver produtos na sobreposição do vídeo está oculto - O banner Ver produtos na sobreposição do vídeo é exibido - Ocultar resultados de busca web - Resultados de busca web estão ocultos - Os resultados de busca web são mostrados - - - Ocultar promoções do YouTube Premium - Promoções do YouTube Premium sob o reprodutor de vídeo estão ocultas - Promoções do YouTube Premium sob o reprodutor de vídeo não estão ocultas - - - Ocultar anúncios do vídeo - Anúncios do vídeo estão ocultos - Anúncios do vídeo não estão ocultos - - - URL copiada para a área de transferência - URL com tempo copiado - Mostrar botão copiar URL no vídeo - Botão de copiar URL do vídeo está visível. Toque para copiar URL do vídeo. Toque e segure para copiar com carimbo de data/hora - Botão de copiar URL do vídeo não está visível - Mostrar botão copiar URL com tempo - Botão de copiar URL com carimbo de data/hora está visível. Toque para copiar URL do vídeo com carimbo de data/hora. Toque e segure para copiar sem carimbo de data/hora - Botão de copiar URL com carimbo de data/hora não está visível - - - Remover diálogo de restrição - Diálogo foi removido - O diálogo vai ser mostrado - Isto não ignora a restrição de idade, apenas a aceita automaticamente. - - - Desativar pop-up \"Fazer login na TV\" - O pop-up de fazer login na TV está desativado - O pop-up de fazer login na TV está ativado - - - Desativar pulo de capítulo com toque duplo - O toque duplo nunca pode acionar um pulo para o capítulo seguinte/anterior - O toque duplo pode ocasionalmente acionar um pulo para o capítulo seguinte/anterior - - - App de download externo - Configurações para usar um app de download externo - Mostrar botão de download externo - O botão de download no player é mostrado - O botão de download no player não é mostrado - - Substituir botão de ação Download - Botão de download abre seu app de download externo - Botão de download abre o download nativo - Nome do pacote do app de download - Nome do pacote do seu aplicativo de download externo instalado - Insira o nome do pacote - Outro - Aplicativo não instalado - %s não está instalado. Por favor, instale. - "Não foi possível encontrar o aplicativo instalado com o nome do pacote: %s + Anúncios em tela cheia não estão ocultos + + Ocultar anúncios em tela cheia só funciona com dispositivos antigos + Ocultar anúncios gerais + Anúncios gerais estão ocultos + Os anúncios gerais são mostrados + Ocultar banners de mercadoria + Os banners de mercadoria estão ocultos + Os banners de mercadorias são mostrados + Ocultar o rótulo de promoção paga + O rótulo de promoção paga está oculto + O rótulo de promoção paga é mostrada + Ocultar cartões auto-patrocinados + Cartões autopatrocinados estão ocultos + Cartões autopatrocinados não estão ocultos + Ocultar links de compras + Links de compras na descrição do vídeo estão ocultos + Links de compras na descrição do vídeo são exibidos + Ocultar banner \"Ver produtos\" + O banner Ver produtos na sobreposição do vídeo está oculto + O banner Ver produtos na sobreposição do vídeo é exibido + Ocultar resultados de busca web + Resultados de busca web estão ocultos + Os resultados de busca web são mostrados + + + Ocultar promoções do YouTube Premium + Promoções do YouTube Premium sob o reprodutor de vídeo estão ocultas + Promoções do YouTube Premium sob o reprodutor de vídeo não estão ocultas + + + Ocultar anúncios do vídeo + Anúncios do vídeo estão ocultos + Anúncios do vídeo não estão ocultos + + + URL copiada para a área de transferência + URL com tempo copiado + Mostrar botão copiar URL no vídeo + Botão de copiar URL do vídeo está visível. Toque para copiar URL do vídeo. Toque e segure para copiar com carimbo de data/hora + Botão de copiar URL do vídeo não está visível + Mostrar botão copiar URL com tempo + Botão de copiar URL com carimbo de data/hora está visível. Toque para copiar URL do vídeo com carimbo de data/hora. Toque e segure para copiar sem carimbo de data/hora + Botão de copiar URL com carimbo de data/hora não está visível + + + Remover diálogo de restrição + Diálogo foi removido + O diálogo vai ser mostrado + Isto não ignora a restrição de idade, apenas a aceita automaticamente. + + + Desativar pop-up \"Fazer login na TV\" + O pop-up de fazer login na TV está desativado + O pop-up de fazer login na TV está ativado + + + Desativar pulo de capítulo com toque duplo + O toque duplo nunca pode acionar um pulo para o capítulo seguinte/anterior + O toque duplo pode ocasionalmente acionar um pulo para o capítulo seguinte/anterior + + + App de download externo + Configurações para usar um app de download externo + Mostrar botão de download externo + O botão de download no player é mostrado + O botão de download no player não é mostrado + + Substituir botão de ação Download + Botão de download abre seu app de download externo + Botão de download abre o download nativo + Nome do pacote do app de download + Nome do pacote do seu aplicativo de download externo instalado + Insira o nome do pacote + Outro + Aplicativo não instalado + %s não está instalado. Por favor, instale. + "Não foi possível encontrar o aplicativo instalado com o nome do pacote: %s Verifique se o nome do pacote está correto e se o aplicativo está instalado" - O nome do pacote não pode estar vazio - - - Desativar gesto de busca precisa - Gesto desativado - O gesto está ativado - - - Ativar \"Toque para buscar\" - Toque para buscar está ativado - Toque para buscar está desativado - - - Ativar gesto de brilho - "O gesto de brilho em tela cheia está ativado + O nome do pacote não pode estar vazio + + + Desativar gesto de busca precisa + Gesto desativado + O gesto está ativado + + + Ativar \"Toque para buscar\" + Toque para buscar está ativado + Toque para buscar está desativado + + + Ativar gesto de brilho + "O gesto de brilho em tela cheia está ativado Ajuste o brilho deslizando verticalmente no lado esquerdo da tela" - O gesto de brilho em tela cheia está desativado - Ativar gesto de volume - "O controle de volume por deslize em tela cheia está ativado + O gesto de brilho em tela cheia está desativado + Ativar gesto de volume + "O controle de volume por deslize em tela cheia está ativado Ajuste o volume deslizando verticalmente no lado direito da tela" - O controle de volume por deslize em tela cheia está desativado - Ativar gesto de pressionar para deslizar - Pressionar para deslizar está ativado - Pressionar para deslizar está desativado - Ativar resposta tátil - Resposta tátil está ativado - Resposta tátil está desativado - Salvar e restaurar brilho - Salvar e restaurar o brilho quando sair ou entrar em tela cheia - Não salvar e restaurar o brilho ao sair ou entrar em tela cheia - Ativar gesto de brilho automático - Deslizar para baixo até o menor valor do gesto de brilho, ativa o brilho automático - Deslizar para baixo até o menor valor do gesto de brilho, não ativa o brilho automático - Automático - Tempo limite da sobreposição no gesto - A quantidade de milissegundos em que a sobreposição é visível - Opacidade do plano de fundo de sobreposição de deslize - Valor da opacidade entre 0-100 - A opacidade do deslizar deve estar entre 0-100 - Cor da barra de brilho da sobreposição de deslize - A cor da barra de progresso para controles de brilho - Cor da barra de volume da sobreposição de deslize - A cor da barra de progresso para controles de volume - Tamanho do texto da sobreposição de deslize - O tamanho do texto para sobreposição de deslize entre 1 e 30 - O tamanho do texto deve estar entre 1 e 30 - Limiar distância no gesto - Quantidade limite que o gesto irá ocorrer - Sensibilidade ao deslizar o volume - O quanto o volume muda por deslize - Estilo de sobreposição de deslize - Sobreposição horizontal - Sobreposição horizontal (mínima - superior) - Sobreposição horizontal (mínima - central) - Sobreposição circular - Sobreposição circular (mínima) - Sobreposição vertical - Sobreposição vertical (mínima) - Ativar deslize para mudar os vídeos - Deslizar no modo tela cheia mudará para o vídeo anterior/seguinte - Deslizar no modo tela cheia não mudará para o próximo/vídeo anterior - - - Desativar legendas automáticas - Legendas automáticas estão desativadas - Legendas automáticas estão ativadas - - - Botões de ação - Ocultar ou mostrar botões sob vídeos - Desativar o brilho do botão Curtir e Inscrever-se - O botão Curtir e Inscrever-se não brilhará quando mencionado - O botão Curtir e Inscrever-se brilhará quando mencionado - Ocultar Gostei e Não gostei - Os botões Gostei e Não gostei estão ocultos - Os botões Gostei e Não gostei são mostrados - - Ocultar Compartilhar - Botão compartilhar está oculto - O botão compartilhar é mostrado - - Ocultar \"Parar anúncios\" - O botão Parar anúncios está oculto - O botão Parar anúncios é exibido - - Ocultar Comentários - Botão de comentários está oculto - Botão de comentários está visível - + Ocultar Compartilhar + Botão compartilhar está oculto + O botão compartilhar é mostrado + + Ocultar \"Parar anúncios\" + O botão Parar anúncios está oculto + O botão Parar anúncios é exibido + + Ocultar Comentários + Botão de comentários está oculto + Botão de comentários está visível + - Ocultar Denúncia - Botão de denúncia está oculto - O botão de denúncia é mostrado - - Ocultar Remix - Botão remix está oculto - O botão remix é mostrado - - Ocultar Download - Botão download está oculto - O botão download é mostrado - + Ocultar Remix + Botão remix está oculto + O botão remix é mostrado + + Ocultar Download + Botão download está oculto + O botão download é mostrado + - Ocultar Hype - Botão Hype está oculto - O botão Hype é exibido - - Ocultar Promoções - Botão de promoção está oculto - Botão de promoção está visível - - Ocultar Valeu - Botão valeu está oculto - O botão valeu é mostrado - + Ocultar Promoções + Botão de promoção está oculto + Botão de promoção está visível + + Ocultar Valeu + Botão valeu está oculto + O botão valeu é mostrado + - Ocultar \"Perguntar\" - Botão \"Perguntar\" oculto - O botão \"Perguntar\" é mostrado - - Ocultar Clipe - Botão clipe está oculto - O botão clipe é mostrado - - Ocultar Loja - O botão Loja está oculto - O botão Loja é exibido - - Ocultar Salvar - O botão Salvar está oculto - O botão Salvar é exibido - - - Botões de navegação - Ocultar ou alterar botões na barra de navegação - - Ocultar Início - Botão de início está oculto - O botão de início é mostrado - - Ocultar Shorts - O botão Shorts está oculto - O botão Shorts é mostrado - - Ocultar Criar - Botão criar está oculto - O botão criar é mostrado - - Ocultar Inscrições - Botão inscrições está oculto - O botão inscrições é mostrado - Ocultar notificações - O botão de notificações está oculto - O botão de notificações está visível - - Mudar botão Criar por Notificações - "O botão Criar é trocado com o botão Notificações + Ocultar \"Perguntar\" + Botão \"Perguntar\" oculto + O botão \"Perguntar\" é mostrado + + Ocultar Clipe + Botão clipe está oculto + O botão clipe é mostrado + + Ocultar Loja + O botão Loja está oculto + O botão Loja é exibido + + Ocultar Salvar + O botão Salvar está oculto + O botão Salvar é exibido + + + Botões de navegação + Ocultar ou alterar botões na barra de navegação + + Ocultar Início + Botão de início está oculto + O botão de início é mostrado + + Ocultar Shorts + O botão Shorts está oculto + O botão Shorts é mostrado + + Ocultar Criar + Botão criar está oculto + O botão criar é mostrado + + Ocultar Inscrições + Botão inscrições está oculto + O botão inscrições é mostrado + Ocultar notificações + O botão de notificações está oculto + O botão de notificações está visível + + Mudar botão Criar por Notificações + "O botão Criar é trocado com o botão Notificações Nota: Habilitar isso também oculta os anúncios em vídeo" - Botão criar não está alternado com o botão notificações - "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. + Botão criar não está alternado com o botão notificações + "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. Se alterar esta configuração não fizer efeito, tente mudar para o modo anônimo." - Ocultar rótulos dos botões de navegação - Rótulos são ocultos - Rótulos são mostrados - Desabilitar barra de status translúcida - A barra de status é opaca - A barra de status é opaca ou translúcida - Em alguns dispositivos, ativar este recurso pode alterar a barra de navegação do sistema para transparente. - Desabilitar barra de navegação translúcida clara - A barra de navegação no modo claro é opaca - A barra de navegação do modo claro é opaca ou translúcida - Desabilitar barra translúcida escura - A barra de navegação no modo escuro é opaca - A barra de navegação do modo escuro é opaca ou translúcida - - - Menu flutuante - Ocultar ou mostrar itens no menu suspenso do reprodutor - - Ocultar Legendas - Menu legendas está oculto - O menu legendas é mostrado - - Ocultar Configurações adicionais - Menu de configurações adicionais está oculto - O menu de configurações adicionais é mostrado - - Ocultar Timer de suspensão - O menu Timer de suspensão está oculto - O menu do timer de suspensão é mostrado - - Ocultar Vídeo em Loop - Menu de vídeo em loop está oculto - O menu de vídeo em loop é mostrado - - Ocultar Modo ambiente - Menu do modo ambiente está oculto - O menu do modo ambiente é mostrado - Ocultar Volume estável - O menu de volume estável será exibido - O menu de Volume estável está oculto - - Ocultar Ajuda & Feedback - Menu ajuda & opinião está oculto - O menu de ajuda & feedback é mostrado - - Ocultar Velocidade da reprodução - Menu velocidade da reprodução está oculto - O menu velocidade da reprodução é mostrado - - Ocultar Tela de bloqueio - Menu tela de bloqueio está oculto - Menu tela de bloqueio não está oculto - - Ocultar Ouvir com o YouTube Music - O menu Ouvir com o YouTube Music está oculto - O menu Ouvir com o YouTube Music está exibido - - Ocultar Faixa de áudio - Menu faixa de áudio está oculto - Menu faixa de áudio não está oculto - + Ocultar Legendas + Menu legendas está oculto + O menu legendas é mostrado + + Ocultar Configurações adicionais + Menu de configurações adicionais está oculto + O menu de configurações adicionais é mostrado + + Ocultar Timer de suspensão + O menu Timer de suspensão está oculto + O menu do timer de suspensão é mostrado + + Ocultar Vídeo em Loop + Menu de vídeo em loop está oculto + O menu de vídeo em loop é mostrado + + Ocultar Modo ambiente + Menu do modo ambiente está oculto + O menu do modo ambiente é mostrado + Ocultar Volume estável + O menu de volume estável será exibido + O menu de Volume estável está oculto + + Ocultar Ajuda & Feedback + Menu ajuda & opinião está oculto + O menu de ajuda & feedback é mostrado + + Ocultar Velocidade da reprodução + Menu velocidade da reprodução está oculto + O menu velocidade da reprodução é mostrado + + Ocultar Tela de bloqueio + Menu tela de bloqueio está oculto + Menu tela de bloqueio não está oculto + + Ocultar Ouvir com o YouTube Music + O menu Ouvir com o YouTube Music está oculto + O menu Ouvir com o YouTube Music está exibido + + Ocultar Faixa de áudio + Menu faixa de áudio está oculto + Menu faixa de áudio não está oculto + - "O menu da faixa de áudio está oculto + "O menu da faixa de áudio está oculto Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' para 'Android No SDK'" - - Ocultar Assistir no VR - Menu assistir no VR está oculto - Menu assistir no VR não está oculto - Esconder menu de qualidade de vídeo - O menu de qualidade de vídeo está oculto - O menu de qualidade de vídeo é exibido - Ocultar rodapé do menu de qualidade de vídeo - O rodapé do menu de qualidade de vídeo está oculto - Rodapé do menu de qualidade de vídeo não está ocultos - - - Ocultar botão Reprodução automática - Botão de reprodução automática está oculto - Botão de reprodução automática não está oculto - - Ocultar botão Legendas - Botão legendas está oculto - Botão legendas não está oculto - Ocultar botão Transmitir - Botão transmitir está oculto - Botão transmitir não está oculto - Ocultar plano de fundo dos controles do player - O plano de fundo dos controles do reprodutor está oculto - O plano de fundo dos controles do player está visível - Ocultar botões Anterior e Próximo - Os botões estão ocultos - Os botões serão exibidos - - - Ocultar cartões de tela final - Cartões de tela final estão ocultos - Cartões de tela final não estão ocultos - - - Desativar modo Ambiente em tela cheia - Modo ambiente desativado - Modo ambiente ativado - - - Ocultar cartões de informações - Cartões de informações estão ocultos - Cartões de informações não estão ocultos - - - Desativar animações de números rodando - Os números rolantes não são animados - Os números rolantes são animados - - - Ocultar barra de busca do reprodutor de vídeo - Barra de busca no reprodutor de vídeo está oculto - Barra de busca no reprodutor de vídeo é mostrada - - Ocultar barra de busca de miniaturas de vídeo - A barra de busca de miniaturas de vídeo está oculta - A barra de busca de miniaturas de vídeo é mostrada - - - Reprodutor do Shorts - Ocultar ou mostrar componentes do player de Shorts - - Ocultar Shorts na página inicial - Oculto na página inicial e vídeos relacionados - Exibido na página inicial e vídeos relacionados - Ocultar Shorts nos resultados de pesquisa - Oculto nos resultados da pesquisa - Exibido nos resultados da pesquisa - - Ocultar Shorts no feed de Inscrições - Oculto no feed de Inscrições - Exibido no feed de Inscrições - Ocultar Shorts no histórico de exibição - Oculto no histórico de exibições - Mostrado no histórico de exibição - Ocultar etiqueta \"Dublado automaticamente\" - Rótulo dublado automaticamente está oculto - Rótulo dublado automaticamente está visível - Ocultar botão \"Comprar Super Thanks\" - O botão Comprar Super Thanks está oculto - O botão Comprar Super Thanks é exibido - Ocultar botão de Efeito - O botão de efeito está oculto - O botão de efeito é exibido - Ocultar botão \"Tela verde\" - O botão de tela verde está oculto - O botão de tela verde será exibido - Ocultar botão hashtag - O botão hashtag está oculto - Botão hashtag é mostrado - - Ocultar botão Participar - Botão seja membro está oculto - Botão seja membro não está oculto - Ocultar pré-visualização ao vivo - Prévia ao vivo está oculta - Prévia ao vivo está sendo exibida - Ocultar rótulo de localização - Rótulo de localização está oculto - Rótulo de localização é mostrado - Ocultar botão \"Novas publicações\" - O botão de novas postagens está oculto - O botão de novas postagens é exibido - Ocultar botões de sobreposição pausados - Botões de sobreposição pausados estão ocultos - Botões de sobreposição pausados são mostrados - Ocultar comentário de visualização - O comentário de visualização está oculto - A visualização do comentário é mostrada - Ocultar botão \"Salvar música\" - O botão Salvar música está oculto - O botão Salvar música será exibido - Ocultar sugestões de busca - Sugestões de pesquisa estão ocultas - Sugestões de pesquisa são mostradas - Ocultar botão Loja - Botão comprar está oculto - Botão comprar não está oculto - Ocultar adesivos - Adesivos estão ocultos - Adesivos estão visíveis - Ocultar botão Inscrever-se - Botão inscreva-se está oculto - Botão inscreva-se não está oculto - Ocultar produtos marcados - Produtos marcados estão ocultos - Produtos marcados são mostrados - Ocultar botão Próximos - O botão \"próximo\" está oculto - O botão \"próximo\" é mostrado - Ocultar botão \"Usar este som\" - Botão Usar este som está oculto - Botão Usar este som está visível - Ocultar botão \"Usar este modelo\" - Botão Usar este modelo está oculto - Botão Usar este modelo é mostrado - Ocultar animação de fonte do botão Curtir - Como a animação da fonte do botão está oculta - Como a animação da fonte do botão é mostrada - Ocultar botão Curtir - Botão gostei está oculto - Botão gostei não está oculto - Ocultar botão Não curtir - Botão não gostei está oculto - Botão não gostei é mostrado - Ocultar botão Comentários - Botão comentários está oculto - Botão comentários não está oculto - - Ocultar botão Compartilhar - Botão compartilhar está oculto - Botão compartilhar não está oculto - - Ocultar botão Remixar - Botão remix está oculto - Botão remix não está oculto - Ocultar botão som - Botão som está oculto - Botão som não está oculto - Ocultar painel de informações - Painel de informações está oculto - Painel de informações não estão oculto - Ocultar barra de canais - Barra de canal está oculta - Barra de canal não está oculta - Ocultar título do vídeo - O título do vídeo está oculto - O título do vídeo é exibido - Ocultar rótulo de metadados de som - O marcador de metadados de áudio está oculto - O marcador de metadados de áudio é exibido - Ocultar rótulo do link do vídeo - Rótulo do link do vídeo está oculto - Rótulo do link do vídeo não está oculto - Ocultar barra de navegação - Barra de navegação está oculta - Barra de navegação não está oculta - - - Ocultar o vídeo sugerido na tela final - "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada + + Ocultar Assistir no VR + Menu assistir no VR está oculto + Menu assistir no VR não está oculto + Esconder menu de qualidade de vídeo + O menu de qualidade de vídeo está oculto + O menu de qualidade de vídeo é exibido + Ocultar rodapé do menu de qualidade de vídeo + O rodapé do menu de qualidade de vídeo está oculto + Rodapé do menu de qualidade de vídeo não está ocultos + + + Ocultar botão Reprodução automática + Botão de reprodução automática está oculto + Botão de reprodução automática não está oculto + + Ocultar botão Legendas + Botão legendas está oculto + Botão legendas não está oculto + Ocultar botão Transmitir + Botão transmitir está oculto + Botão transmitir não está oculto + Ocultar plano de fundo dos controles do player + O plano de fundo dos controles do reprodutor está oculto + O plano de fundo dos controles do player está visível + Ocultar botões Anterior e Próximo + Os botões estão ocultos + Os botões serão exibidos + + + Ocultar cartões de tela final + Cartões de tela final estão ocultos + Cartões de tela final não estão ocultos + + + Desativar modo Ambiente em tela cheia + Modo ambiente desativado + Modo ambiente ativado + + + Ocultar cartões de informações + Cartões de informações estão ocultos + Cartões de informações não estão ocultos + + + Desativar animações de números rodando + Os números rolantes não são animados + Os números rolantes são animados + + + Ocultar barra de busca do reprodutor de vídeo + Barra de busca no reprodutor de vídeo está oculto + Barra de busca no reprodutor de vídeo é mostrada + + Ocultar barra de busca de miniaturas de vídeo + A barra de busca de miniaturas de vídeo está oculta + A barra de busca de miniaturas de vídeo é mostrada + + + Reprodutor do Shorts + Ocultar ou mostrar componentes do player de Shorts + + Ocultar Shorts na página inicial + Oculto na página inicial e vídeos relacionados + Exibido na página inicial e vídeos relacionados + Ocultar Shorts nos resultados de pesquisa + Oculto nos resultados da pesquisa + Exibido nos resultados da pesquisa + + Ocultar Shorts no feed de Inscrições + Oculto no feed de Inscrições + Exibido no feed de Inscrições + Ocultar Shorts no histórico de exibição + Oculto no histórico de exibições + Mostrado no histórico de exibição + Ocultar etiqueta \"Dublado automaticamente\" + Rótulo dublado automaticamente está oculto + Rótulo dublado automaticamente está visível + Ocultar botão \"Comprar Super Thanks\" + O botão Comprar Super Thanks está oculto + O botão Comprar Super Thanks é exibido + Ocultar botão de Efeito + O botão de efeito está oculto + O botão de efeito é exibido + Ocultar botão \"Tela verde\" + O botão de tela verde está oculto + O botão de tela verde será exibido + Ocultar botão hashtag + O botão hashtag está oculto + Botão hashtag é mostrado + + Ocultar botão Participar + Botão seja membro está oculto + Botão seja membro não está oculto + Ocultar pré-visualização ao vivo + Prévia ao vivo está oculta + Prévia ao vivo está sendo exibida + Ocultar rótulo de localização + Rótulo de localização está oculto + Rótulo de localização é mostrado + Ocultar botão \"Novas publicações\" + O botão de novas postagens está oculto + O botão de novas postagens é exibido + Ocultar botões de sobreposição pausados + Botões de sobreposição pausados estão ocultos + Botões de sobreposição pausados são mostrados + Ocultar comentário de visualização + O comentário de visualização está oculto + A visualização do comentário é mostrada + Ocultar botão \"Salvar música\" + O botão Salvar música está oculto + O botão Salvar música será exibido + Ocultar sugestões de busca + Sugestões de pesquisa estão ocultas + Sugestões de pesquisa são mostradas + Ocultar botão Loja + Botão comprar está oculto + Botão comprar não está oculto + Ocultar adesivos + Adesivos estão ocultos + Adesivos estão visíveis + Ocultar botão Inscrever-se + Botão inscreva-se está oculto + Botão inscreva-se não está oculto + Ocultar produtos marcados + Produtos marcados estão ocultos + Produtos marcados são mostrados + Ocultar botão Próximos + O botão \"próximo\" está oculto + O botão \"próximo\" é mostrado + Ocultar botão \"Usar este som\" + Botão Usar este som está oculto + Botão Usar este som está visível + Ocultar botão \"Usar este modelo\" + Botão Usar este modelo está oculto + Botão Usar este modelo é mostrado + Ocultar animação de fonte do botão Curtir + Como a animação da fonte do botão está oculta + Como a animação da fonte do botão é mostrada + Ocultar botão Curtir + Botão gostei está oculto + Botão gostei não está oculto + Ocultar botão Não curtir + Botão não gostei está oculto + Botão não gostei é mostrado + Ocultar botão Comentários + Botão comentários está oculto + Botão comentários não está oculto + + Ocultar botão Compartilhar + Botão compartilhar está oculto + Botão compartilhar não está oculto + + Ocultar botão Remixar + Botão remix está oculto + Botão remix não está oculto + Ocultar botão som + Botão som está oculto + Botão som não está oculto + Ocultar painel de informações + Painel de informações está oculto + Painel de informações não estão oculto + Ocultar barra de canais + Barra de canal está oculta + Barra de canal não está oculta + Ocultar título do vídeo + O título do vídeo está oculto + O título do vídeo é exibido + Ocultar rótulo de metadados de som + O marcador de metadados de áudio está oculto + O marcador de metadados de áudio é exibido + Ocultar rótulo do link do vídeo + Rótulo do link do vídeo está oculto + Rótulo do link do vídeo não está oculto + Ocultar barra de navegação + Barra de navegação está oculta + Barra de navegação não está oculta + + + Ocultar o vídeo sugerido na tela final + "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada A reprodução automática pode ser alterada nas configurações do YouTube: Configurações → Reprodução → Reproduzir próximo vídeo automaticamente" - O vídeo sugerido na tela final é exibido - - - Ocultar sobreposição de vídeos relacionados - A sobreposição de vídeos relacionados em tela cheia está oculta - A sobreposição de vídeos relacionados em tela cheia é exibida - - - Ocultar tempo do vídeo - Tempo está oculto - Tempo não está oculto - - - Ocultar painel popup de reprodutor - Painel pop-up do reprodutor está oculto - Painel pop-up do reprodutor não está oculto - - - Sair do modo de tela cheia ao final do vídeo - Desativado - Retrato - Paisagem - Retrato e paisagem - - - Abrir vídeos em tela cheia retrato - Vídeos abrem em tela cheia - Vídeos não abrem em tela cheia - - - Opacidade do reprodutor - Valor de opacidade entre 0-100, onde 0 é transparente - Opacidade do reprodutor deve estar entre 0-100 - - - - Não gostei indisponível por um tempo (API expirou) - Não gostei indisponível (status %d) - \"Não gostei\" não estão disponíveis (limite da API do cliente) - Não gostei indisponível (%s) - - Recarregue o vídeo para votar usando o Return YouTube Dislike - - Oculto pelo proprietário - Não gostei é mostrado - Não gostei não está oculto - Mostrar não gostei no Shorts - "\"Não gostei\" nos Shorts são mostrados + O vídeo sugerido na tela final é exibido + + + Ocultar sobreposição de vídeos relacionados + A sobreposição de vídeos relacionados em tela cheia está oculta + A sobreposição de vídeos relacionados em tela cheia é exibida + + + Ocultar tempo do vídeo + Tempo está oculto + Tempo não está oculto + + + Ocultar painel popup de reprodutor + Painel pop-up do reprodutor está oculto + Painel pop-up do reprodutor não está oculto + + + Sair do modo de tela cheia ao final do vídeo + Desativado + Retrato + Paisagem + Retrato e paisagem + + + Abrir vídeos em tela cheia retrato + Vídeos abrem em tela cheia + Vídeos não abrem em tela cheia + + + Opacidade do reprodutor + Valor de opacidade entre 0-100, onde 0 é transparente + Opacidade do reprodutor deve estar entre 0-100 + + + + Não gostei indisponível por um tempo (API expirou) + Não gostei indisponível (status %d) + \"Não gostei\" não estão disponíveis (limite da API do cliente) + Não gostei indisponível (%s) + + Recarregue o vídeo para votar usando o Return YouTube Dislike + + Oculto pelo proprietário + Não gostei é mostrado + Não gostei não está oculto + Mostrar não gostei no Shorts + "\"Não gostei\" nos Shorts são mostrados Limitação: \"Não gostei\" podem não aparecer no modo anônimo" - \"Não gostei\" nos Shorts não são mostrados - Não gostei com porcentagem - \"Não gostei\" são mostrados como uma porcentagem - \"Não gostei\" são mostrados como um número - - Botão Curtir compacto - Botão gostei estilizado para largura mínima - Botão gostei estilizado para melhor aparência - Mostrar estimativa de \"gostei\" - Vídeos com likes desativados mostram uma estimativa da contagem de likes - Likes estimados não são mostrados - Exibir uma notificação flutuante se a API não estiver disponível - Notificação flutuante vai ser exibida se o Return YouTube Dislike não estiver disponível - Notificação flutuante não vai ser exibida se o Return YouTube Dislike não estiver disponível - Os dados são fornecidos pela API do Return Dislike YouTube. Toque aqui para saber mais - - Estatísticas da API do Return YouTube Dislike deste dispositivo - Tempo de resposta da API, média - Tempo de resposta da API, mínimo - Tempo de resposta da API, máximo - Tempo de resposta da API, último vídeo - Não gostei está temporariamente indisponível - Taxa limite da API do cliente em efeito - API de busca de votos, número de chamadas - Nenhuma chamada de rede feita - %d chamadas de rede realizadas - API de busca de votos, números de chamadas perdidas - Nenhuma chamada de rede perdida - %d chamada de rede perdida - Taxa limite da API do cliente - Nenhum taxa limite do cliente encontrado - %d taxa limite do cliente encontrado - %d milisegundos - - - Ativar barra de busca ampla - Barra de busca ampla está ativada - Barra de busca ampla está desativada - - - Ativar miniaturas de alta qualidade - As miniaturas na barra de busca são de qualidade alta - As miniaturas na barra de busca são de qualidade média - "Isso também restaurará as miniaturas em transmissões ao vivo que não possuem miniaturas de barra de busca. + \"Não gostei\" nos Shorts não são mostrados + Não gostei com porcentagem + \"Não gostei\" são mostrados como uma porcentagem + \"Não gostei\" são mostrados como um número + + Botão Curtir compacto + Botão gostei estilizado para largura mínima + Botão gostei estilizado para melhor aparência + Mostrar estimativa de \"gostei\" + Vídeos com likes desativados mostram uma estimativa da contagem de likes + Likes estimados não são mostrados + Exibir uma notificação flutuante se a API não estiver disponível + Notificação flutuante vai ser exibida se o Return YouTube Dislike não estiver disponível + Notificação flutuante não vai ser exibida se o Return YouTube Dislike não estiver disponível + Os dados são fornecidos pela API do Return Dislike YouTube. Toque aqui para saber mais + + Estatísticas da API do Return YouTube Dislike deste dispositivo + Tempo de resposta da API, média + Tempo de resposta da API, mínimo + Tempo de resposta da API, máximo + Tempo de resposta da API, último vídeo + Não gostei está temporariamente indisponível - Taxa limite da API do cliente em efeito + API de busca de votos, número de chamadas + Nenhuma chamada de rede feita + %d chamadas de rede realizadas + API de busca de votos, números de chamadas perdidas + Nenhuma chamada de rede perdida + %d chamada de rede perdida + Taxa limite da API do cliente + Nenhum taxa limite do cliente encontrado + %d taxa limite do cliente encontrado + %d milisegundos + + + Ativar barra de busca ampla + Barra de busca ampla está ativada + Barra de busca ampla está desativada + + + Ativar miniaturas de alta qualidade + As miniaturas na barra de busca são de qualidade alta + As miniaturas na barra de busca são de qualidade média + "Isso também restaurará as miniaturas em transmissões ao vivo que não possuem miniaturas de barra de busca. A barra de busca usará a mesma qualidade do vídeo atual. Este recurso funciona melhor com uma qualidade de vídeo de 720p ou inferior e ao usar uma conexão de internet muito rápida." - Restaurar as miniaturas antigas da barra de busca - As miniaturas vão aparecer acima da barra de busca - As miniaturas na barra de busca vão aparecer em tela cheia - - - Ativar SponsorBlock - SponsorBlock é um sistema de crowdsourcing para pular partes irritantes de vídeos do YouTube - Aparência - Mostrar botão votar - Botão de votar segmento será mostrado - Botão de votar não será mostrado - Usar layout quadrado - Botões e controles são quadrados - Botões e controles são arredondados - - Usar botão de pular compacto - Botão pular estilizado para largura mínima - Botão pular estilizado para a melhor aparência - Ocultar automaticamente o botão Pular - Ocultar botão pular após alguns segundos - O botão Pular é mostrado para todo o segmento - Duração do botão Pular - Por quanto tempo mostrar os botões de pular e pular para destaque antes de ocultar automaticamente - Mostrar aviso de desfazer pulo - O aviso é exibido quando um segmento é pulado automaticamente. Toque na notificação de aviso para desfazer o pulo - A notificação não é exibida - Duração da notificação de pular - Quanto tempo para exibir o toast de desfazer pular - 1 segundo - 2 segundos - 3 segundos - 4 segundos - 5 segundos - 6 segundos - 7 segundos - 8 segundos - 9 segundos - 10 segundos - Mostrar duração do vídeo sem segmentos - O comprimento do vídeo menos todos os segmentos é mostrado na barra de busca - Mostrar duração total do vídeo - Criando segmentos - Mostrar o botão Criar novo segmento - Botão criar segmento é mostrado - Botão criar segmento não é mostrado - Ajustar nova etapa de segmento - Número em milissegundos em que os botões de ajuste de tempo se movem ao criar segmentos - Valor deve ser um número positivo - Ver diretrizes - Diretrizes contêm regras e dicas para criar segmentos - Siga as diretrizes - Leia as diretrizes do SponsorBlock antes de criar segmentos - Já lido - Me mostre - Geral - Exibir uma notificação flutuante se a API não estiver disponível - Notificação flutuante é exibida se o SponsorBlock não está disponível - Notificação flutuante não é exibida se o SponsorBlock não está disponível - Ativar rastreamento de contagem de pulos - Vamos o placar do Patrocinador saber quanto tempo foi salvo. Uma mensagem é enviada para o placar cada vez que um segmento é pulado - Rastreamento de contagem de pulos não está ativado - Duração mínima de segmento - Segmentos menores que este valor (em segundos) não serão mostrados ou pulados - Duração de tempo inválida - Seu id privado de usuário - Isso deve ser mantido em particular. Isto é como uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, ele pode se passar por você - ID do usuário privado deve ter pelo menos 30 caracteres - Alterar URL da API - SponsorBlock usa esse endereço para fazer chamadas ao servidor - Redefinir URL da API - URL da API é inválido - Endereço da API alterada - Importar/Exportar Configurações - Copiar - Sua configuração JSON do SponsorBlock que pode ser importada/exportada para ReVanced e outras plataformas do SponsorBlock - Sua configuração JSON do SponsorBlock que pode ser importada/exportada para ReVanced ou em outras plataformas do SponsorBlock. Isso inclui sua identificação de usuário privada. Certifique-se de compartilhar isso sabiamente - Configurações importadas com sucesso - Falha ao importar: %s - Falha ao exportar: %s - "Suas configurações contêm um ID de usuário SponsorBlock privado. + Restaurar as miniaturas antigas da barra de busca + As miniaturas vão aparecer acima da barra de busca + As miniaturas na barra de busca vão aparecer em tela cheia + + + Ativar SponsorBlock + SponsorBlock é um sistema de crowdsourcing para pular partes irritantes de vídeos do YouTube + Aparência + Mostrar botão votar + Botão de votar segmento será mostrado + Botão de votar não será mostrado + Usar layout quadrado + Botões e controles são quadrados + Botões e controles são arredondados + + Usar botão de pular compacto + Botão pular estilizado para largura mínima + Botão pular estilizado para a melhor aparência + Ocultar automaticamente o botão Pular + Ocultar botão pular após alguns segundos + O botão Pular é mostrado para todo o segmento + Duração do botão Pular + Por quanto tempo mostrar os botões de pular e pular para destaque antes de ocultar automaticamente + Mostrar aviso de desfazer pulo + O aviso é exibido quando um segmento é pulado automaticamente. Toque na notificação de aviso para desfazer o pulo + A notificação não é exibida + Duração da notificação de pular + Quanto tempo para exibir o toast de desfazer pular + 1 segundo + 2 segundos + 3 segundos + 4 segundos + 5 segundos + 6 segundos + 7 segundos + 8 segundos + 9 segundos + 10 segundos + Mostrar duração do vídeo sem segmentos + O comprimento do vídeo menos todos os segmentos é mostrado na barra de busca + Mostrar duração total do vídeo + Criando segmentos + Mostrar o botão Criar novo segmento + Botão criar segmento é mostrado + Botão criar segmento não é mostrado + Ajustar nova etapa de segmento + Número em milissegundos em que os botões de ajuste de tempo se movem ao criar segmentos + Valor deve ser um número positivo + Ver diretrizes + Diretrizes contêm regras e dicas para criar segmentos + Siga as diretrizes + Leia as diretrizes do SponsorBlock antes de criar segmentos + Já lido + Me mostre + Geral + Exibir uma notificação flutuante se a API não estiver disponível + Notificação flutuante é exibida se o SponsorBlock não está disponível + Notificação flutuante não é exibida se o SponsorBlock não está disponível + Ativar rastreamento de contagem de pulos + Vamos o placar do Patrocinador saber quanto tempo foi salvo. Uma mensagem é enviada para o placar cada vez que um segmento é pulado + Rastreamento de contagem de pulos não está ativado + Duração mínima de segmento + Segmentos menores que este valor (em segundos) não serão mostrados ou pulados + Duração de tempo inválida + Seu id privado de usuário + Isso deve ser mantido em particular. Isto é como uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, ele pode se passar por você + ID do usuário privado deve ter pelo menos 30 caracteres + Alterar URL da API + SponsorBlock usa esse endereço para fazer chamadas ao servidor + Redefinir URL da API + URL da API é inválido + Endereço da API alterada + Importar/Exportar Configurações + Copiar + Sua configuração JSON do SponsorBlock que pode ser importada/exportada para ReVanced e outras plataformas do SponsorBlock + Sua configuração JSON do SponsorBlock que pode ser importada/exportada para ReVanced ou em outras plataformas do SponsorBlock. Isso inclui sua identificação de usuário privada. Certifique-se de compartilhar isso sabiamente + Configurações importadas com sucesso + Falha ao importar: %s + Falha ao exportar: %s + "Suas configurações contêm um ID de usuário SponsorBlock privado. Seu ID de usuário é como uma senha e nunca deve ser compartilhado. " - Não exibir novamente - Alterar comportamento do segmento - Patrocinador - Promoção paga, indicações pagas e anúncios diretos. Não é para autopromoção ou anúncio gratuitos para causas/criadores/websites/produtos que eles gostam - Não-pago/Auto promoção - Semelhante a Patrocinador, exceto para promoção não paga ou automopromoção. Inclui seções sobre produtos, doações ou informações sobre com quem eles colaboraram - Lembrete de interação (inscrever-se) - Um breve lembrete para curtir, se inscrever ou segui-los no meio do conteúdo. Se for longo ou sobre algo específico, deve estar sob autopromoção - Destaque - A parte do vídeo que a maioria das pessoas está procurando - Introdução/Intervalo Animado - Um intervalo sem conteúdo real. Pode ser uma pausa, moldura estática ou uma animação repetida. Não inclui transições que contenham informações - Cartões / Créditos - Créditos ou quando os cartões finais do YouTube aparecem. Não é para conclusões com informações - Gancho / Saudações - Trailers narrados para o próximo vídeo, saudações e despedidas. Não inclui seções que adicionam conteúdo adicional - Prévia / Resumo - Coleção de clipes que mostram o que está chegando ou o que aconteceu no vídeo ou em outras séries, onde todas as informações se repetem em outro lugar - Divagação / Piadas - Cenas tangenciais ou piadas que não são necessárias para entender o conteúdo principal do vídeo. Não inclui seções que fornecem contexto ou detalhes de fundo - Música: Seção Sem Música - Somente para uso em vídeos de música. Seções de vídeos de música sem música, que já não estão cobertas por outra categoria - Pular - Destaque - Pular patrocinador - Pular promoção - Pular interação - Pular para destaque - Pular introdução - Pular intervalo - Pular intervalo - Pular encerramento - Pular introdução - Pular prévia - Pular prévia - Pular recapitulação - Pular tangente - Pular sem música - Pular segmento - Patrocinador pulado - Auto promoção pulada - Lembrete irritante pulado - Pulado para destaque - Introdução pulada - Intervalo pulada - Intervalo pulada - Encerramento pulado - Introdução pulada - Prévia pulada - Prévia pulada - Recapitulação pulado - Tangente pulada - Seção sem música pulado - Segmento não enviado pulado - Vários segmentos pulado - Pular automaticamente - Pular automaticamente uma vez - Mostrar um botão Pular - Mostrar na barra de busca - Desativar - Não foi possível votar no segmento: %s - SponsorBlock está temporariamente desligado - Não é possível enviar o segmento (status: %1$d %2$s) - Não é possível enviar o segmento. Taxa limitada (muitos do mesmo usuário ou IP) - Não é possível enviar o segmento: %s - "Não é possível enviar o segmento. + Não exibir novamente + Alterar comportamento do segmento + Patrocinador + Promoção paga, indicações pagas e anúncios diretos. Não é para autopromoção ou anúncio gratuitos para causas/criadores/websites/produtos que eles gostam + Não-pago/Auto promoção + Semelhante a Patrocinador, exceto para promoção não paga ou automopromoção. Inclui seções sobre produtos, doações ou informações sobre com quem eles colaboraram + Lembrete de interação (inscrever-se) + Um breve lembrete para curtir, se inscrever ou segui-los no meio do conteúdo. Se for longo ou sobre algo específico, deve estar sob autopromoção + Destaque + A parte do vídeo que a maioria das pessoas está procurando + Introdução/Intervalo Animado + Um intervalo sem conteúdo real. Pode ser uma pausa, moldura estática ou uma animação repetida. Não inclui transições que contenham informações + Cartões / Créditos + Créditos ou quando os cartões finais do YouTube aparecem. Não é para conclusões com informações + Gancho / Saudações + Trailers narrados para o próximo vídeo, saudações e despedidas. Não inclui seções que adicionam conteúdo adicional + Prévia / Resumo + Coleção de clipes que mostram o que está chegando ou o que aconteceu no vídeo ou em outras séries, onde todas as informações se repetem em outro lugar + Divagação / Piadas + Cenas tangenciais ou piadas que não são necessárias para entender o conteúdo principal do vídeo. Não inclui seções que fornecem contexto ou detalhes de fundo + Música: Seção Sem Música + Somente para uso em vídeos de música. Seções de vídeos de música sem música, que já não estão cobertas por outra categoria + Pular + Destaque + Pular patrocinador + Pular promoção + Pular interação + Pular para destaque + Pular introdução + Pular intervalo + Pular intervalo + Pular encerramento + Pular introdução + Pular prévia + Pular prévia + Pular recapitulação + Pular tangente + Pular sem música + Pular segmento + Patrocinador pulado + Auto promoção pulada + Lembrete irritante pulado + Pulado para destaque + Introdução pulada + Intervalo pulada + Intervalo pulada + Encerramento pulado + Introdução pulada + Prévia pulada + Prévia pulada + Recapitulação pulado + Tangente pulada + Seção sem música pulado + Segmento não enviado pulado + Vários segmentos pulado + Pular automaticamente + Pular automaticamente uma vez + Mostrar um botão Pular + Mostrar na barra de busca + Desativar + Não foi possível votar no segmento: %s + SponsorBlock está temporariamente desligado + Não é possível enviar o segmento (status: %1$d %2$s) + Não é possível enviar o segmento. Taxa limitada (muitos do mesmo usuário ou IP) + Não é possível enviar o segmento: %s + "Não é possível enviar o segmento. Já existe" - Segmento enviado com sucesso - - SponsorBlock temporariamente indisponível (API expirou) - SponsorBlock temporariamente indisponível (status %d) - SponsorBlock temporariamente indisponível - Não foi possível votar para segmento (API expirou) - Não é possível votar para o segmento (status: %1$d %2$s) - Não foi possível votar no segmento: %s - Aprovar - Voto negativo - Alterar categoria - Não há segmentos para votar - - %1$s para %2$s - Escolha a categoria do segmento - Categoria está desativada nas configurações. Ative a categoria para enviar. - Novo segmento SponsorBlock - Definir %s como início ou fim de um novo segmento? - Começar - Fim - Agora - Tempo em que o segmento começa - Tempo em que o segmento termina - Os tempos estão corretos? - "O segmento é de + Segmento enviado com sucesso + + SponsorBlock temporariamente indisponível (API expirou) + SponsorBlock temporariamente indisponível (status %d) + SponsorBlock temporariamente indisponível + Não foi possível votar para segmento (API expirou) + Não é possível votar para o segmento (status: %1$d %2$s) + Não foi possível votar no segmento: %s + Aprovar + Voto negativo + Alterar categoria + Não há segmentos para votar + + %1$s para %2$s + Escolha a categoria do segmento + Categoria está desativada nas configurações. Ative a categoria para enviar. + Novo segmento SponsorBlock + Definir %s como início ou fim de um novo segmento? + Começar + Fim + Agora + Tempo em que o segmento começa + Tempo em que o segmento termina + Os tempos estão corretos? + "O segmento é de %1$s para @@ -1278,45 +1277,45 @@ para (%3$s) Pronto para enviar?" - O início deve ser antes do fim - Marque dois locais na barra de tempo primeiro - Visualize o segmento e certifique-se de que ele pule sem problemas - Editar tempo do segmento manualmente - Deseja editar o tempo de início ou fim do segmento? - Tempo inserido inválido - Estatísticas - - As estatísticas não estão disponíveis temporariamente (API está inativa) - Carregando... - SponsorBlock está desativado - Seu nome de usuário: <b>%s</b> - Toque aqui para alterar seu nome de usuário - Não foi possível alterar o nome de usuário. Status: %1$d %2$s - Nome de usuário alterado com sucesso - Sua reputação é <b>%.2f</b> - Você criou <b>%s</b> segmentos - Toque aqui para ver seus segmentos - Placar do SponsorBlock - Você salvou pessoas de <b>%s</b> segmentos - Toque aqui para ver as estatísticas globais e os principais colaboradores - Isso é <b>%s</b> de suas vidas.<br>Toque aqui para ver a tabela de classificação - Você pulou <b>%s</b> segmentos - Isso é <b>%s</b> - Redefinir o contador de segmentos pulados? - %1$s horas %2$s minutos - %1$s minutos %2$s segundos - %s segundos - Opacidade: - Cor: - Sobre - Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver como baixar para outras plataformas - - - Layout fator de forma - Padrão - Telefone - Automóveis - "As alterações incluem: + O início deve ser antes do fim + Marque dois locais na barra de tempo primeiro + Visualize o segmento e certifique-se de que ele pule sem problemas + Editar tempo do segmento manualmente + Deseja editar o tempo de início ou fim do segmento? + Tempo inserido inválido + Estatísticas + + As estatísticas não estão disponíveis temporariamente (API está inativa) + Carregando... + SponsorBlock está desativado + Seu nome de usuário: <b>%s</b> + Toque aqui para alterar seu nome de usuário + Não foi possível alterar o nome de usuário. Status: %1$d %2$s + Nome de usuário alterado com sucesso + Sua reputação é <b>%.2f</b> + Você criou <b>%s</b> segmentos + Toque aqui para ver seus segmentos + Placar do SponsorBlock + Você salvou pessoas de <b>%s</b> segmentos + Toque aqui para ver as estatísticas globais e os principais colaboradores + Isso é <b>%s</b> de suas vidas.<br>Toque aqui para ver a tabela de classificação + Você pulou <b>%s</b> segmentos + Isso é <b>%s</b> + Redefinir o contador de segmentos pulados? + %1$s horas %2$s minutos + %1$s minutos %2$s segundos + %s segundos + Opacidade: + Cor: + Sobre + Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver como baixar para outras plataformas + + + Layout fator de forma + Padrão + Telefone + Automóveis + "As alterações incluem: Layout para tablet • Publicações da comunidade estão ocultas @@ -1324,311 +1323,309 @@ Layout para tablet Layout automotivo • Shorts são abertos no reprodutor normal • O feed é organizado por tópicos e canais" - - - Spoofing da versão do aplicativo - Versão spoofada - Versão não spoofada - "A versão do aplicativo será falsificada para uma versão mais antiga do YouTube. + + + Spoofing da versão do aplicativo + Versão spoofada + Versão não spoofada + "A versão do aplicativo será falsificada para uma versão mais antiga do YouTube. Isso mudará a aparência e os recursos do aplicativo, mas podem ocorrer efeitos colaterais desconhecidos. Se posteriormente desativado, é recomendável limpar os dados do aplicativo para evitar bugs na IU." - Versão de spoofing alvo - 20.13.41 - Restaurar barra de ações de vídeo não recolhida - 20.05.46 - Restaurar funcionalidade de transcrição - 19.35.36 - Restaurar ícones antigos do player dos Shorts - 19.01.34 - Restaurar ícones de navegação antigos - - - Alterar página inicial - Padrão - Todas as inscrições - Explorar canais - Cursos / Educação - Explorar - Moda e Beleza - Jogos - Histórico - Biblioteca - Videos curtidos - Ao Vivo - Filmes - Música - Notícias - Notificações - Procurar - Compras - Esportes - Inscrições - Em alta - Realidade virtual - Assistir mais tarde - Seus clipes - Sempre alterar a página inicial - "A página inicial é sempre alterada + Versão de spoofing alvo + 20.13.41 - Restaurar barra de ações de vídeo não recolhida + 20.05.46 - Restaurar funcionalidade de transcrição + 19.35.36 - Restaurar ícones antigos do player dos Shorts + 19.01.34 - Restaurar ícones de navegação antigos + + + Alterar página inicial + Padrão + Todas as inscrições + Explorar canais + Cursos / Educação + Explorar + Moda e Beleza + Jogos + Histórico + Biblioteca + Videos curtidos + Ao Vivo + Filmes + Música + Notícias + Notificações + Procurar + Compras + Esportes + Inscrições + Em alta + Realidade virtual + Assistir mais tarde + Seus clipes + Sempre alterar a página inicial + "A página inicial é sempre alterada Limitação: usar o botão Voltar na barra de ferramentas pode não funcionar" - A página inicial é alterada apenas na inicialização do aplicativo - - - Desativar continuar a reproduzir Shorts - Shorts não irá continuar reproduzindo ao iniciar o aplicativo - Shorts irá continuar reproduzindo ao iniciar o aplicativo - - - Abrir Shorts com - Reprodutor do Shorts - Player regular - Tela cheia do player regular - - - Reprodução automática nos Shorts - Os Shorts vão ser reproduzidos automaticamente - Os Shorts vão repetir - Reprodução automática nos Shorts em segundo plano - A reprodução em segundo plano dos Shorts vai ser reproduzidas automaticamente - A reprodução em segundo plano dos Shorts vai ser reproduzidas automaticamente - - - Minireprodutor - Alterar o estilo do player minimizado no app - Tipo de miniplayer - Desativado - Padrão - Mínimo - Moderno 1 - Moderno 2 - Moderno 3 - Moderno 4 - Desativar cantos arredondados - Os cantos são quadrados - Os cantos são arredondados - Ativar toque duplo e pinçar para redimensionar - "A ação de toque duplo e beliscar para redimensionar está habilitada + A página inicial é alterada apenas na inicialização do aplicativo + + + Desativar continuar a reproduzir Shorts + Shorts não irá continuar reproduzindo ao iniciar o aplicativo + Shorts irá continuar reproduzindo ao iniciar o aplicativo + + + Abrir Shorts com + Reprodutor do Shorts + Player regular + Tela cheia do player regular + + + Reprodução automática nos Shorts + Os Shorts vão ser reproduzidos automaticamente + Os Shorts vão repetir + Reprodução automática nos Shorts em segundo plano + A reprodução em segundo plano dos Shorts vai ser reproduzidas automaticamente + A reprodução em segundo plano dos Shorts vai ser reproduzidas automaticamente + + + Minireprodutor + Alterar o estilo do player minimizado no app + Tipo de miniplayer + Desativado + Padrão + Mínimo + Moderno 1 + Moderno 2 + Moderno 3 + Moderno 4 + Desativar cantos arredondados + Os cantos são quadrados + Os cantos são arredondados + Ativar toque duplo e pinçar para redimensionar + "A ação de toque duplo e beliscar para redimensionar está habilitada • Toque duas vezes para aumentar o tamanho do miniplayer • Toque duas vezes novamente para restaurar o tamanho original" - Toque duplo e pinçar para redimensionar está desativado - Desativar arrastar e soltar - Arrastar e soltar está desativado - "Arrastar e soltar está habilitado + Toque duplo e pinçar para redimensionar está desativado + Desativar arrastar e soltar + Arrastar e soltar está desativado + "Arrastar e soltar está habilitado O miniplayer pode ser arrastado para qualquer canto da tela" - Desativar gesto de arrastar horizontal - Gesto de arrastar horizontal desativado - "O gesto de arrastar horizontalmente está habilitado + Desativar gesto de arrastar horizontal + Gesto de arrastar horizontal desativado + "O gesto de arrastar horizontalmente está habilitado O miniplayer pode ser arrastado para fora da tela para a esquerda ou direita" - Ocultar botões de sobreposição - Botões de sobreposição estão ocultos - Botões de sobreposição são mostrados - Ocultar subtextos - Subtextos estão ocultos - Subtextos são exibidos - Ocultar botões pular para frente e para trás - Pular para frente e para trás estão escondidos - Pular para frente e para trás são mostrados - Tamanho inicial - Tamanho inicial na tela, em pixels - O tamanho do pixel deve estar entre %1$s e %2$s - Opacidade de sobreposição - Valor de opacidade entre 0-100, onde 0 é transparente - Opacidade da sobreposição de miniplayer deve estar entre 0-100 - - - Ativar tela de carregamento em gradiente - Tela de carregamento terá um fundo em gradiente - Tela de carregamento terá um fundo sólido - Estilo da tela inicial - Cor - Preto e branco - Ativar cor personalizada da barra de busca - Cor personalizada da barra de busca é mostrada - Cor original da barra de busca é mostrada - Cor personalizada para a barra de progresso - A cor da barra de progresso - Cor de destaque personalizada para a barra de progresso - A cor de destaque da barra de progresso - Valor de cor da barra de busca inválido - - - - - Logotipo do cabeçalho - Padrão - - ReVanced mínimo - Personalizado - - - Ignorar restrições de região de imagem - Usando imagem host yt4.ggpht.com - "Usando o host de imagem original + Ocultar botões de sobreposição + Botões de sobreposição estão ocultos + Botões de sobreposição são mostrados + Ocultar subtextos + Subtextos estão ocultos + Subtextos são exibidos + Ocultar botões pular para frente e para trás + Pular para frente e para trás estão escondidos + Pular para frente e para trás são mostrados + Tamanho inicial + Tamanho inicial na tela, em pixels + O tamanho do pixel deve estar entre %1$s e %2$s + Opacidade de sobreposição + Valor de opacidade entre 0-100, onde 0 é transparente + Opacidade da sobreposição de miniplayer deve estar entre 0-100 + + + Ativar tela de carregamento em gradiente + Tela de carregamento terá um fundo em gradiente + Tela de carregamento terá um fundo sólido + Estilo da tela inicial + Cor + Preto e branco + Ativar cor personalizada da barra de busca + Cor personalizada da barra de busca é mostrada + Cor original da barra de busca é mostrada + Cor personalizada para a barra de progresso + A cor da barra de progresso + Cor de destaque personalizada para a barra de progresso + A cor de destaque da barra de progresso + Valor de cor da barra de busca inválido + + + + Logotipo do cabeçalho + Padrão + + ReVanced mínimo + Personalizado + + + Ignorar restrições de região de imagem + Usando imagem host yt4.ggpht.com + "Usando o host de imagem original Habilitar isso pode corrigir imagens ausentes que estão bloqueadas em algumas regiões" - - - - Início - - Guia Inscrições - - Você - Listas de reprodução e recomendações do player - Resultado da busca - Miniaturas originais - DeArrow & Miniaturas originais - DeArrow & captura estática - Captura estática - "DeArrow fornece miniaturas de crowdsourcing para vídeos do YouTube. Essas miniaturas costumam ser mais relevantes do que as fornecidas pelo YouTube + + + + Início + + Guia Inscrições + + Você + Listas de reprodução e recomendações do player + Resultado da busca + Miniaturas originais + DeArrow & Miniaturas originais + DeArrow & captura estática + Captura estática + "DeArrow fornece miniaturas de crowdsourcing para vídeos do YouTube. Essas miniaturas costumam ser mais relevantes do que as fornecidas pelo YouTube Se ativado, os URLs dos vídeos serão enviados ao servidor API e nenhum outro dado será enviado. Se um vídeo não tiver miniaturas DeArrow, as originais ou capturas fixas serão exibidas Toque aqui para saber mais sobre DeArrow" - Exibir uma notificação flutuante se a API não estiver disponível - Notificação flutuante será exibida se DeArrow não estiver disponível - Notificação flutuante não será exibida se DeArrow não estiver disponível - Endpoint da API DeArrow - Cache endpoint da URL das miniaturas DeArrow - Captura estática - Captura estática são tiradas do começo/meio/fim de cada vídeo. Estas imagens são construídas no YouTube e nenhuma API externa é usada - Usar captura estática rápida - Usando a qualidade média em capturada estática. As miniaturas carregam mais rapidamente, mas transmissões ao vivo, não lançados ou vídeos muito antigos podem exibir miniaturas em branco - Usando qualidade alta em captura estática - Tempo do vídeo para a captura estática - Início do vídeo - Meio do vídeo - Final do vídeo - - DeArrow não está disponível temporariamente (código de status: %s) - DeArrow não está disponível temporariamente - - - Exibir avisos do ReVanced - Anúncios na inicialização são mostrados - Anúncios na inicialização não são mostrados - Mostrar avisos na inicialização - Falha ao conectar ao provedor de avisos - Dispensar - - - Ativar vídeo em loop - O vídeo será repetido - O vídeo não será repetido - - - Mostrar botão de vídeo em loop - Botão é exibido - Botão não é exibido - Vídeo em loop está ativado - Vídeo em loop está desativado - - - - - Spoofing de dimensões do dispositivo - "Dimensões do dispositivo falsificadas + Exibir uma notificação flutuante se a API não estiver disponível + Notificação flutuante será exibida se DeArrow não estiver disponível + Notificação flutuante não será exibida se DeArrow não estiver disponível + Endpoint da API DeArrow + Cache endpoint da URL das miniaturas DeArrow + Captura estática + Captura estática são tiradas do começo/meio/fim de cada vídeo. Estas imagens são construídas no YouTube e nenhuma API externa é usada + Usar captura estática rápida + Usando a qualidade média em capturada estática. As miniaturas carregam mais rapidamente, mas transmissões ao vivo, não lançados ou vídeos muito antigos podem exibir miniaturas em branco + Usando qualidade alta em captura estática + Tempo do vídeo para a captura estática + Início do vídeo + Meio do vídeo + Final do vídeo + + DeArrow não está disponível temporariamente (código de status: %s) + DeArrow não está disponível temporariamente + + + Exibir avisos do ReVanced + Anúncios na inicialização são mostrados + Anúncios na inicialização não são mostrados + Mostrar avisos na inicialização + Falha ao conectar ao provedor de avisos + Dispensar + + + Ativar vídeo em loop + O vídeo será repetido + O vídeo não será repetido + + + Mostrar botão de vídeo em loop + Botão é exibido + Botão não é exibido + Vídeo em loop está ativado + Vídeo em loop está desativado + + + + Spoofing de dimensões do dispositivo + "Dimensões do dispositivo falsificadas Qualidades de vídeo mais altas podem ser desbloqueadas, mas você pode ter problemas de reprodução de vídeo, pior duração da bateria e efeitos colaterais desconhecidos" - "Dimensões do dispositivo não falsificadas + "Dimensões do dispositivo não falsificadas Habilitar isso pode desbloquear qualidades de vídeo mais altas" - Ativar isto pode causar travamentos na reprodução de vídeo, maior gasto de bateria e efeitos colaterais desconhecidos. - - - Feedback tátil - Alterar feedback tátil - Desativar haptics de capítulos - Haptics de capítulos desativado - Haptics de capítulos ativado - Desativar haptics de busca precisa - O feedback tátil de busca precisa está desativado - Haptics de busca precisa ativado - Desativar feedback tátil de desfazer busca - O feedback tátil de desfazer busca está desativado - O feedback tátil de desfazer busca está ativado - Desativar zoom tátil - O zoom tátil está desativado - O zoom tátil está ativado - - - Se você alterou recentemente os detalhes de login da sua conta, desinstale e reinstale o MicroG. - - - Ignorar redirecionamentos de URL - Redirecionamentos de URL estão ignorados - Redirecionamentos de URL não estão ignorados - - - Abrir links no navegador - Abrindo links no navegador externo - Abrindo links no navegador interno do app - - - - Automático - Lembrar mudanças na qualidade do vídeo - Mudança na qualidade se aplicam a todos os vídeos - Mudança na qualidade só se aplicam ao vídeo atual - Mostrar aviso em mudanças na qualidade do vídeo - Um aviso é mostrado quando a qualidade de vídeo padrão é alterada - Um aviso não é mostrado quando a qualidade de vídeo padrão é alterada - Qualidade padrão do vídeo no Wi-Fi - Qualidade padrão do vídeo nos dados móveis - Lembrar alterações na qualidade dos Shorts - As alterações de qualidade se aplicam a todos os Shorts - As alterações de qualidade aplicam-se apenas ao Short atual - Qualidade padrão dos Shorts na rede Wi-Fi - Qualidade padrão dos Shorts na rede móvel - dados móveis - Wi-Fi - Qualidade padrão %1$s alterada para: %2$s - Qualidade dos Shorts %1$s alterada para: %2$s - - - Mostrar botão de velocidade - Botão de diálogo de velocidade está visível. Toque e segure para redefinir a velocidade de reprodução para o padrão - Botão de diálogo de velocidade não está visível - - - Mostrar botão de qualidade de vídeo - Botão de qualidade de vídeo está visível. Toque e segure para redefinir a qualidade para o padrão - Botão de qualidade de vídeo não está visível - - - Menu de velocidade de reprodução personalizado - O menu de velocidade personalizado é mostrado - O menu de velocidade personalizado não é mostrado - Restaurar menu antigo de velocidade de reprodução - Menu antigo de velocidade de reprodução é exibido - Menu moderno de velocidade de reprodução é exibido - Velocidade de reprodução personalizada - Adicionar ou mudar as velocidades de reprodução personalizadas - Velocidades personalizadas devem ser menores que %s - Velocidades de reprodução personalizadas inválidas - Automático - Velocidade personalizada de tocar e segurar - Velocidade de reprodução entre 0-8 - - - Lembrar mudança na velocidade de reprodução - Mudanças de velocidade de reprodução se aplicam a todos os vídeos - Mudanças na velocidade de reprodução só se aplicam ao vídeo atual - Mostrar aviso em mudanças na velocidade de reprodução - Um aviso é mostrado quando a velocidade de reprodução padrão é alterada - Um Toast não é exibido quando a velocidade de reprodução padrão é alterada - Velocidade padrão de reprodução - Velocidade padrão alterada para: %s - - - Desativar vídeo HDR - O vídeo HDR está desabilitado - O vídeo HDR está habilitado - Forçar AVC (H.264) - O codec de vídeo é forçado para AVC (H.264) - O codec de vídeo é determinado automaticamente - "Benefícios: + Ativar isto pode causar travamentos na reprodução de vídeo, maior gasto de bateria e efeitos colaterais desconhecidos. + + + Feedback tátil + Alterar feedback tátil + Desativar haptics de capítulos + Haptics de capítulos desativado + Haptics de capítulos ativado + Desativar haptics de busca precisa + O feedback tátil de busca precisa está desativado + Haptics de busca precisa ativado + Desativar feedback tátil de desfazer busca + O feedback tátil de desfazer busca está desativado + O feedback tátil de desfazer busca está ativado + Desativar zoom tátil + O zoom tátil está desativado + O zoom tátil está ativado + + + Se você alterou recentemente os detalhes de login da sua conta, desinstale e reinstale o MicroG. + + + Ignorar redirecionamentos de URL + Redirecionamentos de URL estão ignorados + Redirecionamentos de URL não estão ignorados + + + Abrir links no navegador + Abrindo links no navegador externo + Abrindo links no navegador interno do app + + + + Automático + Lembrar mudanças na qualidade do vídeo + Mudança na qualidade se aplicam a todos os vídeos + Mudança na qualidade só se aplicam ao vídeo atual + Mostrar aviso em mudanças na qualidade do vídeo + Um aviso é mostrado quando a qualidade de vídeo padrão é alterada + Um aviso não é mostrado quando a qualidade de vídeo padrão é alterada + Qualidade padrão do vídeo no Wi-Fi + Qualidade padrão do vídeo nos dados móveis + Lembrar alterações na qualidade dos Shorts + As alterações de qualidade se aplicam a todos os Shorts + As alterações de qualidade aplicam-se apenas ao Short atual + Qualidade padrão dos Shorts na rede Wi-Fi + Qualidade padrão dos Shorts na rede móvel + dados móveis + Wi-Fi + Qualidade padrão %1$s alterada para: %2$s + Qualidade dos Shorts %1$s alterada para: %2$s + + + Mostrar botão de velocidade + Botão de diálogo de velocidade está visível. Toque e segure para redefinir a velocidade de reprodução para o padrão + Botão de diálogo de velocidade não está visível + + + Mostrar botão de qualidade de vídeo + Botão de qualidade de vídeo está visível. Toque e segure para redefinir a qualidade para o padrão + Botão de qualidade de vídeo não está visível + + + Menu de velocidade de reprodução personalizado + O menu de velocidade personalizado é mostrado + O menu de velocidade personalizado não é mostrado + Restaurar menu antigo de velocidade de reprodução + Menu antigo de velocidade de reprodução é exibido + Menu moderno de velocidade de reprodução é exibido + Velocidade de reprodução personalizada + Adicionar ou mudar as velocidades de reprodução personalizadas + Velocidades personalizadas devem ser menores que %s + Velocidades de reprodução personalizadas inválidas + Automático + Velocidade personalizada de tocar e segurar + Velocidade de reprodução entre 0-8 + + + Lembrar mudança na velocidade de reprodução + Mudanças de velocidade de reprodução se aplicam a todos os vídeos + Mudanças na velocidade de reprodução só se aplicam ao vídeo atual + Mostrar aviso em mudanças na velocidade de reprodução + Um aviso é mostrado quando a velocidade de reprodução padrão é alterada + Um Toast não é exibido quando a velocidade de reprodução padrão é alterada + Velocidade padrão de reprodução + Velocidade padrão alterada para: %s + + + Desativar vídeo HDR + O vídeo HDR está desabilitado + O vídeo HDR está habilitado + Forçar AVC (H.264) + O codec de vídeo é forçado para AVC (H.264) + O codec de vídeo é determinado automaticamente + "Benefícios: • Pode melhorar a duração da bateria • Pode restaurar resoluções de vídeo ausentes em dispositivos mais antigos @@ -1637,179 +1634,178 @@ Limitações: • A reprodução de vídeo usará mais dados da internet do que VP9 ou AV1 • Vídeos HDR não usarão AVC • Alguns dispositivos não conseguem forçar o AVC" - - - Mostrar menu de qualidade de vídeo avançado - O menu de qualidade de vídeo avançado é exibido - O menu de qualidade de vídeo avançado não é exibido - - - Ativar gesto na barra de busca - Gesto na barra de busca está ativado - Gesto na barra de busca está desativado - - - Permitir Android VR AV1 - "O codec de vídeo é AVC (H.264), VP9 ou AV1 + + + Mostrar menu de qualidade de vídeo avançado + O menu de qualidade de vídeo avançado é exibido + O menu de qualidade de vídeo avançado não é exibido + + + Ativar gesto na barra de busca + Gesto na barra de busca está ativado + Gesto na barra de busca está desativado + + + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 A reprodução pode engasgar ou perder quadros" - O codec de vídeo é AVC (H.264) ou VP9 - "Ativar esta configuração pode usar decodificação de software AV1. + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar decodificação de software AV1. A reprodução de vídeo com AV1 pode gaguejar ou perder quadros." - Efeitos colaterais da falsificação - • Cliente experimental e pode parar de funcionar a qualquer momento - • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões - • O menu da faixa de áudio está faltando - • Sem codec de vídeo AV1 - • Volume estável não está disponível - • Vídeos infantis podem não ser reproduzidos quando estiver desconectado ou no modo de navegação anônima - - • Forçar áudio original não está disponível - Mostrar em Estatísticas para nerds - O tipo de cliente é mostrado em Estatísticas para nerds - O cliente está oculto em Estatísticas para nerds - - - - - - - Sobre - Anúncios - Geral - Reprodutor - Diversos - - - Ocultar anúncios em vídeo - Anúncios em vídeo estão ocultos - Anúncios em vídeo são exibidos - - - Ativar repetição permanente - Repetição permanente está ativada - Repetição permanente está desativada - - - Ocultar botão de transmissão - Botão de transmissão está oculto - Botão de transmissão está visível - Ocultar botão de histórico - Botão de histórico está oculto - Botão de histórico está visível - Ocultar botão de notificação - Botão de notificação está oculto - Botão de notificação está visível - Ocultar botão de pesquisa - Botão de pesquisa está oculto - Botão de pesquisa está visível - - - Ocultar barra de categoria - Barra de categoria está oculta - Barra de categoria é exibida - - - Alterar cor do minirreprodutor - A cor do minirreprodutor corresponde à do reprodutor em tela cheia - O minirreprodutor usa a cor padrão - - - Barra de navegação - Ocultar ou alterar botões da barra de navegação - - Ocultar Início - Botão Início oculto - Botão Início visível - - Ocultar Amostras - Botão Amostras oculto - Botão Amostras visível - - Ocultar Explorar - Botão Explorar oculto - Botão Explorar visível - - Ocultar Biblioteca - Botão Biblioteca oculto - Botão Biblioteca visível - - Ocultar Atualizar - Botão Fazer upgrade oculto - Botão Fazer upgrade visível - Ocultar barra de navegação - Barra de navegação oculta - Barra de navegação visível - Ocultar rótulos dos botões de navegação - Rótulos ocultos - Rótulos visíveis - - - Ocultar o rótulo \'Obter Music Premium\' - Rótulo está oculto - Rótulo é exibido - - - Ocultar botão de atualização - Botão está oculto - Botão é exibido - - - - - Bloquear anúncios de áudio - Anúncios de áudio estão bloqueados - Anúncios de áudio não estão bloqueados - - - %s indisponível, os anúncios podem ser exibidos. Tente alterar o serviço de bloqueio de anúncios nas configurações. - %s retornou um erro, os anúncios podem ser exibidos. Tente alterar o serviço de bloqueio de anúncios nas configurações. - Bloquear anúncios de vídeo incorporados - Desativado - Proxy Luminous - Proxy PurpleAdBlock - - - Bloquear anúncios em vídeo - Anúncios de vídeo estão bloqueados - Anúncios de vídeo não estão bloqueados - - - Mensagem excluída - Mostrar mensagens apagadas - Não mostrar mensagens apagadas - Ocultar mensagens apagadas atrás de um spoiler - Mostrar mensagens apagadas como texto riscado - - - Resgatar Pontos do Canal automaticamente - Pontos do Canal estão sendo resgatados automaticamente - Pontos do Canal não estão sendo resgatados automaticamente - - - - Ativar modo de depuração da Twitch - Modo de depuração da Twitch ativado (não recomendado) - Modo de depuração da Twitch está desativado - - - Configurações do ReVanced - Sobre - Sobre ReVanced - Bloqueio de anúncios - Configurações de bloqueio de anúncios - Bate-papo - Configurações de bate-papo - Diversos - Outras configurações - Configurações gerais - Outras configurações - Anúncios do lado do cliente - Anúncios em modo seguro do lado do servidor - Registro de depuração - Registro de depuração está ativado - Registro de depuração está desativado - - + Efeitos colaterais da falsificação + • Cliente experimental e pode parar de funcionar a qualquer momento + • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões + • O menu da faixa de áudio está faltando + • Sem codec de vídeo AV1 + • Volume estável não está disponível + • Vídeos infantis podem não ser reproduzidos quando estiver desconectado ou no modo de navegação anônima + + • Forçar áudio original não está disponível + Mostrar em Estatísticas para nerds + O tipo de cliente é mostrado em Estatísticas para nerds + O cliente está oculto em Estatísticas para nerds + + + + + + Sobre + Anúncios + Geral + Reprodutor + Diversos + + + Ocultar anúncios em vídeo + Anúncios em vídeo estão ocultos + Anúncios em vídeo são exibidos + + + Ativar repetição permanente + Repetição permanente está ativada + Repetição permanente está desativada + + + Ocultar botão de transmissão + Botão de transmissão está oculto + Botão de transmissão está visível + Ocultar botão de histórico + Botão de histórico está oculto + Botão de histórico está visível + Ocultar botão de notificação + Botão de notificação está oculto + Botão de notificação está visível + Ocultar botão de pesquisa + Botão de pesquisa está oculto + Botão de pesquisa está visível + + + Ocultar barra de categoria + Barra de categoria está oculta + Barra de categoria é exibida + + + Alterar cor do minirreprodutor + A cor do minirreprodutor corresponde à do reprodutor em tela cheia + O minirreprodutor usa a cor padrão + + + Barra de navegação + Ocultar ou alterar botões da barra de navegação + + Ocultar Início + Botão Início oculto + Botão Início visível + + Ocultar Amostras + Botão Amostras oculto + Botão Amostras visível + + Ocultar Explorar + Botão Explorar oculto + Botão Explorar visível + + Ocultar Biblioteca + Botão Biblioteca oculto + Botão Biblioteca visível + + Ocultar Atualizar + Botão Fazer upgrade oculto + Botão Fazer upgrade visível + Ocultar barra de navegação + Barra de navegação oculta + Barra de navegação visível + Ocultar rótulos dos botões de navegação + Rótulos ocultos + Rótulos visíveis + + + Ocultar o rótulo \'Obter Music Premium\' + Rótulo está oculto + Rótulo é exibido + + + Ocultar botão de atualização + Botão está oculto + Botão é exibido + + + + + Bloquear anúncios de áudio + Anúncios de áudio estão bloqueados + Anúncios de áudio não estão bloqueados + + + %s indisponível, os anúncios podem ser exibidos. Tente alterar o serviço de bloqueio de anúncios nas configurações. + %s retornou um erro, os anúncios podem ser exibidos. Tente alterar o serviço de bloqueio de anúncios nas configurações. + Bloquear anúncios de vídeo incorporados + Desativado + Proxy Luminous + Proxy PurpleAdBlock + + + Bloquear anúncios em vídeo + Anúncios de vídeo estão bloqueados + Anúncios de vídeo não estão bloqueados + + + Mensagem excluída + Mostrar mensagens apagadas + Não mostrar mensagens apagadas + Ocultar mensagens apagadas atrás de um spoiler + Mostrar mensagens apagadas como texto riscado + + + Resgatar Pontos do Canal automaticamente + Pontos do Canal estão sendo resgatados automaticamente + Pontos do Canal não estão sendo resgatados automaticamente + + + + Ativar modo de depuração da Twitch + Modo de depuração da Twitch ativado (não recomendado) + Modo de depuração da Twitch está desativado + + + Configurações do ReVanced + Sobre + Sobre ReVanced + Bloqueio de anúncios + Configurações de bloqueio de anúncios + Bate-papo + Configurações de bate-papo + Diversos + Outras configurações + Configurações gerais + Outras configurações + Anúncios do lado do cliente + Anúncios em modo seguro do lado do servidor + Registro de depuração + Registro de depuração está ativado + Registro de depuração está desativado + + diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index 0b567dcaf8..5edeb74da0 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -17,1273 +17,1272 @@ "First 'item' text Second \"item\" text" ---> - - - - Nome da aplicação - - Personalizado - Ícone da aplicação - Original - ReVanced - - ReVanced mínimo - ReVanced dimensionado - - Personalizado - - - Falha na verificação - Abrir site oficial - Ignorar - <h5>Esta aplicação não parece ter sido modificada por ti.</h5><br>Esta aplicação pode não funcionar corretamente, <b>pode ser maliciosa ou até perigosa de usar</b>.<br><br>Estas verificações implicam que esta aplicação é pré-modificada ou obtida de outros:<br><br><small>%1$s</small><br>É extremamente recomendado <b>desinstalar esta aplicação e modificá-la tu mesmo</b> para garantir que estás a usar uma aplicação segura e validada.<p><br>Se ignorado, este aviso apenas será mostrado duas vezes. - Modificado num dispositivo diferente - Não instalado pelo ReVanced Manager - Modificado há mais de 10 minutos atrás - Modificada há %s dias atrás - A data da compilação da APK está corrompida - - - Aviso do ReVanced - O teu histórico de visualização não está a ser guardado.<br><br>Isto é mais provávelmente causado por um bloqueador de anúncios DNS ou proxy de rede.<br><br>Para reparar isto, adiciona às exceções <b>s.youtube.com</b> ou desativa todos os bloqueadores DNS e proxies. - Não mostrar novamente - - - Configurações - ReVanced - Tem certeza de que deseja prosseguir? - Salvar - Repor - Redefinir cor - Cor inválida - Reinicialização necessária - Reinicie o aplicativo para que esta alteração entre em vigor. - Reiniciar - Importar - Copiar - As definições do ReVanced foram redefinidas para a predefinição - Configurações importadas: %d - A importação falhou: %s - Configurações de pesquisa - Nenhum resultado encontrado para \"%s\" - Tente outra palavra-chave - Pesquisas recentes - Remover do histórico de pesquisa? - Limpar histórico de pesquisa - Tem certeza de que deseja limpar todo o histórico de pesquisa? - Dicas de Pesquisa - "• Toque em um caminho para navegar até ele +--> + + + Nome da aplicação + + Personalizado + Ícone da aplicação + Original + ReVanced + + ReVanced mínimo + ReVanced dimensionado + + Personalizado + + + Falha na verificação + Abrir site oficial + Ignorar + <h5>Esta aplicação não parece ter sido modificada por ti.</h5><br>Esta aplicação pode não funcionar corretamente, <b>pode ser maliciosa ou até perigosa de usar</b>.<br><br>Estas verificações implicam que esta aplicação é pré-modificada ou obtida de outros:<br><br><small>%1$s</small><br>É extremamente recomendado <b>desinstalar esta aplicação e modificá-la tu mesmo</b> para garantir que estás a usar uma aplicação segura e validada.<p><br>Se ignorado, este aviso apenas será mostrado duas vezes. + Modificado num dispositivo diferente + Não instalado pelo ReVanced Manager + Modificado há mais de 10 minutos atrás + Modificada há %s dias atrás + A data da compilação da APK está corrompida + + + Aviso do ReVanced + O teu histórico de visualização não está a ser guardado.<br><br>Isto é mais provávelmente causado por um bloqueador de anúncios DNS ou proxy de rede.<br><br>Para reparar isto, adiciona às exceções <b>s.youtube.com</b> ou desativa todos os bloqueadores DNS e proxies. + Não mostrar novamente + + + Configurações + ReVanced + Tem certeza de que deseja prosseguir? + Salvar + Repor + Redefinir cor + Cor inválida + Reinicialização necessária + Reinicie o aplicativo para que esta alteração entre em vigor. + Reiniciar + Importar + Copiar + As definições do ReVanced foram redefinidas para a predefinição + Configurações importadas: %d + A importação falhou: %s + Configurações de pesquisa + Nenhum resultado encontrado para \"%s\" + Tente outra palavra-chave + Pesquisas recentes + Remover do histórico de pesquisa? + Limpar histórico de pesquisa + Tem certeza de que deseja limpar todo o histórico de pesquisa? + Dicas de Pesquisa + "• Toque em um caminho para navegar até ele • Pressione e segure uma configuração para navegar até ela • Pressione Enter para salvar uma consulta de pesquisa no histórico • A pesquisa ignora maiúsculas/minúsculas e pontuação • As configurações pai aparecem acima das configurações filho desativadas" - O histórico de pesquisa está vazio - Para salvar o histórico de pesquisa, digite uma consulta de pesquisa e pressione Enter - Mostrar histórico de pesquisa de configurações - O histórico de pesquisa de configurações é exibido - O histórico de pesquisa de configurações não é exibido - Mostrar ícones de configuração do ReVanced - Os ícones de configuração são mostrados - Os ícones de configuração não são mostrados - Idioma do ReVanced - "As traduções para alguns idiomas podem estar ausentes ou incompletas. + O histórico de pesquisa está vazio + Para salvar o histórico de pesquisa, digite uma consulta de pesquisa e pressione Enter + Mostrar histórico de pesquisa de configurações + O histórico de pesquisa de configurações é exibido + O histórico de pesquisa de configurações não é exibido + Mostrar ícones de configuração do ReVanced + Os ícones de configuração são mostrados + Os ícones de configuração não são mostrados + Idioma do ReVanced + "As traduções para alguns idiomas podem estar ausentes ou incompletas. Para traduzir novos idiomas ou melhorar as traduções existentes, visite translate.revanced.app" - Idioma da aplicação - Importar / Exportar - Importar / Exportar as configurações do ReVanced - - Está a utilizar a versão ReVanced Patches <i>%s</i> - Observação - Esta versão está em pré-lançamento e poderá ter problemas inesperados - Links oficiais - + Está a utilizar a versão ReVanced Patches <i>%s</i> + Observação + Esta versão está em pré-lançamento e poderá ter problemas inesperados + Links oficiais + - - - Configurações do GmsCore - Configurações para GmsCore - - MicroG GmsCore não está instalado. Instala-o. - Ação necessária - "O MicroG GmsCore não tem permissão para ser executado em segundo plano. + + + Configurações do GmsCore + Configurações para GmsCore + + MicroG GmsCore não está instalado. Instala-o. + Ação necessária + "O MicroG GmsCore não tem permissão para ser executado em segundo plano. Siga o guia “Não feche a minha aplicação” do seu telemóvel e aplique as instruções à instalação do MicroG. Isto é necessário para que a aplicação funcione." - Abrir site - "As otimizações de bateria do MicroG GmsCore devem ser desativadas para evitar problemas. + Abrir site + "As otimizações de bateria do MicroG GmsCore devem ser desativadas para evitar problemas. A desativação das otimizações de bateria para o MicroG não afetará negativamente o uso da bateria. Toque no botão continuar e permita as alterações de otimização." - Continuar - - - Falsificar fluxos de vídeo - Falsificar os fluxos de vídeo do cliente para evitar problemas de reprodução - Falsificar fluxos de vídeo - Falsificar os fluxos de vídeo do cliente para evitar problemas de reprodução - Fluxos de vídeo falsos - "Streams de vídeo falsificados + Continuar + + + Falsificar fluxos de vídeo + Falsificar os fluxos de vídeo do cliente para evitar problemas de reprodução + Falsificar fluxos de vídeo + Falsificar os fluxos de vídeo do cliente para evitar problemas de reprodução + Fluxos de vídeo falsos + "Streams de vídeo falsificados Se você for um usuário do YouTube Premium, esta configuração pode não ser necessária" - "Os fluxos de vídeo não são falsificados + "Os fluxos de vídeo não são falsificados A reprodução pode não funcionar" - Desativar esta configuração pode causar problemas de reprodução. - Cliente predefinido - - - Forçar idioma original do áudio - Usando o idioma de áudio original - Usando o áudio predefinido - - Para usar este recurso, altere \'Falsificar streams de vídeo\' para qualquer cliente, exceto o Android Studio - - - Depuração - Ativar ou desativar opções de depuração - Registo da depuração - Os registos da depuração estão ativados - Os registos da depuração estão desativados - Pilha de registos - Os registos da depuração incluem stack trace - Os registos da depuração não incluem stack trace - Mostrar toast com erro de ReVanced - O toast é exibido se ocorrer um erro - O toast não é exibido se ocorrer um erro - "A desativação dos erros toasts oculta todas as notificações de erro do ReVanced. + Desativar esta configuração pode causar problemas de reprodução. + Cliente predefinido + + + Forçar idioma original do áudio + Usando o idioma de áudio original + Usando o áudio predefinido + + Para usar este recurso, altere \'Falsificar streams de vídeo\' para qualquer cliente, exceto o Android Studio + + + Depuração + Ativar ou desativar opções de depuração + Registo da depuração + Os registos da depuração estão ativados + Os registos da depuração estão desativados + Pilha de registos + Os registos da depuração incluem stack trace + Os registos da depuração não incluem stack trace + Mostrar toast com erro de ReVanced + O toast é exibido se ocorrer um erro + O toast não é exibido se ocorrer um erro + "A desativação dos erros toasts oculta todas as notificações de erro do ReVanced. Não será notificado de quaisquer eventos inesperados." - Exportar registos de depuração - Copia os registos de depuração do ReVanced para a área de transferência - O registo de depuração está desativado - Nenhum registo encontrado - Registos copiados - Falha ao exportar registros: %s - Limpar registos de depuração - Limpa todos os registos de depuração do ReVanced armazenados - Registos limpos - Manager de sinalizadores de recurso - Gerenciar sinalizadores de recurso booleanos - Sinalizadores ativos (%d) - Sinalizadores bloqueados (%d) - Pesquisar sinalizadores... - Sinalizadores salvos - Sinalizadores redefinidos - Sinalizadores copiados para a área de transferência - Registo do buffer de protocolo - Registos de depuração incluem buffer de sondagem - Os registos da depuração não incluem buffer de perfil - "Ativar esta definição irá registar dados de layout adicionais, incluindo o texto no ecrã para alguns componentes da IU. + Exportar registos de depuração + Copia os registos de depuração do ReVanced para a área de transferência + O registo de depuração está desativado + Nenhum registo encontrado + Registos copiados + Falha ao exportar registros: %s + Limpar registos de depuração + Limpa todos os registos de depuração do ReVanced armazenados + Registos limpos + Manager de sinalizadores de recurso + Gerenciar sinalizadores de recurso booleanos + Sinalizadores ativos (%d) + Sinalizadores bloqueados (%d) + Pesquisar sinalizadores... + Sinalizadores salvos + Sinalizadores redefinidos + Sinalizadores copiados para a área de transferência + Registo do buffer de protocolo + Registos de depuração incluem buffer de sondagem + Os registos da depuração não incluem buffer de perfil + "Ativar esta definição irá registar dados de layout adicionais, incluindo o texto no ecrã para alguns componentes da IU. Isto pode ajudar a identificar componentes ao criar filtros personalizados. No entanto, ativar isto também irá registar alguns dados do utilizador, como o seu endereço IP." - - - Sanitizar links de partilha - O parâmetro de consulta de rastreamento é removido dos links partilhados - O parâmetro de consulta de rastreamento não é removido dos links partilhados - Alterar links de compartilhamento para youtube.com - Links compartilhados usam youtube.com - Links compartilhados usam music.youtube.com - - - Filtro personalizado - Esconder componentes usando filtros personalizados - Ativar filtro personalizado - O filtro personalizado está ativado - Filtro personalizado está desativado - Filtro personalizado - - Lista de strings de construção de caminhos de componente para filtrar separadas por nova linha - Filtro personalizado inválido: %s - - - - - Sobre - Anúncios - Miniaturas alternativas - Recomendações - Geral - Reprodutor - Shorts - Barra de pesquisa - Controlos por Gestos - Return YouTube Dislike - Diversos - Vídeo - Restaurar menus de configurações antigos - Os menus de configurações antigos são mostrados - Os menus de configurações antigos não são mostrados - - - Desativar reprodução de fundo de Shorts - Reprodução de fundo de Shorts está desativada - Reprodução de fundo de Shorts está ativa - - - Esconder cartões de álbuns - Cartões de álbuns estão escondidos - Cartões de álbum são visíveis - Esconder cartões de artista - Cartões do artista estão escondidos - Cartões do artista são visíveis - Esconder categoria de chips - Categoria de chips está escondida - Categoria de chips está visível - Esconder publicações da comunidade - As postagens da comunidade estão escondidas - Os posts da comunidade são visíveis - Esconder banners compactos - Banners compactos estão escondidos - Banners compactos são visíveis - Ocultar cartão expansível - O cartão expansível sob os vídeos está oculto - O cartão expansível sob os vídeos está exibido - Esconder o botão do microfone flutuante - O botão flutuante do microfone na pesquisa está oculto - Botão flutuante do microfone na pesquisa é exibido - Esconder categorias horizontais - "Prateleiras horizontais estão ocultas, tais como: + + + Sanitizar links de partilha + O parâmetro de consulta de rastreamento é removido dos links partilhados + O parâmetro de consulta de rastreamento não é removido dos links partilhados + Alterar links de compartilhamento para youtube.com + Links compartilhados usam youtube.com + Links compartilhados usam music.youtube.com + + + Filtro personalizado + Esconder componentes usando filtros personalizados + Ativar filtro personalizado + O filtro personalizado está ativado + Filtro personalizado está desativado + Filtro personalizado + + Lista de strings de construção de caminhos de componente para filtrar separadas por nova linha + Filtro personalizado inválido: %s + + + + + Sobre + Anúncios + Miniaturas alternativas + Recomendações + Geral + Reprodutor + Shorts + Barra de pesquisa + Controlos por Gestos + Return YouTube Dislike + Diversos + Vídeo + Restaurar menus de configurações antigos + Os menus de configurações antigos são mostrados + Os menus de configurações antigos não são mostrados + + + Desativar reprodução de fundo de Shorts + Reprodução de fundo de Shorts está desativada + Reprodução de fundo de Shorts está ativa + + + Esconder cartões de álbuns + Cartões de álbuns estão escondidos + Cartões de álbum são visíveis + Esconder cartões de artista + Cartões do artista estão escondidos + Cartões do artista são visíveis + Esconder categoria de chips + Categoria de chips está escondida + Categoria de chips está visível + Esconder publicações da comunidade + As postagens da comunidade estão escondidas + Os posts da comunidade são visíveis + Esconder banners compactos + Banners compactos estão escondidos + Banners compactos são visíveis + Ocultar cartão expansível + O cartão expansível sob os vídeos está oculto + O cartão expansível sob os vídeos está exibido + Esconder o botão do microfone flutuante + O botão flutuante do microfone na pesquisa está oculto + Botão flutuante do microfone na pesquisa é exibido + Esconder categorias horizontais + "Prateleiras horizontais estão ocultas, tais como: • Notícias de última hora • Continuar a assistir • Explorar mais canais • Mais relevantes • Compras • Assistir novamente" - Prateleiras horizontais são mostradas - Ocultar prateleira de imagens - A prateleira de imagens nos resultados da pesquisa está oculta - A prateleira de imagens nos resultados da pesquisa está exibida - Esconder as últimas publicações - Últimas publicações estão escondidas - Últimas publicações são visíveis - Esconder mistura de playlists - Playlists mistas estão escondidas - Playlists misturadas são visíveis - Esconder secção de filmes - Secção de filmes está escondida - Secção de filmes está visível - - Ocultar botão \'Notificar-me\' - O botão Notificar-me está oculto - O botão Notificar-me está visível - Ocultar Reprodução - Reproduzíveis estão escondidos - Reproduzíveis são visíveis - - Ocultar botão \'Mostrar mais\' - O botão \"Mostrar mais\" nos resultados da pesquisa está oculto - O botão \"Mostrar mais\" nos resultados da pesquisa é exibido - Ocultar pesquisas - Pesquisas estão ocultas - Pesquisas estão visíveis - Ocultar prateleira de ingressos - Prateleira de ingressos oculta - Prateleira de ingressos exibida - - Ocultar rótulos de recomendação de vídeo - \'Pessoas também assistiram\' e \'Você também pode gostar\' rótulos nos resultados da pesquisa estão ocultos - \'Pessoas também assistiram\' e \'Você também pode gostar\' rótulos nos resultados da pesquisa são mostrados - Ocultar espaçador visual - Espaçador visual está oculto - Espaçador visual é exibido - - Ocultar Doodles do YouTube - A animação dos Doodles do YouTube no logótipo está oculta - Animação dos Doodles do YouTube no logótipo é exibida - "Os Doodles do YouTube são apresentados alguns dias por ano. + Ocultar botão \'Mostrar mais\' + O botão \"Mostrar mais\" nos resultados da pesquisa está oculto + O botão \"Mostrar mais\" nos resultados da pesquisa é exibido + Ocultar pesquisas + Pesquisas estão ocultas + Pesquisas estão visíveis + Ocultar prateleira de ingressos + Prateleira de ingressos oculta + Prateleira de ingressos exibida + + Ocultar rótulos de recomendação de vídeo + \'Pessoas também assistiram\' e \'Você também pode gostar\' rótulos nos resultados da pesquisa estão ocultos + \'Pessoas também assistiram\' e \'Você também pode gostar\' rótulos nos resultados da pesquisa são mostrados + Ocultar espaçador visual + Espaçador visual está oculto + Espaçador visual é exibido + + Ocultar Doodles do YouTube + A animação dos Doodles do YouTube no logótipo está oculta + Animação dos Doodles do YouTube no logótipo é exibida + "Os Doodles do YouTube são apresentados alguns dias por ano. Se um Doodle estiver a ser exibido na sua região e esta definição de ocultação estiver activada, a barra de filtros por baixo da barra de pesquisa também será ocultada." - Esconder barra do canal - A barra do canal está escondida - Barra de canal exibida - Esconder a Marca D\'Água do canal - A Marca D\'Água está escondida - A Marca D\'Água está visível - Esconder caixa de crowdfunding - Caixa de Crowdfunding está escondida - Caixa de Crowdfunding é visível - Esconder caixas de emergência - Caixas de emergência estão escondidas - Caixas de emergência são visíveis - Esconder painéis de informação - Painéis de informação estão escondidos - Painéis de informação são visíveis - - Ocultar botão \"Participar\" - O botão Entrar está oculto - O botão Entrar está exibido - Esconder painéis médicos - Painéis médicos estão escondidos - Painéis médicos são visíveis - Ocultar ações rápidas - As ações rápidas em tela cheia estão ocultas - As ações rápidas em tela cheia estão exibidas - Ocultar vídeos relacionados - Os vídeos relacionados nas ações rápidas estão ocultos - Os vídeos relacionados nas ações rápidas estão exibidos - Ocultar as diretrizes para subscritores - As diretrizes da comunidade de subscritores estão escondidas - As diretrizes da comunidade são visíveis - Esconder reações cronometradas - Reações temporizadas estão escondidas - Reações temporizadas são visíveis - Ocultar \"Resumo de vídeo gerado por IA\" - Seção de resumo de vídeo gerada por IA está oculta - Seção de resumo de vídeo gerado por IA está visível - Ocultar \"Perguntar\" - A seção \"Perguntar\" está oculta - A seção \"Perguntar\" está visível - Ocultar atributos - As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas estão ocultas - As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas são mostradas - Ocultar capítulos - Secção de capítulos está oculta - Seção de capítulos é mostrada - Ocultar \"Como este conteúdo foi criado\" - A seção Como este conteúdo foi criado está oculta - A seção Como este conteúdo foi criado é mostrada - Ocultar pontos de Hype - Pontos de Hype ocultos - Pontos de Hype mostrados - Ocultar \"Explore o podcast\" - A seção Explore o podcast está oculta - A seção Explore o podcast é mostrada - Ocultar links em destaque - A seção de links em destaque está oculta - A seção de links em destaque está exibida - Ocultar vídeos em destaque - A seção de vídeos em destaque está oculta - A seção de vídeos em destaque está exibida - Ocultar cartões de informação - Secção de cartões de informações está escondida - Mostrar a secção de cartões de informações - Ocultar \'Conceitos-chave\' - A seção Conceitos-chave está oculta - A seção Conceitos-chave é mostrada - Ocultar botão de inscrição - O botão de inscrição está oculto - O botão de inscrição está exibido - Ocultar transcrição - Secção de transcrição escondida - Secção de transcrição exibida - Descrição do vídeo - Esconder ou mostrar componentes de descrição do vídeo - Barra de Filtro - Ocultar ou mostrar a barra de filtro em feeds, vídeos relacionados, resultados de pesquisa e histórico de exibição - Ocultar em feeds - Oculto em feeds - Exibido em feeds - Esconder em vídeos relacionados - Oculto em vídeos relacionados - Mostrar em vídeos relacionados - Ocultar nos resultados da pesquisa - Oculto nos resultados da pesquisa - Exibido nos resultados da pesquisa - Ocultar no histórico de exibição - Oculto no histórico de exibição - Visível no histórico de exibição - Página do canal - Ocultar ou exibir componentes da página do canal - - Ocultar botão Comunidade - O botão Comunidade está oculto - O botão Comunidade está exibido - - Ocultar estante \"Para você\" - A prateleira \"Para você\" está oculta - A prateleira \"Para você\" está exibida - - Ocultar botão de Associar-se - O botão Entrar está oculto - O botão Entrar está exibido - Ocultar pré-visualização de links - A pré-visualização de links está oculta - A pré-visualização de links está exibida - Ocultar prateleira de membros - A prateleira de membros está oculta - Prateleira de membros é mostrada - - Ocultar botão da Loja - O botão da Loja está oculto - O botão da Loja está exibido - - Ocultar botão de Inscrever-se - O botão de Inscrever-se está oculto - O botão de Inscrever-se está exibido - Comentários - Esconder ou mostrar componentes da seção de comentários - Ocultar resumo de chat de IA - Resumo de chat de IA está oculto - Resumo de chat de IA está visível - Ocultar o resumo dos comentários da IA - Resumo de comentários de IA está oculto - Resumo de comentários de IA está visível - Ocultar diretrizes do canal - Diretrizes do canal estão ocultas - Diretrizes do canal são mostradas - Ocultar cabeçalho \'Comentários por membros\' - O cabeçalho Comentários de membros está oculto - O cabeçalho Comentários de membros é mostrado - Esconder seção de comentários - Seção de comentários está oculta - Seção de comentários exibida - Ocultar diretrizes da comunidade - As diretrizes da comunidade estão ocultas - As diretrizes da comunidade estão exibidas - Ocultar o botão \'Criar um Short\' - O botão Criar um Short está oculto - O botão Criar um Short é mostrado - Ocultar botões de Emoji e Carimbo de data/hora - Os botões de Emoji e Carimbo de data/hora estão ocultos - Os botões de Emoji e Carimbo de data/hora são mostrados - Esconder comentário de pré-visualização - Visualização do comentário está escondida - Pré-visualização de comentário é exibida - Ocultar botão Obrigado - O botão de agradecimento está escondido - O botão Obrigado é visível - Ocultar contagem de visualizações - A contagem de visualizações está oculta no feed e nos resultados da pesquisa - A contagem de visualizações é exibida no feed e nos resultados da pesquisa - - "Limitações: + Ocultar botão \"Participar\" + O botão Entrar está oculto + O botão Entrar está exibido + Esconder painéis médicos + Painéis médicos estão escondidos + Painéis médicos são visíveis + Ocultar ações rápidas + As ações rápidas em tela cheia estão ocultas + As ações rápidas em tela cheia estão exibidas + Ocultar vídeos relacionados + Os vídeos relacionados nas ações rápidas estão ocultos + Os vídeos relacionados nas ações rápidas estão exibidos + Ocultar as diretrizes para subscritores + As diretrizes da comunidade de subscritores estão escondidas + As diretrizes da comunidade são visíveis + Esconder reações cronometradas + Reações temporizadas estão escondidas + Reações temporizadas são visíveis + Ocultar \"Resumo de vídeo gerado por IA\" + Seção de resumo de vídeo gerada por IA está oculta + Seção de resumo de vídeo gerado por IA está visível + Ocultar \"Perguntar\" + A seção \"Perguntar\" está oculta + A seção \"Perguntar\" está visível + Ocultar atributos + As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas estão ocultas + As seções Lugares em destaque, Jogos, Música e Pessoas mencionadas são mostradas + Ocultar capítulos + Secção de capítulos está oculta + Seção de capítulos é mostrada + Ocultar \"Como este conteúdo foi criado\" + A seção Como este conteúdo foi criado está oculta + A seção Como este conteúdo foi criado é mostrada + Ocultar pontos de Hype + Pontos de Hype ocultos + Pontos de Hype mostrados + Ocultar \"Explore o podcast\" + A seção Explore o podcast está oculta + A seção Explore o podcast é mostrada + Ocultar links em destaque + A seção de links em destaque está oculta + A seção de links em destaque está exibida + Ocultar vídeos em destaque + A seção de vídeos em destaque está oculta + A seção de vídeos em destaque está exibida + Ocultar cartões de informação + Secção de cartões de informações está escondida + Mostrar a secção de cartões de informações + Ocultar \'Conceitos-chave\' + A seção Conceitos-chave está oculta + A seção Conceitos-chave é mostrada + Ocultar botão de inscrição + O botão de inscrição está oculto + O botão de inscrição está exibido + Ocultar transcrição + Secção de transcrição escondida + Secção de transcrição exibida + Descrição do vídeo + Esconder ou mostrar componentes de descrição do vídeo + Barra de Filtro + Ocultar ou mostrar a barra de filtro em feeds, vídeos relacionados, resultados de pesquisa e histórico de exibição + Ocultar em feeds + Oculto em feeds + Exibido em feeds + Esconder em vídeos relacionados + Oculto em vídeos relacionados + Mostrar em vídeos relacionados + Ocultar nos resultados da pesquisa + Oculto nos resultados da pesquisa + Exibido nos resultados da pesquisa + Ocultar no histórico de exibição + Oculto no histórico de exibição + Visível no histórico de exibição + Página do canal + Ocultar ou exibir componentes da página do canal + + Ocultar botão Comunidade + O botão Comunidade está oculto + O botão Comunidade está exibido + + Ocultar estante \"Para você\" + A prateleira \"Para você\" está oculta + A prateleira \"Para você\" está exibida + + Ocultar botão de Associar-se + O botão Entrar está oculto + O botão Entrar está exibido + Ocultar pré-visualização de links + A pré-visualização de links está oculta + A pré-visualização de links está exibida + Ocultar prateleira de membros + A prateleira de membros está oculta + Prateleira de membros é mostrada + + Ocultar botão da Loja + O botão da Loja está oculto + O botão da Loja está exibido + + Ocultar botão de Inscrever-se + O botão de Inscrever-se está oculto + O botão de Inscrever-se está exibido + Comentários + Esconder ou mostrar componentes da seção de comentários + Ocultar resumo de chat de IA + Resumo de chat de IA está oculto + Resumo de chat de IA está visível + Ocultar o resumo dos comentários da IA + Resumo de comentários de IA está oculto + Resumo de comentários de IA está visível + Ocultar diretrizes do canal + Diretrizes do canal estão ocultas + Diretrizes do canal são mostradas + Ocultar cabeçalho \'Comentários por membros\' + O cabeçalho Comentários de membros está oculto + O cabeçalho Comentários de membros é mostrado + Esconder seção de comentários + Seção de comentários está oculta + Seção de comentários exibida + Ocultar diretrizes da comunidade + As diretrizes da comunidade estão ocultas + As diretrizes da comunidade estão exibidas + Ocultar o botão \'Criar um Short\' + O botão Criar um Short está oculto + O botão Criar um Short é mostrado + Ocultar botões de Emoji e Carimbo de data/hora + Os botões de Emoji e Carimbo de data/hora estão ocultos + Os botões de Emoji e Carimbo de data/hora são mostrados + Esconder comentário de pré-visualização + Visualização do comentário está escondida + Pré-visualização de comentário é exibida + Ocultar botão Obrigado + O botão de agradecimento está escondido + O botão Obrigado é visível + Ocultar contagem de visualizações + A contagem de visualizações está oculta no feed e nos resultados da pesquisa + A contagem de visualizações é exibida no feed e nos resultados da pesquisa + + "Limitações: • As prateleiras de Shorts, páginas de canal e resultados da pesquisa ainda podem mostrar contagens de visualização • Este recurso não funciona com o fator de forma automotivo" - Ocultar tempo de upload - O tempo de upload está oculto no feed e nos resultados da pesquisa - O tempo de upload é exibido no feed e nos resultados da pesquisa - - "Limitações: + Ocultar tempo de upload + O tempo de upload está oculto no feed e nos resultados da pesquisa + O tempo de upload é exibido no feed e nos resultados da pesquisa + + "Limitações: • As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar tempos de upload • Este recurso não funciona com o fator de forma automotivo" - Esconder conteúdo da palavra-chave - Esconder vídeos de busca e atualização usando filtros de palavra-chave - Esconder vídeos de ecrã inicial com palavras-chave - Vídeos na aba inicial são filtrados por palavras-chave - Vídeos na aba inicial não são filtrados por palavras-chave - Esconder resultados da busca por palavras-chave - Resultados da pesquisa são filtrados por palavras-chave - Os resultados da pesquisa não são filtrados por palavras-chave - Esconder vídeos de assinaturas com palavras-chave - Vídeos na guia de subscrições são filtrados por palavras-chave - Vídeos na guia de subscrições não são filtrados por palavras-chave - Palavras-chave a esconder - - "Từ khóa và cụm từ cần ẩn, cách nhau bởi dòng mới + "Từ khóa và cụm từ cần ẩn, cách nhau bởi dòng mới Từ khóa có thể là tên kênh hoặc bất kỳ văn bản nào hiển thị trong tiêu đề video Từ có chữ in hoa ở giữa phải được nhập với chữ hoa (ví dụ: iPhone, TikTok, LeBlanc)" - Sobre a filtragem por palavra-chave - "Os resultados Home/Assinatura/Pesquisa são filtrados para ocultar conteúdo que corresponda a frases de palavras-chave + Sobre a filtragem por palavra-chave + "Os resultados Home/Assinatura/Pesquisa são filtrados para ocultar conteúdo que corresponda a frases de palavras-chave Limitações • Os Shorts não podem ser ocultados pelo nome do canal • Alguns componentes da interface do usuário podem não estar ocultos • A pesquisa por uma palavra-chave pode não mostrar resultados" - Combinar palavras inteiras - - Colocar uma frase/palavra-chave entre aspas irá prevenir correspondências parcias de títuloas de vídeos e nomes de canais<br><br>Por exemplo,<br><b>\"ia\"</b> vai esconder o vídeo: <b>Como IA funciona?</b><br>mas não vai esconder: <b>O que significa Inteligência Artificial?</b> - - Não é possível usar a palavra-chave: %s - Adicionar aspas para usar a palavra-chave: %s - Palavra-chave tem declarações conflitantes: %s - A palavra-chave é muito curta e requer citações: %s - Palavra-chave irá ocultar todos os vídeos: %s - - - Ocultar prateleira da loja do criador - A prateleira da loja do criador sob o reprodutor de vídeo está oculta - Prateleira da loja do criador sob o leitor de vídeo é exibida - Ocultar banner da loja na tela final - O banner da loja de tela final está oculto - O banner da loja de tela final está exibido - Esconder anúncios em ecrã cheio - "Quảng cáo toàn màn hình bị ẩn + Combinar palavras inteiras + + Colocar uma frase/palavra-chave entre aspas irá prevenir correspondências parcias de títuloas de vídeos e nomes de canais<br><br>Por exemplo,<br><b>\"ia\"</b> vai esconder o vídeo: <b>Como IA funciona?</b><br>mas não vai esconder: <b>O que significa Inteligência Artificial?</b> + + Não é possível usar a palavra-chave: %s + Adicionar aspas para usar a palavra-chave: %s + Palavra-chave tem declarações conflitantes: %s + A palavra-chave é muito curta e requer citações: %s + Palavra-chave irá ocultar todos os vídeos: %s + + + Ocultar prateleira da loja do criador + A prateleira da loja do criador sob o reprodutor de vídeo está oculta + Prateleira da loja do criador sob o leitor de vídeo é exibida + Ocultar banner da loja na tela final + O banner da loja de tela final está oculto + O banner da loja de tela final está exibido + Esconder anúncios em ecrã cheio + "Quảng cáo toàn màn hình bị ẩn Tính năng này chỉ khả dụng cho các thiết bị cũ" - Os anúncios são visíveis em ecrã cheia - - Ocultar anúncios de ecrã cheio só em aparelhos antigos - Esconder anúncios gerais - Anúncios gerais estão escondidos - Anúncios gerais são mostrados - Esconder banner de mercadoria - Banners de mercadoria estão escondidos - Banners de mercadoria são visíveis - Ocultar rótulo de promoção paga - O rótulo de promoção pago está oculto - Rótulo de promoção pago é mostrado - Esconder cartões autopatrocinados - Cartões auto-patrocinados estão escondidos - Cartões auto-patrocinados são visíveis - Ocultar links de compras - Links de compra na descrição do vídeo estão ocultos - Links de compras na descrição do vídeo são exibidos - Ocultar banner \'Ver produtos\' - O banner de visualização de produtos na sobreposição de vídeo está oculto - O banner de visualização de produtos na sobreposição de vídeo está exibido - Esconder resultados da pesquisa web - Resultados de pesquisa web estão escondidos - Resultados de pesquisa web são visíveis - - - Esconder promoções Premium do YouTube - As promoções do YouTube Premium sob o reprodutor de vídeo estão escondidas - Promoções do YouTube Premium sob o reprodutor de vídeo são visíveis - - - Esconder anúncios do vídeo - Anúncios de vídeo estão escondidos - Anúncios de vídeo são visíveis - - - URL copiado - URL com timestamp copiado - Mostrar botão de URL de vídeo copiado - O botão \"Copiar URL do vídeo\" está exibido. Toque para copiar o URL do vídeo. Toque e segure para copiar com carimbo de data/hora - O botão \"Copiar URL do vídeo\" não está exibido - Mostrar botão de copiar timestamp URL - O botão \"Copiar URL com carimbo de data/hora\" está exibido. Toque para copiar o URL do vídeo com carimbo de data/hora. Toque e segure para copiar sem carimbo de data/hora - O botão \"Copiar URL com carimbo de data/hora\" não está exibido - - - Remover diálogo discreto do visualizador - A caixa de diálogo será removida - A caixa de diálogo será exibida - Isto não ignora a restrição de idade, apenas a aceita automaticamente. - - - Desativar pop-up \"Fazer login na TV\" - O pop-up Entrar na TV está desativado - O pop-up Entrar na TV está ativado - - - Desativar o salto de capítulo com toque duplo - O toque duplo nunca acionará um salto para o capítulo seguinte/anterior - O toque duplo pode ocasionalmente acionar um salto para o capítulo seguinte/anterior - - - Transferências externas - Definições para usar um downloader externo - Mostrar botão externo de transferir - O botão de download no player é mostrado - O botão de download no player não é mostrado - - Substituir botão de ação de download - Botão de transferir abre seu downloader externo - O botão de transferir abre o downloader nativo - Nome do pacote do downloader - Nome do pacote do seu aplicativo de download externo instalado - Insira o nome do pacote - Outro - Aplicativo não instalado - %s não está instalado. Por favor, instale-o. - "Não foi possível encontrar o aplicativo instalado com o nome do pacote: %s + Os anúncios são visíveis em ecrã cheia + + Ocultar anúncios de ecrã cheio só em aparelhos antigos + Esconder anúncios gerais + Anúncios gerais estão escondidos + Anúncios gerais são mostrados + Esconder banner de mercadoria + Banners de mercadoria estão escondidos + Banners de mercadoria são visíveis + Ocultar rótulo de promoção paga + O rótulo de promoção pago está oculto + Rótulo de promoção pago é mostrado + Esconder cartões autopatrocinados + Cartões auto-patrocinados estão escondidos + Cartões auto-patrocinados são visíveis + Ocultar links de compras + Links de compra na descrição do vídeo estão ocultos + Links de compras na descrição do vídeo são exibidos + Ocultar banner \'Ver produtos\' + O banner de visualização de produtos na sobreposição de vídeo está oculto + O banner de visualização de produtos na sobreposição de vídeo está exibido + Esconder resultados da pesquisa web + Resultados de pesquisa web estão escondidos + Resultados de pesquisa web são visíveis + + + Esconder promoções Premium do YouTube + As promoções do YouTube Premium sob o reprodutor de vídeo estão escondidas + Promoções do YouTube Premium sob o reprodutor de vídeo são visíveis + + + Esconder anúncios do vídeo + Anúncios de vídeo estão escondidos + Anúncios de vídeo são visíveis + + + URL copiado + URL com timestamp copiado + Mostrar botão de URL de vídeo copiado + O botão \"Copiar URL do vídeo\" está exibido. Toque para copiar o URL do vídeo. Toque e segure para copiar com carimbo de data/hora + O botão \"Copiar URL do vídeo\" não está exibido + Mostrar botão de copiar timestamp URL + O botão \"Copiar URL com carimbo de data/hora\" está exibido. Toque para copiar o URL do vídeo com carimbo de data/hora. Toque e segure para copiar sem carimbo de data/hora + O botão \"Copiar URL com carimbo de data/hora\" não está exibido + + + Remover diálogo discreto do visualizador + A caixa de diálogo será removida + A caixa de diálogo será exibida + Isto não ignora a restrição de idade, apenas a aceita automaticamente. + + + Desativar pop-up \"Fazer login na TV\" + O pop-up Entrar na TV está desativado + O pop-up Entrar na TV está ativado + + + Desativar o salto de capítulo com toque duplo + O toque duplo nunca acionará um salto para o capítulo seguinte/anterior + O toque duplo pode ocasionalmente acionar um salto para o capítulo seguinte/anterior + + + Transferências externas + Definições para usar um downloader externo + Mostrar botão externo de transferir + O botão de download no player é mostrado + O botão de download no player não é mostrado + + Substituir botão de ação de download + Botão de transferir abre seu downloader externo + O botão de transferir abre o downloader nativo + Nome do pacote do downloader + Nome do pacote do seu aplicativo de download externo instalado + Insira o nome do pacote + Outro + Aplicativo não instalado + %s não está instalado. Por favor, instale-o. + "Não foi possível encontrar o aplicativo instalado com o nome do pacote: %s Verifique se o nome do pacote está correto e se o aplicativo está instalado" - O nome do pacote não pode estar vazio - - - Desativar gesto de pesquisa precisa - Gesto está desativado - Gesto ativado - - - Ativar tocar para procurar - Toque para procurar está ativado - Tocar para procurar está desativado - - - Ativar gesto de brilho - "O deslize de brilho em tela cheia está ativado + O nome do pacote não pode estar vazio + + + Desativar gesto de pesquisa precisa + Gesto está desativado + Gesto ativado + + + Ativar tocar para procurar + Toque para procurar está ativado + Tocar para procurar está desativado + + + Ativar gesto de brilho + "O deslize de brilho em tela cheia está ativado Ajuste o brilho deslizando verticalmente no lado esquerdo da tela" - O deslize de brilho em tela cheia está desativado - Ativar gesto de volume - "O gesto de deslizar de volume em tela cheia está ativado + O deslize de brilho em tela cheia está desativado + Ativar gesto de volume + "O gesto de deslizar de volume em tela cheia está ativado Ajuste o volume deslizando verticalmente no lado direito da tela" - O gesto de deslizar de volume em tela cheia está desativado - Ativar gesto de pressionar para deslizar - Pressionar-para-deslizar está ativado - Pressionar-para-deslizar está desativado - Ativar resposta ao toque - Retorno tátil ativado - Retorno tátil está desativado - Salvar e restaurar brilho - Salvar e restaurar o brilho quando sair ou entrar em ecrã cheio - Não guardar e restaurar o brilho quando sair ou entrar em ecrã cheio - Ativar gesto de brilho automático - Deslizando para baixo até o menor valor do gesto de brilho, habilite o brilho automático - Deslizando para baixo até o menor valor não habilita o brilho automático - Automático - Tempo limite de sobreposição - A quantidade de milissegundos que a sobreposição é visível - Opacidade do plano de fundo da sobreposição de deslizar - Valor de opacidade entre 0-100 - A opacidade do deslizar deve estar entre 0-100 - Cor da cor do brilho da sobreposição de deslizamento - A cor da barra de progresso para controles de brilho - Cor do volume da sobreposição de deslizamento - A cor da barra de progresso para controles de volume - Tamanho do texto da sobreposição de deslize - O tamanho do texto para a sobreposição de deslize entre 1 e 30 - O tamanho do texto deve estar entre 1 e 30 - Limite de magnitude - A quantidade limite para deslizar irá ocorrer - Sensibilidade ao deslizar o volume - O quanto o volume muda por deslize - Estilo de sobreposição de deslize - Sobreposição horizontal - Sobreposição horizontal (mínima - superior) - Sobreposição horizontal (mínima - centro) - Sobreposição circular - Sobreposição circular (mínima) - Sobreposição vertical - Sobreposição vertical (mínima) - Ativar deslizar para mudar de vídeo - Deslizar no modo de ecrã inteiro mudará para o vídeo seguinte/anterior - Deslizar no modo de ecrã inteiro não mudará para o vídeo seguinte/anterior - - - Desativar legendas automáticas - As legendas automáticas estão desativadas - As legendas automáticas estão ativadas - - - Botões de ação - Esconder ou mostrar botões sob vídeos - Desativar o brilho de \"Gostar\" e \"Subscrever\" - Os botões “Gosto” e “Subscrever” não brilham quando são mencionados - O botão de gostar e subscrever brilhará quando mencionado - Esconder Curtir e Descurtir - Botões de Curtir e Desmarcar estão escondidos - Botões de Curtir e Desmarcar são visíveis - - Esconder compartilhamento - Botão Compartilhar está escondido - Botão Compartilhar é visível - - Ocultar Parar anúncios - O botão Parar anúncios está oculto - O botão Parar anúncios está exibido - - Ocultar Comentários - O botão de comentários está oculto - O botão de comentários está exibido - + Esconder compartilhamento + Botão Compartilhar está escondido + Botão Compartilhar é visível + + Ocultar Parar anúncios + O botão Parar anúncios está oculto + O botão Parar anúncios está exibido + + Ocultar Comentários + O botão de comentários está oculto + O botão de comentários está exibido + - Esconder relatório - O botão de relatório está escondido - Botão de relatório é visível - - Esconder Remix - Botão de remixar está escondido - Botão de remixar é visível - - Esconder Transferir - O botão transferir está escondido - O botão transferir está visível - + Esconder Remix + Botão de remixar está escondido + Botão de remixar é visível + + Esconder Transferir + O botão transferir está escondido + O botão transferir está visível + - Ocultar Hype - O botão Hype está oculto - O botão Hype está exibido - - Ocultar Promover - O botão Promover está oculto - O botão Promover está exibido - - Esconder Obrigado - O botão de agradecimento está escondido - O botão Obrigado é visível - + Ocultar Promover + O botão Promover está oculto + O botão Promover está exibido + + Esconder Obrigado + O botão de agradecimento está escondido + O botão Obrigado é visível + - Ocultar Perguntar - O botão Perguntar está oculto - O botão Perguntar está visível - - Esconder clipe - O botão do clipe está escondido - Botão de corte é visível - - Ocultar Loja - O botão Loja está oculto - O botão Loja está exibido - - Ocultar Salvar - O botão Salvar está oculto - O botão Salvar está exibido - - - Botões de navegação - Esconder ou alterar botões na barra de navegação - - Esconder Página Inicial - O botão Início está escondido - O botão \"Início\" está visível - - Esconder Shorts - O botão Shorts está oculto - O botão Shorts está visível - - Esconder Criar - O botão criar está escondido - Botão criar é visível - - Esconder assinaturas - O botão de assinaturas está escondido - O botão Subscrições está visível - Ocultar notificações - O botão de notificações está oculto - O botão de notificações está visível - - Mudar Criar com Notificações - "Nút Tạo chuyển sang Nút Thông báo + Ocultar Perguntar + O botão Perguntar está oculto + O botão Perguntar está visível + + Esconder clipe + O botão do clipe está escondido + Botão de corte é visível + + Ocultar Loja + O botão Loja está oculto + O botão Loja está exibido + + Ocultar Salvar + O botão Salvar está oculto + O botão Salvar está exibido + + + Botões de navegação + Esconder ou alterar botões na barra de navegação + + Esconder Página Inicial + O botão Início está escondido + O botão \"Início\" está visível + + Esconder Shorts + O botão Shorts está oculto + O botão Shorts está visível + + Esconder Criar + O botão criar está escondido + Botão criar é visível + + Esconder assinaturas + O botão de assinaturas está escondido + O botão Subscrições está visível + Ocultar notificações + O botão de notificações está oculto + O botão de notificações está visível + + Mudar Criar com Notificações + "Nút Tạo chuyển sang Nút Thông báo Lưu ý: Bật tính năng này cũng buộc ẩn quảng cáo video" - O botão criar não está alternado com o botão Notificações - "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. + O botão criar não está alternado com o botão Notificações + "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. Se alterar esta configuração não fizer efeito, tente alternar para o modo anônimo." - Ocultar rótulos dos botões de navegação - Marcadores estão ocultos - Marcadores são mostrados - Desativar a barra de status translúcida - A barra de status é opaca - A barra de status é opaca ou translúcida - Em alguns dispositivos, habilitar este recurso pode mudar a barra de navegação do sistema para transparente. - Desativar a barra translúcida clara - A barra de navegação no modo claro é opaca - A barra de navegação em modo claro é opaca ou translúcida - Desativar barra translúcida escura - A barra de navegação no modo escuro é opaca - A barra de navegação em modo escuro é opaca ou translúcida - - - Menu suspenso - Esconder ou mostrar itens do menu de saída do player - - Esconder legendas - O menu de legendas está escondido - Menu de legendas é visível - - Esconder configurações adicionais - Menu de configurações adicionais está escondido - Menu de configurações adicionais é visível - - Ocultar Timer de Suspensão - O menu Temporizador está oculto - O menu Timer para dormir é mostrado - - Esconder vídeo Loop - Menu de vídeo Loop escondido - Menu de vídeo Loop é visível - - Esconder modo ambiente - Menu do modo ambiente está escondido - Menu do modo ambiente é visível - Ocultar volume estável - Menu de volume estável é mostrado - Menu de volume estável está oculto - - Esconder Ajuda & Feedback - Ajuda & o menu de feedback está escondido - Ajuda & menu de feedback é visível - - Esconder velocidade de reprodução - Velocidade de reprodução está escondida - Velocidade de reprodução visível - - Esconder Ecrã de bloqueio - Menu da ecrã de bloqueio escondido - Ecrã de bloqueio visível - - Ocultar Ouvir com o YouTube Music - O menu Ouvir com o YouTube Music está oculto - O menu Ouvir com o YouTube Music está visível - - Esconder faixa de áudio - Menu de faixa de áudio escondida - Menu da faixa de áudio visível - + Esconder legendas + O menu de legendas está escondido + Menu de legendas é visível + + Esconder configurações adicionais + Menu de configurações adicionais está escondido + Menu de configurações adicionais é visível + + Ocultar Timer de Suspensão + O menu Temporizador está oculto + O menu Timer para dormir é mostrado + + Esconder vídeo Loop + Menu de vídeo Loop escondido + Menu de vídeo Loop é visível + + Esconder modo ambiente + Menu do modo ambiente está escondido + Menu do modo ambiente é visível + Ocultar volume estável + Menu de volume estável é mostrado + Menu de volume estável está oculto + + Esconder Ajuda & Feedback + Ajuda & o menu de feedback está escondido + Ajuda & menu de feedback é visível + + Esconder velocidade de reprodução + Velocidade de reprodução está escondida + Velocidade de reprodução visível + + Esconder Ecrã de bloqueio + Menu da ecrã de bloqueio escondido + Ecrã de bloqueio visível + + Ocultar Ouvir com o YouTube Music + O menu Ouvir com o YouTube Music está oculto + O menu Ouvir com o YouTube Music está visível + + Esconder faixa de áudio + Menu de faixa de áudio escondida + Menu da faixa de áudio visível + - "O menu da faixa de áudio está oculto + "O menu da faixa de áudio está oculto Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" para \"Android No SDK\"" - - Esconder relógio no VR - Assista no menu VR está escondido - Assistir no menu VR é visível - Ocultar menu de qualidade do vídeo - O menu de qualidade de vídeo está oculto - O menu de qualidade de vídeo está exibido - Esconder rodapé do menu de qualidade de vídeo - O rodapé do menu de qualidade de vídeo está oculto - Cabeçalho do menu de qualidade de vídeo mostrado - - - Ocultar botão de reprodução automática - O botão de reprodução automática está escondido - Botão de reprodução automática é visível - - Ocultar botão de legendas - O botão de legendas está escondido - Botão de legendas é visível - Ocultar botão Transmitir - Botão \"Transmitir\" está escondido - Botão \"Transmitir\" é visível - Ocultar fundo dos controles do player - O fundo dos controles do reprodutor está oculto - O fundo dos controles do player é exibido - Ocultar botões Anterior & Próximo - Botões estão ocultos - Botões são exibidos - - - Esconder cartões de ecrã final - Cartões de fim de ecrã estão escondidos - Cartões de fim de ecrã são exibidos - - - Desabilitar modo ambiente em tela cheia - Modo ambiente desativado - Modo ambiente ativado - - - Esconder cartões de informação - Cartões de informação estão escondidos - Cartões de informação são exibidos - - - Desativar animações de números rolantes - Números de rolagem não estão animados - Números de rolagem estão animados - - - Ocultar barra de busca do player de vídeo - Barra de busca do vídeo está escondida - Barra de busca do vídeo visível - - Ocultar barra de busca de miniaturas de vídeo - Barra de busca de miniaturas de vídeo está oculta - Barra de busca de miniaturas de vídeo está visível - - - Reprodutor de Shorts - Ocultar ou mostrar componentes do player de Shorts - - Ocultar Shorts no feed inicial - Oculto no feed inicial e vídeos relacionados - Exibido no feed inicial e vídeos relacionados - Esconder Shorts nos resultados de pesquisa - Ocultar nos resultados de pesquisa - Mostrado nos resultados da pesquisa - - Ocultar Shorts no feed de Inscrições - Oculto no feed de Inscrições - Exibido no feed de Inscrições - Ocultar Shorts no histórico de visualização - Oculto no histórico de visualização - Exibido no histórico de visualização - Ocultar rótulo \"Dublado automaticamente\" - O rótulo dublado automaticamente está oculto - O rótulo dublado automaticamente está visível - Ocultar botão \"Comprar Super Thanks\" - O botão Comprar Super Thanks está oculto - O botão Comprar Super Thanks é exibido - Ocultar botão de efeito - O botão Efeito está oculto - O botão Efeito está exibido - Ocultar botão \"Tela verde\" - O botão de ecrã verde está oculto - Botão de ecrã verde é mostrado - Ocultar botão de hashtag - O botão Hashtag está oculto - Botão Hashtag é mostrado - - Ocultar botão de ingressar - O botão \"Aderir\" está escondido - Botão \'Aderir\' está visível - Ocultar pré-visualização ao vivo - A prévia ao vivo está oculta - A prévia ao vivo está visível - Ocultar rótulo de localização - Rótulo de localização está oculto - Rótulo de localização é mostrado - Ocultar botão \"Novas publicações\" - O botão Novas postagens está oculto - O botão Novas postagens é exibido - Ocultar botões de sobreposição pausados - Botões de sobreposição pausados estão ocultos - Botões de sobreposição pausados são mostrados - Esconder comentário de pré-visualização - Visualização do comentário está escondida - Pré-visualização de comentário é exibida - Ocultar botão \"Salvar música\" - O botão salvar música está oculto - O botão salvar música é mostrado - Ocultar sugestões de busca - Sugestões de pesquisa estão ocultas - Sugestões de pesquisa são mostradas - Ocultar botão de compras - O botão da loja está escondido - O botão da loja é visível - Ocultar stickers - Adesivos estão ocultos - Stickers são mostrados - Ocultar botão de inscrição - O botão de subscrever está escondido - Botão de subscrever está visível - Ocultar produtos marcados - Produtos marcados estão ocultos - Produtos marcados são mostrados - Ocultar botão de próximos - O botão \"vir\" está oculto - O próximo botão será exibido - Ocultar botão \"Usar este som\" - O botão Usar este som está oculto - O botão Usar este som está visível - Ocultar botão \"Usar este modelo\" - O botão Usar este modelo está oculto - O botão \"Usar este modelo\" é exibido - Ocultar animação de fonte do botão de Gosto - A animação da fonte do botão curtir está oculta - Animação de botão fonte é mostrada - Ocultar botão de Gosto - O botão curtir está escondido - O botão curtir está visível - Ocultar botão de Não Gosto - Botão não curtir está escondido - Botão não curtir é visível - Ocultar botão de comentários - Botão de comentários está escondido - O botão Comentários está visível - - Ocultar botão de partilhar - Botão Partilhar está escondido - Botão Partilhar está visível - - Ocultar botão de remix - Botão \'Remix\' está escondido - Botão de \'Remix\' está visível - Esconder botão de som - O botão de som está escondido - O botão de som é visível - Esconder painel de informações - O painel de informações está escondido - Painel de informações é visível - Esconder barra do canal - A barra do canal está escondida - Barra de canal exibida - Ocultar título do vídeo - O título do vídeo está oculto - O título do vídeo está exibido - Esconder rótulo de metadados de som - O rótulo de metadados de som está oculto - O rótulo de metadados de som está visível - Ocultar rótulo de link do vídeo - Rótulo de link do vídeo está escondido - Rótulo do link do vídeo é visível - Esconder barra de navegação - A barra de navegação está escondida - Barra de navegação exibida - - - Ocultar o vídeo sugerido na tela final - "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada + + Esconder relógio no VR + Assista no menu VR está escondido + Assistir no menu VR é visível + Ocultar menu de qualidade do vídeo + O menu de qualidade de vídeo está oculto + O menu de qualidade de vídeo está exibido + Esconder rodapé do menu de qualidade de vídeo + O rodapé do menu de qualidade de vídeo está oculto + Cabeçalho do menu de qualidade de vídeo mostrado + + + Ocultar botão de reprodução automática + O botão de reprodução automática está escondido + Botão de reprodução automática é visível + + Ocultar botão de legendas + O botão de legendas está escondido + Botão de legendas é visível + Ocultar botão Transmitir + Botão \"Transmitir\" está escondido + Botão \"Transmitir\" é visível + Ocultar fundo dos controles do player + O fundo dos controles do reprodutor está oculto + O fundo dos controles do player é exibido + Ocultar botões Anterior & Próximo + Botões estão ocultos + Botões são exibidos + + + Esconder cartões de ecrã final + Cartões de fim de ecrã estão escondidos + Cartões de fim de ecrã são exibidos + + + Desabilitar modo ambiente em tela cheia + Modo ambiente desativado + Modo ambiente ativado + + + Esconder cartões de informação + Cartões de informação estão escondidos + Cartões de informação são exibidos + + + Desativar animações de números rolantes + Números de rolagem não estão animados + Números de rolagem estão animados + + + Ocultar barra de busca do player de vídeo + Barra de busca do vídeo está escondida + Barra de busca do vídeo visível + + Ocultar barra de busca de miniaturas de vídeo + Barra de busca de miniaturas de vídeo está oculta + Barra de busca de miniaturas de vídeo está visível + + + Reprodutor de Shorts + Ocultar ou mostrar componentes do player de Shorts + + Ocultar Shorts no feed inicial + Oculto no feed inicial e vídeos relacionados + Exibido no feed inicial e vídeos relacionados + Esconder Shorts nos resultados de pesquisa + Ocultar nos resultados de pesquisa + Mostrado nos resultados da pesquisa + + Ocultar Shorts no feed de Inscrições + Oculto no feed de Inscrições + Exibido no feed de Inscrições + Ocultar Shorts no histórico de visualização + Oculto no histórico de visualização + Exibido no histórico de visualização + Ocultar rótulo \"Dublado automaticamente\" + O rótulo dublado automaticamente está oculto + O rótulo dublado automaticamente está visível + Ocultar botão \"Comprar Super Thanks\" + O botão Comprar Super Thanks está oculto + O botão Comprar Super Thanks é exibido + Ocultar botão de efeito + O botão Efeito está oculto + O botão Efeito está exibido + Ocultar botão \"Tela verde\" + O botão de ecrã verde está oculto + Botão de ecrã verde é mostrado + Ocultar botão de hashtag + O botão Hashtag está oculto + Botão Hashtag é mostrado + + Ocultar botão de ingressar + O botão \"Aderir\" está escondido + Botão \'Aderir\' está visível + Ocultar pré-visualização ao vivo + A prévia ao vivo está oculta + A prévia ao vivo está visível + Ocultar rótulo de localização + Rótulo de localização está oculto + Rótulo de localização é mostrado + Ocultar botão \"Novas publicações\" + O botão Novas postagens está oculto + O botão Novas postagens é exibido + Ocultar botões de sobreposição pausados + Botões de sobreposição pausados estão ocultos + Botões de sobreposição pausados são mostrados + Esconder comentário de pré-visualização + Visualização do comentário está escondida + Pré-visualização de comentário é exibida + Ocultar botão \"Salvar música\" + O botão salvar música está oculto + O botão salvar música é mostrado + Ocultar sugestões de busca + Sugestões de pesquisa estão ocultas + Sugestões de pesquisa são mostradas + Ocultar botão de compras + O botão da loja está escondido + O botão da loja é visível + Ocultar stickers + Adesivos estão ocultos + Stickers são mostrados + Ocultar botão de inscrição + O botão de subscrever está escondido + Botão de subscrever está visível + Ocultar produtos marcados + Produtos marcados estão ocultos + Produtos marcados são mostrados + Ocultar botão de próximos + O botão \"vir\" está oculto + O próximo botão será exibido + Ocultar botão \"Usar este som\" + O botão Usar este som está oculto + O botão Usar este som está visível + Ocultar botão \"Usar este modelo\" + O botão Usar este modelo está oculto + O botão \"Usar este modelo\" é exibido + Ocultar animação de fonte do botão de Gosto + A animação da fonte do botão curtir está oculta + Animação de botão fonte é mostrada + Ocultar botão de Gosto + O botão curtir está escondido + O botão curtir está visível + Ocultar botão de Não Gosto + Botão não curtir está escondido + Botão não curtir é visível + Ocultar botão de comentários + Botão de comentários está escondido + O botão Comentários está visível + + Ocultar botão de partilhar + Botão Partilhar está escondido + Botão Partilhar está visível + + Ocultar botão de remix + Botão \'Remix\' está escondido + Botão de \'Remix\' está visível + Esconder botão de som + O botão de som está escondido + O botão de som é visível + Esconder painel de informações + O painel de informações está escondido + Painel de informações é visível + Esconder barra do canal + A barra do canal está escondida + Barra de canal exibida + Ocultar título do vídeo + O título do vídeo está oculto + O título do vídeo está exibido + Esconder rótulo de metadados de som + O rótulo de metadados de som está oculto + O rótulo de metadados de som está visível + Ocultar rótulo de link do vídeo + Rótulo de link do vídeo está escondido + Rótulo do link do vídeo é visível + Esconder barra de navegação + A barra de navegação está escondida + Barra de navegação exibida + + + Ocultar o vídeo sugerido na tela final + "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada A reprodução automática pode ser alterada nas configurações do YouTube: Configurações → Reprodução → Reproduzir o próximo vídeo automaticamente" - O vídeo sugerido na tela final é exibido - - - Ocultar sobreposição de vídeos relacionados - A sobreposição de vídeos relacionados em tela cheia está oculta - A sobreposição de vídeos relacionados em tela cheia está visível - - - Esconder timestamp do vídeo - Timestamp está escondido - Timestamp é visível - - - Esconder painéis popup do player - Painéis pop-up do jogador estão escondidos - Painéis pop-up do jogador são visíveis - - - Sair do modo de ecrã inteiro no final do vídeo - Desativado - Retrato - Paisagem - Retrato e paisagem - - - Abrir vídeos em retrato em ecrã cheio - Vídeos abertos em ecrã cheio - Vídeos não abrem em ecrã cheio - - - Opacidade do jogador - Valor de opacidade entre 0-100, onde 0 é transparente - Opacidade do jogador deve estar entre 0-100 - - - - Dislikes temporariamente indisponível (API expirou) - Descurtir não disponível (status %d) - As não gostos não estão disponíveis (limite da API do cliente) - Descurtir não disponível (%s) - - Recarregue para votar usando Return YouTube Dislike - - Oculto pelo proprietário - Return YouTube Dislike - Descurtidas são visíveis - Não há curtidas visíveis - Mostrar não curtidas na abreviação - "As não gostos em Shorts são mostradas + O vídeo sugerido na tela final é exibido + + + Ocultar sobreposição de vídeos relacionados + A sobreposição de vídeos relacionados em tela cheia está oculta + A sobreposição de vídeos relacionados em tela cheia está visível + + + Esconder timestamp do vídeo + Timestamp está escondido + Timestamp é visível + + + Esconder painéis popup do player + Painéis pop-up do jogador estão escondidos + Painéis pop-up do jogador são visíveis + + + Sair do modo de ecrã inteiro no final do vídeo + Desativado + Retrato + Paisagem + Retrato e paisagem + + + Abrir vídeos em retrato em ecrã cheio + Vídeos abertos em ecrã cheio + Vídeos não abrem em ecrã cheio + + + Opacidade do jogador + Valor de opacidade entre 0-100, onde 0 é transparente + Opacidade do jogador deve estar entre 0-100 + + + + Dislikes temporariamente indisponível (API expirou) + Descurtir não disponível (status %d) + As não gostos não estão disponíveis (limite da API do cliente) + Descurtir não disponível (%s) + + Recarregue para votar usando Return YouTube Dislike + + Oculto pelo proprietário + Return YouTube Dislike + Descurtidas são visíveis + Não há curtidas visíveis + Mostrar não curtidas na abreviação + "As não gostos em Shorts são mostradas Limitação: As não gostos podem não aparecer no modo anônimo" - As não gostos em Shorts não são mostradas - Descurte como porcentagem - As não gostos são mostradas como uma percentagem - As não gostos são mostradas como um número - - Botão de Gosto compacto - Botão curtir estilizado para largura mínima - Botão curtir estilizado para melhor aparência - Mostrar estimativa de \"gostos\" - Vídeos com likes desativados mostram uma estimativa da contagem de likes - Likes estimados não são mostrados - Mostrar uma notificação flutuante se a API não estiver disponível - Toast é exibida se Retornar o Youtube Dislike não estiver disponível - Toast não é exibida se Retornar o YouTube Dislike não estiver disponível - ReturnYouTubeDislike.com - Os dados são fornecidos pela API Return Dislike do YouTube. Toque aqui para saber mais - - Estatísticas da API deste dispositivo RetnYouTubeDislike - Tempo de resposta da API, média - Tempo de resposta da API, mínimo - Tempo de resposta da API, máximo - Tempo de resposta da API, último vídeo - Desativa temporariamente não disponível - API de limite de taxa de cliente em efeito - Votos de busca de API, número de chamadas - Nenhuma chamada de rede feita - Chamadas de rede %d realizadas - Busca de API, número de timeouts - Nenhuma chamada de rede expirou - Chamadas de rede %d expiradas - Limites da taxa de cliente API - Nenhum limite de taxa de cliente encontrado - Limite da taxa de cliente encontrado %d vezes - %d milissegundos - - - Ativar barra de pesquisa ampla - Barra de pesquisa ampla está ativada - Barra de pesquisa ampla está desativada - - - Habilitar miniaturas de alta qualidade - As miniaturas na barra de busca são de alta qualidade - As miniaturas na barra de busca são de qualidade média - As miniaturas da barra de busca em tela cheia são de alta qualidade - As miniaturas na barra de busca em tela cheia são de qualidade média - "Điều này cũng sẽ khôi phục hình thu nhỏ trên các luồng trực tiếp không có các hình thu nhỏ thanh tìm kiếm. + As não gostos em Shorts não são mostradas + Descurte como porcentagem + As não gostos são mostradas como uma percentagem + As não gostos são mostradas como um número + + Botão de Gosto compacto + Botão curtir estilizado para largura mínima + Botão curtir estilizado para melhor aparência + Mostrar estimativa de \"gostos\" + Vídeos com likes desativados mostram uma estimativa da contagem de likes + Likes estimados não são mostrados + Mostrar uma notificação flutuante se a API não estiver disponível + Toast é exibida se Retornar o Youtube Dislike não estiver disponível + Toast não é exibida se Retornar o YouTube Dislike não estiver disponível + ReturnYouTubeDislike.com + Os dados são fornecidos pela API Return Dislike do YouTube. Toque aqui para saber mais + + Estatísticas da API deste dispositivo RetnYouTubeDislike + Tempo de resposta da API, média + Tempo de resposta da API, mínimo + Tempo de resposta da API, máximo + Tempo de resposta da API, último vídeo + Desativa temporariamente não disponível - API de limite de taxa de cliente em efeito + Votos de busca de API, número de chamadas + Nenhuma chamada de rede feita + Chamadas de rede %d realizadas + Busca de API, número de timeouts + Nenhuma chamada de rede expirou + Chamadas de rede %d expiradas + Limites da taxa de cliente API + Nenhum limite de taxa de cliente encontrado + Limite da taxa de cliente encontrado %d vezes + %d milissegundos + + + Ativar barra de pesquisa ampla + Barra de pesquisa ampla está ativada + Barra de pesquisa ampla está desativada + + + Habilitar miniaturas de alta qualidade + As miniaturas na barra de busca são de alta qualidade + As miniaturas na barra de busca são de qualidade média + As miniaturas da barra de busca em tela cheia são de alta qualidade + As miniaturas na barra de busca em tela cheia são de qualidade média + "Điều này cũng sẽ khôi phục hình thu nhỏ trên các luồng trực tiếp không có các hình thu nhỏ thanh tìm kiếm. Hình thu nhỏ thanh tìm kiếm sẽ sử dụng chất lượng tương tự như video hiện tại. Tính năng này hoạt động tốt nhất với chất lg video là 720p trở xuống và khi sử dụng kết nối internet rất nhanh." - Restaurar as miniaturas antigas da barra de pesquisa - As miniaturas da barra de busca aparecerão acima da barra de busca - As miniaturas da Seekbar aparecerão em ecrã cheia - - - SponsorBlock - Habilitar Patrocínio - SponsorBlock é um sistema de crowdsourcing para saltar partes irritantes de vídeos do YouTube - Aparência - Mostrar o botão de votação - Botão de votação segmentado é visível - O botão de votação não é visível - Usar layout quadrado - Botões e controles são quadrados - Botões e controles são arredondados - - Usar botão \"Ignorar\" compacto - Ignorar botão estilizado para largura mínima - Pular botão estilizado para a melhor aparência - Ocultar automaticamente o botão \"Ignorar\" - Pular botão esconde após alguns segundos - O botão \"Ignorar\" é mostrado para todo o segmento - Duração do botão de pular - Quanto tempo para mostrar os botões de pular e pular para destaque antes de ocultar automaticamente - Mostrar notificação de desfazer pular - Uma notificação é exibida quando um segmento é pulado automaticamente. Toque na notificação para desfazer o pulo - Notificação não é exibida - Duração da notificação de pular - Quanto tempo para mostrar o aviso de desfazer pular - 1 segundo - 2 segundos - 3 segundos - 4 segundos - 5 segundos - 6 segundos - 7 segundos - 8 segundos - 9 segundos - 10 segundos - Mostrar duração do vídeo sem segmentos - O comprimento do vídeo menos todos os segmentos é mostrado na barra de busca - Duração total do vídeo exibido - Criando novos segmentos - Mostrar o botão Criar novo segmento - Criar novo segmento botão é visível - Criar novo segmento botão não é visível - Ajustar novo passo do segmento - Número de milissegundos do tempo que os botões de ajuste de tempo se movem ao criar novos segmentos - Valor deve ser um número positivo - Ver orientações - Diretrizes contêm regras e dicas para criar novos segmentos - Siga as instruções - Leia as diretrizes do Patrocinador antes de criar novos segmentos - Já lido - Mostre-me - Geral - Mostrar uma notificação flutuante se a API não estiver disponível - Toast é visível se o Patrocinador não está disponível - Toast não é visível se o Patrocinador não está disponível - Ativar rastreamento de ignorar contagem - Vamos o placar do Patrocinador saber quanto tempo é salvo. Uma mensagem é enviada para o placar cada vez que um segmento é ignorado - O rastreamento da contagem ignorada não está habilitado - Duração mínima do segmento - Segmentos menores que este valor (em segundos) não serão visíveis ou ignorados - Duração inválida - Seu ID de usuário privado - Isso deve ser mantido em particular. Isto é como uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, ele pode representar você - ID do usuário privado deve ter pelo menos 30 caracteres - Alterar URL da API - O Patrocinador usa o endereço para fazer chamadas ao servidor - URL da API redefinida - URL da API inválida - URL da API alterada - Importar/Exportar Configurações - Copiar - Sua configuração JSON de Patrocinador que pode ser importada/exportada para ReVanced e outras plataformas de Patrocinador - Sua configuração JSON de Patrocinador que pode ser importada/exportada para ReVanced e outras plataformas do Patrocinador. Isso inclui sua identificação de usuário privada. Certifique-se de compartilhar isso sabiamente - Configurações importadas com sucesso - Falha ao importar: %s - Falha ao exportar: %s - "Suas configurações contêm um ID de usuário SponsorBlock privado. + Restaurar as miniaturas antigas da barra de pesquisa + As miniaturas da barra de busca aparecerão acima da barra de busca + As miniaturas da Seekbar aparecerão em ecrã cheia + + + SponsorBlock + Habilitar Patrocínio + SponsorBlock é um sistema de crowdsourcing para saltar partes irritantes de vídeos do YouTube + Aparência + Mostrar o botão de votação + Botão de votação segmentado é visível + O botão de votação não é visível + Usar layout quadrado + Botões e controles são quadrados + Botões e controles são arredondados + + Usar botão \"Ignorar\" compacto + Ignorar botão estilizado para largura mínima + Pular botão estilizado para a melhor aparência + Ocultar automaticamente o botão \"Ignorar\" + Pular botão esconde após alguns segundos + O botão \"Ignorar\" é mostrado para todo o segmento + Duração do botão de pular + Quanto tempo para mostrar os botões de pular e pular para destaque antes de ocultar automaticamente + Mostrar notificação de desfazer pular + Uma notificação é exibida quando um segmento é pulado automaticamente. Toque na notificação para desfazer o pulo + Notificação não é exibida + Duração da notificação de pular + Quanto tempo para mostrar o aviso de desfazer pular + 1 segundo + 2 segundos + 3 segundos + 4 segundos + 5 segundos + 6 segundos + 7 segundos + 8 segundos + 9 segundos + 10 segundos + Mostrar duração do vídeo sem segmentos + O comprimento do vídeo menos todos os segmentos é mostrado na barra de busca + Duração total do vídeo exibido + Criando novos segmentos + Mostrar o botão Criar novo segmento + Criar novo segmento botão é visível + Criar novo segmento botão não é visível + Ajustar novo passo do segmento + Número de milissegundos do tempo que os botões de ajuste de tempo se movem ao criar novos segmentos + Valor deve ser um número positivo + Ver orientações + Diretrizes contêm regras e dicas para criar novos segmentos + Siga as instruções + Leia as diretrizes do Patrocinador antes de criar novos segmentos + Já lido + Mostre-me + Geral + Mostrar uma notificação flutuante se a API não estiver disponível + Toast é visível se o Patrocinador não está disponível + Toast não é visível se o Patrocinador não está disponível + Ativar rastreamento de ignorar contagem + Vamos o placar do Patrocinador saber quanto tempo é salvo. Uma mensagem é enviada para o placar cada vez que um segmento é ignorado + O rastreamento da contagem ignorada não está habilitado + Duração mínima do segmento + Segmentos menores que este valor (em segundos) não serão visíveis ou ignorados + Duração inválida + Seu ID de usuário privado + Isso deve ser mantido em particular. Isto é como uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, ele pode representar você + ID do usuário privado deve ter pelo menos 30 caracteres + Alterar URL da API + O Patrocinador usa o endereço para fazer chamadas ao servidor + URL da API redefinida + URL da API inválida + URL da API alterada + Importar/Exportar Configurações + Copiar + Sua configuração JSON de Patrocinador que pode ser importada/exportada para ReVanced e outras plataformas de Patrocinador + Sua configuração JSON de Patrocinador que pode ser importada/exportada para ReVanced e outras plataformas do Patrocinador. Isso inclui sua identificação de usuário privada. Certifique-se de compartilhar isso sabiamente + Configurações importadas com sucesso + Falha ao importar: %s + Falha ao exportar: %s + "Suas configurações contêm um ID de usuário SponsorBlock privado. Seu ID de usuário é como uma senha e nunca deve ser compartilhado. " - Não mostrar novamente - Alterar comportamento do segmento - Patrocinador - Promoção paga, indicações pagas e anúncios diretos. Não para auto-promoção ou gritos gratuitos para causas/criadores/websites/produtos que eles gostam - Promover Despaid/Auto - Semelhante ao Sponsor, mas para promoções não pagas ou autopromoção. Inclui seções sobre mercadoria, doações ou informações sobre com quem eles colaboraram - Lembrete de interação (inscrever) - Um pequeno lembrete para curtir, assinar ou segui-los no meio do conteúdo. Se for longo ou sobre algo específico, deveria em vez disso estar sob auto-promoção - Destacar - A parte do vídeo que a maioria das pessoas está à procura - Animação de Intermissão/Introdução - Um intervalo sem conteúdo real. Pode ser uma pausa, moldura estática ou uma animação repetida. Não inclui transições que contenham informações - Cartões / Créditos - Créditos ou quando os cartões de extremidade do YouTube aparecem. Não para conclusões com informações - Gancho / Saudações - Trailers narrados para o próximo vídeo, saudações e despedidas. Não inclui seções que adicionam conteúdo adicional - Prévia / Resumo - Coleção de clips que mostram o que está para vir ou o que aconteceu no vídeo ou noutros vídeos de uma série, em que todas as informações são repetidas noutro local - Divagação / Piadas - Cenas tangenciais ou piadas que não são necessárias para entender o conteúdo principal do vídeo. Não inclui seções que fornecem contexto ou detalhes de fundo - Música: Seção de Não Música - Somente para uso em vídeos de música. Seções de vídeos de música sem música, que já não estão cobertas por outra categoria - Pular - Destacar - Pular patrocinador - Pular promoção - Pular interação - Pular para destacar - Pular introdução - Pular intermissão - Pular intermissão - Pular encerramento - Pular gancho - Pular visualização - Pular visualização - Ignorar recapitulação - Pular tangencial - Pular não-música - Pular segmento - Patrocinador ignorado - Auto-promoção ignorada - Lembrete irritante ignorado - Pulado para destacar - Introdução ignorada - Intermissão ignorada - Intermissão ignorada - Outro Ignorado - Gancho pulado - Pré-visualização ignorada - Pré-visualização ignorada - Resumo ignorado - Tangencial pulado - Pulou uma seção que não foi musica - Segmento não submetido ignorado - Ignorado vários segmentos - Pular automaticamente - Pular automaticamente uma vez - Mostrar um botão Ignorar - Mostrar na barra de busca - Desativado - Não é possível enviar segmento: %s - Patrocinador está temporariamente desligado - Não é possível enviar o segmento (estado: %1$d %2$s) - Không thể gửi phân đoạn. Bị giới hạn (quá nhiều từ cùng một người dùng hoặc IP) - Não é possível enviar o segmento: %s - "Không thể gửi phân đoạn. + Não mostrar novamente + Alterar comportamento do segmento + Patrocinador + Promoção paga, indicações pagas e anúncios diretos. Não para auto-promoção ou gritos gratuitos para causas/criadores/websites/produtos que eles gostam + Promover Despaid/Auto + Semelhante ao Sponsor, mas para promoções não pagas ou autopromoção. Inclui seções sobre mercadoria, doações ou informações sobre com quem eles colaboraram + Lembrete de interação (inscrever) + Um pequeno lembrete para curtir, assinar ou segui-los no meio do conteúdo. Se for longo ou sobre algo específico, deveria em vez disso estar sob auto-promoção + Destacar + A parte do vídeo que a maioria das pessoas está à procura + Animação de Intermissão/Introdução + Um intervalo sem conteúdo real. Pode ser uma pausa, moldura estática ou uma animação repetida. Não inclui transições que contenham informações + Cartões / Créditos + Créditos ou quando os cartões de extremidade do YouTube aparecem. Não para conclusões com informações + Gancho / Saudações + Trailers narrados para o próximo vídeo, saudações e despedidas. Não inclui seções que adicionam conteúdo adicional + Prévia / Resumo + Coleção de clips que mostram o que está para vir ou o que aconteceu no vídeo ou noutros vídeos de uma série, em que todas as informações são repetidas noutro local + Divagação / Piadas + Cenas tangenciais ou piadas que não são necessárias para entender o conteúdo principal do vídeo. Não inclui seções que fornecem contexto ou detalhes de fundo + Música: Seção de Não Música + Somente para uso em vídeos de música. Seções de vídeos de música sem música, que já não estão cobertas por outra categoria + Pular + Destacar + Pular patrocinador + Pular promoção + Pular interação + Pular para destacar + Pular introdução + Pular intermissão + Pular intermissão + Pular encerramento + Pular gancho + Pular visualização + Pular visualização + Ignorar recapitulação + Pular tangencial + Pular não-música + Pular segmento + Patrocinador ignorado + Auto-promoção ignorada + Lembrete irritante ignorado + Pulado para destacar + Introdução ignorada + Intermissão ignorada + Intermissão ignorada + Outro Ignorado + Gancho pulado + Pré-visualização ignorada + Pré-visualização ignorada + Resumo ignorado + Tangencial pulado + Pulou uma seção que não foi musica + Segmento não submetido ignorado + Ignorado vários segmentos + Pular automaticamente + Pular automaticamente uma vez + Mostrar um botão Ignorar + Mostrar na barra de busca + Desativado + Não é possível enviar segmento: %s + Patrocinador está temporariamente desligado + Não é possível enviar o segmento (estado: %1$d %2$s) + Không thể gửi phân đoạn. Bị giới hạn (quá nhiều từ cùng một người dùng hoặc IP) + Não é possível enviar o segmento: %s + "Không thể gửi phân đoạn. Đã tồn tại" - Segmento enviado com sucesso - - SponsorBlock temporariamente indisponível (API TimeOut) - Patrocinador temporariamente não disponível (status %d) - Patrocinador temporariamente não disponível - Não foi possível votar para segmento (API esgotou) - Não é possível votar para (%1$d %2$s) - Não foi possível votar: %s - Votar - Desaprovar - Alterar categoria - Não há segmentos para votar em - - %1$s para %2$s - Escolha a categoria do segmento - A categoria está desativada nas configurações. Habilite a categoria para enviar. - Novo segmento para Patrocinador - Definir %s como início ou fim de um novo segmento? - Início - Fim - Agora - Hora do início do segmento em - Tempo que o segmento termina em - Os tempos estão corretos? - "O segmento é de + Segmento enviado com sucesso + + SponsorBlock temporariamente indisponível (API TimeOut) + Patrocinador temporariamente não disponível (status %d) + Patrocinador temporariamente não disponível + Não foi possível votar para segmento (API esgotou) + Não é possível votar para (%1$d %2$s) + Não foi possível votar: %s + Votar + Desaprovar + Alterar categoria + Não há segmentos para votar em + + %1$s para %2$s + Escolha a categoria do segmento + A categoria está desativada nas configurações. Habilite a categoria para enviar. + Novo segmento para Patrocinador + Definir %s como início ou fim de um novo segmento? + Início + Fim + Agora + Hora do início do segmento em + Tempo que o segmento termina em + Os tempos estão corretos? + "O segmento é de %1$s para @@ -1292,47 +1291,47 @@ para (%3$s) Pronto para enviar?" - Iniciar deve ser antes do fim - Marcar dois locais na barra de tempo - Pré-visualizar o segmento e garantir que pula suavemente - Editar tempo de segmento manualmente - Você deseja editar o tempo para o início ou o fim do segmento? - Data inválida - Estatísticas - - As estatísticas não estão disponíveis temporariamente (API está em baixo) - A carregar... - Patrocinador está desativado - Seu nome de usuário: <b>%s</b> - Toque aqui para alterar seu nome de usuário - Não foi possível mudar o nome do usuário: %1$d %2$s - Usuário alterado com sucesso - Sua reputação é <b>%.2f</b> - Tu criaste <b>%s</b> segmentos - Toque aqui para ver seus segmentos - Placar do SponsorBlock - Você salvou pessoas de <b>%s</b> segmentos - Toque aqui para ver as estatísticas globais e os melhores colaboradores - Isso é <b>%s</b> de suas vidas.<br>Toque aqui para ver a tabela de classificação - Tu pulaste <b>%s</b> segmentos - Isso é <b>%s</b> - Redefinir o contador de segmentos ignorados? - %1$s horas %2$s minutos - %1$s minutos %2$s segundos - %s segundos - Opacidade: - Cor: - Sobre - sponsor.ajay.app - Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver downloads para outras plataformas - - - Fator de forma do layout - Padrão - Telemóvel - Tablet - Automotivo - "As alterações incluem: + Iniciar deve ser antes do fim + Marcar dois locais na barra de tempo + Pré-visualizar o segmento e garantir que pula suavemente + Editar tempo de segmento manualmente + Você deseja editar o tempo para o início ou o fim do segmento? + Data inválida + Estatísticas + + As estatísticas não estão disponíveis temporariamente (API está em baixo) + A carregar... + Patrocinador está desativado + Seu nome de usuário: <b>%s</b> + Toque aqui para alterar seu nome de usuário + Não foi possível mudar o nome do usuário: %1$d %2$s + Usuário alterado com sucesso + Sua reputação é <b>%.2f</b> + Tu criaste <b>%s</b> segmentos + Toque aqui para ver seus segmentos + Placar do SponsorBlock + Você salvou pessoas de <b>%s</b> segmentos + Toque aqui para ver as estatísticas globais e os melhores colaboradores + Isso é <b>%s</b> de suas vidas.<br>Toque aqui para ver a tabela de classificação + Tu pulaste <b>%s</b> segmentos + Isso é <b>%s</b> + Redefinir o contador de segmentos ignorados? + %1$s horas %2$s minutos + %1$s minutos %2$s segundos + %s segundos + Opacidade: + Cor: + Sobre + sponsor.ajay.app + Os dados são fornecidos pela API do SponsorBlock. Toque aqui para aprender mais e ver downloads para outras plataformas + + + Fator de forma do layout + Padrão + Telemóvel + Tablet + Automotivo + "As alterações incluem: Layout do tablet • As postagens da comunidade estão ocultas @@ -1340,329 +1339,329 @@ Layout do tablet Layout automotivo • Os Shorts são abertos no reprodutor normal • O feed é organizado por tópicos e canais" - - - Versão do Spoof app - Versão falsificada - Versão não falsificada - "Phiên bản ứng dụng sẽ được giả mạo thành phiên bản YouTube cũ hơn. + + + Versão do Spoof app + Versão falsificada + Versão não falsificada + "Phiên bản ứng dụng sẽ được giả mạo thành phiên bản YouTube cũ hơn. Điều này sẽ thay đổi giao diện và tính năng của ứng dụng, nhưng có thể xảy ra các tác dụng phụ không xác định. Nếu sau này tắt, bạn nên xóa dữ liệu ứng dụng để tránh lỗi UI." - Destaque de versão do app - 20.13.41 - Restaurar barra de ação de vídeo não recolhida - 20.05.46 - Restaurar funcionalidade de transcrição - 19.35.36 - Restaurar os icones antigos do reprodutor dos Shorts - 19.01.34 - Restaurar ícones antigos de navegação - - - Alterar página inicial - Padrão - Todas as assinaturas - Procurar canais - Cursos / Aprendizado - Explorar - Moda e Beleza - Jogos - Histórico - Biblioteca - Vídeos curtidos - Publicado - Filmes - Música - Notícias - Notificações - Listas de reprodução - Pesquisa - Compras - Shorts - Desportos - Inscrições - Tendências - Realidade virtual - Assistir depois - Seus clipes - Sempre alterar a página inicial - "A página inicial é sempre alterada + Destaque de versão do app + 20.13.41 - Restaurar barra de ação de vídeo não recolhida + 20.05.46 - Restaurar funcionalidade de transcrição + 19.35.36 - Restaurar os icones antigos do reprodutor dos Shorts + 19.01.34 - Restaurar ícones antigos de navegação + + + Alterar página inicial + Padrão + Todas as assinaturas + Procurar canais + Cursos / Aprendizado + Explorar + Moda e Beleza + Jogos + Histórico + Biblioteca + Vídeos curtidos + Publicado + Filmes + Música + Notícias + Notificações + Listas de reprodução + Pesquisa + Compras + Shorts + Desportos + Inscrições + Tendências + Realidade virtual + Assistir depois + Seus clipes + Sempre alterar a página inicial + "A página inicial é sempre alterada Limitação: Usar o botão voltar na barra de ferramentas pode não funcionar" - A página inicial é alterada apenas na inicialização do aplicativo - - - Desativar a retomada do player do Shorts - Desativar a retomada do player do Shorts - Shorts que o reprodutor continuará na inicialização do aplicativo - - - Abrir  Shorts com - Reprodutor de Shorts - Reprodução normal - Reprodução normal em ecrã cheia - - - Reprodução automática de Shorts - Shorts vão ser reproduzidos automaticamente - Shorts irão repetir - Reprodução automática de Shorts no fundo - Reprodução de fundo de Shorts irá reproduzir automaticamente - Reprodução de fundo de Shorts irá repetir - - - Minijogador - Altere o estilo do player minimizado no aplicativo - Tipo de minijogador - Desativado - Padrão - Mínimo - Tablet - Moderno 1 - Moderno 2 - Moderno 3 - Moderno 4 - Desativar cantos arredondados - Os cantos estão quadrados - Bordas são arredondadas - Ativar toque duplo e pinch para redimensionar - "Hành động chạm hai lần và thu phóng bằng cử chỉ được bật + A página inicial é alterada apenas na inicialização do aplicativo + + + Desativar a retomada do player do Shorts + Desativar a retomada do player do Shorts + Shorts que o reprodutor continuará na inicialização do aplicativo + + + Abrir  Shorts com + Reprodutor de Shorts + Reprodução normal + Reprodução normal em ecrã cheia + + + Reprodução automática de Shorts + Shorts vão ser reproduzidos automaticamente + Shorts irão repetir + Reprodução automática de Shorts no fundo + Reprodução de fundo de Shorts irá reproduzir automaticamente + Reprodução de fundo de Shorts irá repetir + + + Minijogador + Altere o estilo do player minimizado no aplicativo + Tipo de minijogador + Desativado + Padrão + Mínimo + Tablet + Moderno 1 + Moderno 2 + Moderno 3 + Moderno 4 + Desativar cantos arredondados + Os cantos estão quadrados + Bordas são arredondadas + Ativar toque duplo e pinch para redimensionar + "Hành động chạm hai lần và thu phóng bằng cử chỉ được bật • Chạm hai lần để tăng kích thước miniplayer • Chạm hai lần nữa để khôi phục kích thước ban đầu" - Ação de toque duplo e pinçar para redimensionar está desativado - Desativar arrastar e soltar - Arrastar e soltar está desativado - "Kéo và thả được bật + Ação de toque duplo e pinçar para redimensionar está desativado + Desativar arrastar e soltar + Arrastar e soltar está desativado + "Kéo và thả được bật Miniplayer có thể được kéo đến bất kỳ góc nào của màn hình" - Desativar gesto de arrastar horizontal - Gestos de arrastar horizontais desativados - "Cử chỉ kéo ngang được bật + Desativar gesto de arrastar horizontal + Gestos de arrastar horizontais desativados + "Cử chỉ kéo ngang được bật Miniplayer có thể được kéo ra khỏi màn hình sang trái hoặc phải" - Ocultar botões de sobreposição - Os botões de sobreposição estão ocultos - Os botões de sobreposição são mostrados - Ocultar botões de expandir e fechar - "Botões estão ocultos + Ocultar botões de sobreposição + Os botões de sobreposição estão ocultos + Os botões de sobreposição são mostrados + Ocultar botões de expandir e fechar + "Botões estão ocultos Deslize para expandir ou fechar" - Botões de expandir e fechar são visíveis - Ocultar subtextos - Subtextos estão ocultos - Subtextos são exibidos - Ocultar botões pular para frente e para trás - Pular para frente e para trás estão escondidos - Pular para frente e para trás são mostrados - Tamanho inicial - Inicial sobre o tamanho da ecrã, em píxeis - O tamanho do pixel deve estar entre %1$s e %2$s - Opacidade da sobreposição - Valor de opacidade entre 0-100, onde 0 é transparente - Opacidade da sobreposição de minijogador deve estar entre 0-100 - - - Ativar ecrã de carregamento do gradiente - Carregar ecrã terá um fundo em gradiente - Carregar ecrã terá um fundo sólido - Estilo da tela inicial - Cor - Preto e branco - Ativar a cor personalizada - Cor personalizada da barra de busca é visível - Cor original da barra de busca é visível - Cor personalizada da barra de progresso - A cor da barra de progresso - Cor personalizada de destaque da barra de progresso - A cor de destaque da barra de progresso - Valor de cor de seekbar inválido - - - YouTube ReVanced - YT ReVanced - YT - - - Logotipo do cabeçalho - Padrão - Normal - Premium - ReVanced - - ReVanced mínimo - Personalizado - - - Ignorar restrições de região de imagem - Usando imagem host yt4.ggpht.com - "Sử dụng máy chủ hình ảnh gốc + Botões de expandir e fechar são visíveis + Ocultar subtextos + Subtextos estão ocultos + Subtextos são exibidos + Ocultar botões pular para frente e para trás + Pular para frente e para trás estão escondidos + Pular para frente e para trás são mostrados + Tamanho inicial + Inicial sobre o tamanho da ecrã, em píxeis + O tamanho do pixel deve estar entre %1$s e %2$s + Opacidade da sobreposição + Valor de opacidade entre 0-100, onde 0 é transparente + Opacidade da sobreposição de minijogador deve estar entre 0-100 + + + Ativar ecrã de carregamento do gradiente + Carregar ecrã terá um fundo em gradiente + Carregar ecrã terá um fundo sólido + Estilo da tela inicial + Cor + Preto e branco + Ativar a cor personalizada + Cor personalizada da barra de busca é visível + Cor original da barra de busca é visível + Cor personalizada da barra de progresso + A cor da barra de progresso + Cor personalizada de destaque da barra de progresso + A cor de destaque da barra de progresso + Valor de cor de seekbar inválido + + + YouTube ReVanced + YT ReVanced + YT + + + Logotipo do cabeçalho + Padrão + Normal + Premium + ReVanced + + ReVanced mínimo + Personalizado + + + Ignorar restrições de região de imagem + Usando imagem host yt4.ggpht.com + "Sử dụng máy chủ hình ảnh gốc Bật tính năng này có thể sửa lỗi hình ảnh bị thiếu do bị chặn ở một số khu vực" - - - - Aba principal - - Guia Inscrições - - Aba você - Listas de reprodução e recomendações do reprodutor - Resultados da pesquisa - Miniaturas originais - DeArrow & Miniaturas originais - DeArrow & Ainda captura - Ainda captura - DeArrow - "O DeArrow fornece miniaturas coletivas para vídeos do YouTube. Essas miniaturas geralmente são mais relevantes do que aquelas fornecidas pelo YouTube + + + + Aba principal + + Guia Inscrições + + Aba você + Listas de reprodução e recomendações do reprodutor + Resultados da pesquisa + Miniaturas originais + DeArrow & Miniaturas originais + DeArrow & Ainda captura + Ainda captura + DeArrow + "O DeArrow fornece miniaturas coletivas para vídeos do YouTube. Essas miniaturas geralmente são mais relevantes do que aquelas fornecidas pelo YouTube Se ativado, os URLs dos vídeos serão enviados ao servidor da API e nenhum outro dado será enviado. Se um vídeo não tiver miniaturas DeArrow, as originais ou as capturas estáticas serão mostradas Toque aqui para saber mais sobre DeArrow" - Mostrar uma notificação flutuante se a API não estiver disponível - Toast é visível se o Derow não está disponível - Toast não é visível se o DeArrow não está disponível - Ponto final da API DeArrow - A URL do ponto de extremidade do cache de miniaturas Derow - Capturas em vídeo ainda - Ainda as capturas são tiradas do começo/meio/fim de cada vídeo. Estas imagens são construídas no YouTube e nenhuma API externa é usada - Usar capturas rápidas ainda - Usando a qualidade média ainda capturada. As miniaturas carregam mais rapidamente, mas transmissões ao vivo, não lançadas ou vídeos muito antigos podem exibir miniaturas em branco - Utilizar capturas fixas de alta qualidade - Tempo de vídeo para capturar ainda - Início do vídeo - Vídeo no meio - Fim do vídeo - - DeArrow não está disponível temporariamente (código de status: %s) - DeArrow não está disponível temporariamente - - - Exibir avisos de ReVanced - Os anúncios no arranque são mostrados - Os anúncios no arranque não são mostrados - Mostrar avisos na inicialização - Falha ao conectar ao provedor de avisos - Dispensar - - - Ativar vídeo em loop - O vídeo ficará em loop - O vídeo não ficará em loop - - - Mostrar botão de vídeo em loop - O botão é exibido - O botão não é exibido - Vídeo em loop está ativado - Vídeo em loop está desativado - - - Pausar em interrupção de áudio - A reprodução é pausada quando outro áudio toca (por exemplo, navegação) - O volume diminui quando outro áudio é reproduzido - - - Dimensões do dispositivo Spoof - "Kích thước thiết bị bị giả mạo + Mostrar uma notificação flutuante se a API não estiver disponível + Toast é visível se o Derow não está disponível + Toast não é visível se o DeArrow não está disponível + Ponto final da API DeArrow + A URL do ponto de extremidade do cache de miniaturas Derow + Capturas em vídeo ainda + Ainda as capturas são tiradas do começo/meio/fim de cada vídeo. Estas imagens são construídas no YouTube e nenhuma API externa é usada + Usar capturas rápidas ainda + Usando a qualidade média ainda capturada. As miniaturas carregam mais rapidamente, mas transmissões ao vivo, não lançadas ou vídeos muito antigos podem exibir miniaturas em branco + Utilizar capturas fixas de alta qualidade + Tempo de vídeo para capturar ainda + Início do vídeo + Vídeo no meio + Fim do vídeo + + DeArrow não está disponível temporariamente (código de status: %s) + DeArrow não está disponível temporariamente + + + Exibir avisos de ReVanced + Os anúncios no arranque são mostrados + Os anúncios no arranque não são mostrados + Mostrar avisos na inicialização + Falha ao conectar ao provedor de avisos + Dispensar + + + Ativar vídeo em loop + O vídeo ficará em loop + O vídeo não ficará em loop + + + Mostrar botão de vídeo em loop + O botão é exibido + O botão não é exibido + Vídeo em loop está ativado + Vídeo em loop está desativado + + + Pausar em interrupção de áudio + A reprodução é pausada quando outro áudio toca (por exemplo, navegação) + O volume diminui quando outro áudio é reproduzido + + + Dimensões do dispositivo Spoof + "Kích thước thiết bị bị giả mạo Chất lượng video cao hơn có thể được mở khóa nhưng bạn có thể gặp phải hiện tượng giật hình khi phát video, thời lượng pin kém hơn và các tác dụng phụ không xác định" - "Kích thước thiết bị không bị giả mạo + "Kích thước thiết bị không bị giả mạo Bật tính năng này có thể mở khóa chất lượng video cao hơn" - Habilitar isto pode causar travamentos na reprodução de vídeo, pior vida na bateria e efeitos colaterais desconhecidos. - - - Feedback háptico - Alterar feedback háptico - Desativar haptics dos capítulos - Haptics dos capítulos está desativado - Haptics dos capítulos está ativado - Desativar haptics de busca precisa - Haptics de busca precisa está desativado - Haptics de busca precisa está ativado - Desativar haptics de desfazer busca - Haptics de desfazer busca está desativado - Haptics de desfazer busca está ativado - Desativar zoom haptics - Zoom haptics está desativado - Zoom haptics está ativado - - - Se você alterou recentemente os detalhes de login da sua conta, desinstale e reinstale o MicroG. - - - Ignorar redirecionamentos de URL - Redirecionamentos de URL estão ignorados - Redirecionamentos de URL não estão ignorados - - - Abrir links no navegador - Abrindo links no navegador externo - Abrindo links no navegador no aplicativo - - - - Automático - Lembrar mudanças na qualidade do vídeo - Alterações de qualidade se aplicam a todos os vídeos - As alterações de qualidade só se aplicam ao vídeo atual - Mostrar aviso ao alterar a qualidade do vídeo - Um aviso é mostrado quando a qualidade de vídeo padrão é alterada - Um aviso não é mostrado quando a qualidade de vídeo padrão é alterada - Qualidade de vídeo predefinida na rede Wi-Fi - Qualidade de vídeo predefinida na rede móvel - Lembrar alterações na qualidade dos Shorts - As alterações de qualidade se aplicam a todos os Shorts - As alterações de qualidade se aplicam apenas ao Short atual - Qualidade predefinida dos Shorts na rede Wi-Fi - Qualidade predefinida dos Shorts na rede móvel - telemóvel - Wi-Fi - A qualidade predefinida %1$s foi alterada para: %2$s - Qualidade do Shorts %1$s alterada para: %2$s - - - Mostrar botão de diálogo de velocidade - O botão de diálogo de velocidade está exibido. Toque e segure para redefinir a velocidade de reprodução para o padrão - O botão de diálogo de velocidade não está exibido - - - Mostrar botão de qualidade de vídeo - O botão de qualidade de vídeo está exibido. Toque e segure para redefinir a qualidade para o padrão - O botão de qualidade de vídeo não está exibido - - - Menu personalizado de velocidade de reprodução - O menu de velocidade personalizado é exibido - O menu de velocidade personalizado não é mostrado - Restaurar menu antigo de velocidade de reprodução - Menu antigo de velocidade é exibido - Menu moderno de velocidade é exibido - Velocidade de reprodução personalizada - Adicionar ou alterar as velocidades de reprodução personalizadas - Tốc độ tùy chỉnh phải nhỏ hơn %s - Tốc độ phát lại tùy chỉnh không hợp lệ - Automático - Velocidade personalizada ao tocar e segurar - Velocidade de reprodução de 0 a 8 - - - Lembrar velocidade de reprodução - As mudanças de velocidade de reprodução aplicam-se a todos os vídeos - As mudanças de velocidade de reprodução só se aplicam ao vídeo atual - Mostrar aviso ao alterar a velocidade de reprodução - Um aviso é mostrado quando a velocidade de reprodução padrão é alterada - Uma mensagem não é exibida quando a velocidade de reprodução padrão é alterada - Velocidade de reprodução predefinida - Velocidade predefinida alterada para: %s - - - Desabilitar vídeo HDR - O vídeo HDR está desabilitado - O vídeo HDR está ativado - Forçar AVC (H.264) - O codec de vídeo é forçado para AVC (H.264) - O codec de vídeo é determinado automaticamente - "Benefícios: + Habilitar isto pode causar travamentos na reprodução de vídeo, pior vida na bateria e efeitos colaterais desconhecidos. + + + Feedback háptico + Alterar feedback háptico + Desativar haptics dos capítulos + Haptics dos capítulos está desativado + Haptics dos capítulos está ativado + Desativar haptics de busca precisa + Haptics de busca precisa está desativado + Haptics de busca precisa está ativado + Desativar haptics de desfazer busca + Haptics de desfazer busca está desativado + Haptics de desfazer busca está ativado + Desativar zoom haptics + Zoom haptics está desativado + Zoom haptics está ativado + + + Se você alterou recentemente os detalhes de login da sua conta, desinstale e reinstale o MicroG. + + + Ignorar redirecionamentos de URL + Redirecionamentos de URL estão ignorados + Redirecionamentos de URL não estão ignorados + + + Abrir links no navegador + Abrindo links no navegador externo + Abrindo links no navegador no aplicativo + + + + Automático + Lembrar mudanças na qualidade do vídeo + Alterações de qualidade se aplicam a todos os vídeos + As alterações de qualidade só se aplicam ao vídeo atual + Mostrar aviso ao alterar a qualidade do vídeo + Um aviso é mostrado quando a qualidade de vídeo padrão é alterada + Um aviso não é mostrado quando a qualidade de vídeo padrão é alterada + Qualidade de vídeo predefinida na rede Wi-Fi + Qualidade de vídeo predefinida na rede móvel + Lembrar alterações na qualidade dos Shorts + As alterações de qualidade se aplicam a todos os Shorts + As alterações de qualidade se aplicam apenas ao Short atual + Qualidade predefinida dos Shorts na rede Wi-Fi + Qualidade predefinida dos Shorts na rede móvel + telemóvel + Wi-Fi + A qualidade predefinida %1$s foi alterada para: %2$s + Qualidade do Shorts %1$s alterada para: %2$s + + + Mostrar botão de diálogo de velocidade + O botão de diálogo de velocidade está exibido. Toque e segure para redefinir a velocidade de reprodução para o padrão + O botão de diálogo de velocidade não está exibido + + + Mostrar botão de qualidade de vídeo + O botão de qualidade de vídeo está exibido. Toque e segure para redefinir a qualidade para o padrão + O botão de qualidade de vídeo não está exibido + + + Menu personalizado de velocidade de reprodução + O menu de velocidade personalizado é exibido + O menu de velocidade personalizado não é mostrado + Restaurar menu antigo de velocidade de reprodução + Menu antigo de velocidade é exibido + Menu moderno de velocidade é exibido + Velocidade de reprodução personalizada + Adicionar ou alterar as velocidades de reprodução personalizadas + Tốc độ tùy chỉnh phải nhỏ hơn %s + Tốc độ phát lại tùy chỉnh không hợp lệ + Automático + Velocidade personalizada ao tocar e segurar + Velocidade de reprodução de 0 a 8 + + + Lembrar velocidade de reprodução + As mudanças de velocidade de reprodução aplicam-se a todos os vídeos + As mudanças de velocidade de reprodução só se aplicam ao vídeo atual + Mostrar aviso ao alterar a velocidade de reprodução + Um aviso é mostrado quando a velocidade de reprodução padrão é alterada + Uma mensagem não é exibida quando a velocidade de reprodução padrão é alterada + Velocidade de reprodução predefinida + Velocidade predefinida alterada para: %s + + + Desabilitar vídeo HDR + O vídeo HDR está desabilitado + O vídeo HDR está ativado + Forçar AVC (H.264) + O codec de vídeo é forçado para AVC (H.264) + O codec de vídeo é determinado automaticamente + "Benefícios: • Pode melhorar a vida útil da bateria • Pode restaurar resoluções de vídeo ausentes em dispositivos mais antigos @@ -1671,182 +1670,182 @@ Limitações: • A reprodução de vídeo usará mais dados da internet do que VP9 ou AV1 • Vídeos HDR não usarão AVC • Alguns dispositivos não conseguem forçar AVC" - - - Mostrar menu de qualidade de vídeo avançado - O menu de qualidade de vídeo avançado é mostrado - O menu de qualidade de vídeo avançado não é mostrado - - - Habilitar o slide para procurar - Deslize para procurar está ativado - Deslize para procurar não está habilitado - - - Permitir Android VR AV1 - "O codec de vídeo é AVC (H.264), VP9 ou AV1 + + + Mostrar menu de qualidade de vídeo avançado + O menu de qualidade de vídeo avançado é mostrado + O menu de qualidade de vídeo avançado não é mostrado + + + Habilitar o slide para procurar + Deslize para procurar está ativado + Deslize para procurar não está habilitado + + + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 A reprodução pode gaguejar ou perder quadros" - O codec de vídeo é AVC (H.264) ou VP9 - "Ativar esta configuração pode usar descodificação AV1 por software. + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar descodificação AV1 por software. A reprodução de vídeo com AV1 pode apresentar soluços ou perder quadros." - Efeitos colaterais da falsificação - • Cliente experimental e pode parar de funcionar a qualquer momento - • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões - • O menu da faixa de áudio está faltando - • Nenhum codec de vídeo AV1 - • O volume estável não está disponível - • Vídeos infantis podem não ser reproduzidos quando desconectado ou no modo anônimo - - • Forçar áudio original não está disponível - Mostrar em Estatísticas para nerds - O tipo de cliente é mostrado em Estatísticas para nerds - O cliente está oculto em Estatísticas para nerds - - - - - YT Music ReVanced - Música ReVanced - Música - - - Sobre - Anúncios - Geral - Reprodutor - Diversos - - - Ocultar anúncios em vídeo - Anúncios em vídeo estão ocultos - Anúncios em vídeo estão exibidos - - - Ativar repetição permanente - Repetição permanente está ativada - Repetição permanente está desativada - - - Ocultar botão de transmissão - O botão de transmissão está oculto - O botão de transmissão está exibido - Ocultar botão de histórico - O botão de histórico está oculto - O botão de histórico está exibido - Ocultar botão de notificação - O botão de notificação está oculto - O botão de notificação está visível - Ocultar botão de pesquisa - O botão de pesquisa está oculto - O botão de pesquisa está visível - - - Ocultar barra de categorias - Barra de categorias está oculta - Barra de categorias está exibida - - - Alterar a cor do minitocador - A cor do minitocador corresponde à do reprodutor em tela cheia - O minitocador usa a cor padrão - - - Barra de navegação - Ocultar ou alterar botões da barra de navegação - - Ocultar Início - Botão Início está oculto - Botão Início está exibido - - Ocultar Curtos - Botão Amostras está oculto - Botão Amostras está exibido - - Ocultar Explorar - Botão Explorar está oculto - Botão Explorar está exibido - - Ocultar Biblioteca - Botão Biblioteca está oculto - Botão Biblioteca está exibido - - Ocultar Premium - Botão Fazer upgrade está oculto - Botão Fazer upgrade está exibido - Ocultar barra de navegação - Barra de navegação está oculta - Barra de navegação está exibida - Ocultar rótulos dos botões de navegação - Rótulos estão ocultos - Rótulos estão exibidos - - - Ocultar o rótulo \"Obter Music Premium\" - Rótulo está oculto - Rótulo está exibido - - - Ocultar botão de atualização - Botão está oculto - Botão está exibido - - - - - Bloquear anúncios de áudio - Anúncios de áudio estão bloqueados - Anúncios de áudio são desbloqueados - - - %s không khả dụng, quảng cáo có thể hiển thị. Thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. - %s trả về lỗi, quảng cáo có thể hiển thị. Thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. - Bloquear anúncios de vídeo incorporados - Desativado - Proxy luminoso - Proxy do PurpleAdBlock - - - Bloquear anúncios em vídeo - Anúncios de vídeo estão bloqueados - Anúncios de vídeo são desbloqueados - - - Mensagem eliminada - Mostrar mensagens eliminadas - Não exibir mensagens excluídas - Esconder mensagens excluídas atrás de um spoiler - Mostrar mensagens excluídas como texto ultrapassado - - - Automaticamente reivindicar Pontos do Canal - Os Pontos de Canal são reivindicados automaticamente - Os Pontos do Canal não são reivindicados automaticamente - - - - Ativar modo de depuração do Twitch - Modo de depuração da Twitch ativado (não recomendado) - Modo de depuração da Twitch está desativado - - - Configurações Avançadas - Sobre - Sobre o ReVanced - Bloqueio de Anúncios - Configurações de bloqueio de anúncios - Bate-papo - Configurações do chat - Diversos - Configurações diversas - Configurações gerais - Outras configurações - Anúncios do lado do cliente - Anúncios do servidor seguro - Registo de depuração - Os registos de depuração estão ativados - Os registos de depuração estão desativados - - + Efeitos colaterais da falsificação + • Cliente experimental e pode parar de funcionar a qualquer momento + • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões + • O menu da faixa de áudio está faltando + • Nenhum codec de vídeo AV1 + • O volume estável não está disponível + • Vídeos infantis podem não ser reproduzidos quando desconectado ou no modo anônimo + + • Forçar áudio original não está disponível + Mostrar em Estatísticas para nerds + O tipo de cliente é mostrado em Estatísticas para nerds + O cliente está oculto em Estatísticas para nerds + + + + + YT Music ReVanced + Música ReVanced + Música + + + Sobre + Anúncios + Geral + Reprodutor + Diversos + + + Ocultar anúncios em vídeo + Anúncios em vídeo estão ocultos + Anúncios em vídeo estão exibidos + + + Ativar repetição permanente + Repetição permanente está ativada + Repetição permanente está desativada + + + Ocultar botão de transmissão + O botão de transmissão está oculto + O botão de transmissão está exibido + Ocultar botão de histórico + O botão de histórico está oculto + O botão de histórico está exibido + Ocultar botão de notificação + O botão de notificação está oculto + O botão de notificação está visível + Ocultar botão de pesquisa + O botão de pesquisa está oculto + O botão de pesquisa está visível + + + Ocultar barra de categorias + Barra de categorias está oculta + Barra de categorias está exibida + + + Alterar a cor do minitocador + A cor do minitocador corresponde à do reprodutor em tela cheia + O minitocador usa a cor padrão + + + Barra de navegação + Ocultar ou alterar botões da barra de navegação + + Ocultar Início + Botão Início está oculto + Botão Início está exibido + + Ocultar Curtos + Botão Amostras está oculto + Botão Amostras está exibido + + Ocultar Explorar + Botão Explorar está oculto + Botão Explorar está exibido + + Ocultar Biblioteca + Botão Biblioteca está oculto + Botão Biblioteca está exibido + + Ocultar Premium + Botão Fazer upgrade está oculto + Botão Fazer upgrade está exibido + Ocultar barra de navegação + Barra de navegação está oculta + Barra de navegação está exibida + Ocultar rótulos dos botões de navegação + Rótulos estão ocultos + Rótulos estão exibidos + + + Ocultar o rótulo \"Obter Music Premium\" + Rótulo está oculto + Rótulo está exibido + + + Ocultar botão de atualização + Botão está oculto + Botão está exibido + + + + + Bloquear anúncios de áudio + Anúncios de áudio estão bloqueados + Anúncios de áudio são desbloqueados + + + %s không khả dụng, quảng cáo có thể hiển thị. Thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. + %s trả về lỗi, quảng cáo có thể hiển thị. Thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. + Bloquear anúncios de vídeo incorporados + Desativado + Proxy luminoso + Proxy do PurpleAdBlock + + + Bloquear anúncios em vídeo + Anúncios de vídeo estão bloqueados + Anúncios de vídeo são desbloqueados + + + Mensagem eliminada + Mostrar mensagens eliminadas + Não exibir mensagens excluídas + Esconder mensagens excluídas atrás de um spoiler + Mostrar mensagens excluídas como texto ultrapassado + + + Automaticamente reivindicar Pontos do Canal + Os Pontos de Canal são reivindicados automaticamente + Os Pontos do Canal não são reivindicados automaticamente + + + + Ativar modo de depuração do Twitch + Modo de depuração da Twitch ativado (não recomendado) + Modo de depuração da Twitch está desativado + + + Configurações Avançadas + Sobre + Sobre o ReVanced + Bloqueio de Anúncios + Configurações de bloqueio de anúncios + Bate-papo + Configurações do chat + Diversos + Configurações diversas + Configurações gerais + Outras configurações + Anúncios do lado do cliente + Anúncios do servidor seguro + Registo de depuração + Os registos de depuração estão ativados + Os registos de depuração estão desativados + + diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 990de9e82c..029ca32366 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -17,1252 +17,1251 @@ "First 'item' text Second \"item\" text" ---> - - - - Numele aplicației - - Personalizat - Pictograma aplicației - - ReVanced scalat - - Personalizat - - - Verificările au eșuat - Deschidere site oficial - Ignorare - <h5>Această aplicație nu pare să fie modificată de tine.</h5><br>Această aplicație ar putea să nu funcționeze corect, <b>ar putea fi dăunătoare sau chiar periculoasă de utilizat</b>.<br><br>Aceste verificări implică faptul că această aplicație este modificată anterior sau a fost obținută de la altcineva:<br><br><small>%1$s</small><br>Este recomandat cu tărie să <b>dezinstalați această aplicație și să o modificați singuri</b> pentru a vă asigura că utilizați o aplicație validată și sigură.<p><br>Dacă este ignorat, acest avertisment va fi afișat doar de două ori. - Patch-at de pe un alt dispozitiv - Nu este instalat de către ReVanced Manager - Patch-at acum mai mult de 10 minute - Patch-at acum %s zile în urmă - Data construirii APK-ului este coruptă - - - Notificare ReVanced - Istoricul de vizionare nu este salvat.<br><br>Cel mai probabil este cauzată de un DNS de blocare a anunțurilor sau de un proxy de rețea.<br><br>Pentru a remedia acest lucru, lista albă <b>s.youtube.com</b> sau pentru a opri toate blocantele DNS și proxy-urile. - Nu mai afișa - - - Setări - Sigur doriți să continuați? - Salvați - Resetare - Resetează culoarea - Culoare nevalidă - Repornire necesară - Reporniți aplicația pentru ca această modificare să aibă efect. - Repornire - Importare - Copiere - Setările ReVanced au fost resetate la valorile implicite - Au fost importate %d setări - Importare eșuată: %s - Caută în setări - Nu s-au găsit rezultate pentru „%s” - Încearcă un alt cuvânt cheie - Căutări recente - Eliminați din istoricul căutărilor? - Șterge istoricul căutărilor - Sigur doriți să ștergeți tot istoricul căutărilor? - Sfaturi de căutare - "• Atingeți o cale pentru a naviga la ea +--> + + + Numele aplicației + + Personalizat + Pictograma aplicației + + ReVanced scalat + + Personalizat + + + Verificările au eșuat + Deschidere site oficial + Ignorare + <h5>Această aplicație nu pare să fie modificată de tine.</h5><br>Această aplicație ar putea să nu funcționeze corect, <b>ar putea fi dăunătoare sau chiar periculoasă de utilizat</b>.<br><br>Aceste verificări implică faptul că această aplicație este modificată anterior sau a fost obținută de la altcineva:<br><br><small>%1$s</small><br>Este recomandat cu tărie să <b>dezinstalați această aplicație și să o modificați singuri</b> pentru a vă asigura că utilizați o aplicație validată și sigură.<p><br>Dacă este ignorat, acest avertisment va fi afișat doar de două ori. + Patch-at de pe un alt dispozitiv + Nu este instalat de către ReVanced Manager + Patch-at acum mai mult de 10 minute + Patch-at acum %s zile în urmă + Data construirii APK-ului este coruptă + + + Notificare ReVanced + Istoricul de vizionare nu este salvat.<br><br>Cel mai probabil este cauzată de un DNS de blocare a anunțurilor sau de un proxy de rețea.<br><br>Pentru a remedia acest lucru, lista albă <b>s.youtube.com</b> sau pentru a opri toate blocantele DNS și proxy-urile. + Nu mai afișa + + + Setări + Sigur doriți să continuați? + Salvați + Resetare + Resetează culoarea + Culoare nevalidă + Repornire necesară + Reporniți aplicația pentru ca această modificare să aibă efect. + Repornire + Importare + Copiere + Setările ReVanced au fost resetate la valorile implicite + Au fost importate %d setări + Importare eșuată: %s + Caută în setări + Nu s-au găsit rezultate pentru „%s” + Încearcă un alt cuvânt cheie + Căutări recente + Eliminați din istoricul căutărilor? + Șterge istoricul căutărilor + Sigur doriți să ștergeți tot istoricul căutărilor? + Sfaturi de căutare + "• Atingeți o cale pentru a naviga la ea • Apăsați lung pe o setare pentru a naviga la ea • Apăsați Enter pentru a salva o interogare de căutare în istoric • Căutarea ignoră majusculele/minusculele și punctuația • Setările părinte apar deasupra setărilor copil dezactivate" - Istoricul căutărilor este gol - Pentru a salva istoricul căutărilor, introduceți o interogare de căutare și apăsați Enter - Afișează istoricul căutărilor în setări - Se afișează istoricul căutărilor în setări - Istoricul căutărilor în setări nu este afișat - Afișați pictogramele de setări ReVanced - Pictogramele de setări sunt afișate - Pictogramele setărilor nu sunt afișate - Limba ReVanced - "Traducerile pentru unele limbi pot lipsi sau pot fi incomplete. + Istoricul căutărilor este gol + Pentru a salva istoricul căutărilor, introduceți o interogare de căutare și apăsați Enter + Afișează istoricul căutărilor în setări + Se afișează istoricul căutărilor în setări + Istoricul căutărilor în setări nu este afișat + Afișați pictogramele de setări ReVanced + Pictogramele de setări sunt afișate + Pictogramele setărilor nu sunt afișate + Limba ReVanced + "Traducerile pentru unele limbi pot lipsi sau pot fi incomplete. Pentru a traduce limbi noi sau pentru a îmbunătăți traducerile existente, vizitați translate.revanced.app" - Limba aplicației - Importă / Exportă - Import/Export setări ReVanced - - Utilizați versiunea <i>%s</i> a patch-urilor ReVanced - Notă - Această versiune este o pre-lansare și este posibil să întâmpinați probleme neașteptate - Link-uri oficiale - + Utilizați versiunea <i>%s</i> a patch-urilor ReVanced + Notă + Această versiune este o pre-lansare și este posibil să întâmpinați probleme neașteptate + Link-uri oficiale + - - - Setări GmsCore - Setări pentru GmsCore - - MicroG GmsCore nu este instalat. Instalați-l. - Acțiune necesară - "MicroG GmsCore nu are permisiunea de a rula în fundal. + + + Setări GmsCore + Setări pentru GmsCore + + MicroG GmsCore nu este instalat. Instalați-l. + Acțiune necesară + "MicroG GmsCore nu are permisiunea de a rula în fundal. Urmați ghidul \"Don't kill my app\" pentru telefonul dvs. și aplicați instrucțiunile pentru instalarea MicroG. Acest lucru este necesar pentru ca aplicația să funcționeze." - Deschide website - "Optimizările bateriei pentru MicroG GmsCore trebuie dezactivate pentru a preveni problemele. + Deschide website + "Optimizările bateriei pentru MicroG GmsCore trebuie dezactivate pentru a preveni problemele. Dezactivare optimizărilor bateriei pentru MicroG nu va afecta negativ utilizarea bateriei. Apăsați butonul continuare și permiteți modificările de optimizare." - Continuă - - - Falsifică fluxurile video - Falsifică fluxurile video ale clientului pentru a preveni problemele de redare - Spoof video stream-uri - "Fluxurile video sunt simulate + Continuă + + + Falsifică fluxurile video + Falsifică fluxurile video ale clientului pentru a preveni problemele de redare + Spoof video stream-uri + "Fluxurile video sunt simulate Dacă ești utilizator YouTube Premium, această setare ar putea să nu fie necesară" - "Fluxurile video nu sunt falsificate + "Fluxurile video nu sunt falsificate Redarea poate să nu funcționeze" - Dezactivarea acestei setări poate cauza probleme de redare. - Client implicit - - - Forțează limba audio originală - Folosind limba audio originală - Utilizează audio implicit - - Pentru a utiliza această funcție, modificați \"Falsificare fluxuri video\" la orice client, cu excepția Android Studio - - - Depanare - Activează sau dezactivează opțiunile de depanare - Jurnal depanare - Jurnalele de depanare sunt activate - Jurnalele de depanare sunt dezactivate - Urme stive de jurnal - Jurnalele depanării includ urmărirea stivelor - Jurnalele de depanare nu includ urmărirea stivelor - Arată toast la eroare ReVanced - Se afișează un toast dacă apare o eroare - Nu se afișează un toast dacă apare o eroare - "Oprirea toasturilor de eroare ascunde toate notificările de eroare ReVanced. + Dezactivarea acestei setări poate cauza probleme de redare. + Client implicit + + + Forțează limba audio originală + Folosind limba audio originală + Utilizează audio implicit + + Pentru a utiliza această funcție, modificați \"Falsificare fluxuri video\" la orice client, cu excepția Android Studio + + + Depanare + Activează sau dezactivează opțiunile de depanare + Jurnal depanare + Jurnalele de depanare sunt activate + Jurnalele de depanare sunt dezactivate + Urme stive de jurnal + Jurnalele depanării includ urmărirea stivelor + Jurnalele de depanare nu includ urmărirea stivelor + Arată toast la eroare ReVanced + Se afișează un toast dacă apare o eroare + Nu se afișează un toast dacă apare o eroare + "Oprirea toasturilor de eroare ascunde toate notificările de eroare ReVanced. Nu veți fi notificat de niciun eveniment neașteptat." - Exportare jurnale de depanare - Copiază jurnalele de depanare ReVanced în clipboard - Înregistrarea în jurnal de depanare este dezactivată - Nu au fost găsite jurnale - Jurnale copiate - Eșec la exportarea jurnalelor: %s - Șterge jurnalele de depanare - Șterge toate jurnalele de depanare ReVanced stocate - Jurnale șterse - Manager de funcții - Gestionați funcțiile booleene - Steaguri active (%d) - Steaguri blocate (%d) - Căutați steaguri... - Steaguri salvate - Steaguri resetate - Steaguri copiate în clipboard - Jurnal protocol buffer - Jurnalele de depanare includ bufferul de protocol - Jurnalele de depanare nu includ memoria tampon - "Activarea acestei setări va înregistra date suplimentare despre aspect, inclusiv textul de pe ecran pentru unele componente UI. + Exportare jurnale de depanare + Copiază jurnalele de depanare ReVanced în clipboard + Înregistrarea în jurnal de depanare este dezactivată + Nu au fost găsite jurnale + Jurnale copiate + Eșec la exportarea jurnalelor: %s + Șterge jurnalele de depanare + Șterge toate jurnalele de depanare ReVanced stocate + Jurnale șterse + Manager de funcții + Gestionați funcțiile booleene + Steaguri active (%d) + Steaguri blocate (%d) + Căutați steaguri... + Steaguri salvate + Steaguri resetate + Steaguri copiate în clipboard + Jurnal protocol buffer + Jurnalele de depanare includ bufferul de protocol + Jurnalele de depanare nu includ memoria tampon + "Activarea acestei setări va înregistra date suplimentare despre aspect, inclusiv textul de pe ecran pentru unele componente UI. Acest lucru poate ajuta la identificarea componentelor atunci când creați filtre personalizate. Cu toate acestea, activarea acestei opțiuni va înregistra și unele date ale utilizatorului, cum ar fi adresa dvs. IP." - - - Igienizează linkurile de partajare - Parametrul de interogare de urmărire este eliminat din linkurile partajate - Parametrul de interogare de urmărire nu este eliminat din linkurile partajate - Schimbați linkurile de partajare la youtube.com - Linkurile partajate utilizează youtube.com - Linkurile partajate utilizează music.youtube.com - - - Filtru personalizat - Ascunde componentele folosind filtre personalizate - Activează filtru personalizat - Filtrul personalizat este activat - Filtrul personalizat este dezactivat - Filtru personalizat - - Lista șirurilor constructorului traiectoriei componentei pentru filtrarea separată de o linie nouă - Filtru personalizat nevalid: %s - - - - - Despre - Reclame - Miniaturi alternative - Flux - Bară de progres - Controale glisare - Diverse - Restaurare meniuri setări vechi - Meniurile de setări vechi sunt afișate - Meniurile de setări vechi nu sunt afișate - - - Dezactivează redarea în fundal a Shorts - Redarea în fundal a Shorts este dezactivată - Redarea Shorts în fundal este activată - - - Ascundeți cardurile de album - Cardurile de album sunt ascunse - Cardurile de album sunt afișate - Ascunde cărțile artistului - Cartonaşele artistice sunt ascunse - Cardurile artistului sunt afișate - Ascunde raftul cipurilor - Raftul cipurilor este ascuns - Se afișează raftul cipurilor - Ascunde postările comunității - Posturile comunitare sunt ascunse - Posturile comunitare sunt afișate - Ascunde bannere compacte - Bannerele compacte sunt ascunse - Banner-ele compacte sunt afișate - Ascunde cardul extins - Cardul extins sub videoclipuri este ascuns - Cardul extins sub videoclipuri este afișat - Ascunderea butonului microfon plutitor - Butonul microfon plutitor din căutare este ascuns. - Butonul microfonului plutitor din căutare este afișat - Ascunde rafturile orizontale - "Rafturile orizontale sunt ascunse, cum ar fi: + + + Igienizează linkurile de partajare + Parametrul de interogare de urmărire este eliminat din linkurile partajate + Parametrul de interogare de urmărire nu este eliminat din linkurile partajate + Schimbați linkurile de partajare la youtube.com + Linkurile partajate utilizează youtube.com + Linkurile partajate utilizează music.youtube.com + + + Filtru personalizat + Ascunde componentele folosind filtre personalizate + Activează filtru personalizat + Filtrul personalizat este activat + Filtrul personalizat este dezactivat + Filtru personalizat + + Lista șirurilor constructorului traiectoriei componentei pentru filtrarea separată de o linie nouă + Filtru personalizat nevalid: %s + + + + + Despre + Reclame + Miniaturi alternative + Flux + Bară de progres + Controale glisare + Diverse + Restaurare meniuri setări vechi + Meniurile de setări vechi sunt afișate + Meniurile de setări vechi nu sunt afișate + + + Dezactivează redarea în fundal a Shorts + Redarea în fundal a Shorts este dezactivată + Redarea Shorts în fundal este activată + + + Ascundeți cardurile de album + Cardurile de album sunt ascunse + Cardurile de album sunt afișate + Ascunde cărțile artistului + Cartonaşele artistice sunt ascunse + Cardurile artistului sunt afișate + Ascunde raftul cipurilor + Raftul cipurilor este ascuns + Se afișează raftul cipurilor + Ascunde postările comunității + Posturile comunitare sunt ascunse + Posturile comunitare sunt afișate + Ascunde bannere compacte + Bannerele compacte sunt ascunse + Banner-ele compacte sunt afișate + Ascunde cardul extins + Cardul extins sub videoclipuri este ascuns + Cardul extins sub videoclipuri este afișat + Ascunderea butonului microfon plutitor + Butonul microfon plutitor din căutare este ascuns. + Butonul microfonului plutitor din căutare este afișat + Ascunde rafturile orizontale + "Rafturile orizontale sunt ascunse, cum ar fi: • Știri de ultimă oră • Continuă vizionarea • Explorează mai multe canale • Cele mai relevante • Cumpărături • Vizionează din nou" - Sertarele orizontale sunt afișate. - Ascunde raftul de imagini - Raftul de imagini în rezultatele căutării este ascuns - Raftul de imagini în rezultatele căutării este afișat - Ascunde cele mai recente postări - Ultimele postări sunt ascunse - Ultimele postări sunt afișate - Ascunde amestecul playlisturilor - Listele de redare mixte sunt ascunse - Amestecul listelor de redare este afișat - Ascunde secțiunea de filme - Secțiunea filmelor este ascunsă - Se afișează secțiunea Filme - - Ascunde butonul \'Notifică-mă\' - Butonul \"Anunță-mă\" este ascuns. - Butonul \"Anunță-mă\" este afișat. - Ascunde Playables - Playables sunt ascunse - Playables sunt afișate - - Ascunderea butonului „Afișează mai multe” - Butonul \"Afișează mai mult\" din rezultatele căutării este ascuns. - Butonul \"Afișează mai mult\" din rezultatele căutării este afișat. - Ascunde sondajele - Sondajele sunt ascunse - Sondajele sunt afișate - Ascunde raftul de bilete - Raftul de bilete este ascuns - Raftul de bilete este afișat - - Ascunde etichetele de recomandare video - Etichetele \"Utilizatorii au mai urmărit și\" și \"S-ar putea să-ți placă și\" din rezultatele căutării sunt ascunse. - Etichetele \"Utilizatorii au mai urmărit și\" și \"S-ar putea să-ți placă și\" din rezultatele căutării sunt afișate. - Ascunde distanțierul vizual - Distanțierul vizual este ascuns - Distanțierul vizual este afișat - - Ascunde Doodle-urile YouTube - Animația YouTube Doodles de pe logo este ascunsă. - Animația Doodles YouTube pe logo este afișată - "YouTube Doodles sunt afișate câteva zile în fiecare an. + Ascunderea butonului „Afișează mai multe” + Butonul \"Afișează mai mult\" din rezultatele căutării este ascuns. + Butonul \"Afișează mai mult\" din rezultatele căutării este afișat. + Ascunde sondajele + Sondajele sunt ascunse + Sondajele sunt afișate + Ascunde raftul de bilete + Raftul de bilete este ascuns + Raftul de bilete este afișat + + Ascunde etichetele de recomandare video + Etichetele \"Utilizatorii au mai urmărit și\" și \"S-ar putea să-ți placă și\" din rezultatele căutării sunt ascunse. + Etichetele \"Utilizatorii au mai urmărit și\" și \"S-ar putea să-ți placă și\" din rezultatele căutării sunt afișate. + Ascunde distanțierul vizual + Distanțierul vizual este ascuns + Distanțierul vizual este afișat + + Ascunde Doodle-urile YouTube + Animația YouTube Doodles de pe logo este ascunsă. + Animația Doodles YouTube pe logo este afișată + "YouTube Doodles sunt afișate câteva zile în fiecare an. Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare de ascundere este activată, atunci bara de filtre de sub bara de căutare va fi de asemenea ascunsă." - Ascunde bara de canal - Bara de canal este ascunsă - Bara de canal este afișată - Ascunde watermark canal - Watermark-ul este ascuns - Watermark-ul este afișat - Ascunderea casetei de tip crowdfunding - Caseta de tip crowdfunding este ascunsă - Caseta de tip crowdfunding este afișată - Ascunde casetele de urgenţă - Casetele de urgenţă sunt ascunse - Cutiile de urgenţă sunt afişate - Ascunde panourile de informaţii - Panouri de informații sunt ascunse - Panouri de informații sunt afișate - - Ascunde butonul Alătură-te - Butonul \"Devino membru\" este ascuns. - Butonul \"Devino membru\" este afișat. - Ascunde panourile medicale - Panouri medicale sunt ascunse - Panourile medicale sunt prezentate - Ascunde acțiunile rapide - Acțiunile rapide în ecran complet sunt ascunse - Acțiunile rapide în ecran complet sunt afișate - Ascunde videoclipurile similare - Videoclipurile similare în acțiunile rapide sunt ascunse - Videoclipurile similare în acțiunile rapide sunt afișate - Ascunde ghidurile comunității abonaților - Instrucțiunile comunității abonaților sunt ascunse - Recomandările comunității abonaților sunt afișate - Ascunde reacţiile cronologie - Reacţiile cronologice sunt ascunse - Reacţiile cronologice sunt evidenţiate - Ascundeți \"Rezumat video generat de AI\" - Secțiunea de rezumat video generată de AI este ascunsă - Secțiunea de rezumat video generată de AI este afișată - Ascunde Întreabă - Secțiunea Întreabă este ascunsă - Secțiunea Întreabă este afișată - Ascunde Atributele - Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt ascunse - Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt afișate - Ascunde Capitolele - Capitolul este ascuns - Capitolul este afișat - Ascunde „Cum a fost creat acest conținut” - Secțiunea Cum a fost creat acest conținut este ascunsă - Secțiunea Cum a fost creat acest conținut este afișată - Ascunde Puncte Hype - Punctele Hype sunt ascunse - Punctele Hype sunt afișate - Ascunde „Explorează podcastul” - Secțiunea Explorează podcastul este ascunsă - Secțiunea Explorează podcastul este afișată - Ascunde link-urile recomandate - Secțiunea de linkuri recomandate este ascunsă - Secțiunea de linkuri recomandate este afișată - Ascunde videoclipurile recomandate - Secțiunea de videoclipuri recomandate este ascunsă - Secțiunea de videoclipuri recomandate este afișată - Ascunde cardurile Info - Secţiunea carduri de informaţii este ascunsă - Secțiunea cartonașelor de informații este afișată - Ascunde „Concepte cheie” - Secțiunea Concepte cheie este ascunsă - Secțiunea Concepte cheie este afișată - Ascunde butonul de abonare - Butonul de abonare este ascuns - Butonul de abonare este afișat - Ascunde Transcriere - Secțiunea de transcriere este ascunsă - Secțiunea de Transcriere este afișată - Descriere video - Ascunde sau afișează componentele descrierii video - Bară de filtrare - Ascunde sau afișează bara de filtre în fluxuri, videoclipuri similare, rezultate ale căutării și istoricul vizionărilor - Ascunde în feeduri - Ascuns în feeduri - Afișat în feeduri - Ascunde în videoclipurile asociate - Ascuns în videoclipuri asemănătoare - Afișat în videoclipuri conexe - Ascunde în rezultatele căutării - Ascuns în rezultatele căutării - Afișat în rezultatele căutării - Ascunde în istoricul de vizionare - Ascuns în istoricul vizionărilor - Afișat în istoricul de vizionare - Pagina canalului - Ascunde sau afișează componentele paginii canalului - - Ascunde butonul Comunitate - Butonul Comunitate este ascuns - Butonul Comunitate este afișat - - Ascunde raftul „Pentru tine” - Raftul Pentru Tine este ascuns - Raftul Pentru Tine este afișat - - Ascunde butonul Alătură-te - Butonul Alătură-te este ascuns - Butonul Alătură-te este afișat - Ascunde previzualizarea linkurilor - Previzualizarea linkurilor este ascunsă - Previzualizarea linkurilor este afișată - Ascunde raftul membrilor - Raftul membrilor este ascuns - Raftul Membrilor este afișat - - Ascunde butonul Magazin - Butonul Magazin este ascuns - Butonul Magazin este afișat - - Ascunde butonul Abonează-te - Butonul Abonează-te este ascuns - Butonul Abonează-te este afișat - Comentarii - Ascunde sau afișează componentele secțiunii comentarii - Ascunde rezumatul chatului AI - Rezumatul chatului AI este ascuns - Rezumatul chatului AI este afișat - Ascunde rezumatul comentariilor cu IA - Rezumatul comentariilor AI este ascuns - Rezumatul comentariilor AI este afișat - Ascunde ghidurile canalului - Regulile canalului sunt ascunse - Regulile canalului sunt afișate - Ascunde antetul \"Comentarii de la membri\" - Antetul Comentarii de la membri este ascuns - Antetul Comentarii de la membri este afișat - Ascunde secțiunea comentarii - Secţiunea de comentarii este ascunsă - Secțiunea comentariilor este afișată - Ascunde regulile comunității - Ghidurile comunității sunt ascunse - Ghidurile comunității sunt afișate - Ascunde butonul \'Creare Short\' - Butonul Creează un Short este ascuns - Butonul Creează un Short este afișat - Ascunde butoanele Emoji și Marcaj temporal - Butoanele Emoji și Marcaj temporal sunt ascunse - Butoanele Emoji și Marcaj temporal sunt afișate - Ascunde previzualizarea comentariului - Previzualizarea comentariului este ascunsă - Previzualizarea comentariului este afișată - Ascunde butonul „Mulțumesc” - Butonul de multumire este ascuns - Butonul de multumire este afisat - Ascunde numărul de vizualizări - Numărul de vizualizări este ascuns în feed și în rezultatele căutării - Numărul de vizualizări este afișat în feed și în rezultatele căutării - - "Limitări:\n• Secțiunile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare numărul de vizualizări\n• Această funcție nu funcționează cu factorul de formă auto" - Ascunde ora de încărcare - Ora de încărcare este ascunsă în feed și în rezultatele căutării - Ora de încărcare este afișată în feed și în rezultatele căutării - - "Limitări: + Ascunde butonul Alătură-te + Butonul \"Devino membru\" este ascuns. + Butonul \"Devino membru\" este afișat. + Ascunde panourile medicale + Panouri medicale sunt ascunse + Panourile medicale sunt prezentate + Ascunde acțiunile rapide + Acțiunile rapide în ecran complet sunt ascunse + Acțiunile rapide în ecran complet sunt afișate + Ascunde videoclipurile similare + Videoclipurile similare în acțiunile rapide sunt ascunse + Videoclipurile similare în acțiunile rapide sunt afișate + Ascunde ghidurile comunității abonaților + Instrucțiunile comunității abonaților sunt ascunse + Recomandările comunității abonaților sunt afișate + Ascunde reacţiile cronologie + Reacţiile cronologice sunt ascunse + Reacţiile cronologice sunt evidenţiate + Ascundeți \"Rezumat video generat de AI\" + Secțiunea de rezumat video generată de AI este ascunsă + Secțiunea de rezumat video generată de AI este afișată + Ascunde Întreabă + Secțiunea Întreabă este ascunsă + Secțiunea Întreabă este afișată + Ascunde Atributele + Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt ascunse + Secțiunile Locuri recomandate, Jocuri, Muzică și Persoane menționate sunt afișate + Ascunde Capitolele + Capitolul este ascuns + Capitolul este afișat + Ascunde „Cum a fost creat acest conținut” + Secțiunea Cum a fost creat acest conținut este ascunsă + Secțiunea Cum a fost creat acest conținut este afișată + Ascunde Puncte Hype + Punctele Hype sunt ascunse + Punctele Hype sunt afișate + Ascunde „Explorează podcastul” + Secțiunea Explorează podcastul este ascunsă + Secțiunea Explorează podcastul este afișată + Ascunde link-urile recomandate + Secțiunea de linkuri recomandate este ascunsă + Secțiunea de linkuri recomandate este afișată + Ascunde videoclipurile recomandate + Secțiunea de videoclipuri recomandate este ascunsă + Secțiunea de videoclipuri recomandate este afișată + Ascunde cardurile Info + Secţiunea carduri de informaţii este ascunsă + Secțiunea cartonașelor de informații este afișată + Ascunde „Concepte cheie” + Secțiunea Concepte cheie este ascunsă + Secțiunea Concepte cheie este afișată + Ascunde butonul de abonare + Butonul de abonare este ascuns + Butonul de abonare este afișat + Ascunde Transcriere + Secțiunea de transcriere este ascunsă + Secțiunea de Transcriere este afișată + Descriere video + Ascunde sau afișează componentele descrierii video + Bară de filtrare + Ascunde sau afișează bara de filtre în fluxuri, videoclipuri similare, rezultate ale căutării și istoricul vizionărilor + Ascunde în feeduri + Ascuns în feeduri + Afișat în feeduri + Ascunde în videoclipurile asociate + Ascuns în videoclipuri asemănătoare + Afișat în videoclipuri conexe + Ascunde în rezultatele căutării + Ascuns în rezultatele căutării + Afișat în rezultatele căutării + Ascunde în istoricul de vizionare + Ascuns în istoricul vizionărilor + Afișat în istoricul de vizionare + Pagina canalului + Ascunde sau afișează componentele paginii canalului + + Ascunde butonul Comunitate + Butonul Comunitate este ascuns + Butonul Comunitate este afișat + + Ascunde raftul „Pentru tine” + Raftul Pentru Tine este ascuns + Raftul Pentru Tine este afișat + + Ascunde butonul Alătură-te + Butonul Alătură-te este ascuns + Butonul Alătură-te este afișat + Ascunde previzualizarea linkurilor + Previzualizarea linkurilor este ascunsă + Previzualizarea linkurilor este afișată + Ascunde raftul membrilor + Raftul membrilor este ascuns + Raftul Membrilor este afișat + + Ascunde butonul Magazin + Butonul Magazin este ascuns + Butonul Magazin este afișat + + Ascunde butonul Abonează-te + Butonul Abonează-te este ascuns + Butonul Abonează-te este afișat + Comentarii + Ascunde sau afișează componentele secțiunii comentarii + Ascunde rezumatul chatului AI + Rezumatul chatului AI este ascuns + Rezumatul chatului AI este afișat + Ascunde rezumatul comentariilor cu IA + Rezumatul comentariilor AI este ascuns + Rezumatul comentariilor AI este afișat + Ascunde ghidurile canalului + Regulile canalului sunt ascunse + Regulile canalului sunt afișate + Ascunde antetul \"Comentarii de la membri\" + Antetul Comentarii de la membri este ascuns + Antetul Comentarii de la membri este afișat + Ascunde secțiunea comentarii + Secţiunea de comentarii este ascunsă + Secțiunea comentariilor este afișată + Ascunde regulile comunității + Ghidurile comunității sunt ascunse + Ghidurile comunității sunt afișate + Ascunde butonul \'Creare Short\' + Butonul Creează un Short este ascuns + Butonul Creează un Short este afișat + Ascunde butoanele Emoji și Marcaj temporal + Butoanele Emoji și Marcaj temporal sunt ascunse + Butoanele Emoji și Marcaj temporal sunt afișate + Ascunde previzualizarea comentariului + Previzualizarea comentariului este ascunsă + Previzualizarea comentariului este afișată + Ascunde butonul „Mulțumesc” + Butonul de multumire este ascuns + Butonul de multumire este afisat + Ascunde numărul de vizualizări + Numărul de vizualizări este ascuns în feed și în rezultatele căutării + Numărul de vizualizări este afișat în feed și în rezultatele căutării + + "Limitări:\n• Secțiunile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare numărul de vizualizări\n• Această funcție nu funcționează cu factorul de formă auto" + Ascunde ora de încărcare + Ora de încărcare este ascunsă în feed și în rezultatele căutării + Ora de încărcare este afișată în feed și în rezultatele căutării + + "Limitări: • rafturile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare orele de încărcare • Această funcție nu funcționează cu factorul de formă auto" - Ascundeți conținutul cuvântului cheie - Ascundeți căutarea și hrănirea videoclipurilor folosind filtre de cuvinte cheie - Ascunde videoclipurile de acasă după cuvintele cheie - Videoclipurile din fila principală sunt filtrate de cuvinte cheie - Videoclipurile din fila principală nu sunt filtrate de cuvintele cheie - Ascunde rezultatele căutării după cuvinte cheie - Rezultatele căutării sunt filtrate după cuvintele cheie - Rezultatele căutării nu sunt filtrate de cuvinte cheie - Ascunde abonarea videoclipurilor după cuvintele-cheie - Videoclipurile din fila abonamente sunt filtrate de cuvinte cheie - Videoclipurile din fila abonamente nu sunt filtrate de cuvinte cheie - Cuvinte cheie de ascuns - - "Cuvinte cheie și expresii de ascuns, separate prin linii noi + "Cuvinte cheie și expresii de ascuns, separate prin linii noi Cuvintele cheie pot fi numele canalului sau orice text afișat în titlurile videoclipurilor Cuvintele cu litere mari în mijloc trebuie introduse cu majuscule (de exemplu: iPhone, TikTok, LeBlanc)" - Despre filtrarea cuvintelor cheie - "Rezultatele căutărilor pe pagina de pornire/Abonamente/Căutare sunt filtrate pentru a ascunde conținutul care se potrivește cu expresiile de cuvinte cheie + Despre filtrarea cuvintelor cheie + "Rezultatele căutărilor pe pagina de pornire/Abonamente/Căutare sunt filtrate pentru a ascunde conținutul care se potrivește cu expresiile de cuvinte cheie Limitări • Shorts nu pot fi ascunse după numele canalului • Este posibil ca anumite componente ale interfeței de utilizare să nu fie ascunse • Căutarea unui cuvânt cheie poate să nu afișeze rezultate" - Potrivește cuvinte întregi - - Înconjurarea unui cuvânt cheie/frază cu ghilimele va împiedica potrivirile parțiale ale titlurilor videoclipurilor și numelor de canale<br><br>De exemplu,<br><b>\"ai\"</b> va ascunde videoclipul: <b>Cum funcționează AI?</b><br>dar nu va ascunde: <b>What does fair use mean?</b> - - Nu se poate folosi cuvantul cheie: %s - Adaugă oferte pentru a utiliza cuvântul cheie: %s - Cuvântul-cheie are declarații contradictorii: %s - Cuvântul cheie este prea scurt și necesită oferte: %s - Cuvântul cheie va ascunde toate videoclipurile: %s - - - Ascunde raftul magazinului creatorului - Raftul magazinului creatorului de sub playerul video este ascuns. - Raftul magazinului creatorului sub playerul video este afișat - Ascunde bannerul magazinului de la finalul ecranului - Bannerul magazinului de pe ecranul final este ascuns. - Bannerul magazinului de pe ecranul final este afișat. - Ascunde reclame pe tot ecranul - "Reclamele pe tot ecranul sunt ascunse + Potrivește cuvinte întregi + + Înconjurarea unui cuvânt cheie/frază cu ghilimele va împiedica potrivirile parțiale ale titlurilor videoclipurilor și numelor de canale<br><br>De exemplu,<br><b>\"ai\"</b> va ascunde videoclipul: <b>Cum funcționează AI?</b><br>dar nu va ascunde: <b>What does fair use mean?</b> + + Nu se poate folosi cuvantul cheie: %s + Adaugă oferte pentru a utiliza cuvântul cheie: %s + Cuvântul-cheie are declarații contradictorii: %s + Cuvântul cheie este prea scurt și necesită oferte: %s + Cuvântul cheie va ascunde toate videoclipurile: %s + + + Ascunde raftul magazinului creatorului + Raftul magazinului creatorului de sub playerul video este ascuns. + Raftul magazinului creatorului sub playerul video este afișat + Ascunde bannerul magazinului de la finalul ecranului + Bannerul magazinului de pe ecranul final este ascuns. + Bannerul magazinului de pe ecranul final este afișat. + Ascunde reclame pe tot ecranul + "Reclamele pe tot ecranul sunt ascunse Această funcție este disponibilă numai pentru dispozitivele mai vechi" - Reclame pe ecran complet sunt afișate - - Ascunde reclamele pe tot ecranul funcționează doar cu dispozitive mai vechi - Ascunde reclamele generale - Anunțurile generale sunt ascunse - Anunțurile generale sunt afișate - Ascunde bannere de produse - Bannerele de marfă sunt ascunse - Bannerele de marfă sunt afișate - Ascunde eticheta promoției cu plată - Eticheta promoției plătite este ascunsă - Eticheta promoției plătite este afișată - Ascunde cardurile auto-sponsorizate - Cardurile sponsorizate automat sunt ascunse - Cardurile sponsorizate automat sunt afișate - Ascunde linkurile de cumpărături - Linkurile de cumpărături din descrierea videoclipului sunt ascunse. - Linkurile de cumpărături din descrierea video sunt afișate - Ascunde bannerul \"Vezi produse\" - Bannerul \"Vezi produse\" din suprapunerea video este ascuns. - Bannerul \"Vezi produse\" din suprapunerea video este afișat. - Ascunde rezultatele căutării web - Rezultatele căutării pe web sunt ascunse - Rezultatele căutării web sunt afișate - - - Ascunde promoțiile YouTube Premium - Promoțiile YouTube Premium sub video player sunt ascunse - Promoțiile YouTube Premium sub video player sunt afișate - - - Ascunde reclamele video - Anunțurile video sunt ascunse - Anunțurile video sunt afișate - - - URL copiat în clipboard - URL cu marcaj de timp copiat - Afișare buton copie URL - Butonul Copiază adresa URL a videoclipului este afișat. Atingeți pentru a copia adresa URL a videoclipului. Atingeți și mențineți apăsat pentru a copia cu marcajul temporal - Butonul Copiază adresa URL a videoclipului nu este afișat - Afișare buton copie marcaj URL - Butonul Copiază adresa URL cu marcaj temporal este afișat. Atingeți pentru a copia adresa URL a videoclipului cu marcajul temporal. Atingeți și mențineți apăsat pentru a copia fără marcajul temporal - Butonul Copiază adresa URL cu marcaj temporal nu este afișat - - - Eliminați dialogul discreționar al vizualizatorului - Dialogul va fi șters - Va fi afișat catalogul - Aceasta nu ocolește restricția de vârstă. O acceptă automat. - - - Dezactivează fereastra pop-up „Conectați-vă la televizor” - Pop-up-ul Conectare la televizor este dezactivat - Pop-up-ul Conectare la televizor este activat - - - Dezactivare omisiune capitol prin atingere dublă - Atingerea dublă nu va declanșa niciodată sărirea la capitolul următor/anterior - Atingerea dublă poate declanșa ocazional sărirea la capitolul următor/anterior - - - Descărcări externe - Setări pentru utilizarea unui downloader extern - Arată butonul extern de descărcare - Butonul de descărcare din player este afișat - Butonul de descărcare din player nu este afișat - - Suprascrie butonul de acțiune Descarcă - Butonul de Descărcare deschide downloader extern - Butonul de descărcare deschide downloader nativ în aplicație - Descărcător nume pachet - Numele pachetului aplicației dvs. de descărcare externă instalate - Introduceți numele pachetului - Altele - Aplicația nu este instalată - %s nu este instalat. Vă rugăm să-l instalaţi. - "Nu s-a găsit aplicația instalată cu numele pachetului: %s + Reclame pe ecran complet sunt afișate + + Ascunde reclamele pe tot ecranul funcționează doar cu dispozitive mai vechi + Ascunde reclamele generale + Anunțurile generale sunt ascunse + Anunțurile generale sunt afișate + Ascunde bannere de produse + Bannerele de marfă sunt ascunse + Bannerele de marfă sunt afișate + Ascunde eticheta promoției cu plată + Eticheta promoției plătite este ascunsă + Eticheta promoției plătite este afișată + Ascunde cardurile auto-sponsorizate + Cardurile sponsorizate automat sunt ascunse + Cardurile sponsorizate automat sunt afișate + Ascunde linkurile de cumpărături + Linkurile de cumpărături din descrierea videoclipului sunt ascunse. + Linkurile de cumpărături din descrierea video sunt afișate + Ascunde bannerul \"Vezi produse\" + Bannerul \"Vezi produse\" din suprapunerea video este ascuns. + Bannerul \"Vezi produse\" din suprapunerea video este afișat. + Ascunde rezultatele căutării web + Rezultatele căutării pe web sunt ascunse + Rezultatele căutării web sunt afișate + + + Ascunde promoțiile YouTube Premium + Promoțiile YouTube Premium sub video player sunt ascunse + Promoțiile YouTube Premium sub video player sunt afișate + + + Ascunde reclamele video + Anunțurile video sunt ascunse + Anunțurile video sunt afișate + + + URL copiat în clipboard + URL cu marcaj de timp copiat + Afișare buton copie URL + Butonul Copiază adresa URL a videoclipului este afișat. Atingeți pentru a copia adresa URL a videoclipului. Atingeți și mențineți apăsat pentru a copia cu marcajul temporal + Butonul Copiază adresa URL a videoclipului nu este afișat + Afișare buton copie marcaj URL + Butonul Copiază adresa URL cu marcaj temporal este afișat. Atingeți pentru a copia adresa URL a videoclipului cu marcajul temporal. Atingeți și mențineți apăsat pentru a copia fără marcajul temporal + Butonul Copiază adresa URL cu marcaj temporal nu este afișat + + + Eliminați dialogul discreționar al vizualizatorului + Dialogul va fi șters + Va fi afișat catalogul + Aceasta nu ocolește restricția de vârstă. O acceptă automat. + + + Dezactivează fereastra pop-up „Conectați-vă la televizor” + Pop-up-ul Conectare la televizor este dezactivat + Pop-up-ul Conectare la televizor este activat + + + Dezactivare omisiune capitol prin atingere dublă + Atingerea dublă nu va declanșa niciodată sărirea la capitolul următor/anterior + Atingerea dublă poate declanșa ocazional sărirea la capitolul următor/anterior + + + Descărcări externe + Setări pentru utilizarea unui downloader extern + Arată butonul extern de descărcare + Butonul de descărcare din player este afișat + Butonul de descărcare din player nu este afișat + + Suprascrie butonul de acțiune Descarcă + Butonul de Descărcare deschide downloader extern + Butonul de descărcare deschide downloader nativ în aplicație + Descărcător nume pachet + Numele pachetului aplicației dvs. de descărcare externă instalate + Introduceți numele pachetului + Altele + Aplicația nu este instalată + %s nu este instalat. Vă rugăm să-l instalaţi. + "Nu s-a găsit aplicația instalată cu numele pachetului: %s Verificați dacă numele pachetului este corect și dacă aplicația este instalată" - Numele pachetului nu poate fi gol - - - Dezactivează gestul de căutare precis - Gestul este dezactivat - Gestul este activat - - - Activează atingerea pentru a căuta - Atingeți pentru a activa căutarea - Atingerea pentru a căuta este dezactivată - - - Activează gestul de luminozitate - "Tragerea luminozității pe tot ecranul este activată + Numele pachetului nu poate fi gol + + + Dezactivează gestul de căutare precis + Gestul este dezactivat + Gestul este activat + + + Activează atingerea pentru a căuta + Atingeți pentru a activa căutarea + Atingerea pentru a căuta este dezactivată + + + Activează gestul de luminozitate + "Tragerea luminozității pe tot ecranul este activată Reglați luminozitatea glisând vertical pe partea stângă a ecranului" - Tragerea luminozității pe tot ecranul este dezactivată - Activare gest volum - "Glisarea volumului pe ecran complet este activată + Tragerea luminozității pe tot ecranul este dezactivată + Activare gest volum + "Glisarea volumului pe ecran complet este activată Reglați volumul glisând vertical pe partea dreaptă a ecranului" - Glisarea volumului pe ecran complet este dezactivată - Activează gestul de apăsare pentru a trage - Apăsarea pentru a trage este activată - Apăsarea pentru a trage este dezactivată - Activează feedback haptic - Vibrarea la atingere este activată - Vibrarea la atingere este dezactivată - Salvează și restaurează luminozitatea - Salvează și restaurează luminozitatea la ieșirea sau introducerea pe ecran complet - Nu salva și restabili luminozitatea la ieșirea din ecran complet - Activează gestul de luminozitate automată - Glisați în jos până la cea mai mică valoare a gestului de luminozitate activând luminozitatea automată - Glisarea în jos până la cea mai mică valoare nu activează luminozitatea automată - Automat - Expirare suprapunere glisare - Cantitatea de milisecunde suprapunerea este vizibilă - Opacitate suprapunere glisare - Valoare opacitate între 0-100 - Opacitatea glisării trebuie să fie între 0-100 - Culoarea luminozității suprapunerii glisante - Culoarea barei de progres pentru comenzile de luminozitate - Culoarea volumului suprapunerii glisante - Culoarea barei de progres pentru comenzile de volum - Dimensiune text suprapunere glisare - Dimensiunea textului pentru suprapunerea glisării între 1-30 - Dimensiunea textului trebuie să fie între 1-30 - Pragul mărimii glisării - Cantitatea de prag pentru a glisa - Sensibilitate glisare volum - Cât de mult se modifică volumul per glisare - Stil suprapunere glisare - Suprapunere orizontală - Suprapunere orizontală (minimală - sus) - Suprapunere orizontală (minimală - centru) - Suprapunere circulară - Suprapunere circulară (minimală) - Suprapunere verticală - Suprapunere verticală (minimală) - Activați glisarea pentru a schimba videoclipurile - Glisarea în modul pe ecran complet va trece la următorul/anteriorul videoclip - Glisarea în modul pe ecran complet nu va trece la următorul/anteriorul videoclip - - - Dezactivează subtitrările automate - Subtitrările Auto sunt dezactivate - Subtitrările Auto sunt activate - - - Butoane de acţiune - Ascunde sau arată butoanele sub videoclipuri - Dezactivați luminozitatea butonului Like and Subscribe - Butonul Like and Subscribe nu va străluci când este menționat - Butonul Like and Subscribe va străluci când este menționat - Ascunde Like și Dislike - Butoanele Like și Dislike sunt ascunse - Butoanele Like și Dislike sunt afișate - - Ascunde Partajarea - Butonul de distribuire este ascuns - Butonul Distribuie este afișat - - Ascunde \'Oprește anunțurile\' - Butonul de oprire a reclamelor este ascuns - Butonul de oprire a reclamelor este afișat - - Ascunde comentariile - Butonul de comentarii este ascuns - Butonul de comentarii este afișat - + Ascunde Partajarea + Butonul de distribuire este ascuns + Butonul Distribuie este afișat + + Ascunde \'Oprește anunțurile\' + Butonul de oprire a reclamelor este ascuns + Butonul de oprire a reclamelor este afișat + + Ascunde comentariile + Butonul de comentarii este ascuns + Butonul de comentarii este afișat + - Ascunde raportul - Butonul de raportare este ascuns - Butonul de raportare este afișat - - Ascunde Remix - Butonul Remix este ascuns - Butonul Remix este afișat - - Ascunde Descărcare - Butonul de descărcare este ascuns - Butonul Descărcare este afișat - + Ascunde Remix + Butonul Remix este ascuns + Butonul Remix este afișat + + Ascunde Descărcare + Butonul de descărcare este ascuns + Butonul Descărcare este afișat + - Ascunde Freamătul - Butonul de Hype este ascuns - Butonul Hype este afișat - - Ascundeți Promovare - Butonul de promovare este ascuns - Butonul de promovare este afișat - - Ascunde mulţumirile - Butonul de multumire este ascuns - Butonul de multumire este afisat - + Ascundeți Promovare + Butonul de promovare este ascuns + Butonul de promovare este afișat + + Ascunde mulţumirile + Butonul de multumire este ascuns + Butonul de multumire este afisat + - Ascunde \"Întreabă\" - Butonul Întreabă este ascuns - Butonul Întreabă este afișat - - Ascunde Clip - Butonul clip este ascuns - Butonul clipului este afișat - - Ascunde Magazinul - Butonul Magazin este ascuns - Butonul Magazin este afișat - - Ascunde Salvare - Butonul Salvare este ascuns - Butonul Salvare este afișat - - - Butoane de navigare - Ascunde sau modifică butoanele din bara de navigare - - Ascunde Acasa - Butonul Acasă este ascuns - Butonul Acasă este afișat - - Ascunde Shorts - Butonul Shorts este ascuns - Butonul Shorts este afișat - - Ascunde Creare - Butonul de creare este ascuns - Butonul Creare este afișat - - Ascunde abonamentele - Butonul Abonamente este ascuns - Butonul Abonamente este afișat - Ascunde notificările - Butonul Notificări este ascuns - Butonul Notificări este afișat - - Comutare creare cu notificări - "Butonul Creare este comutat cu butonul Notificări + Ascunde \"Întreabă\" + Butonul Întreabă este ascuns + Butonul Întreabă este afișat + + Ascunde Clip + Butonul clip este ascuns + Butonul clipului este afișat + + Ascunde Magazinul + Butonul Magazin este ascuns + Butonul Magazin este afișat + + Ascunde Salvare + Butonul Salvare este ascuns + Butonul Salvare este afișat + + + Butoane de navigare + Ascunde sau modifică butoanele din bara de navigare + + Ascunde Acasa + Butonul Acasă este ascuns + Butonul Acasă este afișat + + Ascunde Shorts + Butonul Shorts este ascuns + Butonul Shorts este afișat + + Ascunde Creare + Butonul de creare este ascuns + Butonul Creare este afișat + + Ascunde abonamentele + Butonul Abonamente este ascuns + Butonul Abonamente este afișat + Ascunde notificările + Butonul Notificări este ascuns + Butonul Notificări este afișat + + Comutare creare cu notificări + "Butonul Creare este comutat cu butonul Notificări Notă: Activarea acestei opțiuni ascunde, de asemenea, forțat reclamele video" - Butonul Creare nu este comutat cu butonul Notificări - "Dezactivarea acestei setări va dezactiva, de asemenea, blocarea anunțurilor pentru Shorts. + Butonul Creare nu este comutat cu butonul Notificări + "Dezactivarea acestei setări va dezactiva, de asemenea, blocarea anunțurilor pentru Shorts. Dacă modificarea acestei setări nu are efect, încercați să comutați la modul Incognito." - Ascunde etichetele butoanelor de navigare - Etichetele sunt ascunse - Etichetele sunt afișate - Dezactivează bara de stare translucidă - Bara de stare este opaca - Bara de stare este opaca sau translucida - Pe unele dispozitive, activarea acestei funcții poate schimba bara de navigare a sistemului în una transparentă. - Dezactivează bara de navigare translucidă deschisă - Bara de navigare în modul deschis este opacă - Bara de navigare în modul deschis este opaca sau translucida - Dezactivați bara translucidă închisă la culoare - Bara de navigare în modul întunecat este opacă - Bara de navigare în modul întunecat este opaca sau translucida - - - Meniu flyout - Ascunde sau arată elementele de meniu Flyout ale jucătorului - - Ascunde subtitrările - Meniul subtitrărilor este ascuns - Meniul de subtitrări este afișat - - Ascunde setări adiționale - Meniul de setări suplimentare este ascuns - Setările adiționale sunt afișate - - Ascunde temporizatorul de somn - Meniul cronometrului de somn este ascuns - Meniul cronometrului de somn este afișat - - Ascunde repetiție video - Meniul Repetă video este ascuns - Meniul cu buclă video este afișat - - Ascunde modul Ambient - Meniul modului Ambient este ascuns - Meniul modului ambiental este afișat - Ascunde volum stabil - Meniul de volum stabil este afișat - Meniul volumului stabil este ascuns - - Ascunde Ajutor & Feedback - Meniul Ajutor & Feedback este ascuns - Meniul Ajutor & Feedback este afișat - - Ascunde viteza de redare - Meniul vitezei de redare este ascuns - Meniul de redare a vitezei este afișat - - Ascunde ecranul de blocare - Meniul ecranului de blocare este ascuns - Meniul de blocare este afișat - - Ascunde Ascultă cu YouTube Music - Meniul Ascultă cu YouTube Music este ascuns - Meniul Ascultă cu YouTube Music este afișat - - Ascunde piesa audio - Meniul piesei audio este ascuns - Meniul piesei audio este afișat - + Ascunde subtitrările + Meniul subtitrărilor este ascuns + Meniul de subtitrări este afișat + + Ascunde setări adiționale + Meniul de setări suplimentare este ascuns + Setările adiționale sunt afișate + + Ascunde temporizatorul de somn + Meniul cronometrului de somn este ascuns + Meniul cronometrului de somn este afișat + + Ascunde repetiție video + Meniul Repetă video este ascuns + Meniul cu buclă video este afișat + + Ascunde modul Ambient + Meniul modului Ambient este ascuns + Meniul modului ambiental este afișat + Ascunde volum stabil + Meniul de volum stabil este afișat + Meniul volumului stabil este ascuns + + Ascunde Ajutor & Feedback + Meniul Ajutor & Feedback este ascuns + Meniul Ajutor & Feedback este afișat + + Ascunde viteza de redare + Meniul vitezei de redare este ascuns + Meniul de redare a vitezei este afișat + + Ascunde ecranul de blocare + Meniul ecranului de blocare este ascuns + Meniul de blocare este afișat + + Ascunde Ascultă cu YouTube Music + Meniul Ascultă cu YouTube Music este ascuns + Meniul Ascultă cu YouTube Music este afișat + + Ascunde piesa audio + Meniul piesei audio este ascuns + Meniul piesei audio este afișat + - "Meniul piste audio este ascuns + "Meniul piste audio este ascuns Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în \"Android No SDK\"" - - Ascunde ceas în VR - Vizionarea în meniul VR este ascunsă - Vizionați în meniul VR este afișat - Ascunde meniul de calitate video - Meniul calității video este ascuns - Meniul calității video este afișat - Ascunde subsol meniu calitate video - Subsolul meniului calităţii video este ascuns - Subsolul meniului calității video este afișat - - - Ascunde butonul Redare automată - Butonul Autoplay este ascuns - Butonul Auto-redare este afișat - - Ascunderea butonului Subtitrări - Butonul subtitrari este ascuns - Se afișează butonul de subtitrări - Ascunde butonul Distribuție - Butonul de distribuție este ascuns - Butonul de execuție este afișat - Ascunde fundalul controalelor playerului - Fundalul comenzilor playerului este ascuns - Fundalul comenzilor playerului este afișat - Ascunde butoanele Anterior & Următorul - Butoanele sunt ascunse - Butoanele sunt afișate - - - Ascunde cardurile ecranului final - Cardurile de pe ecranul de închidere sunt ascunse - Cardurile de închidere ecran sunt afișate - - - Dezactivați modul Ambient în ecran complet - Mod ambiental dezactivat - Mod Ambient activat - - - Ascunde cardurile cu informații - Cardurile de informații sunt ascunse - Cardurile de informații sunt afișate - - - Dezactivează animațiile cu numere de rulare - Numerele de rulare nu sunt animate - Numerele de rulare sunt animate - - - Ascunde bara de derulare a playerului video - Bara de căutare a playerului video este ascunsă - Se afișează bara de căutare a playerului video - - Ascunde bara de derulare a miniaturilor video - Bara de derulare a miniaturilor video este ascunsă - Bara de derulare a miniaturilor video este afișată - - - Player Shorts - Ascunde sau afișează componentele playerului Shorts - - Ascunde Shorts-urile din feedul Acasă. - Ascunse în feedul Acasă și în videoclipurile similare. - Afișate în feedul Acasă și în videoclipurile similare. - Ascunde Shorts în rezultatele căutării - Ascunse în rezultatele căutării - Afișat în rezultatele căutării - - Ascunde Shorts-urile din feedul Abonamente. - Ascunse în feedul Abonamente. - Afișate în feedul Abonamente. - Ascunde Shorts în istoricul vizionărilor - Ascuns în istoricul vizionărilor - Afișate în istoricul vizionărilor - Ascunde eticheta „Dublat automat” - Eticheta cu dublaj automat este ascunsă - Eticheta cu dublaj automat este afișată - Ascunde butonul „Cumpărați Super Mulțumiri” - Butonul \"Cumpără Super Mulțumiri\" este ascuns. - Butonul \"Cumpără Super Mulțumiri\" este afișat. - Ascunde butonul Efect - Butonul de efect este ascuns - Butonul de efect este afișat - Ascunde butonul „Ecran verde” - Butonul de ecran verde este ascuns - Butonul de ecran verde este afișat - Ascunde butonul hashtag - Butonul Hashtag este ascuns - Butonul Hashtag este afișat - - Ascunde butonul Alătură-te - Butonul de alăturare este ascuns - Butonul de alăturare este afișat - Ascunde previzualizarea live - Previzualizarea live este ascunsă - Previzualizarea live este afișată - Ascunde eticheta locației - Eticheta locației este ascunsă - Eticheta locației este afișată - Ascunde butonul „Postări noi” - Butonul Postări noi este ascuns - Butonul Postări noi este afișat - Ascunde butoanele de suprapunere din pauză - Butoanele de suprapunere întrerupte sunt ascunse - Butoanele de suprapunere întrerupte sunt afișate - Ascunde comentariul de previzualizare - Comentariul de previzualizare este ascuns - Previzualizarea comentariului este afișată - Ascunde butonul „Salvează muzică” - Butonul de salvare a muzicii este ascuns - Butonul de salvare a muzicii este afișat - Ascunde sugestiile de căutare - Sugestiile de căutare sunt ascunse - Sugestiile de căutare sunt afișate - Ascunde butonul Cumpără - Butonul magazinului este ascuns - Butonul magazinului este afișat - Ascunde autocolante - Stickerele sunt ascunse - Stickerele sunt afișate - Ascunde butonul Abonează-te - Butonul Abonare este ascuns - Butonul Abonare este afișat - Ascunde produsele etichetate - Produsele etichetate sunt ascunse - Produsele etichetate sunt afișate - Ascunde butonul Următor - Butonul următor este ascuns - Următorul buton este afișat - Ascunde butonul „Folosește acest sunet” - Butonul Folosește acest sunet este ascuns - Butonul Folosește acest sunet este afișat - Ascunde butonul „Folosește acest șablon” - Butonul Folosește acest șablon este ascuns - Butonul Folosește acest șablon este afișat - Ascunde animația fântână a butonului Like - Animaţia fântânii butoanelor este ascunsă - Animația fântânii butoanelor este afișată - Ascunde butonul Like - Butonul Like este ascuns - Butonul Like este afișat - Ascunde butonul Dislike - Butonul nu este ascuns - Butonul nu este afișat - Ascunde butonul Comentarii - Butonul de comentarii este ascuns - Butonul pentru comentarii este afișat - - Ascunde butonul Distribuie - Butonul de distribuire este ascuns - Butonul Distribuie este afișat - - Ascunde butonul Remix - Butonul Remix este ascuns - Butonul Remix este afișat - Ascunde butonul de sunet - Butonul de sunet este ascuns - Butonul de sunet este afișat - Ascunde panoul de informaţii - Panoul de informaţii este ascuns - Panoul de informații este afișat - Ascunde bara de canal - Bara de canal este ascunsă - Bara de canal este afișată - Ascunde titlul videoclipului - Titlul videoclipului este ascuns. - Titlul videoclipului este afișat. - Ascunde eticheta metadata sunet - Eticheta metadatelor sonore este ascunsă. - Eticheta metadatelor sonore este afișată. - Ascunde eticheta linkului video - Eticheta link-ului video este ascunsă - Eticheta link-ului video este afișată - Ascunde bara de navigare - Bara de navigare este ascunsă - Bara de navigare este afișată - - - Ascunde videoclipul sugerat de pe ecranul final - "Videoclipul sugerat de pe ecranul final este ascuns când redarea automată este oprită + + Ascunde ceas în VR + Vizionarea în meniul VR este ascunsă + Vizionați în meniul VR este afișat + Ascunde meniul de calitate video + Meniul calității video este ascuns + Meniul calității video este afișat + Ascunde subsol meniu calitate video + Subsolul meniului calităţii video este ascuns + Subsolul meniului calității video este afișat + + + Ascunde butonul Redare automată + Butonul Autoplay este ascuns + Butonul Auto-redare este afișat + + Ascunderea butonului Subtitrări + Butonul subtitrari este ascuns + Se afișează butonul de subtitrări + Ascunde butonul Distribuție + Butonul de distribuție este ascuns + Butonul de execuție este afișat + Ascunde fundalul controalelor playerului + Fundalul comenzilor playerului este ascuns + Fundalul comenzilor playerului este afișat + Ascunde butoanele Anterior & Următorul + Butoanele sunt ascunse + Butoanele sunt afișate + + + Ascunde cardurile ecranului final + Cardurile de pe ecranul de închidere sunt ascunse + Cardurile de închidere ecran sunt afișate + + + Dezactivați modul Ambient în ecran complet + Mod ambiental dezactivat + Mod Ambient activat + + + Ascunde cardurile cu informații + Cardurile de informații sunt ascunse + Cardurile de informații sunt afișate + + + Dezactivează animațiile cu numere de rulare + Numerele de rulare nu sunt animate + Numerele de rulare sunt animate + + + Ascunde bara de derulare a playerului video + Bara de căutare a playerului video este ascunsă + Se afișează bara de căutare a playerului video + + Ascunde bara de derulare a miniaturilor video + Bara de derulare a miniaturilor video este ascunsă + Bara de derulare a miniaturilor video este afișată + + + Player Shorts + Ascunde sau afișează componentele playerului Shorts + + Ascunde Shorts-urile din feedul Acasă. + Ascunse în feedul Acasă și în videoclipurile similare. + Afișate în feedul Acasă și în videoclipurile similare. + Ascunde Shorts în rezultatele căutării + Ascunse în rezultatele căutării + Afișat în rezultatele căutării + + Ascunde Shorts-urile din feedul Abonamente. + Ascunse în feedul Abonamente. + Afișate în feedul Abonamente. + Ascunde Shorts în istoricul vizionărilor + Ascuns în istoricul vizionărilor + Afișate în istoricul vizionărilor + Ascunde eticheta „Dublat automat” + Eticheta cu dublaj automat este ascunsă + Eticheta cu dublaj automat este afișată + Ascunde butonul „Cumpărați Super Mulțumiri” + Butonul \"Cumpără Super Mulțumiri\" este ascuns. + Butonul \"Cumpără Super Mulțumiri\" este afișat. + Ascunde butonul Efect + Butonul de efect este ascuns + Butonul de efect este afișat + Ascunde butonul „Ecran verde” + Butonul de ecran verde este ascuns + Butonul de ecran verde este afișat + Ascunde butonul hashtag + Butonul Hashtag este ascuns + Butonul Hashtag este afișat + + Ascunde butonul Alătură-te + Butonul de alăturare este ascuns + Butonul de alăturare este afișat + Ascunde previzualizarea live + Previzualizarea live este ascunsă + Previzualizarea live este afișată + Ascunde eticheta locației + Eticheta locației este ascunsă + Eticheta locației este afișată + Ascunde butonul „Postări noi” + Butonul Postări noi este ascuns + Butonul Postări noi este afișat + Ascunde butoanele de suprapunere din pauză + Butoanele de suprapunere întrerupte sunt ascunse + Butoanele de suprapunere întrerupte sunt afișate + Ascunde comentariul de previzualizare + Comentariul de previzualizare este ascuns + Previzualizarea comentariului este afișată + Ascunde butonul „Salvează muzică” + Butonul de salvare a muzicii este ascuns + Butonul de salvare a muzicii este afișat + Ascunde sugestiile de căutare + Sugestiile de căutare sunt ascunse + Sugestiile de căutare sunt afișate + Ascunde butonul Cumpără + Butonul magazinului este ascuns + Butonul magazinului este afișat + Ascunde autocolante + Stickerele sunt ascunse + Stickerele sunt afișate + Ascunde butonul Abonează-te + Butonul Abonare este ascuns + Butonul Abonare este afișat + Ascunde produsele etichetate + Produsele etichetate sunt ascunse + Produsele etichetate sunt afișate + Ascunde butonul Următor + Butonul următor este ascuns + Următorul buton este afișat + Ascunde butonul „Folosește acest sunet” + Butonul Folosește acest sunet este ascuns + Butonul Folosește acest sunet este afișat + Ascunde butonul „Folosește acest șablon” + Butonul Folosește acest șablon este ascuns + Butonul Folosește acest șablon este afișat + Ascunde animația fântână a butonului Like + Animaţia fântânii butoanelor este ascunsă + Animația fântânii butoanelor este afișată + Ascunde butonul Like + Butonul Like este ascuns + Butonul Like este afișat + Ascunde butonul Dislike + Butonul nu este ascuns + Butonul nu este afișat + Ascunde butonul Comentarii + Butonul de comentarii este ascuns + Butonul pentru comentarii este afișat + + Ascunde butonul Distribuie + Butonul de distribuire este ascuns + Butonul Distribuie este afișat + + Ascunde butonul Remix + Butonul Remix este ascuns + Butonul Remix este afișat + Ascunde butonul de sunet + Butonul de sunet este ascuns + Butonul de sunet este afișat + Ascunde panoul de informaţii + Panoul de informaţii este ascuns + Panoul de informații este afișat + Ascunde bara de canal + Bara de canal este ascunsă + Bara de canal este afișată + Ascunde titlul videoclipului + Titlul videoclipului este ascuns. + Titlul videoclipului este afișat. + Ascunde eticheta metadata sunet + Eticheta metadatelor sonore este ascunsă. + Eticheta metadatelor sonore este afișată. + Ascunde eticheta linkului video + Eticheta link-ului video este ascunsă + Eticheta link-ului video este afișată + Ascunde bara de navigare + Bara de navigare este ascunsă + Bara de navigare este afișată + + + Ascunde videoclipul sugerat de pe ecranul final + "Videoclipul sugerat de pe ecranul final este ascuns când redarea automată este oprită Redarea automată poate fi modificată în setările YouTube: Setări → Redare → Redare automată videoclipul următor" - Videoclipul sugerat de pe ecranul final este afișat - - - Ascunde suprapunerea videoclipurilor similare. - Suprapunerea videoclipurilor similare în ecran complet este ascunsă. - Suprapunerea videoclipurilor similare în ecran complet este afișată. - - - Ascunde marcajul temporal video - Marcajul de timp este ascuns - Ora este afișată - - - Ascunde panourile pop-up jucător - Panourile pop-up ale jucătorilor sunt ascunse - Panourile pop-up ale jucătorului sunt afișate - - - Ieșiți din modul ecran complet la sfârșitul videoclipului - Dezactivat - Portret - Peisaj - Portret și peisaj - - - Deschide videoclipurile în modul ecran complet - Videoclipuri deschide tot ecranul - Videoclipurile nu deschid tot ecranul - - - Opacitate suprapusă jucătorului - Valoarea Opacității între 0-100, unde 0 este transparent - Opacitatea suportată de jucător trebuie să fie între 0-100 - - - - Dislike-uri temporar indisponibile (API a expirat) - Dislike-uri indisponibile (status %d) - Nu există aprecieri negative disponibile (limită API client) - Dislike-uri indisponibile (%s) - - Reîncarcă videoclipul pentru a vota folosind Returnare YouTube Dislike - - Ascuns de proprietar - Dislike-urile sunt afișate - Dislike-urile nu sunt afișate - Arată displace pe scurtmetraje - "Aprecierile negative pe Shorts sunt afișate + Videoclipul sugerat de pe ecranul final este afișat + + + Ascunde suprapunerea videoclipurilor similare. + Suprapunerea videoclipurilor similare în ecran complet este ascunsă. + Suprapunerea videoclipurilor similare în ecran complet este afișată. + + + Ascunde marcajul temporal video + Marcajul de timp este ascuns + Ora este afișată + + + Ascunde panourile pop-up jucător + Panourile pop-up ale jucătorilor sunt ascunse + Panourile pop-up ale jucătorului sunt afișate + + + Ieșiți din modul ecran complet la sfârșitul videoclipului + Dezactivat + Portret + Peisaj + Portret și peisaj + + + Deschide videoclipurile în modul ecran complet + Videoclipuri deschide tot ecranul + Videoclipurile nu deschid tot ecranul + + + Opacitate suprapusă jucătorului + Valoarea Opacității între 0-100, unde 0 este transparent + Opacitatea suportată de jucător trebuie să fie între 0-100 + + + + Dislike-uri temporar indisponibile (API a expirat) + Dislike-uri indisponibile (status %d) + Nu există aprecieri negative disponibile (limită API client) + Dislike-uri indisponibile (%s) + + Reîncarcă videoclipul pentru a vota folosind Returnare YouTube Dislike + + Ascuns de proprietar + Dislike-urile sunt afișate + Dislike-urile nu sunt afișate + Arată displace pe scurtmetraje + "Aprecierile negative pe Shorts sunt afișate Limitare: Este posibil ca aprecierile negative să nu apară în modul incognito" - Aprecierile negative pe Shorts nu sunt afișate - Displace ca procentaj - Aprecierile negative sunt afișate ca procentaj - Aprecierile negative sunt afișate ca număr - - Buton Like compact - Buton de stilizat pentru lățime minimă - Buton asemănător pentru cel mai bun aspect - Afișați aprecierile estimate - Videoclipurile cu aprecieri dezactivate afișează un număr estimat de aprecieri - Aprecierile estimate nu sunt afișate - Arată un toast dacă API-ul nu este disponibil - Toast este afișat dacă Returnarea YouTube Dislike nu este disponibilă - Toast nu este afișat dacă Returnarea YouTube Dislike nu este disponibilă - Datele sunt furnizate de API-ul Returnare YouTube Dislike. Atinge aici pentru a afla mai multe - - ReturnYouTubeDislike statistici API ale acestui dispozitiv - Timp de răspuns API, medie - Timp de răspuns API, minim - Timp de răspuns API, maxim - Timpul de răspuns API, ultimul video - Dislike-uri temporar indisponibile - Limita ratei de client API este în vigoare - Preluarea de voturi API, numărul de apeluri - Nu s-au efectuat apeluri în rețea - %d apeluri prin rețea efectuate - Voturi pentru preluarea API, număr de timeout-uri - Niciun apel de rețea nu a expirat - %d apeluri de rețea au expirat - Limite de rată client API - Nici o limită pentru rata clientului - Limita ratei clientului a fost întâlnită de %d ori - %d milisecunde - - - Activează bara de căutare largă - Bara de căutare largă este activată - Bara de căutare largă este dezactivată - - - Permite miniaturi de înaltă calitate - Miniaturile din bara de afișare sunt de înaltă calitate - Miniaturile din bara de afișare sunt de calitate medie - "Acest lucru va restaura, de asemenea, miniaturile de la transmisiunile live care nu au miniaturi pentru bara de căutare. + Aprecierile negative pe Shorts nu sunt afișate + Displace ca procentaj + Aprecierile negative sunt afișate ca procentaj + Aprecierile negative sunt afișate ca număr + + Buton Like compact + Buton de stilizat pentru lățime minimă + Buton asemănător pentru cel mai bun aspect + Afișați aprecierile estimate + Videoclipurile cu aprecieri dezactivate afișează un număr estimat de aprecieri + Aprecierile estimate nu sunt afișate + Arată un toast dacă API-ul nu este disponibil + Toast este afișat dacă Returnarea YouTube Dislike nu este disponibilă + Toast nu este afișat dacă Returnarea YouTube Dislike nu este disponibilă + Datele sunt furnizate de API-ul Returnare YouTube Dislike. Atinge aici pentru a afla mai multe + + ReturnYouTubeDislike statistici API ale acestui dispozitiv + Timp de răspuns API, medie + Timp de răspuns API, minim + Timp de răspuns API, maxim + Timpul de răspuns API, ultimul video + Dislike-uri temporar indisponibile - Limita ratei de client API este în vigoare + Preluarea de voturi API, numărul de apeluri + Nu s-au efectuat apeluri în rețea + %d apeluri prin rețea efectuate + Voturi pentru preluarea API, număr de timeout-uri + Niciun apel de rețea nu a expirat + %d apeluri de rețea au expirat + Limite de rată client API + Nici o limită pentru rata clientului + Limita ratei clientului a fost întâlnită de %d ori + %d milisecunde + + + Activează bara de căutare largă + Bara de căutare largă este activată + Bara de căutare largă este dezactivată + + + Permite miniaturi de înaltă calitate + Miniaturile din bara de afișare sunt de înaltă calitate + Miniaturile din bara de afișare sunt de calitate medie + "Acest lucru va restaura, de asemenea, miniaturile de la transmisiunile live care nu au miniaturi pentru bara de căutare. Miniaturile barei de căutare vor folosi aceeași calitate ca și videoclipul curent. Această caracteristică funcționează cel mai bine cu o calitate video de 720p sau mai mică și atunci când se folosește o conexiune la internet foarte rapidă." - Restaurează miniaturile vechi din bara de căutare - Miniaturile din bara de căutare vor apărea deasupra barei de căutare - Miniaturile din bara de afișare vor apărea pe tot ecranul - - - Activează SponsorBlock - SponsorBlock este un sistem bazat pe crowdsourcing pentru a sări peste părțile enervante din videoclipurile de pe YouTube - Aspect - Arată butonul de votare - Butonul de vot este afișat - Butonul de vot nu este afișat - Utilizați aspectul pătrat - Butoanele și comenzile sunt pătrate - Butoanele și comenzile sunt rotunjite - - Utilizați butonul compact Skip - Omite butonul stilizat pentru lățimea minimă - Omite butonul stilizat pentru cel mai bun aspect - Ascunde automat butonul Skip - Omite ascunderea butonului după câteva secunde - Butonul Skip este afișat pentru întregul segment - Durata butonului de omitere - Cât timp să se afișeze butoanele „Omite” și „Omite la momentul cheie” înainte de a se ascunde automat - Afișează notificare toast de anulare a săriturii - Notificarea toast este afișată când un segment este sărit automat. Atingeți notificarea toast pentru a anula săritura - Notificarea pop-up nu este afișată - Durata notificării pop-up de omitere - Cât timp să se afișeze notificarea de anulare a omisiunii - 1 secundă - 2 secunde - 3 secunde - 4 secunde - 5 secunde - 6 secunde - 7 secunde - 8 secunde - 9 secunde - 10 secunde - Arată lungimea videoclipului fără segmente - Lungimea videoclipului fără toate segmentele este afișată pe bara de căutare - Lungimea completă a videoclipului afișată - Crearea de noi segmente - Afișează butonul Creează segment nou - Se afișează un nou buton segment - Creează un nou buton de segment nu este afișat - Ajustează noul pas al segmentului - Numărul de milisecunde butoanele de ajustare a timpului se mută la crearea de noi segmente - Valoarea trebuie să fie un număr pozitiv - Vezi ghidurile - Orientările conțin reguli și sugestii pentru crearea de noi segmente - Respectaţi recomandările - Citiți ghidurile SponsorBlock înainte de a crea noi segmente - Deja citite - Arată-mi - Generalități - Arată un toast dacă API-ul nu este disponibil - Toast este afișat dacă SponsorBlock nu este disponibil - Toast nu este afișat dacă SponsorBlock nu este disponibil - Activați omiterea peste urmărire - Lasa clasamentul SponsorBlock sa stie cat de mult timp este salvat. Un mesaj este trimis in clasament de fiecare data cand un segment este sarit - Omiterea numărului de urmărire nu este activată - Durata minimă a segmentului - Segmente mai scurte decat aceasta valoare (in secunde) nu vor fi afisate sau omise - Durată de timp invalidă - ID-ul dvs. privat de utilizator - Acesta trebuie să fie păstrat. Este ca o parolă și nu ar trebui împartășit cu nimeni. Daca cineva îl are, vă poate imita identitatea - Id-ul utilizatorului privat trebuie să aibă cel puțin 30 de caractere - Schimbă URL-ul API - SponsorBlocul de adresă utilizează pentru a efectua apeluri către server - Resetează URL-ul API - URL-ul API nu este valid - URL API schimbat - Importă/Exportă setări - Copiere - Configurația SponsorBlock JSON care poate fi importată/exportată către ReVanced și alte platforme SponsorBlock - Configurația SponsorBlock JSON care poate fi importată/exportată către ReVanced și alte platforme SponsorBlock. Asta include id-ul tău privat de utilizator. Asigură-te că împărtășești asta cu înțelepciune - Setări importate cu succes - Nu s-a putut importa: %s - Nu s-a putut exporta: %s - "Setările tale conțin un ID de utilizator SponsorBlock privat. + Restaurează miniaturile vechi din bara de căutare + Miniaturile din bara de căutare vor apărea deasupra barei de căutare + Miniaturile din bara de afișare vor apărea pe tot ecranul + + + Activează SponsorBlock + SponsorBlock este un sistem bazat pe crowdsourcing pentru a sări peste părțile enervante din videoclipurile de pe YouTube + Aspect + Arată butonul de votare + Butonul de vot este afișat + Butonul de vot nu este afișat + Utilizați aspectul pătrat + Butoanele și comenzile sunt pătrate + Butoanele și comenzile sunt rotunjite + + Utilizați butonul compact Skip + Omite butonul stilizat pentru lățimea minimă + Omite butonul stilizat pentru cel mai bun aspect + Ascunde automat butonul Skip + Omite ascunderea butonului după câteva secunde + Butonul Skip este afișat pentru întregul segment + Durata butonului de omitere + Cât timp să se afișeze butoanele „Omite” și „Omite la momentul cheie” înainte de a se ascunde automat + Afișează notificare toast de anulare a săriturii + Notificarea toast este afișată când un segment este sărit automat. Atingeți notificarea toast pentru a anula săritura + Notificarea pop-up nu este afișată + Durata notificării pop-up de omitere + Cât timp să se afișeze notificarea de anulare a omisiunii + 1 secundă + 2 secunde + 3 secunde + 4 secunde + 5 secunde + 6 secunde + 7 secunde + 8 secunde + 9 secunde + 10 secunde + Arată lungimea videoclipului fără segmente + Lungimea videoclipului fără toate segmentele este afișată pe bara de căutare + Lungimea completă a videoclipului afișată + Crearea de noi segmente + Afișează butonul Creează segment nou + Se afișează un nou buton segment + Creează un nou buton de segment nu este afișat + Ajustează noul pas al segmentului + Numărul de milisecunde butoanele de ajustare a timpului se mută la crearea de noi segmente + Valoarea trebuie să fie un număr pozitiv + Vezi ghidurile + Orientările conțin reguli și sugestii pentru crearea de noi segmente + Respectaţi recomandările + Citiți ghidurile SponsorBlock înainte de a crea noi segmente + Deja citite + Arată-mi + Generalități + Arată un toast dacă API-ul nu este disponibil + Toast este afișat dacă SponsorBlock nu este disponibil + Toast nu este afișat dacă SponsorBlock nu este disponibil + Activați omiterea peste urmărire + Lasa clasamentul SponsorBlock sa stie cat de mult timp este salvat. Un mesaj este trimis in clasament de fiecare data cand un segment este sarit + Omiterea numărului de urmărire nu este activată + Durata minimă a segmentului + Segmente mai scurte decat aceasta valoare (in secunde) nu vor fi afisate sau omise + Durată de timp invalidă + ID-ul dvs. privat de utilizator + Acesta trebuie să fie păstrat. Este ca o parolă și nu ar trebui împartășit cu nimeni. Daca cineva îl are, vă poate imita identitatea + Id-ul utilizatorului privat trebuie să aibă cel puțin 30 de caractere + Schimbă URL-ul API + SponsorBlocul de adresă utilizează pentru a efectua apeluri către server + Resetează URL-ul API + URL-ul API nu este valid + URL API schimbat + Importă/Exportă setări + Copiere + Configurația SponsorBlock JSON care poate fi importată/exportată către ReVanced și alte platforme SponsorBlock + Configurația SponsorBlock JSON care poate fi importată/exportată către ReVanced și alte platforme SponsorBlock. Asta include id-ul tău privat de utilizator. Asigură-te că împărtășești asta cu înțelepciune + Setări importate cu succes + Nu s-a putut importa: %s + Nu s-a putut exporta: %s + "Setările tale conțin un ID de utilizator SponsorBlock privat. ID-ul tău de utilizator este ca o parolă și nu ar trebui niciodată partajat." - Nu mai afișa - Schimbă comportamentul segmentului - Promoție plătită, recomandări plătite și reclame directe. Nu este pentru auto-promovare sau strigăte gratuite cauzelor/creatorilor/site-urilor web/produselor care le plac - Promovare neplătită/autopromovare - Similar cu Sponsor, cu excepția promovărilor neplătite sau proprii. Include secțiuni despre mărfuri, donații sau informații despre cu cine au colaborat - Reamintire interactiune (Abonati) - Un scurt memento pentru a vă plăcea, abonați sau urmăriți-le în mijlocul conținutului. Dacă este lung sau este vorba despre ceva specific, acesta ar trebui în schimb autopromovat - Evidențiere - Partea din video pe care majoritatea oamenilor o caută - Intermizare/Animație Intro - Un interval fără conținut real. Poate fi o pauză, un cadru static sau o repetare a animației. Nu include tranziții care conțin informații - Carduri finale / Credite - Credite sau atunci când apar cardurile Youtube . Nu sunt concluzii cu informaţii - Introducere / Salutări - Trailere narate pentru videoclipul următor, salutări și despărțiri. Nu include secțiuni care adaugă conținut suplimentar - Prezentare generală / Rezumat - Colecția de clipuri care arată ce se apropie sau ce s-a întâmplat în videoclip sau în alte videoclipuri dintr-o serie, unde toate informațiile sunt repetate în altă parte - Digresiune / Glume - Scene tangențiale sau glume care nu sunt necesare pentru a înțelege conținutul principal al videoclipului. Nu include secțiuni care oferă context sau detalii de fundal - Muzică: Secţiunea Non-Muzică - Doar pentru utilizare în videoclipuri. Secțiuni de videoclipuri fără muzică, care nu sunt deja acoperite de o altă categorie - Omitere - Evidențiere - Sari peste sponsor - Sari peste promoție - Omite interacțiunea - Sari la evidențiere - Sari peste introducere - Omitere intermisiune - Omitere intermisiune - Sari peste final - Omite introducerea - Sari peste previzualizare - Sari peste previzualizare - Sari peste recap - Omite tangenta - Omite non-muzica - Sari peste segment - Sponsor sărit - Auto-promoție sărită - Memento enervant sărit - Salt la evidențiere - Introducere sărită - Intermisiune sărită - Intermisiune sărită - Sutro sărit - Introducerea omisă - Previzualizare sărită - Previzualizare sărită - Amplasare sărită - Tangenta omisă - S-a sărit o secţiune non-muzică - Salt netrimis - Sărit mai multe segmente - Omiteți automat - Omiteți automat o dată - Afișați un buton Skip - Arată în bara de căutare - Dezactivează - Imposibil de trimis segmentul: %s - SponsorBlock este temporar oprit - Imposibil de trimis segmentul (stare: %1$d %2$s) - Nu se poate trimite segmentul. Rata limitată (prea multe de la același utilizator sau IP) - Nu se poate trimite segmentul: %s - "Nu se poate trimite segmentul. + Nu mai afișa + Schimbă comportamentul segmentului + Promoție plătită, recomandări plătite și reclame directe. Nu este pentru auto-promovare sau strigăte gratuite cauzelor/creatorilor/site-urilor web/produselor care le plac + Promovare neplătită/autopromovare + Similar cu Sponsor, cu excepția promovărilor neplătite sau proprii. Include secțiuni despre mărfuri, donații sau informații despre cu cine au colaborat + Reamintire interactiune (Abonati) + Un scurt memento pentru a vă plăcea, abonați sau urmăriți-le în mijlocul conținutului. Dacă este lung sau este vorba despre ceva specific, acesta ar trebui în schimb autopromovat + Evidențiere + Partea din video pe care majoritatea oamenilor o caută + Intermizare/Animație Intro + Un interval fără conținut real. Poate fi o pauză, un cadru static sau o repetare a animației. Nu include tranziții care conțin informații + Carduri finale / Credite + Credite sau atunci când apar cardurile Youtube . Nu sunt concluzii cu informaţii + Introducere / Salutări + Trailere narate pentru videoclipul următor, salutări și despărțiri. Nu include secțiuni care adaugă conținut suplimentar + Prezentare generală / Rezumat + Colecția de clipuri care arată ce se apropie sau ce s-a întâmplat în videoclip sau în alte videoclipuri dintr-o serie, unde toate informațiile sunt repetate în altă parte + Digresiune / Glume + Scene tangențiale sau glume care nu sunt necesare pentru a înțelege conținutul principal al videoclipului. Nu include secțiuni care oferă context sau detalii de fundal + Muzică: Secţiunea Non-Muzică + Doar pentru utilizare în videoclipuri. Secțiuni de videoclipuri fără muzică, care nu sunt deja acoperite de o altă categorie + Omitere + Evidențiere + Sari peste sponsor + Sari peste promoție + Omite interacțiunea + Sari la evidențiere + Sari peste introducere + Omitere intermisiune + Omitere intermisiune + Sari peste final + Omite introducerea + Sari peste previzualizare + Sari peste previzualizare + Sari peste recap + Omite tangenta + Omite non-muzica + Sari peste segment + Sponsor sărit + Auto-promoție sărită + Memento enervant sărit + Salt la evidențiere + Introducere sărită + Intermisiune sărită + Intermisiune sărită + Sutro sărit + Introducerea omisă + Previzualizare sărită + Previzualizare sărită + Amplasare sărită + Tangenta omisă + S-a sărit o secţiune non-muzică + Salt netrimis + Sărit mai multe segmente + Omiteți automat + Omiteți automat o dată + Afișați un buton Skip + Arată în bara de căutare + Dezactivează + Imposibil de trimis segmentul: %s + SponsorBlock este temporar oprit + Imposibil de trimis segmentul (stare: %1$d %2$s) + Nu se poate trimite segmentul. Rata limitată (prea multe de la același utilizator sau IP) + Nu se poate trimite segmentul: %s + "Nu se poate trimite segmentul. Există deja" - Segment trimis cu succes - - SponsorBlock temporar indisponibil (API a expirat) - SponsorBlock temporar indisponibil (status %d) - SponsorBlock temporar indisponibil - Imposibil de votat pentru segment (API a expirat) - Nu se poate vota pentru segment (stare: %1$d %2$s) - Nu se poate vota pentru segment: %s - Votează - Retrogradeaza - Schimbă categoria - Nu sunt segmente pentru a vota pentru - - %1$s până la %2$s - Alege categoria segmentului - Categoria este dezactivată în setări. Activați categoria pentru a trimite. - Segment de sponsorBlock nou - Setați %s ca început sau sfârșit al unui nou segment? - Sfârșit - Acum - Timpul în care segmentul începe la - Timpul în care segmentul se termină la - Sunt vremurile corecte? - "Segmentul este din + Segment trimis cu succes + + SponsorBlock temporar indisponibil (API a expirat) + SponsorBlock temporar indisponibil (status %d) + SponsorBlock temporar indisponibil + Imposibil de votat pentru segment (API a expirat) + Nu se poate vota pentru segment (stare: %1$d %2$s) + Nu se poate vota pentru segment: %s + Votează + Retrogradeaza + Schimbă categoria + Nu sunt segmente pentru a vota pentru + + %1$s până la %2$s + Alege categoria segmentului + Categoria este dezactivată în setări. Activați categoria pentru a trimite. + Segment de sponsorBlock nou + Setați %s ca început sau sfârșit al unui nou segment? + Sfârșit + Acum + Timpul în care segmentul începe la + Timpul în care segmentul se termină la + Sunt vremurile corecte? + "Segmentul este din %1$s până în @@ -1271,46 +1270,46 @@ până în (%3$s) Ești gata să trimiți?" - Începe trebuie să fie înainte de sfârșit - Marchează mai întâi două locații pe bara de timp - Previzualizați segmentul și asigurați-vă că sare fără probleme - Editați sincronizarea segmentului manual - Doriți să editați sincronizarea pentru începutul sau sfârșitul segmentului? - Oră nevalidă dată - Statistici - - Statisticile nu sunt disponibile temporar (API este defect) - Se încarcă... - SponsorBlock este dezactivat - Numele de utilizator: <b>%s</b> - Apasă aici pentru a-ți schimba numele de utilizator - Imposibil de modificat numele de utilizator: Stare: %1$d %2$s - Nume utilizator schimbat cu succes - Reputaţia ta este <b>%.2f</b> - Ați creat <b>%s</b> segmente - Apasă aici pentru a vedea segmentele tale - SponsorBlock clasament - Ai salvat persoane de la segmentele <b>%s</b> - Apăsați aici pentru a vedea statisticile globale și contribuitorii de top - Asta înseamnă <b>%s</b> din viața lor.<br>Apasă aici pentru a vedea clasamentul - Ați omis <b>%s</b> segmente - Asta înseamnă <b>%s</b> - Resetați contorul de segmente omis? - %1$s ore %2$s minute - %1$s minute %2$s secunde - %s secunde - Opacitate: - Culoare: - Despre - Datele sunt furnizate de API-ul SponsorBlock. Apasă aici pentru a afla mai multe și a vedea descărcările pentru alte platforme - - - Formatul aspectului formularului - Implicit - Telefon - Tabletă - Automatizări - "Modificările includ: + Începe trebuie să fie înainte de sfârșit + Marchează mai întâi două locații pe bara de timp + Previzualizați segmentul și asigurați-vă că sare fără probleme + Editați sincronizarea segmentului manual + Doriți să editați sincronizarea pentru începutul sau sfârșitul segmentului? + Oră nevalidă dată + Statistici + + Statisticile nu sunt disponibile temporar (API este defect) + Se încarcă... + SponsorBlock este dezactivat + Numele de utilizator: <b>%s</b> + Apasă aici pentru a-ți schimba numele de utilizator + Imposibil de modificat numele de utilizator: Stare: %1$d %2$s + Nume utilizator schimbat cu succes + Reputaţia ta este <b>%.2f</b> + Ați creat <b>%s</b> segmente + Apasă aici pentru a vedea segmentele tale + SponsorBlock clasament + Ai salvat persoane de la segmentele <b>%s</b> + Apăsați aici pentru a vedea statisticile globale și contribuitorii de top + Asta înseamnă <b>%s</b> din viața lor.<br>Apasă aici pentru a vedea clasamentul + Ați omis <b>%s</b> segmente + Asta înseamnă <b>%s</b> + Resetați contorul de segmente omis? + %1$s ore %2$s minute + %1$s minute %2$s secunde + %s secunde + Opacitate: + Culoare: + Despre + Datele sunt furnizate de API-ul SponsorBlock. Apasă aici pentru a afla mai multe și a vedea descărcările pentru alte platforme + + + Formatul aspectului formularului + Implicit + Telefon + Tabletă + Automatizări + "Modificările includ: Aspect tabletă • Postările comunității sunt ascunse @@ -1318,309 +1317,307 @@ Aspect tabletă Aspect auto • Shorts se deschid în playerul obișnuit • Fluxul este organizat pe teme și canale" - - - Falsifică versiunea aplicației - Versiune falsificată - Versiune neafectată - "Versiunea aplicației va fi falsificată la o versiune mai veche de YouTube. + + + Falsifică versiunea aplicației + Versiune falsificată + Versiune neafectată + "Versiunea aplicației va fi falsificată la o versiune mai veche de YouTube. Acest lucru va schimba aspectul și caracteristicile aplicației, dar pot apărea efecte secundare necunoscute. Dacă este dezactivat ulterior, se recomandă să ștergeți datele aplicației pentru a preveni erorile UI." - Țintă versiune falsificată a aplicației - 20.13.41 - Restabiliți bara de acțiune video necolapsată - 20.05.46 - Restaurare funcționalitate transcriere - 19.35.36 - Restaurează pictogramele vechi ale playerului Shorts - 19.01.34 - Restaurați pictogramele de navigare vechi - - - Schimbă pagina de start - Implicit - Toate abonamentele - Navigare canale - Cursuri / Învățare - Explorați - Modă și frumusețe - Joc - Istoric - Bibliotecă - Videoclipuri apreciate - Filme - Muzică - Știri - Notificări - Liste de redare - Caută - Cumpărături - Sport - Abonamente - Populare - Realitate virtuală - Urmărește mai târziu - Clipurile tale - Schimbă întotdeauna pagina de pornire - "Pagina de start este întotdeauna schimbată + Țintă versiune falsificată a aplicației + 20.13.41 - Restabiliți bara de acțiune video necolapsată + 20.05.46 - Restaurare funcționalitate transcriere + 19.35.36 - Restaurează pictogramele vechi ale playerului Shorts + 19.01.34 - Restaurați pictogramele de navigare vechi + + + Schimbă pagina de start + Implicit + Toate abonamentele + Navigare canale + Cursuri / Învățare + Explorați + Modă și frumusețe + Joc + Istoric + Bibliotecă + Videoclipuri apreciate + Filme + Muzică + Știri + Notificări + Liste de redare + Caută + Cumpărături + Sport + Abonamente + Populare + Realitate virtuală + Urmărește mai târziu + Clipurile tale + Schimbă întotdeauna pagina de pornire + "Pagina de start este întotdeauna schimbată Limitare: Utilizarea butonului Înapoi de pe bara de instrumente poate să nu funcționeze" - Pagina de pornire este schimbată doar la pornirea aplicației - - - Dezactivează reluarea playerului Shorts - Playerul Shorts nu va relua la pornirea aplicației - Scurtătura va fi reluată la pornirea aplicației - - - Deschide Shorts cu - Player Shorts - Player obișnuit - Player Obișnuit pe tot ecranul - - - Redare automată Shorts - Shorts-urile se vor reda automat - Shorts-urile se vor repeta - Redare automată Shorts în fundal - Redarea în fundal a Shorts-urilor se va reda automat - Redarea în fundal a Shorts-urilor se va repeta - - - Minijucător - Schimbă stilul playerului minimizat în aplicație - Tip minijucător - Dezactivat - Implicit - Minimă - Tabletă - Dezactivează colțurile rotunjite - Colţurile sunt pătrate - Colţurile sunt rotunjite - Activează dublu-click și prinde pentru a redimensiona - "Acțiunea de dublu tap și pinch to resize este activată + Pagina de pornire este schimbată doar la pornirea aplicației + + + Dezactivează reluarea playerului Shorts + Playerul Shorts nu va relua la pornirea aplicației + Scurtătura va fi reluată la pornirea aplicației + + + Deschide Shorts cu + Player Shorts + Player obișnuit + Player Obișnuit pe tot ecranul + + + Redare automată Shorts + Shorts-urile se vor reda automat + Shorts-urile se vor repeta + Redare automată Shorts în fundal + Redarea în fundal a Shorts-urilor se va reda automat + Redarea în fundal a Shorts-urilor se va repeta + + + Minijucător + Schimbă stilul playerului minimizat în aplicație + Tip minijucător + Dezactivat + Implicit + Minimă + Tabletă + Dezactivează colțurile rotunjite + Colţurile sunt pătrate + Colţurile sunt rotunjite + Activează dublu-click și prinde pentru a redimensiona + "Acțiunea de dublu tap și pinch to resize este activată • Dublu atingeți pentru a mări dimensiunea miniplayer-ului • Atingeți din nou de două ori pentru a restabili dimensiunea inițială" - Atingeți de două ori și redimensionarea este dezactivată - Dezactivează glisarea și plasarea - Drag and drop este dezactivat - "Drag and drop este activat + Atingeți de două ori și redimensionarea este dezactivată + Dezactivează glisarea și plasarea + Drag and drop este dezactivat + "Drag and drop este activat Miniplayerul poate fi tras în orice colț al ecranului" - Dezactivează gestul de glisare orizontală - Gest de tragere orizontal dezactivat - "Gestul de glisare orizontală este activat + Dezactivează gestul de glisare orizontală + Gest de tragere orizontal dezactivat + "Gestul de glisare orizontală este activat Miniplayerul poate fi tras pe ecran spre stânga sau spre dreapta" - Ascunde butoanele suprapuse - Butoanele suprapuse sunt ascunse - Butoanele suprapuse sunt afișate - Ascunde subtexte - Subtexte sunt ascunse - Subtexte sunt afișate - Ascunde butoanele de omitere înainte şi înapoi - Sari înainte și înapoi sunt ascunse - Sari înainte și înapoi sunt afișate - Mărimea iniţială - Dimensiunea inițială a ecranului, în pixeli - Dimensiunea pixelului trebuie să fie între %1$s și %2$s - Opacitatea suprapunerii - Valoarea Opacității între 0-100, unde 0 este transparent - Opacitatea miniplayer suprapusă trebuie să fie între 0-100 - - - Activează ecranul de încărcare gradient - Încărcarea ecranului va avea un fundal pentru gradient - Ecranul de încărcare va avea un fundal solid - Stil ecran de pornire - Culoare - Alb-negru - Activează culoarea barei de căutare personalizate - Culoarea personalizată a barei de căutare este afișată - Culoarea bara de căutare originală este afișată - Culoare personalizată a barei de căutare - Culoarea barei de derulare - Culoare personalizată a accentului barei de căutare - Culoarea de accent a barei de căutare - Valoare culoare bară căutare nevalidă - - - - - Siglă antet - Implicit - Normal - - ReVanced minimalist - Personalizat - - - Ignoră restricțiile regiunii imaginii - Utilizarea imaginii host yt4.ggpht.com - "Utilizarea gazdei originale a imaginii + Ascunde butoanele suprapuse + Butoanele suprapuse sunt ascunse + Butoanele suprapuse sunt afișate + Ascunde subtexte + Subtexte sunt ascunse + Subtexte sunt afișate + Ascunde butoanele de omitere înainte şi înapoi + Sari înainte și înapoi sunt ascunse + Sari înainte și înapoi sunt afișate + Mărimea iniţială + Dimensiunea inițială a ecranului, în pixeli + Dimensiunea pixelului trebuie să fie între %1$s și %2$s + Opacitatea suprapunerii + Valoarea Opacității între 0-100, unde 0 este transparent + Opacitatea miniplayer suprapusă trebuie să fie între 0-100 + + + Activează ecranul de încărcare gradient + Încărcarea ecranului va avea un fundal pentru gradient + Ecranul de încărcare va avea un fundal solid + Stil ecran de pornire + Culoare + Alb-negru + Activează culoarea barei de căutare personalizate + Culoarea personalizată a barei de căutare este afișată + Culoarea bara de căutare originală este afișată + Culoare personalizată a barei de căutare + Culoarea barei de derulare + Culoare personalizată a accentului barei de căutare + Culoarea de accent a barei de căutare + Valoare culoare bară căutare nevalidă + + + + Siglă antet + Implicit + Normal + + ReVanced minimalist + Personalizat + + + Ignoră restricțiile regiunii imaginii + Utilizarea imaginii host yt4.ggpht.com + "Utilizarea gazdei originale a imaginii Activarea acestei opțiuni poate remedia imaginile lipsă care sunt blocate în anumite regiuni" - - - - Fila \"Acasă\" - - Fila Abonamente - - Fila ta - Liste de redare player & recomandări - Rezultatele căutării - Miniaturi originale - Săgeată & Miniaturi originale - DeArrow & Capturi statice - Capturi statice - "DeArrow oferă miniaturi crowdsourced pentru videoclipurile de pe YouTube. Aceste miniaturi sunt adesea mai relevante decât cele oferite de YouTube + + + + Fila \"Acasă\" + + Fila Abonamente + + Fila ta + Liste de redare player & recomandări + Rezultatele căutării + Miniaturi originale + Săgeată & Miniaturi originale + DeArrow & Capturi statice + Capturi statice + "DeArrow oferă miniaturi crowdsourced pentru videoclipurile de pe YouTube. Aceste miniaturi sunt adesea mai relevante decât cele oferite de YouTube Dacă este activat, adresele URL ale videoclipurilor vor fi trimise la serverul API și nu vor fi trimise alte date. Dacă un videoclip nu are miniaturi DeArrow, atunci se afișează originalele sau capturile de ecran Atingeți aici pentru a afla mai multe despre DeArrow" - Arată un toast dacă API-ul nu este disponibil - Toast este afișat dacă DeArrow nu este disponibil - Toast nu este afișat dacă DeArrow nu este disponibil - Endpoint API DeArrow - URL-ul punctului final al cache-ului DeArrow pentru miniaturi - Capturi video statice - Capturile statice sunt preluate de la începutul/mijlocul/sfârșitul fiecărui videoclip. Aceste imagini sunt integrate în YouTube și nu se folosește nicio API externă - Folosește capturi rapide încă - Utilizând capturi statice de calitate medie. Miniaturile se vor încărca mai repede, dar videoclipurile live, nepublicate sau foarte vechi pot afișa miniaturi goale - Folosind calitate înaltă capturează încă - Timp video pentru a face capturi încă din - Începutul videoclipului - Mijloc video - Sfârșitul videoclipului - - DeArrow nu este disponibil temporar (cod de stare: %s) - DeArrow nu este disponibil temporar - - - Afișează anunțurile ReVanced - Anunțurile la pornire sunt afișate - Anunțurile la pornire nu sunt afișate - Afișare anunțuri la pornire - Conectarea la furnizorul de anunțuri a eșuat - Anulare - - - Activează bucla video - Videoclipul se va repeta în buclă - Videoclipul nu se va repeta în buclă - - - Afișează butonul de buclă video - Butonul este afișat - Butonul nu este afișat - Bucla video este activată - Bucla video este dezactivată - - - - - Spoul dimensiunilor dispozitivului - "Dimensiunile dispozitivului falsificate + Arată un toast dacă API-ul nu este disponibil + Toast este afișat dacă DeArrow nu este disponibil + Toast nu este afișat dacă DeArrow nu este disponibil + Endpoint API DeArrow + URL-ul punctului final al cache-ului DeArrow pentru miniaturi + Capturi video statice + Capturile statice sunt preluate de la începutul/mijlocul/sfârșitul fiecărui videoclip. Aceste imagini sunt integrate în YouTube și nu se folosește nicio API externă + Folosește capturi rapide încă + Utilizând capturi statice de calitate medie. Miniaturile se vor încărca mai repede, dar videoclipurile live, nepublicate sau foarte vechi pot afișa miniaturi goale + Folosind calitate înaltă capturează încă + Timp video pentru a face capturi încă din + Începutul videoclipului + Mijloc video + Sfârșitul videoclipului + + DeArrow nu este disponibil temporar (cod de stare: %s) + DeArrow nu este disponibil temporar + + + Afișează anunțurile ReVanced + Anunțurile la pornire sunt afișate + Anunțurile la pornire nu sunt afișate + Afișare anunțuri la pornire + Conectarea la furnizorul de anunțuri a eșuat + Anulare + + + Activează bucla video + Videoclipul se va repeta în buclă + Videoclipul nu se va repeta în buclă + + + Afișează butonul de buclă video + Butonul este afișat + Butonul nu este afișat + Bucla video este activată + Bucla video este dezactivată + + + + Spoul dimensiunilor dispozitivului + "Dimensiunile dispozitivului falsificate Calitățile video mai mari ar putea fi deblocate, dar este posibil să întâmpinați probleme cu redarea videoclipului, o durată de viață mai slabă a bateriei și efecte secundare necunoscute" - "Dimensiunile dispozitivului nu sunt falsificate + "Dimensiunile dispozitivului nu sunt falsificate Activarea acestei opțiuni poate debloca calități video mai mari" - Activarea acestei opțiuni poate provoca redare video care rulează, o durată de viață mai slabă a bateriei și efecte secundare necunoscute. - - - Feedback haptic - Schimbă feedback-ul haptic - Dezactivare haptics capitole - Haptics capitole este dezactivat - Haptics capitole este activat - Dezactivare haptics căutare precisă - Haptica precisă de căutare este dezactivată - Haptics căutare precisă este activat - Dezactivare haptics anulare căutare - Haptica de anulare a căutării este dezactivată - Haptica de anulare a căutării este activată - Dezactivare haptics zoom - Haptica zoom este dezactivată - Haptica zoom este activată - - - Dacă ți-ai schimbat recent detaliile de conectare la cont, dezinstalează și reinstalează MicroG. - - - Ignoră redirecționările adreselor URL - Redirecționările URL sunt ocolite - Redirecționările URL nu sunt ocolite - - - Deschide link-uri în browser - Deschiderea linkurilor în browserul extern - Deschiderea linkurilor în browserul din aplicație - - - - Automat - Memorează modificările calității video - Modificările de calitate se aplică tuturor videoclipurilor - Modificările de calitate se aplică numai video-ului curent - Afișați notificare rapidă la modificările calității video - O notificare rapidă este afișată când calitatea video implicită este modificată - O notificare rapidă nu este afișată când calitatea video implicită este modificată - Calitate video implicită în rețeaua Wi-Fi - Calitatea video implicită în rețeaua mobilă - Reține modificările calității pentru Shorts - Modificările de calitate se aplică tuturor Shorts - Modificările de calitate se aplică doar Shortului curent - Calitatea implicită a Shorts în rețeaua Wi-Fi - Calitatea implicită a Shorts în rețeaua mobilă - mobil - Wi-Fi - Calitate %1$s modificată implicit: %2$s - Calitatea Shorts %1$s a fost modificată la: %2$s - - - Arată butonul de dialog de viteză - Butonul dialogului Viteză este afișat. Atingeți și mențineți apăsat pentru a reseta viteza de redare la valoarea implicită - Butonul dialogului Viteză nu este afișat - - - Afișați butonul de calitate video - Butonul de calitate video este afișat. Atingeți și mențineți apăsat pentru a reseta calitatea la valoarea implicită - Butonul de calitate video nu este afișat - - - Meniu de redare personalizat - Meniul de viteză personalizat este afișat - Meniul de viteză personalizat nu este afișat - Restaurare meniu vechi de viteză de redare - Meniul vechi de viteză este afișat - Meniul modern de viteză este afișat - Viteze de redare personalizate - Adaugă sau modifică vitezele de redare personalizate - Vitezele personalizate trebuie să fie mai mici de %s - Viteze de redare personalizate nevalide - Automat - Viteză personalizată de apăsare și menținere - Viteză de redare între 0-8 - - - Memorează schimbările vitezei de redare - Schimbarea vitezei de redare se aplică tuturor videoclipurilor - Modificările vitezei de redare se aplică numai videoclipului curent - Afișați notificare rapidă la modificările vitezei de redare - O notificare rapidă este afișată când viteza de redare implicită este modificată - Un mesaj de tip toast nu se afișează când viteza de redare implicită este modificată - Viteza de redare implicită - Viteza implicită a fost modificată la: %s - - - Dezactivați videoclipurile HDR - Videoclipurile HDR sunt dezactivate - Videoclipurile HDR sunt activate - Forțare AVC (H.264) - Codec-ul video este forțat la AVC (H.264) - Codec-ul video este determinat automat - "Beneficii: + Activarea acestei opțiuni poate provoca redare video care rulează, o durată de viață mai slabă a bateriei și efecte secundare necunoscute. + + + Feedback haptic + Schimbă feedback-ul haptic + Dezactivare haptics capitole + Haptics capitole este dezactivat + Haptics capitole este activat + Dezactivare haptics căutare precisă + Haptica precisă de căutare este dezactivată + Haptics căutare precisă este activat + Dezactivare haptics anulare căutare + Haptica de anulare a căutării este dezactivată + Haptica de anulare a căutării este activată + Dezactivare haptics zoom + Haptica zoom este dezactivată + Haptica zoom este activată + + + Dacă ți-ai schimbat recent detaliile de conectare la cont, dezinstalează și reinstalează MicroG. + + + Ignoră redirecționările adreselor URL + Redirecționările URL sunt ocolite + Redirecționările URL nu sunt ocolite + + + Deschide link-uri în browser + Deschiderea linkurilor în browserul extern + Deschiderea linkurilor în browserul din aplicație + + + + Automat + Memorează modificările calității video + Modificările de calitate se aplică tuturor videoclipurilor + Modificările de calitate se aplică numai video-ului curent + Afișați notificare rapidă la modificările calității video + O notificare rapidă este afișată când calitatea video implicită este modificată + O notificare rapidă nu este afișată când calitatea video implicită este modificată + Calitate video implicită în rețeaua Wi-Fi + Calitatea video implicită în rețeaua mobilă + Reține modificările calității pentru Shorts + Modificările de calitate se aplică tuturor Shorts + Modificările de calitate se aplică doar Shortului curent + Calitatea implicită a Shorts în rețeaua Wi-Fi + Calitatea implicită a Shorts în rețeaua mobilă + mobil + Wi-Fi + Calitate %1$s modificată implicit: %2$s + Calitatea Shorts %1$s a fost modificată la: %2$s + + + Arată butonul de dialog de viteză + Butonul dialogului Viteză este afișat. Atingeți și mențineți apăsat pentru a reseta viteza de redare la valoarea implicită + Butonul dialogului Viteză nu este afișat + + + Afișați butonul de calitate video + Butonul de calitate video este afișat. Atingeți și mențineți apăsat pentru a reseta calitatea la valoarea implicită + Butonul de calitate video nu este afișat + + + Meniu de redare personalizat + Meniul de viteză personalizat este afișat + Meniul de viteză personalizat nu este afișat + Restaurare meniu vechi de viteză de redare + Meniul vechi de viteză este afișat + Meniul modern de viteză este afișat + Viteze de redare personalizate + Adaugă sau modifică vitezele de redare personalizate + Vitezele personalizate trebuie să fie mai mici de %s + Viteze de redare personalizate nevalide + Automat + Viteză personalizată de apăsare și menținere + Viteză de redare între 0-8 + + + Memorează schimbările vitezei de redare + Schimbarea vitezei de redare se aplică tuturor videoclipurilor + Modificările vitezei de redare se aplică numai videoclipului curent + Afișați notificare rapidă la modificările vitezei de redare + O notificare rapidă este afișată când viteza de redare implicită este modificată + Un mesaj de tip toast nu se afișează când viteza de redare implicită este modificată + Viteza de redare implicită + Viteza implicită a fost modificată la: %s + + + Dezactivați videoclipurile HDR + Videoclipurile HDR sunt dezactivate + Videoclipurile HDR sunt activate + Forțare AVC (H.264) + Codec-ul video este forțat la AVC (H.264) + Codec-ul video este determinat automat + "Beneficii: • Poate îmbunătăți durata de viață a bateriei • Poate restabili rezoluțiile video lipsă pe dispozitivele mai vechi @@ -1629,176 +1626,175 @@ Limitări: • Redarea video va utiliza mai multe date de internet decât VP9 sau AV1 • Videoclipurile HDR nu vor utiliza AVC • Unele dispozitive nu pot forța AVC" - - - Afișează meniul avansat de calitate video - Se afișează meniul avansat de calitate video - Nu se afișează meniul avansat de calitate video - - - Activează diapozitivul pentru a căuta - Slide pentru căutare este activat - Slide pentru a căuta nu este activat - - - Permite Android VR AV1 - "Codecul video este AVC (H.264), VP9 sau AV1 + + + Afișează meniul avansat de calitate video + Se afișează meniul avansat de calitate video + Nu se afișează meniul avansat de calitate video + + + Activează diapozitivul pentru a căuta + Slide pentru căutare este activat + Slide pentru a căuta nu este activat + + + Permite Android VR AV1 + "Codecul video este AVC (H.264), VP9 sau AV1 Redarea poate sacada sau pierde cadre" - Codecul video este AVC (H.264) sau VP9 - "Activarea acestei setări poate folosi decodarea software AV1. + Codecul video este AVC (H.264) sau VP9 + "Activarea acestei setări poate folosi decodarea software AV1. Redarea video cu AV1 poate sacada sau pierde cadre." - Efecte secundare ale simulării - • Client experimental și se poate opri din funcționare oricând - • Videoclipul se poate opri la 1:00, sau poate să nu fie disponibil în unele regiuni - • Meniul pistei audio lipsește - • Fara codec video AV1 - • Volumul stabil nu este disponibil - • Copiii nu pot urmări videoclipuri atunci când sunt deconectați sau în modul incognito - - • Forțarea sunetului original nu este disponibilă - Afișează în Statistici pentru pasionați - Tipul clientului este afișat în Statistici pentru pasionați - Clientul este ascuns în Statistici pentru pasionați - - - - - - - Despre - Anunțuri - Diverse - - - Ascunde anunțurile video - Anunțurile video sunt ascunse - Anunțurile video sunt afișate - - - Activează repetarea permanentă - Repetarea permanentă este activată - Repetarea permanentă este dezactivată - - - Ascunde butonul de transmisie - Butonul de transmisie este ascuns - Butonul de transmisie este afișat - Ascunde butonul de istoric - Butonul de istoric este ascuns - Butonul de istoric este afișat - Ascunde butonul de notificare - Butonul de notificare este ascuns - Butonul de notificare este afișat - Ascunde butonul de căutare - Butonul de căutare este ascuns - Butonul de căutare este afișat - - - Ascunde bara de categorii - Bara de categorii este ascunsă - Bara de categorii este afișată - - - Schimbă culoarea miniplayer-ului - Culoarea miniplayer-ului se potrivește cu player-ul pe ecran complet - Miniplayer-ul folosește culoarea implicită - - - Bară de navigare - Ascundeți sau modificați butoanele barei de navigare - - Ascunde Acasă - Butonul Acasă este ascuns - Butonul Acasă este afișat - - Ascunde Mostre - Butonul Mostre este ascuns - Butonul Mostre este afișat - - Ascundeți Explorare - Butonul Explorare este ascuns - Butonul Explorare este afișat - - Ascundeți Bibliotecă - Butonul Bibliotecă este ascuns - Butonul Bibliotecă este afișat - - Ascundeți Upgrade - Butonul Upgrade este ascuns - Butonul Upgrade este afișat - Ascundeți bara de navigare - Bara de navigare este ascunsă - Bara de navigare este afișată - Ascundeți etichetele butoanelor de navigare - Etichetele sunt ascunse - Etichetele sunt afișate - - - Ascunde eticheta „Obține Music Premium” - Eticheta este ascunsă - Eticheta este afișată - - - Ascunde butonul de upgrade - Butonul este ascuns - Butonul este afișat - - - - - Blochează reclamele audio - Anunţurile audio sunt blocate - Anunţurile audio sunt deblocate - - - %s indisponibil, este posibil să se afișeze reclame. Încercați să schimbați serviciul de blocare a reclamelor în setări. - %s a returnat o eroare, este posibil să se afișeze reclame. Încercați să schimbați serviciul de blocare a reclamelor în setări. - Blocare reclame video integrate - Dezactivat - Proxy luminos - Proxy PurpleAdBlock - - - Blocare reclame video - Anunțurile video sunt blocate - Anunţurile video sunt deblocate - - - Mesaj șters. - Arată mesajele șterse - Nu afișa mesajele șterse - Ascunde mesajele șterse în spatele unui spoiler - Arată mesajele șterse ca text interceptat - - - Solicită automat punctele canalului - Punctele canalului sunt revendicate automat - Punctele canalului nu sunt revendicate automat - - - - Activează modul de depanare Twitch - Modul de depanare Twitch este activat (nu este recomandat) - Modul de depanare Twitch este dezactivat - - - Setări ReVanced - Despre - Despre ReVanced - Blocare anunțuri - Setări blocare anunțuri - Setări chat - Diverse - Diverse setări - Setări generale - Alte setări - Reclame din partea clientului - Reclame surestream de pe server - Jurnal depanare - Jurnalele de depanare sunt activate - Jurnalele de depanare sunt dezactivate - - + Efecte secundare ale simulării + • Client experimental și se poate opri din funcționare oricând + • Videoclipul se poate opri la 1:00, sau poate să nu fie disponibil în unele regiuni + • Meniul pistei audio lipsește + • Fara codec video AV1 + • Volumul stabil nu este disponibil + • Copiii nu pot urmări videoclipuri atunci când sunt deconectați sau în modul incognito + + • Forțarea sunetului original nu este disponibilă + Afișează în Statistici pentru pasionați + Tipul clientului este afișat în Statistici pentru pasionați + Clientul este ascuns în Statistici pentru pasionați + + + + + + Despre + Anunțuri + Diverse + + + Ascunde anunțurile video + Anunțurile video sunt ascunse + Anunțurile video sunt afișate + + + Activează repetarea permanentă + Repetarea permanentă este activată + Repetarea permanentă este dezactivată + + + Ascunde butonul de transmisie + Butonul de transmisie este ascuns + Butonul de transmisie este afișat + Ascunde butonul de istoric + Butonul de istoric este ascuns + Butonul de istoric este afișat + Ascunde butonul de notificare + Butonul de notificare este ascuns + Butonul de notificare este afișat + Ascunde butonul de căutare + Butonul de căutare este ascuns + Butonul de căutare este afișat + + + Ascunde bara de categorii + Bara de categorii este ascunsă + Bara de categorii este afișată + + + Schimbă culoarea miniplayer-ului + Culoarea miniplayer-ului se potrivește cu player-ul pe ecran complet + Miniplayer-ul folosește culoarea implicită + + + Bară de navigare + Ascundeți sau modificați butoanele barei de navigare + + Ascunde Acasă + Butonul Acasă este ascuns + Butonul Acasă este afișat + + Ascunde Mostre + Butonul Mostre este ascuns + Butonul Mostre este afișat + + Ascundeți Explorare + Butonul Explorare este ascuns + Butonul Explorare este afișat + + Ascundeți Bibliotecă + Butonul Bibliotecă este ascuns + Butonul Bibliotecă este afișat + + Ascundeți Upgrade + Butonul Upgrade este ascuns + Butonul Upgrade este afișat + Ascundeți bara de navigare + Bara de navigare este ascunsă + Bara de navigare este afișată + Ascundeți etichetele butoanelor de navigare + Etichetele sunt ascunse + Etichetele sunt afișate + + + Ascunde eticheta „Obține Music Premium” + Eticheta este ascunsă + Eticheta este afișată + + + Ascunde butonul de upgrade + Butonul este ascuns + Butonul este afișat + + + + + Blochează reclamele audio + Anunţurile audio sunt blocate + Anunţurile audio sunt deblocate + + + %s indisponibil, este posibil să se afișeze reclame. Încercați să schimbați serviciul de blocare a reclamelor în setări. + %s a returnat o eroare, este posibil să se afișeze reclame. Încercați să schimbați serviciul de blocare a reclamelor în setări. + Blocare reclame video integrate + Dezactivat + Proxy luminos + Proxy PurpleAdBlock + + + Blocare reclame video + Anunțurile video sunt blocate + Anunţurile video sunt deblocate + + + Mesaj șters. + Arată mesajele șterse + Nu afișa mesajele șterse + Ascunde mesajele șterse în spatele unui spoiler + Arată mesajele șterse ca text interceptat + + + Solicită automat punctele canalului + Punctele canalului sunt revendicate automat + Punctele canalului nu sunt revendicate automat + + + + Activează modul de depanare Twitch + Modul de depanare Twitch este activat (nu este recomandat) + Modul de depanare Twitch este dezactivat + + + Setări ReVanced + Despre + Despre ReVanced + Blocare anunțuri + Setări blocare anunțuri + Setări chat + Diverse + Diverse setări + Setări generale + Alte setări + Reclame din partea clientului + Reclame surestream de pe server + Jurnal depanare + Jurnalele de depanare sunt activate + Jurnalele de depanare sunt dezactivate + + diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index fcf0dbef2a..af71023b8a 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -17,1273 +17,1272 @@ "First 'item' text Second \"item\" text" ---> - - - - Название приложения - - Кастомное - Иконка приложения - Оригинальная - ReVanced - - ReVanced минимальная - ReVanced масштабированная - - Кастомная - - - Проверки не удались - Открыть официальный веб-сайт - Игнорировать - <h5>Похоже, что это приложение пропатчено не Вами.</h5><br>Оно может работать неправильно, <b>быть вредным или даже опасным.</b>.<br><br>Эти проверки предполагают, что это приложение пропатчено или получено от кого-то другого:<br><br><small>%1$s</small><br>Настоятельно рекомендуется <b>удалить это приложение и пропатчить его самостоятельно,</b> чтобы быть уверенным, что Вы используете проверенное и безопасное приложение.<p><br>Если проигнорировать это предупреждение, оно будет показано только дважды. - Пропатчено на другом устройстве - Установлено не через ReVanced Manager - Пропатчено более 10 минут назад - Пропатчено %s дней назад - Дата сборки APK повреждена - - - Уведомление ReVanced - Ваша история просмотра не сохраняется.<br><br>Вероятнее всего это вызвано DNS блокировщиком рекламы или сетевым прокси.<br><br>Чтобы это исправить, добавьте <b>s.youtube.com</b> в белый список блокировщика рекламы или отключите все блокировщики DNS и прокси. - Не показывать снова - - - Настройки - ReVanced - Вы уверены, что хотите продолжить? - Сохранить - Сбросить - Сбросить цвет - Неверный цвет - Требуется перезапуск - Перезапустите приложение, чтобы изменения вступили в силу. - Перезапустить - Импортировать - Копировать - Настройки ReVanced восстановлены до значений по умолчанию - Импортировано %d настроек - Ошибка импорта: %s - Поиск настроек - По запросу \"%s\" ничего не найдено - Попробуйте другое ключевое слово - Недавние поиски - Удалить из истории поиска? - Очистить историю поиска - Вы уверены, что хотите очистить всю историю поиска? - Советы по поиску - "• Нажмите на путь, чтобы перейти к нему +--> + + + Название приложения + + Кастомное + Иконка приложения + Оригинальная + ReVanced + + ReVanced минимальная + ReVanced масштабированная + + Кастомная + + + Проверки не удались + Открыть официальный веб-сайт + Игнорировать + <h5>Похоже, что это приложение пропатчено не Вами.</h5><br>Оно может работать неправильно, <b>быть вредным или даже опасным.</b>.<br><br>Эти проверки предполагают, что это приложение пропатчено или получено от кого-то другого:<br><br><small>%1$s</small><br>Настоятельно рекомендуется <b>удалить это приложение и пропатчить его самостоятельно,</b> чтобы быть уверенным, что Вы используете проверенное и безопасное приложение.<p><br>Если проигнорировать это предупреждение, оно будет показано только дважды. + Пропатчено на другом устройстве + Установлено не через ReVanced Manager + Пропатчено более 10 минут назад + Пропатчено %s дней назад + Дата сборки APK повреждена + + + Уведомление ReVanced + Ваша история просмотра не сохраняется.<br><br>Вероятнее всего это вызвано DNS блокировщиком рекламы или сетевым прокси.<br><br>Чтобы это исправить, добавьте <b>s.youtube.com</b> в белый список блокировщика рекламы или отключите все блокировщики DNS и прокси. + Не показывать снова + + + Настройки + ReVanced + Вы уверены, что хотите продолжить? + Сохранить + Сбросить + Сбросить цвет + Неверный цвет + Требуется перезапуск + Перезапустите приложение, чтобы изменения вступили в силу. + Перезапустить + Импортировать + Копировать + Настройки ReVanced восстановлены до значений по умолчанию + Импортировано %d настроек + Ошибка импорта: %s + Поиск настроек + По запросу \"%s\" ничего не найдено + Попробуйте другое ключевое слово + Недавние поиски + Удалить из истории поиска? + Очистить историю поиска + Вы уверены, что хотите очистить всю историю поиска? + Советы по поиску + "• Нажмите на путь, чтобы перейти к нему • Длительно нажмите на настройку, чтобы перейти к ней • Нажмите Enter, чтобы сохранить поисковый запрос в историю • Поиск игнорирует регистр и знаки препинания • Родительские настройки отображаются над отключенными дочерними настройками" - История поиска пуста - Для сохранения истории поиска введите поисковый запрос и нажмите Enter - Показать историю поиска настроек - История поиска настроек показана - История поиска настроек скрыта - Показать иконки в настройках ReVanced - Иконки в настройках ReVanced показаны - Иконки в настройках ReVanced скрыты - Язык настроек ReVanced - "Переводы для некоторых языков могут отсутствовать или быть неполными. + История поиска пуста + Для сохранения истории поиска введите поисковый запрос и нажмите Enter + Показать историю поиска настроек + История поиска настроек показана + История поиска настроек скрыта + Показать иконки в настройках ReVanced + Иконки в настройках ReVanced показаны + Иконки в настройках ReVanced скрыты + Язык настроек ReVanced + "Переводы для некоторых языков могут отсутствовать или быть неполными. Чтобы перевести новые языки или улучшить существующие переводы, посетите translate.revanced.app" - Язык приложения YouTube - Резервное копирование настроек - Создание и восстановление резервной копии настроек ReVanced - - Вы используете ReVanced Patches версии <i>%s</i> - Примечание - Эта версия является предварительной, и Вы можете столкнуться с непредвиденными проблемами - Официальные ссылки - + Вы используете ReVanced Patches версии <i>%s</i> + Примечание + Эта версия является предварительной, и Вы можете столкнуться с непредвиденными проблемами + Официальные ссылки + - - - GmsCore - Настройки GmsCore - - MicroG GmsCore не установлен. Установите его. - Требуется действие - "MicroG GmsCore не имеет разрешения на работу в фоновом режиме. + + + GmsCore + Настройки GmsCore + + MicroG GmsCore не установлен. Установите его. + Требуется действие + "MicroG GmsCore не имеет разрешения на работу в фоновом режиме. Настройте MicroG согласно инструкции \"Don't kill my app\" для Вашего телефона. Это необходимо для работы приложения." - Открыть веб-сайт - "Для предотвращения проблем необходимо отключить оптимизацию батареи для MicroG GmsCore. + Открыть веб-сайт + "Для предотвращения проблем необходимо отключить оптимизацию батареи для MicroG GmsCore. Отключение оптимизации батареи для MicroG не повлияет на использование батареи. Нажмите кнопку \"Продолжить\" и разрешите изменения оптимизации." - Продолжить - - - Подмена видеопотоков - Подмена видеопотоков клиента для предотвращения проблем с воспроизведением видео - Подмена видеопотоков - Подмените видеопоток клиента, чтобы предотвратить проблемы с воспроизведением - Подменить видеопотоки - "Видеопотоки подменены + Продолжить + + + Подмена видеопотоков + Подмена видеопотоков клиента для предотвращения проблем с воспроизведением видео + Подмена видеопотоков + Подмените видеопоток клиента, чтобы предотвратить проблемы с воспроизведением + Подменить видеопотоки + "Видеопотоки подменены Если Вы являетесь пользователем YouTube Premium, эта настройка может не потребоваться" - "Видеопотоки не подменены + "Видеопотоки не подменены Воспроизведение может не работать" - Отключение этой настройки может вызвать проблемы с воспроизведением. - Клиент по умолчанию - - - Принудительно оригинальная звуковая дорожка - Используется оригинальная звуковая дорожка - Используется звуковая дорожка по умолчанию - - Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio - - - Отладка - Включить или отключить параметры отладки - Включить журналы отладки - Журналы отладки включены - Журналы отладки отключены - Журнал трассировки стека - В журналы отладки включена трассировка стека - В журналы отладки не включена трассировка стека - Показать всплывающее уведомление при ошибке Revanced - Всплывающее уведомление при возникновении ошибки Revanced показано - Всплывающее уведомление при возникновении ошибки Revanced скрыто - "Отключение всплывающих уведомлений об ошибках скроет все сообщения об ошибках ReVanced. + Отключение этой настройки может вызвать проблемы с воспроизведением. + Клиент по умолчанию + + + Принудительно оригинальная звуковая дорожка + Используется оригинальная звуковая дорожка + Используется звуковая дорожка по умолчанию + + Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio + + + Отладка + Включить или отключить параметры отладки + Включить журналы отладки + Журналы отладки включены + Журналы отладки отключены + Журнал трассировки стека + В журналы отладки включена трассировка стека + В журналы отладки не включена трассировка стека + Показать всплывающее уведомление при ошибке Revanced + Всплывающее уведомление при возникновении ошибки Revanced показано + Всплывающее уведомление при возникновении ошибки Revanced скрыто + "Отключение всплывающих уведомлений об ошибках скроет все сообщения об ошибках ReVanced. Вы не будете уведомлены о каких-либо непредвиденных событиях." - Экспортировать журналы отладки - Копирует журналы отладки ReVanced в буфер обмена - Журналы отладки отключены - Журналы не найдены - Журналы скопированы - Не удалось экспортировать журналы: %s - Очистить журналы отладки - Очищает все сохраненные журналы отладки ReVanced - Журналы очищены - Менеджер экспериментальных флагов - Управлять экспериментальными логическими флагами - Активные флаги (%d) - Заблокированные флаги (%d) - Поиск флагов... - Флаги сохранены - Флаги сброшены - Флаги скопированы в буфер обмена - Журнал буфера протоколов - В журналы отладки включен буфер протоколов - В журналы отладки не включен буфер протоколов - "Включение этой настройки позволит регистрировать дополнительные данные макета, включая текст на экране для некоторых компонентов пользовательского интерфейса. + Экспортировать журналы отладки + Копирует журналы отладки ReVanced в буфер обмена + Журналы отладки отключены + Журналы не найдены + Журналы скопированы + Не удалось экспортировать журналы: %s + Очистить журналы отладки + Очищает все сохраненные журналы отладки ReVanced + Журналы очищены + Менеджер экспериментальных флагов + Управлять экспериментальными логическими флагами + Активные флаги (%d) + Заблокированные флаги (%d) + Поиск флагов... + Флаги сохранены + Флаги сброшены + Флаги скопированы в буфер обмена + Журнал буфера протоколов + В журналы отладки включен буфер протоколов + В журналы отладки не включен буфер протоколов + "Включение этой настройки позволит регистрировать дополнительные данные макета, включая текст на экране для некоторых компонентов пользовательского интерфейса. Это может помочь определить компоненты при создании пользовательских фильтров. Однако включение этой функции также приведет к регистрации некоторых пользовательских данных, таких как ваш IP-адрес." - - - Очищать ссылки для обмена - Параметр отслеживания запросов удален из ссылок для обмена - Параметр отслеживания запросов не удален из ссылок для обмена - Изменить ссылки для обмена на youtube.com - Общие ссылки используют youtube.com - Общие ссылки используют music.youtube.com - - - Кастомный фильтр - Скрыть компоненты с помощью кастомных фильтров - Включить кастомный фильтр - Кастомный фильтр включен - Кастомный фильтр отключен - Кастомный фильтр - - Список строк конструктора путей компонентов для фильтрации, разделенных новой строкой - Недопустимый кастомный фильтр: %s - - - - - Информация - Реклама - Альтернативные миниатюры - Лента - Общие - Плеер - Shorts - Полоса прогресса - Управление жестами - Вернуть дизлайки YouTube - Прочие - Видео - Включить старое меню настроек - Старое меню настроек включено - Новое меню настроек включено - - - Отключить воспроизведение Shorts в фоновом режиме - Воспроизведение Shorts в фоновом режиме отключено - Воспроизведение Shorts в фоновом режиме включено - - - Скрыть карточки альбомов - Карточки альбомов под описанием артистов скрыты - Карточки альбомов под описанием артистов показаны - Скрыть карточки исполнителей - Карточки исполнителей под плеером скрыты - Карточки исполнителей под плеером показаны - Скрыть секцию тегов похожих видео - Секция тегов похожих видео под плеером скрыта - Секция тегов похожих видео под плеером показана - Скрыть публикации сообщества - Публикации сообщества в ленте скрыты - Публикации сообщества в ленте показаны - Скрыть компактные баннеры - Компактные баннеры в ленте скрыты - Компактные баннеры в ленте показаны - Скрыть расширяемые фрагменты - Расширяемые фрагменты под плеером скрыты - Расширяемые фрагменты под плеером показаны - Скрыть плавающую кнопку микрофона - Плавающая кнопка микрофона в поиске скрыта - Плавающая кнопка микрофона в поиске показана - Скрыть горизонтальные секции - "Данные горизонтальные секции скрыты: + + + Очищать ссылки для обмена + Параметр отслеживания запросов удален из ссылок для обмена + Параметр отслеживания запросов не удален из ссылок для обмена + Изменить ссылки для обмена на youtube.com + Общие ссылки используют youtube.com + Общие ссылки используют music.youtube.com + + + Кастомный фильтр + Скрыть компоненты с помощью кастомных фильтров + Включить кастомный фильтр + Кастомный фильтр включен + Кастомный фильтр отключен + Кастомный фильтр + + Список строк конструктора путей компонентов для фильтрации, разделенных новой строкой + Недопустимый кастомный фильтр: %s + + + + + Информация + Реклама + Альтернативные миниатюры + Лента + Общие + Плеер + Shorts + Полоса прогресса + Управление жестами + Вернуть дизлайки YouTube + Прочие + Видео + Включить старое меню настроек + Старое меню настроек включено + Новое меню настроек включено + + + Отключить воспроизведение Shorts в фоновом режиме + Воспроизведение Shorts в фоновом режиме отключено + Воспроизведение Shorts в фоновом режиме включено + + + Скрыть карточки альбомов + Карточки альбомов под описанием артистов скрыты + Карточки альбомов под описанием артистов показаны + Скрыть карточки исполнителей + Карточки исполнителей под плеером скрыты + Карточки исполнителей под плеером показаны + Скрыть секцию тегов похожих видео + Секция тегов похожих видео под плеером скрыта + Секция тегов похожих видео под плеером показана + Скрыть публикации сообщества + Публикации сообщества в ленте скрыты + Публикации сообщества в ленте показаны + Скрыть компактные баннеры + Компактные баннеры в ленте скрыты + Компактные баннеры в ленте показаны + Скрыть расширяемые фрагменты + Расширяемые фрагменты под плеером скрыты + Расширяемые фрагменты под плеером показаны + Скрыть плавающую кнопку микрофона + Плавающая кнопка микрофона в поиске скрыта + Плавающая кнопка микрофона в поиске показана + Скрыть горизонтальные секции + "Данные горизонтальные секции скрыты: • Срочные новости • Продолжить просмотр • Исследовать больше каналов • Самые релевантные • Покупки • Смотреть еще раз" - Горизонтальные секции показаны - Скрыть секцию изображений - Секция изображений в результатах поиска скрыта - Секция изображений в результатах поиска показана - Скрыть последние публикации - Последние публикации в ленте скрыты - Последние публикации в ленте показаны - Скрыть плейлисты \"Джем\" - Плейлисты \"Джем\" в ленте и плеере скрыты - Плейлисты \"Джем\" в ленте и плеере показаны - Скрыть раздел фильмов - Раздел фильмов в поиске скрыт - Раздел фильмов в поиске показан - - Скрыть кнопку \"Прислать уведомление\" - Кнопка \"Прислать уведомление\" в ленте скрыта - Кнопка \"Прислать уведомление\" в ленте показана - Скрыть встроенные игры - Встроенные игры в ленте скрыты - Встроенные игры в ленте показаны - - Скрыть кнопку \"Показать еще\" - Кнопка \"Показать еще\" в результатах поиска скрыта - Кнопка \"Показать еще\" в результатах поиска показана - Скрыть опросы - Опросы в ленте скрыты - Опросы в ленте показаны - Скрыть секцию билетов - Секция билетов под плеером скрыта - Секция билетов под плеером показана - - Скрыть метки видеорекомендаций - Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска скрыты - Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска показаны - Скрыть визуальный разделитель - Визуальный разделитель скрыт - Визуальный разделитель показан - - Скрыть YouTube Doodles - Анимация YouTube Doodles на логотипе скрыта - Анимация YouTube Doodles на логотипе показана - "YouTube Doodles показываются несколько дней в году. + Скрыть кнопку \"Показать еще\" + Кнопка \"Показать еще\" в результатах поиска скрыта + Кнопка \"Показать еще\" в результатах поиска показана + Скрыть опросы + Опросы в ленте скрыты + Опросы в ленте показаны + Скрыть секцию билетов + Секция билетов под плеером скрыта + Секция билетов под плеером показана + + Скрыть метки видеорекомендаций + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска скрыты + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска показаны + Скрыть визуальный разделитель + Визуальный разделитель скрыт + Визуальный разделитель показан + + Скрыть YouTube Doodles + Анимация YouTube Doodles на логотипе скрыта + Анимация YouTube Doodles на логотипе показана + "YouTube Doodles показываются несколько дней в году. Если в Вашем регионе в настоящее время показывается Doodle, и данная опция скрытия активна, то панель фильтров под панелью поиска будет также скрыта." - Скрыть панель канала - Панель канала под плеером скрыта - Панель канала под плеером показана - Скрыть водяной знак канала - Водяной знак канала в плеере скрыт - Водяной знак канала в плеере показан - Скрыть колонку \"Коллективный сбор\" - Колонка \"Коллективный сбор\" между плеером и описанием видео скрыта - Колонка \"Коллективный сбор\" между плеером и описанием видео показана - Скрыть экстренные колонки - Экстренные колонки в результатах поиска и плеере скрыты - Экстренные колонки в результатах поиска и плеере показаны - Скрыть информационные панели - Информационные панели в ленте, результатах поиска и видео скрыты - Информационные панели в ленте, результатах поиска и видео показаны - - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Скрыть медицинские панели - Медицинские панели в ленте, результатах поиска и видео скрыты - Медицинские панели в ленте, результатах поиска и видео показаны - Скрыть быстрые действия - Быстрые действия в полноэкранном режиме скрыты - Быстрые действия в полноэкранном режиме показаны - Скрыть похожие видео - Похожие видео в быстрых действиях скрыты - Похожие видео в быстрых действиях показаны - Скрыть правила сообщества подписчиков - Правила сообщества подписчиков в комментариях скрыты - Правила сообщества подписчиков в комментариях показаны - Скрыть временные реакции - Временные реакции в комментариях и живом чате скрыты - Временные реакции в комментариях и живом чате показаны - Скрыть секцию AI-резюме видео - Сгенерированный ИИ раздел сводки видео скрыт - Сгенерированный ИИ раздел сводки видео показан - Скрыть раздел \"Спросить\" - Раздел \"Спросить\" в описании видео скрыт - Раздел \"Спросить\" в описании видео показан - Скрыть раздел атрибутов - Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" скрыты - Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" показаны - Скрыть раздел \"Эпизоды\" - Раздел \"Эпизоды\" в описании видео скрыт - Раздел \"Эпизоды\" в описании видео показан - Скрыть раздел \"Как был создан этот контент\" - Раздел \"Как был создан этот контент\" в описании видео скрыт - Раздел \"Как был создан этот контент\" в описании видео показан - Скрыть очки голосов - Очки голосов скрыты - Очки голосов показаны - Скрыть раздел \"Другие выпуски подкаста\" - Раздел \"Другие выпуски подкаста\" в описании видео скрыт - Раздел \"Другие выпуски подкаста\" в описании видео показан - Скрыть рекомендуемые ссылки - Раздел рекомендуемых ссылок скрыт - Раздел рекомендуемых ссылок показан - Скрыть рекомендуемые видео - Раздел рекомендуемых видео скрыт - Раздел рекомендуемых видео показан - Скрыть раздел информационных карточек - Раздел информационных карточек в описании видео скрыт - Раздел информационных карточек в описании видео показан - Скрыть раздел \"Ключевые понятия\" - Раздел \"Ключевые понятия\" в описании видео скрыт - Раздел \"Ключевые понятия\" в описании видео показан - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Скрыть раздел расшифровки - Раздел расшифровки в описании видео скрыт - Раздел расшифровки в описании видео показан - Описание видео - Скрыть или показать компоненты описания видео - Панель фильтров - Скрыть или показать панель фильтров в лентах, похожих видео, результатах поиска и истории просмотра - Скрыть панель фильтров в ленте - Панель фильтров в ленте скрыта - Панель фильтров в ленте показана - Скрыть панель фильтров в похожих видео - Панель фильтров в похожих видео скрыта - Панель фильтров в похожих видео показана - Скрыть панель фильтров в поиске - Панель фильтров в поиске скрыта - Панель фильтров в поиске показана - Скрыть в истории просмотров - Панель фильтров в истории просмотров скрыта - Панель фильтров в истории просмотров показана - Страница канала - Скрыть или показать компоненты страницы канала - - Скрыть кнопку \"Сообщество\" - Кнопка \"Сообщество\" скрыта - Кнопка \"Сообщество\" показана - - Скрыть секцию \"Для вас\" - Секция \"Для вас\" на странице канала скрыта - Секция \"Для вас\" на странице канала показана - - Скрыть кнопку \"Присоединиться\" - Кнопка \"Присоединиться\" скрыта - Кнопка \"Присоединиться\" показана - Скрыть предпросмотр ссылок - Предпросмотр ссылок на странице канала скрыт - Предпросмотр ссылок на странице канала показан - Скрыть секцию участников - Секция участников на странице канала скрыта - Секция участников на странице канала показана - - Скрыть кнопку \"Магазин\" - Кнопка \"Магазин\" скрыта - Кнопка \"Магазин\" показана - - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Комментарии - Скрыть или показать компоненты раздела комментариев - Скрыть секцию ИИ сводки чата - Секция ИИ сводки чата скрыта - Секция ИИ сводки чата показана - Скрыть вкладку AI-сводки по темам комментариев - Секция ИИ сводки по темам комментариев скрыта - Секция ИИ сводки по темам комментариев показана - Скрыть правила канала - Правила канала в комментариях скрыты - Правила канала в комментариях показаны - Скрыть заголовок \"Комментарии спонсоров\" - Заголовок \"Комментарии спонсоров\" в комментариях скрыт - Заголовок \"Комментарии спонсоров\" в комментариях показан - Скрыть раздел комментариев - Раздел комментариев под плеером скрыт - Раздел комментариев под плеером показан - Скрыть правила сообщества - Правила сообщества в комментариях скрыты - Правила сообщества в комментариях показаны - Скрыть кнопку \"Создать Short\" - Кнопка \"Создать Short\" при ответе на комментарий скрыта - Кнопка \"Создать Short\" при ответе на комментарий показана - Скрыть кнопки эмодзи и метки времени - Кнопки эмодзи и метки времени скрыты - Кнопки эмодзи и метки времени показаны - Скрыть предпросмотр комментария - Предпросмотр комментария под плеером скрыт - Предпросмотр комментария под плеером показан - Скрыть кнопку \"Спасибо\" - Кнопка \"Спасибо\" в комментариях скрыта - Кнопка \"Спасибо\" в комментариях показана - Скрыть количество просмотров - Количество просмотров в ленте и результатах поиска скрыто - Количество просмотров в ленте и результатах поиска показано - - "Ограничения: + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + Скрыть медицинские панели + Медицинские панели в ленте, результатах поиска и видео скрыты + Медицинские панели в ленте, результатах поиска и видео показаны + Скрыть быстрые действия + Быстрые действия в полноэкранном режиме скрыты + Быстрые действия в полноэкранном режиме показаны + Скрыть похожие видео + Похожие видео в быстрых действиях скрыты + Похожие видео в быстрых действиях показаны + Скрыть правила сообщества подписчиков + Правила сообщества подписчиков в комментариях скрыты + Правила сообщества подписчиков в комментариях показаны + Скрыть временные реакции + Временные реакции в комментариях и живом чате скрыты + Временные реакции в комментариях и живом чате показаны + Скрыть секцию AI-резюме видео + Сгенерированный ИИ раздел сводки видео скрыт + Сгенерированный ИИ раздел сводки видео показан + Скрыть раздел \"Спросить\" + Раздел \"Спросить\" в описании видео скрыт + Раздел \"Спросить\" в описании видео показан + Скрыть раздел атрибутов + Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" скрыты + Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" показаны + Скрыть раздел \"Эпизоды\" + Раздел \"Эпизоды\" в описании видео скрыт + Раздел \"Эпизоды\" в описании видео показан + Скрыть раздел \"Как был создан этот контент\" + Раздел \"Как был создан этот контент\" в описании видео скрыт + Раздел \"Как был создан этот контент\" в описании видео показан + Скрыть очки голосов + Очки голосов скрыты + Очки голосов показаны + Скрыть раздел \"Другие выпуски подкаста\" + Раздел \"Другие выпуски подкаста\" в описании видео скрыт + Раздел \"Другие выпуски подкаста\" в описании видео показан + Скрыть рекомендуемые ссылки + Раздел рекомендуемых ссылок скрыт + Раздел рекомендуемых ссылок показан + Скрыть рекомендуемые видео + Раздел рекомендуемых видео скрыт + Раздел рекомендуемых видео показан + Скрыть раздел информационных карточек + Раздел информационных карточек в описании видео скрыт + Раздел информационных карточек в описании видео показан + Скрыть раздел \"Ключевые понятия\" + Раздел \"Ключевые понятия\" в описании видео скрыт + Раздел \"Ключевые понятия\" в описании видео показан + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + Скрыть раздел расшифровки + Раздел расшифровки в описании видео скрыт + Раздел расшифровки в описании видео показан + Описание видео + Скрыть или показать компоненты описания видео + Панель фильтров + Скрыть или показать панель фильтров в лентах, похожих видео, результатах поиска и истории просмотра + Скрыть панель фильтров в ленте + Панель фильтров в ленте скрыта + Панель фильтров в ленте показана + Скрыть панель фильтров в похожих видео + Панель фильтров в похожих видео скрыта + Панель фильтров в похожих видео показана + Скрыть панель фильтров в поиске + Панель фильтров в поиске скрыта + Панель фильтров в поиске показана + Скрыть в истории просмотров + Панель фильтров в истории просмотров скрыта + Панель фильтров в истории просмотров показана + Страница канала + Скрыть или показать компоненты страницы канала + + Скрыть кнопку \"Сообщество\" + Кнопка \"Сообщество\" скрыта + Кнопка \"Сообщество\" показана + + Скрыть секцию \"Для вас\" + Секция \"Для вас\" на странице канала скрыта + Секция \"Для вас\" на странице канала показана + + Скрыть кнопку \"Присоединиться\" + Кнопка \"Присоединиться\" скрыта + Кнопка \"Присоединиться\" показана + Скрыть предпросмотр ссылок + Предпросмотр ссылок на странице канала скрыт + Предпросмотр ссылок на странице канала показан + Скрыть секцию участников + Секция участников на странице канала скрыта + Секция участников на странице канала показана + + Скрыть кнопку \"Магазин\" + Кнопка \"Магазин\" скрыта + Кнопка \"Магазин\" показана + + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + Комментарии + Скрыть или показать компоненты раздела комментариев + Скрыть секцию ИИ сводки чата + Секция ИИ сводки чата скрыта + Секция ИИ сводки чата показана + Скрыть вкладку AI-сводки по темам комментариев + Секция ИИ сводки по темам комментариев скрыта + Секция ИИ сводки по темам комментариев показана + Скрыть правила канала + Правила канала в комментариях скрыты + Правила канала в комментариях показаны + Скрыть заголовок \"Комментарии спонсоров\" + Заголовок \"Комментарии спонсоров\" в комментариях скрыт + Заголовок \"Комментарии спонсоров\" в комментариях показан + Скрыть раздел комментариев + Раздел комментариев под плеером скрыт + Раздел комментариев под плеером показан + Скрыть правила сообщества + Правила сообщества в комментариях скрыты + Правила сообщества в комментариях показаны + Скрыть кнопку \"Создать Short\" + Кнопка \"Создать Short\" при ответе на комментарий скрыта + Кнопка \"Создать Short\" при ответе на комментарий показана + Скрыть кнопки эмодзи и метки времени + Кнопки эмодзи и метки времени скрыты + Кнопки эмодзи и метки времени показаны + Скрыть предпросмотр комментария + Предпросмотр комментария под плеером скрыт + Предпросмотр комментария под плеером показан + Скрыть кнопку \"Спасибо\" + Кнопка \"Спасибо\" в комментариях скрыта + Кнопка \"Спасибо\" в комментариях показана + Скрыть количество просмотров + Количество просмотров в ленте и результатах поиска скрыто + Количество просмотров в ленте и результатах поиска показано + + "Ограничения: • Секции Shorts, страницы каналов и результаты поиска все еще могут показывать счетчики просмотров • Эта функция не работает с автомобильным форм-фактором" - Скрыть время загрузки - Время загрузки в ленте и результатах поиска скрыто - Время загрузки в ленте и результатах поиска показано - - "Ограничения: + Скрыть время загрузки + Время загрузки в ленте и результатах поиска скрыто + Время загрузки в ленте и результатах поиска показано + + "Ограничения: • Секции Shorts, страницы каналов и результаты поиска все еще могут показывать время загрузки • Эта функция не работает с автомобильным форм-фактором" - Скрыть контент по ключевым словам - Скрыть видео из результатов поиска и ленты с помощью фильтров ключевых слов - Скрыть видео на \"Главной\" по ключевым словам - Видео на вкладке \"Главная\" фильтруются по ключевым словам - Видео на вкладке \"Главная\" не фильтруются по ключевым словам - Скрыть результаты поиска по ключевым словам - Результаты поиска видео фильтруются по ключевым словам - Результаты поиска видео не фильтруются по ключевым словам - Скрыть видео в \"Подписках\" по ключевым словам - Видео на вкладке \"Подписки\" фильтруются по ключевым словам - Видео на вкладке \"Подписки\" не фильтруются по ключевым словам - Ключевые слова для скрытия - - "Ключевые слова и фразы для скрытия, разделенные новой строкой + "Ключевые слова и фразы для скрытия, разделенные новой строкой Ключевыми словами могут быть названия каналов или любой текст, показываемый в заголовках видео Слова с заглавными буквами в середине должны содержать регистр (например: iPhone, TikTok, LeBlanc)" - О фильтрации по ключевым словам - "Вкладки \"Главная\", \"Подписки\" и результаты поиска фильтруются для скрытия контента, соответствующего ключевым фразам + О фильтрации по ключевым словам + "Вкладки \"Главная\", \"Подписки\" и результаты поиска фильтруются для скрытия контента, соответствующего ключевым фразам Ограничения • Shorts нельзя скрыть по имени канала • Некоторые компоненты пользовательского интерфейса могут быть не скрыты • Поиск по ключевому слову может не дать результатов" - Только целые слова - - Заключение ключевого слова/фразы в двойные кавычки предотвратит частичное совпадение названий видео и каналов<br><br>Например,<br><b>\"ai\"</b> скроет видео: <b>How does AI work?</b><br>но не скроет: <b>What does fair use mean?</b> - - Невозможно использовать ключевое слово: %s - Добавьте кавычки для использования ключевого слова: %s - Ключевое слово содержит конфликтующие заявления: %s - Ключевое слово слишком короткое и требует кавычки: %s - Ключевое слово скроет все видео: %s - - - Скрыть секцию магазина автора - Секция магазина автора под плеером скрыта - Секция магазина автора под плеером показана - Скрыть баннер магазина - Баннер магазина в конце просмотра скрыт - Баннер магазина в конце просмотра показан - Скрыть полноэкранную рекламу - "Полноэкранная реклама при запуске приложения скрыта + Только целые слова + + Заключение ключевого слова/фразы в двойные кавычки предотвратит частичное совпадение названий видео и каналов<br><br>Например,<br><b>\"ai\"</b> скроет видео: <b>How does AI work?</b><br>но не скроет: <b>What does fair use mean?</b> + + Невозможно использовать ключевое слово: %s + Добавьте кавычки для использования ключевого слова: %s + Ключевое слово содержит конфликтующие заявления: %s + Ключевое слово слишком короткое и требует кавычки: %s + Ключевое слово скроет все видео: %s + + + Скрыть секцию магазина автора + Секция магазина автора под плеером скрыта + Секция магазина автора под плеером показана + Скрыть баннер магазина + Баннер магазина в конце просмотра скрыт + Баннер магазина в конце просмотра показан + Скрыть полноэкранную рекламу + "Полноэкранная реклама при запуске приложения скрыта Данная опция доступна только для старых устройств" - Полноэкранная реклама при запуске приложения показана - - Скрытие полноэкранной рекламы работает только для старых устройств - Скрыть общую рекламу - Общая реклама скрыта - Общая реклама показана - Скрыть баннеры торговли - Баннеры торговли в ленте скрыты - Баннеры торговли в ленте показаны - Скрыть метку платной акции - Метка платной акции в плеере скрыта - Метка платной акции в плеере показана - Скрыть заставки саморекламы - Заставки саморекламы под информацией о видео скрыты - Заставки саморекламы под информацией о видео показаны - Скрыть ссылки на товары - Ссылки на товары в описании видео скрыты - Ссылки на товары в описании видео показаны - Скрыть баннер просмотра товаров - Баннер просмотра товаров в плеере скрыт - Баннер просмотра товаров в плеере показан - Скрыть результаты веб-поиска - Результаты веб-поиска в ленте скрыты - Результаты веб-поиска в ленте показаны - - - Скрыть рекламу YouTube Premium - Реклама YouTube Premium под плеером скрыта - Реклама YouTube Premium под плеером показана - - - Скрыть видеорекламу - Видеореклама в плеере скрыта - Видеореклама в плеере показана - - - URL-адрес скопирован - URL-адрес с меткой времени скопирован - Показать кнопку копирования URL видео - Кнопка копирования URL-адреса видео показана. Нажмите для копирования URL-адреса видео. Нажмите и удерживайте для копирования URL-адреса видео с меткой времени - Кнопка копирования URL-адреса видео не показана - Показать кнопку копирования URL видео с меткой времени - Кнопка копирования URL-адреса с меткой времени показана. Нажмите для копирования URL-адреса видео с меткой времени. Нажмите и удерживайте для копирования URL-адреса видео без метки времени - Кнопка копирования URL-адреса с меткой времени не показана - - - Скрыть диалог о нежелательном контенте - Диалоговое окно о нежелательном контенте скрыто - Диалоговое окно о нежелательном контенте показано - Данная опция не обходит возрастное ограничение. Она только принимает возрастное ограничение автоматически. - - - Отключить всплывающее окно \"Вход на ТВ\" - Всплывающее окно \"Вход на ТВ\" отключено - Всплывающее окно \"Вход на ТВ\" включено - - - Отключить пропуск главы по двойному касанию - Двойное касание никогда не приведет к переходу к следующей/предыдущей главе - Двойное касание может иногда приводить к переходу к следующей/предыдущей главе - - - Внешний загрузчик - Настройки использования внешнего загрузчика видео - Показать кнопку внешнего загрузчика - Кнопка внешнего загрузчика в плеере показана - Кнопка внешнего загрузчика в плеере скрыта - - Действие кнопки \"Скачать\" - Кнопка \"Скачать\" запускает внешний загрузчик - Кнопка \"Скачать\" запускает собственный загрузчик - Имя пакета загрузчика - Имя пакета установленного Вами приложения внешнего загрузчика - Введите имя пакета - Другое - Приложение не установлено - %s не установлен. Пожалуйста, установите его. - "Не удалось найти установленное приложение с именем пакета: %s + Полноэкранная реклама при запуске приложения показана + + Скрытие полноэкранной рекламы работает только для старых устройств + Скрыть общую рекламу + Общая реклама скрыта + Общая реклама показана + Скрыть баннеры торговли + Баннеры торговли в ленте скрыты + Баннеры торговли в ленте показаны + Скрыть метку платной акции + Метка платной акции в плеере скрыта + Метка платной акции в плеере показана + Скрыть заставки саморекламы + Заставки саморекламы под информацией о видео скрыты + Заставки саморекламы под информацией о видео показаны + Скрыть ссылки на товары + Ссылки на товары в описании видео скрыты + Ссылки на товары в описании видео показаны + Скрыть баннер просмотра товаров + Баннер просмотра товаров в плеере скрыт + Баннер просмотра товаров в плеере показан + Скрыть результаты веб-поиска + Результаты веб-поиска в ленте скрыты + Результаты веб-поиска в ленте показаны + + + Скрыть рекламу YouTube Premium + Реклама YouTube Premium под плеером скрыта + Реклама YouTube Premium под плеером показана + + + Скрыть видеорекламу + Видеореклама в плеере скрыта + Видеореклама в плеере показана + + + URL-адрес скопирован + URL-адрес с меткой времени скопирован + Показать кнопку копирования URL видео + Кнопка копирования URL-адреса видео показана. Нажмите для копирования URL-адреса видео. Нажмите и удерживайте для копирования URL-адреса видео с меткой времени + Кнопка копирования URL-адреса видео не показана + Показать кнопку копирования URL видео с меткой времени + Кнопка копирования URL-адреса с меткой времени показана. Нажмите для копирования URL-адреса видео с меткой времени. Нажмите и удерживайте для копирования URL-адреса видео без метки времени + Кнопка копирования URL-адреса с меткой времени не показана + + + Скрыть диалог о нежелательном контенте + Диалоговое окно о нежелательном контенте скрыто + Диалоговое окно о нежелательном контенте показано + Данная опция не обходит возрастное ограничение. Она только принимает возрастное ограничение автоматически. + + + Отключить всплывающее окно \"Вход на ТВ\" + Всплывающее окно \"Вход на ТВ\" отключено + Всплывающее окно \"Вход на ТВ\" включено + + + Отключить пропуск главы по двойному касанию + Двойное касание никогда не приведет к переходу к следующей/предыдущей главе + Двойное касание может иногда приводить к переходу к следующей/предыдущей главе + + + Внешний загрузчик + Настройки использования внешнего загрузчика видео + Показать кнопку внешнего загрузчика + Кнопка внешнего загрузчика в плеере показана + Кнопка внешнего загрузчика в плеере скрыта + + Действие кнопки \"Скачать\" + Кнопка \"Скачать\" запускает внешний загрузчик + Кнопка \"Скачать\" запускает собственный загрузчик + Имя пакета загрузчика + Имя пакета установленного Вами приложения внешнего загрузчика + Введите имя пакета + Другое + Приложение не установлено + %s не установлен. Пожалуйста, установите его. + "Не удалось найти установленное приложение с именем пакета: %s Убедитесь, что имя пакета указано правильно и приложение установлено" - Имя пакета не может быть пустым - - - Отключить жест покадровой перемотки - Жест покадровой перемотки отключен - Жест покадровой перемотки включен - - - Включить перемотку нажатием - Перемотка нажатием на полосу прогресса включена - Перемотка нажатием на полосу прогресса отключена - - - Включить регулировку яркости жестом - "Регулировка яркости жестом включена + Имя пакета не может быть пустым + + + Отключить жест покадровой перемотки + Жест покадровой перемотки отключен + Жест покадровой перемотки включен + + + Включить перемотку нажатием + Перемотка нажатием на полосу прогресса включена + Перемотка нажатием на полосу прогресса отключена + + + Включить регулировку яркости жестом + "Регулировка яркости жестом включена Изменяйте яркость вертикальным жестом по левой стороне экрана" - Регулировка яркости жестом отключена - Включить регулировку громкости жестом - "Регулировка громкости жестом включена + Регулировка яркости жестом отключена + Включить регулировку громкости жестом + "Регулировка громкости жестом включена Изменяйте громкость вертикальным жестом по левой стороне экрана" - Регулировка громкости жестом отключена - Включить нажатие для выполнения жестов - Нажатие для выполнения жестов включено - Нажатие для выполнения жестов отключено - Включить виброотклик при жестах - Виброотклик при выполнении жестов включен - Виброотклик при выполнении жестов отключен - Сохранять и восстанавливать яркость - Значения яркости сохраняются и восстанавливаются при выходе из полноэкранного режима или входе в него - Значения яркости не сохраняются и не восстанавливаются при выходе из полноэкранного режима или входе в него - Включить жест автояркости - Активация автояркости жестом до самого низкого значения яркости включена - Активация автояркости жестом до самого низкого значения яркости отключена - Авто - Время показа панели жестов - Количество миллисекунд для показа всплывающей панели при жестах - Затемнение фона панели жестов - Значение затемнения всплывающей панели при жестах от 0 до 100 - Значение затемнения панели жестов должно быть от 0 до 100 - Цвет индикатора яркости при жестах - Цвет полосы прогресса при изменении яркости жестами - Цвет индикатора громкости при жестах - Цвет полосы прогресса при изменении громкости жестами - Размер текста панели жестов - Размер текста панели жестов от 1 до 30 - Размер текста должен быть в диапазоне от 1 до 30 - Порог величины жеста - Минимальная амплитуда движения, распознаваемого как жест - Чувствительность жеста регулировки громкости - Величина изменения громкости при регулировке жестом - Стиль панели жестов - Горизонтальный индикатор - Горизонтальный индикатор (минимальный - сверху) - Горизонтальный индикатор (минимальный - по центру) - Круговой индикатор - Круговой индикатор (минимальный) - Вертикальный индикатор - Вертикальный индикатор (минимальный) - Включить переключение видео жестом - Жест в полноэкранном режиме переключает на следующее/предыдущее видео - Жест в полноэкранном режиме не переключает на следующее/предыдущее видео - - - Отключить автоматические субтитры - Автоматические субтитры отключены - Автоматические субтитры включены - - - Кнопки действий - Скрыть или показать кнопки действий под плеером - Отключить подсветку кнопок \"Лайк\" и \"Подписаться\" - Кнопки \"Лайк\" и \"Подписаться\" при упоминании не подсвечиваются - Кнопки \"Лайк\" и \"Подписаться\" при упоминании подсвечиваются - Скрыть кнопки \"Лайк\" и \"Дизлайк\" - Кнопки \"Лайк\" и \"Дизлайк\" под плеером скрыты - Кнопки \"Лайк\" и \"Дизлайк\" под плеером показаны - - Скрыть кнопку \"Поделиться\" - Кнопка \"Поделиться\" под плеером скрыта - Кнопка \"Поделиться\" под плеером показана - - Скрыть кнопку \"Не показывать рекламу\" - Кнопка \"Не показывать рекламу\" скрыта - Кнопка \"Не показывать рекламу\" показана - - Скрыть комментарии - Кнопка \"Комментарии\" скрыта - Кнопка \"Комментарии\" показана - + + Отключить автоматические субтитры + Автоматические субтитры отключены + Автоматические субтитры включены + + + Кнопки действий + Скрыть или показать кнопки действий под плеером + Отключить подсветку кнопок \"Лайк\" и \"Подписаться\" + Кнопки \"Лайк\" и \"Подписаться\" при упоминании не подсвечиваются + Кнопки \"Лайк\" и \"Подписаться\" при упоминании подсвечиваются + Скрыть кнопки \"Лайк\" и \"Дизлайк\" + Кнопки \"Лайк\" и \"Дизлайк\" под плеером скрыты + Кнопки \"Лайк\" и \"Дизлайк\" под плеером показаны + + Скрыть кнопку \"Поделиться\" + Кнопка \"Поделиться\" под плеером скрыта + Кнопка \"Поделиться\" под плеером показана + + Скрыть кнопку \"Не показывать рекламу\" + Кнопка \"Не показывать рекламу\" скрыта + Кнопка \"Не показывать рекламу\" показана + + Скрыть комментарии + Кнопка \"Комментарии\" скрыта + Кнопка \"Комментарии\" показана + - Скрыть кнопку \"Пожаловаться\" - Кнопка \"Пожаловаться\" под плеером скрыта - Кнопка \"Пожаловаться\" под плеером показана - - Скрыть кнопку \"Ремикс\" - Кнопка \"Ремикс\" под плеером скрыта - Кнопка \"Ремикс\" под плеером показана - - Скрыть кнопку \"Скачать\" - Кнопка \"Скачать\" под плеером скрыта - Кнопка \"Скачать\" под плеером показана - + Скрыть кнопку \"Ремикс\" + Кнопка \"Ремикс\" под плеером скрыта + Кнопка \"Ремикс\" под плеером показана + + Скрыть кнопку \"Скачать\" + Кнопка \"Скачать\" под плеером скрыта + Кнопка \"Скачать\" под плеером показана + - Скрыть кнопку \"Хайп\" - Кнопка \"Хайп\" скрыта - Кнопка \"Хайп\" показана - - Скрыть кнопку \"Рекламировать\" - Кнопка \"Рекламировать\" скрыта - Кнопка \"Рекламировать\" показана - - Скрыть кнопку \"Спасибо\" - Кнопка \"Спасибо\" под плеером скрыта - Кнопка \"Спасибо\" под плеером показана - + Скрыть кнопку \"Рекламировать\" + Кнопка \"Рекламировать\" скрыта + Кнопка \"Рекламировать\" показана + + Скрыть кнопку \"Спасибо\" + Кнопка \"Спасибо\" под плеером скрыта + Кнопка \"Спасибо\" под плеером показана + - Скрыть кнопку \"Спросить\" - Кнопка \"Спросить\" скрыта - Кнопка \"Спросить\" показана - - Скрыть кнопку \"Создать клип\" - Кнопка \"Создать клип\" под плеером скрыта - Кнопка \"Создать клип\" под плеером показана - - Скрыть магазин - Кнопка \"Магазин\" в Shorts скрыта - Кнопка \"Магазин\" в Shorts показана - - Скрыть кнопку \"Сохранить\" - Кнопка \"Сохранить\" скрыта - Кнопка \"Сохранить\" показана - - - Кнопки навигации - Скрыть или изменить кнопки в панели навигации - - Скрыть кнопку \"Главная\" - Кнопка \"Главная\" в панели навигации скрыта - Кнопка \"Главная\" в панели навигации показана - - Скрыть кнопку \"Shorts\" - Кнопка \"Shorts\" в панели навигации скрыта - Кнопка \"Shorts\" в панели навигации показана - - Скрыть кнопку \"Создать\" - Кнопка \"Создать\" в панели навигации скрыта - Кнопка \"Создать\" в панели навигации показана - - Скрыть кнопку \"Подписки\" - Кнопка \"Подписки\" в панели навигации скрыта - Кнопка \"Подписки\" в панели навигации показана - Скрыть кнопку \"Уведомления\" - Кнопка \"Уведомления\" в панели навигации скрыта - Кнопка \"Уведомления\" в панели навигации показана - - Поменять местами кнопки \"Создать\" и \"Уведомления\" - "Кнопка \"Создать\" поменяна местами с кнопкой \"Уведомления\" + Скрыть кнопку \"Спросить\" + Кнопка \"Спросить\" скрыта + Кнопка \"Спросить\" показана + + Скрыть кнопку \"Создать клип\" + Кнопка \"Создать клип\" под плеером скрыта + Кнопка \"Создать клип\" под плеером показана + + Скрыть магазин + Кнопка \"Магазин\" в Shorts скрыта + Кнопка \"Магазин\" в Shorts показана + + Скрыть кнопку \"Сохранить\" + Кнопка \"Сохранить\" скрыта + Кнопка \"Сохранить\" показана + + + Кнопки навигации + Скрыть или изменить кнопки в панели навигации + + Скрыть кнопку \"Главная\" + Кнопка \"Главная\" в панели навигации скрыта + Кнопка \"Главная\" в панели навигации показана + + Скрыть кнопку \"Shorts\" + Кнопка \"Shorts\" в панели навигации скрыта + Кнопка \"Shorts\" в панели навигации показана + + Скрыть кнопку \"Создать\" + Кнопка \"Создать\" в панели навигации скрыта + Кнопка \"Создать\" в панели навигации показана + + Скрыть кнопку \"Подписки\" + Кнопка \"Подписки\" в панели навигации скрыта + Кнопка \"Подписки\" в панели навигации показана + Скрыть кнопку \"Уведомления\" + Кнопка \"Уведомления\" в панели навигации скрыта + Кнопка \"Уведомления\" в панели навигации показана + + Поменять местами кнопки \"Создать\" и \"Уведомления\" + "Кнопка \"Создать\" поменяна местами с кнопкой \"Уведомления\" Примечание: активация данной опции также принудительно скроет видеорекламу" - Кнопка \"Создать\" не поменяна местами с кнопкой \"Уведомления\" - "Отключение этого параметра также отключит блокировку рекламы в Shorts. + Кнопка \"Создать\" не поменяна местами с кнопкой \"Уведомления\" + "Отключение этого параметра также отключит блокировку рекламы в Shorts. Если изменение этого параметра не вступило в силу, попробуйте перейти в режим инкогнито." - Скрыть подписи кнопок навигации - Подписи кнопок навигации скрыты - Подписи кнопок навигации показаны - Отключить полупрозрачность строки состояния - Строка состояния непрозрачная - Строка состояния непрозрачная или полупрозрачная - На некоторых устройствах включение данной опции может сделать системную панель навигации прозрачной. - Отключить полупрозрачность светлой панели навигации - Панель навигации при светлой теме непрозрачная - Панель навигации при светлой теме непрозрачная или полупрозрачная - Отключить полупрозрачность темной панели навигации - Панель навигации при темной теме непрозрачная - Панель навигации при темной теме непрозрачная или полупрозрачная - - - Выдвижное меню плеера - Скрыть или показать пункты выдвижного меню плеера - - Скрыть пункт \"Субтитры\" - Пункт \"Субтитры\" в выдвижном меню плеера скрыт - Пункт \"Субтитры\" в выдвижном меню плеера показан - - Скрыть пункт \"Дополнительные настройки\" - Пункт \"Дополнительные настройки\" в выдвижном меню плеера скрыт - Пункт \"Дополнительные настройки\" в выдвижном меню плеера показан - - Скрыть пункт \"Таймер сна\" - Пункт \"Таймер сна\" в выдвижном меню плеера скрыт - Пункт \"Таймер сна\" в выдвижном меню плеера показан - - Скрыть пункт \"Повтор воспроизведения\" - Пункт \"Повтор воспроизведения\" в выдвижном меню плеера скрыт - Пункт \"Повтор воспроизведения\" в выдвижном меню плеера показан - - Скрыть пункт \"Фоновая подсветка\" - Пункт \"Фоновая подсветка\" в выдвижном меню плеера скрыт - Пункт \"Фоновая подсветка\" в выдвижном меню плеера показан - Скрыть пункт \"Постоянный уровень громкости\" - Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера показан - Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера скрыт - - Скрыть пункт \"Справка и отзывы\" - Пункт \"Справка и отзывы\" в выдвижном меню плеера скрыт - Пункт \"Справка и отзывы\" в выдвижном меню плеера показан - - Скрыть пункт \"Скорость воспроизведения\" - Пункт \"Скорость воспроизведения\" в выдвижном меню плеера скрыт - Пункт \"Скорость воспроизведения\" в выдвижном меню плеера показан - - Скрыть пункт \"Блокировка экрана\" - Пункт \"Блокировка экрана\" в выдвижном меню плеера скрыт - Пункт \"Блокировка экрана\" в выдвижном меню плеера показан - - Скрыть пункт \"Слушать в YouTube Music\" - Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера скрыт - Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера показан - - Скрыть пункт \"Звуковая дорожка\" - Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт - Пункт \"Звуковая дорожка\" в выдвижном меню плеера показан - + + Выдвижное меню плеера + Скрыть или показать пункты выдвижного меню плеера + + Скрыть пункт \"Субтитры\" + Пункт \"Субтитры\" в выдвижном меню плеера скрыт + Пункт \"Субтитры\" в выдвижном меню плеера показан + + Скрыть пункт \"Дополнительные настройки\" + Пункт \"Дополнительные настройки\" в выдвижном меню плеера скрыт + Пункт \"Дополнительные настройки\" в выдвижном меню плеера показан + + Скрыть пункт \"Таймер сна\" + Пункт \"Таймер сна\" в выдвижном меню плеера скрыт + Пункт \"Таймер сна\" в выдвижном меню плеера показан + + Скрыть пункт \"Повтор воспроизведения\" + Пункт \"Повтор воспроизведения\" в выдвижном меню плеера скрыт + Пункт \"Повтор воспроизведения\" в выдвижном меню плеера показан + + Скрыть пункт \"Фоновая подсветка\" + Пункт \"Фоновая подсветка\" в выдвижном меню плеера скрыт + Пункт \"Фоновая подсветка\" в выдвижном меню плеера показан + Скрыть пункт \"Постоянный уровень громкости\" + Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера показан + Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера скрыт + + Скрыть пункт \"Справка и отзывы\" + Пункт \"Справка и отзывы\" в выдвижном меню плеера скрыт + Пункт \"Справка и отзывы\" в выдвижном меню плеера показан + + Скрыть пункт \"Скорость воспроизведения\" + Пункт \"Скорость воспроизведения\" в выдвижном меню плеера скрыт + Пункт \"Скорость воспроизведения\" в выдвижном меню плеера показан + + Скрыть пункт \"Блокировка экрана\" + Пункт \"Блокировка экрана\" в выдвижном меню плеера скрыт + Пункт \"Блокировка экрана\" в выдвижном меню плеера показан + + Скрыть пункт \"Слушать в YouTube Music\" + Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера скрыт + Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера показан + + Скрыть пункт \"Звуковая дорожка\" + Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт + Пункт \"Звуковая дорожка\" в выдвижном меню плеера показан + - "Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт + "Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт Для показа пункта \"Звуковая дорожка\" измените клиент \"Подмены видеопотоков\" на 'Android No SDK'" - - Скрыть пункт \"Смотреть в VR-режиме\" - Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера скрыт - Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера показан - Скрыть меню качества видео - Меню качества видео в выдвижном меню плеера скрыто - Меню качества видео в выдвижном меню плеера показано - Скрыть колонтитул меню качества видео - Нижний колонтитул старого меню качества видео в выдвижном меню плеера скрыт - Нижний колонтитул старого меню качества видео в выдвижном меню плеера показан - - - Скрыть кнопку \"Автовоспроизведение\" - Кнопка \"Автовоспроизведение\" в плеере скрыта - Кнопка \"Автовоспроизведение\" в плеере показана - - Скрыть кнопку \"Субтитры\" - Кнопка \"Субтитры\" в плеере скрыта - Кнопка \"Субтитры\" в плеере показана - Скрыть кнопку \"Трансляция\" - Кнопка \"Трансляция\" в плеере скрыта - Кнопка \"Трансляция\" в плеере показана - Скрыть фон кнопок управления плеера - Фон кнопок управления плеера скрыт - Фон кнопок управления плеера показан - Скрыть кнопки предыдущего и следующего видео - Кнопки предыдущего и следующего видео в плеере скрыты - Кнопки предыдущего и следующего видео в плеере показаны - - - Скрыть заставки следующих видео - Заставки следующих видео в конце просмотра скрыты - Заставки следующих видео в конце просмотра показаны - - - Отключить фоновую подсветку - Фоновая подсветка в полноэкранном режиме отключена - Фоновая подсветка в полноэкранном режиме включена - - - Скрыть всплывающие подсказки - Всплывающие подсказки в плеере скрыты - Всплывающие подсказки в плеере показаны - - - Отключить анимированные счетчики - Анимированные счетчики просмотров, лайков и дизлайков отключены - Анимированные счетчики просмотров, лайков и дизлайков включены - - - Скрыть полосу прогресса плеера - Полоса прогресса в плеере скрыта - Полоса прогресса в плеере показана - - Скрыть полосу прогресса миниатюр видео - Полоса прогресса миниатюр видео скрыта - Полоса прогресса миниатюр видео показана - - - Компоненты плеера Shorts - Скрыть или показать компоненты плеера Shorts - - Скрыть Shorts в ленте \"Главной\" - Shorts в ленте \"Главной\" и похожих видео скрыты - Shorts в ленте \"Главной\" и похожих видео показаны - Скрыть Shorts в результатах поиска - Shorts в результатах поиска скрыты - Shorts в результатах поиска показаны - - Скрыть Shorts в ленте \"Подписок\" - Shorts в ленте \"Подписок\" скрыты - Shorts в ленте \"Подписок\" показаны - Скрыть Shorts в истории просмотров - Shorts в истории просмотров скрыты - Shorts в истории просмотров показаны - Скрыть метку \"Автодубляж\" - Метка \"Автодубляж\" скрыта - Метка \"Автодубляж\" показана - Скрыть кнопку \"Супер спасибо\" - Кнопка \"Купить Супер спасибо\" скрыта - Кнопка \"Купить Супер спасибо\" показана - Скрыть кнопку \"Эффект\" - Кнопка \"Эффект\" скрыта - Кнопка \"Эффект\" показана - Скрыть кнопку \"Зеленый экран\" - Кнопка \"Зеленый экран\" в Shorts скрыта - Кнопка \"Зеленый экран\" в Shorts показана - Скрыть кнопку хэштега - Кнопка хэштега в Shorts скрыта - Кнопка хэштега в Shorts показана - - Скрыть кнопку \"Присоединиться\" - Кнопка \"Присоединиться\" в Shorts скрыта - Кнопка \"Присоединиться\" в Shorts показана - Скрыть предпросмотр трансляции - Предварительный просмотр трансляции скрыт - Предварительный просмотр трансляции показан - Скрыть метку местоположения - Метка местоположения в Shorts скрыта - Метка местоположения в Shorts показана - Скрыть кнопку \"Новые публикации\" - Кнопка \"Новые публикации\" в плеере Shorts скрыта - Кнопка \"Новые публикации\" в плеере Shorts показана - Скрыть кнопки на паузе - Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts скрыты - Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts показаны - Скрыть превью комментариев - Превью комментариев под плеером скрыто - Превью комментариев под плеером показано - Скрыть кнопку \"Сохранить музыку\" - Кнопка \"Сохранить музыку\" в Shorts скрыта - Кнопка \"Сохранить музыку\" в Shorts показана - Скрыть поисковые предложения - Поисковые предложения в Shorts скрыты - Поисковые предложения в Shorts показаны - Скрыть кнопку \"Магазин\" - Кнопка \"Магазин\" в Shorts скрыта - Кнопка \"Магазин\" в Shorts показана - Скрыть стикеры - Стикеры в Shorts скрыты - Стикеры в Shorts показаны - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" в Shorts скрыта - Кнопка \"Подписаться\" в Shorts показана - Скрыть товары с тегом - Товары с тегом в Shorts скрыты - Товары с тегом в Shorts показаны - Скрыть кнопку \"Предстоящие события\" - Кнопка \"Предстоящие события\" в Shorts скрыта - Кнопка \"Предстоящие события\" в Shorts показана - Скрыть кнопку \"Использовать этот звук\" - Кнопка \"Использовать этот звук\" скрыта - Кнопка \"Использовать этот звук\" показана - Скрыть кнопку \"Использовать шаблон\" - Кнопка \"Использовать этот шаблон\" скрыта - Кнопка \"Использовать шаблон\" показана - Скрыть анимацию кнопки \"Лайк\" - Анимация кнопки \"Лайк\" в Shorts скрыта - Анимация кнопки \"Лайк\" в Shorts показана - Скрыть кнопку \"Лайк\" - Кнопка \"Лайк\" в Shorts скрыта - Кнопка \"Лайк\" в Shorts показана - Скрыть кнопку \"Дизлайк\" - Кнопка \"Дизлайк\" в Shorts скрыта - Кнопка \"Дизлайк\" в Shorts показана - Скрыть кнопку \"Комментарии\" - Кнопка \"Комментарии\" в Shorts скрыта - Кнопка \"Комментарии\" в Shorts показана - - Скрыть кнопку \"Поделиться\" - Кнопка \"Поделиться\" в Shorts скрыта - Кнопка \"Поделиться\" в Shorts показана - - Скрыть кнопку \"Ремикс\" - Кнопка \"Ремикс\" в Shorts скрыта - Кнопка \"Ремикс\" в Shorts показана - Скрыть кнопку \"Со звуком\" - Кнопка \"Со звуком\" в Shorts скрыта - Кнопка \"Со звуком\" в Shorts показана - Скрыть информационную панель - Информационная панель в Shorts скрыта - Информационная панель в Shorts показана - Скрыть панель канала - Панель канала в Shorts скрыта - Панель канала в Shorts показана - Скрыть заголовок видео - Название видео скрыто - Название видео показано - Скрыть метку звуковых метаданных - Метка звуковых метаданных скрыта - Метка звуковых метаданных показана - Скрыть метку ссылки на видео - Метка ссылки на полное видео в Shorts скрыта - Метка ссылки на полное видео в Shorts показана - Скрыть панель навигации - Панель навигации в Shorts скрыта - Панель навигации в Shorts показана - - - Скрыть предлагаемые видео в конце просмотра - "Предлагаемые видео в конце просмотра скрыты при выключенном автовоспроизведении + + Скрыть пункт \"Смотреть в VR-режиме\" + Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера скрыт + Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера показан + Скрыть меню качества видео + Меню качества видео в выдвижном меню плеера скрыто + Меню качества видео в выдвижном меню плеера показано + Скрыть колонтитул меню качества видео + Нижний колонтитул старого меню качества видео в выдвижном меню плеера скрыт + Нижний колонтитул старого меню качества видео в выдвижном меню плеера показан + + + Скрыть кнопку \"Автовоспроизведение\" + Кнопка \"Автовоспроизведение\" в плеере скрыта + Кнопка \"Автовоспроизведение\" в плеере показана + + Скрыть кнопку \"Субтитры\" + Кнопка \"Субтитры\" в плеере скрыта + Кнопка \"Субтитры\" в плеере показана + Скрыть кнопку \"Трансляция\" + Кнопка \"Трансляция\" в плеере скрыта + Кнопка \"Трансляция\" в плеере показана + Скрыть фон кнопок управления плеера + Фон кнопок управления плеера скрыт + Фон кнопок управления плеера показан + Скрыть кнопки предыдущего и следующего видео + Кнопки предыдущего и следующего видео в плеере скрыты + Кнопки предыдущего и следующего видео в плеере показаны + + + Скрыть заставки следующих видео + Заставки следующих видео в конце просмотра скрыты + Заставки следующих видео в конце просмотра показаны + + + Отключить фоновую подсветку + Фоновая подсветка в полноэкранном режиме отключена + Фоновая подсветка в полноэкранном режиме включена + + + Скрыть всплывающие подсказки + Всплывающие подсказки в плеере скрыты + Всплывающие подсказки в плеере показаны + + + Отключить анимированные счетчики + Анимированные счетчики просмотров, лайков и дизлайков отключены + Анимированные счетчики просмотров, лайков и дизлайков включены + + + Скрыть полосу прогресса плеера + Полоса прогресса в плеере скрыта + Полоса прогресса в плеере показана + + Скрыть полосу прогресса миниатюр видео + Полоса прогресса миниатюр видео скрыта + Полоса прогресса миниатюр видео показана + + + Компоненты плеера Shorts + Скрыть или показать компоненты плеера Shorts + + Скрыть Shorts в ленте \"Главной\" + Shorts в ленте \"Главной\" и похожих видео скрыты + Shorts в ленте \"Главной\" и похожих видео показаны + Скрыть Shorts в результатах поиска + Shorts в результатах поиска скрыты + Shorts в результатах поиска показаны + + Скрыть Shorts в ленте \"Подписок\" + Shorts в ленте \"Подписок\" скрыты + Shorts в ленте \"Подписок\" показаны + Скрыть Shorts в истории просмотров + Shorts в истории просмотров скрыты + Shorts в истории просмотров показаны + Скрыть метку \"Автодубляж\" + Метка \"Автодубляж\" скрыта + Метка \"Автодубляж\" показана + Скрыть кнопку \"Супер спасибо\" + Кнопка \"Купить Супер спасибо\" скрыта + Кнопка \"Купить Супер спасибо\" показана + Скрыть кнопку \"Эффект\" + Кнопка \"Эффект\" скрыта + Кнопка \"Эффект\" показана + Скрыть кнопку \"Зеленый экран\" + Кнопка \"Зеленый экран\" в Shorts скрыта + Кнопка \"Зеленый экран\" в Shorts показана + Скрыть кнопку хэштега + Кнопка хэштега в Shorts скрыта + Кнопка хэштега в Shorts показана + + Скрыть кнопку \"Присоединиться\" + Кнопка \"Присоединиться\" в Shorts скрыта + Кнопка \"Присоединиться\" в Shorts показана + Скрыть предпросмотр трансляции + Предварительный просмотр трансляции скрыт + Предварительный просмотр трансляции показан + Скрыть метку местоположения + Метка местоположения в Shorts скрыта + Метка местоположения в Shorts показана + Скрыть кнопку \"Новые публикации\" + Кнопка \"Новые публикации\" в плеере Shorts скрыта + Кнопка \"Новые публикации\" в плеере Shorts показана + Скрыть кнопки на паузе + Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts скрыты + Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts показаны + Скрыть превью комментариев + Превью комментариев под плеером скрыто + Превью комментариев под плеером показано + Скрыть кнопку \"Сохранить музыку\" + Кнопка \"Сохранить музыку\" в Shorts скрыта + Кнопка \"Сохранить музыку\" в Shorts показана + Скрыть поисковые предложения + Поисковые предложения в Shorts скрыты + Поисковые предложения в Shorts показаны + Скрыть кнопку \"Магазин\" + Кнопка \"Магазин\" в Shorts скрыта + Кнопка \"Магазин\" в Shorts показана + Скрыть стикеры + Стикеры в Shorts скрыты + Стикеры в Shorts показаны + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" в Shorts скрыта + Кнопка \"Подписаться\" в Shorts показана + Скрыть товары с тегом + Товары с тегом в Shorts скрыты + Товары с тегом в Shorts показаны + Скрыть кнопку \"Предстоящие события\" + Кнопка \"Предстоящие события\" в Shorts скрыта + Кнопка \"Предстоящие события\" в Shorts показана + Скрыть кнопку \"Использовать этот звук\" + Кнопка \"Использовать этот звук\" скрыта + Кнопка \"Использовать этот звук\" показана + Скрыть кнопку \"Использовать шаблон\" + Кнопка \"Использовать этот шаблон\" скрыта + Кнопка \"Использовать шаблон\" показана + Скрыть анимацию кнопки \"Лайк\" + Анимация кнопки \"Лайк\" в Shorts скрыта + Анимация кнопки \"Лайк\" в Shorts показана + Скрыть кнопку \"Лайк\" + Кнопка \"Лайк\" в Shorts скрыта + Кнопка \"Лайк\" в Shorts показана + Скрыть кнопку \"Дизлайк\" + Кнопка \"Дизлайк\" в Shorts скрыта + Кнопка \"Дизлайк\" в Shorts показана + Скрыть кнопку \"Комментарии\" + Кнопка \"Комментарии\" в Shorts скрыта + Кнопка \"Комментарии\" в Shorts показана + + Скрыть кнопку \"Поделиться\" + Кнопка \"Поделиться\" в Shorts скрыта + Кнопка \"Поделиться\" в Shorts показана + + Скрыть кнопку \"Ремикс\" + Кнопка \"Ремикс\" в Shorts скрыта + Кнопка \"Ремикс\" в Shorts показана + Скрыть кнопку \"Со звуком\" + Кнопка \"Со звуком\" в Shorts скрыта + Кнопка \"Со звуком\" в Shorts показана + Скрыть информационную панель + Информационная панель в Shorts скрыта + Информационная панель в Shorts показана + Скрыть панель канала + Панель канала в Shorts скрыта + Панель канала в Shorts показана + Скрыть заголовок видео + Название видео скрыто + Название видео показано + Скрыть метку звуковых метаданных + Метка звуковых метаданных скрыта + Метка звуковых метаданных показана + Скрыть метку ссылки на видео + Метка ссылки на полное видео в Shorts скрыта + Метка ссылки на полное видео в Shorts показана + Скрыть панель навигации + Панель навигации в Shorts скрыта + Панель навигации в Shorts показана + + + Скрыть предлагаемые видео в конце просмотра + "Предлагаемые видео в конце просмотра скрыты при выключенном автовоспроизведении Автовоспроизведение можно изменить в настройках YouTube: Настройки → Фоновое воспроизведение → Следующее видео" - Предлагаемые видео в конце просмотра показаны - - - Скрыть похожие видео - Похожие видео в полноэкранном режиме скрыты - Похожие видео в полноэкранном режиме показаны - - - Скрыть метку времени видео - Метка времени видео над полосой прогресса скрыта - Метка времени видео над полосой прогресса показана - - - Скрыть всплывающие панели плеера - Автоматически всплывающие панели в плеере скрыты - Автоматически всплывающие панели в плеере показаны - - - Выходить из полноэкранного режима по окончании видео - Отключено - Портрет - Ландшафт - Портрет и ландшафт - - - Открыть видео в полноэкранной портретной ориентации - Видео открываются в полноэкранной портретной ориентации - Видео не открываются в полноэкранной портретной ориентации - - - Затемнение плеера при нажатии - Значение затемнения при нажатии на плеер от 0 до 100, где 0 - это прозрачно - Значение затемнения плеера должно быть от 0 до 100 - - - - Дизлайки временно недоступны (таймаут API) - Дизлайки недоступны (статус %d) - Дизлайки недоступны (лимит клиентов API) - Дизлайки недоступны (%s) - - Обновите видео для голосования с помощью Return YouTube Dislike - - Скрыто владельцем - Вернуть YouTube дизлайки - Дизлайки показаны - Дизлайки скрыты - Показать дизлайки в Shorts - "Дизлайки в Shorts показаны + Предлагаемые видео в конце просмотра показаны + + + Скрыть похожие видео + Похожие видео в полноэкранном режиме скрыты + Похожие видео в полноэкранном режиме показаны + + + Скрыть метку времени видео + Метка времени видео над полосой прогресса скрыта + Метка времени видео над полосой прогресса показана + + + Скрыть всплывающие панели плеера + Автоматически всплывающие панели в плеере скрыты + Автоматически всплывающие панели в плеере показаны + + + Выходить из полноэкранного режима по окончании видео + Отключено + Портрет + Ландшафт + Портрет и ландшафт + + + Открыть видео в полноэкранной портретной ориентации + Видео открываются в полноэкранной портретной ориентации + Видео не открываются в полноэкранной портретной ориентации + + + Затемнение плеера при нажатии + Значение затемнения при нажатии на плеер от 0 до 100, где 0 - это прозрачно + Значение затемнения плеера должно быть от 0 до 100 + + + + Дизлайки временно недоступны (таймаут API) + Дизлайки недоступны (статус %d) + Дизлайки недоступны (лимит клиентов API) + Дизлайки недоступны (%s) + + Обновите видео для голосования с помощью Return YouTube Dislike + + Скрыто владельцем + Вернуть YouTube дизлайки + Дизлайки показаны + Дизлайки скрыты + Показать дизлайки в Shorts + "Дизлайки в Shorts показаны Ограничение: дизлайки могут не показываться в режиме инкогнито" - Дизлайки в Shorts скрыты - Показать дизлайки в процентах - Дизлайки показаны в процентах - Дизлайки показаны как число - - Компактная кнопка \"Лайк\" - Кнопка \"Лайк\" стилизована для минимальной ширины - Кнопка \"Лайк\" стилизована для лучшего внешнего вида - Показать примерное количество лайков - Для видео с отключенными лайками показывается примерное количество лайков - Примерное количество лайков скрыто - Уведомление при недоступности API - Всплывающее уведомление при недоступности Return YouTube Dislike показано - Всплывающее уведомление при недоступности Return YouTube Dislike скрыто - ReturnYouTubeDislike.com - Данные предоставлены Return YouTube Dislike API. Нажмите для дополнительной информации - - Статистика Return YouTube Dislike API этого устройства - Время ответа API, среднее - Время ответа API, минимальное - Время ответа API, максимальное - Время ответа API, последнее видео - Дизлайки временно недоступны – действует ограничение скорости клиентского API - API получает голоса, количество запросов - Сетевые запросы не выполнены - Выполнено %d сетевых запросов - API получает голоса, количество таймаутов - Сетевые запросы не имели таймаутов - Таймаут %d сетевых запросов - Ограничения скорости клиента API - Ограничения скорости клиента API не обнаружены - Ограничения скорости клиента API обнаружены %d раз - %d миллисекунд - - - Включить широкую панель поиска - Широкая панель поиска вместо кнопки поиска включена (логотип YouTube будет скрыт) - Широкая панель поиска отключена - - - Включить высокое качество миниатюр - Миниатюры полосы прогресса при перемотке имеют высокое качество - Миниатюры полосы прогресса при перемотке имеют среднее качество - Полноэкранные миниатюры полосы прогресса при перемотке имеют высокое качество - Полноэкранные миниатюры полосы прогресса при перемотке имеют среднее качество - "Данная опция также восстановит миниатюры в прямых трансляциях, которые не имеют миниатюр полосы прогресса. + Дизлайки в Shorts скрыты + Показать дизлайки в процентах + Дизлайки показаны в процентах + Дизлайки показаны как число + + Компактная кнопка \"Лайк\" + Кнопка \"Лайк\" стилизована для минимальной ширины + Кнопка \"Лайк\" стилизована для лучшего внешнего вида + Показать примерное количество лайков + Для видео с отключенными лайками показывается примерное количество лайков + Примерное количество лайков скрыто + Уведомление при недоступности API + Всплывающее уведомление при недоступности Return YouTube Dislike показано + Всплывающее уведомление при недоступности Return YouTube Dislike скрыто + ReturnYouTubeDislike.com + Данные предоставлены Return YouTube Dislike API. Нажмите для дополнительной информации + + Статистика Return YouTube Dislike API этого устройства + Время ответа API, среднее + Время ответа API, минимальное + Время ответа API, максимальное + Время ответа API, последнее видео + Дизлайки временно недоступны – действует ограничение скорости клиентского API + API получает голоса, количество запросов + Сетевые запросы не выполнены + Выполнено %d сетевых запросов + API получает голоса, количество таймаутов + Сетевые запросы не имели таймаутов + Таймаут %d сетевых запросов + Ограничения скорости клиента API + Ограничения скорости клиента API не обнаружены + Ограничения скорости клиента API обнаружены %d раз + %d миллисекунд + + + Включить широкую панель поиска + Широкая панель поиска вместо кнопки поиска включена (логотип YouTube будет скрыт) + Широкая панель поиска отключена + + + Включить высокое качество миниатюр + Миниатюры полосы прогресса при перемотке имеют высокое качество + Миниатюры полосы прогресса при перемотке имеют среднее качество + Полноэкранные миниатюры полосы прогресса при перемотке имеют высокое качество + Полноэкранные миниатюры полосы прогресса при перемотке имеют среднее качество + "Данная опция также восстановит миниатюры в прямых трансляциях, которые не имеют миниатюр полосы прогресса. Миниатюры полосы прогресса будут использовать такое же качество, как и текущее видео. Данная опция работает лучше с качеством видео 720p или ниже, и при использовании очень быстрого подключения к Интернету." - Включить старые миниатюры - Старые миниатюры полосы прогресса включены и показываются в мини окнах над полосой прогресса - Старые миниатюры полосы прогресса отключены и показываются в виде полноэкранных миниатюр - - - SponsorBlock - Включить SponsorBlock - SponsorBlock – это краудсорсинговая система для пропуска раздражающих фрагментов видео YouTube - Внешний вид - Показать кнопку голосования за сегмент - Кнопка голосования за сегмент показана - Кнопка голосования за сегмент скрыта - Использовать квадратный макет - Кнопки и элементы управления квадратные - Кнопки и элементы управления закругленные - - Стиль кнопки пропуска - Кнопка пропуска стилизована для минимальной ширины - Кнопка пропуска стилизована для лучшего внешнего вида - Автоскрытие кнопки пропуска - Кнопка пропуска автоматически скрывается через несколько секунд - Кнопка пропуска показывается для всего сегмента - Длительность показа кнопки пропуска - Длительность показа кнопок пропуска и перехода к основному моменту до автоматического скрытия - Показывать уведомление отмены пропуска - Всплывающее уведомление показано при автоматическом пропуске сегмента. Нажмите на всплывающее уведомление для отмены пропуска - Всплывающее уведомление скрыто - Длительность всплывающего уведомления при пропуске - Длительность показа всплывающего сообщения об отмене пропуска - 1 секунда - 2 секунды - 3 секунды - 4 секунды - 5 секунд - 6 секунд - 7 секунд - 8 секунд - 9 секунд - 10 секунд - Показать длительность видео без сегментов - Длина видео без учета всех сегментов показана на полосе прогресса - Полная длительность видео показана - Создание новых сегментов - Показать кнопку создания сегмента - Кнопка создания нового сегмента показана - Кнопка создания нового сегмента скрыта - Настроить шаг нового сегмента - Длительность (в миллисекундах) перемотки кнопками регулировки времени при создании новых сегментов - Значение должно быть положительным числом - Просмотреть инструкцию - Инструкция содержит правила и советы по созданию новых сегментов - Следуйте инструкциям - Перед созданием новых сегментов прочтите инструкции SponsorBlock - Уже прочитано - Показать - Общие настройки - Уведомление при недоступности API - Всплывающее уведомление при недоступности SponsorBlock показано - Всплывающее уведомление при недоступности SponsorBlock скрыто - Включить подсчет количества пропусков - Это позволяет системе лидеров SponsorBlock знать, сколько времени было сэкономлено. Сообщение отправляется на сервер каждый раз при пропуске сегмента - Подсчет количества пропусков отключен - Минимальная продолжительность сегмента - Сегменты короче данного значения (в секундах) не будут показаны или пропущены - Недопустимая длительность - Ваш идентификатор пользователя - Уникальный идентификатор пользователя должен быть конфиденциальным. Он как пароль - не должен никому передаваться. Имеющий доступ к нему может выдать себя за Вас - Уникальный идентификатор пользователя должен содержать не менее 30 символов - Изменить URL-адрес API - Адрес, используемый SponsorBlock для вызовов на сервер - URL-адрес API сброшен - URL-адрес API недействителен - URL-адрес API изменен - Резервное копирование настроек - Копировать - Ваша JSON конфигурация SponsorBlock, которая может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock - Ваша конфигурация JSON SponsorBlock может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock. Она включает в себя Ваш личный идентификатор пользователя. Подумайте дважды перед тем, как делиться ею с кем-либо - Настройки успешно импортированы - Не удалось импортировать: %s - Не удалось экспортировать: %s - "Ваши настройки SponsorBlock содержат уникальный идентификатор пользователя. + Включить старые миниатюры + Старые миниатюры полосы прогресса включены и показываются в мини окнах над полосой прогресса + Старые миниатюры полосы прогресса отключены и показываются в виде полноэкранных миниатюр + + + SponsorBlock + Включить SponsorBlock + SponsorBlock – это краудсорсинговая система для пропуска раздражающих фрагментов видео YouTube + Внешний вид + Показать кнопку голосования за сегмент + Кнопка голосования за сегмент показана + Кнопка голосования за сегмент скрыта + Использовать квадратный макет + Кнопки и элементы управления квадратные + Кнопки и элементы управления закругленные + + Стиль кнопки пропуска + Кнопка пропуска стилизована для минимальной ширины + Кнопка пропуска стилизована для лучшего внешнего вида + Автоскрытие кнопки пропуска + Кнопка пропуска автоматически скрывается через несколько секунд + Кнопка пропуска показывается для всего сегмента + Длительность показа кнопки пропуска + Длительность показа кнопок пропуска и перехода к основному моменту до автоматического скрытия + Показывать уведомление отмены пропуска + Всплывающее уведомление показано при автоматическом пропуске сегмента. Нажмите на всплывающее уведомление для отмены пропуска + Всплывающее уведомление скрыто + Длительность всплывающего уведомления при пропуске + Длительность показа всплывающего сообщения об отмене пропуска + 1 секунда + 2 секунды + 3 секунды + 4 секунды + 5 секунд + 6 секунд + 7 секунд + 8 секунд + 9 секунд + 10 секунд + Показать длительность видео без сегментов + Длина видео без учета всех сегментов показана на полосе прогресса + Полная длительность видео показана + Создание новых сегментов + Показать кнопку создания сегмента + Кнопка создания нового сегмента показана + Кнопка создания нового сегмента скрыта + Настроить шаг нового сегмента + Длительность (в миллисекундах) перемотки кнопками регулировки времени при создании новых сегментов + Значение должно быть положительным числом + Просмотреть инструкцию + Инструкция содержит правила и советы по созданию новых сегментов + Следуйте инструкциям + Перед созданием новых сегментов прочтите инструкции SponsorBlock + Уже прочитано + Показать + Общие настройки + Уведомление при недоступности API + Всплывающее уведомление при недоступности SponsorBlock показано + Всплывающее уведомление при недоступности SponsorBlock скрыто + Включить подсчет количества пропусков + Это позволяет системе лидеров SponsorBlock знать, сколько времени было сэкономлено. Сообщение отправляется на сервер каждый раз при пропуске сегмента + Подсчет количества пропусков отключен + Минимальная продолжительность сегмента + Сегменты короче данного значения (в секундах) не будут показаны или пропущены + Недопустимая длительность + Ваш идентификатор пользователя + Уникальный идентификатор пользователя должен быть конфиденциальным. Он как пароль - не должен никому передаваться. Имеющий доступ к нему может выдать себя за Вас + Уникальный идентификатор пользователя должен содержать не менее 30 символов + Изменить URL-адрес API + Адрес, используемый SponsorBlock для вызовов на сервер + URL-адрес API сброшен + URL-адрес API недействителен + URL-адрес API изменен + Резервное копирование настроек + Копировать + Ваша JSON конфигурация SponsorBlock, которая может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock + Ваша конфигурация JSON SponsorBlock может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock. Она включает в себя Ваш личный идентификатор пользователя. Подумайте дважды перед тем, как делиться ею с кем-либо + Настройки успешно импортированы + Не удалось импортировать: %s + Не удалось экспортировать: %s + "Ваши настройки SponsorBlock содержат уникальный идентификатор пользователя. Ваш идентификатор пользователя как пароль, им не стоит ни с кем делиться. " - Не показывать снова - Изменить поведение сегмента - Спонсорская реклама - Рекламные интеграции, реферальные ссылки и прямая реклама. Не для саморекламы или рекомендаций различных событий/создателей/сайтов/продуктов, которые нравятся автору видео - Бесплатная реклама/самореклама - Подобно \"Спонсорской рекламе\", за исключением неоплачиваемой рекламы или саморекламы. Включает разделы о товарах, пожертвованиях или информации о том, с кем сотрудничал автор - Напоминание о взаимодействии (подписка) - Короткое напоминание поставить лайк, подписаться на канал или соцсети посреди видеоролика. Если эта вставка длительная или о чем-то конкретном, она должна классифицироваться как самореклама - Основной момент - Часть видео, которая интересна большинству людей - Пауза/Заставка - Интервал без фактического содержания. Может быть паузой, статическим кадром или повторяющейся анимацией. Не включает переходы, содержащие информацию - Конечные заставки / Титры - Титры или время появления конечных заставок YouTube. Не для выводов с информацией - Вступление / Приветствие - Трейлеры с закадровым голосом для предстоящего видео, приветствия и прощания. Не включает разделы, добавляющие дополнительный контент - Предпросмотр / Пересказ - Фрагменты, повторяющие текущее видео или предыдущие серии - Отвлеченные темы / Шутки - Отвлеченные сцены или шутки, которые не требуются для понимания основного содержания видео. Не включает разделы, предоставляющие контекст или фоновые детали - Музыка: сегмент без музыки - Только для использования в музыкальных видеороликах. Разделы музыкальных видео без музыки, которые еще не охвачены другой категорией - Пропустить - Основной момент - Пропустить спонсорскую рекламу - Пропустить промо - Пропустить взаимодействие - Перейти к основному моменту - Пропустить вступление - Пропустить паузу - Пропустить паузу - Пропустить концовку - Пропустить вступление - Пропустить предпросмотр - Пропустить предпросмотр - Пропустить пересказ - Пропустить отвлеченные темы - Пропустить сегмент без музыки - Пропустить сегмент - Спонсорская реклама пропущена - Самореклама пропущена - Назойливое напоминание пропущено - Пропущено к основному моменту - Вступление пропущено - Пауза пропущена - Пауза пропущена - Концовка пропущена - Вступление пропущено - Предпросмотр пропущен - Предпросмотр пропущен - Пересказ пропущен - Отвлеченные темы пропущены - Сегмент без музыки пропущен - Неподтвержденный сегмент пропущен - Несколько сегментов пропущены - Пропускать автоматически - Пропускать автоматически один раз - Показать кнопку пропуска - Показать в полосе прогресса - Отключить - Невозможно отправить сегмент: %s - SponsorBlock временно не работает - Невозможно отправить сегмент (статус: %1$d %2$s) - Невозможно отправить сегмент. Частота ограничена (слишком много от одного пользователя или IP) - Невозможно отправить сегмент: %s - "Невозможно отправить сегмент. + Не показывать снова + Изменить поведение сегмента + Спонсорская реклама + Рекламные интеграции, реферальные ссылки и прямая реклама. Не для саморекламы или рекомендаций различных событий/создателей/сайтов/продуктов, которые нравятся автору видео + Бесплатная реклама/самореклама + Подобно \"Спонсорской рекламе\", за исключением неоплачиваемой рекламы или саморекламы. Включает разделы о товарах, пожертвованиях или информации о том, с кем сотрудничал автор + Напоминание о взаимодействии (подписка) + Короткое напоминание поставить лайк, подписаться на канал или соцсети посреди видеоролика. Если эта вставка длительная или о чем-то конкретном, она должна классифицироваться как самореклама + Основной момент + Часть видео, которая интересна большинству людей + Пауза/Заставка + Интервал без фактического содержания. Может быть паузой, статическим кадром или повторяющейся анимацией. Не включает переходы, содержащие информацию + Конечные заставки / Титры + Титры или время появления конечных заставок YouTube. Не для выводов с информацией + Вступление / Приветствие + Трейлеры с закадровым голосом для предстоящего видео, приветствия и прощания. Не включает разделы, добавляющие дополнительный контент + Предпросмотр / Пересказ + Фрагменты, повторяющие текущее видео или предыдущие серии + Отвлеченные темы / Шутки + Отвлеченные сцены или шутки, которые не требуются для понимания основного содержания видео. Не включает разделы, предоставляющие контекст или фоновые детали + Музыка: сегмент без музыки + Только для использования в музыкальных видеороликах. Разделы музыкальных видео без музыки, которые еще не охвачены другой категорией + Пропустить + Основной момент + Пропустить спонсорскую рекламу + Пропустить промо + Пропустить взаимодействие + Перейти к основному моменту + Пропустить вступление + Пропустить паузу + Пропустить паузу + Пропустить концовку + Пропустить вступление + Пропустить предпросмотр + Пропустить предпросмотр + Пропустить пересказ + Пропустить отвлеченные темы + Пропустить сегмент без музыки + Пропустить сегмент + Спонсорская реклама пропущена + Самореклама пропущена + Назойливое напоминание пропущено + Пропущено к основному моменту + Вступление пропущено + Пауза пропущена + Пауза пропущена + Концовка пропущена + Вступление пропущено + Предпросмотр пропущен + Предпросмотр пропущен + Пересказ пропущен + Отвлеченные темы пропущены + Сегмент без музыки пропущен + Неподтвержденный сегмент пропущен + Несколько сегментов пропущены + Пропускать автоматически + Пропускать автоматически один раз + Показать кнопку пропуска + Показать в полосе прогресса + Отключить + Невозможно отправить сегмент: %s + SponsorBlock временно не работает + Невозможно отправить сегмент (статус: %1$d %2$s) + Невозможно отправить сегмент. Частота ограничена (слишком много от одного пользователя или IP) + Невозможно отправить сегмент: %s + "Невозможно отправить сегмент. Уже существует" - Сегмент успешно отправлен - - SponsorBlock временно недоступен (время API истекло) - SponsorBlock временно недоступен (статус %d) - SponsorBlock временно недоступен - Невозможно проголосовать за сегмент (время API истекло) - Невозможно проголосовать за сегмент (статус: %1$d %2$s) - Невозможно проголосовать за сегмент: %s - Голос \"за\" - Голос \"против\" - Изменить категорию - Нет сегментов для голосования - - %1$s до %2$s - Выбрать категорию сегмента - Категория отключена в настройках. Включите категорию для отправки. - Новый сегмент SponsorBlock - Установить %s в качестве начала или конца нового сегмента? - Начало - Конец - Сейчас - Время начала сегмента - Время окончания сегмента - Верно ли выбрано время? - "Сегмент от + Сегмент успешно отправлен + + SponsorBlock временно недоступен (время API истекло) + SponsorBlock временно недоступен (статус %d) + SponsorBlock временно недоступен + Невозможно проголосовать за сегмент (время API истекло) + Невозможно проголосовать за сегмент (статус: %1$d %2$s) + Невозможно проголосовать за сегмент: %s + Голос \"за\" + Голос \"против\" + Изменить категорию + Нет сегментов для голосования + + %1$s до %2$s + Выбрать категорию сегмента + Категория отключена в настройках. Включите категорию для отправки. + Новый сегмент SponsorBlock + Установить %s в качестве начала или конца нового сегмента? + Начало + Конец + Сейчас + Время начала сегмента + Время окончания сегмента + Верно ли выбрано время? + "Сегмент от %1$s до @@ -1292,47 +1291,47 @@ Second \"item\" text" (%3$s) Готов к отправке?" - Начало должно быть перед окончанием - Сначала отметьте два места на шкале времени - Просмотрите сегмент и убедитесь, что пропуск происходит плавно - Изменить время сегмента вручную - Вы хотите изменить время начала или окончания сегмента? - Указано неверное время - Статистика - - Статистика временно недоступна (API отключен) - Загрузка... - SponsorBlock отключен - Ваше имя пользователя: <b>%s</b> - Нажмите для изменения Вашего имени пользователя - Невозможно изменить имя пользователя: Статус: %1$d %2$s - Имя пользователя успешно изменено - Ваша репутация - <b>%.2f</b> - Вы создали <b>%s</b> сегментов - Нажмите здесь для просмотра Ваших сегментов - Таблица лидеров SponsorBlock - Вы избавили людей от <b>%s</b> сегментов - Нажмите для просмотра глобальной статистики и лучших участников - Это <b>%s</b> их жизни.<br>Нажмите для просмотра таблицы лидеров - Вы пропустили <b>%s</b> сегментов - Это <b>%s</b> - Сбросить счетчик пропущенных сегментов? - %1$s часов %2$s минут - %1$s минут(ы) %2$s секунд(ы) - %s секунд - Непрозрачность: - Цвет: - Об интеграции - sponsor.ajay.app - Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ - - - Макет интерфейса - По умолчанию - Телефонный - Планшетный - Автомобильный - "Изменения включают: + Начало должно быть перед окончанием + Сначала отметьте два места на шкале времени + Просмотрите сегмент и убедитесь, что пропуск происходит плавно + Изменить время сегмента вручную + Вы хотите изменить время начала или окончания сегмента? + Указано неверное время + Статистика + + Статистика временно недоступна (API отключен) + Загрузка... + SponsorBlock отключен + Ваше имя пользователя: <b>%s</b> + Нажмите для изменения Вашего имени пользователя + Невозможно изменить имя пользователя: Статус: %1$d %2$s + Имя пользователя успешно изменено + Ваша репутация - <b>%.2f</b> + Вы создали <b>%s</b> сегментов + Нажмите здесь для просмотра Ваших сегментов + Таблица лидеров SponsorBlock + Вы избавили людей от <b>%s</b> сегментов + Нажмите для просмотра глобальной статистики и лучших участников + Это <b>%s</b> их жизни.<br>Нажмите для просмотра таблицы лидеров + Вы пропустили <b>%s</b> сегментов + Это <b>%s</b> + Сбросить счетчик пропущенных сегментов? + %1$s часов %2$s минут + %1$s минут(ы) %2$s секунд(ы) + %s секунд + Непрозрачность: + Цвет: + Об интеграции + sponsor.ajay.app + Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ + + + Макет интерфейса + По умолчанию + Телефонный + Планшетный + Автомобильный + "Изменения включают: Планшетный макет • Посты сообщества скрыты @@ -1340,329 +1339,329 @@ Second \"item\" text" Автомобильный макет • Shorts открываются в стандартном плеере • Лента организована по темам и каналам" - - - Подменить версию приложения - Версия приложения подменена - Версия приложения не подменена - "Версия приложения будет подменена на более раннюю версию YouTube. + + + Подменить версию приложения + Версия приложения подменена + Версия приложения не подменена + "Версия приложения будет подменена на более раннюю версию YouTube. Это изменит вид и функции приложения, но могут случиться неизвестные побочные эффекты. Если позже данный параметр будет отключен, рекомендуется очистить данные приложения для предотвращения проблем с пользовательским интерфейсом." - Подменить версию приложения на - 20.13.41 - Восстановить не свернутую панель действий видео - 20.05.46 - Восстановление функциональности транскрипции - 19.35.36 - Восстановление старых иконок плеера Shorts - 19.01.34 - Восстановление старых иконок панели навигации - - - Изменить начальную страницу - По умолчанию - Все подписки - Просмотр каналов - Курсы / Обучение - Навигатор - Мода и Красота - Игры - История просмотров - Библиотека - Понравившиеся видео - Прямые трансляции - Фильмы - Музыка - Новости - Уведомления - Плейлисты - Поиск - Покупки - Шортс - Спорт - Подписки - Популярные - Виртуальная реальность - Смотреть позже - Ваши клипы - Всегда изменять начальную страницу - "Начальная страница изменяется всегда + Подменить версию приложения на + 20.13.41 - Восстановить не свернутую панель действий видео + 20.05.46 - Восстановление функциональности транскрипции + 19.35.36 - Восстановление старых иконок плеера Shorts + 19.01.34 - Восстановление старых иконок панели навигации + + + Изменить начальную страницу + По умолчанию + Все подписки + Просмотр каналов + Курсы / Обучение + Навигатор + Мода и Красота + Игры + История просмотров + Библиотека + Понравившиеся видео + Прямые трансляции + Фильмы + Музыка + Новости + Уведомления + Плейлисты + Поиск + Покупки + Шортс + Спорт + Подписки + Популярные + Виртуальная реальность + Смотреть позже + Ваши клипы + Всегда изменять начальную страницу + "Начальная страница изменяется всегда Ограничение: использование кнопки \"Назад\" на панели инструментов может не работать" - Начальная страница изменяется только при запуске приложения - - - Отключить возобновление плеера Shorts - Возобновление плеера Shorts при запуске приложения отключено - Возобновление плеера Shorts при запуске приложения включено - - - Плеер для открытия Shorts - Плеер Shorts - Стандартный плеер - Стандартный полноэкранный плеер - - - Автовоспроизведение Shorts - Shorts будут автоматически воспроизводиться одно за другим - Shorts будут повторяться - Автовоспроизведение Shorts в фоне - Shorts будут автоматически воспроизводиться одно за другим в фоновом режиме - Shorts будут повторяться в фоновом режиме - - - Миниплеер - Изменить стиль свернутого миниплеера - Тип миниплеера - Отключено - Стандартный - Минимальный - Планшетный - Современный 1 - Современный 2 - Современный 3 - Современный 4 - Отключить закругление углов - Углы миниплеера квадратны - Углы миниплеера закруглены - Включить двойное нажатие и изменение размера щипком - "Двойное нажатие и изменение размера щипком включены + Начальная страница изменяется только при запуске приложения + + + Отключить возобновление плеера Shorts + Возобновление плеера Shorts при запуске приложения отключено + Возобновление плеера Shorts при запуске приложения включено + + + Плеер для открытия Shorts + Плеер Shorts + Стандартный плеер + Стандартный полноэкранный плеер + + + Автовоспроизведение Shorts + Shorts будут автоматически воспроизводиться одно за другим + Shorts будут повторяться + Автовоспроизведение Shorts в фоне + Shorts будут автоматически воспроизводиться одно за другим в фоновом режиме + Shorts будут повторяться в фоновом режиме + + + Миниплеер + Изменить стиль свернутого миниплеера + Тип миниплеера + Отключено + Стандартный + Минимальный + Планшетный + Современный 1 + Современный 2 + Современный 3 + Современный 4 + Отключить закругление углов + Углы миниплеера квадратны + Углы миниплеера закруглены + Включить двойное нажатие и изменение размера щипком + "Двойное нажатие и изменение размера щипком включены • Двойное нажатие для увеличения размера миниплеера • Двойное нажатие еще раз для восстановления исходного размера" - Двойное нажатие и изменение размера щипком отключены - Отключить перетаскивание - Перетаскивание отключено - "Перетаскивание включено + Двойное нажатие и изменение размера щипком отключены + Отключить перетаскивание + Перетаскивание отключено + "Перетаскивание включено Миниплеер можно перетащить в любой угол экрана" - Отключить жест горизонтального перетаскивания - Жест горизонтального перетаскивания отключен - "Жест горизонтального перетаскивания включен + Отключить жест горизонтального перетаскивания + Жест горизонтального перетаскивания отключен + "Жест горизонтального перетаскивания включен Миниплеер можно перетаскивать за пределы экрана влево или вправо" - Скрыть кнопки миниплеера - Кнопки миниплеера скрыты - Кнопки миниплеера показаны - Скрыть кнопки разворачивания и закрытия - "Кнопки разворачивания и закрытия скрыты + Скрыть кнопки миниплеера + Кнопки миниплеера скрыты + Кнопки миниплеера показаны + Скрыть кнопки разворачивания и закрытия + "Кнопки разворачивания и закрытия скрыты Проведите по миниплееру для его разворачивания или закрытия" - Кнопки разворачивания и закрытия показаны - Скрыть подтексты - Подтексты в миниплеере скрыты - Подтексты в миниплеере показаны - Скрыть кнопки перемотки - Кнопки перемотки вперед и назад в миниплеере скрыты - Кнопки перемотки вперед и назад в миниплеере показаны - Начальный размер - Начальный размер миниплеера на экране, в пикселях - Размер в пикселях должен быть между %1$s и %2$s - Затемнение миниплеера при нажатии - Значение затемнения при нажатии на миниплеер от 0 до 100, где 0 - это прозрачно - Значение затемнения миниплеера должно быть от 0 до 100 - - - Включить градиентный фон экрана загрузки - Градиентный фон экрана загрузки макета включен - Сплошной фон экрана загрузки макета включен - Стиль экрана заставки - Цветной - Черно-белый - Включить кастомный цвет полосы прогресса - Кастомный цвет полосы прогресса включен - Оригинальный цвет полосы прогресса включен - Кастомный цвет полосы прогресса - Цвет полосы прогресса - Кастомный вторичный цвет полосы прогресса - Вторичный цвет полосы прогресса - Неверное значение цвета полосы прогресса - - - YouTube ReVanced - YT ReVanced - YT - - - Логотип заголовка - По умолчанию - Обычный - Премиум - ReVanced - - ReVanced минимальный - Кастомный - - - Обход региональных ограничений изображений - Использование хоста изображений yt4.ggpht.com - "Использование оригинального хоста изображений + Кнопки разворачивания и закрытия показаны + Скрыть подтексты + Подтексты в миниплеере скрыты + Подтексты в миниплеере показаны + Скрыть кнопки перемотки + Кнопки перемотки вперед и назад в миниплеере скрыты + Кнопки перемотки вперед и назад в миниплеере показаны + Начальный размер + Начальный размер миниплеера на экране, в пикселях + Размер в пикселях должен быть между %1$s и %2$s + Затемнение миниплеера при нажатии + Значение затемнения при нажатии на миниплеер от 0 до 100, где 0 - это прозрачно + Значение затемнения миниплеера должно быть от 0 до 100 + + + Включить градиентный фон экрана загрузки + Градиентный фон экрана загрузки макета включен + Сплошной фон экрана загрузки макета включен + Стиль экрана заставки + Цветной + Черно-белый + Включить кастомный цвет полосы прогресса + Кастомный цвет полосы прогресса включен + Оригинальный цвет полосы прогресса включен + Кастомный цвет полосы прогресса + Цвет полосы прогресса + Кастомный вторичный цвет полосы прогресса + Вторичный цвет полосы прогресса + Неверное значение цвета полосы прогресса + + + YouTube ReVanced + YT ReVanced + YT + + + Логотип заголовка + По умолчанию + Обычный + Премиум + ReVanced + + ReVanced минимальный + Кастомный + + + Обход региональных ограничений изображений + Использование хоста изображений yt4.ggpht.com + "Использование оригинального хоста изображений Активация данной опции может исправить недостающие изображения, которые заблокированы в некоторых регионах " - - - - Вкладка \"Главная\" - - Вкладка \"Подписки\" - - Вкладка \"Вы\" - Плейлисты плеера и рекомендации - Результаты поиска - Оригинальные миниатюры - DeArrow и оригинальные миниатюры - DeArrow и захват кадра - Захват кадра - DeArrow - "DeArrow предоставляет краудсорсинговые миниатюры (часто более релевантные) для видео YouTube + + + + Вкладка \"Главная\" + + Вкладка \"Подписки\" + + Вкладка \"Вы\" + Плейлисты плеера и рекомендации + Результаты поиска + Оригинальные миниатюры + DeArrow и оригинальные миниатюры + DeArrow и захват кадра + Захват кадра + DeArrow + "DeArrow предоставляет краудсорсинговые миниатюры (часто более релевантные) для видео YouTube При активации URL-адреса видео (и никакие другие данные) будут отправлены на сервер API. При отсутствии миниатюр DeArrow в видео показываются оригинальные или миниатюры захвата кадра Нажмите для дополнительной информации о DeArrow" - Показать всплывающее уведомление при недоступности API - Всплывающее уведомление при недоступности DeArrow показано - Всплывающее уведомление при недоступности DeArrow скрыто - Конечная точка DeArrow API - URL-адрес конечной точки кэша миниатюр DeArrow - Захват кадра из видео - Кадры взяты из начала/середины/конца каждого видео. Эти изображения уже есть в YouTube и внешний API не используется - Быстрый захват кадра - Используется среднее качество кадра. Миниатюры будут грузиться быстрее, но возможна их потеря у трансляций, премьер или очень старых видео - Используется высокое качество кадра - Время видео для взятия кадра - Начало видео - Середина видео - Конец видео - - DeArrow временно недоступен (код статуса: %s) - DeArrow временно недоступен - - - Показать объявления ReVanced - Объявления ReVanced при запуске приложения показаны - Объявления ReVanced при запуске приложения скрыты - Показать объявления ReVanced при запуске приложения - Не удалось подключиться к поставщику объявлений - Закрыть - - - Включить повтор воспроизведения - Видео будет повторяться - Видео не будет повторяться - - - Показать кнопку повтора воспроизведения - Кнопка повтора воспроизведения показана - Кнопка повтора воспроизведения скрыта - Повтор видео включен - Повтор видео выключен - - - Пауза при прерывании звука - Воспроизведение приостанавливается, когда играет другой звук (например, навигация) - Громкость снижается при воспроизведении другого звука - - - Подменить размеры устройства - "Размеры устройства подменены + Показать всплывающее уведомление при недоступности API + Всплывающее уведомление при недоступности DeArrow показано + Всплывающее уведомление при недоступности DeArrow скрыто + Конечная точка DeArrow API + URL-адрес конечной точки кэша миниатюр DeArrow + Захват кадра из видео + Кадры взяты из начала/середины/конца каждого видео. Эти изображения уже есть в YouTube и внешний API не используется + Быстрый захват кадра + Используется среднее качество кадра. Миниатюры будут грузиться быстрее, но возможна их потеря у трансляций, премьер или очень старых видео + Используется высокое качество кадра + Время видео для взятия кадра + Начало видео + Середина видео + Конец видео + + DeArrow временно недоступен (код статуса: %s) + DeArrow временно недоступен + + + Показать объявления ReVanced + Объявления ReVanced при запуске приложения показаны + Объявления ReVanced при запуске приложения скрыты + Показать объявления ReVanced при запуске приложения + Не удалось подключиться к поставщику объявлений + Закрыть + + + Включить повтор воспроизведения + Видео будет повторяться + Видео не будет повторяться + + + Показать кнопку повтора воспроизведения + Кнопка повтора воспроизведения показана + Кнопка повтора воспроизведения скрыта + Повтор видео включен + Повтор видео выключен + + + Пауза при прерывании звука + Воспроизведение приостанавливается, когда играет другой звук (например, навигация) + Громкость снижается при воспроизведении другого звука + + + Подменить размеры устройства + "Размеры устройства подменены Более высокие качества видео могут быть разблокированы, однако при этом возможны заикания видео при воспроизведении, высокое потребление батареи и неизвестные побочные эффекты" - "Размеры устройства не подменены + "Размеры устройства не подменены Активация данной опции может разблокировать более высокие качества видео" - Активация данной опции может привести к заиканиям видео при воспроизведении, высокому потреблению батареи и неизвестным побочным эффектам. - - - Виброотклик - Изменить виброотклик - Отключить виброотклик между эпизодов - Виброотклик между эпизодов отключен - Виброотклик между эпизодов включен - Отключить виброотклик при покадровой перемотке - Виброотклик при покадровой перемотке отключен - Виброотклик при покадровой перемотке включен - Отключить виброотклик отмены перемотки - Виброотклик отмены перемотки отключен - Виброотклик отмены перемотки включен - Отключить виброотклик при масштабировании - Виброотклик при масштабировании отключен - Виброотклик при масштабировании включен - - - Если Вы недавно изменили данные для входа в свою учетную запись, удалите и переустановите MicroG. - - - Обход перенаправлений URL-адресов - Перенаправления URL-адресов (youtube.com/redirect) обходятся и исходные URL-адреса открываются напрямую - Перенаправления URL-адресов (youtube.com/redirect) не обходятся и исходные URL-адреса не открываются напрямую - - - Открывать ссылки в браузере - Ссылки открываются во внешнем браузере - Ссылки открываются во встроенном браузере - - - - Авто - Запоминать изменения качества видео - Изменения качества воспроизведения применяются ко всем видео - Изменения качества воспроизведения применяются только к текущему видео - Показать всплывающее уведомление при изменении качества видео - Всплывающее уведомление при изменении качества видео по умолчанию показано - Всплывающее уведомление при изменении качества видео по умолчанию скрыто - Качество видео по умолчанию в Wi-Fi сети - Качество видео по умолчанию в мобильной сети - Запоминать изменения качества Shorts - Изменения качества воспроизведения применяются ко всем Shorts - Изменения качества воспроизведения применяются только к текущему Short - Качество Shorts по умолчанию в Wi-Fi сети - Качество Shorts по умолчанию в мобильной сети - мобильной сети - Wi-Fi - Качество в %1$s изменено на: %2$s - Качество Shorts в %1$s изменено на: %2$s - - - Показать кнопку скорости воспроизведения - Кнопка диалога скорости показана. Нажмите и удерживайте, чтобы сбросить скорость воспроизведения до значения по умолчанию - Кнопка диалога скорости не показана - - - Показать кнопку качества видео - Кнопка качества видео показана. Нажмите и удерживайте, чтобы сбросить качество до значения по умолчанию - Кнопка качества видео скрыта - - - Показать кастомное меню скорости - Кастомное меню скорости воспроизведения показано - Кастомное меню скорости воспроизведения скрыто - Восстановить старое меню скорости воспроизведения - Старое меню скорости показано - Современное меню скорости показано - Кастомные скорости воспроизведения - Добавить или изменить кастомные скорости воспроизведения - Кастомные скорости должны быть меньше, чем %s - Недопустимые кастомные скорости воспроизведения - Автоматически - Кастомная скорость при нажатии и удержании - Значение кастомной скорости воспроизведения при нажатии и удержании от 0 до 8 - - - Запоминать изменения скорости воспроизведения - Изменения скорости воспроизведения применяются ко всем видео - Изменения скорости воспроизведения применяются только к текущему видео - Показать всплывающее уведомление при изменении скорости воспроизведения - Всплывающее уведомление при изменении скорости воспроизведения по умолчанию показано - Всплывающее уведомление при изменении скорости воспроизведения по умолчанию скрыто - Скорость воспроизведения по умолчанию - Скорость изменена на: %s - - - Отключить HDR видео - HDR видео отключено - HDR видео включено - Принудительное использование AVC (H.264) - Видеокодек принудительно установлен на AVC (H.264) - Видеокодек определяется автоматически - "Преимущества: + Активация данной опции может привести к заиканиям видео при воспроизведении, высокому потреблению батареи и неизвестным побочным эффектам. + + + Виброотклик + Изменить виброотклик + Отключить виброотклик между эпизодов + Виброотклик между эпизодов отключен + Виброотклик между эпизодов включен + Отключить виброотклик при покадровой перемотке + Виброотклик при покадровой перемотке отключен + Виброотклик при покадровой перемотке включен + Отключить виброотклик отмены перемотки + Виброотклик отмены перемотки отключен + Виброотклик отмены перемотки включен + Отключить виброотклик при масштабировании + Виброотклик при масштабировании отключен + Виброотклик при масштабировании включен + + + Если Вы недавно изменили данные для входа в свою учетную запись, удалите и переустановите MicroG. + + + Обход перенаправлений URL-адресов + Перенаправления URL-адресов (youtube.com/redirect) обходятся и исходные URL-адреса открываются напрямую + Перенаправления URL-адресов (youtube.com/redirect) не обходятся и исходные URL-адреса не открываются напрямую + + + Открывать ссылки в браузере + Ссылки открываются во внешнем браузере + Ссылки открываются во встроенном браузере + + + + Авто + Запоминать изменения качества видео + Изменения качества воспроизведения применяются ко всем видео + Изменения качества воспроизведения применяются только к текущему видео + Показать всплывающее уведомление при изменении качества видео + Всплывающее уведомление при изменении качества видео по умолчанию показано + Всплывающее уведомление при изменении качества видео по умолчанию скрыто + Качество видео по умолчанию в Wi-Fi сети + Качество видео по умолчанию в мобильной сети + Запоминать изменения качества Shorts + Изменения качества воспроизведения применяются ко всем Shorts + Изменения качества воспроизведения применяются только к текущему Short + Качество Shorts по умолчанию в Wi-Fi сети + Качество Shorts по умолчанию в мобильной сети + мобильной сети + Wi-Fi + Качество в %1$s изменено на: %2$s + Качество Shorts в %1$s изменено на: %2$s + + + Показать кнопку скорости воспроизведения + Кнопка диалога скорости показана. Нажмите и удерживайте, чтобы сбросить скорость воспроизведения до значения по умолчанию + Кнопка диалога скорости не показана + + + Показать кнопку качества видео + Кнопка качества видео показана. Нажмите и удерживайте, чтобы сбросить качество до значения по умолчанию + Кнопка качества видео скрыта + + + Показать кастомное меню скорости + Кастомное меню скорости воспроизведения показано + Кастомное меню скорости воспроизведения скрыто + Восстановить старое меню скорости воспроизведения + Старое меню скорости показано + Современное меню скорости показано + Кастомные скорости воспроизведения + Добавить или изменить кастомные скорости воспроизведения + Кастомные скорости должны быть меньше, чем %s + Недопустимые кастомные скорости воспроизведения + Автоматически + Кастомная скорость при нажатии и удержании + Значение кастомной скорости воспроизведения при нажатии и удержании от 0 до 8 + + + Запоминать изменения скорости воспроизведения + Изменения скорости воспроизведения применяются ко всем видео + Изменения скорости воспроизведения применяются только к текущему видео + Показать всплывающее уведомление при изменении скорости воспроизведения + Всплывающее уведомление при изменении скорости воспроизведения по умолчанию показано + Всплывающее уведомление при изменении скорости воспроизведения по умолчанию скрыто + Скорость воспроизведения по умолчанию + Скорость изменена на: %s + + + Отключить HDR видео + HDR видео отключено + HDR видео включено + Принудительное использование AVC (H.264) + Видеокодек принудительно установлен на AVC (H.264) + Видеокодек определяется автоматически + "Преимущества: • Может улучшить срок службы батареи • Может восстановить отсутствующие разрешения видео на старых устройствах @@ -1671,182 +1670,182 @@ Second \"item\" text" • Воспроизведение видео будет использовать больше интернет-трафика, чем VP9 или AV1 • HDR-видео не будут использовать AVC • Некоторые устройства не могут принудительно использовать AVC" - - - Показать расширенное меню качества видео - Расширенное меню качества видео показано - Расширенное меню качества видео скрыто - - - Включить перемотку видео слайдом - Перемотка видео слайдом включена - Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) - - - Разрешить Android VR AV1 - "Видеокодек: AVC (H.264), VP9 или AV1 + + + Показать расширенное меню качества видео + Расширенное меню качества видео показано + Расширенное меню качества видео скрыто + + + Включить перемотку видео слайдом + Перемотка видео слайдом включена + Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) + + + Разрешить Android VR AV1 + "Видеокодек: AVC (H.264), VP9 или AV1 Воспроизведение может зависать или пропускать кадры" - Видеокодек AVC (H.264) или VP9 - "Включение этой опции может использовать программное декодирование AV1. + Видеокодек AVC (H.264) или VP9 + "Включение этой опции может использовать программное декодирование AV1. Воспроизведение видео с AV1 может прерываться или пропускать кадры." - Побочные эффекты подмены - • Клиент экспериментальный и может перестать работать в любое время - • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах - • Пункт \"Звуковая дорожка\" отсутствует - • Отсутствует видеокодек AV1 - • Постоянный уровень громкости недоступен - • Видео для детей могут не воспроизводиться при выходе из системы или в режиме инкогнито - - • Принудительная оригинальная звуковая дорожка недоступна - Показать в \"Статистике для сисадминов\" - Тип клиента в \"Статистике для сисадминов\" показан - Тип клиента в \"Статистике для сисадминов\" скрыт - - - - - YT Music ReVanced - ReVanced Музыка - Музыка - - - Информация - Настройки рекламы - Общие настройки - Настройки плеера - Прочие настройки - - - Скрыть видеорекламу - Видеореклама в плеере скрыта - Видеореклама в плеере показана - - - Включить постоянный повтор - Постоянный повтор включен - Постоянный повтор отключен - - - Скрыть кнопку \"Трансляция\" - Кнопка \"Трансляция\" в плеере скрыта - Кнопка \"Трансляция\" в плеере показана - Скрыть кнопку истории - Кнопка истории скрыта - Кнопка истории показана - Скрыть кнопку уведомлений - Кнопка уведомлений скрыта - Кнопка уведомлений показана - Скрыть кнопку поиска - Кнопка поиска скрыта - Кнопка поиска показана - - - Скрыть панель категорий - Панель категорий скрыта - Панель категорий показана - - - Изменить цвет мини-плеера - Цвет мини-плеера соответствует полноэкранному плееру - Мини-плеер использует цвет по умолчанию - - - Панель навигации - Скрыть или изменить кнопки панели навигации - - Скрыть кнопку \"Главная\" - Кнопка \"Главная\" в панели навигации скрыта - Кнопка \"Главная\" в панели навигации показана - - Скрыть Сэмплы - Кнопка \"Семплы\" скрыта - Кнопка \"Семплы\" показана - - Скрыть кнопку \"Навигация\" - Кнопка \"Обзор\" скрыта - Кнопка \"Обзор\" показана - - Скрыть Библиотеку - Кнопка \"Библиотека\" скрыта - Кнопка \"Библиотека\" показана - - Скрыть кнопку \"Подписки\" - Кнопка \"Премиум\" скрыта - Кнопка \"Премиум\" показана - Скрыть панель навигации - Панель навигации скрыта - Панель навигации показана - Скрыть подписи кнопок навигации - Подписи кнопок навигации скрыты - Подписи кнопок навигации показаны - - - Скрыть ярлык \"Купить Music Premium\" - Ярлык \"Купить Music Premium\" скрыт - Ярлык \"Купить Music Premium\" показан - - - Скрыть кнопку \"Подписка\" - Кнопка \"Подписка\" скрыта - Кнопка \"Подписка\" показана - - - - - Заблокировать аудиорекламу - Аудиореклама заблокирована - Аудиореклама разблокирована - - - %s недоступен, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. - %s вернул ошибку, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. - Заблокировать встроенную видеорекламу - Отключено - Luminous прокси - PurpleAdBlock прокси - - - Заблокировать видеорекламу - Видеореклама заблокирована - Видеореклама разблокирована - - - Сообщение удалено - Показать удаленные сообщения - Не показывать удаленные сообщения - Скрыть удаленные сообщения за спойлером - Показать удаленные сообщения как перекрестный текст - - - Собирать Баллы канала автоматически - Баллы канала собираются автоматически - Баллы канала не собираются автоматически - - - - Включить режим отладки Twitch - Режим отладки Twitch включен (не рекомендуется) - Режим отладки Twitch отключен - - - Настройки ReVanced - Информация - О ReVanced - Блокировка рекламы - Настройки блокировки рекламы - Чат - Настройки чата - Прочие - Прочие настройки - Общие настройки - Другие настройки - Реклама на стороне клиента - Реклама на стороне сервера - Включить журналы отладки - Журналы отладки включены - Журналы отладки отключены - - + Побочные эффекты подмены + • Клиент экспериментальный и может перестать работать в любое время + • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах + • Пункт \"Звуковая дорожка\" отсутствует + • Отсутствует видеокодек AV1 + • Постоянный уровень громкости недоступен + • Видео для детей могут не воспроизводиться при выходе из системы или в режиме инкогнито + + • Принудительная оригинальная звуковая дорожка недоступна + Показать в \"Статистике для сисадминов\" + Тип клиента в \"Статистике для сисадминов\" показан + Тип клиента в \"Статистике для сисадминов\" скрыт + + + + + YT Music ReVanced + ReVanced Музыка + Музыка + + + Информация + Настройки рекламы + Общие настройки + Настройки плеера + Прочие настройки + + + Скрыть видеорекламу + Видеореклама в плеере скрыта + Видеореклама в плеере показана + + + Включить постоянный повтор + Постоянный повтор включен + Постоянный повтор отключен + + + Скрыть кнопку \"Трансляция\" + Кнопка \"Трансляция\" в плеере скрыта + Кнопка \"Трансляция\" в плеере показана + Скрыть кнопку истории + Кнопка истории скрыта + Кнопка истории показана + Скрыть кнопку уведомлений + Кнопка уведомлений скрыта + Кнопка уведомлений показана + Скрыть кнопку поиска + Кнопка поиска скрыта + Кнопка поиска показана + + + Скрыть панель категорий + Панель категорий скрыта + Панель категорий показана + + + Изменить цвет мини-плеера + Цвет мини-плеера соответствует полноэкранному плееру + Мини-плеер использует цвет по умолчанию + + + Панель навигации + Скрыть или изменить кнопки панели навигации + + Скрыть кнопку \"Главная\" + Кнопка \"Главная\" в панели навигации скрыта + Кнопка \"Главная\" в панели навигации показана + + Скрыть Сэмплы + Кнопка \"Семплы\" скрыта + Кнопка \"Семплы\" показана + + Скрыть кнопку \"Навигация\" + Кнопка \"Обзор\" скрыта + Кнопка \"Обзор\" показана + + Скрыть Библиотеку + Кнопка \"Библиотека\" скрыта + Кнопка \"Библиотека\" показана + + Скрыть кнопку \"Подписки\" + Кнопка \"Премиум\" скрыта + Кнопка \"Премиум\" показана + Скрыть панель навигации + Панель навигации скрыта + Панель навигации показана + Скрыть подписи кнопок навигации + Подписи кнопок навигации скрыты + Подписи кнопок навигации показаны + + + Скрыть ярлык \"Купить Music Premium\" + Ярлык \"Купить Music Premium\" скрыт + Ярлык \"Купить Music Premium\" показан + + + Скрыть кнопку \"Подписка\" + Кнопка \"Подписка\" скрыта + Кнопка \"Подписка\" показана + + + + + Заблокировать аудиорекламу + Аудиореклама заблокирована + Аудиореклама разблокирована + + + %s недоступен, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. + %s вернул ошибку, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. + Заблокировать встроенную видеорекламу + Отключено + Luminous прокси + PurpleAdBlock прокси + + + Заблокировать видеорекламу + Видеореклама заблокирована + Видеореклама разблокирована + + + Сообщение удалено + Показать удаленные сообщения + Не показывать удаленные сообщения + Скрыть удаленные сообщения за спойлером + Показать удаленные сообщения как перекрестный текст + + + Собирать Баллы канала автоматически + Баллы канала собираются автоматически + Баллы канала не собираются автоматически + + + + Включить режим отладки Twitch + Режим отладки Twitch включен (не рекомендуется) + Режим отладки Twitch отключен + + + Настройки ReVanced + Информация + О ReVanced + Блокировка рекламы + Настройки блокировки рекламы + Чат + Настройки чата + Прочие + Прочие настройки + Общие настройки + Другие настройки + Реклама на стороне клиента + Реклама на стороне сервера + Включить журналы отладки + Журналы отладки включены + Журналы отладки отключены + + diff --git a/patches/src/main/resources/addresources/values-si-rLK/strings.xml b/patches/src/main/resources/addresources/values-si-rLK/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-si-rLK/strings.xml +++ b/patches/src/main/resources/addresources/values-si-rLK/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index 3b39f04985..446aaccee1 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -17,1256 +17,1255 @@ "First 'item' text Second \"item\" text" ---> - - - - Názov aplikácie - - Vlastné - Ikona aplikácie - Pôvodné - - ReVanced minimálne - ReVanced škálované - - Vlastné - - - Kontrola zlyhala - Otvoriť oficiálnu webovú stránku - Ignorovať - <h5>Táto aplikácia sa javí, že nie je upravená.</h5><br>Táto aplikácia nemusí fungovať správne, <b>môže byť škodlivá alebo dokonca nebezpečná na použitie</b>.<br><br>Tieto kontroly znamenajú, že táto aplikácia je predpripravená alebo získaná od niekoho iného:<br><br><small>%1$s</small><br>Odporúčame <b>odstrániť túto aplikáciu a upraviť ju sami</b>, aby ste sa uistili, že používate overenú a bezpečnú aplikáciu.<p><br>Ak sa bude ignorovať, toto upozornenie sa zobrazí už len dvakrát. - Upravené na inom zariadení - Nie je nainštalovaný pomocou ReVanced Manager - Upravené pred viac ako 10 minútami - Upravené pred %s dňami - Dátum zostavenia APK je poškodený - - - Upozornenie ReVanced - Vaša história pozeraného sa neuchováva.<br><br>Toto je pravdepodobne spôsobené blokovaním reklám pomocou DNS alebo sieťového proxy.<br><br>Pre vyriešenie tohto problému povoľte <b>s.youtube.com</b> alebo vypnite všetky blokátory reklám pomocou DNS a proxy. - Neukazuj znovu - - - Nastavenia - Naozaj chcete pokračovať? - Uložiť - Resetovať - Obnovi farbu - Neplatn farba - Vyžaduje sa reštart - Aby sa zmena prejavila, reštartujte aplikáciu. - Reštart - Importovať - Kopírovať - Nastavenia ReVanced sa obnovia na predvolené - Počet importovaných nastavení: %d - Import zlyhal: %s - Hľadať nastavenia - Pre výraz \",%s\" sa nenašli žiadne výsledky - Skúste iné kľúčové slovo - Posledné vyhľadávania - Odstrániť z histórie vyhľadávania? - Vymazať históriu vyhľadávania - Naozaj chcete vymazať celú históriu vyhľadávania? - Tipy na vyhľadávanie - "• Ťuknite na cestu pre prechod na ňu +--> + + + Názov aplikácie + + Vlastné + Ikona aplikácie + Pôvodné + + ReVanced minimálne + ReVanced škálované + + Vlastné + + + Kontrola zlyhala + Otvoriť oficiálnu webovú stránku + Ignorovať + <h5>Táto aplikácia sa javí, že nie je upravená.</h5><br>Táto aplikácia nemusí fungovať správne, <b>môže byť škodlivá alebo dokonca nebezpečná na použitie</b>.<br><br>Tieto kontroly znamenajú, že táto aplikácia je predpripravená alebo získaná od niekoho iného:<br><br><small>%1$s</small><br>Odporúčame <b>odstrániť túto aplikáciu a upraviť ju sami</b>, aby ste sa uistili, že používate overenú a bezpečnú aplikáciu.<p><br>Ak sa bude ignorovať, toto upozornenie sa zobrazí už len dvakrát. + Upravené na inom zariadení + Nie je nainštalovaný pomocou ReVanced Manager + Upravené pred viac ako 10 minútami + Upravené pred %s dňami + Dátum zostavenia APK je poškodený + + + Upozornenie ReVanced + Vaša história pozeraného sa neuchováva.<br><br>Toto je pravdepodobne spôsobené blokovaním reklám pomocou DNS alebo sieťového proxy.<br><br>Pre vyriešenie tohto problému povoľte <b>s.youtube.com</b> alebo vypnite všetky blokátory reklám pomocou DNS a proxy. + Neukazuj znovu + + + Nastavenia + Naozaj chcete pokračovať? + Uložiť + Resetovať + Obnovi farbu + Neplatn farba + Vyžaduje sa reštart + Aby sa zmena prejavila, reštartujte aplikáciu. + Reštart + Importovať + Kopírovať + Nastavenia ReVanced sa obnovia na predvolené + Počet importovaných nastavení: %d + Import zlyhal: %s + Hľadať nastavenia + Pre výraz \",%s\" sa nenašli žiadne výsledky + Skúste iné kľúčové slovo + Posledné vyhľadávania + Odstrániť z histórie vyhľadávania? + Vymazať históriu vyhľadávania + Naozaj chcete vymazať celú históriu vyhľadávania? + Tipy na vyhľadávanie + "• Ťuknite na cestu pre prechod na ňu • Dlho stlačte nastavenie pre prechod naň • Stlačte Enter pre uloženie vyhľadávacieho dotazu do histórie • Vyhľadávanie ignoruje veľkosť písmen a interpunkciu • Nadradené nastavenia sa zobrazujú nad zakázanými podradenými nastaveniami" - História vyhľadávania je prázdna - Pre uloženie histórie vyhľadávania zadajte vyhľadávací dotaz a stlačte Enter - Zobraziť históriu vyhľadávania v nastaveniach - História vyhľadávania v nastaveniach je zobrazená - História vyhľadávania nastavení sa nezobrazuje - Zobraziť ikony nastavení ReVanced - Ikony nastavení sa zobrazujú - Ikony nastavení sa nezobrazujú - Jazyk reVanced - "Preklady pre niektoré jazyky môžu chýbať alebo byť neúplné. + História vyhľadávania je prázdna + Pre uloženie histórie vyhľadávania zadajte vyhľadávací dotaz a stlačte Enter + Zobraziť históriu vyhľadávania v nastaveniach + História vyhľadávania v nastaveniach je zobrazená + História vyhľadávania nastavení sa nezobrazuje + Zobraziť ikony nastavení ReVanced + Ikony nastavení sa zobrazujú + Ikony nastavení sa nezobrazujú + Jazyk reVanced + "Preklady pre niektoré jazyky môžu chýbať alebo byť neúplné. Pre preloženie nových jazykov alebo zlepšenie existujúcich prekladov navštívte translate.revanced.app" - Jazyk aplikácie - Importovať / Exportovať - Import / Export nastavení ReVanced - - Používate ReVanced Patches verziu <i>%s</i> - Poznámka - Táto verzia je predbežná a môžu sa vyskytnúť neočakávané problémy - Oficiálne odkazy - + Používate ReVanced Patches verziu <i>%s</i> + Poznámka + Táto verzia je predbežná a môžu sa vyskytnúť neočakávané problémy + Oficiálne odkazy + - - - Nastavenia GmsCore - Nastavenia pre GmsCore - - MicroG GmsCore nie je nainštalovaný. Nainštalujte ho. - Potrebná akcia - "Aplikácia MicroG GmsCore nemá povolenie na spúšťanie na pozadí. + + + Nastavenia GmsCore + Nastavenia pre GmsCore + + MicroG GmsCore nie je nainštalovaný. Nainštalujte ho. + Potrebná akcia + "Aplikácia MicroG GmsCore nemá povolenie na spúšťanie na pozadí. Postupujte podľa pokynov \"Nechaj moju aplikáciu spustenú\" pre váš telefón a použite ich v aplikácii MicroG GmsCore." - Otvorte webovú stránku - "Pre optimalizáciu MicroG GmsCore je potrebné vypnúť optimalizáciu batérie, aby sa predišlo problémom. + Otvorte webovú stránku + "Pre optimalizáciu MicroG GmsCore je potrebné vypnúť optimalizáciu batérie, aby sa predišlo problémom. Vypnutie optimalizácie batérie pre MicroG nebude mať negatívny vplyv na spotrebu batérie. Ťuknite na tlačidlo Pokračovať a povoľte zmeny optimalizácie." - Ďalej - - - Falošné videostreamy - Falošné klientské videostreamy, aby sa predišlo problémom s prehrávaním - Falošné video strémy - "Video streamy sú sfalšované + Ďalej + + + Falošné videostreamy + Falošné klientské videostreamy, aby sa predišlo problémom s prehrávaním + Falošné video strémy + "Video streamy sú sfalšované Ak ste používateľom YouTube Premium, toto nastavenie nemusí byť potrebné" - "Videostreamy nie sú falošné + "Videostreamy nie sú falošné Prehrávanie nemusí fungovať" - Vypnutie tohto nastavenia môže spôsobiť problémy s prehrávaním. - Predvolený klient - - - Vynútiť pôvodný jazyk zvuku - Používa sa pôvodný jazyk zvuku - Používanie predvoleného zvuku - - Ak chcete použiť túto funkciu, zmeňte \"Podvrhnúť video streamy\" na ľubovoľného klienta okrem Android Studio - - - Ladenie - Povoliť alebo zakázať možnosti ladenia - Debug logovanie - Denníky ladenia sú povolené - Denníky ladenia sú zakázané - Zaznamenať stopy zásobníka - Denníky ladenia obsahujú sledovanie zásobníka - Denníky ladenia neobsahujú sledovanie zásobníka - Zobraziť toast pri chybe ReVanced - Ak sa vyskytne chyba, zobrazí sa upozornenie toast - Ak sa vyskytne chyba, nezobrazí sa upozornenie toast - "Vypnutie upozornení o chybách skryje všetky upozornenia o chybách v ReVanced. + Vypnutie tohto nastavenia môže spôsobiť problémy s prehrávaním. + Predvolený klient + + + Vynútiť pôvodný jazyk zvuku + Používa sa pôvodný jazyk zvuku + Používanie predvoleného zvuku + + Ak chcete použiť túto funkciu, zmeňte \"Podvrhnúť video streamy\" na ľubovoľného klienta okrem Android Studio + + + Ladenie + Povoliť alebo zakázať možnosti ladenia + Debug logovanie + Denníky ladenia sú povolené + Denníky ladenia sú zakázané + Zaznamenať stopy zásobníka + Denníky ladenia obsahujú sledovanie zásobníka + Denníky ladenia neobsahujú sledovanie zásobníka + Zobraziť toast pri chybe ReVanced + Ak sa vyskytne chyba, zobrazí sa upozornenie toast + Ak sa vyskytne chyba, nezobrazí sa upozornenie toast + "Vypnutie upozornení o chybách skryje všetky upozornenia o chybách v ReVanced. Nebudete informovaní o žiadnych nepredvídaných udalostiach." - Exportovať protokoly ladenia - Skopíruje protokoly ladenia ReVanced do schránky - Protokolovanie ladenia je vypnuté - Nenašli sa žiadne protokoly - Protokoly skopírované - Nepodarilo sa exportovať protokoly: %s - Vymazať protokoly ladenia - Vymaže všetky uložené protokoly ladenia ReVanced - Protokoly vymazané - Manager príznakov funkcií - Spravovať booleovské príznaky funkcií - Aktívne príznaky (%d) - Blokované príznaky (%d) - Hľadať príznaky... - Príznaky uložené - Príznaky resetované - Príznaky skopírované do schránky - Vyrovnávacia pamäť protokolu - Protokoly ladenia obsahujú proto buffer - Protokoly ladenia neobsahujú proto buffer - "Povolením tohto nastavenia sa budú zaznamenávať ďalšie údaje o rozložení, vrátane textu na obrazovke pre niektoré komponenty používateľského rozhrania. + Exportovať protokoly ladenia + Skopíruje protokoly ladenia ReVanced do schránky + Protokolovanie ladenia je vypnuté + Nenašli sa žiadne protokoly + Protokoly skopírované + Nepodarilo sa exportovať protokoly: %s + Vymazať protokoly ladenia + Vymaže všetky uložené protokoly ladenia ReVanced + Protokoly vymazané + Manager príznakov funkcií + Spravovať booleovské príznaky funkcií + Aktívne príznaky (%d) + Blokované príznaky (%d) + Hľadať príznaky... + Príznaky uložené + Príznaky resetované + Príznaky skopírované do schránky + Vyrovnávacia pamäť protokolu + Protokoly ladenia obsahujú proto buffer + Protokoly ladenia neobsahujú proto buffer + "Povolením tohto nastavenia sa budú zaznamenávať ďalšie údaje o rozložení, vrátane textu na obrazovke pre niektoré komponenty používateľského rozhrania. Toto môže pomôcť identifikovať komponenty pri vytváraní vlastných filtrov. Povolením tejto funkcie sa však budú zaznamenávať aj niektoré používateľské údaje, ako napríklad vaša IP adresa." - - - Vyčistiť odkazy na zdieľanie - Parameter sledovania dotazu bol odstránený zo zdieľaných odkazov - Parameter sledovania dotazu nebol odstránený zo zdieľaných odkazov - Zmeniť odkazy na zdieľanie na youtube.com - Zdieľané odkazy používajú youtube.com - Zdieľané odkazy používajú music.youtube.com - - - Vlastný filter - Skryť komponenty pomocou vlastných filtrov - Povoliť vlastný filter - Vlastný filter je povolený - Vlastný filter je zakázaný - Vlastný filter - - Zoznam reťazcov tvorcu cesty komponentu na filtrovanie oddelených novým riadkom - Neplatný vlastný filter: %s - - - - - Informácie - Reklamy - Alternatívne miniatúry - Kanál - Všeobecné - Prehrávač - Panel vyhľadávania - Ovládanie potiahnutím - Rôzne - Obnoviť staré ponuky nastavení - Staré ponuky nastavení sa zobrazujú - Staré ponuky nastavení sa nezobrazujú - - - Zakázať prehrávanie Shorts na pozadí - Prehrávanie Shorts na pozadí je zakázané - Prehrávanie Shorts na pozadí je povolené - - - Skryť karty albumov - Karty albumov sú skryté - Zobrazia sa karty albumov - Skryť karty umelcov - Karty umelcov sú skryté - Zobrazia sa karty umelcov - Skryť poličku na žetóny - Polica na žetóny je skrytá - Je zobrazená polica na hranolky - Skryť príspevky komunity - Príspevky komunity sú skryté - Zobrazujú sa príspevky komunity - Skryť kompaktné bannery - Kompaktné bannery sú skryté - Zobrazujú sa kompaktné bannery - Skryť rozbaľovaciu kartu - Rozbaľovacia karta pod videami je skrytá - Rozbaľovacia karta pod videami je zobrazená - Skryť plávajúce tlačidlo mikrofónu - Plávajúce tlačidlo mikrofónu vo vyhľadávaní je skryté - Plávajúce tlačidlo mikrofónu vo vyhľadávaní je zobrazené - Skryť horizontálne police - "Horizontálne poličky sú skryté, napríklad: + + + Vyčistiť odkazy na zdieľanie + Parameter sledovania dotazu bol odstránený zo zdieľaných odkazov + Parameter sledovania dotazu nebol odstránený zo zdieľaných odkazov + Zmeniť odkazy na zdieľanie na youtube.com + Zdieľané odkazy používajú youtube.com + Zdieľané odkazy používajú music.youtube.com + + + Vlastný filter + Skryť komponenty pomocou vlastných filtrov + Povoliť vlastný filter + Vlastný filter je povolený + Vlastný filter je zakázaný + Vlastný filter + + Zoznam reťazcov tvorcu cesty komponentu na filtrovanie oddelených novým riadkom + Neplatný vlastný filter: %s + + + + + Informácie + Reklamy + Alternatívne miniatúry + Kanál + Všeobecné + Prehrávač + Panel vyhľadávania + Ovládanie potiahnutím + Rôzne + Obnoviť staré ponuky nastavení + Staré ponuky nastavení sa zobrazujú + Staré ponuky nastavení sa nezobrazujú + + + Zakázať prehrávanie Shorts na pozadí + Prehrávanie Shorts na pozadí je zakázané + Prehrávanie Shorts na pozadí je povolené + + + Skryť karty albumov + Karty albumov sú skryté + Zobrazia sa karty albumov + Skryť karty umelcov + Karty umelcov sú skryté + Zobrazia sa karty umelcov + Skryť poličku na žetóny + Polica na žetóny je skrytá + Je zobrazená polica na hranolky + Skryť príspevky komunity + Príspevky komunity sú skryté + Zobrazujú sa príspevky komunity + Skryť kompaktné bannery + Kompaktné bannery sú skryté + Zobrazujú sa kompaktné bannery + Skryť rozbaľovaciu kartu + Rozbaľovacia karta pod videami je skrytá + Rozbaľovacia karta pod videami je zobrazená + Skryť plávajúce tlačidlo mikrofónu + Plávajúce tlačidlo mikrofónu vo vyhľadávaní je skryté + Plávajúce tlačidlo mikrofónu vo vyhľadávaní je zobrazené + Skryť horizontálne police + "Horizontálne poličky sú skryté, napríklad: • Aktuálne správy • Pokračovať v sledovaní • Preskúmať ďalšie kanály • Najrelevantnejšie • Nakupovanie • Pozrieť znova" - Horizontálne poličky sú zobrazené - Skryť poličku s obrázkami - Polička s obrázkami vo výsledkoch vyhľadávania je skrytá - Polička s obrázkami vo výsledkoch vyhľadávania je zobrazená - Skryť najnovšie príspevky - Najnovšie príspevky sú skryté - Zobrazia sa najnovšie príspevky - Skryť zoznamy skladieb mixu - Zoznamy skladieb mixu sú skryté - Zobrazia sa zmiešané zoznamy skladieb - Skryť sekciu filmov - Sekcia Filmy je skrytá - Zobrazí sa sekcia Filmy - - Skryť tlačidlo \"Upozorniť ma\" - Tlačidlo „Upozorniť ma“ je skryté - Tlačidlo „Upozorniť ma“ je zobrazené - Skryť hrateľné položky - Hrateľné položky sú skryté - Zobrazia sa hrateľné súbory - - Skryť tlačidlo \"Zobraziť viac\" - Tlačidlo „Zobraziť viac“ vo výsledkoch vyhľadávania je skryté - Tlačidlo „Zobraziť viac“ vo výsledkoch vyhľadávania je zobrazené - Skryť prieskumy - Prieskumy sú skryté - Prieskumy sú zobrazené - Skryť panel lístkov - Panel lístkov je skrytý - Je zobrazený panel lístkov - - Skryť štítky odporúčaní videí - Štítky „Ľudia tiež pozerali“ a „Mohlo by sa vám páčiť“ vo výsledkoch vyhľadávania sú skryté - Štítky „Ľudia tiež pozerali“ a „Mohlo by sa vám páčiť“ vo výsledkoch vyhľadávania sú zobrazené - Skryť vizuálny oddeľovač - Vizuálny oddeľovač je skrytý - Vizuálny oddeľovač je zobrazený - - Skryť YouTube Doodles - Animácia YouTube Doodles na logu je skrytá - Animácia YouTube Doodles na logu je zobrazená - "Doodles sa zobrazujú niekoľko dní v roku. + Skryť tlačidlo \"Zobraziť viac\" + Tlačidlo „Zobraziť viac“ vo výsledkoch vyhľadávania je skryté + Tlačidlo „Zobraziť viac“ vo výsledkoch vyhľadávania je zobrazené + Skryť prieskumy + Prieskumy sú skryté + Prieskumy sú zobrazené + Skryť panel lístkov + Panel lístkov je skrytý + Je zobrazený panel lístkov + + Skryť štítky odporúčaní videí + Štítky „Ľudia tiež pozerali“ a „Mohlo by sa vám páčiť“ vo výsledkoch vyhľadávania sú skryté + Štítky „Ľudia tiež pozerali“ a „Mohlo by sa vám páčiť“ vo výsledkoch vyhľadávania sú zobrazené + Skryť vizuálny oddeľovač + Vizuálny oddeľovač je skrytý + Vizuálny oddeľovač je zobrazený + + Skryť YouTube Doodles + Animácia YouTube Doodles na logu je skrytá + Animácia YouTube Doodles na logu je zobrazená + "Doodles sa zobrazujú niekoľko dní v roku. Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skrytia je zapnuté, tak sa tiež skryje filter pod vyhľadávacím panelom." - Skryť panel kanálov - Panel kanálov je skrytý - Zobrazí sa panel kanálov - Skryť vodoznak kanála - Vodoznak je skrytý - Zobrazí sa vodoznak - Skryť crowdfunding box - Crowdfundingový box je skrytý - Je zobrazené pole crowdfundingu - Skryť núdzové boxy - Núdzové schránky sú skryté - Sú zobrazené núdzové schránky - Skryť informačné panely - Informačné panely sú skryté - Zobrazia sa informačné panely - - Skryť tlačidlo Pripojiť sa - Tlačidlo „Pripojiť sa“ je skryté - Tlačidlo „Pripojiť sa“ je zobrazené - Skryť lekárske panely - Lekárske panely sú skryté - Zobrazujú sa lekárske panely - Skryť rýchle akcie - Rýchle akcie na celej obrazovke sú skryté - Rýchle akcie na celej obrazovke sú zobrazené - Skryť súvisiace videá - Súvisiace videá v rýchlych akciách sú skryté - Súvisiace videá v rýchlych akciách sú zobrazené - Skryť pokyny pre odberateľov - Pokyny pre komunitu odberateľov sú skryté - Zobrazujú sa pokyny pre komunitu odberateľov - Skryť načasované reakcie - Časované reakcie sú skryté - Sú zobrazené načasované reakcie - Skryť „Súhrn videa generovaný AI“ - Sekcia so súhrnom videa generovaným AI je skrytá - Sekcia zhrnutia videa generovaného AI je zobrazená - Skryť \"Opýtať sa\" - Sekcia \"Opýtať sa\" je skrytá - Sekcia \"Opýtať sa\" je zobrazená - Skryť atribúty - Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú skryté - Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú zobrazené - Skryť kapitoly - Sekcia kapitol je skrytá - Zobrazuje sa sekcia kapitol - Skryť „Ako bol tento obsah vytvorený“ - Sekcia Ako bol tento obsah vytvorený je skrytá - Sekcia Ako bol tento obsah vytvorený je zobrazená - Skryť body Hype - Body Hype sú skryté - Body Hype sú zobrazené - Skryť „Preskúmať podcast“ - Sekcia Preskúmať podcast je skrytá - Sekcia Preskúmať podcast je zobrazená - Skryť odporúčané odkazy - Sekcia Odporúčané odkazy je skrytá - Sekcia Odporúčané odkazy je zobrazená - Skryť Odporúčané videá - Sekcia Odporúčané videá je skrytá - Sekcia Odporúčané videá je zobrazená - Skryť informačné karty - Sekcia informačných kariet je skrytá - Zobrazí sa sekcia informačných kariet - Skryť „Kľúčové koncepty“ - Sekcia Kľúčové koncepty je skrytá - Sekcia Kľúčové koncepty je zobrazená - Skryť tlačidlo Prihlásiť sa na odber - Tlačidlo Prihlásiť sa na odber je skryté - Tlačidlo Prihlásiť sa na odber je zobrazené - Skryť prepis - Časť prepisu je skrytá - Zobrazí sa sekcia prepisu - Popis videa - Skryť alebo zobraziť komponenty popisu videa - Panel filtra - Skryť alebo zobraziť panel filtrov v kanáloch, súvisiacich videách, výsledkoch vyhľadávania a histórii pozerania - Skryť v kanáloch - Skryté v kanáloch - Zobrazené v kanáloch - Skryť v súvisiacich videách - Skryté v súvisiacich videách - Zobrazuje sa v súvisiacich videách - Skryť vo výsledkoch vyhľadávania - Zobrazené vo výsledkoch vyhľadávania - Zobrazené vo výsledkoch vyhľadávania - Skryť v histórii pozerania - Skryté v histórii pozerania - Zobrazené v histórii pozerania - Stránka kanála - Skryť alebo zobraziť komponenty stránky kanála - - Skryť tlačidlo Komunita - Tlačidlo Komunita je skryté - Tlačidlo Komunita je zobrazené - - Skryť panel „Pre vás“ - Polička Pre vás je skrytá - Polička Pre vás je zobrazená - - Skryť tlačidlo Pripojiť sa - Tlačidlo Pripojiť sa je skryté - Tlačidlo Pripojiť sa je zobrazené - Skryť ukážku odkazov - Ukážka odkazov je skrytá - Ukážka odkazov je zobrazená - Skryť poličku členov - Polička členov je skrytá - Polica členov je zobrazená - - Skryť tlačidlo Obchod - Tlačidlo Obchod je skryté - Tlačidlo Obchod je zobrazené - - Skryť tlačidlo Odoberať - Tlačidlo Odoberať je skryté - Tlačidlo Odoberať je zobrazené - Komentáre - Skryť alebo zobraziť komponenty sekcie komentárov - Skryť súhrn AI chatu - Súhrn AI chatu je skrytý - Súhrn AI chatu je zobrazený - Skryť súhrn komentárov AI - Súhrn komentárov AI je skrytý - Súhrn komentárov AI je zobrazený - Skryť pokyny kanála - Pokyny ku kanálu sú skryté - Pokyny ku kanálu sú zobrazené - Skryť hlavičku \"Komentáre členov\" - Hlavička Komentáre od členov je skrytá - Hlavička Komentáre od členov je zobrazená - Skryť sekciu komentárov - Sekcia komentárov je skrytá - Zobrazí sa sekcia komentárov - Skryť pokyny pre komunitu - Pokyny pre komunitu sú skryté - Pokyny pre komunitu sú zobrazené - Skryť tlačidlo „Vytvoriť krátke video“ - Tlačidlo Vytvoriť Short je skryté - Tlačidlo Vytvoriť Short je zobrazené - Skryť tlačidlá emoji a časovej pečiatky - Tlačidlá emoji a časovej pečiatky sú skryté - Tlačidlá emoji a časovej pečiatky sú zobrazené - Skryť ukážkový komentár - Komentár ukážky je skrytý - Zobrazí sa ukážka komentára - Skryť tlačidlo Ďakujem - Tlačidlo poďakovania je skryté - Zobrazí sa tlačidlo Ďakujem - Skryť počet zhliadnutí - Počet zhliadnutí je skrytý vo feede a výsledkoch vyhľadávania - Počet zhliadnutí je zobrazený vo feede a výsledkoch vyhľadávania - - "Obmedzenia: + Skryť tlačidlo Pripojiť sa + Tlačidlo „Pripojiť sa“ je skryté + Tlačidlo „Pripojiť sa“ je zobrazené + Skryť lekárske panely + Lekárske panely sú skryté + Zobrazujú sa lekárske panely + Skryť rýchle akcie + Rýchle akcie na celej obrazovke sú skryté + Rýchle akcie na celej obrazovke sú zobrazené + Skryť súvisiace videá + Súvisiace videá v rýchlych akciách sú skryté + Súvisiace videá v rýchlych akciách sú zobrazené + Skryť pokyny pre odberateľov + Pokyny pre komunitu odberateľov sú skryté + Zobrazujú sa pokyny pre komunitu odberateľov + Skryť načasované reakcie + Časované reakcie sú skryté + Sú zobrazené načasované reakcie + Skryť „Súhrn videa generovaný AI“ + Sekcia so súhrnom videa generovaným AI je skrytá + Sekcia zhrnutia videa generovaného AI je zobrazená + Skryť \"Opýtať sa\" + Sekcia \"Opýtať sa\" je skrytá + Sekcia \"Opýtať sa\" je zobrazená + Skryť atribúty + Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú skryté + Sekcie Odporúčané miesta, Hry, Hudba a Spomenutí ľudia sú zobrazené + Skryť kapitoly + Sekcia kapitol je skrytá + Zobrazuje sa sekcia kapitol + Skryť „Ako bol tento obsah vytvorený“ + Sekcia Ako bol tento obsah vytvorený je skrytá + Sekcia Ako bol tento obsah vytvorený je zobrazená + Skryť body Hype + Body Hype sú skryté + Body Hype sú zobrazené + Skryť „Preskúmať podcast“ + Sekcia Preskúmať podcast je skrytá + Sekcia Preskúmať podcast je zobrazená + Skryť odporúčané odkazy + Sekcia Odporúčané odkazy je skrytá + Sekcia Odporúčané odkazy je zobrazená + Skryť Odporúčané videá + Sekcia Odporúčané videá je skrytá + Sekcia Odporúčané videá je zobrazená + Skryť informačné karty + Sekcia informačných kariet je skrytá + Zobrazí sa sekcia informačných kariet + Skryť „Kľúčové koncepty“ + Sekcia Kľúčové koncepty je skrytá + Sekcia Kľúčové koncepty je zobrazená + Skryť tlačidlo Prihlásiť sa na odber + Tlačidlo Prihlásiť sa na odber je skryté + Tlačidlo Prihlásiť sa na odber je zobrazené + Skryť prepis + Časť prepisu je skrytá + Zobrazí sa sekcia prepisu + Popis videa + Skryť alebo zobraziť komponenty popisu videa + Panel filtra + Skryť alebo zobraziť panel filtrov v kanáloch, súvisiacich videách, výsledkoch vyhľadávania a histórii pozerania + Skryť v kanáloch + Skryté v kanáloch + Zobrazené v kanáloch + Skryť v súvisiacich videách + Skryté v súvisiacich videách + Zobrazuje sa v súvisiacich videách + Skryť vo výsledkoch vyhľadávania + Zobrazené vo výsledkoch vyhľadávania + Zobrazené vo výsledkoch vyhľadávania + Skryť v histórii pozerania + Skryté v histórii pozerania + Zobrazené v histórii pozerania + Stránka kanála + Skryť alebo zobraziť komponenty stránky kanála + + Skryť tlačidlo Komunita + Tlačidlo Komunita je skryté + Tlačidlo Komunita je zobrazené + + Skryť panel „Pre vás“ + Polička Pre vás je skrytá + Polička Pre vás je zobrazená + + Skryť tlačidlo Pripojiť sa + Tlačidlo Pripojiť sa je skryté + Tlačidlo Pripojiť sa je zobrazené + Skryť ukážku odkazov + Ukážka odkazov je skrytá + Ukážka odkazov je zobrazená + Skryť poličku členov + Polička členov je skrytá + Polica členov je zobrazená + + Skryť tlačidlo Obchod + Tlačidlo Obchod je skryté + Tlačidlo Obchod je zobrazené + + Skryť tlačidlo Odoberať + Tlačidlo Odoberať je skryté + Tlačidlo Odoberať je zobrazené + Komentáre + Skryť alebo zobraziť komponenty sekcie komentárov + Skryť súhrn AI chatu + Súhrn AI chatu je skrytý + Súhrn AI chatu je zobrazený + Skryť súhrn komentárov AI + Súhrn komentárov AI je skrytý + Súhrn komentárov AI je zobrazený + Skryť pokyny kanála + Pokyny ku kanálu sú skryté + Pokyny ku kanálu sú zobrazené + Skryť hlavičku \"Komentáre členov\" + Hlavička Komentáre od členov je skrytá + Hlavička Komentáre od členov je zobrazená + Skryť sekciu komentárov + Sekcia komentárov je skrytá + Zobrazí sa sekcia komentárov + Skryť pokyny pre komunitu + Pokyny pre komunitu sú skryté + Pokyny pre komunitu sú zobrazené + Skryť tlačidlo „Vytvoriť krátke video“ + Tlačidlo Vytvoriť Short je skryté + Tlačidlo Vytvoriť Short je zobrazené + Skryť tlačidlá emoji a časovej pečiatky + Tlačidlá emoji a časovej pečiatky sú skryté + Tlačidlá emoji a časovej pečiatky sú zobrazené + Skryť ukážkový komentár + Komentár ukážky je skrytý + Zobrazí sa ukážka komentára + Skryť tlačidlo Ďakujem + Tlačidlo poďakovania je skryté + Zobrazí sa tlačidlo Ďakujem + Skryť počet zhliadnutí + Počet zhliadnutí je skrytý vo feede a výsledkoch vyhľadávania + Počet zhliadnutí je zobrazený vo feede a výsledkoch vyhľadávania + + "Obmedzenia: • Police Shorts, stránky kanálov a výsledky vyhľadávania môžu naďalej zobrazovať počty zhliadnutí • Táto funkcia nefunguje s automobilovým form factorom" - Skryť čas nahrávania - Čas nahrávania je skrytý v informačnom kanáli a výsledkoch vyhľadávania - Čas nahrávania je zobrazený v informačnom kanáli a výsledkoch vyhľadávania - - "Obmedzenia: + Skryť čas nahrávania + Čas nahrávania je skrytý v informačnom kanáli a výsledkoch vyhľadávania + Čas nahrávania je zobrazený v informačnom kanáli a výsledkoch vyhľadávania + + "Obmedzenia: • Police Shorts, stránky kanálov a výsledky vyhľadávania môžu stále zobrazovať časy nahrávania • Táto funkcia nefunguje s automobilovým formátom" - Skryť obsah kľúčových slov - Pomocou filtrov kľúčových slov skryte vyhľadávacie a informačné videá - Skryť domáce videá podľa kľúčových slov - Videá na karte Domov sú filtrované podľa kľúčových slov - Videá na karte Domov nie sú filtrované podľa kľúčových slov - Skryť výsledky vyhľadávania podľa kľúčových slov - Výsledky vyhľadávania sú filtrované podľa kľúčových slov - Výsledky vyhľadávania nie sú filtrované podľa kľúčových slov - Skryť predplatné videá podľa kľúčových slov - Videá na karte odbery sú filtrované podľa kľúčových slov - Videá na karte odbery nie sú filtrované podľa kľúčových slov - Kľúčové slová na skrytie - - "Kľúčové slová a frázy, ktoré sa majú skryť, oddelené novými riadkami + "Kľúčové slová a frázy, ktoré sa majú skryť, oddelené novými riadkami Kľúčové slová môžu byť názvy kanálov alebo akýkoľvek text zobrazený v názvoch videí Slová s veľkými písmenami v strede musia byť zadané s použitím veľkých a malých písmen (napr.: iPhone, TikTok, LeBlanc)" - O filtrovaní kľúčových slov - "Domov/Predplatné/Výsledky vyhľadávania sú filtrované tak, aby sa skryl obsah, ktorý zodpovedá kľúčovým slovám + O filtrovaní kľúčových slov + "Domov/Predplatné/Výsledky vyhľadávania sú filtrované tak, aby sa skryl obsah, ktorý zodpovedá kľúčovým slovám Obmedzenia • Shorts sa nedajú skryť podľa názvu kanála • Niektoré komponenty používateľského rozhrania sa nemusia skryť • Vyhľadávanie kľúčového slova nemusí priniesť žiadne výsledky" - Zhodovať celé slová - - Obkľúčenie kľúčového slova/frázy dvojitými úvodzovkami zabráni čiastočným zhodám názvov videí a mien kanálov<br><br>Napríklad,<br><b>\"ai\"</b> skryje video: <b>Ako funguje AI?</b><br>ale neskryje: <b>What does fair use mean?</b> - - Nemožno použiť kľúčové slovo: %s - Na použitie kľúčového slova pridajte úvodzovky: %s - Kľúčové slovo má konfliktné deklarácie: %s - Kľúčové slovo je príliš krátke a vyžaduje úvodzovky: %s - Kľúčové slovo skryje všetky videá: %s - - - Skryť poličku obchodu pre tvorcov - Polička obchodu tvorcu pod prehrávačom videí je skrytá - Priehradka obchodu tvorcov pod prehrávačom videa je zobrazená - Skryť banner obchodu na konci obrazovky - Banner obchodu na záverečnej obrazovke je skrytý - Banner obchodu na záverečnej obrazovke je zobrazený - Skryť reklamy na celú obrazovku - "Celoobrazovkové reklamy sú skryté + Zhodovať celé slová + + Obkľúčenie kľúčového slova/frázy dvojitými úvodzovkami zabráni čiastočným zhodám názvov videí a mien kanálov<br><br>Napríklad,<br><b>\"ai\"</b> skryje video: <b>Ako funguje AI?</b><br>ale neskryje: <b>What does fair use mean?</b> + + Nemožno použiť kľúčové slovo: %s + Na použitie kľúčového slova pridajte úvodzovky: %s + Kľúčové slovo má konfliktné deklarácie: %s + Kľúčové slovo je príliš krátke a vyžaduje úvodzovky: %s + Kľúčové slovo skryje všetky videá: %s + + + Skryť poličku obchodu pre tvorcov + Polička obchodu tvorcu pod prehrávačom videí je skrytá + Priehradka obchodu tvorcov pod prehrávačom videa je zobrazená + Skryť banner obchodu na konci obrazovky + Banner obchodu na záverečnej obrazovke je skrytý + Banner obchodu na záverečnej obrazovke je zobrazený + Skryť reklamy na celú obrazovku + "Celoobrazovkové reklamy sú skryté Táto funkcia je dostupná len pre staršie zariadenia" - Zobrazujú sa reklamy na celú obrazovku - - Skryť reklamy na celú obrazovku funguje iba na starších zariadeniach - Skryť všeobecné reklamy - Všeobecné reklamy sú skryté - Zobrazujú sa všeobecné reklamy - Skryť reklamné bannery - Tovarové bannery sú skryté - Zobrazujú sa reklamné bannery - Skryť štítok platenej propagácie - Štítok platenej propagácie je skrytý - Zobrazuje sa štítok platenej propagácie - Skryť vlastné sponzorované karty - Vlastné sponzorované karty sú skryté - Zobrazujú sa vlastné sponzorované karty - Skryť odkazy na nakupovanie - Nákupné odkazy v popise videa sú skryté - Odkazy na nakupovanie v popise videa sú zobrazené - Skryť banner „Zobraziť produkty“ - Banner „Zobraziť produkty“ v prekrytí videa je skrytý - Banner „Zobraziť produkty“ v prekrytí videa je zobrazený - Skryť výsledky vyhľadávania na webe - Výsledky vyhľadávania na webe sú skryté - Zobrazia sa výsledky vyhľadávania na webe - - - Skryť promá YouTube Premium - Promá YouTube Premium pod prehrávačom videa sú skryté - Promá YouTube Premium sa zobrazujú pod prehrávačom videa - - - Skryť videoreklamy - Videoreklamy sú skryté - Zobrazujú sa videoreklamy - - - Adresa URL bola skopírovaná do schránky - Adresa URL s časovou pečiatkou bola skopírovaná - Zobraziť tlačidlo skopírovať adresu URL videa - Tlačidlo Kopírovať URL videa je zobrazené. Klepnite pre skopírovanie URL videa. Klepnite a podržte pre skopírovanie s časovou značkou - Tlačidlo Kopírovať URL videa nie je zobrazené - Zobraziť tlačidlo webovej adresy kopírovania časovej pečiatky - Tlačidlo Kopírovať URL s časovou značkou je zobrazené. Klepnite pre skopírovanie URL videa s časovou značkou. Klepnite a podržte pre skopírovanie bez časovej značky - Tlačidlo Kopírovať URL s časovou značkou nie je zobrazené - - - Odstrániť dialógové okno uváženia prehliadača - Dialóg bude odstránený - Zobrazí sa dialógové okno - Neobchádza sa tým ani vekové obmedzenie. Len to automaticky akceptuje. - - - Zakázať vyskakovacie okno „Prihlásiť sa do TV“ - Vyskakovacie okno Prihlásiť sa do TV je zakázané - Vyskakovacie okno Prihlásiť sa do TV je povolené - - - Zakázať preskočenie kapitoly dvojitým klepnutím - Dvojité klepnutie nikdy nespustí preskočenie na ďalšiu/predchádzajúcu kapitolu - Dvojité klepnutie môže občas spustiť preskočenie na ďalšiu/predchádzajúcu kapitolu - - - Externé sťahovanie - Nastavenia pre používanie externého sťahovača - Zobraziť externé tlačidlo sťahovania - Tlačidlo Stiahnuť v prehrávači je zobrazené - Tlačidlo Stiahnuť v prehrávači sa nezobrazuje - - Prepísanie tlačidla akcie sťahovania - Tlačidlo Stiahnuť otvorí váš externý downloader - Tlačidlo Stiahnuť otvorí natívny nástroj na sťahovanie v aplikácii - Názov balíka sťahovania - Názov balíka vašej nainštalovanej externej aplikácie na sťahovanie - Zadajte názov balíka - Iné - Aplikácia nie je nainštalovaná - %s nie je nainštalovaný. Nainštalujte si ho. - "Nepodarilo sa nájsť nainštalovanú aplikáciu s názvom balíka: %s + Zobrazujú sa reklamy na celú obrazovku + + Skryť reklamy na celú obrazovku funguje iba na starších zariadeniach + Skryť všeobecné reklamy + Všeobecné reklamy sú skryté + Zobrazujú sa všeobecné reklamy + Skryť reklamné bannery + Tovarové bannery sú skryté + Zobrazujú sa reklamné bannery + Skryť štítok platenej propagácie + Štítok platenej propagácie je skrytý + Zobrazuje sa štítok platenej propagácie + Skryť vlastné sponzorované karty + Vlastné sponzorované karty sú skryté + Zobrazujú sa vlastné sponzorované karty + Skryť odkazy na nakupovanie + Nákupné odkazy v popise videa sú skryté + Odkazy na nakupovanie v popise videa sú zobrazené + Skryť banner „Zobraziť produkty“ + Banner „Zobraziť produkty“ v prekrytí videa je skrytý + Banner „Zobraziť produkty“ v prekrytí videa je zobrazený + Skryť výsledky vyhľadávania na webe + Výsledky vyhľadávania na webe sú skryté + Zobrazia sa výsledky vyhľadávania na webe + + + Skryť promá YouTube Premium + Promá YouTube Premium pod prehrávačom videa sú skryté + Promá YouTube Premium sa zobrazujú pod prehrávačom videa + + + Skryť videoreklamy + Videoreklamy sú skryté + Zobrazujú sa videoreklamy + + + Adresa URL bola skopírovaná do schránky + Adresa URL s časovou pečiatkou bola skopírovaná + Zobraziť tlačidlo skopírovať adresu URL videa + Tlačidlo Kopírovať URL videa je zobrazené. Klepnite pre skopírovanie URL videa. Klepnite a podržte pre skopírovanie s časovou značkou + Tlačidlo Kopírovať URL videa nie je zobrazené + Zobraziť tlačidlo webovej adresy kopírovania časovej pečiatky + Tlačidlo Kopírovať URL s časovou značkou je zobrazené. Klepnite pre skopírovanie URL videa s časovou značkou. Klepnite a podržte pre skopírovanie bez časovej značky + Tlačidlo Kopírovať URL s časovou značkou nie je zobrazené + + + Odstrániť dialógové okno uváženia prehliadača + Dialóg bude odstránený + Zobrazí sa dialógové okno + Neobchádza sa tým ani vekové obmedzenie. Len to automaticky akceptuje. + + + Zakázať vyskakovacie okno „Prihlásiť sa do TV“ + Vyskakovacie okno Prihlásiť sa do TV je zakázané + Vyskakovacie okno Prihlásiť sa do TV je povolené + + + Zakázať preskočenie kapitoly dvojitým klepnutím + Dvojité klepnutie nikdy nespustí preskočenie na ďalšiu/predchádzajúcu kapitolu + Dvojité klepnutie môže občas spustiť preskočenie na ďalšiu/predchádzajúcu kapitolu + + + Externé sťahovanie + Nastavenia pre používanie externého sťahovača + Zobraziť externé tlačidlo sťahovania + Tlačidlo Stiahnuť v prehrávači je zobrazené + Tlačidlo Stiahnuť v prehrávači sa nezobrazuje + + Prepísanie tlačidla akcie sťahovania + Tlačidlo Stiahnuť otvorí váš externý downloader + Tlačidlo Stiahnuť otvorí natívny nástroj na sťahovanie v aplikácii + Názov balíka sťahovania + Názov balíka vašej nainštalovanej externej aplikácie na sťahovanie + Zadajte názov balíka + Iné + Aplikácia nie je nainštalovaná + %s nie je nainštalovaný. Nainštalujte si ho. + "Nepodarilo sa nájsť nainštalovanú aplikáciu s názvom balíka: %s Overte, či je názov balíka správny a aplikácia je nainštalovaná" - Názov balíka nemôže byť prázdny - - - Zakázať gesto presného vyhľadávania - Gesto je zakázané - Gesto je povolené - - - Povoliť ťuknutie pre vyhľadávanie - Klepnutím prejdete do povoleného režimu vyhľadávania - Ťuknutie pre vyhľadávanie je vypnuté - - - Povoliť gesto jasu - "Posúvanie jasu na celú obrazovku je povolené + Názov balíka nemôže byť prázdny + + + Zakázať gesto presného vyhľadávania + Gesto je zakázané + Gesto je povolené + + + Povoliť ťuknutie pre vyhľadávanie + Klepnutím prejdete do povoleného režimu vyhľadávania + Ťuknutie pre vyhľadávanie je vypnuté + + + Povoliť gesto jasu + "Posúvanie jasu na celú obrazovku je povolené Upravte jas potiahnutím prsta zvisle na ľavej strane obrazovky" - Posúvanie jasu na celú obrazovku je zakázané - Povoliť gesto hlasitosti - "Posúvanie hlasitosti na celú obrazovku je povolené + Posúvanie jasu na celú obrazovku je zakázané + Povoliť gesto hlasitosti + "Posúvanie hlasitosti na celú obrazovku je povolené Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" - Posúvanie hlasitosti na celú obrazovku je zakázané - Povoliť stlačenie pre potiahnutie - Stlačenie pre potiahnutie je povolené - Stlačenie pre potiahnutie je vypnuté - Povoliť hmatovú spätnú väzbu - Hmatová spätná väzba je povolená - Hmatová spätná väzba je zakázaná - Uložiť a obnoviť jas - Uložte a obnovte jas pri ukončení alebo prechode na celú obrazovku - Neukladajte a neobnovujte jas pri ukončení alebo prechode na celú obrazovku - Povoliť gesto automatického jasu - Potiahnutím nadol na najnižšiu hodnotu gesta jasu aktivujete automatický jas - Potiahnutie prstom nadol na najnižšiu hodnotu nezapne automatický jas - Automaticky - Časový limit prekrytia potiahnutím prstom vypršal - Počet milisekúnd, počas ktorých je prekrytie viditeľné - Priehľadnosť pozadia prekrytia potiahnutia - Hodnota priehľadnosti medzi 0-100 - Priehľadnosť prekrytia potiahnutia musí byť medzi 0-100 - Farba prekrytia jasu potiahnutím - Farba panela s indikátorom priebehu pre ovládacie prvky jasu - Farba prekrytia hlasitosti potiahnutím - Farba panela s indikátorom priebehu pre ovládacie prvky hlasitosti - Veľkosť textu prekrytia posunutím - Veľkosť textu pre prekrytie posunutím medzi 1 – 30 - Veľkosť textu musí byť medzi 1 – 30 - Prahová hodnota potiahnutia - Hodnota prahu, ktorý sa má vykonať potiahnutím prstom - Citlivosť posúvania hlasitosti - Ako veľmi sa mení hlasitosť na jedno posunutie - Štýl prekrytia potiahnutím - Horizontálne prekrytie - Horizontálne prekrytie (minimálne – hore) - Horizontálne prekrytie (minimálne – v strede) - Kruhové prekrytie - Kruhové prekrytie (minimálne) - Vertikálne prekrytie - Vertikálne prekrytie (minimálne) - Potiahnite prstom a zmeňte videá - Potiahnutie prstom v režime celej obrazovky prepne na predchádzajúce/nasledujúce video - Potiahnutie prstom v režime celej obrazovky neprepne na predchádzajúce/nasledujúce video - - - Zakázať automatické titulky - Automatické titulky sú vypnuté - Automatické titulky sú zapnuté - - - Akčné tlačidlá - Skryť alebo zobraziť tlačidlá pod videami - Vypnutie zvýraznenia tlačidiel Páči sa mi to a Odoberať - Tlačidlá Páči sa mi to a Odoberať sa nebudú zvýrazňovať po ich spomenutí - Tlačidlá Páči sa mi to a Odoberať sa budú zvýrazňovať po ich spomenutí - Skryť Páči sa mi a Nepáči sa mi - Tlačidlá Páči sa mi a Nepáči sa mi sú skryté - Zobrazia sa tlačidlá Páči sa mi a Nepáči sa mi - - Skryť zdieľanie - Tlačidlo Zdieľať je skryté - Zobrazí sa tlačidlo Zdieľať - - Skryť Zastaviť reklamy - Tlačidlo Zastaviť reklamy je skryté - Tlačidlo Zastaviť reklamy je zobrazené - - Skryť komentáre - Tlačidlo komentárov je skryté - Tlačidlo komentárov je zobrazené - + Skryť zdieľanie + Tlačidlo Zdieľať je skryté + Zobrazí sa tlačidlo Zdieľať + + Skryť Zastaviť reklamy + Tlačidlo Zastaviť reklamy je skryté + Tlačidlo Zastaviť reklamy je zobrazené + + Skryť komentáre + Tlačidlo komentárov je skryté + Tlačidlo komentárov je zobrazené + - Skryť prehľad - Tlačidlo nahlásiť je skryté - Zobrazí sa tlačidlo Ohlásiť - - Skryť Remix - Tlačidlo Remix je skryté - Zobrazí sa tlačidlo Remix - - Skryť stiahnutie - Tlačidlo Stiahnuť je skryté - Zobrazí sa tlačidlo Stiahnuť - + Skryť Remix + Tlačidlo Remix je skryté + Zobrazí sa tlačidlo Remix + + Skryť stiahnutie + Tlačidlo Stiahnuť je skryté + Zobrazí sa tlačidlo Stiahnuť + - Skryť Hype - Tlačidlo Hype je skryté - Tlačidlo Hype je zobrazené - - Skryť propagáciu - Tlačidlo Propagovať je skryté - Tlačidlo Propagovať je zobrazené - - Skryť Ďakujem - Tlačidlo poďakovania je skryté - Zobrazí sa tlačidlo Ďakujem - + Skryť propagáciu + Tlačidlo Propagovať je skryté + Tlačidlo Propagovať je zobrazené + + Skryť Ďakujem + Tlačidlo poďakovania je skryté + Zobrazí sa tlačidlo Ďakujem + - Skryť možnosť Opýtať sa - Tlačidlo Opýtať sa je skryté - Zobrazí sa tlačidlo Opýtať sa - - Skryť klip - Tlačidlo klipu je skryté - Zobrazí sa tlačidlo klipu - - Skryť obchod - Tlačidlo Obchod je skryté - Tlačidlo Obchod je zobrazené - - Skryť Uložiť - Tlačidlo Uložiť je skryté - Tlačidlo Uložiť je zobrazené - - - Navigačné tlačidlá - Skryť alebo zmeniť tlačidlá na navigačnom paneli - - Skryť domov - Tlačidlo Domov je skryté - Zobrazí sa tlačidlo Domov - - Skryť Shorts - Tlačidlo Shorts je skryté - Tlačidlo Shorts je zobrazené - - Skryť Vytvoriť - Tlačidlo Vytvoriť je skryté - Zobrazí sa tlačidlo Vytvoriť - - Skryť odbery - Tlačidlo odberov je skryté - Zobrazí sa tlačidlo odberov - Skryť upozornenia - Tlačidlo upozornení je skryté - Tlačidlo upozornení je zobrazené - - Prepnite na položku Vytvoriť s upozorneniami - "Tlačidlo Vytvoriť sa prepne s tlačidlom Upozornenia + Skryť možnosť Opýtať sa + Tlačidlo Opýtať sa je skryté + Zobrazí sa tlačidlo Opýtať sa + + Skryť klip + Tlačidlo klipu je skryté + Zobrazí sa tlačidlo klipu + + Skryť obchod + Tlačidlo Obchod je skryté + Tlačidlo Obchod je zobrazené + + Skryť Uložiť + Tlačidlo Uložiť je skryté + Tlačidlo Uložiť je zobrazené + + + Navigačné tlačidlá + Skryť alebo zmeniť tlačidlá na navigačnom paneli + + Skryť domov + Tlačidlo Domov je skryté + Zobrazí sa tlačidlo Domov + + Skryť Shorts + Tlačidlo Shorts je skryté + Tlačidlo Shorts je zobrazené + + Skryť Vytvoriť + Tlačidlo Vytvoriť je skryté + Zobrazí sa tlačidlo Vytvoriť + + Skryť odbery + Tlačidlo odberov je skryté + Zobrazí sa tlačidlo odberov + Skryť upozornenia + Tlačidlo upozornení je skryté + Tlačidlo upozornení je zobrazené + + Prepnite na položku Vytvoriť s upozorneniami + "Tlačidlo Vytvoriť sa prepne s tlačidlom Upozornenia Poznámka: Povolením tejto možnosti sa tiež vynútene skryjú video reklamy" - Tlačidlo Vytvoriť sa neprepína s tlačidlom Upozornenia - "Deaktiváciou tohto nastavenia sa deaktivuje aj blokovanie reklám pre Shorts. + Tlačidlo Vytvoriť sa neprepína s tlačidlom Upozornenia + "Deaktiváciou tohto nastavenia sa deaktivuje aj blokovanie reklám pre Shorts. Ak zmena tohto nastavenia nemá žiadny účinok, skúste prepnúť do režimu inkognito." - Skryť štítky navigačných tlačidiel - Štítky sú skryté - Zobrazia sa štítky - Deaktivovať priesvitný stavový riadok - Stavový riadok je nepriehľadný - Stavový riadok je nepriehľadný alebo priesvitný - Na niektorých zariadeniach môže povolenie tejto funkcie zmeniť navigačný panel systému na priehľadný. - Deaktivovať priesvitný panel s navigáciou - Panel s navigáciou v svetlom režime je nepriehľadný - Navigačný panel v svetlom režime je nepriehľadný alebo priesvitný - Zakázať tmavý priesvitný panel - Panel s navigáciou v tmavom režime je nepriehľadný - Navigačný panel v tmavom režime je nepriehľadný alebo priesvitný - - - Rozbaľovacie menu - Skryť alebo zobraziť položky rozbaľovacej ponuky prehrávača - - Skryť titulky - Ponuka titulkov je skrytá - Zobrazí sa ponuka titulkov - - Skryť ďalšie nastavenia - Ponuka ďalších nastavení je skrytá - Zobrazí sa ponuka ďalších nastavení - - Skryť časovač spánku - Menu s časovačom spánku je skryté - Menu s časovačom spánku sa zobrazuje - - Skryť video slučky - Ponuka slučkového videa je skrytá - Zobrazí sa ponuka slučkového videa - - Skryť okolitý režim - Ponuka ambientného režimu je skrytá - Zobrazí sa ponuka ambientného režimu - Skryť stály zvuk - Menu so stálym zvukom sa zobrazuje - Menu so stálym zvukom je skryté - - Skryť Pomocník & spätná väzba - Pomocník & ponuka spätnej väzby je skrytá - Pomocník & zobrazí sa ponuka spätnej väzby - - Skryť rýchlosť prehrávania - Ponuka rýchlosti prehrávania je skrytá - Zobrazí sa ponuka rýchlosti prehrávania - - Skryť uzamknutú obrazovku - Ponuka uzamknutej obrazovky je skrytá - Zobrazí sa ponuka uzamknutej obrazovky - - Skryť Počúvať s YouTube Music - Menu Počúvať s YouTube Music je skryté - Menu Počúvať s YouTube Music je zobrazené - - Skryť zvukovú stopu - Ponuka zvukovej stopy je skrytá - Zobrazí sa ponuka zvukovej stopy - + Skryť titulky + Ponuka titulkov je skrytá + Zobrazí sa ponuka titulkov + + Skryť ďalšie nastavenia + Ponuka ďalších nastavení je skrytá + Zobrazí sa ponuka ďalších nastavení + + Skryť časovač spánku + Menu s časovačom spánku je skryté + Menu s časovačom spánku sa zobrazuje + + Skryť video slučky + Ponuka slučkového videa je skrytá + Zobrazí sa ponuka slučkového videa + + Skryť okolitý režim + Ponuka ambientného režimu je skrytá + Zobrazí sa ponuka ambientného režimu + Skryť stály zvuk + Menu so stálym zvukom sa zobrazuje + Menu so stálym zvukom je skryté + + Skryť Pomocník & spätná väzba + Pomocník & ponuka spätnej väzby je skrytá + Pomocník & zobrazí sa ponuka spätnej väzby + + Skryť rýchlosť prehrávania + Ponuka rýchlosti prehrávania je skrytá + Zobrazí sa ponuka rýchlosti prehrávania + + Skryť uzamknutú obrazovku + Ponuka uzamknutej obrazovky je skrytá + Zobrazí sa ponuka uzamknutej obrazovky + + Skryť Počúvať s YouTube Music + Menu Počúvať s YouTube Music je skryté + Menu Počúvať s YouTube Music je zobrazené + + Skryť zvukovú stopu + Ponuka zvukovej stopy je skrytá + Zobrazí sa ponuka zvukovej stopy + - "Menu zvukových stôp je skryté + "Menu zvukových stôp je skryté Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'Android No SDK'" - - Skryť hodinky vo VR - Sledovanie v ponuke VR je skryté - Zobrazí sa ponuka Sledovať vo VR - Skryť ponuku kvality videa - Ponuka kvality videa je skrytá - Ponuka kvality videa je zobrazená - Skryť pätu ponuky kvality videa - Päta ponuky kvality videa je skrytá - Zobrazí sa päta ponuky kvality videa - - - Skryť tlačidlo Automatické prehrávanie - Tlačidlo automatického prehrávania je skryté - Zobrazí sa tlačidlo automatického prehrávania - - Skryť tlačidlo Titulky - Tlačidlo titulkov je skryté - Zobrazí sa tlačidlo titulkov - Skryť tlačidlo Cast - Tlačidlo zdieľania obrazovky je skryté - Tlačidlo zdieľania obrazovky je zobrazené - Skryť pozadie ovládacích prvkov prehrávača - Pozadie ovládacích prvkov prehrávača je skryté - Pozadie ovládacích prvkov prehrávača sa zobrazuje - Skryť tlačidlá Predchádzajúce & Nasledujúce - Tlačidlá sú skryté - Zobrazia sa tlačidlá - - - Skryť karty záverečnej obrazovky - Karty záverečnej obrazovky sú skryté - Zobrazia sa karty záverečnej obrazovky - - - Zakázať režim Ambient na celú obrazovku - Ambientný režim je vypnutý - Ambientný režim je povolený - - - Skryť informačné karty - Informačné karty sú skryté - Informačné karty sú zobrazené - - - Zakázať animácie pohyblivých čísel - Pohyblivé čísla nie sú animované - Pohyblivé čísla sú animované - - - Skryť posuvník prehrávača videa - Vyhľadávací panel prehrávača videa je skrytý - Zobrazí sa vyhľadávací panel prehrávača videa - - Skryť posuvník miniatúr videa - Posuvník miniatúr videa je skrytý - Posuvník miniatúr videa je zobrazený - - - Prehrávač Shorts - Skryť alebo zobraziť komponenty prehrávača Shorts - - Skryť Shorts na karte Domov - Skryté v kanáli Domov a súvisiacich videách - Zobrazené v kanáli Domov a súvisiacich videách - Skryť Shorts videá vo výsledkoch vyhľadávania - Skryté vo výsledkoch vyhľadávania - Zobrazené vo výsledkoch vyhľadávania - - Skryť Shorts v kanáli Odbery - Skryté v kanáli Odbery - Zobrazené v kanáli Odbery - Skryť Shorts z histórie sledovania - Skryté v histórii pozerania - Zobrazené v histórii sledovania - Skryť štítok „Automatický dabing“ - Štítok s automatickým dabingom je skrytý - Štítok s automatickým dabingom je zobrazený - Skryť tlačidlo „Kúpiť Super poďakovanie“ - Tlačidlo „Kúpiť Super poďakovanie“ je skryté - Tlačidlo „Kúpiť Super poďakovanie“ je zobrazené - Skryť tlačidlo efektu - Tlačidlo efektu je skryté - Tlačidlo efektu je zobrazené - Skryť tlačidlo „Zelená obrazovka“ - Tlačidlo pre zelené pozadie bude skryté - Tlačidlo pre zelené pozadie bude zobrazené - Skryť tlačidlo pre hashtag - Tlačidlo pre hashtag bude skryté - Tlačidlo pre hashtag bude zobrazené - - Skryť tlačidlo Pripojiť sa - Tlačidlo Pripojiť sa je skryté - Zobrazí sa tlačidlo Pripojiť sa - Skryť živý náhľad - Živý náhľad je skrytý - Živý náhľad je zobrazený - Skryť štítok polohy - Štítok miesta je skrytý - Zobrazí sa štítok s umiestnením - Skryť tlačidlo „Nové príspevky“ - Tlačidlo Nové príspevky je skryté - Zobrazí sa tlačidlo Nové príspevky - Skryť pozastavené prekryvné tlačidlá - Tlačidlá pozastaveného prekrytia sú skryté - Zobrazia sa tlačidlá pozastaveného prekrytia - Skryť náhľadový komentár - Náhľadový komentár je skrytý - Zobrazuje sa ukážka komentára - Skryť tlačidlo „Uložiť hudbu“ - Tlačidlo na uloženie hudby je skryté - Tlačidlo na uloženie hudby sa zobrazuje - Skryť návrhy vyhľadávania - Návrhy vyhľadávania sú skryté - Zobrazia sa návrhy vyhľadávania - Skryť tlačidlo Obchod - Tlačidlo Obchod je skryté - Zobrazí sa tlačidlo Obchod - Skryť samolepky - Samolepky sú skryté - Samolepky sú zobrazené - Skryť tlačidlo Odoberať - Tlačidlo Prihlásiť sa na odber je skryté - Zobrazí sa tlačidlo Prihlásiť sa na odber - Skryť označené produkty - Označené produkty sú skryté - Zobrazia sa označené produkty - Skryť tlačidlo Pripravované - Tlačidlo pre časté videá bude skryté - Tlačidlo pre časté videá bude zobrazené - Skryť tlačidlo „Použiť tento zvuk“ - Tlačidlo Použiť tento zvuk je skryté - Tlačidlo Použiť tento zvuk je zobrazené - Skryť tlačidlo „Použiť túto šablónu“ - Tlačidlo Použiť túto šablónu je skryté - Tlačidlo Použiť túto šablónu je zobrazené - Skryť animáciu fontány tlačidla Páči sa mi to - Animácia fontány like bude skrytá - Animácia fontány like bude zobrazená - Skryť tlačidlo Páči sa mi to - Tlačidlo Páči sa mi je skryté - Zobrazí sa tlačidlo Páči sa mi - Skryť tlačidlo NePáči sa mi to - Tlačidlo Nepáči sa mi je skryté - Zobrazí sa tlačidlo Nepáči sa mi - Skryť tlačidlo Komentáre - Tlačidlo komentárov je skryté - Zobrazí sa tlačidlo Komentáre - - Skryť tlačidlo Zdieľať - Tlačidlo Zdieľať je skryté - Zobrazí sa tlačidlo Zdieľať - - Skryť tlačidlo Remix - Tlačidlo Remix je skryté - Zobrazí sa tlačidlo Remix - Tlačidlo skryť zvuk - Tlačidlo zvuku je skryté - Zobrazí sa tlačidlo zvuku - Skryť informačný panel - Informačný panel je skrytý - Zobrazí sa informačný panel - Skryť panel kanálov - Panel kanálov je skrytý - Zobrazí sa panel kanálov - Skryť názov videa - Názov videa je skrytý - Názov videa je zobrazený - Skryť označenie metadát zvuku - Štítok metadát zvuku je skrytý - Štítok metadát zvuku je zobrazený - Skryť štítok odkazu na video - Označenie odkazu na video je skryté - Zobrazí sa štítok odkazu na video - Skryť navigačný panel - Navigačný panel je skrytý - Zobrazí sa navigačná lišta - - - Skryť navrhované video na konci obrazovky - "Navrhované video na konci obrazovky je skryté, keď je automatické prehrávanie vypnuté. + + Skryť hodinky vo VR + Sledovanie v ponuke VR je skryté + Zobrazí sa ponuka Sledovať vo VR + Skryť ponuku kvality videa + Ponuka kvality videa je skrytá + Ponuka kvality videa je zobrazená + Skryť pätu ponuky kvality videa + Päta ponuky kvality videa je skrytá + Zobrazí sa päta ponuky kvality videa + + + Skryť tlačidlo Automatické prehrávanie + Tlačidlo automatického prehrávania je skryté + Zobrazí sa tlačidlo automatického prehrávania + + Skryť tlačidlo Titulky + Tlačidlo titulkov je skryté + Zobrazí sa tlačidlo titulkov + Skryť tlačidlo Cast + Tlačidlo zdieľania obrazovky je skryté + Tlačidlo zdieľania obrazovky je zobrazené + Skryť pozadie ovládacích prvkov prehrávača + Pozadie ovládacích prvkov prehrávača je skryté + Pozadie ovládacích prvkov prehrávača sa zobrazuje + Skryť tlačidlá Predchádzajúce & Nasledujúce + Tlačidlá sú skryté + Zobrazia sa tlačidlá + + + Skryť karty záverečnej obrazovky + Karty záverečnej obrazovky sú skryté + Zobrazia sa karty záverečnej obrazovky + + + Zakázať režim Ambient na celú obrazovku + Ambientný režim je vypnutý + Ambientný režim je povolený + + + Skryť informačné karty + Informačné karty sú skryté + Informačné karty sú zobrazené + + + Zakázať animácie pohyblivých čísel + Pohyblivé čísla nie sú animované + Pohyblivé čísla sú animované + + + Skryť posuvník prehrávača videa + Vyhľadávací panel prehrávača videa je skrytý + Zobrazí sa vyhľadávací panel prehrávača videa + + Skryť posuvník miniatúr videa + Posuvník miniatúr videa je skrytý + Posuvník miniatúr videa je zobrazený + + + Prehrávač Shorts + Skryť alebo zobraziť komponenty prehrávača Shorts + + Skryť Shorts na karte Domov + Skryté v kanáli Domov a súvisiacich videách + Zobrazené v kanáli Domov a súvisiacich videách + Skryť Shorts videá vo výsledkoch vyhľadávania + Skryté vo výsledkoch vyhľadávania + Zobrazené vo výsledkoch vyhľadávania + + Skryť Shorts v kanáli Odbery + Skryté v kanáli Odbery + Zobrazené v kanáli Odbery + Skryť Shorts z histórie sledovania + Skryté v histórii pozerania + Zobrazené v histórii sledovania + Skryť štítok „Automatický dabing“ + Štítok s automatickým dabingom je skrytý + Štítok s automatickým dabingom je zobrazený + Skryť tlačidlo „Kúpiť Super poďakovanie“ + Tlačidlo „Kúpiť Super poďakovanie“ je skryté + Tlačidlo „Kúpiť Super poďakovanie“ je zobrazené + Skryť tlačidlo efektu + Tlačidlo efektu je skryté + Tlačidlo efektu je zobrazené + Skryť tlačidlo „Zelená obrazovka“ + Tlačidlo pre zelené pozadie bude skryté + Tlačidlo pre zelené pozadie bude zobrazené + Skryť tlačidlo pre hashtag + Tlačidlo pre hashtag bude skryté + Tlačidlo pre hashtag bude zobrazené + + Skryť tlačidlo Pripojiť sa + Tlačidlo Pripojiť sa je skryté + Zobrazí sa tlačidlo Pripojiť sa + Skryť živý náhľad + Živý náhľad je skrytý + Živý náhľad je zobrazený + Skryť štítok polohy + Štítok miesta je skrytý + Zobrazí sa štítok s umiestnením + Skryť tlačidlo „Nové príspevky“ + Tlačidlo Nové príspevky je skryté + Zobrazí sa tlačidlo Nové príspevky + Skryť pozastavené prekryvné tlačidlá + Tlačidlá pozastaveného prekrytia sú skryté + Zobrazia sa tlačidlá pozastaveného prekrytia + Skryť náhľadový komentár + Náhľadový komentár je skrytý + Zobrazuje sa ukážka komentára + Skryť tlačidlo „Uložiť hudbu“ + Tlačidlo na uloženie hudby je skryté + Tlačidlo na uloženie hudby sa zobrazuje + Skryť návrhy vyhľadávania + Návrhy vyhľadávania sú skryté + Zobrazia sa návrhy vyhľadávania + Skryť tlačidlo Obchod + Tlačidlo Obchod je skryté + Zobrazí sa tlačidlo Obchod + Skryť samolepky + Samolepky sú skryté + Samolepky sú zobrazené + Skryť tlačidlo Odoberať + Tlačidlo Prihlásiť sa na odber je skryté + Zobrazí sa tlačidlo Prihlásiť sa na odber + Skryť označené produkty + Označené produkty sú skryté + Zobrazia sa označené produkty + Skryť tlačidlo Pripravované + Tlačidlo pre časté videá bude skryté + Tlačidlo pre časté videá bude zobrazené + Skryť tlačidlo „Použiť tento zvuk“ + Tlačidlo Použiť tento zvuk je skryté + Tlačidlo Použiť tento zvuk je zobrazené + Skryť tlačidlo „Použiť túto šablónu“ + Tlačidlo Použiť túto šablónu je skryté + Tlačidlo Použiť túto šablónu je zobrazené + Skryť animáciu fontány tlačidla Páči sa mi to + Animácia fontány like bude skrytá + Animácia fontány like bude zobrazená + Skryť tlačidlo Páči sa mi to + Tlačidlo Páči sa mi je skryté + Zobrazí sa tlačidlo Páči sa mi + Skryť tlačidlo NePáči sa mi to + Tlačidlo Nepáči sa mi je skryté + Zobrazí sa tlačidlo Nepáči sa mi + Skryť tlačidlo Komentáre + Tlačidlo komentárov je skryté + Zobrazí sa tlačidlo Komentáre + + Skryť tlačidlo Zdieľať + Tlačidlo Zdieľať je skryté + Zobrazí sa tlačidlo Zdieľať + + Skryť tlačidlo Remix + Tlačidlo Remix je skryté + Zobrazí sa tlačidlo Remix + Tlačidlo skryť zvuk + Tlačidlo zvuku je skryté + Zobrazí sa tlačidlo zvuku + Skryť informačný panel + Informačný panel je skrytý + Zobrazí sa informačný panel + Skryť panel kanálov + Panel kanálov je skrytý + Zobrazí sa panel kanálov + Skryť názov videa + Názov videa je skrytý + Názov videa je zobrazený + Skryť označenie metadát zvuku + Štítok metadát zvuku je skrytý + Štítok metadát zvuku je zobrazený + Skryť štítok odkazu na video + Označenie odkazu na video je skryté + Zobrazí sa štítok odkazu na video + Skryť navigačný panel + Navigačný panel je skrytý + Zobrazí sa navigačná lišta + + + Skryť navrhované video na konci obrazovky + "Navrhované video na konci obrazovky je skryté, keď je automatické prehrávanie vypnuté. Automatické prehrávanie je možné zmeniť v nastaveniach YouTube: Nastavenia → Prehrávanie → Automatické prehrávanie ďalšieho videa" - Navrhované video na konci obrazovky sa zobrazuje - - - Skryť prekrytie súvisiacich videí - Prekrytie súvisiacich videí v režime celej obrazovky je skryté - Prekrytie súvisiacich videí v režime celej obrazovky je zobrazené - - - Skryť časovú pečiatku videa - Časová pečiatka je skrytá - Zobrazí sa časová pečiatka - - - Skryť vyskakovacie panely prehrávača - Vyskakovacie panely prehrávača sú skryté - Zobrazia sa vyskakovacie panely prehrávača - - - Ukončiť režim celej obrazovky na konci videa - Zakázané - Na výšku - Na šírku - Na výšku a na šírku - - - Otvoriť videá v celoobrazovkovom portréte - Videá sa otvoria na celú obrazovku - Videá sa neotvoria na celú obrazovku - - - Nepriehľadnosť prekrytia prehrávača - Hodnota nepriehľadnosti medzi 0-100, kde 0 je transparentné - Nepriehľadnosť prekrytia hráča musí byť medzi 0-100 - - - - Nepáči sa mi dočasne nedostupné (rozhranie API vypršalo) - Nepáči sa mi nie sú k dispozícii (stav %d) - Hodnotenia Nepáči sa mi to nie sú k dispozícii (limit klientskeho API) - Nepáči sa mi nie sú k dispozícii (%s) - - Znova načítajte video a hlasujte pomocou funkcie Vrátiť Nepáči sa mi na YouTube - - Skryté vlastníkom - Nepáči sa mi - Nepáči sa mi nie sú zobrazené - Zobrazovať, že sa mi nepáči v Shorts videách - "Hodnotenia Nepáči sa mi to na Shorts sú zobrazené + Navrhované video na konci obrazovky sa zobrazuje + + + Skryť prekrytie súvisiacich videí + Prekrytie súvisiacich videí v režime celej obrazovky je skryté + Prekrytie súvisiacich videí v režime celej obrazovky je zobrazené + + + Skryť časovú pečiatku videa + Časová pečiatka je skrytá + Zobrazí sa časová pečiatka + + + Skryť vyskakovacie panely prehrávača + Vyskakovacie panely prehrávača sú skryté + Zobrazia sa vyskakovacie panely prehrávača + + + Ukončiť režim celej obrazovky na konci videa + Zakázané + Na výšku + Na šírku + Na výšku a na šírku + + + Otvoriť videá v celoobrazovkovom portréte + Videá sa otvoria na celú obrazovku + Videá sa neotvoria na celú obrazovku + + + Nepriehľadnosť prekrytia prehrávača + Hodnota nepriehľadnosti medzi 0-100, kde 0 je transparentné + Nepriehľadnosť prekrytia hráča musí byť medzi 0-100 + + + + Nepáči sa mi dočasne nedostupné (rozhranie API vypršalo) + Nepáči sa mi nie sú k dispozícii (stav %d) + Hodnotenia Nepáči sa mi to nie sú k dispozícii (limit klientskeho API) + Nepáči sa mi nie sú k dispozícii (%s) + + Znova načítajte video a hlasujte pomocou funkcie Vrátiť Nepáči sa mi na YouTube + + Skryté vlastníkom + Nepáči sa mi + Nepáči sa mi nie sú zobrazené + Zobrazovať, že sa mi nepáči v Shorts videách + "Hodnotenia Nepáči sa mi to na Shorts sú zobrazené Obmedzenie: Hodnotenia Nepáči sa mi to sa nemusia zobraziť v anonymnom režime" - Hodnotenia Nepáči sa mi to na Shorts sa nezobrazujú - Nepáči sa v percentách - Hodnotenia Nepáči sa mi to sa zobrazujú ako percento - Hodnotenia Nepáči sa mi to sa zobrazujú ako číslo - - Kompaktné tlačidlo Páči sa mi to - Tlačidlo podobné štýlu pre minimálnu šírku - Tlačidlo v štýle ako pre najlepší vzhľad - Zobraziť odhadované počty označení Páči sa mi to - Videá so zakázanými hodnoteniami Páči sa mi to zobrazujú odhadovaný počet hodnotení Páči sa mi to - Odhadované hodnotenia Páči sa mi to sa nezobrazujú - Ukážte prípitok, ak API nie je k dispozícii - Ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube, zobrazí sa toast - Toast sa nezobrazuje, ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube - Údaje poskytuje rozhranie Return YouTube Dislike API. Klepnutím sem sa dozviete viac - - Štatistiky rozhrania ReturnYouTubeDislike API tohto zariadenia - Čas odozvy API, priemer - Čas odozvy API, minimum - Maximálna doba odozvy API - Čas odozvy API, posledné video - Nepáči sa mi dočasne nedostupné – platí limit klientskeho rozhrania API - API načítava hlasy, počet hovorov - Neuskutočnili sa žiadne sieťové hovory - Počet uskutočnených sieťových hovorov: %d - API načítanie hlasov, počet uplynutých časových limitov - Časový limit žiadnych sieťových hovorov nevypršal - Časový limit %d sieťových hovorov vypršal - Limity klientskej sadzby API - Neboli zistené žiadne limity klientskej sadzby - Limit klientskej sadzby bol zaznamenaný %d-krát - %d milisekúnd - - - Povoliť široký panel vyhľadávania - Široký panel vyhľadávania je povolený - Široký panel vyhľadávania je vypnutý - - - Povoliť miniatúry vo vysokej kvalite - Miniatúry seekbaru sú vo vysokej kvalite - Miniatúry seekbaru sú v strednej kvalite - "Tým sa tiež obnovia miniatúry živých prenosov, ktoré nemajú miniatúry panela vyhľadávania. + Hodnotenia Nepáči sa mi to na Shorts sa nezobrazujú + Nepáči sa v percentách + Hodnotenia Nepáči sa mi to sa zobrazujú ako percento + Hodnotenia Nepáči sa mi to sa zobrazujú ako číslo + + Kompaktné tlačidlo Páči sa mi to + Tlačidlo podobné štýlu pre minimálnu šírku + Tlačidlo v štýle ako pre najlepší vzhľad + Zobraziť odhadované počty označení Páči sa mi to + Videá so zakázanými hodnoteniami Páči sa mi to zobrazujú odhadovaný počet hodnotení Páči sa mi to + Odhadované hodnotenia Páči sa mi to sa nezobrazujú + Ukážte prípitok, ak API nie je k dispozícii + Ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube, zobrazí sa toast + Toast sa nezobrazuje, ak nie je k dispozícii možnosť Vrátiť Nepáči sa mi na YouTube + Údaje poskytuje rozhranie Return YouTube Dislike API. Klepnutím sem sa dozviete viac + + Štatistiky rozhrania ReturnYouTubeDislike API tohto zariadenia + Čas odozvy API, priemer + Čas odozvy API, minimum + Maximálna doba odozvy API + Čas odozvy API, posledné video + Nepáči sa mi dočasne nedostupné – platí limit klientskeho rozhrania API + API načítava hlasy, počet hovorov + Neuskutočnili sa žiadne sieťové hovory + Počet uskutočnených sieťových hovorov: %d + API načítanie hlasov, počet uplynutých časových limitov + Časový limit žiadnych sieťových hovorov nevypršal + Časový limit %d sieťových hovorov vypršal + Limity klientskej sadzby API + Neboli zistené žiadne limity klientskej sadzby + Limit klientskej sadzby bol zaznamenaný %d-krát + %d milisekúnd + + + Povoliť široký panel vyhľadávania + Široký panel vyhľadávania je povolený + Široký panel vyhľadávania je vypnutý + + + Povoliť miniatúry vo vysokej kvalite + Miniatúry seekbaru sú vo vysokej kvalite + Miniatúry seekbaru sú v strednej kvalite + "Tým sa tiež obnovia miniatúry živých prenosov, ktoré nemajú miniatúry panela vyhľadávania. Miniatúry panela vyhľadávania budú používať rovnakú kvalitu ako aktuálne video. Táto funkcia najlepšie funguje s kvalitou videa 720p alebo nižšou a pri použití veľmi rýchleho internetového pripojenia." - Obnovte staré miniatúry vyhľadávacieho panela - Miniatúry panela vyhľadávania sa zobrazia nad panelom vyhľadávania - Miniatúry panela vyhľadávania sa zobrazia na celej obrazovke - - - Zapnúť SponsorBlock - SponsorBlock je systém vytváraný používateľmi na preskakovanie nepríjemných častí videí na YouTube - Vzhľad - Zobraziť hlasovacie tlačidlo - Zobrazí sa tlačidlo hlasovania segmentov - Segmentové hlasovacie tlačidlo sa nezobrazuje - Použiť štvorcové rozloženie - Tlačidlá a ovládacie prvky sú štvorcové - Tlačidlá a ovládacie prvky sú zaoblené - - Použiť kompaktné tlačidlo Preskočiť - Tlačidlo preskočenia v štýle minimálnej šírky - Tlačidlo preskočenia v štýle pre najlepší vzhľad - Automaticky skryť tlačidlo Preskočiť - Tlačidlo preskočenia sa po niekoľkých sekundách skryje - Tlačidlo Preskočiť sa zobrazuje pre celý segment - Dĺžka trvania tlačidla preskočiť - Ako dlho zobrazovať tlačidlá preskočiť a preskočiť na zvýraznenie pred automatickým skrytím - Zobraziť hlásenie o vrátení preskočenia - Hlásenie sa zobrazí, keď je segment automaticky preskočený. Klepnutím na hlásenie preskočenie vrátite - Hlásenie sa nezobrazuje - Dĺžka trvania hlásenia preskočenia - Ako dlho zobrazovať správu o zrušení preskočenia - 1 sekunda - 2 sekundy - 3 sekundy - 4 sekundy - 5 sekúnd - 6 sekúnd - 7 sekúnd - 8 sekúnd - 9 sekúnd - 10 sekúnd - Zobraziť dĺžku videa bez segmentov - Dĺžka videa mínus všetky segmenty sa zobrazuje na posuvníku - Zobrazená celá dĺžka videa - Vytváranie nových segmentov - Zobraziť tlačidlo Vytvoriť nový segment - Zobrazí sa tlačidlo Vytvoriť nový segment - Tlačidlo Vytvoriť nový segment sa nezobrazuje - Upravte nový krok segmentu - Počet milisekúnd, o ktoré sa tlačidlá úpravy času presunú pri vytváraní nových segmentov - Hodnota musí byť kladné číslo - Zobraziť pokyny - Pokyny obsahujú pravidlá a tipy na vytváranie nových segmentov - Postupujte podľa pokynov - Pred vytvorením nových segmentov si prečítajte pokyny pre SponsorBlock - Už prečítané - Zobraziť - Všeobecné - Ukážte prípitok, ak API nie je k dispozícii - Ak nie je k dispozícii SponsorBlock, zobrazí sa toast - Toast sa nezobrazuje, ak nie je k dispozícii SponsorBlock - Povoliť sledovanie počtu preskočení - Dáva rebríčku SponsorBlock vedieť, koľko času ušetríte. Pri každom preskočení segmentu sa do výsledkovej tabuľky odošle správa - Sledovanie počtu preskočení nie je povolené - Minimálna dĺžka segmentu - Segmenty kratšie ako táto hodnota (v sekundách) sa nezobrazia ani preskočia - Neplatné trvanie - Vaše súkromné ​​ID používateľa - Toto by ste mali držať v súkromí. Je to ako heslo a nemali by ste ho s nikým zdieľať. Pokiaľ ho niekto má, môže sa za vás vydávať - ID súkromného používateľa musí mať aspoň 30 znakov - Zmeniť adresu URL API - Adresa, ktorú SponsorBlock používa na uskutočňovanie hovorov na server - Adresa URL API bola resetovaná - Adresa URL rozhrania API je neplatná - Adresa URL API bola zmenená - Importovať/Exportovať nastavenia - Kopírovať - Vaša konfigurácia SponzorBlock JSON, ktorú je možné importovať/exportovať do ReVanced a iných platforiem SponzorBlock - Vaša konfigurácia SponzorBlock JSON, ktorú je možné importovať/exportovať do ReVanced a iných platforiem SponzorBlock. To zahŕňa vaše súkromné ​​​​používateľské ID. Určite to múdro zdieľajte - Nastavenia boli úspešne importované - Nepodarilo sa importovať: %s - Export zlyhal: %s - "Vaše nastavenia patria k SponsorBlocku. \n\nVaše používateľské ID je ako heslo a nikdy by sa nemalo zdieľať." - Neukazuj znovu - Zmeňte správanie segmentov - Sponzor - Platená propagácia, platené odporúčania a priame reklamy. Nie na vlastnú propagáciu alebo bezplatné ohlasovanie príčin/tvorcom/webovým stránkam/produktom, ktoré sa im páčia - Neplatená/Vlastná propagácia - Podobné ako reklamný segment, ale bez platenia alebo vlastnej propagácie. Obsahuje sekcie o tovare, daroch alebo informáciách o tom, s kým spolupracovali - Pripomienka interakcie (Odoberať) - Krátke pripomenutie, aby ste ich lajkli, odoberali alebo sledovali uprostred obsahu. Ak je dlhý alebo o niečom konkrétnom, mal by byť namiesto toho pod vlastnou propagáciou - Zlatý klinec - Časť videa, ktorú väčšina ľudí hľadá - Prerušenie/Úvodná animácia - Interval bez skutočného obsahu. Môže to byť pauza, statická snímka alebo opakujúca sa animácia. Nezahŕňa prechody obsahujúce informácie - Záverečné karty / Kredity - Kredity alebo keď sa zobrazia koncové karty YouTube. Nie na závery s informáciami - Úvod / Pozdravy - Rozprávané upútavky na nadchádzajúce video, pozdravy a rozlúčky. Nezahŕňa sekcie, ktoré pridávajú dodatočný obsah - Náhľad / Zhrnutie - Zbierka klipov, ktoré ukazujú, čo sa chystá alebo čo sa stalo vo videu alebo v iných videách série, kde sa všetky informácie opakujú inde - Odbočka / Vtipy - Tangenciálne scény alebo vtipy, ktoré nie sú potrebné na pochopenie hlavného obsahu videa. Nezahŕňa sekcie poskytujúce kontext alebo podrobnosti o pozadí - Hudba: Nehudobná sekcia - Len na použitie v hudobných videách. Časti hudobných videí bez hudby, ktoré už nie sú zahrnuté v inej kategórii - Preskočiť - Zlatý klinec - Preskočiť sponzora - Preskočiť promo - Preskočiť interakciu - Preskočte na zvýraznenie - Preskočiť úvod - Preskočiť prestávku - Preskočiť prestávku - Preskočte ďalšiu - Preskočiť úvod - Preskočiť ukážku - Preskočiť ukážku - Preskočiť rekapituláciu - Preskočiť odbočku - Preskočte nehudbu - Preskočiť segment - Preskočil sa sponzor - Preskočila sa vlastná propagácia - Preskočila sa pripomienka interakcie - Preskočené na zvýraznenie - Preskočil sa úvod - Vynechaná prestávka - Vynechaná prestávka - Preskočil sa záver - Úvod preskočený - Preskočila sa ukážka/rekapitulácia - Preskočila sa ukážka/rekapitulácia - Preskočená rekapitulácia - Odbočka preskočená - Preskočená nehudobná sekcia - Preskočený neodoslaný segment - Preskočené viaceré segmenty - Automaticky preskočiť - Raz automaticky preskočiť - Zobraziť tlačidlo Preskočiť - Zobraziť na paneli vyhľadávania - Vypnúť - Nie je možné odoslať segment: %s - SponsorBlock je dočasne mimo prevádzky - Segment nie je možné odoslať (stav: %1$d %2$s) - Segment sa nedá odoslať. Limit počtu (príliš veľa od rovnakého používateľa alebo IP) - Nie je možné odoslať segment: %s - "Segment sa nedá odoslať. + Obnovte staré miniatúry vyhľadávacieho panela + Miniatúry panela vyhľadávania sa zobrazia nad panelom vyhľadávania + Miniatúry panela vyhľadávania sa zobrazia na celej obrazovke + + + Zapnúť SponsorBlock + SponsorBlock je systém vytváraný používateľmi na preskakovanie nepríjemných častí videí na YouTube + Vzhľad + Zobraziť hlasovacie tlačidlo + Zobrazí sa tlačidlo hlasovania segmentov + Segmentové hlasovacie tlačidlo sa nezobrazuje + Použiť štvorcové rozloženie + Tlačidlá a ovládacie prvky sú štvorcové + Tlačidlá a ovládacie prvky sú zaoblené + + Použiť kompaktné tlačidlo Preskočiť + Tlačidlo preskočenia v štýle minimálnej šírky + Tlačidlo preskočenia v štýle pre najlepší vzhľad + Automaticky skryť tlačidlo Preskočiť + Tlačidlo preskočenia sa po niekoľkých sekundách skryje + Tlačidlo Preskočiť sa zobrazuje pre celý segment + Dĺžka trvania tlačidla preskočiť + Ako dlho zobrazovať tlačidlá preskočiť a preskočiť na zvýraznenie pred automatickým skrytím + Zobraziť hlásenie o vrátení preskočenia + Hlásenie sa zobrazí, keď je segment automaticky preskočený. Klepnutím na hlásenie preskočenie vrátite + Hlásenie sa nezobrazuje + Dĺžka trvania hlásenia preskočenia + Ako dlho zobrazovať správu o zrušení preskočenia + 1 sekunda + 2 sekundy + 3 sekundy + 4 sekundy + 5 sekúnd + 6 sekúnd + 7 sekúnd + 8 sekúnd + 9 sekúnd + 10 sekúnd + Zobraziť dĺžku videa bez segmentov + Dĺžka videa mínus všetky segmenty sa zobrazuje na posuvníku + Zobrazená celá dĺžka videa + Vytváranie nových segmentov + Zobraziť tlačidlo Vytvoriť nový segment + Zobrazí sa tlačidlo Vytvoriť nový segment + Tlačidlo Vytvoriť nový segment sa nezobrazuje + Upravte nový krok segmentu + Počet milisekúnd, o ktoré sa tlačidlá úpravy času presunú pri vytváraní nových segmentov + Hodnota musí byť kladné číslo + Zobraziť pokyny + Pokyny obsahujú pravidlá a tipy na vytváranie nových segmentov + Postupujte podľa pokynov + Pred vytvorením nových segmentov si prečítajte pokyny pre SponsorBlock + Už prečítané + Zobraziť + Všeobecné + Ukážte prípitok, ak API nie je k dispozícii + Ak nie je k dispozícii SponsorBlock, zobrazí sa toast + Toast sa nezobrazuje, ak nie je k dispozícii SponsorBlock + Povoliť sledovanie počtu preskočení + Dáva rebríčku SponsorBlock vedieť, koľko času ušetríte. Pri každom preskočení segmentu sa do výsledkovej tabuľky odošle správa + Sledovanie počtu preskočení nie je povolené + Minimálna dĺžka segmentu + Segmenty kratšie ako táto hodnota (v sekundách) sa nezobrazia ani preskočia + Neplatné trvanie + Vaše súkromné ​​ID používateľa + Toto by ste mali držať v súkromí. Je to ako heslo a nemali by ste ho s nikým zdieľať. Pokiaľ ho niekto má, môže sa za vás vydávať + ID súkromného používateľa musí mať aspoň 30 znakov + Zmeniť adresu URL API + Adresa, ktorú SponsorBlock používa na uskutočňovanie hovorov na server + Adresa URL API bola resetovaná + Adresa URL rozhrania API je neplatná + Adresa URL API bola zmenená + Importovať/Exportovať nastavenia + Kopírovať + Vaša konfigurácia SponzorBlock JSON, ktorú je možné importovať/exportovať do ReVanced a iných platforiem SponzorBlock + Vaša konfigurácia SponzorBlock JSON, ktorú je možné importovať/exportovať do ReVanced a iných platforiem SponzorBlock. To zahŕňa vaše súkromné ​​​​používateľské ID. Určite to múdro zdieľajte + Nastavenia boli úspešne importované + Nepodarilo sa importovať: %s + Export zlyhal: %s + "Vaše nastavenia patria k SponsorBlocku. \n\nVaše používateľské ID je ako heslo a nikdy by sa nemalo zdieľať." + Neukazuj znovu + Zmeňte správanie segmentov + Sponzor + Platená propagácia, platené odporúčania a priame reklamy. Nie na vlastnú propagáciu alebo bezplatné ohlasovanie príčin/tvorcom/webovým stránkam/produktom, ktoré sa im páčia + Neplatená/Vlastná propagácia + Podobné ako reklamný segment, ale bez platenia alebo vlastnej propagácie. Obsahuje sekcie o tovare, daroch alebo informáciách o tom, s kým spolupracovali + Pripomienka interakcie (Odoberať) + Krátke pripomenutie, aby ste ich lajkli, odoberali alebo sledovali uprostred obsahu. Ak je dlhý alebo o niečom konkrétnom, mal by byť namiesto toho pod vlastnou propagáciou + Zlatý klinec + Časť videa, ktorú väčšina ľudí hľadá + Prerušenie/Úvodná animácia + Interval bez skutočného obsahu. Môže to byť pauza, statická snímka alebo opakujúca sa animácia. Nezahŕňa prechody obsahujúce informácie + Záverečné karty / Kredity + Kredity alebo keď sa zobrazia koncové karty YouTube. Nie na závery s informáciami + Úvod / Pozdravy + Rozprávané upútavky na nadchádzajúce video, pozdravy a rozlúčky. Nezahŕňa sekcie, ktoré pridávajú dodatočný obsah + Náhľad / Zhrnutie + Zbierka klipov, ktoré ukazujú, čo sa chystá alebo čo sa stalo vo videu alebo v iných videách série, kde sa všetky informácie opakujú inde + Odbočka / Vtipy + Tangenciálne scény alebo vtipy, ktoré nie sú potrebné na pochopenie hlavného obsahu videa. Nezahŕňa sekcie poskytujúce kontext alebo podrobnosti o pozadí + Hudba: Nehudobná sekcia + Len na použitie v hudobných videách. Časti hudobných videí bez hudby, ktoré už nie sú zahrnuté v inej kategórii + Preskočiť + Zlatý klinec + Preskočiť sponzora + Preskočiť promo + Preskočiť interakciu + Preskočte na zvýraznenie + Preskočiť úvod + Preskočiť prestávku + Preskočiť prestávku + Preskočte ďalšiu + Preskočiť úvod + Preskočiť ukážku + Preskočiť ukážku + Preskočiť rekapituláciu + Preskočiť odbočku + Preskočte nehudbu + Preskočiť segment + Preskočil sa sponzor + Preskočila sa vlastná propagácia + Preskočila sa pripomienka interakcie + Preskočené na zvýraznenie + Preskočil sa úvod + Vynechaná prestávka + Vynechaná prestávka + Preskočil sa záver + Úvod preskočený + Preskočila sa ukážka/rekapitulácia + Preskočila sa ukážka/rekapitulácia + Preskočená rekapitulácia + Odbočka preskočená + Preskočená nehudobná sekcia + Preskočený neodoslaný segment + Preskočené viaceré segmenty + Automaticky preskočiť + Raz automaticky preskočiť + Zobraziť tlačidlo Preskočiť + Zobraziť na paneli vyhľadávania + Vypnúť + Nie je možné odoslať segment: %s + SponsorBlock je dočasne mimo prevádzky + Segment nie je možné odoslať (stav: %1$d %2$s) + Segment sa nedá odoslať. Limit počtu (príliš veľa od rovnakého používateľa alebo IP) + Nie je možné odoslať segment: %s + "Segment sa nedá odoslať. Už existuje" - Segment bol úspešne odoslaný - - SponsorBlock je dočasne nedostupný (vypršal časový limit rozhrania API) - SponsorBlock dočasne nedostupný (stav %d) - SponsorBlock dočasne nedostupný - Nie je možné hlasovať za segment (rozhranie API vypršalo) - Nie je možné hlasovať za segment (stav: %1$d %2$s) - Nedá sa hlasovať za segment: %s - Hlasovať za - Hlasovať proti - Zmeniť kategóriu - Nie sú dostupné žiadne segmenty pre hlasovanie - - %1$s do %2$s - Vyberte kategóriu segmentu - Kategória je v nastaveniach zakázaná. Povoľte odoslanie kategórie. - Nový SponsorBlock segment - Nastaviť „%s“ ako začiatok alebo koniec nového segmentu? - Začiatok - Koniec - Teraz - Čas, kedy segment začína - Čas, kedy segment končí - Sú časy správne? - "Segment je z + Segment bol úspešne odoslaný + + SponsorBlock je dočasne nedostupný (vypršal časový limit rozhrania API) + SponsorBlock dočasne nedostupný (stav %d) + SponsorBlock dočasne nedostupný + Nie je možné hlasovať za segment (rozhranie API vypršalo) + Nie je možné hlasovať za segment (stav: %1$d %2$s) + Nedá sa hlasovať za segment: %s + Hlasovať za + Hlasovať proti + Zmeniť kategóriu + Nie sú dostupné žiadne segmenty pre hlasovanie + + %1$s do %2$s + Vyberte kategóriu segmentu + Kategória je v nastaveniach zakázaná. Povoľte odoslanie kategórie. + Nový SponsorBlock segment + Nastaviť „%s“ ako začiatok alebo koniec nového segmentu? + Začiatok + Koniec + Teraz + Čas, kedy segment začína + Čas, kedy segment končí + Sú časy správne? + "Segment je z %1$s do @@ -1275,45 +1274,45 @@ do (%3$s) Pripravené na odoslanie?" - Začiatok musí byť pred koncom - Najprv označte dve miesta na časovej lište - Ukážte segment a uistite sa, že preskakuje plynulo - Ručne upravte časovanie segmentu - Chcete upraviť časovanie pre začiatok alebo koniec segmentu? - Zadaný neplatný čas - Štatistiky - - Štatistiky sú dočasne nedostupné (API je mimo prevádzky) - Načítava sa... - SponsorBlock je zakázaný - Vaše používateľské meno: <b>%s</b> - Klepnutím tu zmeníte svoje používateľské meno - Nie je možné zmeniť používateľské meno: Stav: %1$d %2$s - Používateľské meno bolo úspešne zmenené - Vaša reputácia je <b>%.2f</b> - Vytvorili ste <b>%s</b> segmentov - Klepnite sem a zobrazte si svoje segmenty - Rebríček SponsorBlock - Zachránili ste ľudí z <b>%s</b> segmentov - Klepnutím sem zobrazíte globálne štatistiky a hlavných prispievateľov - To je <b>%s</b> ich životov.<br>Klepnutím sem zobrazíte výsledkovú tabuľku - Preskočili ste <b>%s</b> segmentov - To je <b>%s</b> - Resetovať počítadlo preskočených segmentov? - %1$s hodín %2$s minút - %1$s minút %2$s sekúnd - %s sekúnd - Priehľadnosť: - Farba: - Informácie - Údaje poskytuje SponsorBlock API. Klepnutím sem sa dozviete viac a zobrazíte súbory na stiahnutie pre iné platformy - - - Formát rozloženia - Predvolené - Telefón - Automobily - "Zmeny zahŕňajú: + Začiatok musí byť pred koncom + Najprv označte dve miesta na časovej lište + Ukážte segment a uistite sa, že preskakuje plynulo + Ručne upravte časovanie segmentu + Chcete upraviť časovanie pre začiatok alebo koniec segmentu? + Zadaný neplatný čas + Štatistiky + + Štatistiky sú dočasne nedostupné (API je mimo prevádzky) + Načítava sa... + SponsorBlock je zakázaný + Vaše používateľské meno: <b>%s</b> + Klepnutím tu zmeníte svoje používateľské meno + Nie je možné zmeniť používateľské meno: Stav: %1$d %2$s + Používateľské meno bolo úspešne zmenené + Vaša reputácia je <b>%.2f</b> + Vytvorili ste <b>%s</b> segmentov + Klepnite sem a zobrazte si svoje segmenty + Rebríček SponsorBlock + Zachránili ste ľudí z <b>%s</b> segmentov + Klepnutím sem zobrazíte globálne štatistiky a hlavných prispievateľov + To je <b>%s</b> ich životov.<br>Klepnutím sem zobrazíte výsledkovú tabuľku + Preskočili ste <b>%s</b> segmentov + To je <b>%s</b> + Resetovať počítadlo preskočených segmentov? + %1$s hodín %2$s minút + %1$s minút %2$s sekúnd + %s sekúnd + Priehľadnosť: + Farba: + Informácie + Údaje poskytuje SponsorBlock API. Klepnutím sem sa dozviete viac a zobrazíte súbory na stiahnutie pre iné platformy + + + Formát rozloženia + Predvolené + Telefón + Automobily + "Zmeny zahŕňajú: Rozloženie pre tablety • Príspevky komunity sú skryté @@ -1321,311 +1320,309 @@ Rozloženie pre tablety Rozloženie pre automobily • Shorts sa otvárajú v bežnom prehrávači • Kanál je usporiadaný podľa tém a kanálov" - - - Verzia aplikácie Spoof - Verzia sfalšovaná - Verzia nie je sfalšovaná - "Verzia aplikácie bude falošne zmenená na staršiu verziu služby YouTube. + + + Verzia aplikácie Spoof + Verzia sfalšovaná + Verzia nie je sfalšovaná + "Verzia aplikácie bude falošne zmenená na staršiu verziu služby YouTube. Zmení sa vzhľad a funkcie aplikácie, ale môžu sa vyskytnúť neznáme vedľajšie účinky. Ak sa neskôr vypne, odporúča sa vymazať údaje aplikácie, aby sa zabránilo chybám používateľského rozhrania." - Falošná cieľová verzia aplikácie - 20.13.41 - Obnoviť nerozbalený panel akcií videa - 20.05.46 - Obnoviť funkčnosť prepisu - 19.35.36 - Obnoviť staré ikony Shorts prehrávača - 19.01.34 – Obnoviť staré ikony navigácie - - - Zmeniť úvodnú stránku - Predvolené - Všetky odbery - Prehliadať kanály - Kurzy / Vzdelávanie - Preskúmajte - Móda a krása - Hry - História - Knižnica - Videá, ktoré sa vám páčia - Živé - Filmy - Hudba - Správy - Upozornenia - Zoznamy skladieb - Vyhľadávanie - Nakupovanie - Šport - Predplatné - Trendy - Virtuálna realita - Pozrieť neskôr - Vaše klipy - Vždy zmeniť úvodnú stránku - "Úvodná stránka sa vždy zmení + Falošná cieľová verzia aplikácie + 20.13.41 - Obnoviť nerozbalený panel akcií videa + 20.05.46 - Obnoviť funkčnosť prepisu + 19.35.36 - Obnoviť staré ikony Shorts prehrávača + 19.01.34 – Obnoviť staré ikony navigácie + + + Zmeniť úvodnú stránku + Predvolené + Všetky odbery + Prehliadať kanály + Kurzy / Vzdelávanie + Preskúmajte + Móda a krása + Hry + História + Knižnica + Videá, ktoré sa vám páčia + Živé + Filmy + Hudba + Správy + Upozornenia + Zoznamy skladieb + Vyhľadávanie + Nakupovanie + Šport + Predplatné + Trendy + Virtuálna realita + Pozrieť neskôr + Vaše klipy + Vždy zmeniť úvodnú stránku + "Úvodná stránka sa vždy zmení Obmedzenie: Používanie tlačidla Späť na paneli s nástrojmi nemusí fungovať" - Úvodná stránka sa zmení iba pri spustení aplikácie - - - Zakázať obnovenie prehrávača Shorts - Prehrávač Shorts videí sa pri spustení aplikácie neobnoví - Prehrávač Shorts videí sa obnoví pri spustení aplikácie - - - Otvoriť Shorts s - Prehrávač Shorts - Bežný prehrávač - Bežný prehrávač na celú obrazovku - - - Automaticky prehrávať Shorts - Shorts sa automaticky prehrajú - Shorts sa budú opakovať - Automatické prehrávanie Shorts - Prehrávanie Shorts bude automaticky prebiehať v pozadí - Prehrávanie Shorts bude opakovane prebiehať v pozadí - - - Miniprehrávač - Zmeniť štýl minimalizovaného prehrávača v aplikácii - Typ miniprehrávača - Vypnuté - Predvolené - Minimálne - Moderné 1 - Moderné 2 - Moderné 3 - Moderné 4 - Zakázať zaoblené rohy - Rohy sú štvorcové - Rohy sú zaoblené - Povoliť dvojite klepnutie a štípanie na zmenu veľkosti - "Akcia dvojitého ťuknutia a zmenšenie prstami je povolená + Úvodná stránka sa zmení iba pri spustení aplikácie + + + Zakázať obnovenie prehrávača Shorts + Prehrávač Shorts videí sa pri spustení aplikácie neobnoví + Prehrávač Shorts videí sa obnoví pri spustení aplikácie + + + Otvoriť Shorts s + Prehrávač Shorts + Bežný prehrávač + Bežný prehrávač na celú obrazovku + + + Automaticky prehrávať Shorts + Shorts sa automaticky prehrajú + Shorts sa budú opakovať + Automatické prehrávanie Shorts + Prehrávanie Shorts bude automaticky prebiehať v pozadí + Prehrávanie Shorts bude opakovane prebiehať v pozadí + + + Miniprehrávač + Zmeniť štýl minimalizovaného prehrávača v aplikácii + Typ miniprehrávača + Vypnuté + Predvolené + Minimálne + Moderné 1 + Moderné 2 + Moderné 3 + Moderné 4 + Zakázať zaoblené rohy + Rohy sú štvorcové + Rohy sú zaoblené + Povoliť dvojite klepnutie a štípanie na zmenu veľkosti + "Akcia dvojitého ťuknutia a zmenšenie prstami je povolená • Dvojité ťuknutie na zväčšenie veľkosti miniprehrávača • Dvojité ťuknutie znova na obnovenie pôvodnej veľkosti" - Funkcia dvojklépanie a štípanie na zmenu veľkosti je zakázaná - Zakázať presúvanie myšou - Potiahnutie a pustenie je zakázané - "Pretiahnutie a" - Zakázať horizontálne gesto potiahnutia - Zakázané je horizontálne posunutie - "Gesto horizontálneho potiahnutia je povolené + Funkcia dvojklépanie a štípanie na zmenu veľkosti je zakázaná + Zakázať presúvanie myšou + Potiahnutie a pustenie je zakázané + "Pretiahnutie a" + Zakázať horizontálne gesto potiahnutia + Zakázané je horizontálne posunutie + "Gesto horizontálneho potiahnutia je povolené Miniprehrávač sa dá potiahnuť mimo obrazovky doľava alebo doprava" - Skryť tlačidlá prekrytia - Tlačidlá prekrytia sú skryté - Zobrazujú sa tlačidlá prekrytia - Skryť podtexty - Podtexty sú skryté - Zobrazia sa podtexty - Skryť tlačidlá na preskočenie dopredu a dozadu - Preskočenie dopredu a dozadu je skryté - Zobrazia sa skoky dopredu a dozadu - Počiatočná veľkosť - Počiatočná veľkosť na obrazovke v pixloch - Veľkosť pixelov musí byť byť medzi %1$s a %2$s - Nepriehľadnosť prekrytia - Hodnota nepriehľadnosti medzi 0-100, kde 0 je transparentné - Nepriehľadnosť prekrytia miniprehrávača musí byť medzi 0-100 - - - Povoliť obrazovku načítania gradientu - Načítavacia obrazovka bude mať pozadie s prechodom - Načítavacia obrazovka bude mať pevné pozadie - Štýl úvodnej obrazovky - Farba - Čiernobiela - Povoliť vlastnú farbu vyhľadávacieho panela - Zobrazí sa vlastná farba panela vyhľadávania - Zobrazí sa pôvodná farba vyhľadávacieho panela - Vlastná farba posuvníka - Farba posuvníka - Vlastná farba zvýraznenia posuvníka - Farba zvýraznenia posuvníka - Neplatná farba vyhľadávania panela - - - - - Logo záhlavia - Predvolené - Bežné - - ReVanced minimálne - Vlastné - - - Obíď ignorovanie obmedzení obrazovaého regiónu - Pouíž sa hostiteľ obrázkov yt4.ggpht.com - "Používanie pôvodného hostiteľa obrázkov + Skryť tlačidlá prekrytia + Tlačidlá prekrytia sú skryté + Zobrazujú sa tlačidlá prekrytia + Skryť podtexty + Podtexty sú skryté + Zobrazia sa podtexty + Skryť tlačidlá na preskočenie dopredu a dozadu + Preskočenie dopredu a dozadu je skryté + Zobrazia sa skoky dopredu a dozadu + Počiatočná veľkosť + Počiatočná veľkosť na obrazovke v pixloch + Veľkosť pixelov musí byť byť medzi %1$s a %2$s + Nepriehľadnosť prekrytia + Hodnota nepriehľadnosti medzi 0-100, kde 0 je transparentné + Nepriehľadnosť prekrytia miniprehrávača musí byť medzi 0-100 + + + Povoliť obrazovku načítania gradientu + Načítavacia obrazovka bude mať pozadie s prechodom + Načítavacia obrazovka bude mať pevné pozadie + Štýl úvodnej obrazovky + Farba + Čiernobiela + Povoliť vlastnú farbu vyhľadávacieho panela + Zobrazí sa vlastná farba panela vyhľadávania + Zobrazí sa pôvodná farba vyhľadávacieho panela + Vlastná farba posuvníka + Farba posuvníka + Vlastná farba zvýraznenia posuvníka + Farba zvýraznenia posuvníka + Neplatná farba vyhľadávania panela + + + + Logo záhlavia + Predvolené + Bežné + + ReVanced minimálne + Vlastné + + + Obíď ignorovanie obmedzení obrazovaého regiónu + Pouíž sa hostiteľ obrázkov yt4.ggpht.com + "Používanie pôvodného hostiteľa obrázkov Povolením tejto možnosti môžete opraviť chýbajúce obrázky, ktoré sú v niektorých regiónoch blokované" - - - - Karta Domov - - Karta Odbery - - Ty tab - Zoznamy skladieb prehrávača & odporúčania - Výsledky vyhľadávania - Pôvodné miniatúry - DeArrow & Pôvodné miniatúry - DeArrow & Stále zachytáva - Stále zachytáva - "DeArrow poskytuje miniatúry z YouTube videí od komunity. Tieto miniatúry sú často relevantnejšie ako tie, ktoré poskytuje YouTube + + + + Karta Domov + + Karta Odbery + + Ty tab + Zoznamy skladieb prehrávača & odporúčania + Výsledky vyhľadávania + Pôvodné miniatúry + DeArrow & Pôvodné miniatúry + DeArrow & Stále zachytáva + Stále zachytáva + "DeArrow poskytuje miniatúry z YouTube videí od komunity. Tieto miniatúry sú často relevantnejšie ako tie, ktoré poskytuje YouTube Ak je táto možnosť povolená, adresy URL videí sa odošlú na server API a neodošlú sa žiadne iné údaje. Ak video nemá miniatúry DeArrow, zobrazia sa pôvodné alebo statické snímky Ťuknite sem a dozviete sa viac o DeArrow" - Ukážte prípitok, ak API nie je k dispozícii - Ak DeArrow nie je k dispozícii, zobrazí sa toast - Toast sa nezobrazí, ak DeArrow nie je k dispozícii - Koncový bod rozhrania API DeArrow - Adresa URL koncového bodu vyrovnávacej pamäte miniatúr DeArrow - Statické snímanie videa - Statické zábery sa nasnímajú od začiatku/uprostred/konca každého videa. Tieto obrázky sú zabudované do služby YouTube a nepoužíva sa žiadne externé rozhranie API - Používajte rýchle statické zábery - Pri použití strednej kvality sa stále sníma. Miniatúry sa budú načítavať rýchlejšie, ale živé prenosy, nevydané alebo veľmi staré videá môžu zobrazovať prázdne miniatúry - Pomocou vysokej kvality stále zachytáva - Čas videa, z ktorého sa majú nasnímať statické zábery - Začiatok videa - Stred videa - Koniec videa - - DeArrow je dočasne nedostupný (stavový kód: %s) - DeArrow je dočasne nedostupný - - - Zobraziť oznámenia ReVanced - Oznámenia pri spustení sú zobrazené - Oznámenia pri spustení sa nezobrazujú - Zobrazovať oznámenia pri spustení - Nepodarilo sa pripojiť k poskytovateľovi oznámení - Odmietnuť - - - Povoliť opakovanie videa - Video sa bude opakovať - Video sa nebude opakovať - - - Zobraziť tlačidlo pre opakovanie videa - Tlačidlo je zobrazené - Tlačidlo sa nezobrazuje - Opakovanie videa je zapnuté - Opakovanie videa je vypnuté - - - - - Rozmery spoof zariadenia - "Rozmery zariadenia sú falošné + Ukážte prípitok, ak API nie je k dispozícii + Ak DeArrow nie je k dispozícii, zobrazí sa toast + Toast sa nezobrazí, ak DeArrow nie je k dispozícii + Koncový bod rozhrania API DeArrow + Adresa URL koncového bodu vyrovnávacej pamäte miniatúr DeArrow + Statické snímanie videa + Statické zábery sa nasnímajú od začiatku/uprostred/konca každého videa. Tieto obrázky sú zabudované do služby YouTube a nepoužíva sa žiadne externé rozhranie API + Používajte rýchle statické zábery + Pri použití strednej kvality sa stále sníma. Miniatúry sa budú načítavať rýchlejšie, ale živé prenosy, nevydané alebo veľmi staré videá môžu zobrazovať prázdne miniatúry + Pomocou vysokej kvality stále zachytáva + Čas videa, z ktorého sa majú nasnímať statické zábery + Začiatok videa + Stred videa + Koniec videa + + DeArrow je dočasne nedostupný (stavový kód: %s) + DeArrow je dočasne nedostupný + + + Zobraziť oznámenia ReVanced + Oznámenia pri spustení sú zobrazené + Oznámenia pri spustení sa nezobrazujú + Zobrazovať oznámenia pri spustení + Nepodarilo sa pripojiť k poskytovateľovi oznámení + Odmietnuť + + + Povoliť opakovanie videa + Video sa bude opakovať + Video sa nebude opakovať + + + Zobraziť tlačidlo pre opakovanie videa + Tlačidlo je zobrazené + Tlačidlo sa nezobrazuje + Opakovanie videa je zapnuté + Opakovanie videa je vypnuté + + + + Rozmery spoof zariadenia + "Rozmery zariadenia sú falošné Môžu sa odomknúť vyššie kvality videa, ale môže dôjsť k zadrhávaniu prehrávania videa, horšej výdrži batérie a neznámym vedľajším účinkom" - "Rozmery zariadenia nie sú falošné + "Rozmery zariadenia nie sú falošné Povolením tejto možnosti môžete odomknúť vyššie kvality videa" - Povolenie môže spôsobiť zasekávanie prehrávania videa, horšiu výdrž batérie a neznáme vedľajšie účinky. - - - Haptická odozva - Zmeniť haptickú odozvu - Zakázať haptiku kapitol - Haptika kapitol je zakázaná - Haptika kapitol je povolená - Zakázať haptiku presného vyhľadávania - Haptika presného vyhľadávania je vypnutá - Haptika presného vyhľadávania je povolená - Vypnúť haptiku vrátenia späť vyhľadávania - Haptika vrátenia späť vyhľadávania je vypnutá - Haptika vrátenia späť vyhľadávania je zapnutá - Zakázať haptiku priblíženia - Haptika priblíženia je vypnutá - Haptika priblíženia je zapnutá - - - Ak ste nedávno zmenili prihlasovacie údaje svojho účtu, odinštalujte a znova nainštalujte MicroG. - - - Obíďte presmerovania adries URL - Presmerovania URL sú obchádzané - Presmerovania URL nie sú obchádzané - - - Otvoriť odkazy v prehliadači - Otváranie odkazov v externom prehliadači - Otváranie odkazov v prehliadači v aplikácii - - - - Automaticky - Pamätajte na zmeny kvality videa - Zmeny kvality sa vzťahujú na všetky videá - Zmeny kvality sa vzťahujú iba na aktuálne video - Zobraziť hlášku pri zmene kvality videa - Hláška sa zobrazí, keď sa zmení predvolená kvalita videa - Hláška sa nezobrazí, keď sa zmení predvolená kvalita videa - Predvolená kvalita videa v sieti Wi-Fi - Predvolená kvalita videa v mobilnej sieti - Zapamätať si zmeny kvality pre Shorts - Zmeny kvality sa použijú na všetky Shorts - Zmeny kvality sa použijú iba na aktuálny Short - Predvolená kvalita pre Shorts v sieti Wi-Fi - Predvolená kvalita pre Shorts v mobilnej sieti - mobilné - Wi-Fi - Predvolená kvalita %1$s bola zmenená na: %2$s - Zmenená kvalita Shorts %1$s na: %2$s - - - Zobraziť dialógové tlačidlo rýchlosti - Tlačidlo dialógového okna rýchlosti je zobrazené. Klepnite a podržte pre resetovanie rýchlosti prehrávania na predvolenú - Tlačidlo dialógového okna rýchlosti nie je zobrazené - - - Zobraziť tlačidlo kvality videa - Tlačidlo kvality videa je zobrazené. Klepnite a podržte pre resetovanie kvality na predvolenú - Tlačidlo kvality videa nie je zobrazené - - - Menu vlastnej rýchlosti prehrávania - Menu vlastnej rýchlosti sa zobrazuje - Menu vlastnej rýchlosti sa nezobrazuje - Obnoviť staré menu rýchlosti prehrávania - Zobrazuje sa staré menu rýchlosti - Zobrazuje sa moderné menu rýchlosti - Vlastné rýchlosti prehrávania - Pridať alebo zmeň vlastné rýchlosti prehrávania - Vlastné rýchlosti musia byť menšie ako %s - Neplatné vlastné rýchlosti prehrávania - Automaticky - Vlastná rýchlosť ťuknutia a podržania - Rýchlosť prehrávania medzi 0-8 - - - Pamätajte na zmeny rýchlosti prehrávania - Zmeny rýchlosti prehrávania sa vzťahujú na všetky videá - Zmeny rýchlosti prehrávania sa vzťahujú len na aktuálne video - Zobraziť hlášku pri zmene rýchlosti prehrávania - Hláška sa zobrazí, keď sa zmení predvolená rýchlosť prehrávania - Hláška sa nezobrazuje, keď sa zmení predvolená rýchlosť prehrávania - Predvolená rýchlosť prehrávania - Predvolená rýchlosť bola zmenená na: %s - - - Vypnúť HDR video - HDR video je vypnuté - HDR video je zapnuté - Vynútiť AVC (H.264) - Video kodek je vynútený na AVC (H.264) - Video kodek je určený automaticky - "Výhody: + Povolenie môže spôsobiť zasekávanie prehrávania videa, horšiu výdrž batérie a neznáme vedľajšie účinky. + + + Haptická odozva + Zmeniť haptickú odozvu + Zakázať haptiku kapitol + Haptika kapitol je zakázaná + Haptika kapitol je povolená + Zakázať haptiku presného vyhľadávania + Haptika presného vyhľadávania je vypnutá + Haptika presného vyhľadávania je povolená + Vypnúť haptiku vrátenia späť vyhľadávania + Haptika vrátenia späť vyhľadávania je vypnutá + Haptika vrátenia späť vyhľadávania je zapnutá + Zakázať haptiku priblíženia + Haptika priblíženia je vypnutá + Haptika priblíženia je zapnutá + + + Ak ste nedávno zmenili prihlasovacie údaje svojho účtu, odinštalujte a znova nainštalujte MicroG. + + + Obíďte presmerovania adries URL + Presmerovania URL sú obchádzané + Presmerovania URL nie sú obchádzané + + + Otvoriť odkazy v prehliadači + Otváranie odkazov v externom prehliadači + Otváranie odkazov v prehliadači v aplikácii + + + + Automaticky + Pamätajte na zmeny kvality videa + Zmeny kvality sa vzťahujú na všetky videá + Zmeny kvality sa vzťahujú iba na aktuálne video + Zobraziť hlášku pri zmene kvality videa + Hláška sa zobrazí, keď sa zmení predvolená kvalita videa + Hláška sa nezobrazí, keď sa zmení predvolená kvalita videa + Predvolená kvalita videa v sieti Wi-Fi + Predvolená kvalita videa v mobilnej sieti + Zapamätať si zmeny kvality pre Shorts + Zmeny kvality sa použijú na všetky Shorts + Zmeny kvality sa použijú iba na aktuálny Short + Predvolená kvalita pre Shorts v sieti Wi-Fi + Predvolená kvalita pre Shorts v mobilnej sieti + mobilné + Wi-Fi + Predvolená kvalita %1$s bola zmenená na: %2$s + Zmenená kvalita Shorts %1$s na: %2$s + + + Zobraziť dialógové tlačidlo rýchlosti + Tlačidlo dialógového okna rýchlosti je zobrazené. Klepnite a podržte pre resetovanie rýchlosti prehrávania na predvolenú + Tlačidlo dialógového okna rýchlosti nie je zobrazené + + + Zobraziť tlačidlo kvality videa + Tlačidlo kvality videa je zobrazené. Klepnite a podržte pre resetovanie kvality na predvolenú + Tlačidlo kvality videa nie je zobrazené + + + Menu vlastnej rýchlosti prehrávania + Menu vlastnej rýchlosti sa zobrazuje + Menu vlastnej rýchlosti sa nezobrazuje + Obnoviť staré menu rýchlosti prehrávania + Zobrazuje sa staré menu rýchlosti + Zobrazuje sa moderné menu rýchlosti + Vlastné rýchlosti prehrávania + Pridať alebo zmeň vlastné rýchlosti prehrávania + Vlastné rýchlosti musia byť menšie ako %s + Neplatné vlastné rýchlosti prehrávania + Automaticky + Vlastná rýchlosť ťuknutia a podržania + Rýchlosť prehrávania medzi 0-8 + + + Pamätajte na zmeny rýchlosti prehrávania + Zmeny rýchlosti prehrávania sa vzťahujú na všetky videá + Zmeny rýchlosti prehrávania sa vzťahujú len na aktuálne video + Zobraziť hlášku pri zmene rýchlosti prehrávania + Hláška sa zobrazí, keď sa zmení predvolená rýchlosť prehrávania + Hláška sa nezobrazuje, keď sa zmení predvolená rýchlosť prehrávania + Predvolená rýchlosť prehrávania + Predvolená rýchlosť bola zmenená na: %s + + + Vypnúť HDR video + HDR video je vypnuté + HDR video je zapnuté + Vynútiť AVC (H.264) + Video kodek je vynútený na AVC (H.264) + Video kodek je určený automaticky + "Výhody: • Môže zlepšiť výdrž batérie • Môže obnoviť chýbajúce rozlíšenia videa na staršom zariadení @@ -1634,179 +1631,178 @@ Obmedzenia: • Prehrávanie videa spotrebuje viac internetových dát ako VP9 alebo AV1 • HDR videá nebudú používať AVC • Niektoré zariadenia nemôžu vynútiť AVC" - - - Zobraziť rozšírenú ponuku kvality videa - Zobrazuje sa rozšírená ponuka kvality videa - Nezobrazuje sa rozšírená ponuka kvality videa - - - Povoliť vyhľadávanie snímkou - Slide to search je zapnuté - Nie je povolené posúvanie - - - Povoliť Android VR AV1 - "Videokodek je AVC (H.264), VP9 alebo AV1 + + + Zobraziť rozšírenú ponuku kvality videa + Zobrazuje sa rozšírená ponuka kvality videa + Nezobrazuje sa rozšírená ponuka kvality videa + + + Povoliť vyhľadávanie snímkou + Slide to search je zapnuté + Nie je povolené posúvanie + + + Povoliť Android VR AV1 + "Videokodek je AVC (H.264), VP9 alebo AV1 Prehrávanie sa môže sekať alebo môžu vypadávať snímky" - Videokodek je AVC (H.264) alebo VP9 - "Povolenie tohto nastavenia môže použiť softvérové AV1 dekódovanie. + Videokodek je AVC (H.264) alebo VP9 + "Povolenie tohto nastavenia môže použiť softvérové AV1 dekódovanie. Prehrávanie videa s AV1 môže sekať alebo vynechávať snímky." - Vedľajšie účinky podvrhnutia - • Experimentálny klient a môže kedykoľvek prestať fungovať - • Video sa môže zastaviť o 1:00, alebo nemusí byť dostupné v niektorých regiónoch - • Chýba ponuka zvukovej stopy - • Žiadny video kodek AV1 - • Stabilná hlasitosť nie je dostupná - • Videá pre deti sa nemusia prehrávať, keď ste odhlásení alebo v režime inkognito - - • Vynútenie pôvodného zvuku nie je k dispozícii - Zobraziť v štatistike pre expertov - Typ klienta sa zobrazuje v štatistikách pre expertov - Klient je skrytý v štatistikách pre expertov - - - - - - - O aplikácii - Reklamy - Všeobecné - Prehrávač - Rôzne - - - Skryť videoreklamy - Videoreklamy sú skryté - Videoreklamy sú zobrazené - - - Povoliť trvalé opakovanie - Trvalé opakovanie je povolené - Trvalé opakovanie je zakázané - - - Skryť tlačidlo prenášania - Tlačidlo prenášania je skryté - Tlačidlo prenášania je zobrazené - Skryť tlačidlo histórie - Tlačidlo histórie je skryté - Tlačidlo histórie je zobrazené - Skryť tlačidlo upozornení - Tlačidlo upozornení je skryté - Tlačidlo upozornení je zobrazené - Skryť tlačidlo vyhľadávania - Tlačidlo vyhľadávania je skryté - Tlačidlo vyhľadávania je zobrazené - - - Skryť lištu kategórií - Lišta kategórií je skrytá - Lišta kategórií je zobrazená - - - Zmeniť farbu miniprehrávača - Farba miniprehrávača zodpovedá celoobrazovkovému prehrávaču - Miniprehrávač používa predvolenú farbu - - - Navigačný panel - Skryť alebo zmeniť tlačidlá navigačného panela - - Skryť Domov - Tlačidlo Domov je skryté - Tlačidlo Domov je zobrazené - - Skryť Ukážky - Tlačidlo Ukážky je skryté - Tlačidlo Ukážky je zobrazené - - Skryť Preskúmať - Tlačidlo Preskúmať je skryté - Tlačidlo Preskúmať je zobrazené - - Skryť Knižnicu - Tlačidlo Knižnica je skryté - Tlačidlo Knižnica je zobrazené - - Skryť Vylepšiť - Tlačidlo Inovovať je skryté - Tlačidlo Inovovať je zobrazené - Skryť navigačný panel - Navigačný panel je skrytý - Navigačný panel je zobrazený - Skryť popisky navigačných tlačidiel - Popisky sú skryté - Popisky sú zobrazené - - - Skryť štítok „Získajte Music Premium“ - Štítok je skrytý - Štítok je zobrazený - - - Skryť tlačidlo inovácie - Tlačidlo je skryté - Tlačidlo je zobrazené - - - - - Blokovať zvukové reklamy - Zvukové reklamy sú zablokované - Zvukové reklamy sú odblokované - - - %s nedostupné, reklamy sa môžu zobraziť. Skúste zmeniť službu blokovania reklám v nastaveniach. - %s vrátil chybu, reklamy sa môžu zobraziť. Skúste zmeniť službu blokovania reklám v nastaveniach. - Blokovať vložené videoreklamy - Vypnuté - Svetelný proxy - Proxy PurpleAdBlock - - - Blokovať videoreklamy - Videoreklamy sú zablokované - Videoreklamy sú odblokované - - - Správa odstránená - Zobraziť odstránené správy - Nezobrazovať odstránené správy - Skryť odstránené správy za spojler - Zobraziť odstránené správy ako preškrtnutý text - - - Automaticky nárokovať body kanála - Kanálové body sa získavajú automaticky - Kanálové body sa nenárokujú automaticky - - - - Povoliť režim ladenia Twitch - Režim ladenia Twitch je povolený (neodporúča sa) - Režim ladenia Twitch je zakázaný - - - Nastavenia ReVanced - O - O ReVanced - Blokovanie reklám - Nastavenia blokovania reklám - Rozhovor - Nastavenia chatu - Rôzne - Rôzne nastavenia - Všeobecné nastavenia - Iné nastavenia - Reklamy na strane klienta - Surestream reklamy na strane servera - Debug logovanie - Denníky ladenia sú povolené - Denníky ladenia sú zakázané - - + Vedľajšie účinky podvrhnutia + • Experimentálny klient a môže kedykoľvek prestať fungovať + • Video sa môže zastaviť o 1:00, alebo nemusí byť dostupné v niektorých regiónoch + • Chýba ponuka zvukovej stopy + • Žiadny video kodek AV1 + • Stabilná hlasitosť nie je dostupná + • Videá pre deti sa nemusia prehrávať, keď ste odhlásení alebo v režime inkognito + + • Vynútenie pôvodného zvuku nie je k dispozícii + Zobraziť v štatistike pre expertov + Typ klienta sa zobrazuje v štatistikách pre expertov + Klient je skrytý v štatistikách pre expertov + + + + + + O aplikácii + Reklamy + Všeobecné + Prehrávač + Rôzne + + + Skryť videoreklamy + Videoreklamy sú skryté + Videoreklamy sú zobrazené + + + Povoliť trvalé opakovanie + Trvalé opakovanie je povolené + Trvalé opakovanie je zakázané + + + Skryť tlačidlo prenášania + Tlačidlo prenášania je skryté + Tlačidlo prenášania je zobrazené + Skryť tlačidlo histórie + Tlačidlo histórie je skryté + Tlačidlo histórie je zobrazené + Skryť tlačidlo upozornení + Tlačidlo upozornení je skryté + Tlačidlo upozornení je zobrazené + Skryť tlačidlo vyhľadávania + Tlačidlo vyhľadávania je skryté + Tlačidlo vyhľadávania je zobrazené + + + Skryť lištu kategórií + Lišta kategórií je skrytá + Lišta kategórií je zobrazená + + + Zmeniť farbu miniprehrávača + Farba miniprehrávača zodpovedá celoobrazovkovému prehrávaču + Miniprehrávač používa predvolenú farbu + + + Navigačný panel + Skryť alebo zmeniť tlačidlá navigačného panela + + Skryť Domov + Tlačidlo Domov je skryté + Tlačidlo Domov je zobrazené + + Skryť Ukážky + Tlačidlo Ukážky je skryté + Tlačidlo Ukážky je zobrazené + + Skryť Preskúmať + Tlačidlo Preskúmať je skryté + Tlačidlo Preskúmať je zobrazené + + Skryť Knižnicu + Tlačidlo Knižnica je skryté + Tlačidlo Knižnica je zobrazené + + Skryť Vylepšiť + Tlačidlo Inovovať je skryté + Tlačidlo Inovovať je zobrazené + Skryť navigačný panel + Navigačný panel je skrytý + Navigačný panel je zobrazený + Skryť popisky navigačných tlačidiel + Popisky sú skryté + Popisky sú zobrazené + + + Skryť štítok „Získajte Music Premium“ + Štítok je skrytý + Štítok je zobrazený + + + Skryť tlačidlo inovácie + Tlačidlo je skryté + Tlačidlo je zobrazené + + + + + Blokovať zvukové reklamy + Zvukové reklamy sú zablokované + Zvukové reklamy sú odblokované + + + %s nedostupné, reklamy sa môžu zobraziť. Skúste zmeniť službu blokovania reklám v nastaveniach. + %s vrátil chybu, reklamy sa môžu zobraziť. Skúste zmeniť službu blokovania reklám v nastaveniach. + Blokovať vložené videoreklamy + Vypnuté + Svetelný proxy + Proxy PurpleAdBlock + + + Blokovať videoreklamy + Videoreklamy sú zablokované + Videoreklamy sú odblokované + + + Správa odstránená + Zobraziť odstránené správy + Nezobrazovať odstránené správy + Skryť odstránené správy za spojler + Zobraziť odstránené správy ako preškrtnutý text + + + Automaticky nárokovať body kanála + Kanálové body sa získavajú automaticky + Kanálové body sa nenárokujú automaticky + + + + Povoliť režim ladenia Twitch + Režim ladenia Twitch je povolený (neodporúča sa) + Režim ladenia Twitch je zakázaný + + + Nastavenia ReVanced + O + O ReVanced + Blokovanie reklám + Nastavenia blokovania reklám + Rozhovor + Nastavenia chatu + Rôzne + Rôzne nastavenia + Všeobecné nastavenia + Iné nastavenia + Reklamy na strane klienta + Surestream reklamy na strane servera + Debug logovanie + Denníky ladenia sú povolené + Denníky ladenia sú zakázané + + diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index 238d542a86..8bf6001e36 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - Ime aplikacije - - Po meri - Ikona aplikacije - Izvirno - - ReVanced minimalno - ReVanced prilagojeno - - Po meri - - - Preverjanja so spodletela - Obiščite uradno spletno mesto - Prezri - <h5>Zdi se, da ta aplikacija ni zakrpana z vašo stranjo.</h5><br>Ta aplikacija morda ne bo delovala pravilno, <b>lahko bi bila škodljiva ali celo nevarna za uporabo</b>.<br><br>Ti pregledi kažejo, da je bila ta aplikacija predhodno zakrpana ali pridobljena od nekoga drugega:<br><br><small>%1$s</small><br>Toplo priporočamo, da <b>odstranite to aplikacijo in jo sami zakrpa</b>, da zagotovite, da uporabljate preverjeno in varno aplikacijo.<p><br>Če jo prezrete, se bo to opozorilo prikazalo samo dvakrat. - Popravljeno na drugi napravi - Ni namestil ReVanced Manager - Popravljeno pred več kot 10 minutami - Zakrpan %s dni nazaj - Datum izgradnje APK je poškodovan - - - Obvestilo ReVanced - Vaš zgodovine gledanja se ne shranjuje.<br><br>To najverjetneje povzroči DNS blokiralnik oglasov ali omrežni posrednik.<br><br>Za odpravo težave dodajte na beli seznam <b>s.youtube.com</b> ali izklopite vse blokiralnike oglasov DNS in posrednike. - Ne prikazuj več - - - Nastavitve - Ali ste prepričani, da želite nadaljevati? - Shrani - Ponastavi - Ponastavi barvo - Neveljavna barva - Ponovni zagon potreben - Za uveljavitev te spremembe je potreben ponovni zagon aplikacije. - Ponovno zaženi - Uvozi - Kopiraj - ReVanced nastavitve ponastavljene na privzeto - Uvoženih %d nastavitev - Uvoz ni uspel: %s - Iskanje nastavitev - Za \"%s\" ni bilo najdenih rezultatov - Poskusite z drugo ključno besedo - Nedavna iskanja - Odstrani iz zgodovine iskanja? - Počisti zgodovino iskanja - Ali ste prepričani, da želite počistiti vso zgodovino iskanja? - Nasveti za iskanje - "• Dotaknite se poti, da se pomaknete do nje +--> + + + Ime aplikacije + + Po meri + Ikona aplikacije + Izvirno + + ReVanced minimalno + ReVanced prilagojeno + + Po meri + + + Preverjanja so spodletela + Obiščite uradno spletno mesto + Prezri + <h5>Zdi se, da ta aplikacija ni zakrpana z vašo stranjo.</h5><br>Ta aplikacija morda ne bo delovala pravilno, <b>lahko bi bila škodljiva ali celo nevarna za uporabo</b>.<br><br>Ti pregledi kažejo, da je bila ta aplikacija predhodno zakrpana ali pridobljena od nekoga drugega:<br><br><small>%1$s</small><br>Toplo priporočamo, da <b>odstranite to aplikacijo in jo sami zakrpa</b>, da zagotovite, da uporabljate preverjeno in varno aplikacijo.<p><br>Če jo prezrete, se bo to opozorilo prikazalo samo dvakrat. + Popravljeno na drugi napravi + Ni namestil ReVanced Manager + Popravljeno pred več kot 10 minutami + Zakrpan %s dni nazaj + Datum izgradnje APK je poškodovan + + + Obvestilo ReVanced + Vaš zgodovine gledanja se ne shranjuje.<br><br>To najverjetneje povzroči DNS blokiralnik oglasov ali omrežni posrednik.<br><br>Za odpravo težave dodajte na beli seznam <b>s.youtube.com</b> ali izklopite vse blokiralnike oglasov DNS in posrednike. + Ne prikazuj več + + + Nastavitve + Ali ste prepričani, da želite nadaljevati? + Shrani + Ponastavi + Ponastavi barvo + Neveljavna barva + Ponovni zagon potreben + Za uveljavitev te spremembe je potreben ponovni zagon aplikacije. + Ponovno zaženi + Uvozi + Kopiraj + ReVanced nastavitve ponastavljene na privzeto + Uvoženih %d nastavitev + Uvoz ni uspel: %s + Iskanje nastavitev + Za \"%s\" ni bilo najdenih rezultatov + Poskusite z drugo ključno besedo + Nedavna iskanja + Odstrani iz zgodovine iskanja? + Počisti zgodovino iskanja + Ali ste prepričani, da želite počistiti vso zgodovino iskanja? + Nasveti za iskanje + "• Dotaknite se poti, da se pomaknete do nje • Dolgo pritisnite na nastavitev, da se pomaknete do nje • Pritisnite Enter, da shranite iskalno poizvedbo v zgodovino • Iskanje ignorira velikost črk in ločila • Nadrejene nastavitve se prikažejo nad onemogočenimi podrejenimi nastavitvami" - Zgodovina iskanja je prazna - Če želite shraniti zgodovino iskanja, vnesite iskalno poizvedbo in pritisnite Enter - Pokaži zgodovino iskanja nastavitev - Zgodovina iskanja nastavitev je prikazana - Zgodovina iskanja nastavitev ni prikazana - Pokaži ikone nastavitev ReVanced - Ikone nastavitev so prikazane - Ikone nastavitev niso prikazane - ReVanced jezik - "Prevodi za nekatere jezike so morda manjkajoči ali nepopolni. + Zgodovina iskanja je prazna + Če želite shraniti zgodovino iskanja, vnesite iskalno poizvedbo in pritisnite Enter + Pokaži zgodovino iskanja nastavitev + Zgodovina iskanja nastavitev je prikazana + Zgodovina iskanja nastavitev ni prikazana + Pokaži ikone nastavitev ReVanced + Ikone nastavitev so prikazane + Ikone nastavitev niso prikazane + ReVanced jezik + "Prevodi za nekatere jezike so morda manjkajoči ali nepopolni. Če želite prevesti nove jezike ali izboljšati obstoječe prevode, obiščite translate.revanced.app" - Jezik aplikacije - Uvozi / Izvozi - Uvozi / Izvozi ReVanced nastavitve - - Uporabljate različico ReVanced Patches <i>%s</i> - Opomba - Ta različica je predverzija in lahko pride do nepričakovanih težav - Uradne povezave - + Uporabljate različico ReVanced Patches <i>%s</i> + Opomba + Ta različica je predverzija in lahko pride do nepričakovanih težav + Uradne povezave + - - - Nastavitve GmsCore - Nastavitve za GmsCore - - MicroG GmsCore ni nameščen. Namestite ga. - Dejanje potrebno - "MicroG GmsCore nima dovoljenja za delovanje v ozadju. + + + Nastavitve GmsCore + Nastavitve za GmsCore + + MicroG GmsCore ni nameščen. Namestite ga. + Dejanje potrebno + "MicroG GmsCore nima dovoljenja za delovanje v ozadju. Upoštevajte navodila za \"Ne ubijaj moje aplikacije\" za vaš telefon in uporabite navodila za vašo namestitev MicroG. To je potrebno za delovanje aplikacije." - Odpri spletno mesto - "Optimizacije baterije za MicroG GmsCore morajo biti onemogočene, da se preprečijo težave. + Odpri spletno mesto + "Optimizacije baterije za MicroG GmsCore morajo biti onemogočene, da se preprečijo težave. Onemogočanje optimizacij baterije za MicroG ne bo negativno vplivalo na porabo baterije. Tapnite gumb za nadaljevanje in dovolite spremembe optimizacij." - Nadaljuj - - - Ponaredi video tokove - Ponaredi video tokove odjemalca, da preprečiš težave z predvajanjem - Ponarejanje video tokov - "Video tokovi so ponarejeni + Nadaljuj + + + Ponaredi video tokove + Ponaredi video tokove odjemalca, da preprečiš težave z predvajanjem + Ponarejanje video tokov + "Video tokovi so ponarejeni Če ste uporabnik YouTube Premium, ta nastavitev morda ne bo potrebna" - "Video tokovi niso ponarejeni + "Video tokovi niso ponarejeni Predvajanje morda ne bo delovalo" - Izklop te nastavitve lahko povzroči težave z predvajanjem. - Privzeti odjemalec - - - Izsili izvirni jezik zvoka - Uporabi izvirni jezik zvoka - Uporaba privzetega zvoka - - Za uporabo te funkcije spremenite \"Ponaredi video tokove\" na katerega koli odjemalca, razen na Android Studio - - - Razhroščevanje - Omogoči ali onemogoči možnosti razhroščevanja - Dnevnik napak - Dnevniki napak so omogočeni - Dnevniki napak so onemogočeni - Dnevnik sledov steka - Dnevniki napak vključujejo sled sledov - Dnevniki napak ne vključujejo sledi sledov - Prikaži obvestilo pri napaki ReVanced - Če pride do napake, se prikaže toast - Če pride do napake, se toast ne prikaže - "Onemogočanje obvestil o napakah skrije vsa obvestila o napakah v ReVancedu. + Izklop te nastavitve lahko povzroči težave z predvajanjem. + Privzeti odjemalec + + + Izsili izvirni jezik zvoka + Uporabi izvirni jezik zvoka + Uporaba privzetega zvoka + + Za uporabo te funkcije spremenite \"Ponaredi video tokove\" na katerega koli odjemalca, razen na Android Studio + + + Razhroščevanje + Omogoči ali onemogoči možnosti razhroščevanja + Dnevnik napak + Dnevniki napak so omogočeni + Dnevniki napak so onemogočeni + Dnevnik sledov steka + Dnevniki napak vključujejo sled sledov + Dnevniki napak ne vključujejo sledi sledov + Prikaži obvestilo pri napaki ReVanced + Če pride do napake, se prikaže toast + Če pride do napake, se toast ne prikaže + "Onemogočanje obvestil o napakah skrije vsa obvestila o napakah v ReVancedu. Ne boste obveščeni o nobenih nepričakovanih dogodkih." - Izvozi dnevnike napak - Kopira dnevnike napak ReVanced v odložišče - Beleženje napak je onemogočeno - Dnevnikov ni mogoče najti - Dnevniki so bili kopirani - Izvoz dnevnikov ni uspel: %s - Počisti dnevnike napak - Počisti vse shranjene dnevnike napak ReVanced - Dnevniki so bili izbrisani - Zastavice funkcij Manager - Upravljanje logičnih zastavic funkcij - Aktivne zastavice (%d) - Blokirane zastavice (%d) - Iskanje zastavic... - Zastavice shranjene - Zastavice ponastavljene - Zastavice kopirane v odložišče - Dnevnik protokola pufra - Dnevniki napak vključujejo protokol pufra - Dnevniki napak ne vključujejo protokola pufra - "Če omogočite to nastavitev, se bodo beležili dodatni podatki o postavitvi, vključno z besedilom na zaslonu za nekatere komponente uporabniškega vmesnika. + Izvozi dnevnike napak + Kopira dnevnike napak ReVanced v odložišče + Beleženje napak je onemogočeno + Dnevnikov ni mogoče najti + Dnevniki so bili kopirani + Izvoz dnevnikov ni uspel: %s + Počisti dnevnike napak + Počisti vse shranjene dnevnike napak ReVanced + Dnevniki so bili izbrisani + Zastavice funkcij Manager + Upravljanje logičnih zastavic funkcij + Aktivne zastavice (%d) + Blokirane zastavice (%d) + Iskanje zastavic... + Zastavice shranjene + Zastavice ponastavljene + Zastavice kopirane v odložišče + Dnevnik protokola pufra + Dnevniki napak vključujejo protokol pufra + Dnevniki napak ne vključujejo protokola pufra + "Če omogočite to nastavitev, se bodo beležili dodatni podatki o postavitvi, vključno z besedilom na zaslonu za nekatere komponente uporabniškega vmesnika. To lahko pomaga prepoznati komponente pri ustvarjanju filtrov po meri. Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot je vaš naslov IP." - - - Sanitiziraj povezave za deljenje - Parameter sledenja poizvedbe je odstranjen iz deljenih povezav - Parameter sledenja poizvedbe ni odstranjen iz deljenih povezav - Spremenite povezave za skupno rabo v youtube.com - Skupne povezave uporabljajo youtube.com - Skupne povezave uporabljajo music.youtube.com - - - Prilagojeni filter - Skrij komponente s prilagojenimi filtri - Omogoči prilagojeni filter - Prilagojeni filter je omogočen - Prilagojeni filter je onemogočen - Prilagojeni filter - - Seznam nizov gradnikov poti komponent za filtriranje, ločenih z novimi vrsticami - Neveljaven prilagojeni filter: %s - - - - - O nas - Oglasi - Alternativne sličice - Vir - Splošno - Predvajalnik - Drsnik - Krmiljenje s potegi - Razno - **Video** - Obnovi stare menije nastavitev - Prikazani so stari meniji nastavitev - Stari meniji nastavitev niso prikazani - - - Onemogoči predvajanje Shorts v ozadju - Predvajanje Shorts v ozadju je onemogočeno - Predvajanje Shorts v ozadju je omogočeno - - - Skrij kartice albuma - Kartice albuma so skrite - Kartice albuma so prikazane - Skrij kartice izvajalcev - Kartice izvajalcev so skrite - Kartice izvajalcev so prikazane - Skrij polico s čipi - Polica s čipi je skrita - Polica s čipi je prikazana - Skrij objave skupnosti - Objave skupnosti so skrite - Objave skupnosti so prikazane - Skrij kompaktne pasice - Kompaktne pasice so skrite - Kompaktne pasice so prikazane - Skrij razširljivo kartico - Razširljiva kartica pod videoposnetki je skrita - Razširljiva kartica pod videoposnetki je prikazana - Skrij plavajoči gumb mikrofona - Plavajoči gumb mikrofona v iskanju je skrit - Plavajoči gumb mikrofona v iskanju je prikazan - Skrij vodoravne police - "Vodoravne police so skrite, kot so: + + + Sanitiziraj povezave za deljenje + Parameter sledenja poizvedbe je odstranjen iz deljenih povezav + Parameter sledenja poizvedbe ni odstranjen iz deljenih povezav + Spremenite povezave za skupno rabo v youtube.com + Skupne povezave uporabljajo youtube.com + Skupne povezave uporabljajo music.youtube.com + + + Prilagojeni filter + Skrij komponente s prilagojenimi filtri + Omogoči prilagojeni filter + Prilagojeni filter je omogočen + Prilagojeni filter je onemogočen + Prilagojeni filter + + Seznam nizov gradnikov poti komponent za filtriranje, ločenih z novimi vrsticami + Neveljaven prilagojeni filter: %s + + + + + O nas + Oglasi + Alternativne sličice + Vir + Splošno + Predvajalnik + Drsnik + Krmiljenje s potegi + Razno + **Video** + Obnovi stare menije nastavitev + Prikazani so stari meniji nastavitev + Stari meniji nastavitev niso prikazani + + + Onemogoči predvajanje Shorts v ozadju + Predvajanje Shorts v ozadju je onemogočeno + Predvajanje Shorts v ozadju je omogočeno + + + Skrij kartice albuma + Kartice albuma so skrite + Kartice albuma so prikazane + Skrij kartice izvajalcev + Kartice izvajalcev so skrite + Kartice izvajalcev so prikazane + Skrij polico s čipi + Polica s čipi je skrita + Polica s čipi je prikazana + Skrij objave skupnosti + Objave skupnosti so skrite + Objave skupnosti so prikazane + Skrij kompaktne pasice + Kompaktne pasice so skrite + Kompaktne pasice so prikazane + Skrij razširljivo kartico + Razširljiva kartica pod videoposnetki je skrita + Razširljiva kartica pod videoposnetki je prikazana + Skrij plavajoči gumb mikrofona + Plavajoči gumb mikrofona v iskanju je skrit + Plavajoči gumb mikrofona v iskanju je prikazan + Skrij vodoravne police + "Vodoravne police so skrite, kot so: • Udarno • Nadaljuj z gledanjem • Razišči več kanalov • Najbolj ustrezno • Nakupovanje • Glej znova" - Horizontalne police so prikazane - Skrij polico s slikami - Polica s slikami v rezultatih iskanja je skrita - Polica s slikami v rezultatih iskanja je prikazana - Skrij najnovejše objave - Najnovejše objave so skrite - Najnovejše objave so prikazane - Skrij mešane sezname predvajanja - Mešani seznami predvajanja so skriti - Mešani seznami predvajanja so prikazani - Skrij oddelek s filmi - Oddelek s filmi je skrit - Oddelek s filmi je prikazan - - Skrij gumb \"Obvesti me\" - Gumb \"Obvesti me\" je skrit - Gumb \"Obvesti me\" je prikazan - Skrij igre - Igre so skrite - Igre so prikazane - - Skrij gumb \"Prikaži več\" - Gumb \"Prikaži več\" v rezultatih iskanja je skrit - Gumb \"Prikaži več\" v rezultatih iskanja je prikazan - Skrij ankete - Ankete so skrite - Ankete so prikazane - Skrij polico za vstopnice - Polica za vstopnice je skrita - Polica za vstopnice je prikazana - - Skrij oznake priporočenih videoposnetkov - Oznake \"Ljudje so si ogledali tudi\" in \"Morda vam bo všeč\" v rezultatih iskanja so skrite - Oznake \"Ljudje so si ogledali tudi\" in \"Morda vam bo všeč\" v rezultatih iskanja so prikazane - Skrij vizualni distančnik - Vizualni distančnik je skrit - Vizualni distančnik je prikazan - - Skrij YouTube Doodles - Animacija YouTube Doodles na logotipu je skrita - Animacija YouTube Doodles na logotipu je prikazana - "Doodles so prikazani nekaj dni v letu. + Skrij gumb \"Prikaži več\" + Gumb \"Prikaži več\" v rezultatih iskanja je skrit + Gumb \"Prikaži več\" v rezultatih iskanja je prikazan + Skrij ankete + Ankete so skrite + Ankete so prikazane + Skrij polico za vstopnice + Polica za vstopnice je skrita + Polica za vstopnice je prikazana + + Skrij oznake priporočenih videoposnetkov + Oznake \"Ljudje so si ogledali tudi\" in \"Morda vam bo všeč\" v rezultatih iskanja so skrite + Oznake \"Ljudje so si ogledali tudi\" in \"Morda vam bo všeč\" v rezultatih iskanja so prikazane + Skrij vizualni distančnik + Vizualni distančnik je skrit + Vizualni distančnik je prikazan + + Skrij YouTube Doodles + Animacija YouTube Doodles na logotipu je skrita + Animacija YouTube Doodles na logotipu je prikazana + "Doodles so prikazani nekaj dni v letu. Če je Doodle trenutno prikazan v vaši regiji in je ta nastavitev skrita, se bo skrila tudi vrstica filtrov pod iskalno vrstico." - Skrij vrstico kanala - Vrstica kanala je skrita - Vrstica kanala je prikazana - Skrij vodni žig kanala - Vodni žig je skrit - Vodni žig je prikazan - Skrij polje za financiranje - Polje za financiranje je skrito - Polje za financiranje je prikazano - Skrij polja za nujne primere - Polja za nujne primere so skrita - Polja za nujne primere so prikazana - Skrij informativne plošče - Informativne plošče so skrite - Informativne plošče so prikazane - - Skrij gumb Pridruži se - Gumb \"Pridruži se\" je skrit - Gumb \"Pridruži se\" je prikazan - Skrij medicinske plošče - Medicinske plošče so skrite - Medicinske plošče so prikazane - Skrij hitra dejanja - Hitra dejanja v celozaslonskem načinu so skrita - Hitra dejanja v celozaslonskem načinu so prikazana - Skrij povezane videoposnetke - Povezani videoposnetki v hitrih dejanjih so skriti - Povezani videoposnetki v hitrih dejanjih so prikazani - Skrij smernice za naročnike - Smernice skupnosti naročnikov so skrite - Smernice skupnosti naročnikov so prikazane - Skrij časovno usklajene reakcije - Časovno usklajene reakcije so skrite - Časovno usklajene reakcije so prikazane - Skrij »Povzetek videoposnetka, ustvarjenega z umetno inteligenco« - Razdelek z AI-generiranim povzetkom videa je skrit - Razdelek s povzetkom videoposnetka, ustvarjenim z umetno inteligenco, je prikazan - Skrij Vprašaj - Razdelek »Vprašaj« je skrit - Razdelek »Vprašaj« je prikazan - Skrij atribute - Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so skriti - Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so prikazani - Skrij poglavja - Oddelek s poglavji je skrit - Oddelek s poglavji je prikazan - Skrij »Kako je bila ta vsebina ustvarjena« - Razdelek »Kako je bila ta vsebina ustvarjena« je skrit - Razdelek »Kako je bila ta vsebina ustvarjena« je prikazan - Skrij točke Hype - Točke Hype so skrite - Točke Hype so prikazane - Skrij »Raziščite podcast« - Razdelek »Raziščite podcast« je skrit - Razdelek »Raziščite podcast« je prikazan - Skrij predstavljene povezave - Razdelek s poudarjenimi povezavami je skrit - Razdelek s poudarjenimi povezavami je prikazan - Skrij poudarjene videoposnetke - Razdelek s poudarjenimi videoposnetki je skrit - Razdelek s poudarjenimi videoposnetki je prikazan - Skrij kartice z informacijami - Oddelek s karticami z informacijami je skrit - Oddelek s karticami z informacijami je prikazan - Skrij »Ključni koncepti« - Razdelek »Ključni koncepti« je skrit - Razdelek »Ključni koncepti« je prikazan - Skrij gumb Naroči se - Gumb Naroči se je skrit - Gumb Naroči se je prikazan - Skrij prepis - Oddelek s prepisom je skrit - Oddelek s prepisom je prikazan - Opis videoposnetka - Skrij ali prikaži komponente opisa videoposnetka - Vrstica filtra - Skrij ali prikaži vrstico filtrov v virih, povezanih videih, rezultatih iskanja in zgodovini ogledov - Skrij v virih - Skrito v virih - Prikazano v virih - Skrij v povezanih videoposnetkih - Skrita v povezanih videoposnetkih - Prikazana v povezanih videoposnetkih - Skrij v rezultatih iskanja - Skrito v rezultatih iskanja - Prikazano v rezultatih iskanja - Skrij v zgodovini ogledov - Skrito v zgodovini ogledov - Prikazano v zgodovini ogledov - Stran kanala - Skrij ali prikaži komponente strani kanala - - Skrij gumb Skupnost - Gumb Skupnost je skrit - Gumb Skupnost je prikazan - - Skrij polico »Za vas« - Polica Za vas je skrita - Polica Za vas je prikazana - - Skrij gumb Pridruži se - Gumb Pridruži se je skrit - Gumb Pridruži se je prikazan - Skrij predogled povezav - Predogled povezav je skrit - Predogled povezav je prikazan - Skrij polico za člane - Polica za člane je skrita - Polica za člane je prikazana - - Skrij gumb Trgovina - Gumb Trgovina je skrit - Gumb Trgovina je prikazan - - Skrij gumb Naroči se - Gumb Naroči se je skrit - Gumb Naroči se je prikazan - Komentarji - Skrij ali prikaži komponente oddelka s komentarji - Skrij povzetek klepeta z AI - Povzetek klepeta z AI je skrit - Povzetek klepeta z AI je prikazan - Skrij povzetek komentarjev z umetno inteligenco - Povzetek komentarjev z AI je skrit - Povzetek komentarjev z AI je prikazan - Skrij smernice kanala - Smernice kanala so skrite - Smernice kanala so prikazane - Skrij naslov \"Komentarji članov\" - Glava s komentarji članov je skrita - Glava s komentarji članov je prikazana - Skrij oddelek s komentarji - Oddelek s komentarji je skrit - Oddelek s komentarji je prikazan - Skrij smernice skupnosti - Smernice skupnosti so skrite - Smernice skupnosti so prikazane - Skrij gumb \"Ustvari Shorts\" - Gumb »Ustvari Short« je skrit - Gumb »Ustvari Short« je prikazan - Skrij gumbe za emodžije in časovne žige - Gumbi za emodžije in časovne žige so skriti - Gumbi za emodžije in časovne žige so prikazani - Skrij predogled komentarja - Predogled komentarja je skrit - Predogled komentarja je prikazan - Skrij gumb Hvala - Gumb \"Hvala\" je skrit - Gumb \"Hvala\" je prikazan - Skrij število ogledov - Število ogledov je skrito v viru in rezultatih iskanja - Število ogledov je prikazano v viru in rezultatih iskanja - - "Omejitve: + Skrij gumb Pridruži se + Gumb \"Pridruži se\" je skrit + Gumb \"Pridruži se\" je prikazan + Skrij medicinske plošče + Medicinske plošče so skrite + Medicinske plošče so prikazane + Skrij hitra dejanja + Hitra dejanja v celozaslonskem načinu so skrita + Hitra dejanja v celozaslonskem načinu so prikazana + Skrij povezane videoposnetke + Povezani videoposnetki v hitrih dejanjih so skriti + Povezani videoposnetki v hitrih dejanjih so prikazani + Skrij smernice za naročnike + Smernice skupnosti naročnikov so skrite + Smernice skupnosti naročnikov so prikazane + Skrij časovno usklajene reakcije + Časovno usklajene reakcije so skrite + Časovno usklajene reakcije so prikazane + Skrij »Povzetek videoposnetka, ustvarjenega z umetno inteligenco« + Razdelek z AI-generiranim povzetkom videa je skrit + Razdelek s povzetkom videoposnetka, ustvarjenim z umetno inteligenco, je prikazan + Skrij Vprašaj + Razdelek »Vprašaj« je skrit + Razdelek »Vprašaj« je prikazan + Skrij atribute + Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so skriti + Razdelki s priporočenimi kraji, igrami, glasbo in omenjenimi osebami so prikazani + Skrij poglavja + Oddelek s poglavji je skrit + Oddelek s poglavji je prikazan + Skrij »Kako je bila ta vsebina ustvarjena« + Razdelek »Kako je bila ta vsebina ustvarjena« je skrit + Razdelek »Kako je bila ta vsebina ustvarjena« je prikazan + Skrij točke Hype + Točke Hype so skrite + Točke Hype so prikazane + Skrij »Raziščite podcast« + Razdelek »Raziščite podcast« je skrit + Razdelek »Raziščite podcast« je prikazan + Skrij predstavljene povezave + Razdelek s poudarjenimi povezavami je skrit + Razdelek s poudarjenimi povezavami je prikazan + Skrij poudarjene videoposnetke + Razdelek s poudarjenimi videoposnetki je skrit + Razdelek s poudarjenimi videoposnetki je prikazan + Skrij kartice z informacijami + Oddelek s karticami z informacijami je skrit + Oddelek s karticami z informacijami je prikazan + Skrij »Ključni koncepti« + Razdelek »Ključni koncepti« je skrit + Razdelek »Ključni koncepti« je prikazan + Skrij gumb Naroči se + Gumb Naroči se je skrit + Gumb Naroči se je prikazan + Skrij prepis + Oddelek s prepisom je skrit + Oddelek s prepisom je prikazan + Opis videoposnetka + Skrij ali prikaži komponente opisa videoposnetka + Vrstica filtra + Skrij ali prikaži vrstico filtrov v virih, povezanih videih, rezultatih iskanja in zgodovini ogledov + Skrij v virih + Skrito v virih + Prikazano v virih + Skrij v povezanih videoposnetkih + Skrita v povezanih videoposnetkih + Prikazana v povezanih videoposnetkih + Skrij v rezultatih iskanja + Skrito v rezultatih iskanja + Prikazano v rezultatih iskanja + Skrij v zgodovini ogledov + Skrito v zgodovini ogledov + Prikazano v zgodovini ogledov + Stran kanala + Skrij ali prikaži komponente strani kanala + + Skrij gumb Skupnost + Gumb Skupnost je skrit + Gumb Skupnost je prikazan + + Skrij polico »Za vas« + Polica Za vas je skrita + Polica Za vas je prikazana + + Skrij gumb Pridruži se + Gumb Pridruži se je skrit + Gumb Pridruži se je prikazan + Skrij predogled povezav + Predogled povezav je skrit + Predogled povezav je prikazan + Skrij polico za člane + Polica za člane je skrita + Polica za člane je prikazana + + Skrij gumb Trgovina + Gumb Trgovina je skrit + Gumb Trgovina je prikazan + + Skrij gumb Naroči se + Gumb Naroči se je skrit + Gumb Naroči se je prikazan + Komentarji + Skrij ali prikaži komponente oddelka s komentarji + Skrij povzetek klepeta z AI + Povzetek klepeta z AI je skrit + Povzetek klepeta z AI je prikazan + Skrij povzetek komentarjev z umetno inteligenco + Povzetek komentarjev z AI je skrit + Povzetek komentarjev z AI je prikazan + Skrij smernice kanala + Smernice kanala so skrite + Smernice kanala so prikazane + Skrij naslov \"Komentarji članov\" + Glava s komentarji članov je skrita + Glava s komentarji članov je prikazana + Skrij oddelek s komentarji + Oddelek s komentarji je skrit + Oddelek s komentarji je prikazan + Skrij smernice skupnosti + Smernice skupnosti so skrite + Smernice skupnosti so prikazane + Skrij gumb \"Ustvari Shorts\" + Gumb »Ustvari Short« je skrit + Gumb »Ustvari Short« je prikazan + Skrij gumbe za emodžije in časovne žige + Gumbi za emodžije in časovne žige so skriti + Gumbi za emodžije in časovne žige so prikazani + Skrij predogled komentarja + Predogled komentarja je skrit + Predogled komentarja je prikazan + Skrij gumb Hvala + Gumb \"Hvala\" je skrit + Gumb \"Hvala\" je prikazan + Skrij število ogledov + Število ogledov je skrito v viru in rezultatih iskanja + Število ogledov je prikazano v viru in rezultatih iskanja + + "Omejitve: • Shorts police, strani kanalov in rezultati iskanja lahko še vedno prikazujejo število ogledov • Ta funkcija ne deluje z avtomobilskim oblikovnim faktorjem" - Skrij čas nalaganja - Čas nalaganja je skrit v viru in rezultatih iskanja - Čas nalaganja je prikazan v viru in rezultatih iskanja - - "Omejitve: + Skrij čas nalaganja + Čas nalaganja je skrit v viru in rezultatih iskanja + Čas nalaganja je prikazan v viru in rezultatih iskanja + + "Omejitve: • Police s prispevki Shorts, strani kanalov in rezultati iskanja lahko še vedno prikazujejo čase nalaganja • Ta funkcija ne deluje z avtomobilsko obliko" - Skrij vsebino s ključno besedo - Skrij videoposnetke v iskanju in viru s filtri ključnih besed - Skrij videoposnetke na domačem zaslonu s ključnimi besedami - Videoposnetki na zavihku doma so filtrirani s ključnimi besedami - Videoposnetki na zavihku doma niso filtrirani s ključnimi besedami - Skrij rezultate iskanja s ključnimi besedami - Rezultati iskanja so filtrirani s ključnimi besedami - Rezultati iskanja niso filtrirani s ključnimi besedami - Skrij videoposnetke naročnin s ključnimi besedami - Videoposnetki na zavihku naročnin so filtrirani s ključnimi besedami - Videoposnetki na zavihku naročnin niso filtrirani s ključnimi besedami - Ključne besede za skritje - - "Ključne besede in besedne zveze, ki jih je treba skriti, so ločene z novimi vrsticami + "Ključne besede in besedne zveze, ki jih je treba skriti, so ločene z novimi vrsticami Ključne besede so lahko imena kanalov ali katero koli besedilo, ki je prikazano v naslovih videoposnetkov Besede z velikimi začetnicami na sredini morajo biti vnesene z veliko začetnico (npr.: iPhone, TikTok, LeBlanc)" - O filtriranju ključnih besed - "Rezultati iskanja na domači strani/naročninah so filtrirani, da se skrije vsebina, ki se ujema s ključnimi besedami + O filtriranju ključnih besed + "Rezultati iskanja na domači strani/naročninah so filtrirani, da se skrije vsebina, ki se ujema s ključnimi besedami Omejitve • Kratkih videoposnetkov ni mogoče skriti po imenu kanala • Nekatere komponente uporabniškega vmesnika morda ne bodo skrite • Iskanje ključne besede morda ne bo prikazalo nobenih rezultatov" - Ujemanje celotnih besed - - Obkrožanje ključne besede/fraze z dvojnimi narekovaji prepreči delne ujemanja naslovov videoposnetkov in imen kanalov<br><br>Na primer,<br><b>\"ai\"</b> bo skril video: <b>Kako deluje AI?</b><br>vendar ne bo skril: <b>What does fair use mean?</b> - - Ključne besede ni mogoče uporabiti: %s - Dodajte narekovaje, da uporabite ključno besedo: %s - Ključna beseda ima nasprotujoče si deklaracije: %s - Ključna beseda je prekratka in zahteva narekovaje: %s - Ključna beseda bo skrila vse videoposnetke: %s - - - Skrij polico trgovine ustvarjalcev - Polica trgovine za ustvarjalce pod video predvajalnikom je skrita - Polica trgovine za ustvarjalce pod video predvajalnikom je prikazana - Skrij pasico trgovine na koncu zaslona - Pasica trgovine na končnem zaslonu je skrita - Pasica trgovine na končnem zaslonu je prikazana - Skrij oglase na celotnem zaslonu - "Oglasi na celotnem zaslonu so skriti + Ujemanje celotnih besed + + Obkrožanje ključne besede/fraze z dvojnimi narekovaji prepreči delne ujemanja naslovov videoposnetkov in imen kanalov<br><br>Na primer,<br><b>\"ai\"</b> bo skril video: <b>Kako deluje AI?</b><br>vendar ne bo skril: <b>What does fair use mean?</b> + + Ključne besede ni mogoče uporabiti: %s + Dodajte narekovaje, da uporabite ključno besedo: %s + Ključna beseda ima nasprotujoče si deklaracije: %s + Ključna beseda je prekratka in zahteva narekovaje: %s + Ključna beseda bo skrila vse videoposnetke: %s + + + Skrij polico trgovine ustvarjalcev + Polica trgovine za ustvarjalce pod video predvajalnikom je skrita + Polica trgovine za ustvarjalce pod video predvajalnikom je prikazana + Skrij pasico trgovine na koncu zaslona + Pasica trgovine na končnem zaslonu je skrita + Pasica trgovine na končnem zaslonu je prikazana + Skrij oglase na celotnem zaslonu + "Oglasi na celotnem zaslonu so skriti Ta funkcija je na voljo samo za starejše naprave" - Oglasi na celotnem zaslonu so prikazani - - Skrivanje oglasov na celotnem zaslonu deluje samo s starejšimi napravami. - Skrij splošne oglase - Splošni oglasi so skriti - Splošni oglasi so prikazani - Skrij pasice s trgovino - Pasice s trgovino so skrite - Pasice s trgovino so prikazane - Skrij nalepko plačane promocije - Nalepka plačane promocije je skrita - Nalepka plačane promocije je prikazana - Skrij samoproizvedene oglase - Samoproizvedeni oglasi so skriti - Samoproizvedeni oglasi so prikazani - Skrij nakupovalne povezave - Nakupovalne povezave v opisu videoposnetka so skrite - Nakupovalne povezave v opisu videoposnetka so prikazane - Skrij pasico \"Prikaži izdelke\" - Pasica \"Ogled izdelkov\" v video prekrivanju je skrita - Pasica \"Ogled izdelkov\" v video prekrivanju je prikazana - Skrij rezultate spletnega iskanja - Rezultati spletnega iskanja so skriti - Rezultati spletnega iskanja so prikazani - - - Skrij promocije YouTube Premium - Promocije YouTube Premium pod video predvajalnikom so skrite - Promocije YouTube Premium pod video predvajalnikom so prikazane - - - Skrij oglase v videoposnetkih - Oglasi v videoposnetkih so skriti - Oglasi v videoposnetkih so prikazani - - - URL je kopiran v odložišče - URL s časovnim žigom je kopiran - Pokaži gumb za kopiranje URL-ja videoposnetka - Prikazan je gumb Kopiraj URL videoposnetka. Dotaknite se za kopiranje URL-ja videoposnetka. Dotaknite se in držite za kopiranje s časovnim žigom - Gumb Kopiraj URL videoposnetka ni prikazan - Prikaži gumb za kopiranje URL-ja s časovnim žigom - Prikazan je gumb Kopiraj URL s časovnim žigom. Dotaknite se za kopiranje URL-ja videoposnetka s časovnim žigom. Dotaknite se in držite za kopiranje brez časovnega žiga - Gumb Kopiraj URL s časovnim žigom ni prikazan - - - Odstrani opozorilo za preudarno presojo gledalcev - Opozorilo bo odstranjeno - Opozorilo bo prikazano - To ne obide starostne omejitve. Samo samodejno jo sprejme. - - - Onemogoči pojavno okno \"Prijavite se v TV\" - Pojavno okno za prijavo v TV je onemogočeno - Pojavno okno za prijavo v TV je omogočeno - - - Onemogoči preskok poglavja z dvojnim dotikom - Dvojni dotik nikoli ne more sprožiti preskoka na naslednje/prejšnje poglavje - Dvojni dotik lahko občasno sproži preskok na naslednje/prejšnje poglavje - - - Zunanji prenosi - Nastavitve za uporabo zunanjega prenašalnika - Prikaži gumb za zunanji prenos - Gumb za prenos v predvajalniku je prikazan - Gumb za prenos v predvajalniku ni prikazan - - Preglasi gumb \'Prenesi\' - Gumb za prenos odpre vaš zunanji prenašalnik - Gumb za prenos odpre vgrajeni prenašalnik v aplikaciji - Ime paketa prenašalnika - Ime paketa vaše nameščene zunanje aplikacije za prenos - Vnesite ime paketa - Drugo - Aplikacija ni nameščena - %s ni nameščen. Prosimo, namestite ga. - "Ni bilo mogoče najti nameščene aplikacije z imenom paketa: %s + Oglasi na celotnem zaslonu so prikazani + + Skrivanje oglasov na celotnem zaslonu deluje samo s starejšimi napravami. + Skrij splošne oglase + Splošni oglasi so skriti + Splošni oglasi so prikazani + Skrij pasice s trgovino + Pasice s trgovino so skrite + Pasice s trgovino so prikazane + Skrij nalepko plačane promocije + Nalepka plačane promocije je skrita + Nalepka plačane promocije je prikazana + Skrij samoproizvedene oglase + Samoproizvedeni oglasi so skriti + Samoproizvedeni oglasi so prikazani + Skrij nakupovalne povezave + Nakupovalne povezave v opisu videoposnetka so skrite + Nakupovalne povezave v opisu videoposnetka so prikazane + Skrij pasico \"Prikaži izdelke\" + Pasica \"Ogled izdelkov\" v video prekrivanju je skrita + Pasica \"Ogled izdelkov\" v video prekrivanju je prikazana + Skrij rezultate spletnega iskanja + Rezultati spletnega iskanja so skriti + Rezultati spletnega iskanja so prikazani + + + Skrij promocije YouTube Premium + Promocije YouTube Premium pod video predvajalnikom so skrite + Promocije YouTube Premium pod video predvajalnikom so prikazane + + + Skrij oglase v videoposnetkih + Oglasi v videoposnetkih so skriti + Oglasi v videoposnetkih so prikazani + + + URL je kopiran v odložišče + URL s časovnim žigom je kopiran + Pokaži gumb za kopiranje URL-ja videoposnetka + Prikazan je gumb Kopiraj URL videoposnetka. Dotaknite se za kopiranje URL-ja videoposnetka. Dotaknite se in držite za kopiranje s časovnim žigom + Gumb Kopiraj URL videoposnetka ni prikazan + Prikaži gumb za kopiranje URL-ja s časovnim žigom + Prikazan je gumb Kopiraj URL s časovnim žigom. Dotaknite se za kopiranje URL-ja videoposnetka s časovnim žigom. Dotaknite se in držite za kopiranje brez časovnega žiga + Gumb Kopiraj URL s časovnim žigom ni prikazan + + + Odstrani opozorilo za preudarno presojo gledalcev + Opozorilo bo odstranjeno + Opozorilo bo prikazano + To ne obide starostne omejitve. Samo samodejno jo sprejme. + + + Onemogoči pojavno okno \"Prijavite se v TV\" + Pojavno okno za prijavo v TV je onemogočeno + Pojavno okno za prijavo v TV je omogočeno + + + Onemogoči preskok poglavja z dvojnim dotikom + Dvojni dotik nikoli ne more sprožiti preskoka na naslednje/prejšnje poglavje + Dvojni dotik lahko občasno sproži preskok na naslednje/prejšnje poglavje + + + Zunanji prenosi + Nastavitve za uporabo zunanjega prenašalnika + Prikaži gumb za zunanji prenos + Gumb za prenos v predvajalniku je prikazan + Gumb za prenos v predvajalniku ni prikazan + + Preglasi gumb \'Prenesi\' + Gumb za prenos odpre vaš zunanji prenašalnik + Gumb za prenos odpre vgrajeni prenašalnik v aplikaciji + Ime paketa prenašalnika + Ime paketa vaše nameščene zunanje aplikacije za prenos + Vnesite ime paketa + Drugo + Aplikacija ni nameščena + %s ni nameščen. Prosimo, namestite ga. + "Ni bilo mogoče najti nameščene aplikacije z imenom paketa: %s Preverite, ali je ime paketa pravilno in ali je aplikacija nameščena" - Ime paketa ne sme biti prazno - - - Onemogoči natančno kretnjo iskanja - Kretnja je onemogočena - Kretnja je omogočena - - - Omogoči dotik za iskanje - Dotik za iskanje je omogočen - Dotik za iskanje je onemogočen - - - Omogoči kretnjo za svetlost - "Potezanje za svetlost čez cel zaslon je omogočeno + Ime paketa ne sme biti prazno + + + Onemogoči natančno kretnjo iskanja + Kretnja je onemogočena + Kretnja je omogočena + + + Omogoči dotik za iskanje + Dotik za iskanje je omogočen + Dotik za iskanje je onemogočen + + + Omogoči kretnjo za svetlost + "Potezanje za svetlost čez cel zaslon je omogočeno Prilagodite svetlost s potezanjem navpično na levi strani zaslona" - Potezanje za svetlost čez cel zaslon je onemogočeno - Omogoči kretnjo za glasnost - "Poteg s prstom za celozaslonski nadzor glasnosti je omogočen + Potezanje za svetlost čez cel zaslon je onemogočeno + Omogoči kretnjo za glasnost + "Poteg s prstom za celozaslonski nadzor glasnosti je omogočen Prilagodite glasnost s potegom navpično na desni strani zaslona" - Poteg s prstom za celozaslonski nadzor glasnosti je onemogočen - Omogoči pritisk za potezno kretnjo - Pritisk za potezo je omogočen - Pritisk za potezo je onemogočen - Omogoči taktilno povratno informacijo - Taktilna povratna informacija je omogočena - Taktilna povratna informacija je onemogočena - Shrani in obnovi svetlost - Shrani in obnovi svetlost pri izhodu ali vstopu v celozaslonski način - Ne shranjuj in ne obnavljaj svetlosti pri izhodu ali vstopu v celozaslonski način - Omogoči samodejno svetlost z gretnjo - Pomikanje navzdol do najnižje vrednosti kretnje za svetlost omogoči samodejno svetlost - Pomikanje navzdol do najnižje vrednosti ne omogoči samodejne svetlosti - Samodejno - Časovni zamik prekrivanja pomikanja - Število milisekund, ko je prekrivanje vidno - Prosojnost prekrivanja poteze - Vrednost prosojnosti med 0 in 100 - Prosojnost drsenja mora biti med 0 in 100 - Barva svetlosti prekrivnega potega - Barva vrstice napredka za upravljanje svetlosti - Barva glasnosti prekrivnega potega - Barva vrstice napredka za upravljanje glasnosti - Velikost besedila prekrivnega drsenja - Velikost besedila za prekrivni sloj drsenja med 1 in 30 - Velikost besedila mora biti med 1 in 30 - Prazg prag za pomikanje - Vrednost praga za pomikanje - Občutljivost drsenja za glasnost - Koliko se spremeni glasnost na poteg - Slog prekrivnega elementa za poteg - Vodoravni prekrivni element - Vodoravni prekrivni element (minimalno – zgoraj) - Vodoravni prekrivni element (minimalno – sredina) - Krožni prekrivni element - Krožni prekrivni element (minimalno) - Navpični prekrivni element - Navpični prekrivni element (minimalno) - Omogoči menjavanje videoposnetkov z drsenjem - Drsenje v celozaslonskem načinu bo prešlo na naslednji/prejšnji videoposnetek. - Drsenje v celozaslonskem načinu ne bo prešlo na naslednji/prejšnji videoposnetek. - - - Onemogoči samodejne podnapise - Samodejni podnapisi so onemogočeni - Samodejni napisi so omogočeni - - - Gumbi za dejanja - Skrij ali prikaži gumbe pod videoposnetki - Onemogoči sijaj gumbov »Všeč mi je« in »Naroči se« - Gumba \"Všeč mi je\" in \"Naroči se\" ne bosta sijala, ko bosta omenjena - Gumba \"Všeč mi je\" in \"Naroči se\" bosta sijala, ko bosta omenjena - Skrij Všeč mi je in Ni mi všeč - Gumba Všeč mi je in Ni mi všeč sta skrita - Gumba Všeč mi je in Ni mi všeč sta prikazana - - Skrij Deli - Gumb Deli je skrit - Gumb Deli je prikazan - - Skrij Ustavi oglase - Gumb za zaustavitev oglasov je skrit - Gumb za zaustavitev oglasov je prikazan - - Skrij komentarje - Gumb za komentarje je skrit - Gumb za komentarje je prikazan - + Skrij Deli + Gumb Deli je skrit + Gumb Deli je prikazan + + Skrij Ustavi oglase + Gumb za zaustavitev oglasov je skrit + Gumb za zaustavitev oglasov je prikazan + + Skrij komentarje + Gumb za komentarje je skrit + Gumb za komentarje je prikazan + - Skrij Prijavi - Gumb Prijavi je skrit - Gumb Prijavi je prikazan - - Skrij Remix - Gumb Remix je skrit - Gumb Remix je prikazan - - Skrij Prenesi - Gumb Prenesi je skrit - Gumb Prenesi je prikazan - + Skrij Remix + Gumb Remix je skrit + Gumb Remix je prikazan + + Skrij Prenesi + Gumb Prenesi je skrit + Gumb Prenesi je prikazan + - Skrij Hype - Gumb Hype je skrit - Gumb Hype je prikazan - - Skrij Promocijo - Gumb za promocijo je skrit - Gumb za promocijo je prikazan - - Skrij Hvala - Gumb Hvala je skrit - Gumb Hvala je prikazan - + Skrij Promocijo + Gumb za promocijo je skrit + Gumb za promocijo je prikazan + + Skrij Hvala + Gumb Hvala je skrit + Gumb Hvala je prikazan + - Skrij Vprašaj - Gumb Vprašaj je skrit - Gumb Vprašaj je prikazan - - Skrij Izrezek - Gumb Izrezek je skrit - Gumb Izrezek je prikazan - - Skrij Trgovino - Gumb Trgovina je skrit - Gumb Trgovina je prikazan - - Skrij Shrani - Gumb Shrani je skrit - Gumb Shrani je prikazan - - - Navigacijski gumbi - Skrij ali spremeni gumbe v navigacijski vrstici - - Skrij Domov - Gumb Domov je skrit - Gumb Domov je prikazan - - Skrij Shorts - Gumb Shorts je skrit - Gumb Shorts je prikazan - - Skrij Ustvari - Gumb Ustvari je skrit - Gumb Ustvari je prikazan - - Skrij Naročnine - Gumb Naročnine je skrit - Gumb Naročnine je prikazan - Skrij obvestila - Gumb za obvestila je skrit - Gumb za obvestila je prikazan - - Zamenjaj Ustvari z Obvestili - "Gumb Ustvari je zamenjan z gumbom Obvestila + Skrij Vprašaj + Gumb Vprašaj je skrit + Gumb Vprašaj je prikazan + + Skrij Izrezek + Gumb Izrezek je skrit + Gumb Izrezek je prikazan + + Skrij Trgovino + Gumb Trgovina je skrit + Gumb Trgovina je prikazan + + Skrij Shrani + Gumb Shrani je skrit + Gumb Shrani je prikazan + + + Navigacijski gumbi + Skrij ali spremeni gumbe v navigacijski vrstici + + Skrij Domov + Gumb Domov je skrit + Gumb Domov je prikazan + + Skrij Shorts + Gumb Shorts je skrit + Gumb Shorts je prikazan + + Skrij Ustvari + Gumb Ustvari je skrit + Gumb Ustvari je prikazan + + Skrij Naročnine + Gumb Naročnine je skrit + Gumb Naročnine je prikazan + Skrij obvestila + Gumb za obvestila je skrit + Gumb za obvestila je prikazan + + Zamenjaj Ustvari z Obvestili + "Gumb Ustvari je zamenjan z gumbom Obvestila Opomba: Omogočanje tega tudi prisilno skrije video oglase" - Gumb \"Ustvari\" ni zamenjan z gumbom \"Obvestila\" - "Če onemogočite to nastavitev, boste onemogočili tudi blokiranje oglasov za Shorts. + Gumb \"Ustvari\" ni zamenjan z gumbom \"Obvestila\" + "Če onemogočite to nastavitev, boste onemogočili tudi blokiranje oglasov za Shorts. Če sprememba te nastavitve ne začne veljati, poskusite preklopiti v način brez beleženja zgodovine." - Skrij oznake gumbov za navigacijo - Oznake so skrite - Oznake so prikazane - Onemogoči prosojno statusno vrstico - Statusna vrstica je neprozorna - Statusna vrstica je neprozorna ali prosojna - Na nekaterih napravah lahko omogočitev te funkcije spremeni sistemsko navigacijsko vrstico v prozorno. - Onemogoči svetlo prosojno vrstico - Navigacijska vrstica v svetlem načinu je neprosojna - Navigacijska vrstica v svetlem načinu je neprozorna ali prosojna - Onemogoči temno prosojno vrstico - Navigacijska vrstica v temnem načinu je neprosojna - Navigacijska vrstica v temnem načinu je neprozorna ali prosojna - - - Izbirni meni - Skrij ali prikaži elemente izbirnega menija predvajalnika - - Skrij napise - Meni z napisi je skrit - Meni z napisi je prikazan - - Skrij dodatne nastavitve - Meni z dodatnimi nastavitvami je skrit - Meni z dodatnimi nastavitvami je prikazan - - Skrij časovnik spanja - Meni z časovnikom spanja je skrit - Meni z časovnikom spanja je prikazan - - Skrij zanko videa - Meni z zanko videa je skrit - Meni z zanko videa je prikazan - - Skrij način \"Ambient\" - Meni z načinom \"Ambient\" je skrit - Meni z načinom \"Ambient\" je prikazan - Skrij stabilno glasnost - Meni s stabilno glasnostjo je prikazan - Meni s stabilno glasnostjo je skrit - - Skrij pomoč & povratne informacije - Meni s pomočjo & povratnimi informacijami je skrit - Meni s pomočjo & povratnimi informacijami je prikazan - - Skrij hitrost predvajanja - Meni s hitrostjo predvajanja je skrit - Meni s hitrostjo predvajanja je prikazan - - Skrij zaklepanje zaslona - Meni z zaklepanjem zaslona je skrit - Meni z zaklepanjem zaslona je prikazan - - Skrij Poslušaj z YouTube Music - Meni Poslušaj z YouTube Music je skrit - Meni Poslušaj z YouTube Music je prikazan - - Skrij zvočni posnetek - Meni z zvočnim posnetkom je skrit - Meni z zvočnim posnetkom je prikazan - + Skrij napise + Meni z napisi je skrit + Meni z napisi je prikazan + + Skrij dodatne nastavitve + Meni z dodatnimi nastavitvami je skrit + Meni z dodatnimi nastavitvami je prikazan + + Skrij časovnik spanja + Meni z časovnikom spanja je skrit + Meni z časovnikom spanja je prikazan + + Skrij zanko videa + Meni z zanko videa je skrit + Meni z zanko videa je prikazan + + Skrij način \"Ambient\" + Meni z načinom \"Ambient\" je skrit + Meni z načinom \"Ambient\" je prikazan + Skrij stabilno glasnost + Meni s stabilno glasnostjo je prikazan + Meni s stabilno glasnostjo je skrit + + Skrij pomoč & povratne informacije + Meni s pomočjo & povratnimi informacijami je skrit + Meni s pomočjo & povratnimi informacijami je prikazan + + Skrij hitrost predvajanja + Meni s hitrostjo predvajanja je skrit + Meni s hitrostjo predvajanja je prikazan + + Skrij zaklepanje zaslona + Meni z zaklepanjem zaslona je skrit + Meni z zaklepanjem zaslona je prikazan + + Skrij Poslušaj z YouTube Music + Meni Poslušaj z YouTube Music je skrit + Meni Poslušaj z YouTube Music je prikazan + + Skrij zvočni posnetek + Meni z zvočnim posnetkom je skrit + Meni z zvočnim posnetkom je prikazan + - "Meni z zvočnimi posnetki je skrit + "Meni z zvočnimi posnetki je skrit Če želite prikazati meni zvočnih posnetkov, spremenite 'Lažno predstavljanje video tokov' v 'Android No SDK'" - - Skrij gledanje v VR - Meni z gledanjem v VR je skrit - Meni z gledanjem v VR je prikazan - Skrij meni kakovosti videa - Meni kakovosti videa je skrit - Meni kakovosti videa je prikazan - Skrij nogo menija s kakovostjo videa - Noga menija s kakovostjo videa je skrita - Noga menija s kakovostjo videa je prikazana - - - Skrij gumb \'Samodejno predvajanje\' - Gumb za samodejno predvajanje je skrit - Gumb za samodejno predvajanje je prikazan - - Skrij gumb \'Podnapisi\' - Gumb za napise je skrit - Gumb za napise je prikazan - Skrij gumb \'Predvajaj\' - Gumb za predvajanje je skrit - Gumb za predvajanje je prikazan - Skrij ozadje kontrolnikov predvajalnika - Ozadje nadzornih gumbov predvajalnika je skrito - Ozadje kontrolnikov predvajalnika je prikazano - Skrij gumbe »Prejšnji« & »Naslednji« - Gumbi so skriti - Gumbi so prikazani - - - Skrij kartice na končnem zaslonu - Kartice na končnem zaslonu so skrite - Kartice na končnem zaslonu so prikazane - - - Onemogoči ambientalni način v celozaslonskem prikazu - Način \"Ambient\" je onemogočen - Način \"Ambient\" je omogočen - - - Skrij kartice z informacijami - Kartice z informacijami so skrite - Kartice z informacijami so prikazane - - - Onemogoči animacije valjanja števil - Števila se ne animirajo - Števila se animirajo - - - Skrij iskalno vrstico predvajalnika videa - Iskalna vrstica v predvajalniku videoposnetkov je skrita - Iskalna vrstica v predvajalniku videoposnetkov je prikazana - - Skrij iskalno vrstico sličic videa - Iskalna vrstica sličic videa je skrita - Iskalna vrstica sličic videa je prikazana - - - Predvajalnik Shorts - Skrij ali prikaži komponente predvajalnika Shorts - - Skrij Shorts v domačem viru - Skrito v domačem viru in povezanih videoposnetkih - Prikazano v domačem viru in povezanih videoposnetkih - Skrij Shorts v rezultatih iskanja. - Skrito v rezultatih iskanja - Prikazano v rezultatih iskanja - - Skrij Shorts v viru naročnin - Skrito v viru naročnin - Prikazano v viru naročnin - Skrij kratke posnetke v zgodovini ogledov - Skrito v zgodovini ogledov - Prikazano v zgodovini ogledov - Skrij oznako \"Samodejno sinhronizirano\" - Oznaka samodejnega sinhroniziranja je skrita - Oznaka samodejnega sinhroniziranja je prikazana - Skrij gumb \"Kupi Super zahvale\" - Gumb \"Kupi Super zahvale\" je skrit - Gumb \"Kupi Super zahvale\" je prikazan - Skrij gumb učinka - Gumb za učinek je skrit - Gumb za učinek je prikazan - Skrij gumb \"Zeleni zaslon\" - Gumb za zeleno ozadje je skrit - Gumb za zeleno ozadje je prikazan - Skrij gumb za ključnik - Gumb za ključnik je skrit - Gumb za ključnik je prikazan - - Skrij gumb \'Pridruži se\' - Gumb za pridružitev je skrit. - Gumb \"Pridruži se\" je prikazan - Skrij predogled v živo - Predogled v živo je skrit - Predogled v živo je prikazan - Skrij oznako lokacije - Oznaka lokacije je skrita - Oznaka lokacije je prikazana - Skrij gumb \"Nove objave\" - Gumb za nove objave je skrit - Gumb za nove objave je prikazan - Skrij gumbe v prekinitvenem zaslonu - Gumbi v prekinitvenem zaslonu so skriti - Gumbi v prekinitvenem zaslonu so prikazani - Skrij predogled komentarja - Predogled komentarja je skrit - Predogled komentarja je prikazan - Skrij gumb \"Shrani glasbo\" - Gumb za shranjevanje glasbe je skrit - Gumb za shranjevanje glasbe je prikazan - Skrij predloge za iskanje - Predlogi za iskanje so skriti - Predlogi za iskanje so prikazani - Skrij gumb \'Trgovina\' - Gumb za trgovino je skrit - Gumb za trgovino je prikazan - Skrij nalepke - Nalepke so skrite - Nalepke so prikazane - Skrij gumb \'Naroči se\' - Gumb za naročnino je skrit - Gumb za naročnino je prikazan - Skrij označene izdelke - Označeni izdelki so skriti - Označeni izdelki so prikazani - Skrij gumb \'Prihajajoči\' - Gumb \"Prihajajoči\" je skrit - Gumb \"Prihajajoči\" je prikazan - Skrij gumb \"Uporabi ta zvok\" - Gumb Uporabi ta zvok je skrit - Gumb Uporabi ta zvok je prikazan - Skrij gumb \"Uporabi to predlogo\" - Gumb Uporabi to predlogo je skrit - Gumb Uporabi to predlogo je prikazan - Skrij animacijo fontane gumba \'Všeč mi je\' - Animacija fontane všečkov je skrita - Animacija fontane všečkov je prikazana - Skrij gumb \'Všeč mi je\' - Gumb všečkov je skrit - Gumb všečkov je prikazan - Skrij gumb \'Ne všeč mi je\' - Gumb všečkov ne je skrit - Gumb všečkov ne je prikazan - Skrij gumb \'Komentarji\' - Gumb za komentarje je skrit - Gumb za komentarje je prikazan - - Skrij gumb \'Deli\' - Gumb za deljenje je skrit - Gumb za deljenje je prikazan - - Skrij gumb \'Remix\' - Gumb za remix je skrit - Gumb za remix je prikazan - Skrij gumb za zvok - Gumb za zvok je skrit - Gumb za zvok je prikazan - Skrij informacijski del - Informacijski del je skrit - Informacijski del je prikazan - Skrij vrstico kanala - Vrstica kanala je skrita - Vrstica kanala je prikazana - Skrij naslov videoposnetka - Naslov videoposnetka je skrit - Naslov videoposnetka je prikazan - Skrij nalepko s podatki o zvoku - Oznaka zvočnih metapodatkov je skrita - Oznaka zvočnih metapodatkov je prikazana - Skrij oznako povezave do videoposnetka - Nalepka s povezavo do videoposnetka je skrita - Nalepka s povezavo do videoposnetka je prikazana - Skrij navigacijsko vrstico - Navigacijska vrstica je skrita - Navigacijska vrstica je prikazana - - - Skrij predlagani videoposnetek na koncu zaslona - "Predlagani videoposnetek na koncu zaslona je skrit, ko je samodejno predvajanje izklopljeno + + Skrij gledanje v VR + Meni z gledanjem v VR je skrit + Meni z gledanjem v VR je prikazan + Skrij meni kakovosti videa + Meni kakovosti videa je skrit + Meni kakovosti videa je prikazan + Skrij nogo menija s kakovostjo videa + Noga menija s kakovostjo videa je skrita + Noga menija s kakovostjo videa je prikazana + + + Skrij gumb \'Samodejno predvajanje\' + Gumb za samodejno predvajanje je skrit + Gumb za samodejno predvajanje je prikazan + + Skrij gumb \'Podnapisi\' + Gumb za napise je skrit + Gumb za napise je prikazan + Skrij gumb \'Predvajaj\' + Gumb za predvajanje je skrit + Gumb za predvajanje je prikazan + Skrij ozadje kontrolnikov predvajalnika + Ozadje nadzornih gumbov predvajalnika je skrito + Ozadje kontrolnikov predvajalnika je prikazano + Skrij gumbe »Prejšnji« & »Naslednji« + Gumbi so skriti + Gumbi so prikazani + + + Skrij kartice na končnem zaslonu + Kartice na končnem zaslonu so skrite + Kartice na končnem zaslonu so prikazane + + + Onemogoči ambientalni način v celozaslonskem prikazu + Način \"Ambient\" je onemogočen + Način \"Ambient\" je omogočen + + + Skrij kartice z informacijami + Kartice z informacijami so skrite + Kartice z informacijami so prikazane + + + Onemogoči animacije valjanja števil + Števila se ne animirajo + Števila se animirajo + + + Skrij iskalno vrstico predvajalnika videa + Iskalna vrstica v predvajalniku videoposnetkov je skrita + Iskalna vrstica v predvajalniku videoposnetkov je prikazana + + Skrij iskalno vrstico sličic videa + Iskalna vrstica sličic videa je skrita + Iskalna vrstica sličic videa je prikazana + + + Predvajalnik Shorts + Skrij ali prikaži komponente predvajalnika Shorts + + Skrij Shorts v domačem viru + Skrito v domačem viru in povezanih videoposnetkih + Prikazano v domačem viru in povezanih videoposnetkih + Skrij Shorts v rezultatih iskanja. + Skrito v rezultatih iskanja + Prikazano v rezultatih iskanja + + Skrij Shorts v viru naročnin + Skrito v viru naročnin + Prikazano v viru naročnin + Skrij kratke posnetke v zgodovini ogledov + Skrito v zgodovini ogledov + Prikazano v zgodovini ogledov + Skrij oznako \"Samodejno sinhronizirano\" + Oznaka samodejnega sinhroniziranja je skrita + Oznaka samodejnega sinhroniziranja je prikazana + Skrij gumb \"Kupi Super zahvale\" + Gumb \"Kupi Super zahvale\" je skrit + Gumb \"Kupi Super zahvale\" je prikazan + Skrij gumb učinka + Gumb za učinek je skrit + Gumb za učinek je prikazan + Skrij gumb \"Zeleni zaslon\" + Gumb za zeleno ozadje je skrit + Gumb za zeleno ozadje je prikazan + Skrij gumb za ključnik + Gumb za ključnik je skrit + Gumb za ključnik je prikazan + + Skrij gumb \'Pridruži se\' + Gumb za pridružitev je skrit. + Gumb \"Pridruži se\" je prikazan + Skrij predogled v živo + Predogled v živo je skrit + Predogled v živo je prikazan + Skrij oznako lokacije + Oznaka lokacije je skrita + Oznaka lokacije je prikazana + Skrij gumb \"Nove objave\" + Gumb za nove objave je skrit + Gumb za nove objave je prikazan + Skrij gumbe v prekinitvenem zaslonu + Gumbi v prekinitvenem zaslonu so skriti + Gumbi v prekinitvenem zaslonu so prikazani + Skrij predogled komentarja + Predogled komentarja je skrit + Predogled komentarja je prikazan + Skrij gumb \"Shrani glasbo\" + Gumb za shranjevanje glasbe je skrit + Gumb za shranjevanje glasbe je prikazan + Skrij predloge za iskanje + Predlogi za iskanje so skriti + Predlogi za iskanje so prikazani + Skrij gumb \'Trgovina\' + Gumb za trgovino je skrit + Gumb za trgovino je prikazan + Skrij nalepke + Nalepke so skrite + Nalepke so prikazane + Skrij gumb \'Naroči se\' + Gumb za naročnino je skrit + Gumb za naročnino je prikazan + Skrij označene izdelke + Označeni izdelki so skriti + Označeni izdelki so prikazani + Skrij gumb \'Prihajajoči\' + Gumb \"Prihajajoči\" je skrit + Gumb \"Prihajajoči\" je prikazan + Skrij gumb \"Uporabi ta zvok\" + Gumb Uporabi ta zvok je skrit + Gumb Uporabi ta zvok je prikazan + Skrij gumb \"Uporabi to predlogo\" + Gumb Uporabi to predlogo je skrit + Gumb Uporabi to predlogo je prikazan + Skrij animacijo fontane gumba \'Všeč mi je\' + Animacija fontane všečkov je skrita + Animacija fontane všečkov je prikazana + Skrij gumb \'Všeč mi je\' + Gumb všečkov je skrit + Gumb všečkov je prikazan + Skrij gumb \'Ne všeč mi je\' + Gumb všečkov ne je skrit + Gumb všečkov ne je prikazan + Skrij gumb \'Komentarji\' + Gumb za komentarje je skrit + Gumb za komentarje je prikazan + + Skrij gumb \'Deli\' + Gumb za deljenje je skrit + Gumb za deljenje je prikazan + + Skrij gumb \'Remix\' + Gumb za remix je skrit + Gumb za remix je prikazan + Skrij gumb za zvok + Gumb za zvok je skrit + Gumb za zvok je prikazan + Skrij informacijski del + Informacijski del je skrit + Informacijski del je prikazan + Skrij vrstico kanala + Vrstica kanala je skrita + Vrstica kanala je prikazana + Skrij naslov videoposnetka + Naslov videoposnetka je skrit + Naslov videoposnetka je prikazan + Skrij nalepko s podatki o zvoku + Oznaka zvočnih metapodatkov je skrita + Oznaka zvočnih metapodatkov je prikazana + Skrij oznako povezave do videoposnetka + Nalepka s povezavo do videoposnetka je skrita + Nalepka s povezavo do videoposnetka je prikazana + Skrij navigacijsko vrstico + Navigacijska vrstica je skrita + Navigacijska vrstica je prikazana + + + Skrij predlagani videoposnetek na koncu zaslona + "Predlagani videoposnetek na koncu zaslona je skrit, ko je samodejno predvajanje izklopljeno Samodejno predvajanje lahko spremenite v nastavitvah YouTube: Nastavitve → Predvajanje → Samodejno predvajanje naslednjega videoposnetka" - Predlagani videoposnetek na koncu zaslona je prikazan - - - Skrij prekrivanje povezanih videoposnetkov - Prekrivanje povezanih videoposnetkov v celozaslonskem načinu je skrito - Prekrivanje povezanih videoposnetkov v celozaslonskem načinu je prikazano - - - Skrij časovni žig videoposnetka - Časovni žig je skrit - Časovni žig je prikazan - - - Skrij pojavna okna predvajalnika - Pojavna okna predvajalnika so skrita - Pojavna okna predvajalnika so prikazana - - - Zapusti način celotnega zaslona ob koncu videoposnetka - Onemogočeno - Portret - Ležeće - Portret in ležeće - - - Odpri videoposnetke v celozaslonskem načinu v portretni orientaciji - Videoposnetki se odprejo v celozaslonskem načinu - Videoposnetki se ne odprejo v celozaslonskem načinu - - - Prosojnost prekrivanja predvajalnika - Vrednost prosojnosti med 0-100, kjer je 0 prosojno - Prosojnost prekrivanja predvajalnika mora biti med 0-100 - - - - Všečkov ne je začasno nedostopno (API je časovno omejen) - Všečkov ne je na voljo (status %d) - Všečkov ni na voljo (omejitev API-ja za odjemalca) - Všečkov ne je na voljo (%s) - - Znova naloži videoposnetek, da glasuješ z Return YouTube Dislike - - Skrito s strani lastnika - Všečkov ne so prikazani - Všečkov ne niso prikazani - Pokaži všečkov ne na Shorts - "Število »Ni mi všeč« pri elementih Shorts je prikazano + Predlagani videoposnetek na koncu zaslona je prikazan + + + Skrij prekrivanje povezanih videoposnetkov + Prekrivanje povezanih videoposnetkov v celozaslonskem načinu je skrito + Prekrivanje povezanih videoposnetkov v celozaslonskem načinu je prikazano + + + Skrij časovni žig videoposnetka + Časovni žig je skrit + Časovni žig je prikazan + + + Skrij pojavna okna predvajalnika + Pojavna okna predvajalnika so skrita + Pojavna okna predvajalnika so prikazana + + + Zapusti način celotnega zaslona ob koncu videoposnetka + Onemogočeno + Portret + Ležeće + Portret in ležeće + + + Odpri videoposnetke v celozaslonskem načinu v portretni orientaciji + Videoposnetki se odprejo v celozaslonskem načinu + Videoposnetki se ne odprejo v celozaslonskem načinu + + + Prosojnost prekrivanja predvajalnika + Vrednost prosojnosti med 0-100, kjer je 0 prosojno + Prosojnost prekrivanja predvajalnika mora biti med 0-100 + + + + Všečkov ne je začasno nedostopno (API je časovno omejen) + Všečkov ne je na voljo (status %d) + Všečkov ni na voljo (omejitev API-ja za odjemalca) + Všečkov ne je na voljo (%s) + + Znova naloži videoposnetek, da glasuješ z Return YouTube Dislike + + Skrito s strani lastnika + Všečkov ne so prikazani + Všečkov ne niso prikazani + Pokaži všečkov ne na Shorts + "Število »Ni mi všeč« pri elementih Shorts je prikazano Omejitev: Število »Ni mi všeč« se morda ne bo prikazalo v načinu brez beleženja zgodovine" - Število »Ni mi všeč« pri elementih Shorts ni prikazano - Všečkov ne kot odstotek - Število »Ni mi všeč« je prikazano kot odstotek - Število »Ni mi všeč« je prikazano kot številka - - Kompaktni gumb \'Všeč mi je\' - Gumb všečkov je oblikovan za minimalno širino - Gumb všečkov je oblikovan za najboljši videz - Pokaži ocenjeno število »všečkov« - Videoposnetki z onemogočenimi všečki prikazujejo ocenjeno število všečkov - Ocenjeni všečki niso prikazani - Pokaži obvestilo, če API ni na voljo - Obvestilo se prikaže, če Return YouTube Dislike ni na voljo - Obvestilo se ne prikaže, če Return YouTube Dislike ni na voljo - Podatki so zagotovljeni s strani API-ja Return YouTube Dislike. Tapnite tukaj, če želite izvedeti več - - Statistika API-ja ReturnYouTubeDislike za to napravo - Povprečni čas odziva API-ja - Minimalni čas odziva API-ja - Čas odziva API-ja, največji - Čas odziva API-ja, zadnji video - Neljubi so začasno nedostopni - Velja omejitev stopnje API-ja za klienta - API pobira glasove, število klicev - Ni bilo izvedenih omrežnih klicev - %d omrežnih klicev je bilo izvedenih - API pobira glasove, število časovnih omejitev - Ni bilo nobenih omrežnih klicev s časovno omejitvijo - %d omrežnih klicev je bilo s časovno omejitvijo - Omejitve stopnje API-ja za klienta - Ni bilo naletov na omejitve stopnje za klienta - Na omejitev stopnje za klienta je bilo naletov %d-krat - %d milisekund - - - Omogoči široko iskalno vrstico - Široka iskalna vrstica je omogočena - Široka iskalna vrstica je onemogočena - - - Omogoči sličice visoke kakovosti - Sličice za iskanje so visoke kakovosti - Sličice za iskanje so srednje kakovosti - "To bo obnovilo tudi sličice v živo prenosu, ki nimajo sličic s časovnico. + Število »Ni mi všeč« pri elementih Shorts ni prikazano + Všečkov ne kot odstotek + Število »Ni mi všeč« je prikazano kot odstotek + Število »Ni mi všeč« je prikazano kot številka + + Kompaktni gumb \'Všeč mi je\' + Gumb všečkov je oblikovan za minimalno širino + Gumb všečkov je oblikovan za najboljši videz + Pokaži ocenjeno število »všečkov« + Videoposnetki z onemogočenimi všečki prikazujejo ocenjeno število všečkov + Ocenjeni všečki niso prikazani + Pokaži obvestilo, če API ni na voljo + Obvestilo se prikaže, če Return YouTube Dislike ni na voljo + Obvestilo se ne prikaže, če Return YouTube Dislike ni na voljo + Podatki so zagotovljeni s strani API-ja Return YouTube Dislike. Tapnite tukaj, če želite izvedeti več + + Statistika API-ja ReturnYouTubeDislike za to napravo + Povprečni čas odziva API-ja + Minimalni čas odziva API-ja + Čas odziva API-ja, največji + Čas odziva API-ja, zadnji video + Neljubi so začasno nedostopni - Velja omejitev stopnje API-ja za klienta + API pobira glasove, število klicev + Ni bilo izvedenih omrežnih klicev + %d omrežnih klicev je bilo izvedenih + API pobira glasove, število časovnih omejitev + Ni bilo nobenih omrežnih klicev s časovno omejitvijo + %d omrežnih klicev je bilo s časovno omejitvijo + Omejitve stopnje API-ja za klienta + Ni bilo naletov na omejitve stopnje za klienta + Na omejitev stopnje za klienta je bilo naletov %d-krat + %d milisekund + + + Omogoči široko iskalno vrstico + Široka iskalna vrstica je omogočena + Široka iskalna vrstica je onemogočena + + + Omogoči sličice visoke kakovosti + Sličice za iskanje so visoke kakovosti + Sličice za iskanje so srednje kakovosti + "To bo obnovilo tudi sličice v živo prenosu, ki nimajo sličic s časovnico. Sličice s časovnico bodo uporabljale isto kakovost kot trenutni videoposnetek. Ta funkcija deluje najbolje pri kakovosti videa 720p ali nižji in pri uporabi zelo hitre internetne povezave." - Obnovi stare sličice za iskanje - Sličice za iskanje se bodo prikazale nad iskalno vrstico - Sličice za iskanje se bodo prikazale v celozaslonskem načinu - - - Omogoči SponsorBlock - SponsorBlock je sistem množičnega urejanja za preskakovanje motečih delov videoposnetkov YouTube - Videz - Pokaži gumb za glasovanje - Gumb za glasovanje segmentov je prikazan - Gumb za glasovanje segmentov ni prikazan - Uporabi kvadratno postavitev - Gumbi in kontrolniki so kvadratni - Gumbi in kontrolniki so zaobljeni - - Uporabi kompakten gumb za preskok - Gumb za preskakovanje, oblikovan za minimalno širino - Gumb za preskakovanje, oblikovan za najboljši videz - Samodejno skrij gumb za preskok - Gumb za preskakovanje se po nekaj sekundah skrije - Gumb za preskok je prikazan za celoten segment - Trajanje gumba za preskok - Kako dolgo prikazovati gumbe za preskok in preskok do označevalca, preden se samodejno skrijejo - Prikaži obvestilo za razveljavitev preskakovanja - Obvestilo se prikaže, ko je segment samodejno preskočen. Dotaknite se obvestila, da razveljavite preskok - Obvestilo ni prikazano - Trajanje obvestila o preskoku - Kako dolgo prikazovati obvestilo o razveljavitvi preskoka - 1 sekunda - 2 sekundi - 3 sekunde - 4 sekunde - 5 sekund - 6 sekund - 7 sekund - 8 sekund - 9 sekund - 10 sekund - Pokaži dolžino videoposnetka brez segmentov - Dolžina videa brez vseh segmentov je prikazana na drsniku - Prikazana je polna dolžina videoposnetka - Ustvarjanje novih segmentov - Pokaži gumb za ustvarjanje novega segmenta - Gumb za ustvarjanje novega segmenta je prikazan - Gumb za ustvarjanje novega segmenta ni prikazan - Prilagodi korak novega segmenta - Število milisekund, ki jih gumbi za prilagajanje časa premaknejo pri ustvarjanju novih segmentov - Vrednost mora biti pozitivno število - Oglejte si smernice - Smernice vsebujejo pravila in nasvete za ustvarjanje novih segmentov - Upoštevajte smernice - Pred ustvarjanjem novih segmentov preberite smernice SponsorBlock - Že sem prebral - Pokaži mi - Splošno - Pokaži sporočilo, če API ni na voljo - Sporočilo se prikaže, če SponsorBlock ni na voljo - Sporočilo se ne prikaže, če SponsorBlock ni na voljo - Omogoči sledenje števila preskokov - Pove lestvici SponsorBlock, koliko časa je shranjenega. Sporočilo se pošlje na lestvico vsakič, ko se segment preskoči - Sledenje števila preskokov ni omogočeno - Minimalna trajanje segmenta - Segmenti, ki so krajši od te vrednosti (v sekundah), se ne bodo prikazali ali preskočili - Neveljavno trajanje časa - Vaša zasebna uporabniška ID - To bi moralo ostati zasebno. To je kot geslo in ga ne smete deliti z nikomer. Če jo ima nekdo, se lahko pretvarja, da ste vi - Zasebna uporabniška ID mora biti vsaj 30 znakov dolga. - Spremeni URL API-ja - Naslov, ki ga SponsorBlock uporablja za klice na strežnik - URL API-ja ponastavljen - URL API-ja ni veljaven - URL API-ja spremenjen - Uvozi/Izvozi nastavitve - Kopiraj - Vaša konfiguracija SponsorBlock JSON, ki jo je mogoče uvoziti/izvoziti v ReVanced in druge platforme SponsorBlock - Vaša konfiguracija SponsorBlock JSON, ki jo je mogoče uvoziti/izvoziti v ReVanced in druge platforme SponsorBlock. To vključuje vašo zasebno uporabniško ID. Bodite previdni pri deljenju - Nastavitve uspešno uvožene - Uvoz ni uspel: %s - Izvoz ni uspel: %s - "Vaše nastavitve vsebujejo zasebni uporabniški ID SponsorBlock. + Obnovi stare sličice za iskanje + Sličice za iskanje se bodo prikazale nad iskalno vrstico + Sličice za iskanje se bodo prikazale v celozaslonskem načinu + + + Omogoči SponsorBlock + SponsorBlock je sistem množičnega urejanja za preskakovanje motečih delov videoposnetkov YouTube + Videz + Pokaži gumb za glasovanje + Gumb za glasovanje segmentov je prikazan + Gumb za glasovanje segmentov ni prikazan + Uporabi kvadratno postavitev + Gumbi in kontrolniki so kvadratni + Gumbi in kontrolniki so zaobljeni + + Uporabi kompakten gumb za preskok + Gumb za preskakovanje, oblikovan za minimalno širino + Gumb za preskakovanje, oblikovan za najboljši videz + Samodejno skrij gumb za preskok + Gumb za preskakovanje se po nekaj sekundah skrije + Gumb za preskok je prikazan za celoten segment + Trajanje gumba za preskok + Kako dolgo prikazovati gumbe za preskok in preskok do označevalca, preden se samodejno skrijejo + Prikaži obvestilo za razveljavitev preskakovanja + Obvestilo se prikaže, ko je segment samodejno preskočen. Dotaknite se obvestila, da razveljavite preskok + Obvestilo ni prikazano + Trajanje obvestila o preskoku + Kako dolgo prikazovati obvestilo o razveljavitvi preskoka + 1 sekunda + 2 sekundi + 3 sekunde + 4 sekunde + 5 sekund + 6 sekund + 7 sekund + 8 sekund + 9 sekund + 10 sekund + Pokaži dolžino videoposnetka brez segmentov + Dolžina videa brez vseh segmentov je prikazana na drsniku + Prikazana je polna dolžina videoposnetka + Ustvarjanje novih segmentov + Pokaži gumb za ustvarjanje novega segmenta + Gumb za ustvarjanje novega segmenta je prikazan + Gumb za ustvarjanje novega segmenta ni prikazan + Prilagodi korak novega segmenta + Število milisekund, ki jih gumbi za prilagajanje časa premaknejo pri ustvarjanju novih segmentov + Vrednost mora biti pozitivno število + Oglejte si smernice + Smernice vsebujejo pravila in nasvete za ustvarjanje novih segmentov + Upoštevajte smernice + Pred ustvarjanjem novih segmentov preberite smernice SponsorBlock + Že sem prebral + Pokaži mi + Splošno + Pokaži sporočilo, če API ni na voljo + Sporočilo se prikaže, če SponsorBlock ni na voljo + Sporočilo se ne prikaže, če SponsorBlock ni na voljo + Omogoči sledenje števila preskokov + Pove lestvici SponsorBlock, koliko časa je shranjenega. Sporočilo se pošlje na lestvico vsakič, ko se segment preskoči + Sledenje števila preskokov ni omogočeno + Minimalna trajanje segmenta + Segmenti, ki so krajši od te vrednosti (v sekundah), se ne bodo prikazali ali preskočili + Neveljavno trajanje časa + Vaša zasebna uporabniška ID + To bi moralo ostati zasebno. To je kot geslo in ga ne smete deliti z nikomer. Če jo ima nekdo, se lahko pretvarja, da ste vi + Zasebna uporabniška ID mora biti vsaj 30 znakov dolga. + Spremeni URL API-ja + Naslov, ki ga SponsorBlock uporablja za klice na strežnik + URL API-ja ponastavljen + URL API-ja ni veljaven + URL API-ja spremenjen + Uvozi/Izvozi nastavitve + Kopiraj + Vaša konfiguracija SponsorBlock JSON, ki jo je mogoče uvoziti/izvoziti v ReVanced in druge platforme SponsorBlock + Vaša konfiguracija SponsorBlock JSON, ki jo je mogoče uvoziti/izvoziti v ReVanced in druge platforme SponsorBlock. To vključuje vašo zasebno uporabniško ID. Bodite previdni pri deljenju + Nastavitve uspešno uvožene + Uvoz ni uspel: %s + Izvoz ni uspel: %s + "Vaše nastavitve vsebujejo zasebni uporabniški ID SponsorBlock. Uporabniški ID je, kot je geslo, zato ga nikoli ne delite." - Ne prikazuj več - Spremeni vedenje segmenta - Sponzor - Plačana promocija, plačane napotitve in neposredna oglaševanja. Ni za samopromocijo ali brezplačne pozdrave vzrokom/ustvarjalcem/spletnim mestom/izdelkom, ki jih imajo radi - Neplačana/Samopromocija - Podobno kot Sponsor, vendar za neplačano ali samopromocijo. Vključuje razdelke o blagu, donacijah ali informacijah o tem, s kom so sodelovali - Opomnik na interakcijo (Naroči se) - Kratek opomnik, naj jim všečkajo, se naročijo ali jih spremljajo sredi vsebine. Če je dolg ali o nečem posebnem, naj bo namesto tega pod samopromocijo - Oznaka - Del videoposnetka, ki ga večina ljudi išče - Premor/Uvodna animacija - Interval brez dejanske vsebine. Lahko je pavza, statični okvir ali ponavljajoča se animacija. Ne vključuje prehodov, ki vsebujejo informacije - Zaključne kartice / Dobropisi - Zasluge ali prikaz zaključnih kartic YouTuba. Ni namenjeno zaključkom z informacijami - Uvod / Pozdravi - Pripovedani napovedniki za prihajajoči video, pozdravi in poslavljanja. Ne vključuje odsekov, ki dodajajo dodatno vsebino - Predogled / Povzetek - Zbirka odsekov, ki prikazujejo, kaj prihaja ali kaj se je zgodilo v videoposnetku ali v drugih videoposnetkih serije, kjer so vse informacije ponovljene drugje - Digresija / Šale - Povezane scene ali šale, ki niso potrebne za razumevanje glavne vsebine videa. Ne vključuje odsekov, ki zagotavljajo kontekst ali podrobnosti ozadja - Glasba: Odsek brez glasbe - Samo za uporabo v glasbenih videoposnetkih. Odseki glasbenih videoposnetkov brez glasbe, ki jih še niso zajeli drugi kategoriji - Preskoči - Označi - Preskoči sponzorja - Preskoči promocijo - Preskoči interakcijo - Preskoči do oznake - Preskoči uvod - Preskoči premor - Preskoči premor - Preskoči zaključek - Preskoči uvod - Preskoči predogled - Preskoči predogled - Preskoči povzetek - Preskoči tangento - Preskoči brez glasbe - Preskoči segment - Preskočen sponzor - Preskočena lastna promocija - Preskočen nadležni opomnik - Preskočeno do oznake - Preskočen uvod - Preskočen premor - Preskočen premor - Preskočen zaključek - Uvod preskočen - Preskočen predogled - Preskočen predogled - Preskočen povzetek - Tangenta preskočena - Preskočen odsek brez glasbe - Preskočen neoddani segment - Preskočenih več segmentov - Samodejno preskoči - Samodejno preskoči enkrat - Pokaži gumb za preskok - Pokaži v iskalni vrstici - Onemogoči - Segmenta ni mogoče oddati: %s - SponsorBlock je začasno nedostopen - Segmenta ni mogoče oddati (stanje: %1$d %2$s) - Segmenta ni mogoče poslati. Hitrostno omejeno (preveč z istega uporabnika ali IP-ja) - Segmenta ni mogoče oddati: %s - "Segmenta ni mogoče poslati. + Ne prikazuj več + Spremeni vedenje segmenta + Sponzor + Plačana promocija, plačane napotitve in neposredna oglaševanja. Ni za samopromocijo ali brezplačne pozdrave vzrokom/ustvarjalcem/spletnim mestom/izdelkom, ki jih imajo radi + Neplačana/Samopromocija + Podobno kot Sponsor, vendar za neplačano ali samopromocijo. Vključuje razdelke o blagu, donacijah ali informacijah o tem, s kom so sodelovali + Opomnik na interakcijo (Naroči se) + Kratek opomnik, naj jim všečkajo, se naročijo ali jih spremljajo sredi vsebine. Če je dolg ali o nečem posebnem, naj bo namesto tega pod samopromocijo + Oznaka + Del videoposnetka, ki ga večina ljudi išče + Premor/Uvodna animacija + Interval brez dejanske vsebine. Lahko je pavza, statični okvir ali ponavljajoča se animacija. Ne vključuje prehodov, ki vsebujejo informacije + Zaključne kartice / Dobropisi + Zasluge ali prikaz zaključnih kartic YouTuba. Ni namenjeno zaključkom z informacijami + Uvod / Pozdravi + Pripovedani napovedniki za prihajajoči video, pozdravi in poslavljanja. Ne vključuje odsekov, ki dodajajo dodatno vsebino + Predogled / Povzetek + Zbirka odsekov, ki prikazujejo, kaj prihaja ali kaj se je zgodilo v videoposnetku ali v drugih videoposnetkih serije, kjer so vse informacije ponovljene drugje + Digresija / Šale + Povezane scene ali šale, ki niso potrebne za razumevanje glavne vsebine videa. Ne vključuje odsekov, ki zagotavljajo kontekst ali podrobnosti ozadja + Glasba: Odsek brez glasbe + Samo za uporabo v glasbenih videoposnetkih. Odseki glasbenih videoposnetkov brez glasbe, ki jih še niso zajeli drugi kategoriji + Preskoči + Označi + Preskoči sponzorja + Preskoči promocijo + Preskoči interakcijo + Preskoči do oznake + Preskoči uvod + Preskoči premor + Preskoči premor + Preskoči zaključek + Preskoči uvod + Preskoči predogled + Preskoči predogled + Preskoči povzetek + Preskoči tangento + Preskoči brez glasbe + Preskoči segment + Preskočen sponzor + Preskočena lastna promocija + Preskočen nadležni opomnik + Preskočeno do oznake + Preskočen uvod + Preskočen premor + Preskočen premor + Preskočen zaključek + Uvod preskočen + Preskočen predogled + Preskočen predogled + Preskočen povzetek + Tangenta preskočena + Preskočen odsek brez glasbe + Preskočen neoddani segment + Preskočenih več segmentov + Samodejno preskoči + Samodejno preskoči enkrat + Pokaži gumb za preskok + Pokaži v iskalni vrstici + Onemogoči + Segmenta ni mogoče oddati: %s + SponsorBlock je začasno nedostopen + Segmenta ni mogoče oddati (stanje: %1$d %2$s) + Segmenta ni mogoče poslati. Hitrostno omejeno (preveč z istega uporabnika ali IP-ja) + Segmenta ni mogoče oddati: %s + "Segmenta ni mogoče poslati. Že obstaja" - Segment je bil uspešno oddan - - SponsorBlock je začasno nedostopen (API je potekel) - SponsorBlock je začasno nedostopen (stanje %d) - SponsorBlock je začasno nedostopen - Za segment ni mogoče glasovati (API je potekel) - Za segment ni mogoče glasovati (stanje: %1$d %2$s) - Za segment ni mogoče glasovati: %s - Glasuj navzgor - Glasuj navzdol - Spremeni kategorijo - Za glasovanje ni nobenih segmentov - - %1$s do %2$s - Izberi kategorijo segmenta - Kategorija je v nastavitvah onemogočena. Omogoči kategorijo, da lahko oddaš. - Nov segment SponsorBlocka - Nastavi %s kot začetek ali konec novega segmenta? - Začetek - Konec - Zdaj - Čas, ko se segment začne - Čas, ko se segment konča - So časi pravilni? - "Segment je iz + Segment je bil uspešno oddan + + SponsorBlock je začasno nedostopen (API je potekel) + SponsorBlock je začasno nedostopen (stanje %d) + SponsorBlock je začasno nedostopen + Za segment ni mogoče glasovati (API je potekel) + Za segment ni mogoče glasovati (stanje: %1$d %2$s) + Za segment ni mogoče glasovati: %s + Glasuj navzgor + Glasuj navzdol + Spremeni kategorijo + Za glasovanje ni nobenih segmentov + + %1$s do %2$s + Izberi kategorijo segmenta + Kategorija je v nastavitvah onemogočena. Omogoči kategorijo, da lahko oddaš. + Nov segment SponsorBlocka + Nastavi %s kot začetek ali konec novega segmenta? + Začetek + Konec + Zdaj + Čas, ko se segment začne + Čas, ko se segment konča + So časi pravilni? + "Segment je iz %1$s znotraj @@ -1280,46 +1279,46 @@ znotraj (%3$s) Ali ste pripravljeni na oddajo?" - Začetek mora biti pred koncem - Najprej označi dve točki na časovnem pasu - Predoglej segment - Ročno uredi časovni zamik segmenta - Želiš urediti časovni zamik za začetek ali konec segmenta? - Vnesen je neveljaven čas - Statistika - - Statistika začasno ni na voljo (API ne deluje) - Nalaganje... - SponsorBlock je onemogočen - Tvoje uporabniško ime: <b>%s</b> - Tapni tukaj, da spremeniš uporabniško ime - Uporabniškega imena ni mogoče spremeniti: Stanje: %1$d %2$s - Uporabniško ime je bilo uspešno spremenjeno - Tvoj ugled je <b>%.2f</b> - Ustvaril si <b>%s</b> segmentov - Tapni tukaj, da si ogledaš svoje segmente - Lestvica SponsorBlocka - Ljudje so se izognili <b>%s</b> segmentom - Tapni tukaj, da si ogledaš globalno statistiko in vodilne prispevavatelje - To je <b>%s</b> njihovega življenja.<br>Tapni tukaj, da si ogledaš lestvico - Preskočil si <b>%s</b> segmentov - To je <b>%s</b> - Ponastavi število preskočenih segmentov? - %1$s ur %2$s minut - %1$s minut %2$s sekund - %s sekund - Prosojnost: - Barva: - O programu - Podatki so zagotovljeni s strani SponsorBlock API. Tapnite tukaj, da izveste več in si ogledate prenose za druge platforme - - - Postavitev obrazca - Privzeto - Telefon - Tablični računalnik - Avtomobilska - "Spremembe vključujejo: + Začetek mora biti pred koncem + Najprej označi dve točki na časovnem pasu + Predoglej segment + Ročno uredi časovni zamik segmenta + Želiš urediti časovni zamik za začetek ali konec segmenta? + Vnesen je neveljaven čas + Statistika + + Statistika začasno ni na voljo (API ne deluje) + Nalaganje... + SponsorBlock je onemogočen + Tvoje uporabniško ime: <b>%s</b> + Tapni tukaj, da spremeniš uporabniško ime + Uporabniškega imena ni mogoče spremeniti: Stanje: %1$d %2$s + Uporabniško ime je bilo uspešno spremenjeno + Tvoj ugled je <b>%.2f</b> + Ustvaril si <b>%s</b> segmentov + Tapni tukaj, da si ogledaš svoje segmente + Lestvica SponsorBlocka + Ljudje so se izognili <b>%s</b> segmentom + Tapni tukaj, da si ogledaš globalno statistiko in vodilne prispevavatelje + To je <b>%s</b> njihovega življenja.<br>Tapni tukaj, da si ogledaš lestvico + Preskočil si <b>%s</b> segmentov + To je <b>%s</b> + Ponastavi število preskočenih segmentov? + %1$s ur %2$s minut + %1$s minut %2$s sekund + %s sekund + Prosojnost: + Barva: + O programu + Podatki so zagotovljeni s strani SponsorBlock API. Tapnite tukaj, da izveste več in si ogledate prenose za druge platforme + + + Postavitev obrazca + Privzeto + Telefon + Tablični računalnik + Avtomobilska + "Spremembe vključujejo: Postavitev za tablične računalnike • Objave skupnosti so skrite @@ -1327,315 +1326,313 @@ Postavitev za tablične računalnike Avtomobilska postavitev • Shorts se odprejo v običajnem predvajalniku • Vir je organiziran po temah in kanalih" - - - Spoof različice aplikacije - Različica spoofana - Različica ni spoofana - "Različica aplikacije bo posnemana po starejši različici YouTuba. + + + Spoof različice aplikacije + Različica spoofana + Različica ni spoofana + "Različica aplikacije bo posnemana po starejši različici YouTuba. To bo spremenilo videz in funkcije aplikacije, vendar se lahko pojavijo neznani stranski učinki. Če ga kasneje izklopite, je priporočljivo počistiti podatke aplikacije, da preprečite napake uporabniškega vmesnika." - Cilj spoofa različice aplikacije - 20.13.41 - Obnovi nezloženo video akcijsko vrstico - 20.05.46 - Obnovi funkcionalnost prepisa - 19.35.36 - Obnovi stare ikone predvajalnika Shorts - 19.01.34 – Obnovi stare ikone za krmarjenje - - - Spremeni začetno stran - Privzeto - Vse naročnine - Brskaj po kanalih - Tečaji / Učenje - Razišči - Moda \u0026 Lepota - Igranje iger - Zgodovina - Knjižnica - Všeč mi je - V živo - Filmi - Glasba - Novice - Obvestila - Predvajalni seznami - Iskanje - Nakupovanje - Šport - Naročnine - Trendi - Virtualna resničnost - Oglej si kasneje - Vaši posnetki - Vedno spremeni začetno stran - "Začetna stran je vedno spremenjena + Cilj spoofa različice aplikacije + 20.13.41 - Obnovi nezloženo video akcijsko vrstico + 20.05.46 - Obnovi funkcionalnost prepisa + 19.35.36 - Obnovi stare ikone predvajalnika Shorts + 19.01.34 – Obnovi stare ikone za krmarjenje + + + Spremeni začetno stran + Privzeto + Vse naročnine + Brskaj po kanalih + Tečaji / Učenje + Razišči + Moda \u0026 Lepota + Igranje iger + Zgodovina + Knjižnica + Všeč mi je + V živo + Filmi + Glasba + Novice + Obvestila + Predvajalni seznami + Iskanje + Nakupovanje + Šport + Naročnine + Trendi + Virtualna resničnost + Oglej si kasneje + Vaši posnetki + Vedno spremeni začetno stran + "Začetna stran je vedno spremenjena Omejitev: uporaba gumba za nazaj v orodni vrstici morda ne bo delovala" - Začetna stran se spremeni samo ob zagonu aplikacije - - - Onemogoči nadaljevanje predvajalnika Shorts - Predvajalnik Shorts se ne bo nadaljeval ob zagonu aplikacije - Predvajalnik Shorts se bo nadaljeval ob zagonu aplikacije - - - Odpri Shorts z - Predvajalnik Shorts - Redni predvajalnik - Redni predvajalnik v celozaslonskem načinu - - - Samodejno predvajanje Shorts - Shorts se bodo samodejno predvajali - Shorts se bodo ponovili - Samodejno predvajanje Shorts v ozadju - Samodejno predvajanje Shorts v ozadju se bo samodejno predvajalo - Samodejno predvajanje Shorts v ozadju se bo ponovilo - - - \"Miniplayer\" - Spremenite slog minimiziranega predvajalnika v aplikaciji - Vrsta mini predvajalnika - Onemogočeno - Privzeto - Minimalno - Tablični računalnik - Sodobno 1 - Sodobno 2 - Sodobno 3 - Sodobno 4 - Onemogoči zaobljene vogale - Robovi so kvadratni - Robovi so zaobljeni - Omogoči dvojni dotik in stiskanje za spreminjanje velikosti - "Dvojni dotik in ščipanje za spremembo velikosti sta omogočena + Začetna stran se spremeni samo ob zagonu aplikacije + + + Onemogoči nadaljevanje predvajalnika Shorts + Predvajalnik Shorts se ne bo nadaljeval ob zagonu aplikacije + Predvajalnik Shorts se bo nadaljeval ob zagonu aplikacije + + + Odpri Shorts z + Predvajalnik Shorts + Redni predvajalnik + Redni predvajalnik v celozaslonskem načinu + + + Samodejno predvajanje Shorts + Shorts se bodo samodejno predvajali + Shorts se bodo ponovili + Samodejno predvajanje Shorts v ozadju + Samodejno predvajanje Shorts v ozadju se bo samodejno predvajalo + Samodejno predvajanje Shorts v ozadju se bo ponovilo + + + \"Miniplayer\" + Spremenite slog minimiziranega predvajalnika v aplikaciji + Vrsta mini predvajalnika + Onemogočeno + Privzeto + Minimalno + Tablični računalnik + Sodobno 1 + Sodobno 2 + Sodobno 3 + Sodobno 4 + Onemogoči zaobljene vogale + Robovi so kvadratni + Robovi so zaobljeni + Omogoči dvojni dotik in stiskanje za spreminjanje velikosti + "Dvojni dotik in ščipanje za spremembo velikosti sta omogočena • Dvakrat tapnite, da povečate velikost minipredvajalnika • Znova dvakrat tapnite, da obnovite prvotno velikost" - Dvojni dotik in stiskanje za spreminjanje velikosti je onemogočeno - Onemogoči vlečenje in spuščanje - Povleci in spusti je onemogočeno - "Povleci in spusti so omogočeni + Dvojni dotik in stiskanje za spreminjanje velikosti je onemogočeno + Onemogoči vlečenje in spuščanje + Povleci in spusti je onemogočeno + "Povleci in spusti so omogočeni Minipredvajalnik lahko povlečete v kateri koli kot zaslona" - Onemogoči vodoravno potezo vlečenja - Vodoravna kretnja vlečenja je onemogočena - "Omogočena je kretnja vodoravnega vlečenja + Onemogoči vodoravno potezo vlečenja + Vodoravna kretnja vlečenja je onemogočena + "Omogočena je kretnja vodoravnega vlečenja Minipredvajalnik lahko povlečete z zaslona na levo ali desno" - Skrij prekrivne gumbe - Prekrivni gumbi so skriti - Prekrivni gumbi so prikazani - Skrij gumbe za razširitev in zapiranje - Skrij podnaslove - Podnaslovi so skriti - Podnaslovi so prikazani - Skrij gumbe za preskok naprej in nazaj - Preskok naprej in nazaj je skrit - Preskok naprej in nazaj je prikazan - Začetna velikost - Začetna velikost na zaslonu, v slikovnih pikah - Velikost v slikovnih pikah mora biti med %1$s in %2$s - Prosojnost prekrivanja - Vrednost prosojnosti med 0-100, kjer je 0 prozorno - Prosojnost prekrivanja mini predvajalnika mora biti med 0-100 - - - Omogoči zaslon za nalaganje z gradientom - Zaslon za nalaganje bo imel ozadje z gradientom - Zaslon za nalaganje bo imel enobarvno ozadje - Slog uvodnega zaslona - Barva - Črno-belo - Omogoči prilagojeno barvo drsnika - Prilagojena barva drsnika je prikazana - Izvorna barva drsnika je prikazana - Barva po meri za iskalnik - Barva iskalnika - Barva poudarka po meri za iskalnik - Barva poudarka iskalnika - Neveljavna vrednost barve drsnika - - - - - Logotip glave - Privzeto - Navadno - - ReVanced minimalno - Po meri - - - Obvozi omejitve območja slike - Z uporabo gostitelja slik yt4.ggpht.com - "Uporaba izvirnega gostitelja slik + Skrij prekrivne gumbe + Prekrivni gumbi so skriti + Prekrivni gumbi so prikazani + Skrij gumbe za razširitev in zapiranje + Skrij podnaslove + Podnaslovi so skriti + Podnaslovi so prikazani + Skrij gumbe za preskok naprej in nazaj + Preskok naprej in nazaj je skrit + Preskok naprej in nazaj je prikazan + Začetna velikost + Začetna velikost na zaslonu, v slikovnih pikah + Velikost v slikovnih pikah mora biti med %1$s in %2$s + Prosojnost prekrivanja + Vrednost prosojnosti med 0-100, kjer je 0 prozorno + Prosojnost prekrivanja mini predvajalnika mora biti med 0-100 + + + Omogoči zaslon za nalaganje z gradientom + Zaslon za nalaganje bo imel ozadje z gradientom + Zaslon za nalaganje bo imel enobarvno ozadje + Slog uvodnega zaslona + Barva + Črno-belo + Omogoči prilagojeno barvo drsnika + Prilagojena barva drsnika je prikazana + Izvorna barva drsnika je prikazana + Barva po meri za iskalnik + Barva iskalnika + Barva poudarka po meri za iskalnik + Barva poudarka iskalnika + Neveljavna vrednost barve drsnika + + + + Logotip glave + Privzeto + Navadno + + ReVanced minimalno + Po meri + + + Obvozi omejitve območja slike + Z uporabo gostitelja slik yt4.ggpht.com + "Uporaba izvirnega gostitelja slik Omogočanje tega lahko odpravi manjkajoče slike, ki so v nekaterih regijah blokirane" - - - - Domov - - Zavihek Naročnine - - Vi - Seznami predvajanja predvajalnika in priporočila - Rezultati iskanja - Prvotne sličice - DeArrow & Prvotne sličice - DeArrow & Sličice iz posnetkov - Sličice iz posnetkov - "DeArrow omogoča množice pridobljene sličice za videoposnetke v YouTubu. Te sličice so pogosto bolj relevantne od tistih, ki jih zagotavlja YouTube + + + + Domov + + Zavihek Naročnine + + Vi + Seznami predvajanja predvajalnika in priporočila + Rezultati iskanja + Prvotne sličice + DeArrow & Prvotne sličice + DeArrow & Sličice iz posnetkov + Sličice iz posnetkov + "DeArrow omogoča množice pridobljene sličice za videoposnetke v YouTubu. Te sličice so pogosto bolj relevantne od tistih, ki jih zagotavlja YouTube Če je omogočeno, bodo URL-ji videoposnetkov poslani na strežnik API in ne bodo poslani nobeni drugi podatki. Če videoposnetek nima sličic DeArrow, se prikažejo izvirne ali posnetki zaslona Tapnite tukaj, če želite izvedeti več o DeArrow" - Pokaži sporočilo, če API ni na voljo - Sporočilo se prikaže, če DeArrow ni na voljo - Sporočilo se ne prikaže, če DeArrow ni na voljo - Končna točka API-ja DeArrow - URL končne točke predpomnilnika sličic DeArrow - Sličice iz posnetkov videoposnetkov - Sličice iz posnetkov so posnete z začetka/sredine/konca vsakega videoposnetka. Te slike so vgrajene v YouTube in zunanji API se ne uporablja - Uporabi hitre sličice iz posnetkov - Uporaba sličic iz posnetkov srednje kakovosti. Sličice se bodo naložile hitreje, vendar se lahko pri živih prenosih, neizdanih ali zelo starih videoposnetkih prikažejo prazne sličice - Uporaba sličic iz posnetkov visoke kakovosti - Čas v videoposnetku za zajem sličic iz posnetkov - Začetek videoposnetka - Sredina videoposnetka - Konec videoposnetka - - DeArrow začasno ni na voljo (koda stanja: %s) - DeArrow začasno ni na voljo - - - Pokaži obvestila ReVanced - Napovedi ob zagonu so prikazane - Napovedi ob zagonu niso prikazane - Pokaži obvestila ob zagonu - Povezovanje z ponudnikom obvestil ni uspelo - Zavrzi - - - Omogoči ponavljanje videa - Video se bo ponavljal - Video se ne bo ponavljal - - - Prikaži gumb za ponavljanje videa - Gumb je prikazan - Gumb ni prikazan - Ponavljanje videa je vklopljeno - Ponavljanje videa je izklopljeno - - - - - Ponarejanje dimenzij naprave - "Dimenzije naprave so posnemane + Pokaži sporočilo, če API ni na voljo + Sporočilo se prikaže, če DeArrow ni na voljo + Sporočilo se ne prikaže, če DeArrow ni na voljo + Končna točka API-ja DeArrow + URL končne točke predpomnilnika sličic DeArrow + Sličice iz posnetkov videoposnetkov + Sličice iz posnetkov so posnete z začetka/sredine/konca vsakega videoposnetka. Te slike so vgrajene v YouTube in zunanji API se ne uporablja + Uporabi hitre sličice iz posnetkov + Uporaba sličic iz posnetkov srednje kakovosti. Sličice se bodo naložile hitreje, vendar se lahko pri živih prenosih, neizdanih ali zelo starih videoposnetkih prikažejo prazne sličice + Uporaba sličic iz posnetkov visoke kakovosti + Čas v videoposnetku za zajem sličic iz posnetkov + Začetek videoposnetka + Sredina videoposnetka + Konec videoposnetka + + DeArrow začasno ni na voljo (koda stanja: %s) + DeArrow začasno ni na voljo + + + Pokaži obvestila ReVanced + Napovedi ob zagonu so prikazane + Napovedi ob zagonu niso prikazane + Pokaži obvestila ob zagonu + Povezovanje z ponudnikom obvestil ni uspelo + Zavrzi + + + Omogoči ponavljanje videa + Video se bo ponavljal + Video se ne bo ponavljal + + + Prikaži gumb za ponavljanje videa + Gumb je prikazan + Gumb ni prikazan + Ponavljanje videa je vklopljeno + Ponavljanje videa je izklopljeno + + + + Ponarejanje dimenzij naprave + "Dimenzije naprave so posnemane Odklenjene so lahko višje kakovosti videa, vendar se lahko pojavijo trzanje pri predvajanju videa, slabša življenjska doba baterije in neznani stranski učinki" - "Dimenzije naprave niso posnemane + "Dimenzije naprave niso posnemane Omogočanje tega lahko odklene višje kakovosti videa" - Omogočanje tega lahko povzroči jecljanje pri predvajanju videoposnetkov, slabšo življenjsko dobo baterije in neznane stranske učinke. - - - Haptični odziv - Spremeni haptični odziv - Onemogoči haptiko poglavij - Haptika poglavij je onemogočena - Haptika poglavij je omogočena - Onemogoči haptiko natančnega iskanja - Natančna haptika pri iskanju je onemogočena - Haptika natančnega iskanja je omogočena - Onemogoči haptiko za razveljavitev iskanja - Haptika za razveljavitev iskanja je onemogočena - Haptika za razveljavitev iskanja je omogočena - Onemogoči haptiko pri povečavi - Haptika pri povečavi je onemogočena - Haptika pri povečavi je omogočena - - - Če ste nedavno spremenili podatke za prijavo v račun, odstranite in znova namestite MicroG. - - - Obvod preusmeritev URL-jev - Preusmeritve URL-jev so obvodene - Preusmeritve URL-jev niso obvodene - - - Odpri povezave v brskalniku - Odpiranje povezav v zunanjem brskalniku - Odpiranje povezav v brskalniku v aplikaciji - - - - Samodejno - Zapomni si spremembe kakovosti videoposnetka - Spremembe kakovosti se uporabijo za vse videoposnetke - Spremembe kakovosti se uporabijo le za trenutni videoposnetek - Prikaži obvestilo ob spremembi kakovosti videa - Obvestilo je prikazano, ko se spremeni privzeta kakovost videa - Obvestilo ni prikazano, ko se spremeni privzeta kakovost videa - Privzeta kakovost videoposnetka v omrežju Wi-Fi - Privzeta kakovost videoposnetka v mobilnem omrežju - Zapomni si spremembe kakovosti za Shorts - Spremembe kakovosti veljajo za vse Shorts - Spremembe kakovosti veljajo samo za trenutni Short - Privzeta kakovost za Shorts v omrežju Wi-Fi - Privzeta kakovost za Shorts v mobilnem omrežju - mobilni - Wi-Fi - Spremenjena privzeta kakovost %1$s na: %2$s - Spremenjena kakovost Shorts %1$s v: %2$s - - - Pokaži gumb za pogovor o hitrosti - Prikazan je gumb za hitrost. Dotaknite se in držite, da ponastavite hitrost predvajanja na privzeto - Gumb za hitrost ni prikazan - - - Prikaži gumb za kakovost videa - Gumb za kakovost videoposnetka je prikazan. Dotaknite se in držite, da ponastavite kakovost na privzeto - Gumb za kakovost videoposnetka ni prikazan - - - Meni za nastavitev hitrosti predvajanja - Meni za nastavitev hitrosti je prikazan - Meni za nastavitev hitrosti ni prikazan - Obnovi stari meni hitrosti predvajanja - Prikazan je stari meni hitrosti - Prikazan je sodoben meni hitrosti - Nastavitev hitrosti predvajanja po meri - Dodajte ali spremenite hitrosti predvajanja po meri - Hitrosti predvajanja po meri morajo biti manjše od %s - Neveljavne hitrosti predvajanja po meri - Samodejno - Hitrost pritiska in pridržanja po meri - Hitrost predvajanja med 0 in 8 - - - Zapomni si spremembe hitrosti predvajanja - Spremembe hitrosti predvajanja se uporabijo za vse videoposnetke - Spremembe hitrosti predvajanja se uporabijo le za trenutni videoposnetek - Prikaži obvestilo ob spremembi hitrosti predvajanja - Obvestilo je prikazano, ko se spremeni privzeta hitrost predvajanja - Sporočilo ni prikazano, ko je privzeta hitrost predvajanja spremenjena - Privzeta hitrost predvajanja - Spremenjena privzeta hitrost na: %s - - - Onemogoči HDR video - HDR video je onemogočen - HDR video je omogočen - Vsili AVC (H.264) - Video kodek je prisiljen na AVC (H.264) - Video kodek je določen samodejno - "Prednosti: + Omogočanje tega lahko povzroči jecljanje pri predvajanju videoposnetkov, slabšo življenjsko dobo baterije in neznane stranske učinke. + + + Haptični odziv + Spremeni haptični odziv + Onemogoči haptiko poglavij + Haptika poglavij je onemogočena + Haptika poglavij je omogočena + Onemogoči haptiko natančnega iskanja + Natančna haptika pri iskanju je onemogočena + Haptika natančnega iskanja je omogočena + Onemogoči haptiko za razveljavitev iskanja + Haptika za razveljavitev iskanja je onemogočena + Haptika za razveljavitev iskanja je omogočena + Onemogoči haptiko pri povečavi + Haptika pri povečavi je onemogočena + Haptika pri povečavi je omogočena + + + Če ste nedavno spremenili podatke za prijavo v račun, odstranite in znova namestite MicroG. + + + Obvod preusmeritev URL-jev + Preusmeritve URL-jev so obvodene + Preusmeritve URL-jev niso obvodene + + + Odpri povezave v brskalniku + Odpiranje povezav v zunanjem brskalniku + Odpiranje povezav v brskalniku v aplikaciji + + + + Samodejno + Zapomni si spremembe kakovosti videoposnetka + Spremembe kakovosti se uporabijo za vse videoposnetke + Spremembe kakovosti se uporabijo le za trenutni videoposnetek + Prikaži obvestilo ob spremembi kakovosti videa + Obvestilo je prikazano, ko se spremeni privzeta kakovost videa + Obvestilo ni prikazano, ko se spremeni privzeta kakovost videa + Privzeta kakovost videoposnetka v omrežju Wi-Fi + Privzeta kakovost videoposnetka v mobilnem omrežju + Zapomni si spremembe kakovosti za Shorts + Spremembe kakovosti veljajo za vse Shorts + Spremembe kakovosti veljajo samo za trenutni Short + Privzeta kakovost za Shorts v omrežju Wi-Fi + Privzeta kakovost za Shorts v mobilnem omrežju + mobilni + Wi-Fi + Spremenjena privzeta kakovost %1$s na: %2$s + Spremenjena kakovost Shorts %1$s v: %2$s + + + Pokaži gumb za pogovor o hitrosti + Prikazan je gumb za hitrost. Dotaknite se in držite, da ponastavite hitrost predvajanja na privzeto + Gumb za hitrost ni prikazan + + + Prikaži gumb za kakovost videa + Gumb za kakovost videoposnetka je prikazan. Dotaknite se in držite, da ponastavite kakovost na privzeto + Gumb za kakovost videoposnetka ni prikazan + + + Meni za nastavitev hitrosti predvajanja + Meni za nastavitev hitrosti je prikazan + Meni za nastavitev hitrosti ni prikazan + Obnovi stari meni hitrosti predvajanja + Prikazan je stari meni hitrosti + Prikazan je sodoben meni hitrosti + Nastavitev hitrosti predvajanja po meri + Dodajte ali spremenite hitrosti predvajanja po meri + Hitrosti predvajanja po meri morajo biti manjše od %s + Neveljavne hitrosti predvajanja po meri + Samodejno + Hitrost pritiska in pridržanja po meri + Hitrost predvajanja med 0 in 8 + + + Zapomni si spremembe hitrosti predvajanja + Spremembe hitrosti predvajanja se uporabijo za vse videoposnetke + Spremembe hitrosti predvajanja se uporabijo le za trenutni videoposnetek + Prikaži obvestilo ob spremembi hitrosti predvajanja + Obvestilo je prikazano, ko se spremeni privzeta hitrost predvajanja + Sporočilo ni prikazano, ko je privzeta hitrost predvajanja spremenjena + Privzeta hitrost predvajanja + Spremenjena privzeta hitrost na: %s + + + Onemogoči HDR video + HDR video je onemogočen + HDR video je omogočen + Vsili AVC (H.264) + Video kodek je prisiljen na AVC (H.264) + Video kodek je določen samodejno + "Prednosti: • Lahko izboljša življenjsko dobo baterije • Lahko obnovi manjkajoče video ločljivosti na starejši napravi @@ -1644,179 +1641,178 @@ Omejitve: • Predvajanje videa bo porabilo več internetnih podatkov kot VP9 ali AV1 • HDR videi ne bodo uporabljali AVC • Nekatere naprave ne morejo prisiliti AVC" - - - Pokaži napredni meni za kakovost videoposnetkov - Napredni meni za kakovost videoposnetkov je prikazan - Napredni meni za kakovost videoposnetkov ni prikazan - - - Omogoči drsno iskanje - Drsno iskanje je omogočeno - Drsno iskanje ni omogočeno - - - Dovoli Android VR AV1 - "Video kodek je AVC (H.264), VP9 ali AV1 + + + Pokaži napredni meni za kakovost videoposnetkov + Napredni meni za kakovost videoposnetkov je prikazan + Napredni meni za kakovost videoposnetkov ni prikazan + + + Omogoči drsno iskanje + Drsno iskanje je omogočeno + Drsno iskanje ni omogočeno + + + Dovoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ali AV1 Predvajanje se lahko zatika ali izpušča sličice" - Video kodek je AVC (H.264) ali VP9 - "Omogočanje te nastavitve lahko uporablja programsko dekodiranje AV1. + Video kodek je AVC (H.264) ali VP9 + "Omogočanje te nastavitve lahko uporablja programsko dekodiranje AV1. Predvajanje videa z AV1 se lahko zatika ali izpušča sličice." - Stranski učinki ponarejanja - • Eksperimentalni odjemalec in lahko kadar koli preneha delovati - • Video se lahko ustavi ob 1:00, ali pa morda ne bo na voljo v nekaterih regijah - • Meni z zvočnimi posnetki manjka - • Brez kodeka videa AV1 - • Stabilna glasnost ni na voljo - • Posnetki za otroke se mogoče ne bodo predvajali, ko ste odjavljeni ali v načinu brez beleženja zgodovine - - • Vsili izvirni zvok ni na voljo - Pokaži v statistiki za piflarje - Vrsta odjemalca je prikazana v statistiki za piflarje - Odjemalec je skrit v statistiki za piflarje - - - - - - - O - Oglasi - Splošno - Predvajalnik - Razno - - - Skrij video oglase - Video oglasi so skriti - Video oglasi so prikazani - - - Omogoči trajno ponavljanje - Trajno ponavljanje je omogočeno - Trajno ponavljanje je onemogočeno - - - Skrij gumb za predvajanje - Gumb za predvajanje je skrit - Gumb za predvajanje je prikazan - Skrij gumb za zgodovino - Gumb za zgodovino je skrit - Gumb za zgodovino je prikazan - Skrij gumb za obvestila - Gumb za obvestila je skrit - Gumb za obvestila je prikazan - Skrij gumb za iskanje - Gumb za iskanje je skrit - Gumb za iskanje je prikazan - - - Skrij vrstico kategorij - Vrstica kategorij je skrita - Vrstica kategorij je prikazana - - - Spremeni barvo mini predvajalnika - Barva mini predvajalnika se ujema z barvo celozaslonskega predvajalnika - Mini predvajalnik uporablja privzeto barvo - - - Navigacijska vrstica - Skrij ali spremeni gumbe navigacijske vrstice - - Skrij Domov - Gumb Domov je skrit - Gumb Domov je prikazan - - Skrij Vzorci - Gumb Vzorci je skrit - Gumb Vzorci je prikazan - - Skrij Raziskovanje - Gumb Raziskovanje je skrit - Gumb Raziskovanje je prikazan - - Skrij Knjižnico - Gumb Knjižnica je skrit - Gumb Knjižnica je prikazan - - Skrij Nadgradnjo - Gumb Nadgradi je skrit - Gumb Nadgradi je prikazan - Skrij navigacijsko vrstico - Navigacijska vrstica je skrita - Navigacijska vrstica je prikazana - Skrij oznake navigacijskih gumbov - Oznake so skrite - Oznake so prikazane - - - Skrij oznako \'Pridobi Music Premium\' - Oznaka je skrita - Oznaka je prikazana - - - Skrij gumb za nadgradnjo - Gumb je skrit - Gumb je prikazan - - - - - Blokiraj avdio oglase - Avdio oglasi so blokirani - Avdio oglasi so odklenjeni - - - %s ni na voljo, prikazani so lahko oglasi. Poskusite spremeniti storitev za blokiranje oglasov v nastavitvah. - %s je vrnil napako, prikazani so lahko oglasi. Poskusite spremeniti storitev za blokiranje oglasov v nastavitvah. - Blokiraj vdelane video oglase - Onemogočeno - Prehodni strežnik Luminous - Prehodni strežnik PurpleAdBlock - - - Blokiraj video oglase - Video oglasi so blokirani - Video oglasi so odklenjeni - - - Sporočilo izbrisano - Prikaži izbrisana sporočila - Ne prikazuj izbrisanih sporočil - Skrij izbrisana sporočila za spojlerjem - Prikaži izbrisana sporočila kot prečrtano besedilo - - - Samodejno zahtevaj točke kanala - Točke kanala se samodejno zahtevajo - Točke kanala se ne zahtevajo samodejno - - - - Omogoči način za odpravljanje napak za Twitch - Način za odpravljanje napak za Twitch je omogočen (ni priporočljivo) - Način za odpravljanje napak za Twitch je onemogočen - - - Nastavitve ReVanced - O programu - O ReVanced - Blokiranje oglasov - Nastavitve blokiranja oglasov - Klepet - Nastavitve klepeta - Razno - Različne nastavitve - Splošne nastavitve - Druge nastavitve - Oglasi na strani odjemalca - Oglasi Surestream na strani strežnika - Dnevnik za odpravljanje napak - Dnevniki za odpravljanje napak so omogočeni - Dnevniki za odpravljanje napak so onemogočeni - - + Stranski učinki ponarejanja + • Eksperimentalni odjemalec in lahko kadar koli preneha delovati + • Video se lahko ustavi ob 1:00, ali pa morda ne bo na voljo v nekaterih regijah + • Meni z zvočnimi posnetki manjka + • Brez kodeka videa AV1 + • Stabilna glasnost ni na voljo + • Posnetki za otroke se mogoče ne bodo predvajali, ko ste odjavljeni ali v načinu brez beleženja zgodovine + + • Vsili izvirni zvok ni na voljo + Pokaži v statistiki za piflarje + Vrsta odjemalca je prikazana v statistiki za piflarje + Odjemalec je skrit v statistiki za piflarje + + + + + + O + Oglasi + Splošno + Predvajalnik + Razno + + + Skrij video oglase + Video oglasi so skriti + Video oglasi so prikazani + + + Omogoči trajno ponavljanje + Trajno ponavljanje je omogočeno + Trajno ponavljanje je onemogočeno + + + Skrij gumb za predvajanje + Gumb za predvajanje je skrit + Gumb za predvajanje je prikazan + Skrij gumb za zgodovino + Gumb za zgodovino je skrit + Gumb za zgodovino je prikazan + Skrij gumb za obvestila + Gumb za obvestila je skrit + Gumb za obvestila je prikazan + Skrij gumb za iskanje + Gumb za iskanje je skrit + Gumb za iskanje je prikazan + + + Skrij vrstico kategorij + Vrstica kategorij je skrita + Vrstica kategorij je prikazana + + + Spremeni barvo mini predvajalnika + Barva mini predvajalnika se ujema z barvo celozaslonskega predvajalnika + Mini predvajalnik uporablja privzeto barvo + + + Navigacijska vrstica + Skrij ali spremeni gumbe navigacijske vrstice + + Skrij Domov + Gumb Domov je skrit + Gumb Domov je prikazan + + Skrij Vzorci + Gumb Vzorci je skrit + Gumb Vzorci je prikazan + + Skrij Raziskovanje + Gumb Raziskovanje je skrit + Gumb Raziskovanje je prikazan + + Skrij Knjižnico + Gumb Knjižnica je skrit + Gumb Knjižnica je prikazan + + Skrij Nadgradnjo + Gumb Nadgradi je skrit + Gumb Nadgradi je prikazan + Skrij navigacijsko vrstico + Navigacijska vrstica je skrita + Navigacijska vrstica je prikazana + Skrij oznake navigacijskih gumbov + Oznake so skrite + Oznake so prikazane + + + Skrij oznako \'Pridobi Music Premium\' + Oznaka je skrita + Oznaka je prikazana + + + Skrij gumb za nadgradnjo + Gumb je skrit + Gumb je prikazan + + + + + Blokiraj avdio oglase + Avdio oglasi so blokirani + Avdio oglasi so odklenjeni + + + %s ni na voljo, prikazani so lahko oglasi. Poskusite spremeniti storitev za blokiranje oglasov v nastavitvah. + %s je vrnil napako, prikazani so lahko oglasi. Poskusite spremeniti storitev za blokiranje oglasov v nastavitvah. + Blokiraj vdelane video oglase + Onemogočeno + Prehodni strežnik Luminous + Prehodni strežnik PurpleAdBlock + + + Blokiraj video oglase + Video oglasi so blokirani + Video oglasi so odklenjeni + + + Sporočilo izbrisano + Prikaži izbrisana sporočila + Ne prikazuj izbrisanih sporočil + Skrij izbrisana sporočila za spojlerjem + Prikaži izbrisana sporočila kot prečrtano besedilo + + + Samodejno zahtevaj točke kanala + Točke kanala se samodejno zahtevajo + Točke kanala se ne zahtevajo samodejno + + + + Omogoči način za odpravljanje napak za Twitch + Način za odpravljanje napak za Twitch je omogočen (ni priporočljivo) + Način za odpravljanje napak za Twitch je onemogočen + + + Nastavitve ReVanced + O programu + O ReVanced + Blokiranje oglasov + Nastavitve blokiranja oglasov + Klepet + Nastavitve klepeta + Razno + Različne nastavitve + Splošne nastavitve + Druge nastavitve + Oglasi na strani odjemalca + Oglasi Surestream na strani strežnika + Dnevnik za odpravljanje napak + Dnevniki za odpravljanje napak so omogočeni + Dnevniki za odpravljanje napak so onemogočeni + + diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index bba3df7831..9eeb27c84e 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -17,1258 +17,1257 @@ "First 'item' text Second \"item\" text" ---> - - - - Emri i aplikacionit - - Personalizuar - Ikona e aplikacionit - Origjinal - - ReVanced i shkallëzuar - - Personalizuar - - - Kontrollat ​​dështu - Hap faqen zyrtare - Injoro - <h5>Kjo aplikacion nuk duket të jetë e rregulluar nga ju.</h5><br>Kjo aplikacion mund të mos funksionojë siç duhet, <b>mund të jetë e dëmshme ose edhe e rrezikshme për t\'u përdorur</b>.<br><br>Këto verifikime tregojnë se kjo aplikacion është e rregulluar paraprakisht ose është marrë nga dikush tjetër:<br><br><small>%1$s</small><br>Rekomandohet fuqishëm <b>dezinstalimi i kësaj aplikacioni dhe rregullimi i saj vetë</b> për të siguruar që përdorni një aplikacion të vlefshëm dhe të sigurt.<p><br>Nëse injorohet, ky paralajmërim do të tregohet vetëm dy herë. - E rregulluar në një pajisje tjetër - Nuk është instaluar nga ReVanced Manager - E rregulluar më shumë se 10 minuta më parë - E rregulluar para %s ditësh - Data e ndërtimit të APK është e korruptuar - - - Njoftim ReVanced - Historia juaj e shikimit nuk po ruhet.<br><br>Kjo me shumë mundësi shkaktohet nga një bllokues DNS reklamash ose një prokuri rrjeti.<br><br>Për të zgjidhur këtë, shto në listën e bardhë <b>s.youtube.com</b> ose çaktivizo të gjithë bllokuesit DNS dhe prokuritë. - Mos shfaq përsëri - - - Cilësimet - A jeni i sigurt që dëshironi të vazhdoni? - Ruaj - Rivendos - Rikthe ngjyrën - Ngjyrë e pavlefshme - Kërkohet Ristartim - Rindizeni aplikacionin që ky ndryshim të hyjë në fuqi. - Rifillo - Importo - Kopjo - Cilësimet e ReVanced u rivendosën në cilësimet e parazgjedhura - Importuan %d cilësime - Importimi dështoi: %s - Kërko cilësimet - Nuk u gjet asnjë rezultat për \'%s\' - Provo një fjalë kyçe tjetër - Kërkime të fundit - Hiq nga historiku i kërkimit? - Pastro historikun e kërkimeve - Jeni i sigurt që dëshironi të pastroni të gjithë historikun e kërkimeve? - Këshilla për kërkim - "• Prek një shteg për të lundruar te ai +--> + + + Emri i aplikacionit + + Personalizuar + Ikona e aplikacionit + Origjinal + + ReVanced i shkallëzuar + + Personalizuar + + + Kontrollat ​​dështu + Hap faqen zyrtare + Injoro + <h5>Kjo aplikacion nuk duket të jetë e rregulluar nga ju.</h5><br>Kjo aplikacion mund të mos funksionojë siç duhet, <b>mund të jetë e dëmshme ose edhe e rrezikshme për t\'u përdorur</b>.<br><br>Këto verifikime tregojnë se kjo aplikacion është e rregulluar paraprakisht ose është marrë nga dikush tjetër:<br><br><small>%1$s</small><br>Rekomandohet fuqishëm <b>dezinstalimi i kësaj aplikacioni dhe rregullimi i saj vetë</b> për të siguruar që përdorni një aplikacion të vlefshëm dhe të sigurt.<p><br>Nëse injorohet, ky paralajmërim do të tregohet vetëm dy herë. + E rregulluar në një pajisje tjetër + Nuk është instaluar nga ReVanced Manager + E rregulluar më shumë se 10 minuta më parë + E rregulluar para %s ditësh + Data e ndërtimit të APK është e korruptuar + + + Njoftim ReVanced + Historia juaj e shikimit nuk po ruhet.<br><br>Kjo me shumë mundësi shkaktohet nga një bllokues DNS reklamash ose një prokuri rrjeti.<br><br>Për të zgjidhur këtë, shto në listën e bardhë <b>s.youtube.com</b> ose çaktivizo të gjithë bllokuesit DNS dhe prokuritë. + Mos shfaq përsëri + + + Cilësimet + A jeni i sigurt që dëshironi të vazhdoni? + Ruaj + Rivendos + Rikthe ngjyrën + Ngjyrë e pavlefshme + Kërkohet Ristartim + Rindizeni aplikacionin që ky ndryshim të hyjë në fuqi. + Rifillo + Importo + Kopjo + Cilësimet e ReVanced u rivendosën në cilësimet e parazgjedhura + Importuan %d cilësime + Importimi dështoi: %s + Kërko cilësimet + Nuk u gjet asnjë rezultat për \'%s\' + Provo një fjalë kyçe tjetër + Kërkime të fundit + Hiq nga historiku i kërkimit? + Pastro historikun e kërkimeve + Jeni i sigurt që dëshironi të pastroni të gjithë historikun e kërkimeve? + Këshilla për kërkim + "• Prek një shteg për të lundruar te ai • Shtyp gjatë një cilësim për të lundruar te ai • Shtyp Enter për të ruajtur një pyetje kërkimi në histori • Kërkimi injoron shkronjat e mëdha/vogla dhe shenjat e pikësimit • Cilësimet prindërore shfaqen mbi cilësimet fëmijë të çaktivizuara" - Historia e kërkimit është bosh - Për të ruajtur historinë e kërkimit, shkruaj një pyetje kërkimi dhe shtyp Enter - Shfaq historikun e kërkimeve të cilësimeve - Historiku i kërkimeve të cilësimeve është shfaqur - Historia e kërkimit të cilësimeve nuk shfaqet - Shfaq ikonat e cilësimeve të ReVanced - Ikonat e cilësimeve shfaqen - Ikonat e cilësimeve nuk shfaqen - Gjuha e ReVanced - "Përkthimet për disa gjuhë mund të mungojnë ose të jenë të paplota. + Historia e kërkimit është bosh + Për të ruajtur historinë e kërkimit, shkruaj një pyetje kërkimi dhe shtyp Enter + Shfaq historikun e kërkimeve të cilësimeve + Historiku i kërkimeve të cilësimeve është shfaqur + Historia e kërkimit të cilësimeve nuk shfaqet + Shfaq ikonat e cilësimeve të ReVanced + Ikonat e cilësimeve shfaqen + Ikonat e cilësimeve nuk shfaqen + Gjuha e ReVanced + "Përkthimet për disa gjuhë mund të mungojnë ose të jenë të paplota. Për të përkthyer gjuhë të reja ose për të përmirësuar përkthimet ekzistuese, vizito translate.revanced.app" - Gjuha e aplikacionit - Importo / Eksporto - Importo / Eksporto cilësimet e ReVanced - - Po përdorni ReVanced Patches versionin <i>%s</i> - Shënim - Ky version është një version parapublikimi dhe mund të përjetoni probleme të papritura - Lidhjet zyrtare - + Po përdorni ReVanced Patches versionin <i>%s</i> + Shënim + Ky version është një version parapublikimi dhe mund të përjetoni probleme të papritura + Lidhjet zyrtare + - - - Cilësimet e GmsCore - Cilësimet për GmsCore - - MicroG GmsCore nuk është instaluar. Instalojeni. - Veprim i nevojshëm - "MicroG GmsCore nuk ka leje të funksionojë në sfond. + + + Cilësimet e GmsCore + Cilësimet për GmsCore + + MicroG GmsCore nuk është instaluar. Instalojeni. + Veprim i nevojshëm + "MicroG GmsCore nuk ka leje të funksionojë në sfond. Ndiqni udhëzuesin \"Mos e vrisni aplikacionin tim\" për telefonin tuaj dhe aplikoni udhëzimet në instalimin tuaj MicroG. Kjo është e nevojshme që aplikacioni të funksionojë." - Hap faqen e internetit - "Optimizimet e baterisë së MicroG GmsCore duhet të çaktivizohen për të parandaluar problemet. + Hap faqen e internetit + "Optimizimet e baterisë së MicroG GmsCore duhet të çaktivizohen për të parandaluar problemet. Çaktivizimi i optimizimeve të baterisë për MicroG nuk do të ndikojë negativisht në përdorimin e baterisë. Prekni butonin vazhdo dhe lejoni ndryshimet e optimizimit." - Vazhdo - - - Falsifiko transmetimet video - Falsifiko transmetimet video të klientit për të parandaluar problemet e riprodhimit - Mashtro rrjedhat e videos - "Transmetimet video janë falsifikuar + Vazhdo + + + Falsifiko transmetimet video + Falsifiko transmetimet video të klientit për të parandaluar problemet e riprodhimit + Mashtro rrjedhat e videos + "Transmetimet video janë falsifikuar Nëse jeni përdorues i YouTube Premium, ky cilësim mund të mos jetë i nevojshëm" - "Transmetimet video nuk janë falsifikuar + "Transmetimet video nuk janë falsifikuar Riprodhimi mund të mos funksionojë" - Fikja e këtij cilësimi mund të shkaktojë probleme riprodhimi. - Klient i përdoruesit - - - Forco gjuhën origjinale të audios - Duke përdorur gjuhën origjinale audio - Përdorimi i Zërit Parazgjedhur - - Për të përdorur këtë veçori, ndryshoni \'Falsifiko transmetimet e videos\' në çdo klient përveç Android Studio - - - Depurimi - Aktivizo ose çaktivizo opsionet e depurimit - Regjistrimi i depurimit - Regjistrimet e depurimit janë të aktivizuara - Regjistrimet e depurimit janë të çaktivizuara - Regjistro gjurmët e grumbullimit - Regjistrimet e depurimit përfshijnë gjurmë grumbullimi - Regjistrimet e depurimit nuk përfshijnë gjurmë grumbullimi - Shfaqni toast për gabimet e ReVanced - Shfaqet një toast nëse ndodh një gabim - Nuk shfaqet toast nëse ndodh një gabim - "Fshirja e toast-eve të gabimit fsheh të gjitha njoftimet e gabimeve të ReVanced. + Fikja e këtij cilësimi mund të shkaktojë probleme riprodhimi. + Klient i përdoruesit + + + Forco gjuhën origjinale të audios + Duke përdorur gjuhën origjinale audio + Përdorimi i Zërit Parazgjedhur + + Për të përdorur këtë veçori, ndryshoni \'Falsifiko transmetimet e videos\' në çdo klient përveç Android Studio + + + Depurimi + Aktivizo ose çaktivizo opsionet e depurimit + Regjistrimi i depurimit + Regjistrimet e depurimit janë të aktivizuara + Regjistrimet e depurimit janë të çaktivizuara + Regjistro gjurmët e grumbullimit + Regjistrimet e depurimit përfshijnë gjurmë grumbullimi + Regjistrimet e depurimit nuk përfshijnë gjurmë grumbullimi + Shfaqni toast për gabimet e ReVanced + Shfaqet një toast nëse ndodh një gabim + Nuk shfaqet toast nëse ndodh një gabim + "Fshirja e toast-eve të gabimit fsheh të gjitha njoftimet e gabimeve të ReVanced. Ju nuk do të njoftoheni për ndonjë ngjarje të papritur." - Eksporto regjistrat e korrigjimit - Kopjon regjistrat e korrigjimit të ReVanced në kujtesën e shkurtër - Regjistrimi i korrigjimeve është çaktivizuar - Nuk u gjetën regjistra - Regjistrat u kopjuan - Dështoi eksportimi i regjistrave: %s - Pastro regjistrat e korrigjimit - Pastro të gjithë regjistrat e ruajtur të korrigjimit të ReVanced - Regjistrat u pastruan - Manager i sinjaleve të veçorive - Menaxhoni sinjalet boolean të veçorive - Flamuj aktivë (%d) - Flamuj të bllokuar (%d) - Kërko flamuj... - Flamujt u ruajtën - Flamujt u rivendosën - Flamujt u kopjuan në kujtesën e punës - Regjistro protokol buffer - Regjistrimet e depurimit përfshijnë proto buffer - Regjistrimet e depurimit nuk përfshijnë proto buffer - "Aktivizimi i këtij opsioni do të regjistrojë të dhëna shtesë të paraqitjes, duke përfshirë tekstin në ekran për disa komponentë të ndërfaqes përdoruese. + Eksporto regjistrat e korrigjimit + Kopjon regjistrat e korrigjimit të ReVanced në kujtesën e shkurtër + Regjistrimi i korrigjimeve është çaktivizuar + Nuk u gjetën regjistra + Regjistrat u kopjuan + Dështoi eksportimi i regjistrave: %s + Pastro regjistrat e korrigjimit + Pastro të gjithë regjistrat e ruajtur të korrigjimit të ReVanced + Regjistrat u pastruan + Manager i sinjaleve të veçorive + Menaxhoni sinjalet boolean të veçorive + Flamuj aktivë (%d) + Flamuj të bllokuar (%d) + Kërko flamuj... + Flamujt u ruajtën + Flamujt u rivendosën + Flamujt u kopjuan në kujtesën e punës + Regjistro protokol buffer + Regjistrimet e depurimit përfshijnë proto buffer + Regjistrimet e depurimit nuk përfshijnë proto buffer + "Aktivizimi i këtij opsioni do të regjistrojë të dhëna shtesë të paraqitjes, duke përfshirë tekstin në ekran për disa komponentë të ndërfaqes përdoruese. Kjo mund të ndihmojë në identifikimin e komponentëve kur krijoni filtra të personalizuar. Gjithsesi, aktivizimi i këtij opsioni do të regjistrojë edhe disa të dhëna të përdoruesit, siç është adresa juaj IP." - - - Pastro lidhjet e ndarjes - Parametri i kërkesës së gjurmimit hiqet nga lidhjet e ndara - Parametri i kërkesës së gjurmimit nuk hiqet nga lidhjet e ndara - Ndrysho lidhjet e ndarjes në youtube.com - Lidhjet e ndara përdorin youtube.com - Lidhjet e ndara përdorin music.youtube.com - - - Filtri i personalizuar - Fsheh komponentë duke përdorur filtre të personalizuara - Aktivizo filtrin e personalizuar - Filtri i personalizuar është i aktivizuar - Filtri i personalizuar është i çaktivizuar - Filtri i personalizuar - - Lista e stringjeve të ndërtuesit të rrugës së komponentit për të filtruar, të ndara me një rresht të ri - Filtri i personalizuar i pavlefshëm: %s - - - - - Rreth - Anunet - Miniatura alternative - Ushtrimi - Përgjithshëm - Lojtari - Shiriti i kërkimit - Kontrolluesit e rrëshqitjes - Të ndryshme - Rikthe menutë e vjetër të konfigurimeve - Menutë e vjetër të cilësimeve shfaqen - Menutë e vjetër të cilësimeve nuk shfaqen - - - Çaktivizo luajtjen në sfond të Shorts - Lujtja në sfond e Shorts është e çaktivizuar - Lujtja në sfond e Shorts është e aktivizuar - - - Fshih kartat e albumit - Kartat e albumit janë të fshehura - Kartat e albumit janë të dukshme - Fshi kartat e artistëve - Kartat e artistëve janë të fshehura - Kartat e artistëve janë të dukshme - Fshi raftët me çipat - Raftet me çipat janë të fshehura - Raftet me çipat janë të dukshme - Fshi postimet e komunitetit - Postimet e komunitetit janë të fshehura - Postimet e komunitetit janë të dukshme - Fshi bannerët e shkurtër - Bannerët e shkurtër janë të fshehur - Bannerët e shkurtër janë të dukshme - Fshih kartën e zgjerueshme - Karta e zgjerueshme poshtë videove është fshehur - Karta e zgjerueshme poshtë videove është shfaqur - Fshih butonin e mikrofonit lundrues - Butoni lundrues i mikrofonit në kërkim është i fshehur. - Butoni i mikrofonit lundrues në kërkim shfaqet - Fshih raftët horizontalë - "Raftet horizontale janë fshehur, si: + + + Pastro lidhjet e ndarjes + Parametri i kërkesës së gjurmimit hiqet nga lidhjet e ndara + Parametri i kërkesës së gjurmimit nuk hiqet nga lidhjet e ndara + Ndrysho lidhjet e ndarjes në youtube.com + Lidhjet e ndara përdorin youtube.com + Lidhjet e ndara përdorin music.youtube.com + + + Filtri i personalizuar + Fsheh komponentë duke përdorur filtre të personalizuara + Aktivizo filtrin e personalizuar + Filtri i personalizuar është i aktivizuar + Filtri i personalizuar është i çaktivizuar + Filtri i personalizuar + + Lista e stringjeve të ndërtuesit të rrugës së komponentit për të filtruar, të ndara me një rresht të ri + Filtri i personalizuar i pavlefshëm: %s + + + + + Rreth + Anunet + Miniatura alternative + Ushtrimi + Përgjithshëm + Lojtari + Shiriti i kërkimit + Kontrolluesit e rrëshqitjes + Të ndryshme + Rikthe menutë e vjetër të konfigurimeve + Menutë e vjetër të cilësimeve shfaqen + Menutë e vjetër të cilësimeve nuk shfaqen + + + Çaktivizo luajtjen në sfond të Shorts + Lujtja në sfond e Shorts është e çaktivizuar + Lujtja në sfond e Shorts është e aktivizuar + + + Fshih kartat e albumit + Kartat e albumit janë të fshehura + Kartat e albumit janë të dukshme + Fshi kartat e artistëve + Kartat e artistëve janë të fshehura + Kartat e artistëve janë të dukshme + Fshi raftët me çipat + Raftet me çipat janë të fshehura + Raftet me çipat janë të dukshme + Fshi postimet e komunitetit + Postimet e komunitetit janë të fshehura + Postimet e komunitetit janë të dukshme + Fshi bannerët e shkurtër + Bannerët e shkurtër janë të fshehur + Bannerët e shkurtër janë të dukshme + Fshih kartën e zgjerueshme + Karta e zgjerueshme poshtë videove është fshehur + Karta e zgjerueshme poshtë videove është shfaqur + Fshih butonin e mikrofonit lundrues + Butoni lundrues i mikrofonit në kërkim është i fshehur. + Butoni i mikrofonit lundrues në kërkim shfaqet + Fshih raftët horizontalë + "Raftet horizontale janë fshehur, si: • Lajme të fundit • Vazhdoni të shikoni • Eksploroni më shumë kanale • Më të rëndësishmet • Blerje • Shikojeni përsëri" - Raftet horizontale shfaqen. - Fshih raftin e imazheve - Rafti i imazheve në rezultatet e kërkimit është fshehur - Rafti i imazheve në rezultatet e kërkimit është shfaqur - Fshi postimet e fundit - Postimet e fundit janë të fshehura - Postimet e fundit janë të dukshme - Fshi përzierjet e listave të këngëve - Përzierjet e listave të këngëve janë të fshehura - Përzierjet e listave të këngëve janë të dukshme - Fshi seksionin e filmave - Seksioni i filmave është i fshehur - Seksioni i filmave është i dukshme - - Fshih butonin \"Njoftomë\" - Butoni \"Njoftomë\" është i fshehur. - Butoni \"Njoftomë\" shfaqet. - Fshi Playables - Playables janë të fshehura - Playables janë të dukshme - - Fshih butonin \"Trego më shumë\" - Butoni \"Shfaq më shumë\" në rezultatet e kërkimit është i fshehur. - Butoni \"Shfaq më shumë\" në rezultatet e kërkimit shfaqet. - Fshih sondazhet - Anketat janë të fshehura - Anketat janë të shfaqura - Fshih raftin e biletave - Rafti i biletave është i fshehur - Rafti i biletave është i dukshëm - - Fshih etiketat e rekomandimeve të videos. - Etiketat \"Njerëzit panë gjithashtu\" dhe \"Mund të pëlqeni gjithashtu\" në rezultatet e kërkimit janë të fshehura. - Etiketat \"Njerëzit panë gjithashtu\" dhe \"Mund të pëlqeni gjithashtu\" në rezultatet e kërkimit shfaqen. - Fshi ndarësin vizual - Ndarësi vizual është fshehur - Ndarësi vizual është shfaqur - - Fsheh YouTube Doodles - Animacioni \"Doodles\" i YouTube në logo është i fshehur. - Animacioni YouTube Doodles në logo shfaqet - "YouTube Doodles shfaqen disa ditë në vit. + Fshih butonin \"Trego më shumë\" + Butoni \"Shfaq më shumë\" në rezultatet e kërkimit është i fshehur. + Butoni \"Shfaq më shumë\" në rezultatet e kërkimit shfaqet. + Fshih sondazhet + Anketat janë të fshehura + Anketat janë të shfaqura + Fshih raftin e biletave + Rafti i biletave është i fshehur + Rafti i biletave është i dukshëm + + Fshih etiketat e rekomandimeve të videos. + Etiketat \"Njerëzit panë gjithashtu\" dhe \"Mund të pëlqeni gjithashtu\" në rezultatet e kërkimit janë të fshehura. + Etiketat \"Njerëzit panë gjithashtu\" dhe \"Mund të pëlqeni gjithashtu\" në rezultatet e kërkimit shfaqen. + Fshi ndarësin vizual + Ndarësi vizual është fshehur + Ndarësi vizual është shfaqur + + Fsheh YouTube Doodles + Animacioni \"Doodles\" i YouTube në logo është i fshehur. + Animacioni YouTube Doodles në logo shfaqet + "YouTube Doodles shfaqen disa ditë në vit. Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është aktivizuar, atëherë shiriti i filtër nën shiritin e kërkimit gjithashtu do të fshihet." - Fshi shiritin e kanalit - Shiriti i kanalit është i fshehur - Shiriti i kanalit është i dukshme - Fshih shenjën e ujit të kanalit - Shenja e ujit është e fshehur - Shenja e ujit është e dukshme - Fshih kutinë e financimit kolektiv - Kutia e financimit kolektiv është e fshehur - Kutia e financimit kolektiv është e dukshme - Fshi kutitë e emergjencës - Kutitë e emergjencës janë të fshehura - Kutitë e emergjencës janë të dukshme - Fshi panele informuese - Panelet informuese janë të fshehura - Panelet informuese janë të dukshme - - Fshih butonin Anëtarësohu - Butoni \"Bashkohu\" është i fshehur. - Butoni \"Bashkohu\" shfaqet. - Fshi panele mjekësore - Panelet mjekësore janë të fshehura - Panelet mjekësore janë të dukshme - Fshih veprimet e shpejta - Veprimet e shpejta në ekran të plotë janë fshehur - Veprimet e shpejta në ekran të plotë janë shfaqur - Fshih videot e lidhura - Videot e lidhura në veprimet e shpejta janë fshehur - Videot e lidhura në veprimet e shpejta janë shfaqur - Fshih udhëzimet e abonentëve - Udhëzimet e komunitetit të abonuesve janë të fshehura - Udhëzimet e komunitetit të abonuesve janë të dukshme - Fshih reagimet e kohës - Reagimet e kohës janë të fshehura - Reagimet e kohës janë të dukshme - Fshih \"Përmbledhjen e videos të krijuar nga AI\" - Seksioni i përmbledhjes së videos të gjeneruar nga AI është fshehur - Seksioni i përmbledhjes së videos i gjeneruar nga AI është i shfaqur - Fshih Pyet - Seksioni Pyet është i fshehur - Seksioni Pyet është i dukshëm - Fshih Atributet - Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të fshehura - Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të shfaqura - Fshih Kapitujt - Seksioni i Kapitujve është i fshehur - Seksioni i Kapitujve është i dukshme - Fshih \'Si u krijua ky përmbajtje\' - Seksioni si u krijua kjo përmbajtje është i fshehur - Seksioni si u krijua kjo përmbajtje është i shfaqur - Fsheh pikët e Hype-it - Pikët e Hype-it janë të fshehura - Pikët e Hype-it janë të shfaqura - Fshih \'Eksploro podkastin\' - Seksioni eksploro podkastin është i fshehur - Seksioni eksploro podkastin është i shfaqur - Fsheh lidhjet e veçuara - Seksioni i lidhjeve të veçuara është fshehur - Seksioni i lidhjeve të veçuara është shfaqur - Fshi videot e veçuara - Seksioni i videove të veçuara është fshehur - Seksioni i videove të veçuara është shfaqur - Fshih kartat e informacionit - Seksioni i kartave informative është i fshehur - Seksioni i kartave informative është i dukshme - Fshih \'Konceptet kryesore\' - Seksioni i koncepteve kryesore është i fshehur - Seksioni i koncepteve kryesore është i shfaqur - Fshi butonin Abonohu - Butoni Abonohu është fshehur - Butoni Abonohu është shfaqur - Fshih Transkriptin - Seksioni i Shkrimit është i fshehur - Seksioni i Shkrimit është i dukshme - Përshkrimi i videos - Fshi ose shfaq komponentët e përshkrimit të videos - Shiriti i filtrimit - Fshih ose shfaq shiritin e filtrit në burime, video të ngjashme, rezultate kërkimi dhe historik shikimi - Fshih te burimet - I fshehur te burimet - I shfaqur te burimet - Fshi në video të lidhura - I fshehur në video të lidhura - I dukshme në video të lidhura - Fsheh në rezultatet e kërkimit - E fshehur në rezultatet e kërkimit - E shfaqur në rezultatet e kërkimit - Fshih në historikun e shikimeve - Fshehur në historikun e shikimeve - Shfaqur në historikun e shikimeve - Faqja e kanalit - Fshih ose shfaq komponentët e faqes së kanalit - - Fshi butonin Komuniteti - Butoni i komunitetit është fshehur - Butoni i komunitetit shfaqet - - Fshih raftin \"Për ju\" - Rafti Për Ju është fshehur - Rafti Për Ju është shfaqur - - Fsheh butonin Bashkohu - Butoni Bashkohu është fshehur - Butoni Bashkohu shfaqet - Fshih pamjen paraprake të lidhjeve - Pamja paraprake e lidhjeve është fshehur - Pamja paraprake e lidhjeve është shfaqur - Fshih raftin e anëtarëve - Rafti i anëtarëve është fshehur - Rafti i anëtarëve shfaqet - - Fsheh butonin Dyqan - Butoni Dyqan është fshehur - Butoni Dyqan shfaqet - - Fsheh butonin Abonohu - Butoni Abonohu është fshehur - Butoni Abonohu shfaqet - Komentet - Fshi ose shfaq komponentët e seksionit të komenteve - Fshih përmbledhjen e bisedës me AI - Përmbledhja e bisedës me AI është fshehur - Përmbledhja e bisedës me AI është shfaqur - Fshih përmbledhjen e Komenteve me AI - Përmbledhja e komenteve të AI është fshehur - Përmbledhja e komenteve të AI është shfaqur - Fshih udhëzimet e kanalit - Udhëzimet e kanalit janë të fshehura - Udhëzimet e kanalit shfaqen - Fshi kokën \"Komentet nga anëtarët\" - Kreu i komenteve nga anëtarët është i fshehur - Kreu i komenteve nga anëtarët është i shfaqur - Fshi seksionin e komenteve - Seksioni i komenteve është i fshehur - Seksioni i komenteve është i dukshme - Fsheh udhëzimet e komunitetit - Udhëzimet e komunitetit janë fshehur - Udhëzimet e komunitetit janë shfaqur - Fsheh butonin \"Krijo një Short\" - Butoni Krijo një Short është i fshehur - Butoni Krijo një Short është i shfaqur - Fsheh butonat Emoji dhe Kohëmatës - Butonat Emoji dhe Kohëmatës janë fshehur - Butonat Emoji dhe Kohëmatës janë shfaqur - Fsheh komentin e parashikimit - Komenti i parashikimit është i fshehur - Komenti i parashikimit është i dukshëm - Fsheh butonin Faleminderit - Butoni i falënderimit është i fshehur - Butoni i falënderimit është i dukshëm - Fshih numrin e shikimeve - Numri i shikimeve është i fshehur në burim dhe rezultatet e kërkimit - Numri i shikimeve shfaqet në burim dhe rezultatet e kërkimit - - "Kufizimet: + Fshih butonin Anëtarësohu + Butoni \"Bashkohu\" është i fshehur. + Butoni \"Bashkohu\" shfaqet. + Fshi panele mjekësore + Panelet mjekësore janë të fshehura + Panelet mjekësore janë të dukshme + Fshih veprimet e shpejta + Veprimet e shpejta në ekran të plotë janë fshehur + Veprimet e shpejta në ekran të plotë janë shfaqur + Fshih videot e lidhura + Videot e lidhura në veprimet e shpejta janë fshehur + Videot e lidhura në veprimet e shpejta janë shfaqur + Fshih udhëzimet e abonentëve + Udhëzimet e komunitetit të abonuesve janë të fshehura + Udhëzimet e komunitetit të abonuesve janë të dukshme + Fshih reagimet e kohës + Reagimet e kohës janë të fshehura + Reagimet e kohës janë të dukshme + Fshih \"Përmbledhjen e videos të krijuar nga AI\" + Seksioni i përmbledhjes së videos të gjeneruar nga AI është fshehur + Seksioni i përmbledhjes së videos i gjeneruar nga AI është i shfaqur + Fshih Pyet + Seksioni Pyet është i fshehur + Seksioni Pyet është i dukshëm + Fshih Atributet + Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të fshehura + Vendndodhjet e veçuara, Lojërat, Muzika dhe seksionet e personave të përmendur janë të shfaqura + Fshih Kapitujt + Seksioni i Kapitujve është i fshehur + Seksioni i Kapitujve është i dukshme + Fshih \'Si u krijua ky përmbajtje\' + Seksioni si u krijua kjo përmbajtje është i fshehur + Seksioni si u krijua kjo përmbajtje është i shfaqur + Fsheh pikët e Hype-it + Pikët e Hype-it janë të fshehura + Pikët e Hype-it janë të shfaqura + Fshih \'Eksploro podkastin\' + Seksioni eksploro podkastin është i fshehur + Seksioni eksploro podkastin është i shfaqur + Fsheh lidhjet e veçuara + Seksioni i lidhjeve të veçuara është fshehur + Seksioni i lidhjeve të veçuara është shfaqur + Fshi videot e veçuara + Seksioni i videove të veçuara është fshehur + Seksioni i videove të veçuara është shfaqur + Fshih kartat e informacionit + Seksioni i kartave informative është i fshehur + Seksioni i kartave informative është i dukshme + Fshih \'Konceptet kryesore\' + Seksioni i koncepteve kryesore është i fshehur + Seksioni i koncepteve kryesore është i shfaqur + Fshi butonin Abonohu + Butoni Abonohu është fshehur + Butoni Abonohu është shfaqur + Fshih Transkriptin + Seksioni i Shkrimit është i fshehur + Seksioni i Shkrimit është i dukshme + Përshkrimi i videos + Fshi ose shfaq komponentët e përshkrimit të videos + Shiriti i filtrimit + Fshih ose shfaq shiritin e filtrit në burime, video të ngjashme, rezultate kërkimi dhe historik shikimi + Fshih te burimet + I fshehur te burimet + I shfaqur te burimet + Fshi në video të lidhura + I fshehur në video të lidhura + I dukshme në video të lidhura + Fsheh në rezultatet e kërkimit + E fshehur në rezultatet e kërkimit + E shfaqur në rezultatet e kërkimit + Fshih në historikun e shikimeve + Fshehur në historikun e shikimeve + Shfaqur në historikun e shikimeve + Faqja e kanalit + Fshih ose shfaq komponentët e faqes së kanalit + + Fshi butonin Komuniteti + Butoni i komunitetit është fshehur + Butoni i komunitetit shfaqet + + Fshih raftin \"Për ju\" + Rafti Për Ju është fshehur + Rafti Për Ju është shfaqur + + Fsheh butonin Bashkohu + Butoni Bashkohu është fshehur + Butoni Bashkohu shfaqet + Fshih pamjen paraprake të lidhjeve + Pamja paraprake e lidhjeve është fshehur + Pamja paraprake e lidhjeve është shfaqur + Fshih raftin e anëtarëve + Rafti i anëtarëve është fshehur + Rafti i anëtarëve shfaqet + + Fsheh butonin Dyqan + Butoni Dyqan është fshehur + Butoni Dyqan shfaqet + + Fsheh butonin Abonohu + Butoni Abonohu është fshehur + Butoni Abonohu shfaqet + Komentet + Fshi ose shfaq komponentët e seksionit të komenteve + Fshih përmbledhjen e bisedës me AI + Përmbledhja e bisedës me AI është fshehur + Përmbledhja e bisedës me AI është shfaqur + Fshih përmbledhjen e Komenteve me AI + Përmbledhja e komenteve të AI është fshehur + Përmbledhja e komenteve të AI është shfaqur + Fshih udhëzimet e kanalit + Udhëzimet e kanalit janë të fshehura + Udhëzimet e kanalit shfaqen + Fshi kokën \"Komentet nga anëtarët\" + Kreu i komenteve nga anëtarët është i fshehur + Kreu i komenteve nga anëtarët është i shfaqur + Fshi seksionin e komenteve + Seksioni i komenteve është i fshehur + Seksioni i komenteve është i dukshme + Fsheh udhëzimet e komunitetit + Udhëzimet e komunitetit janë fshehur + Udhëzimet e komunitetit janë shfaqur + Fsheh butonin \"Krijo një Short\" + Butoni Krijo një Short është i fshehur + Butoni Krijo një Short është i shfaqur + Fsheh butonat Emoji dhe Kohëmatës + Butonat Emoji dhe Kohëmatës janë fshehur + Butonat Emoji dhe Kohëmatës janë shfaqur + Fsheh komentin e parashikimit + Komenti i parashikimit është i fshehur + Komenti i parashikimit është i dukshëm + Fsheh butonin Faleminderit + Butoni i falënderimit është i fshehur + Butoni i falënderimit është i dukshëm + Fshih numrin e shikimeve + Numri i shikimeve është i fshehur në burim dhe rezultatet e kërkimit + Numri i shikimeve shfaqet në burim dhe rezultatet e kërkimit + + "Kufizimet: • Raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende numrin e shikimeve • Ky funksion nuk funksionon me faktorin e formës së automobilave" - Fshih kohën e ngarkimit - Koha e ngarkimit fshihet në fluks dhe rezultatet e kërkimit - Koha e ngarkimit shfaqet në fluks dhe rezultatet e kërkimit - - "Kufizimet: + Fshih kohën e ngarkimit + Koha e ngarkimit fshihet në fluks dhe rezultatet e kërkimit + Koha e ngarkimit shfaqet në fluks dhe rezultatet e kërkimit + + "Kufizimet: • raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende kohën e ngarkimit • Kjo veçori nuk funksionon me faktorin e formës automobilistike" - Fsheh përmbajtjen e fjalëve kyçe - Fsheh videot e kërkimit dhe të ushqimit duke përdorur filtre fjalësh kyçe - Fsheh videot e faqes së fillimit sipas fjalëve kyçe - Videot në skedën e faqes së fillimit filtrohen sipas fjalëve kyçe - Videot në skedën e faqes së fillimit nuk filtrohen sipas fjalëve kyçe - Fsheh rezultatet e kërkimit sipas fjalëve kyçe - Rezultatet e kërkimit filtrohen sipas fjalëve kyçe - Rezultatet e kërkimit nuk filtrohen sipas fjalëve kyçe - Fsheh videot e abonimeve sipas fjalëve kyçe - Videot në skedën e abonimeve filtrohen sipas fjalëve kyçe - Videot në skedën e abonimeve nuk filtrohen sipas fjalëve kyçe - Fjalët kyçe për të fshehur - - "Fjalët kyçe dhe frazat për t'u fshehur, të ndara nga rreshta të reja + "Fjalët kyçe dhe frazat për t'u fshehur, të ndara nga rreshta të reja Fjalët kyçe mund të jenë emra kanalesh ose çdo tekst që shfaqet në titujt e videove Words with uppercase letters in the middle must be entered with the casing (ie: iPhone, TikTok, LeBlanc)" - Rreth filtrimit të fjalëve kyçe - "Rezultatet e kërkimit në Shtëpi/Abonime/Kërkime janë filtruar për të fshehur përmbajtjen që përputhet me frazat kyçe + Rreth filtrimit të fjalëve kyçe + "Rezultatet e kërkimit në Shtëpi/Abonime/Kërkime janë filtruar për të fshehur përmbajtjen që përputhet me frazat kyçe Kufizime • Shorts nuk mund të fshihen sipas emrit të kanalit • Disa përbërës të UI mund të mos fshihen • Kërkimi për një fjalë kyçe mund të mos tregojë rezultate" - Përputh fjalët e plota - - Rreth një fjale kyçe/fraze me thënë të thjeshta do të parandalojë përputhjet e pjesshme të titujve të videove dhe emrave të kanaleve<br><br>Për shembull,<br><b>\"ai\"</b> do të fshehë videon: <b>Si funksionon AI?</b><br>por nuk do të fshehë: <b>What does fair use mean?</b> - - Nuk mund të përdoret fjala kyçe: %s - Shto thonjëza për të përdorur fjalën kyçe: %s - Fjala kyçe ka deklarime në konflikt: %s - Fjala kyçe është shumë e shkurtër dhe kërkon thonjëza: %s - Fjala kyçe do të fshehë të gjitha videot: %s - - - Fshih raftin e dyqanit të krijuesit - Rafti i dyqanit të krijuesit nën luajtësin e videos është i fshehur. - Rafti i dyqanit të krijuesve nën luajtësin e videos shfaqet - Fsheh bannerin e dyqanit të ekranit përfundimtar - Baneri i dyqanit në ekranin përfundimtar është i fshehur. - Baneri i dyqanit në ekranin përfundimtar shfaqet. - Fsheh reklamimet me ekran të plotë - "Reklamat në ekran të plotë janë të fshehura + Përputh fjalët e plota + + Rreth një fjale kyçe/fraze me thënë të thjeshta do të parandalojë përputhjet e pjesshme të titujve të videove dhe emrave të kanaleve<br><br>Për shembull,<br><b>\"ai\"</b> do të fshehë videon: <b>Si funksionon AI?</b><br>por nuk do të fshehë: <b>What does fair use mean?</b> + + Nuk mund të përdoret fjala kyçe: %s + Shto thonjëza për të përdorur fjalën kyçe: %s + Fjala kyçe ka deklarime në konflikt: %s + Fjala kyçe është shumë e shkurtër dhe kërkon thonjëza: %s + Fjala kyçe do të fshehë të gjitha videot: %s + + + Fshih raftin e dyqanit të krijuesit + Rafti i dyqanit të krijuesit nën luajtësin e videos është i fshehur. + Rafti i dyqanit të krijuesve nën luajtësin e videos shfaqet + Fsheh bannerin e dyqanit të ekranit përfundimtar + Baneri i dyqanit në ekranin përfundimtar është i fshehur. + Baneri i dyqanit në ekranin përfundimtar shfaqet. + Fsheh reklamimet me ekran të plotë + "Reklamat në ekran të plotë janë të fshehura Kjo veçori është e disponueshme vetëm për pajisje më të vjetra" - Reklamimet me ekran të plotë janë të dukshme - - Fshehja e reklamave me ekran të plotë funksionon vetëm me pajisje më të vjetra - Fsheh reklamimet e përgjithshme - Reklamimet e përgjithshme janë të fshehur - Reklamimet e përgjithshme janë të dukshme - Fsheh bannerat e mallrave - Bannerat e mallrave janë të fshehur - Bannerat e mallrave janë të dukshme - Fsheh etiketën e promovimit të paguar - Etiketë e promovimit të paguar është e fshehur - Etiketë e promovimit të paguar është e dukshme - Fsheh kartat e sponsorizuara vetë - Kartat e sponsorizuara vetë janë të fshehur - Kartat e sponsorizuara vetë janë të dukshme - Fshih lidhjet e blerjeve - Lidhjet e blerjeve në përshkrimin e videos janë të fshehura. - Lidhjet e blerjeve në përshkrimin e videos shfaqen - Fshih banerin \'Shiko produkte\' - Baneri \"Shiko produkte\" në mbivendosjen e videos është i fshehur. - Baneri \"Shiko produkte\" në mbivendosjen e videos shfaqet. - Fsheh rezultatet e kërkimit në ueb - Rezultatet e kërkimit në ueb janë të fshehur - Rezultatet e kërkimit në ueb janë të dukshme - - - Fsheh promovimet e YouTube Premium - Promovimet e YouTube Premium nën lojtarin e videos janë të fshehur - Promovimet e YouTube Premium nën lojtarin e videos janë të dukshme - - - Fsheh reklamimet e videos - Reklamimet e videos janë të fshehur - Reklamimet e videos janë të dukshme - - - URL u kopjua në shkëmbim - URL me kohëzgjatje u kopjua - Shfaq butonin e kopjimit të URL-së së videos - Butoni \"Kopjo URL-në e videos\" shfaqet. Prekni për të kopjuar URL-në e videos. Prekni dhe mbani shtypur për të kopjuar me vulë kohore - Butoni \"Kopjo URL-në e videos\" nuk shfaqet - Shfaq butonin \"Kopjo URL-në me vulë kohe\" - Butoni \"Kopjo URL-në me vulë kohore\" shfaqet. Prekni për të kopjuar URL-në e videos me vulë kohore. Prekni dhe mbani shtypur për të kopjuar pa vulë kohore - Butoni \"Kopjo URL-në me vulë kohore\" nuk shfaqet - - - Hiq kutinë e dialogut \"Diskrecioni i shikuesit\" - Kutia e dialogut do të hiqet - Kutia e dialogut do të shfaqet - Kjo nuk e anashkalon kufizimin e moshës. Thjesht e pranon atë automatikisht. - - - Çaktivizo dritaren kërcyese \"Hyni në TV\" - Dritarja kërcyese Hyr në TV është çaktivizuar - Dritarja kërcyese Hyr në TV është aktivizuar - - - Çaktivizo anashkalimin e kapitullit me prekje të dyfishtë - Prekja e dyfishtë nuk mund të shkaktojë kurrë një anashkalim te kapitulli tjetër/i mëparshëm - Prekja e dyfishtë mund të shkaktojë herë pas here një anashkalim te kapitulli tjetër/i mëparshëm - - - Shkarkime të jashtme - Cilësimet për përdorimin e një shkarkuesi të jashtëm - Shfaq butonin \"Shkarko\" të jashtëm - Butoni i shkarkimit në luajtës është i shfaqur - Butoni i shkarkimit në luajtës nuk është i shfaqur - - Zëvendëso butonin e shkarkimit të jashtëm - Butoni \"Shkarko\" hap shkarkuesin tuaj të jashtëm - Butoni \"Shkarko\" hap shkarkuesin e integruar në aplikacion - Emri i paketave të shkarkuesit - Emri i paketës së aplikacionit tuaj të instaluar të shkarkuesit të jashtëm - Shkruani emrin e paketës - Tjetër - Aplikacioni nuk është instaluar - %s nuk është instaluar. Ju lutemi instaloni atë. - "Nuk u gjet asnjë aplikacion i instaluar me emrin e paketës: %s + Reklamimet me ekran të plotë janë të dukshme + + Fshehja e reklamave me ekran të plotë funksionon vetëm me pajisje më të vjetra + Fsheh reklamimet e përgjithshme + Reklamimet e përgjithshme janë të fshehur + Reklamimet e përgjithshme janë të dukshme + Fsheh bannerat e mallrave + Bannerat e mallrave janë të fshehur + Bannerat e mallrave janë të dukshme + Fsheh etiketën e promovimit të paguar + Etiketë e promovimit të paguar është e fshehur + Etiketë e promovimit të paguar është e dukshme + Fsheh kartat e sponsorizuara vetë + Kartat e sponsorizuara vetë janë të fshehur + Kartat e sponsorizuara vetë janë të dukshme + Fshih lidhjet e blerjeve + Lidhjet e blerjeve në përshkrimin e videos janë të fshehura. + Lidhjet e blerjeve në përshkrimin e videos shfaqen + Fshih banerin \'Shiko produkte\' + Baneri \"Shiko produkte\" në mbivendosjen e videos është i fshehur. + Baneri \"Shiko produkte\" në mbivendosjen e videos shfaqet. + Fsheh rezultatet e kërkimit në ueb + Rezultatet e kërkimit në ueb janë të fshehur + Rezultatet e kërkimit në ueb janë të dukshme + + + Fsheh promovimet e YouTube Premium + Promovimet e YouTube Premium nën lojtarin e videos janë të fshehur + Promovimet e YouTube Premium nën lojtarin e videos janë të dukshme + + + Fsheh reklamimet e videos + Reklamimet e videos janë të fshehur + Reklamimet e videos janë të dukshme + + + URL u kopjua në shkëmbim + URL me kohëzgjatje u kopjua + Shfaq butonin e kopjimit të URL-së së videos + Butoni \"Kopjo URL-në e videos\" shfaqet. Prekni për të kopjuar URL-në e videos. Prekni dhe mbani shtypur për të kopjuar me vulë kohore + Butoni \"Kopjo URL-në e videos\" nuk shfaqet + Shfaq butonin \"Kopjo URL-në me vulë kohe\" + Butoni \"Kopjo URL-në me vulë kohore\" shfaqet. Prekni për të kopjuar URL-në e videos me vulë kohore. Prekni dhe mbani shtypur për të kopjuar pa vulë kohore + Butoni \"Kopjo URL-në me vulë kohore\" nuk shfaqet + + + Hiq kutinë e dialogut \"Diskrecioni i shikuesit\" + Kutia e dialogut do të hiqet + Kutia e dialogut do të shfaqet + Kjo nuk e anashkalon kufizimin e moshës. Thjesht e pranon atë automatikisht. + + + Çaktivizo dritaren kërcyese \"Hyni në TV\" + Dritarja kërcyese Hyr në TV është çaktivizuar + Dritarja kërcyese Hyr në TV është aktivizuar + + + Çaktivizo anashkalimin e kapitullit me prekje të dyfishtë + Prekja e dyfishtë nuk mund të shkaktojë kurrë një anashkalim te kapitulli tjetër/i mëparshëm + Prekja e dyfishtë mund të shkaktojë herë pas here një anashkalim te kapitulli tjetër/i mëparshëm + + + Shkarkime të jashtme + Cilësimet për përdorimin e një shkarkuesi të jashtëm + Shfaq butonin \"Shkarko\" të jashtëm + Butoni i shkarkimit në luajtës është i shfaqur + Butoni i shkarkimit në luajtës nuk është i shfaqur + + Zëvendëso butonin e shkarkimit të jashtëm + Butoni \"Shkarko\" hap shkarkuesin tuaj të jashtëm + Butoni \"Shkarko\" hap shkarkuesin e integruar në aplikacion + Emri i paketave të shkarkuesit + Emri i paketës së aplikacionit tuaj të instaluar të shkarkuesit të jashtëm + Shkruani emrin e paketës + Tjetër + Aplikacioni nuk është instaluar + %s nuk është instaluar. Ju lutemi instaloni atë. + "Nuk u gjet asnjë aplikacion i instaluar me emrin e paketës: %s Verifikoni që emri i paketës është i saktë dhe aplikacioni është instaluar" - Emri i paketës nuk mund të jetë bosh - - - Çaktivizo lëvizjen e saktë të kërkimit - Lëvizja është e çaktivizuar - Lëvizja është e aktivizuar - - - Aktivizo prekjen për të kërkuar - Aktivizo prekjen për të kërkuar - Prekja për të kërkuar është e çaktivizuar - - - Aktivizo lëvizjen e ndriçimit - "Rrëshqitja e shkëlqimit në ekran të plotë është aktivizuar + Emri i paketës nuk mund të jetë bosh + + + Çaktivizo lëvizjen e saktë të kërkimit + Lëvizja është e çaktivizuar + Lëvizja është e aktivizuar + + + Aktivizo prekjen për të kërkuar + Aktivizo prekjen për të kërkuar + Prekja për të kërkuar është e çaktivizuar + + + Aktivizo lëvizjen e ndriçimit + "Rrëshqitja e shkëlqimit në ekran të plotë është aktivizuar Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekranit" - Rrëshqitja e shkëlqimit në ekran të plotë është çaktivizuar - Aktivizo lëvizjen e zërit - "Rrëshqitja e volumit në ekran të plotë është aktivizuar + Rrëshqitja e shkëlqimit në ekran të plotë është çaktivizuar + Aktivizo lëvizjen e zërit + "Rrëshqitja e volumit në ekran të plotë është aktivizuar Rregullo volumin duke rrëshqitur vertikalisht në anën e djathtë të ekranit" - Rrëshqitja e volumit në ekran të plotë është çaktivizuar - Aktivizo shtypin për gjestin e rrëshqitjes - Shtyp për të rrëshqitur është aktivizuar - Shtyp për të rrëshqitur është çaktivizuar - Aktivizo reagimin haptic - Reagimi haptic është i aktivizuar - Reagimi haptic është i çaktivizuar - Ruaj dhe rivendos ndriçimin - Ruaj dhe rivendos ndriçimin kur del ose hyn në ekran të plotë - Mos ruaj dhe mos rivendos ndriçimin kur del ose hyn në ekran të plotë - Aktivizo lëvizjen \"ndriçim automatik\" - Shërbimi \"ndriçim automatik\" aktivizohet duke shëruar poshtë në vlerën më të ulët të lëvizjes së ndriçimit - Shërbimi \"ndriçim automatik\" nuk aktivizohet duke shëruar poshtë në vlerën më të ulët - Automatik - Koha e daljes së mbivendosjes së shërbimit - Sasia e milisekondave që mbivendosja është e dukshme - Opasiteti i sfondit mbivendosës shtypëse - Vlera e opacitetit midis 0-100 - Opaciteti i shtypjes duhet të jetë midis 0-100 - Ngjyra e ndriçimit të mbivendosjes me rrëshqitje - Ngjyra e shiritit të progresit për kontrollet e ndriçimit - Ngjyra e volumit të mbivendosjes me rrëshqitje - Ngjyra e shiritit të progresit për kontrollet e volumit - Madhësia e tekstit të mbivendosjes së rrëshqitjes - Madhësia e tekstit për mbivendosjen e rrëshqitjes midis 1-30 - Madhësia e tekstit duhet të jetë midis 1-30 - Pragu i madhësisë së shërbimit - Sasia e pragut për të ndodhur shërbimi - Ndjeshmëria e rrëshqitjes së volumit - Sa ndryshon volumi për rrëshqitje - Stili i mbivendosjes me rrëshqitje - Mbivendosje horizontale - Mbivendosje horizontale (minimale - lart) - Mbivendosje horizontale (minimale - qendër) - Mbivendosje rrethore - Mbivendosje rrethore (minimale) - Mbivendosje vertikale - Mbivendosje vertikale (minimale) - Aktivizoni lëshimin për të ndryshuar videot - Lëvizja në modalitetin në ekran të plotë do të ndryshojë në videon e ardhshme/të mëparshme - Lëvizja në modalitetin në ekran të plotë nuk do të ndryshojë në videon e ardhshme/të mëparshme - - - Çaktivizo titrat automatikë - Titrat automatikë janë të çaktivizuar - Titrat Auto janë aktivizuar - - - Butonat e veprimit - Fsheh ose shfaq butonat nën video - Çaktivizo dritën Të Pëlqej dhe Abonohu - Butoni Të Pëlqej dhe të Regjistrohu do të ndriçojë kur përmenden - Butoni Të Pëlqej dhe të Regjistrohu nuk do të ndriçojë kur përmenden - Fsheh \"Pëlqej\" dhe \"Mos pëlqej\" - Butonat \"Pëlqej\" dhe \"Mos pëlqej\" janë të fshehur - Butonat \"Pëlqej\" dhe \"Mos pëlqej\" janë të dukshëm - - Fsheh \"Pjesëto\" - Butoni \"Pjesëto\" është i fshehur - Butoni \"Pjesëto\" është i dukshëm - - Fshih \"Ndalo reklamat\" - Butoni Ndalo reklamat është i fshehur - Butoni Ndalo reklamat është i shfaqur - - Fshih Komentet - Butoni i komenteve është i fshehur - Butoni i komenteve është shfaqur - + Fsheh \"Pjesëto\" + Butoni \"Pjesëto\" është i fshehur + Butoni \"Pjesëto\" është i dukshëm + + Fshih \"Ndalo reklamat\" + Butoni Ndalo reklamat është i fshehur + Butoni Ndalo reklamat është i shfaqur + + Fshih Komentet + Butoni i komenteve është i fshehur + Butoni i komenteve është shfaqur + - Fsheh \"Raporton\" - Butoni \"Raporton\" është i fshehur - Butoni \"Raporton\" është i dukshëm - - Fsheh \"Remix\" - Butoni \"Remix\" është i fshehur - Butoni \"Remix\" është i dukshëm - - Fsheh \"Shkarko\" - Butoni \"Shkarko\" është i fshehur - Butoni \"Shkarko\" është i dukshëm - + Fsheh \"Remix\" + Butoni \"Remix\" është i fshehur + Butoni \"Remix\" është i dukshëm + + Fsheh \"Shkarko\" + Butoni \"Shkarko\" është i fshehur + Butoni \"Shkarko\" është i dukshëm + - Fsheh Zhurmën - Butoni Hype është i fshehur - Butoni Hype është i shfaqur - - Fshihe Promovo - Butoni i promovimit është fshehur - Butoni i promovimit është shfaqur - - Fsheh \"Faleminderit\" - Butoni \"Faleminderit\" është i fshehur - Butoni \"Faleminderit\" është i dukshëm - + Fshihe Promovo + Butoni i promovimit është fshehur + Butoni i promovimit është shfaqur + + Fsheh \"Faleminderit\" + Butoni \"Faleminderit\" është i fshehur + Butoni \"Faleminderit\" është i dukshëm + - Fshih Pyet - Butoni Pyet është i fshehur - Butoni Pyet shfaqet - - Fsheh \"Klip\" - Butoni \"Klip\" është i fshehur - Butoni \"Klip\" është i dukshëm - - Fshih Dyqanin - Butoni i dyqanit është fshehur - Butoni i dyqanit është shfaqur - - Fshih Ruaj - Butoni Ruaj është i fshehur - Butoni Ruaj është i shfaqur - - - Butonat e navigimit - Fsheh ose ndrysho butonat në shiritin e navigimit - - Fsheh \"Shtëpia\" - Butoni \"Shtëpia\" është i fshehur - Butoni \"Shtëpia\" është i dukshëm - - Fsheh \"Shorts\" - Butoni \"Shorts\" është i fshehur - Butoni \"Shorts\" është i dukshëm - - Fsheh \"Krijoni\" - Butoni \"Krijoni\" është i fshehur - Butoni \"Krijoni\" është i dukshëm - - Fsheh \"Abonimet\" - Butoni \"Abonimet\" është i fshehur - Butoni \"Abonimet\" është i dukshëm - Fshih Njoftimet - Butoni i njoftimeve është i fshehur - Butoni i njoftimeve është shfaqur - - Ndërro \"Krijoni\" me \"Njoftimet\" - "Butoni i krijimit është ndërruar me butonin e njoftimeve + Fshih Pyet + Butoni Pyet është i fshehur + Butoni Pyet shfaqet + + Fsheh \"Klip\" + Butoni \"Klip\" është i fshehur + Butoni \"Klip\" është i dukshëm + + Fshih Dyqanin + Butoni i dyqanit është fshehur + Butoni i dyqanit është shfaqur + + Fshih Ruaj + Butoni Ruaj është i fshehur + Butoni Ruaj është i shfaqur + + + Butonat e navigimit + Fsheh ose ndrysho butonat në shiritin e navigimit + + Fsheh \"Shtëpia\" + Butoni \"Shtëpia\" është i fshehur + Butoni \"Shtëpia\" është i dukshëm + + Fsheh \"Shorts\" + Butoni \"Shorts\" është i fshehur + Butoni \"Shorts\" është i dukshëm + + Fsheh \"Krijoni\" + Butoni \"Krijoni\" është i fshehur + Butoni \"Krijoni\" është i dukshëm + + Fsheh \"Abonimet\" + Butoni \"Abonimet\" është i fshehur + Butoni \"Abonimet\" është i dukshëm + Fshih Njoftimet + Butoni i njoftimeve është i fshehur + Butoni i njoftimeve është shfaqur + + Ndërro \"Krijoni\" me \"Njoftimet\" + "Butoni i krijimit është ndërruar me butonin e njoftimeve Shënim: Aktivizimi i kësaj gjëje gjithashtu fsheh me forcë reklamat video" - Butoni \"Krijoni\" nuk është i ndërruar me butonin \"Njoftimet\" - "Çaktivizimi i këtij konfigurimi do të çaktivizojë gjithashtu bllokimin e reklamave të Shorts. + Butoni \"Krijoni\" nuk është i ndërruar me butonin \"Njoftimet\" + "Çaktivizimi i këtij konfigurimi do të çaktivizojë gjithashtu bllokimin e reklamave të Shorts. Nëse ndryshimi i këtij konfigurimi nuk ka efekt, provoni të kaloni në modalitetin Incognito." - Fsheh etiketat e butonave të navigimit - Etiketat janë të fshehura - Etiketat janë të dukshme - Çaktivizo barin transparent të statusit - Shiriti i statusit është opak - Shiriti i statusit është opak ose translucent - Në disa pajisje, aktivizimi i këtij funksioni mund ta ndryshojë shiritin e navigimit të sistemit në transparent. - Çaktivizo barin transparent të navigacionit të lehtë - Barra e navigacionit në modalitetin e dritës është e paqartë - Shiriti i navigimit në modalitetin e ndritshëm është opak ose translucent - Çaktivizoni shiritin e errët translucent - Barra e navigacionit në modalitetin e errët është e paqartë - Shiriti i navigimit në modalitetin e errët është opak ose translucent - - - Menyja \"Fshi\" - Fsheh ose shfaq elementet e menusë \"Fshi\" të lojtarit - - Fsheh titrat - Menyja e titrave është e fshehur - Menyja e titrave është e dukshme - - Fsheh \"Cilësimet shtesë\" - Menyja \"Cilësimet shtesë\" është e fshehur - Menyja \"Cilësimet shtesë\" është e dukshme - - Fsheh \"Koha e gjumit\" - Menyja \"Koha e gjumit\" është e fshehur - Menyja \"Koha e gjumit\" është e dukshme - - Fsheh \"Përsëritni videon\" - Menyja \"Përsëritni videon\" është e fshehur - Menyja \"Përsëritni videon\" është e dukshme - - Fsheh \"Modaliteti Ambient\" - Menyja \"Modaliteti Ambient\" është e fshehur - Menyja \"Modaliteti Ambient\" është e dukshme - Fsheh \"Volumi i qëndrueshëm\" - Menyja \"Volumi i qëndrueshëm\" është e dukshme - Menyja \"Volumi i qëndrueshëm\" është e fshehur - - Fsheh \"Ndihmë & reagime\" - Menyja \"Ndihmë & reagime\" është e fshehur - Menyja \"Ndihmë & reagime\" është e dukshme - - Fsheh \"Shpejtësia e riprodhimit\" - Menyja \"Shpejtësia e riprodhimit\" është e fshehur - Menyja \"Shpejtësia e riprodhimit\" është e dukshme - - Fsheh \"Ekrani i kyçjes\" - Menyja \"Ekrani i kyçjes\" është e fshehur - Menyja \"Ekrani i kyçjes\" është e dukshme - - Fsheh Dëgjo me YouTube Music - Menyja Dëgjo me YouTube Music është fshehur - Menyja Dëgjo me YouTube Music është shfaqur - - Fsheh \"Shina e audios\" - Menyja \"Shina e audios\" është e fshehur - Menyja \"Shina e audios\" është e dukshme - + Fsheh titrat + Menyja e titrave është e fshehur + Menyja e titrave është e dukshme + + Fsheh \"Cilësimet shtesë\" + Menyja \"Cilësimet shtesë\" është e fshehur + Menyja \"Cilësimet shtesë\" është e dukshme + + Fsheh \"Koha e gjumit\" + Menyja \"Koha e gjumit\" është e fshehur + Menyja \"Koha e gjumit\" është e dukshme + + Fsheh \"Përsëritni videon\" + Menyja \"Përsëritni videon\" është e fshehur + Menyja \"Përsëritni videon\" është e dukshme + + Fsheh \"Modaliteti Ambient\" + Menyja \"Modaliteti Ambient\" është e fshehur + Menyja \"Modaliteti Ambient\" është e dukshme + Fsheh \"Volumi i qëndrueshëm\" + Menyja \"Volumi i qëndrueshëm\" është e dukshme + Menyja \"Volumi i qëndrueshëm\" është e fshehur + + Fsheh \"Ndihmë & reagime\" + Menyja \"Ndihmë & reagime\" është e fshehur + Menyja \"Ndihmë & reagime\" është e dukshme + + Fsheh \"Shpejtësia e riprodhimit\" + Menyja \"Shpejtësia e riprodhimit\" është e fshehur + Menyja \"Shpejtësia e riprodhimit\" është e dukshme + + Fsheh \"Ekrani i kyçjes\" + Menyja \"Ekrani i kyçjes\" është e fshehur + Menyja \"Ekrani i kyçjes\" është e dukshme + + Fsheh Dëgjo me YouTube Music + Menyja Dëgjo me YouTube Music është fshehur + Menyja Dëgjo me YouTube Music është shfaqur + + Fsheh \"Shina e audios\" + Menyja \"Shina e audios\" është e fshehur + Menyja \"Shina e audios\" është e dukshme + - "Menyja e gjurmës audio është e fshehur + "Menyja e gjurmës audio është e fshehur Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet video' në 'Android No SDK'" - - Fsheh \"Shikoni në VR\" - Menyja \"Shikoni në VR\" është e fshehur - Menyja \"Shikoni në VR\" është e dukshme - Fshih menunë e cilësisë së videos - Menyja e cilësisë së videos është fshehur - Menyja e cilësisë së videos është shfaqur - Fsheh fundin e menusë së cilësisë së videos - Funda e menusë së cilësisë së videos është e fshehur - Funda e menusë së cilësisë së videos është e dukshme - - - Fsheh butonin Autoplay - Butoni \"Riprodho automatikisht\" është i fshehur - Butoni \"Riprodho automatikisht\" është i dukshëm - - Fsheh butonin Nëntituj - Butoni i titrave është i fshehur - Butoni i titrave është i dukshëm - Fsheh butonin Transmeto - Butoni \"Transmeto\" është i fshehur - Butoni \"Transmeto\" është i dukshëm - Fshih sfondin e kontrollave të luajtësit - Sfondi i kontrolleve të luajtësit është i fshehur - Sfondi i kontrolleve të luajtësit është shfaqur. - Fsheh Butonat e Mëparshme & Tjetër - Butonat janë të fshehur - Butonat janë të dukshme - - - Fsheh kartat e ekranit të fundit - Kartat e ekranit të fundit janë të fshehura - Kartat e ekranit të fundit janë të dukshme - - - Çaktivizo modalitetin Ambient në ekran të plotë - \"Modaliteti Ambient\" është i çaktivizuar - \"Modaliteti Ambient\" është i aktivizuar - - - Fsheh kartat e informacionit - Kartat e informacionit janë të fshehura - Kartat e informacionit janë të dukshme - - - Çaktivizo animacionet e numrave rrotullues - Numrat rrotullues nuk janë të animuar - Numrat rrotullues janë të animuar - - - Fshih shiritin e kërkimit të luajtësit të videos - Shkalla e kërkimit e lojtarit të videos është e fshehur - Shkalla e kërkimit e lojtarit të videos është e dukshme - - Fshih shiritin e kërkimit të minikopjeve të videos - Shiriti i kërkimit të minikopjeve të videos është fshehur - Shiriti i kërkimit të minikopjeve të videos është shfaqur - - - Lojtari i Shorts - Fshih ose shfaq komponentët e luajtësit të Shorts - - Fshih \"Shorts\" në faqen kryesore. - Fshehur në faqen kryesore dhe videot e lidhura. - Shfaqur në faqen kryesore dhe videot e lidhura. - Fsheh Shorts në rezultatet e kërkimit - E fshehur në rezultatet e kërkimit - Shfaqen në rezultatet e kërkimit - - Fshih \"Shorts\" në burimin e Abonimeve. - Fshehur në burimin e Abonimeve. - Shfaqur në burimin e Abonimeve. - Fsheh Shorts në historinë e shikimit - Fshehur në historinë e shikimit - Shfaqet në historinë e shikimit - Fsheh etiketën \"Auto-dubluar\" - Etiketa e dubluar automatikisht është fshehur - Etiketa e dubluar automatikisht është shfaqur - Fsheh butonin \"Blej Super Falënderime\" - Butoni \"Blej Super Faleminderit\" është i fshehur. - Butoni \"Blej Super Faleminderit\" shfaqet. - Fshih butonin Efekt - Butoni i efektit është fshehur - Butoni i efektit është shfaqur - Fsheh butonin \"Ekran i gjelbër\" - Butoni \"Ekrani i gjelbër\" është i fshehur - Butoni \"Ekrani i gjelbër\" është i dukshëm - Fsheh butonin \"Hashtag\" - Butoni \"Hashtag\" është i fshehur - Butoni \"Hashtag\" është i dukshëm - - Fsheh butonin Bashko - Butoni \"Bashkohu\" është i fshehur - Butoni \"Bashkohu\" shfaqet - Fshih pamjen paraprake të drejtpërdrejtë - Parashikimi direkt është i fshehur - Parashikimi direkt është i shfaqur - Fsheh etiketën e vendndodhjes - Etiketë e vendndodhjes është e fshehur - Etiketë e vendndodhjes shfaqet - Fsheh butonin \"Postime të reja\" - Butoni i postimeve të reja është i fshehur - Butoni i postimeve të reja shfaqet - Fsheh butonat e mbivendosjes së ndalimit - Butonat e mbivendosjes së ndalimit janë të fshehur - Butonat e mbivendosjes së ndalimit shfaqen - Fshih komentin e shikimit paraprak - Komenti i shikimit paraprak është i fshehur - Parashikimi i komentit shfaqet - Fsheh butonin \"Ruaj muzikën\" - Butoni \"Ruaj muzikën\" është i fshehur - Butoni \"Ruaj muzikën\" shfaqet - Fsheh sugjerimet e kërkimit - Sugjerimet e kërkimit janë të fshehura - Sugjerimet e kërkimit janë të dukshme - Fsheh butonin Dyqan - Butoni \"Dyqani\" është i fshehur - Butoni \"Dyqani\" shfaqet - Fsheh stikers - Stikers janë të fshehura - Stikers janë të dukshme - Fsheh butonin Regjistrohu - Butoni \"Abono\" është i fshehur - Butoni \"Abono\" shfaqet - Fsheh produktet e etiketuara - Produktet e etiketuara janë të fshehur - Produktet e etiketuara shfaqen - Fshih butonin Në vazhdim - Butoni \"Të ardhshme\" është i fshehur - Butoni \"Të ardhshme\" është i dukshëm - Fsheh butonin \"Përdor këtë tingull\" - Butoni Përdor këtë tingull është fshehur - Butoni Përdor këtë tingull është shfaqur - Fsheh butonin \"Përdor këtë shabllon\" - Butoni Përdor këtë shabllon është fshehur - Butoni Përdor këtë shabllon është shfaqur - Fshih animacionin e shpërdërjes së Të Pëlqejt - Animacioni i fontanës \"Pëlqen\" është i fshehur - Animacioni i fontanës \"Pëlqen\" është i dukshëm - Fsheh butonin Të Pëlqej - Butoni \"Pëlqen\" është i fshehur - Butoni \"Pëlqen\" është i dukshëm - Fsheh butonin Jo Të Pëlqej - Butoni \"Nuk më pëlqen\" është i fshehur - Butoni \"Nuk më pëlqen\" është i dukshëm - Fsheh butonin Komentet - Butoni \"Komentet\" është i fshehur - Butoni \"Komentet\" është i dukshëm - - Fsheh butonin Ndani - Butoni \"Ndani\" është i fshehur - Butoni \"Ndani\" është i dukshëm - - Fsheh butonin Remix - Butoni \"Remix\" është i fshehur - Butoni \"Remix\" është i dukshëm - Fsheh butonin \"Zëri\" - Butoni \"Zëri\" është i fshehur - Butoni \"Zëri\" është i dukshëm - Fsheh panelin e informacioneve - Paneli i informacionit është i fshehur - Paneli i informacionit është i dukshëm - Fsheh shiritin e kanalit - Shiriti i kanalit është i fshehur - Shiriti i kanalit është i dukshëm - Fsheh titullin e videos - Titulli i videos është i fshehur. - Titulli i videos shfaqet. - Fsheh etiketën e metadatave të zërit - Etiketa e metadatës së zërit është e fshehur. - Etiketa e metadatës së zërit shfaqet. - Fshih etiketën e lidhjes së videos - Etiketë lidhje video është e fshehur - Etiketë lidhje video është e dukshme - Fsheh shiritin e navigimit - Shiriti i navigimit është i fshehur - Shiriti i navigimit është i dukshëm - - - Fshih videon e sugjeruar në ekranin fundor - "Videoja e sugjeruar në ekranin fundor fshihet kur çaktivizohet luajtja automatike + + Fsheh \"Shikoni në VR\" + Menyja \"Shikoni në VR\" është e fshehur + Menyja \"Shikoni në VR\" është e dukshme + Fshih menunë e cilësisë së videos + Menyja e cilësisë së videos është fshehur + Menyja e cilësisë së videos është shfaqur + Fsheh fundin e menusë së cilësisë së videos + Funda e menusë së cilësisë së videos është e fshehur + Funda e menusë së cilësisë së videos është e dukshme + + + Fsheh butonin Autoplay + Butoni \"Riprodho automatikisht\" është i fshehur + Butoni \"Riprodho automatikisht\" është i dukshëm + + Fsheh butonin Nëntituj + Butoni i titrave është i fshehur + Butoni i titrave është i dukshëm + Fsheh butonin Transmeto + Butoni \"Transmeto\" është i fshehur + Butoni \"Transmeto\" është i dukshëm + Fshih sfondin e kontrollave të luajtësit + Sfondi i kontrolleve të luajtësit është i fshehur + Sfondi i kontrolleve të luajtësit është shfaqur. + Fsheh Butonat e Mëparshme & Tjetër + Butonat janë të fshehur + Butonat janë të dukshme + + + Fsheh kartat e ekranit të fundit + Kartat e ekranit të fundit janë të fshehura + Kartat e ekranit të fundit janë të dukshme + + + Çaktivizo modalitetin Ambient në ekran të plotë + \"Modaliteti Ambient\" është i çaktivizuar + \"Modaliteti Ambient\" është i aktivizuar + + + Fsheh kartat e informacionit + Kartat e informacionit janë të fshehura + Kartat e informacionit janë të dukshme + + + Çaktivizo animacionet e numrave rrotullues + Numrat rrotullues nuk janë të animuar + Numrat rrotullues janë të animuar + + + Fshih shiritin e kërkimit të luajtësit të videos + Shkalla e kërkimit e lojtarit të videos është e fshehur + Shkalla e kërkimit e lojtarit të videos është e dukshme + + Fshih shiritin e kërkimit të minikopjeve të videos + Shiriti i kërkimit të minikopjeve të videos është fshehur + Shiriti i kërkimit të minikopjeve të videos është shfaqur + + + Lojtari i Shorts + Fshih ose shfaq komponentët e luajtësit të Shorts + + Fshih \"Shorts\" në faqen kryesore. + Fshehur në faqen kryesore dhe videot e lidhura. + Shfaqur në faqen kryesore dhe videot e lidhura. + Fsheh Shorts në rezultatet e kërkimit + E fshehur në rezultatet e kërkimit + Shfaqen në rezultatet e kërkimit + + Fshih \"Shorts\" në burimin e Abonimeve. + Fshehur në burimin e Abonimeve. + Shfaqur në burimin e Abonimeve. + Fsheh Shorts në historinë e shikimit + Fshehur në historinë e shikimit + Shfaqet në historinë e shikimit + Fsheh etiketën \"Auto-dubluar\" + Etiketa e dubluar automatikisht është fshehur + Etiketa e dubluar automatikisht është shfaqur + Fsheh butonin \"Blej Super Falënderime\" + Butoni \"Blej Super Faleminderit\" është i fshehur. + Butoni \"Blej Super Faleminderit\" shfaqet. + Fshih butonin Efekt + Butoni i efektit është fshehur + Butoni i efektit është shfaqur + Fsheh butonin \"Ekran i gjelbër\" + Butoni \"Ekrani i gjelbër\" është i fshehur + Butoni \"Ekrani i gjelbër\" është i dukshëm + Fsheh butonin \"Hashtag\" + Butoni \"Hashtag\" është i fshehur + Butoni \"Hashtag\" është i dukshëm + + Fsheh butonin Bashko + Butoni \"Bashkohu\" është i fshehur + Butoni \"Bashkohu\" shfaqet + Fshih pamjen paraprake të drejtpërdrejtë + Parashikimi direkt është i fshehur + Parashikimi direkt është i shfaqur + Fsheh etiketën e vendndodhjes + Etiketë e vendndodhjes është e fshehur + Etiketë e vendndodhjes shfaqet + Fsheh butonin \"Postime të reja\" + Butoni i postimeve të reja është i fshehur + Butoni i postimeve të reja shfaqet + Fsheh butonat e mbivendosjes së ndalimit + Butonat e mbivendosjes së ndalimit janë të fshehur + Butonat e mbivendosjes së ndalimit shfaqen + Fshih komentin e shikimit paraprak + Komenti i shikimit paraprak është i fshehur + Parashikimi i komentit shfaqet + Fsheh butonin \"Ruaj muzikën\" + Butoni \"Ruaj muzikën\" është i fshehur + Butoni \"Ruaj muzikën\" shfaqet + Fsheh sugjerimet e kërkimit + Sugjerimet e kërkimit janë të fshehura + Sugjerimet e kërkimit janë të dukshme + Fsheh butonin Dyqan + Butoni \"Dyqani\" është i fshehur + Butoni \"Dyqani\" shfaqet + Fsheh stikers + Stikers janë të fshehura + Stikers janë të dukshme + Fsheh butonin Regjistrohu + Butoni \"Abono\" është i fshehur + Butoni \"Abono\" shfaqet + Fsheh produktet e etiketuara + Produktet e etiketuara janë të fshehur + Produktet e etiketuara shfaqen + Fshih butonin Në vazhdim + Butoni \"Të ardhshme\" është i fshehur + Butoni \"Të ardhshme\" është i dukshëm + Fsheh butonin \"Përdor këtë tingull\" + Butoni Përdor këtë tingull është fshehur + Butoni Përdor këtë tingull është shfaqur + Fsheh butonin \"Përdor këtë shabllon\" + Butoni Përdor këtë shabllon është fshehur + Butoni Përdor këtë shabllon është shfaqur + Fshih animacionin e shpërdërjes së Të Pëlqejt + Animacioni i fontanës \"Pëlqen\" është i fshehur + Animacioni i fontanës \"Pëlqen\" është i dukshëm + Fsheh butonin Të Pëlqej + Butoni \"Pëlqen\" është i fshehur + Butoni \"Pëlqen\" është i dukshëm + Fsheh butonin Jo Të Pëlqej + Butoni \"Nuk më pëlqen\" është i fshehur + Butoni \"Nuk më pëlqen\" është i dukshëm + Fsheh butonin Komentet + Butoni \"Komentet\" është i fshehur + Butoni \"Komentet\" është i dukshëm + + Fsheh butonin Ndani + Butoni \"Ndani\" është i fshehur + Butoni \"Ndani\" është i dukshëm + + Fsheh butonin Remix + Butoni \"Remix\" është i fshehur + Butoni \"Remix\" është i dukshëm + Fsheh butonin \"Zëri\" + Butoni \"Zëri\" është i fshehur + Butoni \"Zëri\" është i dukshëm + Fsheh panelin e informacioneve + Paneli i informacionit është i fshehur + Paneli i informacionit është i dukshëm + Fsheh shiritin e kanalit + Shiriti i kanalit është i fshehur + Shiriti i kanalit është i dukshëm + Fsheh titullin e videos + Titulli i videos është i fshehur. + Titulli i videos shfaqet. + Fsheh etiketën e metadatave të zërit + Etiketa e metadatës së zërit është e fshehur. + Etiketa e metadatës së zërit shfaqet. + Fshih etiketën e lidhjes së videos + Etiketë lidhje video është e fshehur + Etiketë lidhje video është e dukshme + Fsheh shiritin e navigimit + Shiriti i navigimit është i fshehur + Shiriti i navigimit është i dukshëm + + + Fshih videon e sugjeruar në ekranin fundor + "Videoja e sugjeruar në ekranin fundor fshihet kur çaktivizohet luajtja automatike Luajtja automatike mund të ndryshohet në cilësimet e YouTube: Cilësimet → Luajtja → Luaj automatikisht videon tjetër" - Videoja e sugjeruar në ekranin fundor shfaqet - - - Fshih mbivendosjen e videove të lidhura. - Mbivendosja e videove të lidhura në ekran të plotë është e fshehur. - Mbivendosja e videove të lidhura në ekran të plotë shfaqet. - - - Fsheh vulën e kohës së videos - Vula e kohës është e fshehur - Vula e kohës është e dukshme - - - Fsheh panelet pop-up të riprodhuesit - Panelet pop-up të riprodhuesit janë të fshehura - Panelet pop-up të riprodhuesit janë të dukshme - - - Dilni nga gjithëshkëmbja në fund të videos - Çaktivizuar - Portret - Peisazh - Portret dhe peisazh - - - Hap videot në ekran të plotë portret - Videot hapen në ekran të plotë - Videot nuk hapen në ekran të plotë - - - Opaciteti i mbivendosjes së riprodhuesit - Vlera e opacitetit midis 0-100, ku 0 është transparent - Opaciteti i mbivendosjes së riprodhuesit duhet të jetë midis 0-100 - - - - Nuk pëlqen përkohësisht nuk është në dispozicion (API ka kaluar kohën) - \"Nuk më pëlqen\" nuk është në dispozicion (statusi %d) - Pëlqimet nuk janë të disponueshme (limiti i API-së së klientit) - \"Nuk më pëlqen\" nuk është në dispozicion (%s) - - Rikarkoni videon për të votuar duke përdorur Return YouTube Dislike - - Fshehur nga pronari - \"Nuk më pëlqen\" janë të dukshme - \"Nuk më pëlqen\" nuk janë të dukshme - Shfaq \"Nuk më pëlqen\" në Shorts - "Mospëlqimet në Shorts janë të shfaqura + Videoja e sugjeruar në ekranin fundor shfaqet + + + Fshih mbivendosjen e videove të lidhura. + Mbivendosja e videove të lidhura në ekran të plotë është e fshehur. + Mbivendosja e videove të lidhura në ekran të plotë shfaqet. + + + Fsheh vulën e kohës së videos + Vula e kohës është e fshehur + Vula e kohës është e dukshme + + + Fsheh panelet pop-up të riprodhuesit + Panelet pop-up të riprodhuesit janë të fshehura + Panelet pop-up të riprodhuesit janë të dukshme + + + Dilni nga gjithëshkëmbja në fund të videos + Çaktivizuar + Portret + Peisazh + Portret dhe peisazh + + + Hap videot në ekran të plotë portret + Videot hapen në ekran të plotë + Videot nuk hapen në ekran të plotë + + + Opaciteti i mbivendosjes së riprodhuesit + Vlera e opacitetit midis 0-100, ku 0 është transparent + Opaciteti i mbivendosjes së riprodhuesit duhet të jetë midis 0-100 + + + + Nuk pëlqen përkohësisht nuk është në dispozicion (API ka kaluar kohën) + \"Nuk më pëlqen\" nuk është në dispozicion (statusi %d) + Pëlqimet nuk janë të disponueshme (limiti i API-së së klientit) + \"Nuk më pëlqen\" nuk është në dispozicion (%s) + + Rikarkoni videon për të votuar duke përdorur Return YouTube Dislike + + Fshehur nga pronari + \"Nuk më pëlqen\" janë të dukshme + \"Nuk më pëlqen\" nuk janë të dukshme + Shfaq \"Nuk më pëlqen\" në Shorts + "Mospëlqimet në Shorts janë të shfaqura Kufizimi: Mospëlqimet mund të mos shfaqen në modalitetin incognito" - Mospëlqimet në Shorts nuk janë të shfaqura - \"Nuk më pëlqen\" si përqindje - Mospëlqimet shfaqen si përqindje - Mospëlqimet shfaqen si numër - - Butoni i thjeshtëzuar Të Pëlqej - Butoni \"Pëlqen\" i stiluar për gjerësi minimale - Butoni \"Pëlqen\" i stiluar për paraqitje më të mirë - Shfaq pëlqimet e vlerësuara - Videot me pëlqime të çaktivizuara tregojnë një numër të vlerësuar pëlqimesh - Pëlqimet e vlerësuara nuk shfaqen - Shfaq një toast nëse API nuk është në dispozicion - Toast shfaqet nëse Return YouTube Dislike nuk është në dispozicion - Toast nuk shfaqet nëse Return YouTube Dislike nuk është në dispozicion - Të dhënat ofrohen nga Return YouTube Dislike API. Prekni këtu për të mësuar më shumë - - Statistikat e ReturnYouTubeDislike API të këtij pajisje - Koha e përgjigjes së API, mesatarja - Koha e përgjigjes së API, minimale - Koha e përgjigjes së API-së, maksimumi - Koha e përgjigjes së API-së, videoja e fundit - Dislike-t nuk janë të disponueshme përkohësisht - Kuota e API-së së klientit është e aktivizuar - Fiksim i votave të API-së, numri i thirrjeve - Nuk janë bërë thirrje rrjeti - Janë bërë %d thirrje rrjeti - Fiksim i votave të API-së, numri i kalimit të kohës së kufizuar - Nuk janë kaluar thirrjet e rrjetit - %d thirrje rrjeti kanë kaluar kohën e kufizuar - Kuota e klientit të API-së - Nuk është hasur asnjë kufizim i klientit - Kuota e klientit është hasur %d herë - %d milisekonda - - - Aktivizo shiritin e gjerë kërkimi - Shiriti i gjerë kërkimi është i aktivizuar - Shiriti i gjerë kërkimi është i deaktivizuar - - - Aktivizo miniatiurat me cilësi të lartë - Miniatiurat e shiritit të kërkimi janë me cilësi të lartë - Miniatiurat e shiritit të kërkimi janë me cilësi të mesme - "Kjo gjithashtu do të rikthejë miniaturat në transmetimet live që nuk kanë miniatura seekbar. + Mospëlqimet në Shorts nuk janë të shfaqura + \"Nuk më pëlqen\" si përqindje + Mospëlqimet shfaqen si përqindje + Mospëlqimet shfaqen si numër + + Butoni i thjeshtëzuar Të Pëlqej + Butoni \"Pëlqen\" i stiluar për gjerësi minimale + Butoni \"Pëlqen\" i stiluar për paraqitje më të mirë + Shfaq pëlqimet e vlerësuara + Videot me pëlqime të çaktivizuara tregojnë një numër të vlerësuar pëlqimesh + Pëlqimet e vlerësuara nuk shfaqen + Shfaq një toast nëse API nuk është në dispozicion + Toast shfaqet nëse Return YouTube Dislike nuk është në dispozicion + Toast nuk shfaqet nëse Return YouTube Dislike nuk është në dispozicion + Të dhënat ofrohen nga Return YouTube Dislike API. Prekni këtu për të mësuar më shumë + + Statistikat e ReturnYouTubeDislike API të këtij pajisje + Koha e përgjigjes së API, mesatarja + Koha e përgjigjes së API, minimale + Koha e përgjigjes së API-së, maksimumi + Koha e përgjigjes së API-së, videoja e fundit + Dislike-t nuk janë të disponueshme përkohësisht - Kuota e API-së së klientit është e aktivizuar + Fiksim i votave të API-së, numri i thirrjeve + Nuk janë bërë thirrje rrjeti + Janë bërë %d thirrje rrjeti + Fiksim i votave të API-së, numri i kalimit të kohës së kufizuar + Nuk janë kaluar thirrjet e rrjetit + %d thirrje rrjeti kanë kaluar kohën e kufizuar + Kuota e klientit të API-së + Nuk është hasur asnjë kufizim i klientit + Kuota e klientit është hasur %d herë + %d milisekonda + + + Aktivizo shiritin e gjerë kërkimi + Shiriti i gjerë kërkimi është i aktivizuar + Shiriti i gjerë kërkimi është i deaktivizuar + + + Aktivizo miniatiurat me cilësi të lartë + Miniatiurat e shiritit të kërkimi janë me cilësi të lartë + Miniatiurat e shiritit të kërkimi janë me cilësi të mesme + "Kjo gjithashtu do të rikthejë miniaturat në transmetimet live që nuk kanë miniatura seekbar. Miniaturat seekbar do të përdorin të njëjtën cilësi me videon aktuale. Kjo veçori funksionon më mirë me një cilësi video prej 720p ose më të ulët dhe kur përdor një lidhje interneti shumë të shpejtë." - Rivendos miniatiurat e vjetra të shiritit të kërkimit - Miniatiurat e shiritit të kërkimit do të shfaqen mbi shiritin e kërkimit - Miniatiurat e shiritit të kërkimit do të shfaqen në ekran të plotë - - - Aktivizo SponsorBlock - SponsorBlock është një sistem me burim të shpërndarë për të hequr pjesët e bezdisshme të videove të YouTube - Pamja - Shfaq butonin e votimit - Butoni i votimit të segmentit shfaqet - Butoni i votimit të segmentit nuk shfaqet - Përdor paraqitjen katrore - Butonat dhe kontrollet janë katrore - Butonat dhe kontrollet janë të rrumbullakosura - - Përdor butonin kompakt Kalo - Butoni i kalimit është i stiluar për gjerësinë minimale - Butoni i kalimit është i stiluar për pamjen më të mirë - Fshih automatikisht butonin Kalo - Butoni i kalimit fshihet pas disa sekondash - Butoni Kalo është i shfaqur për të gjithë segmentin - Kohëzgjatja e butonit të kapërcimit - Sa gjatë të shfaqen butonat \"kapërce\" dhe \"kapërce te pika kryesore\" përpara fshehjes automatike - Shfaq njoftimin e zhbërjes së anashkalimit - Njoftimi shfaqet kur një segment anashkalohet automatikisht. Prek njoftimin për të zhbërë anashkalimin - Njoftimi i shkurtër nuk shfaqet - Kohëzgjatja e njoftimit të kapërcimit - Sa gjatë të shfaqet njoftimi i përkohshëm për zhbërjen e kapërcimit - 1 sekondë - 2 sekonda - 3 sekonda - 4 sekonda - 5 sekonda - 6 sekonda - 7 sekonda - 8 sekonda - 9 sekonda - 10 sekonda - Shfaq kohën e videos pa segmente - Gjatësia e videos minus të gjitha segmentet shfaqet në shiritin e kërkimit - Kohëzgjatja e plotë e videos tregohet - Krijimi i segmenteve të reja - Shfaq butonin Krijo segment të ri - Butoni i krijimit të segmentit të ri shfaqet - Butoni i krijimit të segmentit të ri nuk shfaqet - Rregullo hapin e segmentit të ri - Numri i milisekondave që lëvizin butonat e rregullimit të kohës gjatë krijimit të segmenteve të reja - Vlera duhet të jetë një numër pozitiv - Shiko udhëzimet - Udhëzimet përmbajnë rregulla dhe këshilla për krijimin e segmenteve të reja - Ndiq udhëzimet - Lexo udhëzimet e SponsorBlock para se të krijosh segmente të reja - I kam lexuar tashmë - Trego më - Të përgjithshme - Shfaq një lajmërim nëse API nuk është i disponueshëm - Lajmërimi shfaqet nëse SponsorBlock nuk është i disponueshëm - Lajmërimi nuk shfaqet nëse SponsorBlock nuk është i disponueshëm - Aktivizo ndjekjen e numrit të kalimeve - Lejon që tabela e renditjes së SponsorBlock të dijë se sa kohë është ruajtur. Një mesazh dërgohet në tabelën e renditjes çdo herë që një segment kalon - Ndjekja e numrit të kalimeve nuk është e aktivizuar - Kohëzgjatja minimale e segmentit - Segmentet më të shkurtra se kjo vlerë (në sekonda) nuk do të shfaqen ose nuk do të kalohen - Kohëzgjatje e pavlefshme kohore - ID-ja juaj private e përdoruesit - Kjo duhet të mbahet private. Kjo është si një fjalëkalim dhe nuk duhet të ndahet me askënd. Nëse dikush ka këtë, ai mund të personifikojë ty - ID-ja private e përdoruesit duhet të jetë të paktën 30 karaktere e gjatë - Ndrysho URL-në e API-së - Adresa që SponsorBlock përdor për të bërë thirrje në server - URL-ja e API-së është vendosur përsëri - URL-ja e API-së nuk është e vlefshme - URL-ja e API-së është ndryshuar - Importo/Eksporto cilësimet - Kopjo - Konfigurimi juaj JSON i SponsorBlock që mund të importohet/eksportohet në ReVanced dhe platformat e tjera të SponsorBlock - Konfigurimi juaj JSON i SponsorBlock që mund të importohet/eksportohet në ReVanced dhe platformat e tjera të SponsorBlock. Kjo përfshin ID-në tuaj private të përdoruesit. Sigurohuni që ta ndani këtë me mençuri - Cilimiset janë importuar me sukses - Dështimi i importit: %s - Dështimi i eksportit: %s - "Caktimi juaj i settings përmban një user id personal SponsorBlock. + Rivendos miniatiurat e vjetra të shiritit të kërkimit + Miniatiurat e shiritit të kërkimit do të shfaqen mbi shiritin e kërkimit + Miniatiurat e shiritit të kërkimit do të shfaqen në ekran të plotë + + + Aktivizo SponsorBlock + SponsorBlock është një sistem me burim të shpërndarë për të hequr pjesët e bezdisshme të videove të YouTube + Pamja + Shfaq butonin e votimit + Butoni i votimit të segmentit shfaqet + Butoni i votimit të segmentit nuk shfaqet + Përdor paraqitjen katrore + Butonat dhe kontrollet janë katrore + Butonat dhe kontrollet janë të rrumbullakosura + + Përdor butonin kompakt Kalo + Butoni i kalimit është i stiluar për gjerësinë minimale + Butoni i kalimit është i stiluar për pamjen më të mirë + Fshih automatikisht butonin Kalo + Butoni i kalimit fshihet pas disa sekondash + Butoni Kalo është i shfaqur për të gjithë segmentin + Kohëzgjatja e butonit të kapërcimit + Sa gjatë të shfaqen butonat \"kapërce\" dhe \"kapërce te pika kryesore\" përpara fshehjes automatike + Shfaq njoftimin e zhbërjes së anashkalimit + Njoftimi shfaqet kur një segment anashkalohet automatikisht. Prek njoftimin për të zhbërë anashkalimin + Njoftimi i shkurtër nuk shfaqet + Kohëzgjatja e njoftimit të kapërcimit + Sa gjatë të shfaqet njoftimi i përkohshëm për zhbërjen e kapërcimit + 1 sekondë + 2 sekonda + 3 sekonda + 4 sekonda + 5 sekonda + 6 sekonda + 7 sekonda + 8 sekonda + 9 sekonda + 10 sekonda + Shfaq kohën e videos pa segmente + Gjatësia e videos minus të gjitha segmentet shfaqet në shiritin e kërkimit + Kohëzgjatja e plotë e videos tregohet + Krijimi i segmenteve të reja + Shfaq butonin Krijo segment të ri + Butoni i krijimit të segmentit të ri shfaqet + Butoni i krijimit të segmentit të ri nuk shfaqet + Rregullo hapin e segmentit të ri + Numri i milisekondave që lëvizin butonat e rregullimit të kohës gjatë krijimit të segmenteve të reja + Vlera duhet të jetë një numër pozitiv + Shiko udhëzimet + Udhëzimet përmbajnë rregulla dhe këshilla për krijimin e segmenteve të reja + Ndiq udhëzimet + Lexo udhëzimet e SponsorBlock para se të krijosh segmente të reja + I kam lexuar tashmë + Trego më + Të përgjithshme + Shfaq një lajmërim nëse API nuk është i disponueshëm + Lajmërimi shfaqet nëse SponsorBlock nuk është i disponueshëm + Lajmërimi nuk shfaqet nëse SponsorBlock nuk është i disponueshëm + Aktivizo ndjekjen e numrit të kalimeve + Lejon që tabela e renditjes së SponsorBlock të dijë se sa kohë është ruajtur. Një mesazh dërgohet në tabelën e renditjes çdo herë që një segment kalon + Ndjekja e numrit të kalimeve nuk është e aktivizuar + Kohëzgjatja minimale e segmentit + Segmentet më të shkurtra se kjo vlerë (në sekonda) nuk do të shfaqen ose nuk do të kalohen + Kohëzgjatje e pavlefshme kohore + ID-ja juaj private e përdoruesit + Kjo duhet të mbahet private. Kjo është si një fjalëkalim dhe nuk duhet të ndahet me askënd. Nëse dikush ka këtë, ai mund të personifikojë ty + ID-ja private e përdoruesit duhet të jetë të paktën 30 karaktere e gjatë + Ndrysho URL-në e API-së + Adresa që SponsorBlock përdor për të bërë thirrje në server + URL-ja e API-së është vendosur përsëri + URL-ja e API-së nuk është e vlefshme + URL-ja e API-së është ndryshuar + Importo/Eksporto cilësimet + Kopjo + Konfigurimi juaj JSON i SponsorBlock që mund të importohet/eksportohet në ReVanced dhe platformat e tjera të SponsorBlock + Konfigurimi juaj JSON i SponsorBlock që mund të importohet/eksportohet në ReVanced dhe platformat e tjera të SponsorBlock. Kjo përfshin ID-në tuaj private të përdoruesit. Sigurohuni që ta ndani këtë me mençuri + Cilimiset janë importuar me sukses + Dështimi i importit: %s + Dështimi i eksportit: %s + "Caktimi juaj i settings përmban një user id personal SponsorBlock. User id juaj është si një fjalëkalim dhe nuk duhet të ndahet kurrë." - Mos e trego përsëri - Ndrysho sjelljen e segmentit - Promovim i paguar, referime të paguara dhe reklama direkte. Jo për vetë-promovim ose përshëndetje falas për shkaqe/krijues/faqe interneti/produkte që i pëlqejnë - Promovim i papaguar/Vetë-Promovim - E ngjashme me Sponsorin, por për promovimin e papaguar ose vetjak. Përfshin seksionet për mallrat, donacionet ose informacionin në lidhje me personin me të cilin kanë bashkëpunuar - Shënim i bashkëveprimit (Regjistrohu) - Një kujtesë e shkurtër për të pëlqyer, për t\'u abonuar ose për t\'i ndjekur ata në mes të përmbajtjes. Nëse është e gjatë ose për diçka specifike, ajo duhet të jetë në vend të kësaj nën promovimin e vetë - Theks - Pjesa e videos që shumica e njerëzve po kërkojnë - Animacione e ndërprerjes/hyrjes - Një interval pa përmbajtje aktuale. Mund të jetë një pauzë, kornizë statike ose animacion që përsëritet. Nuk përfshin tranzicionet që përmbajnë informacion - Kartëmonedha të fundit / Kredite - Kreditet ose kur shfaqen ekranet e fundit të YouTube. Jo për përfundime me informacion - Hyrje / Përshëndetje - Trailer të treguar për videon e ardhshme, përshëndetje dhe lamtumira. Nuk përfshin seksione që shtojnë përmbajtje shtesë - Parashikim / Përmbledhje - Koleksion i klipeve që tregojnë çfarë po vjen ose çfarë ndodhi në video ose në video të tjera të një serie, ku i gjithë informacioni përsëritet diku tjetër - Devijim / Shaka - Skena anësore ose shaka që nuk janë të nevojshme për të kuptuar përmbajtjen kryesore të videos. Nuk përfshin seksione që ofrojnë kontekst ose detaje sfondore - Muzika: Seksioni jo-muzikor - Vetëm për përdorim në videot muzikore. Seksione të videove muzikore pa muzikë, që nuk janë mbuluar tashmë nga një kategori tjetër - Kapërci - Theksoni - Kapërci sponsorin - Kapërci promovimin - Kapërci ndërveprimin - Kapërci në theksimin - Kapërci hyrjen - Kapërci ndërprerjen - Kapërci ndërprerjen - Kapërci daljen - Kapërceje hapjen - Kapërci parashikimin - Kapërci parashikimin - Kapërci përmbledhjen - Kapërceje tangjenten - Kapërci jo-muzikën - Kapërci segmentin - Kapërcyer sponsorin - Kapërcyer vetë-promovimin - Kapërcyer kujtesën e bezdisshme - Kapërcyer në theksimin - Kapërcyer hyrjen - Kapërcyer ndërprerjen - Kapërcyer ndërprerjen - Kapërcyer daljen - Hapja u kapërcye - Kapërcyer parashikimin - Kapërcyer parashikimin - Kapërcyer përmbledhjen - Tangjentja u kapërcye - Kapërcyer një seksion jo-muzikor - Kapërcyer segmentin e papërpunuar - Kapërcyer segmente të shumta - Kapërci automatikisht - Kapërci automatikisht një herë - Shfaq një buton Kalo - Shfaqni në shiritin e kërkimit - Çaktivizo - Nuk mund të dorëzohet segmenti: %s - SponsorBlock është përkohësisht jashtë funksionit - Nuk mund të dorëzohet segmenti (statusi: %1$d %2$s) - Nuk mund të dorëzohet segmenti. Limit i shkallës (shumë nga i njëjti përdorues ose IP) - Nuk mund të dorëzohet segmenti: %s - "Nuk mund të dorëzohet segmenti. + Mos e trego përsëri + Ndrysho sjelljen e segmentit + Promovim i paguar, referime të paguara dhe reklama direkte. Jo për vetë-promovim ose përshëndetje falas për shkaqe/krijues/faqe interneti/produkte që i pëlqejnë + Promovim i papaguar/Vetë-Promovim + E ngjashme me Sponsorin, por për promovimin e papaguar ose vetjak. Përfshin seksionet për mallrat, donacionet ose informacionin në lidhje me personin me të cilin kanë bashkëpunuar + Shënim i bashkëveprimit (Regjistrohu) + Një kujtesë e shkurtër për të pëlqyer, për t\'u abonuar ose për t\'i ndjekur ata në mes të përmbajtjes. Nëse është e gjatë ose për diçka specifike, ajo duhet të jetë në vend të kësaj nën promovimin e vetë + Theks + Pjesa e videos që shumica e njerëzve po kërkojnë + Animacione e ndërprerjes/hyrjes + Një interval pa përmbajtje aktuale. Mund të jetë një pauzë, kornizë statike ose animacion që përsëritet. Nuk përfshin tranzicionet që përmbajnë informacion + Kartëmonedha të fundit / Kredite + Kreditet ose kur shfaqen ekranet e fundit të YouTube. Jo për përfundime me informacion + Hyrje / Përshëndetje + Trailer të treguar për videon e ardhshme, përshëndetje dhe lamtumira. Nuk përfshin seksione që shtojnë përmbajtje shtesë + Parashikim / Përmbledhje + Koleksion i klipeve që tregojnë çfarë po vjen ose çfarë ndodhi në video ose në video të tjera të një serie, ku i gjithë informacioni përsëritet diku tjetër + Devijim / Shaka + Skena anësore ose shaka që nuk janë të nevojshme për të kuptuar përmbajtjen kryesore të videos. Nuk përfshin seksione që ofrojnë kontekst ose detaje sfondore + Muzika: Seksioni jo-muzikor + Vetëm për përdorim në videot muzikore. Seksione të videove muzikore pa muzikë, që nuk janë mbuluar tashmë nga një kategori tjetër + Kapërci + Theksoni + Kapërci sponsorin + Kapërci promovimin + Kapërci ndërveprimin + Kapërci në theksimin + Kapërci hyrjen + Kapërci ndërprerjen + Kapërci ndërprerjen + Kapërci daljen + Kapërceje hapjen + Kapërci parashikimin + Kapërci parashikimin + Kapërci përmbledhjen + Kapërceje tangjenten + Kapërci jo-muzikën + Kapërci segmentin + Kapërcyer sponsorin + Kapërcyer vetë-promovimin + Kapërcyer kujtesën e bezdisshme + Kapërcyer në theksimin + Kapërcyer hyrjen + Kapërcyer ndërprerjen + Kapërcyer ndërprerjen + Kapërcyer daljen + Hapja u kapërcye + Kapërcyer parashikimin + Kapërcyer parashikimin + Kapërcyer përmbledhjen + Tangjentja u kapërcye + Kapërcyer një seksion jo-muzikor + Kapërcyer segmentin e papërpunuar + Kapërcyer segmente të shumta + Kapërci automatikisht + Kapërci automatikisht një herë + Shfaq një buton Kalo + Shfaqni në shiritin e kërkimit + Çaktivizo + Nuk mund të dorëzohet segmenti: %s + SponsorBlock është përkohësisht jashtë funksionit + Nuk mund të dorëzohet segmenti (statusi: %1$d %2$s) + Nuk mund të dorëzohet segmenti. Limit i shkallës (shumë nga i njëjti përdorues ose IP) + Nuk mund të dorëzohet segmenti: %s + "Nuk mund të dorëzohet segmenti. Ekziston tashmë" - Segmenti u dorëzua me sukses - - SponsorBlock është përkohësisht i padisponueshëm (API-ja ka tejkaluar kohën) - SponsorBlock është përkohësisht i padisponueshëm (statusi %d) - SponsorBlock është përkohësisht i padisponueshëm - Nuk mund të votoj për segmentin (API-ja ka tejkaluar kohën) - Nuk mund të votoj për segmentin (statusi: %1$d %2$s) - Nuk mund të votoj për segmentin: %s - Voto lart - Voto poshtë - Ndrysho kategorinë - Nuk ka segmente për të votuar - - %1$s në %2$s - Zgjidhni kategorinë e segmentit - Kategoria është e çaktivizuar në cilësime. Aktivizo kategorinë për të dorëzuar. - Segment i ri SponsorBlock - Vendos %s si fillimin ose fundin e një segmenti të ri? - Fillimi - Fundi - Tani - Koha kur fillon segmenti - Koha kur mbaron segmenti - A janë kohët e sakta? - "Segmenti eshte nga + Segmenti u dorëzua me sukses + + SponsorBlock është përkohësisht i padisponueshëm (API-ja ka tejkaluar kohën) + SponsorBlock është përkohësisht i padisponueshëm (statusi %d) + SponsorBlock është përkohësisht i padisponueshëm + Nuk mund të votoj për segmentin (API-ja ka tejkaluar kohën) + Nuk mund të votoj për segmentin (statusi: %1$d %2$s) + Nuk mund të votoj për segmentin: %s + Voto lart + Voto poshtë + Ndrysho kategorinë + Nuk ka segmente për të votuar + + %1$s në %2$s + Zgjidhni kategorinë e segmentit + Kategoria është e çaktivizuar në cilësime. Aktivizo kategorinë për të dorëzuar. + Segment i ri SponsorBlock + Vendos %s si fillimin ose fundin e një segmenti të ri? + Fillimi + Fundi + Tani + Koha kur fillon segmenti + Koha kur mbaron segmenti + A janë kohët e sakta? + "Segmenti eshte nga %1$s dhe %2$s @@ -1276,46 +1275,46 @@ dhe %2$s (%3$s) Gati per te dhene?" - Fillimi duhet të jetë para fundit - Shëno dy lokacione në shiritin e kohës së pari - Parashiko segmentin dhe sigurohu që ai të kapërcehet pa probleme - Redakto kohën e segmentit manualisht - Dëshironi të redaktoni kohën për fillimin ose fundin e segmentit? - Kohë e pavlefshme e dhënë - Statistikat - - Statistikat aktualisht nuk janë të disponueshme (API nuk funksionon) - Po ngarkohet... - SponsorBlock është i çaktivizuar - Emri juaj i përdoruesit: <b>%s</b> - Prekni këtu për të ndryshuar emrin tuaj të përdoruesit - Nuk mund të ndryshohet emri i përdoruesit: Statusi: %1$d %2$s - Emri i përdoruesit u ndryshua me sukses - Reputacioni juaj është <b>%.2f</b> - Keni krijuar <b>%s</b> segmente - Prekni këtu për të parë segmentet tuaja - Tabela e liderëve SponsorBlock - Keni shpëtuar njerëzit nga <b>%s</b> segmente - Prekni këtu për të parë statistikat globale dhe kontribuuesit e lartë - Kjo është <b>%s</b> e jetës së tyre.<br>Prekni këtu për të parë tabelën e liderëve - Keni kapërcyer <b>%s</b> segmente - Kjo është <b>%s</b> - Rinovoni numërimin e segmenteve të kapërcyera? - %1$s orë %2$s minuta - %1$s minuta %2$s sekonda - %s sekonda - Opaciteti: - Ngjyra: - Rreth - Të dhënat janë siguruar nga API e SponsorBlock. Prekni këtu për të mësuar më shumë dhe për të parë shkarkimet për platformat e tjera - - - Faktor i formularit të shtrirjes - Paradrejtuar - Telefon - Tabletë - Automjet - "Ndryshimet përfshijnë: + Fillimi duhet të jetë para fundit + Shëno dy lokacione në shiritin e kohës së pari + Parashiko segmentin dhe sigurohu që ai të kapërcehet pa probleme + Redakto kohën e segmentit manualisht + Dëshironi të redaktoni kohën për fillimin ose fundin e segmentit? + Kohë e pavlefshme e dhënë + Statistikat + + Statistikat aktualisht nuk janë të disponueshme (API nuk funksionon) + Po ngarkohet... + SponsorBlock është i çaktivizuar + Emri juaj i përdoruesit: <b>%s</b> + Prekni këtu për të ndryshuar emrin tuaj të përdoruesit + Nuk mund të ndryshohet emri i përdoruesit: Statusi: %1$d %2$s + Emri i përdoruesit u ndryshua me sukses + Reputacioni juaj është <b>%.2f</b> + Keni krijuar <b>%s</b> segmente + Prekni këtu për të parë segmentet tuaja + Tabela e liderëve SponsorBlock + Keni shpëtuar njerëzit nga <b>%s</b> segmente + Prekni këtu për të parë statistikat globale dhe kontribuuesit e lartë + Kjo është <b>%s</b> e jetës së tyre.<br>Prekni këtu për të parë tabelën e liderëve + Keni kapërcyer <b>%s</b> segmente + Kjo është <b>%s</b> + Rinovoni numërimin e segmenteve të kapërcyera? + %1$s orë %2$s minuta + %1$s minuta %2$s sekonda + %s sekonda + Opaciteti: + Ngjyra: + Rreth + Të dhënat janë siguruar nga API e SponsorBlock. Prekni këtu për të mësuar më shumë dhe për të parë shkarkimet për platformat e tjera + + + Faktor i formularit të shtrirjes + Paradrejtuar + Telefon + Tabletë + Automjet + "Ndryshimet përfshijnë: Paraqitja e tabletit • Postimet e komunitetit janë të fshehura @@ -1323,306 +1322,304 @@ Paraqitja e tabletit Paraqitja e makinës • Shorts hapen në luajtësin e rregullt • Feed organizohet sipas temave dhe kanaleve" - - - Mashtro versionin e aplikacionit - Versioni i mashtuar - Versioni nuk është i mashtuar - "Verzioni i aplikacionit do të spoof-ohet në një version më të vjetër të YouTube. + + + Mashtro versionin e aplikacionit + Versioni i mashtuar + Versioni nuk është i mashtuar + "Verzioni i aplikacionit do të spoof-ohet në një version më të vjetër të YouTube. Kjo do të ndryshojë pamjen dhe veçoritë e aplikacionit, por mund të ndodhin efekte sekondare të panjohura. Nëse më vonë është çaktivizuar, është e rekomanduar të fshiheni të dhënat e aplikacionit për të parandaluar gabimet e UI." - Shënjestër e versionit të aplikacionit të mashtuar - 20.13.41 - Rivendos shiritin e veprimeve të videos jo të palosur - 20.05.46 - Rivendos funksionalitetin e transkriptit - 19.35.36 - Rikthe ikonat e vjetra të lojtarit Shorts - 19.01.34 - Ristauro ikonave te vjetra te navigimit - - - Ndrysho faqen e fillimit - Paragjykja - Të gjitha abonimet - Shfleto kanalet - Kurse / Mësim - Zbulo - Modë dhe Bukuri - Lojëra - Historia - Biblioteka - Videot e pëlqyera - Filma - Muzikë - Lajmet - Njoftimet - Playlistat - Kërkimi - Blerje - Sport - Abonimet - Trend - Realiteti Virtual - Shiko më vonë - Klipët tuaj - Gjithmonë ndrysho faqen e fillimit - "Faqja e fillimit ndryshohet gjithmonë + Shënjestër e versionit të aplikacionit të mashtuar + 20.13.41 - Rivendos shiritin e veprimeve të videos jo të palosur + 20.05.46 - Rivendos funksionalitetin e transkriptit + 19.35.36 - Rikthe ikonat e vjetra të lojtarit Shorts + 19.01.34 - Ristauro ikonave te vjetra te navigimit + + + Ndrysho faqen e fillimit + Paragjykja + Të gjitha abonimet + Shfleto kanalet + Kurse / Mësim + Zbulo + Modë dhe Bukuri + Lojëra + Historia + Biblioteka + Videot e pëlqyera + Filma + Muzikë + Lajmet + Njoftimet + Playlistat + Kërkimi + Blerje + Sport + Abonimet + Trend + Realiteti Virtual + Shiko më vonë + Klipët tuaj + Gjithmonë ndrysho faqen e fillimit + "Faqja e fillimit ndryshohet gjithmonë Kufizimi: Përdorimi i butonit të kthimit në shiritin e veglave mund të mos funksionojë" - Faqja e fillimit ndryshohet vetëm kur nis aplikacioni - - - Fik rifillon lojtarin Shorts - Lojtari Shorts nuk do të rifillojë në fillimin e aplikacionit - Lojtari Shorts do të rifillojë në fillimin e aplikacionit - - - Hap Shorts me - Lojtari i Shorts - Lojtari i zakonshëm - Lojtari i zakonshëm në ekran të plotë - - - Shorts Autoplay - Shorts do të luajnë automatikisht - Shorts do të përsëriten - Autoplay Shorts luaj në sfond - Luaj në sfond Shorts do të luajë automatikisht - Luaj në sfond Shorts do të përsëritet - - - Ndrysho stilin e luajtësit të minimizuar brenda aplikacionit - Lloji i \"miniplayer\" - I çaktivizuar - Paragjykja - Tabletë - Çaktivizo qoshet e rrumbullakosura - Qoshet janë katrore - Qoshet janë të rrumbullakosura - Aktivizo dy-prekje dhe shtrëngim për të ridimensionuar - "Veprimi i dyfishtë shtypjeje dhe shtrëngimi për të ridimensionuar është aktivizuar + Faqja e fillimit ndryshohet vetëm kur nis aplikacioni + + + Fik rifillon lojtarin Shorts + Lojtari Shorts nuk do të rifillojë në fillimin e aplikacionit + Lojtari Shorts do të rifillojë në fillimin e aplikacionit + + + Hap Shorts me + Lojtari i Shorts + Lojtari i zakonshëm + Lojtari i zakonshëm në ekran të plotë + + + Shorts Autoplay + Shorts do të luajnë automatikisht + Shorts do të përsëriten + Autoplay Shorts luaj në sfond + Luaj në sfond Shorts do të luajë automatikisht + Luaj në sfond Shorts do të përsëritet + + + Ndrysho stilin e luajtësit të minimizuar brenda aplikacionit + Lloji i \"miniplayer\" + I çaktivizuar + Paragjykja + Tabletë + Çaktivizo qoshet e rrumbullakosura + Qoshet janë katrore + Qoshet janë të rrumbullakosura + Aktivizo dy-prekje dhe shtrëngim për të ridimensionuar + "Veprimi i dyfishtë shtypjeje dhe shtrëngimi për të ridimensionuar është aktivizuar • Dyfishtë shtyp për të rritur madhësinë e miniplayer-it • Dyfishtë shtyp përsëri për të rivendosur madhësinë origjinale" - Veprimi i dy-prekjeve dhe shtrëngimi për të ridimensionuar është i çaktivizuar - Çaktivizo zvarritjen dhe lëshimin - Tërheqja dhe lëshimi është e çaktivizuar - "Tërheqja dhe lëshimi është aktivizuar + Veprimi i dy-prekjeve dhe shtrëngimi për të ridimensionuar është i çaktivizuar + Çaktivizo zvarritjen dhe lëshimin + Tërheqja dhe lëshimi është e çaktivizuar + "Tërheqja dhe lëshimi është aktivizuar Miniplayer mund të tërhiqet në çdo qoshe të ekranit" - Çaktivizo gjestin horizontal të zvarritjes - Gjestet e tërheqjes horizontale janë të çaktivizuara - "Lëvizja horizontale me tërheqje është aktivizuar + Çaktivizo gjestin horizontal të zvarritjes + Gjestet e tërheqjes horizontale janë të çaktivizuara + "Lëvizja horizontale me tërheqje është aktivizuar Miniplayer mund të tërhiqet jashtë ekranit në të majtë ose në të djathtë" - Fshih butonat e mbivendosjes - Butonat e mbivendosjes janë të fshehur - Butonat e mbivendosjes janë të dukshëm - Fsheh nëntekstet - Nëntekstet janë të fshehura - Nëntekstet janë të dukshme - Fsheh butonat e kalimit përpara dhe mbrapa - Kalimi përpara dhe mbrapa janë të fshehur - Kalimi përpara dhe mbrapa janë të dukshëm - Madhësia fillestare - Madhësia fillestare në ekran, në piksel - Madhësia e pikseleve duhet të jetë midis %1$s dhe %2$s - Paqartësia e mbivendosjes - Vlera e paqartësisë midis 0-100, ku 0 është transparente - Paqartësia e mbivendosjes së \"miniplayer\" duhet të jetë midis 0-100 - - - Aktivizo ekranin e ngarkimit me gradient - Ekrani i ngarkimit do të ketë një sfond me gradient - Ekrani i ngarkimit do të ketë një sfond të ngurtë - Stili i ekranit hapës - Ngjyra - E zezë dhe e bardhë - Aktivizo ngjyrën e personalizuar të shkallës së kërkimit - Ngjyra e personalizuar e shkallës së kërkimit është e dukshme - Ngjyra origjinale e shkallës së kërkimit është e dukshme - Ngjyra e zakonshme e shiritit të kërkimit - Ngjyra e shiritit të kërkimit - Ngjyra e theksuar e zakonshme e shiritit të kërkimit - Ngjyra e theksuar e shiritit të kërkimit - Vlerë e pavlefshme e ngjyrës së shkallës së kërkimit - - - - - Logoja e sipërme - Parazgjedhur - Normale - - ReVanced minimaliste - Personalizuar - - - Anashkalo kufizimet e rajonit të imazhit - Duke përdorur hostin e imazhit yt4.ggpht.com - "Përdorimi i hostit origjinal të imazheve + Fshih butonat e mbivendosjes + Butonat e mbivendosjes janë të fshehur + Butonat e mbivendosjes janë të dukshëm + Fsheh nëntekstet + Nëntekstet janë të fshehura + Nëntekstet janë të dukshme + Fsheh butonat e kalimit përpara dhe mbrapa + Kalimi përpara dhe mbrapa janë të fshehur + Kalimi përpara dhe mbrapa janë të dukshëm + Madhësia fillestare + Madhësia fillestare në ekran, në piksel + Madhësia e pikseleve duhet të jetë midis %1$s dhe %2$s + Paqartësia e mbivendosjes + Vlera e paqartësisë midis 0-100, ku 0 është transparente + Paqartësia e mbivendosjes së \"miniplayer\" duhet të jetë midis 0-100 + + + Aktivizo ekranin e ngarkimit me gradient + Ekrani i ngarkimit do të ketë një sfond me gradient + Ekrani i ngarkimit do të ketë një sfond të ngurtë + Stili i ekranit hapës + Ngjyra + E zezë dhe e bardhë + Aktivizo ngjyrën e personalizuar të shkallës së kërkimit + Ngjyra e personalizuar e shkallës së kërkimit është e dukshme + Ngjyra origjinale e shkallës së kërkimit është e dukshme + Ngjyra e zakonshme e shiritit të kërkimit + Ngjyra e shiritit të kërkimit + Ngjyra e theksuar e zakonshme e shiritit të kërkimit + Ngjyra e theksuar e shiritit të kërkimit + Vlerë e pavlefshme e ngjyrës së shkallës së kërkimit + + + + Logoja e sipërme + Parazgjedhur + Normale + + ReVanced minimaliste + Personalizuar + + + Anashkalo kufizimet e rajonit të imazhit + Duke përdorur hostin e imazhit yt4.ggpht.com + "Përdorimi i hostit origjinal të imazheve Aktivizimi i kësaj mund të rregullojë imazhet e munguar që janë të bllokuara në disa rajone" - - - - Kasa \"Home\" - - Skeda Abonime. - - Kasa \"You\" - Listat e luajtjes & rekomandimet e luajtësit. - Rezultatet e kërkimit - Miniaturat origjinale - DeArrow & miniaturat origjinale - DeArrow & Kapje të palëvizshme - Kapje të palëvizshme - "DeArrow ofron miniatura të grumbulluara nga turma për videot e YouTube. Këto miniatura shpesh janë më të përshtatshme se ato të ofruara nga YouTube + + + + Kasa \"Home\" + + Skeda Abonime. + + Kasa \"You\" + Listat e luajtjes & rekomandimet e luajtësit. + Rezultatet e kërkimit + Miniaturat origjinale + DeArrow & miniaturat origjinale + DeArrow & Kapje të palëvizshme + Kapje të palëvizshme + "DeArrow ofron miniatura të grumbulluara nga turma për videot e YouTube. Këto miniatura shpesh janë më të përshtatshme se ato të ofruara nga YouTube Nëse është aktivizuar, URL-të e videove do të dërgohen në serverin e API dhe nuk dërgohen të dhëna të tjera. Nëse një video nuk ka miniatura DeArrow, atëherë shfaqen ato origjinale ose kapjet e qëndrueshme Prekni këtu për të mësuar më shumë rreth DeArrow" - Shfaq një njoftim nëse API nuk është i disponueshëm - Njoftimi shfaqet nëse DeArrow nuk është i disponueshëm - Njoftimi nuk shfaqet nëse DeArrow nuk është i disponueshëm - Pika fundore e API-së DeArrow - URL e pikës fundore të ruajtjes së cache DeArrow - Kapje të palëvizshme video - Kapjet e palëvizshme merren nga fillimi / mesi / fundi i çdo videoje. Këto imazhe janë të integruara në YouTube dhe nuk përdoret ndonjë API e jashtëm - Përdor kapje të shpejta të palëvizshme - Përdorimi i kapjeve të palëvizshme me cilësi mesatare. Miniaturat do të ngarkohen më shpejt, por transmetimet në kohë reale, videot e papublikuara ose videot shumë të vjetra mund të shfaqin miniatura bosh - Përdorimi i kapjeve të palëvizshme me cilësi të lartë - Koha e videos për të marrë kapjet e palëvizshme nga - Fillimi i videos - Mesit e videos - Fundi i videos - - DeArrow nuk është i disponueshëm përkohësisht (kodi i statusit: %s) - DeArrow nuk është i disponueshëm përkohësisht - - - Shfaq njoftimet e ReVanced - Njoftimet gjatë fillimit janë të shfaqura - Njoftimet gjatë fillimit nuk janë të shfaqura - Shfaq njoftime në fillim - Lidhja me ofruesin e njoftimeve dështoi - Anulo - - - Aktivizo përsëritjen e videos - Video do të përsëritet - Video nuk do të përsëritet - - - Shfaq butonin e përsëritjes së videos - Butoni është shfaqur - Butoni nuk është shfaqur - Përsëritja e videos është aktivizuar - Përsëritja e videos është çaktivizuar - - - - - Mashtro dimensionet e pajisjes - "Dimensionet e pajisjes janë spoofed + Shfaq një njoftim nëse API nuk është i disponueshëm + Njoftimi shfaqet nëse DeArrow nuk është i disponueshëm + Njoftimi nuk shfaqet nëse DeArrow nuk është i disponueshëm + Pika fundore e API-së DeArrow + URL e pikës fundore të ruajtjes së cache DeArrow + Kapje të palëvizshme video + Kapjet e palëvizshme merren nga fillimi / mesi / fundi i çdo videoje. Këto imazhe janë të integruara në YouTube dhe nuk përdoret ndonjë API e jashtëm + Përdor kapje të shpejta të palëvizshme + Përdorimi i kapjeve të palëvizshme me cilësi mesatare. Miniaturat do të ngarkohen më shpejt, por transmetimet në kohë reale, videot e papublikuara ose videot shumë të vjetra mund të shfaqin miniatura bosh + Përdorimi i kapjeve të palëvizshme me cilësi të lartë + Koha e videos për të marrë kapjet e palëvizshme nga + Fillimi i videos + Mesit e videos + Fundi i videos + + DeArrow nuk është i disponueshëm përkohësisht (kodi i statusit: %s) + DeArrow nuk është i disponueshëm përkohësisht + + + Shfaq njoftimet e ReVanced + Njoftimet gjatë fillimit janë të shfaqura + Njoftimet gjatë fillimit nuk janë të shfaqura + Shfaq njoftime në fillim + Lidhja me ofruesin e njoftimeve dështoi + Anulo + + + Aktivizo përsëritjen e videos + Video do të përsëritet + Video nuk do të përsëritet + + + Shfaq butonin e përsëritjes së videos + Butoni është shfaqur + Butoni nuk është shfaqur + Përsëritja e videos është aktivizuar + Përsëritja e videos është çaktivizuar + + + + Mashtro dimensionet e pajisjes + "Dimensionet e pajisjes janë spoofed Cilësitë e videove më të larta mund të zhbllokohen, por mund të përjetoni video playback stuttering, worse battery life, and unknown side effects" - "Dimensionet e pajisjes nuk janë spoofed + "Dimensionet e pajisjes nuk janë spoofed Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video" - Aktivizimi i kësaj mund të shkaktojë bllokim të luajtjes së videos, jetëgjatësi më të shkurtër të baterisë dhe efekte anësore të panjohura. - - - Reagimi haptik - Ndrysho reagimin haptik - Çaktivizo haptikën e kapitujve - Haptika e kapitujve është çaktivizuar - Haptika e kapitujve është aktivizuar - Çaktivizo haptikën e kërkimit të saktë - Haptika e kërkimit të saktë është çaktivizuar - Haptika e saktë e kërkimit është aktivizuar - Çaktivizo haptikën e zhbërjes së kërkimit - Haptika e zhbërjes së kërkimit është çaktivizuar - Haptika e zhbërjes së kërkimit është aktivizuar - Çaktivizo haptikën e zmadhimit - Haptika e zmadhimit është çaktivizuar - Haptika e zmadhimit është aktivizuar - - - Nëse së fundmi keni ndryshuar detajet e hyrjes në llogarinë tuaj, atëherë çinstaloni dhe riinstaloni MicroG. - - - Anulo redirektimin e URL - Redirektimet e URL janë të anuluara - Redirektimet e URL nuk janë të anuluara - - - Hap linket në shfletues - Hapja e linkeve në shfletuesin e jashtëm - Hapja e linkeve në shfletuesin brenda aplikacionit - - - - Automatik - Mbani mend ndryshimet e cilësisë së videos - Ndryshimet e cilësisë zbatohen për të gjitha videot - Ndryshimet e cilësisë zbatohen vetëm për videon aktuale - Shfaq njoftim për ndryshimet e cilësisë së videos - Shfaqet një njoftim kur ndryshohet cilësia e paracaktuar e videos - Nuk shfaqet një njoftim kur ndryshohet cilësia e paracaktuar e videos - Cilësia e videos parazgjedhëse në rrjetin Wi-Fi - Cilësia e videos parazgjedhëse në rrjetin celular - Mbani mend ndryshimet e cilësisë së Shorts - Ndryshimet e cilësisë zbatohen për të gjitha Shorts - Ndryshimet e cilësisë zbatohen vetëm për Short-in aktual - Cilësia e parazgjedhur e Shorts në rrjetin Wi-Fi - Cilësia e parazgjedhur e Shorts në rrjetin celular - celular - Ndryshuar cilësia parazgjedhëse %1$s në: %2$s - Cilësia e Shorts u ndryshua nga %1$s në: %2$s - - - Shfaq butonin e dialogut të shpejtësisë - Butoni i dialogut të shpejtësisë shfaqet. Prekni dhe mbani shtypur për të rivendosur shpejtësinë e luajtjes në parazgjedhur - Butoni i dialogut të shpejtësisë nuk shfaqet - - - Shfaq butonin e cilësisë së videos - Butoni i cilësisë së videos shfaqet. Prekni dhe mbani shtypur për të rivendosur cilësinë në parazgjedhur - Butoni i cilësisë së videos nuk shfaqet - - - Menyja e shpejtësisë së përsëritjes së përshtatshme - Menyja e shpejtësisë së përshtatshme shfaqet - Menyja e shpejtësisë së përshtatshme nuk shfaqet - Rivendos menunë e vjetër të shpejtësisë së riprodhimit - Menyja e vjetër e shpejtësisë shfaqet - Menyja moderne e shpejtësisë shfaqet - Shpejtësi të përsëritjes së përshtatshme - Shtoni ose ndryshoni shpejtësitë e përsëritjes së përshtatshme - Shpejtësitë e personalizuara duhet të jenë më të vogla se %s - Shpejtësi të pavlefshme të personalizuar të riprodhimit - Automatik - Shpejtësia sipas dëshirës së përdoruesit gjatë përdorimit - Shpejtësi e riprodhimit midis 0 dhe 8 - - - Mbani mend ndryshimet e shpejtësisë së përsëritjes - Ndryshimet e shpejtësisë së përsëritjes zbatohen për të gjitha videot - Ndryshimet e shpejtësisë së përsëritjes zbatohen vetëm për videon aktuale - Shfaq njoftim për ndryshimet e shpejtësisë së luajtjes - Shfaqet një njoftim kur ndryshohet shpejtësia e paracaktuar e luajtjes - Një njoftim nuk shfaqet kur ndryshohet shpejtësia e paracaktuar e riprodhimit. - Shpejtësia e përsëritjes parazgjedhëse - Ndryshuar shpejtësia parazgjedhëse në: %s - - - Çaktivizoni videot HDR - Videoja HDR është çaktivizuar - Videoja HDR është aktivizuar - Detyro AVC (H.264) - Kodeku i videos detyrohet në AVC (H.264) - Kodeku i videos përcaktohet automatikisht - "Përfitimet: + Aktivizimi i kësaj mund të shkaktojë bllokim të luajtjes së videos, jetëgjatësi më të shkurtër të baterisë dhe efekte anësore të panjohura. + + + Reagimi haptik + Ndrysho reagimin haptik + Çaktivizo haptikën e kapitujve + Haptika e kapitujve është çaktivizuar + Haptika e kapitujve është aktivizuar + Çaktivizo haptikën e kërkimit të saktë + Haptika e kërkimit të saktë është çaktivizuar + Haptika e saktë e kërkimit është aktivizuar + Çaktivizo haptikën e zhbërjes së kërkimit + Haptika e zhbërjes së kërkimit është çaktivizuar + Haptika e zhbërjes së kërkimit është aktivizuar + Çaktivizo haptikën e zmadhimit + Haptika e zmadhimit është çaktivizuar + Haptika e zmadhimit është aktivizuar + + + Nëse së fundmi keni ndryshuar detajet e hyrjes në llogarinë tuaj, atëherë çinstaloni dhe riinstaloni MicroG. + + + Anulo redirektimin e URL + Redirektimet e URL janë të anuluara + Redirektimet e URL nuk janë të anuluara + + + Hap linket në shfletues + Hapja e linkeve në shfletuesin e jashtëm + Hapja e linkeve në shfletuesin brenda aplikacionit + + + + Automatik + Mbani mend ndryshimet e cilësisë së videos + Ndryshimet e cilësisë zbatohen për të gjitha videot + Ndryshimet e cilësisë zbatohen vetëm për videon aktuale + Shfaq njoftim për ndryshimet e cilësisë së videos + Shfaqet një njoftim kur ndryshohet cilësia e paracaktuar e videos + Nuk shfaqet një njoftim kur ndryshohet cilësia e paracaktuar e videos + Cilësia e videos parazgjedhëse në rrjetin Wi-Fi + Cilësia e videos parazgjedhëse në rrjetin celular + Mbani mend ndryshimet e cilësisë së Shorts + Ndryshimet e cilësisë zbatohen për të gjitha Shorts + Ndryshimet e cilësisë zbatohen vetëm për Short-in aktual + Cilësia e parazgjedhur e Shorts në rrjetin Wi-Fi + Cilësia e parazgjedhur e Shorts në rrjetin celular + celular + Ndryshuar cilësia parazgjedhëse %1$s në: %2$s + Cilësia e Shorts u ndryshua nga %1$s në: %2$s + + + Shfaq butonin e dialogut të shpejtësisë + Butoni i dialogut të shpejtësisë shfaqet. Prekni dhe mbani shtypur për të rivendosur shpejtësinë e luajtjes në parazgjedhur + Butoni i dialogut të shpejtësisë nuk shfaqet + + + Shfaq butonin e cilësisë së videos + Butoni i cilësisë së videos shfaqet. Prekni dhe mbani shtypur për të rivendosur cilësinë në parazgjedhur + Butoni i cilësisë së videos nuk shfaqet + + + Menyja e shpejtësisë së përsëritjes së përshtatshme + Menyja e shpejtësisë së përshtatshme shfaqet + Menyja e shpejtësisë së përshtatshme nuk shfaqet + Rivendos menunë e vjetër të shpejtësisë së riprodhimit + Menyja e vjetër e shpejtësisë shfaqet + Menyja moderne e shpejtësisë shfaqet + Shpejtësi të përsëritjes së përshtatshme + Shtoni ose ndryshoni shpejtësitë e përsëritjes së përshtatshme + Shpejtësitë e personalizuara duhet të jenë më të vogla se %s + Shpejtësi të pavlefshme të personalizuar të riprodhimit + Automatik + Shpejtësia sipas dëshirës së përdoruesit gjatë përdorimit + Shpejtësi e riprodhimit midis 0 dhe 8 + + + Mbani mend ndryshimet e shpejtësisë së përsëritjes + Ndryshimet e shpejtësisë së përsëritjes zbatohen për të gjitha videot + Ndryshimet e shpejtësisë së përsëritjes zbatohen vetëm për videon aktuale + Shfaq njoftim për ndryshimet e shpejtësisë së luajtjes + Shfaqet një njoftim kur ndryshohet shpejtësia e paracaktuar e luajtjes + Një njoftim nuk shfaqet kur ndryshohet shpejtësia e paracaktuar e riprodhimit. + Shpejtësia e përsëritjes parazgjedhëse + Ndryshuar shpejtësia parazgjedhëse në: %s + + + Çaktivizoni videot HDR + Videoja HDR është çaktivizuar + Videoja HDR është aktivizuar + Detyro AVC (H.264) + Kodeku i videos detyrohet në AVC (H.264) + Kodeku i videos përcaktohet automatikisht + "Përfitimet: • Mund të përmirësojë jetëgjatësinë e baterisë • Mund të rivendosë rezolucionet e munguar të videos në pajisjet më të vjetra @@ -1631,179 +1628,178 @@ Kufizimet: • Riludja e videos do të përdorë më shumë të dhëna interneti se VP9 ose AV1 • Videot HDR nuk do të përdorin AVC • Disa pajisje nuk mund të detyrojnë AVC" - - - Shfaq menunë e avancuar të cilësisë së videos - Shfaqet menyja e avancuar e cilësisë së videos - Menyja e avancuar e cilësisë së videos nuk shfaqet - - - Aktivizo rrëshqitjen për kërkim - Rrëshqitja për kërkim është e aktivizuar - Rrëshqitja për kërkim nuk është e aktivizuar - - - Lejo Android VR AV1 - "Kodeku i videos është AVC (H.264), VP9, ose AV1 + + + Shfaq menunë e avancuar të cilësisë së videos + Shfaqet menyja e avancuar e cilësisë së videos + Menyja e avancuar e cilësisë së videos nuk shfaqet + + + Aktivizo rrëshqitjen për kërkim + Rrëshqitja për kërkim është e aktivizuar + Rrëshqitja për kërkim nuk është e aktivizuar + + + Lejo Android VR AV1 + "Kodeku i videos është AVC (H.264), VP9, ose AV1 Luajtja mund të bllokojë ose të humbasë korniza" - Kodeku i videos është AVC (H.264) ose VP9 - "Aktivizimi i këtij cilësimi mund të përdorë dekodimin softuerik AV1. + Kodeku i videos është AVC (H.264) ose VP9 + "Aktivizimi i këtij cilësimi mund të përdorë dekodimin softuerik AV1. Luajtja e videos me AV1 mund të ngecë ose të humbasë korniza." - Efektet anësore të falsifikimit - • Klient eksperimental dhe mund të ndalojë së funksionuari në çdo kohë - • Videoja mund të ndalojë në 1:00, ose mund të mos jetë e disponueshme në disa rajone - • Menuja e gjurmës audio mungon - • Nuk ka codec video AV1 - • Volumi i qëndrueshëm nuk është i disponueshëm - • Video për fëmijë mund të mos luajnë kur jeni jashtë llogarisë ose në modalitetin incognito - - • Detyro audio origjinale nuk është i disponueshëm - Shfaqni në Statistikat për nerdës - Lloji i klientit shfaqet në Statistikat për nerds - Klienti është fshehur në statistikat për nerds - - - - - - - Rreth - Reklama - E përgjithshme - Lexuesi - Të ndryshme - - - Fshi reklamat video - Reklamat video janë të fshehura - Reklamat video janë të shfaqura - - - Aktivizo përsëritjen e përhershme - Përsëritja e përhershme është aktivizuar - Përsëritja e përhershme është çaktivizuar - - - Fshih butonin e transmetimit - Butoni i transmetimit është fshehur - Butoni i transmetimit është shfaqur - Fsheh butonin e historikut - Butoni i historikut është fshehur - Butoni i historikut është shfaqur - Fsheh butonin e njoftimeve - Butoni i njoftimeve është fshehur - Butoni i njoftimeve është shfaqur - Fsheh butonin e kërkimit - Butoni i kërkimit është fshehur - Butoni i kërkimit është shfaqur - - - Fshi shiritin e kategorive - Shiriti i kategorive është i fshehur - Shiriti i kategorive është i shfaqur - - - Ndrysho ngjyrën e mini-lojtarit - Ngjyra e mini-lojtarit përputhet me lojtarin në ekran të plotë - Mini-lojtari përdor ngjyrën e paracaktuar - - - Shiriti i navigimit - Fshih ose ndrysho butonat e shiritit të navigimit - - Fshih Kreun - Butoni Kryesore është fshehur - Butoni Kryesore është shfaqur - - Fshih Mostrat - Butoni Mostra është fshehur - Butoni Mostra është shfaqur - - Fshih Eksplorimin - Butoni Eksploro është fshehur - Butoni Eksploro është shfaqur - - Fshih Bibliotekën - Butoni Biblioteka është fshehur - Butoni Biblioteka është shfaqur - - Fshih përmirësimin - Butoni Azhorno është fshehur - Butoni Azhorno është shfaqur - Fshih shiritin e navigimit - Shiriti i navigimit është fshehur - Shiriti i navigimit është shfaqur - Fshih etiketat e butonave të navigimit - Etiketat janë fshehur - Etiketat janë shfaqur - - - Fshi etiketën \'Merr Music Premium\' - Etiketa është e fshehur - Etiketa është e shfaqur - - - Fshi butonin e përmirësimit - Butoni është i fshehur - Butoni është i shfaqur - - - - - Blloko reklamat audio - Reklamat audio janë të bllokuara - Reklamat audio nuk janë të bllokuara - - - %s i padisponueshëm, mund të shfaqen reklama. Provoni të ndryshoni shërbimin e bllokimit të reklamave në settings. - %s ktheu një gabim, mund të shfaqen reklama. Provoni të ndryshoni shërbimin e bllokimit të reklamave në settings. - Blloko reklamat e videove të ngulitura - E çaktivizuar - Proxy Luminous - Proxy PurpleAdBlock - - - Blloko reklamat e videove - Reklamat e videove janë të bllokuara - Reklamat e videove nuk janë të bllokuara - - - Mesazhi u fshi. - Shfaq mesazhet e fshira - Mos shfaq mesazhet e fshira - Fshih mesazhet e fshira pas një spoileri - Shfaq mesazhet e fshira si tekst i kaluar - - - Kërko automatikisht pikat e kanalit - Pikat e kanalit kërkohen automatikisht - Pikat e kanalit nuk kërkohen automatikisht - - - - Aktivizo mënyrën e debugimit të Twitch - Mënyra e debugimit të Twitch është e aktivizuar (nuk rekomandohet) - Mënyra e debugimit të Twitch është e çaktivizuar - - - Cilësimet e ReVanced - Rreth - Rreth ReVanced - Bllokimi i reklamave. - Cilësimet e Bllokimit të Reklamave. - Bisedë - Cilësimet e chat-it - Të ndryshme. - Cilësime të ndryshme - Cilësime të përgjithshme - Cilësime të tjera - Reklamat e klientit - Reklamat surestream të serverit - Regjistrimi i debugimit - Regjistrimet e debugimit janë të aktivizuara - Regjistrimet e debugimit janë të çaktivizuara - - + Efektet anësore të falsifikimit + • Klient eksperimental dhe mund të ndalojë së funksionuari në çdo kohë + • Videoja mund të ndalojë në 1:00, ose mund të mos jetë e disponueshme në disa rajone + • Menuja e gjurmës audio mungon + • Nuk ka codec video AV1 + • Volumi i qëndrueshëm nuk është i disponueshëm + • Video për fëmijë mund të mos luajnë kur jeni jashtë llogarisë ose në modalitetin incognito + + • Detyro audio origjinale nuk është i disponueshëm + Shfaqni në Statistikat për nerdës + Lloji i klientit shfaqet në Statistikat për nerds + Klienti është fshehur në statistikat për nerds + + + + + + Rreth + Reklama + E përgjithshme + Lexuesi + Të ndryshme + + + Fshi reklamat video + Reklamat video janë të fshehura + Reklamat video janë të shfaqura + + + Aktivizo përsëritjen e përhershme + Përsëritja e përhershme është aktivizuar + Përsëritja e përhershme është çaktivizuar + + + Fshih butonin e transmetimit + Butoni i transmetimit është fshehur + Butoni i transmetimit është shfaqur + Fsheh butonin e historikut + Butoni i historikut është fshehur + Butoni i historikut është shfaqur + Fsheh butonin e njoftimeve + Butoni i njoftimeve është fshehur + Butoni i njoftimeve është shfaqur + Fsheh butonin e kërkimit + Butoni i kërkimit është fshehur + Butoni i kërkimit është shfaqur + + + Fshi shiritin e kategorive + Shiriti i kategorive është i fshehur + Shiriti i kategorive është i shfaqur + + + Ndrysho ngjyrën e mini-lojtarit + Ngjyra e mini-lojtarit përputhet me lojtarin në ekran të plotë + Mini-lojtari përdor ngjyrën e paracaktuar + + + Shiriti i navigimit + Fshih ose ndrysho butonat e shiritit të navigimit + + Fshih Kreun + Butoni Kryesore është fshehur + Butoni Kryesore është shfaqur + + Fshih Mostrat + Butoni Mostra është fshehur + Butoni Mostra është shfaqur + + Fshih Eksplorimin + Butoni Eksploro është fshehur + Butoni Eksploro është shfaqur + + Fshih Bibliotekën + Butoni Biblioteka është fshehur + Butoni Biblioteka është shfaqur + + Fshih përmirësimin + Butoni Azhorno është fshehur + Butoni Azhorno është shfaqur + Fshih shiritin e navigimit + Shiriti i navigimit është fshehur + Shiriti i navigimit është shfaqur + Fshih etiketat e butonave të navigimit + Etiketat janë fshehur + Etiketat janë shfaqur + + + Fshi etiketën \'Merr Music Premium\' + Etiketa është e fshehur + Etiketa është e shfaqur + + + Fshi butonin e përmirësimit + Butoni është i fshehur + Butoni është i shfaqur + + + + + Blloko reklamat audio + Reklamat audio janë të bllokuara + Reklamat audio nuk janë të bllokuara + + + %s i padisponueshëm, mund të shfaqen reklama. Provoni të ndryshoni shërbimin e bllokimit të reklamave në settings. + %s ktheu një gabim, mund të shfaqen reklama. Provoni të ndryshoni shërbimin e bllokimit të reklamave në settings. + Blloko reklamat e videove të ngulitura + E çaktivizuar + Proxy Luminous + Proxy PurpleAdBlock + + + Blloko reklamat e videove + Reklamat e videove janë të bllokuara + Reklamat e videove nuk janë të bllokuara + + + Mesazhi u fshi. + Shfaq mesazhet e fshira + Mos shfaq mesazhet e fshira + Fshih mesazhet e fshira pas një spoileri + Shfaq mesazhet e fshira si tekst i kaluar + + + Kërko automatikisht pikat e kanalit + Pikat e kanalit kërkohen automatikisht + Pikat e kanalit nuk kërkohen automatikisht + + + + Aktivizo mënyrën e debugimit të Twitch + Mënyra e debugimit të Twitch është e aktivizuar (nuk rekomandohet) + Mënyra e debugimit të Twitch është e çaktivizuar + + + Cilësimet e ReVanced + Rreth + Rreth ReVanced + Bllokimi i reklamave. + Cilësimet e Bllokimit të Reklamave. + Bisedë + Cilësimet e chat-it + Të ndryshme. + Cilësime të ndryshme + Cilësime të përgjithshme + Cilësime të tjera + Reklamat e klientit + Reklamat surestream të serverit + Regjistrimi i debugimit + Regjistrimet e debugimit janë të aktivizuara + Regjistrimet e debugimit janë të çaktivizuara + + diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index f6d33ca909..3db4a778e9 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -17,1260 +17,1259 @@ "First 'item' text Second \"item\" text" ---> - - - - Naziv aplikacije - - Prilagođeno - Ikonica aplikacije - Originalna - - ReVanced minimalna - ReVanced skalirana - - Prilagođeno - - - Provere nisu uspele - Otvori zvanični veb-sajt - Zanemari - <h5>Izgleda da niste vi pečovali ovu aplikaciju.</h5><br>Ova aplikacija možda neće ispravno raditi, <b>može biti štetna ili čak opasna za korišćenje.</b><br><br>Ove provere podrazumevaju da je ova aplikacija unapred pečovana ili dobijena od nekog drugog:<br><br><small>%1$s</small><br>Izričito se preporučuje da <b>deinstalirate ovu aplikaciju i sami je pečujete</b> da biste bili sigurni da koristite proverenu i bezbednu aplikaciju.<p><br>Ako se zanemari, ovo upozorenje će biti prikazano samo dva puta. - Pečovano na drugom uređaju - Nije instalirano u ReVanced Manageru - Pečovano pre više od 10 minuta - Pečovano pre %s dana - Datum izrade APK-a je oštećen - - - ReVanced obaveštenje - Vaša istorija gledanja se ne čuva.<br><br>Ovo je najverovatnije uzrokovano DNS blokatorom oglasa ili mrežnim proksijem.<br><br>Da biste ovo popravili, stavite na belu listu <b>s.youtube.com</b> ili isključite sve DNS blokatore i proksije. - Ne prikazuj ponovo - - - Podešavanja - Želite li zaista da nastavite? - Sačuvaj - Resetuj - Resetuj boju - Nevažeća boja - Potrebno je restartovanje - Restartujte aplikaciju da bi ova promena stupila na snagu. - Restartuj - Uvoz - Kopiraj - Podešavanja ReVanceda su vraćena na podrazumevane vrednosti - Uvezeno %d podešavanja - Neuspešan uvoz: %s - Pretraži podešavanja - Nisu pronađeni rezultati za „%s” - Pokušajte sa drugom ključnom reči - Nedavne pretrage - Ukloniti iz istorije pretrage? - Očisti istoriju pretrage - Želite li zaista da očistite celu istoriju pretrage? - Saveti za pretragu - "• Dodirnite putanju da biste došli do nje +--> + + + Naziv aplikacije + + Prilagođeno + Ikonica aplikacije + Originalna + + ReVanced minimalna + ReVanced skalirana + + Prilagođeno + + + Provere nisu uspele + Otvori zvanični veb-sajt + Zanemari + <h5>Izgleda da niste vi pečovali ovu aplikaciju.</h5><br>Ova aplikacija možda neće ispravno raditi, <b>može biti štetna ili čak opasna za korišćenje.</b><br><br>Ove provere podrazumevaju da je ova aplikacija unapred pečovana ili dobijena od nekog drugog:<br><br><small>%1$s</small><br>Izričito se preporučuje da <b>deinstalirate ovu aplikaciju i sami je pečujete</b> da biste bili sigurni da koristite proverenu i bezbednu aplikaciju.<p><br>Ako se zanemari, ovo upozorenje će biti prikazano samo dva puta. + Pečovano na drugom uređaju + Nije instalirano u ReVanced Manageru + Pečovano pre više od 10 minuta + Pečovano pre %s dana + Datum izrade APK-a je oštećen + + + ReVanced obaveštenje + Vaša istorija gledanja se ne čuva.<br><br>Ovo je najverovatnije uzrokovano DNS blokatorom oglasa ili mrežnim proksijem.<br><br>Da biste ovo popravili, stavite na belu listu <b>s.youtube.com</b> ili isključite sve DNS blokatore i proksije. + Ne prikazuj ponovo + + + Podešavanja + Želite li zaista da nastavite? + Sačuvaj + Resetuj + Resetuj boju + Nevažeća boja + Potrebno je restartovanje + Restartujte aplikaciju da bi ova promena stupila na snagu. + Restartuj + Uvoz + Kopiraj + Podešavanja ReVanceda su vraćena na podrazumevane vrednosti + Uvezeno %d podešavanja + Neuspešan uvoz: %s + Pretraži podešavanja + Nisu pronađeni rezultati za „%s” + Pokušajte sa drugom ključnom reči + Nedavne pretrage + Ukloniti iz istorije pretrage? + Očisti istoriju pretrage + Želite li zaista da očistite celu istoriju pretrage? + Saveti za pretragu + "• Dodirnite putanju da biste došli do nje • Dugo dodirnite podešavanje da biste došli do njega • Pritisnite Enter da biste sačuvali upit za pretragu u istoriju • Pretraga zanemaruje velika i mala slova i interpunkciju • Roditeljska podešavanja se prikazuju iznad onemogućenih dečjih podešavanja" - Istorija pretrage je prazna - Da biste sačuvali istoriju pretrage, unesite upit za pretragu i pritisnite Enter - Prikaži istoriju pretrage podešavanja - Istorija pretrage podešavanja je prikazana - Istorija pretrage podešavanja nije prikazana - Prikaži ikonice podešavanja ReVanceda - Ikonice podešavanja su prikazane - Ikonice podešavanja nisu prikazane - Jezik ReVanceda - "Prevodi za neke jezike mogu nedostajati ili biti nepotpuni. + Istorija pretrage je prazna + Da biste sačuvali istoriju pretrage, unesite upit za pretragu i pritisnite Enter + Prikaži istoriju pretrage podešavanja + Istorija pretrage podešavanja je prikazana + Istorija pretrage podešavanja nije prikazana + Prikaži ikonice podešavanja ReVanceda + Ikonice podešavanja su prikazane + Ikonice podešavanja nisu prikazane + Jezik ReVanceda + "Prevodi za neke jezike mogu nedostajati ili biti nepotpuni. Da biste preveli nove jezike ili poboljšali postojeće prevode, posetite translate.revanced.app" - Jezik aplikacije - Uvoz / Izvoz - Uvoz / Izvoz podešavanja ReVanceda - - Koristite verziju <i>%s</i> ReVanced pečeva - Napomena - Ova verzija je predizdanje i možda ćete imati neočekivane probleme - Zvanični linkovi - + Koristite verziju <i>%s</i> ReVanced pečeva + Napomena + Ova verzija je predizdanje i možda ćete imati neočekivane probleme + Zvanični linkovi + - - - Podešavanja GmsCorea - Podešavanja za GmsCore - - MicroG GmsCore nije instaliran. Instalirajte ga. - Neophodna radnja - "MicroG GmsCore nema dozvolu za rad u pozadini. + + + Podešavanja GmsCorea + Podešavanja za GmsCore + + MicroG GmsCore nije instaliran. Instalirajte ga. + Neophodna radnja + "MicroG GmsCore nema dozvolu za rad u pozadini. Pratite uputstvo „Don't kill my app” za vaš telefon i primenite uputstva na vašu MicroG instalaciju. Ovo je neophodno za rad aplikacije." - Otvori veb-sajt - "Optimizacije baterije za MicroG GmsCore moraju biti onemogućene da bi se sprečili problemi. + Otvori veb-sajt + "Optimizacije baterije za MicroG GmsCore moraju biti onemogućene da bi se sprečili problemi. Onemogućavanje optimizacije baterije za MicroG neće negativno uticati na potrošnju baterije. Dodirnite dugme „Nastavi” i dozvolite promene optimizacije." - Nastavi - - - Lažirani video strimovi - Lažiranje video strimova klijenta da bi se sprečili problemi sa reprodukcijom - Lažirani video strimovi - "Video strimovi su lažirani + Nastavi + + + Lažirani video strimovi + Lažiranje video strimova klijenta da bi se sprečili problemi sa reprodukcijom + Lažirani video strimovi + "Video strimovi su lažirani Ako ste korisnik YouTube Premiuma, ovo podešavanje možda neće biti potrebno" - "Video strimovi nisu lažirani + "Video strimovi nisu lažirani Reprodukcija možda neće raditi" - Isključivanje ovog podešavanja može izazvati probleme sa reprodukcijom. - Podrazumevani klijent - - - Prisili originalni jezik zvuka - Korišćenje originalnog jezika zvuka - Korišćenje podrazumevanog zvuka - - Da biste koristili ovu funkciju, promenite opciju „Lažirani video strimovi” na bilo koji klijent osim Android Studio - - - Otklanjanje grešaka - Omogućite ili onemogućite opcije za otklanjanje grešaka - Evidentiranje otklanjanja grešaka - Evidencije otklanjanja grešaka su omogućene - Evidencije otklanjanja grešaka su onemogućene - Evidentiranje praćenja steka - Evidencije otklanjanja grešaka sadrže praćenje steka - Evidencije otklanjanja grešaka ne sadrže praćenje steka - Prikaži iskačuće obaveštenje pri grešci s ReVancedom - Iskačuće obaveštenje je prikazano, ako dođe do greške - Iskačuće obaveštenje nije prikazano, ako dođe do greške - "Isključivanje iskačućih obaveštenja o greškama sakriva sve obaveštenja o greškama u ReVancedu. + Isključivanje ovog podešavanja može izazvati probleme sa reprodukcijom. + Podrazumevani klijent + + + Prisili originalni jezik zvuka + Korišćenje originalnog jezika zvuka + Korišćenje podrazumevanog zvuka + + Da biste koristili ovu funkciju, promenite opciju „Lažirani video strimovi” na bilo koji klijent osim Android Studio + + + Otklanjanje grešaka + Omogućite ili onemogućite opcije za otklanjanje grešaka + Evidentiranje otklanjanja grešaka + Evidencije otklanjanja grešaka su omogućene + Evidencije otklanjanja grešaka su onemogućene + Evidentiranje praćenja steka + Evidencije otklanjanja grešaka sadrže praćenje steka + Evidencije otklanjanja grešaka ne sadrže praćenje steka + Prikaži iskačuće obaveštenje pri grešci s ReVancedom + Iskačuće obaveštenje je prikazano, ako dođe do greške + Iskačuće obaveštenje nije prikazano, ako dođe do greške + "Isključivanje iskačućih obaveštenja o greškama sakriva sve obaveštenja o greškama u ReVancedu. Nećete biti obavešteni ni o kakvim neočekivanim događajima." - Izvezi evidencije otklanjanja grešaka - Kopira evidencije otklanjanja grešaka ReVanceda u privremenu memoriju - Evidentiranje otklanjanja grešaka je onemogućeno - Nema pronađenih evidencija - Evidencije su kopirane - Neuspešan izvoz evidencija: %s - Izbriši evidencije otklanjanja grešaka - Briše sve sačuvane evidencije otklanjanja grešaka ReVanceda - Evidencije su izbrisane - Menadžer eksperimentalnih oznaka - Upravljajte eksperimentalnim bulovim oznakama - Aktivne oznake (%d) - Blokirane oznake (%d) - Pretraga oznaka... - Oznake su sačuvane - Oznake su resetovane - Oznake su kopirane u privremenu memoriju - Evidentiranje bafera protokola - Evidencije otklanjanja grešaka sadrže bafer protokola - Evidencije otklanjanja grešaka ne sadrže bafer protokola - "Omogućavanjem ove opcije evidentiraće se dodatni podaci o izgledu, uključujući tekst na ekranu za neke komponente korisničkog interfejsa. + Izvezi evidencije otklanjanja grešaka + Kopira evidencije otklanjanja grešaka ReVanceda u privremenu memoriju + Evidentiranje otklanjanja grešaka je onemogućeno + Nema pronađenih evidencija + Evidencije su kopirane + Neuspešan izvoz evidencija: %s + Izbriši evidencije otklanjanja grešaka + Briše sve sačuvane evidencije otklanjanja grešaka ReVanceda + Evidencije su izbrisane + Menadžer eksperimentalnih oznaka + Upravljajte eksperimentalnim bulovim oznakama + Aktivne oznake (%d) + Blokirane oznake (%d) + Pretraga oznaka... + Oznake su sačuvane + Oznake su resetovane + Oznake su kopirane u privremenu memoriju + Evidentiranje bafera protokola + Evidencije otklanjanja grešaka sadrže bafer protokola + Evidencije otklanjanja grešaka ne sadrže bafer protokola + "Omogućavanjem ove opcije evidentiraće se dodatni podaci o izgledu, uključujući tekst na ekranu za neke komponente korisničkog interfejsa. Ovo može pomoći u identifikaciji komponenti prilikom pravljenja prilagođenih filtera. Međutim, omogućavanje ovoga će takođe evidentirati neke korisničke podatke, kao što je vaša IP adresa." - - - Očisti deljene linkove - Parametar upita za praćenje je uklonjen iz deljenih linkova - Parametar upita za praćenje nije uklonjen iz deljenih linkova - Promeni linkove za deljenje na youtube.com - Deljeni linkovi koriste youtube.com - Deljeni linkovi koriste music.youtube.com - - - Prilagođeni filter - Sakrijte komponente koristeći prilagođene filtere - Omogući prilagođeni filter - Prilagođeni filter je omogućen - Prilagođeni filter je onemogućen - Prilagođeni filter - - Lista stringova za pravljenje putanje komponenti za filtriranje, odvojena novim redom - Nevažeći prilagođeni filter: %s - - - - - O programu - Oglasi - Alternativne sličice - Fid - Opšte - Plejer - Traka za premotavanje - Kontrole prevlačenja - Razno - Vrati stare menije podešavanja - Prikazuju se stari meniji podešavanja - Ne prikazuju se stari meniji podešavanja - - - Onemogući puštanje Shorts videa u pozadini - Puštanje Shorts videa u pozadini je onemogućeno - Puštanje Shorts videa u pozadini je omogućeno - - - Sakrij kartice albuma - Kartice albuma su skrivene - Kartice albuma su prikazane - Sakrij kartice izvođača - Kartice izvođača su skrivene - Kartice izvođača su prikazane - Sakrij policu oznaka sličnih videa - Polica oznaka sličnih videa je skrivena - Polica oznaka sličnih videa je prikazana - Sakrij objave zajednice - Objave zajednice su skrivene - Objave zajednice su prikazane - Sakrij kompaktne banere - Kompaktni baneri su skriveni - Kompaktni baneri su prikazani - Sakrij proširivu karticu - Proširiva kartica ispod videa je skrivena - Kartica koja se može proširiti ispod video zapisa je prikazana - Sakrij plutajuće dugme mikrofona - Plutajuće dugme mikrofona u pretrazi je skriveno - Plutajuće dugme mikrofona u pretrazi je prikazano - Sakrij horizontalne police - "Horizontalne police su skrivene, kao što su: + + + Očisti deljene linkove + Parametar upita za praćenje je uklonjen iz deljenih linkova + Parametar upita za praćenje nije uklonjen iz deljenih linkova + Promeni linkove za deljenje na youtube.com + Deljeni linkovi koriste youtube.com + Deljeni linkovi koriste music.youtube.com + + + Prilagođeni filter + Sakrijte komponente koristeći prilagođene filtere + Omogući prilagođeni filter + Prilagođeni filter je omogućen + Prilagođeni filter je onemogućen + Prilagođeni filter + + Lista stringova za pravljenje putanje komponenti za filtriranje, odvojena novim redom + Nevažeći prilagođeni filter: %s + + + + + O programu + Oglasi + Alternativne sličice + Fid + Opšte + Plejer + Traka za premotavanje + Kontrole prevlačenja + Razno + Vrati stare menije podešavanja + Prikazuju se stari meniji podešavanja + Ne prikazuju se stari meniji podešavanja + + + Onemogući puštanje Shorts videa u pozadini + Puštanje Shorts videa u pozadini je onemogućeno + Puštanje Shorts videa u pozadini je omogućeno + + + Sakrij kartice albuma + Kartice albuma su skrivene + Kartice albuma su prikazane + Sakrij kartice izvođača + Kartice izvođača su skrivene + Kartice izvođača su prikazane + Sakrij policu oznaka sličnih videa + Polica oznaka sličnih videa je skrivena + Polica oznaka sličnih videa je prikazana + Sakrij objave zajednice + Objave zajednice su skrivene + Objave zajednice su prikazane + Sakrij kompaktne banere + Kompaktni baneri su skriveni + Kompaktni baneri su prikazani + Sakrij proširivu karticu + Proširiva kartica ispod videa je skrivena + Kartica koja se može proširiti ispod video zapisa je prikazana + Sakrij plutajuće dugme mikrofona + Plutajuće dugme mikrofona u pretrazi je skriveno + Plutajuće dugme mikrofona u pretrazi je prikazano + Sakrij horizontalne police + "Horizontalne police su skrivene, kao što su: • Udarne vesti • Nastavite da gledate • Istražite više kanala • Najrelevantnije • Kupovina • Gledajte ponovo" - Horizontalne police su prikazane - Sakrij policu sa slikama - Polica sa slikama u rezultatima pretrage je skrivena - Polica sa slikama u rezultatima pretrage je prikazana - Sakrij najnovije objave - Najnovije objave su skrivene - Najnovije objave su prikazane - Sakrij miks plejliste - Miks plejliste su skrivene - Miks plejliste su prikazane - Sakrij odeljak za filmove - Odeljak za filmove je skriven - Odeljak za filmove je prikazan - - Sakrij dugme „Obavesti me” - Dugme „Obavesti me” je skriveno - Dugme „Obavesti me” je prikazano - Sakrij salu za igru - Sala za igru je skrivena - Sala za igru je prikazana - - Sakrij dugme „Prikaži još” - Dugme „Prikaži više” u rezultatima pretrage je skriveno - Dugme „Prikaži više” u rezultatima pretrage je prikazano - Sakrij ankete - Ankete su skrivene - Ankete su prikazane - Sakrij policu sa kartama - Polica sa kartama je skrivena - Polica sa kartama je prikazana - - Sakrij oznake preporuka videa - Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su skrivene - Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su prikazane - Sakrij vizuelni razdelnik - Vizuelni razdelnik je skriven - Vizuelni razdelnik je prikazan - - Sakrij YouTube Doodles - Animacija YouTube Doodlesa na logotipu je skrivena - Animacija YouTube Doodlesa na logotipu je prikazana - "YouTube Doodles se prikazuje nekoliko dana svake godine. + Sakrij dugme „Prikaži još” + Dugme „Prikaži više” u rezultatima pretrage je skriveno + Dugme „Prikaži više” u rezultatima pretrage je prikazano + Sakrij ankete + Ankete su skrivene + Ankete su prikazane + Sakrij policu sa kartama + Polica sa kartama je skrivena + Polica sa kartama je prikazana + + Sakrij oznake preporuka videa + Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su skrivene + Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su prikazane + Sakrij vizuelni razdelnik + Vizuelni razdelnik je skriven + Vizuelni razdelnik je prikazan + + Sakrij YouTube Doodles + Animacija YouTube Doodlesa na logotipu je skrivena + Animacija YouTube Doodlesa na logotipu je prikazana + "YouTube Doodles se prikazuje nekoliko dana svake godine. Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uključena, traka filtera ispod trake za pretragu takođe će biti skrivena." - Sakrij traku kanala - Traka kanala je skrivena - Traka kanala je prikazana - Sakrij vodeni žig kanala - Vodeni žig kanala je skriven - Vodeni žig kanala je prikazan - Sakrij polje za kolektivno finansiranje - Polje za kolektivno finansiranje je skriveno - Polje za kolektivno finansiranje je prikazano - Sakrij polja za hitne slučajeve - Polja za hitne slučajeve su skrivena - Polja za hitne slučajeve su prikazana - Sakrij okna sa informacijama - Okna sa informacijama su skrivena - Okna sa informacijama su prikazana - - Sakrij dugme „Učlani me” - Dugme „Pridruži se” je skriveno - Dugme „Pridruži se” je prikazano - Sakrij okna sa medicinskim informacijama - Okna sa medicinskim informacijama su skrivena - Okna sa medicinskim informacijama su prikazana - Sakrij brze radnje - Brze radnje u režimu celog ekrana su skrivene - Brze radnje u režimu celog ekrana su prikazane - Sakrij srodne videe - Srodni videi u brzim radnjama su skriveni - Srodni videi u brzim radnjama su prikazani - Sakrij smernice pratilaca - Smernice zajednice pratilaca su skrivene - Smernice zajednice pratilaca su prikazane - Sakrij vremenske reakcije - Vremenske reakcije su skrivene - Vremenske reakcije su prikazane - Sakrij „Rezime videa koji je generisala veštačka inteligencija” - Odeljak „Rezime videa koji je generisala veštačka inteligencija” je skriven - Odeljak „Rezime videa koji je generisala veštačka inteligencija” je prikazan - Sakrij odeljak „Pitaj” - Odeljak „Pitaj” je skriven - Odeljak „Pitaj” je prikazan - Sakrij atribute - Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su skriveni - Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su prikazani - Sakrij poglavlja - Odeljak za poglavlja je skriven - Odeljak za poglavlja je prikazan - Sakrij odeljak „Kako je napravljen ovaj sadržaj” - Odeljak „Kako je napravljen ovaj sadržaj” je skriven - Odeljak „Kako je napravljen ovaj sadržaj” je prikazan - Sakrij hajp poene - Hajp poeni su skriveni - Hajp poeni su prikazani - Sakrij odeljak „Istražite podkast” - Odeljak „Istražite podkast” je skriven - Odeljak „Istražite podkast” je prikazan - Sakrij istaknute veze - Odeljak istaknutih veza je skriven - Odeljak istaknutih veza je prikazan - Sakrij istaknute video snimke - Odeljak istaknutih video snimaka je skriven - Odeljak istaknutih video snimaka je prikazan - Sakrij kartice sa informacijama - Odeljak za kartice sa informacijama je skriven - Odeljak za kartice sa informacijama je prikazan - Sakrij odeljak „Ključni koncepti” - Odeljak „Ključni koncepti” je skriven - Odeljak „Ključni koncepti” je prikazan - Sakrij dugme „Zaprati” - Dugme „Zaprati” je skriveno - Dugme „Zaprati” je prikazano - Sakrij transkript - Odeljak za transkripciju je skriven - Odeljak za transkripciju je prikazan - Opis videa - Sakrijte ili prikažite komponente opisa videa - Traka filtera - Sakrijte ili prikažite traku filtera u fidovima, srodnim videima, rezultatima pretrage i istoriji gledanja - Sakrij u fidovima - Skriveno u fidovima - Prikazano u fidovima - Sakrij u srodnim videima - Skriveno u srodnim videima - Prikazano u srodnim videima - Sakrij u rezultatima pretrage - Skriveno u rezultatima pretrage - Prikazano u rezultatima pretrage - Sakrij u istoriji gledanja - Skriveno u istoriji gledanja - Prikazano u istoriji gledanja - Stranica kanala - Sakrijte ili prikažite komponente stranice kanala - - Sakrij dugme Zajednica - Dugme „Zajednica” je skriveno - Dugme „Zajednica” je prikazano - - Sakrij policu „Za vas” - Polica „Za vas” je skrivena - Polica „Za vas” je prikazana - - Sakrij dugme „Pridruži se” - Dugme „Pridruži se” je skriveno - Dugme „Pridruži se” je prikazano - Sakrij pregled linkova - Pregled linkova je skriven - Pregled linkova je prikazan - Sakrij policu članova - Polica članova je skrivena - Polica za članove je prikazana - - Sakrij dugme „Prodavnica” - Dugme „Prodavnica” je skriveno - Dugme „Prodavnica” je prikazano - - Sakrij dugme „Zaprati” - Dugme „Zaprati” je skriveno - Dugme „Zaprati” je prikazano - Komentari - Sakrijte ili prikažite komponente odeljka za komentare - Sakrij „Rezime ćaskanja koji je generisala veštačka inteligencija” - „Rezime ćaskanja koji je generisala veštačka inteligencija” je skriven - „Rezime ćaskanja koji je generisala veštačka inteligencija” je prikazan - Sakrij „Rezime komentara koji je generisala veštačka inteligencija” - „Rezime komentara koji je generisala veštačka inteligencija” je skriven - „Rezime komentara koji je generisala veštačka inteligencija” je prikazan - Sakrij smernice kanala - Smernice kanala su skrivene - Smernice kanala su prikazane - Sakrij zaglavlje „Komentari od članova” - Zaglavlje „Komentari članova” je skriveno - Zaglavlje „Komentari članova” je prikazano - Sakrij odeljak za komentare - Odeljak za komentare je skriven - Odeljak za komentare je prikazan - Sakrij smernice zajednice - Smernice zajednice su skrivene - Smernice zajednice su prikazane - Sakrij dugme „Napravi Short” - Dugme „Napravi Short” je skriveno - Dugme „Napravi Short” je prikazano - Sakrij dugmad emodžija i vremenske oznake - Dugmad emodžija i vremenske oznake su skrivena - Dugmad emodžija i vremenske oznake su prikazana - Sakrij komentar za pregled - Komentar za pregled je skriven - Komentar za pregled je prikazan - Sakrij dugme „Hvala” - Dugme „Hvala” je skriveno - Dugme „Hvala” je prikazano - Sakrij broj pregleda - Broj pregleda je skriven u fidu i rezultatima pretrage - Broj pregleda je prikazan u fidu i rezultatima pretrage - - "Ograničenja: + Sakrij dugme „Učlani me” + Dugme „Pridruži se” je skriveno + Dugme „Pridruži se” je prikazano + Sakrij okna sa medicinskim informacijama + Okna sa medicinskim informacijama su skrivena + Okna sa medicinskim informacijama su prikazana + Sakrij brze radnje + Brze radnje u režimu celog ekrana su skrivene + Brze radnje u režimu celog ekrana su prikazane + Sakrij srodne videe + Srodni videi u brzim radnjama su skriveni + Srodni videi u brzim radnjama su prikazani + Sakrij smernice pratilaca + Smernice zajednice pratilaca su skrivene + Smernice zajednice pratilaca su prikazane + Sakrij vremenske reakcije + Vremenske reakcije su skrivene + Vremenske reakcije su prikazane + Sakrij „Rezime videa koji je generisala veštačka inteligencija” + Odeljak „Rezime videa koji je generisala veštačka inteligencija” je skriven + Odeljak „Rezime videa koji je generisala veštačka inteligencija” je prikazan + Sakrij odeljak „Pitaj” + Odeljak „Pitaj” je skriven + Odeljak „Pitaj” je prikazan + Sakrij atribute + Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su skriveni + Odeljci „Istaknuta mesta”, „Igre”, „Muzika” i „Pomenuti ljudi” su prikazani + Sakrij poglavlja + Odeljak za poglavlja je skriven + Odeljak za poglavlja je prikazan + Sakrij odeljak „Kako je napravljen ovaj sadržaj” + Odeljak „Kako je napravljen ovaj sadržaj” je skriven + Odeljak „Kako je napravljen ovaj sadržaj” je prikazan + Sakrij hajp poene + Hajp poeni su skriveni + Hajp poeni su prikazani + Sakrij odeljak „Istražite podkast” + Odeljak „Istražite podkast” je skriven + Odeljak „Istražite podkast” je prikazan + Sakrij istaknute veze + Odeljak istaknutih veza je skriven + Odeljak istaknutih veza je prikazan + Sakrij istaknute video snimke + Odeljak istaknutih video snimaka je skriven + Odeljak istaknutih video snimaka je prikazan + Sakrij kartice sa informacijama + Odeljak za kartice sa informacijama je skriven + Odeljak za kartice sa informacijama je prikazan + Sakrij odeljak „Ključni koncepti” + Odeljak „Ključni koncepti” je skriven + Odeljak „Ključni koncepti” je prikazan + Sakrij dugme „Zaprati” + Dugme „Zaprati” je skriveno + Dugme „Zaprati” je prikazano + Sakrij transkript + Odeljak za transkripciju je skriven + Odeljak za transkripciju je prikazan + Opis videa + Sakrijte ili prikažite komponente opisa videa + Traka filtera + Sakrijte ili prikažite traku filtera u fidovima, srodnim videima, rezultatima pretrage i istoriji gledanja + Sakrij u fidovima + Skriveno u fidovima + Prikazano u fidovima + Sakrij u srodnim videima + Skriveno u srodnim videima + Prikazano u srodnim videima + Sakrij u rezultatima pretrage + Skriveno u rezultatima pretrage + Prikazano u rezultatima pretrage + Sakrij u istoriji gledanja + Skriveno u istoriji gledanja + Prikazano u istoriji gledanja + Stranica kanala + Sakrijte ili prikažite komponente stranice kanala + + Sakrij dugme Zajednica + Dugme „Zajednica” je skriveno + Dugme „Zajednica” je prikazano + + Sakrij policu „Za vas” + Polica „Za vas” je skrivena + Polica „Za vas” je prikazana + + Sakrij dugme „Pridruži se” + Dugme „Pridruži se” je skriveno + Dugme „Pridruži se” je prikazano + Sakrij pregled linkova + Pregled linkova je skriven + Pregled linkova je prikazan + Sakrij policu članova + Polica članova je skrivena + Polica za članove je prikazana + + Sakrij dugme „Prodavnica” + Dugme „Prodavnica” je skriveno + Dugme „Prodavnica” je prikazano + + Sakrij dugme „Zaprati” + Dugme „Zaprati” je skriveno + Dugme „Zaprati” je prikazano + Komentari + Sakrijte ili prikažite komponente odeljka za komentare + Sakrij „Rezime ćaskanja koji je generisala veštačka inteligencija” + „Rezime ćaskanja koji je generisala veštačka inteligencija” je skriven + „Rezime ćaskanja koji je generisala veštačka inteligencija” je prikazan + Sakrij „Rezime komentara koji je generisala veštačka inteligencija” + „Rezime komentara koji je generisala veštačka inteligencija” je skriven + „Rezime komentara koji je generisala veštačka inteligencija” je prikazan + Sakrij smernice kanala + Smernice kanala su skrivene + Smernice kanala su prikazane + Sakrij zaglavlje „Komentari od članova” + Zaglavlje „Komentari članova” je skriveno + Zaglavlje „Komentari članova” je prikazano + Sakrij odeljak za komentare + Odeljak za komentare je skriven + Odeljak za komentare je prikazan + Sakrij smernice zajednice + Smernice zajednice su skrivene + Smernice zajednice su prikazane + Sakrij dugme „Napravi Short” + Dugme „Napravi Short” je skriveno + Dugme „Napravi Short” je prikazano + Sakrij dugmad emodžija i vremenske oznake + Dugmad emodžija i vremenske oznake su skrivena + Dugmad emodžija i vremenske oznake su prikazana + Sakrij komentar za pregled + Komentar za pregled je skriven + Komentar za pregled je prikazan + Sakrij dugme „Hvala” + Dugme „Hvala” je skriveno + Dugme „Hvala” je prikazano + Sakrij broj pregleda + Broj pregleda je skriven u fidu i rezultatima pretrage + Broj pregleda je prikazan u fidu i rezultatima pretrage + + "Ograničenja: • Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati broj pregleda • Ova funkcija ne radi sa automobilskim faktorom forme" - Sakrij vreme otpremanja - Vreme otpremanja je skriveno u fidu i rezultatima pretrage - Vreme otpremanja je prikazano u fidu i rezultatima pretrage - - "Ograničenja: + Sakrij vreme otpremanja + Vreme otpremanja je skriveno u fidu i rezultatima pretrage + Vreme otpremanja je prikazano u fidu i rezultatima pretrage + + "Ograničenja: • Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati vreme otpremanja • Ova funkcija ne radi sa automobilskim faktorom forme" - Sakrij sadržaj ključne reči - Sakrijte videe iz rezultata pretrage i fida koristeći filtere ključnih reči - Sakrij videe na kartici „Početna” prema ključnim rečima - Videi na kartici „Početna” su filtrirani prema ključnim rečima - Videi na kartici „Početna” nisu filtrirani prema ključnim rečima - Sakrij rezultate pretrage prema ključnim rečima - Rezultati pretrage su filtrirani prema ključnim rečima - Rezultati pretrage nisu filtrirani prema ključnim rečima - Sakrij videe na kartici „Praćenja” prema ključnim rečima - Videi na kartici „Praćenja” su filtrirani prema ključnim rečima - Videi na kartici „Praćenja” nisu filtrirani prema ključnim rečima - Ključne reči za sakrivanje - - "Ključne reči i fraze za sakrivanje, odvojene novim redovima + "Ključne reči i fraze za sakrivanje, odvojene novim redovima Ključne reči mogu biti nazivi kanala ili bilo koji tekst koji se prikazuje u naslovima videa Reči sa velikim slovima u sredini moraju se uneti sa velikim i malim slovima (npr.: iPhone, TikTok, LeBlanc)" - O filtriranju prema ključnim rečima - "Početna/Praćenja/Rezultati pretrage se filtriraju da bi sakrili sadržaj koji se podudara sa frazama ključnih reči + O filtriranju prema ključnim rečima + "Početna/Praćenja/Rezultati pretrage se filtriraju da bi sakrili sadržaj koji se podudara sa frazama ključnih reči Ograničenja • Shorts videi se ne mogu sakriti prema nazivu kanala • Neke komponente korisničkog interfejsa možda neće biti sakrivene • Pretraživanje ključne reči možda neće dati rezultate" - Samo cele reči - - Obeležavanje ključne reči/fraze dvostrukim navodnicima će sprečiti delimična podudaranja naslova videa i naziva kanala<br><br>Na primer,<br><b>\"ai\"</b> će sakriti video: <b>How does AI work?</b><br>ali neće sakriti: <b>What does fair use mean?<br> - - Nije moguće koristiti ključnu reč: %s - Dodajte navodnike da biste koristili ključnu reč: %s - Ključna reč ima konfliktne izjave: %s - Ključna reč je prekratka i zahteva navodnike: %s - Ključna reč će sakriti sve videe: %s - - - Sakrij policu prodavnice kreatora - Polica prodavnice kreatora ispod video plejera je skrivena - Polica prodavnice kreatora ispod video plejera je prikazana - Sakrij baner prodavnice na završnom ekranu - Baner prodavnice na završnom ekranu je skriven - Baner prodavnice na završnom ekranu je prikazan - Sakrij oglase preko celog ekrana - "Oglasi preko celog ekrana su skriveni + Samo cele reči + + Obeležavanje ključne reči/fraze dvostrukim navodnicima će sprečiti delimična podudaranja naslova videa i naziva kanala<br><br>Na primer,<br><b>\"ai\"</b> će sakriti video: <b>How does AI work?</b><br>ali neće sakriti: <b>What does fair use mean?<br> + + Nije moguće koristiti ključnu reč: %s + Dodajte navodnike da biste koristili ključnu reč: %s + Ključna reč ima konfliktne izjave: %s + Ključna reč je prekratka i zahteva navodnike: %s + Ključna reč će sakriti sve videe: %s + + + Sakrij policu prodavnice kreatora + Polica prodavnice kreatora ispod video plejera je skrivena + Polica prodavnice kreatora ispod video plejera je prikazana + Sakrij baner prodavnice na završnom ekranu + Baner prodavnice na završnom ekranu je skriven + Baner prodavnice na završnom ekranu je prikazan + Sakrij oglase preko celog ekrana + "Oglasi preko celog ekrana su skriveni Ova funkcija je dostupna samo za starije uređaje" - Oglasi preko celog ekrana su prikazani - - Sakrivanje oglasa preko celog ekrana radi samo sa starijim uređajima - Sakrij opšte oglase - Opšti oglasi su skriveni - Opšti oglasi su prikazani - Sakrij banere za robu - Baneri za robu su skriveni - Baneri za robu su prikazani - Sakrij oznaku plaćene promocije - Oznaka plaćeme promocije je skrivena - Oznaka plaćene promocije je prikazana - Sakrij kartice samosponzorstva - Kartice samosponzorstva su skrivene - Kartice samosponzorstva su prikazane - Sakrij linkove za kupovinu - Linkovi za kupovinu u opisu videa su skriveni - Linkovi za kupovinu u opisu videa su prikazani - Sakrij baner „Pogledajte proizvode” - Baner „Pogledajte proizvode” u video plejeru je skriven - Baner „Pogledajte proizvode” u video plejeru je prikazan - Sakrij rezultate veb-pretrage - Rezultati veb-pretrage su skriveni - Rezultati veb-pretrage su prikazani - - - Sakrij promocije za YouTube Premium - Promocije za YouTube Premium ispod video plejera su skrivene - Promocije za YouTube Premium ispod video plejera su prikazane - - - Sakrij video oglase - Video oglasi su skriveni - Video oglasi su prikazani - - - Link je kopiran u privremenu memoriju - Link s vremenskom oznakom je kopiran - Prikaži dugme za kopiranje linka videa - Dugme za kopiranje URL adrese video snimka je prikazano. Dodirnite da biste kopirali URL adresu video snimka. Dodirnite i zadržite da biste kopirali sa vremenskom oznakom - Dugme za kopiranje URL adrese video snimka nije prikazano - Prikaži dugme za kopiranje linka videa s vremenskom oznakom - Dugme za kopiranje URL adrese sa vremenskom oznakom je prikazano. Dodirnite da biste kopirali URL adresu video snimka sa vremenskom oznakom. Dodirnite i zadržite da biste kopirali bez vremenske oznake - Dugme za kopiranje URL adrese sa vremenskom oznakom nije prikazano - - - Ukloni dijalog o diskreciji gledaoca - Dijalog o diskreciji gledaoca će biti uklonjen - Dijalog o diskreciji gledaoca će biti prikazan - Ovo ne zaobilazi starosno ograničenje. Samo ga automatski prihvata. - - - Onemogući iskačući prozor „Prijava na TV” - Iskačući prozor „Prijava na TV” je onemogućen - Iskačući prozor „Prijava na TV” je omogućen - - - Onemogući preskakanje poglavlja dvostrukim dodirom - Dvostruki dodir nikada ne može pokrenuti preskakanje na sledeće/prethodno poglavlje - Dvostruki dodir može povremeno pokrenuti preskakanje na sledeće/prethodno poglavlje - - - Spoljna preuzimanja - Podešavanja za korišćenje spoljnog programa za preuzimanje - Prikaži dugme za spoljno preuzimanje - Dugme „Preuzmi” u plejeru je prikazano - Dugme „Preuzmi” u plejeru nije prikazano - - Zameni dugme radnje „Preuzmi” - Dugme „Preuzmi” otvara spoljni program za preuzimanje - Dugme „Preuzmi” otvara izvorni program za preuzimanje u aplikaciji - Naziv paketa programa za preuzimanje - Naziv paketa vašeg instaliranog spoljnog programa za preuzimanje - Unesite naziv paketa - Ostalo - Aplikacija nije instalirana - %s nije instaliran. Instalirajte ga. - "Nije pronađena instalirana aplikacija sa nazivom paketa: %s + Oglasi preko celog ekrana su prikazani + + Sakrivanje oglasa preko celog ekrana radi samo sa starijim uređajima + Sakrij opšte oglase + Opšti oglasi su skriveni + Opšti oglasi su prikazani + Sakrij banere za robu + Baneri za robu su skriveni + Baneri za robu su prikazani + Sakrij oznaku plaćene promocije + Oznaka plaćeme promocije je skrivena + Oznaka plaćene promocije je prikazana + Sakrij kartice samosponzorstva + Kartice samosponzorstva su skrivene + Kartice samosponzorstva su prikazane + Sakrij linkove za kupovinu + Linkovi za kupovinu u opisu videa su skriveni + Linkovi za kupovinu u opisu videa su prikazani + Sakrij baner „Pogledajte proizvode” + Baner „Pogledajte proizvode” u video plejeru je skriven + Baner „Pogledajte proizvode” u video plejeru je prikazan + Sakrij rezultate veb-pretrage + Rezultati veb-pretrage su skriveni + Rezultati veb-pretrage su prikazani + + + Sakrij promocije za YouTube Premium + Promocije za YouTube Premium ispod video plejera su skrivene + Promocije za YouTube Premium ispod video plejera su prikazane + + + Sakrij video oglase + Video oglasi su skriveni + Video oglasi su prikazani + + + Link je kopiran u privremenu memoriju + Link s vremenskom oznakom je kopiran + Prikaži dugme za kopiranje linka videa + Dugme za kopiranje URL adrese video snimka je prikazano. Dodirnite da biste kopirali URL adresu video snimka. Dodirnite i zadržite da biste kopirali sa vremenskom oznakom + Dugme za kopiranje URL adrese video snimka nije prikazano + Prikaži dugme za kopiranje linka videa s vremenskom oznakom + Dugme za kopiranje URL adrese sa vremenskom oznakom je prikazano. Dodirnite da biste kopirali URL adresu video snimka sa vremenskom oznakom. Dodirnite i zadržite da biste kopirali bez vremenske oznake + Dugme za kopiranje URL adrese sa vremenskom oznakom nije prikazano + + + Ukloni dijalog o diskreciji gledaoca + Dijalog o diskreciji gledaoca će biti uklonjen + Dijalog o diskreciji gledaoca će biti prikazan + Ovo ne zaobilazi starosno ograničenje. Samo ga automatski prihvata. + + + Onemogući iskačući prozor „Prijava na TV” + Iskačući prozor „Prijava na TV” je onemogućen + Iskačući prozor „Prijava na TV” je omogućen + + + Onemogući preskakanje poglavlja dvostrukim dodirom + Dvostruki dodir nikada ne može pokrenuti preskakanje na sledeće/prethodno poglavlje + Dvostruki dodir može povremeno pokrenuti preskakanje na sledeće/prethodno poglavlje + + + Spoljna preuzimanja + Podešavanja za korišćenje spoljnog programa za preuzimanje + Prikaži dugme za spoljno preuzimanje + Dugme „Preuzmi” u plejeru je prikazano + Dugme „Preuzmi” u plejeru nije prikazano + + Zameni dugme radnje „Preuzmi” + Dugme „Preuzmi” otvara spoljni program za preuzimanje + Dugme „Preuzmi” otvara izvorni program za preuzimanje u aplikaciji + Naziv paketa programa za preuzimanje + Naziv paketa vašeg instaliranog spoljnog programa za preuzimanje + Unesite naziv paketa + Ostalo + Aplikacija nije instalirana + %s nije instaliran. Instalirajte ga. + "Nije pronađena instalirana aplikacija sa nazivom paketa: %s Proverite da li je naziv paketa ispravan i da li je aplikacija instalirana" - Naziv paketa ne može biti prazan - - - Onemogući pokret preciznog premotavanja - Pokret preciznog premotavanja je onemogućen - Pokret preciznog premotavanja je omogućen - - - Omogući dodir za premotavanje - Dodir za premotavanje je omogućen - Dodir za premotavanje je onemogućen - - - Omogući pokret za osvetljenost - "Prevlačenje za osvetljenost u režimu celog ekrana je omogućeno + Naziv paketa ne može biti prazan + + + Onemogući pokret preciznog premotavanja + Pokret preciznog premotavanja je onemogućen + Pokret preciznog premotavanja je omogućen + + + Omogući dodir za premotavanje + Dodir za premotavanje je omogućen + Dodir za premotavanje je onemogućen + + + Omogući pokret za osvetljenost + "Prevlačenje za osvetljenost u režimu celog ekrana je omogućeno Podesite osvetljenost prevlačenjem vertikalno na levoj strani ekrana" - Prevlačenje za osvetljenost u režimu celog ekrana je onemogućeno - Omogući pokret za jačinu zvuka - "Prevlačenje za jačinu zvuka u režimu celog ekrana je omogućeno + Prevlačenje za osvetljenost u režimu celog ekrana je onemogućeno + Omogući pokret za jačinu zvuka + "Prevlačenje za jačinu zvuka u režimu celog ekrana je omogućeno Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana" - Prevlačenje za jačinu zvuka u režimu celog ekrana je onemogućeno - Omogući pritisak za prevlačenje - Pritisak za prevlačenje je omogućen - Pritisak za prevlačenje je onemogućen - Omogući vibraciju pri dodiru - Vibracija pri dodiru je omogućena - Vibracija pri dodiru je onemogućena - Sačuvaj i vrati osvetljenost - Čuvanje i vraćanje osvetljenosti pri izlasku ili ulasku u režim celog ekrana - Bez čuvanja i vraćanja osvetljenosti pri izlasku ili ulasku u režim celog ekrana - Omogući pokret za automatsku osvetljenost - Prevlačenje nadole do najniže vrednosti pokreta za osvetljenost omogućava automatsku osvetljenost - Prevlačenje nadole do najniže vrednosti pokreta za osvetljenost ne omogućava automatsku osvetljenost - Automatski - Vremensko ograničenje pokreta prevlačenja - Količina milisekundi u kojoj je pokret prevlačenja vidljiv - Neprozirnost pozadine pokreta prevlačenja - Vrednost neprozirnosti između 0 i 100 - Neprozirnost pokreta prevlačenja mora biti između 0 i 100 - Boja pokreta prevlačenja za osvetljenost - Boja trake napretka za kontrolu osvetljenosti - Boja pokreta prevlačenja za jačinu zvuka - Boja trake napretka za kontrolu jačine zvuka - Veličina teksta pokreta prevlačenja - Veličina teksta za pokret prevlačenja između 1 i 30 - Veličina teksta mora biti između 1 i 30 - Prag trajanja prevlačenja - Iznos praga trajanja prevlačenja - Osetljivost prevlačenja za jačinu zvuka - Koliko se jačina zvuka menja po prevlačenju - Stil preklopa pokreta prevlačenja - Horizontalni preklop - Horizontalni preklop (minimalni – odozgo) - Horizontalni preklop (minimalni – po centru) - Kružni preklop - Kružni preklop (minimalni) - Vertikalni preklop - Vertikalni preklop (minimalni) - Omogući prevlačenje za promenu videa - Prevlačenje u režimu celog ekrana će promeniti na sledeći/prethodni video - Prevlačenje u režimu celog ekrana neće promeniti na sledeći/prethodni video - - - Onemogući automatski titl - Automatski titl je onemogućen - Automatski titl je omogućen - - - Dugmad radnji - Sakrijte ili prikažite dugmad ispod videa - Onemogući sjaj dugmadi „Sviđanje” i „Zaprati” - Dugmad „Sviđanje” i „Zaprati” neće svetleti pri dodiru - Dugmad „Sviđanje” i „Zaprati” će svetleti pri dodiru - Sakrij dugmad „Sviđanje” i „Nesviđanje” - Dugmad „Sviđanje” i „Nesviđanje” su skrivena - Dugmad „Sviđanje” i „Nesviđanje” su prikazana - - Sakrij dugme „Deli” - Dugme „Deli” je skriveno - Dugme „Deli” je prikazano - - Sakrij dugme „Zaustavi oglase” - Dugme „Zaustavi oglase” je skriveno - Dugme „Zaustavi oglase” je prikazano - - Sakrij dugme „Komentari” - Dugme „Komentari” je skriveno - Dugme „Komentari” je prikazano - + Sakrij dugme „Deli” + Dugme „Deli” je skriveno + Dugme „Deli” je prikazano + + Sakrij dugme „Zaustavi oglase” + Dugme „Zaustavi oglase” je skriveno + Dugme „Zaustavi oglase” je prikazano + + Sakrij dugme „Komentari” + Dugme „Komentari” je skriveno + Dugme „Komentari” je prikazano + - Sakrij dugme „Prijavi” - Dugme „Prijavi” je skriveno - Dugme „Prijavi” je prikazano - - Sakrij dugme „Remiks” - Dugme „Remiks” je skriveno - Dugme „Remiks” je prikazano - - Sakrij dugme „Preuzmi” - Dugme „Preuzmi” je skriveno - Dugme „Preuzmi” je prikazano - + Sakrij dugme „Remiks” + Dugme „Remiks” je skriveno + Dugme „Remiks” je prikazano + + Sakrij dugme „Preuzmi” + Dugme „Preuzmi” je skriveno + Dugme „Preuzmi” je prikazano + - Sakrij dugme „Hajp” - Dugme „Hajp” je skriveno - Dugme „Hajp” je prikazano - - Sakrij dugme „Promoviši” - Dugme „Promoviši” je skriveno - Dugme „Promoviši” je prikazano - - Sakrij dugme „Hvala” - Dugme „Hvala” je skriveno - Dugme „Hvala” je prikazano - + Sakrij dugme „Promoviši” + Dugme „Promoviši” je skriveno + Dugme „Promoviši” je prikazano + + Sakrij dugme „Hvala” + Dugme „Hvala” je skriveno + Dugme „Hvala” je prikazano + - Sakrij dugme „Pitaj” - Dugme „Pitaj” je skriveno - Dugme „Pitaj” je prikazano - - Sakrij dugme „Klip” - Dugme „Klip” je skriveno - Dugme „Klip” je prikazano - - Sakrij dugme „Prodavnica” - Dugme „Prodavnica” je skriveno - Dugme „Prodavnica” je prikazano - - Sakrij dugme „Sačuvaj” - Dugme „Sačuvaj” je skriveno - Dugme „Sačuvaj” je prikazano - - - Dugmad navigacije - Sakrijte ili promenite dugmad na traci za navigaciju - - Sakrij dugme „Početna” - Dugme „Početna” je skriveno - Dugme „Početna” je prikazano - - Sakrij dugme „Shorts” - Dugme „Shorts” je skriveno - Dugme „Shorts” je prikazano - - Sakrij dugme „Napravi” - Dugme „Napravi” je skriveno - Dugme „Napravi” je prikazano - - Sakrij dugme „Praćenja” - Dugme „Praćenja” je skriveno - Dugme „Praćenja” je prikazano - Sakrij obaveštenja - Dugme „Obaveštenja” je skriveno - Dugme „Obaveštenja” je prikazano - - Zameni dugme „Napravi” dugmetom „Obaveštenja” - "Dugme „Napravi” je zamenjeno dugmetom „Obaveštenja” + Sakrij dugme „Pitaj” + Dugme „Pitaj” je skriveno + Dugme „Pitaj” je prikazano + + Sakrij dugme „Klip” + Dugme „Klip” je skriveno + Dugme „Klip” je prikazano + + Sakrij dugme „Prodavnica” + Dugme „Prodavnica” je skriveno + Dugme „Prodavnica” je prikazano + + Sakrij dugme „Sačuvaj” + Dugme „Sačuvaj” je skriveno + Dugme „Sačuvaj” je prikazano + + + Dugmad navigacije + Sakrijte ili promenite dugmad na traci za navigaciju + + Sakrij dugme „Početna” + Dugme „Početna” je skriveno + Dugme „Početna” je prikazano + + Sakrij dugme „Shorts” + Dugme „Shorts” je skriveno + Dugme „Shorts” je prikazano + + Sakrij dugme „Napravi” + Dugme „Napravi” je skriveno + Dugme „Napravi” je prikazano + + Sakrij dugme „Praćenja” + Dugme „Praćenja” je skriveno + Dugme „Praćenja” je prikazano + Sakrij obaveštenja + Dugme „Obaveštenja” je skriveno + Dugme „Obaveštenja” je prikazano + + Zameni dugme „Napravi” dugmetom „Obaveštenja” + "Dugme „Napravi” je zamenjeno dugmetom „Obaveštenja” Napomena: Omogućavanje ovoga prisilno sakriva i video oglase" - Dugme „Napravi” nije zamenjeno dugmetom „Obaveštenja” - "Onemogućavanje ove opcije će onemogućiti i blokiranje oglasa u Shorts videima. + Dugme „Napravi” nije zamenjeno dugmetom „Obaveštenja” + "Onemogućavanje ove opcije će onemogućiti i blokiranje oglasa u Shorts videima. Ako se promena ove opcije ne primeni, pokušajte da pređete u režim bez arhiviranja." - Sakrij oznake dugmadi za navigaciju - Oznake dugmadi za navigaciju su skrivene - Oznake dugmadi za navigaciju su prikazane - Onemogući prozirnu statusnu traku - Statusna traka je neprozirna - Statusna traka je neprozirna ili prozirna - Na nekim uređajima, omogućavanje ove funkcije može da promeni traku za navigaciju kroz sistem u prozirnu. - Onemogući svetlu prozirnu traku za navigaciju - Traka za navigaciju u svetlom režimu je neprozirna - Traka za navigaciju u svetlom režimu je neprozirna ili prozirna - Onemogući tamnu prozirnu traku za navigaciju - Traka za navigaciju u tamnom režimu je neprozirna - Traka za navigaciju u tamnom režimu je neprozirna ili prozirna - - - Padajući meni - Sakrijte ili prikažite predmete u padajućem meniju plejera - - Sakrij meni „Titl” - Meni „Titl” je skriven - Meni „Titl” je prikazan - - Sakrij meni „Dodatna podešavanja” - Meni „Dodatna podešavanja” je skriven - Meni „Dodatna podešavanja” je prikazan - - Sakrij meni „Tajmer za spavanje” - Meni „Tajmer za spavanje” je skriven - Meni „Tajmer za spavanje” je prikazan - - Sakrij dugme „Ponavljaj video” - Dugme „Ponavljaj video” je skriveno - Dugme „Ponavljaj video” je prikazano - - Sakrij dugme „Ambijentalni režim” - Dugme „Ambijentalni režim” je skriveno - Dugme „Ambijentalni režim” je prikazano - Sakrij dugme „Ujednačena jačina zvuka” - Dugme „Ujednačena jačina zvuka” je prikazano - Dugme „Ujednačena jačina zvuka” je skriveno - - Sakrij dugme „Pomoć i povratne informacije” - Dugme „Pomoć i povratne informacije” je skriveno - Dugme „Pomoć i povratne informacije” je prikazano - - Sakrij meni „Brzina reprodukcije” - Meni „Brzina reprodukcije” je skriven - Meni „Brzina reprodukcije” je prikazan - - Sakrij dugme „Zaključaj ekran” - Dugme „Zaključaj ekran” je skriveno - Dugme „Zaključaj ekran” je prikazano - - Sakrij meni „Slušajte na YouTube Musicu” - Meni „Slušajte na YouTube Musicu” je skriven - Meni „Slušajte na YouTube Musicu” je prikazan - - Sakrij meni „Audio snimak” - Meni „Audio snimak” je skriven - Meni „Audio snimak” je prikazan - + Sakrij meni „Titl” + Meni „Titl” je skriven + Meni „Titl” je prikazan + + Sakrij meni „Dodatna podešavanja” + Meni „Dodatna podešavanja” je skriven + Meni „Dodatna podešavanja” je prikazan + + Sakrij meni „Tajmer za spavanje” + Meni „Tajmer za spavanje” je skriven + Meni „Tajmer za spavanje” je prikazan + + Sakrij dugme „Ponavljaj video” + Dugme „Ponavljaj video” je skriveno + Dugme „Ponavljaj video” je prikazano + + Sakrij dugme „Ambijentalni režim” + Dugme „Ambijentalni režim” je skriveno + Dugme „Ambijentalni režim” je prikazano + Sakrij dugme „Ujednačena jačina zvuka” + Dugme „Ujednačena jačina zvuka” je prikazano + Dugme „Ujednačena jačina zvuka” je skriveno + + Sakrij dugme „Pomoć i povratne informacije” + Dugme „Pomoć i povratne informacije” je skriveno + Dugme „Pomoć i povratne informacije” je prikazano + + Sakrij meni „Brzina reprodukcije” + Meni „Brzina reprodukcije” je skriven + Meni „Brzina reprodukcije” je prikazan + + Sakrij dugme „Zaključaj ekran” + Dugme „Zaključaj ekran” je skriveno + Dugme „Zaključaj ekran” je prikazano + + Sakrij meni „Slušajte na YouTube Musicu” + Meni „Slušajte na YouTube Musicu” je skriven + Meni „Slušajte na YouTube Musicu” je prikazan + + Sakrij meni „Audio snimak” + Meni „Audio snimak” je skriven + Meni „Audio snimak” je prikazan + - "Meni „Audio snimak” je skriven + "Meni „Audio snimak” je skriven Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video strimovi” na „Android No SDK”" - - Sakrij dugme „Gledaj u VR” - Dugme „Gledaj u VR” je skriveno - Dugme „Gledaj u VR” je prikazano - Sakrij meni kvaliteta videa - Meni kvaliteta videa je skriven - Meni kvaliteta videa je prikazan - Sakrij podnožje menija kvaliteta videa - Podnožje menija kvaliteta videa je skriveno - Podnožje menija kvaliteta videa je prikazano - - - Sakrij dugme „Autoplej” - Dugme „Autoplej” je skriveno - Dugme „Autoplej” je prikazano - - Sakrij dugme „Titl” - Dugme „Titl” je skriveno - Dugme „Titl” je prikazano - Sakrij dugme „Prebacuj” - Dugme „Prebacuj” je skriveno - Dugme „Prebacuj” je prikazano - Sakrij pozadinu kontrola plejera - Pozadina kontrola plejera je skrivena - Pozadina kontrola plejera je prikazana - Sakrij dugmad za prethodni i sledeći video - Dugmad za prethodni i sledeći video su skrivena - Dugmad za prethodni i sledeći video su prikazana - - - Sakrij kartice završnog ekrana - Kartice završnog ekrana su skrivene - Kartice završnog ekrana su prikazane - - - Onemogući „Ambijentalni režim” u režimu preko celog ekrana - Ambijentalni režim u režimu celog ekrana je onemogućen - Ambijentalni režim u režimu celog ekrana je omogućen - - - Sakrij kartice sa informacijama - Kartice sa informacijama su skrivene - Kartice sa informacijama su prikazane - - - Onemogući animacije brojeva - Brojevi nisu animirani - Brojevi su animirani - - - Sakrij traku za premotavanje u video plejeru - Traka za premotavanje u video plejeru je skrivena - Traka za premotavanje u video plejeru je prikazana - - Sakrij traku za premotavanje na sličicama videa - Traka za premotavanje na sličicama videa je skrivena - Traka za premotavanje na sličicama videa je prikazana - - - Shorts plejer - Sakrijte ili prikažite komponente Shorts plejera - - Sakrij Shorts u fidu „Početna” - Skriveno u fidu „Početna” i srodnim videima - Prikazano u fidu „Početna” i srodnim videima - Sakrij Shorts videe u rezultatima pretrage - Skriveno u rezultatima pretrage - Prikazano u rezultatima pretrage - - Sakrij Shorts u fidu „Praćenja” - Skriveno u fidu „Praćenja” - Prikazano u fidu „Praćenja” - Sakrij Shorts u istoriji gledanja - Skriveno u istoriji gledanja - Prikazano u istoriji gledanja - Sakrij oznaku „Automatski sinhronizovano” - Oznaka za automatski sinhronizovano je skrivena - Oznaka za automatski sinhronizovano je prikazana - Sakrij dugme „Kupi Super hvala” - Dugme „Kupi superhvala” je skriveno - Dugme „Kupi superhvala” je prikazano - Sakrij dugme „Efekat” - Dugme „Efekat” je skriveno - Dugme „Efekat” je prikazano - Sakrij dugme „Zeleni ekran” - Dugme „Zeleni ekran” je skriveno - Dugme „Zeleni ekran” je prikazano - Sakrij dugme heš-oznake - Dugme heš-oznake je skriveno - Dugme heš-oznake je prikazano - - Sakrij dugme „Učlani me” - Dugme „Učlani me” je skriveno - Dugme „Učlani me” je prikazano - Sakrij pregled uživo - Pregled uživo je skriven - Pregled uživo je prikazan - Sakrij oznaku lokacije - Oznaka lokacije je skrivena - Oznaka lokacije je prikazana - Sakrij dugme „Nove objave” - Dugme „Nove objave” je skriveno - Dugme „Nove objave” je prikazano - Sakrij dugmad u plejeru pri pauzi - Dugmad u plejeru pri pauzi su skrivena - Dugmad u plejeru pri pauzi su prikazana - Sakrij pregled komentara - Pregled komentara je skriven - Pregled komentara je prikazan - Sakrij dugme „Sačuvaj muziku” - Dugme „Sačuvaj zvuk” je skriveno - Dugme „Sačuvaj zvuk” je prikazano - Sakrij predloge za pretragu - Predlozi za pretragu su skriveni - Predlozi za pretragu su prikazani - Sakrij dugme „Prodavnica” - Dugme „Prodavnica” je skriveno - Dugme „Prodavnica” je prikazano - Sakrij nalepnice - Nalepnice su skrivene - Nalepnice su prikazane - Sakrij dugme „Zaprati” - Dugme „Zaprati” je skriveno - Dugme „Zaprati” je prikazano - Sakrij označene proizvode - Označeni proizvodi su skriveni - Označeni proizvodi su prikazani - Sakrij dugme „Predstojeće” - Dugme „Predstojeće” je skriveno - Dugme „Predstojeće” je prikazano - Sakrij dugme „Koristi ovaj zvuk” - Dugme „Koristi ovaj zvuk” je skriveno - Dugme „Koristi ovaj zvuk” je prikazano - Sakrij dugme „Koristi ovaj šablon” - Dugme „Koristi ovaj šablon” je skriveno - Dugme „Koristi ovaj šablon” je prikazano - Sakrij animaciju dugmeta „Sviđanje” - Animacija dugmeta „Sviđanje” je skrivena - Animacija dugmeta „Sviđanje” je prikazana - Sakrij dugme „Sviđanje” - Dugme „Sviđanje” je skriveno - Dugme „Sviđanje” je prikazano - Sakrij dugme „Nesviđanje” - Dugme „Nesviđanje” je skriveno - Dugme „Nesviđanje” je prikazano - Sakrij dugme „Komentari” - Dugme „Komentari” je skriveno - Dugme „Komentari” je prikazano - - Sakrij dugme „Deli” - Dugme „Deli” je skriveno - Dugme „Deli” je prikazano - - Sakrij dugme „Remiks” - Dugme „Remiks” je skriveno - Dugme „Remiks” je prikazano - Sakrij dugme „Zvuk” - Dugme „Zvuk” je skriveno - Dugme „Zvuk” je prikazano - Sakrij okno sa informacijama - Okno sa informacijama je skriveno - Okno sa informacijama je prikazano - Sakrij traku kanala - Traka kanala je skrivena - Traka kanala je prikazana - Sakrij naslov Shorts videa - Naslov videa je skriven - Naslov videa je prikazan - Sakrij oznaku metapodataka zvuka - Oznaka metapodataka zvuka je skrivena - Oznaka metapodataka zvuka je prikazana - Sakrij oznaku linka videa - Oznaka linka Shorts videa je skrivena - Oznaka linka Shorts videa je prikazana - Sakrij traku za navigaciju - Traka za navigaciju je skrivena - Traka za navigaciju je prikazana - - - Sakrij predloženi video na završnom ekranu - "Predloženi video na završnom ekranu je skriven, kada je autoplej isključen + + Sakrij dugme „Gledaj u VR” + Dugme „Gledaj u VR” je skriveno + Dugme „Gledaj u VR” je prikazano + Sakrij meni kvaliteta videa + Meni kvaliteta videa je skriven + Meni kvaliteta videa je prikazan + Sakrij podnožje menija kvaliteta videa + Podnožje menija kvaliteta videa je skriveno + Podnožje menija kvaliteta videa je prikazano + + + Sakrij dugme „Autoplej” + Dugme „Autoplej” je skriveno + Dugme „Autoplej” je prikazano + + Sakrij dugme „Titl” + Dugme „Titl” je skriveno + Dugme „Titl” je prikazano + Sakrij dugme „Prebacuj” + Dugme „Prebacuj” je skriveno + Dugme „Prebacuj” je prikazano + Sakrij pozadinu kontrola plejera + Pozadina kontrola plejera je skrivena + Pozadina kontrola plejera je prikazana + Sakrij dugmad za prethodni i sledeći video + Dugmad za prethodni i sledeći video su skrivena + Dugmad za prethodni i sledeći video su prikazana + + + Sakrij kartice završnog ekrana + Kartice završnog ekrana su skrivene + Kartice završnog ekrana su prikazane + + + Onemogući „Ambijentalni režim” u režimu preko celog ekrana + Ambijentalni režim u režimu celog ekrana je onemogućen + Ambijentalni režim u režimu celog ekrana je omogućen + + + Sakrij kartice sa informacijama + Kartice sa informacijama su skrivene + Kartice sa informacijama su prikazane + + + Onemogući animacije brojeva + Brojevi nisu animirani + Brojevi su animirani + + + Sakrij traku za premotavanje u video plejeru + Traka za premotavanje u video plejeru je skrivena + Traka za premotavanje u video plejeru je prikazana + + Sakrij traku za premotavanje na sličicama videa + Traka za premotavanje na sličicama videa je skrivena + Traka za premotavanje na sličicama videa je prikazana + + + Shorts plejer + Sakrijte ili prikažite komponente Shorts plejera + + Sakrij Shorts u fidu „Početna” + Skriveno u fidu „Početna” i srodnim videima + Prikazano u fidu „Početna” i srodnim videima + Sakrij Shorts videe u rezultatima pretrage + Skriveno u rezultatima pretrage + Prikazano u rezultatima pretrage + + Sakrij Shorts u fidu „Praćenja” + Skriveno u fidu „Praćenja” + Prikazano u fidu „Praćenja” + Sakrij Shorts u istoriji gledanja + Skriveno u istoriji gledanja + Prikazano u istoriji gledanja + Sakrij oznaku „Automatski sinhronizovano” + Oznaka za automatski sinhronizovano je skrivena + Oznaka za automatski sinhronizovano je prikazana + Sakrij dugme „Kupi Super hvala” + Dugme „Kupi superhvala” je skriveno + Dugme „Kupi superhvala” je prikazano + Sakrij dugme „Efekat” + Dugme „Efekat” je skriveno + Dugme „Efekat” je prikazano + Sakrij dugme „Zeleni ekran” + Dugme „Zeleni ekran” je skriveno + Dugme „Zeleni ekran” je prikazano + Sakrij dugme heš-oznake + Dugme heš-oznake je skriveno + Dugme heš-oznake je prikazano + + Sakrij dugme „Učlani me” + Dugme „Učlani me” je skriveno + Dugme „Učlani me” je prikazano + Sakrij pregled uživo + Pregled uživo je skriven + Pregled uživo je prikazan + Sakrij oznaku lokacije + Oznaka lokacije je skrivena + Oznaka lokacije je prikazana + Sakrij dugme „Nove objave” + Dugme „Nove objave” je skriveno + Dugme „Nove objave” je prikazano + Sakrij dugmad u plejeru pri pauzi + Dugmad u plejeru pri pauzi su skrivena + Dugmad u plejeru pri pauzi su prikazana + Sakrij pregled komentara + Pregled komentara je skriven + Pregled komentara je prikazan + Sakrij dugme „Sačuvaj muziku” + Dugme „Sačuvaj zvuk” je skriveno + Dugme „Sačuvaj zvuk” je prikazano + Sakrij predloge za pretragu + Predlozi za pretragu su skriveni + Predlozi za pretragu su prikazani + Sakrij dugme „Prodavnica” + Dugme „Prodavnica” je skriveno + Dugme „Prodavnica” je prikazano + Sakrij nalepnice + Nalepnice su skrivene + Nalepnice su prikazane + Sakrij dugme „Zaprati” + Dugme „Zaprati” je skriveno + Dugme „Zaprati” je prikazano + Sakrij označene proizvode + Označeni proizvodi su skriveni + Označeni proizvodi su prikazani + Sakrij dugme „Predstojeće” + Dugme „Predstojeće” je skriveno + Dugme „Predstojeće” je prikazano + Sakrij dugme „Koristi ovaj zvuk” + Dugme „Koristi ovaj zvuk” je skriveno + Dugme „Koristi ovaj zvuk” je prikazano + Sakrij dugme „Koristi ovaj šablon” + Dugme „Koristi ovaj šablon” je skriveno + Dugme „Koristi ovaj šablon” je prikazano + Sakrij animaciju dugmeta „Sviđanje” + Animacija dugmeta „Sviđanje” je skrivena + Animacija dugmeta „Sviđanje” je prikazana + Sakrij dugme „Sviđanje” + Dugme „Sviđanje” je skriveno + Dugme „Sviđanje” je prikazano + Sakrij dugme „Nesviđanje” + Dugme „Nesviđanje” je skriveno + Dugme „Nesviđanje” je prikazano + Sakrij dugme „Komentari” + Dugme „Komentari” je skriveno + Dugme „Komentari” je prikazano + + Sakrij dugme „Deli” + Dugme „Deli” je skriveno + Dugme „Deli” je prikazano + + Sakrij dugme „Remiks” + Dugme „Remiks” je skriveno + Dugme „Remiks” je prikazano + Sakrij dugme „Zvuk” + Dugme „Zvuk” je skriveno + Dugme „Zvuk” je prikazano + Sakrij okno sa informacijama + Okno sa informacijama je skriveno + Okno sa informacijama je prikazano + Sakrij traku kanala + Traka kanala je skrivena + Traka kanala je prikazana + Sakrij naslov Shorts videa + Naslov videa je skriven + Naslov videa je prikazan + Sakrij oznaku metapodataka zvuka + Oznaka metapodataka zvuka je skrivena + Oznaka metapodataka zvuka je prikazana + Sakrij oznaku linka videa + Oznaka linka Shorts videa je skrivena + Oznaka linka Shorts videa je prikazana + Sakrij traku za navigaciju + Traka za navigaciju je skrivena + Traka za navigaciju je prikazana + + + Sakrij predloženi video na završnom ekranu + "Predloženi video na završnom ekranu je skriven, kada je autoplej isključen Autoplej se može promeniti u podešavanjima YouTubea: Podešavanja → Reprodukcija → Automatski pusti sledeći video" - Predloženi video na završnom ekranu je prikazan - - - Sakrij srodne videe - Srodni videi u režimu celog ekrana su skriveni - Srodni videi u režimu celog ekrana su prikazani - - - Sakrij vremensku oznaku videa - Vremenska oznaka videa je skrivena - Vremenska oznaka videa je prikazana - - - Sakrij iskačuće table u plejeru - Iskačuće table u plejeru su skrivene - Iskačući paneli plejera su prikazani - - - Izlaz iz režima celog ekrana na kraju videa - Onemogućeno - Uspravno - Vodoravno - Uspravno i vodoravno - - - Otvori videe preko celog ekrana uspravno - Videi se otvaraju preko celog ekrana uspravno - Videi se ne otvaraju preko celog ekrana uspravno - - - Neprozirnost preklopa plejera - Vrednost neprozirnosti između 0 i 100, gde je 0 prozirno - Neprozirnost preklopa plejera mora biti između 0 i 100 - - - - Nesviđanja privremeno nisu dostupna (API istekao) - Nesviđanja nisu dostupna (status %d) - Nesviđanja nisu dostupna (ograničenje klijenta API-ja) - Nesviđanja nisu dostupna (%s) - - Osvežite video da biste glasali pomoću ReturnYouTubeDislike - - Skriveno od strane vlasnika - Nesviđanja su prikazana - Nesviđanja nisu prikazana - Prikaži nesviđanja na Shorts videima - "Nesviđanja na Shorts videima su prikazana + Predloženi video na završnom ekranu je prikazan + + + Sakrij srodne videe + Srodni videi u režimu celog ekrana su skriveni + Srodni videi u režimu celog ekrana su prikazani + + + Sakrij vremensku oznaku videa + Vremenska oznaka videa je skrivena + Vremenska oznaka videa je prikazana + + + Sakrij iskačuće table u plejeru + Iskačuće table u plejeru su skrivene + Iskačući paneli plejera su prikazani + + + Izlaz iz režima celog ekrana na kraju videa + Onemogućeno + Uspravno + Vodoravno + Uspravno i vodoravno + + + Otvori videe preko celog ekrana uspravno + Videi se otvaraju preko celog ekrana uspravno + Videi se ne otvaraju preko celog ekrana uspravno + + + Neprozirnost preklopa plejera + Vrednost neprozirnosti između 0 i 100, gde je 0 prozirno + Neprozirnost preklopa plejera mora biti između 0 i 100 + + + + Nesviđanja privremeno nisu dostupna (API istekao) + Nesviđanja nisu dostupna (status %d) + Nesviđanja nisu dostupna (ograničenje klijenta API-ja) + Nesviđanja nisu dostupna (%s) + + Osvežite video da biste glasali pomoću ReturnYouTubeDislike + + Skriveno od strane vlasnika + Nesviđanja su prikazana + Nesviđanja nisu prikazana + Prikaži nesviđanja na Shorts videima + "Nesviđanja na Shorts videima su prikazana Ograničenje: Nesviđanja se možda neće pojaviti u režimu bez arhiviranja" - Nesviđanja na Shorts videima nisu prikazana - Nesviđanja u procentima - Nesviđanja su prikazana kao procenat - Nesviđanja su prikazana kao broj - - Kompaktno dugme „Sviđanje” - Dugme „Sviđanje” stilizovano za minimalnu širinu - Dugme „Sviđanje” stilizovano za najbolji izgled - Prikaži procenjeni broj sviđanja - Videi sa onemogućenim sviđanjima prikazuju procenjeni broj sviđanja - Procenjeni broj sviđanja nije prikazan - Prikaži iskačuće obaveštenje ako API nije dostupan - Iskačuće obaveštenje je prikazano, ako Return YouTube Dislike nije dostupan - Iskačuće obaveštenje nije prikazano, ako Return YouTube Dislike nije dostupan - Podatke obezbeđuje Return YouTube Dislike API. Dodirnite ovde da saznate više - - Statistike ReturnYouTubeDislike API-ja za ovaj uređaj - Vreme odgovora API-ja, prosečno - Vreme odgovora API-ja, minimalno - Vreme odgovora API-ja, maksimalno - Vreme odgovora API-ja, poslednji video - Nesviđanja privremeno nisu dostupna – na snazi je ograničenje stope API klijenta - API prikupljanje glasova, broj poziva - Nije ostvaren nijedan mrežni poziv - Broj ostvarenih mrežnih poziva: %d - API prikupljanje glasova, broj isteka - Nije istekao nijedan mrežni poziv - Broj isteklih mrežnih poziva: %d - Ograničenje stope klijenta API-ja - Nije ostvareno nijedno ograničenje stope klijenta - Broj ostvarenih ograničenja stope klijenta: %d - %d milisekundi - - - Omogući široku traku za pretragu - Široka traka za pretragu je omogućena - Široka traka za pretragu je onemogućena - - - Omogući visokokvalitetne sličice - Sličice trake za premotavanje su visokog kvaliteta - Sličice trake za premotavanje su srednjeg kvaliteta - "Ovo će takođe vratiti sličice na strimovima uživo koji nemaju sličice trake za premotavanje. + Nesviđanja na Shorts videima nisu prikazana + Nesviđanja u procentima + Nesviđanja su prikazana kao procenat + Nesviđanja su prikazana kao broj + + Kompaktno dugme „Sviđanje” + Dugme „Sviđanje” stilizovano za minimalnu širinu + Dugme „Sviđanje” stilizovano za najbolji izgled + Prikaži procenjeni broj sviđanja + Videi sa onemogućenim sviđanjima prikazuju procenjeni broj sviđanja + Procenjeni broj sviđanja nije prikazan + Prikaži iskačuće obaveštenje ako API nije dostupan + Iskačuće obaveštenje je prikazano, ako Return YouTube Dislike nije dostupan + Iskačuće obaveštenje nije prikazano, ako Return YouTube Dislike nije dostupan + Podatke obezbeđuje Return YouTube Dislike API. Dodirnite ovde da saznate više + + Statistike ReturnYouTubeDislike API-ja za ovaj uređaj + Vreme odgovora API-ja, prosečno + Vreme odgovora API-ja, minimalno + Vreme odgovora API-ja, maksimalno + Vreme odgovora API-ja, poslednji video + Nesviđanja privremeno nisu dostupna – na snazi je ograničenje stope API klijenta + API prikupljanje glasova, broj poziva + Nije ostvaren nijedan mrežni poziv + Broj ostvarenih mrežnih poziva: %d + API prikupljanje glasova, broj isteka + Nije istekao nijedan mrežni poziv + Broj isteklih mrežnih poziva: %d + Ograničenje stope klijenta API-ja + Nije ostvareno nijedno ograničenje stope klijenta + Broj ostvarenih ograničenja stope klijenta: %d + %d milisekundi + + + Omogući široku traku za pretragu + Široka traka za pretragu je omogućena + Široka traka za pretragu je onemogućena + + + Omogući visokokvalitetne sličice + Sličice trake za premotavanje su visokog kvaliteta + Sličice trake za premotavanje su srednjeg kvaliteta + "Ovo će takođe vratiti sličice na strimovima uživo koji nemaju sličice trake za premotavanje. Sličice trake za premotavanje će koristiti isti kvalitet kao trenutni video. Ova funkcija najbolje radi sa kvalitetom videa od 720p ili nižim i kada koristite veoma brzu internet vezu." - Vrati stare sličice trake za premotavanje - Sličice trake za premotavanje će se pojaviti iznad nje - Sličice trake za premotavanje će se pojaviti u režimu celog ekrana - - - Omogući SponsorBlock - SponsorBlock je sistem zasnovan na doprinosima korisnika i služi za preskakanje dosadnih delova YouTube videa - Izgled - Prikaži dugme za glasanje - Dugme za glasanje za segment je prikazano - Dugme za glasanje za segment nije prikazano - Koristi kvadratni izgled - Dugmad i kontrole su kvadratni - Dugmad i kontrole su zaobljeni - - Koristi kompaktno dugme za preskakanje - Dugme za preskakanje stilizovano za minimalnu širinu - Dugme za preskakanje stilizovano za najbolji izgled - Automatski sakrij dugme za preskakanje - Dugme za preskakanje će biti skriveno nakon nekoliko sekundi - Dugme za preskakanje je prikazano za ceo segment - Trajanje dugmeta za preskakanje - Koliko dugo se prikazuju dugmad za preskakanje i preskakanje do istaknutog pre automatskog skrivanja - Prikaži iskačuće obaveštenje o poništavanju preskakanja - Iskačuće obaveštenje se prikazuje, kada se segment automatski preskoči. Dodirnite iskačuće obaveštenje da biste poništili preskakanje - Iskačuće obaveštenje se ne prikazuje - Trajanje iskačućeg obaveštenja pri preskakanju - Koliko dugo se prikazuje iskačuće obaveštenje za poništavanje preskakanja - 1 sekunda - 2 sekunde - 3 sekunde - 4 sekunde - 5 sekundi - 6 sekundi - 7 sekundi - 8 sekundi - 9 sekundi - 10 sekundi - Prikaži dužinu videa bez segmenata - Dužina videa bez svih segmenata prikazana je na traci za premotavanje - Puna dužina videa je prikazana - Pravljenje novih segmenata - Prikaži dugme za pravljenje novog segmenta - Dugme za pravljenje novog segmenta je prikazano - Dugme za pravljenje novog segmenta nije prikazano - Podešavanje koraka novog segmenta - Broj milisekundi u kojima se pomeraju dugmad za podešavanje vremena prilikom pravljenja novih segmenata - Vrednost mora biti pozitivan broj - Vidi smernice - Smernice sadrže pravila i savete za pravljenje novih segmenata - Pratite smernice - Pročitajte smernice SponsorBlocka pre pravljenja novih segmenata - Već pročitano - Pokaži mi - Opšte - Prikaži iskačuće obaveštenje ako API nije dostupan - Iskačuće obaveštenje je prikazano, ako SponsorBlock nije dostupan - Iskačuće obaveštenje nije prikazano, ako SponsorBlock nije dostupan - Omogući praćenje broja preskakanja - Omogućava SponsorBlock rang-listi da zna koliko je vremena ušteđeno. Poruka se šalje na rang-listu svaki put kada je segment preskočen - Praćenje broja preskakanja nije omogućeno - Minimalno trajanje segmenta - Segmenti kraći od ove vrednosti (u sekundama) neće biti prikazani ili preskočeni - Nevažeće vremensko trajanje - Vaš privatni korisnički ID - Ovo treba da ostane privatno. Ovo je kao lozinka i ne bi trebalo da se deli ni sa kim. Ako neko ima ovo, može da se lažno predstavlja za vas - Privatni korisnički ID mora da ima najmanje 30 znakova - Promena URL-a API-ja - Adresa koju SponsorBlock koristi za upućivanje poziva serveru - Resetovanje URL-a API-ja - URL API-ja je nevažeći - URL API-ja je promenjen - Uvoz/Izvoz podešavanja - Kopiraj - Vaša SponsorBlock JSON konfiguracija koja može da se uveze/izveze u ReVanced i druge SponsorBlock platforme - Vaša SponsorBlock JSON konfiguracija koja može da se uveze/izveze u ReVanced i druge SponsorBlock platforme. Ovo uključuje vaš privatni korisnički ID. Budite pažljivi pri deljenju ovoga - Podešavanja su uspešno uvezena - Neuspešan uvoz: %s - Neuspešan izvoz: %s - "Vaša podešavanja sadrže privatni SponsorBlock korisnički ID. + Vrati stare sličice trake za premotavanje + Sličice trake za premotavanje će se pojaviti iznad nje + Sličice trake za premotavanje će se pojaviti u režimu celog ekrana + + + Omogući SponsorBlock + SponsorBlock je sistem zasnovan na doprinosima korisnika i služi za preskakanje dosadnih delova YouTube videa + Izgled + Prikaži dugme za glasanje + Dugme za glasanje za segment je prikazano + Dugme za glasanje za segment nije prikazano + Koristi kvadratni izgled + Dugmad i kontrole su kvadratni + Dugmad i kontrole su zaobljeni + + Koristi kompaktno dugme za preskakanje + Dugme za preskakanje stilizovano za minimalnu širinu + Dugme za preskakanje stilizovano za najbolji izgled + Automatski sakrij dugme za preskakanje + Dugme za preskakanje će biti skriveno nakon nekoliko sekundi + Dugme za preskakanje je prikazano za ceo segment + Trajanje dugmeta za preskakanje + Koliko dugo se prikazuju dugmad za preskakanje i preskakanje do istaknutog pre automatskog skrivanja + Prikaži iskačuće obaveštenje o poništavanju preskakanja + Iskačuće obaveštenje se prikazuje, kada se segment automatski preskoči. Dodirnite iskačuće obaveštenje da biste poništili preskakanje + Iskačuće obaveštenje se ne prikazuje + Trajanje iskačućeg obaveštenja pri preskakanju + Koliko dugo se prikazuje iskačuće obaveštenje za poništavanje preskakanja + 1 sekunda + 2 sekunde + 3 sekunde + 4 sekunde + 5 sekundi + 6 sekundi + 7 sekundi + 8 sekundi + 9 sekundi + 10 sekundi + Prikaži dužinu videa bez segmenata + Dužina videa bez svih segmenata prikazana je na traci za premotavanje + Puna dužina videa je prikazana + Pravljenje novih segmenata + Prikaži dugme za pravljenje novog segmenta + Dugme za pravljenje novog segmenta je prikazano + Dugme za pravljenje novog segmenta nije prikazano + Podešavanje koraka novog segmenta + Broj milisekundi u kojima se pomeraju dugmad za podešavanje vremena prilikom pravljenja novih segmenata + Vrednost mora biti pozitivan broj + Vidi smernice + Smernice sadrže pravila i savete za pravljenje novih segmenata + Pratite smernice + Pročitajte smernice SponsorBlocka pre pravljenja novih segmenata + Već pročitano + Pokaži mi + Opšte + Prikaži iskačuće obaveštenje ako API nije dostupan + Iskačuće obaveštenje je prikazano, ako SponsorBlock nije dostupan + Iskačuće obaveštenje nije prikazano, ako SponsorBlock nije dostupan + Omogući praćenje broja preskakanja + Omogućava SponsorBlock rang-listi da zna koliko je vremena ušteđeno. Poruka se šalje na rang-listu svaki put kada je segment preskočen + Praćenje broja preskakanja nije omogućeno + Minimalno trajanje segmenta + Segmenti kraći od ove vrednosti (u sekundama) neće biti prikazani ili preskočeni + Nevažeće vremensko trajanje + Vaš privatni korisnički ID + Ovo treba da ostane privatno. Ovo je kao lozinka i ne bi trebalo da se deli ni sa kim. Ako neko ima ovo, može da se lažno predstavlja za vas + Privatni korisnički ID mora da ima najmanje 30 znakova + Promena URL-a API-ja + Adresa koju SponsorBlock koristi za upućivanje poziva serveru + Resetovanje URL-a API-ja + URL API-ja je nevažeći + URL API-ja je promenjen + Uvoz/Izvoz podešavanja + Kopiraj + Vaša SponsorBlock JSON konfiguracija koja može da se uveze/izveze u ReVanced i druge SponsorBlock platforme + Vaša SponsorBlock JSON konfiguracija koja može da se uveze/izveze u ReVanced i druge SponsorBlock platforme. Ovo uključuje vaš privatni korisnički ID. Budite pažljivi pri deljenju ovoga + Podešavanja su uspešno uvezena + Neuspešan uvoz: %s + Neuspešan izvoz: %s + "Vaša podešavanja sadrže privatni SponsorBlock korisnički ID. Vaš korisnički ID je kao lozinka i nikada ga ne treba deliti." - Ne prikazuj ponovo - Promena ponašanja segmenta - Sponzor - Plaćene promocije, plaćene preporuke i direktne reklame. Nije za samopromociju ili besplatno pozivanje na ciljeve/kreatore/veb-sajtove/proizvode koji im se dopadaju - Neplaćena promocija/Samopromocija - Slično kao „Sponzor”, isključujući neplaćenu promociju ili samopromociju. Uključuje odeljke o robi, donacijama ili informacijama o tome sa kim su sarađivali - Podsetnik o interakciji (praćenje) - Kratak podsetnik da lajkujete, pretplatite se ili ih zapratite usred sadržaja. Ako je dugačak ili o nečemu konkretnom, trebalo bi da bude pod samopromocijom - Istaknuto - Deo videa koji većina ljudi traži - Pauza/Uvodna animacija - Interval bez stvarnog sadržaja. Može biti pauza, statični kadar ili ponavljajuća animacija. Ne uključuje prelaze koji sadrže informacije - Završne kartice / Zasluge - Zasluge ili kada se pojave YouTube završne kartice. Nije za zaključke sa informacijama - Mamac / Pozdravi - Narativni trejleri za predstojeći video, pozdravi i oproštaji. Ne uključuje segmente koji dodaju dodatni sadržaj - Pregled / Rekapitulacija - Kolekcija klipova koji pokazuju šta sledi ili šta se desilo u videu ili u drugim videima serijе, gde se sve informacije ponavljaju na drugom mestu - Digresija / Šale - Digresivne scene ili šale, koje nisu potrebne za razumevanje glavnog sadržaja videa. Ovo ne uključuje segmente koji pružaju detalje o kontekstu ili pozadini - Muzika: Segment bez muzike - Samo za upotrebu u muzičkim spotovima. Delovi muzičkih spotova bez muzike, koji nisu obuhvaćeni drugom kategorijom - Preskoči - Istaknuto - Preskoči sponzora - Preskoči promociju - Preskoči interakciju - Preskoči na istaknuto - Preskoči uvodnu animaciju - Preskoči pauzu - Preskoči pauzu - Preskoči završnu animaciju - Preskoči mamac - Preskoči pregled - Preskoči pregled - Preskoči rekapitulaciju - Preskoči digresiju - Preskoči segment bez muzike - Preskoči segment - Preskočen sponzor - Preskočena samopromocija - Preskočen dosadni podsetnik - Preskočeno na istaknuto - Preskočena uvodna animacija - Preskočena pauza - Preskočena pauza - Preskočena završna animacija - Preskočen mamac - Preskočen pregled - Preskočen pregled - Preskočena rekapitulacija - Preskočeno nepovezano - Preskočen segment bez muzike - Preskočen nepodneseni segment - Preskočeno više segmenata - Preskoči automatski - Preskoči automatski jedanput - Prikaži dugme za preskakanje - Prikaži na traci za premotavanje - Onemogući - Nije moguće podneti segment: %s - SponsorBlock privremeno ne radi - Nije mogući podneti segment (status: %1$d %2$s) - Nije moguće podneti segment. Prekoračeno ograničenje stope (previše od istog korisnika ili IP adrese) - Nije moguće podneti segment: %s - "Nije moguće podneti segment. + Ne prikazuj ponovo + Promena ponašanja segmenta + Sponzor + Plaćene promocije, plaćene preporuke i direktne reklame. Nije za samopromociju ili besplatno pozivanje na ciljeve/kreatore/veb-sajtove/proizvode koji im se dopadaju + Neplaćena promocija/Samopromocija + Slično kao „Sponzor”, isključujući neplaćenu promociju ili samopromociju. Uključuje odeljke o robi, donacijama ili informacijama o tome sa kim su sarađivali + Podsetnik o interakciji (praćenje) + Kratak podsetnik da lajkujete, pretplatite se ili ih zapratite usred sadržaja. Ako je dugačak ili o nečemu konkretnom, trebalo bi da bude pod samopromocijom + Istaknuto + Deo videa koji većina ljudi traži + Pauza/Uvodna animacija + Interval bez stvarnog sadržaja. Može biti pauza, statični kadar ili ponavljajuća animacija. Ne uključuje prelaze koji sadrže informacije + Završne kartice / Zasluge + Zasluge ili kada se pojave YouTube završne kartice. Nije za zaključke sa informacijama + Mamac / Pozdravi + Narativni trejleri za predstojeći video, pozdravi i oproštaji. Ne uključuje segmente koji dodaju dodatni sadržaj + Pregled / Rekapitulacija + Kolekcija klipova koji pokazuju šta sledi ili šta se desilo u videu ili u drugim videima serijе, gde se sve informacije ponavljaju na drugom mestu + Digresija / Šale + Digresivne scene ili šale, koje nisu potrebne za razumevanje glavnog sadržaja videa. Ovo ne uključuje segmente koji pružaju detalje o kontekstu ili pozadini + Muzika: Segment bez muzike + Samo za upotrebu u muzičkim spotovima. Delovi muzičkih spotova bez muzike, koji nisu obuhvaćeni drugom kategorijom + Preskoči + Istaknuto + Preskoči sponzora + Preskoči promociju + Preskoči interakciju + Preskoči na istaknuto + Preskoči uvodnu animaciju + Preskoči pauzu + Preskoči pauzu + Preskoči završnu animaciju + Preskoči mamac + Preskoči pregled + Preskoči pregled + Preskoči rekapitulaciju + Preskoči digresiju + Preskoči segment bez muzike + Preskoči segment + Preskočen sponzor + Preskočena samopromocija + Preskočen dosadni podsetnik + Preskočeno na istaknuto + Preskočena uvodna animacija + Preskočena pauza + Preskočena pauza + Preskočena završna animacija + Preskočen mamac + Preskočen pregled + Preskočen pregled + Preskočena rekapitulacija + Preskočeno nepovezano + Preskočen segment bez muzike + Preskočen nepodneseni segment + Preskočeno više segmenata + Preskoči automatski + Preskoči automatski jedanput + Prikaži dugme za preskakanje + Prikaži na traci za premotavanje + Onemogući + Nije moguće podneti segment: %s + SponsorBlock privremeno ne radi + Nije mogući podneti segment (status: %1$d %2$s) + Nije moguće podneti segment. Prekoračeno ograničenje stope (previše od istog korisnika ili IP adrese) + Nije moguće podneti segment: %s + "Nije moguće podneti segment. Već postoji" - Segment je uspešno podnet - - SponsorBlock privremeno nije dostupan (API istekao) - SponsorBlock privremeno nije dostupan (status %d) - SponsorBlock privremeno nije dostupan - Nije moguće glasati za segment (API istekao) - Nije moguće glasati za segment (status: %1$d %2$s) - Nije moguće glasati za segment: %s - Glasaj za - Glasaj protiv - Promeni kategoriju - Nema nijednog segmenta za glasanje - - %1$s do %2$s - Izaberite kategoriju segmenta - Kategorija je onemogućena u podešavanjima. Omogućite kategoriju da biste podneli. - Novi SponsorBlock segment - Postaviti %s kao početak ili kraj novog segmenta? - Početak - Kraj - Sada - Vreme početka segmenta - Vreme kraja segmenta - Da li su vremena tačna? - "Segment je od + Segment je uspešno podnet + + SponsorBlock privremeno nije dostupan (API istekao) + SponsorBlock privremeno nije dostupan (status %d) + SponsorBlock privremeno nije dostupan + Nije moguće glasati za segment (API istekao) + Nije moguće glasati za segment (status: %1$d %2$s) + Nije moguće glasati za segment: %s + Glasaj za + Glasaj protiv + Promeni kategoriju + Nema nijednog segmenta za glasanje + + %1$s do %2$s + Izaberite kategoriju segmenta + Kategorija je onemogućena u podešavanjima. Omogućite kategoriju da biste podneli. + Novi SponsorBlock segment + Postaviti %s kao početak ili kraj novog segmenta? + Početak + Kraj + Sada + Vreme početka segmenta + Vreme kraja segmenta + Da li su vremena tačna? + "Segment je od %1$s do @@ -1279,45 +1278,45 @@ do (%3$s) Spreman za podnošenje?" - Početak mora biti pre kraja - Prvo označite dva mesta na vremenskoj traci - Pregledajte segment i uverite se da glatko preskače - Ručno izmenite vreme segmenta - Želite li da izmenite vreme početka ili kraja segmenta? - Dato je nevažeće vreme - Statistika - - Statistike privremeno nisu dostupne (API ne radi) - Učitavanje… - SponsorBlock je onemogućen - Vaše korisničko ime: <b>%s</b> - Dodirnite ovde da promenite svoje korisničko ime - Nije moguće promeniti korisničko ime: Status: %1$d %2$s - Korisničko ime uspešno promenjeno - Vaša reputacija je <b>%.2f</b> - Napravili ste <b>%s</b> segmenata - Dodirnite ovde da biste videli svoje segmente - SponsorBlock rang-lista - Sačuvali ste ljude od <b>%s</b> segmenata - Dodirnite ovde da biste videli globalnu statistiku i najbolje doprinosioce - To je <b>%s</b> njihovih života.<br>Dodirnite ovde da biste videli rang-listu - Preskočili ste <b>%s</b> segmenata - To je <b>%s</b> - Resetovati brojač preskočenih segmenata? - %1$s sati %2$s minuta - %1$s minuta %2$s sekundi - %s sekundi - Neprozirnost: - Boja: - O programu - Podatke obezbeđuje SponsorBlock API. Dodirnite ovde da saznate više i vidite preuzimanja za druge platforme - - - Faktor forme izgleda - Podrazumevani - Telefon - Automobilski - "Promene uključuju: + Početak mora biti pre kraja + Prvo označite dva mesta na vremenskoj traci + Pregledajte segment i uverite se da glatko preskače + Ručno izmenite vreme segmenta + Želite li da izmenite vreme početka ili kraja segmenta? + Dato je nevažeće vreme + Statistika + + Statistike privremeno nisu dostupne (API ne radi) + Učitavanje… + SponsorBlock je onemogućen + Vaše korisničko ime: <b>%s</b> + Dodirnite ovde da promenite svoje korisničko ime + Nije moguće promeniti korisničko ime: Status: %1$d %2$s + Korisničko ime uspešno promenjeno + Vaša reputacija je <b>%.2f</b> + Napravili ste <b>%s</b> segmenata + Dodirnite ovde da biste videli svoje segmente + SponsorBlock rang-lista + Sačuvali ste ljude od <b>%s</b> segmenata + Dodirnite ovde da biste videli globalnu statistiku i najbolje doprinosioce + To je <b>%s</b> njihovih života.<br>Dodirnite ovde da biste videli rang-listu + Preskočili ste <b>%s</b> segmenata + To je <b>%s</b> + Resetovati brojač preskočenih segmenata? + %1$s sati %2$s minuta + %1$s minuta %2$s sekundi + %s sekundi + Neprozirnost: + Boja: + O programu + Podatke obezbeđuje SponsorBlock API. Dodirnite ovde da saznate više i vidite preuzimanja za druge platforme + + + Faktor forme izgleda + Podrazumevani + Telefon + Automobilski + "Promene uključuju: Izgled tableta • Objave zajednice su skrivene @@ -1325,313 +1324,311 @@ Izgled tableta Automobilski izgled • Shorts videi se otvaraju u običnom plejeru • Fid je organizovan po temama i kanalima" - - - Lažirana verzija aplikacije - Verzija je lažirana - Verzija nije lažirana - "Verzija aplikacije će biti lažirana na stariju verziju YouTubea. + + + Lažirana verzija aplikacije + Verzija je lažirana + Verzija nije lažirana + "Verzija aplikacije će biti lažirana na stariju verziju YouTubea. Ovo će promeniti izgled i funkcije aplikacije, ali se mogu pojaviti i nepoznati neželjeni efekti. Ako se kasnije isključi, preporučuje se da izbrišete podatke aplikacije da biste sprečili greške u korisničkom interfejsu." - Ciljna verzija aplikacije za lažiranje - 20.13.41 - Vraća neskupljenu traku radnji videa - 20.05.46 - Vrati funkcionalnost transkripta - 19.35.36 - Vraća stare ikonice Shorts plejera - 19.01.34 - Vraća stare ikonice navigacije - - - Promena polazne stranice - Podrazumevana - Sva praćenja - Pretraga kanala - Kursevi / Učenje - Istraži - Moda i lepota - Video igre - Istorija - Zbirka - Lajkovani videi - Uživo - Filmovi - Muzika - Vesti - Obaveštenja - Plejliste - Pretraga - Kupovina - Sport - Praćenja - U trendu - Virtuelna realnost - Za kasnije - Vaši klipovi - Uvek menjaj polaznu stranicu - "Polazna stranica se uvek menja + Ciljna verzija aplikacije za lažiranje + 20.13.41 - Vraća neskupljenu traku radnji videa + 20.05.46 - Vrati funkcionalnost transkripta + 19.35.36 - Vraća stare ikonice Shorts plejera + 19.01.34 - Vraća stare ikonice navigacije + + + Promena polazne stranice + Podrazumevana + Sva praćenja + Pretraga kanala + Kursevi / Učenje + Istraži + Moda i lepota + Video igre + Istorija + Zbirka + Lajkovani videi + Uživo + Filmovi + Muzika + Vesti + Obaveštenja + Plejliste + Pretraga + Kupovina + Sport + Praćenja + U trendu + Virtuelna realnost + Za kasnije + Vaši klipovi + Uvek menjaj polaznu stranicu + "Polazna stranica se uvek menja Ograničenje: Korišćenje dugmeta „Nazad” na traci sa alatkama možda neće raditi" - Polazna stranica se menja samo pri pokretanju aplikacije - - - Onemogući nastavak reprodukcije Shorts plejera - Shorts plejer neće nastaviti reprodukciju pri pokretanju aplikacije - Shorts plejer će nastaviti reprodukciju pri pokretanju aplikacije - - - Otvorite Shorts pomoću - Shorts plejera - Običnog plejera - Običnog plejera u režimu celog ekranu - - - Autoplej Shorts videa - Shorts videi će se automatski puštati - Shorts videi će se ponavljati - Autoplej Shorts videa u pozadini - Shorts videi će se automatski puštati u pozadini - Shorts videi će se ponavljati u pozadini - - - Mini-plejer - Promenite stil minimiziranog plejera u aplikaciji - Tip mini-plejera - Onemogućen - Podrazumevan - Minimalan - Moderan 1 - Moderan 2 - Moderan 3 - Moderan 4 - Onemogući zaobljene uglove - Uglovi su kvadratni - Uglovi su zaobljeni - Omogući dvostruki dodir i štipanje za promenu veličine - "Radnja dvostrukog dodira i štipanja za promenu veličine je omogućena + Polazna stranica se menja samo pri pokretanju aplikacije + + + Onemogući nastavak reprodukcije Shorts plejera + Shorts plejer neće nastaviti reprodukciju pri pokretanju aplikacije + Shorts plejer će nastaviti reprodukciju pri pokretanju aplikacije + + + Otvorite Shorts pomoću + Shorts plejera + Običnog plejera + Običnog plejera u režimu celog ekranu + + + Autoplej Shorts videa + Shorts videi će se automatski puštati + Shorts videi će se ponavljati + Autoplej Shorts videa u pozadini + Shorts videi će se automatski puštati u pozadini + Shorts videi će se ponavljati u pozadini + + + Mini-plejer + Promenite stil minimiziranog plejera u aplikaciji + Tip mini-plejera + Onemogućen + Podrazumevan + Minimalan + Moderan 1 + Moderan 2 + Moderan 3 + Moderan 4 + Onemogući zaobljene uglove + Uglovi su kvadratni + Uglovi su zaobljeni + Omogući dvostruki dodir i štipanje za promenu veličine + "Radnja dvostrukog dodira i štipanja za promenu veličine je omogućena • Dvaput dodirnite da biste povećali veličinu mini-plejera • Dvaput dodirnite ponovo da biste vratili originalnu veličinu" - Radnja dvostrukog dodira i štipanja za promenu veličine je onemogućena - Onemogući prevlačenje i otpuštanje - Prevlačenje i otpuštanje je onemogućeno - "Povlačenje i otpuštanje je omogućeno + Radnja dvostrukog dodira i štipanja za promenu veličine je onemogućena + Onemogući prevlačenje i otpuštanje + Prevlačenje i otpuštanje je onemogućeno + "Povlačenje i otpuštanje je omogućeno Mini-plejer se može prevući u bilo koji ugao ekrana" - Onemogući pokret horizontalnog prevlačenja - Pokret horizontalnog prevlačenja je onemogućen - "Pokret horizontalnog prevlačenja je omogućen + Onemogući pokret horizontalnog prevlačenja + Pokret horizontalnog prevlačenja je onemogućen + "Pokret horizontalnog prevlačenja je omogućen Mini-plejer se može prevući sa ekrana ulevo ili udesno" - Sakrij dugmad preklopa - Dugmad preklopa su skrivena - Dugmad preklopa su prikazana - Sakrij podtekstove - Podtekstovi su skriveni - Podtekstovi su prikazani - Sakrij dugmad za premotavanje unapred i unazad - Dugmad za premotavanje unapred i unazad su skrivena - Dugmad za premotavanje unapred i unazad su prikazana - Polazna veličina - Polazna veličina ekrana, u pikselima - Veličina piksela mora biti između %1$s i %2$s - Neprozirnost preklopa - Vrednost neprozirnosti između 0 i 100, gde je 0 prozirno - Neprozirnost preklopa mini-plejera mora biti između 0 i 100 - - - Omogući gradijentnu pozadinu ekrana učitavanja - Ekran učitavanja će imati gradijentnu pozadinu - Ekran učitavanja će imati običnu pozadinu - Stil ekrana pokretanja - Boja - Crno-belo - Omogući prilagođenu boju trake za premotavanje - Prilagođena boja trake za premotavanje je prikazana - Originalna boja trake za premotavanje je prikazana - Prilagođena boja trake za premotavanje - Boja trake za premotavanje - Prilagođena boja naglašavanja trake za premotavanje - Boja naglašavanja trake za premotavanje - Nevažeća vrednost boje trake za premotavanje - - - - - Logotip u zaglavlju - Podrazumevani - Obični - - ReVanced minimalistički - Prilagođeni - - - Zaobiđi ograničenja regiona slike - Korišćenje hosta slike yt4.ggpht.com - "Korišćenje originalnog hosta slike + Sakrij dugmad preklopa + Dugmad preklopa su skrivena + Dugmad preklopa su prikazana + Sakrij podtekstove + Podtekstovi su skriveni + Podtekstovi su prikazani + Sakrij dugmad za premotavanje unapred i unazad + Dugmad za premotavanje unapred i unazad su skrivena + Dugmad za premotavanje unapred i unazad su prikazana + Polazna veličina + Polazna veličina ekrana, u pikselima + Veličina piksela mora biti između %1$s i %2$s + Neprozirnost preklopa + Vrednost neprozirnosti između 0 i 100, gde je 0 prozirno + Neprozirnost preklopa mini-plejera mora biti između 0 i 100 + + + Omogući gradijentnu pozadinu ekrana učitavanja + Ekran učitavanja će imati gradijentnu pozadinu + Ekran učitavanja će imati običnu pozadinu + Stil ekrana pokretanja + Boja + Crno-belo + Omogući prilagođenu boju trake za premotavanje + Prilagođena boja trake za premotavanje je prikazana + Originalna boja trake za premotavanje je prikazana + Prilagođena boja trake za premotavanje + Boja trake za premotavanje + Prilagođena boja naglašavanja trake za premotavanje + Boja naglašavanja trake za premotavanje + Nevažeća vrednost boje trake za premotavanje + + + + Logotip u zaglavlju + Podrazumevani + Obični + + ReVanced minimalistički + Prilagođeni + + + Zaobiđi ograničenja regiona slike + Korišćenje hosta slike yt4.ggpht.com + "Korišćenje originalnog hosta slike Ako ovo omogućite, mogu se popraviti nedostajuće slike koje su blokirane u nekim regionima" - - - - Kartica „Početna” - - Kartica „Praćenja” - - Kartica „Vi” - Plejliste plejera i preporuke - Rezultati pretrage - Originalne sličice - DeArrow i originalne sličice - DeArrow i zahvati kadra - Zahvati kadra - "DeArrow pruža sličice za YouTube videe prikupljene od zajednice korisnika. Ove sličice su često relevantnije od onih koje pruža YouTube + + + + Kartica „Početna” + + Kartica „Praćenja” + + Kartica „Vi” + Plejliste plejera i preporuke + Rezultati pretrage + Originalne sličice + DeArrow i originalne sličice + DeArrow i zahvati kadra + Zahvati kadra + "DeArrow pruža sličice za YouTube videe prikupljene od zajednice korisnika. Ove sličice su često relevantnije od onih koje pruža YouTube Ako je omogućeno, linkovi videa će biti poslati na API server i nikakvi drugi podaci se neće slati. Ako video nema DeArrow sličice, onda se prikazuju originalne ili zahvati kadra Dodirnite ovde da saznate više o DeArrowu" - Prikaži iskačuće obaveštenje ako API nije dostupan - Iskačuće obaveštenje je prikazano, ako DeArrow nije dostupan - Iskačuće obaveštenje nije prikazano, ako DeArrow nije dostupan - Krajnja tačka DeArrow API-ja - URL krajnje tačke keša DeArrow sličica - Zahvati kadra iz videa - Zahvati kadra se prave od početka/sredine/kraja svakog videa. Ove slike su ugrađene u YouTube i ne koristi se nijedan spoljni API - Koristi brze zahvate kadra - Koriste se zahvati kadra srednjeg kvaliteta. Sličice će se brže učitavati, ali strimovi uživo, neobjavljeni ili veoma stari videi mogu da prikazuju prazne sličice - Koriste se zahvati kadra visokog kvaliteta - Vreme videa za pravljenje zahvata kadra - Početak videa - Sredina videa - Kraj videa - - DeArrow privremeno nije dostupan (kôd statusa: %s) - DeArrow privremeno nije dostupan - - - Prikaži saopštenja ReVanceda - Saopštenja pri pokretanju su prikazana - Saopštenja pri pokretanju nisu prikazana - Prikazivanje saopštenja pri pokretanju - Neuspešno povezivanje sa pružaocem saopštenja - Odbaci - - - Omogući ponavljanje videa - Video će se ponavljati - Video se neće ponavljati - - - Prikaži dugme za ponavljanje videa - Dugme je prikazano - Dugme nije prikazano - Ponavljanje videa je uključeno - Ponavljanje videa je isključeno - - - - - Lažirane dimenzije uređaja - "Dimenzije uređaja su lažirane + Prikaži iskačuće obaveštenje ako API nije dostupan + Iskačuće obaveštenje je prikazano, ako DeArrow nije dostupan + Iskačuće obaveštenje nije prikazano, ako DeArrow nije dostupan + Krajnja tačka DeArrow API-ja + URL krajnje tačke keša DeArrow sličica + Zahvati kadra iz videa + Zahvati kadra se prave od početka/sredine/kraja svakog videa. Ove slike su ugrađene u YouTube i ne koristi se nijedan spoljni API + Koristi brze zahvate kadra + Koriste se zahvati kadra srednjeg kvaliteta. Sličice će se brže učitavati, ali strimovi uživo, neobjavljeni ili veoma stari videi mogu da prikazuju prazne sličice + Koriste se zahvati kadra visokog kvaliteta + Vreme videa za pravljenje zahvata kadra + Početak videa + Sredina videa + Kraj videa + + DeArrow privremeno nije dostupan (kôd statusa: %s) + DeArrow privremeno nije dostupan + + + Prikaži saopštenja ReVanceda + Saopštenja pri pokretanju su prikazana + Saopštenja pri pokretanju nisu prikazana + Prikazivanje saopštenja pri pokretanju + Neuspešno povezivanje sa pružaocem saopštenja + Odbaci + + + Omogući ponavljanje videa + Video će se ponavljati + Video se neće ponavljati + + + Prikaži dugme za ponavljanje videa + Dugme je prikazano + Dugme nije prikazano + Ponavljanje videa je uključeno + Ponavljanje videa je isključeno + + + + Lažirane dimenzije uređaja + "Dimenzije uređaja su lažirane Viši kvaliteti videa mogu biti otključani, ali može doći do zastoja pri reprodukciji videa, kraćeg trajanja baterije i nepoznatih neželjenih efekata" - "Dimenzije uređaja nisu lažirane + "Dimenzije uređaja nisu lažirane Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" - Ako ovo omogućite, može doći do zastoja pri reprodukciji videa, kraćeg trajanja baterije i nepoznatih neželjenih efekata. - - - Vibracija pri dodiru - Promeni vibraciju pri dodiru - Onemogući vibraciju poglavlja - Vibracija poglavlja je onemogućena - Vibracija poglavlja je omogućena - Onemogući vibraciju preciznog premotavanja - Vibracija preciznog premotavanja je onemogućena - Vibracija preciznog premotavanja je omogućena - Onemogući vibraciju poništavanja premotavanja - Vibracija poništavanja premotavanja je onemogućena - Vibracija poništavanja premotavanja je omogućena - Onemogući vibraciju pri uveličavanju - Vibracija pri uveličavanju je onemogućena - Vibracija pri uveličavanju je omogućena - - - Ako ste nedavno promenili podatke za prijavu na nalog, deinstalirajte i ponovo instalirajte MicroG. - - - Zaobiđi URL preusmeravanja - URL preusmeravanja se zaobilaze - URL preusmeravanja se ne zaobilaze - - - Otvori linkove u pregledaču - Otvaranje linkova u spoljnom pregledaču - Otvaranje linkova u pregledaču u aplikaciji - - - - Automatski - Zapamti promene kvaliteta videa - Promene kvaliteta se primenjuju na sve videe - Promene kvaliteta se primenjuju samo na trenutni video - Prikaži iskačuće obaveštenje pri promeni kvaliteta videa - Iskačuće obaveštenje je prikazano, kada se promeni podrazumevani kvalitet videa - Iskačuće obaveštenje nije prikazano, kada se promeni podrazumevani kvalitet videa - Podrazumevani kvalitet videa na Wi-Fi mreži - Podrazumevani kvalitet videa na mobilnoj mreži - Zapamti promene kvaliteta Shorts videa - Promene kvaliteta se primenjuju na sve Shorts videe - Promene kvaliteta se primenjuju samo na trenutni Shorts video - Podrazumevani kvalitet Shorts videa na Wi-Fi mreži - Podrazumevani kvalitet Shorts videa na mobilnoj mreži - mobilnoj mreži - Wi-Fi mreži - Kvalitet na %1$s promenjen na: %2$s - Kvalitet Shorts videa na %1$s promenjen na: %2$s - - - Prikaži dugme dijaloga za brzinu - Dugme dijaloga za brzinu je prikazano. Dodirnite i zadržite da biste vratili brzinu reprodukcije na podrazumevanu vrednost - Dugme dijaloga za brzinu nije prikazano - - - Prikaži dugme kvaliteta videa - Dugme za kvalitet videa je prikazano. Dodirnite i zadržite da biste vratili kvalitet na podrazumevanu vrednost - Dugme za kvalitet videa nije prikazano - - - Meni prilagođene brzine reprodukcije - Meni prilagođene brzine reprodukcije je prikazan - Meni prilagođene brzine reprodukcije nije prikazan - Vrati stari meni za brzinu reprodukcije - Prikazan je stari meni brzine reprodukcije - Prikazan je moderni meni brzine reprodukcije - Prilagođene brzine reprodukcije - Dodajte ili promenite prilagođene brzine reprodukcije - Prilagođene brzine moraju biti manje od %s - Nevažeće prilagođene brzine reprodukcije - Automatski - Prilagođena brzina dodirivanja i zadržavanja - Brzina reprodukcije između 0 i 8 - - - Zapamti promene brzine reprodukcije - Promene brzine reprodukcije se primenjuju na sve videe - Promene brzine reprodukcije se primenjuju samo na trenutni video - Prikaži iskačuće obaveštenje pri promeni brzine reprodukcije - Iskačuće obaveštenje je prikazano, kada se promeni podrazumevana brzina reprodukcije - Iskačuće obaveštenje nije prikazano, kada se promeni podrazumevana brzina reprodukcije - Podrazumevana brzina reprodukcije - Brzina reprodukcije promenjena na: %s - - - Onemogući HDR video - HDR video je onemogućen - HDR video je omogućen - Prisili AVC (H.264) - Video kodek je prisiljen na AVC (H.264) - Video kodek se određuje automatski - "Prednosti: + Ako ovo omogućite, može doći do zastoja pri reprodukciji videa, kraćeg trajanja baterije i nepoznatih neželjenih efekata. + + + Vibracija pri dodiru + Promeni vibraciju pri dodiru + Onemogući vibraciju poglavlja + Vibracija poglavlja je onemogućena + Vibracija poglavlja je omogućena + Onemogući vibraciju preciznog premotavanja + Vibracija preciznog premotavanja je onemogućena + Vibracija preciznog premotavanja je omogućena + Onemogući vibraciju poništavanja premotavanja + Vibracija poništavanja premotavanja je onemogućena + Vibracija poništavanja premotavanja je omogućena + Onemogući vibraciju pri uveličavanju + Vibracija pri uveličavanju je onemogućena + Vibracija pri uveličavanju je omogućena + + + Ako ste nedavno promenili podatke za prijavu na nalog, deinstalirajte i ponovo instalirajte MicroG. + + + Zaobiđi URL preusmeravanja + URL preusmeravanja se zaobilaze + URL preusmeravanja se ne zaobilaze + + + Otvori linkove u pregledaču + Otvaranje linkova u spoljnom pregledaču + Otvaranje linkova u pregledaču u aplikaciji + + + + Automatski + Zapamti promene kvaliteta videa + Promene kvaliteta se primenjuju na sve videe + Promene kvaliteta se primenjuju samo na trenutni video + Prikaži iskačuće obaveštenje pri promeni kvaliteta videa + Iskačuće obaveštenje je prikazano, kada se promeni podrazumevani kvalitet videa + Iskačuće obaveštenje nije prikazano, kada se promeni podrazumevani kvalitet videa + Podrazumevani kvalitet videa na Wi-Fi mreži + Podrazumevani kvalitet videa na mobilnoj mreži + Zapamti promene kvaliteta Shorts videa + Promene kvaliteta se primenjuju na sve Shorts videe + Promene kvaliteta se primenjuju samo na trenutni Shorts video + Podrazumevani kvalitet Shorts videa na Wi-Fi mreži + Podrazumevani kvalitet Shorts videa na mobilnoj mreži + mobilnoj mreži + Wi-Fi mreži + Kvalitet na %1$s promenjen na: %2$s + Kvalitet Shorts videa na %1$s promenjen na: %2$s + + + Prikaži dugme dijaloga za brzinu + Dugme dijaloga za brzinu je prikazano. Dodirnite i zadržite da biste vratili brzinu reprodukcije na podrazumevanu vrednost + Dugme dijaloga za brzinu nije prikazano + + + Prikaži dugme kvaliteta videa + Dugme za kvalitet videa je prikazano. Dodirnite i zadržite da biste vratili kvalitet na podrazumevanu vrednost + Dugme za kvalitet videa nije prikazano + + + Meni prilagođene brzine reprodukcije + Meni prilagođene brzine reprodukcije je prikazan + Meni prilagođene brzine reprodukcije nije prikazan + Vrati stari meni za brzinu reprodukcije + Prikazan je stari meni brzine reprodukcije + Prikazan je moderni meni brzine reprodukcije + Prilagođene brzine reprodukcije + Dodajte ili promenite prilagođene brzine reprodukcije + Prilagođene brzine moraju biti manje od %s + Nevažeće prilagođene brzine reprodukcije + Automatski + Prilagođena brzina dodirivanja i zadržavanja + Brzina reprodukcije između 0 i 8 + + + Zapamti promene brzine reprodukcije + Promene brzine reprodukcije se primenjuju na sve videe + Promene brzine reprodukcije se primenjuju samo na trenutni video + Prikaži iskačuće obaveštenje pri promeni brzine reprodukcije + Iskačuće obaveštenje je prikazano, kada se promeni podrazumevana brzina reprodukcije + Iskačuće obaveštenje nije prikazano, kada se promeni podrazumevana brzina reprodukcije + Podrazumevana brzina reprodukcije + Brzina reprodukcije promenjena na: %s + + + Onemogući HDR video + HDR video je onemogućen + HDR video je omogućen + Prisili AVC (H.264) + Video kodek je prisiljen na AVC (H.264) + Video kodek se određuje automatski + "Prednosti: • Može poboljšati trajanje baterije • Može vratiti nedostajuće rezolucije videa na starijim uređajima @@ -1640,179 +1637,178 @@ Ograničenja: • Reprodukcija videa će koristiti više internet podataka nego VP9 ili AV1 • HDR videi neće koristiti AVC • Neki uređaji ne mogu prisiliti AVC" - - - Prikaži napredni meni kvaliteta videa - Napredni meni kvaliteta videa je prikazan - Napredni meni kvaliteta videa nije prikazan - - - Omogući prevlačenje za premotavanje - Prevlačenje za premotavanje je omogućeno - Prevlaćenje za premotavanje nije omogućeno - - - Dozvoli Android VR AV1 - "Video kodek je AVC (H.264), VP9 ili AV1 + + + Prikaži napredni meni kvaliteta videa + Napredni meni kvaliteta videa je prikazan + Napredni meni kvaliteta videa nije prikazan + + + Omogući prevlačenje za premotavanje + Prevlačenje za premotavanje je omogućeno + Prevlaćenje za premotavanje nije omogućeno + + + Dozvoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ili AV1 Reprodukcija može zastajkivati ili preskakati kadrove" - Video kodek je AVC (H.264) ili VP9 - "Omogućavanje ove opcije može koristiti softversko dekodiranje AV1. + Video kodek je AVC (H.264) ili VP9 + "Omogućavanje ove opcije može koristiti softversko dekodiranje AV1. Reprodukcija videa s AV1 može zastajkivati ili preskakati kadrove." - Neželjeni efekti lažiranja - • Eksperimentalni klijent i može prestati da radi bilo kada - • Video se može zaustaviti u 1:00 ili možda neće biti dostupan u nekim regionima - • Meni „Audio snimak” nedostaje - • Nema video kodeka AV1 - • Opcija „Ujednačena jačina zvuka” nije dostupna - • Videi za decu se možda neće puštati kada ste odjavljeni ili u režimu bez arhiviranja - - • Prisiljavanje originalnog zvuka nije dostupno - Prikaži u „Statistici za znalce” - Tip klijenta je prikazan u „Statistici za znalce” - Tip klijenta je skriven u „Statistici za znalce” - - - - - - - O programu - Oglasi - Opšte - Plejer - Razno - - - Sakrij video oglase - Video oglasi su skriveni - Video oglasi su prikazani - - - Omogući trajno ponavljanje - Trajno ponavljanje je omogućeno - Trajno ponavljanje je onemogućeno - - - Sakrij dugme „Prebacuj” - Dugme „Prebacuj” je skriveno - Dugme „Prebacuj” je prikazano - Sakrij dugme „Istorija” - Dugme „Istorija” je skriveno - Dugme „Istorija” je prikazano - Sakrij dugme „Obaveštenje” - Dugme „Obaveštenje” je skriveno - Dugme „Obaveštenje” je prikazano - Sakrij dugme „Pretraga” - Dugme „Pretraga” je skriveno - Dugme „Pretraga” je prikazano - - - Sakrij traku kategorija - Traka kategorija je skrivena - Traka kategorija je prikazana - - - Promeni boju mini-plejera - Boja mini-plejera odgovara plejeru preko celog ekrana - Mini-plejer koristi podrazumevanu boju - - - Traka za navigaciju - Sakrijte ili promenite dugmad trake za navigaciju - - Sakrij dugme „Početna” - Dugme „Početna” je skriveno - Dugme „Početna” je prikazano - - Sakrij dugme „Semplovi” - Dugme „Semplovi” je skriveno - Dugme „Semplovi” je prikazano - - Sakrij dugme „Istražite” - Dugme „Istražite” je skriveno - Dugme „Istražite” je prikazano - - Sakrij dugme „Zbirka” - Dugme „Zbirka” je skriveno - Dugme „Zbirka” je prikazano - - Sakrij dugme „Nadogradi” - Dugme „Nadogradi” je skriveno - Dugme „Nadogradi” je prikazano - Sakrij traku za navigaciju - Traka za navigaciju je skrivena - Traka za navigaciju je prikazana - Sakrij oznake dugmadi za navigaciju - Oznake su skrivene - Oznake su prikazane - - - Sakrij oznaku „Nabavite Music Premium” - Oznaka je skrivena - Oznaka je prikazana - - - Sakrij dugme za nadogradnju - Dugme je skriveno - Dugme je prikazano - - - - - Blokiraj audio oglase - Audio oglasi su blokirani - Audio oglasi su odblokirani - - - %s nije dostupan, oglasi se možda prikazuju. Pokušajte da promenite uslugu blokiranja oglasa u podešavanjima. - %s je vratio grešku, oglasi se mogu prikazivati. Pokušajte da promenite uslugu blokiranja oglasa u postavkama. - Blokiraj ugrađene video oglase - Onemogućeno - Luminous proksi - PurpleAdBlock proksi - - - Blokiraj video oglase - Video oglasi su blokirani - Video oglasi su odblokirani - - - Poruka izbrisana - Prikaz izbrisanih poruka - Ne prikazuj izbrisane poruke - Sakrij izbrisane poruke iza spojlera - Prikaži izbrisane poruke kao precrtan tekst - - - Automatski preuzmi bodove kanala - Bodovi kanala su automatski preuzeti - Bodovi kanala nisu automatski preuzeti - - - - Omogući režim otklanjanja grešaka Twitch - Režim otklanjanja grešaka Twitch je omogućen (nije preporučeno) - Režim otklanjanja grešaka Twitch je onemogućen - - - Podešavanja ReVanceda - O programu - O ReVancedu - Blokiranje oglasa - Podešavanja blokiranja oglasa - Ćaskanje - Podešavanja ćaskanja - Razno - Razna podešavanja - Opšta podešavanja - Ostala podešavanja - Oglasi na strani klijenta - Oglasi na strani servera - Evidentiranje otklanjanja grešaka - Evidencije otklanjanja grešaka su omogućene - Evidencije otklanjanja grešaka su onemogućene - - + Neželjeni efekti lažiranja + • Eksperimentalni klijent i može prestati da radi bilo kada + • Video se može zaustaviti u 1:00 ili možda neće biti dostupan u nekim regionima + • Meni „Audio snimak” nedostaje + • Nema video kodeka AV1 + • Opcija „Ujednačena jačina zvuka” nije dostupna + • Videi za decu se možda neće puštati kada ste odjavljeni ili u režimu bez arhiviranja + + • Prisiljavanje originalnog zvuka nije dostupno + Prikaži u „Statistici za znalce” + Tip klijenta je prikazan u „Statistici za znalce” + Tip klijenta je skriven u „Statistici za znalce” + + + + + + O programu + Oglasi + Opšte + Plejer + Razno + + + Sakrij video oglase + Video oglasi su skriveni + Video oglasi su prikazani + + + Omogući trajno ponavljanje + Trajno ponavljanje je omogućeno + Trajno ponavljanje je onemogućeno + + + Sakrij dugme „Prebacuj” + Dugme „Prebacuj” je skriveno + Dugme „Prebacuj” je prikazano + Sakrij dugme „Istorija” + Dugme „Istorija” je skriveno + Dugme „Istorija” je prikazano + Sakrij dugme „Obaveštenje” + Dugme „Obaveštenje” je skriveno + Dugme „Obaveštenje” je prikazano + Sakrij dugme „Pretraga” + Dugme „Pretraga” je skriveno + Dugme „Pretraga” je prikazano + + + Sakrij traku kategorija + Traka kategorija je skrivena + Traka kategorija je prikazana + + + Promeni boju mini-plejera + Boja mini-plejera odgovara plejeru preko celog ekrana + Mini-plejer koristi podrazumevanu boju + + + Traka za navigaciju + Sakrijte ili promenite dugmad trake za navigaciju + + Sakrij dugme „Početna” + Dugme „Početna” je skriveno + Dugme „Početna” je prikazano + + Sakrij dugme „Semplovi” + Dugme „Semplovi” je skriveno + Dugme „Semplovi” je prikazano + + Sakrij dugme „Istražite” + Dugme „Istražite” je skriveno + Dugme „Istražite” je prikazano + + Sakrij dugme „Zbirka” + Dugme „Zbirka” je skriveno + Dugme „Zbirka” je prikazano + + Sakrij dugme „Nadogradi” + Dugme „Nadogradi” je skriveno + Dugme „Nadogradi” je prikazano + Sakrij traku za navigaciju + Traka za navigaciju je skrivena + Traka za navigaciju je prikazana + Sakrij oznake dugmadi za navigaciju + Oznake su skrivene + Oznake su prikazane + + + Sakrij oznaku „Nabavite Music Premium” + Oznaka je skrivena + Oznaka je prikazana + + + Sakrij dugme za nadogradnju + Dugme je skriveno + Dugme je prikazano + + + + + Blokiraj audio oglase + Audio oglasi su blokirani + Audio oglasi su odblokirani + + + %s nije dostupan, oglasi se možda prikazuju. Pokušajte da promenite uslugu blokiranja oglasa u podešavanjima. + %s je vratio grešku, oglasi se mogu prikazivati. Pokušajte da promenite uslugu blokiranja oglasa u postavkama. + Blokiraj ugrađene video oglase + Onemogućeno + Luminous proksi + PurpleAdBlock proksi + + + Blokiraj video oglase + Video oglasi su blokirani + Video oglasi su odblokirani + + + Poruka izbrisana + Prikaz izbrisanih poruka + Ne prikazuj izbrisane poruke + Sakrij izbrisane poruke iza spojlera + Prikaži izbrisane poruke kao precrtan tekst + + + Automatski preuzmi bodove kanala + Bodovi kanala su automatski preuzeti + Bodovi kanala nisu automatski preuzeti + + + + Omogući režim otklanjanja grešaka Twitch + Režim otklanjanja grešaka Twitch je omogućen (nije preporučeno) + Režim otklanjanja grešaka Twitch je onemogućen + + + Podešavanja ReVanceda + O programu + O ReVancedu + Blokiranje oglasa + Podešavanja blokiranja oglasa + Ćaskanje + Podešavanja ćaskanja + Razno + Razna podešavanja + Opšta podešavanja + Ostala podešavanja + Oglasi na strani klijenta + Oglasi na strani servera + Evidentiranje otklanjanja grešaka + Evidencije otklanjanja grešaka su omogućene + Evidencije otklanjanja grešaka su onemogućene + + diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index c0b6dc3684..6caf85033b 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - Назив апликације - - Прилагођено - Иконица апликације - Оригинална - - ReVanced минимална - ReVanced скалирана - - Прилагођено - - - Провере нису успеле - Отвори званични веб-сајт - Занемари - <h5>Изгледа да нисте ви печовали ову апликацију.</h5><br>Ова апликација можда неће исправно радити, <b>може бити штетна или чак опасна за коришћење.</b><br><br>Ове провере подразумевају да је ова апликација унапред печована или добијена од неког другог:<br><br><small>%1$s</small><br>Изричито се препоручује да <b>деинсталирате ову апликацију и сами је печујете</b> да бисте били сигурни да користите проверену и безбедну апликацију.<p><br>Ако се занемари, ово упозорење ће бити приказано само два пута. - Печовано на другом уређају - Није инсталирано у ReVanced Manager-у - Печовано пре више од 10 минута - Печовано пре %s дана - Датум израде APK-а је оштећен - - - ReVanced обавештење - Ваша историја гледања се не чува.<br><br>Ово је највероватније узроковано DNS блокатором огласа или мрежним проксијем.<br><br>Да бисте ово поправили, ставите на белу листу <b>s.youtube.com</b> или искључите све DNS блокаторе и проксије. - Не приказуј поново - - - Подешавања - Желите ли заиста да наставите? - Сачувај - Ресетуј - Ресетуј боју - Неважећа боја - Потребно је рестартовање - Рестартујте апликацију да би ова промена ступила на снагу. - Рестартуј - Увоз - Копирај - Подешавања ReVanced-а су враћена на подразумеване вредности - Увезено %d подешавања - Неуспешан увоз: %s - Претражите подешавања - Нису пронађени резултати за „%s” - Покушајте са другом кључном речи - Недавне претраге - Уклонити из историје претраге? - Очисти историју претраге - Желите ли заиста да очистите целу историју претраге? - Савети за претрагу - "• Додирните путању да бисте се кретали до ње +--> + + + Назив апликације + + Прилагођено + Иконица апликације + Оригинална + + ReVanced минимална + ReVanced скалирана + + Прилагођено + + + Провере нису успеле + Отвори званични веб-сајт + Занемари + <h5>Изгледа да нисте ви печовали ову апликацију.</h5><br>Ова апликација можда неће исправно радити, <b>може бити штетна или чак опасна за коришћење.</b><br><br>Ове провере подразумевају да је ова апликација унапред печована или добијена од неког другог:<br><br><small>%1$s</small><br>Изричито се препоручује да <b>деинсталирате ову апликацију и сами је печујете</b> да бисте били сигурни да користите проверену и безбедну апликацију.<p><br>Ако се занемари, ово упозорење ће бити приказано само два пута. + Печовано на другом уређају + Није инсталирано у ReVanced Manager-у + Печовано пре више од 10 минута + Печовано пре %s дана + Датум израде APK-а је оштећен + + + ReVanced обавештење + Ваша историја гледања се не чува.<br><br>Ово је највероватније узроковано DNS блокатором огласа или мрежним проксијем.<br><br>Да бисте ово поправили, ставите на белу листу <b>s.youtube.com</b> или искључите све DNS блокаторе и проксије. + Не приказуј поново + + + Подешавања + Желите ли заиста да наставите? + Сачувај + Ресетуј + Ресетуј боју + Неважећа боја + Потребно је рестартовање + Рестартујте апликацију да би ова промена ступила на снагу. + Рестартуј + Увоз + Копирај + Подешавања ReVanced-а су враћена на подразумеване вредности + Увезено %d подешавања + Неуспешан увоз: %s + Претражите подешавања + Нису пронађени резултати за „%s” + Покушајте са другом кључном речи + Недавне претраге + Уклонити из историје претраге? + Очисти историју претраге + Желите ли заиста да очистите целу историју претраге? + Савети за претрагу + "• Додирните путању да бисте се кретали до ње • Дуго додирните подешавање да бисте дошли до њега • Притисните Enter да бисте сачували упит за претрагу у историји • Претрага занемарује велика и мала слова и интерпункцију • Родитељска подешавања се појављују изнад онемогућених дечјих подешавања" - Историја претраге је празна - Да бисте сачували историју претраге, унесите упит за претрагу и притисните Enter - Прикажи историју претраге подешавања - Историја претраге подешавања је приказана - Историја претраге подешавања није приказана - Прикажи иконице подешавања ReVanced-а - Иконице подешавања су приказане - Иконице подешавања нису приказане - Језик ReVanced-a - "Преводи за неке језике могу недостајати или бити непотпуни. + Историја претраге је празна + Да бисте сачували историју претраге, унесите упит за претрагу и притисните Enter + Прикажи историју претраге подешавања + Историја претраге подешавања је приказана + Историја претраге подешавања није приказана + Прикажи иконице подешавања ReVanced-а + Иконице подешавања су приказане + Иконице подешавања нису приказане + Језик ReVanced-a + "Преводи за неке језике могу недостајати или бити непотпуни. Да бисте превели нове језике или побољшали постојеће преводе, посетите translate.revanced.app" - Језик апликације - Увоз / Извоз - Увоз / Извоз подешавања ReVanced-а - - Користите верзију <i>%s</i> ReVanced печева - Напомена - Ова верзија је предиздање и можда ћете имати неочекиване проблеме - Званични линкови - + Користите верзију <i>%s</i> ReVanced печева + Напомена + Ова верзија је предиздање и можда ћете имати неочекиване проблеме + Званични линкови + - - - Подешавања GmsCore-а - Подешавања за GmsCore - - MicroG GmsCore није инсталиран. Инсталирајте га. - Неопходна радња - "MicroG GmsCore нема дозволу за рад у позадини. + + + Подешавања GmsCore-а + Подешавања за GmsCore + + MicroG GmsCore није инсталиран. Инсталирајте га. + Неопходна радња + "MicroG GmsCore нема дозволу за рад у позадини. Пратите упутство „Don't kill my app” за ваш телефон и примените упутства на вашу MicroG инсталацију. Ово је неопходно за рад апликације." - Отвори веб-сајт - "Оптимизације батерије за MicroG GmsCore морају бити онемогућене да би се спречили проблеми. + Отвори веб-сајт + "Оптимизације батерије за MicroG GmsCore морају бити онемогућене да би се спречили проблеми. Онемогућавање оптимизације батерије за MicroG неће негативно утицати на потрошњу батерије. Додирните дугме „Настави” и дозволите промене оптимизације." - Настави - - - Лажирани видео стримови - Лажирање видео стримова клијента да би се спречили проблеми са репродукцијом - Лажирани видео стримови - "Видео стримови су лажирани + Настави + + + Лажирани видео стримови + Лажирање видео стримова клијента да би се спречили проблеми са репродукцијом + Лажирани видео стримови + "Видео стримови су лажирани Ако сте корисник YouTube Premium-а, ово подешавање можда неће бити потребно" - "Видео стримови нису лажирани + "Видео стримови нису лажирани Репродукција можда неће радити" - Искључивање овог подешавања може изазвати проблеме са репродукцијом. - Подразумевани клијент - - - Присили оригинални језик звука - Коришћење оригиналног језика звука - Коришћење подразумеваног звука - - Да бисте користили ову функцију, промените опцију „Лажирани видео стримови” на било који клијент осим Android Studio - - - Отклањање грешака - Омогућите или онемогућите опције за отклањање грешака - Евидентирање отклањања грешака - Евиденције отклањања грешака су омогућене - Евиденције отклањања грешака су онемогућене - Евидентирање праћења стека - Евиденције отклањања грешака садрже праћење стека - Евиденције отклањања грешака не садрже праћење стека - Прикажи искачуће обавештење при грешци с ReVanced-ом - Искачуће обавештење је приказано, ако дође до грешке - Искачуће обавештење није приказано, ако дође до грешке - "Искључивање искачућих обавештења о грешкама сакрива сва обавештења о грешкама у ReVanced-у. + Искључивање овог подешавања може изазвати проблеме са репродукцијом. + Подразумевани клијент + + + Присили оригинални језик звука + Коришћење оригиналног језика звука + Коришћење подразумеваног звука + + Да бисте користили ову функцију, промените опцију „Лажирани видео стримови” на било који клијент осим Android Studio + + + Отклањање грешака + Омогућите или онемогућите опције за отклањање грешака + Евидентирање отклањања грешака + Евиденције отклањања грешака су омогућене + Евиденције отклањања грешака су онемогућене + Евидентирање праћења стека + Евиденције отклањања грешака садрже праћење стека + Евиденције отклањања грешака не садрже праћење стека + Прикажи искачуће обавештење при грешци с ReVanced-ом + Искачуће обавештење је приказано, ако дође до грешке + Искачуће обавештење није приказано, ако дође до грешке + "Искључивање искачућих обавештења о грешкама сакрива сва обавештења о грешкама у ReVanced-у. Нећете бити обавештени ни о каквим неочекиваним догађајима." - Извези евиденције отклањања грешака - Копира евиденције отклањања грешака ReVanced-а у привремену меморију - Евидентирање отклањања грешака је онемогућено - Нема пронађених евиденција - Евиденције су копиране - Неуспешан извоз евиденција: %s - Избриши евиденције отклањања грешака - Брише све сачуване евиденције отклањања грешака ReVanced-а - Евиденције су избрисане - Менаџер експерименталних ознака - Управљајте експерименталним буловим ознакама - Активне ознаке (%d) - Блокиране ознаке (%d) - Претрага ознака... - Ознаке су сачуване - Ознаке су ресетоване - Ознаке су копиране у привремену меморију - Евидентирање бафера протокола - Евиденције отклањања грешака садрже бафер протокола - Евиденције отклањања грешака не садрже бафер протокола - "Омогућавањем ове опције ће се евидентирати додатни подаци о изгледу, укључујући текст на екрану за неке компоненте корисничког интерфејса. + Извези евиденције отклањања грешака + Копира евиденције отклањања грешака ReVanced-а у привремену меморију + Евидентирање отклањања грешака је онемогућено + Нема пронађених евиденција + Евиденције су копиране + Неуспешан извоз евиденција: %s + Избриши евиденције отклањања грешака + Брише све сачуване евиденције отклањања грешака ReVanced-а + Евиденције су избрисане + Менаџер експерименталних ознака + Управљајте експерименталним буловим ознакама + Активне ознаке (%d) + Блокиране ознаке (%d) + Претрага ознака... + Ознаке су сачуване + Ознаке су ресетоване + Ознаке су копиране у привремену меморију + Евидентирање бафера протокола + Евиденције отклањања грешака садрже бафер протокола + Евиденције отклањања грешака не садрже бафер протокола + "Омогућавањем ове опције ће се евидентирати додатни подаци о изгледу, укључујући текст на екрану за неке компоненте корисничког интерфејса. Ово може помоћи у идентификацији компоненти приликом прављења прилагођених филтера. Међутим, омогућавање овога ће такође евидентирати неке корисничке податке, као што је ваша IP адреса." - - - Очисти дељене линкове - Параметар упита за праћење је уклоњен из дељених линкова - Параметар упита за праћење није уклоњен из дељених линкова - Промени линкове за дељење на youtube.com - Дељени линкови користе youtube.com - Дељени линкови користе music.youtube.com - - - Прилагођени филтер - Сакријте компоненте користећи прилагођене филтере - Омогући прилагођени филтер - Прилагођени филтер је омогућен - Прилагођени филтер је онемогућен - Прилагођени филтер - - Листа стрингова за прављење путање компоненти за филтрирање, одвојена новим редом - Неважећи прилагођени филтер: %s - - - - - О програму - Огласи - Алтернативне сличице - Фид - Опште - Плејер - Трака за премотавање - Контроле превлачења - Разно - Видео - Врати старе меније подешавања - Приказују се стари менији подешавања - Не приказују се стари менији подешавања - - - Онемогући пуштање Shorts видеа у позадини - Пуштање Shorts видеа у позадини је онемогућено - Пуштање Shorts видеа у позадини је омогућено - - - Сакриј картице албума - Картице албума су скривене - Картице албума су приказане - Сакриј картице извођача - Картице извођача су скривене - Картице извођача су приказане - Сакриј полицу ознака сличних видеа - Полица ознака сличних видеа је скривена - Полица ознака сличних видеа је приказана - Сакриј објаве заједнице - Објаве заједнице су скривене - Објаве заједнице су приказане - Сакриј компактне банере - Компактни банери су скривени - Компактни банери су приказани - Сакриј прошириву картицу - Проширива картица испод видеа је скривена - Развучена картица испод видео снимака је приказана - Сакриј плутајуће дугме микрофона - Плутајуће дугме микрофона у претрази је скривено - Плутајуће дугме микрофона у претрази је приказано - Сакриј хоризонталне полице - "Хоризонталне полице су скривене, као што су: + + + Очисти дељене линкове + Параметар упита за праћење је уклоњен из дељених линкова + Параметар упита за праћење није уклоњен из дељених линкова + Промени линкове за дељење на youtube.com + Дељени линкови користе youtube.com + Дељени линкови користе music.youtube.com + + + Прилагођени филтер + Сакријте компоненте користећи прилагођене филтере + Омогући прилагођени филтер + Прилагођени филтер је омогућен + Прилагођени филтер је онемогућен + Прилагођени филтер + + Листа стрингова за прављење путање компоненти за филтрирање, одвојена новим редом + Неважећи прилагођени филтер: %s + + + + + О програму + Огласи + Алтернативне сличице + Фид + Опште + Плејер + Трака за премотавање + Контроле превлачења + Разно + Видео + Врати старе меније подешавања + Приказују се стари менији подешавања + Не приказују се стари менији подешавања + + + Онемогући пуштање Shorts видеа у позадини + Пуштање Shorts видеа у позадини је онемогућено + Пуштање Shorts видеа у позадини је омогућено + + + Сакриј картице албума + Картице албума су скривене + Картице албума су приказане + Сакриј картице извођача + Картице извођача су скривене + Картице извођача су приказане + Сакриј полицу ознака сличних видеа + Полица ознака сличних видеа је скривена + Полица ознака сличних видеа је приказана + Сакриј објаве заједнице + Објаве заједнице су скривене + Објаве заједнице су приказане + Сакриј компактне банере + Компактни банери су скривени + Компактни банери су приказани + Сакриј прошириву картицу + Проширива картица испод видеа је скривена + Развучена картица испод видео снимака је приказана + Сакриј плутајуће дугме микрофона + Плутајуће дугме микрофона у претрази је скривено + Плутајуће дугме микрофона у претрази је приказано + Сакриј хоризонталне полице + "Хоризонталне полице су скривене, као што су: • Ударне вести • Наставите да гледате • Истражите више канала • Најрелевантније • Куповина • Гледајте поново" - Хоризонталне полице су приказане - Сакриј полицу са сликама - Полица са сликама у резултатима претраге је скривена - Полица са сликама у резултатима претраге је приказана - Сакриј најновије објаве - Најновије објаве су скривене - Најновије објаве су приказане - Сакриј микс плејлисте - Микс плејлисте су скривене - Микс плејлисте су приказане - Сакриј одељак за филмове - Одељак за филмове је скривен - Одељак за филмове је приказан - - Сакриј дугме „Обавести ме” - Дугме „Обавести ме” је скривено - Дугме „Обавести ме” је приказано - Сакриј салу за игру - Сала за игру је скривена - Сала за игру је приказана - - Сакриј дугме „Прикажи још” - Дугме „Прикажи више” у резултатима претраге је скривено - Дугме „Прикажи више” у резултатима претраге је приказано - Сакриј анкете - Анкете су скривене - Анкете су приказане - Сакриј полицу са картама - Полица са картама је скривена - Полица са картама је приказана - - Сакриј ознаке препорука видеа - Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су скривене - Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су приказане - Сакриј визуелни размак - Визуелни размак је скривен - Визуелни размак је приказан - - Сакриј YouTube Doodles - Анимација YouTube Doodles-а на логотипу је скривена - Анимација YouTube Doodles-а на логотипу је приказана - "YouTube Doodles се приказује неколико дана сваке године. + Сакриј дугме „Прикажи још” + Дугме „Прикажи више” у резултатима претраге је скривено + Дугме „Прикажи више” у резултатима претраге је приказано + Сакриј анкете + Анкете су скривене + Анкете су приказане + Сакриј полицу са картама + Полица са картама је скривена + Полица са картама је приказана + + Сакриј ознаке препорука видеа + Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су скривене + Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су приказане + Сакриј визуелни размак + Визуелни размак је скривен + Визуелни размак је приказан + + Сакриј YouTube Doodles + Анимација YouTube Doodles-а на логотипу је скривена + Анимација YouTube Doodles-а на логотипу је приказана + "YouTube Doodles се приказује неколико дана сваке године. Ако се Doodle тренутно приказује у вашем региону и ова опција скривања је укључена, трака филтера испод траке за претрагу такође ће бити скривена." - Сакриј траку канала - Трака канала је скривена - Трака канала је приказана - Сакриј водени жиг канала - Водени жиг канала је скривен - Водени жиг канала је приказан - Сакриј поље за колективно финансирање - Поље за колективно финансирање је скривено - Поље за колективно финансирање је приказано - Сакриј поља за хитне случајеве - Поља за хитне случајеве су скривена - Поља за хитне случајеве су приказана - Сакриј окна са информацијама - Окна са информацијама су скривена - Окна са информацијама су приказана - - Сакриј дугме „Учлани ме” - Дугме „Придружи се” је скривено - Дугме „Придружи се” је приказано - Сакриј окна са медицинским информацијама - Окна са медицинским информацијама су скривена - Окна са медицинским информацијама су приказана - Сакриј брзе радње - Брзе радње у режиму целог екрана су скривене - Брзе радње у режиму целог екрана су приказане - Сакриј сродне видее - Сродни видеи у брзим радњама су скривени - Сродни видеи у брзим радњама су приказани - Сакриј смернице пратилаца - Смернице заједнице пратилаца су скривене - Смернице заједнице пратилаца су приказане - Сакриј временске реакције - Временске реакције су скривене - Временске реакције су приказане - Сакриј „Резиме видеа који је генерисала вештачка интелигенција” - Одељак „Резиме видеа који је генерисала вештачка интелигенција” је скривен - Одељак „Резиме видеа који је генерисала вештачка интелигенција” је приказан - Сакриј одељак „Питај” - Одељак „Питај” је скривен - Одељак „Питај” је приказан - Сакриј атрибуте - Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су скривени - Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су приказани - Сакриј поглавља - Одељак за поглавља је скривен - Одељак за поглавља је приказан - Сакриј одељак „Како је направљен овај садржај” - Одељак „Како је направљен овај садржај” је скривен - Одељак „Како је направљен овај садржај” је приказан - Сакриј хајп поене - Хајп поени су скривени - Хајп поени су приказани - Сакриј одељак „Истражите подкаст” - Одељак „Истражите подкаст” је скривен - Одељак „Истражите подкаст” је приказан - Сакриј истакнуте везе - Одељак са истакнутим везама је скривен - Одељак са истакнутим везама је приказан - Сакриј истакнуте видее - Одељак са истакнутим видеима је скривен - Одељак са истакнутим видеима је приказан - Сакриј картице са информацијама - Одељак за картице са информацијама је скривен - Одељак за картице са информацијама је приказан - Сакриј одељак „Кључни концепти” - Одељак „Кључни концепти” је скривен - Одељак „Кључни концепти” је приказан - Сакриј дугме „Запрати” - Дугме „Запрати” је скривено - Дугме „Запрати” је приказано - Сакриј транскрипт - Одељак за транскрипцију је скривен - Одељак за транскрипцију је приказан - Опис видеа - Сакријте или прикажите компоненте описа видеа - Трака филтера - Сакријте или прикажите траку филтера у фидовима, сродним видеима, резултатима претраге и историји гледања - Сакриј у фидовима - Скривено у фидовима - Приказано у фидовима - Сакриј у сродним видеима - Скривено у сродним видеима - Приказано у сродним видеима - Сакриј у резултатима претраге - Скривено у резултатима претраге - Приказано у резултатима претраге - Сакриј у историји гледања - Скривено у историји гледања - Приказано у историји гледања - Страница канала - Сакријте или прикажите компоненте странице канала - - Сакриј дугме „Заједница” - Дугме „Заједница” је скривено - Дугме „Заједница” је приказано - - Сакриј полицу „За вас” - Полица „За вас” је скривена - Полица „За вас” је приказана - - Сакриј дугме „Придружи се” - Дугме „Придружи се” је скривено - Дугме „Придружи се” је приказано - Сакриј преглед линкова - Преглед линкова је скривен - Преглед линкова је приказан - Сакриј полицу чланова - Полица чланова је скривена - Полица чланова је приказана - - Сакриј дугме „Продавница” - Дугме „Продавница” је скривено - Дугме „Продавница” је приказано - - Сакриј дугме „Запрати” - Дугме „Запрати” је скривено - Дугме „Запрати” је приказано - Коментари - Сакријте или прикажите компоненте одељка за коментаре - Сакриј „Резиме ћаскања који је генерисала вештачка интелигенција” - „Резиме ћаскања који је генерисала вештачка интелигенција” је скривен - „Резиме ћаскања који је генерисала вештачка интелигенција” је приказан - Сакриј „Резиме коментара који је генерисала вештачка интелигенција” - „Резиме коментара који је генерисала вештачка интелигенција” је скривен - „Резиме коментара који је генерисала вештачка интелигенција” је приказан - Сакриј смернице канала - Смернице канала су скривене - Смернице канала су приказане - Сакриј заглавље „Коментари од чланова” - Заглавље „Коментари чланова” је скривено - Заглавље „Коментари чланова” је приказано - Сакриј одељак за коментаре - Одељак за коментаре је скривен - Одељак за коментаре је приказан - Сакриј смернице заједнице - Смернице заједнице су скривене - Смернице заједнице су приказане - Сакриј дугме „Направи Short” - Дугме „Направи Short” је скривено - Дугме „Направи Short” је приказано - Сакриј дугмад емоџија и временске ознаке - Дугмад емоџија и временске ознаке су скривена - Дугмад емоџија и временске ознаке су приказана - Сакриј коментар за преглед - Коментар за преглед је скривен - Коментар за преглед је приказан - Сакриј дугме „Хвала” - Дугме „Хвала” је скривено - Дугме „Хвала” је приказано - Сакриј број прегледа - Број прегледа је скривен у фиду и резултатима претраге - Број прегледа је приказан у фиду и резултатима претраге - - "Ограничења: + Сакриј дугме „Учлани ме” + Дугме „Придружи се” је скривено + Дугме „Придружи се” је приказано + Сакриј окна са медицинским информацијама + Окна са медицинским информацијама су скривена + Окна са медицинским информацијама су приказана + Сакриј брзе радње + Брзе радње у режиму целог екрана су скривене + Брзе радње у режиму целог екрана су приказане + Сакриј сродне видее + Сродни видеи у брзим радњама су скривени + Сродни видеи у брзим радњама су приказани + Сакриј смернице пратилаца + Смернице заједнице пратилаца су скривене + Смернице заједнице пратилаца су приказане + Сакриј временске реакције + Временске реакције су скривене + Временске реакције су приказане + Сакриј „Резиме видеа који је генерисала вештачка интелигенција” + Одељак „Резиме видеа који је генерисала вештачка интелигенција” је скривен + Одељак „Резиме видеа који је генерисала вештачка интелигенција” је приказан + Сакриј одељак „Питај” + Одељак „Питај” је скривен + Одељак „Питај” је приказан + Сакриј атрибуте + Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су скривени + Одељци „Истакнута места”, „Игре”, „Музика” и „Поменути људи” су приказани + Сакриј поглавља + Одељак за поглавља је скривен + Одељак за поглавља је приказан + Сакриј одељак „Како је направљен овај садржај” + Одељак „Како је направљен овај садржај” је скривен + Одељак „Како је направљен овај садржај” је приказан + Сакриј хајп поене + Хајп поени су скривени + Хајп поени су приказани + Сакриј одељак „Истражите подкаст” + Одељак „Истражите подкаст” је скривен + Одељак „Истражите подкаст” је приказан + Сакриј истакнуте везе + Одељак са истакнутим везама је скривен + Одељак са истакнутим везама је приказан + Сакриј истакнуте видее + Одељак са истакнутим видеима је скривен + Одељак са истакнутим видеима је приказан + Сакриј картице са информацијама + Одељак за картице са информацијама је скривен + Одељак за картице са информацијама је приказан + Сакриј одељак „Кључни концепти” + Одељак „Кључни концепти” је скривен + Одељак „Кључни концепти” је приказан + Сакриј дугме „Запрати” + Дугме „Запрати” је скривено + Дугме „Запрати” је приказано + Сакриј транскрипт + Одељак за транскрипцију је скривен + Одељак за транскрипцију је приказан + Опис видеа + Сакријте или прикажите компоненте описа видеа + Трака филтера + Сакријте или прикажите траку филтера у фидовима, сродним видеима, резултатима претраге и историји гледања + Сакриј у фидовима + Скривено у фидовима + Приказано у фидовима + Сакриј у сродним видеима + Скривено у сродним видеима + Приказано у сродним видеима + Сакриј у резултатима претраге + Скривено у резултатима претраге + Приказано у резултатима претраге + Сакриј у историји гледања + Скривено у историји гледања + Приказано у историји гледања + Страница канала + Сакријте или прикажите компоненте странице канала + + Сакриј дугме „Заједница” + Дугме „Заједница” је скривено + Дугме „Заједница” је приказано + + Сакриј полицу „За вас” + Полица „За вас” је скривена + Полица „За вас” је приказана + + Сакриј дугме „Придружи се” + Дугме „Придружи се” је скривено + Дугме „Придружи се” је приказано + Сакриј преглед линкова + Преглед линкова је скривен + Преглед линкова је приказан + Сакриј полицу чланова + Полица чланова је скривена + Полица чланова је приказана + + Сакриј дугме „Продавница” + Дугме „Продавница” је скривено + Дугме „Продавница” је приказано + + Сакриј дугме „Запрати” + Дугме „Запрати” је скривено + Дугме „Запрати” је приказано + Коментари + Сакријте или прикажите компоненте одељка за коментаре + Сакриј „Резиме ћаскања који је генерисала вештачка интелигенција” + „Резиме ћаскања који је генерисала вештачка интелигенција” је скривен + „Резиме ћаскања који је генерисала вештачка интелигенција” је приказан + Сакриј „Резиме коментара који је генерисала вештачка интелигенција” + „Резиме коментара који је генерисала вештачка интелигенција” је скривен + „Резиме коментара који је генерисала вештачка интелигенција” је приказан + Сакриј смернице канала + Смернице канала су скривене + Смернице канала су приказане + Сакриј заглавље „Коментари од чланова” + Заглавље „Коментари чланова” је скривено + Заглавље „Коментари чланова” је приказано + Сакриј одељак за коментаре + Одељак за коментаре је скривен + Одељак за коментаре је приказан + Сакриј смернице заједнице + Смернице заједнице су скривене + Смернице заједнице су приказане + Сакриј дугме „Направи Short” + Дугме „Направи Short” је скривено + Дугме „Направи Short” је приказано + Сакриј дугмад емоџија и временске ознаке + Дугмад емоџија и временске ознаке су скривена + Дугмад емоџија и временске ознаке су приказана + Сакриј коментар за преглед + Коментар за преглед је скривен + Коментар за преглед је приказан + Сакриј дугме „Хвала” + Дугме „Хвала” је скривено + Дугме „Хвала” је приказано + Сакриј број прегледа + Број прегледа је скривен у фиду и резултатима претраге + Број прегледа је приказан у фиду и резултатима претраге + + "Ограничења: • Полице Shorts, странице канала и резултати претраге могу и даље приказивати број прегледа • Ова функција не ради са аутомобилским фактором форме" - Сакриј време отпремања - Време отпремања је скривено у фиду и резултатима претраге - Време отпремања је приказано у фиду и резултатима претраге - - "Ограничења: + Сакриј време отпремања + Време отпремања је скривено у фиду и резултатима претраге + Време отпремања је приказано у фиду и резултатима претраге + + "Ограничења: • Полице Shorts, странице канала и резултати претраге могу и даље приказивати време отпремања • Ова функција не ради са аутомобилским фактором форме" - Сакриј садржај кључне речи - Сакријте видее из резултата претраге и фида користећи филтере кључних речи - Сакриј видее на картици „Почетна” према кључним речима - Видеи на картици „Почетна” су филтрирани према кључним речима - Видеи на картици „Почетна” нису филтрирани према кључним речима - Сакриј резултате претраге према кључним речима - Резултати претраге су филтрирани према кључним речима - Резултати претраге нису филтрирани према кључним речима - Сакриј видее на картици „Праћења” према кључним речима - Видеи на картици „Праћења” су филтрирани према кључним речима - Видеи на картици „Праћења” нису филтрирани према кључним речима - Кључне речи за сакривање - - "Кључне речи и фразе за сакривање, одвојене новим редовима + "Кључне речи и фразе за сакривање, одвојене новим редовима Кључне речи могу бити називи канала или било који текст који се приказује у насловима видеа Речи са великим словима у средини морају се унети са великим и малим словима (npr.: iPhone, TikTok, LeBlanc)" - О филтрирању према кључним речима - "Почетна/Праћења/Резултати претраге се филтрирају да би сакрили садржај који се подудара са фразама кључних речи + О филтрирању према кључним речима + "Почетна/Праћења/Резултати претраге се филтрирају да би сакрили садржај који се подудара са фразама кључних речи Ограничења • Shorts видеи се не могу сакрити према називу канала • Неке компоненте корисничког интерфејса можда неће бити сакривене • Претраживање кључне речи можда неће дати резултате" - Само целе речи - - Обележавање кључне речи/фразе двоструким наводницима ће спречити делимична подударања наслова видеа и назива канала<br><br>На пример,<br><b>\"ai\"</b> ће сакрити видео: <b>How does AI work?</b><br>али неће сакрити: <b>What does fair use mean?<br> - - Није могуће користити кључну реч: %s - Додајте наводнике да бисте користили кључну реч: %s - Кључна реч има конфликтне изјаве: %s - Кључна реч је прекратка и захтева наводнике: %s - Кључна реч ће сакрити све видее: %s - - - Сакриј полицу продавнице креатора - Полица продавнице креатора испод видео плејера је скривена - Полица продавнице креатора испод видео плејера је приказана - Сакриј банер продавнице на завршном екрану - Банер продавнице на завршном екрану је скривен - Банер продавнице на завршном екрану је приказан - Сакриј огласе преко целог екрана - "Огласи преко целог екрана су скривени + Само целе речи + + Обележавање кључне речи/фразе двоструким наводницима ће спречити делимична подударања наслова видеа и назива канала<br><br>На пример,<br><b>\"ai\"</b> ће сакрити видео: <b>How does AI work?</b><br>али неће сакрити: <b>What does fair use mean?<br> + + Није могуће користити кључну реч: %s + Додајте наводнике да бисте користили кључну реч: %s + Кључна реч има конфликтне изјаве: %s + Кључна реч је прекратка и захтева наводнике: %s + Кључна реч ће сакрити све видее: %s + + + Сакриј полицу продавнице креатора + Полица продавнице креатора испод видео плејера је скривена + Полица продавнице креатора испод видео плејера је приказана + Сакриј банер продавнице на завршном екрану + Банер продавнице на завршном екрану је скривен + Банер продавнице на завршном екрану је приказан + Сакриј огласе преко целог екрана + "Огласи преко целог екрана су скривени Ова функција је доступна само за старије уређаје" - Огласи преко целог екрана су приказани - - Сакривање огласа преко целог екрана ради само са старијим уређајима - Сакриј опште огласе - Општи огласи су скривени - Општи огласи су приказани - Сакриј банере за робу - Банери за робу су скривени - Банери за робу су приказани - Сакриј ознаку плаћене промоције - Ознака плаћене промоције је скривена - Ознака плаћене промоције је приказана - Сакриј картице самоспонзорства - Картице самоспонзорства су скривене - Картице самоспонзорства су приказане - Сакриј линкове за куповину - Линкови за куповину у опису видеа су скривени - Линкови за куповину у опису видеа су приказани - Сакриј банер „Погледајте производе” - Банер „Погледајте производе” у видео плејеру је скривен - Банер „Погледајте производе” у видео плејеру је приказан - Сакриј резултате веб-претраге - Резултати веб-претраге су скривени - Резултати веб-претраге су приказани - - - Сакриј промоције за YouTube Premium - Промоције за YouTube Premium испод видео плејера су скривене - Промоције за YouTube Premium испод видео плејера су приказане - - - Сакриј видео огласе - Видео огласи су скривени - Видео огласи су приказани - - - Линк је копиран у привремену меморију - Линк с временском ознаком је копиран - Прикажи дугме за копирање линка видеа - Дугме за копирање URL адресе видеа је приказано. Додирните да бисте копирали URL адресу видеа. Додирните и задржите да бисте копирали са временском ознаком - Дугме за копирање URL адресе видеа није приказано - Прикажи дугме за копирање линка видеа с временском ознаком - Дугме за копирање URL адресе са временском ознаком је приказано. Додирните да бисте копирали URL адресу видеа са временском ознаком. Додирните и задржите да бисте копирали без временске ознаке - Дугме за копирање URL адресе са временском ознаком није приказано - - - Уклони дијалог о дискрецији гледаоца - Дијалог о дискрецији гледаоца ће бити уклоњен - Дијалог о дискрецији гледаоца ће бити приказан - Ово не заобилази старосно ограничење. Само га аутоматски прихвата. - - - Онемогући искачући прозор „Пријава на ТВ” - Искачући прозор „Пријава на ТВ” је онемогућен - Искачући прозор „Пријава на ТВ” је омогућен - - - Онемогући прескакање поглавља двоструким додиром - Двоструки додир никада не може покренути прескакање на следеће/претходно поглавље - Двоструки додир може повремено покренути прескакање на следеће/претходно поглавље - - - Спољна преузимања - Подешавања за коришћење спољног програма за преузимање - Прикажи дугме за спољно преузимање - Дугме „Преузми” у плејеру је приказано - Дугме „Преузми” у плејеру није приказано - - Замени дугме радње „Преузми” - Дугме „Преузми” отвара спољни програм за преузимање - Дугме „Преузми” отвара изворни програм за преузимање у апликацији - Назив пакета програма за преузимање - Назив пакета вашег инсталираног спољног програма за преузимање - Унесите назив пакета - Остало - Апликација није инсталирана - %s није инсталиран. Инсталирајте га. - "Није пронађена инсталирана апликација са називом пакета: %s + Огласи преко целог екрана су приказани + + Сакривање огласа преко целог екрана ради само са старијим уређајима + Сакриј опште огласе + Општи огласи су скривени + Општи огласи су приказани + Сакриј банере за робу + Банери за робу су скривени + Банери за робу су приказани + Сакриј ознаку плаћене промоције + Ознака плаћене промоције је скривена + Ознака плаћене промоције је приказана + Сакриј картице самоспонзорства + Картице самоспонзорства су скривене + Картице самоспонзорства су приказане + Сакриј линкове за куповину + Линкови за куповину у опису видеа су скривени + Линкови за куповину у опису видеа су приказани + Сакриј банер „Погледајте производе” + Банер „Погледајте производе” у видео плејеру је скривен + Банер „Погледајте производе” у видео плејеру је приказан + Сакриј резултате веб-претраге + Резултати веб-претраге су скривени + Резултати веб-претраге су приказани + + + Сакриј промоције за YouTube Premium + Промоције за YouTube Premium испод видео плејера су скривене + Промоције за YouTube Premium испод видео плејера су приказане + + + Сакриј видео огласе + Видео огласи су скривени + Видео огласи су приказани + + + Линк је копиран у привремену меморију + Линк с временском ознаком је копиран + Прикажи дугме за копирање линка видеа + Дугме за копирање URL адресе видеа је приказано. Додирните да бисте копирали URL адресу видеа. Додирните и задржите да бисте копирали са временском ознаком + Дугме за копирање URL адресе видеа није приказано + Прикажи дугме за копирање линка видеа с временском ознаком + Дугме за копирање URL адресе са временском ознаком је приказано. Додирните да бисте копирали URL адресу видеа са временском ознаком. Додирните и задржите да бисте копирали без временске ознаке + Дугме за копирање URL адресе са временском ознаком није приказано + + + Уклони дијалог о дискрецији гледаоца + Дијалог о дискрецији гледаоца ће бити уклоњен + Дијалог о дискрецији гледаоца ће бити приказан + Ово не заобилази старосно ограничење. Само га аутоматски прихвата. + + + Онемогући искачући прозор „Пријава на ТВ” + Искачући прозор „Пријава на ТВ” је онемогућен + Искачући прозор „Пријава на ТВ” је омогућен + + + Онемогући прескакање поглавља двоструким додиром + Двоструки додир никада не може покренути прескакање на следеће/претходно поглавље + Двоструки додир може повремено покренути прескакање на следеће/претходно поглавље + + + Спољна преузимања + Подешавања за коришћење спољног програма за преузимање + Прикажи дугме за спољно преузимање + Дугме „Преузми” у плејеру је приказано + Дугме „Преузми” у плејеру није приказано + + Замени дугме радње „Преузми” + Дугме „Преузми” отвара спољни програм за преузимање + Дугме „Преузми” отвара изворни програм за преузимање у апликацији + Назив пакета програма за преузимање + Назив пакета вашег инсталираног спољног програма за преузимање + Унесите назив пакета + Остало + Апликација није инсталирана + %s није инсталиран. Инсталирајте га. + "Није пронађена инсталирана апликација са називом пакета: %s Проверите да ли је назив пакета исправан и да ли је апликација инсталирана" - Назив пакета не може бити празан - - - Онемогући покрет прецизног премотавања - Покрет прецизног премотавања је онемогућен - Покрет прецизног премотавања је омогућен - - - Омогући додир за премотавање - Додир за премотавање је омогућен - Додир за премотавање је онемогућен - - - Омогући покрет за осветљеност - "Превлачење за осветљеност у режиму целог екрана је омогућено + Назив пакета не може бити празан + + + Онемогући покрет прецизног премотавања + Покрет прецизног премотавања је онемогућен + Покрет прецизног премотавања је омогућен + + + Омогући додир за премотавање + Додир за премотавање је омогућен + Додир за премотавање је онемогућен + + + Омогући покрет за осветљеност + "Превлачење за осветљеност у режиму целог екрана је омогућено Подесите осветљеност превлачењем вертикално на левој страни екрана" - Превлачење за осветљеност у режиму целог екрана је онемогућено - Омогући покрет за јачину звука - "Превлачење за јачину звука у режиму целог екрана је омогућено + Превлачење за осветљеност у режиму целог екрана је онемогућено + Омогући покрет за јачину звука + "Превлачење за јачину звука у режиму целог екрана је омогућено Подесите јачину звука превлачењем вертикално на десној страни екрана" - Превлачење за јачину звука у режиму целог екрана је онемогућено - Омогући притисак за превлачење - Притисак за превлачење је омогућен - Притисак за превлачење је онемогућен - Омогући вибрацију при додиру - Вибрација при додиру је омогућена - Вибрација при додиру је онемогућена - Сачувај и врати осветљеност - Чување и враћање осветљености при изласку или уласку у режим целог екрана - Без чувања и враћања осветљености при изласку или уласку у режим целог екрана - Омогући покрет за аутоматску осветљеност - Превлачење надоле до најниже вредности покрета за осветљеност омогућава аутоматску осветљеност - Превлачење надоле до најниже вредности покрета за осветљеност не омогућава аутоматску осветљеност - Аутоматски - Временско ограничење покрета превлачења - Количина милисекунди у којој је покрет превлачења видљив - Непрозирност позадине покрета превлачења - Вредност непрозирности између 0 и 100 - Непрозирност покрета превлачења мора бити између 0 и 100 - Боја покрета превлачења за осветљеност - Боја траке напретка за контролу осветљености - Боја покрета превлачења за јачину звука - Боја траке напретка за контролу јачине звука - Величина текста покрета превлачења - Величина текста за покрет превлачења између 1 и 30 - Величина текста мора бити између 1 и 30 - Праг трајања превлачења - Износ прага трајања превлачења - Осетљивост превлачења за јачину звука - Колико се јачина звука мења по превлачењу - Стил преклопа покрета превлачења - Хоризонтални преклоп - Хоризонтални преклоп (минимални – одозго) - Хоризонтални преклоп (минимални – по центру) - Кружни преклоп - Кружни преклоп (минимални) - Вертикални преклоп - Вертикални преклоп (минимални) - Омогући превлачење за промену видеа - Превлачење у режиму целог екрана ће променити на следећи/претходни видео - Превлачење у режиму целог екрана неће променити на следећи/претходни видео - - - Онемогући аутоматски титл - Аутоматски титл је онемогућен - Аутоматски титл је омогућен - - - Дугмад радњи - Сакријте или прикажите дугмад испод видеа - Онемогући сјај дугмади „Свиђање” и „Запрати” - Дугмад „Свиђање” и „Запрати” неће светлети при додиру - Дугмад „Свиђање” и „Запрати” ће светлети при додиру - Сакриј дугмад „Свиђање” и „Несвиђање” - Дугмад „Свиђање” и „Несвиђање” су скривена - Дугмад „Свиђање” и „Несвиђање” су приказана - - Сакриј дугме „Дели” - Дугме „Дели” је скривено - Дугме „Дели” је приказано - - Сакриј дугме „Заустави огласе” - Дугме „Заустави огласе” је скривено - Дугме „Заустави огласе” је приказано - - Сакриј дугме „Коментари” - Дугме „Коментари” је скривено - Дугме „Коментари” је приказано - + Сакриј дугме „Дели” + Дугме „Дели” је скривено + Дугме „Дели” је приказано + + Сакриј дугме „Заустави огласе” + Дугме „Заустави огласе” је скривено + Дугме „Заустави огласе” је приказано + + Сакриј дугме „Коментари” + Дугме „Коментари” је скривено + Дугме „Коментари” је приказано + - Сакриј дугме „Пријави” - Дугме „Пријави” је скривено - Дугме „Пријави” је приказано - - Сакриј дугме „Ремикс” - Дугме „Ремикс” је скривено - Дугме „Ремикс” је приказано - - Сакриј дугме „Преузми” - Дугме „Преузми” је скривено - Дугме „Преузми” је приказано - + Сакриј дугме „Ремикс” + Дугме „Ремикс” је скривено + Дугме „Ремикс” је приказано + + Сакриј дугме „Преузми” + Дугме „Преузми” је скривено + Дугме „Преузми” је приказано + - Сакриј дугме „Хајп” - Дугме „Хајп” је скривено - Дугме „Хајп” је приказано - - Сакриј дугме „Промовиши” - Дугме „Промовиши” је скривено - Дугме „Промовиши” је приказано - - Сакриј дугме „Хвала” - Дугме „Хвала” је скривено - Дугме „Хвала” је приказано - + Сакриј дугме „Промовиши” + Дугме „Промовиши” је скривено + Дугме „Промовиши” је приказано + + Сакриј дугме „Хвала” + Дугме „Хвала” је скривено + Дугме „Хвала” је приказано + - Сакриј дугме „Питај” - Дугме „Питај” је скривено - Дугме „Питај” је приказано - - Сакриј дугме „Клип” - Дугме „Клип” је скривено - Дугме „Клип” је приказано - - Сакриј дугме „Продавница” - Дугме „Продавница” је скривено - Дугме „Продавница” је приказано - - Сакриј дугме „Сачувај” - Дугме „Сачувај” је скривено - Дугме „Сачувај” је приказано - - - Дугмад навигације - Сакријте или промените дугмад на траци за навигацију - - Сакриј дугме „Почетна” - Дугме „Почетна” је скривено - Дугме „Почетна” је приказано - - Сакриј дугме „Shorts” - Дугме „Shorts” је скривено - Дугме „Shorts” је приказано - - Сакриј дугме „Направи” - Дугме „Направи” је скривено - Дугме „Направи” је приказано - - Сакриј дугме „Праћења” - Дугме „Праћења” је скривено - Дугме „Праћења” је приказано - Сакриј обавештења - Дугме „Обавештења” је скривено - Дугме „Обавештења” је приказано - - Замени дугме „Направи” дугметом „Обавештења” - "Дугме „Направи” је замењено дугметом „Обавештења” + Сакриј дугме „Питај” + Дугме „Питај” је скривено + Дугме „Питај” је приказано + + Сакриј дугме „Клип” + Дугме „Клип” је скривено + Дугме „Клип” је приказано + + Сакриј дугме „Продавница” + Дугме „Продавница” је скривено + Дугме „Продавница” је приказано + + Сакриј дугме „Сачувај” + Дугме „Сачувај” је скривено + Дугме „Сачувај” је приказано + + + Дугмад навигације + Сакријте или промените дугмад на траци за навигацију + + Сакриј дугме „Почетна” + Дугме „Почетна” је скривено + Дугме „Почетна” је приказано + + Сакриј дугме „Shorts” + Дугме „Shorts” је скривено + Дугме „Shorts” је приказано + + Сакриј дугме „Направи” + Дугме „Направи” је скривено + Дугме „Направи” је приказано + + Сакриј дугме „Праћења” + Дугме „Праћења” је скривено + Дугме „Праћења” је приказано + Сакриј обавештења + Дугме „Обавештења” је скривено + Дугме „Обавештења” је приказано + + Замени дугме „Направи” дугметом „Обавештења” + "Дугме „Направи” је замењено дугметом „Обавештења” Напомена: Омогућавање овога присилно сакрива и видео огласе" - Дугме „Направи” није замењено дугметом „Обавештења” - "Онемогућавање ове опције ће онемогућити и блокирање огласа у Shorts видеима. + Дугме „Направи” није замењено дугметом „Обавештења” + "Онемогућавање ове опције ће онемогућити и блокирање огласа у Shorts видеима. Ако се промена ове опције не примени, покушајте да пређете у режим без архивирања." - Сакриј ознаке дугмади за навигацију - Ознаке дугмади за навигацију су скривене - Ознаке дугмади за навигацију су приказане - Онемогући прозирну статусну траку - Статусна трака је непрозирна - Статусна трака је непрозирна или прозирна - На неким уређајима, омогућавање ове функције може да промени траку за навигацију кроз систем у прозирну. - Онемогући светлу прозирну траку за навигацију - Трака за навигацију у светлом режиму је непрозирна - Трака за навигацију у светлом режиму је непрозирна или прозирна - Онемогући тамну прозирну траку за навигацију - Трака за навигацију у тамном режиму је непрозирна - Трака за навигацију у тамном режиму је непрозирна или прозирна - - - Падајући мени - Сакријте или прикажите предмете у падајућем менију плејера - - Сакриј мени „Титл” - Мени „Титл” је скривен - Мени „Титл” је приказан - - Сакриј мени „Додатна подешавања” - Мени „Додатна подешавања” је скривен - Мени „Додатна подешавања” је приказан - - Сакриј мени „Тајмер за спавање” - Мени „Тајмер за спавање” је скривен - Мени „Тајмер за спавање” је приказан - - Сакриј дугме „Понављај видео” - Дугме „Понављај видео” је скривено - Дугме „Понављај видео” је приказано - - Сакриј дугме „Амбијентални режим” - Дугме „Амбијентални режим” је скривено - Дугме „Амбијентални режим” је приказано - Сакриј дугме „Уједначена јачина звука” - Дугме „Уједначена јачина звука” је приказано - Дугме „Уједначена јачина звука” је скривено - - Сакриј дугме „Помоћ и повратне информације” - Дугме „Помоћ и повратне информације” је скривено - Дугме „Помоћ и повратне информације” је приказано - - Сакриј мени „Брзина репродукције” - Мени „Брзина репродукције” је скривен - Мени „Брзина репродукције” је приказан - - Сакриј дугме „Закључај екран” - Дугме „Закључај екран” је скривено - Дугме „Закључај екран” је приказано - - Сакриј мени „Слушајте на YouTube Music-у” - Мени „Слушајте на YouTube Music-у” је скривен - Мени „Слушајте на YouTube Music-у” је приказан - - Сакриј мени „Аудио снимак” - Мени „Аудио снимак” је скривен - Мени „Аудио снимак” је приказан - + Сакриј мени „Титл” + Мени „Титл” је скривен + Мени „Титл” је приказан + + Сакриј мени „Додатна подешавања” + Мени „Додатна подешавања” је скривен + Мени „Додатна подешавања” је приказан + + Сакриј мени „Тајмер за спавање” + Мени „Тајмер за спавање” је скривен + Мени „Тајмер за спавање” је приказан + + Сакриј дугме „Понављај видео” + Дугме „Понављај видео” је скривено + Дугме „Понављај видео” је приказано + + Сакриј дугме „Амбијентални режим” + Дугме „Амбијентални режим” је скривено + Дугме „Амбијентални режим” је приказано + Сакриј дугме „Уједначена јачина звука” + Дугме „Уједначена јачина звука” је приказано + Дугме „Уједначена јачина звука” је скривено + + Сакриј дугме „Помоћ и повратне информације” + Дугме „Помоћ и повратне информације” је скривено + Дугме „Помоћ и повратне информације” је приказано + + Сакриј мени „Брзина репродукције” + Мени „Брзина репродукције” је скривен + Мени „Брзина репродукције” је приказан + + Сакриј дугме „Закључај екран” + Дугме „Закључај екран” је скривено + Дугме „Закључај екран” је приказано + + Сакриј мени „Слушајте на YouTube Music-у” + Мени „Слушајте на YouTube Music-у” је скривен + Мени „Слушајте на YouTube Music-у” је приказан + + Сакриј мени „Аудио снимак” + Мени „Аудио снимак” је скривен + Мени „Аудио снимак” је приказан + - "Мени „Аудио снимак” је скривен + "Мени „Аудио снимак” је скривен Да бисте приказали мени „Аудио снимак”, промените опцију „Лажирани видео стримови” на „Android No SDK”" - - Сакриј дугме „Гледај у ВР” - Дугме „Гледај у ВР” је скривено - Дугме „Гледај у ВР” је приказано - Сакриј мени квалитета видеа - Мени квалитета видеа је скривен - Мени квалитета видеа је приказан - Сакриј подножје менија квалитета видеа - Подножје менија квалитета видеа је скривено - Подножје менија квалитета видеа је приказано - - - Сакриј дугме „Аутоплеј” - Дугме „Аутоплеј” је скривено - Дугме „Аутоплеј” је приказано - - Сакриј дугме „Титл” - Дугме „Титл” је скривено - Дугме „Титл” је приказано - Сакриј дугме „Пребацуј” - Дугме „Пребацуј” је скривено - Дугме „Пребацуј” је приказано - Сакриј позадину контрола плејера - Позадина контрола плејера је скривена - Позадина контрола плејера је приказана - Сакриј дугмад за претходни и следећи видео - Дугмад за претходни и следећи видео су скривена - Дугмад за претходни и следећи видео су приказана - - - Сакриј картице завршног екрана - Картице завршног екрана су скривене - Картице завршног екрана су приказане - - - Онемогући „Амбијентални режим” у режиму преко целог екрана - Амбијентални режим у режиму целог екрана је онемогућен - Амбијентални режим у режиму целог екрана је омогућен - - - Сакриј картице са информацијама - Картице са информацијама су скривене - Картице са информацијама су приказане - - - Онемогући анимације бројева - Бројеви нису анимирани - Бројеви су анимирани - - - Сакриј траку за премотавање у видео плејеру - Трака за премотавање у видео плејеру је скривена - Трака за премотавање у видео плејеру је приказана - - Сакриј траку за премотавање на сличицама видеа - Трака за премотавање на сличицама видеа је скривена - Трака за премотавање на сличицама видеа је приказана - - - Shorts плејер - Сакријте или прикажите компоненте Shorts плејера - - Сакриј Shorts у фиду „Почетна” - Скривено у фиду „Почетна” и сродним видеима - Приказано у фиду „Почетна” и сродним видеима - Сакриј Shorts видее у резултатима претраге - Скривено у резултатима претраге - Приказано у резултатима претраге - - Сакриј Shorts у фиду „Праћења” - Скривено у фиду „Праћења” - Приказано у фиду „Праћења” - Сакриј Shorts у историји гледања - Скривено у историји гледања - Приказано у историји гледања - Сакриј ознаку „Аутоматски синхронизовано” - Ознака аутоматски синхронизованог је скривена - Ознака аутоматски синхронизованог је приказана - Сакриј дугме „Купи Супер хвала” - Дугме „Купи суперхвала” је скривено - Дугме „Купи суперхвала” је приказано - Сакриј дугме „Ефекат” - Дугме „Ефекат” је скривено - Дугме „Ефекат” је приказано - Сакриј дугме „Зелени екран” - Дугме „Зелени екран” је скривено - Дугме „Зелени екран” је приказано - Сакриј дугме хеш-ознаке - Дугме хеш-ознаке је скривено - Дугме хеш-ознаке је приказано - - Сакриј дугме „Учлани ме” - Дугме „Учлани ме” је скривено - Дугме „Учлани ме” је приказано - Сакриј преглед уживо - Преглед уживо је скривен - Преглед уживо је приказан - Сакриј ознаку локације - Ознака локације је скривена - Ознака локације је приказана - Сакриј дугме „Нове објаве” - Дугме „Нове објаве” је скривено - Дугме „Нове објаве” је приказано - Сакриј дугмад у плејеру при паузи - Дугмад у плејеру при паузи су скривена - Дугмад у плејеру при паузи су приказана - Сакриј преглед коментара - Преглед коментара је скривен - Преглед коментара је приказан - Сакриј дугме „Сачувај звук” - Дугме „Сачувај звук” је скривено - Дугме „Сачувај звук” је приказано - Сакриј предлоге за претрагу - Предлози за претрагу су скривени - Предлози за претрагу су приказани - Сакриј дугме „Продавница” - Дугме „Продавница” је скривено - Дугме „Продавница” је приказано - Сакриј налепнице - Налепнице су скривене - Налепнице су приказане - Сакриј дугме „Запрати” - Дугме „Запрати” је скривено - Дугме „Запрати” је приказано - Сакриј означене производе - Означени производи су скривени - Означени производи су приказани - Сакриј дугме „Предстојеће” - Дугме „Предстојеће” је скривено - Дугме „Предстојеће” је приказано - Сакриј дугме „Користи овај звук” - Дугме „Користи овај звук” је скривено - Дугме „Користи овај звук” је приказано - Сакриј дугме „Користи овај шаблон” - Дугме „Користи овај шаблон” је скривено - Дугме „Користи овај шаблон” је приказано - Сакриј анимацију дугмета „Свиђање” - Анимација дугмета „Свиђање” је скривена - Анимација дугмета „Свиђање” је приказана - Сакриј дугме „Свиђање” - Дугме „Свиђање” је скривено - Дугме „Свиђање” је приказано - Сакриј дугме „Несвиђање” - Дугме „Несвиђање” је скривено - Дугме „Несвиђање” је приказано - Сакриј дугме „Коментари” - Дугме „Коментари” је скривено - Дугме „Коментари” је приказано - - Сакриј дугме „Дели” - Дугме „Дели” је скривено - Дугме „Дели” је приказано - - Сакриј дугме „Ремикс” - Дугме „Ремикс” је скривено - Дугме „Ремикс” је приказано - Сакриј дугме „Звук” - Дугме „Звук” је скривено - Дугме „Звук” је приказано - Сакриј окно са информацијама - Окно са информацијама је скривено - Окно са информацијама је приказано - Сакриј траку канала - Трака канала је скривена - Трака канала је приказана - Сакриј наслов Shorts видеа - Наслов видеа је скривен - Наслов видеа је приказан - Сакриј ознаку метаподатака звука - Ознака метаподатака звука је скривена - Ознака метаподатака звука је приказана - Сакриј ознаку линка видеа - Ознака линка Shorts видеа је скривена - Ознака линка Shorts видеа је приказана - Сакриј траку за навигацију - Трака за навигацију је скривена - Трака за навигацију је приказана - - - Сакриј предложени видео на завршном екрану - "Предложени видео на завршном екрану је скривен, када је аутоплеј искључен + + Сакриј дугме „Гледај у ВР” + Дугме „Гледај у ВР” је скривено + Дугме „Гледај у ВР” је приказано + Сакриј мени квалитета видеа + Мени квалитета видеа је скривен + Мени квалитета видеа је приказан + Сакриј подножје менија квалитета видеа + Подножје менија квалитета видеа је скривено + Подножје менија квалитета видеа је приказано + + + Сакриј дугме „Аутоплеј” + Дугме „Аутоплеј” је скривено + Дугме „Аутоплеј” је приказано + + Сакриј дугме „Титл” + Дугме „Титл” је скривено + Дугме „Титл” је приказано + Сакриј дугме „Пребацуј” + Дугме „Пребацуј” је скривено + Дугме „Пребацуј” је приказано + Сакриј позадину контрола плејера + Позадина контрола плејера је скривена + Позадина контрола плејера је приказана + Сакриј дугмад за претходни и следећи видео + Дугмад за претходни и следећи видео су скривена + Дугмад за претходни и следећи видео су приказана + + + Сакриј картице завршног екрана + Картице завршног екрана су скривене + Картице завршног екрана су приказане + + + Онемогући „Амбијентални режим” у режиму преко целог екрана + Амбијентални режим у режиму целог екрана је онемогућен + Амбијентални режим у режиму целог екрана је омогућен + + + Сакриј картице са информацијама + Картице са информацијама су скривене + Картице са информацијама су приказане + + + Онемогући анимације бројева + Бројеви нису анимирани + Бројеви су анимирани + + + Сакриј траку за премотавање у видео плејеру + Трака за премотавање у видео плејеру је скривена + Трака за премотавање у видео плејеру је приказана + + Сакриј траку за премотавање на сличицама видеа + Трака за премотавање на сличицама видеа је скривена + Трака за премотавање на сличицама видеа је приказана + + + Shorts плејер + Сакријте или прикажите компоненте Shorts плејера + + Сакриј Shorts у фиду „Почетна” + Скривено у фиду „Почетна” и сродним видеима + Приказано у фиду „Почетна” и сродним видеима + Сакриј Shorts видее у резултатима претраге + Скривено у резултатима претраге + Приказано у резултатима претраге + + Сакриј Shorts у фиду „Праћења” + Скривено у фиду „Праћења” + Приказано у фиду „Праћења” + Сакриј Shorts у историји гледања + Скривено у историји гледања + Приказано у историји гледања + Сакриј ознаку „Аутоматски синхронизовано” + Ознака аутоматски синхронизованог је скривена + Ознака аутоматски синхронизованог је приказана + Сакриј дугме „Купи Супер хвала” + Дугме „Купи суперхвала” је скривено + Дугме „Купи суперхвала” је приказано + Сакриј дугме „Ефекат” + Дугме „Ефекат” је скривено + Дугме „Ефекат” је приказано + Сакриј дугме „Зелени екран” + Дугме „Зелени екран” је скривено + Дугме „Зелени екран” је приказано + Сакриј дугме хеш-ознаке + Дугме хеш-ознаке је скривено + Дугме хеш-ознаке је приказано + + Сакриј дугме „Учлани ме” + Дугме „Учлани ме” је скривено + Дугме „Учлани ме” је приказано + Сакриј преглед уживо + Преглед уживо је скривен + Преглед уживо је приказан + Сакриј ознаку локације + Ознака локације је скривена + Ознака локације је приказана + Сакриј дугме „Нове објаве” + Дугме „Нове објаве” је скривено + Дугме „Нове објаве” је приказано + Сакриј дугмад у плејеру при паузи + Дугмад у плејеру при паузи су скривена + Дугмад у плејеру при паузи су приказана + Сакриј преглед коментара + Преглед коментара је скривен + Преглед коментара је приказан + Сакриј дугме „Сачувај звук” + Дугме „Сачувај звук” је скривено + Дугме „Сачувај звук” је приказано + Сакриј предлоге за претрагу + Предлози за претрагу су скривени + Предлози за претрагу су приказани + Сакриј дугме „Продавница” + Дугме „Продавница” је скривено + Дугме „Продавница” је приказано + Сакриј налепнице + Налепнице су скривене + Налепнице су приказане + Сакриј дугме „Запрати” + Дугме „Запрати” је скривено + Дугме „Запрати” је приказано + Сакриј означене производе + Означени производи су скривени + Означени производи су приказани + Сакриј дугме „Предстојеће” + Дугме „Предстојеће” је скривено + Дугме „Предстојеће” је приказано + Сакриј дугме „Користи овај звук” + Дугме „Користи овај звук” је скривено + Дугме „Користи овај звук” је приказано + Сакриј дугме „Користи овај шаблон” + Дугме „Користи овај шаблон” је скривено + Дугме „Користи овај шаблон” је приказано + Сакриј анимацију дугмета „Свиђање” + Анимација дугмета „Свиђање” је скривена + Анимација дугмета „Свиђање” је приказана + Сакриј дугме „Свиђање” + Дугме „Свиђање” је скривено + Дугме „Свиђање” је приказано + Сакриј дугме „Несвиђање” + Дугме „Несвиђање” је скривено + Дугме „Несвиђање” је приказано + Сакриј дугме „Коментари” + Дугме „Коментари” је скривено + Дугме „Коментари” је приказано + + Сакриј дугме „Дели” + Дугме „Дели” је скривено + Дугме „Дели” је приказано + + Сакриј дугме „Ремикс” + Дугме „Ремикс” је скривено + Дугме „Ремикс” је приказано + Сакриј дугме „Звук” + Дугме „Звук” је скривено + Дугме „Звук” је приказано + Сакриј окно са информацијама + Окно са информацијама је скривено + Окно са информацијама је приказано + Сакриј траку канала + Трака канала је скривена + Трака канала је приказана + Сакриј наслов Shorts видеа + Наслов видеа је скривен + Наслов видеа је приказан + Сакриј ознаку метаподатака звука + Ознака метаподатака звука је скривена + Ознака метаподатака звука је приказана + Сакриј ознаку линка видеа + Ознака линка Shorts видеа је скривена + Ознака линка Shorts видеа је приказана + Сакриј траку за навигацију + Трака за навигацију је скривена + Трака за навигацију је приказана + + + Сакриј предложени видео на завршном екрану + "Предложени видео на завршном екрану је скривен, када је аутоплеј искључен Аутоплеј се може променити у подешавањима YouTube-а: Подешавања → Репродукција → Аутоматски пусти следећи видео" - Предложени видео на завршном екрану је приказан - - - Сакриј сродне видее - Сродни видеи у режиму целог екрана су скривени - Сродни видеи у режиму целог екрана су приказани - - - Сакриј временску ознаку видеа - Временска ознака видеа је скривена - Временска ознака видеа је приказана - - - Сакриј искачуће табле у плејеру - Искачуће табле у плејеру су скривене - Искачуће табле у плејеру су приказане - - - Излаз из режима целог екрана на крају видеа - Онемогућено - Усправно - Водоравно - Усправно и водоравно - - - Отвори видее преко целог екрана усправно - Видеи се отварају преко целог екрана усправно - Видеи се не отварају преко целог екрана усправно - - - Непрозирност преклопа плејера - Вредност непрозирности између 0 и 100, где је 0 прозирно - Непрозирност преклопа плејера мора бити између 0 и 100 - - - - Несвиђања привремено нису доступна (API истекао) - Несвиђања нису доступна (статус %d) - Несвиђања нису доступна (ограничење клијента API-ја) - Несвиђања нису доступна (%s) - - Освежите видео да бисте гласали помоћу ReturnYouTubeDislike - - Скривено од стране власника - Несвиђања су приказана - Несвиђања нису приказана - Прикажи несвиђања на Shorts видеима - "Несвиђања на Shorts видеима су приказана + Предложени видео на завршном екрану је приказан + + + Сакриј сродне видее + Сродни видеи у режиму целог екрана су скривени + Сродни видеи у режиму целог екрана су приказани + + + Сакриј временску ознаку видеа + Временска ознака видеа је скривена + Временска ознака видеа је приказана + + + Сакриј искачуће табле у плејеру + Искачуће табле у плејеру су скривене + Искачуће табле у плејеру су приказане + + + Излаз из режима целог екрана на крају видеа + Онемогућено + Усправно + Водоравно + Усправно и водоравно + + + Отвори видее преко целог екрана усправно + Видеи се отварају преко целог екрана усправно + Видеи се не отварају преко целог екрана усправно + + + Непрозирност преклопа плејера + Вредност непрозирности између 0 и 100, где је 0 прозирно + Непрозирност преклопа плејера мора бити између 0 и 100 + + + + Несвиђања привремено нису доступна (API истекао) + Несвиђања нису доступна (статус %d) + Несвиђања нису доступна (ограничење клијента API-ја) + Несвиђања нису доступна (%s) + + Освежите видео да бисте гласали помоћу ReturnYouTubeDislike + + Скривено од стране власника + Несвиђања су приказана + Несвиђања нису приказана + Прикажи несвиђања на Shorts видеима + "Несвиђања на Shorts видеима су приказана Ограничење: Несвиђања се можда неће појавити у режиму без архивирања" - Несвиђања на Shorts видеима нису приказана - Несвиђања у процентима - Несвиђања су приказана као проценат - Несвиђања су приказана као број - - Компактно дугме „Свиђање” - Дугме „Свиђање” стилизовано за минималну ширину - Дугме „Свиђање” стилизовано за најбољи изглед - Прикажи процењени број свиђања - Видеи са онемогућеним свиђањима приказују процењени број свиђања - Процењени број свиђања није приказан - Прикажи искачуће обавештење ако API није доступан - Искачуће обавештење је приказано, ако Return YouTube Dislike није доступан - Искачуће обавештење није приказано, ако Return YouTube Dislike није доступан - Податке обезбеђује Return YouTube Dislike API. Додирните овде да сазнате више - - Статистике ReturnYouTubeDislike API-ја за овај уређај - Време одговора API-ја, просечно - Време одговора API-ја, минимално - Време одговора API-ја, максимално - Време одговора API-ја, последњи видео - Несвиђања привремено нису доступна – на снази је ограничење стопе API клијента - API прикупљање гласова, број позива - Није остварен ниједан мрежни позив - Број остварених мрежних позива: %d - API прикупљање гласова, број истека - Није истекао ниједан мрежни позив - Број истеклих мрежних позива: %d - Ограничења стопе клијента API-ја - Није остварено ниједно ограничење стопе клијента - Број остварених ограничења стопе клијента: %d - %d милисекунди - - - Омогући широку траку за претрагу - Широка трака за претрагу је омогућена - Широка трака за претрагу је онемогућена - - - Омогући висококвалитетне сличице - Сличице траке за премотавање су високог квалитета - Сличице траке за премотавање су средњег квалитета - "Ово ће такође вратити сличице на стримовима уживо који немају сличице траке за премотавање. + Несвиђања на Shorts видеима нису приказана + Несвиђања у процентима + Несвиђања су приказана као проценат + Несвиђања су приказана као број + + Компактно дугме „Свиђање” + Дугме „Свиђање” стилизовано за минималну ширину + Дугме „Свиђање” стилизовано за најбољи изглед + Прикажи процењени број свиђања + Видеи са онемогућеним свиђањима приказују процењени број свиђања + Процењени број свиђања није приказан + Прикажи искачуће обавештење ако API није доступан + Искачуће обавештење је приказано, ако Return YouTube Dislike није доступан + Искачуће обавештење није приказано, ако Return YouTube Dislike није доступан + Податке обезбеђује Return YouTube Dislike API. Додирните овде да сазнате више + + Статистике ReturnYouTubeDislike API-ја за овај уређај + Време одговора API-ја, просечно + Време одговора API-ја, минимално + Време одговора API-ја, максимално + Време одговора API-ја, последњи видео + Несвиђања привремено нису доступна – на снази је ограничење стопе API клијента + API прикупљање гласова, број позива + Није остварен ниједан мрежни позив + Број остварених мрежних позива: %d + API прикупљање гласова, број истека + Није истекао ниједан мрежни позив + Број истеклих мрежних позива: %d + Ограничења стопе клијента API-ја + Није остварено ниједно ограничење стопе клијента + Број остварених ограничења стопе клијента: %d + %d милисекунди + + + Омогући широку траку за претрагу + Широка трака за претрагу је омогућена + Широка трака за претрагу је онемогућена + + + Омогући висококвалитетне сличице + Сличице траке за премотавање су високог квалитета + Сличице траке за премотавање су средњег квалитета + "Ово ће такође вратити сличице на стримовима уживо који немају сличице траке за премотавање. Сличице траке за премотавање ће користити исти квалитет као тренутни видео. Ова функција најбоље ради са квалитетом видеа од 720p или нижим и када користите веома брзу интернет везу." - Врати старе сличице траке за премотавање - Сличице траке за премотавање ће се појавити изнад ње - Сличице траке за премотавање ће се појавити у режиму целог екрана - - - Омогући SponsorBlock - SponsorBlock је систем заснован на доприносима корисника и служи за прескакање досадних делова YouTube видеа - Изглед - Прикажи дугме за гласање - Дугме за гласање за сегмент је приказано - Дугме за гласање за сегмент није приказано - Користи квадратни изглед - Дугмад и контроле су квадратни - Дугмад и контроле су заобљени - - Користи компактно дугме за прескакање - Дугме за прескакање стилизовано за минималну ширину - Дугме за прескакање стилизовано за најбољи изглед - Аутоматски сакриј дугме за прескакање - Дугме за прескакање ће бити скривено након неколико секунди - Дугме за прескакање је приказано за цео сегмент - Трајање дугмета за прескакање - Колико дуго се приказују дугмад за прескакање и прескакање до истакнутог пре аутоматског скривања - Прикажи искачуће обавештење о поништавању прескакања - Искачуће обавештење се приказује, када се сегмент аутоматски прескочи. Додирните искачуће обавештење да бисте поништили прескакање - Искачуће обавештење се не приказује - Трајање искачућег обавештења при прескакању - Колико дуго се приказује искачуће обавештење за поништавање прескакања - 1 секунда - 2 секунде - 3 секунде - 4 секунде - 5 секунди - 6 секунди - 7 секунди - 8 секунди - 9 секунди - 10 секунди - Прикажи дужину видеа без сегмената - Дужина видеа без свих сегмената приказана је на траци за премотавање - Пуна дужина видеа је приказана - Прављење нових сегмената - Прикажи дугме за прављење новог сегмента - Дугме за прављење новог сегмента је приказано - Дугме за прављење новог сегмента није приказано - Подешавање корака новог сегмента - Број милисекунди у којима се померају дугмад за подешавање времена приликом прављења нових сегмената - Вредност мора бити позитиван број - Види смернице - Смернице садрже правила и савете за прављење нових сегмената - Пратите смернице - Прочитајте смернице SponsorBlock-а пре прављења нових сегмената - Већ прочитано - Покажи ми - Опште - Прикажи искачуће обавештење ако API није доступан - Искачуће обавештење је приказано, ако SponsorBlock није доступан - Искачуће обавештење није приказано, ако SponsorBlock није доступан - Омогући праћење броја прескакања - Омогућава SponsorBlock ранг-листи да зна колико је времена уштеђено. Порука се шаље на ранг-листу сваки пут када је сегмент прескочен - Праћење броја прескакања није омогућено - Минимално трајање сегмента - Сегменти краћи од ове вредности (у секундама) неће бити приказани или прескочени - Неважеће временско трајање - Ваш приватни кориснички ID - Ово треба да остане приватно. Ово је као лозинка и не би требало да се дели ни са ким. Ако неко има ово, може да се лажно представља за вас - Приватни кориснички ID мора да има најмање 30 знакова - Промена URL-а API-ја - Адреса коју SponsorBlock користи за упућивање позива серверу - Ресетовање URL-а API-ја - URL API-ја је неважећи - URL API-ја је промењен - Увоз/Извоз подешавања - Копирај - Ваша SponsorBlock JSON конфигурација која може да се увезе/извезе у ReVanced и друге SponsorBlock платформе - Ваша SponsorBlock JSON конфигурација која може да се увезе/извезе у ReVanced и друге SponsorBlock платформе. Ово укључује ваш приватни кориснички ID. Будите пажљиви при дељењу овога - Подешавања су успешно увезена - Неуспешан увоз: %s - Неуспешан извоз: %s - "Ваша подешавања садрже приватни SponsorBlock кориснички ID. + Врати старе сличице траке за премотавање + Сличице траке за премотавање ће се појавити изнад ње + Сличице траке за премотавање ће се појавити у режиму целог екрана + + + Омогући SponsorBlock + SponsorBlock је систем заснован на доприносима корисника и служи за прескакање досадних делова YouTube видеа + Изглед + Прикажи дугме за гласање + Дугме за гласање за сегмент је приказано + Дугме за гласање за сегмент није приказано + Користи квадратни изглед + Дугмад и контроле су квадратни + Дугмад и контроле су заобљени + + Користи компактно дугме за прескакање + Дугме за прескакање стилизовано за минималну ширину + Дугме за прескакање стилизовано за најбољи изглед + Аутоматски сакриј дугме за прескакање + Дугме за прескакање ће бити скривено након неколико секунди + Дугме за прескакање је приказано за цео сегмент + Трајање дугмета за прескакање + Колико дуго се приказују дугмад за прескакање и прескакање до истакнутог пре аутоматског скривања + Прикажи искачуће обавештење о поништавању прескакања + Искачуће обавештење се приказује, када се сегмент аутоматски прескочи. Додирните искачуће обавештење да бисте поништили прескакање + Искачуће обавештење се не приказује + Трајање искачућег обавештења при прескакању + Колико дуго се приказује искачуће обавештење за поништавање прескакања + 1 секунда + 2 секунде + 3 секунде + 4 секунде + 5 секунди + 6 секунди + 7 секунди + 8 секунди + 9 секунди + 10 секунди + Прикажи дужину видеа без сегмената + Дужина видеа без свих сегмената приказана је на траци за премотавање + Пуна дужина видеа је приказана + Прављење нових сегмената + Прикажи дугме за прављење новог сегмента + Дугме за прављење новог сегмента је приказано + Дугме за прављење новог сегмента није приказано + Подешавање корака новог сегмента + Број милисекунди у којима се померају дугмад за подешавање времена приликом прављења нових сегмената + Вредност мора бити позитиван број + Види смернице + Смернице садрже правила и савете за прављење нових сегмената + Пратите смернице + Прочитајте смернице SponsorBlock-а пре прављења нових сегмената + Већ прочитано + Покажи ми + Опште + Прикажи искачуће обавештење ако API није доступан + Искачуће обавештење је приказано, ако SponsorBlock није доступан + Искачуће обавештење није приказано, ако SponsorBlock није доступан + Омогући праћење броја прескакања + Омогућава SponsorBlock ранг-листи да зна колико је времена уштеђено. Порука се шаље на ранг-листу сваки пут када је сегмент прескочен + Праћење броја прескакања није омогућено + Минимално трајање сегмента + Сегменти краћи од ове вредности (у секундама) неће бити приказани или прескочени + Неважеће временско трајање + Ваш приватни кориснички ID + Ово треба да остане приватно. Ово је као лозинка и не би требало да се дели ни са ким. Ако неко има ово, може да се лажно представља за вас + Приватни кориснички ID мора да има најмање 30 знакова + Промена URL-а API-ја + Адреса коју SponsorBlock користи за упућивање позива серверу + Ресетовање URL-а API-ја + URL API-ја је неважећи + URL API-ја је промењен + Увоз/Извоз подешавања + Копирај + Ваша SponsorBlock JSON конфигурација која може да се увезе/извезе у ReVanced и друге SponsorBlock платформе + Ваша SponsorBlock JSON конфигурација која може да се увезе/извезе у ReVanced и друге SponsorBlock платформе. Ово укључује ваш приватни кориснички ID. Будите пажљиви при дељењу овога + Подешавања су успешно увезена + Неуспешан увоз: %s + Неуспешан извоз: %s + "Ваша подешавања садрже приватни SponsorBlock кориснички ID. Ваш кориснички ID је као лозинка и никада га не треба делити." - Не приказуј поново - Промена понашања сегмента - Спонзор - Плаћене промоције, плаћене препоруке и директне рекламе. Није за самопромоцију или бесплатно позивање на циљеве/креаторе/веб-сајтове/производе који им се допадају - Неплаћена промоција/Самопромоција - Слично као „Спонзор”, искључујући неплаћену промоцију или самопромоцију. Укључује одељке о роби, донацијама или информацијама о томе са ким су сарађивали - Подсетник о интеракцији (праћење) - Кратак подсетник да лајкујете, претплатите се или их запратите усред садржаја. Ако је дугачак или о нечему конкретном, требало би да буде под самопромоцијом - Истакнуто - Део видеа који већина људи тражи - Пауза/Уводна анимација - Интервал без стварног садржаја. Може бити пауза, статични кадар или понављајућа анимација. Не укључује прелазе који садрже информације - Завршне картице / Заслуге - Заслуге или када се појаве YouTube завршне картице. Није за закључке са информацијама - Мамац / Поздрави - Наративни трејлери за предстојећи видео, поздрави и опраштаји. Не укључује сегменте који додају додатни садржај - Преглед / Рекапитулација - Колекција клипова који показују шта следи или шта се десило у видеу или у другим видеима серије, где се све информације понављају на другом месту - Дигресија / Шале - Дигресивне сцене или шале, које нису потребне за разумевање главног садржаја видеа. Ово не укључује сегменте који пружају детаље о контексту или позадини - Музика: Сегмент без музике - Само за употребу у музичким спотовима. Делови музичких спотова без музике, који нису обухваћени другом категоријом - Прескочи - Истакнуто - Прескочи спонзора - Прескочи промоцију - Прескочи интеракцију - Прескочи на истакнуто - Прескочи уводну анимацију - Прескочи паузу - Прескочи паузу - Прескочи завршну анимацију - Прескочи мамац - Прескочи преглед - Прескочи преглед - Прескочи рекапитулацију - Прескочи дигресију - Прескочи сегмент без музике - Прескочи сегмент - Прескочен спонзор - Прескочена самопромоција - Прескочен досадни подсетник - Прескочено на истакнуто - Прескочена уводна анимација - Прескочена пауза - Прескочена пауза - Прескочена завршна анимација - Прескочен мамац - Прескочен преглед - Прескочен преглед - Прескочена рекапитулација - Прескочено неповезано - Прескочен сегмент без музике - Прескочен неподнесени сегмент - Прескочено више сегмената - Прескочи аутоматски - Прескочи аутоматски једанпут - Прикажи дугме за прескакање - Прикажи на траци за премотавање - Онемогући - Није могуће поднети сегмент: %s - SponsorBlock привремено не ради - Није могуће поднети сегмент (статус: %1$d %2$s) - Није могуће поднети сегмент. Прекорачено ограничење стопе (превише од истог корисника или IP адресе) - Није могуће поднети сегмент: %s - "Није могуће поднети сегмент. + Не приказуј поново + Промена понашања сегмента + Спонзор + Плаћене промоције, плаћене препоруке и директне рекламе. Није за самопромоцију или бесплатно позивање на циљеве/креаторе/веб-сајтове/производе који им се допадају + Неплаћена промоција/Самопромоција + Слично као „Спонзор”, искључујући неплаћену промоцију или самопромоцију. Укључује одељке о роби, донацијама или информацијама о томе са ким су сарађивали + Подсетник о интеракцији (праћење) + Кратак подсетник да лајкујете, претплатите се или их запратите усред садржаја. Ако је дугачак или о нечему конкретном, требало би да буде под самопромоцијом + Истакнуто + Део видеа који већина људи тражи + Пауза/Уводна анимација + Интервал без стварног садржаја. Може бити пауза, статични кадар или понављајућа анимација. Не укључује прелазе који садрже информације + Завршне картице / Заслуге + Заслуге или када се појаве YouTube завршне картице. Није за закључке са информацијама + Мамац / Поздрави + Наративни трејлери за предстојећи видео, поздрави и опраштаји. Не укључује сегменте који додају додатни садржај + Преглед / Рекапитулација + Колекција клипова који показују шта следи или шта се десило у видеу или у другим видеима серије, где се све информације понављају на другом месту + Дигресија / Шале + Дигресивне сцене или шале, које нису потребне за разумевање главног садржаја видеа. Ово не укључује сегменте који пружају детаље о контексту или позадини + Музика: Сегмент без музике + Само за употребу у музичким спотовима. Делови музичких спотова без музике, који нису обухваћени другом категоријом + Прескочи + Истакнуто + Прескочи спонзора + Прескочи промоцију + Прескочи интеракцију + Прескочи на истакнуто + Прескочи уводну анимацију + Прескочи паузу + Прескочи паузу + Прескочи завршну анимацију + Прескочи мамац + Прескочи преглед + Прескочи преглед + Прескочи рекапитулацију + Прескочи дигресију + Прескочи сегмент без музике + Прескочи сегмент + Прескочен спонзор + Прескочена самопромоција + Прескочен досадни подсетник + Прескочено на истакнуто + Прескочена уводна анимација + Прескочена пауза + Прескочена пауза + Прескочена завршна анимација + Прескочен мамац + Прескочен преглед + Прескочен преглед + Прескочена рекапитулација + Прескочено неповезано + Прескочен сегмент без музике + Прескочен неподнесени сегмент + Прескочено више сегмената + Прескочи аутоматски + Прескочи аутоматски једанпут + Прикажи дугме за прескакање + Прикажи на траци за премотавање + Онемогући + Није могуће поднети сегмент: %s + SponsorBlock привремено не ради + Није могуће поднети сегмент (статус: %1$d %2$s) + Није могуће поднети сегмент. Прекорачено ограничење стопе (превише од истог корисника или IP адресе) + Није могуће поднети сегмент: %s + "Није могуће поднети сегмент. Већ постоји" - Сегмент је успешно поднет - - SponsorBlock привремено није доступан (API истекао) - SponsorBlock привремено није доступан (статус %d) - SponsorBlock привремено није доступан - Није могуће гласати за сегмент (API истекао) - Није могуће гласати за сегмент (статус: %1$d %2$s) - Није могуће гласати за сегмент: %s - Гласај за - Гласај против - Промени категорију - Нема ниједног сегмента за гласање - - %1$s до %2$s - Изаберите категорију сегмента - Категорија је онемогућена у подешавањима. Омогућите категорију да бисте поднели. - Нови SponsorBlock сегмент - Поставити %s као почетак или крај новог сегмента? - Почетак - Крај - Сада - Време почетка сегмента - Време краја сегмента - Да ли су времена тачна? - "Сегмент је од + Сегмент је успешно поднет + + SponsorBlock привремено није доступан (API истекао) + SponsorBlock привремено није доступан (статус %d) + SponsorBlock привремено није доступан + Није могуће гласати за сегмент (API истекао) + Није могуће гласати за сегмент (статус: %1$d %2$s) + Није могуће гласати за сегмент: %s + Гласај за + Гласај против + Промени категорију + Нема ниједног сегмента за гласање + + %1$s до %2$s + Изаберите категорију сегмента + Категорија је онемогућена у подешавањима. Омогућите категорију да бисте поднели. + Нови SponsorBlock сегмент + Поставити %s као почетак или крај новог сегмента? + Почетак + Крај + Сада + Време почетка сегмента + Време краја сегмента + Да ли су времена тачна? + "Сегмент је од %1$s до @@ -1280,46 +1279,46 @@ Second \"item\" text" (%3$s) Спреман за подношење?" - Почетак мора бити пре краја - Прво означите два места на временској траци - Прегледајте сегмент и уверите се да глатко прескаче - Ручно измените време сегмента - Желите ли да измените време почетка или краја сегмента? - Дато је неважеће време - Статистика - - Статистике привремено нису доступне (API не ради) - Учитавање… - SponsorBlock је онемогућен - Ваше корисничко име: <b>%s</b> - Додирните овде да промените своје корисничко име - Није могуће променити корисничко име: Статус: %1$d %2$s - Корисничко име успешно промењено - Ваша репутација је <b>%.2f</b> - Направили сте <b>%s</b> сегмената - Додирните овде да бисте видели своје сегменте - SponsorBlock ранг-листа - Сачували сте људе од <b>%s</b> сегмената - Додирните овде да бисте видели глобалну статистику и најбоље доприносиоце - То је <b>%s</b> њихових живота.<br>Додирните овде да бисте видели ранг-листу - Прескочили сте <b>%s</b> сегмената - То је <b>%s</b> - Ресетовати бројач прескочених сегмената? - %1$s сати %2$s минута - %1$s минута %2$s секунди - %s секунди - Непрозирност: - Боја: - О програму - Податке обезбеђује SponsorBlock API. Додирните овде да сазнате више и видите преузимања за друге платформе - - - Фактор форме изгледа - Подразумевани - Телефон - Таблет - Аутомобилски - "Промене укључују: + Почетак мора бити пре краја + Прво означите два места на временској траци + Прегледајте сегмент и уверите се да глатко прескаче + Ручно измените време сегмента + Желите ли да измените време почетка или краја сегмента? + Дато је неважеће време + Статистика + + Статистике привремено нису доступне (API не ради) + Учитавање… + SponsorBlock је онемогућен + Ваше корисничко име: <b>%s</b> + Додирните овде да промените своје корисничко име + Није могуће променити корисничко име: Статус: %1$d %2$s + Корисничко име успешно промењено + Ваша репутација је <b>%.2f</b> + Направили сте <b>%s</b> сегмената + Додирните овде да бисте видели своје сегменте + SponsorBlock ранг-листа + Сачували сте људе од <b>%s</b> сегмената + Додирните овде да бисте видели глобалну статистику и најбоље доприносиоце + То је <b>%s</b> њихових живота.<br>Додирните овде да бисте видели ранг-листу + Прескочили сте <b>%s</b> сегмената + То је <b>%s</b> + Ресетовати бројач прескочених сегмената? + %1$s сати %2$s минута + %1$s минута %2$s секунди + %s секунди + Непрозирност: + Боја: + О програму + Податке обезбеђује SponsorBlock API. Додирните овде да сазнате више и видите преузимања за друге платформе + + + Фактор форме изгледа + Подразумевани + Телефон + Таблет + Аутомобилски + "Промене укључују: Изглед таблета • Објаве заједнице су скривене @@ -1327,317 +1326,315 @@ Second \"item\" text" Аутомобилски изглед • Shorts видеи се отварају у обичном плејеру • Фид је организован по темама и каналима" - - - Лажирана верзија апликације - Верзија је лажирана - Верзија није лажирана - "Верзија апликације ће бити лажирана на старију верзију YouTube-а. + + + Лажирана верзија апликације + Верзија је лажирана + Верзија није лажирана + "Верзија апликације ће бити лажирана на старију верзију YouTube-а. Ово ће променити изглед и функције апликације, али се могу појавити непознати нежељени ефекти. Ако се касније искључи, препоручује се да избришете податке апликације да бисте спречили грешке у корисничком интерфејсу." - Циљна верзија апликације за лажирање - 20.13.41 - Врати нескупљену траку радњи видеа - 20.05.46 - Врати функционалност транскрипта - 19.35.36 - Враћа старе иконице Shorts плејера - 19.01.34 - Враћа старе иконице навигације - - - Промена полазне странице - Подразумевана - Сва праћења - Претрага канала - Курсеви / Учење - Истражи - Мода и лепота - Видео игре - Историја - Збирка - Лајковани видеи - Уживо - Филмови - Музика - Вести - Обавештења - Плејлисте - Претрага - Куповина - Спорт - Праћења - У тренду - Виртуелна реалност - За касније - Ваши клипови - Увек мењај полазну страницу - "Полазна страница се увек мења + Циљна верзија апликације за лажирање + 20.13.41 - Врати нескупљену траку радњи видеа + 20.05.46 - Врати функционалност транскрипта + 19.35.36 - Враћа старе иконице Shorts плејера + 19.01.34 - Враћа старе иконице навигације + + + Промена полазне странице + Подразумевана + Сва праћења + Претрага канала + Курсеви / Учење + Истражи + Мода и лепота + Видео игре + Историја + Збирка + Лајковани видеи + Уживо + Филмови + Музика + Вести + Обавештења + Плејлисте + Претрага + Куповина + Спорт + Праћења + У тренду + Виртуелна реалност + За касније + Ваши клипови + Увек мењај полазну страницу + "Полазна страница се увек мења Ограничење: Коришћење дугмета „Назад” на траци са алаткама можда неће радити" - Полазна страница се мења само при покретању апликације - - - Онемогући наставак репродукције Shorts плејера - Shorts плејер неће наставити репродукцију при покретању апликације - Shorts плејер ће наставити репродукцију при покретању апликације - - - Отворите Shorts помоћу - Shorts плејера - Обичног плејера - Обичног плејера у режиму целог екрана - - - Аутоплеј Shorts видеа - Shorts видеи ће се аутоматски пуштати - Shorts видеи ће се понављати - Аутоплеј Shorts видеа у позадини - Shorts видеи ће се аутоматски пуштати у позадини - Shorts видеи ће се понављати у позадини - - - Мини-плејер - Промените стил минимизираног плејера у апликацији - Тип мини-плејера - Онемогућен - Подразумеван - Минималан - Таблет - Модеран 1 - Модеран 2 - Модеран 3 - Модеран 4 - Онемогући заобљене углове - Углови су квадратни - Углови су заобљени - Омогући двоструки додир и штипање за промену величине - "Радња двоструког додира и штипања за промену величине је омогућена + Полазна страница се мења само при покретању апликације + + + Онемогући наставак репродукције Shorts плејера + Shorts плејер неће наставити репродукцију при покретању апликације + Shorts плејер ће наставити репродукцију при покретању апликације + + + Отворите Shorts помоћу + Shorts плејера + Обичног плејера + Обичног плејера у режиму целог екрана + + + Аутоплеј Shorts видеа + Shorts видеи ће се аутоматски пуштати + Shorts видеи ће се понављати + Аутоплеј Shorts видеа у позадини + Shorts видеи ће се аутоматски пуштати у позадини + Shorts видеи ће се понављати у позадини + + + Мини-плејер + Промените стил минимизираног плејера у апликацији + Тип мини-плејера + Онемогућен + Подразумеван + Минималан + Таблет + Модеран 1 + Модеран 2 + Модеран 3 + Модеран 4 + Онемогући заобљене углове + Углови су квадратни + Углови су заобљени + Омогући двоструки додир и штипање за промену величине + "Радња двоструког додира и штипања за промену величине је омогућена • Двапут додирните да бисте повећали величину мини-плејера • Двапут додирните поново да бисте вратили оригиналну величину" - Радња двоструког додира и штипања за промену величине су онемогућени - Онемогући превлачење и отпуштање - Превлачење и отпуштање је онемогућено - "Превлачење и отпуштање је омогућено + Радња двоструког додира и штипања за промену величине су онемогућени + Онемогући превлачење и отпуштање + Превлачење и отпуштање је онемогућено + "Превлачење и отпуштање је омогућено Мини-плејер се може превући у било који угао екрана" - Онемогући покрет хоризонталног превлачења - Покрет хоризонталног превлачења је онемогућен - "Покрет хоризонталног превлачења је омогућен + Онемогући покрет хоризонталног превлачења + Покрет хоризонталног превлачења је онемогућен + "Покрет хоризонталног превлачења је омогућен Мини-плејер се може превући са екрана улево или удесно" - Сакриј дугмад преклопа - Дугмад преклопа су скривена - Дугмад преклопа су приказана - "Дугмад су скривена + Сакриј дугмад преклопа + Дугмад преклопа су скривена + Дугмад преклопа су приказана + "Дугмад су скривена Превуците да бисте проширили или затворили" - Сакриј подтекстове - Подтекстови су скривени - Подтекстови су приказани - Сакриј дугмад за премотавање унапред и уназад - Дугмад за премотавање унапред и уназад су скривена - Дугмад за премотавање унапред и уназад су приказана - Полазна величина - Полазна величина екрана, у пикселима - Величина пиксела мора бити између %1$s и %2$s - Непрозирност преклопа - Вредност непрозирности између 0 и 100, где је 0 прозирно - Непрозирност преклопа мини-плејера мора бити између 0 и 100 - - - Омогући градијентну позадину екрана учитавања - Екран учитавања ће имати градијентну позадину - Екран учитавања ће имати обичну позадину - Стил екрана покретања - Боја - Црно-бело - Омогући прилагођену боју траке за премотавање - Прилагођена боја траке за премотавање је приказана - Оригинална боја траке за премотавање је приказана - Прилагођена боја траке за премотавање - Боја траке за премотавање - Прилагођена боја наглашавања траке за премотавање - Боја наглашавања траке за премотавање - Неважећа вредност боје траке за премотавање - - - - - Логотип у заглављу - Подразумевани - Обични - - ReVanced минималистички - Прилагођени - - - Заобиђи ограничења региона слике - Коришћење хоста слике yt4.ggpht.com - "Коришћење оригиналног хоста слика + Сакриј подтекстове + Подтекстови су скривени + Подтекстови су приказани + Сакриј дугмад за премотавање унапред и уназад + Дугмад за премотавање унапред и уназад су скривена + Дугмад за премотавање унапред и уназад су приказана + Полазна величина + Полазна величина екрана, у пикселима + Величина пиксела мора бити између %1$s и %2$s + Непрозирност преклопа + Вредност непрозирности између 0 и 100, где је 0 прозирно + Непрозирност преклопа мини-плејера мора бити између 0 и 100 + + + Омогући градијентну позадину екрана учитавања + Екран учитавања ће имати градијентну позадину + Екран учитавања ће имати обичну позадину + Стил екрана покретања + Боја + Црно-бело + Омогући прилагођену боју траке за премотавање + Прилагођена боја траке за премотавање је приказана + Оригинална боја траке за премотавање је приказана + Прилагођена боја траке за премотавање + Боја траке за премотавање + Прилагођена боја наглашавања траке за премотавање + Боја наглашавања траке за премотавање + Неважећа вредност боје траке за премотавање + + + + Логотип у заглављу + Подразумевани + Обични + + ReVanced минималистички + Прилагођени + + + Заобиђи ограничења региона слике + Коришћење хоста слике yt4.ggpht.com + "Коришћење оригиналног хоста слика Ако ово омогућите, могу се поправити недостајуће слике које су блокиране у неким регионима" - - - - Картица „Почетна” - - Картица „Праћења” - - Картица „Ви” - Плејлисте плејера и препоруке - Резултати претраге - Оригиналне сличице - DeArrow и оригиналне сличице - DeArrow и захвати кадра - Захвати кадра - "DeArrow пружа сличице за YouTube видее прикупљене од заједнице корисника. Ове сличице су често релевантније од оних које пружа YouTube + + + + Картица „Почетна” + + Картица „Праћења” + + Картица „Ви” + Плејлисте плејера и препоруке + Резултати претраге + Оригиналне сличице + DeArrow и оригиналне сличице + DeArrow и захвати кадра + Захвати кадра + "DeArrow пружа сличице за YouTube видее прикупљене од заједнице корисника. Ове сличице су често релевантније од оних које пружа YouTube Ако је омогућено, линкови видеа ће бити послати на API сервер и никакви други подаци се неће слати. Ако видео нема DeArrow сличице, онда се приказују оригиналне или захвати кадра Додирните овде да сазнате више о DeArrow-у" - Прикажи искачуће обавештење ако API није доступан - Искачуће обавештење је приказано, ако DeArrow није доступан - Искачуће обавештење није приказано, ако DeArrow није доступан - Крајња тачка DeArrow API-ја - URL крајње тачке кеша DeArrow сличица - Захвати кадра из видеа - Захвати кадра се праве од почетка/средине/краја сваког видеа. Ове слике су уграђене у YouTube и не користи се ниједан спољни API - Користи брзе захвате кадра - Користе се захвати кадра средњег квалитета. Сличице ће се брже учитавати, али стримови уживо, необјављени или веома стари видеи могу да приказују празне сличице - Користе се захвати кадра високог квалитета - Време видеа за прављење захвата кадра - Почетак видеа - Средина видеа - Крај видеа - - DeArrow привремено није доступан (кôд статуса: %s) - DeArrow привремено није доступан - - - Прикажи саопштења ReVanced-а - Саопштења при покретању су приказана - Саопштења при покретању нису приказана - Приказивање саопштења при покретању - Неуспешно повезивање са пружаоцем саопштења - Одбаци - - - Омогући понављање видеа - Видео ће се понављати - Видео се неће понављати - - - Прикажи дугме за понављање видеа - Дугме је приказано - Дугме није приказано - Понављање видеа је укључено - Понављање видеа је искључено - - - - - Лажиране димензије уређаја - "Димензије уређаја су лажиране + Прикажи искачуће обавештење ако API није доступан + Искачуће обавештење је приказано, ако DeArrow није доступан + Искачуће обавештење није приказано, ако DeArrow није доступан + Крајња тачка DeArrow API-ја + URL крајње тачке кеша DeArrow сличица + Захвати кадра из видеа + Захвати кадра се праве од почетка/средине/краја сваког видеа. Ове слике су уграђене у YouTube и не користи се ниједан спољни API + Користи брзе захвате кадра + Користе се захвати кадра средњег квалитета. Сличице ће се брже учитавати, али стримови уживо, необјављени или веома стари видеи могу да приказују празне сличице + Користе се захвати кадра високог квалитета + Време видеа за прављење захвата кадра + Почетак видеа + Средина видеа + Крај видеа + + DeArrow привремено није доступан (кôд статуса: %s) + DeArrow привремено није доступан + + + Прикажи саопштења ReVanced-а + Саопштења при покретању су приказана + Саопштења при покретању нису приказана + Приказивање саопштења при покретању + Неуспешно повезивање са пружаоцем саопштења + Одбаци + + + Омогући понављање видеа + Видео ће се понављати + Видео се неће понављати + + + Прикажи дугме за понављање видеа + Дугме је приказано + Дугме није приказано + Понављање видеа је укључено + Понављање видеа је искључено + + + + Лажиране димензије уређаја + "Димензије уређаја су лажиране Виши квалитети видеа могу бити откључани, али може доћи до застоја при репродукцији видеа, краћег трајања батерије и непознатих нежељених ефеката" - "Димензије уређаја нису лажиране + "Димензије уређаја нису лажиране Ако ово омогућите, могу бити откључани виши квалитети видеа" - Ако ово омогућите, може доћи до застоја при репродукцији видеа, краћег трајања батерије и непознатих нежељених ефеката. - - - Вибрација при додиру - Промени вибрацију при додиру - Онемогући вибрацију поглавља - Вибрација поглавља је онемогућена - Вибрација поглавља је омогућена - Онемогући вибрацију прецизног премотавања - Вибрација прецизног премотавања је онемогућена - Вибрација прецизног премотавања је омогућена - Онемогући вибрацију поништавања премотавања - Вибрација поништавања премотавања је онемогућена - Вибрација поништавања премотавања је омогућена - Онемогући вибрацију при увеличавању - Вибрација при увеличавању је онемогућена - Вибрација при увеличавању је омогућена - - - Ако сте недавно променили податке за пријаву на налог, деинсталирајте и поново инсталирајте MicroG. - - - Заобиђи URL преусмеравања - URL преусмеравања се заобилазе - URL преусмеравања се не заобилазе - - - Отвори линкове у прегледачу - Отварање линкова у спољном прегледачу - Отварање линкова у прегледачу у апликацији - - - - Аутоматски - Запамти промене квалитета видеа - Промене квалитета се примењују на све видее - Промене квалитета се примењују само на тренутни видео - Прикажи искачуће обавештење при промени квалитета видеа - Искачуће обавештење је приказано, када се промени подразумевани квалитет видеа - Искачуће обавештење није приказано, када се промени подразумевани квалитет видеа - Подразумевани квалитет видеа на Wi-Fi мрежи - Подразумевани квалитет видеа на мобилној мрежи - Запамти промене квалитета Shorts видеа - Промене квалитета се примењују на све Shorts видее - Промене квалитета се примењују само на тренутни Shorts видео - Подразумевани квалитет Shorts видеа на Wi-Fi мрежи - Подразумевани квалитет Shorts видеа на мобилној мрежи - мобилној мрежи - Wi-Fi мрежи - Квалитет на %1$s промењен на: %2$s - Квалитет Shorts видеа на %1$s промењен на: %2$s - - - Прикажи дугме дијалога за брзину - Дугме за дијалог брзине је приказано. Додирните и задржите да бисте вратили брзину репродукције на подразумевану вредност - Дугме за дијалог брзине није приказано - - - Прикажи дугме квалитета видеа - Дугме за квалитет видеа је приказано. Додирните и задржите да бисте вратили квалитет на подразумевану вредност - Дугме за квалитет видеа није приказано - - - Мени прилагођене брзине репродукције - Мени прилагођене брзине репродукције је приказан - Мени прилагођене брзине репродукције није приказан - Врати стари мени брзине репродукције - Приказан је стари мени брзине репродукције - Приказан је модерни мени брзине репродукције - Прилагођене брзине репродукције - Додајте или промените прилагођене брзине репродукције - Прилагођене брзине морају бити мање од %s - Неважеће прилагођене брзине репродукције - Аутоматски - Прилагођена брзина додиривања и задржавања - Брзина репродукције између 0 и 8 - - - Запамти промене брзине репродукције - Промене брзине репродукције се примењују на све видее - Промене брзине репродукције се примењују само на тренутни видео - Прикажи искачуће обавештење при промени брзине репродукције - Искачуће обавештење је приказано, када се промени подразумевана брзина репродукције - Искачуће обавештење није приказано, када се промени подразумевана брзина репродукције - Подразумевана брзина репродукције - Брзина репродукције промењена на: %s - - - Онемогући HDR видео - HDR видео је онемогућен - HDR видео је омогућен - Присили AVC (H.264) - Видео кодек је присиљен на AVC (H.264) - Видео кодек се одређује аутоматски - "Предности: + Ако ово омогућите, може доћи до застоја при репродукцији видеа, краћег трајања батерије и непознатих нежељених ефеката. + + + Вибрација при додиру + Промени вибрацију при додиру + Онемогући вибрацију поглавља + Вибрација поглавља је онемогућена + Вибрација поглавља је омогућена + Онемогући вибрацију прецизног премотавања + Вибрација прецизног премотавања је онемогућена + Вибрација прецизног премотавања је омогућена + Онемогући вибрацију поништавања премотавања + Вибрација поништавања премотавања је онемогућена + Вибрација поништавања премотавања је омогућена + Онемогући вибрацију при увеличавању + Вибрација при увеличавању је онемогућена + Вибрација при увеличавању је омогућена + + + Ако сте недавно променили податке за пријаву на налог, деинсталирајте и поново инсталирајте MicroG. + + + Заобиђи URL преусмеравања + URL преусмеравања се заобилазе + URL преусмеравања се не заобилазе + + + Отвори линкове у прегледачу + Отварање линкова у спољном прегледачу + Отварање линкова у прегледачу у апликацији + + + + Аутоматски + Запамти промене квалитета видеа + Промене квалитета се примењују на све видее + Промене квалитета се примењују само на тренутни видео + Прикажи искачуће обавештење при промени квалитета видеа + Искачуће обавештење је приказано, када се промени подразумевани квалитет видеа + Искачуће обавештење није приказано, када се промени подразумевани квалитет видеа + Подразумевани квалитет видеа на Wi-Fi мрежи + Подразумевани квалитет видеа на мобилној мрежи + Запамти промене квалитета Shorts видеа + Промене квалитета се примењују на све Shorts видее + Промене квалитета се примењују само на тренутни Shorts видео + Подразумевани квалитет Shorts видеа на Wi-Fi мрежи + Подразумевани квалитет Shorts видеа на мобилној мрежи + мобилној мрежи + Wi-Fi мрежи + Квалитет на %1$s промењен на: %2$s + Квалитет Shorts видеа на %1$s промењен на: %2$s + + + Прикажи дугме дијалога за брзину + Дугме за дијалог брзине је приказано. Додирните и задржите да бисте вратили брзину репродукције на подразумевану вредност + Дугме за дијалог брзине није приказано + + + Прикажи дугме квалитета видеа + Дугме за квалитет видеа је приказано. Додирните и задржите да бисте вратили квалитет на подразумевану вредност + Дугме за квалитет видеа није приказано + + + Мени прилагођене брзине репродукције + Мени прилагођене брзине репродукције је приказан + Мени прилагођене брзине репродукције није приказан + Врати стари мени брзине репродукције + Приказан је стари мени брзине репродукције + Приказан је модерни мени брзине репродукције + Прилагођене брзине репродукције + Додајте или промените прилагођене брзине репродукције + Прилагођене брзине морају бити мање од %s + Неважеће прилагођене брзине репродукције + Аутоматски + Прилагођена брзина додиривања и задржавања + Брзина репродукције између 0 и 8 + + + Запамти промене брзине репродукције + Промене брзине репродукције се примењују на све видее + Промене брзине репродукције се примењују само на тренутни видео + Прикажи искачуће обавештење при промени брзине репродукције + Искачуће обавештење је приказано, када се промени подразумевана брзина репродукције + Искачуће обавештење није приказано, када се промени подразумевана брзина репродукције + Подразумевана брзина репродукције + Брзина репродукције промењена на: %s + + + Онемогући HDR видео + HDR видео је онемогућен + HDR видео је омогућен + Присили AVC (H.264) + Видео кодек је присиљен на AVC (H.264) + Видео кодек се одређује аутоматски + "Предности: • Може побољшати трајање батерије • Може вратити недостајуће резолуције видеа на старијим уређајима @@ -1646,179 +1643,178 @@ Second \"item\" text" • Репродукција видеа ће користити више интернет података него VP9 или AV1 • HDR видеи неће користити AVC • Неки уређаји не могу присилити AVC" - - - Прикажи напредни мени квалитета видеа - Напредни мени квалитета видеа је приказан - Напредни мени квалитета видеа није приказан - - - Омогући превлачење за премотавање - Превлачење за премотавање је омогућено - Превлачење за премотавање није омогућено - - - Дозволи Android VR AV1 - "Видео кодек је AVC (H.264), VP9 или AV1 + + + Прикажи напредни мени квалитета видеа + Напредни мени квалитета видеа је приказан + Напредни мени квалитета видеа није приказан + + + Омогући превлачење за премотавање + Превлачење за премотавање је омогућено + Превлачење за премотавање није омогућено + + + Дозволи Android VR AV1 + "Видео кодек је AVC (H.264), VP9 или AV1 Репродукција може застајкивати или прескакати кадрове" - Видео кодек је AVC (H.264) или VP9 - "Омогућавање ове опцијеможе користити софтверско декодирање AV1. + Видео кодек је AVC (H.264) или VP9 + "Омогућавање ове опцијеможе користити софтверско декодирање AV1. Репродукција видеа с AV1 може застајкивати или прескакати кадрове." - Нежељени ефекти лажирања - • Експериментални клијент и може престати да ради било када - • Видео се може зауставити на 1:00 или можда неће бити доступан у неким регионима - • Мени „Аудио снимак” недостаје - • Нема видео кодека AV1 - • Опција „Уједначена јачина звука” није доступна - • Видеи за децу се можда неће пуштати када сте одјављени или у режиму без архивирања - - • Присиљавање оригиналног звука није доступно - Прикажи у „Статистици за зналце” - Тип клијента је приказан у „Статистици за зналце” - Тип клијента је скривен у „Статистици за зналце” - - - - - - - О програму - Огласи - Опште - Плејер - Разно - - - Сакриј видео огласе - Видео огласи су скривени - Видео огласи су приказани - - - Омогући трајно понављање - Трајно понављање је омогућено - Трајно понављање је онемогућено - - - Сакриј дугме „Пребацуј” - Дугме „Пребацуј” је скривено - Дугме „Пребацуј” је приказано - Сакриј дугме „Историја” - Дугме „Историја” је скривено - Дугме „Историја” је приказано - Сакриј дугме „Обавештење” - Дугме „Обавештење” је скривено - Дугме „Обавештење” је приказано - Сакриј дугме „Претрага” - Дугме „Претрага” је скривено - Дугме „Претрага” је приказано - - - Сакриј траку категорија - Трака категорија је скривена - Трака категорија је приказана - - - Промени боју мини-плејера - Боја мини-плејера одговара плејеру преко целог екрана - Мини-плејер користи подразумевану боју - - - Трака за навигацију - Сакријте или промените дугмад траке за навигацију - - Сакриј дугме „Почетна” - Дугме „Почетна” је скривено - Дугме „Почетна” је приказано - - Сакриј дугме „Семплови” - Дугме „Семплови” је скривено - Дугме „Семплови” је приказано - - Сакриј дугме „Истражите” - Дугме „Истражите” је скривено - Дугме „Истражите” је приказано - - Сакриј дугме „Збирка” - Дугме „Збирка” је скривено - Дугме „Збирка” је приказано - - Сакриј дугме „Надогради” - Дугме „Надогради” је скривено - Дугме „Надогради” је приказано - Сакриј траку за навигацију - Трака за навигацију је скривена - Трака за навигацију је приказана - Сакриј ознаке дугмади за навигацију - Ознаке су скривене - Ознаке су приказане - - - Сакриј ознаку „Набавите Music Premium” - Ознака је скривена - Ознака је приказана - - - Сакриј дугме за надоградњу - Дугме је скривено - Дугме је приказано - - - - - Блокирај аудио огласе - Аудио огласи су блокирани - Аудио огласи су одблокирани - - - %s није доступан, огласи се можда приказују. Покушајте да промените услугу блокирања огласа у подешавањима. - %s је вратио грешку, огласи се можда приказују. Покушајте да промените услугу блокирања огласа у подешавањима. - Блокирај уграђене видео огласе - Онемогућено - Luminous прокси - PurpleAdBlock прокси - - - Блокирај видео огласе - Видео огласи су блокирани - Видео огласи су одблокирани - - - Порука избрисана - Приказ избрисаних порука - Не приказуј избрисане поруке - Сакриј избрисане поруке иза спојлера - Прикажи избрисане поруке као прецртан текст - - - Аутоматски преузми бодове канала - Бодови канала су аутоматски преузети - Бодови канала нису аутоматски преузети - - - - Омогући режим отклањања грешака Twitch - Режим отклањања грешака Twitch је омогућен (није препоручено) - Режим отклањања грешака Twitch је онемогућен - - - Подешавања ReVanced-а - О програму - О ReVanced-у - Блокирање огласа - Подешавања блокирања огласа - Ћаскање - Подешавања ћаскања - Разно - Разна подешавања - Општа подешавања - Остала подешавања - Огласи на страни клијента - Огласи на страни сервера - Евидентирање отклањања грешака - Евиденције отклањања грешака су омогућене - Евиденције отклањања грешака су онемогућене - - + Нежељени ефекти лажирања + • Експериментални клијент и може престати да ради било када + • Видео се може зауставити на 1:00 или можда неће бити доступан у неким регионима + • Мени „Аудио снимак” недостаје + • Нема видео кодека AV1 + • Опција „Уједначена јачина звука” није доступна + • Видеи за децу се можда неће пуштати када сте одјављени или у режиму без архивирања + + • Присиљавање оригиналног звука није доступно + Прикажи у „Статистици за зналце” + Тип клијента је приказан у „Статистици за зналце” + Тип клијента је скривен у „Статистици за зналце” + + + + + + О програму + Огласи + Опште + Плејер + Разно + + + Сакриј видео огласе + Видео огласи су скривени + Видео огласи су приказани + + + Омогући трајно понављање + Трајно понављање је омогућено + Трајно понављање је онемогућено + + + Сакриј дугме „Пребацуј” + Дугме „Пребацуј” је скривено + Дугме „Пребацуј” је приказано + Сакриј дугме „Историја” + Дугме „Историја” је скривено + Дугме „Историја” је приказано + Сакриј дугме „Обавештење” + Дугме „Обавештење” је скривено + Дугме „Обавештење” је приказано + Сакриј дугме „Претрага” + Дугме „Претрага” је скривено + Дугме „Претрага” је приказано + + + Сакриј траку категорија + Трака категорија је скривена + Трака категорија је приказана + + + Промени боју мини-плејера + Боја мини-плејера одговара плејеру преко целог екрана + Мини-плејер користи подразумевану боју + + + Трака за навигацију + Сакријте или промените дугмад траке за навигацију + + Сакриј дугме „Почетна” + Дугме „Почетна” је скривено + Дугме „Почетна” је приказано + + Сакриј дугме „Семплови” + Дугме „Семплови” је скривено + Дугме „Семплови” је приказано + + Сакриј дугме „Истражите” + Дугме „Истражите” је скривено + Дугме „Истражите” је приказано + + Сакриј дугме „Збирка” + Дугме „Збирка” је скривено + Дугме „Збирка” је приказано + + Сакриј дугме „Надогради” + Дугме „Надогради” је скривено + Дугме „Надогради” је приказано + Сакриј траку за навигацију + Трака за навигацију је скривена + Трака за навигацију је приказана + Сакриј ознаке дугмади за навигацију + Ознаке су скривене + Ознаке су приказане + + + Сакриј ознаку „Набавите Music Premium” + Ознака је скривена + Ознака је приказана + + + Сакриј дугме за надоградњу + Дугме је скривено + Дугме је приказано + + + + + Блокирај аудио огласе + Аудио огласи су блокирани + Аудио огласи су одблокирани + + + %s није доступан, огласи се можда приказују. Покушајте да промените услугу блокирања огласа у подешавањима. + %s је вратио грешку, огласи се можда приказују. Покушајте да промените услугу блокирања огласа у подешавањима. + Блокирај уграђене видео огласе + Онемогућено + Luminous прокси + PurpleAdBlock прокси + + + Блокирај видео огласе + Видео огласи су блокирани + Видео огласи су одблокирани + + + Порука избрисана + Приказ избрисаних порука + Не приказуј избрисане поруке + Сакриј избрисане поруке иза спојлера + Прикажи избрисане поруке као прецртан текст + + + Аутоматски преузми бодове канала + Бодови канала су аутоматски преузети + Бодови канала нису аутоматски преузети + + + + Омогући режим отклањања грешака Twitch + Режим отклањања грешака Twitch је омогућен (није препоручено) + Режим отклањања грешака Twitch је онемогућен + + + Подешавања ReVanced-а + О програму + О ReVanced-у + Блокирање огласа + Подешавања блокирања огласа + Ћаскање + Подешавања ћаскања + Разно + Разна подешавања + Општа подешавања + Остала подешавања + Огласи на страни клијента + Огласи на страни сервера + Евидентирање отклањања грешака + Евиденције отклањања грешака су омогућене + Евиденције отклањања грешака су онемогућене + + diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 9b44242d43..370ff826ab 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -17,232 +17,231 @@ "First 'item' text Second \"item\" text" ---> - - - - Appnamn - - Anpassad - Appikon - Ursprunglig - - ReVanced minimalistisk - ReVanced skalad - - Anpassad - - - Kontroller misslyckades - Öppna officiell hemsida - Ignorera - <h5>Appen verkar inte vara patchad av dig.</h5><br>Den kanske inte fungerar korrekt, <b>kan vara skadlig eller till och med farlig att använda</b>.<br><br>Resultatet av kontrollerna innebär att appen har patchats på förhand eller erhållits från någon annan:<br><br><small>%1$s</small><br>Vi rekommenderar starkt att <b>avinstallera appen och patcha den själv</b> för att säkerställa att du använder en validerad och säker app.<p><br>Om du ignorerar den här varningen kommer den endast att visas två gånger. - Patchad på en annan enhet - Inte installerad av ReVanced Manager - Patchad för mer än 10 minuter sedan - Patchad för %s dagar sedan - Byggdatum för APK är skadat - - - ReVanced-meddelande - Din visningshistorik sparas inte.<br><br>Detta orsakas troligen av en DNS-annonsblockerare eller nätverksproxy.<br><br>För att åtgärda detta, vitlista <b>s.youtube.com</b> eller stäng av alla DNS-blockerare och proxyer. - Visa inte igen - - - Inställningar - Är du säker på att du vill fortsätta? - Spara - Återställ - Återställ färg - Ogiltig färg - Omstart krävs - Starta om appen för att denna ändring ska träda i kraft. - Starta om - Importera - Kopiera - ReVanced-inställningarna återställda till standard - Importerade %d inställningar - Importen misslyckades: %s - Sök i inställningar - Inga resultat hittades för \"%s\" - Försök med ett annat sökord - Senaste sökningar - Ta bort från sökhistoriken? - Rensa sökhistorik - Är du säker på att du vill rensa all sökhistorik? - Söktips - "• Tryck på en sökväg för att navigera till den +--> + + + Appnamn + + Anpassad + Appikon + Ursprunglig + + ReVanced minimalistisk + ReVanced skalad + + Anpassad + + + Kontroller misslyckades + Öppna officiell hemsida + Ignorera + <h5>Appen verkar inte vara patchad av dig.</h5><br>Den kanske inte fungerar korrekt, <b>kan vara skadlig eller till och med farlig att använda</b>.<br><br>Resultatet av kontrollerna innebär att appen har patchats på förhand eller erhållits från någon annan:<br><br><small>%1$s</small><br>Vi rekommenderar starkt att <b>avinstallera appen och patcha den själv</b> för att säkerställa att du använder en validerad och säker app.<p><br>Om du ignorerar den här varningen kommer den endast att visas två gånger. + Patchad på en annan enhet + Inte installerad av ReVanced Manager + Patchad för mer än 10 minuter sedan + Patchad för %s dagar sedan + Byggdatum för APK är skadat + + + ReVanced-meddelande + Din visningshistorik sparas inte.<br><br>Detta orsakas troligen av en DNS-annonsblockerare eller nätverksproxy.<br><br>För att åtgärda detta, vitlista <b>s.youtube.com</b> eller stäng av alla DNS-blockerare och proxyer. + Visa inte igen + + + Inställningar + Är du säker på att du vill fortsätta? + Spara + Återställ + Återställ färg + Ogiltig färg + Omstart krävs + Starta om appen för att denna ändring ska träda i kraft. + Starta om + Importera + Kopiera + ReVanced-inställningarna återställda till standard + Importerade %d inställningar + Importen misslyckades: %s + Sök i inställningar + Inga resultat hittades för \"%s\" + Försök med ett annat sökord + Senaste sökningar + Ta bort från sökhistoriken? + Rensa sökhistorik + Är du säker på att du vill rensa all sökhistorik? + Söktips + "• Tryck på en sökväg för att navigera till den • Tryck länge på en inställning för att navigera till den • Tryck på Retur för att spara en sökfråga i historiken • Sökningen ignorerar skiftläge och skiljetecken • Överordnade inställningar visas ovanför inaktiverade underordnade inställningar" - Sökhistoriken är tom - Om du vill spara sökhistorik, skriv en sökfråga och tryck på Retur - Visa sökhistorik för inställningar - Sökhistorik för inställningar visas - Sökhistorik för inställningar visas inte - Visa ikoner för ReVanced-inställningar - Inställningsikoner visas - Inställningsikoner visas inte - Språk för ReVanced - "Översättningar till vissa språk kan vara ofullständiga eller saknas. + Sökhistoriken är tom + Om du vill spara sökhistorik, skriv en sökfråga och tryck på Retur + Visa sökhistorik för inställningar + Sökhistorik för inställningar visas + Sökhistorik för inställningar visas inte + Visa ikoner för ReVanced-inställningar + Inställningsikoner visas + Inställningsikoner visas inte + Språk för ReVanced + "Översättningar till vissa språk kan vara ofullständiga eller saknas. Om du vill översätta till nya språk eller förbättra befintliga översättningar, besök translate.revanced.app" - Appspråk - Importera/exportera - Importera/exportera ReVanced-inställningar - - Du använder ReVanced Patches version <i>%s</i> - Obs! - Det här är en förhandsversion och du kan uppleva oväntade problem - Officiella länkar - + Du använder ReVanced Patches version <i>%s</i> + Obs! + Det här är en förhandsversion och du kan uppleva oväntade problem + Officiella länkar + - - - GmsCore-inställningar - Inställningar för GmsCore - - MicroG GmsCore är inte installerat. Installera det. - Åtgärd krävs - "MicroG GmsCore saknar behörighet att köras i bakgrunden. + + + GmsCore-inställningar + Inställningar för GmsCore + + MicroG GmsCore är inte installerat. Installera det. + Åtgärd krävs + "MicroG GmsCore saknar behörighet att köras i bakgrunden. Följ guiden \"Don't kill my app\" för din telefon och tillämpa instruktionerna på din MicroG-installation. Detta krävs för att appen ska fungera." - Öppna hemsida - "Batterioptimeringar för MicroG GmsCore måste inaktiveras för att förhindra problem. + Öppna hemsida + "Batterioptimeringar för MicroG GmsCore måste inaktiveras för att förhindra problem. Inaktivering av batterioptimeringar för MicroG kommer inte att påverka batteritiden negativt. Tryck på Fortsätt-knappen och tillåt optimeringsändringar." - Fortsätt - - - Förfalska videoströmmar - Förfalska klientens videoströmmar för att förhindra uppspelningsproblem - Förfalska videoströmmar - "Videoströmmar förfalskas + Fortsätt + + + Förfalska videoströmmar + Förfalska klientens videoströmmar för att förhindra uppspelningsproblem + Förfalska videoströmmar + "Videoströmmar förfalskas Om du är en YouTube Premium-användare kanske den här inställningen inte behövs" - "Videoströmmar förfalskas inte + "Videoströmmar förfalskas inte Uppspelning kanske inte fungerar" - Om du stänger av den här inställningen kan det leda till problem med uppspelning. - Standardklient - - - Tvinga ursprungligt ljudspråk - Använder ursprungligt ljudspråk - Använder standardljud - - Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till valfri klient utom Android Studio - - - Felsökning - Aktivera eller inaktivera felsökningsalternativ - Felsökningsloggning - Felsökningsloggar är aktiverade - Felsökningsloggar är inaktiverade - Logga stackspårning - Felsökningsloggar inkluderar stackspårning - Felsökningsloggar inkluderar inte stackspårning - Visa ett popup-meddelande om det uppstår fel med ReVanced - Popup-meddelande visas om det uppstår fel - Popup-meddelande visas inte om det uppstår fel - "Om du stänger av popup-felmeddelanden döljs alla ReVanced-felmeddelanden. + Om du stänger av den här inställningen kan det leda till problem med uppspelning. + Standardklient + + + Tvinga ursprungligt ljudspråk + Använder ursprungligt ljudspråk + Använder standardljud + + Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till valfri klient utom Android Studio + + + Felsökning + Aktivera eller inaktivera felsökningsalternativ + Felsökningsloggning + Felsökningsloggar är aktiverade + Felsökningsloggar är inaktiverade + Logga stackspårning + Felsökningsloggar inkluderar stackspårning + Felsökningsloggar inkluderar inte stackspårning + Visa ett popup-meddelande om det uppstår fel med ReVanced + Popup-meddelande visas om det uppstår fel + Popup-meddelande visas inte om det uppstår fel + "Om du stänger av popup-felmeddelanden döljs alla ReVanced-felmeddelanden. Du kommer inte att bli meddelad om oväntade händelser." - Exportera felsökningsloggar - Kopierar ReVanced-felsökningsloggar till urklipp - Felsökningsloggar är inaktiverade - Inga loggar hittades - Loggar kopierade - Det gick inte att exportera loggar: %s - Rensa felsökningsloggar - Rensar alla lagrade ReVanced-felsökningsloggar - Loggar rensade - Funktionsflagghanterare - Hantera booleska funktionsflaggor - Aktiva flaggor (%d) - Blockerade flaggor (%d) - Sök efter flaggor ... - Flaggor sparade - Flaggor återställda - Flaggor kopierade till urklipp - Logga protokollbuffert - Felsökningsloggar inkluderar protokollbuffert - Felsökningsloggar inkluderar inte protokollbuffert - "Om du aktiverar den här inställningen loggas ytterligare layoutdata, inklusive text på skärmen för vissa komponenter i användargränssnittet. + Exportera felsökningsloggar + Kopierar ReVanced-felsökningsloggar till urklipp + Felsökningsloggar är inaktiverade + Inga loggar hittades + Loggar kopierade + Det gick inte att exportera loggar: %s + Rensa felsökningsloggar + Rensar alla lagrade ReVanced-felsökningsloggar + Loggar rensade + Funktionsflagghanterare + Hantera booleska funktionsflaggor + Aktiva flaggor (%d) + Blockerade flaggor (%d) + Sök efter flaggor ... + Flaggor sparade + Flaggor återställda + Flaggor kopierade till urklipp + Logga protokollbuffert + Felsökningsloggar inkluderar protokollbuffert + Felsökningsloggar inkluderar inte protokollbuffert + "Om du aktiverar den här inställningen loggas ytterligare layoutdata, inklusive text på skärmen för vissa komponenter i användargränssnittet. Detta kan hjälpa till att identifiera komponenter när du skapar anpassade filter. Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, att loggas." - - - Rensa delningslänkar - Spårningsfrågeparametern tas bort från delade länkar - Spårningsfrågeparametern tas inte bort från delade länkar - Ändra delningslänkar till youtube.com - Delade länkar använder youtube.com - Delade länkar använder music.youtube.com - - - Anpassat filter - Dölj komponenter med anpassade filter - Aktivera anpassat filter - Anpassat filter är aktiverat - Anpassat filter är inaktiverat - Anpassat filter - - Lista över sökvägsbyggsträngar för komponenter som ska filtreras, åtskilda av en ny rad - Det anpassade filtret är ogiltigt: %s - - - - - Om - Annonser - Alternativa miniatyrbilder - Flöde - Allmänt - Spelare - Sökreglage - Svepgester - Övrigt - Återställ gamla inställningsmenyer - Gamla inställningsmenyer visas - Gamla inställningsmenyer visas inte - - - Inaktivera uppspelning av Shorts-videor i bakgrunden - Uppspelning av Shorts-videor i bakgrunden är inaktiverad - Uppspelning av Shorts-videor i bakgrunden är aktiverad - - - Dölj albumkort - Albumkort är dolda - Albumkort visas - Dölj artistkort - Artistkort är dolda - Artistkort visas - Dölj hylla med brickor - Hylla med brickor är dold - Hylla med brickor visas - Dölj community-inlägg - Community-inlägg är dolda - Community-inlägg visas - Dölj kompakta banners - Kompakta banners är dolda - Kompakta banners visas - Dölj expanderbart kort - Expanderbart kort under videor är dolt - Expanderbart kort under videor visas - Dölj flytande mikrofonknapp - Flytande mikrofonknapp i sökning är dold - Flytande mikrofonknapp i sökning visas - Dölj horisontella hyllor - "Horisontella hyllor är dolda, till exempel: + + + Rensa delningslänkar + Spårningsfrågeparametern tas bort från delade länkar + Spårningsfrågeparametern tas inte bort från delade länkar + Ändra delningslänkar till youtube.com + Delade länkar använder youtube.com + Delade länkar använder music.youtube.com + + + Anpassat filter + Dölj komponenter med anpassade filter + Aktivera anpassat filter + Anpassat filter är aktiverat + Anpassat filter är inaktiverat + Anpassat filter + + Lista över sökvägsbyggsträngar för komponenter som ska filtreras, åtskilda av en ny rad + Det anpassade filtret är ogiltigt: %s + + + + + Om + Annonser + Alternativa miniatyrbilder + Flöde + Allmänt + Spelare + Sökreglage + Svepgester + Övrigt + Återställ gamla inställningsmenyer + Gamla inställningsmenyer visas + Gamla inställningsmenyer visas inte + + + Inaktivera uppspelning av Shorts-videor i bakgrunden + Uppspelning av Shorts-videor i bakgrunden är inaktiverad + Uppspelning av Shorts-videor i bakgrunden är aktiverad + + + Dölj albumkort + Albumkort är dolda + Albumkort visas + Dölj artistkort + Artistkort är dolda + Artistkort visas + Dölj hylla med brickor + Hylla med brickor är dold + Hylla med brickor visas + Dölj community-inlägg + Community-inlägg är dolda + Community-inlägg visas + Dölj kompakta banners + Kompakta banners är dolda + Kompakta banners visas + Dölj expanderbart kort + Expanderbart kort under videor är dolt + Expanderbart kort under videor visas + Dölj flytande mikrofonknapp + Flytande mikrofonknapp i sökning är dold + Flytande mikrofonknapp i sökning visas + Dölj horisontella hyllor + "Horisontella hyllor är dolda, till exempel: • Senaste nytt • Fortsätt att titta @@ -250,1026 +249,1026 @@ Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, • Mest relevanta • Shopping • Titta igen" - Horisontella hyllor visas - Dölj bildhylla - Bildhylla i sökresultat är dold - Bildhylla i sökresultat visas - Dölj senaste inlägg - Senaste inlägg är dolda - Senaste inlägg visas - Dölj mix-spellistor - Mix-spellistor är dolda - Mix-spellistor visas - Dölj filmsektion - Filmsektionen är dold - Filmsektionen visas - - Dölj knappen Meddela mig - Knappen Meddela mig är dold - Knappen Meddela mig visas - Dölj Spelhörna - Spelhörna är dold - Spelhörna visas - - Dölj knappen Visa mer - Knappen Visa mer i sökresultat är dold - Knappen Visa mer i sökresultat visas - Dölj enkäter - Enkäter är dolda - Enkäter visas - Dölj biljetthylla - Biljetthyllan är dold - Biljetthyllan visas - - Dölj etiketter för videorekommendationer - \"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketter i sökresultat är dolda - \"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketter i sökresultat visas - Dölj visuell utfyllnad - Visuell utfyllnad är dold - Visuell utfyllnad visas - - Dölj YouTube-doodles - YouTube-doodles-animation på logotypen är dold - YouTube-doodles-animation på logotypen visas - "YouTube-doodles visas några dagar varje år. + Dölj knappen Visa mer + Knappen Visa mer i sökresultat är dold + Knappen Visa mer i sökresultat visas + Dölj enkäter + Enkäter är dolda + Enkäter visas + Dölj biljetthylla + Biljetthyllan är dold + Biljetthyllan visas + + Dölj etiketter för videorekommendationer + \"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketter i sökresultat är dolda + \"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketter i sökresultat visas + Dölj visuell utfyllnad + Visuell utfyllnad är dold + Visuell utfyllnad visas + + Dölj YouTube-doodles + YouTube-doodles-animation på logotypen är dold + YouTube-doodles-animation på logotypen visas + "YouTube-doodles visas några dagar varje år. Om en doodle visas för närvarande i din region och den här döljningsinställningen är på, kommer filterfältet under sökfältet också att döljas." - Dölj kanalfält - Kanalfältet är dolt - Kanalfältet visas - Dölj kanalens vattenstämpel - Vattenstämpeln är dold - Vattenstämpeln visas - Dölj insamlingsrutan - Insamlingsrutan är dold - Insamlingsrutan visas - Dölj krisresurspaneler - Krisresurspanelerna är dolda - Krisresurspanelerna visas - Dölj infopaneler - Infopanelerna är dolda - Infopanelerna visas - - Dölj knappen Bli medlem - Knappen Bli medlem är dold - Knappen Bli medlem visas - Dölj hälsoinformationspaneler - Hälsoinformationspanelerna är dolda - Hälsoinformationspanelerna visas - Dölj snabbåtgärder - Snabbåtgärder i helskärm är dolda - Snabbåtgärder i helskärm visas - Dölj liknande videor - Liknande videor i snabbåtgärder är dolda - Liknande videor i snabbåtgärder visas - Dölj riktlinjer för prenumeranter - Community-riktlinjer för prenumeranter är dolda - Community-riktlinjer för prenumeranter visas - Dölj tidsbaserade reaktioner - Tidsbaserade reaktioner är dolda - Tidsbaserade reaktioner visas - Dölj AI-genererad videoöversikt - Avsnittet AI-genererad videoöversikt är dolt - Avsnittet AI-genererad videoöversikt visas - Dölj Fråga - Avsnittet Fråga är dolt - Avsnittet Fråga visas - Dölj attribut - Avsnitten Platser som visas, Spel, Musik och Personer som förekommer är dolda - Avsnitten Platser som visas, Spel, Musik och Personer som förekommer visas - Dölj Kapitel - Avsnittet Kapitel är dolt - Avsnittet Kapitel visas - Dölj Hur det här innehållet skapades - Avsnittet Hur det här innehållet skapades är dolt - Avsnittet Hur det här innehållet skapades visas - Dölj hajppoäng - Hajppoäng är dolda - Hajppoäng visas - Dölj Utforska podden - Avsnittet Utforska podden är dolt - Avsnittet Utforska podden visas - Dölj utvalda länkar - Avsnittet med utvalda länkar är dolt - Avsnittet med utvalda länkar visas - Dölj utvalda videor - Avsnittet med utvalda videor är dolt - Avsnittet med utvalda videor visas - Dölj infokort - Avsnittet för infokort är dolt - Avsnittet för infokort visas - Dölj \"Huvudkoncept\" - Avsnittet Huvudkoncept är dolt - Avsnittet Huvudkoncept visas - Dölj knappen Prenumerera - Knappen Prenumerera är dold - Knappen Prenumerera visas - Dölj Manuskript - Avsnittet Manuskript är dolt - Avsnittet Manuskript visas - Videobeskrivning - Dölj eller visa komponenter i videobeskrivningen - Filterfält - Dölj eller visa filterfältet i flödena, liknande videor, sökresultaten och visningshistoriken - Dölj i flöden - Dolt i flöden - Visas i flöden - Dölj i liknande videor - Dolt i liknande videor - Visas i liknande videor - Dölj i sökresultat - Dolt i sökresultat - Visas i sökresultat - Dölj i visningshistoriken - Döljs i visningshistoriken - Visas i visningshistoriken - Kanalsida - Dölj eller visa komponenter på kanalsidan - - Dölj Community-knapp - Knappen Community är dold - Knappen Community visas - - Dölj hyllan För dig - Hyllan För dig är dold - Hyllan För dig visas - - Dölj knappen Bli medlem - Knappen Bli medlem är dold - Knappen Bli medlem visas - Dölj förhandsgranskning av länkar - Förhandsgranskning av länkar är dold - Förhandsgranskning av länkar visas - Dölj medlemshylla - Medlemshyllan är dold - Medlemshyllan visas - - Dölj knappen Butik - Knappen Butik är dold - Knappen Butik visas - - Dölj knappen Prenumerera - Knappen Prenumerera är dold - Knappen Prenumerera visas - Kommentarer - Dölj eller visa komponenter i kommentarsfältet - Dölj AI-sammanfattning av chatt - AI-sammanfattning av chatt är dold - AI-sammanfattning av chatt visas - Dölj AI-sammanfattning av kommentarer - AI-sammanfattning av kommentarer är dold - AI-sammanfattning av kommentarer visas - Dölj kanalriktlinjer - Kanalriktlinjer är dolda - Kanalriktlinjer visas - Dölj rubriken Kommentarer från medlemmar - Rubriken Kommentarer från medlemmar är dold - Rubriken Kommentarer från medlemmar visas - Dölj kommentarsfältet - Kommentarsfältet är dolt - Kommentarsfältet visas - Dölj riktlinjerna för communityn - Riktlinjerna för communityn är dolda - Riktlinjerna för communityn visas - Dölj knappen Skapa en Shorts-video - Knappen Skapa en Shorts-video är dold - Knappen Skapa en Shorts-video visas - Dölj knappar för emoji och tidsstämpel - Knapparna för emoji och tidsstämpel är dolda - Knapparna för emoji och tidsstämpel visas - Dölj förhandsvisad kommentar - Förhandsvisad kommentar är dold - Förhandsvisad kommentar visas - Dölj knappen Thanks - Knappen Thanks är dold - Knappen Thanks visas - Dölj antal visningar - Antal visningar är dolt i flödet och sökresultaten - Antal visningar visas i flödet och sökresultaten - - "Begränsningar: + Dölj knappen Bli medlem + Knappen Bli medlem är dold + Knappen Bli medlem visas + Dölj hälsoinformationspaneler + Hälsoinformationspanelerna är dolda + Hälsoinformationspanelerna visas + Dölj snabbåtgärder + Snabbåtgärder i helskärm är dolda + Snabbåtgärder i helskärm visas + Dölj liknande videor + Liknande videor i snabbåtgärder är dolda + Liknande videor i snabbåtgärder visas + Dölj riktlinjer för prenumeranter + Community-riktlinjer för prenumeranter är dolda + Community-riktlinjer för prenumeranter visas + Dölj tidsbaserade reaktioner + Tidsbaserade reaktioner är dolda + Tidsbaserade reaktioner visas + Dölj AI-genererad videoöversikt + Avsnittet AI-genererad videoöversikt är dolt + Avsnittet AI-genererad videoöversikt visas + Dölj Fråga + Avsnittet Fråga är dolt + Avsnittet Fråga visas + Dölj attribut + Avsnitten Platser som visas, Spel, Musik och Personer som förekommer är dolda + Avsnitten Platser som visas, Spel, Musik och Personer som förekommer visas + Dölj Kapitel + Avsnittet Kapitel är dolt + Avsnittet Kapitel visas + Dölj Hur det här innehållet skapades + Avsnittet Hur det här innehållet skapades är dolt + Avsnittet Hur det här innehållet skapades visas + Dölj hajppoäng + Hajppoäng är dolda + Hajppoäng visas + Dölj Utforska podden + Avsnittet Utforska podden är dolt + Avsnittet Utforska podden visas + Dölj utvalda länkar + Avsnittet med utvalda länkar är dolt + Avsnittet med utvalda länkar visas + Dölj utvalda videor + Avsnittet med utvalda videor är dolt + Avsnittet med utvalda videor visas + Dölj infokort + Avsnittet för infokort är dolt + Avsnittet för infokort visas + Dölj \"Huvudkoncept\" + Avsnittet Huvudkoncept är dolt + Avsnittet Huvudkoncept visas + Dölj knappen Prenumerera + Knappen Prenumerera är dold + Knappen Prenumerera visas + Dölj Manuskript + Avsnittet Manuskript är dolt + Avsnittet Manuskript visas + Videobeskrivning + Dölj eller visa komponenter i videobeskrivningen + Filterfält + Dölj eller visa filterfältet i flödena, liknande videor, sökresultaten och visningshistoriken + Dölj i flöden + Dolt i flöden + Visas i flöden + Dölj i liknande videor + Dolt i liknande videor + Visas i liknande videor + Dölj i sökresultat + Dolt i sökresultat + Visas i sökresultat + Dölj i visningshistoriken + Döljs i visningshistoriken + Visas i visningshistoriken + Kanalsida + Dölj eller visa komponenter på kanalsidan + + Dölj Community-knapp + Knappen Community är dold + Knappen Community visas + + Dölj hyllan För dig + Hyllan För dig är dold + Hyllan För dig visas + + Dölj knappen Bli medlem + Knappen Bli medlem är dold + Knappen Bli medlem visas + Dölj förhandsgranskning av länkar + Förhandsgranskning av länkar är dold + Förhandsgranskning av länkar visas + Dölj medlemshylla + Medlemshyllan är dold + Medlemshyllan visas + + Dölj knappen Butik + Knappen Butik är dold + Knappen Butik visas + + Dölj knappen Prenumerera + Knappen Prenumerera är dold + Knappen Prenumerera visas + Kommentarer + Dölj eller visa komponenter i kommentarsfältet + Dölj AI-sammanfattning av chatt + AI-sammanfattning av chatt är dold + AI-sammanfattning av chatt visas + Dölj AI-sammanfattning av kommentarer + AI-sammanfattning av kommentarer är dold + AI-sammanfattning av kommentarer visas + Dölj kanalriktlinjer + Kanalriktlinjer är dolda + Kanalriktlinjer visas + Dölj rubriken Kommentarer från medlemmar + Rubriken Kommentarer från medlemmar är dold + Rubriken Kommentarer från medlemmar visas + Dölj kommentarsfältet + Kommentarsfältet är dolt + Kommentarsfältet visas + Dölj riktlinjerna för communityn + Riktlinjerna för communityn är dolda + Riktlinjerna för communityn visas + Dölj knappen Skapa en Shorts-video + Knappen Skapa en Shorts-video är dold + Knappen Skapa en Shorts-video visas + Dölj knappar för emoji och tidsstämpel + Knapparna för emoji och tidsstämpel är dolda + Knapparna för emoji och tidsstämpel visas + Dölj förhandsvisad kommentar + Förhandsvisad kommentar är dold + Förhandsvisad kommentar visas + Dölj knappen Thanks + Knappen Thanks är dold + Knappen Thanks visas + Dölj antal visningar + Antal visningar är dolt i flödet och sökresultaten + Antal visningar visas i flödet och sökresultaten + + "Begränsningar: • Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa antal visningar • Denna funktion fungerar inte med bilformfaktor" - Dölj uppladdningstid - Uppladdningstid är dold i flödet och sökresultaten - Uppladdningstid visas i flödet och sökresultaten - - "Begränsningar: + Dölj uppladdningstid + Uppladdningstid är dold i flödet och sökresultaten + Uppladdningstid visas i flödet och sökresultaten + + "Begränsningar: • Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa uppladdningstider • Denna funktion fungerar inte med bilformfaktor" - Dölj innehåll med nyckelord - Dölj videor i flöden och i sökning med hjälp av nyckelordsfilter - Dölj videor i Hem med nyckelord - Videor i fliken Hem filtreras efter nyckelord - Videor i fliken Hem filtreras inte efter nyckelord - Dölj sökresultat med nyckelord - Sökresultat filtreras efter nyckelord - Sökresultat filtreras inte efter nyckelord - Dölj videor i Prenumerationer med nyckelord - Videor i fliken Prenumerationer filtreras efter nyckelord - Videor i fliken Prenumerationer filtreras inte efter nyckelord - Nyckelord som ska döljas - - "Nyckelord och fraser som ska döljas, åtskilda av nya rader + "Nyckelord och fraser som ska döljas, åtskilda av nya rader Nyckelord kan vara kanalnamn eller vilken text som helst som visas i videotitlar Ord med versaler i mitten måste anges med korrekt skiftläge (t.ex. iPhone, TikTok, LeBlanc)" - Om nyckelordsfiltrering - "Hem/Prenumerationer/sökresultat filtreras för att dölja innehåll som matchar nyckelordsfraser + Om nyckelordsfiltrering + "Hem/Prenumerationer/sökresultat filtreras för att dölja innehåll som matchar nyckelordsfraser Begränsningar • Shorts-videor kan inte döljas baserat på kanalnamn • Vissa komponenter i användargränssnittet kanske inte döljs • Om du söker på ett nyckelord kan det hända att inga resultat visas" - Matcha hela ord - - Om du omger ett nyckelord/en fras med dubbla citattecken förhindrar du partiella matchningar av videotitlar och kanalnamn<br><br>Till exempel:<br><b>\"ai\"</b> kommer att dölja videon: <b>How does AI work?</b><br>men kommer inte att dölja: <b>What does fair use mean?</b> - - Kan inte använda nyckelord: %s - Lägg till citattecken för att använda nyckelord: %s - Nyckelordet har motstridiga deklarationer: %s - Nyckelordet är för kort och kräver citattecken: %s - Nyckelordet döljer alla videor: %s - - - Dölj butikshylla för kreatörer - Butikshylla för kreatörer under videospelaren är dold - Kreatörsbutikens hylla under videospelaren visas - Dölj butiksbanner på slutskärmen - Butiksbanner på slutskärmen är dold - Butiksbanner på slutskärmen visas - Dölj helskärmsannonser - "Helskärmsannonser är dolda + Matcha hela ord + + Om du omger ett nyckelord/en fras med dubbla citattecken förhindrar du partiella matchningar av videotitlar och kanalnamn<br><br>Till exempel:<br><b>\"ai\"</b> kommer att dölja videon: <b>How does AI work?</b><br>men kommer inte att dölja: <b>What does fair use mean?</b> + + Kan inte använda nyckelord: %s + Lägg till citattecken för att använda nyckelord: %s + Nyckelordet har motstridiga deklarationer: %s + Nyckelordet är för kort och kräver citattecken: %s + Nyckelordet döljer alla videor: %s + + + Dölj butikshylla för kreatörer + Butikshylla för kreatörer under videospelaren är dold + Kreatörsbutikens hylla under videospelaren visas + Dölj butiksbanner på slutskärmen + Butiksbanner på slutskärmen är dold + Butiksbanner på slutskärmen visas + Dölj helskärmsannonser + "Helskärmsannonser är dolda Den här funktionen är endast tillgänglig för äldre enheter" - Helskärmsannonser visas - - Helskärmsannonser kan döljas bara på äldre enheter - Dölj allmänna annonser - Allmänna annonser är dolda - Allmänna annonser visas - Dölj banners för varor - Banners för varor är dolda - Banners för varor visas - Dölj etikett för betald marknadsföring - Etikett för betald marknadsföring är dold - Etikett för betald marknadsföring visas - Dölj självsponsrade kort - Självsponsrade kort är dolda - Självsponsrade kort är synliga - Dölj butikslänkar - Butikslänkar i videobeskrivningen är dolda - Butikslänkar i videobeskrivningen visas - Dölj bannern Visa produkter - Bannern Visa produkter i videoöverlägget är dold - Bannern Visa produkter i videoöverlägget visas - Dölj sökresultat från webben - Sökresultat från webben är dolda - Sökresultat från webben visas - - - Dölj YouTube Premium-kampanjer - YouTube Premium-kampanjer under videospelaren är dolda - YouTube Premium-kampanjer under videospelaren visas - - - Dölj videoannonser - Videoannonser är dolda - Videoannonser visas - - - Videoadress kopierad till urklipp - Videoadress med tidsstämpel kopierad - Visa knapp för att kopiera videoadress - Knappen för att kopiera video-URL visas. Tryck för att kopiera videoadressen. Tryck länge för att kopiera med tidsstämpel - Knappen för att kopiera video-URL visas inte - Visa knapp för att kopiera videoadress med tidsstämpel - Knappen för att kopiera tidsstämpel-URL visas. Tryck för att kopiera videoadressen med tidsstämpel. Tryck länge för att kopiera utan tidsstämpel - Knappen för att kopiera tidsstämpel-URL visas inte - - - Ta bort dialogrutan Känsliga tittare varnas - Dialogrutan tas bort - Dialogrutan visas - Detta kringgår inte åldersbegränsningen. Det bara godkänner automatiskt. - - - Inaktivera popup-fönstret \'Logga in på TV\' - \"Logga in på TV\"-popup är inaktiverad - \"Logga in på TV\"-popup är aktiverad - - - Inaktivera dubbeltryck för att hoppa över kapitel - Dubbeltryck kan aldrig utlösa ett hopp till nästa/föregående kapitel - Dubbeltryck kan ibland utlösa ett hopp till nästa/föregående kapitel - - - Externa nedladdningar - Inställningar för användning av en extern nedladdare - Visa knapp för extern nedladdning - Nedladdningsknapp i spelaren visas - Nedladdningsknapp i spelaren visas inte - - Åsidosätt åtgärdsknappen Ladda ned - Knappen Ladda ned öppnar din externa nedladdare - Knappen Ladda ned öppnar appens inbyggda nedladdare - Nedladdarens paketnamn - Paketnamn på din installerade externa nedladdningsapp - Ange paketnamnet - Annat - Appen är inte installerad - %s är inte installerat. Installera det. - "Kunde inte hitta installerad app med paketnamn: %s + Helskärmsannonser visas + + Helskärmsannonser kan döljas bara på äldre enheter + Dölj allmänna annonser + Allmänna annonser är dolda + Allmänna annonser visas + Dölj banners för varor + Banners för varor är dolda + Banners för varor visas + Dölj etikett för betald marknadsföring + Etikett för betald marknadsföring är dold + Etikett för betald marknadsföring visas + Dölj självsponsrade kort + Självsponsrade kort är dolda + Självsponsrade kort är synliga + Dölj butikslänkar + Butikslänkar i videobeskrivningen är dolda + Butikslänkar i videobeskrivningen visas + Dölj bannern Visa produkter + Bannern Visa produkter i videoöverlägget är dold + Bannern Visa produkter i videoöverlägget visas + Dölj sökresultat från webben + Sökresultat från webben är dolda + Sökresultat från webben visas + + + Dölj YouTube Premium-kampanjer + YouTube Premium-kampanjer under videospelaren är dolda + YouTube Premium-kampanjer under videospelaren visas + + + Dölj videoannonser + Videoannonser är dolda + Videoannonser visas + + + Videoadress kopierad till urklipp + Videoadress med tidsstämpel kopierad + Visa knapp för att kopiera videoadress + Knappen för att kopiera video-URL visas. Tryck för att kopiera videoadressen. Tryck länge för att kopiera med tidsstämpel + Knappen för att kopiera video-URL visas inte + Visa knapp för att kopiera videoadress med tidsstämpel + Knappen för att kopiera tidsstämpel-URL visas. Tryck för att kopiera videoadressen med tidsstämpel. Tryck länge för att kopiera utan tidsstämpel + Knappen för att kopiera tidsstämpel-URL visas inte + + + Ta bort dialogrutan Känsliga tittare varnas + Dialogrutan tas bort + Dialogrutan visas + Detta kringgår inte åldersbegränsningen. Det bara godkänner automatiskt. + + + Inaktivera popup-fönstret \'Logga in på TV\' + \"Logga in på TV\"-popup är inaktiverad + \"Logga in på TV\"-popup är aktiverad + + + Inaktivera dubbeltryck för att hoppa över kapitel + Dubbeltryck kan aldrig utlösa ett hopp till nästa/föregående kapitel + Dubbeltryck kan ibland utlösa ett hopp till nästa/föregående kapitel + + + Externa nedladdningar + Inställningar för användning av en extern nedladdare + Visa knapp för extern nedladdning + Nedladdningsknapp i spelaren visas + Nedladdningsknapp i spelaren visas inte + + Åsidosätt åtgärdsknappen Ladda ned + Knappen Ladda ned öppnar din externa nedladdare + Knappen Ladda ned öppnar appens inbyggda nedladdare + Nedladdarens paketnamn + Paketnamn på din installerade externa nedladdningsapp + Ange paketnamnet + Annat + Appen är inte installerad + %s är inte installerat. Installera det. + "Kunde inte hitta installerad app med paketnamn: %s Kontrollera att paketnamnet är korrekt och att appen är installerad" - Paketnamnet får inte vara tomt - - - Inaktivera gest för exakt sökning - Gesten är inaktiverad - Gesten är aktiverad - - - Aktivera Tryck för att söka - Tryck för att söka är aktiverat - Tryck för att söka är inaktiverat - - - Aktivera ljusstyrkegest - "Svepgest för ljusstyrka i helskärm är aktiverad + Paketnamnet får inte vara tomt + + + Inaktivera gest för exakt sökning + Gesten är inaktiverad + Gesten är aktiverad + + + Aktivera Tryck för att söka + Tryck för att söka är aktiverat + Tryck för att söka är inaktiverat + + + Aktivera ljusstyrkegest + "Svepgest för ljusstyrka i helskärm är aktiverad Justera ljusstyrkan genom att svepa vertikalt till vänster på skärmen" - Svepgest för ljusstyrka i helskärm är inaktiverad - Aktivera volymgest - "Svepgest för volym i helskärm är aktiverad + Svepgest för ljusstyrka i helskärm är inaktiverad + Aktivera volymgest + "Svepgest för volym i helskärm är aktiverad Justera volymen genom att svepa vertikalt till höger på skärmen" - Svepgest för volym i helskärm är inaktiverad - Aktivera gesten Tryck för att svepa - Tryck för att svepa är aktiverat - Tryck för att svepa är inaktiverat - Aktivera haptisk återkoppling - Haptisk återkoppling är aktiverad - Haptisk återkoppling är inaktiverad - Spara och återställ ljusstyrka - Spara och återställ ljusstyrkan när du avslutar eller startar helskärmsläget - Spara och återställ inte ljusstyrkan när du avslutar eller startar helskärmsläget - Aktivera gest för automatisk ljusstyrka - Automatisk ljusstyrka aktiveras om du sveper ned till ljusstyrkegestens lägsta värde - Automatisk ljusstyrka aktiveras inte om du sveper ned till det lägsta värdet - Automatiskt - Tidsgräns för svepöverlägg - Antalet millisekunder som överlägget är synligt - Bakgrundsopacitet för svepöverlägg - Opacitetsvärde mellan 0 och 100 - Svepöverläggets opacitet måste vara mellan 0 och 100 - Färg på svepöverlägg för ljusstyrkegest - Färgen på mätaren för ljusstyrka - Färg på svepöverlägg för volymgest - Färgen på mätaren för volym - Textstorlek för svepöverlägg - Textstorleken för svepöverlägg mellan 1 och 30 - Textstorleken måste vara mellan 1 och 30 - Tröskelvärde för svep - Tröskelvärdet för att svep ska uppstå - Svepkänslighet för volymgest - Hur mycket volymen ändras per svep - Stil på svepöverlägg - Horisontellt överlägg - Horisontellt överlägg (minimalt – överst) - Horisontellt överlägg (minimalt – mitten) - Cirkulärt överlägg - Cirkulärt överlägg (minimalt) - Vertikalt överlägg - Vertikalt överlägg (minimalt) - Aktivera svep för att byta videor - Svep i helskärmsläge byter till nästa/föregående video - Svep i helskärmsläge byter inte till nästa/föregående video - - - Inaktivera automatisk textning - Automatisk textning är inaktiverad - Automatisk textning är aktiverad - - - Åtgärdsknappar - Dölj eller visa knappar under videor - Inaktivera lysande knappar för Gilla och Prenumerera - Knapparna Gilla och Prenumerera lyser inte när de nämns - Knapparna Gilla och Prenumerera lyser när de nämns - Dölj Gilla och Ogilla - Knapparna Gilla och Ogilla är dolda - Knapparna Gilla och Ogilla visas - - Dölj Dela - Knappen Dela är dold - Knappen Dela visas - - Dölj Stoppa annonser - Knappen Stoppa annonser är dold - Knappen Stoppa annonser visas - - Dölj Kommentarer - Knappen Kommentarer är dold - Knappen Kommentarer visas - + Dölj Dela + Knappen Dela är dold + Knappen Dela visas + + Dölj Stoppa annonser + Knappen Stoppa annonser är dold + Knappen Stoppa annonser visas + + Dölj Kommentarer + Knappen Kommentarer är dold + Knappen Kommentarer visas + - Dölj Rapportera - Knappen Rapportera är dold - Knappen Rapportera visas - - Dölj Remixa - Knappen Remixa är dold - Knappen Remixa visas - - Dölj Ladda ned - Knappen Ladda ned är dold - Knappen Ladda ned visas - + Dölj Remixa + Knappen Remixa är dold + Knappen Remixa visas + + Dölj Ladda ned + Knappen Ladda ned är dold + Knappen Ladda ned visas + - Dölj Hajp - Knappen Hajp är dold - Knappen Hajp visas - - Dölj Marknadsför - Knappen Marknadsför är dold - Knappen Marknadsför visas - - Dölj Thanks - Knappen Thanks är dold - Knappen Thanks visas - + Dölj Marknadsför + Knappen Marknadsför är dold + Knappen Marknadsför visas + + Dölj Thanks + Knappen Thanks är dold + Knappen Thanks visas + - Dölj Fråga - Knappen Fråga är dold - Knappen Fråga visas - - Dölj Klipp - Knappen Klipp är dold - Knappen Klipp visas - - Dölj Butik - Knappen Butik är dold - Knappen Butik visas - - Dölj Spara - Knappen Spara är dold - Knappen Spara visas - - - Navigeringsknappar - Dölj eller ändra knappar i navigeringsfältet - - Dölj Hem - Knappen Hem är dold - Knappen Hem visas - - Dölj Shorts - Knappen Shorts är dold - Knappen Shorts visas - - Dölj Skapa - Knappen Skapa är dold - Knappen Skapa visas - - Dölj Prenumerationer - Knappen Prenumerationer är dold - Knappen Prenumerationer visas - Dölj Aviseringar - Knappen Aviseringar är dold - Knappen Aviseringar visas - - Byt ut Skapa mot Aviseringar - "Knappen Skapa byts ut mot knappen Aviseringar + Dölj Fråga + Knappen Fråga är dold + Knappen Fråga visas + + Dölj Klipp + Knappen Klipp är dold + Knappen Klipp visas + + Dölj Butik + Knappen Butik är dold + Knappen Butik visas + + Dölj Spara + Knappen Spara är dold + Knappen Spara visas + + + Navigeringsknappar + Dölj eller ändra knappar i navigeringsfältet + + Dölj Hem + Knappen Hem är dold + Knappen Hem visas + + Dölj Shorts + Knappen Shorts är dold + Knappen Shorts visas + + Dölj Skapa + Knappen Skapa är dold + Knappen Skapa visas + + Dölj Prenumerationer + Knappen Prenumerationer är dold + Knappen Prenumerationer visas + Dölj Aviseringar + Knappen Aviseringar är dold + Knappen Aviseringar visas + + Byt ut Skapa mot Aviseringar + "Knappen Skapa byts ut mot knappen Aviseringar Obs! Om du aktiverar detta döljs även videoannonser" - Knappen Skapa byts inte ut mot knappen Aviseringar - "Om du inaktiverar den här inställningen inaktiveras även annonsblockering för Shorts. + Knappen Skapa byts inte ut mot knappen Aviseringar + "Om du inaktiverar den här inställningen inaktiveras även annonsblockering för Shorts. Om du ändrar den här inställningen utan att det träder i kraft kan du testa att byta till inkognitoläge." - Dölj etiketter för navigeringsknappar - Etiketter är dolda - Etiketter visas - Inaktivera genomskinligt statusfält - Statusfältet är ogenomskinligt - Statusfältet är ogenomskinligt eller genomskinligt - På vissa enheter kan aktivering av den här funktionen ändra systemets navigeringsfält till genomskinligt. - Inaktivera ljust genomskinligt fält - Navigeringsfältet i ljust läge är ogenomskinligt - Navigeringsfältet i ljust läge är ogenomskinligt eller genomskinligt - Inaktivera mörkt genomskinligt fält - Navigeringsfältet i mörkt läge är ogenomskinligt - Navigeringsfältet i mörkt läge är ogenomskinligt eller genomskinligt - - - Flyout-meny - Dölj eller visa objekt i spelarens flyout-meny - - Dölj Textning - Menyn Textning är dold - Menyn Textning visas - - Dölj Fler inställningar - Menyn Fler inställningar är dold - Menyn Fler inställningar visas - - Dölj Sovtimer - Menyn Sovtimer är dold - Menyn Sovtimer visas - - Dölj Skapa en slinga för video - Menyn Skapa en slinga för video är dold - Menyn Skapa en slinga för video visas - - Dölj Ambientljus - Menyn Ambientljus är dold - Menyn Ambientljus visas - Dölj Jämn volym - Menyn Jämn volym visas - Menyn Jämn volym är dold - - Dölj Hjälp och feedback - Menyn Hjälp och feedback är dold - Menyn Hjälp och feedback visas - - Dölj Uppspelningshastighet - Menyn Uppspelningshastighet är dold - Menyn Uppspelningshastighet visas - - Dölj Låsa skärmen - Menyn Låsa skärmen är dold - Menyn Låsa skärmen visas - - Dölj Lyssna med YouTube Music - Menyn Lyssna med YouTube Music är dold - Menyn Lyssna med YouTube Music visas - - Dölj Ljudspår - Menyn Ljudspår är dold - Menyn Ljudspår visas - + Dölj Textning + Menyn Textning är dold + Menyn Textning visas + + Dölj Fler inställningar + Menyn Fler inställningar är dold + Menyn Fler inställningar visas + + Dölj Sovtimer + Menyn Sovtimer är dold + Menyn Sovtimer visas + + Dölj Skapa en slinga för video + Menyn Skapa en slinga för video är dold + Menyn Skapa en slinga för video visas + + Dölj Ambientljus + Menyn Ambientljus är dold + Menyn Ambientljus visas + Dölj Jämn volym + Menyn Jämn volym visas + Menyn Jämn volym är dold + + Dölj Hjälp och feedback + Menyn Hjälp och feedback är dold + Menyn Hjälp och feedback visas + + Dölj Uppspelningshastighet + Menyn Uppspelningshastighet är dold + Menyn Uppspelningshastighet visas + + Dölj Låsa skärmen + Menyn Låsa skärmen är dold + Menyn Låsa skärmen visas + + Dölj Lyssna med YouTube Music + Menyn Lyssna med YouTube Music är dold + Menyn Lyssna med YouTube Music visas + + Dölj Ljudspår + Menyn Ljudspår är dold + Menyn Ljudspår visas + - "Menyn Ljudspår är dold + "Menyn Ljudspår är dold Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\" till \"Android No SDK\"" - - Dölj Titta i VR - Menyn Titta i VR är dold - Menyn Titta i VR visas - Dölj videokvalitetsmeny - Menyn för videokvalitet är dold - Menyn för videokvalitet visas - Dölj sidfot på videokvalitetsmeny - Sidfoten på videokvalitetsmenyn är dold - Sidfoten på videokvalitetsmenyn visas - - - Dölj knappen för automatisk uppspelning - Knappen för automatisk uppspelning är dold - Knappen för automatisk uppspelning visas - - Dölj knappen Textning - Knappen Textning är dold - Knappen Textning visas - Dölj knappen Casta - Knappen Casta är dold - Knappen Casta visas - Dölj bakgrunder för uppspelningsknappar - Bakgrunder för uppspelningsknappar är dolda - Bakgrunder för uppspelningsknappar visas - Dölj knapparna Föregående och Nästa - Knapparna är dolda - Knapparna visas - - - Dölj slutskärmskort - Slutskärmskort är dolda - Slutskärmskort visas - - - Inaktivera Ambientljus i helskärm - Ambientljus är inaktiverat - Ambientljus är aktiverat - - - Dölj infokort - Infokort är dolda - Infokort visas - - - Inaktivera animationer med rullande siffror - Rullande siffror animeras inte - Rullande siffror animeras - - - Dölj sökreglaget i videospelaren - Sökreglaget i videospelaren är dolt - Sökreglaget i videospelaren visas - - Dölj sökreglaget i videominiatyrer - Sökreglaget i videominiatyrer är dolt - Sökreglaget i videominiatyrer visas - - - Shorts-spelare - Dölj eller visa komponenter i Shorts-spelaren - - Dölj Shorts-videor i hemflödet - Döljs i hemflödet och liknande videor - Visas i hemflödet och liknande videor - Dölj Shorts-videor i sökresultat - Döljs i sökresultat - Visas i sökresultat - - Dölj Shorts-videor i flödet Prenumerationer - Döljs i flödet Prenumerationer - Visas i flödet Prenumerationer - Dölj Shorts-videor i visningshistoriken - Döljs i visningshistoriken - Visas i visningshistoriken - Dölj etiketten \'Automatiskt dubbat\' - Etiketten för automatiskt dubbat är dold - Etiketten för automatiskt dubbat visas - Dölj knappen \'Köp Super Thanks\' - Knappen Köp Super Thanks är dold - Knappen Köp Super Thanks visas - Dölj effektknapp - Effektknappen är dold - Effektknappen visas - Dölj knappen \'Greenscreen\' - Knappen Greenscreen är dold - Knappen Greenscreen visas - Dölj hashtag-knapp - Hashtag-knappen är dold - Hashtag-knappen visas - - Dölj knappen Bli medlem - Knappen Bli medlem är dold - Knappen Bli medlem visas - Dölj liveförhandsgranskning - Direktförhandsgranskning är dold - Direktförhandsgranskning visas - Dölj platsetikett - Platsetiketten är dold - Platsetiketten visas - Dölj knappen \'Nya inlägg\' - Knappen Nya inlägg är dold - Knappen Nya inlägg visas - Dölj pausöverläggsknappar - Pausöverläggsknappar är dolda - Pausöverläggsknappar visas - Dölj förhandsvisad kommentar - Förhandsvisad kommentar är dold - Förhandsvisad kommentar visas - Dölj knappen \'Spara musik\' - Knappen Spara musik är dold - Knappen Spara musik visas - Dölj sökförslag - Sökförslag är dolda - Sökförslag visas - Dölj knappen Butik - Knappen Butik är dold - Knappen Butik visas - Dölj dekaler - Dekaler är dolda - Dekaler visas - Dölj knappen Prenumerera - Knappen Prenumerera är dold - Knappen Prenumerera visas - Dölj taggade produkter - Taggade produkter är dolda - Taggade produkter visas - Dölj knappen Kommande - Knappen Kommande är dold - Knappen Kommande visas - Dölj knappen \'Använd det här ljudet\' - Knappen Använd det här ljudet är dold - Knappen Använd det här ljudet visas - Dölj knappen \'Använd den här mallen\' - Knappen Använd den här mallen är dold - Knappen Använd den här mallen visas - Dölj fontäneffekt för knappen Gilla - Fontäneffekten för knappen Gilla är dold - Fontäneffekten för knappen Gilla visas - Dölj knappen Gilla - Knappen Gilla är dold - Knappen Gilla visas - Dölj knappen Ogilla - Knappen Ogilla är dold - Knappen Ogilla visas - Dölj knappen Kommentarer - Knappen Kommentarer är dold - Knappen Kommentarer visas - - Dölj knappen Dela - Knappen Dela är dold - Knappen Dela visas - - Dölj knappen Remixa - Knappen Remixa är dold - Knappen Remixa visas - Dölj knappen Ljud - Knappen Ljud är dold - Knappen Ljud visas - Dölj infopanel - Infopanelen är dold - Infopanelen visas - Dölj kanalfält - Kanalfältet är dolt - Kanalfältet visas - Dölj videotitel - Videotiteln är dold - Videotiteln visas - Dölj metadataetikett för ljud - Metadataetikett för ljud är dold - Metadataetikett för ljud visas - Dölj etikett för videolänk - Etikett för videolänk är dold - Etikett för videolänk visas - Dölj navigeringsfältet - Navigeringsfältet är dolt - Navigeringsfältet visas - - - Dölj föreslagen video på slutskärmen - "Föreslagen video på slutskärmen döljs när automatisk uppspelning är avstängd + + Dölj Titta i VR + Menyn Titta i VR är dold + Menyn Titta i VR visas + Dölj videokvalitetsmeny + Menyn för videokvalitet är dold + Menyn för videokvalitet visas + Dölj sidfot på videokvalitetsmeny + Sidfoten på videokvalitetsmenyn är dold + Sidfoten på videokvalitetsmenyn visas + + + Dölj knappen för automatisk uppspelning + Knappen för automatisk uppspelning är dold + Knappen för automatisk uppspelning visas + + Dölj knappen Textning + Knappen Textning är dold + Knappen Textning visas + Dölj knappen Casta + Knappen Casta är dold + Knappen Casta visas + Dölj bakgrunder för uppspelningsknappar + Bakgrunder för uppspelningsknappar är dolda + Bakgrunder för uppspelningsknappar visas + Dölj knapparna Föregående och Nästa + Knapparna är dolda + Knapparna visas + + + Dölj slutskärmskort + Slutskärmskort är dolda + Slutskärmskort visas + + + Inaktivera Ambientljus i helskärm + Ambientljus är inaktiverat + Ambientljus är aktiverat + + + Dölj infokort + Infokort är dolda + Infokort visas + + + Inaktivera animationer med rullande siffror + Rullande siffror animeras inte + Rullande siffror animeras + + + Dölj sökreglaget i videospelaren + Sökreglaget i videospelaren är dolt + Sökreglaget i videospelaren visas + + Dölj sökreglaget i videominiatyrer + Sökreglaget i videominiatyrer är dolt + Sökreglaget i videominiatyrer visas + + + Shorts-spelare + Dölj eller visa komponenter i Shorts-spelaren + + Dölj Shorts-videor i hemflödet + Döljs i hemflödet och liknande videor + Visas i hemflödet och liknande videor + Dölj Shorts-videor i sökresultat + Döljs i sökresultat + Visas i sökresultat + + Dölj Shorts-videor i flödet Prenumerationer + Döljs i flödet Prenumerationer + Visas i flödet Prenumerationer + Dölj Shorts-videor i visningshistoriken + Döljs i visningshistoriken + Visas i visningshistoriken + Dölj etiketten \'Automatiskt dubbat\' + Etiketten för automatiskt dubbat är dold + Etiketten för automatiskt dubbat visas + Dölj knappen \'Köp Super Thanks\' + Knappen Köp Super Thanks är dold + Knappen Köp Super Thanks visas + Dölj effektknapp + Effektknappen är dold + Effektknappen visas + Dölj knappen \'Greenscreen\' + Knappen Greenscreen är dold + Knappen Greenscreen visas + Dölj hashtag-knapp + Hashtag-knappen är dold + Hashtag-knappen visas + + Dölj knappen Bli medlem + Knappen Bli medlem är dold + Knappen Bli medlem visas + Dölj liveförhandsgranskning + Direktförhandsgranskning är dold + Direktförhandsgranskning visas + Dölj platsetikett + Platsetiketten är dold + Platsetiketten visas + Dölj knappen \'Nya inlägg\' + Knappen Nya inlägg är dold + Knappen Nya inlägg visas + Dölj pausöverläggsknappar + Pausöverläggsknappar är dolda + Pausöverläggsknappar visas + Dölj förhandsvisad kommentar + Förhandsvisad kommentar är dold + Förhandsvisad kommentar visas + Dölj knappen \'Spara musik\' + Knappen Spara musik är dold + Knappen Spara musik visas + Dölj sökförslag + Sökförslag är dolda + Sökförslag visas + Dölj knappen Butik + Knappen Butik är dold + Knappen Butik visas + Dölj dekaler + Dekaler är dolda + Dekaler visas + Dölj knappen Prenumerera + Knappen Prenumerera är dold + Knappen Prenumerera visas + Dölj taggade produkter + Taggade produkter är dolda + Taggade produkter visas + Dölj knappen Kommande + Knappen Kommande är dold + Knappen Kommande visas + Dölj knappen \'Använd det här ljudet\' + Knappen Använd det här ljudet är dold + Knappen Använd det här ljudet visas + Dölj knappen \'Använd den här mallen\' + Knappen Använd den här mallen är dold + Knappen Använd den här mallen visas + Dölj fontäneffekt för knappen Gilla + Fontäneffekten för knappen Gilla är dold + Fontäneffekten för knappen Gilla visas + Dölj knappen Gilla + Knappen Gilla är dold + Knappen Gilla visas + Dölj knappen Ogilla + Knappen Ogilla är dold + Knappen Ogilla visas + Dölj knappen Kommentarer + Knappen Kommentarer är dold + Knappen Kommentarer visas + + Dölj knappen Dela + Knappen Dela är dold + Knappen Dela visas + + Dölj knappen Remixa + Knappen Remixa är dold + Knappen Remixa visas + Dölj knappen Ljud + Knappen Ljud är dold + Knappen Ljud visas + Dölj infopanel + Infopanelen är dold + Infopanelen visas + Dölj kanalfält + Kanalfältet är dolt + Kanalfältet visas + Dölj videotitel + Videotiteln är dold + Videotiteln visas + Dölj metadataetikett för ljud + Metadataetikett för ljud är dold + Metadataetikett för ljud visas + Dölj etikett för videolänk + Etikett för videolänk är dold + Etikett för videolänk visas + Dölj navigeringsfältet + Navigeringsfältet är dolt + Navigeringsfältet visas + + + Dölj föreslagen video på slutskärmen + "Föreslagen video på slutskärmen döljs när automatisk uppspelning är avstängd Automatisk uppspelning kan ändras i YouTube-inställningarna: Inställningar → Uppspelning → Spela upp nästa video automatiskt" - Föreslagen video på slutskärmen visas - - - Dölj överlägg för liknande videor - Överlägg för liknande videor i helskärm är dolt - Överlägg för liknande videor i helskärm visas - - - Dölj videotidsstämpel - Tidsstämpel är dold - Tidsstämpel visas - - - Dölj popup-paneler i spelaren - Popup-paneler i spelaren är dolda - Popup-paneler i spelaren visas - - - Avsluta helskärmsläge i slutet av videon - Inaktiverat - Stående - Liggande - Stående och liggande - - - Öppna videor i stående helskärmsläge - Videor öppnas i helskärm - Videor öppnas inte i helskärm - - - Spelaröverläggets opacitet - Opacitetsvärde mellan 0 och 100, där 0 är genomskinligt - Spelaröverläggets opacitet måste vara mellan 0 och 100 - - - - Ogilla-markeringar är inte tillgängliga just nu (API-tidsgräns nådd) - Ogilla-markeringar är inte tillgängliga (status %d) - Ogilla-markeringar är inte tillgängliga (API-gräns för klienten) - Ogilla-markeringar är inte tillgängliga (%s) - - Läs in video igen för att rösta med Return YouTube Dislike - - Dolda av ägaren - Ogilla-markeringar visas - Ogilla-markeringar visas inte - Visa ogilla-markeringar i Shorts - "Ogilla-markeringar visas i Shorts + Föreslagen video på slutskärmen visas + + + Dölj överlägg för liknande videor + Överlägg för liknande videor i helskärm är dolt + Överlägg för liknande videor i helskärm visas + + + Dölj videotidsstämpel + Tidsstämpel är dold + Tidsstämpel visas + + + Dölj popup-paneler i spelaren + Popup-paneler i spelaren är dolda + Popup-paneler i spelaren visas + + + Avsluta helskärmsläge i slutet av videon + Inaktiverat + Stående + Liggande + Stående och liggande + + + Öppna videor i stående helskärmsläge + Videor öppnas i helskärm + Videor öppnas inte i helskärm + + + Spelaröverläggets opacitet + Opacitetsvärde mellan 0 och 100, där 0 är genomskinligt + Spelaröverläggets opacitet måste vara mellan 0 och 100 + + + + Ogilla-markeringar är inte tillgängliga just nu (API-tidsgräns nådd) + Ogilla-markeringar är inte tillgängliga (status %d) + Ogilla-markeringar är inte tillgängliga (API-gräns för klienten) + Ogilla-markeringar är inte tillgängliga (%s) + + Läs in video igen för att rösta med Return YouTube Dislike + + Dolda av ägaren + Ogilla-markeringar visas + Ogilla-markeringar visas inte + Visa ogilla-markeringar i Shorts + "Ogilla-markeringar visas i Shorts Begränsning: Ogilla-markeringar kanske inte visas i inkognitoläge" - Ogilla-markeringar visas inte i Shorts - Ogilla-markeringar i procent - Ogilla-markeringar visas i procent - Ogilla-markeringar visas som ett tal - - Kompakt gilla-knapp - Gilla-knapp stylad för minsta bredd - Gilla-knapp stylad för bästa utseende - Visa uppskattade gilla-markeringar - Videor med inaktiverade gilla-markeringar visar ett uppskattat antal gilla-markeringar - Uppskattade gilla-markeringar visas inte - Visa ett popup-meddelande om API inte är tillgängligt - Popup-meddelande visas om Return YouTube Dislike inte är tillgängligt - Popup-meddelande visas inte om Return YouTube Dislike inte är tillgängligt - Data tillhandahålls av Return YouTube Dislike API. Tryck här för att läsa mer - - ReturnYouTubeDislike API-statistik för denna enhet - API-svarstid, genomsnittlig - API-svarstid, minsta - API-svarstid, längsta - API-svarstid, senaste videon - Ogilla-markeringar är för tillfället inte tillgängliga – API-frekvensgräns för klienten gäller - API-rösthämtning, antal anrop - Inga nätverksanrop har gjorts - %d nätverksanrop har gjorts - API-rösthämtning, antal gånger tidsgränsen har överskridits - Inga nätverksanrop har överskridit tidsgränsen - %d nätverksanrop har överskridit tidsgränsen - API-frekvensgränser för klienten - Inga frekvensgränser för klienten har påträffats - Frekvensgräns för klienten har påträffats %d gånger - %d millisekunder - - - Aktivera brett sökfält - Brett sökfält är aktiverat - Brett sökfält är inaktiverat - - - Aktivera miniatyrbilder av hög kvalitet - Sökreglageminiatyrer är av hög kvalitet - Sökreglageminiatyrer är av medelhög kvalitet - "Detta återställer även miniatyrer på livestreamar som inte har sökreglageminiatyrer. + Ogilla-markeringar visas inte i Shorts + Ogilla-markeringar i procent + Ogilla-markeringar visas i procent + Ogilla-markeringar visas som ett tal + + Kompakt gilla-knapp + Gilla-knapp stylad för minsta bredd + Gilla-knapp stylad för bästa utseende + Visa uppskattade gilla-markeringar + Videor med inaktiverade gilla-markeringar visar ett uppskattat antal gilla-markeringar + Uppskattade gilla-markeringar visas inte + Visa ett popup-meddelande om API inte är tillgängligt + Popup-meddelande visas om Return YouTube Dislike inte är tillgängligt + Popup-meddelande visas inte om Return YouTube Dislike inte är tillgängligt + Data tillhandahålls av Return YouTube Dislike API. Tryck här för att läsa mer + + ReturnYouTubeDislike API-statistik för denna enhet + API-svarstid, genomsnittlig + API-svarstid, minsta + API-svarstid, längsta + API-svarstid, senaste videon + Ogilla-markeringar är för tillfället inte tillgängliga – API-frekvensgräns för klienten gäller + API-rösthämtning, antal anrop + Inga nätverksanrop har gjorts + %d nätverksanrop har gjorts + API-rösthämtning, antal gånger tidsgränsen har överskridits + Inga nätverksanrop har överskridit tidsgränsen + %d nätverksanrop har överskridit tidsgränsen + API-frekvensgränser för klienten + Inga frekvensgränser för klienten har påträffats + Frekvensgräns för klienten har påträffats %d gånger + %d millisekunder + + + Aktivera brett sökfält + Brett sökfält är aktiverat + Brett sökfält är inaktiverat + + + Aktivera miniatyrbilder av hög kvalitet + Sökreglageminiatyrer är av hög kvalitet + Sökreglageminiatyrer är av medelhög kvalitet + "Detta återställer även miniatyrer på livestreamar som inte har sökreglageminiatyrer. Sökreglageminiatyrer kommer att använda samma kvalitet som den aktuella videon. Den här funktionen fungerar bäst med en videokvalitet på 720p eller lägre och när du använder en mycket snabb internetanslutning." - Återställ gamla sökreglageminiatyrer - Sökreglageminiatyrer visas ovanför sökreglaget - Sökreglageminiatyrer visas i helskärm - - - Aktivera SponsorBlock - SponsorBlock är ett crowdsourcing-baserat system för att hoppa över irriterande delar av YouTube-videor - Utseende - Visa röstningsknapp - Röstningsknappen för segment visas - Röstningsknappen för segment visas inte - Använd fyrkantig layout - Knappar och kontroller är fyrkantiga - Knappar och kontroller är rundade - - Använd kompakt överhoppningsknapp - Överhoppningsknapp stylad för minsta bredd - Överhoppningsknapp stylad för bästa utseende - Dölj Hoppa över-knappen automatiskt - Hoppa över-knappen döljs efter några sekunder - Hoppa över-knappen visas under hela segmentet - Varaktighet för överhoppningsknappar - Hur länge knapparna för att hoppa över och hoppa till höjdpunkten ska visas innan de döljs automatiskt - Visa popup-meddelande för att ångra överhoppning - Popup-meddelande visas när ett segment hoppas över automatiskt. Tryck på popup-meddelandet för att ångra överhoppningen - Popup-meddelande visas inte - Varaktighet för överhoppningsmeddelande - Hur länge popup-meddelandet för att ångra överhoppning ska visas - 1 sekund - 2 sekunder - 3 sekunder - 4 sekunder - 5 sekunder - 6 sekunder - 7 sekunder - 8 sekunder - 9 sekunder - 10 sekunder - Visa videons längd utan segment - Videolängden minus alla segment visas på sökreglaget - Hela videons längd visas - Skapa nya segment - Visa knappen Skapa nytt segment - Knappen Skapa nytt segment visas - Knappen Skapa nytt segment visas inte - Justera steg för nytt segment - Antal millisekunder som knapparna för tidsjustering flyttar tiden med när du skapar nya segment - Värdet måste vara ett positivt tal - Visa riktlinjer - Riktlinjerna innehåller regler och tips för att skapa nya segment - Följ riktlinjerna - Läs riktlinjerna för SponsorBlock innan du skapar nya segment - Redan läst - Visa mig - Allmänt - Visa ett popup-meddelande om API inte är tillgängligt - Popup-meddelande visas om SponsorBlock inte är tillgängligt - Popup-meddelande visas inte om SponsorBlock inte är tillgängligt - Aktivera spårning av antalet överhoppningar - Låter SponsorBlock-topplistan veta hur mycket tid som sparas. Ett meddelande skickas till topplistan varje gång ett segment hoppas över - Spårning av antalet överhoppningar är inte aktiverat - Minsta segmentlängd - Segment som är kortare än detta värde (i sekunder) kommer inte att visas eller hoppas över - Ogiltig tidslängd - Ditt privata användar-id - Detta bör hållas privat. Det fungerar som ett lösenord och ska inte delas med någon. Om någon får tag på det kan de utge sig för att vara du - Privat användar-id måste vara minst 30 tecken långt - Ändra API-webbadress - Adressen SponsorBlock använder för att göra anrop till servern - API-webbadress återställdes - API-webbadress är ogiltig - API-webbadress ändrades - Importera/exportera inställningar - Kopiera - Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar - Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar. Detta inkluderar ditt privata användar-id. Se till att dela detta klokt - Inställningar har importerats - Det gick inte att importera: %s - Det gick inte att exportera: %s - "Dina inställningar innehåller ett privat användar-id för SponsorBlock. + Återställ gamla sökreglageminiatyrer + Sökreglageminiatyrer visas ovanför sökreglaget + Sökreglageminiatyrer visas i helskärm + + + Aktivera SponsorBlock + SponsorBlock är ett crowdsourcing-baserat system för att hoppa över irriterande delar av YouTube-videor + Utseende + Visa röstningsknapp + Röstningsknappen för segment visas + Röstningsknappen för segment visas inte + Använd fyrkantig layout + Knappar och kontroller är fyrkantiga + Knappar och kontroller är rundade + + Använd kompakt överhoppningsknapp + Överhoppningsknapp stylad för minsta bredd + Överhoppningsknapp stylad för bästa utseende + Dölj Hoppa över-knappen automatiskt + Hoppa över-knappen döljs efter några sekunder + Hoppa över-knappen visas under hela segmentet + Varaktighet för överhoppningsknappar + Hur länge knapparna för att hoppa över och hoppa till höjdpunkten ska visas innan de döljs automatiskt + Visa popup-meddelande för att ångra överhoppning + Popup-meddelande visas när ett segment hoppas över automatiskt. Tryck på popup-meddelandet för att ångra överhoppningen + Popup-meddelande visas inte + Varaktighet för överhoppningsmeddelande + Hur länge popup-meddelandet för att ångra överhoppning ska visas + 1 sekund + 2 sekunder + 3 sekunder + 4 sekunder + 5 sekunder + 6 sekunder + 7 sekunder + 8 sekunder + 9 sekunder + 10 sekunder + Visa videons längd utan segment + Videolängden minus alla segment visas på sökreglaget + Hela videons längd visas + Skapa nya segment + Visa knappen Skapa nytt segment + Knappen Skapa nytt segment visas + Knappen Skapa nytt segment visas inte + Justera steg för nytt segment + Antal millisekunder som knapparna för tidsjustering flyttar tiden med när du skapar nya segment + Värdet måste vara ett positivt tal + Visa riktlinjer + Riktlinjerna innehåller regler och tips för att skapa nya segment + Följ riktlinjerna + Läs riktlinjerna för SponsorBlock innan du skapar nya segment + Redan läst + Visa mig + Allmänt + Visa ett popup-meddelande om API inte är tillgängligt + Popup-meddelande visas om SponsorBlock inte är tillgängligt + Popup-meddelande visas inte om SponsorBlock inte är tillgängligt + Aktivera spårning av antalet överhoppningar + Låter SponsorBlock-topplistan veta hur mycket tid som sparas. Ett meddelande skickas till topplistan varje gång ett segment hoppas över + Spårning av antalet överhoppningar är inte aktiverat + Minsta segmentlängd + Segment som är kortare än detta värde (i sekunder) kommer inte att visas eller hoppas över + Ogiltig tidslängd + Ditt privata användar-id + Detta bör hållas privat. Det fungerar som ett lösenord och ska inte delas med någon. Om någon får tag på det kan de utge sig för att vara du + Privat användar-id måste vara minst 30 tecken långt + Ändra API-webbadress + Adressen SponsorBlock använder för att göra anrop till servern + API-webbadress återställdes + API-webbadress är ogiltig + API-webbadress ändrades + Importera/exportera inställningar + Kopiera + Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar + Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar. Detta inkluderar ditt privata användar-id. Se till att dela detta klokt + Inställningar har importerats + Det gick inte att importera: %s + Det gick inte att exportera: %s + "Dina inställningar innehåller ett privat användar-id för SponsorBlock. Ditt användar-id är som ett lösenord och det bör aldrig delas." - Visa inte igen - Ändra beteende för segment - Betald marknadsföring, betalda hänvisningar och direktannonser. Inte för egenreklam eller gratis reklam för saker/kreatörer/webbplatser/produkter som de gillar - Obetald reklam/egenreklam - Som Sponsor men för obetald reklam eller egenreklam. Inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med - Interaktionspåminnelse (prenumerera) - En kort påminnelse om att gilla, prenumerera eller följa dem mitt i innehållet. Om det är långt eller om något specifikt, bör det istället räknas som egenreklam - Höjdpunkt - Den del av videon som de flesta letar efter - Uppehåll/introanimation - Ett intervall utan faktiskt innehåll. Kan vara en paus, statisk ram eller upprepande animation. Inkluderar inte övergångar som innehåller information - Slutkort/eftertexter - Eftertexter eller när YouTube-slutkorten visas. Inte för slutsatser med information - Hook/hälsningar - Trailrar med berättarröst för kommande video, hälsningar och avsked. Inkluderar inte avsnitt som tillför ytterligare innehåll - Förhandstitt/sammanfattning - Samling av klipp som visar vad som kommer eller vad som hände i videon eller i andra videor i en serie, där all information upprepas någon annanstans - Ämnesavvikelse/skämt - Ämnesavvikande scener eller skämt som inte krävs för att förstå videons huvudsakliga innehåll. Inkluderar inte avsnitt som tillhandahåller kontext eller bakgrundsinformation - Musik: Icke-musiksektion - Endast för användning i musikvideor. Sektioner av musikvideor utan musik, som inte redan omfattas av en annan kategori - Hoppa över - Höjdpunkt - Hoppa över sponsor - Hoppa över reklam - Hoppa över interagera - Hoppa till höjdpunkten - Hoppa över intro - Hoppa över uppehåll - Hoppa över uppehåll - Hoppa över outro - Hoppa över hook - Hoppa över förhandstitt - Hoppa över förhandstitt - Hoppa över sammanfattning - Hoppa över utfyllnad - Hoppa över icke-musik - Hoppa över segment - Hoppade över sponsor - Hoppade över egenreklam - Hoppade över irriterande påminnelse - Hoppade till höjdpunkten - Hoppade över intro - Hoppade över uppehåll - Hoppade över uppehåll - Hoppade över outro - Hoppade över hook - Hoppade över förhandstitt - Hoppade över förhandstitt - Hoppade över sammanfattning - Hoppade över utfyllnad - Hoppade över en icke-musiksektion - Hoppade över oinskickat segment - Hoppade över flera segment - Hoppa över automatiskt - Hoppa över automatiskt en gång - Visa en överhoppningsknapp - Visa i sökreglaget - Inaktivera - Det gick inte att skicka segment: %s - SponsorBlock är tillfälligt nere - Det gick inte att skicka segment (status: %1$d %2$s) - Det gick inte att skicka segment. Frekvensbegränsad (för många från samma användare eller IP) - Det går inte att skicka segmentet: %s - "Det går inte att skicka segmentet. + Visa inte igen + Ändra beteende för segment + Betald marknadsföring, betalda hänvisningar och direktannonser. Inte för egenreklam eller gratis reklam för saker/kreatörer/webbplatser/produkter som de gillar + Obetald reklam/egenreklam + Som Sponsor men för obetald reklam eller egenreklam. Inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med + Interaktionspåminnelse (prenumerera) + En kort påminnelse om att gilla, prenumerera eller följa dem mitt i innehållet. Om det är långt eller om något specifikt, bör det istället räknas som egenreklam + Höjdpunkt + Den del av videon som de flesta letar efter + Uppehåll/introanimation + Ett intervall utan faktiskt innehåll. Kan vara en paus, statisk ram eller upprepande animation. Inkluderar inte övergångar som innehåller information + Slutkort/eftertexter + Eftertexter eller när YouTube-slutkorten visas. Inte för slutsatser med information + Hook/hälsningar + Trailrar med berättarröst för kommande video, hälsningar och avsked. Inkluderar inte avsnitt som tillför ytterligare innehåll + Förhandstitt/sammanfattning + Samling av klipp som visar vad som kommer eller vad som hände i videon eller i andra videor i en serie, där all information upprepas någon annanstans + Ämnesavvikelse/skämt + Ämnesavvikande scener eller skämt som inte krävs för att förstå videons huvudsakliga innehåll. Inkluderar inte avsnitt som tillhandahåller kontext eller bakgrundsinformation + Musik: Icke-musiksektion + Endast för användning i musikvideor. Sektioner av musikvideor utan musik, som inte redan omfattas av en annan kategori + Hoppa över + Höjdpunkt + Hoppa över sponsor + Hoppa över reklam + Hoppa över interagera + Hoppa till höjdpunkten + Hoppa över intro + Hoppa över uppehåll + Hoppa över uppehåll + Hoppa över outro + Hoppa över hook + Hoppa över förhandstitt + Hoppa över förhandstitt + Hoppa över sammanfattning + Hoppa över utfyllnad + Hoppa över icke-musik + Hoppa över segment + Hoppade över sponsor + Hoppade över egenreklam + Hoppade över irriterande påminnelse + Hoppade till höjdpunkten + Hoppade över intro + Hoppade över uppehåll + Hoppade över uppehåll + Hoppade över outro + Hoppade över hook + Hoppade över förhandstitt + Hoppade över förhandstitt + Hoppade över sammanfattning + Hoppade över utfyllnad + Hoppade över en icke-musiksektion + Hoppade över oinskickat segment + Hoppade över flera segment + Hoppa över automatiskt + Hoppa över automatiskt en gång + Visa en överhoppningsknapp + Visa i sökreglaget + Inaktivera + Det gick inte att skicka segment: %s + SponsorBlock är tillfälligt nere + Det gick inte att skicka segment (status: %1$d %2$s) + Det gick inte att skicka segment. Frekvensbegränsad (för många från samma användare eller IP) + Det går inte att skicka segmentet: %s + "Det går inte att skicka segmentet. Finns redan" - Segmentet har skickats - - SponsorBlock är inte tillgängligt just nu (API-tidsgräns nådd) - SponsorBlock är inte tillgängligt just nu (status %d) - SponsorBlock är inte tillgängligt just nu - Det gick inte att rösta på segment (API-tidsgräns nådd) - Det gick inte att rösta på segment (status: %1$d %2$s) - Det gick inte att rösta på segment: %s - Upprösta - Nedrösta - Ändra kategori - Det finns inga segment att rösta på - - %1$s till %2$s - Välj kategorin för segmentet - Kategorin är inaktiverad i inställningarna. Aktivera kategorin för att skicka. - Nytt SponsorBlock-segment - Ange %s som starten eller slutet av ett nytt segment? - Slut - Nu - Tiden segmentet börjar vid - Tiden segmentet slutar vid - Är tiderna korrekta? - "Segmentet är från + Segmentet har skickats + + SponsorBlock är inte tillgängligt just nu (API-tidsgräns nådd) + SponsorBlock är inte tillgängligt just nu (status %d) + SponsorBlock är inte tillgängligt just nu + Det gick inte att rösta på segment (API-tidsgräns nådd) + Det gick inte att rösta på segment (status: %1$d %2$s) + Det gick inte att rösta på segment: %s + Upprösta + Nedrösta + Ändra kategori + Det finns inga segment att rösta på + + %1$s till %2$s + Välj kategorin för segmentet + Kategorin är inaktiverad i inställningarna. Aktivera kategorin för att skicka. + Nytt SponsorBlock-segment + Ange %s som starten eller slutet av ett nytt segment? + Slut + Nu + Tiden segmentet börjar vid + Tiden segmentet slutar vid + Är tiderna korrekta? + "Segmentet är från %1$s till @@ -1278,46 +1277,46 @@ till (%3$s) Redo att skicka in?" - Starten måste infalla före slutet - Markera två platser i tidsfältet först - Förhandsgranska segmentet och se till att det hoppar över smidigt - Redigera tid för segment manuellt - Vill du ändra tidpunkten för starten eller slutet av segmentet? - Ogiltig tid angiven - Statistik - - Statistik är för tillfället inte tillgänglig (API ligger nere) - Läser in ... - SponsorBlock är inaktiverad - Ditt användarnamn: <b>%s</b> - Tryck här för att ändra ditt användarnamn - Det gick inte att ändra användarnamn: Status: %1$d %2$s - Användarnamnet har ändrats - Ditt rykte är <b>%.2f</b> - Du har skapat <b>%s</b> segment - Tryck här för att visa dina segment - SponsorBlock-topplistan - Du har räddat personer från <b>%s</b> segment - Tryck här för att se den globala statistiken och de främsta bidragande användarna - Det är <b>%s</b> av deras liv.<br>Tryck här för att se topplistan - Du har hoppat över <b>%s</b> segment - Det är <b>%s</b> - Återställ räknaren för överhoppade segment? - %1$s timmar %2$s minuter - %1$s minuter %2$s sekunder - %s sekunder - Opacitet: - Färg: - Om - Data tillhandahålls av SponsorBlock API. Tryck här för att läsa mer och se nedladdningar för andra plattformar - - - Layoutformfaktor - Standard - Telefon - Surfplatta - Bil - "Ändringar inkluderar: + Starten måste infalla före slutet + Markera två platser i tidsfältet först + Förhandsgranska segmentet och se till att det hoppar över smidigt + Redigera tid för segment manuellt + Vill du ändra tidpunkten för starten eller slutet av segmentet? + Ogiltig tid angiven + Statistik + + Statistik är för tillfället inte tillgänglig (API ligger nere) + Läser in ... + SponsorBlock är inaktiverad + Ditt användarnamn: <b>%s</b> + Tryck här för att ändra ditt användarnamn + Det gick inte att ändra användarnamn: Status: %1$d %2$s + Användarnamnet har ändrats + Ditt rykte är <b>%.2f</b> + Du har skapat <b>%s</b> segment + Tryck här för att visa dina segment + SponsorBlock-topplistan + Du har räddat personer från <b>%s</b> segment + Tryck här för att se den globala statistiken och de främsta bidragande användarna + Det är <b>%s</b> av deras liv.<br>Tryck här för att se topplistan + Du har hoppat över <b>%s</b> segment + Det är <b>%s</b> + Återställ räknaren för överhoppade segment? + %1$s timmar %2$s minuter + %1$s minuter %2$s sekunder + %s sekunder + Opacitet: + Färg: + Om + Data tillhandahålls av SponsorBlock API. Tryck här för att läsa mer och se nedladdningar för andra plattformar + + + Layoutformfaktor + Standard + Telefon + Surfplatta + Bil + "Ändringar inkluderar: Layout för surfplattor • Community-inlägg döljs @@ -1325,305 +1324,303 @@ Layout för surfplattor Billayout • Shorts-videor öppnas i vanliga spelaren • Flödet ordnas efter ämnen och kanaler" - - - Förfalska appversionen - Versionen är förfalskad - Versionen är inte förfalskad - "Appversionen kommer att förfalskas till en äldre version av YouTube. + + + Förfalska appversionen + Versionen är förfalskad + Versionen är inte förfalskad + "Appversionen kommer att förfalskas till en äldre version av YouTube. Detta kommer att ändra utseendet och funktionerna i appen, men okända bieffekter kan uppstå. Om du senare inaktiverar det rekommenderar vi att rensa appens data för att förhindra fel i användargränssnittet." - Mål för Förfalska appversionen - 20.13.41 – Återställ icke-komprimerat åtgärdsfält för video - 20.05.46 – Återställ funktionalitet för transkription - 19.35.36 – Återställ gamla ikoner i Shorts-spelaren - 19.01.34 – Återställ gamla navigeringsikoner - - - Byt startsida - Standard - Alla prenumerationer - Bläddra bland kanaler - Kurser/lärande - Utforska - Mode och skönhet - Historik - Bibliotek - Videor du gillat - Filmer - Musik - Nyheter - Aviseringar - Spellistor - Sök - Sport - Prenumerationer - Populärt - Virtuell verklighet - Titta senare - Dina klipp - Byt alltid startsida - "Startsidan byts alltid + Mål för Förfalska appversionen + 20.13.41 – Återställ icke-komprimerat åtgärdsfält för video + 20.05.46 – Återställ funktionalitet för transkription + 19.35.36 – Återställ gamla ikoner i Shorts-spelaren + 19.01.34 – Återställ gamla navigeringsikoner + + + Byt startsida + Standard + Alla prenumerationer + Bläddra bland kanaler + Kurser/lärande + Utforska + Mode och skönhet + Historik + Bibliotek + Videor du gillat + Filmer + Musik + Nyheter + Aviseringar + Spellistor + Sök + Sport + Prenumerationer + Populärt + Virtuell verklighet + Titta senare + Dina klipp + Byt alltid startsida + "Startsidan byts alltid Begränsning: Bakåtknappen i verktygsfältet kanske inte fungerar" - Startsidan byts endast vid appstart - - - Inaktivera att Shorts-spelaren återupptas - Shorts-spelaren återupptas inte vid appstart - Shorts-spelaren återupptas vid appstart - - - Öppna Shorts-videor med - Shorts-spelare - Vanlig spelare - Vanlig spelare i helskärm - - - Spela upp Shorts-videor automatiskt - Shorts-videor spelas upp automatiskt - Shorts-videor upprepas - Automatisk uppspelning av Shorts-videor i bakgrunden - Shorts-videor spelas upp automatiskt i bakgrunden - Shorts-videor upprepas i bakgrunden - - - Minispelare - Ändra stilen på den minimerade spelaren i appen - Minispelartyp - Inaktiverad - Standard - Surfplatta - Inaktivera rundade hörn - Hörnen är fyrkantiga - Hörnen är rundade - Aktivera dubbeltryck och nyp för att ändra storlek - "Dubbeltrycksåtgärd och nyp för att ändra storlek är aktiverat + Startsidan byts endast vid appstart + + + Inaktivera att Shorts-spelaren återupptas + Shorts-spelaren återupptas inte vid appstart + Shorts-spelaren återupptas vid appstart + + + Öppna Shorts-videor med + Shorts-spelare + Vanlig spelare + Vanlig spelare i helskärm + + + Spela upp Shorts-videor automatiskt + Shorts-videor spelas upp automatiskt + Shorts-videor upprepas + Automatisk uppspelning av Shorts-videor i bakgrunden + Shorts-videor spelas upp automatiskt i bakgrunden + Shorts-videor upprepas i bakgrunden + + + Minispelare + Ändra stilen på den minimerade spelaren i appen + Minispelartyp + Inaktiverad + Standard + Surfplatta + Inaktivera rundade hörn + Hörnen är fyrkantiga + Hörnen är rundade + Aktivera dubbeltryck och nyp för att ändra storlek + "Dubbeltrycksåtgärd och nyp för att ändra storlek är aktiverat • Tryck snabbt två gånger för att öka minispelarens storlek • Tryck snabbt två gånger igen för att återställa den ursprungliga storleken" - Dubbeltrycksåtgärd och nyp för att ändra storlek är inaktiverat - Inaktivera dra och släpp - Dra och släpp är inaktiverat - "Dra och släpp är aktiverat + Dubbeltrycksåtgärd och nyp för att ändra storlek är inaktiverat + Inaktivera dra och släpp + Dra och släpp är inaktiverat + "Dra och släpp är aktiverat Minispelaren kan dras till valfritt hörn av skärmen" - Inaktivera horisontell draggest - Horisontell draggest är inaktiverad - "Horisontell draggest är aktiverad + Inaktivera horisontell draggest + Horisontell draggest är inaktiverad + "Horisontell draggest är aktiverad Minispelaren kan dras utanför skärmen till vänster eller höger" - Dölj överläggsknappar - Överläggsknapparna är dolda - Överläggsknapparna visas - Dölj undertexter - Undertexter är dolda - Undertexter visas - Dölj knapparna för att hoppa framåt och bakåt - Hoppa framåt och bakåt är dolda - Hoppa framåt och bakåt visas - Ursprunglig storlek - Ursprunglig storlek på skärmen, i pixlar - Pixelstorlek måste vara mellan %1$s och %2$s - Överläggets opacitet - Opacitetsvärde mellan 0 och 100, där 0 är genomskinligt - Minispelaröverläggets opacitet måste vara mellan 0 och 100 - - - Aktivera tonad inläsningsskärm - Inläsningsskärmen kommer att ha en tonad bakgrund - Inläsningsskärmen kommer att ha en enfärgad bakgrund - Välkomstskärmens stil - Färg - Svartvit - Aktivera anpassad färg på sökreglaget - Sökreglagets anpassade färg visas - Sökreglagets ursprungliga färg visas - Anpassad färg på sökreglaget - Färgen på sökreglaget - Anpassad accentfärg på sökreglaget - Accentfärgen på sökreglaget - Ogiltigt färgvärde för sökreglaget - - - - - Logotyp i sidhuvudet - Standard - Vanlig - - ReVanced minimalistisk - Anpassad - - - Kringgå regionsbegränsningar för bilder - Använder bildvärden yt4.ggpht.com - "Använder ursprunglig bildvärd + Dölj överläggsknappar + Överläggsknapparna är dolda + Överläggsknapparna visas + Dölj undertexter + Undertexter är dolda + Undertexter visas + Dölj knapparna för att hoppa framåt och bakåt + Hoppa framåt och bakåt är dolda + Hoppa framåt och bakåt visas + Ursprunglig storlek + Ursprunglig storlek på skärmen, i pixlar + Pixelstorlek måste vara mellan %1$s och %2$s + Överläggets opacitet + Opacitetsvärde mellan 0 och 100, där 0 är genomskinligt + Minispelaröverläggets opacitet måste vara mellan 0 och 100 + + + Aktivera tonad inläsningsskärm + Inläsningsskärmen kommer att ha en tonad bakgrund + Inläsningsskärmen kommer att ha en enfärgad bakgrund + Välkomstskärmens stil + Färg + Svartvit + Aktivera anpassad färg på sökreglaget + Sökreglagets anpassade färg visas + Sökreglagets ursprungliga färg visas + Anpassad färg på sökreglaget + Färgen på sökreglaget + Anpassad accentfärg på sökreglaget + Accentfärgen på sökreglaget + Ogiltigt färgvärde för sökreglaget + + + + Logotyp i sidhuvudet + Standard + Vanlig + + ReVanced minimalistisk + Anpassad + + + Kringgå regionsbegränsningar för bilder + Använder bildvärden yt4.ggpht.com + "Använder ursprunglig bildvärd Om du aktiverar detta kan det åtgärda saknade bilder som blockeras i vissa regioner" - - - - Fliken Hem - - Fliken Prenumerationer - - Fliken Ditt YouTube - Spellistor och rekommendationer i spelaren - Sökresultat - Ursprungliga miniatyrer - DeArrow och ursprungliga miniatyrer - DeArrow och stillbilder - Stillbilder - "DeArrow tillhandahåller crowdsourcing-baserade miniatyrbilder för YouTube-videor. Dessa miniatyrbilder är ofta mer relevanta än de som tillhandahålls av YouTube + + + + Fliken Hem + + Fliken Prenumerationer + + Fliken Ditt YouTube + Spellistor och rekommendationer i spelaren + Sökresultat + Ursprungliga miniatyrer + DeArrow och ursprungliga miniatyrer + DeArrow och stillbilder + Stillbilder + "DeArrow tillhandahåller crowdsourcing-baserade miniatyrbilder för YouTube-videor. Dessa miniatyrbilder är ofta mer relevanta än de som tillhandahålls av YouTube Om detta aktiveras skickas videoadresser till API-servern och inga andra data skickas. Om en video inte har DeArrow-miniatyrer visas den ursprungliga bilden eller stillbilder Tryck här för att läsa mer om DeArrow" - Visa ett popup-meddelande om API inte är tillgängligt - Popup-meddelande visas om DeArrow inte är tillgängligt - Popup-meddelande visas inte om DeArrow inte är tillgängligt - API-slutpunkt för DeArrow - DeArrow-miniatyrcachens slutpunktsadress - Stillbilder från videor - Stillbilder tas från början/mitten/slutet av varje video. Dessa bilder är inbyggda i YouTube och inget externt API används - Använd snabba stillbilder - Använder stillbilder av medelhög kvalitet. Miniatyrer kommer att läsas in snabbare, men livestreamar, videor som inte har släppts eller mycket gamla videor kan visa tomma miniatyrer - Använder stillbilder av hög kvalitet - Videotid som stillbilder tas från - Början av videon - Mitten av video - Slutet av videon - - DeArrow är inte tillgängligt just nu (statuskod: %s) - DeArrow är inte tillgängligt just nu - - - Visa ReVanced-meddelanden - Meddelanden vid start visas - Meddelanden vid start visas inte - Visa notiser vid start - Det gick inte att ansluta till meddelandeleverantören - Avfärda - - - Aktivera videoslinga - Slinga skapas för videon - Slinga skapas inte för videon - - - Visa knapp för videoslinga - Knappen visas - Knappen visas inte - Videoslinga är aktiverat - Videoslinga är inaktiverat - - - - - Förfalska enhetens mått - "Enhetens mått förfalskas + Visa ett popup-meddelande om API inte är tillgängligt + Popup-meddelande visas om DeArrow inte är tillgängligt + Popup-meddelande visas inte om DeArrow inte är tillgängligt + API-slutpunkt för DeArrow + DeArrow-miniatyrcachens slutpunktsadress + Stillbilder från videor + Stillbilder tas från början/mitten/slutet av varje video. Dessa bilder är inbyggda i YouTube och inget externt API används + Använd snabba stillbilder + Använder stillbilder av medelhög kvalitet. Miniatyrer kommer att läsas in snabbare, men livestreamar, videor som inte har släppts eller mycket gamla videor kan visa tomma miniatyrer + Använder stillbilder av hög kvalitet + Videotid som stillbilder tas från + Början av videon + Mitten av video + Slutet av videon + + DeArrow är inte tillgängligt just nu (statuskod: %s) + DeArrow är inte tillgängligt just nu + + + Visa ReVanced-meddelanden + Meddelanden vid start visas + Meddelanden vid start visas inte + Visa notiser vid start + Det gick inte att ansluta till meddelandeleverantören + Avfärda + + + Aktivera videoslinga + Slinga skapas för videon + Slinga skapas inte för videon + + + Visa knapp för videoslinga + Knappen visas + Knappen visas inte + Videoslinga är aktiverat + Videoslinga är inaktiverat + + + + Förfalska enhetens mått + "Enhetens mått förfalskas Högre videokvaliteter kan låsas upp men du kan uppleva hackig videouppspelning, sämre batteritid och okända bieffekter" - "Enhetens mått förfalskas inte + "Enhetens mått förfalskas inte Om du aktiverar detta kan högre videokvaliteter låsas upp" - Om du aktiverar detta kan det leda till hackig videouppspelning, sämre batteritid och okända biverkningar. - - - Haptisk återkoppling - Ändra haptisk återkoppling - Inaktivera haptik för kapitel - Haptik för kapitel är inaktiverad - Haptik för kapitel är aktiverad - Inaktivera haptik för exakt sökning - Haptik för exakt sökning är inaktiverad - Haptik för exakt sökning är aktiverad - Inaktivera haptik för att ångra sökning - Haptik för att ångra sökning är inaktiverad - Haptik för att ångra sökning är aktiverad - Inaktivera zoomhaptik - Zoomhaptik är inaktiverad - Zoomhaptik är aktiverad - - - Om du nyligen har ändrat dina inloggningsuppgifter, avinstallera och installera om MicroG. - - - Hoppa över webbadressomdirigeringar - Webbadressomdirigeringar hoppas över - Webbadressomdirigeringar hoppas inte över - - - Öppna länkar i webbläsaren - Öppnar länkar i extern webbläsare - Öppnar länkar i webbläsaren i appen - - - - Automatiskt - Kom ihåg ändringar av videokvalitet - Kvalitetsändringar gäller alla videor - Kvalitetsändringar gäller endast den aktuella videon - Visa ett popup-meddelande när videokvaliteten ändras - Ett popup-meddelande visas när standardvideokvaliteten ändras - Ett popup-meddelande visas inte när standardvideokvaliteten ändras - Standardvideokvalitet på Wi-Fi-nätverk - Standardvideokvalitet på mobilnätverk - Kom ihåg kvalitetsändringar för Shorts-videor - Kvalitetsändringar gäller alla Shorts-videor - Kvalitetsändringar gäller endast den aktuella Shorts-videon - Standardkvalitet för Shorts-videor på Wi-Fi-nätverk - Standardkvalitet för Shorts-videor på mobilnätverk - mobil - Ändrade standardkvalitet för %1$s till: %2$s - Ändrade Shorts-videokvalitet för %1$s till: %2$s - - - Visa knapp för hastighetsdialogruta - Knappen för hastighetsdialog visas. Tryck länge för att återställa uppspelningshastigheten till standardhastigheten - Knappen för hastighetsdialog visas inte - - - Visa videokvalitetsknapp - Knappen för videokvalitet visas. Tryck länge för att återställa kvaliteten till standardkvaliteten - Knappen för videokvalitet visas inte - - - Anpassad meny för uppspelningshastighet - Anpassad hastighetsmeny visas - Anpassad hastighetsmeny visas inte - Återställ gammal uppspelningshastighetsmeny - Den gamla hastighetsmenyn visas - Den moderna hastighetsmenyn visas - Anpassade uppspelningshastigheter - Lägg till eller ändra de anpassade uppspelningshastigheterna - Anpassade hastigheter måste vara mindre än %s - Ogiltiga anpassade uppspelningshastigheter - Automatiskt - Anpassad hastighet för att trycka länge - Uppspelningshastighet mellan 0 och 8 - - - Kom ihåg ändringar av uppspelningshastigheten - Ändring av uppspelningshastighet gäller för alla videor - Ändring av uppspelningshastighet gäller endast för den aktuella videon - Visa ett popup-meddelande när du ändrar uppspelningshastigheten - Ett popup-meddelande visas när standarduppspelningshastigheten ändras - Ett popup-meddelande visas inte när standarduppspelningshastigheten ändras - Standarduppspelningshastighet - Ändrade standardhastigheten till: %s - - - Inaktivera HDR-video - HDR-video är inaktiverat - HDR-video är aktiverat - Tvinga AVC (H.264) - Videokodek tvingas till AVC (H.264) - Videokodek bestäms automatiskt - "Fördelar: + Om du aktiverar detta kan det leda till hackig videouppspelning, sämre batteritid och okända biverkningar. + + + Haptisk återkoppling + Ändra haptisk återkoppling + Inaktivera haptik för kapitel + Haptik för kapitel är inaktiverad + Haptik för kapitel är aktiverad + Inaktivera haptik för exakt sökning + Haptik för exakt sökning är inaktiverad + Haptik för exakt sökning är aktiverad + Inaktivera haptik för att ångra sökning + Haptik för att ångra sökning är inaktiverad + Haptik för att ångra sökning är aktiverad + Inaktivera zoomhaptik + Zoomhaptik är inaktiverad + Zoomhaptik är aktiverad + + + Om du nyligen har ändrat dina inloggningsuppgifter, avinstallera och installera om MicroG. + + + Hoppa över webbadressomdirigeringar + Webbadressomdirigeringar hoppas över + Webbadressomdirigeringar hoppas inte över + + + Öppna länkar i webbläsaren + Öppnar länkar i extern webbläsare + Öppnar länkar i webbläsaren i appen + + + + Automatiskt + Kom ihåg ändringar av videokvalitet + Kvalitetsändringar gäller alla videor + Kvalitetsändringar gäller endast den aktuella videon + Visa ett popup-meddelande när videokvaliteten ändras + Ett popup-meddelande visas när standardvideokvaliteten ändras + Ett popup-meddelande visas inte när standardvideokvaliteten ändras + Standardvideokvalitet på Wi-Fi-nätverk + Standardvideokvalitet på mobilnätverk + Kom ihåg kvalitetsändringar för Shorts-videor + Kvalitetsändringar gäller alla Shorts-videor + Kvalitetsändringar gäller endast den aktuella Shorts-videon + Standardkvalitet för Shorts-videor på Wi-Fi-nätverk + Standardkvalitet för Shorts-videor på mobilnätverk + mobil + Ändrade standardkvalitet för %1$s till: %2$s + Ändrade Shorts-videokvalitet för %1$s till: %2$s + + + Visa knapp för hastighetsdialogruta + Knappen för hastighetsdialog visas. Tryck länge för att återställa uppspelningshastigheten till standardhastigheten + Knappen för hastighetsdialog visas inte + + + Visa videokvalitetsknapp + Knappen för videokvalitet visas. Tryck länge för att återställa kvaliteten till standardkvaliteten + Knappen för videokvalitet visas inte + + + Anpassad meny för uppspelningshastighet + Anpassad hastighetsmeny visas + Anpassad hastighetsmeny visas inte + Återställ gammal uppspelningshastighetsmeny + Den gamla hastighetsmenyn visas + Den moderna hastighetsmenyn visas + Anpassade uppspelningshastigheter + Lägg till eller ändra de anpassade uppspelningshastigheterna + Anpassade hastigheter måste vara mindre än %s + Ogiltiga anpassade uppspelningshastigheter + Automatiskt + Anpassad hastighet för att trycka länge + Uppspelningshastighet mellan 0 och 8 + + + Kom ihåg ändringar av uppspelningshastigheten + Ändring av uppspelningshastighet gäller för alla videor + Ändring av uppspelningshastighet gäller endast för den aktuella videon + Visa ett popup-meddelande när du ändrar uppspelningshastigheten + Ett popup-meddelande visas när standarduppspelningshastigheten ändras + Ett popup-meddelande visas inte när standarduppspelningshastigheten ändras + Standarduppspelningshastighet + Ändrade standardhastigheten till: %s + + + Inaktivera HDR-video + HDR-video är inaktiverat + HDR-video är aktiverat + Tvinga AVC (H.264) + Videokodek tvingas till AVC (H.264) + Videokodek bestäms automatiskt + "Fördelar: • Kan förbättra batteritiden • Kan återställa saknade videoupplösningar på äldre enheter @@ -1632,179 +1629,178 @@ Begränsningar: • Videouppspelning använder mer internetdata än VP9 eller AV1 • HDR-videor använder inte AVC • Vissa enheter kan inte tvinga AVC" - - - Visa avancerad videokvalitetsmeny - Avancerad videokvalitetsmeny visas - Avancerad videokvalitetsmeny visas inte - - - Aktivera Dra för att söka - Dra för att söka är aktiverat - Dra för att söka är inaktiverat - - - Tillåt Android VR AV1 - "Videokodeken är AVC (H.264), VP9 eller AV1 + + + Visa avancerad videokvalitetsmeny + Avancerad videokvalitetsmeny visas + Avancerad videokvalitetsmeny visas inte + + + Aktivera Dra för att söka + Dra för att söka är aktiverat + Dra för att söka är inaktiverat + + + Tillåt Android VR AV1 + "Videokodeken är AVC (H.264), VP9 eller AV1 Uppspelningen kan hacka eller tappa bildrutor" - Videokodeken är AVC (H.264) eller VP9 - "Aktivering av denna inställning kan använda programvarubaserad AV1-avkodning. + Videokodeken är AVC (H.264) eller VP9 + "Aktivering av denna inställning kan använda programvarubaserad AV1-avkodning. Videouppspelning med AV1 kan hacka eller tappa bildrutor." - Bieffekter av förfalskning - • Experimentell klient och kan sluta fungera när som helst - • Videor kan stanna vid 1:00 eller kanske inte är tillgängliga i vissa regioner - • Menyn Ljudspår saknas - • Ingen AV1-videokodek - • Stabil volym är inte tillgängligt - • Videor för barn kanske inte spelas upp när du är utloggad eller i inkognitoläge - - • Tvinga ursprungligt ljud är inte tillgängligt - Visa i Statistik för nördar - Klienttypen visas i Statistik för nördar - Klienten är dold i Statistik för nördar - - - - - - - Om - Annonser - Allmänt - Spelare - Övrigt - - - Dölj videoannonser - Videoannonser är dolda - Videoannonser visas - - - Aktivera permanent upprepning - Permanent upprepning är aktiverad - Permanent upprepning är inaktiverad - - - Dölj knappen Casta - Knappen Casta är dold - Knappen Casta visas - Dölj historikknappen - Historikknappen är dold - Historikknappen visas - Dölj aviseringsknappen - Aviseringsknappen är dold - Aviseringsknappen visas - Dölj sökknappen - Sökknappen är dold - Sökknappen visas - - - Dölj kategorifält - Kategorifältet är dolt - Kategorifältet visas - - - Ändra minispelarens färg - Minispelarens färg matchar helskärmsspelaren - Minispelaren använder standardfärg - - - Navigeringsfält - Dölj eller ändra knappar i navigeringsfältet - - Dölj Hem - Knappen Hem är dold - Knappen Hem visas - - Dölj Samples - Knappen Samples är dold - Knappen Samples visas - - Dölj Utforska - Knappen Utforska är dold - Knappen Utforska visas - - Dölj Bibliotek - Knappen Bibliotek är dold - Knappen Bibliotek visas - - Dölj Uppgradera - Knappen Uppgradera är dold - Knappen Uppgradera visas - Dölj navigeringsfältet - Navigeringsfältet är dolt - Navigeringsfältet visas - Dölj etiketter för navigeringsknappar - Etiketter är dolda - Etiketter visas - - - Dölj etiketten \"Skaffa Music Premium\" - Etiketten är dold - Etiketten visas - - - Dölj uppgraderingsknappen - Knappen är dold - Knappen visas - - - - - Blockera ljudannonser - Ljudannonser är blockerade - Ljudannonser är inte blockerade - - - %s är inte tillgänglig, annonser kan visas. Försök att ändra annonsblockeringstjänsten i inställningarna. - %s returnerade ett fel, annonser kan visas. Försök att ändra annonsblockeringstjänsten i inställningarna. - Blockera inbäddade videoannonser - Inaktiverad - Luminous-proxy - PurpleAdBlock-proxy - - - Blockera videoannonser - Videoannonser är blockerade - Videoannonser är inte blockerade - - - Meddelande borttaget - Visa borttagna meddelanden - Visa inte borttagna meddelanden - Dölj borttagna meddelanden bakom en spoiler - Visa borttagna meddelanden som överstruken text - - - Hämta kanalpoäng automatiskt - Kanalpoäng hämtas automatiskt - Kanalpoäng hämtas inte automatiskt - - - - Aktivera felsökningsläge för Twitch - Felsökningsläget på Twitch är aktiverat (rekommenderas inte) - Twitch-felsökningsläget är inaktiverat - - - ReVanced-inställningar - Om - Om ReVanced - Annonsblockering - Inställningar för annonsblockering - Chatt - Chattinställningar - Övrigt - Övriga inställningar - Allmänna inställningar - Andra inställningar - Annonser på klientsidan - Server-side surestream annonser - Felsökningsloggning - Felsökningsloggar är aktiverade - Felsökningsloggar är inaktiverade - - + Bieffekter av förfalskning + • Experimentell klient och kan sluta fungera när som helst + • Videor kan stanna vid 1:00 eller kanske inte är tillgängliga i vissa regioner + • Menyn Ljudspår saknas + • Ingen AV1-videokodek + • Stabil volym är inte tillgängligt + • Videor för barn kanske inte spelas upp när du är utloggad eller i inkognitoläge + + • Tvinga ursprungligt ljud är inte tillgängligt + Visa i Statistik för nördar + Klienttypen visas i Statistik för nördar + Klienten är dold i Statistik för nördar + + + + + + Om + Annonser + Allmänt + Spelare + Övrigt + + + Dölj videoannonser + Videoannonser är dolda + Videoannonser visas + + + Aktivera permanent upprepning + Permanent upprepning är aktiverad + Permanent upprepning är inaktiverad + + + Dölj knappen Casta + Knappen Casta är dold + Knappen Casta visas + Dölj historikknappen + Historikknappen är dold + Historikknappen visas + Dölj aviseringsknappen + Aviseringsknappen är dold + Aviseringsknappen visas + Dölj sökknappen + Sökknappen är dold + Sökknappen visas + + + Dölj kategorifält + Kategorifältet är dolt + Kategorifältet visas + + + Ändra minispelarens färg + Minispelarens färg matchar helskärmsspelaren + Minispelaren använder standardfärg + + + Navigeringsfält + Dölj eller ändra knappar i navigeringsfältet + + Dölj Hem + Knappen Hem är dold + Knappen Hem visas + + Dölj Samples + Knappen Samples är dold + Knappen Samples visas + + Dölj Utforska + Knappen Utforska är dold + Knappen Utforska visas + + Dölj Bibliotek + Knappen Bibliotek är dold + Knappen Bibliotek visas + + Dölj Uppgradera + Knappen Uppgradera är dold + Knappen Uppgradera visas + Dölj navigeringsfältet + Navigeringsfältet är dolt + Navigeringsfältet visas + Dölj etiketter för navigeringsknappar + Etiketter är dolda + Etiketter visas + + + Dölj etiketten \"Skaffa Music Premium\" + Etiketten är dold + Etiketten visas + + + Dölj uppgraderingsknappen + Knappen är dold + Knappen visas + + + + + Blockera ljudannonser + Ljudannonser är blockerade + Ljudannonser är inte blockerade + + + %s är inte tillgänglig, annonser kan visas. Försök att ändra annonsblockeringstjänsten i inställningarna. + %s returnerade ett fel, annonser kan visas. Försök att ändra annonsblockeringstjänsten i inställningarna. + Blockera inbäddade videoannonser + Inaktiverad + Luminous-proxy + PurpleAdBlock-proxy + + + Blockera videoannonser + Videoannonser är blockerade + Videoannonser är inte blockerade + + + Meddelande borttaget + Visa borttagna meddelanden + Visa inte borttagna meddelanden + Dölj borttagna meddelanden bakom en spoiler + Visa borttagna meddelanden som överstruken text + + + Hämta kanalpoäng automatiskt + Kanalpoäng hämtas automatiskt + Kanalpoäng hämtas inte automatiskt + + + + Aktivera felsökningsläge för Twitch + Felsökningsläget på Twitch är aktiverat (rekommenderas inte) + Twitch-felsökningsläget är inaktiverat + + + ReVanced-inställningar + Om + Om ReVanced + Annonsblockering + Inställningar för annonsblockering + Chatt + Chattinställningar + Övrigt + Övriga inställningar + Allmänna inställningar + Andra inställningar + Annonser på klientsidan + Server-side surestream annonser + Felsökningsloggning + Felsökningsloggar är aktiverade + Felsökningsloggar är inaktiverade + + diff --git a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml +++ b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-te-rIN/strings.xml b/patches/src/main/resources/addresources/values-te-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-te-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-te-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index ea85a930a3..9dbda5bb97 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - ชื่อแอป - - กำหนดเอง - ไอคอนแอป - ต้นฉบับ - - ReVanced เรียบง่าย - ReVanced ปรับขนาด - - กำหนดเอง - - - การตรวจสอบล้มเหลว - เปิดเว็บไซต์อย่างเป็นทางการ - ละเว้น - <h5>แอปนี้ดูเหมือนจะไม่ได้รับการแก้ไขโดยคุณ</h5><br>แอปนี้อาจทำงานไม่ถูกต้อง <b>อาจเป็นอันตรายหรือแม้กระทั่งอันตรายในการใช้</b>.<br><br>การตรวจสอบเหล่านี้บ่งบอกว่าแอปนี้ได้รับการแก้ไขล่วงหน้าหรือได้รับมาจากบุคคลอื่น: <br><br><small>%1$s</small><br>ขอแนะนำอย่างยิ่งให้ <b>ถอนการติดตั้งแอปนี้และแก้ไขด้วยตัวเอง</b> เพื่อให้แน่ใจว่าคุณกำลังใช้แอปที่ได้รับการตรวจสอบและปลอดภัย<p><br>หากไม่สนใจ คำเตือนนี้จะแสดงเพียงสองครั้งเท่านั้น - แก้ไขบนอุปกรณ์อื่น - ไม่ได้ติดตั้งโดย ReVanced Manager - แก้ไขเมื่อมากกว่า 10 นาทีที่แล้ว - แก้ไขเมื่อ %s วันที่แล้ว - วันที่สร้าง APK เสียหาย - - - ประกาศ ReVanced - ประวัติการรับชมของคุณไม่ได้ถูกบันทึก<br><br>สาเหตุที่เป็นไปได้มากที่สุดคือตัวบล็อกโฆษณา DNS หรือพร็อกซีเครือข่าย<br><br>เพื่อแก้ไขปัญหานี้ ให้เพิ่ม <b>s.youtube.com</b> ในรายการที่อนุญาต หรือปิดตัวบล็อกโฆษณา DNS และพร็อกซีทั้งหมด - อย่าแสดงอีก - - - การตั้งค่า - คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ - บันทึก - รีเซ็ต - รีเซ็ตสี - สีไม่ถูกต้อง - ต้องรีสตาร์ท - รีสตาร์ทแอปเพื่อให้การเปลี่ยนแปลงนี้มีผล - เริ่มต้นใหม่ - นำเข้า - คัดลอก - การตั้งค่า ReVanced ถูกตั้งค่าเป็นค่าเริ่มต้น - นำเข้าการตั้งค่า %d - การนำเข้าล้มเหลว: %s - ค้นหาในการตั้งค่า - ไม่พบผลลัพธ์สำหรับ \",%s\" - ลองใช้คำหลักอื่น - การค้นหาล่าสุด - นำออกจากประวัติการค้นหาใช่ไหม - ล้างประวัติการค้นหา - คุณแน่ใจหรือไม่ว่าต้องการล้างประวัติการค้นหาทั้งหมด - เคล็ดลับการค้นหา - "• แตะเส้นทางเพื่อไปยังเส้นทางนั้น +--> + + + ชื่อแอป + + กำหนดเอง + ไอคอนแอป + ต้นฉบับ + + ReVanced เรียบง่าย + ReVanced ปรับขนาด + + กำหนดเอง + + + การตรวจสอบล้มเหลว + เปิดเว็บไซต์อย่างเป็นทางการ + ละเว้น + <h5>แอปนี้ดูเหมือนจะไม่ได้รับการแก้ไขโดยคุณ</h5><br>แอปนี้อาจทำงานไม่ถูกต้อง <b>อาจเป็นอันตรายหรือแม้กระทั่งอันตรายในการใช้</b>.<br><br>การตรวจสอบเหล่านี้บ่งบอกว่าแอปนี้ได้รับการแก้ไขล่วงหน้าหรือได้รับมาจากบุคคลอื่น: <br><br><small>%1$s</small><br>ขอแนะนำอย่างยิ่งให้ <b>ถอนการติดตั้งแอปนี้และแก้ไขด้วยตัวเอง</b> เพื่อให้แน่ใจว่าคุณกำลังใช้แอปที่ได้รับการตรวจสอบและปลอดภัย<p><br>หากไม่สนใจ คำเตือนนี้จะแสดงเพียงสองครั้งเท่านั้น + แก้ไขบนอุปกรณ์อื่น + ไม่ได้ติดตั้งโดย ReVanced Manager + แก้ไขเมื่อมากกว่า 10 นาทีที่แล้ว + แก้ไขเมื่อ %s วันที่แล้ว + วันที่สร้าง APK เสียหาย + + + ประกาศ ReVanced + ประวัติการรับชมของคุณไม่ได้ถูกบันทึก<br><br>สาเหตุที่เป็นไปได้มากที่สุดคือตัวบล็อกโฆษณา DNS หรือพร็อกซีเครือข่าย<br><br>เพื่อแก้ไขปัญหานี้ ให้เพิ่ม <b>s.youtube.com</b> ในรายการที่อนุญาต หรือปิดตัวบล็อกโฆษณา DNS และพร็อกซีทั้งหมด + อย่าแสดงอีก + + + การตั้งค่า + คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ + บันทึก + รีเซ็ต + รีเซ็ตสี + สีไม่ถูกต้อง + ต้องรีสตาร์ท + รีสตาร์ทแอปเพื่อให้การเปลี่ยนแปลงนี้มีผล + เริ่มต้นใหม่ + นำเข้า + คัดลอก + การตั้งค่า ReVanced ถูกตั้งค่าเป็นค่าเริ่มต้น + นำเข้าการตั้งค่า %d + การนำเข้าล้มเหลว: %s + ค้นหาในการตั้งค่า + ไม่พบผลลัพธ์สำหรับ \",%s\" + ลองใช้คำหลักอื่น + การค้นหาล่าสุด + นำออกจากประวัติการค้นหาใช่ไหม + ล้างประวัติการค้นหา + คุณแน่ใจหรือไม่ว่าต้องการล้างประวัติการค้นหาทั้งหมด + เคล็ดลับการค้นหา + "• แตะเส้นทางเพื่อไปยังเส้นทางนั้น • กดค้างที่การตั้งค่าเพื่อไปยังการตั้งค่า • กด Enter เพื่อบันทึกคำค้นหาลงในประวัติ • การค้นหาไม่สนใจตัวพิมพ์เล็ก/ใหญ่และเครื่องหมายวรรคตอน • การตั้งค่าหลักจะปรากฏอยู่เหนือการตั้งค่ารองที่ถูกปิดใช้งาน" - ประวัติการค้นหาว่างเปล่า - หากต้องการบันทึกประวัติการค้นหา ให้พิมพ์คำค้นหาแล้วกด Enter - แสดงประวัติการค้นหาในการตั้งค่า - ประวัติการค้นหาในการตั้งค่าจะปรากฏ - ไม่แสดงประวัติการค้นหาการตั้งค่า - แสดงไอคอนการตั้งค่า ReVanced - ไอคอนการตั้งค่าจะปรากฏขึ้น - ไม่แสดงไอคอนการตั้งค่า - ภาษา ReVanced - "คำแปลสำหรับบางภาษาอาจหายไปหรือไม่สมบูรณ์ + ประวัติการค้นหาว่างเปล่า + หากต้องการบันทึกประวัติการค้นหา ให้พิมพ์คำค้นหาแล้วกด Enter + แสดงประวัติการค้นหาในการตั้งค่า + ประวัติการค้นหาในการตั้งค่าจะปรากฏ + ไม่แสดงประวัติการค้นหาการตั้งค่า + แสดงไอคอนการตั้งค่า ReVanced + ไอคอนการตั้งค่าจะปรากฏขึ้น + ไม่แสดงไอคอนการตั้งค่า + ภาษา ReVanced + "คำแปลสำหรับบางภาษาอาจหายไปหรือไม่สมบูรณ์ หากต้องการแปลภาษาใหม่หรือปรับปรุงคำแปลที่มีอยู่ โปรดไปที่ translate.revanced.app" - ภาษาของแอป - นำเข้า / ส่งออก - นำเข้า / ส่งออกการตั้งค่า ReVanced - - คุณกำลังใช้ ReVanced Patches เวอร์ชัน <i>%s</i> - หมายเหตุ - เวอร์ชันนี้เป็นเวอร์ชันก่อนวางจำหน่ายและคุณอาจพบปัญหาที่ไม่คาดคิด - ลิงก์อย่างเป็นทางการ - + คุณกำลังใช้ ReVanced Patches เวอร์ชัน <i>%s</i> + หมายเหตุ + เวอร์ชันนี้เป็นเวอร์ชันก่อนวางจำหน่ายและคุณอาจพบปัญหาที่ไม่คาดคิด + ลิงก์อย่างเป็นทางการ + - - - การตั้งค่า GmsCore - การตั้งค่าสำหรับ GmsCore - - MicroG GmsCore ไม่ได้ติดตั้ง ติดตั้ง - ต้องดำเนินการ - "MicroG GmsCore ไม่มีสิทธิ์รันในพื้นหลัง + + + การตั้งค่า GmsCore + การตั้งค่าสำหรับ GmsCore + + MicroG GmsCore ไม่ได้ติดตั้ง ติดตั้ง + ต้องดำเนินการ + "MicroG GmsCore ไม่มีสิทธิ์รันในพื้นหลัง ทำตามคําแนะนํา \"อย่าฆ่าแอปของฉัน\" สําหรับโทรศัพท์ของคุณ และใช้คําแนะนําเหล่านั้นกับการติดตั้ง MicroG ของคุณ สิ่งนี้จําเป็นสําหรับแอปในการทํางาน" - เปิดเว็บไซต์ - "การปรับแต่งแบตเตอรี่ของ MicroG GmsCore ต้องถูกปิดใช้งานเพื่อป้องกันปัญหา + เปิดเว็บไซต์ + "การปรับแต่งแบตเตอรี่ของ MicroG GmsCore ต้องถูกปิดใช้งานเพื่อป้องกันปัญหา การปิดใช้งานการปรับแต่งแบตเตอรี่สําหรับ MicroG จะไม่ส่งผลเสียต่อการใช้แบตเตอรี่ แตะปุ่มตกลง และอนุญาตการเปลี่ยนแปลงการปรับแต่ง" - ดำเนินการต่อ - - - ปลอมแปลงสตรีมวิดีโอ - ปลอมแปลงสตรีมวิดีโอของไคลเอนต์เพื่อป้องกันปัญหาการเล่น - วิดีโอปลอม - "สตรีมวิดีโอถูกปลอมแปลง + ดำเนินการต่อ + + + ปลอมแปลงสตรีมวิดีโอ + ปลอมแปลงสตรีมวิดีโอของไคลเอนต์เพื่อป้องกันปัญหาการเล่น + วิดีโอปลอม + "สตรีมวิดีโอถูกปลอมแปลง หากคุณเป็นผู้ใช้ YouTube Premium การตั้งค่านี้อาจไม่จำเป็น" - "สตรีมวิดีโอไม่ได้ถูกปลอมแปลง + "สตรีมวิดีโอไม่ได้ถูกปลอมแปลง การเล่นอาจไม่ทำงาน" - การปิดการตั้งค่านี้อาจทำให้เกิดปัญหาในการเล่น - ไคลเอ็นต์เริ่มต้น - - - บังคับใช้ภาษาเสียงต้นฉบับ - กำลังใช้ภาษาเสียงต้นฉบับ - กำลังใช้ออดิโอเริ่มต้น - - หากต้องการใช้คุณสมบัตินี้ ให้เปลี่ยน \'Spoof video streams\' เป็นไคลเอ็นต์อื่น ๆ ยกเว้น Android Studio - - - ดีบัก - เปิดใช้งานหรือปิดใช้งานตัวเลือกการแก้ไขข้อบกพร่อง - การบันทึกการแก้ไขข้อบกพร่อง - การบันทึกการแก้ไขข้อบกพร่องถูกเปิดใช้งาน - การบันทึกการแก้ไขข้อบกพร่องถูกปิดใช้งาน - บันทึกการติดตามสแต็ก - การบันทึกการแก้ไขข้อบกพร่องรวมถึงการติดตามสแต็ก - การบันทึกการแก้ไขข้อบกพร่องไม่รวมการติดตามสแต็ก - แสดง toast เมื่อเกิดข้อผิดพลาดของ ReVanced - Toast จะปรากฏขึ้นหากเกิดข้อผิดพลาด - Toast จะไม่ปรากฏขึ้นหากเกิดข้อผิดพลาด - "การปิดการแจ้งเตือนข้อผิดพลาดจะซ่อนการแจ้งเตือนข้อผิดพลาดของ ReVanced ทั้งหมด + การปิดการตั้งค่านี้อาจทำให้เกิดปัญหาในการเล่น + ไคลเอ็นต์เริ่มต้น + + + บังคับใช้ภาษาเสียงต้นฉบับ + กำลังใช้ภาษาเสียงต้นฉบับ + กำลังใช้ออดิโอเริ่มต้น + + หากต้องการใช้คุณสมบัตินี้ ให้เปลี่ยน \'Spoof video streams\' เป็นไคลเอ็นต์อื่น ๆ ยกเว้น Android Studio + + + ดีบัก + เปิดใช้งานหรือปิดใช้งานตัวเลือกการแก้ไขข้อบกพร่อง + การบันทึกการแก้ไขข้อบกพร่อง + การบันทึกการแก้ไขข้อบกพร่องถูกเปิดใช้งาน + การบันทึกการแก้ไขข้อบกพร่องถูกปิดใช้งาน + บันทึกการติดตามสแต็ก + การบันทึกการแก้ไขข้อบกพร่องรวมถึงการติดตามสแต็ก + การบันทึกการแก้ไขข้อบกพร่องไม่รวมการติดตามสแต็ก + แสดง toast เมื่อเกิดข้อผิดพลาดของ ReVanced + Toast จะปรากฏขึ้นหากเกิดข้อผิดพลาด + Toast จะไม่ปรากฏขึ้นหากเกิดข้อผิดพลาด + "การปิดการแจ้งเตือนข้อผิดพลาดจะซ่อนการแจ้งเตือนข้อผิดพลาดของ ReVanced ทั้งหมด คุณจะไม่ได้รับแจ้งเกี่ยวกับเหตุการณ์ที่ไม่คาดคิดใดๆ" - ส่งออกบันทึกการแก้ไขข้อบกพร่อง - คัดลอกบันทึกการแก้ไขข้อบกพร่องของ ReVanced ไปยังคลิปบอร์ด - ปิดใช้งานการบันทึกการแก้ไขข้อบกพร่อง - ไม่พบบันทึก - คัดลอกบันทึกแล้ว - ส่งออกบันทึกไม่สำเร็จ: %s - ล้างบันทึกการแก้ไขข้อบกพร่อง - ล้างบันทึกการแก้ไขข้อบกพร่องของ ReVanced ที่จัดเก็บไว้ทั้งหมด - ล้างบันทึกแล้ว - แฟล็กคุณสมบัติ Manager - จัดการแฟล็กคุณสมบัติบูลีน - แฟล็กที่ใช้งานอยู่ (%d) - แฟล็กที่ถูกบล็อก (%d) - ค้นหาแฟล็ก... - บันทึกแฟล็กแล้ว - รีเซ็ตแฟล็กแล้ว - คัดลอกแฟล็กไปยังคลิปบอร์ดแล้ว - บันทึกโปรโตคอลบัฟเฟอร์ - การบันทึกการแก้ไขข้อบกพร่องรวมถึงโปรโตคอลบัฟเฟอร์ - การบันทึกการแก้ไขข้อบกพร่องไม่รวมโปรโตคอลบัฟเฟอร์ - "การเปิดใช้งานการตั้งค่านี้จะบันทึกข้อมูลเค้าโครงเพิ่มเติม รวมถึงข้อความบนหน้าจอสำหรับส่วนประกอบ UI บางส่วน + ส่งออกบันทึกการแก้ไขข้อบกพร่อง + คัดลอกบันทึกการแก้ไขข้อบกพร่องของ ReVanced ไปยังคลิปบอร์ด + ปิดใช้งานการบันทึกการแก้ไขข้อบกพร่อง + ไม่พบบันทึก + คัดลอกบันทึกแล้ว + ส่งออกบันทึกไม่สำเร็จ: %s + ล้างบันทึกการแก้ไขข้อบกพร่อง + ล้างบันทึกการแก้ไขข้อบกพร่องของ ReVanced ที่จัดเก็บไว้ทั้งหมด + ล้างบันทึกแล้ว + แฟล็กคุณสมบัติ Manager + จัดการแฟล็กคุณสมบัติบูลีน + แฟล็กที่ใช้งานอยู่ (%d) + แฟล็กที่ถูกบล็อก (%d) + ค้นหาแฟล็ก... + บันทึกแฟล็กแล้ว + รีเซ็ตแฟล็กแล้ว + คัดลอกแฟล็กไปยังคลิปบอร์ดแล้ว + บันทึกโปรโตคอลบัฟเฟอร์ + การบันทึกการแก้ไขข้อบกพร่องรวมถึงโปรโตคอลบัฟเฟอร์ + การบันทึกการแก้ไขข้อบกพร่องไม่รวมโปรโตคอลบัฟเฟอร์ + "การเปิดใช้งานการตั้งค่านี้จะบันทึกข้อมูลเค้าโครงเพิ่มเติม รวมถึงข้อความบนหน้าจอสำหรับส่วนประกอบ UI บางส่วน ซึ่งจะช่วยระบุส่วนประกอบเมื่อสร้างตัวกรองที่กำหนดเองได้ อย่างไรก็ตาม การเปิดใช้งานนี้จะบันทึกข้อมูลผู้ใช้บางอย่าง เช่น ที่อยู่ IP ของคุณด้วย" - - - ล้างข้อมูลลิงก์ที่แชร์ - พารามิเตอร์การติดตามจะถูกลบออกจากลิงก์ที่แชร์ - พารามิเตอร์การติดตามไม่ได้ถูกลบออกจากลิงก์ที่แชร์ - เปลี่ยนลิงก์การแชร์เป็น youtube.com - ลิงก์ที่แชร์ใช้ youtube.com - ลิงก์ที่แชร์ใช้ music.youtube.com - - - ตัวกรองแบบกำหนดเอง - ซ่อนส่วนประกอบโดยใช้ตัวกรองแบบกำหนดเอง - เปิดใช้งานตัวกรองแบบกำหนดเอง - ตัวกรองแบบกำหนดเองเปิดใช้งาน - ตัวกรองแบบกำหนดเองปิดใช้งาน - ตัวกรองแบบกำหนดเอง - - รายการสตริงตัวสร้างเส้นทางส่วนประกอบที่จะกรองคั่นด้วยบรรทัดใหม่ - ตัวกรองแบบกำหนดเองไม่ถูกต้อง: %s - - - - - เกี่ยวกับ - โฆษณา - รูปขนาดย่อทางเลือก - ฟีด - ทั่วไป - เครื่องเล่น - แถบเลื่อน - ปัดเพื่อควบคุม - เบ็ดเตล็ด - วิดีโอ - กู้คืนเมนูการตั้งค่าแบบเก่า - แสดงเมนูการตั้งค่าแบบเก่า - ไม่แสดงเมนูการตั้งค่าแบบเก่า - - - ปิดการเล่นพื้นหลัง Shorts - การเล่นพื้นหลัง Shorts ถูกปิดใช้งาน - การเล่นพื้นหลัง Shorts ถูกเปิดใช้งาน - - - ซ่อนการ์ดอัลบั้ม - การ์ดอัลบั้มถูกซ่อน - การ์ดอัลบั้มถูกแสดง - ซ่อนบัตรศิลปิน - บัตรศิลปินถูกซ่อนไว้ - บัตรศิลปินแสดงอยู่ - ซ่อนชั้นวางชิป - ชั้นวางชิปถูกซ่อน - ชั้นวางชิปแสดงอยู่ - ซ่อนโพสต์ชุมชน - โพสต์ชุมชนถูกซ่อนไว้ - โพสต์ชุมชนแสดงอยู่ - ซ่อนแบนเนอร์ขนาดกะทัดรัด - แบนเนอร์ขนาดกะทัดรัดถูกซ่อนไว้ - แบนเนอร์ขนาดกะทัดรัดแสดงอยู่ - ซ่อนการ์ดแบบขยายได้ - การ์ดแบบขยายได้ใต้คลิปวิดีโอถูกซ่อนไว้ - การ์ดแบบขยายได้ใต้คลิปวิดีโอแสดงอยู่ - ซ่อนปุ่มไมโครโฟนแบบลอย - ปุ่มไมโครโฟนลอยในหน้าการค้นหาถูกซ่อนไว้ - แสดงปุ่มไมโครโฟนลอยในหน้าค้นหา - ซ่อนชั้นวางแนวนอน - "ซ่อนชั้นวางแนวนอน เช่น: + + + ล้างข้อมูลลิงก์ที่แชร์ + พารามิเตอร์การติดตามจะถูกลบออกจากลิงก์ที่แชร์ + พารามิเตอร์การติดตามไม่ได้ถูกลบออกจากลิงก์ที่แชร์ + เปลี่ยนลิงก์การแชร์เป็น youtube.com + ลิงก์ที่แชร์ใช้ youtube.com + ลิงก์ที่แชร์ใช้ music.youtube.com + + + ตัวกรองแบบกำหนดเอง + ซ่อนส่วนประกอบโดยใช้ตัวกรองแบบกำหนดเอง + เปิดใช้งานตัวกรองแบบกำหนดเอง + ตัวกรองแบบกำหนดเองเปิดใช้งาน + ตัวกรองแบบกำหนดเองปิดใช้งาน + ตัวกรองแบบกำหนดเอง + + รายการสตริงตัวสร้างเส้นทางส่วนประกอบที่จะกรองคั่นด้วยบรรทัดใหม่ + ตัวกรองแบบกำหนดเองไม่ถูกต้อง: %s + + + + + เกี่ยวกับ + โฆษณา + รูปขนาดย่อทางเลือก + ฟีด + ทั่วไป + เครื่องเล่น + แถบเลื่อน + ปัดเพื่อควบคุม + เบ็ดเตล็ด + วิดีโอ + กู้คืนเมนูการตั้งค่าแบบเก่า + แสดงเมนูการตั้งค่าแบบเก่า + ไม่แสดงเมนูการตั้งค่าแบบเก่า + + + ปิดการเล่นพื้นหลัง Shorts + การเล่นพื้นหลัง Shorts ถูกปิดใช้งาน + การเล่นพื้นหลัง Shorts ถูกเปิดใช้งาน + + + ซ่อนการ์ดอัลบั้ม + การ์ดอัลบั้มถูกซ่อน + การ์ดอัลบั้มถูกแสดง + ซ่อนบัตรศิลปิน + บัตรศิลปินถูกซ่อนไว้ + บัตรศิลปินแสดงอยู่ + ซ่อนชั้นวางชิป + ชั้นวางชิปถูกซ่อน + ชั้นวางชิปแสดงอยู่ + ซ่อนโพสต์ชุมชน + โพสต์ชุมชนถูกซ่อนไว้ + โพสต์ชุมชนแสดงอยู่ + ซ่อนแบนเนอร์ขนาดกะทัดรัด + แบนเนอร์ขนาดกะทัดรัดถูกซ่อนไว้ + แบนเนอร์ขนาดกะทัดรัดแสดงอยู่ + ซ่อนการ์ดแบบขยายได้ + การ์ดแบบขยายได้ใต้คลิปวิดีโอถูกซ่อนไว้ + การ์ดแบบขยายได้ใต้คลิปวิดีโอแสดงอยู่ + ซ่อนปุ่มไมโครโฟนแบบลอย + ปุ่มไมโครโฟนลอยในหน้าการค้นหาถูกซ่อนไว้ + แสดงปุ่มไมโครโฟนลอยในหน้าค้นหา + ซ่อนชั้นวางแนวนอน + "ซ่อนชั้นวางแนวนอน เช่น: • ข่าวล่าสุด • ดูต่อ • สำรวจช่องเพิ่มเติม • ที่เกี่ยวข้องมากที่สุด • ช้อปปิ้ง • ดูอีกครั้ง" - ชั้นวางแนวนอนแสดงอยู่ - ซ่อนชั้นวางรูปภาพ - ชั้นวางรูปภาพในผลการค้นหาถูกซ่อนไว้ - ชั้นวางรูปภาพในผลการค้นหาแสดงอยู่ - ซ่อนโพสต์ล่าสุด - โพสต์ล่าสุดถูกซ่อนไว้ - โพสต์ล่าสุดแสดงอยู่ - ซ่อนเพลย์ลิสต์แบบผสม - เพลย์ลิสต์แบบผสมถูกซ่อนไว้ - เพลย์ลิสต์แบบผสมแสดงอยู่ - ซ่อนส่วนภาพยนตร์ - ส่วนภาพยนตร์ถูกซ่อนไว้ - ส่วนภาพยนตร์แสดงอยู่ - - ซ่อนปุ่ม \"แจ้งเตือนฉัน\" - ปุ่มแจ้งเตือนฉันถูกซ่อนไว้ - ปุ่มแจ้งเตือนฉันแสดงอยู่ - ซ่อน Playables - Playables ถูกซ่อนไว้ - Playables แสดงอยู่ - - ซ่อนปุ่ม \"แสดงเพิ่มเติม\" - ปุ่มแสดงเพิ่มเติมในผลการค้นหาถูกซ่อนไว้ - ปุ่มแสดงเพิ่มเติมในผลการค้นหาแสดงอยู่ - ซ่อนแบบสำรวจ - ซ่อนแบบสำรวจ - แสดงแบบสำรวจ - ซ่อนชั้นวางตั๋ว - ชั้นวางตั๋วถูกซ่อนอยู่ - ชั้นวางตั๋วแสดงอยู่ - - ซ่อนป้ายกำกับการแนะนำวิดีโอ - ป้ายกำกับ \"ผู้คนยังรับชม\" และ \"คุณอาจชอบ\" ในผลการค้นหาถูกซ่อนไว้ - ป้ายกำกับ \"ผู้คนยังรับชม\" และ \"คุณอาจชอบ\" ในผลการค้นหาแสดงอยู่ - ซ่อนตัวคั่นภาพ - ตัวคั่นภาพถูกซ่อนแล้ว - ตัวคั่นภาพถูกแสดงแล้ว - - ซ่อน Doodles ของ YouTube - ภาพเคลื่อนไหว YouTube Doodles บนโลโก้ถูกซ่อนไว้ - แสดงแอนิเมชัน Doodles ของ YouTube บนโลโก้ - "YouTube Doodles ภาษาไทยจะปรากฏให้เห็นเพียงไม่กี่วันในแต่ละปี + ซ่อนปุ่ม \"แสดงเพิ่มเติม\" + ปุ่มแสดงเพิ่มเติมในผลการค้นหาถูกซ่อนไว้ + ปุ่มแสดงเพิ่มเติมในผลการค้นหาแสดงอยู่ + ซ่อนแบบสำรวจ + ซ่อนแบบสำรวจ + แสดงแบบสำรวจ + ซ่อนชั้นวางตั๋ว + ชั้นวางตั๋วถูกซ่อนอยู่ + ชั้นวางตั๋วแสดงอยู่ + + ซ่อนป้ายกำกับการแนะนำวิดีโอ + ป้ายกำกับ \"ผู้คนยังรับชม\" และ \"คุณอาจชอบ\" ในผลการค้นหาถูกซ่อนไว้ + ป้ายกำกับ \"ผู้คนยังรับชม\" และ \"คุณอาจชอบ\" ในผลการค้นหาแสดงอยู่ + ซ่อนตัวคั่นภาพ + ตัวคั่นภาพถูกซ่อนแล้ว + ตัวคั่นภาพถูกแสดงแล้ว + + ซ่อน Doodles ของ YouTube + ภาพเคลื่อนไหว YouTube Doodles บนโลโก้ถูกซ่อนไว้ + แสดงแอนิเมชัน Doodles ของ YouTube บนโลโก้ + "YouTube Doodles ภาษาไทยจะปรากฏให้เห็นเพียงไม่กี่วันในแต่ละปี หาก Doodle กำลังแสดงอยู่ในภูมิภาคของคุณและการตั้งค่าการซ่อนนี้เปิดอยู่ แถบตัวกรองด้านล่างแถบค้นหาจะถูกซ่อนเช่นกัน" - ซ่อนแถบช่อง - แถบช่องถูกซ่อนไว้ - แถบช่องแสดงอยู่ - ซ่อนลายน้ำของช่อง - ลายน้ำถูกซ่อน - ลายน้ำถูกแสดง - ซ่อนกล่องระดมทุน - กล่องระดมทุนถูกซ่อน - กล่องระดมทุนถูกแสดง - ซ่อนกล่องฉุกเฉิน - กล่องฉุกเฉินถูกซ่อนไว้ - กล่องฉุกเฉินแสดงอยู่ - ซ่อนแผงข้อมูล - แผงข้อมูลถูกซ่อนไว้ - แผงข้อมูลแสดงอยู่ - - ซ่อนปุ่มเข้าร่วม - ปุ่มเข้าร่วมถูกซ่อนไว้ - ปุ่มเข้าร่วมแสดงอยู่ - ซ่อนแผงทางการแพทย์ - แผงทางการแพทย์ถูกซ่อนไว้ - แผงทางการแพทย์แสดงอยู่ - ซ่อนการดำเนินการด่วน - การดำเนินการด่วนในโหมดเต็มจอถูกซ่อนไว้ - การดำเนินการด่วนในโหมดเต็มจอแสดงอยู่ - ซ่อนวิดีโอที่เกี่ยวข้อง - วิดีโอที่เกี่ยวข้องในการดำเนินการด่วนถูกซ่อนไว้ - วิดีโอที่เกี่ยวข้องในการดำเนินการด่วนแสดงอยู่ - ซ่อนหลักเกณฑ์สำหรับผู้ติดตาม - แนวทางชุมชนสำหรับสมาชิกถูกซ่อนไว้ - แนวทางชุมชนสำหรับสมาชิกแสดงอยู่ - ซ่อนปฏิกิริยาตามเวลา - ปฏิกิริยาตามเวลาถูกซ่อน - ปฏิกิริยาตามเวลาถูกแสดง - ซ่อน \",สรุปวิดีโอที่สร้างโดย AI\" - ส่วนสรุปวิดีโอที่สร้างโดย AI ถูกซ่อนอยู่ - แสดงส่วนสรุปวิดีโอที่สร้างโดย AI - ซ่อน Ask - ส่วน Ask ถูกซ่อนไว้ - ส่วน Ask ถูกแสดง - ซ่อนแอตทริบิวต์ - ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงถูกซ่อน - ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงแสดงอยู่ - ซ่อนบท - ส่วนบทถูกซ่อนไว้ - ส่วนบทแสดงอยู่ - ซ่อน \'วิธีการสร้างเนื้อหานี้\' - ส่วนวิธีการสร้างเนื้อหานี้ถูกซ่อน - ส่วนวิธีการสร้างเนื้อหานี้แสดงอยู่ - ซ่อนคะแนน Hype - คะแนน Hype ถูกซ่อน - คะแนน Hype แสดงอยู่ - ซ่อน \'สำรวจพอดแคสต์\' - ส่วนสำรวจพอดแคสต์ถูกซ่อน - ส่วนสำรวจพอดแคสต์แสดงอยู่ - ซ่อนลิงก์เด่น - ส่วนลิงก์เด่นถูกซ่อน - ส่วนลิงก์เด่นถูกแสดง - ซ่อนวิดีโอเด่น - ส่วนวิดีโอเด่นถูกซ่อน - ส่วนวิดีโอเด่นถูกแสดง - ซ่อนการ์ดข้อมูล - ส่วนบัตรข้อมูลถูกซ่อนไว้ - ส่วนบัตรข้อมูลแสดงอยู่ - ซ่อน \'แนวคิดหลัก\' - ส่วนแนวคิดหลักถูกซ่อน - ส่วนแนวคิดหลักแสดงอยู่ - ซ่อนปุ่มติดตาม - ปุ่มติดตามถูกซ่อน - ปุ่มติดตามถูกแสดง - ซ่อนบทถอดเสียง - ส่วนคำอธิบายถูกซ่อนไว้ - ส่วนคำอธิบายแสดงอยู่ - คำอธิบายวิดีโอ - ซ่อนหรือแสดงส่วนประกอบของคำอธิบายวิดีโอ - แถบตัวกรอง - ซ่อนหรือแสดงแถบตัวกรองในฟีด วิดีโอที่เกี่ยวข้อง ผลการค้นหา และประวัติการดู - ซ่อนในฟีด - ซ่อนอยู่ในฟีด - แสดงในฟีด - ซ่อนในวิดีโอที่เกี่ยวข้อง - ซ่อนในวิดีโอที่เกี่ยวข้อง - แสดงในวิดีโอที่เกี่ยวข้อง - ซ่อนในผลการค้นหา - ซ่อนในการค้นหา - แสดงในผลการค้นหา - ซ่อนในประวัติการดู - ซ่อนอยู่ในประวัติการดู - แสดงในประวัติการดู - หน้าช่อง - ซ่อนหรือแสดงองค์ประกอบของหน้าช่อง - - ซ่อนปุ่มชุมชน - ปุ่มชุมชนถูกซ่อน - ปุ่มชุมชนแสดงอยู่ - - ซ่อนชั้นวาง \'สำหรับคุณ\' - ชั้นวาง \"สำหรับคุณ\" ถูกซ่อนไว้ - ชั้นวาง \"สำหรับคุณ\" แสดงอยู่ - - ซ่อนปุ่ม \"เข้าร่วม\" - ปุ่ม \"เข้าร่วม\" ถูกซ่อน - ปุ่ม \"เข้าร่วม\" แสดงอยู่ - ซ่อนตัวอย่างลิงก์ - ตัวอย่างลิงก์ถูกซ่อนไว้ - ตัวอย่างลิงก์แสดงอยู่ - ซ่อนชั้นวางสมาชิก - ชั้นวางสมาชิกถูกซ่อนไว้ - แสดงชั้นวางของสมาชิก - - ซ่อนปุ่ม \"ร้านค้า\" - ปุ่ม \"ร้านค้า\" ถูกซ่อน - ปุ่ม \"ร้านค้า\" แสดงอยู่ - - ซ่อนปุ่ม \"ติดตาม\" - ปุ่ม \"ติดตาม\" ถูกซ่อน - ปุ่ม \"ติดตาม\" แสดงอยู่ - ความคิดเห็น - ซ่อนหรือแสดงส่วนประกอบของส่วนความคิดเห็น - ซ่อนสรุปแชท AI - สรุปแชท AI ถูกซ่อนอยู่ - สรุปแชท AI แสดงอยู่ - ซ่อนสรุปความคิดเห็น AI - สรุปความคิดเห็น AI ถูกซ่อนอยู่ - สรุปความคิดเห็น AI แสดงอยู่ - ซ่อนแนวทางปฏิบัติของช่อง - ซ่อนแนวทางช่องแล้ว - แสดงแนวทางช่องแล้ว - ซ่อนส่วนหัว \'ความคิดเห็นโดยสมาชิก\' - ส่วนหัวความคิดเห็นโดยสมาชิกถูกซ่อน - ส่วนหัวความคิดเห็นโดยสมาชิกแสดงอยู่ - ซ่อนส่วนความคิดเห็น - ส่วนความคิดเห็นถูกซ่อนไว้ - ส่วนความคิดเห็นแสดงอยู่ - ซ่อนแนวทางชุมชน - แนวทางปฏิบัติของชุมชนถูกซ่อนไว้ - แนวทางปฏิบัติของชุมชนแสดงอยู่ - ซ่อนปุ่ม \'สร้าง Shorts\' - ปุ่มสร้าง Short ถูกซ่อน - ปุ่มสร้าง Short แสดงอยู่ - ซ่อนปุ่มอีโมจิและปุ่มการประทับเวลา - ปุ่มอีโมจิและปุ่มการประทับเวลาถูกซ่อน - ปุ่มอีโมจิและปุ่มการประทับเวลาถูกแสดง - ซ่อนความคิดเห็นตัวอย่าง - ความคิดเห็นตัวอย่างถูกซ่อนไว้ - ความคิดเห็นตัวอย่างแสดงอยู่ - ซ่อนปุ่มขอบคุณ - ปุ่มขอบคุณถูกซ่อนไว้ - ปุ่มขอบคุณจะแสดง - ซ่อนจำนวนการดู - จำนวนการดูถูกซ่อนอยู่ในฟีดและผลการค้นหา - จำนวนการดูแสดงอยู่ในฟีดและผลการค้นหา - - "ข้อจำกัด: + ซ่อนปุ่มเข้าร่วม + ปุ่มเข้าร่วมถูกซ่อนไว้ + ปุ่มเข้าร่วมแสดงอยู่ + ซ่อนแผงทางการแพทย์ + แผงทางการแพทย์ถูกซ่อนไว้ + แผงทางการแพทย์แสดงอยู่ + ซ่อนการดำเนินการด่วน + การดำเนินการด่วนในโหมดเต็มจอถูกซ่อนไว้ + การดำเนินการด่วนในโหมดเต็มจอแสดงอยู่ + ซ่อนวิดีโอที่เกี่ยวข้อง + วิดีโอที่เกี่ยวข้องในการดำเนินการด่วนถูกซ่อนไว้ + วิดีโอที่เกี่ยวข้องในการดำเนินการด่วนแสดงอยู่ + ซ่อนหลักเกณฑ์สำหรับผู้ติดตาม + แนวทางชุมชนสำหรับสมาชิกถูกซ่อนไว้ + แนวทางชุมชนสำหรับสมาชิกแสดงอยู่ + ซ่อนปฏิกิริยาตามเวลา + ปฏิกิริยาตามเวลาถูกซ่อน + ปฏิกิริยาตามเวลาถูกแสดง + ซ่อน \",สรุปวิดีโอที่สร้างโดย AI\" + ส่วนสรุปวิดีโอที่สร้างโดย AI ถูกซ่อนอยู่ + แสดงส่วนสรุปวิดีโอที่สร้างโดย AI + ซ่อน Ask + ส่วน Ask ถูกซ่อนไว้ + ส่วน Ask ถูกแสดง + ซ่อนแอตทริบิวต์ + ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงถูกซ่อน + ส่วนสถานที่แนะนำ, เกม, เพลง และบุคคลที่กล่าวถึงแสดงอยู่ + ซ่อนบท + ส่วนบทถูกซ่อนไว้ + ส่วนบทแสดงอยู่ + ซ่อน \'วิธีการสร้างเนื้อหานี้\' + ส่วนวิธีการสร้างเนื้อหานี้ถูกซ่อน + ส่วนวิธีการสร้างเนื้อหานี้แสดงอยู่ + ซ่อนคะแนน Hype + คะแนน Hype ถูกซ่อน + คะแนน Hype แสดงอยู่ + ซ่อน \'สำรวจพอดแคสต์\' + ส่วนสำรวจพอดแคสต์ถูกซ่อน + ส่วนสำรวจพอดแคสต์แสดงอยู่ + ซ่อนลิงก์เด่น + ส่วนลิงก์เด่นถูกซ่อน + ส่วนลิงก์เด่นถูกแสดง + ซ่อนวิดีโอเด่น + ส่วนวิดีโอเด่นถูกซ่อน + ส่วนวิดีโอเด่นถูกแสดง + ซ่อนการ์ดข้อมูล + ส่วนบัตรข้อมูลถูกซ่อนไว้ + ส่วนบัตรข้อมูลแสดงอยู่ + ซ่อน \'แนวคิดหลัก\' + ส่วนแนวคิดหลักถูกซ่อน + ส่วนแนวคิดหลักแสดงอยู่ + ซ่อนปุ่มติดตาม + ปุ่มติดตามถูกซ่อน + ปุ่มติดตามถูกแสดง + ซ่อนบทถอดเสียง + ส่วนคำอธิบายถูกซ่อนไว้ + ส่วนคำอธิบายแสดงอยู่ + คำอธิบายวิดีโอ + ซ่อนหรือแสดงส่วนประกอบของคำอธิบายวิดีโอ + แถบตัวกรอง + ซ่อนหรือแสดงแถบตัวกรองในฟีด วิดีโอที่เกี่ยวข้อง ผลการค้นหา และประวัติการดู + ซ่อนในฟีด + ซ่อนอยู่ในฟีด + แสดงในฟีด + ซ่อนในวิดีโอที่เกี่ยวข้อง + ซ่อนในวิดีโอที่เกี่ยวข้อง + แสดงในวิดีโอที่เกี่ยวข้อง + ซ่อนในผลการค้นหา + ซ่อนในการค้นหา + แสดงในผลการค้นหา + ซ่อนในประวัติการดู + ซ่อนอยู่ในประวัติการดู + แสดงในประวัติการดู + หน้าช่อง + ซ่อนหรือแสดงองค์ประกอบของหน้าช่อง + + ซ่อนปุ่มชุมชน + ปุ่มชุมชนถูกซ่อน + ปุ่มชุมชนแสดงอยู่ + + ซ่อนชั้นวาง \'สำหรับคุณ\' + ชั้นวาง \"สำหรับคุณ\" ถูกซ่อนไว้ + ชั้นวาง \"สำหรับคุณ\" แสดงอยู่ + + ซ่อนปุ่ม \"เข้าร่วม\" + ปุ่ม \"เข้าร่วม\" ถูกซ่อน + ปุ่ม \"เข้าร่วม\" แสดงอยู่ + ซ่อนตัวอย่างลิงก์ + ตัวอย่างลิงก์ถูกซ่อนไว้ + ตัวอย่างลิงก์แสดงอยู่ + ซ่อนชั้นวางสมาชิก + ชั้นวางสมาชิกถูกซ่อนไว้ + แสดงชั้นวางของสมาชิก + + ซ่อนปุ่ม \"ร้านค้า\" + ปุ่ม \"ร้านค้า\" ถูกซ่อน + ปุ่ม \"ร้านค้า\" แสดงอยู่ + + ซ่อนปุ่ม \"ติดตาม\" + ปุ่ม \"ติดตาม\" ถูกซ่อน + ปุ่ม \"ติดตาม\" แสดงอยู่ + ความคิดเห็น + ซ่อนหรือแสดงส่วนประกอบของส่วนความคิดเห็น + ซ่อนสรุปแชท AI + สรุปแชท AI ถูกซ่อนอยู่ + สรุปแชท AI แสดงอยู่ + ซ่อนสรุปความคิดเห็น AI + สรุปความคิดเห็น AI ถูกซ่อนอยู่ + สรุปความคิดเห็น AI แสดงอยู่ + ซ่อนแนวทางปฏิบัติของช่อง + ซ่อนแนวทางช่องแล้ว + แสดงแนวทางช่องแล้ว + ซ่อนส่วนหัว \'ความคิดเห็นโดยสมาชิก\' + ส่วนหัวความคิดเห็นโดยสมาชิกถูกซ่อน + ส่วนหัวความคิดเห็นโดยสมาชิกแสดงอยู่ + ซ่อนส่วนความคิดเห็น + ส่วนความคิดเห็นถูกซ่อนไว้ + ส่วนความคิดเห็นแสดงอยู่ + ซ่อนแนวทางชุมชน + แนวทางปฏิบัติของชุมชนถูกซ่อนไว้ + แนวทางปฏิบัติของชุมชนแสดงอยู่ + ซ่อนปุ่ม \'สร้าง Shorts\' + ปุ่มสร้าง Short ถูกซ่อน + ปุ่มสร้าง Short แสดงอยู่ + ซ่อนปุ่มอีโมจิและปุ่มการประทับเวลา + ปุ่มอีโมจิและปุ่มการประทับเวลาถูกซ่อน + ปุ่มอีโมจิและปุ่มการประทับเวลาถูกแสดง + ซ่อนความคิดเห็นตัวอย่าง + ความคิดเห็นตัวอย่างถูกซ่อนไว้ + ความคิดเห็นตัวอย่างแสดงอยู่ + ซ่อนปุ่มขอบคุณ + ปุ่มขอบคุณถูกซ่อนไว้ + ปุ่มขอบคุณจะแสดง + ซ่อนจำนวนการดู + จำนวนการดูถูกซ่อนอยู่ในฟีดและผลการค้นหา + จำนวนการดูแสดงอยู่ในฟีดและผลการค้นหา + + "ข้อจำกัด: • ชั้นวาง Shorts, หน้าช่อง และผลการค้นหาอาจยังคงแสดงจำนวนการดู • ฟีเจอร์นี้ไม่สามารถใช้งานได้กับรูปแบบที่ใช้ในยานยนต์" - ซ่อนเวลาอัปโหลด - เวลาอัปโหลดถูกซ่อนอยู่ในฟีดและผลการค้นหา - เวลาอัปโหลดจะแสดงในฟีดและผลการค้นหา - - "ข้อจำกัด: + ซ่อนเวลาอัปโหลด + เวลาอัปโหลดถูกซ่อนอยู่ในฟีดและผลการค้นหา + เวลาอัปโหลดจะแสดงในฟีดและผลการค้นหา + + "ข้อจำกัด: • แถบ Shorts, หน้าช่อง และผลการค้นหา อาจยังคงแสดงเวลาอัปโหลด • คุณสมบัตินี้ไม่ทำงานกับฟอร์มแฟกเตอร์ยานยนต์" - ซ่อนเนื้อหาคำสำคัญ - ซ่อนวิดีโอการค้นหาและฟีดโดยใช้ตัวกรองคำสำคัญ - ซ่อนวิดีโอหน้าแรกตามคำสำคัญ - วิดีโอในแท็บหน้าแรกถูกกรองตามคำสำคัญ - วิดีโอในแท็บหน้าแรกไม่ได้ถูกกรองตามคำสำคัญ - ซ่อนผลลัพธ์การค้นหาตามคำสำคัญ - ผลลัพธ์การค้นหาถูกกรองตามคำสำคัญ - ผลลัพธ์การค้นหาไม่ได้ถูกกรองตามคำสำคัญ - ซ่อนวิดีโอการสมัครสมาชิกตามคำสำคัญ - วิดีโอในแท็บการสมัครสมาชิกถูกกรองตามคำสำคัญ - วิดีโอในแท็บการสมัครสมาชิกไม่ได้ถูกกรองตามคำสำคัญ - คำสำคัญที่จะซ่อน - - "คําหลักและวลีที่จะซ่อน แยกด้วยบรรทัดใหม่ + "คําหลักและวลีที่จะซ่อน แยกด้วยบรรทัดใหม่ คําหลักอาจเป็นชื่อช่องหรือข้อความใดๆ ที่แสดงในชื่อวิดีโอ คําที่มีตัวอักษรตัวใหญ่ตรงกลางต้องป้อนพร้อมเคส (เช่น: iPhone, TikTok, LeBlanc)" - เกี่ยวกับการกรองคำสำคัญ - "ผลลัพธ์ หน้าแรก/การสมัครสมาชิก/การค้นหา จะถูกกรองเพื่อซ่อนเนื้อหาที่ตรงกับวลีคําหลัก + เกี่ยวกับการกรองคำสำคัญ + "ผลลัพธ์ หน้าแรก/การสมัครสมาชิก/การค้นหา จะถูกกรองเพื่อซ่อนเนื้อหาที่ตรงกับวลีคําหลัก ข้อจํากัด • Shorts ไม่สามารถซ่อนได้ตามชื่อช่อง • บางส่วนของ UI อาจไม่ถูกซ่อน • การค้นหาคําหลักอาจไม่แสดงผลลัพธ์" - จับคู่ทั้งคำ - - การล้อมรอบคีย์เวิร์ด/วลีด้วยเครื่องหมายคำพูดคู่จะป้องกันการจับคู่บางส่วนของชื่อวิดีโอและชื่อช่อง<br><br>ตัวอย่างเช่น<br><b>\"ai\"</b> จะซ่อนวิดีโอ: <b>AI ทำงานอย่างไร?</b><br>แต่จะไม่ซ่อน: <b>What does fair use mean?</b> - - ไม่สามารถใช้คำสำคัญ: %s - เพิ่มเครื่องหมายคำพูดเพื่อใช้คำสำคัญ: %s - คำสำคัญมีการประกาศที่ขัดแย้งกัน: %s - คำสำคัญสั้นเกินไปและต้องใช้เครื่องหมายคำพูด: %s - คำสำคัญจะซ่อนวิดีโอทั้งหมด: %s - - - ซ่อนชั้นวางร้านค้าของผู้สร้าง - ชั้นวางร้านค้าของครีเอเตอร์ใต้โปรแกรมเล่นวิดีโอถูกซ่อนไว้ - แสดงชั้นวางร้านค้าของผู้สร้างใต้เครื่องเล่นวิดีโอ - ซ่อนแบนเนอร์ร้านค้าท้ายจอ - แบนเนอร์ร้านค้าท้ายหน้าจอถูกซ่อนไว้ - แบนเนอร์ร้านค้าท้ายหน้าจอแสดงอยู่ - ซ่อนโฆษณาแบบเต็มหน้าจอ - "โฆษณาแบบเต็มจอถูกซ่อน + จับคู่ทั้งคำ + + การล้อมรอบคีย์เวิร์ด/วลีด้วยเครื่องหมายคำพูดคู่จะป้องกันการจับคู่บางส่วนของชื่อวิดีโอและชื่อช่อง<br><br>ตัวอย่างเช่น<br><b>\"ai\"</b> จะซ่อนวิดีโอ: <b>AI ทำงานอย่างไร?</b><br>แต่จะไม่ซ่อน: <b>What does fair use mean?</b> + + ไม่สามารถใช้คำสำคัญ: %s + เพิ่มเครื่องหมายคำพูดเพื่อใช้คำสำคัญ: %s + คำสำคัญมีการประกาศที่ขัดแย้งกัน: %s + คำสำคัญสั้นเกินไปและต้องใช้เครื่องหมายคำพูด: %s + คำสำคัญจะซ่อนวิดีโอทั้งหมด: %s + + + ซ่อนชั้นวางร้านค้าของผู้สร้าง + ชั้นวางร้านค้าของครีเอเตอร์ใต้โปรแกรมเล่นวิดีโอถูกซ่อนไว้ + แสดงชั้นวางร้านค้าของผู้สร้างใต้เครื่องเล่นวิดีโอ + ซ่อนแบนเนอร์ร้านค้าท้ายจอ + แบนเนอร์ร้านค้าท้ายหน้าจอถูกซ่อนไว้ + แบนเนอร์ร้านค้าท้ายหน้าจอแสดงอยู่ + ซ่อนโฆษณาแบบเต็มหน้าจอ + "โฆษณาแบบเต็มจอถูกซ่อน คุณสมบัตินี้มีเฉพาะสําหรับอุปกรณ์รุ่นเก่า" - โฆษณาแบบเต็มหน้าจอจะแสดง - - ซ่อนโฆษณาแบบเต็มหน้าจอใช้งานได้กับอุปกรณ์รุ่นเก่าเท่านั้น - ซ่อนโฆษณาโดยทั่วไป - โฆษณาโดยทั่วไปถูกซ่อน - โฆษณาโดยทั่วไปจะแสดง - ซ่อนแบนเนอร์สินค้า - แบนเนอร์สินค้าถูกซ่อน - แบนเนอร์สินค้าจะแสดง - ซ่อนป้ายโฆษณาที่จ่ายเงิน - ป้ายโฆษณาที่จ่ายเงินถูกซ่อน - ป้ายโฆษณาที่จ่ายเงินจะแสดง - ซ่อนการ์ดที่สนับสนุนตัวเอง - การ์ดที่สนับสนุนตัวเองถูกซ่อน - การ์ดที่สนับสนุนตัวเองจะแสดง - ซ่อนลิงก์การช็อปปิ้ง - ลิงก์การช็อปปิ้งในคำอธิบายวิดีโอถูกซ่อนไว้ - แสดงลิงก์ช้อปปิ้งในคำอธิบายวิดีโอ - ซ่อนแบนเนอร์ \'ดูสินค้า\' - แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอถูกซ่อนไว้ - แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอแสดงอยู่ - ซ่อนผลลัพธ์การค้นหาบนเว็บ - ผลลัพธ์การค้นหาบนเว็บถูกซ่อน - ผลลัพธ์การค้นหาบนเว็บจะแสดง - - - ซ่อนการโปรโมต YouTube Premium - การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอถูกซ่อน - การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอจะแสดง - - - ซ่อนโฆษณาวิดีโอ - โฆษณาวิดีโอถูกซ่อน - โฆษณาวิดีโอจะแสดง - - - คัดลอก URL ไปยังคลิปบอร์ด - คัดลอก URL พร้อมเวลาไปยังคลิปบอร์ด - แสดงปุ่มคัดลอก URL วิดีโอ - ปุ่มคัดลอก URL วิดีโอแสดงอยู่ แตะเพื่อคัดลอก URL วิดีโอ แตะค้างไว้เพื่อคัดลอกพร้อมเวลา - ปุ่มคัดลอก URL วิดีโอไม่แสดง - แสดงปุ่มคัดลอก URL เวลา - ปุ่มคัดลอก URL พร้อมเวลาแสดงอยู่ แตะเพื่อคัดลอก URL วิดีโอพร้อมเวลา แตะค้างไว้เพื่อคัดลอกโดยไม่มีเวลา - ปุ่มคัดลอก URL พร้อมเวลาไม่แสดง - - - ลบกล่องโต้ตอบการพิจารณาของผู้ชม - กล่องโต้ตอบจะถูกลบ - กล่องโต้ตอบจะแสดง - สิ่งนี้ไม่ได้ข้ามข้อจำกัดอายุ มันแค่ยอมรับอายุโดยอัตโนมัติ - - - ปิดใช้งานป๊อปอัป \"ลงชื่อเข้าใช้ทีวี\" - ปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว - เปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว - - - ปิดใช้งานการแตะสองครั้งเพื่อข้ามบท - การแตะสองครั้งจะไม่สามารถเรียกให้เกิดการข้ามไปยังบทถัดไป/ก่อนหน้าได้ - การแตะสองครั้งสามารถเรียกให้เกิดการข้ามไปยังบทถัดไป/ก่อนหน้าได้เป็นบางครั้ง - - - การดาวน์โหลดภายนอก - การตั้งค่าสำหรับการใช้โปรแกรมดาวน์โหลดภายนอก - แสดงปุ่มดาวน์โหลดภายนอก - ปุ่มดาวน์โหลดในเครื่องเล่นแสดงอยู่ - ปุ่มดาวน์โหลดในเครื่องเล่นไม่ได้แสดงอยู่ - - แทนที่ปุ่ม \'ดาวน์โหลด\' - ปุ่มดาวน์โหลดเปิดโปรแกรมดาวน์โหลดภายนอกของคุณ - ปุ่มดาวน์โหลดเปิดโปรแกรมดาวน์โหลดในแอปแบบเนทีฟ - ชื่อแพ็คเกจโปรแกรมดาวน์โหลด - ชื่อแพ็กเกจของแอปดาวน์โหลดภายนอกที่คุณติดตั้ง - ป้อนชื่อแพ็กเกจ - อื่น ๆ - ไม่ได้ติดตั้งแอป - %s ไม่ได้ติดตั้ง โปรดติดตั้ง - "ไม่พบแอปที่ติดตั้งด้วยชื่อแพ็กเกจ: %s + โฆษณาแบบเต็มหน้าจอจะแสดง + + ซ่อนโฆษณาแบบเต็มหน้าจอใช้งานได้กับอุปกรณ์รุ่นเก่าเท่านั้น + ซ่อนโฆษณาโดยทั่วไป + โฆษณาโดยทั่วไปถูกซ่อน + โฆษณาโดยทั่วไปจะแสดง + ซ่อนแบนเนอร์สินค้า + แบนเนอร์สินค้าถูกซ่อน + แบนเนอร์สินค้าจะแสดง + ซ่อนป้ายโฆษณาที่จ่ายเงิน + ป้ายโฆษณาที่จ่ายเงินถูกซ่อน + ป้ายโฆษณาที่จ่ายเงินจะแสดง + ซ่อนการ์ดที่สนับสนุนตัวเอง + การ์ดที่สนับสนุนตัวเองถูกซ่อน + การ์ดที่สนับสนุนตัวเองจะแสดง + ซ่อนลิงก์การช็อปปิ้ง + ลิงก์การช็อปปิ้งในคำอธิบายวิดีโอถูกซ่อนไว้ + แสดงลิงก์ช้อปปิ้งในคำอธิบายวิดีโอ + ซ่อนแบนเนอร์ \'ดูสินค้า\' + แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอถูกซ่อนไว้ + แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอแสดงอยู่ + ซ่อนผลลัพธ์การค้นหาบนเว็บ + ผลลัพธ์การค้นหาบนเว็บถูกซ่อน + ผลลัพธ์การค้นหาบนเว็บจะแสดง + + + ซ่อนการโปรโมต YouTube Premium + การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอถูกซ่อน + การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอจะแสดง + + + ซ่อนโฆษณาวิดีโอ + โฆษณาวิดีโอถูกซ่อน + โฆษณาวิดีโอจะแสดง + + + คัดลอก URL ไปยังคลิปบอร์ด + คัดลอก URL พร้อมเวลาไปยังคลิปบอร์ด + แสดงปุ่มคัดลอก URL วิดีโอ + ปุ่มคัดลอก URL วิดีโอแสดงอยู่ แตะเพื่อคัดลอก URL วิดีโอ แตะค้างไว้เพื่อคัดลอกพร้อมเวลา + ปุ่มคัดลอก URL วิดีโอไม่แสดง + แสดงปุ่มคัดลอก URL เวลา + ปุ่มคัดลอก URL พร้อมเวลาแสดงอยู่ แตะเพื่อคัดลอก URL วิดีโอพร้อมเวลา แตะค้างไว้เพื่อคัดลอกโดยไม่มีเวลา + ปุ่มคัดลอก URL พร้อมเวลาไม่แสดง + + + ลบกล่องโต้ตอบการพิจารณาของผู้ชม + กล่องโต้ตอบจะถูกลบ + กล่องโต้ตอบจะแสดง + สิ่งนี้ไม่ได้ข้ามข้อจำกัดอายุ มันแค่ยอมรับอายุโดยอัตโนมัติ + + + ปิดใช้งานป๊อปอัป \"ลงชื่อเข้าใช้ทีวี\" + ปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว + เปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว + + + ปิดใช้งานการแตะสองครั้งเพื่อข้ามบท + การแตะสองครั้งจะไม่สามารถเรียกให้เกิดการข้ามไปยังบทถัดไป/ก่อนหน้าได้ + การแตะสองครั้งสามารถเรียกให้เกิดการข้ามไปยังบทถัดไป/ก่อนหน้าได้เป็นบางครั้ง + + + การดาวน์โหลดภายนอก + การตั้งค่าสำหรับการใช้โปรแกรมดาวน์โหลดภายนอก + แสดงปุ่มดาวน์โหลดภายนอก + ปุ่มดาวน์โหลดในเครื่องเล่นแสดงอยู่ + ปุ่มดาวน์โหลดในเครื่องเล่นไม่ได้แสดงอยู่ + + แทนที่ปุ่ม \'ดาวน์โหลด\' + ปุ่มดาวน์โหลดเปิดโปรแกรมดาวน์โหลดภายนอกของคุณ + ปุ่มดาวน์โหลดเปิดโปรแกรมดาวน์โหลดในแอปแบบเนทีฟ + ชื่อแพ็คเกจโปรแกรมดาวน์โหลด + ชื่อแพ็กเกจของแอปดาวน์โหลดภายนอกที่คุณติดตั้ง + ป้อนชื่อแพ็กเกจ + อื่น ๆ + ไม่ได้ติดตั้งแอป + %s ไม่ได้ติดตั้ง โปรดติดตั้ง + "ไม่พบแอปที่ติดตั้งด้วยชื่อแพ็กเกจ: %s ตรวจสอบว่าชื่อแพ็กเกจถูกต้องและติดตั้งแอปแล้ว" - ชื่อแพ็กเกจต้องไม่ว่างเปล่า - - - ปิดใช้งานท่าทางการค้นหาแบบแม่นยำ - ท่าทางถูกปิดใช้งาน - ท่าทางถูกเปิดใช้งาน - - - เปิดใช้งานแตะเพื่อค้นหา - แตะเพื่อค้นหาเปิดใช้งานอยู่ - ปิดใช้งานการแตะเพื่อค้นหา - - - เปิดใช้งานท่าทางความสว่าง - "เปิดใช้งานการเลื่อนความสว่างแบบเต็มหน้าจอ + ชื่อแพ็กเกจต้องไม่ว่างเปล่า + + + ปิดใช้งานท่าทางการค้นหาแบบแม่นยำ + ท่าทางถูกปิดใช้งาน + ท่าทางถูกเปิดใช้งาน + + + เปิดใช้งานแตะเพื่อค้นหา + แตะเพื่อค้นหาเปิดใช้งานอยู่ + ปิดใช้งานการแตะเพื่อค้นหา + + + เปิดใช้งานท่าทางความสว่าง + "เปิดใช้งานการเลื่อนความสว่างแบบเต็มหน้าจอ ปรับความสว่างโดยการเลื่อนในแนวตั้งทางด้านซ้ายของหน้าจอ" - ปิดใช้งานการเลื่อนความสว่างแบบเต็มหน้าจอ - เปิดใช้งานท่าทางระดับเสียง - "เปิดใช้งานการปัดระดับเสียงแบบเต็มหน้าจอ\n\nปรับระดับเสียงโดยปัดในแนวตั้งที่ด้านขวาของหน้าจอ" - ปิดใช้งานการปัดระดับเสียงแบบเต็มหน้าจอ - เปิดใช้งานท่าทางกดเพื่อปัด - เปิดใช้งานกดเพื่อปัด - ปิดใช้งานกดเพื่อปัด - เปิดใช้งานการตอบสนองแบบสัมผัส - การตอบสนองแบบสัมผัสถูกเปิดใช้งาน - การตอบสนองแบบสัมผัสถูกปิดใช้งาน - บันทึกและคืนค่าความสว่าง - บันทึกและคืนค่าความสว่างเมื่อออกจากหรือเข้าสู่โหมดเต็มหน้าจอ - อย่าบันทึกและคืนค่าความสว่างเมื่อออกจากหรือเข้าสู่โหมดเต็มหน้าจอ - เปิดใช้งานท่าทางความสว่างอัตโนมัติ - การปัดลงไปที่ค่าต่ำสุดของท่าทางความสว่างจะเปิดใช้งานความสว่างอัตโนมัติ - การปัดลงไปที่ค่าต่ำสุดจะไม่เปิดใช้งานความสว่างอัตโนมัติ - อัตโนมัติ - เวลาหมดอายุของการแสดงทับการปัด - จำนวนมิลลิวินาทีที่การแสดงทับจะมองเห็น - ความทึบแสงพื้นหลังของสไลด์โอเวอร์เลย์ - ค่าความทึบแสงระหว่าง 0-100 - ค่าความทึบแสงของสไลด์ต้องอยู่ระหว่าง 0-100 - สีความสว่างของการซ้อนทับการปัด - สีของแถบความคืบหน้าสำหรับตัวควบคุมความสว่าง - สีระดับเสียงของการซ้อนทับการปัด - สีของแถบความคืบหน้าสำหรับตัวควบคุมระดับเสียง - ขนาดข้อความของการปัด - ขนาดข้อความสำหรับการปัดระหว่าง 1-30 - ขนาดข้อความต้องอยู่ระหว่าง 1-30 - เกณฑ์ขนาดของการปัด - จำนวนเกณฑ์สำหรับการปัดที่จะเกิดขึ้น - ความไวในการปัดปรับระดับเสียง - ปริมาณการเปลี่ยนแปลงระดับเสียงต่อการปัดแต่ละครั้ง - รูปแบบโอเวอร์เลย์การปัด - โอเวอร์เลย์แนวนอน - โอเวอร์เลย์แนวนอน (มินิมอล - ด้านบน) - โอเวอร์เลย์แนวนอน (มินิมอล - ตรงกลาง) - โอเวอร์เลย์แบบวงกลม - โอเวอร์เลย์แบบวงกลม (มินิมอล) - โอเวอร์เลย์แนวตั้ง - โอเวอร์เลย์แนวตั้ง (มินิมอล) - เปิดใช้การปัดเพื่อเปลี่ยนวิดีโอ - การปัดในโหมดเต็มหน้าจอจะเปลี่ยนไปเป็นวิดีโอถัดไป/ก่อนหน้า - การปัดในโหมดเต็มหน้าจอจะไม่เปลี่ยนเป็นวิดีโอถัดไป/ก่อนหน้า - - - ปิดใช้งานคำบรรยายอัตโนมัติ - คำบรรยาย\"Auto\"ถูกปิดใช้งาน - คำบรรยาย\"Auto\"ถูกเปิดใช้งาน - - - ปุ่มการกระทำ - ซ่อนหรือแสดงปุ่มใต้วิดีโอ - ปิดการเรืองแสงถูกใจและติดตาม - ปุ่มถูกใจและกดติดตามจะไม่เรืองแสงเมื่อกล่าวถึง - ปุ่มถูกใจและกดติดตามจะเรืองแสงเมื่อกล่าวถึง - ซ่อนชอบและไม่ชอบ - ปุ่มชอบและไม่ชอบถูกซ่อน - ปุ่มชอบและไม่ชอบถูกแสดง - - ซ่อนแบ่งปัน - ปุ่มแบ่งปันถูกซ่อน - ปุ่มแบ่งปันถูกแสดง - - ซ่อนหยุดโฆษณา - ปุ่มหยุดโฆษณาถูกซ่อน - ปุ่มหยุดโฆษณาถูกแสดง - - ซ่อนความคิดเห็น - ปุ่มความคิดเห็นถูกซ่อน - ปุ่มความคิดเห็นแสดงอยู่ - + ซ่อนแบ่งปัน + ปุ่มแบ่งปันถูกซ่อน + ปุ่มแบ่งปันถูกแสดง + + ซ่อนหยุดโฆษณา + ปุ่มหยุดโฆษณาถูกซ่อน + ปุ่มหยุดโฆษณาถูกแสดง + + ซ่อนความคิดเห็น + ปุ่มความคิดเห็นถูกซ่อน + ปุ่มความคิดเห็นแสดงอยู่ + - ซ่อนรายงาน - ปุ่มรายงานถูกซ่อน - ปุ่มรายงานถูกแสดง - - ซ่อนรีมิกซ์ - ปุ่มรีมิกซ์ถูกซ่อน - ปุ่มรีมิกซ์ถูกแสดง - - ซ่อนดาวน์โหลด - ปุ่มดาวน์โหลดถูกซ่อน - ปุ่มดาวน์โหลดถูกแสดง - + ซ่อนรีมิกซ์ + ปุ่มรีมิกซ์ถูกซ่อน + ปุ่มรีมิกซ์ถูกแสดง + + ซ่อนดาวน์โหลด + ปุ่มดาวน์โหลดถูกซ่อน + ปุ่มดาวน์โหลดถูกแสดง + - ซ่อนกระแส - ปุ่ม Hype ถูกซ่อนอยู่ - ปุ่ม Hype กำลังแสดง - - ซ่อนโปรโมต - ปุ่มโปรโมทถูกซ่อน - ปุ่มโปรโมทแสดงอยู่ - - ซ่อนขอบคุณ - ปุ่มขอบคุณถูกซ่อน - ปุ่มขอบคุณถูกแสดง - + ซ่อนโปรโมต + ปุ่มโปรโมทถูกซ่อน + ปุ่มโปรโมทแสดงอยู่ + + ซ่อนขอบคุณ + ปุ่มขอบคุณถูกซ่อน + ปุ่มขอบคุณถูกแสดง + - ซ่อนปุ่มถาม - ปุ่มถามถูกซ่อนอยู่ - ปุ่มถามแสดงอยู่ - - ซ่อนคลิป - ปุ่มคลิปถูกซ่อน - ปุ่มคลิปถูกแสดง - - ซ่อนร้านค้า - ปุ่มร้านค้าถูกซ่อน - ปุ่มร้านค้าถูกแสดง - - ซ่อนบันทึก - ปุ่มบันทึกถูกซ่อน - ปุ่มบันทึกถูกแสดง - - - ปุ่มนำทาง - ซ่อนหรือเปลี่ยนปุ่มในแถบนำทาง - - ซ่อนหน้าแรก - ปุ่มหน้าแรกถูกซ่อน - ปุ่มหน้าแรกถูกแสดง - - ซ่อน Shorts - ปุ่ม Shorts ถูกซ่อนอยู่ - ปุ่ม Shorts แสดงอยู่ - - ซ่อนสร้าง - ปุ่มสร้างถูกซ่อน - ปุ่มสร้างถูกแสดง - - ซ่อนการสมัครสมาชิก - ปุ่มการสมัครสมาชิกถูกซ่อน - ปุ่มการสมัครสมาชิกถูกแสดง - ซ่อนการแจ้งเตือน - ปุ่มการแจ้งเตือนถูกซ่อนอยู่ - ปุ่มการแจ้งเตือนแสดงอยู่ - - สลับสร้างด้วยการแจ้งเตือน - "ปุ่มสร้างถูกสลับกับปุ่มการแจ้งเตือน + ซ่อนปุ่มถาม + ปุ่มถามถูกซ่อนอยู่ + ปุ่มถามแสดงอยู่ + + ซ่อนคลิป + ปุ่มคลิปถูกซ่อน + ปุ่มคลิปถูกแสดง + + ซ่อนร้านค้า + ปุ่มร้านค้าถูกซ่อน + ปุ่มร้านค้าถูกแสดง + + ซ่อนบันทึก + ปุ่มบันทึกถูกซ่อน + ปุ่มบันทึกถูกแสดง + + + ปุ่มนำทาง + ซ่อนหรือเปลี่ยนปุ่มในแถบนำทาง + + ซ่อนหน้าแรก + ปุ่มหน้าแรกถูกซ่อน + ปุ่มหน้าแรกถูกแสดง + + ซ่อน Shorts + ปุ่ม Shorts ถูกซ่อนอยู่ + ปุ่ม Shorts แสดงอยู่ + + ซ่อนสร้าง + ปุ่มสร้างถูกซ่อน + ปุ่มสร้างถูกแสดง + + ซ่อนการสมัครสมาชิก + ปุ่มการสมัครสมาชิกถูกซ่อน + ปุ่มการสมัครสมาชิกถูกแสดง + ซ่อนการแจ้งเตือน + ปุ่มการแจ้งเตือนถูกซ่อนอยู่ + ปุ่มการแจ้งเตือนแสดงอยู่ + + สลับสร้างด้วยการแจ้งเตือน + "ปุ่มสร้างถูกสลับกับปุ่มการแจ้งเตือน หมายเหตุ: การเปิดใช้งานสิ่งนี้จะซ่อนโฆษณาวิดีโอด้วย" - ปุ่มสร้างไม่ได้ถูกสลับกับปุ่มการแจ้งเตือน - "การปิดใช้งานการตั้งค่านี้จะปิดใช้งานการบล็อกโฆษณา Shorts ด้วย + ปุ่มสร้างไม่ได้ถูกสลับกับปุ่มการแจ้งเตือน + "การปิดใช้งานการตั้งค่านี้จะปิดใช้งานการบล็อกโฆษณา Shorts ด้วย หากการเปลี่ยนการตั้งค่านี้ไม่มีผล ให้ลองสลับไปใช้โหมดไม่ระบุตัวตน" - ซ่อนป้ายกำกับปุ่มนำทาง - ป้ายกำกับถูกซ่อน - ป้ายกำกับถูกแสดง - ปิดใช้งานแถบสถานะแบบโปร่งแสง - แถบสถานะไม่โปร่งแสง - แถบสถานะโปร่งแสงหรือไม่โปร่งแสง - ในอุปกรณ์บางรุ่น การเปิดใช้งานคุณสมบัตินี้อาจเปลี่ยนแถบนำทางระบบให้โปร่งใสได้ - ปิดใช้งานแถบนำทางแบบโปร่งแสงสีอ่อน - แถบนำทางโหมดสว่างเป็นแบบทึบแสง - แถบนำทางโหมดสว่างโปร่งแสงหรือไม่โปร่งแสง - ปิดใช้แถบโปร่งแสงสีเข้ม - แถบนำทางโหมดมืดเป็นแบบทึบแสง - แถบนำทางโหมดมืดโปร่งแสงหรือไม่โปร่งแสง - - - เมนูแบบเลื่อนลง - ซ่อนหรือแสดงรายการเมนูแบบเลื่อนลงของเครื่องเล่น - - ซ่อนคำบรรยาย - เมนูคำบรรยายถูกซ่อน - เมนูคำบรรยายแสดงอยู่ - - ซ่อนการตั้งค่าเพิ่มเติม - เมนูการตั้งค่าเพิ่มเติมซ่อนอยู่ - เมนูการตั้งค่าเพิ่มเติมแสดงอยู่ - - ซ่อนตัวจับเวลาพัก - เมนูตัวจับเวลาพักซ่อนอยู่ - เมนูตัวจับเวลาพักแสดงอยู่ - - ซ่อนการวนซ้ำวิดีโอ - เมนูการวนซ้ำวิดีโอซ่อนอยู่ - เมนูการวนซ้ำวิดีโอแสดงอยู่ - - ซ่อนโหมดพักผ่อน - เมนูโหมดพักผ่อนซ่อนอยู่ - เมนูโหมดพักผ่อนแสดงอยู่ - ซ่อนระดับเสียงคงที่ - เมนูระดับเสียงคงที่แสดงอยู่ - เมนูระดับเสียงคงที่ซ่อนอยู่ - - ซ่อนความช่วยเหลือและข้อเสนอแนะ - เมนูความช่วยเหลือและข้อเสนอแนะซ่อนอยู่ - เมนูความช่วยเหลือและข้อเสนอแนะแสดงอยู่ - - ซ่อนความเร็วในการเล่น - เมนูความเร็วในการเล่นซ่อนอยู่ - เมนูความเร็วในการเล่นแสดงอยู่ - - ซ่อนล็อกหน้าจอ - เมนูล็อกหน้าจอซ่อนอยู่ - เมนูล็อกหน้าจอแสดงอยู่ - - ซ่อนฟังด้วย YouTube Music - เมนูฟังด้วย YouTube Music ถูกซ่อน - เมนูฟังด้วย YouTube Music แสดงอยู่ - - ซ่อนแทร็กเสียง - เมนูแทร็กเสียงซ่อนอยู่ - เมนูแทร็กเสียงแสดงอยู่ - + ซ่อนคำบรรยาย + เมนูคำบรรยายถูกซ่อน + เมนูคำบรรยายแสดงอยู่ + + ซ่อนการตั้งค่าเพิ่มเติม + เมนูการตั้งค่าเพิ่มเติมซ่อนอยู่ + เมนูการตั้งค่าเพิ่มเติมแสดงอยู่ + + ซ่อนตัวจับเวลาพัก + เมนูตัวจับเวลาพักซ่อนอยู่ + เมนูตัวจับเวลาพักแสดงอยู่ + + ซ่อนการวนซ้ำวิดีโอ + เมนูการวนซ้ำวิดีโอซ่อนอยู่ + เมนูการวนซ้ำวิดีโอแสดงอยู่ + + ซ่อนโหมดพักผ่อน + เมนูโหมดพักผ่อนซ่อนอยู่ + เมนูโหมดพักผ่อนแสดงอยู่ + ซ่อนระดับเสียงคงที่ + เมนูระดับเสียงคงที่แสดงอยู่ + เมนูระดับเสียงคงที่ซ่อนอยู่ + + ซ่อนความช่วยเหลือและข้อเสนอแนะ + เมนูความช่วยเหลือและข้อเสนอแนะซ่อนอยู่ + เมนูความช่วยเหลือและข้อเสนอแนะแสดงอยู่ + + ซ่อนความเร็วในการเล่น + เมนูความเร็วในการเล่นซ่อนอยู่ + เมนูความเร็วในการเล่นแสดงอยู่ + + ซ่อนล็อกหน้าจอ + เมนูล็อกหน้าจอซ่อนอยู่ + เมนูล็อกหน้าจอแสดงอยู่ + + ซ่อนฟังด้วย YouTube Music + เมนูฟังด้วย YouTube Music ถูกซ่อน + เมนูฟังด้วย YouTube Music แสดงอยู่ + + ซ่อนแทร็กเสียง + เมนูแทร็กเสียงซ่อนอยู่ + เมนูแทร็กเสียงแสดงอยู่ + - "เมนูแทร็กเสียงถูกซ่อน + "เมนูแทร็กเสียงถูกซ่อน หากต้องการแสดงเมนูแทร็กเสียง ให้เปลี่ยน 'สตรีมวิดีโอปลอม' เป็น 'Android No SDK'" - - ซ่อนดูใน VR - เมนูดูใน VR ซ่อนอยู่ - เมนูดูใน VR แสดงอยู่ - ซ่อนเมนูคุณภาพวิดีโอ - เมนูคุณภาพวิดีโอถูกซ่อน - เมนูคุณภาพวิดีโอแสดงอยู่ - ซ่อนส่วนท้ายเมนูคุณภาพวิดีโอ - ส่วนท้ายเมนูคุณภาพวิดีโอซ่อนอยู่ - ส่วนท้ายเมนูคุณภาพวิดีโอแสดงอยู่ - - - ซ่อนปุ่มเล่นอัตโนมัติ - ปุ่มเล่นอัตโนมัติซ่อนอยู่ - ปุ่มเล่นอัตโนมัติแสดงอยู่ - - ซ่อนปุ่มคำบรรยาย - ปุ่มคำบรรยายซ่อนอยู่ - ปุ่มคำบรรยายแสดงอยู่ - ซ่อนปุ่มส่ง - ปุ่มแคสต์ซ่อนอยู่ - ปุ่มแคสต์แสดงอยู่ - ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น - ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น - แสดงพื้นหลังส่วนควบคุมเครื่องเล่น - ซ่อนปุ่มก่อนหน้า & ถัดไป - ปุ่มซ่อนอยู่ - ปุ่มแสดงอยู่ - - - ซ่อนการ์ดหน้าจอสิ้นสุด - การ์ดหน้าจอสิ้นสุดซ่อนอยู่ - การ์ดหน้าจอสิ้นสุดแสดงอยู่ - - - ปิดใช้งานโหมดแวดล้อมในโหมดเต็มหน้าจอ - โหมดพักผ่อนปิดใช้งาน - โหมดพักผ่อนเปิดใช้งาน - - - ซ่อนการ์ดข้อมูล - บัตรข้อมูลซ่อนอยู่ - บัตรข้อมูลแสดงแล้ว - - - ปิดใช้งานการเคลื่อนไหวตัวเลขแบบหมุน - ตัวเลขแบบหมุนไม่มีการเคลื่อนไหว - ตัวเลขแบบหมุนมีการเคลื่อนไหว - - - ซ่อนแถบเลื่อนของเครื่องเล่นวิดีโอ - แถบเลื่อนเครื่องเล่นวิดีโอซ่อนอยู่ - แถบเลื่อนเครื่องเล่นวิดีโอแสดงอยู่ - - ซ่อนแถบเลื่อนภาพขนาดย่อของวิดีโอ - แถบเลื่อนภาพขนาดย่อของวิดีโอถูกซ่อนอยู่ - แถบเลื่อนภาพขนาดย่อของวิดีโอแสดงอยู่ - - - Shorts Player - ซ่อนหรือแสดงส่วนประกอบเครื่องเล่น Shorts - - ซ่อน Shorts ในหน้าแรก - ซ่อนในหน้าแรกและวิดีโอที่เกี่ยวข้อง - แสดงในหน้าแรกและวิดีโอที่เกี่ยวข้อง - ซ่อน Shorts ในผลลัพธ์การค้นหา - ซ่อนในการค้นหา - แสดงในผลการค้นหา - - ซ่อน Shorts ในฟีดการติดตาม - ซ่อนในฟีดการติดตาม - แสดงในฟีดการติดตาม - ซ่อน \"shorts\" ในประวัติการรับชม - ซ่อนอยู่ในประวัติการรับชม - แสดงในการค้นหา - ซ่อนป้ายกำกับ \"พากย์เสียงอัตโนมัติ\" - ซ่อนป้ายกำกับที่พากย์อัตโนมัติแล้ว - แสดงป้ายกำกับที่พากย์อัตโนมัติแล้ว - ซ่อนปุ่ม \"ซื้อ Super Thanks\" - ปุ่มซื้อ Super Thanks ถูกซ่อนไว้ - ปุ่มซื้อ Super Thanks แสดงอยู่ - ซ่อนปุ่มเอฟเฟกต์ - ปุ่มเอฟเฟกต์ถูกซ่อน - ปุ่มเอฟเฟกต์แสดงอยู่ - ซ่อนปุ่ม \"กรีนสกรีน\" - ปุ่ม Green Screen ถูกซ่อน - ปุ่ม Green Screen แสดงขึ้น - ซ่อนปุ่ม Hashtag - ปุ่ม Hashtag ถูกซ่อน - ปุ่ม Hashtag แสดงขึ้น - - ซ่อนปุ่มเข้าร่วม - ปุ่มเข้าร่วมซ่อนอยู่ - ปุ่มเข้าร่วมแสดงอยู่ - ซ่อนการแสดงตัวอย่างแบบสด - ซ่อนการแสดงตัวอย่างสด - แสดงการแสดงตัวอย่างสด - ซ่อนป้ายกำกับสถานที่ - ป้ายกำกับสถานที่ถูกซ่อน - ป้ายกำกับสถานที่แสดงอยู่ - ซ่อนปุ่ม \"โพสต์ใหม่\" - ปุ่มโพสต์ใหม่ถูกซ่อน - ปุ่มโพสต์ใหม่แสดงอยู่ - ซ่อนปุ่มซ้อนทับหยุดชั่วคราว - ปุ่มซ้อนทับหยุดชั่วคราวซ่อนอยู่ - ปุ่มซ้อนทับหยุดชั่วคราวแสดงอยู่ - ซ่อนความคิดเห็นตัวอย่าง - ซ่อนความคิดเห็นตัวอย่างแล้ว - แสดงตัวอย่างความคิดเห็น - ซ่อนปุ่ม \"บันทึกเพลง\" - ปุ่มบันทึกเพลงถูกซ่อน - ปุ่มบันทึกเพลงแสดงอยู่ - ซ่อนคำแนะนำในการค้นหา - ซ่อนคำแนะนำในการค้นหา - แสดงคำแนะนำในการค้นหา - ซ่อนปุ่มร้านค้า - ปุ่มร้านค้าซ่อนอยู่ - ปุ่มร้านค้าแสดงอยู่ - ซ่อนสติกเกอร์ - ซ่อนสติกเกอร์ - แสดงสติกเกอร์ - ซ่อนปุ่มสมัครใช้ - ปุ่มสมัครรับข้อมูลซ่อนอยู่ - ปุ่มสมัครรับข้อมูลแสดงอยู่ - ซ่อนผลิตภัณฑ์ที่มีแท็ก - ผลิตภัณฑ์ที่มีแท็กถูกซ่อน - ผลิตภัณฑ์ที่มีแท็กแสดงอยู่ - ซ่อนปุ่มที่กำลังจะมาถึง - ปุ่ม «Upcoming» ซ่อนอยู่ - ปุ่ม «Upcoming» แสดงอยู่ - ซ่อนปุ่ม \"ใช้เสียงนี้\" - ปุ่มใช้เสียงนี้ถูกซ่อน - ปุ่มใช้เสียงนี้แสดงอยู่ - ซ่อนปุ่ม \"ใช้เทมเพลตนี้\" - ปุ่มใช้เทมเพลตนี้ถูกซ่อน - ปุ่ม \"ใช้เทมเพลตนี้\" กำลังแสดง - ซ่อนเอฟเฟกต์น้ำพุปุ่มถูกใจ - เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกซ่อนไว้ - เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกแสดงไว้ - ซ่อนปุ่มถูกใจ - ปุ่มไลก์ถูกซ่อนไว้ - ปุ่ม Like เปิดใช้งาน - ซ่อนปุ่มไม่ถูกใจ - ปุ่ม \'ไม่ชอบ\' ถูกซ่อนอยู่ - ปุ่ม \'ไม่ชอบ\' ถูกแสดงอยู่ - ซ่อนปุ่มแสดงความคิดเห็น - ปุ่มความคิดเห็นถูกซ่อนอยู่ - ปุ่มความคิดเห็นถูกแสดงอยู่ - - ซ่อนปุ่มแชร์ - ปุ่มแชร์ถูกซ่อน - \"แชร์\" ปุ่มแสดง - - ซ่อนปุ่มรีมิกซ์ - ปุ่ม \'รีมิกซ์\' ถูกซ่อนอยู่ - \"Remix\" ปุ่มแสดง - ซ่อนปุ่มเสียง - ซ่อนปุ่มเสียง - แสดงปุ่มเสียง - ซ่อนแผงข้อมูล - แผงข้อมูลถูกซ่อน - แผงข้อมูลแสดง - ซ่อนแถบช่อง - ซ่อนแถบช่อง - แสดงแถบช่อง - ซ่อนชื่อวิดีโอ - ชื่อวิดีโอถูกซ่อนไว้ - ชื่อวิดีโอแสดงอยู่ - ซ่อนป้ายเมตามีเดียเสียง - ป้ายกำกับข้อมูลเมตาเสียงถูกซ่อนไว้ - ป้ายกำกับข้อมูลเมตาเสียงแสดงอยู่ - ซ่อนป้ายกำกับลิงก์วิดีโอ - ซ่อนป้ายชื่อลิงก์วิดีโอเต็ม - แสดงป้ายชื่อลิงก์วิดีโอเต็ม - ซ่อนแถบนำทาง - ซ่อนแถบนำทางแล้ว - ไม่ซ่อนแถบนำทาง - - - ซ่อนวิดีโอแนะนำในหน้าจอสิ้นสุด - "วิดีโอแนะนำในหน้าจอสิ้นสุดจะถูกซ่อนเมื่อปิดเล่นอัตโนมัติ + + ซ่อนดูใน VR + เมนูดูใน VR ซ่อนอยู่ + เมนูดูใน VR แสดงอยู่ + ซ่อนเมนูคุณภาพวิดีโอ + เมนูคุณภาพวิดีโอถูกซ่อน + เมนูคุณภาพวิดีโอแสดงอยู่ + ซ่อนส่วนท้ายเมนูคุณภาพวิดีโอ + ส่วนท้ายเมนูคุณภาพวิดีโอซ่อนอยู่ + ส่วนท้ายเมนูคุณภาพวิดีโอแสดงอยู่ + + + ซ่อนปุ่มเล่นอัตโนมัติ + ปุ่มเล่นอัตโนมัติซ่อนอยู่ + ปุ่มเล่นอัตโนมัติแสดงอยู่ + + ซ่อนปุ่มคำบรรยาย + ปุ่มคำบรรยายซ่อนอยู่ + ปุ่มคำบรรยายแสดงอยู่ + ซ่อนปุ่มส่ง + ปุ่มแคสต์ซ่อนอยู่ + ปุ่มแคสต์แสดงอยู่ + ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น + ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น + แสดงพื้นหลังส่วนควบคุมเครื่องเล่น + ซ่อนปุ่มก่อนหน้า & ถัดไป + ปุ่มซ่อนอยู่ + ปุ่มแสดงอยู่ + + + ซ่อนการ์ดหน้าจอสิ้นสุด + การ์ดหน้าจอสิ้นสุดซ่อนอยู่ + การ์ดหน้าจอสิ้นสุดแสดงอยู่ + + + ปิดใช้งานโหมดแวดล้อมในโหมดเต็มหน้าจอ + โหมดพักผ่อนปิดใช้งาน + โหมดพักผ่อนเปิดใช้งาน + + + ซ่อนการ์ดข้อมูล + บัตรข้อมูลซ่อนอยู่ + บัตรข้อมูลแสดงแล้ว + + + ปิดใช้งานการเคลื่อนไหวตัวเลขแบบหมุน + ตัวเลขแบบหมุนไม่มีการเคลื่อนไหว + ตัวเลขแบบหมุนมีการเคลื่อนไหว + + + ซ่อนแถบเลื่อนของเครื่องเล่นวิดีโอ + แถบเลื่อนเครื่องเล่นวิดีโอซ่อนอยู่ + แถบเลื่อนเครื่องเล่นวิดีโอแสดงอยู่ + + ซ่อนแถบเลื่อนภาพขนาดย่อของวิดีโอ + แถบเลื่อนภาพขนาดย่อของวิดีโอถูกซ่อนอยู่ + แถบเลื่อนภาพขนาดย่อของวิดีโอแสดงอยู่ + + + Shorts Player + ซ่อนหรือแสดงส่วนประกอบเครื่องเล่น Shorts + + ซ่อน Shorts ในหน้าแรก + ซ่อนในหน้าแรกและวิดีโอที่เกี่ยวข้อง + แสดงในหน้าแรกและวิดีโอที่เกี่ยวข้อง + ซ่อน Shorts ในผลลัพธ์การค้นหา + ซ่อนในการค้นหา + แสดงในผลการค้นหา + + ซ่อน Shorts ในฟีดการติดตาม + ซ่อนในฟีดการติดตาม + แสดงในฟีดการติดตาม + ซ่อน \"shorts\" ในประวัติการรับชม + ซ่อนอยู่ในประวัติการรับชม + แสดงในการค้นหา + ซ่อนป้ายกำกับ \"พากย์เสียงอัตโนมัติ\" + ซ่อนป้ายกำกับที่พากย์อัตโนมัติแล้ว + แสดงป้ายกำกับที่พากย์อัตโนมัติแล้ว + ซ่อนปุ่ม \"ซื้อ Super Thanks\" + ปุ่มซื้อ Super Thanks ถูกซ่อนไว้ + ปุ่มซื้อ Super Thanks แสดงอยู่ + ซ่อนปุ่มเอฟเฟกต์ + ปุ่มเอฟเฟกต์ถูกซ่อน + ปุ่มเอฟเฟกต์แสดงอยู่ + ซ่อนปุ่ม \"กรีนสกรีน\" + ปุ่ม Green Screen ถูกซ่อน + ปุ่ม Green Screen แสดงขึ้น + ซ่อนปุ่ม Hashtag + ปุ่ม Hashtag ถูกซ่อน + ปุ่ม Hashtag แสดงขึ้น + + ซ่อนปุ่มเข้าร่วม + ปุ่มเข้าร่วมซ่อนอยู่ + ปุ่มเข้าร่วมแสดงอยู่ + ซ่อนการแสดงตัวอย่างแบบสด + ซ่อนการแสดงตัวอย่างสด + แสดงการแสดงตัวอย่างสด + ซ่อนป้ายกำกับสถานที่ + ป้ายกำกับสถานที่ถูกซ่อน + ป้ายกำกับสถานที่แสดงอยู่ + ซ่อนปุ่ม \"โพสต์ใหม่\" + ปุ่มโพสต์ใหม่ถูกซ่อน + ปุ่มโพสต์ใหม่แสดงอยู่ + ซ่อนปุ่มซ้อนทับหยุดชั่วคราว + ปุ่มซ้อนทับหยุดชั่วคราวซ่อนอยู่ + ปุ่มซ้อนทับหยุดชั่วคราวแสดงอยู่ + ซ่อนความคิดเห็นตัวอย่าง + ซ่อนความคิดเห็นตัวอย่างแล้ว + แสดงตัวอย่างความคิดเห็น + ซ่อนปุ่ม \"บันทึกเพลง\" + ปุ่มบันทึกเพลงถูกซ่อน + ปุ่มบันทึกเพลงแสดงอยู่ + ซ่อนคำแนะนำในการค้นหา + ซ่อนคำแนะนำในการค้นหา + แสดงคำแนะนำในการค้นหา + ซ่อนปุ่มร้านค้า + ปุ่มร้านค้าซ่อนอยู่ + ปุ่มร้านค้าแสดงอยู่ + ซ่อนสติกเกอร์ + ซ่อนสติกเกอร์ + แสดงสติกเกอร์ + ซ่อนปุ่มสมัครใช้ + ปุ่มสมัครรับข้อมูลซ่อนอยู่ + ปุ่มสมัครรับข้อมูลแสดงอยู่ + ซ่อนผลิตภัณฑ์ที่มีแท็ก + ผลิตภัณฑ์ที่มีแท็กถูกซ่อน + ผลิตภัณฑ์ที่มีแท็กแสดงอยู่ + ซ่อนปุ่มที่กำลังจะมาถึง + ปุ่ม «Upcoming» ซ่อนอยู่ + ปุ่ม «Upcoming» แสดงอยู่ + ซ่อนปุ่ม \"ใช้เสียงนี้\" + ปุ่มใช้เสียงนี้ถูกซ่อน + ปุ่มใช้เสียงนี้แสดงอยู่ + ซ่อนปุ่ม \"ใช้เทมเพลตนี้\" + ปุ่มใช้เทมเพลตนี้ถูกซ่อน + ปุ่ม \"ใช้เทมเพลตนี้\" กำลังแสดง + ซ่อนเอฟเฟกต์น้ำพุปุ่มถูกใจ + เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกซ่อนไว้ + เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกแสดงไว้ + ซ่อนปุ่มถูกใจ + ปุ่มไลก์ถูกซ่อนไว้ + ปุ่ม Like เปิดใช้งาน + ซ่อนปุ่มไม่ถูกใจ + ปุ่ม \'ไม่ชอบ\' ถูกซ่อนอยู่ + ปุ่ม \'ไม่ชอบ\' ถูกแสดงอยู่ + ซ่อนปุ่มแสดงความคิดเห็น + ปุ่มความคิดเห็นถูกซ่อนอยู่ + ปุ่มความคิดเห็นถูกแสดงอยู่ + + ซ่อนปุ่มแชร์ + ปุ่มแชร์ถูกซ่อน + \"แชร์\" ปุ่มแสดง + + ซ่อนปุ่มรีมิกซ์ + ปุ่ม \'รีมิกซ์\' ถูกซ่อนอยู่ + \"Remix\" ปุ่มแสดง + ซ่อนปุ่มเสียง + ซ่อนปุ่มเสียง + แสดงปุ่มเสียง + ซ่อนแผงข้อมูล + แผงข้อมูลถูกซ่อน + แผงข้อมูลแสดง + ซ่อนแถบช่อง + ซ่อนแถบช่อง + แสดงแถบช่อง + ซ่อนชื่อวิดีโอ + ชื่อวิดีโอถูกซ่อนไว้ + ชื่อวิดีโอแสดงอยู่ + ซ่อนป้ายเมตามีเดียเสียง + ป้ายกำกับข้อมูลเมตาเสียงถูกซ่อนไว้ + ป้ายกำกับข้อมูลเมตาเสียงแสดงอยู่ + ซ่อนป้ายกำกับลิงก์วิดีโอ + ซ่อนป้ายชื่อลิงก์วิดีโอเต็ม + แสดงป้ายชื่อลิงก์วิดีโอเต็ม + ซ่อนแถบนำทาง + ซ่อนแถบนำทางแล้ว + ไม่ซ่อนแถบนำทาง + + + ซ่อนวิดีโอแนะนำในหน้าจอสิ้นสุด + "วิดีโอแนะนำในหน้าจอสิ้นสุดจะถูกซ่อนเมื่อปิดเล่นอัตโนมัติ สามารถเปลี่ยนการเล่นอัตโนมัติได้ในการตั้งค่า YouTube: การตั้งค่า → การเล่น → เล่นวิดีโอถัดไปอัตโนมัติ" - วิดีโอแนะนำในหน้าจอสิ้นสุดจะปรากฏ - - - ซ่อนโอเวอร์เลย์วิดีโอที่เกี่ยวข้อง - โอเวอร์เลย์วิดีโอที่เกี่ยวข้องในโหมดเต็มจอถูกซ่อนไว้ - โอเวอร์เลย์วิดีโอที่เกี่ยวข้องในโหมดเต็มจอแสดงอยู่ - - - ซ่อนเวลาของวิดีโอ - เวลาถูกซ่อนอยู่ - เวลาแสดงอยู่ - - - ซ่อนแผงป๊อปอัปของเครื่องเล่น - แผงป๊อปอัปของเครื่องเล่นถูกซ่อนอยู่ - แผงป๊อปอัปของเครื่องเล่นแสดงอยู่ - - - ออกจากโหมดเต็มหน้าจอเมื่อสิ้นสุดวิดีโอ - ปิดใช้งาน - แนวตั้ง - แนวนอน - แนวตั้งและแนวนอน - - - เปิดวิดีโอในโหมดเต็มหน้าจอสแนวตั้ง - วิดีโอเปิดแบบเต็มหน้าจอ - วิดีโอไม่เปิดแบบเต็มหน้าจอ - - - ความโปร่งใสของการซ้อนทับของเครื่องเล่น - ค่าความโปร่งใสระหว่าง 0-100, โดยที่ 0 คือโปร่งใส - ความทึบของเลเยอร์เล่นวิดีโอต้องอยู่ระหว่าง 0-100 - - - - ไม่สามารถแสดงความไม่ชอบชั่วคราว (API หมดเวลา) - ไม่สามารถแสดงความไม่ชอบได้ (รหัสสถานะ %d) - ไม่สามารถใช้งานการไม่ถูกใจได้ (ข้อจำกัดของ Client API) - ไม่สามารถใช้งาน \"ไม่ชอบ\" ได้ (%s) - - รีโหลดวิดีโอเพื่อลงคะแนนโดยใช้ Return YouTube Dislike - - ซ่อนโดยเจ้าของ - แสดง \"ไม่ชอบ\" - ไม่แสดง \"ไม่ชอบ\" - แสดง \"ไม่ชอบ\" ใน Shorts - "การไม่ถูกใจใน Shorts แสดงอยู่ + วิดีโอแนะนำในหน้าจอสิ้นสุดจะปรากฏ + + + ซ่อนโอเวอร์เลย์วิดีโอที่เกี่ยวข้อง + โอเวอร์เลย์วิดีโอที่เกี่ยวข้องในโหมดเต็มจอถูกซ่อนไว้ + โอเวอร์เลย์วิดีโอที่เกี่ยวข้องในโหมดเต็มจอแสดงอยู่ + + + ซ่อนเวลาของวิดีโอ + เวลาถูกซ่อนอยู่ + เวลาแสดงอยู่ + + + ซ่อนแผงป๊อปอัปของเครื่องเล่น + แผงป๊อปอัปของเครื่องเล่นถูกซ่อนอยู่ + แผงป๊อปอัปของเครื่องเล่นแสดงอยู่ + + + ออกจากโหมดเต็มหน้าจอเมื่อสิ้นสุดวิดีโอ + ปิดใช้งาน + แนวตั้ง + แนวนอน + แนวตั้งและแนวนอน + + + เปิดวิดีโอในโหมดเต็มหน้าจอสแนวตั้ง + วิดีโอเปิดแบบเต็มหน้าจอ + วิดีโอไม่เปิดแบบเต็มหน้าจอ + + + ความโปร่งใสของการซ้อนทับของเครื่องเล่น + ค่าความโปร่งใสระหว่าง 0-100, โดยที่ 0 คือโปร่งใส + ความทึบของเลเยอร์เล่นวิดีโอต้องอยู่ระหว่าง 0-100 + + + + ไม่สามารถแสดงความไม่ชอบชั่วคราว (API หมดเวลา) + ไม่สามารถแสดงความไม่ชอบได้ (รหัสสถานะ %d) + ไม่สามารถใช้งานการไม่ถูกใจได้ (ข้อจำกัดของ Client API) + ไม่สามารถใช้งาน \"ไม่ชอบ\" ได้ (%s) + + รีโหลดวิดีโอเพื่อลงคะแนนโดยใช้ Return YouTube Dislike + + ซ่อนโดยเจ้าของ + แสดง \"ไม่ชอบ\" + ไม่แสดง \"ไม่ชอบ\" + แสดง \"ไม่ชอบ\" ใน Shorts + "การไม่ถูกใจใน Shorts แสดงอยู่ ข้อจำกัด: การไม่ถูกใจอาจไม่ปรากฏในโหมดไม่ระบุตัวตน" - การไม่ถูกใจใน Shorts ไม่ได้แสดงอยู่ - ไม่ชอบ เป็น เปอร์เซ็นต์ - แสดงการไม่ถูกใจเป็นเปอร์เซ็นต์ - แสดงการไม่ถูกใจเป็นตัวเลข - - ปุ่มถูกใจแบบกะทัดรัด - ปุ่ม \"ถูกใจ\" ปรับให้มีขนาดเล็กที่สุด - ปุ่ม \"ถูกใจ\" ปรับให้แสดงผลได้ดีที่สุด - แสดงจำนวนถูกใจโดยประมาณ - วิดีโอที่ปิดการถูกใจจะแสดงจำนวนการถูกใจโดยประมาณ - ไม่แสดงจำนวนการถูกใจโดยประมาณ - แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน - ข้อความแจ้งเตือนแสดงขึ้น หาก Return YouTube Dislike ไม่พร้อมใช้งาน - Toast ไม่ปรากฏขึ้นหาก ไม่สามารถใช้งาน Return YouTube Dislike - ข้อมูลนี้ให้มาโดย Return YouTube Dislike API。 แตะที่นี่เพื่อเรียนรู้เพิ่มเติม - - อุปกรณ์นี้ - เฉลี่ย - น้อยสุด - เวลาการตอบสนอง API สูงสุด - เวลาการตอบสนอง API วิดีโอสุดท้าย - การแสดงจำนวน Dislikes ไม่พร้อมใช้งานชั่วคราว - ขีดจำกัดอัตราการเรียกใช้ API ของไคลเอ็นต์มีผล - API ดึงโหวต จำนวนการเรียก - ไม่มีการเรียกเครือข่าย - %d การเรียกเครือข่าย - API ดึงคะแนนเสียง จำนวนการหมดเวลา - ไม่มีการเรียกเครือข่ายหมดเวลา - การเรียกเครือข่าย %d ครั้งหมดเวลา - ข้อจำกัดอัตราการเรียกใช้ API - เลือนต้องกายการบางาน - %d คุณ ที่ซีแต่องกายการบางาน - %d มิกเวฮราธี - - - ทั้งหละเย้ยนตะโรกเลียด - ทั้งละเย้ยนตะโรกเลียด รตรอกลาดต้อง - ทั้งหละเย้ยนตะโรกเลียด รบกใหม่ยเทศไทย - - - เปิดใช้งานรูปขนาดย่อคุณภาพสูง - รูปขนาดย่อแถบ Seek มีคุณภาพสูง - รูปขนาดย่อแถบ Seek มีคุณภาพปานกลาง - รูปขนาดย่อแถบ Seek แบบเต็มหน้าจอมีคุณภาพปานกลาง - "สิ่งนี้จะคืนค่าภาพขนาดย่อบนการถ่ายทอดสดที่ไม่มีภาพขนาดย่อของแถบเลื่อนด้วย + การไม่ถูกใจใน Shorts ไม่ได้แสดงอยู่ + ไม่ชอบ เป็น เปอร์เซ็นต์ + แสดงการไม่ถูกใจเป็นเปอร์เซ็นต์ + แสดงการไม่ถูกใจเป็นตัวเลข + + ปุ่มถูกใจแบบกะทัดรัด + ปุ่ม \"ถูกใจ\" ปรับให้มีขนาดเล็กที่สุด + ปุ่ม \"ถูกใจ\" ปรับให้แสดงผลได้ดีที่สุด + แสดงจำนวนถูกใจโดยประมาณ + วิดีโอที่ปิดการถูกใจจะแสดงจำนวนการถูกใจโดยประมาณ + ไม่แสดงจำนวนการถูกใจโดยประมาณ + แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน + ข้อความแจ้งเตือนแสดงขึ้น หาก Return YouTube Dislike ไม่พร้อมใช้งาน + Toast ไม่ปรากฏขึ้นหาก ไม่สามารถใช้งาน Return YouTube Dislike + ข้อมูลนี้ให้มาโดย Return YouTube Dislike API。 แตะที่นี่เพื่อเรียนรู้เพิ่มเติม + + อุปกรณ์นี้ + เฉลี่ย + น้อยสุด + เวลาการตอบสนอง API สูงสุด + เวลาการตอบสนอง API วิดีโอสุดท้าย + การแสดงจำนวน Dislikes ไม่พร้อมใช้งานชั่วคราว - ขีดจำกัดอัตราการเรียกใช้ API ของไคลเอ็นต์มีผล + API ดึงโหวต จำนวนการเรียก + ไม่มีการเรียกเครือข่าย + %d การเรียกเครือข่าย + API ดึงคะแนนเสียง จำนวนการหมดเวลา + ไม่มีการเรียกเครือข่ายหมดเวลา + การเรียกเครือข่าย %d ครั้งหมดเวลา + ข้อจำกัดอัตราการเรียกใช้ API + เลือนต้องกายการบางาน + %d คุณ ที่ซีแต่องกายการบางาน + %d มิกเวฮราธี + + + ทั้งหละเย้ยนตะโรกเลียด + ทั้งละเย้ยนตะโรกเลียด รตรอกลาดต้อง + ทั้งหละเย้ยนตะโรกเลียด รบกใหม่ยเทศไทย + + + เปิดใช้งานรูปขนาดย่อคุณภาพสูง + รูปขนาดย่อแถบ Seek มีคุณภาพสูง + รูปขนาดย่อแถบ Seek มีคุณภาพปานกลาง + รูปขนาดย่อแถบ Seek แบบเต็มหน้าจอมีคุณภาพปานกลาง + "สิ่งนี้จะคืนค่าภาพขนาดย่อบนการถ่ายทอดสดที่ไม่มีภาพขนาดย่อของแถบเลื่อนด้วย ภาพขนาดย่อของแถบเลื่อนจะใช้คุณภาพเดียวกับวิดีโอปัจจุบัน คุณสมบัตินี้ทํางานได้ดีที่สุดด้วยคุณภาพวิดีโอ 720p หรือต่ํากว่า และเมื่อใช้การเชื่อมต่ออินเทอร์เน็ตที่รวดเร็วมาก" - คืนค่าภาพขนาดย่อสำหรับแถบเลื่อนแบบเก่า - ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏเหนือแถบเลื่อน - ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏในโหมดเต็มจอ - - - เปิดใช้งาน SponsorBlock - SponsorBlock เป็นระบบ crowdsourced สำหรับการข้ามส่วนที่น่ารำคาญของวิดีโอ YouTube - หน้าตา - แสดงปุ่มโหวต - ปุ่มการโหวตส่วนแสดงอยู่ - ปุ่มการโหวตส่วนไม่แสดงอยู่ - ใช้เลย์เอาต์สี่เหลี่ยมจัตุรัส - ปุ่มและส่วนควบคุมเป็นสี่เหลี่ยมจัตุรัส - ปุ่มและส่วนควบคุมเป็นแบบโค้งมน - - ใช้ปุ่มข้ามขนาดกะทัดรัด - ปุ่มข้ามมีรูปแบบสำหรับความกว้างขั้นต่ำ - ปุ่มข้ามมีรูปแบบสำหรับรูปลักษณ์ที่ดีที่สุด - ซ่อนปุ่มข้ามโดยอัตโนมัติ - ปุ่มข้ามซ่อนหลังจากผ่านไปไม่กี่วินาที - ปุ่มข้ามจะแสดงสำหรับทั้งส่วน - ระยะเวลาปุ่มข้าม - นานแค่ไหนที่จะแสดงปุ่มข้ามและปุ่มข้ามไปยังไฮไลต์ก่อนที่จะซ่อนโดยอัตโนมัติ - แสดงการแจ้งเตือนยกเลิกการข้าม - จะมีการแจ้งเตือนแสดงขึ้นเมื่อมีการข้ามส่วนโดยอัตโนมัติ แตะการแจ้งเตือนแบบชั่วคราวเพื่อยกเลิกการข้าม - ไม่แสดงข้อความแจ้งเตือน - ระยะเวลาข้อความแจ้งเตือนการข้าม - นานแค่ไหนที่จะแสดงแจ้งเตือนยกเลิกการข้าม - 1 วินาที - 2 วินาที - 3 วินาที - 4 วินาที - 5 วินาที - 6 วินาที - 7 วินาที - 8 วินาที - 9 วินาที - 10 วินาที - แสดงความยาววิดีโอโดยไม่มีส่วนต่างๆ - ความยาววิดีโอที่ลบทุกส่วนแล้วจะแสดงบนแถบเวลา - แสดงความยาววิดีโอเต็ม - การสร้างกลุ่มใหม่ - แสดงปุ่มสร้างส่วนใหม่ - ปุ่มสร้างส่วนใหม่แสดงอยู่ - ปุ่มสร้างส่วนใหม่ไม่แสดงอยู่ - ปรับขั้นตอนส่วนใหม่ - จำนวนมิลลิวินาทีที่ปุ่มปรับเวลาเลื่อนเมื่อสร้างส่วนใหม่ - ค่าต้องเป็นจำนวนบวก - ดูหลักเกณฑ์ - แนวทางประกอบด้วยกฎและเคล็ดลับสำหรับการสร้างส่วนใหม่ - ปฏิบัติตามแนวทาง - อ่านแนวทางของ SponsorBlock ก่อนสร้างส่วนใหม่ - อ่านแล้ว - แสดงให้ฉันดู - ทั่วไป - แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน - แสดง «toast» หาก SponsorBlock ไม่พร้อมใช้งาน - «Toast» ไม่แสดงหาก SponsorBlock ไม่พร้อมใช้งาน - เปิดใช้งานการติดตามการนับข้าม - แจ้งให้ SponsorBlock leaderboard ทราบว่าประหยัดเวลาได้มากเพียงใด ข้อความจะถูกส่งไปยัง leaderboard ทุกครั้งที่ข้ามส่วน - การติดตามจำนวนการข้ามไม่ได้เปิดใช้งาน - ระยะเวลาขั้นต่ำของเซ็กเมนต์ - ส่วนที่มีความยาวน้อยกว่าค่านั้น (เป็นวินาที) จะไม่แสดงหรือข้าม - ระยะเวลาไม่ถูกต้อง - รหัสผู้ใช้ส่วนตัวของคุณ - สิ่งนี้จะต้องบันทึกเป็ส่วนตัว เช่นเดียวกับรหัสผ่าน และไม่ควรให้คนอื่นมองเห็น หากเปิดเผยออกไปคนอื่นสามารถสวมรอยเป็นคุณได้ - รหัสผู้ใช้ส่วนตัวต้องมีความยาวอย่างน้อย 30 อักขระ - เปลี่ยน URL ของ API - ที่อยู่ที่ SponsorBlock ใช้ในการโทรหาเซิร์ฟเวอร์ - API URL เปลื่ยนเป็นค่าเริ่มต้นแล้ว - API URL ไม่ถูกต้อง - API URL ถูกเปลื่ยนแล้ว - การตั้งค่า นำเข้า/ส่งออก - คัดลอก - การกำหนดค่า SponsorBlock JSON ของคุณที่สามารถนำเข้า/ส่งออกไปยัง ReVanced และแพลตฟอร์ม SponsorBlock อื่นๆ - การกำหนดค่า SponsorBlock JSON ของคุณที่สามารถนำเข้า/ส่งออกไปยัง ReVanced และแพลตฟอร์ม SponsorBlock อื่นๆ นี่รวมถึงรหัสผู้ใช้ส่วนตัวของคุณ ตรวจสอบให้แน่ใจว่าคุณแบ่งปันสิ่งนี้อย่างชาญฉลาด - การตั้งค่าถูกนำเข้าเรียบร้อยแล้ว - ไม่สามารถนำเข้าได้: %s - ไม่สามารถส่งออกได้: %s - "การตั้งค่าของคุณมี SponsorBlock userid ที่เป็นส่วนตัว + คืนค่าภาพขนาดย่อสำหรับแถบเลื่อนแบบเก่า + ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏเหนือแถบเลื่อน + ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏในโหมดเต็มจอ + + + เปิดใช้งาน SponsorBlock + SponsorBlock เป็นระบบ crowdsourced สำหรับการข้ามส่วนที่น่ารำคาญของวิดีโอ YouTube + หน้าตา + แสดงปุ่มโหวต + ปุ่มการโหวตส่วนแสดงอยู่ + ปุ่มการโหวตส่วนไม่แสดงอยู่ + ใช้เลย์เอาต์สี่เหลี่ยมจัตุรัส + ปุ่มและส่วนควบคุมเป็นสี่เหลี่ยมจัตุรัส + ปุ่มและส่วนควบคุมเป็นแบบโค้งมน + + ใช้ปุ่มข้ามขนาดกะทัดรัด + ปุ่มข้ามมีรูปแบบสำหรับความกว้างขั้นต่ำ + ปุ่มข้ามมีรูปแบบสำหรับรูปลักษณ์ที่ดีที่สุด + ซ่อนปุ่มข้ามโดยอัตโนมัติ + ปุ่มข้ามซ่อนหลังจากผ่านไปไม่กี่วินาที + ปุ่มข้ามจะแสดงสำหรับทั้งส่วน + ระยะเวลาปุ่มข้าม + นานแค่ไหนที่จะแสดงปุ่มข้ามและปุ่มข้ามไปยังไฮไลต์ก่อนที่จะซ่อนโดยอัตโนมัติ + แสดงการแจ้งเตือนยกเลิกการข้าม + จะมีการแจ้งเตือนแสดงขึ้นเมื่อมีการข้ามส่วนโดยอัตโนมัติ แตะการแจ้งเตือนแบบชั่วคราวเพื่อยกเลิกการข้าม + ไม่แสดงข้อความแจ้งเตือน + ระยะเวลาข้อความแจ้งเตือนการข้าม + นานแค่ไหนที่จะแสดงแจ้งเตือนยกเลิกการข้าม + 1 วินาที + 2 วินาที + 3 วินาที + 4 วินาที + 5 วินาที + 6 วินาที + 7 วินาที + 8 วินาที + 9 วินาที + 10 วินาที + แสดงความยาววิดีโอโดยไม่มีส่วนต่างๆ + ความยาววิดีโอที่ลบทุกส่วนแล้วจะแสดงบนแถบเวลา + แสดงความยาววิดีโอเต็ม + การสร้างกลุ่มใหม่ + แสดงปุ่มสร้างส่วนใหม่ + ปุ่มสร้างส่วนใหม่แสดงอยู่ + ปุ่มสร้างส่วนใหม่ไม่แสดงอยู่ + ปรับขั้นตอนส่วนใหม่ + จำนวนมิลลิวินาทีที่ปุ่มปรับเวลาเลื่อนเมื่อสร้างส่วนใหม่ + ค่าต้องเป็นจำนวนบวก + ดูหลักเกณฑ์ + แนวทางประกอบด้วยกฎและเคล็ดลับสำหรับการสร้างส่วนใหม่ + ปฏิบัติตามแนวทาง + อ่านแนวทางของ SponsorBlock ก่อนสร้างส่วนใหม่ + อ่านแล้ว + แสดงให้ฉันดู + ทั่วไป + แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน + แสดง «toast» หาก SponsorBlock ไม่พร้อมใช้งาน + «Toast» ไม่แสดงหาก SponsorBlock ไม่พร้อมใช้งาน + เปิดใช้งานการติดตามการนับข้าม + แจ้งให้ SponsorBlock leaderboard ทราบว่าประหยัดเวลาได้มากเพียงใด ข้อความจะถูกส่งไปยัง leaderboard ทุกครั้งที่ข้ามส่วน + การติดตามจำนวนการข้ามไม่ได้เปิดใช้งาน + ระยะเวลาขั้นต่ำของเซ็กเมนต์ + ส่วนที่มีความยาวน้อยกว่าค่านั้น (เป็นวินาที) จะไม่แสดงหรือข้าม + ระยะเวลาไม่ถูกต้อง + รหัสผู้ใช้ส่วนตัวของคุณ + สิ่งนี้จะต้องบันทึกเป็ส่วนตัว เช่นเดียวกับรหัสผ่าน และไม่ควรให้คนอื่นมองเห็น หากเปิดเผยออกไปคนอื่นสามารถสวมรอยเป็นคุณได้ + รหัสผู้ใช้ส่วนตัวต้องมีความยาวอย่างน้อย 30 อักขระ + เปลี่ยน URL ของ API + ที่อยู่ที่ SponsorBlock ใช้ในการโทรหาเซิร์ฟเวอร์ + API URL เปลื่ยนเป็นค่าเริ่มต้นแล้ว + API URL ไม่ถูกต้อง + API URL ถูกเปลื่ยนแล้ว + การตั้งค่า นำเข้า/ส่งออก + คัดลอก + การกำหนดค่า SponsorBlock JSON ของคุณที่สามารถนำเข้า/ส่งออกไปยัง ReVanced และแพลตฟอร์ม SponsorBlock อื่นๆ + การกำหนดค่า SponsorBlock JSON ของคุณที่สามารถนำเข้า/ส่งออกไปยัง ReVanced และแพลตฟอร์ม SponsorBlock อื่นๆ นี่รวมถึงรหัสผู้ใช้ส่วนตัวของคุณ ตรวจสอบให้แน่ใจว่าคุณแบ่งปันสิ่งนี้อย่างชาญฉลาด + การตั้งค่าถูกนำเข้าเรียบร้อยแล้ว + ไม่สามารถนำเข้าได้: %s + ไม่สามารถส่งออกได้: %s + "การตั้งค่าของคุณมี SponsorBlock userid ที่เป็นส่วนตัว User id ของคุณเหมือนกับรหัสผ่าน และไม่ควรแชร์ " - อย่าแสดงอีก - เปลี่ยนพฤติกรรมของส่วน - สปอนเซอร์ - การโปรโมตแบบชำระเงิน การแนะนำแบบชำระเงิน และโฆษณาโดยตรง ไม่ใช่สำหรับการโปรโมตตัวเองหรือการตะโกนฟรีให้กับสาเหตุ/ผู้สร้าง/เว็บไซต์/ผลิตภัณฑ์ที่พวกเขาชอบ - ไม่ได้จ่ายชำระ/โปรโมทตนเอง - คล้ายกับ SponsorBlock ยกเว้นการโปรโมตตัวเองหรือการที่ไม่ได้รับการชำระเงิน รวมถึงส่วนต่างๆ เกี่ยวกับสินค้า บริจาค หรือข้อมูลเกี่ยวกับผู้ที่พวกเขาทำงานร่วมกัน - แจ้งเตือนการกด (ติดตาม) - การเตือนสั้นๆ เพื่อให้ชอบ สมัครรับข้อมูล หรือติดตามพวกเขาในช่วงกลางของเนื้อหา หากยาวหรือเกี่ยวกับบางสิ่งบางอย่างโดยเฉพาะ ควรอยู่ภายใต้การโปรโมตตัวเองแทน - ไฮไลต์ - ส่วนของวิดีโอที่คนส่วนใหญ่กำลังมองหา - แอนิเมชั่นช่วงพัก/ช่วงต้น - ช่วงเวลาที่ไม่มีเนื้อหาจริง อาจเป็นการหยุดชั่วคราว เฟรมนิ่ง หรือภาพเคลื่อนไหวซ้ำๆ ไม่รวมการเปลี่ยนแปลงที่มีข้อมูล - ฉากจบ / เครดิต - เครดิตหรือเมื่อบัตรสิ้นสุด YouTube ปรากฏขึ้น ไม่ใช่สำหรับข้อสรุปที่มีข้อมูล - การเกริ่นนำ / คำทักทาย - ตัวอย่างที่บรรยายสำหรับวิดีโอที่จะมาถึง, คำทักทายและคำอำลา ไม่รวมส่วนที่เพิ่มเนื้อหาเพิ่มเติม - ตัวอย่าง / สรุป - คอลเล็กชันของคลิปที่แสดงว่าจะมีอะไรเกิดขึ้นหรือเกิดอะไรขึ้นในวิดีโอหรือในวิดีโออื่นๆ ของซีรีส์ ซึ่งข้อมูลทั้งหมดจะถูกทำซ้ำในที่อื่นๆ - นอกเรื่อง / เรื่องตลก - ฉากนอกเรื่องหรือเรื่องตลกที่ไม่จำเป็นต่อการทำความเข้าใจเนื้อหาหลักของวิดีโอ ไม่รวมส่วนที่ให้บริบทหรือรายละเอียดเบื้องหลัง - เพลง: ไม่พบเพลง - สำหรับใช้ในมิวสิควิดีโอเท่านั้น ส่วนของมิวสิควิดีโอที่ไม่มีเพลง ซึ่งไม่ได้รับการครอบคลุมโดยหมวดหมู่อื่นๆ อยู่แล้ว - ข้าม - ไฮไลต์ - ข้ามผู้สนับสนุน - ข้ามโปรโมชั่น - ข้ามการโต้ตอบ - ข้ามไปยังไฮไลต์ - ข้ามส่วนนำ - ข้ามช่วงพัก - ข้ามช่วงพัก - ข้ามส่วนท้าย - ข้ามช่วงเริ่ม - ข้ามตัวอย่าง - ข้ามตัวอย่าง - ข้ามสรุป - ข้ามช่วงแทรก - ข้ามส่วนที่ไม่มีเพลง - ข้ามส่วนนี้ - ข้ามสปอนเซอร์แล้ว - ข้ามการโปรโมทตัวเองแล้ว - ข้ามการแจ้งเตือนที่น่ารำคาญแล้ว - ข้ามไปยังไฮไลต์ - ข้ามอินโทรแล้ว - ข้ามช่วงพัก - ข้ามช่วงพัก - ข้ามเอ้าท์โทรแล้ว - ข้ามช่วงเริ่มแล้ว - ข้ามตัวอย่างแล้ว - ข้ามตัวอย่างแล้ว - ข้ามสรุป - ข้ามช่วงแทรกแล้ว - ข้ามช่วงไม่มีเพลงแล้ว - ข้ามส่วนที่ไม่ได้รับการยืนยันแล้ว - ข้ามหลายส่วน - ข้ามอัตโนมัติ - ข้ามโดยอัตโนมัติหนึ่งครั้ง - แสดงปุ่มข้าม - แสดงในแถบเลื่อน - ปิดการใช้งาน - ไม่สามารถส่งส่วน: %s - SponsorBlock ไม่พร้อมใช้งานชั่วคราว - ไม่สามารถส่งส่วน (สถานะ: %1$d %2$s) - ไม่สามารถส่งส่วนได้ จํากัดอัตรา (มากเกินไปจากผู้ใช้หรือ IP เดียวกัน) - ไม่สามารถส่งส่วน: %s - "ไม่สามารถส่งส่วนได้ + อย่าแสดงอีก + เปลี่ยนพฤติกรรมของส่วน + สปอนเซอร์ + การโปรโมตแบบชำระเงิน การแนะนำแบบชำระเงิน และโฆษณาโดยตรง ไม่ใช่สำหรับการโปรโมตตัวเองหรือการตะโกนฟรีให้กับสาเหตุ/ผู้สร้าง/เว็บไซต์/ผลิตภัณฑ์ที่พวกเขาชอบ + ไม่ได้จ่ายชำระ/โปรโมทตนเอง + คล้ายกับ SponsorBlock ยกเว้นการโปรโมตตัวเองหรือการที่ไม่ได้รับการชำระเงิน รวมถึงส่วนต่างๆ เกี่ยวกับสินค้า บริจาค หรือข้อมูลเกี่ยวกับผู้ที่พวกเขาทำงานร่วมกัน + แจ้งเตือนการกด (ติดตาม) + การเตือนสั้นๆ เพื่อให้ชอบ สมัครรับข้อมูล หรือติดตามพวกเขาในช่วงกลางของเนื้อหา หากยาวหรือเกี่ยวกับบางสิ่งบางอย่างโดยเฉพาะ ควรอยู่ภายใต้การโปรโมตตัวเองแทน + ไฮไลต์ + ส่วนของวิดีโอที่คนส่วนใหญ่กำลังมองหา + แอนิเมชั่นช่วงพัก/ช่วงต้น + ช่วงเวลาที่ไม่มีเนื้อหาจริง อาจเป็นการหยุดชั่วคราว เฟรมนิ่ง หรือภาพเคลื่อนไหวซ้ำๆ ไม่รวมการเปลี่ยนแปลงที่มีข้อมูล + ฉากจบ / เครดิต + เครดิตหรือเมื่อบัตรสิ้นสุด YouTube ปรากฏขึ้น ไม่ใช่สำหรับข้อสรุปที่มีข้อมูล + การเกริ่นนำ / คำทักทาย + ตัวอย่างที่บรรยายสำหรับวิดีโอที่จะมาถึง, คำทักทายและคำอำลา ไม่รวมส่วนที่เพิ่มเนื้อหาเพิ่มเติม + ตัวอย่าง / สรุป + คอลเล็กชันของคลิปที่แสดงว่าจะมีอะไรเกิดขึ้นหรือเกิดอะไรขึ้นในวิดีโอหรือในวิดีโออื่นๆ ของซีรีส์ ซึ่งข้อมูลทั้งหมดจะถูกทำซ้ำในที่อื่นๆ + นอกเรื่อง / เรื่องตลก + ฉากนอกเรื่องหรือเรื่องตลกที่ไม่จำเป็นต่อการทำความเข้าใจเนื้อหาหลักของวิดีโอ ไม่รวมส่วนที่ให้บริบทหรือรายละเอียดเบื้องหลัง + เพลง: ไม่พบเพลง + สำหรับใช้ในมิวสิควิดีโอเท่านั้น ส่วนของมิวสิควิดีโอที่ไม่มีเพลง ซึ่งไม่ได้รับการครอบคลุมโดยหมวดหมู่อื่นๆ อยู่แล้ว + ข้าม + ไฮไลต์ + ข้ามผู้สนับสนุน + ข้ามโปรโมชั่น + ข้ามการโต้ตอบ + ข้ามไปยังไฮไลต์ + ข้ามส่วนนำ + ข้ามช่วงพัก + ข้ามช่วงพัก + ข้ามส่วนท้าย + ข้ามช่วงเริ่ม + ข้ามตัวอย่าง + ข้ามตัวอย่าง + ข้ามสรุป + ข้ามช่วงแทรก + ข้ามส่วนที่ไม่มีเพลง + ข้ามส่วนนี้ + ข้ามสปอนเซอร์แล้ว + ข้ามการโปรโมทตัวเองแล้ว + ข้ามการแจ้งเตือนที่น่ารำคาญแล้ว + ข้ามไปยังไฮไลต์ + ข้ามอินโทรแล้ว + ข้ามช่วงพัก + ข้ามช่วงพัก + ข้ามเอ้าท์โทรแล้ว + ข้ามช่วงเริ่มแล้ว + ข้ามตัวอย่างแล้ว + ข้ามตัวอย่างแล้ว + ข้ามสรุป + ข้ามช่วงแทรกแล้ว + ข้ามช่วงไม่มีเพลงแล้ว + ข้ามส่วนที่ไม่ได้รับการยืนยันแล้ว + ข้ามหลายส่วน + ข้ามอัตโนมัติ + ข้ามโดยอัตโนมัติหนึ่งครั้ง + แสดงปุ่มข้าม + แสดงในแถบเลื่อน + ปิดการใช้งาน + ไม่สามารถส่งส่วน: %s + SponsorBlock ไม่พร้อมใช้งานชั่วคราว + ไม่สามารถส่งส่วน (สถานะ: %1$d %2$s) + ไม่สามารถส่งส่วนได้ จํากัดอัตรา (มากเกินไปจากผู้ใช้หรือ IP เดียวกัน) + ไม่สามารถส่งส่วน: %s + "ไม่สามารถส่งส่วนได้ มีอยู่แล้ว" - ส่งคำขอของคุณสำเร็จ - - SponsorBlock ไม่พร้อมใช้งานชั่วคราว (API หมดเวลา) - SponsorBlock ไม่พร้อมใช้งานชั่วคราว (สถานะ %d) - SponsorBlock ไม่พร้อมใช้งานชั่วคราว - ไม่สามารถโหวตส่วน (API หมดเวลา) - ไม่สามารถโหวตส่วน (สถานะ: %1$d %2$s) - ไม่สามารถโหวตส่วน: %s - โหวตขึ้น - โหวตลง - เปลี่ยนหมวดหมู่ - ไม่มีส่วนใดจะให้โหวต - - %1$s ถึง %2$s - กรุณาเลือกหมวดหมู่ของส่วน - หมวดหมู่ถูกปิดใช้งานใน การตั้งค่า เปิดใช้งานหมวดหมู่เพื่อส่ง - SponsorBlockส่วนใหม่ - ตั้ง %s เป็นจุดเริ่มต้นหรือจุดสิ้นสุดของส่วนใหม่? - เริ่มต้น - สิ้นสุด - ตอนนี้ - เวลาที่เริ่มต้นส่วนนี้ - เวลาที่จบส่วนนี้ - เวลานี้ถูกต้องไหม? - "ส่วนนี้มาจาก + ส่งคำขอของคุณสำเร็จ + + SponsorBlock ไม่พร้อมใช้งานชั่วคราว (API หมดเวลา) + SponsorBlock ไม่พร้อมใช้งานชั่วคราว (สถานะ %d) + SponsorBlock ไม่พร้อมใช้งานชั่วคราว + ไม่สามารถโหวตส่วน (API หมดเวลา) + ไม่สามารถโหวตส่วน (สถานะ: %1$d %2$s) + ไม่สามารถโหวตส่วน: %s + โหวตขึ้น + โหวตลง + เปลี่ยนหมวดหมู่ + ไม่มีส่วนใดจะให้โหวต + + %1$s ถึง %2$s + กรุณาเลือกหมวดหมู่ของส่วน + หมวดหมู่ถูกปิดใช้งานใน การตั้งค่า เปิดใช้งานหมวดหมู่เพื่อส่ง + SponsorBlockส่วนใหม่ + ตั้ง %s เป็นจุดเริ่มต้นหรือจุดสิ้นสุดของส่วนใหม่? + เริ่มต้น + สิ้นสุด + ตอนนี้ + เวลาที่เริ่มต้นส่วนนี้ + เวลาที่จบส่วนนี้ + เวลานี้ถูกต้องไหม? + "ส่วนนี้มาจาก %1$s ถึง @@ -1280,46 +1279,46 @@ User id ของคุณเหมือนกับรหัสผ่าน (%3$s) พร้อมที่จะส่งหรือยัง?" - จุดเริ่มต้นต้องอยู่ก่อนจุดสิ้นสุด - กำหนดจุดบนเส้นเวลาก่อน - ดูตัวอย่างส่วน และตรวจสอบ - แก้ไขส่วนแบบมือ - คุณต้องการแก้ไขจุดเริ่มต้นและจุดจบของส่วนนี้ไหม? - ค่าเวลาที่ให้มาผิดพลาด - สถิติ - - สถิติไม่พร้อมใช้งานชั่วคราว (API ไม่ทำงาน) - กำลังโหลด... - SponsorBlock ถูกปิดการใช้งาน - ชื่อผู้ใช้ของคุณ: <b>%s</b> - แตะที่นี่เพื่อเปลี่ยนชื่อผู้ใช้ของคุณ - ไม่สามารถเปลื่ยนชื่อ: สถานะ: %1$d %2$s - เปลื่ยนชื่อเรียบร้อยแล้ว - ชื่อเสียงของคุณคือ <b>%.2f</b> - คุณสร้างส่วน <b>%s</b> - แตะที่นี่เพื่อดูส่วนของคุณ - กระดานผู้นำ SponsorBlock - คุณช่วยคนจากส่วน <b>%s</b> - แตะที่นี่เพื่อดูสถิติทั่วโลกและผู้มีส่วนร่วมสูงสุด - นั่นคือ <b>%s</b> ของชีวิตของพวกเขา<br>แตะที่นี่เพื่อดูกระดานผู้นำ - คุณข้ามส่วน <b>%s</b> - นั่นคือ <b>%s</b> - รีเซ็ตตัวนับส่วนที่ข้ามไป? - %1$s ชั่วโมง %2$s นาที - %1$s นาที %2$s วินาที - %s วินาที - ความทึบ: - สี: - เกี่ยวกับ - ข้อมูลนี้มาจาก SponsorBlock API แตะที่นี่เพื่อเรียนรู้เพิ่มเติมและดูการดาวน์โหลดสำหรับแพลตฟอร์มอื่น ๆ - - - รูปแบบเค้าโครง - ค่าเริ่มต้น - โทรศัพท์ - แท็บเล็ต - ยานยนต์ - "การเปลี่ยนแปลงรวมถึง: + จุดเริ่มต้นต้องอยู่ก่อนจุดสิ้นสุด + กำหนดจุดบนเส้นเวลาก่อน + ดูตัวอย่างส่วน และตรวจสอบ + แก้ไขส่วนแบบมือ + คุณต้องการแก้ไขจุดเริ่มต้นและจุดจบของส่วนนี้ไหม? + ค่าเวลาที่ให้มาผิดพลาด + สถิติ + + สถิติไม่พร้อมใช้งานชั่วคราว (API ไม่ทำงาน) + กำลังโหลด... + SponsorBlock ถูกปิดการใช้งาน + ชื่อผู้ใช้ของคุณ: <b>%s</b> + แตะที่นี่เพื่อเปลี่ยนชื่อผู้ใช้ของคุณ + ไม่สามารถเปลื่ยนชื่อ: สถานะ: %1$d %2$s + เปลื่ยนชื่อเรียบร้อยแล้ว + ชื่อเสียงของคุณคือ <b>%.2f</b> + คุณสร้างส่วน <b>%s</b> + แตะที่นี่เพื่อดูส่วนของคุณ + กระดานผู้นำ SponsorBlock + คุณช่วยคนจากส่วน <b>%s</b> + แตะที่นี่เพื่อดูสถิติทั่วโลกและผู้มีส่วนร่วมสูงสุด + นั่นคือ <b>%s</b> ของชีวิตของพวกเขา<br>แตะที่นี่เพื่อดูกระดานผู้นำ + คุณข้ามส่วน <b>%s</b> + นั่นคือ <b>%s</b> + รีเซ็ตตัวนับส่วนที่ข้ามไป? + %1$s ชั่วโมง %2$s นาที + %1$s นาที %2$s วินาที + %s วินาที + ความทึบ: + สี: + เกี่ยวกับ + ข้อมูลนี้มาจาก SponsorBlock API แตะที่นี่เพื่อเรียนรู้เพิ่มเติมและดูการดาวน์โหลดสำหรับแพลตฟอร์มอื่น ๆ + + + รูปแบบเค้าโครง + ค่าเริ่มต้น + โทรศัพท์ + แท็บเล็ต + ยานยนต์ + "การเปลี่ยนแปลงรวมถึง: รูปแบบแท็บเล็ต • โพสต์ชุมชนถูกซ่อน @@ -1327,316 +1326,314 @@ User id ของคุณเหมือนกับรหัสผ่าน รูปแบบยานยนต์ • Shorts เปิดในเครื่องเล่นปกติ • ฟีดจัดระเบียบตามหัวข้อและช่อง" - - - ปลอมแปลงเวอร์ชันแอป - เวอร์ชันปลอมแปลง - เวอร์ชันไม่ได้ปลอมแปลง - "เวอร์ชันแอปจะถูกปลอมแปลงเป็นเวอร์ชันเก่าของ YouTube + + + ปลอมแปลงเวอร์ชันแอป + เวอร์ชันปลอมแปลง + เวอร์ชันไม่ได้ปลอมแปลง + "เวอร์ชันแอปจะถูกปลอมแปลงเป็นเวอร์ชันเก่าของ YouTube สิ่งนี้จะเปลี่ยนรูปลักษณ์และคุณสมบัติของแอป แต่ผลข้างเคียงที่ไม่คาดคิดอาจเกิดขึ้น ถ้าปิดในภายหลัง ขอแนะนําให้ล้างข้อมูลแอปเพื่อป้องกันข้อผิดพลาดของ UI" - เป้าหมายการปลอมแปลงเวอร์ชันแอป - 20.13.41 - กู้คืนแถบการทำงานของวิดีโอที่ไม่ได้ยุบ - 20.05.46 - คืนค่าฟังก์ชันถอดเสียง - 19.35.36 - คืนค่าไอคอนเครื่องเล่น Shorts เก่า - 19.01.34 - กู้คืนไอคอนการนำทางแบบเก่า - - - เปลี่ยนหน้าเริ่มต้น - ค่าเริ่มต้น - สยงสนดการตเปนี - เรียกดูช่อง - เก็บค์คสตตว์อก / คมีนคร - สำรวจ - แฟชั่น \u0026 ความงาม - เกม - ประวัติ - คลัง - วิดีโอที่ชอบ - สด - ภาพยนตร์ - เพลง - เริง - บริค์ซ์ - แพล่งของ - ค้นหา - ช็อปปิ้ง - กีฬา - สมัครสมาชิก - กำลังมาแรง - กทบทาคส์ชียอลัด - ดูต่อภายหลัง - คลิปของคุณ - เปลี่ยนหน้าเริ่มต้นเสมอ - "หน้าเริ่มต้นมีการเปลี่ยนแปลงเสมอ + เป้าหมายการปลอมแปลงเวอร์ชันแอป + 20.13.41 - กู้คืนแถบการทำงานของวิดีโอที่ไม่ได้ยุบ + 20.05.46 - คืนค่าฟังก์ชันถอดเสียง + 19.35.36 - คืนค่าไอคอนเครื่องเล่น Shorts เก่า + 19.01.34 - กู้คืนไอคอนการนำทางแบบเก่า + + + เปลี่ยนหน้าเริ่มต้น + ค่าเริ่มต้น + สยงสนดการตเปนี + เรียกดูช่อง + เก็บค์คสตตว์อก / คมีนคร + สำรวจ + แฟชั่น \u0026 ความงาม + เกม + ประวัติ + คลัง + วิดีโอที่ชอบ + สด + ภาพยนตร์ + เพลง + เริง + บริค์ซ์ + แพล่งของ + ค้นหา + ช็อปปิ้ง + กีฬา + สมัครสมาชิก + กำลังมาแรง + กทบทาคส์ชียอลัด + ดูต่อภายหลัง + คลิปของคุณ + เปลี่ยนหน้าเริ่มต้นเสมอ + "หน้าเริ่มต้นมีการเปลี่ยนแปลงเสมอ ข้อจำกัด: การใช้ปุ่มย้อนกลับบนแถบเครื่องมืออาจใช้ไม่ได้" - หน้าเริ่มต้นจะเปลี่ยนเมื่อเริ่มแอปเท่านั้น - - - ปิดใช้งานการกลับมาทำงานต่อของเครื่องเล่น Shorts - เครื่องเล่น Shorts จะไม่กลับมาทำงานต่อเมื่อเริ่มต้นแอป - เครื่องเล่น Shorts จะกลับมาทำงานต่อเมื่อเริ่มต้นแอป - - - เปิด \"Shorts\" ด้วย - Shorts Player - เครื่องเล่นปกติ - เครื่องเล่นปกติ (เต็มหน้าจอ) - - - เล่น Shorts อัตโนมัติ - Shorts จะเล่นอัตโนมัติ - Shorts จะวนซ้ำ - เล่น Shorts อัตโนมัติแบบพื้นหลัง - การเล่น Shorts แบบพื้นหลังจะเล่นอัตโนมัติ - การเล่น Shorts แบบพื้นหลังจะวนซ้ำ - - - มินิเพลเยอร์ - เปลี่ยนรูปแบบของเครื่องเล่นขนาดเล็กในแอป - ประเภทของเครื่องเล่นย่อขนาด - ปิดการใช้งานอยู่ - ค่าเริ่มต้น - น้อยที่สุด - แท็บเล็ต - ทันสมัย 1 - ทันสมัย 2 - ทันสมัย 3 - ทันสมัย 4 - ปิดใช้งานมุมโค้งมน - มุมเป็นสี่เหลี่ยม - มุมโค้งมน - เปิดใช้งานการแตะสองครั้งและการบีบเพื่อปรับขนาด - "การกระทำแตะสองครั้ง และการบีบเพื่อปรับขนาด เปิดใช้งาน + หน้าเริ่มต้นจะเปลี่ยนเมื่อเริ่มแอปเท่านั้น + + + ปิดใช้งานการกลับมาทำงานต่อของเครื่องเล่น Shorts + เครื่องเล่น Shorts จะไม่กลับมาทำงานต่อเมื่อเริ่มต้นแอป + เครื่องเล่น Shorts จะกลับมาทำงานต่อเมื่อเริ่มต้นแอป + + + เปิด \"Shorts\" ด้วย + Shorts Player + เครื่องเล่นปกติ + เครื่องเล่นปกติ (เต็มหน้าจอ) + + + เล่น Shorts อัตโนมัติ + Shorts จะเล่นอัตโนมัติ + Shorts จะวนซ้ำ + เล่น Shorts อัตโนมัติแบบพื้นหลัง + การเล่น Shorts แบบพื้นหลังจะเล่นอัตโนมัติ + การเล่น Shorts แบบพื้นหลังจะวนซ้ำ + + + มินิเพลเยอร์ + เปลี่ยนรูปแบบของเครื่องเล่นขนาดเล็กในแอป + ประเภทของเครื่องเล่นย่อขนาด + ปิดการใช้งานอยู่ + ค่าเริ่มต้น + น้อยที่สุด + แท็บเล็ต + ทันสมัย 1 + ทันสมัย 2 + ทันสมัย 3 + ทันสมัย 4 + ปิดใช้งานมุมโค้งมน + มุมเป็นสี่เหลี่ยม + มุมโค้งมน + เปิดใช้งานการแตะสองครั้งและการบีบเพื่อปรับขนาด + "การกระทำแตะสองครั้ง และการบีบเพื่อปรับขนาด เปิดใช้งาน • แตะสองครั้งเพื่อเพิ่มขนาด miniplayer • แตะสองครั้งอีกครั้งเพื่อคืนค่าขนาดเดิม" - การแตะสองครั้งและการบีบเพื่อปรับขนาดปิดใช้งานแล้ว - ปิดใช้งานการลากและวาง - การลากและวางปิดใช้งานแล้ว - "ลากและวาง เปิดใช้งาน + การแตะสองครั้งและการบีบเพื่อปรับขนาดปิดใช้งานแล้ว + ปิดใช้งานการลากและวาง + การลากและวางปิดใช้งานแล้ว + "ลากและวาง เปิดใช้งาน สามารถลาก miniplayer ไปยังมุมใดๆ ของหน้าจอ" - ปิดใช้งานท่าทางการลากแนวนอน - ท่าทางการลากแบบแนวนอนปิดใช้งานแล้ว - "ท่าทางลากแนวนอน เปิดใช้งาน + ปิดใช้งานท่าทางการลากแนวนอน + ท่าทางการลากแบบแนวนอนปิดใช้งานแล้ว + "ท่าทางลากแนวนอน เปิดใช้งาน สามารถลาก miniplayer ออกจากหน้าจอไปทางซ้ายหรือขวา" - ซ่อนปุ่มโอเวอร์เลย์ - ปุ่มโอเวอร์เลย์ถูกซ่อน - ปุ่มโอเวอร์เลย์ถูกแสดง - "ปุ่มถูกซ่อน + ซ่อนปุ่มโอเวอร์เลย์ + ปุ่มโอเวอร์เลย์ถูกซ่อน + ปุ่มโอเวอร์เลย์ถูกแสดง + "ปุ่มถูกซ่อน ปัดเพื่อขยายหรือปิด" - ซ่อนข้อความย่อย - ข้อความย่อยถูกซ่อน - ข้อความย่อยแสดงอยู่ - ซ่อนปุ่มข้ามไปข้างหน้าและข้างหลัง - ข้ามไปข้างหน้าและข้างหลังถูกซ่อน - ข้ามไปข้างหน้าและข้างหลังแสดงอยู่ - ขนาดเริ่มต้น - ขนาดเริ่มต้นบนหน้าจอ เป็นพิกเซล - ขนาดพิกเซลต้องอยู่ระหว่าง %1$s ถึง %2$s - ความทึบแสงของโอเวอร์เลย์ - ค่าความทึบแสงระหว่าง 0-100 โดย 0 คือโปร่งใส - ความทึบแสงของโอเวอร์เลย์เครื่องเล่นย่อขนาดต้องอยู่ระหว่าง 0-100 - - - เปิดใช้งานหน้าจอโหลดแบบไล่ระดับสี - หน้าจอโหลดจะมีพื้นหลังแบบไล่ระดับสี - หน้าจอโหลดจะมีพื้นหลังแบบทึบ - รูปแบบหน้าจอ Splash - สี - ขาวดำ - เปิดใช้งานสีแถบเลื่อนแบบกำหนดเอง - แสดงสีแถบเลื่อนแบบกำหนดเอง - แสดงสีแถบเลื่อนดั้งเดิม - สี seekbar แบบกำหนดเอง - สีของ seekbar - สีเน้น seekbar แบบกำหนดเอง - สีเน้นของ seekbar - ค่าสีแถบเลื่อนไม่ถูกต้อง - - - - - โลโก้ส่วนหัว - ค่าเริ่มต้น - ปกติ - - ReVanced แบบย่อ - กำหนดเอง - - - เลี่ยงข้อจำกัดด้านภูมิภาคของรูปภาพ - ใช้โฮสต์รูปภาพ yt4.ggpht.com - "ใช้โฮสต์รูปภาพดั้งเดิม + ซ่อนข้อความย่อย + ข้อความย่อยถูกซ่อน + ข้อความย่อยแสดงอยู่ + ซ่อนปุ่มข้ามไปข้างหน้าและข้างหลัง + ข้ามไปข้างหน้าและข้างหลังถูกซ่อน + ข้ามไปข้างหน้าและข้างหลังแสดงอยู่ + ขนาดเริ่มต้น + ขนาดเริ่มต้นบนหน้าจอ เป็นพิกเซล + ขนาดพิกเซลต้องอยู่ระหว่าง %1$s ถึง %2$s + ความทึบแสงของโอเวอร์เลย์ + ค่าความทึบแสงระหว่าง 0-100 โดย 0 คือโปร่งใส + ความทึบแสงของโอเวอร์เลย์เครื่องเล่นย่อขนาดต้องอยู่ระหว่าง 0-100 + + + เปิดใช้งานหน้าจอโหลดแบบไล่ระดับสี + หน้าจอโหลดจะมีพื้นหลังแบบไล่ระดับสี + หน้าจอโหลดจะมีพื้นหลังแบบทึบ + รูปแบบหน้าจอ Splash + สี + ขาวดำ + เปิดใช้งานสีแถบเลื่อนแบบกำหนดเอง + แสดงสีแถบเลื่อนแบบกำหนดเอง + แสดงสีแถบเลื่อนดั้งเดิม + สี seekbar แบบกำหนดเอง + สีของ seekbar + สีเน้น seekbar แบบกำหนดเอง + สีเน้นของ seekbar + ค่าสีแถบเลื่อนไม่ถูกต้อง + + + + โลโก้ส่วนหัว + ค่าเริ่มต้น + ปกติ + + ReVanced แบบย่อ + กำหนดเอง + + + เลี่ยงข้อจำกัดด้านภูมิภาคของรูปภาพ + ใช้โฮสต์รูปภาพ yt4.ggpht.com + "ใช้โฮสต์รูปภาพดั้งเดิม การเปิดใช้งานสิ่งนี้สามารถแก้ไขรูปภาพที่หายไปซึ่งถูกบล็อกในบางภูมิภาค" - - - - แท็บหน้าแรก - - แท็บการติดตาม - - แท็บคุณ - เพลย์ลิสต์เครื่องเล่น & คำแนะนำ - ผลลัพธ์การค้นหา - รูปขนาดย่อดั้งเดิม - DeArrow & รูปขนาดย่อดั้งเดิม - DeArrow & ภาพนิ่ง - ภาพนิ่ง - "DeArrow ให้ภาพขนาดย่อที่รวบรวมจากฝูงชนสําหรับวิดีโอ YouTube ภาพขนาดย่อเหล่านี้มักจะเกี่ยวข้องมากกว่าภาพขนาดย่อที่ให้โดย YouTube + + + + แท็บหน้าแรก + + แท็บการติดตาม + + แท็บคุณ + เพลย์ลิสต์เครื่องเล่น & คำแนะนำ + ผลลัพธ์การค้นหา + รูปขนาดย่อดั้งเดิม + DeArrow & รูปขนาดย่อดั้งเดิม + DeArrow & ภาพนิ่ง + ภาพนิ่ง + "DeArrow ให้ภาพขนาดย่อที่รวบรวมจากฝูงชนสําหรับวิดีโอ YouTube ภาพขนาดย่อเหล่านี้มักจะเกี่ยวข้องมากกว่าภาพขนาดย่อที่ให้โดย YouTube ถ้าเปิดใช้งาน URL ของวิดีโอจะถูกส่งไปยังเซิร์ฟเวอร์ API และไม่มีข้อมูลอื่นๆ ถูกส่งไป หากวิดีโอไม่มีภาพขนาดย่อ DeArrow ภาพขนาดย่อดั้งเดิมหรือภาพนิ่งจะถูกแสดง แตะที่นี่เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ DeArrow" - แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน - แสดง\"toast\"หาก DeArrow ไม่พร้อมใช้งาน - ไม่แสดง\"toast\"หาก DeArrow ไม่พร้อมใช้งาน - จุดสิ้นสุด API ของ DeArrow - URL ของจุดสิ้นสุดแคชรูปขนาดย่อ DeArrow - ภาพนิ่งจากวิดีโอ - ภาพนิ่งถูกถ่ายจากจุดเริ่มต้น/กลาง/ท้ายของแต่ละวิดีโอ รูปภาพเหล่านี้ถูกสร้างไว้ใน YouTube และไม่มีการใช้ API ภายนอก - ใช้ภาพนิ่งรวดเร็ว - ใช้ภาพนิ่งคุณภาพปานกลาง รูปขนาดย่อจะโหลดเร็วขึ้น แต่สตรีมสด วิดีโอที่ยังไม่เผยแพร่ หรือวิดีโอเก่ามากอาจแสดงรูปขนาดย่อว่างเปล่า - ใช้ภาพนิ่งคุณภาพสูง - เวลาในวิดีโอที่จะถ่ายภาพนิ่งจาก - จุดเริ่มต้นของวิดีโอ - กลางของวิดีโอ - ท้ายของวิดีโอ - - DeArrow ไม่พร้อมใช้งานชั่วคราว (รหัสสถานะ: %s) - DeArrow ไม่พร้อมใช้งานชั่วคราว - - - แสดงการประกาศของ ReVanced - ประกาศเมื่อเริ่มต้นระบบแสดงอยู่ - ประกาศเมื่อเริ่มต้นระบบไม่ได้แสดงอยู่ - แสดงการประกาศเมื่อเริ่มต้น - การเชื่อมต่อกับผู้ให้บริการการประกาศล้มเหลว - ปิด - - - เปิดใช้งานการเล่นวิดีโอซ้ำ - วิดีโอจะเล่นซ้ำ - วิดีโอจะไม่เล่นซ้ำ - - - แสดงปุ่มเล่นวิดีโอซ้ำ - แสดงปุ่มแล้ว - ยังไม่แสดงปุ่ม - เปิดใช้งานการเล่นวิดีโอซ้ำแล้ว - ปิดใช้งานการเล่นวิดีโอซ้ำแล้ว - - - - - ปลอมแปลงมิติของอุปกรณ์ - "มิติของอุปกรณ์ถูกปลอมแปลง + แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน + แสดง\"toast\"หาก DeArrow ไม่พร้อมใช้งาน + ไม่แสดง\"toast\"หาก DeArrow ไม่พร้อมใช้งาน + จุดสิ้นสุด API ของ DeArrow + URL ของจุดสิ้นสุดแคชรูปขนาดย่อ DeArrow + ภาพนิ่งจากวิดีโอ + ภาพนิ่งถูกถ่ายจากจุดเริ่มต้น/กลาง/ท้ายของแต่ละวิดีโอ รูปภาพเหล่านี้ถูกสร้างไว้ใน YouTube และไม่มีการใช้ API ภายนอก + ใช้ภาพนิ่งรวดเร็ว + ใช้ภาพนิ่งคุณภาพปานกลาง รูปขนาดย่อจะโหลดเร็วขึ้น แต่สตรีมสด วิดีโอที่ยังไม่เผยแพร่ หรือวิดีโอเก่ามากอาจแสดงรูปขนาดย่อว่างเปล่า + ใช้ภาพนิ่งคุณภาพสูง + เวลาในวิดีโอที่จะถ่ายภาพนิ่งจาก + จุดเริ่มต้นของวิดีโอ + กลางของวิดีโอ + ท้ายของวิดีโอ + + DeArrow ไม่พร้อมใช้งานชั่วคราว (รหัสสถานะ: %s) + DeArrow ไม่พร้อมใช้งานชั่วคราว + + + แสดงการประกาศของ ReVanced + ประกาศเมื่อเริ่มต้นระบบแสดงอยู่ + ประกาศเมื่อเริ่มต้นระบบไม่ได้แสดงอยู่ + แสดงการประกาศเมื่อเริ่มต้น + การเชื่อมต่อกับผู้ให้บริการการประกาศล้มเหลว + ปิด + + + เปิดใช้งานการเล่นวิดีโอซ้ำ + วิดีโอจะเล่นซ้ำ + วิดีโอจะไม่เล่นซ้ำ + + + แสดงปุ่มเล่นวิดีโอซ้ำ + แสดงปุ่มแล้ว + ยังไม่แสดงปุ่ม + เปิดใช้งานการเล่นวิดีโอซ้ำแล้ว + ปิดใช้งานการเล่นวิดีโอซ้ำแล้ว + + + + ปลอมแปลงมิติของอุปกรณ์ + "มิติของอุปกรณ์ถูกปลอมแปลง คุณภาพวิดีโอที่สูงขึ้นอาจถูกปลดล็อก แต่คุณอาจพบปัญหาการสะดุดในการเล่นวิดีโอ อายุการใช้งานแบตเตอรี่แย่ลง และผลข้างเคียงที่ไม่คาดคิด" - "มิติของอุปกรณ์ไม่ถูกปลอมแปลง + "มิติของอุปกรณ์ไม่ถูกปลอมแปลง การเปิดใช้งานสิ่งนี้สามารถปลดล็อกคุณภาพวิดีโอที่สูงขึ้น" - การเปิดใช้งานนี้สามารถทำให้การเล่นวิดีโอสะดุด อายุการใช้งานแบตเตอรี่แย่ลง และผลข้างเคียงที่ไม่ทราบสาเหตุ - - - การตอบสนองแบบสัมผัส - เปลี่ยนการตอบสนองแบบสัมผัส - ปิดใช้งานแฮปติกบท - ปิดใช้งานแฮปติกบทแล้ว - เปิดใช้งานแฮปติกบทแล้ว - ปิดใช้งานแฮปติกการค้นหาแบบแม่นยำ - ปิดใช้งานแฮปติกการค้นหาที่แม่นยำ - เปิดใช้งานแฮปติกการค้นหาแบบแม่นยำแล้ว - ปิดใช้งานแฮปติกยกเลิกการค้นหา - ปิดใช้งานแฮปติกยกเลิกการค้นหา - เปิดใช้งานแฮปติกยกเลิกการค้นหา - ปิดใช้งานแฮปติกซูม - ปิดใช้งานแฮปติกซูม - เปิดใช้งานแฮปติกซูม - - - หากคุณเพิ่งเปลี่ยนรายละเอียดการเข้าสู่ระบบบัญชีของคุณ ให้ถอนการติดตั้งและติดตั้ง MicroG ใหม่อีกครั้ง - - - เลี่ยงการเปลี่ยนเส้นทาง URL - การเปลี่ยนเส้นทาง URL ถูกเลี่ยง - การเปลี่ยนเส้นทาง URL ไม่ถูกเลี่ยง - - - เปิดลิงก์ในเบราว์เซอร์ - เปิดลิงก์ในเบราว์เซอร์ภายนอก - เปิดลิงก์ในเบราว์เซอร์ในแอป - - - - อัตโนมัติ - จำการเปลี่ยนแปลงคุณภาพวิดีโอ - การเปลี่ยนแปลงคุณภาพใช้กับวิดีโอทั้งหมด - การเปลี่ยนแปลงคุณภาพใช้กับวิดีโอปัจจุบันเท่านั้น - แสดงโทสต์เมื่อคุณภาพวิดีโอเปลี่ยนแปลง - มีการแสดงโทสต์เมื่อคุณภาพวิดีโอเริ่มต้นถูกเปลี่ยน - ไม่มีการแสดงโทสต์เมื่อคุณภาพวิดีโอเริ่มต้นถูกเปลี่ยน - คุณภาพวิดีโอเริ่มต้นบนเครือข่าย Wi-Fi - คุณภาพวิดีโอเริ่มต้นบนเครือข่ายมือถือ - จดจำการเปลี่ยนแปลงคุณภาพของ Shorts - การเปลี่ยนแปลงคุณภาพมีผลกับ Shorts ทั้งหมด - การเปลี่ยนแปลงคุณภาพมีผลกับ Short ปัจจุบันเท่านั้น - คุณภาพ Shorts เริ่มต้นบนเครือข่าย Wi-Fi - คุณภาพ Shorts เริ่มต้นบนเครือข่ายมือถือ - มือถือ - เปลี่ยนคุณภาพ %1$s เริ่มต้นเป็น: %2$s - เปลี่ยนคุณภาพ Shorts %1$s เป็น: %2$s - - - แสดงปุ่มกล่องโต้ตอบความเร็ว - ปุ่มกล่องโต้ตอบความเร็วแสดงอยู่ แตะค้างไว้เพื่อรีเซ็ตความเร็วในการเล่นกลับเป็นค่าเริ่มต้น - ปุ่มกล่องโต้ตอบความเร็วไม่แสดง - - - แสดงปุ่มคุณภาพวิดีโอ - ปุ่มคุณภาพวิดีโอแสดงอยู่ แตะค้างไว้เพื่อรีเซ็ตคุณภาพเป็นค่าเริ่มต้น - ปุ่มคุณภาพวิดีโอไม่แสดง - - - เมนูกำหนดความเร็วในการเล่นแบบกำหนดเอง - แสดงเมนูกำหนดความเร็ว - ไม่แสดงเมนูกำหนดความเร็ว - คืนค่าเมนูความเร็วในการเล่นแบบเก่า - แสดงเมนูความเร็วแบบเก่า - แสดงเมนูความเร็วแบบใหม่ - ความเร็วในการเล่นแบบกำหนดเอง - เพิ่มหรือเปลี่ยนความเร็วในการเล่นแบบกำหนดเอง - ความเร็วที่กําหนดเองต้องน้อยกว่า %s - ความเร็วในการเล่นที่กําหนดเองไม่ถูกต้อง - อัตโนมัติ - **Custom tap and hold speed** - ความเร็วในการเล่นระหว่าง 0-8 - - - จำการเปลี่ยนแปลงความเร็วในการเล่น - การเปลี่ยนแปลงความเร็วในการเล่นใช้กับวิดีโอทั้งหมด - การเปลี่ยนแปลงความเร็วในการเล่นใช้กับวิดีโอปัจจุบันเท่านั้น - แสดงโทสต์เมื่อความเร็วในการเล่นเปลี่ยนแปลง - มีการแสดงโทสต์เมื่อความเร็วในการเล่นเริ่มต้นถูกเปลี่ยน - โทสต์ไม่แสดงเมื่อความเร็วในการเล่นเริ่มต้นถูกเปลี่ยน - ความเร็วในการเล่นเริ่มต้น - เปลี่ยนความเร็วเริ่มต้นเป็น: %s - - - ปิดใช้งานวิดีโอ HDR - ปิดใช้งานวิดีโอ HDR - เปิดใช้งานวิดีโอ HDR - บังคับ AVC (H.264) - ตัวแปลงสัญญาณวิดีโอถูกบังคับเป็น AVC (H.264) - ตัวแปลงสัญญาณวิดีโอจะถูกกำหนดโดยอัตโนมัติ - "ประโยชน์: + การเปิดใช้งานนี้สามารถทำให้การเล่นวิดีโอสะดุด อายุการใช้งานแบตเตอรี่แย่ลง และผลข้างเคียงที่ไม่ทราบสาเหตุ + + + การตอบสนองแบบสัมผัส + เปลี่ยนการตอบสนองแบบสัมผัส + ปิดใช้งานแฮปติกบท + ปิดใช้งานแฮปติกบทแล้ว + เปิดใช้งานแฮปติกบทแล้ว + ปิดใช้งานแฮปติกการค้นหาแบบแม่นยำ + ปิดใช้งานแฮปติกการค้นหาที่แม่นยำ + เปิดใช้งานแฮปติกการค้นหาแบบแม่นยำแล้ว + ปิดใช้งานแฮปติกยกเลิกการค้นหา + ปิดใช้งานแฮปติกยกเลิกการค้นหา + เปิดใช้งานแฮปติกยกเลิกการค้นหา + ปิดใช้งานแฮปติกซูม + ปิดใช้งานแฮปติกซูม + เปิดใช้งานแฮปติกซูม + + + หากคุณเพิ่งเปลี่ยนรายละเอียดการเข้าสู่ระบบบัญชีของคุณ ให้ถอนการติดตั้งและติดตั้ง MicroG ใหม่อีกครั้ง + + + เลี่ยงการเปลี่ยนเส้นทาง URL + การเปลี่ยนเส้นทาง URL ถูกเลี่ยง + การเปลี่ยนเส้นทาง URL ไม่ถูกเลี่ยง + + + เปิดลิงก์ในเบราว์เซอร์ + เปิดลิงก์ในเบราว์เซอร์ภายนอก + เปิดลิงก์ในเบราว์เซอร์ในแอป + + + + อัตโนมัติ + จำการเปลี่ยนแปลงคุณภาพวิดีโอ + การเปลี่ยนแปลงคุณภาพใช้กับวิดีโอทั้งหมด + การเปลี่ยนแปลงคุณภาพใช้กับวิดีโอปัจจุบันเท่านั้น + แสดงโทสต์เมื่อคุณภาพวิดีโอเปลี่ยนแปลง + มีการแสดงโทสต์เมื่อคุณภาพวิดีโอเริ่มต้นถูกเปลี่ยน + ไม่มีการแสดงโทสต์เมื่อคุณภาพวิดีโอเริ่มต้นถูกเปลี่ยน + คุณภาพวิดีโอเริ่มต้นบนเครือข่าย Wi-Fi + คุณภาพวิดีโอเริ่มต้นบนเครือข่ายมือถือ + จดจำการเปลี่ยนแปลงคุณภาพของ Shorts + การเปลี่ยนแปลงคุณภาพมีผลกับ Shorts ทั้งหมด + การเปลี่ยนแปลงคุณภาพมีผลกับ Short ปัจจุบันเท่านั้น + คุณภาพ Shorts เริ่มต้นบนเครือข่าย Wi-Fi + คุณภาพ Shorts เริ่มต้นบนเครือข่ายมือถือ + มือถือ + เปลี่ยนคุณภาพ %1$s เริ่มต้นเป็น: %2$s + เปลี่ยนคุณภาพ Shorts %1$s เป็น: %2$s + + + แสดงปุ่มกล่องโต้ตอบความเร็ว + ปุ่มกล่องโต้ตอบความเร็วแสดงอยู่ แตะค้างไว้เพื่อรีเซ็ตความเร็วในการเล่นกลับเป็นค่าเริ่มต้น + ปุ่มกล่องโต้ตอบความเร็วไม่แสดง + + + แสดงปุ่มคุณภาพวิดีโอ + ปุ่มคุณภาพวิดีโอแสดงอยู่ แตะค้างไว้เพื่อรีเซ็ตคุณภาพเป็นค่าเริ่มต้น + ปุ่มคุณภาพวิดีโอไม่แสดง + + + เมนูกำหนดความเร็วในการเล่นแบบกำหนดเอง + แสดงเมนูกำหนดความเร็ว + ไม่แสดงเมนูกำหนดความเร็ว + คืนค่าเมนูความเร็วในการเล่นแบบเก่า + แสดงเมนูความเร็วแบบเก่า + แสดงเมนูความเร็วแบบใหม่ + ความเร็วในการเล่นแบบกำหนดเอง + เพิ่มหรือเปลี่ยนความเร็วในการเล่นแบบกำหนดเอง + ความเร็วที่กําหนดเองต้องน้อยกว่า %s + ความเร็วในการเล่นที่กําหนดเองไม่ถูกต้อง + อัตโนมัติ + **Custom tap and hold speed** + ความเร็วในการเล่นระหว่าง 0-8 + + + จำการเปลี่ยนแปลงความเร็วในการเล่น + การเปลี่ยนแปลงความเร็วในการเล่นใช้กับวิดีโอทั้งหมด + การเปลี่ยนแปลงความเร็วในการเล่นใช้กับวิดีโอปัจจุบันเท่านั้น + แสดงโทสต์เมื่อความเร็วในการเล่นเปลี่ยนแปลง + มีการแสดงโทสต์เมื่อความเร็วในการเล่นเริ่มต้นถูกเปลี่ยน + โทสต์ไม่แสดงเมื่อความเร็วในการเล่นเริ่มต้นถูกเปลี่ยน + ความเร็วในการเล่นเริ่มต้น + เปลี่ยนความเร็วเริ่มต้นเป็น: %s + + + ปิดใช้งานวิดีโอ HDR + ปิดใช้งานวิดีโอ HDR + เปิดใช้งานวิดีโอ HDR + บังคับ AVC (H.264) + ตัวแปลงสัญญาณวิดีโอถูกบังคับเป็น AVC (H.264) + ตัวแปลงสัญญาณวิดีโอจะถูกกำหนดโดยอัตโนมัติ + "ประโยชน์: • ช่วยยืดอายุการใช้งานแบตเตอรี่ • สามารถกู้คืนความละเอียดวิดีโอที่หายไปบนอุปกรณ์รุ่นเก่าได้ @@ -1645,179 +1642,178 @@ User id ของคุณเหมือนกับรหัสผ่าน • การเล่นวิดีโอจะใช้ข้อมูลอินเทอร์เน็ตมากกว่า VP9 หรือ AV1 • วิดีโอ HDR จะไม่ใช้ AVC • อุปกรณ์บางรุ่นไม่สามารถบังคับใช้ AVC ได้" - - - แสดงเมนูคุณภาพวิดีโอขั้นสูง - เมนูคุณภาพวิดีโอขั้นสูงปรากฏขึ้น - เมนูคุณภาพวิดีโอขั้นสูงไม่ปรากฏ - - - เปิดใช้งานเลื่อนเพื่อค้นหา - เลื่อนเพื่อค้นหาเปิดใช้งาน - เลื่อนเพื่อค้นหาไม่ได้เปิดใช้งาน - - - อนุญาต Android VR AV1 - "ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264), VP9 หรือ AV1 + + + แสดงเมนูคุณภาพวิดีโอขั้นสูง + เมนูคุณภาพวิดีโอขั้นสูงปรากฏขึ้น + เมนูคุณภาพวิดีโอขั้นสูงไม่ปรากฏ + + + เปิดใช้งานเลื่อนเพื่อค้นหา + เลื่อนเพื่อค้นหาเปิดใช้งาน + เลื่อนเพื่อค้นหาไม่ได้เปิดใช้งาน + + + อนุญาต Android VR AV1 + "ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264), VP9 หรือ AV1 การเล่นอาจกระตุกหรือเฟรมตก" - ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264) หรือ VP9 - "การเปิดใช้งานการตั้งค่านี้อาจใช้ซอฟต์แวร์ถอดรหัส AV1 + ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264) หรือ VP9 + "การเปิดใช้งานการตั้งค่านี้อาจใช้ซอฟต์แวร์ถอดรหัส AV1 การเล่นวิดีโอด้วย AV1 อาจกระตุกหรือเฟรมตก" - ผลข้างเคียงของการปลอมแปลง - • ไคลเอนต์ทดลองและอาจหยุดทำงานได้ตลอดเวลา - • วิดีโออาจหยุดที่ 1:00 หรืออาจไม่สามารถรับชมได้ในบางภูมิภาค - • เมนูแทร็กเสียงหายไป - • ไม่มีตัวแปลงสัญญาณวิดีโอ AV1 - • ระดับเสียงคงที่ไม่พร้อมใช้งาน - • วิดีโอเด็กอาจไม่เล่นเมื่อลงชื่อออกหรืออยู่ในโหมดไม่ระบุตัวตน - - • บังคับใช้เสียงต้นฉบับไม่พร้อมใช้งาน - แสดงในสถิติสำหรับพวกเนิร์ด - แสดงชนิดไคลเอ็นต์ในสถิติสำหรับพวกเนิร์ด - ซ่อนไคลเอ็นต์ในสถิติสำหรับพวกเนิร์ด - - - - - - - เกี่ยวกับ - โฆษณา - ทั่วไป - เครื่องเล่น - เบ็ดเตล็ด - - - ซ่อนโฆษณาวิดีโอ - ซ่อนโฆษณาวิดีโอแล้ว - แสดงโฆษณาวิดีโอแล้ว - - - เปิดใช้งานเล่นซ้ำถาวร - เปิดใช้งานเล่นซ้ำถาวรแล้ว - ปิดใช้งานเล่นซ้ำถาวรแล้ว - - - ซ่อนปุ่มแคสต์ - ปุ่มแคสต์ซ่อนอยู่ - ปุ่มแคสต์แสดงอยู่ - ซ่อนปุ่มประวัติ - ปุ่มประวัติถูกซ่อน - ปุ่มประวัติกำลังแสดง - ซ่อนปุ่มการแจ้งเตือน - ซ่อนปุ่มการแจ้งเตือนแล้ว - แสดงปุ่มการแจ้งเตือนแล้ว - ซ่อนปุ่มค้นหา - ซ่อนปุ่มค้นหาแล้ว - แสดงปุ่มค้นหาแล้ว - - - ซ่อนแถบหมวดหมู่ - ซ่อนแถบหมวดหมู่แล้ว - แสดงแถบหมวดหมู่แล้ว - - - เปลี่ยนสีมินิเพลเยอร์ - สีมินิเพลเยอร์ตรงกับเครื่องเล่นแบบเต็มหน้าจอ - มินิเพลเยอร์ใช้สีเริ่มต้น - - - แถบนำทาง - ซ่อนหรือเปลี่ยนปุ่มแถบนำทาง - - ซ่อนหน้าแรก - ซ่อนปุ่มหน้าแรกแล้ว - แสดงปุ่มหน้าแรกแล้ว - - ซ่อนตัวอย่าง - ซ่อนปุ่มตัวอย่างแล้ว - แสดงปุ่มตัวอย่างแล้ว - - ซ่อนสำรวจ - ซ่อนปุ่มสำรวจแล้ว - แสดงปุ่มสำรวจแล้ว - - ซ่อนคลัง - ซ่อนปุ่มคลังแล้ว - แสดงปุ่มคลังแล้ว - - ซ่อนอัปเกรด - ซ่อนปุ่มอัปเกรดแล้ว - แสดงปุ่มอัปเกรดแล้ว - ซ่อนแถบนำทาง - ซ่อนแถบนำทางแล้ว - แสดงแถบนำทางแล้ว - ซ่อนป้ายกำกับปุ่มนำทาง - ซ่อนป้ายกำกับแล้ว - แสดงป้ายกำกับแล้ว - - - ซ่อนป้าย \'รับ Music Premium\' - ซ่อนป้ายแล้ว - แสดงป้ายแล้ว - - - ซ่อนปุ่มอัปเกรด - ซ่อนปุ่มแล้ว - แสดงปุ่มแล้ว - - - - - ถางอารู้กินโออกืภล็อค่าออย่าง - เสียงโฆษณาถูกบล็อก - เสียงโฆษณาไม่ได้ถูกบล็อก - - - %s ไม่พร้อมใช้งาน โฆษณาอาจปรากฏ ลองเปลี่ยนบริการบล็อกโฆษณาใน การตั้งค่า - %s เกิดข้อผิดพลาด โฆษณาอาจปรากฏ ลองเปลี่ยนบริการบล็อกโฆษณาใน การตั้งค่า - ปิดกั้นโฆษณาวิดีโอฝัง - ปิดการใช้งานอยู่ - Luminous Proxy - PurpleAdBlock Proxy - - - ปิดกั้นโฆษณาวิดีโอ - วิดีโอโฆษณาถูกบล็อก - วิดีโอโฆษณาไม่ได้รับการบล็อก - - - ลบข้อความแล้ว - แสดงข้อความที่ถูกลบ - ไม่แสดงข้อความที่ถูกลบ - ซ่อนข้อความที่ถูกลบไว้หลังสปอยเลอร์ - แสดงข้อความที่ถูกลบเป็นข้อความที่ถูกขีดทับ - - - เรียก Channel Points โดยอัตโนมัติ - เรียก Channel Points โดยอัตโนมัติ - ไม่เรียก Channel Points โดยอัตโนมัติ - - - - เปิดใช้งานโหมดดีบัก Twitch - โหมดดีบัก Twitch เปิดใช้งาน (ไม่แนะนำ) - โหมดดีบัก Twitch ปิดใช้งาน - - - ต้องค่า ReVanced เพิ่มเติม - เกี่ยวกับ - เกี่ยวกับ ReVanced - การบล็อกโฆษณา - การตั้งค่าการบล็อกโฆษณา - สนทนา - \"Chat \"settings\" - เบ็ดเตล็ด - การตั้งค่าหลากหลาย - การตั้งค่าทั่วไป - การตั้งค่าอื่นๆ - โฆษณาฝั่งไคลเอ็นต์ - โฆษณา Surestream ฝั่งเซิร์ฟเวอร์ - การบันทึกเพื่อแก้จุดบกพร่อง - เปิดใช้งานการบันทึกเพื่อแก้จุดบกพร่อง - การบันทึกข้อผิดพลาดถูกปิดใช้งาน - - + ผลข้างเคียงของการปลอมแปลง + • ไคลเอนต์ทดลองและอาจหยุดทำงานได้ตลอดเวลา + • วิดีโออาจหยุดที่ 1:00 หรืออาจไม่สามารถรับชมได้ในบางภูมิภาค + • เมนูแทร็กเสียงหายไป + • ไม่มีตัวแปลงสัญญาณวิดีโอ AV1 + • ระดับเสียงคงที่ไม่พร้อมใช้งาน + • วิดีโอเด็กอาจไม่เล่นเมื่อลงชื่อออกหรืออยู่ในโหมดไม่ระบุตัวตน + + • บังคับใช้เสียงต้นฉบับไม่พร้อมใช้งาน + แสดงในสถิติสำหรับพวกเนิร์ด + แสดงชนิดไคลเอ็นต์ในสถิติสำหรับพวกเนิร์ด + ซ่อนไคลเอ็นต์ในสถิติสำหรับพวกเนิร์ด + + + + + + เกี่ยวกับ + โฆษณา + ทั่วไป + เครื่องเล่น + เบ็ดเตล็ด + + + ซ่อนโฆษณาวิดีโอ + ซ่อนโฆษณาวิดีโอแล้ว + แสดงโฆษณาวิดีโอแล้ว + + + เปิดใช้งานเล่นซ้ำถาวร + เปิดใช้งานเล่นซ้ำถาวรแล้ว + ปิดใช้งานเล่นซ้ำถาวรแล้ว + + + ซ่อนปุ่มแคสต์ + ปุ่มแคสต์ซ่อนอยู่ + ปุ่มแคสต์แสดงอยู่ + ซ่อนปุ่มประวัติ + ปุ่มประวัติถูกซ่อน + ปุ่มประวัติกำลังแสดง + ซ่อนปุ่มการแจ้งเตือน + ซ่อนปุ่มการแจ้งเตือนแล้ว + แสดงปุ่มการแจ้งเตือนแล้ว + ซ่อนปุ่มค้นหา + ซ่อนปุ่มค้นหาแล้ว + แสดงปุ่มค้นหาแล้ว + + + ซ่อนแถบหมวดหมู่ + ซ่อนแถบหมวดหมู่แล้ว + แสดงแถบหมวดหมู่แล้ว + + + เปลี่ยนสีมินิเพลเยอร์ + สีมินิเพลเยอร์ตรงกับเครื่องเล่นแบบเต็มหน้าจอ + มินิเพลเยอร์ใช้สีเริ่มต้น + + + แถบนำทาง + ซ่อนหรือเปลี่ยนปุ่มแถบนำทาง + + ซ่อนหน้าแรก + ซ่อนปุ่มหน้าแรกแล้ว + แสดงปุ่มหน้าแรกแล้ว + + ซ่อนตัวอย่าง + ซ่อนปุ่มตัวอย่างแล้ว + แสดงปุ่มตัวอย่างแล้ว + + ซ่อนสำรวจ + ซ่อนปุ่มสำรวจแล้ว + แสดงปุ่มสำรวจแล้ว + + ซ่อนคลัง + ซ่อนปุ่มคลังแล้ว + แสดงปุ่มคลังแล้ว + + ซ่อนอัปเกรด + ซ่อนปุ่มอัปเกรดแล้ว + แสดงปุ่มอัปเกรดแล้ว + ซ่อนแถบนำทาง + ซ่อนแถบนำทางแล้ว + แสดงแถบนำทางแล้ว + ซ่อนป้ายกำกับปุ่มนำทาง + ซ่อนป้ายกำกับแล้ว + แสดงป้ายกำกับแล้ว + + + ซ่อนป้าย \'รับ Music Premium\' + ซ่อนป้ายแล้ว + แสดงป้ายแล้ว + + + ซ่อนปุ่มอัปเกรด + ซ่อนปุ่มแล้ว + แสดงปุ่มแล้ว + + + + + ถางอารู้กินโออกืภล็อค่าออย่าง + เสียงโฆษณาถูกบล็อก + เสียงโฆษณาไม่ได้ถูกบล็อก + + + %s ไม่พร้อมใช้งาน โฆษณาอาจปรากฏ ลองเปลี่ยนบริการบล็อกโฆษณาใน การตั้งค่า + %s เกิดข้อผิดพลาด โฆษณาอาจปรากฏ ลองเปลี่ยนบริการบล็อกโฆษณาใน การตั้งค่า + ปิดกั้นโฆษณาวิดีโอฝัง + ปิดการใช้งานอยู่ + Luminous Proxy + PurpleAdBlock Proxy + + + ปิดกั้นโฆษณาวิดีโอ + วิดีโอโฆษณาถูกบล็อก + วิดีโอโฆษณาไม่ได้รับการบล็อก + + + ลบข้อความแล้ว + แสดงข้อความที่ถูกลบ + ไม่แสดงข้อความที่ถูกลบ + ซ่อนข้อความที่ถูกลบไว้หลังสปอยเลอร์ + แสดงข้อความที่ถูกลบเป็นข้อความที่ถูกขีดทับ + + + เรียก Channel Points โดยอัตโนมัติ + เรียก Channel Points โดยอัตโนมัติ + ไม่เรียก Channel Points โดยอัตโนมัติ + + + + เปิดใช้งานโหมดดีบัก Twitch + โหมดดีบัก Twitch เปิดใช้งาน (ไม่แนะนำ) + โหมดดีบัก Twitch ปิดใช้งาน + + + ต้องค่า ReVanced เพิ่มเติม + เกี่ยวกับ + เกี่ยวกับ ReVanced + การบล็อกโฆษณา + การตั้งค่าการบล็อกโฆษณา + สนทนา + \"Chat \"settings\" + เบ็ดเตล็ด + การตั้งค่าหลากหลาย + การตั้งค่าทั่วไป + การตั้งค่าอื่นๆ + โฆษณาฝั่งไคลเอ็นต์ + โฆษณา Surestream ฝั่งเซิร์ฟเวอร์ + การบันทึกเพื่อแก้จุดบกพร่อง + เปิดใช้งานการบันทึกเพื่อแก้จุดบกพร่อง + การบันทึกข้อผิดพลาดถูกปิดใช้งาน + + diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 973e26f582..fe7d6e91eb 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -17,239 +17,238 @@ "First 'item' text Second \"item\" text" ---> - - - - Uygulama adı - - Özel - Uygulama simgesi - Orijinal - ReVanced - - ReVanced minimal - ReVanced ölçeklendirilmiş - - Özel - - - Denetimler başarısız - Resmî web sitesini aç - Yok say - <h5>Bu uygulama sizin tarafınızdan yamalanmış gibi görünmüyor.</h5><br>Bu uygulama düzgün çalışmayabilir, <b>kullanması zararlı veya tehlikeli bile olabilir</b>.<br><br>Şu kontroller, bu uygulamanın hali hazırda yamalanmış olduğunu veya başka birinden edinildiğini gösteriyor:<br><br><small>%1$s</small><br>Doğrulanmış ve güvenli bir uygulama kullandığınızdan emin olmak için, <b>bu uygulamayı kaldırmanız ve kendiniz yamalamanız</b> şiddetle tavsiye edilir.<p><br>Bu uyarı yok sayıldığında sadece iki kez gösterilecektir. - Farklı bir cihazda yamalanmış - ReVanced Manager tarafından yüklenmemiş - 10 dakikadan daha uzun bir süre önce yamalanmış - %s gün önce yamalanmış - APK derleme tarihi bozuk - - - ReVanced Bildirimi - İzleme geçmişiniz kaydedilmiyor.<br><br>Bu büyük ihtimalle bir reklam engelleyici DNS\'den veya proxy\'den kaynaklanıyor.<br><br>Bunu düzeltmek için, <b>s.youtube.com</b> adresini beyaz listeye ekleyin veya bütün engelleyici DNS\'leri ve proxy\'leri kapatın. - Bir daha gösterme - - - Ayarlar - ReVanced - Devam etmek istediğinizden emin misiniz? - Kaydet - Sıfırla - Rengi sıfırla - Geçersiz renk - Yeniden başlatma gerekli - Bu değişikliğin etkili olması için uygulamayı yeniden başlatın. - Yeniden başlat - İçe aktar - Kopyala - ReVanced ayarları varsayılanlara sıfırlandı - %d ayar içe aktarıldı - İçe aktarılamadı: %s - Ayarları ara - \'%s\' için sonuç bulunamadı - Başka bir anahtar kelime deneyin - Son aramalar - Arama geçmişinden kaldırılsın mı? - Arama geçmişini temizle - Tüm arama geçmişini temizlemek istediğinizden emin misiniz? - Arama İpuçları - "• Bir yola gitmek için ona dokunun +--> + + + Uygulama adı + + Özel + Uygulama simgesi + Orijinal + ReVanced + + ReVanced minimal + ReVanced ölçeklendirilmiş + + Özel + + + Denetimler başarısız + Resmî web sitesini aç + Yok say + <h5>Bu uygulama sizin tarafınızdan yamalanmış gibi görünmüyor.</h5><br>Bu uygulama düzgün çalışmayabilir, <b>kullanması zararlı veya tehlikeli bile olabilir</b>.<br><br>Şu kontroller, bu uygulamanın hali hazırda yamalanmış olduğunu veya başka birinden edinildiğini gösteriyor:<br><br><small>%1$s</small><br>Doğrulanmış ve güvenli bir uygulama kullandığınızdan emin olmak için, <b>bu uygulamayı kaldırmanız ve kendiniz yamalamanız</b> şiddetle tavsiye edilir.<p><br>Bu uyarı yok sayıldığında sadece iki kez gösterilecektir. + Farklı bir cihazda yamalanmış + ReVanced Manager tarafından yüklenmemiş + 10 dakikadan daha uzun bir süre önce yamalanmış + %s gün önce yamalanmış + APK derleme tarihi bozuk + + + ReVanced Bildirimi + İzleme geçmişiniz kaydedilmiyor.<br><br>Bu büyük ihtimalle bir reklam engelleyici DNS\'den veya proxy\'den kaynaklanıyor.<br><br>Bunu düzeltmek için, <b>s.youtube.com</b> adresini beyaz listeye ekleyin veya bütün engelleyici DNS\'leri ve proxy\'leri kapatın. + Bir daha gösterme + + + Ayarlar + ReVanced + Devam etmek istediğinizden emin misiniz? + Kaydet + Sıfırla + Rengi sıfırla + Geçersiz renk + Yeniden başlatma gerekli + Bu değişikliğin etkili olması için uygulamayı yeniden başlatın. + Yeniden başlat + İçe aktar + Kopyala + ReVanced ayarları varsayılanlara sıfırlandı + %d ayar içe aktarıldı + İçe aktarılamadı: %s + Ayarları ara + \'%s\' için sonuç bulunamadı + Başka bir anahtar kelime deneyin + Son aramalar + Arama geçmişinden kaldırılsın mı? + Arama geçmişini temizle + Tüm arama geçmişini temizlemek istediğinizden emin misiniz? + Arama İpuçları + "• Bir yola gitmek için ona dokunun • Bir ayara gitmek için üzerine uzun basın • Bir arama sorgusunu geçmişe kaydetmek için Enter'a basın • Arama, büyük/küçük harf ve noktalama işaretlerini dikkate almaz • Ana ayarlar, devre dışı bırakılmış alt ayarların üzerinde görünür" - Arama geçmişi boş - Arama geçmişini kaydetmek için bir arama sorgusu yazın ve Enter\'a basın - Ayarlar arama geçmişini göster - Ayarlar arama geçmişi gösteriliyor - Ayarlar arama geçmişi gösterilmiyor - ReVanced ayar simgelerini göster - Ayar simgeleri gösteriliyor - Ayar simgeleri gösterilmiyor - ReVanced dili - "Bazı diller için çeviriler eksik veya tamamlanmamış olabilir. + Arama geçmişi boş + Arama geçmişini kaydetmek için bir arama sorgusu yazın ve Enter\'a basın + Ayarlar arama geçmişini göster + Ayarlar arama geçmişi gösteriliyor + Ayarlar arama geçmişi gösterilmiyor + ReVanced ayar simgelerini göster + Ayar simgeleri gösteriliyor + Ayar simgeleri gösterilmiyor + ReVanced dili + "Bazı diller için çeviriler eksik veya tamamlanmamış olabilir. Yeni dilleri çevirmek veya mevcut çevirileri geliştirmek için translate.revanced.app adresini ziyaret edin" - Uygulama dili - İçe / Dışa aktar - ReVanced ayarlarını içe / dışa aktar - - ReVanced Patches <i>%s</i> sürümünü kullanıyorsunuz - Not - Bu sürüm bir ön sürümdür ve beklenmeyen sorunlar yaşayabilirsiniz - Resmî bağlantılar - + ReVanced Patches <i>%s</i> sürümünü kullanıyorsunuz + Not + Bu sürüm bir ön sürümdür ve beklenmeyen sorunlar yaşayabilirsiniz + Resmî bağlantılar + - - - GmsCore Ayarları - GmsCore için ayarlar - - MicroG GmsCore yüklü değil. Yükleyin. - Eylem gerekli - "MicroG GmsCore'nin arka planda çalışma izni yok. + + + GmsCore Ayarları + GmsCore için ayarlar + + MicroG GmsCore yüklü değil. Yükleyin. + Eylem gerekli + "MicroG GmsCore'nin arka planda çalışma izni yok. Telefonunuz için \"Don't kill my app\" rehberini takip edin ve talimatları MicroG kurulumunuza uygulayın. Bu, uygulamanın çalışması için gereklidir." - Websitesini aç - "Sorunları önlemek için MicroG GmsCore pil optimizasyonları devre dışı bırakılmalıdır. + Websitesini aç + "Sorunları önlemek için MicroG GmsCore pil optimizasyonları devre dışı bırakılmalıdır. MicroG için pil optimizasyonlarını devre dışı bırakmak, pil kullanımını olumsuz etkilemeyecektir. Devam düğmesine dokunun ve optimizasyon değişikliklerine izin verin." - Devam et - - - Video akışlarını taklit et - Oynatma sorunlarını önlemek için istemci video akışlarını taklit et - Video akışlarını taklit et - Oynatma sorunlarını önlemek için istemci video akışlarını taklit et - Video akışlarını taklit et - "Video akışları taklit edilir + Devam et + + + Video akışlarını taklit et + Oynatma sorunlarını önlemek için istemci video akışlarını taklit et + Video akışlarını taklit et + Oynatma sorunlarını önlemek için istemci video akışlarını taklit et + Video akışlarını taklit et + "Video akışları taklit edilir YouTube Premium kullanıcısıysanız, bu ayar gerekli olmayabilir" - "Video akışları taklit edilmez + "Video akışları taklit edilmez Oynatma çalışmayabilir" - Bu ayarı devre dışı bırakmak oynatma sorunlarına yol açabilir. - Varsayılan istemci - - - Orijinal ses dilini zorla - Orijinal ses dili kullanılıyor - Varsayılan ses kullanılıyor - - Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin - - - Hata ayıklama - Hata ayıklama seçeneklerini etkinleştir veya devre dışı bırak - Hata ayıklama kayıtları - Hata ayıklama kayıtları etkin - Hata ayıklama kayıtları devre dışı - Stack traces\'in kaydını tut - Hata ayıklama kayıtları stack traces\'i içerir - Hata ayıklama kayıtları stack traces\'i içermez - ReVanced hatası durumunda uyarı göster - Hata oluşursa uyarı gösterilir - Hata oluşursa uyarı gösterilmez - "Hata bildirimlerini kapatmak, tüm ReVanced hata bildirimlerini gizler. + Bu ayarı devre dışı bırakmak oynatma sorunlarına yol açabilir. + Varsayılan istemci + + + Orijinal ses dilini zorla + Orijinal ses dili kullanılıyor + Varsayılan ses kullanılıyor + + Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin + + + Hata ayıklama + Hata ayıklama seçeneklerini etkinleştir veya devre dışı bırak + Hata ayıklama kayıtları + Hata ayıklama kayıtları etkin + Hata ayıklama kayıtları devre dışı + Stack traces\'in kaydını tut + Hata ayıklama kayıtları stack traces\'i içerir + Hata ayıklama kayıtları stack traces\'i içermez + ReVanced hatası durumunda uyarı göster + Hata oluşursa uyarı gösterilir + Hata oluşursa uyarı gösterilmez + "Hata bildirimlerini kapatmak, tüm ReVanced hata bildirimlerini gizler. Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz." - Hata ayıklama kayıtlarını dışa aktar - ReVanced hata ayıklama kayıtlarını panoya kopyalar - Hata ayıklama kayıtları devre dışı - Kayıt bulunamadı - Kayıtlar kopyalandı - Kayıtlar dışa aktarılamadı: %s - Hata ayıklama kayıtlarını temizle - Kaydedilmiş tüm ReVanced hata ayıklama kayıtlarını temizler - Kayıtlar temizlendi - Özellik işaretçileri yöneticisi - Boolean özellik işaretçilerini yönet - Aktif işaretçiler (%d) - Engellenen işaretçiler (%d) - İşaretçileri ara... - İşaretçiler kaydedildi - İşaretçiler sıfırlandı - İşaretçiler panoya kopyalandı - Protocol buffer\'ın kaydını tut - Hata ayıklama kayıtları proto buffer\'ı içerir - Hata ayıklama kayıtları proto buffer\'ı içermez - "Bu ayarın etkinleştirilmesi, bazı kullanıcı arayüzü bileşenleri için ek düzen verilerini, ekran üzerindeki metin dahil olmak üzere günlüğe kaydeder. + Hata ayıklama kayıtlarını dışa aktar + ReVanced hata ayıklama kayıtlarını panoya kopyalar + Hata ayıklama kayıtları devre dışı + Kayıt bulunamadı + Kayıtlar kopyalandı + Kayıtlar dışa aktarılamadı: %s + Hata ayıklama kayıtlarını temizle + Kaydedilmiş tüm ReVanced hata ayıklama kayıtlarını temizler + Kayıtlar temizlendi + Özellik işaretçileri yöneticisi + Boolean özellik işaretçilerini yönet + Aktif işaretçiler (%d) + Engellenen işaretçiler (%d) + İşaretçileri ara... + İşaretçiler kaydedildi + İşaretçiler sıfırlandı + İşaretçiler panoya kopyalandı + Protocol buffer\'ın kaydını tut + Hata ayıklama kayıtları proto buffer\'ı içerir + Hata ayıklama kayıtları proto buffer\'ı içermez + "Bu ayarın etkinleştirilmesi, bazı kullanıcı arayüzü bileşenleri için ek düzen verilerini, ekran üzerindeki metin dahil olmak üzere günlüğe kaydeder. Bu, özel filtreler oluştururken bileşenlerin belirlenmesine yardımcı olabilir. Ancak, bunun etkinleştirilmesi IP adresiniz gibi bazı kullanıcı verilerini de günlüğe kaydeder." - - - Paylaşım bağlantılarını temizle - Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılır - Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılmaz - Paylaşım bağlantılarını youtube.com olarak değiştir - Paylaşılan bağlantılar youtube.com kullanır - Paylaşılan bağlantılar music.youtube.com kullanır - - - Özel filtre - Özel filtreler kullanarak bileşenleri gizle - Özel filtreyi etkinleştir - Özel filtre etkin - Özel filtre devre dışı - Özel filtre - - Filtrelenecek bileşen yolu oluşturucu dizelerinin yeni satırla ayrılmış şekilde listesi - Geçersiz özel filtre: %s - - - - - Hakkında - Reklamlar - Alternatif kapak resimleri - Akış - Genel - Oynatıcı - Shorts - Zaman çubuğu - Kaydırma denetimleri - Return YouTube Dislike - Çeşitli - Video - Eski ayarlar menülerini geri getir - Eski ayarlar menüleri gösteriliyor - Eski ayarlar menüleri gösterilmiyor - - - Shorts\'un arka planda oynatılmasını devre dışı bırak - Shorts\'un arka planda oynatılması devre dışı - Shorts\'un arka planda oynatılması etkin - - - Albüm kartlarını gizle - Albüm kartları gizli - Albüm kartları görünür - Sanatçı kartlarını gizle - Sanatçı kartları gizli - Sanatçı kartları görünür - Çip rafını gizle - Çip rafı gizli - Çip rafı görünür - Topluluk gönderilerini gizle - Topluluk gönderileri gizli - Topluluk gönderileri görünür - Kompakt afişleri gizle - Kompakt afişler gizli - Kompakt afişler görünür - Genişletilebilir kartı gizle - Videoların altındaki genişletilebilir kart gizli - Videoların altındaki genişletilebilir kart görünür - Alttaki mikrofon düğmesini gizle - Aramada alttaki mikrofon düğmesi gizli - Aramada alttaki mikrofon düğmesi görünür - Yatay rafları gizle - "Şunlar gibi yatay raflar gizlenir: + + + Paylaşım bağlantılarını temizle + Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılır + Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılmaz + Paylaşım bağlantılarını youtube.com olarak değiştir + Paylaşılan bağlantılar youtube.com kullanır + Paylaşılan bağlantılar music.youtube.com kullanır + + + Özel filtre + Özel filtreler kullanarak bileşenleri gizle + Özel filtreyi etkinleştir + Özel filtre etkin + Özel filtre devre dışı + Özel filtre + + Filtrelenecek bileşen yolu oluşturucu dizelerinin yeni satırla ayrılmış şekilde listesi + Geçersiz özel filtre: %s + + + + + Hakkında + Reklamlar + Alternatif kapak resimleri + Akış + Genel + Oynatıcı + Shorts + Zaman çubuğu + Kaydırma denetimleri + Return YouTube Dislike + Çeşitli + Video + Eski ayarlar menülerini geri getir + Eski ayarlar menüleri gösteriliyor + Eski ayarlar menüleri gösterilmiyor + + + Shorts\'un arka planda oynatılmasını devre dışı bırak + Shorts\'un arka planda oynatılması devre dışı + Shorts\'un arka planda oynatılması etkin + + + Albüm kartlarını gizle + Albüm kartları gizli + Albüm kartları görünür + Sanatçı kartlarını gizle + Sanatçı kartları gizli + Sanatçı kartları görünür + Çip rafını gizle + Çip rafı gizli + Çip rafı görünür + Topluluk gönderilerini gizle + Topluluk gönderileri gizli + Topluluk gönderileri görünür + Kompakt afişleri gizle + Kompakt afişler gizli + Kompakt afişler görünür + Genişletilebilir kartı gizle + Videoların altındaki genişletilebilir kart gizli + Videoların altındaki genişletilebilir kart görünür + Alttaki mikrofon düğmesini gizle + Aramada alttaki mikrofon düğmesi gizli + Aramada alttaki mikrofon düğmesi görünür + Yatay rafları gizle + "Şunlar gibi yatay raflar gizlenir: • Son dakika haberleri • İzlemeye devam et @@ -257,1034 +256,1034 @@ Ancak, bunun etkinleştirilmesi IP adresiniz gibi bazı kullanıcı verilerini d • En alakalı • Alışveriş • Tekrar izle" - Yatay raflar görünür - Resim rafını gizle - Arama sonuçlarındaki resim rafı gizli - Arama sonuçlarındaki resim rafı görünür - Son gönderileri gizle - Son gönderiler gizli - Son gönderiler görünür - Mix oynatma listelerini gizle - Mix oynatma listeleri gizli - Mix oynatma listeleri görünür - Filmler kısmını gizle - Filmler kısmı gizli - Filmler kısmı görünür - - \'Hatırlatma oluştur\' düğmesini gizle - Hatırlatma oluştur düğmesi gizli - Hatırlatma oluştur düğmesi görünür - Hazır Oyunlar\'ı gizle - Hazır Oyunlar gizli - Hazır Oyunlar görünür - - \'Daha fazla göster\' düğmesini gizle - Arama sonuçlarındaki daha fazla göster düğmesi gizli - Arama sonuçlarındaki daha fazla göster düğmesi görünür - Anketleri gizle - Anketler gizli - Anketler görünür - Bilet rafını gizle - Bilet rafı gizli - Bilet rafı görünür - - Video öneri etiketlerini gizle - Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri gizli - Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri görünür - Görsel ayırıcıyı gizle - Görsel ayırıcı gizli - Görsel ayırıcı görünür - - YouTube Doodle\'larını gizle - Logodaki YouTube Doodles animasyonu gizli - Logodaki YouTube Doodles animasyonu görünür - "YouTube Doodles, her yıl birkaç gün gösterilir. + \'Daha fazla göster\' düğmesini gizle + Arama sonuçlarındaki daha fazla göster düğmesi gizli + Arama sonuçlarındaki daha fazla göster düğmesi görünür + Anketleri gizle + Anketler gizli + Anketler görünür + Bilet rafını gizle + Bilet rafı gizli + Bilet rafı görünür + + Video öneri etiketlerini gizle + Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri gizli + Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri görünür + Görsel ayırıcıyı gizle + Görsel ayırıcı gizli + Görsel ayırıcı görünür + + YouTube Doodle\'larını gizle + Logodaki YouTube Doodles animasyonu gizli + Logodaki YouTube Doodles animasyonu görünür + "YouTube Doodles, her yıl birkaç gün gösterilir. Bir Doodle şu anda bölgenizde gösteriliyorsa ve bu gizleme ayarı açıksa, arama çubuğunun altındaki filtre çubuğu da gizlenecektir." - Kanal çubuğunu gizle - Kanal çubuğu gizli - Kanal çubuğu görünür - Kanal filigranını gizle - Filigran gizli - Filigran görünür - Bağış etkinliği kutularını gizle - Bağış etkinliği kutuları gizli - Bağış etkinliği kutuları görünür - Acil durum kutularını gizle - Acil durum kutuları gizli - Acil durum kutuları görünür - Bilgi panellerini gizle - Bilgi panelleri gizli - Bilgi panelleri görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Tıbbi bilgi panellerini gizle - Tıbbi bilgi panelleri gizli - Tıbbi bilgi panelleri görünür - Hızlı eylemleri gizle - Tam ekrandaki hızlı eylemler gizli - Tam ekrandaki hızlı eylemler görünür - İlgili videoları gizle - Hızlı eylemlerdeki ilgili videolar gizli - Hızlı eylemlerdeki ilgili videolar görünür - Abone yönergelerini gizle - Abone topluluk kuralları gizli - Abone topluluk kuralları görünür - Süreli tepkileri gizle - Süreli tepkiler gizli - Süreli tepkiler görünür - \'Yapay zeka tarafından oluşturulan video özeti\'ni gizle - Yapay zeka tarafından oluşturulan video özet kısmı gizli - Yapay zeka tarafından oluşturulan video özet kısmı görünür - \'Sor\'u gizle - Sor kısmı gizli - Sor kısmı görünür - Nitelikleri gizle - Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları gizli - Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları görünür - Bölümleri gizle - Bölümler kısmı gizli - Bölümler kısmı görünür - \'Bu içerik nasıl yapıldı\'yı gizle - Bu içerik nasıl yapıldı kısmı gizli - Bu içerik nasıl yapıldı kısmı görünür - Hype puanlarını gizle - Hype puanları gizli - Hype puanları görünür - \"Podcast\'i keşfedin\"i gizle - Podcast\'i keşfedin kısmı gizli - Podcast\'i keşfedin kısmı görünür - Öne çıkan bağlantıları gizle - Öne çıkan bağlantılar kısmı gizli - Öne çıkan bağlantılar kısmı görünür - Öne çıkan videoları gizle - Öne çıkan videolar kısmı gizli - Öne çıkan videolar kısmı görünür - Bilgi kartlarını gizle - Bilgi kartları kısmı gizli - Bilgi kartları kısmı görünür - \'Anahtar kavramlar\'ı gizle - Anahtar kavramlar kısmı gizli - Anahtar kavramlar kısmı görünür - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Transkripti gizle - Transkript kısmı gizli - Transkript kısmı görünür - Video açıklaması - Video açıklamasındaki bileşenleri gizle veya göster - Filtreleme çubuğu - Akışlarda, ilgili videolarda, arama sonuçlarında ve izleme geçmişinde filtre çubuğunu gizle veya göster - Akışlarda gizle - Akışlarda gizli - Akışlarda görünür - Alâkalı videolarda gizle - Alâkalı videolarda gizli - Alâkalı videolarda görünür - Arama sonuçlarında gizle - Arama sonuçlarında gizli - Arama sonuçlarında görünür - İzleme geçmişinde gizle - İzleme geçmişinde gizli - İzleme geçmişinde görünür - Kanal sayfası - Kanal sayfası bileşenlerini gizle veya göster - - Topluluk düğmesini gizle - Topluluk düğmesi gizli - Topluluk düğmesi görünür - - \'Sizin İçin\' rafını gizle - Sizin İçin rafı gizli - Sizin İçin rafı görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Bağlantı ön izlemesini gizle - Bağlantı ön izlemesi gizli - Bağlantı ön izlemesi görünür - Üyeler rafını gizle - Üyeler rafı gizli - Üyeler rafı görünür - - Mağaza düğmesini gizle - Mağaza düğmesi gizli - Mağaza düğmesi görünür - - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Yorumlar - Yorumlar kısmı bileşenlerini gizle veya göster - Yapay zeka sohbet özetini gizle - Yapay zeka sohbet özeti gizli - Yapay zeka sohbet özeti görünür - Yapay zeka yorumların özetini gizle - Yapay zeka yorumların özeti gizli - Yapay zeka yorumların özeti görünür - Kanal yönergelerini gizle - Kanal yönergeleri gizli - Kanal yönergeleri görünür - \'Üyelerin yorumları\' başlığını gizle - Üyelerin yorumları başlığı gizli - Üyelerin yorumları başlığı görünür - Yorumlar kısmını gizle - Yorumlar kısmı gizli - Yorumlar kısmı görünür - Topluluk kurallarını gizle - Topluluk kuralları gizli - Topluluk kuralları görünür - \'Short oluştur\' düğmesini gizle - Short oluştur düğmesi gizli - Short oluştur düğmesi görünür - Emoji ve Zaman damgası düğmelerini gizle - Emoji ve Zaman damgası düğmeleri gizli - Emoji ve Zaman damgası düğmeleri görünür - Ön izlenen yorumu gizle - Ön izlenen yorum gizli - Ön izlenen yorum görünür - Teşekkürler düğmesini gizle - Teşekkürler düğmesi gizli - Teşekkürler düğmesi görünür - İzlenme sayısını gizle - İzlenme sayısı akışta ve arama sonuçlarında gizli - İzlenme sayısı akışta ve arama sonuçlarında görünür - - "Sınırlamalar: + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + Tıbbi bilgi panellerini gizle + Tıbbi bilgi panelleri gizli + Tıbbi bilgi panelleri görünür + Hızlı eylemleri gizle + Tam ekrandaki hızlı eylemler gizli + Tam ekrandaki hızlı eylemler görünür + İlgili videoları gizle + Hızlı eylemlerdeki ilgili videolar gizli + Hızlı eylemlerdeki ilgili videolar görünür + Abone yönergelerini gizle + Abone topluluk kuralları gizli + Abone topluluk kuralları görünür + Süreli tepkileri gizle + Süreli tepkiler gizli + Süreli tepkiler görünür + \'Yapay zeka tarafından oluşturulan video özeti\'ni gizle + Yapay zeka tarafından oluşturulan video özet kısmı gizli + Yapay zeka tarafından oluşturulan video özet kısmı görünür + \'Sor\'u gizle + Sor kısmı gizli + Sor kısmı görünür + Nitelikleri gizle + Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları gizli + Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları görünür + Bölümleri gizle + Bölümler kısmı gizli + Bölümler kısmı görünür + \'Bu içerik nasıl yapıldı\'yı gizle + Bu içerik nasıl yapıldı kısmı gizli + Bu içerik nasıl yapıldı kısmı görünür + Hype puanlarını gizle + Hype puanları gizli + Hype puanları görünür + \"Podcast\'i keşfedin\"i gizle + Podcast\'i keşfedin kısmı gizli + Podcast\'i keşfedin kısmı görünür + Öne çıkan bağlantıları gizle + Öne çıkan bağlantılar kısmı gizli + Öne çıkan bağlantılar kısmı görünür + Öne çıkan videoları gizle + Öne çıkan videolar kısmı gizli + Öne çıkan videolar kısmı görünür + Bilgi kartlarını gizle + Bilgi kartları kısmı gizli + Bilgi kartları kısmı görünür + \'Anahtar kavramlar\'ı gizle + Anahtar kavramlar kısmı gizli + Anahtar kavramlar kısmı görünür + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Transkripti gizle + Transkript kısmı gizli + Transkript kısmı görünür + Video açıklaması + Video açıklamasındaki bileşenleri gizle veya göster + Filtreleme çubuğu + Akışlarda, ilgili videolarda, arama sonuçlarında ve izleme geçmişinde filtre çubuğunu gizle veya göster + Akışlarda gizle + Akışlarda gizli + Akışlarda görünür + Alâkalı videolarda gizle + Alâkalı videolarda gizli + Alâkalı videolarda görünür + Arama sonuçlarında gizle + Arama sonuçlarında gizli + Arama sonuçlarında görünür + İzleme geçmişinde gizle + İzleme geçmişinde gizli + İzleme geçmişinde görünür + Kanal sayfası + Kanal sayfası bileşenlerini gizle veya göster + + Topluluk düğmesini gizle + Topluluk düğmesi gizli + Topluluk düğmesi görünür + + \'Sizin İçin\' rafını gizle + Sizin İçin rafı gizli + Sizin İçin rafı görünür + + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + Bağlantı ön izlemesini gizle + Bağlantı ön izlemesi gizli + Bağlantı ön izlemesi görünür + Üyeler rafını gizle + Üyeler rafı gizli + Üyeler rafı görünür + + Mağaza düğmesini gizle + Mağaza düğmesi gizli + Mağaza düğmesi görünür + + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Yorumlar + Yorumlar kısmı bileşenlerini gizle veya göster + Yapay zeka sohbet özetini gizle + Yapay zeka sohbet özeti gizli + Yapay zeka sohbet özeti görünür + Yapay zeka yorumların özetini gizle + Yapay zeka yorumların özeti gizli + Yapay zeka yorumların özeti görünür + Kanal yönergelerini gizle + Kanal yönergeleri gizli + Kanal yönergeleri görünür + \'Üyelerin yorumları\' başlığını gizle + Üyelerin yorumları başlığı gizli + Üyelerin yorumları başlığı görünür + Yorumlar kısmını gizle + Yorumlar kısmı gizli + Yorumlar kısmı görünür + Topluluk kurallarını gizle + Topluluk kuralları gizli + Topluluk kuralları görünür + \'Short oluştur\' düğmesini gizle + Short oluştur düğmesi gizli + Short oluştur düğmesi görünür + Emoji ve Zaman damgası düğmelerini gizle + Emoji ve Zaman damgası düğmeleri gizli + Emoji ve Zaman damgası düğmeleri görünür + Ön izlenen yorumu gizle + Ön izlenen yorum gizli + Ön izlenen yorum görünür + Teşekkürler düğmesini gizle + Teşekkürler düğmesi gizli + Teşekkürler düğmesi görünür + İzlenme sayısını gizle + İzlenme sayısı akışta ve arama sonuçlarında gizli + İzlenme sayısı akışta ve arama sonuçlarında görünür + + "Sınırlamalar: • Shorts rafları, kanal sayfaları ve arama sonuçları yine de izlenme sayılarını gösterebilir • Bu özellik otomotiv form faktörüyle çalışmaz" - Yüklenme zamanını gizle - Yüklenme zamanı akışta ve arama sonuçlarında gizli - Yüklenme zamanı akışta ve arama sonuçlarında görünür - - "Sınırlamalar: + Yüklenme zamanını gizle + Yüklenme zamanı akışta ve arama sonuçlarında gizli + Yüklenme zamanı akışta ve arama sonuçlarında görünür + + "Sınırlamalar: • Shorts rafları, kanal sayfaları ve arama sonuçları yine de yüklenme zamanlarını gösterebilir • Bu özellik otomotiv form faktörü ile çalışmaz" - Anahtar kelimeyle içerik gizle - Anahtar kelime filtreleriyle arama sonuçlarındaki ve akıştaki videoları gizle - Ana sayfadaki videoları anahtar kelimelerle gizle - Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenir - Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenmez - Arama sonuçlarını anahtar kelimelerle gizle - Arama sonuçları anahtar kelimelerle filtrelenir - Arama sonuçları anahtar kelimelerle filtrelenmez - Aboneliklerdeki videoları anahtar kelimelerle gizle - Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenir - Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenmez - Gizlenecek anahtar kelimeler - - "Yeni satırlarla ayrılmış gizlenecek anahtar kelimeler ve ifadeler + "Yeni satırlarla ayrılmış gizlenecek anahtar kelimeler ve ifadeler Anahtar kelimeler, kanal adları veya video başlıklarında gösterilen herhangi bir metin olabilir Ortadaki harfleri büyük olan kelimeler, büyük/küçük harf kullanımına göre girilmelidir (örneğin: iPhone, TikTok, LeBlanc)" - Anahtar kelimeyle filtreleme hakkında - "Ana Sayfa/Abonelikler/Arama sonuçları, anahtar kelime ifadeleriyle eşleşen içeriği gizlemek için filtrelenir + Anahtar kelimeyle filtreleme hakkında + "Ana Sayfa/Abonelikler/Arama sonuçları, anahtar kelime ifadeleriyle eşleşen içeriği gizlemek için filtrelenir Sınırlamalar • Shorts, kanal adı ile gizlenemez • Bazı kullanıcı arayüzü bileşenleri gizlenemeyebilir • Bir anahtar kelime aranması sonuç göstermeyebilir" - Tam kelimeleri eşleştir - - Bir anahtar kelimeyi veya ifadeyi tırnak işareti içine almak, video başlıkları ve kanal adlarının kısmi eşleşmelerini önleyecektir<br><br>Örneğin,<br><b>\"ağustos\"</b>, <b>Ağustos ayında kardan adam yapmak!</b> başlıklı videoyu gizleyecektir<br>ancak <b>Ağustosböcekleri hakkında bilgiler</b> başlıklı videoyu gizlemeyecektir - - Anahtar kelime kullanılamıyor: %s - Kullanmak için tırnak içine alın: %s - Anahtar kelimede çelişki var: %s - Kelime kısa, tırnak içine alın: %s - Kelime bütün videoları gizler: %s - - - İçerik üreticisi mağazası rafını gizle - Video oynatıcısının altındaki içerik üreticisi mağazası rafı gizli - Video oynatıcısının altındaki içerik üreticisi mağazası rafı görünür - Bitiş ekranındaki mağaza afişini gizle - Bitiş ekranı mağaza afişi gizli - Bitiş ekranı mağaza afişi görünür - Tam ekran reklamları gizle - "Tam ekran reklamlar gizli + Tam kelimeleri eşleştir + + Bir anahtar kelimeyi veya ifadeyi tırnak işareti içine almak, video başlıkları ve kanal adlarının kısmi eşleşmelerini önleyecektir<br><br>Örneğin,<br><b>\"ağustos\"</b>, <b>Ağustos ayında kardan adam yapmak!</b> başlıklı videoyu gizleyecektir<br>ancak <b>Ağustosböcekleri hakkında bilgiler</b> başlıklı videoyu gizlemeyecektir + + Anahtar kelime kullanılamıyor: %s + Kullanmak için tırnak içine alın: %s + Anahtar kelimede çelişki var: %s + Kelime kısa, tırnak içine alın: %s + Kelime bütün videoları gizler: %s + + + İçerik üreticisi mağazası rafını gizle + Video oynatıcısının altındaki içerik üreticisi mağazası rafı gizli + Video oynatıcısının altındaki içerik üreticisi mağazası rafı görünür + Bitiş ekranındaki mağaza afişini gizle + Bitiş ekranı mağaza afişi gizli + Bitiş ekranı mağaza afişi görünür + Tam ekran reklamları gizle + "Tam ekran reklamlar gizli Bu özellik yalnızca eski cihazlarda kullanılabilir" - Tam ekran reklamlar görünür - - Tam ekran reklamlar sadece eski cihazlarda gizlenebilir - Genel reklamları gizle - Genel reklamlar gizli - Genel reklamlar görünür - Ürün afişlerini gizle - Ürün afişleri gizli - Ürün afişleri görünür - Ücretli tanıtım etiketini gizle - Ücretli tanıtım etiketi gizli - Ücretli tanıtım etiketi görünür - Kendine sponsor kartları gizle - Kendine sponsor kartlar gizli - Kendine sponsor kartlar görünür - Alışveriş bağlantılarını gizle - Video açıklamasındaki alışveriş bağlantıları gizli - Video açıklamasındaki alışveriş bağlantıları görünür - \'Ürünleri görüntüle\' afişini gizle - Video katmanındaki ürünleri görüntüle afişi gizli - Video katmanındaki ürünleri görüntüle afişi görünür - Web arama sonuçlarını gizle - Web arama sonuçları gizli - Web arama sonuçları görünür - - - YouTube Premium promosyonlarını gizle - Video oynatıcısı altındaki YouTube Premium promosyonları gizli - Video oynatıcısı altındaki YouTube Premium promosyonları görünür - - - Video reklamlarını gizle - Video reklamları gizli - Video reklamları görünür - - - URL panoya kopyalandı - Zaman damgalı URL kopyalandı - Video URL\'sini kopyalama düğmesini göster - Video URL\'sini kopyalama düğmesi gösterilir. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun - Video URL\'sini kopyalama düğmesi gösterilmez - Zaman damgalı URL\'yi kopyalama düğmesini göster - Zaman damgalı URL kopyalama düğmesi gösterilir. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun - Zaman damgalı URL kopyalama düğmesi gösterilmez - - - İzleyici takdiri iletişim kutusunu kaldır - İletişim kutusu kaldırılacak - İletişim kutusu gösterilecek - Bu, yaş kısıtlamasını atlamaz. Sadece otomatik olarak kabul eder. - - - TV\'de oturum açma penceresini devre dışı bırak - TV\'de oturum açma penceresi devre dışı - TV\'de oturum açma penceresi etkin - - - Çift dokunuşla bölüm atlamayı devre dışı bırak - Çift dokunuş asla bir sonraki/önceki bölüme atlamayı tetikleyemez - Çift dokunuş zaman zaman bir sonraki/önceki bölüme atlamayı tetikleyebilir - - - Harici indirmeler - Harici indirici kullanımı için ayarlar - Harici indirme düğmesini göster - Oynatıcıda indirme düğmesi gösterilir - Oynatıcıda indirme düğmesi gösterilmez - - İndirme eylem düğmesini kullan - İndirme düğmesi harici indiricinizi açar - İndirme düğmesi yerel uygulama içi indiriciyi açar - İndirici paket adı - Yüklü harici indirme uygulamanızın paket adı - Paket adını girin - Diğer - Uygulama yüklü değil - %s yüklü değil. Lütfen yükleyin. - "%s paket adıyla yüklü uygulama bulunamadı + Tam ekran reklamlar görünür + + Tam ekran reklamlar sadece eski cihazlarda gizlenebilir + Genel reklamları gizle + Genel reklamlar gizli + Genel reklamlar görünür + Ürün afişlerini gizle + Ürün afişleri gizli + Ürün afişleri görünür + Ücretli tanıtım etiketini gizle + Ücretli tanıtım etiketi gizli + Ücretli tanıtım etiketi görünür + Kendine sponsor kartları gizle + Kendine sponsor kartlar gizli + Kendine sponsor kartlar görünür + Alışveriş bağlantılarını gizle + Video açıklamasındaki alışveriş bağlantıları gizli + Video açıklamasındaki alışveriş bağlantıları görünür + \'Ürünleri görüntüle\' afişini gizle + Video katmanındaki ürünleri görüntüle afişi gizli + Video katmanındaki ürünleri görüntüle afişi görünür + Web arama sonuçlarını gizle + Web arama sonuçları gizli + Web arama sonuçları görünür + + + YouTube Premium promosyonlarını gizle + Video oynatıcısı altındaki YouTube Premium promosyonları gizli + Video oynatıcısı altındaki YouTube Premium promosyonları görünür + + + Video reklamlarını gizle + Video reklamları gizli + Video reklamları görünür + + + URL panoya kopyalandı + Zaman damgalı URL kopyalandı + Video URL\'sini kopyalama düğmesini göster + Video URL\'sini kopyalama düğmesi gösterilir. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun + Video URL\'sini kopyalama düğmesi gösterilmez + Zaman damgalı URL\'yi kopyalama düğmesini göster + Zaman damgalı URL kopyalama düğmesi gösterilir. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun + Zaman damgalı URL kopyalama düğmesi gösterilmez + + + İzleyici takdiri iletişim kutusunu kaldır + İletişim kutusu kaldırılacak + İletişim kutusu gösterilecek + Bu, yaş kısıtlamasını atlamaz. Sadece otomatik olarak kabul eder. + + + TV\'de oturum açma penceresini devre dışı bırak + TV\'de oturum açma penceresi devre dışı + TV\'de oturum açma penceresi etkin + + + Çift dokunuşla bölüm atlamayı devre dışı bırak + Çift dokunuş asla bir sonraki/önceki bölüme atlamayı tetikleyemez + Çift dokunuş zaman zaman bir sonraki/önceki bölüme atlamayı tetikleyebilir + + + Harici indirmeler + Harici indirici kullanımı için ayarlar + Harici indirme düğmesini göster + Oynatıcıda indirme düğmesi gösterilir + Oynatıcıda indirme düğmesi gösterilmez + + İndirme eylem düğmesini kullan + İndirme düğmesi harici indiricinizi açar + İndirme düğmesi yerel uygulama içi indiriciyi açar + İndirici paket adı + Yüklü harici indirme uygulamanızın paket adı + Paket adını girin + Diğer + Uygulama yüklü değil + %s yüklü değil. Lütfen yükleyin. + "%s paket adıyla yüklü uygulama bulunamadı Paket adının doğru olduğunu ve uygulamanın yüklü olduğunu doğrulayın" - Paket adı boş olamaz - - - Hassas sardırma hareketini devre dışı bırak - Hassas sardırma hareketi devre dışı - Hassas sardırma hareketi etkin - - - Dokunarak sardırmayı etkinleştir - Dokunarak sardırma etkin - Dokunarak sardırma devre dışı - - - Parlaklık hareketini etkinleştir - "Tam ekran parlaklık kaydırma etkin + Paket adı boş olamaz + + + Hassas sardırma hareketini devre dışı bırak + Hassas sardırma hareketi devre dışı + Hassas sardırma hareketi etkin + + + Dokunarak sardırmayı etkinleştir + Dokunarak sardırma etkin + Dokunarak sardırma devre dışı + + + Parlaklık hareketini etkinleştir + "Tam ekran parlaklık kaydırma etkin Ekranın sol tarafında dikey olarak kaydırarak parlaklığı ayarlayın" - Tam ekran parlaklık kaydırma devre dışı - Ses hareketini etkinleştir - "Tam ekran ses kaydırma etkin + Tam ekran parlaklık kaydırma devre dışı + Ses hareketini etkinleştir + "Tam ekran ses kaydırma etkin Ekranın sağ tarafında dikey olarak kaydırarak sesi ayarlayın" - Tam ekran ses kaydırma devre dışı - Basılı tutup kaydırma hareketini etkinleştir - Basılı tutup kaydırma hareketi etkin - Basılı tutup kaydırma hareketi devre dışı - Titreşimli geri bildirimi etkinleştir - Titreşimli geri bildirim etkin - Titreşimli geri bildirim devre dışı - Parlaklığı kaydet ve geri yükle - Tam ekrana girip çıkarken parlaklığı kaydet ve geri yükle - Tam ekrana girip çıkarken parlaklığı kaydetme ve geri yükleme - Otomatik parlaklık hareketini etkinleştir - Parlaklık hareketinin en düşük değerine kaydırma otomatik parlaklığı etkinleştirir - Parlaklık hareketinin en düşük değerine kaydırma otomatik parlaklığı etkinleştirmez - Oto - Kaydırma paneli zaman aşımı - Panelin görünür olduğu milisaniye miktarı - Kaydırma paneli arka plan opaklığı - 0-100 arasında opaklık değeri - Kaydırma opaklığı 0-100 arasında olmalıdır - Kaydırma katmanı parlaklık rengi - Parlaklık kontrolleri için ilerleme çubuğunun rengi - Kaydırma katmanı ses rengi - Ses kontrolleri için ilerleme çubuğunun rengi - Kaydırma katmanı metin boyutu - Kaydırma katmanı için 1-30 arası metin boyutu - Metin boyutu 1-30 arasında olmalıdır - Kaydırma büyüklük eşiği - Kaydırma işleminin gerçekleşmesi için eşik miktarı - Ses kaydırma hassasiyeti - Kaydırma başına sesin ne kadar değişeceği - Kaydırma katmanı stili - Yatay katman - Yatay katman (minimal - üst) - Yatay katman (minimal - orta) - Dairesel katman - Dairesel katman (minimal) - Dikey katman - Dikey katman (minimal) - Kaydırarak video değiştirmeyi etkinleştir - Tam ekran modunda kaydırma, bir sonraki/önceki videoya geçecektir - Tam ekran modunda kaydırma, bir sonraki/önceki videoya geçmeyecektir - - - Otomatik altyazıları devre dışı bırak - Otomatik altyazılar devre dışı - Otomatik altyazılar etkin - - - Eylem düğmeleri - Videoların altındaki düğmeleri gizle veya göster - Beğen ve Abone ol parlamasını devre dışı bırak - Beğen ve Abone Ol düğmesi bahsedildiğinde parlamayacak - Beğen ve Abone Ol düğmesi bahsedildiğinde parlayacak - Beğenme ve Beğenmemeyi gizle - Beğenme ve Beğenmeme düğmeleri gizli - Beğenme ve Beğenmeme düğmeleri görünür - - Paylaş\'ı gizle - Paylaş düğmesi gizli - Paylaş düğmesi görünür - - Reklamları durdur\'u Gizle - Reklamları durdur düğmesi gizli - Reklamları durdur düğmesi görünür - - Yorumları gizle - Yorumlar düğmesi gizli - Yorumlar düğmesi görünür - + + Otomatik altyazıları devre dışı bırak + Otomatik altyazılar devre dışı + Otomatik altyazılar etkin + + + Eylem düğmeleri + Videoların altındaki düğmeleri gizle veya göster + Beğen ve Abone ol parlamasını devre dışı bırak + Beğen ve Abone Ol düğmesi bahsedildiğinde parlamayacak + Beğen ve Abone Ol düğmesi bahsedildiğinde parlayacak + Beğenme ve Beğenmemeyi gizle + Beğenme ve Beğenmeme düğmeleri gizli + Beğenme ve Beğenmeme düğmeleri görünür + + Paylaş\'ı gizle + Paylaş düğmesi gizli + Paylaş düğmesi görünür + + Reklamları durdur\'u Gizle + Reklamları durdur düğmesi gizli + Reklamları durdur düğmesi görünür + + Yorumları gizle + Yorumlar düğmesi gizli + Yorumlar düğmesi görünür + - Bildir\'i gizle - Bildir düğmesi gizli - Bildir düğmesi görünür - - Remix\'i gizle - Remix düğmesi gizli - Remix düğmesi görünür - - İndir\'i gizle - İndir düğmesi gizli - İndir düğmesi görünür - + Remix\'i gizle + Remix düğmesi gizli + Remix düğmesi görünür + + İndir\'i gizle + İndir düğmesi gizli + İndir düğmesi görünür + - Hype\'ı gizle - Hype düğmesi gizli - Hype düğmesi görünür - - Tanıt\'ı gizle - Tanıt düğmesi gizli - Tanıt düğmesi görünür - - Teşekkürler\'i gizle - Teşekkürler düğmesi gizli - Teşekkürler düğmesi görünür - + Tanıt\'ı gizle + Tanıt düğmesi gizli + Tanıt düğmesi görünür + + Teşekkürler\'i gizle + Teşekkürler düğmesi gizli + Teşekkürler düğmesi görünür + - Sor\'u gizle - Sor düğmesi gizli - Sor düğmesi görünür - - Klip\'i gizle - Klip düğmesi gizli - Klip düğmesi görünür - - Alışveriş\'i gizle - Alışveriş düğmesi gizli - Alışveriş düğmesi görünür - - Kaydet\'i gizle - Kaydet düğmesi gizli - Kaydet düğmesi görünür - - - Gezinti düğmeleri - Gezinti çubuğundaki düğmeleri gizle veya değiştir - - Ana Sayfa\'yı gizle - Ana Sayfa düğmesi gizli - Ana Sayfa düğmesi görünür - - Shorts\'u gizle - Shorts düğmesi gizli - Shorts düğmesi görünür - - Oluştur\'u gizle - Oluştur düğmesi gizli - Oluştur düğmesi görünür - - Abonelikleri gizle - Abonelikler düğmesi gizli - Abonelikler düğmesi görünür - Bildirimleri gizle - Bildirimler düğmesi gizli - Bildirimler düğmesi görünür - - Oluştur ve Bildirimleri yer değiştir - "Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilir + Sor\'u gizle + Sor düğmesi gizli + Sor düğmesi görünür + + Klip\'i gizle + Klip düğmesi gizli + Klip düğmesi görünür + + Alışveriş\'i gizle + Alışveriş düğmesi gizli + Alışveriş düğmesi görünür + + Kaydet\'i gizle + Kaydet düğmesi gizli + Kaydet düğmesi görünür + + + Gezinti düğmeleri + Gezinti çubuğundaki düğmeleri gizle veya değiştir + + Ana Sayfa\'yı gizle + Ana Sayfa düğmesi gizli + Ana Sayfa düğmesi görünür + + Shorts\'u gizle + Shorts düğmesi gizli + Shorts düğmesi görünür + + Oluştur\'u gizle + Oluştur düğmesi gizli + Oluştur düğmesi görünür + + Abonelikleri gizle + Abonelikler düğmesi gizli + Abonelikler düğmesi görünür + Bildirimleri gizle + Bildirimler düğmesi gizli + Bildirimler düğmesi görünür + + Oluştur ve Bildirimleri yer değiştir + "Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilir Not: Bunu etkinleştirmek aynı zamanda video reklamlarını zorla gizler" - Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilmez - "Bu ayarın devre dışı bırakılması, Shorts reklam engellemeyi de devre dışı bırakır. + Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilmez + "Bu ayarın devre dışı bırakılması, Shorts reklam engellemeyi de devre dışı bırakır. Bu ayarı değiştirmek etkili olmazsa, Gizli moda geçmeyi deneyin." - Gezinti düğmeleri etiketlerini gizle - Etiketler gizli - Etiketler görünür - Yarı saydam durum çubuğunu devre dışı bırak - Durum çubuğu opak - Durum çubuğu opak veya yarı saydam - Bazı cihazlarda, bu özelliği etkinleştirmek sistem gezinme çubuğunu şeffaf hale getirebilir. - Aydınlık temada yarı saydam çubuğu devre dışı bırak - Aydınlık temada gezinti çubuğu opak - Aydınlık temada gezinti çubuğu opak veya yarı saydam - Koyu temada yarı saydam çubuğu devre dışı bırak - Koyu temada gezinti çubuğu opak - Koyu temada gezinti çubuğu opak veya yarı saydam - - - Açılır menü - Oynatıcı açılır menü öğelerini gizle veya göster - - Altyazıları gizle - Altyazılar menüsü gizli - Altyazılar menüsü görünür - - Ek ayarları gizle - Ek ayarlar menüsü gizli - Ek ayarlar menüsü görünür - - Uyku zamanlayıcısını gizle - Uyku zamanlayıcısı menüsü gizli - Uyku zamanlayıcısı menüsü görünür - - Videoyu döngüye almayı gizle - Videoyu döngüye al menüsü gizli - Videoyu döngüye al menüsü görünür - - Ambiyans modunu gizle - Ambiyans modu menüsü gizli - Ambiyans modu menüsü görünür - Sabit sesi gizle - Sabit ses menüsü görünür - Sabit ses menüsü gizli - - Yardım ve geri bildirimi gizle - Yardım ve geri bildirim menüsü gizli - Yardım ve geri bildirim menüsü görünür - - Oynatma hızını gizle - Oynatma hızı menüsü gizli - Oynatma hızı menüsü görünür - - Ekranı kilitlemeyi gizle - Ekranı kilitle menüsü gizli - Ekranı kilitle menüsü görünür - - \"YouTube Music\'le Dinleyin\"i gizle - YouTube Music\'le Dinleyin menüsü gizli - YouTube Music\'le Dinleyin menüsü görünür - - Ses parçasını gizle - Ses parçası menüsü gizli - Ses parçası menüsü görünür - + + Açılır menü + Oynatıcı açılır menü öğelerini gizle veya göster + + Altyazıları gizle + Altyazılar menüsü gizli + Altyazılar menüsü görünür + + Ek ayarları gizle + Ek ayarlar menüsü gizli + Ek ayarlar menüsü görünür + + Uyku zamanlayıcısını gizle + Uyku zamanlayıcısı menüsü gizli + Uyku zamanlayıcısı menüsü görünür + + Videoyu döngüye almayı gizle + Videoyu döngüye al menüsü gizli + Videoyu döngüye al menüsü görünür + + Ambiyans modunu gizle + Ambiyans modu menüsü gizli + Ambiyans modu menüsü görünür + Sabit sesi gizle + Sabit ses menüsü görünür + Sabit ses menüsü gizli + + Yardım ve geri bildirimi gizle + Yardım ve geri bildirim menüsü gizli + Yardım ve geri bildirim menüsü görünür + + Oynatma hızını gizle + Oynatma hızı menüsü gizli + Oynatma hızı menüsü görünür + + Ekranı kilitlemeyi gizle + Ekranı kilitle menüsü gizli + Ekranı kilitle menüsü görünür + + \"YouTube Music\'le Dinleyin\"i gizle + YouTube Music\'le Dinleyin menüsü gizli + YouTube Music\'le Dinleyin menüsü görünür + + Ses parçasını gizle + Ses parçası menüsü gizli + Ses parçası menüsü görünür + - "Ses parçası menüsü gizli + "Ses parçası menüsü gizli Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayarını 'Android No SDK' olarak değiştirin" - - VR modunda izlemeyi gizle - VR modunda izle menüsü gizli - VR modunda izle menüsü görünür - Video kalite menüsünü gizle - Video kalite menüsü gizli - Video kalite menüsü görünür - Video kalite menüsü alt bilgisini gizle - Video kalite menüsü alt bilgisi gizli - Video kalite menüsü alt bilgisi görünür - - - Otomatik oynatma düğmesini gizle - Otomatik oynatma düğmesi gizli - Otomatik oynatma düğmesi görünür - - Altyazı düğmesini gizle - Altyazı düğmesi gizli - Altyazı düğmesi görünür - Yayınla düğmesini gizle - Yayınla düğmesi gizli - Yayınla düğmesi görünür - Oynatıcı kontrolleri arka planını gizle - Oynatıcı kontrolleri arka planı gizli - Oynatıcı kontrolleri arka planı görünür - Önceki & Sonraki düğmelerini gizle - Önceki & Sonraki düğmeleri gizli - Önceki & Sonraki düğmeleri görünür - - - Bitiş ekranı kartlarını gizle - Bitiş ekranı kartları gizli - Bitiş ekranı kartları görünür - - - Tam ekranda ambiyans modunu devre dışı bırak - Ambiyans modu devre dışı - Ambiyans modu etkin - - - Bilgi kartlarını gizle - Bilgi kartları gizli - Bilgi kartları görünür - - - Kayan sayı animasyonlarını devre dışı bırak - Kayan sayı animasyonları devre dışı - Kayan sayı animasyonları etkin - - - Video oynatıcısı zaman çubuğunu gizle - Video oynatıcısı zaman çubuğu gizli - Video oynatıcısı zaman çubuğu görünür - - Video kapak fotoğrafı zaman çubuğunu gizle - Video kapak fotoğrafı zaman çubuğu gizli - Video kapak fotoğrafı zaman çubuğu görünür - - - Shorts oynatıcı - Shorts oynatıcı bileşenlerini gizle veya göster - - Ana Sayfa akışında Shorts\'u gizle - Ana Sayfa akışında ve ilgili videolarda gizli - Ana Sayfa akışında ve ilgili videolarda görünür - Arama sonuçlarında Shorts\'u gizle - Arama sonuçlarında gizli - Arama sonuçlarında görünür - - Abonelikler akışında Shorts\'u gizle - Abonelikler akışında gizli - Abonelikler akışında görünür - İzleme geçmişinde Shorts\'u gizle - İzleme geçmişinde gizli - İzleme geçmişinde görünür - \'Otomatik dublajlı\' etiketini gizle - Otomatik dublajlı etiketi gizli - Otomatik dublajlı etiketi görünür - \'Süper Teşekkürler\' düğmesini gizle - Süper Teşekkürler düğmesi gizli - Süper Teşekkürler düğmesi görünür - Efekt düğmesini gizle - Efekt düğmesi gizli - Efekt düğmesi görünür - \'Yeşil ekran\' düğmesini gizle - Yeşil ekran düğmesi gizli - Yeşil ekran düğmesi görünür - Hashtag düğmesini gizle - Hashtag düğmesi gizli - Hashtag düğmesi görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Canlı ön izlemeyi gizle - Canlı ön izleme gizli - Canlı ön izleme görünür - Konum etiketini gizle - Konum etiketi gizli - Konum etiketi görünür - \'Yeni gönderiler\' düğmesini gizle - Yeni gönderiler düğmesi gizli - Yeni gönderiler düğmesi görünür - Duraklama katmanı düğmelerini gizle - Duraklama katmanı düğmeleri gizli - Duraklama katmanı düğmeleri görünür - Ön izlenen yorumu gizle - Ön izlenen yorum gizli - Ön izlenen yorum görünür - \'Müziği kaydet\' düğmesini gizle - Müziği kaydet düğmesi gizli - Müziği kaydet düğmesi görünür - Arama önerilerini gizle - Arama önerileri gizli - Arama önerileri görünür - Alışveriş düğmesini gizle - Mağaza düğmesi gizli - Mağaza düğmesi görünür - Çıkartmaları gizle - Çıkartmalar gizli - Çıkartmalar görünür - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Etiketli ürünleri gizle - Etiketli ürünler gizli - Etiketli ürünler görünür - Gelecek düğmesini gizle - Gelecek düğmesi gizli - Gelecek düğmesi görünür - \'Bu sesi kullan\' düğmesini gizle - Bu sesi kullan düğmesi gizli - Bu sesi kullan düğmesi görünür - \'Bu şablonu kullan\' düğmesini gizle - Bu şablonu kullan düğmesi gizli - Bu şablonu kullan düğmesi görünür - Beğeni düğmesi çeşme animasyonunu gizle - Beğeni düğmesi çeşme animasyonu gizli - Beğeni düğmesi çeşme animasyonu görünür - Beğen düğmesini gizle - Beğen düğmesi gizli - Beğen düğmesi görünür - Beğenmeme düğmesini gizle - Beğenmeme düğmesi gizli - Beğenmeme düğmesi görünür - Yorumlar düğmesini gizle - Yorumlar düğmesi gizli - Yorumlar düğmesi görünür - - Paylaş düğmesini gizle - Paylaş düğmesi gizli - Paylaş düğmesi görünür - - Remix düğmesini gizle - Remix düğmesi gizli - Remix düğmesi görünür - Ses düğmesini gizle - Ses düğmesi gizli - Ses düğmesi görünür - Bilgi panelini gizle - Bilgi paneli gizli - Bilgi paneli görünür - Kanal çubuğunu gizle - Kanal çubuğu gizli - Kanal çubuğu görünür - Video başlığını gizle - Video başlığı gizli - Video başlığı görünür - Ses bilgisi etiketini gizle - Ses bilgisi etiketi gizli - Ses bilgisi etiketi görünür - Video bağlantısı etiketini gizle - Video bağlantısı etiketi gizli - Video bağlantısı etiketi görünür - Gezinme çubuğunu gizle - Gezinme çubuğu gizli - Gezinti çubuğu görünür - - - Bitiş ekranı önerilen videosunu gizle - "Otomatik oynatma kapatıldığında bitiş ekranı önerilen videosu gizlenir + + VR modunda izlemeyi gizle + VR modunda izle menüsü gizli + VR modunda izle menüsü görünür + Video kalite menüsünü gizle + Video kalite menüsü gizli + Video kalite menüsü görünür + Video kalite menüsü alt bilgisini gizle + Video kalite menüsü alt bilgisi gizli + Video kalite menüsü alt bilgisi görünür + + + Otomatik oynatma düğmesini gizle + Otomatik oynatma düğmesi gizli + Otomatik oynatma düğmesi görünür + + Altyazı düğmesini gizle + Altyazı düğmesi gizli + Altyazı düğmesi görünür + Yayınla düğmesini gizle + Yayınla düğmesi gizli + Yayınla düğmesi görünür + Oynatıcı kontrolleri arka planını gizle + Oynatıcı kontrolleri arka planı gizli + Oynatıcı kontrolleri arka planı görünür + Önceki & Sonraki düğmelerini gizle + Önceki & Sonraki düğmeleri gizli + Önceki & Sonraki düğmeleri görünür + + + Bitiş ekranı kartlarını gizle + Bitiş ekranı kartları gizli + Bitiş ekranı kartları görünür + + + Tam ekranda ambiyans modunu devre dışı bırak + Ambiyans modu devre dışı + Ambiyans modu etkin + + + Bilgi kartlarını gizle + Bilgi kartları gizli + Bilgi kartları görünür + + + Kayan sayı animasyonlarını devre dışı bırak + Kayan sayı animasyonları devre dışı + Kayan sayı animasyonları etkin + + + Video oynatıcısı zaman çubuğunu gizle + Video oynatıcısı zaman çubuğu gizli + Video oynatıcısı zaman çubuğu görünür + + Video kapak fotoğrafı zaman çubuğunu gizle + Video kapak fotoğrafı zaman çubuğu gizli + Video kapak fotoğrafı zaman çubuğu görünür + + + Shorts oynatıcı + Shorts oynatıcı bileşenlerini gizle veya göster + + Ana Sayfa akışında Shorts\'u gizle + Ana Sayfa akışında ve ilgili videolarda gizli + Ana Sayfa akışında ve ilgili videolarda görünür + Arama sonuçlarında Shorts\'u gizle + Arama sonuçlarında gizli + Arama sonuçlarında görünür + + Abonelikler akışında Shorts\'u gizle + Abonelikler akışında gizli + Abonelikler akışında görünür + İzleme geçmişinde Shorts\'u gizle + İzleme geçmişinde gizli + İzleme geçmişinde görünür + \'Otomatik dublajlı\' etiketini gizle + Otomatik dublajlı etiketi gizli + Otomatik dublajlı etiketi görünür + \'Süper Teşekkürler\' düğmesini gizle + Süper Teşekkürler düğmesi gizli + Süper Teşekkürler düğmesi görünür + Efekt düğmesini gizle + Efekt düğmesi gizli + Efekt düğmesi görünür + \'Yeşil ekran\' düğmesini gizle + Yeşil ekran düğmesi gizli + Yeşil ekran düğmesi görünür + Hashtag düğmesini gizle + Hashtag düğmesi gizli + Hashtag düğmesi görünür + + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + Canlı ön izlemeyi gizle + Canlı ön izleme gizli + Canlı ön izleme görünür + Konum etiketini gizle + Konum etiketi gizli + Konum etiketi görünür + \'Yeni gönderiler\' düğmesini gizle + Yeni gönderiler düğmesi gizli + Yeni gönderiler düğmesi görünür + Duraklama katmanı düğmelerini gizle + Duraklama katmanı düğmeleri gizli + Duraklama katmanı düğmeleri görünür + Ön izlenen yorumu gizle + Ön izlenen yorum gizli + Ön izlenen yorum görünür + \'Müziği kaydet\' düğmesini gizle + Müziği kaydet düğmesi gizli + Müziği kaydet düğmesi görünür + Arama önerilerini gizle + Arama önerileri gizli + Arama önerileri görünür + Alışveriş düğmesini gizle + Mağaza düğmesi gizli + Mağaza düğmesi görünür + Çıkartmaları gizle + Çıkartmalar gizli + Çıkartmalar görünür + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Etiketli ürünleri gizle + Etiketli ürünler gizli + Etiketli ürünler görünür + Gelecek düğmesini gizle + Gelecek düğmesi gizli + Gelecek düğmesi görünür + \'Bu sesi kullan\' düğmesini gizle + Bu sesi kullan düğmesi gizli + Bu sesi kullan düğmesi görünür + \'Bu şablonu kullan\' düğmesini gizle + Bu şablonu kullan düğmesi gizli + Bu şablonu kullan düğmesi görünür + Beğeni düğmesi çeşme animasyonunu gizle + Beğeni düğmesi çeşme animasyonu gizli + Beğeni düğmesi çeşme animasyonu görünür + Beğen düğmesini gizle + Beğen düğmesi gizli + Beğen düğmesi görünür + Beğenmeme düğmesini gizle + Beğenmeme düğmesi gizli + Beğenmeme düğmesi görünür + Yorumlar düğmesini gizle + Yorumlar düğmesi gizli + Yorumlar düğmesi görünür + + Paylaş düğmesini gizle + Paylaş düğmesi gizli + Paylaş düğmesi görünür + + Remix düğmesini gizle + Remix düğmesi gizli + Remix düğmesi görünür + Ses düğmesini gizle + Ses düğmesi gizli + Ses düğmesi görünür + Bilgi panelini gizle + Bilgi paneli gizli + Bilgi paneli görünür + Kanal çubuğunu gizle + Kanal çubuğu gizli + Kanal çubuğu görünür + Video başlığını gizle + Video başlığı gizli + Video başlığı görünür + Ses bilgisi etiketini gizle + Ses bilgisi etiketi gizli + Ses bilgisi etiketi görünür + Video bağlantısı etiketini gizle + Video bağlantısı etiketi gizli + Video bağlantısı etiketi görünür + Gezinme çubuğunu gizle + Gezinme çubuğu gizli + Gezinti çubuğu görünür + + + Bitiş ekranı önerilen videosunu gizle + "Otomatik oynatma kapatıldığında bitiş ekranı önerilen videosu gizlenir Otomatik oynatma YouTube ayarlarından değiştirilebilir: Ayarlar → Oynatma → Sonraki videoyu otomatik oynat" - Bitiş ekranı önerilen videosu görünür - - - İlgili videolar katmanını gizle - Tam ekrandaki ilgili videolar katmanı gizli - Tam ekrandaki ilgili videolar katmanı görünür - - - Video zaman damgasını gizle - Zaman damgası gizli - Zaman damgası görünür - - - Oynatıcı açılır panellerini gizle - Oynatıcı açılır panelleri gizli - Oynatıcı açılır panelleri görünür - - - Video sonunda tam ekran modundan çık - Devre dışı - Dikey - Yatay - Dikey ve yatay - - - Videoları tam ekran dikey modda aç - Videolar tam ekranda açılır - Videolar tam ekranda açılmaz - - - Oynatıcı katmanı opaklığı - 0-100 arasında opaklık değeri, 0 şeffaftır - Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır - - - - Beğenilmemeler zaman aşımına uğradı - Beğenilmemeler kullanılamıyor (durum %d) - Beğenilmemeler kullanılamıyor (istemci API sınırı) - Beğenilmemeler kullanılamıyor (%s) - - Return YouTube Dislike ile oylamak için videoyu yenileyin - - Sahibi tarafından gizlendi - Return YouTube Dislike - Beğenilmeme sayıları gösterilir - Beğenilmeme sayıları gösterilmez - Shorts\'ta beğenilmeme sayılarını göster - "Shorts'ta beğenilmeme sayıları gösterilir + Bitiş ekranı önerilen videosu görünür + + + İlgili videolar katmanını gizle + Tam ekrandaki ilgili videolar katmanı gizli + Tam ekrandaki ilgili videolar katmanı görünür + + + Video zaman damgasını gizle + Zaman damgası gizli + Zaman damgası görünür + + + Oynatıcı açılır panellerini gizle + Oynatıcı açılır panelleri gizli + Oynatıcı açılır panelleri görünür + + + Video sonunda tam ekran modundan çık + Devre dışı + Dikey + Yatay + Dikey ve yatay + + + Videoları tam ekran dikey modda aç + Videolar tam ekranda açılır + Videolar tam ekranda açılmaz + + + Oynatıcı katmanı opaklığı + 0-100 arasında opaklık değeri, 0 şeffaftır + Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır + + + + Beğenilmemeler zaman aşımına uğradı + Beğenilmemeler kullanılamıyor (durum %d) + Beğenilmemeler kullanılamıyor (istemci API sınırı) + Beğenilmemeler kullanılamıyor (%s) + + Return YouTube Dislike ile oylamak için videoyu yenileyin + + Sahibi tarafından gizlendi + Return YouTube Dislike + Beğenilmeme sayıları gösterilir + Beğenilmeme sayıları gösterilmez + Shorts\'ta beğenilmeme sayılarını göster + "Shorts'ta beğenilmeme sayıları gösterilir Kısıtlama: Beğenilmeme sayıları gizli modda görünmeyebilir" - Shorts\'ta beğenilmeme sayıları gösterilmez - Yüzdelik dilim olarak beğenilmeme - Beğenilmemeler yüzde olarak gösterilir - Beğenilmemeler sayı olarak gösterilir - - Ufak beğenme düğmesi - Beğenme düğmesi en az genişlik için biçimlendirilir - Beğenme düğmesi en iyi görünüm için biçimlendirilir - Tahmini beğenileri göster - Beğenileri devre dışı bırakılan videolarda tahmini beğeni sayısı gösterilir - Tahmini beğeniler gösterilmez - API kullanılamadığında bir uyarı göster - Return YouTube Dislike kullanılamadığında uyarı gösterilir - Return YouTube Dislike kullanılamadığında uyarı gösterilmez - ReturnYouTubeDislike.com - Veri, Return YouTube Dislike API\'sinden sağlanır. Daha fazla bilgi için dokunun - - Bu cihazın ReturnYouTubeDislike API istatistikleri - Ortalama API yanıt süresi - En düşük API yanıt süresi - En yüksek API yanıt süresi - Son videodaki API yanıt süresi - Beğenilmeme sayıları geçici olarak kullanılamıyor - İstemci API sınırında - API\'den oy isteme çağrısı sayısı - Hiç çağrı yapılmadı - %d çağrı yapıldı - API\'den oylar istenirken yaşanan zaman aşımı sayısı - Hiçbir çağrı zaman aşımına uğramadı - %d çağrı zaman aşımına uğradı - API istemci sınırları - Hiçbir sınırla karşılaşılmadı - %d defa istemci sınırıyla karşılaşıldı - %d milisaniye - - - Geniş arama çubuğunu etkinleştir - Geniş arama çubuğu etkin - Geniş arama çubuğu devre dışı - - - Yüksek kalite küçük resimleri etkinleştir - Zaman çubuğu küçük resimleri yüksek kalitede - Zaman çubuğu küçük resimleri orta kalitede - Tam ekran zaman çubuğu küçük resimleri yüksek kalitede - Tam ekran zaman çubuğu küçük resimleri orta kalitede - "Bu aynı zamanda, zaman çubuğu küçük resimleri olmayan canlı yayınlardaki küçük resimleri de geri yükleyecektir. + Shorts\'ta beğenilmeme sayıları gösterilmez + Yüzdelik dilim olarak beğenilmeme + Beğenilmemeler yüzde olarak gösterilir + Beğenilmemeler sayı olarak gösterilir + + Ufak beğenme düğmesi + Beğenme düğmesi en az genişlik için biçimlendirilir + Beğenme düğmesi en iyi görünüm için biçimlendirilir + Tahmini beğenileri göster + Beğenileri devre dışı bırakılan videolarda tahmini beğeni sayısı gösterilir + Tahmini beğeniler gösterilmez + API kullanılamadığında bir uyarı göster + Return YouTube Dislike kullanılamadığında uyarı gösterilir + Return YouTube Dislike kullanılamadığında uyarı gösterilmez + ReturnYouTubeDislike.com + Veri, Return YouTube Dislike API\'sinden sağlanır. Daha fazla bilgi için dokunun + + Bu cihazın ReturnYouTubeDislike API istatistikleri + Ortalama API yanıt süresi + En düşük API yanıt süresi + En yüksek API yanıt süresi + Son videodaki API yanıt süresi + Beğenilmeme sayıları geçici olarak kullanılamıyor - İstemci API sınırında + API\'den oy isteme çağrısı sayısı + Hiç çağrı yapılmadı + %d çağrı yapıldı + API\'den oylar istenirken yaşanan zaman aşımı sayısı + Hiçbir çağrı zaman aşımına uğramadı + %d çağrı zaman aşımına uğradı + API istemci sınırları + Hiçbir sınırla karşılaşılmadı + %d defa istemci sınırıyla karşılaşıldı + %d milisaniye + + + Geniş arama çubuğunu etkinleştir + Geniş arama çubuğu etkin + Geniş arama çubuğu devre dışı + + + Yüksek kalite küçük resimleri etkinleştir + Zaman çubuğu küçük resimleri yüksek kalitede + Zaman çubuğu küçük resimleri orta kalitede + Tam ekran zaman çubuğu küçük resimleri yüksek kalitede + Tam ekran zaman çubuğu küçük resimleri orta kalitede + "Bu aynı zamanda, zaman çubuğu küçük resimleri olmayan canlı yayınlardaki küçük resimleri de geri yükleyecektir. Zaman çubuğu küçük resimleri, mevcut video ile aynı kaliteyi kullanacaktır. Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet bağlantısı kullanıldığında en iyi şekilde çalışır." - Eski zaman çubuğu küçük resimlerini geri getir - Zaman çubuğu küçük resimleri zaman çubuğunun üzerinde görünecek - Zaman çubuğu küçük resimleri tam ekranda görünecek - - - SponsorBlock - SponsorBlock\'u etkinleştir - SponsorBlock, YouTube videolarının can sıkıcı kısımlarını atlamaya yarayan kitle kaynaklı bir sistemdir - Görünüm - Oylama düğmesini göster - Kısım oylama düğmesi gösterilir - Kısım oylama düğmesi gösterilmez - Kare düzen kullan - Düğmeler ve kontroller kare şeklinde - Düğmeler ve kontroller yuvarlatılmış şekilde - - Ufak atlama düğmesi kullan - Atlama düğmesi en az genişlik için tasarlanır - Atlama düğmesi en iyi görünüm için tasarlanır - Atlama düğmesini otomatik olarak gizle - Atlama düğmesi birkaç saniye sonra gizlenir - Atlama düğmesi bütün kısım boyunca gösterilir - Atlama düğmesi süresi - Atla ve vurguya atla düğmelerinin otomatik olarak gizlenmeden önce ne kadar süre gösterileceği - Atlamayı geri al bildirimini göster - Bir kısım otomatik olarak atlandığında bildirim gösterilir. Atlamayı geri almak için bildirime dokunun - Bildirim gösterilmez - Atlama bildirimi süresi - Atlamayı geri alma bildiriminin ne kadar süre gösterileceği - 1 saniye - 2 saniye - 3 saniye - 4 saniye - 5 saniye - 6 saniye - 7 saniye - 8 saniye - 9 saniye - 10 saniye - Kısımlar olmadan video süresini göster - Video süresi eksi bütün kısımların süresi zaman çubuğunda görünür - Tam video süresi görünür - Yeni kısım oluşturma - Yeni kısım oluşturma düğmesini göster - Yeni kısım oluşturma düğmesi gösterilir - Yeni kısım oluşturma düğmesi gösterilmez - Yeni kısım oluştururkenki atlama süresi - Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı - Değer pozitif bir sayı olmalıdır - Yönergeleri görüntüle - Yönergeler, yeni kısım oluşturma kurallarını ve ipuçlarını içerir - Yönergeleri takip edin - Yeni kısım oluşturmadan önce SponsorBlock yönergelerini okuyun - Okudum - Göster - Genel - API kullanılamadığında bir bildirim göster - SponsorBlock kullanılamadığında bir bildirim gösterilir - SponsorBlock kullanılamadığında bildirim gösterilmez - Atlama sayısı takibini etkinleştir - SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir - Atlama sayısı izleme etkin değil - En az kısım süresi - Bu değerden (saniye cinsinden) kısa olan kısımlar gösterilmeyecek ve atlanmayacaktır - Geçersiz süre - Özel kullanıcı kimliğiniz - Bu gizli tutulmalıdır. Bu bir şifreye benzer ve başkalarıyla paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilirler - Özel kullanıcı kimliği en az 30 karakter olmalıdır - API URL\'sini değiştir - SponsorBlock\'un sunucuya çağrı yapmak için kullandığı adres - API URL\'si sıfırlandı - API URL\'si geçersiz - API URL\'si değiştirildi - Ayarları içe/dışa aktar - Kopyala - ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız - ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız. Bu, özel kullanıcı kimliğinizi içerir. Bunu dikkatli paylaştığınızdan emin olun - Ayarlar başarıyla içe aktarıldı - İçe aktarılamadı: %s - Dışa aktarılamadı: %s - "Ayarlarınız özel bir SponsorBlock kullanıcı kimliği içeriyor. + Eski zaman çubuğu küçük resimlerini geri getir + Zaman çubuğu küçük resimleri zaman çubuğunun üzerinde görünecek + Zaman çubuğu küçük resimleri tam ekranda görünecek + + + SponsorBlock + SponsorBlock\'u etkinleştir + SponsorBlock, YouTube videolarının can sıkıcı kısımlarını atlamaya yarayan kitle kaynaklı bir sistemdir + Görünüm + Oylama düğmesini göster + Kısım oylama düğmesi gösterilir + Kısım oylama düğmesi gösterilmez + Kare düzen kullan + Düğmeler ve kontroller kare şeklinde + Düğmeler ve kontroller yuvarlatılmış şekilde + + Ufak atlama düğmesi kullan + Atlama düğmesi en az genişlik için tasarlanır + Atlama düğmesi en iyi görünüm için tasarlanır + Atlama düğmesini otomatik olarak gizle + Atlama düğmesi birkaç saniye sonra gizlenir + Atlama düğmesi bütün kısım boyunca gösterilir + Atlama düğmesi süresi + Atla ve vurguya atla düğmelerinin otomatik olarak gizlenmeden önce ne kadar süre gösterileceği + Atlamayı geri al bildirimini göster + Bir kısım otomatik olarak atlandığında bildirim gösterilir. Atlamayı geri almak için bildirime dokunun + Bildirim gösterilmez + Atlama bildirimi süresi + Atlamayı geri alma bildiriminin ne kadar süre gösterileceği + 1 saniye + 2 saniye + 3 saniye + 4 saniye + 5 saniye + 6 saniye + 7 saniye + 8 saniye + 9 saniye + 10 saniye + Kısımlar olmadan video süresini göster + Video süresi eksi bütün kısımların süresi zaman çubuğunda görünür + Tam video süresi görünür + Yeni kısım oluşturma + Yeni kısım oluşturma düğmesini göster + Yeni kısım oluşturma düğmesi gösterilir + Yeni kısım oluşturma düğmesi gösterilmez + Yeni kısım oluştururkenki atlama süresi + Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı + Değer pozitif bir sayı olmalıdır + Yönergeleri görüntüle + Yönergeler, yeni kısım oluşturma kurallarını ve ipuçlarını içerir + Yönergeleri takip edin + Yeni kısım oluşturmadan önce SponsorBlock yönergelerini okuyun + Okudum + Göster + Genel + API kullanılamadığında bir bildirim göster + SponsorBlock kullanılamadığında bir bildirim gösterilir + SponsorBlock kullanılamadığında bildirim gösterilmez + Atlama sayısı takibini etkinleştir + SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir + Atlama sayısı izleme etkin değil + En az kısım süresi + Bu değerden (saniye cinsinden) kısa olan kısımlar gösterilmeyecek ve atlanmayacaktır + Geçersiz süre + Özel kullanıcı kimliğiniz + Bu gizli tutulmalıdır. Bu bir şifreye benzer ve başkalarıyla paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilirler + Özel kullanıcı kimliği en az 30 karakter olmalıdır + API URL\'sini değiştir + SponsorBlock\'un sunucuya çağrı yapmak için kullandığı adres + API URL\'si sıfırlandı + API URL\'si geçersiz + API URL\'si değiştirildi + Ayarları içe/dışa aktar + Kopyala + ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız + ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız. Bu, özel kullanıcı kimliğinizi içerir. Bunu dikkatli paylaştığınızdan emin olun + Ayarlar başarıyla içe aktarıldı + İçe aktarılamadı: %s + Dışa aktarılamadı: %s + "Ayarlarınız özel bir SponsorBlock kullanıcı kimliği içeriyor. Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır. " - Bir daha gösterme - Kısım davranışını değiştir - Sponsor - Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendi reklamı veya beğendiği amaçlara/üreticilere/sitelere/ürünlere atıfta bulunmalar için değil - Karşılıksız / Kendi Reklamı - Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımları içerir - Etkileşim Hatırlatıcısı (Abone Ol) - İçeriğin ortasında beğenme, abone olma veya takip etme için kısa hatırlatmalar. Eğer uzunsa veya belirli birşey hakkındaysa kendi reklamı kategorisinde olmalıdır - Vurgu - Videonun çoğu kişinin aradığı bölümü - Ara / Giriş Animasyonu - Gerçek içerik barındırmayan aralıklar. Duraklama, sabit kare veya tekrar eden bir animasyon olabilir. Bilgi içeren geçişleri içermez - Bitiş Ekranı / Jenerik - Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil - Giriş / Selamlama - Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez - Ön İzleme / Özet - Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu - Konuyla Alakasız / Şakalar - Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan kısımları içermez - Müzik: Müzik Olmayan Kısım - Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri - Atla - Vurgu - Sponsoru atla - Tanıtımı atla - Etkileşimi atla - Vurguya atla - Girişi atla - Arayı atla - Arayı atla - Bitişi atla - Girişi atla - Ön izlemeyi atla - Ön izlemeyi atla - Özeti atla - Konu dışını atla - Müziksiz kısmı atla - Kısmı atla - Sponsor atlandı - Kendi reklamı atlandı - Sıkıcı hatırlatma atlandı - Vurguya atlandı - Giriş atlandı - Ara atlandı - Ara atlandı - Bitiş atlandı - Giriş atlandı - Ön izleme atlandı - Ön izleme atlandı - Özet atlandı - Konu dışı atlandı - Müziksiz kısım atlandı - Gönderilmemiş kısım atlandı - Birden fazla kısım atlandı - Otomatik atla - Bir defalık otomatik atla - Atlama düğmesi göster - Zaman çubuğunda göster - Devre dışı bırak - Kısım gönderilemedi: %s - SponsorBlock geçici olarak kapalı - Kısım gönderilemedi (durum: %1$d %2$s) - Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek - Kısım gönderilemiyor: %s - "Kısım gönderilemiyor. + Bir daha gösterme + Kısım davranışını değiştir + Sponsor + Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendi reklamı veya beğendiği amaçlara/üreticilere/sitelere/ürünlere atıfta bulunmalar için değil + Karşılıksız / Kendi Reklamı + Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımları içerir + Etkileşim Hatırlatıcısı (Abone Ol) + İçeriğin ortasında beğenme, abone olma veya takip etme için kısa hatırlatmalar. Eğer uzunsa veya belirli birşey hakkındaysa kendi reklamı kategorisinde olmalıdır + Vurgu + Videonun çoğu kişinin aradığı bölümü + Ara / Giriş Animasyonu + Gerçek içerik barındırmayan aralıklar. Duraklama, sabit kare veya tekrar eden bir animasyon olabilir. Bilgi içeren geçişleri içermez + Bitiş Ekranı / Jenerik + Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil + Giriş / Selamlama + Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez + Ön İzleme / Özet + Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu + Konuyla Alakasız / Şakalar + Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan kısımları içermez + Müzik: Müzik Olmayan Kısım + Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri + Atla + Vurgu + Sponsoru atla + Tanıtımı atla + Etkileşimi atla + Vurguya atla + Girişi atla + Arayı atla + Arayı atla + Bitişi atla + Girişi atla + Ön izlemeyi atla + Ön izlemeyi atla + Özeti atla + Konu dışını atla + Müziksiz kısmı atla + Kısmı atla + Sponsor atlandı + Kendi reklamı atlandı + Sıkıcı hatırlatma atlandı + Vurguya atlandı + Giriş atlandı + Ara atlandı + Ara atlandı + Bitiş atlandı + Giriş atlandı + Ön izleme atlandı + Ön izleme atlandı + Özet atlandı + Konu dışı atlandı + Müziksiz kısım atlandı + Gönderilmemiş kısım atlandı + Birden fazla kısım atlandı + Otomatik atla + Bir defalık otomatik atla + Atlama düğmesi göster + Zaman çubuğunda göster + Devre dışı bırak + Kısım gönderilemedi: %s + SponsorBlock geçici olarak kapalı + Kısım gönderilemedi (durum: %1$d %2$s) + Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek + Kısım gönderilemiyor: %s + "Kısım gönderilemiyor. Aynısı mevcut" - Kısım başarıyla gönderildi - - SponsorBlock zaman aşımına uğradı - SponsorBlock geçici olarak kullanılamıyor (durum %d) - SponsorBlock geçici olarak kullanılamıyor - Kısım oylanamıyor (API zaman aşımına uğradı) - Kısım oylanamıyor (durum %1$d %2$s) - Kısım oylanamıyor: %s - Olumlu oy - Olumsuz oy - Kategori değiştir - Oylanılacak kısım bulunmuyor - - %1$s - %2$s - Kısım kategorisini seçin - Kategori, ayarlarda devre dışı. Göndermek için etkinleştirin. - Yeni SponsorBlock kısmı - %s yeni kısmın başlangıcı mı, bitişi mi olarak ayarlansın? - Başlangıç - Bitiş - Şimdi - Kısmın başladığı zaman - Kısmın bittiği zaman - Süreler doğru mu? - "Kısım şu süreler arasında: + Kısım başarıyla gönderildi + + SponsorBlock zaman aşımına uğradı + SponsorBlock geçici olarak kullanılamıyor (durum %d) + SponsorBlock geçici olarak kullanılamıyor + Kısım oylanamıyor (API zaman aşımına uğradı) + Kısım oylanamıyor (durum %1$d %2$s) + Kısım oylanamıyor: %s + Olumlu oy + Olumsuz oy + Kategori değiştir + Oylanılacak kısım bulunmuyor + + %1$s - %2$s + Kısım kategorisini seçin + Kategori, ayarlarda devre dışı. Göndermek için etkinleştirin. + Yeni SponsorBlock kısmı + %s yeni kısmın başlangıcı mı, bitişi mi olarak ayarlansın? + Başlangıç + Bitiş + Şimdi + Kısmın başladığı zaman + Kısmın bittiği zaman + Süreler doğru mu? + "Kısım şu süreler arasında: %1$s ile @@ -1293,47 +1292,47 @@ ile (%3$s) Göndermeye hazır mı?" - Başlangıç bitişten önce olmalıdır - Önce zaman çubuğunda iki yer işaretleyin - Kısmı ön izleyin ve sorunsuz bir şekilde atladığından emin olun - Kısmın zamanlamasını el ile ayarlayın - Kısmın başlangıcını mı, bitişini mi düzenlemek istiyorsunuz? - Geçersiz süre girildi - İstatistikler - - İstatistikler geçici olarak kullanılamıyor (API kapalı) - Yükleniyor... - SponsorBlock devre dışı - Kullanıcı adınız: <b>%s</b> - Kullanıcı adınızı değiştirmek için buraya dokunun - Kullanıcı adı değiştirilemiyor: Durum: %1$d %2$s - Kullanıcı adı başarıyla değiştirildi - İtibarınız <b>%.2f</b> - <b>%s</b> kısım oluşturdunuz - Kısımlarınızı görüntülemek için buraya dokunun - SponsorBlock liderlik tablosu - İnsanları <b>%s</b> kısımdan kurtardınız - Küresel istatistikleri ve en çok katkıda bulunanları görmek için buraya dokunun - Bu, hayatlarının <b>%s</b> kadarı.<br>Liderlik tablosunu görmek için dokunun - <b>%s</b> kısım atladınız - Bu da <b>%s</b> demek - Atlanan kısım sayacı sıfırlansın mı? - %1$s saat %2$s dakika - %1$s dakika %2$s saniye - %s saniye - Opaklık: - Renk: - Hakkında - sponsor.ajay.app - Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun - - - Düzen form faktörü - Varsayılan - Telefon - Tablet - Otomotiv - "Değişiklikler şunları içerir: + Başlangıç bitişten önce olmalıdır + Önce zaman çubuğunda iki yer işaretleyin + Kısmı ön izleyin ve sorunsuz bir şekilde atladığından emin olun + Kısmın zamanlamasını el ile ayarlayın + Kısmın başlangıcını mı, bitişini mi düzenlemek istiyorsunuz? + Geçersiz süre girildi + İstatistikler + + İstatistikler geçici olarak kullanılamıyor (API kapalı) + Yükleniyor... + SponsorBlock devre dışı + Kullanıcı adınız: <b>%s</b> + Kullanıcı adınızı değiştirmek için buraya dokunun + Kullanıcı adı değiştirilemiyor: Durum: %1$d %2$s + Kullanıcı adı başarıyla değiştirildi + İtibarınız <b>%.2f</b> + <b>%s</b> kısım oluşturdunuz + Kısımlarınızı görüntülemek için buraya dokunun + SponsorBlock liderlik tablosu + İnsanları <b>%s</b> kısımdan kurtardınız + Küresel istatistikleri ve en çok katkıda bulunanları görmek için buraya dokunun + Bu, hayatlarının <b>%s</b> kadarı.<br>Liderlik tablosunu görmek için dokunun + <b>%s</b> kısım atladınız + Bu da <b>%s</b> demek + Atlanan kısım sayacı sıfırlansın mı? + %1$s saat %2$s dakika + %1$s dakika %2$s saniye + %s saniye + Opaklık: + Renk: + Hakkında + sponsor.ajay.app + Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun + + + Düzen form faktörü + Varsayılan + Telefon + Tablet + Otomotiv + "Değişiklikler şunları içerir: Tablet düzeni • Topluluk yayınları gizlenir @@ -1341,329 +1340,329 @@ Tablet düzeni Otomotiv düzeni • Shorts, normal oynatıcıda açılır • Akış, konulara ve kanallara göre düzenlenir" - - - Uygulama sürümünü taklit et - Sürüm taklit ediliyor - Sürüm taklit edilmiyor - "Uygulama sürümü, YouTube'un eski bir sürümü olarak taklit edilecektir. + + + Uygulama sürümünü taklit et + Sürüm taklit ediliyor + Sürüm taklit edilmiyor + "Uygulama sürümü, YouTube'un eski bir sürümü olarak taklit edilecektir. Bu, uygulamanın görünümünü ve özelliklerini değiştirecektir, ancak bilinmeyen yan etkiler ortaya çıkabilir. Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerinin temizlenmesi önerilir." - Uygulama sürümü taklidi hedefi - 20.13.41 - Daraltılmamış video eylem çubuğunu geri getir - 20.05.46 - Transkript işlevini geri yükle - 19.35.36 - Eski Shorts oynatıcı simgelerini geri getir - 19.01.34 - Eski gezinti simgelerini geri getir - - - Başlangıç sayfasını değiştir - Varsayılan - Tüm abonelikler - Kanallara göz at - Kurslar / Öğrenme - Keşfet - Moda ve Güzellik - Oyun - Geçmiş - Kitaplık - Beğenilen videolar - Canlı yayın - Filmler - Müzik - Haberler - Bildirimler - Oynatma listeleri - Arama - Alışveriş - Shorts - Spor - Abonelikler - Trendler - Sanal Gerçeklik - Daha sonra izle - Klipleriniz - Başlangıç sayfasını her zaman değiştir - "Başlangıç sayfası her zaman değiştirilir + Uygulama sürümü taklidi hedefi + 20.13.41 - Daraltılmamış video eylem çubuğunu geri getir + 20.05.46 - Transkript işlevini geri yükle + 19.35.36 - Eski Shorts oynatıcı simgelerini geri getir + 19.01.34 - Eski gezinti simgelerini geri getir + + + Başlangıç sayfasını değiştir + Varsayılan + Tüm abonelikler + Kanallara göz at + Kurslar / Öğrenme + Keşfet + Moda ve Güzellik + Oyun + Geçmiş + Kitaplık + Beğenilen videolar + Canlı yayın + Filmler + Müzik + Haberler + Bildirimler + Oynatma listeleri + Arama + Alışveriş + Shorts + Spor + Abonelikler + Trendler + Sanal Gerçeklik + Daha sonra izle + Klipleriniz + Başlangıç sayfasını her zaman değiştir + "Başlangıç sayfası her zaman değiştirilir Kısıtlama: Araç çubuğundaki geri düğmesini kullanmak işe yaramayabilir" - Başlangıç sayfası yalnızca uygulama başlatılırken değiştirilir - - - Shorts oynatıcıya devam edilmesini devre dışı bırak - Shorts oynatıcı uygulama açıldığında devam etmeyecek - Shorts oynatıcı uygulama açıldığında devam edecek - - - Shorts\'u şununla aç - Shorts oynatıcı - Normal oynatıcı - Normal oynatıcı tam ekran - - - Shorts\'u otomatik oynat - Shorts otomatik oynatılacak - Aynı Shorts videosu sürekli yeniden oynayacak - Arka planda Shorts\'u otomatik oynat - Shorts arka planda otomatik oynatılacak - Shorts arka planda döngüde olacak - - - Mini oynatıcı - Uygulama içi küçültülmüş oynatıcının tarzını değiştir - Mini oynatıcı tipi - Devre dışı - Varsayılan - Minimal - Tablet - Modern 1 - Modern 2 - Modern 3 - Modern 4 - Yuvarlatılmış köşeleri devre dışı bırak - Köşeler kare şeklinde - Köşeler yuvarlatılmış - Boyutlandırmak için çift dokunmayı ve sıkıştırmayı etkinleştir - "Boyutlandırmak için çift dokunma ve sıkıştırma etkin + Başlangıç sayfası yalnızca uygulama başlatılırken değiştirilir + + + Shorts oynatıcıya devam edilmesini devre dışı bırak + Shorts oynatıcı uygulama açıldığında devam etmeyecek + Shorts oynatıcı uygulama açıldığında devam edecek + + + Shorts\'u şununla aç + Shorts oynatıcı + Normal oynatıcı + Normal oynatıcı tam ekran + + + Shorts\'u otomatik oynat + Shorts otomatik oynatılacak + Aynı Shorts videosu sürekli yeniden oynayacak + Arka planda Shorts\'u otomatik oynat + Shorts arka planda otomatik oynatılacak + Shorts arka planda döngüde olacak + + + Mini oynatıcı + Uygulama içi küçültülmüş oynatıcının tarzını değiştir + Mini oynatıcı tipi + Devre dışı + Varsayılan + Minimal + Tablet + Modern 1 + Modern 2 + Modern 3 + Modern 4 + Yuvarlatılmış köşeleri devre dışı bırak + Köşeler kare şeklinde + Köşeler yuvarlatılmış + Boyutlandırmak için çift dokunmayı ve sıkıştırmayı etkinleştir + "Boyutlandırmak için çift dokunma ve sıkıştırma etkin • Mini oynatıcı boyutunu artırmak için çift dokunun • Orijinal boyuta geri dönmek için tekrar çift dokunun" - Boyutlandırmak için çift dokunma ve sıkıştırma devre dışı - Sürükleyip bırakmayı devre dışı bırak - Sürükle ve bırak devre dışı - "Sürükle ve bırak etkin + Boyutlandırmak için çift dokunma ve sıkıştırma devre dışı + Sürükleyip bırakmayı devre dışı bırak + Sürükle ve bırak devre dışı + "Sürükle ve bırak etkin Mini oynatıcı, ekranın herhangi bir köşesine sürüklenebilir" - Yatay sürükleme hareketini devre dışı bırak - Yatay sürükleme hareketi devre dışı - "Yatay sürükleme hareketi etkin + Yatay sürükleme hareketini devre dışı bırak + Yatay sürükleme hareketi devre dışı + "Yatay sürükleme hareketi etkin Mini oynatıcı, ekranın dışına sağa veya sola sürüklenebilir" - Katman düğmelerini gizle - Katman düğmeleri gizli - Katman düğmeleri görünür - Büyütme ve kapatma düğmelerini gizle - "Düğmeler gizli + Katman düğmelerini gizle + Katman düğmeleri gizli + Katman düğmeleri görünür + Büyütme ve kapatma düğmelerini gizle + "Düğmeler gizli Genişletmek veya kapatmak için kaydırın" - Büyütme ve kapatma düğmeleri görünür - Alt metinleri gizle - Alt metinler gizli - Alt metinler görünür - İleri/geri atlama düğmelerini gizle - İleri ve geri atlama düğmeleri gizli - İleri ve geri atlama düğmeleri görünür - Başlangıç boyutu - Başlangıçtaki boyut, piksel cinsinden - Piksel boyutu %1$s ve %2$s arasında olmalıdır - Katman opaklığı - 0-100 arasında opaklık değeri, 0 şeffaftır - Mini oynatıcı katman opaklığı 0-100 arasında olmalıdır - - - Gradyan yükleme ekranını etkinleştir - Yükleme ekranı gradyan bir arka plana sahip olacak - Yükleme ekranı tek renk bir arka plana sahip olacak - Açılış ekranı stili - Renk - Siyah beyaz - Özel zaman çubuğu rengini etkinleştir - Özel zaman çubuğu rengi gösterilir - Orijinal zaman çubuğu rengi gösterilir - Özel zaman çubuğu rengi - Zaman çubuğunun rengi - Özel zaman çubuğu vurgu rengi - Zaman çubuğunun vurgu rengi - Geçersiz zaman çubuğu renk değeri - - - YouTube ReVanced - YT ReVanced - YT - - - Başlık logosu - Varsayılan - Normal - Premium - ReVanced - - ReVanced minimal - Özel - - - Resimlerin bölge kısıtlamalarını atla - yt4.ggpht.com resim sunucusu kullanılır - "Orijinal resim sunucusu kullanılır + Büyütme ve kapatma düğmeleri görünür + Alt metinleri gizle + Alt metinler gizli + Alt metinler görünür + İleri/geri atlama düğmelerini gizle + İleri ve geri atlama düğmeleri gizli + İleri ve geri atlama düğmeleri görünür + Başlangıç boyutu + Başlangıçtaki boyut, piksel cinsinden + Piksel boyutu %1$s ve %2$s arasında olmalıdır + Katman opaklığı + 0-100 arasında opaklık değeri, 0 şeffaftır + Mini oynatıcı katman opaklığı 0-100 arasında olmalıdır + + + Gradyan yükleme ekranını etkinleştir + Yükleme ekranı gradyan bir arka plana sahip olacak + Yükleme ekranı tek renk bir arka plana sahip olacak + Açılış ekranı stili + Renk + Siyah beyaz + Özel zaman çubuğu rengini etkinleştir + Özel zaman çubuğu rengi gösterilir + Orijinal zaman çubuğu rengi gösterilir + Özel zaman çubuğu rengi + Zaman çubuğunun rengi + Özel zaman çubuğu vurgu rengi + Zaman çubuğunun vurgu rengi + Geçersiz zaman çubuğu renk değeri + + + YouTube ReVanced + YT ReVanced + YT + + + Başlık logosu + Varsayılan + Normal + Premium + ReVanced + + ReVanced minimal + Özel + + + Resimlerin bölge kısıtlamalarını atla + yt4.ggpht.com resim sunucusu kullanılır + "Orijinal resim sunucusu kullanılır Bunu etkinleştirmek, bazı bölgelerde engellenen eksik resimleri düzeltebilir" - - - - Ana Sayfa sekmesi - - Abonelikler sekmesi - - Siz sekmesi - Oynatıcı çalma listeleri & öneriler - Arama sonuçları - Orijinal kapak resimleri - DeArrow & Orijinal kapak resimleri - DeArrow & Hareketsiz yakalamalar - Hareketsiz yakalamalar - DeArrow - "DeArrow, YouTube videoları için topluluk kaynaklı kapak resimleri sağlar. Bu kapak resimleri, YouTube tarafından sağlananlardan genellikle daha alakalıdır. + + + + Ana Sayfa sekmesi + + Abonelikler sekmesi + + Siz sekmesi + Oynatıcı çalma listeleri & öneriler + Arama sonuçları + Orijinal kapak resimleri + DeArrow & Orijinal kapak resimleri + DeArrow & Hareketsiz yakalamalar + Hareketsiz yakalamalar + DeArrow + "DeArrow, YouTube videoları için topluluk kaynaklı kapak resimleri sağlar. Bu kapak resimleri, YouTube tarafından sağlananlardan genellikle daha alakalıdır. Etkinleştirilirse, video URL'leri API sunucusuna gönderilecek ve başka hiçbir veri gönderilmeyecektir. Bir videoda DeArrow kapak resmi yoksa, orijinal kapak resmi veya hareketsiz yakalamalar gösterilir DeArrow hakkında daha fazla bilgi edinmek için buraya dokunun" - API kullanılamadığında bir uyarı göster - DeArrow kullanılamadığında uyarı gösterilir - DeArrow kullanılamadığında uyarı gösterilmez - DeArrow API uç noktası - DeArrow kapak resim önbelleğinin URL\'si - Hareketsiz video yakalamaları - Hareketsiz yakalamalar, her videonun başından/ortasından/sonundan alınır. Bu resimler YouTube\'da yerleşiktir ve harici bir API kullanılmaz - Hızlı hareketsiz yakalamaları kullan - Orta kalite hareketsiz yakalamalar kullanılıyor. Kapak resimleri daha hızlı yüklenecektir fakat canlı yayınlar, yayınlanmayan veya çok eski videolar boş kapak resimleri gösterebilir - Yüksek kalite hareketsiz yakalamalar kullanılıyor - Hareketsiz yakalamanın alınacağı video zamanı - Video başlangıcı - Video ortası - Video sonu - - DeArrow geçici olarak kullanılamıyor (durum kodu: %s) - DeArrow geçici olarak kullanılamıyor - - - ReVanced duyurularını göster - Başlangıçta duyurular gösteriliyor - Başlangıçta duyurular gösterilmiyor - Başlangıçta duyuruları göster - Duyuru sağlayıcısına bağlanılamadı - Yok say - - - Videoyu döngüye almayı etkinleştir - Video döngüye girecek - Video döngüye girmeyecek - - - Videoyu döngüye al düğmesini göster - Düğme görünür - Düğme gösterilmez - Videoyu döngüye alma açık - Videoyu döngüye alma kapalı - - - Ses kesintisinde duraklat - Başka bir ses çaldığında oynatma duraklatılır (örn. navigasyon) - Başka bir ses çaldığında ses seviyesi azalır - - - Cihaz boyutlarını taklit et - "Cihaz boyutları taklit edilir + API kullanılamadığında bir uyarı göster + DeArrow kullanılamadığında uyarı gösterilir + DeArrow kullanılamadığında uyarı gösterilmez + DeArrow API uç noktası + DeArrow kapak resim önbelleğinin URL\'si + Hareketsiz video yakalamaları + Hareketsiz yakalamalar, her videonun başından/ortasından/sonundan alınır. Bu resimler YouTube\'da yerleşiktir ve harici bir API kullanılmaz + Hızlı hareketsiz yakalamaları kullan + Orta kalite hareketsiz yakalamalar kullanılıyor. Kapak resimleri daha hızlı yüklenecektir fakat canlı yayınlar, yayınlanmayan veya çok eski videolar boş kapak resimleri gösterebilir + Yüksek kalite hareketsiz yakalamalar kullanılıyor + Hareketsiz yakalamanın alınacağı video zamanı + Video başlangıcı + Video ortası + Video sonu + + DeArrow geçici olarak kullanılamıyor (durum kodu: %s) + DeArrow geçici olarak kullanılamıyor + + + ReVanced duyurularını göster + Başlangıçta duyurular gösteriliyor + Başlangıçta duyurular gösterilmiyor + Başlangıçta duyuruları göster + Duyuru sağlayıcısına bağlanılamadı + Yok say + + + Videoyu döngüye almayı etkinleştir + Video döngüye girecek + Video döngüye girmeyecek + + + Videoyu döngüye al düğmesini göster + Düğme görünür + Düğme gösterilmez + Videoyu döngüye alma açık + Videoyu döngüye alma kapalı + + + Ses kesintisinde duraklat + Başka bir ses çaldığında oynatma duraklatılır (örn. navigasyon) + Başka bir ses çaldığında ses seviyesi azalır + + + Cihaz boyutlarını taklit et + "Cihaz boyutları taklit edilir Daha yüksek video kaliteleri açılabilir, ancak video oynatmada takılma, daha kötü pil ömrü ve bilinmeyen yan etkiler yaşayabilirsiniz" - "Cihaz boyutları taklit edilmez + "Cihaz boyutları taklit edilmez Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" - Bunu etkinleştirmek video oynatma takılmaları, daha kötü pil ömrü, ve bilinmeyen yan etkiler yaşamanıza sebep olabilir. - - - Titreşimli geri bildirim - Titreşimli geri bildirimi değiştir - Bölümler titreşimini devre dışı bırak - Bölümler titreşimi devre dışı - Bölümler titreşimi etkin - Hassas sarma titreşimini devre dışı bırak - Hassas sardırma titreşimi devre dışı - Hassas sardırma titreşimi etkin - Sardırmayı geri alma titreşimini devre dışı bırak - Sardırmayı geri alma titreşimi devre dışı - Sardırmayı geri alma titreşimi etkin - Yakınlaştırma titreşimini devre dışı bırak - Yakınlaştırma titreşimi devre dışı - Yakınlaştırma titreşimi etkin - - - Yakın zamanda hesap giriş bilgilerinizi değiştirdiyseniz MicroG\'yi kaldırıp yeniden yükleyin. - - - URL yönlendirmelerini atla - URL yönlendirmeleri atlanıyor - URL yönlendirmeleri atlanmıyor - - - Bağlantıları tarayıcıda aç - Bağlantılar harici tarayıcıda açılıyor - Bağlantılar uygulama içi tarayıcıda açılıyor - - - - Oto - Video kalitesi değişikliklerini hatırla - Kalite değişiklikleri tüm videolara uygulanır - Kalite değişiklikleri sadece oynatılan videoya uygulanır - Video kalitesi değişikliklerinde bildirim göster - Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilir - Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilmez - Wi-Fi ağındaki varsayılan video kalitesi - Mobil ağdaki varsayılan video kalitesi - Shorts kalitesi değişikliklerini hatırla - Kalite değişiklikleri tüm Shorts\'lara uygulanır - Kalite değişiklikleri sadece oynatılan Short\'a uygulanır - Wi-Fi ağındaki varsayılan Shorts kalitesi - Mobil ağdaki varsayılan Shorts kalitesi - mobil ağ - wifi - Varsayılan %1$s kalitesi, %2$s olarak ayarlandı - Shorts %1$s kalitesi, %2$s olarak ayarlandı - - - Hız iletişim kutusu düğmesini göster - Hız iletişim kutusu düğmesi görünür. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun - Hız iletişim kutusu düğmesi gösterilmez - - - Video kalitesi düğmesini göster - Video kalitesi düğmesi görünür. Kaliteyi varsayılana sıfırlamak için dokunup basılı tutun - Video kalitesi düğmesi gösterilmez - - - Özel oynatma hızı menüsü - Özel oynatma hızı menüsü gösterilir - Özel oynatma hızı menüsü gösterilmez - Eski oynatma hızı menüsünü geri getir - Eski hız menüsü gösterilir - Modern hız menüsü gösterilir - Özel oynatma hızları - Özel oynatma hızları ekle veya değiştir - Özel hızlar %s\'den az olmalıdır - Geçersiz özel oynatma hızları - Oto - Dokunup basılı tutma özel hızı - 0-8 arası oynatma hızı - - - Oynatma hızı değişikliklerini hatırla - Oynatma hızı değişiklikleri tüm videolara uygulanır - Oynatma hızı değişiklikleri yalnızca mevcut videoya uygulanır - Oynatma hızı değişikliklerinde bildirim göster - Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir - Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez - Varsayılan oynatma hızı - Varsayılan hız %s olarak ayarlandı - - - HDR videoyu devre dışı bırak - HDR video devre dışı - HDR video etkin - AVC\'yi (H.264) zorla - Video kodeği AVC\'ye (H.264) zorlandı - Video kodeği otomatik olarak belirlenir - "Faydaları: + Bunu etkinleştirmek video oynatma takılmaları, daha kötü pil ömrü, ve bilinmeyen yan etkiler yaşamanıza sebep olabilir. + + + Titreşimli geri bildirim + Titreşimli geri bildirimi değiştir + Bölümler titreşimini devre dışı bırak + Bölümler titreşimi devre dışı + Bölümler titreşimi etkin + Hassas sarma titreşimini devre dışı bırak + Hassas sardırma titreşimi devre dışı + Hassas sardırma titreşimi etkin + Sardırmayı geri alma titreşimini devre dışı bırak + Sardırmayı geri alma titreşimi devre dışı + Sardırmayı geri alma titreşimi etkin + Yakınlaştırma titreşimini devre dışı bırak + Yakınlaştırma titreşimi devre dışı + Yakınlaştırma titreşimi etkin + + + Yakın zamanda hesap giriş bilgilerinizi değiştirdiyseniz MicroG\'yi kaldırıp yeniden yükleyin. + + + URL yönlendirmelerini atla + URL yönlendirmeleri atlanıyor + URL yönlendirmeleri atlanmıyor + + + Bağlantıları tarayıcıda aç + Bağlantılar harici tarayıcıda açılıyor + Bağlantılar uygulama içi tarayıcıda açılıyor + + + + Oto + Video kalitesi değişikliklerini hatırla + Kalite değişiklikleri tüm videolara uygulanır + Kalite değişiklikleri sadece oynatılan videoya uygulanır + Video kalitesi değişikliklerinde bildirim göster + Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilir + Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilmez + Wi-Fi ağındaki varsayılan video kalitesi + Mobil ağdaki varsayılan video kalitesi + Shorts kalitesi değişikliklerini hatırla + Kalite değişiklikleri tüm Shorts\'lara uygulanır + Kalite değişiklikleri sadece oynatılan Short\'a uygulanır + Wi-Fi ağındaki varsayılan Shorts kalitesi + Mobil ağdaki varsayılan Shorts kalitesi + mobil ağ + wifi + Varsayılan %1$s kalitesi, %2$s olarak ayarlandı + Shorts %1$s kalitesi, %2$s olarak ayarlandı + + + Hız iletişim kutusu düğmesini göster + Hız iletişim kutusu düğmesi görünür. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun + Hız iletişim kutusu düğmesi gösterilmez + + + Video kalitesi düğmesini göster + Video kalitesi düğmesi görünür. Kaliteyi varsayılana sıfırlamak için dokunup basılı tutun + Video kalitesi düğmesi gösterilmez + + + Özel oynatma hızı menüsü + Özel oynatma hızı menüsü gösterilir + Özel oynatma hızı menüsü gösterilmez + Eski oynatma hızı menüsünü geri getir + Eski hız menüsü gösterilir + Modern hız menüsü gösterilir + Özel oynatma hızları + Özel oynatma hızları ekle veya değiştir + Özel hızlar %s\'den az olmalıdır + Geçersiz özel oynatma hızları + Oto + Dokunup basılı tutma özel hızı + 0-8 arası oynatma hızı + + + Oynatma hızı değişikliklerini hatırla + Oynatma hızı değişiklikleri tüm videolara uygulanır + Oynatma hızı değişiklikleri yalnızca mevcut videoya uygulanır + Oynatma hızı değişikliklerinde bildirim göster + Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir + Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez + Varsayılan oynatma hızı + Varsayılan hız %s olarak ayarlandı + + + HDR videoyu devre dışı bırak + HDR video devre dışı + HDR video etkin + AVC\'yi (H.264) zorla + Video kodeği AVC\'ye (H.264) zorlandı + Video kodeği otomatik olarak belirlenir + "Faydaları: • Pil ömrünü iyileştirebilir • Eski cihazlarda eksik video çözünürlüklerini geri yükleyebilir @@ -1672,182 +1671,182 @@ Sınırlamalar: • Video oynatma, VP9 veya AV1'den daha fazla internet verisi kullanır • HDR videolar AVC kullanmaz • Bazı cihazlar AVC'yi zorlayamaz" - - - Gelişmiş video kalitesi menüsünü göster - Gelişmiş video kalitesi menüsü gösterilir - Gelişmiş video kalitesi menüsü gösterilmez - - - Kaydırarak sardırmayı etkinleştir - Kaydırarak sardırma etkin - Kaydırarak sardırma etkin değil - - - Android VR AV1\'e izin ver - "Video kodeği AVC (H.264), VP9 veya AV1'dir + + + Gelişmiş video kalitesi menüsünü göster + Gelişmiş video kalitesi menüsü gösterilir + Gelişmiş video kalitesi menüsü gösterilmez + + + Kaydırarak sardırmayı etkinleştir + Kaydırarak sardırma etkin + Kaydırarak sardırma etkin değil + + + Android VR AV1\'e izin ver + "Video kodeği AVC (H.264), VP9 veya AV1'dir Oynatma takılabilir veya kare atlayabilir" - Video kodeği AVC (H.264) veya VP9\'dur - "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. + Video kodeği AVC (H.264) veya VP9\'dur + "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. AV1 ile video oynatma takılabilir veya kare atlayabilir." - Taklit yan etkileri - • Deneysel istemci ve her an çalışmayı durdurabilir - • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir - • Ses parçası menüsü eksik - • AV1 video kodeği yok - • Sabit ses mevcut değil - • Çocuk videoları oturum açılmadığında veya gizli modda oynatılamayabilir - - • Orijinal sesi zorlama mevcut değil - Meraklısı için istatistiklerde göster - İstemci tipi meraklısı için istatistiklerde gösterilir - İstemci, meraklısı için istatistiklerde gizli - - - - - YT Music ReVanced - Music ReVanced - Music - - - Hakkında - Reklamlar - Genel - Oynatıcı - Çeşitli - - - Video reklamlarını gizle - Video reklamları gizli - Video reklamları görünür - - - Kalıcı tekrarı etkinleştir - Kalıcı tekrar etkin - Kalıcı tekrar devre dışı - - - Yayınla düğmesini gizle - Yayınla düğmesi gizli - Yayınla düğmesi görünür - Geçmiş düğmesini gizle - Geçmiş düğmesi gizli - Geçmiş düğmesi görünür - Bildirim düğmesini gizle - Bildirim düğmesi gizli - Bildirim düğmesi görünür - Arama düğmesini gizle - Arama düğmesi gizli - Arama düğmesi görünür - - - Kategori çubuğunu gizle - Kategori çubuğu gizli - Kategori çubuğu görünür - - - Mini oynatıcı rengini değiştir - Mini oynatıcı rengi tam ekran oynatıcıyla eşleşir - Mini oynatıcı varsayılan rengi kullanır - - - Gezinme çubuğu - Gezinme çubuğundaki düğmeleri gizle veya değiştir - - Ana Sayfa\'yı gizle - Ana Sayfa düğmesi gizli - Ana Sayfa düğmesi görünür - - Örnekler\'i gizle - Sana Özel düğmesi gizli - Sana Özel düğmesi görünür - - Keşfet\'i gizle - Keşfet düğmesi gizli - Keşfet düğmesi görünür - - Kitaplık\'ı gizle - Kitaplık düğmesi gizli - Kitaplık düğmesi görünür - - Yükselt\'i gizle - Yükselt düğmesi gizli - Yükselt düğmesi görünür - Gezinme çubuğunu gizle - Gezinme çubuğu gizli - Gezinme çubuğu görünür - Gezinme düğmeleri etiketlerini gizle - Etiketler gizli - Etiketler görünür - - - \'Müzik Premium Al\' etiketini gizle - Etiket gizli - Etiket görünür - - - Yükseltme düğmesini gizle - Düğme gizli - Düğme görünür - - - - - Ses reklamlarını engelle - Ses reklamları engelleniyor - Ses reklamları engellenmiyor - - - %s kullanılamıyor, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. - %s bir hata döndürdü, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. - Gömülü video reklamlarını engelle - Devre dışı - Luminous proxy - PurpleAdBlock proxy - - - Video reklamlarını engelle - Video reklamları engellenir - Video reklamları engellenmez - - - Mesaj silindi - Silinen mesajları göster - Silinen mesajları gösterme - Silinen mesajları spoiler ile gizle - Silinen mesajları üstü çizilmiş olarak göster - - - Kanal Puanlarını otomatik olarak topla - Kanal Puanları otomatik olarak toplanır - Kanal Puanları otomatik olarak toplanmaz - - - - Twitch hata ayıklama modunu etkinleştir - Twitch hata ayıklama modu etkin (önerilmez) - Twitch hata ayıklama modu devre dışı - - - ReVanced Ayarları - Hakkında - ReVanced hakkında - Reklam Engelleme - Reklam Engelleme ayarları - Sohbet - Sohbet ayarları - Çeşitli - Çeşitli ayarlar - Genel ayarlar - Diğer ayarlar - İstemci taraflı reklamlar - Sunucu taraflı kesin akışlı reklamlar - Hata ayıklama kayıtları - Hata ayıklama kayıtları etkin - Hata ayıklama kayıtları devre dışı - - + Taklit yan etkileri + • Deneysel istemci ve her an çalışmayı durdurabilir + • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir + • Ses parçası menüsü eksik + • AV1 video kodeği yok + • Sabit ses mevcut değil + • Çocuk videoları oturum açılmadığında veya gizli modda oynatılamayabilir + + • Orijinal sesi zorlama mevcut değil + Meraklısı için istatistiklerde göster + İstemci tipi meraklısı için istatistiklerde gösterilir + İstemci, meraklısı için istatistiklerde gizli + + + + + YT Music ReVanced + Music ReVanced + Music + + + Hakkında + Reklamlar + Genel + Oynatıcı + Çeşitli + + + Video reklamlarını gizle + Video reklamları gizli + Video reklamları görünür + + + Kalıcı tekrarı etkinleştir + Kalıcı tekrar etkin + Kalıcı tekrar devre dışı + + + Yayınla düğmesini gizle + Yayınla düğmesi gizli + Yayınla düğmesi görünür + Geçmiş düğmesini gizle + Geçmiş düğmesi gizli + Geçmiş düğmesi görünür + Bildirim düğmesini gizle + Bildirim düğmesi gizli + Bildirim düğmesi görünür + Arama düğmesini gizle + Arama düğmesi gizli + Arama düğmesi görünür + + + Kategori çubuğunu gizle + Kategori çubuğu gizli + Kategori çubuğu görünür + + + Mini oynatıcı rengini değiştir + Mini oynatıcı rengi tam ekran oynatıcıyla eşleşir + Mini oynatıcı varsayılan rengi kullanır + + + Gezinme çubuğu + Gezinme çubuğundaki düğmeleri gizle veya değiştir + + Ana Sayfa\'yı gizle + Ana Sayfa düğmesi gizli + Ana Sayfa düğmesi görünür + + Örnekler\'i gizle + Sana Özel düğmesi gizli + Sana Özel düğmesi görünür + + Keşfet\'i gizle + Keşfet düğmesi gizli + Keşfet düğmesi görünür + + Kitaplık\'ı gizle + Kitaplık düğmesi gizli + Kitaplık düğmesi görünür + + Yükselt\'i gizle + Yükselt düğmesi gizli + Yükselt düğmesi görünür + Gezinme çubuğunu gizle + Gezinme çubuğu gizli + Gezinme çubuğu görünür + Gezinme düğmeleri etiketlerini gizle + Etiketler gizli + Etiketler görünür + + + \'Müzik Premium Al\' etiketini gizle + Etiket gizli + Etiket görünür + + + Yükseltme düğmesini gizle + Düğme gizli + Düğme görünür + + + + + Ses reklamlarını engelle + Ses reklamları engelleniyor + Ses reklamları engellenmiyor + + + %s kullanılamıyor, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. + %s bir hata döndürdü, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. + Gömülü video reklamlarını engelle + Devre dışı + Luminous proxy + PurpleAdBlock proxy + + + Video reklamlarını engelle + Video reklamları engellenir + Video reklamları engellenmez + + + Mesaj silindi + Silinen mesajları göster + Silinen mesajları gösterme + Silinen mesajları spoiler ile gizle + Silinen mesajları üstü çizilmiş olarak göster + + + Kanal Puanlarını otomatik olarak topla + Kanal Puanları otomatik olarak toplanır + Kanal Puanları otomatik olarak toplanmaz + + + + Twitch hata ayıklama modunu etkinleştir + Twitch hata ayıklama modu etkin (önerilmez) + Twitch hata ayıklama modu devre dışı + + + ReVanced Ayarları + Hakkında + ReVanced hakkında + Reklam Engelleme + Reklam Engelleme ayarları + Sohbet + Sohbet ayarları + Çeşitli + Çeşitli ayarlar + Genel ayarlar + Diğer ayarlar + İstemci taraflı reklamlar + Sunucu taraflı kesin akışlı reklamlar + Hata ayıklama kayıtları + Hata ayıklama kayıtları etkin + Hata ayıklama kayıtları devre dışı + + diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index b221ac294d..58dcb0d37b 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -17,1261 +17,1260 @@ "First 'item' text Second \"item\" text" ---> - - - - Назва додатку - - Користувацька - Іконка додатку - Оригінальна - - ReVanced мінімальна - ReVanced масштабована - - Користувацька - - - Перевірки не вдалися - Відкрити офіційний вебсайт - Ігнорувати - <h5>Схоже, що цей застосунок був пропатчений не Вами.</h5><br>Він може працювати не належним чином, <b>бути шкідливим або навіть небезпечним</b>.<br><br>Ці перевірки означають, що цей застосунок був пропатчений та отриманий від когось іншого:<br><br><small>%1$s</small><br>Наполегливо рекомендується <b>видалити цей застосунок та пропатчити його самостійно,</b> щоб переконатися, що Ви використовуєте перевірений та безпечний застосунок.<p><br>Якщо це попередження проігнорувати, воно буде показано лише двічі. - Пропатчено на іншому пристрої - Встановлено не через ReVanced Manager - Пропатчено більше 10 хвилин тому - Пропатчено %s дні(в) тому - Дата збірки APK пошкоджена - - - Повідомлення ReVanced - Ваша історія переглядів не зберігається.<br><br>Швидше за все, це спричинено блокувальником реклами DNS або мережевим проксі.<br><br>Щоб це виправити, додайте <b>s.youtube.com</b> у білий список блокувальника або вимкніть усі DNS блокувальники та проксі. - Більше не показувати - - - Налаштування - Ви впевнені, що хочете продовжити? - Зберегти - Скинути - Скинути колір - Недійсний колір - Потрібен перезапуск - Перезапустіть застосунок, щоб зміни набули чинності. - Перезавантажити - Імпорт - Копіювати - Налаштування ReVanced скинуто до стандартних - Імпортовано %d налаштувань - Не вдалося імпортувати: %s - Пошук налаштувань - За запитом \'%s\' нічого не знайдено - Спробуйте інше ключове слово - Нещодавні пошуки - Видалити з історії пошуку? - Очистити історію пошуку - Ви впевнені, що хочете очистити всю історію пошуку? - Поради щодо пошуку - "• Натисніть на шлях, щоб відкрити його +--> + + + Назва додатку + + Користувацька + Іконка додатку + Оригінальна + + ReVanced мінімальна + ReVanced масштабована + + Користувацька + + + Перевірки не вдалися + Відкрити офіційний вебсайт + Ігнорувати + <h5>Схоже, що цей застосунок був пропатчений не Вами.</h5><br>Він може працювати не належним чином, <b>бути шкідливим або навіть небезпечним</b>.<br><br>Ці перевірки означають, що цей застосунок був пропатчений та отриманий від когось іншого:<br><br><small>%1$s</small><br>Наполегливо рекомендується <b>видалити цей застосунок та пропатчити його самостійно,</b> щоб переконатися, що Ви використовуєте перевірений та безпечний застосунок.<p><br>Якщо це попередження проігнорувати, воно буде показано лише двічі. + Пропатчено на іншому пристрої + Встановлено не через ReVanced Manager + Пропатчено більше 10 хвилин тому + Пропатчено %s дні(в) тому + Дата збірки APK пошкоджена + + + Повідомлення ReVanced + Ваша історія переглядів не зберігається.<br><br>Швидше за все, це спричинено блокувальником реклами DNS або мережевим проксі.<br><br>Щоб це виправити, додайте <b>s.youtube.com</b> у білий список блокувальника або вимкніть усі DNS блокувальники та проксі. + Більше не показувати + + + Налаштування + Ви впевнені, що хочете продовжити? + Зберегти + Скинути + Скинути колір + Недійсний колір + Потрібен перезапуск + Перезапустіть застосунок, щоб зміни набули чинності. + Перезавантажити + Імпорт + Копіювати + Налаштування ReVanced скинуто до стандартних + Імпортовано %d налаштувань + Не вдалося імпортувати: %s + Пошук налаштувань + За запитом \'%s\' нічого не знайдено + Спробуйте інше ключове слово + Нещодавні пошуки + Видалити з історії пошуку? + Очистити історію пошуку + Ви впевнені, що хочете очистити всю історію пошуку? + Поради щодо пошуку + "• Натисніть на шлях, щоб відкрити його • Натисніть і утримуйте налаштування, щоб перейти до нього • Натисніть Enter, щоб зберегти пошуковий запит в історію • Пошук ігнорує регістр і розділові знаки • Батьківські налаштування показуються над вимкненими дочірніми налаштуваннями" - Історія пошуку порожня - Щоб зберегти історію пошуку, введіть пошуковий запит і натисніть Enter - Показувати історію пошуку налаштувань - Історія пошуку налаштувань показується - Історія пошуку налаштувань не показується - Показувати іконки в налаштуваннях ReVanced - Іконки в налаштуваннях показуються - Іконки в налаштуваннях не показуються - Мова налаштувань ReVanced - "Переклади для деяких мов можуть бути відсутні або неповні. + Історія пошуку порожня + Щоб зберегти історію пошуку, введіть пошуковий запит і натисніть Enter + Показувати історію пошуку налаштувань + Історія пошуку налаштувань показується + Історія пошуку налаштувань не показується + Показувати іконки в налаштуваннях ReVanced + Іконки в налаштуваннях показуються + Іконки в налаштуваннях не показуються + Мова налаштувань ReVanced + "Переклади для деяких мов можуть бути відсутні або неповні. Щоб перекласти нові мови або покращити наявні переклади, відвідайте translate.revanced.app" - Мова застосунку - Імпорт / Експорт налаштувань - Імпорт / Експорт налаштувань ReVanced\n\nДля збереження налаштувань скопіюйте текст у вікні кнопкою \"Копіювати\" та збережіть його в текстовому файлі.\nДля відновлення налаштувань вставте у вікно збережений раніше текст та натисніть кнопку \"Імпортувати\" - - Ви використовуєте ReVanced Patches версії <i>%s</i> - Примітка - Ця версія є передрелізною, тому у Вас можуть виникати несподівані проблеми - Офіційні посилання - + Ви використовуєте ReVanced Patches версії <i>%s</i> + Примітка + Ця версія є передрелізною, тому у Вас можуть виникати несподівані проблеми + Офіційні посилання + - - - Налаштування GmsCore - Відкрити GmsCore для налаштування та входу в обліковий запис Google - - MicroG GmsCore не встановлено. Встановіть його. - Потрібна дія - "MicroG GmsCore не має дозволу на роботу в фоновому режимі. + + + Налаштування GmsCore + Відкрити GmsCore для налаштування та входу в обліковий запис Google + + MicroG GmsCore не встановлено. Встановіть його. + Потрібна дія + "MicroG GmsCore не має дозволу на роботу в фоновому режимі. Дотримуйтесь інструкцій з посібника \"Don't kill my app\" для Вашого телефону та застосуйте їх до своєї інсталяції MicroG. Це необхідно для роботи програми." - Відкрити вебсайт - "Необхідно вимкнути оптимізацію енергії для MicroG GmsCore, щоб запобігти проблемам. + Відкрити вебсайт + "Необхідно вимкнути оптимізацію енергії для MicroG GmsCore, щоб запобігти проблемам. Вимкнення оптимізації енергії для MicroG не вплине негативно на час автономної роботи. Натисніть кнопку \"Продовжити\" та вимкніть оптимізацію." - Продовжити - - - Підміна відеопотоків - Підміняти відеопотоки клієнта, щоб уникнути проблем із відтворенням - Підміна відеопотоків - "Відеопотоки підмінено + Продовжити + + + Підміна відеопотоків + Підміняти відеопотоки клієнта, щоб уникнути проблем із відтворенням + Підміна відеопотоків + "Відеопотоки підмінено Якщо Ви користуєтеся YouTube Premium, ця опція може бути не потрібна" - "Відеопотоки не підмінено + "Відеопотоки не підмінено Відтворення може не працювати" - Вимкнення цієї опції може спричинити проблеми з відтворенням. - Клієнт за замовчуванням - - - Примусово оригінальна мова звукової доріжки - Використовується оригінальна мова звукової доріжки - Використовується стандартна (регіональна) мова звукової доріжки - - Щоб використовувати цю функцію, змініть клієнт \"Підміни відеопотоків\" на будь-який клієнт, окрім Android Studio - - - Налагодження - Увімкнення або вимкнення параметрів налагодження - Журнал налагодження - Журнали налагодження ввімкнено - Журнали налагодження вимкнено - Реєструвати трасування стека - Журнали налагодження містять трасування стека - Журнали налагодження не містять трасування стека - Показувати тост при помилці ReVanced - Тост показується, якщо сталася помилка - Тост не показується, якщо сталася помилка - "Вимкнення сповіщень про помилки приховує всі сповіщення про помилки ReVanced. + Вимкнення цієї опції може спричинити проблеми з відтворенням. + Клієнт за замовчуванням + + + Примусово оригінальна мова звукової доріжки + Використовується оригінальна мова звукової доріжки + Використовується стандартна (регіональна) мова звукової доріжки + + Щоб використовувати цю функцію, змініть клієнт \"Підміни відеопотоків\" на будь-який клієнт, окрім Android Studio + + + Налагодження + Увімкнення або вимкнення параметрів налагодження + Журнал налагодження + Журнали налагодження ввімкнено + Журнали налагодження вимкнено + Реєструвати трасування стека + Журнали налагодження містять трасування стека + Журнали налагодження не містять трасування стека + Показувати тост при помилці ReVanced + Тост показується, якщо сталася помилка + Тост не показується, якщо сталася помилка + "Вимкнення сповіщень про помилки приховує всі сповіщення про помилки ReVanced. Ви не будете отримувати сповіщення про будь-які непередбачувані події." - Експортувати журнали налагодження - Копіює журнали налагодження ReVanced до буфера обміну - Журнали налагодження вимкнено - Журнали не знайдено - Журнали скопійовано - Не вдалося експортувати журнали: %s - Очистити журнали налагодження - Очищує всі збережені журнали налагодження ReVanced - Журнали очищено - Менеджер експериментальних прапорців - Керувати експериментальними boolean прапорцями - Активні (%d) - Заблоковані (%d) - Пошук... - Прапорці збережено - Прапорці скинуто - Прапорці скопійовано до буфера обміну - Реєструвати буфер протоколу - Журнали налагодження містять протобуфер - Журнали налагодження не містять протобуфер - "Увімкнення цього налаштування реєструватиме додаткові дані про макет, зокрема текст на екрані для деяких компонентів інтерфейсу. + Експортувати журнали налагодження + Копіює журнали налагодження ReVanced до буфера обміну + Журнали налагодження вимкнено + Журнали не знайдено + Журнали скопійовано + Не вдалося експортувати журнали: %s + Очистити журнали налагодження + Очищує всі збережені журнали налагодження ReVanced + Журнали очищено + Менеджер експериментальних прапорців + Керувати експериментальними boolean прапорцями + Активні (%d) + Заблоковані (%d) + Пошук... + Прапорці збережено + Прапорці скинуто + Прапорці скопійовано до буфера обміну + Реєструвати буфер протоколу + Журнали налагодження містять протобуфер + Журнали налагодження не містять протобуфер + "Увімкнення цього налаштування реєструватиме додаткові дані про макет, зокрема текст на екрані для деяких компонентів інтерфейсу. Це може допомогти визначити компоненти під час створення користувацьких фільтрів. Однак, увімкнувши це, також буде записано деякі дані користувача, наприклад Вашу IP-адресу." - - - Очищення посилань для поширення - Параметри запиту відстеження вилучаються з поширених посилань - Параметри запиту відстеження не вилучаються з поширених посилань - Змінити посилання для поширення на youtube.com - Під час поширення посилань використовується youtube.com - Під час поширення посилань використовується music.youtube.com - - - Користувацький фільтр - Приховати компоненти за допомогою користувацьких фільтрів - Увімкнути користувацький фільтр - Користувацький фільтр увімкнено - Користувацький фільтр вимкнено - Користувацький фільтр - - Список рядків конструктора шляхів компонентів для фільтрування, розділених новим рядком - Недійсний фільтр: %s - - - - - Інформація - Реклама - Альтернативні прев\'ю - Стрічка - Загальні - Плеєр - Панель прогресу - Керування жестами - Різне - Відео - Відновити старе меню налаштувань - Показується старе меню налаштувань - Показується нове меню налаштувань - - - Вимкнути фонове відтворення Shorts - Фонове відтворення Shorts вимкнено - Фонове відтворення Shorts увімкнено - - - Приховати картки альбому - Картки альбому приховано - Картки альбому показуються - Приховати картки виконавця - Картки виконавця приховано - Картки виконавця показуються - Приховати полицю фішок - Полицю фішок приховано - Полиця фішок показується - Приховати публікації спільноти - Публікації спільноти приховано - Публікації спільноти показуються - Приховати компактні банери - Компактні банери приховано - Компактні банери показуються - Приховати розширювану картку - Розширювану картку під відео приховано - Розширювана картка під відео показується - Приховати плаваючу кнопку мікрофона - Плаваючу кнопку мікрофона в пошуку приховано - Плаваюча кнопка мікрофона в пошуку показується - Приховати горизонтальні полиці - "Горизонтальні полиці приховано: + + + Очищення посилань для поширення + Параметри запиту відстеження вилучаються з поширених посилань + Параметри запиту відстеження не вилучаються з поширених посилань + Змінити посилання для поширення на youtube.com + Під час поширення посилань використовується youtube.com + Під час поширення посилань використовується music.youtube.com + + + Користувацький фільтр + Приховати компоненти за допомогою користувацьких фільтрів + Увімкнути користувацький фільтр + Користувацький фільтр увімкнено + Користувацький фільтр вимкнено + Користувацький фільтр + + Список рядків конструктора шляхів компонентів для фільтрування, розділених новим рядком + Недійсний фільтр: %s + + + + + Інформація + Реклама + Альтернативні прев\'ю + Стрічка + Загальні + Плеєр + Панель прогресу + Керування жестами + Різне + Відео + Відновити старе меню налаштувань + Показується старе меню налаштувань + Показується нове меню налаштувань + + + Вимкнути фонове відтворення Shorts + Фонове відтворення Shorts вимкнено + Фонове відтворення Shorts увімкнено + + + Приховати картки альбому + Картки альбому приховано + Картки альбому показуються + Приховати картки виконавця + Картки виконавця приховано + Картки виконавця показуються + Приховати полицю фішок + Полицю фішок приховано + Полиця фішок показується + Приховати публікації спільноти + Публікації спільноти приховано + Публікації спільноти показуються + Приховати компактні банери + Компактні банери приховано + Компактні банери показуються + Приховати розширювану картку + Розширювану картку під відео приховано + Розширювана картка під відео показується + Приховати плаваючу кнопку мікрофона + Плаваючу кнопку мікрофона в пошуку приховано + Плаваюча кнопка мікрофона в пошуку показується + Приховати горизонтальні полиці + "Горизонтальні полиці приховано: • Гарячі новини • Продовжити перегляд • Переглянути більше каналів • Найдоречніші • Покупки • Дивитися знову" - Горизонтальні полиці показуються - Приховати полицю із зображеннями - Полицю із зображеннями в результатах пошуку приховано - Полиця із зображеннями в результатах пошуку показується - Приховати останні публікації - Останні публікації приховано - Останні публікації показуються - Приховати \"Мікс плейлисти\" - \"Мікс плейлисти\" приховано - \"Мікс плейлисти\" показуються - Приховати секцію фільмів - Секцію фільмів приховано - Секція фільмів показується - - Приховати кнопку \"Сповістити мене\" - Кнопку \"Сповістити мене\" приховано - Кнопка \"Сповістити мене\" показується - Приховати \"Ігрову кімнату\" - Розділ \"Ігрова кімната\" приховано - Розділ \"Ігрова кімната\" показується - - Приховати кнопку \"Показати більше\" - Кнопку \"Показати більше\" у результатах пошуку приховано - Кнопка \"Показати більше\" у результатах пошуку показується - Приховати опитування - Опитування приховано - Опитування показуються - Приховати полицю квитків - Полицю квитків приховано - Полиця квитків показується - - Приховати мітки відеорекомендацій - Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку приховано - Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку показуються - Приховати візуальний розділювач - Візуальний розділювач приховано - Візуальний розділювач відображається - - Приховати Дудли YouTube - Анімацію Дудлів YouTube на логотипі приховано - Анімація Дудлів YouTube на логотипі показується - "Дудли YouTube показуються кілька днів на рік. + Приховати кнопку \"Показати більше\" + Кнопку \"Показати більше\" у результатах пошуку приховано + Кнопка \"Показати більше\" у результатах пошуку показується + Приховати опитування + Опитування приховано + Опитування показуються + Приховати полицю квитків + Полицю квитків приховано + Полиця квитків показується + + Приховати мітки відеорекомендацій + Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку приховано + Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку показуються + Приховати візуальний розділювач + Візуальний розділювач приховано + Візуальний розділювач відображається + + Приховати Дудли YouTube + Анімацію Дудлів YouTube на логотипі приховано + Анімація Дудлів YouTube на логотипі показується + "Дудли YouTube показуються кілька днів на рік. Якщо Дудл зараз показується у вашому регіоні, і це налаштування приховування ввімкнено, то панель фільтрів під рядком пошуку також буде приховано." - Приховати панель каналу - Панель каналу під відеоплеєром приховано - Панель каналу під відеоплеєром показується - Приховати водяний знак каналу - Водяний знак у нижній частині відеоплеєра приховано - Водяний знак у нижній частині відеоплеєра показується - Приховати скриню фінансування - Скриньку фінансування приховано - Скринька фінансування показується - Приховати аварійні скриньки - Аварійні скриньки приховано - Аварійні скриньки показуються - Приховати інформаційні панелі - Інформаційні панелі приховано - Інформаційні панелі показуються - - Приховати кнопку \"Підписатися +\" - Кнопку \"Підписатися +\" приховано - Кнопка \"Підписатися +\" показується - Приховати медичні панелі - Панелі про медицину приховано - Панелі про медицину показуються - Приховати швидкі дії - Швидкі дії в повноекранному режимі приховано - Швидкі дії в повноекранному режимі показуються - Приховати пов\'язані відео - Пов\'язані відео у швидких діях приховано - Пов\'язані відео у швидких діях показуються - Приховати правила спільноти підписок - Правила спільноти підписок приховано - Правила спільноти підписок показуються - Приховати тимчасові реакції - Тимчасові реакції приховано - Тимчасові реакції показуються - Приховати секцію \"Короткий переказ від ШІ\" - Секцію короткого переказу відео, згенерованого ШІ, приховано - Секція короткого переказу відео, згенерованого ШІ, показується - Приховати \"Запитати\" - Секцію \"Запитати\" приховано - Секція \"Запитати\" показується - Приховати секції атрибутів - Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" приховано - Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" показуються - Приховати секцію \"Розділи\" - Секцію \"Розділи\" приховано - Секція \"Розділи\" показується - Приховати секцію \"Як створювався цей контент\" - Секцію \"Як створювався цей контент\" приховано - Секція \"Як створювався цей контент\" показується - Приховати очки голосів - Очки голосів приховано - Очки голосів показуються - Приховати секцію \"Послухайте подкаст\" - Секцію \"Послухайте подкаст\" приховано - Секція \"Послухайте подкаст\" показується - Приховати рекомендовані посилання - Секцію рекомендованих посилань приховано - Секція рекомендованих посилань показується - Приховати рекомендовані відео - Секцію рекомендованих відео приховано - Секція рекомендованих відео показується - Приховати секцію інформаційних карток - Секцію інформаційних карток приховано - Секція інформаційних карток показується - Приховати секцію \"Основні поняття\" - Секцію \"Основні поняття\" приховано - Секція \"Основні поняття\" показується - Приховати \"Підписатися\" - Кнопку \"Підписатися\" приховано - Кнопка \"Підписатися\" показується - Приховати секцію \"Текст відео\" - Секцію \"Текст відео\" приховано - Секція \"Текст відео\" показується - Опис відео - Приховати або показувати компоненти опису відео - Панель фільтрів - Приховати або показувати панель фільтрів у стрічках, пов\'язаних відео, результатах пошуку та історії - Приховати у стрічках - Приховано у стрічках - Показується у стрічках - Приховати у пов\'язаних відео - Приховано у пов\'язаних відео - Показується у пов\'язаних відео - Приховати у результатах пошуку - Приховано у результатах пошуку - Показується у результатах пошуку - Приховати в історії переглядів - Приховано в історії переглядів - Показується в історії переглядів - Сторінка каналу - Приховати або показувати компоненти сторінки каналу - - Приховати кнопку «Спільнота» - Кнопку \"Спільнота\" приховано - Кнопка \"Спільнота\" показується - - Приховати полицю \"Для вас\" - Полицю \"Для вас\" приховано - Полиця \"Для вас\" показується - - Приховати \"Підписатися +\" - Кнопку \"Підписатися +\" приховано - Кнопка \"Підписатися +\" показується - Приховати попередній перегляд посилань - Попередній перегляд посилань приховано - Попередній перегляд посилань показується - Приховати полицю учасників - Полицю учасників приховано - Полиця учасників відображається - - Приховати кнопку \"Магазин\" - Кнопку \"Магазин\" приховано - Кнопка \"Магазин\" показується - - Приховати \"Підписатися\" - Кнопку \"Підписатися\" приховано - Кнопка \"Підписатися\" показується - Коментарі - Приховати або показувати компоненти секції коментарів - Приховати \"Огляд чату від ШІ\" - \"Огляд чату від ШІ\" приховано - \"Огляд чату від ШІ\" показується - Приховати вкладку \"За темою\" - Зведення коментарів від ШІ приховано - Зведення коментарів від ШІ показується - Приховати правила каналу - Правила каналу приховано - Правила каналу показуються - Приховати \"Коментарі від спонсорів\" - Заголовок \"Коментарі від спонсорів\" приховано - Заголовок \"Коментарі від спонсорів\" показується - Приховати секцію коментарів - Секцію коментарів приховано - Секція коментарів показується - Приховати правила спільноти - Правила спільноти приховано - Правила спільноти показуються - Приховати кнопку \"Створити Short\" - Кнопку \"Створити Short\" приховано - Кнопка \"Створити Short\" показується - Приховати кнопки емодзі та позначки часу - Кнопки емодзі та позначки часу приховано - Кнопки емодзі та позначки часу показуються - Приховати прев\'ю коментар - Прев\'ю коментар в секції коментарів приховано - Прев\'ю коментар в секції коментарів показується - Приховати \"Дякую\" - Кнопку \"Дякую\" приховано - Кнопка \"Дякую\" показується - Приховати кількість переглядів - Кількість переглядів приховано у стрічці та результатах пошуку - Кількість переглядів показуються у стрічці та результатах пошуку - - "Обмеження: + Приховати кнопку \"Підписатися +\" + Кнопку \"Підписатися +\" приховано + Кнопка \"Підписатися +\" показується + Приховати медичні панелі + Панелі про медицину приховано + Панелі про медицину показуються + Приховати швидкі дії + Швидкі дії в повноекранному режимі приховано + Швидкі дії в повноекранному режимі показуються + Приховати пов\'язані відео + Пов\'язані відео у швидких діях приховано + Пов\'язані відео у швидких діях показуються + Приховати правила спільноти підписок + Правила спільноти підписок приховано + Правила спільноти підписок показуються + Приховати тимчасові реакції + Тимчасові реакції приховано + Тимчасові реакції показуються + Приховати секцію \"Короткий переказ від ШІ\" + Секцію короткого переказу відео, згенерованого ШІ, приховано + Секція короткого переказу відео, згенерованого ШІ, показується + Приховати \"Запитати\" + Секцію \"Запитати\" приховано + Секція \"Запитати\" показується + Приховати секції атрибутів + Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" приховано + Секції \"Місця на відео\", \"Ігри\", \"Музика\" та \"Люди, згадані у відео\" показуються + Приховати секцію \"Розділи\" + Секцію \"Розділи\" приховано + Секція \"Розділи\" показується + Приховати секцію \"Як створювався цей контент\" + Секцію \"Як створювався цей контент\" приховано + Секція \"Як створювався цей контент\" показується + Приховати очки голосів + Очки голосів приховано + Очки голосів показуються + Приховати секцію \"Послухайте подкаст\" + Секцію \"Послухайте подкаст\" приховано + Секція \"Послухайте подкаст\" показується + Приховати рекомендовані посилання + Секцію рекомендованих посилань приховано + Секція рекомендованих посилань показується + Приховати рекомендовані відео + Секцію рекомендованих відео приховано + Секція рекомендованих відео показується + Приховати секцію інформаційних карток + Секцію інформаційних карток приховано + Секція інформаційних карток показується + Приховати секцію \"Основні поняття\" + Секцію \"Основні поняття\" приховано + Секція \"Основні поняття\" показується + Приховати \"Підписатися\" + Кнопку \"Підписатися\" приховано + Кнопка \"Підписатися\" показується + Приховати секцію \"Текст відео\" + Секцію \"Текст відео\" приховано + Секція \"Текст відео\" показується + Опис відео + Приховати або показувати компоненти опису відео + Панель фільтрів + Приховати або показувати панель фільтрів у стрічках, пов\'язаних відео, результатах пошуку та історії + Приховати у стрічках + Приховано у стрічках + Показується у стрічках + Приховати у пов\'язаних відео + Приховано у пов\'язаних відео + Показується у пов\'язаних відео + Приховати у результатах пошуку + Приховано у результатах пошуку + Показується у результатах пошуку + Приховати в історії переглядів + Приховано в історії переглядів + Показується в історії переглядів + Сторінка каналу + Приховати або показувати компоненти сторінки каналу + + Приховати кнопку «Спільнота» + Кнопку \"Спільнота\" приховано + Кнопка \"Спільнота\" показується + + Приховати полицю \"Для вас\" + Полицю \"Для вас\" приховано + Полиця \"Для вас\" показується + + Приховати \"Підписатися +\" + Кнопку \"Підписатися +\" приховано + Кнопка \"Підписатися +\" показується + Приховати попередній перегляд посилань + Попередній перегляд посилань приховано + Попередній перегляд посилань показується + Приховати полицю учасників + Полицю учасників приховано + Полиця учасників відображається + + Приховати кнопку \"Магазин\" + Кнопку \"Магазин\" приховано + Кнопка \"Магазин\" показується + + Приховати \"Підписатися\" + Кнопку \"Підписатися\" приховано + Кнопка \"Підписатися\" показується + Коментарі + Приховати або показувати компоненти секції коментарів + Приховати \"Огляд чату від ШІ\" + \"Огляд чату від ШІ\" приховано + \"Огляд чату від ШІ\" показується + Приховати вкладку \"За темою\" + Зведення коментарів від ШІ приховано + Зведення коментарів від ШІ показується + Приховати правила каналу + Правила каналу приховано + Правила каналу показуються + Приховати \"Коментарі від спонсорів\" + Заголовок \"Коментарі від спонсорів\" приховано + Заголовок \"Коментарі від спонсорів\" показується + Приховати секцію коментарів + Секцію коментарів приховано + Секція коментарів показується + Приховати правила спільноти + Правила спільноти приховано + Правила спільноти показуються + Приховати кнопку \"Створити Short\" + Кнопку \"Створити Short\" приховано + Кнопка \"Створити Short\" показується + Приховати кнопки емодзі та позначки часу + Кнопки емодзі та позначки часу приховано + Кнопки емодзі та позначки часу показуються + Приховати прев\'ю коментар + Прев\'ю коментар в секції коментарів приховано + Прев\'ю коментар в секції коментарів показується + Приховати \"Дякую\" + Кнопку \"Дякую\" приховано + Кнопка \"Дякую\" показується + Приховати кількість переглядів + Кількість переглядів приховано у стрічці та результатах пошуку + Кількість переглядів показуються у стрічці та результатах пошуку + + "Обмеження: • Полиці Shorts, сторінки каналів та результати пошуку можуть досі показувати кількість переглядів • Ця функція не працює з автомобільним макетом інтерфейсу" - Приховати час завантаження - Час завантаження приховано у стрічці та результатах пошуку - Час завантаження показується у стрічці та результатах пошуку - - "Обмеження: + Приховати час завантаження + Час завантаження приховано у стрічці та результатах пошуку + Час завантаження показується у стрічці та результатах пошуку + + "Обмеження: • Полиці Shorts, сторінки каналів і результати пошуку можуть досі показувати час завантаження • Ця функція не працює з автомобільним макетом інтерфейсу" - Приховати контент за ключовими словами - Приховати відео із результатів пошуку та стрічки за допомогою фільтрів ключових слів - Приховати відео на головній - Відео на вкладці \"Головна\" фільтруються за ключовими словами - Відео на вкладці \"Головна\" не фільтруються за ключовими словами - Приховати відео в пошуку - Результати пошуку фільтруються за ключовими словами - Результати пошуку не фільтруються за ключовими словами - Приховати відео в підписках - Відео на вкладці \"Підписки\" фільтруються за ключовими словами - Відео на вкладці \"Підписки\" не фільтруються за ключовими словами - Ключові слова, які потрібно приховати - - "Ключові слова та фрази, які потрібно приховати, розділені новими рядками. + "Ключові слова та фрази, які потрібно приховати, розділені новими рядками. Ключовими словами можуть бути назви каналів або будь-який текст, вказаний у заголовках відео Слова з великими літерами посередині мають містити регістр (наприклад: iPhone, TikTok, Івано-Франківськ)" - Про фільтр ключових слів - "Головна/Підписки/Результати пошуку фільтруються, щоб приховати вміст, який відповідає ключовим фразам + Про фільтр ключових слів + "Головна/Підписки/Результати пошуку фільтруються, щоб приховати вміст, який відповідає ключовим фразам Обмеження • Shorts неможливо приховати за назвою каналу • Деякі компоненти інтерфейсу можуть не приховуватися • Пошук за ключовим словом може не показувати результатів" - Лише цілі слова - - Взяття ключового слова/фрази в подвійні лапки запобігатиме частковим збігам назв відео та каналів<br><br>Наприклад,<br><b>\"ші\"</b> приховає відео: <b>Як працює ШІ (штучний інтелект)?</b><br>але не приховає: <b>Що означає цифра шість?</b> - - Неможливо використати: %s - Додайте лапки, щоб використовувати: %s - Ключове слово має конфліктні оголошення: %s - Ключове слово занадто коротке і потребує лапок: %s - Ключове слово приховає всі відео: %s - - - Приховати полицю магазину автора - Полицю магазину автора під відеоплеєром приховано - Полиця магазину автора під відеоплеєром показується - Приховати банер магазину на кінцевому екрані - Банер магазину на кінцевому екрані приховано - Банер магазину на кінцевому екрані показується - Приховати повноекранну рекламу - "Повноекранну рекламу приховано + Лише цілі слова + + Взяття ключового слова/фрази в подвійні лапки запобігатиме частковим збігам назв відео та каналів<br><br>Наприклад,<br><b>\"ші\"</b> приховає відео: <b>Як працює ШІ (штучний інтелект)?</b><br>але не приховає: <b>Що означає цифра шість?</b> + + Неможливо використати: %s + Додайте лапки, щоб використовувати: %s + Ключове слово має конфліктні оголошення: %s + Ключове слово занадто коротке і потребує лапок: %s + Ключове слово приховає всі відео: %s + + + Приховати полицю магазину автора + Полицю магазину автора під відеоплеєром приховано + Полиця магазину автора під відеоплеєром показується + Приховати банер магазину на кінцевому екрані + Банер магазину на кінцевому екрані приховано + Банер магазину на кінцевому екрані показується + Приховати повноекранну рекламу + "Повноекранну рекламу приховано Ця функція доступна тільки для старих пристроїв" - Повноекранна реклама показується - - Приховувати повноекранну рекламу працює тільки зі старими пристроями - Приховати загальну рекламу - Загальну рекламу приховано - Загальна реклама показується - Приховати товарні банери - Товарні банери приховано - Товарні банери показуються - Приховати \"Містить пряму рекламу\" - Мітку \"Містить пряму рекламу\" приховано - Мітка \"Містить пряму рекламу\" показується - Приховати картки само спонсорства - Картки само спонсорства приховано - Картки само спонсорства показуються - Приховати посилання на покупки - Посилання на покупки в описі відео приховано - Посилання на покупки в описі відео показуються - Приховати банер \"Перегляд товарів\" - Банер перегляду товарів у інтерфейсі відеоплеєра приховано - Банер перегляду товарів у інтерфейсі відеоплеєра показується - Приховати результати вебпошуку - Результати вебпошуку приховано - Результати вебпошуку показуються - - - Приховати рекламу YouTube Premium - Рекламу YouTube Premium під відеоплеєром приховано - Реклама YouTube Premium під відеоплеєром показується - - - Приховати відеорекламу - Відеорекламу приховано - Відеореклама показується - - - URL-адресу скопійовано до буфера - URL-адресу з міткою часу скопійовано до буфера - Кнопка копіювання URL відео - Кнопка копіювання URL-адреси відео показується. Натисніть, щоб скопіювати URL-адресу відео. Натисніть і утримуйте, щоб скопіювати з міткою часу - Кнопка копіювання URL-адреси відео не показується - Кнопка копіювання URL із міткою часу - Кнопка копіювання URL-адреси з міткою часу показується. Натисніть, щоб скопіювати URL-адресу відео з міткою часу. Натисніть і утримуйте, щоб скопіювати без мітки часу - Кнопка копіювання URL-адреси з міткою часу не показується - - - Вилучити діалог про неприйнятний контент - Діалогове вікно про неприйнятний контент буде видалено - Діалогове вікно про неприйнятний контент буде показуватися - Це не обходить вікові обмеження, а просто приймає їх автоматично. - - - Вимкнути вікно \"Увійти на телевізорі\" - Спливаюче вікно \"Увійти на телевізорі\" вимкнено - Спливаюче вікно \"Увійти на телевізорі\" увімкнено - - - Вимкнути пропуск розділу подвійним натисканням - Подвійне натискання двома пальцями ніколи не викличе пропуск до наступного/попереднього розділу - Подвійне натискання двома пальцями іноді може викликати пропуск до наступного/попереднього розділу - - - Зовнішній завантажувач - Налаштування для використання зовнішнього завантажувача відео - Кнопка завантажувача в плеєрі - Кнопка \"Завантажити\" в плеєрі показується - Кнопка \"Завантажити\" в плеєрі не показується - - Підмінити кнопку \"Завантажити\" - Кнопка \"Завантажити\" запускає зовнішній завантажувач - Кнопка \"Завантажити\" запускає власний завантажувач - Ім\'я пакета завантажувача - Ім\'я пакета встановленого Вами застосунку зовнішнього завантажувача - Введіть ім\'я пакета - Вказати інший - Застосунок не встановлено - %s не встановлено. Встановіть його. - "Не вдалося знайти встановлений застосунок з ім'ям пакета: %s + Повноекранна реклама показується + + Приховувати повноекранну рекламу працює тільки зі старими пристроями + Приховати загальну рекламу + Загальну рекламу приховано + Загальна реклама показується + Приховати товарні банери + Товарні банери приховано + Товарні банери показуються + Приховати \"Містить пряму рекламу\" + Мітку \"Містить пряму рекламу\" приховано + Мітка \"Містить пряму рекламу\" показується + Приховати картки само спонсорства + Картки само спонсорства приховано + Картки само спонсорства показуються + Приховати посилання на покупки + Посилання на покупки в описі відео приховано + Посилання на покупки в описі відео показуються + Приховати банер \"Перегляд товарів\" + Банер перегляду товарів у інтерфейсі відеоплеєра приховано + Банер перегляду товарів у інтерфейсі відеоплеєра показується + Приховати результати вебпошуку + Результати вебпошуку приховано + Результати вебпошуку показуються + + + Приховати рекламу YouTube Premium + Рекламу YouTube Premium під відеоплеєром приховано + Реклама YouTube Premium під відеоплеєром показується + + + Приховати відеорекламу + Відеорекламу приховано + Відеореклама показується + + + URL-адресу скопійовано до буфера + URL-адресу з міткою часу скопійовано до буфера + Кнопка копіювання URL відео + Кнопка копіювання URL-адреси відео показується. Натисніть, щоб скопіювати URL-адресу відео. Натисніть і утримуйте, щоб скопіювати з міткою часу + Кнопка копіювання URL-адреси відео не показується + Кнопка копіювання URL із міткою часу + Кнопка копіювання URL-адреси з міткою часу показується. Натисніть, щоб скопіювати URL-адресу відео з міткою часу. Натисніть і утримуйте, щоб скопіювати без мітки часу + Кнопка копіювання URL-адреси з міткою часу не показується + + + Вилучити діалог про неприйнятний контент + Діалогове вікно про неприйнятний контент буде видалено + Діалогове вікно про неприйнятний контент буде показуватися + Це не обходить вікові обмеження, а просто приймає їх автоматично. + + + Вимкнути вікно \"Увійти на телевізорі\" + Спливаюче вікно \"Увійти на телевізорі\" вимкнено + Спливаюче вікно \"Увійти на телевізорі\" увімкнено + + + Вимкнути пропуск розділу подвійним натисканням + Подвійне натискання двома пальцями ніколи не викличе пропуск до наступного/попереднього розділу + Подвійне натискання двома пальцями іноді може викликати пропуск до наступного/попереднього розділу + + + Зовнішній завантажувач + Налаштування для використання зовнішнього завантажувача відео + Кнопка завантажувача в плеєрі + Кнопка \"Завантажити\" в плеєрі показується + Кнопка \"Завантажити\" в плеєрі не показується + + Підмінити кнопку \"Завантажити\" + Кнопка \"Завантажити\" запускає зовнішній завантажувач + Кнопка \"Завантажити\" запускає власний завантажувач + Ім\'я пакета завантажувача + Ім\'я пакета встановленого Вами застосунку зовнішнього завантажувача + Введіть ім\'я пакета + Вказати інший + Застосунок не встановлено + %s не встановлено. Встановіть його. + "Не вдалося знайти встановлений застосунок з ім'ям пакета: %s Перевірте, чи правильне ім'я пакета та чи встановлено застосунок" - Ім\'я пакета не може бути порожнім - - - Вимкнути жест точного перемотування - Жест для точного покадрового перемотування вимкнено - Жест для точного покадрового перемотування ввімкнено - - - Увімкнути перемотку натисканням - Перемотку натисканням на смугу прогресу ввімкнено - Перемотку натисканням на смугу прогресу вимкнено - - - Зміна яскравості жестом - "Зміну яскравості жестом в повноекранному режимі увімкнено + Ім\'я пакета не може бути порожнім + + + Вимкнути жест точного перемотування + Жест для точного покадрового перемотування вимкнено + Жест для точного покадрового перемотування ввімкнено + + + Увімкнути перемотку натисканням + Перемотку натисканням на смугу прогресу ввімкнено + Перемотку натисканням на смугу прогресу вимкнено + + + Зміна яскравості жестом + "Зміну яскравості жестом в повноекранному режимі увімкнено Регулюйте яскравість, проводячи пальцем вертикально по лівій стороні екрана" - Зміну яскравості жестом в повноекранному режимі вимкнено - Зміна гучності жестом - "Зміну гучності жестом в повноекранному режимі увімкнено + Зміну яскравості жестом в повноекранному режимі вимкнено + Зміна гучності жестом + "Зміну гучності жестом в повноекранному режимі увімкнено Регулюйте гучність, проводячи пальцем вертикально по правій стороні екрана" - Зміну гучності жестом в повноекранному режимі вимкнено - Увімкнути натискання для жесту - Натискання та утримання для жесту ввімкнено - Натискання та утримання для жесту вимкнено - Вібрація при жестах - Вібрацію при жестах увімкнено - Вібрацію при жестах вимкнено - Зберігати та відновлювати яскравість - Значення яскравості при переході до повноекранного режиму зберігається та відновлюється - Значення яскравості при переході до повноекранного режиму не зберігається та не відновлюється - Жест автояскравості - Проведення вниз до найнижчого значення яскравості вмикає автоматичну яскравість - Проведення вниз до найнижчого значення не вмикає автоматичну яскравість - Авто - Час показу панелі жесту - Скільки мілісекунд спливаюча панель при жесті буде показуватися - Затемнення фону панелі жесту - Значення затемнення від 0 до 100 - Значення затемнення панелі жесту має бути в межах від 0 до 100 - Колір смуги прогресу яскравості - Колір смуги прогресу під час регулювання яскравості - Колір смуги прогресу гучності - Колір смуги прогресу під час регулювання гучності - Розмір тексту панелі жесту - Розмір тексту панелі жесту від 1 до 30 - Розмір тексту має бути від 1 до 30 - Поріг величини жесту - Мінімальна амплітуда руху, що розпізнається як жест - Чутливість жесту гучності - Наскільки змінюється гучність проводячи пальцем по екрану - Стиль панелі жесту - Горизонтальний індикатор - Горизонтальний індикатор (мінімальний - зверху) - Горизонтальний індикатор (мінімальний - по центру) - Круговий індикатор - Круговий індикатор (мінімальний) - Вертикальний індикатор - Вертикальний індикатор (мінімальний) - Увімкнути зміну відео проведенням - Проведення пальцем у повноекранному режимі перейде до наступного/попереднього відео - Проведення пальцем у повноекранному режимі не перейде до наступного/попереднього відео - - - Вимкнути автоматичні субтитри - Автоматичні субтитри вимкнено - Автоматичні субтитри ввімкнено - - - Кнопки дій - Приховати або показувати кнопки дій під відео - Вимкнути блимання кнопок \"Лайк\" та \"Підписатися\" - Кнопки \"Лайк\" та \"Підписатися\" не будуть блимати при згадуванні - Кнопки \"Лайк\" та \"Підписатися\" не будуть блимати при згадуванні - Приховати \"Лайк\" та \"Дизлайк\" - Кнопки \"Лайк\" та \"Дизлайк\" приховано - Кнопки \"Лайк\" та \"Дизлайк\" показуються - - Приховати \"Поділитися\" - Кнопку \"Поділитися\" приховано - Кнопка \"Поділитися\" показується - - Приховати \"Зупинити показ оголошень\" - Кнопку \"Зупинити показ оголошень\" приховано - Кнопка \"Зупинити показ оголошень\" показується - - Приховати \"Коментарі\" - Кнопку \"Коментарі\" приховано - Кнопка \"Коментарі\" показується - + Приховати \"Поділитися\" + Кнопку \"Поділитися\" приховано + Кнопка \"Поділитися\" показується + + Приховати \"Зупинити показ оголошень\" + Кнопку \"Зупинити показ оголошень\" приховано + Кнопка \"Зупинити показ оголошень\" показується + + Приховати \"Коментарі\" + Кнопку \"Коментарі\" приховано + Кнопка \"Коментарі\" показується + - Приховати \"Поскаржитися\" - Кнопку \"Поскаржитися\" приховано - Кнопка \"Поскаржитися\" показується - - Приховати \"Реміксувати\" - Кнопку \"Реміксувати\" приховано - Кнопка \"Реміксувати\" показується - - Приховати \"Завантажити\" - Кнопку \"Завантажити\" приховано - Кнопка \"Завантажити\" показується - + Приховати \"Реміксувати\" + Кнопку \"Реміксувати\" приховано + Кнопка \"Реміксувати\" показується + + Приховати \"Завантажити\" + Кнопку \"Завантажити\" приховано + Кнопка \"Завантажити\" показується + - Приховати \"Голосувати\" - Кнопку \"Голосувати\" приховано - Кнопка \"Голосувати\" показується - - Приховати \"Рекламувати\" - Кнопку \"Рекламувати\" приховано - Кнопка \"Рекламувати\" показується - - Приховати \"Дякую\" - Кнопку \"Дякую\" приховано - Кнопка \"Дякую\" показується - + Приховати \"Рекламувати\" + Кнопку \"Рекламувати\" приховано + Кнопка \"Рекламувати\" показується + + Приховати \"Дякую\" + Кнопку \"Дякую\" приховано + Кнопка \"Дякую\" показується + - Приховати \"Запитати\" - Кнопку \"Запитати\" приховано - Кнопка \"Запитати\" показується - - Приховати \"Створити кліп\" - Кнопку \"Створити кліп\" приховано - Кнопка \"Створити кліп\" показується - - Приховати \"Покупки\" - Кнопку \"Покупки\" приховано - Кнопка \"Покупки\" показується - - Приховати \"Зберегти\" - Кнопку \"Зберегти\" приховано - Кнопка \"Зберегти\" показується - - - Кнопки панелі навігації - Приховати або змінити кнопки на панелі навігації - - Приховати \"Головна\" - Кнопку \"Головна\" приховано на панелі навігації - Кнопка \"Головна\" показується на панелі навігації - - Приховати \"Shorts\" - Кнопку \"Shorts\" приховано на панелі навігації - Кнопка \"Shorts\" показується на панелі навігації - - Приховати \"Створити\" - Кнопку \"Створити\" приховано на панелі навігації - Кнопка \"Створити\" показується на панелі навігації - - Приховати \"Підписки\" - Кнопку \"Підписки\" приховано на панелі навігації - Кнопка \"Підписки\" показується на панелі навігації - Приховати \"Сповіщення\" - Кнопку \"Сповіщення\" приховано на панелі навігації - Кнопка \"Сповіщення\" показується на панелі навігації - - Замінити \"Створити\" на \"Сповіщення\" - "Кнопку \"Створити\" замінено кнопкою \"Сповіщення\" + Приховати \"Запитати\" + Кнопку \"Запитати\" приховано + Кнопка \"Запитати\" показується + + Приховати \"Створити кліп\" + Кнопку \"Створити кліп\" приховано + Кнопка \"Створити кліп\" показується + + Приховати \"Покупки\" + Кнопку \"Покупки\" приховано + Кнопка \"Покупки\" показується + + Приховати \"Зберегти\" + Кнопку \"Зберегти\" приховано + Кнопка \"Зберегти\" показується + + + Кнопки панелі навігації + Приховати або змінити кнопки на панелі навігації + + Приховати \"Головна\" + Кнопку \"Головна\" приховано на панелі навігації + Кнопка \"Головна\" показується на панелі навігації + + Приховати \"Shorts\" + Кнопку \"Shorts\" приховано на панелі навігації + Кнопка \"Shorts\" показується на панелі навігації + + Приховати \"Створити\" + Кнопку \"Створити\" приховано на панелі навігації + Кнопка \"Створити\" показується на панелі навігації + + Приховати \"Підписки\" + Кнопку \"Підписки\" приховано на панелі навігації + Кнопка \"Підписки\" показується на панелі навігації + Приховати \"Сповіщення\" + Кнопку \"Сповіщення\" приховано на панелі навігації + Кнопка \"Сповіщення\" показується на панелі навігації + + Замінити \"Створити\" на \"Сповіщення\" + "Кнопку \"Створити\" замінено кнопкою \"Сповіщення\" Примітка: Увімкнення цього параметру також примусово приховує відеорекламу" - Кнопку \"Створити\" не замінено кнопкою \"Сповіщення\" - "Вимкнення цього параметра також вимкне блокування реклами в Shorts. + Кнопку \"Створити\" не замінено кнопкою \"Сповіщення\" + "Вимкнення цього параметра також вимкне блокування реклами в Shorts. Якщо зміна цього параметра не діє, спробуйте перейти в режим анонімного перегляду." - Приховати підписи кнопок навігації - Підписи кнопок навігації приховано - Підписи кнопок навігації показуються - Вимкнути напівпрозорість рядка стану - Рядок стану непрозорий - Рядок стану непрозорий або напівпрозорий - На деяких пристроях увімкнення цієї функції може змінити панель навігації системи на прозору. - Вимкнути напівпрозорість світлої панелі - Панель навігації світлого режиму непрозора - Панель навігації світлого режиму непрозора або напівпрозора - Вимкнути напівпрозорість темної панелі - Панель навігації темного режиму непрозора - Панель навігації темного режиму непрозора або напівпрозора - - - Висувне меню - Приховати або показувати пункти висувного меню плеєра - - Приховати \"Субтитри\" - Пункт меню \"Субтитри\" приховано - Пункт меню \"Субтитри\" показується - - Приховати \"Додаткові налаштування\" - Пункт меню \"Додаткові налаштування\" приховано - Пункт меню \"Додаткові налаштування\" показується - - Приховати \"Таймер сну\" - Пункт меню \"Таймер сну\" приховано - Пункт меню \"Таймер сну\" показується - - Приховати \"Повторювати відео\" - Пункт меню \"Повторювати відео\" приховано - Пункт меню \"Повторювати відео\" показується - - Приховати \"Кінематографічне освітлення\" - Пункт меню \"Кінематографічне освітлення\" приховано - Пункт меню \"Кінематографічне освітлення\" показується - Приховати \"Стабілізувати гучність\" - Пункт меню \"Стабілізувати гучність\" показується - Пункт меню \"Стабілізувати гучність\" приховано - - Приховати \"Довідка й відгуки\" - Пункт меню \"Довідка й відгуки\" приховано - Пункт меню \"Довідка й відгуки\" показується - - Приховати \"Швидкість відтворення\" - Пункт меню \"Швидкість відтворення\" приховано - Пункт меню \"Швидкість відтворення\" показується - - Приховати \"Заблокувати екран\" - Пункт меню \"Заблокувати екран\" приховано - Пункт меню \"Заблокувати екран\" приховано - - Приховати \"Слухати в YouTube Music\" - Пункт меню \"Слухати в YouTube Music\" приховано - Пункт меню \"Слухати в YouTube Music\" показується - - Приховати \"Звукова доріжка\" - Пункт меню \"Звукова доріжка\" приховано - Пункт меню \"Звукова доріжка\" показується - + Приховати \"Субтитри\" + Пункт меню \"Субтитри\" приховано + Пункт меню \"Субтитри\" показується + + Приховати \"Додаткові налаштування\" + Пункт меню \"Додаткові налаштування\" приховано + Пункт меню \"Додаткові налаштування\" показується + + Приховати \"Таймер сну\" + Пункт меню \"Таймер сну\" приховано + Пункт меню \"Таймер сну\" показується + + Приховати \"Повторювати відео\" + Пункт меню \"Повторювати відео\" приховано + Пункт меню \"Повторювати відео\" показується + + Приховати \"Кінематографічне освітлення\" + Пункт меню \"Кінематографічне освітлення\" приховано + Пункт меню \"Кінематографічне освітлення\" показується + Приховати \"Стабілізувати гучність\" + Пункт меню \"Стабілізувати гучність\" показується + Пункт меню \"Стабілізувати гучність\" приховано + + Приховати \"Довідка й відгуки\" + Пункт меню \"Довідка й відгуки\" приховано + Пункт меню \"Довідка й відгуки\" показується + + Приховати \"Швидкість відтворення\" + Пункт меню \"Швидкість відтворення\" приховано + Пункт меню \"Швидкість відтворення\" показується + + Приховати \"Заблокувати екран\" + Пункт меню \"Заблокувати екран\" приховано + Пункт меню \"Заблокувати екран\" приховано + + Приховати \"Слухати в YouTube Music\" + Пункт меню \"Слухати в YouTube Music\" приховано + Пункт меню \"Слухати в YouTube Music\" показується + + Приховати \"Звукова доріжка\" + Пункт меню \"Звукова доріжка\" приховано + Пункт меню \"Звукова доріжка\" показується + - "Пункт меню \"Звукова доріжка\" приховано + "Пункт меню \"Звукова доріжка\" приховано Для того, щоб пункт меню \"Звукова доріжка\" показувався, змініть клієнт \"Підміни відеопотоків\" на \"Android No SDK\"" - - Приховати \"Дивитись у VR\" - Пункт меню \"Дивитись у VR\" приховано - Пункт меню \"Дивитись у VR\" показується - Приховати меню якості відео - Меню якості відео приховано - Меню якості відео показується - Приховати колонтитул меню якості відео - Нижній колонтитул меню якості відео приховано - Нижній колонтитул меню якості відео показується - - - Приховати кнопку \"Автовідтворення\" - Кнопку \"Автовідтворення\" у відеоплеєрі приховано - Кнопка \"Автовідтворення\" у відеоплеєрі показується - - Приховати кнопку \"Субтитри\" - Кнопку \"Субтитри\" у відеоплеєрі приховано - Кнопка \"Субтитри\" у відеоплеєрі показується - Приховати кнопку \"Трансляція\" - Кнопку \"Трансляція\" у відеоплеєрі приховано - Кнопка \"Трансляція\" у відеоплеєрі показується - Приховати фон кнопок керування плеєром - Фон кнопок керування плеєром приховано - Фон кнопок керування плеєром показується - Приховати кнопки Попереднє та Наступне - Кнопки попереднього та наступного відео приховано - Кнопки попереднього та наступного відео показуються - - - Приховати картки на кінцевому екрані - Картки на кінцевому екрані приховано - Картки на кінцевому екрані показуються - - - Вимкнути кінематографічне освітлення - Кінематографічне освітлення в повноекранному режимі вимкнено - Кінематографічне освітлення в повноекранному режимі ввімкнено - - - Приховати підказки - Підказки справа вгорі відеоплеєра приховано - Підказки справа вгорі відеоплеєра показуються - - - Вимкнути анімовані лічильники - Лічильники статичні - Лічильники анімовані - - - Приховати панель прогресу відеоплеєра - Панель прогресу у відеоплеєрі приховано - Панель прогресу у відеоплеєрі показується - - Приховати панель прогресу прев\'ю відео - Панель прогресу у прев\'ю відео приховано - Панель прогресу у прев\'ю відео показується - - - Плеєр Shorts - Приховати або показувати компоненти плеєра Shorts - - Приховати Shorts у стрічці - Приховано в домашній стрічці та пов’язаних відео - Показуються в домашній стрічці та пов’язаних відео - Приховати Shorts у пошуку - Приховано в результатах пошуку - Показуються в результатах пошуку - - Приховати Shorts у підписках - Приховано в стрічці підписок - Показуються в стрічці підписок - Приховати Shorts в історії - Приховано в історії переглядів - Показуються в історії переглядів - Приховати мітку \"Автопереклад\" - Мітку автоматичного дубляжу приховано - Мітка автоматичного дубляжу показується - Приховати \"Суперподяка\" - Кнопку \"Суперподяка\" приховано - Кнопка \"Суперподяка\" показується - Приховати \"Ефект\" - Кнопку \"Ефект\" приховано - Кнопка \"Ефект\" показується - Приховати \"Зелений екран\" - Кнопку \"Зелений екран\" приховано - Кнопка \"Зелений екран\" показується - Приховати кнопку хештегу - Кнопку хештегу приховано - Кнопка хештегу показується - - Приховати \"Підписатися +\" - Кнопку \"Підписатися +\" приховано - Кнопка \"Підписатися +\" показується - Приховати попередній перегляд наживо - Прямий попередній перегляд приховано - Прямий попередній перегляд показується - Приховати мітку місцезнаходження - Мітку місцезнаходження приховано - Мітка місцезнаходження показується - Приховати \"Нові дописи\" - Кнопку \"Нові дописи\" приховано - Кнопка \"Нові дописи\" показується - Приховати кнопки на паузі - Кнопки \"Підписки\" та \"Наживо\" на паузі приховано - Кнопки \"Підписки\" та \"Наживо\" на паузі показуються - Приховати прев\'ю коментар - Прев\'ю коментар в плеєрі приховано - Прев\'ю коментар в плеєрі показується - Приховати \"Зберегти музику\" - Кнопку \"Зберегти музику\" приховано - Кнопка \"Зберегти музику\" показується - Приховати пропозиції пошуку - Пропозиції пошуку приховано - Пропозиції пошуку показуються - Приховати кнопку магазину - Кнопку магазину приховано - Кнопка магазину показується - Приховати стікери - Стікери приховано - Стікери показуються - Приховати \"Підписатися\" - Кнопку \"Підписатися\" приховано - Кнопка \"Підписатися\" показується - Приховати позначені товари - Позначені товари приховано - Позначені товари показуються - Приховати \"Запланована прем\'єра\" - Кнопки \"Запланована прем\'єра\" та \"Незабаром прямий ефір\" приховано - Кнопки \"Запланована прем\'єра\" та \"Незабаром прямий ефір\" показуються - Приховати кнопку \"Використати цей звук\" - Кнопку \"Використати цей звук\" приховано - Кнопка \"Використати цей звук\" показується - Приховати кнопку \"Використати цей шаблон\" - Кнопку \"Використати цей шаблон\" приховано - Кнопка \"Використати цей шаблон\" показується - Приховати анімацію фонтану - Анімацію фонтану біля кнопки \"Лайк\" приховано - Анімація фонтану біля кнопки \"Лайк\" показується - Приховати \"Лайк\" - Кнопку \"Лайк\" приховано - Кнопка \"Лайк\" показується - Приховати \"Дизлайк\" - Кнопку \"Дизлайк\" приховано - Кнопка \"Дизлайк\" показується - Приховати \"Коментарі\" - Кнопку \"Коментарі\" приховано - Кнопка \"Коментарі\" показується - - Приховати \"Поділитися\" - Кнопку \"Поділитися\" приховано - Кнопка \"Поділитися\" показується - - Приховати \"Реміксувати\" - Кнопку \"Реміксувати\" приховано - Кнопка \"Реміксувати\" показується - Приховати \"Зі звуком\" - Кнопку \"Зі звуком\" приховано - Кнопка \"Зі звуком\" показується - Приховати панель інформації - Панель інформації приховано - Панель інформації показується - Приховати панель каналу - Панель каналу приховано - Панель каналу показується - Приховати назву відео - Назву відео приховано - Назва відео показується - Приховати мітку метаданих звуку - Мітку метаданих звуку приховано - Мітка метаданих звуку показується - Приховати мітку посилання відео - Мітку посилання на відео приховано - Мітка посилання на відео показується - Приховати панель навігації - Панель навігації приховано - Панель навігації показується - - - Приховати пропоноване відео на кінцевому екрані - "Пропоноване відео на кінцевому екрані приховано, коли автоматичне відтворення вимкнено. + + Приховати \"Дивитись у VR\" + Пункт меню \"Дивитись у VR\" приховано + Пункт меню \"Дивитись у VR\" показується + Приховати меню якості відео + Меню якості відео приховано + Меню якості відео показується + Приховати колонтитул меню якості відео + Нижній колонтитул меню якості відео приховано + Нижній колонтитул меню якості відео показується + + + Приховати кнопку \"Автовідтворення\" + Кнопку \"Автовідтворення\" у відеоплеєрі приховано + Кнопка \"Автовідтворення\" у відеоплеєрі показується + + Приховати кнопку \"Субтитри\" + Кнопку \"Субтитри\" у відеоплеєрі приховано + Кнопка \"Субтитри\" у відеоплеєрі показується + Приховати кнопку \"Трансляція\" + Кнопку \"Трансляція\" у відеоплеєрі приховано + Кнопка \"Трансляція\" у відеоплеєрі показується + Приховати фон кнопок керування плеєром + Фон кнопок керування плеєром приховано + Фон кнопок керування плеєром показується + Приховати кнопки Попереднє та Наступне + Кнопки попереднього та наступного відео приховано + Кнопки попереднього та наступного відео показуються + + + Приховати картки на кінцевому екрані + Картки на кінцевому екрані приховано + Картки на кінцевому екрані показуються + + + Вимкнути кінематографічне освітлення + Кінематографічне освітлення в повноекранному режимі вимкнено + Кінематографічне освітлення в повноекранному режимі ввімкнено + + + Приховати підказки + Підказки справа вгорі відеоплеєра приховано + Підказки справа вгорі відеоплеєра показуються + + + Вимкнути анімовані лічильники + Лічильники статичні + Лічильники анімовані + + + Приховати панель прогресу відеоплеєра + Панель прогресу у відеоплеєрі приховано + Панель прогресу у відеоплеєрі показується + + Приховати панель прогресу прев\'ю відео + Панель прогресу у прев\'ю відео приховано + Панель прогресу у прев\'ю відео показується + + + Плеєр Shorts + Приховати або показувати компоненти плеєра Shorts + + Приховати Shorts у стрічці + Приховано в домашній стрічці та пов’язаних відео + Показуються в домашній стрічці та пов’язаних відео + Приховати Shorts у пошуку + Приховано в результатах пошуку + Показуються в результатах пошуку + + Приховати Shorts у підписках + Приховано в стрічці підписок + Показуються в стрічці підписок + Приховати Shorts в історії + Приховано в історії переглядів + Показуються в історії переглядів + Приховати мітку \"Автопереклад\" + Мітку автоматичного дубляжу приховано + Мітка автоматичного дубляжу показується + Приховати \"Суперподяка\" + Кнопку \"Суперподяка\" приховано + Кнопка \"Суперподяка\" показується + Приховати \"Ефект\" + Кнопку \"Ефект\" приховано + Кнопка \"Ефект\" показується + Приховати \"Зелений екран\" + Кнопку \"Зелений екран\" приховано + Кнопка \"Зелений екран\" показується + Приховати кнопку хештегу + Кнопку хештегу приховано + Кнопка хештегу показується + + Приховати \"Підписатися +\" + Кнопку \"Підписатися +\" приховано + Кнопка \"Підписатися +\" показується + Приховати попередній перегляд наживо + Прямий попередній перегляд приховано + Прямий попередній перегляд показується + Приховати мітку місцезнаходження + Мітку місцезнаходження приховано + Мітка місцезнаходження показується + Приховати \"Нові дописи\" + Кнопку \"Нові дописи\" приховано + Кнопка \"Нові дописи\" показується + Приховати кнопки на паузі + Кнопки \"Підписки\" та \"Наживо\" на паузі приховано + Кнопки \"Підписки\" та \"Наживо\" на паузі показуються + Приховати прев\'ю коментар + Прев\'ю коментар в плеєрі приховано + Прев\'ю коментар в плеєрі показується + Приховати \"Зберегти музику\" + Кнопку \"Зберегти музику\" приховано + Кнопка \"Зберегти музику\" показується + Приховати пропозиції пошуку + Пропозиції пошуку приховано + Пропозиції пошуку показуються + Приховати кнопку магазину + Кнопку магазину приховано + Кнопка магазину показується + Приховати стікери + Стікери приховано + Стікери показуються + Приховати \"Підписатися\" + Кнопку \"Підписатися\" приховано + Кнопка \"Підписатися\" показується + Приховати позначені товари + Позначені товари приховано + Позначені товари показуються + Приховати \"Запланована прем\'єра\" + Кнопки \"Запланована прем\'єра\" та \"Незабаром прямий ефір\" приховано + Кнопки \"Запланована прем\'єра\" та \"Незабаром прямий ефір\" показуються + Приховати кнопку \"Використати цей звук\" + Кнопку \"Використати цей звук\" приховано + Кнопка \"Використати цей звук\" показується + Приховати кнопку \"Використати цей шаблон\" + Кнопку \"Використати цей шаблон\" приховано + Кнопка \"Використати цей шаблон\" показується + Приховати анімацію фонтану + Анімацію фонтану біля кнопки \"Лайк\" приховано + Анімація фонтану біля кнопки \"Лайк\" показується + Приховати \"Лайк\" + Кнопку \"Лайк\" приховано + Кнопка \"Лайк\" показується + Приховати \"Дизлайк\" + Кнопку \"Дизлайк\" приховано + Кнопка \"Дизлайк\" показується + Приховати \"Коментарі\" + Кнопку \"Коментарі\" приховано + Кнопка \"Коментарі\" показується + + Приховати \"Поділитися\" + Кнопку \"Поділитися\" приховано + Кнопка \"Поділитися\" показується + + Приховати \"Реміксувати\" + Кнопку \"Реміксувати\" приховано + Кнопка \"Реміксувати\" показується + Приховати \"Зі звуком\" + Кнопку \"Зі звуком\" приховано + Кнопка \"Зі звуком\" показується + Приховати панель інформації + Панель інформації приховано + Панель інформації показується + Приховати панель каналу + Панель каналу приховано + Панель каналу показується + Приховати назву відео + Назву відео приховано + Назва відео показується + Приховати мітку метаданих звуку + Мітку метаданих звуку приховано + Мітка метаданих звуку показується + Приховати мітку посилання відео + Мітку посилання на відео приховано + Мітка посилання на відео показується + Приховати панель навігації + Панель навігації приховано + Панель навігації показується + + + Приховати пропоноване відео на кінцевому екрані + "Пропоноване відео на кінцевому екрані приховано, коли автоматичне відтворення вимкнено. Автоматичне відтворення можна змінити в налаштуваннях YouTube: Налаштування → Відтворення → Автовідтворення наступного відео" - Пропоноване відео на кінцевому екрані показується - - - Приховати накладення пов\'язаних відео - Накладення пов’язаних відео в повноекранному режимі приховано - Накладення пов’язаних відео в повноекранному режимі показуються - - - Приховати мітку часу відео - Мітку часу відео над панеллю прогресу приховано - Мітка часу відео над панеллю прогресу показується - - - Приховати спливаючі панелі плеєра - Автоматичні спливаючі панелі плеєра приховано, такі як список відтворення чи чат - Автоматичні спливаючі панелі плеєра показуються - - - Вийти з повноекранного режиму в кінці відео - Вимкнено - Портретний - Ландшафтний - Портретний і ландшафтний - - - Відкривати відео в портретному режимі - Відео відкриваються в повноекранному портретному режимі - Відео не відкриваються в повноекранному портретному режимі - - - Затемнення плеєра при натисканні - Значення затемнення при натисканні на плеєр в межах від 0 до 100, де 0 це прозоро - Значення затемнення плеєра має бути в межах від 0 до 100 - - - - Дизлайки тимчасово недоступні (тайм-аут API) - Дизлайки недоступні (статус %d) - Дизлайки недоступні (ліміт клієнтів API) - Дизлайки недоступні (%s) - - Оновіть відео, щоб проголосувати за допомогою Return YouTube Dislike - - Приховано власником - Дизлайки показуються - Дизлайки не показуються - Показувати дизлайки в Shorts - "Дизлайки в Shorts показуються + Пропоноване відео на кінцевому екрані показується + + + Приховати накладення пов\'язаних відео + Накладення пов’язаних відео в повноекранному режимі приховано + Накладення пов’язаних відео в повноекранному режимі показуються + + + Приховати мітку часу відео + Мітку часу відео над панеллю прогресу приховано + Мітка часу відео над панеллю прогресу показується + + + Приховати спливаючі панелі плеєра + Автоматичні спливаючі панелі плеєра приховано, такі як список відтворення чи чат + Автоматичні спливаючі панелі плеєра показуються + + + Вийти з повноекранного режиму в кінці відео + Вимкнено + Портретний + Ландшафтний + Портретний і ландшафтний + + + Відкривати відео в портретному режимі + Відео відкриваються в повноекранному портретному режимі + Відео не відкриваються в повноекранному портретному режимі + + + Затемнення плеєра при натисканні + Значення затемнення при натисканні на плеєр в межах від 0 до 100, де 0 це прозоро + Значення затемнення плеєра має бути в межах від 0 до 100 + + + + Дизлайки тимчасово недоступні (тайм-аут API) + Дизлайки недоступні (статус %d) + Дизлайки недоступні (ліміт клієнтів API) + Дизлайки недоступні (%s) + + Оновіть відео, щоб проголосувати за допомогою Return YouTube Dislike + + Приховано власником + Дизлайки показуються + Дизлайки не показуються + Показувати дизлайки в Shorts + "Дизлайки в Shorts показуються Обмеження: Дизлайки не можуть показуватися в анонімному режимі" - Дизлайки в Shorts не показуються - Дизлайки у відсотках - Дизлайки показуються у відсотках - Дизлайки показуються як число - - Компактна кнопка \"Лайк\" - Кнопку \"Лайк\" стилізовано під мінімальну ширину - Кнопку \"Лайк\" стилізовано для кращого вигляду - Показувати приблизну кількість лайків - Для відео з вимкненими лайками показується приблизна кількість лайків - Приблизна кількість лайків не показується - Показувати тост, якщо API не доступний - Тост показується, якщо Return YouTube Dislike не доступний - Тост не показується, якщо Return YouTube Dislike не доступний - Дані надаються через API Return YouTube Dislike. Натисніть тут, щоб дізнатися більше - - Статистика API ReturnYouTubeDislike цього пристрою - Час відповіді API, середній - Час відповіді API, мінімальний - Час відповіді API, максимальний - Час відповіді API, останнє відео - Дизлайки тимчасово недоступні - діє обмеження швидкості для клієнта API - Отримання голосів API, кількість запитів - Мережевих запитів не здійснено - Здійснено %d мережевих запитів - Отримання голосів API, кількість тайм-аутів - Тайм-аутів під час мережевих запитів не виявлено - Виявлено %d тайм-аутів під час мережевих запитів - Обмеження швидкості клієнта API - Обмеження швидкості клієнта не виявлено - Обмеження швидкості клієнта виявлено %d разів - %d мілісекунд - - - Широка панель пошуку - Широку панель пошуку ввімкнено\n\nПримітка: Це також приховує значок YouTube та кнопку пошуку - Широку панель пошуку вимкнено - - - Увімкнути мініатюри високої якості - Мініатюри панелі прогресу під час перемотування мають високу якість - Мініатюри панелі прогресу під час перемотування мають середню якість - "Це також відновить мініатюри в прямих трансляціях, які не мають мініатюр при перемотуванні. + Дизлайки в Shorts не показуються + Дизлайки у відсотках + Дизлайки показуються у відсотках + Дизлайки показуються як число + + Компактна кнопка \"Лайк\" + Кнопку \"Лайк\" стилізовано під мінімальну ширину + Кнопку \"Лайк\" стилізовано для кращого вигляду + Показувати приблизну кількість лайків + Для відео з вимкненими лайками показується приблизна кількість лайків + Приблизна кількість лайків не показується + Показувати тост, якщо API не доступний + Тост показується, якщо Return YouTube Dislike не доступний + Тост не показується, якщо Return YouTube Dislike не доступний + Дані надаються через API Return YouTube Dislike. Натисніть тут, щоб дізнатися більше + + Статистика API ReturnYouTubeDislike цього пристрою + Час відповіді API, середній + Час відповіді API, мінімальний + Час відповіді API, максимальний + Час відповіді API, останнє відео + Дизлайки тимчасово недоступні - діє обмеження швидкості для клієнта API + Отримання голосів API, кількість запитів + Мережевих запитів не здійснено + Здійснено %d мережевих запитів + Отримання голосів API, кількість тайм-аутів + Тайм-аутів під час мережевих запитів не виявлено + Виявлено %d тайм-аутів під час мережевих запитів + Обмеження швидкості клієнта API + Обмеження швидкості клієнта не виявлено + Обмеження швидкості клієнта виявлено %d разів + %d мілісекунд + + + Широка панель пошуку + Широку панель пошуку ввімкнено\n\nПримітка: Це також приховує значок YouTube та кнопку пошуку + Широку панель пошуку вимкнено + + + Увімкнути мініатюри високої якості + Мініатюри панелі прогресу під час перемотування мають високу якість + Мініатюри панелі прогресу під час перемотування мають середню якість + "Це також відновить мініатюри в прямих трансляціях, які не мають мініатюр при перемотуванні. Мініатюри при перемотуванні матимуть ту саму якість, що й поточне відео. Ця функція найкраще працює з якістю відео 720p або нижчою та при використанні дуже швидкого підключення до Інтернету." - Відновити старі мініатюри - Мініатюри під час перемотування показуються у мінівікні над панеллю прогресу - Мініатюри під час перемотування показуються в повноекранному режимі - - - Увімкнути SponsorBlock - SponsorBlock - це краудсорсингова система для пропускання дратівливих частин відео на YouTube - Налаштувати зовнішній вигляд - Показувати кнопку голосування - Кнопка голосування за сегмент показується в відеоплеєрі - Кнопка голосування за сегмент не показується в відеоплеєрі - Використовувати квадратний макет - Кнопки та елементи керування квадратні - Кнопки та елементи керування заокруглені - - Компактна кнопка пропуску - Кнопку пропуску стилізовано під мінімальну ширину - Кнопку пропуску стилізовано для кращого вигляду - Приховувати кнопку пропуску - Кнопка пропуску автоматично приховується після декількох секунд - Кнопка пропуску показується для всього сегменту - Тривалість кнопки пропуску - Як довго показувати кнопки пропуску та переходу до основного моменту до автоматичного приховування - Показувати тост скасування пропуску - Тост показується, коли сегмент автоматично пропускається. Натисніть на нього, щоб скасувати пропуск - Тост не показується - Тривалість тосту пропуску - Як довго показувати тост скасування пропуску - 1 секунда - 2 секунди - 3 секунди - 4 секунди - 5 секунд - 6 секунд - 7 секунд - 8 секунд - 9 секунд - 10 секунд - Показувати тривалість відео без сегментів - Показується тривалість відео без урахування всіх сегментів, які присутні на панелі прогресу - Показується повна тривалість відео - Створення нових сегментів - Показувати кнопку створення нового сегмента - Кнопка створення нового сегменту показується в відеоплеєрі - Кнопка створення нового сегменту не показується в відеоплеєрі - Відрегулювати крок нового сегмента - Кількість мілісекунд, на яку переміщують кнопки регулювання часу при створенні нових сегментів - Значення має бути додатним числом - Переглянути інструкцію - Інструкція містить правила та поради щодо створення нових сегментів - Дотримуйтесь інструкцій - Перед створенням нових сегментів прочитайте інструкції SponsorBlock - Вже прочитано - Показати - Загальні налаштування - Показувати тост, якщо API не доступний - Тост показується, якщо SponsorBlock не доступний - Тост не показується, якщо SponsorBlock не доступний - Відстеження кількості пропусків - Дозволяє таблиці лідерів SponsorBlock дізнатися, скільки часу заощаджено. Повідомлення надсилається в таблицю лідерів щоразу, коли сегмент пропущено - Відстеження кількості пропусків вимкнено - Мінімальна тривалість сегменту - Сегменти, коротші за це значення (в секундах), не будуть показані або пропущені - Неприпустима тривалість - Ваш особистий ID користувача - Це повинно залишатися конфіденційним. Це як пароль, і його не можна нікому передавати. Якщо хтось отримає його, він зможе видавати себе за Вас - Особистий id користувача повинен мати довжину не менше 30 символів - Змінити адресу API - URL-адреса, яку SponsorBlock використовує для звернень до сервера - Адресу API скинуто - Адреса API недійсна - Адресу API змінено - Імпорт / Експорт налаштувань - Копіювати - Ваші налаштування SponsorBlock, які можуть бути імпортовані чи експортовані у ReVanced та до інших платформ SponsorBlock - Ваші налаштування SponsorBlock, які можуть бути імпортовані чи експортовані у ReVanced та до інших платформ SponsorBlock. Вони також містять Ваш особистий ідентифікатор користувача. Діліться ними розумно - Налаштування успішно імпортовано - Не вдалося імпортувати: %s - Не вдалося експортувати: %s - "Ваші налаштування містять особистий ідентифікатор користувача SponsorBlock. + Відновити старі мініатюри + Мініатюри під час перемотування показуються у мінівікні над панеллю прогресу + Мініатюри під час перемотування показуються в повноекранному режимі + + + Увімкнути SponsorBlock + SponsorBlock - це краудсорсингова система для пропускання дратівливих частин відео на YouTube + Налаштувати зовнішній вигляд + Показувати кнопку голосування + Кнопка голосування за сегмент показується в відеоплеєрі + Кнопка голосування за сегмент не показується в відеоплеєрі + Використовувати квадратний макет + Кнопки та елементи керування квадратні + Кнопки та елементи керування заокруглені + + Компактна кнопка пропуску + Кнопку пропуску стилізовано під мінімальну ширину + Кнопку пропуску стилізовано для кращого вигляду + Приховувати кнопку пропуску + Кнопка пропуску автоматично приховується після декількох секунд + Кнопка пропуску показується для всього сегменту + Тривалість кнопки пропуску + Як довго показувати кнопки пропуску та переходу до основного моменту до автоматичного приховування + Показувати тост скасування пропуску + Тост показується, коли сегмент автоматично пропускається. Натисніть на нього, щоб скасувати пропуск + Тост не показується + Тривалість тосту пропуску + Як довго показувати тост скасування пропуску + 1 секунда + 2 секунди + 3 секунди + 4 секунди + 5 секунд + 6 секунд + 7 секунд + 8 секунд + 9 секунд + 10 секунд + Показувати тривалість відео без сегментів + Показується тривалість відео без урахування всіх сегментів, які присутні на панелі прогресу + Показується повна тривалість відео + Створення нових сегментів + Показувати кнопку створення нового сегмента + Кнопка створення нового сегменту показується в відеоплеєрі + Кнопка створення нового сегменту не показується в відеоплеєрі + Відрегулювати крок нового сегмента + Кількість мілісекунд, на яку переміщують кнопки регулювання часу при створенні нових сегментів + Значення має бути додатним числом + Переглянути інструкцію + Інструкція містить правила та поради щодо створення нових сегментів + Дотримуйтесь інструкцій + Перед створенням нових сегментів прочитайте інструкції SponsorBlock + Вже прочитано + Показати + Загальні налаштування + Показувати тост, якщо API не доступний + Тост показується, якщо SponsorBlock не доступний + Тост не показується, якщо SponsorBlock не доступний + Відстеження кількості пропусків + Дозволяє таблиці лідерів SponsorBlock дізнатися, скільки часу заощаджено. Повідомлення надсилається в таблицю лідерів щоразу, коли сегмент пропущено + Відстеження кількості пропусків вимкнено + Мінімальна тривалість сегменту + Сегменти, коротші за це значення (в секундах), не будуть показані або пропущені + Неприпустима тривалість + Ваш особистий ID користувача + Це повинно залишатися конфіденційним. Це як пароль, і його не можна нікому передавати. Якщо хтось отримає його, він зможе видавати себе за Вас + Особистий id користувача повинен мати довжину не менше 30 символів + Змінити адресу API + URL-адреса, яку SponsorBlock використовує для звернень до сервера + Адресу API скинуто + Адреса API недійсна + Адресу API змінено + Імпорт / Експорт налаштувань + Копіювати + Ваші налаштування SponsorBlock, які можуть бути імпортовані чи експортовані у ReVanced та до інших платформ SponsorBlock + Ваші налаштування SponsorBlock, які можуть бути імпортовані чи експортовані у ReVanced та до інших платформ SponsorBlock. Вони також містять Ваш особистий ідентифікатор користувача. Діліться ними розумно + Налаштування успішно імпортовано + Не вдалося імпортувати: %s + Не вдалося експортувати: %s + "Ваші налаштування містять особистий ідентифікатор користувача SponsorBlock. Ваш ідентифікатор користувача це як пароль і його не можна поширювати." - Більше не показувати - Змінити поведінку сегмента - Спонсор - Рекламні інтеграції, реферальні посилання і пряма реклама. Не для самореклами або рекомендацій різних подій/творців/сайтів/продуктів, які подобаються автору відео - Самореклама / Рекомендація - Схоже на \"Спонсор\", але для безплатної реклами та самореклами. Включає сегменти про товари, пожертвування або інформацію про тих, разом з ким було зроблено відео - Нагадування про взаємодію (Підписка) - Коротке нагадування про вподобання, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама - Основний момент - Частина відео, яку шукає більшість людей - Пауза / Заставка - Частина відео без значущого контенту. Може бути паузою, статичним кадром або повторюваною анімацією. Не включає переходи, що містять інформацію - Кінцеві заставки / Титри - Титри або час появи кінцевих заставок YouTube. Не для підбивання підсумків сказаного у відео - Зачіпка / Вітання - Озвучені трейлери до майбутнього відео, привітання та прощання. Не включає сегменти, які додають додатковий вміст - Попередній перегляд / Підсумок - Колекція кліпів, які показують, що відбувається або що сталося у відео чи в інших відео в серії, де вся інформація повторюється пізніше у відео - Дотичні теми / Жарти - Дотичні сцени або жарти, які не потрібні для розуміння основного змісту відео. Не включає сегменти, що надають контекст або передісторію - Музика: Сегмент без музики - Тільки для використання в музичних відео. Сегменти музичних відео без музики, які не належать до іншої категорії - Пропустити - Основний момент - Пропустити спонсор - Пропустити саморекламу - Пропустити взаємодію - Перейти до основного - Пропустити вступ - Пропустити паузу - Пропустити паузу - Пропустити закінчення - Пропустити зачіпку - Пропустити прев\'ю - Пропустити прев\'ю - Пропустити підсумок - Пропустити дотичне - Пропустити без музики - Пропустити сегмент - Пропущено спонсорську вставку - Пропущено саморекламу - Пропущено дратівливе нагадування - Пропущено до основного моменту - Пропущено вступ - Пропущено паузу - Пропущено паузу - Пропущено закінчення - Пропущено зачіпку - Пропущено попередній перегляд - Пропущено попередній перегляд - Пропущено підсумок - Пропущено дотичну тему - Пропущено сегмент без музики - Пропущено не надісланий сегмент - Пропущено декілька сегментів - Пропустити автоматично - Пропустити один раз - Показувати кнопку пропуску - Показувати в панелі прогресу - Вимкнути - Неможливо відправити сегмент: %s - SponsorBlock тимчасово не працює - Не вдалося надіслати сегмент (статус: %1$d %2$s) - Неможливо відправити сегмент. Частота обмежена (занадто багато від одного користувача або IP) - Неможливо відправити сегмент: %s - "Неможливо надіслати сегмент. + Більше не показувати + Змінити поведінку сегмента + Спонсор + Рекламні інтеграції, реферальні посилання і пряма реклама. Не для самореклами або рекомендацій різних подій/творців/сайтів/продуктів, які подобаються автору відео + Самореклама / Рекомендація + Схоже на \"Спонсор\", але для безплатної реклами та самореклами. Включає сегменти про товари, пожертвування або інформацію про тих, разом з ким було зроблено відео + Нагадування про взаємодію (Підписка) + Коротке нагадування про вподобання, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама + Основний момент + Частина відео, яку шукає більшість людей + Пауза / Заставка + Частина відео без значущого контенту. Може бути паузою, статичним кадром або повторюваною анімацією. Не включає переходи, що містять інформацію + Кінцеві заставки / Титри + Титри або час появи кінцевих заставок YouTube. Не для підбивання підсумків сказаного у відео + Зачіпка / Вітання + Озвучені трейлери до майбутнього відео, привітання та прощання. Не включає сегменти, які додають додатковий вміст + Попередній перегляд / Підсумок + Колекція кліпів, які показують, що відбувається або що сталося у відео чи в інших відео в серії, де вся інформація повторюється пізніше у відео + Дотичні теми / Жарти + Дотичні сцени або жарти, які не потрібні для розуміння основного змісту відео. Не включає сегменти, що надають контекст або передісторію + Музика: Сегмент без музики + Тільки для використання в музичних відео. Сегменти музичних відео без музики, які не належать до іншої категорії + Пропустити + Основний момент + Пропустити спонсор + Пропустити саморекламу + Пропустити взаємодію + Перейти до основного + Пропустити вступ + Пропустити паузу + Пропустити паузу + Пропустити закінчення + Пропустити зачіпку + Пропустити прев\'ю + Пропустити прев\'ю + Пропустити підсумок + Пропустити дотичне + Пропустити без музики + Пропустити сегмент + Пропущено спонсорську вставку + Пропущено саморекламу + Пропущено дратівливе нагадування + Пропущено до основного моменту + Пропущено вступ + Пропущено паузу + Пропущено паузу + Пропущено закінчення + Пропущено зачіпку + Пропущено попередній перегляд + Пропущено попередній перегляд + Пропущено підсумок + Пропущено дотичну тему + Пропущено сегмент без музики + Пропущено не надісланий сегмент + Пропущено декілька сегментів + Пропустити автоматично + Пропустити один раз + Показувати кнопку пропуску + Показувати в панелі прогресу + Вимкнути + Неможливо відправити сегмент: %s + SponsorBlock тимчасово не працює + Не вдалося надіслати сегмент (статус: %1$d %2$s) + Неможливо відправити сегмент. Частота обмежена (занадто багато від одного користувача або IP) + Неможливо відправити сегмент: %s + "Неможливо надіслати сегмент. Він вже існує" - Сегмент успішно надіслано - - SponsorBlock тимчасово недоступний (тайм-аут API) - SponsorBlock тимчасово недоступний (статус %d) - SponsorBlock тимчасово не доступний - Не вдалося проголосувати за сегмент (тайм-аут API) - Не вдалося проголосувати за сегмент (статус: %1$d %2$s) - Не вдалося проголосувати за сегмент: %s - Проголосувати \"за\" - Проголосувати \"проти\" - Змінити категорію - Немає сегментів для голосування - - %1$s до %2$s - Вибрати категорію сегмента - Категорія вимкнена у налаштуваннях. Увімкніть категорію, щоб надіслати. - Новий сегмент SponsorBlock - Встановити %s як початок чи кінець нового сегмента? - Початок - Кінець - Зараз - Час сегменту починається з - Час сегменту закінчується на - Час початку і кінця сегмента правильні? - "Час сегменту з + Сегмент успішно надіслано + + SponsorBlock тимчасово недоступний (тайм-аут API) + SponsorBlock тимчасово недоступний (статус %d) + SponsorBlock тимчасово не доступний + Не вдалося проголосувати за сегмент (тайм-аут API) + Не вдалося проголосувати за сегмент (статус: %1$d %2$s) + Не вдалося проголосувати за сегмент: %s + Проголосувати \"за\" + Проголосувати \"проти\" + Змінити категорію + Немає сегментів для голосування + + %1$s до %2$s + Вибрати категорію сегмента + Категорія вимкнена у налаштуваннях. Увімкніть категорію, щоб надіслати. + Новий сегмент SponsorBlock + Встановити %s як початок чи кінець нового сегмента? + Початок + Кінець + Зараз + Час сегменту починається з + Час сегменту закінчується на + Час початку і кінця сегмента правильні? + "Час сегменту з %1$s до @@ -1280,46 +1279,46 @@ Second \"item\" text" (%3$s) Готові відправити?" - Початок має бути перед кінцем - Спочатку позначте дві позиції на панелі часу - Попередній перегляд сегменту для забезпечення плавного пропуску - Редагувати час сегмента вручну - Ви хочете змінити час початку чи кінця сегмента? - Вказано неправильний час - Статистика - - Статистика тимчасово недоступна (API не працює) - Завантаження... - SponsorBlock вимкнено - Ваше ім\'я користувача: <b>%s</b> - Натисніть тут, щоб змінити ім\'я користувача - Не вдалося змінити ім\'я користувача: Статус: %1$d %2$s - Ім\'я користувача успішно змінено - Ваша репутація - <b>%.2f</b> - Ви створили <b>%s</b> сегменти(ів) - Натисніть тут для перегляду Ваших сегментів - Таблиця лідерів SponsorBlock - Ви врятували людей від <b>%s</b> сегментів - Натисніть тут, щоб побачити глобальну статистику та найкращих учасників - Це <b>%s</b> за весь час. <br> Натисніть тут, щоб побачити лідерську таблицю. - Ви пропустили <b>%s</b> сегменти(ів) - Це <b>%s</b> - Скинути лічильник пропущених сегментів? - %1$s годин(и) %2$s хвилин(и) - %1$s хвилин(и) %2$s секунд(и) - %s секунд(и) - Непрозорість: - Колір: - Про інтеграцію - Дані надаються через API SponsorBlock. Натисніть тут, щоб дізнатися більше та побачити завантаження для інших платформ - - - Макет інтерфейсу - За замовчуванням - Телефонний - Планшетний - Автомобільний - "Зміни включають: + Початок має бути перед кінцем + Спочатку позначте дві позиції на панелі часу + Попередній перегляд сегменту для забезпечення плавного пропуску + Редагувати час сегмента вручну + Ви хочете змінити час початку чи кінця сегмента? + Вказано неправильний час + Статистика + + Статистика тимчасово недоступна (API не працює) + Завантаження... + SponsorBlock вимкнено + Ваше ім\'я користувача: <b>%s</b> + Натисніть тут, щоб змінити ім\'я користувача + Не вдалося змінити ім\'я користувача: Статус: %1$d %2$s + Ім\'я користувача успішно змінено + Ваша репутація - <b>%.2f</b> + Ви створили <b>%s</b> сегменти(ів) + Натисніть тут для перегляду Ваших сегментів + Таблиця лідерів SponsorBlock + Ви врятували людей від <b>%s</b> сегментів + Натисніть тут, щоб побачити глобальну статистику та найкращих учасників + Це <b>%s</b> за весь час. <br> Натисніть тут, щоб побачити лідерську таблицю. + Ви пропустили <b>%s</b> сегменти(ів) + Це <b>%s</b> + Скинути лічильник пропущених сегментів? + %1$s годин(и) %2$s хвилин(и) + %1$s хвилин(и) %2$s секунд(и) + %s секунд(и) + Непрозорість: + Колір: + Про інтеграцію + Дані надаються через API SponsorBlock. Натисніть тут, щоб дізнатися більше та побачити завантаження для інших платформ + + + Макет інтерфейсу + За замовчуванням + Телефонний + Планшетний + Автомобільний + "Зміни включають: Планшетний макет • Публікації спільноти приховані @@ -1327,314 +1326,312 @@ Second \"item\" text" Автомобільний макет • Shorts відкриваються у звичайному плеєрі • Стрічка впорядкована за темами та каналами" - - - Підміна версії застосунку - Версію підмінено - Версію не підмінено - "Версія застосунку буде підмінена на старішу версію YouTube. + + + Підміна версії застосунку + Версію підмінено + Версію не підмінено + "Версія застосунку буде підмінена на старішу версію YouTube. Це змінить вигляд і функції застосунку, але можуть виникнути невідомі побічні ефекти. Якщо пізніше вимкнути цю опцію, рекомендується очистити дані застосунку, щоб уникнути помилок інтерфейсу." - Підмінити версію застосунку на - 20.13.41 - Відновити розгорнуту панель дій відео - 20.05.46 - Відновити функціональність транскрипції - 19.35.36 - Відновити старі іконки плеєра Shorts - 19.01.34 - Відновити старі іконки панелі навігації - - - Змінити початкову сторінку - За замовчуванням - Усі підписки - Перегляд каналів - Навчання - Що нового - Мода та краса - Ігри - Історія - Вкладка \"Ви\" - Відео, які сподобалися - Прямі трансляції - Фільми - Музика - Новини - Сповіщення - Списки відтворення - Пошук на YouTube - Покупки - Спорт - Підписки - Популярне - Віртуальна реальність - Переглянути пізніше - Ваші кліпи - Завжди змінювати початкову сторінку - "Початкова сторінка завжди змінюється + Підмінити версію застосунку на + 20.13.41 - Відновити розгорнуту панель дій відео + 20.05.46 - Відновити функціональність транскрипції + 19.35.36 - Відновити старі іконки плеєра Shorts + 19.01.34 - Відновити старі іконки панелі навігації + + + Змінити початкову сторінку + За замовчуванням + Усі підписки + Перегляд каналів + Навчання + Що нового + Мода та краса + Ігри + Історія + Вкладка \"Ви\" + Відео, які сподобалися + Прямі трансляції + Фільми + Музика + Новини + Сповіщення + Списки відтворення + Пошук на YouTube + Покупки + Спорт + Підписки + Популярне + Віртуальна реальність + Переглянути пізніше + Ваші кліпи + Завжди змінювати початкову сторінку + "Початкова сторінка завжди змінюється Обмеження: Використання кнопки \"Назад\" на панелі інструментів може не працювати" - Початкова сторінка змінюється лише під час запуску програми - - - Вимкнути відновлення плеєра Shorts - Плеєр Shorts не відновиться після запуску застосунку - Плеєр Shorts відновиться після запуску застосунку - - - Відкривати Shorts через - Плеєр Shorts - Звичайний плеєр - Звичайний плеєр на весь екран - - - Автовідтворення Shorts - Shorts будуть автоматично відтворюватися одне за одним - Shorts будуть повторюватися - Автовідтворення Shorts у фоні - Shorts будуть автоматично відтворюватися одне за одним у фоновому режимі - Shorts будуть повторюватися у фоновому режимі - - - Мініплеєр - Змінити стиль згорнутого мініплеєра у застосунку - Тип мініплеєра - Вимкнено - Стандартний - Мінімальний - Планшетний - Новітній 1 - Новітній 2 - Новітній 3 - Новітній 4 - Вимкнути закруглені кути - Кути квадратні - Кути закруглені - Подвійне натискання та зміна розміру щипком - "Подвійне натискання та зміну розміру щипком увімкнено + Початкова сторінка змінюється лише під час запуску програми + + + Вимкнути відновлення плеєра Shorts + Плеєр Shorts не відновиться після запуску застосунку + Плеєр Shorts відновиться після запуску застосунку + + + Відкривати Shorts через + Плеєр Shorts + Звичайний плеєр + Звичайний плеєр на весь екран + + + Автовідтворення Shorts + Shorts будуть автоматично відтворюватися одне за одним + Shorts будуть повторюватися + Автовідтворення Shorts у фоні + Shorts будуть автоматично відтворюватися одне за одним у фоновому режимі + Shorts будуть повторюватися у фоновому режимі + + + Мініплеєр + Змінити стиль згорнутого мініплеєра у застосунку + Тип мініплеєра + Вимкнено + Стандартний + Мінімальний + Планшетний + Новітній 1 + Новітній 2 + Новітній 3 + Новітній 4 + Вимкнути закруглені кути + Кути квадратні + Кути закруглені + Подвійне натискання та зміна розміру щипком + "Подвійне натискання та зміну розміру щипком увімкнено • Двічі торкніться, щоб збільшити розмір мініплеєра • Двічі торкніться ще раз, щоб відновити початковий розмір" - Подвійне натискання та зміну розміру щипком вимкнено - Вимкнути перетягування - Перетягування вимкнено - "Перетягування увімкнено + Подвійне натискання та зміну розміру щипком вимкнено + Вимкнути перетягування + Перетягування вимкнено + "Перетягування увімкнено Мініплеєр можна перетягнути в будь-який кут екрану" - Вимкнути жест горизонтального перетягування - Жест горизонтального перетягування вимкнено - "Жест горизонтального перетягування увімкнено + Вимкнути жест горизонтального перетягування + Жест горизонтального перетягування вимкнено + "Жест горизонтального перетягування увімкнено Мініплеєр можна перетягнути за межі екрана вліво або вправо" - Приховати кнопки накладання - Кнопки накладання приховано - Кнопки накладання показуються - Приховати підтексти - Підтексти в мініплеєрі приховано - Підтексти в мініплеєрі показуються - Приховати кнопки перемотування - Кнопки перемотування вперед та назад в мініплеєрі приховано - Кнопки перемотування вперед та назад в мініплеєрі показуються - Початковий розмір - Початковий розмір мініплеєра на екрані, в пікселях - Розмір у пікселях повинен бути від %1$s до %2$s - Затемнення мініплеєра - Значення затемнення при натисканні на мініплеєр в межах від 0 до 100, де 0 це прозоро - Значення затемнення мініплеєра має бути від 0 до 100 - - - Увімкнути градієнт завантаження - Екран завантаження макета матиме градієнтне тло - Екран завантаження макета матиме суцільне тло - Стиль заставки - Кольорова - Чорно-біла - Увімкнути користувацький колір - Показується користувацький колір смуги прогресу - Показується оригінальний колір смуги прогресу - Користувацький колір смуги - Значення кольору смуги прогресу - Користувацький вторинний колір смуги - Значення вторинного кольору смуги прогресу - Недійсне значення кольору смуги прогресу - - - - - Логотип заголовка - Стандартний - Звичайний - - ReVanced мінімальний - Користувацький - - - Змінити хост зображень - Використовується хост зображень yt4.ggpht.com - "Використовується оригінальний хост зображень + Приховати кнопки накладання + Кнопки накладання приховано + Кнопки накладання показуються + Приховати підтексти + Підтексти в мініплеєрі приховано + Підтексти в мініплеєрі показуються + Приховати кнопки перемотування + Кнопки перемотування вперед та назад в мініплеєрі приховано + Кнопки перемотування вперед та назад в мініплеєрі показуються + Початковий розмір + Початковий розмір мініплеєра на екрані, в пікселях + Розмір у пікселях повинен бути від %1$s до %2$s + Затемнення мініплеєра + Значення затемнення при натисканні на мініплеєр в межах від 0 до 100, де 0 це прозоро + Значення затемнення мініплеєра має бути від 0 до 100 + + + Увімкнути градієнт завантаження + Екран завантаження макета матиме градієнтне тло + Екран завантаження макета матиме суцільне тло + Стиль заставки + Кольорова + Чорно-біла + Увімкнути користувацький колір + Показується користувацький колір смуги прогресу + Показується оригінальний колір смуги прогресу + Користувацький колір смуги + Значення кольору смуги прогресу + Користувацький вторинний колір смуги + Значення вторинного кольору смуги прогресу + Недійсне значення кольору смуги прогресу + + + + Логотип заголовка + Стандартний + Звичайний + + ReVanced мінімальний + Користувацький + + + Змінити хост зображень + Використовується хост зображень yt4.ggpht.com + "Використовується оригінальний хост зображень Ввімкнення цього параметра може виправити відсутні зображення, які заблоковано в деяких регіонах" - - - - Вкладка \"Головна\" - - Вкладка \"Підписки\" - - Вкладка \"Ви\" - Списки відтворення та рекомендації - Результати пошуку - Оригінальні прев\'ю - DeArrow та Оригінальні прев\'ю - DeArrow та Стоп-кадри - Стоп-кадри - "DeArrow надає прев'ю для відео YouTube, які створюються користувачами. Ці прев'ю часто більш релевантні, ніж ті, що надає YouTube + + + + Вкладка \"Головна\" + + Вкладка \"Підписки\" + + Вкладка \"Ви\" + Списки відтворення та рекомендації + Результати пошуку + Оригінальні прев\'ю + DeArrow та Оригінальні прев\'ю + DeArrow та Стоп-кадри + Стоп-кадри + "DeArrow надає прев'ю для відео YouTube, які створюються користувачами. Ці прев'ю часто більш релевантні, ніж ті, що надає YouTube Якщо увімкнено, серверу API надсилатимуться лише посилання на відео, і більше жодних інших даних. Якщо відео не має прев'ю DeArrow, то відображаються оригінальні прев'ю або стоп-кадри Натисніть тут, щоб дізнатися більше про DeArrow" - Показувати тост, якщо API не доступний - Тост показується, якщо DeArrow не доступний - Тост не показується, якщо DeArrow не доступний - Кінцева точка API DeArrow - URL-адреса кінцевої точки кешу прев\'ю DeArrow - Стоп-кадри з відео - Кадри беруться з початку/середини/кінця кожного відео. Ці зображення вбудовані в YouTube і зовнішній API не використовується - Використовувати неточні кадри - Використовуються кадри середньої якості. Прев\'ю завантажуватимуться швидше, але прямі трансляції, неопубліковані або дуже старі відео можуть відображатися з порожніми прев\'ю - Використовуються кадри високої якості - Час відео з якого береться кадр - Початок відео - Середина відео - Кінець відео - - DeArrow тимчасово недоступний (код статусу: %s) - DeArrow тимчасово недоступний - - - Показувати оголошення від ReVanced - Оголошення під час запуску показуються - Оголошення під час запуску не показуються - Показувати оголошення під час запуску - Не вдалося підключитися до постачальника оголошень - Закрити - - - Увімкнути повторення відео - Відео буде повторюватися - Відео не буде повторюватися - - - Кнопка повторення відео - Кнопка показується - Кнопка не показується - Повторення відео ввімкнено - Повторення відео вимкнено - - - - - Підміняти розміри пристрою - "Розміри пристрою підмінено + Показувати тост, якщо API не доступний + Тост показується, якщо DeArrow не доступний + Тост не показується, якщо DeArrow не доступний + Кінцева точка API DeArrow + URL-адреса кінцевої точки кешу прев\'ю DeArrow + Стоп-кадри з відео + Кадри беруться з початку/середини/кінця кожного відео. Ці зображення вбудовані в YouTube і зовнішній API не використовується + Використовувати неточні кадри + Використовуються кадри середньої якості. Прев\'ю завантажуватимуться швидше, але прямі трансляції, неопубліковані або дуже старі відео можуть відображатися з порожніми прев\'ю + Використовуються кадри високої якості + Час відео з якого береться кадр + Початок відео + Середина відео + Кінець відео + + DeArrow тимчасово недоступний (код статусу: %s) + DeArrow тимчасово недоступний + + + Показувати оголошення від ReVanced + Оголошення під час запуску показуються + Оголошення під час запуску не показуються + Показувати оголошення під час запуску + Не вдалося підключитися до постачальника оголошень + Закрити + + + Увімкнути повторення відео + Відео буде повторюватися + Відео не буде повторюватися + + + Кнопка повторення відео + Кнопка показується + Кнопка не показується + Повторення відео ввімкнено + Повторення відео вимкнено + + + + Підміняти розміри пристрою + "Розміри пристрою підмінено Можуть стати доступні вищі якості відео, але можлива затримка відтворення, швидше розряджання батареї та інші невідомі побічні ефекти" - "Розміри пристрою не підмінено + "Розміри пристрою не підмінено Ввімкнення цієї опції може розблокувати вищі якості відео" - Увімкнення цієї опції може спричинити затримки відтворення відео, швидше розряджання батареї та інші невідомі побічні ефекти. - - - Тактильна віддача - Змінити тактильну віддачу - Вимкнути вібрацію між розділами - Вібрацію між розділами вимкнено - Вібрацію між розділами ввімкнено - Вимкнути вібрацію точного перемотування - Вібрацію точного перемотування вимкнено - Вібрацію точного перемотування ввімкнено - Вимкнути вібрацію скасування перемотування - Вібрацію скасування перемотування вимкнено - Вібрацію скасування перемотування ввімкнено - Вимкнути вібрацію при масштабуванні - Вібрацію при масштабуванні вимкнено - Вібрацію при масштабуванні ввімкнено - - - Якщо Ви нещодавно змінили дані для входу у свій обліковий запис, видаліть і повторно встановіть MicroG. - - - Обхід URL переадресацій - URL переадресації обходяться - URL переадресації не обходяться - - - Відкривати посилання у браузері - Посилання відкриваються у зовнішньому браузері - Посилання відкриваються у вбудованому браузері - - - - Авто - Запам\'ятовувати зміни якості відео - Зміни якості застосовуються до всіх відео - Зміни якості застосовуються лише до поточного відео - Показувати тост при зміні якості відео - Тост показується, коли змінюється стандартна якість відео - Тост не показується, коли змінюється стандартна якість відео - Стандартна якість відео у Wi-Fi мережі - Стандартна якість відео в мобільній мережі - Запам\'ятовувати зміни якості Shorts - Зміни якості застосовуються до всіх Shorts - Зміни якості застосовуються лише до поточного Short - Стандартна якість Shorts у Wi-Fi мережі - Стандартна якість Shorts у мобільній мережі - в мобільній мережі - в Wi-Fi мережі - Якість %1$s змінено на %2$s - Якість Shorts %1$s змінено на %2$s - - - Кнопка швидкості відтворення - Кнопка діалогу швидкості показується. Натисніть і утримуйте, щоб відновити стандартну швидкість відтворення - Кнопка діалогу швидкості не показується - - - Кнопка якості відео - Кнопка якості відео показується. Натисніть і утримуйте, щоб відновити стандартну якість - Кнопка якості відео не показується - - - Користувацьке меню швидкості відтворення - Користувацьке меню швидкості відтворення показується - Користувацьке меню швидкості відтворення не показується - Відновити старе меню швидкості відтворення - Показується старе меню швидкості - Показується новітнє меню швидкості - Користувацькі швидкості відтворення - Додавання або зміна користувацьких швидкостей відтворення - Користувацькі швидкості повинні бути менші ніж %s - Неправильні користувацькі швидкості відтворення - Авто - Користувацька швидкість при натисканні та утриманні - Швидкість відтворення від 0 до 8 - - - Запам\'ятовувати зміни швидкості - Зміни швидкості відтворення застосовуються до всіх відео - Зміни швидкості відтворення застосовуються лише до поточного відео - Показувати тост при зміні швидкості відтворення - Тост показується, коли змінюється стандартна швидкість відтворення - Тост не показується, коли змінюється стандартна швидкість відтворення - Стандартна швидкість відтворення - Швидкість змінена на %s - - - Вимкнути HDR відео - HDR відео вимкнено - HDR відео увімкнено - Примусове використання AVC (H.264) - Відеокодек примусово встановлено на AVC (H.264) - Відеокодек визначається автоматично - "Переваги: + Увімкнення цієї опції може спричинити затримки відтворення відео, швидше розряджання батареї та інші невідомі побічні ефекти. + + + Тактильна віддача + Змінити тактильну віддачу + Вимкнути вібрацію між розділами + Вібрацію між розділами вимкнено + Вібрацію між розділами ввімкнено + Вимкнути вібрацію точного перемотування + Вібрацію точного перемотування вимкнено + Вібрацію точного перемотування ввімкнено + Вимкнути вібрацію скасування перемотування + Вібрацію скасування перемотування вимкнено + Вібрацію скасування перемотування ввімкнено + Вимкнути вібрацію при масштабуванні + Вібрацію при масштабуванні вимкнено + Вібрацію при масштабуванні ввімкнено + + + Якщо Ви нещодавно змінили дані для входу у свій обліковий запис, видаліть і повторно встановіть MicroG. + + + Обхід URL переадресацій + URL переадресації обходяться + URL переадресації не обходяться + + + Відкривати посилання у браузері + Посилання відкриваються у зовнішньому браузері + Посилання відкриваються у вбудованому браузері + + + + Авто + Запам\'ятовувати зміни якості відео + Зміни якості застосовуються до всіх відео + Зміни якості застосовуються лише до поточного відео + Показувати тост при зміні якості відео + Тост показується, коли змінюється стандартна якість відео + Тост не показується, коли змінюється стандартна якість відео + Стандартна якість відео у Wi-Fi мережі + Стандартна якість відео в мобільній мережі + Запам\'ятовувати зміни якості Shorts + Зміни якості застосовуються до всіх Shorts + Зміни якості застосовуються лише до поточного Short + Стандартна якість Shorts у Wi-Fi мережі + Стандартна якість Shorts у мобільній мережі + в мобільній мережі + в Wi-Fi мережі + Якість %1$s змінено на %2$s + Якість Shorts %1$s змінено на %2$s + + + Кнопка швидкості відтворення + Кнопка діалогу швидкості показується. Натисніть і утримуйте, щоб відновити стандартну швидкість відтворення + Кнопка діалогу швидкості не показується + + + Кнопка якості відео + Кнопка якості відео показується. Натисніть і утримуйте, щоб відновити стандартну якість + Кнопка якості відео не показується + + + Користувацьке меню швидкості відтворення + Користувацьке меню швидкості відтворення показується + Користувацьке меню швидкості відтворення не показується + Відновити старе меню швидкості відтворення + Показується старе меню швидкості + Показується новітнє меню швидкості + Користувацькі швидкості відтворення + Додавання або зміна користувацьких швидкостей відтворення + Користувацькі швидкості повинні бути менші ніж %s + Неправильні користувацькі швидкості відтворення + Авто + Користувацька швидкість при натисканні та утриманні + Швидкість відтворення від 0 до 8 + + + Запам\'ятовувати зміни швидкості + Зміни швидкості відтворення застосовуються до всіх відео + Зміни швидкості відтворення застосовуються лише до поточного відео + Показувати тост при зміні швидкості відтворення + Тост показується, коли змінюється стандартна швидкість відтворення + Тост не показується, коли змінюється стандартна швидкість відтворення + Стандартна швидкість відтворення + Швидкість змінена на %s + + + Вимкнути HDR відео + HDR відео вимкнено + HDR відео увімкнено + Примусове використання AVC (H.264) + Відеокодек примусово встановлено на AVC (H.264) + Відеокодек визначається автоматично + "Переваги: • Може покращити час роботи від батареї • Може відновити відсутні роздільні здатності відео на старіших пристроях @@ -1643,179 +1640,178 @@ Second \"item\" text" • Під час відтворення відео буде витрачатися більше інтернет-трафіку, ніж із VP9 чи AV1 • HDR-відео не використовуватимуть AVC • Деякі пристрої не можуть примусово використовувати AVC" - - - Показувати розширене меню якості відео - Розширене меню якості відео показується - Розширене меню якості відео не показується - - - Увімкнути перемотку пересуванням - Перемотку пересуванням увімкнено\n\nВідновлено поведінку старого інтерфейсу \"Проведіть пальцем, щоб перемотати\" - Перемотку пересуванням вимкнено\n\nУвімкнено поведінку нового інтерфейсу прискорення \"2х >>\" при утриманні на екрані - - - Дозволити Android VR AV1 - "Відеокодек AVC (H.264), VP9 або AV1 + + + Показувати розширене меню якості відео + Розширене меню якості відео показується + Розширене меню якості відео не показується + + + Увімкнути перемотку пересуванням + Перемотку пересуванням увімкнено\n\nВідновлено поведінку старого інтерфейсу \"Проведіть пальцем, щоб перемотати\" + Перемотку пересуванням вимкнено\n\nУвімкнено поведінку нового інтерфейсу прискорення \"2х >>\" при утриманні на екрані + + + Дозволити Android VR AV1 + "Відеокодек AVC (H.264), VP9 або AV1 Відтворення може заїкатися або пропускати кадри" - Відеокодек AVC (H.264) або VP9 - "Увімкнення цього налаштування може призвести до використання програмного декодування AV1. + Відеокодек AVC (H.264) або VP9 + "Увімкнення цього налаштування може призвести до використання програмного декодування AV1. Відтворення відео з AV1 може заїкатися або мати пропуски кадрів." - Побічні ефекти підміни - • Експериментальний клієнт, який може припинити працювати будь-якої миті - • Відео може зупинитися на 1:00, або може бути недоступним у деяких регіонах - • Пункт меню \"Звукова доріжка\" відсутній - • Відеокодек AV1 відсутній - • Пункт меню \"Стабілізувати гучність\" недоступний - • Відео для дітей можуть не відтворюватися, якщо вийти з облікового запису або перейти в анонімний режим - - • Примусово оригінальна мова звукової доріжки\" недоступна - Показувати у \"Статистиці для сисадмінів\" - Тип клієнта відображається у вікні \"Статистика для сисадмінів\" - Тип клієнта приховано у вікні \"Статистика для сисадмінів\" - - - - - - - Інформація - Реклама - Загальні - Плеєр - Різне - - - Приховати відеорекламу - Відеорекламу приховано - Відеореклама показується - - - Увімкнути постійний повтор - Постійний повтор увімкнено - Постійний повтор вимкнено - - - Приховати кнопку трансляції - Кнопку трансляції приховано - Кнопка трансляції показується - Приховати кнопку історії - Кнопку історії приховано - Кнопка історії показується - Приховати кнопку сповіщень - Кнопку сповіщень приховано - Кнопка сповіщень показується - Приховати кнопку пошуку - Кнопку пошуку приховано - Кнопка пошуку показується - - - Приховати панель категорій - Панель категорій приховано - Панель категорій показується - - - Змінити колір мініплеєра - Колір мініплеєра відповідає кольору повноекранного плеєра - Мініплеєр використовує колір за замовчуванням - - - Панель навігації - Приховати або змінити кнопки панелі навігації - - Приховати \"Головна\" - Кнопку \"Головна\" приховано - Кнопка \"Головна\" показується - - Приховати \"Семпли\" - Кнопку \"Семпли\" приховано - Кнопка \"Семпли\" показується - - Приховати \"Навігація\" - Кнопку \"Навігація\" приховано - Кнопка \"Навігація\" показується - - Приховати \"Бібліотека\" - Кнопку \"Бібліотека\" приховано - Кнопка \"Бібліотека\" показується - - Приховати \"Підписка\" - Кнопку \"Підписка\" приховано - Кнопка \"Підписка\" показується - Приховати панель навігації - Панель навігації приховано - Панель навігації показується - Приховати підписи кнопок навігації - Підписи кнопок навігації приховано - Підписи кнопок навігації показуються - - - Приховати Пункт \"Підписатися на Music Premium\" - Пункт приховано - Пункт показується - - - Приховати кнопку \"Підписка\" - Кнопку приховано - Кнопка показується - - - - - Блокувати аудіорекламу - Аудіорекламу заблоковано - Аудіорекламу розблоковано - - - %s недоступний, реклама може відображатися. Спробуйте змінити службу блокування реклами в налаштуваннях. - %s повернув помилку, реклама може відображатися. Спробуйте змінити службу блокування реклами в налаштуваннях. - Блокувати вбудовану відеорекламу - Вимкнено - Проксі Luminous - Проксі PurpleAdBlock - - - Блокувати відеорекламу - Відеорекламу заблоковано - Відеорекламу розблоковано - - - Повідомлення видалено - Показувати видалені повідомлення - Не показувати видалені повідомлення - Приховати видалені повідомлення під спойлером - Показувати видалені повідомлення як закреслений текст - - - Автоматично збирати Бали каналу - Бали каналу збираються автоматично - Бали каналу не збираються автоматично - - - - Увімкнути режим налагодження Twitch - Режим налагодження Twitch увімкнено (не рекомендовано) - Режим налагодження Twitch вимкнено - - - Налаштування ReVanced - Інформація - Про ReVanced - Блокування реклами - Налаштування блокування реклами - Чат - Налаштування чату - Різне - Різні налаштування - Загальні налаштування - Інші налаштування - Реклама на стороні клієнта - Реклама на стороні сервера - Режим налагодження - Журнали налагодження ввімкнено - Журнали налагодження вимкнено - - + Побічні ефекти підміни + • Експериментальний клієнт, який може припинити працювати будь-якої миті + • Відео може зупинитися на 1:00, або може бути недоступним у деяких регіонах + • Пункт меню \"Звукова доріжка\" відсутній + • Відеокодек AV1 відсутній + • Пункт меню \"Стабілізувати гучність\" недоступний + • Відео для дітей можуть не відтворюватися, якщо вийти з облікового запису або перейти в анонімний режим + + • Примусово оригінальна мова звукової доріжки\" недоступна + Показувати у \"Статистиці для сисадмінів\" + Тип клієнта відображається у вікні \"Статистика для сисадмінів\" + Тип клієнта приховано у вікні \"Статистика для сисадмінів\" + + + + + + Інформація + Реклама + Загальні + Плеєр + Різне + + + Приховати відеорекламу + Відеорекламу приховано + Відеореклама показується + + + Увімкнути постійний повтор + Постійний повтор увімкнено + Постійний повтор вимкнено + + + Приховати кнопку трансляції + Кнопку трансляції приховано + Кнопка трансляції показується + Приховати кнопку історії + Кнопку історії приховано + Кнопка історії показується + Приховати кнопку сповіщень + Кнопку сповіщень приховано + Кнопка сповіщень показується + Приховати кнопку пошуку + Кнопку пошуку приховано + Кнопка пошуку показується + + + Приховати панель категорій + Панель категорій приховано + Панель категорій показується + + + Змінити колір мініплеєра + Колір мініплеєра відповідає кольору повноекранного плеєра + Мініплеєр використовує колір за замовчуванням + + + Панель навігації + Приховати або змінити кнопки панелі навігації + + Приховати \"Головна\" + Кнопку \"Головна\" приховано + Кнопка \"Головна\" показується + + Приховати \"Семпли\" + Кнопку \"Семпли\" приховано + Кнопка \"Семпли\" показується + + Приховати \"Навігація\" + Кнопку \"Навігація\" приховано + Кнопка \"Навігація\" показується + + Приховати \"Бібліотека\" + Кнопку \"Бібліотека\" приховано + Кнопка \"Бібліотека\" показується + + Приховати \"Підписка\" + Кнопку \"Підписка\" приховано + Кнопка \"Підписка\" показується + Приховати панель навігації + Панель навігації приховано + Панель навігації показується + Приховати підписи кнопок навігації + Підписи кнопок навігації приховано + Підписи кнопок навігації показуються + + + Приховати Пункт \"Підписатися на Music Premium\" + Пункт приховано + Пункт показується + + + Приховати кнопку \"Підписка\" + Кнопку приховано + Кнопка показується + + + + + Блокувати аудіорекламу + Аудіорекламу заблоковано + Аудіорекламу розблоковано + + + %s недоступний, реклама може відображатися. Спробуйте змінити службу блокування реклами в налаштуваннях. + %s повернув помилку, реклама може відображатися. Спробуйте змінити службу блокування реклами в налаштуваннях. + Блокувати вбудовану відеорекламу + Вимкнено + Проксі Luminous + Проксі PurpleAdBlock + + + Блокувати відеорекламу + Відеорекламу заблоковано + Відеорекламу розблоковано + + + Повідомлення видалено + Показувати видалені повідомлення + Не показувати видалені повідомлення + Приховати видалені повідомлення під спойлером + Показувати видалені повідомлення як закреслений текст + + + Автоматично збирати Бали каналу + Бали каналу збираються автоматично + Бали каналу не збираються автоматично + + + + Увімкнути режим налагодження Twitch + Режим налагодження Twitch увімкнено (не рекомендовано) + Режим налагодження Twitch вимкнено + + + Налаштування ReVanced + Інформація + Про ReVanced + Блокування реклами + Налаштування блокування реклами + Чат + Налаштування чату + Різне + Різні налаштування + Загальні налаштування + Інші налаштування + Реклама на стороні клієнта + Реклама на стороні сервера + Режим налагодження + Журнали налагодження ввімкнено + Журнали налагодження вимкнено + + diff --git a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml +++ b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index e4e09d6df5..e129ba7448 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -17,1262 +17,1261 @@ "First 'item' text Second \"item\" text" ---> - - - - Tên ứng dụng - - Tùy chỉnh - Biểu tượng ứng dụng - Gốc - - ReVanced (tối giản) - ReVanced (tỉ lệ) - - Tùy chỉnh - - - Kiểm tra thất bại - Mở trang web chính thức - Bỏ qua - <h5>Ứng dụng này xem ra không phải do bạn tự vá.</h5><br>Ứng dụng này có thể không hoạt động chính xác, <b>tiềm ẩn rủi ro hoặc thậm chí gây nguy hiểm khi sử dụng</b>.<br><br>Những kiểm tra dưới đây cho thấy rằng ứng dụng được vá sẵn hoặc lấy từ nguồn khác;<br><br><small>%1$s</small><br>Chúng tôi khuyến nghị bạn nên <b>gỡ cài đặt ứng này và tự vá lại</b> để đảm bảo bạn đang dùng một ứng dụng an toàn và hợp lệ.<p><br>Cảnh báo này sẽ chỉ hiện hai lần, hãy cân nhắc trước khi bỏ qua. - Đã vá trên một thiết bị khác - Không được cài đặt bởi ReVanced Manager - Đã vá hơn 10 phút trước - Đã vá %s ngày trước - Ngày dựng APK bị hỏng - - - Thông báo ReVanced - Nhật ký xem của bạn hiện không được lưu lại.<br><br>Nguyên nhân có thể là do trình chặn quảng cáo DNS hoặc proxy mạng.<br><br>Để khắc phục, hãy thêm <b>s.youtube.com</b> vào danh sách cho phép, hoặc tắt tất cả trình chặn DNS và proxy. - Không hiện lại - - - Thiết lập - Bạn có chắc chắn muốn tiếp tục không? - Lưu - Đặt lại - Đặt lại màu - Màu không hợp lệ - Yêu cầu khởi động lại - Khởi động lại ứng dụng để thay đổi này có hiệu lực. - Khởi động lại - Nhập - Sao chép - Đặt lại cài đặt ReVanced về mặc định - Đã nhập %d cài đặt - Nhập thất bại: %s - Tìm kiếm cài đặt - Không có kết quả nào phù hợp cho \'%s\' - Thử từ khóa khác - Các tìm kiếm gần đây - Xóa khỏi lịch sử tìm kiếm? - Xóa lịch sử tìm kiếm - Bạn có chắc chắn muốn xóa toàn bộ lịch sử tìm kiếm không? - Mẹo tìm kiếm - "• Nhấn vào một đường dẫn để đi đến đó +--> + + + Tên ứng dụng + + Tùy chỉnh + Biểu tượng ứng dụng + Gốc + + ReVanced (tối giản) + ReVanced (tỉ lệ) + + Tùy chỉnh + + + Kiểm tra thất bại + Mở trang web chính thức + Bỏ qua + <h5>Ứng dụng này xem ra không phải do bạn tự vá.</h5><br>Ứng dụng này có thể không hoạt động chính xác, <b>tiềm ẩn rủi ro hoặc thậm chí gây nguy hiểm khi sử dụng</b>.<br><br>Những kiểm tra dưới đây cho thấy rằng ứng dụng được vá sẵn hoặc lấy từ nguồn khác;<br><br><small>%1$s</small><br>Chúng tôi khuyến nghị bạn nên <b>gỡ cài đặt ứng này và tự vá lại</b> để đảm bảo bạn đang dùng một ứng dụng an toàn và hợp lệ.<p><br>Cảnh báo này sẽ chỉ hiện hai lần, hãy cân nhắc trước khi bỏ qua. + Đã vá trên một thiết bị khác + Không được cài đặt bởi ReVanced Manager + Đã vá hơn 10 phút trước + Đã vá %s ngày trước + Ngày dựng APK bị hỏng + + + Thông báo ReVanced + Nhật ký xem của bạn hiện không được lưu lại.<br><br>Nguyên nhân có thể là do trình chặn quảng cáo DNS hoặc proxy mạng.<br><br>Để khắc phục, hãy thêm <b>s.youtube.com</b> vào danh sách cho phép, hoặc tắt tất cả trình chặn DNS và proxy. + Không hiện lại + + + Thiết lập + Bạn có chắc chắn muốn tiếp tục không? + Lưu + Đặt lại + Đặt lại màu + Màu không hợp lệ + Yêu cầu khởi động lại + Khởi động lại ứng dụng để thay đổi này có hiệu lực. + Khởi động lại + Nhập + Sao chép + Đặt lại cài đặt ReVanced về mặc định + Đã nhập %d cài đặt + Nhập thất bại: %s + Tìm kiếm cài đặt + Không có kết quả nào phù hợp cho \'%s\' + Thử từ khóa khác + Các tìm kiếm gần đây + Xóa khỏi lịch sử tìm kiếm? + Xóa lịch sử tìm kiếm + Bạn có chắc chắn muốn xóa toàn bộ lịch sử tìm kiếm không? + Mẹo tìm kiếm + "• Nhấn vào một đường dẫn để đi đến đó • Nhấn giữ một cài đặt để đi đến đó • Nhấn Enter để lưu từ khoá tìm kiếm vào lịch sử • Tìm kiếm không phân biệt chữ hoa/thường và dấu câu • Cài đặt cha nằm phía trên cài đặt con bị vô hiệu hóa" - Không có lịch sử tìm kiếm - Để lưu lịch sử tìm kiếm, hãy nhập từ khóa tìm kiếm và nhấn Enter - Hiện lịch sử tìm kiếm cài đặt - Lịch sử tìm kiếm cài đặt đã được hiển thị - Lịch sử tìm kiếm cài đặt không được hiển thị - Hiện biểu tượng cài đặt ReVanced - Các biểu tượng cài đặt được hiển thị - Các biểu tượng cài đặt không được hiển thị - Ngôn ngữ ReVanced - "Bản dịch cho một số ngôn ngữ có thể bị thiếu hoặc chưa hoàn thiện. + Không có lịch sử tìm kiếm + Để lưu lịch sử tìm kiếm, hãy nhập từ khóa tìm kiếm và nhấn Enter + Hiện lịch sử tìm kiếm cài đặt + Lịch sử tìm kiếm cài đặt đã được hiển thị + Lịch sử tìm kiếm cài đặt không được hiển thị + Hiện biểu tượng cài đặt ReVanced + Các biểu tượng cài đặt được hiển thị + Các biểu tượng cài đặt không được hiển thị + Ngôn ngữ ReVanced + "Bản dịch cho một số ngôn ngữ có thể bị thiếu hoặc chưa hoàn thiện. Để dịch các ngôn ngữ mới hoặc cải thiện bản dịch hiện có, hãy truy cập translate.revanced.app" - Ngôn ngữ ứng dụng - Nhập hoặc Xuất - Nhập hoắc xuất các cài đặt ReVanced - - Bạn đang dùng ReVanced Patches phiên bản <i>%s</i> - Lưu ý - Phiên bản này là bản phát hành trước và bạn có thể gặp phải các sự cố không mong muốn - Liên kết chính thức - + Bạn đang dùng ReVanced Patches phiên bản <i>%s</i> + Lưu ý + Phiên bản này là bản phát hành trước và bạn có thể gặp phải các sự cố không mong muốn + Liên kết chính thức + - - - GmsCore - Chuyển hướng tới GmsCore và thiết lập - - MicroG GmsCore chưa được cài đặt. Hãy cài đặt ngay. - Yêu cầu thực hiện - "MicroG GmsCore không có quyền chạy nền. + + + GmsCore + Chuyển hướng tới GmsCore và thiết lập + + MicroG GmsCore chưa được cài đặt. Hãy cài đặt ngay. + Yêu cầu thực hiện + "MicroG GmsCore không có quyền chạy nền. Hãy làm theo hướng dẫn \"Don't kill my app\" dành cho điện thoại của bạn và áp dụng các bước đó để cài đặt MicroG. Cấp quyền chạy nền là bắt buộc để ứng dụng hoạt động." - Mở trang web - "Để microG GmsCore hoạt động ổn định, bạn cần phải tắt tối ưu hoá pin cho ứng dụng này. + Mở trang web + "Để microG GmsCore hoạt động ổn định, bạn cần phải tắt tối ưu hoá pin cho ứng dụng này. Đừng lo, tắt tối ưu hóa pin cho microG sẽ không làm hao pin hơn. Nhấn tiếp tục để thay đổi lựa chọn tối ưu hóa." - Tiếp tục - - - Giả mạo luồng video - Giả mạo luồng video của ứng dụng khách nhằm ngăn chặn lỗi khi phát - Giả mạo luồng video - "Luồng video đã được giả mạo + Tiếp tục + + + Giả mạo luồng video + Giả mạo luồng video của ứng dụng khách nhằm ngăn chặn lỗi khi phát + Giả mạo luồng video + "Luồng video đã được giả mạo Nếu bạn là người dùng YouTube Premium, thì cài đặt này có thể không cần thiết" - "Luồng video không được giả mạo + "Luồng video không được giả mạo Có thể gặp lỗi khi phát." - Tắt cài đặt này có thể gây ra lỗi khi phát. - Ứng dụng khách mặc định - - - Buộc ngôn ngữ âm thanh gốc - Đang dùng ngôn ngữ âm thanh gốc - Đang dùng âm thanh mặc định - - Để dùng tính năng này, hãy đổi \'Giả mạo luồng video\' thành bất kỳ ứng dụng khách nào ngoại trừ Android Studio - - - Gỡ lỗi - Bật hoặc tắt tùy chọn gỡ lỗi - Nhật ký gỡ lỗi - Nhật ký gỡ lỗi đã bật - Nhật ký gỡ lỗi đã tắt - Ghi nhật ký truy vết ngăn xếp - Nhật ký gỡ lỗi bao gồm truy vết ngăn xếp - Nhật ký gỡ lỗi không bao gồm truy vết ngăn xếp - Hiện thông báo ngắn về lỗi ReVanced - Thông báo ngắn sẽ hiện nếu xảy ra lỗi - Thông báo ngắn không hiện nếu xảy ra lỗi - "Tắt thông báo lỗi sẽ ẩn mọi thông báo lỗi từ ReVanced. + Tắt cài đặt này có thể gây ra lỗi khi phát. + Ứng dụng khách mặc định + + + Buộc ngôn ngữ âm thanh gốc + Đang dùng ngôn ngữ âm thanh gốc + Đang dùng âm thanh mặc định + + Để dùng tính năng này, hãy đổi \'Giả mạo luồng video\' thành bất kỳ ứng dụng khách nào ngoại trừ Android Studio + + + Gỡ lỗi + Bật hoặc tắt tùy chọn gỡ lỗi + Nhật ký gỡ lỗi + Nhật ký gỡ lỗi đã bật + Nhật ký gỡ lỗi đã tắt + Ghi nhật ký truy vết ngăn xếp + Nhật ký gỡ lỗi bao gồm truy vết ngăn xếp + Nhật ký gỡ lỗi không bao gồm truy vết ngăn xếp + Hiện thông báo ngắn về lỗi ReVanced + Thông báo ngắn sẽ hiện nếu xảy ra lỗi + Thông báo ngắn không hiện nếu xảy ra lỗi + "Tắt thông báo lỗi sẽ ẩn mọi thông báo lỗi từ ReVanced. Bạn sẽ không được thông báo khi xẩy ra lỗi bất ngờ." - Xuất nhật ký gỡ lỗi - Sao chép nhật ký gỡ lỗi ReVanced vào bảng nhớ tạm - Tính năng ghi nhật ký gỡ lỗi đã tắt - Không tìm thấy nhật ký - Đã sao chép nhật ký - Xuất nhật ký thất bại: %s - Xóa nhật ký gỡ lỗi - Xóa tất cả nhật ký gỡ lỗi ReVanced đã lưu trữ - Đã xóa nhật ký - Trình quản lý cờ tính năng - Quản lý các cờ tính năng boolean - Cờ đang hoạt động (%d) - Cờ bị chặn (%d) - Tìm kiếm cờ... - Đã lưu cờ - Đã đặt lại cờ - Đã sao chép cờ vào bảng nhớ tạm - Bộ đệm giao thức nhật ký - Ghi nhật ký gỡ lỗi bao gồm thông tin bộ đệm nguyên mẫu - Ghi nhật ký gỡ lỗi mà không có thông tin bộ đệm nguyên mẫu - "Bật cài đặt này sẽ ghi lại dữ liệu bố cục bổ sung, bao gồm cả văn bản trên màn hình cho một số thành phần giao diện người dùng. + Xuất nhật ký gỡ lỗi + Sao chép nhật ký gỡ lỗi ReVanced vào bảng nhớ tạm + Tính năng ghi nhật ký gỡ lỗi đã tắt + Không tìm thấy nhật ký + Đã sao chép nhật ký + Xuất nhật ký thất bại: %s + Xóa nhật ký gỡ lỗi + Xóa tất cả nhật ký gỡ lỗi ReVanced đã lưu trữ + Đã xóa nhật ký + Trình quản lý cờ tính năng + Quản lý các cờ tính năng boolean + Cờ đang hoạt động (%d) + Cờ bị chặn (%d) + Tìm kiếm cờ... + Đã lưu cờ + Đã đặt lại cờ + Đã sao chép cờ vào bảng nhớ tạm + Bộ đệm giao thức nhật ký + Ghi nhật ký gỡ lỗi bao gồm thông tin bộ đệm nguyên mẫu + Ghi nhật ký gỡ lỗi mà không có thông tin bộ đệm nguyên mẫu + "Bật cài đặt này sẽ ghi lại dữ liệu bố cục bổ sung, bao gồm cả văn bản trên màn hình cho một số thành phần giao diện người dùng. Điều này có thể giúp xác định các thành phần khi tạo bộ lọc tùy chỉnh. Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu người dùng, chẳng hạn như địa chỉ IP của bạn." - - - Rút gọn liên kết chia sẻ - Tham số truy vấn theo dõi bị loại bỏ khỏi các liên kết được chia sẻ - Tham số truy vấn theo dõi không bị loại bỏ khỏi các liên kết được chia sẻ - Thay đổi liên kết chia sẻ thành youtube.com - Liên kết chia sẻ bắt đầu bằng youtube.com - Liên kết chia sẻ bắt đầu bằng music.youtube.com - - - Bộ lọc tùy chỉnh - Ẩn các thành phần bằng bộ lọc tùy chỉnh - Bật bộ lọc tùy chỉnh - Bộ lọc tùy chỉnh được bật - Bộ lọc tuỳ chỉnh đã tắt - Bộ lọc tùy chỉnh - - Danh sách các chuỗi dựng đường dẫn thành phần để lọc được ngăn cách bởi dòng mới - Bộ lọc tuỳ chỉnh không hợp lệ: %s - - - - - Giới thiệu - Quảng cáo - Hình thu nhỏ thay thế - Trang video - Chung - Trình phát - Thanh tiến trình - Cử chỉ vuốt - Khác - Khôi phục trình đơn cài đặt cũ - Các trình đơn cài đặt cũ được hiển thị - Các trình đơn cài đặt cũ không được hiển thị - - - Tắt phát nền cho Shorts - Phát nền cho Shorts đã tắt - Phát nền cho Shorts được bật - - - Ẩn thẻ đĩa nhạc - Các thẻ đĩa nhạc đã bị ẩn - Các thẻ đĩa nhạc được hiển thị - Ẩn thẻ nghệ sĩ - Thẻ nghệ sĩ đã bị ẩn - Thẻ nghệ sĩ được hiển thị - Ẩn kệ danh mục được đề xuất - Kệ danh mục được đề xuất đã bị ẩn - Kệ danh mục được đề xuất được hiển thị - Ẩn bài đăng cộng đồng - Các bài đăng cộng đồng đã bị ẩn - Các bài đăng cộng đồng được hiển thị - Ẩn biểu ngữ vắn tắt - Biểu ngữ vắn tắt đã bị ẩn - Biểu ngữ vắn tắt được hiển thị - Ẩn thẻ mở rộng - Thẻ mở rộng bên dưới video đã bị ẩn - Thẻ mở rộng bên dưới video được hiển thị - Ẩn nút micrô nổi - Nút micro nổi trong tìm kiếm bị ẩn - Nút micro nổi trong tìm kiếm đang hiển thị - Ẩn kệ cá nhân hoá - "Các kệ cá nhân hoá đã bị ẩn, chẳng hạn như: + + + Rút gọn liên kết chia sẻ + Tham số truy vấn theo dõi bị loại bỏ khỏi các liên kết được chia sẻ + Tham số truy vấn theo dõi không bị loại bỏ khỏi các liên kết được chia sẻ + Thay đổi liên kết chia sẻ thành youtube.com + Liên kết chia sẻ bắt đầu bằng youtube.com + Liên kết chia sẻ bắt đầu bằng music.youtube.com + + + Bộ lọc tùy chỉnh + Ẩn các thành phần bằng bộ lọc tùy chỉnh + Bật bộ lọc tùy chỉnh + Bộ lọc tùy chỉnh được bật + Bộ lọc tuỳ chỉnh đã tắt + Bộ lọc tùy chỉnh + + Danh sách các chuỗi dựng đường dẫn thành phần để lọc được ngăn cách bởi dòng mới + Bộ lọc tuỳ chỉnh không hợp lệ: %s + + + + + Giới thiệu + Quảng cáo + Hình thu nhỏ thay thế + Trang video + Chung + Trình phát + Thanh tiến trình + Cử chỉ vuốt + Khác + Khôi phục trình đơn cài đặt cũ + Các trình đơn cài đặt cũ được hiển thị + Các trình đơn cài đặt cũ không được hiển thị + + + Tắt phát nền cho Shorts + Phát nền cho Shorts đã tắt + Phát nền cho Shorts được bật + + + Ẩn thẻ đĩa nhạc + Các thẻ đĩa nhạc đã bị ẩn + Các thẻ đĩa nhạc được hiển thị + Ẩn thẻ nghệ sĩ + Thẻ nghệ sĩ đã bị ẩn + Thẻ nghệ sĩ được hiển thị + Ẩn kệ danh mục được đề xuất + Kệ danh mục được đề xuất đã bị ẩn + Kệ danh mục được đề xuất được hiển thị + Ẩn bài đăng cộng đồng + Các bài đăng cộng đồng đã bị ẩn + Các bài đăng cộng đồng được hiển thị + Ẩn biểu ngữ vắn tắt + Biểu ngữ vắn tắt đã bị ẩn + Biểu ngữ vắn tắt được hiển thị + Ẩn thẻ mở rộng + Thẻ mở rộng bên dưới video đã bị ẩn + Thẻ mở rộng bên dưới video được hiển thị + Ẩn nút micrô nổi + Nút micro nổi trong tìm kiếm bị ẩn + Nút micro nổi trong tìm kiếm đang hiển thị + Ẩn kệ cá nhân hoá + "Các kệ cá nhân hoá đã bị ẩn, chẳng hạn như: • Tin nổi bật • Tiếp tục xem • Khám phá các chủ đề khác • Phù hợp nhất • Mua sắm • Xem lại" - Kệ cá nhân hoá được hiển thị - Ẩn kệ hình ảnh - Kệ hình ảnh trong kết quả tìm kiếm đã bị ẩn - Kệ hình ảnh trong kết quả tìm kiếm được hiển thị - Ẩn bài đăng mới nhất - Bài đăng mới nhất đã bị ẩn - Bài đăng mới nhất được hiển thị - Ẩn danh sách phát kết hợp - Danh sách phát kết hợp đã bị ẩn - Danh sách phát kết hợp được hiển thị - Ẩn phần phim - Phần phim đã bị ẩn - Phần phim được hiển thị - - Ẩn nút \'Thông báo cho tôi\' - Nút thông báo cho tôi đã bị ẩn - Nút thông báo cho tôi được hiển thị - Ẩn Chơi game trên Youtube - Chơi game đã bị ẩn - Chơi game được hiển thị - - Ẩn nút \'Hiện thêm\' - Nút hiện thêm đã bị ẩn trong kết quả tìm kiếm - Nút hiện thêm được hiển thị trong kết quả tìm kiếm - Ẩn khảo sát - Khảo sát bị ẩn - Khảo sát được hiển thị - Ẩn kệ vé - Kệ vé đã bị ẩn - Kệ vé đang hiển thị - - Ẩn nhãn video đề xuất - Nhãn \"Mọi người cũng xem video này\" và \"Có thể bạn cũng thích nội dung này\" trong kết quả tìm kiếm đã bị ẩn - Nhãn \"Mọi người cũng xem video này\" và \"Có thể bạn cũng thích nội dung này\" trong kết quả tìm kiếm được hiển thị - Ẩn dấu cách trực quan - Dấu cách trực quan đã bị ẩn - Dấu cách trực quan đang hiển thị - - Ẩn YouTube Doodles - Hoạt ảnh YouTube Doodles trên logo đã bị ẩn - Hoạt ảnh YouTube Doodles trên logo đang hiển thị - "YouTube Doodles chỉ xuất hiện vào một số ngày nhất định trong năm. + Ẩn nút \'Hiện thêm\' + Nút hiện thêm đã bị ẩn trong kết quả tìm kiếm + Nút hiện thêm được hiển thị trong kết quả tìm kiếm + Ẩn khảo sát + Khảo sát bị ẩn + Khảo sát được hiển thị + Ẩn kệ vé + Kệ vé đã bị ẩn + Kệ vé đang hiển thị + + Ẩn nhãn video đề xuất + Nhãn \"Mọi người cũng xem video này\" và \"Có thể bạn cũng thích nội dung này\" trong kết quả tìm kiếm đã bị ẩn + Nhãn \"Mọi người cũng xem video này\" và \"Có thể bạn cũng thích nội dung này\" trong kết quả tìm kiếm được hiển thị + Ẩn dấu cách trực quan + Dấu cách trực quan đã bị ẩn + Dấu cách trực quan đang hiển thị + + Ẩn YouTube Doodles + Hoạt ảnh YouTube Doodles trên logo đã bị ẩn + Hoạt ảnh YouTube Doodles trên logo đang hiển thị + "YouTube Doodles chỉ xuất hiện vào một số ngày nhất định trong năm. Nếu cài đặt này được bật và Doodle đang hiển thị tại khu vực của bạn, thì thanh bộ lọc bên dưới thanh tìm kiếm cũng sẽ bị ẩn." - Ẩn nút kênh - Nút kênh đã bị ẩn - Nút kênh được hiển thị - Ẩn hình mờ của kênh - Hình mờ đã bị ẩn - Hình mờ được hiển thị - Ẩn hộp chiến dịch gây quỹ - Hộp chiến dịch gây quỹ đã bị ẩn - Hộp chiến dịch gây quỹ được hiển thị - Ẩn hộp khẩn cấp - Hộp khẩn cấp đã bị ẩn - Hộp khẩn cấp được hiển thị - Ẩn bảng thông tin - Bảng thông tin đã bị ẩn - Bảng thông tin được hiển thị - - Ẩn nút Tham gia - Nút tham gia đã bị ẩn - Nút tham gia được hiển thị - Ẩn bảng thông tin y tế - Bảng thông tin y tế đã bị ẩn - Bảng thông tin y tế được hiển thị - Ẩn bảng thao tác nhanh - Bảng thao tác nhanh ở chế độ toàn màn hình đã bị ẩn - Bảng thao tác nhanh ở chế độ toàn màn hình được hiển thị - Ẩn video liên quan - Video liên quan trong bảng thao tác nhanh đã bị ẩn - Video liên quan trong bảng thao tác nhanh được hiển thị - Ẩn nguyên tắc cộng đồng cho người đăng ký - Nguyên tắc cộng đồng cho người đăng ký đã bị ẩn - Nguyên tắc cộng đồng dành cho người đăng ký được hiển thị - Ẩn phản ứng theo thời gian - Phản ứng theo thời gian đã bị ẩn - Phản ứng theo thời gian được hiển thị - Ẩn \'Bản tóm tắt video do AI tạo\' - Phần tóm tắt video do AI tạo đã bị ẩn - Phần tóm tắt video do AI tạo được hiển thị - Ẩn Đặt câu hỏi - Phần đặt câu hỏi đã bị ẩn - Phần đặt câu hỏi được hiển thị - Ẩn Thuộc tính - Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập đã bị ẩn - Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiển thị - Ẩn Chương - Phần chương đã bị ẩn - Phần chương được hiển thị - Ẩn \'Cách nội dung này được tạo ra\' - Phần cách nội dung được tạo ra đã bị ẩn - Phần cách nội dung được tạo ra được hiển thị - Ẩn Điểm khuấy động - Điểm khuấy động đã bị ẩn - Điểm khuấy động được hiển thị - Ẩn \'Khám phá podcast\' - Phần Khám phá podcast đã bị ẩn - Phần Khám phá podcast được hiển thị - Ẩn Liên kết nổi bật - Phần liên kết nổi bật bị ẩn - Phần liên kết nổi bật được hiển thị - Ẩn video nổi bật - Phần video nổi bật bị ẩn - Phần video nổi bật được hiển thị - Ẩn thẻ Thông tin - Phần thẻ thông tin đã bị ẩn - Phần thẻ thông tin được hiển thị - Ẩn \'Khái niệm chính\' - Phần Khái niệm chính đã bị ẩn - Phần Khái niệm chính được hiển thị - Ẩn nút Đăng ký - Nút đăng ký đã bị ẩn - Nút đăng ký được hiển thị - Ẩn Bản chép lời - Phần bản chép lời đã bị ẩn - Phần bản chép lời được hiển thị - Mô tả video - Ẩn hoặc hiện các thành phần mô tả video - Thanh bộ lọc - Ẩn hoặc hiện thanh bộ lọc trong trang video, video liên quan, kết quả tìm kiếm và nhật ký xem - Ẩn trong các trang video - Đã ẩn trong trang video - Đã hiển thị trong trang video - Ẩn trong video liên quan - Đã ẩn trong video liên quan - Đã hiển thị trong video liên quan - Ẩn trong kết quả tìm kiếm - Đã ẩn trong kết quả tìm kiếm - Đã hiển thị trong kết quả tìm kiếm - Ẩn trong nhật ký xem - Đã ẩn trong nhật ký xem - Đã hiển thị trong nhật ký xem - Trang kênh - Ẩn hoặc hiển thị các thành phần trang kênh - - Ẩn nút Cộng đồng - Nút Cộng đồng đã bị ẩn - Nút Cộng đồng được hiển thị - - Ẩn kệ \'Dành cho bạn\' - Kệ Dành cho bạn đã bị ẩn - Kệ Dành cho bạn được hiển thị - - Ẩn nút Tham gia - Nút Tham gia đã bị ẩn - Nút Tham gia được hiển thị - Ẩn bản xem trước liên kết - Bản xem trước liên kết đã bị ẩn - Bản xem trước liên kết được hiển thị - Ẩn kệ thành viên - Kệ thành viên đã bị ẩn - Kệ thành viên được hiển thị - - Ẩn nút Cửa hàng - Nút Cửa hàng đã bị ẩn - Nút Cửa hàng được hiển thị - - Ẩn nút Đăng ký - Nút đăng ký đã bị ẩn - Nút đăng ký được hiển thị - Bình luận - Ẩn hoặc hiện các thành phần bình luận - Ẩn tóm tắt cuộc trò chuyện do AI tạo - Tóm tắt cuộc trò chuyện do AI tạo đã bị ẩn - Tóm tắt cuộc trò chuyện do AI tạo được hiển thị - Ẩn tóm tắt bình luận do AI tạo - Tóm tắt bình luận do AI tạo đã bị ẩn - Tóm tắt bình luận do AI tạo được hiển thị - Ẩn nguyên tắc kênh - Nguyên tắc kênh đã bị ẩn - Nguyên tắc kênh được hiển thị - Ẩn tiêu đề \'Bình luận của hội viên\' - Tiêu đề bình luận của hội viên đã bị ẩn - Tiêu đề bình luận của hội viên được hiển thị - Ẩn phần bình luận - Phần Bình luận đã bị ẩn - Phần Bình luận được hiển thị - Ẩn nguyên tắc cộng đồng - Nguyên tắc cộng đồng đã bị ẩn - Nguyên tắc cộng đồng được hiển thị - Ẩn nút \'Tạo video ngắn\' - Nút Tạo video ngắn đã bị ẩn - Nút Tạo video ngắn được hiển thị - Ẩn nút Biểu tượng cảm xúc và Dấu thời gian - Nút Biểu tượng cảm xúc và Dấu thời gian đã bị ẩn - Nút Biểu tượng cảm xúc và Dấu thời gian được hiển thị - Ẩn xem trước bình luận - Xem trước bình luận đã bị ẩn - Xem trước bình luận được hiển thị - Ẩn nút Cảm ơn - Nút cảm ơn đã bị ẩn - Nút cảm ơn được hiển thị - Ẩn số lượt xem - Số lượt xem đã bị ẩn trên trang video và kết quả tìm kiếm - Số lượt xem được hiển thị trên trang video và kết quả tìm kiếm - - "Hạn chế: + Ẩn nút Tham gia + Nút tham gia đã bị ẩn + Nút tham gia được hiển thị + Ẩn bảng thông tin y tế + Bảng thông tin y tế đã bị ẩn + Bảng thông tin y tế được hiển thị + Ẩn bảng thao tác nhanh + Bảng thao tác nhanh ở chế độ toàn màn hình đã bị ẩn + Bảng thao tác nhanh ở chế độ toàn màn hình được hiển thị + Ẩn video liên quan + Video liên quan trong bảng thao tác nhanh đã bị ẩn + Video liên quan trong bảng thao tác nhanh được hiển thị + Ẩn nguyên tắc cộng đồng cho người đăng ký + Nguyên tắc cộng đồng cho người đăng ký đã bị ẩn + Nguyên tắc cộng đồng dành cho người đăng ký được hiển thị + Ẩn phản ứng theo thời gian + Phản ứng theo thời gian đã bị ẩn + Phản ứng theo thời gian được hiển thị + Ẩn \'Bản tóm tắt video do AI tạo\' + Phần tóm tắt video do AI tạo đã bị ẩn + Phần tóm tắt video do AI tạo được hiển thị + Ẩn Đặt câu hỏi + Phần đặt câu hỏi đã bị ẩn + Phần đặt câu hỏi được hiển thị + Ẩn Thuộc tính + Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập đã bị ẩn + Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiển thị + Ẩn Chương + Phần chương đã bị ẩn + Phần chương được hiển thị + Ẩn \'Cách nội dung này được tạo ra\' + Phần cách nội dung được tạo ra đã bị ẩn + Phần cách nội dung được tạo ra được hiển thị + Ẩn Điểm khuấy động + Điểm khuấy động đã bị ẩn + Điểm khuấy động được hiển thị + Ẩn \'Khám phá podcast\' + Phần Khám phá podcast đã bị ẩn + Phần Khám phá podcast được hiển thị + Ẩn Liên kết nổi bật + Phần liên kết nổi bật bị ẩn + Phần liên kết nổi bật được hiển thị + Ẩn video nổi bật + Phần video nổi bật bị ẩn + Phần video nổi bật được hiển thị + Ẩn thẻ Thông tin + Phần thẻ thông tin đã bị ẩn + Phần thẻ thông tin được hiển thị + Ẩn \'Khái niệm chính\' + Phần Khái niệm chính đã bị ẩn + Phần Khái niệm chính được hiển thị + Ẩn nút Đăng ký + Nút đăng ký đã bị ẩn + Nút đăng ký được hiển thị + Ẩn Bản chép lời + Phần bản chép lời đã bị ẩn + Phần bản chép lời được hiển thị + Mô tả video + Ẩn hoặc hiện các thành phần mô tả video + Thanh bộ lọc + Ẩn hoặc hiện thanh bộ lọc trong trang video, video liên quan, kết quả tìm kiếm và nhật ký xem + Ẩn trong các trang video + Đã ẩn trong trang video + Đã hiển thị trong trang video + Ẩn trong video liên quan + Đã ẩn trong video liên quan + Đã hiển thị trong video liên quan + Ẩn trong kết quả tìm kiếm + Đã ẩn trong kết quả tìm kiếm + Đã hiển thị trong kết quả tìm kiếm + Ẩn trong nhật ký xem + Đã ẩn trong nhật ký xem + Đã hiển thị trong nhật ký xem + Trang kênh + Ẩn hoặc hiển thị các thành phần trang kênh + + Ẩn nút Cộng đồng + Nút Cộng đồng đã bị ẩn + Nút Cộng đồng được hiển thị + + Ẩn kệ \'Dành cho bạn\' + Kệ Dành cho bạn đã bị ẩn + Kệ Dành cho bạn được hiển thị + + Ẩn nút Tham gia + Nút Tham gia đã bị ẩn + Nút Tham gia được hiển thị + Ẩn bản xem trước liên kết + Bản xem trước liên kết đã bị ẩn + Bản xem trước liên kết được hiển thị + Ẩn kệ thành viên + Kệ thành viên đã bị ẩn + Kệ thành viên được hiển thị + + Ẩn nút Cửa hàng + Nút Cửa hàng đã bị ẩn + Nút Cửa hàng được hiển thị + + Ẩn nút Đăng ký + Nút đăng ký đã bị ẩn + Nút đăng ký được hiển thị + Bình luận + Ẩn hoặc hiện các thành phần bình luận + Ẩn tóm tắt cuộc trò chuyện do AI tạo + Tóm tắt cuộc trò chuyện do AI tạo đã bị ẩn + Tóm tắt cuộc trò chuyện do AI tạo được hiển thị + Ẩn tóm tắt bình luận do AI tạo + Tóm tắt bình luận do AI tạo đã bị ẩn + Tóm tắt bình luận do AI tạo được hiển thị + Ẩn nguyên tắc kênh + Nguyên tắc kênh đã bị ẩn + Nguyên tắc kênh được hiển thị + Ẩn tiêu đề \'Bình luận của hội viên\' + Tiêu đề bình luận của hội viên đã bị ẩn + Tiêu đề bình luận của hội viên được hiển thị + Ẩn phần bình luận + Phần Bình luận đã bị ẩn + Phần Bình luận được hiển thị + Ẩn nguyên tắc cộng đồng + Nguyên tắc cộng đồng đã bị ẩn + Nguyên tắc cộng đồng được hiển thị + Ẩn nút \'Tạo video ngắn\' + Nút Tạo video ngắn đã bị ẩn + Nút Tạo video ngắn được hiển thị + Ẩn nút Biểu tượng cảm xúc và Dấu thời gian + Nút Biểu tượng cảm xúc và Dấu thời gian đã bị ẩn + Nút Biểu tượng cảm xúc và Dấu thời gian được hiển thị + Ẩn xem trước bình luận + Xem trước bình luận đã bị ẩn + Xem trước bình luận được hiển thị + Ẩn nút Cảm ơn + Nút cảm ơn đã bị ẩn + Nút cảm ơn được hiển thị + Ẩn số lượt xem + Số lượt xem đã bị ẩn trên trang video và kết quả tìm kiếm + Số lượt xem được hiển thị trên trang video và kết quả tìm kiếm + + "Hạn chế: • Trên kệ Shorts, trang kênh và kết quả tìm kiếm vẫn có thể thấy số lượt xem • Tính năng này không hoạt động với bố cục màn hình ô tô" - Ẩn ngày tải lên - Ngày tải lên đã bị ẩn trên trang video và kết quả tìm kiếm - Ngày tải lên được hiển thị trên trang video và kết quả tìm kiếm - - "Hạn chế: + Ẩn ngày tải lên + Ngày tải lên đã bị ẩn trên trang video và kết quả tìm kiếm + Ngày tải lên được hiển thị trên trang video và kết quả tìm kiếm + + "Hạn chế: • Trên kệ Shorts, trang kênh và kết quả tìm kiếm có thể vẫn thấy ngày tải lên • Tính năng này không hoạt động với bố cục màn hình ô tô" - Ẩn nội dung theo từ khóa - Ẩn video trong trang video và tìm kiếm bằng bộ lọc từ khóa - Ẩn video Trang chủ theo từ khóa - Video trong thẻ Trang chủ được lọc theo từ khóa - Video trong thẻ Trang chủ không được lọc theo từ khóa - Ẩn kết quả tìm kiếm bằng từ khóa - Kết quả tìm kiếm đã được lọc bằng từ khóa - Kết quả tìm kiếm không được lọc bằng từ khóa - Ẩn video kênh đăng ký bằng từ khóa - Video ở thẻ đăng ký đã được lọc bằng từ khóa - Video ở thẻ đăng ký không được lọc bằng từ khóa - Từ khóa để ẩn - - "Từ và cụm từ khóa để ẩn, cách nhau bằng dòng mới + "Từ và cụm từ khóa để ẩn, cách nhau bằng dòng mới Từ khóa có thể là tên kênh hoặc bất kỳ văn bản nào hiển thị trong tiêu đề video Từ có chữ in hoa ở giữa phải được nhập cùng với chữ viết hoa (ví dụ: iPhone, TikTok, LeBlanc)" - Giới thiệu về bộ lọc từ khóa - "Trang chủ/Kênh đăng ký/Kết quả tìm kiếm được lọc để ẩn nội dung khớp với cụm từ khóa + Giới thiệu về bộ lọc từ khóa + "Trang chủ/Kênh đăng ký/Kết quả tìm kiếm được lọc để ẩn nội dung khớp với cụm từ khóa Hạn chế • Video ngắn không thể bị ẩn theo tên kênh • Một số thành phần giao diện người dùng có thể không bị ẩn • Tìm kiếm từ khóa có thể không hiển thị kết quả" - Khớp toàn bộ từ - - Đặt từ/cụm từ cần lọc trong dấu ngoặc kép sẽ ngăn chặn các kết quả chỉ trùng một phần với tiêu đề video và tên kênh<br><br>Ví dụ,<br><b>\"ai\"</b> sẽ ẩn video: <b>AI hoạt động ra sao?</b><br>nhưng sẽ không ẩn: <b>Hai lai nghĩa là gì?</b> - - Không thể dùng từ khóa: %s - Hãy thêm dấu ngoặc kép để sử dụng từ khoá: %s - Từ khóa có các định nghĩa mâu thuẫn với nhau. %s - Từ khóa quá ngắn và cần phải có dấu ngoặc kép: %s - Từ khóa sẽ ẩn tất cả video: %s - - - Ẩn kệ cửa hàng của nhà sáng tạo - Kệ cửa hàng của nhà sáng tạo bên dưới trình phát video đã bị ẩn - Kệ cửa hàng của người sáng tạo dưới trình phát video đang hiển thị - Ẩn biểu ngữ cửa hàng trên màn hình kết thúc - Biểu ngữ cửa hàng trên màn hình kết thúc đã bị ẩn - Biểu ngữ cửa hàng trên màn hình kết thúc được hiển thị - Ẩn quảng cáo toàn màn hình - "Quảng cáo toàn màn hình đã bị ẩn + Khớp toàn bộ từ + + Đặt từ/cụm từ cần lọc trong dấu ngoặc kép sẽ ngăn chặn các kết quả chỉ trùng một phần với tiêu đề video và tên kênh<br><br>Ví dụ,<br><b>\"ai\"</b> sẽ ẩn video: <b>AI hoạt động ra sao?</b><br>nhưng sẽ không ẩn: <b>Hai lai nghĩa là gì?</b> + + Không thể dùng từ khóa: %s + Hãy thêm dấu ngoặc kép để sử dụng từ khoá: %s + Từ khóa có các định nghĩa mâu thuẫn với nhau. %s + Từ khóa quá ngắn và cần phải có dấu ngoặc kép: %s + Từ khóa sẽ ẩn tất cả video: %s + + + Ẩn kệ cửa hàng của nhà sáng tạo + Kệ cửa hàng của nhà sáng tạo bên dưới trình phát video đã bị ẩn + Kệ cửa hàng của người sáng tạo dưới trình phát video đang hiển thị + Ẩn biểu ngữ cửa hàng trên màn hình kết thúc + Biểu ngữ cửa hàng trên màn hình kết thúc đã bị ẩn + Biểu ngữ cửa hàng trên màn hình kết thúc được hiển thị + Ẩn quảng cáo toàn màn hình + "Quảng cáo toàn màn hình đã bị ẩn Tính năng này chỉ khả dụng trên các thiết bị cũ" - Quảng cáo toàn màn hình được hiển thị - - Ẩn QC toàn màn hình chỉ hoạt động trên thiết bị cũ - Ẩn quảng cáo chung - Quảng cáo chung đã bị ẩn - Quảng cáo chung được hiển thị - Ẩn biểu ngữ sản phẩm - Biểu ngữ sản phẩm đã bị ẩn - Biểu ngữ sản phẩm được hiển thị - Ẩn nhãn quảng cáo trả phí - Nhãn quảng cáo trả phí đã bị ẩn - Nhãn quảng cáo trả phí được hiển thị - Ẩn thẻ tự tài trợ - Các thẻ tự tài trợ đã bị ẩn - Các thẻ tự tài trợ được hiển thị - Ẩn liên kết mua sắm - Liên kết mua sắm trong mô tả video đã bị ẩn - Liên kết mua sắm trong mô tả video được hiển thị - Ẩn biểu ngữ \"Xem sản phẩm\" - Biểu ngữ xem sản phẩm trong lớp phủ video đã bị ẩn - Biểu ngữ xem sản phẩm trong lớp phủ video được hiển thị - Ẩn kết quả tìm kiếm trên web - Kết quả tìm kiếm trên web đã bị ẩn - Kết quả tìm kiếm trên web được hiển thị - - - Ẩn quảng cáo YouTube Premium - Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video đã bị ẩn - Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video được hiển thị - - - Ẩn quảng cáo trên video - Quảng cáo trên video đã bị ẩn - Quảng cáo trên video được hiển thị - - - Đã sao chép URL vào bảng nhớ tạm - Đã sao chép URL kèm dấu thời gian - Hiện nút sao chép URL video - Nút sao chép URL video được hiển thị. Nhấn để sao chép URL video. Nhấn và giữ để sao chép kèm dấu thời gian - Nút sao chép URL video không được hiển thị - Hiện nút sao chép URL kèm dấu thời gian - Nút sao chép URL kèm dấu thời gian được hiển thị. Nhấn để sao chép URL video kèm dấu thời gian. Nhấn giữ để sao chép không kèm dấu thời gian - Nút sao chép URL kèm dấu thời gian không được hiển thị - - - Loại bỏ hộp thoại cảnh báo trước khi xem - Hộp thoại sẽ bị loại bỏ - Hộp thoại sẽ được hiển thị - Tuỳ chọn này chỉ tự động chấp nhận mà không bỏ qua giới hạn độ tuổi. - - - Tắt cửa sổ bật lên \"Đăng nhập vào TV\" - Cửa sổ Đăng nhập vào TV đã tắt - Cửa sổ Đăng nhập vào TV đã bật - - - Tắt bỏ qua chương bằng cách chạm hai lần - Chạm hai lần không bao giờ có thể kích hoạt bỏ qua đến chương tiếp theo/trước đó - Chạm hai lần đôi khi có thể kích hoạt bỏ qua đến chương tiếp theo/trước đó - - - Tải xuống bên ngoài - Thiết lập để dùng trình tải xuống bên ngoài - Hiện nút tải xuống bên ngoài - Nút tải xuống trong trình phát đã được hiển thị - Nút tải xuống trong trình phát không được hiển thị - - Ghi đè nút Tải xuống - Nút tải xuống mở trình tải xuống bên ngoài của bạn - Nút tải xuống mở trình tải xuống trong ứng dụng gốc - Tên gói trình tải xuống - Tên gói ứng dụng trình tải xuống bên ngoài đã cài đặt của bạn - Nhập tên gói - Khác - Ứng dụng chưa được cài đặt - %s chưa được cài đặt. Vui lòng cài đặt ứng dụng. - "Không tìm thấy ứng dụng đã cài với tên gói: %s + Quảng cáo toàn màn hình được hiển thị + + Ẩn QC toàn màn hình chỉ hoạt động trên thiết bị cũ + Ẩn quảng cáo chung + Quảng cáo chung đã bị ẩn + Quảng cáo chung được hiển thị + Ẩn biểu ngữ sản phẩm + Biểu ngữ sản phẩm đã bị ẩn + Biểu ngữ sản phẩm được hiển thị + Ẩn nhãn quảng cáo trả phí + Nhãn quảng cáo trả phí đã bị ẩn + Nhãn quảng cáo trả phí được hiển thị + Ẩn thẻ tự tài trợ + Các thẻ tự tài trợ đã bị ẩn + Các thẻ tự tài trợ được hiển thị + Ẩn liên kết mua sắm + Liên kết mua sắm trong mô tả video đã bị ẩn + Liên kết mua sắm trong mô tả video được hiển thị + Ẩn biểu ngữ \"Xem sản phẩm\" + Biểu ngữ xem sản phẩm trong lớp phủ video đã bị ẩn + Biểu ngữ xem sản phẩm trong lớp phủ video được hiển thị + Ẩn kết quả tìm kiếm trên web + Kết quả tìm kiếm trên web đã bị ẩn + Kết quả tìm kiếm trên web được hiển thị + + + Ẩn quảng cáo YouTube Premium + Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video đã bị ẩn + Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video được hiển thị + + + Ẩn quảng cáo trên video + Quảng cáo trên video đã bị ẩn + Quảng cáo trên video được hiển thị + + + Đã sao chép URL vào bảng nhớ tạm + Đã sao chép URL kèm dấu thời gian + Hiện nút sao chép URL video + Nút sao chép URL video được hiển thị. Nhấn để sao chép URL video. Nhấn và giữ để sao chép kèm dấu thời gian + Nút sao chép URL video không được hiển thị + Hiện nút sao chép URL kèm dấu thời gian + Nút sao chép URL kèm dấu thời gian được hiển thị. Nhấn để sao chép URL video kèm dấu thời gian. Nhấn giữ để sao chép không kèm dấu thời gian + Nút sao chép URL kèm dấu thời gian không được hiển thị + + + Loại bỏ hộp thoại cảnh báo trước khi xem + Hộp thoại sẽ bị loại bỏ + Hộp thoại sẽ được hiển thị + Tuỳ chọn này chỉ tự động chấp nhận mà không bỏ qua giới hạn độ tuổi. + + + Tắt cửa sổ bật lên \"Đăng nhập vào TV\" + Cửa sổ Đăng nhập vào TV đã tắt + Cửa sổ Đăng nhập vào TV đã bật + + + Tắt bỏ qua chương bằng cách chạm hai lần + Chạm hai lần không bao giờ có thể kích hoạt bỏ qua đến chương tiếp theo/trước đó + Chạm hai lần đôi khi có thể kích hoạt bỏ qua đến chương tiếp theo/trước đó + + + Tải xuống bên ngoài + Thiết lập để dùng trình tải xuống bên ngoài + Hiện nút tải xuống bên ngoài + Nút tải xuống trong trình phát đã được hiển thị + Nút tải xuống trong trình phát không được hiển thị + + Ghi đè nút Tải xuống + Nút tải xuống mở trình tải xuống bên ngoài của bạn + Nút tải xuống mở trình tải xuống trong ứng dụng gốc + Tên gói trình tải xuống + Tên gói ứng dụng trình tải xuống bên ngoài đã cài đặt của bạn + Nhập tên gói + Khác + Ứng dụng chưa được cài đặt + %s chưa được cài đặt. Vui lòng cài đặt ứng dụng. + "Không tìm thấy ứng dụng đã cài với tên gói: %s Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được cài trên thiết bị" - Tên gói không được để trống - - - Tắt cử chỉ tua chính xác - Cử chỉ đã tắt - Cử chỉ đã bật - - - Bật nhấn để tua - Nhấn để tua đã bật - Nhấn để tua đã tắt - - - Bật cử chỉ độ sáng - "Vuốt độ sáng toàn màn hình đã được bật + Tên gói không được để trống + + + Tắt cử chỉ tua chính xác + Cử chỉ đã tắt + Cử chỉ đã bật + + + Bật nhấn để tua + Nhấn để tua đã bật + Nhấn để tua đã tắt + + + Bật cử chỉ độ sáng + "Vuốt độ sáng toàn màn hình đã được bật Điều chỉnh độ sáng bằng cách vuốt dọc ở bên trái màn hình" - Vuốt độ sáng toàn màn hình đã tắt - Bật cử chỉ âm lượng - "Vuốt âm lượng toàn màn hình đã được bật + Vuốt độ sáng toàn màn hình đã tắt + Bật cử chỉ âm lượng + "Vuốt âm lượng toàn màn hình đã được bật Điều chỉnh âm lượng bằng cách vuốt dọc ở bên phải màn hình" - Vuốt âm lượng toàn màn hình đã tắt - Bật cử chỉ nhấn giữ để vuốt - Nhấn giữ để vuốt đã bật - Nhấn giữ để vuốt đã tắt - Bật phản hồi xúc giác - Phản hồi xúc giác đã được bật - Phản hồi xúc giác đã tắt - Lưu và khôi phục độ sáng - Lưu và khôi phục độ sáng khi thoát hoặc vào toàn màn hình - Không lưu và khôi phục độ sáng khi thoát hoặc vào toàn màn hình - Bật cử chỉ độ sáng tự động - Vuốt xuống đến giá trị thấp nhất của cử chỉ độ sáng bật độ sáng tự động - Vuốt xuống đến giá trị thấp nhất không bật độ sáng tự động - Tự động - Thời gian chờ lớp phủ vuốt - Số mili-giây mà lớp phủ hiển thị - Độ mờ nền phủ vuốt - Giá trị độ mờ từ 0-100 - Độ mờ vuốt phải nằm trong khoảng từ 0-100 - Màu lớp phủ vuốt độ sáng - Màu của thanh điều chỉnh độ sáng - Màu lớp phủ vuốt âm lượng - Màu của thanh điều chỉnh âm lượng - Kích thước văn bản lớp phủ vuốt - Kích thước văn bản cho lớp phủ vuốt từ 1-30 - Kích thước văn bản phải nằm trong khoảng 1-30 - Độ rộng ngưỡng vuốt - Độ rộng của ngưỡng vuốt để thực hiện cử chỉ vuốt - Độ nhạy vuốt âm lượng - Mức âm lượng thay đổi mỗi lần vuốt - Kiểu lớp phủ vuốt - Lớp phủ ngang - Lớp phủ ngang (tối giản - trên cùng) - Lớp phủ ngang (tối giản - chính giữa) - Lớp phủ hình tròn - Lớp phủ tròn (tối giản) - Lớp phủ dọc - Lớp phủ dọc (tối giản) - Bật vuốt để chuyển video - Vuốt trong chế độ toàn màn hình sẽ chuyển sang video tiếp theo/trước đó - Vuốt trong chế độ toàn màn hình sẽ không chuyển sang video tiếp theo/trước đó - - - Tắt phụ đề tự động - Phụ đề tự động đã tắt - Phụ đề tự động đã bật - - - Nút thao tác - Ẩn hoặc hiển thị các nút bên dưới video - Tắt hiệu ứng phát sáng nút Thích và Đăng ký - Nút Thích và Đăng ký sẽ không phát sáng khi được tương tác - Nút Thích và Đăng ký sẽ phát sáng khi được tương tác - Ẩn Thích và Không thích - Các nút Thích và Không thích đã bị ẩn - Các nút Thích và Không thích được hiển thị - - Ẩn Chia sẻ - Nút chia sẻ đã bị ẩn - Nút chia sẻ được hiển thị - - Ẩn Ngừng quảng cáo - Nút ngừng quảng cáo đã bị ẩn - Nút ngừng quảng cáo được hiển thị - - Ẩn bình luận - Nút bình luận đã bị ẩn - Nút bình luận được hiển thị - + Ẩn Chia sẻ + Nút chia sẻ đã bị ẩn + Nút chia sẻ được hiển thị + + Ẩn Ngừng quảng cáo + Nút ngừng quảng cáo đã bị ẩn + Nút ngừng quảng cáo được hiển thị + + Ẩn bình luận + Nút bình luận đã bị ẩn + Nút bình luận được hiển thị + - Ẩn Báo cáo - Nút báo cáo đã bị ẩn - Nút báo cáo được hiển thị - - Ẩn Phối lại - Nút Phối lại đã bị ẩn - Nút Phối lại được hiển thị - - Ẩn Tải xuống - Nút tải xuống đã bị ẩn - Nút tải xuống được hiển thị - + Ẩn Phối lại + Nút Phối lại đã bị ẩn + Nút Phối lại được hiển thị + + Ẩn Tải xuống + Nút tải xuống đã bị ẩn + Nút tải xuống được hiển thị + - Ẩn Khuấy động - Nút khuấy động đã bị ẩn - Nút khuấy động được hiển thị - - Ẩn Quảng bá - Nút Quảng bá đã bị ẩn - Nút Quảng bá được hiển thị - - Ẩn Cảm ơn - Nút cảm ơn đã bị ẩn - Nút cảm ơn được hiển thị - + Ẩn Quảng bá + Nút Quảng bá đã bị ẩn + Nút Quảng bá được hiển thị + + Ẩn Cảm ơn + Nút cảm ơn đã bị ẩn + Nút cảm ơn được hiển thị + - Ẩn Đặt câu hỏi - Nút đặt câu hỏi đã bị ẩn - Nút đặt câu hỏi được hiển thị - - Ẩn Tạo đoạn video - Nút tạo đoạn video đã bị ẩn - Nút tạo đoạn video được hiển thị - - Ẩn Mua sắm - Nút Mua sắm đã bị ẩn - Nút Mua sắm được hiển thị - - Ẩn Lưu - Nút Lưu đã bị ẩn - Nút Lưu được hiển thị - - - Các nút điều hướng - Ẩn hoặc thay đổi các nút ở thanh điều hướng - - Ẩn Trang chủ - Nút trang chủ đã bị ẩn - Nút trang chủ được hiển thị - - Ẩn Shorts - Nút Shorts đã bị ẩn - Nút Shorts được hiển thị - - Ẩn nút Tạo - Nút tạo đã bị ẩn - Nút tạo được hiển thị - - Ẩn Kênh đăng ký - Nút kênh đăng ký đã bị ẩn - Nút kênh đăng ký được hiển thị - Ẩn Thông báo - Nút thông báo đã bị ẩn - Nút thông báo được hiển thị - - Chuyển vị nút Tạo với nút Thông báo - "Nút Tạo được đổi với nút Thông báo + Ẩn Đặt câu hỏi + Nút đặt câu hỏi đã bị ẩn + Nút đặt câu hỏi được hiển thị + + Ẩn Tạo đoạn video + Nút tạo đoạn video đã bị ẩn + Nút tạo đoạn video được hiển thị + + Ẩn Mua sắm + Nút Mua sắm đã bị ẩn + Nút Mua sắm được hiển thị + + Ẩn Lưu + Nút Lưu đã bị ẩn + Nút Lưu được hiển thị + + + Các nút điều hướng + Ẩn hoặc thay đổi các nút ở thanh điều hướng + + Ẩn Trang chủ + Nút trang chủ đã bị ẩn + Nút trang chủ được hiển thị + + Ẩn Shorts + Nút Shorts đã bị ẩn + Nút Shorts được hiển thị + + Ẩn nút Tạo + Nút tạo đã bị ẩn + Nút tạo được hiển thị + + Ẩn Kênh đăng ký + Nút kênh đăng ký đã bị ẩn + Nút kênh đăng ký được hiển thị + Ẩn Thông báo + Nút thông báo đã bị ẩn + Nút thông báo được hiển thị + + Chuyển vị nút Tạo với nút Thông báo + "Nút Tạo được đổi với nút Thông báo Lưu ý: Bật tính năng này cũng ẩn quảng cáo video" - Nút Tạo không đổi với nút Thông báo - "Tắt cài đặt này cũng sẽ tắt chặn quảng cáo trên Shorts. + Nút Tạo không đổi với nút Thông báo + "Tắt cài đặt này cũng sẽ tắt chặn quảng cáo trên Shorts. Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển sang chế độ Ẩn danh." - Ẩn nhãn nút điều hướng - Các nhãn đã bị ẩn - Các nhãn được hiển thị - Vô hiệu hóa thanh trạng thái trong suốt - Thanh trạng thái không trong suốt - Thanh trạng thái có thể mờ hoặc trong suốt - Trên một số thiết bị, bật tính năng này có thể thay đổi thanh điều hướng hệ thống thành trong suốt. - Vô hiệu hóa thanh điều hướng trong suốt ở chế độ sáng - Thanh điều hướng ở chế độ sáng không trong suốt - Thanh điều hướng ở chế độ sáng có thể mờ hoặc trong suốt - Vô hiệu hoá thanh điều hướng trong suốt ở chế độ tối - Thanh điều hướng ở chế độ tối không trong suốt - Thanh điều hướng ở chế độ tối có thể mờ hoặc trong suốt - - - Trình đơn tuỳ chọn - Ẩn hoặc hiện các mục trình đơn tuỳ chọn trên trình phát - - Ẩn Phụ đề - Trình đơn phụ đề đã bị ẩn - Trình đơn phụ đề được hiển thị - - Ẩn Chế độ cài đặt khác - Trình đơn chế độ cài đặt khác đã bị ẩn - Trình đơn chế độ cài đặt khác được hiển thị - - Ẩn Hẹn giờ ngủ - Trình đơn hẹn giờ ngủ đã bị ẩn - Trình đơn hẹn giờ ngủ được hiển thị - - Ẩn Cho video lặp lại - Trình đơn cho video lặp lại đã bị ẩn - Trình đơn cho video lặp lại được hiển thị - - Ẩn Chế độ môi trường xung quanh - Trình đơn chế độ môi trường xung quanh đã bị ẩn - Trình đơn chế độ môi trường xung quanh được hiển thị - Ẩn Âm lượng ổn định - Trình đơn âm lượng ổn định được hiển thị - Trình đơn âm lượng ổn định đã bị ẩn - - Ẩn Trợ giúp và phản hồi - Trình đơn trợ giúp và phản hồi đã bị ẩn - Trình đơn trợ giúp và phản hồi được hiển thị - - Ẩn Tốc độ phát - Trình đơn tốc độ phát đã bị ẩn - Trình đơn tốc độ phát được hiển thị - - Ẩn Khóa màn hình - Trình đơn khóa màn hình đã bị ẩn - Trình đơn khóa màn hình được hiển thị - - Ẩn Nghe nhạc trên YouTube Music - Trình đơn Nghe nhạc trên YouTube Music đã bị ẩn - Trình đơn Nghe nhạc trên YouTube Music được hiển thị - - Ẩn Bản âm thanh - Trình đơn bản âm thanh đã bị ẩn - Trình đơn bản âm thanh được hiển thị - + Ẩn Phụ đề + Trình đơn phụ đề đã bị ẩn + Trình đơn phụ đề được hiển thị + + Ẩn Chế độ cài đặt khác + Trình đơn chế độ cài đặt khác đã bị ẩn + Trình đơn chế độ cài đặt khác được hiển thị + + Ẩn Hẹn giờ ngủ + Trình đơn hẹn giờ ngủ đã bị ẩn + Trình đơn hẹn giờ ngủ được hiển thị + + Ẩn Cho video lặp lại + Trình đơn cho video lặp lại đã bị ẩn + Trình đơn cho video lặp lại được hiển thị + + Ẩn Chế độ môi trường xung quanh + Trình đơn chế độ môi trường xung quanh đã bị ẩn + Trình đơn chế độ môi trường xung quanh được hiển thị + Ẩn Âm lượng ổn định + Trình đơn âm lượng ổn định được hiển thị + Trình đơn âm lượng ổn định đã bị ẩn + + Ẩn Trợ giúp và phản hồi + Trình đơn trợ giúp và phản hồi đã bị ẩn + Trình đơn trợ giúp và phản hồi được hiển thị + + Ẩn Tốc độ phát + Trình đơn tốc độ phát đã bị ẩn + Trình đơn tốc độ phát được hiển thị + + Ẩn Khóa màn hình + Trình đơn khóa màn hình đã bị ẩn + Trình đơn khóa màn hình được hiển thị + + Ẩn Nghe nhạc trên YouTube Music + Trình đơn Nghe nhạc trên YouTube Music đã bị ẩn + Trình đơn Nghe nhạc trên YouTube Music được hiển thị + + Ẩn Bản âm thanh + Trình đơn bản âm thanh đã bị ẩn + Trình đơn bản âm thanh được hiển thị + - "Trình đơn bản âm thanh đã bị ẩn + "Trình đơn bản âm thanh đã bị ẩn Để hiển thị trình đơn bản âm thanh, hãy đổi 'Giả mạo luồng video' thành 'Android No SDK'" - - Ẩn Xem ở chế độ thực tế ảo - Trình đơn xem ở chế độ thực tế ảo đã bị ẩn - Trình đơn xem ở chế độ thực tế ảo được hiển thị - Ẩn Chất lượng video - Trình đơn chất lượng video đã bị ẩn - Trình đơn chất lượng video được hiển thị - Ẩn chân trình đơn Chất lượng video - Chân trình đơn chất lượng video đã bị ẩn - Chân trình đơn chất lượng video được hiển thị - - - Ẩn nút Tự động phát - Nút tự động phát đã bị ẩn - Nút tự động phát được hiển thị - - Ẩn nút Chú thích - Nút phụ đề đã bị ẩn - Nút phụ đề được hiển thị - Ẩn nút truyền - Nút Truyền đã bị ẩn - Nút Truyền được hiển thị - Ẩn nền điều khiển trình phát - Nền điều khiển trình phát bị ẩn - Nền điều khiển trình phát được hiện - Ẩn các nút Trước & Tiếp theo - Các nút đã bị ẩn - Các nút được hiển thị - - - Ẩn thẻ màn hình kết thúc - Thẻ màn hình kết thúc đã bị ẩn - Thẻ màn hình kết thúc được hiển thị - - - Tắt Chế độ môi trường khi toàn màn hình - Chế độ môi trường đã tắt - Chế độ môi trường đã bật - - - Ẩn thẻ thông tin - Thẻ thông tin đã bị ẩn - Thẻ thông tin được hiện - - - Tắt hiệu ứng cuộn số - Số cuộn không được chuyển động - Số cuộn được chuyển động - - - Ẩn thanh tiến trình video - Thanh tiến trình trong trình phát video đã bị ẩn - Thanh tiến trình trong trình phát video được hiển thị - - Ẩn thanh tiến trình trong hình thu nhỏ - Thanh tiến trình trong hình thu nhỏ video đã xem đã bị ẩn - Thanh tiến trình trong hình thu nhỏ video đã xem được hiển thị - - - Trình phát Shorts - Ẩn hoặc hiện các thành phần của trình phát Shorts - - Ẩn Shorts trong thẻ Trang chủ - Đã ẩn trong thẻ Trang chủ và video liên quan - Đã hiển thị trong thẻ Trang chủ và video liên quan - Ẩn Shorts trong kết quả tìm kiếm - Đã ẩn trong kết quả tìm kiếm - Được hiển thị trong kết quả tìm kiếm - - Ẩn Shorts trong thẻ Kênh đăng ký - Đã ẩn trong thẻ Kênh đăng ký - Đã hiển thị trong thẻ Kênh đăng ký - Ẩn Shorts trong nhật ký xem - Đã ẩn trong nhật ký xem - Đã hiển thị trong nhật ký xem - Ẩn nhãn \"Lồng tiếng tự động\" - Nhãn tự động lồng tiếng đã bị ẩn - Nhãn tự động lồng tiếng đang hiển thị - Ẩn nút \"Mua Super Thanks\" - Nút mua Super Thanks đã bị ẩn - Nút mua Super Thanks được hiển thị - Ẩn nút Hiệu ứng - Nút hiệu ứng đã bị ẩn - Nút hiệu ứng được hiển thị - Ẩn nút \"Màn hình xanh\" - Nút phông xanh đã bị ẩn - Nút phông xanh được hiển thị - Ẩn nút hashtag - Nút hashtag đã bị ẩn - Nút hashtag được hiển thị - - Ẩn nút Tham gia - Nút tham gia đã bị ẩn - Nút tham gia được hiển thị - Ẩn bản xem trước trực tiếp - Xem trước trực tiếp bị ẩn - Xem trước trực tiếp được hiển thị - Ẩn nhãn vị trí - Nhãn vị trí đã bị ẩn - Nhãn vị trí được hiển thị - Ẩn nút \"Bài đăng mới\" - Nút Bài đăng mới đã bị ẩn - Nút Bài đăng mới đang hiển thị - Ẩn các nút phủ lên khi tạm dừng - Các nút phủ lên khi tạm dừng đã bị ẩn - Các nút phủ lên khi tạm dừng được hiển thị - Ẩn xem trước bình luận - Xem trước bình luận đã bị ẩn - Xem trước bình luận được hiển thị - Ẩn nút \"Lưu nhạc\" - Nút lưu nhạc đã bị ẩn - Nút lưu nhạc được hiển thị - Ẩn đề xuất tìm kiếm - Đề xuất tìm kiếm đã bị ẩn - Đề xuất tìm kiếm được hiển thị - Ẩn nút Mua sắm - Nút mua sắm đã bị ẩn - Nút mua sắm được hiển thị - Ẩn nhãn dán - Nhãn dán đã bị ẩn - Nhãn dán được hiển thị - Ẩn nút Đăng ký - Nút đăng ký đã bị ẩn - Nút đăng ký được hiển thị - Ẩn sản phẩm được gắn thẻ - Sản phẩm được gắn thẻ đã bị ẩn - Sản phẩm được gắn thẻ được hiển thị - Ẩn nút Sắp diễn ra - Nút sắp diễn ra đã bị ẩn - Nút sắp diễn ra được hiển thị - Ẩn nút \"Dùng âm thanh này\" - Nút dùng âm thanh này đã bị ẩn - Nút dùng âm thanh này được hiển thị - Ẩn nút \"Sử dụng mẫu này\" - Nút sử dụng mẫu này đã bị ẩn - Nút sử dụng mẫu này được hiển thị - Ẩn hiệu ứng đài phun nút Thích - Hiệu ứng đài phun nút thích đã bị ẩn - Hiệu ứng đài phun nút thích được hiển thị - Ẩn nút Thích - Nút thích đã bị ẩn - Nút thích được hiển thị - Ẩn nút Không thích - Nút không thích đã bị ẩn - Nút không thích được hiển thị - Ẩn nút Bình luận - Nút bình luận đã bị ẩn - Nút bình luận được hiển thị - - Ẩn nút Chia sẻ - Nút chia sẻ đã bị ẩn - Nút chia sẻ được hiển thị - - Ẩn nút Phối lại - Nút phối lại đã bị ẩn - Nút phối lại được hiển thị - Ẩn nút âm thanh - Nút âm thanh đã bị ẩn - Nút âm thanh được hiển thị - Ẩn bảng thông tin - Bảng thông tin đã bị ẩn - Bảng thông tin được hiển thị - Ẩn nút kênh - Nút kênh đã bị ẩn - Nút kênh được hiển thị - Ẩn tiêu đề video - Tiêu đề video đã bị ẩn - Tiêu đề video được hiển thị - Ẩn nhãn siêu dữ liệu âm thanh - Nhãn siêu dữ liệu âm thanh đã bị ẩn - Nhãn siêu dữ liệu âm thanh được hiển thị - Ẩn nhãn liên kết video - Nhãn liên kết tới video đầy đủ đã bị ẩn - Nhãn liên kết tới video đầy đủ được hiển thị - Ẩn thanh điều hướng - Thanh điều hướng đã bị ẩn - Thanh điều hướng được hiển thị - - - Ẩn video được đề xuất ở màn hình kết thúc - "Video được đề xuất ở màn hình kết thúc đã bị ẩn khi tắt tự động phát + + Ẩn Xem ở chế độ thực tế ảo + Trình đơn xem ở chế độ thực tế ảo đã bị ẩn + Trình đơn xem ở chế độ thực tế ảo được hiển thị + Ẩn Chất lượng video + Trình đơn chất lượng video đã bị ẩn + Trình đơn chất lượng video được hiển thị + Ẩn chân trình đơn Chất lượng video + Chân trình đơn chất lượng video đã bị ẩn + Chân trình đơn chất lượng video được hiển thị + + + Ẩn nút Tự động phát + Nút tự động phát đã bị ẩn + Nút tự động phát được hiển thị + + Ẩn nút Chú thích + Nút phụ đề đã bị ẩn + Nút phụ đề được hiển thị + Ẩn nút truyền + Nút Truyền đã bị ẩn + Nút Truyền được hiển thị + Ẩn nền điều khiển trình phát + Nền điều khiển trình phát bị ẩn + Nền điều khiển trình phát được hiện + Ẩn các nút Trước & Tiếp theo + Các nút đã bị ẩn + Các nút được hiển thị + + + Ẩn thẻ màn hình kết thúc + Thẻ màn hình kết thúc đã bị ẩn + Thẻ màn hình kết thúc được hiển thị + + + Tắt Chế độ môi trường khi toàn màn hình + Chế độ môi trường đã tắt + Chế độ môi trường đã bật + + + Ẩn thẻ thông tin + Thẻ thông tin đã bị ẩn + Thẻ thông tin được hiện + + + Tắt hiệu ứng cuộn số + Số cuộn không được chuyển động + Số cuộn được chuyển động + + + Ẩn thanh tiến trình video + Thanh tiến trình trong trình phát video đã bị ẩn + Thanh tiến trình trong trình phát video được hiển thị + + Ẩn thanh tiến trình trong hình thu nhỏ + Thanh tiến trình trong hình thu nhỏ video đã xem đã bị ẩn + Thanh tiến trình trong hình thu nhỏ video đã xem được hiển thị + + + Trình phát Shorts + Ẩn hoặc hiện các thành phần của trình phát Shorts + + Ẩn Shorts trong thẻ Trang chủ + Đã ẩn trong thẻ Trang chủ và video liên quan + Đã hiển thị trong thẻ Trang chủ và video liên quan + Ẩn Shorts trong kết quả tìm kiếm + Đã ẩn trong kết quả tìm kiếm + Được hiển thị trong kết quả tìm kiếm + + Ẩn Shorts trong thẻ Kênh đăng ký + Đã ẩn trong thẻ Kênh đăng ký + Đã hiển thị trong thẻ Kênh đăng ký + Ẩn Shorts trong nhật ký xem + Đã ẩn trong nhật ký xem + Đã hiển thị trong nhật ký xem + Ẩn nhãn \"Lồng tiếng tự động\" + Nhãn tự động lồng tiếng đã bị ẩn + Nhãn tự động lồng tiếng đang hiển thị + Ẩn nút \"Mua Super Thanks\" + Nút mua Super Thanks đã bị ẩn + Nút mua Super Thanks được hiển thị + Ẩn nút Hiệu ứng + Nút hiệu ứng đã bị ẩn + Nút hiệu ứng được hiển thị + Ẩn nút \"Màn hình xanh\" + Nút phông xanh đã bị ẩn + Nút phông xanh được hiển thị + Ẩn nút hashtag + Nút hashtag đã bị ẩn + Nút hashtag được hiển thị + + Ẩn nút Tham gia + Nút tham gia đã bị ẩn + Nút tham gia được hiển thị + Ẩn bản xem trước trực tiếp + Xem trước trực tiếp bị ẩn + Xem trước trực tiếp được hiển thị + Ẩn nhãn vị trí + Nhãn vị trí đã bị ẩn + Nhãn vị trí được hiển thị + Ẩn nút \"Bài đăng mới\" + Nút Bài đăng mới đã bị ẩn + Nút Bài đăng mới đang hiển thị + Ẩn các nút phủ lên khi tạm dừng + Các nút phủ lên khi tạm dừng đã bị ẩn + Các nút phủ lên khi tạm dừng được hiển thị + Ẩn xem trước bình luận + Xem trước bình luận đã bị ẩn + Xem trước bình luận được hiển thị + Ẩn nút \"Lưu nhạc\" + Nút lưu nhạc đã bị ẩn + Nút lưu nhạc được hiển thị + Ẩn đề xuất tìm kiếm + Đề xuất tìm kiếm đã bị ẩn + Đề xuất tìm kiếm được hiển thị + Ẩn nút Mua sắm + Nút mua sắm đã bị ẩn + Nút mua sắm được hiển thị + Ẩn nhãn dán + Nhãn dán đã bị ẩn + Nhãn dán được hiển thị + Ẩn nút Đăng ký + Nút đăng ký đã bị ẩn + Nút đăng ký được hiển thị + Ẩn sản phẩm được gắn thẻ + Sản phẩm được gắn thẻ đã bị ẩn + Sản phẩm được gắn thẻ được hiển thị + Ẩn nút Sắp diễn ra + Nút sắp diễn ra đã bị ẩn + Nút sắp diễn ra được hiển thị + Ẩn nút \"Dùng âm thanh này\" + Nút dùng âm thanh này đã bị ẩn + Nút dùng âm thanh này được hiển thị + Ẩn nút \"Sử dụng mẫu này\" + Nút sử dụng mẫu này đã bị ẩn + Nút sử dụng mẫu này được hiển thị + Ẩn hiệu ứng đài phun nút Thích + Hiệu ứng đài phun nút thích đã bị ẩn + Hiệu ứng đài phun nút thích được hiển thị + Ẩn nút Thích + Nút thích đã bị ẩn + Nút thích được hiển thị + Ẩn nút Không thích + Nút không thích đã bị ẩn + Nút không thích được hiển thị + Ẩn nút Bình luận + Nút bình luận đã bị ẩn + Nút bình luận được hiển thị + + Ẩn nút Chia sẻ + Nút chia sẻ đã bị ẩn + Nút chia sẻ được hiển thị + + Ẩn nút Phối lại + Nút phối lại đã bị ẩn + Nút phối lại được hiển thị + Ẩn nút âm thanh + Nút âm thanh đã bị ẩn + Nút âm thanh được hiển thị + Ẩn bảng thông tin + Bảng thông tin đã bị ẩn + Bảng thông tin được hiển thị + Ẩn nút kênh + Nút kênh đã bị ẩn + Nút kênh được hiển thị + Ẩn tiêu đề video + Tiêu đề video đã bị ẩn + Tiêu đề video được hiển thị + Ẩn nhãn siêu dữ liệu âm thanh + Nhãn siêu dữ liệu âm thanh đã bị ẩn + Nhãn siêu dữ liệu âm thanh được hiển thị + Ẩn nhãn liên kết video + Nhãn liên kết tới video đầy đủ đã bị ẩn + Nhãn liên kết tới video đầy đủ được hiển thị + Ẩn thanh điều hướng + Thanh điều hướng đã bị ẩn + Thanh điều hướng được hiển thị + + + Ẩn video được đề xuất ở màn hình kết thúc + "Video được đề xuất ở màn hình kết thúc đã bị ẩn khi tắt tự động phát Có thể thay đổi Tự động phát trong phần cài đặt YouTube: Cài đặt → Phát → Tự động phát video tiếp theo" - Video được đề xuất ở màn hình kết thúc được hiển thị - - - Ẩn lớp phủ video liên quan - Lớp phủ video liên quan ở chế độ toàn màn hình đã bị ẩn - Lớp phủ video liên quan ở chế độ toàn màn hình được hiển thị - - - Ẩn dấu thời gian video - Dấu thời gian đã bị ẩn - Dấu thời gian được hiển thị - - - Ẩn bảng tự bật lên trên trình phát - Bảng bật lên trên trình phát đã bị ẩn - Bảng bật lên trên trình phát được hiển thị - - - Thoát chế độ toàn màn hình khi kết thúc video - Tắt - Chế độ dọc - Chế độ ngang - Chế độ dọc và ngang - - - Mở video ở chế độ toàn màn hình dọc - Video mở ở chế độ toàn màn hình - Video không mở ở chế độ toàn màn hình - - - Độ mờ của lớp phủ trình phát - Giá trị độ mờ của lớp phủ trình phát trong khoảng từ 0 đến 100, trong đó 0 là trong suốt - Độ phủ mờ trình phát phải nằm giữa 0-100 - - - - Không thể hiện số Dislike (API hết thời gian chờ) - Lượt không thích không khả dụng ( trạng thái %d) - Không thể hiện số dislike (đạt giới hạn API ứng dụng) - Số lượt không thích không khả dụng (%s) - - Tải lại video để bỏ phiếu bằng ReturnYouTubeDislike - - Đã ẩn bởi chủ sở hữu - Số lượt không thích được hiển thị - Số lượt không thích không được hiển thị - Hiện số lượt không thích trong Shorts - "Số lượt không thích trên Shorts được hiển thị + Video được đề xuất ở màn hình kết thúc được hiển thị + + + Ẩn lớp phủ video liên quan + Lớp phủ video liên quan ở chế độ toàn màn hình đã bị ẩn + Lớp phủ video liên quan ở chế độ toàn màn hình được hiển thị + + + Ẩn dấu thời gian video + Dấu thời gian đã bị ẩn + Dấu thời gian được hiển thị + + + Ẩn bảng tự bật lên trên trình phát + Bảng bật lên trên trình phát đã bị ẩn + Bảng bật lên trên trình phát được hiển thị + + + Thoát chế độ toàn màn hình khi kết thúc video + Tắt + Chế độ dọc + Chế độ ngang + Chế độ dọc và ngang + + + Mở video ở chế độ toàn màn hình dọc + Video mở ở chế độ toàn màn hình + Video không mở ở chế độ toàn màn hình + + + Độ mờ của lớp phủ trình phát + Giá trị độ mờ của lớp phủ trình phát trong khoảng từ 0 đến 100, trong đó 0 là trong suốt + Độ phủ mờ trình phát phải nằm giữa 0-100 + + + + Không thể hiện số Dislike (API hết thời gian chờ) + Lượt không thích không khả dụng ( trạng thái %d) + Không thể hiện số dislike (đạt giới hạn API ứng dụng) + Số lượt không thích không khả dụng (%s) + + Tải lại video để bỏ phiếu bằng ReturnYouTubeDislike + + Đã ẩn bởi chủ sở hữu + Số lượt không thích được hiển thị + Số lượt không thích không được hiển thị + Hiện số lượt không thích trong Shorts + "Số lượt không thích trên Shorts được hiển thị Hạn chế: Số lượt không thích có thể không xuất hiện ở chế độ ẩn danh" - Số lượt không thích trên Shorts không được hiển thị - Số lượt không thích theo phần trăm - Số lượt không thích được hiển thị dưới dạng phần trăm - Số lượt không thích được hiển thị dưới dạng số - - Nút Thích thu gọn - Nút thích được thiết kế để tối ưu độ rộng - Nút thích được thiết kế để tối ưu ngoại hình tốt nhất - Hiện lượt thích ước tính - Video có lượt thích bị tắt hiển thị số lượt thích ước tính - Không hiển thị lượt thích ước tính - Hiện thông báo ngắn nếu API không khả dụng - Thông báo ngắn sẽ hiện nếu Return YouTube Dislike không khả dụng - Thông báo ngắn không hiện nếu Return YouTube Dislike không khả dụng - Dữ liệu được cung cấp bởi API Return YouTube Dislike. Nhấn vào đây để tìm hiểu thêm - - Thống kê API ReturnYouTubeDislike của thiết bị này - Thời gian phản hồi API, trung binh - Thời gian phản hồi API, tối thiểu - Thời gian phản hồi API, tối đa - Thời gian phản hồi API, video gần nhất - Tạm thời không thể hiển thị số lượt không thích - Đang bị giới hạn API ứng dụng - Số lượt truy vấn API, số lần gọi - Không gọi mạng lần nào - %d lần gọi mạng - Số lượt truy vấn API, số lần hết hạn - Không gọi mạng lần nào bị hết hạn - %d lần gọi mạng bị hết hạn - Giới hạn truy cập API ứng dụng - Chưa từng bị giới hạn API - Đã bị giới hạn API %d lần - %d mili-giây - - - Bật thanh tìm kiếm rộng - Thanh tìm kiếm rộng đã bật - Thanh tìm kiếm rộng đã tắt - - - Bật hình thu nhỏ chất lượng cao - Hình thu nhỏ khi tua có chất lượng cao - Hình thu nhỏ khi tua có chất lượng trung bình - Hình thu nhỏ khi tua toàn màn hình có chất lượng cao - Hình thu nhỏ khi tua toàn màn hình có chất lượng trung bình - "Tính năng này cũng sẽ khôi phục hình thu nhỏ trên luồng trực tiếp không có hình thu nhỏ thanh tiến trình. + Số lượt không thích trên Shorts không được hiển thị + Số lượt không thích theo phần trăm + Số lượt không thích được hiển thị dưới dạng phần trăm + Số lượt không thích được hiển thị dưới dạng số + + Nút Thích thu gọn + Nút thích được thiết kế để tối ưu độ rộng + Nút thích được thiết kế để tối ưu ngoại hình tốt nhất + Hiện lượt thích ước tính + Video có lượt thích bị tắt hiển thị số lượt thích ước tính + Không hiển thị lượt thích ước tính + Hiện thông báo ngắn nếu API không khả dụng + Thông báo ngắn sẽ hiện nếu Return YouTube Dislike không khả dụng + Thông báo ngắn không hiện nếu Return YouTube Dislike không khả dụng + Dữ liệu được cung cấp bởi API Return YouTube Dislike. Nhấn vào đây để tìm hiểu thêm + + Thống kê API ReturnYouTubeDislike của thiết bị này + Thời gian phản hồi API, trung binh + Thời gian phản hồi API, tối thiểu + Thời gian phản hồi API, tối đa + Thời gian phản hồi API, video gần nhất + Tạm thời không thể hiển thị số lượt không thích - Đang bị giới hạn API ứng dụng + Số lượt truy vấn API, số lần gọi + Không gọi mạng lần nào + %d lần gọi mạng + Số lượt truy vấn API, số lần hết hạn + Không gọi mạng lần nào bị hết hạn + %d lần gọi mạng bị hết hạn + Giới hạn truy cập API ứng dụng + Chưa từng bị giới hạn API + Đã bị giới hạn API %d lần + %d mili-giây + + + Bật thanh tìm kiếm rộng + Thanh tìm kiếm rộng đã bật + Thanh tìm kiếm rộng đã tắt + + + Bật hình thu nhỏ chất lượng cao + Hình thu nhỏ khi tua có chất lượng cao + Hình thu nhỏ khi tua có chất lượng trung bình + Hình thu nhỏ khi tua toàn màn hình có chất lượng cao + Hình thu nhỏ khi tua toàn màn hình có chất lượng trung bình + "Tính năng này cũng sẽ khôi phục hình thu nhỏ trên luồng trực tiếp không có hình thu nhỏ thanh tiến trình. Hình thu nhỏ thanh tiến trình sẽ sử dụng cùng chất lượng với video hiện tại. Hoạt động tốt nhất với chất lượng video 720p trở xuống và khi sử dụng kết nối internet tốc độ cao." - Khôi phục hình thu nhỏ thanh tiến trình cũ - Hình thu nhỏ sẽ xuất hiện phía trên thanh tiến trình - Hình thu nhỏ sẽ xuất hiện trong chế độ toàn màn hình - - - Bật SponsorBlock - SponsorBlock là một hệ thống dựa trên đóng góp bởi cộng đồng để bỏ qua các phần gây khó chịu trong video YouTube - Giao diện - Hiện nút bỏ phiếu - Nút bỏ phiếu phân đoạn được hiển thị - Nút bỏ phiếu phân đoạn không được hiển thị - Dùng bố cục vuông - Các nút và điều khiển có hình vuông - Các nút và điều khiển được bo tròn - - Dùng nút Bỏ qua thu gọn - Nút Bỏ qua được thiết kế để tối ưu độ rộng - Nút bỏ qua phân đoạn được thiết kế để tối ưu ngoại hình tốt nhất - Tự động ẩn nút Bỏ qua - Nút bỏ qua sẽ ẩn sau vài giây - Nút bỏ qua được hiển thị cho toàn bộ phân đoạn - Thời gian hiển thị nút bỏ qua - Thời gian hiển thị nút bỏ qua và nút bỏ qua đến phần nổi bật trước khi tự động ẩn - Hiện thông báo ngắn hoàn tác bỏ qua - Thông báo ngắn sẽ hiện mỗi khi tự động bỏ qua một phân đoạn.\n\nChạm vào thông báo đó để hoàn tác bỏ qua - Thông báo ngắn không hiện - Thời gian thông báo ngắn tồn tại - Thời gian thông báo ngắn tồn tại sau khi bỏ qua phân đoạn - 1 giây - 2 giây - 3 giây - 4 giây - 5 giây - 6 giây - 7 giây - 8 giây - 9 giây - 10 giây - Hiện thời lượng video không có phân đoạn - Thời lượng video đã trừ đi tất cả các phân đoạn được hiển thị trên thanh tiến trình - Thời lượng đầy đủ của video được hiển thị - Tạo phân đoạn mới - Hiện nút Tạo phân đoạn mới - Nút tạo phân đoạn mới đã được hiển thị - Nút tạo phân đoạn mới không được hiển thị - Điều chỉnh bước tua của phân đoạn mới - Số mili-giây mà các nút điều chỉnh thời gian sẽ tua khi tạo phân đoạn mới - Giá trị phải là một số dương - Xem hướng dẫn - Hướng dẫn bao gồm các quy tắc và mẹo về cách tạo phân đoạn mới - Thực hiện theo các hướng dẫn - Đọc hướng dẫn SponsorBlock trước khi tạo phân đoạn mới - Đã đọc - Hiện cho tôi - Chung - Hiện thông báo ngắn nếu API không khả dụng - Thông báo ngắn sẽ hiện nếu SponsorBlock không khả dụng - Thông báo ngắn không hiện nếu SponsorBlock không khả dụng - Bật theo dõi số lần bỏ qua - Cho phép bảng xếp hạng SponsorBlock biết đã tiết kiệm được bao nhiêu thời gian. Một tin nhắn được gửi đến bảng xếp hạng mỗi khi một phân đoạn bị bỏ qua - Theo dõi số lần bỏ qua không được bật - Thời lượng phân đoạn tối thiểu - Các phân đoạn ngắn hơn giá trị này (bằng giây) sẽ không được hiển thị hoặc bị bỏ qua - Thời lượng không hợp lệ - Định danh người dùng riêng tư của bạn - Mã này nên được giữ riêng tư. Nó giống như mật khẩu và không nên được chia sẻ với bất kỳ ai. Nếu ai đó có nó, họ có thể mạo danh bạn - Định danh người dùng riêng tư phải dài ít nhất 30 ký tự - Thay đổi URL API - Địa chỉ SponsorBlock dùng để tạo lời gọi đến máy chủ - Đặt lại URL API - URL API không hợp lệ - URL API đã thay đổi - Nhập/Xuất cài đặt - Sao chép - Cấu hình JSON SponsorBlock của bạn có thể được nhập/xuất vào ReVanced và các nền tảng SponsorBlock khác - Cấu hình JSON SponsorBlock của bạn có thể được nhập/xuất vào ReVanced và các nền tảng SponsorBlock khác. Điều này bao gồm định danh người dùng riêng tư của bạn. Hãy thận trọng khi chia sẻ - Cài đặt đã được nhập thành công - Nhập thất bại: %s - Xuất thất bại: %s - "Cài đặt của bạn có chứa ID người dùng SponsorBlock riêng tư. + Khôi phục hình thu nhỏ thanh tiến trình cũ + Hình thu nhỏ sẽ xuất hiện phía trên thanh tiến trình + Hình thu nhỏ sẽ xuất hiện trong chế độ toàn màn hình + + + Bật SponsorBlock + SponsorBlock là một hệ thống dựa trên đóng góp bởi cộng đồng để bỏ qua các phần gây khó chịu trong video YouTube + Giao diện + Hiện nút bỏ phiếu + Nút bỏ phiếu phân đoạn được hiển thị + Nút bỏ phiếu phân đoạn không được hiển thị + Dùng bố cục vuông + Các nút và điều khiển có hình vuông + Các nút và điều khiển được bo tròn + + Dùng nút Bỏ qua thu gọn + Nút Bỏ qua được thiết kế để tối ưu độ rộng + Nút bỏ qua phân đoạn được thiết kế để tối ưu ngoại hình tốt nhất + Tự động ẩn nút Bỏ qua + Nút bỏ qua sẽ ẩn sau vài giây + Nút bỏ qua được hiển thị cho toàn bộ phân đoạn + Thời gian hiển thị nút bỏ qua + Thời gian hiển thị nút bỏ qua và nút bỏ qua đến phần nổi bật trước khi tự động ẩn + Hiện thông báo ngắn hoàn tác bỏ qua + Thông báo ngắn sẽ hiện mỗi khi tự động bỏ qua một phân đoạn.\n\nChạm vào thông báo đó để hoàn tác bỏ qua + Thông báo ngắn không hiện + Thời gian thông báo ngắn tồn tại + Thời gian thông báo ngắn tồn tại sau khi bỏ qua phân đoạn + 1 giây + 2 giây + 3 giây + 4 giây + 5 giây + 6 giây + 7 giây + 8 giây + 9 giây + 10 giây + Hiện thời lượng video không có phân đoạn + Thời lượng video đã trừ đi tất cả các phân đoạn được hiển thị trên thanh tiến trình + Thời lượng đầy đủ của video được hiển thị + Tạo phân đoạn mới + Hiện nút Tạo phân đoạn mới + Nút tạo phân đoạn mới đã được hiển thị + Nút tạo phân đoạn mới không được hiển thị + Điều chỉnh bước tua của phân đoạn mới + Số mili-giây mà các nút điều chỉnh thời gian sẽ tua khi tạo phân đoạn mới + Giá trị phải là một số dương + Xem hướng dẫn + Hướng dẫn bao gồm các quy tắc và mẹo về cách tạo phân đoạn mới + Thực hiện theo các hướng dẫn + Đọc hướng dẫn SponsorBlock trước khi tạo phân đoạn mới + Đã đọc + Hiện cho tôi + Chung + Hiện thông báo ngắn nếu API không khả dụng + Thông báo ngắn sẽ hiện nếu SponsorBlock không khả dụng + Thông báo ngắn không hiện nếu SponsorBlock không khả dụng + Bật theo dõi số lần bỏ qua + Cho phép bảng xếp hạng SponsorBlock biết đã tiết kiệm được bao nhiêu thời gian. Một tin nhắn được gửi đến bảng xếp hạng mỗi khi một phân đoạn bị bỏ qua + Theo dõi số lần bỏ qua không được bật + Thời lượng phân đoạn tối thiểu + Các phân đoạn ngắn hơn giá trị này (bằng giây) sẽ không được hiển thị hoặc bị bỏ qua + Thời lượng không hợp lệ + Định danh người dùng riêng tư của bạn + Mã này nên được giữ riêng tư. Nó giống như mật khẩu và không nên được chia sẻ với bất kỳ ai. Nếu ai đó có nó, họ có thể mạo danh bạn + Định danh người dùng riêng tư phải dài ít nhất 30 ký tự + Thay đổi URL API + Địa chỉ SponsorBlock dùng để tạo lời gọi đến máy chủ + Đặt lại URL API + URL API không hợp lệ + URL API đã thay đổi + Nhập/Xuất cài đặt + Sao chép + Cấu hình JSON SponsorBlock của bạn có thể được nhập/xuất vào ReVanced và các nền tảng SponsorBlock khác + Cấu hình JSON SponsorBlock của bạn có thể được nhập/xuất vào ReVanced và các nền tảng SponsorBlock khác. Điều này bao gồm định danh người dùng riêng tư của bạn. Hãy thận trọng khi chia sẻ + Cài đặt đã được nhập thành công + Nhập thất bại: %s + Xuất thất bại: %s + "Cài đặt của bạn có chứa ID người dùng SponsorBlock riêng tư. ID người dùng của bạn giống như mật khẩu và không bao giờ được chia sẻ." - Không hiện lại nữa - Thay đổi hành vi phân đoạn - Nhà tài trợ - Quảng cáo trả phí, giới thiệu trả phí và quảng cáo trực tiếp. Không phải tự quảng cáo hoặc quảng bá miễn phí cho các tổ chức/nhà sáng tạo/trang web/sản phẩm mà họ yêu thích - Không được trả phí / Tự quảng cáo - Tương tự như \"Nhà tài trợ\" nhưng không có lợi nhuận hoặc tự quảng bá. Bao gồm các phần về sản phẩm, quyên góp hoặc thông tin về những người họ đã hợp tác cùng - Nhắc nhở tương tác (Đăng ký) - Một lời nhắc ngắn rằng hãy thích, đăng ký hoặc theo dõi họ ở giữa nội dung. Nếu nó dài hoặc về một điều gì đó cụ thể, nó nên phân loại vào Tự quảng cáo - Nổi bật - Phần video mà hầu hết mọi người đang tìm kiếm - Gián đoạn / Giới thiệu - Một khoảng thời gian không có nội dung thực tế. Có thể là tạm dừng, khung hình tĩnh hoặc hoạt ảnh lặp lại. Không bao gồm các phần chuyển cảnh chứa thông tin - Màn hình kết thúc / Danh đề - Danh đề hoặc khi màn hình kết thúc của YouTube xuất hiện. Không dành cho phần kết có chứa thông tin - Mở đầu / Chào hỏi - Đoạn giới thiệu có lời dẫn cho video sắp tới, phần chào hỏi và tạm biệt. Không bao gồm các phần bổ sung nội dung khác - Xem trước / Tóm tắt - Tuyển tập các đoạn cắt cho thấy những gì sắp diễn ra hoặc đã xảy ra trong video hoặc trong các video khác của một sê-ri, trong đó tất cả thông tin được lặp lại ở nơi khác - Lạc đề / Câu đùa - Các cảnh phụ hoặc trò đùa không cần thiết để hiểu nội dung chính của video. Không bao gồm các phần cung cấp bối cảnh hoặc chi tiết nền - Âm nhạc: Phần không phải âm nhạc - Chỉ dành cho video âm nhạc. Phần của video âm nhạc nhưng không có nhạc, mà cũng không được phân loại vào danh mục khác - Bỏ qua - Nổi bật - Bỏ qua nhà tài trợ - Bỏ qua quảng cáo - Bỏ qua tương tác - Bỏ qua đến phần nổi bật - Bỏ qua giới thiệu - Bỏ qua phần gián đoạn - Bỏ qua phần gián đoạn - Bỏ qua kết thúc - Bỏ qua đoạn mở đầu - Bỏ qua xem trước - Bỏ qua xem trước - Bỏ qua tóm tắt - Bỏ qua đoạn lạc đề - Bỏ qua phần không nhạc - Bỏ qua phân đoạn - Đã bỏ qua nhà tài trợ - Đã bỏ qua tự quảng cáo - Đã bỏ qua lời nhắc phiền toái - Đã bỏ qua đến phần nổi bật - Đã bỏ qua giới thiệu - Đã bỏ qua phần gián đoạn - Đã bỏ qua phần gián đoạn - Đã bỏ qua kết thúc - Đã bỏ qua đoạn mở đầu - Đã bỏ qua xem trước - Đã bỏ qua xem trước - Đã bỏ qua tóm tắt - Đã bỏ qua đoạn lạc đề - Đã bỏ qua phần không phải âm nhạc - Đã bỏ qua phân đoạn chưa gửi - Đã bỏ qua nhiều phân đoạn - Tự động bỏ qua - Tự động bỏ qua một lần - Hiện nút Bỏ qua - Đã hiển thị trên thanh tiến trình - Tắt - Không thể gửi phân đoạn: %s - SponsorBlock bị sập tạm thời - Không thể gửi phân đoạn (trạng thái: %1$d %2$s) - Không thể gửi phân đoạn. Giới hạn tỷ lệ (quá nhiều từ cùng một người dùng hoặc IP) - Không thể gửi phân đoạn: %s - "Không thể gửi phân đoạn. + Không hiện lại nữa + Thay đổi hành vi phân đoạn + Nhà tài trợ + Quảng cáo trả phí, giới thiệu trả phí và quảng cáo trực tiếp. Không phải tự quảng cáo hoặc quảng bá miễn phí cho các tổ chức/nhà sáng tạo/trang web/sản phẩm mà họ yêu thích + Không được trả phí / Tự quảng cáo + Tương tự như \"Nhà tài trợ\" nhưng không có lợi nhuận hoặc tự quảng bá. Bao gồm các phần về sản phẩm, quyên góp hoặc thông tin về những người họ đã hợp tác cùng + Nhắc nhở tương tác (Đăng ký) + Một lời nhắc ngắn rằng hãy thích, đăng ký hoặc theo dõi họ ở giữa nội dung. Nếu nó dài hoặc về một điều gì đó cụ thể, nó nên phân loại vào Tự quảng cáo + Nổi bật + Phần video mà hầu hết mọi người đang tìm kiếm + Gián đoạn / Giới thiệu + Một khoảng thời gian không có nội dung thực tế. Có thể là tạm dừng, khung hình tĩnh hoặc hoạt ảnh lặp lại. Không bao gồm các phần chuyển cảnh chứa thông tin + Màn hình kết thúc / Danh đề + Danh đề hoặc khi màn hình kết thúc của YouTube xuất hiện. Không dành cho phần kết có chứa thông tin + Mở đầu / Chào hỏi + Đoạn giới thiệu có lời dẫn cho video sắp tới, phần chào hỏi và tạm biệt. Không bao gồm các phần bổ sung nội dung khác + Xem trước / Tóm tắt + Tuyển tập các đoạn cắt cho thấy những gì sắp diễn ra hoặc đã xảy ra trong video hoặc trong các video khác của một sê-ri, trong đó tất cả thông tin được lặp lại ở nơi khác + Lạc đề / Câu đùa + Các cảnh phụ hoặc trò đùa không cần thiết để hiểu nội dung chính của video. Không bao gồm các phần cung cấp bối cảnh hoặc chi tiết nền + Âm nhạc: Phần không phải âm nhạc + Chỉ dành cho video âm nhạc. Phần của video âm nhạc nhưng không có nhạc, mà cũng không được phân loại vào danh mục khác + Bỏ qua + Nổi bật + Bỏ qua nhà tài trợ + Bỏ qua quảng cáo + Bỏ qua tương tác + Bỏ qua đến phần nổi bật + Bỏ qua giới thiệu + Bỏ qua phần gián đoạn + Bỏ qua phần gián đoạn + Bỏ qua kết thúc + Bỏ qua đoạn mở đầu + Bỏ qua xem trước + Bỏ qua xem trước + Bỏ qua tóm tắt + Bỏ qua đoạn lạc đề + Bỏ qua phần không nhạc + Bỏ qua phân đoạn + Đã bỏ qua nhà tài trợ + Đã bỏ qua tự quảng cáo + Đã bỏ qua lời nhắc phiền toái + Đã bỏ qua đến phần nổi bật + Đã bỏ qua giới thiệu + Đã bỏ qua phần gián đoạn + Đã bỏ qua phần gián đoạn + Đã bỏ qua kết thúc + Đã bỏ qua đoạn mở đầu + Đã bỏ qua xem trước + Đã bỏ qua xem trước + Đã bỏ qua tóm tắt + Đã bỏ qua đoạn lạc đề + Đã bỏ qua phần không phải âm nhạc + Đã bỏ qua phân đoạn chưa gửi + Đã bỏ qua nhiều phân đoạn + Tự động bỏ qua + Tự động bỏ qua một lần + Hiện nút Bỏ qua + Đã hiển thị trên thanh tiến trình + Tắt + Không thể gửi phân đoạn: %s + SponsorBlock bị sập tạm thời + Không thể gửi phân đoạn (trạng thái: %1$d %2$s) + Không thể gửi phân đoạn. Giới hạn tỷ lệ (quá nhiều từ cùng một người dùng hoặc IP) + Không thể gửi phân đoạn: %s + "Không thể gửi phân đoạn. Đã tồn tại" - Phân đoạn được gửi thành công - - SponsorBlock tạm thời không khả dụng (hết thời gian chờ API) - SponsorBlock tạm thời không khả dụng (trạng thái %d) - SponsorBlock tạm thời không khả dụng - Không thể bỏ phiếu phân đoạn (hết thời gian chờ API) - Không thể bỏ phiếu phân đoạn (trạng thái: %1$d %2$s) - Không thể bỏ phiếu cho phân đoạn: %s - Ủng hộ - Phản đối - Thay đổi danh mục - Không có phân đoạn nào để bỏ phiếu - - %1$s đến %2$s - Chọn danh mục phân đoạn - Danh mục này bị tắt trong cài đặt. Bật danh mục để gửi. - Tạo phân đoạn SponsorBlock mới - Đặt %s là bắt đầu hoặc là kết thúc của một phân đoạn mới? - Bắt đầu - Kết thúc - Bây giờ - Thời gian phân đoạn bắt đầu lúc - Thời gian phân đoạn kết thúc lúc - Thời gian đã đúng chưa? - "Phân đoạn này bắt đầu từ + Phân đoạn được gửi thành công + + SponsorBlock tạm thời không khả dụng (hết thời gian chờ API) + SponsorBlock tạm thời không khả dụng (trạng thái %d) + SponsorBlock tạm thời không khả dụng + Không thể bỏ phiếu phân đoạn (hết thời gian chờ API) + Không thể bỏ phiếu phân đoạn (trạng thái: %1$d %2$s) + Không thể bỏ phiếu cho phân đoạn: %s + Ủng hộ + Phản đối + Thay đổi danh mục + Không có phân đoạn nào để bỏ phiếu + + %1$s đến %2$s + Chọn danh mục phân đoạn + Danh mục này bị tắt trong cài đặt. Bật danh mục để gửi. + Tạo phân đoạn SponsorBlock mới + Đặt %s là bắt đầu hoặc là kết thúc của một phân đoạn mới? + Bắt đầu + Kết thúc + Bây giờ + Thời gian phân đoạn bắt đầu lúc + Thời gian phân đoạn kết thúc lúc + Thời gian đã đúng chưa? + "Phân đoạn này bắt đầu từ %1$s đến @@ -1281,46 +1280,46 @@ ID người dùng của bạn giống như mật khẩu và không bao giờ đ (%3$s) Bạn đã sẵn sàng gửi?" - Thời gian bắt đầu phải trước thời gian kết thúc - Đánh dấu hai vị trí trên thanh thời gian trước - Hãy xem trước phân đoạn để đảm bảo rằng nó bỏ qua suôn sẻ - Chỉnh sửa thời gian của phân đoạn thủ công - Bạn có muốn thay đổi thời gian bắt đầu hoặc kết thúc của phân đoạn không? - Thời gian đã đặt không hợp lệ - Thống kê - - Số liệu thống kê tạm thời không khả dụng (API ngừng hoạt động) - Đang tải... - SponsorBlock bị vô hiệu hoá - Tên người dùng của bạn: <b>%s</b> - Nhấn vào đây để thay đổi tên người dùng của bạn - Không thay đổi được tên người dùng: Trạng thái: %1$d %2$s - Tên người dùng đã được thay đổi thành công - Danh tiếng của bạn là <b>%.2f</b> - Bạn đã tạo <b>%s</b> phân đoạn - Nhấn vào đây để xem các phân đoạn của bạn - Bảng xếp hạng SponsorBlock - Bạn đã giúp mọi người bỏ qua <b>%s</b> phân đoạn - Nhấn vào đây để xem số liệu thống kê toàn cầu và những người đóng góp hàng đầu - Tương đương với <b>%s</b> trong cuộc đời họ.<br>Nhấn vào đây để xem bảng xếp hạng - Bạn đã bỏ qua <b>%s</b> phân đoạn - Tổng thời gian là <b>%s</b> - Có chắc muốn đặt lại bộ đến phân đoạn đã bỏ qua? - %1$s giờ %2$s phút - %1$s phút %2$s giây - %s giây - Độ mờ: - Màu: - Giới thiệu - Dữ liệu được cung cấp bởi API SponsorBlock. Nhấn vào đây để tìm hiểu thêm và xem các bản tải cho các nền tảng khác - - - Hình thức bố cục - Mặc định - Điện thoại - Máy tính bảng - Màn hình ô tô - "Thay đổi bao gồm: + Thời gian bắt đầu phải trước thời gian kết thúc + Đánh dấu hai vị trí trên thanh thời gian trước + Hãy xem trước phân đoạn để đảm bảo rằng nó bỏ qua suôn sẻ + Chỉnh sửa thời gian của phân đoạn thủ công + Bạn có muốn thay đổi thời gian bắt đầu hoặc kết thúc của phân đoạn không? + Thời gian đã đặt không hợp lệ + Thống kê + + Số liệu thống kê tạm thời không khả dụng (API ngừng hoạt động) + Đang tải... + SponsorBlock bị vô hiệu hoá + Tên người dùng của bạn: <b>%s</b> + Nhấn vào đây để thay đổi tên người dùng của bạn + Không thay đổi được tên người dùng: Trạng thái: %1$d %2$s + Tên người dùng đã được thay đổi thành công + Danh tiếng của bạn là <b>%.2f</b> + Bạn đã tạo <b>%s</b> phân đoạn + Nhấn vào đây để xem các phân đoạn của bạn + Bảng xếp hạng SponsorBlock + Bạn đã giúp mọi người bỏ qua <b>%s</b> phân đoạn + Nhấn vào đây để xem số liệu thống kê toàn cầu và những người đóng góp hàng đầu + Tương đương với <b>%s</b> trong cuộc đời họ.<br>Nhấn vào đây để xem bảng xếp hạng + Bạn đã bỏ qua <b>%s</b> phân đoạn + Tổng thời gian là <b>%s</b> + Có chắc muốn đặt lại bộ đến phân đoạn đã bỏ qua? + %1$s giờ %2$s phút + %1$s phút %2$s giây + %s giây + Độ mờ: + Màu: + Giới thiệu + Dữ liệu được cung cấp bởi API SponsorBlock. Nhấn vào đây để tìm hiểu thêm và xem các bản tải cho các nền tảng khác + + + Hình thức bố cục + Mặc định + Điện thoại + Máy tính bảng + Màn hình ô tô + "Thay đổi bao gồm: Bố cục máy tính bảng • Bài đăng cộng đồng bị ẩn @@ -1328,318 +1327,316 @@ Bố cục máy tính bảng Bố cục màn hình ô tô • Shorts mở trong trình phát thông thường • Bảng tin được sắp xếp theo chủ đề và kênh" - - - Giả mạo phiên bản ứng dụng - Phiên bản đã được giả mạo - Phiên bản không được giả mạo - "Phiên bản ứng dụng sẽ được giả mạo thành phiên bản YouTube cũ hơn. + + + Giả mạo phiên bản ứng dụng + Phiên bản đã được giả mạo + Phiên bản không được giả mạo + "Phiên bản ứng dụng sẽ được giả mạo thành phiên bản YouTube cũ hơn. Điều này sẽ làm thay đổi giao diện và tính năng của ứng dụng, nhưng cũng có thể xảy ra các sự cố không xác định. Nếu tắt đi sau đó, bạn nên xóa dữ liệu ứng dụng để tránh phát sinh lỗi giao diện." - Mục tiêu phiên bản giả mạo - 20.13.41 - Khôi phục thanh thao tác video mở rộng - 20.05.46 - Khôi phục tính năng bản chép lời - 19.35.36 - Khôi phục biểu tượng trình phát Shorts cũ - 19.01.34 - Khôi phục biểu tượng điều hướng cũ - - - Thay đổi trang bắt đầu - Mặc định - Tất cả kênh đăng ký - Duyệt kênh - Khóa học / Học tập - Khám phá - Thời trang & Làm đẹp - Trò chơi - Lịch sử - Thư viện - Video đã thích - Trực tiếp - Phim - Âm nhạc - Tin tức - Thông báo - Danh sách phát - Tìm kiếm - Mua sắm - Thể thao - Kênh đăng ký - Xu hướng - Thực tế ảo - Xem sau - Clip của bạn - Luôn thay đổi trang bắt đầu - "Trang bắt đầu luôn được thay đổi + Mục tiêu phiên bản giả mạo + 20.13.41 - Khôi phục thanh thao tác video mở rộng + 20.05.46 - Khôi phục tính năng bản chép lời + 19.35.36 - Khôi phục biểu tượng trình phát Shorts cũ + 19.01.34 - Khôi phục biểu tượng điều hướng cũ + + + Thay đổi trang bắt đầu + Mặc định + Tất cả kênh đăng ký + Duyệt kênh + Khóa học / Học tập + Khám phá + Thời trang & Làm đẹp + Trò chơi + Lịch sử + Thư viện + Video đã thích + Trực tiếp + Phim + Âm nhạc + Tin tức + Thông báo + Danh sách phát + Tìm kiếm + Mua sắm + Thể thao + Kênh đăng ký + Xu hướng + Thực tế ảo + Xem sau + Clip của bạn + Luôn thay đổi trang bắt đầu + "Trang bắt đầu luôn được thay đổi Hạn chế: Nút quay lại trên thanh công cụ có thể không hoạt động" - Trang bắt đầu chỉ được thay đổi khi khởi động ứng dụng - - - Tắt tiếp tục trình phát Shorts - Trinh phát Shorts sẽ không tiếp tục khi ứng dụng khởi chạy - Trinh phát Shorts sẽ tiếp tục khi ứng dụng khởi chạy - - - Mở Shorts bằng - Trình phát Shorts - Trình phát thông thường - Trình phát thông thường toàn màn hình - - - Tự động phát Shorts - Shorts sẽ phát tự động - Shorts sẽ phát lặp lại - Tự động phát nền cho Shorts - Phát nền cho Shorts được phát tự động - Phát nền cho Shorts được phát lặp lại - - - Trình phát thu nhỏ - Thay đổi kiểu trình phát thu nhỏ trong ứng dụng - Loại trình phát thu nhỏ - Tắt - Mặc định - Tối giản - Máy tính bảng - Hiện đại 1 - Hiện đại 2 - Hiện đại 3 - Hiện đại 4 - Tắt bo tròn góc - Góc vuông - Góc được bo tròn - Bật chạm hai lần và chụm để thay đổi kích thước - "Thao tác chạm hai lần và chụm để thay đổi kích thước đã bật + Trang bắt đầu chỉ được thay đổi khi khởi động ứng dụng + + + Tắt tiếp tục trình phát Shorts + Trinh phát Shorts sẽ không tiếp tục khi ứng dụng khởi chạy + Trinh phát Shorts sẽ tiếp tục khi ứng dụng khởi chạy + + + Mở Shorts bằng + Trình phát Shorts + Trình phát thông thường + Trình phát thông thường toàn màn hình + + + Tự động phát Shorts + Shorts sẽ phát tự động + Shorts sẽ phát lặp lại + Tự động phát nền cho Shorts + Phát nền cho Shorts được phát tự động + Phát nền cho Shorts được phát lặp lại + + + Trình phát thu nhỏ + Thay đổi kiểu trình phát thu nhỏ trong ứng dụng + Loại trình phát thu nhỏ + Tắt + Mặc định + Tối giản + Máy tính bảng + Hiện đại 1 + Hiện đại 2 + Hiện đại 3 + Hiện đại 4 + Tắt bo tròn góc + Góc vuông + Góc được bo tròn + Bật chạm hai lần và chụm để thay đổi kích thước + "Thao tác chạm hai lần và chụm để thay đổi kích thước đã bật • Chạm hai lần để tăng kích thước trình phát thu nhỏ • Chạm hai lần nữa để khôi phục kích thước ban đầu" - Thao tác chạm hai lần và chụm để thay đổi kích thước đã tắt - Tắt kéo và thả - Kéo và thả đã tắt - "Kéo và thả đã được bật + Thao tác chạm hai lần và chụm để thay đổi kích thước đã tắt + Tắt kéo và thả + Kéo và thả đã tắt + "Kéo và thả đã được bật Trình phát thu nhỏ có thể được kéo đến bất kỳ góc nào của màn hình" - Tắt cử chỉ kéo ngang - Cử chỉ kéo ngang đã tắt - "Cử chỉ kéo ngang đã được bật + Tắt cử chỉ kéo ngang + Cử chỉ kéo ngang đã tắt + "Cử chỉ kéo ngang đã được bật Trình phát thu nhỏ có thể được kéo ra mép màn hình sang bên trái hoặc phải" - Ẩn nút lớp phủ - Các nút lớp phủ đã bị ẩn - Các nút lớp phủ được hiển thị - Ẩn các nút mở rộng và đóng - "Các nút đã bị ẩn + Ẩn nút lớp phủ + Các nút lớp phủ đã bị ẩn + Các nút lớp phủ được hiển thị + Ẩn các nút mở rộng và đóng + "Các nút đã bị ẩn Vuốt để mở rộng hoặc đóng" - Các nút mở rộng và đóng được hiển thị - Ẩn văn bản phụ - Văn bản phụ đã bị ẩn - Văn bản phụ được hiển thị - Ẩn các nút tua nhanh và tua lại - Các nút tua nhanh và tua lại đã bị ẩn - Các nút tua nhanh và tua lại được hiển thị - Kích thước ban đầu - Kích thước ban đầu trên màn hình, bằng pixel - Pixel phải nằm giữa %1$s và %2$s - Độ mờ lớp phủ - Giá trị độ mờ của lớp phủ trình phát trong khoảng từ 0 đến 100, trong đó 0 là trong suốt - Độ mờ lớp phủ phải nằm trong khoảng từ 0-100 - - - Bật màn hình tải màu dốc - Màn hình tải sẽ có một nền màu dốc - Màn hình tải sẽ có một nền màu đặc - Kiểu màn hình chờ - Màu - Đen và trắng - Bật màu thanh tiến trình tùy chỉnh - Màu tùy chỉnh của thanh tiến trình được hiển thị - Màu gốc của thanh tiến trình được hiển thị - Tùy chỉnh màu thanh tiến trình - Màu của thanh tiến trình - Tùy chỉnh màu sắc nổi bật của thanh tiến trình - Màu sắc nổi bật của thanh tiến trình - Giá trị màu của thanh tiến trình không hợp lệ - - - - - Logo đầu trang - Mặc định - Thông thường - - ReVanced (tối giản) - Tùy chỉnh - - - Bỏ qua hạn chế khu vực khi tải ảnh - Đang dùng máy chủ ảnh yt4.ggpht.com - "Đang dùng máy chủ ảnh gốc + Các nút mở rộng và đóng được hiển thị + Ẩn văn bản phụ + Văn bản phụ đã bị ẩn + Văn bản phụ được hiển thị + Ẩn các nút tua nhanh và tua lại + Các nút tua nhanh và tua lại đã bị ẩn + Các nút tua nhanh và tua lại được hiển thị + Kích thước ban đầu + Kích thước ban đầu trên màn hình, bằng pixel + Pixel phải nằm giữa %1$s và %2$s + Độ mờ lớp phủ + Giá trị độ mờ của lớp phủ trình phát trong khoảng từ 0 đến 100, trong đó 0 là trong suốt + Độ mờ lớp phủ phải nằm trong khoảng từ 0-100 + + + Bật màn hình tải màu dốc + Màn hình tải sẽ có một nền màu dốc + Màn hình tải sẽ có một nền màu đặc + Kiểu màn hình chờ + Màu + Đen và trắng + Bật màu thanh tiến trình tùy chỉnh + Màu tùy chỉnh của thanh tiến trình được hiển thị + Màu gốc của thanh tiến trình được hiển thị + Tùy chỉnh màu thanh tiến trình + Màu của thanh tiến trình + Tùy chỉnh màu sắc nổi bật của thanh tiến trình + Màu sắc nổi bật của thanh tiến trình + Giá trị màu của thanh tiến trình không hợp lệ + + + + Logo đầu trang + Mặc định + Thông thường + + ReVanced (tối giản) + Tùy chỉnh + + + Bỏ qua hạn chế khu vực khi tải ảnh + Đang dùng máy chủ ảnh yt4.ggpht.com + "Đang dùng máy chủ ảnh gốc Bật tính năng này có thể khắc phục tình trạng hình ảnh không hiển thị ở một số quốc gia" - - - - Thẻ trang chủ - - Thẻ Kênh đăng ký - - Thẻ Bạn - Danh sách phát & đề xuất của trình phát - Kết quả tìm kiếm - Hình thu nhỏ gốc - DeArrow & Hình thu nhỏ gốc - DeArrow & Chụp tĩnh - Chụp tĩnh - "DeArrow cung cấp hình thu nhỏ có nguồn gốc từ cộng đồng cho video YouTube. Những hình thu nhỏ này thường liên quan hơn so với những hình thu nhỏ do YouTube cung cấp + + + + Thẻ trang chủ + + Thẻ Kênh đăng ký + + Thẻ Bạn + Danh sách phát & đề xuất của trình phát + Kết quả tìm kiếm + Hình thu nhỏ gốc + DeArrow & Hình thu nhỏ gốc + DeArrow & Chụp tĩnh + Chụp tĩnh + "DeArrow cung cấp hình thu nhỏ có nguồn gốc từ cộng đồng cho video YouTube. Những hình thu nhỏ này thường liên quan hơn so với những hình thu nhỏ do YouTube cung cấp Nếu được bật, URL video sẽ được gửi đến máy chủ API và không có dữ liệu nào khác được gửi. Nếu video không có hình thu nhỏ DeArrow, thì hình thu nhỏ gốc hoặc ảnh chụp tĩnh sẽ được hiển thị Nhấn vào đây để tìm hiểu thêm về DeArrow" - Hiện thông báo ngắn nếu API không khả dụng - Thông báo ngắn sẽ hiện nếu DeArrow không khả dụng - Thông báo ngắn không hiện nếu DeArrow không khả dụng - Điểm cuối API DeArrow - URL của điểm cuối bộ đệm hình thu nhỏ DeArrow - Chụp tĩnh video - Chụp tĩnh là lấy từ đầu/giữa/cuối của mỗi video. Những hình ảnh này được dựng sẵn trong Youtube và không dùng API bên ngoài - Dùng hình chụp tĩnh nhanh - Đang dùng hình chụp tĩnh chất lượng trung bình.\n\nHình thu nhỏ tải nhanh hơn, nhưng video phát trực tiếp, chưa phát hành hoặc video cũ có thể hiển thị không hình thu nhỏ - Đang dùng hình chụp tĩnh chất lượng cao - Thời điểm video để chụp hình tĩnh từ - Đầu video - Giữa video - Cuối video - - DeArrow tạm thời không khả dụng (mã trạng thái: %s) - DeArrow tạm thời không khả dụng - - - Hiện thông báo của ReVanced - Thông báo sẽ được hiển thị khi khởi động ứng dụng - Thông báo không được hiển thị khi khởi động ứng dụng - Hiện thông báo khi khởi động - Không thể tải thông báo từ máy chủ - Đóng - - - Bật video lặp lại - Video sẽ lặp lại - Video sẽ không lặp lại - - - Hiện nút lặp lại video - Nút được hiển thị - Nút không được hiển thị - Lặp lại video đang bật - Lặp lại video đang tắt - - - - - Giả mạo kích thước thiết bị - "Kích thước thiết bị đã được giả mạo + Hiện thông báo ngắn nếu API không khả dụng + Thông báo ngắn sẽ hiện nếu DeArrow không khả dụng + Thông báo ngắn không hiện nếu DeArrow không khả dụng + Điểm cuối API DeArrow + URL của điểm cuối bộ đệm hình thu nhỏ DeArrow + Chụp tĩnh video + Chụp tĩnh là lấy từ đầu/giữa/cuối của mỗi video. Những hình ảnh này được dựng sẵn trong Youtube và không dùng API bên ngoài + Dùng hình chụp tĩnh nhanh + Đang dùng hình chụp tĩnh chất lượng trung bình.\n\nHình thu nhỏ tải nhanh hơn, nhưng video phát trực tiếp, chưa phát hành hoặc video cũ có thể hiển thị không hình thu nhỏ + Đang dùng hình chụp tĩnh chất lượng cao + Thời điểm video để chụp hình tĩnh từ + Đầu video + Giữa video + Cuối video + + DeArrow tạm thời không khả dụng (mã trạng thái: %s) + DeArrow tạm thời không khả dụng + + + Hiện thông báo của ReVanced + Thông báo sẽ được hiển thị khi khởi động ứng dụng + Thông báo không được hiển thị khi khởi động ứng dụng + Hiện thông báo khi khởi động + Không thể tải thông báo từ máy chủ + Đóng + + + Bật video lặp lại + Video sẽ lặp lại + Video sẽ không lặp lại + + + Hiện nút lặp lại video + Nút được hiển thị + Nút không được hiển thị + Lặp lại video đang bật + Lặp lại video đang tắt + + + + Giả mạo kích thước thiết bị + "Kích thước thiết bị đã được giả mạo Có thể mở khóa chất lượng video cao hơn nhưng bạn có thể gặp hiện tượng giật lag khi phát video, hao pin và các sự cố không xác định khác" - "Kích thước thiết bị không được giả mạo + "Kích thước thiết bị không được giả mạo Bật tính năng này có thể mở khóa chất lượng video cao hơn" - Bật tính năng này có thể làm giật lag khi phát video, hao pin, và các sự cố không xác định. - - - Phản hồi xúc giác - Thay đổi phản hồi xúc giác - Tắt phản hồi xúc giác chương - Phản hồi xúc giác chương đã tắt - Phản hồi xúc giác chương đã bật - Tắt phản hồi xúc giác khi tua chính xác - Phản hồi xúc giác khi tua chính xác đã tắt - Phản hồi xúc giác khi tua chính xác đã bật - Tắt phản hồi xúc giác khi huỷ tua - Phản hồi xúc giác khi huỷ tua đã tắt - Phản hồi xúc giác khi huỷ tua đã bật - Tắt phản hồi xúc giác khi thu phóng - Phản hồi xúc giác khi thu phóng đã tắt - Phản hồi xúc giác khi thu phóng đã bật - - - Nếu gần đây bạn đã cập nhật thông tin đăng nhập tài khoản của mình, hãy gỡ và cài đặt lại MicroG. - - - Bỏ qua chuyển hướng URL - Chuyển hướng URL đã được bỏ qua - Chuyển hướng URL không được bỏ qua - - - Mở liên kết trong trình duyệt - Đang mở liên kết trong trình duyệt bên ngoài - Đang mở liên kết trình duyệt trong ứng dụng - - - - Tự động - Nhớ các thay đổi chất lượng video - Thay đổi chất lượng áp dụng cho tất cả video - Thay đổi chất lượng chỉ áp dụng cho video hiện tại - Hiện thông báo ngắn khi thay đổi chất lượng video - Thông báo ngắn sẽ hiện khi chất lượng video mặc định được thay đổi - Thông báo ngắn không hiện khi chất lượng video mặc định được thay đổi - Chất lượng mặc định trên mạng Wi-Fi - Chất lượng mặc định trên mạng di động - Nhớ các thay đổi chất lượng Shorts - Thay đổi chất lượng áp dụng cho tất cả nội dung Shorts - Thay đổi chất lượng chỉ áp dụng cho Short hiện tại - Chất lượng Shorts mặc định trên mạng Wi-Fi - Chất lượng Shorts mặc định trên mạng di động - di động - Đã thay đổi chất lượng mặc định %1$s: %2$s - Đã thay đổi chất lượng Shorts %1$s: %2$s - - - Hiện nút hộp thoại tốc độ phát - Nút hộp thoại tốc độ được hiển thị. Nhấn và giữ để đặt lại tốc độ phát về mặc định - Nút hộp thoại tốc độ không được hiển thị - - - Hiện nút chất lượng video - Nút chất lượng video được hiển thị. Nhấn và giữ để đặt lại chất lượng về mặc định - Nút chất lượng video không được hiển thị - - - Trình đơn tốc độ phát tùy chỉnh - Trình đơn tốc độ phát tùy chỉnh được hiển thị - Trình đơn tốc độ phát tùy chỉnh không được hiển thị - Khôi phục trình đơn tốc độ phát cũ - Trình đơn tốc độ phát cũ được hiển thị - Trình đơn tốc độ phát hiện đại được hiển thị - Tốc độ phát tùy chỉnh - Thêm hoặc thay đổi tốc độ phát tùy chỉnh - Tốc độ tùy chỉnh phải nhỏ hơn %s - Tốc độ phát lại tùy chỉnh không hợp lệ - Tự động - Tốc độ chạm và giữ tùy chỉnh - Tốc độ phát từ 0 đến 8 - - - Nhớ các thay đổi tốc độ phát - Thay đổi tốc độ phát áp dụng cho tất cả video - Thay đổi tốc độ phát chỉ áp dụng cho video hiện tại - Hiện thông báo ngắn khi thay đổi tốc độ phát - Thông báo ngắn sẽ hiện khi tốc độ phát mặc định được thay đổi - Thông báo ngắn không hiện khi tốc độ phát mặc định được thay đổi - Tốc độ phát mặc định - Đã thay đổi tốc độ phát mặc định thành: %s - - - Vô hiệu hóa video HDR - Video HDR đã tắt - Video HDR đã bật - Bắt buộc AVC (H.264) - Codec video buộc phải là AVC (H.264) - Codec video sẽ được xác định tự động - "Lợi ích: + Bật tính năng này có thể làm giật lag khi phát video, hao pin, và các sự cố không xác định. + + + Phản hồi xúc giác + Thay đổi phản hồi xúc giác + Tắt phản hồi xúc giác chương + Phản hồi xúc giác chương đã tắt + Phản hồi xúc giác chương đã bật + Tắt phản hồi xúc giác khi tua chính xác + Phản hồi xúc giác khi tua chính xác đã tắt + Phản hồi xúc giác khi tua chính xác đã bật + Tắt phản hồi xúc giác khi huỷ tua + Phản hồi xúc giác khi huỷ tua đã tắt + Phản hồi xúc giác khi huỷ tua đã bật + Tắt phản hồi xúc giác khi thu phóng + Phản hồi xúc giác khi thu phóng đã tắt + Phản hồi xúc giác khi thu phóng đã bật + + + Nếu gần đây bạn đã cập nhật thông tin đăng nhập tài khoản của mình, hãy gỡ và cài đặt lại MicroG. + + + Bỏ qua chuyển hướng URL + Chuyển hướng URL đã được bỏ qua + Chuyển hướng URL không được bỏ qua + + + Mở liên kết trong trình duyệt + Đang mở liên kết trong trình duyệt bên ngoài + Đang mở liên kết trình duyệt trong ứng dụng + + + + Tự động + Nhớ các thay đổi chất lượng video + Thay đổi chất lượng áp dụng cho tất cả video + Thay đổi chất lượng chỉ áp dụng cho video hiện tại + Hiện thông báo ngắn khi thay đổi chất lượng video + Thông báo ngắn sẽ hiện khi chất lượng video mặc định được thay đổi + Thông báo ngắn không hiện khi chất lượng video mặc định được thay đổi + Chất lượng mặc định trên mạng Wi-Fi + Chất lượng mặc định trên mạng di động + Nhớ các thay đổi chất lượng Shorts + Thay đổi chất lượng áp dụng cho tất cả nội dung Shorts + Thay đổi chất lượng chỉ áp dụng cho Short hiện tại + Chất lượng Shorts mặc định trên mạng Wi-Fi + Chất lượng Shorts mặc định trên mạng di động + di động + Đã thay đổi chất lượng mặc định %1$s: %2$s + Đã thay đổi chất lượng Shorts %1$s: %2$s + + + Hiện nút hộp thoại tốc độ phát + Nút hộp thoại tốc độ được hiển thị. Nhấn và giữ để đặt lại tốc độ phát về mặc định + Nút hộp thoại tốc độ không được hiển thị + + + Hiện nút chất lượng video + Nút chất lượng video được hiển thị. Nhấn và giữ để đặt lại chất lượng về mặc định + Nút chất lượng video không được hiển thị + + + Trình đơn tốc độ phát tùy chỉnh + Trình đơn tốc độ phát tùy chỉnh được hiển thị + Trình đơn tốc độ phát tùy chỉnh không được hiển thị + Khôi phục trình đơn tốc độ phát cũ + Trình đơn tốc độ phát cũ được hiển thị + Trình đơn tốc độ phát hiện đại được hiển thị + Tốc độ phát tùy chỉnh + Thêm hoặc thay đổi tốc độ phát tùy chỉnh + Tốc độ tùy chỉnh phải nhỏ hơn %s + Tốc độ phát lại tùy chỉnh không hợp lệ + Tự động + Tốc độ chạm và giữ tùy chỉnh + Tốc độ phát từ 0 đến 8 + + + Nhớ các thay đổi tốc độ phát + Thay đổi tốc độ phát áp dụng cho tất cả video + Thay đổi tốc độ phát chỉ áp dụng cho video hiện tại + Hiện thông báo ngắn khi thay đổi tốc độ phát + Thông báo ngắn sẽ hiện khi tốc độ phát mặc định được thay đổi + Thông báo ngắn không hiện khi tốc độ phát mặc định được thay đổi + Tốc độ phát mặc định + Đã thay đổi tốc độ phát mặc định thành: %s + + + Vô hiệu hóa video HDR + Video HDR đã tắt + Video HDR đã bật + Bắt buộc AVC (H.264) + Codec video buộc phải là AVC (H.264) + Codec video sẽ được xác định tự động + "Lợi ích: • Có thể cải thiện thời lượng pin • Có thể khôi phục độ phân giải video bị thiếu trên thiết bị cũ @@ -1648,179 +1645,178 @@ Hạn chế: • Phát video sẽ sử dụng nhiều dữ liệu internet hơn VP9 hoặc AV1 • Video HDR sẽ không sử dụng AVC • Một số thiết bị không thể buộc sử dụng AVC" - - - Hiện trình đơn chất lượng video nâng cao - Trình đơn chất lượng video nâng cao được hiển thị - Trình đơn chất lượng video nâng cao không được hiển thị - - - Bật vuốt để tua - Vuốt để tua đã bật - Vuốt để tua không được bật - - - Cho phép AV1 trên Android VR - "Bộ giải mã video là AVC (H.264), VP9 hoặc AV1 + + + Hiện trình đơn chất lượng video nâng cao + Trình đơn chất lượng video nâng cao được hiển thị + Trình đơn chất lượng video nâng cao không được hiển thị + + + Bật vuốt để tua + Vuốt để tua đã bật + Vuốt để tua không được bật + + + Cho phép AV1 trên Android VR + "Bộ giải mã video là AVC (H.264), VP9 hoặc AV1 Quá trình phát có thể bị giật hoặc tụt khung hình" - Bộ giải mã video là AVC (H.264) hoặc VP9 - "Bật cài đặt này có thể sử dụng giải mã AV1 bằng phần mềm. + Bộ giải mã video là AVC (H.264) hoặc VP9 + "Bật cài đặt này có thể sử dụng giải mã AV1 bằng phần mềm. Phát video bằng AV1 có thể bị giật hoặc tụt khung hình." - Hạn chế khi giả mạo - • Ứng dụng khách đang trong giai đoạn thử nghiệm và có thể ngừng hoạt động bất cứ lúc nào - • Video có thể dừng ở 1:00, hoặc có thể không khả dụng ở một số khu vực - • Trình đơn bản âm thanh bị thiếu - • Không có codec video AV1 - • Âm lượng ổn định không khả dụng - • Video dành cho trẻ em có thể không phát được khi đăng xuất hoặc ở chế độ ẩn danh - - • Buộc âm thanh gốc không khả dụng - Hiện trong Thống kê chi tiết - Ứng dụng khách đã được hiển thị trong Thống kê chi tiết - Ứng dụng khách đã ẩn trong Thống kê chi tiết - - - - - - - Giới thiệu - Quảng cáo - Chung - Trình phát - Khác - - - Ẩn quảng cáo trên video - Quảng cáo trên video đã bị ẩn - Quảng cáo trên video được hiển thị - - - Bật lặp lại vĩnh viễn - Lặp lại vĩnh viễn đã được bật - Lặp lại vĩnh viễn đã tắt - - - Ẩn nút truyền - Nút truyền đã bị ẩn - Nút truyền được hiển thị - Ẩn nút lịch sử - Nút lịch sử đã bị ẩn - Nút lịch sử được hiển thị - Ẩn nút thông báo - Nút thông báo đã bị ẩn - Nút thông báo được hiển thị - Ẩn nút tìm kiếm - Nút tìm kiếm đã bị ẩn - Nút tìm kiếm được hiển thị - - - Ẩn thanh danh mục - Thanh danh mục đã bị ẩn - Thanh danh mục được hiển thị - - - Đổi màu trình phát thu nhỏ - Màu trình phát thu nhỏ khớp với trình phát toàn màn hình - Trình phát thu nhỏ dùng màu mặc định - - - Thanh điều hướng - Ẩn hoặc thay đổi các nút trên thanh điều hướng - - Ẩn Trang chủ - Nút Trang chủ đã bị ẩn - Nút Trang chủ được hiển thị - - Ẩn Đoạn nhạc - Nút Đoạn nhạc đã bị ẩn - Nút Đoạn nhạc được hiển thị - - Ẩn Khám phá - Nút Khám phá đã bị ẩn - Nút Khám phá được hiển thị - - Ẩn Thư viện - Nút Thư viện đã bị ẩn - Nút Thư viện được hiển thị - - Ẩn Nâng cấp - Nút Nâng cấp đã bị ẩn - Nút Nâng cấp được hiển thị - Ẩn thanh điều hướng - Thanh điều hướng đã bị ẩn - Thanh điều hướng được hiển thị - Ẩn tên nút điều hướng - Tên nút đã bị ẩn - Tên nút được hiển thị - - - Ẩn trình đơn \'Mua Music Premium\' - Trình đơn này đã bị ẩn - Trình đơn này được hiển thị - - - Ẩn nút nâng cấp - Nút đã bị ẩn - Nút được hiển thị - - - - - Chặn quảng cáo âm thanh - Quảng cáo âm thanh được chặn - Quảng cáo âm thanh không được chặn - - - %s không khả dụng, quảng cáo có thể hiện. Hãy thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. - %s đã trả về lỗi, quảng cáo có thể hiển thị. Hãy thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. - Chặn quảng cáo video nhúng - Đã tắt - Ủy thác Luminous - Ủy thác PurpleAdBlock - - - Chặn quảng cáo video - Quảng cáo video được chặn - Quảng cáo video không được chặn - - - Tin nhắn đã xóa - Hiện tin nhắn đã xóa - Không hiện tin nhắn đã xóa - Che tin nhắn đã xóa - Hiện tin nhắn đã xóa dưới dạnh gạch ngang - - - Tự nhận Điểm Kênh - Điểm Kênh được nhận tự động - Điểm Kênh không được nhận tự động - - - - Bật chế độ gỡ lỗi Twitch - Chế độ gỡ lỗi Twitch đã bật (không khuyến nghị) - Chế độ gỡ lỗi Twitch đã tắt - - - Cài đặt ReVanced - Giới thiệu - Giới thiệu về ReVanced - Chặn quảng cáo - Cài đặt chặn quảng cáo - Trò chuyện - Cài đặt trò chuyện - Khác - Cài đặt linh tinh - Cài đặt chung - Cài đặt khác - Quảng cáo phía ứng dụng - Quảng cáo luồng đảm bảo phía máy khách - Nhật ký gỡ lỗi - Nhật ký gỡ lỗi đã bật - Nhật ký gỡ lỗi đã tắt - - + Hạn chế khi giả mạo + • Ứng dụng khách đang trong giai đoạn thử nghiệm và có thể ngừng hoạt động bất cứ lúc nào + • Video có thể dừng ở 1:00, hoặc có thể không khả dụng ở một số khu vực + • Trình đơn bản âm thanh bị thiếu + • Không có codec video AV1 + • Âm lượng ổn định không khả dụng + • Video dành cho trẻ em có thể không phát được khi đăng xuất hoặc ở chế độ ẩn danh + + • Buộc âm thanh gốc không khả dụng + Hiện trong Thống kê chi tiết + Ứng dụng khách đã được hiển thị trong Thống kê chi tiết + Ứng dụng khách đã ẩn trong Thống kê chi tiết + + + + + + Giới thiệu + Quảng cáo + Chung + Trình phát + Khác + + + Ẩn quảng cáo trên video + Quảng cáo trên video đã bị ẩn + Quảng cáo trên video được hiển thị + + + Bật lặp lại vĩnh viễn + Lặp lại vĩnh viễn đã được bật + Lặp lại vĩnh viễn đã tắt + + + Ẩn nút truyền + Nút truyền đã bị ẩn + Nút truyền được hiển thị + Ẩn nút lịch sử + Nút lịch sử đã bị ẩn + Nút lịch sử được hiển thị + Ẩn nút thông báo + Nút thông báo đã bị ẩn + Nút thông báo được hiển thị + Ẩn nút tìm kiếm + Nút tìm kiếm đã bị ẩn + Nút tìm kiếm được hiển thị + + + Ẩn thanh danh mục + Thanh danh mục đã bị ẩn + Thanh danh mục được hiển thị + + + Đổi màu trình phát thu nhỏ + Màu trình phát thu nhỏ khớp với trình phát toàn màn hình + Trình phát thu nhỏ dùng màu mặc định + + + Thanh điều hướng + Ẩn hoặc thay đổi các nút trên thanh điều hướng + + Ẩn Trang chủ + Nút Trang chủ đã bị ẩn + Nút Trang chủ được hiển thị + + Ẩn Đoạn nhạc + Nút Đoạn nhạc đã bị ẩn + Nút Đoạn nhạc được hiển thị + + Ẩn Khám phá + Nút Khám phá đã bị ẩn + Nút Khám phá được hiển thị + + Ẩn Thư viện + Nút Thư viện đã bị ẩn + Nút Thư viện được hiển thị + + Ẩn Nâng cấp + Nút Nâng cấp đã bị ẩn + Nút Nâng cấp được hiển thị + Ẩn thanh điều hướng + Thanh điều hướng đã bị ẩn + Thanh điều hướng được hiển thị + Ẩn tên nút điều hướng + Tên nút đã bị ẩn + Tên nút được hiển thị + + + Ẩn trình đơn \'Mua Music Premium\' + Trình đơn này đã bị ẩn + Trình đơn này được hiển thị + + + Ẩn nút nâng cấp + Nút đã bị ẩn + Nút được hiển thị + + + + + Chặn quảng cáo âm thanh + Quảng cáo âm thanh được chặn + Quảng cáo âm thanh không được chặn + + + %s không khả dụng, quảng cáo có thể hiện. Hãy thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. + %s đã trả về lỗi, quảng cáo có thể hiển thị. Hãy thử thay đổi dịch vụ chặn quảng cáo trong cài đặt. + Chặn quảng cáo video nhúng + Đã tắt + Ủy thác Luminous + Ủy thác PurpleAdBlock + + + Chặn quảng cáo video + Quảng cáo video được chặn + Quảng cáo video không được chặn + + + Tin nhắn đã xóa + Hiện tin nhắn đã xóa + Không hiện tin nhắn đã xóa + Che tin nhắn đã xóa + Hiện tin nhắn đã xóa dưới dạnh gạch ngang + + + Tự nhận Điểm Kênh + Điểm Kênh được nhận tự động + Điểm Kênh không được nhận tự động + + + + Bật chế độ gỡ lỗi Twitch + Chế độ gỡ lỗi Twitch đã bật (không khuyến nghị) + Chế độ gỡ lỗi Twitch đã tắt + + + Cài đặt ReVanced + Giới thiệu + Giới thiệu về ReVanced + Chặn quảng cáo + Cài đặt chặn quảng cáo + Trò chuyện + Cài đặt trò chuyện + Khác + Cài đặt linh tinh + Cài đặt chung + Cài đặt khác + Quảng cáo phía ứng dụng + Quảng cáo luồng đảm bảo phía máy khách + Nhật ký gỡ lỗi + Nhật ký gỡ lỗi đã bật + Nhật ký gỡ lỗi đã tắt + + diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index 27c8f6ee21..d458814173 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -17,233 +17,232 @@ "First 'item' text Second \"item\" text" ---> - - - - 应用名称 - - 自定义 - 应用图标 - 原始 - - ReVanced 极简 - ReVanced 缩放 - - 自定义 - - - 检测失败 - 打开官方网站 - 忽略 - <h5>此应用程序似乎未由您修补。</h5><br>此应用程序可能无法正常运行,<b>可能存在安全风险或使用起来甚至存在危险</b>。<br><br>这些检查表明此应用程序是预先修补的或从其他人那里获得的:<br><br><small>%1$s</small><br>强烈建议您<b>卸载此应用程序并自行修补</b>,以确保您使用的是经过验证的安全的应用。<p><br>如果忽略,此警告只会显示两次。 - 已在另一台设备上修补过 - 未通过 ReVanced 管理器安装 - 上次修补在10分钟前 - 上次修补在 %s 天前 - APK 构建日期已损坏 - - - ReVanced 通知 - 您的观看历史记录未保存。<br><br>这很可能是由 DNS 广告拦截器或网络代理造成的。<br><br>要解决此问题,请将 <b>s.youtube.com</b> 添加到白名单或关闭所有 DNS 广告拦截器和代理。 - 不再显示 - - - 设置 - 确定要继续吗? - 保存 - 重置 - 重置颜色 - 无效的颜色 - 需要重启 - 重启应用以使更改生效。 - 重启 - 导入 - 复制 - ReVanced 设置重置为默认 - 导入 %d 个设置 - 导入失败:%s - 搜索设置 - 未找到“%s”的结果 - 尝试其他关键字 - 最近搜索 - 从搜索历史记录中删除? - 清除搜索历史 - 您确定要清除所有搜索历史吗? - 搜索技巧 - "• 点击路径以导航到该位置 +--> + + + 应用名称 + + 自定义 + 应用图标 + 原始 + + ReVanced 极简 + ReVanced 缩放 + + 自定义 + + + 检测失败 + 打开官方网站 + 忽略 + <h5>此应用程序似乎未由您修补。</h5><br>此应用程序可能无法正常运行,<b>可能存在安全风险或使用起来甚至存在危险</b>。<br><br>这些检查表明此应用程序是预先修补的或从其他人那里获得的:<br><br><small>%1$s</small><br>强烈建议您<b>卸载此应用程序并自行修补</b>,以确保您使用的是经过验证的安全的应用。<p><br>如果忽略,此警告只会显示两次。 + 已在另一台设备上修补过 + 未通过 ReVanced 管理器安装 + 上次修补在10分钟前 + 上次修补在 %s 天前 + APK 构建日期已损坏 + + + ReVanced 通知 + 您的观看历史记录未保存。<br><br>这很可能是由 DNS 广告拦截器或网络代理造成的。<br><br>要解决此问题,请将 <b>s.youtube.com</b> 添加到白名单或关闭所有 DNS 广告拦截器和代理。 + 不再显示 + + + 设置 + 确定要继续吗? + 保存 + 重置 + 重置颜色 + 无效的颜色 + 需要重启 + 重启应用以使更改生效。 + 重启 + 导入 + 复制 + ReVanced 设置重置为默认 + 导入 %d 个设置 + 导入失败:%s + 搜索设置 + 未找到“%s”的结果 + 尝试其他关键字 + 最近搜索 + 从搜索历史记录中删除? + 清除搜索历史 + 您确定要清除所有搜索历史吗? + 搜索技巧 + "• 点击路径以导航到该位置 • 长按设置以导航到该位置 • 按回车键将搜索查询保存到历史记录 • 搜索忽略大小写和标点符号 • 父设置显示在禁用的子设置上方" - 搜索历史为空 - 要保存搜索历史,请键入搜索查询并按回车键 - 显示设置搜索历史记录 - 设置搜索历史记录已显示 - 不显示设置搜索历史记录 - 显示ReVanced设置图标 - 设置图标已显示 - 未显示设置图标 - ReVanced 语 - "某些语言的翻译可能缺失或不完整。 + 搜索历史为空 + 要保存搜索历史,请键入搜索查询并按回车键 + 显示设置搜索历史记录 + 设置搜索历史记录已显示 + 不显示设置搜索历史记录 + 显示ReVanced设置图标 + 设置图标已显示 + 未显示设置图标 + ReVanced 语 + "某些语言的翻译可能缺失或不完整。 要翻译新语言或改进现有翻译,请访问 translate.revanced.app" - 应用语言 - 导入/导出 - 导入/导出 ReVanced 设置 - - 你正在使用 ReVanced Patches 版本%s - 注意 - 此版本是预发布版本,您可能会遇到意外问题 - 官方链接 - + 你正在使用 ReVanced Patches 版本%s + 注意 + 此版本是预发布版本,您可能会遇到意外问题 + 官方链接 + - - - GmsCore 设置 - GmsCore 的设置 - - MicroG GmsCore 未安装。请先安装。 - 需要采取措施 - "MicroG GmsCore 无法在后台运行。 + + + GmsCore 设置 + GmsCore 的设置 + + MicroG GmsCore 未安装。请先安装。 + 需要采取措施 + "MicroG GmsCore 无法在后台运行。 请按照「Don't kill my app」网站上对应手机的指南,允许 MicroG 在后台运行。 这是应用程序正常运行的必要条件。" - 打开网站 - "必须禁用 MicroG GmsCore 的电池优化,以防止出现问题。 + 打开网站 + "必须禁用 MicroG GmsCore 的电池优化,以防止出现问题。 禁用 MicroG 的电池优化不会对电池续航时间造成负面影响。 点击继续按钮并允许优化更改。" - 继续 - - - 欺骗视频流 - 欺骗客户端视频流以防止播放问题 - 伪造视频流 - "视频流已欺骗 + 继续 + + + 欺骗视频流 + 欺骗客户端视频流以防止播放问题 + 伪造视频流 + "视频流已欺骗 如果您是 YouTube Premium 用户,此设置可能不需要" - "未欺骗视频流 + "未欺骗视频流 播放可能无法正常进行" - 关闭此设置可能会导致播放问题。 - 默认客户端 - - - 强制使用原始音频语言 - 使用原始音频语言 - 正在使用默认音频 - - 要使用此功能,请将“伪造视频流”更改为除 Android Studio 之外的任何客户端 - - - 调试 - 启用或禁用调试选项 - 调试日志 - 已启用调试日志记录 - 已禁用调试日志记录 - 记录堆栈跟踪 - 调试日志包括堆栈跟踪 - 调试日志不包括堆栈跟踪 - 在发生 ReVanced 错误时显示 Toast - 发生错误时显示Toast - 发生错误时不显示Toast - "关闭错误 Toast 会隐藏所有 ReVanced 错误通知。 + 关闭此设置可能会导致播放问题。 + 默认客户端 + + + 强制使用原始音频语言 + 使用原始音频语言 + 正在使用默认音频 + + 要使用此功能,请将“伪造视频流”更改为除 Android Studio 之外的任何客户端 + + + 调试 + 启用或禁用调试选项 + 调试日志 + 已启用调试日志记录 + 已禁用调试日志记录 + 记录堆栈跟踪 + 调试日志包括堆栈跟踪 + 调试日志不包括堆栈跟踪 + 在发生 ReVanced 错误时显示 Toast + 发生错误时显示Toast + 发生错误时不显示Toast + "关闭错误 Toast 会隐藏所有 ReVanced 错误通知。 您不会收到任何意外事件的通知。" - 导出调试日志 - 将 ReVanced 调试日志复制到剪贴板 - 调试日志记录已禁用 - 未找到日志 - 日志已复制 - 导出日志失败:%s - 清除调试日志 - 清除所有存储的 ReVanced 调试日志 - 日志已清除 - 功能标志 Manager - 管理布尔功能标志 - 活动标志 (%d) - 已阻止标志 (%d) - 搜索标志... - 标志已保存 - 标志已重置 - 标志已复制到剪贴板 - 记录协议缓冲区 - 调试日志包括协议缓冲区 - 调试日志不包括协议缓冲区 - "启用此设置将记录额外的布局数据,包括某些 UI 组件的屏幕文本。 + 导出调试日志 + 将 ReVanced 调试日志复制到剪贴板 + 调试日志记录已禁用 + 未找到日志 + 日志已复制 + 导出日志失败:%s + 清除调试日志 + 清除所有存储的 ReVanced 调试日志 + 日志已清除 + 功能标志 Manager + 管理布尔功能标志 + 活动标志 (%d) + 已阻止标志 (%d) + 搜索标志... + 标志已保存 + 标志已重置 + 标志已复制到剪贴板 + 记录协议缓冲区 + 调试日志包括协议缓冲区 + 调试日志不包括协议缓冲区 + "启用此设置将记录额外的布局数据,包括某些 UI 组件的屏幕文本。 这有助于在创建自定义过滤器时识别组件。 但是,启用此设置也会记录一些用户数据,例如您的 IP 地址。" - - - 净化分享链接 - 跟踪查询参数已从分享链接中移除 - 跟踪查询参数未从分享链接中移除 - 将分享链接更改为 youtube.com - 分享链接使用 youtube.com - 分享链接使用 music.youtube.com - - - 自定义过滤器 - 使用自定义过滤器隐藏组件 - 启用自定义筛选器 - 自定义筛选器已启用 - 自定义筛选器已禁用 - 自定义筛选器 - - 用于过滤的组件路径生成器字符串的列表,按行分隔 - 非法自定义筛选器:%s - - - - - 关于 - 广告 - 可选缩略图 - 订阅源 - 常规 - 播放器 - 进度条 - 滑动控制 - 其他 - 视频 - 恢复旧设置菜单 - 显示旧设置菜单 - 不显示旧设置菜单 - - - 禁用 Shorts 后台播放 - Shorts 后台播放已停用 - Shorts 后台播放已启用 - - - 隐藏专辑卡片 - 专辑卡片已隐藏 - 专辑卡片已显示 - 隐藏艺人卡片 - 艺人卡片已隐藏 - 艺人卡片已显示 - 隐藏标签展示栏 - 标签展示栏已隐藏 - 标签展示栏已显示 - 隐藏社区帖子 - 社区帖子已隐藏 - 社区帖子已显示 - 隐藏紧凑横幅 - 紧凑横幅已隐藏 - 紧凑横幅已显示 - 隐藏可展开卡片 - 视频下方的可展开卡片已隐藏 - 视频下方的可展开卡片已显示 - 隐藏浮动麦克风按钮 - 搜索中的浮动麦克风按钮已隐藏 - 搜索中的浮动麦克风按钮已显示 - 隐藏横排展示架 - "水平展示内容已隐藏,例如: + + + 净化分享链接 + 跟踪查询参数已从分享链接中移除 + 跟踪查询参数未从分享链接中移除 + 将分享链接更改为 youtube.com + 分享链接使用 youtube.com + 分享链接使用 music.youtube.com + + + 自定义过滤器 + 使用自定义过滤器隐藏组件 + 启用自定义筛选器 + 自定义筛选器已启用 + 自定义筛选器已禁用 + 自定义筛选器 + + 用于过滤的组件路径生成器字符串的列表,按行分隔 + 非法自定义筛选器:%s + + + + + 关于 + 广告 + 可选缩略图 + 订阅源 + 常规 + 播放器 + 进度条 + 滑动控制 + 其他 + 视频 + 恢复旧设置菜单 + 显示旧设置菜单 + 不显示旧设置菜单 + + + 禁用 Shorts 后台播放 + Shorts 后台播放已停用 + Shorts 后台播放已启用 + + + 隐藏专辑卡片 + 专辑卡片已隐藏 + 专辑卡片已显示 + 隐藏艺人卡片 + 艺人卡片已隐藏 + 艺人卡片已显示 + 隐藏标签展示栏 + 标签展示栏已隐藏 + 标签展示栏已显示 + 隐藏社区帖子 + 社区帖子已隐藏 + 社区帖子已显示 + 隐藏紧凑横幅 + 紧凑横幅已隐藏 + 紧凑横幅已显示 + 隐藏可展开卡片 + 视频下方的可展开卡片已隐藏 + 视频下方的可展开卡片已显示 + 隐藏浮动麦克风按钮 + 搜索中的浮动麦克风按钮已隐藏 + 搜索中的浮动麦克风按钮已显示 + 隐藏横排展示架 + "水平展示内容已隐藏,例如: • 突发新闻 • 继续观看 @@ -251,1030 +250,1030 @@ Second \"item\" text" • 最相关 • 购物 • 再次观看" - 横向内容架已显示 - 隐藏图片专区 - 搜索结果中的图片专区已隐藏 - 搜索结果中的图片专区已显示 - 隐藏「最新帖子」 - 最新帖子已隐藏 - 最新帖子已显示 - 隐藏合辑播放列表 - 合辑播放列表已隐藏 - 合辑播放列表已显示 - 隐藏电影部分 - 相关电影部分已隐藏 - 相关电影部分已显示 - - 隐藏「通知我」按钮 - 通知我按钮已隐藏 - 通知我按钮已显示 - 隐藏 Playables 游戏 - Playables 游戏已隐藏 - 可播放内容已显示 - - 隐藏「显示更多」按钮 - 搜索结果中的显示更多按钮已隐藏 - 搜索结果中的显示更多按钮已显示 - 隐藏调查 - 问卷已隐藏 - 问卷已显示 - 隐藏票券架 - 票券架已隐藏 - 票券架已显示 - - 隐藏视频推荐标签 - 搜索结果中“观看者还观看了”和“你可能也喜欢”标签已隐藏 - 搜索结果中“观看者还观看了”和“你可能也喜欢”标签已显示 - 隐藏视觉分隔符 - 视觉分隔符已隐藏 - 视觉分隔符已显示 - - 隐藏 YouTube 涂鸦 - 隐藏YouTube徽标上的Doodles动画 - YouTube 徽标上的 Doodles 动画已显示 - "YouTube Doodles 每年都会显示几天。 + 隐藏「显示更多」按钮 + 搜索结果中的显示更多按钮已隐藏 + 搜索结果中的显示更多按钮已显示 + 隐藏调查 + 问卷已隐藏 + 问卷已显示 + 隐藏票券架 + 票券架已隐藏 + 票券架已显示 + + 隐藏视频推荐标签 + 搜索结果中“观看者还观看了”和“你可能也喜欢”标签已隐藏 + 搜索结果中“观看者还观看了”和“你可能也喜欢”标签已显示 + 隐藏视觉分隔符 + 视觉分隔符已隐藏 + 视觉分隔符已显示 + + 隐藏 YouTube 涂鸦 + 隐藏YouTube徽标上的Doodles动画 + YouTube 徽标上的 Doodles 动画已显示 + "YouTube Doodles 每年都会显示几天。 如果您的地区当前正在显示 Doodle 并且此隐藏设置已开启,则搜索栏下方的筛选栏也将隐藏。" - 隐藏频道栏 - 频道栏已隐藏 - 频道栏已显示 - 隐藏频道水印 - 水印已隐藏 - 众筹框已隐藏 - 隐藏众筹框 - 众筹箱已隐藏 - 众筹框已隐藏 - 隐藏紧急框 - 紧急信息框已隐藏 - 紧急信息框已显示 - 隐藏信息面板 - 信息面板已隐藏 - 信息面板已显示 - - 隐藏“加入”按钮 - 加入按钮已隐藏 - 加入按钮已显示 - 隐藏医疗面板 - 医疗信息面板已隐藏 - 医疗信息面板已显示 - 隐藏快捷操作 - 全屏模式下的快捷操作已隐藏 - 全屏模式下的快捷操作已显示 - 隐藏相关视频 - 快捷操作中的相关视频已隐藏 - 快捷操作中的相关视频已显示 - 隐藏订阅者指南 - 订阅者社区准则已隐藏 - 订阅者社区准则已显示 - 隐藏限时反应 - 定时表情反应已隐藏 - 定时表情反应已显示 - 隐藏“AI 生成的视频摘要” - AI 生成的视频摘要部分已隐藏 - AI 生成的视频摘要部分已显示 - 隐藏“提问” - “提问”部分已隐藏 - “提问”部分已显示 - 隐藏属性 - 已隐藏“精选地点”、“游戏”、“音乐”和“提及的人物”部分 - 已显示“精选地点”、“游戏”、“音乐”和“提及的人物”部分 - 隐藏章节 - 「章节」部分已隐藏 - 「章节」部分已显示 - 隐藏“内容制作说明” - 内容制作说明部分已隐藏 - 「内容制作说明」部分已显示 - 隐藏热度积分 - 热度积分已隐藏 - 热度积分已显示 - 隐藏“浏览播客” - “浏览播客”部分已隐藏 - “浏览播客”部分已显示 - 隐藏精选链接 - 特色链接部分已隐藏 - 特色链接部分已显示 - 隐藏精选视频 - 精选视频部分已隐藏 - 精选视频部分已显示 - 隐藏信息卡 - 信息卡片部分已隐藏 - 信息卡片部分已显示 - 隐藏“主要概念” - “主要概念”部分已隐藏 - “主要概念”部分已显示 - 隐藏订阅按钮 - 订阅按钮已隐藏 - 订阅按钮已显示 - 隐藏文字记录 - 「转写文稿」部分已隐藏 - 「转写文稿」部分已显示 - 视频说明 - 隐藏或显示视频说明组件 - 筛选器栏 - 在动态、相关视频、搜索结果和观看历史中隐藏或显示筛选器栏 - 在动态中隐藏 - 已在动态中隐藏 - 已在动态中显示 - 在相关视频中隐藏 - 已在相关视频中隐藏 - 已在相关视频中显示 - 在搜索结果中隐藏 - 在搜索结果中已隐藏 - 在搜索结果中显示 - 在观看历史记录中隐藏 - 在观看历史中隐藏 - 在观看历史记录中显示 - 频道页面 - 隐藏或显示频道页面组件 - - 隐藏社区按钮 - “社区”按钮已隐藏 - “社区”按钮已显示 - - 隐藏“为你推荐”内容 - “为你推荐”专区已隐藏 - “为你推荐”专区已显示 - - 隐藏“加入”按钮 - “加入”按钮已隐藏 - “加入”按钮已显示 - 隐藏链接预览 - 链接预览已隐藏 - 链接预览已显示 - 隐藏会员专区 - 会员专区已隐藏 - 成员货架已显示 - - 隐藏“商店”按钮 - “商店”按钮已隐藏 - “商店”按钮已显示 - - 隐藏“订阅”按钮 - “订阅”按钮已隐藏 - “订阅”按钮已显示 - 评论 - 隐藏或显示评论部分 - 隐藏 AI 聊天摘要 - AI 聊天摘要已隐藏 - AI 聊天摘要已显示 - 隐藏 AI 评论摘要 - AI 评论摘要已隐藏 - AI 评论摘要已显示 - 隐藏频道准则 - 频道准则已隐藏 - 频道准则已显示 - 隐藏「会员的评论」标题 - 成员评论标题已隐藏 - 成员评论标题已显示 - 隐藏评论区 - 评论区已隐藏 - 评论区已显示 - 隐藏社区准则 - 社区准则已隐藏 - 社区准则已显示 - 隐藏「创建 Short」按钮 - “创建Shorts”按钮已隐藏 - “创建Shorts”按钮已显示 - 隐藏表情符号和时间戳按钮 - 表情符号和时间戳按钮已隐藏 - 表情符号和时间戳按钮已显示 - 隐藏评论预览 - 评论预览已隐藏 - 评论预览已显示 - 隐藏感谢按钮 - 感谢按钮已隐藏 - 感谢按钮已显示 - 隐藏观看次数 - 观看次数已在动态和搜索结果中隐藏 - 观看次数已在动态和搜索结果中显示 - - "限制: + 隐藏“加入”按钮 + 加入按钮已隐藏 + 加入按钮已显示 + 隐藏医疗面板 + 医疗信息面板已隐藏 + 医疗信息面板已显示 + 隐藏快捷操作 + 全屏模式下的快捷操作已隐藏 + 全屏模式下的快捷操作已显示 + 隐藏相关视频 + 快捷操作中的相关视频已隐藏 + 快捷操作中的相关视频已显示 + 隐藏订阅者指南 + 订阅者社区准则已隐藏 + 订阅者社区准则已显示 + 隐藏限时反应 + 定时表情反应已隐藏 + 定时表情反应已显示 + 隐藏“AI 生成的视频摘要” + AI 生成的视频摘要部分已隐藏 + AI 生成的视频摘要部分已显示 + 隐藏“提问” + “提问”部分已隐藏 + “提问”部分已显示 + 隐藏属性 + 已隐藏“精选地点”、“游戏”、“音乐”和“提及的人物”部分 + 已显示“精选地点”、“游戏”、“音乐”和“提及的人物”部分 + 隐藏章节 + 「章节」部分已隐藏 + 「章节」部分已显示 + 隐藏“内容制作说明” + 内容制作说明部分已隐藏 + 「内容制作说明」部分已显示 + 隐藏热度积分 + 热度积分已隐藏 + 热度积分已显示 + 隐藏“浏览播客” + “浏览播客”部分已隐藏 + “浏览播客”部分已显示 + 隐藏精选链接 + 特色链接部分已隐藏 + 特色链接部分已显示 + 隐藏精选视频 + 精选视频部分已隐藏 + 精选视频部分已显示 + 隐藏信息卡 + 信息卡片部分已隐藏 + 信息卡片部分已显示 + 隐藏“主要概念” + “主要概念”部分已隐藏 + “主要概念”部分已显示 + 隐藏订阅按钮 + 订阅按钮已隐藏 + 订阅按钮已显示 + 隐藏文字记录 + 「转写文稿」部分已隐藏 + 「转写文稿」部分已显示 + 视频说明 + 隐藏或显示视频说明组件 + 筛选器栏 + 在动态、相关视频、搜索结果和观看历史中隐藏或显示筛选器栏 + 在动态中隐藏 + 已在动态中隐藏 + 已在动态中显示 + 在相关视频中隐藏 + 已在相关视频中隐藏 + 已在相关视频中显示 + 在搜索结果中隐藏 + 在搜索结果中已隐藏 + 在搜索结果中显示 + 在观看历史记录中隐藏 + 在观看历史中隐藏 + 在观看历史记录中显示 + 频道页面 + 隐藏或显示频道页面组件 + + 隐藏社区按钮 + “社区”按钮已隐藏 + “社区”按钮已显示 + + 隐藏“为你推荐”内容 + “为你推荐”专区已隐藏 + “为你推荐”专区已显示 + + 隐藏“加入”按钮 + “加入”按钮已隐藏 + “加入”按钮已显示 + 隐藏链接预览 + 链接预览已隐藏 + 链接预览已显示 + 隐藏会员专区 + 会员专区已隐藏 + 成员货架已显示 + + 隐藏“商店”按钮 + “商店”按钮已隐藏 + “商店”按钮已显示 + + 隐藏“订阅”按钮 + “订阅”按钮已隐藏 + “订阅”按钮已显示 + 评论 + 隐藏或显示评论部分 + 隐藏 AI 聊天摘要 + AI 聊天摘要已隐藏 + AI 聊天摘要已显示 + 隐藏 AI 评论摘要 + AI 评论摘要已隐藏 + AI 评论摘要已显示 + 隐藏频道准则 + 频道准则已隐藏 + 频道准则已显示 + 隐藏「会员的评论」标题 + 成员评论标题已隐藏 + 成员评论标题已显示 + 隐藏评论区 + 评论区已隐藏 + 评论区已显示 + 隐藏社区准则 + 社区准则已隐藏 + 社区准则已显示 + 隐藏「创建 Short」按钮 + “创建Shorts”按钮已隐藏 + “创建Shorts”按钮已显示 + 隐藏表情符号和时间戳按钮 + 表情符号和时间戳按钮已隐藏 + 表情符号和时间戳按钮已显示 + 隐藏评论预览 + 评论预览已隐藏 + 评论预览已显示 + 隐藏感谢按钮 + 感谢按钮已隐藏 + 感谢按钮已显示 + 隐藏观看次数 + 观看次数已在动态和搜索结果中隐藏 + 观看次数已在动态和搜索结果中显示 + + "限制: • Shorts 栏目、频道页面和搜索结果可能仍会显示观看次数 • 此功能不适用于车载设备" - 隐藏上传时间 - 上传时间在动态和搜索结果中已隐藏 - 上传时间在动态和搜索结果中显示 - - "限制: + 隐藏上传时间 + 上传时间在动态和搜索结果中已隐藏 + 上传时间在动态和搜索结果中显示 + + "限制: • Shorts 专区、频道页面和搜索结果可能仍会显示上传时间 • 此功能不适用于车载设备" - 隐藏关键字内容 - 使用关键字过滤隐藏搜索和动态消息中的视频 - 过滤首页视频 - 首页视频将会根据关键字进行过滤 - 首页视频不会根据关键字进行过滤 - 过滤搜索结果 - 搜索结果将会根据关键字过滤 - 搜索结果不会根据关键字过滤 - 过滤订阅视频 - 订阅视频将会根据关键字进行过滤 - 订阅视频不会根据关键字进行过滤 - 要隐藏的关键字 - - "请输入要隐藏的关键词和短语,换行隔开 + "请输入要隐藏的关键词和短语,换行隔开 关键词可以是频道名称或视频标题中的任何文本 中间带有大写字母的单词必须按照字母的大小写输入 (例如: iPhone、TikTok、LeBlanc)" - 关于关键字过滤 - "首页/订阅/搜索结果会过滤掉与关键词短语匹配的内容 + 关于关键字过滤 + "首页/订阅/搜索结果会过滤掉与关键词短语匹配的内容 限制 • Shorts 无法通过频道名称隐藏 • 某些 UI 组件可能不会隐藏 • 搜索关键词可能没有结果" - 匹配整个词语 - - 使用带双引号的关键字/短语来防止过滤掉只有部分匹配的视频标题和频道名称<br><br>例如,<br><b>\"ai\"</b> 将隐藏视频: <b>How does AI work?</b><br>但不会隐藏: <b>What does fair use mean?</b> - - 无法使用关键词:%s - 添加引号以使用关键词:%s - 关键词存在冲突声明:%s - 关键词过短,需要加上引号:%s - 关键词将隐藏所有影片:%s - - - 隐藏创作者商店专区 - 视频播放器下方的创作者商店内容架已隐藏 - 视频播放器下方的创作者商店货架已显示 - 商店横幅已隐藏 - 结束画面商店横幅已隐藏 - 结束画面商店横幅已显示 - 隐藏全屏广告 - "全屏广告已隐藏 + 匹配整个词语 + + 使用带双引号的关键字/短语来防止过滤掉只有部分匹配的视频标题和频道名称<br><br>例如,<br><b>\"ai\"</b> 将隐藏视频: <b>How does AI work?</b><br>但不会隐藏: <b>What does fair use mean?</b> + + 无法使用关键词:%s + 添加引号以使用关键词:%s + 关键词存在冲突声明:%s + 关键词过短,需要加上引号:%s + 关键词将隐藏所有影片:%s + + + 隐藏创作者商店专区 + 视频播放器下方的创作者商店内容架已隐藏 + 视频播放器下方的创作者商店货架已显示 + 商店横幅已隐藏 + 结束画面商店横幅已隐藏 + 结束画面商店横幅已显示 + 隐藏全屏广告 + "全屏广告已隐藏 此功能仅适用于旧设备" - 全屏广告已显示 - - 隐藏全屏广告只适用于旧设备 - 隐藏一般广告 - 一般广告已隐藏 - 一般广告已显示 - 隐藏商品广告横幅 - 已隐藏商品横幅 - 已显示商品横幅 - 隐藏付费推广标签 - 付费推广标签已隐藏 - 付费推广标签已显示 - 隐藏自我推广卡片 - 自我推广卡片已隐藏 - 自我推广卡片已显示 - 隐藏购物链接 - 视频说明中的购物链接已隐藏 - 视频描述中的购物链接已显示 - 隐藏“查看商品”横幅 - 视频叠加层中的查看商品横幅已隐藏 - 视频叠加层中的查看商品横幅已显示 - 隐藏网页搜索结果 - 网页搜索结果已隐藏 - 网页搜索结果已显示 - - - 隐藏 YouTube Premium 促销推广 - YouTube Premium促销推广已隐藏 - YouTube Premium促销推广已显示 - - - 隐藏视频广告 - 视频广告已隐藏 - 视频广告已显示 - - - URL 已复制到剪贴板 - URL 已复制,包含时间戳 - 显示复制视频 URL 按钮 - “复制视频网址”按钮已显示。点按可复制视频网址。长按可复制带时间戳的视频网址 - “复制视频网址”按钮未显示 - 显示复制带有时间戳的 URL 按钮 - “复制带时间戳的网址”按钮已显示。点按可复制带时间戳的视频网址。长按可复制不带时间戳的视频网址 - “复制带时间戳的网址”按钮未显示 - - - 移除「观看须知」对话框 - 「观看须知」对话框将被移除 - 「观看须知」对话框将会显示 - 这并不会绕过年龄限制,只是自动按下接受按钮。 - - - 停用“登录到电视”弹出窗口 - 登录电视弹出窗口已禁用 - 登录电视弹出窗口已启用 - - - 禁用双击章节跳过 - 双击永远不会触发跳到下一/上一章节 - 双击偶尔会触发跳到下一/上一章节 - - - 外部下载 - 使用外部下载器的设置 - 显示外部下载按钮 - 播放器中显示下载按钮 - 播放器中未显示下载按钮 - - 覆盖「下载」按钮 - 下载按钮打开你的外部下载工具 - 下载按钮打开主要的在服务程序下载工具 - 下载器的应用包名 - 您已安装的外部下载器应用的包名 - 输入包名 - 其他 - 应用未安装 - %s 未安装,请安装。 - "找不到包名为 %s 的已安装应用 + 全屏广告已显示 + + 隐藏全屏广告只适用于旧设备 + 隐藏一般广告 + 一般广告已隐藏 + 一般广告已显示 + 隐藏商品广告横幅 + 已隐藏商品横幅 + 已显示商品横幅 + 隐藏付费推广标签 + 付费推广标签已隐藏 + 付费推广标签已显示 + 隐藏自我推广卡片 + 自我推广卡片已隐藏 + 自我推广卡片已显示 + 隐藏购物链接 + 视频说明中的购物链接已隐藏 + 视频描述中的购物链接已显示 + 隐藏“查看商品”横幅 + 视频叠加层中的查看商品横幅已隐藏 + 视频叠加层中的查看商品横幅已显示 + 隐藏网页搜索结果 + 网页搜索结果已隐藏 + 网页搜索结果已显示 + + + 隐藏 YouTube Premium 促销推广 + YouTube Premium促销推广已隐藏 + YouTube Premium促销推广已显示 + + + 隐藏视频广告 + 视频广告已隐藏 + 视频广告已显示 + + + URL 已复制到剪贴板 + URL 已复制,包含时间戳 + 显示复制视频 URL 按钮 + “复制视频网址”按钮已显示。点按可复制视频网址。长按可复制带时间戳的视频网址 + “复制视频网址”按钮未显示 + 显示复制带有时间戳的 URL 按钮 + “复制带时间戳的网址”按钮已显示。点按可复制带时间戳的视频网址。长按可复制不带时间戳的视频网址 + “复制带时间戳的网址”按钮未显示 + + + 移除「观看须知」对话框 + 「观看须知」对话框将被移除 + 「观看须知」对话框将会显示 + 这并不会绕过年龄限制,只是自动按下接受按钮。 + + + 停用“登录到电视”弹出窗口 + 登录电视弹出窗口已禁用 + 登录电视弹出窗口已启用 + + + 禁用双击章节跳过 + 双击永远不会触发跳到下一/上一章节 + 双击偶尔会触发跳到下一/上一章节 + + + 外部下载 + 使用外部下载器的设置 + 显示外部下载按钮 + 播放器中显示下载按钮 + 播放器中未显示下载按钮 + + 覆盖「下载」按钮 + 下载按钮打开你的外部下载工具 + 下载按钮打开主要的在服务程序下载工具 + 下载器的应用包名 + 您已安装的外部下载器应用的包名 + 输入包名 + 其他 + 应用未安装 + %s 未安装,请安装。 + "找不到包名为 %s 的已安装应用 请验证包名是否正确且应用已安装" - 包名不能为空 - - - 禁用上滑精确定位进度手势 - 精准定位手势已禁用 - 精准定位手势已启用 - - - 启用点击以快进 - 点击以启用搜寻 - 点击以快进已禁用 - - - 启用亮度控制手势 - "已启用全屏亮度滑动 + 包名不能为空 + + + 禁用上滑精确定位进度手势 + 精准定位手势已禁用 + 精准定位手势已启用 + + + 启用点击以快进 + 点击以启用搜寻 + 点击以快进已禁用 + + + 启用亮度控制手势 + "已启用全屏亮度滑动 通过在屏幕左侧垂直滑动来调节亮度" - 已停用全屏亮度滑动 - 启用音量手势 - "已启用全屏音量滑动 + 已停用全屏亮度滑动 + 启用音量手势 + "已启用全屏音量滑动 通过在屏幕右侧垂直滑动来调节音量" - 已停用全屏音量滑动 - 启用按压以滑动的手势 - 按压以滑动已启用 - 按压以滑动已禁用 - 使用触感反馈 - 触感反馈已启用 - 触感反馈已禁用 - 保存并恢复亮度 - 退出/进入全屏时保存和恢复亮度 - 退出/进入全屏时不保存或恢复亮度 - 启用自动亮度手势 - 滑动到最低亮度手势将启用自动亮度 - 滑动到最低亮度手势不启用自动亮度 - 自动 - 滑动提示层显示时长 - 滑动提示的显示时长(毫秒) - 滑动提示层背景的不透明度 - 不透明度值介于 0-100 之间 - 滑动不透明度必须介于 0-100 之间 - 滑动提示层亮度颜色 - 亮度控件进度条的颜色 - 滑动提示层音量颜色 - 音量控件进度条的颜色 - 滑动提示层文字大小 - 滑动提示层的文字大小,范围为 1-30 - 文字大小必须在 1-30 之间 - 滑动幅度阈值 - 防误触的滑动幅度阈值 - 音量滑动灵敏度 - 每次滑动音量变化的幅度 - 滑动提示层样式 - 水平提示层 - 水平提示层 (极简 - 顶部) - 水平提示层 (极简 - 中心) - 圆形提示层 - 圆形提示层 (极简) - 垂直提示层 - 垂直提示层 (极简) - 启用滑动切换视频 - 在全屏模式下滑动将切换到下一个/上一个视频 - 在全屏模式下滑动将不会切换到下一个/上一个视频 - - - 禁用自动字幕 - 自动字幕已禁用 - 自动字幕已启用 - - - 操作按钮 - 隐藏或显示视频下的按钮 - 禁用点赞和订阅光晕效果 - 提及时,喜欢和订阅按钮不会发光 - 提及时,喜欢和订阅按钮会发光 - 隐藏「顶」和「踩」按钮 - 点赞与点踩按钮已隐藏 - 点赞与点踩按钮已显示 - - 隐藏「分享」按钮 - 分享按钮已隐藏 - 分享按钮已显示 - - 隐藏停止广告 - 停止广告按钮已隐藏 - 停止广告按钮已显示 - - 隐藏评论 - 评论按钮已隐藏 - 评论按钮已显示 - + 隐藏「分享」按钮 + 分享按钮已隐藏 + 分享按钮已显示 + + 隐藏停止广告 + 停止广告按钮已隐藏 + 停止广告按钮已显示 + + 隐藏评论 + 评论按钮已隐藏 + 评论按钮已显示 + - 隐藏「举报」 - 举报按钮已隐藏 - 举报按钮已显示 - - 隐藏「混剪」按钮 - 混剪按钮已隐藏 - 混剪按钮已显示 - - 隐藏「下载」按钮 - 下载按钮已隐藏 - 下载按钮已显示 - + 隐藏「混剪」按钮 + 混剪按钮已隐藏 + 混剪按钮已显示 + + 隐藏「下载」按钮 + 下载按钮已隐藏 + 下载按钮已显示 + - 隐藏热度 - 浮夸按钮已隐藏 - 热度按钮已显示 - - 隐藏推广 - 推广按钮已隐藏 - 推广按钮已显示 - - 隐藏「感谢」按钮 - 感谢按钮已隐藏 - 感谢按钮已显示 - + 隐藏推广 + 推广按钮已隐藏 + 推广按钮已显示 + + 隐藏「感谢」按钮 + 感谢按钮已隐藏 + 感谢按钮已显示 + - 隐藏“提问” - “提问”按钮已隐藏 - “提问”按钮已显示 - - 隐藏「剪辑」按钮 - 剪辑按钮已隐藏 - 剪辑按钮已显示 - - 隐藏购物 - 购物按钮已隐藏 - 购物按钮已显示 - - 隐藏保存 - 保存按钮已隐藏 - 保存按钮已显示 - - - 导航栏按钮 - 隐藏或更改导航栏中的按钮 - - 隐藏「首页」 - 首页按钮已隐藏 - 首页按钮已显示 - - 隐藏「Shorts」 - Shorts 按钮已隐藏 - Shorts 按钮已显示 - - 隐藏创作的「+」号按钮 - 创作按钮已隐藏 - 创作按钮已显示 - - 隐藏「订阅」按钮 - 订阅按钮已隐藏 - 订阅按钮已显示 - 隐藏通知 - 通知按钮已隐藏 - 通知按钮已显示 - - 将「创作」改成「通知」按钮 - "创作按钮将切换成通知按钮 + 隐藏“提问” + “提问”按钮已隐藏 + “提问”按钮已显示 + + 隐藏「剪辑」按钮 + 剪辑按钮已隐藏 + 剪辑按钮已显示 + + 隐藏购物 + 购物按钮已隐藏 + 购物按钮已显示 + + 隐藏保存 + 保存按钮已隐藏 + 保存按钮已显示 + + + 导航栏按钮 + 隐藏或更改导航栏中的按钮 + + 隐藏「首页」 + 首页按钮已隐藏 + 首页按钮已显示 + + 隐藏「Shorts」 + Shorts 按钮已隐藏 + Shorts 按钮已显示 + + 隐藏创作的「+」号按钮 + 创作按钮已隐藏 + 创作按钮已显示 + + 隐藏「订阅」按钮 + 订阅按钮已隐藏 + 订阅按钮已显示 + 隐藏通知 + 通知按钮已隐藏 + 通知按钮已显示 + + 将「创作」改成「通知」按钮 + "创作按钮将切换成通知按钮 注意:启用此功能也会强制隐藏视频广告" - 创作按钮未切换成通知按钮 - "禁用此设置也会禁用 Shorts 广告拦截。 + 创作按钮未切换成通知按钮 + "禁用此设置也会禁用 Shorts 广告拦截。 如果更改此设置未生效,请尝试切换到无痕模式。" - 隐藏导航栏按钮标签 - 标签已隐藏 - 标签已显示 - 禁用半透明状态栏 - 状态栏为不透明 - 状态栏为不透明或半透明 - 在某些设备上,启用此功能可能会将系统导航栏更改为透明。 - 禁用浅色半透明导航栏 - 浅色模式的导航栏不透明 - 浅色模式导航栏为不透明或半透明 - 禁用深色半透明栏 - 深色模式的导航栏不透明 - 深色模式导航栏为不透明或半透明 - - - 弹出菜单 - 隐藏或显示播放器弹出菜单项 - - 隐藏「字幕」按钮 - 字幕选单已隐藏 - 字幕选单已显示 - - 隐藏「其他设置」 - 其他设置菜单已隐藏 - 其他设置菜单已显示 - - 隐藏「休眠定时器」 - 休眠定时器已隐藏 - 休眠定时器已显示 - - 隐藏「循环播放视频」 - 循环播放视频已隐藏 - 循环播放视频已显示 - - 隐藏「氛围模式」 - 氛围模式已隐藏 - 氛围模式已显示 - 隐藏「稳定音量」 - 稳定音量已显示 - 稳定音量已隐藏 - - 隐藏「帮助和反馈」 - 帮助和反馈菜单项已隐藏 - 帮助 & 反馈菜单已显示 - - 隐藏「播放速度」选单 - 播放速度选单已隐藏 - 播放速度选单已显示 - - 隐藏「锁定屏幕」 - 锁定屏幕菜单已隐藏 - 锁定屏幕菜单已显示 - - 隐藏通过 YouTube Music 收听 - 通过 YouTube Music 收听菜单已隐藏 - 通过 YouTube Music 收听菜单已显示 - - 隐藏「音轨」 - 音轨菜单已隐藏 - 音轨菜单已显示 - + 隐藏「字幕」按钮 + 字幕选单已隐藏 + 字幕选单已显示 + + 隐藏「其他设置」 + 其他设置菜单已隐藏 + 其他设置菜单已显示 + + 隐藏「休眠定时器」 + 休眠定时器已隐藏 + 休眠定时器已显示 + + 隐藏「循环播放视频」 + 循环播放视频已隐藏 + 循环播放视频已显示 + + 隐藏「氛围模式」 + 氛围模式已隐藏 + 氛围模式已显示 + 隐藏「稳定音量」 + 稳定音量已显示 + 稳定音量已隐藏 + + 隐藏「帮助和反馈」 + 帮助和反馈菜单项已隐藏 + 帮助 & 反馈菜单已显示 + + 隐藏「播放速度」选单 + 播放速度选单已隐藏 + 播放速度选单已显示 + + 隐藏「锁定屏幕」 + 锁定屏幕菜单已隐藏 + 锁定屏幕菜单已显示 + + 隐藏通过 YouTube Music 收听 + 通过 YouTube Music 收听菜单已隐藏 + 通过 YouTube Music 收听菜单已显示 + + 隐藏「音轨」 + 音轨菜单已隐藏 + 音轨菜单已显示 + - "已隱藏「音軌」選單 + "已隱藏「音軌」選單 如要顯示音軌選單,請將「欺騙視訊串流」變更為「Android No SDK」" - - 隐藏「在 VR 模式下观看」 - 在 VR 模式下观看已隐藏 - 在 VR 模式下观看已显示 - 隐藏视频质量菜单 - 视频质量菜单已隐藏 - 视频质量菜单已显示 - 隐藏「画质」选单下的提示页脚 - 画质选单页脚已隐藏 - 画质选单页脚已显示 - - - 隐藏「自动播放」按钮 - 自动播放按钮已隐藏 - 自动播放按钮已显示 - - 隐藏「字幕」按钮 - 字幕按钮已隐藏 - 字幕按钮已显示 - 隐藏「投屏」按钮 - 投屏按钮已隐藏 - 投屏按钮已显示 - 隐藏播放器控件背景 - 播放器控件背景已隐藏 - 播放器控件背景已显示 - 隐藏上一个和下一个按钮 - 按钮已隐藏 - 按钮已显示 - - - 隐藏片尾卡 - 片尾卡已隐藏 - 片尾卡已显示 - - - 在全屏时禁用氛围模式 - 氛围模式已禁用 - 氛围模式已启用 - - - 隐藏信息卡片 - 信息卡片已隐藏 - 信息卡片已显示 - - - 禁用数字滚动动画效果 - 滚动动画已禁用 - 滚动动画已启用 - - - 隐藏视频播放器进度条 - 视频播放器进度条已隐藏 - 视频播放器进度条已显示 - - 隐藏视频缩略图进度条 - 视频缩略图进度条已隐藏 - 视频缩略图进度条已显示 - - - Shorts 播放器 - 隐藏或显示 Shorts 播放器组件 - - 在首页信息流中隐藏Shorts - 已在首页信息流和相关视频中隐藏 - 已在首页信息流和相关视频中显示 - 在搜索结果中隐藏 Shorts 视频 - 在搜索结果中隐藏 - 显示在搜索结果中 - - 在订阅内容流中隐藏Shorts - 已在订阅内容流中隐藏 - 已在订阅内容流中显示 - 在观看历史中隐藏 Shorts - 隐藏在观看历史记录中 - 显示在观看历史中 - 隐藏“自动配音”标签 - 自动配音标签已隐藏 - 自动配音标签已显示 - 隐藏“购买超级感谢”按钮 - 购买超级感谢按钮已隐藏 - 购买超级感谢按钮已显示 - 隐藏特效按钮 - 特效按钮已隐藏 - 特效按钮已显示 - 隐藏“绿幕”按钮 - 绿屏按钮已隐藏 - 绿屏按钮已显示 - 隐藏话题标签按钮 - 话题标签按钮已隐藏 - 话题标签按钮已显示 - - 隐藏「加入」按钮 - 加入按钮已隐藏 - 加入按钮已显示 - 隐藏实时预览 - 实时预览已隐藏 - 实时预览已显示 - 隐藏位置标签 - 位置标签已隐藏 - 位置标签已显示 - 隐藏“新帖子”按钮 - 隐藏“新帖”按钮 - 显示“新帖”按钮 - 隐藏暂停时显示的叠加层按钮 - 暂停时的叠加层按钮已隐藏 - 暂停时的叠加层按钮已显示 - 隐藏预览评论 - 预览评论已隐藏 - 预览评论已显示 - 隐藏“保存音乐”按钮 - 保存音乐按钮已隐藏 - 保存音乐按钮已显示 - 隐藏搜索建议 - 搜索建议已隐藏 - 搜索建议已显示 - 隐藏商店按钮 - 商店按钮已隐藏 - 商店按钮已显示 - 隐藏贴纸 - 贴纸已隐藏 - 贴纸已显示 - 隐藏「订阅」按钮 - 订阅按钮已隐藏 - 订阅按钮已显示 - 隐藏标记的商品 - 标记商品已隐藏 - 标记商品已显示 - 隐藏「即将发布」按钮 - 即将上映按钮已隐藏 - 即将上映按钮已显示 - 隐藏“使用此声音”按钮 - “使用此声音”按钮已隐藏 - “使用此声音”按钮已显示 - 隐藏“使用此模板”按钮 - “使用此模板”按钮已隐藏 - “使用此模板”按钮已显示 - 隐藏点赞按钮喷泉动画 - 点赞按钮喷泉动画已隐藏 - 点赞按钮喷泉动画已显示 - 隐藏点赞按钮 - 点赞按钮已隐藏 - 点赞按钮已显示 - 隐藏点踩按钮 - 点踩按钮已隐藏 - 点踩按钮已显示 - 隐藏评论按钮 - 评论按钮已隐藏 - 评论按钮已显示 - - 隐藏分享按钮 - 分享按钮已隐藏 - 分享按钮已显示 - - 隐藏混剪按钮 - 混剪按钮已隐藏 - 混剪按钮已显示 - 隐藏声音按钮 - 声音按钮已隐藏 - 声音按钮已显示 - 隐藏信息面板 - 信息面板已隐藏 - 信息面板已显示 - 隐藏频道栏 - 频道栏已隐藏 - 频道栏已显示 - 隐藏视频标题 - 视频标题已隐藏 - 视频标题已显示 - 隐藏声音元数据标签 - 音频元数据标签已隐藏 - 音频元数据标签已显示 - 隐藏视频链接标签 - 视频链接标签已隐藏 - 视频链接标签已显示 - 隐藏导航栏 - 导航栏已隐藏 - 导航栏已显示 - - - 隐藏片尾画面推荐视频 - "自动播放关闭时隐藏片尾画面推荐视频 + + 隐藏「在 VR 模式下观看」 + 在 VR 模式下观看已隐藏 + 在 VR 模式下观看已显示 + 隐藏视频质量菜单 + 视频质量菜单已隐藏 + 视频质量菜单已显示 + 隐藏「画质」选单下的提示页脚 + 画质选单页脚已隐藏 + 画质选单页脚已显示 + + + 隐藏「自动播放」按钮 + 自动播放按钮已隐藏 + 自动播放按钮已显示 + + 隐藏「字幕」按钮 + 字幕按钮已隐藏 + 字幕按钮已显示 + 隐藏「投屏」按钮 + 投屏按钮已隐藏 + 投屏按钮已显示 + 隐藏播放器控件背景 + 播放器控件背景已隐藏 + 播放器控件背景已显示 + 隐藏上一个和下一个按钮 + 按钮已隐藏 + 按钮已显示 + + + 隐藏片尾卡 + 片尾卡已隐藏 + 片尾卡已显示 + + + 在全屏时禁用氛围模式 + 氛围模式已禁用 + 氛围模式已启用 + + + 隐藏信息卡片 + 信息卡片已隐藏 + 信息卡片已显示 + + + 禁用数字滚动动画效果 + 滚动动画已禁用 + 滚动动画已启用 + + + 隐藏视频播放器进度条 + 视频播放器进度条已隐藏 + 视频播放器进度条已显示 + + 隐藏视频缩略图进度条 + 视频缩略图进度条已隐藏 + 视频缩略图进度条已显示 + + + Shorts 播放器 + 隐藏或显示 Shorts 播放器组件 + + 在首页信息流中隐藏Shorts + 已在首页信息流和相关视频中隐藏 + 已在首页信息流和相关视频中显示 + 在搜索结果中隐藏 Shorts 视频 + 在搜索结果中隐藏 + 显示在搜索结果中 + + 在订阅内容流中隐藏Shorts + 已在订阅内容流中隐藏 + 已在订阅内容流中显示 + 在观看历史中隐藏 Shorts + 隐藏在观看历史记录中 + 显示在观看历史中 + 隐藏“自动配音”标签 + 自动配音标签已隐藏 + 自动配音标签已显示 + 隐藏“购买超级感谢”按钮 + 购买超级感谢按钮已隐藏 + 购买超级感谢按钮已显示 + 隐藏特效按钮 + 特效按钮已隐藏 + 特效按钮已显示 + 隐藏“绿幕”按钮 + 绿屏按钮已隐藏 + 绿屏按钮已显示 + 隐藏话题标签按钮 + 话题标签按钮已隐藏 + 话题标签按钮已显示 + + 隐藏「加入」按钮 + 加入按钮已隐藏 + 加入按钮已显示 + 隐藏实时预览 + 实时预览已隐藏 + 实时预览已显示 + 隐藏位置标签 + 位置标签已隐藏 + 位置标签已显示 + 隐藏“新帖子”按钮 + 隐藏“新帖”按钮 + 显示“新帖”按钮 + 隐藏暂停时显示的叠加层按钮 + 暂停时的叠加层按钮已隐藏 + 暂停时的叠加层按钮已显示 + 隐藏预览评论 + 预览评论已隐藏 + 预览评论已显示 + 隐藏“保存音乐”按钮 + 保存音乐按钮已隐藏 + 保存音乐按钮已显示 + 隐藏搜索建议 + 搜索建议已隐藏 + 搜索建议已显示 + 隐藏商店按钮 + 商店按钮已隐藏 + 商店按钮已显示 + 隐藏贴纸 + 贴纸已隐藏 + 贴纸已显示 + 隐藏「订阅」按钮 + 订阅按钮已隐藏 + 订阅按钮已显示 + 隐藏标记的商品 + 标记商品已隐藏 + 标记商品已显示 + 隐藏「即将发布」按钮 + 即将上映按钮已隐藏 + 即将上映按钮已显示 + 隐藏“使用此声音”按钮 + “使用此声音”按钮已隐藏 + “使用此声音”按钮已显示 + 隐藏“使用此模板”按钮 + “使用此模板”按钮已隐藏 + “使用此模板”按钮已显示 + 隐藏点赞按钮喷泉动画 + 点赞按钮喷泉动画已隐藏 + 点赞按钮喷泉动画已显示 + 隐藏点赞按钮 + 点赞按钮已隐藏 + 点赞按钮已显示 + 隐藏点踩按钮 + 点踩按钮已隐藏 + 点踩按钮已显示 + 隐藏评论按钮 + 评论按钮已隐藏 + 评论按钮已显示 + + 隐藏分享按钮 + 分享按钮已隐藏 + 分享按钮已显示 + + 隐藏混剪按钮 + 混剪按钮已隐藏 + 混剪按钮已显示 + 隐藏声音按钮 + 声音按钮已隐藏 + 声音按钮已显示 + 隐藏信息面板 + 信息面板已隐藏 + 信息面板已显示 + 隐藏频道栏 + 频道栏已隐藏 + 频道栏已显示 + 隐藏视频标题 + 视频标题已隐藏 + 视频标题已显示 + 隐藏声音元数据标签 + 音频元数据标签已隐藏 + 音频元数据标签已显示 + 隐藏视频链接标签 + 视频链接标签已隐藏 + 视频链接标签已显示 + 隐藏导航栏 + 导航栏已隐藏 + 导航栏已显示 + + + 隐藏片尾画面推荐视频 + "自动播放关闭时隐藏片尾画面推荐视频 可以在 YouTube 设置中更改自动播放设置: 设置 → 播放 → 自动播放下一个视频" - 显示片尾画面推荐视频 - - - 隐藏相关视频叠加层 - 全屏模式下的相关视频叠加层已隐藏 - 全屏模式下的相关视频叠加层已显示 - - - 隐藏视频时间戳 - 时间戳已隐藏 - 时间戳已显示 - - - 隐藏播放器弹出面板 - 播放器弹出面板已隐藏 - 播放器弹出面板已显示 - - - 视频结尾时退出全屏模式 - 已禁用 - 纵向显示 - 横向显示 - 纵向和横向显示 - - - 以全屏纵向模式打开视频 - 视频以全屏模式打开 - 视频不会以全屏模式打开 - - - 播放器叠加层不透明度 - 不透明度值介于 0-100 之间,其中 0 为透明 - 播放器叠加层不透明度必须介于 0-100 之间 - - - - 点踩数暂时不可用 (API 连接超时) - 点踩数不可用 (状态 %d) - 无法使用“不喜欢”(客户端 API 限制) - 点踩数不可用 (%s) - - 重新加载视频,使用 Return YouTube Dislike 投票 - - 所有者已隐藏 - 点踩数已显示 - 点踩数已隐藏 - 在 Shorts 上显示点踩数 - "Shorts 上显示“不喜欢” + 显示片尾画面推荐视频 + + + 隐藏相关视频叠加层 + 全屏模式下的相关视频叠加层已隐藏 + 全屏模式下的相关视频叠加层已显示 + + + 隐藏视频时间戳 + 时间戳已隐藏 + 时间戳已显示 + + + 隐藏播放器弹出面板 + 播放器弹出面板已隐藏 + 播放器弹出面板已显示 + + + 视频结尾时退出全屏模式 + 已禁用 + 纵向显示 + 横向显示 + 纵向和横向显示 + + + 以全屏纵向模式打开视频 + 视频以全屏模式打开 + 视频不会以全屏模式打开 + + + 播放器叠加层不透明度 + 不透明度值介于 0-100 之间,其中 0 为透明 + 播放器叠加层不透明度必须介于 0-100 之间 + + + + 点踩数暂时不可用 (API 连接超时) + 点踩数不可用 (状态 %d) + 无法使用“不喜欢”(客户端 API 限制) + 点踩数不可用 (%s) + + 重新加载视频,使用 Return YouTube Dislike 投票 + + 所有者已隐藏 + 点踩数已显示 + 点踩数已隐藏 + 在 Shorts 上显示点踩数 + "Shorts 上显示“不喜欢” 限制:在隐身模式下可能不显示“不喜欢”" - Shorts 上不显示“不喜欢” - 点踩百分比 - “不喜欢”显示为百分比 - “不喜欢”显示为数字 - - 紧凑点赞按钮 - 点赞按钮设置为最小宽度 - 点赞按钮设置为最佳外观 - 显示估计的点赞数 - 已禁用点赞的视频会显示估计的点赞数 - 不显示估计的点赞数 - 如果 API 不可用,则显示提示 - 如果 Return YouTube Dislike 不可用,则显示提示 - 如果 Return YouTube Dislike 不可用,则不显示提示 - 数据由 Return YouTube Dislike API 提供。点击此处了解更多 - - ReturnYouTubeDislike API 设备统计信息 - API 响应时间,平均值 - API 响应时间,最小值 - API 响应时间,最大值 - API 响应时间,上次视频 - 不喜欢暂时不可用 - 客户端 API 速率限制生效 - API 获取投票,调用次数 - 没有进行网络调用 - %d 次网络调用 - API 获取投票,超时次数 - 没有网络调用超时 - %d 次网络调用超时 - API 客户端速率限制 - 没有遇到客户端速率限制 - 遇到客户端速率限制 %d 次 - %d 毫秒 - - - 启用宽搜索栏 - 宽搜索栏已启用 - 宽搜索栏已禁用 - - - 启用高质量缩略图 - 进度条缩略图质量为高质量 - 进度条缩略图质量为中等质量 - 全屏进度条缩略图质量为中等质量 - "这也会恢复没有进度条缩略图的直播的缩略图 + Shorts 上不显示“不喜欢” + 点踩百分比 + “不喜欢”显示为百分比 + “不喜欢”显示为数字 + + 紧凑点赞按钮 + 点赞按钮设置为最小宽度 + 点赞按钮设置为最佳外观 + 显示估计的点赞数 + 已禁用点赞的视频会显示估计的点赞数 + 不显示估计的点赞数 + 如果 API 不可用,则显示提示 + 如果 Return YouTube Dislike 不可用,则显示提示 + 如果 Return YouTube Dislike 不可用,则不显示提示 + 数据由 Return YouTube Dislike API 提供。点击此处了解更多 + + ReturnYouTubeDislike API 设备统计信息 + API 响应时间,平均值 + API 响应时间,最小值 + API 响应时间,最大值 + API 响应时间,上次视频 + 不喜欢暂时不可用 - 客户端 API 速率限制生效 + API 获取投票,调用次数 + 没有进行网络调用 + %d 次网络调用 + API 获取投票,超时次数 + 没有网络调用超时 + %d 次网络调用超时 + API 客户端速率限制 + 没有遇到客户端速率限制 + 遇到客户端速率限制 %d 次 + %d 毫秒 + + + 启用宽搜索栏 + 宽搜索栏已启用 + 宽搜索栏已禁用 + + + 启用高质量缩略图 + 进度条缩略图质量为高质量 + 进度条缩略图质量为中等质量 + 全屏进度条缩略图质量为中等质量 + "这也会恢复没有进度条缩略图的直播的缩略图 进度条缩略图将使用与当前视频相同的质量。 此功能在视频质量为 720p 或更低且使用非常快的互联网连接时效果最佳。" - 恢复旧的进度条缩略图 - 进度条缩略图将显示在进度条上方 - 进度条缩略图将显示在全屏 - - - 启用 SponsorBlock - SponsorBlock 是一个众包平台,旨在帮助人们跳过 YouTube 视频中烦人的部分 - 外观 - 显示投票按钮 - 显示片段投票按钮 - 不显示片段投票按钮 - 使用方形控件 - 按钮和控件已使用方形样式 - 按钮和控件已使用圆角样式 - - 使用紧凑的跳过按钮 - 跳过按钮样式为最小宽度 - 跳过按钮样式为最佳外观 - 自动隐藏跳过按钮 - 跳过按钮在几秒后隐藏 - 整个片段都会显示“跳过”按钮 - 跳过按钮时长 - 跳过和跳到精彩时刻按钮在自动隐藏之前的显示时长 - 显示撤销跳过浮层提示 - 当片段被自动跳过时会显示浮层提示。轻触浮层提示通知以撤销跳过 - 提示未显示 - 跳过提示时长 - 「撤销跳过」提示的显示时长 - 1 秒 - 2 秒 - 3 秒 - 4 秒 - 5秒 - 6 秒 - 7 秒 - 8 秒 - 9 秒 - 10 秒 - 显示没有片段的视频长度 - 进度条上显示视频总时长(已减去所有分段) - 显示完整视频长度 - 创建新的片段 - 显示“创建新片段”按钮 - 显示创建新的片段按钮 - 不显示创建新的片段按钮 - 调整新片段步长 - 创建新的片段时时间调整按钮移动的毫秒数 - 值必须是正数 - 查看准则 - 指南包含创建新片段的规则和提示 - 遵循指南 - 在创建新片段之前阅读 SponsorBlock 指南 - 已读 - 展示 - 常规 - 如果 API 不可用,显示一个\"提示\" - 如果 SponsorBlock 不可用,显示一个\"提示\" - 如果 SponsorBlock 不可用,不显示\"提示\" - 启用跳过次数跟踪 - 让 SponsorBlock 排行榜了解节省了多少时间。每次跳过片段时都会向排行榜发送一条消息 - 未启用跳过次数跟踪 - 最短片段时长 - 小于此值(以秒为单位)的片段将不会显示或跳过 - 无效的时间长度 - 您的私人用户 ID - 这应该被保密。这就像一个密码,不应该与他人分享。如果有人拥有它,他们就可以冒充您 - 私人用户 ID 必须至少 30 个字符长 - 更改 API URL - SponsorBlock 用于向服务器发出调用的地址 - 已重置 API URL - API URL 无效 - 已更改 API URL - 导入/导出设置 - 复制 - 您的 SponsorBlock JSON 配置,可以导入/导出到 ReVanced 和其他 SponsorBlock 平台 - 您的 SponsorBlock JSON 配置,可以导入/导出到 ReVanced 和其他 SponsorBlock 平台。这包括您的私人用户 ID。请务必谨慎共享 - 设置导入成功 - 导入失败:%s - 导出失败:%s - "你的设置包含一个私有的 SponsorBlock 用户ID。 + 恢复旧的进度条缩略图 + 进度条缩略图将显示在进度条上方 + 进度条缩略图将显示在全屏 + + + 启用 SponsorBlock + SponsorBlock 是一个众包平台,旨在帮助人们跳过 YouTube 视频中烦人的部分 + 外观 + 显示投票按钮 + 显示片段投票按钮 + 不显示片段投票按钮 + 使用方形控件 + 按钮和控件已使用方形样式 + 按钮和控件已使用圆角样式 + + 使用紧凑的跳过按钮 + 跳过按钮样式为最小宽度 + 跳过按钮样式为最佳外观 + 自动隐藏跳过按钮 + 跳过按钮在几秒后隐藏 + 整个片段都会显示“跳过”按钮 + 跳过按钮时长 + 跳过和跳到精彩时刻按钮在自动隐藏之前的显示时长 + 显示撤销跳过浮层提示 + 当片段被自动跳过时会显示浮层提示。轻触浮层提示通知以撤销跳过 + 提示未显示 + 跳过提示时长 + 「撤销跳过」提示的显示时长 + 1 秒 + 2 秒 + 3 秒 + 4 秒 + 5秒 + 6 秒 + 7 秒 + 8 秒 + 9 秒 + 10 秒 + 显示没有片段的视频长度 + 进度条上显示视频总时长(已减去所有分段) + 显示完整视频长度 + 创建新的片段 + 显示“创建新片段”按钮 + 显示创建新的片段按钮 + 不显示创建新的片段按钮 + 调整新片段步长 + 创建新的片段时时间调整按钮移动的毫秒数 + 值必须是正数 + 查看准则 + 指南包含创建新片段的规则和提示 + 遵循指南 + 在创建新片段之前阅读 SponsorBlock 指南 + 已读 + 展示 + 常规 + 如果 API 不可用,显示一个\"提示\" + 如果 SponsorBlock 不可用,显示一个\"提示\" + 如果 SponsorBlock 不可用,不显示\"提示\" + 启用跳过次数跟踪 + 让 SponsorBlock 排行榜了解节省了多少时间。每次跳过片段时都会向排行榜发送一条消息 + 未启用跳过次数跟踪 + 最短片段时长 + 小于此值(以秒为单位)的片段将不会显示或跳过 + 无效的时间长度 + 您的私人用户 ID + 这应该被保密。这就像一个密码,不应该与他人分享。如果有人拥有它,他们就可以冒充您 + 私人用户 ID 必须至少 30 个字符长 + 更改 API URL + SponsorBlock 用于向服务器发出调用的地址 + 已重置 API URL + API URL 无效 + 已更改 API URL + 导入/导出设置 + 复制 + 您的 SponsorBlock JSON 配置,可以导入/导出到 ReVanced 和其他 SponsorBlock 平台 + 您的 SponsorBlock JSON 配置,可以导入/导出到 ReVanced 和其他 SponsorBlock 平台。这包括您的私人用户 ID。请务必谨慎共享 + 设置导入成功 + 导入失败:%s + 导出失败:%s + "你的设置包含一个私有的 SponsorBlock 用户ID。 你的用户ID就像密码一样,不应该被分享。 " - 不再显示 - 更改片段行为 - 赞助 - 付费推广、付费推荐和直接广告。不适用于自我推广或对他们喜欢的公益事业/创作者/网站/产品的免费宣传 - 非付费/自我推广 - 与赞助类似,但没有报酬或是自我推广。包括与商品、捐款或合作方信息相关的部分 - 互动提醒 (订阅) - 视频中间简短提醒观众来点赞、订阅或关注。 如果片段较长,或是关于某个具体事物,则应分类为自我推广 - 重点 - 大多数人都在寻找的视频部分 - 过场/开场动画 - 没有实际内容的间隔。可以是暂停、静态帧或重复动画。不包括包含信息的过渡 - 结束画面/贡献表 - 片尾字幕或 YouTube 结尾卡出现时。不适用于包含信息的结论 - 引子/问候 - 即将发布的视频的解说预告片、问候语和告别语。不包括添加额外内容的部分 - 预览 / 回顾 - 一系列剪辑,展示视频或系列中其他视频即将发生的事情或已发生的事情,所有信息在其他地方都有重复 - 离题 / 笑话 - 视频中非必需的切题场景或笑话,不包括提供上下文或背景细节的部分 - 音乐:非音乐部分 - 仅供音乐视频使用。音乐视频中没有音乐的部分,这些部分没有被其他类别涵盖 - 跳过 - 重点 - 跳过赞助 - 跳过推广 - 跳过互动 - 跳过重点 - 跳过开头 - 跳过中间部分 - 跳过中间部分 - 跳过结尾 - 跳过开头 - 跳过预览 - 跳过预览 - 跳过回顾 - 跳过切题内容 - 跳过非音乐部分 - 跳过片段 - 已跳过赞助商广告 - 已跳过自我推广 - 已跳过烦人提醒 - 已跳至重点 - 已跳过视频开头 - 已跳过中场 - 已跳过中场 - 已跳过视频结尾 - 已跳过开头 - 跳过预览 - 跳过预览 - 已跳过回顾 - 已跳过切题内容 - 跳过一个非音乐部分 - 跳过未提交的片段 - 已跳过多个片段 - 自动跳过 - 自动跳过一次 - 显示“跳过”按钮 - 在进度条中显示 - 禁用 - 无法提交片段: %s - SponsorBlock 暂时无法使用 - 无法提交片段 (状态: %1$d %2$s) - 无法提交片段。速率限制(来自同一用户或 IP 的太多) - 无法提交片段: %s - "无法提交片段。 + 不再显示 + 更改片段行为 + 赞助 + 付费推广、付费推荐和直接广告。不适用于自我推广或对他们喜欢的公益事业/创作者/网站/产品的免费宣传 + 非付费/自我推广 + 与赞助类似,但没有报酬或是自我推广。包括与商品、捐款或合作方信息相关的部分 + 互动提醒 (订阅) + 视频中间简短提醒观众来点赞、订阅或关注。 如果片段较长,或是关于某个具体事物,则应分类为自我推广 + 重点 + 大多数人都在寻找的视频部分 + 过场/开场动画 + 没有实际内容的间隔。可以是暂停、静态帧或重复动画。不包括包含信息的过渡 + 结束画面/贡献表 + 片尾字幕或 YouTube 结尾卡出现时。不适用于包含信息的结论 + 引子/问候 + 即将发布的视频的解说预告片、问候语和告别语。不包括添加额外内容的部分 + 预览 / 回顾 + 一系列剪辑,展示视频或系列中其他视频即将发生的事情或已发生的事情,所有信息在其他地方都有重复 + 离题 / 笑话 + 视频中非必需的切题场景或笑话,不包括提供上下文或背景细节的部分 + 音乐:非音乐部分 + 仅供音乐视频使用。音乐视频中没有音乐的部分,这些部分没有被其他类别涵盖 + 跳过 + 重点 + 跳过赞助 + 跳过推广 + 跳过互动 + 跳过重点 + 跳过开头 + 跳过中间部分 + 跳过中间部分 + 跳过结尾 + 跳过开头 + 跳过预览 + 跳过预览 + 跳过回顾 + 跳过切题内容 + 跳过非音乐部分 + 跳过片段 + 已跳过赞助商广告 + 已跳过自我推广 + 已跳过烦人提醒 + 已跳至重点 + 已跳过视频开头 + 已跳过中场 + 已跳过中场 + 已跳过视频结尾 + 已跳过开头 + 跳过预览 + 跳过预览 + 已跳过回顾 + 已跳过切题内容 + 跳过一个非音乐部分 + 跳过未提交的片段 + 已跳过多个片段 + 自动跳过 + 自动跳过一次 + 显示“跳过”按钮 + 在进度条中显示 + 禁用 + 无法提交片段: %s + SponsorBlock 暂时无法使用 + 无法提交片段 (状态: %1$d %2$s) + 无法提交片段。速率限制(来自同一用户或 IP 的太多) + 无法提交片段: %s + "无法提交片段。 已存在" - 成功提交新片段 - - SponsorBlock 暂时无法使用 (API 超时) - SponsorBlock 暂时无法使用 (状态 %d) - SponsorBlock 暂时无法使用 - 无法为片段投票 (API 超时) - 无法为片段投票 (状态: %1$d %2$s) - 无法为片段投票: %s - 赞成票 - 反对票 - 变更类别 - 没有要投票的片段 - - %1$s 到 %2$s - 选择片段的类别 - 类别已在设置中禁用。启用类别以提交。 - 新的 SpongorBlock 片段 - 将 %s 设置为新片段的开始或结束? - 开始 - 结束 - 现在 - 片段开始时间 - 片段结束时间 - 时间是否正确? - "视频片段 + 成功提交新片段 + + SponsorBlock 暂时无法使用 (API 超时) + SponsorBlock 暂时无法使用 (状态 %d) + SponsorBlock 暂时无法使用 + 无法为片段投票 (API 超时) + 无法为片段投票 (状态: %1$d %2$s) + 无法为片段投票: %s + 赞成票 + 反对票 + 变更类别 + 没有要投票的片段 + + %1$s 到 %2$s + 选择片段的类别 + 类别已在设置中禁用。启用类别以提交。 + 新的 SpongorBlock 片段 + 将 %s 设置为新片段的开始或结束? + 开始 + 结束 + 现在 + 片段开始时间 + 片段结束时间 + 时间是否正确? + "视频片段 由 @@ -1287,46 +1286,46 @@ Second \"item\" text" (%3$s) 准备好提交了吗?" - 起始位置须在结束位置前 - 首先在时间栏上标记两个位置 - 预览片段,并确保它可以顺利跳过 - 手动编辑线段时间 - 您想要编辑片段开始或结束的时间吗? - 给定的时间无效 - 统计 - - 统计信息暂时不可用(API 已关闭) - 正在加载… - SponsorBlock 已禁用 - 您的用户名: <b>%s</b> - 点击这里更改您的用户名 - 无法更改用户名:状态:%1$d %2$s - 用户名称修改成功 - 您的信誉为 <b>%.2f</b> - 您已创建 <b>%s</b> 个片段 - 点击这里查看您的片段 - SponsorBlock 排行榜 - 您已帮助人们跳过 <b>%s</b> 个片段 - 点击这里查看全球统计数据和顶级贡献者 - 这相当于他们人生的 <b>%s</b>。点击这里查看排行榜 - 您已跳过 <b>%s</b> 个片段 - 这相当于 <b>%s</b> - 重置跳过片段计数器? - %1$s 小时 %2$s 分钟 - %1$s 分钟 %2$s 秒 - %s 秒 - 不透明度: - 颜色: - 关于 - 数据由 SponsorBlock API 提供。点击这里了解更多信息并查看其他平台的下载内容 - - - 设备外形尺寸 - 默认 - 手机 - 平板电脑 - 汽车 - "更改包括: + 起始位置须在结束位置前 + 首先在时间栏上标记两个位置 + 预览片段,并确保它可以顺利跳过 + 手动编辑线段时间 + 您想要编辑片段开始或结束的时间吗? + 给定的时间无效 + 统计 + + 统计信息暂时不可用(API 已关闭) + 正在加载… + SponsorBlock 已禁用 + 您的用户名: <b>%s</b> + 点击这里更改您的用户名 + 无法更改用户名:状态:%1$d %2$s + 用户名称修改成功 + 您的信誉为 <b>%.2f</b> + 您已创建 <b>%s</b> 个片段 + 点击这里查看您的片段 + SponsorBlock 排行榜 + 您已帮助人们跳过 <b>%s</b> 个片段 + 点击这里查看全球统计数据和顶级贡献者 + 这相当于他们人生的 <b>%s</b>。点击这里查看排行榜 + 您已跳过 <b>%s</b> 个片段 + 这相当于 <b>%s</b> + 重置跳过片段计数器? + %1$s 小时 %2$s 分钟 + %1$s 分钟 %2$s 秒 + %s 秒 + 不透明度: + 颜色: + 关于 + 数据由 SponsorBlock API 提供。点击这里了解更多信息并查看其他平台的下载内容 + + + 设备外形尺寸 + 默认 + 手机 + 平板电脑 + 汽车 + "更改包括: 平板电脑布局 • 社区帖子已隐藏 @@ -1334,314 +1333,312 @@ Second \"item\" text" 汽车布局 • Shorts 在常规播放器中打开 • Feed 按主题和频道组织" - - - 伪装应用程序版本 - 客户端版本已伪装 - 客户端版本未伪装 - "应用版本将被欺骗为旧版本的 YouTube。 + + + 伪装应用程序版本 + 客户端版本已伪装 + 客户端版本未伪装 + "应用版本将被欺骗为旧版本的 YouTube。 这会改变应用程序的外观和功能,但可能会出现未知的副作用。 如果稍后关闭,建议清除应用程序数据以防止 UI 错误。" - 伪装应用程序版本为 - 20.13.41 - 恢复未折叠的视频操作栏 - 20.05.46 - 恢复字幕功能 - 19.35.36 - 恢复旧的 Shorts 播放器图标 - 19.01.34 - 还原旧的导航图标 - - - 更改起始页 - 默认 - 所有订阅频道 - 浏览频道 - 学习 - 探索 - 时尚和美容 - 游戏 - 历史记录 - - 已点赞的视频 - 直播 - 电影 - 音乐 - 新闻 - 通知 - 播放列表 - 搜索 - 购物 - 体育 - 订阅 - 趋势 - 虚拟实境 - 稍后观看 - 你的剪辑 - 始终更改起始页 - "起始页始终已更改 + 伪装应用程序版本为 + 20.13.41 - 恢复未折叠的视频操作栏 + 20.05.46 - 恢复字幕功能 + 19.35.36 - 恢复旧的 Shorts 播放器图标 + 19.01.34 - 还原旧的导航图标 + + + 更改起始页 + 默认 + 所有订阅频道 + 浏览频道 + 学习 + 探索 + 时尚和美容 + 游戏 + 历史记录 + + 已点赞的视频 + 直播 + 电影 + 音乐 + 新闻 + 通知 + 播放列表 + 搜索 + 购物 + 体育 + 订阅 + 趋势 + 虚拟实境 + 稍后观看 + 你的剪辑 + 始终更改起始页 + "起始页始终已更改 限制:工具栏上的后退按钮可能无法使用" - 起始页仅在应用启动时更改 - - - 禁用恢复 Shorts 播放器 - Shorts 播放器不会在应用启动时恢复 - Shorts 播放器将在应用启动时恢复 - - - 使用 Shorts 播放器打开 - Shorts 播放器 - 普通播放器 - 普通播放器全屏 - - - 自动播放 Shorts - Shorts 将自动播放 - Shorts 将重复播放 - 自动播放 Shorts 背景播放 - Shorts 背景播放将自动播放 - Shorts 背景播放将重复播放 - - - 小型播放器 - 更改应用内最小化播放器的样式 - 小型播放器类型 - 已禁用 - 默认 - 极简 - 平板电脑 - 现代 1 - 现代 2 - 现代 3 - 现代 4 - 禁用圆角 - 已禁用圆角 - 已启用圆角 - 启用双击和捏合缩放 - "已启用双击操作和捏合以调整大小 + 起始页仅在应用启动时更改 + + + 禁用恢复 Shorts 播放器 + Shorts 播放器不会在应用启动时恢复 + Shorts 播放器将在应用启动时恢复 + + + 使用 Shorts 播放器打开 + Shorts 播放器 + 普通播放器 + 普通播放器全屏 + + + 自动播放 Shorts + Shorts 将自动播放 + Shorts 将重复播放 + 自动播放 Shorts 背景播放 + Shorts 背景播放将自动播放 + Shorts 背景播放将重复播放 + + + 小型播放器 + 更改应用内最小化播放器的样式 + 小型播放器类型 + 已禁用 + 默认 + 极简 + 平板电脑 + 现代 1 + 现代 2 + 现代 3 + 现代 4 + 禁用圆角 + 已禁用圆角 + 已启用圆角 + 启用双击和捏合缩放 + "已启用双击操作和捏合以调整大小 • 双击以增加迷你播放器大小 • 再次双击以恢复原始大小" - 已禁用双击操作和捏合缩放 - 禁用拖放 - 已禁用拖放 - "已启用拖放 + 已禁用双击操作和捏合缩放 + 禁用拖放 + 已禁用拖放 + "已启用拖放 迷你播放器可以拖动到屏幕的任何角落" - 禁用水平拖动手势 - 已禁用水平拖动 - "已启用水平拖动手势 + 禁用水平拖动手势 + 已禁用水平拖动 + "已启用水平拖动手势 迷你播放器可以拖动到屏幕的左侧或右侧" - 隐藏悬浮窗按钮 - 悬浮窗按钮已隐藏 - 悬浮窗按钮已显示 - 隐藏副标题 - 副标题已隐藏 - 副标题已显示 - 隐藏快进和快退按钮 - 快进和快退已隐藏 - 快进和快退已显示 - 初始大小 - 屏幕上初始大小,以像素为单位 - 像素大小必须介于 %1$s 和 %2$s 之间 - 覆盖层不透明度 - 0-100 之间的透明度值,其中 0 为透明 - 小型播放器叠加层的透明度必须介于 0-100 之间 - - - 启用渐变加载屏幕 - 加载屏幕将具有渐变背景 - 加载屏幕将具有纯色背景 - 启动画面样式 - 颜色 - 黑白 - 启用自定义进度条颜色 - 自定义进度条颜色显示 - 显示原始进度条颜色 - 自定义进度条颜色 - 进度条的颜色 - 自定义进度条强调色 - 进度条的强调色 - 无效的进度条颜色值 - - - - - 标题徽标 - 默认 - 常规 - - ReVanced 极简 - 自定义 - - - 绕过图像区域限制 - 使用图像主机 yt4.ggpht.com - "使用原始图片主机地址 + 隐藏悬浮窗按钮 + 悬浮窗按钮已隐藏 + 悬浮窗按钮已显示 + 隐藏副标题 + 副标题已隐藏 + 副标题已显示 + 隐藏快进和快退按钮 + 快进和快退已隐藏 + 快进和快退已显示 + 初始大小 + 屏幕上初始大小,以像素为单位 + 像素大小必须介于 %1$s 和 %2$s 之间 + 覆盖层不透明度 + 0-100 之间的透明度值,其中 0 为透明 + 小型播放器叠加层的透明度必须介于 0-100 之间 + + + 启用渐变加载屏幕 + 加载屏幕将具有渐变背景 + 加载屏幕将具有纯色背景 + 启动画面样式 + 颜色 + 黑白 + 启用自定义进度条颜色 + 自定义进度条颜色显示 + 显示原始进度条颜色 + 自定义进度条颜色 + 进度条的颜色 + 自定义进度条强调色 + 进度条的强调色 + 无效的进度条颜色值 + + + + 标题徽标 + 默认 + 常规 + + ReVanced 极简 + 自定义 + + + 绕过图像区域限制 + 使用图像主机 yt4.ggpht.com + "使用原始图片主机地址 启用此选项可以修复在某些地区因被屏蔽而缺失的图片" - - - - 首页标签 - - 订阅标签页 - - 「我」标签 - 播放器播放列表&推荐 - 搜索结果 - 原始缩略图 - DeArrow & 原始封面 - DeArrow & 视频截图 - 静止截图 - "DeArrow 为 YouTube 视频提供众包缩略图。这些缩略图通常比 YouTube 提供的更相关 + + + + 首页标签 + + 订阅标签页 + + 「我」标签 + 播放器播放列表&推荐 + 搜索结果 + 原始缩略图 + DeArrow & 原始封面 + DeArrow & 视频截图 + 静止截图 + "DeArrow 为 YouTube 视频提供众包缩略图。这些缩略图通常比 YouTube 提供的更相关 如果启用,视频 URL 将发送到 API 服务器,并且不会发送其他数据。如果视频没有 DeArrow 缩略图,则会显示原始或静态截图 点击此处详细了解 DeArrow" - 如果 API 不可用,则显示提示 - 如果 DeArrow 不可用,则显示提示 - 如果 DeArrow 不可用,则不显示提示 - DeArrow API 端点 - DeArrow 缩略图缓存端点的 URL - 静止视频截图 - 静止截图从每个视频的开头/中间/结尾截取。这些图像内置于 YouTube,不使用任何外部 API - 使用快速静止截图 - 使用中等质量的静止截图。缩略图加载速度更快,但直播、未发布或非常旧的视频可能会显示空白缩略图 - 使用高质量的静止截图 - 截取静止截图的视频时间 - 视频开头 - 视频中间 - 视频结尾 - - DeArrow 暂时不可用(状态码:%s) - DeArrow 暂时不可用 - - - 显示 ReVanced 公告 - 启动时显示公告 - 启动时不显示公告 - 启动时显示公告 - 无法连接到公告提供者 - 忽略 - - - 启用循环播放视频 - 视频将循环播放 - 视频将不循环播放 - - - 显示循环播放视频按钮 - 按钮已显示 - 按钮未显示 - 循环播放视频已开启 - 循环播放视频已关闭 - - - - - 伪装设备尺寸 - "已伪装设备尺寸 + 如果 API 不可用,则显示提示 + 如果 DeArrow 不可用,则显示提示 + 如果 DeArrow 不可用,则不显示提示 + DeArrow API 端点 + DeArrow 缩略图缓存端点的 URL + 静止视频截图 + 静止截图从每个视频的开头/中间/结尾截取。这些图像内置于 YouTube,不使用任何外部 API + 使用快速静止截图 + 使用中等质量的静止截图。缩略图加载速度更快,但直播、未发布或非常旧的视频可能会显示空白缩略图 + 使用高质量的静止截图 + 截取静止截图的视频时间 + 视频开头 + 视频中间 + 视频结尾 + + DeArrow 暂时不可用(状态码:%s) + DeArrow 暂时不可用 + + + 显示 ReVanced 公告 + 启动时显示公告 + 启动时不显示公告 + 启动时显示公告 + 无法连接到公告提供者 + 忽略 + + + 启用循环播放视频 + 视频将循环播放 + 视频将不循环播放 + + + 显示循环播放视频按钮 + 按钮已显示 + 按钮未显示 + 循环播放视频已开启 + 循环播放视频已关闭 + + + + 伪装设备尺寸 + "已伪装设备尺寸 可能会解锁更高质量的视频,但你可能会遇到视频播放卡顿、电池续航时间减少以及其他未知的副作用" - "未伪装设备尺寸 + "未伪装设备尺寸 启用此功能可以解锁更高的视频质量" - 启用此选项可能会导致视频播放卡顿、电池续航时间减少以及其他未知的副作用 - - - 触感反馈 - 更改触感反馈 - 禁用章节触感反馈 - 已禁用章节触感反馈 - 已启用章节触感反馈 - 禁用精确搜索触感反馈 - 精确查找触觉反馈已禁用 - 已启用精确搜索触感反馈 - 禁用撤销查找触觉反馈 - 撤销查找触觉反馈已禁用 - 撤销查找触觉反馈已启用 - 禁用缩放触觉反馈 - 缩放触觉反馈已禁用 - 缩放触觉反馈已启用 - - - 如果您最近更改了帐户登录详细信息,请卸载并重新安装 MicroG。 - - - 绕过 URL 重定向 - URL 重定向将被跳过 - URL 重定向将不被跳过 - - - 在浏览器中打开链接 - 在外部浏览器中打开链接 - 在应用内浏览器中打开链接 - - - - 自动 - 记住视频质量更改 - 质量更改适用于所有视频 - 质量更改仅适用于当前视频 - 视频画质改变时显示提示 - 当默认视频画质改变时会显示一个提示 - 当默认视频画质改变时不会显示提示 - Wi-Fi 网络上的默认视频质量 - 移动网络上的默认视频质量 - 记住 Shorts 画质更改 - 质量更改适用于所有 Shorts - 质量更改仅适用于当前的 Short - Wi-Fi 网络上的默认 Shorts 画质 - 移动网络上的默认 Shorts 画质 - 移动网络 - 无线网络 - 已将默认 %1$s 质量更改为:%2$s - 已将 Shorts %1$s 的画质更改为:%2$s - - - 显示播放速度对话框按钮 - “速度对话框”按钮已显示。长按可将播放速度重置为默认值 - “速度对话框”按钮未显示 - - - 显示视频质量按钮 - “视频质量”按钮已显示。长按可将质量重置为默认值 - “视频质量”按钮未显示 - - - 自定义播放速度菜单 - 显示自定义速度菜单 - 不显示自定义速度菜单 - 恢复旧版播放速度菜单 - 显示旧版速度菜单 - 显示新版速度菜单 - 自定义播放速度 - 添加或更改自定义播放速度 - 自定义速度必须小于 %s - 自定义播放速度无效 - 自动 - 自定义长按速度 - 0-8之间的播放速度 - - - 记住播放速度更改 - 播放速度更改适用于所有视频 - 播放速度更改仅适用于当前视频 - 播放速度改变时显示提示 - 当默认播放速度改变时会显示一个提示 - 当默认播放速度更改时,不显示提示。 - 默认播放速度 - 已更改默认速度为:%s - - - 禁用 HDR 视频 - HDR 视频已禁用 - HDR 视频已启用 - 强制使用 AVC (H.264) - 视频编解码器被强制为 AVC (H.264) - 视频编解码器自动确定 - "优点: + 启用此选项可能会导致视频播放卡顿、电池续航时间减少以及其他未知的副作用 + + + 触感反馈 + 更改触感反馈 + 禁用章节触感反馈 + 已禁用章节触感反馈 + 已启用章节触感反馈 + 禁用精确搜索触感反馈 + 精确查找触觉反馈已禁用 + 已启用精确搜索触感反馈 + 禁用撤销查找触觉反馈 + 撤销查找触觉反馈已禁用 + 撤销查找触觉反馈已启用 + 禁用缩放触觉反馈 + 缩放触觉反馈已禁用 + 缩放触觉反馈已启用 + + + 如果您最近更改了帐户登录详细信息,请卸载并重新安装 MicroG。 + + + 绕过 URL 重定向 + URL 重定向将被跳过 + URL 重定向将不被跳过 + + + 在浏览器中打开链接 + 在外部浏览器中打开链接 + 在应用内浏览器中打开链接 + + + + 自动 + 记住视频质量更改 + 质量更改适用于所有视频 + 质量更改仅适用于当前视频 + 视频画质改变时显示提示 + 当默认视频画质改变时会显示一个提示 + 当默认视频画质改变时不会显示提示 + Wi-Fi 网络上的默认视频质量 + 移动网络上的默认视频质量 + 记住 Shorts 画质更改 + 质量更改适用于所有 Shorts + 质量更改仅适用于当前的 Short + Wi-Fi 网络上的默认 Shorts 画质 + 移动网络上的默认 Shorts 画质 + 移动网络 + 无线网络 + 已将默认 %1$s 质量更改为:%2$s + 已将 Shorts %1$s 的画质更改为:%2$s + + + 显示播放速度对话框按钮 + “速度对话框”按钮已显示。长按可将播放速度重置为默认值 + “速度对话框”按钮未显示 + + + 显示视频质量按钮 + “视频质量”按钮已显示。长按可将质量重置为默认值 + “视频质量”按钮未显示 + + + 自定义播放速度菜单 + 显示自定义速度菜单 + 不显示自定义速度菜单 + 恢复旧版播放速度菜单 + 显示旧版速度菜单 + 显示新版速度菜单 + 自定义播放速度 + 添加或更改自定义播放速度 + 自定义速度必须小于 %s + 自定义播放速度无效 + 自动 + 自定义长按速度 + 0-8之间的播放速度 + + + 记住播放速度更改 + 播放速度更改适用于所有视频 + 播放速度更改仅适用于当前视频 + 播放速度改变时显示提示 + 当默认播放速度改变时会显示一个提示 + 当默认播放速度更改时,不显示提示。 + 默认播放速度 + 已更改默认速度为:%s + + + 禁用 HDR 视频 + HDR 视频已禁用 + HDR 视频已启用 + 强制使用 AVC (H.264) + 视频编解码器被强制为 AVC (H.264) + 视频编解码器自动确定 + "优点: • 可延长电池续航时间 • 可恢复旧设备上缺失的视频分辨率 @@ -1650,179 +1647,178 @@ Second \"item\" text" • 视频播放将比 VP9 或 AV1 消耗更多互联网数据 • HDR 视频将不使用 AVC • 某些设备无法强制使用 AVC" - - - 显示高级视频质量菜单 - 显示高级视频质量菜单 - 不显示高级视频质量菜单 - - - 启用滑动拖动进度条 - 滑动拖动进度条已启用 - 滑动拖动进度条未启用 - - - 允许 Android VR AV1 - "视频编解码器为 AVC (H.264)、VP9 或 AV1 + + + 显示高级视频质量菜单 + 显示高级视频质量菜单 + 不显示高级视频质量菜单 + + + 启用滑动拖动进度条 + 滑动拖动进度条已启用 + 滑动拖动进度条未启用 + + + 允许 Android VR AV1 + "视频编解码器为 AVC (H.264)、VP9 或 AV1 播放可能会卡顿或掉帧" - 视频编解码器为 AVC (H.264) 或 VP9 - "启用此设置可能会使用软件 AV1 解码。 + 视频编解码器为 AVC (H.264) 或 VP9 + "启用此设置可能会使用软件 AV1 解码。 使用 AV1 播放视频可能会卡顿或丢帧。" - 欺骗的副作用 - • 实验性客户端,可能随时停止工作 - • 视频可能会在 1:00 停止,或者在某些地区可能无法播放 - • 音轨菜单缺失 - • 不支持 AV1 视频编解码器 - • 稳定音量不可用 - • 注销或使用无痕模式时,儿童视频可能无法播放 - - • 强制原始音频不可用 - 显示在 Stats for nerds 中 - 客户端类型显示在 Stats for nerds 中 - 客户端隐藏在 Stats for nerds 中 - - - - - - - 关于 - 广告 - 通用 - 播放器 - 杂项 - - - 隐藏视频广告 - 视频广告已隐藏 - 视频广告已显示 - - - 启用永久重复播放 - 已启用永久重复播放 - 已禁用永久重复播放 - - - 隐藏投射按钮 - 投射按钮已隐藏 - 投射按钮已显示 - 隐藏历史记录按钮 - 历史记录按钮已隐藏 - 历史记录按钮已显示 - 隐藏通知按钮 - 通知按钮已隐藏 - 通知按钮已显示 - 隐藏搜索按钮 - 搜索按钮已隐藏 - 搜索按钮已显示 - - - 隐藏类别栏 - 类别栏已隐藏 - 类别栏已显示 - - - 更改迷你播放器颜色 - 迷你播放器颜色与全屏播放器一致 - 迷你播放器使用默认颜色 - - - 导航栏 - 隐藏或更改导航栏按钮 - - 隐藏主页 - 主页按钮已隐藏 - 主页按钮已显示 - - 隐藏短片 - 精选按钮已隐藏 - 精选按钮已显示 - - 隐藏探索 - 探索按钮已隐藏 - 探索按钮已显示 - - 隐藏媒体库 - 媒体库按钮已隐藏 - 媒体库按钮已显示 - - 隐藏升级 - 升级按钮已隐藏 - 升级按钮已显示 - 隐藏导航栏 - 导航栏已隐藏 - 导航栏已显示 - 隐藏导航按钮标签 - 标签已隐藏 - 标签已显示 - - - 隐藏“获取音乐高级版”标签 - 标签已隐藏 - 标签已显示 - - - 隐藏升级按钮 - 按钮已隐藏 - 按钮已显示 - - - - - 屏蔽音频广告 - 音频广告已屏蔽 - 音频广告未屏蔽 - - - %s 不可用,可能会显示广告。尝试在设置中更改广告拦截服务。 - %s 返回错误,可能会显示广告。尝试在设置中更改广告拦截服务。 - 屏蔽嵌入式视频广告 - 已禁用 - Luminous 代理 - PurpleAdBlock 代理 - - - 屏蔽视频广告 - 视频广告已屏蔽 - 视频广告未屏蔽 - - - 消息已删除 - 显示已删除的消息 - 不显示已删除的消息 - 在剧透后面隐藏已删除的消息 - 将已删除的消息显示为删除线文字 - - - 自动领取频道积分 - 频道积分已自动领取 - 频道积分未自动领取 - - - - 启用Twitch调试模式 - Twitch 调试模式已启用(不建议) - Twitch调试模式已禁用 - - - ReVanced设置 - 关于 - 关于ReVanced - 广告拦截 - 广告拦截设置 - 聊天 - 聊天设置 - 其他 - 其他设置 - 常规设置 - 其他设置 - 客户端广告 - 服务器端surestream广告 - 调试日志 - 调试日志已启用 - 调试日志已禁用 - - + 欺骗的副作用 + • 实验性客户端,可能随时停止工作 + • 视频可能会在 1:00 停止,或者在某些地区可能无法播放 + • 音轨菜单缺失 + • 不支持 AV1 视频编解码器 + • 稳定音量不可用 + • 注销或使用无痕模式时,儿童视频可能无法播放 + + • 强制原始音频不可用 + 显示在 Stats for nerds 中 + 客户端类型显示在 Stats for nerds 中 + 客户端隐藏在 Stats for nerds 中 + + + + + + 关于 + 广告 + 通用 + 播放器 + 杂项 + + + 隐藏视频广告 + 视频广告已隐藏 + 视频广告已显示 + + + 启用永久重复播放 + 已启用永久重复播放 + 已禁用永久重复播放 + + + 隐藏投射按钮 + 投射按钮已隐藏 + 投射按钮已显示 + 隐藏历史记录按钮 + 历史记录按钮已隐藏 + 历史记录按钮已显示 + 隐藏通知按钮 + 通知按钮已隐藏 + 通知按钮已显示 + 隐藏搜索按钮 + 搜索按钮已隐藏 + 搜索按钮已显示 + + + 隐藏类别栏 + 类别栏已隐藏 + 类别栏已显示 + + + 更改迷你播放器颜色 + 迷你播放器颜色与全屏播放器一致 + 迷你播放器使用默认颜色 + + + 导航栏 + 隐藏或更改导航栏按钮 + + 隐藏主页 + 主页按钮已隐藏 + 主页按钮已显示 + + 隐藏短片 + 精选按钮已隐藏 + 精选按钮已显示 + + 隐藏探索 + 探索按钮已隐藏 + 探索按钮已显示 + + 隐藏媒体库 + 媒体库按钮已隐藏 + 媒体库按钮已显示 + + 隐藏升级 + 升级按钮已隐藏 + 升级按钮已显示 + 隐藏导航栏 + 导航栏已隐藏 + 导航栏已显示 + 隐藏导航按钮标签 + 标签已隐藏 + 标签已显示 + + + 隐藏“获取音乐高级版”标签 + 标签已隐藏 + 标签已显示 + + + 隐藏升级按钮 + 按钮已隐藏 + 按钮已显示 + + + + + 屏蔽音频广告 + 音频广告已屏蔽 + 音频广告未屏蔽 + + + %s 不可用,可能会显示广告。尝试在设置中更改广告拦截服务。 + %s 返回错误,可能会显示广告。尝试在设置中更改广告拦截服务。 + 屏蔽嵌入式视频广告 + 已禁用 + Luminous 代理 + PurpleAdBlock 代理 + + + 屏蔽视频广告 + 视频广告已屏蔽 + 视频广告未屏蔽 + + + 消息已删除 + 显示已删除的消息 + 不显示已删除的消息 + 在剧透后面隐藏已删除的消息 + 将已删除的消息显示为删除线文字 + + + 自动领取频道积分 + 频道积分已自动领取 + 频道积分未自动领取 + + + + 启用Twitch调试模式 + Twitch 调试模式已启用(不建议) + Twitch调试模式已禁用 + + + ReVanced设置 + 关于 + 关于ReVanced + 广告拦截 + 广告拦截设置 + 聊天 + 聊天设置 + 其他 + 其他设置 + 常规设置 + 其他设置 + 客户端广告 + 服务器端surestream广告 + 调试日志 + 调试日志已启用 + 调试日志已禁用 + + diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index 7888603e92..1f7c9b0d48 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -17,1273 +17,1272 @@ "First 'item' text Second \"item\" text" ---> - - - - 應用程式名稱 - - 自訂 - 應用程式圖示 - 原始 - ReVanced - - ReVanced 精簡版 - ReVanced 縮放 - - 自訂 - - - 檢查失敗 - 開啟官方網站 - 忽略 - <h5>此應用程式似乎不是由您修補的。</h5><br>此應用程式可能無法正常運作,<b>使用上可能有害甚至危險</b>。<br><br>這些檢查表示此應用程式是預先修補的或從其他人那裡取得的:<br><br><small>%1$s</small><br>強烈建議您<b>解除安裝此應用程式並自行修補</b>,以確保您使用的是經過驗證且安全的應用程式。<p><br>如果忽略,此警告將只顯示兩次。 - 在其他裝置上修補 - 不是由 ReVanced Manager 安裝 - 修補時間超過 10 分鐘 - 修補於 %s 天前 - APK 建構日期已損毀 - - - ReVanced 通知 - 你的觀看記錄未被儲存。<br><br>這很可能是由於 DNS 廣告封鎖器或網路代理所導致。<br><br>若要解決此問題,請將 <b>s.youtube.com</b> 加入白名單,或關閉所有 DNS 封鎖器和代理。 - 不再顯示 - - - 設定 - ReVanced - 你確定要繼續嗎? - 儲存 - 重設 - 重設顏色 - 無效的顏色 - 需要重新啟動 - 重新啟動應用程式以使此變更生效。 - 重新啟動 - 匯入 - 複製 - 將 ReVanced 設定重設為預設值 - 已匯入 %d 個設定 - 無法匯入:%s - 搜尋設定 - 沒有找到「%s」的結果 - 嘗試其他關鍵字 - 最近搜尋 - 要從搜尋記錄中移除嗎? - 清除搜尋記錄 - 您確定要清除所有搜尋記錄嗎? - 搜尋秘訣 - "• 輕觸路徑即可前往 +--> + + + 應用程式名稱 + + 自訂 + 應用程式圖示 + 原始 + ReVanced + + ReVanced 精簡版 + ReVanced 縮放 + + 自訂 + + + 檢查失敗 + 開啟官方網站 + 忽略 + <h5>此應用程式似乎不是由您修補的。</h5><br>此應用程式可能無法正常運作,<b>使用上可能有害甚至危險</b>。<br><br>這些檢查表示此應用程式是預先修補的或從其他人那裡取得的:<br><br><small>%1$s</small><br>強烈建議您<b>解除安裝此應用程式並自行修補</b>,以確保您使用的是經過驗證且安全的應用程式。<p><br>如果忽略,此警告將只顯示兩次。 + 在其他裝置上修補 + 不是由 ReVanced Manager 安裝 + 修補時間超過 10 分鐘 + 修補於 %s 天前 + APK 建構日期已損毀 + + + ReVanced 通知 + 你的觀看記錄未被儲存。<br><br>這很可能是由於 DNS 廣告封鎖器或網路代理所導致。<br><br>若要解決此問題,請將 <b>s.youtube.com</b> 加入白名單,或關閉所有 DNS 封鎖器和代理。 + 不再顯示 + + + 設定 + ReVanced + 你確定要繼續嗎? + 儲存 + 重設 + 重設顏色 + 無效的顏色 + 需要重新啟動 + 重新啟動應用程式以使此變更生效。 + 重新啟動 + 匯入 + 複製 + 將 ReVanced 設定重設為預設值 + 已匯入 %d 個設定 + 無法匯入:%s + 搜尋設定 + 沒有找到「%s」的結果 + 嘗試其他關鍵字 + 最近搜尋 + 要從搜尋記錄中移除嗎? + 清除搜尋記錄 + 您確定要清除所有搜尋記錄嗎? + 搜尋秘訣 + "• 輕觸路徑即可前往 • 長按設定即可前往 • 按下 Enter 鍵即可將搜尋查詢儲存至記錄 • 搜尋會忽略大小寫和標點符號 • 父設定會顯示在停用的子設定上方" - 搜尋記錄是空的 - 若要儲存搜尋記錄,請輸入搜尋查詢並按下 Enter 鍵 - 顯示設定搜尋記錄 - 顯示設定搜尋記錄 - 不顯示設定搜尋記錄 - 顯示 ReVanced 設定圖示 - 已顯示設定圖示 - 未顯示設定圖示 - ReVanced 語言 - "部分語言的翻譯可能缺少或不完整。 + 搜尋記錄是空的 + 若要儲存搜尋記錄,請輸入搜尋查詢並按下 Enter 鍵 + 顯示設定搜尋記錄 + 顯示設定搜尋記錄 + 不顯示設定搜尋記錄 + 顯示 ReVanced 設定圖示 + 已顯示設定圖示 + 未顯示設定圖示 + ReVanced 語言 + "部分語言的翻譯可能缺少或不完整。 如要翻譯新的語言或改善現有翻譯,請前往 translate.revanced.app" - 應用程式語言 - 匯入/匯出 - 匯入/匯出 ReVanced 設定 - - 您正在使用 ReVanced 修補版本 <i>%s</i> - 注意 - 這個版本為預先發布版,你可能會遇到非預期的問題 - 官方連結 - + 您正在使用 ReVanced 修補版本 <i>%s</i> + 注意 + 這個版本為預先發布版,你可能會遇到非預期的問題 + 官方連結 + - - - GmsCore 設定 - GmsCore 設定 - - 未安裝 MicroG GmsCore。請前往安裝。 - 需要採取行動 - "MicroG GmsCore 沒有權限在背景執行。 + + + GmsCore 設定 + GmsCore 設定 + + 未安裝 MicroG GmsCore。請前往安裝。 + 需要採取行動 + "MicroG GmsCore 沒有權限在背景執行。 請按照你手機的「不要關閉我的應用程式」指南,並將說明套用於你的 MicroG 安裝。 這項設定是應用程式運作的必要條件。" - 開啟網站 - "為了避免問題,必須停用 MicroG GmsCore 的電池最佳化。 + 開啟網站 + "為了避免問題,必須停用 MicroG GmsCore 的電池最佳化。 停用 MicroG 的電池最佳化不會對電池用量造成負面影響。 輕觸「繼續」按鈕並允許最佳化變更。" - 繼續 - - - 偽裝影片串流 - 偽裝用戶端影片串流以避免播放問題 - 偽造影片串流 - 偽造用戶端影片串流以避免播放問題 - 偽裝影片串流 - "視訊串流已遭欺騙 + 繼續 + + + 偽裝影片串流 + 偽裝用戶端影片串流以避免播放問題 + 偽造影片串流 + 偽造用戶端影片串流以避免播放問題 + 偽裝影片串流 + "視訊串流已遭欺騙 如果您是 YouTube Premium 使用者,則可能不需要此設定" - "影片串流未經偽裝 + "影片串流未經偽裝 播放可能無法運作" - 關閉此設定可能會導致播放問題。 - 預設用戶端 - - - 強制使用原始音訊語言 - 正在使用原始音訊語言 - 使用預設音訊 - - 若要使用此功能,請將「偽裝影片串流」變更為 Android Studio 以外的任何用戶端 - - - 偵錯 - 啟用或停用偵錯選項 - 偵錯記錄 - 已啟用偵錯記錄檔 - 已停用偵錯記錄檔 - 記錄檔堆疊追蹤 - 除錯記錄檔會包含堆疊追蹤 - 除錯記錄檔不會包含堆疊追蹤 - 在 ReVanced 發生錯誤時顯示提示訊息 - 如果發生錯誤,則顯示提示訊息 - 如果發生錯誤,則不會顯示提示訊息 - "關閉錯誤提示訊息會隱藏所有 ReVanced 的錯誤通知。 + 關閉此設定可能會導致播放問題。 + 預設用戶端 + + + 強制使用原始音訊語言 + 正在使用原始音訊語言 + 使用預設音訊 + + 若要使用此功能,請將「偽裝影片串流」變更為 Android Studio 以外的任何用戶端 + + + 偵錯 + 啟用或停用偵錯選項 + 偵錯記錄 + 已啟用偵錯記錄檔 + 已停用偵錯記錄檔 + 記錄檔堆疊追蹤 + 除錯記錄檔會包含堆疊追蹤 + 除錯記錄檔不會包含堆疊追蹤 + 在 ReVanced 發生錯誤時顯示提示訊息 + 如果發生錯誤,則顯示提示訊息 + 如果發生錯誤,則不會顯示提示訊息 + "關閉錯誤提示訊息會隱藏所有 ReVanced 的錯誤通知。 你將不會收到任何非預期的事件通知。" - 匯出偵錯記錄 - 將 ReVanced 偵錯記錄複製到剪貼簿 - 偵錯記錄已停用 - 找不到記錄 - 記錄已複製 - 匯出記錄失敗:%s - 清除偵錯記錄 - 清除所有儲存的 ReVanced 偵錯記錄 - 記錄已清除 - 功能旗標 Manager - 管理布林功能旗標 - 啟用的旗標 (%d) - 已封鎖的旗標 (%d) - 搜尋旗標... - 旗標已儲存 - 旗標已重設 - 旗標已複製到剪貼簿 - 記錄檔協定緩衝區 - 除錯記錄檔會包含協定緩衝資訊 - 除錯記錄檔不會包含協定緩衝資訊 - "啟用此設定將會記錄額外的佈局資料,包括部分使用者介面元件的畫面文字。 + 匯出偵錯記錄 + 將 ReVanced 偵錯記錄複製到剪貼簿 + 偵錯記錄已停用 + 找不到記錄 + 記錄已複製 + 匯出記錄失敗:%s + 清除偵錯記錄 + 清除所有儲存的 ReVanced 偵錯記錄 + 記錄已清除 + 功能旗標 Manager + 管理布林功能旗標 + 啟用的旗標 (%d) + 已封鎖的旗標 (%d) + 搜尋旗標... + 旗標已儲存 + 旗標已重設 + 旗標已複製到剪貼簿 + 記錄檔協定緩衝區 + 除錯記錄檔會包含協定緩衝資訊 + 除錯記錄檔不會包含協定緩衝資訊 + "啟用此設定將會記錄額外的佈局資料,包括部分使用者介面元件的畫面文字。 這有助於在建立自訂過濾器時識別元件。 不過,啟用此功能也會記錄部分使用者資料,例如您的 IP 位址。" - - - 清理分享連結 - 追蹤查詢參數已從分享連結中移除 - 追蹤查詢參數未從分享連結中移除 - 將分享連結更改為 youtube.com - 分享連結使用 youtube.com - 分享連結使用 music.youtube.com - - - 自訂篩選器 - 使用自訂篩選器隱藏元件 - 啟用自訂篩選器 - 已啟用自訂篩選器 - 已停用自訂篩選器 - 自訂篩選器 - - 列出篩選的欄位路徑建構器字串,使用換行符號進行分隔 - 無效的自訂篩選器:%s - - - - - 關於 - 廣告 - 替代縮圖 - 推薦內容 - 一般 - 播放器 - Shorts - 跳轉列 - 滑動控制 - Return YouTube Dislike - 其他 - 影片 - 還原舊版設定選單 - 已顯示舊版設定選單 - 不顯示舊版設定選單 - - - 停用背景播放 Shorts - 已停用背景播放 Shorts - 已啟用背景播放 Shorts - - - 隱藏專輯資訊卡 - 已隱藏專輯資訊卡 - 已顯示專輯資訊卡 - 隱藏藝人資訊卡 - 已隱藏藝人資訊卡 - 已顯示藝人資訊卡 - 隱藏標籤列 - 已隱藏標籤列 - 已顯示標籤列 - 隱藏社群貼文 - 已隱藏社群貼文 - 已顯示社群貼文 - 隱藏精簡橫幅 - 已隱藏精簡橫幅 - 已顯示精簡橫幅 - 隱藏可展開卡片 - 已隱藏影片下方可展開的卡片 - 已顯示影片下方可展開的卡片 - 隱藏「懸浮麥克風」按鈕 - 搜尋中的浮動麥克風按鈕已隱藏 - 搜尋中的浮動麥克風按鈕已顯示 - 隱藏橫向區塊 - "橫向區塊已隱藏,例如: + + + 清理分享連結 + 追蹤查詢參數已從分享連結中移除 + 追蹤查詢參數未從分享連結中移除 + 將分享連結更改為 youtube.com + 分享連結使用 youtube.com + 分享連結使用 music.youtube.com + + + 自訂篩選器 + 使用自訂篩選器隱藏元件 + 啟用自訂篩選器 + 已啟用自訂篩選器 + 已停用自訂篩選器 + 自訂篩選器 + + 列出篩選的欄位路徑建構器字串,使用換行符號進行分隔 + 無效的自訂篩選器:%s + + + + + 關於 + 廣告 + 替代縮圖 + 推薦內容 + 一般 + 播放器 + Shorts + 跳轉列 + 滑動控制 + Return YouTube Dislike + 其他 + 影片 + 還原舊版設定選單 + 已顯示舊版設定選單 + 不顯示舊版設定選單 + + + 停用背景播放 Shorts + 已停用背景播放 Shorts + 已啟用背景播放 Shorts + + + 隱藏專輯資訊卡 + 已隱藏專輯資訊卡 + 已顯示專輯資訊卡 + 隱藏藝人資訊卡 + 已隱藏藝人資訊卡 + 已顯示藝人資訊卡 + 隱藏標籤列 + 已隱藏標籤列 + 已顯示標籤列 + 隱藏社群貼文 + 已隱藏社群貼文 + 已顯示社群貼文 + 隱藏精簡橫幅 + 已隱藏精簡橫幅 + 已顯示精簡橫幅 + 隱藏可展開卡片 + 已隱藏影片下方可展開的卡片 + 已顯示影片下方可展開的卡片 + 隱藏「懸浮麥克風」按鈕 + 搜尋中的浮動麥克風按鈕已隱藏 + 搜尋中的浮動麥克風按鈕已顯示 + 隱藏橫向區塊 + "橫向區塊已隱藏,例如: • 即時新聞 • 繼續觀看 • 探索更多頻道 • 最相關 • 購物 • 再看一次" - 橫向區塊已顯示 - 隱藏圖庫 - 已隱藏搜尋結果中的圖片列 - 已顯示搜尋結果中的圖片列 - 隱藏最新貼文 - 已隱藏最新貼文 - 已顯示最新貼文 - 隱藏合輯 - 已隱藏合輯 - 已顯示合輯 - 隱藏電影版面 - 已隱藏電影版面 - 已顯示電影版面 - - 隱藏「通知我」按鈕 - 「提醒我」按鈕已隱藏 - 「提醒我」按鈕已顯示 - 隱藏遊戲角落 - 已隱藏遊戲角落 - 已顯示遊戲角落 - - 隱藏「顯示更多」按鈕 - 搜尋結果中的「顯示更多」按鈕已隱藏 - 搜尋結果中的「顯示更多」按鈕已顯示 - 隱藏問卷調查 - 問卷調查已隱藏 - 問卷調查已顯示 - 隱藏票券架 - 票券架已隱藏 - 票券架已顯示 - - 隱藏影片推薦標籤 - 搜尋結果中的「其他人也觀看」與「您可能也喜歡」標籤已隱藏 - 搜尋結果中的「其他人也觀看」與「您可能也喜歡」標籤已顯示 - 隱藏視覺間隔 - 視覺間隔已隱藏 - 視覺間隔已顯示 - - 隱藏 YouTube Doodles - YouTube 標誌上的 Doodles 動畫已隱藏 - YouTube 標誌上的 Doodles 動畫已顯示 - "YouTube Doodles 每年會顯示幾天。 + 隱藏「顯示更多」按鈕 + 搜尋結果中的「顯示更多」按鈕已隱藏 + 搜尋結果中的「顯示更多」按鈕已顯示 + 隱藏問卷調查 + 問卷調查已隱藏 + 問卷調查已顯示 + 隱藏票券架 + 票券架已隱藏 + 票券架已顯示 + + 隱藏影片推薦標籤 + 搜尋結果中的「其他人也觀看」與「您可能也喜歡」標籤已隱藏 + 搜尋結果中的「其他人也觀看」與「您可能也喜歡」標籤已顯示 + 隱藏視覺間隔 + 視覺間隔已隱藏 + 視覺間隔已顯示 + + 隱藏 YouTube Doodles + YouTube 標誌上的 Doodles 動畫已隱藏 + YouTube 標誌上的 Doodles 動畫已顯示 + "YouTube Doodles 每年會顯示幾天。 如果塗鴉目前在你所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。" - 隱藏頻道欄 - 已隱藏頻道欄 - 已顯示頻道欄 - 隱藏頻道浮水印 - 已隱藏影片浮水印 - 已顯示影片浮水印 - 隱藏群眾募資方塊 - 已隱藏群眾募資方塊 - 已顯示群眾募資方塊 - 隱藏影片警告提醒 - 已隱藏影片警告提醒 - 已顯示影片警告提醒 - 隱藏資訊面板 - 已隱藏資訊面板 - 已顯示資訊面板 - - 隱藏「加入」按鈕 - 「加入」按鈕已隱藏 - 「加入」按鈕已顯示 - 隱藏醫療資訊面板 - 已隱藏醫療資訊面板 - 已顯示醫療資訊面板 - 隱藏快速操作 - 已於全螢幕中隱藏快速操作 - 已於全螢幕中顯示快速操作 - 隱藏相關影片 - 已隱藏快速操作中的相關影片 - 已顯示快速操作中的相關影片 - 隱藏訂閱者規範 - 已隱藏《訂閱者社群規範》 - 已顯示《訂閱者社群規範》 - 隱藏直播即時反應 - 已隱藏直播即時反應 - 已顯示直播即時反應 - 隱藏「AI 產生的影片摘要」 - AI 生成的影片摘要區塊已隱藏 - AI 生成的影片摘要區塊已顯示 - 隱藏詢問 - 「提問區」已隱藏 - 「提問區」已顯示 - 隱藏屬性 - 已隱藏精選地點、遊戲、音樂和提及的人區塊 - 已顯示精選地點、遊戲、音樂和提及的人區塊 - 隱藏章節 - 已隱藏章節區塊 - 已顯示章節區塊 - 隱藏「這項內容的製作方式」 - 已隱藏這項內容的製作方式區塊 - 已顯示這項內容的製作方式區塊 - 隱藏Hype點數 - Hype點數已隱藏 - Hype點數已顯示 - 隱藏「探索 Podcast」 - 已隱藏探索 Podcast 區塊 - 已顯示探索 Podcast 區塊 - 隱藏精選連結 - 精選連結區塊已隱藏 - 精選連結區塊已顯示 - 隱藏精選影片 - 精選影片區塊已隱藏 - 精選影片區塊已顯示 - 隱藏資訊卡 - 已隱藏資訊卡區塊 - 已顯示資訊卡區塊 - 隱藏「核心概念」 - 已隱藏核心概念區塊 - 已顯示核心概念區塊 - 隱藏「訂閱」按鈕 - 「訂閱」按鈕已隱藏 - 「訂閱」按鈕已顯示 - 隱藏轉錄稿 - 已隱藏轉錄稿區塊 - 已顯示轉錄稿區塊 - 影片說明 - 隱藏或顯示影片說明元件 - 篩選列 - 在推薦內容、相關影片、搜尋結果和觀看記錄中隱藏或顯示篩選欄 - 在動態中隱藏 - 已在動態中隱藏 - 已在動態中顯示 - 隱藏相關影片 - 已在相關影片中隱藏 - 已在相關影片中顯示 - 在搜尋結果中隱藏 - 已在搜尋結果中隱藏 - 已在搜尋結果中顯示 - 在觀看記錄中隱藏 - 已在觀看記錄中隱藏 - 已在觀看記錄中顯示 - 頻道頁面 - 隱藏或顯示頻道頁面元件 - - 隱藏社群按鈕 - 「社群」按鈕已隱藏 - 「社群」按鈕已顯示 - - 隱藏「為你推薦」區塊 - 已隱藏「為您推薦」區塊 - 已顯示「為您推薦」區塊 - - 隱藏「加入」按鈕 - 「加入」按鈕已隱藏 - 「加入」按鈕已顯示 - 隱藏連結預覽 - 已隱藏連結預覽 - 已顯示連結預覽 - 隱藏會員專屬區塊 - 會員專屬區塊已隱藏 - 會員專屬區塊已顯示 - - 隱藏「商店」按鈕 - 「商店」按鈕已隱藏 - 「商店」按鈕已顯示 - - 隱藏「訂閱」按鈕 - 「訂閱」按鈕已隱藏 - 「訂閱」按鈕已顯示 - 留言區 - 隱藏或顯示影片留言區內容 - 隱藏 AI 聊天摘要 - AI 聊天摘要已隱藏 - AI 聊天摘要已顯示 - 隱藏 AI 留言摘要 - AI 留言摘要已隱藏 - AI 留言摘要已顯示 - 隱藏頻道準則 - 已隱藏頻道準則 - 已顯示頻道準則 - 隱藏「會員留言」標題 - 已隱藏會員留言標題 - 已顯示會員留言標題 - 隱藏留言區 - 已隱藏留言區 - 已顯示留言區 - 隱藏社群守則 - 社群守則已隱藏 - 社群守則已顯示 - 隱藏「建立 Short」按鈕 - 已隱藏「建立 Short」按鈕 - 已顯示「建立 Short」按鈕 - 隱藏表情符號和時間戳記按鈕 - 表情符號和時間戳記按鈕已隱藏 - 表情符號和時間戳記按鈕已顯示 - 隱藏留言預覽 - 已隱藏留言預覽 - 已顯示留言預覽 - 隱藏「感謝」按鈕 - 已隱藏「感謝」按鈕 - 已顯示「感謝」按鈕 - 隱藏觀看次數 - 觀看次數已在資訊提供和搜尋結果中隱藏 - 觀看次數已在資訊提供和搜尋結果中顯示 - - "限制: + 隱藏「加入」按鈕 + 「加入」按鈕已隱藏 + 「加入」按鈕已顯示 + 隱藏醫療資訊面板 + 已隱藏醫療資訊面板 + 已顯示醫療資訊面板 + 隱藏快速操作 + 已於全螢幕中隱藏快速操作 + 已於全螢幕中顯示快速操作 + 隱藏相關影片 + 已隱藏快速操作中的相關影片 + 已顯示快速操作中的相關影片 + 隱藏訂閱者規範 + 已隱藏《訂閱者社群規範》 + 已顯示《訂閱者社群規範》 + 隱藏直播即時反應 + 已隱藏直播即時反應 + 已顯示直播即時反應 + 隱藏「AI 產生的影片摘要」 + AI 生成的影片摘要區塊已隱藏 + AI 生成的影片摘要區塊已顯示 + 隱藏詢問 + 「提問區」已隱藏 + 「提問區」已顯示 + 隱藏屬性 + 已隱藏精選地點、遊戲、音樂和提及的人區塊 + 已顯示精選地點、遊戲、音樂和提及的人區塊 + 隱藏章節 + 已隱藏章節區塊 + 已顯示章節區塊 + 隱藏「這項內容的製作方式」 + 已隱藏這項內容的製作方式區塊 + 已顯示這項內容的製作方式區塊 + 隱藏Hype點數 + Hype點數已隱藏 + Hype點數已顯示 + 隱藏「探索 Podcast」 + 已隱藏探索 Podcast 區塊 + 已顯示探索 Podcast 區塊 + 隱藏精選連結 + 精選連結區塊已隱藏 + 精選連結區塊已顯示 + 隱藏精選影片 + 精選影片區塊已隱藏 + 精選影片區塊已顯示 + 隱藏資訊卡 + 已隱藏資訊卡區塊 + 已顯示資訊卡區塊 + 隱藏「核心概念」 + 已隱藏核心概念區塊 + 已顯示核心概念區塊 + 隱藏「訂閱」按鈕 + 「訂閱」按鈕已隱藏 + 「訂閱」按鈕已顯示 + 隱藏轉錄稿 + 已隱藏轉錄稿區塊 + 已顯示轉錄稿區塊 + 影片說明 + 隱藏或顯示影片說明元件 + 篩選列 + 在推薦內容、相關影片、搜尋結果和觀看記錄中隱藏或顯示篩選欄 + 在動態中隱藏 + 已在動態中隱藏 + 已在動態中顯示 + 隱藏相關影片 + 已在相關影片中隱藏 + 已在相關影片中顯示 + 在搜尋結果中隱藏 + 已在搜尋結果中隱藏 + 已在搜尋結果中顯示 + 在觀看記錄中隱藏 + 已在觀看記錄中隱藏 + 已在觀看記錄中顯示 + 頻道頁面 + 隱藏或顯示頻道頁面元件 + + 隱藏社群按鈕 + 「社群」按鈕已隱藏 + 「社群」按鈕已顯示 + + 隱藏「為你推薦」區塊 + 已隱藏「為您推薦」區塊 + 已顯示「為您推薦」區塊 + + 隱藏「加入」按鈕 + 「加入」按鈕已隱藏 + 「加入」按鈕已顯示 + 隱藏連結預覽 + 已隱藏連結預覽 + 已顯示連結預覽 + 隱藏會員專屬區塊 + 會員專屬區塊已隱藏 + 會員專屬區塊已顯示 + + 隱藏「商店」按鈕 + 「商店」按鈕已隱藏 + 「商店」按鈕已顯示 + + 隱藏「訂閱」按鈕 + 「訂閱」按鈕已隱藏 + 「訂閱」按鈕已顯示 + 留言區 + 隱藏或顯示影片留言區內容 + 隱藏 AI 聊天摘要 + AI 聊天摘要已隱藏 + AI 聊天摘要已顯示 + 隱藏 AI 留言摘要 + AI 留言摘要已隱藏 + AI 留言摘要已顯示 + 隱藏頻道準則 + 已隱藏頻道準則 + 已顯示頻道準則 + 隱藏「會員留言」標題 + 已隱藏會員留言標題 + 已顯示會員留言標題 + 隱藏留言區 + 已隱藏留言區 + 已顯示留言區 + 隱藏社群守則 + 社群守則已隱藏 + 社群守則已顯示 + 隱藏「建立 Short」按鈕 + 已隱藏「建立 Short」按鈕 + 已顯示「建立 Short」按鈕 + 隱藏表情符號和時間戳記按鈕 + 表情符號和時間戳記按鈕已隱藏 + 表情符號和時間戳記按鈕已顯示 + 隱藏留言預覽 + 已隱藏留言預覽 + 已顯示留言預覽 + 隱藏「感謝」按鈕 + 已隱藏「感謝」按鈕 + 已顯示「感謝」按鈕 + 隱藏觀看次數 + 觀看次數已在資訊提供和搜尋結果中隱藏 + 觀看次數已在資訊提供和搜尋結果中顯示 + + "限制: • Shorts 專區、頻道頁面和搜尋結果可能仍會顯示觀看次數 • 此功能不適用於汽車外型規格" - 隱藏「上傳時間」 - 上傳時間已在資訊提供和搜尋結果中隱藏 - 上傳時間顯示在資訊提供和搜尋結果中 - - "限制: + 隱藏「上傳時間」 + 上傳時間已在資訊提供和搜尋結果中隱藏 + 上傳時間顯示在資訊提供和搜尋結果中 + + "限制: • Shorts 專區、頻道頁面和搜尋結果可能仍會顯示上傳時間 • 此功能不適用於車載模式" - 隱藏關鍵字內容 - 透過關鍵字篩選,隱藏搜尋結果與推薦內容中的影片 - 依關鍵字隱藏首頁影片 - 首頁分頁的影片會被關鍵字篩選 - 首頁影片將不會被關鍵字篩選 - 依關鍵字隱藏搜尋結果 - 搜尋結果將會被關鍵字篩選 - 搜尋結果將不會被關鍵字篩選 - 依關鍵字隱藏訂閱內容影片 - 訂閱內容分頁的影片會被關鍵字篩選 - 訂閱內容分頁的影片將不會被關鍵字篩選 - 要隱藏的關鍵字 - - "要隱藏的關鍵字和詞語,請用換行符號分隔 + "要隱藏的關鍵字和詞語,請用換行符號分隔 關鍵字可以是頻道名稱或影片標題中顯示的任何文字 中間有大寫字母的詞語必須輸入完全相同的大小寫(例如:iPhone、TikTok、YouTube)" - 關於關鍵字篩選 - "首頁/訂閱/搜尋結果會根據篩選條件,隱藏包含關鍵字詞組的相關內容 + 關於關鍵字篩選 + "首頁/訂閱/搜尋結果會根據篩選條件,隱藏包含關鍵字詞組的相關內容 限制 • Shorts 無法透過頻道名稱篩選隱藏 • 某些使用者介面可能無法隱藏 • 搜尋關鍵字可能顯示無結果" - 比對整個字詞 - - 將關鍵字或詞組用雙引號括起來,可以防止影片標題和頻道名稱的部分相符<br><br>例如:<br><b>\"ai\"</b> 會隱藏影片:<b>How does AI work?</b><br>但不會隱藏:<b>What does fair use mean?</b> - - 無法使用關鍵字:%s - 請加上引號來使用關鍵字:%s - 關鍵字存在衝突聲明:%s - 關鍵字過短,需要加上引號:%s - 關鍵字將隱藏所有影片:%s - - - 隱藏創作者商店區塊 - 已隱藏影片播放器下方的創作者商店區塊 - 已顯示影片播放器下方的創作者商店區塊 - 隱藏片尾商店橫幅 - 已隱藏片尾的商店橫幅 - 已顯示片尾的商店橫幅 - 隱藏全螢幕廣告 - "已隱藏全螢幕廣告 + 比對整個字詞 + + 將關鍵字或詞組用雙引號括起來,可以防止影片標題和頻道名稱的部分相符<br><br>例如:<br><b>\"ai\"</b> 會隱藏影片:<b>How does AI work?</b><br>但不會隱藏:<b>What does fair use mean?</b> + + 無法使用關鍵字:%s + 請加上引號來使用關鍵字:%s + 關鍵字存在衝突聲明:%s + 關鍵字過短,需要加上引號:%s + 關鍵字將隱藏所有影片:%s + + + 隱藏創作者商店區塊 + 已隱藏影片播放器下方的創作者商店區塊 + 已顯示影片播放器下方的創作者商店區塊 + 隱藏片尾商店橫幅 + 已隱藏片尾的商店橫幅 + 已顯示片尾的商店橫幅 + 隱藏全螢幕廣告 + "已隱藏全螢幕廣告 此功能僅適用於舊版裝置" - 已顯示全螢幕廣告 - - 只能在舊裝置上使用隱藏全螢幕廣告 - 隱藏一般廣告 - 已隱藏一般廣告 - 已顯示一般廣告 - 隱藏商品橫幅 - 已隱藏商品橫幅 - 已顯示商品橫幅 - 隱藏付費推廣標籤 - 已隱藏付費推廣標籤 - 已顯示付費推廣標籤 - 隱藏自我贊助資訊卡 - 已隱藏自我贊助資訊卡 - 已顯示自我贊助資訊卡 - 隱藏購物連結 - 已隱藏影片說明中的購物連結 - 已顯示影片說明中的購物連結 - 隱藏「查看商品」橫幅 - 已隱藏影片畫面上的「查看商品」橫幅 - 已顯示影片畫面上的「查看商品」橫幅 - 隱藏網頁搜尋結果 - 已隱藏網頁搜尋結果 - 已顯示網頁搜尋結果 - - - 隱藏 YouTube Premium 促銷內容 - 已隱藏影片播放器下方 YouTube Premium 促銷內容 - 已顯示影片播放器下方 YouTube Premium 促銷內容 - - - 隱藏影片廣告 - 已隱藏影片廣告 - 已顯示影片廣告 - - - 已將網址複製到剪貼簿 - 已複製時間戳記網址 - 顯示複製影片網址按鈕 - 「複製影片網址」按鈕已顯示。輕觸即可複製影片網址。長按即可複製附時間戳記的網址 - 「複製影片網址」按鈕未顯示 - 顯示複製時間戳記網址按鈕 - 「複製時間戳記網址」按鈕已顯示。輕觸即可複製附時間戳記的影片網址。長按即可複製不附時間戳記的網址 - 「複製時間戳記網址」按鈕未顯示 - - - 移除觀眾謹慎觀看對話方塊 - 將移除對話方塊 - 將顯示對話方塊 - 這不會繞過年齡限制,只會自動按下同意。 - - - 停用「登入電視」彈出視窗 - 「登入電視」彈出視窗已停用 - 「登入電視」彈出視窗已啟用 - - - 停用按兩下跳過章節功能 - 按兩下永遠不會觸發跳至下一/上一章節 - 按兩下可能會偶爾觸發跳至下一/上一章節 - - - 外部下載 - 使用外部下載器的設定 - 顯示外部下載按鈕 - 在播放器中顯示下載按鈕 - 在播放器中不顯示下載按鈕 - - 覆蓋「下載」動作按鈕 - 下載按鈕會開啟你的外部下載器 - 下載按鈕會開啟內建應用程式下載器 - 下載器套件名稱 - 您已安裝的外部下載器應用程式的套件名稱 - 輸入套件名稱 - 其他 - 應用程式未安裝 - 未安裝 %s。請前往安裝。 - "無法找到已安裝的應用程式,套件名稱為:%s + 已顯示全螢幕廣告 + + 只能在舊裝置上使用隱藏全螢幕廣告 + 隱藏一般廣告 + 已隱藏一般廣告 + 已顯示一般廣告 + 隱藏商品橫幅 + 已隱藏商品橫幅 + 已顯示商品橫幅 + 隱藏付費推廣標籤 + 已隱藏付費推廣標籤 + 已顯示付費推廣標籤 + 隱藏自我贊助資訊卡 + 已隱藏自我贊助資訊卡 + 已顯示自我贊助資訊卡 + 隱藏購物連結 + 已隱藏影片說明中的購物連結 + 已顯示影片說明中的購物連結 + 隱藏「查看商品」橫幅 + 已隱藏影片畫面上的「查看商品」橫幅 + 已顯示影片畫面上的「查看商品」橫幅 + 隱藏網頁搜尋結果 + 已隱藏網頁搜尋結果 + 已顯示網頁搜尋結果 + + + 隱藏 YouTube Premium 促銷內容 + 已隱藏影片播放器下方 YouTube Premium 促銷內容 + 已顯示影片播放器下方 YouTube Premium 促銷內容 + + + 隱藏影片廣告 + 已隱藏影片廣告 + 已顯示影片廣告 + + + 已將網址複製到剪貼簿 + 已複製時間戳記網址 + 顯示複製影片網址按鈕 + 「複製影片網址」按鈕已顯示。輕觸即可複製影片網址。長按即可複製附時間戳記的網址 + 「複製影片網址」按鈕未顯示 + 顯示複製時間戳記網址按鈕 + 「複製時間戳記網址」按鈕已顯示。輕觸即可複製附時間戳記的影片網址。長按即可複製不附時間戳記的網址 + 「複製時間戳記網址」按鈕未顯示 + + + 移除觀眾謹慎觀看對話方塊 + 將移除對話方塊 + 將顯示對話方塊 + 這不會繞過年齡限制,只會自動按下同意。 + + + 停用「登入電視」彈出視窗 + 「登入電視」彈出視窗已停用 + 「登入電視」彈出視窗已啟用 + + + 停用按兩下跳過章節功能 + 按兩下永遠不會觸發跳至下一/上一章節 + 按兩下可能會偶爾觸發跳至下一/上一章節 + + + 外部下載 + 使用外部下載器的設定 + 顯示外部下載按鈕 + 在播放器中顯示下載按鈕 + 在播放器中不顯示下載按鈕 + + 覆蓋「下載」動作按鈕 + 下載按鈕會開啟你的外部下載器 + 下載按鈕會開啟內建應用程式下載器 + 下載器套件名稱 + 您已安裝的外部下載器應用程式的套件名稱 + 輸入套件名稱 + 其他 + 應用程式未安裝 + 未安裝 %s。請前往安裝。 + "無法找到已安裝的應用程式,套件名稱為:%s 請驗證套件名稱是否正確以及應用程式是否已安裝" - 套件名稱不能為空 - - - 停用精準跳轉手勢 - 已停用精準跳轉手勢 - 已啟用精準跳轉手勢 - - - 啟用輕觸以跳轉 - 已啟用輕觸以跳轉 - 已停用輕觸以跳轉 - - - 啟用亮度手勢 - "已啟用全螢幕亮度滑動調整 + 套件名稱不能為空 + + + 停用精準跳轉手勢 + 已停用精準跳轉手勢 + 已啟用精準跳轉手勢 + + + 啟用輕觸以跳轉 + 已啟用輕觸以跳轉 + 已停用輕觸以跳轉 + + + 啟用亮度手勢 + "已啟用全螢幕亮度滑動調整 在螢幕左側垂直滑動即可調整亮度" - 已停用全螢幕亮度滑動調整 - 啟用音量手勢 - "已啟用全螢幕音量滑動調整 + 已停用全螢幕亮度滑動調整 + 啟用音量手勢 + "已啟用全螢幕音量滑動調整 在螢幕右側垂直滑動即可調整音量" - 已停用全螢幕音量滑動調整 - 啟用按壓滑動手勢 - 已啟用按壓滑動 - 已停用按壓滑動 - 啟用震動回饋 - 已啟用震動回饋 - 已停用震動回饋 - 儲存並還原亮度 - 退出或進入全螢幕時儲存並還原亮度 - 退出或進入全螢幕時亮度維持不變 - 啟用自動亮度手勢 - 亮度手勢滑到最底時,啟用自動亮度 - 亮度手勢滑到最底時,不啟用自動亮度 - 自動 - 滑動覆蓋顯示時間 - 覆蓋顯示的毫秒數 - 滑動覆蓋背景透明度 - 不透明度值介於 0 到 100 之間 - 滑動透明度必須介於 0 到 100 之間 - 滑動疊加亮度顏色 - 亮度控制用進度條的顏色 - 滑動疊加音量顏色 - 音量控制用進度條的顏色 - 滑動疊加文字大小 - 滑動疊加顯示的文字大小(介於 1 至 30) - 文字大小必須介於 1 至 30 之間 - 滑動幅度臨界點 - 滑動幅度臨界點 - 音量滑動靈敏度 - 滑動一下音量調整的大小 - 滑動疊加樣式 - 水平疊加 - 水平疊加(極簡風格-頂部) - 水平疊加(極簡風格-中間) - 圓形疊加 - 圓形疊加(極簡風格) - 垂直疊加 - 垂直覆蓋(最小) - 啟用滑動切換影片 - 在全螢幕模式下滑動將切換到下一部/上一部影片 - 在全螢幕模式下滑動將不會切換到下一部/上一部影片 - - - 停用自動產生的字幕 - 已停用自動產生的字幕 - 已啟用自動產生的字幕 - - - 動作按鈕 - 隱藏或顯示影片下方的按鈕 - 停用「喜歡」和「訂閱」的發光效果 - 提及時,「喜歡」和「訂閱」按鈕不會發光 - 提及時,「喜歡」和「訂閱」按鈕會發光 - 隱藏喜歡人數和不喜歡人數 - 已隱藏「喜歡」和「不喜歡」按鈕 - 已顯示「喜歡」和「不喜歡」按鈕 - - 隱藏分享 - 已隱藏「分享」按鈕 - 已顯示「分享」按鈕 - - 隱藏「停止廣告」 - 「停止廣告」按鈕已隱藏 - 「停止廣告」按鈕已顯示 - - 隱藏留言 - 留言按鈕已隱藏 - 留言按鈕已顯示 - + 隱藏分享 + 已隱藏「分享」按鈕 + 已顯示「分享」按鈕 + + 隱藏「停止廣告」 + 「停止廣告」按鈕已隱藏 + 「停止廣告」按鈕已顯示 + + 隱藏留言 + 留言按鈕已隱藏 + 留言按鈕已顯示 + - 隱藏檢舉 - 已隱藏「檢舉」按鈕 - 已顯示「檢舉」按鈕 - - 隱藏 Remix - 已隱藏「Remix」按鈕 - 已顯示「Remix」按鈕 - - 隱藏下載 - 已隱藏「下載」按鈕 - 已顯示「下載」按鈕 - + 隱藏 Remix + 已隱藏「Remix」按鈕 + 已顯示「Remix」按鈕 + + 隱藏下載 + 已隱藏「下載」按鈕 + 已顯示「下載」按鈕 + - 隱藏「熱推」 - 「熱推」按鈕已隱藏 - 「熱推」按鈕已顯示 - - 隱藏推廣 - 「推廣」按鈕已隱藏 - 「推廣」按鈕已顯示 - - 隱藏感謝 - 已隱藏「感謝」按鈕 - 已顯示「感謝」按鈕 - + 隱藏推廣 + 「推廣」按鈕已隱藏 + 「推廣」按鈕已顯示 + + 隱藏感謝 + 已隱藏「感謝」按鈕 + 已顯示「感謝」按鈕 + - 隱藏詢問 - 詢問按鈕已隱藏 - 詢問按鈕已顯示 - - 隱藏剪輯片段 - 已隱藏「剪輯片段」按鈕 - 已顯示「剪輯片段」按鈕 - - 隱藏「商店」 - 「商店」按鈕已隱藏 - 「商店」按鈕已顯示 - - 隱藏「儲存」 - 「儲存」按鈕已隱藏 - 「儲存」按鈕已顯示 - - - 導覽列按鈕 - 隱藏或變更導覽列中的按鈕 - - 隱藏首頁 - 已隱藏「首頁」按鈕 - 已顯示「首頁」按鈕 - - 隱藏 Shorts - 已隱藏「Shorts」按鈕 - 已顯示「Shorts」按鈕 - - 隱藏建立 - 已隱藏「建立」按鈕 - 已顯示「建立」按鈕 - - 隱藏訂閱內容 - 已隱藏「訂閱內容」按鈕 - 已顯示「訂閱內容」按鈕 - 隱藏「通知」 - 已隱藏「通知」按鈕 - 已顯示「通知」按鈕 - - 切換「建立」與「通知」按鈕 - "「建立」按鈕與「通知」按鈕對調 + 隱藏詢問 + 詢問按鈕已隱藏 + 詢問按鈕已顯示 + + 隱藏剪輯片段 + 已隱藏「剪輯片段」按鈕 + 已顯示「剪輯片段」按鈕 + + 隱藏「商店」 + 「商店」按鈕已隱藏 + 「商店」按鈕已顯示 + + 隱藏「儲存」 + 「儲存」按鈕已隱藏 + 「儲存」按鈕已顯示 + + + 導覽列按鈕 + 隱藏或變更導覽列中的按鈕 + + 隱藏首頁 + 已隱藏「首頁」按鈕 + 已顯示「首頁」按鈕 + + 隱藏 Shorts + 已隱藏「Shorts」按鈕 + 已顯示「Shorts」按鈕 + + 隱藏建立 + 已隱藏「建立」按鈕 + 已顯示「建立」按鈕 + + 隱藏訂閱內容 + 已隱藏「訂閱內容」按鈕 + 已顯示「訂閱內容」按鈕 + 隱藏「通知」 + 已隱藏「通知」按鈕 + 已顯示「通知」按鈕 + + 切換「建立」與「通知」按鈕 + "「建立」按鈕與「通知」按鈕對調 注意:啟用此功能也會強制隱藏影片廣告" - 「建立」按鈕不與「通知」按鈕對調 - "停用此設定也會停用 Shorts 的廣告攔截功能。 + 「建立」按鈕不與「通知」按鈕對調 + "停用此設定也會停用 Shorts 的廣告攔截功能。 如果變更此設定沒有生效,請試試看切換到無痕模式。" - 隱藏導覽列按鈕標籤 - 已隱藏「標籤」 - 已顯示「標籤」 - 停用半透明狀態列 - 狀態列為不透明 - 狀態列為不透明或半透明 - 在部分裝置上,啟用這項功能可能會使系統導覽列變成透明。 - 停用淺色半透明狀態列 - 淺色模式導覽列為不透明 - 淺色模式導覽列為不透明或半透明 - 停用深色半透明狀態列 - 深色模式導覽列為不透明 - 深色模式導覽列為不透明或半透明 - - - 介面選單 - 隱藏或顯示播放器彈出式選單 - - 隱藏「字幕」 - 已隱藏「字幕」選單 - 已顯示「字幕」選單 - - 隱藏「其他設定」 - 已隱藏「其他設定」選單 - 已顯示「其他設定」選單 - - 隱藏「睡眠計時器」 - 已隱藏「睡眠計時器」選單 - 已顯示「睡眠計時器」選單 - - 隱藏「循環播放影片」 - 已隱藏「循環播放影片」選單 - 已顯示「循環播放影片」選單 - - 隱藏「微光效果」 - 已隱藏「微光效果」選單 - 已顯示「微光效果」選單 - 隱藏「平衡音量」 - 已顯示「平衡音量」選單 - 已隱藏「平衡音量」選單 - - 隱藏「說明和意見回饋」 - 已隱藏「說明和意見回饋」選單 - 已顯示「說明和意見回饋」選單 - - 隱藏「播放速度」 - 已隱藏「播放速度」選單 - 已顯示「播放速度」選單 - - 隱藏「鎖定畫面」 - 已隱藏「鎖定畫面」選單 - 已顯示「鎖定畫面」選單 - - 隱藏「透過 YouTube Music 收聽」 - 「透過 YouTube Music 收聽」選單已隱藏 - 「使用 YouTube Music 聆聽」選單已顯示 - - 隱藏「音軌」 - 已隱藏「音軌」選單 - 已顯示「音軌」選單 - + 隱藏「字幕」 + 已隱藏「字幕」選單 + 已顯示「字幕」選單 + + 隱藏「其他設定」 + 已隱藏「其他設定」選單 + 已顯示「其他設定」選單 + + 隱藏「睡眠計時器」 + 已隱藏「睡眠計時器」選單 + 已顯示「睡眠計時器」選單 + + 隱藏「循環播放影片」 + 已隱藏「循環播放影片」選單 + 已顯示「循環播放影片」選單 + + 隱藏「微光效果」 + 已隱藏「微光效果」選單 + 已顯示「微光效果」選單 + 隱藏「平衡音量」 + 已顯示「平衡音量」選單 + 已隱藏「平衡音量」選單 + + 隱藏「說明和意見回饋」 + 已隱藏「說明和意見回饋」選單 + 已顯示「說明和意見回饋」選單 + + 隱藏「播放速度」 + 已隱藏「播放速度」選單 + 已顯示「播放速度」選單 + + 隱藏「鎖定畫面」 + 已隱藏「鎖定畫面」選單 + 已顯示「鎖定畫面」選單 + + 隱藏「透過 YouTube Music 收聽」 + 「透過 YouTube Music 收聽」選單已隱藏 + 「使用 YouTube Music 聆聽」選單已顯示 + + 隱藏「音軌」 + 已隱藏「音軌」選單 + 已顯示「音軌」選單 + - "已隱藏「音軌」選單 + "已隱藏「音軌」選單 如要顯示音軌選單,請將「欺騙視訊串流」變更為 'Android No SDK'" - - 隱藏「以 VR 模式觀看」 - 已隱藏「以 VR 模式觀看」 - 已顯示「以 VR 模式觀看」 - 隱藏影片畫質選單 - 影片畫質選單已隱藏 - 影片畫質選單已顯示 - 隱藏影片畫質選單頁尾 - 已隱藏影片畫質選單頁尾 - 已顯示影片畫質選單頁尾 - - - 隱藏「自動播放」按鈕 - 已隱藏「自動播放」按鈕 - 已顯示「自動播放」按鈕 - - 隱藏「字幕」按鈕 - 已隱藏「字幕」按鈕 - 已顯示「字幕」按鈕 - 隱藏「投放」按鈕 - 已隱藏「投放」按鈕 - 已顯示「投放」按鈕 - 隱藏播放器控制背景 - 播放器控制背景已隱藏 - 播放器控制背景已顯示 - 隱藏「上一部」和「下一部」按鈕 - 已隱藏「上一部」和「下一部」按鈕 - 已顯示「上一部」和「下一部」按鈕 - - - 隱藏片尾資訊卡 - 已隱藏片尾資訊卡 - 已顯示片尾資訊卡 - - - 在全螢幕狀態下停用微光效果 - 已停用微光效果 - 已啟用微光效果 - - - 隱藏資訊卡 - 已隱藏資訊卡 - 已顯示資訊卡 - - - 停用數字滾動動畫效果 - 滾動的數字將不會有動畫效果 - 滾動的數字將會有動畫效果 - - - 隱藏影片播放器的進度條 - 已隱藏影片播放器跳轉列 - 已顯示影片播放器跳轉列 - - 隱藏影片縮圖進度條 - 影片縮圖進度條已隱藏 - 影片縮圖進度條已顯示 - - - Shorts 播放器 - 隱藏或顯示 Shorts 播放器元件 - - 在首頁推薦內容中隱藏 Shorts - 已在首頁推薦內容和相關影片中隱藏 - 已在首頁推薦內容和相關影片中顯示 - 隱藏搜尋結果中的 Shorts - 已在搜尋結果中隱藏 - 已在搜尋結果中顯示 - - 隱藏訂閱內容中的 Shorts - 已在訂閱內容中隱藏 - 已在訂閱內容中顯示 - 隱藏觀看記錄中的 Shorts - 已在觀看記錄中隱藏 - 已在觀看記錄中顯示 - 隱藏「自動配音」標籤 - 已隱藏自動配音標籤 - 已顯示自動配音標籤 - 隱藏「購買超級感謝」按鈕 - 「購買超級感謝」按鈕已隱藏 - 「購買超級感謝」按鈕已顯示 - 隱藏「特效」按鈕 - 「特效」按鈕已隱藏 - 「特效」按鈕已顯示 - 隱藏「綠幕」按鈕 - 已隱藏「綠幕」按鈕 - 已顯示「綠幕」按鈕 - 隱藏主題標記按鈕 - 已隱藏主題標記按鈕 - 已顯示主題標記按鈕 - - 隱藏「加入」按鈕 - 已隱藏「加入」按鈕 - 已顯示「加入」按鈕 - 隱藏直播預覽 - 即時預覽已隱藏 - 即時預覽已顯示 - 隱藏地點標籤 - 已隱藏地點標籤 - 已顯示地點標籤 - 隱藏「新貼文」按鈕 - 「新貼文」按鈕已隱藏 - 「新貼文」按鈕已顯示 - 隱藏暫停時顯示的按鈕 - 已隱藏暫停時顯示的按鈕 - 已顯示暫停時顯示的按鈕 - 隱藏留言預覽 - 留言預覽已隱藏 - 留言預覽已顯示 - 隱藏「儲存音樂」按鈕 - 已隱藏「儲存音樂」按鈕 - 已顯示「儲存音樂」按鈕 - 隱藏搜尋建議 - 已隱藏搜尋建議 - 已顯示搜尋建議 - 隱藏「商店」按鈕 - 已隱藏「商店」按鈕 - 已顯示「商店」按鈕 - 隱藏貼圖 - 已隱藏貼圖 - 已顯示貼圖 - 隱藏「訂閱」按鈕 - 已隱藏「訂閱」按鈕 - 已顯示「訂閱」按鈕 - 隱藏標記產品 - 已隱藏標記產品 - 已顯示標記產品 - 隱藏「即將直播/首播」按鈕 - 已隱藏「即將直播/首播」按鈕 - 已顯示「即將直播/首播」按鈕 - 隱藏「使用此音效」按鈕 - 「使用此音效」按鈕已隱藏 - 「使用此音效」按鈕已顯示 - 隱藏「使用此範本」按鈕 - 「使用此範本」按鈕已隱藏 - 「使用此範本」按鈕已顯示 - 隱藏喜歡按鈕的噴泉動畫 - 已隱藏喜歡按鈕的動畫 - 已顯示喜歡按鈕的動畫 - 隱藏「喜歡」按鈕 - 已隱藏「喜歡」按鈕 - 已顯示「喜歡」按鈕 - 隱藏「不喜歡」按鈕 - 已隱藏「不喜歡」按鈕 - 已顯示「不喜歡」按鈕 - 隱藏「留言」按鈕 - 已隱藏「留言」按鈕 - 已顯示「留言」按鈕 - - 隱藏「分享」按鈕 - 已隱藏「分享」按鈕 - 已顯示「分享」按鈕 - - 隱藏「Remix」按鈕 - 已隱藏「Remix」按鈕 - 已顯示「Remix」按鈕 - 隱藏「音效」按鈕 - 已隱藏「音效」按鈕 - 已顯示「音效」按鈕 - 隱藏資訊面板 - 已隱藏資訊面板 - 已顯示資訊面板 - 隱藏頻道列 - 已隱藏頻道列 - 已顯示頻道列 - 隱藏影片標題 - 影片標題已隱藏 - 影片標題已顯示 - 隱藏聲音中繼資料標籤 - 音效中繼資料標籤已隱藏 - 音效中繼資料標籤已顯示 - 隱藏影片連結標籤 - 已隱藏影片連結標籤 - 已顯示影片連結標籤 - 隱藏導覽列 - 已隱藏導覽列 - 已顯示導覽列 - - - 隱藏片尾推薦影片 - "當自動播放關閉時,片尾推薦影片會被隱藏。 + + 隱藏「以 VR 模式觀看」 + 已隱藏「以 VR 模式觀看」 + 已顯示「以 VR 模式觀看」 + 隱藏影片畫質選單 + 影片畫質選單已隱藏 + 影片畫質選單已顯示 + 隱藏影片畫質選單頁尾 + 已隱藏影片畫質選單頁尾 + 已顯示影片畫質選單頁尾 + + + 隱藏「自動播放」按鈕 + 已隱藏「自動播放」按鈕 + 已顯示「自動播放」按鈕 + + 隱藏「字幕」按鈕 + 已隱藏「字幕」按鈕 + 已顯示「字幕」按鈕 + 隱藏「投放」按鈕 + 已隱藏「投放」按鈕 + 已顯示「投放」按鈕 + 隱藏播放器控制背景 + 播放器控制背景已隱藏 + 播放器控制背景已顯示 + 隱藏「上一部」和「下一部」按鈕 + 已隱藏「上一部」和「下一部」按鈕 + 已顯示「上一部」和「下一部」按鈕 + + + 隱藏片尾資訊卡 + 已隱藏片尾資訊卡 + 已顯示片尾資訊卡 + + + 在全螢幕狀態下停用微光效果 + 已停用微光效果 + 已啟用微光效果 + + + 隱藏資訊卡 + 已隱藏資訊卡 + 已顯示資訊卡 + + + 停用數字滾動動畫效果 + 滾動的數字將不會有動畫效果 + 滾動的數字將會有動畫效果 + + + 隱藏影片播放器的進度條 + 已隱藏影片播放器跳轉列 + 已顯示影片播放器跳轉列 + + 隱藏影片縮圖進度條 + 影片縮圖進度條已隱藏 + 影片縮圖進度條已顯示 + + + Shorts 播放器 + 隱藏或顯示 Shorts 播放器元件 + + 在首頁推薦內容中隱藏 Shorts + 已在首頁推薦內容和相關影片中隱藏 + 已在首頁推薦內容和相關影片中顯示 + 隱藏搜尋結果中的 Shorts + 已在搜尋結果中隱藏 + 已在搜尋結果中顯示 + + 隱藏訂閱內容中的 Shorts + 已在訂閱內容中隱藏 + 已在訂閱內容中顯示 + 隱藏觀看記錄中的 Shorts + 已在觀看記錄中隱藏 + 已在觀看記錄中顯示 + 隱藏「自動配音」標籤 + 已隱藏自動配音標籤 + 已顯示自動配音標籤 + 隱藏「購買超級感謝」按鈕 + 「購買超級感謝」按鈕已隱藏 + 「購買超級感謝」按鈕已顯示 + 隱藏「特效」按鈕 + 「特效」按鈕已隱藏 + 「特效」按鈕已顯示 + 隱藏「綠幕」按鈕 + 已隱藏「綠幕」按鈕 + 已顯示「綠幕」按鈕 + 隱藏主題標記按鈕 + 已隱藏主題標記按鈕 + 已顯示主題標記按鈕 + + 隱藏「加入」按鈕 + 已隱藏「加入」按鈕 + 已顯示「加入」按鈕 + 隱藏直播預覽 + 即時預覽已隱藏 + 即時預覽已顯示 + 隱藏地點標籤 + 已隱藏地點標籤 + 已顯示地點標籤 + 隱藏「新貼文」按鈕 + 「新貼文」按鈕已隱藏 + 「新貼文」按鈕已顯示 + 隱藏暫停時顯示的按鈕 + 已隱藏暫停時顯示的按鈕 + 已顯示暫停時顯示的按鈕 + 隱藏留言預覽 + 留言預覽已隱藏 + 留言預覽已顯示 + 隱藏「儲存音樂」按鈕 + 已隱藏「儲存音樂」按鈕 + 已顯示「儲存音樂」按鈕 + 隱藏搜尋建議 + 已隱藏搜尋建議 + 已顯示搜尋建議 + 隱藏「商店」按鈕 + 已隱藏「商店」按鈕 + 已顯示「商店」按鈕 + 隱藏貼圖 + 已隱藏貼圖 + 已顯示貼圖 + 隱藏「訂閱」按鈕 + 已隱藏「訂閱」按鈕 + 已顯示「訂閱」按鈕 + 隱藏標記產品 + 已隱藏標記產品 + 已顯示標記產品 + 隱藏「即將直播/首播」按鈕 + 已隱藏「即將直播/首播」按鈕 + 已顯示「即將直播/首播」按鈕 + 隱藏「使用此音效」按鈕 + 「使用此音效」按鈕已隱藏 + 「使用此音效」按鈕已顯示 + 隱藏「使用此範本」按鈕 + 「使用此範本」按鈕已隱藏 + 「使用此範本」按鈕已顯示 + 隱藏喜歡按鈕的噴泉動畫 + 已隱藏喜歡按鈕的動畫 + 已顯示喜歡按鈕的動畫 + 隱藏「喜歡」按鈕 + 已隱藏「喜歡」按鈕 + 已顯示「喜歡」按鈕 + 隱藏「不喜歡」按鈕 + 已隱藏「不喜歡」按鈕 + 已顯示「不喜歡」按鈕 + 隱藏「留言」按鈕 + 已隱藏「留言」按鈕 + 已顯示「留言」按鈕 + + 隱藏「分享」按鈕 + 已隱藏「分享」按鈕 + 已顯示「分享」按鈕 + + 隱藏「Remix」按鈕 + 已隱藏「Remix」按鈕 + 已顯示「Remix」按鈕 + 隱藏「音效」按鈕 + 已隱藏「音效」按鈕 + 已顯示「音效」按鈕 + 隱藏資訊面板 + 已隱藏資訊面板 + 已顯示資訊面板 + 隱藏頻道列 + 已隱藏頻道列 + 已顯示頻道列 + 隱藏影片標題 + 影片標題已隱藏 + 影片標題已顯示 + 隱藏聲音中繼資料標籤 + 音效中繼資料標籤已隱藏 + 音效中繼資料標籤已顯示 + 隱藏影片連結標籤 + 已隱藏影片連結標籤 + 已顯示影片連結標籤 + 隱藏導覽列 + 已隱藏導覽列 + 已顯示導覽列 + + + 隱藏片尾推薦影片 + "當自動播放關閉時,片尾推薦影片會被隱藏。 你可以在 YouTube 設定中變更自動播放設定: 設定 → 播放 → 自動播放下一個影片" - 已顯示片尾推薦影片 - - - 隱藏相關影片覆蓋層 - 全螢幕中的相關影片覆蓋層已隱藏 - 全螢幕中的相關影片覆蓋層已顯示 - - - 隱藏影片時間戳記 - 已隱藏時間戳記 - 已顯示時間戳記 - - - 隱藏播放器彈出面板 - 已隱藏播放器彈出面板 - 已顯示播放器彈出面板 - - - 視窗模式結束後退出全螢幕 - 停用 - 直立 - 橫向 - 直立和橫向 - - - 以全螢幕開啟影片 - 以全螢幕開啟影片 - 影片不會以全螢幕開啟 - - - 播放器覆蓋透明度 - 不透明度值介於 0 到 100 之間,其中 0 為完全透明 - 播放器覆蓋的不透明度必須在 0 到 100 之間 - - - - 暫時無法顯示不喜歡人數(API 逾時) - 無法顯示不喜歡人數(狀態 %d) - 無法顯示「不喜歡」數量(用戶端 API 限制) - 無法顯示不喜歡人數 (%s) - - 重新載入影片以使用 Return YouTube Dislike 進行投票 - - 已由擁有者隱藏 - Return YouTube Dislike - 已顯示不喜歡人數 - 不顯示不喜歡人數 - 在 Shorts 中顯示不喜歡人數 - "已顯示 Shorts 的不喜歡人數 + 已顯示片尾推薦影片 + + + 隱藏相關影片覆蓋層 + 全螢幕中的相關影片覆蓋層已隱藏 + 全螢幕中的相關影片覆蓋層已顯示 + + + 隱藏影片時間戳記 + 已隱藏時間戳記 + 已顯示時間戳記 + + + 隱藏播放器彈出面板 + 已隱藏播放器彈出面板 + 已顯示播放器彈出面板 + + + 視窗模式結束後退出全螢幕 + 停用 + 直立 + 橫向 + 直立和橫向 + + + 以全螢幕開啟影片 + 以全螢幕開啟影片 + 影片不會以全螢幕開啟 + + + 播放器覆蓋透明度 + 不透明度值介於 0 到 100 之間,其中 0 為完全透明 + 播放器覆蓋的不透明度必須在 0 到 100 之間 + + + + 暫時無法顯示不喜歡人數(API 逾時) + 無法顯示不喜歡人數(狀態 %d) + 無法顯示「不喜歡」數量(用戶端 API 限制) + 無法顯示不喜歡人數 (%s) + + 重新載入影片以使用 Return YouTube Dislike 進行投票 + + 已由擁有者隱藏 + Return YouTube Dislike + 已顯示不喜歡人數 + 不顯示不喜歡人數 + 在 Shorts 中顯示不喜歡人數 + "已顯示 Shorts 的不喜歡人數 限制:在無痕模式下可能不會顯示不喜歡人數" - 不顯示 Shorts 的不喜歡人數 - 不喜歡人數比例 - 以百分比顯示不喜歡人數 - 以數字顯示不喜歡人數 - - 精簡「喜歡」按鈕 - 「喜歡」按鈕樣式設為最小寬度 - 「喜歡」按鈕樣式設為最佳外觀 - 顯示預估喜歡人數 - 已停用喜歡的影片會顯示預估的喜歡人數 - 未顯示預估喜歡人數 - 若 API 無法使用,顯示提示 - 如果 Return YouTube Dislike 無法使用,則顯示提示訊息 - 如果 Return YouTube Dislike 無法使用,則不會顯示提示訊息 - ReturnYouTubeDislike.com - 資料由 Return YouTube Dislike API 提供。輕觸這裡來了解詳情 - - 回傳這部裝置的 ReturnYouTubeDislike API 統計資料 - 平均 API 回應時間 - 最短 API 回應時間 - 最長 API 回應時間 - 最後一個影片的 API 回應時間 - 暫時無法顯示不喜歡人數 — 用戶端 API 請求已達上限 - API 取得投票呼叫數 - 未進行網路呼叫 - 進行了 %d 次網路呼叫 - API取得投票逾時數 - 沒有網路呼叫逾時 - %d 個網路呼叫逾時 - API 用戶端速率限制 - 未遇到用戶端速率限制 - 遇到 %d 次用戶端速率限制 - %d 毫秒 - - - 啟用寬搜尋列 - 已啟用寬搜尋列 - 已停用寬搜尋列 - - - 啟用高畫質縮圖 - 已將跳轉列設為高畫質縮圖 - 已將跳轉列設為中畫質縮圖 - 全螢幕跳轉列縮圖為高畫質 - 全螢幕跳轉列縮圖為中畫質 - "這也會還原直播影片上沒有跳轉列縮圖的縮圖。 + 不顯示 Shorts 的不喜歡人數 + 不喜歡人數比例 + 以百分比顯示不喜歡人數 + 以數字顯示不喜歡人數 + + 精簡「喜歡」按鈕 + 「喜歡」按鈕樣式設為最小寬度 + 「喜歡」按鈕樣式設為最佳外觀 + 顯示預估喜歡人數 + 已停用喜歡的影片會顯示預估的喜歡人數 + 未顯示預估喜歡人數 + 若 API 無法使用,顯示提示 + 如果 Return YouTube Dislike 無法使用,則顯示提示訊息 + 如果 Return YouTube Dislike 無法使用,則不會顯示提示訊息 + ReturnYouTubeDislike.com + 資料由 Return YouTube Dislike API 提供。輕觸這裡來了解詳情 + + 回傳這部裝置的 ReturnYouTubeDislike API 統計資料 + 平均 API 回應時間 + 最短 API 回應時間 + 最長 API 回應時間 + 最後一個影片的 API 回應時間 + 暫時無法顯示不喜歡人數 — 用戶端 API 請求已達上限 + API 取得投票呼叫數 + 未進行網路呼叫 + 進行了 %d 次網路呼叫 + API取得投票逾時數 + 沒有網路呼叫逾時 + %d 個網路呼叫逾時 + API 用戶端速率限制 + 未遇到用戶端速率限制 + 遇到 %d 次用戶端速率限制 + %d 毫秒 + + + 啟用寬搜尋列 + 已啟用寬搜尋列 + 已停用寬搜尋列 + + + 啟用高畫質縮圖 + 已將跳轉列設為高畫質縮圖 + 已將跳轉列設為中畫質縮圖 + 全螢幕跳轉列縮圖為高畫質 + 全螢幕跳轉列縮圖為中畫質 + "這也會還原直播影片上沒有跳轉列縮圖的縮圖。 跳轉列縮圖將使用與目前影片相同的畫質。 這個功能在影片畫質為 720p 或以下,以及使用非常快速的網路連線時效果最佳。 " - 還原舊版跳轉列縮圖 - 跳轉列縮圖將出現在跳轉列上方 - 跳轉列縮圖將出現在全螢幕畫面 - - - SponsorBlock - 啟用 SponsorBlock - SponsorBlock 是一個眾包系統,用於跳過 YouTube 影片中惱人的部分 - 外觀 - 顯示「投票」按鈕 - 已顯示「片段投票」按鈕 - 不顯示「片段投票」按鈕 - 使用方形版面配置 - 已將按鈕和控制項設為方形 - 已將按鈕和控制項設為圓角 - - 使用精簡「跳過」按鈕 - 「跳過」按鈕樣式設為最小寬度 - 「跳過」按鈕樣式設為最佳外觀 - 自動隱藏「略過」按鈕 - 在幾秒過後隱藏「跳過」按鈕 - 整個片段皆顯示「跳過」按鈕 - 跳過按鈕顯示時間 - 跳過與「跳至重點」按鈕顯示多久後自動隱藏 - 顯示「取消跳過」提示 - 當片段自動跳過時會顯示提示。點擊提示通知可取消跳過 - 不顯示提示 - 跳過提示時長 - 「取消跳過」提示顯示多久 - 1 秒 - 2 秒 - 3 秒 - 4 秒 - 5 秒 - 6 秒 - 7 秒 - 8 秒 - 9 秒 - 10 秒 - 顯示不包含被跳過片段的時間戳記 - 在進度條上顯示扣除所有片段後的影片長度 - 只顯示完整的時間戳記 - 建立新片段 - 顯示「建立片段」按鈕 - 已顯示「建立片段」按鈕 - 不顯示「建立片段」按鈕 - 調整新跳過片段的時間長度 - 建立新片段之時間調整按鈕移動的毫秒數 - 值必須為正數 - 查看規範 - 規範包含有關送出片段的提示和規則 - 跟隨規範 - 建議在送出任何片段前先閱讀 SponsorBlock 指南 - 已閱讀 - 顯示 - 一般 - 若 API 無法使用,顯示提示 - 如果 SponsorBlock 無法使用,則顯示提示訊息 - 如果 SponsorBlock 無法使用,則不會顯示提示訊息 - 啟用跳過次數追蹤 - 讓 SponsorBlock 排行榜記錄您節省了多少時間。每跳過一個片段時,都會向排行榜傳送一則訊息 - 未啟用跳過次數追蹤 - 最短片段時長 - 小於設定值(以秒為單位)的片段不會被跳過或在播放器中顯示 - 無效的時間長度 - 您的個人使用者 ID - 這應該被保密。這就像一個密碼,不應該與他人分享。如果有人擁有它,他們就可以冒充您 - 個人使用者 ID 必須至少有 30 字元長 - 變更 API URL - SponsorBlock 用來和伺服器互動的位址 - 重設 API URL - 無效的 API URL - 已變更 API URL - 匯入/匯出設定 - 複製 - 這是你的 SponsorBlock JSON 設定檔,可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台 - 這是你的 SponsorBlock JSON 設定檔,可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這包含你的私人使用者 ID。請務必謹慎分享。 - 設定匯入成功 - 無法匯入:%s - 無法匯出:%s - "您的設定中包含一組私人的 SponsorBlock 使用者 ID。 + 還原舊版跳轉列縮圖 + 跳轉列縮圖將出現在跳轉列上方 + 跳轉列縮圖將出現在全螢幕畫面 + + + SponsorBlock + 啟用 SponsorBlock + SponsorBlock 是一個眾包系統,用於跳過 YouTube 影片中惱人的部分 + 外觀 + 顯示「投票」按鈕 + 已顯示「片段投票」按鈕 + 不顯示「片段投票」按鈕 + 使用方形版面配置 + 已將按鈕和控制項設為方形 + 已將按鈕和控制項設為圓角 + + 使用精簡「跳過」按鈕 + 「跳過」按鈕樣式設為最小寬度 + 「跳過」按鈕樣式設為最佳外觀 + 自動隱藏「略過」按鈕 + 在幾秒過後隱藏「跳過」按鈕 + 整個片段皆顯示「跳過」按鈕 + 跳過按鈕顯示時間 + 跳過與「跳至重點」按鈕顯示多久後自動隱藏 + 顯示「取消跳過」提示 + 當片段自動跳過時會顯示提示。點擊提示通知可取消跳過 + 不顯示提示 + 跳過提示時長 + 「取消跳過」提示顯示多久 + 1 秒 + 2 秒 + 3 秒 + 4 秒 + 5 秒 + 6 秒 + 7 秒 + 8 秒 + 9 秒 + 10 秒 + 顯示不包含被跳過片段的時間戳記 + 在進度條上顯示扣除所有片段後的影片長度 + 只顯示完整的時間戳記 + 建立新片段 + 顯示「建立片段」按鈕 + 已顯示「建立片段」按鈕 + 不顯示「建立片段」按鈕 + 調整新跳過片段的時間長度 + 建立新片段之時間調整按鈕移動的毫秒數 + 值必須為正數 + 查看規範 + 規範包含有關送出片段的提示和規則 + 跟隨規範 + 建議在送出任何片段前先閱讀 SponsorBlock 指南 + 已閱讀 + 顯示 + 一般 + 若 API 無法使用,顯示提示 + 如果 SponsorBlock 無法使用,則顯示提示訊息 + 如果 SponsorBlock 無法使用,則不會顯示提示訊息 + 啟用跳過次數追蹤 + 讓 SponsorBlock 排行榜記錄您節省了多少時間。每跳過一個片段時,都會向排行榜傳送一則訊息 + 未啟用跳過次數追蹤 + 最短片段時長 + 小於設定值(以秒為單位)的片段不會被跳過或在播放器中顯示 + 無效的時間長度 + 您的個人使用者 ID + 這應該被保密。這就像一個密碼,不應該與他人分享。如果有人擁有它,他們就可以冒充您 + 個人使用者 ID 必須至少有 30 字元長 + 變更 API URL + SponsorBlock 用來和伺服器互動的位址 + 重設 API URL + 無效的 API URL + 已變更 API URL + 匯入/匯出設定 + 複製 + 這是你的 SponsorBlock JSON 設定檔,可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台 + 這是你的 SponsorBlock JSON 設定檔,可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這包含你的私人使用者 ID。請務必謹慎分享。 + 設定匯入成功 + 無法匯入:%s + 無法匯出:%s + "您的設定中包含一組私人的 SponsorBlock 使用者 ID。 您的使用者 ID 就像密碼一樣,絕對不應該分享出去。" - 不再顯示 - 變更片段操作 - 贊助商廣告 - 付費宣傳、付費推薦和直接廣告。不適用於自我推銷或為個人喜愛的公益活動/創作者/網站/產品提供免費宣傳。 - 非付費/自我推廣 - 類似「贊助商廣告」,但針對的是非付費或自我宣傳的內容。包含商品、捐款或合作夥伴資訊等片段 - 互動提醒(訂閱) - 內容中段簡短提醒觀眾按讚、訂閱或追蹤。 若提醒過長或內容具體,則應歸類為自我宣傳。 - 精華 - 影片中大家最想看的地方 - 中場休息/開頭動畫 - 指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。 - 片尾資訊卡/鳴謝 - 鳴謝或 YouTube 片尾資訊卡出現時。不適用於含有資訊的結論。 - 開場白 / 問候 - 即將推出的影片的旁白預告片、問候語和告別語。不包含增加額外內容的部分 - 預覽 / 回顧 - 展示影片或系列影片中即將到來或已發生的內容片段合輯,且所有資訊在其他地方重複出現。 - 離題 / 笑話 - 離題的場景或笑話,這些內容並非理解影片主要內容所必需的。不包括提供背景或詳細資訊的部分 - 音樂:非音樂片段 - 僅適用於音樂影片。音樂影片中沒有音樂,且不屬於其他類別的段落。 - 跳過 - 精華 - 跳過贊助商廣告 - 跳過推廣 - 跳過互動 - 跳到精華 - 跳過開頭 - 跳過中場休息 - 跳過中場休息 - 跳過片尾 - 跳過掛鉤 - 跳過預覽 - 跳過預覽 - 跳過回顧 - 跳過離題 - 跳過非音樂 - 跳過片段 - 已跳過贊助商廣告 - 已跳過自我推廣 - 已跳過提醒 - 已跳到精華 - 已跳過開頭 - 已跳過中場休息 - 已跳過中場休息 - 已跳過結尾 - 已跳過掛鉤 - 已跳過預覽 - 已跳過預覽 - 已跳過回顧 - 已跳過不相關內容 - 已跳過非音樂部分 - 跳過了未提交的片段 - 已跳過多個片段 - 自動跳過 - 自動跳過一次 - 顯示「跳過」按鈕 - 在跳轉列顯示 - 停用 - 無法提交片段:%s - SponsorBlock 暫時離線 - 無法提交片段(狀態:%1$d %2$s) - 無法提交片段。速率限制(同一位使用者或 IP 的提交次數過多) - 無法提交片段:%s - "無法提交片段。 + 不再顯示 + 變更片段操作 + 贊助商廣告 + 付費宣傳、付費推薦和直接廣告。不適用於自我推銷或為個人喜愛的公益活動/創作者/網站/產品提供免費宣傳。 + 非付費/自我推廣 + 類似「贊助商廣告」,但針對的是非付費或自我宣傳的內容。包含商品、捐款或合作夥伴資訊等片段 + 互動提醒(訂閱) + 內容中段簡短提醒觀眾按讚、訂閱或追蹤。 若提醒過長或內容具體,則應歸類為自我宣傳。 + 精華 + 影片中大家最想看的地方 + 中場休息/開頭動畫 + 指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。 + 片尾資訊卡/鳴謝 + 鳴謝或 YouTube 片尾資訊卡出現時。不適用於含有資訊的結論。 + 開場白 / 問候 + 即將推出的影片的旁白預告片、問候語和告別語。不包含增加額外內容的部分 + 預覽 / 回顧 + 展示影片或系列影片中即將到來或已發生的內容片段合輯,且所有資訊在其他地方重複出現。 + 離題 / 笑話 + 離題的場景或笑話,這些內容並非理解影片主要內容所必需的。不包括提供背景或詳細資訊的部分 + 音樂:非音樂片段 + 僅適用於音樂影片。音樂影片中沒有音樂,且不屬於其他類別的段落。 + 跳過 + 精華 + 跳過贊助商廣告 + 跳過推廣 + 跳過互動 + 跳到精華 + 跳過開頭 + 跳過中場休息 + 跳過中場休息 + 跳過片尾 + 跳過掛鉤 + 跳過預覽 + 跳過預覽 + 跳過回顧 + 跳過離題 + 跳過非音樂 + 跳過片段 + 已跳過贊助商廣告 + 已跳過自我推廣 + 已跳過提醒 + 已跳到精華 + 已跳過開頭 + 已跳過中場休息 + 已跳過中場休息 + 已跳過結尾 + 已跳過掛鉤 + 已跳過預覽 + 已跳過預覽 + 已跳過回顧 + 已跳過不相關內容 + 已跳過非音樂部分 + 跳過了未提交的片段 + 已跳過多個片段 + 自動跳過 + 自動跳過一次 + 顯示「跳過」按鈕 + 在跳轉列顯示 + 停用 + 無法提交片段:%s + SponsorBlock 暫時離線 + 無法提交片段(狀態:%1$d %2$s) + 無法提交片段。速率限制(同一位使用者或 IP 的提交次數過多) + 無法提交片段:%s + "無法提交片段。 已經存在" - 新片段提交成功 - - SponsorBlock 暫時無法使用(API 逾時) - SponsorBlock 暫時無法使用(狀態 %d) - SponsorBlock 暫時無法使用 - 無法為片段投票(API 逾時) - 無法為片段投票(狀態:%1$d %2$s) - 無法為片段投票:%s - 按讚 - 倒讚 - 變更類別 - 沒有可以投票的片段 - - %1$s 至 %2$s - 選擇片段的類別 - 已在設定中停用類別。啟用類別以提交。 - 新 SponsorBlock 片段 - 將 %s 設為新片段的開始或結束? - 開始 - 結束 - 現在 - 片段開始時間 - 片段結束時間 - 時間是否正確? - "片段選取範圍 + 新片段提交成功 + + SponsorBlock 暫時無法使用(API 逾時) + SponsorBlock 暫時無法使用(狀態 %d) + SponsorBlock 暫時無法使用 + 無法為片段投票(API 逾時) + 無法為片段投票(狀態:%1$d %2$s) + 無法為片段投票:%s + 按讚 + 倒讚 + 變更類別 + 沒有可以投票的片段 + + %1$s 至 %2$s + 選擇片段的類別 + 已在設定中停用類別。啟用類別以提交。 + 新 SponsorBlock 片段 + 將 %s 設為新片段的開始或結束? + 開始 + 結束 + 現在 + 片段開始時間 + 片段結束時間 + 時間是否正確? + "片段選取範圍 從 %1$s @@ -1293,47 +1292,47 @@ Second \"item\" text" (%3$s) 準備提交?" - 起始點必須在終點之前 - 首先在時間欄上標記兩個位置 - 預覽片段,確保能順利跳過 - 手動編輯片段的時間 - 您想編輯片段開始或結束的時間嗎? - 所選擇的時間無效 - 統計 - - 統計資料暫時不可用(API 離線) - 載入中… - 已停用 SponsorBlock - 你的使用者名稱:<b>%s</b> - 輕觸這裡變更你的使用者名稱 - 無法變更使用者名稱:狀態:%1$d %2$s - 使用者名稱變更成功 - 你的評價是 <b>%.2f</b> - 你已建立 <b>%s</b> 個片段 - 輕觸這裡查看你的片段 - SponsorBlock 排行榜 - 你已為人們省下了觀看 <b>%s</b> 個片段的時間 - 輕觸這裡查看全球統計資料和最佳貢獻者 - 那可是他們生命中寶貴的 <b>%s</b>。<br>輕觸這裡檢視排行榜 - 你已跳過 <b>%s</b> 個片段 - 總共 <b>%s</b> - 要重設跳過片段的計數器嗎? - %1$s 小時 %2$s 分鐘 - %1$s 分鐘 %2$s 秒 - %s 秒 - 不透明度: - 顏色: - 關於 - sponsor.ajay.app - 資料由 SponsorBlock API 提供。輕觸這裡來了解更多資訊和查看其他平台的下載 - - - 版面配置形式 - 預設 - 手機 - 平板電腦 - 汽車 - "修改項目包括: + 起始點必須在終點之前 + 首先在時間欄上標記兩個位置 + 預覽片段,確保能順利跳過 + 手動編輯片段的時間 + 您想編輯片段開始或結束的時間嗎? + 所選擇的時間無效 + 統計 + + 統計資料暫時不可用(API 離線) + 載入中… + 已停用 SponsorBlock + 你的使用者名稱:<b>%s</b> + 輕觸這裡變更你的使用者名稱 + 無法變更使用者名稱:狀態:%1$d %2$s + 使用者名稱變更成功 + 你的評價是 <b>%.2f</b> + 你已建立 <b>%s</b> 個片段 + 輕觸這裡查看你的片段 + SponsorBlock 排行榜 + 你已為人們省下了觀看 <b>%s</b> 個片段的時間 + 輕觸這裡查看全球統計資料和最佳貢獻者 + 那可是他們生命中寶貴的 <b>%s</b>。<br>輕觸這裡檢視排行榜 + 你已跳過 <b>%s</b> 個片段 + 總共 <b>%s</b> + 要重設跳過片段的計數器嗎? + %1$s 小時 %2$s 分鐘 + %1$s 分鐘 %2$s 秒 + %s 秒 + 不透明度: + 顏色: + 關於 + sponsor.ajay.app + 資料由 SponsorBlock API 提供。輕觸這裡來了解更多資訊和查看其他平台的下載 + + + 版面配置形式 + 預設 + 手機 + 平板電腦 + 汽車 + "修改項目包括: 平板電腦版面配置 • 隱藏社群貼文 @@ -1341,333 +1340,333 @@ Second \"item\" text" 汽車版面配置 • Shorts 會以一般播放器開啟 • 動態內容會依主題和頻道整理" - - - 偽裝應用程式版本 - 已偽裝版本 - 未偽裝版本 - "應用程式版本將偽裝成舊版 YouTube。 + + + 偽裝應用程式版本 + 已偽裝版本 + 未偽裝版本 + "應用程式版本將偽裝成舊版 YouTube。 這會改變應用程式的外觀和功能,但可能會發生未知的副作用。 如果之後關閉此設定,建議清除應用程式資料以避免 UI 錯誤。" - 應用程式偽裝目標版本 - 20.13.41 - 還原未收合的影片操作列 - 20.05.46 - 恢復轉錄功能 - 19.35.36 - 還原舊版 Shorts 播放圖示 - 19.01.34 - 還原舊版導覽圖示 - - - 變更起始頁面 - 預設 - 所有訂閱內容 - 瀏覽頻道 - 課程/學習 - 探索 - 時尚與美妝 - 遊戲 - 歷史記錄 - 媒體庫 - 喜歡的影片 - 直播 - 電影 - 音樂 - 新聞 - 通知 - 播放清單 - 搜尋 - 購物 - Shorts - 運動 - 訂閱內容 - 發燒影片 - 虛擬實境 - 稍後觀看 - 你的剪輯 - 一律變更起始頁面 - "開始頁面一律變更 + 應用程式偽裝目標版本 + 20.13.41 - 還原未收合的影片操作列 + 20.05.46 - 恢復轉錄功能 + 19.35.36 - 還原舊版 Shorts 播放圖示 + 19.01.34 - 還原舊版導覽圖示 + + + 變更起始頁面 + 預設 + 所有訂閱內容 + 瀏覽頻道 + 課程/學習 + 探索 + 時尚與美妝 + 遊戲 + 歷史記錄 + 媒體庫 + 喜歡的影片 + 直播 + 電影 + 音樂 + 新聞 + 通知 + 播放清單 + 搜尋 + 購物 + Shorts + 運動 + 訂閱內容 + 發燒影片 + 虛擬實境 + 稍後觀看 + 你的剪輯 + 一律變更起始頁面 + "開始頁面一律變更 限制:工具列上的返回按鈕可能無法運作" - 起始頁面僅在應用程式啟動時變更 - - - 停用 Shorts 播放器接續播放功能 - 應用程式啟動時,Shorts 播放器將不會接續播放 - 應用程式啟動時,Shorts 播放器將接續播放 - - - Shorts 開啟方式 - Shorts 播放器 - 一般播放器 - 一般播放器全螢幕 - - - 自動播放 Shorts - Shorts 將自動播放 - Shorts 將重複播放 - 在背景自動播放 Shorts - Shorts 將在背景自動播放 - Shorts 將在背景重複播放 - - - 迷你播放器 - 變更應用程式內最小化播放器的樣式 - 迷你播放器類型 - 停用 - 預設 - 極簡 - 平板電腦 - 現代 1 - 現代 2 - 現代 3 - 現代 4 - 停用圓角 - 已將角落設為方角 - 已將角落設為圓角 - 啟用輕觸兩下動作和雙指撥動調整大小 - "已啟用輕觸兩下動作和雙指撥動調整大小 + 起始頁面僅在應用程式啟動時變更 + + + 停用 Shorts 播放器接續播放功能 + 應用程式啟動時,Shorts 播放器將不會接續播放 + 應用程式啟動時,Shorts 播放器將接續播放 + + + Shorts 開啟方式 + Shorts 播放器 + 一般播放器 + 一般播放器全螢幕 + + + 自動播放 Shorts + Shorts 將自動播放 + Shorts 將重複播放 + 在背景自動播放 Shorts + Shorts 將在背景自動播放 + Shorts 將在背景重複播放 + + + 迷你播放器 + 變更應用程式內最小化播放器的樣式 + 迷你播放器類型 + 停用 + 預設 + 極簡 + 平板電腦 + 現代 1 + 現代 2 + 現代 3 + 現代 4 + 停用圓角 + 已將角落設為方角 + 已將角落設為圓角 + 啟用輕觸兩下動作和雙指撥動調整大小 + "已啟用輕觸兩下動作和雙指撥動調整大小 • 輕觸兩下以放大迷你播放器 • 再次輕觸兩下以還原原始大小" - 已停用輕觸兩下動作和雙指撥動調整大小 - 停用拖放 - 已停用拖曳功能 - "已啟用拖曳功能 + 已停用輕觸兩下動作和雙指撥動調整大小 + 停用拖放 + 已停用拖曳功能 + "已啟用拖曳功能 迷你播放器可拖曳至螢幕任一角落" - 停用水平拖曳手勢 - 已停用水平拖曳手勢 - "已啟用水平拖曳手勢 + 停用水平拖曳手勢 + 已停用水平拖曳手勢 + "已啟用水平拖曳手勢 迷你播放器可水平拖曳至螢幕左右兩側之外" - 隱藏暫停時顯示的按鈕 - 已隱藏暫停時顯示的按鈕 - 已顯示暫停時顯示的按鈕 - 隱藏展開和關閉按鈕 - "已隱藏按鈕 + 隱藏暫停時顯示的按鈕 + 已隱藏暫停時顯示的按鈕 + 已顯示暫停時顯示的按鈕 + 隱藏展開和關閉按鈕 + "已隱藏按鈕 滑動即可展開或關閉" - 已顯示展開和關閉按鈕 - 隱藏字幕 - 已隱藏字幕 - 已顯示字幕 - 隱藏「快轉」和「倒帶」按鈕 - 已隱藏「快轉」和「倒帶」按鈕 - 已顯示「快轉」和「倒帶」按鈕 - 初始大小 - 螢幕初始大小(像素) - 像素大小必須介於 %1$s 和 %2$s 之間 - 覆蓋不透明度 - 不透明度值介於 0 到 100 之間,其中 0 為完全透明 - 迷你播放器覆蓋的不透明度必須介於 0 到 100 之間 - - - 啟用漸層載入畫面 - 載入畫面將具有漸層背景 - 載入畫面將具有純色背景 - 啟動畫面樣式 - 顏色 - 黑白 - 啟用自訂跳轉列顏色 - 已顯示自訂跳轉列顏色 - 已顯示原版跳轉列顏色 - 自訂跳轉列顏色 - 跳轉列顏色 - 自訂跳轉列強調色彩 - 跳轉列強調色彩 - 跳轉列色彩值無效 - - - YouTube ReVanced - YT ReVanced - YT - - - 標題標誌 - 預設 - 一般 - Premium - ReVanced - - ReVanced 精簡版 - 自訂 - - - 繞過圖片區域限制 - 使用圖片主機 yt4.ggpht.com - "使用原圖主機 + 已顯示展開和關閉按鈕 + 隱藏字幕 + 已隱藏字幕 + 已顯示字幕 + 隱藏「快轉」和「倒帶」按鈕 + 已隱藏「快轉」和「倒帶」按鈕 + 已顯示「快轉」和「倒帶」按鈕 + 初始大小 + 螢幕初始大小(像素) + 像素大小必須介於 %1$s 和 %2$s 之間 + 覆蓋不透明度 + 不透明度值介於 0 到 100 之間,其中 0 為完全透明 + 迷你播放器覆蓋的不透明度必須介於 0 到 100 之間 + + + 啟用漸層載入畫面 + 載入畫面將具有漸層背景 + 載入畫面將具有純色背景 + 啟動畫面樣式 + 顏色 + 黑白 + 啟用自訂跳轉列顏色 + 已顯示自訂跳轉列顏色 + 已顯示原版跳轉列顏色 + 自訂跳轉列顏色 + 跳轉列顏色 + 自訂跳轉列強調色彩 + 跳轉列強調色彩 + 跳轉列色彩值無效 + + + YouTube ReVanced + YT ReVanced + YT + + + 標題標誌 + 預設 + 一般 + Premium + ReVanced + + ReVanced 精簡版 + 自訂 + + + 繞過圖片區域限制 + 使用圖片主機 yt4.ggpht.com + "使用原圖主機 啟用此設定可以修正在某些地區遭到封鎖而無法顯示的圖片 " - - - - 首頁分頁 - - 訂閱分頁 - - 個人中心分頁 - 播放器的播放清單與推薦影片 - 搜尋結果 - 原版縮圖 - DeArrow 和原版縮圖 - DeArrow 和靜態截圖 - 靜態截圖 - DeArrow - "DeArrow 為 YouTube 影片提供由社群提供的縮圖。 + + + + 首頁分頁 + + 訂閱分頁 + + 個人中心分頁 + 播放器的播放清單與推薦影片 + 搜尋結果 + 原版縮圖 + DeArrow 和原版縮圖 + DeArrow 和靜態截圖 + 靜態截圖 + DeArrow + "DeArrow 為 YouTube 影片提供由社群提供的縮圖。 這些縮圖通常比 YouTube 提供的更貼切。 若您啟用此功能,影片網址將會傳送至 API 伺服器,不會傳送其他資料。如果影片沒有 DeArrow 縮圖,則會顯示原始縮圖或靜態截圖。 輕觸這裡以進一步了解 DeArrow" - 若 API 無法使用,顯示提示 - 如果 DeArrow 無法使用,則顯示提示訊息 - 如果 DeArrow 無法使用,則不會顯示提示訊息 - DeArrow API 端點 - DeArrow URL 縮圖快取端點 - 靜態影片擷取 - 靜態擷取是擷取每個影片的開頭/中間/結尾作為縮圖。這些圖像內建於 YouTube 中,不會使用外部 API - 使用快速靜態擷取 - 使用中等品質靜態擷取。縮圖載入速度會更快,但直播、未發布或非常舊的影片可能會顯示空白縮圖 - 使用高品質的靜態擷取 - 靜態擷取的影片時間 - 影片開頭 - 影片中間 - 影片結尾 - - DeArrow 暫時無法使用(狀態碼:%s) - DeArrow 暫時無法使用 - - - 顯示 ReVanced 公告 - 啟動時顯示公告 - 啟動時顯示公告 - 啟動時顯示公告 - 無法連線到公告提供者 - 忽略 - - - 啟用循環播放影片 - 影片將循環播放 - 影片將不循環播放 - - - 顯示循環播放影片按鈕 - 按鈕已顯示 - 按鈕未顯示 - 循環播放影片已開啟 - 循環播放影片已關閉 - - - 音訊中斷時暫停 - 當其他音訊播放時(例如導航),播放會暫停 - 當其他音訊播放時,音量會降低 - - - 偽裝裝置尺寸 - "已偽裝裝置尺寸 + 若 API 無法使用,顯示提示 + 如果 DeArrow 無法使用,則顯示提示訊息 + 如果 DeArrow 無法使用,則不會顯示提示訊息 + DeArrow API 端點 + DeArrow URL 縮圖快取端點 + 靜態影片擷取 + 靜態擷取是擷取每個影片的開頭/中間/結尾作為縮圖。這些圖像內建於 YouTube 中,不會使用外部 API + 使用快速靜態擷取 + 使用中等品質靜態擷取。縮圖載入速度會更快,但直播、未發布或非常舊的影片可能會顯示空白縮圖 + 使用高品質的靜態擷取 + 靜態擷取的影片時間 + 影片開頭 + 影片中間 + 影片結尾 + + DeArrow 暫時無法使用(狀態碼:%s) + DeArrow 暫時無法使用 + + + 顯示 ReVanced 公告 + 啟動時顯示公告 + 啟動時顯示公告 + 啟動時顯示公告 + 無法連線到公告提供者 + 忽略 + + + 啟用循環播放影片 + 影片將循環播放 + 影片將不循環播放 + + + 顯示循環播放影片按鈕 + 按鈕已顯示 + 按鈕未顯示 + 循環播放影片已開啟 + 循環播放影片已關閉 + + + 音訊中斷時暫停 + 當其他音訊播放時(例如導航),播放會暫停 + 當其他音訊播放時,音量會降低 + + + 偽裝裝置尺寸 + "已偽裝裝置尺寸 雖然可能會解鎖更高的影片畫質,但你可能會遇到影片播放卡頓、電池續航力變差,以及未知的副作用" - "未偽裝裝置尺寸 + "未偽裝裝置尺寸 啟用此設定可以解鎖更高的影片畫質" - 啟用這個功能可能會導致影片播放卡頓、電池續航力變差,以及未知的副作用。 - - - 觸覺回饋 - 變更觸覺回饋 - 停用章節觸覺回饋 - 章節觸覺回饋已停用 - 章節觸覺回饋已啟用 - 停用精準拖曳觸覺回饋 - 精準拖曳觸覺回饋已停用 - 精準拖曳觸覺回饋已啟用 - 停用拖曳還原觸覺回饋 - 拖曳還原觸覺回饋已停用 - 拖曳還原觸覺回饋已啟用 - 停用縮放震動 - 縮放觸覺回饋已停用 - 縮放觸覺回饋已啟用 - - - 如果您最近變更了帳戶登入詳細資訊,請解除安裝並重新安裝 MicroG。 - - - 繞過 URL 重新導向 - 已繞過 URL 重新導向 - 未繞過 URL 重新導向 - - - 在瀏覽器中開啟連結 - 在外部瀏覽器中開啟連結 - 在應用程式內瀏覽器中開啟連結 - - - - 自動 - 記住影片畫質 - 畫質變更適用於所有影片 - 畫質變更僅適用於目前的影片 - 在變更影片畫質時顯示提示 - 變更預設影片畫質時會顯示提示 - 變更預設影片畫質時不會顯示提示 - 使用 Wi-Fi 時的預設影片畫質 - 使用行動數據時的預設影片畫質 - 記住 Shorts 的畫質變更 - 畫質變更適用於所有 Shorts - 畫質變更僅適用於目前的 Shorts - Wi-Fi 網路下的預設 Shorts 畫質 - 行動網路下的預設 Shorts 畫質 - 行動數據 - Wi-Fi - 已將預設 %1$s 畫質變更為:%2$s - 已將 Shorts %1$s 畫質變更為:%2$s - - - 顯示速度對話方塊按鈕 - 速度對話框按鈕已顯示。長按可將播放速度重設為預設值 - 速度對話框按鈕未顯示 - - - 顯示畫質切換按鈕 - 影片畫質按鈕已顯示。長按可重設為預設畫質 - 影片畫質按鈕未顯示 - - - 自訂播放速度選單 - 已顯示自訂播放速度選單 - 不顯示自訂播放速度選單 - 恢復舊版播放速度選單 - 已顯示舊版速度選單 - 已顯示新版速度選單 - 自訂播放速度 - 新增或變更自訂播放速度 - 自訂速度必須小於 %s - 自訂播放速度格式不正確 - 自動 - 自訂輕觸和按住的速度 - 播放速度介於 0 到 8 之間 - - - 記住播放速度 - 播放速度變更適用於所有影片 - 播放速度變更僅適用於目前的影片 - 在變更播放速度時顯示提示 - 變更預設播放速度時會顯示提示 - 變更預設播放速度時不會顯示提示 - 預設播放速度 - 已將預設速度變更為:%s - - - 停用 HDR 影片 - 已停用 HDR 影片 - 已啟用 HDR 影片 - 強制使用 AVC (H.264) - 視訊編解碼器強制使用 AVC (H.264) - 視訊編解碼器將自動決定 - "優點: + 啟用這個功能可能會導致影片播放卡頓、電池續航力變差,以及未知的副作用。 + + + 觸覺回饋 + 變更觸覺回饋 + 停用章節觸覺回饋 + 章節觸覺回饋已停用 + 章節觸覺回饋已啟用 + 停用精準拖曳觸覺回饋 + 精準拖曳觸覺回饋已停用 + 精準拖曳觸覺回饋已啟用 + 停用拖曳還原觸覺回饋 + 拖曳還原觸覺回饋已停用 + 拖曳還原觸覺回饋已啟用 + 停用縮放震動 + 縮放觸覺回饋已停用 + 縮放觸覺回饋已啟用 + + + 如果您最近變更了帳戶登入詳細資訊,請解除安裝並重新安裝 MicroG。 + + + 繞過 URL 重新導向 + 已繞過 URL 重新導向 + 未繞過 URL 重新導向 + + + 在瀏覽器中開啟連結 + 在外部瀏覽器中開啟連結 + 在應用程式內瀏覽器中開啟連結 + + + + 自動 + 記住影片畫質 + 畫質變更適用於所有影片 + 畫質變更僅適用於目前的影片 + 在變更影片畫質時顯示提示 + 變更預設影片畫質時會顯示提示 + 變更預設影片畫質時不會顯示提示 + 使用 Wi-Fi 時的預設影片畫質 + 使用行動數據時的預設影片畫質 + 記住 Shorts 的畫質變更 + 畫質變更適用於所有 Shorts + 畫質變更僅適用於目前的 Shorts + Wi-Fi 網路下的預設 Shorts 畫質 + 行動網路下的預設 Shorts 畫質 + 行動數據 + Wi-Fi + 已將預設 %1$s 畫質變更為:%2$s + 已將 Shorts %1$s 畫質變更為:%2$s + + + 顯示速度對話方塊按鈕 + 速度對話框按鈕已顯示。長按可將播放速度重設為預設值 + 速度對話框按鈕未顯示 + + + 顯示畫質切換按鈕 + 影片畫質按鈕已顯示。長按可重設為預設畫質 + 影片畫質按鈕未顯示 + + + 自訂播放速度選單 + 已顯示自訂播放速度選單 + 不顯示自訂播放速度選單 + 恢復舊版播放速度選單 + 已顯示舊版速度選單 + 已顯示新版速度選單 + 自訂播放速度 + 新增或變更自訂播放速度 + 自訂速度必須小於 %s + 自訂播放速度格式不正確 + 自動 + 自訂輕觸和按住的速度 + 播放速度介於 0 到 8 之間 + + + 記住播放速度 + 播放速度變更適用於所有影片 + 播放速度變更僅適用於目前的影片 + 在變更播放速度時顯示提示 + 變更預設播放速度時會顯示提示 + 變更預設播放速度時不會顯示提示 + 預設播放速度 + 已將預設速度變更為:%s + + + 停用 HDR 影片 + 已停用 HDR 影片 + 已啟用 HDR 影片 + 強制使用 AVC (H.264) + 視訊編解碼器強制使用 AVC (H.264) + 視訊編解碼器將自動決定 + "優點: • 可改善電池續航力 • 可在較舊的裝置上還原遺失的影片解析度 @@ -1676,182 +1675,182 @@ Second \"item\" text" • 影片播放將比 VP9 或 AV1 消耗更多網路數據 • HDR 影片將不會使用 AVC • 部分裝置無法強制使用 AVC" - - - 顯示進階影片畫質選單 - 已顯示進階影片畫質選單 - 不顯示進階影片畫質選單 - - - 啟用滑動預覽 - 已啟用滑動預覽 - 未啟用滑動預覽 - - - 允許 Android VR AV1 - "視訊轉碼器為 AVC (H.264)、VP9 或 AV1 + + + 顯示進階影片畫質選單 + 已顯示進階影片畫質選單 + 不顯示進階影片畫質選單 + + + 啟用滑動預覽 + 已啟用滑動預覽 + 未啟用滑動預覽 + + + 允許 Android VR AV1 + "視訊轉碼器為 AVC (H.264)、VP9 或 AV1 播放可能會卡頓或掉幀" - 視訊轉碼器為 AVC (H.264) 或 VP9 - "啟用此設定可能會使用軟體 AV1 解碼。 + 視訊轉碼器為 AVC (H.264) 或 VP9 + "啟用此設定可能會使用軟體 AV1 解碼。 AV1 視訊播放可能會卡頓或掉幀。" - 欺騙的副作用 - • 實驗性用戶端,隨時可能停止運作 - • 影片可能會在 1:00 停止,或在某些地區無法播放 - • 音軌選單遺失 - • 沒有 AV1 影片解碼器 - • 穩定音量無法使用 - • 在登出或無痕模式下,兒童影片可能無法播放 - - • 強制原始音訊不可用 - 顯示統計資料 - 已在統計資料中顯示用戶端類型 - 已在統計資料中隱藏用戶端類型 - - - - - YT Music ReVanced - Music ReVanced - Music - - - 關於 - 廣告 - 一般 - 播放器 - 其他 - - - 隱藏影片廣告 - 影片廣告已隱藏 - 影片廣告已顯示 - - - 啟用永久重複播放 - 永久重複播放已啟用 - 永久重複播放已停用 - - - 隱藏「投放」按鈕 - 「投放」按鈕已隱藏 - 「投放」按鈕已顯示 - 隱藏「歷史記錄」按鈕 - 「歷史記錄」按鈕已隱藏 - 「歷史記錄」按鈕已顯示 - 隱藏「通知」按鈕 - 「通知」按鈕已隱藏 - 「通知」按鈕已顯示 - 隱藏「搜尋」按鈕 - 「搜尋」按鈕已隱藏 - 「搜尋」按鈕已顯示 - - - 隱藏類別列 - 類別列已隱藏 - 類別列已顯示 - - - 變更迷你播放器顏色 - 迷你播放器顏色符合全螢幕播放器 - 迷你播放器使用預設顏色 - - - 導覽列 - 隱藏或變更導覽列按鈕 - - 隱藏「首頁」 - 「首頁」按鈕已隱藏 - 「首頁」按鈕已顯示 - - 隱藏「取樣」 - 「取樣」按鈕已隱藏 - 「取樣」按鈕已顯示 - - 隱藏探索 - 「探索」按鈕已隱藏 - 「探索」按鈕已顯示 - - 隱藏媒體庫 - 「媒體庫」按鈕已隱藏 - 「媒體庫」按鈕已顯示 - - 隱藏升級 - 「升級」按鈕已隱藏 - 「升級」按鈕已顯示 - 隱藏導覽列 - 導覽列已隱藏 - 導覽列已顯示 - 隱藏導覽按鈕標籤 - 已隱藏「標籤」 - 已顯示「標籤」 - - - 隱藏「取得 Music Premium」標籤 - 標籤已隱藏 - 標籤已顯示 - - - 隱藏升級按鈕 - 按鈕已隱藏 - 按鈕已顯示 - - - - - 阻擋音訊廣告 - 已阻擋音訊廣告 - 未阻擋音訊廣告 - - - %s 無法使用,可能會顯示廣告。請嘗試在設定中變更廣告封鎖服務。 - %s 傳回錯誤,可能會顯示廣告。請嘗試在設定中變更廣告封鎖服務。 - 阻擋嵌入式影片廣告 - 已停用 - Luminous 代理 - PurpleAdBlock 代理 - - - 攔截影片廣告 - 已攔截影片廣告 - 未攔截影片廣告 - - - 訊息已刪除 - 顯示已刪除的訊息 - 不顯示已刪除的訊息 - 將已刪除的訊息隱藏在劇透後面 - 將已刪除的訊息顯示為劃掉的文字 - - - 自動化領取頻道忠誠點數 - 已開啟自動化領取頻道忠誠點數 - 已關閉自動化領取頻道忠誠點數 - - - - 啟用 Twitch 偵錯模式 - 已啟用 Twitch 偵錯模式(不推薦啟用) - 已停用 Twitch 偵錯模式 - - - ReVanced 設定 - 關於 - 關於 ReVanced - 廣告封鎖 - 廣告封鎖設定 - 聊天 - 聊天設定 - 其他 - 其他設定 - 一般設定 - 其他設定 - 用戶端廣告 - 伺服器端 Surestream 廣告 - 偵錯記錄檔 - 已啟用偵錯記錄檔 - 已停用偵錯記錄檔 - - + 欺騙的副作用 + • 實驗性用戶端,隨時可能停止運作 + • 影片可能會在 1:00 停止,或在某些地區無法播放 + • 音軌選單遺失 + • 沒有 AV1 影片解碼器 + • 穩定音量無法使用 + • 在登出或無痕模式下,兒童影片可能無法播放 + + • 強制原始音訊不可用 + 顯示統計資料 + 已在統計資料中顯示用戶端類型 + 已在統計資料中隱藏用戶端類型 + + + + + YT Music ReVanced + Music ReVanced + Music + + + 關於 + 廣告 + 一般 + 播放器 + 其他 + + + 隱藏影片廣告 + 影片廣告已隱藏 + 影片廣告已顯示 + + + 啟用永久重複播放 + 永久重複播放已啟用 + 永久重複播放已停用 + + + 隱藏「投放」按鈕 + 「投放」按鈕已隱藏 + 「投放」按鈕已顯示 + 隱藏「歷史記錄」按鈕 + 「歷史記錄」按鈕已隱藏 + 「歷史記錄」按鈕已顯示 + 隱藏「通知」按鈕 + 「通知」按鈕已隱藏 + 「通知」按鈕已顯示 + 隱藏「搜尋」按鈕 + 「搜尋」按鈕已隱藏 + 「搜尋」按鈕已顯示 + + + 隱藏類別列 + 類別列已隱藏 + 類別列已顯示 + + + 變更迷你播放器顏色 + 迷你播放器顏色符合全螢幕播放器 + 迷你播放器使用預設顏色 + + + 導覽列 + 隱藏或變更導覽列按鈕 + + 隱藏「首頁」 + 「首頁」按鈕已隱藏 + 「首頁」按鈕已顯示 + + 隱藏「取樣」 + 「取樣」按鈕已隱藏 + 「取樣」按鈕已顯示 + + 隱藏探索 + 「探索」按鈕已隱藏 + 「探索」按鈕已顯示 + + 隱藏媒體庫 + 「媒體庫」按鈕已隱藏 + 「媒體庫」按鈕已顯示 + + 隱藏升級 + 「升級」按鈕已隱藏 + 「升級」按鈕已顯示 + 隱藏導覽列 + 導覽列已隱藏 + 導覽列已顯示 + 隱藏導覽按鈕標籤 + 已隱藏「標籤」 + 已顯示「標籤」 + + + 隱藏「取得 Music Premium」標籤 + 標籤已隱藏 + 標籤已顯示 + + + 隱藏升級按鈕 + 按鈕已隱藏 + 按鈕已顯示 + + + + + 阻擋音訊廣告 + 已阻擋音訊廣告 + 未阻擋音訊廣告 + + + %s 無法使用,可能會顯示廣告。請嘗試在設定中變更廣告封鎖服務。 + %s 傳回錯誤,可能會顯示廣告。請嘗試在設定中變更廣告封鎖服務。 + 阻擋嵌入式影片廣告 + 已停用 + Luminous 代理 + PurpleAdBlock 代理 + + + 攔截影片廣告 + 已攔截影片廣告 + 未攔截影片廣告 + + + 訊息已刪除 + 顯示已刪除的訊息 + 不顯示已刪除的訊息 + 將已刪除的訊息隱藏在劇透後面 + 將已刪除的訊息顯示為劃掉的文字 + + + 自動化領取頻道忠誠點數 + 已開啟自動化領取頻道忠誠點數 + 已關閉自動化領取頻道忠誠點數 + + + + 啟用 Twitch 偵錯模式 + 已啟用 Twitch 偵錯模式(不推薦啟用) + 已停用 Twitch 偵錯模式 + + + ReVanced 設定 + 關於 + 關於 ReVanced + 廣告封鎖 + 廣告封鎖設定 + 聊天 + 聊天設定 + 其他 + 其他設定 + 一般設定 + 其他設定 + 用戶端廣告 + 伺服器端 Surestream 廣告 + 偵錯記錄檔 + 已啟用偵錯記錄檔 + 已停用偵錯記錄檔 + + diff --git a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml index 3858fd059e..3a40645452 100644 --- a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml @@ -17,293 +17,221 @@ "First 'item' text Second \"item\" text" ---> - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c2ac1f04a0ac180555a9d19e7ff41525487fbc6d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 16 Feb 2026 02:08:19 +0100 Subject: [PATCH 002/161] fix(GmsCore support): Rename MicroG GmsCore specific strings as well and rename app specific strings correctly --- .../shared/misc/gms/GmsCoreSupportPatch.kt | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 59c63f2da1..623f60b2fb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -55,7 +55,7 @@ fun gmsCoreSupportPatch( ) = bytecodePatch( name = "GmsCore support", description = "Allows the app to work without root by using a different package name when patched " + - "using a GmsCore instead of Google Play Services.", + "using a GmsCore instead of Google Play Services.", ) { val gmsCoreVendorGroupIdOption = stringOption( key = "gmsCoreVendorGroupId", @@ -88,8 +88,9 @@ fun gmsCoreSupportPatch( } implementation.instructions.forEachIndexed insnLoop@{ index, instruction -> - val string = ((instruction as? Instruction21c)?.reference as? StringReference)?.string - ?: return@insnLoop + val string = + ((instruction as? Instruction21c)?.reference as? StringReference)?.string + ?: return@insnLoop // Apply transformation. val transformedString = transform(string) ?: return@insnLoop @@ -111,7 +112,7 @@ fun gmsCoreSupportPatch( "com.google.android.gms", in GMS_PERMISSIONS, in GMS_AUTHORITIES, - -> if (string.startsWith("com.google")) { + -> if (string.startsWith("com.google")) { string.replace("com.google", gmsCoreVendorGroupId) } else { "$gmsCoreVendorGroupId.$string" @@ -119,7 +120,7 @@ fun gmsCoreSupportPatch( in APP_PERMISSIONS, in APP_AUTHORITIES, - -> "$toPackageName.$string" + -> "$toPackageName.$string" else -> null } @@ -191,7 +192,7 @@ fun gmsCoreSupportPatch( mainActivityOnCreateFingerprint.method.addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "checkGmsCore(Landroid/app/Activity;)V", + "checkGmsCore(Landroid/app/Activity;)V", ) // Change the vendor of GmsCore in the extension. @@ -232,35 +233,39 @@ fun gmsCoreSupportResourcePatch( execute { addResources("shared", "misc.gms.gmsCoreSupportResourcePatch") + val toPackageName = setOrGetFallbackPackageName(toPackageName) + document("AndroidManifest.xml").use { document -> document.getElementsByTagName("permission").asSequence().forEach { node -> - val nameElement = node.attributes.getNamedItem("android:name") - nameElement.textContent = toPackageName + nameElement.textContent + node.attributes.getNamedItem("android:name").apply { + APP_PERMISSIONS += textContent + + textContent = "$toPackageName.$textContent" + } } document.getElementsByTagName("uses-permission").asSequence().forEach { node -> - val nameElement = node.attributes.getNamedItem("android:name") - if (nameElement.textContent in GMS_PERMISSIONS) { - nameElement.textContent.replace("com.google", gmsCoreVendorGroupId) + node.attributes.getNamedItem("android:name").apply { + if (textContent in GMS_PERMISSIONS) { + textContent.replace("com.google", gmsCoreVendorGroupId) + } else if (textContent in APP_PERMISSIONS) { + textContent = "$toPackageName.$textContent" + } } } document.getElementsByTagName("provider").asSequence().forEach { node -> - val providerElement = node.attributes.getNamedItem("android:authorities") - - providerElement.textContent = providerElement.textContent.split(";") - .joinToString(";") { authority -> - if (authority.startsWith("com.google")) { - authority.replace("com.google", gmsCoreVendorGroupId) - } else { - "$gmsCoreVendorGroupId.$authority" + node.attributes.getNamedItem("android:authorities").apply { + textContent = textContent.split(";") + .joinToString(";") { authority -> + APP_AUTHORITIES += authority + "$toPackageName.$authority" } - } + } } document.getNode("manifest") - .attributes.getNamedItem("package").textContent = - setOrGetFallbackPackageName(toPackageName) + .attributes.getNamedItem("package").textContent = toPackageName document.getNode("queries").appendChild( document.createElement("package").apply { @@ -336,7 +341,7 @@ private object Constants { ) val GMS_AUTHORITIES = setOf( - "google.android.gms.fileprovider", + "com.google.android.gms.fileprovider", "com.google.android.gms.auth.accounts", "com.google.android.gms.chimera", "com.google.android.gms.fonts", @@ -346,7 +351,11 @@ private object Constants { "subscribedfeeds", ) - val APP_PERMISSIONS = mutableSetOf() + val APP_PERMISSIONS = mutableSetOf( + "org.microg.gms.STATUS_BROADCAST", + "org.microg.gms.EXTENDED_ACCESS", + "org.microg.gms.PROVISION" + ) val APP_AUTHORITIES = mutableSetOf() } From 131ee4f707b2c83aefa6dbc977f330fed592fc17 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 16 Feb 2026 02:09:00 +0100 Subject: [PATCH 003/161] ci: Fix string processing command --- .github/workflows/pull_strings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull_strings.yml b/.github/workflows/pull_strings.yml index 241745e151..7e6b74d57c 100644 --- a/.github/workflows/pull_strings.yml +++ b/.github/workflows/pull_strings.yml @@ -32,7 +32,7 @@ jobs: - name: Process strings run: | - gradlew processStringsFromCrowdin + ./gradlew processStringsFromCrowdin env: ORG_GRADLE_PROJECT_githubPackagesUsername: ${{ github.actor }} ORG_GRADLE_PROJECT_githubPackagesPassword: ${{ secrets.GITHUB_TOKEN }} From 9f3a16005af8be7047023a0f4be2b62f775d1b80 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Feb 2026 01:50:41 +0000 Subject: [PATCH 004/161] chore: Release v5.50.3-dev.1 [skip ci] ## [5.50.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.2...v5.50.3-dev.1) (2026-02-16) ### Bug Fixes * **GmsCore support:** Rename MicroG GmsCore specific strings as well and rename app specific strings correctly ([c2ac1f0](https://github.com/ReVanced/revanced-patches/commit/c2ac1f04a0ac180555a9d19e7ff41525487fbc6d)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2a5c0db7b..267970c965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.50.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.2...v5.50.3-dev.1) (2026-02-16) + + +### Bug Fixes + +* **GmsCore support:** Rename MicroG GmsCore specific strings as well and rename app specific strings correctly ([c2ac1f0](https://github.com/ReVanced/revanced-patches/commit/c2ac1f04a0ac180555a9d19e7ff41525487fbc6d)) + ## [5.50.2](https://github.com/ReVanced/revanced-patches/compare/v5.50.1...v5.50.2) (2026-02-15) diff --git a/gradle.properties b/gradle.properties index 085bb670fd..d83a2a19dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.50.2 +version = 5.50.3-dev.1 From 2aa19f5995fd050c40b15331a77d58144a5a1f69 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 16 Feb 2026 18:41:30 +0100 Subject: [PATCH 005/161] fix(GmsCore support): Handle GmsCore flavors when checking for updates --- .../extension/shared/GmsCoreSupport.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java index 71e815f811..fb7e68963a 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java @@ -14,11 +14,14 @@ import android.os.PowerManager; import android.provider.Settings; import android.util.Pair; import android.widget.LinearLayout; + import androidx.annotation.Nullable; + import app.revanced.extension.shared.requests.Requester; import app.revanced.extension.shared.requests.Route; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.ui.CustomDialog; + import org.json.JSONObject; import java.net.HttpURLConnection; @@ -219,11 +222,17 @@ public class GmsCoreSupport { Utils.runOnBackgroundThread(() -> { try { PackageManager manager = context.getPackageManager(); - String installedVersion = manager.getPackageInfo(packageName, 0).versionName; + var installedVersion = manager.getPackageInfo(packageName, 0).versionName; - Logger.printDebug(() -> "Installed GmsCore version: " + installedVersion); + // GmsCore adds suffixes for flavor builds. Remove the suffix for version comparison. + int suffixIndex = installedVersion.indexOf('-'); + if (suffixIndex != -1) + installedVersion = installedVersion.substring(0, suffixIndex); + String finalInstalledVersion = installedVersion; - String latestVersion = getLatestVersion.get(); + Logger.printDebug(() -> "Installed GmsCore version: " + finalInstalledVersion); + + var latestVersion = getLatestVersion.get(); if (latestVersion == null || latestVersion.isEmpty()) { Logger.printDebug(() -> "Could not get latest GmsCore version"); @@ -235,7 +244,7 @@ public class GmsCoreSupport { // Compare versions if (!installedVersion.equals(latestVersion)) { - Logger.printInfo(() -> "GmsCore update available. Installed: " + installedVersion + Logger.printInfo(() -> "GmsCore update available. Installed: " + finalInstalledVersion + ", Latest: " + latestVersion); showUpdateDialog(context, installedVersion, latestVersion); From aa8c87f8650bd5def5f726f02be5d62d72a3007b Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 16 Feb 2026 19:00:40 +0100 Subject: [PATCH 006/161] fix: Use positional substitutes in strings where multiple are present --- patches/src/main/resources/addresources/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 1363e85a83..ce372be397 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -112,7 +112,7 @@ To translate new languages or improve the existing translations, visit translate MicroG GmsCore is not installed. Install it. Action needed Failed to check for MicroG GmsCore updates - A new version (%s) of MicroG GmsCore is available. Currently, you are using version %s. + A new version (%1$s) of MicroG GmsCore is available. Currently, you are using version %2$s. "MicroG GmsCore does not have permission to run in the background. Follow the \"Don\'t kill my app\" guide for your phone, and apply the instructions to your MicroG installation. From 784bcdace4af9c590bc41951070a0a35550fad5a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 16 Feb 2026 18:05:22 +0000 Subject: [PATCH 007/161] chore: Release v5.50.3-dev.2 [skip ci] ## [5.50.3-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.1...v5.50.3-dev.2) (2026-02-16) ### Bug Fixes * **GmsCore support:** Handle GmsCore flavors when checking for updates ([2aa19f5](https://github.com/ReVanced/revanced-patches/commit/2aa19f5995fd050c40b15331a77d58144a5a1f69)) * Use positional substitutes in strings where multiple are present ([aa8c87f](https://github.com/ReVanced/revanced-patches/commit/aa8c87f8650bd5def5f726f02be5d62d72a3007b)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 267970c965..6a7ce5218c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [5.50.3-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.1...v5.50.3-dev.2) (2026-02-16) + + +### Bug Fixes + +* **GmsCore support:** Handle GmsCore flavors when checking for updates ([2aa19f5](https://github.com/ReVanced/revanced-patches/commit/2aa19f5995fd050c40b15331a77d58144a5a1f69)) +* Use positional substitutes in strings where multiple are present ([aa8c87f](https://github.com/ReVanced/revanced-patches/commit/aa8c87f8650bd5def5f726f02be5d62d72a3007b)) + ## [5.50.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.2...v5.50.3-dev.1) (2026-02-16) diff --git a/gradle.properties b/gradle.properties index d83a2a19dd..f6855a7808 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.50.3-dev.1 +version = 5.50.3-dev.2 From 03e8e3d75cb3b03987299885cea5eb615a5cef23 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 20 Feb 2026 22:01:14 +0100 Subject: [PATCH 008/161] fix(GmsCore support): Insert check after necessary context hook --- .../googlenews/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../misc/gms/GmsCoreSupportPatch.kt | 14 +++++++++++++- .../music/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../shared/misc/gms/GmsCoreSupportPatch.kt | 18 +++++++++++------- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 2 +- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt index d03ce31e7d..4644ddd141 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt @@ -11,7 +11,7 @@ import app.revanced.patches.shared.misc.gms.gmsCoreSupportResourcePatch val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = MAGAZINES_PACKAGE_NAME, toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME, - mainActivityOnCreateFingerprint = magazinesActivityOnCreateFingerprint, + mainActivityOnCreateFingerprintToInsertIndex = magazinesActivityOnCreateFingerprint to { 0 }, extensionPatch = extensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt index 3ed14a29dd..4a27e93cae 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt @@ -5,12 +5,24 @@ import app.revanced.patches.googlephotos.misc.extension.extensionPatch import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME import app.revanced.patches.googlephotos.misc.gms.Constants.REVANCED_PHOTOS_PACKAGE_NAME import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = PHOTOS_PACKAGE_NAME, toPackageName = REVANCED_PHOTOS_PACKAGE_NAME, - mainActivityOnCreateFingerprint = homeActivityOnCreateFingerprint, + mainActivityOnCreateFingerprintToInsertIndex = homeActivityOnCreateFingerprint to { + val index = homeActivityOnCreateFingerprint.method.indexOfFirstInstructionOrThrow { + getReference()?.name == "getApplicationContext" + } + + // Below the move-result-object instruction, + // because the extension patch is used by the GmsCore support patch + // which hooks the getApplicationContext call. + index + 2 + }, extensionPatch = extensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt index 1a7a58db3e..5d74ef8be9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt @@ -25,7 +25,7 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( earlyReturnFingerprints = setOf( castContextFetchFingerprint, ), - mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + mainActivityOnCreateFingerprintToInsertIndex = musicActivityOnCreateFingerprint to { 0 }, extensionPatch = sharedExtensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 623f60b2fb..5f10d80967 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -35,7 +35,8 @@ private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$" * @param toPackageName The package name to fall back to if no custom package name is specified in patch options. * @param primeMethodFingerprint The fingerprint of the "prime" method that needs to be patched. * @param earlyReturnFingerprints The fingerprints of methods that need to be returned early. - * @param mainActivityOnCreateFingerprint The fingerprint of the main activity onCreate method. + * @param mainActivityOnCreateFingerprintToInsertIndex The fingerprint of the main activity onCreate method + * and a function to get the index to insert the GmsCore check instruction at. * @param extensionPatch The patch responsible for the extension. * @param gmsCoreSupportResourcePatchFactory The factory for the corresponding resource patch * that is used to patch the resources. @@ -47,7 +48,7 @@ fun gmsCoreSupportPatch( toPackageName: String, primeMethodFingerprint: Fingerprint? = null, earlyReturnFingerprints: Set = setOf(), - mainActivityOnCreateFingerprint: Fingerprint, + mainActivityOnCreateFingerprintToInsertIndex: Pair Int>, extensionPatch: Patch<*>, gmsCoreSupportResourcePatchFactory: (gmsCoreVendorGroupIdOption: Option) -> Patch<*>, executeBlock: BytecodePatchContext.() -> Unit = {}, @@ -189,11 +190,14 @@ fun gmsCoreSupportPatch( originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName) // Verify GmsCore is installed and whitelisted for power optimizations and background usage. - mainActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "checkGmsCore(Landroid/app/Activity;)V", - ) + + mainActivityOnCreateFingerprintToInsertIndex.let { (fingerprint, getInsertIndex) -> + fingerprint.method.addInstruction( + getInsertIndex(), + "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + + "checkGmsCore(Landroid/app/Activity;)V", + ) + } // Change the vendor of GmsCore in the extension. getGmsCoreVendorGroupIdFingerprint.method.returnEarly(gmsCoreVendorGroupId) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 9986ed9a06..605f904479 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -26,7 +26,7 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( earlyReturnFingerprints = setOf( castContextFetchFingerprint, ), - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + mainActivityOnCreateFingerprintToInsertIndex = mainActivityOnCreateFingerprint to { 0 }, extensionPatch = sharedExtensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { From 2bd37784591d64421b8a0bc12a604a57857991ce Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Feb 2026 21:04:13 +0000 Subject: [PATCH 009/161] chore: Release v5.50.3-dev.3 [skip ci] ## [5.50.3-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.2...v5.50.3-dev.3) (2026-02-20) ### Bug Fixes * **GmsCore support:** Insert check after necessary context hook ([03e8e3d](https://github.com/ReVanced/revanced-patches/commit/03e8e3d75cb3b03987299885cea5eb615a5cef23)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a7ce5218c..15905d456e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.50.3-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.2...v5.50.3-dev.3) (2026-02-20) + + +### Bug Fixes + +* **GmsCore support:** Insert check after necessary context hook ([03e8e3d](https://github.com/ReVanced/revanced-patches/commit/03e8e3d75cb3b03987299885cea5eb615a5cef23)) + ## [5.50.3-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.1...v5.50.3-dev.2) (2026-02-16) diff --git a/gradle.properties b/gradle.properties index f6855a7808..dc132b25f1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.50.3-dev.2 +version = 5.50.3-dev.3 From 3c0c5a86d8e24b47b1c30bc5a7fe994240014e2d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 23 Feb 2026 23:29:29 +0100 Subject: [PATCH 010/161] fix(GmsCore support): Insert check after another missing necessary context hook --- .../googlenews/misc/gms/GmsCoreSupportPatch.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt index 4644ddd141..69481a8033 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt @@ -6,12 +6,22 @@ import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.patches.shared.misc.gms.gmsCoreSupportResourcePatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = MAGAZINES_PACKAGE_NAME, toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME, - mainActivityOnCreateFingerprintToInsertIndex = magazinesActivityOnCreateFingerprint to { 0 }, + mainActivityOnCreateFingerprintToInsertIndex = magazinesActivityOnCreateFingerprint to { + val getApplicationContextIndex = + magazinesActivityOnCreateFingerprint.method.indexOfFirstInstructionOrThrow { + getReference()?.name == "getApplicationContext" + } + + getApplicationContextIndex + 2 // Below the move-result-object instruction. + }, extensionPatch = extensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { From 2f72ae5bf659bded8853eebf25ae14e148d917e4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 23 Feb 2026 22:32:31 +0000 Subject: [PATCH 011/161] chore: Release v5.50.3-dev.4 [skip ci] ## [5.50.3-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.3...v5.50.3-dev.4) (2026-02-23) ### Bug Fixes * **GmsCore support:** Insert check after another missing necessary context hook ([3c0c5a8](https://github.com/ReVanced/revanced-patches/commit/3c0c5a86d8e24b47b1c30bc5a7fe994240014e2d)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15905d456e..e4ce0dd205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.50.3-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.3...v5.50.3-dev.4) (2026-02-23) + + +### Bug Fixes + +* **GmsCore support:** Insert check after another missing necessary context hook ([3c0c5a8](https://github.com/ReVanced/revanced-patches/commit/3c0c5a86d8e24b47b1c30bc5a7fe994240014e2d)) + ## [5.50.3-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.2...v5.50.3-dev.3) (2026-02-20) diff --git a/gradle.properties b/gradle.properties index dc132b25f1..9dcb465ded 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.50.3-dev.3 +version = 5.50.3-dev.4 From 997b5d63d1fc1684bea9e5b265f3aca53ad5fd88 Mon Sep 17 00:00:00 2001 From: obXfuse <260204528+obXfuse@users.noreply.github.com> Date: Thu, 26 Feb 2026 17:10:35 -0500 Subject: [PATCH 012/161] feat(GMX Mail): Add `Force enable Freephone` patch (#6650) Co-authored-by: obXfuse --- patches/api/patches.api | 4 ++++ .../patches/gmxmail/freephone/Fingerprints.kt | 9 +++++++++ .../freephone/ForceEnableFreephonePatch.kt | 15 +++++++++++++++ 3 files changed, 28 insertions(+) create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/Fingerprints.kt create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 5d5c92c7b8..575e428c4b 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -236,6 +236,10 @@ public final class app/revanced/patches/fotmob/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatchKt { + public static final fun getForceEnableFreePhonePatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatchKt { public static final fun getEnableCustomTabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/Fingerprints.kt new file mode 100755 index 0000000000..0702716556 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/Fingerprints.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.gmxmail.freephone + +import app.revanced.patcher.fingerprint + +internal val isEuiccEnabledFingerprint = fingerprint { + custom { method, _ -> + method.name == "isEuiccEnabled" + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatch.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatch.kt new file mode 100755 index 0000000000..c1693df4f7 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatch.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.gmxmail.freephone + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +val forceEnableFreePhonePatch = bytecodePatch( + name = "Force enable FreePhone", + description = "Enables the FreePhone menu in the navigation drawer even on devices that don't support eSIM.", +) { + compatibleWith("de.gmx.mobile.android.mail") + + execute { + isEuiccEnabledFingerprint.method.returnEarly(true) + } +} \ No newline at end of file From 8a84f1a5161e3c9da63851c42886b344453d7c94 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 26 Feb 2026 22:13:53 +0000 Subject: [PATCH 013/161] chore: Release v5.51.0-dev.1 [skip ci] # [5.51.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.4...v5.51.0-dev.1) (2026-02-26) ### Features * **GMX Mail:** Add `Force enable Freephone` patch ([#6650](https://github.com/ReVanced/revanced-patches/issues/6650)) ([997b5d6](https://github.com/ReVanced/revanced-patches/commit/997b5d63d1fc1684bea9e5b265f3aca53ad5fd88)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4ce0dd205..862ec084a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.51.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.4...v5.51.0-dev.1) (2026-02-26) + + +### Features + +* **GMX Mail:** Add `Force enable Freephone` patch ([#6650](https://github.com/ReVanced/revanced-patches/issues/6650)) ([997b5d6](https://github.com/ReVanced/revanced-patches/commit/997b5d63d1fc1684bea9e5b265f3aca53ad5fd88)) + ## [5.50.3-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.3...v5.50.3-dev.4) (2026-02-23) diff --git a/gradle.properties b/gradle.properties index 9dcb465ded..ec749a60fc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.50.3-dev.4 +version = 5.51.0-dev.1 From 2976ea3ddd09d26eeedf646f0a1020fa582d0ec0 Mon Sep 17 00:00:00 2001 From: obXfuse <260204528+obXfuse@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:03:55 -0500 Subject: [PATCH 014/161] feat(GMX Mail): Add `Hide ads` and `Hide Premium upgrade button` patches (#6583) Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Co-authored-by: oSumAtrIX --- patches/api/patches.api | 12 ++++++++++-- .../revanced/patches/gmxmail/ads/Fingerprints.kt | 9 +++++++++ .../revanced/patches/gmxmail/ads/HideAdsPatch.kt | 15 +++++++++++++++ .../patches/gmxmail/layout/Fingerprints.kt | 9 +++++++++ .../gmxmail/layout/HidePremiumUpgradeButton.kt | 15 +++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/Fingerprints.kt create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/HideAdsPatch.kt create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/Fingerprints.kt create mode 100755 patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButton.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 575e428c4b..96f779698e 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -236,10 +236,18 @@ public final class app/revanced/patches/fotmob/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/gmxmail/ads/HideAdsPatchKt { + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatchKt { public static final fun getForceEnableFreePhonePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButtonKt { + public static final fun getHidePremiumUpgradeButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatchKt { public static final fun getEnableCustomTabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -935,8 +943,8 @@ public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { } public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { - public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/Fingerprints.kt new file mode 100755 index 0000000000..797ccc027f --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/Fingerprints.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.gmxmail.ads + +import app.revanced.patcher.fingerprint + +internal val getAdvertisementStatusFingerprint = fingerprint { + custom { method, classDef -> + method.name == "getAdvertisementStatus" && classDef.endsWith("/PayMailManager;") + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/HideAdsPatch.kt new file mode 100755 index 0000000000..6a1917167b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/ads/HideAdsPatch.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.gmxmail.ads + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +val hideAdsPatch = bytecodePatch( + name = "Hide ads", + description = "Hides sponsored ads.", +) { + compatibleWith("de.gmx.mobile.android.mail") + + execute { + getAdvertisementStatusFingerprint.method.returnEarly(2) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/Fingerprints.kt new file mode 100755 index 0000000000..1d39ef242e --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/Fingerprints.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.gmxmail.layout + +import app.revanced.patcher.fingerprint + +internal val isUpsellingPossibleFingerprint = fingerprint { + custom { method, classDef -> + method.name == "isUpsellingPossible" && classDef.endsWith("/PayMailManager;") + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButton.kt b/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButton.kt new file mode 100755 index 0000000000..9505fa755d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButton.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.gmxmail.layout + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +val hidePremiumUpgradeButtonPatch = bytecodePatch( + name = "Hide Premium upgrade button", + description = "Hides the Premium upgrade button in the navigation drawer.", +) { + compatibleWith("de.gmx.mobile.android.mail") + + execute { + isUpsellingPossibleFingerprint.method.returnEarly(false) + } +} From 376f2af8d84f3f24276b110e0a477b88f21b7800 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 26 Feb 2026 23:06:44 +0000 Subject: [PATCH 015/161] chore: Release v5.51.0-dev.2 [skip ci] # [5.51.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.1...v5.51.0-dev.2) (2026-02-26) ### Features * **GMX Mail:** Add `Hide ads` and `Hide Premium upgrade button` patches ([#6583](https://github.com/ReVanced/revanced-patches/issues/6583)) ([2976ea3](https://github.com/ReVanced/revanced-patches/commit/2976ea3ddd09d26eeedf646f0a1020fa582d0ec0)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 862ec084a8..514f4bc274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.51.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.1...v5.51.0-dev.2) (2026-02-26) + + +### Features + +* **GMX Mail:** Add `Hide ads` and `Hide Premium upgrade button` patches ([#6583](https://github.com/ReVanced/revanced-patches/issues/6583)) ([2976ea3](https://github.com/ReVanced/revanced-patches/commit/2976ea3ddd09d26eeedf646f0a1020fa582d0ec0)) + # [5.51.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.50.3-dev.4...v5.51.0-dev.1) (2026-02-26) diff --git a/gradle.properties b/gradle.properties index ec749a60fc..345a486388 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.51.0-dev.1 +version = 5.51.0-dev.2 From ab2ac36e3041cda87b659924ea2b75089f0bdb6e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 02:39:17 +0100 Subject: [PATCH 016/161] build(Needs bump)!: Update to ReVanced Patcher v22 (#6542) Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Co-authored-by: Pun Butrach Co-authored-by: Ushie Co-authored-by: ILoveOpenSourceApplications Co-authored-by: rospino74 <34315725+rospino74@users.noreply.github.com> Co-authored-by: drobotk Co-authored-by: Sayanth <13906889+SayanthD@users.noreply.github.com> Co-authored-by: kitadai31 <90122968+kitadai31@users.noreply.github.com> BREAKING CHANGE: Deprecated APIs have been removed, and various APIs now use the updated ReVanced Patcher v22 APIs. --- .editorconfig | 3 - .github/workflows/build_pull_request.yml | 2 +- .../music/settings/MusicActivityHook.java | 11 +- extensions/shared/build.gradle.kts | 6 + .../extension/shared/ResourceType.java | 57 + .../app/revanced/extension/shared/Utils.java | 131 +- .../extension/shared/checks/Check.java | 3 +- .../fixes/redgifs/BaseFixRedgifsApiPatch.java | 1 - .../shared/patches/CustomBrandingPatch.java | 3 +- .../{components => litho}/CustomFilter.java | 5 +- .../shared/patches/litho/Filter.java | 10 +- .../shared/patches/litho/FilterGroup.java | 2 +- .../shared/patches/litho/FilterGroupList.java | 8 +- .../patches/litho/LithoFilterPatch.java | 228 +++- .../shared/settings/BaseActivityHook.java | 21 +- .../shared/settings/BaseSettings.java | 20 + .../AbstractPreferenceFragment.java | 15 +- .../preference/ColorPickerPreference.java | 9 +- .../CustomDialogListPreference.java | 27 +- .../FeatureFlagsManagerPreference.java | 18 +- .../preference/ToolbarPreferenceFragment.java | 8 +- .../settings/search/BaseSearchResultItem.java | 15 +- .../search/BaseSearchResultsAdapter.java | 14 +- .../search/BaseSearchViewController.java | 41 +- .../settings/search/SearchHistoryManager.java | 61 +- .../spoof/requests/StreamingDataRequest.java | 24 +- extensions/spotify/build.gradle.kts | 23 - .../createbutton/HideCreateButtonPatch.java | 5 +- .../spotify/misc/fix/ClientTokenService.java | 115 -- .../extension/spotify/misc/fix/Constants.java | 26 - .../spotify/misc/fix/RequestListener.java | 94 -- .../spotify/misc/fix/SpoofClientPatch.java | 25 - .../spotify/shared/ComponentFilters.java | 10 +- .../spotify/misc/fix/clienttoken_http.proto | 73 -- .../strava/AddMediaDownloadPatch.java | 3 +- .../app/revanced/extension/twitch/Utils.java | 8 +- .../twitch/settings/TwitchActivityHook.java | 10 +- extensions/youtube/build.gradle.kts | 2 +- .../patches/AlternativeThumbnailsPatch.java | 10 +- .../youtube/patches/ChangeHeaderPatch.java | 5 +- .../youtube/patches/DownloadsPatch.java | 2 +- .../patches/FixContentProviderPatch.java | 24 + .../HidePlayerOverlayButtonsPatch.java | 14 +- .../youtube/patches/HideSeekbarPatch.java | 10 + .../youtube/patches/MiniplayerPatch.java | 16 +- .../patches/NavigationButtonsPatch.java | 16 +- .../OpenShortsInRegularPlayerPatch.java | 9 - .../OpenVideosFullscreenHookPatch.java | 8 +- .../youtube/patches/PlayerControlsPatch.java | 2 +- .../RemoveViewerDiscretionDialogPatch.java | 24 +- .../patches/ReturnYouTubeDislikePatch.java | 6 +- .../youtube/patches/ShortsAutoplayPatch.java | 19 +- .../youtube/patches/VersionCheckPatch.java | 9 +- .../{components => litho}/AdsFilter.java | 4 +- .../AdvancedVideoQualityMenuFilter.java | 2 +- .../{components => litho}/ButtonsFilter.java | 18 +- .../{components => litho}/CommentsFilter.java | 2 +- .../DescriptionComponentsFilter.java | 6 +- .../HideInfoCardsFilter.java | 4 +- .../KeywordContentFilter.java | 2 +- .../LayoutComponentsFilter.java | 68 +- .../PlaybackSpeedMenuFilter.java | 2 +- .../PlayerFlyoutMenuItemsFilter.java | 9 +- .../ReturnYouTubeDislikeFilter.java | 29 +- .../{components => litho}/ShortsFilter.java | 169 ++- .../AdvancedVideoQualityMenuPatch.java | 2 +- .../quality/RememberVideoQualityPatch.java | 1 - .../speed/CustomPlaybackSpeedPatch.java | 2 +- .../ReVancedSettingsIconDynamicDrawable.java | 85 ++ .../patches/theme/SeekbarColorPatch.java | 11 +- .../ReturnYouTubeDislike.java | 6 +- .../extension/youtube/settings/Settings.java | 23 +- .../youtube/settings/YouTubeActivityHook.java | 38 +- .../youtube/shared/NavigationBar.java | 27 +- .../PlayerControlsVisibilityObserver.kt | 5 +- .../extension/youtube/shared/PlayerType.kt | 1 - .../SegmentPlaybackController.java | 59 +- .../sponsorblock/ui/CreateSegmentButton.java | 18 + .../sponsorblock/ui/NewSegmentLayout.java | 7 +- .../sponsorblock/ui/SkipSponsorButton.java | 8 +- .../ui/SponsorBlockViewController.java | 21 +- .../SwipeControlsHostActivity.kt | 5 +- .../controller/SwipeZonesController.kt | 4 +- .../views/SwipeControlsOverlayLayout.kt | 9 +- .../youtube/videoplayer/LoopVideoButton.java | 7 +- .../videoplayer/VideoQualityDialogButton.java | 1 + gradle.properties | 1 + gradle/libs.versions.toml | 24 +- gradle/wrapper/gradle-wrapper.properties | 5 +- patches/api/patches.api | 1131 ++++++++--------- patches/build.gradle.kts | 5 +- .../exportall/ExportAllActivitiesPatch.kt | 2 +- ...{HideAdbPatch.kt => HideAdbStatusPatch.kt} | 34 +- .../all/misc/appicon/HideAppIconPatch.kt | 6 +- .../all/misc/build/BaseSpoofBuildInfoPatch.kt | 4 +- .../all/misc/build/SpoofBuildInfoPatch.kt | 73 +- .../location/hide/HideMockLocationPatch.kt | 4 +- .../sim/spoof/SpoofSimCountryPatch.kt | 9 - .../sim/spoof/SpoofSimProviderPatch.kt | 42 +- .../connectivity/wifi/spoof/SpoofWifiPatch.kt | 2 +- .../CustomCertificatesPatch.kt | 67 +- .../debugging/EnableAndroidDebuggingPatch.kt | 3 +- .../ChangeDataDirectoryLocationPatch.kt | 19 - ...xportInternalDataDocumentsProviderPatch.kt | 4 +- .../revanced/patches/all/misc/hex/HexPatch.kt | 17 +- .../gestures/PredictiveBackGesturePatch.kt | 2 +- .../OverrideCertificatePinningPatch.kt | 17 +- .../packagename/ChangePackageNamePatch.kt | 32 +- .../playintegrity/DisablePlayIntegrity.kt | 15 +- .../all/misc/resources/AddResourcesPatch.kt | 16 +- .../RemoveScreenCaptureRestrictionPatch.kt | 2 +- .../PreventScreenshotDetectionPatch.kt | 38 +- .../RemoveScreenshotRestrictionPatch.kt | 2 +- .../sharetargets/RemoveShareTargetsPatch.kt | 7 +- .../misc/spoof/EnableRomSignatureSpoofing.kt | 33 +- .../misc/targetSdk/SetTargetSdkVersion34.kt | 10 +- .../all/misc/transformation/MethodCall.kt | 4 +- .../TransformInstructionsPatch.kt | 47 +- .../versioncode/ChangeVersionCodePatch.kt | 9 +- .../patches/amazon/DeepLinkingPatch.kt | 14 +- .../revanced/patches/amazon/Fingerprints.kt | 16 +- .../patches/angulus/ads/Fingerprints.kt | 12 +- .../patches/angulus/ads/RemoveAdsPatch.kt | 10 +- .../backdrops/misc/pro/Fingerprints.kt | 19 - .../backdrops/misc/pro/ProUnlockPatch.kt | 24 - .../bandcamp/limitations/Fingerprints.kt | 10 +- .../limitations/RemovePlayLimitsPatch.kt | 4 +- .../root/BypassRootChecksPatch.kt | 6 +- .../cieid/restrictions/root/Fingerprints.kt | 12 +- .../com/sbs/ondemand/tv/Fingerprints.kt | 37 +- .../com/sbs/ondemand/tv/RemoveAdsPatch.kt | 18 +- .../patches/cricbuzz/ads/DisableAdsPatch.kt | 23 +- .../patches/cricbuzz/ads/Fingerprints.kt | 25 +- .../patches/cricbuzz/misc/extension/Hooks.kt | 8 +- .../patches/crunchyroll/ads/Fingerprints.kt | 9 +- .../patches/crunchyroll/ads/HideAdsPatch.kt | 31 +- .../patches/disneyplus/Fingerprints.kt | 28 +- .../patches/disneyplus/SkipAdsPatch.kt | 14 +- .../patches/duolingo/ad/DisableAdsPatch.kt | 20 +- .../patches/duolingo/ad/Fingerprints.kt | 18 +- .../duolingo/debug/EnableDebugMenuPatch.kt | 27 +- .../patches/duolingo/debug/Fingerprints.kt | 31 +- .../patches/duolingo/energy/Fingerprints.kt | 26 +- .../energy/SkipEnergyRechargeAdsPatch.kt | 25 +- .../facebook/ads/mainfeed/Fingerprints.kt | 26 +- .../ads/mainfeed/HideSponsoredStoriesPatch.kt | 23 +- .../facebook/ads/story/Fingerprints.kt | 28 +- .../facebook/ads/story/HideStoryAdsPatch.kt | 12 +- .../bootloader/BootloaderDetectionPatch.kt | 16 +- .../detection/bootloader/Fingerprints.kt | 27 +- .../detection/root/Fingerprints.kt | 11 +- .../detection/root/RootDetectionPatch.kt | 14 +- .../patches/fotmob/ads/Fingerprints.kt | 15 +- .../patches/fotmob/ads/HideAdsPatch.kt | 6 +- .../customtabs/EnableCustomTabsPatch.kt | 10 +- .../googlenews/customtabs/Fingerprints.kt | 10 +- .../extension/hooks/StartActivityInitHook.kt | 20 +- .../googlenews/misc/gms/Fingerprints.kt | 12 +- .../misc/gms/GmsCoreSupportPatch.kt | 10 +- .../EnableDCIMFoldersBackupControlPatch.kt | 6 +- .../googlephotos/misc/backup/Fingerprints.kt | 9 +- .../googlephotos/misc/extension/Hooks.kt | 20 +- .../misc/features/Fingerprints.kt | 7 +- .../misc/features/SpoofFeaturesPatch.kt | 14 +- .../googlephotos/misc/gms/Fingerprints.kt | 12 +- .../misc/gms/GmsCoreSupportPatch.kt | 10 +- .../misc/preferences/Fingerprints.kt | 8 - ...oreHiddenBackUpWhileChargingTogglePatch.kt | 30 - .../restrictions/Fingerprints.kt | 14 +- .../restrictions/RemoveDeviceRestrictions.kt | 12 +- .../patches/hexeditor/ad/DisableAdsPatch.kt | 16 +- .../patches/hexeditor/ad/Fingerprints.kt | 12 +- .../iconpackstudio/misc/pro/Fingerprints.kt | 13 +- .../iconpackstudio/misc/pro/UnlockProPatch.kt | 16 +- .../detection/deviceintegrity/Fingerprints.kt | 23 +- .../RemoveDeviceIntegrityChecksPatch.kt | 27 +- .../detection/root/RootDetectionPatch.kt | 10 - .../detection/signature/Fingerprints.kt | 14 +- .../signature/SpoofSignaturePatch.kt | 4 +- .../patches/inshorts/ad/Fingerprints.kt | 11 +- .../patches/inshorts/ad/InshortsAdsPatch.kt | 15 +- .../patches/instagram/ads/HideAdsPatch.kt | 10 +- .../patches/instagram/feed/Fingerprints.kt | 22 +- .../feed/LimitFeedToFollowedProfiles.kt | 31 +- .../ghost/story/AnonymousStoryViewingPatch.kt | 6 +- .../instagram/ghost/story/Fingerprints.kt | 12 +- .../instagram/hide/explore/Fingerprints.kt | 15 +- .../instagram/hide/explore/HideExploreFeed.kt | 13 +- .../hide/highlightsTray/Fingerprints.kt | 9 +- .../highlightsTray/HideHighlightsTrayPatch.kt | 15 +- .../instagram/hide/navigation/Fingerprints.kt | 26 +- .../hide/navigation/HideNavigationButtons.kt | 82 +- .../instagram/hide/stories/Fingerprints.kt | 27 +- .../instagram/hide/stories/HideStories.kt | 20 +- .../hide/suggestions/Fingerprints.kt | 10 +- .../hide/suggestions/HideSuggestedContent.kt | 19 - .../suggestions/HideSuggestedContentPatch.kt | 25 + .../misc/devmenu/EnableDeveloperMenuPatch.kt | 24 +- .../instagram/misc/devmenu/Fingerprints.kt | 14 +- .../disableAnalytics/DisableAnalyticsPatch.kt | 21 +- .../misc/disableAnalytics/Fingerprints.kt | 17 +- .../extension/hooks/ApplicationInitHook.kt | 10 +- .../instagram/misc/links/Fingerprint.kt | 13 +- .../misc/links/OpenLinksExternallyPatch.kt | 15 +- .../removeBuildExpiredPopup/Fingerprints.kt | 15 +- .../RemoveBuildExpiredPopupPatch.kt | 11 +- .../misc/share/EditShareLinksPatch.kt | 24 +- .../instagram/misc/share/Fingerprints.kt | 34 + .../share/UrlResponseJsonParserFingerprint.kt | 32 - .../domain/ChangeLinkSharingDomainPatch.kt | 24 +- .../misc/share/domain/Fingerprint.kt | 17 +- .../privacy/SanitizeSharingLinksPatch.kt | 12 +- .../instagram/misc/signature/Fingerprints.kt | 27 +- .../misc/signature/SignatureCheckPatch.kt | 14 +- .../reels/DisableReelsScrollingPatch.kt | 19 +- .../patches/instagram/reels/Fingerprints.kt | 17 +- .../patches/instagram/shared/Utils.kt | 25 - .../flipping/DisableStoryAutoFlippingPatch.kt | 6 +- .../instagram/story/flipping/Fingerprints.kt | 17 +- .../patches/irplus/ad/Fingerprints.kt | 11 +- .../patches/irplus/ad/RemoveAdsPatch.kt | 10 +- .../patches/kleinanzeigen/ads/Fingerprints.kt | 12 +- .../patches/kleinanzeigen/ads/HideAdsPatch.kt | 4 +- .../kleinanzeigen/hide_pur/Fingerprints.kt | 9 +- .../kleinanzeigen/hide_pur/HidePurPatch.kt | 4 +- .../patches/letterboxd/ads/Fingerprints.kt | 35 +- .../patches/letterboxd/ads/HideAdsPatch.kt | 15 +- .../unlock/unlockAppIcons/Fingerprints.kt | 12 +- .../unlockAppIcons/UnlockAppIconsPatch.kt | 9 +- .../DisableVersionCheckPatch.kt | 23 - .../misc/bypassVersionCheck/Fingerprints.kt | 18 - .../misc/login/DisableMandatoryLoginPatch.kt | 17 +- .../lightroom/misc/login/Fingerprints.kt | 12 +- .../lightroom/misc/premium/Fingerprints.kt | 13 +- .../misc/premium/UnlockPremiumPatch.kt | 10 +- .../misc/version/DisableVersionCheckPatch.kt | 20 + .../lightroom/misc/version/Fingerprints.kt | 20 + .../detection/license/Fingerprints.kt | 11 +- .../license/LicenseValidationPatch.kt | 12 +- .../detection/signature/Fingerprints.kt | 11 +- .../signature/SignatureVerificationPatch.kt | 12 +- .../memegenerator/misc/pro/Fingerprints.kt | 12 +- .../misc/pro/UnlockProVersionPatch.kt | 10 +- .../patches/messenger/inbox/Fingerprints.kt | 36 +- .../messenger/inbox/HideInboxAdsPatch.kt | 6 +- .../messenger/inbox/HideInboxSubtabsPatch.kt | 6 +- .../DisableSwitchingEmojiToStickerPatch.kt | 28 - .../inputfield/DisableTypingIndicatorPatch.kt | 16 - .../messenger/inputfield/Fingerprints.kt | 31 - .../patches/messenger/layout/Fingerprints.kt | 15 +- .../layout/HideFacebookButtonPatch.kt | 6 +- .../patches/messenger/metaai/Fingerprints.kt | 26 +- .../messenger/metaai/RemoveMetaAIPatch.kt | 34 +- .../patches/messenger/misc/extension/Hooks.kt | 10 +- .../messenger/navbar/RemoveMetaAITabPatch.kt | 12 - .../revanced/patches/meta/ads/Fingerprints.kt | 29 +- .../revanced/patches/meta/ads/HideAdsPatch.kt | 12 - .../officelens/misc/onedrive/Fingerprints.kt | 14 +- .../onedrive/HideOneDriveMigrationPatch.kt | 6 +- .../mifitness/misc/locale/Fingerprints.kt | 11 +- .../misc/locale/ForceEnglishLocalePatch.kt | 14 +- .../mifitness/misc/login/Fingerprints.kt | 14 +- .../mifitness/misc/login/FixLoginPatch.kt | 7 +- .../patches/music/ad/video/Fingerprints.kt | 9 +- .../patches/music/ad/video/HideVideoAds.kt | 16 +- .../EnableExclusiveAudioPlayback.kt | 8 +- .../audio/exclusiveaudio/Fingerprints.kt | 19 +- .../permanentrepeat/Fingerprints.kt | 14 +- .../permanentrepeat/PermanentRepeatPatch.kt | 20 +- .../permanentshuffle/Fingerprints.kt | 19 - .../permanentshuffle/PermanentShufflePatch.kt | 22 - .../layout/branding/CustomBrandingPatch.kt | 27 +- .../music/layout/branding/Fingerprints.kt | 16 +- .../music/layout/buttons/Fingerprints.kt | 59 +- .../music/layout/buttons/HideButtons.kt | 68 +- .../music/layout/castbutton/HideCastButton.kt | 10 - .../layout/compactheader/Fingerprints.kt | 11 +- .../layout/compactheader/HideCategoryBar.kt | 31 +- .../hide/general/HideLayoutComponentsPatch.kt | 6 +- .../miniplayercolor/ChangeMiniplayerColor.kt | 68 +- .../layout/miniplayercolor/Fingerprints.kt | 26 +- .../layout/navigationbar/Fingerprints.kt | 27 +- .../navigationbar/NavigationBarPatch.kt | 38 +- .../music/layout/premium/Fingerprints.kt | 17 +- .../layout/premium/HideGetPremiumPatch.kt | 50 +- .../upgradebutton/HideUpgradeButtonPatch.kt | 16 - .../BypassCertificateChecksPatch.kt | 15 - .../music/misc/androidauto/Fingerprints.kt | 36 +- .../UnlockAndroidAutoMediaBrowserPatch.kt | 24 +- .../BackgroundPlaybackPatch.kt | 20 +- .../misc/backgroundplayback/Fingerprints.kt | 17 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 4 +- .../misc/extension/SharedExtensionPatch.kt | 3 +- .../extension/hooks/ApplicationInitHook.kt | 22 +- .../misc/fileprovider/FileProviderPatch.kt | 7 +- .../music/misc/fileprovider/Fingerprints.kt | 17 +- .../patches/music/misc/gms/Fingerprints.kt | 14 +- .../music/misc/gms/GmsCoreSupportPatch.kt | 15 +- .../misc/litho/filter/LithoFilterPatch.kt | 16 +- .../music/misc/settings/Fingerprints.kt | 18 +- .../music/misc/settings/SettingsPatch.kt | 28 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 10 +- .../misc/tracks/ForceOriginalAudioPatch.kt | 4 +- .../music/playservice/VersionCheckPatch.kt | 6 +- .../patches/music/shared/Fingerprints.kt | 49 +- .../myexpenses/misc/pro/Fingerprints.kt | 9 +- .../myexpenses/misc/pro/UnlockProPatch.kt | 16 +- .../patches/myfitnesspal/ads/Fingerprints.kt | 23 +- .../patches/myfitnesspal/ads/HideAdsPatch.kt | 8 +- .../RemoveBroadcastsRestrictionPatch.kt | 2 +- .../nfctoolsse/misc/pro/Fingerprints.kt | 11 - .../nfctoolsse/misc/pro/UnlockProPatch.kt | 20 - .../misc/extension/SharedExtensionPatch.kt | 11 +- .../nothingx/misc/logk1token/Fingerprints.kt | 19 +- .../misc/logk1token/ShowK1TokenPatchs.kt | 12 +- .../revanced/patches/nunl/ads/Fingerprints.kt | 47 +- .../revanced/patches/nunl/ads/HideAdsPatch.kt | 34 +- .../app/revanced/patches/nunl/ads/Hooks.kt | 10 +- .../patches/nunl/firebase/Fingerprints.kt | 20 +- .../nunl/firebase/SpoofCertificatePatch.kt | 6 +- .../patches/nyx/misc/pro/Fingerprints.kt | 9 - .../patches/nyx/misc/pro/UnlockProPatch.kt | 20 - .../misc/fix/crash/Fingerprints.kt | 19 +- .../misc/fix/crash/FixCrashPatch.kt | 13 +- .../orfon/detection/root/Fingerprints.kt | 17 +- .../root/RemoveRootDetectionPatch.kt | 12 +- .../pandora/ads/DisableAudioAdsPatch.kt | 10 +- .../patches/pandora/ads/Fingerprints.kt | 21 +- .../pandora/misc/EnableUnlimitedSkipsPatch.kt | 8 +- .../patches/pandora/misc/Fingerprints.kt | 14 +- .../patches/peacocktv/ads/Fingerprints.kt | 10 +- .../patches/peacocktv/ads/HideAdsPatch.kt | 4 +- .../detection/deviceid/Fingerprints.kt | 16 +- .../detection/deviceid/SpoofDeviceIdPatch.kt | 6 +- .../detection/signature/Fingerprints.kt | 9 +- .../signature/SignatureDetectionPatch.kt | 14 +- .../photomath/misc/annoyances/Fingerprints.kt | 13 +- .../misc/annoyances/HideUpdatePopupPatch.kt | 6 +- .../unlock/bookpoint/EnableBookpointPatch.kt | 12 +- .../misc/unlock/bookpoint/Fingerprints.kt | 25 +- .../misc/unlock/plus/Fingerprints.kt | 17 +- .../misc/unlock/plus/UnlockPlusPatch.kt | 16 +- .../patches/piccomafr/misc/Fingerprints.kt | 18 +- .../misc/SpoofAndroidDeviceIdPatch.kt | 10 +- .../tracking/DisableTrackingPatch.kt | 50 +- .../piccomafr/tracking/Fingerprints.kt | 20 +- .../patches/pixiv/ads/Fingerprints.kt | 16 +- .../patches/pixiv/ads/HideAdsPatch.kt | 8 +- .../patches/primevideo/ads/Fingerprints.kt | 30 +- .../patches/primevideo/ads/SkipAdsPatch.kt | 23 +- .../primevideo/misc/extension/Hooks.kt | 10 +- .../permissions/RenamePermissionsPatch.kt | 10 +- .../primevideo/video/speed/Fingerprints.kt | 27 +- .../video/speed/PlaybackSpeedPatch.kt | 29 +- .../account/RemoveFreeAccountsLimitPatch.kt | 2 +- .../signature/RemoveSentFromSignaturePatch.kt | 4 +- .../patches/protonvpn/delay/Fingerprints.kt | 19 +- .../protonvpn/delay/RemoveDelayPatch.kt | 8 +- .../protonvpn/splittunneling/Fingerprints.kt | 17 +- .../splittunneling/UnlockSplitTunneling.kt | 36 +- .../purchasereminder/Fingerprints.kt | 16 +- .../HidePurchaseReminderPatch.kt | 7 +- .../reddit/ad/banner/HideBannerPatch.kt | 34 - .../reddit/ad/comments/Fingerprints.kt | 13 +- .../reddit/ad/comments/HideCommentAdsPatch.kt | 8 +- .../patches/reddit/ad/general/Fingerprints.kt | 23 +- .../patches/reddit/ad/general/HideAdsPatch.kt | 60 +- .../customclients/FixRedgifsApiPatch.kt | 4 +- .../reddit/customclients/FixSLinksPatch.kt | 4 +- .../reddit/customclients/SpoofClientPatch.kt | 10 +- .../baconreader/api/Fingerprints.kt | 24 +- .../baconreader/api/SpoofClientPatch.kt | 30 +- .../baconreader/fix/redgifs/Fingerprints.kt | 20 +- .../fix/redgifs/FixRedgifsApiPatch.kt | 49 +- .../misc/extension/hooks/InitHook.kt | 8 +- .../boostforreddit/ads/DisableAdsPatch.kt | 13 +- .../boostforreddit/ads/Fingerprints.kt | 15 +- .../boostforreddit/api/Fingerprints.kt | 22 +- .../boostforreddit/api/SpoofClientPatch.kt | 24 +- .../fix/downloads/Fingerprints.kt | 12 +- .../FixAudioMissingInDownloadsPatch.kt | 30 - .../FixAudioMissingInVideoDownloadsPatch.kt | 28 + .../fix/redgifs/Fingerprints.kt | 10 +- .../fix/redgifs/FixRedgifsApiPatch.kt | 25 +- .../boostforreddit/fix/slink/Fingerprints.kt | 29 +- .../fix/slink/FixSLinksPatch.kt | 39 +- .../misc/extension/hooks/InitHook.kt | 12 +- .../infinityforreddit/api/Fingerprints.kt | 7 +- .../infinityforreddit/api/SpoofClientPatch.kt | 11 +- .../subscription/Fingerprints.kt | 18 +- .../subscription/UnlockSubscriptionPatch.kt | 10 +- .../joeyforreddit/ads/DisableAdsPatch.kt | 16 +- .../joeyforreddit/ads/Fingerprints.kt | 12 +- .../joeyforreddit/api/Fingerprints.kt | 30 +- .../joeyforreddit/api/SpoofClientPatch.kt | 8 +- .../piracy/DisablePiracyDetectionPatch.kt | 8 +- .../detection/piracy/Fingerprints.kt | 23 +- .../redditisfun/api/Fingerprints.kt | 30 +- .../redditisfun/api/SpoofClientPatch.kt | 26 +- .../relayforreddit/api/Fingerprints.kt | 33 +- .../relayforreddit/api/SpoofClientPatch.kt | 44 +- .../customclients/slide/api/Fingerprints.kt | 14 +- .../slide/api/SpoofClientPatch.kt | 4 +- .../customclients/sync/ads/DisableAdsPatch.kt | 4 +- .../customclients/sync/ads/Fingerprints.kt | 10 +- .../piracy/DisablePiracyDetectionPatch.kt | 8 +- .../sync/detection/piracy/Fingerprints.kt | 28 +- .../DisableSyncForLemmyBottomSheetPatch.kt | 11 +- .../annoyances/startup/Fingerprints.kt | 12 +- .../sync/syncforreddit/api/Fingerprints.kt | 27 +- .../syncforreddit/api/SpoofClientPatch.kt | 42 +- .../syncforreddit/extension/hooks/InitHook.kt | 12 +- .../syncforreddit/fix/redgifs/Fingerprints.kt | 42 +- .../fix/redgifs/FixRedgifsApiPatch.kt | 49 +- .../syncforreddit/fix/slink/Fingerprints.kt | 20 +- .../syncforreddit/fix/slink/FixSLinksPatch.kt | 38 +- .../fix/thumbnail/Fingerprints.kt | 14 +- .../fix/thumbnail/FixPostThumbnailsPatch.kt | 10 +- .../syncforreddit/fix/user/Fingerprints.kt | 26 +- .../fix/user/UseUserEndpointPatch.kt | 28 +- .../syncforreddit/fix/video/Fingerprints.kt | 10 +- .../fix/video/FixVideoDownloadsPatch.kt | 16 +- .../fix/video/FixVideoDownloadsPatch.kt | 18 - .../DisableScreenshotPopupPatch.kt | 6 +- .../disablescreenshotpopup/Fingerprints.kt | 22 +- .../reddit/layout/premiumicon/Fingerprints.kt | 15 +- .../premiumicon/UnlockPremiumIconPatch.kt | 18 +- .../reddit/misc/tracking/url/Fingerprints.kt | 15 +- .../tracking/url/SanitizeUrlQueryPatch.kt | 17 +- .../fix/crash/AddManifestPermissionsPatch.kt | 3 +- .../radio/misc/fix/crash/Fingerprints.kt | 23 +- .../radio/misc/fix/crash/FixCrashPatch.kt | 22 +- .../device/BypassDeviceChecksPatch.kt | 62 +- .../radio/restrictions/device/Fingerprints.kt | 81 +- .../detection/root/Fingerprints.kt | 16 +- .../detection/root/RootDetectionPatch.kt | 14 +- .../revanced/patches/shared/Fingerprints.kt | 16 +- .../patches/shared/SharedPatchNames.kt | 16 - .../layout/branding/AddBrandLicensePatch.kt | 2 +- .../branding/BaseCustomBrandingPatch.kt | 152 +-- .../shared/layout/branding/Fingerprints.kt | 25 +- .../hide/general/HideLayoutComponentsPatch.kt | 13 +- .../shared/layout/theme/BaseThemePatch.kt | 23 +- .../shared/layout/theme/Fingerprints.kt | 48 +- .../layout/theme/LithoColorHookPatch.kt | 10 +- .../patches/shared/misc/audio/Fingerprints.kt | 27 +- .../misc/audio/ForceOriginalAudioPatch.kt | 180 +-- .../misc/checks/BaseCheckEnvironmentPatch.kt | 28 +- .../shared/misc/checks/Fingerprints.kt | 15 +- .../misc/debugging/EnableDebuggingPatch.kt | 76 +- .../shared/misc/debugging/Fingerprints.kt | 45 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 10 +- .../shared/misc/extension/Fingerprints.kt | 15 +- .../misc/extension/SharedExtensionPatch.kt | 124 +- .../misc/fix/verticalscroll/Fingerprints.kt | 17 +- .../fix/verticalscroll/VerticalScrollPatch.kt | 24 +- .../patches/shared/misc/gms/Fingerprints.kt | 52 +- .../shared/misc/gms/GmsCoreSupportPatch.kt | 126 +- .../shared/misc/hex/HexPatchBuilder.kt | 53 +- .../shared/misc/litho/filter/Fingerprints.kt | 76 +- .../misc/litho/filter/LithoFilterPatch.kt | 113 +- .../misc/mapping/ResourceMappingPatch.kt | 122 +- .../license/DisableLicenseCheckPatch.kt | 16 +- .../misc/pairip/license/Fingerprints.kt | 21 +- .../misc/privacy/DisableSentryTelemetry.kt | 12 +- .../shared/misc/privacy/Fingerprints.kt | 60 +- .../misc/privacy/SanitizeSharingLinksPatch.kt | 71 +- .../shared/misc/settings/Fingerprints.kt | 31 +- .../shared/misc/settings/SettingsPatch.kt | 79 +- .../settings/preference/BasePreference.kt | 9 +- .../preference/BasePreferenceScreen.kt | 21 +- .../settings/preference/IntentPreference.kt | 3 +- .../settings/preference/ListPreference.kt | 7 +- .../preference/NonInteractivePreference.kt | 3 +- .../settings/preference/PreferenceCategory.kt | 3 +- .../preference/PreferenceScreenPreference.kt | 3 +- .../settings/preference/SwitchPreference.kt | 3 +- .../settings/preference/TextPreference.kt | 3 +- .../patches/shared/misc/spoof/Fingerprints.kt | 160 ++- .../misc/spoof/SpoofVideoStreamsPatch.kt | 153 ++- .../misc/spoof/UserAgentClientSpoofPatch.kt | 4 +- .../shared/misc/string/ReplaceStringPatch.kt | 2 +- .../functionality/filesize/Fingerprints.kt | 13 +- .../filesize/RemoveFileSizeLimitPatch.kt | 14 +- .../patches/songpal/badge/BadgeTabPatch.kt | 10 +- .../patches/songpal/badge/Fingerprints.kt | 53 +- .../badge/RemoveNotificationBadgePatch.kt | 6 +- .../patches/soundcloud/ad/Fingerprints.kt | 17 +- .../patches/soundcloud/ad/HideAdsPatch.kt | 22 +- .../analytics/DisableTelemetryPatch.kt | 6 +- .../soundcloud/analytics/Fingerprints.kt | 18 +- .../offlinesync/EnableOfflineSyncPatch.kt | 21 +- .../soundcloud/offlinesync/Fingerprints.kt | 20 +- .../patches/soundcloud/shared/Fingerprints.kt | 11 +- .../layout/hide/createbutton/Fingerprints.kt | 31 - .../createbutton/HideCreateButtonPatch.kt | 110 -- .../spotify/layout/theme/CustomThemePatch.kt | 72 +- .../spotify/layout/theme/Fingerprints.kt | 41 +- .../spotify/lite/ondemand/OnDemandPatch.kt | 9 - .../misc/check/CheckEnvironmentPatch.kt | 4 +- .../spotify/misc/extension/ExtensionPatch.kt | 2 +- .../spotify/misc/extension/Fingerprints.kt | 10 +- .../patches/spotify/misc/extension/Hooks.kt | 34 +- .../patches/spotify/misc/fix/Fingerprints.kt | 52 - .../spotify/misc/fix/SpoofClientPatch.kt | 125 -- .../spotify/misc/fix/SpoofPackageInfoPatch.kt | 11 - .../spotify/misc/fix/SpoofSignaturePatch.kt | 11 - .../spotify/misc/fix/login/Fingerprints.kt | 21 +- .../misc/fix/login/FixFacebookLoginPatch.kt | 13 +- .../misc/lyrics/ChangeLyricsProviderPatch.kt | 44 +- .../spotify/misc/lyrics/Fingerprints.kt | 21 +- .../spotify/misc/privacy/Fingerprints.kt | 53 +- .../misc/privacy/SanitizeSharingLinksPatch.kt | 42 +- .../spotify/misc/widgets/Fingerprints.kt | 7 +- .../widgets/FixThirdPartyLaunchersWidgets.kt | 6 +- .../spotify/navbar/PremiumNavbarTabPatch.kt | 9 - .../patches/spotify/shared/Fingerprints.kt | 19 +- .../stocard/layout/HideOffersTabPatch.kt | 6 +- .../stocard/layout/HideStoryBubblesPatch.kt | 6 +- .../distractions/HideDistractionsPatch.kt | 93 +- ...veGroupKudosButtonToGroupActivityPatch.kt} | 41 +- .../patches/strava/groupkudos/Fingerprints.kt | 20 +- .../media/download/AddMediaDownloadPatch.kt | 51 +- .../strava/media/download/Fingerprints.kt | 20 +- .../strava/media/upload/Fingerprints.kt | 30 +- .../OverwriteMediaUploadParametersPatch.kt | 20 +- .../patches/strava/misc/extension/Hooks.kt | 7 +- .../password/EnablePasswordLoginPatch.kt | 9 +- .../patches/strava/password/Fingerprints.kt | 19 +- .../privacy/BlockSnowplowTrackingPatch.kt | 6 +- .../patches/strava/privacy/Fingerprints.kt | 7 +- .../strava/quickedit/DisableQuickEditPatch.kt | 4 +- .../patches/strava/quickedit/Fingerprints.kt | 13 +- .../strava/subscription/Fingerprints.kt | 12 +- .../subscription/UnlockSubscriptionPatch.kt | 6 +- .../DisableSubscriptionSuggestionsPatch.kt | 22 - .../patches/strava/upselling/Fingerprints.kt | 11 - .../swissid/integritycheck/Fingerprints.kt | 12 +- .../RemoveGooglePlayIntegrityCheckPatch.kt | 6 +- .../revanced/patches/threads/HideAdsPatch.kt | 10 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 19 +- .../misc/themeunlock/UnlockThemePatch.kt | 12 +- .../tiktok/feedfilter/FeedFilterPatch.kt | 17 +- .../patches/tiktok/feedfilter/Fingerprints.kt | 16 +- .../interaction/cleardisplay/Fingerprints.kt | 14 +- .../cleardisplay/RememberClearDisplayPatch.kt | 26 +- .../interaction/downloads/DownloadsPatch.kt | 20 +- .../interaction/downloads/Fingerprints.kt | 60 +- .../interaction/seekbar/Fingerprints.kt | 15 +- .../interaction/seekbar/ShowSeekbarPatch.kt | 15 +- .../tiktok/interaction/speed/Fingerprints.kt | 17 +- .../interaction/speed/PlaybackSpeedPatch.kt | 87 +- .../patches/tiktok/misc/extension/Hooks.kt | 34 +- .../DisableLoginRequirementPatch.kt | 22 +- .../login/disablerequirement/Fingerprints.kt | 19 +- .../misc/login/fixgoogle/Fingerprints.kt | 25 +- .../login/fixgoogle/FixGoogleLoginPatch.kt | 18 +- .../tiktok/misc/settings/Fingerprints.kt | 40 +- .../tiktok/misc/settings/SettingsPatch.kt | 37 +- .../patches/tiktok/misc/share/Fingerprints.kt | 22 +- .../misc/share/SanitizeShareUrlsPatch.kt | 23 +- .../tiktok/misc/spoof/sim/SpoofSimPatch.kt | 46 +- .../patches/tiktok/shared/Fingerprints.kt | 20 +- .../revanced/patches/trakt/Fingerprints.kt | 29 +- .../revanced/patches/trakt/UnlockProPatch.kt | 18 +- .../tudortmund/lockscreen/Fingerprints.kt | 17 +- .../lockscreen/ShowOnLockscreenPatch.kt | 12 +- .../patches/tumblr/ads/DisableDashboardAds.kt | 2 +- .../adfree/DisableAdFreeBannerPatch.kt | 2 +- .../inappupdate/DisableInAppUpdatePatch.kt | 2 +- .../DisableBlogNotificationReminderPatch.kt | 6 +- .../annoyances/notifications/Fingerprints.kt | 10 +- .../popups/DisableGiftMessagePopupPatch.kt | 6 +- .../tumblr/annoyances/popups/Fingerprints.kt | 12 +- .../annoyances/tv/DisableTumblrTvPatch.kt | 4 +- .../tumblr/featureflags/Fingerprints.kt | 18 +- .../featureflags/OverrideFeatureFlagsPatch.kt | 152 +-- .../patches/tumblr/fixes/Fingerprints.kt | 24 +- .../tumblr/fixes/FixOldVersionsPatch.kt | 10 +- .../FilterTimelineObjectsPatch.kt | 24 +- .../tumblr/timelinefilter/Fingerprints.kt | 29 +- .../patches/twitch/ad/audio/AudioAdsPatch.kt | 15 +- .../patches/twitch/ad/audio/Fingerprints.kt | 12 +- .../twitch/ad/embedded/EmbeddedAdsPatch.kt | 15 +- .../twitch/ad/embedded/Fingerprints.kt | 12 +- .../patches/twitch/ad/shared/util/AdPatch.kt | 19 +- .../patches/twitch/ad/video/Fingerprints.kt | 37 +- .../patches/twitch/ad/video/VideoAdsPatch.kt | 22 +- .../twitch/chat/antidelete/Fingerprints.kt | 27 +- .../antidelete/ShowDeletedMessagesPatch.kt | 19 +- .../autoclaim/AutoClaimChannelPointsPatch.kt | 13 +- .../twitch/chat/autoclaim/Fingerprints.kt | 13 +- .../patches/twitch/debug/DebugModePatch.kt | 15 +- .../patches/twitch/debug/Fingerprints.kt | 26 +- .../patches/twitch/misc/extension/Hooks.kt | 8 +- .../twitch/misc/settings/Fingerprints.kt | 38 +- .../twitch/misc/settings/SettingsPatch.kt | 67 +- .../interaction/downloads/Fingerprints.kt | 16 +- .../downloads/UnlockDownloadsPatch.kt | 48 +- .../twitter/layout/viewcount/Fingerprints.kt | 10 +- .../layout/viewcount/HideViewCountPatch.kt | 12 +- .../misc/dynamiccolor/DynamicColorPatch.kt | 9 +- .../extension/hooks/ApplicationInitHook.kt | 12 +- .../patches/twitter/misc/hook/HookPatch.kt | 8 +- .../twitter/misc/hook/json/Fingerprints.kt | 35 +- .../twitter/misc/hook/json/JsonHookPatch.kt | 90 +- .../links/ChangeLinkSharingDomainPatch.kt | 35 +- .../twitter/misc/links/Fingerprints.kt | 38 +- .../links/OpenLinksWithAppChooserPatch.kt | 31 - .../misc/links/SanitizeSharingLinksPatch.kt | 14 +- .../patches/viber/ads/Fingerprints.kt | 13 +- .../patches/viber/ads/HideAdsPatch.kt | 39 +- .../patches/viber/misc/navbar/Fingerprints.kt | 22 +- .../misc/navbar/HideNavigationButtons.kt | 36 +- .../patches/vsco/misc/pro/Fingerprints.kt | 11 - .../patches/vsco/misc/pro/UnlockProPatch.kt | 17 - .../misc/firebasegetcert/Fingerprints.kt | 30 +- .../firebasegetcert/FirebaseGetCertPatch.kt | 6 +- .../warnwetter/misc/promocode/Fingerprints.kt | 12 +- .../misc/promocode/PromoCodeUnlockPatch.kt | 12 +- .../patches/willhaben/ads/Fingerprints.kt | 31 +- .../patches/willhaben/ads/HideAdsPatch.kt | 8 +- .../windyapp/misc/unlockpro/Fingerprints.kt | 10 - .../windyapp/misc/unlockpro/UnlockProPatch.kt | 22 - .../youtube/ad/general/Fingerprints.kt | 23 +- .../youtube/ad/general/HideAdsPatch.kt | 87 +- .../youtube/ad/getpremium/Fingerprints.kt | 15 +- .../ad/getpremium/HideGetPremiumPatch.kt | 24 +- .../patches/youtube/ad/video/Fingerprints.kt | 14 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 21 +- .../copyvideourl/CopyVideoUrlPatch.kt | 16 +- .../interaction/dialog/Fingerprints.kt | 27 +- .../RemoveViewerDiscretionDialogPatch.kt | 38 +- .../DisableChapterSkipDoubleTapPatch.kt | 50 +- .../interaction/doubletap/Fingerprints.kt | 23 +- .../interaction/downloads/DownloadsPatch.kt | 27 +- .../interaction/downloads/Fingerprints.kt | 13 +- .../DisablePreciseSeekingGesturePatch.kt | 17 +- .../seekbar/EnableSeekbarTappingPatch.kt | 68 +- .../seekbar/EnableSlideToSeekPatch.kt | 43 +- .../interaction/seekbar/Fingerprints.kt | 137 +- .../interaction/seekbar/HideSeekbarPatch.kt | 29 +- .../interaction/seekbar/SeekbarPatch.kt | 16 +- .../seekbar/SeekbarThumbnailsPatch.kt | 26 +- .../interaction/swipecontrols/Fingerprints.kt | 29 +- .../swipecontrols/SwipeControlsPatch.kt | 59 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 31 +- .../layout/autocaptions/Fingerprints.kt | 26 +- .../layout/branding/CustomBrandingPatch.kt | 17 +- .../branding/header/ChangeHeaderPatch.kt | 101 +- .../layout/buttons/action/HideButtonsPatch.kt | 59 +- .../layout/buttons/navigation/Fingerprints.kt | 72 +- .../navigation/NavigationButtonsPatch.kt | 104 +- .../layout/buttons/overlay/Fingerprints.kt | 44 +- .../overlay/HidePlayerOverlayButtonsPatch.kt | 115 +- .../formfactor/ChangeFormFactorPatch.kt | 63 +- .../youtube/layout/formfactor/Fingerprints.kt | 52 +- .../hide/endscreencards/Fingerprints.kt | 47 +- .../endscreencards/HideEndScreenCardsPatch.kt | 43 +- .../hide/endscreensuggestion/Fingerprints.kt | 42 +- .../HideEndScreenSuggestedVideoPatch.kt | 37 +- .../DisableFullscreenAmbientModePatch.kt | 17 +- .../fullscreenambientmode/Fingerprints.kt | 15 +- .../layout/hide/general/Fingerprints.kt | 133 +- .../hide/general/HideLayoutComponentsPatch.kt | 247 ++-- .../layout/hide/infocards/Fingerprints.kt | 39 +- .../hide/infocards/HideInfoCardsPatch.kt | 90 +- .../HidePlayerFlyoutMenuPatch.kt | 17 +- .../hide/relatedvideooverlay/Fingerprints.kt | 21 +- .../HideRelatedVideoOverlayPatch.kt | 67 +- .../DisableRollingNumberAnimationPatch.kt | 53 +- .../layout/hide/seekbar/HideSeekbarPatch.kt | 11 - .../layout/hide/shorts/Fingerprints.kt | 135 +- .../hide/shorts/HideShortsComponentsPatch.kt | 257 ++-- .../DisableSignInToTvPatchPopup.kt | 31 +- .../hide/signintotvpopup/Fingerprints.kt | 20 +- .../DisableSuggestedVideoEndScreenPatch.kt | 9 - .../youtube/layout/hide/time/Fingerprints.kt | 21 +- .../layout/hide/time/HideTimestampPatch.kt | 19 +- .../youtube/layout/miniplayer/Fingerprints.kt | 225 ++-- .../layout/miniplayer/MiniplayerPatch.kt | 377 ++---- .../layout/panels/popup/Fingerprints.kt | 17 +- .../panels/popup/PlayerPopupPanelsPatch.kt | 21 +- .../PlayerControlsBackgroundPatch.kt | 12 - .../player/fullscreen/ExitFullscreenPatch.kt | 34 +- .../layout/player/fullscreen/Fingerprints.kt | 55 +- .../player/fullscreen/OpenVideosFullscreen.kt | 9 - .../OpenVideosFullscreenHookPatch.kt | 46 +- .../fullscreen/OpenVideosFullscreenPatch.kt | 25 +- .../CustomPlayerOverlayOpacityPatch.kt | 75 +- .../layout/player/overlay/Fingerprints.kt | 20 +- .../returnyoutubedislike/Fingerprints.kt | 124 +- .../ReturnYouTubeDislikePatch.kt | 189 +-- .../youtube/layout/searchbar/Fingerprints.kt | 39 +- .../layout/searchbar/WideSearchbarPatch.kt | 109 +- .../youtube/layout/seekbar/Fingerprints.kt | 193 ++- .../layout/seekbar/SeekbarColorPatch.kt | 299 ++--- .../layout/shortsautoplay/Fingerprints.kt | 86 +- .../shortsautoplay/ShortsAutoplayPatch.kt | 69 +- .../layout/shortsplayer/Fingerprints.kt | 97 +- .../OpenShortsInRegularPlayerPatch.kt | 118 +- .../layout/sponsorblock/Fingerprints.kt | 96 +- .../layout/sponsorblock/SponsorBlockPatch.kt | 214 ++-- .../layout/spoofappversion/Fingerprints.kt | 49 +- .../spoofappversion/SpoofAppVersionPatch.kt | 98 +- .../layout/startpage/ChangeStartPagePatch.kt | 54 +- .../youtube/layout/startpage/Fingerprints.kt | 25 +- .../DisableResumingShortsOnStartupPatch.kt | 61 +- .../layout/startupshortsreset/Fingerprints.kt | 45 +- .../layout/tablet/EnableTabletLayoutPatch.kt | 9 - .../youtube/layout/theme/Fingerprints.kt | 30 +- .../layout/theme/LithoColorHookPatch.kt | 19 - .../youtube/layout/theme/ThemePatch.kt | 63 +- .../thumbnails/AlternativeThumbnailsPatch.kt | 21 +- .../BypassImageRegionRestrictionsPatch.kt | 11 +- .../misc/announcements/AnnouncementsPatch.kt | 17 +- .../youtube/misc/audiofocus/Fingerprints.kt | 19 +- .../audiofocus/PauseOnAudioInterruptPatch.kt | 23 +- .../misc/autorepeat/AutoRepeatPatch.kt | 9 - .../BackgroundPlaybackPatch.kt | 63 +- .../misc/backgroundplayback/Fingerprints.kt | 48 +- .../misc/check/CheckEnvironmentPatch.kt | 4 +- .../misc/debugging/EnableDebuggingPatch.kt | 6 +- .../youtube/misc/debugging/Fingerprints.kt | 35 - .../misc/dimensions/spoof/Fingerprints.kt | 15 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 47 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 15 +- .../extension/hooks/ApplicationInitHook.kt | 19 +- .../fix/backtoexitgesture/Fingerprints.kt | 51 +- .../FixBackToExitGesturePatch.kt | 47 +- .../FIxContentProviderPatch.kt | 35 + .../misc/fix/contentprovider/Fingerprints.kt | 16 + .../fix/playback/SpoofVideoStreamsPatch.kt | 9 - .../fix/playback/UserAgentClientSpoofPatch.kt | 9 - .../misc/fix/playbackspeed/Fingerprints.kt | 28 +- ...t => FixPlaybackSpeedWhilePlayingPatch.kt} | 19 +- .../gms/AccountCredentialsInvalidTextPatch.kt | 67 +- .../patches/youtube/misc/gms/Fingerprints.kt | 42 +- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 21 +- .../DisableHapticFeedbackPatch.kt | 52 +- .../misc/hapticfeedback/Fingerprints.kt | 31 +- .../misc/imageurlhook/CronetImageUrlHook.kt | 28 +- .../youtube/misc/imageurlhook/Fingerprints.kt | 76 +- .../misc/links/BypassURLRedirectsPatch.kt | 76 +- .../youtube/misc/links/Fingerprints.kt | 80 +- .../misc/links/OpenLinksExternallyPatch.kt | 13 +- .../youtube/misc/litho/filter/Fingerprints.kt | 21 +- .../misc/litho/filter/LithoFilterPatch.kt | 104 +- .../youtube/misc/loopvideo/Fingerprints.kt | 18 + .../youtube/misc/loopvideo/LoopVideoPatch.kt | 30 +- .../loopvideo/button/LoopVideoButtonPatch.kt | 4 +- .../youtube/misc/navigation/Fingerprints.kt | 194 +-- .../misc/navigation/NavigationBarHookPatch.kt | 268 ++-- .../misc/playercontrols/Fingerprints.kt | 180 +-- .../PlayerControlsOverlayVisibilityPatch.kt | 14 +- .../playercontrols/PlayerControlsPatch.kt | 161 ++- .../youtube/misc/playertype/Fingerprints.kt | 70 +- .../misc/playertype/PlayerTypeHookPatch.kt | 84 +- .../misc/playservice/VersionCheckPatch.kt | 78 +- .../RemoveTrackingQueryParameterPatch.kt | 9 - .../misc/privacy/SanitizeSharingLinksPatch.kt | 7 +- .../recyclerviewtree/hook/Fingerprints.kt | 9 +- .../hook/RecyclerViewTreeHookPatch.kt | 10 +- .../youtube/misc/settings/Fingerprints.kt | 47 +- .../youtube/misc/settings/SettingsPatch.kt | 136 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 23 +- .../misc/zoomhaptics/ZoomHapticsPatch.kt | 11 - .../patches/youtube/shared/Fingerprints.kt | 197 ++- .../video/audio/ForceOriginalAudioPatch.kt | 15 +- .../video/codecs/DisableVideoCodecsPatch.kt | 32 +- .../youtube/video/codecs/Fingerprints.kt | 17 +- .../youtube/video/hdr/DisableHdrPatch.kt | 10 - .../youtube/video/information/Fingerprints.kt | 181 +-- .../information/VideoInformationPatch.kt | 207 +-- .../video/playerresponse/Fingerprints.kt | 111 +- .../PlayerResponseMethodHookPatch.kt | 35 +- .../quality/AdvancedVideoQualityMenuPatch.kt | 59 +- .../youtube/video/quality/Fingerprints.kt | 46 +- .../quality/RememberVideoQualityPatch.kt | 83 +- .../quality/VideoQualityDialogButtonPatch.kt | 6 +- .../video/quality/VideoQualityPatch.kt | 18 +- .../youtube/video/speed/PlaybackSpeedPatch.kt | 8 +- .../speed/button/PlaybackSpeedButtonPatch.kt | 6 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 178 ++- .../video/speed/custom/Fingerprints.kt | 93 +- .../video/speed/remember/Fingerprints.kt | 10 +- .../remember/RememberPlaybackSpeedPatch.kt | 18 +- .../youtube/video/videoid/Fingerprints.kt | 78 +- .../youtube/video/videoid/VideoIdPatch.kt | 36 +- .../RestoreOldVideoQualityMenuPatch.kt | 10 - .../yuka/misc/unlockpremium/Fingerprints.kt | 20 - .../misc/unlockpremium/UnlockPremiumPatch.kt | 23 - .../kotlin/app/revanced/util/BytecodeUtils.kt | 198 ++- .../revanced/util/resource/StringResource.kt | 56 +- .../resources/addresources/values/arrays.xml | 29 +- .../resources/addresources/values/strings.xml | 9 + .../youtube_controls_bottom_ui_container.xml | 2 +- .../youtube_controls_bottom_ui_container.xml | 35 +- .../revanced_fill_bell_cairo_black_24.xml | 9 + .../drawable/revanced_ic_dialog_alert.xml | 14 +- .../drawable/revanced_settings_arrow_time.xml | 12 +- .../revanced_settings_arrow_time_bold.xml | 25 + .../revanced_settings_custom_checkmark.xml | 12 +- ...evanced_settings_custom_checkmark_bold.xml | 25 + .../drawable/revanced_settings_icon_bold.xml | 20 + .../revanced_settings_icon_dynamic.xml | 3 + .../revanced_settings_screen_00_about.xml | 12 +- ...revanced_settings_screen_00_about_bold.xml | 25 + .../revanced_settings_screen_01_ads.xml | 12 +- .../revanced_settings_screen_01_ads_bold.xml | 26 + ...nced_settings_screen_02_alt_thumbnails.xml | 18 +- ...settings_screen_02_alt_thumbnails_bold.xml | 20 + .../revanced_settings_screen_03_feed.xml | 12 +- .../revanced_settings_screen_03_feed_bold.xml | 25 + .../revanced_settings_screen_04_general.xml | 12 +- ...vanced_settings_screen_04_general_bold.xml | 25 + .../revanced_settings_screen_05_player.xml | 12 +- ...evanced_settings_screen_05_player_bold.xml | 25 + .../revanced_settings_screen_06_shorts.xml | 16 +- ...evanced_settings_screen_06_shorts_bold.xml | 25 + .../revanced_settings_screen_07_seekbar.xml | 12 +- ...vanced_settings_screen_07_seekbar_bold.xml | 25 + ...nced_settings_screen_08_swipe_controls.xml | 12 +- ...settings_screen_08_swipe_controls_bold.xml | 26 + ...tings_screen_09_return_youtube_dislike.xml | 12 +- ..._screen_09_return_youtube_dislike_bold.xml | 25 + ...vanced_settings_screen_10_sponsorblock.xml | 12 +- ...d_settings_screen_10_sponsorblock_bold.xml | 20 + .../revanced_settings_screen_11_misc.xml | 12 +- .../revanced_settings_screen_11_misc_bold.xml | 25 + .../revanced_settings_screen_12_video.xml | 12 +- ...revanced_settings_screen_12_video_bold.xml | 25 + .../revanced_settings_search_icon.xml | 12 +- .../revanced_settings_search_icon_bold.xml | 25 + .../revanced_settings_search_remove.xml | 12 +- .../revanced_settings_search_remove_bold.xml | 25 + .../revanced_settings_toolbar_arrow_left.xml | 12 +- ...anced_settings_toolbar_arrow_left_bold.xml | 25 + .../xml/revanced_prefs_icons_bold.xml | 6 + .../drawable/revanced_sb_logo.xml | 20 +- .../drawable/revanced_sb_logo_bold.xml | 20 + settings.gradle.kts | 5 +- 842 files changed, 12691 insertions(+), 13203 deletions(-) delete mode 100644 .editorconfig create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java rename extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/{components => litho}/CustomFilter.java (96%) delete mode 100644 extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/ClientTokenService.java delete mode 100644 extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/Constants.java delete mode 100644 extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/RequestListener.java delete mode 100644 extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/SpoofClientPatch.java delete mode 100644 extensions/spotify/src/main/proto/app/revanced/extension/spotify/misc/fix/clienttoken_http.proto create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/AdsFilter.java (99%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/AdvancedVideoQualityMenuFilter.java (94%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/ButtonsFilter.java (92%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/CommentsFilter.java (98%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/DescriptionComponentsFilter.java (98%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/HideInfoCardsFilter.java (76%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/KeywordContentFilter.java (99%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/LayoutComponentsFilter.java (88%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/PlaybackSpeedMenuFilter.java (96%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/PlayerFlyoutMenuItemsFilter.java (94%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/ReturnYouTubeDislikeFilter.java (87%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{components => litho}/ShortsFilter.java (76%) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java rename patches/src/main/kotlin/app/revanced/patches/all/misc/adb/{HideAdbPatch.kt => HideAdbStatusPatch.kt} (75%) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContent.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/UrlResponseJsonParserFingerprint.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/shared/Utils.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/DisableVersionCheckPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInVideoDownloadsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt rename patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/{AddGiveGroupKudosButtonToGroupActivity.kt => AddGiveGroupKudosButtonToGroupActivityPatch.kt} (89%) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt rename patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/{FIxPlaybackSpeedWhilePlayingPatch.kt => FixPlaybackSpeedWhilePlayingPatch.kt} (84%) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt create mode 100644 patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml create mode 100644 patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml create mode 100644 patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 2d6d258f47..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,3 +0,0 @@ -[*.{kt,kts}] -ktlint_code_style = intellij_idea -ktlint_standard_no-wildcard-imports = disabled \ No newline at end of file diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 1202bc5f0d..505feaa0b6 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -34,7 +34,7 @@ jobs: - name: Build env: - ORG_GRADLE_PROJECT_githubPackagesUsername: ${{ env.GITHUB_ACTOR }} + ORG_GRADLE_PROJECT_githubPackagesUsername: ${{ github.actor }} ORG_GRADLE_PROJECT_githubPackagesPassword: ${{ secrets.GITHUB_TOKEN }} run: ./gradlew :patches:buildAndroid --no-daemon diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java index bb19d2497b..5d6f6ce54a 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java @@ -11,6 +11,7 @@ import android.widget.Toolbar; import app.revanced.extension.music.settings.preference.MusicPreferenceFragment; import app.revanced.extension.music.settings.search.MusicSearchViewController; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; @@ -46,15 +47,7 @@ public class MusicActivityHook extends BaseActivityHook { // Override the default YouTube Music theme to increase start padding of list items. // Custom style located in resources/music/values/style.xml activity.setTheme(Utils.getResourceIdentifierOrThrow( - "Theme.ReVanced.YouTubeMusic.Settings", "style")); - } - - /** - * Returns the resource ID for the YouTube Music settings layout. - */ - @Override - protected int getContentViewResourceId() { - return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; + ResourceType.STYLE, "Theme.ReVanced.YouTubeMusic.Settings")); } /** diff --git a/extensions/shared/build.gradle.kts b/extensions/shared/build.gradle.kts index 8f037894ca..13949a8dc6 100644 --- a/extensions/shared/build.gradle.kts +++ b/extensions/shared/build.gradle.kts @@ -2,3 +2,9 @@ dependencies { implementation(project(":extensions:shared:library")) compileOnly(libs.okhttp) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java new file mode 100644 index 0000000000..48032017a4 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java @@ -0,0 +1,57 @@ +package app.revanced.extension.shared; + +import java.util.HashMap; +import java.util.Map; + +public enum ResourceType { + ANIM("anim"), + ANIMATOR("animator"), + ARRAY("array"), + ATTR("attr"), + BOOL("bool"), + COLOR("color"), + DIMEN("dimen"), + DRAWABLE("drawable"), + FONT("font"), + FRACTION("fraction"), + ID("id"), + INTEGER("integer"), + INTERPOLATOR("interpolator"), + LAYOUT("layout"), + MENU("menu"), + MIPMAP("mipmap"), + NAVIGATION("navigation"), + PLURALS("plurals"), + RAW("raw"), + STRING("string"), + STYLE("style"), + STYLEABLE("styleable"), + TRANSITION("transition"), + VALUES("values"), + XML("xml"); + + private static final Map VALUE_MAP; + + static { + ResourceType[] values = values(); + VALUE_MAP = new HashMap<>(2 * values.length); + + for (ResourceType type : values) { + VALUE_MAP.put(type.value, type); + } + } + + public final String value; + + public static ResourceType fromValue(String value) { + ResourceType type = VALUE_MAP.get(value); + if (type == null) { + throw new IllegalArgumentException("Unknown resource type: " + value); + } + return type; + } + + ResourceType(String value) { + this.value = value; + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index ea37cfcde8..0093317082 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -32,7 +32,11 @@ import android.view.Window; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.Toast; +import android.widget.Toolbar; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; @@ -43,8 +47,10 @@ import java.text.Collator; import java.text.Normalizer; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -76,6 +82,8 @@ public class Utils { @Nullable private static Boolean isDarkModeEnabled; + private static boolean appIsUsingBoldIcons; + // Cached Collator instance with its locale. @Nullable private static Locale cachedCollatorLocale; @@ -148,12 +156,12 @@ public class Utils { /** * Hide a view by setting its layout height and width to 1dp. * - * @param condition The setting to check for hiding the view. + * @param setting The setting to check for hiding the view. * @param view The view to hide. */ - public static void hideViewBy0dpUnderCondition(BooleanSetting condition, View view) { - if (hideViewBy0dpUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewBy0dpUnderCondition(BooleanSetting setting, View view) { + if (hideViewBy0dpUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } @@ -165,22 +173,47 @@ public class Utils { */ public static boolean hideViewBy0dpUnderCondition(boolean condition, View view) { if (condition) { - hideViewByLayoutParams(view); + hideViewBy0dp(view); return true; } return false; } + /** + * Hide a view by setting its layout params to 0x0 + * @param view The view to hide. + */ + public static void hideViewBy0dp(View view) { + if (view instanceof LinearLayout) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams); + } else if (view instanceof FrameLayout) { + FrameLayout.LayoutParams layoutParams2 = new FrameLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams2); + } else if (view instanceof RelativeLayout) { + RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams3); + } else if (view instanceof Toolbar) { + Toolbar.LayoutParams layoutParams4 = new Toolbar.LayoutParams(0, 0); + view.setLayoutParams(layoutParams4); + } else { + ViewGroup.LayoutParams params = view.getLayoutParams(); + params.width = 0; + params.height = 0; + view.setLayoutParams(params); + } + } + /** * Hide a view by setting its visibility to GONE. * - * @param condition The setting to check for hiding the view. + * @param setting The setting to check for hiding the view. * @param view The view to hide. */ - public static void hideViewUnderCondition(BooleanSetting condition, View view) { - if (hideViewUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewUnderCondition(BooleanSetting setting, View view) { + if (hideViewUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } @@ -199,14 +232,14 @@ public class Utils { return false; } - public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting condition, View view) { - if (hideViewByRemovingFromParentUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting setting, View view) { + if (hideViewByRemovingFromParentUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } - public static boolean hideViewByRemovingFromParentUnderCondition(boolean setting, View view) { - if (setting) { + public static boolean hideViewByRemovingFromParentUnderCondition(boolean condition, View view) { + if (condition) { ViewParent parent = view.getParent(); if (parent instanceof ViewGroup parentGroup) { parentGroup.removeView(view); @@ -278,12 +311,13 @@ public class Utils { * @return zero, if the resource is not found. */ @SuppressLint("DiscouragedApi") - public static int getResourceIdentifier(Context context, String resourceIdentifierName, @Nullable String type) { - return context.getResources().getIdentifier(resourceIdentifierName, type, context.getPackageName()); + public static int getResourceIdentifier(Context context, @Nullable ResourceType type, String resourceIdentifierName) { + return context.getResources().getIdentifier(resourceIdentifierName, + type == null ? null : type.value, context.getPackageName()); } - public static int getResourceIdentifierOrThrow(Context context, String resourceIdentifierName, @Nullable String type) { - final int resourceId = getResourceIdentifier(context, resourceIdentifierName, type); + public static int getResourceIdentifierOrThrow(Context context, @Nullable ResourceType type, String resourceIdentifierName) { + final int resourceId = getResourceIdentifier(context, type, resourceIdentifierName); if (resourceId == 0) { throw new Resources.NotFoundException("No resource id exists with name: " + resourceIdentifierName + " type: " + type); @@ -293,22 +327,18 @@ public class Utils { /** * @return zero, if the resource is not found. - * @see #getResourceIdentifierOrThrow(String, String) + * @see #getResourceIdentifierOrThrow(ResourceType, String) */ - public static int getResourceIdentifier(String resourceIdentifierName, @Nullable String type) { - return getResourceIdentifier(getContext(), resourceIdentifierName, type); + public static int getResourceIdentifier(@Nullable ResourceType type, String resourceIdentifierName) { + return getResourceIdentifier(getContext(), type, resourceIdentifierName); } /** - * @return The resource identifier, or throws an exception if not found. + * @return zero, if the resource is not found. + * @see #getResourceIdentifier(ResourceType, String) */ - public static int getResourceIdentifierOrThrow(String resourceIdentifierName, @Nullable String type) { - final int resourceId = getResourceIdentifier(getContext(), resourceIdentifierName, type); - if (resourceId == 0) { - throw new Resources.NotFoundException("No resource id exists with name: " + resourceIdentifierName - + " type: " + type); - } - return resourceId; + public static int getResourceIdentifierOrThrow(@Nullable ResourceType type, String resourceIdentifierName) { + return getResourceIdentifierOrThrow(getContext(), type, resourceIdentifierName); } public static String getResourceString(int id) throws Resources.NotFoundException { @@ -316,29 +346,29 @@ public class Utils { } public static int getResourceInteger(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getInteger(getResourceIdentifierOrThrow(resourceIdentifierName, "integer")); + return getContext().getResources().getInteger(getResourceIdentifierOrThrow(ResourceType.INTEGER, resourceIdentifierName)); } public static Animation getResourceAnimation(String resourceIdentifierName) throws Resources.NotFoundException { - return AnimationUtils.loadAnimation(getContext(), getResourceIdentifierOrThrow(resourceIdentifierName, "anim")); + return AnimationUtils.loadAnimation(getContext(), getResourceIdentifierOrThrow(ResourceType.ANIM, resourceIdentifierName)); } @ColorInt public static int getResourceColor(String resourceIdentifierName) throws Resources.NotFoundException { //noinspection deprecation - return getContext().getResources().getColor(getResourceIdentifierOrThrow(resourceIdentifierName, "color")); + return getContext().getResources().getColor(getResourceIdentifierOrThrow(ResourceType.COLOR, resourceIdentifierName)); } public static int getResourceDimensionPixelSize(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getDimensionPixelSize(getResourceIdentifierOrThrow(resourceIdentifierName, "dimen")); + return getContext().getResources().getDimensionPixelSize(getResourceIdentifierOrThrow(ResourceType.DIMEN, resourceIdentifierName)); } public static float getResourceDimension(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getDimension(getResourceIdentifierOrThrow(resourceIdentifierName, "dimen")); + return getContext().getResources().getDimension(getResourceIdentifierOrThrow(ResourceType.DIMEN, resourceIdentifierName)); } public static String[] getResourceStringArray(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getStringArray(getResourceIdentifierOrThrow(resourceIdentifierName, "array")); + return getContext().getResources().getStringArray(getResourceIdentifierOrThrow(ResourceType.ARRAY, resourceIdentifierName)); } public interface MatchFilter { @@ -349,7 +379,7 @@ public class Utils { * Includes sub children. */ public static R getChildViewByResourceName(View view, String str) { - var child = view.findViewById(Utils.getResourceIdentifierOrThrow(str, "id")); + var child = view.findViewById(Utils.getResourceIdentifierOrThrow(ResourceType.ID, str)); //noinspection unchecked return (R) child; } @@ -806,6 +836,21 @@ public class Utils { window.setBackgroundDrawable(null); // Remove default dialog background } + /** + * @return If the unpatched app is currently using bold icons. + */ + public static boolean appIsUsingBoldIcons() { + return appIsUsingBoldIcons; + } + + /** + * Controls if ReVanced bold icons are shown in various places. + * @param boldIcons If the app is currently using bold icons. + */ + public static void setAppIsUsingBoldIcons(boolean boldIcons) { + appIsUsingBoldIcons = boldIcons; + } + /** * Sets the theme light color used by the app. */ @@ -1167,4 +1212,18 @@ public class Utils { public static float clamp(float value, float lower, float upper) { return Math.max(lower, Math.min(value, upper)); } + + /** + * @param maxSize The maximum number of elements to keep in the map. + * @return A {@link LinkedHashMap} that automatically evicts the oldest entry + * when the size exceeds {@code maxSize}. + */ + public static Map createSizeRestrictedMap(int maxSize) { + return new LinkedHashMap<>(2 * maxSize) { + @Override + protected boolean removeEldestEntry(Entry eldest) { + return size() > maxSize; + } + }; + } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index ccb7c9262e..53db12c4d7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -23,6 +23,7 @@ import androidx.annotation.Nullable; import java.util.Collection; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.ui.CustomDialog; @@ -128,7 +129,7 @@ abstract class Check { // Add icon to the dialog. ImageView iconView = new ImageView(activity); iconView.setImageResource(Utils.getResourceIdentifierOrThrow( - "revanced_ic_dialog_alert", "drawable")); + ResourceType.DRAWABLE, "revanced_ic_dialog_alert")); iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN); iconView.setPadding(0, 0, 0, 0); LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams( diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java index b6fa2caa0c..00ee6def3b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java @@ -15,7 +15,6 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; - public abstract class BaseFixRedgifsApiPatch implements Interceptor { protected static BaseFixRedgifsApiPatch INSTANCE; public abstract String getDefaultUserAgent(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java index 9908c0be75..2b81178eac 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java @@ -13,6 +13,7 @@ import java.util.Locale; import app.revanced.extension.shared.GmsCoreSupport; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; @@ -65,7 +66,7 @@ public class CustomBrandingPatch { iconName += "_custom"; } - notificationSmallIcon = Utils.getResourceIdentifier(iconName, "drawable"); + notificationSmallIcon = Utils.getResourceIdentifier(ResourceType.DRAWABLE, iconName); if (notificationSmallIcon == 0) { Logger.printException(() -> "Could not load notification small icon"); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/components/CustomFilter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java similarity index 96% rename from extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/components/CustomFilter.java rename to extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java index bd5388f31f..c82c28353a 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/components/CustomFilter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.shared.patches.components; +package app.revanced.extension.shared.patches.litho; import static app.revanced.extension.shared.StringRef.str; @@ -17,7 +17,6 @@ import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ByteTrieSearch; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; import app.revanced.extension.shared.settings.YouTubeAndMusicSettings; -import app.revanced.extension.shared.patches.litho.Filter; /** * Allows custom filtering using a path and optionally a proto buffer string. @@ -148,7 +147,7 @@ public final class CustomFilter extends Filter { @Override public boolean isFiltered(String identifier, String path, byte[] buffer, - StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { // All callbacks are custom filter groups. CustomFilterGroup custom = (CustomFilterGroup) matchedGroup; if (custom.startsWith && contentIndex != 0) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java index 1bab323544..ccd152262b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java @@ -1,12 +1,12 @@ package app.revanced.extension.shared.patches.litho; +import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; -import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; - /** * Filters litho based components. * @@ -33,12 +33,12 @@ public abstract class Filter { * Identifier callbacks. Do not add to this instance, * and instead use {@link #addIdentifierCallbacks(StringFilterGroup...)}. */ - protected final List identifierCallbacks = new ArrayList<>(); + public final List identifierCallbacks = new ArrayList<>(); /** * Path callbacks. Do not add to this instance, * and instead use {@link #addPathCallbacks(StringFilterGroup...)}. */ - protected final List pathCallbacks = new ArrayList<>(); + public final List pathCallbacks = new ArrayList<>(); /** * Adds callbacks to {@link #isFiltered(String, String, byte[], StringFilterGroup, FilterContentType, int)} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java index 34219de9dc..5b75858f3d 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java @@ -55,7 +55,7 @@ public abstract class FilterGroup { } protected final BooleanSetting setting; - protected final T[] filters; + public final T[] filters; /** * Initialize a new filter group. diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroupList.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroupList.java index e68276c7ce..da22ca9ff7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroupList.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroupList.java @@ -1,15 +1,17 @@ package app.revanced.extension.shared.patches.litho; import androidx.annotation.NonNull; - -import java.util.*; - import app.revanced.extension.shared.ByteTrieSearch; import app.revanced.extension.shared.StringTrieSearch; import app.revanced.extension.shared.TrieSearch; import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + public abstract class FilterGroupList> implements Iterable { private final List filterGroups = new ArrayList<>(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java index 5ff86428db..ddcfe41cc0 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java @@ -4,14 +4,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.List; +import java.util.Map; import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.StringTrieSearch; -import app.revanced.extension.shared.settings.BaseSettings; -import app.revanced.extension.shared.settings.YouTubeAndMusicSettings; - +import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; +import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.shared.StringTrieSearch; +import app.revanced.extension.shared.settings.YouTubeAndMusicSettings; @SuppressWarnings("unused") public final class LithoFilterPatch { @@ -34,7 +37,7 @@ public final class LithoFilterPatch { public String toString() { // Estimate the percentage of the buffer that are Strings. StringBuilder builder = new StringBuilder(Math.max(100, buffer.length / 2)); - builder.append( "ID: "); + builder.append("ID: "); builder.append(identifier); builder.append(" Path: "); builder.append(path); @@ -75,6 +78,16 @@ public final class LithoFilterPatch { } } + /** + * Placeholder for actual filters. + */ + private static final class DummyFilter extends Filter { + } + + private static final Filter[] filters = new Filter[]{ + new DummyFilter() // Replaced during patching, do not touch. + }; + /** * Litho layout fixed thread pool size override. *

@@ -92,25 +105,55 @@ public final class LithoFilterPatch { private static final int LITHO_LAYOUT_THREAD_POOL_SIZE = 1; /** - * Placeholder for actual filters. + * For YouTube 20.22+, this is set to true by a patch, + * because it cannot use the thread buffer due to the buffer frequently not being correct, + * especially for components that are recreated such as dragging off-screen then back on screen. + * Instead, parse the identifier found near the start of the buffer and use that to + * identify the correct buffer to use when filtering. + *

+ * This is set during patching, do not change manually. */ - private static final class DummyFilter extends Filter { } + private static final boolean EXTRACT_IDENTIFIER_FROM_BUFFER = false; - private static final Filter[] filters = new Filter[] { - new DummyFilter() // Replaced patching, do not touch. - }; + /** + * Turns on additional logging, used for development purposes only. + */ + public static final boolean DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER = false; - private static final StringTrieSearch pathSearchTree = new StringTrieSearch(); - private static final StringTrieSearch identifierSearchTree = new StringTrieSearch(); + /** + * String suffix for components. + * Can be any of: ".eml", ".e-b", ".eml-js", "e-js-b" + */ + private static final byte[] LITHO_COMPONENT_EXTENSION_BYTES = ".e".getBytes(StandardCharsets.US_ASCII); + /** + * Used as placeholder for litho id/path filters that do not use a buffer + */ private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; /** * Because litho filtering is multi-threaded and the buffer is passed in from a different injection point, * the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads. + * Used for 20.21 and lower. */ private static final ThreadLocal bufferThreadLocal = new ThreadLocal<>(); + /** + * Identifier to protocol buffer mapping. Only used for 20.22+. + * Thread local is needed because filtering is multi-threaded and each thread can load + * a different component with the same identifier. + */ + private static final ThreadLocal> identifierToBufferThread = new ThreadLocal<>(); + + /** + * Global shared buffer. Used only if the buffer is not found in the ThreadLocal. + */ + private static final Map identifierToBufferGlobal + = Collections.synchronizedMap(createIdentifierToBufferMap()); + + private static final StringTrieSearch pathSearchTree = new StringTrieSearch(); + private static final StringTrieSearch identifierSearchTree = new StringTrieSearch(); + static { for (Filter filter : filters) { filterUsingCallbacks(identifierSearchTree, filter, @@ -162,16 +205,107 @@ public final class LithoFilterPatch { } } + private static Map createIdentifierToBufferMap() { + // It's unclear how many items should be cached. This is a guess. + return Utils.createSizeRestrictedMap(100); + } + + /** + * Helper function that differs from {@link Character#isDigit(char)} + * as this only matches ascii and not unicode numbers. + */ + private static boolean isAsciiNumber(byte character) { + return '0' <= character && character <= '9'; + } + + private static boolean isAsciiLowerCaseLetter(byte character) { + return 'a' <= character && character <= 'z'; + } + /** * Injection point. Called off the main thread. * Targets 20.22+ */ public static void setProtoBuffer(byte[] buffer) { - // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. - // This is intentional, as it appears the buffer can be set once and then filtered multiple times. - // The buffer will be cleared from memory after a new buffer is set by the same thread, - // or when the calling thread eventually dies. - bufferThreadLocal.set(buffer); + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) { + StringBuilder builder = new StringBuilder(); + LithoFilterParameters.findAsciiStrings(builder, buffer); + Logger.printDebug(() -> "New buffer: " + builder); + } + + // Could use Boyer-Moore-Horspool since the string is ASCII and has a limited number of + // unique characters, but it seems to be slower since the extra overhead of checking the + // bad character array negates any performance gain of skipping a few extra subsearches. + int emlIndex = -1; + final int emlStringLength = LITHO_COMPONENT_EXTENSION_BYTES.length; + for (int i = 0, lastStartIndex = buffer.length - emlStringLength; i <= lastStartIndex; i++) { + boolean match = true; + for (int j = 0; j < emlStringLength; j++) { + if (buffer[i + j] != LITHO_COMPONENT_EXTENSION_BYTES[j]) { + match = false; + break; + } + } + if (match) { + emlIndex = i; + break; + } + } + + if (emlIndex < 0) { + // Buffer is not used for creating a new litho component. + return; + } + + int startIndex = emlIndex - 1; + while (startIndex > 0) { + final byte character = buffer[startIndex]; + int startIndexFinal = startIndex; + if (isAsciiLowerCaseLetter(character) || isAsciiNumber(character) || character == '_') { + // Valid character for the first path element. + startIndex--; + } else { + startIndex++; + break; + } + } + + // Strip away any numbers on the start of the identifier, which can + // be from random data in the buffer before the identifier starts. + while (true) { + final byte character = buffer[startIndex]; + if (isAsciiNumber(character)) { + startIndex++; + } else { + break; + } + } + + // Find the pipe character after the identifier. + int endIndex = -1; + for (int i = emlIndex, length = buffer.length; i < length; i++) { + if (buffer[i] == '|') { + endIndex = i; + break; + } + } + if (endIndex < 0) { + Logger.printException(() -> "Could not find buffer identifier"); + return; + } + + String identifier = new String(buffer, startIndex, endIndex - startIndex, StandardCharsets.US_ASCII); + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) { + Logger.printDebug(() -> "Found buffer for identifier: " + identifier); + } + identifierToBufferGlobal.put(identifier, buffer); + + Map map = identifierToBufferThread.get(); + if (map == null) { + map = createIdentifierToBufferMap(); + identifierToBufferThread.set(map); + } + map.put(identifier, buffer); } /** @@ -179,46 +313,70 @@ public final class LithoFilterPatch { * Targets 20.21 and lower. */ public static void setProtoBuffer(@Nullable ByteBuffer buffer) { - // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. - // This is intentional, as it appears the buffer can be set once and then filtered multiple times. - // The buffer will be cleared from memory after a new buffer is set by the same thread, - // or when the calling thread eventually dies. if (buffer == null || !buffer.hasArray()) { // It appears the buffer can be cleared out just before the call to #filter() // Ignore this null value and retain the last buffer that was set. Logger.printDebug(() -> "Ignoring null or empty buffer: " + buffer); } else { - setProtoBuffer(buffer.array()); + // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. + // This is intentional, as it appears the buffer can be set once and then filtered multiple times. + // The buffer will be cleared from memory after a new buffer is set by the same thread, + // or when the calling thread eventually dies. + bufferThreadLocal.set(buffer.array()); } } /** * Injection point. */ - public static boolean isFiltered(String lithoIdentifier, StringBuilder pathBuilder) { + public static boolean isFiltered(String identifier, StringBuilder pathBuilder) { try { - if (lithoIdentifier.isEmpty() && pathBuilder.length() == 0) { + if (identifier.isEmpty() || pathBuilder.length() == 0) { return false; } - byte[] buffer = bufferThreadLocal.get(); + byte[] buffer = null; + if (EXTRACT_IDENTIFIER_FROM_BUFFER) { + final int pipeIndex = identifier.indexOf('|'); + if (pipeIndex >= 0) { + // If the identifier contains no pipe, then it's not an ".eml" identifier + // and the buffer is not uniquely identified. Typically this only happens + // for subcomponents where buffer filtering is not used. + String identifierKey = identifier.substring(0, pipeIndex); + + var map = identifierToBufferThread.get(); + if (map != null) { + buffer = map.get(identifierKey); + } + + if (buffer == null) { + // Buffer for thread local not found. Use the last buffer found from any thread. + buffer = identifierToBufferGlobal.get(identifierKey); + + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER && buffer == null) { + // No buffer is found for some components, such as + // shorts_lockup_cell.eml on channel profiles. + // For now, just ignore this and filter without a buffer. + Logger.printException(() -> "Could not find global buffer for identifier: " + identifier); + } + } + } + } else { + buffer = bufferThreadLocal.get(); + } + // Potentially the buffer may have been null or never set up until now. - // Use an empty buffer so the litho id/path filters still work correctly. + // Use an empty buffer so the litho id/path filters that do not use a buffer still work. if (buffer == null) { buffer = EMPTY_BYTE_ARRAY; } - LithoFilterParameters parameter = new LithoFilterParameters( - lithoIdentifier, pathBuilder.toString(), buffer); + String path = pathBuilder.toString(); + LithoFilterParameters parameter = new LithoFilterParameters(identifier, path, buffer); Logger.printDebug(() -> "Searching " + parameter); - if (identifierSearchTree.matches(parameter.identifier, parameter)) { - return true; - } - - if (pathSearchTree.matches(parameter.path, parameter)) { - return true; - } + return identifierSearchTree.matches(identifier, parameter) + || pathSearchTree.matches(path, parameter); } catch (Exception ex) { Logger.printException(() -> "isFiltered failure", ex); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index fb068d8ede..0076e6d762 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -13,6 +13,7 @@ import android.widget.TextView; import android.widget.Toolbar; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment; import app.revanced.extension.shared.ui.Dim; @@ -25,13 +26,13 @@ import app.revanced.extension.shared.ui.Dim; public abstract class BaseActivityHook extends Activity { private static final int ID_REVANCED_SETTINGS_FRAGMENTS = - getResourceIdentifierOrThrow("revanced_settings_fragments", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "revanced_settings_fragments"); private static final int ID_REVANCED_TOOLBAR_PARENT = - getResourceIdentifierOrThrow("revanced_toolbar_parent", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "revanced_toolbar_parent"); public static final int LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR = - getResourceIdentifierOrThrow("revanced_settings_with_toolbar", "layout"); + getResourceIdentifierOrThrow(ResourceType.LAYOUT, "revanced_settings_with_toolbar"); private static final int STRING_REVANCED_SETTINGS_TITLE = - getResourceIdentifierOrThrow("revanced_settings_title", "string"); + getResourceIdentifierOrThrow(ResourceType.STRING, "revanced_settings_title"); /** * Layout parameters for the toolbar, extracted from the dummy toolbar. @@ -123,16 +124,18 @@ public abstract class BaseActivityHook extends Activity { toolBarParent.addView(toolbar, 0); } + /** + * Returns the resource ID for the content view layout. + */ + protected int getContentViewResourceId() { + return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; + } + /** * Customizes the activity's theme. */ protected abstract void customizeActivityTheme(Activity activity); - /** - * Returns the resource ID for the content view layout. - */ - protected abstract int getContentViewResourceId(); - /** * Returns the background color for the toolbar. */ diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index f7c6a3215f..c8570d2513 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -5,6 +5,8 @@ import static java.lang.Boolean.TRUE; import static app.revanced.extension.shared.patches.CustomBrandingPatch.BrandingTheme; import static app.revanced.extension.shared.settings.Setting.parent; +import app.revanced.extension.shared.Logger; + /** * Settings shared across multiple apps. *

@@ -24,10 +26,19 @@ public class BaseSettings { * Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing. */ public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true); + /** + * Do not use this setting directly. Instead use {@link app.revanced.extension.shared.Utils#appIsUsingBoldIcons()} + */ + public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", FALSE, true); public static final BooleanSetting SETTINGS_SEARCH_HISTORY = new BooleanSetting("revanced_settings_search_history", TRUE, true); public static final StringSetting SETTINGS_SEARCH_ENTRIES = new StringSetting("revanced_settings_search_entries", ""); + /** + * The first time the app was launched with no previous app data (either a clean install, or after wiping app data). + */ + public static final LongSetting FIRST_TIME_APP_LAUNCHED = new LongSetting("revanced_last_time_app_was_launched", -1L, false, false); + public static final BooleanSetting GMS_CORE_CHECK_UPDATES = new BooleanSetting("revanced_gms_core_check_updates", true, true); // @@ -46,4 +57,13 @@ public class BaseSettings { public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", 1, true); public static final StringSetting DISABLED_FEATURE_FLAGS = new StringSetting("revanced_disabled_feature_flags", "", true, parent(DEBUG)); + + static { + final long now = System.currentTimeMillis(); + + if (FIRST_TIME_APP_LAUNCHED.get() < 0) { + Logger.printInfo(() -> "First launch of installation with no prior app data"); + FIRST_TIME_APP_LAUNCHED.save(now); + } + } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index 6e0e8957b9..70ae3a5ab2 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -23,6 +23,7 @@ import androidx.annotation.Nullable; import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BooleanSetting; @@ -103,10 +104,16 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { * so all app specific {@link Setting} instances are loaded before this method returns. */ protected void initialize() { - String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get() - ? "revanced_prefs_icons" - : "revanced_prefs"; - final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml"); + String preferenceResourceName; + if (BaseSettings.SHOW_MENU_ICONS.get()) { + preferenceResourceName = Utils.appIsUsingBoldIcons() + ? "revanced_prefs_icons_bold" + : "revanced_prefs_icons"; + } else { + preferenceResourceName = "revanced_prefs"; + } + + final var identifier = Utils.getResourceIdentifier(ResourceType.XML, preferenceResourceName); if (identifier == 0) return; addPreferencesFromResource(identifier); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java index e3d6abee25..c9fc7b6da9 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java @@ -31,6 +31,7 @@ import java.util.Locale; import java.util.regex.Pattern; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.settings.StringSetting; @@ -81,13 +82,13 @@ public class ColorPickerPreference extends EditTextPreference { private boolean opacitySliderEnabled = false; public static final int ID_REVANCED_COLOR_PICKER_VIEW = - getResourceIdentifierOrThrow("revanced_color_picker_view", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "revanced_color_picker_view"); public static final int ID_PREFERENCE_COLOR_DOT = - getResourceIdentifierOrThrow("preference_color_dot", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "preference_color_dot"); public static final int LAYOUT_REVANCED_COLOR_DOT_WIDGET = - getResourceIdentifierOrThrow("revanced_color_dot_widget", "layout"); + getResourceIdentifierOrThrow(ResourceType.LAYOUT, "revanced_color_dot_widget"); public static final int LAYOUT_REVANCED_COLOR_PICKER = - getResourceIdentifierOrThrow("revanced_color_picker", "layout"); + getResourceIdentifierOrThrow(ResourceType.LAYOUT, "revanced_color_picker"); /** * Removes non valid hex characters, converts to all uppercase, diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java index ff728838b7..48c50c1f33 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java @@ -20,6 +20,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ui.CustomDialog; @@ -30,14 +31,18 @@ import app.revanced.extension.shared.ui.CustomDialog; @SuppressWarnings({"unused", "deprecation"}) public class CustomDialogListPreference extends ListPreference { - public static final int ID_REVANCED_CHECK_ICON = - getResourceIdentifierOrThrow("revanced_check_icon", "id"); - public static final int ID_REVANCED_CHECK_ICON_PLACEHOLDER = - getResourceIdentifierOrThrow("revanced_check_icon_placeholder", "id"); - public static final int ID_REVANCED_ITEM_TEXT = - getResourceIdentifierOrThrow("revanced_item_text", "id"); - public static final int LAYOUT_REVANCED_CUSTOM_LIST_ITEM_CHECKED = - getResourceIdentifierOrThrow("revanced_custom_list_item_checked", "layout"); + public static final int ID_REVANCED_CHECK_ICON = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_check_icon"); + public static final int ID_REVANCED_CHECK_ICON_PLACEHOLDER = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_check_icon_placeholder"); + public static final int ID_REVANCED_ITEM_TEXT = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_item_text"); + public static final int LAYOUT_REVANCED_CUSTOM_LIST_ITEM_CHECKED = getResourceIdentifierOrThrow( + ResourceType.LAYOUT, "revanced_custom_list_item_checked"); + public static final int DRAWABLE_CHECKMARK = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_custom_checkmark"); + public static final int DRAWABLE_CHECKMARK_BOLD = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_custom_checkmark_bold"); private String staticSummary = null; private CharSequence[] highlightedEntriesForDialog = null; @@ -125,9 +130,13 @@ public class CustomDialogListPreference extends ListPreference { LayoutInflater inflater = LayoutInflater.from(getContext()); view = inflater.inflate(layoutResourceId, parent, false); holder = new SubViewDataContainer(); - holder.checkIcon = view.findViewById(ID_REVANCED_CHECK_ICON); holder.placeholder = view.findViewById(ID_REVANCED_CHECK_ICON_PLACEHOLDER); holder.itemText = view.findViewById(ID_REVANCED_ITEM_TEXT); + holder.checkIcon = view.findViewById(ID_REVANCED_CHECK_ICON); + holder.checkIcon.setImageResource(Utils.appIsUsingBoldIcons() + ? DRAWABLE_CHECKMARK_BOLD + : DRAWABLE_CHECKMARK + ); view.setTag(holder); } else { holder = (SubViewDataContainer) view.getTag(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java index 1ada6584ac..061f230e4f 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java @@ -38,6 +38,7 @@ import java.util.Set; import java.util.TreeSet; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.patches.EnableDebuggingPatch; import app.revanced.extension.shared.settings.BaseSettings; @@ -52,25 +53,26 @@ import app.revanced.extension.shared.ui.Dim; public class FeatureFlagsManagerPreference extends Preference { private static final int DRAWABLE_REVANCED_SETTINGS_SELECT_ALL = - getResourceIdentifierOrThrow("revanced_settings_select_all", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_select_all"); private static final int DRAWABLE_REVANCED_SETTINGS_DESELECT_ALL = - getResourceIdentifierOrThrow("revanced_settings_deselect_all", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_deselect_all"); private static final int DRAWABLE_REVANCED_SETTINGS_COPY_ALL = - getResourceIdentifierOrThrow("revanced_settings_copy_all", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_copy_all"); private static final int DRAWABLE_REVANCED_SETTINGS_ARROW_RIGHT_ONE = - getResourceIdentifierOrThrow("revanced_settings_arrow_right_one", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_arrow_right_one"); private static final int DRAWABLE_REVANCED_SETTINGS_ARROW_RIGHT_DOUBLE = - getResourceIdentifierOrThrow("revanced_settings_arrow_right_double", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_arrow_right_double"); private static final int DRAWABLE_REVANCED_SETTINGS_ARROW_LEFT_ONE = - getResourceIdentifierOrThrow("revanced_settings_arrow_left_one", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_arrow_left_one"); private static final int DRAWABLE_REVANCED_SETTINGS_ARROW_LEFT_DOUBLE = - getResourceIdentifierOrThrow("revanced_settings_arrow_left_double", "drawable"); + getResourceIdentifierOrThrow(ResourceType.DRAWABLE, "revanced_settings_arrow_left_double"); /** * Flags to hide from the UI. */ private static final Set FLAGS_TO_IGNORE = Set.of( - 45386834L // 'You' tab settings icon. + 45386834L, // 'You' tab settings icon. + 45685201L // Bold icons. Forcing off interferes with patch changes and YT icons are broken. ); /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java index 5c595a97ae..cc0a642745 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java @@ -17,9 +17,11 @@ import android.widget.Toolbar; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; import app.revanced.extension.shared.ui.Dim; +import app.revanced.extension.shared.settings.BaseSettings; @SuppressWarnings({"deprecation", "NewApi"}) public class ToolbarPreferenceFragment extends AbstractPreferenceFragment { @@ -133,8 +135,10 @@ public class ToolbarPreferenceFragment extends AbstractPreferenceFragment { */ @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { - final int backButtonResource = Utils.getResourceIdentifierOrThrow( - "revanced_settings_toolbar_arrow_left", "drawable"); + final int backButtonResource = Utils.getResourceIdentifierOrThrow(ResourceType.DRAWABLE, + Utils.appIsUsingBoldIcons() + ? "revanced_settings_toolbar_arrow_left_bold" + : "revanced_settings_toolbar_arrow_left"); Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource); customizeBackButtonDrawable(drawable); return drawable; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java index ab1e2ee6c1..7b5830a463 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; @@ -38,18 +39,18 @@ public abstract class BaseSearchResultItem { // Get the corresponding layout resource ID. public int getLayoutResourceId() { return switch (this) { - case REGULAR, URL_LINK -> getResourceIdentifier("revanced_preference_search_result_regular"); - case SWITCH -> getResourceIdentifier("revanced_preference_search_result_switch"); - case LIST -> getResourceIdentifier("revanced_preference_search_result_list"); - case COLOR_PICKER -> getResourceIdentifier("revanced_preference_search_result_color"); - case GROUP_HEADER -> getResourceIdentifier("revanced_preference_search_result_group_header"); - case NO_RESULTS -> getResourceIdentifier("revanced_preference_search_no_result"); + case REGULAR, URL_LINK -> getResourceIdentifier("revanced_preference_search_result_regular"); + case SWITCH -> getResourceIdentifier("revanced_preference_search_result_switch"); + case LIST -> getResourceIdentifier("revanced_preference_search_result_list"); + case COLOR_PICKER -> getResourceIdentifier("revanced_preference_search_result_color"); + case GROUP_HEADER -> getResourceIdentifier("revanced_preference_search_result_group_header"); + case NO_RESULTS -> getResourceIdentifier("revanced_preference_search_no_result"); }; } private static int getResourceIdentifier(String name) { // Placeholder for actual resource identifier retrieval. - return Utils.getResourceIdentifierOrThrow(name, "layout"); + return Utils.getResourceIdentifierOrThrow(ResourceType.LAYOUT, name); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java index cb5e792e83..d6a8167f4e 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java @@ -1,7 +1,6 @@ package app.revanced.extension.shared.settings.search; import static app.revanced.extension.shared.Utils.getResourceIdentifierOrThrow; -import static app.revanced.extension.shared.settings.search.BaseSearchViewController.DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON; import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; @@ -33,6 +32,7 @@ import java.lang.reflect.Method; import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; @@ -54,15 +54,15 @@ public abstract class BaseSearchResultsAdapter extends ArrayAdapter searchHistory; private final Activity activity; @@ -97,7 +109,8 @@ public class SearchHistoryManager { // Inflate search history layout. LayoutInflater inflater = LayoutInflater.from(activity); - View historyView = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_SCREEN, searchHistoryContainer, false); + View historyView = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_SCREEN, + searchHistoryContainer, false); searchHistoryContainer.addView(historyView, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); @@ -320,17 +333,29 @@ public class SearchHistoryManager { public void notifyDataSetChanged() { container.removeAllViews(); for (String query : history) { - View view = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_ITEM, container, false); - - TextView historyText = view.findViewById(ID_HISTORY_TEXT); - ImageView deleteIcon = view.findViewById(ID_DELETE_ICON); - - historyText.setText(query); - + View view = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_ITEM, + container, false); // Set click listener for main item (select query). view.setOnClickListener(v -> onSelectHistoryItemListener.onSelectHistoryItem(query)); + // Set history icon. + ImageView historyIcon = view.findViewById(ID_HISTORY_ICON); + historyIcon.setImageResource(Utils.appIsUsingBoldIcons() + ? ID_SEARCH_ARROW_TIME_ICON_BOLD + : ID_SEARCH_ARROW_TIME_ICON + ); + + TextView historyText = view.findViewById(ID_HISTORY_TEXT); + historyText.setText(query); + // Set click listener for delete icon. + ImageView deleteIcon = view.findViewById(ID_DELETE_ICON); + + deleteIcon.setImageResource(Utils.appIsUsingBoldIcons() + ? ID_SEARCH_REMOVE_ICON_BOLD + : ID_SEARCH_REMOVE_ICON + ); + deleteIcon.setOnClickListener(v -> createAndShowDialog( query, str("revanced_settings_search_remove_message"), diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java index 5a4ebd1c3b..b8cd9b6b41 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java @@ -16,7 +16,6 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -83,22 +82,15 @@ public class StreamingDataRequest { */ private static final int MAX_MILLISECONDS_TO_WAIT_FOR_FETCH = 20 * 1000; + /** + * Cache limit must be greater than the maximum number of videos open at once, + * which theoretically is more than 4 (3 Shorts + one regular minimized video). + * But instead use a much larger value, to handle if a video viewed a while ago + * is somehow still referenced. Each stream is a small array of Strings + * so memory usage is not a concern. + */ private static final Map cache = Collections.synchronizedMap( - new LinkedHashMap<>(100) { - /** - * Cache limit must be greater than the maximum number of videos open at once, - * which theoretically is more than 4 (3 Shorts + one regular minimized video). - * But instead use a much larger value, to handle if a video viewed a while ago - * is somehow still referenced. Each stream is a small array of Strings - * so memory usage is not a concern. - */ - private static final int CACHE_LIMIT = 50; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit. - } - }); + Utils.createSizeRestrictedMap(50)); /** * Strings found in the response if the video is a livestream. diff --git a/extensions/spotify/build.gradle.kts b/extensions/spotify/build.gradle.kts index fd346d93b5..39d58a0227 100644 --- a/extensions/spotify/build.gradle.kts +++ b/extensions/spotify/build.gradle.kts @@ -1,14 +1,7 @@ -plugins { - alias(libs.plugins.protobuf) -} - dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:spotify:stub")) compileOnly(libs.annotation) - - implementation(libs.nanohttpd) - implementation(libs.protobuf.javalite) } android { @@ -21,19 +14,3 @@ android { targetCompatibility = JavaVersion.VERSION_1_8 } } - -protobuf { - protoc { - artifact = libs.protobuf.protoc.get().toString() - } - - generateProtoTasks { - all().forEach { task -> - task.builtins { - create("java") { - option("lite") - } - } - } - } -} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java index 47cfdf0858..29a1cc4729 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java @@ -1,6 +1,7 @@ package app.revanced.extension.spotify.layout.hide.createbutton; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.spotify.shared.ComponentFilters.ComponentFilter; import app.revanced.extension.spotify.shared.ComponentFilters.ResourceIdComponentFilter; import app.revanced.extension.spotify.shared.ComponentFilters.StringComponentFilter; @@ -16,7 +17,7 @@ public final class HideCreateButtonPatch { * The main approach used is matching the resource id for the Create button title. */ private static final List CREATE_BUTTON_COMPONENT_FILTERS = List.of( - new ResourceIdComponentFilter("navigationbar_musicappitems_create_title", "string"), + new ResourceIdComponentFilter(ResourceType.STRING, "navigationbar_musicappitems_create_title"), // Temporary fallback and fix for APKs merged with AntiSplit-M not having resources properly encoded, // and thus getting the resource identifier for the Create button title always return 0. // FIXME: Remove this once the above issue is no longer relevant. @@ -28,7 +29,7 @@ public final class HideCreateButtonPatch { * Used in older versions of the app. */ private static final ResourceIdComponentFilter OLD_CREATE_BUTTON_COMPONENT_FILTER = - new ResourceIdComponentFilter("bottom_navigation_bar_create_tab_title", "string"); + new ResourceIdComponentFilter(ResourceType.STRING, "bottom_navigation_bar_create_tab_title"); /** * Injection point. This method is called on every navigation bar item to check whether it is the Create button. diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/ClientTokenService.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/ClientTokenService.java deleted file mode 100644 index 0345b19ef6..0000000000 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/ClientTokenService.java +++ /dev/null @@ -1,115 +0,0 @@ -package app.revanced.extension.spotify.misc.fix; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.spotify.misc.fix.clienttoken.data.v0.ClienttokenHttp.*; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; - -import static app.revanced.extension.spotify.misc.fix.Constants.*; - -class ClientTokenService { - private static final String IOS_CLIENT_ID = "58bd3c95768941ea9eb4350aaa033eb3"; - private static final String IOS_USER_AGENT; - - static { - String clientVersion = getClientVersion(); - int commitHashIndex = clientVersion.lastIndexOf("."); - String version = clientVersion.substring( - clientVersion.indexOf("-") + 1, - clientVersion.lastIndexOf(".", commitHashIndex - 1) - ); - - IOS_USER_AGENT = "Spotify/" + version + " iOS/" + getSystemVersion() + " (" + getHardwareMachine() + ")"; - } - - private static final ConnectivitySdkData.Builder IOS_CONNECTIVITY_SDK_DATA = - ConnectivitySdkData.newBuilder() - .setPlatformSpecificData(PlatformSpecificData.newBuilder() - .setIos(NativeIOSData.newBuilder() - .setHwMachine(getHardwareMachine()) - .setSystemVersion(getSystemVersion()) - ) - ); - - private static final ClientDataRequest.Builder IOS_CLIENT_DATA_REQUEST = - ClientDataRequest.newBuilder() - .setClientVersion(getClientVersion()) - .setClientId(IOS_CLIENT_ID); - - private static final ClientTokenRequest.Builder IOS_CLIENT_TOKEN_REQUEST = - ClientTokenRequest.newBuilder() - .setRequestType(ClientTokenRequestType.REQUEST_CLIENT_DATA_REQUEST); - - - @NonNull - static ClientTokenRequest newIOSClientTokenRequest(String deviceId) { - Logger.printInfo(() -> "Creating new iOS client token request with device ID: " + deviceId); - - return IOS_CLIENT_TOKEN_REQUEST - .setClientData(IOS_CLIENT_DATA_REQUEST - .setConnectivitySdkData(IOS_CONNECTIVITY_SDK_DATA - .setDeviceId(deviceId) - ) - ) - .build(); - } - - @Nullable - static ClientTokenResponse getClientTokenResponse(@NonNull ClientTokenRequest request) { - if (request.getRequestType() == ClientTokenRequestType.REQUEST_CLIENT_DATA_REQUEST) { - Logger.printInfo(() -> "Requesting iOS client token"); - String deviceId = request.getClientData().getConnectivitySdkData().getDeviceId(); - request = newIOSClientTokenRequest(deviceId); - } - - ClientTokenResponse response; - try { - response = requestClientToken(request); - } catch (IOException ex) { - Logger.printException(() -> "Failed to handle request", ex); - return null; - } - - return response; - } - - @NonNull - private static ClientTokenResponse requestClientToken(@NonNull ClientTokenRequest request) throws IOException { - HttpURLConnection urlConnection = (HttpURLConnection) new URL(CLIENT_TOKEN_API_URL).openConnection(); - urlConnection.setRequestMethod("POST"); - urlConnection.setDoOutput(true); - urlConnection.setRequestProperty("Content-Type", "application/x-protobuf"); - urlConnection.setRequestProperty("Accept", "application/x-protobuf"); - urlConnection.setRequestProperty("User-Agent", IOS_USER_AGENT); - - byte[] requestArray = request.toByteArray(); - urlConnection.setFixedLengthStreamingMode(requestArray.length); - urlConnection.getOutputStream().write(requestArray); - - try (InputStream inputStream = urlConnection.getInputStream()) { - return ClientTokenResponse.parseFrom(inputStream); - } - } - - @Nullable - static ClientTokenResponse serveClientTokenRequest(@NonNull InputStream inputStream) { - ClientTokenRequest request; - try { - request = ClientTokenRequest.parseFrom(inputStream); - } catch (IOException ex) { - Logger.printException(() -> "Failed to parse request from input stream", ex); - return null; - } - Logger.printInfo(() -> "Request of type: " + request.getRequestType()); - - ClientTokenResponse response = getClientTokenResponse(request); - if (response != null) Logger.printInfo(() -> "Response of type: " + response.getResponseType()); - - return response; - } -} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/Constants.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/Constants.java deleted file mode 100644 index 4928da7adc..0000000000 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/Constants.java +++ /dev/null @@ -1,26 +0,0 @@ -package app.revanced.extension.spotify.misc.fix; - -import androidx.annotation.NonNull; - -class Constants { - static final String CLIENT_TOKEN_API_PATH = "/v1/clienttoken"; - static final String CLIENT_TOKEN_API_URL = "https://clienttoken.spotify.com" + CLIENT_TOKEN_API_PATH; - - // Modified by a patch. Do not touch. - @NonNull - static String getClientVersion() { - return ""; - } - - // Modified by a patch. Do not touch. - @NonNull - static String getSystemVersion() { - return ""; - } - - // Modified by a patch. Do not touch. - @NonNull - static String getHardwareMachine() { - return ""; - } -} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/RequestListener.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/RequestListener.java deleted file mode 100644 index 2de6caa3ee..0000000000 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/RequestListener.java +++ /dev/null @@ -1,94 +0,0 @@ -package app.revanced.extension.spotify.misc.fix; - -import androidx.annotation.NonNull; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.spotify.misc.fix.clienttoken.data.v0.ClienttokenHttp.ClientTokenResponse; -import com.google.protobuf.MessageLite; -import fi.iki.elonen.NanoHTTPD; - -import java.io.ByteArrayInputStream; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; - -import static app.revanced.extension.spotify.misc.fix.ClientTokenService.serveClientTokenRequest; -import static app.revanced.extension.spotify.misc.fix.Constants.CLIENT_TOKEN_API_PATH; -import static fi.iki.elonen.NanoHTTPD.Response.Status.INTERNAL_ERROR; - -class RequestListener extends NanoHTTPD { - RequestListener(int port) { - super(port); - - try { - start(); - } catch (IOException ex) { - Logger.printException(() -> "Failed to start request listener on port " + port, ex); - throw new RuntimeException(ex); - } - } - - @NonNull - @Override - public Response serve(@NonNull IHTTPSession session) { - String uri = session.getUri(); - if (!uri.equals(CLIENT_TOKEN_API_PATH)) return INTERNAL_ERROR_RESPONSE; - - Logger.printInfo(() -> "Serving request for URI: " + uri); - - ClientTokenResponse response = serveClientTokenRequest(getInputStream(session)); - if (response != null) return newResponse(Response.Status.OK, response); - - Logger.printException(() -> "Failed to serve client token request"); - return INTERNAL_ERROR_RESPONSE; - } - - @NonNull - private static InputStream newLimitedInputStream(InputStream inputStream, long contentLength) { - return new FilterInputStream(inputStream) { - private long remaining = contentLength; - - @Override - public int read() throws IOException { - if (remaining <= 0) return -1; - int result = super.read(); - if (result != -1) remaining--; - return result; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - if (remaining <= 0) return -1; - len = (int) Math.min(len, remaining); - int result = super.read(b, off, len); - if (result != -1) remaining -= result; - return result; - } - }; - } - - @NonNull - private static InputStream getInputStream(@NonNull IHTTPSession session) { - long requestContentLength = Long.parseLong(Objects.requireNonNull(session.getHeaders().get("content-length"))); - return newLimitedInputStream(session.getInputStream(), requestContentLength); - } - - private static final Response INTERNAL_ERROR_RESPONSE = newResponse(INTERNAL_ERROR); - - @SuppressWarnings("SameParameterValue") - @NonNull - private static Response newResponse(Response.Status status) { - return newResponse(status, null); - } - - @NonNull - private static Response newResponse(Response.IStatus status, MessageLite messageLite) { - if (messageLite == null) { - return newFixedLengthResponse(status, "application/x-protobuf", null); - } - - byte[] messageBytes = messageLite.toByteArray(); - InputStream stream = new ByteArrayInputStream(messageBytes); - return newFixedLengthResponse(status, "application/x-protobuf", stream, messageBytes.length); - } -} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/SpoofClientPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/SpoofClientPatch.java deleted file mode 100644 index fee58b26c0..0000000000 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/fix/SpoofClientPatch.java +++ /dev/null @@ -1,25 +0,0 @@ -package app.revanced.extension.spotify.misc.fix; - -import app.revanced.extension.shared.Logger; - -@SuppressWarnings("unused") -public class SpoofClientPatch { - private static RequestListener listener; - - /** - * Injection point. Launch requests listener server. - */ - public synchronized static void launchListener(int port) { - if (listener != null) { - Logger.printInfo(() -> "Listener already running on port " + port); - return; - } - - try { - Logger.printInfo(() -> "Launching listener on port " + port); - listener = new RequestListener(port); - } catch (Exception ex) { - Logger.printException(() -> "launchListener failure", ex); - } - } -} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java index 21f1dd3e31..599c397c90 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java @@ -3,6 +3,7 @@ package app.revanced.extension.spotify.shared; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; public final class ComponentFilters { @@ -19,21 +20,26 @@ public final class ComponentFilters { public static final class ResourceIdComponentFilter implements ComponentFilter { public final String resourceName; - public final String resourceType; + public final ResourceType resourceType; // Android resources are always positive, so -1 is a valid sentinel value to indicate it has not been loaded. // 0 is returned when a resource has not been found. private int resourceId = -1; @Nullable private String stringfiedResourceId; + @Deprecated public ResourceIdComponentFilter(String resourceName, String resourceType) { + this(ResourceType.valueOf(resourceType), resourceName); + } + + public ResourceIdComponentFilter(ResourceType resourceType, String resourceName) { this.resourceName = resourceName; this.resourceType = resourceType; } public int getResourceId() { if (resourceId == -1) { - resourceId = Utils.getResourceIdentifier(resourceName, resourceType); + resourceId = Utils.getResourceIdentifier(resourceType, resourceName); } return resourceId; } diff --git a/extensions/spotify/src/main/proto/app/revanced/extension/spotify/misc/fix/clienttoken_http.proto b/extensions/spotify/src/main/proto/app/revanced/extension/spotify/misc/fix/clienttoken_http.proto deleted file mode 100644 index 8e7f242b76..0000000000 --- a/extensions/spotify/src/main/proto/app/revanced/extension/spotify/misc/fix/clienttoken_http.proto +++ /dev/null @@ -1,73 +0,0 @@ -syntax = "proto3"; - -package spotify.clienttoken.data.v0; - -option optimize_for = LITE_RUNTIME; -option java_package = "app.revanced.extension.spotify.misc.fix.clienttoken.data.v0"; - -message ClientTokenRequest { - ClientTokenRequestType request_type = 1; - - oneof request { - ClientDataRequest client_data = 2; - } -} - -enum ClientTokenRequestType { - REQUEST_UNKNOWN = 0; - REQUEST_CLIENT_DATA_REQUEST = 1; - REQUEST_CHALLENGE_ANSWERS_REQUEST = 2; -} - -message ClientDataRequest { - string client_version = 1; - string client_id = 2; - - oneof data { - ConnectivitySdkData connectivity_sdk_data = 3; - } -} - -message ConnectivitySdkData { - PlatformSpecificData platform_specific_data = 1; - string device_id = 2; -} - -message PlatformSpecificData { - oneof data { - NativeIOSData ios = 2; - } -} - -message NativeIOSData { - int32 user_interface_idiom = 1; - bool target_iphone_simulator = 2; - string hw_machine = 3; - string system_version = 4; - string simulator_model_identifier = 5; -} - -message ClientTokenResponse { - ClientTokenResponseType response_type = 1; - - oneof response { - GrantedTokenResponse granted_token = 2; - } -} - -enum ClientTokenResponseType { - RESPONSE_UNKNOWN = 0; - RESPONSE_GRANTED_TOKEN_RESPONSE = 1; - RESPONSE_CHALLENGES_RESPONSE = 2; -} - -message GrantedTokenResponse { - string token = 1; - int32 expires_after_seconds = 2; - int32 refresh_after_seconds = 3; - repeated TokenDomain domains = 4; -} - -message TokenDomain { - string domain = 1; -} diff --git a/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java b/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java index e0e3b6814f..1ddb99ffad 100644 --- a/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java +++ b/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java @@ -10,6 +10,7 @@ import android.os.Environment; import android.provider.MediaStore; import android.webkit.MimeTypeMap; +import app.revanced.extension.shared.ResourceType; import com.strava.mediamodels.data.MediaType; import com.strava.photos.data.Media; @@ -166,7 +167,7 @@ public final class AddMediaDownloadPatch { } private static String getString(String name, String fallback) { - int id = Utils.getResourceIdentifier(name, "string"); + int id = Utils.getResourceIdentifier(ResourceType.STRING, name); return id != 0 ? Utils.getResourceString(id) : fallback; diff --git a/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java b/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java index 73c363ff88..5db5b8b2ff 100644 --- a/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java +++ b/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java @@ -1,14 +1,18 @@ package app.revanced.extension.twitch; +import app.revanced.extension.shared.ResourceType; + public class Utils { /* Called from SettingsPatch smali */ public static int getStringId(String name) { - return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "string"); + return app.revanced.extension.shared.Utils.getResourceIdentifier( + ResourceType.STRING, name); } /* Called from SettingsPatch smali */ public static int getDrawableId(String name) { - return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "drawable"); + return app.revanced.extension.shared.Utils.getResourceIdentifier( + ResourceType.DRAWABLE, name); } } diff --git a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java index edf8571dbc..8886ecbe4d 100644 --- a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java +++ b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java @@ -4,19 +4,21 @@ import static app.revanced.extension.twitch.Utils.getStringId; import android.content.Intent; import android.os.Bundle; + import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; +import java.util.ArrayList; +import java.util.List; + import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.twitch.settings.preference.TwitchPreferenceFragment; import tv.twitch.android.feature.settings.menu.SettingsMenuGroup; import tv.twitch.android.settings.SettingsActivity; -import java.util.ArrayList; -import java.util.List; - /** * Hooks AppCompatActivity to inject a custom {@link TwitchPreferenceFragment}. */ @@ -108,7 +110,7 @@ public class TwitchActivityHook { base.getFragmentManager() .beginTransaction() - .replace(Utils.getResourceIdentifier("fragment_container", "id"), fragment) + .replace(Utils.getResourceIdentifier(ResourceType.ID, "fragment_container"), fragment) .commit(); return true; } diff --git a/extensions/youtube/build.gradle.kts b/extensions/youtube/build.gradle.kts index f84a54a0d3..c7116666bd 100644 --- a/extensions/youtube/build.gradle.kts +++ b/extensions/youtube/build.gradle.kts @@ -6,6 +6,6 @@ dependencies { android { defaultConfig { - minSdk = 26 + minSdk = 23 } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java index 5fa4836ccc..57531bf462 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java @@ -528,14 +528,8 @@ public final class AlternativeThumbnailsPatch { * Cache used to verify if an alternative thumbnails exists for a given video id. */ @GuardedBy("itself") - private static final Map altVideoIdLookup = new LinkedHashMap<>(100) { - private static final int CACHE_LIMIT = 1000; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit. - } - }; + private static final Map altVideoIdLookup = + Utils.createSizeRestrictedMap(1000); private static VerifiedQualities getVerifiedQualities(@NonNull String videoId, boolean returnNullIfDoesNotExist) { synchronized (altVideoIdLookup) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java index 8d74621192..ca6bf43b12 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java @@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -50,7 +51,7 @@ public class ChangeHeaderPatch { return null; } - final int identifier = Utils.getResourceIdentifier(attributeName, "attr"); + final int identifier = Utils.getResourceIdentifier(ResourceType.ATTR, attributeName); if (identifier == 0) { // Should never happen. Logger.printException(() -> "Could not find attribute: " + drawableName); @@ -71,7 +72,7 @@ public class ChangeHeaderPatch { ? "_dark" : "_light"); - final int identifier = Utils.getResourceIdentifier(drawableFullName, "drawable"); + final int identifier = Utils.getResourceIdentifier(ResourceType.DRAWABLE, drawableFullName); if (identifier != 0) { return Utils.getContext().getDrawable(identifier); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java index e953a74cf6..4114d525c9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java @@ -21,7 +21,7 @@ public final class DownloadsPatch { /** * Injection point. */ - public static void activityCreated(Activity mainActivity) { + public static void setMainActivity(Activity mainActivity) { activityRef = new WeakReference<>(mainActivity); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java new file mode 100644 index 0000000000..e3bf0478a8 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java @@ -0,0 +1,24 @@ +package app.revanced.extension.youtube.patches; + +import java.util.Map; + +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public class FixContentProviderPatch { + + /** + * Injection point. + */ + public static void removeNullMapEntries(Map map) { + map.entrySet().removeIf(entry -> { + Object value = entry.getValue(); + if (value == null) { + Logger.printDebug(() -> "Removing content provider key with null value: " + entry.getKey()); + return true; + } + return false; + }); + } +} + diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index 7bf99f4798..a4c23aa11e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -7,6 +7,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -29,6 +30,15 @@ public final class HidePlayerOverlayButtonsPatch { return Settings.HIDE_CAST_BUTTON.get() ? View.GONE : original; } + /** + * Injection point. + */ + public static boolean getCastButtonOverrideV2(boolean original) { + if (Settings.HIDE_CAST_BUTTON.get()) return false; + + return original; + } + /** * Injection point. */ @@ -40,10 +50,10 @@ public final class HidePlayerOverlayButtonsPatch { = Settings.HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS.get(); private static final int PLAYER_CONTROL_PREVIOUS_BUTTON_TOUCH_AREA_ID = getResourceIdentifierOrThrow( - "player_control_previous_button_touch_area", "id"); + ResourceType.ID, "player_control_previous_button_touch_area"); private static final int PLAYER_CONTROL_NEXT_BUTTON_TOUCH_AREA_ID = getResourceIdentifierOrThrow( - "player_control_next_button_touch_area", "id"); + ResourceType.ID, "player_control_next_button_touch_area"); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java index 98065d7ec0..521e7812b0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java @@ -4,7 +4,17 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class HideSeekbarPatch { + /** + * Injection point. + */ public static boolean hideSeekbar() { return Settings.HIDE_SEEKBAR.get(); } + + /** + * Injection point. + */ + public static boolean useFullscreenLargeSeekbar(boolean original) { + return Settings.FULLSCREEN_LARGE_SEEKBAR.get(); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index ac05e1540d..f24108b97f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.youtube.settings.Settings; @@ -115,7 +116,7 @@ public final class MiniplayerPatch { * Resource is not present in older targets, and this field will be zero. */ private static final int MODERN_OVERLAY_SUBTITLE_TEXT - = Utils.getResourceIdentifier("modern_miniplayer_subtitle_text", "id"); + = Utils.getResourceIdentifier(ResourceType.ID, "modern_miniplayer_subtitle_text"); private static final MiniplayerType CURRENT_TYPE = Settings.MINIPLAYER_TYPE.get(); @@ -378,6 +379,19 @@ public final class MiniplayerPatch { return original; } + /** + * Injection point. + */ + public static boolean allowBoldIcons(boolean original) { + if (CURRENT_TYPE == MINIMAL) { + // Minimal player does not have the correct pause/play icon (it's too large). + // Use the non bold icons instead. + return false; + } + + return original; + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java index 7021cc6f9f..76a3156596 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java @@ -5,12 +5,11 @@ import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButt import android.os.Build; import android.view.View; +import android.widget.TextView; import java.util.EnumMap; import java.util.Map; -import android.widget.TextView; - import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -30,13 +29,13 @@ public final class NavigationButtonsPatch { private static final boolean SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = Settings.SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON.get(); - private static final Boolean DISABLE_TRANSLUCENT_STATUS_BAR + private static final boolean DISABLE_TRANSLUCENT_STATUS_BAR = Settings.DISABLE_TRANSLUCENT_STATUS_BAR.get(); - private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT.get(); - private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); /** @@ -62,6 +61,13 @@ public final class NavigationButtonsPatch { hideViewUnderCondition(Settings.HIDE_NAVIGATION_BUTTON_LABELS, navigationLabelsView); } + /** + * Injection point. + */ + public static boolean useAnimatedNavigationButtons(boolean original) { + return Settings.NAVIGATION_BAR_ANIMATIONS.get(); + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java index e0a1e3c700..02fc01c9fa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java @@ -20,15 +20,6 @@ public class OpenShortsInRegularPlayerPatch { REGULAR_PLAYER_FULLSCREEN } - static { - if (!VersionCheckPatch.IS_19_46_OR_GREATER - && Settings.SHORTS_PLAYER_TYPE.get() == ShortsPlayerType.REGULAR_PLAYER_FULLSCREEN) { - // User imported newer settings to an older app target. - Logger.printInfo(() -> "Resetting " + Settings.SHORTS_PLAYER_TYPE); - Settings.SHORTS_PLAYER_TYPE.resetToDefault(); - } - } - private static WeakReference mainActivityRef = new WeakReference<>(null); private static volatile boolean overrideBackPressToExit; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java index ff2d778741..9a7989d9a1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java @@ -24,18 +24,20 @@ public class OpenVideosFullscreenHookPatch { /** * Injection point. + * + * Returns negated value. */ - public static boolean openVideoFullscreenPortrait(boolean original) { + public static boolean doNotOpenVideoFullscreenPortrait(boolean original) { Boolean openFullscreen = openNextVideoFullscreen; if (openFullscreen != null) { openNextVideoFullscreen = null; - return openFullscreen; + return !openFullscreen; } if (!isFullScreenPatchIncluded()) { return original; } - return Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); + return !Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java index a969996837..be7fe91190 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java @@ -42,7 +42,7 @@ public class PlayerControlsPatch { Logger.printDebug(() -> "fullscreen button visibility: " + (visibility == View.VISIBLE ? "VISIBLE" : - visibility == View.GONE ? "GONE" : "INVISIBLE")); + visibility == View.GONE ? "GONE" : "INVISIBLE")); fullscreenButtonVisibilityChanged(visibility == View.VISIBLE); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java index 0260b2c69d..6f2ea968d2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java @@ -1,19 +1,29 @@ package app.revanced.extension.youtube.patches; import android.app.AlertDialog; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; -/** @noinspection unused*/ +@SuppressWarnings("unused") public class RemoveViewerDiscretionDialogPatch { + + /** + * Injection point. + */ public static void confirmDialog(AlertDialog dialog) { - if (!Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) { - // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. - dialog.show(); + if (Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) { + Logger.printDebug(() -> "Clicking alert dialog dismiss button"); + + final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + button.setSoundEffectsEnabled(false); + button.performClick(); return; } - final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); - button.setSoundEffectsEnabled(false); - button.performClick(); + // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. + Logger.printDebug(() -> "Showing alert dialog"); + dialog.show(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index f7c0bee2d3..bb0c7dec9b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -16,7 +16,7 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; -import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilter; +import app.revanced.extension.youtube.patches.litho.ReturnYouTubeDislikeFilter; import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; @@ -131,6 +131,10 @@ public class ReturnYouTubeDislikePatch { String conversionContextString = conversionContext.toString(); + if (Settings.RYD_ENABLED.get()) { // FIXME: Remove this. + Logger.printDebug(() -> "RYD conversion context: " + conversionContext); + } + if (isRollingNumber && !conversionContextString.contains("video_action_bar.e")) { return original; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java index 9e5aff20b1..e7de421368 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java @@ -2,8 +2,6 @@ package app.revanced.extension.youtube.patches; import android.app.Activity; -import androidx.annotation.Nullable; - import java.lang.ref.WeakReference; import java.util.Objects; @@ -78,7 +76,7 @@ public class ShortsAutoplayPatch { /** * Injection point. */ - public static Enum changeShortsRepeatBehavior(@Nullable Enum original) { + public static Enum changeShortsRepeatBehavior(Enum original) { try { final boolean autoplay; @@ -95,19 +93,19 @@ public class ShortsAutoplayPatch { autoplay = Settings.SHORTS_AUTOPLAY.get(); } - final ShortsLoopBehavior behavior = autoplay + Enum overrideBehavior = (autoplay ? ShortsLoopBehavior.SINGLE_PLAY - : ShortsLoopBehavior.REPEAT; + : ShortsLoopBehavior.REPEAT).ytEnumValue; - if (behavior.ytEnumValue != null) { + if (overrideBehavior != null) { Logger.printDebug(() -> { String name = (original == null ? "unknown (null)" : original.name()); - return behavior == original + return overrideBehavior == original ? "Behavior setting is same as original. Using original: " + name - : "Changing Shorts repeat behavior from: " + name + " to: " + behavior.name(); + : "Changing Shorts repeat behavior from: " + name + " to: " + overrideBehavior.name(); }); - return behavior.ytEnumValue; + return overrideBehavior; } if (original == null) { @@ -118,13 +116,12 @@ public class ShortsAutoplayPatch { return unknown; } } catch (Exception ex) { - Logger.printException(() -> "changeShortsRepeatBehavior failure", ex); + Logger.printException(() -> "changeShortsRepeatState failure", ex); } return original; } - /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index 2844b53db7..77d85737b5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -19,5 +19,12 @@ public class VersionCheckPatch { public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00"); @Deprecated public static final boolean IS_19_34_OR_GREATER = isVersionOrGreater("19.34.00"); - public static final boolean IS_19_46_OR_GREATER = isVersionOrGreater("19.46.00"); + + public static final boolean IS_20_21_OR_GREATER = isVersionOrGreater("20.21.00"); + + public static final boolean IS_20_22_OR_GREATER = isVersionOrGreater("20.22.00"); + + public static final boolean IS_20_31_OR_GREATER = isVersionOrGreater("20.31.00"); + + public static final boolean IS_20_37_OR_GREATER = isVersionOrGreater("20.37.00"); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java similarity index 99% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java index 063fc53df1..064a7f7e9b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import static app.revanced.extension.shared.StringRef.str; @@ -8,10 +8,10 @@ import android.view.View; import java.util.List; +import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.StringTrieSearch; -import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; import app.revanced.extension.youtube.settings.Settings; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java similarity index 94% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java index 9c6347c1e9..b47f0939d1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java similarity index 92% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java index bc45b50fa0..557847a00d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java @@ -1,7 +1,8 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; -import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.youtube.patches.VersionCheckPatch; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; import app.revanced.extension.youtube.settings.Settings; @@ -42,7 +43,6 @@ public final class ButtonsFilter extends Filter { addPathCallbacks( likeSubscribeGlow, - bufferFilterPathGroup, new StringFilterGroup( Settings.HIDE_LIKE_DISLIKE_BUTTON, "|segmented_like_dislike_button" @@ -61,6 +61,12 @@ public final class ButtonsFilter extends Filter { ) ); + // FIXME: 20.22+ filtering of the action buttons doesn't work because + // the buffer is the same for all buttons. + if (!VersionCheckPatch.IS_20_22_OR_GREATER) { + addPathCallbacks(bufferFilterPathGroup); + } + bufferButtonsGroupList.addAll( new ByteArrayFilterGroup( Settings.HIDE_REPORT_BUTTON, @@ -112,11 +118,13 @@ public final class ButtonsFilter extends Filter { } private boolean isEveryFilterGroupEnabled() { - for (var group : pathCallbacks) + for (var group : pathCallbacks) { if (!group.isEnabled()) return false; + } - for (var group : bufferButtonsGroupList) + for (var group : bufferButtonsGroupList) { if (!group.isEnabled()) return false; + } return true; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java similarity index 98% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java index 1196db546f..793eb5f9b0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.*; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java similarity index 98% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java index 42c7d67ab7..771902ccef 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java @@ -1,9 +1,9 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; -import app.revanced.extension.shared.StringTrieSearch; import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.shared.StringTrieSearch; import app.revanced.extension.shared.patches.litho.FilterGroup.*; -import app.revanced.extension.shared.patches.litho.FilterGroupList.*; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/HideInfoCardsFilter.java similarity index 76% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/HideInfoCardsFilter.java index dc9cf8e56e..3a14a052c9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/HideInfoCardsFilter.java @@ -1,8 +1,8 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; +import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.patches.litho.FilterGroup.*; @SuppressWarnings("unused") public final class HideInfoCardsFilter extends Filter { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java similarity index 99% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java index ad9d20e4c1..93fd1734d4 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java similarity index 88% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java index 7d2a202924..16d4c166b3 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java @@ -1,5 +1,6 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; +import static app.revanced.extension.youtube.patches.VersionCheckPatch.IS_20_21_OR_GREATER; import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; import android.graphics.drawable.Drawable; @@ -7,16 +8,17 @@ import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.view.View; -import android.widget.ImageView; +import android.widget.ImageView; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.StringTrieSearch; +import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.patches.litho.FilterGroup.*; -import app.revanced.extension.shared.patches.litho.FilterGroupList.*; +import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.youtube.patches.ChangeHeaderPatch; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.NavigationBar; @@ -51,7 +53,7 @@ public final class LayoutComponentsFilter extends Filter { private final StringFilterGroup compactChannelBarInnerButton; private final ByteArrayFilterGroup joinMembershipButton; private final StringFilterGroup horizontalShelves; - private final ByteArrayFilterGroup ticketShelf; + private final ByteArrayFilterGroup ticketShelfBuffer; private final StringFilterGroup chipBar; private final StringFilterGroup channelProfile; private final ByteArrayFilterGroupList channelProfileBuffer; @@ -210,7 +212,7 @@ public final class LayoutComponentsFilter extends Filter { // Playable horizontal shelf header. playablesBuffer = new ByteArrayFilterGroup( - Settings.HIDE_PLAYABLES, + null, "FEmini_app_destination" ); @@ -296,15 +298,15 @@ public final class LayoutComponentsFilter extends Filter { ); horizontalShelves = new StringFilterGroup( - Settings.HIDE_HORIZONTAL_SHELVES, + null, // Setting is checked in isFiltered() "horizontal_video_shelf.e", "horizontal_shelf.e", "horizontal_shelf_inline.e", "horizontal_tile_shelf.e" ); - ticketShelf = new ByteArrayFilterGroup( - Settings.HIDE_TICKET_SHELF, + ticketShelfBuffer = new ByteArrayFilterGroup( + null, "ticket_item.e" ); @@ -346,7 +348,7 @@ public final class LayoutComponentsFilter extends Filter { @Override public boolean isFiltered(String identifier, String path, byte[] buffer, - StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { // This identifier is used not only in players but also in search results: // https://github.com/ReVanced/revanced-patches/issues/3245 // Until 2024, medical information panels such as Covid 19 also used this identifier and were shown in the search results. @@ -386,9 +388,19 @@ public final class LayoutComponentsFilter extends Filter { } if (matchedGroup == horizontalShelves) { - return contentIndex == 0 && (hideShelves() - || ticketShelf.check(buffer).isFiltered() - || playablesBuffer.check(buffer).isFiltered()); + if (contentIndex != 0) return false; + final boolean hideShelves = Settings.HIDE_HORIZONTAL_SHELVES.get(); + final boolean hideTickets = Settings.HIDE_TICKET_SHELF.get(); + final boolean hidePlayables = Settings.HIDE_PLAYABLES.get(); + + if (!hideShelves && !hideTickets && !hidePlayables) return false; + + // Must always check other buffers first, to prevent incorrectly hiding them + // if they are set to show but hide horizontal shelves is set to hidden. + if (ticketShelfBuffer.check(buffer).isFiltered()) return hideTickets; + if (playablesBuffer.check(buffer).isFiltered()) return hidePlayables; + + return hideShelves && hideShelves(); } if (matchedGroup == chipBar) { @@ -402,20 +414,22 @@ public final class LayoutComponentsFilter extends Filter { * Injection point. * Called from a different place then the other filters. */ - public static boolean filterMixPlaylists(Object conversionContext, @Nullable final byte[] bytes) { + public static boolean filterMixPlaylists(Object conversionContext, @Nullable byte[] buffer) { + // Edit: This hook may no longer be needed, and mix playlist filtering + // might be possible using the existing litho filters. try { if (!Settings.HIDE_MIX_PLAYLISTS.get()) { return false; } - if (bytes == null) { - Logger.printDebug(() -> "bytes is null"); + if (buffer == null) { + Logger.printDebug(() -> "buffer is null"); return false; } - if (mixPlaylists.check(bytes).isFiltered() + if (mixPlaylists.check(buffer).isFiltered() // Prevent hiding the description of some videos accidentally. - && !mixPlaylistsBufferExceptions.check(bytes).isFiltered() + && !mixPlaylistsBufferExceptions.check(buffer).isFiltered() // Prevent playlist items being hidden, if a mix playlist is present in it. // Check last since it requires creating a context string. // @@ -478,11 +492,23 @@ public final class LayoutComponentsFilter extends Filter { : height; } + private static final boolean HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED + = Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS.get(); + /** * Injection point. */ public static void hideInRelatedVideos(View chipView) { - Utils.hideViewBy0dpUnderCondition(Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS, chipView); + // Cannot use 0dp hide with later targets, otherwise the suggested videos + // can be shown in full screen mode. + // This behavior may also be present in earlier app targets. + if (IS_20_21_OR_GREATER) { + // FIXME: The filter bar is still briefly shown when dragging the suggested videos + // below the video player. + Utils.hideViewUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView); + } else { + Utils.hideViewBy0dpUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView); + } } private static final boolean HIDE_DOODLES_ENABLED = Settings.HIDE_DOODLES.get(); @@ -507,6 +533,8 @@ public final class LayoutComponentsFilter extends Filter { && NavigationBar.isSearchBarActive() // Search bar can be active but behind the player. && !PlayerType.getCurrent().isMaximizedOrFullscreen()) { + // FIXME: "Show more" button is visible hidden, + // but an empty space remains that can be clicked. Utils.hideViewByLayoutParams(view); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java similarity index 96% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java index 0dc860fbde..05b2dda470 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.*; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java similarity index 94% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java index 1e23a4db51..a8b88fa8f6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java @@ -1,11 +1,12 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; +import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch; -import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.patches.litho.FilterGroup.*; -import app.revanced.extension.shared.patches.litho.FilterGroupList.*; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.ShortsPlayerState; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java similarity index 87% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java index d10efc5c03..ba1d44d017 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java @@ -1,21 +1,21 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.TrieSearch; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.shared.patches.litho.FilterGroup.*; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; import app.revanced.extension.youtube.patches.ReturnYouTubeDislikePatch; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.TrieSearch; -import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.patches.litho.FilterGroup.*; -import app.revanced.extension.shared.patches.litho.FilterGroupList.*; /** * Searches for video id's in the proto buffer of Shorts dislike. @@ -36,18 +36,7 @@ public final class ReturnYouTubeDislikeFilter extends Filter { * Cannot use {@link LinkedHashSet} because it's missing #removeEldestEntry(). */ @GuardedBy("itself") - private static final Map lastVideoIds = new LinkedHashMap<>() { - /** - * Number of video id's to keep track of for searching thru the buffer. - * A minimum value of 3 should be sufficient, but check a few more just in case. - */ - private static final int NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK = 5; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK; - } - }; + private static final Map lastVideoIds = Utils.createSizeRestrictedMap(5); /** * Injection point. @@ -88,7 +77,7 @@ public final class ReturnYouTubeDislikeFilter extends Filter { @Override public boolean isFiltered(String identifier, String path, byte[] buffer, - StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (!Settings.RYD_ENABLED.get() || !Settings.RYD_SHORTS.get()) { return false; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java similarity index 76% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java index 31b3470c5b..bd07da6a76 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java @@ -1,19 +1,24 @@ -package app.revanced.extension.youtube.patches.components; +package app.revanced.extension.youtube.patches.litho; import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; import android.view.View; +import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.shared.patches.litho.FilterGroup.*; +import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; +import app.revanced.extension.shared.settings.BooleanSetting; import com.google.android.libraries.youtube.rendering.ui.pivotbar.PivotBar; import java.lang.ref.WeakReference; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.patches.litho.FilterGroup.*; -import app.revanced.extension.shared.patches.litho.FilterGroupList.*; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.NavigationBar; import app.revanced.extension.youtube.shared.PlayerType; @@ -21,12 +26,32 @@ import app.revanced.extension.youtube.shared.PlayerType; @SuppressWarnings("unused") public final class ShortsFilter extends Filter { private static final boolean HIDE_SHORTS_NAVIGATION_BAR = Settings.HIDE_SHORTS_NAVIGATION_BAR.get(); - private static final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.e"; + private static final String COMPONENT_TYPE = "ComponentType"; + private static final String[] REEL_ACTION_BAR_PATHS = { + "reel_action_bar.", // Regular Shorts. + "reels_player_overlay_layout." // Shorts ads. + }; + private static final Map REEL_ACTION_BUTTONS_MAP = new HashMap<>() { + { + // Like button and Dislike button can be hidden with Litho filter. + // put(0, Settings.HIDE_SHORTS_LIKE_BUTTON); + // put(1, Settings.HIDE_SHORTS_DISLIKE_BUTTON); + put(2, Settings.HIDE_SHORTS_COMMENTS_BUTTON); + put(3, Settings.HIDE_SHORTS_SHARE_BUTTON); + put(4, Settings.HIDE_SHORTS_REMIX_BUTTON); + } + }; + private final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.e"; /** * For paid promotion label and subscribe button that appears in the channel bar. */ - private static final String REEL_METAPANEL_PATH = "reel_metapanel.e"; + private final String REEL_METAPANEL_PATH = "reel_metapanel.e"; + + /** + * For paid promotion label and subscribe button that appears in the channel bar. + */ + private final String REEL_PLAYER_OVERLAY_PATH = "reel_player_overlay.e"; /** * Tags that appears when opening the Shorts player. @@ -46,6 +71,8 @@ public final class ShortsFilter extends Filter { private final ByteArrayFilterGroup useSoundButtonBuffer; private final StringFilterGroup useTemplateButton; private final ByteArrayFilterGroup useTemplateButtonBuffer; + private final StringFilterGroup reelCarousel; + private final ByteArrayFilterGroup reelCarouselBuffer; private final StringFilterGroup autoDubbedLabel; private final StringFilterGroup subscribeButton; @@ -149,13 +176,15 @@ public final class ShortsFilter extends Filter { StringFilterGroup likeButton = new StringFilterGroup( Settings.HIDE_SHORTS_LIKE_BUTTON, "shorts_like_button.e", - "reel_like_button.e" + "reel_like_button.e", + "reel_like_toggled_button.e" ); StringFilterGroup dislikeButton = new StringFilterGroup( Settings.HIDE_SHORTS_DISLIKE_BUTTON, "shorts_dislike_button.e", - "reel_dislike_button.e" + "reel_dislike_button.e", + "reel_dislike_toggled_button.e" ); StringFilterGroup previewComment = new StringFilterGroup( @@ -174,7 +203,7 @@ public final class ShortsFilter extends Filter { autoDubbedLabel = new StringFilterGroup( Settings.HIDE_SHORTS_AUTO_DUBBED_LABEL, - "badge." + "badge.e" ); joinButton = new StringFilterGroup( @@ -199,6 +228,16 @@ public final class ShortsFilter extends Filter { "reel_action_bar.e" ); + reelCarousel = new StringFilterGroup( + Settings.HIDE_SHORTS_SOUND_METADATA_LABEL, + "reel_carousel.e" + ); + + reelCarouselBuffer = new ByteArrayFilterGroup( + null, + "FEsfv_audio_pivot" + ); + useSoundButton = new StringFilterGroup( Settings.HIDE_SHORTS_USE_SOUND_BUTTON, // First filter needed for "Use this sound" that can appear when viewing Shorts @@ -226,7 +265,11 @@ public final class ShortsFilter extends Filter { videoActionButton = new StringFilterGroup( null, - // Can be simply 'button.e', 'shorts_video_action_button.e' or 'reel_action_button.e' + // Can be any of: + // button.eml + // shorts_video_action_button.eml + // reel_action_button.eml + // reel_pivot_button.eml "button.e" ); @@ -236,32 +279,39 @@ public final class ShortsFilter extends Filter { ); addPathCallbacks( - shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionLabel, autoDubbedLabel, - shortsActionBar, suggestedAction, pausedOverlayButtons, channelBar, previewComment, - fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, infoPanel, - stickers, likeFountain, likeButton, dislikeButton, livePreview + shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionLabel, livePreview, + suggestedAction, pausedOverlayButtons, channelBar, previewComment, autoDubbedLabel, + fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, reelCarousel, + infoPanel, stickers, likeFountain, likeButton, dislikeButton ); - // - // All other action buttons. - // - videoActionButtonBuffer.addAll( - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_COMMENTS_BUTTON, - "reel_comment_button", - "youtube_shorts_comment_outline" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_SHARE_BUTTON, - "reel_share_button", - "youtube_shorts_share_outline" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_REMIX_BUTTON, - "reel_remix_button", - "youtube_shorts_remix_outline" - ) - ); + // Legacy hiding of Shorts action buttons. Because of 20.31+ buffer changes + // it's currently not possible to hide these using buffer filtering. + // See alternative hiding strategy in hideActionButtons(). + if (!VersionCheckPatch.IS_20_22_OR_GREATER) { + addPathCallbacks(shortsActionBar); + + // + // All other action buttons. + // + videoActionButtonBuffer.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_COMMENTS_BUTTON, + "reel_comment_button", + "youtube_shorts_comment_outline" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_SHARE_BUTTON, + "reel_share_button", + "youtube_shorts_share_outline" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_REMIX_BUTTON, + "reel_remix_button", + "youtube_shorts_remix_outline" + ) + ); + } // // Suggested actions. @@ -275,7 +325,8 @@ public final class ShortsFilter extends Filter { ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SHOP_BUTTON, - "yt_outline_bag_" + "yt_outline_bag_", + "yt_outline_experimental_bag_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_TAGGED_PRODUCTS, @@ -285,31 +336,38 @@ public final class ShortsFilter extends Filter { ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_LOCATION_LABEL, - "yt_outline_location_point_" + "yt_outline_location_point_", + "yt_outline_experimental_location_point_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SAVE_SOUND_BUTTON, "yt_outline_bookmark_", // 'Save sound' button. It seems this has been removed and only 'Save music' is used. // Still hide this in case it's still present. - "yt_outline_list_add_" + "yt_outline_list_add_", + "yt_outline_experimental_list_add_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SEARCH_SUGGESTIONS, - "yt_outline_search_" + "yt_outline_search_", + "yt_outline_experimental_search_" + ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SUPER_THANKS_BUTTON, - "yt_outline_dollar_sign_heart_" + "yt_outline_dollar_sign_heart_", + "yt_outline_experimental_dollar_sign_heart_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_USE_TEMPLATE_BUTTON, // "Use this template" can appear in two different places. - "yt_outline_template_add_" + "yt_outline_template_add_", + "yt_outline_experimental_template_add_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_UPCOMING_BUTTON, - "yt_outline_bell_" + "yt_outline_bell_", + "yt_outline_experimental_bell_" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_EFFECT_BUTTON, @@ -322,11 +380,13 @@ public final class ShortsFilter extends Filter { ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_NEW_POSTS_BUTTON, - "yt_outline_box_pencil" + "yt_outline_box_pencil", + "yt_outline_experimental_box_pencil" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_HASHTAG_BUTTON, - "yt_outline_hashtag_" + "yt_outline_hashtag_", + "yt_outline_experimental_hashtag_" ) ); } @@ -343,12 +403,17 @@ public final class ShortsFilter extends Filter { @Override public boolean isFiltered(String identifier, String path, byte[] buffer, - StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (contentType == FilterContentType.PATH) { if (matchedGroup == subscribeButton || matchedGroup == joinButton || matchedGroup == paidPromotionLabel || matchedGroup == autoDubbedLabel) { // Selectively filter to avoid false positive filtering of other subscribe/join buttons. - return path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH); + return path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH) + || path.startsWith(REEL_PLAYER_OVERLAY_PATH); + } + + if (matchedGroup == reelCarousel) { + return reelCarouselBuffer.check(buffer).isFiltered(); } if (matchedGroup == useSoundButton) { @@ -444,6 +509,9 @@ public final class ShortsFilter extends Filter { }; } + /** + * Injection point. + */ public static int getSoundButtonSize(int original) { if (Settings.HIDE_SHORTS_SOUND_BUTTON.get()) { return 0; @@ -452,10 +520,16 @@ public final class ShortsFilter extends Filter { return original; } + /** + * Injection point. + */ public static void setNavigationBar(PivotBar view) { pivotBarRef = new WeakReference<>(view); } + /** + * Injection point. + */ public static void hideNavigationBar(String tag) { if (HIDE_SHORTS_NAVIGATION_BAR) { if (REEL_WATCH_FRAGMENT_INIT_PLAYBACK.contains(tag)) { @@ -470,6 +544,9 @@ public final class ShortsFilter extends Filter { } } + /** + * Injection point. + */ public static int getNavigationBarHeight(int original) { if (HIDE_SHORTS_NAVIGATION_BAR) { return HIDDEN_NAVIGATION_BAR_VERTICAL_HEIGHT; @@ -477,4 +554,4 @@ public final class ShortsFilter extends Filter { return original; } -} +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch.java index 89f221b3be..4a987a6687 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch.java @@ -8,7 +8,7 @@ import android.widget.ListView; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; -import app.revanced.extension.youtube.patches.components.AdvancedVideoQualityMenuFilter; +import app.revanced.extension.youtube.patches.litho.AdvancedVideoQualityMenuFilter; import app.revanced.extension.youtube.settings.Settings; /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java index 0ead14314c..1f726c2a5b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java @@ -21,7 +21,6 @@ public class RememberVideoQualityPatch { private static final IntegerSetting shortsQualityWifi = Settings.SHORTS_QUALITY_DEFAULT_WIFI; private static final IntegerSetting shortsQualityMobile = Settings.SHORTS_QUALITY_DEFAULT_MOBILE; - public static boolean shouldRememberVideoQuality() { BooleanSetting preference = ShortsPlayerState.isOpen() ? Settings.REMEMBER_SHORTS_QUALITY_LAST_SELECTED diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java index 32c8354649..198a05c1c8 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java @@ -32,7 +32,7 @@ import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ui.Dim; import app.revanced.extension.shared.ui.SheetBottomDialog; import app.revanced.extension.youtube.patches.VideoInformation; -import app.revanced.extension.youtube.patches.components.PlaybackSpeedMenuFilter; +import app.revanced.extension.youtube.patches.litho.PlaybackSpeedMenuFilter; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; import kotlin.Unit; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java new file mode 100644 index 0000000000..0b74f45e85 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java @@ -0,0 +1,85 @@ +package app.revanced.extension.youtube.patches.theme; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import app.revanced.extension.shared.ResourceType; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; + +/** + * Dynamic drawable that is either the regular or bolded ReVanced preference icon. + * + * This is needed because the YouTube ReVanced preference intent is an AndroidX preference, + * and AndroidX classes are not built into Android which makes programmatically changing + * the preference thru patching overly complex. This solves the problem by using a drawable + * wrapper to dynamically pick which icon drawable to use at runtime. + */ +@SuppressWarnings("unused") +public class ReVancedSettingsIconDynamicDrawable extends Drawable { + + private final Drawable icon; + + public ReVancedSettingsIconDynamicDrawable() { + final int resId = Utils.getResourceIdentifier(ResourceType.DRAWABLE, + Utils.appIsUsingBoldIcons() + ? "revanced_settings_icon_bold" + : "revanced_settings_icon" + ); + + icon = Utils.getContext().getDrawable(resId); + } + + @Override + public void draw(@NonNull Canvas canvas) { + icon.draw(canvas); + } + + @Override + public void setAlpha(int alpha) { + icon.setAlpha(alpha); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + icon.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return icon.getOpacity(); + } + + @Override + public int getIntrinsicWidth() { + return icon.getIntrinsicWidth(); + } + + @Override + public int getIntrinsicHeight() { + return icon.getIntrinsicHeight(); + } + + @Override + public void setBounds(int left, int top, int right, int bottom) { + super.setBounds(left, top, right, bottom); + icon.setBounds(left, top, right, bottom); + } + + @Override + public void setBounds(@NonNull Rect bounds) { + super.setBounds(bounds); + icon.setBounds(bounds); + } + + @Override + public void onBoundsChange(@NonNull Rect bounds) { + super.onBoundsChange(bounds); + icon.setBounds(bounds); + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java index 2705767001..29fdb7e884 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java @@ -16,6 +16,7 @@ import java.util.Arrays; import java.util.Scanner; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.settings.Settings; @@ -101,16 +102,6 @@ public final class SeekbarColorPatch { return customSeekbarColor; } - /** - * injection point. - */ - public static boolean useLotteLaunchSplashScreen(boolean original) { - // This method is only used for development purposes to force the old style launch screen. - // Forcing this off on some devices can cause unexplained startup crashes, - // where the lottie animation is still used even though this condition appears to bypass it. - return original; // false = drawable style, true = lottie style. - } - /** * Injection point. * Modern Lottie style animation. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index 0a031b281a..5328fb1071 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -260,7 +260,8 @@ public class ReturnYouTubeDislike { // middle separator String middleSeparatorString = compactLayout ? " " + MIDDLE_SEPARATOR_CHARACTER + " " - : " \u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009 "; // u2009 = 'narrow space' character + : " \u2009\u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009\u2009 "; // u2009 = 'narrow space' + final int shapeInsertionIndex = middleSeparatorString.length() / 2; Spannable middleSeparatorSpan = new SpannableString(middleSeparatorString); ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape()); @@ -555,7 +556,8 @@ public class ReturnYouTubeDislike { if (originalDislikeSpan != null && replacementLikeDislikeSpan != null && spansHaveEqualTextAndColor(original, originalDislikeSpan)) { - Logger.printDebug(() -> "Replacing span with previously created dislike span of data: " + videoId); + Logger.printDebug(() -> "Replacing span: " + original + " with " + + "previously created dislike span of data: " + videoId); return replacementLikeDislikeSpan; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index f8c13b83cf..d2b41b229b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -19,7 +19,7 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerH import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType; import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability; -import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; +import static app.revanced.extension.youtube.patches.litho.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; import static app.revanced.extension.youtube.patches.spoof.SpoofVideoStreamsPatch.SpoofClientAv1Availability; import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle; import static app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController.SponsorBlockDuration; @@ -46,7 +46,7 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrow import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; -import app.revanced.extension.youtube.patches.MiniplayerPatch; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle; @@ -188,7 +188,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, new MiniplayerAnyModernAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerHideOverlayButtonsAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, new MiniplayerHideSubtextsAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, new MiniplayerPatch.MiniplayerHideRewindOrOverlayOpacityAvailability()); + public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, new MiniplayerHideRewindOrOverlayOpacityAvailability()); public static final IntegerSetting MINIPLAYER_WIDTH_DIP = new IntegerSetting("revanced_miniplayer_width_dip", 192, true, new MiniplayerAnyModernAvailability()); public static final IntegerSetting MINIPLAYER_OPACITY = new IntegerSetting("revanced_miniplayer_opacity", 100, true, new MiniplayerHideRewindOrOverlayOpacityAvailability()); @@ -284,6 +284,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true); public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); + public static final BooleanSetting NAVIGATION_BAR_ANIMATIONS = new BooleanSetting("revanced_navigation_bar_animations", FALSE); public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true, "revanced_disable_translucent_status_bar_user_dialog_message"); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); @@ -337,6 +338,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", FALSE); public static final BooleanSetting HIDE_SEEKBAR = new BooleanSetting("revanced_hide_seekbar", FALSE, true); public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE, true); + public static final BooleanSetting FULLSCREEN_LARGE_SEEKBAR = new BooleanSetting("revanced_fullscreen_large_seekbar", FALSE); public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE); public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE); public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE); @@ -472,6 +474,13 @@ public class Settings extends YouTubeAndMusicSettings { static { // region Migration + // 20.37+ YT removed parts of the code for the legacy tablet miniplayer. + // This check must remain until the Tablet type is eventually removed. + if (VersionCheckPatch.IS_20_37_OR_GREATER && MINIPLAYER_TYPE.get() == MiniplayerType.TABLET) { + Logger.printInfo(() -> "Resetting miniplayer tablet type"); + MINIPLAYER_TYPE.resetToDefault(); + } + // Migrate renamed change header enums. if (HEADER_LOGO.get() == HeaderLogo.REVANCED) { HEADER_LOGO.save(HeaderLogo.ROUNDED); @@ -514,6 +523,14 @@ public class Settings extends YouTubeAndMusicSettings { SPOOF_APP_VERSION.resetToDefault(); } + if (!BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() && SPOOF_APP_VERSION.get() + && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) { + Logger.printInfo(() -> "Temporarily disabling bold icons that don't work with old spoof targets"); + // Don't save and only temporarily overwrite the value so + // if spoofing is turned off the old setting value is used. + BooleanSetting.privateSetValue(BaseSettings.SETTINGS_DISABLE_BOLD_ICONS, false); + } + // VR 1.61 is not selectable in the settings, and it's selected by spoof stream patch if needed. if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_1_61_48) { SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java index 316e3f0bb6..0d7e1c70de 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java @@ -7,6 +7,7 @@ import android.preference.PreferenceFragment; import android.view.View; import android.widget.Toolbar; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; import app.revanced.extension.youtube.patches.VersionCheckPatch; @@ -15,11 +16,28 @@ import app.revanced.extension.youtube.settings.preference.YouTubePreferenceFragm import app.revanced.extension.youtube.settings.search.YouTubeSearchViewController; /** - * Hooks LicenseActivity to inject a custom {@link YouTubePreferenceFragment} with a toolbar and search functionality. + * Hooks LicenseActivity to inject a custom {@link YouTubePreferenceFragment} + * with a toolbar and search functionality. */ @SuppressWarnings("deprecation") public class YouTubeActivityHook extends BaseActivityHook { + /** + * How much time has passed since the first launch of the app. Simple check to prevent + * forcing bold icons on first launch where the settings menu is partially broken + * due to missing icon resources the client has not yet received. + */ + private static final long MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS = 30 * 1000; // 30 seconds. + + private static final boolean USE_BOLD_ICONS = VersionCheckPatch.IS_20_31_OR_GREATER + && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get() + && (System.currentTimeMillis() - Settings.FIRST_TIME_APP_LAUNCHED.get()) + > MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS; + + static { + Utils.setAppIsUsingBoldIcons(USE_BOLD_ICONS); + } + private static int currentThemeValueOrdinal = -1; // Must initially be a non-valid enum ordinal value. /** @@ -44,15 +62,7 @@ public class YouTubeActivityHook extends BaseActivityHook { final var theme = Utils.isDarkModeEnabled() ? "Theme.YouTube.Settings.Dark" : "Theme.YouTube.Settings"; - activity.setTheme(Utils.getResourceIdentifierOrThrow(theme, "style")); - } - - /** - * Returns the resource ID for the YouTube settings layout. - */ - @Override - protected int getContentViewResourceId() { - return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; + activity.setTheme(Utils.getResourceIdentifierOrThrow(ResourceType.STYLE, theme)); } /** @@ -155,4 +165,12 @@ public class YouTubeActivityHook extends BaseActivityHook { public static boolean handleBackPress() { return YouTubeSearchViewController.handleFinish(searchViewController); } + + /** + * Injection point. + */ + @SuppressWarnings("unused") + public static boolean useBoldIcons(boolean original) { + return USE_BOLD_ICONS; + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index 17a509f00e..52d2f1dcf4 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -19,8 +19,10 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -72,7 +74,7 @@ public final class NavigationBar { */ public static boolean isSearchBarActive() { View searchbarResults = searchBarResultsRef.get(); - return searchbarResults != null && searchbarResults.getParent() != null; + return searchbarResults != null && searchbarResults.isShown(); } public static boolean isBackButtonVisible() { @@ -277,12 +279,14 @@ public final class NavigationBar { } /** - * Use the bundled non cairo filled icon instead of a custom icon. - * Use the old non cairo filled icon, which is almost identical to - * the what would be the filled cairo icon. + * Custom cairo notification filled icon to fix unpatched app missing resource. */ - private static final int fillBellCairoBlack = Utils.getResourceIdentifier( - "yt_fill_bell_black_24", "drawable"); + private static final int fillBellCairoBlack = Utils.getResourceIdentifier(ResourceType.DRAWABLE, + // The bold cairo notification filled icon is present, + // but YT still has not fixed the icon not associated to the enum. + VersionCheckPatch.IS_20_31_OR_GREATER && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? "yt_fill_experimental_bell_vd_theme_24" + : "revanced_fill_bell_cairo_black_24"); /** * Injection point. @@ -290,13 +294,12 @@ public final class NavigationBar { */ @SuppressWarnings({"unchecked", "rawtypes"}) public static void setCairoNotificationFilledIcon(EnumMap enumMap, Enum tabActivityCairo) { - if (fillBellCairoBlack != 0) { - // Show a popup informing this fix is no longer needed to those who might care. - if (BaseSettings.DEBUG.get() && enumMap.containsKey(tabActivityCairo)) { - Logger.printException(() -> "YouTube fixed the cairo notification icons"); - } - enumMap.putIfAbsent(tabActivityCairo, fillBellCairoBlack); + // Show a popup informing this fix is no longer needed to those who might care. + if (BaseSettings.DEBUG.get() && enumMap.containsKey(tabActivityCairo)) { + Logger.printException(() -> "YouTube fixed the notification icons"); } + + enumMap.putIfAbsent(tabActivityCairo, fillBellCairoBlack); } public enum NavigationButton { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt index 26745755db..f5c51c5f39 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt @@ -3,6 +3,7 @@ package app.revanced.extension.youtube.shared import android.app.Activity import android.view.View import android.view.ViewGroup +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.Utils import java.lang.ref.WeakReference @@ -19,13 +20,13 @@ class PlayerControlsVisibilityObserverImpl( * id of the direct parent of controls_layout, R.id.youtube_controls_overlay */ private val controlsLayoutParentId = - Utils.getResourceIdentifier(activity, "youtube_controls_overlay", "id") + Utils.getResourceIdentifier(activity, ResourceType.ID, "youtube_controls_overlay") /** * id of R.id.controls_layout */ private val controlsLayoutId = - Utils.getResourceIdentifier(activity, "controls_layout", "id") + Utils.getResourceIdentifier(activity, ResourceType.ID, "controls_layout") /** * reference to the controls layout view diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt index 147abc13f0..0b97b05c6e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt @@ -2,7 +2,6 @@ package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger import app.revanced.extension.youtube.Event -import app.revanced.extension.youtube.patches.VideoInformation /** * Regular player type. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java index d903922a13..f4d5d5f62a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java @@ -24,7 +24,6 @@ import android.widget.TextView; import androidx.annotation.Nullable; import java.lang.ref.WeakReference; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -150,9 +149,9 @@ public class SegmentPlaybackController { private static long skipSegmentButtonEndTime; @Nullable private static String timeWithoutSegments; - private static int sponsorBarAbsoluteLeft; - private static int sponsorAbsoluteBarRight; - private static int sponsorBarThickness; + private static int seekbarAbsoluteLeft; + private static int seekbarAbsoluteRight; + private static int seekbarThickness; @Nullable private static SponsorSegment lastSegmentSkipped; @@ -908,31 +907,13 @@ public class SegmentPlaybackController { * injection point. */ @SuppressWarnings("unused") - public static void setSponsorBarRect(Object self) { - try { - Field field = self.getClass().getDeclaredField("replaceMeWithsetSponsorBarRect"); - field.setAccessible(true); - Rect rect = (Rect) Objects.requireNonNull(field.get(self)); - setSponsorBarAbsoluteLeft(rect); - setSponsorBarAbsoluteRight(rect); - } catch (Exception ex) { - Logger.printException(() -> "setSponsorBarRect failure", ex); - } - } - - private static void setSponsorBarAbsoluteLeft(Rect rect) { - final int left = rect.left; - if (sponsorBarAbsoluteLeft != left) { - Logger.printDebug(() -> "setSponsorBarAbsoluteLeft: " + left); - sponsorBarAbsoluteLeft = left; - } - } - - private static void setSponsorBarAbsoluteRight(Rect rect) { - final int right = rect.right; - if (sponsorAbsoluteBarRight != right) { - Logger.printDebug(() -> "setSponsorBarAbsoluteRight: " + right); - sponsorAbsoluteBarRight = right; + public static void setSeekbarRectangle(Rect seekbarRect) { + final int left = seekbarRect.left; + final int right = seekbarRect.right; + if (seekbarAbsoluteLeft != left || seekbarAbsoluteRight != right) { + Logger.printDebug(() -> "setSeekbarRectangle left: " + left + " right: " + right); + seekbarAbsoluteLeft = left; + seekbarAbsoluteRight = right; } } @@ -940,8 +921,8 @@ public class SegmentPlaybackController { * injection point. */ @SuppressWarnings("unused") - public static void setSponsorBarThickness(int thickness) { - sponsorBarThickness = thickness; + public static void setSeekbarThickness(int thickness) { + seekbarThickness = thickness; } /** @@ -951,8 +932,7 @@ public class SegmentPlaybackController { public static String appendTimeWithoutSegments(String totalTime) { try { if (Settings.SB_ENABLED.get() && Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get() - && !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments) - && !isAdProgressTextVisible()) { + && !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)) { // Force LTR layout, to match the same LTR video time/length layout YouTube uses for all languages return "\u202D" + totalTime + timeWithoutSegments; // u202D = left to right override } @@ -980,6 +960,7 @@ public class SegmentPlaybackController { continue; } foundNonhighlightSegments = true; + long start = segment.start; final long end = segment.end; // To prevent nested segments from incorrectly counting additional time, @@ -1011,17 +992,17 @@ public class SegmentPlaybackController { * Injection point. */ @SuppressWarnings("unused") - public static void drawSponsorTimeBars(final Canvas canvas, final float posY) { + public static void drawSegmentTimeBars(final Canvas canvas, final float posY) { try { - if (segments == null || isAdProgressTextVisible()) return; + if (segments == null) return; final long videoLength = VideoInformation.getVideoLength(); if (videoLength <= 0) return; - final int thicknessDiv2 = sponsorBarThickness / 2; // rounds down - final float top = posY - (sponsorBarThickness - thicknessDiv2); + final int thicknessDiv2 = seekbarThickness / 2; // Rounds down. + final float top = posY - (seekbarThickness - thicknessDiv2); final float bottom = posY + thicknessDiv2; - final float videoMillisecondsToPixels = (1f / videoLength) * (sponsorAbsoluteBarRight - sponsorBarAbsoluteLeft); - final float leftPadding = sponsorBarAbsoluteLeft; + final float videoMillisecondsToPixels = (1f / videoLength) * (seekbarAbsoluteRight - seekbarAbsoluteLeft); + final float leftPadding = seekbarAbsoluteLeft; for (SponsorSegment segment : segments) { final float left = leftPadding + segment.start * videoMillisecondsToPixels; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java index 99dbf7e185..6307aca674 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java @@ -1,16 +1,26 @@ package app.revanced.extension.youtube.sponsorblock.ui; import android.view.View; +import android.widget.ImageView; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; +import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; import app.revanced.extension.youtube.videoplayer.PlayerControlButton; @SuppressWarnings("unused") public class CreateSegmentButton { + + private static final int DRAWABLE_SB_LOGO = Utils.getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, Utils.appIsUsingBoldIcons() + ? "revanced_sb_logo_bold" + : "revanced_sb_logo" + ); + @Nullable private static PlayerControlButton instance; @@ -31,6 +41,14 @@ public class CreateSegmentButton { v -> SponsorBlockViewController.toggleNewSegmentLayoutVisibility(), null ); + + // FIXME: Bold YT player icons are currently forced off. + // Enable this logic when the new player icons are not forced off. + ImageView icon = Utils.getChildViewByResourceName(controlsView, + "revanced_sb_create_segment_button"); + if (false) { + icon.setImageResource(DRAWABLE_SB_LOGO); + } } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java index f56281c22a..ea3204aa93 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java @@ -16,6 +16,7 @@ import android.widget.ImageButton; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ui.Dim; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; @@ -45,8 +46,8 @@ public final class NewSegmentLayout extends FrameLayout { final int defStyleAttr, final int defStyleRes) { super(context, attributeSet, defStyleAttr, defStyleRes); - LayoutInflater.from(context).inflate( - getResourceIdentifierOrThrow(context, "revanced_sb_new_segment", "layout"), this, true + LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow(context, + ResourceType.LAYOUT, "revanced_sb_new_segment"), this, true ); initializeButton( @@ -105,7 +106,7 @@ public final class NewSegmentLayout extends FrameLayout { */ private void initializeButton(final Context context, final String resourceIdentifierName, final ButtonOnClickHandlerFunction handler, final String debugMessage) { - ImageButton button = findViewById(getResourceIdentifierOrThrow(context, resourceIdentifierName, "id")); + ImageButton button = findViewById(getResourceIdentifierOrThrow(context, ResourceType.ID, resourceIdentifierName)); // Add ripple effect RippleDrawable rippleDrawable = new RippleDrawable( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java index f7552b4cf8..9573102f32 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java @@ -21,6 +21,7 @@ import androidx.annotation.NonNull; import java.util.Objects; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; @@ -57,11 +58,10 @@ public class SkipSponsorButton extends FrameLayout { public SkipSponsorButton(Context context, AttributeSet attributeSet, int defStyleAttr, int defStyleRes) { super(context, attributeSet, defStyleAttr, defStyleRes); - LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow(context, - "revanced_sb_skip_sponsor_button", "layout"), this, true); // layout:skip_ad_button + LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow(context, ResourceType.LAYOUT, "revanced_sb_skip_sponsor_button"), this, true); // layout:skip_ad_button setMinimumHeight(getResourceDimensionPixelSize("ad_skip_ad_button_min_height")); // dimen:ad_skip_ad_button_min_height skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifierOrThrow( - context, "revanced_sb_skip_sponsor_button_container", "id"))); // id:skip_ad_button_container + context, ResourceType.ID, "revanced_sb_skip_sponsor_button_container"))); // id:skip_ad_button_container background = new Paint(); background.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color); @@ -72,7 +72,7 @@ public class SkipSponsorButton extends FrameLayout { border.setStrokeWidth(getResourceDimension("ad_skip_ad_button_border_width")); // dimen:ad_skip_ad_button_border_width); border.setStyle(Paint.Style.STROKE); - skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_text", "id"))); // id:skip_ad_button_text; + skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, ResourceType.ID, "revanced_sb_skip_sponsor_button_text"))); // id:skip_ad_button_text; defaultBottomMargin = getResourceDimensionPixelSize("skip_button_default_bottom_margin"); // dimen:skip_button_default_bottom_margin ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java index a299113ee1..6e2c9e241d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java @@ -1,5 +1,6 @@ package app.revanced.extension.youtube.sponsorblock.ui; +import static app.revanced.extension.shared.Utils.getResourceIdentifier; import static app.revanced.extension.shared.Utils.getResourceIdentifierOrThrow; import android.content.Context; @@ -15,6 +16,7 @@ import java.lang.ref.WeakReference; import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.shared.PlayerType; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; @@ -62,16 +64,17 @@ public class SponsorBlockViewController { Context context = Utils.getContext(); RelativeLayout layout = new RelativeLayout(context); - layout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT)); + layout.setLayoutParams(new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow( - "revanced_sb_inline_sponsor_overlay", "layout"), layout); + ResourceType.LAYOUT, "revanced_sb_inline_sponsor_overlay"), layout); inlineSponsorOverlayRef = new WeakReference<>(layout); viewGroup.addView(layout); viewGroup.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewAdded(View parent, View child) { - // ensure SB buttons and controls are always on top, otherwise the endscreen cards can cover the skip button + // Ensure SB buttons and controls are always on top, otherwise the end-screen cards can cover the skip button. RelativeLayout layout = inlineSponsorOverlayRef.get(); if (layout != null) { layout.bringToFront(); @@ -83,14 +86,14 @@ public class SponsorBlockViewController { }); youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup); - skipHighlightButtonRef = new WeakReference<>(layout.findViewById(getResourceIdentifierOrThrow( - "revanced_sb_skip_highlight_button", "id"))); + skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_highlight_button")))); - skipSponsorButtonRef = new WeakReference<>(layout.findViewById(getResourceIdentifierOrThrow( - "revanced_sb_skip_sponsor_button", "id"))); + skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_sponsor_button")))); - NewSegmentLayout newSegmentLayout = layout.findViewById(getResourceIdentifierOrThrow( - "revanced_sb_new_segment_view", "id")); + NewSegmentLayout newSegmentLayout = Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_new_segment_view"))); newSegmentLayoutRef = new WeakReference<>(newSegmentLayout); newSegmentLayout.updateLayout(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt index 7fafd83a79..dde62492de 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt @@ -8,6 +8,7 @@ import android.view.MotionEvent import android.view.ViewGroup import app.revanced.extension.shared.Logger.printDebug import app.revanced.extension.shared.Logger.printException +import app.revanced.extension.youtube.patches.VersionCheckPatch import app.revanced.extension.youtube.settings.Settings import app.revanced.extension.youtube.shared.PlayerType import app.revanced.extension.youtube.swipecontrols.controller.AudioVolumeController @@ -237,6 +238,8 @@ class SwipeControlsHostActivity : Activity() { */ @Suppress("unused") @JvmStatic - fun allowSwipeChangeVideo(original: Boolean): Boolean = Settings.SWIPE_CHANGE_VIDEO.get() + fun allowSwipeChangeVideo(original: Boolean): Boolean = + // Feature can cause crashing if forced in newer targets. + !VersionCheckPatch.IS_20_22_OR_GREATER && Settings.SWIPE_CHANGE_VIDEO.get() } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt index 2c2edb9591..1a69c7aabe 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt @@ -3,6 +3,7 @@ package app.revanced.extension.youtube.swipecontrols.controller import android.app.Activity import android.util.TypedValue import android.view.ViewGroup +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.Utils import app.revanced.extension.youtube.swipecontrols.misc.Rectangle import app.revanced.extension.youtube.swipecontrols.misc.applyDimension @@ -56,7 +57,8 @@ class SwipeZonesController( /** * id for R.id.player_view */ - private val playerViewId = Utils.getResourceIdentifier(host, "player_view", "id") + private val playerViewId = Utils.getResourceIdentifier( + host, ResourceType.ID, "player_view") /** * current bounding rectangle of the player diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt index 71226c082d..2cec37b823 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt @@ -14,12 +14,13 @@ import android.util.AttributeSet import android.view.HapticFeedbackConstants import android.view.View import android.widget.RelativeLayout +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.StringRef.str import app.revanced.extension.shared.Utils import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider import app.revanced.extension.youtube.swipecontrols.misc.SwipeControlsOverlay -import kotlin.math.min import kotlin.math.max +import kotlin.math.min import kotlin.math.round /** @@ -53,7 +54,7 @@ class SwipeControlsOverlayLayout( // Function to retrieve drawable resources by name. private fun getDrawable(name: String): Drawable { val drawable = resources.getDrawable( - Utils.getResourceIdentifier(context, name, "drawable"), + Utils.getResourceIdentifier(context, ResourceType.DRAWABLE, name), context.theme, ) drawable.setTint(config.overlayTextColor) @@ -86,7 +87,7 @@ class SwipeControlsOverlayLayout( // Initialize horizontal progress bar. val screenWidth = resources.displayMetrics.widthPixels - val layoutWidth = (screenWidth * 4 / 5).toInt() // Cap at ~360dp. + val layoutWidth = (screenWidth * 4 / 5) // Cap at ~360dp. horizontalProgressView = HorizontalProgressView( context, config.overlayBackgroundOpacity, @@ -630,7 +631,7 @@ class VerticalProgressView( if (isMinimalStyle) { canvas.drawText(displayText, textX, textStartY, textPaint) } else { - val progressStartY = (iconEndY + padding).toFloat() + val progressStartY = (iconEndY + padding) val progressEndY = textStartY - textPaint.textSize - padding val progressHeight = progressEndY - progressStartY diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java index 068ede3d27..5b8df3b5e6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java @@ -3,8 +3,11 @@ package app.revanced.extension.youtube.videoplayer; import static app.revanced.extension.shared.StringRef.str; import android.view.View; + import androidx.annotation.Nullable; + import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -14,9 +17,9 @@ public class LoopVideoButton { private static PlayerControlButton instance; private static final int LOOP_VIDEO_ON = Utils.getResourceIdentifierOrThrow( - "revanced_loop_video_button_on", "drawable"); + ResourceType.DRAWABLE, "revanced_loop_video_button_on"); private static final int LOOP_VIDEO_OFF = Utils.getResourceIdentifierOrThrow( - "revanced_loop_video_button_off", "drawable"); + ResourceType.DRAWABLE,"revanced_loop_video_button_off"); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java index e03fa9e531..611c0b7495 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.patches.playback.quality.RememberVideoQualityPatch; diff --git a/gradle.properties b/gradle.properties index 345a486388..74c143b391 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,6 @@ org.gradle.caching = true org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true +android.uniquePackageNames=false kotlin.code.style = official version = 5.51.0-dev.2 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b3d9a0a352..bea84117e6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,35 +1,23 @@ [versions] -revanced-patcher = "21.0.0" +revanced-patcher = "22.0.0" # Tracking https://github.com/google/smali/issues/64. #noinspection GradleDependency -smali = "3.0.5" -# 8.3.0 causes java verifier error: https://github.com/ReVanced/revanced-patches/issues/2818. -#noinspection GradleDependency +smali = "3.0.8" agp = "8.2.2" annotation = "1.9.1" -appcompat = "1.7.0" -okhttp = "5.0.0-alpha.14" -retrofit = "2.11.0" +appcompat = "1.7.1" +okhttp = "5.3.2" +retrofit = "3.0.0" guava = "33.5.0-jre" -protobuf-javalite = "4.32.0" -protoc = "4.32.0" -protobuf = "0.9.5" -antlr4 = "4.13.2" -nanohttpd = "2.3.1" -apksig = "8.10.1" +apksig = "9.0.1" [libraries] annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" } -antlr4 = { module = "org.antlr:antlr4", version.ref = "antlr4" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -nanohttpd = { module = "org.nanohttpd:nanohttpd", version.ref = "nanohttpd" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } -protobuf-javalite = { module = "com.google.protobuf:protobuf-javalite", version.ref = "protobuf-javalite" } -protobuf-protoc = { module = "com.google.protobuf:protoc", version.ref = "protoc" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } guava = { module = "com.google.guava:guava", version.ref = "guava" } apksig = { group = "com.android.tools.build", name = "apksig", version.ref = "apksig" } [plugins] android-library = { id = "com.android.library" } -protobuf = { id = "com.google.protobuf", version.ref = "protobuf" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5205bd7954..37f78a6af8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Mon Jun 16 14:39:32 CEST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/patches/api/patches.api b/patches/api/patches.api index 96f779698e..9d48fa58ce 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1,21 +1,17 @@ -public final class DisableReelsScrollingPatchKt { - public static final fun getDisableReelsScrollingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/activity/exportall/ExportAllActivitiesPatchKt { - public static final fun getExportAllActivitiesPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getExportAllActivitiesPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/all/misc/adb/HideAdbPatchKt { - public static final fun getHideAdbStatusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/all/misc/adb/HideAdbStatusPatchKt { + public static final fun getHideADBStatusPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/appicon/HideAppIconPatchKt { - public static final fun getHideAppIconPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getHideAppIconPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatchKt { - public static final fun baseSpoofBuildInfoPatch (Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun baseSpoofBuildInfoPatch (Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/build/BuildInfo { @@ -49,63 +45,52 @@ public final class app/revanced/patches/all/misc/build/BuildInfo { } public final class app/revanced/patches/all/misc/build/SpoofBuildInfoPatchKt { - public static final fun getSpoofBuildInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofBuildInfoPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/connectivity/location/hide/HideMockLocationPatchKt { - public static final fun getHideMockLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatchKt { - public static final fun getSpoofSimCountryPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideMockLocationPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimProviderPatchKt { - public static final fun getSpoofSimProviderPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofSIMProviderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWifiPatchKt { - public static final fun getSpoofWifiPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofWiFiConnectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatchKt { - public static final fun getCustomNetworkSecurityPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getCustomNetworkSecurityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatchKt { - public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { - public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/hex/HexPatchKt { - public static final fun getHexPatch ()Lapp/revanced/patcher/patch/RawResourcePatch; + public static final fun getHex ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/interaction/gestures/PredictiveBackGesturePatchKt { - public static final fun getPredictiveBackGesturePatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getPredictiveBackGesturePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/network/OverrideCertificatePinningPatchKt { - public static final fun getOverrideCertificatePinningPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getOverrideCertificatePinningPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/packagename/ChangePackageNamePatchKt { - public static field packageNameOption Lapp/revanced/patcher/patch/Option; - public static final fun getChangePackageNamePatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getPackageNameOption ()Lapp/revanced/patcher/patch/Option; + public static final fun getChangePackageNamePatch ()Lapp/revanced/patcher/patch/Patch; public static final fun setOrGetFallbackPackageName (Ljava/lang/String;)Ljava/lang/String; - public static final fun setPackageNameOption (Lapp/revanced/patcher/patch/Option;)V } public final class app/revanced/patches/all/misc/playintegrity/DisablePlayIntegrityKt { - public static final fun getDisablePlayIntegrityPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePlayIntegrityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/resources/AddResourcesPatchKt { @@ -117,31 +102,31 @@ public final class app/revanced/patches/all/misc/resources/AddResourcesPatchKt { public static final fun addResources (Ljava/lang/String;Ljava/util/List;)Z public static synthetic fun addResources$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Z public static synthetic fun addResources$default (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Z - public static final fun getAddResourcesPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getAddResourcesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/screencapture/RemoveScreenCaptureRestrictionPatchKt { - public static final fun getRemoveScreenCaptureRestrictionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveScreenCaptureRestrictionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/screenshot/PreventScreenshotDetectionPatchKt { - public static final fun getPreventScreenshotDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPreventScreenshotDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/screenshot/RemoveScreenshotRestrictionPatchKt { - public static final fun getRemoveScreenshotRestrictionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveScreenshotRestrictionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/shortcut/sharetargets/RemoveShareTargetsPatchKt { - public static final fun getRemoveShareTargetsPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getRemoveShareTargetsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/spoof/EnableRomSignatureSpoofingKt { - public static final fun getEnableRomSignatureSpoofing ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getEnableROMSignatureSpoofingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34Kt { - public static final fun getSetTargetSdkVersion34 ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getSetTargetSDKVersion34Patch ()Lapp/revanced/patcher/patch/Patch; } public abstract interface class app/revanced/patches/all/misc/transformation/IMethodCall { @@ -149,408 +134,371 @@ public abstract interface class app/revanced/patches/all/misc/transformation/IMe public abstract fun getMethodName ()Ljava/lang/String; public abstract fun getMethodParams ()[Ljava/lang/String; public abstract fun getReturnType ()Ljava/lang/String; - public abstract fun replaceInvokeVirtualWithExtension (Ljava/lang/String;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lcom/android/tools/smali/dexlib2/iface/instruction/formats/Instruction35c;I)V + public fun replaceInvokeVirtualWithExtension (Ljava/lang/String;Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Lcom/android/tools/smali/dexlib2/iface/instruction/formats/Instruction35c;I)V } public final class app/revanced/patches/all/misc/transformation/IMethodCall$DefaultImpls { - public static fun replaceInvokeVirtualWithExtension (Lapp/revanced/patches/all/misc/transformation/IMethodCall;Ljava/lang/String;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lcom/android/tools/smali/dexlib2/iface/instruction/formats/Instruction35c;I)V + public static fun replaceInvokeVirtualWithExtension (Lapp/revanced/patches/all/misc/transformation/IMethodCall;Ljava/lang/String;Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Lcom/android/tools/smali/dexlib2/iface/instruction/formats/Instruction35c;I)V } public final class app/revanced/patches/all/misc/transformation/TransformInstructionsPatchKt { - public static final fun transformInstructionsPatch (Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun transformInstructionsPatch (Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/all/misc/versioncode/ChangeVersionCodePatchKt { - public static final fun getChangeVersionCodePatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getChangeVersionCodePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/amazon/DeepLinkingPatchKt { - public static final fun getDeepLinkingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAlwaysAllowDeepLinkingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt { - public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt { - public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt { - public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatchKt { - public static final fun getBypassRootChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBypassRootChecksPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/com/sbs/ondemand/tv/FingerprintsKt { + public static final fun getShouldShowAdvertisingTVMethod (Lapp/revanced/patcher/patch/BytecodePatchContext;)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; } public final class app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatchKt { - public static final fun getRemoveAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/cricbuzz/ads/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/cricbuzz/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/crunchyroll/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/disneyplus/ads/SkipAdsPatchKt { - public static final fun getSkipAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/disneyplus/SkipAdsPatchKt { + public static final fun getSkipAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/duolingo/ad/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatchKt { - public static final fun getEnableDebugMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableDebugMenuPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatchKt { - public static final fun getSkipEnergyRechargeAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSkipEnergyRechargeAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatchKt { - public static final fun getHideSponsoredStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideSponsoredStoriesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/facebook/ads/story/HideStoryAdsPatchKt { - public static final fun getHideStoryAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideStoryAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatchKt { - public static final fun getBootloaderDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBootloaderDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/finanzonline/detection/root/RootDetectionPatchKt { - public static final fun getRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveRootDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/fotmob/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/gmxmail/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/gmxmail/freephone/ForceEnableFreephonePatchKt { - public static final fun getForceEnableFreePhonePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getForceEnableFreePhonePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/gmxmail/layout/HidePremiumUpgradeButtonKt { - public static final fun getHidePremiumUpgradeButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHidePremiumUpgradeButtonPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatchKt { - public static final fun getEnableCustomTabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableCustomTabsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlenews/misc/extension/ExtensionPatchKt { - public static final fun getExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatchKt { - public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatchKt { - public static final fun getEnableDCIMFoldersBackupControlPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableDCIMFoldersBackupControlPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlephotos/misc/extension/ExtensionPatchKt { - public static final fun getExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlephotos/misc/features/SpoofBuildInfoPatchKt { - public static final fun getSpoofBuildInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofBuildInfoPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatchKt { - public static final fun getSpoofFeaturesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofFeaturesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatchKt { - public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt { - public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt { - public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/hexeditor/ad/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatchKt { - public static final fun getRemoveDeviceIntegrityChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/idaustria/detection/root/RootDetectionPatchKt { - public static final fun getRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveDeviceIntegrityChecksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/inshorts/ad/InshortsAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/feed/LimitFeedToFollowedProfilesKt { - public static final fun getLimitFeedToFollowedProfiles ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLimitFeedToFollowedProfilesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatchKt { - public static final fun getAnonymousStoryViewingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAnonymousStoryViewingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/hide/explore/HideExploreFeedKt { - public static final fun getHideExploreFeedPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideExploreFeedPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/hide/highlightsTray/HideHighlightsTrayPatchKt { - public static final fun getHideHighlightsTrayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideHighlightsTrayPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/hide/navigation/HideNavigationButtonsKt { - public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/hide/stories/HideStoriesKt { - public static final fun getHideStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideStoriesFromHomePatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentKt { - public static final fun getHideSuggestedContent ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentPatchKt { + public static final fun getHideSuggestedContentPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatchKt { - public static final fun getEnableDeveloperMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableDeveloperMenuPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/disableAnalytics/DisableAnalyticsPatchKt { - public static final fun getDisableAnalyticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAnalyticsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatchKt { - public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/removeBuildExpiredPopup/RemoveBuildExpiredPopupPatchKt { - public static final fun getRemoveBuildExpiredPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBuildExpiredPopupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatchKt { - public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatchKt { - public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt { - public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableSignatureCheckPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/instagram/reels/DisableReelsScrollingPatchKt { + public static final fun getDisableReelsScrollingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatchKt { - public static final fun getDisableStoryAutoFlippingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableStoryAutoFlippingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/irplus/ad/RemoveAdsPatchKt { - public static final fun getRemoveAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/kleinanzeigen/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/kleinanzeigen/hide_pur/HidePurPatchKt { - public static final fun getHidePurPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHidePurPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/letterboxd/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatchKt { - public static final fun getUnlockAppIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockAppIconsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatchKt { - public static final fun getDisableMandatoryLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableMandatoryLoginPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/lightroom/misc/version/DisableVersionCheckPatchKt { - public static final fun getDisableVersionCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableVersionCheckPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/memegenerator/detection/license/LicenseValidationPatchKt { - public static final fun getLicenseValidationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLicenseValidationPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatchKt { - public static final fun getSignatureVerificationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSignatureVerificationPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatchKt { - public static final fun getUnlockProVersionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/messenger/inbox/HideInboxAdsPatchKt { - public static final fun getHideInboxAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideInboxAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt { - public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt { - public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt { - public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt { - public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/messenger/metaai/RemoveMetaAIPatchKt { - public static final fun getRemoveMetaAIPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveMetaAIPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt { - public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/meta/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/microsoft/officelens/misc/onedrive/HideOneDriveMigrationPatchKt { - public static final fun getHideOneDriveMigrationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideOneDriveMigrationPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt { - public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/mifitness/misc/login/FixLoginPatchKt { - public static final fun getFixLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixLoginPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/ad/video/HideVideoAdsKt { - public static final fun getHideVideoAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideMusicVideoAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlaybackKt { - public static final fun getEnableExclusiveAudioPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableExclusiveAudioPlaybackPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatchKt { - public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/branding/CustomBrandingPatchKt { - public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/buttons/HideButtonsKt { - public static final fun getHideButtons ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { - public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt { - public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideCategoryBarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColorKt { - public static final fun getChangeMiniplayerColor ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeMiniplayerColorPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/navigationbar/NavigationBarPatchKt { - public static final fun getNavigationBarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getNavigationBarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/premium/HideGetPremiumPatchKt { - public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideGetMusicPremiumPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/layout/theme/ThemePatchKt { - public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatchKt { - public static final fun getHideUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRemoveUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatchKt { - public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getThemePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatchKt { - public static final fun getUnlockAndroidAutoMediaBrowserPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockAndroidAutoMediaBrowserPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatchKt { - public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBackgroundPlaybackRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/debugging/EnableDebuggingPatchKt { - public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatchKt { - public static final fun getCheckWatchHistoryDomainNameResolutionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCheckWatchHistoryDomainNameResolutionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/gms/Constants { @@ -558,15 +506,15 @@ public final class app/revanced/patches/music/misc/gms/Constants { } public final class app/revanced/patches/music/misc/gms/GmsCoreSupportPatchKt { - public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/litho/filter/LithoFilterPatchKt { - public static final fun getLithoFilterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLithoFilterPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/privacy/SanitizeSharingLinksPatchKt { - public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/settings/PreferenceScreen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen { @@ -579,24 +527,24 @@ public final class app/revanced/patches/music/misc/settings/PreferenceScreen : a } public final class app/revanced/patches/music/misc/settings/SettingsPatchKt { - public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun newIntent (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; } public final class app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatchKt { - public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { - public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun is_7_16_or_greater ()Z public static final fun is_7_33_or_greater ()Z public static final fun is_8_05_or_greater ()Z @@ -606,319 +554,311 @@ public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { } public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/myfitnesspal/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatchKt { - public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/nothingx/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/nothingx/misc/logk1token/ShowK1TokenPatchsKt { - public static final fun getShowK1TokensPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getShowK1TokensPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/nunl/ads/FingerprintsKt { + public static final fun getJwPlayerConfigMethod (Lapp/revanced/patcher/patch/BytecodePatchContext;)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; } public final class app/revanced/patches/nunl/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt { - public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { - public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatchKt { - public static final fun getRemoveRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveRootDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/pandora/ads/DisableAudioAdsPatchKt { - public static final fun getDisableAudioAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAudioAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatchKt { - public static final fun getEnableUnlimitedSkipsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableUnlimitedSkipsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/peacocktv/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatchKt { - public static final fun getGetDeviceIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofDeviceIDPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/photomath/detection/signature/SignatureDetectionPatchKt { - public static final fun getSignatureDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSignatureDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatchKt { - public static final fun getHideUpdatePopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideUpdatePopupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatchKt { - public static final fun getEnableBookpointPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableBookpointPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatchKt { - public static final fun getUnlockPlusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockPlusPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatchKt { - public static final fun getSpoofAndroidDeviceIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofAndroidDeviceIDPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/piccomafr/tracking/DisableTrackingPatchKt { - public static final fun getDisableTrackingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableTrackingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/pixiv/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/primevideo/ads/SkipAdsPatchKt { - public static final fun getSkipAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSkipAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/primevideo/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/primevideo/misc/permissions/RenamePermissionsPatchKt { - public static final fun getRenamePermissionsPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getRenameSharedPermissionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/primevideo/video/speed/PlaybackSpeedPatchKt { - public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatchKt { - public static final fun getRemoveFreeAccountsLimitPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getRemoveFreeAccountsLimitPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatchKt { - public static final fun getRemoveSentFromSignaturePatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getRemoveSentFromSignaturePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/protonvpn/delay/RemoveDelayPatchKt { - public static final fun getRemoveDelayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveDelayPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunnelingKt { - public static final fun getUnlockSplitTunnelingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockSplitTunnelingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatchKt { - public static final fun getHidePurchaseReminderPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/reddit/ad/banner/HideBannerPatchKt { - public static final fun getHideBannerPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getHidePurchaseReminderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/ad/comments/HideCommentAdsPatchKt { - public static final fun getHideCommentAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideCommentAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/ad/general/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/FixRedgifsApiPatchKt { public static final field CREATE_NEW_CLIENT_METHOD Ljava/lang/String; public static final field INSTALL_NEW_CLIENT_METHOD Ljava/lang/String; - public static final fun fixRedgifsApiPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun fixRedgifsApiPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun fixRedgifsApiPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun fixRedgifsApiPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/FixSLinksPatchKt { public static final field RESOLVE_S_LINK_METHOD Ljava/lang/String; public static final field SET_ACCESS_TOKEN_METHOD Ljava/lang/String; - public static final fun fixSLinksPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun fixSLinksPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun fixSLinksPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun fixSLinksPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/SpoofClientPatchKt { - public static final fun spoofClientPatch (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun spoofClientPatch$default (Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun spoofClientPatch (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun spoofClientPatch$default (Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatchKt { - public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatchKt { - public static final fun getFixAudioMissingInDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInVideoDownloadsPatchKt { + public static final fun getFixMissingAudioInVideoDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatchKt { - public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatchKt { public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String; - public static final fun getFixSlinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixSlinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/infinityforreddit/subscription/UnlockSubscriptionPatchKt { - public static final fun getUnlockSubscriptionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockSubscriptionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/joeyforreddit/ads/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatchKt { - public static final fun getDisablePiracyDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePiracyDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/redditisfun/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatchKt { - public static final fun disableAdsPatch (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun disableAdsPatch$default (Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun disableAdsPatch (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun disableAdsPatch$default (Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatchKt { - public static final fun getDisablePiracyDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePiracyDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforlemmy/ads/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ads/DisableAdsPatchKt { - public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/DisableSyncForLemmyBottomSheetPatchKt { - public static final fun getDisableSyncForLemmyBottomSheetPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableSyncForLemmyBottomSheetPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatchKt { - public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatchKt { public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String; - public static final fun getFixSLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixSLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatchKt { - public static final fun getFixPostThumbnailsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixPostThumbnailsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatchKt { - public static final fun getUseUserEndpointPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUseUserEndpointPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { - public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { - public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatchKt { - public static final fun getSanitizeUrlQueryPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatchKt { - public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixCrashesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatchKt { - public static final fun getBypassDeviceChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBypassDeviceChecksPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/samsung/radio/restrictions/device/FingerprintsKt { + public static final fun getGetCountryIsoMethodReference ()Lcom/android/tools/smali/dexlib2/immutable/reference/ImmutableMethodReference; + public static final fun getGetSalesCodeMethodReference ()Lcom/android/tools/smali/dexlib2/immutable/reference/ImmutableMethodReference; } public final class app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatchKt { - public static final fun getRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveRootDetectionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/layout/theme/LithoColorHookPatchKt { - public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; } public final class app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatchKt { - public static final fun checkEnvironmentPatch (Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;[Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun checkEnvironmentPatch (Lkotlin/jvm/functions/Function1;Lapp/revanced/patcher/patch/Patch;[Ljava/lang/String;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/extension/ExtensionHook { @@ -926,27 +866,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { } public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun activityOnCreateExtensionHook (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun extensionHook (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/Patch; + public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt { - public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; + public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { - public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; + public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -972,14 +907,11 @@ public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/u } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilderKt { - public static final fun hexPatch (ZLkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/RawResourcePatch; - public static final fun hexPatch (ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/RawResourcePatch; - public static synthetic fun hexPatch$default (ZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch; - public static synthetic fun hexPatch$default (ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch; + public static final fun hexPatch (ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun hexPatch$default (ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/hex/Replacement { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public fun ([B[BLjava/lang/String;)V public final fun getReplacementBytesPadded ()[B } @@ -989,45 +921,83 @@ public final class app/revanced/patches/shared/misc/litho/filter/LithoFilterPatc } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { - public final fun component1 ()Ljava/lang/String; + public fun (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V + public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; - public final fun getType ()Ljava/lang/String; + public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J - public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; + public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { + public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion; + public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public final fun get (Ljava/lang/String;)J + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public final fun invoke (Ljava/lang/String;)Lkotlin/jvm/functions/Function4; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion { + public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; } public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt { - public static final fun getDisableLicenseCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePairipLicenseCheckPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/privacy/DisableSentryTelemetryKt { - public static final fun getDisableSentryTelemetryPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getDisableSentryTelemetryPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V - public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/Patch; + public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; } public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreference { public static final field Companion Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion; - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getIcon ()Ljava/lang/String; + public final fun getIconBold ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String; public final fun getLayout ()Ljava/lang/String; public final fun getSummaryKey ()Ljava/lang/String; @@ -1051,9 +1021,10 @@ public abstract class app/revanced/patches/shared/misc/settings/preference/BaseP public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getIcon ()Ljava/lang/String; + public final fun getIconBold ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String; public final fun getLayout ()Ljava/lang/String; public final fun getPreferences ()Ljava/util/Set; @@ -1062,8 +1033,8 @@ public abstract class app/revanced/patches/shared/misc/settings/preference/BaseP } public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V - public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public final fun getCategories ()Ljava/util/Set; public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; @@ -1071,8 +1042,8 @@ public class app/revanced/patches/shared/misc/settings/preference/BasePreference } public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen$Category : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory; @@ -1091,8 +1062,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/InputTyp } public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun equals (Ljava/lang/Object;)Z public final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; public fun hashCode ()I @@ -1122,22 +1093,22 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref } public final class app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSelectable ()Z public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public class app/revanced/patches/shared/misc/settings/preference/PreferenceCategory : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public class app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } @@ -1165,8 +1136,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/SummaryT public final class app/revanced/patches/shared/misc/settings/preference/SwitchPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSummaryOffKey ()Ljava/lang/String; public final fun getSummaryOnKey ()Ljava/lang/String; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; @@ -1174,261 +1145,233 @@ public final class app/revanced/patches/shared/misc/settings/preference/SwitchPr public final class app/revanced/patches/shared/misc/settings/preference/TextPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getInputType ()Lapp/revanced/patches/shared/misc/settings/preference/InputType; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt { - public static final fun userAgentClientSpoofPatch (Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun userAgentClientSpoofPatch (Ljava/lang/String;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/shared/misc/string/ReplaceStringPatchKt { - public static final fun replaceStringPatch (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun replaceStringPatch (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatchKt { - public static final fun getRemoveFileSizeLimitPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveFileSizeLimitPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/songpal/badge/BadgeTabPatchKt { - public static final fun getBadgeTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBadgeTabPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/songpal/badge/RemoveNotificationBadgePatchKt { - public static final fun getRemoveNotificationBadgePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveNotificationBadgePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/soundcloud/ad/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/soundcloud/analytics/DisableTelemetryPatchKt { - public static final fun getDisableTelemetryPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableTelemetryPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatchKt { - public static final fun getEnableOfflineSync ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatchKt { - public static final fun getHideCreateButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableOfflineSyncPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt { - public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt { - public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt { - public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { - public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatchKt { - public static final fun getChangeLyricsProviderPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeLyricsProviderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatchKt { - public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgetsKt { - public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { - public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixThirdPartyLaunchersWidgetsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt { - public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/stocard/layout/HideStoryBubblesPatchKt { - public static final fun getHideStoryBubblesPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getHideStoryBubblesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/distractions/HideDistractionsPatchKt { - public static final fun getHideDistractionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideDistractionsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivityKt { - public static final fun getAddGiveGroupKudosButtonToGroupActivity ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivityPatchKt { + public static final fun getAddGiveGroupKudosButtonToGroupActivityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/media/download/AddMediaDownloadPatchKt { - public static final fun getAddMediaDownloadPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAddMediaDownloadPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/media/upload/OverwriteMediaUploadParametersPatchKt { - public static final fun getOverwriteMediaUploadParametersPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOverwriteMediaUploadParametersPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/password/EnablePasswordLoginPatchKt { - public static final fun getEnablePasswordLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnablePasswordLoginPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatchKt { - public static final fun getBlockSnowplowTrackingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBlockSnowplowTrackingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/quickedit/DisableQuickEditPatchKt { - public static final fun getDisableQuickEditPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableQuickEditPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/strava/subscription/UnlockSubscriptionPatchKt { - public static final fun getUnlockSubscriptionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatchKt { - public static final fun getDisableSubscriptionSuggestionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockSubscriptionFeaturesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatchKt { - public static final fun getRemoveGooglePlayIntegrityCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveGooglePlayIntegrityCheckPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/threads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockThemesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/feedfilter/FeedFilterPatchKt { - public static final fun getFeedFilterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFeedFilterPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatchKt { - public static final fun getRememberClearDisplayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRememberClearDisplayPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/interaction/downloads/DownloadsPatchKt { - public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatchKt { - public static final fun getShowSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getShowSeekbarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatchKt { - public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatchKt { - public static final fun getDisableLoginRequirementPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableLoginRequirementPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatchKt { - public static final fun getFixGoogleLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixGoogleLoginPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/settings/SettingsPatchKt { - public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatchKt { - public static final fun getSanitizeShareUrlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatchKt { - public static final fun getSpoofSimPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSIMSpoofPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/trakt/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatchKt { - public static final fun getShowOnLockscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getShowOnLockscreenPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tudortmund/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/ads/DisableDashboardAdsKt { - public static final fun getDisableDashboardAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableDashboardAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/annoyances/adfree/DisableAdFreeBannerPatchKt { - public static final fun getDisableAdFreeBannerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAdFreeBannerPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/annoyances/inappupdate/DisableInAppUpdatePatchKt { - public static final fun getDisableInAppUpdatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableInAppUpdatePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatchKt { - public static final fun getDisableBlogNotificationReminderPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableBlogNotificationReminderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatchKt { - public static final fun getDisableGiftMessagePopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableGiftMessagePopupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/annoyances/tv/DisableTumblrTvPatchKt { - public static final fun getDisableTumblrTvPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableTumblrTVPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatchKt { - public static final fun getOverrideFeatureFlagsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOverrideFeatureFlagsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/fixes/FixOldVersionsPatchKt { - public static final fun getFixOldVersionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFixOldVersionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatchKt { public static field addTimelineObjectTypeFilter Lkotlin/jvm/functions/Function1; public static final fun getAddTimelineObjectTypeFilter ()Lkotlin/jvm/functions/Function1; - public static final fun getFilterTimelineObjectsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFilterTimelineObjectsPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun setAddTimelineObjectTypeFilter (Lkotlin/jvm/functions/Function1;)V } public final class app/revanced/patches/twitch/ad/audio/AudioAdsPatchKt { - public static final fun getAudioAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBlockAudioAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatchKt { - public static final fun getEmbeddedAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBlockEmbeddedAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/ad/shared/util/AdPatchKt { - public static final fun adPatch (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun adPatch (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function3;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/ad/shared/util/ReturnMethod { @@ -1443,274 +1386,245 @@ public final class app/revanced/patches/twitch/ad/shared/util/ReturnMethod$Compa } public final class app/revanced/patches/twitch/ad/video/VideoAdsPatchKt { - public static final fun getVideoAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBlockVideoAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatchKt { - public static final fun getShowDeletedMessagesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getShowDeletedMessagesPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatchKt { - public static final fun getAutoClaimChannelPointsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAutoClaimChannelPointsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/debug/DebugModePatchKt { - public static final fun getDebugModePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDebugModePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitch/misc/settings/SettingsPatchKt { public static final fun addSettingPreference (Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V - public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatchKt { - public static final fun getUnlockDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/layout/viewcount/HideViewCountPatchKt { - public static final fun getHideViewCountPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideViewCountPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatchKt { - public static final fun getDynamicColorPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getDynamicColorPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/extension/ExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/hook/HideAdsHookPatchKt { - public static final fun getHideAdsHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/hook/HideRecommendedUsersPatchKt { - public static final fun getHideRecommendedUsersPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideRecommendedUsersPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/hook/HookPatchKt { - public static final fun hookPatch (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun hookPatch (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/hook/json/JsonHook { - public fun (Lapp/revanced/patcher/patch/BytecodePatchContext;Ljava/lang/String;)V } public final class app/revanced/patches/twitter/misc/hook/json/JsonHookPatchKt { public static final fun addJsonHook (Lapp/revanced/patcher/patch/BytecodePatchContext;Lapp/revanced/patches/twitter/misc/hook/json/JsonHook;)V - public static final fun getJsonHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getJsonHookPatch ()Lapp/revanced/patcher/patch/Patch; + public static final fun jsonHook (Lapp/revanced/patcher/patch/BytecodePatchContext;Ljava/lang/String;)Lapp/revanced/patches/twitter/misc/hook/json/JsonHook; } public final class app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatchKt { - public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatchKt { - public static final fun getOpenLinksWithAppChooserPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatchKt { - public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/viber/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/viber/misc/navbar/HideNavigationButtonsKt { - public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { - public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatchKt { - public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/willhaben/ads/HideAdsPatchKt { + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatchKt { - public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/ad/video/VideoAdsPatchKt { - public static final fun getVideoAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getVideoAdsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatchKt { - public static final fun getCopyVideoUrlPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCopyVideoURLPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatchKt { - public static final fun getRemoveViewerDiscretionDialogPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveViewerDiscretionDialogPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { - public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/downloads/DownloadsPatchKt { - public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatchKt { - public static final fun getDisablePreciseSeekingGesturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePreciseSeekingGesturePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatchKt { - public static final fun getEnableSeekbarTappingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableSeekbarTappingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatchKt { - public static final fun getEnableSlideToSeekPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableSlideToSeekPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarPatchKt { - public static final fun getSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSeekbarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatchKt { - public static final fun getSeekbarThumbnailsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSeekbarThumbnailsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatchKt { - public static final fun getSwipeControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSwipeControlsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatchKt { - public static final fun getAutoCaptionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableAutoCaptionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/branding/CustomBrandingPatchKt { - public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatchKt { - public static final fun getChangeHeaderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getChangeHeaderPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatchKt { - public static final fun getHideButtonsPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getHideVideoActionButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatchKt { - public static final fun getNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getNavigationButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatchKt { - public static final fun getHidePlayerOverlayButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHidePlayerOverlayButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatchKt { - public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatchKt { - public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatchKt { - public static final fun getHideEndScreenSuggestedVideoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideEndScreenSuggestedVideoPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatchKt { - public static final fun getDisableFullscreenAmbientModePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableFullscreenAmbientModePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J - public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J + public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { - public static final fun getHideInfoCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideInfoCardsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatchKt { - public static final fun getHidePlayerFlyoutMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHidePlayerFlyoutMenuItemsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatchKt { - public static final fun getHideRelatedVideoOverlayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideRelatedVideoOverlayPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatchKt { - public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableRollingNumberAnimationsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt { - public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopupKt { - public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { - public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableSignInToTVPopupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt { - public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt { - public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt { - public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisablePlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt { - public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatchKt { + public static final fun getExitFullscreenPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { - public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatchKt { - public static final fun getCustomPlayerOverlayOpacityPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCustomPlayerOverlayOpacityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatchKt { - public static final fun getReturnYouTubeDislikePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getReturnYouTubeDislikePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/returnyoutubedislike/Vote : java/lang/Enum { @@ -1724,108 +1638,87 @@ public final class app/revanced/patches/youtube/layout/returnyoutubedislike/Vote } public final class app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatchKt { - public static final fun getWideSearchbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getWideSearchBarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatchKt { - public static final fun getSeekbarColorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSeekbarColorPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatchKt { - public static final fun getShortsAutoplayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getShortsAutoplayPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatchKt { - public static final fun getOpenShortsInRegularPlayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOpenShortsInRegularPlayerPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatchKt { - public static final fun getSponsorBlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSponsorBlockPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatchKt { - public static final fun getSpoofAppVersionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofAppVersionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatchKt { - public static final fun getChangeStartPagePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getChangeStartPagePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatchKt { - public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { - public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; + public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/theme/ThemePatchKt { - public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getThemePatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatchKt { - public static final fun getAlternativeThumbnailsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAlternativeThumbnailsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatchKt { - public static final fun getBypassImageRegionRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBypassImageRegionRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/announcements/AnnouncementsPatchKt { - public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatchKt { - public static final fun getPauseOnAudioInterruptPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatchKt { - public static final fun getAutoRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPauseOnAudioInterruptPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatchKt { - public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRemoveBackgroundPlaybackRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatchKt { - public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatchKt { - public static final fun getSpoofDeviceDimensionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofDeviceDimensionsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatchKt { - public static final fun getCheckWatchHistoryDomainNameResolutionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCheckWatchHistoryDomainNameResolutionPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPatchKt { - public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { - public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatchKt { + public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatchKt { - public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatchKt { - public static final fun getDisableHapticFeedbackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableHapticFeedbackPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHookKt { @@ -1833,54 +1726,49 @@ public final class app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrl public static final fun addImageUrlHook (Ljava/lang/String;Z)V public static synthetic fun addImageUrlHook$default (Ljava/lang/String;ZILjava/lang/Object;)V public static final fun addImageUrlSuccessCallbackHook (Ljava/lang/String;)V - public static final fun getCronetImageUrlHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getCronetImageUrlHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatchKt { - public static final fun getBypassURLRedirectsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getBypassURLRedirectsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatchKt { - public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatchKt { - public static final fun getAddLithoFilter ()Lkotlin/jvm/functions/Function1; - public static final fun getLithoFilterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLithoFilterPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatchKt { - public static final fun getLoopVideoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getLoopVideoPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatchKt { public static field hookNavigationButtonCreated Lkotlin/jvm/functions/Function1; public static final fun getHookNavigationButtonCreated ()Lkotlin/jvm/functions/Function1; - public static final fun getNavigationBarHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getNavigationBarHookPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun setHookNavigationButtonCreated (Lkotlin/jvm/functions/Function1;)V } public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatchKt { - public static final fun getPlayerControlsOverlayVisibilityPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlayerControlsOverlayVisibilityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt { public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1; - public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun initializeBottomControl (Ljava/lang/String;)V public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V } public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatchKt { - public static final fun getPlayerTypeHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlayerTypeHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { - public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z + public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z @@ -1905,19 +1793,29 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_10_or_greater ()Z public static final fun is_20_14_or_greater ()Z public static final fun is_20_15_or_greater ()Z -} - -public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { - public static final fun getRemoveTrackingQueryParameterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun is_20_19_or_greater ()Z + public static final fun is_20_20_or_greater ()Z + public static final fun is_20_21_or_greater ()Z + public static final fun is_20_22_or_greater ()Z + public static final fun is_20_26_or_greater ()Z + public static final fun is_20_28_or_greater ()Z + public static final fun is_20_30_or_greater ()Z + public static final fun is_20_31_or_greater ()Z + public static final fun is_20_34_or_greater ()Z + public static final fun is_20_37_or_greater ()Z + public static final fun is_20_39_or_greater ()Z + public static final fun is_20_41_or_greater ()Z + public static final fun is_20_45_or_greater ()Z + public static final fun is_20_46_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { - public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatchKt { public static final fun getAddRecyclerViewTreeHook ()Lkotlin/jvm/functions/Function1; - public static final fun getRecyclerViewTreeHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRecyclerViewTreeHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/settings/PreferenceScreen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen { @@ -1938,36 +1836,28 @@ public final class app/revanced/patches/youtube/misc/settings/PreferenceScreen : } public final class app/revanced/patches/youtube/misc/settings/SettingsPatchKt { - public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun newIntent (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; } public final class app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt { - public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { - public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatchKt { - public static final fun getDisableVideoCodecsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/video/hdr/DisableHdrPatchKt { - public static final fun getDisableHdrPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getDisableVideoCodecsPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/information/VideoInformationPatchKt { - public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V public static final fun videoSpeedChangedHook (Ljava/lang/String;Ljava/lang/String;)V public static final fun videoTimeHook (Ljava/lang/String;Ljava/lang/String;)V @@ -1992,47 +1882,39 @@ public final class app/revanced/patches/youtube/video/playerresponse/Hook$VideoI public final class app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatchKt { public static final fun addPlayerResponseMethodHook (Lapp/revanced/patches/youtube/video/playerresponse/Hook;)V - public static final fun getPlayerResponseMethodHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlayerResponseMethodHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/quality/RememberVideoQualityPatchKt { - public static final fun getRememberVideoQualityPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getRememberVideoQualityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatchKt { - public static final fun getVideoQualityDialogButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getVideoQualityDialogButtonPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/quality/VideoQualityPatchKt { - public static final fun getVideoQualityPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getVideoQualityPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/speed/PlaybackSpeedPatchKt { - public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlaybackSpeedPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatchKt { - public static final fun getPlaybackSpeedButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getPlaybackSpeedButtonPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { - public static final fun getVideoIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getVideoIdPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun hookBackgroundPlayVideoId (Ljava/lang/String;)V public static final fun hookPlayerResponseVideoId (Ljava/lang/String;)V public static final fun hookVideoId (Ljava/lang/String;)V } -public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt { - public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/util/BytecodeUtilsKt { - public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V - public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V + public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;ILjava/lang/String;)V + public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/extensions/ExternalLabel;)V public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;D)Z public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;F)Z public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z @@ -2041,8 +1923,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun findInstructionIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)Ljava/util/List; public static final fun findInstructionIndicesReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun findInstructionIndicesReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod; - public static final fun forEachLiteralValueInstruction (Lapp/revanced/patcher/patch/BytecodePatchContext;JLkotlin/jvm/functions/Function2;)V + public static final fun forEachInstructionAsSequence (Lapp/revanced/patcher/patch/BytecodePatchContext;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;)V public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILcom/android/tools/smali/dexlib2/Opcode;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)I @@ -2077,29 +1958,29 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstLiteralInstructionReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I public static final fun indexOfFirstResourceId (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I - public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V - public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;F)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V - public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;F)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V - public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V - public static final fun traverseClassHierarchy (Lapp/revanced/patcher/patch/BytecodePatchContext;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V + public static final fun injectHideViewCall (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V + public static final fun literal (Lapp/revanced/patcher/MutablePredicateList;Lkotlin/jvm/functions/Function0;)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;B)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;C)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;D)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;F)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;I)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;J)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Ljava/lang/String;)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;S)V + public static final fun returnEarly (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Z)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;B)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;C)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;D)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;F)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;I)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;J)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Ljava/lang/String;)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;S)V + public static final fun returnLate (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;Z)V + public static final fun transformMethods (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableClassDef;Lkotlin/jvm/functions/Function1;)V + public static final fun traverseClassHierarchy (Lapp/revanced/patcher/patch/BytecodePatchContext;Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableClassDef;Lkotlin/jvm/functions/Function1;)V } public final class app/revanced/util/ResourceGroup { diff --git a/patches/build.gradle.kts b/patches/build.gradle.kts index 4e5c89da63..b0adaf6da6 100644 --- a/patches/build.gradle.kts +++ b/patches/build.gradle.kts @@ -24,7 +24,10 @@ dependencies { kotlin { compilerOptions { - freeCompilerArgs = listOf("-Xcontext-receivers") + freeCompilerArgs.addAll( + "-Xexplicit-backing-fields", + "-Xcontext-parameters" + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/activity/exportall/ExportAllActivitiesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/activity/exportall/ExportAllActivitiesPatch.kt index 30193b7049..8336cebdbc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/activity/exportall/ExportAllActivitiesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/activity/exportall/ExportAllActivitiesPatch.kt @@ -8,7 +8,7 @@ val exportAllActivitiesPatch = resourcePatch( description = "Makes all app activities exportable.", use = false, ) { - execute { + apply { val exportedFlag = "android:exported" document("AndroidManifest.xml").use { document -> diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbStatusPatch.kt similarity index 75% rename from patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbStatusPatch.kt index 28653638bc..71f6777857 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/adb/HideAdbStatusPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.all.misc.adb -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.util.getReference @@ -13,27 +13,26 @@ import com.android.tools.smali.dexlib2.util.MethodUtil private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/all/misc/hide/adb/HideAdbPatch;" private val SETTINGS_GLOBAL_GET_INT_OR_THROW_METHOD_REFERENCE = ImmutableMethodReference( - "Landroid/provider/Settings\$Global;", + $$"Landroid/provider/Settings$Global;", "getInt", listOf("Landroid/content/ContentResolver;", "Ljava/lang/String;"), - "I" + "I", ) private val SETTINGS_GLOBAL_GET_INT_OR_DEFAULT_METHOD_REFERENCE = ImmutableMethodReference( - "Landroid/provider/Settings\$Global;", + $$"Landroid/provider/Settings$Global;", "getInt", listOf("Landroid/content/ContentResolver;", "Ljava/lang/String;", "I"), - "I" + "I", ) -private fun MethodReference.anyMethodSignatureMatches(vararg anyOf: MethodReference): Boolean { - return anyOf.any { - MethodUtil.methodSignaturesMatch(it, this) - } -} +private val getIntMethodReferences = listOf( + SETTINGS_GLOBAL_GET_INT_OR_THROW_METHOD_REFERENCE, + SETTINGS_GLOBAL_GET_INT_OR_DEFAULT_METHOD_REFERENCE, +) @Suppress("unused") -val hideAdbStatusPatch = bytecodePatch( +val hideADBStatusPatch = bytecodePatch( name = "Hide ADB status", description = "Hides enabled development settings and/or ADB.", use = false, @@ -46,11 +45,8 @@ val hideAdbStatusPatch = bytecodePatch( val reference = instruction .takeIf { it.opcode == Opcode.INVOKE_STATIC } ?.getReference() - ?.takeIf { - it.anyMethodSignatureMatches( - SETTINGS_GLOBAL_GET_INT_OR_THROW_METHOD_REFERENCE, - SETTINGS_GLOBAL_GET_INT_OR_DEFAULT_METHOD_REFERENCE - ) + ?.takeIf { reference -> + getIntMethodReferences.any { MethodUtil.methodSignaturesMatch(it, reference) } } ?: return@filterMap null @@ -67,9 +63,9 @@ val hideAdbStatusPatch = bytecodePatch( method.replaceInstruction( index, - "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->getInt($parameterString)I" + "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->getInt($parameterString)I", ) - } - ) + }, + ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/appicon/HideAppIconPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/appicon/HideAppIconPatch.kt index a0411d89f0..8e0faa6043 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/appicon/HideAppIconPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/appicon/HideAppIconPatch.kt @@ -3,8 +3,8 @@ package app.revanced.patches.all.misc.appicon import app.revanced.patcher.patch.resourcePatch import app.revanced.util.asSequence import app.revanced.util.childElementsSequence -import java.util.logging.Logger import org.w3c.dom.Element +import java.util.logging.Logger @Suppress("unused") val hideAppIconPatch = resourcePatch( @@ -12,7 +12,7 @@ val hideAppIconPatch = resourcePatch( description = "Hides the app icon from the Android launcher.", use = false, ) { - execute { + apply { document("AndroidManifest.xml").use { document -> var changed = false @@ -26,6 +26,7 @@ val hideAppIconPatch = resourcePatch( "action" -> if (child.getAttribute("android:name") == "android.intent.action.MAIN") { hasMainAction = true } + "category" -> if (child.getAttribute("android:name") == "android.intent.category.LAUNCHER") { launcherCategory = child } @@ -45,4 +46,3 @@ val hideAppIconPatch = resourcePatch( } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch.kt index 434b97e276..567df9f7e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.all.misc.build -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.util.getReference diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt index aa4fbf3f85..9e6e723692 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt @@ -11,172 +11,148 @@ val spoofBuildInfoPatch = bytecodePatch( use = false, ) { val board by stringOption( - key = "board", default = null, - title = "Board", + name = "Board", description = "The name of the underlying board, like \"goldfish\".", ) val bootloader by stringOption( - key = "bootloader", default = null, - title = "Bootloader", + name = "Bootloader", description = "The system bootloader version number.", ) val brand by stringOption( - key = "brand", default = null, - title = "Brand", + name = "Brand", description = "The consumer-visible brand with which the product/hardware will be associated, if any.", ) val cpuAbi by stringOption( - key = "cpu-abi", default = null, - title = "CPU ABI", + name = "CPU ABI", description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead.", ) val cpuAbi2 by stringOption( - key = "cpu-abi-2", default = null, - title = "CPU ABI 2", + name = "CPU ABI 2", description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead.", ) val device by stringOption( - key = "device", default = null, - title = "Device", + name = "Device", description = "The name of the industrial design.", ) val display by stringOption( - key = "display", default = null, - title = "Display", + name = "Display", description = "A build ID string meant for displaying to the user.", ) val fingerprint by stringOption( - key = "fingerprint", default = null, - title = "Fingerprint", + name = "Fingerprint", description = "A string that uniquely identifies this build.", ) val hardware by stringOption( - key = "hardware", default = null, - title = "Hardware", + name = "Hardware", description = "The name of the hardware (from the kernel command line or /proc).", ) val host by stringOption( - key = "host", default = null, - title = "Host", + name = "Host", description = "The host.", ) val id by stringOption( - key = "id", default = null, - title = "ID", + name = "ID", description = "Either a changelist number, or a label like \"M4-rc20\".", ) val manufacturer by stringOption( - key = "manufacturer", default = null, - title = "Manufacturer", + name = "Manufacturer", description = "The manufacturer of the product/hardware.", ) val model by stringOption( - key = "model", default = null, - title = "Model", + name = "Model", description = "The end-user-visible name for the end product.", ) val odmSku by stringOption( - key = "odm-sku", default = null, - title = "ODM SKU", + name = "ODM SKU", description = "The SKU of the device as set by the original design manufacturer (ODM).", ) val product by stringOption( - key = "product", default = null, - title = "Product", + name = "Product", description = "The name of the overall product.", ) val radio by stringOption( - key = "radio", default = null, - title = "Radio", + name = "Radio", description = "This field was deprecated in API level 15. " + "The radio firmware version is frequently not available when this class is initialized, " + "leading to a blank or \"unknown\" value for this string. Use getRadioVersion() instead.", ) val serial by stringOption( - key = "serial", default = null, - title = "Serial", + name = "Serial", description = "This field was deprecated in API level 26. Use getSerial() instead.", ) val sku by stringOption( - key = "sku", default = null, - title = "SKU", + name = "SKU", description = "The SKU of the hardware (from the kernel command line).", ) val socManufacturer by stringOption( - key = "soc-manufacturer", default = null, - title = "SOC manufacturer", + name = "SOC manufacturer", description = "The manufacturer of the device's primary system-on-chip.", ) val socModel by stringOption( - key = "soc-model", default = null, - title = "SOC model", + name = "SOC model", description = "The model name of the device's primary system-on-chip.", ) val tags by stringOption( - key = "tags", default = null, - title = "Tags", + name = "Tags", description = "Comma-separated tags describing the build, like \"unsigned,debug\".", ) val time by longOption( - key = "time", default = null, - title = "Time", + name = "Time", description = "The time at which the build was produced, given in milliseconds since the UNIX epoch.", ) val type by stringOption( - key = "type", default = null, - title = "Type", + name = "Type", description = "The type of build, like \"user\" or \"eng\".", ) val user by stringOption( - key = "user", default = null, - title = "User", + name = "User", description = "The user.", ) @@ -209,6 +185,5 @@ val spoofBuildInfoPatch = bytecodePatch( user, ) }, - ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/location/hide/HideMockLocationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/location/hide/HideMockLocationPatch.kt index b17eea94dc..8c69bfad07 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/location/hide/HideMockLocationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/location/hide/HideMockLocationPatch.kt @@ -1,8 +1,6 @@ -@file:Suppress("unused") - package app.revanced.patches.all.misc.connectivity.location.hide -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.fromMethodReference diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt deleted file mode 100644 index fe418b1ae1..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.all.misc.connectivity.telephony.sim.spoof - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Patch was renamed", ReplaceWith("spoofSimProviderPatch")) -@Suppress("unused") -val spoofSimCountryPatch = bytecodePatch { - dependsOn(spoofSimProviderPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimProviderPatch.kt index a1ae2c48d7..a7dfdf7bf4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimProviderPatch.kt @@ -1,21 +1,21 @@ package app.revanced.patches.all.misc.connectivity.telephony.sim.spoof -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.intOption import app.revanced.patcher.patch.stringOption -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference import com.android.tools.smali.dexlib2.util.MethodUtil -import java.util.Locale +import java.util.* @Suppress("unused") -val spoofSimProviderPatch = bytecodePatch( +val spoofSIMProviderPatch = bytecodePatch( name = "Spoof SIM provider", description = "Spoofs information about the SIM card provider.", use = false, @@ -23,13 +23,11 @@ val spoofSimProviderPatch = bytecodePatch( val countries = Locale.getISOCountries().associateBy { Locale("", it).displayCountry } fun isoCountryPatchOption( - key: String, - title: String, + name: String, ) = stringOption( - key, + name, null, countries, - title, "ISO-3166-1 alpha-2 country code equivalent for the SIM provider's country code.", false, validator = { it: String? -> it == null || it.uppercase() in countries.values }, @@ -37,39 +35,29 @@ val spoofSimProviderPatch = bytecodePatch( fun isMccMncValid(it: Int?): Boolean = it == null || (it >= 10000 && it <= 999999) - val networkCountryIso by isoCountryPatchOption( - "networkCountryIso", - "Network ISO country code", - ) + val networkCountryIso by isoCountryPatchOption("Network ISO country code") val networkOperator by intOption( - key = "networkOperator", - title = "MCC+MNC network operator code", + name = "MCC+MNC network operator code", description = "The 5 or 6 digits MCC+MNC (Mobile Country Code + Mobile Network Code) of the network operator.", - validator = { isMccMncValid(it) } + validator = { isMccMncValid(it) }, ) val networkOperatorName by stringOption( - key = "networkOperatorName", - title = "Network operator name", + name = "Network operator name", description = "The full name of the network operator.", ) - val simCountryIso by isoCountryPatchOption( - "simCountryIso", - "SIM ISO country code", - ) + val simCountryIso by isoCountryPatchOption("SIM ISO country code") val simOperator by intOption( - key = "simOperator", - title = "MCC+MNC SIM operator code", + name = "MCC+MNC SIM operator code", description = "The 5 or 6 digits MCC+MNC (Mobile Country Code + Mobile Network Code) of the SIM operator.", - validator = { isMccMncValid(it) } + validator = { isMccMncValid(it) }, ) val simOperatorName by stringOption( - key = "simOperatorName", - title = "SIM operator name", + name = "SIM operator name", description = "The full name of the SIM operator.", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWifiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWifiPatch.kt index 7abf5a4734..1666a27a8d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWifiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWifiPatch.kt @@ -11,7 +11,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR_PREFIX = private const val EXTENSION_CLASS_DESCRIPTOR = "$EXTENSION_CLASS_DESCRIPTOR_PREFIX;" @Suppress("unused") -val spoofWifiPatch = bytecodePatch( +val spoofWiFiConnectionPatch = bytecodePatch( name = "Spoof Wi-Fi connection", description = "Spoofs an existing Wi-Fi connection.", use = false, diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt index 0097589776..661ee306b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt @@ -9,34 +9,29 @@ import app.revanced.util.getNode import org.w3c.dom.Element import java.io.File - - - +@Suppress("unused") val customNetworkSecurityPatch = resourcePatch( name = "Custom network security", description = "Allows trusting custom certificate authorities for a specific domain.", - use = false + use = false, ) { val targetDomains by stringsOption( - key = "targetDomains", - title = "Target domains", + name = "Target domains", description = "List of domains to which the custom trust configuration will be applied (one domain per entry).", default = listOf("example.com"), - required = true + required = true, ) val includeSubdomains by booleanOption( - key = "includeSubdomains", - title = "Include subdomains", + name = "Include subdomains", description = "Applies the configuration to all subdomains of the target domains.", default = false, - required = true + required = true, ) val customCAFilePaths by stringsOption( - key = "customCAFilePaths", - title = "Custom CA file paths", + name = "Custom CA file paths", description = """ List of paths to files in PEM or DER format (one file path per entry). @@ -47,43 +42,35 @@ val customNetworkSecurityPatch = resourcePatch( CA files will be bundled in res/raw/ of resulting APK """.trimIndentMultiline(), default = null, - required = false + required = false, ) val allowUserCerts by booleanOption( - key = "allowUserCerts", - title = "Trust user added CAs", + name = "Trust user added CAs", description = "Makes an app trust certificates from the Android user store for the specified domains, and if the option \"Include Subdomains\" is enabled then also the subdomains.", - default = false, - required = true + required = true, ) val allowSystemCerts by booleanOption( - key = "allowSystemCerts", - title = "Trust system CAs", + name = "Trust system CAs", description = "Makes an app trust certificates from the Android system store for the specified domains, and and if the option \"Include Subdomains\" is enabled then also the subdomains.", - default = true, - required = true + required = true, ) val allowCleartextTraffic by booleanOption( - key = "allowCleartextTraffic", - title = "Allow cleartext traffic (HTTP)", + name = "Allow cleartext traffic (HTTP)", description = "Allows unencrypted HTTP traffic for the specified domains, and if \"Include Subdomains\" is enabled then also the subdomains.", - default = false, - required = true + required = true, ) val overridePins by booleanOption( - key = "overridePins", - title = "Override certificate pinning", + name = "Override certificate pinning", description = "Overrides certificate pinning for the specified domains and their subdomains if the option \"Include Subdomains\" is enabled to allow inspecting app traffic via a proxy.", - default = false, - required = true + required = true, ) fun generateNetworkSecurityConfig(): String { @@ -128,55 +115,47 @@ ${trustAnchorsXML.trimEnd()} - """.trimIndent() + """.trimIndent() } - - execute { + apply { val nscFileNameBare = "network_security_config" val resXmlDir = "res/xml" val resRawDir = "res/raw" val nscFileNameWithSuffix = "$nscFileNameBare.xml" - document("AndroidManifest.xml").use { document -> val applicationNode = document.getNode("application") as Element applicationNode.setAttribute("android:networkSecurityConfig", "@xml/$nscFileNameBare") } - File(get(resXmlDir), nscFileNameWithSuffix).apply { writeText(generateNetworkSecurityConfig()) } - - for (customCAFilePath in customCAFilePaths ?: emptyList()) { val file = File(customCAFilePath) if (!file.exists()) { throw PatchException( "The custom CA file path cannot be found: " + - file.absolutePath + file.absolutePath, ) } if (!file.isFile) { throw PatchException( - "The custom CA file path must be a file: " - + file.absolutePath + "The custom CA file path must be a file: " + + file.absolutePath, ) } val caFileNameWithoutSuffix = customCAFilePath.substringAfterLast('/').substringBefore('.') val caFile = File(customCAFilePath) File( get(resRawDir), - caFileNameWithoutSuffix + caFileNameWithoutSuffix, ).writeText( - caFile.readText() + caFile.readText(), ) - } - - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch.kt index fc7e33c5dd..86e981a63a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch.kt @@ -3,12 +3,13 @@ package app.revanced.patches.all.misc.debugging import app.revanced.patcher.patch.resourcePatch import org.w3c.dom.Element +@Suppress("unused") val enableAndroidDebuggingPatch = resourcePatch( name = "Enable Android debugging", description = "Enables Android debugging capabilities. This can slow down the app.", use = false, ) { - execute { + apply { document("AndroidManifest.xml").use { document -> val applicationNode = document diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt deleted file mode 100644 index 8046c11fc3..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.all.misc.directory - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.directory.documentsprovider.exportInternalDataDocumentsProviderPatch - -@Suppress("unused") -@Deprecated( - "Superseded by internalDataDocumentsProviderPatch", - ReplaceWith("internalDataDocumentsProviderPatch"), -) -val changeDataDirectoryLocationPatch = bytecodePatch( - // name = "Change data directory location", - description = "Changes the data directory in the application from " + - "the app internal storage directory to /sdcard/android/data accessible by root-less devices." + - "Using this patch can cause unexpected issues with some apps.", - use = false, -) { - dependsOn(exportInternalDataDocumentsProviderPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatch.kt index 187fd23818..46fd56daeb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatch.kt @@ -18,7 +18,7 @@ val exportInternalDataDocumentsProviderPatch = resourcePatch( }, ) - execute { + apply { val documentsProviderClass = "app.revanced.extension.all.misc.directory.documentsprovider.InternalDataDocumentsProvider" @@ -28,7 +28,7 @@ val exportInternalDataDocumentsProviderPatch = resourcePatch( .asSequence() .any { it.attributes.getNamedItem("android:name")?.nodeValue == documentsProviderClass } ) { - return@execute + return@apply } val authority = diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt index 9a9e427ece..74b21e50a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt @@ -3,19 +3,16 @@ package app.revanced.patches.all.misc.hex import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.rawResourcePatch import app.revanced.patcher.patch.stringsOption -import app.revanced.patches.shared.misc.hex.HexPatchBuilder import app.revanced.patches.shared.misc.hex.hexPatch import app.revanced.util.Utils.trimIndentMultiline @Suppress("unused") -val hexPatch = rawResourcePatch( - name = "Hex", +val Hex = rawResourcePatch( description = "Replaces a hexadecimal patterns of bytes of files in an APK.", use = false, ) { val replacements by stringsOption( - key = "replacements", - title = "Replacements", + name = "Replacements", description = """ Hexadecimal patterns to search for and replace with another in a target file. @@ -34,10 +31,14 @@ val hexPatch = rawResourcePatch( dependsOn( hexPatch( - block = fun HexPatchBuilder.() { + block = { replacements!!.forEach { replacement -> try { - val (pattern, replacementPattern, targetFilePath) = replacement.split("|", limit = 3) + val (pattern, replacementPattern, targetFilePath) = replacement.split( + "|", + limit = 3 + ) + pattern asPatternTo replacementPattern inFile targetFilePath } catch (e: Exception) { throw PatchException( @@ -49,6 +50,6 @@ val hexPatch = rawResourcePatch( } } }, - ) + ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/interaction/gestures/PredictiveBackGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/interaction/gestures/PredictiveBackGesturePatch.kt index 29f644435d..ad96c61d8e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/interaction/gestures/PredictiveBackGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/interaction/gestures/PredictiveBackGesturePatch.kt @@ -8,7 +8,7 @@ val predictiveBackGesturePatch = resourcePatch( description = "Enables the predictive back gesture introduced on Android 13.", use = false, ) { - execute { + apply { val flag = "android:enableOnBackInvokedCallback" document("AndroidManifest.xml").use { document -> diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/network/OverrideCertificatePinningPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/network/OverrideCertificatePinningPatch.kt index c85f4c3ba4..545e4ff90c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/network/OverrideCertificatePinningPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/network/OverrideCertificatePinningPatch.kt @@ -3,6 +3,7 @@ package app.revanced.patches.all.misc.network import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.debugging.enableAndroidDebuggingPatch import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.getNode import org.w3c.dom.Element import java.io.File @@ -14,16 +15,20 @@ val overrideCertificatePinningPatch = resourcePatch( ) { dependsOn(enableAndroidDebuggingPatch) - execute { + apply { val resXmlDirectory = get("res/xml") // Add android:networkSecurityConfig="@xml/network_security_config" and the "networkSecurityConfig" attribute if it does not exist. document("AndroidManifest.xml").use { document -> - val applicationNode = document.getElementsByTagName("application").item(0) as Element - - if (!applicationNode.hasAttribute("networkSecurityConfig")) { - document.createAttribute("android:networkSecurityConfig") - .apply { value = "@xml/network_security_config" }.let(applicationNode.attributes::setNamedItem) + val applicationNode = document.getNode("application") as Element + applicationNode.apply { + if (!hasAttribute("networkSecurityConfig")) { + attributes.setNamedItem( + document.createAttribute("android:networkSecurityConfig").apply { + value = "@xml/network_security_config" + } + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt index 4a6443a8c9..271b2fc0fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/packagename/ChangePackageNamePatch.kt @@ -6,7 +6,15 @@ import app.revanced.util.getNode import org.w3c.dom.Element import java.util.logging.Logger -lateinit var packageNameOption: Option +private val packageNameOption = stringOption( + default = "Default", + values = mapOf("Default" to "Default"), + name = "Package name", + description = "The name of the package to rename the app to.", + required = true, +) { + it == "Default" || it!!.matches(Regex("^[a-z]\\w*(\\.[a-z]\\w*)+\$")) +} /** * Set the package name to use. @@ -26,40 +34,30 @@ fun setOrGetFallbackPackageName(fallbackPackageName: String): String { } } +@Suppress("ObjectPropertyName") val changePackageNamePatch = resourcePatch( name = "Change package name", description = "Appends \".revanced\" to the package name by default. " + "Changing the package name of the app can lead to unexpected issues.", use = false, ) { - packageNameOption = stringOption( - key = "packageName", - default = "Default", - values = mapOf("Default" to "Default"), - title = "Package name", - description = "The name of the package to rename the app to.", - required = true, - ) { - it == "Default" || it!!.matches(Regex("^[a-z]\\w*(\\.[a-z]\\w*)+\$")) - } + packageNameOption() val updatePermissions by booleanOption( - key = "updatePermissions", default = false, - title = "Update permissions", + name = "Update permissions", description = "Update compatibility receiver permissions. " + "Enabling this can fix installation errors, but this can also break features in certain apps.", ) val updateProviders by booleanOption( - key = "updateProviders", default = false, - title = "Update providers", + name = "Update providers", description = "Update provider names declared by the app. " + "Enabling this can fix installation errors, but this can also break features in certain apps.", ) - finalize { + afterDependents { /** * Apps that are confirmed to not work correctly with this patch. * This is not an exhaustive list, and is only the apps with @@ -80,7 +78,7 @@ val changePackageNamePatch = resourcePatch( val packageName = manifest.getAttribute("package") if (incompatibleAppPackages.contains(packageName)) { - return@finalize Logger.getLogger(this::class.java.name).severe( + return@afterDependents Logger.getLogger(this::class.java.name).severe( "'$packageName' does not work correctly with \"Change package name\"", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/playintegrity/DisablePlayIntegrity.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/playintegrity/DisablePlayIntegrity.kt index 25a948e349..12461fc40a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/playintegrity/DisablePlayIntegrity.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/playintegrity/DisablePlayIntegrity.kt @@ -1,10 +1,9 @@ package app.revanced.patches.all.misc.playintegrity -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.util.getReference -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference @@ -16,10 +15,9 @@ private val CONTEXT_BIND_SERVICE_METHOD_REFERENCE = ImmutableMethodReference( "Landroid/content/Context;", "bindService", listOf("Landroid/content/Intent;", "Landroid/content/ServiceConnection;", "I"), - "Z" + "Z", ) - @Suppress("unused") val disablePlayIntegrityPatch = bytecodePatch( name = "Disable Play Integrity", @@ -43,13 +41,14 @@ val disablePlayIntegrityPatch = bytecodePatch( transform = { method, entry -> val (instruction, index, parameterTypes) = entry val parameterString = parameterTypes.joinToString(separator = "") - val registerString = "v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}, v${instruction.registerF}" + val registerString = + "v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}, v${instruction.registerF}" method.replaceInstruction( index, - "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->bindService(Landroid/content/Context;$parameterString)Z" + "invoke-static { $registerString }, $EXTENSION_CLASS_DESCRIPTOR->bindService(Landroid/content/Context;$parameterString)Z", ) - } - ) + }, + ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt index f32986ea6a..a77dd364fc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/resources/AddResourcesPatch.kt @@ -215,8 +215,8 @@ fun addResources( * @see addResourcesPatch */ fun addResources( - patch: Patch<*>, - parseIds: (Patch<*>) -> Map> = { + patch: Patch, + parseIds: (Patch) -> Map> = { val patchId = patch.name ?: throw PatchException("Patch has no name") val packages = patch.compatiblePackages ?: throw PatchException("Patch has no compatible packages") @@ -273,9 +273,9 @@ val addResourcesPatch = resourcePatch( from the temporary map to addResourcesPatch. After all patches that depend on addResourcesPatch have been executed, - addResourcesPatch#finalize is finally called to add all staged resources to the app. + addResourcesPatch#afterDependents is finally called to add all staged resources to the app. */ - execute { + apply { stagedResources = buildMap { /** * Puts resources under `/resources/addresources//.xml` into the map. @@ -324,7 +324,7 @@ val addResourcesPatch = resourcePatch( // Stage all resources to a temporary map. // Staged resources consumed by addResourcesPatch#invoke(Patch) - // are later used in addResourcesPatch#finalize. + // are later used in addResourcesPatch#afterDependents. try { val addStringResources = { source: Value, dest: Value -> addResources(source, dest, "strings", StringResource::fromNode) @@ -343,7 +343,7 @@ val addResourcesPatch = resourcePatch( * Adds all resources staged in [addResourcesPatch] to the app. * This is called after all patches that depend on [addResourcesPatch] have been executed. */ - finalize { + afterDependents { operator fun MutableMap>.invoke( value: Value, resource: BaseResource, @@ -359,14 +359,14 @@ val addResourcesPatch = resourcePatch( } getOrPut(resourceFileName) { - this@finalize["res/$value/$resourceFileName.xml"].also { + this@afterDependents["res/$value/$resourceFileName.xml"].also { it.parentFile?.mkdirs() if (it.createNewFile()) { it.writeText("\n\n") } } - + document("res/$value/$resourceFileName.xml").let { document -> // Save the target node here as well diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/screencapture/RemoveScreenCaptureRestrictionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/screencapture/RemoveScreenCaptureRestrictionPatch.kt index f11d27f53c..0b0edcb69b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/screencapture/RemoveScreenCaptureRestrictionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/screencapture/RemoveScreenCaptureRestrictionPatch.kt @@ -10,7 +10,7 @@ import org.w3c.dom.Element private val removeCaptureRestrictionResourcePatch = resourcePatch( description = "Sets allowAudioPlaybackCapture in manifest to true.", ) { - execute { + apply { document("AndroidManifest.xml").use { document -> // Get the application node. val applicationNode = diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/PreventScreenshotDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/PreventScreenshotDetectionPatch.kt index b66753e2c0..93092b5f3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/PreventScreenshotDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/PreventScreenshotDetectionPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.all.misc.screenshot -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.util.getReference @@ -16,7 +16,7 @@ private val registerScreenCaptureCallbackMethodReference = ImmutableMethodRefere "Ljava/util/concurrent/Executor;", "Landroid/app/Activity\$ScreenCaptureCallback;", ), - "V" + "V", ) private val unregisterScreenCaptureCallbackMethodReference = ImmutableMethodReference( @@ -25,28 +25,30 @@ private val unregisterScreenCaptureCallbackMethodReference = ImmutableMethodRefe listOf( "Landroid/app/Activity\$ScreenCaptureCallback;", ), - "V" + "V", ) @Suppress("unused") val preventScreenshotDetectionPatch = bytecodePatch( name = "Prevent screenshot detection", description = "Removes the registration of all screen capture callbacks. This prevents the app from detecting screenshots.", - use = false + use = false, ) { - dependsOn(transformInstructionsPatch( - filterMap = { _, _, instruction, instructionIndex -> - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@transformInstructionsPatch null - - val reference = instruction.getReference() ?: return@transformInstructionsPatch null + dependsOn( + transformInstructionsPatch( + filterMap = { _, _, instruction, instructionIndex -> + if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@transformInstructionsPatch null - instructionIndex.takeIf { - MethodUtil.methodSignaturesMatch(reference, registerScreenCaptureCallbackMethodReference) || - MethodUtil.methodSignaturesMatch(reference, unregisterScreenCaptureCallbackMethodReference) - } - }, - transform = { mutableMethod, instructionIndex -> - mutableMethod.removeInstruction(instructionIndex) - } - )) + val reference = instruction.getReference() ?: return@transformInstructionsPatch null + + instructionIndex.takeIf { + MethodUtil.methodSignaturesMatch(reference, registerScreenCaptureCallbackMethodReference) || + MethodUtil.methodSignaturesMatch(reference, unregisterScreenCaptureCallbackMethodReference) + } + }, + transform = { mutableMethod, instructionIndex -> + mutableMethod.removeInstruction(instructionIndex) + }, + ), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/RemoveScreenshotRestrictionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/RemoveScreenshotRestrictionPatch.kt index 807afb6393..e54c3e59b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/RemoveScreenshotRestrictionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/screenshot/RemoveScreenshotRestrictionPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.all.misc.screenshot -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.filterMapInstruction35c diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/shortcut/sharetargets/RemoveShareTargetsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/shortcut/sharetargets/RemoveShareTargetsPatch.kt index 817a291971..a14e16a760 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/shortcut/sharetargets/RemoveShareTargetsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/shortcut/sharetargets/RemoveShareTargetsPatch.kt @@ -13,12 +13,13 @@ val removeShareTargetsPatch = resourcePatch( description = "Removes share targets like directly sharing to a frequent contact.", use = false, ) { - execute { + apply { try { document("res/xml/shortcuts.xml") } catch (_: FileNotFoundException) { - return@execute Logger.getLogger(this::class.java.name).warning( - "The app has no shortcuts. No changes applied.") + return@apply Logger.getLogger(this::class.java.name).warning( + "The app has no shortcuts. No changes applied.", + ) }.use { document -> val rootNode = document.getNode("shortcuts") as? Element ?: return@use diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/spoof/EnableRomSignatureSpoofing.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/spoof/EnableRomSignatureSpoofing.kt index ea91363121..99d7a2c3cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/spoof/EnableRomSignatureSpoofing.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/spoof/EnableRomSignatureSpoofing.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.patch.stringOption import app.revanced.util.getNode import com.android.apksig.ApkVerifier import com.android.apksig.apk.ApkFormatException -import org.w3c.dom.Element import java.io.File import java.io.IOException import java.nio.file.InvalidPathException @@ -15,15 +14,14 @@ import java.security.cert.CertificateFactory import java.util.* @Suppress("unused") -val enableRomSignatureSpoofing = resourcePatch( +val enableROMSignatureSpoofingPatch = resourcePatch( name = "Enable ROM signature spoofing", description = "Spoofs the signature via the manifest meta-data \"fake-signature\". " + - "This patch only works with ROMs that support signature spoofing.", + "This patch only works with ROMs that support signature spoofing.", use = false, ) { val signatureOrPath by stringOption( - key = "signatureOrApkFilePath", - title = "Signature or APK file path", + name = "Signature or APK file path", validator = validator@{ signature -> signature ?: return@validator false @@ -32,14 +30,13 @@ val enableRomSignatureSpoofing = resourcePatch( description = "The hex-encoded signature or path to an APK file with the desired signature.", required = true, ) - execute { + apply { document("AndroidManifest.xml").use { document -> val permission = document.createElement("uses-permission").apply { setAttribute("android:name", "android.permission.FAKE_PACKAGE_SIGNATURE") } val manifest = document.getNode("manifest").appendChild(permission) - val fakeSignatureMetadata = document.createElement("meta-data").apply { setAttribute("android:name", "fake-signature") setAttribute("android:value", parseSignature(signatureOrPath!!)) @@ -70,15 +67,17 @@ private fun parseSignature(optionValue: String): String? { val hexFormat = HexFormat.of() - val signature = (if (result.isVerifiedUsingV3Scheme) { - result.v3SchemeSigners[0].certificate - } else if (result.isVerifiedUsingV2Scheme) { - result.v2SchemeSigners[0].certificate - } else if (result.isVerifiedUsingV1Scheme) { - result.v1SchemeSigners[0].certificate - } else { - return null - }).encoded + val signature = ( + if (result.isVerifiedUsingV3Scheme) { + result.v3SchemeSigners[0].certificate + } else if (result.isVerifiedUsingV2Scheme) { + result.v2SchemeSigners[0].certificate + } else if (result.isVerifiedUsingV1Scheme) { + result.v1SchemeSigners[0].certificate + } else { + return null + } + ).encoded return hexFormat.formatHex(signature) } catch (_: IOException) { @@ -89,4 +88,4 @@ private fun parseSignature(optionValue: String): String? { } return null -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34.kt index c79654d1fc..05beaf8f0c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34.kt @@ -6,13 +6,13 @@ import org.w3c.dom.Element import java.util.logging.Logger @Suppress("unused") -val setTargetSdkVersion34 = resourcePatch( +val setTargetSDKVersion34Patch = resourcePatch( name = "Set target SDK version 34", description = "Changes the target SDK to version 34 (Android 14). " + - "For devices running Android 15+, this will disable edge-to-edge display.", + "For devices running Android 15+, this will disable edge-to-edge display.", use = false, ) { - execute { + apply { val targetSdkOverride = 34 // Android 14. document("AndroidManifest.xml").use { document -> @@ -24,12 +24,12 @@ val setTargetSdkVersion34 = resourcePatch( try { val manifestElement = document.getNode("manifest") as Element val compileSdkVersion = Integer.parseInt( - manifestElement.getAttribute("android:compileSdkVersion") + manifestElement.getAttribute("android:compileSdkVersion"), ) if (compileSdkVersion <= targetSdkOverride) { getLogger().warning( "This app does not appear to use a target SDK above $targetSdkOverride: " + - "(compileSdkVersion: $compileSdkVersion)" + "(compileSdkVersion: $compileSdkVersion)", ) } } catch (_: Exception) { diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt index 0c39436d1c..0535d6f06f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt @@ -1,7 +1,7 @@ package app.revanced.patches.all.misc.transformation -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.replaceInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.instruction.Instruction diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt index 6564f4f26a..914d8ab85e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt @@ -1,49 +1,22 @@ package app.revanced.patches.all.misc.transformation +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.util.findMutableMethodOf +import app.revanced.util.forEachInstructionAsSequence import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction +@Deprecated( + "Use forEachInstructionAsSequence directly within a bytecodePatch", ReplaceWith( + "bytecodePatch { apply { forEachInstructionAsSequence(filterMap, transform) } }", + "app.revanced.util.forEachInstructionAsSequence", + "app.revanced.patcher.patch.bytecodePatch", + ) +) fun transformInstructionsPatch( filterMap: (ClassDef, Method, Instruction, Int) -> T?, transform: (MutableMethod, T) -> Unit, ) = bytecodePatch { - // Returns the patch indices as a Sequence, which will execute lazily. - fun findPatchIndices(classDef: ClassDef, method: Method): Sequence? = - method.implementation?.instructions?.asSequence()?.withIndex()?.mapNotNull { (index, instruction) -> - filterMap(classDef, method, instruction, index) - } - - execute { - // Find all methods to patch - buildMap { - classes.forEach { classDef -> - val methods = buildList { - classDef.methods.forEach { method -> - // Since the Sequence executes lazily, - // using any() results in only calling - // filterMap until the first index has been found. - if (findPatchIndices(classDef, method)?.any() == true) add(method) - } - } - - if (methods.isNotEmpty()) { - put(classDef, methods) - } - } - }.forEach { (classDef, methods) -> - // And finally transform the methods... - val mutableClass = proxy(classDef).mutableClass - - methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod -> - val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque()) - ?: return@methods - - while (!patchIndices.isEmpty()) transform(mutableMethod, patchIndices.removeLast()) - } - } - } + apply { forEachInstructionAsSequence(filterMap, transform) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/versioncode/ChangeVersionCodePatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/versioncode/ChangeVersionCodePatch.kt index a50fe58da3..1aa803e222 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/versioncode/ChangeVersionCodePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/versioncode/ChangeVersionCodePatch.kt @@ -9,23 +9,22 @@ import org.w3c.dom.Element val changeVersionCodePatch = resourcePatch( name = "Change version code", description = "Changes the version code of the app. This will turn off app store updates " + - "and allows downgrading an existing app install to an older app version.", + "and allows downgrading an existing app install to an older app version.", use = false, ) { val versionCode by intOption( - key = "versionCode", default = Int.MAX_VALUE, values = mapOf( "Lowest" to 1, "Highest" to Int.MAX_VALUE, ), - title = "Version code", + name = "Version code", description = "The version code to use. Using the highest value turns off app store " + - "updates and allows downgrading an existing app install to an older app version.", + "updates and allows downgrading an existing app install to an older app version.", required = true, ) { versionCode -> versionCode!! >= 1 } - execute { + apply { document("AndroidManifest.xml").use { document -> val manifestElement = document.getNode("manifest") as Element manifestElement.setAttribute("android:versionCode", "$versionCode") diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt index bf53d86220..1a8041d7dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt @@ -1,22 +1,16 @@ package app.revanced.patches.amazon -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val deepLinkingPatch = bytecodePatch( +val alwaysAllowDeepLinkingPatch = bytecodePatch( name = "Always allow deep-linking", description = "Open Amazon links, even if the app is not set to handle Amazon links.", ) { compatibleWith("com.amazon.mShop.android.shopping") - execute { - deepLinkingFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + deepLinkingMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt index 1339149f43..2eebbc58fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.amazon -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val deepLinkingFingerprint = fingerprint { +internal val BytecodePatchContext.deepLinkingMethod by gettingFirstMethodDeclaratively( + "https://www.", + "android.intent.action.VIEW" +) { accessFlags(AccessFlags.PRIVATE) - returns("Z") - parameters("L") - strings("https://www.", "android.intent.action.VIEW") + returnType("Z") + parameterTypes("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt index 3196adb7e1..9119bbdfbb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt @@ -1,6 +1,9 @@ package app.revanced.patches.angulus.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags // Keywords to search for in case the method name changes: @@ -9,10 +12,9 @@ import com.android.tools.smali.dexlib2.AccessFlags // dailyAdResetCount // MeasurementPrefs -// This fingerprint targets a method that returns the daily measurement count. +// This targets a method that returns the daily measurement count. // This method is used to determine if the user has reached the daily limit of measurements. -internal val getDailyMeasurementCountFingerprint = fingerprint { +internal val BytecodePatchContext.getDailyMeasurementCountMethod by gettingFirstMethodDeclaratively("dailyMeasurementCount") { accessFlags(AccessFlags.PRIVATE) - returns("I") - strings("dailyMeasurementCount") + returnType("I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt index c1f3acb8ea..18af561cc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt @@ -1,17 +1,17 @@ package app.revanced.patches.angulus.ads import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.misc.pairip.license.disableLicenseCheckPatch +import app.revanced.patches.shared.misc.pairip.license.disablePairipLicenseCheckPatch import app.revanced.util.returnEarly @Suppress("unused") -val angulusPatch = bytecodePatch(name = "Hide ads") { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.drinkplusplus.angulus") - dependsOn(disableLicenseCheckPatch) + dependsOn(disablePairipLicenseCheckPatch) - execute { + apply { // Always return 0 as the daily measurement count. - getDailyMeasurementCountFingerprint.method.returnEarly(0) + getDailyMeasurementCountMethod.returnEarly(0) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt deleted file mode 100644 index f8b1466228..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.backdrops.misc.pro - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode - -@Deprecated("Fingerprint no longer resolves and will soon be deleted.") -internal val proUnlockFingerprint = fingerprint { - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - ) - custom { method, _ -> - method.name == "lambda\$existPurchase\$0" && - method.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt deleted file mode 100644 index 0516e1eb72..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt +++ /dev/null @@ -1,24 +0,0 @@ -package app.revanced.patches.backdrops.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Suppress("unused") -@Deprecated("This patch no longer works and will soon be deleted.") -val proUnlockPatch = bytecodePatch{ - compatibleWith("com.backdrops.wallpapers") - - execute { - val registerIndex = proUnlockFingerprint.patternMatch!!.endIndex - 1 - - proUnlockFingerprint.method.apply { - val register = getInstruction(registerIndex).registerA - addInstruction( - proUnlockFingerprint.patternMatch!!.endIndex, - "const/4 v$register, 0x1", - ) - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt index 15d306bc94..8a7eaa096e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt @@ -1,7 +1,9 @@ package app.revanced.patches.bandcamp.limitations -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val handlePlaybackLimitsFingerprint = fingerprint { - strings("track_id", "play_count") -} +internal val BytecodePatchContext.handlePlaybackLimitsMethod by gettingFirstMethodDeclaratively( + "track_id", + "play_count" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt index f0740d04c3..6fda82ae46 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt @@ -10,7 +10,7 @@ val removePlayLimitsPatch = bytecodePatch( ) { compatibleWith("com.bandcamp.android") - execute { - handlePlaybackLimitsFingerprint.method.returnEarly() + apply { + handlePlaybackLimitsMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt index c2abcc5b6f..fc8a3322ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.cieid.restrictions.root -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val bypassRootChecksPatch = bytecodePatch( @@ -10,7 +10,7 @@ val bypassRootChecksPatch = bytecodePatch( ) { compatibleWith("it.ipzs.cieid") - execute { - checkRootFingerprint.method.addInstruction(1, "return-void") + apply { + checkRootMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt index 387b0a0be8..8bbcb5ea2c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.cieid.restrictions.root -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkRootFingerprint = fingerprint { - custom { method, _ -> - method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" - } +internal val BytecodePatchContext.checkRootMethod by gettingFirstMethodDeclaratively { + name("onResume") + definingClass("Lit/ipzs/cieid/BaseActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt index bf2ee4120c..91df4531c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt @@ -1,28 +1,25 @@ package app.revanced.patches.com.sbs.ondemand.tv -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val shouldShowAdvertisingTVFingerprint = fingerprint { - returns("Z") - custom { method, classDef -> - method.name == "getShouldShowAdvertisingTV" && - classDef.type == "Lcom/sbs/ondemand/common/InMemoryStorage;" - } +val BytecodePatchContext.shouldShowAdvertisingTVMethod by gettingFirstMethodDeclaratively { + name("getShouldShowAdvertisingTV") + definingClass("Lcom/sbs/ondemand/common/InMemoryStorage;") + returnType("Z") } -internal val shouldShowPauseAdFingerprint = fingerprint { - returns("Z") - custom { method, classDef -> - method.name == "shouldShowPauseAd" && - classDef.type == "Lcom/sbs/ondemand/player/viewmodels/PauseAdController;" - } +internal val BytecodePatchContext.shouldShowPauseAdMethod by gettingFirstMethodDeclaratively { + name("shouldShowPauseAd") + definingClass("Lcom/sbs/ondemand/player/viewmodels/PauseAdController;") + returnType("Z") } -internal val requestAdStreamFingerprint = fingerprint { - returns("V") - custom { method, classDef -> - method.name == "requestAdStream\$player_googleStoreTvRelease" && - classDef.type == "Lcom/sbs/ondemand/player/viewmodels/AdsController;" - } +internal val BytecodePatchContext.requestAdStreamMethod by gettingFirstMethodDeclaratively { + name("requestAdStream\$player_googleStoreTvRelease") + definingClass("Lcom/sbs/ondemand/player/viewmodels/AdsController;") + returnType("V") } - diff --git a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt index 1b628562a2..a0579b97ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/RemoveAdsPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.com.sbs.ondemand.tv -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.misc.pairip.license.disableLicenseCheckPatch +import app.revanced.patches.shared.misc.pairip.license.disablePairipLicenseCheckPatch import app.revanced.util.returnEarly @Suppress("unused") @@ -12,11 +12,11 @@ val removeAdsPatch = bytecodePatch( ) { compatibleWith("com.sbs.ondemand.tv") - dependsOn(disableLicenseCheckPatch) + dependsOn(disablePairipLicenseCheckPatch) - execute { - shouldShowAdvertisingTVFingerprint.method.returnEarly(true) - shouldShowPauseAdFingerprint.method.returnEarly(false) + apply { + shouldShowAdvertisingTVMethod.returnEarly(true) + shouldShowPauseAdMethod.returnEarly(false) // Remove on-demand pre-roll advertisements using exception handling. // Exception handling is used instead of returnEarly() because: @@ -24,14 +24,14 @@ val removeAdsPatch = bytecodePatch( // 2. SBS app has built-in exception handling in handleProviderFailure(). // 3. Exception triggers fallbackToAkamaiProvider() which loads actual content. // 4. This preserves the intended app flow: first try ads, then fail gracefully, then load content. - requestAdStreamFingerprint.method.addInstructions( - 0, + requestAdStreamMethod.addInstructions( + 0, """ new-instance v0, Ljava/lang/RuntimeException; const-string v1, "Ad stream disabled" invoke-direct {v0, v1}, Ljava/lang/RuntimeException;->(Ljava/lang/String;)V throw v0 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt index 3a1829dbc8..6dde6e7257 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/DisableAdsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.cricbuzz.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.cricbuzz.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -15,26 +15,25 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/cricbuzz/ads/HideAdsPatch;" @Suppress("unused") -val disableAdsPatch = bytecodePatch ( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.cricbuzz.android"("6.24.01")) dependsOn(sharedExtensionPatch) - execute { - userStateSwitchFingerprint.method.returnEarly(true) + apply { + userStateSwitchMethod.returnEarly(true) // Remove region-specific Cricbuzz11 elements. - cb11ConstructorFingerprint.method.addInstruction(0, "const/4 p7, 0x0") - getBottomBarFingerprint.method.apply { - val getIndex = indexOfFirstInstructionOrThrow() { + cb11ConstructorMethod.addInstruction(0, "const/4 p7, 0x0") + getBottomBarMethod.apply { + val getIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.IGET_OBJECT && getReference()?.name == "bottomBar" } val getRegister = getInstruction(getIndex).registerA - addInstruction(getIndex + 1, - "invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->filterCb11(Ljava/util/List;)V" + addInstruction( + getIndex + 1, + "invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->filterCb11(Ljava/util/List;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt index 9dd6844fda..cafcb7792b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.cricbuzz.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val userStateSwitchFingerprint = fingerprint { +internal val BytecodePatchContext.userStateSwitchMethod by gettingFirstMethodDeclaratively("key.user.state", "NA") { opcodes(Opcode.SPARSE_SWITCH) - strings("key.user.state", "NA") } -internal val cb11ConstructorFingerprint = fingerprint { - parameters( +internal val BytecodePatchContext.cb11ConstructorMethod by gettingFirstMethodDeclaratively { + definingClass("CB11Details;") + parameterTypes( "Ljava/lang/String;", "Ljava/lang/String;", "Ljava/lang/String;", @@ -19,15 +20,11 @@ internal val cb11ConstructorFingerprint = fingerprint { "Z", "Ljava/lang/String;", "Ljava/lang/String;", - "L" + "L", ) - custom { _, classDef -> - classDef.endsWith("CB11Details;") - } } -internal val getBottomBarFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getBottomBar" && classDef.endsWith("HomeMenu;") - } -} \ No newline at end of file +internal val BytecodePatchContext.getBottomBarMethod by gettingFirstMethodDeclaratively { + name("getBottomBar") + definingClass("HomeMenu;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt index c6520086d3..3b4e0da2c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt @@ -1,9 +1,5 @@ package app.revanced.patches.cricbuzz.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/NyitoActivity;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook("/NyitoActivity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt index 0266e0344d..43bd86dbdb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt @@ -1,7 +1,10 @@ package app.revanced.patches.crunchyroll.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext -internal val videoUrlReadyToStringFingerprint = fingerprint { - strings("VideoUrlReady(url=", ", enableAds=") +internal val BytecodePatchContext.videoUrlReadyToStringMethodMatch by composingFirstMethod { + instructions("VideoUrlReady(url="(), ", enableAds="()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt index bb354a5686..3a697c3b75 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/HideAdsPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.crunchyroll.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -13,34 +13,35 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads" -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.crunchyroll.crunchyroid") - execute { + apply { // Get obfuscated "enableAds" field from toString method. - val enableAdsField = videoUrlReadyToStringFingerprint.let { - val strIndex = videoUrlReadyToStringFingerprint.stringMatches!!.last().index - val fieldIndex = it.method.indexOfFirstInstruction(strIndex, Opcode.IGET_BOOLEAN) - it.method.getInstruction(fieldIndex).getReference()!! + val enableAdsField = videoUrlReadyToStringMethodMatch.method.let { + val stringIndex = videoUrlReadyToStringMethodMatch[-1] + val fieldIndex = it.indexOfFirstInstruction(stringIndex, Opcode.IGET_BOOLEAN) + + it.getInstruction(fieldIndex).getReference()!! } // Remove final access flag on field. - videoUrlReadyToStringFingerprint.classDef.fields + videoUrlReadyToStringMethodMatch.classDef.fields .first { it.name == enableAdsField.name } .removeFlags(AccessFlags.FINAL) // Override enableAds field in non-default constructor. - val constructor = videoUrlReadyToStringFingerprint.classDef.methods.first { + val constructor = videoUrlReadyToStringMethodMatch.classDef.methods.first { AccessFlags.CONSTRUCTOR.isSet(it.accessFlags) && it.parameters.isNotEmpty() } + constructor.addInstructions( constructor.instructions.count() - 1, """ move-object/from16 v0, p0 const/4 v1, 0x0 iput-boolean v1, v0, $enableAdsField - """) + """, + ) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt index 5cd67cba86..cffcd34830 100644 --- a/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/disneyplus/Fingerprints.kt @@ -1,19 +1,19 @@ -package app.revanced.patches.disneyplus.ads +package app.revanced.patches.disneyplus -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val insertionGetPointsFingerprint = fingerprint { - returns("Ljava/util/List") - custom { method, _ -> - method.name == "getPoints" && - method.definingClass == "Lcom/dss/sdk/internal/media/Insertion;" - } +internal val BytecodePatchContext.insertionGetPointsMethod by gettingFirstMethodDeclaratively { + name("getPoints") + definingClass("Lcom/dss/sdk/internal/media/Insertion;") + returnType("Ljava/util/List") } -internal val insertionGetRangesFingerprint = fingerprint { - returns("Ljava/util/List") - custom { method, _ -> - method.name == "getRanges" && - method.definingClass == "Lcom/dss/sdk/internal/media/Insertion;" - } +internal val BytecodePatchContext.insertionGetRangesMethod by gettingFirstMethodDeclaratively { + name("getRanges") + definingClass("Lcom/dss/sdk/internal/media/Insertion;") + returnType("Ljava/util/List") } diff --git a/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt index 5b0f551cdb..b182241ab0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/disneyplus/SkipAdsPatch.kt @@ -1,6 +1,6 @@ -package app.revanced.patches.disneyplus.ads +package app.revanced.patches.disneyplus -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,11 +10,11 @@ val skipAdsPatch = bytecodePatch( ) { compatibleWith("com.disney.disneyplus") - execute { - arrayOf(insertionGetPointsFingerprint, insertionGetRangesFingerprint).forEach { - it.method.addInstructions( - 0, - """ + apply { + arrayOf(insertionGetPointsMethod, insertionGetRangesMethod).forEach { + it.addInstructions( + 0, + """ new-instance v0, Ljava/util/ArrayList; invoke-direct {v0}, Ljava/util/ArrayList;->()V return-object v0 diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt index 7f9863b74a..b83834c67a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt @@ -1,18 +1,18 @@ package app.revanced.patches.duolingo.ad -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Suppress("unused") -val disableAdsPatch = bytecodePatch( - "Disable ads", -) { +val disableAdsPatch = bytecodePatch("Disable ads") { // 6.55.3 and higher can show ads after each exercise. compatibleWith("com.duolingo"("6.54.5")) - execute { + apply { // Couple approaches to remove ads exist: // // MonetizationDebugSettings has a boolean value for "disableAds". @@ -20,10 +20,9 @@ val disableAdsPatch = bytecodePatch( // SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS". // // MonetizationDebugSettings seems to be the most general setting to work fine. - initializeMonetizationDebugSettingsFingerprint - .match(monetizationDebugSettingsToStringFingerprint.classDef) - .method.apply { - val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex + monetizationDebugSettingsToStringMethod.immutableClassDef.initializeMonetizationDebugSettingsMethodMatch.let { + it.method.apply { + val insertIndex = it[0] val register = getInstruction(insertIndex).registerA addInstructions( @@ -31,5 +30,6 @@ val disableAdsPatch = bytecodePatch( "const/4 v$register, 0x1", ) } + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt index 8ec0068dae..ba0ffcc5c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt @@ -1,17 +1,19 @@ package app.revanced.patches.duolingo.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val initializeMonetizationDebugSettingsFingerprint = fingerprint { +internal val ClassDef.initializeMonetizationDebugSettingsMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - // Parameters have not been reliable for fingerprinting between versions. + returnType("V") + // Parameters have not been reliable for matching between versions. opcodes(Opcode.IPUT_BOOLEAN) } -internal val monetizationDebugSettingsToStringFingerprint = fingerprint { - strings("MonetizationDebugSettings(") // Partial string match. - custom { method, _ -> method.name == "toString" } -} \ No newline at end of file +internal val BytecodePatchContext.monetizationDebugSettingsToStringMethod by gettingFirstMethodDeclaratively { + name("toString") + instructions(string("MonetizationDebugSettings(", String::contains)) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index a507352e83..0d9681e8f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -1,7 +1,9 @@ package app.revanced.patches.duolingo.debug -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -9,27 +11,20 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val enableDebugMenuPatch = bytecodePatch( name = "Enable debug menu", - use = false + use = false, ) { compatibleWith("com.duolingo") - execute { + apply { // It seems all categories are allowed on release. Force this on anyway. - debugCategoryAllowOnReleaseBuildsFingerprint.method.returnEarly(true) + debugCategoryAllowOnReleaseBuildsMethod.returnEarly(true) // Change build config debug build flag. - buildConfigProviderConstructorFingerprint.match( - buildConfigProviderToStringFingerprint.classDef - ).let { - val index = it.patternMatch!!.startIndex + buildConfigProviderToStringMethod.immutableClassDef.buildConfigProviderConstructorMethodMatch.let { + val index = it[0] - it.method.apply { - val register = getInstruction(index).registerA - addInstruction( - index + 1, - "const/4 v$register, 0x1" - ) - } + val register = it.method.getInstruction(index).registerA + it.method.addInstruction(index + 1, "const/4 v$register, 0x1") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index c3d663c838..5c030afb23 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -1,28 +1,27 @@ package app.revanced.patches.duolingo.debug -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint { - returns("Z") - parameters() - custom { method, classDef -> - method.name == "getAllowOnReleaseBuilds" && classDef.type == "Lcom/duolingo/debug/DebugCategory;" - } +internal val BytecodePatchContext.debugCategoryAllowOnReleaseBuildsMethod by gettingFirstMethodDeclaratively { + name("getAllowOnReleaseBuilds") + definingClass("Lcom/duolingo/debug/DebugCategory;") + returnType("Z") + parameterTypes() } -internal val buildConfigProviderConstructorFingerprint = fingerprint { +internal val ClassDef.buildConfigProviderConstructorMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters() + parameterTypes() opcodes(Opcode.CONST_4) } -internal val buildConfigProviderToStringFingerprint = fingerprint { - parameters() - returns("Ljava/lang/String;") - strings("BuildConfigProvider(") // Partial string match. - custom { method, _ -> - method.name == "toString" - } +internal val BytecodePatchContext.buildConfigProviderToStringMethod by gettingFirstMethodDeclaratively { + name("toString") + parameterTypes() + returnType("Ljava/lang/String;") + instructions(string("BuildConfigProvider(", String::contains)) } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt index 73dbcf304c..a0fa96ca64 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -1,21 +1,25 @@ package app.revanced.patches.duolingo.energy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -/** - * Matches the class found in [energyConfigToStringFingerprint]. - */ -internal val initializeEnergyConfigFingerprint = fingerprint { +internal val ClassDef.initializeEnergyConfigMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes(Opcode.RETURN_VOID) } -// Class name currently is not obfuscated but it may be in the future. -internal val energyConfigToStringFingerprint = fingerprint { - parameters() - returns("Ljava/lang/String;") - strings("EnergyConfig(", "maxEnergy=") // Partial string matches. - custom { method, _ -> method.name == "toString" } +// Class name currently is not obfuscated, but it may be in the future. +internal val BytecodePatchContext.energyConfigToStringMethod by gettingFirstMethodDeclaratively { + name("toString") + parameterTypes() + returnType("Ljava/lang/String;") + instructions( + predicates=unorderedAllOf( + "EnergyConfig("(String::contains), + "maxEnergy="(String::contains), + ) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt index bec800f50c..cb7be55660 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt @@ -1,31 +1,32 @@ package app.revanced.patches.duolingo.energy -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.findFieldFromToString @Suppress("unused") val skipEnergyRechargeAdsPatch = bytecodePatch( name = "Skip energy recharge ads", - description = "Skips watching ads to recharge energy." + description = "Skips watching ads to recharge energy.", ) { compatibleWith("com.duolingo") - execute { - initializeEnergyConfigFingerprint - .match(energyConfigToStringFingerprint.classDef) - .method.apply { - val energyField = energyConfigToStringFingerprint.method - .findFieldFromToString("energy=") - val insertIndex = initializeEnergyConfigFingerprint.patternMatch!!.startIndex + apply { + energyConfigToStringMethod.immutableClassDef.initializeEnergyConfigMethodMatch.let { + it.method.apply { + val energyField = energyConfigToStringMethod.findFieldFromToString("energy=") + val insertIndex = it[0] addInstructions( insertIndex, """ - const/16 v0, 99 - iput v0, p0, $energyField - """ + const/16 v0, 99 + iput v0, p0, $energyField + """, ) } + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt index e84a448baa..9a06e21840 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.facebook.ads.mainfeed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val baseModelMapperFingerprint = fingerprint { +internal val BytecodePatchContext.baseModelMapperMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") - parameters("Ljava/lang/Class", "I", "I") + returnType("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") + parameterTypes("Ljava/lang/Class", "I", "I") opcodes( Opcode.SGET_OBJECT, Opcode.INVOKE_STATIC, @@ -16,11 +17,11 @@ internal val baseModelMapperFingerprint = fingerprint { Opcode.IF_EQ, ) } - -internal val getSponsoredDataModelTemplateFingerprint = fingerprint { +internal val BytecodePatchContext.getSponsoredDataModelTemplateMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("Lcom/facebook/graphql/model/GraphQLFBMultiAdsFeedUnit;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() + returnType("L") + parameterTypes() opcodes( Opcode.CONST, Opcode.CONST, @@ -28,14 +29,10 @@ internal val getSponsoredDataModelTemplateFingerprint = fingerprint { Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, ) - custom { _, classDef -> - classDef.type == "Lcom/facebook/graphql/model/GraphQLFBMultiAdsFeedUnit;" - } } - -internal val getStoryVisibilityFingerprint = fingerprint { +internal val BytecodePatchContext.getStoryVisibilityMethodMatch by composingFirstMethod("This should not be called for base class object") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") + returnType("Ljava/lang/String;") opcodes( Opcode.INSTANCE_OF, Opcode.IF_NEZ, @@ -45,5 +42,4 @@ internal val getStoryVisibilityFingerprint = fingerprint { Opcode.IF_NEZ, Opcode.CONST, ) - strings("This should not be called for base class object") } diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt index 49d54c2b3f..8a2647eb52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.facebook.ads.mainfeed -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i @@ -11,14 +11,11 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter @Suppress("unused") -val hideSponsoredStoriesPatch = bytecodePatch( - name = "Hide 'Sponsored Stories'", -) { +val hideSponsoredStoriesPatch = bytecodePatch("Hide 'Sponsored Stories'") { compatibleWith("com.facebook.katana"("490.0.0.63.82")) - execute { - val sponsoredDataModelTemplateMethod = getSponsoredDataModelTemplateFingerprint.originalMethod - val baseModelMapperMethod = baseModelMapperFingerprint.originalMethod + apply { + val sponsoredDataModelTemplateMethod = getSponsoredDataModelTemplateMethod val baseModelWithTreeType = baseModelMapperMethod.returnType val graphQlStoryClassDescriptor = "Lcom/facebook/graphql/model/GraphQLStory;" @@ -28,7 +25,7 @@ val hideSponsoredStoriesPatch = bytecodePatch( // could change in future version, we need to extract them and call the base implementation directly. val getSponsoredDataHelperMethod = ImmutableMethod( - getStoryVisibilityFingerprint.originalClassDef.type, + getStoryVisibilityMethodMatch.immutableClassDef.type, "getSponsoredData", listOf(ImmutableMethodParameter(graphQlStoryClassDescriptor, null, null)), baseModelWithTreeType, @@ -62,12 +59,12 @@ val hideSponsoredStoriesPatch = bytecodePatch( ) } - getStoryVisibilityFingerprint.classDef.methods.add(getSponsoredDataHelperMethod) + getStoryVisibilityMethodMatch.classDef.methods.add(getSponsoredDataHelperMethod) // Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value. // If so, hide the story by setting the visibility to StoryVisibility.GONE. - getStoryVisibilityFingerprint.method.addInstructionsWithLabels( - getStoryVisibilityFingerprint.patternMatch!!.startIndex, + getStoryVisibilityMethodMatch.method.addInstructionsWithLabels( + getStoryVisibilityMethodMatch[0], """ instance-of v0, p0, $graphQlStoryClassDescriptor if-eqz v0, :resume_normal diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt index 293d7ee82f..21cba5880b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt @@ -1,24 +1,24 @@ package app.revanced.patches.facebook.ads.story -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val adsInsertionFingerprint = fieldFingerprint( - fieldValue = "AdBucketDataSourceUtil\$attemptAdsInsertion\$1", +internal val BytecodePatchContext.adsInsertionMethod by runMethod( + fieldValue = $$"AdBucketDataSourceUtil$attemptAdsInsertion$1", ) -internal val fetchMoreAdsFingerprint = fieldFingerprint( - fieldValue = "AdBucketDataSourceUtil\$attemptFetchMoreAds\$1", +internal val BytecodePatchContext.fetchMoreAdsMethod by runMethod( + fieldValue = $$"AdBucketDataSourceUtil$attemptFetchMoreAds$1", ) -internal fun fieldFingerprint(fieldValue: String) = fingerprint { - returns("V") - parameters() - custom { method, classDef -> - method.name == "run" && - classDef.fields.any any@{ field -> - if (field.name != "__redex_internal_original_name") return@any false - (field.initialValue as? StringEncodedValue)?.value == fieldValue - } +internal fun runMethod(fieldValue: String) = gettingFirstMethodDeclaratively { + name("run") + returnType("V") + parameterTypes() + custom { + immutableClassDef.anyField { + name == "__redex_internal_original_name" && (initialValue as? StringEncodedValue)?.value == fieldValue + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/HideStoryAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/HideStoryAdsPatch.kt index ec811fc3c3..88e44efc79 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/HideStoryAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/HideStoryAdsPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.facebook.ads.story -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val hideStoryAdsPatch = bytecodePatch( @@ -10,12 +11,7 @@ val hideStoryAdsPatch = bytecodePatch( ) { compatibleWith("com.facebook.katana") - execute { - setOf( - fetchMoreAdsFingerprint, - adsInsertionFingerprint, - ).forEach { fingerprint -> - fingerprint.method.replaceInstruction(0, "return-void") - } + apply { + setOf(fetchMoreAdsMethod, adsInsertionMethod).forEach(MutableMethod::returnEarly) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt index 76dc2413fa..81507bb21c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt @@ -1,24 +1,18 @@ package app.revanced.patches.finanzonline.detection.bootloader -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val bootloaderDetectionPatch = bytecodePatch( +val removeBootloaderDetectionPatch = bytecodePatch( name = "Remove bootloader detection", description = "Removes the check for an unlocked bootloader.", ) { compatibleWith("at.gv.bmf.bmf2go") - execute { - setOf(createKeyFingerprint, bootStateFingerprint).forEach { fingerprint -> - fingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + setOf(createKeyMethod, bootStateMethod).forEach { method -> + method.returnEarly(true) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt index 4c8ee1c541..30b1eb312e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt @@ -1,13 +1,17 @@ package app.revanced.patches.finanzonline.detection.bootloader -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1) -internal val bootStateFingerprint = fingerprint { +internal val BytecodePatchContext.bootStateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) - returns("Z") + returnType("Z") opcodes( Opcode.INVOKE_DIRECT, Opcode.MOVE_RESULT_OBJECT, @@ -25,13 +29,18 @@ internal val bootStateFingerprint = fingerprint { Opcode.IF_NE, Opcode.GOTO, Opcode.MOVE, - Opcode.RETURN + Opcode.RETURN, ) } // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1) -internal val createKeyFingerprint = fingerprint { +internal val BytecodePatchContext.createKeyMethod by gettingFirstMethodDeclaratively( + "attestation", + "SHA-256", + "random", + "EC", + "AndroidKeyStore", +) { accessFlags(AccessFlags.PUBLIC) - returns("Z") - strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore") -} \ No newline at end of file + returnType("Z") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt index fec7f1249f..3e5fb33109 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt @@ -1,14 +1,15 @@ package app.revanced.patches.finanzonline.detection.root -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1) -internal val rootDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.rootDetectionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L") + returnType("L") + parameterTypes("L") opcodes( Opcode.NEW_INSTANCE, Opcode.INVOKE_DIRECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt index c5ce1efe11..8ff3efd1c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt @@ -1,19 +1,17 @@ package app.revanced.patches.finanzonline.detection.root -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION -import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION @Suppress("unused") -val rootDetectionPatch = bytecodePatch( - name = PATCH_NAME_REMOVE_ROOT_DETECTION, - description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION, +val removeRootDetectionPatch = bytecodePatch( + name = "Remove root detection", + description = "Removes the check for root permissions and unlocked bootloader.", ) { compatibleWith("at.gv.bmf.bmf2go") - execute { - rootDetectionFingerprint.method.addInstructions( + apply { + rootDetectionMethod.addInstructions( 0, """ sget-object v0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean; diff --git a/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/Fingerprints.kt index e37f52ed9c..0a9b331615 100644 --- a/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/Fingerprints.kt @@ -1,12 +1,17 @@ package app.revanced.patches.fotmob.ads +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val shouldDisplayAdsMethod = fingerprint { +internal val BytecodePatchContext.shouldDisplayAdsMethod by gettingFirstMethodDeclaratively { + name("shouldDisplayAds") + definingClass("AdsService;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - custom { method, classDef -> - method.name == "shouldDisplayAds" && classDef.type.endsWith("AdsService;") - } + returnType("Z") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/HideAdsPatch.kt index 563247fdd2..1b8910ba54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/fotmob/ads/HideAdsPatch.kt @@ -9,7 +9,7 @@ val hideAdsPatch = bytecodePatch( ) { compatibleWith("com.mobilefootie.wc2010") - execute { - shouldDisplayAdsMethod.method.returnEarly(false) + apply { + shouldDisplayAdsMethod.returnEarly(false) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt index ee7997a54e..a095f0d743 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.googlenews.customtabs -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -12,9 +12,9 @@ val enableCustomTabsPatch = bytecodePatch( ) { compatibleWith("com.google.android.apps.magazines") - execute { - launchCustomTabFingerprint.method.apply { - val checkIndex = launchCustomTabFingerprint.patternMatch!!.endIndex + 1 + apply { + launchCustomTabMethodMatch.method.apply { + val checkIndex = launchCustomTabMethodMatch[-1] + 1 val register = getInstruction(checkIndex).registerA replaceInstruction(checkIndex, "const/4 v$register, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt index 8880c010e9..4d27d45281 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt @@ -1,10 +1,15 @@ package app.revanced.patches.googlenews.customtabs -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.definingClass +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val launchCustomTabFingerprint = fingerprint { +internal val BytecodePatchContext.launchCustomTabMethodMatch by composingFirstMethod { + definingClass("CustomTabsArticleLauncher;") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.IPUT_OBJECT, @@ -13,5 +18,4 @@ internal val launchCustomTabFingerprint = fingerprint { Opcode.CONST_4, Opcode.IPUT_BOOLEAN, ) - custom { _, classDef -> classDef.endsWith("CustomTabsArticleLauncher;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/extension/hooks/StartActivityInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/extension/hooks/StartActivityInitHook.kt index 4e9e5c14c9..3096647525 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/extension/hooks/StartActivityInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/extension/hooks/StartActivityInitHook.kt @@ -1,5 +1,11 @@ package app.revanced.patches.googlenews.misc.extension.hooks +import app.revanced.patcher.definingClass +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.opcodes import app.revanced.patches.shared.misc.extension.extensionHook import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -10,19 +16,20 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private var getApplicationContextIndex = -1 internal val startActivityInitHook = extensionHook( - insertIndexResolver = { method -> - getApplicationContextIndex = method.indexOfFirstInstructionOrThrow { + getInsertIndex = { + getApplicationContextIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "getApplicationContext" } getApplicationContextIndex + 2 // Below the move-result-object instruction. }, - contextRegisterResolver = { method -> - val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1) - as OneRegisterInstruction + getContextRegister = { + val moveResultInstruction = instructions.elementAt(getApplicationContextIndex + 1) as OneRegisterInstruction "v${moveResultInstruction.registerA}" }, ) { + name("onCreate") + definingClass("/StartActivity;") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, @@ -35,7 +42,4 @@ internal val startActivityInitHook = extensionHook( Opcode.INVOKE_VIRTUAL, // Calls startActivity.getApplicationContext(). Opcode.MOVE_RESULT_OBJECT, ) - custom { methodDef, classDef -> - methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt index 6ddeb3e07f..8557f4f496 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.googlenews.misc.gms -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val magazinesActivityOnCreateFingerprint = fingerprint { - custom { methodDef, classDef -> - methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") - } +internal val BytecodePatchContext.magazinesActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/StartActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt index 69481a8033..a795ed1f7c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch.kt @@ -1,23 +1,23 @@ package app.revanced.patches.googlenews.misc.gms +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Option import app.revanced.patches.googlenews.misc.extension.extensionPatch import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.patches.shared.misc.gms.gmsCoreSupportResourcePatch -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = MAGAZINES_PACKAGE_NAME, toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME, - mainActivityOnCreateFingerprintToInsertIndex = magazinesActivityOnCreateFingerprint to { + getMainActivityOnCreateMethodToGetInsertIndex = BytecodePatchContext::magazinesActivityOnCreateMethod::get to { val getApplicationContextIndex = - magazinesActivityOnCreateFingerprint.method.indexOfFirstInstructionOrThrow { - getReference()?.name == "getApplicationContext" + magazinesActivityOnCreateMethod.indexOfFirstInstructionOrThrow { + methodReference?.name == "getApplicationContext" } getApplicationContextIndex + 2 // Below the move-result-object instruction. diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt index 35c541159e..bc13aaa1b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/EnableDCIMFoldersBackupControlPatch.kt @@ -7,12 +7,12 @@ import app.revanced.util.returnEarly val enableDCIMFoldersBackupControlPatch = bytecodePatch( name = "Enable DCIM folders backup control", description = "Disables always on backup for the Camera and other DCIM folders, allowing you to control backup " + - "for each folder individually. This will make the app default to having no folders backed up.", + "for each folder individually. This will make the app default to having no folders backed up.", use = false, ) { compatibleWith("com.google.android.apps.photos") - execute { - isDCIMFolderBackupControlDisabled.method.returnEarly(false) + apply { + isDCIMFolderBackupControlMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt index 71dda1f3ac..60dae79bc3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt @@ -1,8 +1,9 @@ package app.revanced.patches.googlephotos.misc.backup -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val isDCIMFolderBackupControlDisabled = fingerprint { - returns("Z") - strings("/dcim", "/mars_files/") +internal val BytecodePatchContext.isDCIMFolderBackupControlMethod by gettingFirstMethodDeclaratively("/dcim", "/mars_files/") { + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/extension/Hooks.kt index ca1065faaf..8ed9937cff 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/extension/Hooks.kt @@ -1,5 +1,11 @@ package app.revanced.patches.googlephotos.misc.extension +import app.revanced.patcher.definingClass +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.opcodes import app.revanced.patches.shared.misc.extension.extensionHook import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -10,19 +16,20 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private var getApplicationContextIndex = -1 internal val homeActivityInitHook = extensionHook( - insertIndexResolver = { method -> - getApplicationContextIndex = method.indexOfFirstInstructionOrThrow { + getInsertIndex = { + getApplicationContextIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "getApplicationContext" } getApplicationContextIndex + 2 // Below the move-result-object instruction. }, - contextRegisterResolver = { method -> - val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1) - as OneRegisterInstruction + getContextRegister = { + val moveResultInstruction = instructions.elementAt(getApplicationContextIndex + 1) as OneRegisterInstruction "v${moveResultInstruction.registerA}" }, ) { + name("onCreate") + definingClass("/HomeActivity;") opcodes( Opcode.CONST_STRING, Opcode.INVOKE_STATIC, @@ -31,7 +38,4 @@ internal val homeActivityInitHook = extensionHook( Opcode.INVOKE_VIRTUAL, // Calls getApplicationContext(). Opcode.MOVE_RESULT_OBJECT, ) - custom { methodDef, classDef -> - methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt index 95f2a3dba7..bf61f98d57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt @@ -1,7 +1,6 @@ package app.revanced.patches.googlephotos.misc.features -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val initializeFeaturesEnumFingerprint = fingerprint { - strings("com.google.android.apps.photos.NEXUS_PRELOAD") -} +internal val BytecodePatchContext.initializeFeaturesEnumMethod by gettingFirstMethodDeclaratively("com.google.android.apps.photos.NEXUS_PRELOAD") \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt index db6158d27f..71046d14eb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.googlephotos.misc.features -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringsOption import app.revanced.util.getReference @@ -19,18 +19,16 @@ val spoofFeaturesPatch = bytecodePatch( dependsOn(spoofBuildInfoPatch) val featuresToEnable by stringsOption( - key = "featuresToEnable", default = listOf( "com.google.android.apps.photos.NEXUS_PRELOAD", "com.google.android.apps.photos.nexus_preload", ), - title = "Features to enable", + name = "Features to enable", description = "Google Pixel exclusive features to enable. Features up to Pixel XL enable the unlimited storage feature.", required = true, ) val featuresToDisable by stringsOption( - key = "featuresToDisable", default = listOf( "com.google.android.apps.photos.PIXEL_2017_PRELOAD", "com.google.android.apps.photos.PIXEL_2018_PRELOAD", @@ -49,20 +47,20 @@ val spoofFeaturesPatch = bytecodePatch( "com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE", "com.google.android.feature.PIXEL_2025_EXPERIENCE", ), - title = "Features to disable", + name = "Features to disable", description = "Google Pixel exclusive features to disable." + "Features after Pixel XL may have to be disabled for unlimited storage depending on the device.", required = true, ) - execute { + apply { @Suppress("NAME_SHADOWING") val featuresToEnable = featuresToEnable!!.toSet() @Suppress("NAME_SHADOWING") val featuresToDisable = featuresToDisable!!.toSet() - initializeFeaturesEnumFingerprint.method.apply { + initializeFeaturesEnumMethod.apply { instructions.filter { it.opcode == Opcode.CONST_STRING }.forEach { val feature = it.getReference()!!.string diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt index f47c1a3d94..315c5677a4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.googlephotos.misc.gms -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val homeActivityOnCreateFingerprint = fingerprint { - custom { methodDef, classDef -> - methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") - } +internal val BytecodePatchContext.homeActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/HomeActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt index 4a27e93cae..65ae7572c4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch.kt @@ -1,5 +1,7 @@ package app.revanced.patches.googlephotos.misc.gms +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Option import app.revanced.patches.googlephotos.misc.extension.extensionPatch import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME @@ -8,14 +10,16 @@ import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = PHOTOS_PACKAGE_NAME, toPackageName = REVANCED_PHOTOS_PACKAGE_NAME, - mainActivityOnCreateFingerprintToInsertIndex = homeActivityOnCreateFingerprint to { - val index = homeActivityOnCreateFingerprint.method.indexOfFirstInstructionOrThrow { - getReference()?.name == "getApplicationContext" + getMainActivityOnCreateMethodToGetInsertIndex = BytecodePatchContext::homeActivityOnCreateMethod::get to { + val index = homeActivityOnCreateMethod.indexOfFirstInstructionOrThrow { + methodReference?.name == "getApplicationContext" } // Below the move-result-object instruction, diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt deleted file mode 100644 index 54c20a7f8c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.googlephotos.misc.preferences - -import app.revanced.patcher.fingerprint - -internal val backupPreferencesFingerprint = fingerprint { - returns("Lcom/google/android/apps/photos/backup/data/BackupPreferences;") - strings("backup_prefs_had_backup_only_when_charging_enabled") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt deleted file mode 100644 index ea65658bda..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt +++ /dev/null @@ -1,30 +0,0 @@ -package app.revanced.patches.googlephotos.misc.preferences - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Deprecated("This patch no longer works and this code will soon be deleted") -@Suppress("unused") -val restoreHiddenBackUpWhileChargingTogglePatch = bytecodePatch( - description = "Restores a hidden toggle to only run backups when the device is charging." -) { - compatibleWith("com.google.android.apps.photos"("7.11.0.705590205")) - - execute { - // Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true. - backupPreferencesFingerprint.let { - it.method.apply { - val index = indexOfFirstInstructionOrThrow( - it.stringMatches!!.first().index, - Opcode.MOVE_RESULT - ) - val register = getInstruction(index).registerA - addInstruction(index + 1, "const/4 v$register, 0x1") - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt index 62e1e5f16b..6e9577a191 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt @@ -1,12 +1,10 @@ package app.revanced.patches.googlerecorder.restrictions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val onApplicationCreateFingerprint = fingerprint { - strings("com.google.android.feature.PIXEL_2017_EXPERIENCE") - custom { method, classDef -> - if (method.name != "onCreate") return@custom false - - classDef.endsWith("RecorderApplication;") - } +internal val BytecodePatchContext.onApplicationCreateMethodMatch by composingFirstMethod { + name("onCreate") + definingClass("RecorderApplication;") + instructions("com.google.android.feature.PIXEL_2017_EXPERIENCE"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt index bd6921bfb0..ee67ea3ce0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt @@ -1,8 +1,8 @@ package app.revanced.patches.googlerecorder.restrictions -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -13,10 +13,10 @@ val removeDeviceRestrictionsPatch = bytecodePatch( ) { compatibleWith("com.google.android.apps.recorder") - execute { - val featureStringIndex = onApplicationCreateFingerprint.stringMatches!!.first().index + apply { + val featureStringIndex = onApplicationCreateMethodMatch[0] - onApplicationCreateFingerprint.method.apply { + onApplicationCreateMethodMatch.method.apply { // Remove check for device restrictions. removeInstructions(featureStringIndex - 2, 5) diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt index 1132a5ad97..870c2f5e32 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt @@ -1,21 +1,13 @@ package app.revanced.patches.hexeditor.ad -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val disableAdsPatch = bytecodePatch( - name = "Disable ads", -) { +val disableAdsPatch = bytecodePatch("Disable ads") { compatibleWith("com.myprog.hexedit") - execute { - primaryAdsFingerprint.method.replaceInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + primaryAdsMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt index 2fa2c5b851..b62d33e39c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.hexeditor.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val primaryAdsFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" - } +internal val BytecodePatchContext.primaryAdsMethod by gettingFirstMethodDeclaratively { + name("isAdsDisabled") + definingClass("PreferencesHelper;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt index 84db554572..8305f2a059 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.iconpackstudio.misc.pro -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val checkProFingerprint = fingerprint { - returns("Z") - custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } -} \ No newline at end of file +internal val BytecodePatchContext.checkProMethod by gettingFirstMethodDeclaratively { + definingClass("IPSPurchaseRepository;") + returnType("Z") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt index c1e4719b7a..f3325f70a3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt @@ -1,21 +1,13 @@ package app.revanced.patches.iconpackstudio.misc.pro -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val unlockProPatch = bytecodePatch( - name = "Unlock pro", -) { +val unlockProPatch = bytecodePatch("Unlock pro") { compatibleWith("ginlemon.iconpackstudio"("2.2 build 016")) - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + checkProMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt index c8ebd86df4..1c73e1cb04 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/Fingerprints.kt @@ -1,22 +1,19 @@ package app.revanced.patches.idaustria.detection.deviceintegrity -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val isDeviceBootloaderOpenFingerprint = fingerprint { +internal val BytecodePatchContext.isDeviceBootloaderOpenMethod by gettingFirstMethodDeclaratively { + name("isDeviceBootloaderOpen") + definingClass("/DeviceIntegrityCheckProviderImpl;") accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/Object;") - custom { method, classDef -> - method.name == "isDeviceBootloaderOpen" && - classDef.endsWith("/DeviceIntegrityCheckProviderImpl;") - } + returnType("Ljava/lang/Object;") } -internal val isDeviceRootedFingerprint = fingerprint { +internal val BytecodePatchContext.isDeviceRootedMethod by gettingFirstMethodDeclaratively { + name("isDeviceRooted") + definingClass("/DeviceIntegrityCheckProviderImpl;") accessFlags(AccessFlags.PUBLIC) - returns("Z") - custom { method, classDef -> - method.name == "isDeviceRooted" && - classDef.endsWith("/DeviceIntegrityCheckProviderImpl;") - } + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt index 3c72e69f35..2b3b6b0109 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/deviceintegrity/RemoveDeviceIntegrityChecksPatch.kt @@ -1,10 +1,9 @@ package app.revanced.patches.idaustria.detection.deviceintegrity -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly - @Suppress("unused") val removeDeviceIntegrityChecksPatch = bytecodePatch( name = "Remove device integrity checks", @@ -12,19 +11,17 @@ val removeDeviceIntegrityChecksPatch = bytecodePatch( ) { compatibleWith("at.gv.oe.app") - execute { - isDeviceRootedFingerprint.method.returnEarly(false) + apply { + isDeviceRootedMethod.returnEarly(false) - isDeviceBootloaderOpenFingerprint.method.apply { - addInstructions( - 0, - """ - const/4 v0, 0x0 - invoke-static { v0 }, Lkotlin/coroutines/jvm/internal/Boxing;->boxBoolean(Z)Ljava/lang/Boolean; - move-result-object v0 - return-object v0 - """ - ) - } + isDeviceBootloaderOpenMethod.addInstructions( + 0, + """ + const/4 v0, 0x0 + invoke-static { v0 }, Lkotlin/coroutines/jvm/internal/Boxing;->boxBoolean(Z)Ljava/lang/Boolean; + move-result-object v0 + return-object v0 + """, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt deleted file mode 100644 index cfb7e8d686..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.idaustria.detection.root - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.idaustria.detection.deviceintegrity.removeDeviceIntegrityChecksPatch - -@Deprecated("Patch was superseded", ReplaceWith("removeDeviceIntegrityChecksPatch")) -@Suppress("unused") -val rootDetectionPatch = bytecodePatch { - dependsOn(removeDeviceIntegrityChecksPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt index 61cd9605f1..0dc98775d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt @@ -1,13 +1,13 @@ package app.revanced.patches.idaustria.detection.signature -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val spoofSignatureFingerprint = fingerprint { +internal val BytecodePatchContext.spoofSignatureMethod by gettingFirstMethodDeclaratively { + name("getPubKey") + definingClass("/SL2Step1Task;") accessFlags(AccessFlags.PRIVATE) - returns("L") - parameters("L") - custom { method, classDef -> - classDef.endsWith("/SL2Step1Task;") && method.name == "getPubKey" - } + returnType("L") + parameterTypes("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt index 3c4a939c12..f25f35ed8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/SpoofSignaturePatch.kt @@ -10,7 +10,7 @@ val spoofSignaturePatch = bytecodePatch( ) { compatibleWith("at.gv.oe.app") - execute { + apply { val expectedSignature = "OpenSSLRSAPublicKey{modulus=ac3e6fd6050aa7e0d6010ae58190404cd89a56935b44f6fee" + "067c149768320026e10b24799a1339e414605e448e3f264444a327b9ae292be2b62ad567dd1800dbed4a88f718a33dc6db6b" + @@ -24,6 +24,6 @@ val spoofSignaturePatch = bytecodePatch( "77ef1be61b2c01ebdabddcbf53cc4b6fd9a3c445606ee77b3758162c80ad8f8137b3c6864e92db904807dcb2be9d7717dd21" + "bf42c121d620ddfb7914f7a95c713d9e1c1b7bdb4a03d618e40cf7e9e235c0b5687e03b7ab3,publicExponent=10001}" - spoofSignatureFingerprint.method.returnEarly(expectedSignature) + spoofSignatureMethod.returnEarly(expectedSignature) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt index 573bd72e35..60369a6c54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.inshorts.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val inshortsAdsFingerprint = fingerprint { - returns("V") - strings("GoogleAdLoader", "exception in requestAd") +internal val BytecodePatchContext.inshortsAdsMethod by gettingFirstMethodDeclaratively( + "GoogleAdLoader", "exception in requestAd" +) { + returnType("V") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt index 87fddcb78a..9665f4ace0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt @@ -1,20 +1,13 @@ package app.revanced.patches.inshorts.ad -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.nis.app") - execute { - inshortsAdsFingerprint.method.addInstruction( - 0, - """ - return-void - """, - ) + apply { + inshortsAdsMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt index e82a54b057..7e8e21492c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt @@ -1,16 +1,14 @@ package app.revanced.patches.instagram.ads import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.meta.ads.adInjectorFingerprint +import app.revanced.patches.meta.ads.adInjectorMethod import app.revanced.util.returnEarly @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.instagram.android") - execute { - adInjectorFingerprint.method.returnEarly(false) + apply { + adInjectorMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt index cf8c611181..cb6c056a8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt @@ -1,20 +1,12 @@ package app.revanced.patches.instagram.feed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.patch.BytecodePatchContext -internal val mainFeedRequestClassFingerprint = fingerprint { - strings("Request{mReason=", ", mInstanceNumber=") -} +internal val BytecodePatchContext.mainFeedRequestClassMethod by gettingFirstMethodDeclaratively( + "Request{mReason=", ", mInstanceNumber=" +) -context(BytecodePatchContext) -internal val initMainFeedRequestFingerprint get() = fingerprint { - custom { method, classDef -> - method.name == "" && - classDef == mainFeedRequestClassFingerprint.classDef - } -} - -internal val mainFeedHeaderMapFinderFingerprint = fingerprint { - strings("pagination_source", "FEED_REQUEST_SENT") -} +internal val BytecodePatchContext.mainFeedHeaderMapFinderMethod by gettingFirstMethodDeclaratively( + "pagination_source", "FEED_REQUEST_SENT" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt index e7af0466c9..c998611255 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt @@ -1,7 +1,12 @@ package app.revanced.patches.instagram.feed -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.name import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -12,16 +17,16 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/feed/LimitFeedToFollowedProfiles;" @Suppress("unused") -val limitFeedToFollowedProfiles = bytecodePatch( +val limitFeedToFollowedProfilesPatch = bytecodePatch( name = "Limit feed to followed profiles", description = "Filters the home feed to display only content from profiles you follow.", - use = false + use = false, ) { compatibleWith("com.instagram.android") dependsOn(sharedExtensionPatch) - execute { + apply { /** * Since the header field is obfuscated and there is no easy way to identify it among all the class fields, * an additional method is fingerprinted. @@ -29,19 +34,19 @@ val limitFeedToFollowedProfiles = bytecodePatch( */ val mainFeedRequestHeaderFieldName: String - with(mainFeedHeaderMapFinderFingerprint.method) { + mainFeedHeaderMapFinderMethod.apply { mainFeedRequestHeaderFieldName = indexOfFirstInstructionOrThrow { - getReference().let { ref -> - ref?.type == "Ljava/util/Map;" && - ref.definingClass == mainFeedRequestClassFingerprint.classDef.toString() - - } + val reference = fieldReference + reference?.type == "Ljava/util/Map;" && + reference.definingClass == mainFeedRequestClassMethod.classDef.type }.let { instructionIndex -> getInstruction(instructionIndex).getReference()!!.name } } - initMainFeedRequestFingerprint.method.apply { + mainFeedRequestClassMethod.immutableClassDef.firstMethodDeclaratively { + name("") + }.apply { // Finds the instruction where the map is being initialized in the constructor val getHeaderIndex = indexOfFirstInstructionOrThrow { getReference().let { @@ -57,7 +62,7 @@ val limitFeedToFollowedProfiles = bytecodePatch( """ invoke-static { v$paramHeaderRegister }, $EXTENSION_CLASS_DESCRIPTOR->setFollowingHeader(Ljava/util/Map;)Ljava/util/Map; move-result-object v$paramHeaderRegister - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt index 72cae7fd2a..123ada7c2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/AnonymousStoryViewingPatch.kt @@ -12,12 +12,12 @@ val anonymousStoryViewingPatch = bytecodePatch( Your view will not appear in the story viewers list. Note: Since no data is sent, a story you have already viewed may appear as new on another device. """.trimIndentMultiline(), - use = false + use = false, ) { compatibleWith("com.instagram.android") - execute { + apply { // Prevent the hashmap of the seen media to be filled - setMediaSeenHashmapFingerprint.method.returnEarly() + setMediaSeenHashmapMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt index 59cce2aac0..a7027aa61e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/ghost/story/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.instagram.ghost.story -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val setMediaSeenHashmapFingerprint = fingerprint { - parameters() - returns("V") - strings("media/seen/") +internal val BytecodePatchContext.setMediaSeenHashmapMethod by gettingFirstMethodDeclaratively("media/seen/") { + parameterTypes() + returnType("V") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt index a85e8eb304..a9b705dd4e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt @@ -1,11 +1,12 @@ - package app.revanced.patches.instagram.hide.explore -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal const val EXPLORE_KEY_TO_BE_HIDDEN = "sectional_items" - -internal val exploreResponseJsonParserFingerprint = fingerprint { - strings(EXPLORE_KEY_TO_BE_HIDDEN, "ExploreTopicalFeedResponse") - custom { method, _ -> method.name == "parseFromJson" } +internal val BytecodePatchContext.exploreResponseJsonParserMethodMatch by composingFirstMethod("ExploreTopicalFeedResponse") { + name("parseFromJson") + instructions("sectional_items"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt index f9ec6505f9..dbab25ba4f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt @@ -1,7 +1,9 @@ package app.revanced.patches.instagram.hide.explore +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.instagram.shared.replaceStringWithBogus +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val hideExploreFeedPatch = bytecodePatch( @@ -11,7 +13,12 @@ val hideExploreFeedPatch = bytecodePatch( ) { compatibleWith("com.instagram.android") - execute { - exploreResponseJsonParserFingerprint.replaceStringWithBogus(EXPLORE_KEY_TO_BE_HIDDEN) + apply { + exploreResponseJsonParserMethodMatch.method.apply { + val targetStringIndex = exploreResponseJsonParserMethodMatch[0] + val targetStringRegister = getInstruction(targetStringIndex).registerA + + replaceInstruction(targetStringIndex, "const-string v$targetStringRegister, \"BOGUS\"") + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/Fingerprints.kt index 9a0341ee69..871bd27df7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/Fingerprints.kt @@ -1,9 +1,12 @@ package app.revanced.patches.instagram.hide.highlightsTray -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext internal const val TARGET_STRING = "highlights_tray" -internal val highlightsUrlBuilderFingerprint = fingerprint { - strings(TARGET_STRING,"X-IG-Accept-Hint") +internal val BytecodePatchContext.highlightsUrlBuilderMethodMatch by composingFirstMethod("X-IG-Accept-Hint") { + instructions(TARGET_STRING()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/HideHighlightsTrayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/HideHighlightsTrayPatch.kt index 3b777d9ed5..804ac49d2e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/HideHighlightsTrayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/highlightsTray/HideHighlightsTrayPatch.kt @@ -1,17 +1,24 @@ package app.revanced.patches.instagram.hide.highlightsTray +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.instagram.shared.replaceStringWithBogus +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val hideHighlightsTrayPatch = bytecodePatch( name = "Hide highlights tray", description = "Hides the highlights tray in profile section.", - use = false + use = false, ) { compatibleWith("com.instagram.android") - execute { - highlightsUrlBuilderFingerprint.replaceStringWithBogus(TARGET_STRING) + apply { + highlightsUrlBuilderMethodMatch.method.apply { + val targetStringIndex = highlightsUrlBuilderMethodMatch[0] + val targetStringRegister = getInstruction(targetStringIndex).registerA + + replaceInstruction(targetStringIndex, "const-string v$targetStringRegister, \"BOGUS\"") + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index cc762c1237..0a07351aa9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -1,24 +1,18 @@ - package app.revanced.patches.instagram.hide.navigation -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val initializeNavigationButtonsListFingerprint = fingerprint { +internal val BytecodePatchContext.initializeNavigationButtonsListMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Lcom/instagram/common/session/UserSession;", "Z") - returns("Ljava/util/List;") + parameterTypes("Lcom/instagram/common/session/UserSession;", "Z") + returnType("Ljava/util/List;") } -private val navigationButtonsEnumClassDef = fingerprint { - strings("FEED", "fragment_feed", "SEARCH", "fragment_search") -} - -context(BytecodePatchContext) -internal val navigationButtonsEnumInitFingerprint get() = fingerprint { - custom { method, classDef -> - method.name == "" - && classDef == navigationButtonsEnumClassDef.classDef - } -} +internal val BytecodePatchContext.navigationButtonsEnumMethod by gettingFirstImmutableMethodDeclaratively( + "FEED", + "fragment_feed", + "SEARCH", + "fragment_search", +) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt index b946abf6bc..ef4070c62a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -1,10 +1,12 @@ package app.revanced.patches.instagram.hide.navigation -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.name import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch -import app.revanced.patches.shared.PATCH_NAME_HIDE_NAVIGATION_BUTTONS import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister import app.revanced.util.getReference @@ -20,131 +22,123 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val hideNavigationButtonsPatch = bytecodePatch( - name = PATCH_NAME_HIDE_NAVIGATION_BUTTONS, + name = "Hide navigation buttons", description = "Hides navigation bar buttons, such as the Reels and Create button.", - use = false + use = false, ) { compatibleWith("com.instagram.android"("401.0.0.48.79")) dependsOn(sharedExtensionPatch) val hideHome by booleanOption( - key = "hideHome", default = false, - title = "Hide Home", - description = "Permanently hides the Home button. App starts at next available tab." // On the "homecoming" / current instagram layout. + name = "Hide Home", + description = "Permanently hides the Home button. App starts at next available tab.", // On the "homecoming" / current instagram layout. ) val hideReels by booleanOption( - key = "hideReels", default = true, - title = "Hide Reels", - description = "Permanently hides the Reels button." + name = "Hide Reels", + description = "Permanently hides the Reels button.", ) val hideDirect by booleanOption( - key = "hideDirect", default = false, - title = "Hide Direct", - description = "Permanently hides the Direct button." + name = "Hide Direct", + description = "Permanently hides the Direct button.", ) val hideSearch by booleanOption( - key = "hideSearch", default = false, - title = "Hide Search", - description = "Permanently hides the Search button." + name = "Hide Search", + description = "Permanently hides the Search button.", ) val hideProfile by booleanOption( - key = "hideProfile", default = false, - title = "Hide Profile", - description = "Permanently hides the Profile button." + name = "Hide Profile", + description = "Permanently hides the Profile button.", ) val hideCreate by booleanOption( - key = "hideCreate", default = true, - title = "Hide Create", - description = "Permanently hides the Create button." + name = "Hide Create", + description = "Permanently hides the Create button.", ) - execute { - if (!hideHome!! &&!hideReels!! && !hideDirect!! && !hideSearch!! && !hideProfile!! && !hideCreate!!) { - return@execute Logger.getLogger(this::class.java.name).warning( - "No hide navigation buttons options are enabled. No changes made." + apply { + if (!hideHome!! && !hideReels!! && !hideDirect!! && !hideSearch!! && !hideProfile!! && !hideCreate!!) { + return@apply Logger.getLogger(this::class.java.name).warning( + "No hide navigation buttons options are enabled. No changes made.", ) } - val enumNameField: String - - // Get the field name which contains the name of the enum for the navigation button ("fragment_clips", "fragment_share", ...) - with(navigationButtonsEnumInitFingerprint.method) { - enumNameField = indexOfFirstInstructionOrThrow { + // Get the field name which contains the name of the enum for the navigation button + // ("fragment_clips", "fragment_share", ...) + val enumNameField = navigationButtonsEnumMethod.immutableClassDef.firstMethodDeclaratively { + name("") + }.let { method -> + method.indexOfFirstInstructionOrThrow { opcode == Opcode.IPUT_OBJECT && - (this as TwoRegisterInstruction).registerA == 2 // The p2 register + (this as TwoRegisterInstruction).registerA == 2 // p2 register. }.let { - getInstruction(it).getReference()!!.name + method.getInstruction(it).getReference()!!.name } } - initializeNavigationButtonsListFingerprint.method.apply { + initializeNavigationButtonsListMethod.apply { val returnIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) val buttonsListRegister = getInstruction(returnIndex).registerA val freeRegister = findFreeRegister(returnIndex) val freeRegister2 = findFreeRegister(returnIndex, freeRegister) - fun instructionsRemoveButtonByName(buttonEnumName: String): String { - return """ + fun instructionsRemoveButtonByName(buttonEnumName: String): String = """ const-string v$freeRegister, "$buttonEnumName" const-string v$freeRegister2, "$enumNameField" invoke-static { v$buttonsListRegister, v$freeRegister, v$freeRegister2 }, $EXTENSION_CLASS_DESCRIPTOR->removeNavigationButtonByName(Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; move-result-object v$buttonsListRegister """ - } if (hideHome!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_feed") + instructionsRemoveButtonByName("fragment_feed"), ) } if (hideReels!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_clips") + instructionsRemoveButtonByName("fragment_clips"), ) } if (hideDirect!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_direct_tab") + instructionsRemoveButtonByName("fragment_direct_tab"), ) } if (hideSearch!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_search") + instructionsRemoveButtonByName("fragment_search"), ) } if (hideCreate!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_share") + instructionsRemoveButtonByName("fragment_share"), ) } if (hideProfile!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_profile") + instructionsRemoveButtonByName("fragment_profile"), ) } - } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt index 3b58aa8c2f..3c9e118335 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt @@ -1,17 +1,16 @@ package app.revanced.patches.instagram.hide.stories -import app.revanced.patcher.fingerprint + +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode - -internal val getOrCreateAvatarViewFingerprint = fingerprint { - parameters() - returns("L") - custom { method, classDef -> - classDef.type == "Lcom/instagram/reels/ui/views/reelavatar/RecyclerReelAvatarView;" - } - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.IPUT_OBJECT, - Opcode.INVOKE_VIRTUAL // Add View (Story) - ) - } +internal val BytecodePatchContext.getOrCreateAvatarViewMethodMatch by composingFirstMethod { + definingClass("Lcom/instagram/reels/ui/views/reelavatar/RecyclerReelAvatarView;") + parameterTypes() + returnType("L") + opcodes( + Opcode.INVOKE_VIRTUAL, + Opcode.IPUT_OBJECT, + Opcode.INVOKE_VIRTUAL, // Add View (Story). + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt index 65c51cf36e..fed889d77b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt @@ -1,20 +1,22 @@ package app.revanced.patches.instagram.hide.stories -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction + +import app.revanced.patcher.extensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val hideStoriesPatch = bytecodePatch( +val hideStoriesFromHomePatch = bytecodePatch( name = "Hide Stories from Home", description = "Hides Stories from the main page, by removing the buttons.", - use = false + use = false, ) { compatibleWith("com.instagram.android") - execute { - val addStoryMethod = getOrCreateAvatarViewFingerprint.method // Creates Story - val addStoryEndIndex = getOrCreateAvatarViewFingerprint.patternMatch!!.endIndex + apply { + getOrCreateAvatarViewMethodMatch.let { + val addStoryEndIndex = it[-1] - // Remove addView of Story. - addStoryMethod.removeInstruction(addStoryEndIndex) + // Remove addView of Story. + it.method.removeInstruction(addStoryEndIndex) + } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt index 0f731b4f42..9d486f5520 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt @@ -1,6 +1,10 @@ package app.revanced.patches.instagram.hide.suggestions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.unorderedAllOf internal val FEED_ITEM_KEYS_TO_BE_HIDDEN = arrayOf( "clips_netego", @@ -12,6 +16,6 @@ internal val FEED_ITEM_KEYS_TO_BE_HIDDEN = arrayOf( "suggested_users", ) -internal val feedItemParseFromJsonFingerprint = fingerprint { - strings(*FEED_ITEM_KEYS_TO_BE_HIDDEN, "FeedItem") +internal val BytecodePatchContext.feedItemParseFromJsonMethodMatch by composingFirstMethod("FeedItem") { + instructions(predicates = unorderedAllOf(predicates = FEED_ITEM_KEYS_TO_BE_HIDDEN.map { it() }.toTypedArray())) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContent.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContent.kt deleted file mode 100644 index 9dc6dbf593..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContent.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.instagram.hide.suggestions - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.instagram.shared.replaceStringWithBogus - -@Suppress("unused") -val hideSuggestedContent = bytecodePatch( - name = "Hide suggested content", - description = "Hides suggested stories, reels, threads and survey from feed (Suggested posts will still be shown).", - use = false, -) { - compatibleWith("com.instagram.android") - - execute { - FEED_ITEM_KEYS_TO_BE_HIDDEN.forEach { key -> - feedItemParseFromJsonFingerprint.replaceStringWithBogus(key) - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentPatch.kt new file mode 100644 index 0000000000..f82335e186 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/HideSuggestedContentPatch.kt @@ -0,0 +1,25 @@ +package app.revanced.patches.instagram.hide.suggestions + +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.patch.bytecodePatch +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +val hideSuggestedContentPatch = bytecodePatch( + name = "Hide suggested content", + description = "Hides suggested stories, reels, threads and survey from feed (Suggested posts will still be shown).", + use = false, +) { + compatibleWith("com.instagram.android") + + apply { + feedItemParseFromJsonMethodMatch.method.apply { + feedItemParseFromJsonMethodMatch.indices[0].forEach { targetStringIndex -> + val targetStringRegister = getInstruction(targetStringIndex).registerA + + replaceInstruction(targetStringIndex, "const-string v$targetStringRegister, \"BOGUS\"") + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt index e9577477ad..1d44ac8259 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -1,12 +1,11 @@ package app.revanced.patches.instagram.misc.devmenu +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.Utils.trimIndentMultiline -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val enableDeveloperMenuPatch = bytecodePatch( @@ -16,22 +15,23 @@ val enableDeveloperMenuPatch = bytecodePatch( It is recommended to use this patch with an alpha/beta Instagram release. Patching a stable release works, but the developer menu shows the developer flags as numbers and does not show a human readable description. """.trimIndentMultiline(), - use = false + use = false, ) { compatibleWith("com.instagram.android") - execute { - with(clearNotificationReceiverFingerprint.method) { - indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverFingerprint.stringMatches!!.first().index) { - val reference = getReference() + apply { + clearNotificationReceiverMethodMatch.let { + val stringIndex = it[0] + + it.immutableMethod.indexOfFirstInstructionReversedOrThrow(stringIndex) { + val reference = methodReference opcode in listOf(Opcode.INVOKE_STATIC, Opcode.INVOKE_STATIC_RANGE) && - reference?.parameterTypes?.size == 1 && - reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && - reference.returnType == "Z" + reference?.parameterTypes?.size == 1 && + reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && + reference.returnType == "Z" }.let { index -> - navigate(this).to(index).stop().returnEarly(true) + navigate(it.immutableMethod).to(index).stop().returnEarly(true) } } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt index 8b84606f00..13d455eff9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt @@ -1,12 +1,10 @@ - package app.revanced.patches.instagram.misc.devmenu -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val clearNotificationReceiverFingerprint = fingerprint { - custom { method, classDef -> - method.name == "onReceive" && - classDef.type == "Lcom/instagram/notifications/push/ClearNotificationReceiver;" - } - strings("NOTIFICATION_DISMISSED") +internal val BytecodePatchContext.clearNotificationReceiverMethodMatch by composingFirstMethod { + name("onReceive") + definingClass("Lcom/instagram/notifications/push/ClearNotificationReceiver;") + instructions("NOTIFICATION_DISMISSED"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/DisableAnalyticsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/DisableAnalyticsPatch.kt index 819a927813..32d4870e8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/DisableAnalyticsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/DisableAnalyticsPatch.kt @@ -1,8 +1,10 @@ package app.revanced.patches.instagram.misc.disableAnalytics -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.instagram.shared.replaceStringWithBogus +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val disableAnalyticsPatch = bytecodePatch( @@ -11,10 +13,10 @@ val disableAnalyticsPatch = bytecodePatch( ) { compatibleWith("com.instagram.android") - execute { + apply { // Returns BOGUS as analytics url. - instagramAnalyticsUrlBuilderMethodFingerprint.method.addInstructions( - 0, + instagramAnalyticsUrlBuilderMethod.addInstructions( + 0, """ const-string v0, "BOGUS" return-object v0 @@ -22,7 +24,12 @@ val disableAnalyticsPatch = bytecodePatch( ) // Replaces analytics url as BOGUS. - facebookAnalyticsUrlInitMethodFingerprint.replaceStringWithBogus(TARGET_URL) + facebookAnalyticsUrlInitMethodMatch.let { match -> + match.method.apply { + val urlIndex = match[1] + val register = getInstruction(urlIndex).registerA + replaceInstruction(urlIndex, "const-string v$register, \"BOGUS\"") + } + } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/Fingerprints.kt index 95e522f4c6..ba84c2edcb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/disableAnalytics/Fingerprints.kt @@ -1,12 +1,19 @@ package app.revanced.patches.instagram.misc.disableAnalytics -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.strings -internal val instagramAnalyticsUrlBuilderMethodFingerprint = fingerprint { +internal val BytecodePatchContext.instagramAnalyticsUrlBuilderMethod by gettingFirstMethodDeclaratively { strings("/logging_client_events") } -internal const val TARGET_URL = "https://graph.facebook.com/logging_client_events" -internal val facebookAnalyticsUrlInitMethodFingerprint = fingerprint { - strings("analytics_endpoint",TARGET_URL) +internal val BytecodePatchContext.facebookAnalyticsUrlInitMethodMatch by composingFirstMethod { + instructions( + "analytics_endpoint"(), + "https://graph.facebook.com/logging_client_events"() + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt index eca0a885f2..05591136b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt @@ -1,9 +1,7 @@ package app.revanced.patches.instagram.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/InstagramAppShell;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook( + "/InstagramAppShell;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt index b33d5ace54..676a942410 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt @@ -1,9 +1,14 @@ package app.revanced.patches.instagram.misc.links -import app.revanced.patcher.fingerprint + +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType internal const val TARGET_STRING = "Tracking.ARG_CLICK_SOURCE" -internal val inAppBrowserFunctionFingerprint = fingerprint { - returns("Z") - strings("TrackingInfo.ARG_MODULE_NAME", TARGET_STRING) +internal val BytecodePatchContext.inAppBrowserFunctionMethodMatch by composingFirstMethod("TrackingInfo.ARG_MODULE_NAME") { + instructions(TARGET_STRING()) + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt index 6dfbf9b73c..181b8683eb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.instagram.misc.links -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstInstructionOrThrow @@ -21,13 +21,14 @@ val openLinksExternallyPatch = bytecodePatch( compatibleWith("com.instagram.android") - execute { - inAppBrowserFunctionFingerprint.let { - val stringMatchIndex = it.stringMatches?.first { match -> match.string == TARGET_STRING }!!.index + apply { + inAppBrowserFunctionMethodMatch.let { + val stringMatchIndex = it[0] it.method.apply { val urlResultObjIndex = indexOfFirstInstructionOrThrow( - stringMatchIndex, Opcode.MOVE_OBJECT_FROM16 + stringMatchIndex, + Opcode.MOVE_OBJECT_FROM16, ) // Register that contains the url after moving from a higher register. @@ -39,7 +40,7 @@ val openLinksExternallyPatch = bytecodePatch( invoke-static/range { v$urlRegister .. v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->openExternally(Ljava/lang/String;)Z move-result v0 return v0 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/Fingerprints.kt index ad4a66540c..5cbd918d9d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/Fingerprints.kt @@ -1,12 +1,15 @@ package app.revanced.patches.instagram.misc.removeBuildExpiredPopup -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext -internal const val MILLISECOND_IN_A_DAY_LITERAL = 0x5265c00L +private const val MILLISECOND_IN_A_DAY_LITERAL = 0x5265c00L -internal val appUpdateLockoutBuilderFingerprint = fingerprint { - strings("android.hardware.sensor.hinge_angle") - literal { MILLISECOND_IN_A_DAY_LITERAL } +internal val BytecodePatchContext.appUpdateLockoutBuilderMethod by gettingFirstMethodDeclaratively( + "android.hardware.sensor.hinge_angle", +) { + instructions(MILLISECOND_IN_A_DAY_LITERAL()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/RemoveBuildExpiredPopupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/RemoveBuildExpiredPopupPatch.kt index 9d19e928ed..00bd45fa45 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/RemoveBuildExpiredPopupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/removeBuildExpiredPopup/RemoveBuildExpiredPopupPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.instagram.misc.removeBuildExpiredPopup -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -14,8 +14,8 @@ val removeBuildExpiredPopupPatch = bytecodePatch( ) { compatibleWith("com.instagram.android") - execute { - appUpdateLockoutBuilderFingerprint.method.apply { + apply { + appUpdateLockoutBuilderMethod.apply { val longToIntIndex = instructions.first { it.opcode == Opcode.LONG_TO_INT }.location.index val appAgeRegister = getInstruction(longToIntIndex).registerA @@ -24,4 +24,3 @@ val removeBuildExpiredPopupPatch = bytecodePatch( } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt index e3e4630101..f4397018b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -1,26 +1,24 @@ package app.revanced.patches.instagram.misc.share -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -context(BytecodePatchContext) -internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { - val fingerprintsToPatch = arrayOf( - permalinkResponseJsonParserFingerprint, - storyUrlResponseJsonParserFingerprint, - profileUrlResponseJsonParserFingerprint, - liveUrlResponseJsonParserFingerprint +internal fun BytecodePatchContext.editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { + val methodsToPatch = arrayOf( + permalinkResponseJsonParserMethodMatch, + storyUrlResponseJsonParserMethodMatch, + profileUrlResponseJsonParserMethodMatch, + liveUrlResponseJsonParserMethodMatch, ) - fingerprintsToPatch.forEachIndexed { index, fingerprint -> - - fingerprint.method.apply { + methodsToPatch.forEach { match -> + match.method.apply { val putSharingUrlIndex = indexOfFirstInstruction( - index, + match[0], Opcode.IPUT_OBJECT ) val sharingUrlRegister = getInstruction(putSharingUrlIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt new file mode 100644 index 0000000000..b7703b3147 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt @@ -0,0 +1,34 @@ +package app.revanced.patches.instagram.misc.share + +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.Opcode + +internal val BytecodePatchContext.permalinkResponseJsonParserMethodMatch by composingFirstMethod { + name("parseFromJson") + instructions("permalink"()) + opcodes( + Opcode.NEW_INSTANCE, + Opcode.INVOKE_DIRECT, + Opcode.INVOKE_VIRTUAL + ) +} + +internal val BytecodePatchContext.storyUrlResponseJsonParserMethodMatch by composingFirstMethod { + name("parseFromJson") + instructions("story_item_to_share_url"()) +} + +internal val BytecodePatchContext.profileUrlResponseJsonParserMethodMatch by composingFirstMethod { + name("parseFromJson") + instructions("profile_to_share_url"()) +} + +internal val BytecodePatchContext.liveUrlResponseJsonParserMethodMatch by composingFirstMethod { + name("parseFromJson") + instructions("live_to_share_url"()) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/UrlResponseJsonParserFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/UrlResponseJsonParserFingerprint.kt deleted file mode 100644 index fd6fbf5c48..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/UrlResponseJsonParserFingerprint.kt +++ /dev/null @@ -1,32 +0,0 @@ -package app.revanced.patches.instagram.misc.share - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal val TARGET_STRING_ARRAY = arrayOf( - "permalink", - "story_item_to_share_url", - "profile_to_share_url", - "live_to_share_url", -) - -internal val permalinkResponseJsonParserFingerprint = fingerprint { - strings(TARGET_STRING_ARRAY[0]) - opcodes(Opcode.NEW_INSTANCE,Opcode.INVOKE_DIRECT,Opcode.INVOKE_VIRTUAL) - custom { method, _ -> method.name == "parseFromJson" } -} - -internal val storyUrlResponseJsonParserFingerprint = fingerprint { - strings(TARGET_STRING_ARRAY[1]) - custom { method, _ -> method.name == "parseFromJson" } -} - -internal val profileUrlResponseJsonParserFingerprint = fingerprint { - strings(TARGET_STRING_ARRAY[2]) - custom { method, _ -> method.name == "parseFromJson" } -} - -internal val liveUrlResponseJsonParserFingerprint = fingerprint { - strings(TARGET_STRING_ARRAY[3]) - custom { method, _ -> method.name == "parseFromJson" } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt index 430d2d7b72..d449bc818b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt @@ -1,33 +1,33 @@ package app.revanced.patches.instagram.misc.share.domain -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringOption import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.patches.instagram.misc.share.editShareLinksPatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN -import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN import app.revanced.util.returnEarly +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;" + @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( - name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, - description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN, - use = false + name = "Change link sharing domain", + description = "Replaces the domain name of shared links.", + use = false, ) { compatibleWith("com.instagram.android") dependsOn(sharedExtensionPatch) val customDomainHost by stringOption( - key = "domainName", default = "imginn.com", - title = "Domain name", - description = "The domain name to use when sharing links." + name = "Domain name", + description = "The domain name to use when sharing links.", ) - execute { - getCustomShareDomainFingerprint.method.returnEarly(customDomainHost!!) + apply { + getCustomShareDomainMethod.returnEarly(customDomainHost!!) editShareLinksPatch { index, register -> addInstructions( @@ -35,7 +35,7 @@ val changeLinkSharingDomainPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setCustomShareDomain(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt index 1337520001..44ab07b6d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt @@ -1,16 +1,13 @@ package app.revanced.patches.instagram.misc.share.domain -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;" - -internal val getCustomShareDomainFingerprint = fingerprint { +internal val BytecodePatchContext.getCustomShareDomainMethod by gettingFirstMethodDeclaratively { + name("getCustomShareDomain") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { method, classDef -> - method.name == "getCustomShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt index a73099a225..838fcba8ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt @@ -1,32 +1,30 @@ package app.revanced.patches.instagram.misc.share.privacy -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.patches.instagram.misc.share.editShareLinksPatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch;" @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { compatibleWith("com.instagram.android") dependsOn(sharedExtensionPatch) - execute { + apply { editShareLinksPatch { index, register -> addInstructions( index, """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt index 47ebe189b3..6f4d9a89b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt @@ -1,20 +1,17 @@ package app.revanced.patches.instagram.misc.signature -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val isValidSignatureClassFingerprint = fingerprint { - strings("The provider for uri '", "' is not trusted: ") -} +context(_: BytecodePatchContext) +internal fun ClassDef.getIsValidSignatureClassMethod() = firstMethodDeclaratively( + "The provider for uri '", + "' is not trusted: ", +) -internal val isValidSignatureMethodFingerprint = fingerprint { - parameters("L", "Z") - returns("Z") - custom { method, _ -> - method.indexOfFirstInstruction { - getReference()?.name == "keySet" - } >= 0 - } +internal val BytecodePatchContext.isValidSignatureMethodMethod by gettingFirstMethodDeclaratively { + parameterTypes("L", "Z") + returnType("Z") + instructions(method("keySet")) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt index 0493be62de..3ee3f82380 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt @@ -1,21 +1,19 @@ package app.revanced.patches.instagram.misc.signature +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val signatureCheckPatch = bytecodePatch( +val disableSignatureCheckPatch = bytecodePatch( name = "Disable signature check", description = "Disables the signature check that can cause the app to crash on startup. " + - "Including this patch may cause issues with sharing or opening external Instagram links.", - use = false + "Using this patch may cause issues with sharing or opening external Instagram links.", + use = false, ) { compatibleWith("com.instagram.android") - execute { - isValidSignatureMethodFingerprint - .match(isValidSignatureClassFingerprint.classDef) - .method - .returnEarly(true) + apply { + isValidSignatureMethodMethod.immutableClassDef.getIsValidSignatureClassMethod().returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt index 059a300655..547a826581 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/DisableReelsScrollingPatch.kt @@ -1,34 +1,35 @@ -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +package app.revanced.patches.instagram.reels + +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.instagram.reels.clipsSwipeRefreshLayoutOnInterceptTouchEventFingerprint -import app.revanced.patches.instagram.reels.clipsViewPagerImplGetViewAtIndexFingerprint import app.revanced.util.returnEarly @Suppress("unused") val disableReelsScrollingPatch = bytecodePatch( name = "Disable Reels scrolling", description = "Disables the endless scrolling behavior in Instagram Reels, preventing swiping to the next Reel. " + - "Note: On a clean install, the 'Tip' animation may appear but will stop on its own after a few seconds.", + "Note: On a clean install, the 'Tip' animation may appear but will stop on its own after a few seconds.", use = false ) { compatibleWith("com.instagram.android") - execute { - val viewPagerField = clipsViewPagerImplGetViewAtIndexFingerprint.classDef.fields.first { + apply { + val viewPagerField = clipsViewPagerImplGetViewAtIndexMethod.classDef.fields.first { it.type == "Landroidx/viewpager2/widget/ViewPager2;" } // Disable user input on the ViewPager2 to prevent scrolling. - clipsViewPagerImplGetViewAtIndexFingerprint.method.addInstructions( + clipsViewPagerImplGetViewAtIndexMethod.addInstructions( 0, """ iget-object v0, p0, $viewPagerField const/4 v1, 0x0 invoke-virtual { v0, v1 }, Landroidx/viewpager2/widget/ViewPager2;->setUserInputEnabled(Z)V - """ + """, ) // Return false in onInterceptTouchEvent to disable pull-to-refresh. - clipsSwipeRefreshLayoutOnInterceptTouchEventFingerprint.method.returnEarly(false) + clipsSwipeRefreshLayoutOnInterceptTouchEventMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt index d0b6b62667..335c90c8ee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.instagram.reels -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext -internal val clipsViewPagerImplGetViewAtIndexFingerprint = fingerprint { - strings("ClipsViewPagerImpl_getViewAtIndex") -} - -internal val clipsSwipeRefreshLayoutOnInterceptTouchEventFingerprint = fingerprint { - parameters("Landroid/view/MotionEvent;") - custom { _, classDef -> classDef.type == "Linstagram/features/clips/viewer/ui/ClipsSwipeRefreshLayout;" } +internal val BytecodePatchContext.clipsViewPagerImplGetViewAtIndexMethod by gettingFirstMethodDeclaratively("ClipsViewPagerImpl_getViewAtIndex") + +internal val BytecodePatchContext.clipsSwipeRefreshLayoutOnInterceptTouchEventMethod by gettingFirstMethodDeclaratively { + parameterTypes("Landroid/view/MotionEvent;") + definingClass("Linstagram/features/clips/viewer/ui/ClipsSwipeRefreshLayout;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/shared/Utils.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/shared/Utils.kt deleted file mode 100644 index 522257aa89..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/shared/Utils.kt +++ /dev/null @@ -1,25 +0,0 @@ -package app.revanced.patches.instagram.shared - -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.BytecodePatchContext -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -context(BytecodePatchContext) -internal fun Fingerprint.replaceStringWithBogus( - targetString: String, -) { - val targetStringIndex = stringMatches!!.first { match -> match.string == targetString }.index - val targetStringRegister = method.getInstruction(targetStringIndex).registerA - - /** - * Replaces the 'target string' with 'BOGUS'. - * This is usually done when we need to override a JSON key or url, - * to skip with a random string that is not a valid JSON key. - */ - method.replaceInstruction( - targetStringIndex, - "const-string v$targetStringRegister, \"BOGUS\"", - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt index 172f7dce75..abcd236417 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatch.kt @@ -7,11 +7,11 @@ import app.revanced.util.returnEarly val disableStoryAutoFlippingPatch = bytecodePatch( name = "Disable story auto flipping", description = "Disable stories automatically flipping/skipping after some seconds.", - use = false + use = false, ) { compatibleWith("com.instagram.android") - execute { - onStoryTimeoutActionFingerprint.method.returnEarly() + apply { + onStoryTimeoutActionMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt index 3562dbde6b..647fd0fee9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/story/flipping/Fingerprints.kt @@ -1,12 +1,13 @@ package app.revanced.patches.instagram.story.flipping -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val onStoryTimeoutActionFingerprint = fingerprint { - parameters("Ljava/lang/Object;") - returns("V") - strings("userSession") - custom { _, classDef -> - classDef.type == "Linstagram/features/stories/fragment/ReelViewerFragment;" - } +internal val BytecodePatchContext.onStoryTimeoutActionMethod by gettingFirstMethodDeclaratively("userSession") { + parameterTypes("Ljava/lang/Object;") + returnType("V") + definingClass("Linstagram/features/stories/fragment/ReelViewerFragment;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index 30242b8d94..3e68519d4e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.irplus.ad +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val irplusAdsFingerprint = fingerprint { +internal val BytecodePatchContext.irplusAdsMethod by gettingFirstMethodDeclaratively("TAGGED") { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - parameters("L", "Z") - strings("TAGGED") + parameterTypes("L", "Z") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt index 44b76f5fc4..a8bbf6e727 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt @@ -1,17 +1,15 @@ package app.revanced.patches.irplus.ad -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val removeAdsPatch = bytecodePatch( - name = "Remove ads", -) { +val removeAdsPatch = bytecodePatch("Remove ads") { compatibleWith("net.binarymode.android.irplus") - execute { + apply { // By overwriting the second parameter of the method, // the view which holds the advertisement is removed. - irplusAdsFingerprint.method.addInstruction(0, "const/4 p2, 0x0") + irplusAdsMethod.addInstruction(0, "const/4 p2, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/Fingerprints.kt index 97f8465ae1..9b992b49d0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.kleinanzeigen.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getLibertyInitFingerprint = fingerprint { - custom { method, classDef -> - method.name == "init" && classDef.endsWith("/Liberty;") - } +internal val BytecodePatchContext.getLibertyInitMethod by gettingFirstMethodDeclaratively { + name("init") + definingClass("/Liberty;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/HideAdsPatch.kt index 87f689014c..403301d916 100644 --- a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/ads/HideAdsPatch.kt @@ -10,7 +10,7 @@ val hideAdsPatch = bytecodePatch( ) { compatibleWith("com.ebay.kleinanzeigen") - execute { - getLibertyInitFingerprint.method.returnEarly() + apply { + getLibertyInitMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/Fingerprints.kt index 79a050f9e2..f275dd93ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/Fingerprints.kt @@ -1,9 +1,8 @@ package app.revanced.patches.kleinanzeigen.hide_pur -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.patch.BytecodePatchContext -internal val getShowAdFreeSubscriptionFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getShowAdFreeSubscription" - } +internal val BytecodePatchContext.getShowAdFreeSubscriptionFingerprint by gettingFirstMethod { + name == "getShowAdFreeSubscription" } diff --git a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/HidePurPatch.kt b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/HidePurPatch.kt index a55f675ec0..0956885b51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/HidePurPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/kleinanzeigen/hide_pur/HidePurPatch.kt @@ -10,7 +10,7 @@ val hidePurPatch = bytecodePatch( ) { compatibleWith("com.ebay.kleinanzeigen") - execute { - getShowAdFreeSubscriptionFingerprint.method.returnEarly(false) + apply { + getShowAdFreeSubscriptionFingerprint.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt index 423c262846..2b2234237f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/Fingerprints.kt @@ -1,29 +1,28 @@ package app.revanced.patches.letterboxd.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext internal const val admobHelperClassName = "Lcom/letterboxd/letterboxd/helpers/AdmobHelper;" -internal val admobHelperSetShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "setShowAds" && classDef.type == admobHelperClassName - } +internal val BytecodePatchContext.admobHelperSetShowAdsMethod by gettingFirstMethodDeclaratively { + name("setShowAds") + definingClass(admobHelperClassName) } -internal val admobHelperShouldShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "shouldShowAds" && classDef.type == admobHelperClassName - } +internal val BytecodePatchContext.admobHelperShouldShowAdsMethod by gettingFirstMethodDeclaratively { + name("shouldShowAds") + definingClass(admobHelperClassName) } -internal val filmFragmentShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showAds" && classDef.type.endsWith("/FilmFragment;") - } +internal val BytecodePatchContext.filmFragmentShowAdsMethod by gettingFirstMethodDeclaratively { + name("showAds") + definingClass("/FilmFragment;") } -internal val memberExtensionShowAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showAds" && classDef.type.endsWith("/AMemberExtensionKt;") - } -} \ No newline at end of file +internal val BytecodePatchContext.memberExtensionShowAdsMethod by gettingFirstMethodDeclaratively { + name("showAds") + definingClass("/AMemberExtensionKt;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt index 8a2ff87f07..1296844822 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/ads/HideAdsPatch.kt @@ -1,20 +1,17 @@ - package app.revanced.patches.letterboxd.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.letterboxd.letterboxd") - execute { - admobHelperSetShowAdsFingerprint.method.addInstruction(0, "const p1, 0x0") - listOf(admobHelperShouldShowAdsFingerprint, filmFragmentShowAdsFingerprint, memberExtensionShowAdsFingerprint).forEach { - it.method.returnEarly() + apply { + admobHelperSetShowAdsMethod.addInstruction(0, "const p1, 0x0") + listOf(admobHelperShouldShowAdsMethod, filmFragmentShowAdsMethod, memberExtensionShowAdsMethod).forEach { + it.returnEarly() } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt index 1b549cd573..ca46ac6bca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.letterboxd.unlock.unlockAppIcons -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getCanChangeAppIconFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getCanChangeAppIcon" && classDef.type.endsWith("SettingsAppIconFragment;") - } +internal val BytecodePatchContext.getCanChangeAppIconMethod by gettingFirstMethodDeclaratively { + name("getCanChangeAppIcon") + definingClass("SettingsAppIconFragment;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt index 54d6f3df9a..4c20a5ed1a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/letterboxd/unlock/unlockAppIcons/UnlockAppIconsPatch.kt @@ -1,16 +1,13 @@ - package app.revanced.patches.letterboxd.unlock.unlockAppIcons import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val unlockAppIconsPatch = bytecodePatch( - name = "Unlock app icons", -) { +val unlockAppIconsPatch = bytecodePatch("Unlock app icons") { compatibleWith("com.letterboxd.letterboxd") - execute { - getCanChangeAppIconFingerprint.method.returnEarly(true) + apply { + getCanChangeAppIconMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt deleted file mode 100644 index 9d23b7716c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt +++ /dev/null @@ -1,23 +0,0 @@ -package app.revanced.patches.lightroom.misc.version - -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.Opcode - -@Suppress("unused") -val disableVersionCheckPatch = bytecodePatch( - name = "Disable version check", - description = "Disables the server-side version check that prevents the app from starting.", -) { - compatibleWith("com.adobe.lrmobile"("9.3.0")) - - execute { - refreshRemoteConfigurationFingerprint.method.apply { - val igetIndex = refreshRemoteConfigurationFingerprint.patternMatch!!.endIndex - - // This value represents the server command to clear all version restrictions. - val statusForceReset = "-0x2"; - replaceInstruction(igetIndex, "const/4 v1, $statusForceReset") - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt deleted file mode 100644 index 67900c31ea..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/Fingerprints.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.lightroom.misc.version - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal val refreshRemoteConfigurationFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - strings( - "com.adobe.lrmobile.denylisted_version_set_key", - "com.adobe.lrmobile.app_min_version_key" - ) - opcodes( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET, // Overwrite this instruction to disable the check. - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt index e29608de0e..0f0f495d9d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt @@ -1,19 +1,16 @@ package app.revanced.patches.lightroom.misc.login -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val disableMandatoryLoginPatch = bytecodePatch( - name = "Disable mandatory login", -) { +val disableMandatoryLoginPatch = bytecodePatch("Disable mandatory login") { compatibleWith("com.adobe.lrmobile"("9.3.0")) - execute { - isLoggedInFingerprint.method.apply { - val index = implementation!!.instructions.lastIndex - 1 - // Set isLoggedIn = true. - replaceInstruction(index, "const/4 v0, 0x1") - } + apply { + val index = isLoggedInMethod.instructions.lastIndex - 1 + // Set isLoggedIn = true. + isLoggedInMethod.replaceInstruction(index, "const/4 v0, 0x1") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt index 6345541e14..cae148db09 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt @@ -1,12 +1,16 @@ package app.revanced.patches.lightroom.misc.login -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val isLoggedInFingerprint = fingerprint { +internal val BytecodePatchContext.isLoggedInMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) - returns("Z") + returnType("Z") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt index 5a00dc68c1..4f580f2547 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt @@ -1,17 +1,20 @@ package app.revanced.patches.lightroom.misc.premium -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val hasPurchasedFingerprint = fingerprint { +internal val BytecodePatchContext.hasPurchasedMethod by gettingFirstMethodDeclaratively("isPurchaseDoneRecently = true, access platform profile present? = ") { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("Z") + returnType("Z") opcodes( Opcode.SGET_OBJECT, Opcode.CONST_4, Opcode.CONST_4, Opcode.CONST_4, ) - strings("isPurchaseDoneRecently = true, access platform profile present? = ") } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt index e54f3169a1..3ef0a91efd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt @@ -1,16 +1,14 @@ package app.revanced.patches.lightroom.misc.premium -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val unlockPremiumPatch = bytecodePatch( - name = "Unlock Premium", -) { +val unlockPremiumPatch = bytecodePatch("Unlock Premium") { compatibleWith("com.adobe.lrmobile"("9.3.0")) - execute { + apply { // Set hasPremium = true. - hasPurchasedFingerprint.method.replaceInstruction(2, "const/4 v2, 0x1") + hasPurchasedMethod.replaceInstruction(2, "const/4 v2, 0x1") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/DisableVersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/DisableVersionCheckPatch.kt new file mode 100644 index 0000000000..1147655409 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/DisableVersionCheckPatch.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.lightroom.misc.version + +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.patch.bytecodePatch + +@Suppress("unused") +val disableVersionCheckPatch = bytecodePatch( + name = "Disable version check", + description = "Disables the server-side version check that prevents the app from starting.", +) { + compatibleWith("com.adobe.lrmobile"("9.3.0")) + + apply { + val igetIndex = refreshRemoteConfigurationMethodMatch[-1] + + // This value represents the server command to clear all version restrictions. + val statusForceReset = "-0x2" + refreshRemoteConfigurationMethodMatch.method.replaceInstruction(igetIndex, "const/4 v1, $statusForceReset") + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/Fingerprints.kt new file mode 100644 index 0000000000..f8be83517a --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/version/Fingerprints.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.lightroom.misc.version + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal val BytecodePatchContext.refreshRemoteConfigurationMethodMatch by composingFirstMethod( + "com.adobe.lrmobile.denylisted_version_set_key", + "com.adobe.lrmobile.app_min_version_key", +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + opcodes( + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT, + Opcode.IGET, // Overwrite this instruction to disable the check. + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt index 0dfbf5cdab..f40e9d0dce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.detection.license -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val licenseValidationFingerprint = fingerprint { +internal val BytecodePatchContext.licenseValidationMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("Landroid/content/Context;") + returnType("Z") + parameterTypes("Landroid/content/Context;") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_WIDE, diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt index 8b4a417348..ced1a10790 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt @@ -1,19 +1,13 @@ package app.revanced.patches.memegenerator.detection.license -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly val licenseValidationPatch = bytecodePatch( description = "Disables Firebase license validation.", ) { - execute { - licenseValidationFingerprint.method.replaceInstructions( - 0, - """ - const/4 p0, 0x1 - return p0 - """, - ) + apply { + licenseValidationMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 75912318ba..6bb50317f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.detection.signature -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val verifySignatureFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) { +internal val BytecodePatchContext.verifySignatureMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("Landroid/app/Activity;") + returnType("Z") + parameterTypes("Landroid/app/Activity;") opcodes( Opcode.SGET_OBJECT, Opcode.IF_NEZ, diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt index c6b05ae8db..e4679f4da9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt @@ -1,19 +1,13 @@ package app.revanced.patches.memegenerator.detection.signature -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly val signatureVerificationPatch = bytecodePatch( description = "Disables detection of incorrect signature.", ) { - execute { - verifySignatureFingerprint.method.replaceInstructions( - 0, - """ - const/4 p0, 0x1 - return p0 - """, - ) + apply { + verifySignatureMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt index 1f16bb10ec..68a9b70b42 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.memegenerator.misc.pro -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val isFreeVersionFingerprint = fingerprint { +internal val BytecodePatchContext.isFreeVersionMethod by gettingFirstMethodDeclaratively("free") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/Boolean;") - parameters("Landroid/content/Context;") + returnType("Ljava/lang/Boolean;") + parameterTypes("Landroid/content/Context;") opcodes( Opcode.SGET, Opcode.INVOKE_VIRTUAL, @@ -17,5 +18,4 @@ internal val isFreeVersionFingerprint = fingerprint { Opcode.MOVE_RESULT, Opcode.IF_EQZ ) - strings("free") } diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt index b74e2d3a8d..026a25d5ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/UnlockProVersionPatch.kt @@ -1,20 +1,18 @@ package app.revanced.patches.memegenerator.misc.pro -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.extensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.memegenerator.detection.license.licenseValidationPatch import app.revanced.patches.memegenerator.detection.signature.signatureVerificationPatch @Suppress("unused") -val unlockProVersionPatch = bytecodePatch( - name = "Unlock pro", -) { +val unlockProPatch = bytecodePatch("Unlock pro") { dependsOn(signatureVerificationPatch, licenseValidationPatch) compatibleWith("com.zombodroid.MemeGenerator"("4.6364", "4.6370", "4.6375", "4.6377")) - execute { - isFreeVersionFingerprint.method.replaceInstructions( + apply { + isFreeVersionMethod.replaceInstructions( 0, """ sget-object p0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean; diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt index 185c88f94c..b6ce2a032c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt @@ -1,35 +1,35 @@ package app.revanced.patches.messenger.inbox -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val createInboxSubTabsFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.createInboxSubTabsMethod by gettingFirstMethodDeclaratively { + name("run") + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes( Opcode.CONST_4, Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID, ) - custom { method, classDef -> - method.name == "run" && - classDef.fields.any any@{ field -> - if (field.name != "__redex_internal_original_name") return@any false - (field.initialValue as? StringEncodedValue)?.value == "InboxSubtabsItemSupplierImplementation\$onSubscribe\$1" - } + custom { + immutableClassDef.fields.any { field -> + if (field.name != "__redex_internal_original_name") return@any false + (field.initialValue as? StringEncodedValue)?.value == "InboxSubtabsItemSupplierImplementation\$onSubscribe\$1" + } } } -internal val loadInboxAdsFingerprint = fingerprint { - returns("V") - strings( - "ads_load_begin", - "inbox_ads_fetch_start", +internal val BytecodePatchContext.loadInboxAdsMethod by gettingFirstMethodDeclaratively( + "ads_load_begin", + "inbox_ads_fetch_start" +) { + returnType("V") + definingClass( + "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/" + + "InboxAdsItemSupplierImplementation;" ) - custom { method, _ -> - method.definingClass == "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/" + - "InboxAdsItemSupplierImplementation;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt index 090ffd9f82..dd9994ae70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.messenger.inbox -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,7 +10,7 @@ val hideInboxAdsPatch = bytecodePatch( ) { compatibleWith("com.facebook.orca") - execute { - loadInboxAdsFingerprint.method.replaceInstruction(0, "return-void") + apply { + loadInboxAdsMethod.replaceInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt index 2d190615f3..cca30b51b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.messenger.inbox -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,7 +10,7 @@ val hideInboxSubtabsPatch = bytecodePatch( ) { compatibleWith("com.facebook.orca") - execute { - createInboxSubTabsFingerprint.method.replaceInstruction(2, "const/4 v0, 0x0") + apply { + createInboxSubTabsMethod.replaceInstruction(2, "const/4 v0, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt deleted file mode 100644 index b9e301725c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt +++ /dev/null @@ -1,28 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -/** - * This patch will be deleted soon. - * - * Pull requests to update this patch to the latest app target are invited. - */ -@Deprecated("This patch only works with an outdated app target that is no longer fully supported by Facebook.") -@Suppress("unused") -val disableSwitchingEmojiToStickerPatch = bytecodePatch( - description = "Disables switching from emoji to sticker search mode in message input field.", -) { - compatibleWith("com.facebook.orca"("439.0.0.29.119")) - - execute { - switchMessengeInputEmojiButtonFingerprint.method.apply { - val setStringIndex = switchMessengeInputEmojiButtonFingerprint.patternMatch!!.startIndex + 2 - val targetRegister = getInstruction(setStringIndex).registerA - - replaceInstruction(setStringIndex, "const-string v$targetRegister, \"expression\"") - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt deleted file mode 100644 index 0d5bfd58cd..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -val disableTypingIndicatorPatch = bytecodePatch( - name = "Disable typing indicator", - description = "Disables the indicator while typing a message.", -) { - compatibleWith("com.facebook.orca") - - execute { - sendTypingIndicatorFingerprint.method.replaceInstruction(0, "return-void") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt deleted file mode 100644 index 75fd54f7da..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.dexbacked.value.DexBackedStringEncodedValue - -internal val sendTypingIndicatorFingerprint = fingerprint { - returns("V") - parameters() - custom { method, classDef -> - method.name == "run" && - classDef.fields.any { - it.name == "__redex_internal_original_name" && - (it.initialValue as? DexBackedStringEncodedValue)?.value == "ConversationTypingContext\$sendActiveStateRunnable\$1" - } - } -} - -internal val switchMessengeInputEmojiButtonFingerprint = fingerprint { - returns("V") - parameters("L", "Z") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IF_EQZ, - Opcode.CONST_STRING, - Opcode.GOTO, - Opcode.CONST_STRING, - Opcode.GOTO, - ) - strings("afterTextChanged", "expression_search") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt index 2abc12367c..d0cce5ef00 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt @@ -1,9 +1,14 @@ package app.revanced.patches.messenger.layout -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke -internal val isFacebookButtonEnabledFingerprint = fingerprint { - parameters() - returns("Z") - strings("FacebookButtonTabButtonImplementation") +internal val BytecodePatchContext.isFacebookButtonEnabledMethod by gettingFirstMethodDeclaratively { + parameterTypes() + returnType("Z") + instructions("FacebookButtonTabButtonImplementation"(String::contains)) } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt index 9e003d8710..cb2a47316d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/HideFacebookButtonPatch.kt @@ -6,11 +6,11 @@ import app.revanced.util.returnEarly @Suppress("unused") val hideFacebookButtonPatch = bytecodePatch( name = "Hide Facebook button", - description = "Hides the Facebook button in the top toolbar." + description = "Hides the Facebook button in the top toolbar.", ) { compatibleWith("com.facebook.orca") - execute { - isFacebookButtonEnabledFingerprint.method.returnEarly(false) + apply { + isFacebookButtonEnabledMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt index b8dd008e4e..2e13946d92 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt @@ -1,25 +1,23 @@ package app.revanced.patches.messenger.metaai +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint -internal val getMobileConfigBoolFingerprint = fingerprint { - parameters("J") - returns("Z") +internal val BytecodePatchContext.getMobileConfigBoolMethodMatch by composingFirstMethod { + parameterTypes("J") + returnType("Z") opcodes(Opcode.RETURN) - custom { _, classDef -> - classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") - } + custom { "Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;" in immutableClassDef.interfaces } } -internal val metaAIKillSwitchCheckFingerprint = fingerprint { - strings("SearchAiagentImplementationsKillSwitch") +internal val BytecodePatchContext.metaAIKillSwitchCheckMethodMatch by composingFirstMethod { opcodes(Opcode.CONST_WIDE) + instructions("SearchAiagentImplementationsKillSwitch"(String::contains)) } -internal val extensionMethodFingerprint = fingerprint { - strings("REPLACED_BY_PATCH") - custom { method, classDef -> - method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +internal val BytecodePatchContext.extensionMethodMatch by composingFirstMethod { + name(EXTENSION_METHOD_NAME) + definingClass(EXTENSION_CLASS_DESCRIPTOR) + instructions("REPLACED_BY_PATCH"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt index adee83a308..7b0d74908a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.messenger.metaai -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -14,38 +14,36 @@ internal const val EXTENSION_METHOD_NAME = "overrideBooleanFlag" @Suppress("unused") val removeMetaAIPatch = bytecodePatch( name = "Remove Meta AI", - description = "Removes UI elements related to Meta AI." + description = "Removes UI elements related to Meta AI.", ) { compatibleWith("com.facebook.orca") dependsOn(sharedExtensionPatch) - execute { - getMobileConfigBoolFingerprint.method.apply { - val returnIndex = getMobileConfigBoolFingerprint.patternMatch!!.startIndex - val returnRegister = getInstruction(returnIndex).registerA + apply { + getMobileConfigBoolMethodMatch.let { + val returnIndex = it[0] + val returnRegister = it.method.getInstruction(returnIndex).registerA - addInstructions( + it.method.addInstructions( returnIndex, """ invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->$EXTENSION_METHOD_NAME(JZ)Z move-result v$returnRegister - """ + """, ) } // Extract the common starting digits of Meta AI flag IDs from a flag found in code. - val relevantDigits = with(metaAIKillSwitchCheckFingerprint) { - method.getInstruction(patternMatch!!.startIndex).wideLiteral + val relevantDigits = metaAIKillSwitchCheckMethodMatch.let { + it.method.getInstruction(it[0]).wideLiteral }.toString().substring(0, 7) // Replace placeholder in the extension method. - with(extensionMethodFingerprint) { - method.replaceInstruction( - stringMatches!!.first().index, - """ - const-string v1, "$relevantDigits" - """ + extensionMethodMatch.let { + it.method.replaceInstruction( + it[0], + "const-string v1, \"$relevantDigits\"", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt index 55bd9aaa04..9c2160d040 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.messenger.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val messengerApplicationOnCreateHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/MessengerApplication;") - } -} +internal val messengerApplicationOnCreateHook = activityOnCreateExtensionHook( + "/MessengerApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt deleted file mode 100644 index 280f448b39..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.messenger.navbar - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.messenger.metaai.removeMetaAIPatch - -@Deprecated("Superseded by removeMetaAIPatch", ReplaceWith("removeMetaAIPatch")) -@Suppress("unused") -val removeMetaAITabPatch = bytecodePatch( - description = "Removes the 'Meta AI' tab from the navbar.", -) { - dependsOn(removeMetaAIPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt index d9e1d9e0b5..d0cb18e45f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt @@ -1,13 +1,16 @@ -package app.revanced.patches.meta.ads - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal val adInjectorFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE) - returns("Z") - parameters("L", "L") - strings( - "SponsoredContentController.insertItem", - ) -} +package app.revanced.patches.meta.ads + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.AccessFlags + +internal val BytecodePatchContext.adInjectorMethod by gettingFirstMethodDeclaratively( + "SponsoredContentController.insertItem", +) { + accessFlags(AccessFlags.PRIVATE) + returnType("Z") + parameterTypes("L", "L") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt deleted file mode 100644 index 9c6839f6ce..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.meta.ads - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.returnEarly - -@Deprecated("Instead use the Instagram or Threads specific hide ads patch") -@Suppress("unused") -val hideAdsPatch = bytecodePatch { - execute { - adInjectorFingerprint.method.returnEarly(false) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/Fingerprints.kt index 570dda0875..f965bf5b0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/Fingerprints.kt @@ -1,11 +1,11 @@ package app.revanced.patches.microsoft.officelens.misc.onedrive -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val hasMigratedToOneDriveFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("FREManager;") && method.name == "getMigrationStage" - } +internal val BytecodePatchContext.hasMigratedToOneDriveMethod by gettingFirstMethodDeclaratively { + name("getMigrationStage") + definingClass("FREManager;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/HideOneDriveMigrationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/HideOneDriveMigrationPatch.kt index a772a7b12f..b2ce063407 100644 --- a/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/HideOneDriveMigrationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/microsoft/officelens/misc/onedrive/HideOneDriveMigrationPatch.kt @@ -10,8 +10,8 @@ val hideOneDriveMigrationPatch = bytecodePatch( ) { compatibleWith("com.microsoft.office.officelens") - execute { - hasMigratedToOneDriveFingerprint.method.replaceInstructions( + apply { + hasMigratedToOneDriveMethod.replaceInstructions( 0, """ sget-object v0, Lcom/microsoft/office/officelens/scansMigration/LensMigrationStage;->PreMigration:Lcom/microsoft/office/officelens/scansMigration/LensMigrationStage; @@ -19,4 +19,4 @@ val hideOneDriveMigrationPatch = bytecodePatch( """, ) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt index 14105f762a..6187e22156 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt @@ -1,12 +1,11 @@ package app.revanced.patches.mifitness.misc.locale -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val syncBluetoothLanguageFingerprint = fingerprint { +internal val BytecodePatchContext.syncBluetoothLanguageMethodMatch by composingFirstMethod { + name("syncBluetoothLanguage") + definingClass("Lcom/xiaomi/fitness/devicesettings/DeviceSettingsSyncer") opcodes(Opcode.MOVE_RESULT_OBJECT) - custom { method, _ -> - method.name == "syncBluetoothLanguage" && - method.definingClass == "Lcom/xiaomi/fitness/devicesettings/DeviceSettingsSyncer;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt index a2a53cabaf..1e65344c5e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.mifitness.misc.locale -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.mifitness.misc.login.fixLoginPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -15,12 +15,12 @@ val forceEnglishLocalePatch = bytecodePatch( dependsOn(fixLoginPatch) - execute { - syncBluetoothLanguageFingerprint.method.apply { - val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.patternMatch!!.startIndex - val registerIndexToUpdate = getInstruction(resolvePhoneLocaleInstruction).registerA + apply { + syncBluetoothLanguageMethodMatch.let { + val resolvePhoneLocaleInstruction = it[0] + val registerIndexToUpdate = it.method.getInstruction(resolvePhoneLocaleInstruction).registerA - replaceInstruction( + it.method.replaceInstruction( resolvePhoneLocaleInstruction, "const-string v$registerIndexToUpdate, \"en_gb\"", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt index e3eee24991..2fad6bb988 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.mifitness.misc.login -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.xiaomiAccountManagerConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) - parameters("Landroid/content/Context;", "Z") - custom { method, _ -> - method.definingClass == "Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;" - } + parameterTypes("Landroid/content/Context;", "Z") + definingClass("Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt index 093a5d4f14..5208f694be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt @@ -1,15 +1,16 @@ package app.revanced.patches.mifitness.misc.login -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +@Suppress("ObjectPropertyName") val fixLoginPatch = bytecodePatch( name = "Fix login", description = "Fixes login for uncertified Mi Fitness app", ) { compatibleWith("com.xiaomi.wearable") - execute { - xiaomiAccountManagerConstructorFingerprint.method.addInstruction(0, "const/16 p2, 0x0") + apply { + xiaomiAccountManagerConstructorMethod.addInstruction(0, "const/16 p2, 0x0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt index 6ce0519ada..1d2f125f04 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.music.ad.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val showVideoAdsParentFingerprint = fingerprint { +internal val BytecodePatchContext.showVideoAdsParentMethodMatch by composingFirstMethod( + "maybeRegenerateCpnAndStatsClient called unexpectedly, but no error.", +) { opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT, ) - strings("maybeRegenerateCpnAndStatsClient called unexpectedly, but no error.") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt index cd5150c164..410a6aff3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt @@ -1,6 +1,6 @@ package app.revanced.patches.music.ad.video -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -12,7 +12,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideVideoAdsPatch;" @Suppress("unused") -val hideVideoAdsPatch = bytecodePatch( +val hideMusicVideoAdsPatch = bytecodePatch( name = "Hide music video ads", description = "Adds an option to hide ads that appear while listening to or streaming music videos, podcasts, or songs.", ) { @@ -25,26 +25,26 @@ val hideVideoAdsPatch = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { + apply { addResources("music", "ad.video.hideVideoAdsPatch") PreferenceScreen.ADS.addPreferences( SwitchPreference("revanced_music_hide_video_ads"), ) - navigate(showVideoAdsParentFingerprint.originalMethod) - .to(showVideoAdsParentFingerprint.patternMatch!!.startIndex + 1) + navigate(showVideoAdsParentMethodMatch.immutableMethod) + .to(showVideoAdsParentMethodMatch[0] + 1) .stop() .addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->showVideoAds(Z)Z move-result p1 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt index f0b1974c3f..cc4e23c09a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt @@ -18,11 +18,11 @@ val enableExclusiveAudioPlaybackPatch = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - allowExclusiveAudioPlaybackFingerprint.method.returnEarly(true) + apply { + allowExclusiveAudioPlaybackMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt index 4ac10dd9bd..dacca3d291 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt @@ -1,13 +1,18 @@ package app.revanced.patches.music.audio.exclusiveaudio -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { +internal val BytecodePatchContext.allowExclusiveAudioPlaybackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() + returnType("Z") + parameterTypes() opcodes( Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT, @@ -18,6 +23,6 @@ internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { Opcode.IF_NEZ, Opcode.IGET_OBJECT, Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT + Opcode.MOVE_RESULT, ) -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt index 13820d29d8..704a2c88a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt @@ -1,20 +1,20 @@ package app.revanced.patches.music.interaction.permanentrepeat -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val repeatTrackFingerprint = fingerprint { +internal val BytecodePatchContext.repeatTrackMethodMatch by composingFirstMethod("w_st") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L") + returnType("V") + parameterTypes("L", "L") opcodes( Opcode.IGET_OBJECT, Opcode.IGET_OBJECT, Opcode.SGET_OBJECT, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, - Opcode.IF_NEZ + Opcode.IF_NEZ, ) - strings("w_st") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index addf737f84..aa8a0449d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.music.interaction.permanentrepeat -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch @@ -17,7 +17,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/pa @Suppress("unused") val permanentRepeatPatch = bytecodePatch( name = "Permanent repeat", - description = "Adds an option to always repeat even if the playlist ends or another track is played." + description = "Adds an option to always repeat even if the playlist ends or another track is played.", ) { dependsOn( sharedExtensionPatch, @@ -28,21 +28,21 @@ val permanentRepeatPatch = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { + apply { addResources("music", "interaction.permanentrepeat.permanentRepeatPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_music_play_permanent_repeat"), ) - val startIndex = repeatTrackFingerprint.patternMatch!!.endIndex - val repeatIndex = startIndex + 1 + repeatTrackMethodMatch.method.apply { + val startIndex = repeatTrackMethodMatch[-1] + val repeatIndex = startIndex + 1 - repeatTrackFingerprint.method.apply { // Start index is at a branch, but the same // register is clobbered in both branch paths. val freeRegister = findFreeRegister(startIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt deleted file mode 100644 index f2169744fe..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -internal val disableShuffleFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.SGET_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt deleted file mode 100644 index 359ede6625..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val permanentShufflePatch = bytecodePatch( - description = "Permanently remember your shuffle preference " + - "even if the playlist ends or another track is played." -) { - compatibleWith( - "com.google.android.apps.youtube.music"( - "7.29.52", - "8.10.52" - ) - ) - - execute { - disableShuffleFingerprint.method.addInstruction(0, "return-void") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index a537078e87..0587878df9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -1,18 +1,17 @@ package app.revanced.patches.music.layout.branding -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.gms.Constants.MUSIC_MAIN_ACTIVITY_NAME import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME -import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint +import app.revanced.patches.music.misc.gms.musicActivityOnCreateMethod import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.shared.layout.branding.EXTENSION_CLASS_DESCRIPTOR import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstructionOrThrow @@ -24,7 +23,7 @@ private val disableSplashAnimationPatch = bytecodePatch { dependsOn(resourceMappingPatch) - execute { + apply { // The existing YT animation usually only shows for a fraction of a second, // and the existing animation does not match the new splash screen // causing the original YT Music logo to momentarily flash on screen as the animation starts. @@ -32,13 +31,13 @@ private val disableSplashAnimationPatch = bytecodePatch { // Could replace the lottie animation file with our own custom animation (app_launch.json), // but the animation is not always the same size as the launch screen and it's still // barely shown. Instead turn off the animation entirely (app will also launch a little faster). - cairoSplashAnimationConfigFingerprint.method.apply { + cairoSplashAnimationConfigMethod.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow( - resourceMappings["layout", "main_activity_launch_animation"] + ResourceType.LAYOUT["main_activity_launch_animation"], ) val checkCastIndex = indexOfFirstInstructionOrThrow(literalIndex) { opcode == Opcode.CHECK_CAST && - getReference()?.type == "Lcom/airbnb/lottie/LottieAnimationView;" + getReference()?.type == "Lcom/airbnb/lottie/LottieAnimationView;" } val register = getInstruction(checkCastIndex).registerA @@ -48,7 +47,7 @@ private val disableSplashAnimationPatch = bytecodePatch { """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getLottieViewOrNull(Landroid/view/View;)Landroid/view/View; move-result-object v$register - """ + """, ) } } @@ -62,7 +61,7 @@ val customBrandingPatch = baseCustomBrandingPatch( originalAppPackageName = MUSIC_PACKAGE_NAME, isYouTubeMusic = true, numberOfPresetAppNames = 5, - mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + getMainActivityOnCreate = { musicActivityOnCreateMethod }, mainActivityName = MUSIC_MAIN_ACTIVITY_NAME, activityAliasNameWithIntents = MUSIC_MAIN_ACTIVITY_NAME, preferenceScreen = PreferenceScreen.GENERAL, @@ -73,8 +72,8 @@ val customBrandingPatch = baseCustomBrandingPatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - } + }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt index 8e8989983f..d76fb66395 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.music.layout.branding -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE +import app.revanced.patches.shared.misc.mapping.ResourceType -internal val cairoSplashAnimationConfigFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE - } +internal val BytecodePatchContext.cairoSplashAnimationConfigMethod by gettingFirstMethodDeclaratively { + name("onCreate") + returnType("V") + definingClass(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE) + parameterTypes("Landroid/os/Bundle;") + instructions(ResourceType.LAYOUT("main_activity_launch_animation")) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt index 31c844aea1..92aa2b6356 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt @@ -1,64 +1,61 @@ package app.revanced.patches.music.layout.buttons -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val mediaRouteButtonFingerprint = fingerprint { +internal val BytecodePatchContext.mediaRouteButtonMethod by gettingFirstMethodDeclaratively("MediaRouteButton") { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("Z") - strings("MediaRouteButton") + returnType("Z") } -internal val playerOverlayChipFingerprint = fingerprint { +internal val BytecodePatchContext.playerOverlayChipMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - literal { playerOverlayChip } + returnType("L") + instructions(playerOverlayChip()) } -internal val historyMenuItemFingerprint = fingerprint { +internal val BytecodePatchContext.historyMenuItemMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/Menu;") + returnType("V") + parameterTypes("Landroid/view/Menu;") opcodes( Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ) literal { historyMenuItem } - custom { _, classDef -> - classDef.methods.count() == 5 + custom { + immutableClassDef.methods.count() == 5 } } -internal val historyMenuItemOfflineTabFingerprint = fingerprint { +internal val BytecodePatchContext.historyMenuItemOfflineTabMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/Menu;") + returnType("V") + parameterTypes("Landroid/view/Menu;") opcodes( Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ) - custom { method, _ -> - method.containsLiteralInstruction(historyMenuItem) && - method.containsLiteralInstruction(offlineSettingsMenuItem) - } + + val match = indexedMatcher(items = unorderedAllOf(historyMenuItem(), offlineSettingsMenuItem())) + custom { match(instructions) } } -internal val searchActionViewFingerprint = fingerprint { +internal val BytecodePatchContext.searchActionViewMethod by gettingFirstMethodDeclaratively { + definingClass("/SearchActionProvider;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - parameters() + returnType("Landroid/view/View;") + parameterTypes() literal { searchButton } - custom { _, classDef -> - classDef.type.endsWith("/SearchActionProvider;") - } } -internal val topBarMenuItemImageViewFingerprint = fingerprint { +internal val BytecodePatchContext.topBarMenuItemImageViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - parameters() + returnType("Landroid/view/View;") + parameterTypes() literal { topBarMenuItemImageView } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt index 578eaebe2c..9c2ea8054c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt @@ -1,17 +1,18 @@ package app.revanced.patches.music.layout.buttons -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethod +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstructionOrThrow @@ -33,30 +34,30 @@ internal var topBarMenuItemImageView = -1L private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideButtonsPatch;" @Suppress("unused") -val hideButtons = bytecodePatch( +val hideButtonsPatch = bytecodePatch( name = "Hide buttons", - description = "Adds options to hide the cast, history, notification, and search buttons." + description = "Adds options to hide the cast, history, notification, and search buttons.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, - resourceMappingPatch + resourceMappingPatch, ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - playerOverlayChip = resourceMappings["id", "player_overlay_chip"] - historyMenuItem = resourceMappings["id", "history_menu_item"] - offlineSettingsMenuItem = resourceMappings["id", "offline_settings_menu_item"] - searchButton = resourceMappings["layout", "search_button"] - topBarMenuItemImageView = resourceMappings["id", "top_bar_menu_item_image_view"] + apply { + playerOverlayChip = ResourceType.ID["player_overlay_chip"] + historyMenuItem = ResourceType.ID["history_menu_item"] + offlineSettingsMenuItem = ResourceType.ID["offline_settings_menu_item"] + searchButton = ResourceType.LAYOUT["search_button"] + topBarMenuItemImageView = ResourceType.ID["top_bar_menu_item_image_view"] addResources("music", "layout.buttons.hideButtons") @@ -64,16 +65,16 @@ val hideButtons = bytecodePatch( SwitchPreference("revanced_music_hide_cast_button"), SwitchPreference("revanced_music_hide_history_button"), SwitchPreference("revanced_music_hide_notification_button"), - SwitchPreference("revanced_music_hide_search_button") + SwitchPreference("revanced_music_hide_search_button"), ) // Region for hide history button in the top bar. arrayOf( - historyMenuItemFingerprint, - historyMenuItemOfflineTabFingerprint - ).forEach { fingerprint -> - fingerprint.method.apply { - val targetIndex = fingerprint.patternMatch!!.startIndex + historyMenuItemMethodMatch, + historyMenuItemOfflineTabMethodMatch, + ).forEach { match -> + match.method.apply { + val targetIndex = match[0] val targetRegister = getInstruction(targetIndex).registerD addInstructions( @@ -81,41 +82,42 @@ val hideButtons = bytecodePatch( """ invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideHistoryButton(Z)Z move-result v$targetRegister - """ + """, ) } } // Region for hide cast, search and notification buttons in the top bar. arrayOf( - Triple(playerOverlayChipFingerprint, playerOverlayChip, "hideCastButton"), - Triple(searchActionViewFingerprint, searchButton, "hideSearchButton"), - Triple(topBarMenuItemImageViewFingerprint, topBarMenuItemImageView, "hideNotificationButton") - ).forEach { (fingerprint, resourceIdLiteral, methodName) -> - fingerprint.method.apply { + Triple(playerOverlayChipMethod, playerOverlayChip, "hideCastButton"), + Triple(searchActionViewMethod, searchButton, "hideSearchButton"), + Triple(topBarMenuItemImageViewMethod, topBarMenuItemImageView, "hideNotificationButton"), + ).forEach { (method, resourceIdLiteral, methodName) -> + method.apply { val resourceIndex = indexOfFirstLiteralInstructionOrThrow(resourceIdLiteral) val targetIndex = indexOfFirstInstructionOrThrow( - resourceIndex, Opcode.MOVE_RESULT_OBJECT + resourceIndex, + Opcode.MOVE_RESULT_OBJECT, ) val targetRegister = getInstruction(targetIndex).registerA addInstruction( targetIndex + 1, "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" + "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", ) } } // Region for hide cast button in the player. - mediaRouteButtonFingerprint.classDef.methods.single { method -> - method.name == "setVisibility" + mediaRouteButtonMethod.immutableClassDef.firstMethod { + name == "setVisibility" }.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->hideCastButton(I)I move-result p1 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt deleted file mode 100644 index bb6053f8ab..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.music.layout.castbutton - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.music.layout.buttons.hideButtons - -@Deprecated("Patch was moved", ReplaceWith("hideButtons")) -@Suppress("unused") -val hideCastButton = bytecodePatch{ - dependsOn(hideButtons) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt index 76e03d2c99..00daa527dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt @@ -1,16 +1,17 @@ package app.revanced.patches.music.layout.compactheader -import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.literal +import com.android.tools.smali.dexlib2.Opcode -internal val chipCloudFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.chipCloudMethodMatch by composingFirstMethod { + returnType("V") opcodes( Opcode.CONST, Opcode.CONST_4, Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT + Opcode.MOVE_RESULT_OBJECT, ) literal { chipCloud } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index 5a62705515..7bc195419c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -1,15 +1,14 @@ package app.revanced.patches.music.layout.compactheader -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -19,9 +18,9 @@ internal var chipCloud = -1L private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;" @Suppress("unused") -val hideCategoryBar = bytecodePatch( +val hideCategoryBarPatch = bytecodePatch( name = "Hide category bar", - description = "Adds an option to hide the category bar at the top of the homepage." + description = "Adds an option to hide the category bar at the top of the homepage.", ) { dependsOn( sharedExtensionPatch, @@ -32,26 +31,26 @@ val hideCategoryBar = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - chipCloud = resourceMappings["layout", "chip_cloud"] - + apply { addResources("music", "layout.compactheader.hideCategoryBar") PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_music_hide_category_bar"), ) - chipCloudFingerprint.method.apply { - val targetIndex = chipCloudFingerprint.patternMatch!!.endIndex - val targetRegister = getInstruction(targetIndex).registerA + chipCloud = ResourceType.LAYOUT["chip_cloud"] - addInstruction( + chipCloudMethodMatch.let { + val targetIndex = it[-1] + val targetRegister = it.method.getInstruction(targetIndex).registerA + + it.method.addInstruction( targetIndex + 1, - "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar(Landroid/view/View;)V" + "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar(Landroid/view/View;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt index e4da9aafe2..0cf6ad4c90 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt @@ -7,6 +7,6 @@ import app.revanced.patches.shared.layout.hide.general.hideLayoutComponentsPatch val hideLayoutComponentsPatch = hideLayoutComponentsPatch( lithoFilterPatch = lithoFilterPatch, settingsPatch = settingsPatch, - filterClasses = setOf("Lapp/revanced/extension/shared/patches/components/CustomFilter;"), - compatibleWithPackages = arrayOf("com.google.android.apps.youtube.music" to setOf("7.29.52", "8.10.52")) -) \ No newline at end of file + filterClasses = setOf("Lapp/revanced/extension/shared/patches/litho/CustomFilter;"), + compatibleWithPackages = arrayOf("com.google.android.apps.youtube.music" to setOf("7.29.52", "8.10.52")), +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt index ef44657185..7a699b2675 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt @@ -2,89 +2,89 @@ package app.revanced.patches.music.layout.miniplayercolor -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.accessFlags +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.returnType import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.findFreeRegister -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var mpp_player_bottom_sheet = -1L - private set - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/ChangeMiniplayerColorPatch;" @Suppress("unused") -val changeMiniplayerColor = bytecodePatch( +val changeMiniplayerColorPatch = bytecodePatch( name = "Change miniplayer color", - description = "Adds an option to change the miniplayer background color to match the fullscreen player." + description = "Adds an option to change the miniplayer background color to match the fullscreen player.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, - resourceMappingPatch + resourceMappingPatch, ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - mpp_player_bottom_sheet = resourceMappings["id", "mpp_player_bottom_sheet"] - + apply { addResources("music", "layout.miniplayercolor.changeMiniplayerColor") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_music_change_miniplayer_color"), ) - switchToggleColorFingerprint.match(miniPlayerConstructorFingerprint.classDef).let { - val relativeIndex = it.patternMatch!!.endIndex + 1 + miniPlayerConstructorMethodMatch.immutableClassDef.switchToggleColorMethodMatch.let { + val relativeIndex = it[-1] + 1 val invokeVirtualIndex = it.method.indexOfFirstInstructionOrThrow( - relativeIndex, Opcode.INVOKE_VIRTUAL + relativeIndex, + Opcode.INVOKE_VIRTUAL, ) val colorMathPlayerInvokeVirtualReference = it.method .getInstruction(invokeVirtualIndex).reference val iGetIndex = it.method.indexOfFirstInstructionOrThrow( - relativeIndex, Opcode.IGET + relativeIndex, + Opcode.IGET, ) val colorMathPlayerIGetReference = it.method .getInstruction(iGetIndex).reference as FieldReference - val colorGreyIndex = miniPlayerConstructorFingerprint.method.indexOfFirstInstructionReversedOrThrow { - getReference()?.name == "getColor" - } - val iPutIndex = miniPlayerConstructorFingerprint.method.indexOfFirstInstructionOrThrow( - colorGreyIndex, Opcode.IPUT + val colorGreyIndex = + miniPlayerConstructorMethodMatch.immutableMethod.indexOfFirstInstructionReversedOrThrow { + getReference()?.name == "getColor" + } + val iPutIndex = miniPlayerConstructorMethodMatch.immutableMethod.indexOfFirstInstructionOrThrow( + colorGreyIndex, + Opcode.IPUT, ) - val colorMathPlayerIPutReference = miniPlayerConstructorFingerprint.method + val colorMathPlayerIPutReference = miniPlayerConstructorMethodMatch.immutableMethod .getInstruction(iPutIndex).reference - miniPlayerConstructorFingerprint.classDef.methods.single { method -> - method.accessFlags == AccessFlags.PUBLIC.value or AccessFlags.FINAL.value && - method.returnType == "V" && - method.parameters == it.originalMethod.parameters + miniPlayerConstructorMethodMatch.immutableClassDef.firstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes( + parameterTypePrefixes = it.method.parameterTypes.map { type -> type.toString() } + .toTypedArray(), + ) }.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.INVOKE_DIRECT) val freeRegister = findFreeRegister(insertIndex) @@ -102,7 +102,7 @@ val changeMiniplayerColor = bytecodePatch( iput v$freeRegister, p0, $colorMathPlayerIPutReference :off nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt index 8cc939f0f3..5a3ee206e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt @@ -1,27 +1,31 @@ package app.revanced.patches.music.layout.miniplayercolor -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val miniPlayerConstructorFingerprint = fingerprint { - returns("V") - strings("sharedToggleMenuItemMutations") - literal { mpp_player_bottom_sheet } +internal val BytecodePatchContext.miniPlayerConstructorMethodMatch by composingFirstMethod { + returnType("V") + instructions( + ResourceType.ID("mpp_player_bottom_sheet"), + "sharedToggleMenuItemMutations"(), + ) } /** - * Matches to the class found in [miniPlayerConstructorFingerprint]. + * Matches to the class found in [miniPlayerConstructorMethodMatch]. */ -internal val switchToggleColorFingerprint = fingerprint { +internal val ClassDef.switchToggleColorMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - parameters("L", "J") + returnType("V") + parameterTypes("L", "J") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST, - Opcode.IGET + Opcode.IGET, ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt index df5dbe68d3..00984d1e01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.music.layout.navigationbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -9,10 +10,10 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val tabLayoutTextFingerprint = fingerprint { +internal val BytecodePatchContext.tabLayoutTextMethodMatch by composingFirstMethod("FEmusic_search") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") + returnType("V") + parameterTypes("L") opcodes( Opcode.IGET, Opcode.INVOKE_STATIC, @@ -20,17 +21,15 @@ internal val tabLayoutTextFingerprint = fingerprint { Opcode.IF_NEZ, Opcode.SGET_OBJECT, Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT + Opcode.MOVE_RESULT, ) - strings("FEmusic_search") - custom { method, _ -> - method.containsLiteralInstruction(text1) - && indexOfGetVisibilityInstruction(method) >= 0 + custom { + containsLiteralInstruction(text1) && + indexOfGetVisibilityInstruction(this) >= 0 } } -internal fun indexOfGetVisibilityInstruction(method: Method) = - method.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "getVisibility" - } +internal fun indexOfGetVisibilityInstruction(method: Method) = method.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "getVisibility" +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt index 4459700cb3..f977920b34 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.music.layout.navigationbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -10,9 +10,8 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -30,7 +29,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/pa @Suppress("unused") val navigationBarPatch = bytecodePatch( name = "Navigation bar", - description = "Adds options to hide navigation bar, labels and buttons." + description = "Adds options to hide navigation bar, labels and buttons.", ) { dependsOn( resourceMappingPatch, @@ -38,7 +37,7 @@ val navigationBarPatch = bytecodePatch( settingsPatch, addResourcesPatch, resourcePatch { - execute { + apply { // Ensure the first ImageView has 'layout_weight' to stay properly sized // when the TextView is hidden. document("res/layout/image_with_text_tab.xml").use { document -> @@ -52,18 +51,18 @@ val navigationBarPatch = bytecodePatch( } } } - } + }, ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - text1 = resourceMappings["id", "text1"] + apply { + text1 = ResourceType.ID["text1"] addResources("music", "layout.navigationbar.navigationBarPatch") @@ -80,27 +79,28 @@ val navigationBarPatch = bytecodePatch( SwitchPreference("revanced_music_hide_navigation_bar"), SwitchPreference("revanced_music_hide_navigation_bar_labels"), - ) - ) + ), + ), ) - tabLayoutTextFingerprint.method.apply { + tabLayoutTextMethodMatch.method.apply { // Hide navigation labels. val constIndex = indexOfFirstLiteralInstructionOrThrow(text1) val targetIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.CHECK_CAST) val targetParameter = getInstruction(targetIndex).reference val targetRegister = getInstruction(targetIndex).registerA - if (!targetParameter.toString().endsWith("Landroid/widget/TextView;")) + if (!targetParameter.toString().endsWith("Landroid/widget/TextView;")) { throw PatchException("Method signature parameter did not match: $targetParameter") + } addInstruction( targetIndex + 1, - "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V" + "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V", ) // Set navigation enum and hide navigation buttons. - val enumIndex = tabLayoutTextFingerprint.patternMatch!!.startIndex + 3 + val enumIndex = tabLayoutTextMethodMatch[0] + 3 val enumRegister = getInstruction(enumIndex).registerA val insertEnumIndex = indexOfFirstInstructionOrThrow(Opcode.AND_INT_LIT8) - 2 @@ -109,12 +109,12 @@ val navigationBarPatch = bytecodePatch( addInstruction( pivotTabIndex, - "invoke-static { v$pivotTabRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButton(Landroid/view/View;)V" + "invoke-static { v$pivotTabRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButton(Landroid/view/View;)V", ) addInstruction( insertEnumIndex, - "invoke-static { v$enumRegister }, $EXTENSION_CLASS_DESCRIPTOR->setLastAppNavigationEnum(Ljava/lang/Enum;)V" + "invoke-static { v$enumRegister }, $EXTENSION_CLASS_DESCRIPTOR->setLastAppNavigationEnum(Ljava/lang/Enum;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt index 29558ab4be..cc4e07125a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt @@ -1,24 +1,27 @@ package app.revanced.patches.music.layout.premium -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideGetPremiumFingerprint = fingerprint { +internal val BytecodePatchContext.hideGetPremiumMethodMatch by composingFirstMethod( + "FEmusic_history", + "FEmusic_offline", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() + returnType("V") + parameterTypes() opcodes( Opcode.IF_NEZ, Opcode.CONST_16, Opcode.INVOKE_VIRTUAL, ) - strings("FEmusic_history", "FEmusic_offline") } -internal val membershipSettingsFingerprint = fingerprint { +internal val BytecodePatchContext.membershipSettingsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/CharSequence;") + returnType("Ljava/lang/CharSequence;") opcodes( Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index 13a50c54f1..d6f1c0092d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.music.layout.premium -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideGetPremiumPatch;" @Suppress("unused") -val hideGetPremiumPatch = bytecodePatch( +val hideGetMusicPremiumPatch = bytecodePatch( name = "Hide 'Get Music Premium'", description = "Adds an option to hide the \"Get Music Premium\" label in the settings and account menu.", ) { @@ -29,37 +29,39 @@ val hideGetPremiumPatch = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { + apply { addResources("music", "layout.premium.hideGetPremiumPatch") PreferenceScreen.ADS.addPreferences( SwitchPreference("revanced_music_hide_get_premium_label"), ) - hideGetPremiumFingerprint.method.apply { - val insertIndex = hideGetPremiumFingerprint.patternMatch!!.endIndex + hideGetPremiumMethodMatch.let { + val insertIndex = it[-1] - val setVisibilityInstruction = getInstruction(insertIndex) - val getPremiumViewRegister = setVisibilityInstruction.registerC - val visibilityRegister = setVisibilityInstruction.registerD + it.method.apply { + val setVisibilityInstruction = getInstruction(insertIndex) + val getPremiumViewRegister = setVisibilityInstruction.registerC + val visibilityRegister = setVisibilityInstruction.registerD - replaceInstruction( - insertIndex, - "const/16 v$visibilityRegister, 0x8", - ) + replaceInstruction( + insertIndex, + "const/16 v$visibilityRegister, 0x8", + ) - addInstruction( - insertIndex + 1, - "invoke-virtual {v$getPremiumViewRegister, v$visibilityRegister}, " + - "Landroid/view/View;->setVisibility(I)V", - ) + addInstruction( + insertIndex + 1, + "invoke-virtual {v$getPremiumViewRegister, v$visibilityRegister}, " + + "Landroid/view/View;->setVisibility(I)V", + ) + } } - membershipSettingsFingerprint.method.addInstructionsWithLabels( + membershipSettingsMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideGetPremiumLabel()Z @@ -69,7 +71,7 @@ val hideGetPremiumPatch = bytecodePatch( return-object v0 :show nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt deleted file mode 100644 index 0b0f244975..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.music.layout.upgradebutton - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.music.layout.navigationbar.navigationBarPatch - -@Deprecated("Patch is obsolete and was replaced by navigation bar patch", ReplaceWith("navigationBarPatch")) -@Suppress("unused") -val hideUpgradeButton = bytecodePatch{ - dependsOn(navigationBarPatch) -} - -@Deprecated("Patch was renamed", ReplaceWith("hideUpgradeButton")) -@Suppress("unused") -val removeUpgradeButton = bytecodePatch{ - dependsOn(hideUpgradeButton) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt deleted file mode 100644 index 36a91466a1..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt +++ /dev/null @@ -1,15 +0,0 @@ -package app.revanced.patches.music.misc.androidauto - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.music.misc.extension.sharedExtensionPatch -import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.util.returnEarly - -@Deprecated("This patch is useless by itself and has been merged into another patch.", ReplaceWith("unlockAndroidAutoMediaBrowserPatch")) - -@Suppress("unused") -val bypassCertificateChecksPatch = bytecodePatch( - description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.", -) { - dependsOn(unlockAndroidAutoMediaBrowserPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 63c9de464d..6fb1748eac 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -1,21 +1,29 @@ package app.revanced.patches.music.misc.androidauto -import app.revanced.patcher.fingerprint +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val checkCertificateFingerprint = fingerprint { - returns("Z") - parameters("Ljava/lang/String;") - strings( - "X509", - "Failed to get certificate" // Partial String match. - ) +internal val BytecodePatchContext.checkCertificateMethod by gettingFirstMethodDeclaratively( + "X509", +) { + returnType("Z") + parameterTypes("Ljava/lang/String;") + instructions("Failed to get certificate"(String::contains)) } -internal val searchMediaItemsConstructorFingerprint = fingerprint { - returns("V") - strings("ytm_media_browser/search_media_items") +internal val BytecodePatchContext.searchMediaItemsConstructorMethod by gettingFirstMethodDeclaratively( + "ytm_media_browser/search_media_items", +) { + returnType("V") } -internal val searchMediaItemsExecuteFingerprint = fingerprint { - parameters() -} \ No newline at end of file +context(_: BytecodePatchContext) +internal fun ClassDef.getSearchMediaItemsExecuteMethod() = firstMethodDeclaratively { + parameterTypes() +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt index 55fb2bb12e..dd2b2eaac7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt @@ -1,13 +1,13 @@ package app.revanced.patches.music.misc.androidauto -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.getReference import app.revanced.util.registersUsed import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Suppress("unused") val unlockAndroidAutoMediaBrowserPatch = bytecodePatch( @@ -17,18 +17,16 @@ val unlockAndroidAutoMediaBrowserPatch = bytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - checkCertificateFingerprint.method.returnEarly(true) + apply { + checkCertificateMethod.returnEarly(true) - searchMediaItemsExecuteFingerprint - .match(searchMediaItemsConstructorFingerprint.classDef) - .method.apply { - val targetIndex = instructions.indexOfFirst { - it.opcode == Opcode.IGET_OBJECT && it.getReference()?.type == "Ljava/lang/String;" + searchMediaItemsConstructorMethod.immutableClassDef.getSearchMediaItemsExecuteMethod().apply { + val targetIndex = instructions.indexOfFirst { + it.opcode == Opcode.IGET_OBJECT && it.fieldReference?.type == "Ljava/lang/String;" } val register = instructions[targetIndex].registersUsed.first() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt index bf35b24d5d..5d8b651c18 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -1,33 +1,29 @@ package app.revanced.patches.music.misc.backgroundplayback -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.util.returnEarly -val backgroundPlaybackPatch = bytecodePatch( +@Suppress("unused") +val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( name = "Remove background playback restrictions", description = "Removes restrictions on background playback, including playing kids videos in the background.", ) { dependsOn( sharedExtensionPatch, - settingsPatch + settingsPatch, ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) - execute { - kidsBackgroundPlaybackPolicyControllerFingerprint.method.addInstruction( - 0, - "return-void", - ) - - backgroundPlaybackDisableFingerprint.method.returnEarly(true) + apply { + kidsBackgroundPlaybackPolicyControllerMethod.returnEarly() + backgroundPlaybackDisableMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt index e1cf24e1a2..fe6481c303 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.music.misc.backgroundplayback -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackDisableFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackDisableMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L") + returnType("Z") + parameterTypes("L") opcodes( Opcode.CONST_4, Opcode.IF_EQZ, @@ -21,10 +22,10 @@ internal val backgroundPlaybackDisableFingerprint = fingerprint { ) } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val BytecodePatchContext.kidsBackgroundPlaybackPolicyControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("I", "L", "Z") + returnType("V") + parameterTypes("I", "L", "Z") opcodes( Opcode.IGET, Opcode.IF_NE, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index d6ac3ef780..aa00a581ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.music.misc.dns import app.revanced.patches.music.misc.extension.sharedExtensionPatch -import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.music.shared.mainActivityOnCreateMethod import app.revanced.patches.shared.misc.dns.checkWatchHistoryDomainNameResolutionPatch val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameResolutionPatch( @@ -18,5 +18,5 @@ val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameReso ) }, - mainActivityFingerprint = mainActivityOnCreateFingerprint + getMainActivityMethod = { mainActivityOnCreateMethod } ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/SharedExtensionPatch.kt index b10c321a48..1409c8f57e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/SharedExtensionPatch.kt @@ -6,5 +6,6 @@ import app.revanced.patches.shared.misc.extension.sharedExtensionPatch val sharedExtensionPatch = sharedExtensionPatch( "music", - applicationInitHook, applicationInitOnCreateHook + applicationInitHook, + applicationInitOnCreateHook ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt index 60372d1aa0..2fefbb7833 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt @@ -1,19 +1,19 @@ package app.revanced.patches.music.misc.extension.hooks +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.returnType import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook internal val applicationInitHook = extensionHook { - returns("V") - parameters() - strings("activity") - custom { method, _ -> method.name == "onCreate" } + name("onCreate") + returnType("V") + parameterTypes() + instructions("activity"()) } -internal val applicationInitOnCreateHook = extensionHook { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE - } -} +internal val applicationInitOnCreateHook = activityOnCreateExtensionHook(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt index 32c162a46f..9c36f4afa3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt @@ -1,9 +1,8 @@ package app.revanced.patches.music.misc.fileprovider -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName -import app.revanced.patches.music.utils.fix.fileprovider.fileProviderResolverFingerprint internal fun fileProviderPatch( youtubePackageName: String, @@ -11,7 +10,7 @@ internal fun fileProviderPatch( ) = bytecodePatch( description = "Fixes broken YouTube Music file provider that prevents sharing with specific apps such as Instagram." ) { - finalize { + afterDependents { // Must do modification last, so change package name value is correctly set. val musicChangedPackageName = setOrGetFallbackPackageName(musicPackageName) @@ -22,7 +21,7 @@ internal fun fileProviderPatch( // https://github.com/ReVanced/revanced-patches/issues/55 // // To solve this issue, replace the package name of YouTube with YT Music's package name. - fileProviderResolverFingerprint.method.addInstructionsWithLabels( + fileProviderResolverMethod.addInstructionsWithLabels( 0, """ const-string v0, "com.google.android.youtube.fileprovider" diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt index 16a2d6a58f..d4682eaa9b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt @@ -1,11 +1,12 @@ -package app.revanced.patches.music.utils.fix.fileprovider +package app.revanced.patches.music.misc.fileprovider -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val fileProviderResolverFingerprint = fingerprint { - returns("L") - strings( - "android.support.FILE_PROVIDER_PATHS", - "Name must not be empty" - ) +internal val BytecodePatchContext.fileProviderResolverMethod by gettingFirstMethodDeclaratively( + "android.support.FILE_PROVIDER_PATHS", + "Name must not be empty" +) { + returnType("L") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt index 7131e143df..faa6de9ff6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt @@ -1,11 +1,11 @@ package app.revanced.patches.music.misc.gms -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val musicActivityOnCreateFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/MusicActivity;") - } +internal val BytecodePatchContext.musicActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/MusicActivity;") + returnType("V") + parameterTypes("Landroid/os/Bundle;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt index 5d74ef8be9..88cfe2ca6f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.music.misc.gms +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Option import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,27 +10,23 @@ import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.music.misc.spoof.spoofVideoStreamsPatch -import app.revanced.patches.shared.castContextFetchFingerprint +import app.revanced.patches.shared.castContextFetchMethod import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.shared.primeMethodFingerprint +import app.revanced.patches.shared.primeMethod @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = MUSIC_PACKAGE_NAME, toPackageName = REVANCED_MUSIC_PACKAGE_NAME, - primeMethodFingerprint = primeMethodFingerprint, - earlyReturnFingerprints = setOf( - castContextFetchFingerprint, - ), - mainActivityOnCreateFingerprintToInsertIndex = musicActivityOnCreateFingerprint to { 0 }, + getPrimeMethod = { primeMethod }, + getEarlyReturnMethods = setOf(BytecodePatchContext::castContextFetchMethod::get), + getMainActivityOnCreateMethodToGetInsertIndex = BytecodePatchContext::musicActivityOnCreateMethod::get to { 0 }, extensionPatch = sharedExtensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { - dependsOn(spoofVideoStreamsPatch) compatibleWith( MUSIC_PACKAGE_NAME( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/litho/filter/LithoFilterPatch.kt index fb92579992..ebb0edc8a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/litho/filter/LithoFilterPatch.kt @@ -1,8 +1,12 @@ package app.revanced.patches.music.misc.litho.filter +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.music.misc.extension.sharedExtensionPatch -import app.revanced.patches.music.shared.conversionContextFingerprintToString +import app.revanced.patches.music.shared.conversionContextToStringMethod +import app.revanced.patches.shared.misc.litho.filter.EXTENSION_CLASS_DESCRIPTOR import app.revanced.patches.shared.misc.litho.filter.lithoFilterPatch +import app.revanced.patches.shared.misc.litho.filter.protobufBufferReferenceLegacyMethod import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -11,7 +15,13 @@ val lithoFilterPatch = lithoFilterPatch( // No supported version clobbers p2 so we can just do our things before the return instruction. indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) }, - conversionContextFingerprintToString = conversionContextFingerprintToString, + getConversionContextToStringMethod = BytecodePatchContext::conversionContextToStringMethod::get, + insertProtobufHook = { + protobufBufferReferenceLegacyMethod.addInstruction( + 0, + "invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V", + ) + }, ) { dependsOn(sharedExtensionPatch) -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt index 580e6e7679..5774481c8f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt @@ -1,11 +1,15 @@ package app.revanced.patches.music.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val googleApiActivityFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - classDef.endsWith("GoogleApiActivity;") && method.name == "onCreate" - } +internal val BytecodePatchContext.googleApiActivityMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("GoogleApiActivity;") + returnType("V") + parameterTypes("Landroid/os/Bundle;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt index e95db8c364..497e100112 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.music.misc.settings +import app.revanced.patcher.classDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName @@ -8,14 +9,7 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.settings.preference.BasePreference -import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen -import app.revanced.patches.shared.misc.settings.preference.InputType -import app.revanced.patches.shared.misc.settings.preference.IntentPreference -import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.modifyActivityForSettingsInjection import app.revanced.util.copyXmlNode @@ -30,18 +24,18 @@ private val settingsResourcePatch = resourcePatch { dependsOn( resourceMappingPatch, settingsPatch( - listOf( + rootPreferences = listOf( IntentPreference( titleKey = "revanced_settings_title", summaryKey = null, intent = newIntent("revanced_settings_intent"), - ) to "settings_headers", + ) to "settings_headers" ), - preferences + preferences = preferences ) ) - execute { + apply { // Set the style for the ReVanced settings to follow the style of the music settings, // namely: action bar height, menu item padding and remove horizontal dividers. @@ -72,7 +66,7 @@ private val settingsResourcePatch = resourcePatch { } val settingsPatch = bytecodePatch( - description = "Adds settings for ReVanced to YouTube Music.", + description = "Adds settings for ReVanced to YouTube Music." ) { dependsOn( sharedExtensionPatch, @@ -80,7 +74,7 @@ val settingsPatch = bytecodePatch( addResourcesPatch, ) - execute { + apply { addResources("music", "misc.settings.settingsPatch") addResources("shared", "misc.debugging.enableDebuggingPatch") @@ -107,14 +101,14 @@ val settingsPatch = bytecodePatch( ) modifyActivityForSettingsInjection( - googleApiActivityFingerprint.classDef, - googleApiActivityFingerprint.method, + googleApiActivityMethod.classDef, + googleApiActivityMethod, GOOGLE_API_ACTIVITY_HOOK_CLASS_DESCRIPTOR, true ) } - finalize { + afterDependents { PreferenceScreen.close() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt index e4268330de..f019fca848 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt @@ -3,14 +3,10 @@ package app.revanced.patches.music.misc.spoof import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch -import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint +import app.revanced.patches.music.misc.gms.musicActivityOnCreateMethod import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.music.playservice.is_7_16_or_greater -import app.revanced.patches.music.playservice.is_7_33_or_greater -import app.revanced.patches.music.playservice.is_8_11_or_greater -import app.revanced.patches.music.playservice.is_8_15_or_greater -import app.revanced.patches.music.playservice.versionCheckPatch +import app.revanced.patches.music.playservice.* import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -18,7 +14,7 @@ import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch val spoofVideoStreamsPatch = spoofVideoStreamsPatch( extensionClassDescriptor = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;", - mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = { musicActivityOnCreateMethod }, fixMediaFetchHotConfig = { is_7_16_or_greater }, fixMediaFetchHotConfigAlternative = { is_8_11_or_greater && !is_8_15_or_greater }, fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt index 09be85c565..cbdc7ab803 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.music.playservice.is_8_05_or_greater import app.revanced.patches.music.playservice.versionCheckPatch -import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.music.shared.mainActivityOnCreateMethod import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch @Suppress("unused") @@ -25,7 +25,7 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( ) }, fixUseLocalizedAudioTrackFlag = { is_8_05_or_greater }, - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = { mainActivityOnCreateMethod }, subclassExtensionClassDescriptor = "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;", preferenceScreen = PreferenceScreen.MISC, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt index d8f1fd7096..134121b677 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt @@ -21,12 +21,14 @@ var is_8_11_or_greater: Boolean by Delegates.notNull() var is_8_15_or_greater: Boolean by Delegates.notNull() private set +@Suppress("unused") val versionCheckPatch = resourcePatch( - description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app.", + description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app." ) { - execute { + apply { // The app version is missing from the decompiled manifest, // so instead use the Google Play services version and compare against specific releases. + // This requires ResourcePatchContext, which creatingResourcePatch provides. val playStoreServicesVersion = findPlayStoreServicesVersion() // All bug fix releases always seem to use the same play store version as the minor version. diff --git a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt index f6e7da942b..677831ecce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt @@ -1,29 +1,34 @@ package app.revanced.patches.music.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal const val YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/music/activities/MusicActivity;" +internal const val YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE = + "Lcom/google/android/apps/youtube/music/activities/MusicActivity;" -internal val mainActivityOnCreateFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE - } +internal val BytecodePatchContext.mainActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE) + returnType("V") + parameterTypes("Landroid/os/Bundle;") } -internal val conversionContextFingerprintToString = fingerprint { - parameters() - strings( - "ConversionContext{containerInternal=", - ", gridColumnCount=", - ", gridColumnIndex=", - ", templateLoggerFactory=", - ", rootDisposableContainer=", - ", elementId=", - ", identifierProperty=" - ) - custom { method, _ -> - method.name == "toString" - } +internal val BytecodePatchContext.conversionContextToStringMethod by gettingFirstImmutableMethodDeclaratively( + "ConversionContext{containerInternal=", + ", gridColumnCount=", + ", gridColumnIndex=", + ", templateLoggerFactory=", + ", rootDisposableContainer=", + ", elementId=", + ", identifierProperty=", +) { + name("toString") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt index 6bc4c21e5c..4fd4a691a1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt @@ -1,8 +1,9 @@ package app.revanced.patches.myexpenses.misc.pro -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val isEnabledFingerprint = fingerprint { - returns("Z") - strings("feature", "feature.licenceStatus") +internal val BytecodePatchContext.isEnabledMethod by gettingFirstMethodDeclaratively("feature", "feature.licenceStatus") { + returnType("Z") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/UnlockProPatch.kt index e8720d7121..27fed2fb13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/UnlockProPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/UnlockProPatch.kt @@ -1,21 +1,13 @@ package app.revanced.patches.myexpenses.misc.pro -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val unlockProPatch = bytecodePatch( - name = "Unlock pro", -) { +val unlockProPatch = bytecodePatch("Unlock pro") { compatibleWith("org.totschnig.myexpenses"("3.4.9")) - execute { - isEnabledFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + isEnabledMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt index 160e2db274..6fbc1d380a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt @@ -1,19 +1,22 @@ package app.revanced.patches.myfitnesspal.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val isPremiumUseCaseImplFingerprint = fingerprint { +internal val BytecodePatchContext.isPremiumUseCaseImplMethod by gettingFirstMethodDeclaratively { + name("doWork") + definingClass("IsPremiumUseCaseImpl;") accessFlags(AccessFlags.PUBLIC) - custom { method, classDef -> - classDef.endsWith("IsPremiumUseCaseImpl;") && method.name == "doWork" - } } -internal val mainActivityNavigateToNativePremiumUpsellFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityNavigateToNativePremiumUpsellMethod by gettingFirstMethodDeclaratively { + name("navigateToNativePremiumUpsell") + definingClass("MainActivity;") accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - custom { method, classDef -> - classDef.endsWith("MainActivity;") && method.name == "navigateToNativePremiumUpsell" - } + returnType("V") } diff --git a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt index a9428b29ee..8df70dbcd3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/HideAdsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.myfitnesspal.ads -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.extensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,9 +10,9 @@ val hideAdsPatch = bytecodePatch( ) { compatibleWith("com.myfitnesspal.android"("24.14.2")) - execute { + apply { // Overwrite the premium status specifically for ads. - isPremiumUseCaseImplFingerprint.method.replaceInstructions( + isPremiumUseCaseImplMethod.replaceInstructions( 0, """ sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean; @@ -22,7 +22,7 @@ val hideAdsPatch = bytecodePatch( // Prevent the premium upsell dialog from showing when the main activity is launched. // In other places that are premium-only the dialog will still show. - mainActivityNavigateToNativePremiumUpsellFingerprint.method.replaceInstructions( + mainActivityNavigateToNativePremiumUpsellMethod.replaceInstructions( 0, "return-void", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch.kt index b4f675ed74..a7e6912e06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/netguard/broadcasts/removerestriction/RemoveBroadcastsRestrictionPatch.kt @@ -10,7 +10,7 @@ val removeBroadcastsRestrictionPatch = resourcePatch( ) { compatibleWith("eu.faircode.netguard") - execute { + apply { document("AndroidManifest.xml").use { document -> val applicationNode = document diff --git a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt deleted file mode 100644 index a185aca8ff..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.nfctoolsse.misc.pro - -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -@Deprecated("This patch no longer works and will soon be deleted.") -internal val isLicenseRegisteredFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC) - returns("Z") - strings("kLicenseCheck") -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt deleted file mode 100644 index ac3ac09af4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.nfctoolsse.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -@Deprecated("This patch no longer works and will soon be deleted.") -val unlockProPatch = bytecodePatch{ - compatibleWith("com.wakdev.apps.nfctools.se") - - execute { - isLicenseRegisteredFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/extension/SharedExtensionPatch.kt index 5f1f78a63e..13b582a69d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/extension/SharedExtensionPatch.kt @@ -1,13 +1,14 @@ package app.revanced.patches.nothingx.misc.extension -import app.revanced.patches.shared.misc.extension.sharedExtensionPatch +import app.revanced.patcher.definingClass +import app.revanced.patcher.name import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.sharedExtensionPatch val sharedExtensionPatch = sharedExtensionPatch( extensionName = "nothingx", extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.contains("BaseApplication") - } + name("onCreate") + definingClass("BaseApplication") }, -) \ No newline at end of file +) diff --git a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/Fingerprints.kt index 84e5d2c2a8..9ad284839d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/Fingerprints.kt @@ -1,16 +1,19 @@ package app.revanced.patches.nothingx.misc.logk1token -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType /** * Fingerprint for the Application onCreate method. * This is used to trigger scanning for existing log files on app startup. */ -internal val applicationOnCreateFingerprint = fingerprint { - returns("V") - parameters() - custom { method, classDef -> - // Match BaseApplication onCreate specifically - method.name == "onCreate" && classDef.endsWith("BaseApplication;") - } +internal val BytecodePatchContext.applicationOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("BaseApplication;") + returnType("V") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/ShowK1TokenPatchs.kt b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/ShowK1TokenPatchs.kt index 3fd2b9d491..249648b0f1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/ShowK1TokenPatchs.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nothingx/misc/logk1token/ShowK1TokenPatchs.kt @@ -1,6 +1,6 @@ package app.revanced.patches.nothingx.misc.logk1token -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.nothingx.misc.extension.sharedExtensionPatch @@ -11,19 +11,19 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val showK1TokensPatch = bytecodePatch( name = "Show K1 token(s)", description = "Shows the K1 authentication token(s) in a dialog and logs it to logcat " + - "for pairing with GadgetBridge without requiring root access. " + - "After installing this patch, pair your watch with the Nothing X app and " + - "use the token from the dialog or logcat.", + "for pairing with GadgetBridge without requiring root access. " + + "After installing this patch, pair your watch with the Nothing X app and " + + "use the token from the dialog or logcat.", ) { dependsOn(sharedExtensionPatch) compatibleWith("com.nothing.smartcenter"()) - execute { + apply { // Hook Application.onCreate to get K1 tokens from database and log files. // This will find K1 tokens that were already written to log files. // p0 is the Application context in onCreate. - applicationOnCreateFingerprint.method.addInstruction( + applicationOnCreateMethod.addInstruction( 0, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->showK1Tokens(Landroid/content/Context;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt index 109b973e0c..ab57da8c9a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt @@ -1,44 +1,41 @@ package app.revanced.patches.nunl.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal val jwPlayerConfigFingerprint = fingerprint { +import com.android.tools.smali.dexlib2.Opcode val BytecodePatchContext.jwPlayerConfigMethod by gettingFirstMethodDeclaratively { + name("advertisingConfig") + definingClass($$"Lcom/jwplayer/pub/api/configuration/PlayerConfig$Builder;") accessFlags(AccessFlags.PUBLIC) - custom { methodDef, classDef -> - classDef.type == "Lcom/jwplayer/pub/api/configuration/PlayerConfig${'$'}Builder;" && methodDef.name == "advertisingConfig" - } } -internal val screenMapperFingerprint = fingerprint { +internal val BytecodePatchContext.screenMapperMethodMatch by composingFirstMethod { + name("map") + definingClass("Lnl/nu/android/bff/data/mappers/ScreenMapper;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Lnl/nu/android/bff/domain/models/screen/ScreenEntity;") - parameters("Lnl/nu/performance/api/client/objects/Screen;") - + returnType("Lnl/nu/android/bff/domain/models/screen/ScreenEntity;") + parameterTypes("Lnl/nu/performance/api/client/objects/Screen;") opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.IF_EQZ, - Opcode.CHECK_CAST + Opcode.CHECK_CAST, ) - - custom { methodDef, classDef -> - classDef.type == "Lnl/nu/android/bff/data/mappers/ScreenMapper;" && methodDef.name == "map" - } } -internal val nextPageRepositoryImplFingerprint = fingerprint { +internal val BytecodePatchContext.nextPageRepositoryImplMethodMatch by composingFirstMethod { + definingClass("Lnl/nu/android/bff/data/repositories/NextPageRepositoryImpl;") + name("mapToPage") accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("Lnl/nu/android/bff/domain/models/Page;") - parameters("Lnl/nu/performance/api/client/PacResponse;", "Ljava/lang/String;") - + returnType("Lnl/nu/android/bff/domain/models/Page;") + parameterTypes("Lnl/nu/performance/api/client/PacResponse;", "Ljava/lang/String;") opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.IF_EQZ, - Opcode.CHECK_CAST + Opcode.CHECK_CAST, ) - - custom { methodDef, classDef -> - classDef.type == "Lnl/nu/android/bff/data/repositories/NextPageRepositoryImpl;" && methodDef.name == "mapToPage" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt index 14d05cfbc2..b2eea685c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/HideAdsPatch.kt @@ -1,15 +1,15 @@ package app.revanced.patches.nunl.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Suppress("unused") +@Suppress("ObjectPropertyName") val hideAdsPatch = bytecodePatch( name = "Hide ads", description = "Hide ads and sponsored articles in list pages and remove pre-roll ads on videos.", @@ -18,29 +18,27 @@ val hideAdsPatch = bytecodePatch( dependsOn(sharedExtensionPatch("nunl", mainActivityOnCreateHook)) - execute { + apply { // Disable video pre-roll ads. // Whenever the app tries to define the advertising config for JWPlayer, don't set the advertising config and directly return. - val iputInstructionIndex = jwPlayerConfigFingerprint.method.indexOfFirstInstructionOrThrow(Opcode.IPUT_OBJECT) - jwPlayerConfigFingerprint.method.removeInstructions(iputInstructionIndex, 1) + val iputInstructionIndex = jwPlayerConfigMethod.indexOfFirstInstructionOrThrow(Opcode.IPUT_OBJECT) + jwPlayerConfigMethod.removeInstructions(iputInstructionIndex, 1) // Filter injected content from API calls out of lists. - arrayOf(screenMapperFingerprint, nextPageRepositoryImplFingerprint).forEach { + arrayOf(screenMapperMethodMatch, nextPageRepositoryImplMethodMatch).forEach { match -> // Index of instruction moving result of BlockPage;->getBlocks(...). - val moveGetBlocksResultObjectIndex = it.patternMatch!!.startIndex - it.method.apply { - val moveInstruction = getInstruction(moveGetBlocksResultObjectIndex) + val moveGetBlocksResultObjectIndex = match[0] + val moveInstruction = match.method.getInstruction(moveGetBlocksResultObjectIndex) - val listRegister = moveInstruction.registerA + val listRegister = moveInstruction.registerA - // Add instruction after moving List to register and then filter this List in place. - addInstructions( - moveGetBlocksResultObjectIndex + 1, - """ + // Add instruction after moving List to register and then filter this List in place. + match.method.addInstructions( + moveGetBlocksResultObjectIndex + 1, + """ invoke-static { v$listRegister }, Lapp/revanced/extension/nunl/ads/HideAdsPatch;->filterAds(Ljava/util/List;)V """, - ) - } + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt index e83d373220..626b251095 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.nunl.ads -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val mainActivityOnCreateHook = extensionHook { - custom { method, classDef -> - classDef.endsWith("/NUApplication;") && method.name == "onCreate" - } -} +internal val mainActivityOnCreateHook = activityOnCreateExtensionHook( + "/NUApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/Fingerprints.kt index 490819a4b3..ff01d0d8e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/Fingerprints.kt @@ -1,20 +1,20 @@ package app.revanced.patches.nunl.firebase -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val getFingerprintHashForPackageFingerprints = arrayOf( +internal fun BytecodePatchContext.getFingerprintHashForPackageMethods() = arrayOf( "Lcom/google/firebase/installations/remote/FirebaseInstallationServiceClient;", "Lcom/google/firebase/remoteconfig/internal/ConfigFetchHttpClient;", "Lcom/google/firebase/remoteconfig/internal/ConfigRealtimeHttpClient;" -).map { className -> - fingerprint { +).map { + firstMethodDeclaratively { + name("getFingerprintHashForPackage") + definingClass(it) accessFlags(AccessFlags.PRIVATE) - parameters() - returns("Ljava/lang/String;") - - custom { methodDef, classDef -> - classDef.type == className && methodDef.name == "getFingerprintHashForPackage" - } + returnType("Ljava/lang/String;") + parameterTypes() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt index 65944c4c1f..f53524bab0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt @@ -10,9 +10,9 @@ val spoofCertificatePatch = bytecodePatch( ) { compatibleWith("nl.sanomamedia.android.nu") - execute { - getFingerprintHashForPackageFingerprints.forEach { fingerprint -> - fingerprint.method.returnEarly("eae41fc018df2731a9b6ae1ac327da44a288667b") + apply { + getFingerprintHashForPackageMethods().forEach { + it.returnEarly("eae41fc018df2731a9b6ae1ac327da44a288667b") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt deleted file mode 100644 index e2bffa451a..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("BillingManager;") && method.name == "isProVersion" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt deleted file mode 100644 index 179e745e08..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch { - compatibleWith("com.awedea.nyx") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt index 69463c510d..09881cc986 100644 --- a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt @@ -1,12 +1,15 @@ package app.revanced.patches.openinghours.misc.fix.crash -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.definingClass +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val setPlaceFingerprint = fingerprint { - returns("V") - parameters("Lde/simon/openinghours/models/Place;") - custom { method, _ -> - method.name == "setPlace" && - method.definingClass == "Lde/simon/openinghours/views/custom/PlaceCard;" - } +internal val BytecodePatchContext.setPlaceMethod by gettingFirstMethodDeclaratively { + name("setPlace") + definingClass("Lde/simon/openinghours/views/custom/PlaceCard;") + returnType("V") + parameterTypes("Lde/simon/openinghours/models/Place;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch.kt b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch.kt index db38e6161e..d2242b172c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.openinghours.misc.fix.crash -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.extensions.newLabel +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.getReference import com.android.tools.smali.dexlib2.Opcode @@ -14,11 +14,12 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val fixCrashPatch = bytecodePatch( name = "Fix crash", + description = "Fixes a crash when opening a place.", ) { compatibleWith("de.simon.openinghours"("1.0")) - execute { - val indexedInstructions = setPlaceFingerprint.method.instructions.withIndex().toList() + apply { + val indexedInstructions = setPlaceMethod.instructions.withIndex().toList() /** * This function replaces all `checkNotNull` instructions in the integer interval @@ -27,7 +28,7 @@ val fixCrashPatch = bytecodePatch( * the value is indeed null, we jump to a newly created label at `endIndex + 1`. */ fun avoidNullPointerException(startIndex: Int, endIndex: Int) { - val continueLabel = setPlaceFingerprint.method.newLabel(endIndex + 1) + val continueLabel = setPlaceMethod.newLabel(endIndex + 1) for (index in startIndex..endIndex) { val instruction = indexedInstructions[index].value @@ -39,7 +40,7 @@ val fixCrashPatch = bytecodePatch( val checkNotNullInstruction = instruction as FiveRegisterInstruction val originalRegister = checkNotNullInstruction.registerC - setPlaceFingerprint.method.replaceInstruction( + setPlaceMethod.replaceInstruction( index, BuilderInstruction21t( Opcode.IF_EQZ, diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt index 525d4f37d2..61e98df83b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.orfon.detection.root -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val isDeviceRootedFingeprint = fingerprint { +internal val BytecodePatchContext.isDeviceRootedMethod by gettingFirstMethodDeclaratively { + name("isDeviceRooted") + definingClass("/RootChecker;") accessFlags(AccessFlags.PUBLIC) - returns("Z") - custom { method, classDef -> - method.name == "isDeviceRooted" && - classDef.endsWith("/RootChecker;") - } + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt index 8669f6132b..2621021057 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt @@ -1,18 +1,16 @@ package app.revanced.patches.orfon.detection.root import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION -import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION import app.revanced.util.returnEarly @Suppress("unused") val removeRootDetectionPatch = bytecodePatch( - name = PATCH_NAME_REMOVE_ROOT_DETECTION, - description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION + name = "Remove root detection", + description = "Removes the check for root permissions and unlocked bootloader.", ) { compatibleWith("com.nousguide.android.orftvthek") - execute { - isDeviceRootedFingeprint.method.returnEarly(false) + apply { + isDeviceRootedMethod.returnEarly(false) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt index 6cc89a0b46..79dd9358a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/DisableAudioAdsPatch.kt @@ -4,13 +4,11 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val disableAudioAdsPatch = bytecodePatch( - name = "Disable audio ads", -) { +val disableAudioAdsPatch = bytecodePatch("Disable Audio Ads") { compatibleWith("com.pandora.android") - execute { - getIsAdSupportedFingerprint.method.returnEarly(false) - requestAudioAdFingerprint.method.returnEarly() + apply { + getIsAdSupportedMethod.returnEarly(false) + requestAudioAdMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt index e3f432e16d..cbedd3bdb0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.pandora.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getIsAdSupportedFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getIsAdSupported" && classDef.endsWith("UserData;") - } +internal val BytecodePatchContext.getIsAdSupportedMethod by gettingFirstMethodDeclaratively { + name("getIsAdSupported") + definingClass("UserData;") } -internal val requestAudioAdFingerprint = fingerprint { - custom { method, classDef -> - method.name == "requestAudioAdFromAdSDK" && classDef.endsWith("ContentServiceOpsImpl;") - } -} \ No newline at end of file +internal val BytecodePatchContext.requestAudioAdMethod by gettingFirstMethodDeclaratively { + name("requestAudioAdFromAdSDK") + definingClass("ContentServiceOpsImpl;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt index 2ce53fdfee..c63bae4d2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/EnableUnlimitedSkipsPatch.kt @@ -4,12 +4,10 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val enableUnlimitedSkipsPatch = bytecodePatch( - name = "Enable unlimited skips", -) { +val enableUnlimitedSkipsPatch = bytecodePatch("Enable unlimited skips") { compatibleWith("com.pandora.android") - execute { - skipLimitBehaviorFingerprint.method.returnEarly("unlimited") + apply { + getSkipLimitBehaviorMethod.returnEarly("unlimited") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt index 2a14e0ed1b..21facc0211 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.pandora.misc -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val skipLimitBehaviorFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getSkipLimitBehavior" && classDef.endsWith("UserData;") - } -} \ No newline at end of file +internal val BytecodePatchContext.getSkipLimitBehaviorMethod by gettingFirstMethodDeclaratively { + name("getSkipLimitBehavior") + definingClass("UserData;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/Fingerprints.kt index 35c1956649..3706f882e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.peacocktv.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val mediaTailerAdServiceFingerprint = fingerprint { +internal val BytecodePatchContext.mediaTailerAdServiceMethod by gettingFirstMethodDeclaratively("Could not build MT Advertising service") { accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/Object") - strings("Could not build MT Advertising service") + returnType("Ljava/lang/Object;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/HideAdsPatch.kt index 52e07e2389..553add2b72 100644 --- a/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/peacocktv/ads/HideAdsPatch.kt @@ -10,7 +10,7 @@ val hideAdsPatch = bytecodePatch( ) { compatibleWith("com.peacocktv.peacockandroid") - execute { - mediaTailerAdServiceFingerprint.method.returnEarly(false) + apply { + mediaTailerAdServiceMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt index 90c0bbb919..172398045c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.photomath.detection.deviceid +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint -internal val getDeviceIdFingerprint = fingerprint { - returns("Ljava/lang/String;") - parameters() +internal val BytecodePatchContext.getDeviceIdMethod by gettingFirstMethodDeclaratively { + returnType("Ljava/lang/String;") + parameterTypes() opcodes( Opcode.SGET_OBJECT, Opcode.IGET_OBJECT, @@ -18,4 +24,4 @@ internal val getDeviceIdFingerprint = fingerprint { Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_VIRTUAL, ) -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch.kt index b502eb40b3..d1a4ca5cb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch.kt @@ -6,7 +6,7 @@ import app.revanced.util.returnEarly import kotlin.random.Random @Suppress("unused") -val getDeviceIdPatch = bytecodePatch( +val spoofDeviceIDPatch = bytecodePatch( name = "Spoof device ID", description = "Spoofs device ID to mitigate manual bans by developers.", ) { @@ -14,7 +14,7 @@ val getDeviceIdPatch = bytecodePatch( compatibleWith("com.microblink.photomath") - execute { - getDeviceIdFingerprint.method.returnEarly(Random.nextLong().toString(16)) + apply { + getDeviceIdMethod.returnEarly(Random.nextLong().toString(16)) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt index c6563270e1..69fb11ef55 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt @@ -1,9 +1,13 @@ package app.revanced.patches.photomath.detection.signature +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint -internal val checkSignatureFingerprint = fingerprint { +internal val BytecodePatchContext.checkSignatureMethodMatch by composingFirstMethod("SHA") { opcodes( Opcode.CONST_STRING, Opcode.INVOKE_STATIC, @@ -14,5 +18,4 @@ internal val checkSignatureFingerprint = fingerprint { Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, ) - strings("SHA") } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt index 00b47e5161..a4d81d204e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt @@ -1,18 +1,18 @@ package app.revanced.patches.photomath.detection.signature -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction val signatureDetectionPatch = bytecodePatch( description = "Disables detection of incorrect signature.", ) { + apply { + val replacementIndex = checkSignatureMethodMatch[-1] - execute { - val replacementIndex = checkSignatureFingerprint.patternMatch!!.endIndex - val checkRegister = - checkSignatureFingerprint.method.getInstruction(replacementIndex).registerA - checkSignatureFingerprint.method.replaceInstruction(replacementIndex, "const/4 v$checkRegister, 0x1") + val checkRegister = checkSignatureMethodMatch.method.getInstruction(replacementIndex) + .registerA + checkSignatureMethodMatch.method.replaceInstruction(replacementIndex, "const/4 v$checkRegister, 0x1") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt index 301f2f9a52..0459aa62dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt @@ -1,12 +1,15 @@ package app.revanced.patches.photomath.misc.annoyances -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideUpdatePopupFingerprint = fingerprint { +internal val BytecodePatchContext.hideUpdatePopupMethod by gettingFirstMethodDeclaratively { + definingClass("Lcom/microblink/photomath/main/activity/MainActivity;") accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) - returns("V") + returnType("V") opcodes( Opcode.CONST_HIGH16, Opcode.INVOKE_VIRTUAL, // ViewPropertyAnimator.alpha(1.0f) @@ -14,8 +17,4 @@ internal val hideUpdatePopupFingerprint = fingerprint { Opcode.CONST_WIDE_16, Opcode.INVOKE_VIRTUAL, // ViewPropertyAnimator.setDuration(1000L) ) - custom { method, _ -> - // The popup is shown only in the main activity - method.definingClass == "Lcom/microblink/photomath/main/activity/MainActivity;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt index e8e09b4174..b7713695d3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/HideUpdatePopupPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.photomath.misc.annoyances -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.photomath.detection.signature.signatureDetectionPatch @@ -13,8 +13,8 @@ val hideUpdatePopupPatch = bytecodePatch( compatibleWith("com.microblink.photomath") - execute { - hideUpdatePopupFingerprint.method.addInstructions( + apply { + hideUpdatePopupMethod.addInstructions( 2, // Insert after the null check. "return-void", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt index 6e3da98026..77475d2990 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt @@ -1,19 +1,13 @@ package app.revanced.patches.photomath.misc.unlock.bookpoint -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly val enableBookpointPatch = bytecodePatch( description = "Enables textbook access", ) { - execute { - isBookpointEnabledFingerprint.method.replaceInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + isBookpointEnabledMethod.returnEarly(true) // TODO: CHECK IF THIS IS FINE IN REPLACEMENT OF replaceInstructions } } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt index 6722f4223e..f5e77bf84e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt @@ -1,16 +1,19 @@ package app.revanced.patches.photomath.misc.unlock.bookpoint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val isBookpointEnabledFingerprint = fingerprint { +internal val BytecodePatchContext.isBookpointEnabledMethod by gettingFirstMethodDeclaratively( + "NoGeoData", + "NoCountryInGeo", + "RemoteConfig", + "GeoRCMismatch" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - strings( - "NoGeoData", - "NoCountryInGeo", - "RemoteConfig", - "GeoRCMismatch" - ) -} \ No newline at end of file + returnType("Z") + parameterTypes() +} diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt index f6c282cbd4..c011cdb947 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.photomath.misc.unlock.plus +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val isPlusUnlockedFingerprint = fingerprint{ +internal val BytecodePatchContext.isPlusUnlockedMethod by gettingFirstMethodDeclaratively("genius") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - strings("genius") - custom { _, classDef -> - classDef.endsWith("/User;") - } -} \ No newline at end of file + returnType("Z") + definingClass("/User;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt index 1339a44775..eaffe6c19d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPatch.kt @@ -1,25 +1,17 @@ package app.revanced.patches.photomath.misc.unlock.plus -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.photomath.detection.signature.signatureDetectionPatch import app.revanced.patches.photomath.misc.unlock.bookpoint.enableBookpointPatch +import app.revanced.util.returnEarly @Suppress("unused") -val unlockPlusPatch = bytecodePatch( - name = "Unlock plus", -) { +val unlockPlusPatch = bytecodePatch("Unlock plus") { dependsOn(signatureDetectionPatch, enableBookpointPatch) compatibleWith("com.microblink.photomath") - execute { - isPlusUnlockedFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + isPlusUnlockedMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt index 8c2d579ef5..4a2a0fe2de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.piccomafr.misc +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val getAndroidIdFingerprint = fingerprint { +internal val BytecodePatchContext.getAndroidIdMethod by gettingFirstMethodDeclaratively( + "context", + "android_id" +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("Landroid/content/Context;") - strings("context", "android_id") -} \ No newline at end of file + returnType("Ljava/lang/String;") + parameterTypes("Landroid/content/Context;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt index 458d715aa7..98e303deea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatch.kt @@ -1,12 +1,11 @@ package app.revanced.patches.piccomafr.misc -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringOption import app.revanced.util.returnEarly @Suppress("unused") -val spoofAndroidDeviceIdPatch = bytecodePatch( +val spoofAndroidDeviceIDPatch = bytecodePatch( name = "Spoof Android device ID", description = "Spoofs the Android device ID used by the app for account authentication." + "This can be used to copy the account to another device.", @@ -32,14 +31,13 @@ val spoofAndroidDeviceIdPatch = bytecodePatch( ) val androidDeviceId by stringOption( - key = "android-device-id", + name = "Android device ID", default = "0011223344556677", - title = "Android device ID", description = "The Android device ID to spoof to.", required = true, ) { it!!.matches("[A-Fa-f0-9]{16}".toRegex()) } - execute { - getAndroidIdFingerprint.method.returnEarly(androidDeviceId!!) + apply { + getAndroidIdMethod.returnEarly(androidDeviceId!!) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt index 32e02f37aa..d37280e454 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.piccomafr.tracking -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.getReference import com.android.tools.smali.dexlib2.Opcode @@ -33,35 +33,31 @@ val disableTrackingPatch = bytecodePatch( ), ) - execute { - facebookSDKFingerprint.method.apply { - instructions.filter { instruction -> - instruction.opcode == Opcode.CONST_STRING - }.forEach { instruction -> - instruction as OneRegisterInstruction + apply { + facebookSDKMethod.instructions.filter { instruction -> + instruction.opcode == Opcode.CONST_STRING + }.forEach { instruction -> + instruction as OneRegisterInstruction - replaceInstruction( - instruction.location.index, - "const-string v${instruction.registerA}, \"example.com\"", - ) - } + facebookSDKMethod.replaceInstruction( + instruction.location.index, + "const-string v${instruction.registerA}, \"example.com\"", + ) } - firebaseInstallFingerprint.method.apply { - instructions.filter { - it.opcode == Opcode.CONST_STRING - }.filter { - it.getReference()?.string == "firebaseinstallations.googleapis.com" - }.forEach { instruction -> - instruction as OneRegisterInstruction + firebaseInstallMethod.instructions.filter { + it.opcode == Opcode.CONST_STRING + }.filter { + it.getReference()?.string == "firebaseinstallations.googleapis.com" + }.forEach { instruction -> + instruction as OneRegisterInstruction - replaceInstruction( - instruction.location.index, - "const-string v${instruction.registerA}, \"example.com\"", - ) - } + firebaseInstallMethod.replaceInstruction( + instruction.location.index, + "const-string v${instruction.registerA}, \"example.com\"", + ) } - appMeasurementFingerprint.method.addInstruction(0, "return-void") + appMeasurementMethod.addInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt index 794f21bcb6..084c3b2b06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt @@ -1,24 +1,20 @@ package app.revanced.patches.piccomafr.tracking -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val appMeasurementFingerprint = fingerprint { +internal val BytecodePatchContext.appMeasurementMethod by gettingFirstMethodDeclaratively("config/app/", "Fetching remote configuration") { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - strings("config/app/", "Fetching remote configuration") + returnType("V") } -internal val facebookSDKFingerprint = fingerprint { +internal val BytecodePatchContext.facebookSDKMethod by gettingFirstMethodDeclaratively("instagram.com", "facebook.com") { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - returns("V") - strings("instagram.com", "facebook.com") } -internal val firebaseInstallFingerprint = fingerprint { +internal val BytecodePatchContext.firebaseInstallMethod by gettingFirstMethodDeclaratively("https://%s/%s/%s", "firebaseinstallations.googleapis.com") { accessFlags(AccessFlags.PRIVATE) - strings( - "https://%s/%s/%s", - "firebaseinstallations.googleapis.com", - ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt index 3e2addaa06..d7b0566e3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt @@ -1,12 +1,16 @@ package app.revanced.patches.pixiv.ads +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val shouldShowAdsFingerprint = fingerprint { +internal val BytecodePatchContext.shouldShowAdsMethod by gettingFirstMethodDeclaratively { + definingClass("AdUtils;") + name("shouldShowAds") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - custom { methodDef, classDef -> - classDef.type.endsWith("AdUtils;") && methodDef.name == "shouldShowAds" - } + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/HideAdsPatch.kt index 4454895b11..269ea8bd97 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/HideAdsPatch.kt @@ -4,12 +4,10 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("jp.pxv.android"("6.141.1")) - execute { - shouldShowAdsFingerprint.method.returnEarly(false) + apply { + shouldShowAdsMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt index ac3a1c43a5..e929cb1a42 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt @@ -1,33 +1,33 @@ package app.revanced.patches.primevideo.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val enterServerInsertedAdBreakStateFingerprint = fingerprint { +internal val BytecodePatchContext.enterServerInsertedAdBreakStateMethod by gettingFirstMethodDeclaratively { + name("enter") + definingClass("Lcom/amazon/avod/media/ads/internal/state/ServerInsertedAdBreakState;") accessFlags(AccessFlags.PUBLIC) - parameters("Lcom/amazon/avod/fsm/Trigger;") - returns("V") + parameterTypes("Lcom/amazon/avod/fsm/Trigger;") + returnType("V") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, Opcode.CONST_4, - Opcode.CONST_4 + Opcode.CONST_4, ) - custom { method, classDef -> - method.name == "enter" && classDef.type == "Lcom/amazon/avod/media/ads/internal/state/ServerInsertedAdBreakState;" - } } -internal val doTriggerFingerprint = fingerprint { +internal val BytecodePatchContext.doTriggerMethod by gettingFirstMethodDeclaratively { + name("doTrigger") + definingClass("Lcom/amazon/avod/fsm/StateBase;") accessFlags(AccessFlags.PROTECTED) - returns("V") + returnType("V") opcodes( Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ) - custom { method, classDef -> - method.name == "doTrigger" && classDef.type == "Lcom/amazon/avod/fsm/StateBase;" - } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/SkipAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/SkipAdsPatch.kt index c204c729e2..a78fcf1269 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/SkipAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/SkipAdsPatch.kt @@ -1,11 +1,15 @@ package app.revanced.patches.primevideo.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.primevideo.misc.extension.sharedExtensionPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") val skipAdsPatch = bytecodePatch( @@ -18,15 +22,19 @@ val skipAdsPatch = bytecodePatch( // Skip all the logic in ServerInsertedAdBreakState.enter(), which plays all the ad clips in this // ad break. Instead, force the video player to seek over the entire break and reset the state machine. - execute { + apply { // Force doTrigger() access to public so we can call it from our extension. - doTriggerFingerprint.method.accessFlags = AccessFlags.PUBLIC.value; + doTriggerMethod.accessFlags = AccessFlags.PUBLIC.value - val getPlayerIndex = enterServerInsertedAdBreakStateFingerprint.patternMatch!!.startIndex - enterServerInsertedAdBreakStateFingerprint.method.apply { + enterServerInsertedAdBreakStateMethod.apply { // Get register that stores VideoPlayer: // invoke-virtual ->getPrimaryPlayer() // move-result-object { playerRegister } + val getPlayerIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "getPrimaryPlayer" + } + val playerRegister = getInstruction(getPlayerIndex + 1).registerA // Reuse the params from the original method: @@ -37,9 +45,8 @@ val skipAdsPatch = bytecodePatch( """ invoke-static { p0, p1, v$playerRegister }, Lapp/revanced/extension/primevideo/ads/SkipAdsPatch;->enterServerInsertedAdBreakState(Lcom/amazon/avod/media/ads/internal/state/ServerInsertedAdBreakState;Lcom/amazon/avod/media/ads/internal/state/AdBreakTrigger;Lcom/amazon/avod/media/playback/VideoPlayer;)V return-void - """ + """, ) } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt index 763c2bfd50..ef22c64120 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.primevideo.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/SplashScreenActivity;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook( + "/SplashScreenActivity;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/permissions/RenamePermissionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/permissions/RenamePermissionsPatch.kt index 9a671879f6..20f9e5217e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/permissions/RenamePermissionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/permissions/RenamePermissionsPatch.kt @@ -7,11 +7,11 @@ import app.revanced.util.getNode import org.w3c.dom.Element @Suppress("unused") -val renamePermissionsPatch = resourcePatch( +val renameSharedPermissionsPatch = resourcePatch( name = "Rename shared permissions", description = "Rename certain permissions shared across Amazon apps. " + - "Applying this patch can fix installation errors, but can also break features in certain apps.", - use = false + "Applying this patch can fix installation errors, but can also break features in certain apps.", + use = false, ) { compatibleWith("com.amazon.avod.thirdpartyclient") @@ -21,10 +21,10 @@ val renamePermissionsPatch = resourcePatch( "com.amazon.dcp.sso.permission.account.changed", "com.amazon.dcp.sso.permission.AmazonAccountPropertyService.property.changed", "com.amazon.identity.permission.CALL_AMAZON_DEVICE_INFORMATION_PROVIDER", - "com.amazon.appmanager.preload.permission.READ_PRELOAD_DEVICE_INFO_PROVIDER" + "com.amazon.appmanager.preload.permission.READ_PRELOAD_DEVICE_INFO_PROVIDER", ) - execute { + apply { document("AndroidManifest.xml").use { document -> val manifest = document.getNode("manifest") as Element diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt index bd4431d567..7001aa38d0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt @@ -1,23 +1,22 @@ package app.revanced.patches.primevideo.video.speed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val playbackUserControlsInitializeFingerprint = fingerprint { +internal val BytecodePatchContext.playbackUserControlsInitializeMethod by gettingFirstMethodDeclaratively { + name("initialize") + definingClass("Lcom/amazon/avod/playbackclient/activity/feature/PlaybackUserControlsFeature;") accessFlags(AccessFlags.PUBLIC) - parameters("Lcom/amazon/avod/playbackclient/PlaybackInitializationContext;") - returns("V") - custom { method, classDef -> - method.name == "initialize" && classDef.type == "Lcom/amazon/avod/playbackclient/activity/feature/PlaybackUserControlsFeature;" - } + parameterTypes("Lcom/amazon/avod/playbackclient/PlaybackInitializationContext;") + returnType("V") } -internal val playbackUserControlsPrepareForPlaybackFingerprint = fingerprint { +internal val BytecodePatchContext.playbackUserControlsPrepareForPlaybackMethod by gettingFirstMethodDeclaratively { + name("prepareForPlayback") + definingClass("Lcom/amazon/avod/playbackclient/activity/feature/PlaybackUserControlsFeature;") accessFlags(AccessFlags.PUBLIC) - parameters("Lcom/amazon/avod/playbackclient/PlaybackContext;") - returns("V") - custom { method, classDef -> - method.name == "prepareForPlayback" && - classDef.type == "Lcom/amazon/avod/playbackclient/activity/feature/PlaybackUserControlsFeature;" - } + parameterTypes("Lcom/amazon/avod/playbackclient/PlaybackContext;") + returnType("V") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/PlaybackSpeedPatch.kt index ef318d60cf..cce68b6c13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/PlaybackSpeedPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.primevideo.video.speed -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.primevideo.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -10,9 +10,10 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -private const val EXTENSION_CLASS_DESCRIPTOR = +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/primevideo/videoplayer/PlaybackSpeedPatch;" +@Suppress("unused") val playbackSpeedPatch = bytecodePatch( name = "Playback speed", description = "Adds playback speed controls to the video player.", @@ -22,35 +23,35 @@ val playbackSpeedPatch = bytecodePatch( ) compatibleWith( - "com.amazon.avod.thirdpartyclient"("3.0.412.2947") + "com.amazon.avod.thirdpartyclient"("3.0.412.2947"), ) - execute { - playbackUserControlsInitializeFingerprint.method.apply { + apply { + playbackUserControlsInitializeMethod.apply { val getIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.IPUT_OBJECT && - getReference()?.name == "mUserControls" + opcode == Opcode.IPUT_OBJECT && + getReference()?.name == "mUserControls" } - + val getRegister = getInstruction(getIndex).registerA - + addInstructions( getIndex + 1, """ invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->initializeSpeedOverlay(Landroid/view/View;)V - """ + """, ) } - playbackUserControlsPrepareForPlaybackFingerprint.method.apply { + playbackUserControlsPrepareForPlaybackMethod.apply { addInstructions( 0, """ invoke-virtual { p1 }, Lcom/amazon/avod/playbackclient/PlaybackContext;->getPlayer()Lcom/amazon/video/sdk/player/Player; move-result-object v0 invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setPlayer(Lcom/amazon/video/sdk/player/Player;)V - """ + """, ) } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt index cd81f1bb41..bc99597b91 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt @@ -10,7 +10,7 @@ val removeFreeAccountsLimitPatch = resourcePatch( ) { compatibleWith("ch.protonmail.android"("4.15.0")) - execute { + apply { document("res/values/integers.xml").use { document -> document.documentElement.childNodes.findElementByAttributeValueOrThrow( "name", diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt index 44098a2df5..9f0a0fd971 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt @@ -12,7 +12,7 @@ val removeSentFromSignaturePatch = resourcePatch( ) { compatibleWith("ch.protonmail.android"("4.15.0")) - execute { + apply { val stringResourceFiles = mutableListOf() get("res").walk().forEach { file -> @@ -26,7 +26,7 @@ val removeSentFromSignaturePatch = resourcePatch( document(filePath.absolutePath).use { document -> var node = document.documentElement.childNodes.findElementByAttributeValue( "name", - "mail_settings_identity_mobile_footer_default_free" + "mail_settings_identity_mobile_footer_default_free", ) // String is not localized in all languages. diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt index bc8ad39250..0791f3a88f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt @@ -1,16 +1,13 @@ package app.revanced.patches.protonvpn.delay -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext - -internal val longDelayFingerprint = fingerprint { - custom { method, _ -> - method.name == "getChangeServerLongDelayInSeconds" - } +internal val BytecodePatchContext.longDelayMethod by gettingFirstMethodDeclaratively { + name("getChangeServerLongDelayInSeconds") } -internal val shortDelayFingerprint = fingerprint { - custom { method, _ -> - method.name == "getChangeServerShortDelayInSeconds" - } -} \ No newline at end of file +internal val BytecodePatchContext.shortDelayMethod by gettingFirstMethodDeclaratively { + name("getChangeServerShortDelayInSeconds") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/RemoveDelayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/RemoveDelayPatch.kt index 512813e596..9783168dbc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/RemoveDelayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/RemoveDelayPatch.kt @@ -10,8 +10,8 @@ val removeDelayPatch = bytecodePatch( ) { compatibleWith("ch.protonvpn.android") - execute { - longDelayFingerprint.method.returnEarly(0) - shortDelayFingerprint.method.returnEarly(0) + apply { + longDelayMethod.returnEarly(0) + shortDelayMethod.returnEarly(0) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt index 639141723d..09cbb977bc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/Fingerprints.kt @@ -1,20 +1,17 @@ package app.revanced.patches.protonvpn.splittunneling -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val enableSplitTunnelingUiFingerprint = fingerprint { - strings("currentModeAppNames") +internal val BytecodePatchContext.enableSplitTunnelingUiMethodMatch by composingFirstMethod("currentModeAppNames") { opcodes( Opcode.MOVE_OBJECT, Opcode.MOVE_FROM16, - Opcode.INVOKE_DIRECT_RANGE + Opcode.INVOKE_DIRECT_RANGE, ) } -internal val initializeSplitTunnelingSettingsUIFingerprint = fingerprint { - custom { method, _ -> - method.name == "applyRestrictions" - } -} \ No newline at end of file +internal val BytecodePatchContext.initializeSplitTunnelingSettingsUIMethod by gettingFirstMethodDeclaratively { + name("applyRestrictions") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt index f50a5f9934..79bc78ec1a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt @@ -1,8 +1,8 @@ package app.revanced.patches.protonvpn.splittunneling -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -10,25 +10,21 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") -val unlockSplitTunnelingPatch = - bytecodePatch( - name = "Unlock split tunneling", - ) { - compatibleWith("ch.protonvpn.android") +val unlockSplitTunnelingPatch = bytecodePatch("Unlock split tunneling") { + compatibleWith("ch.protonvpn.android") - execute { - val registerIndex = enableSplitTunnelingUiFingerprint.patternMatch!!.endIndex - 1 + apply { + enableSplitTunnelingUiMethodMatch.let { + val registerIndex = it[-1] - 1 + val register = it.method.getInstruction(registerIndex).registerA + it.method.replaceInstruction(registerIndex, "const/4 v$register, 0x0") + } - enableSplitTunnelingUiFingerprint.method.apply { - val register = getInstruction(registerIndex).registerA - replaceInstruction(registerIndex, "const/4 v$register, 0x0") - } - - initializeSplitTunnelingSettingsUIFingerprint.method.apply { - val initSettingsIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "getSplitTunneling" - } - removeInstruction(initSettingsIndex - 1) + initializeSplitTunnelingSettingsUIMethod.apply { + val initSettingsIndex = indexOfFirstInstructionOrThrow { + getReference()?.name == "getSplitTunneling" } + removeInstruction(initSettingsIndex - 1) } } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt index a4d2c9e221..0d1c0e1d8a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt @@ -1,12 +1,16 @@ package app.revanced.patches.rar.misc.annoyances.purchasereminder -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val showReminderFingerprint = fingerprint { +internal val BytecodePatchContext.showReminderMethod by gettingFirstMethodDeclaratively { + definingClass("AdsNotify;") + name("show") accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("V") - custom { method, _ -> - method.definingClass.endsWith("AdsNotify;") && method.name == "show" - } + returnType("V") } diff --git a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatch.kt index 885c2400f4..d755c697d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatch.kt @@ -1,17 +1,16 @@ package app.revanced.patches.rar.misc.annoyances.purchasereminder -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") val hidePurchaseReminderPatch = bytecodePatch( name = "Hide purchase reminder", description = "Hides the popup that reminds you to purchase the app.", - ) { compatibleWith("com.rarlab.rar") - execute { - showReminderFingerprint.method.addInstruction(0, "return-void") + apply { + showReminderMethod.addInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt deleted file mode 100644 index 62e8d5d84d..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt +++ /dev/null @@ -1,34 +0,0 @@ -package app.revanced.patches.reddit.ad.banner - -import app.revanced.patcher.patch.resourcePatch - -// Note that for now, this patch and anything using it will only work on -// Reddit 2024.17.0 or older. Newer versions will crash during patching. -// See https://github.com/ReVanced/revanced-patches/issues/3099 -val hideBannerPatch = resourcePatch( - description = "Hides banner ads from comments on subreddits.", -) { - execute { - val resourceFilePath = "res/layout/merge_listheader_link_detail.xml" - - document(resourceFilePath).use { document -> - document.getElementsByTagName("merge").item(0).childNodes.apply { - val attributes = arrayOf("height", "width") - - for (i in 1 until length) { - val view = item(i) - if ( - view.hasAttributes() && - view.attributes.getNamedItem("android:id").nodeValue.endsWith("ad_view_stub") - ) { - attributes.forEach { attribute -> - view.attributes.getNamedItem("android:layout_$attribute").nodeValue = "0.0dip" - } - - break - } - } - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt index 4fa8dbc81a..c43dbf594b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt @@ -1,10 +1,11 @@ package app.revanced.patches.reddit.ad.comments -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val hideCommentAdsFingerprint = fingerprint { - custom { method, classDef -> - method.name == "invokeSuspend" && - classDef.contains("LoadAdsCombinedCall") - } +internal val BytecodePatchContext.hideCommentAdsMethod by gettingFirstMethodDeclaratively { + name("invokeSuspend") + definingClass("LoadAdsCombinedCall") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt index 34f5b97813..4baebd53be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt @@ -1,13 +1,13 @@ package app.revanced.patches.reddit.ad.comments -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.extensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch val hideCommentAdsPatch = bytecodePatch( - description = "Removes ads in the comments.", + description = "Removes ads in the comments." ) { - execute { - hideCommentAdsFingerprint.method.replaceInstructions(0, "return-object p1") + apply { + hideCommentAdsMethod.replaceInstructions(0, "return-object p1") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt index 22cf466fce..54208c3825 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt @@ -1,16 +1,21 @@ package app.revanced.patches.reddit.ad.general -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -internal val adPostFingerprint = fingerprint { - returns("V") - // "children" are present throughout multiple versions - strings("children") - custom { _, classDef -> classDef.endsWith("Listing;") } +internal val BytecodePatchContext.adPostMethod by gettingFirstMethodDeclaratively("children") { + definingClass("Listing;") + returnType("V") } -internal val newAdPostFingerprint = fingerprint { - opcodes(Opcode.INVOKE_VIRTUAL) - strings("feedElement", "com.reddit.cookie") +internal val BytecodePatchContext.newAdPostMethod by gettingFirstMethodDeclaratively( + "feedElement", + "com.reddit.cookie", +) { + instructions(Opcode.INVOKE_VIRTUAL()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt index c25277bbdd..8cf4a3aa67 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt @@ -1,10 +1,12 @@ package app.revanced.patches.reddit.ad.general -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.reddit.ad.comments.hideCommentAdsPatch import app.revanced.patches.reddit.misc.extension.sharedExtensionPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction22c @@ -12,44 +14,40 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { dependsOn(hideCommentAdsPatch, sharedExtensionPatch) compatibleWith("com.reddit.frontpage") - execute { + apply { // region Filter promoted ads (does not work in popular or latest feed) val filterMethodDescriptor = "Lapp/revanced/extension/reddit/patches/FilterPromotedLinksPatch;" + "->filterChildren(Ljava/lang/Iterable;)Ljava/util/List;" - adPostFingerprint.method.apply { - val setPostsListChildren = implementation!!.instructions.first { instruction -> - if (instruction.opcode != Opcode.IPUT_OBJECT) return@first false + val setPostsListChildren = adPostMethod.implementation!!.instructions.first { instruction -> + if (instruction.opcode != Opcode.IPUT_OBJECT) return@first false - val reference = (instruction as ReferenceInstruction).reference as FieldReference - reference.name == "children" - } - - val castedInstruction = setPostsListChildren as Instruction22c - val itemsRegister = castedInstruction.registerA - val listInstanceRegister = castedInstruction.registerB - - // postsList.children = filterChildren(postListItems) - removeInstruction(setPostsListChildren.location.index) - addInstructions( - setPostsListChildren.location.index, - """ - invoke-static {v$itemsRegister}, $filterMethodDescriptor - move-result-object v0 - iput-object v0, v$listInstanceRegister, ${castedInstruction.reference} - """, - ) + val reference = (instruction as ReferenceInstruction).reference as FieldReference + reference.name == "children" } + val castedInstruction = setPostsListChildren as Instruction22c + val itemsRegister = castedInstruction.registerA + val listInstanceRegister = castedInstruction.registerB + + // postsList.children = filterChildren(postListItems) + adPostMethod.removeInstruction(setPostsListChildren.location.index) + adPostMethod.addInstructions( + setPostsListChildren.location.index, + """ + invoke-static {v$itemsRegister}, $filterMethodDescriptor + move-result-object v0 + iput-object v0, v$listInstanceRegister, ${castedInstruction.reference} + """, + ) + // endregion // region Remove ads from popular and latest feed @@ -58,15 +56,13 @@ val hideAdsPatch = bytecodePatch( // AdElementConverter is conveniently responsible for inserting all feed ads. // By removing the appending instruction no ad posts gets appended to the feed. - val index = newAdPostFingerprint.originalMethod.implementation!!.instructions.indexOfFirst { - if (it.opcode != Opcode.INVOKE_VIRTUAL) return@indexOfFirst false - - val reference = (it as ReferenceInstruction).reference as MethodReference + val index = newAdPostMethod.indexOfFirstInstruction { + val reference = getReference() ?: return@indexOfFirstInstruction false reference.name == "add" && reference.definingClass == "Ljava/util/ArrayList;" } - newAdPostFingerprint.method.removeInstruction(index) + newAdPostMethod.removeInstruction(index) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt index 92ff76f9e7..fabb9b9b00 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixRedgifsApiPatch.kt @@ -8,9 +8,9 @@ const val INSTALL_NEW_CLIENT_METHOD = "install(Lokhttp3/OkHttpClient${'$'}Builde const val CREATE_NEW_CLIENT_METHOD = "createClient()Lokhttp3/OkHttpClient;" fun fixRedgifsApiPatch( - extensionPatch: Patch<*>, + extensionPatch: Patch, block: BytecodePatchBuilder.() -> Unit = {}, -) = bytecodePatch(name = "Fix Redgifs API") { +) = bytecodePatch("Fix Redgifs API") { dependsOn(extensionPatch) block() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixSLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixSLinksPatch.kt index ccc0346a66..106e1ba23c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixSLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixSLinksPatch.kt @@ -8,9 +8,9 @@ const val RESOLVE_S_LINK_METHOD = "patchResolveSLink(Ljava/lang/String;)Z" const val SET_ACCESS_TOKEN_METHOD = "patchSetAccessToken(Ljava/lang/String;)V" fun fixSLinksPatch( - extensionPatch: Patch<*>, + extensionPatch: Patch, block: BytecodePatchBuilder.() -> Unit = {}, -) = bytecodePatch(name = "Fix /s/ links") { +) = bytecodePatch("Fix /s/ links") { dependsOn(extensionPatch) block() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/SpoofClientPatch.kt index b21b36a0d7..a4148df753 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/SpoofClientPatch.kt @@ -20,15 +20,13 @@ fun spoofClientPatch( ) { block( stringOption( - "client-id", - null, - null, - "OAuth client ID", - "The Reddit OAuth client ID. " + + name = "OAuth client ID", + values = null, + description = "The Reddit OAuth client ID. " + "You can get your client ID from https://www.reddit.com/prefs/apps. " + "The application type has to be \"Installed app\" " + "and the redirect URI has to be set to \"$redirectUri\".", - true, + required = true, ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt index bb87c21148..07fed42809 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt @@ -1,19 +1,17 @@ package app.revanced.patches.reddit.customclients.baconreader.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext -internal val getAuthorizationUrlFingerprint = fingerprint { - strings("client_id=zACVn0dSFGdWqQ") -} -internal val getClientIdFingerprint = fingerprint { - strings("client_id=zACVn0dSFGdWqQ") - custom { method, classDef -> - if (!classDef.endsWith("RedditOAuth;")) return@custom false - - method.name == "getAuthorizeUrl" - } +internal val BytecodePatchContext.getAuthorizationUrlMethodMatch by composingFirstMethod { + instructions("client_id=zACVn0dSFGdWqQ"()) } -internal val requestTokenFingerprint = fingerprint { - strings("zACVn0dSFGdWqQ", "kDm2tYpu9DqyWFFyPlNcXGEni4k") // App ID and secret. +internal val BytecodePatchContext.requestTokenMethodMatch by composingFirstMethod { + instructions( + "zACVn0dSFGdWqQ"(), + "kDm2tYpu9DqyWFFyPlNcXGEni4k"(String::contains), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt index df811d347d..dde1e50726 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/SpoofClientPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.reddit.customclients.baconreader.api -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.reddit.customclients.spoofClientPatch import app.revanced.patches.shared.misc.string.replaceStringPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -11,7 +11,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://baconreader.com/au dependsOn( // Redirects from SSL to WWW domain are bugged causing auth problems. // Manually rewrite the URLs to fix this. - replaceStringPatch("ssl.reddit.com", "www.reddit.com") + replaceStringPatch("ssl.reddit.com", "www.reddit.com"), ) compatibleWith( @@ -21,23 +21,21 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://baconreader.com/au val clientId by clientIdOption - execute { - fun Fingerprint.patch(replacementString: String) { - val clientIdIndex = stringMatches!!.first().index + apply { + fun CompositeMatch.patch(replacementString: String) { + val clientIdIndex = get(0) - method.apply { - val clientIdRegister = getInstruction(clientIdIndex).registerA - replaceInstruction( - clientIdIndex, - "const-string v$clientIdRegister, \"$replacementString\"", - ) - } + val clientIdRegister = method.getInstruction(clientIdIndex).registerA + method.replaceInstruction( + clientIdIndex, + "const-string v$clientIdRegister, \"$replacementString\"", + ) } // Patch client id in authorization url. - getAuthorizationUrlFingerprint.patch("client_id=$clientId") + getAuthorizationUrlMethodMatch.patch("client_id=$clientId") // Patch client id for access token request. - requestTokenFingerprint.patch(clientId!!) + requestTokenMethodMatch.patch(clientId!!) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt index 524beeea0e..e69b9cee80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt @@ -1,13 +1,15 @@ package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.definingClass +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType - -internal val getOkHttpClientFingerprint = fingerprint { - returns("Lokhttp3/OkHttpClient;") - parameters() - custom { method, classDef -> - classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient" - } +internal val BytecodePatchContext.getOkHttpClientMethod by gettingFirstMethodDeclaratively { + definingClass("Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;") + name("getOkhttpClient") + returnType("Lokhttp3/OkHttpClient;") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt index 4cd9db006b..3d3e6e3ed6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstructions +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.typeReference import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD import app.revanced.patches.reddit.customclients.baconreader.misc.extension.sharedExtensionPatch import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch @@ -12,7 +12,6 @@ import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/baconreader/FixRedgifsApiPatch;" @@ -25,29 +24,29 @@ val fixRedgifsApi = fixRedgifsApiPatch( "com.onelouder.baconreader.premium", ) - execute { + apply { // region Patch Redgifs OkHttp3 client. - getOkHttpClientFingerprint.method.apply { - // Remove conflicting OkHttp interceptors. - val originalInterceptorInstallIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.NEW_INSTANCE && getReference()?.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager\$HeaderInterceptor;" - } - removeInstructions(originalInterceptorInstallIndex, 5) - - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" - } - val register = getInstruction(index).registerC - replaceInstruction( - index, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD - """ - ) + // Remove conflicting OkHttp interceptors. + val originalInterceptorInstallIndex = getOkHttpClientMethod.indexOfFirstInstructionOrThrow { + opcode == Opcode.NEW_INSTANCE && typeReference?.type == $$"Lcom/onelouder/baconreader/media/gfycat/RedGifsManager$HeaderInterceptor;" } + getOkHttpClientMethod.removeInstructions(originalInterceptorInstallIndex, 5) - // endregion + val index = getOkHttpClientMethod.indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == $$"Lokhttp3/OkHttpClient$Builder;" + } + val register = getOkHttpClientMethod.getInstruction(index).registerC + + getOkHttpClientMethod.replaceInstruction( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD + """ + ) } + + // endregion + } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt index fe644145be..0256df0a77 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt @@ -1,9 +1,5 @@ package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook { - custom { method, _ -> - method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook("Lcom/onelouder/baconreader/BaconReader;") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch.kt index fc5cabd218..b28cbbfd24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch.kt @@ -1,17 +1,14 @@ package app.revanced.patches.reddit.customclients.boostforreddit.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val disableAdsPatch = bytecodePatch( - name = "Disable ads", -) { +val disableAdsPatch = bytecodePatch("Disable ads") { compatibleWith("com.rubenmayayo.reddit") - execute { - arrayOf(maxMediationFingerprint, admobMediationFingerprint).forEach { fingerprint -> - fingerprint.method.addInstructions(0, "return-void") - } + apply { + maxMediationMethod.returnEarly() + admobMediationMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt index 618e2f1456..2c3abba5dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.reddit.customclients.boostforreddit.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val maxMediationFingerprint = fingerprint { - strings("MaxMediation: Attempting to initialize SDK") -} +internal val BytecodePatchContext.maxMediationMethod by gettingFirstMethodDeclaratively( + "MaxMediation: Attempting to initialize SDK" +) -internal val admobMediationFingerprint = fingerprint { - strings("AdmobMediation: Attempting to initialize SDK") -} +internal val BytecodePatchContext.admobMediationMethod by gettingFirstMethodDeclaratively( + "AdmobMediation: Attempting to initialize SDK" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt index cc06fd3968..6579aa81fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt @@ -1,15 +1,15 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val buildUserAgentFingerprint = fingerprint { - strings("%s:%s:%s (by /u/%s)") -} - -internal val getClientIdFingerprint = fingerprint { - custom { method, classDef -> - if (!classDef.endsWith("Credentials;")) return@custom false - - method.name == "getClientId" - } +internal val BytecodePatchContext.buildUserAgentMethod by gettingFirstMethodDeclaratively( + "%s:%s:%s (by /u/%s)", +) + +internal val BytecodePatchContext.getClientIdMethod by gettingFirstMethodDeclaratively { + name("getClientId") + definingClass("Credentials;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt index cfa4031c6b..b99df9d8e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch.kt @@ -1,20 +1,25 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.reddit.customclients.spoofClientPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.StringReference +@Suppress("unused") val spoofClientPatch = spoofClientPatch(redirectUri = "http://rubenmayayo.com") { clientIdOption -> compatibleWith("com.rubenmayayo.reddit") val clientId by clientIdOption - execute { + apply { // region Patch client id. - getClientIdFingerprint.method.returnEarly(clientId!!) + getClientIdMethod.returnEarly(clientId!!) // endregion @@ -23,12 +28,13 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://rubenmayayo.com") // Use a random user agent. val randomName = (0..100000).random() val userAgent = "$randomName:app.revanced.$randomName:v1.0.0 (by /u/revanced)" - buildUserAgentFingerprint.let { - val userAgentTemplateIndex = it.stringMatches!!.first().index - val register = it.method.getInstruction(userAgentTemplateIndex).registerA - - it.method.replaceInstruction(userAgentTemplateIndex, "const-string v$register, \"$userAgent\"") + + val userAgentTemplateIndex = buildUserAgentMethod.indexOfFirstInstructionOrThrow { + opcode == Opcode.CONST_STRING && getReference()?.string == "%s:%s:%s (by /u/%s)" } + val register = buildUserAgentMethod.getInstruction(userAgentTemplateIndex).registerA + + buildUserAgentMethod.replaceInstruction(userAgentTemplateIndex, "const-string v$register, \"$userAgent\"") // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt index a2b1530b8b..b8cdd1d636 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt @@ -1,7 +1,13 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext -internal val downloadAudioFingerprint = fingerprint { - strings("/DASH_audio.mp4", "/audio") +internal val BytecodePatchContext.downloadAudioMethodMatch by composingFirstMethod { + instructions( + "/DASH_audio.mp4"(), + "/audio"(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt deleted file mode 100644 index 40c23a76c1..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt +++ /dev/null @@ -1,30 +0,0 @@ -package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads - -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Suppress("unused") -val fixAudioMissingInDownloadsPatch = bytecodePatch( - name = "Fix missing audio in video downloads", - description = "Fixes audio missing in videos downloaded from v.redd.it.", -) { - compatibleWith("com.rubenmayayo.reddit") - - execute { - val endpointReplacements = mapOf( - "/DASH_audio.mp4" to "/CMAF_AUDIO_128.mp4", - "/audio" to "/CMAF_AUDIO_64.mp4", - ) - - downloadAudioFingerprint.method.apply { - downloadAudioFingerprint.stringMatches!!.forEach { match -> - val replacement = endpointReplacements[match.string] - val register = getInstruction(match.index).registerA - - replaceInstruction(match.index, "const-string v$register, \"$replacement\"") - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInVideoDownloadsPatch.kt new file mode 100644 index 0000000000..0eaf76d012 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInVideoDownloadsPatch.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads + +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.patch.bytecodePatch +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +val fixMissingAudioInVideoDownloadsPatch = bytecodePatch( + name = "Fix missing audio in video downloads", + description = "Fixes audio missing in videos downloaded from v.redd.it.", +) { + compatibleWith("com.rubenmayayo.reddit") + + apply { + val endpointReplacements = arrayOf( + "/DASH_AUDIO_128.mp4", + "/DASH_AUDIO_64.mp4", + ) + + downloadAudioMethodMatch.indices[0].forEachIndexed { i, index -> + val replacement = endpointReplacements[i] + val register = downloadAudioMethodMatch.method.getInstruction(index).registerA + + downloadAudioMethodMatch.method.replaceInstruction(index, "const-string v$register, \"$replacement\"") + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt index 1f3560d737..518930b35d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createOkHttpClientFingerprint = fingerprint { +internal val BytecodePatchContext.createOkHttpClientMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE) opcodes( Opcode.NEW_INSTANCE, @@ -14,7 +16,7 @@ internal val createOkHttpClientFingerprint = fingerprint { Opcode.NEW_INSTANCE, Opcode.INVOKE_DIRECT, Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT + Opcode.MOVE_RESULT_OBJECT, ) - custom { _, classDef -> classDef.sourceFile == "RedGifsAPIv2.java" } + custom { immutableClassDef.sourceFile == "RedGifsAPIv2.java" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt index 340f4096ca..ec5b904c8d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt @@ -1,12 +1,11 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.reddit.customclients.CREATE_NEW_CLIENT_METHOD -import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch -import app.revanced.util.getReference +import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/boostforreddit/FixRedgifsApiPatch;" @@ -16,19 +15,17 @@ val fixRedgifsApi = fixRedgifsApiPatch( ) { compatibleWith("com.rubenmayayo.reddit") - execute { + apply { // region Patch Redgifs OkHttp3 client. - createOkHttpClientFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" - } - replaceInstruction( - index, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->$CREATE_NEW_CLIENT_METHOD" - ) + val index = createOkHttpClientMethod.indexOfFirstInstructionOrThrow { + val reference = methodReference + reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" } + createOkHttpClientMethod.replaceInstruction( + index, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->$CREATE_NEW_CLIENT_METHOD" + ) // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt index 665dba5a40..562cb121ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt @@ -1,21 +1,22 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val getOAuthAccessTokenFingerprint = fingerprint { +internal val BytecodePatchContext.getOAuthAccessTokenMethod by gettingFirstMethodDeclaratively("access_token") { + definingClass("Lnet/dean/jraw/http/oauth/OAuthData;") accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/String") - strings("access_token") - custom { method, _ -> method.definingClass == "Lnet/dean/jraw/http/oauth/OAuthData;" } + returnType("Ljava/lang/String;") } -internal val handleNavigationFingerprint = fingerprint { - strings( - "android.intent.action.SEARCH", - "subscription", - "sort", - "period", - "boostforreddit.com/themes", - ) -} +internal val BytecodePatchContext.handleNavigationMethod by gettingFirstMethodDeclaratively( + "android.intent.action.SEARCH", + "subscription", + "sort", + "period", + "boostforreddit.com/themes" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch.kt index 076221e473..1100a7389b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patches.reddit.customclients.RESOLVE_S_LINK_METHOD import app.revanced.patches.reddit.customclients.SET_ACCESS_TOKEN_METHOD import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch @@ -17,30 +17,29 @@ val fixSlinksPatch = fixSLinksPatch( ) { compatibleWith("com.rubenmayayo.reddit") - execute { + apply { // region Patch navigation handler. - handleNavigationFingerprint.method.apply { - val urlRegister = "p1" - val tempRegister = "v1" + val urlRegister = "p1" + val tempRegister = "v1" + + handleNavigationMethod.addInstructionsWithLabels( + 0, + """ + invoke-static { $urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->$RESOLVE_S_LINK_METHOD + move-result $tempRegister + if-eqz $tempRegister, :continue + return $tempRegister + """, + ExternalLabel("continue", handleNavigationMethod.getInstruction(0)), + ) - addInstructionsWithLabels( - 0, - """ - invoke-static { $urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->$RESOLVE_S_LINK_METHOD - move-result $tempRegister - if-eqz $tempRegister, :continue - return $tempRegister - """, - ExternalLabel("continue", getInstruction(0)), - ) - } // endregion // region Patch set access token. - getOAuthAccessTokenFingerprint.method.addInstruction( + getOAuthAccessTokenMethod.addInstruction( 3, "invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->$SET_ACCESS_TOKEN_METHOD", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt index 1e7e4e2e83..303a4ecb85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt @@ -1,11 +1,7 @@ package app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook( - insertIndexResolver = { 1 }, -) { - custom { method, _ -> - method.definingClass == "Lcom/rubenmayayo/reddit/MyApplication;" && method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/rubenmayayo/reddit/MyApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt index 4bce1362c2..b8d8da7bef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt @@ -1,7 +1,6 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.patch.BytecodePatchContext -internal val apiUtilsFingerprint = fingerprint { - strings("native-lib") -} \ No newline at end of file +internal val BytecodePatchContext.apiUtilsMethod by gettingFirstMethod("native-lib") \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt index b195b49fb2..7b8b2a6d9f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.api -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patcher.util.smali.toInstructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.toInstructions import app.revanced.patches.reddit.customclients.spoofClientPatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @@ -11,13 +12,13 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "infinity://localhost") { compatibleWith( "ml.docilealligator.infinityforreddit", "ml.docilealligator.infinityforreddit.plus", - "ml.docilealligator.infinityforreddit.patreon" + "ml.docilealligator.infinityforreddit.patreon", ) val clientId by clientIdOption - execute { - apiUtilsFingerprint.classDef.methods.apply { + apply { + apiUtilsMethod.classDef.methods.apply { val getClientIdMethod = single { it.name == "getId" }.also(::remove) val newGetClientIdMethod = ImmutableMethod( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 36fe062796..0313a99321 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -1,15 +1,13 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.invoke +import app.revanced.patcher.instructions +import app.revanced.patcher.patch.BytecodePatchContext -internal val billingClientOnServiceConnectedFingerprint = fingerprint { - strings("Billing service connected") -} +internal val BytecodePatchContext.billingClientOnServiceConnectedMethod by gettingFirstMethod("Billing service connected") -internal val startSubscriptionActivityFingerprint = fingerprint { - literal { - // Intent start flag only used in the subscription activity - 0x10008000 - } +internal val BytecodePatchContext.startSubscriptionActivityMethod by gettingFirstMethodDeclaratively { + instructions(0x10008000L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/UnlockSubscriptionPatch.kt index ba39c29a52..4cc87895ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/UnlockSubscriptionPatch.kt @@ -14,13 +14,11 @@ val unlockSubscriptionPatch = bytecodePatch( compatibleWith( "ml.docilealligator.infinityforreddit", "ml.docilealligator.infinityforreddit.plus", - "ml.docilealligator.infinityforreddit.patreon" + "ml.docilealligator.infinityforreddit.patreon", ) - execute { - setOf( - startSubscriptionActivityFingerprint, - billingClientOnServiceConnectedFingerprint, - ).forEach { it.method.returnEarly() } + apply { + billingClientOnServiceConnectedMethod.returnEarly() + startSubscriptionActivityMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/DisableAdsPatch.kt index 0c75087581..3f8b5b49cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/DisableAdsPatch.kt @@ -1,24 +1,16 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.ads -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.disablePiracyDetectionPatch +import app.revanced.util.returnEarly @Suppress("unused") -val disableAdsPatch = bytecodePatch( - name = "Disable ads", -) { +val disableAdsPatch = bytecodePatch("Disable ads") { dependsOn(disablePiracyDetectionPatch) compatibleWith("o.o.joey") - execute { - isAdFreeUserFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + isAdFreeUserMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt index 465faf1200..b4924a228c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.ads +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val isAdFreeUserFingerprint = fingerprint { +internal val BytecodePatchContext.isAdFreeUserMethod by gettingFirstMethodDeclaratively("AD_FREE_USER") { accessFlags(AccessFlags.PUBLIC) - returns("Z") - strings("AD_FREE_USER") -} \ No newline at end of file + returnType("Z") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt index e6c591748c..37b39069ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt @@ -1,28 +1,26 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.api -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val authUtilityUserAgentFingerprint = fingerprint { +internal val BytecodePatchContext.authUtilityUserAgentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") + returnType("Ljava/lang/String;") opcodes(Opcode.APUT_OBJECT) - custom { method, classDef -> - classDef.sourceFile == "AuthUtility.java" - } + custom { immutableClassDef.sourceFile == "AuthUtility.java" } } -internal val getClientIdFingerprint = fingerprint { +internal val BytecodePatchContext.getClientIdMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") + returnType("L") opcodes( - Opcode.CONST, // R.string.valuable_cid - Opcode.INVOKE_STATIC, // StringMaster.decrypt + Opcode.CONST, + Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT + Opcode.RETURN_OBJECT, ) - custom { _, classDef -> - classDef.sourceFile == "AuthUtility.java" - } -} \ No newline at end of file + custom { immutableClassDef.sourceFile == "AuthUtility.java" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt index e1855a50f5..8e9fa3d23e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/SpoofClientPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.api -import app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.disablePiracyDetectionPatch import app.revanced.patches.reddit.customclients.spoofClientPatch +import app.revanced.patches.reddit.customclients.sync.detection.piracy.disablePiracyDetectionPatch import app.revanced.util.returnEarly val spoofClientPatch = spoofClientPatch(redirectUri = "https://127.0.0.1:65023/authorize_callback") { clientIdOption -> @@ -15,10 +15,10 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "https://127.0.0.1:65023/a val clientId by clientIdOption - execute { + apply { // region Patch client id. - getClientIdFingerprint.method.returnEarly(clientId!!) + getClientIdMethod.returnEarly(clientId!!) // endregion @@ -28,7 +28,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "https://127.0.0.1:65023/a val randomName = (0..100000).random() val userAgent = "$randomName:app.revanced.$randomName:v1.0.0 (by /u/revanced)" - authUtilityUserAgentFingerprint.method.returnEarly(userAgent) + authUtilityUserAgentMethod.returnEarly(userAgent) // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatch.kt index a6871dbc0e..d037f18959 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatch.kt @@ -1,11 +1,11 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly +@Suppress("unused") val disablePiracyDetectionPatch = bytecodePatch { - - execute { - piracyDetectionFingerprint.method.addInstruction(0, "return-void") + apply { + detectPiracyMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt index 76343a5309..a1f2311635 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt @@ -1,21 +1,26 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val piracyDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.detectPiracyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("V") + returnType("V") opcodes( Opcode.NEW_INSTANCE, Opcode.CONST_16, Opcode.CONST_WIDE_16, Opcode.INVOKE_DIRECT, Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ) - custom { _, classDef -> - classDef.endsWith("ProcessLifeCyleListener;") - } -} \ No newline at end of file + definingClass("ProcessLifeCyleListener;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt index 5b3029094f..cab6b3e7ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt @@ -1,25 +1,29 @@ package app.revanced.patches.reddit.customclients.redditisfun.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal fun baseClientIdFingerprint(string: String) = fingerprint { - strings("yyOCBp.RHJhDKd", string) +internal val BytecodePatchContext.basicAuthorizationMethodMatch by composingFirstMethod { + instructions( + "yyOCBp.RHJhDKd"(), + "fJOxVwBUyo*=f: compatibleWith( "com.andrewshu.android.reddit", @@ -19,7 +19,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl val clientId by clientIdOption - execute { + apply { // region Patch client id. /** @@ -28,23 +28,23 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl * * @param string The string to replace the instruction with. * @param getReplacementIndex A function that returns the index of the instruction to replace - * using the [Match.StringMatch] list from the [Match]. + * using the [CompositeMatch.indices] list from the [CompositeMatch]. */ - fun Fingerprint.replaceWith( + fun CompositeMatch.replaceWith( string: String, - getReplacementIndex: List.() -> Int, + getReplacementIndex: List.() -> Int, ) = method.apply { - val replacementIndex = stringMatches!!.getReplacementIndex() + val replacementIndex = indices[0].getReplacementIndex() val clientIdRegister = getInstruction(replacementIndex).registerA replaceInstruction(replacementIndex, "const-string v$clientIdRegister, \"$string\"") } // Patch OAuth authorization. - buildAuthorizationStringFingerprint.replaceWith(clientId!!) { first().index + 4 } + buildAuthorizationStringMethodMatch.replaceWith(clientId!!) { first() + 4 } // Path basic authorization. - basicAuthorizationFingerprint.replaceWith("$clientId:") { last().index + 7 } + basicAuthorizationMethodMatch.replaceWith("$clientId:") { last() + 7 } // endregion @@ -54,7 +54,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl val randomName = (0..100000).random() val userAgent = "$randomName:app.revanced.$randomName:v1.0.0 (by /u/revanced)" - getUserAgentFingerprint.method.returnEarly(userAgent) + getUserAgentMethod.returnEarly(userAgent) // endregion @@ -62,7 +62,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl // Reddit messed up and does not append a redirect uri to the authorization url to old.reddit.com/login. // Replace old.reddit.com with www.reddit.com to fix this. - buildAuthorizationStringFingerprint.method.apply { + buildAuthorizationStringMethodMatch.method.apply { val index = indexOfFirstInstructionOrThrow { getReference()?.contains("old.reddit.com") == true } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/Fingerprints.kt index 263602f730..b39e0d9ecd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/Fingerprints.kt @@ -1,26 +1,33 @@ package app.revanced.patches.reddit.customclients.relayforreddit.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode +import org.stringtemplate.v4.compiler.Bytecode -internal fun baseClientIdFingerprint(string: String) = fingerprint { - strings("dj-xCIZQYiLbEg", string) +internal fun baseClientIdMethod(string: String) = composingFirstMethod { + instructions( + "dj-xCIZQYiLbEg"(), + string(), + ) } -internal val getLoggedInBearerTokenFingerprint = baseClientIdFingerprint("authorization_code") +internal val BytecodePatchContext.getLoggedInBearerTokenMethodMatch by baseClientIdMethod("authorization_code") -internal val getLoggedOutBearerTokenFingerprint = baseClientIdFingerprint("https://oauth.reddit.com/grants/installed_client") +internal val BytecodePatchContext.getLoggedOutBearerTokenMethodMatch by baseClientIdMethod("https://oauth.reddit.com/grants/installed_client") -internal val getRefreshTokenFingerprint = baseClientIdFingerprint("refresh_token") +internal val BytecodePatchContext.getRefreshTokenMethodMatch by baseClientIdMethod("refresh_token") -internal val loginActivityClientIdFingerprint = baseClientIdFingerprint("&duration=permanent") +internal val BytecodePatchContext.loginActivityClientIdMethodMatch by baseClientIdMethod("&duration=permanent") -internal val redditCheckDisableAPIFingerprint = fingerprint { - opcodes(Opcode.IF_EQZ) - strings("Reddit Disabled") +internal val BytecodePatchContext.redditCheckDisableAPIMethod by gettingFirstMethodDeclaratively("Reddit Disabled") { + instructions(Opcode.IF_EQZ()) } -internal val setRemoteConfigFingerprint = fingerprint { - parameters("Lcom/google/firebase/remoteconfig/FirebaseRemoteConfig;") - strings("reddit_oauth_url") +internal val BytecodePatchContext.setRemoteConfigMethod by gettingFirstMethodDeclaratively("reddit_oauth_url") { + parameterTypes("Lcom/google/firebase/remoteconfig/FirebaseRemoteConfig;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt index 854b7cfa5b..df4c381ad4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/relayforreddit/api/SpoofClientPatch.kt @@ -1,40 +1,37 @@ package app.revanced.patches.reddit.customclients.relayforreddit.api -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.reddit.customclients.spoofClientPatch +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction10t import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21t import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { +@Suppress("unused") +val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { clientIdOption -> compatibleWith( "free.reddit.news", "reddit.news", ) - val clientId by it + val clientId by clientIdOption - execute { + apply { // region Patch client id. - setOf( - loginActivityClientIdFingerprint, - getLoggedInBearerTokenFingerprint, - getLoggedOutBearerTokenFingerprint, - getRefreshTokenFingerprint, - ).forEach { fingerprint -> - val clientIdIndex = fingerprint.stringMatches!!.first().index - fingerprint.method.apply { - val clientIdRegister = getInstruction(clientIdIndex).registerA + listOf( + loginActivityClientIdMethodMatch, + getLoggedInBearerTokenMethodMatch, + getLoggedOutBearerTokenMethodMatch, + getRefreshTokenMethodMatch, + ).forEach { match -> + val clientIdIndex = match[0] + val clientIdRegister = match.method.getInstruction(clientIdIndex).registerA - fingerprint.method.replaceInstruction( - clientIdIndex, - "const-string v$clientIdRegister, \"$clientId\"", - ) - } + match.method.replaceInstruction(clientIdIndex, "const-string v$clientIdRegister, \"$clientId\"") } // endregion @@ -42,12 +39,11 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { // region Patch miscellaneous. // Do not load remote config which disables OAuth login remotely. - setRemoteConfigFingerprint.method.addInstructions(0, "return-void") + setRemoteConfigMethod.returnEarly() // Prevent OAuth login being disabled remotely. - val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.patternMatch!!.startIndex - - redditCheckDisableAPIFingerprint.method.apply { + redditCheckDisableAPIMethod.apply { + val checkIsOAuthRequestIndex = indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) val returnNextChain = getInstruction(checkIsOAuthRequestIndex).target replaceInstruction(checkIsOAuthRequestIndex, BuilderInstruction10t(Opcode.GOTO, returnNextChain)) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt index 4ff8be4615..84d6b73a52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt @@ -1,11 +1,11 @@ package app.revanced.patches.reddit.customclients.slide.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getClientIdFingerprint = fingerprint { - custom { method, classDef -> - if (!classDef.endsWith("Credentials;")) return@custom false - - method.name == "getClientId" - } +internal val BytecodePatchContext.getClientIdMethod by gettingFirstMethodDeclaratively { + name("getClientId") + definingClass("Credentials;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch.kt index 692bb828b0..aab8fff8f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/SpoofClientPatch.kt @@ -8,7 +8,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "http://www.ccrama.me") { val clientId by clientIdOption - execute { - getClientIdFingerprint.method.returnEarly(clientId!!) + apply { + getClientIdMethod.returnEarly(clientId!!) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt index f210a6adbe..8db9d168cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt @@ -7,8 +7,8 @@ import app.revanced.util.returnEarly fun disableAdsPatch(block: BytecodePatchBuilder.() -> Unit = {}) = bytecodePatch( name = "Disable ads", ) { - execute { - isAdsEnabledFingerprint.method.returnEarly() + apply { + isAdsEnabledMethod.returnEarly(false) } block() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt index e055493bdd..d7f1630a24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.reddit.customclients.sync.ads +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.accessFlags import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val isAdsEnabledFingerprint = fingerprint { +internal val BytecodePatchContext.isAdsEnabledMethod by gettingFirstMethodDeclaratively("SyncIapHelper") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - strings("SyncIapHelper") + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatch.kt index 53069a951a..e84f4cc9e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatch.kt @@ -1,15 +1,15 @@ package app.revanced.patches.reddit.customclients.sync.detection.piracy -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly val disablePiracyDetectionPatch = bytecodePatch( description = "Disables detection of modified versions.", ) { - execute { - // Do not throw an error if the fingerprint is not resolved. + apply { + // Do not throw an error if the method can't be found. // This is fine because new versions of the target app do not need this patch. - piracyDetectionFingerprint.methodOrNull?.addInstruction(0, "return-void") + detectPiracyMethodOrNull?.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt index e83e914d75..a78f840aa0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt @@ -1,15 +1,24 @@ package app.revanced.patches.reddit.customclients.sync.detection.piracy -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference +import app.revanced.patcher.accessFlags +import app.revanced.patcher.custom +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.reference +import app.revanced.patcher.gettingFirstMethodDeclarativelyOrNull +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patcher.type import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.Reference -internal val piracyDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.detectPiracyMethodOrNull by gettingFirstMethodDeclarativelyOrNull( + "Lcom/github/javiersantos/piracychecker/PiracyChecker;", +) { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") + returnType("V") opcodes( Opcode.NEW_INSTANCE, Opcode.INVOKE_DIRECT, @@ -17,10 +26,5 @@ internal val piracyDetectionFingerprint = fingerprint { Opcode.INVOKE_DIRECT, Opcode.INVOKE_VIRTUAL, ) - custom { method, _ -> - method.implementation ?: return@custom false - method.instructions.any { - it.getReference()?.toString() == "Lcom/github/javiersantos/piracychecker/PiracyChecker;" - } - } + instructions(type("Lcom/github/javiersantos/piracychecker/PiracyChecker;")) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/DisableSyncForLemmyBottomSheetPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/DisableSyncForLemmyBottomSheetPatch.kt index 0bfbe74d0c..e2bc618efd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/DisableSyncForLemmyBottomSheetPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/DisableSyncForLemmyBottomSheetPatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances.startup -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -14,11 +15,9 @@ val disableSyncForLemmyBottomSheetPatch = bytecodePatch( "com.laurencedawson.reddit_sync.dev"(), // Version unknown. ) - execute { - mainActivityOnCreateFingerprint.method.apply { - val showBottomSheetIndex = implementation!!.instructions.lastIndex - 1 + apply { + val showBottomSheetIndex = mainActivityOnCreateMethod.instructions.lastIndex - 1 - removeInstruction(showBottomSheetIndex) - } + mainActivityOnCreateMethod.removeInstruction(showBottomSheetIndex) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt index 21c788a89c..fdfefa38d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances.startup -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val mainActivityOnCreateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("MainActivity;") && method.name == "onCreate" - } +internal val BytecodePatchContext.mainActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("MainActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index c7902b1f4d..5b1044513a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -1,19 +1,26 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api -import app.revanced.patcher.fingerprint +import app.revanced.patcher.ClassDefComposing +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val getAuthorizationStringFingerprint = fingerprint { - strings("authorize.compact?client_id") +internal val BytecodePatchContext.getAuthorizationStringMethodMatch by composingFirstMethod { + instructions(string { contains("authorize.compact?client_id") }) } -internal val getBearerTokenFingerprint = fingerprint { - strings("Basic") +internal val ClassDef.getBearerTokenMethodMatch by ClassDefComposing.composingFirstMethod { + instructions(string { contains("Basic") }) } -internal val getUserAgentFingerprint = fingerprint { - strings("android:com.laurencedawson.reddit_sync") -} +internal val BytecodePatchContext.getUserAgentMethod by gettingFirstMethod( + "android:com.laurencedawson.reddit_sync", +) -internal val imgurImageAPIFingerprint = fingerprint { - strings("https://imgur-apiv3.p.rapidapi.com/3/image") +internal val BytecodePatchContext.imgurImageAPIMethodMatch by composingFirstMethod { + instructions("https://imgur-apiv3.p.rapidapi.com/3/image"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt index 0246ce7116..4422cdc103 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt @@ -1,16 +1,16 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.stringReference import app.revanced.patches.reddit.customclients.spoofClientPatch import app.revanced.patches.reddit.customclients.sync.detection.piracy.disablePiracyDetectionPatch import app.revanced.patches.shared.misc.string.replaceStringPatch import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.StringReference -import java.util.Base64 +import java.util.* +@Suppress("unused") val spoofClientPatch = spoofClientPatch( redirectUri = "http://redditsync/auth", ) { clientIdOption -> @@ -18,7 +18,7 @@ val spoofClientPatch = spoofClientPatch( disablePiracyDetectionPatch, // Redirects from SSL to WWW domain are bugged causing auth problems. // Manually rewrite the URLs to fix this. - replaceStringPatch("ssl.reddit.com", "www.reddit.com") + replaceStringPatch("ssl.reddit.com", "www.reddit.com"), ) compatibleWith( @@ -29,22 +29,20 @@ val spoofClientPatch = spoofClientPatch( val clientId by clientIdOption - execute { + apply { // region Patch client id. - getBearerTokenFingerprint.match(getAuthorizationStringFingerprint.originalClassDef).method.apply { + getAuthorizationStringMethodMatch.immutableClassDef.getBearerTokenMethodMatch.method.apply { val auth = Base64.getEncoder().encodeToString("$clientId:".toByteArray(Charsets.UTF_8)) returnEarly("Basic $auth") - val occurrenceIndex = - getAuthorizationStringFingerprint.stringMatches!!.first().index + val occurrenceIndex = getAuthorizationStringMethodMatch[0] - getAuthorizationStringFingerprint.method.apply { - val authorizationStringInstruction = getInstruction(occurrenceIndex) - val targetRegister = (authorizationStringInstruction as OneRegisterInstruction).registerA - val reference = authorizationStringInstruction.reference as StringReference + getAuthorizationStringMethodMatch.method.apply { + val authorizationStringInstruction = getInstruction(occurrenceIndex) + val targetRegister = authorizationStringInstruction.registerA - val newAuthorizationUrl = reference.string.replace( + val newAuthorizationUrl = authorizationStringInstruction.stringReference!!.string.replace( "client_id=.*?&".toRegex(), "client_id=$clientId&", ) @@ -64,19 +62,17 @@ val spoofClientPatch = spoofClientPatch( val randomName = (0..100000).random() val userAgent = "$randomName:app.revanced.$randomName:v1.0.0 (by /u/revanced)" - getUserAgentFingerprint.method.returnEarly(userAgent) + getUserAgentMethod.returnEarly(userAgent) // endregion // region Patch Imgur API URL. - imgurImageAPIFingerprint.let { - val apiUrlIndex = it.stringMatches!!.first().index - it.method.replaceInstruction( - apiUrlIndex, - "const-string v1, \"https://api.imgur.com/3/image\"", - ) - } + val apiUrlIndex = imgurImageAPIMethodMatch[0] + imgurImageAPIMethodMatch.method.replaceInstruction( + apiUrlIndex, + "const-string v1, \"https://api.imgur.com/3/image\"", + ) // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt index 00244b4df7..c70b90b8f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt @@ -1,11 +1,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook( - insertIndexResolver = { 1 }, // Insert after call to super class. -) { - custom { method, classDef -> - method.name == "onCreate" && classDef.type == "Lcom/laurencedawson/reddit_sync/RedditApplication;" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/laurencedawson/reddit_sync/RedditApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt index 16dfa46205..ca08b5d7f6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt @@ -1,39 +1,39 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.indexOfFirstInstruction import app.revanced.util.writeRegister import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n +import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction - -internal val createOkHttpClientFingerprint = fingerprint { +internal val BytecodePatchContext.createOkHttpClientMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("V") - parameters() - custom { method, classDef -> - // There are four functions (each creating a client) defined in this file with very similar fingerprints. + returnType("V") + parameterTypes() + custom { + // There are four functions (each creating a client) defined in this file with very similar methods. // We're looking for the one that only creates one object (the builder) and sets client options true // (thus never reloading the register with a 0). - classDef.sourceFile == "OkHttpHelper.java" && - method.instructions.count { it.opcode == Opcode.NEW_INSTANCE } == 1 && - method.indexOfFirstInstruction { - opcode == Opcode.CONST_4 && writeRegister == 1 && (this as Instruction11n).narrowLiteral == 0 + immutableClassDef.sourceFile == "OkHttpHelper.java" && instructions.count { + it.opcode == Opcode.NEW_INSTANCE + } == 1 && indexOfFirstInstruction { + opcode == Opcode.CONST_4 && writeRegister == 1 && (this as NarrowLiteralInstruction).narrowLiteral == 0 } == -1 } } -internal val getDefaultUserAgentFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getDefaultUserAgent" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +internal val BytecodePatchContext.getDefaultUserAgentMethod by gettingFirstMethodDeclaratively { + name("getDefaultUserAgent") + definingClass(EXTENSION_CLASS_DESCRIPTOR) } -internal val getOriginalUserAgentFingerprint = fingerprint { +internal val BytecodePatchContext.getOriginalUserAgentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { _, classDef -> classDef.sourceFile == "AccountSingleton.java" } + returnType { startsWith("Ljava/lang/String;") } + parameterTypes() + custom { immutableClassDef.sourceFile == "AccountSingleton.java" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt index a4f3842f9a..e4ae3a322e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.sharedExtensionPatch @@ -23,33 +23,30 @@ val fixRedgifsApi = fixRedgifsApiPatch( "com.laurencedawson.reddit_sync.dev", ) - execute { + apply { // region Patch Redgifs OkHttp3 client. - createOkHttpClientFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;" - } - val register = getInstruction(index).registerC - replaceInstruction( - index, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD - """ - ) + val index = createOkHttpClientMethod.indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.name == "build" && reference.definingClass == $$"Lokhttp3/OkHttpClient$Builder;" } + val register = createOkHttpClientMethod.getInstruction(index).registerC - getDefaultUserAgentFingerprint.method.apply { - addInstructions( - 0, - """ - invoke-static { }, ${getOriginalUserAgentFingerprint.method} - move-result-object v0 - return-object v0 - """ - ) - } + createOkHttpClientMethod.replaceInstruction( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD + """ + ) + + getDefaultUserAgentMethod.addInstructions( + 0, + """ + invoke-static { }, $getOriginalUserAgentMethod + move-result-object v0 + return-object v0 + """ + ) // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt index f7287fcc39..35d97c07ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt @@ -1,13 +1,17 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val linkHelperOpenLinkFingerprint = fingerprint { - strings("Link title: ") -} +internal val BytecodePatchContext.linkHelperOpenLinkMethod by gettingFirstMethod("Link title: ") -internal val setAuthorizationHeaderFingerprint = fingerprint { - returns("Ljava/util/HashMap;") - strings("Authorization", "bearer ") - custom { method, _ -> method.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" } +internal val BytecodePatchContext.setAuthorizationHeaderMethod by gettingFirstMethodDeclaratively( + "Authorization", + "bearer ", +) { + definingClass("Lcom/laurencedawson/reddit_sync/singleton/a;") + returnType { equals("Ljava/util/HashMap;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatch.kt index 06ee67fe4c..de7a9f221a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patches.reddit.customclients.RESOLVE_S_LINK_METHOD import app.revanced.patches.reddit.customclients.SET_ACCESS_TOKEN_METHOD import app.revanced.patches.reddit.customclients.fixSLinksPatch @@ -21,30 +21,28 @@ val fixSLinksPatch = fixSLinksPatch( "com.laurencedawson.reddit_sync.dev", ) - execute { + apply { // region Patch navigation handler. - linkHelperOpenLinkFingerprint.method.apply { - val urlRegister = "p3" - val tempRegister = "v2" + val urlRegister = "p3" + val tempRegister = "v2" - addInstructionsWithLabels( - 0, - """ - invoke-static { $urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->$RESOLVE_S_LINK_METHOD - move-result $tempRegister - if-eqz $tempRegister, :continue - return $tempRegister - """, - ExternalLabel("continue", getInstruction(0)), - ) - } + linkHelperOpenLinkMethod.addInstructionsWithLabels( + 0, + """ + invoke-static { $urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->$RESOLVE_S_LINK_METHOD + move-result $tempRegister + if-eqz $tempRegister, :continue + return $tempRegister + """, + ExternalLabel("continue", linkHelperOpenLinkMethod.getInstruction(0)), + ) // endregion // region Patch set access token. - setAuthorizationHeaderFingerprint.method.addInstruction( + setAuthorizationHeaderMethod.addInstruction( 0, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->$SET_ACCESS_TOKEN_METHOD", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt index 7a64031f16..5cbbb6862f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbnail -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val customImageViewLoadFingerprint = fingerprint { +internal val BytecodePatchContext.customImageViewLoadMethod by gettingFirstMethodDeclaratively { + definingClass("CustomImageView;") accessFlags(AccessFlags.PUBLIC) - parameters("Ljava/lang/String;", "Z", "Z", "I", "I") - custom { _, classDef -> - classDef.endsWith("CustomImageView;") - } + parameterTypes("Ljava/lang/String;", "Z", "Z", "I", "I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt index 4ac2fc3d05..f8180d52b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbnail -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -12,12 +12,12 @@ val fixPostThumbnailsPatch = bytecodePatch( compatibleWith( "com.laurencedawson.reddit_sync", "com.laurencedawson.reddit_sync.pro", - "com.laurencedawson.reddit_sync.dev" + "com.laurencedawson.reddit_sync.dev", ) // Image URLs contain escaped ampersands (&), let's replace these with unescaped ones (&). - execute { - customImageViewLoadFingerprint.method.addInstructions( + apply { + customImageViewLoadMethod.addInstructions( 0, """ # url = url.replace("&", "&"); @@ -25,7 +25,7 @@ val fixPostThumbnailsPatch = bytecodePatch( const-string v1, "&" invoke-virtual { p1, v0, v1 }, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; move-result-object p1 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt index 4bac74de77..5aa03483de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt @@ -1,36 +1,40 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.user -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal fun userEndpointFingerprint(source: String, accessFlags: Set? = null) = fingerprint { - strings("u/") - custom { _, classDef -> classDef.sourceFile == source } - accessFlags(*accessFlags?.toTypedArray() ?: return@fingerprint) +internal fun userEndpointMethodMatch( + source: String, + accessFlags: Set? = null, +) = composingFirstMethod { + instructions("u/"(String::contains)) + custom { immutableClassDef.sourceFile == source } + accessFlags(*accessFlags?.toTypedArray() ?: return@composingFirstMethod) } -internal val oAuthFriendRequestFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthFriendRequestMethodMatch by userEndpointMethodMatch( "OAuthFriendRequest.java", ) -internal val oAuthUnfriendRequestFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthUnfriendRequestMethodMatch by userEndpointMethodMatch( "OAuthUnfriendRequest.java", ) -internal val oAuthUserIdRequestFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthUserIdRequestMethodMatch by userEndpointMethodMatch( "OAuthUserIdRequest.java", ) -internal val oAuthUserInfoRequestFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthUserInfoRequestMethodMatch by userEndpointMethodMatch( "OAuthUserInfoRequest.java", ) -internal val oAuthSubredditInfoRequestConstructorFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthSubredditInfoRequestConstructorMethodMatch by userEndpointMethodMatch( "OAuthSubredditInfoRequest.java", setOf(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR), ) -internal val oAuthSubredditInfoRequestHelperFingerprint = userEndpointFingerprint( +internal val BytecodePatchContext.oAuthSubredditInfoRequestHelperMethodMatch by userEndpointMethodMatch( "OAuthSubredditInfoRequest.java", setOf(AccessFlags.PRIVATE, AccessFlags.STATIC), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt index 2d46c284c5..5c0dbf9419 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatch.kt @@ -1,11 +1,10 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.user -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.stringReference import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.getReference import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.StringReference @Suppress("unused") val useUserEndpointPatch = bytecodePatch( @@ -20,22 +19,21 @@ val useUserEndpointPatch = bytecodePatch( "com.laurencedawson.reddit_sync.dev", ) - execute { + apply { arrayOf( - oAuthFriendRequestFingerprint, - oAuthSubredditInfoRequestConstructorFingerprint, - oAuthSubredditInfoRequestHelperFingerprint, - oAuthUnfriendRequestFingerprint, - oAuthUserIdRequestFingerprint, - oAuthUserInfoRequestFingerprint, - ).map { fingerprint -> - fingerprint.stringMatches!!.first().index to fingerprint.method + oAuthFriendRequestMethodMatch, + oAuthSubredditInfoRequestConstructorMethodMatch, + oAuthSubredditInfoRequestHelperMethodMatch, + oAuthUnfriendRequestMethodMatch, + oAuthUserIdRequestMethodMatch, + oAuthUserInfoRequestMethodMatch, + ).map { match -> + match[0] to match.method }.forEach { (userPathStringIndex, method) -> val userPathStringInstruction = method.getInstruction(userPathStringIndex) val userPathStringRegister = userPathStringInstruction.registerA - val fixedUserPathString = userPathStringInstruction.getReference()!! - .string.replace("u/", "user/") + val fixedUserPathString = userPathStringInstruction.stringReference!!.string.replace("u/", "user/") method.replaceInstruction( userPathStringIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt index 9ddeaf9cf5..7f11752aee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt @@ -1,16 +1,16 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val parseRedditVideoNetworkResponseFingerprint = fingerprint { +internal val BytecodePatchContext.parseRedditVideoNetworkResponseMethodMatch by composingFirstMethod { + name("parseNetworkResponse") opcodes( Opcode.NEW_INSTANCE, Opcode.IGET_OBJECT, Opcode.INVOKE_DIRECT, Opcode.CONST_WIDE_32, ) - custom { methodDef, classDef -> - classDef.sourceFile == "RedditVideoRequest.java" && methodDef.name == "parseNetworkResponse" - } + custom { immutableClassDef.sourceFile == "RedditVideoRequest.java" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt index 64c33f308b..0baae8ab93 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c @@ -23,15 +23,15 @@ val fixVideoDownloadsPatch = bytecodePatch( "com.laurencedawson.reddit_sync.dev", ) - execute { - val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch!! - val newInstanceIndex = scanResult.startIndex - val invokeDirectIndex = scanResult.endIndex - 1 + apply { + val scanResult = parseRedditVideoNetworkResponseMethodMatch.indices[0] + val newInstanceIndex = scanResult.first() + val invokeDirectIndex = scanResult.last() - 1 val buildResponseInstruction = - parseRedditVideoNetworkResponseFingerprint.method.getInstruction(invokeDirectIndex) + parseRedditVideoNetworkResponseMethodMatch.method.getInstruction(invokeDirectIndex) - parseRedditVideoNetworkResponseFingerprint.method.addInstructions( + parseRedditVideoNetworkResponseMethodMatch.method.addInstructions( newInstanceIndex + 1, """ # Get byte array from response. diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt deleted file mode 100644 index 28ad4a0dbe..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.reddit.customclients.syncforreddit.fix.video - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated( - message = "Patch was move to a different package", - ReplaceWith("app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch") -) -@Suppress("unused") -val fixVideoDownloadsPatch = bytecodePatch { - dependsOn(app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch) - - compatibleWith( - "com.laurencedawson.reddit_sync", - "com.laurencedawson.reddit_sync.pro", - "com.laurencedawson.reddit_sync.dev", - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch.kt index 84ee7e2fd3..12f74f4f6d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.reddit.layout.disablescreenshotpopup -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,7 +10,7 @@ val disableScreenshotPopupPatch = bytecodePatch( ) { compatibleWith("com.reddit.frontpage") - execute { - disableScreenshotPopupFingerprint.method.addInstruction(0, "return-void") + apply { + disableScreenshotPopupMethod.addInstruction(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt index 09fe16247e..3e33c784ac 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt @@ -1,15 +1,15 @@ package app.revanced.patches.reddit.layout.disablescreenshotpopup -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val disableScreenshotPopupFingerprint = fingerprint { - returns("V") - parameters("Landroidx/compose/runtime/", "I") - custom { method, classDef -> - if (!classDef.endsWith("\$ScreenshotTakenBannerKt\$lambda-1\$1;")) { - return@custom false - } - - method.name == "invoke" - } +internal val BytecodePatchContext.disableScreenshotPopupMethod by gettingFirstMethodDeclaratively { + name("invoke") + definingClass($$"$ScreenshotTakenBannerKt$lambda-1$1;") + returnType("V") + parameterTypes("Landroidx/compose/runtime/", "I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt index 2eac1cbe26..b7e2dc0cb4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt @@ -1,10 +1,13 @@ package app.revanced.patches.reddit.layout.premiumicon -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val hasPremiumIconAccessFingerprint = fingerprint { - returns("Z") - custom { method, classDef -> - classDef.endsWith("MyAccount;") && method.name == "isPremiumSubscriber" - } +internal val BytecodePatchContext.hasPremiumIconAccessMethod by gettingFirstMethodDeclaratively { + name("isPremiumSubscriber") + definingClass("MyAccount;") + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt index 992ff27e5f..07f1eeaf4f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.reddit.layout.premiumicon -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val unlockPremiumIconsPatch = bytecodePatch( @@ -10,19 +10,7 @@ val unlockPremiumIconsPatch = bytecodePatch( ) { compatibleWith("com.reddit.frontpage") - execute { - hasPremiumIconAccessFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + hasPremiumIconAccessMethod.returnEarly(true) } } - -@Deprecated("Patch was renamed", ReplaceWith("unlockPremiumIconsPatch")) -@Suppress("unused") -val unlockPremiumIconPatch = bytecodePatch{ - dependsOn(unlockPremiumIconsPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt index 3381fd2bb2..e2896dc5ff 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt @@ -1,9 +1,12 @@ package app.revanced.patches.reddit.misc.tracking.url -import app.revanced.patcher.fingerprint +import app.revanced.patcher.custom +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.patch.BytecodePatchContext -internal val shareLinkFormatterFingerprint = fingerprint { - custom { _, classDef -> - classDef.startsWith("Lcom/reddit/sharing/") && classDef.sourceFile == "UrlUtil.kt" - } -} \ No newline at end of file +internal val BytecodePatchContext.shareLinkFormatterMethod by gettingFirstMethodDeclaratively { + definingClass("Lcom/reddit/sharing/") + custom { immutableClassDef.sourceFile == "UrlUtil.kt" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt index 11bc79212b..db58438184 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt @@ -1,21 +1,16 @@ package app.revanced.patches.reddit.misc.tracking.url -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") -val sanitizeUrlQueryPatch = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, +val sanitizeSharingLinksPatch = bytecodePatch( + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { compatibleWith("com.reddit.frontpage") - execute { - shareLinkFormatterFingerprint.method.addInstructions( - 0, - "return-object p0", - ) + apply { + shareLinkFormatterMethod.addInstructions(0, "return-object p0") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt index 35641f2e7e..6bdda5f28e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt @@ -6,14 +6,13 @@ import org.w3c.dom.Element @Suppress("unused") internal val addManifestPermissionsPatch = resourcePatch { - val requiredPermissions = listOf( "android.permission.READ_PHONE_STATE", "android.permission.FOREGROUND_SERVICE_MICROPHONE", "android.permission.RECORD_AUDIO", ) - execute { + apply { document("AndroidManifest.xml").use { document -> document.getElementsByTagName("manifest").item(0).let { manifestEl -> diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt index f842a45ccd..22a3e4c596 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt @@ -1,18 +1,13 @@ -@file:Suppress("unused") - package app.revanced.patches.samsung.radio.misc.fix.crash -import app.revanced.patcher.fingerprint -import app.revanced.patches.all.misc.transformation.IMethodCall -import app.revanced.patches.all.misc.transformation.fromMethodReference -import app.revanced.util.getReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val permissionRequestListFingerprint = fingerprint { - strings( - "android.permission.POST_NOTIFICATIONS", - "android.permission.READ_MEDIA_AUDIO", - "android.permission.RECORD_AUDIO" - ) - custom { method, _ -> method.name == "" } +internal val BytecodePatchContext.permissionRequestListMethod by gettingFirstMethodDeclaratively( + "android.permission.POST_NOTIFICATIONS", + "android.permission.READ_MEDIA_AUDIO", + "android.permission.RECORD_AUDIO" +) { + name("") } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt index a076ca8302..e405585b19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt @@ -1,9 +1,8 @@ -@file:Suppress("unused") package app.revanced.patches.samsung.radio.misc.fix.crash -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.samsung.radio.restrictions.device.bypassDeviceChecksPatch import app.revanced.util.findInstructionIndicesReversedOrThrow @@ -13,15 +12,17 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch;" -val fixCrashPatch = bytecodePatch( - name = "Fix crashes", description = "Prevents the app from crashing because of missing system permissions." +@Suppress("unused") +val fixCrashesPatch = bytecodePatch( + name = "Fix crashes", + description = "Prevents the app from crashing because of missing system permissions.", ) { dependsOn(addManifestPermissionsPatch, bypassDeviceChecksPatch) extendWith("extensions/samsung/radio.rve") compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11")) - execute { - permissionRequestListFingerprint.method.apply { + apply { + permissionRequestListMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.FILLED_NEW_ARRAY).forEach { filledNewArrayIndex -> val moveResultIndex = indexOfFirstInstruction(filledNewArrayIndex, Opcode.MOVE_RESULT_OBJECT) if (moveResultIndex < 0) return@forEach // No move-result-object found after the filled-new-array @@ -31,12 +32,13 @@ val fixCrashPatch = bytecodePatch( // Invoke the method from the extension addInstructions( - moveResultIndex + 1, """ + moveResultIndex + 1, + """ invoke-static { v$arrayRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->fixPermissionRequestList([Ljava/lang/String;)[Ljava/lang/String; move-result-object v$arrayRegister - """ + """, ) } } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt index 68ef9a8011..f3b2e9f080 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.samsung.radio.restrictions.device -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.findFreeRegister import app.revanced.util.getReference @@ -16,40 +16,38 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val bypassDeviceChecksPatch = bytecodePatch( name = "Bypass device checks", description = "Removes firmware and region blacklisting. " + - "This patch will still not allow the app to run on devices that do not have the required hardware.", + "This patch will still not allow the app to run on devices that do not have the required hardware.", ) { extendWith("extensions/samsung/radio.rve") compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11")) - execute { - // Return false = The device is not blacklisted - checkDeviceFingerprint.method.apply { - // Find the first string that start with "SM-", that's the list of incompatible devices - val firstStringIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.CONST_STRING && - getReference()?.string?.startsWith("SM-") == true - } - - // Find the following filled-new-array (or filled-new-array/range) instruction - val filledNewArrayIndex = indexOfFirstInstructionOrThrow(firstStringIndex + 1) { - opcode == Opcode.FILLED_NEW_ARRAY || opcode == Opcode.FILLED_NEW_ARRAY_RANGE - } - - // Find an available register for our use - val resultRegister = findFreeRegister(filledNewArrayIndex + 1) - - // Store the array there and invoke the method that we added to the class earlier - addInstructions( - filledNewArrayIndex + 1, """ - move-result-object v$resultRegister - invoke-static { v$resultRegister }, $EXTENSION_CLASS_DESCRIPTOR->checkIfDeviceIsIncompatible([Ljava/lang/String;)Z - move-result v$resultRegister - return v$resultRegister - """ - ) - - // Remove the instructions before our strings - removeInstructions(0, firstStringIndex) + apply { + // Find the first string that start with "SM-", that's the list of incompatible devices. + val firstStringIndex = checkDeviceMethod.indexOfFirstInstructionOrThrow { + opcode == Opcode.CONST_STRING && + getReference()?.string?.startsWith("SM-") == true } + + // Find the following filled-new-array (or filled-new-array/range) instruction. + val filledNewArrayIndex = checkDeviceMethod.indexOfFirstInstructionOrThrow(firstStringIndex + 1) { + opcode == Opcode.FILLED_NEW_ARRAY || opcode == Opcode.FILLED_NEW_ARRAY_RANGE + } + + val resultRegister = checkDeviceMethod.findFreeRegister(filledNewArrayIndex + 1) + + // Store the array there and invoke the method that we added to the class earlier. + checkDeviceMethod.addInstructions( + filledNewArrayIndex + 1, + """ + move-result-object v$resultRegister + invoke-static { v$resultRegister }, $EXTENSION_CLASS_DESCRIPTOR->checkIfDeviceIsIncompatible([Ljava/lang/String;)Z + move-result v$resultRegister + return v$resultRegister + """, + ) + + // Remove the instructions before our strings. + // Return false = The device is not blacklisted. + checkDeviceMethod.removeInstructions(0, firstStringIndex) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt index 4768235910..f5cb7fce10 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt @@ -1,61 +1,30 @@ package app.revanced.patches.samsung.radio.restrictions.device -import app.revanced.patcher.fingerprint -import app.revanced.patches.all.misc.transformation.IMethodCall -import app.revanced.patches.all.misc.transformation.fromMethodReference -import app.revanced.util.getReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference +import com.android.tools.smali.dexlib2.util.MethodUtil -internal val checkDeviceFingerprint = fingerprint { - returns("Z") - custom { method, _ -> - /* Check for methods call to: - - Landroid/os/SemSystemProperties;->getSalesCode()Ljava/lang/String; - - Landroid/os/SemSystemProperties;->getCountryIso()Ljava/lang/String; - */ - - val impl = method.implementation ?: return@custom false - - // Track which target methods we've found - val foundMethods = mutableSetOf() - - // Scan method instructions for calls to our target methods - for (instr in impl.instructions) { - val ref = instr.getReference() ?: continue - val mc = fromMethodReference(ref) ?: continue - - if (mc == MethodCall.GetSalesCode || mc == MethodCall.GetCountryIso) { - foundMethods.add(mc) - - // If we found both methods, return success - if (foundMethods.size == 2) { - return@custom true - } - } - } - - // Only match if both methods are present - return@custom false - } +internal val BytecodePatchContext.checkDeviceMethod by gettingFirstMethodDeclaratively { + returnType("Z") + instructions( + predicates = unorderedAllOf( + method { MethodUtil.methodSignaturesMatch(getSalesCodeMethodReference, this) }, + method { MethodUtil.methodSignaturesMatch(getCountryIsoMethodReference, this) } + )) } -// Information about method calls we want to replace -private enum class MethodCall( - override val definedClassName: String, - override val methodName: String, - override val methodParams: Array, - override val returnType: String, -) : IMethodCall { - GetSalesCode( - "Landroid/os/SemSystemProperties;", - "getSalesCode", - arrayOf(), - "Ljava/lang/String;", - ), - GetCountryIso( - "Landroid/os/SemSystemProperties;", - "getCountryIso", - arrayOf(), - "Ljava/lang/String;", - ), -} \ No newline at end of file +val getSalesCodeMethodReference = ImmutableMethodReference( + "Landroid/os/SemSystemProperties;", + "getSalesCode", + emptyList(), + "Ljava/lang/String;", +) + +val getCountryIsoMethodReference = ImmutableMethodReference( + "Landroid/os/SemSystemProperties;", + "getCountryIso", + emptyList(), + "Ljava/lang/String;", +) + diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt index f7efe3103f..f33929f1e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.serviceportalbund.detection.root +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val rootDetectionFingerprint = fingerprint { +internal val BytecodePatchContext.rootDetectionMethod by gettingFirstMethodDeclaratively { + definingClass("/DeviceIntegrityCheck;") accessFlags(AccessFlags.PUBLIC) - returns("V") - custom { _, classDef -> - classDef.endsWith("/DeviceIntegrityCheck;") - } -} \ No newline at end of file + returnType("V") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt index 0c9fd90400..244af68213 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt @@ -1,18 +1,16 @@ package app.revanced.patches.serviceportalbund.detection.root -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION -import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION +import app.revanced.util.returnEarly @Suppress("unused") -val rootDetectionPatch = bytecodePatch( - name = PATCH_NAME_REMOVE_ROOT_DETECTION, - description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +val removeRootDetectionPatch = bytecodePatch( + name = "Remove root detection", + description = "Removes the check for root permissions and unlocked bootloader.", ) { compatibleWith("at.gv.bka.serviceportal") - execute { - rootDetectionFingerprint.method.addInstruction(0, "return-void") + apply { + rootDetectionMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index df927dd4a7..035523a62d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -1,11 +1,13 @@ package app.revanced.patches.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val castContextFetchFingerprint = fingerprint { - strings("Error fetching CastContext.") -} +internal val BytecodePatchContext.castContextFetchMethod by gettingFirstMethodDeclaratively( + "Error fetching CastContext." +) -internal val primeMethodFingerprint = fingerprint { - strings("com.google.android.GoogleCamera", "com.android.vending") -} +internal val BytecodePatchContext.primeMethod by gettingFirstMethodDeclaratively( + "com.android.vending", + "com.google.android.GoogleCamera" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt b/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt deleted file mode 100644 index 44f6bbca76..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.shared - -// -// Names and descriptions used by different patches implementing the same feature. -// - -internal const val PATCH_NAME_REMOVE_ROOT_DETECTION = "Remove root detection" -internal const val PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION = "Removes the check for root permissions and unlocked bootloader." - -internal const val PATCH_NAME_SANITIZE_SHARING_LINKS = "Sanitize sharing links" -internal const val PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS = "Removes the tracking query parameters from shared links." - -internal const val PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN = "Change link sharing domain" -internal const val PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN = "Replaces the domain name of shared links." - -internal const val PATCH_NAME_HIDE_NAVIGATION_BUTTONS = "Hide navigation buttons" diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt index 629a53e2e8..933af78824 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt @@ -10,7 +10,7 @@ import java.nio.file.Files * This patch must be a dependency for all patches that add ReVanced branding to the target app. */ internal val addBrandLicensePatch = rawResourcePatch { - execute { + apply { val brandingLicenseFileName = "LICENSE_REVANCED.TXT" val inputFileStream = inputStreamFromBundledResource( diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt index a2b88d7f1c..750dee5fdf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -1,32 +1,17 @@ package app.revanced.patches.shared.layout.branding -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.ResourcePatchBuilder -import app.revanced.patcher.patch.ResourcePatchContext -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.patch.stringOption +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.patch.* import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.ListPreference -import app.revanced.util.ResourceGroup +import app.revanced.util.* import app.revanced.util.Utils.trimIndentMultiline -import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.copyResources -import app.revanced.util.findElementByAttributeValueOrThrow -import app.revanced.util.findInstructionIndicesReversedOrThrow -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import app.revanced.util.removeFromParent -import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @@ -42,13 +27,13 @@ private val mipmapDirectories = mapOf( "mipmap-hdpi" to "162x162 px", "mipmap-xhdpi" to "216x216 px", "mipmap-xxhdpi" to "324x324 px", - "mipmap-xxxhdpi" to "432x432 px" + "mipmap-xxxhdpi" to "432x432 px", ) private val iconStyleNames = arrayOf( "rounded", "minimal", - "scaled" + "scaled", ) private const val ORIGINAL_USER_ICON_STYLE_NAME = "original" @@ -62,10 +47,11 @@ private const val NOTIFICATION_ICON_NAME = "revanced_notification_icon" private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf( "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", - "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png" + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", ) -private const val USER_CUSTOM_MONOCHROME_FILE_NAME = "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" +private const val USER_CUSTOM_MONOCHROME_FILE_NAME = + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" private const val USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME = "${NOTIFICATION_ICON_NAME}_$CUSTOM_USER_ICON_STYLE_NAME.xml" internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;" @@ -80,26 +66,24 @@ internal fun baseCustomBrandingPatch( originalAppPackageName: String, isYouTubeMusic: Boolean, numberOfPresetAppNames: Int, - mainActivityOnCreateFingerprint: Fingerprint, + getMainActivityOnCreate: BytecodePatchContext.() -> MutableMethod, mainActivityName: String, activityAliasNameWithIntents: String, preferenceScreen: BasePreferenceScreen.Screen, block: ResourcePatchBuilder.() -> Unit, - executeBlock: ResourcePatchContext.() -> Unit = {} -): ResourcePatch = resourcePatch( + executeBlock: ResourcePatchContext.() -> Unit = {}, +) = resourcePatch( name = "Custom branding", description = "Adds options to change the app icon and app name. " + - "Branding cannot be changed for mounted (root) installations." + "Branding cannot be changed for mounted (root) installations.", ) { val customName by stringOption( - key = "customName", - title = "App name", - description = "Custom app name." + name = "App name", + description = "Custom app name.", ) val customIcon by stringOption( - key = "customIcon", - title = "Custom icon", + name = "Custom icon", description = """ Folder with images to use as a custom icon. @@ -115,7 +99,7 @@ internal fun baseCustomBrandingPatch( Optionally, the path contains a 'drawable' folder with any of the monochrome icon files: $USER_CUSTOM_MONOCHROME_FILE_NAME $USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME - """.trimIndentMultiline() + """.trimIndentMultiline(), ) block() @@ -125,15 +109,15 @@ internal fun baseCustomBrandingPatch( resourceMappingPatch, addBrandLicensePatch, bytecodePatch { - execute { - mainActivityOnCreateFingerprint.method.addInstruction( + apply { + getMainActivityOnCreate().addInstruction( 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V" + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V", ) - numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames) + numberOfPresetAppNamesExtensionMethod.returnEarly(numberOfPresetAppNames) - notificationFingerprint.method.apply { + notificationMethod.apply { val getBuilderIndex = if (isYouTubeMusic) { // YT Music the field is not a plain object type. indexOfFirstInstructionOrThrow { @@ -144,7 +128,7 @@ internal fun baseCustomBrandingPatch( val builderCastIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.CHECK_CAST && - reference?.type == "Landroid/app/Notification\$Builder;" + reference?.type == "Landroid/app/Notification\$Builder;" } indexOfFirstInstructionReversedOrThrow(builderCastIndex) { getReference()?.type == "Ljava/lang/Object;" @@ -155,7 +139,7 @@ internal fun baseCustomBrandingPatch( .getReference() findInstructionIndicesReversedOrThrow( - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ).forEach { index -> addInstructionsAtControlFlowLabel( index, @@ -164,7 +148,7 @@ internal fun baseCustomBrandingPatch( iget-object v0, v0, $builderFieldName check-cast v0, Landroid/app/Notification${'$'}Builder; invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setNotificationIcon(Landroid/app/Notification${'$'}Builder;)V - """ + """, ) } } @@ -172,32 +156,32 @@ internal fun baseCustomBrandingPatch( }, ) - finalize { + afterDependents { // Can only check if app is root installation by checking if change package name patch is in use. - // and can only do that in the finalize block here. - // The UI preferences cannot be selectively added here, because the settings finalize block + // and can only do that in the afterDependents block here. + // The UI preferences cannot be selectively added here, because the settings afterDependents block // may have already run and the settings are already wrote to file. // Instead, show a warning if any patch option was used (A rooted device launcher ignores the manifest changes), // and the non-functional in-app settings are removed on app startup by extension code. if (customName != null || customIcon != null) { if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { Logger.getLogger(this::class.java.name).warning( - "Custom branding does not work with root installation. No changes applied." + "Custom branding does not work with root installation. No changes applied.", ) } } } - execute { + apply { addResources("shared", "layout.branding.baseCustomBrandingPatch") addResources(addResourcePatchName, "layout.branding.customBrandingPatch") preferenceScreen.addPreferences( - if (customName != null ) { + if (customName != null) { ListPreference( key = "revanced_custom_branding_name", entriesKey = "revanced_custom_branding_name_custom_entries", - entryValuesKey = "revanced_custom_branding_name_custom_entry_values" + entryValuesKey = "revanced_custom_branding_name_custom_entry_values", ) } else { ListPreference("revanced_custom_branding_name") @@ -206,11 +190,11 @@ internal fun baseCustomBrandingPatch( ListPreference( key = "revanced_custom_branding_icon", entriesKey = "revanced_custom_branding_icon_custom_entries", - entryValuesKey = "revanced_custom_branding_icon_custom_entry_values" + entryValuesKey = "revanced_custom_branding_icon_custom_entry_values", ) } else { ListPreference("revanced_custom_branding_icon") - } + }, ) val useCustomName = customName != null @@ -227,8 +211,8 @@ internal fun baseCustomBrandingPatch( ), ResourceGroup( "mipmap-anydpi", - "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml" - ) + "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml", + ), ) } @@ -237,19 +221,19 @@ internal fun baseCustomBrandingPatch( // Push notification 'small' icon. ResourceGroup( "drawable", - "$NOTIFICATION_ICON_NAME.xml" + "$NOTIFICATION_ICON_NAME.xml", ), // Copy template user icon, because the aliases must be added even if no user icon is provided. ResourceGroup( "drawable", USER_CUSTOM_MONOCHROME_FILE_NAME, - USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME, ), ResourceGroup( "mipmap-anydpi", - "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" - ) + "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ), ) // Copy template icon files. @@ -260,7 +244,7 @@ internal fun baseCustomBrandingPatch( dpi, "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", - ) + ), ) } @@ -272,7 +256,7 @@ internal fun baseCustomBrandingPatch( appNameIndex: Int, useCustomName: Boolean, enabled: Boolean, - intents: NodeList + intents: NodeList, ): Element { val label = if (useCustomName) { if (customName == null) { @@ -309,7 +293,7 @@ internal fun baseCustomBrandingPatch( } else { for (i in 0 until intents.length) { alias.appendChild( - intents.item(i).cloneNode(true) + intents.item(i).cloneNode(true), ) } } @@ -320,7 +304,7 @@ internal fun baseCustomBrandingPatch( val application = document.getElementsByTagName("application").item(0) as Element val intentFilters = document.childNodes.findElementByAttributeValueOrThrow( "android:name", - activityAliasNameWithIntents + activityAliasNameWithIntents, ).childNodes // The YT application name can appear in some places along side the system @@ -329,10 +313,10 @@ internal fun baseCustomBrandingPatch( // use a custom name for this situation to disambiguate which app is which. application.setAttribute( "android:label", - "@string/revanced_custom_branding_name_entry_2" + "@string/revanced_custom_branding_name_entry_2", ) - for (appNameIndex in 1 .. numberOfPresetAppNames) { + for (appNameIndex in 1..numberOfPresetAppNames) { fun aliasName(name: String): String = ".revanced_" + name + '_' + appNameIndex val useCustomNameLabel = (useCustomName && appNameIndex == numberOfPresetAppNames) @@ -345,12 +329,12 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = (appNameIndex == 1), - intentFilters - ) + intentFilters, + ), ) // Bundled icons. - iconStyleNames.forEachIndexed { index, style -> + iconStyleNames.forEach { style -> application.appendChild( createAlias( aliasName = aliasName(style), @@ -358,8 +342,8 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = false, - intentFilters - ) + intentFilters, + ), ) } @@ -378,8 +362,8 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = false, - intentFilters - ) + intentFilters, + ), ) } @@ -387,7 +371,7 @@ internal fun baseCustomBrandingPatch( // can be shown in the launcher. Can only be done after adding the new aliases. intentFilters.findElementByAttributeValueOrThrow( "android:name", - "android.intent.action.MAIN" + "android.intent.action.MAIN", ).removeFromParent() } @@ -399,13 +383,13 @@ internal fun baseCustomBrandingPatch( if (!iconPathFile.exists()) { throw PatchException( - "The custom icon path cannot be found: " + iconPathFile.absolutePath + "The custom icon path cannot be found: " + iconPathFile.absolutePath, ) } if (!iconPathFile.isDirectory) { throw PatchException( - "The custom icon path must be a folder: " + iconPathFile.absolutePath + "The custom icon path must be a folder: " + iconPathFile.absolutePath, ) } @@ -413,8 +397,8 @@ internal fun baseCustomBrandingPatch( var copiedFiles = false // For each source folder, copy the files to the target resource directories. - iconPathFile.listFiles { - file -> file.isDirectory && file.name in mipmapDirectories + iconPathFile.listFiles { file -> + file.isDirectory && file.name in mipmapDirectories }!!.forEach { dpiSourceFolder -> val targetDpiFolder = resourceDirectory.resolve(dpiSourceFolder.name) if (!targetDpiFolder.exists()) { @@ -427,8 +411,10 @@ internal fun baseCustomBrandingPatch( }!! if (customFiles.isNotEmpty() && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) { - throw PatchException("Must include all required icon files " + - "but only found " + customFiles.map { it.name }) + throw PatchException( + "Must include all required icon files " + + "but only found " + customFiles.map { it.name }, + ) } customFiles.forEach { imgSourceFile -> @@ -442,23 +428,25 @@ internal fun baseCustomBrandingPatch( // Copy monochrome and small notification icon if it provided. arrayOf( USER_CUSTOM_MONOCHROME_FILE_NAME, - USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME, ).forEach { fileName -> val relativePath = "drawable/$fileName" val file = iconPathFile.resolve(relativePath) if (file.exists()) { file.copyTo( target = resourceDirectory.resolve(relativePath), - overwrite = true + overwrite = true, ) copiedFiles = true } } if (!copiedFiles) { - throw PatchException("Expected to find directories and files: " - + USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() - + "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath) + throw PatchException( + "Expected to find directories and files: " + + USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() + + "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt index 8e99078d5c..074bff4f28 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -1,21 +1,22 @@ package app.revanced.patches.shared.layout.branding -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.numberOfPresetAppNamesExtensionMethod by gettingFirstMethodDeclaratively { + name("numberOfPresetAppNames") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("I") - parameters() - custom { method, classDef -> - method.name == "numberOfPresetAppNames" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("I") + parameterTypes() } -// A much simpler fingerprint exists that can set the small icon (contains string "414843287017"), -// but that has limited usage and this fingerprint allows changing any part of the notification. -internal val notificationFingerprint = fingerprint { +// A much simpler method exists that can set the small icon (contains string "414843287017"), +// but that has limited usage and this one allows changing any part of the notification. +internal val BytecodePatchContext.notificationMethod by gettingFirstMethodDeclaratively( + "key_action_priority", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - strings("key_action_priority") + parameterTypes("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt index 53269677a4..aa13dc7e0c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt @@ -11,11 +11,12 @@ import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference +import kotlin.collections.toTypedArray internal fun hideLayoutComponentsPatch( - lithoFilterPatch: Patch<*>, - settingsPatch: Patch<*>, - additionalDependencies: Set> = emptySet(), + lithoFilterPatch: Patch, + settingsPatch: Patch, + additionalDependencies: Set = emptySet(), filterClasses: Set, vararg compatibleWithPackages: Pair?>, executeBlock: BytecodePatchContext.() -> Unit = {}, @@ -32,7 +33,7 @@ internal fun hideLayoutComponentsPatch( compatibleWith(packages = compatibleWithPackages) - execute { + apply { addResources("shared", "layout.hide.general.hideLayoutComponentsPatch") PreferenceScreen.GENERAL.addPreferences( @@ -46,9 +47,7 @@ internal fun hideLayoutComponentsPatch( ), ) - filterClasses.forEach { className -> - addLithoFilter(className) - } + filterClasses.forEach { className -> addLithoFilter(className) } executeBlock() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt index 40fb779806..cd298fbb86 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt @@ -1,13 +1,8 @@ package app.revanced.patches.shared.layout.theme -import app.revanced.patcher.patch.BytecodePatchBuilder -import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.patch.stringOption +import app.revanced.patcher.patch.* import app.revanced.util.childElementsSequence -import java.util.Locale +import java.util.* internal const val THEME_COLOR_OPTION_DESCRIPTION = "Can be a hex color (#RRGGBB) or a color resource reference." @@ -56,7 +51,8 @@ internal fun validateColorName(colorString: String): Boolean { * Dark theme color option for YouTube and YT Music Theme patches. */ internal val darkThemeBackgroundColorOption = stringOption( - key = "darkThemeBackgroundColor", + name = "Dark theme background color", + description = THEME_COLOR_OPTION_DESCRIPTION, default = "@android:color/black", values = mapOf( "Pure black" to "@android:color/black", @@ -69,9 +65,7 @@ internal val darkThemeBackgroundColorOption = stringOption( "Dark yellow" to "#282900", "Dark orange" to "#291800", "Dark red" to "#290000", - ), - title = "Dark theme background color", - description = THEME_COLOR_OPTION_DESCRIPTION + ) ) /** @@ -92,7 +86,7 @@ internal fun baseThemePatch( dependsOn(lithoColorHookPatch) - execute { + apply { executeBlock() lithoColorOverrideHook(extensionClassDescriptor, "getValue") @@ -104,10 +98,9 @@ internal fun baseThemeResourcePatch( lightColorNames: Set = THEME_DEFAULT_LIGHT_COLOR_NAMES, lightColorReplacement: (() -> String)? = null ) = resourcePatch { - - execute { + apply { // After patch option validators are fixed https://github.com/ReVanced/revanced-patcher/issues/372 - // This should changed to a patch option validator. + // This should be changed to a patch option validator. val darkColor by darkThemeBackgroundColorOption if (!validateColorName(darkColor!!)) { throw PatchException("Invalid dark theme color: $darkColor") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt index 41a0427966..c3c7e3d4c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt @@ -1,24 +1,40 @@ package app.revanced.patches.shared.layout.theme -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoOnBoundsChangeFingerprint = fingerprint { +internal val BytecodePatchContext.lithoOnBoundsChangeMethodMatch by composingFirstMethod { + name("onBoundsChange") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returns("V") - parameters("Landroid/graphics/Rect;") - opcodes( - Opcode.IGET, - Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_NEZ, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, - ) - custom { method, _ -> - method.name == "onBoundsChange" + returnType("V") + parameterTypes("Landroid/graphics/Rect;") + + lateinit var methodDefiningClass: String + custom { + methodDefiningClass = definingClass + true } + + instructions( + allOf( + Opcode.IPUT_OBJECT(), + field { type == "Landroid/graphics/Path;" && definingClass == methodDefiningClass }, + ), + afterAtMost( + 5, + method { returnType == "Z" && name == "isStateful" && definingClass == methodDefiningClass }, + ), + afterAtMost( + 5, + allOf( + Opcode.IGET_OBJECT(), + field { type == "Landroid/graphics/Paint;" && definingClass == methodDefiningClass }, + ), + ), + after( + method { toString() == "Landroid/graphics/Paint;->setColor(I)V" }, + ), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt index bfa1259a02..6844d9db4e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.shared.layout.theme -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch lateinit var lithoColorOverrideHook: (targetMethodClass: String, targetMethodName: String) -> Unit @@ -10,16 +10,16 @@ val lithoColorHookPatch = bytecodePatch( description = "Adds a hook to set color of Litho components.", ) { - execute { - var insertionIndex = lithoOnBoundsChangeFingerprint.patternMatch!!.endIndex - 1 + apply { + var insertionIndex = lithoOnBoundsChangeMethodMatch[-1] - 1 lithoColorOverrideHook = { targetMethodClass, targetMethodName -> - lithoOnBoundsChangeFingerprint.method.addInstructions( + lithoOnBoundsChangeMethodMatch.method.addInstructions( insertionIndex, """ invoke-static { p1 }, $targetMethodClass->$targetMethodName(I)I move-result p1 - """ + """, ) insertionIndex += 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index 6d6b0b662f..50f48aaf2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -1,26 +1,19 @@ package app.revanced.patches.shared.misc.audio -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val formatStreamModelToStringFingerprint = fingerprint { +internal val BytecodePatchContext.formatStreamModelToStringMethodMatch by composingFirstMethod { + name("toString") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - custom { method, _ -> - method.name == "toString" - } - strings( - // Strings are partial matches. - "isDefaultAudioTrack=", - "audioTrackId=" + returnType("Ljava/lang/String;") + instructions( + "isDefaultAudioTrack="(String::contains), + "audioTrackId="(String::contains), ) } -internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L - -internal val selectAudioStreamFingerprint = fingerprint { - literal { - AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG - } +internal val BytecodePatchContext.selectAudioStreamMethodMatch by composingFirstMethod { + instructions(45666189L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt index 010a7143e6..6360709519 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -1,15 +1,15 @@ package app.revanced.patches.shared.misc.audio -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen @@ -35,120 +35,120 @@ internal fun forceOriginalAudioPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, fixUseLocalizedAudioTrackFlag: BytecodePatchContext.() -> Boolean, - mainActivityOnCreateFingerprint: Fingerprint, + getMainActivityOnCreateMethod: BytecodePatchContext.() -> MutableMethod, subclassExtensionClassDescriptor: String, - preferenceScreen: BasePreferenceScreen.Screen + preferenceScreen: BasePreferenceScreen.Screen, ) = bytecodePatch( name = "Force original audio", description = "Adds an option to always use the original audio track.", ) { - block() dependsOn(addResourcesPatch) - execute { + apply { addResources("shared", "misc.audio.forceOriginalAudioPatch") preferenceScreen.addPreferences( SwitchPreference( key = "revanced_force_original_audio", - tag = "app.revanced.extension.shared.settings.preference.ForceOriginalAudioSwitchPreference" - ) + tag = "app.revanced.extension.shared.settings.preference.ForceOriginalAudioSwitchPreference", + ), ) - mainActivityOnCreateFingerprint.method.addInstruction( + getMainActivityOnCreateMethod().addInstruction( 0, - "invoke-static { }, $subclassExtensionClassDescriptor->setEnabled()V" + "invoke-static { }, $subclassExtensionClassDescriptor->setEnabled()V", ) // Disable feature flag that ignores the default track flag // and instead overrides to the user region language. if (fixUseLocalizedAudioTrackFlag()) { - selectAudioStreamFingerprint.method.insertLiteralOverride( - AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z" + selectAudioStreamMethodMatch.method.insertLiteralOverride( + selectAudioStreamMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z", ) } - formatStreamModelToStringFingerprint.let { - val isDefaultAudioTrackMethod = it.originalMethod.findMethodFromToString("isDefaultAudioTrack=") - val audioTrackDisplayNameMethod = it.originalMethod.findMethodFromToString("audioTrackDisplayName=") - val audioTrackIdMethod = it.originalMethod.findMethodFromToString("audioTrackId=") + val isDefaultAudioTrackMethod = + formatStreamModelToStringMethodMatch.immutableMethod.findMethodFromToString("isDefaultAudioTrack=") + val audioTrackDisplayNameMethod = + formatStreamModelToStringMethodMatch.immutableMethod.findMethodFromToString("audioTrackDisplayName=") + val audioTrackIdMethod = + formatStreamModelToStringMethodMatch.immutableMethod.findMethodFromToString("audioTrackId=") - it.classDef.apply { - // Add a new field to store the override. - val helperFieldName = "patch_isDefaultAudioTrackOverride" - fields.add( - ImmutableField( - type, - helperFieldName, - "Ljava/lang/Boolean;", - // Boolean is a 100% immutable class (all fields are final) - // and safe to write to a shared field without volatile/synchronization, - // but without volatile the field can show stale data - // and the same field is calculated more than once by different threads. - AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value, - null, - null, - null - ).toMutable() + formatStreamModelToStringMethodMatch.classDef.apply { + // Add a new field to store the override. + val helperFieldName = "patch_isDefaultAudioTrackOverride" + fields.add( + ImmutableField( + type, + helperFieldName, + "Ljava/lang/Boolean;", + // Boolean is a 100% immutable class (all fields are final) + // and safe to write to a shared field without volatile/synchronization, + // but without volatile the field can show stale data + // and the same field is calculated more than once by different threads. + AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value, + null, + null, + null, + ).toMutable(), + ) + + // Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed. + val helperMethodClass = type + val helperMethodName = "patch_isDefaultAudioTrack" + val helperMethod = ImmutableMethod( + helperMethodClass, + helperMethodName, + listOf(ImmutableMethodParameter("Z", null, null)), + "Z", + AccessFlags.PRIVATE.value, + null, + null, + MutableMethodImplementation(6), + ).toMutable().apply { + addInstructionsWithLabels( + 0, + """ + iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; + if-eqz v0, :call_extension + invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z + move-result v3 + return v3 + + :call_extension + invoke-virtual { p0 }, $audioTrackIdMethod + move-result-object v1 + + invoke-virtual { p0 }, $audioTrackDisplayNameMethod + move-result-object v2 + + invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z + move-result v3 + + invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; + move-result-object v0 + iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; + return v3 + """, ) + } + methods.add(helperMethod) - // Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed. - val helperMethodClass = type - val helperMethodName = "patch_isDefaultAudioTrack" - val helperMethod = ImmutableMethod( - helperMethodClass, - helperMethodName, - listOf(ImmutableMethodParameter("Z", null, null)), - "Z", - AccessFlags.PRIVATE.value, - null, - null, - MutableMethodImplementation(6), - ).toMutable().apply { - addInstructionsWithLabels( - 0, - """ - iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - if-eqz v0, :call_extension - invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z - move-result v3 - return v3 - - :call_extension - invoke-virtual { p0 }, $audioTrackIdMethod - move-result-object v1 - - invoke-virtual { p0 }, $audioTrackDisplayNameMethod - move-result-object v2 - - invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z - move-result v3 - - invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; - move-result-object v0 - iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - return v3 - """ - ) - } - methods.add(helperMethod) + // Modify isDefaultAudioTrack() to call extension helper method. + isDefaultAudioTrackMethod.apply { + val index = indexOfFirstInstructionOrThrow(Opcode.RETURN) + val register = getInstruction(index).registerA - // Modify isDefaultAudioTrack() to call extension helper method. - isDefaultAudioTrackMethod.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.RETURN) - val register = getInstruction(index).registerA - - addInstructions( - index, - """ + addInstructions( + index, + """ invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z move-result v$register - """ - ) - } + """, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt index 73fcb1cc24..dafda23bdd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt @@ -1,13 +1,15 @@ package app.revanced.patches.shared.misc.checks import android.os.Build.* -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableEncodedValue +import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableLongEncodedValue +import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableStringEncodedValue +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableEncodedValue -import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableLongEncodedValue -import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableStringEncodedValue import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import com.android.tools.smali.dexlib2.immutable.value.ImmutableLongEncodedValue @@ -21,8 +23,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/checks/CheckEnvironmentPatch;" fun checkEnvironmentPatch( - mainActivityOnCreateFingerprint: Fingerprint, - extensionPatch: Patch<*>, + getMainActivityOnCreateMethod: BytecodePatchContext.() -> MutableMethod, + extensionPatch: Patch, vararg compatiblePackages: String, ) = bytecodePatch( description = "Checks, if the application was patched by, otherwise warns the user.", @@ -34,24 +36,24 @@ fun checkEnvironmentPatch( addResourcesPatch, ) - execute { + apply { addResources("shared", "misc.checks.checkEnvironmentPatch") fun setPatchInfo() { - fun Fingerprint.setClassFields(vararg fieldNameValues: Pair) { + fun MutableClassDef.setClassFields(vararg fieldNameValues: Pair) { val fieldNameValueMap = mapOf(*fieldNameValues) - classDef.fields.forEach { field -> + fields.forEach { field -> field.initialValue = fieldNameValueMap[field.name] ?: return@forEach } } - patchInfoFingerprint.setClassFields( + patchInfoClassDef.setClassFields( "PATCH_TIME" to System.currentTimeMillis().encoded, ) fun setBuildInfo() { - patchInfoBuildFingerprint.setClassFields( + patchInfoBuildClassDef.setClassFields( "PATCH_BOARD" to BOARD.encodedAndHashed, "PATCH_BOOTLOADER" to BOOTLOADER.encodedAndHashed, "PATCH_BRAND" to BRAND.encodedAndHashed, @@ -82,7 +84,7 @@ fun checkEnvironmentPatch( } } - fun invokeCheck() = mainActivityOnCreateFingerprint.method.addInstruction( + fun invokeCheck() = getMainActivityOnCreateMethod().addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->check(Landroid/app/Activity;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt index 0eabd2f547..237344acb2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.shared.misc.checks -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstClassDefDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val patchInfoFingerprint = fingerprint { - custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo;" } -} +internal val BytecodePatchContext.patchInfoClassDef by gettingFirstClassDefDeclaratively( + "Lapp/revanced/extension/shared/checks/PatchInfo;" +) -internal val patchInfoBuildFingerprint = fingerprint { - custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo\$Build;" } -} +internal val BytecodePatchContext.patchInfoBuildClassDef by gettingFirstClassDefDeclaratively( + $$"Lapp/revanced/extension/shared/checks/PatchInfo$Build;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt index dd00a6ebac..aa8bb88bf8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.shared.misc.debugging -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -20,8 +21,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = * Patch shared with YouTube and YT Music. */ internal fun enableDebuggingPatch( - sharedExtensionPatch: Patch<*>, - settingsPatch: Patch<*>, + sharedExtensionPatch: Patch, + settingsPatch: Patch, vararg compatibleWithPackages: Pair>, hookStringFeatureFlag: Boolean, preferenceScreen: BasePreferenceScreen.Screen, @@ -36,7 +37,7 @@ internal fun enableDebuggingPatch( settingsPatch, addResourcesPatch, resourcePatch { - execute { + apply { copyResources( "settings", ResourceGroup( @@ -49,15 +50,14 @@ internal fun enableDebuggingPatch( "revanced_settings_arrow_left_double.xml", "revanced_settings_arrow_left_one.xml", "revanced_settings_arrow_right_double.xml", - "revanced_settings_arrow_right_one.xml" - ) + "revanced_settings_arrow_right_one.xml", + ), ) } - } + }, ) - - execute { + apply { addResources("shared", "misc.debugging.enableDebuggingPatch") val preferences = setOf( @@ -68,18 +68,18 @@ internal fun enableDebuggingPatch( NonInteractivePreference( "revanced_debug_export_logs_to_clipboard", tag = "app.revanced.extension.shared.settings.preference.ExportLogToClipboardPreference", - selectable = true + selectable = true, ), NonInteractivePreference( "revanced_debug_logs_clear_buffer", tag = "app.revanced.extension.shared.settings.preference.ClearLogBufferPreference", - selectable = true + selectable = true, ), NonInteractivePreference( "revanced_debug_feature_flags_manager", tag = "app.revanced.extension.shared.settings.preference.FeatureFlagsManagerPreference", - selectable = true - ) + selectable = true, + ), ) preferenceScreen.addPreferences( @@ -87,13 +87,11 @@ internal fun enableDebuggingPatch( key = "revanced_debug_screen", sorting = Sorting.UNSORTED, preferences = preferences, - ) + ), ) // Hook the methods that look up if a feature flag is active. - experimentalBooleanFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalBooleanFeatureFlagMethod().apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> val register = getInstruction(index).registerA @@ -102,30 +100,26 @@ internal fun enableDebuggingPatch( """ invoke-static { v$register, p1 }, $EXTENSION_CLASS_DESCRIPTOR->isBooleanFeatureFlagEnabled(ZLjava/lang/Long;)Z move-result v$register - """ + """, ) } } - experimentalDoubleFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalDoubleFeatureFlagMethod().apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( insertIndex, """ - move-result-wide v0 # Also clobbers v1 (p0) since result is wide. + move-result-wide v0 # Also clobbers v1 (p0) since result is wide. invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isDoubleFeatureFlagEnabled(DJD)D move-result-wide v0 return-wide v0 - """ + """, ) } - experimentalLongFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { + experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalLongFeatureFlagMethod().apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) addInstructions( @@ -135,24 +129,24 @@ internal fun enableDebuggingPatch( invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J move-result-wide v0 return-wide v0 - """ + """, ) } - if (hookStringFeatureFlag) experimentalStringFeatureFlagFingerprint.match( - experimentalFeatureFlagParentFingerprint.originalClassDef - ).method.apply { - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT) + if (hookStringFeatureFlag) { + experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalStringFeatureFlagMethod().apply { + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT) - addInstructions( - insertIndex, - """ - move-result-object v0 - invoke-static { v0, p1, p2, p3 }, $EXTENSION_CLASS_DESCRIPTOR->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String; - move-result-object v0 - return-object v0 - """ - ) + addInstructions( + insertIndex, + """ + move-result-object v0 + invoke-static { v0, p1, p2, p3 }, $EXTENSION_CLASS_DESCRIPTOR->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String; + move-result-object v0 + return-object v0 + """, + ) + } } // There exists other experimental accessor methods for byte[] diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt index 6f183dd087..39611369a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt @@ -1,35 +1,46 @@ package app.revanced.patches.shared.misc.debugging -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.accessFlags +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val experimentalFeatureFlagParentFingerprint = fingerprint { +internal val BytecodePatchContext.experimentalFeatureFlagParentMethod by gettingFirstImmutableMethodDeclaratively( + "Unable to parse proto typed experiment flag: " +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L", "J", "[B") - strings("Unable to parse proto typed experiment flag: ") + returnType("L") + parameterTypes("L", "J", "[B") } -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getExperimentalBooleanFeatureFlagMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L", "J", "Z") + returnType("Z") + parameterTypes("L", "J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getExperimentalDoubleFeatureFlagMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("D") - parameters("J", "D") + returnType("D") + parameterTypes("J", "D") } -internal val experimentalLongFeatureFlagFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getExperimentalLongFeatureFlagMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("J") - parameters("J", "J") + returnType("J") + parameterTypes("J", "J") } -internal val experimentalStringFeatureFlagFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getExperimentalStringFeatureFlagMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("J", "Ljava/lang/String;") + returnType("Ljava/lang/String;") + parameterTypes("J", "Ljava/lang/String;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index f409ee9b1b..d355b38375 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.dns -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch @@ -16,19 +16,19 @@ private const val EXTENSION_CLASS_DESCRIPTOR = internal fun checkWatchHistoryDomainNameResolutionPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, - mainActivityFingerprint: Fingerprint + getMainActivityMethod: BytecodePatchContext.() -> MutableMethod, ) = bytecodePatch( name = "Check watch history domain name resolution", description = "Checks if the device DNS server is preventing user watch history from being saved.", ) { block() - execute { + apply { executeBlock() addResources("shared", "misc.dns.checkWatchHistoryDomainNameResolutionPatch") - mainActivityFingerprint.method.addInstruction( + getMainActivityMethod().addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->checkDnsResolver(Landroid/app/Activity;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt index 58cc5082f1..3bff13aacc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.shared.misc.extension -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val revancedUtilsPatchesVersionFingerprint = fingerprint { +internal val BytecodePatchContext.getPatchesReleaseVersionMethod by gettingFirstMethodDeclaratively { + name("getPatchesReleaseVersion") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { method, _ -> - method.name == "getPatchesReleaseVersion" && method.definingClass == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index e6d78b7776..6df4833213 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -1,11 +1,9 @@ package app.revanced.patches.shared.misc.extension -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.FingerprintBuilder -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.firstClassDef import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.iface.Method @@ -23,7 +21,7 @@ fun sharedExtensionPatch( extensionName: String, vararg hooks: ExtensionHook, ) = bytecodePatch { - dependsOn(sharedExtensionPatch(*hooks)) + dependsOn(sharedExtensionPatch(hooks = hooks)) extendWith("extensions/$extensionName.rve") } @@ -39,78 +37,92 @@ fun sharedExtensionPatch( ) = bytecodePatch { extendWith("extensions/shared.rve") - execute { - if (classes.none { EXTENSION_CLASS_DESCRIPTOR == it.type }) { - throw PatchException("Shared extension is not available. This patch can not succeed without it.") - } + apply { + // Verify the extension class exists. + firstClassDef(EXTENSION_CLASS_DESCRIPTOR) } - finalize { - // The hooks are made in finalize to ensure that the context is hooked before any other patches. + afterDependents { + // The hooks are made in afterDependents to ensure that the context is hooked before any other patches. hooks.forEach { hook -> hook(EXTENSION_CLASS_DESCRIPTOR) } // Modify Utils method to include the patches release version. - revancedUtilsPatchesVersionFingerprint.method.apply { - /** - * @return The file path for the jar this classfile is contained inside. - */ - fun getCurrentJarFilePath(): String { - val className = object {}::class.java.enclosingClass.name.replace('.', '/') + ".class" - val classUrl = object {}::class.java.classLoader?.getResource(className) - if (classUrl != null) { - val urlString = classUrl.toString() + /** + * @return The file path for the jar this classfile is contained inside. + */ + fun getCurrentJarFilePath(): String { + val className = object {}::class.java.enclosingClass.name.replace('.', '/') + ".class" + val classUrl = object {}::class.java.classLoader?.getResource(className) + if (classUrl != null) { + val urlString = classUrl.toString() - if (urlString.startsWith("jar:file:")) { - val end = urlString.lastIndexOf('!') + if (urlString.startsWith("jar:file:")) { + val end = urlString.lastIndexOf('!') - return URLDecoder.decode(urlString.substring("jar:file:".length, end), "UTF-8") - } + return URLDecoder.decode(urlString.substring("jar:file:".length, end), "UTF-8") } - throw IllegalStateException("Not running from inside a JAR file.") } - - /** - * @return The value for the manifest entry, - * or "Unknown" if the entry does not exist or is blank. - */ - @Suppress("SameParameterValue") - fun getPatchesManifestEntry(attributeKey: String) = JarFile(getCurrentJarFilePath()).use { jarFile -> - jarFile.manifest.mainAttributes.entries.firstOrNull { it.key.toString() == attributeKey }?.value?.toString() - ?: "Unknown" - } - - val manifestValue = getPatchesManifestEntry("Version") - returnEarly(manifestValue) + throw IllegalStateException("Not running from inside a JAR file.") } + + /** + * @return The value for the manifest entry, + * or "Unknown" if the entry does not exist or is blank. + */ + @Suppress("SameParameterValue") + fun getPatchesManifestEntry(attributeKey: String) = JarFile(getCurrentJarFilePath()).use { jarFile -> + jarFile.manifest.mainAttributes.entries.firstOrNull { it.key.toString() == attributeKey }?.value?.toString() + ?: "Unknown" + } + + val manifestValue = getPatchesManifestEntry("Version") + + getPatchesReleaseVersionMethod.returnEarly(manifestValue) } } class ExtensionHook internal constructor( - internal val fingerprint: Fingerprint, - private val insertIndexResolver: BytecodePatchContext.(Method) -> Int, - private val contextRegisterResolver: BytecodePatchContext.(Method) -> String, + private val getInsertIndex: Method.() -> Int, + private val getContextRegister: Method.() -> String, + private val build: context(MutableList) MutablePredicateList.() -> Unit, ) { - context(BytecodePatchContext) + context(context: BytecodePatchContext) operator fun invoke(extensionClassDescriptor: String) { - val insertIndex = insertIndexResolver(fingerprint.method) - val contextRegister = contextRegisterResolver(fingerprint.method) + val method = context.firstMethodDeclaratively(build = build) + val insertIndex = method.getInsertIndex() + val contextRegister = method.getContextRegister() - fingerprint.method.addInstruction( + method.addInstruction( insertIndex, "invoke-static/range { $contextRegister .. $contextRegister }, " + - "$extensionClassDescriptor->setContext(Landroid/content/Context;)V", + "$extensionClassDescriptor->setContext(Landroid/content/Context;)V", ) } } fun extensionHook( - insertIndexResolver: BytecodePatchContext.(Method) -> Int = { 0 }, - contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" }, - fingerprint: Fingerprint, -) = ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver) + getInsertIndex: Method.() -> Int = { 0 }, + getContextRegister: Method.() -> String = { "p0" }, + build: context(MutableList) MutablePredicateList.() -> Unit, +) = ExtensionHook(getInsertIndex, getContextRegister, build) + +/** + * Creates an extension hook from a non-obfuscated activity, which typically is the main activity + * defined in the app manifest.xml file. + * + * @param activityClassType Either the full activity class type such as `Lcom/company/MainActivity;` + * or the 'starts with' or 'ends with' string for the activity such as `/MainActivity;` + */ +fun activityOnCreateExtensionHook(activityClassType: String) = extensionHook { + name("onCreate") + definingClass(activityClassType) + returnType("V") + + /* + * Leaving this out (for now?), because before the refactor many apps + * which used a simpler fingerprint checking only method name and classDef name + * were refactored to use this instead, which caused their hooks to fail. + */ + // parameterTypes("Landroid/os/Bundle;") + } -fun extensionHook( - insertIndexResolver: BytecodePatchContext.(Method) -> Int = { 0 }, - contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" }, - fingerprintBuilderBlock: FingerprintBuilder.() -> Unit, -) = extensionHook(insertIndexResolver, contextRegisterResolver, fingerprint(block = fingerprintBuilderBlock)) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt index 80d041ada8..5dfe15c705 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt @@ -1,18 +1,19 @@ package app.revanced.patches.shared.misc.fix.verticalscroll -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -internal val canScrollVerticallyFingerprint = fingerprint { +internal val BytecodePatchContext.canScrollVerticallyMethodMatch by composingFirstMethod { + definingClass("SwipeRefreshLayout;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() + returnType("Z") + parameterTypes() opcodes( Opcode.MOVE_RESULT, Opcode.RETURN, Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT + Opcode.MOVE_RESULT, ) - custom { _, classDef -> classDef.endsWith("SwipeRefreshLayout;") } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt index a01839c100..54a396d476 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.fix.verticalscroll -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -9,16 +9,18 @@ val verticalScrollPatch = bytecodePatch( description = "Fixes issues with refreshing the feed when the first component is of type EmptyComponent.", ) { - execute { - canScrollVerticallyFingerprint.method.apply { - val moveResultIndex = canScrollVerticallyFingerprint.patternMatch!!.endIndex - val moveResultRegister = getInstruction(moveResultIndex).registerA + apply { + canScrollVerticallyMethodMatch.let { + it.method.apply { + val moveResultIndex = it[-1] + val moveResultRegister = getInstruction(moveResultIndex).registerA - val insertIndex = moveResultIndex + 1 - addInstruction( - insertIndex, - "const/4 v$moveResultRegister, 0x0", - ) + val insertIndex = moveResultIndex + 1 + addInstruction( + insertIndex, + "const/4 v$moveResultRegister, 0x0", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index 3548370110..8018c9bb66 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -1,43 +1,39 @@ package app.revanced.patches.shared.misc.gms -import app.revanced.patcher.fingerprint -import app.revanced.patches.shared.misc.gms.EXTENSION_CLASS_DESCRIPTOR +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId" - -internal val googlePlayUtilityFingerprint = fingerprint { +internal val BytecodePatchContext.googlePlayUtilityMethod by gettingFirstMethodDeclarativelyOrNull( + "This should never happen.", + "MetadataValueReader", + "com.google.android.gms", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("I") - parameters("L", "I") - strings( - "This should never happen.", - "MetadataValueReader", - "com.google.android.gms", - ) + returnType("I") + parameterTypes("L", "I") } -internal val serviceCheckFingerprint = fingerprint { +internal val BytecodePatchContext.serviceCheckMethod by gettingFirstMethodDeclaratively( + "Google Play Services not available", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("V") - parameters("L", "I") - strings("Google Play Services not available") + returnType("V") + parameterTypes("L", "I") } -internal val getGmsCoreVendorGroupIdFingerprint = fingerprint { +internal val BytecodePatchContext.getGmsCoreVendorGroupIdMethod by gettingFirstMethodDeclaratively { + name("getGmsCoreVendorGroupId") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { method, classDef -> - method.name == "getGmsCoreVendorGroupId" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } -internal val originalPackageNameExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.originalPackageNameExtensionMethod by gettingFirstMethodDeclaratively { + name("getOriginalPackageName") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { methodDef, classDef -> - methodDef.name == "getOriginalPackageName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 5f10d80967..1ab994b61c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -1,10 +1,19 @@ package app.revanced.patches.shared.misc.gms -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.* +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.string +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.Option +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.patch.ResourcePatchBuilder +import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption import app.revanced.patches.all.misc.packagename.changePackageNamePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources @@ -17,10 +26,7 @@ import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c -import com.android.tools.smali.dexlib2.iface.reference.StringReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableStringReference -import com.android.tools.smali.dexlib2.util.MethodUtil import java.net.URI internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/GmsCoreSupport;" @@ -33,9 +39,9 @@ private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$" * * @param fromPackageName The package name of the original app. * @param toPackageName The package name to fall back to if no custom package name is specified in patch options. - * @param primeMethodFingerprint The fingerprint of the "prime" method that needs to be patched. - * @param earlyReturnFingerprints The fingerprints of methods that need to be returned early. - * @param mainActivityOnCreateFingerprintToInsertIndex The fingerprint of the main activity onCreate method + * @param getPrimeMethod The fingerprint of the "prime" method that needs to be patched. + * @param getEarlyReturnMethods The methods that need to be returned early. + * @param getMainActivityOnCreateMethodToGetInsertIndex The main activity onCreate method * and a function to get the index to insert the GmsCore check instruction at. * @param extensionPatch The patch responsible for the extension. * @param gmsCoreSupportResourcePatchFactory The factory for the corresponding resource patch @@ -46,11 +52,11 @@ private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$" fun gmsCoreSupportPatch( fromPackageName: String, toPackageName: String, - primeMethodFingerprint: Fingerprint? = null, - earlyReturnFingerprints: Set = setOf(), - mainActivityOnCreateFingerprintToInsertIndex: Pair Int>, - extensionPatch: Patch<*>, - gmsCoreSupportResourcePatchFactory: (gmsCoreVendorGroupIdOption: Option) -> Patch<*>, + getPrimeMethod: (BytecodePatchContext.() -> MutableMethod)? = null, + getEarlyReturnMethods: Set MutableMethod> = setOf(), + getMainActivityOnCreateMethodToGetInsertIndex: Pair MutableMethod, BytecodePatchContext.() -> Int>, + extensionPatch: Patch, + gmsCoreSupportResourcePatchFactory: (gmsCoreVendorGroupIdOption: Option) -> Patch, executeBlock: BytecodePatchContext.() -> Unit = {}, block: BytecodePatchBuilder.() -> Unit = {}, ) = bytecodePatch( @@ -73,41 +79,9 @@ fun gmsCoreSupportPatch( extensionPatch, ) - execute { + apply { val gmsCoreVendorGroupId = gmsCoreVendorGroupIdOption.value!! - fun transformStringReferences(transform: (str: String) -> String?) = classes.forEach { - val mutableClass by lazy { - proxy(it).mutableClass - } - - it.methods.forEach classLoop@{ method -> - val implementation = method.implementation ?: return@classLoop - - val mutableMethod by lazy { - mutableClass.methods.first { MethodUtil.methodSignaturesMatch(it, method) } - } - - implementation.instructions.forEachIndexed insnLoop@{ index, instruction -> - val string = - ((instruction as? Instruction21c)?.reference as? StringReference)?.string - ?: return@insnLoop - - // Apply transformation. - val transformedString = transform(string) ?: return@insnLoop - - mutableMethod.replaceInstruction( - index, - BuilderInstruction21c( - Opcode.CONST_STRING, - instruction.registerA, - ImmutableStringReference(transformedString), - ), - ) - } - } - } - fun transformPackages(string: String): String? = when (string) { "com.google", "com.google.android.gms", @@ -156,43 +130,51 @@ fun gmsCoreSupportPatch( ::transformContentUrlAuthority, ) - transformStringReferences transform@{ string -> - transformations.forEach { transform -> - transform(string)?.let { transformedString -> return@transform transformedString } - } + forEachInstructionAsSequence({ _, _, instruction, index -> + val string = instruction.string ?: return@forEachInstructionAsSequence null - return@transform null + val transformedString = transformations.firstNotNullOfOrNull { it(string) } + ?: return@forEachInstructionAsSequence null + + index to transformedString + }) { method, (index, transformedString) -> + val register = method.getInstruction(index).registerA + + method.replaceInstruction( + index, + BuilderInstruction21c( + Opcode.CONST_STRING, + register, + ImmutableStringReference(transformedString), + ), + ) } // Specific method that needs to be patched. - if (primeMethodFingerprint?.methodOrNull != null) { - val primeMethod = primeMethodFingerprint.method + if (getPrimeMethod != null) getPrimeMethod().apply { + val index = indexOfFirstInstruction { string == fromPackageName } + val register = getInstruction(index).registerA - val index = primeMethod.indexOfFirstInstruction { - getReference()?.string == fromPackageName - } - val register = primeMethod.getInstruction(index).registerA - - primeMethod.replaceInstruction( + replaceInstruction( index, "const-string v$register, \"$packageName\"", ) } + // Return these methods early to prevent the app from crashing. - earlyReturnFingerprints.forEach { it.method.returnEarly() } - serviceCheckFingerprint.method.returnEarly() + getEarlyReturnMethods.forEach { it().returnEarly() } + serviceCheckMethod.returnEarly() // Google Play Utility is not present in all apps, so we need to check if it's present. - googlePlayUtilityFingerprint.methodOrNull?.returnEarly(0) + googlePlayUtilityMethod?.returnEarly(0) // Set original and patched package names for extension to use. - originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName) + originalPackageNameExtensionMethod.returnEarly(fromPackageName) - // Verify GmsCore is installed and whitelisted for power optimizations and background usage. - - mainActivityOnCreateFingerprintToInsertIndex.let { (fingerprint, getInsertIndex) -> - fingerprint.method.addInstruction( + // Run GmsCore presence, correct installation and update checks in the main activity. + getMainActivityOnCreateMethodToGetInsertIndex.let { (getMethod, getInsertIndex) -> + getMethod().addInstruction( getInsertIndex(), "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + "checkGmsCore(Landroid/app/Activity;)V", @@ -200,7 +182,7 @@ fun gmsCoreSupportPatch( } // Change the vendor of GmsCore in the extension. - getGmsCoreVendorGroupIdFingerprint.method.returnEarly(gmsCoreVendorGroupId) + getGmsCoreVendorGroupIdMethod.returnEarly(gmsCoreVendorGroupId) executeBlock() } @@ -234,7 +216,7 @@ fun gmsCoreSupportResourcePatch( val gmsCoreVendorGroupId = gmsCoreVendorGroupIdOption.value!! - execute { + apply { addResources("shared", "misc.gms.gmsCoreSupportResourcePatch") val toPackageName = setOrGetFallbackPackageName(toPackageName) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt index 8b6bc4dc2e..98269bd356 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt @@ -1,13 +1,29 @@ package app.revanced.patches.shared.misc.hex +import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.rawResourcePatch import kotlin.collections.component1 import kotlin.collections.component2 import kotlin.math.max -fun hexPatch(ignoreMissingTargetFiles: Boolean = false, block: HexPatchBuilder.() -> Unit) = - hexPatch(ignoreMissingTargetFiles, fun(): Set = HexPatchBuilder().apply(block)) +fun hexPatch(ignoreMissingTargetFiles: Boolean = false, block: HexPatchBuilder.() -> Unit): Patch { + return rawResourcePatch { + apply { + HexPatchBuilder().apply(block).groupBy { it.targetFilePath } + .forEach { (targetFilePath, replacements) -> + val targetFile = get(targetFilePath, true) + if (ignoreMissingTargetFiles && !targetFile.exists()) return@forEach + + // TODO: Use a file channel to read and write the file instead of reading the whole file into memory, + // in order to reduce memory usage. + val targetFileBytes = targetFile.readBytes() + replacements.forEach { it.replacePattern(targetFileBytes) } + targetFile.writeBytes(targetFileBytes) + } + } + } +} @Suppress("JavaDefaultMethodsNotOverriddenByDelegation") class HexPatchBuilder internal constructor( @@ -35,28 +51,6 @@ class HexPatchBuilder internal constructor( } } -// The replacements being passed using a function is intended. -// Previously the replacements were a property of the patch. Getter were being delegated to that property. -// This late evaluation was being leveraged in app.revanced.patches.all.misc.hex.HexPatch. -// Without the function, the replacements would be evaluated at the time of patch creation. -// This isn't possible because the delegated property is not accessible at that time. -@Deprecated("Use the hexPatch function with the builder parameter instead.") -fun hexPatch(ignoreMissingTargetFiles: Boolean = false, replacementsSupplier: () -> Set) = - rawResourcePatch { - execute { - replacementsSupplier().groupBy { it.targetFilePath }.forEach { (targetFilePath, replacements) -> - val targetFile = get(targetFilePath, true) - if (ignoreMissingTargetFiles && !targetFile.exists()) return@forEach - - // TODO: Use a file channel to read and write the file instead of reading the whole file into memory, - // in order to reduce memory usage. - val targetFileBytes = targetFile.readBytes() - replacements.forEach { it.replacePattern(targetFileBytes) } - targetFile.writeBytes(targetFileBytes) - } - } - } - /** * Represents a pattern to search for and its replacement pattern in a file. * @@ -71,17 +65,6 @@ class Replacement( ) { val replacementBytesPadded = replacementBytes + ByteArray(bytes.size - replacementBytes.size) - @Deprecated("Use the constructor with ByteArray parameters instead.") - constructor( - pattern: String, - replacementPattern: String, - targetFilePath: String, - ) : this( - byteArrayOf(pattern), - byteArrayOf(replacementPattern), - targetFilePath - ) - /** * Replaces the [bytes] with the [replacementBytes] in the [targetFileBytes]. * diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt index d405a5853d..1c3292bdea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt @@ -1,58 +1,64 @@ package app.revanced.patches.shared.misc.litho.filter -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoFilterFingerprint = fingerprint { +internal val BytecodePatchContext.lithoFilterInitMethod by gettingFirstMethodDeclaratively { + definingClass("/LithoFilterPatch;") accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - custom { _, classDef -> - classDef.endsWith("/LithoFilterPatch;") +} + +internal val BytecodePatchContext.protobufBufferReferenceMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("[B") + + var methodDefiningClass = "" + custom { + methodDefiningClass = definingClass + true } + + instructions( + allOf( + Opcode.IGET_OBJECT(), + field { definingClass == methodDefiningClass && type == "Lcom/google/android/libraries/elements/adl/UpbMessage;" }, + ), + method { definingClass == "Lcom/google/android/libraries/elements/adl/UpbMessage;" && name == "jniDecode" }, + ) } /** * Matches a method that use the protobuf of our component. */ -internal val protobufBufferReferenceFingerprint = fingerprint { +internal val BytecodePatchContext.protobufBufferReferenceLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("I", "Ljava/nio/ByteBuffer;") - opcodes( - Opcode.IPUT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.SUB_INT_2ADDR, - ) + returnType("V") + parameterTypes("I", "Ljava/nio/ByteBuffer;") + opcodes(Opcode.IPUT, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, Opcode.SUB_INT_2ADDR) } -internal val componentContextParserFingerprint = fingerprint { - strings("Number of bits must be positive") +internal val BytecodePatchContext.componentContextParserMethodMatch by composingFirstMethod { + instructions("Number of bits must be positive"()) } -internal val emptyComponentFingerprint = fingerprint { +internal val BytecodePatchContext.emptyComponentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) - parameters() - strings("EmptyComponent") - custom { _, classDef -> - classDef.methods.filter { AccessFlags.STATIC.isSet(it.accessFlags) }.size == 1 - } + parameterTypes() + instructions("EmptyComponent"()) + custom { immutableClassDef.methods.filter { AccessFlags.STATIC.isSet(it.accessFlags) }.size == 1 } } -internal val componentCreateFingerprint = fingerprint { - strings( - "Element missing correct type extension", - "Element missing type" - ) -} +internal val BytecodePatchContext.componentCreateMethod by gettingFirstMethod( + "Element missing correct type extension", + "Element missing type", +) -internal val lithoThreadExecutorFingerprint = fingerprint { +internal val BytecodePatchContext.lithoThreadExecutorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("I", "I", "I") - custom { method, classDef -> - classDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" && - method.containsLiteralInstruction(1L) // 1L = default thread timeout. - } + parameterTypes("I", "I", "I") + instructions(1L()) // 1L = default thread timeout. + custom { immutableClassDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt index ee91383b0e..fcc830c95c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt @@ -2,24 +2,23 @@ package app.revanced.patches.shared.misc.litho.filter -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableEncodedValue.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstructions +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.firstImmutableClassDef +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.misc.extension.sharedExtensionPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.findFieldFromToString import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.immutable.value.ImmutableBooleanEncodedValue /** * Used to add a hook point to the extension stub. @@ -32,20 +31,25 @@ lateinit var addLithoFilter: (String) -> Unit */ private var filterCount = 0 -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/litho/LithoFilterPatch;" +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/shared/patches/litho/LithoFilterPatch;" /** * A patch that allows to filter Litho components based on their identifier or path. * * @param componentCreateInsertionIndex The index to insert the filtering code in the component create method. - * @param conversionContextFingerprintToString The fingerprint of the conversion context to string method. + * @param insertProtobufHook This method injects a setProtoBuffer call in the protobuf decoding logic. + * @param getConversionContextToStringMethod The getter of the conversion context toString method. + * @param getExtractIdentifierFromBuffer Whether to extract the identifier from the protobuf buffer. * @param executeBlock The additional execution block of the patch. * @param block The additional block to build the patch. */ internal fun lithoFilterPatch( componentCreateInsertionIndex: Method.() -> Int, - conversionContextFingerprintToString: Fingerprint, + insertProtobufHook: BytecodePatchContext.() -> Unit, executeBlock: BytecodePatchContext.() -> Unit = {}, + getConversionContextToStringMethod: BytecodePatchContext.() -> Method, + getExtractIdentifierFromBuffer: () -> Boolean = { false }, block: BytecodePatchBuilder.() -> Unit = {}, ) = bytecodePatch( description = "Hooks the method which parses the bytes into a ComponentContext to filter components.", @@ -90,31 +94,40 @@ internal fun lithoFilterPatch( * } * } */ - execute { + apply { // Remove dummy filter from extenion static field // and add the filters included during patching. - lithoFilterFingerprint.method.apply { - removeInstructions(2, 4) // Remove dummy filter. + lithoFilterInitMethod.apply { + // Remove the array initialization with the dummy filter. + removeInstructions(6) + addInstructions( + 0, + "new-array v1, v1, [Lapp/revanced/extension/shared/patches/litho/Filter;" + ) + + // Fill the array with the filters added during patching. addLithoFilter = { classDescriptor -> addInstructions( - 2, + 1, """ - new-instance v1, $classDescriptor - invoke-direct { v1 }, $classDescriptor->()V + new-instance v0, $classDescriptor + invoke-direct { v0 }, $classDescriptor->()V const/16 v2, ${filterCount++} - aput-object v1, v0, v2 + aput-object v0, v1, v2 """, ) } } - // Add an interceptor to steal the protobuf of our component. - protobufBufferReferenceFingerprint.method.addInstruction( - 0, - "invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V", - ) + // Tell the extension whether to extract the identifier from the buffer. + if (getExtractIdentifierFromBuffer()) { + lithoFilterInitMethod.classDef.fields.first { it.name == "EXTRACT_IDENTIFIER_FROM_BUFFER" } + .initialValue = ImmutableBooleanEncodedValue.forBoolean(true).toMutable() + } + // Add an interceptor to steal the protobuf of our component. + insertProtobufHook() // Hook the method that parses bytes into a ComponentContext. // Allow the method to run to completion, and override the @@ -122,38 +135,29 @@ internal fun lithoFilterPatch( // It is important to allow the original code to always run to completion, // otherwise high memory usage and poor app performance can occur. + val conversionContextToStringMethod = getConversionContextToStringMethod() + // Find the identifier/path fields of the conversion context. - val conversionContextIdentifierField = componentContextParserFingerprint.let { - // Identifier field is loaded just before the string declaration. - val index = it.method.indexOfFirstInstructionReversedOrThrow( - it.stringMatches!!.first().index - ) { - // Our instruction reads a String from a field of the ConversionContext class. - val reference = getReference() - reference?.definingClass == conversionContextFingerprintToString.originalClassDef.type - && reference.type == "Ljava/lang/String;" - } + val conversionContextIdentifierField = conversionContextToStringMethod + .findFieldFromToString("identifierProperty=") - it.method.getInstruction(index).getReference()!! - } - - val conversionContextPathBuilderField = conversionContextFingerprintToString.originalClassDef + val conversionContextPathBuilderField = conversionContextToStringMethod.immutableClassDef .fields.single { field -> field.type == "Ljava/lang/StringBuilder;" } // Find class and methods to create an empty component. - val builderMethodDescriptor = emptyComponentFingerprint.classDef.methods.single { + val builderMethodDescriptor = emptyComponentMethod.immutableClassDef.methods.single { // The only static method in the class. method -> AccessFlags.STATIC.isSet(method.accessFlags) } - val emptyComponentField = classBy { + val emptyComponentField = firstImmutableClassDef { // Only one field that matches. - it.type == builderMethodDescriptor.returnType - }!!.immutableClass.fields.single() + type == builderMethodDescriptor.returnType + }.fields.single() // Match all component creations methods - componentCreateFingerprint.method.apply { + componentCreateMethod.apply { val insertIndex = componentCreateInsertionIndex() val freeRegister = findFreeRegister(insertIndex) val identifierRegister = findFreeRegister(insertIndex, freeRegister) @@ -163,7 +167,11 @@ internal fun lithoFilterPatch( insertIndex, """ move-object/from16 v$freeRegister, p2 # ConversionContext parameter - check-cast v$freeRegister, ${conversionContextFingerprintToString.originalClassDef.type} # Check we got the actual ConversionContext + + # In YT 20.41 the field is the abstract superclass. + # Check it's the actual ConversionContext just in case. + instance-of v$identifierRegister, v$freeRegister, ${conversionContextToStringMethod.immutableClassDef.type} + if-eqz v$identifierRegister, :unfiltered # Get identifier and path from ConversionContext iget-object v$identifierRegister, v$freeRegister, $conversionContextIdentifierField @@ -183,28 +191,29 @@ internal fun lithoFilterPatch( :unfiltered nop - """ + """, ) } - // TODO: Check if needed in music + // TODO: Check if needed in music. // Change Litho thread executor to 1 thread to fix layout issue in unpatched YouTube. - lithoThreadExecutorFingerprint.method.addInstructions( + lithoThreadExecutorMethod.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorCorePoolSize(I)I move-result p1 invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorMaxThreads(I)I move-result p2 - """ + """, ) executeBlock() } - finalize { - // Save the number of filters added. - lithoFilterFingerprint.method.replaceInstruction(0, "const/16 v0, $filterCount") + afterDependents { + // Set the array size to the actual filter count of the array + // initialized at the beginning of the patch. + lithoFilterInitMethod.addInstructions(0, "const/16 v1, $filterCount") } block() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 8a9e499ddb..7c528e1a56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,64 +1,88 @@ package app.revanced.patches.shared.misc.mapping +import app.revanced.patcher.IndexedMatcherPredicate +import app.revanced.patcher.extensions.wideLiteral import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch +import com.android.tools.smali.dexlib2.iface.instruction.Instruction import org.w3c.dom.Element -import java.util.* -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit -// TODO: Probably renaming the patch/this is a good idea. -lateinit var resourceMappings: List - private set +enum class ResourceType(val value: String) { + ANIM("anim"), + ANIMATOR("animator"), + ARRAY("array"), + ATTR("attr"), + BOOL("bool"), + COLOR("color"), + DIMEN("dimen"), + DRAWABLE("drawable"), + FONT("font"), + FRACTION("fraction"), + ID("id"), + INTEGER("integer"), + INTERPOLATOR("interpolator"), + LAYOUT("layout"), + MENU("menu"), + MIPMAP("mipmap"), + NAVIGATION("navigation"), + PLURALS("plurals"), + RAW("raw"), + STRING("string"), + STYLE("style"), + STYLEABLE("styleable"), + TRANSITION("transition"), + VALUES("values"), + XML("xml"), + ; -val resourceMappingPatch = resourcePatch { - val resourceMappings = Collections.synchronizedList(mutableListOf()) + operator fun invoke(name: String): IndexedMatcherPredicate { + val id = get(name) - execute { - val threadCount = Runtime.getRuntime().availableProcessors() - val threadPoolExecutor = Executors.newFixedThreadPool(threadCount) + return { _, _, _ -> wideLiteral == id } + } - // Save the file in memory to concurrently read from it. - val resourceXmlFile = get("res/values/public.xml").readBytes() + /** + * @return A resource id of the given resource type and name. + * @throws PatchException if the resource is not found. + */ + operator fun get(name: String) = resourceMappings[value + name]?.id + ?: throw PatchException("Could not find resource type: $this name: $name") - for (threadIndex in 0 until threadCount) { - threadPoolExecutor.execute thread@{ - document(resourceXmlFile.inputStream()).use { document -> + companion object { + private val VALUE_MAP: Map = entries.associateBy { it.value } - val resources = document.documentElement.childNodes - val resourcesLength = resources.length - val jobSize = resourcesLength / threadCount - - val batchStart = jobSize * threadIndex - val batchEnd = jobSize * (threadIndex + 1) - element@ for (i in batchStart until batchEnd) { - // Prevent out of bounds. - if (i >= resourcesLength) return@thread - - val node = resources.item(i) - if (node !is Element) continue - - val nameAttribute = node.getAttribute("name") - val typeAttribute = node.getAttribute("type") - - if (node.nodeName != "public" || nameAttribute.startsWith("APKTOOL")) continue - - val id = node.getAttribute("id").substring(2).toLong(16) - - resourceMappings.add(ResourceElement(typeAttribute, nameAttribute, id)) - } - } - } - } - - threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) - - app.revanced.patches.shared.misc.mapping.resourceMappings = resourceMappings + fun fromValue(value: String) = VALUE_MAP[value] + ?: throw IllegalArgumentException("Unknown resource type: $value") } } -operator fun List.get(type: String, name: String) = resourceMappings.firstOrNull { - it.type == type && it.name == name -}?.id ?: throw PatchException("Could not find resource type: $type name: $name") +data class ResourceElement(val type: ResourceType, val name: String, val id: Long) -data class ResourceElement internal constructor(val type: String, val name: String, val id: Long) +private lateinit var resourceMappings: MutableMap + +val resourceMappingPatch = resourcePatch { + apply { + // Use a stream of the file, since no modifications are done + // and using a File parameter causes the file to be re-written when closed. + document(get("res/values/public.xml").inputStream()).use { document -> + val resources = document.documentElement.childNodes + val resourcesLength = resources.length + resourceMappings = HashMap(2 * resourcesLength) + + for (i in 0 until resourcesLength) { + val node = resources.item(i) as? Element ?: continue + if (node.nodeName != "public") continue + + val nameAttribute = node.getAttribute("name") + if (nameAttribute.startsWith("APKTOOL")) continue + + val typeAttribute = node.getAttribute("type") + val id = node.getAttribute("id").substring(2).toLong(16) + + val type = ResourceType.fromValue(typeAttribute) + + resourceMappings[type.value + nameAttribute] = ResourceElement(type, nameAttribute, id) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt index 6efbd8c1fa..02790ebee4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt @@ -1,27 +1,27 @@ package app.revanced.patches.shared.misc.pairip.license -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly import java.util.logging.Logger @Suppress("unused") -val disableLicenseCheckPatch = bytecodePatch( +val disablePairipLicenseCheckPatch = bytecodePatch( name = "Disable Pairip license check", description = "Disables Play Integrity API (Pairip) client-side license check.", - use = false + use = false, ) { - execute { - if (processLicenseResponseFingerprint.methodOrNull == null || validateLicenseResponseFingerprint.methodOrNull == null) { - return@execute Logger.getLogger(this::class.java.name) + apply { + if (processLicenseResponseMethod == null || validateLicenseResponseMethod == null) { + return@apply Logger.getLogger(this::class.java.name) .warning("Could not find Pairip licensing check. No changes applied.") } // Set first parameter (responseCode) to 0 (success status). - processLicenseResponseFingerprint.method.addInstruction(0, "const/4 p1, 0x0") + processLicenseResponseMethod!!.addInstruction(0, "const/4 p1, 0x0") // Short-circuit the license response validation. - validateLicenseResponseFingerprint.method.returnEarly() + validateLicenseResponseMethod!!.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt index 344fd02dab..05afbe6a0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt @@ -1,17 +1,16 @@ package app.revanced.patches.shared.misc.pairip.license -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclarativelyOrNull +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val processLicenseResponseFingerprint = fingerprint { - custom { method, classDef -> - classDef.type == "Lcom/pairip/licensecheck/LicenseClient;" && - method.name == "processResponse" - } +internal val BytecodePatchContext.processLicenseResponseMethod by gettingFirstMethodDeclarativelyOrNull { + name("processResponse") + definingClass("Lcom/pairip/licensecheck/LicenseClient;") } -internal val validateLicenseResponseFingerprint = fingerprint { - custom { method, classDef -> - classDef.type == "Lcom/pairip/licensecheck/ResponseValidator;" && - method.name == "validateResponse" - } +internal val BytecodePatchContext.validateLicenseResponseMethod by gettingFirstMethodDeclarativelyOrNull { + name("validateResponse") + definingClass("Lcom/pairip/licensecheck/ResponseValidator;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/DisableSentryTelemetry.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/DisableSentryTelemetry.kt index f361a26bb4..8faa4e81ea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/DisableSentryTelemetry.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/DisableSentryTelemetry.kt @@ -11,7 +11,7 @@ val disableSentryTelemetryPatch = resourcePatch( description = "Disables Sentry telemetry. See https://sentry.io/for/android/ for more information.", use = false, ) { - execute { + apply { fun Element.replaceOrCreate(tagName: String, attributeName: String, attributeValue: String) { val childElements = getElementsByTagName(tagName).asSequence().filterIsInstance() val targetChild = childElements.find { childElement -> @@ -20,10 +20,12 @@ val disableSentryTelemetryPatch = resourcePatch( if (targetChild != null) { targetChild.setAttribute("android:value", attributeValue) } else { - appendChild(ownerDocument.createElement(tagName).apply { - setAttribute("android:name", attributeName) - setAttribute("android:value", attributeValue) - }) + appendChild( + ownerDocument.createElement(tagName).apply { + setAttribute("android:name", attributeName) + setAttribute("android:value", attributeValue) + }, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt index 47de39348c..dbed057f0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt @@ -1,44 +1,40 @@ package app.revanced.patches.shared.misc.privacy -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val youTubeCopyTextFingerprint = fingerprint { - returns("V") - parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.IGET_OBJECT, // Contains the text to copy to be sanitized. - Opcode.CONST_STRING, - Opcode.INVOKE_STATIC, // ClipData.newPlainText - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID, +internal val BytecodePatchContext.youTubeCopyTextMethodMatch by composingFirstMethod { + returnType("V") + parameterTypes("L", "Ljava/util/Map;") + instructions( + Opcode.IGET_OBJECT(), + afterAtMost(2, "text/plain"()), + afterAtMost(2, method("newPlainText")), + afterAtMost(2, Opcode.MOVE_RESULT_OBJECT()), + afterAtMost(2, method("setPrimaryClip")), ) - strings("text/plain") } -internal val youTubeSystemShareSheetFingerprint = fingerprint { - returns("V") - parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.CHECK_CAST, - Opcode.GOTO, +internal val BytecodePatchContext.youTubeSystemShareSheetMethodMatch by composingFirstMethod { + returnType("V") + parameterTypes("L", "Ljava/util/Map;") + instructions( + method("setClassName"), + afterAtMost(4, method("iterator")), + afterAtMost(15, allOf(Opcode.IGET_OBJECT(), field { type == "Ljava/lang/String;" })), + afterAtMost(15, method("putExtra")), ) - strings("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") } -internal val youTubeShareSheetFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.CHECK_CAST, - Opcode.GOTO, - Opcode.MOVE_OBJECT, - Opcode.INVOKE_VIRTUAL, +internal val BytecodePatchContext.youTubeShareSheetMethodMatch by composingFirstMethod { + returnType("V") + parameterTypes("L", "Ljava/util/Map;") + instructions( + Opcode.IGET_OBJECT(), + after(allOf(Opcode.CHECK_CAST(), type("Ljava/lang/String;"))), + after(Opcode.GOTO()), + method("putExtra"), + "YTShare_Logging_Share_Intent_Endpoint_Byte_Array"(), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt index 2fe4d7e818..120640ce77 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt @@ -1,21 +1,19 @@ package app.revanced.patches.shared.misc.privacy -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.Match -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.util.addInstructionsAtControlFlowLabel +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -29,16 +27,16 @@ internal fun sanitizeSharingLinksPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, preferenceScreen: BasePreferenceScreen.Screen, - replaceMusicLinksWithYouTube: Boolean = false + replaceMusicLinksWithYouTube: Boolean = false, ) = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { block() dependsOn(addResourcesPatch) - execute { + apply { executeBlock() addResources("shared", "misc.privacy.sanitizeSharingLinksPatch") @@ -53,42 +51,49 @@ internal fun sanitizeSharingLinksPatch( tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", preferences = setOf( sanitizePreference, - SwitchPreference("revanced_replace_music_with_youtube") - ) + SwitchPreference("revanced_replace_music_with_youtube"), + ), ) } else { sanitizePreference - } + }, ) - fun Fingerprint.hook( - getInsertIndex: Match.PatternMatch.() -> Int, - getUrlRegister: MutableMethod.(insertIndex: Int) -> Int, - ) { - val insertIndex = patternMatch!!.getInsertIndex() - val urlRegister = method.getUrlRegister(insertIndex) + + fun CompositeMatch.hookUrlString(matchIndex: Int) { + val index = get(matchIndex) + val urlRegister = method.getInstruction(index).registerA method.addInstructions( - insertIndex, + index + 1, """ - invoke-static {v$urlRegister}, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; move-result-object v$urlRegister """ ) } - // YouTube share sheet.\ - youTubeShareSheetFingerprint.hook(getInsertIndex = { startIndex + 1 }) { insertIndex -> - getInstruction(insertIndex - 1).registerA + fun CompositeMatch.hookIntentPutExtra(matchIndex: Int) { + val index = get(matchIndex) + val urlRegister = method.getInstruction(index).registerE + + method.addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$urlRegister + """ + ) } + + // YouTube share sheet copy link. + youTubeCopyTextMethodMatch.hookUrlString(0) + + // YouTube share sheet other apps. + youTubeShareSheetMethodMatch.hookIntentPutExtra(3) + // Native system share sheet. - youTubeSystemShareSheetFingerprint.hook(getInsertIndex = { endIndex }) { insertIndex -> - getInstruction(insertIndex - 1).registerA - } - - youTubeCopyTextFingerprint.hook(getInsertIndex = { startIndex + 2 }) { insertIndex -> - getInstruction(insertIndex - 2).registerA - } + youTubeSystemShareSheetMethodMatch.hookIntentPutExtra(3) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt index cad00d8dea..bd7a941b7f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt @@ -1,23 +1,28 @@ package app.revanced.patches.shared.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags -internal val themeLightColorResourceNameFingerprint = fingerprint { +internal val BytecodePatchContext.themeLightColorResourceNameMethod by gettingFirstMethodDeclaratively { + name("getThemeLightColorResourceName") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { method, classDef -> - method.name == "getThemeLightColorResourceName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } -internal val themeDarkColorResourceNameFingerprint = fingerprint { +internal val BytecodePatchContext.themeDarkColorResourceNameMethod by gettingFirstMethodDeclaratively { + name("getThemeDarkColorResourceName") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters() - custom { method, classDef -> - method.name == "getThemeDarkColorResourceName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Ljava/lang/String;") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt index c721044cc3..efcb89c14b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt @@ -8,7 +8,6 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.layout.branding.addBrandLicensePatch import app.revanced.patches.shared.misc.settings.preference.BasePreference -import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.util.ResourceGroup @@ -18,17 +17,8 @@ import app.revanced.util.insertFirst import app.revanced.util.returnEarly import org.w3c.dom.Node -// TODO: Delete this on next major version bump. -@Deprecated("Use non deprecated settings patch function", - ReplaceWith("settingsPatch(listOf(rootPreference), preferences)") -) -fun settingsPatch ( - rootPreference: Pair, - preferences: Set, -) = settingsPatch(listOf(rootPreference), preferences) - -private var lightThemeColor : String? = null -private var darkThemeColor : String? = null +private var lightThemeColor: String? = null +private var darkThemeColor: String? = null /** * Sets the default theme colors used in various ReVanced specific settings menus. @@ -41,12 +31,12 @@ fun overrideThemeColors(lightThemeColorString: String?, darkThemeColorString: St } private val settingsColorPatch = bytecodePatch { - finalize { + afterDependents { if (lightThemeColor != null) { - themeLightColorResourceNameFingerprint.method.returnEarly(lightThemeColor!!) + themeLightColorResourceNameMethod.returnEarly(lightThemeColor!!) } if (darkThemeColor != null) { - themeDarkColorResourceNameFingerprint.method.returnEarly(darkThemeColor!!) + themeDarkColorResourceNameMethod.returnEarly(darkThemeColor!!) } } } @@ -58,32 +48,47 @@ private val settingsColorPatch = bytecodePatch { * File names that do not exist are ignored and not processed. * @param preferences A set of preferences to add to the ReVanced fragment. */ -fun settingsPatch ( +fun settingsPatch( rootPreferences: List>? = null, preferences: Set, ) = resourcePatch { dependsOn( addResourcesPatch, settingsColorPatch, - addBrandLicensePatch + addBrandLicensePatch, ) - execute { + apply { copyResources( "settings", - ResourceGroup("xml", "revanced_prefs.xml", "revanced_prefs_icons.xml"), - ResourceGroup("menu", "revanced_search_menu.xml"), - ResourceGroup("drawable", + ResourceGroup( + "xml", + "revanced_prefs.xml", + "revanced_prefs_icons.xml", + "revanced_prefs_icons_bold.xml", + ), + ResourceGroup( + "menu", + "revanced_search_menu.xml", + ), + ResourceGroup( + "drawable", // CustomListPreference resources. "revanced_ic_dialog_alert.xml", // Search resources. "revanced_settings_arrow_time.xml", + "revanced_settings_arrow_time_bold.xml", "revanced_settings_custom_checkmark.xml", + "revanced_settings_custom_checkmark_bold.xml", "revanced_settings_search_icon.xml", + "revanced_settings_search_icon_bold.xml", "revanced_settings_search_remove.xml", + "revanced_settings_search_remove_bold.xml", "revanced_settings_toolbar_arrow_left.xml", + "revanced_settings_toolbar_arrow_left_bold.xml", ), - ResourceGroup("layout", + ResourceGroup( + "layout", "revanced_custom_list_item_checked.xml", // Color picker. "revanced_color_dot_widget.xml", @@ -97,14 +102,14 @@ fun settingsPatch ( "revanced_preference_search_result_list.xml", "revanced_preference_search_result_regular.xml", "revanced_preference_search_result_switch.xml", - "revanced_settings_with_toolbar.xml" - ) + "revanced_settings_with_toolbar.xml", + ), ) addResources("shared", "misc.settings.settingsResourcePatch") } - finalize { + afterDependents { fun Node.addPreference(preference: BasePreference) { preference.serialize(ownerDocument) { resource -> // TODO: Currently, resources can only be added to "values", which may not be the correct place. @@ -142,20 +147,30 @@ fun settingsPatch ( // there is no easy way to change to the Android default preference layout // after the preference is inflated. // Using two different preference files is the simplest and most robust solution. - fun removeIconsAndLayout(preferences: Collection) { + fun removeIconsAndLayout(preferences: Collection, removeAllIconsAndLayout: Boolean) { preferences.forEach { preference -> preference.icon = null - preference.layout = null + if (removeAllIconsAndLayout) { + preference.iconBold = null + preference.layout = null + } if (preference is PreferenceCategory) { - removeIconsAndLayout(preference.preferences) - } - if (preference is PreferenceScreenPreference) { - removeIconsAndLayout(preference.preferences) + removeIconsAndLayout(preference.preferences, removeAllIconsAndLayout) + } else if (preference is PreferenceScreenPreference) { + removeIconsAndLayout(preference.preferences, removeAllIconsAndLayout) } } } - removeIconsAndLayout(preferences) + + // Bold icons. + removeIconsAndLayout(preferences, false) + document("res/xml/revanced_prefs_icons_bold.xml").use { document -> + val revancedPreferenceScreenNode = document.getNode("PreferenceScreen") + preferences.forEach { revancedPreferenceScreenNode.addPreference(it) } + } + + removeIconsAndLayout(preferences, true) document("res/xml/revanced_prefs.xml").use { document -> val revancedPreferenceScreenNode = document.getNode("PreferenceScreen") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt index 70542b9b9f..b133d962ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt @@ -20,6 +20,7 @@ abstract class BasePreference( val titleKey: String? = "${key}_title", val summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, val tag: String ) { @@ -27,6 +28,9 @@ abstract class BasePreference( var icon: String? = icon internal set + var iconBold: String? = iconBold + internal set + var layout: String? = layout internal set @@ -44,8 +48,9 @@ abstract class BasePreference( key?.let { setAttribute("android:key", it) } titleKey?.let { setAttribute("android:title", "@string/${titleKey}") } summaryKey?.let { addSummary(it) } - icon?.let { - setAttribute("android:icon", it) + + if (icon != null || iconBold != null) { + setAttribute("android:icon", icon ?: iconBold) setAttribute("app:iconSpaceReserved", "true") } layout?.let { setAttribute("android:layout", layout) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt index 8590e99658..6de553397f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt @@ -16,7 +16,7 @@ abstract class BasePreferenceScreen( } /** - * Finalize and insert root preference into resource patch + * Insert root preference into resource patch */ abstract fun commit(screen: PreferenceScreenPreference) @@ -25,11 +25,12 @@ abstract class BasePreferenceScreen( titleKey: String = "${key}_title", private val summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, preferences: MutableSet = mutableSetOf(), val categories: MutableSet = mutableSetOf(), private val sorting: Sorting = Sorting.BY_TITLE, - ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) { + ) : BasePreferenceCollection(key, titleKey, icon, iconBold, layout, preferences) { override fun transform(): PreferenceScreenPreference { return PreferenceScreenPreference( @@ -37,6 +38,7 @@ abstract class BasePreferenceScreen( titleKey, summaryKey, icon, + iconBold, layout, sorting, // Screens and preferences are sorted at runtime by extension code, @@ -61,16 +63,18 @@ abstract class BasePreferenceScreen( key: String? = null, titleKey: String = "${key}_title", icon: String? = null, + iconBold: String? = null, layout: String? = null, preferences: MutableSet = mutableSetOf(), - ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) { + ) : BasePreferenceCollection(key, titleKey, icon, iconBold, layout, preferences) { override fun transform(): PreferenceCategory { return PreferenceCategory( - key, - titleKey, - icon, - layout, - sorting, + key = key, + titleKey = titleKey, + icon = icon, + iconBold = iconBold, + layout = layout, + sorting = sorting, preferences = preferences, ) } @@ -92,6 +96,7 @@ abstract class BasePreferenceScreen( val key: String? = null, val titleKey: String = "${key}_title", val icon: String? = null, + val iconBold: String? = null, val layout: String? = null, val preferences: MutableSet = mutableSetOf(), ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt index 2aef02dc86..f0ce9e7544 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt @@ -19,10 +19,11 @@ class IntentPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "Preference", val intent: Intent, -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt index 2e26189b2f..d1e9da1fd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt @@ -9,7 +9,6 @@ import org.w3c.dom.Document * * @param key The preference key. If null, other parameters must be specified. * @param titleKey The preference title key. - * @param summaryKey The preference summary key. * @param icon The preference icon resource name. * @param layout Layout declaration. * @param tag The preference class type. @@ -20,15 +19,13 @@ import org.w3c.dom.Document class ListPreference( key: String? = null, titleKey: String = "${key}_title", - /** Summary key is ignored and will be removed soon */ - //@Deprecated - summaryKey: String? = null, icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "app.revanced.extension.shared.settings.preference.CustomDialogListPreference", val entriesKey: String? = "${key}_entries", val entryValuesKey: String? = "${key}_entry_values" -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, null, icon, iconBold, layout, tag) { var entries: ArrayResource? = null private set var entryValues: ArrayResource? = null diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt index b5ce554891..77f1ba3e80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt @@ -21,10 +21,11 @@ class NonInteractivePreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "Preference", val selectable: Boolean = false, -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { setAttribute("android:selectable", selectable.toString()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt index ef51eca8cf..a1a3724fa8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt @@ -19,11 +19,12 @@ open class PreferenceCategory( key: String? = null, titleKey: String? = "${key}_title", icon: String? = null, + iconBold: String? = null, layout: String? = null, sorting: Sorting = Sorting.BY_TITLE, tag: String = "PreferenceCategory", val preferences: Set -) : BasePreference(sorting.appendSortType(key), titleKey, null, icon, layout, tag) { +) : BasePreference(sorting.appendSortType(key), titleKey, null, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt index a37e92947b..6f757a1b52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt @@ -22,6 +22,7 @@ open class PreferenceScreenPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, sorting: Sorting = Sorting.BY_TITLE, tag: String = "PreferenceScreen", @@ -32,7 +33,7 @@ open class PreferenceScreenPreference( // or adding new attributes to the attrs.xml file. // Since the key value is not currently used by the extensions, // for now it's much simpler to modify the key to include the sort parameter. -) : BasePreference(sorting.appendSortType(key), titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(sorting.appendSortType(key), titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { preferences.forEach { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt index df9accd4ba..429eac6839 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt @@ -20,10 +20,11 @@ class SwitchPreference( titleKey: String = "${key}_title", tag: String = "SwitchPreference", icon: String? = null, + iconBold: String? = null, layout: String? = null, val summaryOnKey: String = "${key}_summary_on", val summaryOffKey: String = "${key}_summary_off" -) : BasePreference(key, titleKey, null, icon, layout, tag) { +) : BasePreference(key, titleKey, null, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { addSummary(summaryOnKey, SummaryType.ON) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt index 397d4bd437..8c74edaa70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt @@ -20,10 +20,11 @@ class TextPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "app.revanced.extension.shared.settings.preference.ResettableEditTextPreference", val inputType: InputType = InputType.TEXT -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 5ea7a0b717..8fb0bf2f4a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,28 +1,37 @@ package app.revanced.patches.shared.misc.spoof -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference +import app.revanced.patcher.accessFlags +import app.revanced.patcher.anyField +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.custom +import app.revanced.patcher.definingClass +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.method +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val buildInitPlaybackRequestFingerprint = fingerprint { - returns("Lorg/chromium/net/UrlRequest\$Builder;") +internal val BytecodePatchContext.buildInitPlaybackRequestMethodMatch by composingFirstMethod("Content-Type", "Range") { + returnType($$"Lorg/chromium/net/UrlRequest$Builder;") opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.IGET_OBJECT, // Moves the request URI string to a register to build the request with. ) - strings( - "Content-Type", - "Range", - ) } -internal val buildPlayerRequestURIFingerprint = fingerprint { - returns("Ljava/lang/String;") +internal val BytecodePatchContext.buildPlayerRequestURIMethodMatch by composingFirstMethod("key", "asig") { + returnType("Ljava/lang/String;") opcodes( Opcode.INVOKE_VIRTUAL, // Register holds player request URI. Opcode.MOVE_RESULT_OBJECT, @@ -31,16 +40,15 @@ internal val buildPlayerRequestURIFingerprint = fingerprint { Opcode.MONITOR_EXIT, Opcode.RETURN_OBJECT, ) - strings( - "key", - "asig", - ) } -internal val buildRequestFingerprint = fingerprint { +internal val BytecodePatchContext.buildRequestMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; - custom { methodDef, _ -> + returnType("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; + instructions( + method("newUrlRequestBuilder"), + ) // UrlRequest; or UrlRequest$Builder; + custom { // Different targets have slightly different parameters // Earlier targets have parameters: @@ -70,31 +78,30 @@ internal val buildRequestFingerprint = fingerprint { // Lorg/chromium/net/UrlRequest$Callback; // L - val parameterTypes = methodDef.parameterTypes + val parameterTypes = parameterTypes val parameterTypesSize = parameterTypes.size (parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) && - parameterTypes[1] == "Ljava/util/Map;" // URL headers. - && indexOfNewUrlRequestBuilderInstruction(methodDef) >= 0 + parameterTypes[1] == "Ljava/util/Map;" && // URL headers. + indexOfNewUrlRequestBuilderInstruction(this) >= 0 } } -internal val protobufClassParseByteBufferFingerprint = fingerprint { +internal val BytecodePatchContext.protobufClassParseByteBufferMethod by gettingFirstImmutableMethodDeclaratively { + name("parseFrom") accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) - returns("L") - parameters("L", "Ljava/nio/ByteBuffer;") + returnType("L") + parameterTypes("L", "Ljava/nio/ByteBuffer;") opcodes( Opcode.SGET_OBJECT, Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, ) - custom { method, _ -> method.name == "parseFrom" } } -internal val createStreamingDataFingerprint = fingerprint { +internal val BytecodePatchContext.createStreamingDataMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - parameters("L") + parameterTypes("L") opcodes( Opcode.IPUT_OBJECT, Opcode.IGET_OBJECT, @@ -102,17 +109,14 @@ internal val createStreamingDataFingerprint = fingerprint { Opcode.SGET_OBJECT, Opcode.IPUT_OBJECT, ) - custom { method, classDef -> - classDef.fields.any { field -> - field.name == "a" && field.type.endsWith("/StreamingDataOuterClass\$StreamingData;") - } + custom { + immutableClassDef.anyField { name == "a" && type.endsWith($$"/StreamingDataOuterClass$StreamingData;") } } } -internal val buildMediaDataSourceFingerprint = fingerprint { +internal val BytecodePatchContext.buildMediaDataSourceMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - parameters( + parameterTypes( "Landroid/net/Uri;", "J", "I", @@ -126,78 +130,72 @@ internal val buildMediaDataSourceFingerprint = fingerprint { ) } -internal const val HLS_CURRENT_TIME_FEATURE_FLAG = 45355374L - -internal val hlsCurrentTimeFingerprint = fingerprint { +internal val BytecodePatchContext.hlsCurrentTimeMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Z", "L") - literal { - HLS_CURRENT_TIME_FEATURE_FLAG - } + parameterTypes("Z", "L") + instructions( + 45355374L(), // HLS current time feature flag. + ) } internal const val DISABLED_BY_SABR_STREAMING_URI_STRING = "DISABLED_BY_SABR_STREAMING_URI" -internal val mediaFetchEnumConstructorFingerprint = fingerprint { - returns("V") - strings( - "ENABLED", - "DISABLED_FOR_PLAYBACK", - DISABLED_BY_SABR_STREAMING_URI_STRING +internal val BytecodePatchContext.mediaFetchEnumConstructorMethodMatch by composingFirstMethod { + returnType("V") + instructions( + "ENABLED"(), + "DISABLED_FOR_PLAYBACK"(), + DISABLED_BY_SABR_STREAMING_URI_STRING(), ) } -internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.nerdsStatsVideoFormatBuilderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters("L") - strings("codecs=\"") + returnType("Ljava/lang/String;") + parameterTypes("L") + instructions( + "codecs=\""(), + ) } -internal val patchIncludedExtensionMethodFingerprint = fingerprint { - returns("Z") - parameters() - custom { method, classDef -> - classDef.type == EXTENSION_CLASS_DESCRIPTOR && method.name == "isPatchIncluded" - } +internal val BytecodePatchContext.patchIncludedExtensionMethodMethod by gettingFirstMethodDeclaratively { + name("isPatchIncluded") + definingClass(EXTENSION_CLASS_DESCRIPTOR) + returnType("Z") + parameterTypes() } // Feature flag that turns on Platypus programming language code compiled to native C++. // This code appears to replace the player config after the streams are loaded. // Flag is present in YouTube 19.34, but is missing Platypus stream replacement code until 19.43. // Flag and Platypus code is also present in newer versions of YouTube Music. -internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L - -internal val mediaFetchHotConfigFingerprint = fingerprint { - literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG } +internal val BytecodePatchContext.mediaFetchHotConfigMethodMatch by composingFirstMethod { + instructions(45645570L()) } // YT 20.10+, YT Music 8.11 - 8.14. // Flag is missing in YT Music 8.15+, and it is not known if a replacement flag/feature exists. -internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L - -internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint { - literal { MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG } +internal val BytecodePatchContext.mediaFetchHotConfigAlternativeMethodMatch by composingFirstMethod { + instructions(45683169L()) } // Feature flag that enables different code for parsing and starting video playback, -// but it's exact purpose is not known. If this flag is enabled while stream spoofing +// but its exact purpose is not known. If this flag is enabled while stream spoofing // then videos will never start playback and load forever. // Flag does not seem to affect playback if spoofing is off. -internal const val PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG = 45665455L - -internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint { - parameters() - returns("Z") - literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG } +internal val BytecodePatchContext.playbackStartDescriptorFeatureFlagMethodMatch by composingFirstMethod { + parameterTypes() + returnType("Z") + instructions(45665455L()) } internal fun indexOfNewUrlRequestBuilderInstruction(method: Method) = method.indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.INVOKE_VIRTUAL && reference?.definingClass == "Lorg/chromium/net/CronetEngine;" - && reference.name == "newUrlRequestBuilder" - && reference.parameterTypes.size == 3 - && reference.parameterTypes[0] == "Ljava/lang/String;" - && reference.parameterTypes[1] == "Lorg/chromium/net/UrlRequest\$Callback;" - && reference.parameterTypes[2] == "Ljava/util/concurrent/Executor;" + val reference = methodReference ?: return@indexOfFirstInstruction false + + opcode == Opcode.INVOKE_VIRTUAL && reference.definingClass == "Lorg/chromium/net/CronetEngine;" && + reference.name == "newUrlRequestBuilder" && + reference.parameterTypes.size == 3 && + reference.parameterTypes[0] == "Ljava/lang/String;" && + reference.parameterTypes[1] == "Lorg/chromium/net/UrlRequest\$Callback;" && + reference.parameterTypes[2] == "Ljava/util/concurrent/Executor;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 7395c3983d..23fec8ebc0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,25 +1,18 @@ package app.revanced.patches.shared.misc.spoof -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.fingerprint +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.custom +import app.revanced.patcher.extensions.* +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.opcodes import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable +import app.revanced.patcher.returnType import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.util.findFreeRegister -import app.revanced.util.findInstructionIndicesReversedOrThrow -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.insertLiteralOverride -import app.revanced.util.returnEarly +import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -39,7 +32,7 @@ private var buildRequestMethodUrlRegister = -1 internal fun spoofVideoStreamsPatch( extensionClassDescriptor: String, - mainActivityOnCreateFingerprint: Fingerprint, + getMainActivityOnCreateMethod: BytecodePatchContext.() -> MutableMethod, fixMediaFetchHotConfig: BytecodePatchBuilder.() -> Boolean = { false }, fixMediaFetchHotConfigAlternative: BytecodePatchBuilder.() -> Boolean = { false }, fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false }, @@ -53,24 +46,26 @@ internal fun spoofVideoStreamsPatch( dependsOn(addResourcesPatch) - execute { + apply { addResources("shared", "misc.fix.playback.spoofVideoStreamsPatch") - mainActivityOnCreateFingerprint.method.addInstruction( + getMainActivityOnCreateMethod().addInstruction( 0, - "invoke-static { }, $extensionClassDescriptor->setClientOrderToUse()V" + "invoke-static { }, $extensionClassDescriptor->setClientOrderToUse()V", ) + // TODO?: Force off 45708738L ? + // region Enable extension helper method used by other patches - patchIncludedExtensionMethodFingerprint.method.returnEarly(true) + patchIncludedExtensionMethodMethod.returnEarly(true) // endregion // region Block /initplayback requests to fall back to /get_watch requests. - buildInitPlaybackRequestFingerprint.method.apply { - val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch!!.startIndex + buildInitPlaybackRequestMethodMatch.method.apply { + val moveUriStringIndex = buildInitPlaybackRequestMethodMatch[0] val targetRegister = getInstruction(moveUriStringIndex).registerA addInstructions( @@ -78,7 +73,7 @@ internal fun spoofVideoStreamsPatch( """ invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockInitPlaybackRequest(Ljava/lang/String;)Ljava/lang/String; move-result-object v$targetRegister - """ + """, ) } @@ -86,8 +81,8 @@ internal fun spoofVideoStreamsPatch( // region Block /get_watch requests to fall back to /player requests. - buildPlayerRequestURIFingerprint.method.apply { - val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch!!.startIndex + buildPlayerRequestURIMethodMatch.method.apply { + val invokeToStringIndex = buildPlayerRequestURIMethodMatch[0] val uriRegister = getInstruction(invokeToStringIndex).registerC addInstructions( @@ -95,7 +90,7 @@ internal fun spoofVideoStreamsPatch( """ invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri; move-result-object v$uriRegister - """ + """, ) } @@ -103,10 +98,10 @@ internal fun spoofVideoStreamsPatch( // region Get replacement streams at player requests. - buildRequestFingerprint.method.apply { + buildRequestMethodMatch.method.apply { buildRequestMethod = this - val newRequestBuilderIndex = indexOfNewUrlRequestBuilderInstruction(this) + val newRequestBuilderIndex = buildRequestMethodMatch[0] buildRequestMethodUrlRegister = getInstruction(newRequestBuilderIndex).registerD val freeRegister = findFreeRegister(newRequestBuilderIndex, buildRequestMethodUrlRegister) @@ -115,7 +110,7 @@ internal fun spoofVideoStreamsPatch( """ move-object v$freeRegister, p1 invoke-static { v$buildRequestMethodUrlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V - """ + """, ) } @@ -123,10 +118,10 @@ internal fun spoofVideoStreamsPatch( // region Replace the streaming data with the replacement streams. - createStreamingDataFingerprint.method.apply { + createStreamingDataMethodMatch.method.apply { val setStreamDataMethodName = "patch_setStreamingData" - val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.patternMatch!!.endIndex + val resultMethodType = createStreamingDataMethodMatch.classDef.type + val videoDetailsIndex = createStreamingDataMethodMatch[-1] val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -136,8 +131,8 @@ internal fun spoofVideoStreamsPatch( "$resultMethodType->$setStreamDataMethodName($videoDetailsClass)V", ) - val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch!!.startIndex + val protobufClass = protobufClassParseByteBufferMethod.definingClass + val setStreamingDataIndex = createStreamingDataMethodMatch[0] val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass @@ -151,7 +146,7 @@ internal fun spoofVideoStreamsPatch( ).getReference() // Use a helper method to avoid the need of picking out multiple free registers from the hooked code. - createStreamingDataFingerprint.classDef.methods.add( + createStreamingDataMethodMatch.classDef.methods.add( ImmutableMethod( resultMethodType, setStreamDataMethodName, @@ -191,9 +186,9 @@ internal fun spoofVideoStreamsPatch( :disabled return-void - """ + """, ) - } + }, ) } @@ -205,10 +200,11 @@ internal fun spoofVideoStreamsPatch( val insertIndex = indexOfNewUrlRequestBuilderInstruction(this) addInstructions( - insertIndex, """ + insertIndex, + """ invoke-static { v$buildRequestMethodUrlRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetAttRequest(Ljava/lang/String;)Ljava/lang/String; move-result-object v$buildRequestMethodUrlRegister - """ + """, ) } @@ -219,25 +215,25 @@ internal fun spoofVideoStreamsPatch( // Requesting streams intended for other platforms with a body tuned for Android could be the cause of 400 errors. // A proper fix may include modifying the request body to match the platforms expected body. - buildMediaDataSourceFingerprint.method.apply { - val targetIndex = instructions.lastIndex + buildMediaDataSourceMethod.apply { + val targetIndex = instructions.count() - 1 // Instructions are added just before the method returns, // so there's no concern of clobbering in-use registers. addInstructions( targetIndex, """ - # Field a: Stream uri. - # Field c: Http method. - # Field d: Post data. - move-object v0, p0 # method has over 15 registers and must copy p0 to a lower register. - iget-object v1, v0, $definingClass->a:Landroid/net/Uri; - iget v2, v0, $definingClass->c:I - iget-object v3, v0, $definingClass->d:[B - invoke-static { v1, v2, v3 }, $EXTENSION_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B - move-result-object v1 - iput-object v1, v0, $definingClass->d:[B - """ + # Field a: Stream uri. + # Field c: Http method. + # Field d: Post data. + move-object v0, p0 # method has over 15 registers and must copy p0 to a lower register. + iget-object v1, v0, $definingClass->a:Landroid/net/Uri; + iget v2, v0, $definingClass->c:I + iget-object v3, v0, $definingClass->d:[B + invoke-static { v1, v2, v3 }, $EXTENSION_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B + move-result-object v1 + iput-object v1, v0, $definingClass->d:[B + """, ) } @@ -245,7 +241,7 @@ internal fun spoofVideoStreamsPatch( // region Append spoof info. - nerdsStatsVideoFormatBuilderFingerprint.method.apply { + nerdsStatsVideoFormatBuilderMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { index -> val register = getInstruction(index).registerA @@ -254,7 +250,7 @@ internal fun spoofVideoStreamsPatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->appendSpoofedClient(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } @@ -263,9 +259,9 @@ internal fun spoofVideoStreamsPatch( // region Fix iOS livestream current time. - hlsCurrentTimeFingerprint.method.insertLiteralOverride( - HLS_CURRENT_TIME_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" + hlsCurrentTimeMethodMatch.method.insertLiteralOverride( + hlsCurrentTimeMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z", ) // endregion @@ -273,33 +269,30 @@ internal fun spoofVideoStreamsPatch( // region Disable SABR playback. // If SABR is disabled, it seems 'MediaFetchHotConfig' may no longer need an override (not confirmed). - val (mediaFetchEnumClass, sabrFieldReference) = with(mediaFetchEnumConstructorFingerprint.method) { - val stringIndex = mediaFetchEnumConstructorFingerprint.stringMatches!!.first { - it.string == DISABLED_BY_SABR_STREAMING_URI_STRING - }.index + val (mediaFetchEnumClass, sabrFieldReference) = with(mediaFetchEnumConstructorMethodMatch.method) { + val disabledBySABRStreamingUrlString = mediaFetchEnumConstructorMethodMatch[-1] val mediaFetchEnumClass = definingClass - val sabrFieldIndex = indexOfFirstInstructionOrThrow(stringIndex) { + val sabrFieldIndex = indexOfFirstInstructionOrThrow(disabledBySABRStreamingUrlString) { opcode == Opcode.SPUT_OBJECT && - getReference()?.type == mediaFetchEnumClass + getReference()?.type == mediaFetchEnumClass } Pair( mediaFetchEnumClass, - getInstruction(sabrFieldIndex).reference + getInstruction(sabrFieldIndex).reference, ) } - fingerprint { - returns(mediaFetchEnumClass) + val sabrMethod = firstMethodDeclaratively { + returnType(mediaFetchEnumClass) opcodes( Opcode.SGET_OBJECT, Opcode.RETURN_OBJECT, ) - custom { method, _ -> - !method.parameterTypes.isEmpty() - } - }.method.addInstructionsWithLabels( + custom { !parameterTypes.isEmpty() } + } + sabrMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSABR()Z @@ -309,7 +302,7 @@ internal fun spoofVideoStreamsPatch( return-object v0 :ignore nop - """ + """, ) // endregion @@ -317,23 +310,23 @@ internal fun spoofVideoStreamsPatch( // region turn off stream config replacement feature flag. if (fixMediaFetchHotConfig()) { - mediaFetchHotConfigFingerprint.method.insertLiteralOverride( - MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" + mediaFetchHotConfigMethodMatch.method.insertLiteralOverride( + mediaFetchHotConfigMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z", ) } if (fixMediaFetchHotConfigAlternative()) { - mediaFetchHotConfigAlternativeFingerprint.method.insertLiteralOverride( - MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" + mediaFetchHotConfigAlternativeMethodMatch.method.insertLiteralOverride( + mediaFetchHotConfigAlternativeMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z", ) } if (fixParsePlaybackResponseFeatureFlag()) { - playbackStartDescriptorFeatureFlagFingerprint.method.insertLiteralOverride( - PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z" + playbackStartDescriptorFeatureFlagMethodMatch.method.insertLiteralOverride( + playbackStartDescriptorFeatureFlagMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatch.kt index f6ca942ad3..e512578bd8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.spoof -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patches.all.misc.transformation.IMethodCall import app.revanced.patches.all.misc.transformation.filterMapInstruction35c import app.revanced.patches.all.misc.transformation.transformInstructionsPatch diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/string/ReplaceStringPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/string/ReplaceStringPatch.kt index 2e83a6d93c..a6ba7a12e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/string/ReplaceStringPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/string/ReplaceStringPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.shared.misc.string -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.util.getReference diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt index 0e81d7e592..81992f067f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt @@ -1,15 +1,18 @@ package app.revanced.patches.solidexplorer2.functionality.filesize -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.definingClass +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val onReadyFingerprint = fingerprint { +internal val BytecodePatchContext.onReadyMethodMatch by composingFirstMethod { + name("onReady") + definingClass("Lpl/solidexplorer/plugins/texteditor/TextEditor;") opcodes( Opcode.CONST_WIDE_32, // Constant storing the 2MB limit Opcode.CMP_LONG, Opcode.IF_LEZ, ) - custom { method, _ -> - method.name == "onReady" && method.definingClass == "Lpl/solidexplorer/plugins/texteditor/TextEditor;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt index 7ef5093015..3119eb9b43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.solidexplorer2.functionality.filesize -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.ThreeRegisterInstruction @@ -12,12 +12,12 @@ val removeFileSizeLimitPatch = bytecodePatch( ) { compatibleWith("pl.solidexplorer2") - execute { - onReadyFingerprint.method.apply { - val cmpIndex = onReadyFingerprint.patternMatch!!.startIndex + 1 - val cmpResultRegister = getInstruction(cmpIndex).registerA + apply { + onReadyMethodMatch.let { + val cmpIndex = it[0] + 1 + val cmpResultRegister = it.method.getInstruction(cmpIndex).registerA - replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") + it.method.replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt index f37ebe71ee..c1879fb2fc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt @@ -1,13 +1,13 @@ package app.revanced.patches.songpal.badge -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch internal const val ACTIVITY_TAB_DESCRIPTOR = "Ljp/co/sony/vim/framework/ui/yourheadphones/YhContract\$Tab;" @Suppress("unused") -val badgeTabPatch = bytecodePatch( +val removeBadgeTabPatch = bytecodePatch( name = "Remove badge tab", description = "Removes the badge tab from the activity tab.", ) { @@ -15,8 +15,8 @@ val badgeTabPatch = bytecodePatch( val arrayTabs = listOf("Log", "HealthCare") - execute { - createTabsFingerprint.method.apply { + apply { + createTabsMethod.apply { removeInstructions(0, 2) val arrayRegister = 0 diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt index c52174f2c5..c597e3c4ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt @@ -1,49 +1,32 @@ package app.revanced.patches.songpal.badge -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference // Located @ ub.i0.h#p (9.5.0) -internal val createTabsFingerprint = fingerprint { +internal val BytecodePatchContext.createTabsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE) - returns("Ljava/util/List;") - custom { method, _ -> - method.implementation?.instructions?.any { instruction -> - if (instruction.opcode != Opcode.INVOKE_STATIC) return@any false - - val reference = (instruction as ReferenceInstruction).reference as MethodReference - - if (reference.parameterTypes.isNotEmpty()) return@any false - if (reference.definingClass != ACTIVITY_TAB_DESCRIPTOR) return@any false - if (reference.returnType != "[${ACTIVITY_TAB_DESCRIPTOR}") return@any false - true - } == true - } + returnType("Ljava/util/List;") + instructions( + method { + parameterTypes.isEmpty() && + definingClass == ACTIVITY_TAB_DESCRIPTOR && + returnType == "[${ACTIVITY_TAB_DESCRIPTOR}" + }, + ) } // Located @ com.sony.songpal.mdr.vim.activity.MdrRemoteBaseActivity.e#run (9.5.0) -internal val showNotificationFingerprint = fingerprint { +internal val BytecodePatchContext.showNotificationMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) - returns("V") - custom { method, _ -> - method.implementation?.instructions?.any { instruction -> - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@any false - - with(expectedReference) { - val currentReference = (instruction as ReferenceInstruction).reference as MethodReference - currentReference.let { - if (it.definingClass != definingClass) return@any false - if (it.parameterTypes != parameterTypes) return@any false - if (it.returnType != returnType) return@any false - } - } - true - } == true - } + returnType("V") + instructions(method { + definingClass == expectedReference.definingClass + && parameterTypes == expectedReference.parameterTypes + && returnType == expectedReference.returnType + }) } internal val expectedReference = ImmutableMethodReference( diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt index eae07fc918..59aa826df0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.songpal.badge -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,7 +10,7 @@ val removeNotificationBadgePatch = bytecodePatch( ) { compatibleWith("com.sony.songpal.mdr"("10.1.0")) - execute { - showNotificationFingerprint.method.addInstructions(0, "return-void") + apply { + showNotificationMethod.addInstructions(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index 28780ea578..674e225e01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -1,25 +1,24 @@ package app.revanced.patches.soundcloud.ad -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val interceptFingerprint = fingerprint { +internal val BytecodePatchContext.interceptMethodMatch by composingFirstMethod("SC-Mob-UserPlan", "Configuration") { accessFlags(AccessFlags.PUBLIC) - returns("L") - parameters("L") + returnType("L") + parameterTypes("L") opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT + Opcode.MOVE_RESULT_OBJECT, ) - strings("SC-Mob-UserPlan", "Configuration") } -internal val userConsumerPlanConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.userConsumerPlanConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - parameters( + parameterTypes( "Ljava/lang/String;", "Z", "Ljava/lang/String;", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt index 47a54ed600..8364062aae 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt @@ -1,25 +1,19 @@ package app.revanced.patches.soundcloud.ad -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.soundcloud.shared.featureConstructorFingerprint +import app.revanced.patches.soundcloud.shared.featureConstructorMethod @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.soundcloud.android"("2025.05.27-release")) - execute { + apply { // Enable a preset feature to disable audio ads by modifying the JSON server response. // This method is the constructor of a class representing a "Feature" object parsed from JSON data. // p1 is the name of the feature. // p2 is true if the feature is enabled, false otherwise. - featureConstructorFingerprint.method.apply { + featureConstructorMethod.apply { val afterCheckNotNullIndex = 2 addInstructionsWithLabels( afterCheckNotNullIndex, @@ -41,7 +35,7 @@ val hideAdsPatch = bytecodePatch( // p4 is the "consumerPlanUpsells" value, a list of plans to try to sell to the user. // p5 is the "currentConsumerPlan" value, the type of plan currently subscribed to. // p6 is the "currentConsumerPlanTitle" value, the name of the plan currently subscribed to, shown to the user. - userConsumerPlanConstructorFingerprint.method.addInstructions( + userConsumerPlanConstructorMethod.addInstructions( 0, """ const-string p1, "high_tier" @@ -54,8 +48,8 @@ val hideAdsPatch = bytecodePatch( // Prevent verification of an HTTP header containing the user's current plan, which would contradict the previous patch. - val conditionIndex = interceptFingerprint.patternMatch!!.endIndex + 1 - interceptFingerprint.method.addInstruction( + val conditionIndex = interceptMethodMatch[-1] + 1 + interceptMethodMatch.method.addInstruction( conditionIndex, "return-object p1", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt index 80268afc7d..b49837d6c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.soundcloud.analytics -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,8 +10,8 @@ val disableTelemetryPatch = bytecodePatch( ) { compatibleWith("com.soundcloud.android"("2025.05.27-release")) - execute { + apply { // Empty the "backend" argument to abort the initializer. - createTrackingApiFingerprint.method.addInstruction(0, "const-string p1, \"\"") + createTrackingApiMethod.addInstruction(0, "const-string p1, \"\"") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt index 2954b4d99c..19dec5923c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt @@ -1,13 +1,17 @@ package app.revanced.patches.soundcloud.analytics -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val createTrackingApiFingerprint = fingerprint { +internal val BytecodePatchContext.createTrackingApiMethod by gettingFirstMethodDeclaratively( + "backend", + "boogaloo" +) { + name("create") accessFlags(AccessFlags.PUBLIC) - returns("L") - custom { methodDef, _ -> - methodDef.name == "create" - } - strings("backend", "boogaloo") + returnType("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt index 5714f23924..7fd1114419 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch.kt @@ -1,30 +1,23 @@ package app.revanced.patches.soundcloud.offlinesync -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.soundcloud.shared.featureConstructorFingerprint +import app.revanced.patches.soundcloud.shared.featureConstructorMethod import app.revanced.util.getReference import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Suppress("unused") -val enableOfflineSync = bytecodePatch( - name = "Enable offline sync", -) { +val enableOfflineSyncPatch = bytecodePatch("Enable offline sync") { compatibleWith("com.soundcloud.android"("2025.05.27-release")) - execute { + apply { // Enable the feature to allow offline track syncing by modifying the JSON server response. // This method is the constructor of a class representing a "Feature" object parsed from JSON data. // p1 is the name of the feature. // p2 is true if the feature is enabled, false otherwise. - featureConstructorFingerprint.method.apply { + featureConstructorMethod.apply { val afterCheckNotNullIndex = 2 addInstructionsWithLabels( @@ -42,7 +35,7 @@ val enableOfflineSync = bytecodePatch( // Patch the URL builder to use the HTTPS_STREAM endpoint // instead of the offline sync endpoint to downloading the track. - downloadOperationsURLBuilderFingerprint.method.apply { + downloadOperationsURLBuilderMethod.apply { val getEndpointsEnumFieldIndex = 1 val getEndpointsEnumFieldInstruction = getInstruction(getEndpointsEnumFieldIndex) @@ -58,7 +51,7 @@ val enableOfflineSync = bytecodePatch( // The HTTPS_STREAM endpoint does not return the necessary headers for offline sync. // Mock the headers to prevent the app from crashing by setting them to empty strings. // The headers are all cosmetic and do not affect the functionality of the app. - downloadOperationsHeaderVerificationFingerprint.method.apply { + downloadOperationsHeaderVerificationMethod.apply { // The first three null checks need to be patched. instructions.asSequence().filter { it.opcode == Opcode.IF_EQZ diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt index 688fe36044..fa73735adf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt @@ -1,13 +1,14 @@ package app.revanced.patches.soundcloud.offlinesync -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val downloadOperationsURLBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.downloadOperationsURLBuilderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String") - parameters("L", "L") + returnType("Ljava/lang/String") + parameterTypes("L", "L") opcodes( Opcode.IGET_OBJECT, Opcode.SGET_OBJECT, @@ -15,15 +16,18 @@ internal val downloadOperationsURLBuilderFingerprint = fingerprint { ) } -internal val downloadOperationsHeaderVerificationFingerprint = fingerprint { +internal val BytecodePatchContext.downloadOperationsHeaderVerificationMethod by gettingFirstMethodDeclaratively( + "X-SC-Mime-Type", + "X-SC-Preset", + "X-SC-Quality", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L") + returnType("V") + parameterTypes("L", "L") opcodes( Opcode.CONST_STRING, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, Opcode.CONST_STRING, ) - strings("X-SC-Mime-Type", "X-SC-Preset", "X-SC-Quality") } diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index 3a50ae407e..4916be459a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.soundcloud.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val featureConstructorFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.featureConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") + parameterTypes("Ljava/lang/String;", "Z", "Ljava/util/List;") opcodes( Opcode.SGET_OBJECT, Opcode.CHECK_CAST, diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt deleted file mode 100644 index d9235b8c80..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.spotify.layout.hide.createbutton - -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -@Deprecated("Obsolete") -internal val navigationBarItemSetClassFingerprint = fingerprint { - strings("NavigationBarItemSet(") -} - -@Deprecated("Obsolete") -internal val navigationBarItemSetConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - // Make sure the method checks whether navigation bar items are null before adding them. - // If this is not true, then we cannot patch the method and potentially transform the parameters into null. - opcodes(Opcode.IF_EQZ, Opcode.INVOKE_VIRTUAL) - custom { method, _ -> - method.indexOfFirstInstruction { - getReference()?.name == "add" - } >= 0 - } -} - -@Deprecated("Obsolete") -internal val oldNavigationBarAddItemFingerprint = fingerprint { - strings("Bottom navigation tabs exceeds maximum of 5 tabs") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt deleted file mode 100644 index 465f18d690..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt +++ /dev/null @@ -1,110 +0,0 @@ -package app.revanced.patches.spotify.layout.hide.createbutton - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch;" - -@Deprecated("Patch no longer works with the latest version of Spotify, " + - "and Spotify has added this functionality to the app") -@Suppress("unused") -val hideCreateButtonPatch = bytecodePatch( - description = "Hides the \"Create\" button in the navigation bar. The latest app targets do not need this patch.", -) { - compatibleWith("com.spotify.music") - - dependsOn(sharedExtensionPatch) - - execute { - val oldNavigationBarAddItemMethod = oldNavigationBarAddItemFingerprint.originalMethodOrNull - // Only throw the fingerprint error when oldNavigationBarAddItemMethod does not exist. - val navigationBarItemSetClassDef = if (oldNavigationBarAddItemMethod == null) { - navigationBarItemSetClassFingerprint.originalClassDef - } else { - navigationBarItemSetClassFingerprint.originalClassDefOrNull - } - - if (navigationBarItemSetClassDef != null) { - // Main patch for newest and most versions. - // The NavigationBarItemSet constructor accepts multiple parameters which represent each navigation bar item. - // Each item is manually checked whether it is not null and then added to a LinkedHashSet. - // Since the order of the items can differ, we are required to check every parameter to see whether it is the - // Create button. So, for every parameter passed to the method, invoke our extension method and overwrite it - // to null in case it is the Create button. - navigationBarItemSetConstructorFingerprint.match(navigationBarItemSetClassDef).method.apply { - // Add 1 to the index because the first parameter register is `this`. - val parameterTypesWithRegister = parameterTypes.mapIndexed { index, parameterType -> - parameterType to (index + 1) - } - - val returnNullIfIsCreateButtonDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->returnNullIfIsCreateButton(Ljava/lang/Object;)Ljava/lang/Object;" - - parameterTypesWithRegister.reversed().forEach { (parameterType, parameterRegister) -> - addInstructions( - 0, - """ - invoke-static { p$parameterRegister }, $returnNullIfIsCreateButtonDescriptor - move-result-object p$parameterRegister - check-cast p$parameterRegister, $parameterType - """ - ) - } - } - } - - if (oldNavigationBarAddItemMethod != null) { - // In case an older version of the app is being patched, hook the old method which adds navigation bar items. - // Return early if the navigation bar item title resource id is the old Create button title resource id. - oldNavigationBarAddItemFingerprint.methodOrNull?.apply { - val getNavigationBarItemTitleStringIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/content/res/Resources;" && reference.name == "getString" - } - // This register is a parameter register, so it can be used at the start of the method when adding - // the new instructions. - val oldNavigationBarItemTitleResIdRegister = - getInstruction(getNavigationBarItemTitleStringIndex).registerD - - // The instruction where the normal method logic starts. - val firstInstruction = getInstruction(0) - - val isOldCreateButtonDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->isOldCreateButton(I)Z" - - val returnEarlyInstruction = if (returnType == "V") { - // In older implementations the method return value is void. - "return-void" - } else { - // In newer implementations - // return null because the method return value is a BottomNavigationItemView. - "const/4 v0, 0\n" + - "return-object v0" - } - - addInstructionsWithLabels( - 0, - """ - invoke-static { v$oldNavigationBarItemTitleResIdRegister }, $isOldCreateButtonDescriptor - move-result v0 - - # If this navigation bar item is not the Create button, jump to the normal method logic. - if-eqz v0, :normal-method-logic - - $returnEarlyInstruction - """, - ExternalLabel("normal-method-logic", firstInstruction) - ) - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt index 55325bc4d9..6b859d3e05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.spotify.layout.theme -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -18,11 +19,11 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/ private val customThemeBytecodePatch = bytecodePatch { dependsOn(sharedExtensionPatch) - execute { - val colorSpaceUtilsClassDef = colorSpaceUtilsClassFingerprint.originalClassDef + apply { + val colorSpaceUtilsClassDef = colorSpaceUtilsClassMethod.immutableClassDef // Hook a util method that converts ARGB to RGBA in the sRGB color space to replace hardcoded accent colors. - convertArgbToRgbaFingerprint.match(colorSpaceUtilsClassDef).method.apply { + colorSpaceUtilsClassDef.getConvertArgbToRgbaMethod().apply { addInstructions( 0, """ @@ -30,21 +31,21 @@ private val customThemeBytecodePatch = bytecodePatch { invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I move-result p0 int-to-long p0, p0 - """ + """, ) } // Lottie JSON parser method. It parses the JSON Lottie animation into its own class, // including the solid color of it. - parseLottieJsonFingerprint.method.apply { + parseLottieJsonMethod.apply { val invokeParseColorIndex = indexOfFirstInstructionOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/graphics/Color;" - && reference.name == "parseColor" + reference?.definingClass == "Landroid/graphics/Color;" && + reference.name == "parseColor" } val parsedColorRegister = getInstruction(invokeParseColorIndex + 1).registerA - val replaceColorDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I" + val replaceColorDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I" addInstructions( invokeParseColorIndex + 2, @@ -52,16 +53,16 @@ private val customThemeBytecodePatch = bytecodePatch { # Use invoke-static/range because the register number is too large. invoke-static/range { v$parsedColorRegister .. v$parsedColorRegister }, $replaceColorDescriptor move-result v$parsedColorRegister - """ + """, ) } // Lottie animated color parser. - parseAnimatedColorFingerprint.method.apply { + parseAnimatedColorMethod.apply { val invokeArgbIndex = indexOfFirstInstructionOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/graphics/Color;" - && reference.name == "argb" + reference?.definingClass == "Landroid/graphics/Color;" && + reference.name == "argb" } val argbColorRegister = getInstruction(invokeArgbIndex + 1).registerA @@ -70,7 +71,7 @@ private val customThemeBytecodePatch = bytecodePatch { """ invoke-static { v$argbColorRegister }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I move-result v$argbColorRegister - """ + """, ) } } @@ -87,49 +88,44 @@ val customThemePatch = resourcePatch( dependsOn(customThemeBytecodePatch) val backgroundColor by stringOption( - key = "backgroundColor", default = "@android:color/black", - title = "Primary background color", + name = "Primary background color", description = "The background color. Can be a hex color or a resource reference.", required = true, ) val overridePlayerGradientColor by booleanOption( - key = "overridePlayerGradientColor", default = false, - title = "Override player gradient color", + name = "Override player gradient color", description = "Apply primary background color to the player gradient color, which changes dynamically with the song.", required = false, ) val backgroundColorSecondary by stringOption( - key = "backgroundColorSecondary", default = "#FF121212", - title = "Secondary background color", + name = "Secondary background color", description = "The secondary background color. (e.g. playlist list in home, player artist, song credits). " + "Can be a hex color or a resource reference.\",", required = true, ) val accentColor by stringOption( - key = "accentColor", default = "#FF1ED760", - title = "Accent color", + name = "Accent color", description = "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.", required = true, ) val accentColorPressed by stringOption( - key = "accentColorPressed", default = "#FF1ABC54", - title = "Pressed accent color", + name = "Pressed accent color", description = "The color when accented buttons are pressed, by default slightly darker than accent. " + "Can be a hex color or a resource reference.", required = true, ) - execute { + apply { document("res/values/colors.xml").use { document -> val resourcesNode = document.getElementsByTagName("resources").item(0) as Element @@ -148,37 +144,37 @@ val customThemePatch = resourcePatch( node.textContent = when (name) { // Main background color. "gray_7", - // Left sidebar background color in tablet mode. + // Left sidebar background color in tablet mode. "gray_10", - // Gradient next to user photo and "All" in home page. + // Gradient next to user photo and "All" in home page. "dark_base_background_base", - // "Add account", "Settings and privacy", "View Profile" left sidebar background color. + // "Add account", "Settings and privacy", "View Profile" left sidebar background color. "dark_base_background_elevated_base", - // Song/player gradient start/end color. + // Song/player gradient start/end color. "bg_gradient_start_color", "bg_gradient_end_color", - // Login screen background color and gradient start. + // Login screen background color and gradient start. "sthlm_blk", "sthlm_blk_grad_start", - // Misc. + // Misc. "image_placeholder_color", -> backgroundColor // "About the artist" background color in song player. "gray_15", - // Track credits, merch background color in song player. + // Track credits, merch background color in song player. "track_credits_card_bg", "benefit_list_default_color", "merch_card_background", - // Playlist list background in home page. + // Playlist list background in home page. "opacity_white_10", - // "What's New" pills background. - "dark_base_background_tinted_highlight" + // "What's New" pills background. + "dark_base_background_tinted_highlight", -> backgroundColorSecondary "dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light", - "spotify_green_157" + "spotify_green_157", -> accentColor - "dark_brightaccent_background_press" + "dark_brightaccent_background_press", -> accentColorPressed else -> continue diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt index eb3ab78391..584444b36f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt @@ -1,28 +1,35 @@ package app.revanced.patches.spotify.layout.theme -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.accessFlags +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstImmutableMethod +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patcher.unorderedAllOf import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val colorSpaceUtilsClassFingerprint = fingerprint { - strings("The specified color must be encoded in an RGB color space.") // Partial string match. +internal val BytecodePatchContext.colorSpaceUtilsClassMethod by gettingFirstImmutableMethodDeclaratively { + instructions("The specified color must be encoded in an RGB color space."(String::contains)) } -internal val convertArgbToRgbaFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getConvertArgbToRgbaMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) - returns("J") - parameters("J") + returnType("J") + parameterTypes("J") } -internal val parseLottieJsonFingerprint = fingerprint { - strings("Unsupported matte type: ") -} +internal val BytecodePatchContext.parseLottieJsonMethod by gettingFirstMethod("Unsupported matte type: ") -internal val parseAnimatedColorFingerprint = fingerprint { - parameters("L", "F") - returns("Ljava/lang/Object;") - custom { method, _ -> - method.containsLiteralInstruction(255.0) && - method.containsLiteralInstruction(1.0) - } +internal val BytecodePatchContext.parseAnimatedColorMethod by gettingFirstMethodDeclaratively { + parameterTypes("L", "F") + returnType("Ljava/lang/Object;") + instructions(predicates = unorderedAllOf(255.0.toRawBits()(), 1.0.toRawBits()())) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt deleted file mode 100644 index 4d2d04a553..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.spotify.lite.ondemand - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Patch no longer works and will be deleted soon") -@Suppress("unused") -val onDemandPatch = bytecodePatch( - description = "Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.", -) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/check/CheckEnvironmentPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/check/CheckEnvironmentPatch.kt index 81d42ce664..d5321a855b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/check/CheckEnvironmentPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/check/CheckEnvironmentPatch.kt @@ -1,11 +1,11 @@ package app.revanced.patches.spotify.misc.check import app.revanced.patches.shared.misc.checks.checkEnvironmentPatch -import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch +import app.revanced.patches.spotify.shared.mainActivityOnCreateMethod internal val checkEnvironmentPatch = checkEnvironmentPatch( - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = { mainActivityOnCreateMethod }, extensionPatch = sharedExtensionPatch, "com.spotify.music", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt index 070190a037..2736a0e373 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.misc.extension import app.revanced.patches.shared.misc.extension.sharedExtensionPatch val sharedExtensionPatch = sharedExtensionPatch( - "spotify", + "spotify", mainActivityOnCreateHook, loadOrbitLibraryHook ) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt index 4f1c48e83d..065fdfa427 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt @@ -1,7 +1,11 @@ package app.revanced.patches.spotify.misc.extension -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val loadOrbitLibraryFingerprint = fingerprint { - strings("orbit_library_load", "orbit-jni-spotify") +internal val BytecodePatchContext.loadOrbitLibraryMethodMatch by composingFirstMethod { + instructions( + "orbit_library_load"(), + "orbit-jni-spotify"(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt index 4bddc43b8a..60726251d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt @@ -1,26 +1,40 @@ package app.revanced.patches.spotify.misc.extension -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.string +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook -import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val mainActivityOnCreateHook = extensionHook(fingerprint = mainActivityOnCreateFingerprint) +internal val mainActivityOnCreateHook = activityOnCreateExtensionHook( + "Lcom/spotify/music/SpotifyMainActivity;" +) + +private var contextReferenceIndex = -1 internal val loadOrbitLibraryHook = extensionHook( - insertIndexResolver = { - loadOrbitLibraryFingerprint.stringMatches!!.last().index + getInsertIndex = { + indexOfFirstInstruction { + "orbit-jni-spotify" in (string ?: return@indexOfFirstInstruction false) + } }, - contextRegisterResolver = { method -> - val contextReferenceIndex = method.indexOfFirstInstruction { + getContextRegister = { + contextReferenceIndex = indexOfFirstInstruction { getReference()?.type == "Landroid/content/Context;" } - val contextRegister = method.getInstruction(contextReferenceIndex).registerA + val contextRegister = + getInstruction(contextReferenceIndex).registerA "v$contextRegister" }, - fingerprint = loadOrbitLibraryFingerprint, -) +) { + instructions( + "orbit-jni-spotify"(), + "orbit_library_load"() + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt deleted file mode 100644 index 3be19dcce8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt +++ /dev/null @@ -1,52 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal val loadOrbitLibraryFingerprint = fingerprint { - strings("/liborbit-jni-spotify.so") -} - -internal val setClientIdFingerprint = fingerprint { - parameters("Ljava/lang/String;") - custom { method, classDef -> - classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" - && method.name == "setClientId" - } -} - -internal val setUserAgentFingerprint = fingerprint { - parameters("Ljava/lang/String;") - custom { method, classDef -> - classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" - && method.name == "setDefaultHTTPUserAgent" - } -} - -internal val extensionFixConstantsFingerprint = fingerprint { - custom { _, classDef -> classDef.type == "Lapp/revanced/extension/spotify/misc/fix/Constants;" } -} - -internal val runIntegrityVerificationFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - opcodes( - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.INVOKE_STATIC, // Calendar.getInstance() - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, // instance.get(6) - Opcode.MOVE_RESULT, - Opcode.IF_EQ, // if (x == instance.get(6)) return - ) - custom { method, _ -> - method.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Ljava/util/Calendar;" && reference.name == "get" - } >= 0 - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt deleted file mode 100644 index d57370b3f4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt +++ /dev/null @@ -1,125 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.intOption -import app.revanced.patcher.patch.stringOption -import app.revanced.patches.shared.misc.hex.HexPatchBuilder -import app.revanced.patches.shared.misc.hex.hexPatch -import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.returnEarly - -internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;" - -@Deprecated("Patch no longer functions") -@Suppress("unused") -val spoofClientPatch = bytecodePatch( - description = "Spoofs the client to fix various functions of the app.", -) { - val requestListenerPort by intOption( - key = "requestListenerPort", - default = 4345, - title = "Request listener port", - description = "The port to use for the listener that intercepts and handles spoofed requests. " + - "Port must be between 0 and 65535. " + - "Do not change this option, if you do not know what you are doing.", - validator = { - it!! - !(it < 0 || it > 65535) - } - ) - - val clientVersion by stringOption( - key = "clientVersion", - default = "iphone-9.0.58.558.g200011c", - title = "Client version", - description = "The client version used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - val hardwareMachine by stringOption( - key = "hardwareMachine", - default = "iPhone16,1", - title = "Hardware machine", - description = "The hardware machine used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - val systemVersion by stringOption( - key = "systemVersion", - default = "17.7.2", - title = "System version", - description = "The system version used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - dependsOn( - sharedExtensionPatch, - hexPatch(ignoreMissingTargetFiles = true, block = fun HexPatchBuilder.() { - listOf( - "arm64-v8a", - "armeabi-v7a", - "x86", - "x86_64" - ).forEach { architecture -> - "https://clienttoken.spotify.com/v1/clienttoken" to - "http://127.0.0.1:$requestListenerPort/v1/clienttoken" inFile - "lib/$architecture/liborbit-jni-spotify.so" - } - }) - ) - - compatibleWith("com.spotify.music") - - execute { - val clientVersion = clientVersion!! - val hardwareMachine = hardwareMachine!! - val systemVersion = systemVersion!! - - // region Spoof login request. - - val version = clientVersion - .substringAfter('-') - .substringBeforeLast('.') - .substringBeforeLast('.') - - setUserAgentFingerprint.method.addInstruction( - 0, - "const-string p1, \"Spotify/$version iOS/$systemVersion ($hardwareMachine)\"" - ) - - setClientIdFingerprint.method.addInstruction( - 0, "const-string p1, \"58bd3c95768941ea9eb4350aaa033eb3\"" - ) - - // endregion - - // region Spoof client-token request. - - loadOrbitLibraryFingerprint.method.addInstructions( - 0, - """ - const/16 v0, $requestListenerPort - invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->launchListener(I)V - """ - ) - - mapOf( - "getClientVersion" to clientVersion, - "getSystemVersion" to systemVersion, - "getHardwareMachine" to hardwareMachine - ).forEach { (methodName, value) -> - extensionFixConstantsFingerprint.classDef.methods.single { it.name == methodName }.returnEarly(value) - } - - // endregion - - // region Disable verdicts. - - // Early return to block sending bad verdicts to the API. - runIntegrityVerificationFingerprint.method.returnEarly() - - // endregion - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt deleted file mode 100644 index 20f9b3b4e5..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch")) -@Suppress("unused") -val spoofPackageInfoPatch = bytecodePatch( - description = "Spoofs the package info of the app to fix various functions of the app.", -) { - dependsOn(spoofClientPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt deleted file mode 100644 index 238da0f41e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch")) -@Suppress("unused") -val spoofSignaturePatch = bytecodePatch( - description = "Spoofs the signature of the app fix various functions of the app.", -) { - dependsOn(spoofClientPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt index b9edaaeacf..d1609e8ccf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt @@ -1,13 +1,18 @@ package app.revanced.patches.spotify.misc.fix.login -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstImmutableMethod +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.literal +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val katanaProxyLoginMethodHandlerClassFingerprint = fingerprint { - strings("katana_proxy_auth") -} +internal val BytecodePatchContext.katanaProxyLoginMethodHandlerClassMethod by gettingFirstImmutableMethod("katana_proxy_auth") -internal val katanaProxyLoginMethodTryAuthorizeFingerprint = fingerprint { - strings("e2e") - literal { 0 } +context(_: BytecodePatchContext) +internal fun ClassDef.getKatanaProxyLoginMethodTryAuthorizeMethod() = firstMethodDeclaratively("e2e") { + instructions(0L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt index f8be93ac53..d7f83a7fd5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.spotify.misc.fix.login +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @@ -7,23 +8,19 @@ import app.revanced.util.returnEarly val fixFacebookLoginPatch = bytecodePatch( name = "Fix Facebook login", description = - "Fix logging in with Facebook when the app is patched by always opening the login in a web browser window.", + "Fix logging in with Facebook when the app is patched by always opening the login in a web browser window.", ) { compatibleWith("com.spotify.music") - execute { + apply { // The Facebook SDK tries to handle the login using the Facebook app in case it is installed. // However, the Facebook app does signature checks with the app that is requesting the authentication, // which ends up making the Facebook server reject with an invalid key hash for the app signature. // Override the Facebook SDK to always handle the login using the web browser, which does not perform // signature checks. - - val katanaProxyLoginMethodHandlerClass = katanaProxyLoginMethodHandlerClassFingerprint.originalClassDef // Always return 0 (no Intent was launched) as the result of trying to authorize with the Facebook app to // make the login fallback to a web browser window. - katanaProxyLoginMethodTryAuthorizeFingerprint - .match(katanaProxyLoginMethodHandlerClass) - .method - .returnEarly(0) + katanaProxyLoginMethodHandlerClassMethod.immutableClassDef + .getKatanaProxyLoginMethodTryAuthorizeMethod().returnEarly(0) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt index 16253bd38b..020399c703 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt @@ -1,12 +1,19 @@ package app.revanced.patches.spotify.misc.lyrics -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.method +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patcher.returnType import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c @@ -28,9 +35,8 @@ val changeLyricsProviderPatch = bytecodePatch( compatibleWith("com.spotify.music") val lyricsProviderHost by stringOption( - key = "lyricsProviderHost", default = "lyrics.natanchiodi.fr", - title = "Lyrics provider host", + name = "Lyrics provider host", description = "The domain name or IP address of a custom lyrics provider.", required = false, ) { @@ -49,7 +55,7 @@ val changeLyricsProviderPatch = bytecodePatch( InetAddress.getByName(host) } catch (_: UnknownHostException) { Logger.getLogger(this::class.java.name).warning( - "Host \"$host\" did not resolve to any domain." + "Host \"$host\" did not resolve to any domain.", ) } catch (_: Exception) { // Must ignore any kind of exception. Trying to resolve network @@ -59,9 +65,7 @@ val changeLyricsProviderPatch = bytecodePatch( true } - execute { - val httpClientBuilderMethod = httpClientBuilderFingerprint.originalMethod - + apply { // region Create a modified copy of the HTTP client builder method with the custom lyrics provider host. val patchedHttpClientBuilderMethod = with(httpClientBuilderMethod) { @@ -71,7 +75,7 @@ val changeLyricsProviderPatch = bytecodePatch( val setUrlBuilderHostIndex = indexOfFirstInstructionReversedOrThrow(invokeBuildUrlIndex) { val reference = getReference() reference?.definingClass == "Lokhttp3/HttpUrl${"$"}Builder;" && - reference.parameterTypes.firstOrNull() == "Ljava/lang/String;" + reference.parameterTypes.firstOrNull() == "Ljava/lang/String;" } val hostRegister = getInstruction(setUrlBuilderHostIndex).registerD @@ -79,11 +83,11 @@ val changeLyricsProviderPatch = bytecodePatch( name = "rv_getCustomLyricsProviderHttpClient" addInstruction( setUrlBuilderHostIndex, - "const-string v$hostRegister, \"$lyricsProviderHost\"" + "const-string v$hostRegister, \"$lyricsProviderHost\"", ) // Add the patched method to the class. - httpClientBuilderFingerprint.classDef.methods.add(this) + httpClientBuilderMethod.classDef.methods.add(this) } } @@ -91,7 +95,13 @@ val changeLyricsProviderPatch = bytecodePatch( // region Replace the call to the HTTP client builder method used exclusively for lyrics by the modified one. - getLyricsHttpClientFingerprint(httpClientBuilderMethod).method.apply { + val getLyricsHttpClientMethod = firstMethodDeclaratively { + returnType(httpClientBuilderMethod.returnType) + parameterTypes() + instructions(method { this == httpClientBuilderMethod }) + } + + getLyricsHttpClientMethod.apply { val getLyricsHttpClientIndex = indexOfFirstInstructionOrThrow { getReference() == httpClientBuilderMethod } @@ -112,9 +122,9 @@ val changeLyricsProviderPatch = bytecodePatch( patchedHttpClientBuilderMethod.definingClass, patchedHttpClientBuilderMethod.name, // Only difference from the original method. patchedHttpClientBuilderMethod.parameters, - patchedHttpClientBuilderMethod.returnType - ) - ) + patchedHttpClientBuilderMethod.returnType, + ), + ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt index f55fc349f4..ee60ea884f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt @@ -1,21 +1,12 @@ package app.revanced.patches.spotify.misc.lyrics -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstImmutableMethod +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val httpClientBuilderFingerprint = fingerprint { - strings("client == null", "scheduler == null") -} - -internal fun getLyricsHttpClientFingerprint(httpClientBuilderMethodReference: MethodReference) = - fingerprint { - returns(httpClientBuilderMethodReference.returnType) - parameters() - custom { method, _ -> - method.indexOfFirstInstruction { - getReference() == httpClientBuilderMethodReference - } >= 0 - } - } +internal val BytecodePatchContext.httpClientBuilderMethod by gettingFirstImmutableMethod("client == null", "scheduler == null") diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt index a84aa699bf..6e4dbd7a13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt @@ -1,48 +1,45 @@ package app.revanced.patches.spotify.misc.privacy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val shareCopyUrlFingerprint = fingerprint { - returns("Ljava/lang/Object;") - parameters("Ljava/lang/Object;") - strings("clipboard", "Spotify Link") - custom { method, _ -> - method.name == "invokeSuspend" - } +internal val BytecodePatchContext.shareCopyUrlMethod by gettingFirstMethodDeclarativelyOrNull( + "clipboard", + "Spotify Link", +) { + name("invokeSuspend") + returnType("Ljava/lang/Object;") + parameterTypes("Ljava/lang/Object;") } -internal val oldShareCopyUrlFingerprint = fingerprint { - returns("Ljava/lang/Object;") - parameters("Ljava/lang/Object;") - strings("clipboard", "createNewSession failed") - custom { method, _ -> - method.name == "apply" - } +internal val BytecodePatchContext.oldShareCopyUrlMethod by gettingFirstMethodDeclaratively( + "clipboard", + "createNewSession failed", +) { + name("apply") + returnType("Ljava/lang/Object;") + parameterTypes("Ljava/lang/Object;") } -internal val formatAndroidShareSheetUrlFingerprint = fingerprint { - returns("Ljava/lang/String;") - parameters("L", "Ljava/lang/String;") +internal val BytecodePatchContext.formatAndroidShareSheetUrlMethod by gettingFirstMethodDeclarativelyOrNull { + returnType("Ljava/lang/String;") + parameterTypes("L", "Ljava/lang/String;") opcodes( Opcode.GOTO, Opcode.IF_EQZ, Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT + Opcode.RETURN_OBJECT, ) - literal { - '\n'.code.toLong() - } + literal { '\n'.code.toLong() } } -internal val oldFormatAndroidShareSheetUrlFingerprint = fingerprint { +internal val BytecodePatchContext.oldFormatAndroidShareSheetUrlMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/String;") - parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") - literal { - '\n'.code.toLong() - } + returnType("Ljava/lang/String;") + parameterTypes("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") + instructions('\n'.code.toLong()()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt index 4e4ad474cf..e25384f160 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt @@ -1,42 +1,39 @@ package app.revanced.patches.spotify.misc.privacy -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch;" @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { compatibleWith("com.spotify.music") dependsOn(sharedExtensionPatch) - execute { + apply { val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + - "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" + "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" - val copyFingerprint = if (shareCopyUrlFingerprint.originalMethodOrNull != null) { - shareCopyUrlFingerprint + val copyMethod = if (shareCopyUrlMethod != null) { + shareCopyUrlMethod } else { - oldShareCopyUrlFingerprint + oldShareCopyUrlMethod } - copyFingerprint.method.apply { + copyMethod!!.apply { val newPlainTextInvokeIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "newPlainText" + methodReference?.name == "newPlainText" } val urlRegister = getInstruction(newPlainTextInvokeIndex).registerD @@ -45,15 +42,14 @@ val sanitizeSharingLinksPatch = bytecodePatch( """ invoke-static { v$urlRegister }, $extensionMethodDescriptor move-result-object v$urlRegister - """ + """, ) } // Android native share sheet is used for all other quick share types (X, WhatsApp, etc). val shareUrlParameter: String - val shareSheetFingerprint = if (formatAndroidShareSheetUrlFingerprint.originalMethodOrNull != null) { - val methodAccessFlags = formatAndroidShareSheetUrlFingerprint.originalMethod - shareUrlParameter = if (AccessFlags.STATIC.isSet(methodAccessFlags.accessFlags)) { + val shareSheetMethod = if (formatAndroidShareSheetUrlMethod != null) { + shareUrlParameter = if (AccessFlags.STATIC.isSet(formatAndroidShareSheetUrlMethod!!.accessFlags)) { // In newer implementations the method is static, so p0 is not `this`. "p1" } else { @@ -62,18 +58,18 @@ val sanitizeSharingLinksPatch = bytecodePatch( "p2" } - formatAndroidShareSheetUrlFingerprint + formatAndroidShareSheetUrlMethod } else { shareUrlParameter = "p2" - oldFormatAndroidShareSheetUrlFingerprint + oldFormatAndroidShareSheetUrlMethod } - shareSheetFingerprint.method.addInstructions( + shareSheetMethod!!.addInstructions( 0, """ invoke-static { $shareUrlParameter }, $extensionMethodDescriptor move-result-object $shareUrlParameter - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt index 3566512e84..1a238ba6f2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt @@ -1,9 +1,10 @@ package app.revanced.patches.spotify.misc.widgets -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val canBindAppWidgetPermissionFingerprint = fingerprint { - strings("android.permission.BIND_APPWIDGET") +internal val BytecodePatchContext.canBindAppWidgetPermissionMethod by gettingFirstMethodDeclaratively("android.permission.BIND_APPWIDGET") { opcodes(Opcode.AND_INT_LIT8) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt index ad40f24e2e..1ce32fcebd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt @@ -4,16 +4,16 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val fixThirdPartyLaunchersWidgets = bytecodePatch( +val fixThirdPartyLaunchersWidgetsPatch = bytecodePatch( name = "Fix third party launchers widgets", description = "Fixes Spotify widgets not working in third party launchers, like Nova Launcher.", ) { compatibleWith("com.spotify.music") - execute { + apply { // Only system app launchers are granted the BIND_APPWIDGET permission. // Override the method that checks for it to always return true, as this permission is not actually required // for the widgets to work. - canBindAppWidgetPermissionFingerprint.method.returnEarly(true) + canBindAppWidgetPermissionMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt deleted file mode 100644 index bcf94324c8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.spotify.navbar - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Obsolete and will be deleted soon") -@Suppress("unused") -val premiumNavbarTabPatch = bytecodePatch( - description = "Hides the premium tab from the navigation bar.", -) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt index 103f47750a..e314c40197 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt @@ -1,15 +1,20 @@ package app.revanced.patches.spotify.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;" -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass(SPOTIFY_MAIN_ACTIVITY) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == SPOTIFY_MAIN_ACTIVITY - } + returnType("V") + parameterTypes("Landroid/os/Bundle;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideOffersTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideOffersTabPatch.kt index b7831e14ae..b63eba2d2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideOffersTabPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideOffersTabPatch.kt @@ -5,12 +5,10 @@ import app.revanced.util.childElementsSequence import app.revanced.util.getNode @Suppress("unused") -val hideOffersTabPatch = resourcePatch( - name = "Hide offers tab", -) { +val hideOffersTabPatch = resourcePatch("Hide offers tab") { compatibleWith("de.stocard.stocard") - execute { + apply { document("res/menu/bottom_navigation_menu.xml").use { document -> document.getNode("menu").apply { removeChild( diff --git a/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideStoryBubblesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideStoryBubblesPatch.kt index aab14bae99..2819b76896 100644 --- a/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideStoryBubblesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/stocard/layout/HideStoryBubblesPatch.kt @@ -4,12 +4,10 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.util.getNode @Suppress("unused") -val hideStoryBubblesPatch = resourcePatch( - name = "Hide story bubbles", -) { +val hideStoryBubblesPatch = resourcePatch("Hide story bubbles") { compatibleWith("de.stocard.stocard") - execute { + apply { document("res/layout/rv_story_bubbles_list.xml").use { document -> document.getNode("androidx.recyclerview.widget.RecyclerView").apply { arrayOf( diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/distractions/HideDistractionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/distractions/HideDistractionsPatch.kt index 93788fc70d..67ca9f6f4f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/distractions/HideDistractionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/distractions/HideDistractionsPatch.kt @@ -1,14 +1,15 @@ package app.revanced.patches.strava.distractions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableBooleanEncodedValue.Companion.toMutable +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.firstClassDef +import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableClass -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableBooleanEncodedValue.Companion.toMutable import app.revanced.patches.strava.misc.extension.sharedExtensionPatch -import app.revanced.util.findMutableMethodOf import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference import com.android.tools.smali.dexlib2.immutable.value.ImmutableBooleanEncodedValue @@ -48,64 +49,57 @@ val hideDistractionsPatch = bytecodePatch( val logger = Logger.getLogger(this::class.java.name) - val options = arrayOf( - booleanOption( - key = "upselling", - title = "Upselling", + val options = mapOf( + "upselling" to booleanOption( + name = "Upselling", description = "Elements that suggest you subscribe.", default = true, required = true, ), - booleanOption( - key = "promo", - title = "Promotions", + "promo" to booleanOption( + name = "Promotions", description = "Elements that promote features, challenges, clubs, etc.", default = true, required = true, ), - booleanOption( - key = "followSuggestions", - title = "Who to Follow", + "followSuggestions" to booleanOption( + name = "Who to Follow", description = "Popular athletes, followers, people near you etc.", default = true, required = true, ), - booleanOption( - key = "challengeSuggestions", - title = "Suggested Challenges", + "challengeSuggestions" to booleanOption( + name = "Suggested Challenges", description = "Random challenges Strava wants you to join.", default = true, required = true, ), - booleanOption( - key = "joinChallenge", - title = "Join Challenge", + "joinChallenge" to booleanOption( + name = "Join Challenge", description = "Challenges your follows have joined.", default = false, required = true, ), - booleanOption( - key = "joinClub", - title = "Joined a club", + "joinClub" to booleanOption( + name = "Joined a club", description = "Clubs your follows have joined.", default = false, required = true, ), - booleanOption( - key = "activityLookback", - title = "Activity lookback", + "activityLookback" to booleanOption( + name = "Activity lookback", description = "Your activity from X years ago", default = false, required = true, ), ) - execute { + apply { // region Write option values into extension class. - val extensionClass = classBy { it.type == EXTENSION_CLASS_DESCRIPTOR }!!.mutableClass.apply { - options.forEach { option -> - staticFields.first { field -> field.name == option.key }.initialValue = + val extensionClass = firstClassDef { type == EXTENSION_CLASS_DESCRIPTOR }.apply { + options.forEach { (key, option) -> + staticFields.first { field -> field.name == key }.initialValue = ImmutableBooleanEncodedValue.forBoolean(option.value == true).toMutable() } } @@ -115,7 +109,7 @@ val hideDistractionsPatch = bytecodePatch( // region Intercept all classes' property getter calls. fun MutableMethod.cloneAndIntercept( - classDef: MutableClass, + classDef: MutableClassDef, extensionMethodName: String, extensionMethodParameterTypes: List, ) { @@ -128,7 +122,8 @@ val hideDistractionsPatch = bytecodePatch( if (extensionClass.directMethods.none { method -> MethodUtil.methodSignaturesMatch(method, extensionMethodReference) - }) { + } + ) { logger.info { "Skipped interception of $this due to missing $extensionMethodReference" } return } @@ -152,7 +147,7 @@ val hideDistractionsPatch = bytecodePatch( invoke-static $registers, $extensionMethodReference move-result-object v0 return-object v0 - """ + """, ) logger.fine { "Intercepted $this with $extensionMethodReference" } @@ -163,27 +158,25 @@ val hideDistractionsPatch = bytecodePatch( classDef.virtualMethods += this } - classes.filter { it.type.startsWith(MODULAR_FRAMEWORK_CLASS_DESCRIPTOR_PREFIX) }.forEach { classDef -> - val classDefProxy by lazy { proxy(classDef) } + classDefs.filter { it.type.startsWith(MODULAR_FRAMEWORK_CLASS_DESCRIPTOR_PREFIX) }.forEach { classDef -> + val mutableClassDef by lazy { classDefs.getOrReplaceMutable(classDef) } classDef.virtualMethods.forEach { method -> fingerprints.find { fingerprint -> method.name == "get${fingerprint.name}" && method.parameterTypes == fingerprint.parameterTypes }?.let { fingerprint -> - classDefProxy.mutableClass.let { mutableClass -> - // Upcast to the interface if this is an interface implementation. - val parameterType = classDef.interfaces.find { - classes.find { interfaceDef -> interfaceDef.type == it }?.virtualMethods?.any { interfaceMethod -> - MethodUtil.methodSignaturesMatch(interfaceMethod, method) - } == true - } ?: classDef.type + // Upcast to the interface if this is an interface implementation. + val parameterType = classDef.interfaces.find { + classDefs.find { interfaceDef -> interfaceDef.type == it }?.virtualMethods?.any { interfaceMethod -> + MethodUtil.methodSignaturesMatch(interfaceMethod, method) + } == true + } ?: classDef.type - mutableClass.findMutableMethodOf(method).cloneAndIntercept( - mutableClass, - "filter${fingerprint.name}", - listOf(parameterType) + fingerprint.parameterTypes - ) - } + mutableClassDef.firstMethod(method).cloneAndIntercept( + mutableClassDef, + "filter${fingerprint.name}", + listOf(parameterType) + fingerprint.parameterTypes, + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivity.kt b/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivityPatch.kt similarity index 89% rename from patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivity.kt rename to patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivityPatch.kt index adc2b69baa..9d4756f455 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivity.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/AddGiveGroupKudosButtonToGroupActivityPatch.kt @@ -1,11 +1,12 @@ package app.revanced.patches.strava.groupkudos -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.util.childElementsSequence import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.getReference @@ -34,7 +35,7 @@ private var leaveIdId = -1 private val addGiveKudosButtonToLayoutPatch = resourcePatch { fun String.toResourceId() = substring(2).toInt(16) - execute { + apply { document("res/values/public.xml").use { public -> fun Sequence.firstByName(name: String) = first { it.getAttribute("name") == name @@ -92,19 +93,19 @@ private val addGiveKudosButtonToLayoutPatch = resourcePatch { } @Suppress("unused") -val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( +val addGiveGroupKudosButtonToGroupActivityPatch = bytecodePatch( name = "Add 'Give Kudos' button to 'Group Activity'", - description = "Adds a button that triggers the same action as shaking your phone would." + description = "Adds a button that triggers the same action as shaking your phone would.", ) { compatibleWith("com.strava") dependsOn(addGiveKudosButtonToLayoutPatch) - execute { - val className = initFingerprint.originalClassDef.type + apply { + val className = initMethod.immutableClassDef.type val onClickListenerClassName = "${className.substringBeforeLast(';')}\$GiveKudosOnClickListener;" - initFingerprint.method.apply { + initMethod.apply { val constLeaveIdInstruction = instructions.filterIsInstance().first { it.narrowLiteral == leaveIdId } @@ -126,11 +127,11 @@ val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( new-instance v0, $onClickListenerClassName invoke-direct { v0, p0 }, $onClickListenerClassName->($className)V invoke-virtual { p3, v0 }, $buttonClassName->setOnClickListener($ON_CLICK_LISTENER_CLASS_DESCRIPTOR)V - """ + """, ) } - val actionHandlerMethod = actionHandlerFingerprint.match(initFingerprint.originalClassDef).method + val actionHandlerMethod = initMethod.immutableClassDef.getActionHandlerMethod() val constShakeToKudosStringIndex = actionHandlerMethod.instructions.indexOfFirst { it is NarrowLiteralInstruction && it.narrowLiteral == shakeToKudosStringId } @@ -145,7 +146,7 @@ val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( PUBLIC.value or FINAL.value or SYNTHETIC.value, null, listOf(), - setOf() + setOf(), ) val initFieldMethod = ImmutableMethod( @@ -156,14 +157,14 @@ val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( PUBLIC.value or SYNTHETIC.value or CONSTRUCTOR.value, setOf(), setOf(), - MutableMethodImplementation(2) + MutableMethodImplementation(2), ).toMutable().apply { addInstructions( """ invoke-direct {p0}, Ljava/lang/Object;->()V iput-object p1, p0, $outerThisField return-void - """ + """, ) } @@ -175,15 +176,15 @@ val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( PUBLIC.value or FINAL.value, setOf(), setOf(), - MutableMethodImplementation(2) + MutableMethodImplementation(2), ).toMutable().apply { addInstructions( """ sget-object p1, ${getSingletonInstruction.reference} iget-object p0, p0, $outerThisField - invoke-virtual { p0, p1 }, ${actionHandlerFingerprint.method} + invoke-virtual { p0, p1 }, $actionHandlerMethod return-void - """ + """, ) } @@ -195,7 +196,7 @@ val addGiveGroupKudosButtonToGroupActivity = bytecodePatch( "ProGuard", // Same as source file name of other classes. listOf(), setOf(outerThisField), - setOf(initFieldMethod, onClickMethod) - ).let(classes::add) + setOf(initFieldMethod, onClickMethod), + ).let(classDefs::add) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/Fingerprints.kt index f5ce604fd2..4f8d9f09b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/groupkudos/Fingerprints.kt @@ -1,14 +1,16 @@ package app.revanced.patches.strava.groupkudos -import app.revanced.patcher.fingerprint +import app.revanced.patcher.firstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val initFingerprint = fingerprint { - parameters("Lcom/strava/feed/view/modal/GroupTabFragment;" , "Z" , "Landroidx/fragment/app/FragmentManager;") - custom { method, _ -> - method.name == "" - } +internal val BytecodePatchContext.initMethod by gettingFirstMethodDeclaratively { + name("") + parameterTypes("Lcom/strava/feed/view/modal/GroupTabFragment;", "Z", "Landroidx/fragment/app/FragmentManager;") } -internal val actionHandlerFingerprint = fingerprint { - strings("state") -} +context(_: BytecodePatchContext) +internal fun ClassDef.getActionHandlerMethod() = firstMethod("state") diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/media/download/AddMediaDownloadPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/media/download/AddMediaDownloadPatch.kt index 01da305c9e..a3905c139a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/media/download/AddMediaDownloadPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/media/download/AddMediaDownloadPatch.kt @@ -1,15 +1,15 @@ package app.revanced.patches.strava.media.download -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.firstImmutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.strava.misc.extension.sharedExtensionPatch import app.revanced.util.getReference import app.revanced.util.writeRegister @@ -25,21 +25,21 @@ private const val MEDIA_DOWNLOAD_CLASS_DESCRIPTOR = "Lapp/revanced/extension/str @Suppress("unused") val addMediaDownloadPatch = bytecodePatch( name = "Add media download", - description = "Extends the full-screen media viewer menu with items to copy or open their URLs or download them directly." + description = "Extends the full-screen media viewer menu with items to copy or open their URLs or download them directly.", ) { compatibleWith("com.strava") dependsOn( resourceMappingPatch, - sharedExtensionPatch + sharedExtensionPatch, ) - execute { - val fragmentClass = classBy { it.endsWith("/FullscreenMediaFragment;") }!!.mutableClass + apply { + val fragmentClass = firstImmutableClassDef { endsWith("/FullscreenMediaFragment;") } // region Extend menu of `FullscreenMediaFragment` with actions. - createAndShowFragmentFingerprint.match(fragmentClass).method.apply { + fragmentClass.getCreateAndShowFragmentMethod().apply { val setTrueIndex = instructions.indexOfFirst { instruction -> instruction.opcode == Opcode.IPUT_BOOLEAN } @@ -54,17 +54,22 @@ val addMediaDownloadPatch = bytecodePatch( new-instance v$actionRegister, $ACTION_CLASS_DESCRIPTOR sget v${actionRegister + 1}, $MEDIA_DOWNLOAD_CLASS_DESCRIPTOR->$actionId:I const v${actionRegister + 2}, 0x0 - const v${actionRegister + 3}, ${resourceMappings["string", string]} - const v${actionRegister + 4}, ${resourceMappings["color", color]} - const v${actionRegister + 5}, ${resourceMappings["drawable", drawable]} + const v${actionRegister + 3}, ${ResourceType.STRING[string]} + const v${actionRegister + 4}, ${ResourceType.COLOR[color]} + const v${actionRegister + 5}, ${ResourceType.DRAWABLE[drawable]} move/from16 v${actionRegister + 6}, v${actionRegister + 4} invoke-direct/range { v$actionRegister .. v${actionRegister + 7} }, $ACTION_CLASS_DESCRIPTOR->(ILjava/lang/String;IIIILjava/io/Serializable;)V invoke-virtual { v$actionRegistrarRegister, v$actionRegister }, Lcom/strava/bottomsheet/a;->a(Lcom/strava/bottomsheet/BottomSheetItem;)V - """ + """, ) addMenuItem("ACTION_COPY_LINK", "copy_link", "core_o3", "actions_link_normal_xsmall") - addMenuItem("ACTION_OPEN_LINK", "fallback_menu_item_open_in_browser", "core_o3", "actions_link_external_normal_xsmall") + addMenuItem( + "ACTION_OPEN_LINK", + "fallback_menu_item_open_in_browser", + "core_o3", + "actions_link_external_normal_xsmall", + ) addMenuItem("ACTION_DOWNLOAD", "download", "core_o3", "actions_download_normal_xsmall") // Move media to last parameter of `Action` constructor. @@ -73,7 +78,7 @@ val addMediaDownloadPatch = bytecodePatch( } addInstruction( getMediaInstruction.location.index + 1, - "move-object/from16 v${actionRegister + 7}, v${getMediaInstruction.writeRegister}" + "move-object/from16 v${actionRegister + 7}, v${getMediaInstruction.writeRegister}", ) } @@ -81,15 +86,15 @@ val addMediaDownloadPatch = bytecodePatch( // region Handle new actions. - val actionClass = classes.first { clazz -> - clazz.type == ACTION_CLASS_DESCRIPTOR + val actionClass = firstImmutableClassDef { + type == ACTION_CLASS_DESCRIPTOR } val actionSerializableField = actionClass.instanceFields.first { field -> field.type == "Ljava/io/Serializable;" } // Handle "copy link" & "open link" & "download" actions. - handleMediaActionFingerprint.match(fragmentClass).method.apply { + fragmentClass.getHandleMediaActionMethod().apply { // Call handler if action ID < 0 (= custom). val moveInstruction = instructions.first { instruction -> instruction.opcode == Opcode.MOVE_RESULT @@ -107,7 +112,7 @@ val addMediaDownloadPatch = bytecodePatch( move-result v0 return v0 """, - ExternalLabel("move", instructions[indexAfterMoveInstruction]) + ExternalLabel("move", instructions[indexAfterMoveInstruction]), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/media/download/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/media/download/Fingerprints.kt index 2f6566a827..03777c0c19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/media/download/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/media/download/Fingerprints.kt @@ -1,15 +1,21 @@ package app.revanced.patches.strava.media.download -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val createAndShowFragmentFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getCreateAndShowFragmentMethod() = firstMethodDeclaratively("mediaType") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - strings("mediaType") + returnType("V") + parameterTypes("L") } -internal val handleMediaActionFingerprint = fingerprint { - parameters("Landroid/view/View;", "Lcom/strava/bottomsheet/BottomSheetItem;") +context(_: BytecodePatchContext) +internal fun ClassDef.getHandleMediaActionMethod() = firstMethodDeclaratively { + parameterTypes("Landroid/view/View;", "Lcom/strava/bottomsheet/BottomSheetItem;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/Fingerprints.kt index 9653ff76bb..9f99e54cce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/Fingerprints.kt @@ -1,21 +1,25 @@ package app.revanced.patches.strava.media.upload -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val getCompressionQualityFingerprint = fingerprint { - custom { method, _ -> - method.name == "getCompressionQuality" - } +context(_: BytecodePatchContext) +internal fun ClassDef.getGetCompressionQualityMethod() = firstMethodDeclaratively { + name("getCompressionQuality") + definingClass("/MediaUploadParameters;") } -internal val getMaxDurationFingerprint = fingerprint { - custom { method, _ -> - method.name == "getMaxDuration" - } +context(_: BytecodePatchContext) +internal fun ClassDef.getGetMaxDurationMethod() = firstMethodDeclaratively { + name("getMaxDuration") + definingClass("/MediaUploadParameters;") } -internal val getMaxSizeFingerprint = fingerprint { - custom { method, _ -> - method.name == "getMaxSize" - } +context(_: BytecodePatchContext) +internal fun ClassDef.getGetMaxSizeMethod() = firstMethodDeclaratively { + name("getMaxSize") + definingClass("/MediaUploadParameters;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/OverwriteMediaUploadParametersPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/OverwriteMediaUploadParametersPatch.kt index 1ae9bc18c4..98ad7751fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/OverwriteMediaUploadParametersPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/media/upload/OverwriteMediaUploadParametersPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.strava.media.upload +import app.revanced.patcher.firstImmutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.intOption import app.revanced.patcher.patch.longOption @@ -13,36 +14,33 @@ val overwriteMediaUploadParametersPatch = bytecodePatch( compatibleWith("com.strava") val compressionQuality by intOption( - key = "compressionQuality", - title = "Compression quality (percent)", + name = "Compression quality (percent)", description = "This is used as the JPEG quality setting (≤ 100).", ) { it == null || it in 1..100 } val maxDuration by longOption( - key = "maxDuration", - title = "Max duration (seconds)", + name = "maxDuration", description = "The maximum length (≤ ${60 * 60}) of a video before it gets trimmed.", ) { it == null || it in 1..60 * 60 } val maxSize by intOption( - key = "maxSize", - title = "Max size (pixels)", + name = "Max size (pixels)", description = "The image gets resized so that the smaller dimension (width/height) does not exceed this value (≤ 10000).", ) { it == null || it in 1..10000 } - execute { - val mediaUploadParametersClass = classes.single { it.endsWith("/MediaUploadParameters;") } + apply { + val mediaUploadParametersClass = firstImmutableClassDef { type.endsWith("/MediaUploadParameters;") } compressionQuality?.let { compressionQuality -> - getCompressionQualityFingerprint.match(mediaUploadParametersClass).method.returnEarly(compressionQuality / 100f) + mediaUploadParametersClass.getGetCompressionQualityMethod().returnEarly(compressionQuality / 100f) } maxDuration?.let { maxDuration -> - getMaxDurationFingerprint.match(mediaUploadParametersClass).method.returnEarly(maxDuration) + mediaUploadParametersClass.getGetMaxDurationMethod().returnEarly(maxDuration) } maxSize?.let { - getMaxSizeFingerprint.match(mediaUploadParametersClass).method.returnEarly(it) + mediaUploadParametersClass.getGetMaxSizeMethod().returnEarly(it) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/strava/misc/extension/Hooks.kt index 6c2a977694..4d85fd694e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/misc/extension/Hooks.kt @@ -1,9 +1,10 @@ package app.revanced.patches.strava.misc.extension +import app.revanced.patcher.definingClass +import app.revanced.patcher.name import app.revanced.patches.shared.misc.extension.extensionHook internal val applicationOnCreateHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/StravaApplication;") - } + name("onCreate") + definingClass("/StravaApplication;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt index 6b7e742350..3d24c92cdd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/password/EnablePasswordLoginPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.strava.password -import app.revanced.patcher.Fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @@ -11,10 +10,8 @@ val enablePasswordLoginPatch = bytecodePatch( ) { compatibleWith("com.strava") - execute { - fun Fingerprint.returnTrue() = method.returnEarly(true) - - logInGetUsePasswordFingerprint.returnTrue() - emailChangeGetUsePasswordFingerprint.returnTrue() + apply { + logInGetUsePasswordMethod.returnEarly(true) + emailChangeGetUsePasswordMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt index 94c88490a9..c8afb0fa0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/password/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.strava.password -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val logInGetUsePasswordFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getUsePassword" && classDef.endsWith("/RequestOtpLogInNetworkResponse;") - } +internal val BytecodePatchContext.logInGetUsePasswordMethod by gettingFirstMethodDeclaratively { + name("getUsePassword") + definingClass("/RequestOtpLogInNetworkResponse;") } -internal val emailChangeGetUsePasswordFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getUsePassword" && classDef.endsWith("/RequestEmailChangeWithOtpOrPasswordResponse;") - } +internal val BytecodePatchContext.emailChangeGetUsePasswordMethod by gettingFirstMethodDeclaratively { + name("getUsePassword") + definingClass("/RequestEmailChangeWithOtpOrPasswordResponse;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt index 313a98d1d3..4387be3575 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/BlockSnowplowTrackingPatch.kt @@ -10,8 +10,8 @@ val blockSnowplowTrackingPatch = bytecodePatch( ) { compatibleWith("com.strava") - execute { - // Keep events list empty, otherwise sent to https://c.strava.com/com.snowplowanalytics.snowplow/tp2. - insertEventFingerprint.method.returnEarly() + apply { + // Keep events list empty, otherwise sent to https://c.strava.com/com.snowplowanalytics.snowplow/tp2. + insertEventMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt index 196602ba04..5f2d921348 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/privacy/Fingerprints.kt @@ -1,9 +1,8 @@ package app.revanced.patches.strava.privacy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext // https://github.com/snowplow/snowplow-android-tracker/blob/2.2.0/snowplow-tracker/src/main/java/com/snowplowanalytics/snowplow/internal/emitter/storage/SQLiteEventStore.java#L130 // Not the exact same code (e.g. returns void instead of long), even though the version number matches. -internal val insertEventFingerprint = fingerprint { - strings("Added event to database: %s") -} +internal val BytecodePatchContext.insertEventMethod by gettingFirstMethodDeclaratively("Added event to database: %s") diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt index 128f86870f..f77b83b4dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/DisableQuickEditPatch.kt @@ -10,7 +10,7 @@ val disableQuickEditPatch = bytecodePatch( ) { compatibleWith("com.strava") - execute { - getHasAccessToQuickEditFingerprint.method.returnEarly() + apply { + getHasAccessToQuickEditMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt index acd48542bc..51395ba3ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/quickedit/Fingerprints.kt @@ -1,10 +1,11 @@ package app.revanced.patches.strava.quickedit -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val getHasAccessToQuickEditFingerprint = fingerprint { - returns("Z") - custom { method, _ -> - method.name == "getHasAccessToQuickEdit" - } +internal val BytecodePatchContext.getHasAccessToQuickEditMethod by gettingFirstMethodDeclaratively { + name("getHasAccessToQuickEdit") + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt index 45583ce4e4..9aeefaa9a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.strava.subscription -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val getSubscribedFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getSubscribed" && classDef.endsWith("/SubscriptionDetailResponse;") - } +internal val BytecodePatchContext.getSubscribedMethod by gettingFirstMethodDeclaratively { + name("getSubscribed") + definingClass("/SubscriptionDetailResponse;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt index e9fbc49a42..c09aeae689 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt @@ -4,13 +4,13 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -val unlockSubscriptionPatch = bytecodePatch( +val unlockSubscriptionFeaturesPatch = bytecodePatch( name = "Unlock subscription features", description = "Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".", ) { compatibleWith("com.strava") - execute { - getSubscribedFingerprint.method.returnEarly(true) + apply { + getSubscribedMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt deleted file mode 100644 index 93ef5337af..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.patches.strava.upselling - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.strava.distractions.hideDistractionsPatch - -@Suppress("unused") -@Deprecated("Superseded by \"Hide distractions\" patch", ReplaceWith("hideDistractionsPatch")) -val disableSubscriptionSuggestionsPatch = bytecodePatch( - name = "Disable subscription suggestions", -) { - compatibleWith("com.strava") - - dependsOn(hideDistractionsPatch.apply { - options["upselling"] = true - options["promo"] = false - options["followSuggestions"] = false - options["challengeSuggestions"] = false - options["joinChallenge"] = false - options["joinClub"] = false - options["activityLookback"] = false - }) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt deleted file mode 100644 index 1204a36f21..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.strava.upselling - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal val getModulesFingerprint = fingerprint { - opcodes(Opcode.IGET_OBJECT) - custom { method, classDef -> - classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt index 0efa845fbe..8d3e49d84e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.swissid.integritycheck -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val checkIntegrityFingerprint = fingerprint { - returns("V") - parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") - strings("it", "result") +internal val BytecodePatchContext.checkIntegrityMethod by gettingFirstMethodDeclaratively("it", "result") { + returnType("V") + parameterTypes("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt index f8a193316d..ab4cb6b04a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheckPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.swissid.integritycheck -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch private const val RESULT_METHOD_REFERENCE = @@ -17,8 +17,8 @@ val removeGooglePlayIntegrityCheckPatch = bytecodePatch( ) { compatibleWith("com.swisssign.swissid.mobile"("5.2.9")) - execute { - checkIntegrityFingerprint.method.addInstructions( + apply { + checkIntegrityMethod.addInstructions( 0, """ iget-object p1, p0, $RESULT_METHOD_REFERENCE diff --git a/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt index c718694806..e0c92255fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/threads/HideAdsPatch.kt @@ -1,16 +1,14 @@ package app.revanced.patches.threads import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.meta.ads.adInjectorFingerprint +import app.revanced.patches.meta.ads.adInjectorMethod import app.revanced.util.returnEarly @Suppress("unused") -val hideAdsPatch = bytecodePatch( - name = "Hide ads", -) { +val hideAdsPatch = bytecodePatch("Hide ads") { compatibleWith("com.instagram.barcelona"("382.0.0.51.85")) - execute { - adInjectorFingerprint.method.returnEarly(false) + apply { + adInjectorMethod.returnEarly(false) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt index 4bd688de49..2f8683d9a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt @@ -1,15 +1,16 @@ package app.revanced.patches.ticktick.misc.themeunlock -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkLockedThemesFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("Theme;") && method.name == "isLockedTheme" - } +internal val BytecodePatchContext.checkLockedThemesMethod by gettingFirstMethodDeclaratively { + name("isLockedTheme") + definingClass("Theme;") } -internal val setThemeFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" - } +internal val BytecodePatchContext.setThemeMethod by gettingFirstMethodDeclaratively { + name("lambda\$updateUserBtn\$1") + definingClass("ThemePreviewActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt index c9d777904a..3a194f97ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt @@ -1,18 +1,18 @@ package app.revanced.patches.ticktick.misc.themeunlock -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val unlockProPatch = bytecodePatch( +val unlockThemesPatch = bytecodePatch( name = "Unlock themes", description = "Unlocks all themes that are inaccessible until a certain level is reached.", ) { compatibleWith("com.ticktick.task") - execute { - checkLockedThemesFingerprint.method.addInstructions( + apply { + checkLockedThemesMethod.addInstructions( 0, """ const/4 v0, 0x0 @@ -20,6 +20,6 @@ val unlockProPatch = bytecodePatch( """, ) - setThemeFingerprint.method.removeInstructions(0, 10) + setThemeMethod.removeInstructions(0, 10) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt index 0f1227e4d3..57dfdbd3c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt @@ -1,11 +1,11 @@ package app.revanced.patches.tiktok.feedfilter -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.settingsPatch -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -27,23 +27,22 @@ val feedFilterPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { + apply { arrayOf( - feedApiServiceLIZFingerprint.method to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V", - followFeedFingerprint.method to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V" + feedApiServiceLIZMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V", + followFeedMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V", ).forEach { (method, filterSignature) -> val returnInstruction = method.instructions.first { it.opcode == Opcode.RETURN_OBJECT } val register = (returnInstruction as OneRegisterInstruction).registerA method.addInstruction( returnInstruction.location.index, - "invoke-static { v$register }, $filterSignature" + "invoke-static { v$register }, $filterSignature", ) } - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableFeedFilter()V", ) } - } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt index f85dd2d072..fd114a91bb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt @@ -1,22 +1,22 @@ package app.revanced.patches.tiktok.feedfilter -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val feedApiServiceLIZFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/FeedApiService;") && method.name == "fetchFeedList" - } +internal val BytecodePatchContext.feedApiServiceLIZMethod by gettingFirstMethodDeclaratively { + name("fetchFeedList") + definingClass("/FeedApiService;") } -internal val followFeedFingerprint = fingerprint { +internal val BytecodePatchContext.followFeedMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") - strings("getFollowFeedList") + returnType("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") opcodes( Opcode.INVOKE_INTERFACE_RANGE, Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_INTERFACE ) + instructions("getFollowFeedList"(String::contains)) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt index eb28683743..5a41acf760 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt @@ -1,10 +1,12 @@ package app.revanced.patches.tiktok.interaction.cleardisplay -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val onClearDisplayEventFingerprint = fingerprint { - custom { method, classDef -> - // Internally the feature is called "Clear mode". - classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" - } +internal val BytecodePatchContext.onClearDisplayEventMethod by gettingFirstMethodDeclaratively { + // Internally the feature is called "Clear mode". + name("onClearModeEvent") + definingClass("/ClearModePanelComponent;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt index 13c829e625..5ed3d1af49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt @@ -1,11 +1,11 @@ package app.revanced.patches.tiktok.interaction.cleardisplay -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.tiktok.shared.onRenderFirstFrameFingerprint +import app.revanced.patches.tiktok.shared.onRenderFirstFrameMethod import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -20,14 +20,14 @@ val rememberClearDisplayPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { - onClearDisplayEventFingerprint.method.let { + apply { + onClearDisplayEventMethod.apply { // region Hook the "Clear display" configuration save event to remember the state of clear display. - val isEnabledIndex = it.indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 - val isEnabledRegister = it.getInstruction(isEnabledIndex - 1).registerA + val isEnabledIndex = indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 + val isEnabledRegister = getInstruction(isEnabledIndex - 1).registerA - it.addInstructions( + addInstructions( isEnabledIndex, "invoke-static { v$isEnabledRegister }, " + "Lapp/revanced/extension/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V", @@ -37,8 +37,8 @@ val rememberClearDisplayPatch = bytecodePatch( // region Override the "Clear display" configuration load event to load the state of clear display. - val clearDisplayEventClass = it.parameters[0].type - onRenderFirstFrameFingerprint.method.addInstructionsWithLabels( + val clearDisplayEventClass = parameters[0].type + onRenderFirstFrameMethod.addInstructionsWithLabels( 0, """ # Create a new clearDisplayEvent and post it to the EventBus (https://github.com/greenrobot/EventBus) @@ -61,7 +61,7 @@ val rememberClearDisplayPatch = bytecodePatch( invoke-direct { v0, v1, v2, v3, v4 }, $clearDisplayEventClass->(ILjava/lang/String;Ljava/lang/String;Z)V invoke-virtual { v0 }, $clearDisplayEventClass->post()Lcom/ss/android/ugc/governance/eventbus/IEvent; """, - ExternalLabel("clear_display_disabled", onRenderFirstFrameFingerprint.method.getInstruction(0)), + ExternalLabel("clear_display_disabled", onRenderFirstFrameMethod.getInstruction(0)), ) // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt index e6894b521e..3150c6a190 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt @@ -1,14 +1,10 @@ package app.revanced.patches.tiktok.interaction.downloads -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.settingsPatch -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference import app.revanced.util.returnEarly @@ -33,12 +29,12 @@ val downloadsPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { - aclCommonShareFingerprint.method.returnEarly(0) - aclCommonShare2Fingerprint.method.returnEarly(2) + apply { + aclCommonShareMethod.returnEarly(0) + aclCommonShare2Method.returnEarly(2) // Download videos without watermark. - aclCommonShare3Fingerprint.method.addInstructionsWithLabels( + aclCommonShare3Method.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldRemoveWatermark()Z @@ -52,7 +48,7 @@ val downloadsPatch = bytecodePatch( ) // Change the download path patch. - downloadUriFingerprint.method.apply { + downloadUriMethod.apply { findInstructionIndicesReversedOrThrow { getReference().let { it?.definingClass == "Landroid/os/Environment;" && it.name.startsWith("DIRECTORY_") @@ -75,7 +71,7 @@ val downloadsPatch = bytecodePatch( } } - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableDownload()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt index 160b49c158..a9d01076a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt @@ -1,46 +1,42 @@ package app.revanced.patches.tiktok.interaction.downloads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val aclCommonShareFingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShareMethod by gettingFirstMethodDeclaratively { + name("getCode") + definingClass("/ACLCommonShare;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getCode" - } + returnType("I") } - -internal val aclCommonShare2Fingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShare2Method by gettingFirstMethodDeclaratively { + name("getShowType") + definingClass("/ACLCommonShare;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getShowType" - } + returnType("I") } - -internal val aclCommonShare3Fingerprint = fingerprint { +internal val BytecodePatchContext.aclCommonShare3Method by gettingFirstMethodDeclaratively { + name("getTranscode") + definingClass("/ACLCommonShare;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - custom { method, classDef -> - classDef.endsWith("/ACLCommonShare;") && - method.name == "getTranscode" - } + returnType("I") } - -internal val downloadUriFingerprint = fingerprint { +internal val BytecodePatchContext.downloadUriMethod by gettingFirstMethodDeclaratively( + "/", + "/Camera", + "/Camera/", + "video/mp4", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri;") - parameters( + returnType("Landroid/net/Uri;") + parameterTypes( "Landroid/content/Context;", - "Ljava/lang/String;" - ) - strings( - "/", - "/Camera", - "/Camera/", - "video/mp4" + "Ljava/lang/String;", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt index ce372ea421..164d42fb38 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt @@ -1,11 +1,12 @@ package app.revanced.patches.tiktok.interaction.seekbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val setSeekBarShowTypeFingerprint = fingerprint { - strings("seekbar show type change, change to:") -} +internal val BytecodePatchContext.setSeekBarShowTypeMethod by gettingFirstMethodDeclaratively( + "seekbar show type change, change to:" +) -internal val shouldShowSeekBarFingerprint = fingerprint { - strings("can not show seekbar, state: 1, not in resume") -} +internal val BytecodePatchContext.shouldShowSeekBarMethod by gettingFirstMethodDeclaratively( + "can not show seekbar, state: 1, not in resume" +) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt index 417095b339..7c8a0e914e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/ShowSeekbarPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.tiktok.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val showSeekbarPatch = bytecodePatch( @@ -13,15 +14,9 @@ val showSeekbarPatch = bytecodePatch( "com.zhiliaoapp.musically", ) - execute { - shouldShowSeekBarFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - setSeekBarShowTypeFingerprint.method.apply { + apply { + shouldShowSeekBarMethod.returnEarly(true) + setSeekBarShowTypeMethod.apply { val typeRegister = implementation!!.registerCount - 1 addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt index 221036bb96..8231957764 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt @@ -1,17 +1,16 @@ package app.revanced.patches.tiktok.interaction.speed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val getSpeedFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" - } +internal val BytecodePatchContext.getSpeedMethod by gettingFirstMethodDeclaratively { + name("onFeedSpeedSelectedEvent") + definingClass("/BaseListFragmentPanel;") } -internal val setSpeedFingerprint = fingerprint { +internal val BytecodePatchContext.setSpeedMethod by gettingFirstMethodDeclaratively("enterFrom") { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("V") - parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") - strings("enterFrom") + returnType("V") + parameterTypes("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt index d59626ee76..9ad16de080 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt @@ -1,13 +1,16 @@ package app.revanced.patches.tiktok.interaction.speed -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.tiktok.shared.getEnterFromFingerprint -import app.revanced.patches.tiktok.shared.onRenderFirstFrameFingerprint +import app.revanced.patches.tiktok.shared.getEnterFromMethod +import app.revanced.patches.tiktok.shared.onRenderFirstFrameMethod import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11x import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -22,49 +25,41 @@ val playbackSpeedPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { - setSpeedFingerprint.let { onVideoSwiped -> - getSpeedFingerprint.method.apply { - val injectIndex = - indexOfFirstInstructionOrThrow { getReference()?.returnType == "F" } + 2 - val register = getInstruction(injectIndex - 1).registerA + apply { + getSpeedMethod.apply { + val injectIndex = + indexOfFirstInstructionOrThrow { getReference()?.returnType == "F" } + 2 + val register = getInstruction(injectIndex - 1).registerA - addInstruction( - injectIndex, - "invoke-static { v$register }," + - " Lapp/revanced/extension/tiktok/speed/PlaybackSpeedPatch;->rememberPlaybackSpeed(F)V", - ) - } - - // By default, the playback speed will reset to 1.0 at the start of each video. - // Instead, override it with the desired playback speed. - onRenderFirstFrameFingerprint.method.addInstructions( - 0, - """ - # Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method. - const/4 v0, 0x1 - invoke-virtual { p0, v0 }, ${getEnterFromFingerprint.originalMethod} - move-result-object v0 - - # Model of current video retrieved using getCurrentAweme method. - invoke-virtual { p0 }, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme; - move-result-object v1 - - # Desired playback speed retrieved using getPlaybackSpeed method. - invoke-static { }, Lapp/revanced/extension/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F - move-result v2 - invoke-static { v0, v1, v2 }, ${onVideoSwiped.originalMethod} - """, - ) - - // Force enable the playback speed option for all videos. - onVideoSwiped.classDef.methods.find { method -> method.returnType == "Z" }?.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, + addInstruction( + injectIndex, + "invoke-static { v$register }," + + " Lapp/revanced/extension/tiktok/speed/PlaybackSpeedPatch;->rememberPlaybackSpeed(F)V", ) } + + // By default, the playback speed will reset to 1.0 at the start of each video. + // Instead, override it with the desired playback speed. + onRenderFirstFrameMethod.addInstructions( + 0, + """ + # Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method. + const/4 v0, 0x1 + invoke-virtual { p0, v0 }, $getEnterFromMethod + move-result-object v0 + + # Model of current video retrieved using getCurrentAweme method. + invoke-virtual { p0 }, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme; + move-result-object v1 + + # Desired playback speed retrieved using getPlaybackSpeed method. + invoke-static { }, Lapp/revanced/extension/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F + move-result v2 + invoke-static { v0, v1, v2 }, ${setSpeedMethod.definingClass}->${setSpeedMethod.name}(Ljava/lang/String;Lcom/ss/android/ugc/aweme/feed/model/Aweme;F)V + """, + ) + + // Force enable the playback speed option for all videos. + setSpeedMethod.classDef.methods.find { method -> method.returnType == "Z" }?.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt index db1912677b..ed5f57046a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt @@ -1,14 +1,14 @@ package app.revanced.patches.tiktok.misc.extension +import app.revanced.patcher.definingClass +import app.revanced.patcher.name +import app.revanced.patcher.parameterTypes +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook -import com.android.tools.smali.dexlib2.AccessFlags -internal val initHook = extensionHook { - custom { method, classDef -> - classDef.type == "Lcom/ss/android/ugc/aweme/main/MainActivity;" && - method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/ss/android/ugc/aweme/main/MainActivity;" +) /** * In some cases the extension code can be called before @@ -17,21 +17,17 @@ internal val initHook = extensionHook { * This class is called from startup code titled "BPEA RunnableGuardLancet". */ internal val jatoInitHook = extensionHook( - contextRegisterResolver = { "p1" } + getContextRegister = { "p1" } ) { - parameters("Landroid/content/Context;") - custom { method, classDef -> - classDef.type == "Lcom/ss/android/ugc/aweme/legoImp/task/JatoInitTask;" && - method.name == "run" - } + name("run") + definingClass("Lcom/ss/android/ugc/aweme/legoImp/task/JatoInitTask;") + parameterTypes("Landroid/content/Context;") } internal val storeRegionInitHook = extensionHook( - contextRegisterResolver = { "p1" } + getContextRegister = { "p1" } ) { - parameters("Landroid/content/Context;") - custom { method, classDef -> - classDef.type == "Lcom/ss/android/ugc/aweme/legoImp/task/StoreRegionInitTask;" && - method.name == "run" - } + name("run") + definingClass("Lcom/ss/android/ugc/aweme/legoImp/task/StoreRegionInitTask;") + parameterTypes("Landroid/content/Context;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt index 2976abe5e5..2405b31118 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt @@ -1,29 +1,19 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") -val disableLoginRequirementPatch = bytecodePatch( - name = "Disable login requirement", -) { +val disableLoginRequirementPatch = bytecodePatch("Disable login requirement") { compatibleWith( "com.ss.android.ugc.trill", "com.zhiliaoapp.musically", ) - execute { + apply { listOf( - mandatoryLoginServiceFingerprint, - mandatoryLoginService2Fingerprint, - ).forEach { fingerprint -> - fingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x0 - return v0 - """, - ) - } + mandatoryLoginServiceMethod, + mandatoryLoginService2Method, + ).forEach { method -> method.returnEarly() } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt index 929ef86729..3cd6056480 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt @@ -1,17 +1,14 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val mandatoryLoginServiceFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/MandatoryLoginService;") && - method.name == "enableForcedLogin" - } +internal val BytecodePatchContext.mandatoryLoginServiceMethod by gettingFirstMethodDeclaratively { + name("enableForcedLogin") + definingClass("/MandatoryLoginService;") } -internal val mandatoryLoginService2Fingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/MandatoryLoginService;") && - method.name == "shouldShowForcedLogin" - } +internal val BytecodePatchContext.mandatoryLoginService2Method by gettingFirstMethodDeclaratively { + name("shouldShowForcedLogin") + definingClass("/MandatoryLoginService;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt index a40f5251f5..aede29be2e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt @@ -1,22 +1,19 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val googleAuthAvailableFingerprint = fingerprint { +internal val BytecodePatchContext.googleAuthAvailableMethod by gettingFirstMethodDeclaratively { + definingClass("Lcom/bytedance/lobby/google/GoogleAuth;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - custom { method, _ -> - method.definingClass == "Lcom/bytedance/lobby/google/GoogleAuth;" - } + returnType("Z") + parameterTypes() } -internal val googleOneTapAuthAvailableFingerprint = fingerprint { +internal val BytecodePatchContext.googleOneTapAuthAvailableMethod by gettingFirstMethodDeclaratively { + definingClass("Lcom/bytedance/lobby/google/GoogleOneTapAuth;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - custom { method, _ -> - method.definingClass == "Lcom/bytedance/lobby/google/GoogleOneTapAuth;" - } -} + returnType("Z") + parameterTypes() +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt index 7ab636c095..4c562eb9c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val fixGoogleLoginPatch = bytecodePatch( @@ -13,18 +14,7 @@ val fixGoogleLoginPatch = bytecodePatch( "com.zhiliaoapp.musically", ) - execute { - listOf( - googleOneTapAuthAvailableFingerprint.method, - googleAuthAvailableFingerprint.method, - ).forEach { method -> - method.addInstructions( - 0, - """ - const/4 v0, 0x0 - return v0 - """, - ) - } + apply { + listOf(googleOneTapAuthAvailableMethod, googleAuthAvailableMethod).forEach(MutableMethod::returnEarly) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt index d1c4d6de68..9b1893ea9a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt @@ -1,35 +1,25 @@ package app.revanced.patches.tiktok.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val addSettingsEntryFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingNewVersionFragment;") && - method.name == "initUnitManger" - } +internal val BytecodePatchContext.addSettingsEntryMethod by gettingFirstMethodDeclaratively { + name("initUnitManger") + definingClass("/SettingNewVersionFragment;") } -internal val adPersonalizationActivityOnCreateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/AdPersonalizationActivity;") && - method.name == "onCreate" - } +internal val BytecodePatchContext.adPersonalizationActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/AdPersonalizationActivity;") } -internal val settingsEntryFingerprint = fingerprint { - strings("pls pass item or extends the EventUnit") -} +internal val BytecodePatchContext.settingsEntryMethod by gettingFirstImmutableMethodDeclaratively( + "pls pass item or extends the EventUnit", +) -internal val settingsEntryInfoFingerprint = fingerprint { - strings( - "ExposeItem(title=", - ", icon=", - ) -} +internal val BytecodePatchContext.settingsEntryInfoMethod by gettingFirstImmutableMethod("ExposeItem(title=", ", icon=") -internal val settingsStatusLoadFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("Lapp/revanced/extension/tiktok/settings/SettingsStatus;") && - method.name == "load" - } +internal val BytecodePatchContext.settingsStatusLoadMethod by gettingFirstMethodDeclaratively { + name("load") + definingClass("Lapp/revanced/extension/tiktok/settings/SettingsStatus;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt index bc6cc2bffe..4e6a43b3a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt @@ -1,16 +1,13 @@ package app.revanced.patches.tiktok.misc.settings -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.* +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.layout.branding.addBrandLicensePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction22c -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c -import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/tiktok/settings/TikTokActivityHook;" @@ -26,7 +23,7 @@ val settingsPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { + apply { val initializeSettingsMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->initialize(" + "Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" + @@ -38,16 +35,16 @@ val settingsPatch = bytecodePatch( "Ljava/lang/String;" + ")Ljava/lang/Object;" - fun String.toClassName(): String = substring(1, this.length - 1).replace("/", ".") + fun String.toClassName() = substring(1, this.length - 1).replace("/", ".") // Find the class name of classes which construct a settings entry - val settingsButtonClass = settingsEntryFingerprint.originalClassDef.type.toClassName() - val settingsButtonInfoClass = settingsEntryInfoFingerprint.originalClassDef.type.toClassName() + val settingsButtonClass = settingsEntryMethod.immutableClassDef.type.toClassName() + val settingsButtonInfoClass = settingsEntryInfoMethod.immutableClassDef.type.toClassName() // Create a settings entry for 'revanced settings' and add it to settings fragment - addSettingsEntryFingerprint.method.apply { - val markIndex = implementation!!.instructions.indexOfFirst { - it.opcode == Opcode.IGET_OBJECT && ((it as Instruction22c).reference as FieldReference).name == "headerUnit" + addSettingsEntryMethod.apply { + val markIndex = indexOfFirstInstruction { + opcode == Opcode.IGET_OBJECT && fieldReference?.name == "headerUnit" } val getUnitManager = getInstruction(markIndex + 2) @@ -68,24 +65,22 @@ val settingsPatch = bytecodePatch( const-string v1, "$settingsButtonInfoClass" invoke-static {v0, v1}, $createSettingsEntryMethodDescriptor move-result-object v0 - check-cast v0, ${settingsEntryFingerprint.originalClassDef.type} + check-cast v0, ${settingsEntryMethod.immutableClassDef.type} """, ) } // Initialize the settings menu once the replaced setting entry is clicked. - adPersonalizationActivityOnCreateFingerprint.method.apply { - val initializeSettingsIndex = implementation!!.instructions.indexOfFirst { - it.opcode == Opcode.INVOKE_SUPER - } + 1 + adPersonalizationActivityOnCreateMethod.apply { + val initializeSettingsIndex = indexOfFirstInstruction(Opcode.INVOKE_SUPER) + 1 - val thisRegister = getInstruction(initializeSettingsIndex - 1).registerC + val thisRegister = getInstruction(initializeSettingsIndex - 1).registerC val usableRegister = implementation!!.registerCount - parameters.size - 2 addInstructionsWithLabels( initializeSettingsIndex, """ - invoke-static {v$thisRegister}, $initializeSettingsMethodDescriptor + invoke-static { v$thisRegister }, $initializeSettingsMethodDescriptor move-result v$usableRegister if-eqz v$usableRegister, :do_not_open return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt index 836be89006..012f87df73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt @@ -1,25 +1,21 @@ package app.revanced.patches.tiktok.misc.share -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val urlShorteningFingerprint = fingerprint { +internal val BytecodePatchContext.urlShorteningMethod by gettingFirstMethodDeclaratively( + "getShortShareUrlObservab\u2026ongUrl, subBizSceneValue)" // Same Kotlin intrinsics literal on both variants. +) { + name("LIZLLL") // LIZLLL is obfuscated by ProGuard/R8, but stable across both TikTok and Musically. accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) - returns("LX/") - parameters( + returnType("LX/") + parameterTypes( "I", "Ljava/lang/String;", "Ljava/lang/String;", "Ljava/lang/String;" ) opcodes(Opcode.RETURN_OBJECT) - - // Same Kotlin intrinsics literal on both variants. - strings("getShortShareUrlObservab\u2026ongUrl, subBizSceneValue)") - - custom { method, _ -> - // LIZLLL is obfuscated by ProGuard/R8, but stable across both TikTok and Musically. - method.name == "LIZLLL" - } -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt index fd616141c7..da6e6aaacc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt @@ -1,11 +1,8 @@ package app.revanced.patches.tiktok.misc.share -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.util.findFreeRegister import app.revanced.util.getReference @@ -19,9 +16,9 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/tiktok/share/ShareUrlSanitizer;" @Suppress("unused") -val sanitizeShareUrlsPatch = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, +val sanitizeSharingLinksPatch = bytecodePatch( + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { dependsOn(sharedExtensionPatch) @@ -30,11 +27,11 @@ val sanitizeShareUrlsPatch = bytecodePatch( "com.zhiliaoapp.musically"("36.5.4"), ) - execute { - urlShorteningFingerprint.method.apply { + apply { + urlShorteningMethod.apply { val invokeIndex = indexOfFirstInstructionOrThrow { - val ref = getReference() - ref?.name == "LIZ" && ref.definingClass.startsWith("LX/") + val reference = getReference() + reference?.name == "LIZ" && reference.definingClass.startsWith("LX/") } val moveResultIndex = indexOfFirstInstructionOrThrow(invokeIndex, Opcode.MOVE_RESULT_OBJECT) @@ -78,7 +75,7 @@ val sanitizeShareUrlsPatch = bytecodePatch( :skip_sanitization nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index 40a45650de..73e4a427f6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt @@ -1,20 +1,20 @@ package app.revanced.patches.tiktok.misc.spoof.sim -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.settingsPatch -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint -import app.revanced.util.findMutableMethodOf +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") -val spoofSimPatch = bytecodePatch( +val sIMSpoofPatch = bytecodePatch( name = "SIM spoof", description = "Spoofs the information which is retrieved from the SIM card.", use = false, @@ -29,7 +29,7 @@ val spoofSimPatch = bytecodePatch( "com.zhiliaoapp.musically", ) - execute { + apply { val replacements = hashMapOf( "getSimCountryIso" to "getCountryIso", "getNetworkCountryIso" to "getCountryIso", @@ -41,7 +41,7 @@ val spoofSimPatch = bytecodePatch( // Find all api call to check sim information. buildMap { - classes.forEach { classDef -> + classDefs.forEach { classDef -> classDef.methods.let { methods -> buildMap methodList@{ methods.forEach methods@{ method -> @@ -69,30 +69,28 @@ val spoofSimPatch = bytecodePatch( } } }.forEach { (classDef, methods) -> - with(proxy(classDef).mutableClass) { - methods.forEach { (method, patches) -> - with(findMutableMethodOf(method)) { - while (!patches.isEmpty()) { - val (index, replacement) = patches.removeLast() + methods.forEach { (method, patches) -> + with(classDef.firstMethod(method)) { + while (!patches.isEmpty()) { + val (index, replacement) = patches.removeLast() - val resultReg = getInstruction(index + 1).registerA + val resultReg = getInstruction(index + 1).registerA - // Patch Android API and return fake sim information. - addInstructions( - index + 2, - """ - invoke-static {v$resultReg}, Lapp/revanced/extension/tiktok/spoof/sim/SpoofSimPatch;->$replacement(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$resultReg - """, - ) - } + // Patch Android API and return fake sim information. + addInstructions( + index + 2, + """ + invoke-static {v$resultReg}, Lapp/revanced/extension/tiktok/spoof/sim/SpoofSimPatch;->$replacement(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$resultReg + """, + ) } } } } // Enable patch in settings. - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableSimSpoof()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt index 3e98d213e5..1158982f34 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt @@ -1,13 +1,15 @@ package app.revanced.patches.tiktok.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getEnterFromFingerprint = fingerprint { - returns("Ljava/lang/String;") +internal val BytecodePatchContext.getEnterFromMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("/BaseListFragmentPanel;") + returnType("Ljava/lang/String;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Z") + parameterTypes("Z") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, @@ -17,14 +19,8 @@ internal val getEnterFromFingerprint = fingerprint { Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, ) - custom { methodDef, _ -> - methodDef.definingClass.endsWith("/BaseListFragmentPanel;") - } } -internal val onRenderFirstFrameFingerprint = fingerprint { - strings("method_enable_viewpager_preload_duration") - custom { _, classDef -> - classDef.endsWith("/BaseListFragmentPanel;") - } +internal val BytecodePatchContext.onRenderFirstFrameMethod by gettingFirstMethodDeclaratively("method_enable_viewpager_preload_duration") { + definingClass("/BaseListFragmentPanel;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt index 4a02c62215..2ab94e5348 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt @@ -1,25 +1,16 @@ package app.revanced.patches.trakt -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val isVIPEPFingerprint = fingerprint { - custom { method, classDef -> - if (!classDef.endsWith("RemoteUser;")) return@custom false - - method.name == "isVIPEP" - } +internal val BytecodePatchContext.isVIPEPMethod by gettingFirstMethodDeclaratively { + name("isVIPEP") + definingClass("RemoteUser;") } -internal val isVIPFingerprint = fingerprint { - custom { method, classDef -> - if (!classDef.endsWith("RemoteUser;")) return@custom false - - method.name == "isVIP" - } -} - -internal val remoteUserFingerprint = fingerprint { - custom { _, classDef -> - classDef.endsWith("RemoteUser;") - } +internal val BytecodePatchContext.isVIPMethod by gettingFirstMethodDeclaratively { + name("isVIP") + definingClass("RemoteUser;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt index bf10b9f40e..294ea61c19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/UnlockProPatch.kt @@ -1,21 +1,17 @@ package app.revanced.patches.trakt -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val unlockProPatch = bytecodePatch( - name = "Unlock pro", -) { +val unlockProPatch = bytecodePatch("Unlock pro") { compatibleWith("tv.trakt.trakt"("1.1.1")) - execute { - arrayOf(isVIPFingerprint, isVIPEPFingerprint).onEach { fingerprint -> - // Resolve both fingerprints on the same class. - fingerprint.match(remoteUserFingerprint.originalClassDef) - }.forEach { fingerprint -> - // Return true for both VIP check methods. - fingerprint.method.addInstructions( + apply { + // Return true for both VIP check methods. + arrayOf(isVIPMethod, isVIPEPMethod).forEach { method: MutableMethod -> + method.addInstructions( 0, """ const/4 v0, 0x1 diff --git a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt index 12ffa15c15..8fee4cdcf7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt @@ -1,15 +1,14 @@ package app.revanced.patches.tudortmund.lockscreen +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val brightnessFingerprint = fingerprint { +internal val BytecodePatchContext.brightnessMethod by gettingFirstMethodDeclaratively { + name("run") + definingClass("/ScreenPlugin$") accessFlags(AccessFlags.PUBLIC) - returns("V") - parameters() - custom { method, classDef -> - method.name == "run" && - method.definingClass.contains("/ScreenPlugin\$") && - classDef.fields.any { it.type == "Ljava/lang/Float;" } - } + returnType("V") + parameterTypes() + custom { immutableClassDef.anyField { type == "Ljava/lang/Float;" } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt index c4ab245ff6..8ab356f0a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.tudortmund.lockscreen -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.tudortmund.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.Opcode @@ -24,8 +24,8 @@ val showOnLockscreenPatch = bytecodePatch( compatibleWith("de.tudortmund.app") - execute { - brightnessFingerprint.method.apply { + apply { + brightnessMethod.apply { // Find the instruction where the brightness value is loaded into a register val brightnessInstruction = instructions.firstNotNullOf { instruction -> if (instruction.opcode != Opcode.IGET_OBJECT) return@firstNotNullOf null diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/ads/DisableDashboardAds.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/ads/DisableDashboardAds.kt index 4a9bbe297e..c5310ea85e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/ads/DisableDashboardAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/ads/DisableDashboardAds.kt @@ -13,7 +13,7 @@ val disableDashboardAdsPatch = bytecodePatch( compatibleWith("com.tumblr") - execute { + apply { // The timeline object types are filtered by their name in the TimelineObjectType enum. // This is often different from the "object_type" returned in the api (noted in comments here) arrayOf( diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/adfree/DisableAdFreeBannerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/adfree/DisableAdFreeBannerPatch.kt index c166cb83bf..71bdda7922 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/adfree/DisableAdFreeBannerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/adfree/DisableAdFreeBannerPatch.kt @@ -13,7 +13,7 @@ val disableAdFreeBannerPatch = bytecodePatch( compatibleWith("com.tumblr") - execute { + apply { // Disable the "AD_FREE_CTA_BANNER" ("Whether or not to show ad free prompt") feature flag. addFeatureFlagOverride("adFreeCtaBanner", "false") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/inappupdate/DisableInAppUpdatePatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/inappupdate/DisableInAppUpdatePatch.kt index 3a46c19b26..0454cc9efe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/inappupdate/DisableInAppUpdatePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/inappupdate/DisableInAppUpdatePatch.kt @@ -13,7 +13,7 @@ val disableInAppUpdatePatch = bytecodePatch( compatibleWith("com.tumblr") - execute { + apply { // Before checking for updates using Google Play core AppUpdateManager, the value of this feature flag is checked. // If this flag is false or the last update check was today and no update check is performed. addFeatureFlagOverride("inAppUpdate", "false") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt index fc3d1fc8eb..0bb5a69a59 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.tumblr.annoyances.notifications -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -10,8 +10,8 @@ val disableBlogNotificationReminderPatch = bytecodePatch( ) { compatibleWith("com.tumblr") - execute { - isBlogNotifyEnabledFingerprint.method.addInstructions( + apply { + isBlogNotifyEnabledMethod.addInstructions( 0, """ # Return false for BlogNotifyCtaDialog.isEnabled() method. diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt index 67e051a7ba..e1b0994554 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt @@ -1,11 +1,13 @@ package app.revanced.patches.tumblr.annoyances.notifications -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.patch.BytecodePatchContext // The BlogNotifyCtaDialog asks you if you want to enable notifications for a blog. // It shows whenever you visit a certain blog for the second time and disables itself // if it was shown a total of 3 times (stored in app storage). // This targets the BlogNotifyCtaDialog.isEnabled() method to let it always return false. -internal val isBlogNotifyEnabledFingerprint = fingerprint { - strings("isEnabled --> ", "blog_notify_enabled") -} +internal val BytecodePatchContext.isBlogNotifyEnabledMethod by gettingFirstMethod( + "isEnabled --> ", + "blog_notify_enabled", +) diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt index 09faa17346..c447c2a59c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.tumblr.annoyances.popups -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val disableGiftMessagePopupPatch = bytecodePatch( @@ -10,7 +10,7 @@ val disableGiftMessagePopupPatch = bytecodePatch( ) { compatibleWith("com.tumblr") - execute { - showGiftMessagePopupFingerprint.method.addInstructions(0, "return-void") + apply { + showGiftMessagePopupMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt index 7d00f2f1bd..cd678f7cb8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt @@ -1,11 +1,13 @@ package app.revanced.patches.tumblr.annoyances.popups +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. -internal val showGiftMessagePopupFingerprint = fingerprint { +internal val BytecodePatchContext.showGiftMessagePopupMethod by gettingFirstMethodDeclaratively("activity", "anchorView", "textMessage") { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) - returns("V") - strings("activity", "anchorView", "textMessage") -} + returnType("V") +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/tv/DisableTumblrTvPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/tv/DisableTumblrTvPatch.kt index 00f8c3f373..4e66acab4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/tv/DisableTumblrTvPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/tv/DisableTumblrTvPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patches.tumblr.featureflags.addFeatureFlagOverride import app.revanced.patches.tumblr.featureflags.overrideFeatureFlagsPatch @Suppress("unused") -val disableTumblrTvPatch = bytecodePatch( +val disableTumblrTVPatch = bytecodePatch( name = "Disable Tumblr TV", description = "Removes the Tumblr TV navigation button from the bottom navigation bar.", ) { @@ -13,7 +13,7 @@ val disableTumblrTvPatch = bytecodePatch( compatibleWith("com.tumblr") - execute { + apply { addFeatureFlagOverride("tumblrTvMobileNav", "false") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt index e24ca2884a..cc63899cc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt @@ -1,10 +1,15 @@ package app.revanced.patches.tumblr.featureflags -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.Opcode -// This fingerprint targets the method to get the value of a Feature in the class "com.tumblr.configuration.Feature". +// This targets the method to get the value of a Feature in the class "com.tumblr.configuration.Feature". // Features seem to be Tumblr's A/B testing program. // Feature states are loaded from the server in the "api-http2.tumblr.com/v2/config" request on (first) startup. // A lot of features are returned there, but most of them do not seem to do anything (anymore). @@ -13,14 +18,13 @@ import app.revanced.patcher.fingerprint // Some features seem to be very old and never removed, though, such as Google Login. // The startIndex of the opcode pattern is at the start of the function after the arg null check. // we want to insert our instructions there. -internal val getFeatureValueFingerprint = fingerprint { +internal val BytecodePatchContext.getFeatureValueMethodMatch by composingFirstMethod("feature") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("L", "Z") + returnType("Ljava/lang/String;") + parameterTypes("L", "Z") opcodes( Opcode.IF_EQZ, Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, ) - strings("feature") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt index c2da658aad..ed5849a77a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.tumblr.featureflags -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @@ -23,56 +23,57 @@ val overrideFeatureFlagsPatch = bytecodePatch( description = "Forcibly set the value of A/B testing features of your choice.", ) { - execute { - val configurationClass = getFeatureValueFingerprint.originalMethod.definingClass - val featureClass = getFeatureValueFingerprint.originalMethod.parameterTypes[0].toString() + apply { + getFeatureValueMethodMatch.let { match -> + val configurationClass = match.immutableMethod.definingClass + val featureClass = match.immutableMethod.parameterTypes[0].toString() - // The method we want to inject into does not have enough registers, so we inject a helper method - // and inject more instructions into it later, see addOverride. - // This is not in an extension since the unused variable would get compiled away and the method would - // get compiled to only have one register, which is not enough for our later injected instructions. - val helperMethod = ImmutableMethod( - getFeatureValueFingerprint.originalMethod.definingClass, - "getValueOverride", - listOf(ImmutableMethodParameter(featureClass, null, "feature")), - "Ljava/lang/String;", - AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, - null, - null, - MutableMethodImplementation(4), - ).toMutable().apply { - // This is the equivalent of - // String featureName = feature.toString() - // - // return null - addInstructions( - 0, + // The method we want to inject into does not have enough registers, so we inject a helper method + // and inject more instructions into it later, see addOverride. + // This is not in an extension since the unused variable would get compiled away and the method would + // get compiled to only have one register, which is not enough for our later injected instructions. + val helperMethod = ImmutableMethod( + match.immutableMethod.definingClass, + "getValueOverride", + listOf(ImmutableMethodParameter(featureClass, null, "feature")), + "Ljava/lang/String;", + AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, + null, + null, + MutableMethodImplementation(4), + ).toMutable().apply { + // This is the equivalent of + // String featureName = feature.toString() + // + // return null + addInstructions( + 0, + """ + # toString() the enum value + invoke-virtual {p1}, $featureClass->toString()Ljava/lang/String; + move-result-object v0 + + # !!! If you add more instructions above this line, update helperInsertIndex below! + # Here we will insert one compare & return for every registered Feature override + # This is done below in the addOverride function + + # If none of the overrides returned a value, we should return null + const/4 v0, 0x0 + return-object v0 + """, + ) + }.also { helperMethod -> + match.classDef.methods.add(helperMethod) + } + + // Here we actually insert the hook to call our helper method and return its value if it returns not null + // This is equivalent to + // String forcedValue = getValueOverride(feature) + // if (forcedValue != null) return forcedValue + val getFeatureIndex = match[0] + match.method.addInstructionsWithLabels( + getFeatureIndex, """ - # toString() the enum value - invoke-virtual {p1}, $featureClass->toString()Ljava/lang/String; - move-result-object v0 - - # !!! If you add more instructions above this line, update helperInsertIndex below! - # Here we will insert one compare & return for every registered Feature override - # This is done below in the addOverride function - - # If none of the overrides returned a value, we should return null - const/4 v0, 0x0 - return-object v0 - """, - ) - }.also { helperMethod -> - getFeatureValueFingerprint.classDef.methods.add(helperMethod) - } - - // Here we actually insert the hook to call our helper method and return its value if it returns not null - // This is equivalent to - // String forcedValue = getValueOverride(feature) - // if (forcedValue != null) return forcedValue - val getFeatureIndex = getFeatureValueFingerprint.patternMatch!!.startIndex - getFeatureValueFingerprint.method.addInstructionsWithLabels( - getFeatureIndex, - """ # Call the Helper Method with the Feature invoke-virtual {p0, p1}, $configurationClass->getValueOverride($featureClass)Ljava/lang/String; move-result-object v0 @@ -85,31 +86,32 @@ val overrideFeatureFlagsPatch = bytecodePatch( :is_null nop """, - ) - - val helperInsertIndex = 2 - addFeatureFlagOverride = { name, value -> - // For every added override, we add a few instructions in the middle of the helper method - // to check if the feature is the one we want and return the override value if it is. - // This is equivalent to - // if (featureName == {name}) return {value} - helperMethod.addInstructionsWithLabels( - helperInsertIndex, - """ - # v0 is still the string name of the currently checked feature from above - # Compare the current string with the override string - const-string v1, "$name" - invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - move-result v1 - # If the current string is the one we want to override, we return the override value - if-eqz v1, :no_override - const-string v1, "$value" - return-object v1 - # Else we just continue... - :no_override - nop - """, ) + + val helperInsertIndex = 2 + addFeatureFlagOverride = { name, value -> + // For every added override, we add a few instructions in the middle of the helper method + // to check if the feature is the one we want and return the override value if it is. + // This is equivalent to + // if (featureName == {name}) return {value} + helperMethod.addInstructionsWithLabels( + helperInsertIndex, + """ + # v0 is still the string name of the currently checked feature from above + # Compare the current string with the override string + const-string v1, "$name" + invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + move-result v1 + # If the current string is the one we want to override, we return the override value + if-eqz v1, :no_override + const-string v1, "$value" + return-object v1 + # Else we just continue... + :no_override + nop + """, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt index 11616fcc92..a095e29cf8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt @@ -1,23 +1,25 @@ package app.revanced.patches.tumblr.fixes +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -import app.revanced.patcher.fingerprint -// Fingerprint for the addQueryParam method from retrofit2 -// https://github.com/square/retrofit/blob/trunk/retrofit/src/main/java/retrofit2/RequestBuilder.java#L186 -// Injecting here allows modifying dynamically set query parameters -internal val addQueryParamFingerprint = fingerprint { - parameters("Ljava/lang/String;", "Ljava/lang/String;", "Z") - strings("Malformed URL. Base: ", ", Relative: ") +// Matches the addQueryParam method from retrofit2: +// https://github.com/square/retrofit/blob/trunk/retrofit/src/main/java/retrofit2/RequestBuilder.java#L186. +// Injecting here allows modifying dynamically set query parameters. +internal val BytecodePatchContext.addQueryParamMethod by gettingFirstMethodDeclaratively("Malformed URL. Base: ", ", Relative: ") { + parameterTypes("Ljava/lang/String;", "Ljava/lang/String;", "Z") } -// Fingerprint for the parseHttpMethodAndPath method from retrofit2 +// Matches the parseHttpMethodAndPath method from retrofit2: // https://github.com/square/retrofit/blob/ebf87b10997e2136af4d335276fa950221852c64/retrofit/src/main/java/retrofit2/RequestFactory.java#L270-L302 -// Injecting here allows modifying the path/query params of API endpoints defined via annotations -internal val httpPathParserFingerprint = fingerprint { +// Injecting here allows modifying the path/query params of API endpoints defined via annotations. +internal val BytecodePatchContext.httpPathParserMethodMatch by composingFirstMethod("Only one HTTP method is allowed. Found: %s and %s.") { opcodes( Opcode.IPUT_OBJECT, Opcode.IPUT_BOOLEAN, ) - strings("Only one HTTP method is allowed. Found: %s and %s.") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt index dbe75d5f8b..b6f0174f85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.tumblr.fixes -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") @@ -12,7 +12,7 @@ val fixOldVersionsPatch = bytecodePatch( ) { compatibleWith("com.tumblr") - execute { + apply { val liveQueryParameters = listOf( ",?live_now", ",?live_streaming_user_id", @@ -20,8 +20,8 @@ val fixOldVersionsPatch = bytecodePatch( // Remove the live query parameters from the path when it's specified via a @METHOD annotation. for (liveQueryParameter in liveQueryParameters) { - httpPathParserFingerprint.method.addInstructions( - httpPathParserFingerprint.patternMatch!!.endIndex + 1, + httpPathParserMethodMatch.method.addInstructions( + httpPathParserMethodMatch[-1] + 1, """ # urlPath = urlPath.replace(liveQueryParameter, "") const-string p1, "$liveQueryParameter" @@ -39,7 +39,7 @@ val fixOldVersionsPatch = bytecodePatch( // which would result in the path "api/me/inf0?fields[blog]=${value}" // Here we make sure that this value doesn't contain the broken query parameters. for (liveQueryParameter in liveQueryParameters) { - addQueryParamFingerprint.method.addInstructions( + addQueryParamMethod.addInstructions( 0, """ # queryParameterValue = queryParameterValue.replace(liveQueryParameter, "") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt index c4ab799e85..f61816e0d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.tumblr.timelinefilter -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.tumblr.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c @@ -23,10 +23,10 @@ val filterTimelineObjectsPatch = bytecodePatch( ) { dependsOn(sharedExtensionPatch) - execute { - val filterInsertIndex = timelineFilterExtensionFingerprint.patternMatch!!.startIndex + apply { + val filterInsertIndex = timelineFilterExtensionMethodMatch[0] - timelineFilterExtensionFingerprint.method.apply { + timelineFilterExtensionMethodMatch.method.apply { val addInstruction = getInstruction(filterInsertIndex + 1) val filterListRegister = addInstruction.registerC @@ -47,11 +47,11 @@ val filterTimelineObjectsPatch = bytecodePatch( } } - mapOf( - timelineConstructorFingerprint to 1, - postsResponseConstructorFingerprint to 2, - ).forEach { (fingerprint, timelineObjectsRegister) -> - fingerprint.method.addInstructions( + arrayOf( + timelineConstructorMethod to 1, + postsResponseConstructorMethod to 2, + ).forEach { (method, timelineObjectsRegister) -> + method.addInstructions( 0, "invoke-static {p$timelineObjectsRegister}, " + "Lapp/revanced/extension/tumblr/patches/TimelineFilterPatch;->" + diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt index b8ed3bfc4e..2f4ce8c1e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt @@ -1,36 +1,33 @@ package app.revanced.patches.tumblr.timelinefilter -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode // This is the constructor of the PostsResponse class. -// The same applies here as with the TimelineConstructorFingerprint. -internal val postsResponseConstructorFingerprint = fingerprint { +// The same applies here as with the TimelineConstructorMethod. +internal val BytecodePatchContext.postsResponseConstructorMethod by gettingFirstMethodDeclaratively { + definingClass("/PostsResponse;") accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PUBLIC) - custom { method, classDef -> classDef.endsWith("/PostsResponse;") && method.parameters.size == 4 } + custom { parameters.size == 4 } } // This is the constructor of the Timeline class. // It receives the List as an argument with a @Json annotation, so this should be the first time // that the List is exposed in non-library code. -internal val timelineConstructorFingerprint = fingerprint { - strings("timelineObjectsList") - custom { method, classDef -> - classDef.endsWith("/Timeline;") && method.parameters[0].type == "Ljava/util/List;" - } +internal val BytecodePatchContext.timelineConstructorMethod by gettingFirstMethodDeclaratively("timelineObjectsList") { + definingClass("/Timeline;") + custom { parameters[0].type == "Ljava/util/List;" } } -// This fingerprints the extension TimelineFilterPatch.filterTimeline method. -// The opcode fingerprint is searching for +// This gets the extension method TimelineFilterPatch.filterTimeline. +// Looking for // if ("BLOCKED_OBJECT_DUMMY".equals(elementType)) iterator.remove(); -internal val timelineFilterExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.timelineFilterExtensionMethodMatch by composingFirstMethod("BLOCKED_OBJECT_DUMMY") { + definingClass("/TimelineFilterPatch;") opcodes( Opcode.CONST_STRING, // "BLOCKED_OBJECT_DUMMY" Opcode.INVOKE_VIRTUAL, // HashSet.add(^) ) - strings("BLOCKED_OBJECT_DUMMY") - custom { _, classDef -> - classDef.endsWith("/TimelineFilterPatch;") - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt index a0622f2818..340757c58d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/AudioAdsPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.twitch.ad.audio -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -11,7 +11,8 @@ import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch -val audioAdsPatch = bytecodePatch( +@Suppress("unused") +val blockAudioAdsPatch = bytecodePatch( name = "Block audio ads", description = "Blocks audio ads in streams and VODs.", ) { @@ -23,7 +24,7 @@ val audioAdsPatch = bytecodePatch( compatibleWith("tv.twitch.android.app"("16.9.1", "25.3.0")) - execute { + apply { addResources("twitch", "ad.audio.audioAdsPatch") PreferenceScreen.ADS.CLIENT_SIDE.addPreferences( @@ -31,7 +32,7 @@ val audioAdsPatch = bytecodePatch( ) // Block playAds call - audioAdsPresenterPlayFingerprint.method.addInstructionsWithLabels( + audioAdsPresenterPlayMethod.addInstructionsWithLabels( 0, """ invoke-static { }, Lapp/revanced/extension/twitch/patches/AudioAdsPatch;->shouldBlockAudioAds()Z @@ -39,7 +40,7 @@ val audioAdsPatch = bytecodePatch( if-eqz v0, :show_audio_ads return-void """, - ExternalLabel("show_audio_ads", audioAdsPresenterPlayFingerprint.method.getInstruction(0)), + ExternalLabel("show_audio_ads", audioAdsPresenterPlayMethod.getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt index 21e9cb6d2a..4828977fef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.twitch.ad.audio -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val audioAdsPresenterPlayFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" - } +internal val BytecodePatchContext.audioAdsPresenterPlayMethod by gettingFirstMethodDeclaratively { + name("playAd") + definingClass("AudioAdsPlayerPresenter;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt index 8519b90ced..57bb6635da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/EmbeddedAdsPatch.kt @@ -1,35 +1,36 @@ package app.revanced.patches.twitch.ad.embedded -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.settings.preference.ListPreference -import app.revanced.patches.twitch.ad.video.videoAdsPatch +import app.revanced.patches.twitch.ad.video.blockVideoAdsPatch import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch -val embeddedAdsPatch = bytecodePatch( +@Suppress("unused") +val blockEmbeddedAdsPatch = bytecodePatch( name = "Block embedded ads", description = "Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.", ) { dependsOn( - videoAdsPatch, + blockVideoAdsPatch, sharedExtensionPatch, settingsPatch, ) compatibleWith("tv.twitch.android.app"("16.9.1", "25.3.0")) - execute { + apply { addResources("twitch", "ad.embedded.embeddedAdsPatch") PreferenceScreen.ADS.SURESTREAM.addPreferences( ListPreference("revanced_block_embedded_ads"), ) - // Inject OkHttp3 application interceptor - createsUsherClientFingerprint.method.addInstructions( + // Inject OkHttp3 application interceptor. + createsUsherClientMethod.addInstructions( 3, """ invoke-static {}, Lapp/revanced/extension/twitch/patches/EmbeddedAdsPatch;->createRequestInterceptor()Lapp/revanced/extension/twitch/api/RequestInterceptor; diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt index 3e9853bd61..130c797c78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.twitch.ad.embedded -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val createsUsherClientFingerprint = fingerprint { - custom { method, _ -> - method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") - } +internal val BytecodePatchContext.createsUsherClientMethod by gettingFirstMethodDeclaratively { + name("buildOkHttpClient") + definingClass("Ltv/twitch/android/network/OkHttpClientFactory;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index 48ecefba8e..648be7f7ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -1,11 +1,12 @@ package app.revanced.patches.twitch.ad.shared.util -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstClassDefOrNull import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel fun adPatch( conditionCall: String, @@ -29,10 +30,10 @@ fun adPatch( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, - ) = with(classBy { classDefType == it.type }?.mutableClass) { - this ?: return false + ): Boolean { + val classDef = firstClassDefOrNull(classDefType) ?: return false - methods.filter { it.name in methodNames }.forEach { + classDef.methods.filter { it.name in methodNames }.forEach { method -> val retInstruction = when (returnMethod.returnType) { 'V' -> "return-void" 'Z' -> @@ -44,17 +45,17 @@ fun adPatch( else -> throw NotImplementedError() } - it.addInstructionsWithLabels( + method.addInstructionsWithLabels( 0, """ ${createConditionInstructions("v0")} $retInstruction """, - ExternalLabel(skipLabelName, it.getInstruction(0)), + ExternalLabel(skipLabelName, method.getInstruction(0)), ) } - true + return true } block(::createConditionInstructions, BytecodePatchContext::blockMethods) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt index d03449733f..53b5e9dbec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt @@ -1,28 +1,25 @@ package app.revanced.patches.twitch.ad.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val checkAdEligibilityLambdaFingerprint = fingerprint { - returns("Lio/reactivex/Single;") - parameters("L") - custom { method, _ -> - method.definingClass.endsWith("/AdEligibilityFetcher;") && - method.name == "shouldRequestAd" - } +internal val BytecodePatchContext.checkAdEligibilityLambdaMethod by gettingFirstMethodDeclaratively { + name("shouldRequestAd") + definingClass("/AdEligibilityFetcher;") + returnType("Lio/reactivex/Single;") + parameterTypes("L") } -internal val contentConfigShowAdsFingerprint = fingerprint { - returns("Z") - parameters() - custom { method, _ -> - method.definingClass.endsWith("/ContentConfigData;") && method.name == "getShowAds" - } +internal val BytecodePatchContext.contentConfigShowAdsMethod by gettingFirstMethodDeclarativelyOrNull { + name("getShowAds") + definingClass("/ContentConfigData;") + returnType("Z") + parameterTypes() } -internal val getReadyToShowAdFingerprint = fingerprint { - returns("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") - parameters("L", "L") - custom { method, _ -> - method.definingClass.endsWith("/StreamDisplayAdsPresenter;") && method.name == "getReadyToShowAdOrAbort" - } +internal val BytecodePatchContext.getReadyToShowAdMethod by gettingFirstMethodDeclaratively { + name("getReadyToShowAdOrAbort") + definingClass("/StreamDisplayAdsPresenter;") + returnType("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") + parameterTypes("L", "L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt index 6665db8536..9f2faa45f6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/VideoAdsPatch.kt @@ -1,10 +1,10 @@ package app.revanced.patches.twitch.ad.video -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -14,7 +14,7 @@ import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch -val videoAdsPatch = bytecodePatch( +val blockVideoAdsPatch = bytecodePatch( name = "Block video ads", description = "Blocks video ads in streams and VODs.", ) { @@ -27,7 +27,7 @@ val videoAdsPatch = bytecodePatch( addResourcesPatch, adPatch(conditionCall, skipLabelName) { createConditionInstructions, blockMethods -> - execute { + apply { addResources("twitch", "ad.video.videoAdsPatch") PreferenceScreen.ADS.CLIENT_SIDE.addPreferences( @@ -111,7 +111,7 @@ val videoAdsPatch = bytecodePatch( ) // Pretend our player is ineligible for all ads. - checkAdEligibilityLambdaFingerprint.method.addInstructionsWithLabels( + checkAdEligibilityLambdaMethod.addInstructionsWithLabels( 0, """ ${createConditionInstructions("v0")} @@ -122,13 +122,13 @@ val videoAdsPatch = bytecodePatch( """, ExternalLabel( skipLabelName, - checkAdEligibilityLambdaFingerprint.method.getInstruction(0), + checkAdEligibilityLambdaMethod.getInstruction(0), ), ) val adFormatDeclined = "Ltv/twitch/android/shared/display/ads/theatre/StreamDisplayAdsPresenter\$Action\$AdFormatDeclined;" - getReadyToShowAdFingerprint.method.addInstructionsWithLabels( + getReadyToShowAdMethod.addInstructionsWithLabels( 0, """ ${createConditionInstructions("v0")} @@ -137,12 +137,12 @@ val videoAdsPatch = bytecodePatch( move-result-object p1 return-object p1 """, - ExternalLabel(skipLabelName, getReadyToShowAdFingerprint.method.getInstruction(0)), + ExternalLabel(skipLabelName, getReadyToShowAdMethod.getInstruction(0)), ) // Spoof showAds JSON field. // Late versions of the app don't have the method anymore. - contentConfigShowAdsFingerprint.methodOrNull?.addInstructions( + contentConfigShowAdsMethod?.addInstructions( 0, """ ${createConditionInstructions("v0")} diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index 21da99a5bb..9dbeb760bb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -1,24 +1,23 @@ package app.revanced.patches.twitch.chat.antidelete -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val chatUtilCreateDeletedSpanFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("ChatUtil\$Companion;") && method.name == "createDeletedSpanFromChatMessageSpan" - } +internal val BytecodePatchContext.chatUtilCreateDeletedSpanMethod by gettingFirstMethodDeclaratively { + name("createDeletedSpanFromChatMessageSpan") + definingClass("ChatUtil\$Companion;") } -internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { +internal val BytecodePatchContext.deletedMessageClickableSpanCtorMethod by gettingFirstMethodDeclaratively { + definingClass("DeletedMessageClickableSpan;") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - custom { _, classDef -> - classDef.endsWith("DeletedMessageClickableSpan;") - } } -internal val setHasModAccessFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("DeletedMessageClickableSpan;") && method.name == "setHasModAccess" - } +internal val BytecodePatchContext.setHasModAccessMethod by gettingFirstMethodDeclaratively { + name("setHasModAccess") + definingClass("DeletedMessageClickableSpan;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt index 7bc35a1316..13f93f8bcf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/ShowDeletedMessagesPatch.kt @@ -1,10 +1,10 @@ package app.revanced.patches.twitch.chat.antidelete -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.ListPreference @@ -12,6 +12,7 @@ import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch +@Suppress("unused") val showDeletedMessagesPatch = bytecodePatch( name = "Show deleted messages", description = "Shows deleted chat messages behind a clickable spoiler.", @@ -30,15 +31,15 @@ val showDeletedMessagesPatch = bytecodePatch( if-eqz $register, :no_spoiler """ - execute { + apply { addResources("twitch", "chat.antidelete.showDeletedMessagesPatch") PreferenceScreen.CHAT.GENERAL.addPreferences( - ListPreference("revanced_show_deleted_messages") + ListPreference("revanced_show_deleted_messages"), ) // Spoiler mode: Force set hasModAccess member to true in constructor - deletedMessageClickableSpanCtorFingerprint.method.apply { + deletedMessageClickableSpanCtorMethod.apply { addInstructionsWithLabels( implementation!!.instructions.lastIndex, /* place in front of return-void */ """ @@ -51,10 +52,10 @@ val showDeletedMessagesPatch = bytecodePatch( } // Spoiler mode: Disable setHasModAccess setter - setHasModAccessFingerprint.method.addInstruction(0, "return-void") + setHasModAccessMethod.addInstruction(0, "return-void") // Cross-out mode: Reformat span of deleted message - chatUtilCreateDeletedSpanFingerprint.method.apply { + chatUtilCreateDeletedSpanMethod.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt index d27a11c25c..eaea93417a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt @@ -1,16 +1,17 @@ package app.revanced.patches.twitch.chat.autoclaim -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch +@Suppress("unused") val autoClaimChannelPointsPatch = bytecodePatch( name = "Auto claim channel points", description = "Automatically claim Channel Points.", @@ -22,14 +23,14 @@ val autoClaimChannelPointsPatch = bytecodePatch( compatibleWith("tv.twitch.android.app"("16.9.1", "25.3.0")) - execute { + apply { addResources("twitch", "chat.autoclaim.autoClaimChannelPointsPatch") PreferenceScreen.CHAT.GENERAL.addPreferences( SwitchPreference("revanced_auto_claim_channel_points"), ) - communityPointsButtonViewDelegateFingerprint.method.apply { + communityPointsButtonViewDelegateMethod.apply { val lastIndex = instructions.lastIndex addInstructionsWithLabels( lastIndex, // place in front of return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt index 80abc9ac41..3aeb32daf2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt @@ -1,10 +1,11 @@ package app.revanced.patches.twitch.chat.autoclaim -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val communityPointsButtonViewDelegateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("CommunityPointsButtonViewDelegate;") && - method.name == "showClaimAvailable" - } +internal val BytecodePatchContext.communityPointsButtonViewDelegateMethod by gettingFirstMethodDeclaratively { + name("showClaimAvailable") + definingClass("CommunityPointsButtonViewDelegate;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt index 34967b9cac..c0686d8b44 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/DebugModePatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.twitch.debug -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,6 +9,7 @@ import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import app.revanced.patches.twitch.misc.settings.PreferenceScreen import app.revanced.patches.twitch.misc.settings.settingsPatch +@Suppress("ObjectPropertyName") val debugModePatch = bytecodePatch( name = "Debug mode", description = "Enables Twitch's internal debugging mode.", @@ -22,7 +23,7 @@ val debugModePatch = bytecodePatch( compatibleWith("tv.twitch.android.app"("16.9.1", "25.3.0")) - execute { + apply { addResources("twitch", "debug.debugModePatch") PreferenceScreen.MISC.OTHER.addPreferences( @@ -30,11 +31,11 @@ val debugModePatch = bytecodePatch( ) listOf( - isDebugConfigEnabledFingerprint, - isOmVerificationEnabledFingerprint, - shouldShowDebugOptionsFingerprint, - ).forEach { fingerprint -> - fingerprint.method.addInstructions( + isDebugConfigEnabledMethod, + isOmVerificationEnabledMethod, + shouldShowDebugOptionsMethod, + ).forEach { method -> + method.addInstructions( 0, """ invoke-static {}, Lapp/revanced/extension/twitch/patches/DebugModePatch;->isDebugModeEnabled()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt index 665180c19b..e8fd075d63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt @@ -1,21 +1,21 @@ package app.revanced.patches.twitch.debug -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val isDebugConfigEnabledFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "isDebugConfigEnabled" - } +internal val BytecodePatchContext.isDebugConfigEnabledMethod by gettingFirstMethodDeclaratively { + name("isDebugConfigEnabled") + definingClass("/BuildConfigUtil;") } -internal val isOmVerificationEnabledFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "isOmVerificationEnabled" - } +internal val BytecodePatchContext.isOmVerificationEnabledMethod by gettingFirstMethodDeclaratively { + name("isOmVerificationEnabled") + definingClass("/BuildConfigUtil;") } -internal val shouldShowDebugOptionsFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/BuildConfigUtil;") && method.name == "shouldShowDebugOptions" - } +internal val BytecodePatchContext.shouldShowDebugOptionsMethod by gettingFirstMethodDeclaratively { + name("shouldShowDebugOptions") + definingClass("/BuildConfigUtil;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt index 9a46867ab5..1a345d75cd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt @@ -1,9 +1,5 @@ package app.revanced.patches.twitch.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/TwitchApplication;") - } -} +internal val initHook = activityOnCreateExtensionHook("/TwitchApplication;") diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt index 43d5bb39bf..adbeb1c196 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt @@ -1,34 +1,28 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val menuGroupsOnClickFingerprint = fingerprint { +internal val BytecodePatchContext.menuGroupsOnClickMethod by gettingFirstMethodDeclaratively { + name { contains("render") } + definingClass("/SettingsMenuViewDelegate;") accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L", "L") - custom { method, classDef -> - classDef.endsWith("/SettingsMenuViewDelegate;") && - method.name.contains("render") - } + returnType("V") + parameterTypes("L", "L", "L") } -internal val menuGroupsUpdatedFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") && - method.name == "" - } +internal val BytecodePatchContext.menuGroupsUpdatedMethod by gettingFirstMethodDeclaratively { + name("") + definingClass("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") } -internal val settingsActivityOnCreateFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsActivity;") && - method.name == "onCreate" - } +internal val BytecodePatchContext.settingsActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/SettingsActivity;") } -internal val settingsMenuItemEnumFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("/SettingsMenuItem;") && method.name == "" - } +internal val BytecodePatchContext.settingsMenuItemEnumMethod by gettingFirstMethodDeclaratively { + name("") + definingClass("/SettingsMenuItem;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt index 66d790718b..e99788f5d9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt @@ -1,19 +1,17 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.BasePreference -import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen -import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference -import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.twitch.misc.extension.sharedExtensionPatch import com.android.tools.smali.dexlib2.AccessFlags @@ -50,7 +48,7 @@ val settingsPatch = bytecodePatch( compatibleWith("tv.twitch.android.app"("16.9.1")) - execute { + apply { addResources("twitch", "misc.settings.settingsPatch") preferences += NonInteractivePreference( @@ -74,23 +72,22 @@ val settingsPatch = bytecodePatch( ) // Hook onCreate to handle fragment creation. - val insertIndex = settingsActivityOnCreateFingerprint.method.implementation!!.instructions.size - 2 - settingsActivityOnCreateFingerprint.method.addInstructionsWithLabels( - insertIndex, - """ - invoke-static { p0 }, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingsCreation(Landroidx/appcompat/app/AppCompatActivity;)Z - move-result v0 - if-eqz v0, :no_rv_settings_init - return-void - """, - ExternalLabel( - "no_rv_settings_init", - settingsActivityOnCreateFingerprint.method.getInstruction(insertIndex), - ), - ) + settingsActivityOnCreateMethod.apply { + val insertIndex = instructions.size - 2 + addInstructionsWithLabels( + insertIndex, + """ + invoke-static { p0 }, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingsCreation(Landroidx/appcompat/app/AppCompatActivity;)Z + move-result v0 + if-eqz v0, :no_rv_settings_init + return-void + """, + ExternalLabel("no_rv_settings_init", getInstruction(insertIndex)), + ) + } // Create new menu item for settings menu. - fun Fingerprint.injectMenuItem( + fun MutableMethod.injectMenuItem( name: String, value: Int, titleResourceName: String, @@ -99,7 +96,7 @@ val settingsPatch = bytecodePatch( // Add new static enum member field classDef.staticFields.add( ImmutableField( - method.definingClass, + definingClass, name, MENU_ITEM_ENUM_CLASS_DESCRIPTOR, AccessFlags.PUBLIC.value or @@ -113,8 +110,8 @@ val settingsPatch = bytecodePatch( ) // Add initializer for the new enum member - method.addInstructions( - method.implementation!!.instructions.size - 4, + addInstructions( + instructions.size - 4, """ new-instance v0, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR const-string v1, "$titleResourceName" @@ -131,7 +128,7 @@ val settingsPatch = bytecodePatch( ) } - settingsMenuItemEnumFingerprint.injectMenuItem( + settingsMenuItemEnumMethod.injectMenuItem( REVANCED_SETTINGS_MENU_ITEM_NAME, REVANCED_SETTINGS_MENU_ITEM_ID, REVANCED_SETTINGS_MENU_ITEM_TITLE_RES, @@ -139,7 +136,7 @@ val settingsPatch = bytecodePatch( ) // Intercept settings menu creation and add new menu item. - menuGroupsUpdatedFingerprint.method.addInstructions( + menuGroupsUpdatedMethod.addInstructions( 0, """ sget-object v0, $MENU_ITEM_ENUM_CLASS_DESCRIPTOR->$REVANCED_SETTINGS_MENU_ITEM_NAME:$MENU_ITEM_ENUM_CLASS_DESCRIPTOR @@ -149,7 +146,7 @@ val settingsPatch = bytecodePatch( ) // Intercept onclick events for the settings menu - menuGroupsOnClickFingerprint.method.addInstructionsWithLabels( + menuGroupsOnClickMethod.addInstructionsWithLabels( 0, """ invoke-static {p1}, $ACTIVITY_HOOKS_CLASS_DESCRIPTOR->handleSettingMenuOnClick(Ljava/lang/Enum;)Z @@ -161,12 +158,12 @@ val settingsPatch = bytecodePatch( """, ExternalLabel( "no_rv_settings_onclick", - menuGroupsOnClickFingerprint.method.getInstruction(0), + menuGroupsOnClickMethod.getInstruction(0), ), ) } - finalize { + afterDependents { PreferenceScreen.close() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt index dc100acb10..52afcfa187 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt @@ -1,27 +1,25 @@ package app.revanced.patches.twitter.interaction.downloads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildMediaOptionsSheetFingerprint = fingerprint { +internal val BytecodePatchContext.buildMediaOptionsSheetMethodMatch by composingFirstMethod("mediaEntity", "media_options_sheet") { opcodes( Opcode.IF_EQ, Opcode.SGET_OBJECT, Opcode.GOTO_16, Opcode.NEW_INSTANCE, ) - strings("mediaEntity", "media_options_sheet") } -internal val constructMediaOptionsSheetFingerprint = fingerprint { +internal val BytecodePatchContext.constructMediaOptionsSheetMethodMatch by composingFirstMethod("captionsState") { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - strings("captionsState") } -internal val showDownloadVideoUpsellBottomSheetFingerprint = fingerprint { - returns("Z") - strings("mediaEntity", "url") +internal val BytecodePatchContext.showDownloadVideoUpsellBottomSheetMethodMatch by composingFirstMethod("mediaEntity") { + returnType("Z") opcodes(Opcode.IF_EQZ) + instructions("url"(String::contains)) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt index 6f2b9c12c7..99165494c5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt @@ -1,13 +1,8 @@ package app.revanced.patches.twitter.interaction.downloads -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -19,22 +14,22 @@ val unlockDownloadsPatch = bytecodePatch( ) { compatibleWith("com.twitter.android") - execute { - fun Fingerprint.patch(getRegisterAndIndex: Fingerprint.() -> Pair) { + apply { + fun CompositeMatch.patch(getRegisterAndIndex: CompositeMatch.() -> Pair) { val (index, register) = getRegisterAndIndex() method.addInstruction(index, "const/4 v$register, 0x1") } // Allow downloads for non-premium users. - showDownloadVideoUpsellBottomSheetFingerprint.patch { - val checkIndex = patternMatch!!.startIndex + showDownloadVideoUpsellBottomSheetMethodMatch.patch { + val checkIndex = showDownloadVideoUpsellBottomSheetMethodMatch[0] val register = method.getInstruction(checkIndex).registerA checkIndex to register } // Force show the download menu item. - constructMediaOptionsSheetFingerprint.patch { + constructMediaOptionsSheetMethodMatch.patch { val showDownloadButtonIndex = method.instructions.lastIndex - 1 val register = method.getInstruction(showDownloadButtonIndex).registerA @@ -42,25 +37,26 @@ val unlockDownloadsPatch = bytecodePatch( } // Make GIFs downloadable. - val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch!! - buildMediaOptionsSheetFingerprint.method.apply { - val checkMediaTypeIndex = patternMatch.startIndex - val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) + buildMediaOptionsSheetMethodMatch.let { + it.method.apply { + val checkMediaTypeIndex = it[0] + val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) - // Treat GIFs as videos. - addInstructionsWithLabels( - checkMediaTypeIndex + 1, - """ + // Treat GIFs as videos. + addInstructionsWithLabels( + checkMediaTypeIndex + 1, + """ const/4 v${checkMediaTypeInstruction.registerB}, 0x2 # GIF if-eq v${checkMediaTypeInstruction.registerA}, v${checkMediaTypeInstruction.registerB}, :video """, - ExternalLabel("video", getInstruction(patternMatch.endIndex)), - ) + ExternalLabel("video", getInstruction(it[-1])), + ) - // Remove media.isDownloadable check. - removeInstruction( - instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, - ) + // Remove media.isDownloadable check. + removeInstruction( + instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt index 625b6f0bb7..e1d0b05ea5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt @@ -1,8 +1,10 @@ package app.revanced.patches.twitter.layout.viewcount -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType + +internal val BytecodePatchContext.viewCountsEnabledMethod by gettingFirstMethodDeclaratively("view_counts_public_visibility_enabled") { + returnType("Z") -internal val viewCountsEnabledFingerprint = fingerprint { - returns("Z") - strings("view_counts_public_visibility_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt index deee9749fa..d95a340abc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.twitter.layout.viewcount -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly @Suppress("unused") val hideViewCountPatch = bytecodePatch( @@ -11,13 +11,7 @@ val hideViewCountPatch = bytecodePatch( ) { compatibleWith("com.twitter.android") - execute { - viewCountsEnabledFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x0 - return v0 - """, - ) + apply { + viewCountsEnabledMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt index 342800518a..c079fcf157 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt @@ -14,10 +14,10 @@ val dynamicColorPatch = resourcePatch( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) - execute { + apply { val resDirectory = get("res") if (!resDirectory.isDirectory) throw PatchException("The res folder can not be found.") @@ -38,8 +38,7 @@ val dynamicColorPatch = resourcePatch( } document("res/values-v31/colors.xml").use { document -> - - mapOf( + arrayOf( "ps__twitter_blue" to "@color/twitter_blue", "ps__twitter_blue_pressed" to "@color/twitter_blue_fill_pressed", "twitter_blue" to "@android:color/system_accent1_400", @@ -59,7 +58,7 @@ val dynamicColorPatch = resourcePatch( } document("res/values-night-v31/colors.xml").use { document -> - mapOf( + arrayOf( "twitter_blue" to "@android:color/system_accent1_200", "twitter_blue_fill_pressed" to "@android:color/system_accent1_300", "twitter_blue_opacity_30" to "@android:color/system_accent1_50", diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt index 13a1590a7e..aa037d7f21 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt @@ -1,10 +1,10 @@ package app.revanced.patches.twitter.misc.extension.hooks +import app.revanced.patcher.definingClass +import app.revanced.patcher.name import app.revanced.patches.shared.misc.extension.extensionHook -internal val applicationInitHook = - extensionHook { - custom { method, classDef -> - classDef.type == "Lcom/twitter/app/TwitterApplication;" && method.name == "onCreate" - } - } \ No newline at end of file +internal val applicationInitHook = extensionHook { + name("onCreate") + definingClass("Lcom/twitter/app/TwitterApplication;") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt index 682bb4f379..e1aac1db77 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.twitter.misc.hook import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.twitter.misc.hook.json.JsonHook import app.revanced.patches.twitter.misc.hook.json.addJsonHook +import app.revanced.patches.twitter.misc.hook.json.jsonHook import app.revanced.patches.twitter.misc.hook.json.jsonHookPatch fun hookPatch( @@ -15,10 +15,10 @@ fun hookPatch( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) - execute { - addJsonHook(JsonHook(hookClassDescriptor)) + apply { + addJsonHook(jsonHook(hookClassDescriptor)) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt index 337aeb5670..1f5f31264d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt @@ -1,27 +1,34 @@ package app.revanced.patches.twitter.misc.hook.json -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef +import kotlin.properties.ReadOnlyProperty -internal val jsonHookPatchFingerprint = fingerprint { - opcodes( - Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list. - // Add hooks to the hooks list. - Opcode.INVOKE_STATIC, // Call buildList. - ) - custom { method, _ -> method.name == "" } +internal val BytecodePatchContext.jsonHookPatchMethodMatch by ReadOnlyProperty { context, _ -> + context.firstImmutableClassDef(JSON_HOOK_PATCH_CLASS_DESCRIPTOR).firstMethodComposite { + name("") + opcodes( + Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list. + // Add hooks to the hooks list. + Opcode.INVOKE_STATIC, // Call buildList. + ) + } } -internal val jsonInputStreamFingerprint = fingerprint { - custom { method, _ -> - if (method.parameterTypes.isEmpty()) { +context(_: BytecodePatchContext) +internal fun ClassDef.getJsonInputStreamMethod() = firstMethodDeclaratively { + custom { + if (parameterTypes.isEmpty()) { false } else { - method.parameterTypes.first() == "Ljava/io/InputStream;" + parameterTypes.first() == "Ljava/io/InputStream;" } } } -internal val loganSquareFingerprint = fingerprint { - custom { _, classDef -> classDef.endsWith("LoganSquare;") } +internal val BytecodePatchContext.loganSquareClassDef by gettingFirstImmutableClassDef { + type.endsWith("LoganSquare;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 56785cae4c..e4fce19f2e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.twitter.misc.hook.json -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstructions +import app.revanced.patcher.firstImmutableClassDef import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch @@ -14,30 +15,27 @@ import java.io.InvalidClassException * * @param jsonHook The [JsonHook] to add. */ -context(BytecodePatchContext) -fun addJsonHook( +fun BytecodePatchContext.addJsonHook( jsonHook: JsonHook, ) { if (jsonHook.added) return - jsonHookPatchFingerprint.method.apply { - // Insert hooks right before calling buildList. - val insertIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex + // Insert hooks right before calling buildList. + val insertIndex = jsonHookPatchMethodMatch[-1] - addInstructions( - insertIndex, - """ - sget-object v1, ${jsonHook.descriptor}->INSTANCE:${jsonHook.descriptor} - invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z - """, - ) - } + jsonHookPatchMethodMatch.method.addInstructions( + insertIndex, + """ + sget-object v1, ${jsonHook.descriptor}->INSTANCE:${jsonHook.descriptor} + invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z + """, + ) jsonHook.added = true } private const val JSON_HOOK_CLASS_NAMESPACE = "app/revanced/extension/twitter/patches/hook/json" -private const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;" +internal const val JSON_HOOK_PATCH_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/JsonHookPatch;" private const val BASE_PATCH_CLASS_NAME = "BaseJsonHook" private const val JSON_HOOK_CLASS_DESCRIPTOR = "L$JSON_HOOK_CLASS_NAMESPACE/$BASE_PATCH_CLASS_NAME;" @@ -46,26 +44,20 @@ val jsonHookPatch = bytecodePatch( ) { dependsOn(sharedExtensionPatch) - execute { - jsonHookPatchFingerprint.apply { - // Make sure the extension is present. - val jsonHookPatch = classBy { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR } - ?: throw PatchException("Could not find the extension.") - - matchOrNull(jsonHookPatch.immutableClass) - ?: throw PatchException("Unexpected extension.") - } + apply { + jsonHookPatchMethodMatch.methodOrNull + ?: throw PatchException("Unexpected extension.") val jsonFactoryClassDef = - loganSquareFingerprint.originalClassDef // Conveniently find the type to hook a method in, via a named field. + loganSquareClassDef // Conveniently find the type to hook a method in, via a named field. .fields .firstOrNull { it.name == "JSON_FACTORY" } ?.type - .let { type -> classes.find { it.type == type } } + ?.let { type -> firstImmutableClassDef(type) } ?: throw PatchException("Could not find required class.") // Hook the methods first parameter. - jsonInputStreamFingerprint.match(jsonFactoryClassDef).method.addInstructions( + jsonFactoryClassDef.getJsonInputStreamMethod().addInstructions( 0, """ invoke-static { p1 }, $JSON_HOOK_PATCH_CLASS_DESCRIPTOR->parseJsonHook(Ljava/io/InputStream;)Ljava/io/InputStream; @@ -74,16 +66,20 @@ val jsonHookPatch = bytecodePatch( ) } - finalize { + afterDependents { // Remove hooks.add(dummyHook). - jsonHookPatchFingerprint.method.apply { - val addDummyHookIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex - 2 + val addDummyHookIndex = jsonHookPatchMethodMatch[-1] - removeInstructions(addDummyHookIndex, 2) - } + jsonHookPatchMethodMatch.method.removeInstructions(addDummyHookIndex, 2) } } +class JsonHook internal constructor( + internal val descriptor: String, +) { + internal var added = false +} + /** * Create a hook class. * The class has to extend on **JsonHook**. @@ -92,22 +88,18 @@ val jsonHookPatch = bytecodePatch( * @param descriptor The class descriptor of the hook. * @throws ClassNotFoundException If the class could not be found. */ -context(BytecodePatchContext) -class JsonHook( - internal val descriptor: String, -) { - internal var added = false - - init { - classBy { it.type == descriptor }?.let { - it.mutableClass.also { classDef -> - if ( - classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || - !classDef.fields.any { field -> field.name == "INSTANCE" } - ) { - throw InvalidClassException(classDef.type, "Not a hook class") - } +context(context: BytecodePatchContext) +fun jsonHook(descriptor: String): JsonHook { + context.firstImmutableClassDef(descriptor).let { + it.also { classDef -> + if ( + classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || + !classDef.fields.any { field -> field.name == "INSTANCE" } + ) { + throw InvalidClassException(classDef.type, "Not a hook class") } - } ?: throw ClassNotFoundException("Failed to find hook class $descriptor") + } } + + return JsonHook(JSON_HOOK_CLASS_DESCRIPTOR) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index e69a449652..77660b0118 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -1,12 +1,10 @@ package app.revanced.patches.twitter.misc.links -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN -import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.returnEarly @@ -19,9 +17,8 @@ import java.util.logging.Logger internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch;" internal val domainNameOption = stringOption( - key = "domainName", default = "fxtwitter.com", - title = "Domain name", + name = "Domain name", description = "The domain name to use when sharing links.", required = true, ) { @@ -33,7 +30,7 @@ internal val domainNameOption = stringOption( InetAddress.getByName(it) } catch (_: UnknownHostException) { Logger.getLogger(this::class.java.name).warning( - "Host \"$it\" did not resolve to any domain." + "Host \"$it\" did not resolve to any domain.", ) } catch (_: Exception) { // Must ignore any kind of exception. Trying to resolve network @@ -46,7 +43,7 @@ internal val domainNameOption = stringOption( // TODO restore this once Manager uses a fixed version of Patcher /* internal val changeLinkSharingDomainResourcePatch = resourcePatch { - execute { + apply { val domainName = domainNameOption.value!! val shareLinkTemplate = "https://$domainName/%1\$s/status/%2\$s" @@ -63,9 +60,9 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( - name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, - description = "$PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN Including this patch can prevent making posts that quote other posts.", - use = false + name = "Change link sharing domain", + description = "Replaces the domain name of shared links. Using this patch can prevent making posts that quote other posts.", + use = false, ) { dependsOn( sharedExtensionPatch, @@ -75,28 +72,28 @@ val changeLinkSharingDomainPatch = bytecodePatch( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) val domainName by domainNameOption() - execute { + apply { // Replace the domain name in the link sharing extension methods. - linkSharingDomainHelperFingerprint.method.returnEarly(domainName!!) + linkSharingDomainHelperMethod.returnEarly(domainName!!) // Replace the domain name when copying a link with "Copy link" button. - linkBuilderFingerprint.method.addInstructions( + linkBuilderMethod.addInstructions( 0, """ invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->formatLink(JLjava/lang/String;)Ljava/lang/String; move-result-object p0 return-object p0 - """ + """, ) // TODO remove this once changeLinkSharingDomainResourcePatch is restored // Replace the domain name in the "Share via..." dialog. - linkResourceGetterFingerprint.method.apply { + linkResourceGetterMethod.apply { val templateIdConstIndex = indexOfFirstInstructionOrThrow(Opcode.CONST) // Format the link with the new domain name register (1 instruction below the const). @@ -107,7 +104,7 @@ val changeLinkSharingDomainPatch = bytecodePatch( replaceInstruction( formatLinkCallIndex, "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + - "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;", + "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt index 6117798ebf..5bc19f665b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt @@ -1,37 +1,29 @@ package app.revanced.patches.twitter.misc.links -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val openLinkFingerprint = fingerprint { - returns("V") - parameters("Landroid/content/Context;", "Landroid/content/Intent;", "Landroid/os/Bundle;") -} - -internal val sanitizeSharingLinksFingerprint = fingerprint { - returns("Ljava/lang/String;") - strings("", "shareParam", "sessionToken") -} +internal val BytecodePatchContext.sanitizeSharingLinksMethod by gettingFirstMethod( + "", + "shareParam", + "sessionToken", +) { returnType == "Ljava/lang/String;" } // Returns a shareable link string based on a tweet ID and a username. -internal val linkBuilderFingerprint = fingerprint { - strings("/%1\$s/status/%2\$d") -} +internal val BytecodePatchContext.linkBuilderMethod by gettingFirstMethod($$"/%1$s/status/%2$d") // TODO remove this once changeLinkSharingDomainResourcePatch is restored // Returns a shareable link for the "Share via..." dialog. -internal val linkResourceGetterFingerprint = fingerprint { +internal val BytecodePatchContext.linkResourceGetterMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Landroid/content/res/Resources;") - custom { _, classDef -> - classDef.fields.any { field -> - field.type.startsWith("Lcom/twitter/model/core/") - } + parameterTypes("Landroid/content/res/Resources;") + custom { + immutableClassDef.anyField { type.startsWith("Lcom/twitter/model/core/") } } } -internal val linkSharingDomainHelperFingerprint = fingerprint { - custom { method, classDef -> - method.name == "getShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +internal val BytecodePatchContext.linkSharingDomainHelperMethod by gettingFirstMethodDeclaratively { + name("getShareDomain") + definingClass(EXTENSION_CLASS_DESCRIPTOR) } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt deleted file mode 100644 index 9c109e3602..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.twitter.misc.links - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch - -@Deprecated("Patch is obsolete and no longer needed with the highest supported app target. " + - "This patch will soon be deleted.") -@Suppress("unused") -val openLinksWithAppChooserPatch = bytecodePatch( - description = "Instead of opening links directly, open them with an app chooser. " + - "As a result you can select a browser to open the link with.", -) { - dependsOn(sharedExtensionPatch) - - compatibleWith("com.twitter.android"("10.48.0-release.0")) - - execute { - val methodReference = - "Lapp/revanced/extension/twitter/patches/links/OpenLinksWithAppChooserPatch;->" + - "openWithChooser(Landroid/content/Context;Landroid/content/Intent;)V" - - openLinkFingerprint.method.addInstructions( - 0, - """ - invoke-static { p0, p1 }, $methodReference - return-void - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt index 7856bfe966..26ec58b1b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt @@ -1,24 +1,22 @@ package app.revanced.patches.twitter.misc.links -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS -import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = PATCH_NAME_SANITIZE_SHARING_LINKS, - description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from shared links.", ) { compatibleWith( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) - execute { - sanitizeSharingLinksFingerprint.method.addInstructions( + apply { + sanitizeSharingLinksMethod.addInstructions( 0, """ # Method takes in a link (string, param 0) and then appends the tracking query params, diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt index 29b752cf84..7274ec124f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt @@ -1,7 +1,14 @@ package app.revanced.patches.viber.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.Opcode -internal val findAdStringFingerprint = fingerprint { - strings("viber_plus_debug_ads_free_flag") +internal val BytecodePatchContext.findAdStringMethodMatch by composingFirstMethod { + instructions( + Opcode.NEW_INSTANCE(), + "viber_plus_debug_ads_free_flag"(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt index 0ec31e376f..6140698857 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt @@ -1,14 +1,14 @@ package app.revanced.patches.viber.ads -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint -import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.definingClass +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.typeReference +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.patcher.returnType import app.revanced.util.returnEarly -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.TypeReference @Suppress("unused") val hideAdsPatch = bytecodePatch( @@ -17,25 +17,16 @@ val hideAdsPatch = bytecodePatch( ) { compatibleWith("com.viber.voip"("25.9.2.0", "26.1.2.0")) - execute { - val method = findAdStringFingerprint.method - - // Find the ads free string index - val stringIndex = findAdStringFingerprint.stringMatches!!.first().index + apply { + val referenceIndex = findAdStringMethodMatch[0] - // Search backwards from the string to find the `new-instance` (TypeReference) instruction - val typeRefIndex = method.indexOfFirstInstructionReversedOrThrow(stringIndex) { this.opcode == Opcode.NEW_INSTANCE } + val targetClass = + findAdStringMethodMatch.immutableMethod.getInstruction(referenceIndex).typeReference - // Get the class name from the TypeReference - val targetClass = method.getInstruction(typeRefIndex).reference as TypeReference - - // Patch the ads-free method to always return true - fingerprint { - returns("I") - parameters() - custom { method, classDef -> - classDef == targetClass - } - }.method.returnEarly(1) + val adFreeMethod = firstMethodDeclaratively { + definingClass(targetClass!!.type) + returnType("I") + parameterTypes() + }.returnEarly(1) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt index 2f2a7bda3d..ab28accbf1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt @@ -1,16 +1,16 @@ package app.revanced.patches.viber.misc.navbar -import app.revanced.patcher.fingerprint + +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstImmutableMethod +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val tabIdClassFingerprint = fingerprint { - strings("shouldShowTabId") -} +internal val BytecodePatchContext.tabIdClassMethod by gettingFirstImmutableMethod("shouldShowTabId") -context(BytecodePatchContext) -internal val shouldShowTabIdMethodFingerprint get() = fingerprint { - parameters("I", "I") - returns("Z") - custom { methodDef, classDef -> - classDef == tabIdClassFingerprint.classDef - } +context(_: BytecodePatchContext) +internal fun ClassDef.getShouldShowTabIdMethod() = firstMethodDeclaratively { + parameterTypes("I", "I") + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt index 2c07b2b10a..b828c1f216 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt @@ -1,36 +1,34 @@ package app.revanced.patches.viber.misc.navbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.shared.PATCH_NAME_HIDE_NAVIGATION_BUTTONS import java.util.logging.Logger -import kotlin.collections.joinToString @Suppress("unused") val hideNavigationButtonsPatch = bytecodePatch( - name = PATCH_NAME_HIDE_NAVIGATION_BUTTONS, + name = "Hide navigation buttons", description = "Permanently hides navigation bar buttons, such as Explore and Marketplace.", - use = false + use = false, ) { compatibleWith("com.viber.voip") val hideOptions = AllowedNavigationItems.entries.associateWith { booleanOption( - key = it.key, + name = it.optionName, default = it.defaultHideOption, - title = it.title, description = it.description, ) } - execute { + apply { // Items that won't be forcefully hidden. val allowedItems = hideOptions.filter { (option, enabled) -> enabled.value != true } if (allowedItems.size == AllowedNavigationItems.entries.size) { - return@execute Logger.getLogger(this::class.java.name).warning( - "No hide navigation buttons options are enabled. No changes applied." + return@apply Logger.getLogger(this::class.java.name).warning( + "No hide navigation buttons options are enabled. No changes applied.", ) } @@ -46,8 +44,7 @@ val hideNavigationButtonsPatch = bytecodePatch( nop """ - shouldShowTabIdMethodFingerprint - .method + tabIdClassMethod.immutableClassDef.getShouldShowTabIdMethod() .addInstructionsWithLabels(0, injectionInstructions) } } @@ -59,7 +56,7 @@ val hideNavigationButtonsPatch = bytecodePatch( private enum class AllowedNavigationItems( val defaultHideOption: Boolean, private val itemName: String, - private vararg val ids: Int + private vararg val ids: Int, ) { CHATS(false, "Chats", 0), CALLS(false, "Calls", 1, 7), @@ -67,17 +64,16 @@ private enum class AllowedNavigationItems( MORE(false, "More", 3), PAY(true, "Pay", 5), CAMERA(true, "Camera", 6), - MARKETPLACE(true, "Marketplace", 8); + MARKETPLACE(true, "Marketplace", 8), + ; - val key = "hide$itemName" - val title = "Hide $itemName" + val optionName = "Hide $itemName" val description = "Permanently hides the $itemName button." - fun buildAllowInstruction(): String = - ids.joinToString("\n") { id -> - """ + fun buildAllowInstruction(): String = ids.joinToString("\n") { id -> + """ const/4 v0, $id # If tabId == $id ($itemName), don't hide it if-eq p1, v0, :continue """ - } + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt deleted file mode 100644 index 0809324c7f..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.fingerprint - -internal val revCatSubscriptionFingerprint = fingerprint { - returns("V") - strings("use_debug_subscription_settings") - custom { _, classDef -> - classDef.endsWith("/RevCatSubscriptionSettingsRepository;") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt deleted file mode 100644 index be0278dd9e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch is deprecated because it does not work anymore and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks pro features.", -) { - compatibleWith("com.vsco.cam"("345")) - - execute { - // Set isSubscribed to true. - revCatSubscriptionFingerprint.method.addInstruction(0, "const p1, 0x1") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt index 6eb7bd176b..0c35eec719 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt @@ -1,21 +1,21 @@ package app.revanced.patches.warnwetter.misc.firebasegetcert -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val getMessagingCertFingerprint = fingerprint { - returns("Ljava/lang/String;") - strings( - "ContentValues", - "Could not get fingerprint hash for package: ", - "No such package: ", - ) +internal val BytecodePatchContext.getMessagingCertMethod by gettingFirstMethodDeclaratively( + "ContentValues", + "Could not get fingerprint hash for package: ", + "No such package: ", +) { + returnType("Ljava/lang/String;") } -internal val getRegistrationCertFingerprint = fingerprint { - returns("Ljava/lang/String;") - strings( - "FirebaseRemoteConfig", - "Could not get fingerprint hash for package: ", - "No such package: ", - ) +internal val BytecodePatchContext.getRegistrationCertMethod by gettingFirstMethodDeclaratively( + "FirebaseRemoteConfig", + "Could not get fingerprint hash for package: ", + "No such package: ", +) { + returnType("Ljava/lang/String;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt index 416ccc8f55..7fed6ff70a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatch.kt @@ -8,9 +8,9 @@ val firebaseGetCertPatch = bytecodePatch( ) { compatibleWith("de.dwd.warnapp") - execute { - listOf(getRegistrationCertFingerprint, getMessagingCertFingerprint).forEach { match -> - match.method.returnEarly("0799DDF0414D3B3475E88743C91C0676793ED450") + apply { + listOf(getRegistrationCertMethod, getMessagingCertMethod).forEach { method -> + method.returnEarly("0799DDF0414D3B3475E88743C91C0676793ED450") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt index d33880de70..1489cf9658 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt @@ -1,9 +1,11 @@ package app.revanced.patches.warnwetter.misc.promocode -import app.revanced.patcher.fingerprint +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext -internal val promoCodeUnlockFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" - } +internal val BytecodePatchContext.promoCodeUnlockMethod by gettingFirstMethodDeclaratively { + name("isValid") + definingClass("PromoTokenVerification;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt index 8acb8a650b..af3e587954 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnlockPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.warnwetter.misc.promocode -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.warnwetter.misc.firebasegetcert.firebaseGetCertPatch +import app.revanced.util.returnEarly @Suppress("unused") val promoCodeUnlockPatch = bytecodePatch( @@ -13,13 +13,7 @@ val promoCodeUnlockPatch = bytecodePatch( compatibleWith("de.dwd.warnapp"("4.2.2")) - execute { - promoCodeUnlockFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) + apply { + promoCodeUnlockMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt index e326c26825..9af8ef42ac 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt @@ -1,26 +1,23 @@ package app.revanced.patches.willhaben.ads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val adResolverFingerprint = fingerprint { +internal val BytecodePatchContext.adResolverMethod by gettingFirstMethodDeclaratively( + "Google Ad is invalid ", + "Google Native Ad is invalid ", + "Criteo Ad is invalid ", + "Amazon Ad is invalid ", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("L", "L") - strings( - "Google Ad is invalid ", - "Google Native Ad is invalid ", - "Criteo Ad is invalid ", - "Amazon Ad is invalid ", - ) + returnType("L") + parameterTypes("L", "L") } -internal val whAdViewInjectorFingerprint = fingerprint { +internal val BytecodePatchContext.whAdViewInjectorMethod by gettingFirstMethodDeclaratively("successfulAdView") { + definingClass("Lat/willhaben/advertising/WHAdView;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L", "L", "Z") - strings("successfulAdView") - custom { _, classDef -> - classDef.type == "Lat/willhaben/advertising/WHAdView;" - } + returnType("V") + parameterTypes("L", "L", "L", "Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt index b3dd1a3fcf..3f3c36699c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt @@ -4,14 +4,14 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @Suppress("unused") -internal val hideAdsPatch = bytecodePatch( +val hideAdsPatch = bytecodePatch( name = "Hide ads", description = "Hides all in-app ads.", ) { compatibleWith("at.willhaben") - execute { - adResolverFingerprint.method.returnEarly() - whAdViewInjectorFingerprint.method.returnEarly() + apply { + adResolverMethod.returnEarly() + whAdViewInjectorMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt deleted file mode 100644 index f199f127c7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint = fingerprint { - returns("I") - custom { method, classDef -> - classDef.endsWith("RawUserData;") && method.name == "isPro" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt deleted file mode 100644 index c0323c72ed..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks all pro features.", -) { - compatibleWith("co.windyapp.android") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/16 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt index 254b440f39..d1fa2a873b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.ad.general -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed @@ -8,18 +9,16 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val fullScreenEngagementAdContainerFingerprint = fingerprint { +internal val BytecodePatchContext.fullScreenEngagementAdContainerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.containsLiteralInstruction(fullScreenEngagementAdContainer) - && indexOfAddListInstruction(method) >= 0 + returnType("V") + parameterTypes() + custom { + containsLiteralInstruction(fullScreenEngagementAdContainer) && + indexOfAddListInstruction(this) >= 0 } } -internal fun indexOfAddListInstruction(method: Method) = - method.indexOfFirstInstructionReversed { - getReference()?.name == "add" - } - +internal fun indexOfAddListInstruction(method: Method) = method.indexOfFirstInstructionReversed { + getReference()?.name == "add" +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 436a5d1d05..fb9b6756bf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -1,35 +1,35 @@ package app.revanced.patches.youtube.ad.general -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.wideLiteral +import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.fix.verticalscroll.verticalScrollPatch -import app.revanced.patches.shared.misc.litho.filter.addLithoFilter -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.ad.getpremium.hideGetPremiumPatch import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fixBackToExitGesturePatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.findMutableMethodOf +import app.revanced.util.forEachInstructionAsSequence import app.revanced.util.injectHideViewCall import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c internal var adAttributionId = -1L private set internal var fullScreenEngagementAdContainer = -1L private set -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/AdsFilter;" +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/litho/AdsFilter;" private val hideAdsResourcePatch = resourcePatch { dependsOn( @@ -39,7 +39,7 @@ private val hideAdsResourcePatch = resourcePatch { addResourcesPatch, ) - execute { + apply { addResources("youtube", "ad.general.hideAdsResourcePatch") PreferenceScreen.ADS.addPreferences( @@ -55,10 +55,10 @@ private val hideAdsResourcePatch = resourcePatch { SwitchPreference("revanced_hide_web_search_results"), ) - addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;") + addLithoFilter("Lapp/revanced/extension/youtube/patches/litho/AdsFilter;") - adAttributionId = resourceMappings["id", "ad_attribution"] - fullScreenEngagementAdContainer = resourceMappings["id", "fullscreen_engagement_ad_container"] + adAttributionId = ResourceType.ID["ad_attribution"] + fullScreenEngagementAdContainer = ResourceType.ID["fullscreen_engagement_ad_container"] } } @@ -76,17 +76,17 @@ val hideAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - // Hide end screen store banner + apply { + // Hide end screen store banner. - fullScreenEngagementAdContainerFingerprint.method.apply { + fullScreenEngagementAdContainerMethod.apply { val addListIndex = indexOfAddListInstruction(this) val addListInstruction = getInstruction(addListIndex) val listRegister = addListInstruction.registerC @@ -95,47 +95,26 @@ val hideAdsPatch = bytecodePatch( replaceInstruction( addListIndex, "invoke-static { v$listRegister, v$objectRegister }, $EXTENSION_CLASS_DESCRIPTOR" + - "->hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V" + "->hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V", ) } - // Hide ad views + // Hide ad views. - classes.forEach { classDef -> - classDef.methods.forEach { method -> - with(method.implementation) { - this?.instructions?.forEachIndexed { index, instruction -> - if (instruction.opcode != Opcode.CONST) { - return@forEachIndexed - } - // Instruction to store the id adAttribution into a register - if ((instruction as Instruction31i).wideLiteral != adAttributionId) { - return@forEachIndexed - } + forEachInstructionAsSequence({ _, method, instruction, index -> + if (instruction.opcode != Opcode.CONST) return@forEachInstructionAsSequence null + if (instruction.wideLiteral != adAttributionId) return@forEachInstructionAsSequence null - val insertIndex = index + 1 + val insertIndex = index + 1 - // Call to get the view with the id adAttribution - with(instructions.elementAt(insertIndex)) { - if (opcode != Opcode.INVOKE_VIRTUAL) { - return@forEachIndexed - } + // Call to get the view with the id adAttribution. + if (method.instructions.elementAt(insertIndex).opcode != Opcode.INVOKE_VIRTUAL) return@forEachInstructionAsSequence null + val viewRegister = method.getInstruction(insertIndex).registerC - // Hide the view - val viewRegister = (this as Instruction35c).registerC - proxy(classDef) - .mutableClass - .findMutableMethodOf(method) - .injectHideViewCall( - insertIndex, - viewRegister, - EXTENSION_CLASS_DESCRIPTOR, - "hideAdAttributionView", - ) - } - } - } - } + return@forEachInstructionAsSequence insertIndex to viewRegister + + }) { method, (insertIndex, viewRegister) -> + method.injectHideViewCall(insertIndex, viewRegister, EXTENSION_CLASS_DESCRIPTOR, "hideAdAttributionView") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt index 7629d1760d..b8ce3bbb24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt @@ -1,21 +1,20 @@ package app.revanced.patches.youtube.ad.getpremium -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getPremiumViewFingerprint = fingerprint { +internal val BytecodePatchContext.getPremiumViewMethodMatch by composingFirstMethod { + name("onMeasure") + definingClass("Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returns("V") - parameters("I", "I") + returnType("V") + parameterTypes("I", "I") opcodes( Opcode.ADD_INT_2ADDR, Opcode.ADD_INT_2ADDR, Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID, ) - custom { method, _ -> - method.name == "onMeasure" && - method.definingClass == "Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;" - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 1ae278e615..3b19542202 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.ad.getpremium -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -25,29 +25,29 @@ val hideGetPremiumPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "ad.getpremium.hideGetPremiumPatch") PreferenceScreen.ADS.addPreferences( SwitchPreference("revanced_hide_get_premium"), ) - getPremiumViewFingerprint.method.apply { - val startIndex = getPremiumViewFingerprint.patternMatch!!.startIndex - val measuredWidthRegister = getInstruction(startIndex).registerA - val measuredHeightInstruction = getInstruction(startIndex + 1) + getPremiumViewMethodMatch.let { + val startIndex = it[0] + val measuredWidthRegister = it.method.getInstruction(startIndex).registerA + val measuredHeightInstruction = it.method.getInstruction(startIndex + 1) val measuredHeightRegister = measuredHeightInstruction.registerA val tempRegister = measuredHeightInstruction.registerB - addInstructionsWithLabels( + it.method.addInstructionsWithLabels( startIndex + 2, """ # Override the internal measurement of the layout with zero values. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt index 91cc0e8dfa..2565c0e79f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt @@ -1,11 +1,9 @@ package app.revanced.patches.youtube.ad.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext -internal val loadVideoAdsFingerprint = fingerprint { - strings( - "TriggerBundle doesn't have the required metadata specified by the trigger ", - "Tried to enter slot with no assigned slotAdapter", - "Trying to enter a slot when a slot of same type and physical position is already active. Its status: ", - ) -} +internal val BytecodePatchContext.loadVideoAdsMethod by gettingFirstMethodDeclaratively( + "TriggerBundle doesn't have the required metadata specified by the trigger ", + "Ping migration no associated ping bindings for activated trigger: ", +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 709bb7c4b6..5ad8b5da75 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.ad.video -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -11,6 +11,7 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +@Suppress("ObjectPropertyName") val videoAdsPatch = bytecodePatch( name = "Video ads", description = "Adds an option to remove ads in the video player.", @@ -23,21 +24,21 @@ val videoAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "ad.video.videoAdsPatch") PreferenceScreen.ADS.addPreferences( SwitchPreference("revanced_hide_video_ads"), ) - loadVideoAdsFingerprint.method.addInstructionsWithLabels( + loadVideoAdsMethod.addInstructionsWithLabels( 0, """ invoke-static { }, Lapp/revanced/extension/youtube/patches/VideoAdsPatch;->shouldShowAds()Z @@ -45,7 +46,7 @@ val videoAdsPatch = bytecodePatch( if-nez v0, :show_video_ads return-void """, - ExternalLabel("show_video_ads", loadVideoAdsFingerprint.method.getInstruction(0)), + ExternalLabel("show_video_ads", loadVideoAdsMethod.getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt index 1109d0fc86..18656fa5c4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt @@ -15,11 +15,11 @@ import app.revanced.util.copyResources private val copyVideoUrlResourcePatch = resourcePatch { dependsOn( settingsPatch, - playerControlsResourcePatch, + playerControlsPatch, addResourcesPatch, ) - execute { + apply { addResources("youtube", "interaction.copyvideourl.copyVideoUrlResourcePatch") PreferenceScreen.PLAYER.addPreferences( @@ -41,7 +41,7 @@ private val copyVideoUrlResourcePatch = resourcePatch { } @Suppress("unused") -val copyVideoUrlPatch = bytecodePatch( +val copyVideoURLPatch = bytecodePatch( name = "Copy video URL", description = "Adds options to display buttons in the video player to copy video URLs.", ) { @@ -53,14 +53,14 @@ val copyVideoUrlPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { val extensionPlayerPackage = "Lapp/revanced/extension/youtube/videoplayer" val buttonsDescriptors = listOf( "$extensionPlayerPackage/CopyVideoUrlButton;", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt index b252875901..fa5c83ebe5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt @@ -1,22 +1,15 @@ package app.revanced.patches.youtube.interaction.dialog -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val createDialogFingerprint = fingerprint { - accessFlags(AccessFlags.PROTECTED) - returns("V") - parameters("L", "L", "Ljava/lang/String;") - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, // dialog.show() +internal val BytecodePatchContext.createDialogMethodMatch by composingFirstMethod { + returnType("V") + parameterTypes("L", "L", "Ljava/lang/String;") + instructions( + method { toString() == $$"Landroid/app/AlertDialog$Builder;->setNegativeButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" }, + method { toString() == $$"Landroid/app/AlertDialog$Builder;->setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;" }, + method { toString() == $$"Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;" }, + method { toString() == "Landroid/app/AlertDialog;->show()V" }, ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index d4030d6bfd..c0d7e173e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.interaction.dialog -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -11,6 +11,10 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch;" + +@Suppress("unused") val removeViewerDiscretionDialogPatch = bytecodePatch( name = "Remove viewer discretion dialog", description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + @@ -24,32 +28,30 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - val extensionMethodDescriptor = - "Lapp/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch;->" + - "confirmDialog(Landroid/app/AlertDialog;)V" - - execute { + apply { addResources("youtube", "interaction.dialog.removeViewerDiscretionDialogPatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( SwitchPreference("revanced_remove_viewer_discretion_dialog"), ) - createDialogFingerprint.method.apply { - val showDialogIndex = implementation!!.instructions.lastIndex - 2 - val dialogRegister = getInstruction(showDialogIndex).registerC + createDialogMethodMatch.let { + it.method.apply { + val showDialogIndex = it[-1] + val dialogRegister = getInstruction(showDialogIndex).registerC - replaceInstructions( - showDialogIndex, - "invoke-static { v$dialogRegister }, $extensionMethodDescriptor", - ) + replaceInstructions( + showDialogIndex, + "invoke-static { v$dialogRegister }, $EXTENSION_CLASS_DESCRIPTOR->confirmDialog(Landroid/app/AlertDialog;)V", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt index fbf1535070..adfbd1cdf9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt @@ -1,16 +1,19 @@ package app.revanced.patches.youtube.interaction.doubletap -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableDoubleTapActionsPatch;" @@ -24,27 +27,37 @@ val disableDoubleTapActionsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "20.07.39", - "20.13.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { + if (!is_20_14_or_greater) { + // Show a message if users have version constrain off and are patching the oldest version, + // just to prevent spamming a cryptic error message the user may not understand + // and don't add in app settings that won't work. + return@apply Logger.getLogger(this::class.java.name).warning( + "Disable double tap actions requires 20.14.43+", + ) + } + addResources("youtube", "interaction.doubletap.disableDoubleTapActionsPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_disable_chapter_skip_double_tap"), ) - val doubleTapInfoGetSeekSourceFingerprint = fingerprint { + val doubleTapInfoGetSeekSourceMethod = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Z") - returns(seekTypeEnumFingerprint.originalClassDef.type) + parameterTypes("Z") + returnType(seekTypeEnumMethod.immutableClassDef.type) opcodes( Opcode.IF_EQZ, Opcode.SGET_OBJECT, @@ -52,33 +65,24 @@ val disableDoubleTapActionsPatch = bytecodePatch( Opcode.SGET_OBJECT, Opcode.RETURN_OBJECT, ) - custom { _, classDef -> - classDef.fields.count() == 4 - } + custom { immutableClassDef.fields.count() == 4 } } // Force isChapterSeek flag to false. - doubleTapInfoGetSeekSourceFingerprint.method.addInstructions( + doubleTapInfoGetSeekSourceMethod.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->disableDoubleTapChapters(Z)Z move-result p1 - """ + """, ) - doubleTapInfoCtorFingerprint.match( - doubleTapInfoGetSeekSourceFingerprint.classDef - ).method.addInstructions( + doubleTapInfoGetSeekSourceMethod.immutableClassDef.getDoubleTapInfoCtorMethod().addInstructions( 0, """ invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->disableDoubleTapChapters(Z)Z move-result p3 - """ + """, ) } } - -@Deprecated("Patch was renamed", ReplaceWith("disableDoubleTapActionsPatch")) -val disableChapterSkipDoubleTapPatch = bytecodePatch { - dependsOn(disableDoubleTapActionsPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt index 4524a68534..d65348e442 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt @@ -1,22 +1,27 @@ package app.revanced.patches.youtube.interaction.doubletap -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val seekTypeEnumFingerprint = fingerprint { +internal val BytecodePatchContext.seekTypeEnumMethod by gettingFirstImmutableMethodDeclaratively( + "SEEK_SOURCE_SEEK_TO_NEXT_CHAPTER", + "SEEK_SOURCE_SEEK_TO_PREVIOUS_CHAPTER", +) { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings( - "SEEK_SOURCE_SEEK_TO_NEXT_CHAPTER", - "SEEK_SOURCE_SEEK_TO_PREVIOUS_CHAPTER" - ) } -internal val doubleTapInfoCtorFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getDoubleTapInfoCtorMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters( + parameterTypes( "Landroid/view/MotionEvent;", "I", "Z", - "Lj\$/time/Duration;" + "Lj$/time/Duration;", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index 8e34a72280..c1d1cdcbc4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.interaction.downloads -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources @@ -14,22 +14,21 @@ import app.revanced.patches.youtube.misc.playercontrols.addBottomControl import app.revanced.patches.youtube.misc.playercontrols.initializeBottomControl import app.revanced.patches.youtube.misc.playercontrols.injectVisibilityCheckCall import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch -import app.revanced.patches.youtube.misc.playercontrols.playerControlsResourcePatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources private val downloadsResourcePatch = resourcePatch { dependsOn( - playerControlsResourcePatch, + playerControlsPatch, settingsPatch, addResourcesPatch, ) - execute { + apply { addResources("youtube", "interaction.downloads.downloadsResourcePatch") PreferenceScreen.PLAYER.addPreferences( @@ -74,24 +73,24 @@ val downloadsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { initializeBottomControl(BUTTON_DESCRIPTOR) injectVisibilityCheckCall(BUTTON_DESCRIPTOR) // Main activity is used to launch downloader intent. - mainActivityOnCreateFingerprint.method.addInstruction( + mainActivityOnCreateMethod.addInstruction( 0, - "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->activityCreated(Landroid/app/Activity;)V" + "invoke-static/range { p0 .. p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->setMainActivity(Landroid/app/Activity;)V", ) - offlineVideoEndpointFingerprint.method.apply { + offlineVideoEndpointMethod.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt index f10fc8e834..1eac7848a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt @@ -1,16 +1,19 @@ package app.revanced.patches.youtube.interaction.downloads +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -internal val offlineVideoEndpointFingerprint = fingerprint { +internal val BytecodePatchContext.offlineVideoEndpointMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters( + returnType("V") + parameterTypes( "Ljava/util/Map;", "L", "Ljava/lang/String", // VideoId "L", ) - strings("Object is not an offlineable video: ") + instructions( + "Object is not an offlineable video: "(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 8cecc1400a..18af02c1e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -1,9 +1,10 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -23,16 +24,14 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( addResourcesPatch, ) - execute { + apply { addResources("youtube", "interaction.seekbar.disablePreciseSeekingGesturePatch") PreferenceScreen.SEEKBAR.addPreferences( SwitchPreference("revanced_disable_precise_seeking_gesture"), ) - allowSwipingUpGestureFingerprint.match( - swipingUpGestureParentFingerprint.originalClassDef, - ).method.apply { + swipingUpGestureParentMethod.immutableClassDef.getAllowSwipingUpGestureMethod().apply { addInstructionsWithLabels( 0, """ @@ -45,9 +44,7 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( ) } - showSwipingUpGuideFingerprint.match( - swipingUpGestureParentFingerprint.originalClassDef, - ).method.apply { + swipingUpGestureParentMethod.immutableClassDef.getShowSwipingUpGuideMethod().apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 162b690905..c3e867c496 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -11,8 +11,6 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.findFreeRegister -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -28,7 +26,7 @@ val enableSeekbarTappingPatch = bytecodePatch( addResourcesPatch, ) - execute { + apply { addResources("youtube", "interaction.seekbar.enableSeekbarTappingPatch") PreferenceScreen.SEEKBAR.addPreferences( @@ -36,39 +34,49 @@ val enableSeekbarTappingPatch = bytecodePatch( ) // Find the required methods to tap the seekbar. - val seekbarTappingMethods = onTouchEventHandlerFingerprint.let { - fun getMethodReference(index: Int) = it.method.getInstruction(index) + val seekbarTappingMethods = onTouchEventHandlerMethodMatch.let { + fun getReference(index: Int) = it.method.getInstruction(index) .reference as MethodReference listOf( - getMethodReference(it.patternMatch!!.startIndex), - getMethodReference(it.patternMatch!!.endIndex) + getReference(it[0]), + getReference(it[-1]), ) } - seekbarTappingFingerprint.method.apply { - val pointIndex = indexOfNewPointInstruction(this) - val invokeIndex = indexOfFirstInstructionOrThrow(pointIndex, Opcode.INVOKE_VIRTUAL) - val insertIndex = invokeIndex + 1 + seekbarTappingMethodMatch.let { + val insertIndex = it[-1] + 1 - val thisInstanceRegister = getInstruction(invokeIndex).registerC - val xAxisRegister = this.getInstruction(pointIndex).registerD - val freeRegister = findFreeRegister(insertIndex, thisInstanceRegister, xAxisRegister) + it.method.apply { + val thisInstanceRegister = getInstruction( + insertIndex - 1, + ).registerC - val oMethod = seekbarTappingMethods[0] - val nMethod = seekbarTappingMethods[1] + val xAxisRegister = this.getInstruction( + it[2], + ).registerD - addInstructionsWithLabels( - insertIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->seekbarTappingEnabled()Z - move-result v$freeRegister - if-eqz v$freeRegister, :disabled - invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $oMethod - invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $nMethod - """, - ExternalLabel("disabled", getInstruction(insertIndex)), - ) + val freeRegister = findFreeRegister( + insertIndex, + thisInstanceRegister, + xAxisRegister, + ) + + val oMethod = seekbarTappingMethods[0] + val nMethod = seekbarTappingMethods[1] + + addInstructionsWithLabels( + insertIndex, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->seekbarTappingEnabled()Z + move-result v$freeRegister + if-eqz v$freeRegister, :disabled + invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $oMethod + invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $nMethod + """, + ExternalLabel("disabled", getInstruction(insertIndex)), + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 8c5dce5551..ceefafbb94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources @@ -22,7 +23,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/ val enableSlideToSeekPatch = bytecodePatch( description = "Adds an option to enable slide to seek " + - "instead of playing at 2x speed when pressing and holding in the video player." + "instead of playing at 2x speed when pressing and holding in the video player.", ) { dependsOn( sharedExtensionPatch, @@ -31,7 +32,7 @@ val enableSlideToSeekPatch = bytecodePatch( versionCheckPatch, ) - execute { + apply { addResources("youtube", "interaction.seekbar.enableSlideToSeekPatch") PreferenceScreen.SEEKBAR.addPreferences( @@ -42,16 +43,16 @@ val enableSlideToSeekPatch = bytecodePatch( // Restore the behaviour to slide to seek. - val checkIndex = slideToSeekFingerprint.patternMatch!!.startIndex - val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex) + val checkIndex = slideToSeekMethodMatch[0] + val checkReference = slideToSeekMethodMatch.method.getInstruction(checkIndex) .getReference()!! val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->isSlideToSeekDisabled(Z)Z" // A/B check method was only called on this class. - slideToSeekFingerprint.classDef.methods.forEach { method -> + slideToSeekMethodMatch.classDef.methods.forEach { method -> method.findInstructionIndicesReversed { - opcode == Opcode.INVOKE_VIRTUAL && getReference() == checkReference + opcode == Opcode.INVOKE_VIRTUAL && methodReference == checkReference }.forEach { index -> method.apply { val register = getInstruction(index + 1).registerA @@ -73,9 +74,9 @@ val enableSlideToSeekPatch = bytecodePatch( // Disable the double speed seek gesture. if (is_19_17_or_greater) { - disableFastForwardGestureFingerprint.let { + disableFastForwardGestureMethodMatch.let { it.method.apply { - val targetIndex = it.patternMatch!!.endIndex + val targetIndex = it[-1] val targetRegister = getInstruction(targetIndex).registerA addInstructions( @@ -88,17 +89,19 @@ val enableSlideToSeekPatch = bytecodePatch( } } } else { - disableFastForwardLegacyFingerprint.method.apply { - val insertIndex = disableFastForwardLegacyFingerprint.patternMatch!!.endIndex + 1 - val targetRegister = getInstruction(insertIndex).registerA + disableFastForwardLegacyMethodMatch.let { + it.method.apply { + val insertIndex = it[-1] + 1 + val targetRegister = getInstruction(insertIndex).registerA - addInstructions( - insertIndex, - """ - invoke-static { v$targetRegister }, $extensionMethodDescriptor - move-result v$targetRegister - """, - ) + addInstructions( + insertIndex, + """ + invoke-static { v$targetRegister }, $extensionMethodDescriptor + move-result v$targetRegister + """, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 0b7bf052af..38683f9acc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -1,66 +1,90 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.stringReference +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.youtube.misc.playservice.* +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val swipingUpGestureParentFingerprint = fingerprint { - returns("Z") - parameters() - literal { 45379021 } +internal val BytecodePatchContext.swipingUpGestureParentMethod by gettingFirstImmutableMethodDeclaratively { + returnType("Z") + parameterTypes() + instructions( + 45379021L(), // Swipe up fullscreen feature flag + ) } /** - * Resolves using the class found in [swipingUpGestureParentFingerprint]. + * Resolves using the class found in [swipingUpGestureParentMethod]. */ -internal val showSwipingUpGuideFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getShowSwipingUpGuideMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.FINAL) - returns("Z") - parameters() - literal { 1 } + returnType("Z") + parameterTypes() + instructions(1L()) } /** - * Resolves using the class found in [swipingUpGestureParentFingerprint]. + * Resolves using the class found in [swipingUpGestureParentMethod]. */ -internal val allowSwipingUpGestureFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getAllowSwipingUpGestureMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") + returnType("V") + parameterTypes("L") } -internal val disableFastForwardLegacyFingerprint = fingerprint { - returns("Z") - parameters() +internal val BytecodePatchContext.disableFastForwardLegacyMethodMatch by composingFirstMethod { + returnType("Z") + parameterTypes() opcodes(Opcode.MOVE_RESULT) + // Intent start flag only used in the subscription activity literal { 45411330 } } -internal val disableFastForwardGestureFingerprint = fingerprint { +internal val BytecodePatchContext.disableFastForwardGestureMethodMatch by composingFirstMethod { + definingClass("/NextGenWatchLayout;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() + returnType("Z") + parameterTypes() opcodes( Opcode.IF_EQZ, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, ) - custom { methodDef, classDef -> - methodDef.implementation!!.instructions.count() > 30 && - classDef.type.endsWith("/NextGenWatchLayout;") + custom { instructions.count() > 30 } +} + +internal val BytecodePatchContext.customTapAndHoldMethodMatch by composingFirstMethod { + name("run") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes() + instructions(2.0f.toRawBits().toLong()()) + custom { + // Code is found in different methods with different strings. + val findSearchLandingKey = (is_19_34_or_greater && !is_19_47_or_greater) || + (is_20_19_or_greater && !is_20_20_or_greater) || is_20_31_or_greater + + indexOfFirstInstruction { + val string = stringReference?.string + string == "Failed to easy seek haptics vibrate." || + (findSearchLandingKey && string == "search_landing_cache_key") + } >= 0 } } -internal val onTouchEventHandlerFingerprint = fingerprint { +internal val BytecodePatchContext.onTouchEventHandlerMethodMatch by composingFirstMethod { + name("onTouchEvent") accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) - returns("Z") - parameters("L") + returnType("Z") + parameterTypes("L") opcodes( Opcode.INVOKE_VIRTUAL, // nMethodReference Opcode.RETURN, @@ -77,30 +101,28 @@ internal val onTouchEventHandlerFingerprint = fingerprint { Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL, // oMethodReference ) - custom { method, _ -> method.name == "onTouchEvent" } } -internal val seekbarTappingFingerprint = fingerprint { +internal val BytecodePatchContext.seekbarTappingMethodMatch by composingFirstMethod { + name("onTouchEvent") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters("L") - custom { method, _ -> - method.name == "onTouchEvent" - && method.containsLiteralInstruction(Integer.MAX_VALUE.toLong()) - && indexOfNewPointInstruction(method) >= 0 - } + returnType("Z") + parameterTypes("Landroid/view/MotionEvent;") + instructions( + Int.MAX_VALUE.toLong()(), + allOf(Opcode.NEW_INSTANCE(), type("Landroid/graphics/Point;")), + after(method { toString() == "Landroid/graphics/Point;->(II)V" }), + after(method { toString() == "Lj$/util/Optional;->of(Ljava/lang/Object;)Lj$/util/Optional;" }), + after(Opcode.MOVE_RESULT_OBJECT()), + after(allOf(Opcode.IPUT_OBJECT(), field { type == "Lj$/util/Optional;" })), + afterAtMost(10, Opcode.INVOKE_VIRTUAL()), + ) } -internal fun indexOfNewPointInstruction(method: Method) = method.indexOfFirstInstructionReversed { - val reference = getReference() - reference?.definingClass == "Landroid/graphics/Point;" - && reference.name == "" -} - -internal val slideToSeekFingerprint = fingerprint { +internal val BytecodePatchContext.slideToSeekMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/View;", "F") + returnType("V") + parameterTypes("Landroid/view/View;", "F") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, @@ -110,9 +132,18 @@ internal val slideToSeekFingerprint = fingerprint { literal { 67108864 } } -internal val fullscreenSeekbarThumbnailsQualityFingerprint = fingerprint { +internal val BytecodePatchContext.fullscreenSeekbarThumbnailsQualityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { 45399684L } + returnType("Z") + parameterTypes() + instructions( + 45399684L(), // Video stream seekbar thumbnails feature flag. + ) +} + +internal val BytecodePatchContext.fullscreenLargeSeekbarFeatureFlagMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions(45691569L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt index ddf21dd853..185ef9385c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt @@ -1,16 +1,22 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.seekbarFingerprint -import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint +import app.revanced.patches.youtube.shared.seekbarMethod +import app.revanced.patches.youtube.shared.getSeekbarOnDrawMethodMatch +import app.revanced.util.insertLiteralOverride + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;" val hideSeekbarPatch = bytecodePatch( description = "Adds an option to hide the seekbar.", @@ -20,21 +26,23 @@ val hideSeekbarPatch = bytecodePatch( settingsPatch, seekbarColorPatch, addResourcesPatch, + versionCheckPatch, ) - execute { + apply { addResources("youtube", "layout.hide.seekbar.hideSeekbarPatch") PreferenceScreen.SEEKBAR.addPreferences( SwitchPreference("revanced_hide_seekbar"), SwitchPreference("revanced_hide_seekbar_thumbnail"), + SwitchPreference("revanced_fullscreen_large_seekbar"), ) - seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels( + seekbarMethod.immutableClassDef.getSeekbarOnDrawMethodMatch().method.addInstructionsWithLabels( 0, """ const/4 v0, 0x0 - invoke-static { }, Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;->hideSeekbar()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideSeekbar()Z move-result v0 if-eqz v0, :hide_seekbar return-void @@ -42,5 +50,14 @@ val hideSeekbarPatch = bytecodePatch( nop """, ) + + if (is_20_28_or_greater) { + fullscreenLargeSeekbarFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useFullscreenLargeSeekbar(Z)Z", + ) + } + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt index d253488f3f..6033875241 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt @@ -6,24 +6,24 @@ import app.revanced.patcher.patch.bytecodePatch val seekbarPatch = bytecodePatch( name = "Seekbar", description = "Adds options to disable precise seeking when swiping up on the seekbar, " + - "slide to seek instead of playing at 2x speed when pressing and holding, " + - "tapping the player seekbar to seek, " + - "and hiding the video player seekbar." + "slide to seek instead of playing at 2x speed when pressing and holding, " + + "tapping the player seekbar to seek, " + + "and hiding the video player seekbar.", ) { dependsOn( disablePreciseSeekingGesturePatch, enableSlideToSeekPatch, enableSeekbarTappingPatch, hideSeekbarPatch, - seekbarThumbnailsPatch + seekbarThumbnailsPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt index b502be1ae5..2ffae0d6b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt @@ -1,13 +1,13 @@ package app.revanced.patches.youtube.interaction.seekbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsFingerprint +import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater @@ -18,7 +18,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/SeekbarThumbnailsPatch;" val seekbarThumbnailsPatch = bytecodePatch( - description = "Adds an option to use high quality fullscreen seekbar thumbnails." + description = "Adds an option to use high quality fullscreen seekbar thumbnails.", ) { dependsOn( sharedExtensionPatch, @@ -26,18 +26,18 @@ val seekbarThumbnailsPatch = bytecodePatch( versionCheckPatch, ) - execute { + apply { if (is_20_09_or_greater) { // High quality seekbar thumbnails is partially broken in 20.09 // and the code is completely removed in 20.10+ - return@execute + return@apply } addResources("youtube", "layout.seekbar.seekbarThumbnailsPatch") if (is_19_17_or_greater) { PreferenceScreen.SEEKBAR.addPreferences( - SwitchPreference("revanced_seekbar_thumbnails_high_quality") + SwitchPreference("revanced_seekbar_thumbnails_high_quality"), ) } else { PreferenceScreen.SEEKBAR.addPreferences( @@ -45,11 +45,11 @@ val seekbarThumbnailsPatch = bytecodePatch( SwitchPreference( key = "revanced_seekbar_thumbnails_high_quality", summaryOnKey = "revanced_seekbar_thumbnails_high_quality_legacy_summary_on", - summaryOffKey = "revanced_seekbar_thumbnails_high_quality_legacy_summary_on" - ) + summaryOffKey = "revanced_seekbar_thumbnails_high_quality_legacy_summary_on", + ), ) - fullscreenSeekbarThumbnailsFingerprint.method.apply { + fullscreenSeekbarThumbnailsMethod.apply { val moveResultIndex = instructions.lastIndex - 1 addInstruction( @@ -59,13 +59,13 @@ val seekbarThumbnailsPatch = bytecodePatch( } } - fullscreenSeekbarThumbnailsQualityFingerprint.method.addInstructions( + fullscreenSeekbarThumbnailsQualityMethod.addInstructions( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->useHighQualityFullscreenThumbnails()Z move-result v0 return v0 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt index e1161ea13d..91a1e9af1e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt @@ -1,23 +1,24 @@ package app.revanced.patches.youtube.interaction.swipecontrols -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val swipeControlsHostActivityFingerprint = fingerprint { +internal val BytecodePatchContext.swipeControlsHostActivityMethod by gettingFirstImmutableMethodDeclaratively { + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters() - custom { method, _ -> - method.definingClass == EXTENSION_CLASS_DESCRIPTOR - } + parameterTypes() } -internal const val SWIPE_CHANGE_VIDEO_FEATURE_FLAG = 45631116L - -internal val swipeChangeVideoFingerprint = fingerprint { +internal val BytecodePatchContext.swipeChangeVideoMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - literal { - SWIPE_CHANGE_VIDEO_FEATURE_FLAG - } + instructions( + 45631116L(), // Swipe to change fullscreen video feature flag. + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index a1a9e40a94..6c49c61618 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -1,8 +1,9 @@ package app.revanced.patches.youtube.interaction.swipecontrols +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.InputType @@ -12,27 +13,35 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityConstructorFingerprint +import app.revanced.patches.youtube.shared.mainActivityConstructorMethod import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity;" +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity;" private val swipeControlsResourcePatch = resourcePatch { dependsOn( settingsPatch, addResourcesPatch, + versionCheckPatch, ) - execute { + apply { addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch") - if (is_19_43_or_greater) { + // If fullscreen swipe is enabled in newer versions the app can crash. + // It likely is caused by conflicting experimental flags that are never enabled together. + // Flag was completely removed in 20.34+ + if (is_19_43_or_greater && !is_20_22_or_greater) { PreferenceScreen.SWIPE_CONTROLS.addPreferences( - SwitchPreference("revanced_swipe_change_video") + SwitchPreference("revanced_swipe_change_video"), ) } @@ -45,12 +54,16 @@ private val swipeControlsResourcePatch = resourcePatch { SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"), ListPreference("revanced_swipe_overlay_style"), TextPreference("revanced_swipe_overlay_background_opacity", inputType = InputType.NUMBER), - TextPreference("revanced_swipe_overlay_progress_brightness_color", + TextPreference( + "revanced_swipe_overlay_progress_brightness_color", tag = "app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference", - inputType = InputType.TEXT_CAP_CHARACTERS), - TextPreference("revanced_swipe_overlay_progress_volume_color", + inputType = InputType.TEXT_CAP_CHARACTERS, + ), + TextPreference( + "revanced_swipe_overlay_progress_volume_color", tag = "app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference", - inputType = InputType.TEXT_CAP_CHARACTERS), + inputType = InputType.TEXT_CAP_CHARACTERS, + ), TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER), TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER), TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER), @@ -88,16 +101,16 @@ val swipeControlsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - val wrapperClass = swipeControlsHostActivityFingerprint.classDef - val targetClass = mainActivityConstructorFingerprint.classDef + apply { + val wrapperClass = swipeControlsHostActivityMethod.classDef + val targetClass = mainActivityConstructorMethod.classDef // Inject the wrapper class from the extension into the class hierarchy of MainActivity. wrapperClass.setSuperClass(targetClass.superclass) @@ -122,11 +135,13 @@ val swipeControlsPatch = bytecodePatch( // region patch to enable/disable swipe to change video. - if (is_19_43_or_greater) { - swipeChangeVideoFingerprint.method.insertLiteralOverride( - SWIPE_CHANGE_VIDEO_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" - ) + if (is_19_43_or_greater && !is_20_34_or_greater) { + swipeChangeVideoMethodMatch.let { + it.method.insertLiteralOverride( + it[-1], + "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z", + ) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index b3fbc6b0aa..bc67ed397c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.autocaptions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -12,7 +12,8 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableAutoCaptionsPatch;" -val autoCaptionsPatch = bytecodePatch( +@Suppress("unused") +val disableAutoCaptionsPatch = bytecodePatch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", ) { @@ -24,21 +25,21 @@ val autoCaptionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.autocaptions.autoCaptionsPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_disable_auto_captions"), ) - subtitleTrackFingerprint.method.addInstructions( + subtitleTrackMethod.addInstructions( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableAutoCaptions()Z @@ -48,19 +49,19 @@ val autoCaptionsPatch = bytecodePatch( return v0 :auto_captions_enabled nop - """ + """, ) - mapOf( - startVideoInformerFingerprint to 0, - storyboardRendererDecoderRecommendedLevelFingerprint to 1 - ).forEach { (fingerprint, enabled) -> - fingerprint.method.addInstructions( + arrayOf( + startVideoInformerMethod to 0, + storyboardRendererDecoderRecommendedLevelMethod to 1, + ).forEach { (method, enabled) -> + method.addInstructions( 0, """ const/4 v0, 0x$enabled invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setCaptionsButtonStatus(Z)V - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt index c657b72ec2..a85542b891 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt @@ -1,30 +1,30 @@ package app.revanced.patches.youtube.layout.autocaptions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val startVideoInformerFingerprint = fingerprint { +internal val BytecodePatchContext.startVideoInformerMethod by gettingFirstMethodDeclaratively("pc") { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") + returnType("V") opcodes( Opcode.INVOKE_INTERFACE, Opcode.RETURN_VOID, ) - strings("pc") } -internal val storyboardRendererDecoderRecommendedLevelFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.storyboardRendererDecoderRecommendedLevelMethod by gettingFirstMethodDeclaratively("#-1#") { + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("L") - strings("#-1#") + parameterTypes("L") } -internal val subtitleTrackFingerprint = fingerprint { +internal val BytecodePatchContext.subtitleTrackMethod by gettingFirstMethodDeclaratively("DISABLE_CAPTIONS_OPTION") { + definingClass("/SubtitleTrack;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() + returnType("Z") + parameterTypes() opcodes( Opcode.CONST_STRING, Opcode.INVOKE_VIRTUAL, @@ -33,8 +33,4 @@ internal val subtitleTrackFingerprint = fingerprint { Opcode.MOVE_RESULT, Opcode.RETURN, ) - strings("DISABLE_CAPTIONS_OPTION") - custom { _, classDef -> - classDef.endsWith("/SubtitleTrack;") - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 09ca7481d3..3859ce093d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -1,11 +1,12 @@ package app.revanced.patches.youtube.layout.branding +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_MAIN_ACTIVITY_NAME import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod @Suppress("unused") val customBrandingPatch = baseCustomBrandingPatch( @@ -15,9 +16,9 @@ val customBrandingPatch = baseCustomBrandingPatch( originalAppPackageName = YOUTUBE_PACKAGE_NAME, isYouTubeMusic = false, numberOfPresetAppNames = 5, - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreate = BytecodePatchContext::mainActivityOnCreateMethod::get, mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME, - activityAliasNameWithIntents = "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity", + activityAliasNameWithIntents = $$"com.google.android.youtube.app.honeycomb.Shell$HomeActivity", preferenceScreen = PreferenceScreen.GENERAL_LAYOUT, block = { @@ -25,11 +26,11 @@ val customBrandingPatch = baseCustomBrandingPatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - } + }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index a7b33cd482..261b0a0d80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -1,7 +1,9 @@ package app.revanced.patches.youtube.layout.branding.header -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.wideLiteral +import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -10,16 +12,15 @@ import app.revanced.patcher.util.Document import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.layout.branding.addBrandLicensePatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.util.ResourceGroup import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyResources import app.revanced.util.findElementByAttributeValueOrThrow -import app.revanced.util.forEachLiteralValueInstruction +import app.revanced.util.forEachInstructionAsSequence import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import java.io.File @@ -29,7 +30,7 @@ private val targetResourceDirectoryNames = mapOf( "drawable-hdpi" to "194x72 px", "drawable-xhdpi" to "258x96 px", "drawable-xxhdpi" to "387x144 px", - "drawable-xxxhdpi" to "512x192 px" + "drawable-xxxhdpi" to "512x192 px", ) /** @@ -57,34 +58,39 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/ private val changeHeaderBytecodePatch = bytecodePatch { dependsOn( resourceMappingPatch, - addBrandLicensePatch + addBrandLicensePatch, ) - execute { + apply { // Verify images exist. Resources are not used during patching but extension code does. arrayOf( "yt_ringo2_wordmark_header", - "yt_ringo2_premium_wordmark_header" + "yt_ringo2_premium_wordmark_header", ).forEach { resource -> variants.forEach { theme -> - resourceMappings["drawable", resource + "_" + theme] + ResourceType.DRAWABLE[resource + "_" + theme] } } arrayOf( "ytWordmarkHeader", - "ytPremiumWordmarkHeader" + "ytPremiumWordmarkHeader", ).forEach { resourceName -> - val resourceId = resourceMappings["attr", resourceName] + val id = ResourceType.ATTR[resourceName] - forEachLiteralValueInstruction(resourceId) { literalIndex -> - val register = getInstruction(literalIndex).registerA - addInstructions( - literalIndex + 1, + forEachInstructionAsSequence({ _, method, instruction, index -> + if (instruction.wideLiteral != id) return@forEachInstructionAsSequence null + + val register = method.getInstruction(index).registerA + + return@forEachInstructionAsSequence index to register + }) { method, (index, register) -> + method.addInstructions( + index + 1, """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getHeaderAttributeId(I)I move-result v$register - """ + """, ) } } @@ -100,16 +106,15 @@ val changeHeaderPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) val custom by stringOption( - key = "custom", - title = "Custom header logo", + name = "Custom header logo", description = """ Folder with images to use as a custom header logo. @@ -121,10 +126,10 @@ val changeHeaderPatch = resourcePatch( The image dimensions must be as follows: ${targetResourceDirectoryNames.map { (dpi, dim) -> "- $dpi: $dim" }.joinToString("\n")} - """.trimIndentMultiline() + """.trimIndentMultiline(), ) - execute { + apply { addResources("youtube", "layout.branding.changeHeaderPatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( @@ -134,9 +139,9 @@ val changeHeaderPatch = resourcePatch( ListPreference( key = "revanced_header_logo", entriesKey = "revanced_header_logo_custom_entries", - entryValuesKey = "revanced_header_logo_custom_entry_values" + entryValuesKey = "revanced_header_logo_custom_entry_values", ) - } + }, ) logoResourceNames.forEach { logo -> @@ -145,8 +150,8 @@ val changeHeaderPatch = resourcePatch( "change-header", ResourceGroup( "drawable", - logo + "_" + variant + ".xml" - ) + logo + "_" + variant + ".xml", + ), ) } } @@ -159,8 +164,8 @@ val changeHeaderPatch = resourcePatch( "change-header", ResourceGroup( dpi, - *customHeaderResourceFileNames - ) + *customHeaderResourceFileNames, + ), ) } } @@ -189,10 +194,11 @@ val changeHeaderPatch = resourcePatch( "Base.Theme.YouTube.Light" to "light", "Base.Theme.YouTube.Dark" to "dark", "CairoLightThemeRingo2Updates" to "light", - "CairoDarkThemeRingo2Updates" to "dark" + "CairoDarkThemeRingo2Updates" to "dark", ).forEach { (style, mode) -> val styleElement = document.childNodes.findElementByAttributeValueOrThrow( - "name", style + "name", + style, ) fun addDrawableElement(document: Document, logoName: String, mode: String) { @@ -214,21 +220,24 @@ val changeHeaderPatch = resourcePatch( if (custom != null) { val customFile = File(custom!!.trim()) if (!customFile.exists()) { - throw PatchException("The custom header path cannot be found: " + - customFile.absolutePath + throw PatchException( + "The custom header path cannot be found: " + + customFile.absolutePath, ) } if (!customFile.isDirectory) { - throw PatchException("The custom header path must be a folder: " - + customFile.absolutePath) + throw PatchException( + "The custom header path must be a folder: " + + customFile.absolutePath, + ) } var copiedFiles = false // For each source folder, copy the files to the target resource directories. - customFile.listFiles { - file -> file.isDirectory && file.name in targetResourceDirectoryNames + customFile.listFiles { file -> + file.isDirectory && file.name in targetResourceDirectoryNames }!!.forEach { dpiSourceFolder -> val targetDpiFolder = get("res").resolve(dpiSourceFolder.name) if (!targetDpiFolder.exists()) { @@ -241,8 +250,10 @@ val changeHeaderPatch = resourcePatch( }!! if (customFiles.isNotEmpty() && customFiles.size != variants.size) { - throw PatchException("Both light/dark mode images " + - "must be specified but only found: " + customFiles.map { it.name }) + throw PatchException( + "Both light/dark mode images " + + "must be specified but only found: " + customFiles.map { it.name }, + ) } customFiles.forEach { imgSourceFile -> @@ -254,9 +265,11 @@ val changeHeaderPatch = resourcePatch( } if (!copiedFiles) { - throw PatchException("Expected to find directories and files: " - + customHeaderResourceFileNames.contentToString() - + "\nBut none were found in the provided option file path: " + customFile.absolutePath) + throw PatchException( + "Expected to find directories and files: " + + customHeaderResourceFileNames.contentToString() + + "\nBut none were found in the provided option file path: " + customFile.absolutePath, + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index f48a3b3c25..c614b2ebb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -8,9 +8,13 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch +import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import java.util.logging.Logger -val hideButtonsPatch = resourcePatch( +@Suppress("unused") +val hideVideoActionButtonsPatch = resourcePatch( name = "Hide video action buttons", description = "Adds options to hide action buttons (such as the Download button) under videos.", ) { @@ -18,43 +22,62 @@ val hideButtonsPatch = resourcePatch( resourceMappingPatch, lithoFilterPatch, addResourcesPatch, + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + // 20.22+ does not yet support hiding all player buttons. + ), ) - execute { + apply { addResources("youtube", "layout.buttons.action.hideButtonsPatch") - PreferenceScreen.PLAYER.addPreferences( - PreferenceScreenPreference( - "revanced_hide_buttons_screen", - preferences = setOf( - SwitchPreference("revanced_disable_like_subscribe_glow"), + val preferences = mutableSetOf( + SwitchPreference("revanced_disable_like_subscribe_glow"), + SwitchPreference("revanced_hide_download_button"), + SwitchPreference("revanced_hide_like_dislike_button"), + SwitchPreference("revanced_hide_comments_button"), + SwitchPreference("revanced_hide_save_button"), + ) + + if (is_20_22_or_greater) { + // FIXME: 20.22+ filtering of the action buttons doesn't work because + // the buffer is the same for all buttons. + Logger.getLogger(this::class.java.name).warning( + "\n!!!" + + "\n!!! Not all player action buttons can be set hidden when patching 20.22+" + + "\n!!! Patch 20.21.37 or lower if you want to hide player action buttons" + + "\n!!!", + ) + } else { + preferences.addAll( + listOf( + SwitchPreference("revanced_hide_hype_button"), SwitchPreference("revanced_hide_ask_button"), SwitchPreference("revanced_hide_clip_button"), - SwitchPreference("revanced_hide_comments_button"), - SwitchPreference("revanced_hide_download_button"), - SwitchPreference("revanced_hide_hype_button"), - SwitchPreference("revanced_hide_like_dislike_button"), SwitchPreference("revanced_hide_promote_button"), SwitchPreference("revanced_hide_remix_button"), SwitchPreference("revanced_hide_report_button"), - SwitchPreference("revanced_hide_save_button"), SwitchPreference("revanced_hide_share_button"), SwitchPreference("revanced_hide_shop_button"), SwitchPreference("revanced_hide_stop_ads_button"), SwitchPreference("revanced_hide_thanks_button"), - ) + ), ) + } + + PreferenceScreen.PLAYER.addPreferences( + PreferenceScreenPreference( + "revanced_hide_buttons_screen", + preferences = preferences, + ), ) - addLithoFilter("Lapp/revanced/extension/youtube/patches/components/ButtonsFilter;") + addLithoFilter("Lapp/revanced/extension/youtube/patches/litho/ButtonsFilter;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index a4e65eb28b..35d51ba015 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -1,53 +1,65 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import com.android.tools.smali.dexlib2.Opcode -internal const val ANDROID_AUTOMOTIVE_STRING = "Android Automotive" - -internal val addCreateButtonViewFingerprint = fingerprint { - strings("Android Wear", ANDROID_AUTOMOTIVE_STRING) +internal val BytecodePatchContext.addCreateButtonViewMethodMatch by composingFirstMethod { + instructions( + "Android Wear"(), + Opcode.IF_EQZ(), + after("Android Automotive"()), + ) } -internal val createPivotBarFingerprint = fingerprint { +internal val BytecodePatchContext.createPivotBarMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - parameters( + parameterTypes( "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", "Landroid/widget/TextView;", "Ljava/lang/CharSequence;", ) - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + instructions( + method { name == "setText" && definingClass == "Landroid/widget/TextView;" }, + Opcode.RETURN_VOID(), ) } -internal const val TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG = 45400535L - -internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.animatedNavigationTabsFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG } + returnType("Z") + instructions( + 45680008L(), + ) } -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG = 45630927L - -internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.translucentNavigationStatusBarFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG } + returnType("Z") + instructions( + 45400535L(), // Translucent status bar feature flag. + ) } /** - * The device on screen back/home/recent buttons. + * YouTube nav buttons. */ -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG = 45632194L - -internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.translucentNavigationButtonsFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG } -} \ No newline at end of file + returnType("V") + instructions( + 45630927L(), // Translucent navigation bar buttons feature flag. + ) +} + +/** + * Device on screen back/home/recent buttons. + */ +internal val BytecodePatchContext.translucentNavigationButtonsSystemFeatureFlagMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + instructions( + 45632194L(), // Translucent system buttons feature flag. + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index 6175aa4bd8..230db65c62 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -13,19 +13,18 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/NavigationButtonsPatch;" +@Suppress("ObjectPropertyName") val navigationButtonsPatch = bytecodePatch( name = "Navigation buttons", description = "Adds options to hide and change navigation buttons (such as the Shorts button).", @@ -35,19 +34,19 @@ val navigationButtonsPatch = bytecodePatch( settingsPatch, addResourcesPatch, navigationBarHookPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.buttons.navigation.navigationButtonsPatch") val preferences = mutableSetOf( @@ -65,7 +64,13 @@ val navigationButtonsPatch = bytecodePatch( preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_disable_translucent_status_bar") + SwitchPreference("revanced_disable_translucent_status_bar"), + ) + } + + if (is_20_15_or_greater) { + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_navigation_bar_animations"), ) } @@ -73,17 +78,13 @@ val navigationButtonsPatch = bytecodePatch( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", sorting = Sorting.UNSORTED, - preferences = preferences - ) + preferences = preferences, + ), ) // Switch create with notifications button. - addCreateButtonViewFingerprint.method.apply { - val stringIndex = addCreateButtonViewFingerprint.stringMatches!!.find { match -> - match.string == ANDROID_AUTOMOTIVE_STRING - }!!.index - - val conditionalCheckIndex = stringIndex - 1 + addCreateButtonViewMethodMatch.method.apply { + val conditionalCheckIndex = addCreateButtonViewMethodMatch[1] val conditionRegister = getInstruction(conditionalCheckIndex).registerA @@ -97,40 +98,53 @@ val navigationButtonsPatch = bytecodePatch( } // Hide navigation button labels. - createPivotBarFingerprint.method.apply { - val setTextIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "setText" + createPivotBarMethodMatch.let { + it.method.apply { + val setTextIndex = it[0] + val targetRegister = getInstruction(setTextIndex).registerC + + addInstruction( + setTextIndex, + "invoke-static { v$targetRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", + ) } - - val targetRegister = getInstruction(setTextIndex).registerC - - addInstruction( - setTextIndex, - "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", - ) } // Hook navigation button created, in order to hide them. hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - // Force on/off translucent effect on status bar and navigation buttons. if (is_19_25_or_greater) { - translucentNavigationStatusBarFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", - ) + translucentNavigationStatusBarFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", + ) + } - translucentNavigationButtonsFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } - translucentNavigationButtonsSystemFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsSystemFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } + } + + if (is_20_15_or_greater) { + animatedNavigationTabsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 7cc63f0fe6..da59a908f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -1,30 +1,32 @@ package app.revanced.patches.youtube.layout.buttons.overlay -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags -internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - strings("1.0x") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(playerControlPreviousButtonTouchArea) && - methodDef.containsLiteralInstruction(playerControlNextButtonTouchArea) - } +internal val BytecodePatchContext.mediaRouteButtonMethod by gettingFirstMethodDeclaratively { + name("setVisibility") + definingClass("/MediaRouteButton;") + parameterTypes("I") } -internal val mediaRouteButtonFingerprint = fingerprint { - parameters("I") - custom { methodDef, _ -> - methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility" - } +internal val BytecodePatchContext.castButtonPlayerFeatureFlagMethodMatch by composingFirstMethod { + returnType("Z") + instructions(45690091L()) } -internal val inflateControlsGroupLayoutStubFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters() - returns("V") - literal { controlsButtonGroupLayoutStub } +internal val BytecodePatchContext.castButtonActionFeatureFlagMethodMatch by composingFirstMethod { + returnType("Z") + instructions(45690090L()) +} + +internal val BytecodePatchContext.inflateControlsGroupLayoutStubMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes() + returnType("V") + instructions( + ResourceType.ID("youtube_controls_button_group_layout_stub"), + method("inflate"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index 86242d1048..4039e8a7cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -1,49 +1,28 @@ package app.revanced.patches.youtube.layout.buttons.overlay -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.layoutConstructorFingerprint -import app.revanced.patches.youtube.shared.subtitleButtonControllerFingerprint +import app.revanced.patches.youtube.shared.getLayoutConstructorMethodMatch +import app.revanced.patches.youtube.shared.subtitleButtonControllerMethod import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var playerControlPreviousButtonTouchArea = -1L - private set -internal var playerControlNextButtonTouchArea = -1L - private set -internal var controlsButtonGroupLayoutStub = -1L - private set - -private val hidePlayerOverlayButtonsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - playerControlPreviousButtonTouchArea = resourceMappings["id", "player_control_previous_button_touch_area"] - playerControlNextButtonTouchArea = resourceMappings["id", "player_control_next_button_touch_area"] - controlsButtonGroupLayoutStub = resourceMappings["id", "youtube_controls_button_group_layout_stub"] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch;" +@Suppress("ObjectPropertyName") val hidePlayerOverlayButtonsPatch = bytecodePatch( name = "Hide player overlay buttons", description = "Adds options to hide the player Cast, Autoplay, Captions, Previous & Next buttons, and the player " + @@ -53,19 +32,20 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - hidePlayerOverlayButtonsResourcePatch, + resourceMappingPatch, // Used for finding methods. + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.buttons.overlay.hidePlayerOverlayButtonsPatch") PreferenceScreen.PLAYER.addPreferences( @@ -78,17 +58,11 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide player next/previous button. - playerControlsPreviousNextOverlayTouchFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerControlPreviousButtonTouchArea) + getLayoutConstructorMethodMatch().let { + val insertIndex = it[-1] + val viewRegister = it.method.getInstruction(insertIndex).registerC - val insertIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.INVOKE_STATIC && - getReference()?.parameterTypes?.firstOrNull() == "Landroid/view/View;" - } - - val viewRegister = getInstruction(insertIndex).registerC - - addInstruction( + it.method.addInstruction( insertIndex, "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + "->hidePreviousNextButtons(Landroid/view/View;)V", @@ -99,7 +73,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide cast button. - mediaRouteButtonFingerprint.method.addInstructions( + mediaRouteButtonMethod.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getCastButtonOverrideV2(I)I @@ -107,17 +81,28 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( """, ) + if (is_20_28_or_greater) { + arrayOf( + castButtonPlayerFeatureFlagMethodMatch, + castButtonActionFeatureFlagMethodMatch, + ).forEach { match -> + match.method.insertLiteralOverride( + match[0], + "$EXTENSION_CLASS_DESCRIPTOR->getCastButtonOverrideV2(Z)Z", + ) + } + } + // endregion // region Hide captions button. - subtitleButtonControllerFingerprint.method.apply { - // Due to previously applied patches, scanResult index cannot be used in this context + subtitleButtonControllerMethod.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 addInstruction( insertIndex, - "invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->hideCaptionsButton(Landroid/widget/ImageView;)V", + "invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->hideCaptionsButton(Landroid/widget/ImageView;)V", ) } @@ -125,7 +110,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide autoplay button. - layoutConstructorFingerprint.method.apply { + getLayoutConstructorMethodMatch().method.apply { val constIndex = indexOfFirstResourceIdOrThrow("autonav_toggle") val constRegister = getInstruction(constIndex).registerA @@ -152,27 +137,21 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide player control buttons background. - inflateControlsGroupLayoutStubFingerprint.method.apply { - val controlsButtonGroupLayoutStubResIdConstIndex = - indexOfFirstLiteralInstructionOrThrow(controlsButtonGroupLayoutStub) - val inflateControlsGroupLayoutStubIndex = - indexOfFirstInstruction(controlsButtonGroupLayoutStubResIdConstIndex) { - getReference()?.name == "inflate" - } + inflateControlsGroupLayoutStubMethodMatch.let { + it.method.apply { + val insertIndex = it[-1] + 1 + val freeRegister = findFreeRegister(insertIndex) - val freeRegister = findFreeRegister(inflateControlsGroupLayoutStubIndex) - val hidePlayerControlButtonsBackgroundDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->hidePlayerControlButtonsBackground(Landroid/view/View;)V" - - addInstructions( - inflateControlsGroupLayoutStubIndex + 1, - """ - # Move the inflated layout to a temporary register. - # The result of the inflate method is by default not moved to a register after the method is called. - move-result-object v$freeRegister - invoke-static { v$freeRegister }, $hidePlayerControlButtonsBackgroundDescriptor - """ - ) + addInstructions( + insertIndex, + """ + # Move the inflated layout to a temporary register. + # The result of the inflate method is by default not moved to a register after the method is called. + move-result-object v$freeRegister + invoke-static { v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->hidePlayerControlButtonsBackground(Landroid/view/View;)V + """, + ) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index ba599b1d68..e4a5d1d1a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.* +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -11,11 +12,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" @@ -28,45 +26,52 @@ val changeFormFactorPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - navigationButtonsPatch + navigationButtonsPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.formfactor.changeFormFactorPatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( - ListPreference("revanced_change_form_factor") + ListPreference("revanced_change_form_factor"), ) hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - createPlayerRequestBodyWithModelFingerprint.method.apply { - val formFactorEnumClass = formFactorEnumConstructorFingerprint.originalClassDef.type + val formFactorEnumConstructorClass = formFactorEnumConstructorMethod.definingClass - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - opcode == Opcode.IGET && - reference?.definingClass == formFactorEnumClass && - reference.type == "I" - } - val register = getInstruction(index).registerA - - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I - move-result v$register - """ + val createPlayerRequestBodyWithModelMatch = firstMethodComposite { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes() + instructions( + field { name == "MODEL" && definingClass == "Landroid/os/Build;" }, + field { type == "I" && definingClass == formFactorEnumConstructorClass }, ) } + + createPlayerRequestBodyWithModelMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I + move-result v$register + """, + ) + } + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index d1f1535ebf..8aa97f38d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,49 +1,15 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val formFactorEnumConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.formFactorEnumConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "UNKNOWN_FORM_FACTOR", + "SMALL_FORM_FACTOR", + "LARGE_FORM_FACTOR", + "AUTOMOTIVE_FORM_FACTOR", +) { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings( - "UNKNOWN_FORM_FACTOR", - "SMALL_FORM_FACTOR", - "LARGE_FORM_FACTOR", - "AUTOMOTIVE_FORM_FACTOR" - ) } - -internal val createPlayerRequestBodyWithModelFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - opcodes(Opcode.OR_INT_LIT16) - custom { method, _ -> - method.indexOfModelInstruction() >= 0 && - method.indexOfReleaseInstruction() >= 0 - } -} - -private fun Method.indexOfModelInstruction() = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build;" && - reference.name == "MODEL" && - reference.type == "Ljava/lang/String;" - } - -internal fun Method.indexOfReleaseInstruction(): Int = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build${'$'}VERSION;" && - reference.name == "RELEASE" && - reference.type == "Ljava/lang/String;" - } - diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index d39a639fa1..b09e058942 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.hide.endscreencards -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -9,8 +10,10 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val layoutCircleFingerprint = fingerprint { - returns("Landroid/view/View;") +internal val BytecodePatchContext.layoutCircleMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes() + returnType("Landroid/view/View;") opcodes( Opcode.CONST, Opcode.CONST_4, @@ -21,8 +24,10 @@ internal val layoutCircleFingerprint = fingerprint { literal { layoutCircle } } -internal val layoutIconFingerprint = fingerprint { - returns("Landroid/view/View;") +internal val BytecodePatchContext.layoutIconMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes() + returnType("Landroid/view/View;") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT, @@ -32,8 +37,10 @@ internal val layoutIconFingerprint = fingerprint { literal { layoutIcon } } -internal val layoutVideoFingerprint = fingerprint { - returns("Landroid/view/View;") +internal val BytecodePatchContext.layoutVideoMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC) + parameterTypes() + returnType("Landroid/view/View;") opcodes( Opcode.CONST, Opcode.CONST_4, @@ -44,18 +51,18 @@ internal val layoutVideoFingerprint = fingerprint { literal { layoutVideo } } -internal val showEndscreenCardsFingerprint = fingerprint { +internal val BytecodePatchContext.showEndscreenCardsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - custom { method, classDef -> - classDef.methods.count() == 5 - && method.containsLiteralInstruction(0) - && method.containsLiteralInstruction(5) - && method.containsLiteralInstruction(8) - && method.indexOfFirstInstruction { - val reference = getReference() - reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" - } >= 0 + returnType("V") + parameterTypes("L") + custom { + immutableClassDef.methods.count() == 5 && + containsLiteralInstruction(0) && + containsLiteralInstruction(5) && + containsLiteralInstruction(8) && + indexOfFirstInstruction { + val reference = getReference() + reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + } >= 0 } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt index d09de1d2fc..ca2fca5c35 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt @@ -1,15 +1,14 @@ package app.revanced.patches.youtube.layout.hide.endscreencards -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater @@ -32,14 +31,14 @@ private val hideEndScreenCardsResourcePatch = resourcePatch { addResourcesPatch, ) - execute { + apply { addResources("youtube", "layout.hide.endscreencards.hideEndScreenCardsResourcePatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_hide_endscreen_cards"), ) - fun idOf(name: String) = resourceMappings["layout", "endscreen_element_layout_$name"] + fun idOf(name: String) = ResourceType.LAYOUT["endscreen_element_layout_$name"] layoutCircle = idOf("circle") layoutIcon = idOf("icon") @@ -58,38 +57,38 @@ val hideEndScreenCardsPatch = bytecodePatch( dependsOn( sharedExtensionPatch, hideEndScreenCardsResourcePatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { listOf( - layoutCircleFingerprint, - layoutIconFingerprint, - layoutVideoFingerprint, - ).forEach { fingerprint -> - fingerprint.method.apply { - val insertIndex = fingerprint.patternMatch!!.endIndex + 1 + layoutCircleMethodMatch, + layoutIconMethodMatch, + layoutVideoMethodMatch, + ).forEach { match -> + match.method.apply { + val insertIndex = match[-1] + 1 val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", + "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", ) } } if (is_19_43_or_greater) { - showEndscreenCardsFingerprint.method.addInstructionsWithLabels( + showEndscreenCardsMethod.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCards()Z @@ -98,7 +97,7 @@ val hideEndScreenCardsPatch = bytecodePatch( return-void :show nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt index 887963e56e..ebb221781d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt @@ -1,38 +1,38 @@ package app.revanced.patches.youtube.layout.hide.endscreensuggestion -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val autoNavConstructorFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.autoNavConstructorMethod by gettingFirstImmutableMethodDeclaratively("main_app_autonav") { + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - strings("main_app_autonav") } -internal val autoNavStatusFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getAutoNavStatusMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() + returnType("Z") + parameterTypes() } -internal val removeOnLayoutChangeListenerFingerprint = fingerprint { +internal val BytecodePatchContext.removeOnLayoutChangeListenerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() + returnType("V") + parameterTypes() opcodes( Opcode.IPUT, - Opcode.INVOKE_VIRTUAL + Opcode.INVOKE_VIRTUAL, ) // This is the only reference present in the entire smali. - custom { method, _ -> - method.indexOfFirstInstruction { - val reference = getReference() - reference?.name == "removeOnLayoutChangeListener" && - reference.definingClass.endsWith("/YouTubePlayerOverlaysLayout;") - } >= 0 + custom { + instructions.anyInstruction { + val reference = methodReference + reference?.name == "removeOnLayoutChangeListener" && reference.definingClass.endsWith("/YouTubePlayerOverlaysLayout;") + } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt index 67658339e9..979621b5e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt @@ -1,20 +1,20 @@ package app.revanced.patches.youtube.layout.hide.endscreensuggestion -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideEndScreenSuggestedVideoPatch;" @@ -31,34 +31,33 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_end_screen_suggested_video"), ) - removeOnLayoutChangeListenerFingerprint.let { - val endScreenMethod = navigate(it.originalMethod).to(it.patternMatch!!.endIndex).stop() + removeOnLayoutChangeListenerMethodMatch.let { + val endScreenMethod = navigate(it.immutableMethod).to(it[-1]).stop() endScreenMethod.apply { - val autoNavStatusMethodName = autoNavStatusFingerprint.match( - autoNavConstructorFingerprint.classDef - ).originalMethod.name + val autoNavStatusMethodName = autoNavConstructorMethod.immutableClassDef.getAutoNavStatusMethod().name val invokeIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() + val reference = methodReference reference?.name == autoNavStatusMethodName && - reference.returnType == "Z" && - reference.parameterTypes.isEmpty() + reference.returnType == "Z" && + reference.parameterTypes.isEmpty() } + val iGetObjectIndex = indexOfFirstInstructionReversedOrThrow(invokeIndex, Opcode.IGET_OBJECT) val invokeReference = getInstruction(invokeIndex).reference val iGetObjectReference = getInstruction(iGetObjectIndex).reference @@ -81,7 +80,7 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( if-nez v0, :show_end_screen_recommendation return-void """, - ExternalLabel("show_end_screen_recommendation", getInstruction(0)) + ExternalLabel("show_end_screen_recommendation", getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 7edea5fba5..8d048b6458 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -17,6 +17,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableFullscreenAmbientModePatch;" +@Suppress("unused") val disableFullscreenAmbientModePatch = bytecodePatch( name = "Disable fullscreen ambient mode", description = "Adds an option to disable the ambient mode when in fullscreen.", @@ -29,21 +30,21 @@ val disableFullscreenAmbientModePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_disable_fullscreen_ambient_mode"), ) - setFullScreenBackgroundColorFingerprint.method.apply { + setFullScreenBackgroundColorMethod.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow { getReference()?.name == "setBackgroundColor" } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt index b619020878..57e335d8b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt @@ -1,14 +1,13 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val setFullScreenBackgroundColorFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.setFullScreenBackgroundColorMethod by gettingFirstMethodDeclaratively { + name("onLayout") + definingClass("/YouTubePlayerViewNotForReflection;") + returnType("V") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - parameters("Z", "I", "I", "I", "I") - custom { method, classDef -> - classDef.type.endsWith("/YouTubePlayerViewNotForReflection;") - && method.name == "onLayout" - } + parameterTypes("Z", "I", "I", "I", "I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 22be7c3de8..73180a043c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,84 +1,74 @@ package app.revanced.patches.youtube.layout.hide.general -import app.revanced.patcher.fingerprint -import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutFingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutMethod import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode - -internal val hideShowMoreButtonFingerprint = fingerprint { - opcodes( - Opcode.CONST, - Opcode.CONST_4, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - ) - literal { expandButtonDownId } -} +import com.android.tools.smali.dexlib2.iface.ClassDef /** - * 20.12+ + * 20.26+ */ -internal val parseElementFromBufferFingerprint = fingerprint { - parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, +internal val BytecodePatchContext.hideShowMoreButtonMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) + returnType("V") + parameterTypes("L", "Ljava/lang/Object;") + instructions( + ResourceType.LAYOUT("expand_button_down"), + method { toString() == "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;" }, + after(Opcode.MOVE_RESULT_OBJECT()), ) - strings("Failed to parse Element") // String is a partial match. } -/** - * 20.07+ - */ -internal val parseElementFromBufferLegacy2007Fingerprint = fingerprint { - parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, +internal val BytecodePatchContext.hideShowMoreLegacyButtonMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + ResourceType.LAYOUT("expand_button_down"), + method { toString() == "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;" }, + Opcode.MOVE_RESULT_OBJECT(), ) - strings("Failed to parse Element") // String is a partial match. } -/** - * 19.01 - 20.06 - */ -internal val parseElementFromBufferLegacy1901Fingerprint = fingerprint { - parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, +internal val BytecodePatchContext.parseElementFromBufferMethodMatch by composingFirstMethod { + parameterTypes("L", "L", "[B", "L", "L") + instructions( + Opcode.IGET_OBJECT(), + // IGET_BOOLEAN // 20.07+ + afterAtMost(1, Opcode.INVOKE_INTERFACE()), + after(Opcode.MOVE_RESULT_OBJECT()), + "Failed to parse Element"(String::startsWith), ) - strings("Failed to parse Element") // String is a partial match. } -internal val playerOverlayFingerprint = fingerprint { +internal val BytecodePatchContext.playerOverlayMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - strings("player_overlay_in_video_programming") + returnType("L") + instructions( + "player_overlay_in_video_programming"(), + ) } -internal val showWatermarkFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getShowWatermarkMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L") + returnType("V") + parameterTypes("L", "L") } /** - * Matches same method as [wideSearchbarLayoutFingerprint]. + * Matches same method as [wideSearchbarLayoutMethod]. */ -internal val yoodlesImageViewFingerprint = fingerprint { +internal val BytecodePatchContext.yoodlesImageViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - parameters("L", "L") - literal { youTubeLogo } + returnType("Landroid/view/View;") + parameterTypes("L", "L") + instructions(ResourceType.ID("youtube_logo")) } -internal val crowdfundingBoxFingerprint = fingerprint { +internal val BytecodePatchContext.crowdfundingBoxMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.INVOKE_VIRTUAL, @@ -88,7 +78,7 @@ internal val crowdfundingBoxFingerprint = fingerprint { literal { crowdfundingBoxId } } -internal val albumCardsFingerprint = fingerprint { +internal val BytecodePatchContext.albumCardsMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -101,9 +91,8 @@ internal val albumCardsFingerprint = fingerprint { literal { albumCardId } } -internal val filterBarHeightFingerprint = fingerprint { +internal val BytecodePatchContext.filterBarHeightMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -113,9 +102,8 @@ internal val filterBarHeightFingerprint = fingerprint { literal { filterBarHeightId } } -internal val relatedChipCloudFingerprint = fingerprint { +internal val BytecodePatchContext.relatedChipCloudMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -124,9 +112,8 @@ internal val relatedChipCloudFingerprint = fingerprint { literal { relatedChipCloudMarginId } } -internal val searchResultsChipBarFingerprint = fingerprint { +internal val BytecodePatchContext.searchResultsChipBarMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -137,27 +124,25 @@ internal val searchResultsChipBarFingerprint = fingerprint { literal { barContainerHeightId } } -internal val showFloatingMicrophoneButtonFingerprint = fingerprint { +internal val BytecodePatchContext.showFloatingMicrophoneButtonMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.IGET_BOOLEAN, - Opcode.IF_EQZ, + returnType("V") + parameterTypes() + instructions( + ResourceType.ID("fab"), + afterAtMost(10, allOf(Opcode.CHECK_CAST(), type { endsWith("/FloatingActionButton;") })), + afterAtMost(10, Opcode.IGET_BOOLEAN()), ) - literal { fabButtonId } } -internal val hideViewCountFingerprint = fingerprint { +internal val BytecodePatchContext.hideViewCountMethodMatch by composingFirstMethod( + "Has attachmentRuns but drawableRequester is missing.", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/CharSequence;") - + returnType("Ljava/lang/CharSequence;") opcodes( Opcode.RETURN_OBJECT, Opcode.CONST_STRING, Opcode.RETURN_OBJECT, ) - strings( - "Has attachmentRuns but drawableRequester is missing.", - ) -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 49e38337b1..1abf4833c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -1,29 +1,24 @@ package app.revanced.patches.youtube.layout.hide.general -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.Match -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.extensions.* +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.layout.hide.general.hideLayoutComponentsPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_26_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.* +import app.revanced.util.findFreeRegister +import app.revanced.util.findInstructionIndicesReversedOrThrow +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -31,80 +26,43 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -var expandButtonDownId = -1L +internal var albumCardId = -1L private set -var albumCardId = -1L +internal var crowdfundingBoxId = -1L private set -var crowdfundingBoxId = -1L +internal var filterBarHeightId = -1L private set -var youTubeLogo = -1L +internal var relatedChipCloudMarginId = -1L private set -var filterBarHeightId = -1L - private set -var relatedChipCloudMarginId = -1L - private set -var barContainerHeightId = -1L - private set -var fabButtonId = -1L +internal var barContainerHeightId = -1L private set private val hideLayoutComponentsResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) - execute { - expandButtonDownId = resourceMappings[ - "layout", - "expand_button_down", - ] + apply { + albumCardId = ResourceType.LAYOUT["album_card"] - albumCardId = resourceMappings[ - "layout", - "album_card", - ] + crowdfundingBoxId = ResourceType.LAYOUT["donation_companion"] - crowdfundingBoxId = resourceMappings[ - "layout", - "donation_companion", - ] + relatedChipCloudMarginId = ResourceType.LAYOUT["related_chip_cloud_reduced_margins"] - youTubeLogo = resourceMappings[ - "id", - "youtube_logo", - ] + filterBarHeightId = ResourceType.DIMEN["filter_bar_height"] - relatedChipCloudMarginId = resourceMappings[ - "layout", - "related_chip_cloud_reduced_margins", - ] - - filterBarHeightId = resourceMappings[ - "dimen", - "filter_bar_height", - ] - - barContainerHeightId = resourceMappings[ - "dimen", - "bar_container_height", - ] - - fabButtonId = resourceMappings[ - "id", - "fab", - ] + barContainerHeightId = ResourceType.DIMEN["bar_container_height"] } } private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/components/LayoutComponentsFilter;" + "Lapp/revanced/extension/youtube/patches/litho/LayoutComponentsFilter;" private const val DESCRIPTION_COMPONENTS_FILTER_CLASS_NAME = - "Lapp/revanced/extension/youtube/patches/components/DescriptionComponentsFilter;" + "Lapp/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter;" private const val COMMENTS_FILTER_CLASS_NAME = - "Lapp/revanced/extension/youtube/patches/components/CommentsFilter;" + "Lapp/revanced/extension/youtube/patches/litho/CommentsFilter;" private const val CUSTOM_FILTER_CLASS_NAME = - "Lapp/revanced/extension/shared/patches/components/CustomFilter;" + "Lapp/revanced/extension/shared/patches/litho/CustomFilter;" private const val KEYWORD_FILTER_CLASS_NAME = - "Lapp/revanced/extension/youtube/patches/components/KeywordContentFilter;" - + "Lapp/revanced/extension/youtube/patches/litho/KeywordContentFilter;" val hideLayoutComponentsPatch = hideLayoutComponentsPatch( lithoFilterPatch = lithoFilterPatch, @@ -112,22 +70,24 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( additionalDependencies = setOf( hideLayoutComponentsResourcePatch, navigationBarHookPatch, + versionCheckPatch, + resourceMappingPatch, ), filterClasses = setOf( LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR, DESCRIPTION_COMPONENTS_FILTER_CLASS_NAME, COMMENTS_FILTER_CLASS_NAME, KEYWORD_FILTER_CLASS_NAME, - CUSTOM_FILTER_CLASS_NAME + CUSTOM_FILTER_CLASS_NAME, ), compatibleWithPackages = arrayOf( "com.google.android.youtube" to setOf( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) - ) + "20.21.37", + "20.31.40", + ), + ), ) { addResources("youtube", "layout.hide.general.hideLayoutComponentsPatch") @@ -190,7 +150,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( TextPreference("revanced_hide_keyword_content_phrases", inputType = InputType.TEXT_MULTI_LINE), NonInteractivePreference( key = "revanced_hide_keyword_content_about", - tag = "app.revanced.extension.shared.settings.preference.BulletPointPreference" + tag = "app.revanced.extension.shared.settings.preference.BulletPointPreference", ), NonInteractivePreference( key = "revanced_hide_keyword_content_about_whole_words", @@ -228,7 +188,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_floating_microphone_button"), SwitchPreference( key = "revanced_hide_horizontal_shelves", - tag = "app.revanced.extension.shared.settings.preference.BulletPointSwitchPreference" + tag = "app.revanced.extension.shared.settings.preference.BulletPointSwitchPreference", ), SwitchPreference("revanced_hide_image_shelf"), SwitchPreference("revanced_hide_latest_posts"), @@ -248,31 +208,30 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // region Mix playlists - (if (is_20_09_or_greater) parseElementFromBufferFingerprint - else if (is_20_07_or_greater) parseElementFromBufferLegacy2007Fingerprint - else parseElementFromBufferLegacy1901Fingerprint).let { + parseElementFromBufferMethodMatch.let { it.method.apply { + val startIndex = it[0] + val insertIndex = startIndex + 1 + val byteArrayParameter = "p3" - val startIndex = it.patternMatch!!.startIndex val conversionContextRegister = getInstruction(startIndex).registerA val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC - val insertIndex = startIndex + 1 val freeRegister = findFreeRegister(insertIndex, conversionContextRegister, returnEmptyComponentRegister) addInstructionsWithLabels( insertIndex, """ - invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z - move-result v$freeRegister - if-eqz v$freeRegister, :show - move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 - goto :return_empty_component - :show - nop - """, + invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z + move-result v$freeRegister + if-eqz v$freeRegister, :show + move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 + goto :return_empty_component + :show + nop + """, ExternalLabel("return_empty_component", returnEmptyComponentInstruction), ) } @@ -282,9 +241,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // region Watermark (legacy code for old versions of YouTube) - showWatermarkFingerprint.match( - playerOverlayFingerprint.originalClassDef, - ).method.apply { + playerOverlayMethod.immutableClassDef.getShowWatermarkMethod().apply { val index = implementation!!.instructions.size - 5 removeInstruction(index) @@ -301,30 +258,32 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // region Show more button - hideShowMoreButtonFingerprint.method.apply { - val moveRegisterIndex = hideShowMoreButtonFingerprint.patternMatch!!.endIndex - val viewRegister = getInstruction(moveRegisterIndex).registerA + (if (is_20_26_or_greater) hideShowMoreButtonMethodMatch else hideShowMoreLegacyButtonMethodMatch).let { + it.method.apply { + val moveRegisterIndex = it[-1] + val viewRegister = getInstruction(moveRegisterIndex).registerA - val insertIndex = moveRegisterIndex + 1 - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + + val insertIndex = moveRegisterIndex + 1 + addInstruction( + insertIndex, + "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + "->hideShowMoreButton(Landroid/view/View;)V", - ) + ) + } } // endregion // region crowdfunding box - crowdfundingBoxFingerprint.let { + crowdfundingBoxMethodMatch.let { it.method.apply { - val insertIndex = it.patternMatch!!.endIndex + val insertIndex = it[-1] val objectRegister = getInstruction(insertIndex).registerA addInstruction( insertIndex, "invoke-static {v$objectRegister}, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideCrowdfundingBox(Landroid/view/View;)V", + "->hideCrowdfundingBox(Landroid/view/View;)V", ) } } @@ -333,16 +292,16 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // region hide album cards - albumCardsFingerprint.let { + albumCardsMethodMatch.let { it.method.apply { - val checkCastAnchorIndex = it.patternMatch!!.endIndex + val checkCastAnchorIndex = it[-1] val insertIndex = checkCastAnchorIndex + 1 val register = getInstruction(checkCastAnchorIndex).registerA addInstruction( insertIndex, "invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideAlbumCard(Landroid/view/View;)V", + "->hideAlbumCard(Landroid/view/View;)V", ) } } @@ -351,25 +310,26 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // region hide floating microphone - showFloatingMicrophoneButtonFingerprint.method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(fabButtonId) - val booleanIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.IGET_BOOLEAN) - val register = getInstruction(booleanIndex).registerA + showFloatingMicrophoneButtonMethodMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA - addInstructions( - booleanIndex + 1, - """ - invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z - move-result v$register + addInstructions( + index + 1, """ - ) + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z + move-result v$register + """, + ) + } } // endregion // region 'Yoodles' - yoodlesImageViewFingerprint.method.apply { + yoodlesImageViewMethod.apply { findInstructionIndicesReversedOrThrow { getReference()?.name == "setImageDrawable" }.forEach { insertIndex -> @@ -379,41 +339,40 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( replaceInstruction( insertIndex, "invoke-static { v$imageViewRegister, v$drawableRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->" + - "setDoodleDrawable(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V" + "setDoodleDrawable(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V", ) } } // endregion - // region hide view count - hideViewCountFingerprint.method.apply { - val startIndex = hideViewCountFingerprint.patternMatch!!.startIndex + hideViewCountMethodMatch.method.apply { + val startIndex = hideViewCountMethodMatch[0] var returnStringRegister = getInstruction(startIndex).registerA // Find the instruction where the text dimension is retrieved. val applyDimensionIndex = indexOfFirstInstructionReversedOrThrow { val reference = getReference() opcode == Opcode.INVOKE_STATIC && - reference?.definingClass == "Landroid/util/TypedValue;" && - reference.returnType == "F" && - reference.name == "applyDimension" && - reference.parameterTypes == listOf("I", "F", "Landroid/util/DisplayMetrics;") + reference?.definingClass == "Landroid/util/TypedValue;" && + reference.returnType == "F" && + reference.name == "applyDimension" && + reference.parameterTypes == listOf("I", "F", "Landroid/util/DisplayMetrics;") } // A float value is passed which is used to determine subtitle text size. val floatDimensionRegister = getInstruction( - applyDimensionIndex + 1 + applyDimensionIndex + 1, ).registerA addInstructions( applyDimensionIndex - 1, """ - invoke-static { v$returnStringRegister, v$floatDimensionRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->modifyFeedSubtitleSpan(Landroid/text/SpannableString;F)Landroid/text/SpannableString; - move-result-object v$returnStringRegister - """ + invoke-static { v$returnStringRegister, v$floatDimensionRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->modifyFeedSubtitleSpan(Landroid/text/SpannableString;F)Landroid/text/SpannableString; + move-result-object v$returnStringRegister + """, ) } @@ -425,40 +384,38 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( * Patch a [Method] with a given [instructions]. * * @param RegisterInstruction The type of instruction to get the register from. - * @param insertIndexOffset The offset to add to the end index of the [Match.patternMatch]. + * @param insertIndexOffset The offset to add to the end index of the [CompositeMatch.indices]. * @param hookRegisterOffset The offset to add to the register of the hook. * @param instructions The instructions to add with the register as a parameter. */ - fun Fingerprint.patch( + fun CompositeMatch.patch( insertIndexOffset: Int = 0, hookRegisterOffset: Int = 0, instructions: (Int) -> String, ) = method.apply { - val endIndex = patternMatch!!.endIndex - + val endIndex = get(-1) val insertIndex = endIndex + insertIndexOffset - val register = - getInstruction(endIndex + hookRegisterOffset).registerA + val register = getInstruction(endIndex + hookRegisterOffset).registerA addInstructions(insertIndex, instructions(register)) } - filterBarHeightFingerprint.patch { register -> + filterBarHeightMethodMatch.patch { register -> + """ + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInFeed(I)I + move-result v$register """ - invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInFeed(I)I - move-result v$register - """ } - searchResultsChipBarFingerprint.patch(-1, -2) { register -> + searchResultsChipBarMethodMatch.patch(-1, -2) { register -> + """ + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInSearch(I)I + move-result v$register """ - invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInSearch(I)I - move-result v$register - """ } - relatedChipCloudFingerprint.patch(1) { register -> + relatedChipCloudMethodMatch.patch(1) { register -> "invoke-static { v$register }, " + - "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" + "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index 5088472a1b..322ea7a5a6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -1,29 +1,34 @@ package app.revanced.patches.youtube.layout.hide.infocards -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val infocardsIncognitoFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getInfocardsIncognitoMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Boolean;") - parameters("L", "J") - strings("vibrator") + returnType("Ljava/lang/Boolean;") + parameterTypes("L", "J") + instructions("vibrator"()) } -internal val infocardsIncognitoParentFingerprint = fingerprint { +internal val BytecodePatchContext.infocardsIncognitoParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - strings("player_overlay_info_card_teaser") -} - -internal val infocardsMethodCallFingerprint = fingerprint { - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, + returnType("Ljava/lang/String;") + instructions( + "player_overlay_info_card_teaser"(), ) - strings("Missing ControlsOverlayPresenter for InfoCards to work.") - literal { drawerResourceId } } + +internal val BytecodePatchContext.infocardsMethodCallMethodMatch by + composingFirstMethod("Missing ControlsOverlayPresenter for InfoCards to work.") { + opcodes( + Opcode.INVOKE_VIRTUAL, + Opcode.IGET_OBJECT, + Opcode.INVOKE_INTERFACE, + ) + literal { drawerResourceId } + } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 6a9779a497..d42b037990 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -1,19 +1,19 @@ package app.revanced.patches.youtube.layout.hide.infocards -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -25,22 +25,10 @@ internal var drawerResourceId = -1L private set private val hideInfocardsResourcePatch = resourcePatch { - dependsOn( - settingsPatch, - resourceMappingPatch, - addResourcesPatch, - ) - execute { - addResources("youtube", "layout.hide.infocards.hideInfocardsResourcePatch") + dependsOn(resourceMappingPatch) - PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_info_cards"), - ) - - drawerResourceId = resourceMappings[ - "id", - "info_cards_drawer_header", - ] + apply { + drawerResourceId = ResourceType.ID["info_cards_drawer_header"] } } @@ -53,19 +41,28 @@ val hideInfoCardsPatch = bytecodePatch( sharedExtensionPatch, lithoFilterPatch, hideInfocardsResourcePatch, + settingsPatch, + addResourcesPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - infocardsIncognitoFingerprint.match(infocardsIncognitoParentFingerprint.originalClassDef).method.apply { + apply { + addResources("youtube", "layout.hide.infocards.hideInfocardsResourcePatch") + + PreferenceScreen.PLAYER.addPreferences( + SwitchPreference("revanced_hide_info_cards"), + ) + + // Edit: This old non litho code may be obsolete and no longer used by any supported versions. + infocardsIncognitoParentMethod.immutableClassDef.getInfocardsIncognitoMethod().apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") @@ -78,26 +75,29 @@ val hideInfoCardsPatch = bytecodePatch( ) } - val hideInfoCardsCallMethod = infocardsMethodCallFingerprint.method + // Edit: This old non litho code may be obsolete and no longer used by any supported versions. + infocardsMethodCallMethodMatch.let { + val invokeInterfaceIndex = it[-1] + it.method.apply { + val register = implementation!!.registerCount - 1 - val invokeInterfaceIndex = infocardsMethodCallFingerprint.patternMatch!!.endIndex - val toggleRegister = infocardsMethodCallFingerprint.method.implementation!!.registerCount - 1 - - hideInfoCardsCallMethod.addInstructionsWithLabels( - invokeInterfaceIndex, - """ - invoke-static {}, Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z - move-result v$toggleRegister - if-nez v$toggleRegister, :hide_info_cards - """, - ExternalLabel( - "hide_info_cards", - hideInfoCardsCallMethod.getInstruction(invokeInterfaceIndex + 1), - ), - ) + addInstructionsWithLabels( + invokeInterfaceIndex, + """ + invoke-static {}, Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z + move-result v$register + if-nez v$register, :hide_info_cards + """, + ExternalLabel( + "hide_info_cards", + getInstruction(invokeInterfaceIndex + 1), + ), + ) + } + } // Info cards can also appear as Litho components. - val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/components/HideInfoCardsFilter;" + val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/litho/HideInfoCardsFilter;" addLithoFilter(filterClassDescriptor) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index 5f48570533..9fae036084 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -11,7 +11,8 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -val hidePlayerFlyoutMenuPatch = bytecodePatch( +@Suppress("unused") +val hidePlayerFlyoutMenuItemsPatch = bytecodePatch( name = "Hide player flyout menu items", description = "Adds options to hide menu items that appear when pressing the gear icon in the video player.", ) { @@ -24,15 +25,15 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter;" + apply { + val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter;" addResources("youtube", "layout.hide.player.flyoutmenupanel.hidePlayerFlyoutMenuPatch") @@ -51,7 +52,7 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch( SwitchPreference("revanced_hide_player_flyout_lock_screen"), SwitchPreference( key = "revanced_hide_player_flyout_audio_track", - tag = "app.revanced.extension.youtube.settings.preference.HideAudioFlyoutMenuPreference" + tag = "app.revanced.extension.youtube.settings.preference.HideAudioFlyoutMenuPreference", ), SwitchPreference("revanced_hide_player_flyout_watch_in_vr"), SwitchPreference("revanced_hide_player_flyout_sleep_timer"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt index 0ca1298631..4f658610f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt @@ -1,16 +1,21 @@ package app.revanced.patches.youtube.layout.hide.relatedvideooverlay -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val relatedEndScreenResultsParentFingerprint = fingerprint { - returns("V") - literal{ appRelatedEndScreenResults } +internal val BytecodePatchContext.relatedEndScreenResultsParentMethod by gettingFirstImmutableMethodDeclaratively { + returnType("V") + instructions( + ResourceType.LAYOUT("app_related_endscreen_results"), + ) } -internal val relatedEndScreenResultsFingerprint = fingerprint { - returns("V") - parameters( +context(_: BytecodePatchContext) +internal fun ClassDef.getRelatedEndScreenResultsMethod() = firstMethodDeclaratively { + returnType("V") + parameterTypes( "I", "Z", "I", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt index f8f1f3f5fe..ad93bc6060 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt @@ -1,35 +1,17 @@ package app.revanced.patches.youtube.layout.hide.relatedvideooverlay -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patcher.util.smali.ExternalLabel - -internal var appRelatedEndScreenResults = -1L - private set - -private val hideRelatedVideoOverlayResourcePatch = resourcePatch { - dependsOn( - resourceMappingPatch, - ) - - execute { - appRelatedEndScreenResults = resourceMappings[ - "layout", - "app_related_endscreen_results", - ] - } -} private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch;" @@ -43,38 +25,37 @@ val hideRelatedVideoOverlayPatch = bytecodePatch( settingsPatch, sharedExtensionPatch, addResourcesPatch, - hideRelatedVideoOverlayResourcePatch, + resourceMappingPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_related_videos_overlay") + SwitchPreference("revanced_hide_related_videos_overlay"), ) - relatedEndScreenResultsFingerprint.match( - relatedEndScreenResultsParentFingerprint.originalClassDef - ).method.apply { - addInstructionsWithLabels( - 0, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideRelatedVideoOverlay()Z - move-result v0 - if-eqz v0, :show - return-void - """, - ExternalLabel("show", getInstruction(0)) - ) - } + val relatedEndScreenResultsMethod = + relatedEndScreenResultsParentMethod.immutableClassDef.getRelatedEndScreenResultsMethod() + + relatedEndScreenResultsMethod.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideRelatedVideoOverlay()Z + move-result v0 + if-eqz v0, :show + return-void + """, + ExternalLabel("show", relatedEndScreenResultsMethod.getInstruction(0)), + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 2803497727..0372dfb2e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -1,23 +1,24 @@ package app.revanced.patches.youtube.layout.hide.rollingnumber -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateFingerprint +import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateMethodMatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableRollingNumberAnimationsPatch;" -val disableRollingNumberAnimationPatch = bytecodePatch( +@Suppress("unused") +val disableRollingNumberAnimationsPatch = bytecodePatch( name = "Disable rolling number animations", description = "Adds an option to disable rolling number animations of video view count, user likes, and upload time.", ) { @@ -29,14 +30,14 @@ val disableRollingNumberAnimationPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.rollingnumber.disableRollingNumberAnimationPatch") PreferenceScreen.PLAYER.addPreferences( @@ -45,27 +46,27 @@ val disableRollingNumberAnimationPatch = bytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. + rollingNumberTextViewAnimationUpdateMethodMatch.let { + val blockStartIndex = it[0] + val blockEndIndex = it[-1] + 1 + it.method.apply { + val freeRegister = getInstruction(blockStartIndex).registerA - val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch!! - val blockStartIndex = patternMatch.startIndex - val blockEndIndex = patternMatch.endIndex + 1 - rollingNumberTextViewAnimationUpdateFingerprint.method.apply { - val freeRegister = getInstruction(blockStartIndex).registerA + // ReturnYouTubeDislike also makes changes to this same method, + // and must add control flow label to a noop instruction to + // ensure RYD patch adds its changes after the control flow label. + addInstructions(blockEndIndex, "nop") - // ReturnYouTubeDislike also makes changes to this same method, - // and must add control flow label to a noop instruction to - // ensure RYD patch adds its changes after the control flow label. - addInstructions(blockEndIndex, "nop") - - addInstructionsWithLabels( - blockStartIndex, - """ + addInstructionsWithLabels( + blockStartIndex, + """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableRollingNumberAnimations()Z move-result v$freeRegister if-nez v$freeRegister, :disable_animations """, - ExternalLabel("disable_animations", getInstruction(blockEndIndex)), - ) + ExternalLabel("disable_animations", getInstruction(blockEndIndex)), + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt deleted file mode 100644 index edf7390cef..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.seekbar - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.interaction.seekbar.hideSeekbarPatch - -@Deprecated("Patch was moved to app.revanced.patches.youtube.interaction.seekbar") -val hideSeekbarPatch = bytecodePatch { - dependsOn( - hideSeekbarPatch - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index cc883425ba..8915cac958 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -1,12 +1,51 @@ package app.revanced.patches.youtube.layout.hide.shorts -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { - parameters( +internal val BytecodePatchContext.shortsBottomBarContainerMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Landroid/view/View;", "Landroid/os/Bundle;") + instructions( + "r_pfvc"(), + ResourceType.ID("bottom_bar_container"), + method("getHeight"), + Opcode.MOVE_RESULT(), + ) +} + +/** + * 19.41 to 20.44. + */ + +context(_: BytecodePatchContext) +internal fun ClassDef.getRenderBottomNavigationBarMethodMatch() = firstMethodDeclaratively { + returnType("V") + parameterTypes("Ljava/lang/String;") + instructions( + Opcode.IGET_OBJECT(), + after(Opcode.MONITOR_ENTER()), + after(Opcode.IGET_OBJECT()), + after(Opcode.IF_EQZ()), + after(Opcode.INVOKE_INTERFACE()), + Opcode.MONITOR_EXIT(), + after(Opcode.RETURN_VOID()), + after(Opcode.MOVE_EXCEPTION()), + after(Opcode.MONITOR_EXIT()), + after(Opcode.THROW()), + ) +} + +/** + * Less than 19.41. + */ +internal val BytecodePatchContext.legacyRenderBottomNavigationBarLegacyParentMethod by gettingFirstImmutableMethodDeclaratively { + parameterTypes( "I", "I", "L", @@ -14,41 +53,18 @@ internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { "J", "L", ) - strings("aa") -} - -internal val shortsBottomBarContainerFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/View;", "Landroid/os/Bundle;") - strings("r_pfvc") - literal { bottomBarContainer } -} - -internal val renderBottomNavigationBarFingerprint = fingerprint { - returns("V") - parameters("Ljava/lang/String;") - opcodes( - Opcode.IGET_OBJECT, - Opcode.MONITOR_ENTER, - Opcode.IGET_OBJECT, - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.MOVE_EXCEPTION, - Opcode.MONITOR_EXIT, - Opcode.THROW, + instructions( + "aa"(), ) } /** - * Identical to [legacyRenderBottomNavigationBarParentFingerprint] + * Identical to [legacyRenderBottomNavigationBarLegacyParentMethod] * except this has an extra parameter. */ -internal val renderBottomNavigationBarParentFingerprint = fingerprint { +internal val BytecodePatchContext.renderBottomNavigationBarLegacy1941ParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters( + parameterTypes( "I", "I", "L", // ReelWatchEndpointOuterClass @@ -57,38 +73,55 @@ internal val renderBottomNavigationBarParentFingerprint = fingerprint { "Ljava/lang/String;", "L", ) - strings("aa") + instructions( + "aa"(), + ) } -internal val setPivotBarVisibilityFingerprint = fingerprint { +internal val BytecodePatchContext.renderBottomNavigationBarParentMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("[Ljava/lang/Class;") + parameterTypes( + "Ljava/lang/Class;", + "Ljava/lang/Object;", + "I", + ) + instructions( + "RPCAC"(), + ) +} + +internal val ClassDef.setPivotBarVisibilityMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - parameters("Z") + returnType("V") + parameterTypes("Z") opcodes( Opcode.CHECK_CAST, Opcode.IF_EQZ, ) } -internal val setPivotBarVisibilityParentFingerprint = fingerprint { - parameters("Z") - strings("FEnotifications_inbox") +internal val BytecodePatchContext.setPivotBarVisibilityParentMethod by gettingFirstImmutableMethodDeclaratively { + parameterTypes("Z") + instructions( + "FEnotifications_inbox"(), + ) } -internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.shortsExperimentalPlayerFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { - 45677719L - } + returnType("Z") + parameterTypes() + instructions( + 45677719L(), + ) } -internal val renderNextUIFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.renderNextUIFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { - 45649743L - } + returnType("Z") + parameterTypes() + instructions( + 45649743L(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 2d992cf394..632934da7b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -1,53 +1,42 @@ package app.revanced.patches.youtube.layout.hide.shorts -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.extensions.wideLiteral +import app.revanced.patcher.firstMethod +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_41_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.misc.playservice.* import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.findElementByAttributeValueOrThrow -import app.revanced.util.forEachLiteralValueInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstruction -import app.revanced.util.removeFromParent -import app.revanced.util.returnLate +import app.revanced.util.* import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal var bottomBarContainer = -1L - private set -internal var reelPlayerRightPivotV2Size = -1L - private set +import java.util.logging.Logger internal val hideShortsAppShortcutOption = booleanOption( - key = "hideShortsAppShortcut", + name = "Hide Shorts app shortcut", default = false, - title = "Hide Shorts app shortcut", description = "Permanently hides the shortcut to open Shorts when long pressing the app icon in your launcher.", ) internal val hideShortsWidgetOption = booleanOption( - key = "hideShortsWidget", + name = "Hide Shorts widget", default = false, - title = "Hide Shorts widget", description = "Permanently hides the launcher widget Shorts button.", ) @@ -59,12 +48,77 @@ private val hideShortsComponentsResourcePatch = resourcePatch { versionCheckPatch, ) - execute { + apply { val hideShortsAppShortcut by hideShortsAppShortcutOption val hideShortsWidget by hideShortsWidgetOption addResources("youtube", "layout.hide.shorts.hideShortsComponentsResourcePatch") + val preferences = mutableSetOf( + // Shorts player components. + // Ideally each group should be ordered similar to how they appear in the UI + + // Vertical row of buttons on right side of the screen. + SwitchPreference("revanced_hide_shorts_like_fountain"), + SwitchPreference("revanced_hide_shorts_like_button"), + SwitchPreference("revanced_hide_shorts_dislike_button"), + ) + + if (is_20_22_or_greater) { + // FIXME: The buffer is very different for 20.22+ and these current cannot be hidden. + Logger.getLogger(this::class.java.name).warning( + "\n!!!" + + "\n!!! Shorts action buttons currently cannot be set hidden when patching 20.22+" + + "\n!!! Patch 20.21.37 or lower if you want to hide Shorts action buttons" + + "\n!!!", + ) + } else { + preferences.addAll( + listOf( + SwitchPreference("revanced_hide_shorts_comments_button"), + SwitchPreference("revanced_hide_shorts_share_button"), + SwitchPreference("revanced_hide_shorts_remix_button"), + SwitchPreference("revanced_hide_shorts_sound_button"), + ), + ) + } + + preferences.addAll( + listOf( + // Upper and middle area of the player. + SwitchPreference("revanced_hide_shorts_join_button"), + SwitchPreference("revanced_hide_shorts_subscribe_button"), + SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), + + // Suggested actions. + SwitchPreference("revanced_hide_shorts_preview_comment"), + SwitchPreference("revanced_hide_shorts_save_sound_button"), + SwitchPreference("revanced_hide_shorts_use_sound_button"), + SwitchPreference("revanced_hide_shorts_use_template_button"), + SwitchPreference("revanced_hide_shorts_upcoming_button"), + SwitchPreference("revanced_hide_shorts_effect_button"), + SwitchPreference("revanced_hide_shorts_green_screen_button"), + SwitchPreference("revanced_hide_shorts_hashtag_button"), + SwitchPreference("revanced_hide_shorts_live_preview"), + SwitchPreference("revanced_hide_shorts_new_posts_button"), + SwitchPreference("revanced_hide_shorts_shop_button"), + SwitchPreference("revanced_hide_shorts_tagged_products"), + SwitchPreference("revanced_hide_shorts_search_suggestions"), + SwitchPreference("revanced_hide_shorts_super_thanks_button"), + SwitchPreference("revanced_hide_shorts_stickers"), + + // Bottom of the screen. + SwitchPreference("revanced_hide_shorts_auto_dubbed_label"), + SwitchPreference("revanced_hide_shorts_location_label"), + SwitchPreference("revanced_hide_shorts_channel_bar"), + SwitchPreference("revanced_hide_shorts_info_panel"), + SwitchPreference("revanced_hide_shorts_full_video_link_label"), + SwitchPreference("revanced_hide_shorts_video_title"), + SwitchPreference("revanced_hide_shorts_sound_metadata_label"), + SwitchPreference("revanced_hide_shorts_navigation_bar"), + ), + ) + PreferenceScreen.SHORTS.addPreferences( SwitchPreference("revanced_hide_shorts_home"), SwitchPreference("revanced_hide_shorts_search"), @@ -74,51 +128,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { PreferenceScreenPreference( key = "revanced_shorts_player_screen", sorting = PreferenceScreenPreference.Sorting.UNSORTED, - preferences = setOf( - // Shorts player components. - // Ideally each group should be ordered similar to how they appear in the UI - - // Vertical row of buttons on right side of the screen. - SwitchPreference("revanced_hide_shorts_like_fountain"), - SwitchPreference("revanced_hide_shorts_like_button"), - SwitchPreference("revanced_hide_shorts_dislike_button"), - SwitchPreference("revanced_hide_shorts_comments_button"), - SwitchPreference("revanced_hide_shorts_share_button"), - SwitchPreference("revanced_hide_shorts_remix_button"), - SwitchPreference("revanced_hide_shorts_sound_button"), - - // Upper and middle area of the player. - SwitchPreference("revanced_hide_shorts_join_button"), - SwitchPreference("revanced_hide_shorts_subscribe_button"), - SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), - - // Suggested actions. - SwitchPreference("revanced_hide_shorts_preview_comment"), - SwitchPreference("revanced_hide_shorts_save_sound_button"), - SwitchPreference("revanced_hide_shorts_use_sound_button"), - SwitchPreference("revanced_hide_shorts_use_template_button"), - SwitchPreference("revanced_hide_shorts_upcoming_button"), - SwitchPreference("revanced_hide_shorts_effect_button"), - SwitchPreference("revanced_hide_shorts_green_screen_button"), - SwitchPreference("revanced_hide_shorts_hashtag_button"), - SwitchPreference("revanced_hide_shorts_live_preview"), - SwitchPreference("revanced_hide_shorts_new_posts_button"), - SwitchPreference("revanced_hide_shorts_shop_button"), - SwitchPreference("revanced_hide_shorts_tagged_products"), - SwitchPreference("revanced_hide_shorts_search_suggestions"), - SwitchPreference("revanced_hide_shorts_super_thanks_button"), - SwitchPreference("revanced_hide_shorts_stickers"), - - // Bottom of the screen. - SwitchPreference("revanced_hide_shorts_auto_dubbed_label"), - SwitchPreference("revanced_hide_shorts_location_label"), - SwitchPreference("revanced_hide_shorts_channel_bar"), - SwitchPreference("revanced_hide_shorts_info_panel"), - SwitchPreference("revanced_hide_shorts_full_video_link_label"), - SwitchPreference("revanced_hide_shorts_video_title"), - SwitchPreference("revanced_hide_shorts_sound_metadata_label"), - SwitchPreference("revanced_hide_shorts_navigation_bar"), - ), + preferences = preferences, ), ) @@ -144,20 +154,10 @@ private val hideShortsComponentsResourcePatch = resourcePatch { shortsItem.removeFromParent() } } - - bottomBarContainer = resourceMappings[ - "id", - "bottom_bar_container", - ] - - reelPlayerRightPivotV2Size = resourceMappings[ - "dimen", - "reel_player_right_pivot_v2_size", - ] } } -private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/ShortsFilter;" +private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/litho/ShortsFilter;" @Suppress("unused") val hideShortsComponentsPatch = bytecodePatch( @@ -175,34 +175,38 @@ val hideShortsComponentsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + // 20.22+ does not yet support hiding Shorts action buttons. + ), ) hideShortsAppShortcutOption() hideShortsWidgetOption() - execute { + apply { addLithoFilter(FILTER_CLASS_DESCRIPTOR) - forEachLiteralValueInstruction( - reelPlayerRightPivotV2Size, - ) { literalInstructionIndex -> - val targetIndex = indexOfFirstInstructionOrThrow(literalInstructionIndex) { - getReference()?.name == "getDimensionPixelSize" + val id = ResourceType.DIMEN["reel_player_right_pivot_v2_size"] + + forEachInstructionAsSequence({ _, method, instruction, index -> + if (instruction.wideLiteral != id) return@forEachInstructionAsSequence null + + val targetIndex = method.indexOfFirstInstructionOrThrow(index) { + methodReference?.name == "getDimensionPixelSize" } + 1 - val sizeRegister = getInstruction(targetIndex).registerA + val sizeRegister = method.getInstruction(targetIndex).registerA - addInstructions( + return@forEachInstructionAsSequence targetIndex to sizeRegister + }) { method, (targetIndex, sizeRegister) -> + firstMethod(method).addInstructions( targetIndex + 1, """ invoke-static { v$sizeRegister }, $FILTER_CLASS_DESCRIPTOR->getSoundButtonSize(I)I move-result v$sizeRegister - """ + """, ) } @@ -211,49 +215,46 @@ val hideShortsComponentsPatch = bytecodePatch( // region Hide the navigation bar. // Hook to get the pivotBar view. - setPivotBarVisibilityFingerprint.match( - setPivotBarVisibilityParentFingerprint.originalClassDef, - ).let { result -> - result.method.apply { - val insertIndex = result.patternMatch!!.endIndex + setPivotBarVisibilityParentMethod.immutableClassDef.setPivotBarVisibilityMethodMatch.let { match -> + match.method.apply { + val insertIndex = match[-1] val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, "invoke-static {v$viewRegister}," + - " $FILTER_CLASS_DESCRIPTOR->setNavigationBar(Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;)V", + " $FILTER_CLASS_DESCRIPTOR->setNavigationBar(Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;)V", ) } } // Hook to hide the shared navigation bar when the Shorts player is opened. - renderBottomNavigationBarFingerprint.match( - if (is_19_41_or_greater) { - renderBottomNavigationBarParentFingerprint - } else { - legacyRenderBottomNavigationBarParentFingerprint - }.originalClassDef, - ).method.addInstruction( - 0, - "invoke-static { p1 }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar(Ljava/lang/String;)V", - ) + ( + if (is_20_45_or_greater) { + renderBottomNavigationBarParentMethod + } else if (is_19_41_or_greater) { + renderBottomNavigationBarLegacy1941ParentMethod + } else { + legacyRenderBottomNavigationBarLegacyParentMethod + } + ).immutableClassDef.getRenderBottomNavigationBarMethodMatch().addInstruction( + 0, + "invoke-static { p1 }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar(Ljava/lang/String;)V", + ) // Hide the bottom bar container of the Shorts player. - shortsBottomBarContainerFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstruction(bottomBarContainer) + shortsBottomBarContainerMethodMatch.let { + it.method.apply { + val targetIndex = it[-1] + val heightRegister = getInstruction(targetIndex).registerA - val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - getReference()?.name == "getHeight" - } + 1 - - val heightRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, - """ - invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I - move-result v$heightRegister - """ - ) + addInstructions( + targetIndex + 1, + """ + invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I + move-result v$heightRegister + """, + ) + } } // endregion @@ -270,12 +271,12 @@ val hideShortsComponentsPatch = bytecodePatch( // Since the buttons are native components and not Litho, it should be possible to // fix the RYD Shorts loading delay by asynchronously loading RYD and updating // the button text after RYD has loaded. - shortsExperimentalPlayerFeatureFlagFingerprint.method.returnLate(false) + shortsExperimentalPlayerFeatureFlagMethod.returnLate(false) // Experimental UI renderer must also be disabled since it requires the // experimental Shorts player. If this is enabled but Shorts player // is disabled then the app crashes when the Shorts player is opened. - renderNextUIFeatureFlagFingerprint.method.returnLate(false) + renderNextUIFeatureFlagMethod.returnLate(false) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt index 58af90ce2f..bd5d5eb64f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt @@ -1,24 +1,20 @@ package app.revanced.patches.youtube.layout.hide.signintotvpopup -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -internal var mdx_seamless_tv_sign_in_drawer_fragment_title_id = -1L - private set - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch;" -val disableSignInToTvPopupPatch = bytecodePatch( +@Suppress("unused") +val disableSignInToTVPopupPatch = bytecodePatch( name = "Disable sign in to TV popup", description = "Adds an option to disable the popup asking to sign into a TV on the same local network.", ) { @@ -26,31 +22,26 @@ val disableSignInToTvPopupPatch = bytecodePatch( settingsPatch, sharedExtensionPatch, addResourcesPatch, - resourceMappingPatch + resourceMappingPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.signintotv.disableSignInToTvPopupPatch") PreferenceScreen.MISC.addPreferences( SwitchPreference("revanced_disable_signin_to_tv_popup"), ) - mdx_seamless_tv_sign_in_drawer_fragment_title_id = resourceMappings[ - "string", - "mdx_seamless_tv_sign_in_drawer_fragment_title", - ] - - signInToTvPopupFingerprint.method.addInstructionsWithLabels( + signInToTvPopupMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSignInToTvPopup()Z @@ -60,7 +51,7 @@ val disableSignInToTvPopupPatch = bytecodePatch( return v0 :allow_sign_in_popup nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt index c79d4ed264..fa3846fdb4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.youtube.layout.hide.signintotvpopup -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patches.shared.misc.mapping.ResourceType -internal val signInToTvPopupFingerprint = fingerprint { - returns("Z") - parameters("Ljava/lang/String;", "Z", "L") - literal { - mdx_seamless_tv_sign_in_drawer_fragment_title_id - } -} \ No newline at end of file +internal val BytecodePatchContext.signInToTvPopupMethod by gettingFirstMethodDeclaratively { + returnType("Z") + parameterTypes("Ljava/lang/String;", "Z", "L") + instructions(ResourceType.STRING("mdx_seamless_tv_sign_in_drawer_fragment_title")) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt deleted file mode 100644 index 388aee7ad6..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.suggestedvideoendscreen - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch - -@Deprecated("Use 'Hide suggested video end screen' instead.") -val disableSuggestedVideoEndScreenPatch = bytecodePatch { - dependsOn(hideEndScreenSuggestedVideoPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt index 1f1876dc30..f641db4142 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt @@ -1,16 +1,21 @@ package app.revanced.patches.youtube.layout.hide.time -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val timeCounterFingerprint = fingerprint { +internal val BytecodePatchContext.timeCounterMethod by gettingFirstMethodDeclaratively { + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.SUB_LONG_2ADDR, - Opcode.IGET_WIDE, - Opcode.SUB_LONG_2ADDR + parameterTypes() + instructions( + Opcode.SUB_LONG_2ADDR(), + after(allOf(Opcode.INVOKE_STATIC(), method { returnType == "Ljava/lang/CharSequence;" })), + after(Opcode.MOVE_RESULT_OBJECT()), + after(allOf(Opcode.IGET_WIDE(), field { type == "J" })), + after(allOf(Opcode.IGET_WIDE(), field { type == "J" })), + after(Opcode.SUB_LONG_2ADDR()), + afterAtMost(5, allOf(Opcode.INVOKE_STATIC(), method { returnType == "Ljava/lang/CharSequence;" })), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 0474929d50..24b240232f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.hide.time -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,6 +9,9 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideTimestampPatch;" + +@Suppress("unused") val hideTimestampPatch = bytecodePatch( name = "Hide timestamp", description = "Adds an option to hide the timestamp in the bottom left of the video player.", @@ -21,24 +24,24 @@ val hideTimestampPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.hide.time.hideTimestampPatch") PreferenceScreen.SEEKBAR.addPreferences( SwitchPreference("revanced_hide_timestamp"), ) - timeCounterFingerprint.method.addInstructionsWithLabels( + timeCounterMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/extension/youtube/patches/HideTimestampPatch;->hideTimestamp()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideTimestamp()Z move-result v0 if-eqz v0, :hide_time return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 8c139aee4f..796a308636 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -2,40 +2,16 @@ package app.revanced.patches.youtube.layout.miniplayer -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.ClassDefComposing +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode - -internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - literal { floatyBarButtonTopMargin } -} - -/** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. - */ -internal val miniplayerModernAddViewListenerFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/View;") -} - -/** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. - */ - -internal val miniplayerModernCloseButtonFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { modernMiniplayerClose } -} +import com.android.tools.smali.dexlib2.iface.ClassDef internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L + // In later targets this feature flag does nothing and is dead code. internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L @@ -44,107 +20,167 @@ internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L +internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L -internal val miniplayerModernConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - literal { 45623000L } + instructions( + 45623000L(), // Magic number found in the constructor. + ) } -internal val miniplayerOnCloseHandlerFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerDimensionsCalculatorParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { MINIPLAYER_DISABLED_FEATURE_KEY } + returnType("V") + parameterTypes("L") + instructions( + ResourceType.DIMEN("floaty_bar_button_top_margin"), + ) +} + +internal val BytecodePatchContext.miniplayerModernViewParentMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Ljava/lang/String;") + parameterTypes() + instructions( + "player_overlay_modern_mini_player_controls"(), + ) } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernExpandButtonFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMiniplayerModernAddViewListenerMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { modernMiniplayerExpand } + returnType("V") + parameterTypes("Landroid/view/View;") } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { +internal val ClassDef.miniplayerModernCloseButtonMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - literal { ytOutlinePictureInPictureWhite24 } + returnType("L") + parameterTypes() + instructions( + ResourceType.ID("modern_miniplayer_close"), + allOf(Opcode.CHECK_CAST(), type("Landroid/widget/ImageView;")), + ) } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernForwardButtonFingerprint = fingerprint { +internal val ClassDef.miniplayerModernExpandButtonMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { modernMiniplayerForwardButton } + returnType("L") + parameterTypes() + instructions( + ResourceType.ID("modern_miniplayer_expand"), + allOf(Opcode.CHECK_CAST(), type("Landroid/widget/ImageView;")), + ) } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernOverlayViewFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMiniplayerModernExpandCloseDrawablesMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters() - literal { scrimOverlay } + returnType("V") + parameterTypes("L") + instructions( + ytOutlinePictureInPictureWhite24(), + ) } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernRewindButtonFingerprint = fingerprint { +internal val ClassDef.miniplayerModernForwardButtonMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { modernMiniplayerRewindButton } + returnType("L") + parameterTypes() + instructions( + ResourceType.ID("modern_miniplayer_forward_button"), + afterAtMost(5, Opcode.MOVE_RESULT_OBJECT()), + ) } -internal val miniplayerModernViewParentFingerprint = fingerprint { +internal val ClassDef.miniplayerModernOverlayViewMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters() - strings("player_overlay_modern_mini_player_controls") + parameterTypes() + instructions( + ResourceType.ID("scrim_overlay"), + afterAtMost(5, Opcode.MOVE_RESULT_OBJECT()), + ) } -internal val miniplayerModernActionButtonFingerprint = fingerprint { +/** + * Matches using the class found in [miniplayerModernViewParentMethod]. + */ +internal val ClassDef.miniplayerModernRewindButtonMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { modernMiniPlayerOverlayActionButton } + returnType("L") + parameterTypes() + instructions( + ResourceType.ID("modern_miniplayer_rewind_button"), + afterAtMost(5, Opcode.MOVE_RESULT_OBJECT()), + ) } -internal val miniplayerMinimumSizeFingerprint = fingerprint { +/** + * Matches using the class found in [miniplayerModernViewParentMethod]. + */ +internal val ClassDef.miniplayerModernActionButtonMethodMatch by ClassDefComposing.composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes() + instructions( + ResourceType.ID("modern_miniplayer_overlay_action_button"), + afterAtMost(5, Opcode.MOVE_RESULT_OBJECT()), + ) +} + +internal val BytecodePatchContext.miniplayerMinimumSizeMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(192) && - method.containsLiteralInstruction(128) && - method.containsLiteralInstruction(miniplayerMaxSize) - } + instructions( + ResourceType.DIMEN("miniplayer_max_size"), + 192L(), // Default miniplayer width constant. + 128L(), // Default miniplayer height constant. + ) } -internal val miniplayerOverrideFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerOverrideMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - strings("appName") + returnType("L") + instructions( + "appName"(), + afterAtMost( + 10, + method { parameterTypes.count() == 1 && parameterTypes.first() == "Landroid/content/Context;" && returnType == "Z" }, + ), + ) } -internal val miniplayerOverrideNoContextFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMiniplayerOverrideNoContextMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("Z") - opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. + returnType("Z") + opcodes( + Opcode.IGET_BOOLEAN, // Anchor to insert the instruction. + ) } -internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { +/** + * 20.36 and lower. Codes appears to be removed in 20.37+ + */ +internal val BytecodePatchContext.miniplayerResponseModelSizeCheckMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("Ljava/lang/Object;", "Ljava/lang/Object;") + returnType("L") + parameterTypes("Ljava/lang/Object;", "Ljava/lang/Object;") opcodes( Opcode.RETURN_OBJECT, Opcode.CHECK_CAST, @@ -155,11 +191,26 @@ internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { ) } +internal val BytecodePatchContext.miniplayerOnCloseHandlerMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + instructions( + MINIPLAYER_DISABLED_FEATURE_KEY(), + ) +} + internal const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" -internal val playerOverlaysLayoutFingerprint = fingerprint { - custom { method, _ -> - method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME - } +internal val BytecodePatchContext.playerOverlaysLayoutMethod by gettingFirstImmutableMethodDeclaratively { + definingClass(YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME) +} + +internal val BytecodePatchContext.miniplayerSetIconsMethod by gettingFirstMethodDeclaratively { + returnType("V") + parameterTypes("I", "Ljava/lang/Runnable;") + instructions( + ResourceType.DRAWABLE("yt_fill_pause_white_36"), + ResourceType.DRAWABLE("yt_fill_pause_black_36"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 2758210a5b..a2effc6a04 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -2,20 +2,20 @@ package app.revanced.patches.youtube.layout.miniplayer -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.* @@ -25,40 +25,20 @@ import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation +import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -internal var floatyBarButtonTopMargin = -1L - private set - // Only available in 19.15 and upwards. internal var ytOutlineXWhite24 = -1L private set internal var ytOutlinePictureInPictureWhite24 = -1L private set -internal var scrimOverlay = -1L - private set -internal var modernMiniplayerClose = -1L - private set -internal var modernMiniplayerExpand = -1L - private set -internal var modernMiniplayerRewindButton = -1L - private set -internal var modernMiniplayerForwardButton = -1L - private set -internal var modernMiniPlayerOverlayActionButton = -1L - private set -internal var playerOverlays = -1L - private set -internal var miniplayerMaxSize = -1L - private set private val miniplayerResourcePatch = resourcePatch { dependsOn( @@ -66,73 +46,15 @@ private val miniplayerResourcePatch = resourcePatch { versionCheckPatch, ) - execute { - floatyBarButtonTopMargin = resourceMappings[ - "dimen", - "floaty_bar_button_top_margin", - ] - - scrimOverlay = resourceMappings[ - "id", - "scrim_overlay", - ] - - playerOverlays = resourceMappings[ - "layout", - "player_overlays", - ] - - - modernMiniplayerClose = resourceMappings[ - "id", - "modern_miniplayer_close", - ] - - modernMiniplayerExpand = resourceMappings[ - "id", - "modern_miniplayer_expand", - ] - - modernMiniplayerRewindButton = resourceMappings[ - "id", - "modern_miniplayer_rewind_button", - ] - - modernMiniplayerForwardButton = resourceMappings[ - "id", - "modern_miniplayer_forward_button", - ] - - modernMiniPlayerOverlayActionButton = resourceMappings[ - "id", - "modern_miniplayer_overlay_action_button" - ] - + apply { // Resource id is not used during patching, but is used by extension. // Verify the resource is present while patching. - resourceMappings[ - "id", - "modern_miniplayer_subtitle_text", - ] + ResourceType.ID["modern_miniplayer_subtitle_text"] // Only required for exactly 19.16 if (!is_19_17_or_greater) { - ytOutlinePictureInPictureWhite24 = resourceMappings[ - "drawable", - "yt_outline_picture_in_picture_white_24", - ] - - ytOutlineXWhite24 = resourceMappings[ - "drawable", - "yt_outline_x_white_24", - ] - } - - if (is_19_26_or_greater) { - miniplayerMaxSize = resourceMappings[ - "dimen", - "miniplayer_max_size", - ] + ytOutlinePictureInPictureWhite24 = ResourceType.DRAWABLE["yt_outline_picture_in_picture_white_24"] + ytOutlineXWhite24 = ResourceType.DRAWABLE["yt_outline_x_white_24"] } } } @@ -142,7 +64,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/ @Suppress("unused") val miniplayerPatch = bytecodePatch( name = "Miniplayer", - description = "Adds options to change the in-app minimized player." + description = "Adds options to change the in-app minimized player.", ) { dependsOn( sharedExtensionPatch, @@ -153,32 +75,38 @@ val miniplayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.miniplayer.miniplayerPatch") val preferences = mutableSetOf() preferences += - if (is_20_03_or_greater) { + if (is_20_37_or_greater) { ListPreference("revanced_miniplayer_type") + } else if (is_20_03_or_greater) { + ListPreference( + key = "revanced_miniplayer_type", + entriesKey = "revanced_miniplayer_type_legacy_20_03_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_20_03_entry_values", + ) } else if (is_19_43_or_greater) { ListPreference( key = "revanced_miniplayer_type", entriesKey = "revanced_miniplayer_type_legacy_19_43_entries", - entryValuesKey = "revanced_miniplayer_type_legacy_19_43_entry_values" + entryValuesKey = "revanced_miniplayer_type_legacy_19_43_entry_values", ) } else { ListPreference( key = "revanced_miniplayer_type", entriesKey = "revanced_miniplayer_type_legacy_19_16_entries", - entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values" + entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values", ) } @@ -235,7 +163,7 @@ val miniplayerPatch = bytecodePatch( """ invoke-static {v$register}, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Z)Z move-result v$register - """ + """, ) } @@ -255,31 +183,29 @@ val miniplayerPatch = bytecodePatch( insertMiniplayerBooleanOverride(index, "getModernMiniplayerOverride") } - fun Fingerprint.insertMiniplayerFeatureFlagBooleanOverride( + fun MutableMethod.insertMiniplayerFeatureFlagBooleanOverride( literal: Long, extensionMethod: String, - ) = method.insertLiteralOverride( + ) = insertLiteralOverride( literal, - "$EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(Z)Z" + "$EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(Z)Z", ) - fun Fingerprint.insertMiniplayerFeatureFlagFloatOverride( + fun MutableMethod.insertMiniplayerFeatureFlagFloatOverride( literal: Long, extensionMethod: String, - ) { - method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) - val targetIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.DOUBLE_TO_FLOAT) - val register = getInstruction(targetIndex).registerA + ) = apply { + val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + val targetIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.DOUBLE_TO_FLOAT) + val register = getInstruction(targetIndex).registerA - addInstructions( - targetIndex + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(F)F - move-result v$register - """, - ) - } + addInstructions( + targetIndex + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(F)F + move-result v$register + """, + ) } /** @@ -297,54 +223,40 @@ val miniplayerPatch = bytecodePatch( ) } - fun MutableMethod.hookInflatedView( - literalValue: Long, - hookedClassType: String, - extensionMethodName: String, - ) { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstLiteralInstructionOrThrow(literalValue), - ) { - opcode == Opcode.CHECK_CAST && getReference()?.type == hookedClassType - } - - val register = getInstruction(imageViewIndex).registerA - addInstruction( - imageViewIndex + 1, - "invoke-static { v$register }, $extensionMethodName", - ) - } - // region Enable tablet miniplayer. + // Parts of the YT code is removed in 20.37+ and the legacy player no longer works. - miniplayerOverrideNoContextFingerprint.match( - miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, - ).method.apply { - findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } - } - - // endregion - - // region Legacy tablet miniplayer hooks. - val appNameStringIndex = miniplayerOverrideFingerprint.let { - it.method.indexOfFirstInstructionOrThrow(it.stringMatches!!.first().index) { - val reference = getReference() - reference?.parameterTypes?.firstOrNull() == "Landroid/content/Context;" + if (!is_20_37_or_greater) { + miniplayerDimensionsCalculatorParentMethod.immutableClassDef.getMiniplayerOverrideNoContextMethod().apply { + findReturnIndicesReversed().forEach { index -> + insertLegacyTabletMiniplayerOverride(index) + } } - } - navigate(miniplayerOverrideFingerprint.originalMethod).to(appNameStringIndex).stop().apply { - findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } - } - miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch!!.endIndex) + // endregion + + // region Legacy tablet miniplayer hooks. + miniplayerOverrideMethodMatch.let { + val appNameStringIndex = it[-1] + navigate(it.immutableMethod).to(appNameStringIndex).stop().apply { + findReturnIndicesReversed().forEach { index -> + insertLegacyTabletMiniplayerOverride( + index, + ) + } + } + } + + miniplayerResponseModelSizeCheckMethodMatch.let { + it.method.insertLegacyTabletMiniplayerOverride(it[-1]) + } } // endregion // region Enable modern miniplayer. - miniplayerModernConstructorFingerprint.classDef.methods.forEach { + miniplayerModernConstructorMethod.classDef.methods.forEach { it.apply { if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { val iPutIndex = indexOfFirstInstructionOrThrow { @@ -359,36 +271,35 @@ val miniplayerPatch = bytecodePatch( } if (is_19_23_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DRAG_DROP_FEATURE_KEY, "getMiniplayerDragAndDrop", ) } if (is_19_25_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_MODERN_FEATURE_LEGACY_KEY, "getModernMiniplayerOverride", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_MODERN_FEATURE_KEY, "getModernFeatureFlagsActiveOverride", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, "getMiniplayerDoubleTapAction", ) } if (is_19_26_or_greater) { - miniplayerModernConstructorFingerprint.method.apply { + miniplayerModernConstructorMethod.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow( MINIPLAYER_INITIAL_SIZE_FEATURE_KEY, ) val targetIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.LONG_TO_INT) - val register = getInstruction(targetIndex).registerA addInstructions( @@ -401,36 +312,41 @@ val miniplayerPatch = bytecodePatch( } // Override a minimum size constant. - miniplayerMinimumSizeFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.CONST_16 && (this as NarrowLiteralInstruction).narrowLiteral == 192 - } - val register = getInstruction(index).registerA + miniplayerMinimumSizeMethodMatch.let { + it.method.apply { + val index = it[1] + val register = getInstruction(index).registerA - // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. - // The 170 initial limit probably could be patched to allow even smaller initial sizes, - // but 170 is already half the horizontal space and smaller does not seem useful. - replaceInstruction(index, "const/16 v$register, 170") + // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. + // The 170 initial limit probably could be patched to allow even smaller initial sizes, + // but 170 is already half the horizontal space and smaller does not seem useful. + replaceInstruction(index, "const/16 v$register, 170") + } } } if (is_19_36_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, "getRoundedCorners", ) } if (is_19_43_or_greater) { - miniplayerOnCloseHandlerFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerOnCloseHandlerMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DISABLED_FEATURE_KEY, - "getMiniplayerOnCloseHandler" + "getMiniplayerOnCloseHandler", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, "getHorizontalDrag", ) + + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( + MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY, + "getMaximizeAnimation", + ) } // endregion @@ -438,10 +354,8 @@ val miniplayerPatch = bytecodePatch( // region Fix 19.16 using mixed up drawables for tablet modern. // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. - if (ytOutlinePictureInPictureWhite24 >= 0) { - miniplayerModernExpandCloseDrawablesFingerprint.match( - miniplayerModernViewParentFingerprint.originalClassDef, - ).method.apply { + if (!is_19_17_or_greater) { + miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernExpandCloseDrawablesMethod().apply { listOf( ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, @@ -456,65 +370,54 @@ val miniplayerPatch = bytecodePatch( // endregion + // region fix minimal miniplayer using the wrong pause/play bold icons. + + if (is_20_31_or_greater) { + miniplayerSetIconsMethod.apply { + findInstructionIndicesReversedOrThrow { + val reference = getReference() + opcode == Opcode.INVOKE_INTERFACE && + reference?.returnType == "Z" && reference.parameterTypes.isEmpty() + }.forEach { index -> + val register = getInstruction(index + 1).registerA + + addInstructions( + index + 2, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->allowBoldIcons(Z)Z + move-result v$register + """, + ) + } + } + } + + // endregion + // region Add hooks to hide modern miniplayer buttons. listOf( - Triple( - miniplayerModernExpandButtonFingerprint, - modernMiniplayerExpand, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernCloseButtonFingerprint, - modernMiniplayerClose, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernActionButtonFingerprint, - modernMiniPlayerOverlayActionButton, - "hideMiniplayerActionButton" - ), - Triple( - miniplayerModernRewindButtonFingerprint, - modernMiniplayerRewindButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernForwardButtonFingerprint, - modernMiniplayerForwardButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernOverlayViewFingerprint, - scrimOverlay, - "adjustMiniplayerOpacity", - ), - ).forEach { (fingerprint, literalValue, methodName) -> - fingerprint.match( - miniplayerModernViewParentFingerprint.originalClassDef - ).method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(literalValue) - val checkCastIndex = indexOfFirstInstruction(literalIndex) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == "Landroid/widget/ImageView;" - } - val viewIndex = if (checkCastIndex >= 0) { - checkCastIndex - } else { - indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT) - } - val viewRegister = getInstruction(viewIndex).registerA + ClassDef::miniplayerModernExpandButtonMethodMatch to "hideMiniplayerExpandClose", + ClassDef::miniplayerModernCloseButtonMethodMatch to "hideMiniplayerExpandClose", + ClassDef::miniplayerModernActionButtonMethodMatch to "hideMiniplayerActionButton", + ClassDef::miniplayerModernRewindButtonMethodMatch to "hideMiniplayerRewindForward", + ClassDef::miniplayerModernForwardButtonMethodMatch to "hideMiniplayerRewindForward", + ClassDef::miniplayerModernOverlayViewMethodMatch to "adjustMiniplayerOpacity", + ).forEach { (matching, methodName) -> + val match = matching.get(miniplayerModernViewParentMethod.immutableClassDef) + + match.method.apply { + val index = match[-1] + val register = getInstruction(index).registerA addInstruction( - viewIndex + 1, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", ) } } - miniplayerModernAddViewListenerFingerprint.match( - miniplayerModernViewParentFingerprint.classDef, - ).method.addInstruction( + miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernAddViewListenerMethod().addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + "hideMiniplayerSubTexts(Landroid/view/View;)V", @@ -529,7 +432,7 @@ val miniplayerPatch = bytecodePatch( // NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller. // This patch code could be used to hide other player overlays that do not use Litho. if (!is_19_17_or_greater) { - playerOverlaysLayoutFingerprint.classDef.methods.add( + playerOverlaysLayoutMethod.classDef.methods.add( ImmutableMethod( YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, "addView", @@ -539,7 +442,7 @@ val miniplayerPatch = bytecodePatch( ImmutableMethodParameter( "Landroid/view/ViewGroup\$LayoutParams;", null, - null + null, ), ), "V", @@ -550,12 +453,12 @@ val miniplayerPatch = bytecodePatch( ).toMutable().apply { addInstructions( """ - invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V - invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V - return-void - """ + invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V + invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V + return-void + """, ) - } + }, ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt index 0c31cc83bd..28c218d9d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt @@ -1,13 +1,12 @@ package app.revanced.patches.youtube.layout.panels.popup -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val engagementPanelControllerFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("L") - strings( - "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", - "[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called.", - ) +internal val BytecodePatchContext.engagementPanelControllerMethod by gettingFirstMethodDeclaratively( + "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", + "[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called.", +) { + returnType("L") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index 518b3b04c9..6e952f4461 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.layout.panels.popup -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,7 +9,10 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -val playerPopupPanelsPatch = bytecodePatch( +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;" + +@Suppress("unused") +val disablePlayerPopupPanelsPatch = bytecodePatch( name = "Disable player popup panels", description = "Adds an option to disable panels (such as live chat) from opening automatically.", ) { @@ -21,24 +24,24 @@ val playerPopupPanelsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.panels.popup.playerPopupPanelsPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_hide_player_popup_panels"), ) - engagementPanelControllerFingerprint.method.addInstructionsWithLabels( + engagementPanelControllerMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;->disablePlayerPopupPanels()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disablePlayerPopupPanels()Z move-result v0 if-eqz v0, :player_popup_panels if-eqz p4, :player_popup_panels diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt deleted file mode 100644 index 5c20556a85..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.youtube.layout.player.background - -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patches.youtube.layout.buttons.overlay.hidePlayerOverlayButtonsPatch - -@Suppress("unused") -@Deprecated("Functionality added to hidePlayerOverlayButtonsPatch", ReplaceWith("hidePlayerOverlayButtonsPatch")) -val playerControlsBackgroundPatch = resourcePatch( - description = "Removes the dark background surrounding the video player control buttons.", -) { - dependsOn(hidePlayerOverlayButtonsPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 42babd5ce5..9f04df3c06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -9,23 +9,24 @@ import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.loopVideoFingerprint -import app.revanced.patches.youtube.shared.loopVideoParentFingerprint +import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import com.android.tools.smali.dexlib2.Opcode @Suppress("unused") -internal val exitFullscreenPatch = bytecodePatch( - name = "Exit fullscreen mode", - description = "Adds options to automatically exit fullscreen mode when a video reaches the end." +val exitFullscreenPatch = bytecodePatch( + name = "Exit fullscreen", + description = "Adds options to automatically exit fullscreen mode when a video reaches the end.", ) { - compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) dependsOn( @@ -33,7 +34,8 @@ internal val exitFullscreenPatch = bytecodePatch( settingsPatch, addResourcesPatch, playerTypeHookPatch, - playerControlsPatch + playerControlsPatch, + videoInformationPatch, ) // Cannot declare as top level since this patch is in the same package as @@ -42,16 +44,18 @@ internal val exitFullscreenPatch = bytecodePatch( val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ExitFullscreenPatch;" - execute { + apply { addResources("youtube", "layout.player.fullscreen.exitFullscreenPatch") PreferenceScreen.PLAYER.addPreferences( - ListPreference("revanced_exit_fullscreen") + ListPreference("revanced_exit_fullscreen"), ) - loopVideoFingerprint.match(loopVideoParentFingerprint.originalClassDef).method.apply { + videoEndMethod.apply { + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN_VOID) + addInstructionsAtControlFlowLabel( - implementation!!.instructions.lastIndex, + insertIndex, "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index a8aef37341..d6370b2aa7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -1,25 +1,50 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal const val OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG = 45666112L +/** + * 19.46+ + */ +internal val BytecodePatchContext.openVideosFullscreenPortraitMethodMatch by composingFirstMethod { + returnType("V") + parameterTypes("L", "Lj\$/util/Optional;") + instructions( + Opcode.MOVE_RESULT(), // Conditional check to modify. + // Open videos fullscreen portrait feature flag. + afterAtMost(5, 45666112L()), // Cannot be more than 5. + afterAtMost(10, Opcode.MOVE_RESULT()), + ) +} -internal val openVideosFullscreenPortraitFingerprint = fingerprint { +/** + * Pre 19.46. + */ +internal val BytecodePatchContext.openVideosFullscreenPortraitLegacyMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "Lj\$/util/Optional;") - literal { - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG - } + returnType("V") + parameterTypes("L", "Lj\$/util/Optional;") + opcodes( + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_EQ, + Opcode.IF_EQ, + Opcode.IGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, // Conditional check to modify. + ) } -internal val openVideosFullscreenHookPatchExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.openVideosFullscreenHookPatchExtensionMethod by gettingFirstMethodDeclaratively { + name("isFullScreenPatchIncluded") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Z") - parameters() - custom { methodDef, classDef -> - methodDef.name == "isFullScreenPatchIncluded" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Z") + parameterTypes() } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt deleted file mode 100644 index 89311b08c0..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.player.fullscreen - -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -@Deprecated("Renamed to openVideosFullscreenPatch", ReplaceWith("openVideosFullscreenPatch")) -val openVideosFullscreen = bytecodePatch{ - dependsOn(openVideosFullscreenPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 76086c0e48..5f53f6cb7a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -1,11 +1,15 @@ package app.revanced.patches.youtube.layout.player.fullscreen +import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.layout.shortsplayer.openShortsInRegularPlayerPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.util.insertLiteralOverride +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch;" @@ -13,20 +17,46 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = /** * Used by both [openVideosFullscreenPatch] and [openShortsInRegularPlayerPatch]. */ + internal val openVideosFullscreenHookPatch = bytecodePatch { dependsOn( sharedExtensionPatch, - versionCheckPatch + versionCheckPatch, ) - execute { - if (!is_19_46_or_greater) { - return@execute + apply { + var match: CompositeMatch + var insertIndex: Int + + if (is_19_46_or_greater) { + match = openVideosFullscreenPortraitMethodMatch + insertIndex = match[0] + + openVideosFullscreenPortraitMethodMatch.let { + // Remove A/B feature call that forces what this patch already does. + // Cannot use the A/B flag to accomplish the same goal because 19.50+ + // Shorts fullscreen regular player does not use fullscreen + // if the player is minimized and it must be forced using other conditional check. + it.method.insertLiteralOverride( + it[-1], + false, + ) + } + } else { + match = openVideosFullscreenPortraitLegacyMethodMatch + insertIndex = match[-1] } - openVideosFullscreenPortraitFingerprint.method.insertLiteralOverride( - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" - ) + match.method.apply { + val register = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->doNotOpenVideoFullscreenPortrait(Z)Z + move-result v$register + """, + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt index a0b513f3e1..c1a70e42d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt @@ -1,12 +1,9 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.returnEarly @@ -20,29 +17,27 @@ val openVideosFullscreenPatch = bytecodePatch( openVideosFullscreenHookPatch, settingsPatch, addResourcesPatch, - versionCheckPatch ) compatibleWith( "com.google.android.youtube"( - "20.07.39", - "20.13.41", + "19.43.41", + "19.43.41", + "19.47.53", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - if (!is_19_46_or_greater) { - throw PatchException("'Open videos fullscreen' requires 19.46.42 or greater") - } - + apply { addResources("youtube", "layout.player.fullscreen.openVideosFullscreen") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_open_videos_fullscreen_portrait") + SwitchPreference("revanced_open_videos_fullscreen_portrait"), ) // Enable the logic for the user Setting to open regular videos fullscreen. - openVideosFullscreenHookPatchExtensionFingerprint.method.returnEarly(true) + openVideosFullscreenHookPatchExtensionMethod.returnEarly(true) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index c6229e259f..4bb4c275d0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -1,45 +1,17 @@ package app.revanced.patches.youtube.layout.player.overlay -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -internal var scrimOverlayId = -1L - private set - -private val customPlayerOverlayOpacityResourcePatch = resourcePatch { - dependsOn( - settingsPatch, - resourceMappingPatch, - addResourcesPatch, - ) - - execute { - addResources("youtube", "layout.player.overlay.customPlayerOverlayOpacityResourcePatch") - - PreferenceScreen.PLAYER.addPreferences( - TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), - ) - - scrimOverlayId = resourceMappings[ - "id", - "scrim_overlay", - ] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/CustomPlayerOverlayOpacityPatch;" @@ -48,30 +20,39 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( name = "Custom player overlay opacity", description = "Adds an option to change the opacity of the video player background when player controls are visible.", ) { - dependsOn(customPlayerOverlayOpacityResourcePatch) + dependsOn( + settingsPatch, + resourceMappingPatch, + addResourcesPatch, + ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { - createPlayerOverviewFingerprint.method.apply { - val viewRegisterIndex = - indexOfFirstLiteralInstructionOrThrow(scrimOverlayId) + 3 - val viewRegister = - getInstruction(viewRegisterIndex).registerA + apply { + addResources("youtube", "layout.player.overlay.customPlayerOverlayOpacityResourcePatch") - val insertIndex = viewRegisterIndex + 1 - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", - ) + PreferenceScreen.PLAYER.addPreferences( + TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), + ) + + createPlayerOverviewMethodMatch.let { + it.method.apply { + val viewRegisterIndex = it[-1] + val viewRegister = getInstruction(viewRegisterIndex).registerA + + addInstruction( + viewRegisterIndex + 1, + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt index 7269868402..7756cda084 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt @@ -1,18 +1,14 @@ package app.revanced.patches.youtube.layout.player.overlay -import app.revanced.patcher.fingerprint -import app.revanced.util.literal -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.Opcode -internal val createPlayerOverviewFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - opcodes( - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, +internal val BytecodePatchContext.createPlayerOverviewMethodMatch by composingFirstMethod { + returnType("V") + instructions( + ResourceType.ID("scrim_overlay"), + afterAtMost(10, allOf(Opcode.CHECK_CAST(), type("Landroid/widget/ImageView;"))), ) - literal { scrimOverlayId } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 54fda75c85..7588c8d899 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -1,31 +1,33 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val dislikeFingerprint = fingerprint { - returns("V") - strings("like/dislike") +internal val BytecodePatchContext.dislikeMethod by gettingFirstMethodDeclaratively { + returnType("V") + instructions("like/dislike"()) } -internal val likeFingerprint = fingerprint { - returns("V") - strings("like/like") +internal val BytecodePatchContext.likeMethod by gettingFirstMethodDeclaratively { + returnType("V") + instructions("like/like"()) } -internal val removeLikeFingerprint = fingerprint { - returns("V") - strings("like/removelike") +internal val BytecodePatchContext.removeLikeMethod by gettingFirstMethodDeclaratively { + returnType("V") + instructions("like/removelike"()) } -internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberMeasureAnimatedTextMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lj\$/util/Optional;") - parameters("L", "Ljava/lang/String;", "L") + returnType("Lj\$/util/Optional;") + parameterTypes("L", "Ljava/lang/String;", "L") opcodes( - Opcode.IGET, // First instruction of method + Opcode.IGET, // First instruction of method. Opcode.IGET_OBJECT, Opcode.IGET_OBJECT, Opcode.CONST_HIGH16, @@ -34,17 +36,17 @@ internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { Opcode.CONST_4, Opcode.AGET, Opcode.CONST_4, - Opcode.CONST_4, // Measured text width + Opcode.CONST_4, // Measured text width. ) } /** - * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. + * Matches to class found in [rollingNumberMeasureStaticLabelParentMethod]. */ -internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { +internal val ClassDef.rollingNumberMeasureStaticLabelMethodMatch by ClassDefComposing.composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("F") - parameters("Ljava/lang/String;") + returnType("F") + parameterTypes("Ljava/lang/String;") opcodes( Opcode.IGET_OBJECT, Opcode.INVOKE_VIRTUAL, @@ -53,69 +55,73 @@ internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { ) } -internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberMeasureStaticLabelParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters() - strings("RollingNumberFontProperties{paint=") + returnType("Ljava/lang/String;") + parameterTypes() + instructions( + "RollingNumberFontProperties{paint="(), + ) } -internal val rollingNumberSetterFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberSetterMethodMatch by composingFirstMethod { opcodes( Opcode.INVOKE_DIRECT, Opcode.IGET_OBJECT, ) - // Partial string match. - strings("RollingNumberType required properties missing! Need") + + val match = indexedMatcher("RollingNumberType required properties missing! Need"(String::contains)) + custom { match(instructions) } } -internal val rollingNumberTextViewFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberTextViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "F", "F") - opcodes( - Opcode.IPUT, - null, // invoke-direct or invoke-virtual - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + returnType("V") + parameterTypes("L", "F", "F") + instructions( + Opcode.IPUT(), + after(anyOf(Opcode.INVOKE_DIRECT(), Opcode.INVOKE_VIRTUAL())), + after(Opcode.IPUT_OBJECT()), + after(Opcode.IGET_OBJECT()), + after(Opcode.INVOKE_VIRTUAL()), + after(Opcode.RETURN_VOID()), ) - custom { _, classDef -> - classDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || classDef.superclass == - "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" + custom { + immutableClassDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || immutableClassDef.superclass == + "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" } } -internal val textComponentConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentConstructorMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) - strings("TextComponent") + instructions( + "TextComponent"(), + ) } -internal val textComponentDataFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentDataMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L", "L") - strings("text") - custom { _, classDef -> - classDef.fields.find { it.type == "Ljava/util/BitSet;" } != null - } + parameterTypes("L", "L") + instructions( + "text"(), + ) + custom { immutableClassDef.anyField { type == "Ljava/util/BitSet;" } } } /** - * Matches against the same class found in [textComponentConstructorFingerprint]. + * Matches against the same class found in [textComponentConstructorMethod]. */ -internal val textComponentLookupFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getTextComponentLookupMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returns("L") - parameters("L") - strings("…") + returnType("L") + parameterTypes("L") + instructions("…"()) } -internal const val LITHO_NEW_TEXT_COMPONENT_FEATURE_FLAG = 45675738L - -internal val textComponentFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.FINAL) - returns("Z") - parameters() - literal { LITHO_NEW_TEXT_COMPONENT_FEATURE_FLAG } + returnType("Z") + parameterTypes() + instructions(45675738L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 50db7c281e..bb81a31c0c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -1,7 +1,11 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.extensions.typeReference +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources @@ -10,24 +14,20 @@ import app.revanced.patches.shared.misc.settings.preference.NonInteractivePrefer import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.misc.playservice.* import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.conversionContextFingerprintToString -import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateFingerprint +import app.revanced.patches.youtube.shared.conversionContextToStringMethod +import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateMethodMatch import app.revanced.patches.youtube.video.videoid.hookPlayerResponseVideoId import app.revanced.patches.youtube.video.videoid.hookVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.Opcode @@ -35,16 +35,15 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch;" private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter;" + "Lapp/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter;" +@Suppress("ObjectPropertyName") val returnYouTubeDislikePatch = bytecodePatch( name = "Return YouTube Dislike", description = "Adds an option to show the dislike count of videos with Return YouTube Dislike.", @@ -61,14 +60,15 @@ val returnYouTubeDislikePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + // 20.40+ does not support yet support the Shorts player. + ), ) - execute { + apply { addResources("youtube", "layout.returnyoutubedislike.returnYouTubeDislikePatch") PreferenceScreen.RETURN_YOUTUBE_DISLIKE.addPreferences( @@ -87,8 +87,8 @@ val returnYouTubeDislikePatch = bytecodePatch( key = "revanced_ryd_statistics_category", sorting = PreferenceScreenPreference.Sorting.UNSORTED, preferences = emptySet(), // Preferences are added by custom class at runtime. - tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeDebugStatsPreferenceCategory" - ) + tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeDebugStatsPreferenceCategory", + ), ) // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. @@ -102,12 +102,12 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook like/dislike/remove like button clicks to send votes to the API. - mapOf( - likeFingerprint to Vote.LIKE, - dislikeFingerprint to Vote.DISLIKE, - removeLikeFingerprint to Vote.REMOVE_LIKE, - ).forEach { (fingerprint, vote) -> - fingerprint.method.addInstructions( + arrayOf( + likeMethod to Vote.LIKE, + dislikeMethod to Vote.DISLIKE, + removeLikeMethod to Vote.REMOVE_LIKE, + ).forEach { (method, vote) -> + method.addInstructions( 0, """ const/4 v0, ${vote.value} @@ -120,64 +120,65 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook code for creation and cached lookup of text Spans. - // Alternatively the hook can be made at tht it fails to update the Span when the user dislikes, - // // since the underlying (likes only) tee creation of Spans in TextComponentSpec, - // And it works in all situations excepxt did not change. + // Alternatively the hook can be made in the creation of Spans in TextComponentSpec. + // And it works in all situations except if the likes do not such as disliking. // This hook handles all situations, as it's where the created Spans are stored and later reused. + // Find the field name of the conversion context. - val conversionContextField = textComponentConstructorFingerprint.originalClassDef.fields.find { - it.type == conversionContextFingerprintToString.originalClassDef.type + val conversionContextClass = conversionContextToStringMethod.immutableClassDef + val textComponentConversionContextField = textComponentConstructorMethod.immutableClassDef.fields.find { + it.type == conversionContextClass.type || + // 20.41+ uses superclass field type. + it.type == conversionContextClass.superclass } ?: throw PatchException("Could not find conversion context field") - textComponentLookupFingerprint.match(textComponentConstructorFingerprint.originalClassDef) - .method.apply { + textComponentConstructorMethod.immutableClassDef.getTextComponentLookupMethod().apply { // Find the instruction for creating the text data object. - val textDataClassType = textComponentDataFingerprint.originalClassDef.type + val textDataClassType = textComponentDataMethod.immutableClassDef.type val insertIndex: Int - val tempRegister: Int val charSequenceRegister: Int - if (is_19_33_or_greater && !is_20_10_or_greater) { - insertIndex = indexOfFirstInstructionOrThrow { - (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) - && getReference()?.returnType == textDataClassType + if (is_19_33_or_greater && !is_20_10_or_greater) { + val index = indexOfFirstInstructionOrThrow { + (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) && + methodReference?.returnType == textDataClassType } - tempRegister = getInstruction(insertIndex + 1).registerA + insertIndex = indexOfFirstInstructionOrThrow(index) { + opcode == Opcode.INVOKE_VIRTUAL && + methodReference?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" + } - // Find the instruction that sets the span to an instance field. - // The instruction is only a few lines after the creation of the instance. - charSequenceRegister = getInstruction( - indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" - }, - ).registerD + charSequenceRegister = getInstruction(insertIndex).registerD } else { insertIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.NEW_INSTANCE && - getReference()?.type == textDataClassType + typeReference?.type == textDataClassType } - tempRegister = getInstruction(insertIndex).registerA - - charSequenceRegister = getInstruction( - indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.IPUT_OBJECT && - getReference()?.type == "Ljava/lang/CharSequence;" - }, - ).registerA + val charSequenceIndex = indexOfFirstInstructionOrThrow(insertIndex) { + opcode == Opcode.IPUT_OBJECT && + fieldReference?.type == "Ljava/lang/CharSequence;" + } + charSequenceRegister = getInstruction(charSequenceIndex).registerA } + val conversionContext = findFreeRegister(insertIndex, charSequenceRegister) + addInstructionsAtControlFlowLabel( insertIndex, """ - # Copy conversion context - move-object/from16 v$tempRegister, p0 - iget-object v$tempRegister, v$tempRegister, $conversionContextField - invoke-static { v$tempRegister, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + # Copy conversion context. + move-object/from16 v$conversionContext, p0 + + iget-object v$conversionContext, v$conversionContext, $textComponentConversionContextField + + invoke-static { v$conversionContext, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$charSequenceRegister + + :ignore + nop """ ) } @@ -194,7 +195,22 @@ val returnYouTubeDislikePatch = bytecodePatch( // If enabled then the litho text span hook is never called. // Target code is very obfuscated and exactly what the code does is not clear. // Return late so debug patch logs if the flag is enabled. - textComponentFeatureFlagFingerprint.method.returnLate(false) + if (is_20_41_or_greater) { + // TODO: Support the new non litho Shorts layout. + // Turning off this flag on later versions can break the Shorts overlay and nothing is shown. + Logger.getLogger(this::class.java.name).warning( + "\n!!!" + + "\n!!! Dislikes are not yet fully supported when patching YouTube 20.40+" + + "\n!!! Patch 20.21.37 or lower if you want to see dislikes" + + "\n!!!", + ) + + Logger.getLogger(this::class.java.name).warning( + "20.40+ Shorts player is not fully supported yet. Shorts Dislikes may not show.", + ) + } else { + textComponentFeatureFlagMethod.returnLate(false) + } } // Player response video id is needed to search for the video ids in Shorts litho components. @@ -204,15 +220,11 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook rolling numbers. - val dislikesIndex = rollingNumberSetterFingerprint.patternMatch!!.endIndex - - rollingNumberSetterFingerprint.method.apply { + rollingNumberSetterMethodMatch.method.apply { val insertIndex = 1 - - val charSequenceInstanceRegister = - getInstruction(0).registerA - val charSequenceFieldReference = - getInstruction(dislikesIndex).reference + val dislikesIndex = rollingNumberSetterMethodMatch[-1] + val charSequenceInstanceRegister = getInstruction(0).registerA + val charSequenceFieldReference = getInstruction(dislikesIndex).reference val conversionContextRegister = implementation!!.registerCount - parameters.size + 1 @@ -229,13 +241,12 @@ val returnYouTubeDislikePatch = bytecodePatch( ) } - rollingNumberMeasureAnimatedTextFingerprint.let { - // Rolling Number text views use the measured width of the raw string for layout. - // Modify the measure text calculation to include the left drawable separator if needed. - val patternMatch = it.patternMatch!! - // Verify the opcodes are at the start of the method. - if (patternMatch.startIndex != 0) throw PatchException("Unexpected opcode location") - val endIndex = patternMatch.endIndex + // Rolling Number text views use the measured width of the raw string for layout. + // Modify the measure text calculation to include the left drawable separator if needed. + rollingNumberMeasureAnimatedTextMethodMatch.let { + // Additional check to verify the opcodes are at the start of the method + if (it[0] != 0) throw PatchException("Unexpected opcode location") + val endIndex = it[-1] it.method.apply { val measuredTextWidthRegister = getInstruction(endIndex).registerA @@ -245,17 +256,15 @@ val returnYouTubeDislikePatch = bytecodePatch( """ invoke-static {p1, v$measuredTextWidthRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F move-result v$measuredTextWidthRegister - """ + """, ) } } // Additional text measurement method. Used if YouTube decides not to animate the likes count // and sometimes used for initial video load. - rollingNumberMeasureStaticLabelFingerprint.match( - rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, - ).let { - val measureTextIndex = it.patternMatch!!.startIndex + 1 + rollingNumberMeasureStaticLabelParentMethod.immutableClassDef.rollingNumberMeasureStaticLabelMethodMatch.let { + val measureTextIndex = it[0] + 1 it.method.apply { val freeRegister = getInstruction(0).registerA @@ -273,27 +282,25 @@ val returnYouTubeDislikePatch = bytecodePatch( // The rolling number Span is missing styling since it's initially set as a String. // Modify the UI text view and use the styled like/dislike Span. // Initial TextView is set in this method. - rollingNumberTextViewFingerprint.method, + rollingNumberTextViewMethod, // Videos less than 24 hours after uploaded, like counts will be updated in real time. // Whenever like counts are updated, TextView is set in this method. - rollingNumberTextViewAnimationUpdateFingerprint.method, + rollingNumberTextViewAnimationUpdateMethodMatch.method, ).forEach { insertMethod -> insertMethod.apply { val setTextIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "setText" + methodReference?.name == "setText" } - val textViewRegister = - getInstruction(setTextIndex).registerC - val textSpanRegister = - getInstruction(setTextIndex).registerD + val textViewRegister = getInstruction(setTextIndex).registerC + val textSpanRegister = getInstruction(setTextIndex).registerD addInstructions( setTextIndex, """ invoke-static {v$textViewRegister, v$textSpanRegister}, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$textSpanRegister - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt index 2dbff83a23..e7748db661 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt @@ -1,27 +1,34 @@ package app.revanced.patches.youtube.layout.searchbar -import app.revanced.patcher.fingerprint -import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewFingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewMethod import com.android.tools.smali.dexlib2.AccessFlags -internal val setWordmarkHeaderFingerprint = fingerprint { +internal val BytecodePatchContext.setWordmarkHeaderMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/widget/ImageView;") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(ytPremiumWordmarkHeaderId) && - methodDef.containsLiteralInstruction(ytWordmarkHeaderId) - } + returnType("V") + parameterTypes("Landroid/widget/ImageView;") + instructions( + ResourceType.ATTR("ytPremiumWordmarkHeader"), + ResourceType.ATTR("ytWordmarkHeader"), + ) } /** - * Matches the same method as [yoodlesImageViewFingerprint]. + * Matches the same method as [yoodlesImageViewMethod]. */ -internal val wideSearchbarLayoutFingerprint = fingerprint { +internal val BytecodePatchContext.wideSearchbarLayoutMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - parameters("L", "L") - literal { actionBarRingoId } + returnType("Landroid/view/View;") + parameterTypes("L", "L") + instructions( + ResourceType.LAYOUT("action_bar_ringo"), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 91c827f5d6..9ac4138abd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -1,16 +1,15 @@ package app.revanced.patches.youtube.layout.searchbar -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.addInstructionsAtControlFlowLabel @@ -20,103 +19,85 @@ import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/WideSearchbarPatch;" -internal var ytWordmarkHeaderId = -1L - private set -internal var ytPremiumWordmarkHeaderId = -1L - private set -internal var actionBarRingoId = -1L - private set - -private val wideSearchbarResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - ytWordmarkHeaderId = resourceMappings[ - "attr", - "ytWordmarkHeader", - ] - - ytPremiumWordmarkHeaderId = resourceMappings[ - "attr", - "ytPremiumWordmarkHeader", - ] - - actionBarRingoId = resourceMappings[ - "layout", - "action_bar_ringo", - ] - } -} - -val wideSearchbarPatch = bytecodePatch( +@Suppress("unused") +val wideSearchBarPatch = bytecodePatch( name = "Wide search bar", description = "Adds an option to replace the search icon with a wide search bar. " + - "This will hide the YouTube logo when active.", + "This will hide the YouTube logo when active.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, - wideSearchbarResourcePatch, + resourceMappingPatch, + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + // 20.31.40+ not supported. YouTube code was removed. + ), ) - execute { + apply { + if (is_20_31_or_greater) { + // YT removed the legacy text search text field all code required to use it. + // This functionality could be restored by adding a search text field to the toolbar + // with a listener that artificially clicks the toolbar search button. + return@apply Logger.getLogger(this::class.java.name).warning( + "Wide searchbar is not compatible with 20.31+", + ) + } + addResources("youtube", "layout.searchbar.wideSearchbarPatch") PreferenceScreen.FEED.addPreferences( SwitchPreference("revanced_wide_searchbar"), ) - setWordmarkHeaderFingerprint.let { - // Navigate to the method that checks if the YT logo is shown beside the search bar. - val shouldShowLogoMethod = with(it.originalMethod) { - val invokeStaticIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_STATIC && - getReference()?.returnType == "Z" - } - navigate(this).to(invokeStaticIndex).stop() + // Navigate to the method that checks if the YT logo is shown beside the search bar. + val shouldShowLogoMethod = with(setWordmarkHeaderMethod) { + val invokeStaticIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_STATIC && + getReference()?.returnType == "Z" } + navigate(this).to(invokeStaticIndex).stop() + } - shouldShowLogoMethod.apply { - findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> - val register = getInstruction(index).registerA + shouldShowLogoMethod.apply { + findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> + val register = getInstruction(index).registerA - addInstructionsAtControlFlowLabel( - index, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->enableWideSearchbar(Z)Z - move-result v$register - """ - ) - } + addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->enableWideSearchbar(Z)Z + move-result v$register + """, + ) } } // Fix missing left padding when using wide searchbar. - wideSearchbarLayoutFingerprint.method.apply { + wideSearchbarLayoutMethod.apply { findInstructionIndicesReversedOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/view/LayoutInflater;" - && reference.name == "inflate" + reference?.definingClass == "Landroid/view/LayoutInflater;" && + reference.name == "inflate" }.forEach { inflateIndex -> val register = getInstruction(inflateIndex + 1).registerA addInstruction( inflateIndex + 2, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setActionBar(Landroid/view/View;)V" + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setActionBar(Landroid/view/View;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 24e062d408..63cb2e0f1f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -1,160 +1,147 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.patcher.fingerprint -import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { - returns("Z") +internal val BytecodePatchContext.fullscreenSeekbarThumbnailsMethod by gettingFirstMethodDeclaratively { + returnType("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters() - literal { 45398577 } + parameterTypes() + instructions( + 45398577L(), + ) } -internal val playerSeekbarColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarColorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(inlineTimeBarColorizedBarPlayedColorDarkId) && - method.containsLiteralInstruction(inlineTimeBarPlayedNotHighlightedColorId) - } + instructions( + ResourceType.COLOR("inline_time_bar_played_not_highlighted_color"), + ResourceType.COLOR("inline_time_bar_colorized_bar_played_color_dark"), + ) } -internal val setSeekbarClickedColorFingerprint = fingerprint { +// class is ControlsOverlayStyle in 20.32 and lower, and obfuscated in 20.33+ +internal val BytecodePatchContext.setSeekbarClickedColorMethodMatch by composingFirstMethod( + "YOUTUBE", + "PREROLL", + "POSTROLL", + "REMOTE_LIVE", + "AD_LARGE_CONTROLS", +) { opcodes(Opcode.CONST_HIGH16) - strings("YOUTUBE", "PREROLL", "POSTROLL") - custom { _, classDef -> - classDef.endsWith("ControlsOverlayStyle;") - } } -internal val shortsSeekbarColorFingerprint = fingerprint { +internal val BytecodePatchContext.shortsSeekbarColorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { reelTimeBarPlayedColorId } + instructions( + ResourceType.COLOR("reel_time_bar_played_color"), + ) } -internal val playerSeekbarHandle1ColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarHandle1ColorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Landroid/content/Context;") - custom { method, _ -> - method.containsLiteralInstruction(ytTextSecondaryId) && - method.containsLiteralInstruction(ytStaticBrandRedId) - } + instructions( + ResourceType.COLOR("inline_time_bar_live_seekable_range"), + ResourceType.ATTR("ytStaticBrandRed"), + ) } -internal val playerSeekbarHandle2ColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarHandle2ColorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Landroid/content/Context;") - custom { method, _ -> - method.containsLiteralInstruction(inlineTimeBarLiveSeekableRangeId) && - method.containsLiteralInstruction(ytStaticBrandRedId) - } + parameterTypes("Landroid/content/Context;") + instructions( + ResourceType.ATTR("ytTextSecondary"), + ResourceType.ATTR("ytStaticBrandRed"), + ) } - -internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { +internal val BytecodePatchContext.watchHistoryMenuUseProgressDrawableMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - literal { -1712394514 } + returnType("V") + parameterTypes("L") + instructions( + method { name == "setMax" && definingClass == "Landroid/widget/ProgressBar;" }, + Opcode.MOVE_RESULT(), + (-1712394514L)(), + ) } -internal val lithoLinearGradientFingerprint = fingerprint { +internal val BytecodePatchContext.lithoLinearGradientMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC) - returns("Landroid/graphics/LinearGradient;") - parameters("F", "F", "F", "F", "[I", "[F") + returnType("Landroid/graphics/LinearGradient;") + parameterTypes("F", "F", "F", "F", "[I", "[F") } /** * 19.49+ */ -internal val playerLinearGradientFingerprint = fingerprint { +internal val BytecodePatchContext.playerLinearGradientMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - parameters("I", "I", "I", "I", "Landroid/content/Context;", "I") - returns("Landroid/graphics/LinearGradient;") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT + parameterTypes("I", "I", "I", "I", "Landroid/content/Context;", "I") + returnType("Landroid/graphics/LinearGradient;") + instructions( + ResourceType.COLOR("yt_youtube_magenta"), + + afterAtMost(5, Opcode.FILLED_NEW_ARRAY()), + after(Opcode.MOVE_RESULT_OBJECT()), ) - literal { ytYoutubeMagentaColorId } } /** * 19.25 - 19.47 */ -internal val playerLinearGradientLegacyFingerprint = fingerprint { - returns("V") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT +internal val BytecodePatchContext.playerLinearGradientLegacyMethodMatch by composingFirstMethod { + returnType("V") + instructions( + ResourceType.COLOR("yt_youtube_magenta"), + + Opcode.FILLED_NEW_ARRAY(), + after(Opcode.MOVE_RESULT_OBJECT()), ) - literal { ytYoutubeMagentaColorId } -} - -internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L - -internal val launchScreenLayoutTypeFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - custom { method, _ -> - val firstParameter = method.parameterTypes.firstOrNull() - // 19.25 - 19.45 - (firstParameter == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - || firstParameter == "Landroid/app/Activity;") // 19.46+ - && method.containsLiteralInstruction(launchScreenLayoutTypeLotteFeatureFlag) - } } internal const val LOTTIE_ANIMATION_VIEW_CLASS_TYPE = "Lcom/airbnb/lottie/LottieAnimationView;" -internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint { +internal val BytecodePatchContext.lottieAnimationViewSetAnimationIntMethod by gettingFirstImmutableMethodDeclaratively { + definingClass(LOTTIE_ANIMATION_VIEW_CLASS_TYPE) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("I") - returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" - && reference.name == "isInEditMode" - } >= 0 + parameterTypes("I") + returnType("V") + + lateinit var methodDefiningClass: String + custom { + methodDefiningClass = definingClass + true } + + instructions(method { name == "isInEditMode" && definingClass == methodDefiningClass }) } -internal val lottieAnimationViewSetAnimationStreamFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("L") - returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Ljava/util/Set;" - && reference.name == "add" - } >= 0 && methodDef.containsLiteralInstruction(0) - } -} - -internal val lottieCompositionFactoryZipFingerprint = fingerprint { +internal val BytecodePatchContext.lottieCompositionFactoryZipMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - parameters("Landroid/content/Context;", "Ljava/lang/String;", "Ljava/lang/String;") - returns("L") - strings(".zip", ".lottie") + parameterTypes("Landroid/content/Context;", "Ljava/util/zip/ZipInputStream;", "Ljava/lang/String;") + returnType("L") + instructions( + "Unable to parse composition"(), + " however it was not found in the animation."(), + ) } /** - * Resolves using class found in [lottieCompositionFactoryZipFingerprint]. + * Resolves using class found in [lottieCompositionFactoryZipMethod]. * * [Original method](https://github.com/airbnb/lottie-android/blob/26ad8bab274eac3f93dccccfa0cafc39f7408d13/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java#L386) */ -internal val lottieCompositionFactoryFromJsonInputStreamFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getLottieCompositionFactoryFromJsonInputStreamMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - parameters("Ljava/io/InputStream;", "Ljava/lang/String;") - returns("L") - literal { 2 } + parameterTypes("Ljava/io/InputStream;", "Ljava/lang/String;") + returnType("L") + instructions( + anyOf(2L(), 3L()), + ) } - - diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index f7332f5c3f..9a67e0491c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -1,30 +1,25 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.* +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.shared.layout.theme.lithoColorHookPatch import app.revanced.patches.shared.layout.theme.lithoColorOverrideHook -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -33,65 +28,6 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -internal var reelTimeBarPlayedColorId = -1L - private set -internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L - private set -internal var inlineTimeBarPlayedNotHighlightedColorId = -1L - private set -internal var ytYoutubeMagentaColorId = -1L - private set -internal var ytStaticBrandRedId = -1L - private set -internal var ytTextSecondaryId = -1L - private set -internal var inlineTimeBarLiveSeekableRangeId = -1L - private set - -private val seekbarColorResourcePatch = resourcePatch { - dependsOn( - settingsPatch, - resourceMappingPatch, - versionCheckPatch, - ) - - execute { - reelTimeBarPlayedColorId = resourceMappings[ - "color", - "reel_time_bar_played_color", - ] - inlineTimeBarColorizedBarPlayedColorDarkId = resourceMappings[ - "color", - "inline_time_bar_colorized_bar_played_color_dark", - ] - inlineTimeBarPlayedNotHighlightedColorId = resourceMappings[ - "color", - "inline_time_bar_played_not_highlighted_color", - ] - ytStaticBrandRedId = resourceMappings[ - "attr", - "ytStaticBrandRed" - ] - ytTextSecondaryId = resourceMappings[ - "attr", - "ytTextSecondary" - ] - inlineTimeBarLiveSeekableRangeId = resourceMappings[ - "color", - "inline_time_bar_live_seekable_range" - ] - - ytYoutubeMagentaColorId = resourceMappings[ - "color", - "yt_youtube_magenta", - ] - ytStaticBrandRedId = resourceMappings[ - "attr", - "ytStaticBrandRed", - ] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/theme/SeekbarColorPatch;" val seekbarColorPatch = bytecodePatch( @@ -100,29 +36,31 @@ val seekbarColorPatch = bytecodePatch( dependsOn( sharedExtensionPatch, lithoColorHookPatch, - seekbarColorResourcePatch, - versionCheckPatch + resourceMappingPatch, + versionCheckPatch, ) - execute { - fun MutableMethod.addColorChangeInstructions(resourceId: Long) { + apply { + fun MutableMethod.addColorChangeInstructions(index: Int) { insertLiteralOverride( - resourceId, - "$EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I" + index, + "$EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I", ) } - playerSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId) - addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId) + playerSeekbarColorMethodMatch.let { + it.method.apply { + addColorChangeInstructions(it[-1]) + addColorChangeInstructions(it[0]) + } } - shortsSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(reelTimeBarPlayedColorId) + shortsSeekbarColorMethodMatch.let { + it.method.addColorChangeInstructions(it[0]) } - setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch!!.startIndex + 1 + setSeekbarClickedColorMethodMatch.immutableMethod.let { + val setColorMethodIndex = setSeekbarClickedColorMethodMatch[0] + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA @@ -140,56 +78,55 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - arrayOf( - playerSeekbarHandle1ColorFingerprint, - playerSeekbarHandle2ColorFingerprint - ).forEach { - it.method.addColorChangeInstructions(ytStaticBrandRedId) + var handleBarColorMethodMatches = mutableListOf(playerSeekbarHandle1ColorMethodMatch) + if (!is_20_34_or_greater) { + handleBarColorMethodMatches += playerSeekbarHandle2ColorMethodMatch + } + handleBarColorMethodMatches.forEach { + it.method.addColorChangeInstructions(it[-1]) } // If hiding feed seekbar thumbnails, then turn off the cairo gradient // of the watch history menu items as they use the same gradient as the // player and there is no easy way to distinguish which to use a transparent color. if (is_19_34_or_greater) { - watchHistoryMenuUseProgressDrawableFingerprint.method.apply { - val progressIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ProgressBar;" && reference.name == "setMax" - } - val index = indexOfFirstInstructionOrThrow(progressIndex, Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA + watchHistoryMenuUseProgressDrawableMethodMatch.let { + it.method.apply { + val index = it[1] + val register = getInstruction(index).registerA - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z - move-result v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z + move-result v$register + """, + ) + } } } - lithoLinearGradientFingerprint.method.addInstructions( + lithoLinearGradientMethod.addInstructions( 0, """ invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->getLithoLinearGradient([I[F)[I move-result-object p4 - """ + """, ) - val playerFingerprint: Fingerprint + val playerMatch: CompositeMatch val checkGradientCoordinates: Boolean if (is_19_49_or_greater) { - playerFingerprint = playerLinearGradientFingerprint + playerMatch = playerLinearGradientMethodMatch checkGradientCoordinates = true } else { - playerFingerprint = playerLinearGradientLegacyFingerprint + playerMatch = playerLinearGradientLegacyMethodMatch checkGradientCoordinates = false } - playerFingerprint.let { + playerMatch.let { it.method.apply { - val index = it.patternMatch!!.endIndex + val index = it[-1] val register = getInstruction(index).registerA addInstructions( @@ -204,7 +141,7 @@ val seekbarColorPatch = bytecodePatch( invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getPlayerLinearGradient([I)[I move-result-object v$register """ - } + }, ) } } @@ -212,99 +149,97 @@ val seekbarColorPatch = bytecodePatch( // region apply seekbar custom color to splash screen animation. if (!is_19_34_or_greater) { - return@execute // 19.25 does not have a cairo launch animation. - } - - // Add development hook to force old drawable splash animation. - arrayOf( - launchScreenLayoutTypeFingerprint, - mainActivityOnCreateFingerprint - ).forEach { fingerprint -> - fingerprint.method.insertLiteralOverride( - launchScreenLayoutTypeLotteFeatureFlag, - "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" - ) + return@apply // 19.25 does not have a cairo launch animation. } // Hook the splash animation to set the a seekbar color. - mainActivityOnCreateFingerprint.method.apply { - val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name + mainActivityOnCreateMethod.apply { + val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntMethod.name findInstructionIndicesReversedOrThrow { val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" - && reference.name == setAnimationIntMethodName + reference?.definingClass == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && + reference.name == setAnimationIntMethodName }.forEach { index -> val instruction = getInstruction(index) replaceInstruction( index, "invoke-static { v${instruction.registerC}, v${instruction.registerD} }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie(Lcom/airbnb/lottie/LottieAnimationView;I)V" + "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie(Lcom/airbnb/lottie/LottieAnimationView;I)V", ) } } // Add non obfuscated method aliases for `setAnimation(int)` // and `setAnimation(InputStream, String)` so extension code can call them. - lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply { + lottieAnimationViewSetAnimationIntMethod.classDef.methods.apply { val addedMethodName = "patch_setAnimation" - val setAnimationIntName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name + val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntMethod.name - add(ImmutableMethod( - LOTTIE_ANIMATION_VIEW_CLASS_TYPE, - addedMethodName, - listOf(ImmutableMethodParameter("I", null, null)), - "V", - AccessFlags.PUBLIC.value, - null, - null, - MutableMethodImplementation(2), - ).toMutable().apply { - addInstructions( - """ - invoke-virtual { p0, p1 }, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationIntName(I)V - return-void - """ - ) - }) + add( + ImmutableMethod( + LOTTIE_ANIMATION_VIEW_CLASS_TYPE, + addedMethodName, + listOf(ImmutableMethodParameter("I", null, null)), + "V", + AccessFlags.PUBLIC.value, + null, + null, + MutableMethodImplementation(2), + ).toMutable().apply { + addInstructions( + """ + invoke-virtual { p0, p1 }, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationIntMethodName(I)V + return-void + """, + ) + }, + ) - val factoryStreamClass : CharSequence - val factoryStreamName : CharSequence - val factoryStreamReturnType : CharSequence - lottieCompositionFactoryFromJsonInputStreamFingerprint.match( - lottieCompositionFactoryZipFingerprint.originalClassDef - ).originalMethod.apply { - factoryStreamClass = definingClass - factoryStreamName = name - factoryStreamReturnType = returnType + val factoryStreamClass: CharSequence + val factoryStreamName: CharSequence + val factoryStreamReturnType: CharSequence + + lottieCompositionFactoryZipMethod.immutableClassDef.getLottieCompositionFactoryFromJsonInputStreamMethod() + .let { + factoryStreamClass = it.definingClass + factoryStreamName = it.name + factoryStreamReturnType = it.returnType + } + + val lottieAnimationViewSetAnimationStreamMethod = firstMethodDeclaratively { + definingClass(lottieAnimationViewSetAnimationIntMethod.immutableClassDef.type) + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes(factoryStreamReturnType.toString()) + returnType("V") } + val setAnimationStreamMethodName = lottieAnimationViewSetAnimationStreamMethod.name - val setAnimationStreamName = lottieAnimationViewSetAnimationStreamFingerprint - .originalMethod.name - - add(ImmutableMethod( - LOTTIE_ANIMATION_VIEW_CLASS_TYPE, - addedMethodName, - listOf( - ImmutableMethodParameter("Ljava/io/InputStream;", null, null), - ImmutableMethodParameter("Ljava/lang/String;", null, null) - ), - "V", - AccessFlags.PUBLIC.value, - null, - null, - MutableMethodImplementation(4), - ).toMutable().apply { - addInstructions( - """ - invoke-static { p1, p2 }, $factoryStreamClass->$factoryStreamName(Ljava/io/InputStream;Ljava/lang/String;)$factoryStreamReturnType - move-result-object v0 - invoke-virtual { p0, v0}, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationStreamName($factoryStreamReturnType)V - return-void - """ - ) - }) + add( + ImmutableMethod( + LOTTIE_ANIMATION_VIEW_CLASS_TYPE, + addedMethodName, + listOf( + ImmutableMethodParameter("Ljava/io/InputStream;", null, null), + ImmutableMethodParameter("Ljava/lang/String;", null, null), + ), + "V", + AccessFlags.PUBLIC.value, + null, + null, + MutableMethodImplementation(4), + ).toMutable().apply { + addInstructions( + """ + invoke-static { p1, p2 }, $factoryStreamClass->$factoryStreamName(Ljava/io/InputStream;Ljava/lang/String;)$factoryStreamReturnType + move-result-object v0 + invoke-virtual { p0, v0}, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationStreamMethodName($factoryStreamReturnType)V + return-void + """, + ) + }, + ) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt index 045d75ca28..f6b30c4650 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt @@ -1,51 +1,61 @@ package app.revanced.patches.youtube.layout.shortsautoplay -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val reelEnumConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.reelEnumConstructorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - opcodes(Opcode.RETURN_VOID) - strings( - "REEL_LOOP_BEHAVIOR_UNKNOWN", - "REEL_LOOP_BEHAVIOR_SINGLE_PLAY", - "REEL_LOOP_BEHAVIOR_REPEAT", - "REEL_LOOP_BEHAVIOR_END_SCREEN", + instructions( + "REEL_LOOP_BEHAVIOR_UNKNOWN"(), + "REEL_LOOP_BEHAVIOR_SINGLE_PLAY"(), + "REEL_LOOP_BEHAVIOR_REPEAT"(), + "REEL_LOOP_BEHAVIOR_END_SCREEN"(), + Opcode.RETURN_VOID(), ) } -internal val reelPlaybackRepeatFingerprint = fingerprint { - returns("V") - parameters("L") - strings("YoutubePlayerState is in throwing an Error.") +internal val BytecodePatchContext.reelPlaybackRepeatParentMethod by gettingFirstImmutableMethodDeclaratively { + returnType("V") + parameterTypes("Ljava/lang/String;", "J") + instructions( + "Reels[%s] Playback Time: %d ms"(), + ) } -internal val reelPlaybackFingerprint = fingerprint { +/** + * Matches class found in [reelPlaybackRepeatParentMethod]. + */ +context(_: BytecodePatchContext) +internal fun ClassDef.getReelPlaybackRepeatMethod() = firstMethodDeclaratively { + returnType("V") + parameterTypes("L") + instructions(method { toString() == "Lcom/google/common/util/concurrent/ListenableFuture;->isDone()Z" }) +} + +internal val BytecodePatchContext.reelPlaybackMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("J") - custom { method, _ -> - indexOfMilliSecondsInstruction(method) >= 0 && - indexOfInitializationInstruction(method) >= 0 - } + parameterTypes("J") + returnType("V") + + val methodParametersPrefix = listOf("I", "L", "L") + instructions( + field { definingClass == "Ljava/util/concurrent/TimeUnit;" && name == "MILLISECONDS" }, + afterAtMost( + 15, + method { + name == "" && + parameterTypes.zip(methodParametersPrefix).all { (a, b) -> a.startsWith(b) } + }, + ), + afterAtMost( + 5, + allOf( + Opcode.INVOKE_VIRTUAL(), + method { returnType == "I" && parameterTypes.count() == 1 && parameterTypes.first().startsWith("L") }, + ), + ), + ) } - -private fun indexOfMilliSecondsInstruction(method: Method) = - method.indexOfFirstInstruction { - getReference()?.name == "MILLISECONDS" - } - -internal fun indexOfInitializationInstruction(method: Method) = - method.indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.INVOKE_DIRECT && - reference?.name == "" && - reference.parameterTypes.size == 3 && - reference.parameterTypes.firstOrNull() == "I" - } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index 30e9ecf8db..988529db90 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -1,11 +1,14 @@ package app.revanced.patches.youtube.layout.shortsautoplay -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -15,7 +18,7 @@ import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -31,6 +34,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ShortsAutoplayPatch;" +@Suppress("ObjectPropertyName") val shortsAutoplayPatch = bytecodePatch( name = "Shorts autoplay", description = "Adds options to automatically play the next Short.", @@ -44,14 +48,14 @@ val shortsAutoplayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.shortsautoplay.shortsAutoplayPatch") PreferenceScreen.SHORTS.addPreferences( @@ -65,18 +69,18 @@ val shortsAutoplayPatch = bytecodePatch( } // Main activity is used to check if app is in pip mode. - mainActivityOnCreateFingerprint.method.addInstruction( + mainActivityOnCreateMethod.addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->setMainActivity(Landroid/app/Activity;)V", ) - val reelEnumClass = reelEnumConstructorFingerprint.originalClassDef.type + var reelEnumClass: String - reelEnumConstructorFingerprint.method.apply { - val insertIndex = reelEnumConstructorFingerprint.patternMatch!!.startIndex + reelEnumConstructorMethodMatch.apply { + reelEnumClass = immutableClassDef.type - addInstructions( - insertIndex, + method.addInstructions( + reelEnumConstructorMethodMatch[-1], """ # Pass the first enum value to extension. # Any enum value of this type will work. @@ -86,7 +90,9 @@ val shortsAutoplayPatch = bytecodePatch( ) } - reelPlaybackRepeatFingerprint.method.apply { + val reelPlaybackRepeatMethod = reelPlaybackRepeatParentMethod.immutableClassDef.getReelPlaybackRepeatMethod() + + reelPlaybackRepeatMethod.apply { // The behavior enums are looked up from an ordinal value to an enum type. findInstructionIndicesReversedOrThrow { val reference = getReference() @@ -110,26 +116,23 @@ val shortsAutoplayPatch = bytecodePatch( // Manually restore the removed 'Autoplay' code. if (is_20_09_or_greater) { // Variable names are only a rough guess of what these methods do. - val userActionMethodIndex = indexOfInitializationInstruction(reelPlaybackFingerprint.method) - val userActionMethodReference = reelPlaybackFingerprint.method - .getInstruction(userActionMethodIndex).reference as MethodReference - val reelSequenceControllerMethodIndex = reelPlaybackFingerprint.method - .indexOfFirstInstructionOrThrow(userActionMethodIndex, Opcode.INVOKE_VIRTUAL) - val reelSequenceControllerMethodReference = reelPlaybackFingerprint.method - .getInstruction(reelSequenceControllerMethodIndex).reference as MethodReference + val userActionMethodReference = + reelPlaybackMethodMatch.method.getInstruction(reelPlaybackMethodMatch[1]).methodReference!! + val reelSequenceControllerMethodReference = + reelPlaybackMethodMatch.method.getInstruction(reelPlaybackMethodMatch[2]).methodReference!! - reelPlaybackRepeatFingerprint.method.apply { + reelPlaybackRepeatMethod.apply { // Find the first call modified by extension code above. val extensionReturnResultIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_STATIC && - getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR + getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR } + 1 val enumRegister = getInstruction(extensionReturnResultIndex).registerA - val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow(extensionReturnResultIndex) { + val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.IGET_OBJECT && - reference?.definingClass == definingClass && - reference.type == reelSequenceControllerMethodReference.definingClass + reference?.definingClass == definingClass && + reference.type == reelSequenceControllerMethodReference.definingClass } val getReelSequenceControllerReference = getInstruction(getReelSequenceControllerIndex).reference @@ -166,10 +169,10 @@ val shortsAutoplayPatch = bytecodePatch( return-object v4 :ignore return-object p1 - """ + """, ) } - reelPlaybackRepeatFingerprint.classDef.methods.add(helperMethod) + reelPlaybackRepeatMethod.classDef.methods.add(helperMethod) addInstructionsWithLabels( extensionReturnResultIndex + 1, @@ -180,7 +183,7 @@ val shortsAutoplayPatch = bytecodePatch( return-void # Autoplay was performed. :ignore nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index abd7f10ceb..7fb5ae1ca0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -1,64 +1,97 @@ package app.revanced.patches.youtube.layout.shortsplayer -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.38 and lower. */ -internal val playbackStartFeatureFlagFingerprint = fingerprint { - returns("Z") - parameters( - "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", +internal val BytecodePatchContext.playbackStartFeatureFlagMethodMatch by composingFirstMethod { + returnType("Z") + parameterTypes("Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;") + instructions( + method { + definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" && + returnType == "Ljava/lang/String;" + }, + 45380134L(), + ) +} + +/** + * Purpose of this method is not entirely clear, and it's only used to identify + * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.39+ + */ +internal val BytecodePatchContext.watchPanelVideoIdMethodMatch by composingFirstMethod { + returnType("Ljava/lang/String;") + parameterTypes() + instructions( + allOf( + Opcode.IGET_OBJECT(), + field { type == "Lcom/google/android/apps/youtube/app/common/player/queue/WatchPanelId;" }, + ), + allOf( + Opcode.CHECK_CAST(), + type("Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;"), + ), + method { + definingClass == "Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;" && + returnType == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" + }, + method { + definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" && + returnType == "Ljava/lang/String;" + }, + ) - literal { - 45380134L - } } // Pre 19.25 -internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.shortsPlaybackIntentLegacyMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters( + returnType("V") + parameterTypes( "L", "Ljava/util/Map;", "J", "Ljava/lang/String;", "Z", - "Ljava/util/Map;" + "Ljava/util/Map;", ) - strings( + instructions( + method { returnType == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" }, // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + "com.google.android.apps.youtube.app.endpoint.flags"(), + "ReelWatchFragmentArgs"(), + "reels_fragment_descriptor"(), ) } -internal val shortsPlaybackIntentFingerprint = fingerprint { +internal val BytecodePatchContext.shortsPlaybackIntentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returns("V") - parameters( + returnType("V") + parameterTypes( "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", "Ljava/util/Map;", "J", - "Ljava/lang/String;" + "Ljava/lang/String;", ) - strings( + instructions( // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + "com.google.android.apps.youtube.app.endpoint.flags"(), + "ReelWatchFragmentArgs"(), + "reels_fragment_descriptor"(), ) } -internal val exitVideoPlayerFingerprint = fingerprint { - returns("V") - parameters() - literal { - mdx_drawer_layout_id - } -} \ No newline at end of file +internal val BytecodePatchContext.exitVideoPlayerMethod by gettingFirstMethodDeclaratively { + returnType("V") + parameterTypes() + instructions(ResourceType.ID("mdx_drawer_layout")) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 4637857542..9b115730b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -1,26 +1,23 @@ package app.revanced.patches.youtube.layout.shortsplayer -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscreenHookPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod import app.revanced.util.findFreeRegister import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -32,21 +29,6 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch;" -internal var mdx_drawer_layout_id = -1L - private set - -private val openShortsInRegularPlayerResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - mdx_drawer_layout_id = resourceMappings[ - "id", - "mdx_drawer_layout", - ] - - } -} - @Suppress("unused") val openShortsInRegularPlayerPatch = bytecodePatch( name = "Open Shorts in regular player", @@ -59,50 +41,43 @@ val openShortsInRegularPlayerPatch = bytecodePatch( openVideosFullscreenHookPatch, navigationBarHookPatch, versionCheckPatch, - openShortsInRegularPlayerResourcePatch + resourceMappingPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.shortsplayer.shortsPlayerTypePatch") PreferenceScreen.SHORTS.addPreferences( - if (is_19_46_or_greater) { - ListPreference("revanced_shorts_player_type") - } else { - ListPreference( - key = "revanced_shorts_player_type", - entriesKey = "revanced_shorts_player_type_legacy_entries", - entryValuesKey = "revanced_shorts_player_type_legacy_entry_values" - ) - } + ListPreference("revanced_shorts_player_type"), ) // Activity is used as the context to launch an Intent. - mainActivityOnCreateFingerprint.method.addInstruction( + mainActivityOnCreateMethod.addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "setMainActivity(Landroid/app/Activity;)V", + "setMainActivity(Landroid/app/Activity;)V", ) // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.method.let { - val stringMethodIndex = it.indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" - && reference.returnType == "Ljava/lang/String;" + val (videoIdStartMethod, videoIdIndex) = if (is_20_39_or_greater) { + watchPanelVideoIdMethodMatch.let { + it.immutableMethod to it[-1] + } + } else { + playbackStartFeatureFlagMethodMatch.let { + it.immutableMethod to it[0] } - - navigate(it).to(stringMethodIndex).stop().name } + val playbackStartVideoIdMethodName = navigate(videoIdStartMethod).to(videoIdIndex).stop().name fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = """ @@ -117,37 +92,34 @@ val openShortsInRegularPlayerPatch = bytecodePatch( nop """ - if (!is_19_25_or_greater) { - shortsPlaybackIntentLegacyFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - getReference()?.returnType == - "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" + if (is_19_25_or_greater) { + shortsPlaybackIntentMethod.addInstructionsWithLabels( + 0, + """ + move-object/from16 v0, p1 + ${extensionInstructions(0, 1)} + """, + ) + } else { + shortsPlaybackIntentLegacyMethodMatch.let { + it.method.apply { + val index = it[0] + val playbackStartRegister = getInstruction(index + 1).registerA + val insertIndex = index + 2 + val freeRegister = findFreeRegister(insertIndex, playbackStartRegister) + + addInstructionsWithLabels( + insertIndex, + extensionInstructions(playbackStartRegister, freeRegister), + ) } - val playbackStartRegister = getInstruction(index + 1).registerA - val insertIndex = index + 2 - val freeRegister = findFreeRegister(insertIndex, playbackStartRegister) - - addInstructionsWithLabels( - insertIndex, - extensionInstructions(playbackStartRegister, freeRegister) - ) } - - return@execute } - shortsPlaybackIntentFingerprint.method.addInstructionsWithLabels( - 0, - """ - move-object/from16 v0, p1 - ${extensionInstructions(0, 1)} - """ - ) - // Fix issue with back button exiting the app instead of minimizing the player. // Without this change this issue can be difficult to reproduce, but seems to occur // most often with 'open video in regular player' and not open in fullscreen player. - exitVideoPlayerFingerprint.method.apply { + exitVideoPlayerMethod.apply { // Method call for Activity.finish() val finishIndex = indexOfFirstInstructionOrThrow { val reference = getReference() @@ -163,7 +135,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->overrideBackPressToExit(Z)Z move-result v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index dbbd0c0006..de6ee8f0e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,78 +1,50 @@ package app.revanced.patches.youtube.layout.sponsorblock -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.youtube.shared.seekbarMethod import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val appendTimeFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.appendTimeMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;") - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT, + returnType("V") + parameterTypes("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;") + instructions( + ResourceType.STRING("total_time"), + method { toString() == "Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;" }, + after(Opcode.MOVE_RESULT_OBJECT()), ) } -internal val controlsOverlayFingerprint = fingerprint { - returns("V") - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - parameters() - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, // R.id.inset_overlay_view_layout - Opcode.IPUT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.NEW_INSTANCE, +internal val ClassDef.controlsOverlayMethodMatch by ClassDefComposing.composingFirstMethod { + returnType("V") + parameterTypes() + instructions( + ResourceType.ID.invoke("inset_overlay_view_layout"), + afterAtMost(20, allOf(Opcode.CHECK_CAST(), type("Landroid/widget/FrameLayout;"))), ) } -internal val rectangleFieldInvalidatorFingerprint = fingerprint { - returns("V") - custom { method, _ -> - val instructions = method.implementation?.instructions!! - val instructionCount = instructions.count() - - // the method has definitely more than 5 instructions - if (instructionCount < 5) return@custom false - - val referenceInstruction = instructions.elementAt(instructionCount - 2) // the second to last instruction - val reference = ((referenceInstruction as? ReferenceInstruction)?.reference as? MethodReference) - - reference?.parameterTypes?.size == 1 && reference.name == "invalidate" // the reference is the invalidate(..) method - } +/** + * Resolves to the class found in [seekbarMethod]. + */ +internal val ClassDef.rectangleFieldInvalidatorMethodMatch by ClassDefComposing.composingFirstMethod { + returnType("V") + parameterTypes() + instructions(method("invalidate")) } -internal val adProgressTextViewVisibilityFingerprint = fingerprint { +internal val BytecodePatchContext.adProgressTextViewVisibilityMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Z") - custom { method, _ -> - indexOfAdProgressTextViewVisibilityInstruction(method) >= 0 - } -} - -internal fun indexOfAdProgressTextViewVisibilityInstruction(method: Method) = - method.indexOfFirstInstructionReversed { - val reference = getReference() - reference?.definingClass == + returnType("V") + parameterTypes("Z") + instructions( + method { + name == "setVisibility" && definingClass == "Lcom/google/android/libraries/youtube/ads/player/ui/AdProgressTextView;" - && reference.name =="setVisibility" - } + }, + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 4b0835f8cc..d17441dea9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -1,14 +1,11 @@ package app.revanced.patches.youtube.layout.sponsorblock -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -16,22 +13,27 @@ import app.revanced.patches.shared.misc.settings.preference.NonInteractivePrefer import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playercontrols.* +import app.revanced.patches.youtube.misc.playercontrols.addTopControl +import app.revanced.patches.youtube.misc.playercontrols.initializeTopControl +import app.revanced.patches.youtube.misc.playercontrols.injectVisibilityCheckCall +import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.* +import app.revanced.patches.youtube.shared.getLayoutConstructorMethodMatch +import app.revanced.patches.youtube.shared.seekbarMethod +import app.revanced.patches.youtube.shared.getSeekbarOnDrawMethodMatch import app.revanced.patches.youtube.video.information.onCreateHook import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.patches.youtube.video.information.videoTimeHook import app.revanced.patches.youtube.video.videoid.hookBackgroundPlayVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch import app.revanced.util.* -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.* +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.StringReference private val sponsorBlockResourcePatch = resourcePatch { dependsOn( @@ -41,7 +43,7 @@ private val sponsorBlockResourcePatch = resourcePatch { playerControlsPatch, ) - execute { + apply { addResources("youtube", "layout.sponsorblock.sponsorBlockResourcePatch") PreferenceScreen.SPONSORBLOCK.addPreferences( @@ -51,13 +53,13 @@ private val sponsorBlockResourcePatch = resourcePatch { key = "revanced_settings_screen_10_sponsorblock", sorting = PreferenceScreenPreference.Sorting.UNSORTED, preferences = emptySet(), // Preferences are added by custom class at runtime. - tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup" + tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup", ), PreferenceCategory( key = "revanced_sb_stats", sorting = PreferenceScreenPreference.Sorting.UNSORTED, preferences = emptySet(), // Preferences are added by custom class at runtime. - tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockStatsPreferenceCategory" + tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockStatsPreferenceCategory", ), PreferenceCategory( key = "revanced_sb_about", @@ -67,9 +69,9 @@ private val sponsorBlockResourcePatch = resourcePatch { key = "revanced_sb_about_api", tag = "app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockAboutPreference", selectable = true, - ) - ) - ) + ), + ), + ), ) arrayOf( @@ -80,7 +82,6 @@ private val sponsorBlockResourcePatch = resourcePatch { "revanced_sb_skip_sponsor_button.xml", ), ResourceGroup( - // required resource for back button, because when the base APK is used, this resource will not exist "drawable", "revanced_sb_adjust.xml", "revanced_sb_backward.xml", @@ -88,9 +89,10 @@ private val sponsorBlockResourcePatch = resourcePatch { "revanced_sb_edit.xml", "revanced_sb_forward.xml", "revanced_sb_logo.xml", + "revanced_sb_logo_bold.xml", "revanced_sb_publish.xml", "revanced_sb_voting.xml", - ) + ), ).forEach { resourceGroup -> copyResources("sponsorblock", resourceGroup) } @@ -99,7 +101,7 @@ private val sponsorBlockResourcePatch = resourcePatch { } } -private const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = +internal const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/SegmentPlaybackController;" private const val EXTENSION_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton;" @@ -115,6 +117,7 @@ val sponsorBlockPatch = bytecodePatch( ) { dependsOn( sharedExtensionPatch, + resourceMappingPatch, videoIdPatch, // Required to skip segments on time. videoInformationPatch, @@ -126,14 +129,14 @@ val sponsorBlockPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { // Hook the video time methods. videoTimeHook( EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR, @@ -145,42 +148,59 @@ val sponsorBlockPatch = bytecodePatch( "->setCurrentVideoId(Ljava/lang/String;)V", ) - // Seekbar drawing - seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { - // Get left and right of seekbar rectangle. - val moveRectangleToRegisterIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT_FROM16) - - addInstruction( - moveRectangleToRegisterIndex + 1, - "invoke-static/range { p0 .. p0 }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V", - ) - - // Set the thickness of the segment. - val thicknessIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_STATIC && getReference()?.name == "round" + // Set seekbar draw rectangle. + val rectangleFieldName: FieldReference + seekbarMethod.immutableClassDef.rectangleFieldInvalidatorMethodMatch.let { + it.method.apply { + val rectangleIndex = indexOfFirstInstructionReversedOrThrow( + it[0], + ) { + getReference()?.type == "Landroid/graphics/Rect;" + } + rectangleFieldName = getInstruction(rectangleIndex).reference as FieldReference } - val thicknessRegister = getInstruction(thicknessIndex).registerC - addInstruction( - thicknessIndex + 2, - "invoke-static { v$thicknessRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V", - ) + } - // Find the drawCircle call and draw the segment before it. - val drawCircleIndex = indexOfFirstInstructionReversedOrThrow { - getReference()?.name == "drawCircle" + // Seekbar drawing. + + // Cannot match using original immutable class because + // class may have been modified by other patches + seekbarMethod.immutableClassDef.getSeekbarOnDrawMethodMatch().let { + it.method.apply { + // Set seekbar thickness. + val thicknessIndex = it[-1] + val thicknessRegister = getInstruction(thicknessIndex).registerA + addInstruction( + thicknessIndex + 1, + "invoke-static { v$thicknessRegister }, " + + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarThickness(I)V", + ) + + // Find the drawCircle call and draw the segment before it. + val drawCircleIndex = indexOfFirstInstructionReversedOrThrow { + getReference()?.name == "drawCircle" + } + val drawCircleInstruction = getInstruction(drawCircleIndex) + val canvasInstanceRegister = drawCircleInstruction.registerC + val centerYRegister = drawCircleInstruction.registerE + + addInstruction( + drawCircleIndex, + "invoke-static { v$canvasInstanceRegister, v$centerYRegister }, " + + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + + "drawSegmentTimeBars(Landroid/graphics/Canvas;F)V", + ) + + // Set seekbar bounds. + addInstructions( + 0, + """ + move-object/from16 v0, p0 + iget-object v0, v0, $rectangleFieldName + invoke-static { v0 }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarRectangle(Landroid/graphics/Rect;)V + """, + ) } - val drawCircleInstruction = getInstruction(drawCircleIndex) - val canvasInstanceRegister = drawCircleInstruction.registerC - val centerYRegister = drawCircleInstruction.registerE - - addInstruction( - drawCircleIndex, - "invoke-static { v$canvasInstanceRegister, v$centerYRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + - "drawSponsorTimeBars(Landroid/graphics/Canvas;F)V", - ) } // Change visibility of the buttons. @@ -191,75 +211,45 @@ val sponsorBlockPatch = bytecodePatch( injectVisibilityCheckCall(EXTENSION_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR) // Append the new time to the player layout. - val appendTimePatternScanStartIndex = appendTimeFingerprint.patternMatch!!.startIndex - appendTimeFingerprint.method.apply { - val register = getInstruction(appendTimePatternScanStartIndex + 1).registerA + appendTimeMethodMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA - addInstructions( - appendTimePatternScanStartIndex + 2, - """ - invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """, + ) + } } // Initialize the player controller. onCreateHook(EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR, "initialize") // Initialize the SponsorBlock view. - controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { - val startIndex = it.patternMatch!!.startIndex + getLayoutConstructorMethodMatch().immutableClassDef.controlsOverlayMethodMatch.let { + val checkCastIndex = it[-1] + it.method.apply { - val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA + val frameLayoutRegister = getInstruction(checkCastIndex).registerA addInstruction( - startIndex + 3, + checkCastIndex + 1, "invoke-static {v$frameLayoutRegister}, $EXTENSION_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V", ) } } - // Set seekbar draw rectangle. - rectangleFieldInvalidatorFingerprint.match(seekbarOnDrawFingerprint.originalClassDef).method.apply { - val fieldIndex = instructions.count() - 3 - val fieldReference = getInstruction(fieldIndex).reference as FieldReference + adProgressTextViewVisibilityMethodMatch.let { + val setVisibilityIndex = it[0] + val register = it.method.getInstruction(setVisibilityIndex).registerD - // replace the "replaceMeWith*" strings - proxy(classes.first { it.type.endsWith("SegmentPlaybackController;") }) - .mutableClass - .methods - .find { it.name == "setSponsorBarRect" } - ?.let { method -> - fun MutableMethod.replaceStringInstruction(index: Int, instruction: Instruction, with: String) { - val register = (instruction as OneRegisterInstruction).registerA - this.replaceInstruction( - index, - "const-string v$register, \"$with\"", - ) - } - for ((index, it) in method.instructions.withIndex()) { - if (it.opcode.ordinal != Opcode.CONST_STRING.ordinal) continue - - when (((it as ReferenceInstruction).reference as StringReference).string) { - "replaceMeWithsetSponsorBarRect" -> method.replaceStringInstruction( - index, - it, - fieldReference.name, - ) - } - } - } ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings") - } - - adProgressTextViewVisibilityFingerprint.method.apply { - val index = indexOfAdProgressTextViewVisibilityInstruction(this) - val register = getInstruction(index).registerD - - addInstructionsAtControlFlowLabel( - index, - "invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setAdProgressTextVisibility(I)V" + it.method.addInstructionsAtControlFlowLabel( + setVisibilityIndex, + "invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setAdProgressTextVisibility(I)V", ) } - } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt index ac458cec26..2d316f7623 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt @@ -1,41 +1,38 @@ package app.revanced.patches.youtube.layout.spoofappversion -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val toolBarButtonFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.toolBarButtonMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Landroid/view/MenuItem;") - custom { method, _ -> - method.containsLiteralInstruction(menuItemView) && - indexOfGetDrawableInstruction(method) >= 0 - } + returnType("V") + instructions( + ResourceType.ID("menu_item_view"), + allOf(Opcode.INVOKE_INTERFACE(), method { returnType == "I" }), + after(Opcode.MOVE_RESULT()), + afterAtMost(6, allOf(Opcode.IGET_OBJECT(), field { type == "Landroid/widget/ImageView;" })), + afterAtMost(8, method { name == "getDrawable" && definingClass == "Landroid/content/res/Resources;" }), + afterAtMost(4, method { name == "setImageDrawable" && definingClass == "Landroid/widget/ImageView;" }), + ) + // 20.37+ has second parameter of "Landroid/content/Context;" + custom { parameterTypes.count() in 1..2 && parameterTypes.first() == "Landroid/view/MenuItem;" } } -internal fun indexOfGetDrawableInstruction(method: Method) = method.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Landroid/content/res/Resources;" && - reference.name == "getDrawable" -} - -internal val spoofAppVersionFingerprint = fingerprint { +internal val BytecodePatchContext.spoofAppVersionMethodMatch by composingFirstMethod( + // Instead of applying a bytecode patch, it might be possible to only rely on code from the extension and + // manually set the desired version string as this keyed value in the SharedPreferences. + // But, this bytecode patch is simple and it works. + "pref_override_build_version_name", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L") + returnType("L") + parameterTypes("L") opcodes( Opcode.IGET_OBJECT, Opcode.GOTO, Opcode.CONST_STRING, ) - // Instead of applying a bytecode patch, it might be possible to only rely on code from the extension and - // manually set the desired version string as this keyed value in the SharedPreferences. - // But, this bytecode patch is simple and it works. - strings("pref_override_build_version_name") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 5bc0e2ba2a..cb9259325f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -1,16 +1,13 @@ package app.revanced.patches.youtube.layout.spoofappversion -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting @@ -21,52 +18,35 @@ import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal var menuItemView = -1L - private set - -internal val spoofAppVersionResourcePatch = resourcePatch { - dependsOn( - resourceMappingPatch - ) - - execute { - menuItemView = resourceMappings["id", "menu_item_view"] - } -} private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofAppVersionPatch;" +@Suppress("ObjectPropertyName") val spoofAppVersionPatch = bytecodePatch( name = "Spoof app version", description = "Adds an option to trick YouTube into thinking you are running an older version of the app. " + - "This can be used to restore old UI elements and features." + "This can be used to restore old UI elements and features.", ) { dependsOn( - spoofAppVersionResourcePatch, + resourceMappingPatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.spoofappversion.spoofAppVersionPatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( @@ -83,20 +63,18 @@ val spoofAppVersionPatch = bytecodePatch( } else if (is_19_43_or_greater) { ListPreference( key = "revanced_spoof_app_version_target", - summaryKey = null, entriesKey = "revanced_spoof_app_version_target_legacy_20_13_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values" + entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values", ) } else { ListPreference( key = "revanced_spoof_app_version_target", - summaryKey = null, entriesKey = "revanced_spoof_app_version_target_legacy_19_34_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values" + entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values", ) - } - ) - ) + }, + ), + ), ) /** @@ -104,36 +82,28 @@ val spoofAppVersionPatch = bytecodePatch( * missing image resources. As a workaround, do not set an image in the * toolbar when the enum name is UNKNOWN. */ - toolBarButtonFingerprint.method.apply { - val getDrawableIndex = indexOfGetDrawableInstruction(this) - val enumOrdinalIndex = indexOfFirstInstructionReversedOrThrow(getDrawableIndex) { - opcode == Opcode.INVOKE_INTERFACE && - getReference()?.returnType == "I" - } - val insertIndex = enumOrdinalIndex + 2 - val insertRegister = getInstruction(insertIndex - 1).registerA - val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "setImageDrawable" - } + 1 + toolBarButtonMethodMatch.let { + val imageResourceIndex = it[2] + val register = it.method.getInstruction(imageResourceIndex).registerA + val jumpIndex = it[-1] + 1 - addInstructionsWithLabels( - insertIndex, - "if-eqz v$insertRegister, :ignore", - ExternalLabel("ignore", getInstruction(jumpIndex)) + it.method.addInstructionsWithLabels( + imageResourceIndex + 1, + "if-eqz v$register, :ignore", + ExternalLabel("ignore", it.method.getInstruction(jumpIndex)), ) } - spoofAppVersionFingerprint.apply { - val startIndex = patternMatch!!.startIndex - val buildOverrideNameRegister = method.getInstruction(startIndex).registerA + spoofAppVersionMethodMatch.let { + val index = it[0] + val register = it.method.getInstruction(index).registerA - method.addInstructions( - startIndex + 1, - """ - invoke-static {v$buildOverrideNameRegister}, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$buildOverrideNameRegister + it.method.addInstructions( + index + 1, """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index a56fa467d5..ec86e1d561 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.layout.startpage -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -13,13 +13,11 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.StringReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeStartPagePatch;" +@Suppress("unused") val changeStartPagePatch = bytecodePatch( name = "Change start page", description = "Adds an option to set which page the app opens in instead of the homepage.", @@ -32,14 +30,14 @@ val changeStartPagePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.startpage.changeStartPagePatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( @@ -50,32 +48,32 @@ val changeStartPagePatch = bytecodePatch( preferences = setOf( ListPreference( key = "revanced_change_start_page", - tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference", ), - SwitchPreference("revanced_change_start_page_always") - ) - ) + SwitchPreference("revanced_change_start_page_always"), + ), + ), ) // Hook browseId. - browseIdFingerprint.method.apply { - val browseIdIndex = indexOfFirstInstructionOrThrow { - getReference()?.string == "FEwhat_to_watch" - } - val browseIdRegister = getInstruction(browseIdIndex).registerA + browseIdMethodMatch.let { + it.method.apply { + val browseIdIndex = it[0] + val browseIdRegister = getInstruction(browseIdIndex).registerA - addInstructions( - browseIdIndex + 1, - """ - invoke-static { v$browseIdRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBrowseId(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$browseIdRegister - """, - ) + addInstructions( + browseIdIndex + 1, + """ + invoke-static { v$browseIdRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBrowseId(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$browseIdRegister + """, + ) + } } // There is no browserId assigned to Shorts and Search. // Just hook the Intent action. - intentActionFingerprint.method.addInstruction( + intentActionMethod.addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->overrideIntentAction(Landroid/content/Intent;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index 0220840203..6c172b1513 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -1,20 +1,21 @@ package app.revanced.patches.youtube.layout.startpage -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode -internal val intentActionFingerprint = fingerprint { - parameters("Landroid/content/Intent;") - strings("has_handled_intent") +internal val BytecodePatchContext.intentActionMethod by gettingFirstMethodDeclaratively( + "has_handled_intent", +) { + parameterTypes("Landroid/content/Intent;") } -internal val browseIdFingerprint = fingerprint { - returns("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") - parameters() - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT, +internal val BytecodePatchContext.browseIdMethodMatch by composingFirstMethod { + returnType("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") + // parameterTypes() // 20.30 and earlier is no parameters. 20.31+ parameter is L. + instructions( + "FEwhat_to_watch"(), + 512L(), + allOf(Opcode.IPUT_OBJECT(), field { type == "Ljava/lang/String;" }), ) - strings("FEwhat_to_watch") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 10ef950970..3b8023f26c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -1,20 +1,20 @@ package app.revanced.patches.youtube.layout.startupshortsreset -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_03_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -22,6 +22,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch;" +@Suppress("unused") val disableResumingShortsOnStartupPatch = bytecodePatch( name = "Disable resuming Shorts on startup", description = "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.", @@ -30,68 +31,64 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.startupshortsreset.disableResumingShortsOnStartupPatch") PreferenceScreen.SHORTS.addPreferences( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - if (is_20_02_or_greater) { - userWasInShortsAlternativeFingerprint.let { + if (is_20_03_or_greater) { + userWasInShortsAlternativeMethodMatch.let { it.method.apply { - val stringIndex = it.stringMatches!!.first().index - val booleanValueIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "booleanValue" - } - val booleanValueRegister = - getInstruction(booleanValueIndex + 1).registerA + val insertIndex = it[2] + 1 + val register = getInstruction(insertIndex).registerA addInstructions( - booleanValueIndex + 2, """ - invoke-static {v$booleanValueRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z - move-result v$booleanValueRegister - """ + insertIndex, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z + move-result v$register + """, ) } } } else { - userWasInShortsLegacyFingerprint.method.apply { + userWasInShortsLegacyMethod.apply { val listenableInstructionIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() opcode == Opcode.INVOKE_INTERFACE && - reference?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - reference.name == "isDone" + getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + getReference()?.name == "isDone" } val freeRegister = findFreeRegister(listenableInstructionIndex) addInstructionsAtControlFlowLabel( listenableInstructionIndex, """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v$freeRegister - if-eqz v$freeRegister, :show + if-eqz v$freeRegister, :show_startup_shorts_player return-void - :show + :show_startup_shorts_player nop - """ + """, ) } } - userWasInShortsConfigFingerprint.method.addInstructions( + userWasInShortsConfigMethod.addInstructions( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z @@ -101,7 +98,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( return v0 :show nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index b1fab6fcb9..931bff6052 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -1,33 +1,46 @@ package app.revanced.patches.youtube.layout.startupshortsreset -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** - * YouTube 20.02.08 ~ + * 20.02+ */ -internal val userWasInShortsAlternativeFingerprint = fingerprint { - returns("V") +internal val BytecodePatchContext.userWasInShortsAlternativeMethodMatch by composingFirstMethod { + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Ljava/lang/Object;") - strings("userIsInShorts: ") + parameterTypes("Ljava/lang/Object;") + instructions( + allOf(Opcode.CHECK_CAST(), type("Ljava/lang/Boolean;")), + after(method { toString() == "Ljava/lang/Boolean;->booleanValue()Z" }), + after(Opcode.MOVE_RESULT()), + // 20.40+ string was merged into another string and is a partial match. + afterAtMost(15, "userIsInShorts: "(String::contains)), + ) } -internal val userWasInShortsLegacyFingerprint = fingerprint { - returns("V") +/** + * Pre 20.02 + */ +internal val BytecodePatchContext.userWasInShortsLegacyMethod by gettingFirstMethodDeclaratively { + returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Ljava/lang/Object;") - strings("Failed to read user_was_in_shorts proto after successful warmup") + parameterTypes("Ljava/lang/Object;") + instructions( + "Failed to read user_was_in_shorts proto after successful warmup"(), + ) } /** * 18.15.40+ */ -internal val userWasInShortsConfigFingerprint = fingerprint { +internal val BytecodePatchContext.userWasInShortsConfigMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { - 45358360L - } + returnType("Z") + parameterTypes() + instructions( + 45358360L(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt deleted file mode 100644 index c04f5e99c7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.tablet - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.layout.formfactor.changeFormFactorPatch - -@Deprecated("Use 'Change form factor' instead.") -val enableTabletLayoutPatch = bytecodePatch { - dependsOn(changeFormFactorPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index 69df831091..c89783668c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -1,22 +1,22 @@ package app.revanced.patches.youtube.layout.theme -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -import app.revanced.util.literal -internal const val GRADIENT_LOADING_SCREEN_AB_CONSTANT = 45412406L - -internal val useGradientLoadingScreenFingerprint = fingerprint { - literal { GRADIENT_LOADING_SCREEN_AB_CONSTANT } +internal val BytecodePatchContext.useGradientLoadingScreenMethodMatch by composingFirstMethod { + instructions(45412406L()) } -internal const val SPLASH_SCREEN_STYLE_FEATURE_FLAG = 269032877L - -internal val splashScreenStyleFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - literal { SPLASH_SCREEN_STYLE_FEATURE_FLAG } - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } +internal val BytecodePatchContext.splashScreenStyleMethodMatch by composingFirstMethod { + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) + name("onCreate") + returnType("V") + parameterTypes("Landroid/os/Bundle;") + instructions( + anyOf( + 1074339245L(), // 20.30+ + 269032877L(), // 20.29 and lower. + ), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt deleted file mode 100644 index a0bd5e7165..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.youtube.layout.theme - -import app.revanced.patcher.patch.bytecodePatch - - -@Deprecated("Function was moved", ReplaceWith("app.revanced.patches.shared.layout.theme.lithoColorOverrideHook")) -@Suppress("unused") -lateinit var lithoColorOverrideHook: (targetMethodClass: String, targetMethodName: String) -> Unit - private set - -@Deprecated("Patch was moved", ReplaceWith("app.revanced.patches.shared.layout.theme.lithoColorHookPatch")) -@Suppress("unused") -val lithoColorHookPatch = bytecodePatch{ - dependsOn(app.revanced.patches.shared.layout.theme.lithoColorHookPatch) - - execute { - lithoColorOverrideHook = app.revanced.patches.shared.layout.theme.lithoColorOverrideHook - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index e6022b0597..dad35b727a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -33,9 +33,9 @@ val themePatch = baseThemePatch( block = { val lightThemeBackgroundColor by stringOption( - key = "lightThemeBackgroundColor", + name = "Light theme background color", default = "@android:color/white", - values = mapOf( + values = mapOf( "White" to "@android:color/white", "Material You" to "@android:color/system_neutral1_50", "Catppuccin (Latte)" to "#E6E9EF", @@ -46,17 +46,16 @@ val themePatch = baseThemePatch( "Light orange" to "#FFE6CC", "Light red" to "#FFD6D6", ), - title = "Light theme background color", - description = THEME_COLOR_OPTION_DESCRIPTION + description = THEME_COLOR_OPTION_DESCRIPTION, ) val themeResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) - execute { + apply { overrideThemeColors( lightThemeBackgroundColor!!, - darkThemeBackgroundColorOption.value!! + darkThemeBackgroundColorOption.value!!, ) fun addColorResource( @@ -73,7 +72,7 @@ val themePatch = baseThemePatch( setAttribute("name", colorName) setAttribute("category", "color") textContent = colorValue - } + }, ) } } @@ -83,12 +82,12 @@ val themePatch = baseThemePatch( addColorResource( "res/values/colors.xml", splashBackgroundColorKey, - lightThemeBackgroundColor!! + lightThemeBackgroundColor!!, ) addColorResource( "res/values-night/colors.xml", splashBackgroundColorKey, - darkThemeBackgroundColorOption.value!! + darkThemeBackgroundColorOption.value!!, ) // Edit splash screen files and change the background color. @@ -98,12 +97,12 @@ val themePatch = baseThemePatch( ).forEach editSplashScreen@{ resourceFileName -> document(resourceFileName).use { document -> document.getElementsByTagName( - "layer-list" + "layer-list", ).item(0).forEachChildElement { node -> if (node.hasAttribute("android:drawable")) { node.setAttribute( "android:drawable", - "@color/$splashBackgroundColorKey" + "@color/$splashBackgroundColorKey", ) return@editSplashScreen } @@ -115,7 +114,7 @@ val themePatch = baseThemePatch( // Fix the splash screen dark mode background color. // In 19.32+ the dark mode splash screen is white and fades to black. - document("res/values-night-v27/styles.xml").use { document -> + document("res/values-night/styles.xml").use { document -> // Create a night mode specific override for the splash screen background. val style = document.createElement("style") style.setAttribute("name", "Theme.YouTube.Home") @@ -149,18 +148,18 @@ val themePatch = baseThemePatch( addResourcesPatch, seekbarColorPatch, baseThemeResourcePatch( - lightColorReplacement = { lightThemeBackgroundColor!! } + lightColorReplacement = { lightThemeBackgroundColor!! }, ), - themeResourcePatch + themeResourcePatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) }, @@ -168,7 +167,7 @@ val themePatch = baseThemePatch( addResources("youtube", "layout.theme.themePatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_gradient_loading_screen") + SwitchPreference("revanced_gradient_loading_screen"), ) val preferences = mutableSetOf( @@ -176,13 +175,13 @@ val themePatch = baseThemePatch( TextPreference( "revanced_seekbar_custom_color_primary", tag = "app.revanced.extension.shared.settings.preference.ColorPickerPreference", - inputType = InputType.TEXT_CAP_CHARACTERS + inputType = InputType.TEXT_CAP_CHARACTERS, ), TextPreference( "revanced_seekbar_custom_color_accent", tag = "app.revanced.extension.shared.settings.preference.ColorPickerPreference", - inputType = InputType.TEXT_CAP_CHARACTERS - ) + inputType = InputType.TEXT_CAP_CHARACTERS, + ), ) PreferenceScreen.SEEKBAR.addPreferences( @@ -190,27 +189,27 @@ val themePatch = baseThemePatch( titleKey = null, sorting = Sorting.UNSORTED, tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", - preferences = preferences - ) + preferences = preferences, + ), ) if (is_19_47_or_greater) { PreferenceScreen.GENERAL_LAYOUT.addPreferences( - ListPreference("revanced_splash_screen_animation_style") + ListPreference("revanced_splash_screen_animation_style"), ) } - useGradientLoadingScreenFingerprint.method.insertLiteralOverride( - GRADIENT_LOADING_SCREEN_AB_CONSTANT, - "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" + useGradientLoadingScreenMethodMatch.method.insertLiteralOverride( + useGradientLoadingScreenMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z", ) if (is_19_47_or_greater) { // Lottie splash screen exists in earlier versions, but it may not be always on. - splashScreenStyleFingerprint.method.insertLiteralOverride( - SPLASH_SCREEN_STYLE_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I" + splashScreenStyleMethodMatch.method.insertLiteralOverride( + splashScreenStyleMethodMatch[0], + "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I", ) } - } + }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index b96330de84..bc4c213cf0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -19,6 +19,7 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/AlternativeThumbnailsPatch;" +@Suppress("unused") val alternativeThumbnailsPatch = bytecodePatch( name = "Alternative thumbnails", description = "Adds options to replace video thumbnails using the DeArrow API or image captures from the video.", @@ -33,14 +34,14 @@ val alternativeThumbnailsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.thumbnails.alternativeThumbnailsPatch") val entries = "revanced_alt_thumbnail_options_entries" @@ -49,27 +50,27 @@ val alternativeThumbnailsPatch = bytecodePatch( ListPreference( key = "revanced_alt_thumbnail_home", entriesKey = entries, - entryValuesKey = values + entryValuesKey = values, ), ListPreference( key = "revanced_alt_thumbnail_subscription", entriesKey = entries, - entryValuesKey = values + entryValuesKey = values, ), ListPreference( key = "revanced_alt_thumbnail_library", entriesKey = entries, - entryValuesKey = values + entryValuesKey = values, ), ListPreference( key = "revanced_alt_thumbnail_player", entriesKey = entries, - entryValuesKey = values + entryValuesKey = values, ), ListPreference( key = "revanced_alt_thumbnail_search", entriesKey = entries, - entryValuesKey = values + entryValuesKey = values, ), NonInteractivePreference( "revanced_alt_thumbnail_dearrow_about", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt index 2e90053831..566a9069c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BypassImageRegionRestrictionsPatch;" +@Suppress("unused") val bypassImageRegionRestrictionsPatch = bytecodePatch( name = "Bypass image region restrictions", description = "Adds an option to use a different host for user avatar and channel images " + @@ -27,14 +28,14 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "layout.thumbnails.bypassImageRegionRestrictionsPatch") PreferenceScreen.MISC.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 25cc81d494..e50b59c3d2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -1,17 +1,18 @@ package app.revanced.patches.youtube.misc.announcements -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/announcements/AnnouncementsPatch;" +@Suppress("unused") val announcementsPatch = bytecodePatch( name = "Announcements", description = "Adds an option to show announcements from ReVanced on app startup.", @@ -23,21 +24,21 @@ val announcementsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.announcements.announcementsPatch") PreferenceScreen.MISC.addPreferences( SwitchPreference("revanced_announcements"), ) - mainActivityOnCreateFingerprint.method.addInstruction( + mainActivityOnCreateMethod.addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->showAnnouncement(Landroid/app/Activity;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/Fingerprints.kt index 5fb44f20fb..7afaec73c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/Fingerprints.kt @@ -1,14 +1,13 @@ package app.revanced.patches.youtube.misc.audiofocus -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.patch.BytecodePatchContext -internal val audioFocusChangeListenerFingerprint = fingerprint { - strings( - "AudioFocus DUCK", - "AudioFocus loss; Will lower volume", - ) -} +internal val BytecodePatchContext.audioFocusChangeListenerMethod by gettingFirstMethod( + "AudioFocus DUCK", + "AudioFocus loss; Will lower volume", +) -internal val audioFocusRequestBuilderFingerprint = fingerprint { - strings("Can't build an AudioFocusRequestCompat instance without a listener") -} +internal val BytecodePatchContext.audioFocusRequestBuilderMethod by gettingFirstMethod( + "Can't build an AudioFocusRequestCompat instance without a listener", +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt index 2f6317d6e3..22689c44ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt @@ -1,10 +1,10 @@ package app.revanced.patches.youtube.misc.audiofocus -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -27,10 +27,10 @@ val pauseOnAudioInterruptPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "20.14.43", - ) + ), ) - execute { + apply { addResources("youtube", "misc.audiofocus.pauseOnAudioInterruptPatch") PreferenceScreen.MISC.addPreferences( @@ -39,10 +39,9 @@ val pauseOnAudioInterruptPatch = bytecodePatch( // Hook the builder method that creates AudioFocusRequest. // At the start, set the willPauseWhenDucked field (b) to true if setting is enabled. - val builderMethod = audioFocusRequestBuilderFingerprint.method - val builderClass = builderMethod.definingClass + val builderClass = audioFocusRequestBuilderMethod.definingClass - builderMethod.addInstructionsWithLabels( + audioFocusRequestBuilderMethod.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldPauseOnAudioInterrupt()Z @@ -51,16 +50,16 @@ val pauseOnAudioInterruptPatch = bytecodePatch( const/4 v0, 0x1 iput-boolean v0, p0, $builderClass->b:Z """, - ExternalLabel("skip_override", builderMethod.getInstruction(0)), + ExternalLabel("skip_override", audioFocusRequestBuilderMethod.getInstruction(0)), ) // Also hook the audio focus change listener as a backup. - audioFocusChangeListenerFingerprint.method.addInstructions( + audioFocusChangeListenerMethod.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->overrideAudioFocusChange(I)I move-result p1 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt deleted file mode 100644 index 655f6d1762..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.autorepeat - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.misc.loopvideo.loopVideoPatch - -@Deprecated("Patch was renamed", ReplaceWith("looVideoPatch")) -val autoRepeatPatch = bytecodePatch { - dependsOn(loopVideoPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt index ae8fe497a8..6b39c04b5d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -1,14 +1,12 @@ package app.revanced.patches.youtube.misc.backgroundplayback -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch @@ -25,51 +23,47 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal var prefBackgroundAndOfflineCategoryId = -1L private set -private val backgroundPlaybackResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch, addResourcesPatch) - - execute { - prefBackgroundAndOfflineCategoryId = resourceMappings["string", "pref_background_and_offline_category"] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BackgroundPlaybackPatch;" -val backgroundPlaybackPatch = bytecodePatch( +@Suppress("unused") +val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( name = "Remove background playback restrictions", description = "Removes restrictions on background playback, including playing kids videos in the background.", ) { dependsOn( - backgroundPlaybackResourcePatch, + resourceMappingPatch, + addResourcesPatch, sharedExtensionPatch, playerTypeHookPatch, videoInformationPatch, settingsPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.backgroundplayback.backgroundPlaybackPatch") PreferenceScreen.SHORTS.addPreferences( SwitchPreference("revanced_shorts_disable_background_playback"), ) + prefBackgroundAndOfflineCategoryId = ResourceType.STRING["pref_background_and_offline_category"] + arrayOf( - backgroundPlaybackManagerFingerprint to "isBackgroundPlaybackAllowed", - backgroundPlaybackManagerShortsFingerprint to "isBackgroundShortsPlaybackAllowed", - ).forEach { (fingerprint, integrationsMethod) -> - fingerprint.method.apply { + backgroundPlaybackManagerMethod to "isBackgroundPlaybackAllowed", + backgroundPlaybackManagerShortsMethod to "isBackgroundShortsPlaybackAllowed", + ).forEach { (method, integrationsMethod) -> + method.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> val register = getInstruction(index).registerA @@ -85,29 +79,32 @@ val backgroundPlaybackPatch = bytecodePatch( } // Enable background playback option in YouTube settings - backgroundPlaybackSettingsFingerprint.originalMethod.apply { + backgroundPlaybackSettingsMethod.apply { val booleanCalls = instructions.withIndex().filter { it.value.getReference()?.returnType == "Z" } val settingsBooleanIndex = booleanCalls.elementAt(1).index - val settingsBooleanMethod by navigate(this).to(settingsBooleanIndex) + + val settingsBooleanMethod = navigate(this).to(settingsBooleanIndex).stop() settingsBooleanMethod.returnEarly(true) } // Force allowing background play for Shorts. - shortsBackgroundPlaybackFeatureFlagFingerprint.method.returnEarly(true) + shortsBackgroundPlaybackFeatureFlagMethod.returnEarly(true) // Force allowing background play for videos labeled for kids. - kidsBackgroundPlaybackPolicyControllerFingerprint.method.returnEarly() + kidsBackgroundPlaybackPolicyControllerMethod.returnEarly() // Fix PiP buttons not working after locking/unlocking device screen. if (is_19_34_or_greater) { - pipInputConsumerFeatureFlagFingerprint.method.insertLiteralOverride( - PIP_INPUT_CONSUMER_FEATURE_FLAG, - false - ) + pipInputConsumerFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + false, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt index a5c077115d..64d6a26d2d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt @@ -1,14 +1,15 @@ package app.revanced.patches.youtube.misc.backgroundplayback -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackManagerFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackManagerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L") + returnType("Z") + parameterTypes("L") opcodes( Opcode.CONST_4, Opcode.IF_EQZ, @@ -38,10 +39,10 @@ internal val backgroundPlaybackManagerFingerprint = fingerprint { ) } -internal val backgroundPlaybackSettingsFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackSettingsMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters() + returnType("Ljava/lang/String;") + parameterTypes() opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, @@ -54,10 +55,10 @@ internal val backgroundPlaybackSettingsFingerprint = fingerprint { literal { prefBackgroundAndOfflineCategoryId } } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val BytecodePatchContext.kidsBackgroundPlaybackPolicyControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("I", "L", "L") + returnType("V") + parameterTypes("I", "L", "L") opcodes( Opcode.CONST_4, Opcode.IF_NE, @@ -71,23 +72,24 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { literal { 5 } } -internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackManagerShortsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L") - literal { 151635310 } + returnType("Z") + parameterTypes("L") + instructions(151635310L()) } -internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.shortsBackgroundPlaybackFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { 45415425 } + returnType("Z") + parameterTypes() + instructions(45415425L()) } -internal const val PIP_INPUT_CONSUMER_FEATURE_FLAG = 45638483L - // Fix 'E/InputDispatcher: Window handle pip_input_consumer has no registered input channel' -internal val pipInputConsumerFeatureFlagFingerprint = fingerprint { - literal { PIP_INPUT_CONSUMER_FEATURE_FLAG} -} \ No newline at end of file +internal val BytecodePatchContext.pipInputConsumerFeatureFlagMethodMatch by composingFirstMethod { + instructions( + // PiP input consumer feature flag. + 45638483L(), + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.kt index 9624721bbd..ffb2451231 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.kt @@ -2,10 +2,10 @@ package app.revanced.patches.youtube.misc.check import app.revanced.patches.shared.misc.checks.checkEnvironmentPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod internal val checkEnvironmentPatch = checkEnvironmentPatch( - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = { mainActivityOnCreateMethod }, extensionPatch = sharedExtensionPatch, "com.google.android.youtube", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index aa9632f250..73e5f30e78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -11,10 +11,10 @@ val enableDebuggingPatch = enableDebuggingPatch( settingsPatch = settingsPatch, compatibleWithPackages = arrayOf( "com.google.android.youtube" to setOf( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", + "20.21.37", + "20.31.40", ) ), hookStringFeatureFlag = true, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt deleted file mode 100644 index 33e188974b..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ /dev/null @@ -1,35 +0,0 @@ -package app.revanced.patches.youtube.misc.debugging - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal val experimentalFeatureFlagParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L", "J", "[B") - strings("Unable to parse proto typed experiment flag: ") -} - -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L", "J", "Z") -} - -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("D") - parameters("J", "D") -} - -internal val experimentalLongFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("J") - parameters("J", "J") -} - -internal val experimentalStringFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("J", "Ljava/lang/String;") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt index 4f99a4cf54..26f87fda7e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt @@ -1,8 +1,15 @@ package app.revanced.patches.youtube.misc.dimensions.spoof -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val deviceDimensionsModelToStringFingerprint = fingerprint { - returns("L") - strings("minh.", ";maxh.") +internal val BytecodePatchContext.deviceDimensionsModelToStringMethod by gettingFirstMethodDeclaratively { + returnType("L") + instructions( + "minh."(), + ";maxh."(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index c43d301d79..934e2049bd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -1,6 +1,8 @@ package app.revanced.patches.youtube.misc.dimensions.spoof -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -12,6 +14,7 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofDeviceDimensionsPatch;" +@Suppress("unused") val spoofDeviceDimensionsPatch = bytecodePatch( name = "Spoof device dimensions", description = "Adds an option to spoof the device dimensions which can unlock higher video qualities.", @@ -24,36 +27,34 @@ val spoofDeviceDimensionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.dimensions.spoof.spoofDeviceDimensionsPatch") PreferenceScreen.MISC.addPreferences( SwitchPreference("revanced_spoof_device_dimensions"), ) - deviceDimensionsModelToStringFingerprint - .classDef.methods.first { method -> method.name == "" } - // Override the parameters containing the dimensions. - .addInstructions( - 1, // Add after super call. - mapOf( - 1 to "MinHeightOrWidth", // p1 = min height - 2 to "MaxHeightOrWidth", // p2 = max height - 3 to "MinHeightOrWidth", // p3 = min width - 4 to "MaxHeightOrWidth", // p4 = max width - ).map { (parameter, method) -> - """ - invoke-static { p$parameter }, $EXTENSION_CLASS_DESCRIPTOR->get$method(I)I - move-result p$parameter - """ - }.joinToString("\n") { it }, - ) + // Override the parameters containing the dimensions. + deviceDimensionsModelToStringMethod.classDef.methods.firstMethod { name == "" }.addInstructions( + 1, // Add after super call. + arrayOf( + 1 to "MinHeightOrWidth", // p1 = min height + 2 to "MaxHeightOrWidth", // p2 = max height + 3 to "MinHeightOrWidth", // p3 = min width + 4 to "MaxHeightOrWidth", // p4 = max width + ).map { (parameter, method) -> + """ + invoke-static { p$parameter }, $EXTENSION_CLASS_DESCRIPTOR->get$method(I)I + move-result p$parameter + """ + }.joinToString("\n") { it }, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index 5bd5da4151..2824056d46 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -1,23 +1,24 @@ package app.revanced.patches.youtube.misc.dns +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.misc.dns.checkWatchHistoryDomainNameResolutionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameResolutionPatch( block = { dependsOn( - sharedExtensionPatch + sharedExtensionPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) }, - mainActivityFingerprint = mainActivityOnCreateFingerprint + getMainActivityMethod = BytecodePatchContext::mainActivityOnCreateMethod::get, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt index 743d1162db..aaeb0eaa4f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt @@ -1,5 +1,8 @@ package app.revanced.patches.youtube.misc.extension.hooks +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE @@ -10,14 +13,12 @@ import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE internal val applicationInitHook = extensionHook { // Does _not_ resolve to the YouTube main activity. // Required as some hooked code runs before the main activity is launched. - strings("Application creation", "Application.onCreate") -} - -internal val applicationInitOnCrateHook = extensionHook { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } + instructions( + "Application.onCreate"(), + "Application creation"(), + ) } +internal val applicationInitOnCrateHook = activityOnCreateExtensionHook( + YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE, +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt index 7877ce7dbf..f3f466007a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt @@ -1,50 +1,31 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val scrollPositionFingerprint = fingerprint { +internal val BytecodePatchContext.scrollPositionMethodMatch by composingFirstMethod("scroll_position") { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returns("V") - parameters("L") + returnType("V") + parameterTypes("L") opcodes( Opcode.IF_NEZ, Opcode.INVOKE_DIRECT, - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ) - strings("scroll_position") } -/** - * Resolves using class found in [recyclerViewTopScrollingParentFingerprint]. - */ -internal val recyclerViewTopScrollingFingerprint = fingerprint { +internal val BytecodePatchContext.recyclerViewTopScrollingMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.CHECK_CAST, - Opcode.CONST_4, - Opcode.INVOKE_VIRTUAL, - Opcode.GOTO, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE - ) -} - -internal val recyclerViewTopScrollingParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - opcodes( - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.CONST_16, - Opcode.INVOKE_VIRTUAL, - Opcode.NEW_INSTANCE, - Opcode.INVOKE_DIRECT, - Opcode.IPUT_OBJECT, - Opcode.RETURN_VOID + returnType("V") + parameterTypes() + instructions( + method { toString() == "Ljava/util/Iterator;->next()Ljava/lang/Object;" }, + after(Opcode.MOVE_RESULT_OBJECT()), + after(allOf(Opcode.CHECK_CAST(), type("Landroid/support/v7/widget/RecyclerView;"))), + after(0L()), + after(method { definingClass == "Landroid/support/v7/widget/RecyclerView;" }), + after(Opcode.GOTO()), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index cf55ed6b56..a8615c1d50 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -1,8 +1,9 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnBackPressedMethod +import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -11,40 +12,36 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/FixBackToExitGesturePatch;" internal val fixBackToExitGesturePatch = bytecodePatch( - description = "Fixes the swipe back to exit gesture." + description = "Fixes the swipe back to exit gesture.", ) { - execute { - recyclerViewTopScrollingFingerprint.match( - recyclerViewTopScrollingParentFingerprint.originalClassDef - ).let { - it.method.addInstruction( - it.patternMatch!!.endIndex, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" + apply { + with(recyclerViewTopScrollingMethodMatch) { + method.addInstructionsAtControlFlowLabel( + recyclerViewTopScrollingMethodMatch[-1] + 1, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V", ) } - scrollPositionFingerprint.let { - navigate(it.originalMethod) - .to(it.patternMatch!!.startIndex + 1) - .stop().apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == - "Landroid/support/v7/widget/RecyclerView;" - } - - addInstruction( - index, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onScrollingViews()V" - ) + with(scrollPositionMethodMatch) { + navigate(immutableMethod).to(scrollPositionMethodMatch[0] + 1).stop().apply { + val index = indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == + "Landroid/support/v7/widget/RecyclerView;" } + + addInstruction( + index, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onScrollingViews()V", + ) + } } - mainActivityOnBackPressedFingerprint.method.apply { + mainActivityOnBackPressedMethod.apply { val index = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID) addInstruction( index, - "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V" + "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt new file mode 100644 index 0000000000..e97c6725d5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt @@ -0,0 +1,35 @@ +package app.revanced.patches.youtube.misc.fix.contentprovider + +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/FixContentProviderPatch;" + +/** + * Fixes crashing for some users with a beta release where the YouTube content provider uses null map values. + * It unknown if this crash can happen on stable releases. + */ +internal val fixContentProviderPatch = bytecodePatch { + dependsOn( + sharedExtensionPatch, + ) + + apply { + unstableContentProviderMethodMatch.let { + val insertIndex = it[0] + + it.method.apply { + val register = getInstruction(insertIndex).registerD + + addInstruction( + insertIndex, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->removeNullMapEntries(Ljava/util/Map;)V", + ) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt new file mode 100644 index 0000000000..ac8772d051 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.misc.fix.contentprovider + +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags + +internal val BytecodePatchContext.unstableContentProviderMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Landroid/content/ContentResolver;", "[Ljava/lang/String;") + instructions( + // Early targets use HashMap and later targets use ConcurrentMap. + method { name == "putAll" && parameterTypes.count() == 1 && parameterTypes.first() == "Ljava/util/Map;" }, + "ContentProvider query returned null cursor"(), + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt deleted file mode 100644 index 89e7cc08f8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch instead.") -@Suppress("unused") -val spoofVideoStreamsPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt deleted file mode 100644 index eb4c9492be..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch instead.") -@Suppress("unused") -val userAgentClientSpoofPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt index d5a255ca5f..728ad0fef0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.youtube.misc.fix.playbackspeed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.custom +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags @@ -12,10 +19,10 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference * This method is usually used to set the initial speed (1.0x) when playback starts from the feed. * For some reason, in the latest YouTube, it is invoked even after the video has already started. */ -internal val playbackSpeedInFeedsFingerprint = fingerprint { +internal val BytecodePatchContext.playbackSpeedInFeedsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") + returnType("V") + parameterTypes("L") opcodes( Opcode.IGET, Opcode.MUL_INT_LIT16, @@ -26,13 +33,12 @@ internal val playbackSpeedInFeedsFingerprint = fingerprint { Opcode.IF_LEZ, Opcode.SUB_LONG_2ADDR, ) - custom { method, _ -> - indexOfGetPlaybackSpeedInstruction(method) >= 0 + custom { + indexOfGetPlaybackSpeedInstruction(this) >= 0 } } -internal fun indexOfGetPlaybackSpeedInstruction(method: Method) = - method.indexOfFirstInstructionReversed { - opcode == Opcode.IGET && - getReference()?.type == "F" - } +internal fun indexOfGetPlaybackSpeedInstruction(method: Method) = method.indexOfFirstInstructionReversed { + opcode == Opcode.IGET && + getReference()?.type == "F" +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt similarity index 84% rename from patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt index b63eec7941..a1b00e22e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.misc.fix.playbackspeed -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater @@ -29,20 +29,19 @@ private const val EXTENSION_CLASS_DESCRIPTOR = * 6. Resume the video * 7. Playback speed will incorrectly change to 1.0x. */ -@Suppress("unused") -val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch{ +val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch { dependsOn( sharedExtensionPatch, playerTypeHookPatch, versionCheckPatch, ) - execute { + apply { if (!is_19_34_or_greater) { - return@execute + return@apply } - playbackSpeedInFeedsFingerprint.method.apply { + playbackSpeedInFeedsMethod.apply { val playbackSpeedIndex = indexOfGetPlaybackSpeedInstruction(this) val playbackSpeedRegister = getInstruction(playbackSpeedIndex).registerA val returnIndex = indexOfFirstInstructionOrThrow(playbackSpeedIndex, Opcode.RETURN_VOID) @@ -56,8 +55,8 @@ val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch{ move-result v$freeRegister if-nez v$freeRegister, :do_not_change """, - ExternalLabel("do_not_change", getInstruction(returnIndex)) + ExternalLabel("do_not_change", getInstruction(returnIndex)), ) } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt index 673fa240a8..6b07ea5bed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt @@ -1,50 +1,23 @@ package app.revanced.patches.youtube.misc.gms -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch;" -internal var ic_offline_no_content_upside_down = -1L - private set -internal var offline_no_content_body_text_not_offline_eligible = -1L - private set - -private val accountCredentialsInvalidTextResourcePatch = resourcePatch { - execute { - ic_offline_no_content_upside_down = resourceMappings[ - "drawable", - "ic_offline_no_content_upside_down" - ] - - offline_no_content_body_text_not_offline_eligible = resourceMappings[ - "string", - "offline_no_content_body_text_not_offline_eligible" - ] - } -} - internal val accountCredentialsInvalidTextPatch = bytecodePatch { dependsOn( sharedExtensionPatch, - accountCredentialsInvalidTextResourcePatch, - addResourcesPatch + addResourcesPatch, ) - execute { + apply { addResources("youtube", "misc.gms.accountCredentialsInvalidTextPatch") // If the user recently changed their account password, @@ -57,27 +30,19 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { // MicroG accounts look almost identical to Google device accounts // and it's more foolproof to instead uninstall/reinstall. arrayOf( - specificNetworkErrorViewControllerFingerprint, - loadingFrameLayoutControllerFingerprint - ).forEach { fingerprint -> - fingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow( - offline_no_content_body_text_not_offline_eligible - ) - val getStringIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - val reference = getReference() - reference?.name == "getString" - } - val register = getInstruction(getStringIndex + 1).registerA + specificNetworkErrorViewControllerMethodMatch, + loadingFrameLayoutControllerMethodMatch, + ).forEach { match -> + val index = match[-1] + val register = match.method.getInstruction(index).registerA - addInstructions( - getStringIndex + 2, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$register - """ - ) - } + match.method.addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """, + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt index 3f4a521df6..78ab4b951d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt @@ -1,27 +1,33 @@ package app.revanced.patches.youtube.misc.gms -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val specificNetworkErrorViewControllerFingerprint = fingerprint { +internal val BytecodePatchContext.specificNetworkErrorViewControllerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.containsLiteralInstruction(ic_offline_no_content_upside_down) - && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) - } + returnType("V") + parameterTypes() + instructions( + ResourceType.DRAWABLE("ic_offline_no_content_upside_down"), + ResourceType.STRING("offline_no_content_body_text_not_offline_eligible"), + method { name == "getString" && returnType == "Ljava/lang/String;" }, + after(Opcode.MOVE_RESULT_OBJECT()), + ) } // It's not clear if this second class is ever used and it may be dead code, -// but it the layout image/text is identical to the network error fingerprint above. -internal val loadingFrameLayoutControllerFingerprint = fingerprint { +// but it the layout image/text is identical to the network error match above. +internal val BytecodePatchContext.loadingFrameLayoutControllerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - custom { method, _ -> - method.containsLiteralInstruction(ic_offline_no_content_upside_down) - && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) - } -} \ No newline at end of file + returnType("V") + parameterTypes("L") + instructions( + ResourceType.DRAWABLE("ic_offline_no_content_upside_down"), + ResourceType.STRING("offline_no_content_body_text_not_offline_eligible"), + method { name == "getString" && returnType == "Ljava/lang/String;" }, + after(Opcode.MOVE_RESULT_OBJECT()), + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 605f904479..e745c28381 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -1,14 +1,15 @@ package app.revanced.patches.youtube.misc.gms +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Option import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.castContextFetchFingerprint +import app.revanced.patches.shared.castContextFetchMethod import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.shared.primeMethodFingerprint +import app.revanced.patches.shared.primeMethod import app.revanced.patches.youtube.layout.buttons.overlay.hidePlayerOverlayButtonsPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.gms.Constants.REVANCED_YOUTUBE_PACKAGE_NAME @@ -16,17 +17,15 @@ import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod @Suppress("unused") val gmsCoreSupportPatch = gmsCoreSupportPatch( fromPackageName = YOUTUBE_PACKAGE_NAME, toPackageName = REVANCED_YOUTUBE_PACKAGE_NAME, - primeMethodFingerprint = primeMethodFingerprint, - earlyReturnFingerprints = setOf( - castContextFetchFingerprint, - ), - mainActivityOnCreateFingerprintToInsertIndex = mainActivityOnCreateFingerprint to { 0 }, + getPrimeMethod = BytecodePatchContext::primeMethod::get, + getEarlyReturnMethods = setOf(BytecodePatchContext::castContextFetchMethod::get), + getMainActivityOnCreateMethodToGetInsertIndex = BytecodePatchContext::mainActivityOnCreateMethod::get to { 0 }, extensionPatch = sharedExtensionPatch, gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch, ) { @@ -37,10 +36,10 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( compatibleWith( YOUTUBE_PACKAGE_NAME( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", + "20.21.37", + "20.31.40", ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt index 4977ea644b..95f7b428e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.misc.hapticfeedback -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference @@ -26,14 +26,14 @@ val disableHapticFeedbackPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.hapticfeedback.disableHapticFeedbackPatch") PreferenceScreen.PLAYER.addPreferences( @@ -44,28 +44,26 @@ val disableHapticFeedbackPatch = bytecodePatch( SwitchPreference("revanced_disable_haptic_feedback_precise_seeking"), SwitchPreference("revanced_disable_haptic_feedback_seek_undo"), SwitchPreference("revanced_disable_haptic_feedback_zoom"), - ) - ) + ), + ), ) arrayOf( - markerHapticsFingerprint to "disableChapterVibrate", - scrubbingHapticsFingerprint to "disablePreciseSeekingVibrate", - seekUndoHapticsFingerprint to "disableSeekUndoVibrate", - zoomHapticsFingerprint to "disableZoomVibrate" - ).forEach { (fingerprint, methodName) -> - fingerprint.method.apply { - addInstructionsWithLabels( - 0, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z - move-result v0 - if-eqz v0, :vibrate - return-void - """, - ExternalLabel("vibrate", getInstruction(0)) - ) - } + markerHapticsMethod to "disableChapterVibrate", + scrubbingHapticsMethod to "disablePreciseSeekingVibrate", + seekUndoHapticsMethod to "disableSeekUndoVibrate", + zoomHapticsMethod to "disableZoomVibrate", + ).forEach { (method, methodName) -> + method.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z + move-result v0 + if-eqz v0, :vibrate + return-void + """, + ExternalLabel("vibrate", method.getInstruction(0)), + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt index 13efc46931..f37729e3d1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt @@ -1,23 +1,28 @@ package app.revanced.patches.youtube.misc.hapticfeedback -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val markerHapticsFingerprint = fingerprint { - returns("V") - strings("Failed to execute markers haptics vibrate.") +internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to execute markers haptics vibrate.", +) { + returnType("V") } -internal val scrubbingHapticsFingerprint = fingerprint { - returns("V") - strings("Failed to haptics vibrate for fine scrubbing.") +internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to haptics vibrate for fine scrubbing.", +) { + returnType("V") } -internal val seekUndoHapticsFingerprint = fingerprint { - returns("V") - strings("Failed to execute seek undo haptics vibrate.") +internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to execute seek undo haptics vibrate.", +) { + returnType("V") } -internal val zoomHapticsFingerprint = fingerprint { - returns("V") - strings("Failed to haptics vibrate for video zoom") +internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to haptics vibrate for video zoom", +) { + returnType("V") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index b9292ef84b..91b2192276 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -1,11 +1,13 @@ package app.revanced.patches.youtube.misc.imageurlhook -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.util.getReference import com.android.tools.smali.dexlib2.AccessFlags @@ -29,19 +31,15 @@ val cronetImageUrlHookPatch = bytecodePatch( ) { dependsOn(sharedExtensionPatch) - execute { - loadImageUrlMethod = messageDigestImageUrlFingerprint - .match(messageDigestImageUrlParentFingerprint.originalClassDef).method + apply { - loadImageSuccessCallbackMethod = onSucceededFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method - - loadImageErrorCallbackMethod = onFailureFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method + loadImageUrlMethod = messageDigestImageUrlParentMethod.immutableClassDef.getMessageDigestImageUrlMethod() + loadImageSuccessCallbackMethod = onResponseStartedMethod.immutableClassDef.getOnSucceededMethod() + loadImageErrorCallbackMethod = onResponseStartedMethod.immutableClassDef.getOnFailureMethod() // The URL is required for the failure callback hook, but the URL field is obfuscated. // Add a helper get method that returns the URL field. - val urlFieldInstruction = requestFingerprint.method.instructions.first { + val urlFieldInstruction = requestMethod.instructions.first { val reference = it.getReference() it.opcode == Opcode.IPUT_OBJECT && reference?.type == "Ljava/lang/String;" } as ReferenceInstruction @@ -49,7 +47,7 @@ val cronetImageUrlHookPatch = bytecodePatch( val urlFieldName = (urlFieldInstruction.reference as FieldReference).name val definingClass = CRONET_URL_REQUEST_CLASS_DESCRIPTOR val addedMethodName = "getHookedUrl" - requestFingerprint.classDef.methods.add( + requestMethod.classDef.methods.add( ImmutableMethod( definingClass, addedMethodName, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index fcd5298acf..29d69d9a80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -1,64 +1,64 @@ package app.revanced.patches.youtube.misc.imageurlhook -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val onFailureFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getOnFailureMethod() = firstMethodDeclaratively { + name("onFailed") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters( + returnType("V") + parameterTypes( "Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;", - "Lorg/chromium/net/CronetException;" + "Lorg/chromium/net/CronetException;", ) - custom { method, _ -> - method.name == "onFailed" - } } -// Acts as a parent fingerprint. -internal val onResponseStartedFingerprint = fingerprint { +// Acts as a parent method. +internal val BytecodePatchContext.onResponseStartedMethod by gettingFirstMethodDeclaratively( + "Content-Length", + "Content-Type", + "identity", + "application/x-protobuf", +) { + name("onResponseStarted") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") - strings( - "Content-Length", - "Content-Type", - "identity", - "application/x-protobuf", - ) - custom { method, _ -> - method.name == "onResponseStarted" - } + returnType("V") + parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") } -internal val onSucceededFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getOnSucceededMethod() = firstMethodDeclaratively { + name("onSucceeded") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") - custom { method, _ -> - method.name == "onSucceeded" - } + returnType("V") + parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") } internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val requestFingerprint = fingerprint { +internal val BytecodePatchContext.requestMethod by gettingFirstMethodDeclaratively { + definingClass(CRONET_URL_REQUEST_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - custom { _, classDef -> - classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR - } } -internal val messageDigestImageUrlFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMessageDigestImageUrlMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Ljava/lang/String;", "L") + parameterTypes("Ljava/lang/String;", "L") } -internal val messageDigestImageUrlParentFingerprint = fingerprint { +internal val BytecodePatchContext.messageDigestImageUrlParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters() - strings("@#&=*+-_.,:!?()/~'%;\$") + returnType("Ljava/lang/String;") + parameterTypes() + instructions( + anyOf( + string { equals("@#&=*+-_.,:!?()/~'%;$") }, + string { equals("@#&=*+-_.,:!?()/~'%;$[]") }, // 20.38+ + ), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 8d663ff2df..99f4a9f2cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -1,24 +1,20 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.misc.playservice.is_20_37_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" + +@Suppress("unused") val bypassURLRedirectsPatch = bytecodePatch( name = "Bypass URL redirects", description = "Adds an option to bypass URL redirects and open the original URL directly.", @@ -27,60 +23,40 @@ val bypassURLRedirectsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.links.bypassURLRedirectsPatch") PreferenceScreen.MISC.addPreferences( SwitchPreference("revanced_bypass_url_redirects"), ) - val fingerprints = if (is_19_33_or_greater) { - arrayOf( - abUriParserFingerprint, - httpUriParserFingerprint, - ) - } else { - arrayOf( - abUriParserLegacyFingerprint, - httpUriParserLegacyFingerprint, - ) - } + arrayOf( + if (is_20_37_or_greater) { + (abUriParserMethodMatch to 2) + } else { + (abUriParserLegacyMethodMatch to 2) + }, + httpUriParserMethodMatch to 0, + ).forEach { (match, index) -> + val insertIndex = match[index] + val uriStringRegister = match.method.getInstruction(insertIndex).registerC - fingerprints.forEach { - it.method.apply { - val insertIndex = findUriParseIndex() - val uriStringRegister = getInstruction(insertIndex).registerC - - replaceInstruction( - insertIndex, - "invoke-static {v$uriStringRegister}," + - "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" + - "->" + - "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", - ) - } + match.method.replaceInstruction( + insertIndex, + "invoke-static { v$uriStringRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", + ) } } } - -internal fun Method.findUriParseIndex() = indexOfFirstInstruction { - val reference = getReference() - reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" -} - -internal fun Method.findWebViewCheckCastIndex() = indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.CHECK_CAST && reference?.type?.endsWith("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;") == true -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 6f231693bd..bea03da447 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,68 +1,48 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode /** - * Target 19.33+ + * 20.36 and lower. */ -internal val abUriParserFingerprint = fingerprint { +internal val BytecodePatchContext.abUriParserLegacyMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - custom { method, _ -> - method.findUriParseIndex() >= 0 && method.findWebViewCheckCastIndex() >= 0 - } + returnType("Ljava/lang/Object;") + parameterTypes("Ljava/lang/Object;") + instructions( + "Found entityKey=`"(), + "that does not contain a PlaylistVideoEntityId"(String::contains), + method { toString() == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, + ) } /** - * Target 19.33+ + * 20.37+ */ -internal val httpUriParserFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - strings("https", "://", "https:") - custom { methodDef, _ -> - methodDef.findUriParseIndex() >= 0 - } -} - -internal val abUriParserLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.abUriParserMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - opcodes( - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, + returnType("Ljava/lang/Object;") + parameterTypes("Ljava/lang/Object;") + instructions( + // Method is a switch statement of unrelated code, + // and there's no strings or anything unique to match to. + method { toString() == "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;" }, + method { toString() == "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;" }, + method { toString() == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, + method { toString() == "Ljava/util/List;->get(I)Ljava/lang/Object;" }, ) - custom { methodDef, classDef -> - // This method is always called "a" because this kind of class always has a single (non-synthetic) method. - - if (methodDef.name != "a") return@custom false - - val count = classDef.methods.count() - count == 2 || count == 3 - } } -internal val httpUriParserLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.httpUriParserMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - opcodes( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, + returnType("Landroid/net/Uri;") + parameterTypes("Ljava/lang/String;") + instructions( + method { toString() == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, + "https"(), + "://"(), + "https:"(), ) - strings("://") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 71916ecfb0..6132801071 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.transformation.transformInstructionsPatch @@ -10,6 +10,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.StringReference +@Suppress("unused") val openLinksExternallyPatch = bytecodePatch( name = "Open links externally", description = "Adds an option to always open links in your browser instead of the in-app browser.", @@ -41,14 +42,14 @@ val openLinksExternallyPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.links.openLinksExternallyPatch") PreferenceScreen.MISC.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index 9c97c58816..aab6d49715 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -1,19 +1,18 @@ package app.revanced.patches.youtube.misc.litho.filter -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.lithoComponentNameUpbFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { 45631264L } + returnType("Z") + parameterTypes() + instructions(45631264L()) } -internal val lithoConverterBufferUpbFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L") - literal { 45419603L } +internal val BytecodePatchContext.lithoConverterBufferUpbFeatureFlagMethodMatch by composingFirstMethod { + returnType("L") + instructions(45419603L()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index f2a7dce18c..be87c62780 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -2,69 +2,73 @@ package app.revanced.patches.youtube.misc.litho.filter -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.youtube.shared.conversionContextToStringMethod +import app.revanced.patches.shared.misc.litho.filter.EXTENSION_CLASS_DESCRIPTOR import app.revanced.patches.shared.misc.litho.filter.lithoFilterPatch -import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.shared.conversionContextFingerprintToString +import app.revanced.patches.shared.misc.litho.filter.protobufBufferReferenceLegacyMethod +import app.revanced.patches.shared.misc.litho.filter.protobufBufferReferenceMethodMatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.* import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.insertLiteralOverride +import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Deprecated("Use the shared one instead", ReplaceWith("app.revanced.patches.shared.misc.litho.filter.addLithoFilter")) -lateinit var addLithoFilter: (String) -> Unit - private set val lithoFilterPatch = lithoFilterPatch( componentCreateInsertionIndex = { if (is_19_17_or_greater) { indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) } else { - // 19.16 clobbers p2 so must check at start of the method + // 19.16 clobbers p2 so must check at start of the method and not at the return index. 0 } }, - conversionContextFingerprintToString = conversionContextFingerprintToString, - executeBlock = BytecodePatchContext::executeBlock, -) { - dependsOn(versionCheckPatch) -} - -private fun BytecodePatchContext.executeBlock() { - // region A/B test of new Litho native code. - - // Turn off native code that handles litho component names. If this feature is on then nearly - // all litho components have a null name and identifier/path filtering is completely broken. - // - // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), - // but if the flag is forced on then litho filtering still works correctly. - if (is_19_25_or_greater && !is_20_05_or_greater) { - lithoComponentNameUpbFeatureFlagFingerprint.method.apply { - // Don't use return early, so the debug patch logs if this was originally on. - val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) - val register = getInstruction(insertIndex).registerA - - addInstruction(insertIndex, "const/4 v$register, 0x0") + insertProtobufHook = { + if (is_20_22_or_greater) { + // Hook method that bridges between UPB buffer native code and FB Litho. + // Method is found in 19.25+, but is forcefully turned off for 20.21 and lower. + protobufBufferReferenceMethodMatch.let { + // Hook the buffer after the call to jniDecode(). + it.method.addInstruction( + it[-1] + 1, + "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer([B)V", + ) + } } + + // Legacy non-native buffer. + protobufBufferReferenceLegacyMethod.addInstruction( + 0, + "invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V", + ) + }, + getConversionContextToStringMethod = BytecodePatchContext::conversionContextToStringMethod::get, + getExtractIdentifierFromBuffer = { is_20_21_or_greater }, + executeBlock = { + // region A/B test of new Litho native code. + + // Turn off native code that handles litho component names. If this feature is on then nearly + // all litho components have a null name and identifier/path filtering is completely broken. + // + // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), + // but if the flag is forced on then litho filtering still works correctly. + if (is_19_25_or_greater && !is_20_05_or_greater) { + lithoComponentNameUpbFeatureFlagMethod.returnLate(false) + } + + // Turn off a feature flag that enables native code of protobuf parsing (Upb protobuf). + lithoConverterBufferUpbFeatureFlagMethodMatch.let { + // 20.22 the flag is still enabled in one location, but what it does is not known. + // Disable it anyway. + it.method.insertLiteralOverride( + it[0], + false, + ) + } + // endregion } - - // Turn off a feature flag that enables native code of protobuf parsing (Upb protobuf). - // If this is enabled, then the litho protobuffer hook will always show an empty buffer - // since it's no longer handled by the hooked Java code. - lithoConverterBufferUpbFeatureFlagFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA - - addInstruction(index + 1, "const/4 v$register, 0x0") - } - - // endregion - - // Set the addLithoFilter function to the one from the shared patch. - // This is done for backwards compatibility. - addLithoFilter = app.revanced.patches.shared.misc.litho.filter.addLithoFilter +) { + dependsOn(sharedExtensionPatch, versionCheckPatch) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt new file mode 100644 index 0000000000..388a54e5d5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.misc.loopvideo + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.AccessFlags + +internal val BytecodePatchContext.videoStartPlaybackMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + instructions( + "play() called when the player wasn't loaded."(), + "play() blocked because Background Playability failed"(), + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt index bd5feee5a5..1c70aa973c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt @@ -7,14 +7,15 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.loopvideo.button.loopVideoButtonPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.shared.loopVideoFingerprint -import app.revanced.patches.youtube.shared.loopVideoParentFingerprint +import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/LoopVideoPatch;" +@Suppress("ObjectPropertyName") val loopVideoPatch = bytecodePatch( name = "Loop video", description = "Adds an option to loop videos and display loop video button in the video player.", @@ -22,28 +23,30 @@ val loopVideoPatch = bytecodePatch( dependsOn( sharedExtensionPatch, addResourcesPatch, - loopVideoButtonPatch + loopVideoButtonPatch, + videoInformationPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "misc.loopvideo.loopVideoPatch") PreferenceScreen.MISC.addPreferences( SwitchPreference("revanced_loop_video"), ) - loopVideoFingerprint.match(loopVideoParentFingerprint.originalClassDef).method.apply { - val playMethod = loopVideoParentFingerprint.method - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN_VOID) + videoEndMethod.apply { + // Add call to start playback again, but must not allow exit fullscreen patch call + // to be reached if the video is looped. + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.INVOKE_VIRTUAL) + 1 addInstructionsAtControlFlowLabel( insertIndex, @@ -51,10 +54,11 @@ val loopVideoPatch = bytecodePatch( invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldLoopVideo()Z move-result v0 if-eqz v0, :do_not_loop - invoke-virtual { p0 }, $playMethod + invoke-virtual { p0 }, $videoStartPlaybackMethod + return-void :do_not_loop nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/button/LoopVideoButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/button/LoopVideoButtonPatch.kt index 0c3b9dc68b..62ce94750c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/button/LoopVideoButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/button/LoopVideoButtonPatch.kt @@ -15,7 +15,7 @@ import app.revanced.util.copyResources private val loopVideoButtonResourcePatch = resourcePatch { dependsOn(playerControlsResourcePatch) - execute { + apply { copyResources( "loopvideobutton", ResourceGroup( @@ -43,7 +43,7 @@ internal val loopVideoButtonPatch = bytecodePatch( playerControlsPatch, ) - execute { + apply { addResources("youtube", "misc.loopvideo.button.loopVideoButtonPatch") PreferenceScreen.PLAYER.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index a5fa0ed5e2..b1a3dbc82f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -1,123 +1,147 @@ package app.revanced.patches.youtube.misc.navigation -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val actionBarSearchResultsFingerprint = fingerprint { +internal val BytecodePatchContext.actionBarSearchResultsMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - literal { actionBarSearchResultsViewMicId } + returnType("Landroid/view/View;") + instructions( + ResourceType.LAYOUT("action_bar_search_results_view_mic"), + method("setLayoutDirection"), + ) } -internal val toolbarLayoutFingerprint = fingerprint { +internal val BytecodePatchContext.toolbarLayoutMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PROTECTED, AccessFlags.CONSTRUCTOR) - literal { toolbarContainerId } + instructions( + ResourceType.ID("toolbar_container"), + allOf( + Opcode.CHECK_CAST(), + type("Lcom/google/android/apps/youtube/app/ui/actionbar/MainCollapsingToolbarLayout;"), + ), + ) } /** * Matches to https://android.googlesource.com/platform/frameworks/support/+/9eee6ba/v7/appcompat/src/android/support/v7/widget/Toolbar.java#963 */ -internal val appCompatToolbarBackButtonFingerprint = fingerprint { +internal val BytecodePatchContext.appCompatToolbarBackButtonMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("Landroid/support/v7/widget/Toolbar;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/graphics/drawable/Drawable;") - parameters() - custom { methodDef, classDef -> - classDef.type == "Landroid/support/v7/widget/Toolbar;" - } + returnType("Landroid/graphics/drawable/Drawable;") + parameterTypes() } /** - * Matches to the class found in [pivotBarConstructorFingerprint]. + * Matches to the class found in [pivotBarConstructorMethod]. */ -internal val initializeButtonsFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getInitializeButtonsMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - literal { imageOnlyTabResourceId } + returnType("V") + instructions(ResourceType.LAYOUT("image_only_tab")) } /** * Extension method, used for callback into to other patches. * Specifically, [navigationButtonsPatch]. */ -internal val navigationBarHookCallbackFingerprint = fingerprint { +internal val BytecodePatchContext.navigationBarHookCallbackMethod by gettingFirstMethodDeclaratively { + name("navigationTabCreatedCallback") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("V") - parameters(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") - custom { method, _ -> - method.name == "navigationTabCreatedCallback" && - method.definingClass == EXTENSION_CLASS_DESCRIPTOR - } + returnType("V") + parameterTypes(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") } /** * Matches to the Enum class that looks up ordinal -> instance. */ -internal val navigationEnumFingerprint = fingerprint { +internal val BytecodePatchContext.navigationEnumMethod by gettingFirstImmutableMethodDeclaratively( + "PIVOT_HOME", + "TAB_SHORTS", + "CREATION_TAB_LARGE", + "PIVOT_SUBSCRIPTIONS", + "TAB_ACTIVITY", + "VIDEO_LIBRARY_WHITE", + "INCOGNITO_CIRCLE", + "UNKNOWN", // Required to distinguish from patch extension class. +) { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings( - "PIVOT_HOME", - "TAB_SHORTS", - "CREATION_TAB_LARGE", - "PIVOT_SUBSCRIPTIONS", - "TAB_ACTIVITY", - "VIDEO_LIBRARY_WHITE", - "INCOGNITO_CIRCLE", +} + +internal val BytecodePatchContext.pivotBarButtonsCreateDrawableViewMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + custom { + // Only one view creation method has a Drawable parameter. + parameterTypes.firstOrNull() == "Landroid/graphics/drawable/Drawable;" + } +} + +internal val BytecodePatchContext.pivotBarButtonsCreateResourceStyledViewMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + parameterTypes("L", "Z", "I", "L") +} + +/** + * 20.21+ + */ +internal val BytecodePatchContext.pivotBarButtonsCreateResourceIntViewMethod by gettingFirstImmutableMethodDeclaratively { + definingClass("Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + custom { + // Only one view creation method has an int first parameter. + parameterTypes.firstOrNull() == "I" + } +} + +internal val BytecodePatchContext.pivotBarButtonsViewSetSelectedMethodMatch by composingFirstMethod { + definingClass("Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("I", "Z") + instructions(method("setSelected")) +} + +internal val BytecodePatchContext.pivotBarConstructorMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions("com.google.android.apps.youtube.app.endpoint.flags"()) +} + +internal val BytecodePatchContext.imageEnumConstructorMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) + instructions( + "TAB_ACTIVITY_CAIRO"(), + after(Opcode.INVOKE_DIRECT()), + after(Opcode.SPUT_OBJECT()), ) } -internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - custom { method, _ -> - method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" && - // Only one method has a Drawable parameter. - method.parameterTypes.firstOrNull() == "Landroid/graphics/drawable/Drawable;" - } -} - -internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - parameters("L", "Z", "I", "L") - custom { method, _ -> - method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" - } -} - -internal fun indexOfSetViewSelectedInstruction(method: Method) = method.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setSelected" -} - -internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("I", "Z") - custom { method, _ -> - indexOfSetViewSelectedInstruction(method) >= 0 && - method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" - } -} - -internal val pivotBarConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - strings("com.google.android.apps.youtube.app.endpoint.flags") -} - -internal val imageEnumConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings("TAB_ACTIVITY_CAIRO") -} - -internal val setEnumMapFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { - ytFillBellId - } +internal val BytecodePatchContext.setEnumMapMethodMatch by composingFirstMethod { + instructions( + ResourceType.DRAWABLE("yt_fill_bell_black_24"), + afterAtMost( + 10, + method { toString() == "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;" }), + afterAtMost( + 10, + method { toString() == "Ljava/util/EnumMap;->put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;" }, + ), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 083fdf2e2e..8e7651635c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -1,25 +1,26 @@ package app.revanced.patches.youtube.misc.navigation -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.reference +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater -import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.patches.youtube.misc.playservice.* +import app.revanced.patches.youtube.shared.mainActivityOnBackPressedMethod +import app.revanced.util.ResourceGroup +import app.revanced.util.copyResources +import app.revanced.util.findFreeRegister import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -27,49 +28,43 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.util.MethodUtil - -internal var imageOnlyTabResourceId = -1L - private set -internal var actionBarSearchResultsViewMicId = -1L - private set -internal var ytFillBellId = -1L - private set -internal var toolbarContainerId = -1L - private set - -private val navigationBarHookResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - imageOnlyTabResourceId = resourceMappings["layout", "image_only_tab"] - actionBarSearchResultsViewMicId = resourceMappings["layout", "action_bar_search_results_view_mic"] - ytFillBellId = resourceMappings["drawable", "yt_fill_bell_black_24"] - toolbarContainerId = resourceMappings["id", "toolbar_container"] - } -} +import java.util.logging.Logger internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/shared/NavigationBar;" internal const val EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR = - "Lapp/revanced/extension/youtube/shared/NavigationBar\$NavigationButton;" + $$"Lapp/revanced/extension/youtube/shared/NavigationBar$NavigationButton;" private const val EXTENSION_TOOLBAR_INTERFACE = - "Lapp/revanced/extension/youtube/shared/NavigationBar${'$'}AppCompatToolbarPatchInterface;" + $$"Lapp/revanced/extension/youtube/shared/NavigationBar$AppCompatToolbarPatchInterface;" lateinit var hookNavigationButtonCreated: (String) -> Unit val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navigation or search bar.") { dependsOn( sharedExtensionPatch, - navigationBarHookResourcePatch, + versionCheckPatch, playerTypeHookPatch, // Required to detect the search bar in all situations. + resourceMappingPatch, // Used to find methods + resourcePatch { + // Copy missing notification icon. + apply { + copyResources( + "navigationbuttons", + ResourceGroup( + "drawable", + "revanced_fill_bell_cairo_black_24.xml", + ), + ) + } + }, ) - execute { - fun MutableMethod.addHook(hook: Hook, insertPredicate: Instruction.() -> Boolean) { + apply { + fun MutableMethod.addHook(hook: NavigationHook, insertPredicate: Instruction.() -> Boolean) { val filtered = instructions.filter(insertPredicate) if (filtered.isEmpty()) throw PatchException("Could not find insert indexes") filtered.forEach { @@ -84,34 +79,42 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - initializeButtonsFingerprint.match(pivotBarConstructorFingerprint.originalClassDef).method.apply { + pivotBarConstructorMethod.immutableClassDef.getInitializeButtonsMethod().apply { // Hook the current navigation bar enum value. Note, the 'You' tab does not have an enum value. - val navigationEnumClassName = navigationEnumFingerprint.classDef.type - addHook(Hook.SET_LAST_APP_NAVIGATION_ENUM) { + val navigationEnumClassName = navigationEnumMethod.classDef.type + addHook(NavigationHook.SET_LAST_APP_NAVIGATION_ENUM) { opcode == Opcode.INVOKE_STATIC && getReference()?.definingClass == navigationEnumClassName } // Hook the creation of navigation tab views. - val drawableTabMethod = pivotBarButtonsCreateDrawableViewFingerprint.method - addHook(Hook.NAVIGATION_TAB_LOADED) predicate@{ + val drawableTabMethod = pivotBarButtonsCreateDrawableViewMethod + addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, drawableTabMethod, ) } - val imageResourceTabMethod = pivotBarButtonsCreateResourceViewFingerprint.originalMethod - addHook(Hook.NAVIGATION_IMAGE_RESOURCE_TAB_LOADED) predicate@{ + if (is_20_21_or_greater && !is_20_28_or_greater) { + addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ + MethodUtil.methodSignaturesMatch( + getReference() ?: return@predicate false, + pivotBarButtonsCreateResourceIntViewMethod, + ) + } + } + + addHook(NavigationHook.NAVIGATION_IMAGE_RESOURCE_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, - imageResourceTabMethod, + pivotBarButtonsCreateResourceStyledViewMethod, ) } } - pivotBarButtonsViewSetSelectedFingerprint.method.apply { - val index = indexOfSetViewSelectedInstruction(this) + pivotBarButtonsViewSetSelectedMethodMatch.method.apply { + val index = pivotBarButtonsViewSetSelectedMethodMatch[0] val instruction = getInstruction(index) val viewRegister = instruction.registerC val isSelectedRegister = instruction.registerD @@ -125,7 +128,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Hook onto back button pressed. Needed to fix race problem with // Litho filtering based on navigation tab before the tab is updated. - mainActivityOnBackPressedFingerprint.method.addInstruction( + mainActivityOnBackPressedMethod.addInstruction( 0, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V", ) @@ -135,113 +138,104 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Two different layouts are used at the hooked code. // Insert before the first ViewGroup method call after inflating, // so this works regardless which layout is used. - actionBarSearchResultsFingerprint.method.apply { - val searchBarResourceId = indexOfFirstLiteralInstructionOrThrow( - actionBarSearchResultsViewMicId, - ) + actionBarSearchResultsMethodMatch.let { + it.method.apply { + val instructionIndex = it[-1] + val viewRegister = getInstruction(instructionIndex).registerC - val instructionIndex = indexOfFirstInstructionOrThrow(searchBarResourceId) { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setLayoutDirection" - } - - val viewRegister = getInstruction(instructionIndex).registerC - - addInstruction( - instructionIndex, - "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", - ) - } - - // Hook the back button visibility. - - toolbarLayoutFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.CHECK_CAST && getReference()?.type == - "Lcom/google/android/apps/youtube/app/ui/actionbar/MainCollapsingToolbarLayout;" - } - val register = getInstruction(index).registerA - - addInstruction( - index + 1, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V" - ) - } - - // Add interface for extensions code to call obfuscated methods. - appCompatToolbarBackButtonFingerprint.let { - it.classDef.apply { - interfaces.add(EXTENSION_TOOLBAR_INTERFACE) - - val definingClass = type - val obfuscatedMethodName = it.originalMethod.name - val returnType = "Landroid/graphics/drawable/Drawable;" - - methods.add( - ImmutableMethod( - definingClass, - "patch_getNavigationIcon", - listOf(), - returnType, - AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, - null, - null, - MutableMethodImplementation(2), - ).toMutable().apply { - addInstructions( - 0, - """ - invoke-virtual { p0 }, $definingClass->$obfuscatedMethodName()$returnType - move-result-object v0 - return-object v0 - """ - ) - } + addInstruction( + instructionIndex, + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", ) } } + // Hook the back button visibility. + + toolbarLayoutMethodMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA + + addInstruction( + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V", + ) + } + } + + // Add interface for extensions code to call obfuscated methods. + appCompatToolbarBackButtonMethod.classDef.apply { + interfaces.add(EXTENSION_TOOLBAR_INTERFACE) + + val definingClass = type + val obfuscatedMethodName = appCompatToolbarBackButtonMethod.name + val returnType = "Landroid/graphics/drawable/Drawable;" + + methods.add( + ImmutableMethod( + definingClass, + "patch_getNavigationIcon", + listOf(), + returnType, + AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, + null, + null, + MutableMethodImplementation(2), + ).toMutable().apply { + addInstructions( + 0, + """ + invoke-virtual { p0 }, $definingClass->$obfuscatedMethodName()$returnType + move-result-object v0 + return-object v0 + """, + ) + }, + ) + } + hookNavigationButtonCreated = { extensionClassDescriptor -> - navigationBarHookCallbackFingerprint.method.addInstruction( + navigationBarHookCallbackMethod.addInstruction( 0, "invoke-static { p0, p1 }, $extensionClassDescriptor->navigationTabCreated" + "(${EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR}Landroid/view/View;)V", ) } + if (is_20_39_or_greater) { + return@apply Logger.getLogger(this::class.java.name).warning( + "20.39+ Navigation tab activity button selected state is not yet fixed.", + ) + } + // Fix YT bug of notification tab missing the filled icon. - if (is_19_35_or_greater) { - val cairoNotificationEnumReference = with(imageEnumConstructorFingerprint) { - val stringIndex = stringMatches!!.first().index - val cairoNotificationEnumIndex = method.indexOfFirstInstructionOrThrow(stringIndex) { - opcode == Opcode.SPUT_OBJECT - } - method.getInstruction(cairoNotificationEnumIndex).reference - } + if (is_19_35_or_greater && !is_20_39_or_greater) { // FIXME: 20.39+ needs this fix. + val cairoNotificationEnumReference = + imageEnumConstructorMethodMatch.method.getInstruction(imageEnumConstructorMethodMatch[-1]).reference - setEnumMapFingerprint.method.apply { - val enumMapIndex = indexOfFirstInstructionReversedOrThrow { - val reference = getReference() - opcode == Opcode.INVOKE_VIRTUAL && - reference?.definingClass == "Ljava/util/EnumMap;" && - reference.name == "put" && - reference.parameterTypes.firstOrNull() == "Ljava/lang/Enum;" - } - val instruction = getInstruction(enumMapIndex) + setEnumMapMethodMatch.apply { + val setEnumIntegerIndex = setEnumMapMethodMatch[-1] + method.apply { + val enumMapRegister = getInstruction(setEnumIntegerIndex).registerC + val insertIndex = setEnumIntegerIndex + 1 + val freeRegister = findFreeRegister(insertIndex, enumMapRegister) - addInstructions( - enumMapIndex + 1, - """ - sget-object v${instruction.registerD}, $cairoNotificationEnumReference - invoke-static { v${instruction.registerC}, v${instruction.registerD} }, $EXTENSION_CLASS_DESCRIPTOR->setCairoNotificationFilledIcon(Ljava/util/EnumMap;Ljava/lang/Enum;)V - """ - ) + addInstructions( + insertIndex, + """ + sget-object v$freeRegister, $cairoNotificationEnumReference + invoke-static { v$enumMapRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->setCairoNotificationFilledIcon(Ljava/util/EnumMap;Ljava/lang/Enum;)V + """, + ) + } } } } } -private enum class Hook(val methodName: String, val parameters: String) { +private enum class NavigationHook(val methodName: String, val parameters: String) { SET_LAST_APP_NAVIGATION_ENUM("setLastAppNavigationEnum", "Ljava/lang/Enum;"), NAVIGATION_TAB_LOADED("navigationTabLoaded", "Landroid/view/View;"), NAVIGATION_IMAGE_RESOURCE_TAB_LOADED("navigationImageResourceTabLoaded", "Landroid/view/View;"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index da21371350..41889cb905 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -1,122 +1,128 @@ package app.revanced.patches.youtube.misc.playercontrols -import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.indexOfFirstInstructionReversed -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal fun indexOfFocusableInTouchModeInstruction(method: Method) = - method.indexOfFirstInstruction { - getReference()?.name == "setFocusableInTouchMode" - } - -internal fun indexOfTranslationInstruction(method: Method) = - method.indexOfFirstInstructionReversed { - getReference()?.name == "setTranslationY" - } - -internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsVisibilityEntityModelMethodMatch by composingFirstMethod { + name("getPlayerControlsVisibility") accessFlags(AccessFlags.PUBLIC) - returns("L") - parameters() + returnType("L") + parameterTypes() opcodes( Opcode.IGET, - Opcode.INVOKE_STATIC + Opcode.INVOKE_STATIC, ) - custom { method, _ -> - method.name == "getPlayerControlsVisibility" - } } -internal val youtubeControlsOverlayFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - indexOfFocusableInTouchModeInstruction(method) >= 0 && - method.containsLiteralInstruction(inset_overlay_view_layout_id) && - method.containsLiteralInstruction(scrim_overlay_id) - - } +internal val BytecodePatchContext.youtubeControlsOverlayMethod by gettingFirstImmutableMethodDeclaratively { + returnType("V") + parameterTypes() + instructions( + method("setFocusableInTouchMode"), + ResourceType.ID("inset_overlay_view_layout"), + ResourceType.ID("scrim_overlay"), + ) } -internal val motionEventFingerprint = fingerprint { - returns("V") - parameters("Landroid/view/MotionEvent;") - custom { method, _ -> - indexOfTranslationInstruction(method) >= 0 - } +internal val ClassDef.motionEventMethodMatch by ClassDefComposing.composingFirstMethod { + returnType("V") + parameterTypes("Landroid/view/MotionEvent;") + instructions(method("setTranslationY")) } -internal val playerTopControlsInflateFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - literal { controls_layout_stub_id } -} - -internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsExtensionHookListenersExistMethod by gettingFirstMethodDeclaratively { + name("fullscreenButtonVisibilityCallbacksExist") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("Z") - parameters() - custom { methodDef, classDef -> - methodDef.name == "fullscreenButtonVisibilityCallbacksExist" && - classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("Z") + parameterTypes() } -internal val playerControlsExtensionHookFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsExtensionHookMethod by gettingFirstMethodDeclaratively { + name("fullscreenButtonVisibilityChanged") + definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - returns("V") - parameters("Z") - custom { methodDef, classDef -> - methodDef.name == "fullscreenButtonVisibilityChanged" && - classDef.type == EXTENSION_CLASS_DESCRIPTOR - } + returnType("V") + parameterTypes("Z") } -internal val playerBottomControlsInflateFingerprint = fingerprint { - returns("Ljava/lang/Object;") - parameters() - literal { bottom_ui_container_stub_id } -} - -internal val overlayViewInflateFingerprint = fingerprint { +internal val BytecodePatchContext.playerTopControlsInflateMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/view/View;") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(fullscreen_button_id) && - methodDef.containsLiteralInstruction(heatseeker_viewstub_id) - } + returnType("V") + parameterTypes() + instructions( + ResourceType.ID("controls_layout_stub"), + method { name == "inflate" && definingClass == "Landroid/view/ViewStub;" }, + after(Opcode.MOVE_RESULT_OBJECT()), + ) +} + +internal val BytecodePatchContext.playerBottomControlsInflateMethodMatch by composingFirstMethod { + returnType("Ljava/lang/Object;") + parameterTypes() + instructions( + ResourceType.ID("bottom_ui_container_stub"), + method { name == "inflate" && definingClass == "Landroid/view/ViewStub;" }, + after(Opcode.MOVE_RESULT_OBJECT()), + ) +} + +internal val BytecodePatchContext.overlayViewInflateMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Landroid/view/View;") + instructions( + ResourceType.ID("heatseeker_viewstub"), + ResourceType.ID("fullscreen_button"), + allOf(Opcode.CHECK_CAST(), type("Landroid/widget/ImageView;")), + ) } /** - * Resolves to the class found in [playerTopControlsInflateFingerprint]. + * Resolves to the class found in [playerTopControlsInflateMethodMatch]. */ -internal val controlsOverlayVisibilityFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getControlsOverlayVisibilityMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) - returns("V") - parameters("Z", "Z") + returnType("V") + parameterTypes("Z", "Z") } -internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerBottomControlsExploderFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - literal { 45643739L } + returnType("Z") + parameterTypes() + instructions(45643739L()) } -internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerTopControlsExperimentalLayoutFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("I") - parameters() - literal { 45629424L } + returnType("I") + parameterTypes() + instructions(45629424L()) } +internal val BytecodePatchContext.playerControlsLargeOverlayButtonsFeatureFlagMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions(45709810L()) +} + +internal val BytecodePatchContext.playerControlsFullscreenLargeButtonsFeatureFlagMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions(45686474L()) +} + +internal val BytecodePatchContext.playerControlsButtonStrokeFeatureFlagMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions(45713296L()) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt index e10725f767..aff5b9a4db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.misc.playercontrols -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstInstructionOrThrow @@ -12,13 +12,13 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction private const val EXTENSION_PLAYER_CONTROLS_VISIBILITY_HOOK_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerControlsVisibilityHookPatch;" -val PlayerControlsOverlayVisibilityPatch = bytecodePatch { +val playerControlsOverlayVisibilityPatch = bytecodePatch { dependsOn(sharedExtensionPatch) - execute { - playerControlsVisibilityEntityModelFingerprint.let { + apply { + playerControlsVisibilityEntityModelMethodMatch.let { it.method.apply { - val startIndex = it.patternMatch!!.startIndex + val startIndex = it[0] val iGetReference = getInstruction(startIndex).reference val staticReference = getInstruction(startIndex + 1).reference @@ -33,7 +33,7 @@ val PlayerControlsOverlayVisibilityPatch = bytecodePatch { invoke-static { v$targetRegister }, $staticReference move-result-object v$targetRegister invoke-static { v$targetRegister }, $EXTENSION_PLAYER_CONTROLS_VISIBILITY_HOOK_CLASS_DESCRIPTOR->setPlayerControlsVisibility(Ljava/lang/Enum;)V - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index e5949586de..973fa94ff5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -1,23 +1,19 @@ package app.revanced.patches.youtube.misc.playercontrols -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.Document -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater +import app.revanced.patches.youtube.misc.playservice.* import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import org.w3c.dom.Node /** @@ -39,22 +35,7 @@ internal lateinit var addTopControl: (String) -> Unit lateinit var addBottomControl: (String) -> Unit private set -internal var bottom_ui_container_stub_id = -1L - private set -internal var controls_layout_stub_id = -1L - private set -internal var heatseeker_viewstub_id = -1L - private set -internal var fullscreen_button_id = -1L - private set -internal var inset_overlay_view_layout_id = -1L - private set -internal var scrim_overlay_id = -1L - private set - -val playerControlsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - +internal val playerControlsResourcePatch = resourcePatch { /** * The element to the left of the element being added. */ @@ -65,16 +46,9 @@ val playerControlsResourcePatch = resourcePatch { lateinit var bottomTargetDocument: Document - execute { + apply { val targetResourceName = "youtube_controls_bottom_ui_container.xml" - bottom_ui_container_stub_id = resourceMappings["id", "bottom_ui_container_stub"] - controls_layout_stub_id = resourceMappings["id", "controls_layout_stub"] - heatseeker_viewstub_id = resourceMappings["id", "heatseeker_viewstub"] - fullscreen_button_id = resourceMappings["id", "fullscreen_button"] - inset_overlay_view_layout_id = resourceMappings["id", "inset_overlay_view_layout"] - scrim_overlay_id = resourceMappings["id", "scrim_overlay"] - bottomTargetDocument = document("res/layout/$targetResourceName") val bottomTargetElement: Node = bottomTargetDocument.getElementsByTagName( @@ -87,6 +61,18 @@ val playerControlsResourcePatch = resourcePatch { bottomLastLeftOf, ) + // Modify the fullscreen button stub attributes for correct positioning. + // The fullscreen button is lower than the ReVanced buttons (unpatched app bug). + // Issue is only present in later app targets, but this change seems to + // do no harm to earlier releases. + bottomTargetDocumentChildNodes.findElementByAttributeValueOrThrow( + "android:id", + "@id/youtube_controls_fullscreen_button_stub", + ).apply { + setAttribute("android:layout_marginBottom", "6.0dip") + setAttribute("android:layout_width", "48.0dip") + } + addTopControl = { resourceDirectoryName -> val resourceFileName = "host/layout/youtube_controls_layout.xml" val hostingResourceStream = inputStreamFromBundledResource( @@ -145,7 +131,7 @@ val playerControlsResourcePatch = resourcePatch { } } - finalize { + afterDependents { val childNodes = bottomTargetDocument.childNodes arrayOf( @@ -189,16 +175,16 @@ fun initializeBottomControl(descriptor: String) { * @param descriptor The descriptor of the method which should be called. */ fun injectVisibilityCheckCall(descriptor: String) { - visibilityMethod.addInstruction( - visibilityInsertIndex++, - "invoke-static { p1 , p2 }, $descriptor->setVisibility(ZZ)V", - ) - if (!visibilityImmediateCallbacksExistModified) { visibilityImmediateCallbacksExistModified = true visibilityImmediateCallbacksExistMethod.returnEarly(true) } + visibilityMethod.addInstruction( + visibilityInsertIndex++, + "invoke-static { p1 , p2 }, $descriptor->setVisibility(ZZ)V", + ) + visibilityImmediateMethod.addInstruction( visibilityImmediateInsertIndex++, "invoke-static { p0 }, $descriptor->setVisibilityImmediate(Z)V", @@ -216,24 +202,24 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerControlsPatch;" private lateinit var inflateTopControlMethod: MutableMethod -private var inflateTopControlInsertIndex: Int = -1 -private var inflateTopControlRegister: Int = -1 +private var inflateTopControlInsertIndex = -1 +private var inflateTopControlRegister = -1 private lateinit var inflateBottomControlMethod: MutableMethod -private var inflateBottomControlInsertIndex: Int = -1 -private var inflateBottomControlRegister: Int = -1 +private var inflateBottomControlInsertIndex = -1 +private var inflateBottomControlRegister = -1 + +private lateinit var visibilityImmediateCallbacksExistMethod: MutableMethod +private var visibilityImmediateCallbacksExistModified = false private lateinit var visibilityMethod: MutableMethod -private var visibilityInsertIndex: Int = 0 - -private var visibilityImmediateCallbacksExistModified = false -private lateinit var visibilityImmediateCallbacksExistMethod : MutableMethod +private var visibilityInsertIndex = 0 private lateinit var visibilityImmediateMethod: MutableMethod -private var visibilityImmediateInsertIndex: Int = 0 +private var visibilityImmediateInsertIndex = 0 private lateinit var visibilityNegatedImmediateMethod: MutableMethod -private var visibilityNegatedImmediateInsertIndex: Int = 0 +private var visibilityNegatedImmediateInsertIndex = 0 val playerControlsPatch = bytecodePatch( description = "Manages the code for the player controls of the YouTube player.", @@ -241,46 +227,35 @@ val playerControlsPatch = bytecodePatch( dependsOn( playerControlsResourcePatch, sharedExtensionPatch, - PlayerControlsOverlayVisibilityPatch + resourceMappingPatch, // Used to find methods. + playerControlsOverlayVisibilityPatch, + versionCheckPatch, ) - execute { - fun MutableMethod.indexOfFirstViewInflateOrThrow() = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/view/ViewStub;" && - reference.name == "inflate" - } - - playerBottomControlsInflateFingerprint.method.apply { + apply { + playerBottomControlsInflateMethodMatch.method.apply { inflateBottomControlMethod = this - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 + val inflateReturnObjectIndex = playerBottomControlsInflateMethodMatch[-1] inflateBottomControlRegister = getInstruction(inflateReturnObjectIndex).registerA inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1 } - playerTopControlsInflateFingerprint.method.apply { + playerTopControlsInflateMethodMatch.method.apply { inflateTopControlMethod = this - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 + val inflateReturnObjectIndex = playerTopControlsInflateMethodMatch[-1] inflateTopControlRegister = getInstruction(inflateReturnObjectIndex).registerA inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 } - visibilityMethod = controlsOverlayVisibilityFingerprint.match( - playerTopControlsInflateFingerprint.originalClassDef, - ).method + visibilityMethod = + playerTopControlsInflateMethodMatch.immutableClassDef.getControlsOverlayVisibilityMethod() // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. - overlayViewInflateFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionReversedOrThrow(fullscreen_button_id) - - val index = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == - "Landroid/widget/ImageView;" - } + overlayViewInflateMethodMatch.method.apply { + val index = overlayViewInflateMethodMatch[-1] val register = getInstruction(index).registerA addInstruction( @@ -290,12 +265,12 @@ val playerControlsPatch = bytecodePatch( ) } - visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistFingerprint.method - visibilityImmediateMethod = playerControlsExtensionHookFingerprint.method + visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistMethod + visibilityImmediateMethod = playerControlsExtensionHookMethod - motionEventFingerprint.match(youtubeControlsOverlayFingerprint.originalClassDef).method.apply { - visibilityNegatedImmediateMethod = this - visibilityNegatedImmediateInsertIndex = indexOfTranslationInstruction(this) + 1 + youtubeControlsOverlayMethod.immutableClassDef.motionEventMethodMatch.let { + visibilityNegatedImmediateMethod = it.method + visibilityNegatedImmediateInsertIndex = it[0] + 1 } // A/B test for a slightly different bottom overlay controls, @@ -303,27 +278,33 @@ val playerControlsPatch = bytecodePatch( // The change to support this is simple and only requires adding buttons to both layout files, // but for now force this different layout off since it's still an experimental test. if (is_19_35_or_greater) { - playerBottomControlsExploderFeatureFlagFingerprint.method.returnLate(false) + playerBottomControlsExploderFeatureFlagMethod.returnLate(false) } - // A/B test of new top overlay controls. Two different layouts can be used: + // A/B test of different top overlay controls. Two different layouts can be used: // youtube_cf_navigation_improvement_controls_layout.xml // youtube_cf_minimal_impact_controls_layout.xml // - // Visually there is no noticeable difference between either of these compared to the default. - // There is additional logic that is active when youtube_cf_navigation_improvement_controls_layout - // is active, but what it does is not entirely clear. - // - // For now force this a/b feature off as it breaks the top player buttons. - if (is_19_25_or_greater) { - playerTopControlsExperimentalLayoutFeatureFlagFingerprint.method.apply { + // Flag was removed in 20.19+ + if (is_19_25_or_greater && !is_20_19_or_greater) { + playerTopControlsExperimentalLayoutFeatureFlagMethod.apply { val index = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_OBJECT) val register = getInstruction(index).registerA - addInstruction( - index + 1, - "const-string v$register, \"default\"" - ) + addInstruction(index + 1, "const-string v$register, \"default\"") + } + } + + // Turn off a/b tests of ugly player buttons that don't match the style of custom player buttons. + if (is_20_20_or_greater) { + playerControlsFullscreenLargeButtonsFeatureFlagMethod.returnLate(false) + + if (is_20_28_or_greater) { + playerControlsLargeOverlayButtonsFeatureFlagMethod.returnLate(false) + } + + if (is_20_30_or_greater) { + playerControlsButtonStrokeFeatureFlagMethod.returnLate(false) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index 522d06b204..d182b41500 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,35 +1,55 @@ package app.revanced.patches.youtube.misc.playertype -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerTypeFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - opcodes( - Opcode.IF_NE, - Opcode.RETURN_VOID, - ) - custom { _, classDef -> classDef.endsWith("/YouTubePlayerOverlaysLayout;") } +internal val BytecodePatchContext.playerTypeEnumMethod by gettingFirstImmutableMethodDeclaratively( + "NONE", + "HIDDEN", + "WATCH_WHILE_MINIMIZED", + "WATCH_WHILE_MAXIMIZED", + "WATCH_WHILE_FULLSCREEN", + "WATCH_WHILE_SLIDING_MAXIMIZED_FULLSCREEN", + "WATCH_WHILE_SLIDING_MINIMIZED_MAXIMIZED", + "WATCH_WHILE_SLIDING_MINIMIZED_DISMISSED", + "INLINE_MINIMAL", + "VIRTUAL_REALITY_FULLSCREEN", + "WATCH_WHILE_PICTURE_IN_PICTURE", +) { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) } -internal val reelWatchPagerFingerprint = fingerprint { +internal val BytecodePatchContext.reelWatchPagerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/view/View;") - literal { reelWatchPlayerId } -} - -internal val videoStateFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") - opcodes( - Opcode.CONST_4, - Opcode.IF_EQZ, - Opcode.IF_EQZ, - Opcode.IGET_OBJECT, // obfuscated parameter field name + returnType("Landroid/view/View;") + instructions( + ResourceType.ID("reel_watch_player"), + afterAtMost(10, Opcode.MOVE_RESULT_OBJECT()), + ) +} + +internal val BytecodePatchContext.videoStateEnumMethod by gettingFirstImmutableMethodDeclaratively( + "NEW", + "PLAYING", + "PAUSED", + "RECOVERABLE_ERROR", + "UNRECOVERABLE_ERROR", + "ENDED", +) { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) + parameterTypes() +} + +// 20.33 and lower class name ControlsState. 20.34+ class name is obfuscated. +internal val BytecodePatchContext.controlsStateToStringMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes() + returnType("Ljava/lang/String;") + instructions( + "videoState"(), + "isBuffering"(), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index b14de0cbea..910c14fab0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -1,66 +1,72 @@ package app.revanced.patches.youtube.misc.playertype -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.* +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerTypeHookPatch;" -internal var reelWatchPlayerId = -1L - private set - -private val playerTypeHookResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - reelWatchPlayerId = resourceMappings["id", "reel_watch_player"] - } -} - val playerTypeHookPatch = bytecodePatch( description = "Hook to get the current player type and video playback state.", ) { - dependsOn(sharedExtensionPatch, playerTypeHookResourcePatch) + dependsOn(sharedExtensionPatch, resourceMappingPatch) - execute { - playerTypeFingerprint.method.addInstruction( + apply { + firstMethodDeclaratively { + definingClass("/YouTubePlayerOverlaysLayout;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes(playerTypeEnumMethod.immutableClassDef.type) + }.addInstruction( 0, - "invoke-static {p1}, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", + "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", ) - reelWatchPagerFingerprint.method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(reelWatchPlayerId) - val registerIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT) - val viewRegister = getInstruction(registerIndex).registerA + reelWatchPagerMethodMatch.method.apply { + val index = reelWatchPagerMethodMatch[-1] + val register = getInstruction(index).registerA addInstruction( - registerIndex + 1, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->onShortsCreate(Landroid/view/View;)V" + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->onShortsCreate(Landroid/view/View;)V", ) } - videoStateFingerprint.method.apply { - val endIndex = videoStateFingerprint.patternMatch!!.endIndex - val videoStateFieldName = getInstruction(endIndex).reference + val controlStateType = controlsStateToStringMethod.immutableClassDef.type - addInstructions( - 0, - """ - iget-object v0, p1, $videoStateFieldName # copy VideoState parameter field - invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->setVideoState(Ljava/lang/Enum;)V - """ + val videoStateEnumMethod = videoStateEnumMethod + firstMethodComposite { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes(controlStateType) + instructions( + field { + definingClass == controlStateType && type == videoStateEnumMethod.immutableClassDef.type + }, + // Obfuscated parameter field name. + ResourceType.STRING("accessibility_play"), + ResourceType.STRING("accessibility_pause"), ) + }.let { + it.method.apply { + val videoStateFieldName = getInstruction(it[0]).reference + + addInstructions( + 0, + """ + iget-object v0, p1, $videoStateFieldName # copy VideoState parameter field + invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->setVideoState(Ljava/lang/Enum;)V + """, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 133beddfb3..aa761dac94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -8,48 +8,43 @@ import kotlin.properties.Delegates // Use notNull delegate so an exception is thrown if these fields are accessed before they are set. -@Deprecated("19.34.42 is the lowest supported version") -var is_19_03_or_greater : Boolean by Delegates.notNull() - private set -@Deprecated("19.34.42 is the lowest supported version") -var is_19_04_or_greater : Boolean by Delegates.notNull() - private set -@Deprecated("19.34.42 is the lowest supported version") -var is_19_16_or_greater : Boolean by Delegates.notNull() - private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_17_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_18_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_23_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_25_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_26_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_29_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_32_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_33_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_34_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_35_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_36_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_41_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_43_or_greater : Boolean by Delegates.notNull() private set var is_19_46_or_greater : Boolean by Delegates.notNull() @@ -74,19 +69,44 @@ var is_20_14_or_greater : Boolean by Delegates.notNull() private set var is_20_15_or_greater : Boolean by Delegates.notNull() private set +var is_20_19_or_greater : Boolean by Delegates.notNull() + private set +var is_20_20_or_greater : Boolean by Delegates.notNull() + private set +var is_20_21_or_greater : Boolean by Delegates.notNull() + private set +var is_20_22_or_greater : Boolean by Delegates.notNull() + private set +var is_20_26_or_greater : Boolean by Delegates.notNull() + private set +var is_20_28_or_greater : Boolean by Delegates.notNull() + private set +var is_20_30_or_greater : Boolean by Delegates.notNull() + private set +var is_20_31_or_greater : Boolean by Delegates.notNull() + private set +var is_20_34_or_greater : Boolean by Delegates.notNull() + private set +var is_20_37_or_greater : Boolean by Delegates.notNull() + private set +var is_20_39_or_greater : Boolean by Delegates.notNull() + private set +var is_20_41_or_greater : Boolean by Delegates.notNull() + private set +var is_20_45_or_greater : Boolean by Delegates.notNull() + private set +var is_20_46_or_greater : Boolean by Delegates.notNull() + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", ) { - execute { + apply { // The app version is missing from the decompiled manifest, // so instead use the Google Play services version and compare against specific releases. val playStoreServicesVersion = findPlayStoreServicesVersion() // All bug fix releases always seem to use the same play store version as the minor version. - is_19_03_or_greater = 240402000 <= playStoreServicesVersion - is_19_04_or_greater = 240502000 <= playStoreServicesVersion - is_19_16_or_greater = 241702000 <= playStoreServicesVersion is_19_17_or_greater = 241802000 <= playStoreServicesVersion is_19_18_or_greater = 241902000 <= playStoreServicesVersion is_19_23_or_greater = 242402000 <= playStoreServicesVersion @@ -111,5 +131,19 @@ val versionCheckPatch = resourcePatch( is_20_10_or_greater = 251105000 <= playStoreServicesVersion is_20_14_or_greater = 251505000 <= playStoreServicesVersion is_20_15_or_greater = 251605000 <= playStoreServicesVersion + is_20_19_or_greater = 252005000 <= playStoreServicesVersion + is_20_20_or_greater = 252105000 <= playStoreServicesVersion + is_20_21_or_greater = 252205000 <= playStoreServicesVersion + is_20_22_or_greater = 252305000 <= playStoreServicesVersion + is_20_26_or_greater = 252705000 <= playStoreServicesVersion + is_20_28_or_greater = 252905000 <= playStoreServicesVersion + is_20_30_or_greater = 253105000 <= playStoreServicesVersion + is_20_31_or_greater = 253205000 <= playStoreServicesVersion + is_20_34_or_greater = 253505000 <= playStoreServicesVersion + is_20_37_or_greater = 253805000 <= playStoreServicesVersion + is_20_39_or_greater = 253980000 <= playStoreServicesVersion + is_20_41_or_greater = 254205000 <= playStoreServicesVersion + is_20_45_or_greater = 254605000 <= playStoreServicesVersion + is_20_46_or_greater = 254705000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt deleted file mode 100644 index 937365c6ae..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.privacy - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Patch was renamed", ReplaceWith("sanitizeSharingLinksPatch")) -@Suppress("unused") -val removeTrackingQueryParameterPatch = bytecodePatch{ - dependsOn(sanitizeSharingLinksPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt index c39444db04..c3cf0e93d0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt @@ -12,12 +12,13 @@ val sanitizeSharingLinksPatch = sanitizeSharingLinksPatch( sharedExtensionPatch, settingsPatch, ) + compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", + "20.21.37", + "20.31.40", ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt index 09aa7bf4cd..efece581f2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt @@ -1,12 +1,14 @@ package app.revanced.patches.youtube.misc.recyclerviewtree.hook -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.opcodes +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val recyclerViewTreeObserverFingerprint = fingerprint { +internal val BytecodePatchContext.recyclerViewTreeObserverMethodMatch by composingFirstMethod("LithoRVSLCBinder") { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CHECK_CAST, Opcode.NEW_INSTANCE, @@ -14,5 +16,4 @@ internal val recyclerViewTreeObserverFingerprint = fingerprint { Opcode.INVOKE_VIRTUAL, Opcode.NEW_INSTANCE, ) - strings("LithoRVSLCBinder") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt index 58033a223e..70182237f6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt @@ -1,6 +1,6 @@ package app.revanced.patches.youtube.misc.recyclerviewtree.hook -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -10,13 +10,13 @@ lateinit var addRecyclerViewTreeHook: (String) -> Unit val recyclerViewTreeHookPatch = bytecodePatch { dependsOn(sharedExtensionPatch) - execute { - recyclerViewTreeObserverFingerprint.method.apply { - val insertIndex = recyclerViewTreeObserverFingerprint.patternMatch!!.startIndex + 1 + apply { + recyclerViewTreeObserverMethodMatch.let { + val insertIndex = it[0] + 1 val recyclerViewParameter = 2 addRecyclerViewTreeHook = { classDescriptor -> - addInstruction( + it.method.addInstruction( insertIndex, "invoke-static/range { p$recyclerViewParameter .. p$recyclerViewParameter }, " + "$classDescriptor->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index 3dd3816b52..37b3b50806 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -1,29 +1,42 @@ package app.revanced.patches.youtube.misc.settings -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val licenseActivityOnCreateFingerprint = fingerprint { +internal val BytecodePatchContext.licenseActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass("/LicenseActivity;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - custom { method, classDef -> - classDef.endsWith("LicenseActivity;") && method.name == "onCreate" - } + returnType("V") + parameterTypes("Landroid/os/Bundle;") } -internal val setThemeFingerprint = fingerprint { +internal val BytecodePatchContext.setThemeMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - literal { appearanceStringId } + returnType("L") + parameterTypes() + instructions(ResourceType.STRING("app_theme_appearance_dark")) } -internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L - -internal val cairoFragmentConfigFingerprint = fingerprint { +internal val BytecodePatchContext.cairoFragmentConfigMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { CAIRO_CONFIG_LITERAL_VALUE } + returnType("Z") + instructions( + 45532100L(), + afterAtMost(10, Opcode.MOVE_RESULT()), + ) +} + +// Flag is present in 20.23, but bold icons are missing and forcing them crashes the app. +// 20.31 is the first target with all the bold icons present. +internal val BytecodePatchContext.boldIconsFeatureFlagMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions( + 45685201L(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index baf4d18ea2..38b200d4b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -1,26 +1,27 @@ package app.revanced.patches.youtube.misc.settings -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableClass -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.overrideThemeColors import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.fix.contentprovider.fixContentProviderPatch import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags @@ -36,21 +37,19 @@ private const val BASE_ACTIVITY_HOOK_CLASS_DESCRIPTOR = private const val YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/settings/YouTubeActivityHook;" -internal var appearanceStringId = -1L - private set - private val preferences = mutableSetOf() private val settingsResourcePatch = resourcePatch { dependsOn( resourceMappingPatch, settingsPatch( - listOf( + rootPreferences = listOf( IntentPreference( titleKey = "revanced_settings_title", summaryKey = null, intent = newIntent("revanced_settings_intent"), ) to "settings_fragment", + PreferenceCategory( titleKey = "revanced_settings_title", layout = "@layout/preference_group_title", @@ -58,41 +57,55 @@ private val settingsResourcePatch = resourcePatch { IntentPreference( titleKey = "revanced_settings_submenu_title", summaryKey = null, - icon = "@drawable/revanced_settings_icon", + icon = "@drawable/revanced_settings_icon_dynamic", layout = "@layout/preference_with_icon", intent = newIntent("revanced_settings_intent"), - ) - ) + ), + ), ) to "settings_fragment_cairo", ), - preferences - ) + preferences = preferences, + ), ) - execute { - appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"] - + apply { // Use same colors as stock YouTube. overrideThemeColors("@color/yt_white1", "@color/yt_black3") copyResources( "settings", - ResourceGroup("drawable", + ResourceGroup( + "drawable", + "revanced_settings_icon_dynamic.xml", "revanced_settings_icon.xml", + "revanced_settings_icon_bold.xml", "revanced_settings_screen_00_about.xml", + "revanced_settings_screen_00_about_bold.xml", "revanced_settings_screen_01_ads.xml", + "revanced_settings_screen_01_ads_bold.xml", "revanced_settings_screen_02_alt_thumbnails.xml", + "revanced_settings_screen_02_alt_thumbnails_bold.xml", "revanced_settings_screen_03_feed.xml", + "revanced_settings_screen_03_feed_bold.xml", "revanced_settings_screen_04_general.xml", + "revanced_settings_screen_04_general_bold.xml", "revanced_settings_screen_05_player.xml", + "revanced_settings_screen_05_player_bold.xml", "revanced_settings_screen_06_shorts.xml", + "revanced_settings_screen_06_shorts_bold.xml", "revanced_settings_screen_07_seekbar.xml", + "revanced_settings_screen_07_seekbar_bold.xml", "revanced_settings_screen_08_swipe_controls.xml", + "revanced_settings_screen_08_swipe_controls_bold.xml", "revanced_settings_screen_09_return_youtube_dislike.xml", + "revanced_settings_screen_09_return_youtube_dislike_bold.xml", "revanced_settings_screen_10_sponsorblock.xml", + "revanced_settings_screen_10_sponsorblock_bold.xml", "revanced_settings_screen_11_misc.xml", + "revanced_settings_screen_11_misc_bold.xml", "revanced_settings_screen_12_video.xml", - ) + "revanced_settings_screen_12_video_bold.xml", + ), ) // Remove horizontal divider from the settings Preferences @@ -130,7 +143,7 @@ private val settingsResourcePatch = resourcePatch { licenseElement.setAttribute( "android:configChanges", - "orientation|screenSize|keyboardHidden" + "orientation|screenSize|keyboardHidden", ) val mimeType = document.createElement("data") @@ -153,18 +166,20 @@ val settingsPatch = bytecodePatch( addResourcesPatch, versionCheckPatch, fixPlaybackSpeedWhilePlayingPatch, + fixContentProviderPatch, // Currently there is no easy way to make a mandatory patch, // so for now this is a dependent of this patch. checkEnvironmentPatch, ) - execute { + apply { addResources("youtube", "misc.settings.settingsPatch") // Add an "about" preference to the top. preferences += NonInteractivePreference( key = "revanced_settings_screen_00_about", icon = "@drawable/revanced_settings_screen_00_about", + iconBold = "@drawable/revanced_settings_screen_00_about_bold", layout = "@layout/preference_with_icon", summaryKey = null, tag = "app.revanced.extension.shared.settings.preference.ReVancedAboutPreference", @@ -173,13 +188,28 @@ val settingsPatch = bytecodePatch( if (is_19_34_or_greater) { PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_restore_old_settings_menus") + SwitchPreference("revanced_restore_old_settings_menus"), ) } PreferenceScreen.GENERAL_LAYOUT.addPreferences( SwitchPreference("revanced_settings_search_history"), - SwitchPreference("revanced_show_menu_icons") + ) + + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + if (is_20_31_or_greater) { + PreferenceCategory( + titleKey = null, + sorting = Sorting.UNSORTED, + tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", + preferences = setOf( + SwitchPreference("revanced_show_menu_icons"), + SwitchPreference("revanced_settings_disable_bold_icons"), + ), + ) + } else { + SwitchPreference("revanced_show_menu_icons") + }, ) PreferenceScreen.MISC.addPreferences( @@ -192,14 +222,14 @@ val settingsPatch = bytecodePatch( ), ListPreference( key = "revanced_language", - tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" - ) + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference", + ), ) // Update shared dark mode status based on YT theme. // This is needed because YT allows forcing light/dark mode // which then differs from the system dark mode status. - setThemeFingerprint.method.apply { + setThemeMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { index -> val register = getInstruction(index).registerA addInstructionsAtControlFlowLabel( @@ -210,20 +240,31 @@ val settingsPatch = bytecodePatch( } // Add setting to force Cairo settings fragment on/off. - cairoFragmentConfigFingerprint.method.insertLiteralOverride( - CAIRO_CONFIG_LITERAL_VALUE, - "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z" + cairoFragmentConfigMethodMatch.method.insertLiteralOverride( + cairoFragmentConfigMethodMatch[0], + "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z", ) + // Bold icon resources are found starting in 20.23, but many YT icons are not bold. + // 20.31 is the first version that seems to have all the bold icons. + if (is_20_31_or_greater) { + boldIconsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useBoldIcons(Z)Z", + ) + } + } + modifyActivityForSettingsInjection( - licenseActivityOnCreateFingerprint.classDef, - licenseActivityOnCreateFingerprint.method, + licenseActivityOnCreateMethod.classDef, + licenseActivityOnCreateMethod, YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR, - false + false, ) } - finalize { + afterDependents { PreferenceScreen.close() } } @@ -232,20 +273,21 @@ val settingsPatch = bytecodePatch( * Modifies the activity to show ReVanced settings instead of it's original purpose. */ internal fun modifyActivityForSettingsInjection( - activityOnCreateClass: MutableClass, + activityOnCreateClass: MutableClassDef, activityOnCreateMethod: MutableMethod, extensionClassType: String, - isYouTubeMusic: Boolean + isYouTubeMusic: Boolean, ) { // Modify Activity and remove all existing layout code. // Must modify an existing activity and cannot add a new activity to the manifest, // as that fails for root installations. activityOnCreateMethod.addInstructions( - 1, + 0, """ + invoke-super { p0, p1 }, ${activityOnCreateClass.superclass}->onCreate(Landroid/os/Bundle;)V invoke-static { p0 }, $extensionClassType->initialize(Landroid/app/Activity;)V return-void - """ + """, ) // Remove other methods as they will break as the onCreate method is modified above. @@ -270,7 +312,7 @@ internal fun modifyActivityForSettingsInjection( move-result-object p1 invoke-super { p0, p1 }, ${activityOnCreateClass.superclass}->attachBaseContext(Landroid/content/Context;)V return-void - """ + """, ) }.let(activityOnCreateClass.methods::add) @@ -297,7 +339,7 @@ internal fun modifyActivityForSettingsInjection( $invokeFinishOpcode { p0 }, Landroid/app/Activity;->finish()V :search_handled return-void - """ + """, ) }.let(activityOnCreateClass.methods::add) } @@ -321,12 +363,14 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_01_ads", summaryKey = null, icon = "@drawable/revanced_settings_screen_01_ads", + iconBold = "@drawable/revanced_settings_screen_01_ads_bold", layout = "@layout/preference_with_icon", ) val ALTERNATIVE_THUMBNAILS = Screen( key = "revanced_settings_screen_02_alt_thumbnails", summaryKey = null, icon = "@drawable/revanced_settings_screen_02_alt_thumbnails", + iconBold = "@drawable/revanced_settings_screen_02_alt_thumbnails_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -334,36 +378,42 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_03_feed", summaryKey = null, icon = "@drawable/revanced_settings_screen_03_feed", + iconBold = "@drawable/revanced_settings_screen_03_feed_bold", layout = "@layout/preference_with_icon", ) val GENERAL_LAYOUT = Screen( key = "revanced_settings_screen_04_general", summaryKey = null, icon = "@drawable/revanced_settings_screen_04_general", + iconBold = "@drawable/revanced_settings_screen_04_general_bold", layout = "@layout/preference_with_icon", ) val PLAYER = Screen( key = "revanced_settings_screen_05_player", summaryKey = null, icon = "@drawable/revanced_settings_screen_05_player", + iconBold = "@drawable/revanced_settings_screen_05_player_bold", layout = "@layout/preference_with_icon", ) val SHORTS = Screen( key = "revanced_settings_screen_06_shorts", summaryKey = null, icon = "@drawable/revanced_settings_screen_06_shorts", + iconBold = "@drawable/revanced_settings_screen_06_shorts_bold", layout = "@layout/preference_with_icon", ) val SEEKBAR = Screen( key = "revanced_settings_screen_07_seekbar", summaryKey = null, icon = "@drawable/revanced_settings_screen_07_seekbar", + iconBold = "@drawable/revanced_settings_screen_07_seekbar_bold", layout = "@layout/preference_with_icon", ) val SWIPE_CONTROLS = Screen( key = "revanced_settings_screen_08_swipe_controls", summaryKey = null, icon = "@drawable/revanced_settings_screen_08_swipe_controls", + iconBold = "@drawable/revanced_settings_screen_08_swipe_controls_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -371,6 +421,7 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_09_return_youtube_dislike", summaryKey = null, icon = "@drawable/revanced_settings_screen_09_return_youtube_dislike", + iconBold = "@drawable/revanced_settings_screen_09_return_youtube_dislike_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -378,6 +429,7 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_10_sponsorblock", summaryKey = null, icon = "@drawable/revanced_settings_screen_10_sponsorblock", + iconBold = "@drawable/revanced_settings_screen_10_sponsorblock_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -385,12 +437,14 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_11_misc", summaryKey = null, icon = "@drawable/revanced_settings_screen_11_misc", + iconBold = "@drawable/revanced_settings_screen_11_misc_bold", layout = "@layout/preference_with_icon", ) val VIDEO = Screen( key = "revanced_settings_screen_12_video", summaryKey = null, icon = "@drawable/revanced_settings_screen_12_video", + iconBold = "@drawable/revanced_settings_screen_12_video_bold", layout = "@layout/preference_with_icon", sorting = Sorting.BY_KEY, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index 28cf55bd4b..428d55af73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.spoof +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference @@ -13,11 +14,11 @@ import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod val spoofVideoStreamsPatch = spoofVideoStreamsPatch( extensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;", - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = BytecodePatchContext::mainActivityOnCreateMethod::get, fixMediaFetchHotConfig = { is_19_34_or_greater }, @@ -32,17 +33,17 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( block = { compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) dependsOn( userAgentClientSpoofPatch, settingsPatch, - versionCheckPatch + versionCheckPatch, ) }, @@ -60,12 +61,12 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( // Requires a key and title but the actual text is chosen at runtime. key = "revanced_spoof_video_streams_about", summaryKey = null, - tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference" + tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference", ), SwitchPreference("revanced_spoof_video_streams_av1"), SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"), - ) - ) + ), + ), ) - } + }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt deleted file mode 100644 index 44cde6002b..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.misc.zoomhaptics - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.misc.hapticfeedback.disableHapticFeedbackPatch - -@Deprecated("Superseded by disableHapticFeedbackPatch", ReplaceWith("disableHapticFeedbackPatch")) -val zoomHapticsPatch = bytecodePatch( - description = "Adds an option to disable haptics when zooming.", -) { - dependsOn(disableHapticFeedbackPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 44c212e6f8..0397f26992 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,83 +1,88 @@ package app.revanced.patches.youtube.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.ClassDefComposing +import app.revanced.patcher.accessFlags +import app.revanced.patcher.after +import app.revanced.patcher.allOf +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.custom +import app.revanced.patcher.definingClass +import app.revanced.patcher.field +import app.revanced.patcher.firstMethodComposite +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.method +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.patcher.type +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef internal const val YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" -internal val conversionContextFingerprintToString = fingerprint { - parameters() - strings( - "ConversionContext{containerInternal=", - ", widthConstraint=", - ", heightConstraint=", - ", templateLoggerFactory=", - ", rootDisposableContainer=", - ", identifierProperty=" - ) - custom { method, _ -> - method.name == "toString" - } +internal val BytecodePatchContext.conversionContextToStringMethod by gettingFirstImmutableMethodDeclaratively( + ", widthConstraint=", + ", heightConstraint=", + ", templateLoggerFactory=", + ", rootDisposableContainer=", + ", identifierProperty=", +) { + name("toString") + parameterTypes() + instructions("ConversionContext{"(String::startsWith)) // Partial string match. } -/** - * Resolves to class found in [loopVideoParentFingerprint]. - */ -internal val loopVideoFingerprint = fingerprint { +internal fun BytecodePatchContext.getLayoutConstructorMethodMatch() = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.implementation!!.instructions.count() == 3 && method.annotations.isEmpty() - } -} + returnType("V") + parameterTypes() -internal val loopVideoParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - strings( - "play() called when the player wasn't loaded.", - "play() blocked because Background Playability failed", + val methodParameterTypePrefixes = listOf("Landroid/view/View;", "I") + + instructions( + 159962L(), + ResourceType.ID("player_control_previous_button_touch_area"), + ResourceType.ID("player_control_next_button_touch_area"), + method { + parameterTypes.size == 2 && + parameterTypes.zip(methodParameterTypePrefixes).all { (a, b) -> a.startsWith(b) } + }, ) } -internal val layoutConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - strings("1.0x") -} - -internal val mainActivityConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityConstructorMethod by gettingFirstImmutableMethodDeclaratively { + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters() - custom { _, classDef -> - classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } + parameterTypes() } -internal val mainActivityOnBackPressedFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityOnBackPressedMethod by gettingFirstMethodDeclaratively { + name("onBackPressed") + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, classDef -> - method.name == "onBackPressed" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } + returnType("V") + parameterTypes() } -internal val mainActivityOnCreateFingerprint = fingerprint { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } +internal val BytecodePatchContext.mainActivityOnCreateMethod by gettingFirstMethodDeclaratively { + name("onCreate") + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) + returnType("V") + parameterTypes("Landroid/os/Bundle;") } -internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberTextViewAnimationUpdateMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Landroid/graphics/Bitmap;") + returnType("V") + parameterTypes("Landroid/graphics/Bitmap;") opcodes( Opcode.NEW_INSTANCE, // bitmap ImageSpan Opcode.INVOKE_VIRTUAL, @@ -93,61 +98,47 @@ internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { Opcode.INT_TO_FLOAT, Opcode.INVOKE_VIRTUAL, // set textview padding using bitmap width ) - custom { _, classDef -> - classDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || - classDef.superclass == + custom { + immutableClassDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || + immutableClassDef.superclass == "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" } } -internal val seekbarFingerprint = fingerprint { - returns("V") - strings("timed_markers_width") +internal val BytecodePatchContext.seekbarMethod by gettingFirstImmutableMethodDeclaratively { + returnType("V") + instructions("timed_markers_width"()) } -internal val seekbarOnDrawFingerprint = fingerprint { - custom { method, _ -> method.name == "onDraw" } -} - -internal val subtitleButtonControllerFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IF_NEZ, - Opcode.RETURN_VOID, - Opcode.IGET_BOOLEAN, - Opcode.CONST_4, - Opcode.IF_NEZ, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, +/** + * Matches to _mutable_ class found in [seekbarMethod]. + */ +internal fun ClassDef.getSeekbarOnDrawMethodMatch() = firstMethodComposite { + name("onDraw") + instructions( + method { toString() == "Ljava/lang/Math;->round(F)I" }, + after(Opcode.MOVE_RESULT()), ) } -internal val videoQualityChangedFingerprint = fingerprint { +internal val BytecodePatchContext.subtitleButtonControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("L") - opcodes( - Opcode.IGET, // Video resolution (human readable). - Opcode.IGET_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.IGET_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_DIRECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.GOTO, - Opcode.CONST_4, - Opcode.IF_NE, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET, + returnType("V") + parameterTypes("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") + instructions( + ResourceType.STRING("accessibility_captions_unavailable"), + ResourceType.STRING("accessibility_captions_button_name"), + ) +} + +internal val BytecodePatchContext.videoQualityChangedMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes("L") + instructions( + allOf(Opcode.NEW_INSTANCE(), type("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;")), + Opcode.IGET_OBJECT(), + Opcode.CHECK_CAST(), + after(allOf(Opcode.IGET(), field { type == "I" })), // Video resolution (human-readable). ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index ea1fed89b1..90fbbe740f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -1,12 +1,13 @@ package app.revanced.patches.youtube.video.audio +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod @Suppress("unused") val forceOriginalAudioPatch = forceOriginalAudioPatch( @@ -14,20 +15,20 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( dependsOn( sharedExtensionPatch, settingsPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) }, fixUseLocalizedAudioTrackFlag = { is_20_07_or_greater }, - mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + getMainActivityOnCreateMethod = BytecodePatchContext::mainActivityOnCreateMethod::get, subclassExtensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;", preferenceScreen = PreferenceScreen.VIDEO, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt index c5790d1482..a7f027fd73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.video.codecs -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -14,8 +14,7 @@ import app.revanced.util.getReference import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/DisableVideoCodecsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableVideoCodecsPatch;" @Suppress("unused") val disableVideoCodecsPatch = bytecodePatch( @@ -36,8 +35,7 @@ val disableVideoCodecsPatch = bytecodePatch( } val reference = instruction.getReference() - if (reference?.definingClass =="Landroid/view/Display\$HdrCapabilities;" - && reference.name == "getSupportedHdrTypes") { + if (reference?.definingClass == "Landroid/view/Display\$HdrCapabilities;" && reference.name == "getSupportedHdrTypes") { return@filterMap instruction to instructionIndex } return@filterMap null @@ -49,30 +47,30 @@ val disableVideoCodecsPatch = bytecodePatch( method.replaceInstruction( index, "invoke-static/range { v$register .. v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + - "disableHdrVideo(Landroid/view/Display\$HdrCapabilities;)[I", + $$"disableHdrVideo(Landroid/view/Display$HdrCapabilities;)[I", ) - } - ) + }, + ), ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { addResources("youtube", "video.codecs.disableVideoCodecsPatch") PreferenceScreen.VIDEO.addPreferences( SwitchPreference("revanced_disable_hdr_video"), - SwitchPreference("revanced_force_avc_codec") + SwitchPreference("revanced_force_avc_codec"), ) - vp9CapabilityFingerprint.method.addInstructionsWithLabels( + vp9CapabilityMethod.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->allowVP9()Z @@ -81,7 +79,7 @@ val disableVideoCodecsPatch = bytecodePatch( return v0 :default nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt index a7790191f4..613d3c623b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.youtube.video.codecs -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val vp9CapabilityFingerprint = fingerprint { +internal val BytecodePatchContext.vp9CapabilityMethod by gettingFirstMethodDeclaratively( + "vp9_supported", + "video/x-vnd.on2.vp9", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - strings( - "vp9_supported", - "video/x-vnd.on2.vp9" - ) + returnType("Z") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt deleted file mode 100644 index d0591f2c7e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.video.hdr - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.video.codecs.disableVideoCodecsPatch - -@Deprecated("Patch was renamed", ReplaceWith("disableVideoCodecsPatch")) -@Suppress("unused") -val disableHdrPatch = bytecodePatch{ - dependsOn(disableVideoCodecsPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 74b0e0864b..9f3b8e52cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -1,47 +1,52 @@ package app.revanced.patches.youtube.video.information -import app.revanced.patcher.fingerprint -import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint -import app.revanced.util.getReference +import app.revanced.patcher.* +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.youtube.shared.videoQualityChangedMethodMatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.ClassDef +import org.stringtemplate.v4.compiler.Bytecode -internal val createVideoPlayerSeekbarFingerprint = fingerprint { - returns("V") - strings("timed_markers_width") +internal val BytecodePatchContext.createVideoPlayerSeekbarMethod by gettingFirstImmutableMethodDeclaratively { + returnType("V") + instructions("timed_markers_width"()) } -internal val onPlaybackSpeedItemClickFingerprint = fingerprint { +internal val BytecodePatchContext.onPlaybackSpeedItemClickMethod by gettingFirstMethodDeclaratively { + name("onItemClick") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L", "L", "I", "J") - custom { method, _ -> - method.name == "onItemClick" && - method.implementation?.instructions?.find { - it.opcode == Opcode.IGET_OBJECT && - it.getReference()!!.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" - } != null + returnType("V") + parameterTypes("L", "L", "I", "J") + instructions( + allOf( + Opcode.IGET_OBJECT(), + field { type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" }, + ), + ) +} + +internal val BytecodePatchContext.playerControllerSetTimeReferenceMethodMatch by + composingFirstMethod("Media progress reported outside media playback: ") { + opcodes( + Opcode.INVOKE_DIRECT_RANGE, + Opcode.IGET_OBJECT, + ) } -} -internal val playerControllerSetTimeReferenceFingerprint = fingerprint { - opcodes(Opcode.INVOKE_DIRECT_RANGE, Opcode.IGET_OBJECT) - strings("Media progress reported outside media playback: ") -} - -internal val playerInitFingerprint = fingerprint { - strings("playVideo called on player response with no videoStreamingData.") +internal val BytecodePatchContext.playVideoCheckVideoStreamingDataResponseMethod by gettingFirstImmutableMethodDeclaratively { + instructions("playVideo called on player response with no videoStreamingData."()) } /** - * Matched using class found in [playerInitFingerprint]. + * Matched using class found in [playVideoCheckVideoStreamingDataResponseMethod]. */ -internal val seekFingerprint = fingerprint { - strings("Attempting to seek during an ad") +internal fun ClassDef.getSeekMethod() = firstImmutableMethodDeclaratively { + instructions("Attempting to seek during an ad"()) } -internal val videoLengthFingerprint = fingerprint { +internal val ClassDef.videoLengthMethodMatch by ClassDefComposing.composingFirstMethod { opcodes( Opcode.MOVE_RESULT_WIDE, Opcode.CMP_LONG, @@ -59,101 +64,123 @@ internal val videoLengthFingerprint = fingerprint { } /** - * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. + * Matches using class found in [mdxPlayerDirectorSetVideoStageMethod]. */ -internal val mdxSeekFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMdxSeekMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters("J", "L") + returnType("Z") + parameterTypes("J", "L") opcodes( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, Opcode.RETURN, ) - custom { methodDef, _ -> + custom { // The instruction count is necessary here to avoid matching the relative version // of the seek method we're after, which has the same function signature as the // regular one, is in the same class, and even has the exact same 3 opcodes pattern. - methodDef.implementation!!.instructions.count() == 3 + instructions.count() == 3 } } -internal val mdxPlayerDirectorSetVideoStageFingerprint = fingerprint { - strings("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state ") +internal val BytecodePatchContext.mdxPlayerDirectorSetVideoStageMethod by gettingFirstImmutableMethodDeclaratively { + instructions("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state "()) } /** - * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. + * Matches using class found in [mdxPlayerDirectorSetVideoStageMethod]. */ -internal val mdxSeekRelativeFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getMdxSeekRelativeMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. - parameters("J", "L") + parameterTypes("J", "L") opcodes( - Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, ) } /** - * Matches using class found in [playerInitFingerprint]. + * Matches using class found in [playVideoCheckVideoStreamingDataResponseMethod]. */ -internal val seekRelativeFingerprint = fingerprint { +context(_: BytecodePatchContext) +internal fun ClassDef.getSeekRelativeMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. - parameters("J", "L") + parameterTypes("J", "L") opcodes( Opcode.ADD_LONG_2ADDR, Opcode.INVOKE_VIRTUAL, ) } -/** - * Resolves with the class found in [videoQualityChangedFingerprint]. - */ -internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint { +internal val BytecodePatchContext.videoEndMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("L") - opcodes( - Opcode.IGET, - Opcode.INVOKE_VIRTUAL, - Opcode.SGET_OBJECT, - Opcode.RETURN_OBJECT, + returnType("Z") + parameterTypes("J", "L") + instructions( + method { parameterTypes.isEmpty() && returnType == "V" }, + afterAtMost(5, 45368273L()), + "Attempting to seek when video is not playing"(), ) } -internal val playbackSpeedClassFingerprint = fingerprint { +/** + * Matches with the class found in [videoQualityChangedMethodMatch]. + */ +internal val ClassDef.playbackSpeedMenuSpeedChangedMethodMatch by ClassDefComposing.composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes("L") + instructions(allOf(Opcode.IGET(), field { type == "F" })) +} + +internal val BytecodePatchContext.playbackSpeedClassMethod by gettingFirstMethodDeclaratively( + "PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L") - opcodes( - Opcode.RETURN_OBJECT - ) - strings("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") + returnType("L") + parameterTypes("L") + opcodes(Opcode.RETURN_OBJECT) } +internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = + "Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;" -internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = "Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;" - -internal val videoQualityFingerprint = fingerprint { +/** + * YouTube 20.19 and lower. + */ +internal val BytecodePatchContext.videoQualityLegacyMethod by gettingFirstMethodDeclaratively { + definingClass(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters( + parameterTypes( "I", // Resolution. "Ljava/lang/String;", // Human readable resolution: "480p", "1080p Premium", etc "Z", - "L" + "L", ) - custom { _, classDef -> - classDef.type == YOUTUBE_VIDEO_QUALITY_CLASS_TYPE - } } -internal val videoQualitySetterFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityMethod by gettingFirstMethodDeclaratively { + definingClass(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE) + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameterTypes( + "I", // Resolution. + "L", + "Ljava/lang/String;", // Human readable resolution: "480p", "1080p Premium", etc + "Z", + "L", + ) +} + +internal val BytecodePatchContext.videoQualitySetterMethod by gettingFirstMethodDeclaratively( + "menu_item_video_quality", +) { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("[L", "I", "Z") + returnType("V") + parameterTypes("[L", "I", "Z") opcodes( Opcode.IF_EQZ, Opcode.INVOKE_VIRTUAL, @@ -161,15 +188,15 @@ internal val videoQualitySetterFingerprint = fingerprint { Opcode.INVOKE_VIRTUAL, Opcode.IPUT_BOOLEAN, ) - strings("menu_item_video_quality") } /** - * Matches with the class found in [videoQualitySetterFingerprint]. + * Matches with the class found in [videoQualitySetterMethod]. */ -internal val setVideoQualityFingerprint = fingerprint { - returns("V") - parameters("L") +context(_: BytecodePatchContext) +internal fun ClassDef.getSetVideoQualityMethod() = firstMethodDeclaratively { + returnType("V") + parameterTypes("L") opcodes( Opcode.IGET_OBJECT, Opcode.IPUT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 368aff634d..b8bd0a4f57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -1,15 +1,18 @@ package app.revanced.patches.youtube.video.information -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.* +import app.revanced.patcher.firstClassDef +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableClass -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patcher.util.smali.toInstructions import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint +import app.revanced.patches.youtube.misc.playservice.is_20_19_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.shared.videoQualityChangedMethodMatch import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch @@ -36,7 +39,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodImplementation import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.util.MethodUtil -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/VideoInformation;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/VideoInformation;" private const val EXTENSION_PLAYER_INTERFACE = "Lapp/revanced/extension/youtube/patches/VideoInformation\$PlaybackController;" private const val EXTENSION_VIDEO_QUALITY_MENU_INTERFACE = @@ -67,6 +71,8 @@ private var speedSelectionValueRegister = -1 private lateinit var setPlaybackSpeedMethod: MutableMethod private var setPlaybackSpeedMethodIndex = -1 +internal lateinit var videoEndMethod: MutableMethod + // Used by other patches. internal lateinit var setPlaybackSpeedContainerClassFieldReference: FieldReference private set @@ -82,63 +88,71 @@ val videoInformationPatch = bytecodePatch( sharedExtensionPatch, videoIdPatch, playerResponseMethodHookPatch, + versionCheckPatch, ) - execute { - playerInitMethod = playerInitFingerprint.classDef.methods.first { MethodUtil.isConstructor(it) } + apply { + with(playVideoCheckVideoStreamingDataResponseMethod) { + playerInitMethod = classDef.methods.first { MethodUtil.isConstructor(it) } - // Find the location of the first invoke-direct call and extract the register storing the 'this' object reference. - val initThisIndex = playerInitMethod.indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_DIRECT && getReference()?.name == "" + // Find the location of the first invoke-direct call + // and extract the register storing the 'this' object reference. + val initThisIndex = playerInitMethod.indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_DIRECT && getReference()?.name == "" + } + playerInitInsertRegister = + playerInitMethod.getInstruction(initThisIndex).registerC + playerInitInsertIndex = initThisIndex + 1 + + // Create extension interface methods. + addSeekInterfaceMethods( + playerInitMethod.classDef, + classDef.getSeekMethod(), + classDef.getSeekRelativeMethod(), + ) } - playerInitInsertRegister = playerInitMethod.getInstruction(initThisIndex).registerC - playerInitInsertIndex = initThisIndex + 1 - val seekFingerprintResultMethod = seekFingerprint.match(playerInitFingerprint.originalClassDef).method - val seekRelativeFingerprintResultMethod = - seekRelativeFingerprint.match(playerInitFingerprint.originalClassDef).method - - // Create extension interface methods. - addSeekInterfaceMethods( - playerInitFingerprint.classDef, - seekFingerprintResultMethod, - seekRelativeFingerprintResultMethod, - ) - - with(mdxPlayerDirectorSetVideoStageFingerprint) { + with(mdxPlayerDirectorSetVideoStageMethod) { mdxInitMethod = classDef.methods.first { MethodUtil.isConstructor(it) } val initThisIndex = mdxInitMethod.indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_DIRECT && getReference()?.name == "" } - mdxInitInsertRegister = mdxInitMethod.getInstruction(initThisIndex).registerC + mdxInitInsertRegister = + mdxInitMethod.getInstruction(initThisIndex).registerC mdxInitInsertIndex = initThisIndex + 1 // Hook the MDX director for use through the extension. onCreateHookMdx(EXTENSION_CLASS_DESCRIPTOR, "initializeMdx") - val mdxSeekFingerprintResultMethod = mdxSeekFingerprint.match(classDef).method - val mdxSeekRelativeFingerprintResultMethod = mdxSeekRelativeFingerprint.match(classDef).method - - addSeekInterfaceMethods(classDef, mdxSeekFingerprintResultMethod, mdxSeekRelativeFingerprintResultMethod) + addSeekInterfaceMethods( + classDef, + classDef.getMdxSeekMethod(), + classDef.getMdxSeekRelativeMethod(), + ) } - with(createVideoPlayerSeekbarFingerprint) { - val videoLengthMethodMatch = videoLengthFingerprint.match(originalClassDef) + with(createVideoPlayerSeekbarMethod) { + val videoLengthMethodMatch = immutableClassDef.videoLengthMethodMatch videoLengthMethodMatch.method.apply { - val videoLengthRegisterIndex = videoLengthMethodMatch.patternMatch!!.endIndex - 2 - val videoLengthRegister = getInstruction(videoLengthRegisterIndex).registerA - val dummyRegisterForLong = videoLengthRegister + 1 // required for long values since they are wide + val videoLengthRegisterIndex = videoLengthMethodMatch[-1] - 2 + val videoLengthRegister = + getInstruction(videoLengthRegisterIndex).registerA + val dummyRegisterForLong = + videoLengthRegister + 1 // Required for long values since they are wide. addInstruction( - videoLengthMethodMatch.patternMatch!!.endIndex, + videoLengthMethodMatch[-1], "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, " + - "$EXTENSION_CLASS_DESCRIPTOR->setVideoLength(J)V", + "$EXTENSION_CLASS_DESCRIPTOR->setVideoLength(J)V", ) } } + videoEndMethod = navigate(videoEndMethodMatch.immutableMethod) + .to(videoEndMethodMatch[0]).stop() + /* * Inject call for video ids */ @@ -153,16 +167,15 @@ val videoInformationPatch = bytecodePatch( addPlayerResponseMethodHook( Hook.ProtoBufferParameterBeforeVideoId( "$EXTENSION_CLASS_DESCRIPTOR->" + - "newPlayerResponseSignature(Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;", + "newPlayerResponseSignature(Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;", ), ) /* * Set the video time method */ - timeMethod = navigate(playerControllerSetTimeReferenceFingerprint.originalMethod) - .to(playerControllerSetTimeReferenceFingerprint.patternMatch!!.startIndex) - .stop() + timeMethod = navigate(playerControllerSetTimeReferenceMethodMatch.immutableMethod) + .to(playerControllerSetTimeReferenceMethodMatch[0]).stop() /* * Hook the methods which set the time @@ -172,7 +185,7 @@ val videoInformationPatch = bytecodePatch( /* * Hook the user playback speed selection. */ - onPlaybackSpeedItemClickFingerprint.method.apply { + onPlaybackSpeedItemClickMethod.apply { val speedSelectionValueInstructionIndex = indexOfFirstInstructionOrThrow(Opcode.IGET) legacySpeedSelectionInsertMethod = this @@ -188,12 +201,12 @@ val videoInformationPatch = bytecodePatch( getInstruction(indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) - 1).reference as FieldReference setPlaybackSpeedMethod = - proxy(classes.first { it.type == setPlaybackSpeedMethodReference.definingClass }) - .mutableClass.methods.first { it.name == setPlaybackSpeedMethodReference.name } + firstClassDef(setPlaybackSpeedMethodReference.definingClass) + .methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 // Add override playback speed method. - onPlaybackSpeedItemClickFingerprint.classDef.methods.add( + onPlaybackSpeedItemClickMethod.classDef.methods.add( ImmutableMethod( definingClass, "overridePlaybackSpeed", @@ -224,13 +237,15 @@ val videoInformationPatch = bytecodePatch( :ignore return-void - """.toInstructions(), null, null - ) - ).toMutable() + """.toInstructions(), + null, + null, + ), + ).toMutable(), ) } - playbackSpeedClassFingerprint.method.apply { + playbackSpeedClassMethod.apply { val index = indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) val register = getInstruction(index).registerA val playbackSpeedClass = this.returnType @@ -238,7 +253,7 @@ val videoInformationPatch = bytecodePatch( // Set playback speed class. addInstructionsAtControlFlowLabel( index, - "sput-object v$register, $EXTENSION_CLASS_DESCRIPTOR->playbackSpeedClass:$playbackSpeedClass" + "sput-object v$register, $EXTENSION_CLASS_DESCRIPTOR->playbackSpeedClass:$playbackSpeedClass", ) val smaliInstructions = @@ -255,33 +270,35 @@ val videoInformationPatch = bytecodePatch( "overridePlaybackSpeed", "playbackSpeedClass", playbackSpeedClass, - smaliInstructions + smaliInstructions, ) } // Handle new playback speed menu. - playbackSpeedMenuSpeedChangedFingerprint.match( - videoQualityChangedFingerprint.originalClassDef, - ).method.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.IGET) + videoQualityChangedMethodMatch.immutableClassDef.playbackSpeedMenuSpeedChangedMethodMatch.let { + it.method.apply { + val index = it[0] - speedSelectionInsertMethod = this - speedSelectionInsertIndex = index + 1 - speedSelectionValueRegister = getInstruction(index).registerA + speedSelectionInsertMethod = this + speedSelectionInsertIndex = index + 1 + speedSelectionValueRegister = + getInstruction(index).registerA + } } - videoQualityFingerprint.let { + (if (is_20_19_or_greater) videoQualityMethod else videoQualityLegacyMethod).apply { // Fix bad data used by YouTube. - it.method.addInstructions( + val nameRegister = if (is_20_20_or_greater) "p3" else "p2" + addInstructions( 0, """ - invoke-static { p2, p1 }, $EXTENSION_CLASS_DESCRIPTOR->fixVideoQualityResolution(Ljava/lang/String;I)I + invoke-static { $nameRegister, p1 }, $EXTENSION_CLASS_DESCRIPTOR->fixVideoQualityResolution(Ljava/lang/String;I)I move-result p1 - """ + """, ) // Add methods to access obfuscated quality fields. - it.classDef.apply { + classDef.apply { methods.add( ImmutableMethod( type, @@ -303,9 +320,9 @@ val videoInformationPatch = bytecodePatch( """ iget-object v0, p0, $qualityNameField return-object v0 - """ + """, ) - } + }, ) methods.add( @@ -328,28 +345,23 @@ val videoInformationPatch = bytecodePatch( """ iget v0, p0, $resolutionField return v0 - """ + """, ) - } + }, ) } } // Detect video quality changes and override the current quality. - setVideoQualityFingerprint.match( - videoQualitySetterFingerprint.originalClassDef - ).let { match -> + videoQualitySetterMethod.immutableClassDef.getSetVideoQualityMethod().let { + it // This instruction refers to the field with the type that contains the setQuality method. - val onItemClickListenerClassReference = match.method - .getInstruction(0).reference - val setQualityFieldReference = match.method - .getInstruction(1).reference as FieldReference + val onItemClickListenerClassReference = + it.getInstruction(0).reference + val setQualityFieldReference = + it.getInstruction(1).fieldReference!! - proxy( - classes.find { classDef -> - classDef.type == setQualityFieldReference.type - }!! - ).mutableClass.apply { + firstClassDef(setQualityFieldReference.type).apply { // Add interface and helper methods to allow extension code to call obfuscated methods. interfaces.add(EXTENSION_VIDEO_QUALITY_MENU_INTERFACE) @@ -358,7 +370,7 @@ val videoInformationPatch = bytecodePatch( type, "patch_setQuality", listOf( - ImmutableMethodParameter(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE, null, null) + ImmutableMethodParameter(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE, null, null), ), "V", AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, @@ -375,13 +387,13 @@ val videoInformationPatch = bytecodePatch( """ invoke-virtual { p0, p1 }, $setQualityMenuIndexMethod return-void - """ + """, ) - } + }, ) } - videoQualitySetterFingerprint.method.addInstructions( + videoQualitySetterMethod.addInstructions( 0, """ # Get object instance to invoke setQuality method. @@ -390,7 +402,7 @@ val videoInformationPatch = bytecodePatch( invoke-static { p1, v0, p2 }, $EXTENSION_CLASS_DESCRIPTOR->setVideoQuality([$YOUTUBE_VIDEO_QUALITY_CLASS_TYPE${EXTENSION_VIDEO_QUALITY_MENU_INTERFACE}I)I move-result p2 - """ + """, ) } @@ -400,7 +412,11 @@ val videoInformationPatch = bytecodePatch( } } -private fun addSeekInterfaceMethods(targetClass: MutableClass, seekToMethod: Method, seekToRelativeMethod: Method) { +private fun addSeekInterfaceMethods( + targetClass: MutableClassDef, + seekToMethod: Method, + seekToRelativeMethod: Method +) { // Add the interface and methods that extension calls. targetClass.interfaces.add(EXTENSION_PLAYER_INTERFACE) @@ -490,11 +506,10 @@ internal fun onCreateHookMdx(targetMethodClass: String, targetMethodName: String * @param targetMethodClass The descriptor for the static method to invoke when the player controller is created. * @param targetMethodName The name of the static method to invoke when the player controller is created. */ -fun videoTimeHook(targetMethodClass: String, targetMethodName: String) = - timeMethod.insertTimeHook( - timeInitInsertIndex++, - "$targetMethodClass->$targetMethodName(J)V", - ) +fun videoTimeHook(targetMethodClass: String, targetMethodName: String) = timeMethod.insertTimeHook( + timeInitInsertIndex++, + "$targetMethodClass->$targetMethodName(J)V", +) /** * Hook when the video speed is changed for any reason _except when the user manually selects a new speed_. @@ -502,7 +517,7 @@ fun videoTimeHook(targetMethodClass: String, targetMethodName: String) = fun videoSpeedChangedHook(targetMethodClass: String, targetMethodName: String) = setPlaybackSpeedMethod.addInstruction( setPlaybackSpeedMethodIndex++, - "invoke-static { p1 }, $targetMethodClass->$targetMethodName(F)V" + "invoke-static { p1 }, $targetMethodClass->$targetMethodName(F)V", ) /** @@ -511,11 +526,11 @@ fun videoSpeedChangedHook(targetMethodClass: String, targetMethodName: String) = fun userSelectedPlaybackSpeedHook(targetMethodClass: String, targetMethodName: String) { legacySpeedSelectionInsertMethod.addInstruction( legacySpeedSelectionInsertIndex++, - "invoke-static { v$legacySpeedSelectionValueRegister }, $targetMethodClass->$targetMethodName(F)V" + "invoke-static { v$legacySpeedSelectionValueRegister }, $targetMethodClass->$targetMethodName(F)V", ) speedSelectionInsertMethod.addInstruction( speedSelectionInsertIndex++, "invoke-static { v$speedSelectionValueRegister }, $targetMethodClass->$targetMethodName(F)V", ) -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index d958285b4d..cd78c70575 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -1,19 +1,19 @@ package app.revanced.patches.youtube.video.playerresponse -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import org.stringtemplate.v4.compiler.Bytecode.instructions /** - * For targets 20.15 and later. + * For targets 20.46 and later. */ -internal val playerParameterBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters( - "Ljava/lang/String;", // VideoId. + returnType("L") + parameterTypes( + "Ljava/lang/String;", // VideoId. "[B", - "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", // Player parameters proto buffer. "Ljava/lang/String;", "I", "Z", @@ -25,21 +25,74 @@ internal val playerParameterBuilderFingerprint = fingerprint { "L", "Z", // Appears to indicate if the video id is being opened or is currently playing. "Z", - "Z" + "Z", + "Lj$/time/Duration;", ) - strings("psps") +} + +/** + * For targets 20.26 and later. + */ +internal val BytecodePatchContext.playerParameterBuilder2026Method by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "Z", + "I", + "L", + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + "Lj$/time/Duration;", + ) + instructions("psps"()) +} + +/** + * For targets 20.15 to 20.25 + */ +internal val BytecodePatchContext.playerParameterBuilder2015Method by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "Z", + "I", + "L", + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + ) + instructions("psps"()) } /** * For targets 20.10 to 20.14. */ -internal val playerParameterBuilder2010Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2010Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters( - "Ljava/lang/String;", // VideoId. + returnType("L") + parameterTypes( + "Ljava/lang/String;", // VideoId. "[B", - "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", // Player parameters proto buffer. "Ljava/lang/String;", "I", "Z", @@ -52,18 +105,18 @@ internal val playerParameterBuilder2010Fingerprint = fingerprint { "Z", // Appears to indicate if the video id is being opened or is currently playing. "Z", "Z", - "Z" + "Z", ) - strings("psps") + instructions("psps"()) } /** * For targets 20.02 to 20.09. */ -internal val playerParameterBuilder2002Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2002Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters( + returnType("L") + parameterTypes( "Ljava/lang/String;", // VideoId. "[B", "Ljava/lang/String;", // Player parameters proto buffer. @@ -80,16 +133,16 @@ internal val playerParameterBuilder2002Fingerprint = fingerprint { "Z", "Z", ) - strings("psps") + instructions("psps"()) } /** * For targets 19.25 to 19.50. */ -internal val playerParameterBuilder1925Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder1925Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters( + returnType("L") + parameterTypes( "Ljava/lang/String;", // VideoId. "[B", "Ljava/lang/String;", // Player parameters proto buffer. @@ -105,16 +158,16 @@ internal val playerParameterBuilder1925Fingerprint = fingerprint { "Z", "Z", ) - strings("psps") + instructions("psps"()) } /** - * For targets 19.24 and earlier. + * For targets 19.01 to 19.24. */ -internal val playerParameterBuilderLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilderLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters( + returnType("L") + parameterTypes( "Ljava/lang/String;", // VideoId. "[B", "Ljava/lang/String;", // Player parameters proto buffer. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt index 898f400968..e9b4503b49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt @@ -1,15 +1,16 @@ package app.revanced.patches.youtube.video.playerresponse -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_26_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_46_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch private val hooks = mutableSetOf() @@ -38,25 +39,31 @@ val playerResponseMethodHookPatch = bytecodePatch { versionCheckPatch, ) - execute { - val fingerprint : Fingerprint - if (is_20_15_or_greater) { + apply { + val method: MutableMethod + if (is_20_46_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilderFingerprint + method = playerParameterBuilderMethod + } else if (is_20_26_or_greater) { + parameterIsShortAndOpeningOrPlaying = 13 + method = playerParameterBuilder2026Method + } else if (is_20_15_or_greater) { + parameterIsShortAndOpeningOrPlaying = 13 + method = playerParameterBuilder2015Method } else if (is_20_10_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilder2010Fingerprint + method = playerParameterBuilder2010Method } else if (is_20_02_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - fingerprint = playerParameterBuilder2002Fingerprint + method = playerParameterBuilder2002Method } else if (is_19_23_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - fingerprint = playerParameterBuilder1925Fingerprint + method = playerParameterBuilder1925Method } else { parameterIsShortAndOpeningOrPlaying = 11 - fingerprint = playerParameterBuilderLegacyFingerprint + method = playerParameterBuilderLegacyMethod } - playerResponseMethod = fingerprint.method + playerResponseMethod = method // On some app targets the method has too many registers pushing the parameters past v15. // If needed, move the parameters to 4-bit registers, so they can be passed to the extension. @@ -74,7 +81,7 @@ val playerResponseMethodHookPatch = bytecodePatch { } } - finalize { + afterDependents { fun hookVideoId(hook: Hook) { playerResponseMethod.addInstruction( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt index 6397a1184c..77ac486946 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt @@ -1,19 +1,17 @@ package app.revanced.patches.youtube.video.quality -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.recyclerviewtree.hook.addRecyclerViewTreeHook import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch @@ -25,67 +23,56 @@ internal var videoQualityBottomSheetListFragmentTitle = -1L internal var videoQualityQuickMenuAdvancedMenuDescription = -1L private set -private val advancedVideoQualityMenuResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - // Used for the old type of the video quality menu. - videoQualityBottomSheetListFragmentTitle = resourceMappings[ - "layout", - "video_quality_bottom_sheet_list_fragment_title", - ] - - videoQualityQuickMenuAdvancedMenuDescription = resourceMappings[ - "string", - "video_quality_quick_menu_advanced_menu_description", - ] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch;" private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter;" + "Lapp/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter;" internal val advancedVideoQualityMenuPatch = bytecodePatch { dependsOn( - advancedVideoQualityMenuResourcePatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, lithoFilterPatch, recyclerViewTreeHookPatch, + resourceMappingPatch, ) - execute { + apply { addResources("youtube", "video.quality.advancedVideoQualityMenuPatch") settingsMenuVideoQualityGroup.add( - SwitchPreference("revanced_advanced_video_quality_menu") + SwitchPreference("revanced_advanced_video_quality_menu"), ) + // Used for the old type of the video quality menu. + videoQualityBottomSheetListFragmentTitle = + ResourceType.LAYOUT["video_quality_bottom_sheet_list_fragment_title"] + videoQualityQuickMenuAdvancedMenuDescription = + ResourceType.STRING["video_quality_quick_menu_advanced_menu_description"] + // region Patch for the old type of the video quality menu. // Used for regular videos when spoofing to old app version, // and for the Shorts quality flyout on newer app versions. - videoQualityMenuViewInflateFingerprint.let { + videoQualityMenuViewInflateMethodMatch.let { it.method.apply { - val checkCastIndex = it.patternMatch!!.endIndex + val checkCastIndex = it[-1] val listViewRegister = getInstruction(checkCastIndex).registerA addInstruction( checkCastIndex + 1, "invoke-static { v$listViewRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + - "addVideoQualityListMenuListener(Landroid/widget/ListView;)V", + "addVideoQualityListMenuListener(Landroid/widget/ListView;)V", ) } } // Force YT to add the 'advanced' quality menu for Shorts. - videoQualityMenuOptionsFingerprint.let { - val patternMatch = it.patternMatch!! - val startIndex = patternMatch.startIndex - val insertIndex = patternMatch.endIndex + videoQualityMenuOptionsMethodMatch.let { + val startIndex = it[0] + val insertIndex = it[-1] + if (startIndex != 0) throw PatchException("Unexpected opcode start index: $startIndex") it.method.apply { @@ -98,7 +85,7 @@ internal val advancedVideoQualityMenuPatch = bytecodePatch { """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->forceAdvancedVideoQualityMenuCreation(Z)Z move-result v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index 31c0c15d5f..f10565959c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -1,35 +1,41 @@ package app.revanced.patches.youtube.video.quality -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val videoQualityItemOnClickParentFingerprint = fingerprint { - returns("V") - strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT") +internal val BytecodePatchContext.videoQualityItemOnClickParentMethod by gettingFirstImmutableMethodDeclaratively( + "VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT", +) { + returnType("V") } -/** - * Resolves to class found in [videoQualityItemOnClickFingerprint]. - */ -internal val videoQualityItemOnClickFingerprint = fingerprint { - returns("V") - parameters( +context(_: BytecodePatchContext) +internal fun ClassDef.getVideoQualityItemOnClickMethod() = firstMethodDeclaratively { + name("onItemClick") + returnType("V") + parameterTypes( "Landroid/widget/AdapterView;", "Landroid/view/View;", "I", - "J" + "J", ) - custom { method, _ -> - method.name == "onItemClick" - } } -internal val videoQualityMenuOptionsFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityMenuOptionsMethodMatch by composingFirstMethod { accessFlags(AccessFlags.STATIC) - returns("[L") - parameters("Landroid/content/Context", "L", "L") + returnType("[L") + parameterTypes("Landroid/content/Context", "L", "L") opcodes( Opcode.CONST_4, // First instruction of method. Opcode.CONST_4, @@ -40,10 +46,10 @@ internal val videoQualityMenuOptionsFingerprint = fingerprint { literal { videoQualityQuickMenuAdvancedMenuDescription } } -internal val videoQualityMenuViewInflateFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityMenuViewInflateMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters("L", "L", "L") + returnType("L") + parameterTypes("L", "L", "L") opcodes( Opcode.INVOKE_SUPER, Opcode.CONST, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 2f67487c87..9b38ead454 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -1,7 +1,8 @@ package app.revanced.patches.youtube.video.quality -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,8 +10,9 @@ import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint +import app.revanced.patches.youtube.shared.videoQualityChangedMethodMatch import app.revanced.patches.youtube.video.information.onCreateHook import app.revanced.patches.youtube.video.information.videoInformationPatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -25,59 +27,58 @@ val rememberVideoQualityPatch = bytecodePatch { playerTypeHookPatch, settingsPatch, addResourcesPatch, + versionCheckPatch, ) - execute { + apply { addResources("youtube", "video.quality.rememberVideoQualityPatch") - settingsMenuVideoQualityGroup.addAll(listOf( - ListPreference( - key = "revanced_video_quality_default_mobile", - entriesKey = "revanced_video_quality_default_entries", - entryValuesKey = "revanced_video_quality_default_entry_values" - ), - ListPreference( - key = "revanced_video_quality_default_wifi", - entriesKey = "revanced_video_quality_default_entries", - entryValuesKey = "revanced_video_quality_default_entry_values" - ), - SwitchPreference("revanced_remember_video_quality_last_selected"), + settingsMenuVideoQualityGroup.addAll( + listOf( + ListPreference( + key = "revanced_video_quality_default_mobile", + entriesKey = "revanced_video_quality_default_entries", + entryValuesKey = "revanced_video_quality_default_entry_values", + ), + ListPreference( + key = "revanced_video_quality_default_wifi", + entriesKey = "revanced_video_quality_default_entries", + entryValuesKey = "revanced_video_quality_default_entry_values", + ), + SwitchPreference("revanced_remember_video_quality_last_selected"), - ListPreference( - key = "revanced_shorts_quality_default_mobile", - entriesKey = "revanced_shorts_quality_default_entries", - entryValuesKey = "revanced_shorts_quality_default_entry_values", + ListPreference( + key = "revanced_shorts_quality_default_mobile", + entriesKey = "revanced_shorts_quality_default_entries", + entryValuesKey = "revanced_shorts_quality_default_entry_values", + ), + ListPreference( + key = "revanced_shorts_quality_default_wifi", + entriesKey = "revanced_shorts_quality_default_entries", + entryValuesKey = "revanced_shorts_quality_default_entry_values", + ), + SwitchPreference("revanced_remember_shorts_quality_last_selected"), + SwitchPreference("revanced_remember_video_quality_last_selected_toast"), ), - ListPreference( - key = "revanced_shorts_quality_default_wifi", - entriesKey = "revanced_shorts_quality_default_entries", - entryValuesKey = "revanced_shorts_quality_default_entry_values" - ), - SwitchPreference("revanced_remember_shorts_quality_last_selected"), - SwitchPreference("revanced_remember_video_quality_last_selected_toast") - )) + ) onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") // Inject a call to remember the selected quality for Shorts. - videoQualityItemOnClickFingerprint.match( - videoQualityItemOnClickParentFingerprint.classDef - ).method.addInstruction( + videoQualityItemOnClickParentMethod.immutableClassDef.getVideoQualityItemOnClickMethod().addInstruction( 0, - "invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->userChangedShortsQuality(I)V" + "invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->userChangedShortsQuality(I)V", ) // Inject a call to remember the user selected quality for regular videos. - videoQualityChangedFingerprint.let { - it.method.apply { - val index = it.patternMatch!!.startIndex - val register = getInstruction(index).registerA + videoQualityChangedMethodMatch.let { match -> + val index = match[3] + val register = match.method.getInstruction(index).registerA - addInstruction( - index + 1, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V", - ) - } + match.method.addInstruction( + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V", + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt index d2618bb63f..f0cd306c14 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt @@ -13,9 +13,9 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources private val videoQualityButtonResourcePatch = resourcePatch { - dependsOn(playerControlsResourcePatch) + dependsOn(playerControlsPatch) - execute { + apply { copyResources( "qualitybutton", ResourceGroup( @@ -43,7 +43,7 @@ val videoQualityDialogButtonPatch = bytecodePatch( playerControlsPatch, ) - execute { + apply { addResources("youtube", "video.quality.button.videoQualityDialogButtonPatch") PreferenceScreen.PLAYER.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index b188238e20..bc5639098b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -14,24 +14,24 @@ internal val settingsMenuVideoQualityGroup = mutableSetOf() @Suppress("unused") val videoQualityPatch = bytecodePatch( name = "Video quality", - description = "Adds options to set default video qualities and always use the advanced video quality menu." + description = "Adds options to set default video qualities and always use the advanced video quality menu.", ) { dependsOn( rememberVideoQualityPatch, advancedVideoQualityMenuPatch, - videoQualityDialogButtonPatch + videoQualityDialogButtonPatch, ) compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", - ) + "20.21.37", + "20.31.40", + ), ) - execute { + apply { PreferenceScreen.VIDEO.addPreferences( // Keep the preferences organized together. PreferenceCategory( @@ -39,8 +39,8 @@ val videoQualityPatch = bytecodePatch( titleKey = null, sorting = Sorting.UNSORTED, tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", - preferences = settingsMenuVideoQualityGroup - ) + preferences = settingsMenuVideoQualityGroup, + ), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index 2e50ba2f6a..cecb755e0f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -28,14 +28,14 @@ val playbackSpeedPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", + "19.43.41", "20.14.43", + "20.21.37", + "20.31.40", ) ) - execute { + apply { PreferenceScreen.VIDEO.addPreferences( PreferenceCategory( key = "revanced_zz_video_key", // Dummy key to force the speed settings last. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt index 4885aa0fe0..98c425f894 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt @@ -17,9 +17,9 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources private val playbackSpeedButtonResourcePatch = resourcePatch { - dependsOn(playerControlsResourcePatch) + dependsOn(playerControlsPatch) - execute { + apply { copyResources( "speedbutton", ResourceGroup( @@ -48,7 +48,7 @@ val playbackSpeedButtonPatch = bytecodePatch( videoInformationPatch, ) - execute { + apply { addResources("youtube", "video.speed.button.playbackSpeedButtonPatch") PreferenceScreen.PLAYER.addPreferences( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 9f905d6fc7..5f3273718f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -1,59 +1,44 @@ package app.revanced.patches.youtube.video.speed.custom -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.interaction.seekbar.customTapAndHoldMethodMatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.recyclerviewtree.hook.addRecyclerViewTreeHook import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstruction import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableField private const val FILTER_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter;" + "Lapp/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter;" -internal const val EXTENSION_CLASS_DESCRIPTOR = +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" -internal var speedUnavailableId = -1L - private set - -private val customPlaybackSpeedResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - speedUnavailableId = resourceMappings["string", "varispeed_unavailable_message"] - } -} - internal val customPlaybackSpeedPatch = bytecodePatch( description = "Adds custom playback speed options.", ) { @@ -64,10 +49,10 @@ internal val customPlaybackSpeedPatch = bytecodePatch( lithoFilterPatch, versionCheckPatch, recyclerViewTreeHookPatch, - customPlaybackSpeedResourcePatch + resourceMappingPatch, ) - execute { + apply { addResources("youtube", "video.speed.custom.customPlaybackSpeedPatch") settingsMenuVideoSpeedGroup.addAll( @@ -76,95 +61,90 @@ internal val customPlaybackSpeedPatch = bytecodePatch( SwitchPreference("revanced_restore_old_speed_menu"), TextPreference( "revanced_custom_playback_speeds", - inputType = InputType.TEXT_MULTI_LINE + inputType = InputType.TEXT_MULTI_LINE, ), - ) + ), ) - if (is_19_25_or_greater) { + if (is_19_47_or_greater) { settingsMenuVideoSpeedGroup.add( TextPreference("revanced_speed_tap_and_hold", inputType = InputType.NUMBER_DECIMAL), ) } // Override the min/max speeds that can be used. - speedLimiterFingerprint.method.apply { + (if (is_20_34_or_greater) speedLimiterMethod else speedLimiterLegacyMethod).apply { val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f) - var limitMaxIndex = indexOfFirstLiteralInstruction(2.0f) - // Newer targets have 4x max speed. - if (limitMaxIndex < 0) { - limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) - } + // Older unsupported targets use 2.0f and not 4.0f + val limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) val limitMinRegister = getInstruction(limitMinIndex).registerA val limitMaxRegister = getInstruction(limitMaxIndex).registerA - replaceInstruction(limitMinIndex, "const/high16 v$limitMinRegister, 0.0f") replaceInstruction(limitMaxIndex, "const/high16 v$limitMaxRegister, 8.0f") } - - // Replace the speeds float array with custom speeds. - // These speeds are used if the speed menu is immediately opened after a video is opened. - speedArrayGeneratorFingerprint.method.apply { - val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "size" } - val sizeCallResultRegister = getInstruction(sizeCallIndex + 1).registerA - - replaceInstruction(sizeCallIndex + 1, "const/4 v$sizeCallResultRegister, 0x0") - - val arrayLengthConstIndex = indexOfFirstLiteralInstructionOrThrow(7) - val arrayLengthConstDestination = getInstruction(arrayLengthConstIndex).registerA - val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" - - addInstructions( - arrayLengthConstIndex + 1, - """ - sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType - array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination - """, - ) - - val originalArrayFetchIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.type == "[F" && reference.definingClass.endsWith("/PlayerConfigModel;") - } - val originalArrayFetchDestination = - getInstruction(originalArrayFetchIndex).registerA - - replaceInstruction( - originalArrayFetchIndex, - "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", - ) + // Turn off client side flag that use server provided min/max speeds. + if (is_20_34_or_greater) { + serverSideMaxSpeedFeatureFlagMethod.returnEarly(false) } // region Force old video quality menu. + // Replace the speeds float array with custom speeds. + speedArrayGeneratorMethodMatch.let { + it.method.apply { + val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" + // Apply changes from last index to first to preserve indexes. + + val originalArrayFetchIndex = it[5] + val originalArrayFetchDestination = getInstruction(it[5]).registerA + replaceInstruction( + originalArrayFetchIndex, + "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", + ) + + val arrayLengthConstDestination = getInstruction(it[3]).registerA + val newArrayIndex = it[4] + addInstructions( + newArrayIndex, + """ + sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType + array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination + """, + ) + + val sizeCallIndex = it[0] + 1 + val sizeCallResultRegister = getInstruction(sizeCallIndex).registerA + replaceInstruction(sizeCallIndex, "const/4 v$sizeCallResultRegister, 0x0") + } + } + // Add a static INSTANCE field to the class. // This is later used to call "showOldPlaybackSpeedMenu" on the instance. val instanceField = ImmutableField( - getOldPlaybackSpeedsFingerprint.originalClassDef.type, + getOldPlaybackSpeedsMethod.immutableClassDef.type, "INSTANCE", - getOldPlaybackSpeedsFingerprint.originalClassDef.type, + getOldPlaybackSpeedsMethod.immutableClassDef.type, AccessFlags.PUBLIC.value or AccessFlags.STATIC.value, null, null, null, ).toMutable() - getOldPlaybackSpeedsFingerprint.classDef.staticFields.add(instanceField) + getOldPlaybackSpeedsMethod.classDef.staticFields.add(instanceField) // Set the INSTANCE field to the instance of the class. // In order to prevent a conflict with another patch, add the instruction at index 1. - getOldPlaybackSpeedsFingerprint.method.addInstruction(1, "sput-object p0, $instanceField") + getOldPlaybackSpeedsMethod.addInstruction(1, "sput-object p0, $instanceField") // Get the "showOldPlaybackSpeedMenu" method. // This is later called on the field INSTANCE. - val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match( - getOldPlaybackSpeedsFingerprint.classDef, - ).method + val showOldPlaybackSpeedMenuMethod = + getOldPlaybackSpeedsMethod.immutableClassDef.getShowOldPlaybackSpeedMenuMethod() // Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE. - showOldPlaybackSpeedMenuExtensionFingerprint.method.apply { + showOldPlaybackSpeedMenuExtensionMethod.apply { addInstructionsWithLabels( instructions.lastIndex, """ @@ -173,34 +153,36 @@ internal val customPlaybackSpeedPatch = bytecodePatch( return-void :not_null invoke-virtual { v0 }, $showOldPlaybackSpeedMenuMethod - """ + """, ) } // endregion - // Close the unpatched playback dialog and show the modern custom dialog. + // Close the unpatched playback dialog and show the custom speeds. addRecyclerViewTreeHook(EXTENSION_CLASS_DESCRIPTOR) // Required to check if the playback speed menu is currently shown. addLithoFilter(FILTER_CLASS_DESCRIPTOR) + // endregion + // region Custom tap and hold 2x speed. - if (is_19_25_or_greater) { - disableFastForwardNoticeFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - (this as? NarrowLiteralInstruction)?.narrowLiteral == 2.0f.toRawBits() - } - val register = getInstruction(index).registerA + if (is_19_47_or_greater) { + customTapAndHoldMethodMatch.let { + it.method.apply { + val index = it[0] + val register = getInstruction(index).registerA - addInstructions( - index + 1, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F - move-result v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F + move-result v$register + """, + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index f39a4136f1..c2db863a55 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -1,39 +1,71 @@ package app.revanced.patches.youtube.video.speed.custom -import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.StringReference +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val getOldPlaybackSpeedsFingerprint = fingerprint { - parameters("[L", "I") - strings("menu_item_playback_speed") +internal val BytecodePatchContext.getOldPlaybackSpeedsMethod by gettingFirstMethodDeclaratively( + "menu_item_playback_speed", +) { + parameterTypes("[L", "I") } -internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { - literal { speedUnavailableId } +context(_: BytecodePatchContext) +internal fun ClassDef.getShowOldPlaybackSpeedMenuMethod() = firstMethodDeclaratively { + instructions( + ResourceType.STRING("varispeed_unavailable_message"), + ) } -internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showOldPlaybackSpeedMenu" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +internal val BytecodePatchContext.showOldPlaybackSpeedMenuExtensionMethod by gettingFirstMethodDeclaratively { + name("showOldPlaybackSpeedMenu") } -internal val speedArrayGeneratorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("[L") - parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") - strings("0.0#") -} - -internal val speedLimiterFingerprint = fingerprint { +internal val BytecodePatchContext.serverSideMaxSpeedFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("F") + returnType("Z") + instructions( + 45719140L(), + ) +} + +internal val BytecodePatchContext.speedArrayGeneratorMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returnType("[L") + parameterTypes("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") + instructions( + method { name == "size" && returnType == "I" }, + allOf(Opcode.NEW_INSTANCE(), type("Ljava/text/DecimalFormat;")), + "0.0#"(), + 7L(), + Opcode.NEW_ARRAY(), + field { definingClass.endsWith("/PlayerConfigModel;") && type == "[F" }, + ) +} + +/** + * 20.34+ + */ +internal val BytecodePatchContext.speedLimiterMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("F", "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;") + instructions( + 0.25f.toRawBits().toLong()(), + 4.0f.toRawBits().toLong()(), + ) +} + +/** + * 20.33 and lower. + */ +internal val BytecodePatchContext.speedLimiterLegacyMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("F") opcodes( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, @@ -45,16 +77,3 @@ internal val speedLimiterFingerprint = fingerprint { Opcode.INVOKE_STATIC, ) } - -internal val disableFastForwardNoticeFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.name == "run" && method.indexOfFirstInstruction { - // In later targets the code is found in different methods with different strings. - val string = getReference()?.string - string == "Failed to easy seek haptics vibrate." || string == "search_landing_cache_key" - } >= 0 - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt index 3924588b42..51e43993dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt @@ -1,8 +1,10 @@ package app.revanced.patches.youtube.video.speed.remember -import app.revanced.patcher.fingerprint +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext -internal val initializePlaybackSpeedValuesFingerprint = fingerprint { - parameters("[L", "I") - strings("menu_item_playback_speed") +internal val BytecodePatchContext.initializePlaybackSpeedValuesMethod by gettingFirstMethodDeclaratively( + "menu_item_playback_speed", +) { + parameterTypes("[L", "I") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index 39160955cb..315da7fa0a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.video.speed.remember -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.ListPreference @@ -24,10 +24,10 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { settingsPatch, addResourcesPatch, videoInformationPatch, - customPlaybackSpeedPatch + customPlaybackSpeedPatch, ) - execute { + apply { addResources("youtube", "video.speed.remember.rememberPlaybackSpeedPatch") settingsMenuVideoSpeedGroup.addAll( @@ -37,11 +37,11 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { // Entries and values are set by the extension code based on the actual speeds available. entriesKey = null, entryValuesKey = null, - tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference" + tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference", ), SwitchPreference("revanced_remember_playback_speed_last_selected"), - SwitchPreference("revanced_remember_playback_speed_last_selected_toast") - ) + SwitchPreference("revanced_remember_playback_speed_last_selected_toast"), + ), ) onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") @@ -54,7 +54,7 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { /* * Hook the code that is called when the playback speeds are initialized, and sets the playback speed */ - initializePlaybackSpeedValuesFingerprint.method.apply { + initializePlaybackSpeedValuesMethod.apply { // Infer everything necessary for calling the method setPlaybackSpeed(). val onItemClickListenerClassFieldReference = getInstruction(0).reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 6d4a3c6cb8..535f38abc6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,55 +1,55 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val videoIdFingerprint = fingerprint { +/** + * Matches using the class found in [videoIdParentMethodMatch]. + */ +context(_: BytecodePatchContext) +internal fun ClassDef.getVideoIdMethodMatch() = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - opcodes( - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, + returnType("V") + parameterTypes("L") + instructions( + method { + definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && + returnType == "Ljava/lang/String;" + }, + Opcode.MOVE_RESULT_OBJECT(), ) - custom { method, _ -> - method.indexOfPlayerResponseModelString() >= 0 - } } -internal val videoIdBackgroundPlayFingerprint = fingerprint { +internal val BytecodePatchContext.videoIdBackgroundPlayMethodMatch by composingFirstMethod { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) - returns("V") - parameters("L") - opcodes( - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID + returnType("V") + parameterTypes("L") + instructions( + method { + definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && + returnType == "Ljava/lang/String;" + }, + Opcode.MOVE_RESULT_OBJECT(), + Opcode.IPUT_OBJECT(), + Opcode.MONITOR_EXIT(), + Opcode.RETURN_VOID(), + Opcode.MONITOR_EXIT(), + Opcode.RETURN_VOID(), ) - // The target snippet of code is buried in a huge switch block and the target method - // has been changed many times by YT which makes identifying it more difficult than usual. - custom { method, classDef -> - // Access flags changed in 19.36 - AccessFlags.FINAL.isSet(method.accessFlags) && - AccessFlags.DECLARED_SYNCHRONIZED.isSet(method.accessFlags) && - classDef.methods.count() == 17 && - method.implementation != null && - method.indexOfPlayerResponseModelString() >= 0 + custom { + immutableClassDef.methods.count() == 17 || // 20.39 and lower. + immutableClassDef.methods.count() == 16 // 20.40+ } - } -internal val videoIdParentFingerprint = fingerprint { +internal val BytecodePatchContext.videoIdParentMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("[L") - parameters("L") - literal { 524288L } + returnType("[L") + parameterTypes("L") + instructions( + 524288L(), + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 6d69381cd3..76465dd9e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -1,19 +1,15 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference /** * Hooks the new video id when the video changes. @@ -95,25 +91,21 @@ val videoIdPatch = bytecodePatch( playerResponseMethodHookPatch, ) - execute { - videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).method.apply { - videoIdMethod = this - val index = indexOfPlayerResponseModelString() - videoIdRegister = getInstruction(index + 1).registerA + apply { + videoIdParentMethodMatch.immutableClassDef.getVideoIdMethodMatch().let { + videoIdMethod = it.method + + val index = it[0] + videoIdRegister = it.method.getInstruction(index + 1).registerA videoIdInsertIndex = index + 2 } - videoIdBackgroundPlayFingerprint.method.apply { - backgroundPlaybackMethod = this - val index = indexOfPlayerResponseModelString() - backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA + videoIdBackgroundPlayMethodMatch.let { + backgroundPlaybackMethod = it.method + + val index = it[0] + backgroundPlaybackVideoIdRegister = it.method.getInstruction(index + 1).registerA backgroundPlaybackInsertIndex = index + 2 } } } - -internal fun Method.indexOfPlayerResponseModelString() = indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && - reference.returnType == "Ljava/lang/String;" -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt deleted file mode 100644 index 537a2b68c4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.video.videoqualitymenu - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.video.quality.videoQualityPatch - -@Suppress("unused") -@Deprecated("Use 'Video Quality' instead.") -val restoreOldVideoQualityMenuPatch = bytecodePatch { - dependsOn(videoQualityPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt deleted file mode 100644 index af38f28f4d..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.yuka.misc.unlockpremium - -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -internal val isPremiumFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - opcodes( - Opcode.IGET_BOOLEAN, - Opcode.RETURN, - ) -} - -internal val yukaUserConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - strings("premiumProvider") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt deleted file mode 100644 index c4cedd0927..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt +++ /dev/null @@ -1,23 +0,0 @@ -package app.revanced.patches.yuka.misc.unlockpremium - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val unlockPremiumPatch = bytecodePatch { - - compatibleWith("io.yuka.android"("4.29")) - - execute { - isPremiumFingerprint.match( - yukaUserConstructorFingerprint.originalClassDef, - ).method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index f5a39a9969..8ffe3e029f 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -1,22 +1,15 @@ package app.revanced.util -import app.revanced.patcher.FingerprintBuilder -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.* +import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.util.proxy.mutableTypes.MutableClass -import app.revanced.patcher.util.proxy.mutableTypes.MutableField -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.util.InstructionUtils.Companion.branchOpcodes import app.revanced.util.InstructionUtils.Companion.returnOpcodes import app.revanced.util.InstructionUtils.Companion.writeOpcodes @@ -25,6 +18,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode.* import com.android.tools.smali.dexlib2.analysis.reflection.util.ReflectionUtils import com.android.tools.smali.dexlib2.formatter.DexFormatter +import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.* import com.android.tools.smali.dexlib2.iface.reference.FieldReference @@ -34,8 +28,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference import com.android.tools.smali.dexlib2.iface.value.* import com.android.tools.smali.dexlib2.immutable.ImmutableField import com.android.tools.smali.dexlib2.immutable.value.* -import com.android.tools.smali.dexlib2.util.MethodUtil import java.util.* +import kotlin.collections.ArrayDeque /** * Starting from and including the instruction at index [startIndex], @@ -94,7 +88,10 @@ fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): In return bestFreeRegisterFound } // This method is simple and does not follow branching. - throw IllegalArgumentException("Encountered a branch statement before a free register could be found") + throw IllegalArgumentException( + "Encountered a branch statement before " + + "a free register could be found from startIndex: $startIndex", + ) } if (instruction.isReturnInstruction) { @@ -111,8 +108,10 @@ fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): In // Somehow every method register was read from before any register was wrote to. // In practice this never occurs. - throw IllegalArgumentException("Could not find a free register from startIndex: " + - "$startIndex excluding: $registersToExclude") + throw IllegalArgumentException( + "Could not find a free register from startIndex: " + + "$startIndex excluding: $registersToExclude", + ) } } @@ -139,9 +138,13 @@ internal val Instruction.registersUsed: List } is ThreeRegisterInstruction -> listOf(registerA, registerB, registerC) + is TwoRegisterInstruction -> listOf(registerA, registerB) + is OneRegisterInstruction -> listOf(registerA) + is RegisterRangeInstruction -> (startRegister until (startRegister + registerCount)).toList() + else -> emptyList() } @@ -217,7 +220,8 @@ private fun Method.findInstructionIndexFromToString(fieldName: String): Int { val fieldSetOpcode = getInstruction(fieldSetIndex).opcode if (fieldSetOpcode == MOVE_RESULT || fieldSetOpcode == MOVE_RESULT_WIDE || - fieldSetOpcode == MOVE_RESULT_OBJECT) { + fieldSetOpcode == MOVE_RESULT_OBJECT + ) { fieldSetIndex-- } @@ -229,10 +233,10 @@ private fun Method.findInstructionIndexFromToString(fieldName: String): Int { * * @param fieldName The name of the field to find. Partial matches are allowed. */ -context(BytecodePatchContext) +context(context: BytecodePatchContext) internal fun Method.findMethodFromToString(fieldName: String): MutableMethod { val methodUsageIndex = findInstructionIndexFromToString(fieldName) - return navigate(this).to(methodUsageIndex).stop() + return context.navigate(this).to(methodUsageIndex).stop() } /** @@ -248,28 +252,16 @@ internal fun Method.findFieldFromToString(fieldName: String): FieldReference { /** * Adds public [AccessFlags] and removes private and protected flags (if present). */ -internal fun Int.toPublicAccessFlags(): Int { - return this.or(AccessFlags.PUBLIC.value) - .and(AccessFlags.PROTECTED.value.inv()) - .and(AccessFlags.PRIVATE.value.inv()) -} - -/** - * Find the [MutableMethod] from a given [Method] in a [MutableClass]. - * - * @param method The [Method] to find. - * @return The [MutableMethod]. - */ -fun MutableClass.findMutableMethodOf(method: Method) = this.methods.first { - MethodUtil.methodSignaturesMatch(it, method) -} +internal fun Int.toPublicAccessFlags(): Int = this.or(AccessFlags.PUBLIC.value) + .and(AccessFlags.PROTECTED.value.inv()) + .and(AccessFlags.PRIVATE.value.inv()) /** * Apply a transform to all methods of the class. * * @param transform The transformation function. Accepts a [MutableMethod] and returns a transformed [MutableMethod]. */ -fun MutableClass.transformMethods(transform: MutableMethod.() -> MutableMethod) { +fun MutableClassDef.transformMethods(transform: MutableMethod.() -> MutableMethod) { val transformedMethods = methods.map { it.transform() } methods.clear() methods.addAll(transformedMethods) @@ -293,7 +285,6 @@ fun MutableMethod.injectHideViewCall( "invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V", ) - /** * Inserts instructions at a given index, using the existing control flow label at that index. * Inserted instructions can have it's own control flow labels as well. @@ -310,7 +301,7 @@ fun MutableMethod.injectHideViewCall( // TODO: delete this on next major version bump. fun MutableMethod.addInstructionsAtControlFlowLabel( insertIndex: Int, - instructions: String + instructions: String, ) = addInstructionsAtControlFlowLabel(insertIndex, instructions, *arrayOf()) /** @@ -329,7 +320,7 @@ fun MutableMethod.addInstructionsAtControlFlowLabel( fun MutableMethod.addInstructionsAtControlFlowLabel( insertIndex: Int, instructions: String, - vararg externalLabels: ExternalLabel + vararg externalLabels: ExternalLabel, ) { // Duplicate original instruction and add to +1 index. addInstruction(insertIndex + 1, getInstruction(insertIndex)) @@ -355,10 +346,8 @@ fun MutableMethod.addInstructionsAtControlFlowLabel( * @throws PatchException if the resource cannot be found. * @see [indexOfFirstResourceIdOrThrow], [indexOfFirstLiteralInstructionReversed] */ -fun Method.indexOfFirstResourceId(resourceName: String): Int { - val resourceId = resourceMappings["id", resourceName] - return indexOfFirstLiteralInstruction(resourceId) -} +fun Method.indexOfFirstResourceId(resourceName: String): Int = + indexOfFirstLiteralInstruction(ResourceType.ID[resourceName]) /** * Get the index of the first instruction with the id of the given resource name or throw a [PatchException]. @@ -407,8 +396,7 @@ fun Method.indexOfFirstLiteralInstructionOrThrow(literal: Long): Int { * @return the first literal instruction with the value, or -1 if not found. * @see indexOfFirstLiteralInstructionOrThrow */ -fun Method.indexOfFirstLiteralInstruction(literal: Float) = - indexOfFirstLiteralInstruction(literal.toRawBits().toLong()) +fun Method.indexOfFirstLiteralInstruction(literal: Float) = indexOfFirstLiteralInstruction(literal.toRawBits().toLong()) /** * Find the index of the first literal instruction with the given float value, @@ -428,8 +416,7 @@ fun Method.indexOfFirstLiteralInstructionOrThrow(literal: Float): Int { * @return the first literal instruction with the value, or -1 if not found. * @see indexOfFirstLiteralInstructionOrThrow */ -fun Method.indexOfFirstLiteralInstruction(literal: Double) = - indexOfFirstLiteralInstruction(literal.toRawBits()) +fun Method.indexOfFirstLiteralInstruction(literal: Double) = indexOfFirstLiteralInstruction(literal.toRawBits()) /** * Find the index of the first literal instruction with the given double value, @@ -536,12 +523,12 @@ fun Method.containsLiteralInstruction(literal: Double) = indexOfFirstLiteralInst * @param targetClass the class to start traversing the class hierarchy from. * @param callback function that is called for every class in the hierarchy. */ -fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClass, callback: MutableClass.() -> Unit) { +fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClassDef, callback: MutableClassDef.() -> Unit) { callback(targetClass) targetClass.superclass ?: return - classBy { targetClass.superclass == it.type }?.mutableClass?.let { + firstClassDefOrNull(targetClass.superclass!!)?.let { traverseClassHierarchy(it, callback) } } @@ -753,8 +740,12 @@ fun Method.findInstructionIndicesReversedOrThrow(opcode: Opcode): List { * Suitable for calls to extension code to override boolean and integer values. */ internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodDescriptor: String) { - // TODO: make this work with objects and wide values. val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + insertLiteralOverride(literalIndex, extensionMethodDescriptor) +} + +internal fun MutableMethod.insertLiteralOverride(literalIndex: Int, extensionMethodDescriptor: String) { + // TODO: make this work with objects and wide primitive values. val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT) val register = getInstruction(index).registerA @@ -769,7 +760,7 @@ internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodD """ $operation, $extensionMethodDescriptor move-result v$register - """ + """, ) } @@ -778,61 +769,49 @@ internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodD */ internal fun MutableMethod.insertLiteralOverride(literal: Long, override: Boolean) { val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + return insertLiteralOverride(literalIndex, override) +} + +/** + * Constant value override of the first MOVE_RESULT after the index parameter. + */ +internal fun MutableMethod.insertLiteralOverride(literalIndex: Int, override: Boolean) { val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT) val register = getInstruction(index).registerA val overrideValue = if (override) "0x1" else "0x0" addInstruction( index + 1, - "const v$register, $overrideValue" + "const v$register, $overrideValue", ) } /** - * Called for _all_ methods with the given literal value. - * Method indices are iterated from last to first. + * Iterates all instructions as sequence in all methods of all classes in the [BytecodePatchContext]. + * + * @param match A function that matches instructions. If a match is found, it returns a value of type [T], otherwise null. + * @param transform A function that transforms the matched instruction using the mutable method and the matched value + * of type [T]. */ -fun BytecodePatchContext.forEachLiteralValueInstruction( - literal: Long, - block: MutableMethod.(matchingIndex: Int) -> Unit, +fun BytecodePatchContext.forEachInstructionAsSequence( + match: (classDef: ClassDef, method: Method, instruction: Instruction, index: Int) -> T?, + transform: (MutableMethod, T) -> Unit ) { - val matchingIndexes = ArrayList() + classDefs.flatMap { classDef -> + classDef.methods.mapNotNull { method -> + val matches = method.instructionsOrNull?.mapIndexedNotNull { index, instruction -> + match(classDef, method, instruction, index) + } ?: return@mapNotNull null - classes.forEach { classDef -> - classDef.methods.forEach { method -> - method.implementation?.instructions?.let { instructions -> - matchingIndexes.clear() - - instructions.forEachIndexed { index, instruction -> - if ((instruction as? WideLiteralInstruction)?.wideLiteral == literal) { - matchingIndexes.add(index) - } - } - - if (matchingIndexes.isNotEmpty()) { - val mutableMethod = proxy(classDef).mutableClass.findMutableMethodOf(method) - - // FIXME: Until patcher V22 is merged, this workaround is needed - // because if multiple patches modify the same class - // then after modifying the method indexes of immutable classes - // are no longer correct. - matchingIndexes.clear() - mutableMethod.instructions.forEachIndexed { index, instruction -> - if ((instruction as? WideLiteralInstruction)?.wideLiteral == literal) { - matchingIndexes.add(index) - } - } - if (matchingIndexes.isEmpty()) return@forEach - // FIXME Remove code above after V22 merge. - - matchingIndexes.asReversed().forEach { index -> - block.invoke(mutableMethod, index) - } - } - } + if (matches.any()) method to matches else null } - } + }.forEach { (method, matches) -> + val method = firstMethod(method) + val matches = matches.toCollection(ArrayDeque()) + + while (!matches.isEmpty()) transform(method, matches.removeLast()) + } } private fun MutableMethod.checkReturnType(expectedTypes: Iterable>) { @@ -1231,16 +1210,13 @@ internal fun MutableField.removeFlags(vararg flags: AccessFlags) { } internal fun BytecodePatchContext.addStaticFieldToExtension( - className: String, + type: String, methodName: String, fieldName: String, objectClass: String, - smaliInstructions: String + smaliInstructions: String, ) { - val classDef = classes.find { classDef -> classDef.type == className } - ?: throw PatchException("No matching methods found in: $className") - val mutableClass = proxy(classDef).mutableClass - + val mutableClass = firstClassDef(type) val objectCall = "$mutableClass->$fieldName:$objectClass" mutableClass.apply { @@ -1253,30 +1229,28 @@ internal fun BytecodePatchContext.addStaticFieldToExtension( AccessFlags.PUBLIC.value or AccessFlags.STATIC.value, null, annotations, - null - ).toMutable() + null, + ).toMutable(), ) addInstructionsWithLabels( 0, """ sget-object v0, $objectCall - """ + smaliInstructions + """ + smaliInstructions, ) } } } /** - * Set the custom condition for this fingerprint to check for a literal value. + * Set the custom condition for this predicate to check for a literal value. * * @param literalSupplier The supplier for the literal value to check for. */ -// TODO: add a way for subclasses to also use their own custom fingerprint. -fun FingerprintBuilder.literal(literalSupplier: () -> Long) { - custom { method, _ -> - method.containsLiteralInstruction(literalSupplier()) - } +@Deprecated("Instead use `literal()`") +fun MutablePredicateList.literal(literalSupplier: () -> Long) { + custom { containsLiteralInstruction(literalSupplier()) } } private class InstructionUtils { @@ -1285,12 +1259,16 @@ private class InstructionUtils { GOTO, GOTO_16, GOTO_32, IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE, IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ, - PACKED_SWITCH_PAYLOAD, SPARSE_SWITCH_PAYLOAD + PACKED_SWITCH_PAYLOAD, SPARSE_SWITCH_PAYLOAD, ) val returnOpcodes: EnumSet = EnumSet.of( - RETURN_VOID, RETURN, RETURN_WIDE, RETURN_OBJECT, RETURN_VOID_NO_BARRIER, - THROW + RETURN_VOID, + RETURN, + RETURN_WIDE, + RETURN_OBJECT, + RETURN_VOID_NO_BARRIER, + THROW, ) val writeOpcodes: EnumSet = EnumSet.of( diff --git a/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt b/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt index cb9c0b213d..c0956257c3 100644 --- a/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt +++ b/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt @@ -17,40 +17,40 @@ class StringResource( val value: String, val formatted: Boolean = true, ) : BaseResource(name, "string") { - override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = - super.serialize(ownerDocument, resourceCallback).apply { - - fun String.validateAndroidStringEscaping() : String { - if (value.startsWith('"') && value.endsWith('"')) { - // Raw strings allow unescaped single quote but not double quote. - if (!value.substring(1, value.length - 1).contains(Regex("(? Unit) = super.serialize(ownerDocument, resourceCallback).apply { + fun String.validateAndroidStringEscaping(): String { + if (value.startsWith('"') && value.endsWith('"')) { + // Raw strings allow unescaped single quote but not double quote. + if (!value.substring(1, value.length - 1).contains(Regex("(?@string/revanced_miniplayer_type_entry_0 @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 - @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 @string/revanced_miniplayer_type_entry_7 + DISABLED + DEFAULT + MINIMAL + MODERN_1 + MODERN_2 + MODERN_3 + MODERN_4 + + + @string/revanced_miniplayer_type_entry_0 + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_5 + @string/revanced_miniplayer_type_entry_6 + @string/revanced_miniplayer_type_entry_7 + + DISABLED DEFAULT MINIMAL @@ -567,14 +586,6 @@ - - @string/revanced_shorts_player_type_shorts - @string/revanced_shorts_player_type_regular_player - - - SHORTS_PLAYER - REGULAR_PLAYER - @string/revanced_shorts_player_type_shorts @string/revanced_shorts_player_type_regular_player diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index ce372be397..38d270a1d0 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Show settings search history Settings search history is shown Settings search history is not shown + Disable bold icons + Icons are not bold + Icons are bold Show ReVanced setting icons Setting icons are shown Setting icons are not shown @@ -772,6 +775,9 @@ If changing this setting does not take effect, try switching to Incognito mode." Hide navigation button labels Labels are hidden Labels are shown + Enable navigation bar animations + Navigation transitions are animated + Navigation transitions are not animated Disable translucent status bar Status bar is opaque Status bar is opaque or translucent @@ -891,6 +897,9 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Hide video thumbnails seekbar Video thumbnails seekbar is hidden Video thumbnails seekbar is shown + Enable fullscreen large seekbar + Fullscreen seekbar is large size + Fullscreen seekbar is normal size Shorts player diff --git a/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml b/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml index a243eea714..a3f7a9e119 100644 --- a/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml +++ b/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml @@ -11,7 +11,7 @@ style="@style/YouTubePlayerButton" android:layout_width="48.0dip" android:layout_height="60.0dip" - android:paddingTop="6.5dp" + android:paddingTop="6.0dp" android:paddingBottom="0dp" android:longClickable="false" android:scaleType="center" diff --git a/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml b/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml index bcd7def9e7..1947f997e0 100644 --- a/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml +++ b/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml @@ -1,22 +1,21 @@ - + - + android:id="@+id/revanced_loop_video_button" + style="@style/YouTubePlayerButton" + android:layout_width="48.0dip" + android:layout_height="60.0dip" + android:longClickable="false" + android:paddingTop="6.0dp" + android:paddingBottom="0dp" + android:scaleType="center" + android:src="@drawable/revanced_loop_video_button_off" + yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" + yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" /> diff --git a/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml b/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml new file mode 100644 index 0000000000..f69f9b329a --- /dev/null +++ b/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml index d308d6f8ca..3fd2696b3a 100644 --- a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml +++ b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml @@ -1,10 +1,10 @@ + android:width="40dp" + android:height="40dp" + android:viewportWidth="40" + android:viewportHeight="40"> + android:fillColor="#000000" + android:fillType="evenOdd" + android:pathData="M22.1641,5.24609 L36.5547,30.168 C37.5156,31.8359,36.3164,33.918,34.3906,33.918 L5.60938,33.918 C3.68359,33.918,2.48438,31.8359,3.44531,30.168 L17.8359,5.24609 C18.7969,3.58203,21.2031,3.58203,22.1641,5.24609 Z M20,25 C19.0781,25,18.332,25.7461,18.332,26.668 C18.332,27.5898,19.0781,28.332,20,28.332 C20.9219,28.332,21.668,27.5898,21.668,26.668 C21.668,25.7461,20.9219,25,20,25 Z M20,13.332 C19.1445,13.332,18.4414,13.9766,18.3438,14.8047 L18.332,15 L18.332,21.668 C18.332,22.5898,19.0781,23.332,20,23.332 C20.8555,23.332,21.5586,22.6875,21.6563,21.8633 L21.668,21.668 L21.668,15 C21.668,14.0781,20.9219,13.332,20,13.332 Z M20,13.332" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml index 6c43a8a43a..a0b9a55c32 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M14.97,16.95L10,13.87V7h2v5.76l4.03,2.49L14.97,16.95zM22,12c0,5.51 -4.49,10 -10,10S2,17.51 2,12h1c0,4.96 4.04,9 9,9s9,-4.04 9,-9s-4.04,-9 -9,-9C8.81,3 5.92,4.64 4.28,7.38C4.17,7.56 4.06,7.75 3.97,7.94C3.96,7.96 3.95,7.98 3.94,8H8v1H1.96V3h1v4.74C3,7.65 3.03,7.57 3.07,7.49C3.18,7.27 3.3,7.07 3.42,6.86C5.22,3.86 8.51,2 12,2C17.51,2 22,6.49 22,12z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml new file mode 100644 index 0000000000..1666db5b22 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml index 0623e325f7..b7895fdd00 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M9.29446,19 L3.4,12.708 L4.24339,11.8029 L9.29446,17.1896 L20.1565,5.6 L21,6.50026 Z M9.29446,19" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml new file mode 100644 index 0000000000..d12c3282ac --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml new file mode 100644 index 0000000000..c929e507de --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml new file mode 100644 index 0000000000..bc1f5584ec --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml index ddc7120197..eb0e23c75c 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M13,17h-2v-6h2V17zM13,7h-2v2h2V7zM12,3c-4.96,0 -9,4.04 -9,9s4.04,9 9,9c4.96,0 9,-4.04 9,-9S16.96,3 12,3M12,2c5.52,0 10,4.48 10,10s-4.48,10 -10,10C6.48,22 2,17.52 2,12S6.48,2 12,2L12,2z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml new file mode 100644 index 0000000000..b931198cf6 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml index 2654631d88..fb26813b95 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M17.9219,12.5 L17.9219,11.5 L21.1523,11.5 L21.1523,12.5 Z M19.0078,18.9609 L16.4219,17.0234 L17.0469,16.2305 L19.6289,18.168 Z M16.9688,7.69141 L16.3477,6.89844 L18.9297,4.96094 L19.5547,5.75391 Z M5.5,17.9609 L5.5,14.1523 L4.46094,14.1523 C4.01563,14.1523,3.63281,13.9961,3.31641,13.6836 C3.00391,13.3672,2.84766,12.9844,2.84766,12.5391 L2.84766,11.4609 C2.84766,11.0156,3.00391,10.6328,3.31641,10.3164 C3.63281,10.0039,4.01563,9.84766,4.46094,9.84766 L8.19141,9.84766 L12.1523,7.5 L12.1523,16.5 L8.19141,14.1523 L6.5,14.1523 L6.5,17.9609 Z M11.1523,14.7188 L11.1523,9.28125 L8.47266,10.8477 L4.46094,10.8477 C4.30859,10.8477,4.16797,10.9102,4.03906,11.0391 C3.91016,11.168,3.84766,11.3086,3.84766,11.4609 L3.84766,12.5391 C3.84766,12.6914,3.91016,12.832,4.03906,12.9609 C4.16797,13.0898,4.30859,13.1523,4.46094,13.1523 L8.47266,13.1523 Z M13.9219,14.8867 L13.9219,9.11328 C14.2578,9.42188,14.5273,9.82813,14.7305,10.332 C14.9375,10.8398,15.0391,11.3945,15.0391,12 C15.0391,12.6055,14.9375,13.1602,14.7305,13.668 C14.5273,14.1719,14.2578,14.5781,13.9219,14.8867 Z M7.5,12 Z M7.5,12" /> \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml new file mode 100644 index 0000000000..f341714f33 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml index 4b9486c897..7fcbe912b7 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml @@ -6,16 +6,16 @@ Copyright 2023 Ajay Ramachandran --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M12.0814,1.99794 C9.37251,1.99794,6.97872,3.32778,5.20335,5.14149 C3.42798,6.9552,1.99794,9.39989,1.99794,12.1677 C1.99794,14.9355,3.10403,17.7107,4.87939,19.5244 C6.65476,21.3381,9.37195,21.9549,12.0814,21.9549 C14.7908,21.9549,17.0848,20.9067,18.8601,19.093 C20.6355,17.2793,22.002,14.9355,22.002,12.1677 C22.002,9.40046,20.8525,6.83638,19.0766,5.02267 C17.3013,3.20894,14.7903,1.99794,12.0814,1.99794 Z M11.9105,5.02102 C13.838,5.02102,15.5196,6.09439,16.7829,7.35711 C18.0462,8.61984,18.8878,10.3004,18.8878,12.2279 C18.8878,14.1554,18.2513,16.0427,16.988,17.3054 C15.7247,18.5681,13.8374,18.9333,11.9105,18.9333 C9.98355,18.9333,8.36976,18.2962,7.10645,17.0335 C5.84314,15.7708,5.11222,14.1554,5.11222,12.2278 C5.11222,10.3003,5.63697,8.47868,6.8997,7.21537 C8.16239,5.95218,9.98293,5.02102,11.9105,5.02102 Z" + android:strokeWidth="1" + android:strokeColor="?android:attr/textColorPrimary" /> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M15.3108,11.899 C15.3108,13.6514,13.8411,15.1264,12.0887,15.1264 C10.3363,15.1264,8.97704,13.6515,8.97704,11.899 C8.97704,10.1466,10.3363,8.71961,12.0887,8.71961 C13.8411,8.71961,15.3108,10.1466,15.3108,11.899 Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml new file mode 100644 index 0000000000..9854f09fc0 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml index 2af656695a..ce88360a8e 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M4.85,19.775Q4.15,19.775 3.688,19.312Q3.225,18.85 3.225,18.15V12.55H4.225V18.15Q4.225,18.375 4.425,18.575Q4.625,18.775 4.85,18.775H12.45V19.775ZM8.625,16Q7.925,16 7.463,15.537Q7,15.075 7,14.375V8.775H8V14.375Q8,14.625 8.188,14.812Q8.375,15 8.625,15H16.225V16ZM12.375,12.225Q11.7,12.225 11.238,11.762Q10.775,11.3 10.775,10.625V5.85Q10.775,5.15 11.238,4.687Q11.7,4.225 12.375,4.225H19.15Q19.85,4.225 20.312,4.687Q20.775,5.15 20.775,5.85V10.625Q20.775,11.3 20.312,11.762Q19.85,12.225 19.15,12.225ZM12.375,11.225H19.15Q19.375,11.225 19.575,11.037Q19.775,10.85 19.775,10.625V7.225H11.775V10.625Q11.775,10.85 11.963,11.037Q12.15,11.225 12.375,11.225Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml new file mode 100644 index 0000000000..edce57018e --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml index c6a2625bbe..8c6d6cd7fb 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M12,9.5c1.38,0 2.5,1.12 2.5,2.5s-1.12,2.5 -2.5,2.5S9.5,13.38 9.5,12S10.62,9.5 12,9.5M12,8.5c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S13.93,8.5 12,8.5L12,8.5zM13.22,3l0.55,2.2l0.13,0.51l0.5,0.18c0.61,0.23 1.19,0.56 1.72,0.98l0.4,0.32l0.5,-0.14l2.17,-0.62l1.22,2.11l-1.63,1.59l-0.37,0.36l0.08,0.51c0.05,0.32 0.08,0.64 0.08,0.98s-0.03,0.66 -0.08,0.98l-0.08,0.51l0.37,0.36l1.63,1.59l-1.22,2.11l-2.17,-0.62l-0.5,-0.14l-0.4,0.32c-0.53,0.43 -1.11,0.76 -1.72,0.98l-0.5,0.18l-0.13,0.51L13.22,21h-2.44l-0.55,-2.2l-0.13,-0.51l-0.5,-0.18C9,17.88 8.42,17.55 7.88,17.12l-0.4,-0.32l-0.5,0.14l-2.17,0.62L3.6,15.44l1.63,-1.59l0.37,-0.36l-0.08,-0.51C5.47,12.66 5.44,12.33 5.44,12s0.03,-0.66 0.08,-0.98l0.08,-0.51l-0.37,-0.36L3.6,8.56l1.22,-2.11l2.17,0.62l0.5,0.14l0.4,-0.32C8.42,6.45 9,6.12 9.61,5.9l0.5,-0.18l0.13,-0.51L10.78,3H13.22M14,2h-4L9.26,4.96c-0.73,0.27 -1.4,0.66 -2,1.14L4.34,5.27l-2,3.46l2.19,2.13C4.47,11.23 4.44,11.61 4.44,12s0.03,0.77 0.09,1.14l-2.19,2.13l2,3.46l2.92,-0.83c0.6,0.48 1.27,0.87 2,1.14L10,22h4l0.74,-2.96c0.73,-0.27 1.4,-0.66 2,-1.14l2.92,0.83l2,-3.46l-2.19,-2.13c0.06,-0.37 0.09,-0.75 0.09,-1.14s-0.03,-0.77 -0.09,-1.14l2.19,-2.13l-2,-3.46L16.74,6.1c-0.6,-0.48 -1.27,-0.87 -2,-1.14L14,2L14,2z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml new file mode 100644 index 0000000000..5a14a69b52 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml index 94c5ce84a0..160c95eb91 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M11.5,20.5 L11.5,15.5 L12.5,15.5 L12.5,17.5 L20.5,17.5 L20.5,18.5 L12.5,18.5 L12.5,20.5 Z M3.5,18.5 L3.5,17.5 L8.5,17.5 L8.5,18.5 Z M7.5,14.5 L7.5,12.5 L3.5,12.5 L3.5,11.5 L7.5,11.5 L7.5,9.5 L8.5,9.5 L8.5,14.5 Z M11.5,12.5 L11.5,11.5 L20.5,11.5 L20.5,12.5 Z M15.5,8.5 L15.5,3.5 L16.5,3.5 L16.5,5.5 L20.5,5.5 L20.5,6.5 L16.5,6.5 L16.5,8.5 Z M3.5,6.5 L3.5,5.5 L12.5,5.5 L12.5,6.5 Z M3.5,6.5" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml new file mode 100644 index 0000000000..fde9e7cea6 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml index c16728ae2d..091ea60a36 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml @@ -15,15 +15,15 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M8.54688,22.2031 C7.00781,22.2031,5.51172,21.375,4.73047,19.9219 C3.66797,17.9414,4.32031,15.4531,6.21875,14.25 C6.23047,14.2422,6.24219,14.2344,6.25391,14.2305 C6.40625,14.1523,6.55469,14.0703,6.70703,13.9844 C6.59375,13.9219,6.48438,13.8594,6.37109,13.793 C5.20703,13.1211,4.49219,12.1758,4.29688,11.0508 C4.04297,9.55078,4.04297,7.65625,6.32031,6.28516 C8.07031,5.23828,9.86719,4.21484,11.6016,3.22266 C12.1797,2.89453,12.7539,2.56641,13.332,2.23438 C14.5313,1.54688,16.0195,1.51953,17.3008,2.16016 C18.5977,2.80469,19.4805,4.01563,19.6641,5.40625 C19.9297,7.17578,19.0469,8.94531,17.4609,9.80469 C17.3594,9.86328,17.2578,9.91797,17.1602,9.97656 C17.2539,10.0313,17.3477,10.0859,17.4414,10.1406 C18.7422,10.8711,19.5664,12.1172,19.6953,13.5547 C19.8242,14.9766,19.25,16.332,18.1211,17.2734 C17.7617,17.5664,17.3633,17.793,16.9805,18.0078 C16.8672,18.0703,16.7578,18.1328,16.6484,18.1953 C14.8711,19.2344,12.7617,20.457,10.5859,21.6875 C9.9375,22.0352,9.23828,22.2031,8.54688,22.2031 Z M6.69141,15.0313 C5.20703,15.9805,4.69922,17.9375,5.53125,19.4922 C6.42578,21.1484,8.49609,21.7773,10.1445,20.8906 C12.3086,19.668,14.4141,18.4453,16.1875,17.4102 C16.3008,17.3438,16.418,17.2773,16.5313,17.2148 C16.8984,17.0078,17.2461,16.8125,17.543,16.5703 C18.4336,15.8281,18.8906,14.7578,18.7891,13.6367 C18.6836,12.5039,18.0313,11.5156,16.9922,10.9336 C16.8281,10.8359,16.6641,10.7383,16.4961,10.6367 C16.3516,10.5508,16.2031,10.4609,16.043,10.3711 C15.9063,10.2891,15.8203,10.1445,15.8164,9.98438 C15.8125,9.82422,15.8984,9.67188,16.0352,9.58984 C16.3516,9.39063,16.6641,9.20703,17.0195,9.00781 C18.2773,8.32813,18.9727,6.92969,18.7617,5.53125 C18.6172,4.4375,17.9219,3.48438,16.8984,2.97656 C15.8828,2.47266,14.7188,2.49219,13.7813,3.02344 C13.207,3.35547,12.6289,3.68359,12.0547,4.01172 C10.3242,5.00391,8.53125,6.02344,6.78906,7.06641 C5.34375,7.9375,4.88281,9.04688,5.19531,10.8984 C5.34375,11.7539,5.89063,12.4648,6.82422,13 C7.15234,13.1875,7.47656,13.375,7.83984,13.5898 C7.97656,13.6719,8.0625,13.8203,8.0625,13.9805 C8.0625,14.1406,7.98047,14.2891,7.83984,14.375 C7.44531,14.6133,7.08203,14.8281,6.69141,15.0313 Z M6.69141,15.0313" /> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M10.0703,15.3555 C9.99219,15.3555,9.91406,15.3359,9.84375,15.2969 C9.69922,15.2148,9.61328,15.0625,9.61328,14.9023 L9.61328,9.08594 C9.61328,8.92188,9.69922,8.76953,9.83984,8.69141 C9.98438,8.60938,10.1563,8.60938,10.2969,8.69141 L15.3281,11.5898 C15.4688,11.6719,15.5547,11.8242,15.5547,11.9844 C15.5586,12.1484,15.4688,12.3008,15.3281,12.3789 L10.2969,15.2969 C10.2266,15.3359,10.1484,15.3555,10.0703,15.3555 Z M10.5234,9.875 L10.5234,14.1094 L14.1914,11.9883 Z M10.5234,9.875" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml new file mode 100644 index 0000000000..2b616d939b --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml index 92cc9e881f..d37211fdd4 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M4.5,14Q3.65,14 3.075,13.425Q2.5,12.85 2.5,12Q2.5,11.15 3.075,10.575Q3.65,10 4.5,10Q5.2,10 5.738,10.425Q6.275,10.85 6.425,11.5H21.5V12.5H6.425Q6.275,13.15 5.738,13.575Q5.2,14 4.5,14Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml new file mode 100644 index 0000000000..12fe4e8b79 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml index 27ddec3fe1..d804354496 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M3,21 L3,20.1328 L5.3125,20.1328 C4.33203,18.9844,3.54297,17.7266,2.95703,16.3516 C2.37109,14.9805,2.07813,13.5313,2.07813,12.0078 C2.07813,10.4883,2.37109,9.04297,2.95703,7.67578 C3.54297,6.30859,4.33203,5.04688,5.3125,3.88281 L3,3.88281 L3,3 L7.09766,3 L7.09766,7.11719 L6.23047,7.11719 L6.23047,4.17578 C5.25,5.28906,4.45703,6.50391,3.85156,7.82422 C3.24609,9.14063,2.94141,10.5352,2.94141,12.0078 C2.94141,13.4844,3.24609,14.875,3.85156,16.1875 C4.45703,17.4961,5.25,18.7031,6.23047,19.8047 L6.23047,16.9023 L7.09766,16.9023 L7.09766,21 Z M16.2969,19.8047 C15.9883,19.9141,15.668,19.9648,15.3359,19.9531 C15,19.9453,14.6836,19.8711,14.3789,19.7266 L8.0625,16.7891 L8.35938,16.1953 C8.46094,16.0156,8.59375,15.8711,8.75781,15.7656 C8.92188,15.6563,9.10547,15.5938,9.30859,15.5781 L12.1602,15.2578 L9.30469,7.44922 C9.25391,7.3125,9.26172,7.18359,9.32031,7.0625 C9.38281,6.94531,9.48047,6.85938,9.61719,6.80859 C9.75391,6.76172,9.88281,6.76563,10.0039,6.82813 C10.1211,6.88672,10.207,6.98438,10.2539,7.12109 L13.5508,16.1797 L9.80078,16.5078 L14.8086,18.8242 C14.9766,18.8984,15.1602,18.9453,15.3672,18.957 C15.5703,18.9727,15.7617,18.9453,15.9414,18.8711 L19.3867,17.6211 C20.043,17.3867,20.5195,16.957,20.8086,16.332 C21.1016,15.7109,21.1289,15.0703,20.8945,14.4102 L19.5195,10.6602 C19.4688,10.5234,19.4727,10.3945,19.5234,10.2734 C19.5781,10.1523,19.6719,10.0703,19.8125,10.0195 C19.9492,9.97266,20.0781,9.97266,20.1992,10.0273 C20.3203,10.0781,20.4023,10.1758,20.4531,10.3125 L21.8281,14.0625 C22.1719,14.9844,22.1406,15.8789,21.7383,16.75 C21.332,17.6172,20.668,18.2188,19.7422,18.5547 Z M14.5273,13.5469 L13.1563,9.76953 C13.1094,9.63281,13.1133,9.50391,13.1758,9.38281 C13.2344,9.26563,13.332,9.17969,13.4727,9.13281 C13.6094,9.08203,13.7383,9.08594,13.8555,9.14844 C13.9766,9.20703,14.0586,9.30469,14.1094,9.44141 L15.4844,13.1914 Z M17.1992,12.5586 L16.1719,9.73438 C16.125,9.59766,16.1289,9.46875,16.1914,9.35547 C16.25,9.23828,16.3477,9.16016,16.4844,9.11328 C16.625,9.0625,16.7539,9.06641,16.8711,9.12109 C16.9922,9.17188,17.0781,9.26563,17.125,9.40625 L18.1484,12.2266 Z M17.0898,15.2578 Z M17.0898,15.2578" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml new file mode 100644 index 0000000000..6ced78823d --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml index 046daf7d0c..4eea6e9690 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M3.625,15Q3,15 2.5,14.5Q2,14 2,13.375V12.15Q2,12.025 2.025,11.862Q2.05,11.7 2.1,11.55L4.85,5.075Q5.05,4.625 5.538,4.312Q6.025,4 6.55,4H16.575V15L10.3,21.2L9.875,20.75Q9.725,20.625 9.638,20.4Q9.55,20.175 9.55,20V19.85L10.575,15ZM15.575,5H6.55Q6.325,5 6.1,5.112Q5.875,5.225 5.775,5.5L3,12V13.375Q3,13.65 3.175,13.825Q3.35,14 3.625,14H11.8L10.65,19.45L15.575,14.575ZM15.575,14.575V14Q15.575,14 15.575,13.825Q15.575,13.65 15.575,13.375V12V5.5Q15.575,5.225 15.575,5.112Q15.575,5 15.575,5ZM16.575,15V14H20V5H16.575V4H21V15Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml new file mode 100644 index 0000000000..d35c3fb7b8 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml index 0ca8266de4..be1f45953c 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml @@ -6,11 +6,11 @@ Copyright 2021 Ajay Ramachandran --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M 12.000145,2.0000008 C 8.8230689,1.9990926 5.6959192,2.7864027 2.9017488,4.2906678 2.3373945,4.5948398 1.9899198,5.1860103 2.000223,5.8244635 2.0930396,12.358829 5.4926743,18.31271 11.094442,21.749998 c 0.557183,0.333336 1.253849,0.333336 1.811031,0 5.601767,-3.438045 9.001096,-9.391169 9.094295,-15.9255345 0.01052,-0.6386247 -0.337035,-1.2300179 -0.9016,-1.5341683 -2.794107,-1.5040456 -5.92111,-2.2912233 -9.098023,-2.2902944 z m 0.08082,0.8705548 c 3.003625,0.013255 5.957553,0.7636027 8.599879,2.1845129 0.277414,0.151228 0.448533,0.4421907 0.44513,0.7568723 C 21.034684,12.23921 17.58825,17.8544 12.446767,21.009378 c -0.274165,0.167124 -0.619386,0.167124 -0.893551,0 C 6.4117365,17.854399 2.9652339,12.239209 2.8739372,5.8119397 2.8705209,5.4972741 3.0416092,5.2063196 3.3189962,5.0550685 6.0095892,3.608201 9.0224769,2.8570356 12.080969,2.8705556 Z M 9.6351953,6.7701615 v 8.3406435 l 7.2606727,-4.170358 z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml new file mode 100644 index 0000000000..08e788ef55 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml index 3cf7dba65d..c2d5483a71 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M16.3,11.95 L12.075,7.725 16.3,3.5 20.525,7.725ZM4.625,10.625V4.625H10.625V10.625ZM13.375,19.375V13.375H19.375V19.375ZM4.625,19.375V13.375H10.625V19.375ZM5.625,9.625H9.625V5.625H5.625ZM16.325,10.575 L19.15,7.75 16.325,4.925 13.5,7.75ZM14.375,18.375H18.375V14.375H14.375ZM5.625,18.375H9.625V14.375H5.625ZM9.625,9.625ZM13.5,7.75ZM9.625,14.375ZM14.375,14.375Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml new file mode 100644 index 0000000000..ac63c495f8 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml index 87c0b6d4f3..fe1683f0ba 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M12,19H4.625Q3.925,19 3.463,18.538Q3,18.075 3,17.375V6.625Q3,5.925 3.463,5.463Q3.925,5 4.625,5H19.375Q20.075,5 20.538,5.463Q21,5.925 21,6.625V11H20V6.625Q20,6.35 19.825,6.175Q19.65,6 19.375,6H4.625Q4.35,6 4.175,6.175Q4,6.35 4,6.625V17.375Q4,17.65 4.175,17.825Q4.35,18 4.625,18H12ZM10,15.575V8.425L15.575,12ZM17.85,20.8 L17.75,19.95Q17.175,19.825 16.8,19.6Q16.425,19.375 16.1,19.025L15.3,19.4L14.725,18.525L15.45,17.95Q15.25,17.425 15.25,16.925Q15.25,16.425 15.45,15.9L14.725,15.3L15.3,14.45L16.1,14.8Q16.425,14.475 16.8,14.25Q17.175,14.025 17.75,13.9L17.85,13.05H18.85L18.95,13.9Q19.525,14.025 19.9,14.25Q20.275,14.475 20.6,14.825L21.4,14.45L21.975,15.325L21.25,15.9Q21.45,16.425 21.45,16.925Q21.45,17.425 21.25,17.95L21.975,18.525L21.4,19.4L20.6,19.025Q20.275,19.375 19.9,19.6Q19.525,19.825 18.95,19.95L18.85,20.8ZM18.35,19.075Q19.225,19.075 19.863,18.438Q20.5,17.8 20.5,16.925Q20.5,16.05 19.863,15.413Q19.225,14.775 18.35,14.775Q17.475,14.775 16.837,15.413Q16.2,16.05 16.2,16.925Q16.2,17.8 16.837,18.438Q17.475,19.075 18.35,19.075Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml new file mode 100644 index 0000000000..22a7d6febe --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml index e34340b6ca..89a59b85b3 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M11.0882,3 C6.62072,3,3,6.62368,3,11.0911 C3,15.5615,6.62368,19.1822,11.0911,19.1822 C13.172,19.1822,15.0691,18.3954,16.5029,17.1039 L20.094,20.695 C21.1138,19.6754,19.8953,20.8968,21,19.7921 L17.3822,16.1773 C18.5074,14.7874,19.1822,13.018,19.1822,11.0911 C19.1793,6.62072,15.5556,3,11.0882,3 Z M11.0882,4.27895 C14.851,4.27895,17.9004,7.32829,17.9004,11.0911 C17.9004,14.851,14.8511,17.9003,11.0882,17.9003 C7.32537,17.9003,4.27603,14.851,4.27603,11.0911 C4.27898,7.32827,7.32833,4.28189,11.0882,4.27893 Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml new file mode 100644 index 0000000000..22fcf34b9e --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml index 721d378856..62a8d1c302 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M7.61719,20 C7.16797,20,6.78516,19.8438,6.47266,19.5273 C6.15625,19.2148,6,18.832,6,18.3828 L6,6 L5,6 L5,5 L9,5 L9,4.23047 L15,4.23047 L15,5 L19,5 L19,6 L18,6 L18,18.3828 C18,18.8438,17.8477,19.2305,17.5391,19.5391 C17.2305,19.8477,16.8438,20,16.3828,20 Z M17,6 L7,6 L7,18.3828 C7,18.5625,7.05859,18.7109,7.17188,18.8281 C7.28906,18.9414,7.4375,19,7.61719,19 L16.3828,19 C16.5391,19,16.6797,18.9375,16.8086,18.8086 C16.9375,18.6797,17,18.5391,17,18.3828 Z M9.80859,17 L10.8086,17 L10.8086,8 L9.80859,8 Z M13.1914,17 L14.1914,17 L14.1914,8 L13.1914,8 Z M7,6 L7,19 Z M7,6" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml new file mode 100644 index 0000000000..3cb5d7d788 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml index dd8932acfd..3490e8c8c4 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="#000000" + android:pathData="M11.5,3.5 L3.5,11.5 L11.5,19.5 L12.3145,18.6914 L5.69531,12.0723 L21,12.0723 L21,10.9277 L5.69531,10.9277 L12.3145,4.30859 Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml new file mode 100644 index 0000000000..f93ab850c0 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml b/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml new file mode 100644 index 0000000000..66304a5c07 --- /dev/null +++ b/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml index 6b55b0da98..ab680d2a59 100644 --- a/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml +++ b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo.xml @@ -1,16 +1,16 @@ - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + android:fillColor="@android:color/white" + android:pathData="M 12.000145,2.0000008 C 8.8230689,1.9990926 5.6959192,2.7864027 2.9017488,4.2906678 2.3373945,4.5948398 1.9899198,5.1860103 2.000223,5.8244635 2.0930396,12.358829 5.4926743,18.31271 11.094442,21.749998 c 0.557183,0.333336 1.253849,0.333336 1.811031,0 5.601767,-3.438045 9.001096,-9.391169 9.094295,-15.9255345 0.01052,-0.6386247 -0.337035,-1.2300179 -0.9016,-1.5341683 -2.794107,-1.5040456 -5.92111,-2.2912233 -9.098023,-2.2902944 z m 0.08082,0.8705548 c 3.003625,0.013255 5.957553,0.7636027 8.599879,2.1845129 0.277414,0.151228 0.448533,0.4421907 0.44513,0.7568723 C 21.034684,12.23921 17.58825,17.8544 12.446767,21.009378 c -0.274165,0.167124 -0.619386,0.167124 -0.893551,0 C 6.4117365,17.854399 2.9652339,12.239209 2.8739372,5.8119397 2.8705209,5.4972741 3.0416092,5.2063196 3.3189962,5.0550685 6.0095892,3.608201 9.0224769,2.8570356 12.080969,2.8705556 Z M 9.6351953,6.7701615 v 8.3406435 l 7.2606727,-4.170358 z" /> diff --git a/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml new file mode 100644 index 0000000000..058128b131 --- /dev/null +++ b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 4ab39e0f47..edfcf40ede 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,18 +2,19 @@ rootProject.name = "revanced-patches" pluginManagement { repositories { + mavenLocal() gradlePluginPortal() google() maven { name = "githubPackages" - url = uri("https://maven.pkg.github.com/revanced/registry") + url = uri("https://maven.pkg.github.com/revanced/revanced-patches") credentials(PasswordCredentials::class) } } } plugins { - id("app.revanced.patches") version "1.0.0-dev.7" + id("app.revanced.patches") version "1.0.0-dev.9" } settings { From db5e0fe587bbd52b5fa2377ca2314b988400e49d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 27 Feb 2026 01:43:27 +0000 Subject: [PATCH 017/161] chore: Release v6.0.0-dev.1 [skip ci] # [6.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.2...v6.0.0-dev.1) (2026-02-27) * build(Needs bump)!: Update to ReVanced Patcher v22 ([#6542](https://github.com/ReVanced/revanced-patches/issues/6542)) ([ab2ac36](https://github.com/ReVanced/revanced-patches/commit/ab2ac36e3041cda87b659924ea2b75089f0bdb6e)) ### BREAKING CHANGES * Deprecated APIs have been removed, and various APIs now use the updated ReVanced Patcher v22 APIs. --- CHANGELOG.md | 10 ++++++++++ gradle.properties | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 514f4bc274..d6ec92c581 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# [6.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.2...v6.0.0-dev.1) (2026-02-27) + + +* build(Needs bump)!: Update to ReVanced Patcher v22 ([#6542](https://github.com/ReVanced/revanced-patches/issues/6542)) ([ab2ac36](https://github.com/ReVanced/revanced-patches/commit/ab2ac36e3041cda87b659924ea2b75089f0bdb6e)) + + +### BREAKING CHANGES + +* Deprecated APIs have been removed, and various APIs now use the updated ReVanced Patcher v22 APIs. + # [5.51.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.1...v5.51.0-dev.2) (2026-02-26) diff --git a/gradle.properties b/gradle.properties index 74c143b391..05c6263438 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,6 @@ org.gradle.caching = true org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true -android.uniquePackageNames=false +android.uniquePackageNames = false kotlin.code.style = official -version = 5.51.0-dev.2 +version = 6.0.0-dev.1 From 88d33b847de4d2ad834a4940ee257e06e3c3ad31 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 7 Feb 2026 23:45:08 +0100 Subject: [PATCH 018/161] feat: Update YouTube & YouTube Music patches (#6571) This commit is a squash of multiple commits, authored by the individuals referenced below. To see the exact commits by each author, see the unsquashed tree at https://github.com/ReVanced/revanced-patches/pull/6571 or with commit 03940665d27a42ed08992757dfe4534bd8243356. Co-authored-by: oSumAtrIX Co-authored-by: hoodles <207470673+hoo-dles@users.noreply.github.com> Co-authored-by: ILoveOpenSourceApplications <117499019+iloveopensourceapplications@users.noreply.github.com> Co-authored-by: LisoUseInAIKyrios <118716522+lisouseinaikyrios@users.noreply.github.com> Co-authored-by: inotia00 <108592928+inotia00@users.noreply.github.com> Co-authored-by: OxrxL <108184954+oxrxl@users.noreply.github.com> --- .../privacy/SanitizeSharingLinksPatch.java | 2 +- .../privacy/SanitizeSharingLinksPatch.java | 2 +- .../music/patches/NavigationBarPatch.java | 34 +- .../app/revanced/extension/shared/Logger.java | 6 +- .../revanced/extension/shared/StringRef.java | 4 +- .../revanced/extension/shared/TrieSearch.java | 20 +- .../app/revanced/extension/shared/Utils.java | 28 +- .../shared/checks/CheckEnvironmentPatch.java | 4 +- .../shared/patches/CustomBrandingPatch.java | 81 ++- .../shared/patches/EnableDebuggingPatch.java | 11 +- .../patches/SanitizeSharingLinksPatch.java | 4 +- .../shared/patches/litho/CustomFilter.java | 80 ++- .../shared/patches/litho/Filter.java | 14 +- .../shared/patches/litho/FilterGroup.java | 4 +- .../patches/litho/LithoFilterPatch.java | 67 +- .../shared/privacy/LinkSanitizer.java | 18 +- .../extension/shared/requests/Requester.java | 4 +- .../shared/settings/BaseActivityHook.java | 10 +- .../shared/settings/BaseSettings.java | 7 +- .../shared/settings/BooleanSetting.java | 2 +- .../shared/settings/EnumSetting.java | 2 +- .../extension/shared/settings/Setting.java | 58 +- .../AbstractPreferenceFragment.java | 2 +- .../FeatureFlagsManagerPreference.java | 9 +- .../preference/SharedPrefCategory.java | 6 +- ...Preference.java => URLLinkPreference.java} | 18 +- .../settings/search/BaseSearchResultItem.java | 4 +- .../search/BaseSearchResultsAdapter.java | 8 +- .../spoof/requests/StreamingDataRequest.java | 4 +- .../privacy/SanitizeSharingLinksPatch.java | 2 +- .../ExtensionPreferenceCategory.java | 2 +- .../tiktok/share/ShareUrlSanitizer.java | 5 +- extensions/youtube/build.gradle.kts | 2 +- .../youtube/src/main/AndroidManifest.xml | 5 +- .../patches/AlternativeThumbnailsPatch.java | 176 +++--- .../patches/BackgroundPlaybackPatch.java | 4 +- .../BypassImageRegionRestrictionsPatch.java | 16 +- .../patches/ChangeFormFactorPatch.java | 2 +- .../youtube/patches/ChangeStartPagePatch.java | 6 +- ...eoUrlPatch.java => CopyVideoURLPatch.java} | 8 +- .../patches/DisableHapticFeedbackPatch.java | 41 +- .../DisablePlayerPopupPanelsPatch.java | 6 +- ....java => DisableSignInToTVPopupPatch.java} | 4 +- .../youtube/patches/DownloadsPatch.java | 4 +- .../youtube/patches/ExitFullscreenPatch.java | 8 +- ...tch.java => HideAutoplayPreviewPatch.java} | 6 +- .../patches/HideEndScreenCardsPatch.java | 4 +- .../HidePlayerOverlayButtonsPatch.java | 54 +- .../youtube/patches/LoopVideoPatch.java | 9 +- .../youtube/patches/MiniplayerPatch.java | 18 +- .../youtube/patches/NavigationBarPatch.java | 205 +++++++ .../patches/NavigationButtonsPatch.java | 108 ---- .../OpenShortsInRegularPlayerPatch.java | 15 +- .../RemoveViewerDiscretionDialogPatch.java | 93 ++- .../patches/ReturnYouTubeDislikePatch.java | 47 +- .../patches/SeekbarThumbnailsPatch.java | 39 -- .../youtube/patches/ShortsAutoplayPatch.java | 2 +- ...rTappingPatch.java => TapToSeekPatch.java} | 6 +- .../youtube/patches/ToolbarPatch.java | 33 + .../youtube/patches/VideoAdsPatch.java | 9 + .../youtube/patches/VideoInformation.java | 74 ++- .../youtube/patches/WideSearchbarPatch.java | 46 -- .../announcements/AnnouncementsPatch.java | 10 +- .../youtube/patches/litho/AdsFilter.java | 212 ++++--- .../litho/AdvancedVideoQualityMenuFilter.java | 2 +- .../youtube/patches/litho/ButtonsFilter.java | 154 ----- .../youtube/patches/litho/CommentsFilter.java | 13 +- .../litho/DescriptionComponentsFilter.java | 117 ++-- .../patches/litho/KeywordContentFilter.java | 16 +- .../patches/litho/LayoutComponentsFilter.java | 410 +++++++++++-- .../litho/PlaybackSpeedMenuFilter.java | 2 +- .../litho/PlayerFlyoutMenuItemsFilter.java | 66 +- .../litho/ReturnYouTubeDislikeFilter.java | 38 +- .../youtube/patches/litho/ShortsFilter.java | 173 +++++- .../litho/VideoActionButtonsFilter.java | 180 ++++++ .../quality/HidePremiumVideoQualityPatch.java | 31 + .../quality/RememberVideoQualityPatch.java | 7 +- .../youtube/patches/theme/ThemePatch.java | 25 +- .../ReturnYouTubeDislike.java | 18 +- .../requests/RYDVoteData.java | 4 +- ...eApi.java => ReturnYouTubeDislikeAPI.java} | 64 +- .../ReturnYouTubeDislikeAboutPreference.java | 6 +- ...beDislikeDebugStatsPreferenceCategory.java | 18 +- .../extension/youtube/settings/Settings.java | 78 ++- .../youtube/settings/YouTubeActivityHook.java | 1 + ...ativeThumbnailsAboutDeArrowPreference.java | 6 +- .../ExternalDownloaderPreference.java | 2 +- ...tmlPreference.java => HTMLPreference.java} | 12 +- .../youtube/shared/EngagementPanel.java | 42 ++ .../extension/youtube/{ => shared}/Event.kt | 4 +- .../youtube/shared/NavigationBar.java | 4 +- .../shared/PlayerControlsVisibility.kt | 2 +- .../PlayerControlsVisibilityObserver.kt | 2 +- .../youtube/shared/PlayerOverlays.kt | 2 +- .../extension/youtube/shared/PlayerType.kt | 8 +- .../youtube/shared/ShortsPlayerState.kt | 2 +- .../SegmentPlaybackController.java | 87 ++- .../sponsorblock/SponsorBlockSettings.java | 24 +- .../sponsorblock/SponsorBlockUtils.java | 6 +- .../objects/CategoryBehaviour.java | 2 +- .../sponsorblock/objects/UserStats.java | 20 +- .../sponsorblock/requests/SBRequester.java | 10 +- .../sponsorblock/ui/SkipSponsorButton.java | 14 +- .../ui/SponsorBlockAboutPreference.java | 6 +- .../ui/SponsorBlockPreferenceGroup.java | 14 +- .../SponsorBlockStatsPreferenceCategory.java | 6 +- .../ui/SponsorBlockViewController.java | 130 +++- .../controller/ScreenBrightnessController.kt | 2 +- .../controller/VolumeKeysController.kt | 2 +- .../misc/SwipeControlsOverlay.kt | 2 +- ...UrlButton.java => CopyVideoURLButton.java} | 8 +- ....java => CopyVideoURLTimestampButton.java} | 8 +- .../youtube/videoplayer/LoopVideoButton.java | 76 ++- .../videoplayer/PlayerControlButton.java | 36 +- .../videoplayer/VideoQualityDialogButton.java | 25 +- .../innertube/model/media/VideoQuality.java | 8 - patches/api/patches.api | 146 +++-- .../all/misc/transformation/MethodCall.kt | 19 +- .../patches/music/ad/video/HideVideoAds.kt | 5 +- .../EnableExclusiveAudioPlayback.kt | 2 + .../permanentrepeat/PermanentRepeatPatch.kt | 5 +- .../layout/branding/CustomBrandingPatch.kt | 8 +- .../music/layout/branding/Fingerprints.kt | 2 +- .../music/layout/buttons/Fingerprints.kt | 4 +- .../music/layout/buttons/HideButtons.kt | 13 +- .../layout/compactheader/HideCategoryBar.kt | 8 +- .../hide/general/HideLayoutComponentsPatch.kt | 9 +- .../miniplayercolor/ChangeMiniplayerColor.kt | 14 +- .../layout/miniplayercolor/Fingerprints.kt | 11 +- .../layout/navigationbar/Fingerprints.kt | 57 +- .../navigationbar/NavigationBarPatch.kt | 76 +-- .../layout/premium/HideGetPremiumPatch.kt | 7 +- .../patches/music/layout/theme/ThemePatch.kt | 18 +- .../UnlockAndroidAutoMediaBrowserPatch.kt | 20 +- .../ForceOriginalAudioPatch.kt | 6 +- .../BackgroundPlaybackPatch.kt | 2 + .../misc/debugging/EnableDebuggingPatch.kt | 28 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 4 +- .../music/misc/gms/GmsCoreSupportPatch.kt | 2 + .../misc/privacy/SanitizeSharingLinksPatch.kt | 4 +- .../music/misc/settings/SettingsPatch.kt | 24 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 4 +- .../music/playservice/VersionCheckPatch.kt | 7 +- .../revanced/patches/shared/Fingerprints.kt | 18 + .../layout/branding/AddBrandLicensePatch.kt | 6 +- .../branding/BaseCustomBrandingPatch.kt | 42 +- .../shared/layout/branding/Fingerprints.kt | 19 +- .../shared/layout/theme/BaseThemePatch.kt | 27 +- .../shared/layout/theme/Fingerprints.kt | 8 +- .../misc/audio/ForceOriginalAudioPatch.kt | 91 ++- .../misc/debugging/EnableDebuggingPatch.kt | 197 ++++-- .../shared/misc/debugging/Fingerprints.kt | 33 +- .../patches/shared/misc/gms/Fingerprints.kt | 1 + .../shared/misc/gms/GmsCoreSupportPatch.kt | 3 + .../shared/misc/hex/HexPatchBuilder.kt | 9 +- .../shared/misc/litho/filter/Fingerprints.kt | 29 +- .../misc/litho/filter/LithoFilterPatch.kt | 102 +++- .../shared/misc/settings/Fingerprints.kt | 14 +- .../shared/misc/settings/SettingsPatch.kt | 11 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 16 +- .../youtube/ad/general/Fingerprints.kt | 73 ++- .../youtube/ad/general/HideAdsPatch.kt | 148 ++++- .../youtube/ad/getpremium/Fingerprints.kt | 20 - .../ad/getpremium/HideGetPremiumPatch.kt | 66 -- .../patches/youtube/ad/video/VideoAdsPatch.kt | 6 +- ...yVideoUrlPatch.kt => CopyVideoURLPatch.kt} | 16 +- .../interaction/dialog/Fingerprints.kt | 27 + .../RemoveViewerDiscretionDialogPatch.kt | 68 ++- ...ddMoreDoubleTapToSeekLengthOptionsPatch.kt | 66 ++ .../DisableChapterSkipDoubleTapPatch.kt | 14 +- .../interaction/downloads/DownloadsPatch.kt | 14 +- .../interaction/downloads/Fingerprints.kt | 2 +- .../DisableHapticFeedbackPatch.kt | 139 +++++ .../hapticfeedback/Fingerprints.kt | 56 ++ .../seekbar/EnableSlideToSeekPatch.kt | 2 +- ...appingPatch.kt => EnableTapToSeekPatch.kt} | 18 +- .../interaction/seekbar/Fingerprints.kt | 33 +- .../interaction/seekbar/SeekbarPatch.kt | 14 +- .../seekbar/SeekbarThumbnailsPatch.kt | 71 --- .../swipecontrols/SwipeControlsPatch.kt | 11 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 9 +- .../layout/autocaptions/Fingerprints.kt | 15 - .../layout/branding/CustomBrandingPatch.kt | 6 +- .../branding/header/ChangeHeaderPatch.kt | 9 +- ...tch.kt => HideVideoActionsButtonsPatch.kt} | 28 +- .../layout/buttons/navigation/Fingerprints.kt | 48 +- .../buttons/navigation/NavigationBarPatch.kt | 253 ++++++++ .../navigation/NavigationButtonsPatch.kt | 150 ----- .../layout/buttons/overlay/Fingerprints.kt | 21 + .../overlay/HidePlayerOverlayButtonsPatch.kt | 77 ++- .../formfactor/ChangeFormFactorPatch.kt | 13 +- .../HideAutoplayPreviewPatch.kt | 74 +++ .../hide/endscreencards/Fingerprints.kt | 26 +- .../endscreencards/HideEndScreenCardsPatch.kt | 11 +- .../Fingerprints.kt | 2 +- .../HideEndScreenSuggestedVideoPatch.kt | 23 +- .../DisableFullscreenAmbientModePatch.kt | 11 +- .../layout/hide/general/Fingerprints.kt | 211 ++++++- .../hide/general/HideLayoutComponentsPatch.kt | 403 ++++++++++-- .../hide/infocards/HideInfoCardsPatch.kt | 17 +- .../HidePlayerFlyoutMenuPatch.kt | 27 +- .../player}/popup/PlayerPopupPanelsPatch.kt | 14 +- .../HideRelatedVideoOverlayPatch.kt | 6 +- .../DisableRollingNumberAnimationPatch.kt | 6 +- .../layout/hide/shorts/Fingerprints.kt | 32 +- .../hide/shorts/HideShortsComponentsPatch.kt | 202 +++--- ...opup.kt => DisableSignInToTVPopupPatch.kt} | 16 +- .../hide/signintotvpopup/Fingerprints.kt | 2 +- .../layout/hide/time/HideTimestampPatch.kt | 9 +- .../youtube/layout/miniplayer/Fingerprints.kt | 20 +- .../layout/miniplayer/MiniplayerPatch.kt | 72 ++- .../layout/panels/popup/Fingerprints.kt | 12 - .../player/fullscreen/ExitFullscreenPatch.kt | 24 +- .../OpenVideosFullscreenHookPatch.kt | 2 +- .../fullscreen/OpenVideosFullscreenPatch.kt | 7 +- .../CustomPlayerOverlayOpacityPatch.kt | 11 +- .../returnyoutubedislike/Fingerprints.kt | 44 +- .../ReturnYouTubeDislikePatch.kt | 194 +++--- .../youtube/layout/searchbar/Fingerprints.kt | 34 -- .../layout/searchbar/WideSearchbarPatch.kt | 105 ---- .../youtube/layout/seekbar/Fingerprints.kt | 2 +- .../layout/seekbar/SeekbarColorPatch.kt | 19 +- .../layout/shortsautoplay/Fingerprints.kt | 1 - .../shortsautoplay/ShortsAutoplayPatch.kt | 25 +- .../layout/shortsplayer/Fingerprints.kt | 71 +-- .../OpenShortsInRegularPlayerPatch.kt | 169 +++-- .../layout/sponsorblock/SponsorBlockPatch.kt | 26 +- .../layout/spoofappversion/Fingerprints.kt | 15 - .../spoofappversion/SpoofAppVersionPatch.kt | 16 +- .../layout/startpage/ChangeStartPagePatch.kt | 12 +- .../youtube/layout/startpage/Fingerprints.kt | 2 +- .../DisableResumingShortsOnStartupPatch.kt | 19 +- .../youtube/layout/theme/Fingerprints.kt | 54 ++ .../youtube/layout/theme/ThemePatch.kt | 77 ++- .../thumbnails/AlternativeThumbnailsPatch.kt | 22 +- .../BypassImageRegionRestrictionsPatch.kt | 18 +- .../youtube/layout/toolbar/Fingerprints.kt | 14 + .../layout/toolbar/ToolbarHookPatch.kt | 74 +++ .../misc/announcements/AnnouncementsPatch.kt | 6 +- .../audiofocus/PauseOnAudioInterruptPatch.kt | 5 + .../BackgroundPlaybackPatch.kt | 19 +- .../misc/backgroundplayback/Fingerprints.kt | 11 +- .../contexthook/ClientContextHookPatch.kt | 177 ++++++ .../youtube/misc/contexthook/Fingerprints.kt | 153 +++++ .../misc/debugging/EnableDebuggingPatch.kt | 34 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 29 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 6 +- .../engagement/EngagementPanelHookPatch.kt | 80 +++ .../youtube/misc/engagement/Fingerprints.kt | 22 + .../gms/AccountCredentialsInvalidTextPatch.kt | 4 +- .../patches/youtube/misc/gms/Fingerprints.kt | 4 +- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 6 +- .../DisableHapticFeedbackPatch.kt | 69 --- .../misc/hapticfeedback/Fingerprints.kt | 28 - .../misc/imageurlhook/CronetImageUrlHook.kt | 22 +- .../youtube/misc/imageurlhook/Fingerprints.kt | 4 +- .../misc/links/BypassURLRedirectsPatch.kt | 31 +- .../youtube/misc/links/Fingerprints.kt | 12 - .../misc/links/OpenLinksExternallyPatch.kt | 6 +- .../youtube/misc/litho/filter/Fingerprints.kt | 1 - .../misc/litho/filter/LithoFilterPatch.kt | 2 +- .../youtube/misc/loopvideo/Fingerprints.kt | 18 - .../youtube/misc/loopvideo/LoopVideoPatch.kt | 44 +- .../youtube/misc/navigation/Fingerprints.kt | 12 +- .../misc/navigation/NavigationBarHookPatch.kt | 10 +- .../playercontrols/PlayerControlsPatch.kt | 4 +- .../misc/playservice/VersionCheckPatch.kt | 141 +++-- .../misc/privacy/SanitizeSharingLinksPatch.kt | 6 +- .../youtube/misc/settings/Fingerprints.kt | 11 - .../youtube/misc/settings/SettingsPatch.kt | 3 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 6 +- .../patches/youtube/shared/Fingerprints.kt | 70 ++- .../video/audio/ForceOriginalAudioPatch.kt | 6 +- .../video/codecs/DisableVideoCodecsPatch.kt | 9 +- .../youtube/video/information/Fingerprints.kt | 105 +++- .../information/VideoInformationPatch.kt | 105 +++- .../video/playerresponse/Fingerprints.kt | 14 +- .../youtube/video/quality/Fingerprints.kt | 46 ++ .../quality/HidePremiumVideoQualityPatch.kt | 97 +++ .../quality/RememberVideoQualityPatch.kt | 2 +- .../video/quality/VideoQualityPatch.kt | 9 +- .../youtube/video/speed/PlaybackSpeedPatch.kt | 10 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 26 +- .../video/speed/custom/Fingerprints.kt | 33 +- .../remember/RememberPlaybackSpeedPatch.kt | 5 +- .../youtube/video/videoid/Fingerprints.kt | 16 +- .../youtube/video/videoid/VideoIdPatch.kt | 22 +- .../kotlin/app/revanced/util/BytecodeUtils.kt | 426 ++++++------- .../app/revanced/util/FreeRegisterProvider.kt | 575 ++++++++++++++++++ .../kotlin/app/revanced/util/ResourceUtils.kt | 16 +- .../revanced/util/resource/StringResource.kt | 1 - .../addresources/values-bs-rBA/strings.xml | 2 +- .../resources/addresources/values/arrays.xml | 6 +- .../resources/addresources/values/strings.xml | 241 +++++--- .../drawable/revanced_yt_copy.xml | 85 ++- .../drawable/revanced_yt_copy_timestamp.xml | 91 ++- .../drawable/revanced_yt_download_button.xml | 85 ++- ..._video_quality_dialog_button_rectangle.xml | 54 +- ...playback_speed_dialog_button_rectangle.xml | 54 +- settings.gradle.kts | 6 + 300 files changed, 8226 insertions(+), 3643 deletions(-) rename extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/{UrlLinkPreference.java => URLLinkPreference.java} (65%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{CopyVideoUrlPatch.java => CopyVideoURLPatch.java} (93%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{DisableSignInToTvPopupPatch.java => DisableSignInToTVPopupPatch.java} (69%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{HideGetPremiumPatch.java => HideAutoplayPreviewPatch.java} (55%) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationBarPatch.java delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarThumbnailsPatch.java rename extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/{SeekbarTappingPatch.java => TapToSeekPatch.java} (50%) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ToolbarPatch.java delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/VideoActionButtonsFilter.java create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch.java rename extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/{ReturnYouTubeDislikeApi.java => ReturnYouTubeDislikeAPI.java} (95%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/{HtmlPreference.java => HTMLPreference.java} (65%) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/EngagementPanel.java rename extensions/youtube/src/main/java/app/revanced/extension/youtube/{ => shared}/Event.kt (94%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/{CopyVideoUrlButton.java => CopyVideoURLButton.java} (86%) rename extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/{CopyVideoUrlTimestampButton.java => CopyVideoURLTimestampButton.java} (86%) delete mode 100644 extensions/youtube/stub/src/main/java/com/google/android/libraries/youtube/innertube/model/media/VideoQuality.java rename patches/src/main/kotlin/app/revanced/patches/music/misc/{tracks => audio}/ForceOriginalAudioPatch.kt (89%) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt rename patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/{CopyVideoUrlPatch.kt => CopyVideoURLPatch.kt} (86%) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/AddMoreDoubleTapToSeekLengthOptionsPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/DisableHapticFeedbackPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/Fingerprints.kt rename patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/{EnableSeekbarTappingPatch.kt => EnableTapToSeekPatch.kt} (85%) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/{HideButtonsPatch.kt => HideVideoActionsButtonsPatch.kt} (76%) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/autoplaypreview/HideAutoplayPreviewPatch.kt rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/{endscreensuggestion => endscreensuggestedvideo}/Fingerprints.kt (99%) rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/{endscreensuggestion => endscreensuggestedvideo}/HideEndScreenSuggestedVideoPatch.kt (81%) rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/{flyoutmenupanel => flyoutmenu}/HidePlayerFlyoutMenuPatch.kt (90%) rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/{panels => hide/player}/popup/PlayerPopupPanelsPatch.kt (78%) rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/{DisableSignInToTvPatchPopup.kt => DisableSignInToTVPopupPatch.kt} (83%) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/ToolbarHookPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/ClientContextHookPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/EngagementPanelHookPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/HidePremiumVideoQualityPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/util/FreeRegisterProvider.kt diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java index b7a017e77f..058ee19f90 100644 --- a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java @@ -10,6 +10,6 @@ public final class SanitizeSharingLinksPatch { * Injection point. */ public static String sanitizeSharingLink(String url) { - return sanitizer.sanitizeUrlString(url); + return sanitizer.sanitizeURLString(url); } } diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java index 9b3aa6347a..0566f68acb 100644 --- a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java @@ -10,6 +10,6 @@ public final class SanitizeSharingLinksPatch { * Injection point. */ public static String sanitizeSharingLink(String url) { - return sanitizer.sanitizeUrlString(url); + return sanitizer.sanitizeURLString(url); } } diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/NavigationBarPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/NavigationBarPatch.java index 511e503044..6131401ce2 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/patches/NavigationBarPatch.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/NavigationBarPatch.java @@ -5,14 +5,15 @@ import static app.revanced.extension.shared.Utils.hideViewUnderCondition; import android.view.View; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.util.Arrays; +import java.util.List; + import app.revanced.extension.music.settings.Settings; @SuppressWarnings("unused") public class NavigationBarPatch { - @NonNull private static String lastYTNavigationEnumName = ""; public static void setLastAppNavigationEnum(@Nullable Enum ytNavigationEnumName) { @@ -25,7 +26,7 @@ public class NavigationBarPatch { hideViewUnderCondition(Settings.HIDE_NAVIGATION_BAR_LABEL.get(), textview); } - public static void hideNavigationButton(@NonNull View view) { + public static void hideNavigationButton(View view) { // Hide entire navigation bar. if (Settings.HIDE_NAVIGATION_BAR.get() && view.getParent() != null) { hideViewUnderCondition(true, (View) view.getParent()); @@ -34,7 +35,7 @@ public class NavigationBarPatch { // Hide navigation buttons based on their type. for (NavigationButton button : NavigationButton.values()) { - if (button.ytEnumNames.equals(lastYTNavigationEnumName)) { + if (button.ytEnumNames.contains(lastYTNavigationEnumName)) { hideViewUnderCondition(button.hidden, view); break; } @@ -43,30 +44,41 @@ public class NavigationBarPatch { private enum NavigationButton { HOME( - "TAB_HOME", + Arrays.asList( + "TAB_HOME" + ), Settings.HIDE_NAVIGATION_BAR_HOME_BUTTON.get() ), SAMPLES( - "TAB_SAMPLES", + Arrays.asList( + "TAB_SAMPLES" + ), Settings.HIDE_NAVIGATION_BAR_SAMPLES_BUTTON.get() ), EXPLORE( - "TAB_EXPLORE", + Arrays.asList( + "TAB_EXPLORE" + ), Settings.HIDE_NAVIGATION_BAR_EXPLORE_BUTTON.get() ), LIBRARY( - "LIBRARY_MUSIC", + Arrays.asList( + "LIBRARY_MUSIC", + "TAB_BOOKMARK" // YouTube Music 8.24+ + ), Settings.HIDE_NAVIGATION_BAR_LIBRARY_BUTTON.get() ), UPGRADE( - "TAB_MUSIC_PREMIUM", + Arrays.asList( + "TAB_MUSIC_PREMIUM" + ), Settings.HIDE_NAVIGATION_BAR_UPGRADE_BUTTON.get() ); - private final String ytEnumNames; + private final List ytEnumNames; private final boolean hidden; - NavigationButton(@NonNull String ytEnumNames, boolean hidden) { + NavigationButton(List ytEnumNames, boolean hidden) { this.ytEnumNames = ytEnumNames; this.hidden = hidden; } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Logger.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Logger.java index 47f6da3e3f..610cd3414f 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Logger.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Logger.java @@ -16,8 +16,8 @@ import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.preference.LogBufferManager; /** - * ReVanced specific logger. Logging is done to standard device log (accessible thru ADB), - * and additionally accessible thru {@link LogBufferManager}. + * ReVanced specific logger. Logging is done to standard device log (accessible through ADB), + * and additionally accessible through {@link LogBufferManager}. * * All methods are thread safe, and are safe to call even * if {@link Utils#getContext()} is not available. @@ -202,7 +202,7 @@ public class Logger { /** * Logs exceptions under the outer class name of the code calling this method. *

- * If the calling code is showing it's own error toast, + * If the calling code is showing its own error toast, * instead use {@link #printInfo(LogMessage, Exception)} * * @param message log message diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/StringRef.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/StringRef.java index 4390137de7..c1c2c90d14 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/StringRef.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/StringRef.java @@ -70,7 +70,7 @@ public class StringRef { } /** - * Creates a StringRef object that'll not change it's value + * Creates a StringRef object that'll not change its value * * @param value value which toString() method returns when invoked on returned object * @return Unique StringRef instance, its value will never change @@ -102,7 +102,7 @@ public class StringRef { public String toString() { if (!resolved) { if (resources == null || packageName == null) { - Context context = Utils.getContext(); + var context = Utils.getContext(); resources = context.getResources(); packageName = context.getPackageName(); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/TrieSearch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/TrieSearch.java index 7628a51d9b..97fa4605d8 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/TrieSearch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/TrieSearch.java @@ -106,14 +106,18 @@ public abstract class TrieSearch { * Elements not contained can collide with elements the array does contain, * so must compare the nodes character value. * - * Alternatively this array could be a sorted and densely packed array, - * and lookup is done using binary search. - * That would save a small amount of memory because there's no null children entries, - * but would give a worst case search of O(nlog(m)) where n is the number of - * characters in the searched text and m is the maximum size of the sorted character arrays. - * Using a hash table array always gives O(n) search time. - * The memory usage here is very small (all Litho filters use ~10KB of memory), - * so the more performant hash implementation is chosen. + /* + * Alternatively, this could be implemented as a sorted, densely packed array + * with lookups performed via binary search. + * This approach would save a small amount of memory by eliminating null + * child entries. However, it would result in a worst-case lookup time of + * O(n log m), where: + * - n is the number of characters in the input text, and + * - m is the maximum size of the sorted character arrays. + * In contrast, using a hash-based array guarantees O(n) lookup time. + * Given that the total memory usage is already very small (all Litho filters + * together use approximately 10KB), the hash-based implementation is preferred + * for its superior performance. */ @Nullable private TrieNode[] children; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index 0093317082..e978301a65 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -206,7 +206,7 @@ public class Utils { } /** - * Hide a view by setting its visibility to GONE. + * Hide a view by setting its visibility as GONE. * * @param setting The setting to check for hiding the view. * @param view The view to hide. @@ -218,7 +218,7 @@ public class Utils { } /** - * Hide a view by setting its visibility to GONE. + * Hide a view by setting its visibility as GONE. * * @param condition The setting to check for hiding the view. * @param view The view to hide. @@ -288,7 +288,7 @@ public class Utils { // Could do a thread sleep, but that will trigger an exception if the thread is interrupted. meaninglessValue += Long.numberOfLeadingZeros((long) Math.exp(Math.random())); } - // Return the value, otherwise the compiler or VM might optimize and remove the meaningless time wasting work, + // Return the value, otherwise the compiler or VM might optimize and remove the meaningless time-wasting work, // leaving an empty loop that hammers on the System.currentTimeMillis native call. return meaninglessValue; } @@ -298,10 +298,12 @@ public class Utils { } public static int indexOfFirstFound(String value, String... targets) { - for (String string : targets) { - if (!string.isEmpty()) { - final int indexOf = value.indexOf(string); - if (indexOf >= 0) return indexOf; + if (isNotEmpty(value)) { + for (String string : targets) { + if (!string.isEmpty()) { + final int indexOf = value.indexOf(string); + if (indexOf >= 0) return indexOf; + } } } return -1; @@ -473,6 +475,10 @@ public class Utils { clipboard.setPrimaryClip(clip); } + public static boolean isNotEmpty(@Nullable String str) { + return str != null && !str.isEmpty(); + } + public static boolean isTablet() { return context.getResources().getConfiguration().smallestScreenWidthDp >= 600; } @@ -481,7 +487,7 @@ public class Utils { private static Boolean isRightToLeftTextLayout; /** - * @return If the device language uses right to left text layout (Hebrew, Arabic, etc). + * @return If the device language uses right to left text layout (Hebrew, Arabic, etc.). * If this should match any ReVanced language override then instead use * {@link #isRightToLeftLocale(Locale)} with {@link BaseSettings#REVANCED_LANGUAGE}. * This is the default locale of the device, which may differ if @@ -495,7 +501,7 @@ public class Utils { } /** - * @return If the locale uses right to left text layout (Hebrew, Arabic, etc). + * @return If the locale uses right to left text layout (Hebrew, Arabic, etc.). */ public static boolean isRightToLeftLocale(Locale locale) { String displayLanguage = locale.getDisplayLanguage(); @@ -524,7 +530,7 @@ public class Utils { /** * @return if the text contains at least 1 number character, - * including any unicode numbers such as Arabic. + * including any Unicode numbers such as Arabic. */ @SuppressWarnings("BooleanMethodIsAlwaysInverted") public static boolean containsNumber(CharSequence text) { @@ -1156,7 +1162,7 @@ public class Utils { } /** - * Uses {@link #adjustColorBrightness(int, float)} depending if light or dark mode is active. + * Uses {@link #adjustColorBrightness(int, float)} depending on if light or dark mode is active. */ @ColorInt public static int adjustColorBrightness(@ColorInt int baseColor, float lightThemeFactor, float darkThemeFactor) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java index d63f8b7e3f..4eb4c23c48 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java @@ -288,8 +288,8 @@ public final class CheckEnvironmentPatch { CheckIsNearPatchTime nearPatchTime = new CheckIsNearPatchTime(); Boolean timeCheckPassed = nearPatchTime.check(); if (timeCheckPassed && !DEBUG_ALWAYS_SHOW_CHECK_FAILED_DIALOG) { - // Allow installing recently patched apks, - // even if the install source is not Manager or ADB. + // Allow installing recently patched APKs, + // even if the installation source is not Manager or ADB. Check.disableForever(); return; } else { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java index 2b81178eac..0dc411f8b0 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java @@ -7,6 +7,8 @@ import android.content.pm.PackageManager; import android.graphics.Color; import android.view.View; +import androidx.annotation.Nullable; + import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -53,24 +55,35 @@ public class CustomBrandingPatch { } } - private static final int notificationSmallIcon; + @Nullable + private static Integer notificationSmallIcon; - static { - BrandingTheme branding = BaseSettings.CUSTOM_BRANDING_ICON.get(); - if (branding == BrandingTheme.ORIGINAL) { - notificationSmallIcon = 0; - } else { - // Original icon is quantum_ic_video_youtube_white_24 - String iconName = "revanced_notification_icon"; - if (branding == BrandingTheme.CUSTOM) { - iconName += "_custom"; + private static int getNotificationSmallIcon() { + // Cannot use static initialization block otherwise cyclic references exist + // between Settings initialization and this class. + if (notificationSmallIcon == null) { + if (GmsCoreSupport.isPackageNameOriginal()) { + Logger.printDebug(() -> "App is root mounted. Not overriding small notification icon"); + return notificationSmallIcon = 0; } - notificationSmallIcon = Utils.getResourceIdentifier(ResourceType.DRAWABLE, iconName); - if (notificationSmallIcon == 0) { - Logger.printException(() -> "Could not load notification small icon"); + BrandingTheme branding = BaseSettings.CUSTOM_BRANDING_ICON.get(); + if (branding == BrandingTheme.ORIGINAL) { + notificationSmallIcon = 0; + } else { + // Original icon is quantum_ic_video_youtube_white_24 + String iconName = "revanced_notification_icon"; + if (branding == BrandingTheme.CUSTOM) { + iconName += "_custom"; + } + + notificationSmallIcon = Utils.getResourceIdentifier(ResourceType.DRAWABLE, iconName); + if (notificationSmallIcon == 0) { + Logger.printException(() -> "Could not load notification small icon"); + } } } + return notificationSmallIcon; } /** @@ -89,8 +102,9 @@ public class CustomBrandingPatch { */ public static void setNotificationIcon(Notification.Builder builder) { try { - if (notificationSmallIcon != 0) { - builder.setSmallIcon(notificationSmallIcon) + final int smallIcon = getNotificationSmallIcon(); + if (smallIcon != 0) { + builder.setSmallIcon(smallIcon) .setColor(Color.TRANSPARENT); // Remove YT red tint. } } catch (Exception ex) { @@ -104,8 +118,41 @@ public class CustomBrandingPatch { * The total number of app name aliases, including dummy aliases. */ private static int numberOfPresetAppNames() { - // Modified during patching. - throw new IllegalStateException(); + // Modified during patching, but requires a default if custom branding is excluded. + return 1; + } + + + /** + * Injection point. + *

+ * If a custom icon was provided during patching. + */ + private static boolean userProvidedCustomIcon() { + // Modified during patching, but requires a default if custom branding is excluded. + return false; + } + + /** + * Injection point. + *

+ * If a custom name was provided during patching. + */ + private static boolean userProvidedCustomName() { + // Modified during patching, but requires a default if custom branding is excluded.. + return false; + } + + public static int getDefaultAppNameIndex() { + return userProvidedCustomName() + ? numberOfPresetAppNames() + : 1; + } + + public static BrandingTheme getDefaultIconStyle() { + return userProvidedCustomIcon() + ? BrandingTheme.CUSTOM + : BrandingTheme.ORIGINAL; } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/EnableDebuggingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/EnableDebuggingPatch.java index e0551ed045..b63f2c6049 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/EnableDebuggingPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/EnableDebuggingPatch.java @@ -41,12 +41,13 @@ public final class EnableDebuggingPatch { /** * Injection point. */ - public static boolean isBooleanFeatureFlagEnabled(boolean value, Long flag) { + public static boolean isBooleanFeatureFlagEnabled(boolean value, long flag) { if (LOG_FEATURE_FLAGS && value) { - if (DISABLED_FEATURE_FLAGS.contains(flag)) { + Long flagObj = flag; + if (DISABLED_FEATURE_FLAGS.contains(flagObj)) { return false; } - if (featureFlags.putIfAbsent(flag, TRUE) == null) { + if (featureFlags.putIfAbsent(flagObj, TRUE) == null) { Logger.printDebug(() -> "boolean feature is enabled: " + flag); } } @@ -59,6 +60,8 @@ public final class EnableDebuggingPatch { */ public static double isDoubleFeatureFlagEnabled(double value, long flag, double defaultValue) { if (LOG_FEATURE_FLAGS && defaultValue != value) { + if (DISABLED_FEATURE_FLAGS.contains(flag)) return defaultValue; + if (featureFlags.putIfAbsent(flag, true) == null) { // Align the log outputs to make post processing easier. Logger.printDebug(() -> " double feature is enabled: " + flag @@ -74,6 +77,8 @@ public final class EnableDebuggingPatch { */ public static long isLongFeatureFlagEnabled(long value, long flag, long defaultValue) { if (LOG_FEATURE_FLAGS && defaultValue != value) { + if (DISABLED_FEATURE_FLAGS.contains(flag)) return defaultValue; + if (featureFlags.putIfAbsent(flag, true) == null) { Logger.printDebug(() -> " long feature is enabled: " + flag + " value: " + value + (defaultValue == 0 ? "" : " default: " + defaultValue)); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java index d028997276..b0bcbc6f04 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java @@ -18,8 +18,8 @@ public final class SanitizeSharingLinksPatch { * Injection point. */ public static String sanitize(String url) { - if (BaseSettings.SANITIZE_SHARED_LINKS.get()) { - url = sanitizer.sanitizeUrlString(url); + if (BaseSettings.SANITIZE_SHARING_LINKS.get()) { + url = sanitizer.sanitizeURLString(url); } if (BaseSettings.REPLACE_MUSIC_LINKS_WITH_YOUTUBE.get()) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java index c82c28353a..beb623a799 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/CustomFilter.java @@ -13,6 +13,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.StringTrieSearch; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ByteTrieSearch; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; @@ -24,7 +25,7 @@ import app.revanced.extension.shared.settings.YouTubeAndMusicSettings; @SuppressWarnings("unused") public final class CustomFilter extends Filter { - private static void showInvalidSyntaxToast(@NonNull String expression) { + private static void showInvalidSyntaxToast(String expression) { Utils.showToastLong(str("revanced_custom_filter_toast_invalid_syntax", expression)); } @@ -36,7 +37,12 @@ public final class CustomFilter extends Filter { public static final String SYNTAX_STARTS_WITH = "^"; /** - * Optional character that separates the path from a proto buffer string pattern. + * Optional character that separates the path from an accessibility string pattern. + */ + public static final String SYNTAX_ACCESSIBILITY_SYMBOL = "#"; + + /** + * Optional character that separates the path/accessibility from a proto buffer string pattern. */ public static final String SYNTAX_BUFFER_SYMBOL = "$"; @@ -51,15 +57,21 @@ public final class CustomFilter extends Filter { return Collections.emptyList(); } - // Map key is the path including optional special characters (^ and/or $) + // Map key is the full path including optional special characters (^, #, $), + // and any accessibility pattern, but does not contain any buffer patterns. Map result = new HashMap<>(); + Pattern pattern = Pattern.compile( - "(" // map key group - + "(\\Q" + SYNTAX_STARTS_WITH + "\\E?)" // optional starts with - + "([^\\Q" + SYNTAX_BUFFER_SYMBOL + "\\E]*)" // path - + "(\\Q" + SYNTAX_BUFFER_SYMBOL + "\\E?)" // optional buffer symbol - + ")" // end map key group - + "(.*)"); // optional buffer string + "(" // Map key group. + // Optional starts with. + + "(\\Q" + SYNTAX_STARTS_WITH + "\\E?)" + // Path string. + + "([^\\Q" + SYNTAX_ACCESSIBILITY_SYMBOL + SYNTAX_BUFFER_SYMBOL + "\\E]*)" + // Optional accessibility string. + + "(?:\\Q" + SYNTAX_ACCESSIBILITY_SYMBOL + "\\E([^\\Q" + SYNTAX_BUFFER_SYMBOL + "\\E]*))?" + // Optional buffer string. + + "(?:\\Q" + SYNTAX_BUFFER_SYMBOL + "\\E(.*))?" + + ")"); // end map key group for (String expression : rawCustomFilterText.split("\n")) { if (expression.isBlank()) continue; @@ -73,10 +85,12 @@ public final class CustomFilter extends Filter { final String mapKey = matcher.group(1); final boolean pathStartsWith = !matcher.group(2).isEmpty(); final String path = matcher.group(3); - final boolean hasBufferSymbol = !matcher.group(4).isEmpty(); - final String bufferString = matcher.group(5); + final String accessibility = matcher.group(4); // null if not present + final String buffer = matcher.group(5); // null if not present - if (path.isBlank() || (hasBufferSymbol && bufferString.isBlank())) { + if (path.isBlank() + || (accessibility != null && accessibility.isEmpty()) + || (buffer != null && buffer.isEmpty())) { showInvalidSyntaxToast(expression); continue; } @@ -89,8 +103,13 @@ public final class CustomFilter extends Filter { group = new CustomFilterGroup(pathStartsWith, path); result.put(mapKey, group); } - if (hasBufferSymbol) { - group.addBufferString(bufferString); + + if (accessibility != null) { + group.addAccessibilityString(accessibility); + } + + if (buffer != null) { + group.addBufferString(buffer); } } @@ -98,14 +117,22 @@ public final class CustomFilter extends Filter { } final boolean startsWith; + StringTrieSearch accessibilitySearch; ByteTrieSearch bufferSearch; - CustomFilterGroup(boolean startsWith, @NonNull String path) { + CustomFilterGroup(boolean startsWith, String path) { super(YouTubeAndMusicSettings.CUSTOM_FILTER, path); this.startsWith = startsWith; } - void addBufferString(@NonNull String bufferString) { + void addAccessibilityString(String accessibilityString) { + if (accessibilitySearch == null) { + accessibilitySearch = new StringTrieSearch(); + } + accessibilitySearch.addPattern(accessibilityString); + } + + void addBufferString(String bufferString) { if (bufferSearch == null) { bufferSearch = new ByteTrieSearch(); } @@ -117,6 +144,11 @@ public final class CustomFilter extends Filter { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("CustomFilterGroup{"); + if (accessibilitySearch != null) { + builder.append(", accessibility="); + builder.append(accessibilitySearch.getPatterns()); + } + builder.append("path="); if (startsWith) builder.append(SYNTAX_STARTS_WITH); builder.append(filters[0]); @@ -146,18 +178,26 @@ public final class CustomFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { // All callbacks are custom filter groups. CustomFilterGroup custom = (CustomFilterGroup) matchedGroup; + + // Check path start requirement. if (custom.startsWith && contentIndex != 0) { return false; } - if (custom.bufferSearch == null) { - return true; // No buffer filter, only path filtering. + // Check accessibility string if specified. + if (custom.accessibilitySearch != null && !custom.accessibilitySearch.matches(accessibility)) { + return false; } - return custom.bufferSearch.matches(buffer); + // Check buffer if specified. + if (custom.bufferSearch != null && !custom.bufferSearch.matches(buffer)) { + return false; + } + + return true; // All custom filter conditions passed. } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java index ccd152262b..b34ca9bdd7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/Filter.java @@ -13,9 +13,9 @@ import java.util.List; * Callbacks to filter content are added using {@link #addIdentifierCallbacks(StringFilterGroup...)} * and {@link #addPathCallbacks(StringFilterGroup...)}. * - * To filter {@link FilterContentType#PROTOBUFFER}, first add a callback to + * To filter {@link FilterContentType#PROTOBUFFER} or {@link FilterContentType#ACCESSIBILITY}, first add a callback to * either an identifier or a path. - * Then inside {@link #isFiltered(String, String, byte[], StringFilterGroup, FilterContentType, int)} + * Then inside {@link #isFiltered(String, String, String, byte[], StringFilterGroup, FilterContentType, int)} * search for the buffer content using either a {@link ByteArrayFilterGroup} (if searching for 1 pattern) * or a {@link FilterGroupList.ByteArrayFilterGroupList} (if searching for more than 1 pattern). * @@ -26,6 +26,7 @@ public abstract class Filter { public enum FilterContentType { IDENTIFIER, PATH, + ACCESSIBILITY, PROTOBUFFER } @@ -41,7 +42,7 @@ public abstract class Filter { public final List pathCallbacks = new ArrayList<>(); /** - * Adds callbacks to {@link #isFiltered(String, String, byte[], StringFilterGroup, FilterContentType, int)} + * Adds callbacks to {@link #isFiltered(String, String, String, byte[], StringFilterGroup, FilterContentType, int)} * if any of the groups are found. */ protected final void addIdentifierCallbacks(StringFilterGroup... groups) { @@ -49,7 +50,7 @@ public abstract class Filter { } /** - * Adds callbacks to {@link #isFiltered(String, String, byte[], StringFilterGroup, FilterContentType, int)} + * Adds callbacks to {@link #isFiltered(String, String, String, byte[], StringFilterGroup, FilterContentType, int)} * if any of the groups are found. */ protected final void addPathCallbacks(StringFilterGroup... groups) { @@ -63,12 +64,15 @@ public abstract class Filter { *

* Method is called off the main thread. * + * @param identifier Litho identifier. + * @param accessibility Accessibility string, or an empty string if not present for the component. + * @param buffer Protocol buffer. * @param matchedGroup The actual filter that matched. * @param contentType The type of content matched. * @param contentIndex Matched index of the identifier or path. * @return True if the litho component should be filtered out. */ - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { return true; } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java index 5b75858f3d..212787f305 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/FilterGroup.java @@ -122,7 +122,7 @@ public abstract class FilterGroup { /** * If you have more than 1 filter patterns, then all instances of - * this class should filtered using {@link FilterGroupList.ByteArrayFilterGroupList#check(byte[])}, + * this class should be filtered using {@link FilterGroupList.ByteArrayFilterGroupList#check(byte[])}, * which uses a prefix tree to give better performance. */ public static class ByteArrayFilterGroup extends FilterGroup { @@ -149,7 +149,7 @@ public abstract class FilterGroup { } private static int[] createFailurePattern(byte[] pattern) { - // Computes the failure function using a boot-strapping process, + // Computes the failure function using a bootstrapping process, // where the pattern is matched against itself. final int patternLength = pattern.length; final int[] failure = new int[patternLength]; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java index ddcfe41cc0..dc60f5d7da 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java @@ -24,11 +24,14 @@ public final class LithoFilterPatch { private static final class LithoFilterParameters { final String identifier; final String path; + final String accessibility; final byte[] buffer; - LithoFilterParameters(String lithoIdentifier, String lithoPath, byte[] buffer) { + LithoFilterParameters(String lithoIdentifier, String lithoPath, + String accessibility, byte[] buffer) { this.identifier = lithoIdentifier; this.path = lithoPath; + this.accessibility = accessibility; this.buffer = buffer; } @@ -39,6 +42,11 @@ public final class LithoFilterPatch { StringBuilder builder = new StringBuilder(Math.max(100, buffer.length / 2)); builder.append("ID: "); builder.append(identifier); + if (!accessibility.isEmpty()) { + // AccessibilityId and AccessibilityText are pieces of BufferStrings. + builder.append(" Accessibility: "); + builder.append(accessibility); + } builder.append(" Path: "); builder.append(path); if (YouTubeAndMusicSettings.DEBUG_PROTOBUFFER.get()) { @@ -122,7 +130,7 @@ public final class LithoFilterPatch { /** * String suffix for components. - * Can be any of: ".eml", ".e-b", ".eml-js", "e-js-b" + * Can be any of: ".eml", ".eml-fe", ".e-b", ".eml-js", "e-js-b" */ private static final byte[] LITHO_COMPONENT_EXTENSION_BYTES = ".e".getBytes(StandardCharsets.US_ASCII); @@ -132,7 +140,7 @@ public final class LithoFilterPatch { private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; /** - * Because litho filtering is multi-threaded and the buffer is passed in from a different injection point, + * Because litho filtering is multithreaded and the buffer is passed in from a different injection point, * the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads. * Used for 20.21 and lower. */ @@ -140,7 +148,7 @@ public final class LithoFilterPatch { /** * Identifier to protocol buffer mapping. Only used for 20.22+. - * Thread local is needed because filtering is multi-threaded and each thread can load + * Thread local is needed because filtering is multithreaded and each thread can load * a different component with the same identifier. */ private static final ThreadLocal> identifierToBufferThread = new ThreadLocal<>(); @@ -155,6 +163,7 @@ public final class LithoFilterPatch { private static final StringTrieSearch identifierSearchTree = new StringTrieSearch(); static { + for (Filter filter : filters) { filterUsingCallbacks(identifierSearchTree, filter, filter.identifierCallbacks, Filter.FilterContentType.IDENTIFIER); @@ -186,16 +195,13 @@ public final class LithoFilterPatch { LithoFilterParameters parameters = (LithoFilterParameters) callbackParameter; final boolean isFiltered = filter.isFiltered(parameters.identifier, - parameters.path, parameters.buffer, group, type, matchedStartIndex); + parameters.accessibility, parameters.path, parameters.buffer, + group, type, matchedStartIndex); if (isFiltered && BaseSettings.DEBUG.get()) { - if (type == Filter.FilterContentType.IDENTIFIER) { - Logger.printDebug(() -> "Filtered " + filterSimpleName - + " identifier: " + parameters.identifier); - } else { - Logger.printDebug(() -> "Filtered " + filterSimpleName - + " path: " + parameters.path); - } + Logger.printDebug(() -> type == Filter.FilterContentType.IDENTIFIER + ? filterSimpleName + " filtered identifier: " + parameters.identifier + : filterSimpleName + " filtered path: " + parameters.path); } return isFiltered; @@ -212,7 +218,7 @@ public final class LithoFilterPatch { /** * Helper function that differs from {@link Character#isDigit(char)} - * as this only matches ascii and not unicode numbers. + * as this only matches ascii and not Unicode numbers. */ private static boolean isAsciiNumber(byte character) { return '0' <= character && character <= '9'; @@ -233,12 +239,19 @@ public final class LithoFilterPatch { Logger.printDebug(() -> "New buffer: " + builder); } + // The identifier always seems to start very close to the buffer start. + // Highest identifier start index ever observed is 50, with most around 30 to 40. + // The buffer can be very large with up to 200kb has been observed, + // so the search is restricted to only the start. + final int maxBufferStartIndex = 500; // 10x expected upper bound. + // Could use Boyer-Moore-Horspool since the string is ASCII and has a limited number of // unique characters, but it seems to be slower since the extra overhead of checking the // bad character array negates any performance gain of skipping a few extra subsearches. int emlIndex = -1; final int emlStringLength = LITHO_COMPONENT_EXTENSION_BYTES.length; - for (int i = 0, lastStartIndex = buffer.length - emlStringLength; i <= lastStartIndex; i++) { + final int lastBufferIndexToCheckFrom = Math.min(maxBufferStartIndex, buffer.length - emlStringLength); + for (int i = 0; i < lastBufferIndexToCheckFrom; i++) { boolean match = true; for (int j = 0; j < emlStringLength; j++) { if (buffer[i + j] != LITHO_COMPONENT_EXTENSION_BYTES[j]) { @@ -254,6 +267,9 @@ public final class LithoFilterPatch { if (emlIndex < 0) { // Buffer is not used for creating a new litho component. + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) { + Logger.printDebug(() -> "Could not find eml index"); + } return; } @@ -290,7 +306,9 @@ public final class LithoFilterPatch { } } if (endIndex < 0) { - Logger.printException(() -> "Could not find buffer identifier"); + if (BaseSettings.DEBUG.get()) { + Logger.printException(() -> "Debug: Could not find buffer identifier"); + } return; } @@ -329,7 +347,8 @@ public final class LithoFilterPatch { /** * Injection point. */ - public static boolean isFiltered(String identifier, StringBuilder pathBuilder) { + public static boolean isFiltered(String identifier, @Nullable String accessibilityId, + @Nullable String accessibilityText, StringBuilder pathBuilder) { try { if (identifier.isEmpty() || pathBuilder.length() == 0) { return false; @@ -340,7 +359,7 @@ public final class LithoFilterPatch { final int pipeIndex = identifier.indexOf('|'); if (pipeIndex >= 0) { // If the identifier contains no pipe, then it's not an ".eml" identifier - // and the buffer is not uniquely identified. Typically this only happens + // and the buffer is not uniquely identified. Typically, this only happens // for subcomponents where buffer filtering is not used. String identifierKey = identifier.substring(0, pipeIndex); @@ -357,7 +376,9 @@ public final class LithoFilterPatch { // No buffer is found for some components, such as // shorts_lockup_cell.eml on channel profiles. // For now, just ignore this and filter without a buffer. - Logger.printException(() -> "Could not find global buffer for identifier: " + identifier); + if (BaseSettings.DEBUG.get()) { + Logger.printException(() -> "Debug: Could not find buffer for identifier: " + identifier); + } } } } @@ -372,7 +393,15 @@ public final class LithoFilterPatch { } String path = pathBuilder.toString(); - LithoFilterParameters parameter = new LithoFilterParameters(identifier, path, buffer); + + String accessibility = ""; + if (accessibilityId != null && !accessibilityId.isBlank()) { + accessibility = accessibilityId; + } + if (accessibilityText != null && !accessibilityText.isBlank()) { + accessibility = accessibilityId + '|' + accessibilityText; + } + LithoFilterParameters parameter = new LithoFilterParameters(identifier, path, accessibility, buffer); Logger.printDebug(() -> "Searching " + parameter); return identifierSearchTree.matches(identifier, parameter) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java index 941279f29b..421761f7da 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java @@ -24,23 +24,23 @@ public class LinkSanitizer { : List.of(parametersToRemove); } - public String sanitizeUrlString(String url) { + public String sanitizeURLString(String url) { try { - return sanitizeUri(Uri.parse(url)).toString(); + return sanitizeURI(Uri.parse(url)).toString(); } catch (Exception ex) { - Logger.printException(() -> "sanitizeUrlString failure: " + url, ex); + Logger.printException(() -> "sanitizeURLString failure: " + url, ex); return url; } } - public Uri sanitizeUri(Uri uri) { + public Uri sanitizeURI(Uri uri) { try { String scheme = uri.getScheme(); if (scheme == null || !(scheme.equals("http") || scheme.equals("https"))) { // Opening YouTube share sheet 'other' option passes the video title as a URI. // Checking !uri.isHierarchical() works for all cases, except if the // video title starts with / and then it's hierarchical but still an invalid URI. - Logger.printDebug(() -> "Ignoring uri: " + uri); + Logger.printDebug(() -> "Ignoring URI: " + uri); return uri; } @@ -56,12 +56,12 @@ public class LinkSanitizer { } } - Uri sanitizedUrl = builder.build(); - Logger.printInfo(() -> "Sanitized url: " + uri + " to: " + sanitizedUrl); + Uri sanitizedURL = builder.build(); + Logger.printInfo(() -> "Sanitized URL: " + uri + " to: " + sanitizedURL); - return sanitizedUrl; + return sanitizedURL; } catch (Exception ex) { - Logger.printException(() -> "sanitizeUri failure: " + uri, ex); + Logger.printException(() -> "sanitizeURI failure: " + uri, ex); return uri; } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/requests/Requester.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/requests/Requester.java index c25e71d78c..2e5c457f7b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/requests/Requester.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/requests/Requester.java @@ -23,8 +23,8 @@ public class Requester { public static HttpURLConnection getConnectionFromCompiledRoute(String apiUrl, Route.CompiledRoute route) throws IOException { String url = apiUrl + route.getCompiledRoute(); HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); - // Request data is in the URL parameters and no body is sent. - // The calling code must set a length if using a request body. + // This request sends data via URL query parameters. No request body is included. + // If a request body is added, the caller must set the appropriate Content-Length header. connection.setFixedLengthStreamingMode(0); connection.setRequestMethod(route.getMethod().name()); String agentString = System.getProperty("http.agent") diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index 0076e6d762..7a7b4d3337 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -96,15 +96,15 @@ public abstract class BaseActivityHook extends Activity { protected void createToolbar(Activity activity, PreferenceFragment fragment) { // Replace dummy placeholder toolbar. // This is required to fix submenu title alignment issue with Android ASOP 15+ - ViewGroup toolBarParent = activity.findViewById(ID_REVANCED_TOOLBAR_PARENT); - ViewGroup dummyToolbar = Utils.getChildViewByResourceName(toolBarParent, "revanced_toolbar"); + ViewGroup toolbarParent = activity.findViewById(ID_REVANCED_TOOLBAR_PARENT); + ViewGroup dummyToolbar = Utils.getChildViewByResourceName(toolbarParent, "revanced_toolbar"); toolbarLayoutParams = dummyToolbar.getLayoutParams(); - toolBarParent.removeView(dummyToolbar); + toolbarParent.removeView(dummyToolbar); // Sets appropriate system navigation bar color for the activity. ToolbarPreferenceFragment.setNavigationBarColor(activity.getWindow()); - Toolbar toolbar = new Toolbar(toolBarParent.getContext()); + Toolbar toolbar = new Toolbar(toolbarParent.getContext()); toolbar.setBackgroundColor(getToolbarBackgroundColor()); toolbar.setNavigationIcon(getNavigationIcon()); toolbar.setNavigationOnClickListener(getNavigationClickListener(activity)); @@ -121,7 +121,7 @@ public abstract class BaseActivityHook extends Activity { onPostToolbarSetup(activity, toolbar, fragment); - toolBarParent.addView(toolbar, 0); + toolbarParent.addView(toolbar, 0); } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index c8570d2513..2a3aef407f 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -6,6 +6,7 @@ import static app.revanced.extension.shared.patches.CustomBrandingPatch.Branding import static app.revanced.extension.shared.settings.Setting.parent; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.patches.CustomBrandingPatch; /** * Settings shared across multiple apps. @@ -48,13 +49,13 @@ public class BaseSettings { public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message"); public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS)); - public static final BooleanSetting SANITIZE_SHARED_LINKS = new BooleanSetting("revanced_sanitize_sharing_links", TRUE); + public static final BooleanSetting SANITIZE_SHARING_LINKS = new BooleanSetting("revanced_sanitize_sharing_links", TRUE); public static final BooleanSetting REPLACE_MUSIC_LINKS_WITH_YOUTUBE = new BooleanSetting("revanced_replace_music_with_youtube", FALSE); public static final BooleanSetting CHECK_WATCH_HISTORY_DOMAIN_NAME = new BooleanSetting("revanced_check_watch_history_domain_name", TRUE, false, false); - public static final EnumSetting CUSTOM_BRANDING_ICON = new EnumSetting<>("revanced_custom_branding_icon", BrandingTheme.ORIGINAL, true); - public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", 1, true); + public static final EnumSetting CUSTOM_BRANDING_ICON = new EnumSetting<>("revanced_custom_branding_icon", CustomBrandingPatch.getDefaultIconStyle(), true); + public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", CustomBrandingPatch.getDefaultAppNameIndex(), true); public static final StringSetting DISABLED_FEATURE_FLAGS = new StringSetting("revanced_disabled_feature_flags", "", true, parent(DEBUG)); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java index 58745a16cb..c67ebabf96 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java @@ -43,7 +43,7 @@ public class BooleanSetting extends Setting { * This method is only to be used by the Settings preference code. * * This intentionally is a static method to deter - * accidental usage when {@link #save(Boolean)} was intnded. + * accidental usage when {@link #save(Boolean)} was intended. */ public static void privateSetValue(@NonNull BooleanSetting setting, @NonNull Boolean newValue) { setting.value = Objects.requireNonNull(newValue); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java index 88de4029ef..2c2cb6a3a8 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/EnumSetting.java @@ -72,7 +72,7 @@ public class EnumSetting> extends Setting { } /** - * @param enumName Enum name. Casing does not matter. + * @param enumName Enum name. Casing does not matter. * @return Enum of this type with the same declared name. * @throws IllegalArgumentException if the name is not a valid enum of this type. */ diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java index 32d24e3e1f..53a980e3c2 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/Setting.java @@ -274,60 +274,6 @@ public abstract class Setting { load(); } - /** - * Migrate a setting value if the path is renamed but otherwise the old and new settings are identical. - */ - public static void migrateOldSettingToNew(Setting oldSetting, Setting newSetting) { - if (oldSetting == newSetting) throw new IllegalArgumentException(); - - if (!oldSetting.isSetToDefault()) { - Logger.printInfo(() -> "Migrating old setting value: " + oldSetting + " into replacement setting: " + newSetting); - newSetting.save(oldSetting.value); - oldSetting.resetToDefault(); - } - } - - /** - * Migrate an old Setting value previously stored in a different SharedPreference. - *

- * This method will be deleted in the future. - */ - @SuppressWarnings({"rawtypes", "NewApi"}) - public static void migrateFromOldPreferences(SharedPrefCategory oldPrefs, Setting setting, String settingKey) { - if (!oldPrefs.preferences.contains(settingKey)) { - return; // Nothing to do. - } - - Object newValue = setting.get(); - final Object migratedValue; - if (setting instanceof BooleanSetting) { - migratedValue = oldPrefs.getBoolean(settingKey, (Boolean) newValue); - } else if (setting instanceof IntegerSetting) { - migratedValue = oldPrefs.getIntegerString(settingKey, (Integer) newValue); - } else if (setting instanceof LongSetting) { - migratedValue = oldPrefs.getLongString(settingKey, (Long) newValue); - } else if (setting instanceof FloatSetting) { - migratedValue = oldPrefs.getFloatString(settingKey, (Float) newValue); - } else if (setting instanceof StringSetting) { - migratedValue = oldPrefs.getString(settingKey, (String) newValue); - } else { - Logger.printException(() -> "Unknown setting: " + setting); - // Remove otherwise it'll show a toast on every launch. - oldPrefs.preferences.edit().remove(settingKey).apply(); - return; - } - - oldPrefs.preferences.edit().remove(settingKey).apply(); // Remove the old setting. - if (migratedValue.equals(newValue)) { - Logger.printDebug(() -> "Value does not need migrating: " + settingKey); - return; // Old value is already equal to the new setting value. - } - - Logger.printDebug(() -> "Migrating old preference value into current preference: " + settingKey); - //noinspection unchecked - setting.save(migratedValue); - } - /** * Sets, but does _not_ persistently save the value. * This method is only to be used by the Settings preference code. @@ -419,7 +365,7 @@ public abstract class Setting { } /** - * @return if the currently set value is the same as {@link #defaultValue} + * @return if the currently set value is the same as {@link #defaultValue}. */ public boolean isSetToDefault() { return value.equals(defaultValue); @@ -450,7 +396,7 @@ public abstract class Setting { /** * @param importExportKey The JSON key. The JSONObject parameter will contain data for this key. - * @return the value stored using the import/export key. Do not set any values in this method. + * @return the value stored using the import/export key. Do not set any values in this method. */ protected abstract T readFromJSON(JSONObject json, String importExportKey) throws JSONException; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index 70ae3a5ab2..a515471a00 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -208,7 +208,7 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { private void updatePreferenceScreen(@NonNull PreferenceGroup group, boolean syncSettingValue, boolean applySettingToPreference) { - // Alternatively this could iterate thru all Settings and check for any matching Preferences, + // Alternatively this could iterate through all Settings and check for any matching Preferences, // but there are many more Settings than UI preferences so it's more efficient to only check // the Preferences. for (int i = 0, prefCount = group.getPreferenceCount(); i < prefCount; i++) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java index 061f230e4f..4e6d2e5cdd 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/FeatureFlagsManagerPreference.java @@ -72,7 +72,7 @@ public class FeatureFlagsManagerPreference extends Preference { */ private static final Set FLAGS_TO_IGNORE = Set.of( 45386834L, // 'You' tab settings icon. - 45685201L // Bold icons. Forcing off interferes with patch changes and YT icons are broken. + 45532100L // Cairo flag. Turning this off with all other flags causes the settings menu to be a mix of old/new. ); /** @@ -131,9 +131,10 @@ public class FeatureFlagsManagerPreference extends Preference { disabledFlags.removeAll(FLAGS_TO_IGNORE); if (allKnownFlags.isEmpty() && disabledFlags.isEmpty()) { - // String does not need to be localized because it's basically impossible - // to reach the settings menu without encountering at least 1 flag. - Utils.showToastShort("No feature flags logged yet"); + // It's impossible to reach the settings menu without reaching at least one flag. + // So if theres no flags, then that means the user has just enabled debugging + // but has not restarted the app yet. + Utils.showToastShort(str("revanced_debug_feature_flags_manager_toast_no_flags")); return; } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SharedPrefCategory.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SharedPrefCategory.java index 4e9c1f2e0b..ed5db6b235 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SharedPrefCategory.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/SharedPrefCategory.java @@ -36,18 +36,18 @@ public class SharedPrefCategory { } private void saveObjectAsString(@NonNull String key, @Nullable Object value) { - preferences.edit().putString(key, (value == null ? null : value.toString())).apply(); + preferences.edit().putString(key, (value == null ? null : value.toString())).commit(); } /** * Removes any preference data type that has the specified key. */ public void removeKey(@NonNull String key) { - preferences.edit().remove(Objects.requireNonNull(key)).apply(); + preferences.edit().remove(Objects.requireNonNull(key)).commit(); } public void saveBoolean(@NonNull String key, boolean value) { - preferences.edit().putBoolean(key, value).apply(); + preferences.edit().putBoolean(key, value).commit(); } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/UrlLinkPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/URLLinkPreference.java similarity index 65% rename from extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/UrlLinkPreference.java rename to extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/URLLinkPreference.java index 8b9a76f039..59f3077ceb 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/UrlLinkPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/URLLinkPreference.java @@ -9,36 +9,36 @@ import android.util.AttributeSet; import app.revanced.extension.shared.Logger; /** - * Simple preference that opens a url when clicked. + * Simple preference that opens a URL when clicked. */ @SuppressWarnings("deprecation") -public class UrlLinkPreference extends Preference { +public class URLLinkPreference extends Preference { - protected String externalUrl; + protected String externalURL; { setOnPreferenceClickListener(pref -> { - if (externalUrl == null) { + if (externalURL == null) { Logger.printException(() -> "URL not set " + getClass().getSimpleName()); return false; } Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse(externalUrl)); + i.setData(Uri.parse(externalURL)); pref.getContext().startActivity(i); return true; }); } - public UrlLinkPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + public URLLinkPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } - public UrlLinkPreference(Context context, AttributeSet attrs, int defStyleAttr) { + public URLLinkPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - public UrlLinkPreference(Context context, AttributeSet attrs) { + public URLLinkPreference(Context context, AttributeSet attrs) { super(context, attrs); } - public UrlLinkPreference(Context context) { + public URLLinkPreference(Context context) { super(context); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java index 7b5830a463..95731418d2 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java @@ -20,7 +20,7 @@ import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; -import app.revanced.extension.shared.settings.preference.UrlLinkPreference; +import app.revanced.extension.shared.settings.preference.URLLinkPreference; /** * Abstract base class for search result items, defining common fields and behavior. @@ -167,7 +167,7 @@ public abstract class BaseSearchResultItem { if (pref instanceof SwitchPreference) return ViewType.SWITCH; if (pref instanceof ListPreference) return ViewType.LIST; if (pref instanceof ColorPickerPreference) return ViewType.COLOR_PICKER; - if (pref instanceof UrlLinkPreference) return ViewType.URL_LINK; + if (pref instanceof URLLinkPreference) return ViewType.URL_LINK; if ("no_results_placeholder".equals(pref.getKey())) return ViewType.NO_RESULTS; return ViewType.REGULAR; } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java index d6a8167f4e..04d69c6b6b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java @@ -36,7 +36,7 @@ import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; -import app.revanced.extension.shared.settings.preference.UrlLinkPreference; +import app.revanced.extension.shared.settings.preference.URLLinkPreference; import app.revanced.extension.shared.ui.ColorDot; /** @@ -436,7 +436,7 @@ public abstract class BaseSearchResultsAdapter extends ArrayAdapter * Effectively the cache expiration of these fetches is the same as the stock app, @@ -86,7 +86,7 @@ public class StreamingDataRequest { * Cache limit must be greater than the maximum number of videos open at once, * which theoretically is more than 4 (3 Shorts + one regular minimized video). * But instead use a much larger value, to handle if a video viewed a while ago - * is somehow still referenced. Each stream is a small array of Strings + * is somehow still referenced. Each stream is a small array of Strings * so memory usage is not a concern. */ private static final Map cache = Collections.synchronizedMap( diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java index 61cb977a2f..9124b2f36f 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java @@ -14,6 +14,6 @@ public final class SanitizeSharingLinksPatch { * Injection point. */ public static String sanitizeSharingLink(String url) { - return sanitizer.sanitizeUrlString(url); + return sanitizer.sanitizeURLString(url); } } diff --git a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java index 7383a5582c..efa11b210b 100644 --- a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java +++ b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java @@ -26,7 +26,7 @@ public class ExtensionPreferenceCategory extends ConditionalPreferenceCategory { addPreference(new TogglePreference(context, "Sanitize sharing links", "Remove tracking parameters from shared links.", - BaseSettings.SANITIZE_SHARED_LINKS + BaseSettings.SANITIZE_SHARING_LINKS )); addPreference(new TogglePreference(context, diff --git a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java index 5d09c10c0b..4b9b31dcd8 100644 --- a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java +++ b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java @@ -1,6 +1,5 @@ package app.revanced.extension.tiktok.share; -import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.privacy.LinkSanitizer; import app.revanced.extension.shared.settings.BaseSettings; @@ -13,7 +12,7 @@ public final class ShareUrlSanitizer { * Injection point for setting check. */ public static boolean shouldSanitize() { - return BaseSettings.SANITIZE_SHARED_LINKS.get(); + return BaseSettings.SANITIZE_SHARING_LINKS.get(); } /** @@ -24,6 +23,6 @@ public final class ShareUrlSanitizer { return url; } - return sanitizer.sanitizeUrlString(url); + return sanitizer.sanitizeURLString(url); } } diff --git a/extensions/youtube/build.gradle.kts b/extensions/youtube/build.gradle.kts index c7116666bd..f84a54a0d3 100644 --- a/extensions/youtube/build.gradle.kts +++ b/extensions/youtube/build.gradle.kts @@ -6,6 +6,6 @@ dependencies { android { defaultConfig { - minSdk = 23 + minSdk = 26 } } diff --git a/extensions/youtube/src/main/AndroidManifest.xml b/extensions/youtube/src/main/AndroidManifest.xml index 9b65eb06cf..042e61a707 100644 --- a/extensions/youtube/src/main/AndroidManifest.xml +++ b/extensions/youtube/src/main/AndroidManifest.xml @@ -1 +1,4 @@ - + + + + diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java index 57531bf462..53c1e9c0e8 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java @@ -36,7 +36,7 @@ import app.revanced.extension.youtube.shared.PlayerType; * Can show YouTube provided screen captures of beginning/middle/end of the video. * (ie: sd1.jpg, sd2.jpg, sd3.jpg). *

- * Or can show crowd-sourced thumbnails provided by DeArrow (...). + * Or can show crowdsourced thumbnails provided by DeArrow (...). *

* Or can use DeArrow and fall back to screen captures if DeArrow is not available. *

@@ -135,12 +135,12 @@ public final class AlternativeThumbnailsPatch { } } - private static final Uri dearrowApiUri; + private static final Uri dearrowAPIURI; /** - * The scheme and host of {@link #dearrowApiUri}. + * The scheme and host of {@link #dearrowAPIURI}. */ - private static final String deArrowApiUrlPrefix; + private static final String deArrowAPIURLPrefix; /** * How long to temporarily turn off DeArrow if it fails for any reason. @@ -148,31 +148,31 @@ public final class AlternativeThumbnailsPatch { private static final long DEARROW_FAILURE_API_BACKOFF_MILLISECONDS = 5 * 60 * 1000; // 5 Minutes. /** - * If non zero, then the system time of when DeArrow API calls can resume. + * If non-zero, then the system time of when DeArrow API calls can resume. */ private static volatile long timeToResumeDeArrowAPICalls; static { - dearrowApiUri = validateSettings(); - final int port = dearrowApiUri.getPort(); + dearrowAPIURI = validateSettings(); + final int port = dearrowAPIURI.getPort(); String portString = port == -1 ? "" : (":" + port); - deArrowApiUrlPrefix = dearrowApiUri.getScheme() + "://" + dearrowApiUri.getHost() + portString + "/"; - Logger.printDebug(() -> "Using DeArrow API address: " + deArrowApiUrlPrefix); + deArrowAPIURLPrefix = dearrowAPIURI.getScheme() + "://" + dearrowAPIURI.getHost() + portString + "/"; + Logger.printDebug(() -> "Using DeArrow API address: " + deArrowAPIURLPrefix); } /** * Fix any bad imported data. */ private static Uri validateSettings() { - Uri apiUri = Uri.parse(Settings.ALT_THUMBNAIL_DEARROW_API_URL.get()); + Uri apiURI = Uri.parse(Settings.ALT_THUMBNAIL_DEARROW_API_URL.get()); // Cannot use unsecured 'http', otherwise the connections fail to start and no callbacks hooks are made. - String scheme = apiUri.getScheme(); - if (scheme == null || scheme.equals("http") || apiUri.getHost() == null) { + String scheme = apiURI.getScheme(); + if (scheme == null || scheme.equals("http") || apiURI.getHost() == null) { Utils.showToastLong("Invalid DeArrow API URL. Using default"); Settings.ALT_THUMBNAIL_DEARROW_API_URL.resetToDefault(); return validateSettings(); } - return apiUri; + return apiURI; } private static ThumbnailOption optionSettingForCurrentNavigation() { @@ -209,16 +209,16 @@ public final class AlternativeThumbnailsPatch { } /** - * Build the alternative thumbnail url using YouTube provided still video captures. + * Build the alternative thumbnail URL using YouTube provided still video captures. * - * @param decodedUrl Decoded original thumbnail request url. - * @return The alternative thumbnail url, or if not available NULL. + * @param decodedURL Decoded original thumbnail request url. + * @return The alternative thumbnail URL, or if not available NULL. */ @Nullable - private static String buildYouTubeVideoStillURL(@NonNull DecodedThumbnailUrl decodedUrl, + private static String buildYouTubeVideoStillURL(@NonNull DecodedThumbnailURL decodedURL, @NonNull ThumbnailQuality qualityToUse) { - String sanitizedReplacement = decodedUrl.createStillsUrl(qualityToUse, false); - if (VerifiedQualities.verifyAltThumbnailExist(decodedUrl.videoId, qualityToUse, sanitizedReplacement)) { + String sanitizedReplacement = decodedURL.createStillsURL(qualityToUse, false); + if (VerifiedQualities.verifyAltThumbnailExist(decodedURL.videoId, qualityToUse, sanitizedReplacement)) { return sanitizedReplacement; } @@ -226,26 +226,26 @@ public final class AlternativeThumbnailsPatch { } /** - * Build the alternative thumbnail url using DeArrow thumbnail cache. + * Build the alternative thumbnail URL using DeArrow thumbnail cache. * * @param videoId ID of the video to get a thumbnail of. Can be any video (regular or Short). - * @param fallbackUrl URL to fall back to in case. - * @return The alternative thumbnail url, without tracking parameters. + * @param fallbackURL URL to fall back to in case. + * @return The alternative thumbnail URL, without tracking parameters. */ @NonNull - private static String buildDeArrowThumbnailURL(String videoId, String fallbackUrl) { - // Build thumbnail request url. + private static String buildDeArrowThumbnailURL(String videoId, String fallbackURL) { + // Build thumbnail request URL. // See https://github.com/ajayyy/DeArrowThumbnailCache/blob/29eb4359ebdf823626c79d944a901492d760bbbc/app.py#L29. - return dearrowApiUri + return dearrowAPIURI .buildUpon() - .appendQueryParameter("videoID", videoId) - .appendQueryParameter("redirectUrl", fallbackUrl) + .appendQueryParameter("videoId", videoId) + .appendQueryParameter("redirectURL", fallbackURL) .build() .toString(); } - private static boolean urlIsDeArrow(@NonNull String imageUrl) { - return imageUrl.startsWith(deArrowApiUrlPrefix); + private static boolean urlIsDeArrow(@NonNull String imageURL) { + return imageURL.startsWith(deArrowAPIURLPrefix); } /** @@ -264,7 +264,7 @@ public final class AlternativeThumbnailsPatch { } private static void handleDeArrowError(@NonNull String url, int statusCode) { - Logger.printDebug(() -> "Encountered DeArrow error. Url: " + url); + Logger.printDebug(() -> "Encountered DeArrow error. URL: " + url); final long now = System.currentTimeMillis(); if (timeToResumeDeArrowAPICalls < now) { timeToResumeDeArrowAPICalls = now + DEARROW_FAILURE_API_BACKOFF_MILLISECONDS; @@ -278,63 +278,63 @@ public final class AlternativeThumbnailsPatch { } /** - * Injection point. Called off the main thread and by multiple threads at the same time. + * Injection point. Called off the main thread and by multiple threads at the same time. * - * @param originalUrl Image url for all url images loaded, including video thumbnails. + * @param originalURL Image URL for all URL images loaded, including video thumbnails. */ - public static String overrideImageURL(String originalUrl) { + public static String overrideImageURL(String originalURL) { try { ThumbnailOption option = optionSettingForCurrentNavigation(); if (option == ThumbnailOption.ORIGINAL) { - return originalUrl; + return originalURL; } - final var decodedUrl = DecodedThumbnailUrl.decodeImageUrl(originalUrl); - if (decodedUrl == null) { - return originalUrl; // Not a thumbnail. + final var decodedURL = DecodedThumbnailURL.decodeImageURL(originalURL); + if (decodedURL == null) { + return originalURL; // Not a thumbnail. } - Logger.printDebug(() -> "Original url: " + decodedUrl.sanitizedUrl); + Logger.printDebug(() -> "Original URL: " + decodedURL.sanitizedURL); - ThumbnailQuality qualityToUse = ThumbnailQuality.getQualityToUse(decodedUrl.imageQuality); + ThumbnailQuality qualityToUse = ThumbnailQuality.getQualityToUse(decodedURL.imageQuality); if (qualityToUse == null) { // Thumbnail is a Short or a Storyboard image used for seekbar thumbnails (must not replace these). - return originalUrl; + return originalURL; } - String sanitizedReplacementUrl; + String sanitizedReplacementURL; final boolean includeTracking; if (option.useDeArrow && canUseDeArrowAPI()) { includeTracking = false; // Do not include view tracking parameters with API call. - String fallbackUrl = null; + String fallbackURL = null; if (option.useStillImages) { - fallbackUrl = buildYouTubeVideoStillURL(decodedUrl, qualityToUse); + fallbackURL = buildYouTubeVideoStillURL(decodedURL, qualityToUse); } - if (fallbackUrl == null) { - fallbackUrl = decodedUrl.sanitizedUrl; + if (fallbackURL == null) { + fallbackURL = decodedURL.sanitizedURL; } - sanitizedReplacementUrl = buildDeArrowThumbnailURL(decodedUrl.videoId, fallbackUrl); + sanitizedReplacementURL = buildDeArrowThumbnailURL(decodedURL.videoId, fallbackURL); } else if (option.useStillImages) { includeTracking = true; // Include view tracking parameters if present. - sanitizedReplacementUrl = buildYouTubeVideoStillURL(decodedUrl, qualityToUse); - if (sanitizedReplacementUrl == null) { - return originalUrl; // Still capture is not available. Return the untouched original url. + sanitizedReplacementURL = buildYouTubeVideoStillURL(decodedURL, qualityToUse); + if (sanitizedReplacementURL == null) { + return originalURL; // Still capture is not available. Return the untouched original url. } } else { - return originalUrl; // Recently experienced DeArrow failure and video stills are not enabled. + return originalURL; // Recently experienced DeArrow failure and video stills are not enabled. } // Do not log any tracking parameters. - Logger.printDebug(() -> "Replacement url: " + sanitizedReplacementUrl); + Logger.printDebug(() -> "Replacement URL: " + sanitizedReplacementURL); return includeTracking - ? sanitizedReplacementUrl + decodedUrl.viewTrackingParameters - : sanitizedReplacementUrl; + ? sanitizedReplacementURL + decodedURL.viewTrackingParameters + : sanitizedReplacementURL; } catch (Exception ex) { Logger.printException(() -> "overrideImageURL failure", ex); - return originalUrl; + return originalURL; } } @@ -370,21 +370,21 @@ public final class AlternativeThumbnailsPatch { // - very old // - very low view count // Take note of this, so if the image reloads the original thumbnail will be used. - DecodedThumbnailUrl decodedUrl = DecodedThumbnailUrl.decodeImageUrl(url); - if (decodedUrl == null) { + DecodedThumbnailURL decodedURL = DecodedThumbnailURL.decodeImageURL(url); + if (decodedURL == null) { return; // Not a thumbnail. } - Logger.printDebug(() -> "handleCronetSuccess, image not available: " + decodedUrl.sanitizedUrl); + Logger.printDebug(() -> "handleCronetSuccess, image not available: " + decodedURL.sanitizedURL); - ThumbnailQuality quality = ThumbnailQuality.altImageNameToQuality(decodedUrl.imageQuality); + ThumbnailQuality quality = ThumbnailQuality.altImageNameToQuality(decodedURL.imageQuality); if (quality == null) { // Video is a short or a seekbar thumbnail, but somehow did not load. Should not happen. - Logger.printDebug(() -> "Failed to recognize image quality of url: " + decodedUrl.sanitizedUrl); + Logger.printDebug(() -> "Failed to recognize image quality of URL: " + decodedURL.sanitizedURL); return; } - VerifiedQualities.setAltThumbnailDoesNotExist(decodedUrl.videoId, quality); + VerifiedQualities.setAltThumbnailDoesNotExist(decodedURL.videoId, quality); } } catch (Exception ex) { Logger.printException(() -> "Callback success error", ex); @@ -482,7 +482,7 @@ public final class AlternativeThumbnailsPatch { // (even though search and subscriptions use the exact same layout as the home feed). // Of note, this image quality issue only appears with the alt thumbnail images, // and the regular thumbnails have identical color/contrast quality for all sizes. - // Fix this by falling thru and upgrading SD to 720. + // Fix this by falling through and upgrading SD to 720. case SDDEFAULT, HQ720 -> { // SD is max resolution for fast alt images. if (useFastQuality) { yield SDDEFAULT; @@ -525,7 +525,7 @@ public final class AlternativeThumbnailsPatch { private static final long NOT_AVAILABLE_TIMEOUT_MILLISECONDS = 10 * 60 * 1000; // 10 minutes. /** - * Cache used to verify if an alternative thumbnails exists for a given video id. + * Cache used to verify if an alternative thumbnails exists for a given video ID. */ @GuardedBy("itself") private static final Map altVideoIdLookup = @@ -546,10 +546,10 @@ public final class AlternativeThumbnailsPatch { } static boolean verifyAltThumbnailExist(@NonNull String videoId, @NonNull ThumbnailQuality quality, - @NonNull String imageUrl) { + @NonNull String imageURL) { VerifiedQualities verified = getVerifiedQualities(videoId, Settings.ALT_THUMBNAIL_STILLS_FAST.get()); if (verified == null) return true; // Fast alt thumbnails is enabled. - return verified.verifyYouTubeThumbnailExists(videoId, quality, imageUrl); + return verified.verifyYouTubeThumbnailExists(videoId, quality, imageURL); } static void setAltThumbnailDoesNotExist(@NonNull String videoId, @NonNull ThumbnailQuality quality) { @@ -590,10 +590,10 @@ public final class AlternativeThumbnailsPatch { } /** - * Verify if a video alt thumbnail exists. Does so by making a minimal HEAD http request. + * Verify if a video alt thumbnail exists. Does so by making a minimal HEAD HTTP request. */ synchronized boolean verifyYouTubeThumbnailExists(@NonNull String videoId, @NonNull ThumbnailQuality quality, - @NonNull String imageUrl) { + @NonNull String imageURL) { if (highestQualityVerified != null && highestQualityVerified.ordinal() >= quality.ordinal()) { return true; // Previously verified as existing. } @@ -609,7 +609,7 @@ public final class AlternativeThumbnailsPatch { } if (fastQuality) { - return true; // Unknown if it exists or not. Use the URL anyways and update afterwards if loading fails. + return true; // Unknown if it exists or not. Use the URL anyway and update afterward if loading fails. } boolean imageFileFound; @@ -619,7 +619,7 @@ public final class AlternativeThumbnailsPatch { final long start = System.currentTimeMillis(); imageFileFound = Utils.submitOnBackgroundThread(() -> { final int connectionTimeoutMillis = 10000; // 10 seconds. - HttpURLConnection connection = (HttpURLConnection) new URL(imageUrl).openConnection(); + HttpURLConnection connection = (HttpURLConnection) new URL(imageURL).openConnection(); connection.setConnectTimeout(connectionTimeoutMillis); connection.setReadTimeout(connectionTimeoutMillis); connection.setRequestMethod("HEAD"); @@ -632,13 +632,13 @@ public final class AlternativeThumbnailsPatch { return (contentType != null && contentType.startsWith("image")); } if (responseCode != HttpURLConnection.HTTP_NOT_FOUND) { - Logger.printDebug(() -> "Unexpected response code: " + responseCode + " for url: " + imageUrl); + Logger.printDebug(() -> "Unexpected response code: " + responseCode + " for URL: " + imageURL); } return false; }).get(); - Logger.printDebug(() -> "Verification took: " + (System.currentTimeMillis() - start) + "ms for image: " + imageUrl); + Logger.printDebug(() -> "Verification took: " + (System.currentTimeMillis() - start) + "ms for image: " + imageURL); } catch (ExecutionException | InterruptedException ex) { - Logger.printInfo(() -> "Could not verify alt url: " + imageUrl, ex); + Logger.printInfo(() -> "Could not verify alt URL: " + imageURL, ex); imageFileFound = false; } @@ -650,11 +650,11 @@ public final class AlternativeThumbnailsPatch { /** * YouTube video thumbnail url, decoded into it's relevant parts. */ - private static class DecodedThumbnailUrl { + private static class DecodedThumbnailURL { private static final String YOUTUBE_THUMBNAIL_DOMAIN = "https://i.ytimg.com/"; @Nullable - static DecodedThumbnailUrl decodeImageUrl(String url) { + static DecodedThumbnailURL decodeImageURL(String url) { final int urlPathStartIndex = url.indexOf('/', "https://".length()) + 1; if (urlPathStartIndex <= 0) return null; @@ -674,14 +674,14 @@ public final class AlternativeThumbnailsPatch { int imageExtensionEndIndex = url.indexOf('?', imageSizeEndIndex); if (imageExtensionEndIndex < 0) imageExtensionEndIndex = url.length(); - return new DecodedThumbnailUrl(url, urlPathStartIndex, urlPathEndIndex, videoIdStartIndex, videoIdEndIndex, + return new DecodedThumbnailURL(url, urlPathStartIndex, urlPathEndIndex, videoIdStartIndex, videoIdEndIndex, imageSizeStartIndex, imageSizeEndIndex, imageExtensionEndIndex); } - final String originalFullUrl; + final String originalFullURL; /** Full usable url, but stripped of any tracking information. */ - final String sanitizedUrl; - /** Url path, such as 'vi' or 'vi_webp' */ + final String sanitizedURL; + /** URL path, such as 'vi' or 'vi_webp' */ final String urlPath; final String videoId; /** Quality, such as hq720 or sddefault. */ @@ -691,25 +691,25 @@ public final class AlternativeThumbnailsPatch { /** User view tracking parameters, only present on some images. */ final String viewTrackingParameters; - DecodedThumbnailUrl(String fullUrl, int urlPathStartIndex, int urlPathEndIndex, int videoIdStartIndex, int videoIdEndIndex, + DecodedThumbnailURL(String fullURL, int urlPathStartIndex, int urlPathEndIndex, int videoIdStartIndex, int videoIdEndIndex, int imageSizeStartIndex, int imageSizeEndIndex, int imageExtensionEndIndex) { - originalFullUrl = fullUrl; - sanitizedUrl = fullUrl.substring(0, imageExtensionEndIndex); - urlPath = fullUrl.substring(urlPathStartIndex, urlPathEndIndex); - videoId = fullUrl.substring(videoIdStartIndex, videoIdEndIndex); - imageQuality = fullUrl.substring(imageSizeStartIndex, imageSizeEndIndex); - imageExtension = fullUrl.substring(imageSizeEndIndex + 1, imageExtensionEndIndex); - viewTrackingParameters = (imageExtensionEndIndex == fullUrl.length()) - ? "" : fullUrl.substring(imageExtensionEndIndex); + originalFullURL = fullURL; + sanitizedURL = fullURL.substring(0, imageExtensionEndIndex); + urlPath = fullURL.substring(urlPathStartIndex, urlPathEndIndex); + videoId = fullURL.substring(videoIdStartIndex, videoIdEndIndex); + imageQuality = fullURL.substring(imageSizeStartIndex, imageSizeEndIndex); + imageExtension = fullURL.substring(imageSizeEndIndex + 1, imageExtensionEndIndex); + viewTrackingParameters = (imageExtensionEndIndex == fullURL.length()) + ? "" : fullURL.substring(imageExtensionEndIndex); } @SuppressWarnings("SameParameterValue") - String createStillsUrl(@NonNull ThumbnailQuality qualityToUse, boolean includeViewTracking) { + String createStillsURL(@NonNull ThumbnailQuality qualityToUse, boolean includeViewTracking) { // Images could be upgraded to webp if they are not already, but this fails quite often, // especially for new videos uploaded in the last hour. // And even if alt webp images do exist, sometimes they can load much slower than the original jpg alt images. // (as much as 4x slower network response has been observed, despite the alt webp image being a smaller file). - StringBuilder builder = new StringBuilder(originalFullUrl.length() + 2); + StringBuilder builder = new StringBuilder(originalFullURL.length() + 2); // Many different "i.ytimage.com" domains exist such as "i9.ytimg.com", // but still captures are frequently not available on the other domains (especially newly uploaded videos). // So always use the primary domain for a higher success rate. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BackgroundPlaybackPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BackgroundPlaybackPatch.java index 7575414ba1..87af8b0ccf 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BackgroundPlaybackPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BackgroundPlaybackPatch.java @@ -15,7 +15,7 @@ public class BackgroundPlaybackPatch { // Steps to verify most edge cases (with Shorts background playback set to off): // 1. Open a regular video - // 2. Minimize app (PIP should appear) + // 2. Minimize app (PiP should appear) // 3. Reopen app // 4. Open a Short (without closing the regular video) // (try opening both Shorts in the video player suggestions AND Shorts from the home feed) @@ -23,7 +23,7 @@ public class BackgroundPlaybackPatch { // 6. Reopen app // 7. Close the Short // 8. Resume playing the regular video - // 9. Minimize the app (PIP should appear) + // 9. Minimize the app (PiP should appear) if (ShortsPlayerState.isOpen()) { return false; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BypassImageRegionRestrictionsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BypassImageRegionRestrictionsPatch.java index ccc853d4c3..1272992993 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BypassImageRegionRestrictionsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/BypassImageRegionRestrictionsPatch.java @@ -15,24 +15,24 @@ public final class BypassImageRegionRestrictionsPatch { private static final String REPLACEMENT_IMAGE_DOMAIN = "https://yt4.ggpht.com"; /** - * YouTube static images domain. Includes user and channel avatar images and community post images. + * YouTube static images' domain. Includes user and channel avatar images and community post images. */ private static final Pattern YOUTUBE_STATIC_IMAGE_DOMAIN_PATTERN = Pattern.compile("^https://(yt3|lh[3-6]|play-lh)\\.(ggpht|googleusercontent)\\.com"); /** - * Injection point. Called off the main thread and by multiple threads at the same time. + * Injection point. Called off the main thread and by multiple threads at the same time. * - * @param originalUrl Image url for all image urls loaded. + * @param originalURL Image URL for all image URLs loaded. */ - public static String overrideImageURL(String originalUrl) { + public static String overrideImageURL(String originalURL) { try { if (BYPASS_IMAGE_REGION_RESTRICTIONS_ENABLED) { String replacement = YOUTUBE_STATIC_IMAGE_DOMAIN_PATTERN - .matcher(originalUrl).replaceFirst(REPLACEMENT_IMAGE_DOMAIN); + .matcher(originalURL).replaceFirst(REPLACEMENT_IMAGE_DOMAIN); - if (Settings.DEBUG.get() && !replacement.equals(originalUrl)) { - Logger.printDebug(() -> "Replaced: '" + originalUrl + "' with: '" + replacement + "'"); + if (Settings.DEBUG.get() && !replacement.equals(originalURL)) { + Logger.printDebug(() -> "Replaced: '" + originalURL + "' with: '" + replacement + "'"); } return replacement; @@ -41,6 +41,6 @@ public final class BypassImageRegionRestrictionsPatch { Logger.printException(() -> "overrideImageURL failure", ex); } - return originalUrl; + return originalURL; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeFormFactorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeFormFactorPatch.java index 706b135aff..d7cf0faba1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeFormFactorPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeFormFactorPatch.java @@ -94,7 +94,7 @@ public class ChangeFormFactorPatch { public static void navigationTabCreated(NavigationButton button, View tabView) { // On first startup of the app the navigation buttons are fetched and updated. // If the user immediately opens the 'You' or opens a video, then the call to - // update the navigtation buttons will use the non automotive form factor + // update the navigation buttons will use the non-automotive form factor // and the explore tab is missing. // Fixing this is not so simple because of the concurrent calls for the player and You tab. // For now, always hide the explore tab. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeStartPagePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeStartPagePatch.java index 9748a3d68f..b21ad89923 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeStartPagePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeStartPagePatch.java @@ -24,7 +24,7 @@ public final class ChangeStartPagePatch { DEFAULT("", null), /** - * Browse id. + * BrowseId. */ ALL_SUBSCRIPTIONS("FEchannels", TRUE), BROWSE("FEguide_builder", TRUE), @@ -39,7 +39,7 @@ public final class ChangeStartPagePatch { YOUR_CLIPS("FEclips", TRUE), /** - * Channel id, this can be used as a browseId. + * Channel ID, this can be used as a browseId. */ COURSES("UCtFRv9O2AHqOZjjynzrv-xg", TRUE), FASHION("UCrpQ4p1Ql_hG8rKXIKM1MOQ", TRUE), @@ -52,7 +52,7 @@ public final class ChangeStartPagePatch { VIRTUAL_REALITY("UCzuqhhs6NWbgTzMuM09WKDQ", TRUE), /** - * Playlist id, this can be used as a browseId. + * Playlist ID, this can be used as a browseId. */ LIKED_VIDEO("VLLL", TRUE), WATCH_LATER("VLWL", TRUE), diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoUrlPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoURLPatch.java similarity index 93% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoUrlPatch.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoURLPatch.java index db3338f527..cae9bb3df1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoUrlPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/CopyVideoURLPatch.java @@ -7,9 +7,9 @@ import android.os.Build; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; -public class CopyVideoUrlPatch { +public class CopyVideoURLPatch { - public static void copyUrl(boolean withTimestamp) { + public static void copyURL(boolean withTimestamp) { try { StringBuilder builder = new StringBuilder("https://youtu.be/"); builder.append(VideoInformation.getVideoId()); @@ -31,7 +31,7 @@ public class CopyVideoUrlPatch { } Utils.setClipboard(builder.toString()); - // Do not show a toast if using Android 13+ as it shows it's own toast. + // Do not show a toast if using Android 13+ as it shows its own toast. // But if the user copied with a timestamp then show a toast. // Unfortunately this will show 2 toasts on Android 13+, but no way around this. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2 || (withTimestamp && currentVideoTimeInSeconds > 0)) { @@ -40,7 +40,7 @@ public class CopyVideoUrlPatch { : str("revanced_share_copy_url_success")); } } catch (Exception e) { - Logger.printException(() -> "Failed to generate video url", e); + Logger.printException(() -> "Failed to generate video URL", e); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHapticFeedbackPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHapticFeedbackPatch.java index 6ae49427af..f466bf9a62 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHapticFeedbackPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHapticFeedbackPatch.java @@ -1,5 +1,8 @@ package app.revanced.extension.youtube.patches; +import android.os.VibrationEffect; +import android.os.Vibrator; + import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -12,6 +15,13 @@ public class DisableHapticFeedbackPatch { return Settings.DISABLE_HAPTIC_FEEDBACK_CHAPTERS.get(); } + /** + * Injection point. + */ + public static boolean disablePreciseSeekingVibrate() { + return Settings.DISABLE_HAPTIC_FEEDBACK_PRECISE_SEEKING.get(); + } + /** * Injection point. */ @@ -22,8 +32,10 @@ public class DisableHapticFeedbackPatch { /** * Injection point. */ - public static boolean disablePreciseSeekingVibrate() { - return Settings.DISABLE_HAPTIC_FEEDBACK_PRECISE_SEEKING.get(); + public static Object disableTapAndHoldVibrate(Object vibrator) { + return Settings.DISABLE_HAPTIC_FEEDBACK_TAP_AND_HOLD.get() + ? null + : vibrator; } /** @@ -32,4 +44,29 @@ public class DisableHapticFeedbackPatch { public static boolean disableZoomVibrate() { return Settings.DISABLE_HAPTIC_FEEDBACK_ZOOM.get(); } + + /** + * Injection point. + */ + public static void vibrate(Vibrator vibrator, VibrationEffect vibrationEffect) { + if (disableVibrate()) return; + vibrator.vibrate(vibrationEffect); + } + + /** + * Injection point. + */ + @SuppressWarnings("deprecation") + public static void vibrate(Vibrator vibrator, long milliseconds) { + if (disableVibrate()) return; + vibrator.vibrate(milliseconds); + } + + private static boolean disableVibrate() { + return Settings.DISABLE_HAPTIC_FEEDBACK_CHAPTERS.get() + && Settings.DISABLE_HAPTIC_FEEDBACK_PRECISE_SEEKING.get() + && Settings.DISABLE_HAPTIC_FEEDBACK_SEEK_UNDO.get() + && Settings.DISABLE_HAPTIC_FEEDBACK_TAP_AND_HOLD.get() + && Settings.DISABLE_HAPTIC_FEEDBACK_ZOOM.get(); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch.java index dd2e0ca8f9..b33b2c25cc 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch.java @@ -4,8 +4,10 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class DisablePlayerPopupPanelsPatch { - //Used by app.revanced.patches.youtube.layout.playerpopuppanels.patch.PlayerPopupPanelsPatch + /** + * Injection point. + */ public static boolean disablePlayerPopupPanels() { - return Settings.PLAYER_POPUP_PANELS.get(); + return Settings.DISABLE_PLAYER_POPUP_PANELS.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTVPopupPatch.java similarity index 69% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTVPopupPatch.java index f6298ce8b6..baceefa1ab 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTVPopupPatch.java @@ -3,12 +3,12 @@ package app.revanced.extension.youtube.patches; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") -public class DisableSignInToTvPopupPatch { +public class DisableSignInToTVPopupPatch { /** * Injection point. */ public static boolean disableSignInToTvPopup() { - return Settings.DISABLE_SIGNIN_TO_TV_POPUP.get(); + return Settings.DISABLE_SIGN_IN_TO_TV_POPUP.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java index 4114d525c9..715d349e1d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java @@ -28,7 +28,7 @@ public final class DownloadsPatch { /** * Injection point. *

- * Called from the in app download hook, + * Called from the in-app download hook, * for both the player action button (below the video) * and the 'Download video' flyout option for feed videos. *

@@ -41,7 +41,7 @@ public final class DownloadsPatch { } // If possible, use the main activity as the context. - // Otherwise fall back on using the application context. + // Otherwise, fall back on using the application context. Context context = activityRef.get(); boolean isActivityContext = true; if (context == null) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java index 972c2cd924..abb2d6ba9e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java @@ -20,8 +20,10 @@ public class ExitFullscreenPatch { /** * Injection point. */ - public static void endOfVideoReached() { + public static void endOfVideoReached(Enum status) { try { + if (status == null || !"ENDED".equals(status.name())) return; + FullscreenMode mode = Settings.EXIT_FULLSCREEN.get(); if (mode == FullscreenMode.DISABLED) { return; @@ -43,7 +45,7 @@ public class ExitFullscreenPatch { // set because the overlay controls are not attached. // To fix this, push the perform click to the back fo the main thread, // and by then the overlay controls will be visible since the video is now finished. - Utils.runOnMainThread(() -> { + Utils.runOnMainThreadDelayed(() -> { ImageView button = PlayerControlsPatch.fullscreenButtonRef.get(); if (button == null) { Logger.printDebug(() -> "Fullscreen button is null, cannot click"); @@ -54,7 +56,7 @@ public class ExitFullscreenPatch { button.performClick(); button.setSoundEffectsEnabled(soundEffectsEnabled); } - }); + }, 10); } } catch (Exception ex) { Logger.printException(() -> "endOfVideoReached failure", ex); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideGetPremiumPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideAutoplayPreviewPatch.java similarity index 55% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideGetPremiumPatch.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideAutoplayPreviewPatch.java index 35592c0ff8..293fe9b151 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideGetPremiumPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideAutoplayPreviewPatch.java @@ -3,11 +3,11 @@ package app.revanced.extension.youtube.patches; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") -public class HideGetPremiumPatch { +public final class HideAutoplayPreviewPatch { /** * Injection point. */ - public static boolean hideGetPremiumView() { - return Settings.HIDE_GET_PREMIUM.get(); + public static boolean hideAutoplayPreview() { + return Settings.HIDE_AUTOPLAY_PREVIEW.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java index 03668aa735..55dab84a55 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java @@ -12,13 +12,13 @@ public class HideEndScreenCardsPatch { * Injection point. */ public static void hideEndScreenCardView(View view) { - Utils.hideViewUnderCondition(Settings.HIDE_ENDSCREEN_CARDS, view); + Utils.hideViewUnderCondition(Settings.HIDE_END_SCREEN_CARDS, view); } /** * Injection point. */ public static boolean hideEndScreenCards() { - return Settings.HIDE_ENDSCREEN_CARDS.get(); + return Settings.HIDE_END_SCREEN_CARDS.get(); } } \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index a4c23aa11e..d7a413b790 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -19,7 +19,7 @@ public final class HidePlayerOverlayButtonsPatch { /** * Injection point. */ - public static boolean hideAutoPlayButton() { + public static boolean hideAutoplayButton() { return HIDE_AUTOPLAY_BUTTON_ENABLED; } @@ -46,6 +46,41 @@ public final class HidePlayerOverlayButtonsPatch { imageView.setVisibility(Settings.HIDE_CAPTIONS_BUTTON.get() ? ImageView.GONE : ImageView.VISIBLE); } + /** + * Injection point. + */ + public static void hideCollapseButton(ImageView imageView) { + if (!Settings.HIDE_COLLAPSE_BUTTON.get()) return; + + // Make the collapse button invisible + imageView.setImageResource(android.R.color.transparent); + imageView.setImageAlpha(0); + imageView.setEnabled(false); + + // Adjust layout params if RelativeLayout + var layoutParams = imageView.getLayoutParams(); + if (layoutParams instanceof android.widget.RelativeLayout.LayoutParams) { + android.widget.RelativeLayout.LayoutParams lp = new android.widget.RelativeLayout.LayoutParams(0, 0); + imageView.setLayoutParams(lp); + } else { + Logger.printDebug(() -> "Unknown collapse button layout params: " + layoutParams); + } + } + + /** + * Injection point. + */ + public static void setTitleAnchorStartMargin(View titleAnchorView) { + if (!Settings.HIDE_COLLAPSE_BUTTON.get()) return; + + var layoutParams = titleAnchorView.getLayoutParams(); + if (layoutParams instanceof android.widget.RelativeLayout.LayoutParams relativeParams) { + relativeParams.setMarginStart(0); + } else { + Logger.printDebug(() -> "Unknown title anchor layout params: " + layoutParams); + } + } + private static final boolean HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS_ENABLED = Settings.HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS.get(); @@ -64,13 +99,28 @@ public final class HidePlayerOverlayButtonsPatch { } // Must use a deferred call to main thread to hide the button. - // Otherwise the layout crashes if set to hidden now. + // Otherwise, the layout crashes if set to hidden now. Utils.runOnMainThread(() -> { hideView(parentView, PLAYER_CONTROL_PREVIOUS_BUTTON_TOUCH_AREA_ID); hideView(parentView, PLAYER_CONTROL_NEXT_BUTTON_TOUCH_AREA_ID); }); } + /** + * Injection point. + */ + public static ImageView hideFullscreenButton(ImageView imageView) { + if (!Settings.HIDE_FULLSCREEN_BUTTON.get()) { + return imageView; + } + + if (imageView != null) { + imageView.setVisibility(View.GONE); + } + + return null; + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/LoopVideoPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/LoopVideoPatch.java index 8504aad931..425d719f33 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/LoopVideoPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/LoopVideoPatch.java @@ -7,7 +7,12 @@ public class LoopVideoPatch { /** * Injection point */ - public static boolean shouldLoopVideo() { - return Settings.LOOP_VIDEO.get(); + public static boolean shouldLoopVideo(Enum status) { + boolean shouldLoop = status != null && "ENDED".equals(status.name()) + && Settings.LOOP_VIDEO.get(); + + // Instead of calling a method to loop the video, just seek to 00:00. + if (shouldLoop) VideoInformation.seekTo(0); + return shouldLoop; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index f24108b97f..84fb868ac9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -13,6 +13,7 @@ import android.widget.TextView; import androidx.annotation.Nullable; import java.util.List; +import java.util.Objects; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ResourceType; @@ -29,7 +30,6 @@ public final class MiniplayerPatch { public enum MiniplayerType { /** * Disabled. When swiped down the miniplayer is immediately closed. - * Only available with 19.43+ */ DISABLED(false, null), /** Unmodified type, and same as un-patched. */ @@ -89,9 +89,9 @@ public final class MiniplayerPatch { final int HORIZONTAL_PADDING_DIP = 15; // Estimated padding. // Round down to the nearest 5 pixels, to keep any error toasts easier to read. final int estimatedWidthDipMax = 5 * ((deviceDipWidth - HORIZONTAL_PADDING_DIP) / 5); - // On some ultra low end devices the pixel width and density are the same number, + // On some ultra-low-end devices the pixel width and density are the same number, // which causes the estimate to always give a value of 1. - // Fix this by using a fixed size of double the min width. + // Fix this by using a fixed size twice the minimum width. final int WIDTH_DIP_MAX = estimatedWidthDipMax <= WIDTH_DIP_MIN ? 2 * WIDTH_DIP_MIN : estimatedWidthDipMax; @@ -140,8 +140,8 @@ public final class MiniplayerPatch { (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3 || CURRENT_TYPE == MODERN_4) && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); - // 19.25 is last version that has forward/back buttons for phones, - // but buttons still show for tablets/foldable devices and they don't work well so always hide. + // 19.25 is last version that uses forward/back buttons for phones, + // but buttons still show for tablets/foldable devices, and they don't work well so always hide. private static final boolean HIDE_REWIND_FORWARD_ENABLED = CURRENT_TYPE == MODERN_1 && (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get()); @@ -281,6 +281,12 @@ public final class MiniplayerPatch { * Injection point. */ public static int getModernMiniplayerOverrideType(int original) { + if (CURRENT_TYPE == MINIMAL) { + // In newer app targets the minimal player can show the wrong icon if modern 4 is allowed. + // Forcing to modern 1 seems to work. + return Objects.requireNonNull(MODERN_1.modernPlayerType); + } + Integer modernValue = CURRENT_TYPE.modernPlayerType; return modernValue == null ? original @@ -385,7 +391,7 @@ public final class MiniplayerPatch { public static boolean allowBoldIcons(boolean original) { if (CURRENT_TYPE == MINIMAL) { // Minimal player does not have the correct pause/play icon (it's too large). - // Use the non bold icons instead. + // Use the non-bold icons instead. return false; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationBarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationBarPatch.java new file mode 100644 index 0000000000..7de8bce90c --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationBarPatch.java @@ -0,0 +1,205 @@ +package app.revanced.extension.youtube.patches; + +import static app.revanced.extension.shared.Utils.hideViewUnderCondition; +import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; + +import android.os.Build; +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; + +import java.util.EnumMap; +import java.util.Map; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.ui.Dim; +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public final class NavigationBarPatch { + + private static final Map shouldHideMap = new EnumMap<>(NavigationButton.class) { + { + put(NavigationButton.HOME, Settings.HIDE_HOME_BUTTON.get()); + put(NavigationButton.CREATE, Settings.HIDE_CREATE_BUTTON.get()); + put(NavigationButton.NOTIFICATIONS, Settings.HIDE_NOTIFICATIONS_BUTTON.get()); + put(NavigationButton.SHORTS, Settings.HIDE_SHORTS_BUTTON.get()); + put(NavigationButton.SUBSCRIPTIONS, Settings.HIDE_SUBSCRIPTIONS_BUTTON.get()); + } + }; + + private static final boolean SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON + = Settings.SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON.get(); + + private static final boolean DISABLE_TRANSLUCENT_STATUS_BAR + = Settings.DISABLE_TRANSLUCENT_STATUS_BAR.get(); + + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT + = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT.get(); + + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); + + private static final boolean NARROW_NAVIGATION_BUTTONS + = Settings.NARROW_NAVIGATION_BUTTONS.get(); + + /** + * Injection point. + */ + public static String switchCreateWithNotificationButton(String osName) { + return SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON + ? "Android Automotive" + : osName; + } + + /** + * Injection point. + */ + public static void navigationTabCreated(NavigationButton button, View tabView) { + if (Boolean.TRUE.equals(shouldHideMap.get(button))) { + tabView.setVisibility(View.GONE); + } + } + + /** + * Injection point. + */ + public static void hideNavigationButtonLabels(TextView navigationLabelsView) { + hideViewUnderCondition(Settings.HIDE_NAVIGATION_BUTTON_LABELS, navigationLabelsView); + } + + /** + * Injection point. + */ + public static boolean useAnimatedNavigationButtons(boolean original) { + return Settings.NAVIGATION_BAR_ANIMATIONS.get(); + } + + /** + * Injection point. + */ + public static boolean enableNarrowNavigationButton(boolean original) { + return NARROW_NAVIGATION_BUTTONS || original; + } + + /** + * Injection point. + */ + public static boolean useTranslucentNavigationStatusBar(boolean original) { + // Must check Android version, as forcing this on Android 11 or lower causes app hang and crash. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + return original; + } + + if (DISABLE_TRANSLUCENT_STATUS_BAR) { + return false; + } + + return original; + } + + /** + * Injection point. + */ + public static boolean useTranslucentNavigationButtons(boolean original) { + // Feature requires Android 13+ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + return original; + } + + if (!DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { + return original; + } + + if (DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { + return false; + } + + return Utils.isDarkModeEnabled() + ? !DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + : !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT; + } + + // Toolbar + + public static void hideCreateButton(String enumString, View view) { + if (!Settings.HIDE_TOOLBAR_CREATE_BUTTON.get()) + return; + + hideViewUnderCondition(isCreateButton(enumString), view); + } + + public static void hideNotificationButton(String enumString, View view) { + if (!Settings.HIDE_TOOLBAR_NOTIFICATION_BUTTON.get()) + return; + + hideViewUnderCondition(isNotificationButton(enumString), view); + } + + public static void hideSearchButton(String enumString, View view) { + if (!Settings.HIDE_TOOLBAR_SEARCH_BUTTON.get()) + return; + + hideViewUnderCondition(isSearchButton(enumString), view); + } + + public static void hideSearchButton(MenuItem menuItem, int original) { + menuItem.setShowAsAction( + Settings.HIDE_TOOLBAR_SEARCH_BUTTON.get() + ? MenuItem.SHOW_AS_ACTION_NEVER + : original + ); + } + + private static boolean isCreateButton(String enumString) { + return "CREATION_ENTRY".equals(enumString) // Create button for Phone layout. + || "FAB_CAMERA".equals(enumString); // Create button for Tablet layout. + } + + private static boolean isNotificationButton(String enumString) { + return "TAB_ACTIVITY".equals(enumString) // Notification button. + || "TAB_ACTIVITY_CAIRO".equals(enumString); // Notification button (New layout). + } + + private static boolean isSearchButton(String enumString) { + return "SEARCH".equals(enumString) // Search button. + || "SEARCH_CAIRO".equals(enumString) // Search button (New layout). + || "SEARCH_BOLD".equals(enumString); // Search button (Shorts). + } + + // Wide searchbar + private static final Boolean WIDE_SEARCHBAR_ENABLED = Settings.WIDE_SEARCHBAR.get(); + + /** + * Injection point. + */ + public static boolean enableWideSearchbar(boolean original) { + return WIDE_SEARCHBAR_ENABLED || original; + } + + /** + * Injection point. + */ + public static void setActionBar(View view) { + try { + if (!WIDE_SEARCHBAR_ENABLED) return; + + View searchBarView = Utils.getChildViewByResourceName(view, "search_bar"); + + final int paddingLeft = searchBarView.getPaddingLeft(); + final int paddingRight = searchBarView.getPaddingRight(); + final int paddingTop = searchBarView.getPaddingTop(); + final int paddingBottom = searchBarView.getPaddingBottom(); + final int paddingStart = Dim.dp8; + + if (Utils.isRightToLeftLocale()) { + searchBarView.setPadding(paddingLeft, paddingTop, paddingStart, paddingBottom); + } else { + searchBarView.setPadding(paddingStart, paddingTop, paddingRight, paddingBottom); + } + } catch (Exception ex) { + Logger.printException(() -> "setActionBar failure", ex); + } + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java deleted file mode 100644 index 76a3156596..0000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ /dev/null @@ -1,108 +0,0 @@ -package app.revanced.extension.youtube.patches; - -import static app.revanced.extension.shared.Utils.hideViewUnderCondition; -import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; - -import android.os.Build; -import android.view.View; -import android.widget.TextView; - -import java.util.EnumMap; -import java.util.Map; - -import app.revanced.extension.shared.Utils; -import app.revanced.extension.youtube.settings.Settings; - -@SuppressWarnings("unused") -public final class NavigationButtonsPatch { - - private static final Map shouldHideMap = new EnumMap<>(NavigationButton.class) { - { - put(NavigationButton.HOME, Settings.HIDE_HOME_BUTTON.get()); - put(NavigationButton.CREATE, Settings.HIDE_CREATE_BUTTON.get()); - put(NavigationButton.NOTIFICATIONS, Settings.HIDE_NOTIFICATIONS_BUTTON.get()); - put(NavigationButton.SHORTS, Settings.HIDE_SHORTS_BUTTON.get()); - put(NavigationButton.SUBSCRIPTIONS, Settings.HIDE_SUBSCRIPTIONS_BUTTON.get()); - } - }; - - private static final boolean SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON - = Settings.SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON.get(); - - private static final boolean DISABLE_TRANSLUCENT_STATUS_BAR - = Settings.DISABLE_TRANSLUCENT_STATUS_BAR.get(); - - private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT - = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT.get(); - - private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK - = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); - - /** - * Injection point. - */ - public static boolean switchCreateWithNotificationButton() { - return SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON; - } - - /** - * Injection point. - */ - public static void navigationTabCreated(NavigationButton button, View tabView) { - if (Boolean.TRUE.equals(shouldHideMap.get(button))) { - tabView.setVisibility(View.GONE); - } - } - - /** - * Injection point. - */ - public static void hideNavigationButtonLabels(TextView navigationLabelsView) { - hideViewUnderCondition(Settings.HIDE_NAVIGATION_BUTTON_LABELS, navigationLabelsView); - } - - /** - * Injection point. - */ - public static boolean useAnimatedNavigationButtons(boolean original) { - return Settings.NAVIGATION_BAR_ANIMATIONS.get(); - } - - /** - * Injection point. - */ - public static boolean useTranslucentNavigationStatusBar(boolean original) { - // Must check Android version, as forcing this on Android 11 or lower causes app hang and crash. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - return original; - } - - if (DISABLE_TRANSLUCENT_STATUS_BAR) { - return false; - } - - return original; - } - - /** - * Injection point. - */ - public static boolean useTranslucentNavigationButtons(boolean original) { - // Feature requires Android 13+ - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { - return original; - } - - if (!DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { - return original; - } - - if (DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK && DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT) { - return false; - } - - return Utils.isDarkModeEnabled() - ? !DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK - : !DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT; - } -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java index 02fc01c9fa..937d35260b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java @@ -31,6 +31,13 @@ public class OpenShortsInRegularPlayerPatch { mainActivityRef = new WeakReference<>(activity); } + /** + * Injection point. + */ + public static boolean overrideBackPressToExit() { + return overrideBackPressToExit(true); + } + /** * Injection point. */ @@ -46,7 +53,7 @@ public class OpenShortsInRegularPlayerPatch { /** * Injection point. */ - public static boolean openShort(String videoID) { + public static boolean openShort(String videoId) { try { ShortsPlayerType type = Settings.SHORTS_PLAYER_TYPE.get(); if (type == ShortsPlayerType.SHORTS_PLAYER) { @@ -54,7 +61,7 @@ public class OpenShortsInRegularPlayerPatch { return false; // Default unpatched behavior. } - if (videoID.isEmpty()) { + if (videoId.isEmpty()) { // Shorts was opened using launcher app shortcut. // // This check will not detect if the Shorts app shortcut is used @@ -84,12 +91,12 @@ public class OpenShortsInRegularPlayerPatch { // Can use the application context and add intent flags of // FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TOP // But the activity context seems to fix random app crashes - // if Shorts urls are opened outside the app. + // if Shorts URLs are opened outside the app. var context = mainActivityRef.get(); Intent videoPlayerIntent = new Intent( Intent.ACTION_VIEW, - Uri.parse("https://youtube.com/watch?v=" + videoID) + Uri.parse("https://youtube.com/watch?v=" + videoId) ); videoPlayerIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); videoPlayerIntent.setPackage(context.getPackageName()); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java index 6f2ea968d2..8b3437316f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java @@ -1,6 +1,12 @@ package app.revanced.extension.youtube.patches; import android.app.AlertDialog; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; @@ -8,22 +14,89 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class RemoveViewerDiscretionDialogPatch { + private static final String[] VIEWER_DISCRETION_DIALOG_PLAYABILITY_STATUS = { + "AGE_CHECK_REQUIRED", + "AGE_VERIFICATION_REQUIRED", + "CONTENT_CHECK_REQUIRED", + "LOGIN_REQUIRED" + }; + @NonNull + private static volatile String playabilityStatus = ""; /** * Injection point. */ public static void confirmDialog(AlertDialog dialog) { - if (Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) { - Logger.printDebug(() -> "Clicking alert dialog dismiss button"); - - final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); - button.setSoundEffectsEnabled(false); - button.performClick(); - return; + // The dialog may already be shown due to the AlertDialog#create() method. + // Call the AlertDialog#show() method only when the dialog is not shown. + if (!dialog.isShowing()) { + // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. + dialog.show(); } - // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. - Logger.printDebug(() -> "Showing alert dialog"); - dialog.show(); + if (shouldConfirmDialog()) { + Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + if (button != null) { + Window window = dialog.getWindow(); + if (window != null) { + // Resize the dialog to 0 before clicking the button. + // If the dialog is not resized to 0, it will remain visible for about a second before closing. + WindowManager.LayoutParams params = window.getAttributes(); + params.height = 0; + params.width = 0; + + // Change the size of AlertDialog to 0. + window.setAttributes(params); + + // Disable AlertDialog's background dim. + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + } + Logger.printDebug(() -> "Clicking alert dialog dismiss button"); + button.callOnClick(); + } + } + } + + /** + * Injection point. + */ + public static AlertDialog confirmDialog(AlertDialog.Builder builder) { + AlertDialog dialog = builder.create(); + confirmDialog(dialog); + return dialog; + } + + /** + * Injection point. + * Modern-style dialog is controlled by an obfuscated class and require additional hooking to get the buttons. + * Disabling the modern-style dialog is the simplest workaround. + * Since the purpose of the patch is to close the dialog immediately, this isn't a problem. + * + * @return Whether to use modern-style dialog. + * If false, AlertDialog is used. + */ + public static boolean disableModernDialog(boolean original) { + return !shouldConfirmDialog() && original; + } + + /** + * Injection point. + * + * @param status Enum value of 'playabilityStatus.status' in '/player' endpoint responses. + */ + public static void setPlayabilityStatus(@Nullable Enum status) { + playabilityStatus = status == null ? "" : status.name(); + } + + /** + * The viewer discretion dialog shows when the playability status is + * [AGE_CHECK_REQUIRED], [AGE_VERIFICATION_REQUIRED], [CONTENT_CHECK_REQUIRED], or [LOGIN_REQUIRED]. + * Verify the playability status to prevent unintended dialog closures. + * + * @return Whether to close the dialog. + */ + private static boolean shouldConfirmDialog() { + return Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get() + && Utils.containsAny(playabilityStatus, VIEWER_DISCRETION_DIALOG_PLAYABILITY_STATUS); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index bb0c7dec9b..beaa3eac82 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -49,21 +49,21 @@ public class ReturnYouTubeDislikePatch { /** * The last litho based Shorts loaded. - * May be the same value as {@link #currentVideoData}, but usually is the next short to swipe to. + * Maybe the same value as {@link #currentVideoData}, but usually is the next short to swipe to. */ @Nullable private static volatile ReturnYouTubeDislike lastLithoShortsVideoData; /** * Because litho Shorts spans are created offscreen after {@link ReturnYouTubeDislikeFilter} - * detects the video ids, but the current Short can arbitrarily reload the same span, + * detects the video IDs, but the current Short can arbitrarily reload the same span, * then use the {@link #lastLithoShortsVideoData} if this value is greater than zero. */ @GuardedBy("ReturnYouTubeDislikePatch.class") private static int useLithoShortsVideoDataCount; /** - * Last video id prefetched. Field is to prevent prefetching the same video id multiple times in a row. + * Last video ID prefetched. Field is to prevent prefetching the same video ID multiple times in a row. */ @Nullable private static volatile String lastPrefetchedVideoId; @@ -98,6 +98,19 @@ public class ReturnYouTubeDislikePatch { // Litho player for both regular videos and Shorts. // + /** + * Injection point. + * + * Logs if new litho text layout is used. + */ + public static boolean useNewLithoTextCreation(boolean useNewLithoTextCreation) { + // Don't force flag on/off unless debugging patch hooks, + // because forcing off with newer YT targets causes Shorts player to show no buttons, + // presumably because the old litho data isn't in the layout data. + Logger.printDebug(() -> "useNewLithoTextCreation: " + useNewLithoTextCreation); + return useNewLithoTextCreation; + } + /** * Injection point. * @@ -113,7 +126,7 @@ public class ReturnYouTubeDislikePatch { * Called when a litho text component is initially created, * and also when a Span is later reused again (such as scrolling off/on screen). * - * This method is sometimes called on the main thread, but it usually is called _off_ the main thread. + * This method is sometimes called on the main thread, but it is usually called _off_ the main thread. * This method can be called multiple times for the same UI element (including after dislikes was added). * * @param original Original char sequence was created or reused by Litho. @@ -185,14 +198,14 @@ public class ReturnYouTubeDislikePatch { final ReturnYouTubeDislike videoData; if (decrementUseLithoDataIfNeeded()) { - // New Short is loading off screen. + // New Short is loading off-screen. videoData = lastLithoShortsVideoData; } else { videoData = currentVideoData; } if (videoData == null) { - // The Shorts litho video id filter did not detect the video id. + // The Shorts litho video ID filter did not detect the video ID. // This is normal in incognito mode, but otherwise is abnormal. Logger.printDebug(() -> "Cannot modify Shorts litho span, data is null"); return original; @@ -292,7 +305,7 @@ public class ReturnYouTubeDislikePatch { /** * Remove Rolling Number text view modifications made by this patch. - * Required as it appears text views can be reused for other rolling numbers (view count, upload time, etc). + * Required as it appears text views can be reused for other rolling numbers (view count, upload time, etc.). */ private static void removeRollingNumberPatchChanges(TextView view) { if (view.getCompoundDrawablePadding() != 0) { @@ -314,7 +327,7 @@ public class ReturnYouTubeDislikePatch { return original; } // Called for all instances of RollingNumber, so must check if text is for a dislikes. - // Text will already have the correct content but it's missing the drawable separators. + // Text will already have the correct content, but it's missing the drawable separators. if (!ReturnYouTubeDislike.isPreviouslyCreatedSegmentedSpan(original.toString())) { // The text is the video view count, upload time, or some other text. removeRollingNumberPatchChanges(view); @@ -351,13 +364,13 @@ public class ReturnYouTubeDislikePatch { } // - // Video Id and voting hooks (all players). + // Video ID and voting hooks (all players). // private static volatile boolean lastPlayerResponseWasShort; /** - * Injection point. Uses 'playback response' video id hook to preload RYD. + * Injection point. Uses 'playback response' video ID hook to preload RYD. */ public static void preloadVideoId(@NonNull String videoId, boolean isShortAndOpeningOrPlaying) { try { @@ -387,7 +400,7 @@ public class ReturnYouTubeDislikePatch { if (waitForFetchToComplete && !fetch.fetchCompleted()) { // This call is off the main thread, so wait until the RYD fetch completely finishes, // otherwise if this returns before the fetch completes then the UI can - // become frozen when the main thread tries to modify the litho Shorts dislikes and + // become frozen when the main thread tries to modify the litho Shorts dislikes, and // it must wait for the fetch. // Only need to do this for the first Short opened, as the next Short to swipe to // are preloaded in the background. @@ -406,7 +419,7 @@ public class ReturnYouTubeDislikePatch { } /** - * Injection point. Uses 'current playing' video id hook. Always called on main thread. + * Injection point. Uses 'current playing' video ID hook. Always called on main thread. */ public static void newVideoLoaded(@NonNull String videoId) { try { @@ -424,7 +437,7 @@ public class ReturnYouTubeDislikePatch { if (videoIdIsSame(currentVideoData, videoId)) { return; } - Logger.printDebug(() -> "New video id: " + videoId + " playerType: " + currentPlayerType); + Logger.printDebug(() -> "New video ID: " + videoId + " playerType: " + currentPlayerType); if (!Utils.isNetworkConnected()) { Logger.printDebug(() -> "Cannot fetch RYD, network is not connected"); @@ -450,16 +463,16 @@ public class ReturnYouTubeDislikePatch { } if (videoId == null) { - // Litho filter did not detect the video id. App is in incognito mode, - // or the proto buffer structure was changed and the video id is no longer present. + // Litho filter did not detect the video ID. App is in incognito mode, + // or the proto buffer structure was changed and the video ID is no longer present. // Must clear both currently playing and last litho data otherwise the // next regular video may use the wrong data. - Logger.printDebug(() -> "Litho filter did not find any video ids"); + Logger.printDebug(() -> "Litho filter did not find any video IDs"); clearData(); return; } - Logger.printDebug(() -> "New litho Shorts video id: " + videoId); + Logger.printDebug(() -> "New litho Shorts video ID: " + videoId); ReturnYouTubeDislike videoData = ReturnYouTubeDislike.getFetchForVideoId(videoId); videoData.setVideoIdIsShort(true); lastLithoShortsVideoData = videoData; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarThumbnailsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarThumbnailsPatch.java deleted file mode 100644 index 30722c0878..0000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarThumbnailsPatch.java +++ /dev/null @@ -1,39 +0,0 @@ -package app.revanced.extension.youtube.patches; - -import app.revanced.extension.shared.settings.Setting; -import app.revanced.extension.youtube.settings.Settings; - -import java.util.List; - -@SuppressWarnings("unused") -public class SeekbarThumbnailsPatch { - - public static final class SeekbarThumbnailsHighQualityAvailability implements Setting.Availability { - @Override - public boolean isAvailable() { - return VersionCheckPatch.IS_19_17_OR_GREATER || !Settings.RESTORE_OLD_SEEKBAR_THUMBNAILS.get(); - } - - @Override - public List> getParentSettings() { - return List.of(Settings.RESTORE_OLD_SEEKBAR_THUMBNAILS); - } - } - - private static final boolean SEEKBAR_THUMBNAILS_HIGH_QUALITY_ENABLED - = Settings.SEEKBAR_THUMBNAILS_HIGH_QUALITY.get(); - - /** - * Injection point. - */ - public static boolean useHighQualityFullscreenThumbnails() { - return SEEKBAR_THUMBNAILS_HIGH_QUALITY_ENABLED; - } - - /** - * Injection point. - */ - public static boolean useFullscreenSeekbarThumbnails() { - return !Settings.RESTORE_OLD_SEEKBAR_THUMBNAILS.get(); - } -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java index e7de421368..905ca6dfa0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java @@ -109,7 +109,7 @@ public class ShortsAutoplayPatch { } if (original == null) { - // Cannot return null, as null is used to indicate Short was auto played. + // Cannot return null, as null is used to indicate the Short was autoplayed. // Unpatched app replaces null with unknown enum type (appears to fix for bad api data). Enum unknown = ShortsLoopBehavior.UNKNOWN.ytEnumValue; Logger.printDebug(() -> "Original is null, returning: " + unknown.name()); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarTappingPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/TapToSeekPatch.java similarity index 50% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarTappingPatch.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/TapToSeekPatch.java index dbbb363e1f..4fbc8fdf2c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarTappingPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/TapToSeekPatch.java @@ -3,8 +3,8 @@ package app.revanced.extension.youtube.patches; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") -public final class SeekbarTappingPatch { - public static boolean seekbarTappingEnabled() { - return Settings.SEEKBAR_TAPPING.get(); +public final class TapToSeekPatch { + public static boolean tapToSeekEnabled() { + return Settings.TAP_TO_SEEK.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ToolbarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ToolbarPatch.java new file mode 100644 index 0000000000..c33e54e5b2 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ToolbarPatch.java @@ -0,0 +1,33 @@ +package app.revanced.extension.youtube.patches; + +import android.view.View; +import android.widget.ImageView; + +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public class ToolbarPatch { + + /** + * Injection point. + */ + public static void hookToolbar(Enum buttonEnum, ImageView imageView) { + final String enumString = buttonEnum.name(); + if (enumString.isEmpty() || + imageView == null || + !(imageView.getParent() instanceof View view)) { + return; + } + + Logger.printDebug(() -> "enumString: " + enumString); + + hookToolbar(enumString, view); + } + + /** + * Injection point. + */ + private static void hookToolbar(String enumString, View parentView) { + // Code added by patch. + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoAdsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoAdsPatch.java index ce07d8d16d..22447193c9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoAdsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoAdsPatch.java @@ -14,4 +14,13 @@ public class VideoAdsPatch { return SHOW_VIDEO_ADS; } + /** + * Injection point. + */ + public static String hideShortsAds(String osName) { + return SHOW_VIDEO_ADS + ? osName + : "Android Automotive"; + } + } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java index 9c9b060a7b..934876578b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java @@ -3,15 +3,13 @@ package app.revanced.extension.youtube.patches; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.libraries.youtube.innertube.model.media.VideoQuality; - import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.Objects; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; -import app.revanced.extension.youtube.Event; +import app.revanced.extension.youtube.shared.Event; import app.revanced.extension.youtube.shared.ShortsPlayerState; import app.revanced.extension.youtube.shared.VideoState; @@ -32,11 +30,20 @@ public final class VideoInformation { */ public interface VideoQualityMenuInterface { // Method is added during patching. - void patch_setQuality(VideoQuality quality); + void patch_setQuality(VideoQualityInterface quality); } /** - * Video resolution of the automatic quality option.. + * Interface to use obfuscated methods. + */ + public interface VideoQualityInterface { + // Methods are added during patching. + String patch_getQualityName(); + int patch_getResolution(); + } + + /** + * Video resolution of the automatic quality option. */ public static final int AUTOMATIC_VIDEO_QUALITY_VALUE = -2; @@ -44,7 +51,7 @@ public final class VideoInformation { * Video quality names are the same text for all languages. * Premium can be "1080p Premium" or "1080p60 Premium" */ - public static final String VIDEO_QUALITY_PREMIUM_NAME = "Premium"; + private static final String VIDEO_QUALITY_PREMIUM_NAME = "Premium"; private static final float DEFAULT_YOUTUBE_PLAYBACK_SPEED = 1.0f; /** @@ -76,14 +83,14 @@ public final class VideoInformation { * The available qualities of the current video. */ @Nullable - private static VideoQuality[] currentQualities; + private static VideoQualityInterface[] currentQualities; /** * The current quality of the video playing. * This is always the actual quality even if Automatic quality is active. */ @Nullable - private static VideoQuality currentQuality; + private static VideoQualityInterface currentQuality; /** * The current VideoQualityMenuInterface, set during setVideoQuality. @@ -94,15 +101,15 @@ public final class VideoInformation { /** * Callback for when the current quality changes. */ - public static final Event onQualityChange = new Event<>(); + public static final Event onQualityChange = new Event<>(); @Nullable - public static VideoQuality[] getCurrentQualities() { + public static VideoQualityInterface[] getCurrentQualities() { return currentQualities; } @Nullable - public static VideoQuality getCurrentQuality() { + public static VideoQualityInterface getCurrentQuality() { return currentQuality; } @@ -133,7 +140,7 @@ public final class VideoInformation { * * @param mdxPlayerDirector MDX player director object (casting mode). */ - public static void initializeMdx(@NonNull PlaybackController mdxPlayerDirector) { + public static void initializeMDX(@NonNull PlaybackController mdxPlayerDirector) { try { mdxPlayerDirectorRef = new WeakReference<>(Objects.requireNonNull(mdxPlayerDirector)); } catch (Exception ex) { @@ -144,11 +151,11 @@ public final class VideoInformation { /** * Injection point. * - * @param newlyLoadedVideoId id of the current video + * @param newlyLoadedVideoId ID of the current video */ public static void setVideoId(@NonNull String newlyLoadedVideoId) { if (!videoId.equals(newlyLoadedVideoId)) { - Logger.printDebug(() -> "New video id: " + newlyLoadedVideoId); + Logger.printDebug(() -> "New video ID: " + newlyLoadedVideoId); videoId = newlyLoadedVideoId; } } @@ -178,11 +185,11 @@ public final class VideoInformation { /** * Injection point. Called off the main thread. * - * @param videoId The id of the last video loaded. + * @param videoId The ID of the last video loaded. */ public static void setPlayerResponseVideoId(@NonNull String videoId, boolean isShortAndOpeningOrPlaying) { if (!playerResponseVideoId.equals(videoId)) { - Logger.printDebug(() -> "New player response video id: " + videoId); + Logger.printDebug(() -> "New player response video ID: " + videoId); playerResponseVideoId = videoId; } } @@ -273,7 +280,7 @@ public final class VideoInformation { // The difference has to be a different second mark in order to avoid infinite skip loops // as the Lounge API only supports whole seconds. if (adjustedSeekTime / 1000 == videoTime / 1000) { - Logger.printDebug(() -> "Skipping seekTo for MDX because seek time is too small " + Logger.printDebug(() -> "Skipping seekTo for MDX because seek time is too small" + "(" + (adjustedSeekTime - videoTime) + "ms)"); return false; } @@ -301,7 +308,7 @@ public final class VideoInformation { Logger.printDebug(() -> "Seeking relative to: " + seekTime); // 19.39+ does not have a boolean return type for relative seek. - // But can call both methods and it works correctly for both situations. + // But can call both methods, and it works correctly for both situations. PlaybackController controller = playerControllerRef.get(); if (controller == null) { Logger.printDebug(() -> "Cannot seek relative as player controller is null"); @@ -310,7 +317,7 @@ public final class VideoInformation { } // Adjust the fine adjustment function so it's at least 1 second before/after. - // Otherwise the fine adjustment will do nothing when casting. + // Otherwise, the fine adjustment will do nothing when casting. final long adjustedSeekTime; if (seekTime < 0) { adjustedSeekTime = Math.min(seekTime, -1000); @@ -330,9 +337,9 @@ public final class VideoInformation { } /** - * Id of the last video opened. Includes Shorts. + * ID of the last video opened. Includes Shorts. * - * @return The id of the video, or an empty string if no videos have been opened yet. + * @return The ID of the video, or an empty string if no videos have been opened yet. */ @NonNull public static String getVideoId() { @@ -340,7 +347,7 @@ public final class VideoInformation { } /** - * Differs from {@link #videoId} as this is the video id for the + * Differs from {@link #videoId} as this is the video ID for the * last player response received, which may not be the last video opened. *

* If Shorts are loading the background, this commonly will be @@ -348,7 +355,7 @@ public final class VideoInformation { *

* For most use cases, you should instead use {@link #getVideoId()}. * - * @return The id of the last video loaded, or an empty string if no videos have been loaded yet. + * @return The ID of the last video loaded, or an empty string if no videos have been loaded yet. */ @NonNull public static String getPlayerResponseVideoId() { @@ -356,8 +363,8 @@ public final class VideoInformation { } /** - * @return If the last player response video id was a Short. - * Includes Shorts shelf items appearing in the feed that are not opened. + * @return If the last player response video ID was a Short. + * Include Shorts shelf items appearing in the feed that are not opened. * @see #lastVideoIdIsShort() */ public static boolean lastPlayerResponseIsShort() { @@ -365,7 +372,7 @@ public final class VideoInformation { } /** - * @return If the last player response video id _that was opened_ was a Short. + * @return If the last player response video ID _that was opened_ was a Short. */ public static boolean lastVideoIdIsShort() { return videoIdIsShort; @@ -450,7 +457,7 @@ public final class VideoInformation { qualityNeedsUpdating = true; } - private static void setCurrentQuality(@Nullable VideoQuality quality) { + private static void setCurrentQuality(@Nullable VideoQualityInterface quality) { Utils.verifyOnMainThread(); if (currentQuality != quality) { Logger.printDebug(() -> "Current quality changed to: " + quality); @@ -462,7 +469,7 @@ public final class VideoInformation { /** * Forcefully changes the video quality of the currently playing video. */ - public static void changeQuality(VideoQuality quality) { + public static void changeQuality(VideoQualityInterface quality) { Utils.verifyOnMainThread(); if (currentMenuInterface == null) { @@ -501,7 +508,7 @@ public final class VideoInformation { * @param qualities Video qualities available, ordered from largest to smallest, with index 0 being the 'automatic' value of -2 * @param originalQualityIndex quality index to use, as chosen by YouTube */ - public static int setVideoQuality(VideoQuality[] qualities, VideoQualityMenuInterface menu, int originalQualityIndex) { + public static int setVideoQuality(VideoQualityInterface[] qualities, VideoQualityMenuInterface menu, int originalQualityIndex) { try { Utils.verifyOnMainThread(); currentMenuInterface = menu; @@ -516,7 +523,7 @@ public final class VideoInformation { // On extremely slow internet connections the index can initially be -1 originalQualityIndex = Math.max(0, originalQualityIndex); - VideoQuality updatedCurrentQuality = qualities[originalQualityIndex]; + VideoQualityInterface updatedCurrentQuality = qualities[originalQualityIndex]; if (updatedCurrentQuality.patch_getResolution() != AUTOMATIC_VIDEO_QUALITY_VALUE && (currentQuality == null || currentQuality != updatedCurrentQuality)) { setCurrentQuality(updatedCurrentQuality); @@ -538,7 +545,7 @@ public final class VideoInformation { // Find the highest quality that is equal to or less than the preferred. int i = 0; final int lastQualityIndex = qualities.length - 1; - for (VideoQuality quality : qualities) { + for (VideoQualityInterface quality : qualities) { final int qualityResolution = quality.patch_getResolution(); if ((qualityResolution != AUTOMATIC_VIDEO_QUALITY_VALUE && qualityResolution <= preferredQuality) // Use the lowest video quality if the default is lower than all available. @@ -572,4 +579,9 @@ public final class VideoInformation { } return originalQualityIndex; } + + public static boolean isPremiumVideoQuality(@NonNull VideoQualityInterface quality) { + String qualityName = quality.patch_getQualityName(); + return qualityName != null && qualityName.contains(VIDEO_QUALITY_PREMIUM_NAME); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java deleted file mode 100644 index 094ce457e7..0000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/WideSearchbarPatch.java +++ /dev/null @@ -1,46 +0,0 @@ -package app.revanced.extension.youtube.patches; - -import android.view.View; - -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.Utils; -import app.revanced.extension.shared.ui.Dim; -import app.revanced.extension.youtube.settings.Settings; - -@SuppressWarnings("unused") -public final class WideSearchbarPatch { - - private static final Boolean WIDE_SEARCHBAR_ENABLED = Settings.WIDE_SEARCHBAR.get(); - - /** - * Injection point. - */ - public static boolean enableWideSearchbar(boolean original) { - return WIDE_SEARCHBAR_ENABLED || original; - } - - /** - * Injection point. - */ - public static void setActionBar(View view) { - try { - if (!WIDE_SEARCHBAR_ENABLED) return; - - View searchBarView = Utils.getChildViewByResourceName(view, "search_bar"); - - final int paddingLeft = searchBarView.getPaddingLeft(); - final int paddingRight = searchBarView.getPaddingRight(); - final int paddingTop = searchBarView.getPaddingTop(); - final int paddingBottom = searchBarView.getPaddingBottom(); - final int paddingStart = Dim.dp8; - - if (Utils.isRightToLeftLocale()) { - searchBarView.setPadding(paddingLeft, paddingTop, paddingStart, paddingBottom); - } else { - searchBarView.setPadding(paddingStart, paddingTop, paddingRight, paddingBottom); - } - } catch (Exception ex) { - Logger.printException(() -> "setActionBar failure", ex); - } - } -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java index b19aa7a901..1212416069 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java @@ -36,7 +36,7 @@ public final class AnnouncementsPatch { HttpURLConnection connection = AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(GET_LATEST_ANNOUNCEMENT_IDS); - Logger.printDebug(() -> "Get latest announcement IDs route connection url: " + connection.getURL()); + Logger.printDebug(() -> "Get latest announcement IDs route connection URL: " + connection.getURL()); try { // Do not show the announcement if the request failed. @@ -59,10 +59,10 @@ public final class AnnouncementsPatch { // Parse the ID. Fall-back to raw string if it fails. int id = Settings.ANNOUNCEMENT_LAST_ID.defaultValue; try { - final var announcementIds = new JSONArray(jsonString); - if (announcementIds.length() == 0) return true; + final var announcementIDs = new JSONArray(jsonString); + if (announcementIDs.length() == 0) return true; - id = announcementIds.getJSONObject(0).getInt("id"); + id = announcementIDs.getJSONObject(0).getInt("id"); } catch (Throwable ex) { Logger.printException(() -> "Failed to parse announcement ID", ex); } @@ -84,7 +84,7 @@ public final class AnnouncementsPatch { HttpURLConnection connection = AnnouncementsRoutes .getAnnouncementsConnectionFromRoute(GET_LATEST_ANNOUNCEMENTS); - Logger.printDebug(() -> "Get latest announcements route connection url: " + connection.getURL()); + Logger.printDebug(() -> "Get latest announcements route connection URL: " + connection.getURL()); var jsonString = Requester.parseStringAndDisconnect(connection); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java index 064a7f7e9b..cb262e0165 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdsFilter.java @@ -2,9 +2,13 @@ package app.revanced.extension.youtube.patches.litho; import static app.revanced.extension.shared.StringRef.str; -import android.app.Instrumentation; +import android.app.Dialog; import android.view.KeyEvent; import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.Nullable; import java.util.List; @@ -19,12 +23,18 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public final class AdsFilter extends Filter { // region Fullscreen ad - private static volatile long lastTimeClosedFullscreenAd; - private static final Instrumentation instrumentation = new Instrumentation(); - private final StringFilterGroup fullscreenAd; + private static final ByteArrayFilterGroup fullscreenAd = new ByteArrayFilterGroup( + null, + "_interstitial" + ); // endregion + private static final String[] PLAYER_POPUP_AD_PANEL_IDS = { + "PAproduct", // Shopping. + "jumpahead" // Premium promotion. + }; + // https://encrypted-tbn0.gstatic.com/shopping?q=abc private static final String STORE_BANNER_DOMAIN = "gstatic.com/shopping"; private static final boolean HIDE_END_SCREEN_STORE_BANNER = @@ -32,9 +42,10 @@ public final class AdsFilter extends Filter { private final StringTrieSearch exceptions = new StringTrieSearch(); - private final StringFilterGroup playerShoppingShelf; - private final ByteArrayFilterGroup playerShoppingShelfBuffer; - + private final StringFilterGroup promotionBanner; + private final ByteArrayFilterGroup promotionBannerBuffer; + private final StringFilterGroup buyMovieAd; + private final ByteArrayFilterGroup buyMovieAdBuffer; public AdsFilter() { exceptions.addPatterns( @@ -47,7 +58,6 @@ public final class AdsFilter extends Filter { // Identifiers. - final var carouselAd = new StringFilterGroup( Settings.HIDE_GENERAL_ADS, "carousel_ad" @@ -56,11 +66,6 @@ public final class AdsFilter extends Filter { // Paths. - fullscreenAd = new StringFilterGroup( - Settings.HIDE_FULLSCREEN_ADS, - "_interstitial" - ); - final var generalAds = new StringFilterGroup( Settings.HIDE_GENERAL_ADS, "_ad_with", @@ -79,11 +84,11 @@ public final class AdsFilter extends Filter { "hero_promo_image", // text_image_button_group_layout, landscape_image_button_group_layout, full_width_square_image_button_group_layout "image_button_group_layout", + "landscape_image_carousel_layout", "landscape_image_wide_button_layout", "primetime_promo", "product_details", "square_image_layout", - "statement_banner", "text_image_button_layout", "text_image_no_button_layout", // Tablet layout search results. "video_display_button_group_layout", @@ -91,7 +96,8 @@ public final class AdsFilter extends Filter { "video_display_carousel_buttoned_short_dr_layout", "video_display_full_buttoned_short_dr_layout", "video_display_full_layout", - "watch_metadata_app_promo" + "watch_metadata_app_promo", + "shopping_timely_shelf." // Injection point below hides the empty space. ); final var movieAds = new StringFilterGroup( @@ -104,6 +110,16 @@ public final class AdsFilter extends Filter { "offer_module_root" ); + buyMovieAd = new StringFilterGroup( + Settings.HIDE_MOVIES_SECTION, + "video_lockup_with_attachment.e" + ); + + buyMovieAdBuffer = new ByteArrayFilterGroup( + null, + "FEstorefront" + ); + final var viewProducts = new StringFilterGroup( Settings.HIDE_VIEW_PRODUCTS_BANNER, "product_item", @@ -116,64 +132,126 @@ public final class AdsFilter extends Filter { "shopping_description_shelf.e" ); - playerShoppingShelf = new StringFilterGroup( - Settings.HIDE_CREATOR_STORE_SHELF, - "horizontal_shelf.e" - ); - - playerShoppingShelfBuffer = new ByteArrayFilterGroup( - null, - "shopping_item_card_list" - ); - - final var webLinkPanel = new StringFilterGroup( - Settings.HIDE_WEB_SEARCH_RESULTS, - "web_link_panel" - ); - final var merchandise = new StringFilterGroup( Settings.HIDE_MERCHANDISE_BANNERS, "product_carousel", "shopping_carousel.e" // Channel profile shopping shelf. ); + promotionBanner = new StringFilterGroup( + Settings.HIDE_YOUTUBE_PREMIUM_PROMOTIONS, + "statement_banner" + ); + + promotionBannerBuffer = new ByteArrayFilterGroup( + null, + "img/promos/growth/", // Link, https://www.gstatic.com/youtube/img/promos/growth/ is only used for ads. + "SPunlimited" // Word associated with Premium, should be unique to differentiate Doodle from ad banner. + ); + final var selfSponsor = new StringFilterGroup( Settings.HIDE_SELF_SPONSOR, "cta_shelf_card" ); addPathCallbacks( - fullscreenAd, + buyMovieAd, generalAds, merchandise, movieAds, - playerShoppingShelf, + promotionBanner, selfSponsor, shoppingLinks, - viewProducts, - webLinkPanel + viewProducts ); } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - if (matchedGroup == playerShoppingShelf) { - return contentIndex == 0 && playerShoppingShelfBuffer.check(buffer).isFiltered(); + if (matchedGroup == buyMovieAd) { + return contentIndex == 0 && buyMovieAdBuffer.check(buffer).isFiltered(); } - if (exceptions.matches(path)) { - return false; + if (matchedGroup == promotionBanner) { + return contentIndex == 0 && promotionBannerBuffer.check(buffer).isFiltered(); } - if (matchedGroup == fullscreenAd) { - if (path.contains("|ImageType|")) closeFullscreenAd(); + return !exceptions.matches(path); + } - // Do not actually filter the fullscreen ad otherwise it will leave a dimmed screen. - return false; + /** + * Injection point. + * Called from a different place then the other filters. + */ + public static void closeFullscreenAd(Object customDialog, @Nullable byte[] buffer) { + try { + if (!Settings.HIDE_FULLSCREEN_ADS.get()) { + return; + } + + if (buffer == null) { + Logger.printDebug(() -> "buffer is null"); + return; + } + + if (fullscreenAd.check(buffer).isFiltered() && + customDialog instanceof Dialog dialog) { + Logger.printDebug(() -> "Closing fullscreen ad"); + + Window window = dialog.getWindow(); + + if (window != null) { + // Set the dialog size to 0 before closing + // If the dialog is not resized to 0, it will remain visible for about a second before closing + WindowManager.LayoutParams params = window.getAttributes(); + params.height = 0; + params.width = 0; + + // Change the size of dialog to 0 + window.setAttributes(params); + + // Disable dialog's background dim + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + + // Restore window flags + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED); + + // Restore decorView visibility + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + // Dismiss dialog + dialog.dismiss(); + } + } catch (Exception ex) { + Logger.printException(() -> "closeFullscreenAd failure", ex); } + } - return true; + /** + * Injection point. + */ + public static boolean hideAds() { + return Settings.HIDE_GENERAL_ADS.get(); + } + + /** + * Injection point. + */ + public static String hideAds(String osName) { + return Settings.HIDE_GENERAL_ADS.get() + ? "Android Automotive" + : osName; + } + + /** + * Hide the view, which shows ads in the homepage. + * + * @param view The view, which shows ads. + */ + public static void hideAdAttributionView(View view) { + Utils.hideViewBy0dpUnderCondition(Settings.HIDE_GENERAL_ADS, view); } /** @@ -191,50 +269,18 @@ public final class AdsFilter extends Filter { elementsList.add(protobufList); } - /** - * Hide the view, which shows ads in the homepage. - * - * @param view The view, which shows ads. + * Injection point. */ - public static void hideAdAttributionView(View view) { - Utils.hideViewBy0dpUnderCondition(Settings.HIDE_GENERAL_ADS, view); + public static boolean hideGetPremiumView() { + return Settings.HIDE_YOUTUBE_PREMIUM_PROMOTIONS.get(); } /** - * Close the fullscreen ad. - *

- * The strategy is to send a back button event to the app to close the fullscreen ad using the back button event. + * Injection point. */ - private static void closeFullscreenAd() { - final var currentTime = System.currentTimeMillis(); - - // Prevent spamming the back button. - if (currentTime - lastTimeClosedFullscreenAd < 10000) return; - lastTimeClosedFullscreenAd = currentTime; - - Logger.printDebug(() -> "Closing fullscreen ad"); - - Utils.runOnMainThreadDelayed(() -> { - // Must run off main thread (Odd, but whatever). - Utils.runOnBackgroundThread(() -> { - try { - instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); - } catch (Exception ex) { - // Injecting user events on Android 10+ requires the manifest to include - // INJECT_EVENTS, and it's usage is heavily restricted - // and requires the user to manually approve the permission in the device settings. - // - // And no matter what, permissions cannot be added for root installations - // as manifest changes are ignored for mount installations. - // - // Instead, catch the SecurityException and turn off hide full screen ads - // since this functionality does not work for these devices. - Logger.printInfo(() -> "Could not inject back button event", ex); - Settings.HIDE_FULLSCREEN_ADS.save(false); - Utils.showToastLong(str("revanced_hide_fullscreen_ads_feature_not_available_toast")); - } - }); - }, 1000); + public static boolean hidePlayerPopupAds(String panelId) { + return Settings.HIDE_PLAYER_POPUP_ADS.get() + && Utils.containsAny(panelId, PLAYER_POPUP_AD_PANEL_IDS); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java index b47f0939d1..a969c9b0e0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/AdvancedVideoQualityMenuFilter.java @@ -21,7 +21,7 @@ public final class AdvancedVideoQualityMenuFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { isVideoQualityMenuVisible = true; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java deleted file mode 100644 index 557847a00d..0000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ButtonsFilter.java +++ /dev/null @@ -1,154 +0,0 @@ -package app.revanced.extension.youtube.patches.litho; - -import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.youtube.patches.VersionCheckPatch; -import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; -import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; -import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; -import app.revanced.extension.youtube.settings.Settings; - -@SuppressWarnings("unused") -public final class ButtonsFilter extends Filter { - private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.e"; - private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.e"; - private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.e"; - /** - * Video bar path when the video information is collapsed. Seems to shown only with 20.14+ - */ - private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.e"; - private static final String ANIMATED_VECTOR_TYPE_PATH = "AnimatedVectorType"; - - private final StringFilterGroup likeSubscribeGlow; - private final StringFilterGroup actionBarGroup; - private final StringFilterGroup bufferFilterPathGroup; - private final ByteArrayFilterGroupList bufferButtonsGroupList = new ByteArrayFilterGroupList(); - - public ButtonsFilter() { - actionBarGroup = new StringFilterGroup( - null, - VIDEO_ACTION_BAR_PATH - ); - addIdentifierCallbacks(actionBarGroup); - - - likeSubscribeGlow = new StringFilterGroup( - Settings.DISABLE_LIKE_SUBSCRIBE_GLOW, - "animated_button_border.e" - ); - - bufferFilterPathGroup = new StringFilterGroup( - null, - "|ContainerType|button.e" - ); - - addPathCallbacks( - likeSubscribeGlow, - new StringFilterGroup( - Settings.HIDE_LIKE_DISLIKE_BUTTON, - "|segmented_like_dislike_button" - ), - new StringFilterGroup( - Settings.HIDE_DOWNLOAD_BUTTON, - "|download_button.e" - ), - new StringFilterGroup( - Settings.HIDE_SAVE_BUTTON, - "|save_to_playlist_button" - ), - new StringFilterGroup( - Settings.HIDE_CLIP_BUTTON, - "|clip_button.e" - ) - ); - - // FIXME: 20.22+ filtering of the action buttons doesn't work because - // the buffer is the same for all buttons. - if (!VersionCheckPatch.IS_20_22_OR_GREATER) { - addPathCallbacks(bufferFilterPathGroup); - } - - bufferButtonsGroupList.addAll( - new ByteArrayFilterGroup( - Settings.HIDE_REPORT_BUTTON, - "yt_outline_flag" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHARE_BUTTON, - "yt_outline_share" - ), - new ByteArrayFilterGroup( - Settings.HIDE_REMIX_BUTTON, - "yt_outline_youtube_shorts_plus" - ), - new ByteArrayFilterGroup( - Settings.HIDE_THANKS_BUTTON, - "yt_outline_dollar_sign_heart" - ), - new ByteArrayFilterGroup( - Settings.HIDE_ASK_BUTTON, - "yt_fill_spark" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHOP_BUTTON, - "yt_outline_bag" - ), - new ByteArrayFilterGroup( - Settings.HIDE_STOP_ADS_BUTTON, - "yt_outline_slash_circle_left" - ), - new ByteArrayFilterGroup( - Settings.HIDE_COMMENTS_BUTTON, - "yt_outline_message_bubble_right" - ), - // Check for clip button both here and using a path filter, - // as there's a chance the path is a generic action button and won't contain 'clip_button' - new ByteArrayFilterGroup( - Settings.HIDE_CLIP_BUTTON, - "yt_outline_scissors" - ), - new ByteArrayFilterGroup( - Settings.HIDE_HYPE_BUTTON, - "yt_outline_star_shooting" - ), - new ByteArrayFilterGroup( - Settings.HIDE_PROMOTE_BUTTON, - "yt_outline_megaphone" - ) - ); - } - - private boolean isEveryFilterGroupEnabled() { - for (var group : pathCallbacks) { - if (!group.isEnabled()) return false; - } - - for (var group : bufferButtonsGroupList) { - if (!group.isEnabled()) return false; - } - - return true; - } - - @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, - StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - if (matchedGroup == likeSubscribeGlow) { - return (path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX)) - && path.contains(ANIMATED_VECTOR_TYPE_PATH); - } - - // If the current matched group is the action bar group, - // in case every filter group is enabled, hide the action bar. - if (matchedGroup == actionBarGroup) { - return isEveryFilterGroupEnabled(); - } - - if (matchedGroup == bufferFilterPathGroup) { - // Make sure the current path is the right one to avoid false positives. - return (path.startsWith(VIDEO_ACTION_BAR_PATH) || path.startsWith(COMPACTIFY_VIDEO_ACTION_BAR_PATH)) - && bufferButtonsGroupList.check(buffer).isFiltered(); - } - - return true; - } -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java index 793eb5f9b0..70330c843f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/CommentsFilter.java @@ -9,9 +9,11 @@ import app.revanced.extension.youtube.shared.PlayerType; public final class CommentsFilter extends Filter { private static final String COMMENT_COMPOSER_PATH = "comment_composer.e"; + private static final String VIDEO_LOCKUP_WITH_ATTACHMENT_PATH = "video_lockup_with_attachment.e"; private final StringFilterGroup chipBar; private final ByteArrayFilterGroup aiCommentsSummary; + private final StringFilterGroup comments; private final StringFilterGroup emojiAndTimestampButtons; public CommentsFilter() { @@ -41,7 +43,7 @@ public final class CommentsFilter extends Filter { "sponsorships_comments_footer.e" ); - var comments = new StringFilterGroup( + comments = new StringFilterGroup( Settings.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments" @@ -90,7 +92,7 @@ public final class CommentsFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == chipBar) { // Playlist sort button uses same components and must only filter if the player is opened. @@ -98,6 +100,13 @@ public final class CommentsFilter extends Filter { && aiCommentsSummary.check(buffer).isFiltered(); } + if (matchedGroup == comments) { + if (path.startsWith(VIDEO_LOCKUP_WITH_ATTACHMENT_PATH)) { + return Settings.HIDE_COMMENTS_SECTION_IN_HOME_FEED.get(); + } + return Settings.HIDE_COMMENTS_SECTION.get(); + } + if (matchedGroup == emojiAndTimestampButtons) { return path.startsWith(COMMENT_COMPOSER_PATH); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java index 771902ccef..9990aa46a4 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/DescriptionComponentsFilter.java @@ -1,10 +1,10 @@ package app.revanced.extension.youtube.patches.litho; import app.revanced.extension.shared.patches.litho.Filter; -import app.revanced.extension.shared.StringTrieSearch; +import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.shared.patches.litho.FilterGroup.*; import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; -import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.shared.EngagementPanel; import app.revanced.extension.youtube.shared.PlayerType; @SuppressWarnings("unused") @@ -12,26 +12,16 @@ public final class DescriptionComponentsFilter extends Filter { private static final String INFOCARDS_SECTION_PATH = "infocards_section.e"; - private final StringTrieSearch exceptions = new StringTrieSearch(); private final StringFilterGroup macroMarkersCarousel; private final ByteArrayFilterGroupList macroMarkersCarouselGroupList = new ByteArrayFilterGroupList(); - private final StringFilterGroup horizontalShelf; - private final ByteArrayFilterGroup cellVideoAttribute; - private final StringFilterGroup infoCardsSection; + private final StringFilterGroup playlistSection; + private final ByteArrayFilterGroupList playlistSectionGroupList = new ByteArrayFilterGroupList(); + private final StringFilterGroup featuredLinksSection; + private final StringFilterGroup featuredVideosSection; private final StringFilterGroup subscribeButton; - private final StringFilterGroup aiGeneratedVideoSummarySection; - private final StringFilterGroup hypePoints; public DescriptionComponentsFilter() { - exceptions.addPatterns( - "compact_channel", - "description", - "grid_video", - "inline_expander", - "metadata" - ); - - aiGeneratedVideoSummarySection = new StringFilterGroup( + final StringFilterGroup aiGeneratedVideoSummarySection = new StringFilterGroup( Settings.HIDE_AI_GENERATED_VIDEO_SUMMARY_SECTION, "cell_expandable_metadata.e" ); @@ -47,19 +37,33 @@ public final class DescriptionComponentsFilter extends Filter { "video_attributes_section" ); - final StringFilterGroup featuredLinksSection = new StringFilterGroup( + featuredLinksSection = new StringFilterGroup( Settings.HIDE_FEATURED_LINKS_SECTION, "media_lockup" ); - final StringFilterGroup featuredVideosSection = new StringFilterGroup( + featuredVideosSection = new StringFilterGroup( Settings.HIDE_FEATURED_VIDEOS_SECTION, "structured_description_video_lockup" ); - final StringFilterGroup podcastSection = new StringFilterGroup( - Settings.HIDE_PODCAST_SECTION, - "playlist_section" + playlistSection = new StringFilterGroup( + // YT v20.14.43 doesn't use any buffer for Courses and Podcasts. + // So this component is also needed. + null, + "playlist_section.e" + ); + + playlistSectionGroupList.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_EXPLORE_COURSE_SECTION, + "yt_outline_creator_academy", // For Disable bold icons. + "yt_outline_experimental_graduation_cap" + ), + new ByteArrayFilterGroup( + Settings.HIDE_EXPLORE_PODCAST_SECTION, + "FEpodcasts_destination" + ) ); final StringFilterGroup transcriptSection = new StringFilterGroup( @@ -72,12 +76,17 @@ public final class DescriptionComponentsFilter extends Filter { "how_this_was_made_section" ); - hypePoints = new StringFilterGroup( + final StringFilterGroup courseProgressSection = new StringFilterGroup( + Settings.HIDE_COURSE_PROGRESS_SECTION, + "course_progress" + ); + + final StringFilterGroup hypePoints = new StringFilterGroup( Settings.HIDE_HYPE_POINTS, "hype_points_factoid" ); - infoCardsSection = new StringFilterGroup( + final StringFilterGroup infoCardsSection = new StringFilterGroup( Settings.HIDE_INFO_CARDS_SECTION, INFOCARDS_SECTION_PATH ); @@ -95,64 +104,72 @@ public final class DescriptionComponentsFilter extends Filter { macroMarkersCarouselGroupList.addAll( new ByteArrayFilterGroup( Settings.HIDE_CHAPTERS_SECTION, - "chapters_horizontal_shelf" + "chapters_horizontal_shelf", + "auto-chapters", + "description-chapters" ), new ByteArrayFilterGroup( Settings.HIDE_KEY_CONCEPTS_SECTION, - "learning_concept_macro_markers_carousel_shelf" + "learning_concept_macro_markers_carousel_shelf", + "learning-concept" ) ); - horizontalShelf = new StringFilterGroup( - Settings.HIDE_ATTRIBUTES_SECTION, - "horizontal_shelf.e" - ); - - cellVideoAttribute = new ByteArrayFilterGroup( - null, - "cell_video_attribute" - ); - addPathCallbacks( aiGeneratedVideoSummarySection, askSection, - attributesSection, + courseProgressSection, featuredLinksSection, featuredVideosSection, - horizontalShelf, howThisWasMadeSection, hypePoints, infoCardsSection, macroMarkersCarousel, - podcastSection, + playlistSection, subscribeButton, transcriptSection ); } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - - if (matchedGroup == aiGeneratedVideoSummarySection || matchedGroup == hypePoints) { - // Only hide if player is open, in case this component is used somewhere else. - return PlayerType.getCurrent().isMaximizedOrFullscreen(); + // The description panel can be opened in both the regular player and Shorts. + // If the description panel is opened in a Shorts, PlayerType is 'HIDDEN', + // so 'PlayerType.getCurrent().isMaximizedOrFullscreen()' does not guarantee that the description panel is open. + // Instead, use the engagement id to check if the description panel is opened. + if (!EngagementPanel.isDescription() + // The user can minimize the player while the engagement panel is open. + // + // In this case, the engagement panel is treated as open. + // (If the player is dismissed, the engagement panel is considered closed) + // + // Therefore, the following exceptions can occur: + // 1. The user opened a regular video and opened the description panel. + // 2. The 'horizontalShelf' elements were hidden. + // 3. The user minimized the player. + // 4. The user manually refreshed the library tab without dismissing the player. + // 5. Since the engagement panel is treated as open, the history shelf is filtered. + // + // To handle these exceptions, filtering is not performed even when the player is minimized. + || PlayerType.getCurrent() == PlayerType.WATCH_WHILE_MINIMIZED + ) { + return false; } - if (matchedGroup == subscribeButton) { + if (matchedGroup == featuredLinksSection || matchedGroup == featuredVideosSection || matchedGroup == subscribeButton) { return path.startsWith(INFOCARDS_SECTION_PATH); } - if (exceptions.matches(path)) return false; + if (matchedGroup == playlistSection) { + if (contentIndex != 0) return false; + return Settings.HIDE_EXPLORE_SECTION.get() || playlistSectionGroupList.check(buffer).isFiltered(); + } if (matchedGroup == macroMarkersCarousel) { return contentIndex == 0 && macroMarkersCarouselGroupList.check(buffer).isFiltered(); } - if (matchedGroup == horizontalShelf) { - return cellVideoAttribute.check(buffer).isFiltered(); - } - return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java index 93fd1734d4..4f18eb412d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/KeywordContentFilter.java @@ -36,7 +36,7 @@ import app.revanced.extension.youtube.shared.PlayerType; * - Some layout component residue will remain, such as the video chapter previews for some search results. * These components do not include the video title or channel name, and they * appear outside the filtered components so they are not caught. - * - Keywords are case sensitive, but some casing variation is manually added. + * - Keywords are case-sensitive, but some casing variation is manually added. * (ie: "mr beast" automatically filters "Mr Beast" and "MR BEAST"). * - Keywords present in the layout or video data cannot be used as filters, otherwise all videos * will always be hidden. This patch checks for some words of these words. @@ -46,7 +46,7 @@ import app.revanced.extension.youtube.shared.PlayerType; public final class KeywordContentFilter extends Filter { /** - * Strings found in the buffer for every videos. Full strings should be specified. + * Strings found in the buffer for every video. Full strings should be specified. * * This list does not include every common buffer string, and this can be added/changed as needed. * Words must be entered with the exact casing as found in the buffer. @@ -190,7 +190,7 @@ public final class KeywordContentFilter extends Filter { return sentence; } final int firstCodePoint = sentence.codePointAt(0); - // In some non English languages title case is different than uppercase. + // In some non-English languages title case is different from uppercase. return new StringBuilder() .appendCodePoint(Character.toTitleCase(firstCodePoint)) .append(sentence, Character.charCount(firstCodePoint), sentence.length()) @@ -206,7 +206,7 @@ public final class KeywordContentFilter extends Filter { } final int delimiter = ' '; - // Use code points and not characters to handle unicode surrogates. + // Use code points and not characters to handle Unicode surrogates. int[] codePoints = sentence.codePoints().toArray(); boolean capitalizeNext = true; for (int i = 0, length = codePoints.length; i < length; i++) { @@ -376,7 +376,7 @@ public final class KeywordContentFilter extends Filter { return phrase.substring(1, phrase.length() - 1); } - private synchronized void parseKeywords() { // Must be synchronized since Litho is multi-threaded. + private synchronized void parseKeywords() { // Must be synchronized since Litho is multithreaded. String rawKeywords = Settings.HIDE_KEYWORD_CONTENT_PHRASES.get(); //noinspection StringEquality @@ -417,14 +417,14 @@ public final class KeywordContentFilter extends Filter { // Common casing that might appear. // - // This could be simplified by adding case insensitive search to the prefix search, + // This could be simplified by adding case-insensitive search to the prefix search, // which is very simple to add to StringTreSearch for Unicode and ByteTrieSearch for ASCII. // // But to support Unicode with ByteTrieSearch would require major changes because // UTF-8 characters can be different byte lengths, which does // not allow comparing two different byte arrays using simple plain array indexes. // - // Instead use all common case variations of the words. + // Instead, use all common case variations of the words. String[] phraseVariations = { phrase, phrase.toLowerCase(), @@ -556,7 +556,7 @@ public final class KeywordContentFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (contentIndex != 0 && matchedGroup == startsWithFilter) { return false; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java index 16d4c166b3..dda1f46e95 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/LayoutComponentsFilter.java @@ -7,18 +7,30 @@ import android.graphics.drawable.Drawable; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.TextUtils; +import android.util.Pair; import android.view.View; - +import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.TextView; + import androidx.annotation.Nullable; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +import app.revanced.extension.shared.ByteTrieSearch; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.StringTrieSearch; import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BooleanSetting; import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; -import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; +import app.revanced.extension.shared.patches.litho.FilterGroupList.StringFilterGroupList; +import app.revanced.extension.shared.settings.StringSetting; import app.revanced.extension.youtube.patches.ChangeHeaderPatch; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.NavigationBar; @@ -27,7 +39,7 @@ import app.revanced.extension.youtube.shared.PlayerType; @SuppressWarnings("unused") public final class LayoutComponentsFilter extends Filter { private static final StringTrieSearch mixPlaylistsContextExceptions = new StringTrieSearch( - "V.ED", // Playlist browse id. + "V.ED", // Playlist browseId. "java.lang.ref.WeakReference" ); private static final ByteArrayFilterGroup mixPlaylistsBufferExceptions = new ByteArrayFilterGroup( @@ -40,24 +52,43 @@ public final class LayoutComponentsFilter extends Filter { "&list=" ); - private static final String PAGE_HEADER_PATH = "page_header.e"; + private static final List channelTabFilterStrings; + private static final List flyoutMenuFilterStrings; + + static { + channelTabFilterStrings = getFilterStrings(Settings.HIDE_CHANNEL_TAB_FILTER_STRINGS); + flyoutMenuFilterStrings = getFilterStrings(Settings.HIDE_FEED_FLYOUT_MENU_FILTER_STRINGS); + } + + private static List getFilterStrings(StringSetting setting) { + String[] filterArray = setting.get().split("\\n"); + List filters = new ArrayList<>(filterArray.length); + + for (String line : filterArray) { + String trimmed = line.trim(); + if (!trimmed.isEmpty()) filters.add(trimmed); + } + + return filters; + } private final StringTrieSearch exceptions = new StringTrieSearch(); private final StringFilterGroup communityPosts; private final StringFilterGroup surveys; - private final StringFilterGroup subscribeButton; private final StringFilterGroup notifyMe; private final StringFilterGroup singleItemInformationPanel; private final StringFilterGroup expandableMetadata; private final StringFilterGroup compactChannelBarInner; private final StringFilterGroup compactChannelBarInnerButton; private final ByteArrayFilterGroup joinMembershipButton; - private final StringFilterGroup horizontalShelves; - private final ByteArrayFilterGroup ticketShelfBuffer; private final StringFilterGroup chipBar; private final StringFilterGroup channelProfile; - private final ByteArrayFilterGroupList channelProfileBuffer; + private final StringFilterGroupList channelProfileGroupList; + private final StringFilterGroup horizontalShelves; private final ByteArrayFilterGroup playablesBuffer; + private final ByteArrayFilterGroup ticketShelfBuffer; + private final ByteArrayFilterGroup playerShoppingShelfBuffer; + private final ByteTrieSearch descriptionSearch; public LayoutComponentsFilter() { exceptions.addPatterns( @@ -71,11 +102,28 @@ public final class LayoutComponentsFilter extends Filter { // Identifiers. + final var cellDivider = new StringFilterGroup( + Settings.HIDE_COMPACT_BANNER, + // Empty padding and a relic from very old YT versions. Not related to compact banner but included here to avoid adding another setting. + "cell_divider" + ); + final var chipsShelf = new StringFilterGroup( Settings.HIDE_CHIPS_SHELF, "chips_shelf" ); + final var liveChatReplay = new StringFilterGroup( + Settings.HIDE_LIVE_CHAT_REPLAY_BUTTON, + "live_chat_ep_entrypoint.e" + ); + + addIdentifierCallbacks( + cellDivider, + chipsShelf, + liveChatReplay + ); + final var visualSpacer = new StringFilterGroup( Settings.HIDE_VISUAL_SPACER, "cell_divider" @@ -83,6 +131,7 @@ public final class LayoutComponentsFilter extends Filter { addIdentifierCallbacks( chipsShelf, + liveChatReplay, visualSpacer ); @@ -126,6 +175,11 @@ public final class LayoutComponentsFilter extends Filter { "subscriptions_chip_bar" ); + final var subscribedChannelsBar = new StringFilterGroup( + Settings.HIDE_SUBSCRIBED_CHANNELS_BAR, + "subscriptions_channel_bar" + ); + chipBar = new StringFilterGroup( Settings.HIDE_FILTER_BAR_FEED_IN_HISTORY, "chip_bar" @@ -272,31 +326,41 @@ public final class LayoutComponentsFilter extends Filter { "endorsement_header_footer.e" ); + final var videoTitle = new StringFilterGroup( + Settings.HIDE_VIDEO_TITLE, + "player_overlay_video_heading.e" + ); + + final var webLinkPanel = new StringFilterGroup( + Settings.HIDE_WEB_SEARCH_RESULTS, + "web_link_panel", + "web_result_panel" + ); + channelProfile = new StringFilterGroup( null, "channel_profile.e", - PAGE_HEADER_PATH + "page_header.e" ); - channelProfileBuffer = new ByteArrayFilterGroupList(); - channelProfileBuffer.addAll(new ByteArrayFilterGroup( - Settings.HIDE_STORE_BUTTON, - "store_button" - ), - new ByteArrayFilterGroup( + channelProfileGroupList = new StringFilterGroupList(); + channelProfileGroupList.addAll(new StringFilterGroup( Settings.HIDE_COMMUNITY_BUTTON, "community_button" ), - new ByteArrayFilterGroup( + new StringFilterGroup( Settings.HIDE_JOIN_BUTTON, "sponsor_button" + ), + new StringFilterGroup( + Settings.HIDE_STORE_BUTTON, + "header_store_button" + ), + new StringFilterGroup( + Settings.HIDE_SUBSCRIBE_BUTTON_IN_CHANNEL_PAGE, + "subscribe_button" ) ); - subscribeButton = new StringFilterGroup( - Settings.HIDE_SUBSCRIBE_BUTTON_IN_CHANNEL_PAGE, - "subscribe_button" - ); - horizontalShelves = new StringFilterGroup( null, // Setting is checked in isFiltered() "horizontal_video_shelf.e", @@ -310,6 +374,38 @@ public final class LayoutComponentsFilter extends Filter { "ticket_item.e" ); + playerShoppingShelfBuffer = new ByteArrayFilterGroup( + null, + "shopping_item_card_list" + ); + + // Work around for unique situation where filtering is based on the setting, + // but it must not fall over to other filters if the setting is _not_ enabled. + // This is only needed for the horizontal shelf that is used so extensively everywhere. + descriptionSearch = new ByteTrieSearch(); + List.of( + new Pair<>(Settings.HIDE_FEATURED_PLACES_SECTION, "yt_fill_star"), + new Pair<>(Settings.HIDE_FEATURED_PLACES_SECTION, "yt_fill_experimental_star"), + new Pair<>(Settings.HIDE_GAMING_SECTION, "yt_outline_gaming"), + new Pair<>(Settings.HIDE_GAMING_SECTION, "yt_outline_experimental_gaming"), + new Pair<>(Settings.HIDE_MUSIC_SECTION, "yt_outline_audio"), + new Pair<>(Settings.HIDE_MUSIC_SECTION, "yt_outline_experimental_audio"), + new Pair<>(Settings.HIDE_QUIZZES_SECTION, "post_base_wrapper_slim"), + // May no longer work on v20.31+, even though the component is still there. + new Pair<>(Settings.HIDE_ATTRIBUTES_SECTION, "cell_video_attribute") + ).forEach(pair -> { + BooleanSetting setting = pair.first; + descriptionSearch.addPattern(pair.second.getBytes(StandardCharsets.UTF_8), + (textSearched, matchedStartIndex, matchedLength, callbackParameter) -> { + //noinspection unchecked + AtomicReference hide = (AtomicReference) callbackParameter; + hide.set(setting.get()); + return true; + } + ); + } + ); + addPathCallbacks( artistCard, audioTrackButton, @@ -337,21 +433,23 @@ public final class LayoutComponentsFilter extends Filter { quickActions, relatedVideos, singleItemInformationPanel, - subscribeButton, + subscribedChannelsBar, subscribersCommunityGuidelines, subscriptionsChipBar, surveys, timedReactions, - videoRecommendationLabels + videoTitle, + videoRecommendationLabels, + webLinkPanel ); } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { // This identifier is used not only in players but also in search results: // https://github.com/ReVanced/revanced-patches/issues/3245 - // Until 2024, medical information panels such as Covid 19 also used this identifier and were shown in the search results. + // Until 2024, medical information panels such as Covid-19 also used this identifier and were shown in the search results. // From 2025, the medical information panel is no longer shown in the search results. // Therefore, this identifier does not filter when the search bar is activated. if (matchedGroup == singleItemInformationPanel) { @@ -365,14 +463,13 @@ public final class LayoutComponentsFilter extends Filter { } if (matchedGroup == channelProfile) { - return channelProfileBuffer.check(buffer).isFiltered(); + return channelProfileGroupList.check(accessibility).isFiltered(); } - if (matchedGroup == subscribeButton) { - return path.startsWith(PAGE_HEADER_PATH); - } - - if (matchedGroup == communityPosts && NavigationBar.isBackButtonVisible()) { + if (matchedGroup == communityPosts + && NavigationBar.isBackButtonVisible() + && !NavigationBar.isSearchBarActive() + && PlayerType.getCurrent() != PlayerType.WATCH_WHILE_MAXIMIZED) { // Allow community posts on channel profile page, // or if viewing an individual channel in the feed. return false; @@ -387,18 +484,43 @@ public final class LayoutComponentsFilter extends Filter { && joinMembershipButton.check(buffer).isFiltered(); } + // Horizontal shelves are used everywhere in the app. And to prevent the generic "hide shelves" + // from incorrectly hiding other stuff that has its own hide filters, + // the more specific shelf filters must check first _and_ they must halt falling over + // to other filters if the buffer matches but the setting is off. if (matchedGroup == horizontalShelves) { if (contentIndex != 0) return false; + + AtomicReference descriptionFilterResult = new AtomicReference<>(null); + if (descriptionSearch.matches(buffer, descriptionFilterResult)) { + return descriptionFilterResult.get(); + } + + // Check if others are off before searching. final boolean hideShelves = Settings.HIDE_HORIZONTAL_SHELVES.get(); final boolean hideTickets = Settings.HIDE_TICKET_SHELF.get(); final boolean hidePlayables = Settings.HIDE_PLAYABLES.get(); + final boolean hidePlayerShoppingShelf = Settings.HIDE_CREATOR_STORE_SHELF.get(); + if (!hideShelves && !hideTickets && !hidePlayables && !hidePlayerShoppingShelf) + return false; - if (!hideShelves && !hideTickets && !hidePlayables) return false; - - // Must always check other buffers first, to prevent incorrectly hiding them - // if they are set to show but hide horizontal shelves is set to hidden. if (ticketShelfBuffer.check(buffer).isFiltered()) return hideTickets; if (playablesBuffer.check(buffer).isFiltered()) return hidePlayables; + if (playerShoppingShelfBuffer.check(buffer).isFiltered()) + return hidePlayerShoppingShelf; + + // 20.31+ when exiting fullscreen after watching for a while or when resuming the app, + // then sometimes the buffer isn't correct and the player shopping shelf is shown. + // If filtering reaches this point then there are no more shelves that could be in the player. + // If shopping shelves are set to hidden and the player is active, then assume + // it's the shopping shelf. + if (hidePlayerShoppingShelf) { + PlayerType type = PlayerType.getCurrent(); + if (type == PlayerType.WATCH_WHILE_MAXIMIZED || type == PlayerType.WATCH_WHILE_FULLSCREEN + || type == PlayerType.WATCH_WHILE_SLIDING_MAXIMIZED_FULLSCREEN) { + return true; + } + } return hideShelves && hideShelves(); } @@ -474,6 +596,13 @@ public final class LayoutComponentsFilter extends Filter { return original || Settings.HIDE_FLOATING_MICROPHONE_BUTTON.get(); } + /** + * Injection point. + */ + public static void hideLatestVideosButton(View view) { + Utils.hideViewUnderCondition(Settings.HIDE_LATEST_VIDEOS_BUTTON.get(), view); + } + /** * Injection point. */ @@ -523,22 +652,111 @@ public final class LayoutComponentsFilter extends Filter { imageView.setImageDrawable(replacement); } + private static final FrameLayout.LayoutParams EMPTY_LAYOUT_PARAMS = new FrameLayout.LayoutParams(0, 0); private static final boolean HIDE_SHOW_MORE_BUTTON_ENABLED = Settings.HIDE_SHOW_MORE_BUTTON.get(); + /** + * The ShowMoreButton should not always be hidden. + * According to the preference summary, only the ShowMoreButton in search results is hidden. + * Since the ShowMoreButton should be visible on other pages, such as channels, + * the original values of the Views are saved in fields. + */ + private static FrameLayout.LayoutParams cachedLayoutParams; + private static int cachedButtonContainerMinimumHeight = -1; + private static int cachedPlaceHolderMinimumHeight = -1; + private static int cachedRootViewMinimumHeight = -1; + /** * Injection point. */ - public static void hideShowMoreButton(View view) { + public static void hideShowMoreButton(View view, View buttonContainer, TextView textView) { if (HIDE_SHOW_MORE_BUTTON_ENABLED - && NavigationBar.isSearchBarActive() - // Search bar can be active but behind the player. - && !PlayerType.getCurrent().isMaximizedOrFullscreen()) { - // FIXME: "Show more" button is visible hidden, - // but an empty space remains that can be clicked. - Utils.hideViewByLayoutParams(view); + && view instanceof ViewGroup rootView + && buttonContainer != null + && textView != null + && buttonContainer.getLayoutParams() instanceof FrameLayout.LayoutParams lp + ) { + View placeHolder = rootView.getChildAt(0); + + // For some users, ShowMoreButton has a PlaceHolder ViewGroup (A/B tests). + // When a PlaceHolder is present, a different method is used to hide or show the ViewGroup. + boolean hasPlaceHolder = placeHolder instanceof FrameLayout; + + // Only in search results, the content description of RootView and the text of TextView match. + // Hide ShowMoreButton in search results, but show ShowMoreButton in other pages (e.g. channels). + boolean isSearchResults = TextUtils.equals(rootView.getContentDescription(), textView.getText()); + + if (hasPlaceHolder) { + hideShowMoreButtonWithPlaceHolder(placeHolder, isSearchResults); + } else { + hideShowMoreButtonWithOutPlaceHolder(buttonContainer, lp, isSearchResults); + } + + if (cachedRootViewMinimumHeight == -1) { + cachedRootViewMinimumHeight = rootView.getMinimumHeight(); + } + + if (isSearchResults) { + rootView.setMinimumHeight(0); + rootView.setVisibility(View.GONE); + } else { + rootView.setMinimumHeight(cachedRootViewMinimumHeight); + rootView.setVisibility(View.VISIBLE); + } } } + private static void hideShowMoreButtonWithPlaceHolder(View placeHolder, boolean isSearchResults) { + if (cachedPlaceHolderMinimumHeight == -1) { + cachedPlaceHolderMinimumHeight = placeHolder.getMinimumHeight(); + } + + if (isSearchResults) { + placeHolder.setMinimumHeight(0); + placeHolder.setVisibility(View.GONE); + } else { + placeHolder.setMinimumHeight(cachedPlaceHolderMinimumHeight); + placeHolder.setVisibility(View.VISIBLE); + } + } + + private static void hideShowMoreButtonWithOutPlaceHolder(View buttonContainer, FrameLayout.LayoutParams lp, + boolean isSearchResults) { + if (cachedButtonContainerMinimumHeight == -1) { + cachedButtonContainerMinimumHeight = buttonContainer.getMinimumHeight(); + } + + if (cachedLayoutParams == null) { + cachedLayoutParams = lp; + } + + if (isSearchResults) { + buttonContainer.setMinimumHeight(0); + buttonContainer.setLayoutParams(EMPTY_LAYOUT_PARAMS); + buttonContainer.setVisibility(View.GONE); + } else { + buttonContainer.setMinimumHeight(cachedButtonContainerMinimumHeight); + buttonContainer.setLayoutParams(cachedLayoutParams); + buttonContainer.setVisibility(View.VISIBLE); + } + } + + /** + * Injection point. + */ + public static void hideSubscribedChannelsBar(View view) { + Utils.hideViewByRemovingFromParentUnderCondition(Settings.HIDE_SUBSCRIBED_CHANNELS_BAR, view); + } + + /** + * Injection point. + */ + public static int hideSubscribedChannelsBar(int original) { + return Settings.HIDE_SUBSCRIBED_CHANNELS_BAR.get() + ? 0 + : original; + } + private static boolean hideShelves() { // Horizontal shelves are used for music/game links in video descriptions, // such as https://youtube.com/watch?v=W8kI1na3S2M @@ -621,4 +839,112 @@ public final class LayoutComponentsFilter extends Filter { return original; } + + /** + * + * Injection point. + *

+ * Hide feed flyout menu for phone + * + * @param menuTitleCharSequence menu title + */ + @Nullable + public static CharSequence hideFlyoutMenu(@Nullable CharSequence menuTitleCharSequence) { + if (menuTitleCharSequence == null || !Settings.HIDE_FEED_FLYOUT_MENU.get() + || flyoutMenuFilterStrings.isEmpty()) { + return menuTitleCharSequence; + } + + String menuTitleString = menuTitleCharSequence.toString(); + + for (String filter : flyoutMenuFilterStrings) { + if (menuTitleString.equalsIgnoreCase(filter)) { + return null; + } + } + + return menuTitleCharSequence; + } + + /** + * Injection point. + *

+ * hide feed flyout panel for tablet + * + * @param menuTextView flyout text view + * @param menuTitleCharSequence raw text + */ + public static void hideFlyoutMenu(TextView menuTextView, CharSequence menuTitleCharSequence) { + if (menuTitleCharSequence == null || !Settings.HIDE_FEED_FLYOUT_MENU.get() + || flyoutMenuFilterStrings.isEmpty() + || !(menuTextView.getParent() instanceof View parentView)) { + return; + } + + String menuTitleString = menuTitleCharSequence.toString(); + + for (String filter : flyoutMenuFilterStrings) { + if (menuTitleString.equalsIgnoreCase(filter)) { + Utils.hideViewByLayoutParams(parentView); + } + } + } + + /** + * + * Injection point. + *

+ * Rather than simply hiding the channel tab view, completely remove the channel tab from the list. + * If a channel tab is removed from the list, users will not be able to open it by swiping. + * + * @param channelTabText Text assigned to the channel tab, such as "Shorts", "Playlists", + * "Community", "Store". This text follows the user's language. + * @return Whether to remove the channel tab from the list. + */ + public static boolean hideChannelTab(@Nullable String channelTabText) { + if (channelTabText == null || !Settings.HIDE_CHANNEL_TAB.get() + || channelTabFilterStrings.isEmpty()) { + return false; + } + + for (String filter : channelTabFilterStrings) { + if (channelTabText.equalsIgnoreCase(filter)) { + return true; + } + } + + return false; + } + + /** + * Injection point. + * + * @param typedString Keywords typed in the search bar. + * @return Whether the setting is enabled and the typed string is empty. + */ + public static boolean hideYouMayLikeSection(String typedString) { + return Settings.HIDE_YOU_MAY_LIKE_SECTION.get() + // The 'You may like' section is only visible when no search terms are entered. + // To avoid unnecessary collection traversals, filtering is performed only when the typedString is empty. + && TextUtils.isEmpty(typedString); + } + + /** + * Injection point. + * + * @param searchTerm This class contains information related to search terms. + * The {@code toString()} method of this class overrides the search term. + * @param endpoint Endpoint related with the search term. + * For search history, this value is: + * '/complete/deleteitems?client=youtube-android-pb&delq=${searchTerm}&deltok=${token}'. + * For search suggestions, this value is null or empty. + * @return Whether search term is a search history or not. + */ + public static boolean isSearchHistory(Object searchTerm, String endpoint) { + boolean isSearchHistory = endpoint != null && endpoint.contains("/delete"); + if (!isSearchHistory) { + Logger.printDebug(() -> "Remove search suggestion: " + searchTerm); + } + return isSearchHistory; + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java index 05b2dda470..e1752f184b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlaybackSpeedMenuFilter.java @@ -38,7 +38,7 @@ public final class PlaybackSpeedMenuFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == oldPlaybackMenuGroup) { isOldPlaybackSpeedMenuVisible = true; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java index a8b88fa8f6..c1edd9a0dc 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter.java @@ -7,6 +7,7 @@ import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilt import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.ShortsPlayerState; @@ -44,61 +45,74 @@ public final class PlayerFlyoutMenuItemsFilter extends Filter { flyoutFilterGroupList.addAll( new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_CAPTIONS, - "closed_caption_" - ), - new ByteArrayFilterGroup( - Settings.HIDE_PLAYER_FLYOUT_ADDITIONAL_SETTINGS, - "yt_outline_gear_" - ), - new ByteArrayFilterGroup( - Settings.HIDE_PLAYER_FLYOUT_LOOP_VIDEO, - "yt_outline_arrow_repeat_1_" - ), - new ByteArrayFilterGroup( - Settings.HIDE_PLAYER_FLYOUT_AMBIENT_MODE, - "yt_outline_screen_light_" - ), - new ByteArrayFilterGroup( - Settings.HIDE_PLAYER_FLYOUT_STABLE_VOLUME, - "volume_stable_" + "closed_caption_", + "yt_outline_experimental_closed_captions_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_LISTEN_WITH_YOUTUBE_MUSIC, - "yt_outline_youtube_music_" + "yt_outline_youtube_music_", + "yt_outline_experimental_youtube_music_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_HELP, - "yt_outline_question_circle_" + "yt_outline_question_circle_", + "yt_outline_experimental_help_circle_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_LOCK_SCREEN, - "yt_outline_lock_" + "yt_outline_lock_", + "yt_outline_experimental_lock_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_SPEED, - "yt_outline_play_arrow_half_circle_" + "yt_outline_play_arrow_half_circle_", + "yt_outline_experimental_play_circle_half_dashed_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_AUDIO_TRACK, - "yt_outline_person_radar_" + "yt_outline_person_radar_", + "yt_outline_experimental_person_radar_" + ), + new ByteArrayFilterGroup( + Settings.HIDE_PLAYER_FLYOUT_ADDITIONAL_SETTINGS, + "yt_outline_gear_", + "yt_outline_experimental_gear_" + ), + new ByteArrayFilterGroup( + Settings.HIDE_PLAYER_FLYOUT_AMBIENT_MODE, + "yt_outline_screen_light_", + "yt_outline_experimental_ambient_mode_" + ), + new ByteArrayFilterGroup( + Settings.HIDE_PLAYER_FLYOUT_LOOP_VIDEO, + "yt_outline_arrow_repeat_1_", + "yt_outline_experimental_repeat1_" + ), + new ByteArrayFilterGroup( + Settings.HIDE_PLAYER_FLYOUT_STABLE_VOLUME, + "volume_stable_", + "yt_outline_experimental_stable_volume_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_SLEEP_TIMER, - "yt_outline_moon_z_" + "yt_outline_moon_z_", + "yt_outline_experimental_sleep_timer_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_WATCH_IN_VR, - "yt_outline_vr_" + "yt_outline_vr_", + "yt_outline_experimental_vr_" ), new ByteArrayFilterGroup( Settings.HIDE_PLAYER_FLYOUT_VIDEO_QUALITY, - "yt_outline_adjust_" + "yt_outline_adjust_", + "yt_outline_experimental_adjust_" ) ); } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == videoQualityMenuFooter) { return true; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java index ba1d44d017..a9513f28e0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ReturnYouTubeDislikeFilter.java @@ -18,21 +18,21 @@ import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; /** - * Searches for video id's in the proto buffer of Shorts dislike. + * Searches for video IDs in the proto buffer of Shorts dislike. * * Because multiple litho dislike spans are created in the background * (and also anytime litho refreshes the components, which is somewhat arbitrary), * that makes the value of {@link VideoInformation#getVideoId()} and {@link VideoInformation#getPlayerResponseVideoId()} - * unreliable to determine which video id a Shorts litho span belongs to. + * unreliable to determine which video ID a Shorts litho span belongs to. * - * But the correct video id does appear in the protobuffer just before a Shorts litho span is created. + * But the correct video ID does appear in the protobuffer just before a Shorts litho span is created. * * Once a way to asynchronously update litho text is found, this strategy will no longer be needed. */ public final class ReturnYouTubeDislikeFilter extends Filter { /** - * Last unique video id's loaded. Value is ignored and Map is treated as a Set. + * Last unique video IDs loaded. Value is ignored and Map is treated as a Set. * Cannot use {@link LinkedHashSet} because it's missing #removeEldestEntry(). */ @GuardedBy("itself") @@ -49,7 +49,7 @@ public final class ReturnYouTubeDislikeFilter extends Filter { } synchronized (lastVideoIds) { if (lastVideoIds.put(videoId, Boolean.TRUE) == null) { - Logger.printDebug(() -> "New Short video id: " + videoId); + Logger.printDebug(() -> "New Short video ID: " + videoId); } } } catch (Exception ex) { @@ -64,19 +64,31 @@ public final class ReturnYouTubeDislikeFilter extends Filter { // But if swiping back to a previous video and liking/disliking, then only that single button reloads. // So must check for both buttons. addPathCallbacks( - new StringFilterGroup(null, "|shorts_like_button.e"), - new StringFilterGroup(null, "|shorts_dislike_button.e") + new StringFilterGroup( + null, + "shorts_like_button.e", + "reel_like_button.e", + "reel_like_toggled_button.e", + "shorts_dislike_button.e", + "reel_dislike_button.e", + "reel_dislike_toggled_button.e" + ) ); - // After the button identifiers is binary data and then the video id for that specific short. + // After the button identifiers is binary data and then the video ID for that specific short. videoIdFilterGroup.addAll( - new ByteArrayFilterGroup(null, "id.reel_like_button"), - new ByteArrayFilterGroup(null, "id.reel_dislike_button") + new ByteArrayFilterGroup( + null, + "id.reel_like_button", + "id.reel_dislike_button", + "ic_right_like", + "ic_right_dislike" + ) ); } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (!Settings.RYD_ENABLED.get() || !Settings.RYD_SHORTS.get()) { return false; @@ -86,8 +98,8 @@ public final class ReturnYouTubeDislikeFilter extends Filter { if (result.isFiltered()) { String matchedVideoId = findVideoId(buffer); // Matched video will be null if in incognito mode. - // Must pass a null id to correctly clear out the current video data. - // Otherwise if a Short is opened in non-incognito, then incognito is enabled and another Short is opened, + // Must pass a null ID to correctly clear out the current video data. + // Otherwise, if a Short is opened in non-incognito, then incognito is enabled and another Short is opened, // the new incognito Short will show the old prior data. ReturnYouTubeDislikePatch.setLastLithoShortsVideoId(matchedVideoId); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java index bd07da6a76..462cd8c2e1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/ShortsFilter.java @@ -4,10 +4,12 @@ import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButt import android.view.View; +import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.patches.litho.Filter; import app.revanced.extension.shared.patches.litho.FilterGroup.*; import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; +import app.revanced.extension.shared.patches.litho.LithoFilterPatch; import app.revanced.extension.shared.settings.BooleanSetting; import com.google.android.libraries.youtube.rendering.ui.pivotbar.PivotBar; @@ -20,10 +22,11 @@ import java.util.Map; import app.revanced.extension.shared.Logger; import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.shared.EngagementPanel; import app.revanced.extension.youtube.shared.NavigationBar; import app.revanced.extension.youtube.shared.PlayerType; -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "FieldCanBeLocal"}) public final class ShortsFilter extends Filter { private static final boolean HIDE_SHORTS_NAVIGATION_BAR = Settings.HIDE_SHORTS_NAVIGATION_BAR.get(); private static final String COMPONENT_TYPE = "ComponentType"; @@ -67,18 +70,22 @@ public final class ShortsFilter extends Filter { private final StringFilterGroup shortsCompactFeedVideo; private final ByteArrayFilterGroup shortsCompactFeedVideoBuffer; + private final StringFilterGroup channelProfile; + private final ByteArrayFilterGroup channelProfileShelfHeaderBuffer; private final StringFilterGroup useSoundButton; private final ByteArrayFilterGroup useSoundButtonBuffer; private final StringFilterGroup useTemplateButton; private final ByteArrayFilterGroup useTemplateButtonBuffer; - private final StringFilterGroup reelCarousel; - private final ByteArrayFilterGroup reelCarouselBuffer; private final StringFilterGroup autoDubbedLabel; private final StringFilterGroup subscribeButton; private final StringFilterGroup joinButton; private final StringFilterGroup paidPromotionLabel; - private final StringFilterGroup shelfHeader; + private final StringFilterGroup shelfHeaderIdentifier; + private final StringFilterGroup shelfHeaderPath; + + private final StringFilterGroup reelCarousel; + private final ByteArrayFilterGroupList reelCarouselBuffer = new ByteArrayFilterGroupList(); private final StringFilterGroup suggestedAction; private final ByteArrayFilterGroupList suggestedActionsBuffer = new ByteArrayFilterGroupList(); @@ -97,24 +104,34 @@ public final class ShortsFilter extends Filter { "shorts_shelf", "inline_shorts", "shorts_grid", - "shorts_video_cell", + "shorts_video_cell" + ); + + channelProfile = new StringFilterGroup( + Settings.HIDE_SHORTS_CHANNEL, "shorts_pivot_item" ); + channelProfileShelfHeaderBuffer = new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_CHANNEL, + "Shorts" + ); + // Feed Shorts shelf header. // Use a different filter group for this pattern, as it requires an additional check after matching. - shelfHeader = new StringFilterGroup( + shelfHeaderIdentifier = new StringFilterGroup( null, "shelf_header.e" ); - addIdentifierCallbacks(shortsIdentifiers, shelfHeader); + addIdentifierCallbacks(shortsIdentifiers, channelProfile, shelfHeaderIdentifier); // // Path components. // - shortsCompactFeedVideo = new StringFilterGroup(null, + shortsCompactFeedVideo = new StringFilterGroup( + null, // Shorts that appear in the feed/search when the device is using tablet layout. "compact_video.e", // 'video_lockup_with_attachment.e' is shown instead of 'compact_video.e' for some users @@ -125,7 +142,14 @@ public final class ShortsFilter extends Filter { // Filter out items that use the 'frame0' thumbnail. // This is a valid thumbnail for both regular videos and Shorts, // but it appears these thumbnails are used only for Shorts. - shortsCompactFeedVideoBuffer = new ByteArrayFilterGroup(null, "/frame0.jpg"); + shortsCompactFeedVideoBuffer = new ByteArrayFilterGroup( + null, + "/frame0.jpg"); + + shelfHeaderPath = new StringFilterGroup( + null, + "shelf_header.e" + ); // Shorts player components. StringFilterGroup pausedOverlayButtons = new StringFilterGroup( @@ -229,13 +253,21 @@ public final class ShortsFilter extends Filter { ); reelCarousel = new StringFilterGroup( - Settings.HIDE_SHORTS_SOUND_METADATA_LABEL, + null, "reel_carousel.e" ); - reelCarouselBuffer = new ByteArrayFilterGroup( - null, - "FEsfv_audio_pivot" + reelCarouselBuffer.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_AI_BUTTON, + "yt_outline_info_circle", + "yt_outline_experimental_info_circle" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_SOUND_METADATA_LABEL, + "yt_outline_audio", // Doesn't seem to be needed as v20.14.43 uses 'yt_outline_experimental_audio' as well. But still just in case. + "yt_outline_experimental_audio" + ) ); useSoundButton = new StringFilterGroup( @@ -279,10 +311,10 @@ public final class ShortsFilter extends Filter { ); addPathCallbacks( - shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionLabel, livePreview, - suggestedAction, pausedOverlayButtons, channelBar, previewComment, autoDubbedLabel, - fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, reelCarousel, - infoPanel, stickers, likeFountain, likeButton, dislikeButton + shortsCompactFeedVideo, shelfHeaderPath, joinButton, subscribeButton, paidPromotionLabel, + livePreview, suggestedAction, pausedOverlayButtons, channelBar, infoPanel, previewComment, + autoDubbedLabel, fullVideoLinkLabel, videoTitle, useSoundButton, soundButton, stickers, + reelCarousel, reelSoundMetadata, likeFountain, likeButton, dislikeButton ); // Legacy hiding of Shorts action buttons. Because of 20.31+ buffer changes @@ -331,7 +363,7 @@ public final class ShortsFilter extends Filter { new ByteArrayFilterGroup( Settings.HIDE_SHORTS_TAGGED_PRODUCTS, // Product buttons show pictures of the products, and does not have any unique icons to identify. - // Instead use a unique identifier found in the buffer. + // Instead, use a unique identifier found in the buffer. "PAproduct_listZ" ), new ByteArrayFilterGroup( @@ -402,8 +434,23 @@ public final class ShortsFilter extends Filter { } @Override - public boolean isFiltered(String identifier, String path, byte[] buffer, + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + if (contentType == FilterContentType.IDENTIFIER) { + if (matchedGroup == shelfHeaderIdentifier) { + // Shelf header reused in history/channel/etc. + // Shorts header is always index 0 + if (contentIndex != 0) { + return false; + } + } + if (matchedGroup == channelProfile) { + return true; + } + + return shouldHideShortsFeedItems(); + } + if (contentType == FilterContentType.PATH) { if (matchedGroup == subscribeButton || matchedGroup == joinButton || matchedGroup == paidPromotionLabel || matchedGroup == autoDubbedLabel) { @@ -428,6 +475,19 @@ public final class ShortsFilter extends Filter { return shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(buffer).isFiltered(); } + if (matchedGroup == shelfHeaderPath) { + // Shelf header reused in history/channel/etc. + // Shorts header is always index 0 + if (contentIndex != 0) { + return false; + } + if (!channelProfileShelfHeaderBuffer.check(buffer).isFiltered()) { + return false; + } + + return shouldHideShortsFeedItems(); + } + // Video action buttons (comment, share, remix) have the same path. // Like and dislike are separate path filters and don't require buffer searching. if (matchedGroup == shortsActionBar) { @@ -449,40 +509,35 @@ public final class ShortsFilter extends Filter { return true; } - // Feed/search identifier components. - if (matchedGroup == shelfHeader) { - // Because the header is used in watch history and possibly other places, check for the index, - // which is 0 when the shelf header is used for Shorts. - if (contentIndex != 0) return false; - } - - return shouldHideShortsFeedItems(); + return false; } - private static boolean shouldHideShortsFeedItems() { + private boolean shouldHideShortsFeedItems() { // Known issue if hide home is on but at least one other hide is off: // // Shorts suggestions will load in the background if a video is opened and // immediately minimized before any suggestions are loaded. // In this state the player type will show minimized, which cannot // distinguish between Shorts suggestions loading in the player and between - // scrolling thru search/home/subscription tabs while a player is minimized. + // scrolling through search/home/subscription tabs while a player is minimized. final boolean hideHome = Settings.HIDE_SHORTS_HOME.get(); final boolean hideSubscriptions = Settings.HIDE_SHORTS_SUBSCRIPTIONS.get(); final boolean hideSearch = Settings.HIDE_SHORTS_SEARCH.get(); + final boolean hideVideoDescription = Settings.HIDE_SHORTS_VIDEO_DESCRIPTION.get(); final boolean hideHistory = Settings.HIDE_SHORTS_HISTORY.get(); - if (!hideHome && !hideSubscriptions && !hideSearch && !hideHistory) { + if (!hideHome && !hideSubscriptions && !hideSearch && !hideVideoDescription && !hideHistory) { return false; } - if (hideHome && hideSubscriptions && hideSearch && hideHistory) { + if (hideHome && hideSubscriptions && hideSearch && hideVideoDescription && hideHistory) { return true; } // Must check player type first, as search bar can be active behind the player. if (PlayerType.getCurrent().isMaximizedOrFullscreen()) { - // For now, consider the under video results the same as the home feed. - return hideHome; + return EngagementPanel.isDescription() + ? hideVideoDescription // Player video description panel opened. + : hideHome; // For now, consider Shorts under video player the same as the home feed. } // Must check second, as search can be from any tab. @@ -509,6 +564,58 @@ public final class ShortsFilter extends Filter { }; } + /** + * Injection point. + *

+ * Hide action buttons by index. + *

+ * Regular video action buttons vary in order by video, country, and account. + * Therefore, hiding buttons by index may hide unintended buttons. + *

+ * Shorts action buttons are almost always in the same order. + * (From top to bottom: Like, Dislike, Comment, Share, Remix). + * Therefore, we can hide Shorts action buttons by index. + * + * @param pathBuilder Same as pathBuilder used in {@link LithoFilterPatch}. + * @param treeNodeResultList List containing Litho components. + */ + public static void hideActionButtons(StringBuilder pathBuilder, List treeNodeResultList) { + try { + if (pathBuilder == null || pathBuilder.length() == 0 || treeNodeResultList == null) { + return; + } + int size = treeNodeResultList.size(); + + // The minimum size of the target List is 4. + if (size < 4) { + return; + } + String path = pathBuilder.toString(); + + if (!Utils.containsAny(path, REEL_ACTION_BAR_PATHS) + // Regular Shorts: [ComponentType, ComponentType, ComponentType, ComponentType, ComponentType] + // Shorts ads: [ComponentType, ComponentType, ComponentType, ComponentType] (No Remix button) + || !COMPONENT_TYPE.equals(treeNodeResultList.get(0).toString())) { + return; + } + // Removing elements without iterating through the list in reverse order will throw an exception. + for (int i = size - 1; i > -1; i--) { + // treeNodeResult is each button. + Object treeNodeResult = treeNodeResultList.get(i); + if (treeNodeResult != null) { + BooleanSetting setting = REEL_ACTION_BUTTONS_MAP.get(i); + if (setting != null && setting.get()) { + int finalI = i; + Logger.printDebug(() -> "Hiding action button by index: " + finalI + ", key: " + setting.key); + treeNodeResultList.remove(i); + } + } + } + } catch (Exception ex) { + Logger.printException(() -> "hideActionButtons failed", ex); + } + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/VideoActionButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/VideoActionButtonsFilter.java new file mode 100644 index 0000000000..7d1e1cca71 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/litho/VideoActionButtonsFilter.java @@ -0,0 +1,180 @@ +package app.revanced.extension.youtube.patches.litho; + +import app.revanced.extension.shared.patches.litho.Filter; +import app.revanced.extension.shared.patches.litho.FilterGroup.ByteArrayFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroup.StringFilterGroup; +import app.revanced.extension.shared.patches.litho.FilterGroupList.ByteArrayFilterGroupList; +import app.revanced.extension.shared.patches.litho.FilterGroupList.StringFilterGroupList; +import app.revanced.extension.youtube.patches.VersionCheckPatch; +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public final class VideoActionButtonsFilter extends Filter { + private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.e"; + private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.e"; + private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.e"; + /** + * Video bar path when the video information is collapsed. Seems to shown only with 20.14+ + */ + private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.e"; + private static final String ANIMATED_VECTOR_TYPE_PATH = "AnimatedVectorType"; + + private final StringFilterGroup likeSubscribeGlow; + private final StringFilterGroup actionBarGroup; + private final StringFilterGroup buttonFilterPathGroup; + private final StringFilterGroupList accessibilityButtonsGroupList = new StringFilterGroupList(); + private final ByteArrayFilterGroupList bufferButtonsGroupList = new ByteArrayFilterGroupList(); + + public VideoActionButtonsFilter() { + actionBarGroup = new StringFilterGroup( + null, + VIDEO_ACTION_BAR_PATH + ); + addIdentifierCallbacks(actionBarGroup); + + + likeSubscribeGlow = new StringFilterGroup( + Settings.DISABLE_LIKE_SUBSCRIBE_GLOW, + "animated_button_border.e" + ); + + buttonFilterPathGroup = new StringFilterGroup( + null, + "|ContainerType|button.e" + ); + + addPathCallbacks( + likeSubscribeGlow, + new StringFilterGroup( + Settings.HIDE_LIKE_DISLIKE_BUTTON, + "|segmented_like_dislike_button" + ), + new StringFilterGroup( + Settings.HIDE_DOWNLOAD_BUTTON, + "|download_button.e" + ), + new StringFilterGroup( + Settings.HIDE_SAVE_BUTTON, + "|save_to_playlist_button" + ), + new StringFilterGroup( + Settings.HIDE_CLIP_BUTTON, + "|clip_button.e" + ) + ); + + addPathCallbacks(buttonFilterPathGroup); + + if (VersionCheckPatch.IS_20_22_OR_GREATER) { + // FIXME: Most buttons do not have an accessibilityId. + // Instead, they have an accessibilityText, so hiding functionality must be implemented using this + // (e.g. custom filter - 'video_action_bar#Hype') + accessibilityButtonsGroupList.addAll( + new StringFilterGroup( + Settings.HIDE_SHARE_BUTTON, + "id.video.share.button" + ), + new StringFilterGroup( + Settings.HIDE_REMIX_BUTTON, + "id.video.remix.button" + ) + ); + } else { + bufferButtonsGroupList.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_REPORT_BUTTON, + "yt_outline_flag" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHARE_BUTTON, + "yt_outline_share" + ), + new ByteArrayFilterGroup( + Settings.HIDE_REMIX_BUTTON, + "yt_outline_youtube_shorts_plus" + ), + new ByteArrayFilterGroup( + Settings.HIDE_THANKS_BUTTON, + "yt_outline_dollar_sign_heart" + ), + new ByteArrayFilterGroup( + Settings.HIDE_ASK_BUTTON, + "yt_fill_spark" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHOP_BUTTON, + "yt_outline_bag" + ), + new ByteArrayFilterGroup( + Settings.HIDE_STOP_ADS_BUTTON, + "yt_outline_slash_circle_left" + ), + new ByteArrayFilterGroup( + Settings.HIDE_COMMENTS_BUTTON, + "yt_outline_message_bubble_right" + ), + // Check for clip button both here and using a path filter, + // as there's a chance the path is a generic action button and won't contain 'clip_button' + new ByteArrayFilterGroup( + Settings.HIDE_CLIP_BUTTON, + "yt_outline_scissors" + ), + new ByteArrayFilterGroup( + Settings.HIDE_HYPE_BUTTON, + "yt_outline_star_shooting" + ), + new ByteArrayFilterGroup( + Settings.HIDE_PROMOTE_BUTTON, + "yt_outline_megaphone" + ) + ); + } + } + + private boolean isEveryFilterGroupEnabled() { + for (var group : pathCallbacks) { + if (!group.isEnabled()) return false; + } + + var buttonList = VersionCheckPatch.IS_20_22_OR_GREATER + ? accessibilityButtonsGroupList + : bufferButtonsGroupList; + for (var group : buttonList) { + if (!group.isEnabled()) return false; + } + + return true; + } + + private boolean hideButtons(String path, String accessibility, byte[] buffer) { + // Make sure the current path is the right one to avoid false positives. + if (!path.startsWith(VIDEO_ACTION_BAR_PATH) && !path.startsWith(COMPACTIFY_VIDEO_ACTION_BAR_PATH)) { + return false; + } + + return VersionCheckPatch.IS_20_22_OR_GREATER + ? accessibilityButtonsGroupList.check(accessibility).isFiltered() + : bufferButtonsGroupList.check(buffer).isFiltered(); + } + + @Override + public boolean isFiltered(String identifier, String accessibility, String path, byte[] buffer, + StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + if (matchedGroup == likeSubscribeGlow) { + return path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX) + || path.startsWith(COMPACTIFY_VIDEO_ACTION_BAR_PATH); + } + + // If the current matched group is the action bar group, + // in case every filter group is enabled, hide the action bar. + if (matchedGroup == actionBarGroup) { + return isEveryFilterGroupEnabled(); + } + + if (matchedGroup == buttonFilterPathGroup) { + return hideButtons(path, accessibility, buffer); + } + + return true; + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch.java new file mode 100644 index 0000000000..907d1f4762 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch.java @@ -0,0 +1,31 @@ +package app.revanced.extension.youtube.patches.playback.quality; + +import static app.revanced.extension.youtube.patches.VideoInformation.isPremiumVideoQuality; + +import java.util.Arrays; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.youtube.patches.VideoInformation.VideoQualityInterface; +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public final class HidePremiumVideoQualityPatch { + private static final boolean HIDE_PREMIUM_VIDEO_QUALITY = Settings.HIDE_PREMIUM_VIDEO_QUALITY.get(); + + /** + * Injection point. + */ + public static Object[] hidePremiumVideoQuality(VideoQualityInterface[] qualities) { + if (HIDE_PREMIUM_VIDEO_QUALITY && qualities != null && qualities.length > 0) { + try { + return Arrays.stream(qualities) + .filter(quality -> quality != null && !isPremiumVideoQuality(quality)) + .toArray(VideoQualityInterface[]::new); + } catch (Exception ex) { + Logger.printException(() -> "Failed to hide Premium video quality", ex); + } + } + + return qualities; + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java index 1f726c2a5b..1cd584d617 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java @@ -3,13 +3,12 @@ package app.revanced.extension.youtube.patches.playback.quality; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.Utils.NetworkType; -import com.google.android.libraries.youtube.innertube.model.media.VideoQuality; - import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BooleanSetting; import app.revanced.extension.shared.settings.IntegerSetting; import app.revanced.extension.youtube.patches.VideoInformation; +import app.revanced.extension.youtube.patches.VideoInformation.*; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.ShortsPlayerState; @@ -74,12 +73,12 @@ public class RememberVideoQualityPatch { public static void userChangedShortsQuality(int userSelectedQualityIndex) { try { if (shouldRememberVideoQuality()) { - VideoQuality[] currentQualities = VideoInformation.getCurrentQualities(); + VideoQualityInterface[] currentQualities = VideoInformation.getCurrentQualities(); if (currentQualities == null) { Logger.printDebug(() -> "Cannot save default quality, qualities is null"); return; } - VideoQuality quality = currentQualities[userSelectedQualityIndex]; + VideoQualityInterface quality = currentQualities[userSelectedQualityIndex]; saveDefaultQuality(quality.patch_getResolution()); } } catch (Exception ex) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ThemePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ThemePatch.java index 16e0b0459a..e99b86c402 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ThemePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ThemePatch.java @@ -9,7 +9,8 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class ThemePatch extends BaseThemePatch { public enum SplashScreenAnimationStyle { - DEFAULT(0), + // 0 int style exists in target app as a fall through default, but its value is repurposed to be disabled. + DISABLED(0), FPS_60_ONE_SECOND(1), FPS_60_TWO_SECOND(2), FPS_60_FIVE_SECOND(3), @@ -18,7 +19,7 @@ public class ThemePatch extends BaseThemePatch { FPS_30_TWO_SECOND(6), FPS_30_FIVE_SECOND(7), FPS_30_BLACK_AND_WHITE(8); - // There exists a 10th json style used as the switch statement default, + // There exists a 10th JSON style used as the switch statement default, // but visually it is identical to 60fps one second. @Nullable @@ -75,12 +76,30 @@ public class ThemePatch extends BaseThemePatch { return Settings.GRADIENT_LOADING_SCREEN.get(); } + /** + * Injection point. + */ + public static boolean showSplashScreen(boolean original) { + return Settings.SPLASH_SCREEN_ANIMATION_STYLE.get() != SplashScreenAnimationStyle.DISABLED && original; + } + + /** + * Injection point. + */ + public static int showSplashScreen(int i, int i2) { + if (Settings.SPLASH_SCREEN_ANIMATION_STYLE.get() != SplashScreenAnimationStyle.DISABLED || i != i2) { + return i; + } + return i - 1; + } + /** * Injection point. */ public static int getLoadingScreenType(int original) { SplashScreenAnimationStyle style = Settings.SPLASH_SCREEN_ANIMATION_STYLE.get(); - if (style == SplashScreenAnimationStyle.DEFAULT) { + + if (style == SplashScreenAnimationStyle.DISABLED) { return original; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index 5328fb1071..f304f3673e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -42,7 +42,7 @@ import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ui.Dim; import app.revanced.extension.youtube.returnyoutubedislike.requests.RYDVoteData; -import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi; +import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeAPI; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; @@ -91,7 +91,7 @@ public class ReturnYouTubeDislike { private static final char MIDDLE_SEPARATOR_CHARACTER = '◎'; // 'bullseye' /** - * Cached lookup of all video ids. + * Cached lookup of all video IDs. */ @GuardedBy("itself") private static final Map fetchCache = new HashMap<>(); @@ -206,8 +206,8 @@ public class ReturnYouTubeDislike { return newSpannableWithDislikes(oldSpannable, voteData); } - // Note: Some locales use right to left layout (Arabic, Hebrew, etc). - // If making changes to this code, change device settings to a RTL language and verify layout is correct. + // Note: Some locales use right to left layout (Arabic, Hebrew, etc.). + // If making changes to this code, change device settings to an RTL language and verify layout is correct. CharSequence oldLikes = oldSpannable; // YouTube creators can hide the like count on a video, @@ -419,7 +419,7 @@ public class ReturnYouTubeDislike { private ReturnYouTubeDislike(@NonNull String videoId) { this.videoId = Objects.requireNonNull(videoId); this.timeFetched = System.currentTimeMillis(); - this.future = Utils.submitOnBackgroundThread(() -> ReturnYouTubeDislikeApi.fetchVotes(videoId)); + this.future = Utils.submitOnBackgroundThread(() -> ReturnYouTubeDislikeAPI.fetchVotes(videoId)); } private boolean isExpired(long now) { @@ -512,7 +512,7 @@ public class ReturnYouTubeDislike { if (votingData == null) { // Method automatically prevents showing multiple toasts if the connection failed. // This call is needed here in case the api call did succeed but took too long. - ReturnYouTubeDislikeApi.handleConnectionError( + ReturnYouTubeDislikeAPI.handleConnectionError( str("revanced_ryd_failure_connection_timeout"), null, null, Toast.LENGTH_SHORT); Logger.printDebug(() -> "Cannot add dislike to UI (RYD data not available)"); @@ -549,7 +549,7 @@ public class ReturnYouTubeDislike { } // Scrolling Shorts does not cause the Spans to be reloaded, - // so there is no need to cache the likes for this situations. + // so there is no need to cache the likes for these situations. Logger.printDebug(() -> "Creating likes span for: " + votingData.videoId); return newSpannableWithLikes(original, votingData); } @@ -601,7 +601,7 @@ public class ReturnYouTubeDislike { voteSerialExecutor.execute(() -> { try { // Must wrap in try/catch to properly log exceptions. - ReturnYouTubeDislikeApi.sendVote(videoId, vote); + ReturnYouTubeDislikeAPI.sendVote(videoId, vote); } catch (Exception ex) { Logger.printException(() -> "Failed to send vote", ex); } @@ -675,7 +675,7 @@ class VerticallyCenteredImageSpan extends ImageSpan { /** * @param useOriginalWidth Use the original layout width of the text this span is applied to, - * and not the bounds of the Drawable. Drawable is always displayed using it's own bounds, + * and not the bounds of the Drawable. Drawable is always displayed using its own bounds, * and this setting only affects the layout width of the entire span. */ public VerticallyCenteredImageSpan(Drawable drawable, boolean useOriginalWidth) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/RYDVoteData.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/RYDVoteData.java index b57eadcfd0..78841e286d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/RYDVoteData.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/RYDVoteData.java @@ -29,7 +29,7 @@ public final class RYDVoteData { private volatile long likeCount; // Read/write from different threads. /** * Like count can be hidden by video creator, but RYD still tracks the number - * of like/dislikes it received thru it's browser extension and and API. + * of like/dislikes it received through its browser extension and API. * The raw like/dislikes can be used to calculate a percentage. * * Raw values can be null, especially for older videos with little to no views. @@ -74,7 +74,7 @@ public final class RYDVoteData { } /** - * Public like count of the video, as reported by YT when RYD last updated it's data. + * Public like count of the video, as reported by YT when RYD last updated its data. * * If the likes were hidden by the video creator, then this returns an * estimated likes using the same extrapolation as the dislikes. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeAPI.java similarity index 95% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeAPI.java index 18d46282c9..7c35682209 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/requests/ReturnYouTubeDislikeAPI.java @@ -28,7 +28,7 @@ import app.revanced.extension.shared.requests.Requester; import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike; import app.revanced.extension.youtube.settings.Settings; -public class ReturnYouTubeDislikeApi { +public class ReturnYouTubeDislikeAPI { /** * {@link #fetchVotes(String)} TCP connection timeout. */ @@ -43,7 +43,7 @@ public class ReturnYouTubeDislikeApi { /** * Default connection and response timeout for voting and registration. * - * Voting and user registration runs in the background and has has no urgency + * Voting and user registration runs in the background and has no urgency * so this can be a larger value. */ private static final int API_REGISTER_VOTE_TIMEOUT_MILLISECONDS = 60 * 1000; // 60 Seconds. @@ -109,7 +109,7 @@ public class ReturnYouTubeDislikeApi { /** * Total time spent waiting for {@link #fetchVotes(String)} network call to complete. - * Value does does not persist on app shut down. + * Value does not persist on app shut down. */ private static volatile long fetchCallResponseTimeTotal; @@ -147,7 +147,7 @@ public class ReturnYouTubeDislikeApi { return numberOfRateLimitRequestsEncountered; } - private ReturnYouTubeDislikeApi() { + private ReturnYouTubeDislikeAPI() { } // utility class /** @@ -251,7 +251,7 @@ public class ReturnYouTubeDislikeApi { if (!lastApiCallFailed && Settings.RYD_TOAST_ON_CONNECTION_ERROR.get()) { if (responseCode != null && responseCode == HTTP_STATUS_CODE_UNAUTHORIZED) { Logger.printInfo(() -> "Ignoring status code " + HTTP_STATUS_CODE_UNAUTHORIZED - + " (API authorization erorr)"); + + " (API authorization error)"); return; // Do not set api failure field. } else if (toastDuration != null) { Utils.showToast(toastMessage, toastDuration); @@ -281,7 +281,7 @@ public class ReturnYouTubeDislikeApi { // request headers, as per https://returnyoutubedislike.com/docs/fetching // the documentation says to use 'Accept:text/html', but the RYD browser plugin uses 'Accept:application/json' connection.setRequestProperty("Accept", "application/json"); - connection.setRequestProperty("Connection", "keep-alive"); // keep-alive is on by default with http 1.1, but specify anyways + connection.setRequestProperty("Connection", "keep-alive"); // keep-alive is on by default with http 1.1, but specify anyway connection.setRequestProperty("Pragma", "no-cache"); connection.setRequestProperty("Cache-Control", "no-cache"); connection.setUseCaches(false); @@ -306,7 +306,7 @@ public class ReturnYouTubeDislikeApi { Logger.printDebug(() -> "Voting data fetched: " + votingData); return votingData; } catch (JSONException ex) { - Logger.printException(() -> "Failed to parse video: " + videoId + " json: " + json, ex); + Logger.printException(() -> "Failed to parse video: " + videoId + " JSON: " + json, ex); // fall thru to update statistics } } else { @@ -329,7 +329,7 @@ public class ReturnYouTubeDislikeApi { } /** - * @return The newly created and registered user id. Returns NULL if registration failed. + * @return The newly created and registered user ID. Returns NULL if registration failed. */ @Nullable public static String registerAsNewUser() { @@ -338,10 +338,10 @@ public class ReturnYouTubeDislikeApi { if (checkIfRateLimitInEffect("registerAsNewUser")) { return null; } - String userId = randomString(36); + String userID = randomString(36); Logger.printDebug(() -> "Trying to register new user"); - HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.GET_REGISTRATION, userId); + HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.GET_REGISTRATION, userID); connection.setRequestProperty("Accept", "application/json"); connection.setConnectTimeout(API_REGISTER_VOTE_TIMEOUT_MILLISECONDS); connection.setReadTimeout(API_REGISTER_VOTE_TIMEOUT_MILLISECONDS); @@ -357,7 +357,7 @@ public class ReturnYouTubeDislikeApi { int difficulty = json.getInt("difficulty"); String solution = solvePuzzle(challenge, difficulty); - return confirmRegistration(userId, solution); + return confirmRegistration(userID, solution); } handleConnectionError(str("revanced_ryd_failure_connection_status_code", responseCode), @@ -374,9 +374,9 @@ public class ReturnYouTubeDislikeApi { } @Nullable - private static String confirmRegistration(String userId, String solution) { + private static String confirmRegistration(String userID, String solution) { Utils.verifyOffMainThread(); - Objects.requireNonNull(userId); + Objects.requireNonNull(userID); Objects.requireNonNull(solution); try { if (checkIfRateLimitInEffect("confirmRegistration")) { @@ -384,7 +384,7 @@ public class ReturnYouTubeDislikeApi { } Logger.printDebug(() -> "Trying to confirm registration with solution: " + solution); - HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.CONFIRM_REGISTRATION, userId); + HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.CONFIRM_REGISTRATION, userID); applyCommonPostRequestSettings(connection); String jsonInputString = "{\"solution\": \"" + solution + "\"}"; @@ -401,12 +401,12 @@ public class ReturnYouTubeDislikeApi { } if (responseCode == HTTP_STATUS_CODE_SUCCESS) { Logger.printDebug(() -> "Registration confirmation successful"); - return userId; + return userID; } // Something went wrong, might as well disconnect. String response = Requester.parseStringAndDisconnect(connection); - Logger.printInfo(() -> "Failed to confirm registration for user: " + userId + Logger.printInfo(() -> "Failed to confirm registration for user: " + userID + " solution: " + solution + " responseCode: " + responseCode + " response: '" + response + "''"); handleConnectionError(str("revanced_ryd_failure_connection_status_code", responseCode), responseCode, null, Toast.LENGTH_LONG); @@ -416,7 +416,7 @@ public class ReturnYouTubeDislikeApi { handleConnectionError(str("revanced_ryd_failure_generic", "confirm registration failed"), null, ex, Toast.LENGTH_LONG); } catch (Exception ex) { - Logger.printException(() -> "Failed to confirm registration for user: " + userId + Logger.printException(() -> "Failed to confirm registration for user: " + userID + "solution: " + solution, ex); } return null; @@ -429,19 +429,19 @@ public class ReturnYouTubeDislikeApi { * and the network call fails, this returns NULL. */ @Nullable - private static String getUserId() { + private static String getUserID() { Utils.verifyOffMainThread(); - String userId = Settings.RYD_USER_ID.get(); - if (!userId.isEmpty()) { - return userId; + String userID = Settings.RYD_USER_ID.get(); + if (!userID.isEmpty()) { + return userID; } - userId = registerAsNewUser(); - if (userId != null) { - Settings.RYD_USER_ID.save(userId); + userID = registerAsNewUser(); + if (userID != null) { + Settings.RYD_USER_ID.save(userID); } - return userId; + return userID; } public static boolean sendVote(String videoId, ReturnYouTubeDislike.Vote vote) { @@ -450,8 +450,8 @@ public class ReturnYouTubeDislikeApi { Objects.requireNonNull(vote); try { - String userId = getUserId(); - if (userId == null) return false; + String userID = getUserID(); + if (userID == null) return false; if (checkIfRateLimitInEffect("sendVote")) { return false; @@ -461,7 +461,7 @@ public class ReturnYouTubeDislikeApi { HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.SEND_VOTE); applyCommonPostRequestSettings(connection); - String voteJsonString = "{\"userId\": \"" + userId + "\", \"videoId\": \"" + videoId + "\", \"value\": \"" + vote.value + "\"}"; + String voteJsonString = "{\"userId\": \"" + userID + "\", \"videoId\": \"" + videoId + "\", \"value\": \"" + vote.value + "\"}"; byte[] body = voteJsonString.getBytes(StandardCharsets.UTF_8); connection.setFixedLengthStreamingMode(body.length); try (OutputStream os = connection.getOutputStream()) { @@ -479,7 +479,7 @@ public class ReturnYouTubeDislikeApi { int difficulty = json.getInt("difficulty"); String solution = solvePuzzle(challenge, difficulty); - return confirmVote(videoId, userId, solution); + return confirmVote(videoId, userID, solution); } Logger.printInfo(() -> "Failed to send vote for video: " + videoId + " vote: " + vote @@ -498,10 +498,10 @@ public class ReturnYouTubeDislikeApi { return false; } - private static boolean confirmVote(String videoId, String userId, String solution) { + private static boolean confirmVote(String videoId, String userID, String solution) { Utils.verifyOffMainThread(); Objects.requireNonNull(videoId); - Objects.requireNonNull(userId); + Objects.requireNonNull(userID); Objects.requireNonNull(solution); try { @@ -512,7 +512,7 @@ public class ReturnYouTubeDislikeApi { HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.CONFIRM_VOTE); applyCommonPostRequestSettings(connection); - String jsonInputString = "{\"userId\": \"" + userId + "\", \"videoId\": \"" + videoId + "\", \"solution\": \"" + solution + "\"}"; + String jsonInputString = "{\"userId\": \"" + userID + "\", \"videoId\": \"" + videoId + "\", \"solution\": \"" + solution + "\"}"; byte[] body = jsonInputString.getBytes(StandardCharsets.UTF_8); connection.setFixedLengthStreamingMode(body.length); try (OutputStream os = connection.getOutputStream()) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java index 8aa739d206..996158160c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeAboutPreference.java @@ -3,15 +3,15 @@ package app.revanced.extension.youtube.returnyoutubedislike.ui; import android.content.Context; import android.util.AttributeSet; -import app.revanced.extension.shared.settings.preference.UrlLinkPreference; +import app.revanced.extension.shared.settings.preference.URLLinkPreference; /** * Allows tapping the RYD about preference to open the website. */ @SuppressWarnings("unused") -public class ReturnYouTubeDislikeAboutPreference extends UrlLinkPreference { +public class ReturnYouTubeDislikeAboutPreference extends URLLinkPreference { { - externalUrl = "https://returnyoutubedislike.com"; + externalURL = "https://returnyoutubedislike.com"; } public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java index dac275e4fc..67764d02be 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ui/ReturnYouTubeDislikeDebugStatsPreferenceCategory.java @@ -11,7 +11,7 @@ import android.view.ViewGroup; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.settings.BaseSettings; -import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi; +import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeAPI; @SuppressWarnings({"unused", "deprecation"}) public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends PreferenceCategory { @@ -63,22 +63,22 @@ public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends Preference addStatisticPreference( "revanced_ryd_statistics_getFetchCallResponseTimeAverage_title", - createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeAverage()) + createMillisecondStringFromNumber(ReturnYouTubeDislikeAPI.getFetchCallResponseTimeAverage()) ); addStatisticPreference( "revanced_ryd_statistics_getFetchCallResponseTimeMin_title", - createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMin()) + createMillisecondStringFromNumber(ReturnYouTubeDislikeAPI.getFetchCallResponseTimeMin()) ); addStatisticPreference( "revanced_ryd_statistics_getFetchCallResponseTimeMax_title", - createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMax()) + createMillisecondStringFromNumber(ReturnYouTubeDislikeAPI.getFetchCallResponseTimeMax()) ); String fetchCallTimeWaitingLastSummary; - final long fetchCallTimeWaitingLast = ReturnYouTubeDislikeApi.getFetchCallResponseTimeLast(); - if (fetchCallTimeWaitingLast == ReturnYouTubeDislikeApi.FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT) { + final long fetchCallTimeWaitingLast = ReturnYouTubeDislikeAPI.getFetchCallResponseTimeLast(); + if (fetchCallTimeWaitingLast == ReturnYouTubeDislikeAPI.FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT) { fetchCallTimeWaitingLastSummary = str("revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary"); } else { fetchCallTimeWaitingLastSummary = createMillisecondStringFromNumber(fetchCallTimeWaitingLast); @@ -90,7 +90,7 @@ public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends Preference addStatisticPreference( "revanced_ryd_statistics_getFetchCallCount_title", - createSummaryText(ReturnYouTubeDislikeApi.getFetchCallCount(), + createSummaryText(ReturnYouTubeDislikeAPI.getFetchCallCount(), "revanced_ryd_statistics_getFetchCallCount_zero_summary", "revanced_ryd_statistics_getFetchCallCount_non_zero_summary" ) @@ -98,7 +98,7 @@ public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends Preference addStatisticPreference( "revanced_ryd_statistics_getFetchCallNumberOfFailures_title", - createSummaryText(ReturnYouTubeDislikeApi.getFetchCallNumberOfFailures(), + createSummaryText(ReturnYouTubeDislikeAPI.getFetchCallNumberOfFailures(), "revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary", "revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary" ) @@ -106,7 +106,7 @@ public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends Preference addStatisticPreference( "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title", - createSummaryText(ReturnYouTubeDislikeApi.getNumberOfRateLimitRequestsEncountered(), + createSummaryText(ReturnYouTubeDislikeAPI.getNumberOfRateLimitRequestsEncountered(), "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary", "revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary" ) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index d2b41b229b..da8d9d4e95 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -18,7 +18,6 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerH import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType; -import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability; import static app.revanced.extension.youtube.patches.litho.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; import static app.revanced.extension.youtube.patches.spoof.SpoofVideoStreamsPatch.SpoofClientAv1Availability; import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle; @@ -56,6 +55,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting DISABLE_HDR_VIDEO = new BooleanSetting("revanced_disable_hdr_video", FALSE); public static final BooleanSetting FORCE_AVC_CODEC = new BooleanSetting("revanced_force_avc_codec", FALSE, true, "revanced_force_avc_codec_user_dialog_message"); public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", TRUE, true); + public static final BooleanSetting HIDE_PREMIUM_VIDEO_QUALITY = new BooleanSetting("revanced_hide_premium_video_quality", TRUE, true); public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2); public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2); public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE); @@ -80,16 +80,15 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_CREATOR_STORE_SHELF = new BooleanSetting("revanced_hide_creator_store_shelf", TRUE); public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true); public static final BooleanSetting HIDE_FULLSCREEN_ADS = new BooleanSetting("revanced_hide_fullscreen_ads", TRUE); + public static final BooleanSetting HIDE_PLAYER_POPUP_ADS = new BooleanSetting("revanced_hide_player_popup_ads", TRUE); public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE); - public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE); - public static final BooleanSetting HIDE_LATEST_POSTS = new BooleanSetting("revanced_hide_latest_posts", TRUE); public static final BooleanSetting HIDE_MERCHANDISE_BANNERS = new BooleanSetting("revanced_hide_merchandise_banners", TRUE); public static final BooleanSetting HIDE_PAID_PROMOTION_LABEL = new BooleanSetting("revanced_hide_paid_promotion_label", TRUE); public static final BooleanSetting HIDE_SELF_SPONSOR = new BooleanSetting("revanced_hide_self_sponsor_ads", TRUE); public static final BooleanSetting HIDE_SHOPPING_LINKS = new BooleanSetting("revanced_hide_shopping_links", TRUE); public static final BooleanSetting HIDE_VIDEO_ADS = new BooleanSetting("revanced_hide_video_ads", TRUE, true); public static final BooleanSetting HIDE_VIEW_PRODUCTS_BANNER = new BooleanSetting("revanced_hide_view_products_banner", TRUE); - public static final BooleanSetting HIDE_WEB_SEARCH_RESULTS = new BooleanSetting("revanced_hide_web_search_results", TRUE); + public static final BooleanSetting HIDE_YOUTUBE_PREMIUM_PROMOTIONS = new BooleanSetting("revanced_hide_youtube_premium_promotions", TRUE); // Feed public static final BooleanSetting HIDE_ALBUM_CARDS = new BooleanSetting("revanced_hide_album_cards", FALSE, true); @@ -97,8 +96,10 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_CHIPS_SHELF = new BooleanSetting("revanced_hide_chips_shelf", TRUE); public static final BooleanSetting HIDE_COMMUNITY_POSTS = new BooleanSetting("revanced_hide_community_posts", FALSE); public static final BooleanSetting HIDE_COMPACT_BANNER = new BooleanSetting("revanced_hide_compact_banner", TRUE); - public static final BooleanSetting HIDE_DOODLES = new BooleanSetting("revanced_hide_doodles", FALSE, true, "revanced_hide_doodles_user_dialog_message"); + public static final BooleanSetting HIDE_DOODLES = new BooleanSetting("revanced_hide_doodles", FALSE, true); public static final BooleanSetting HIDE_EXPANDABLE_CARD = new BooleanSetting("revanced_hide_expandable_card", TRUE); + public static final BooleanSetting HIDE_FEED_FLYOUT_MENU = new BooleanSetting("revanced_hide_feed_flyout_menu", FALSE); + public static final StringSetting HIDE_FEED_FLYOUT_MENU_FILTER_STRINGS = new StringSetting("revanced_hide_feed_flyout_menu_filter_strings", "", true, parent(HIDE_FEED_FLYOUT_MENU)); public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_FEED = new BooleanSetting("revanced_hide_filter_bar_feed_in_feed", FALSE, true); public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_HISTORY = new BooleanSetting("revanced_hide_filter_bar_feed_in_history", FALSE); public static final BooleanSetting HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS = new BooleanSetting("revanced_hide_filter_bar_feed_in_related_videos", FALSE, true); @@ -106,16 +107,21 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_FLOATING_MICROPHONE_BUTTON = new BooleanSetting("revanced_hide_floating_microphone_button", TRUE, true); public static final BooleanSetting HIDE_HORIZONTAL_SHELVES = new BooleanSetting("revanced_hide_horizontal_shelves", TRUE); public static final BooleanSetting HIDE_IMAGE_SHELF = new BooleanSetting("revanced_hide_image_shelf", TRUE); + public static final BooleanSetting HIDE_LATEST_POSTS = new BooleanSetting("revanced_hide_latest_posts", TRUE); + public static final BooleanSetting HIDE_LATEST_VIDEOS_BUTTON = new BooleanSetting("revanced_hide_latest_videos_button", FALSE); public static final BooleanSetting HIDE_MIX_PLAYLISTS = new BooleanSetting("revanced_hide_mix_playlists", TRUE); public static final BooleanSetting HIDE_MOVIES_SECTION = new BooleanSetting("revanced_hide_movies_section", TRUE); public static final BooleanSetting HIDE_NOTIFY_ME_BUTTON = new BooleanSetting("revanced_hide_notify_me_button", TRUE); public static final BooleanSetting HIDE_PLAYABLES = new BooleanSetting("revanced_hide_playables", TRUE); public static final BooleanSetting HIDE_SHOW_MORE_BUTTON = new BooleanSetting("revanced_hide_show_more_button", TRUE, true); + public static final BooleanSetting HIDE_SUBSCRIBED_CHANNELS_BAR = new BooleanSetting("revanced_hide_subscribed_channels_bar", FALSE, true); public static final BooleanSetting HIDE_SURVEYS = new BooleanSetting("revanced_hide_surveys", TRUE); public static final BooleanSetting HIDE_TICKET_SHELF = new BooleanSetting("revanced_hide_ticket_shelf", FALSE); public static final BooleanSetting HIDE_UPLOAD_TIME = new BooleanSetting("revanced_hide_upload_time", FALSE, "revanced_hide_upload_time_user_dialog_message"); public static final BooleanSetting HIDE_VIDEO_RECOMMENDATION_LABELS = new BooleanSetting("revanced_hide_video_recommendation_labels", TRUE); public static final BooleanSetting HIDE_VIEW_COUNT = new BooleanSetting("revanced_hide_view_count", FALSE, "revanced_hide_view_count_user_dialog_message"); + public static final BooleanSetting HIDE_WEB_SEARCH_RESULTS = new BooleanSetting("revanced_hide_web_search_results", TRUE); + public static final BooleanSetting HIDE_YOU_MAY_LIKE_SECTION = new BooleanSetting("revanced_hide_you_may_like_section", TRUE, true); public static final BooleanSetting HIDE_VISUAL_SPACER = new BooleanSetting("revanced_hide_visual_spacer", TRUE); // Alternative thumbnails @@ -138,6 +144,8 @@ public class Settings extends YouTubeAndMusicSettings { parentsAny(HIDE_KEYWORD_CONTENT_HOME, HIDE_KEYWORD_CONTENT_SUBSCRIPTIONS, HIDE_KEYWORD_CONTENT_SEARCH)); // Channel page + public static final BooleanSetting HIDE_CHANNEL_TAB = new BooleanSetting("revanced_hide_channel_tab", FALSE); + public static final StringSetting HIDE_CHANNEL_TAB_FILTER_STRINGS = new StringSetting("revanced_hide_channel_tab_filter_strings", "", true, parent(HIDE_CHANNEL_TAB)); public static final BooleanSetting HIDE_COMMUNITY_BUTTON = new BooleanSetting("revanced_hide_community_button", TRUE); public static final BooleanSetting HIDE_FOR_YOU_SHELF = new BooleanSetting("revanced_hide_for_you_shelf", FALSE); public static final BooleanSetting HIDE_JOIN_BUTTON = new BooleanSetting("revanced_hide_join_button", FALSE); @@ -151,21 +159,31 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting COPY_VIDEO_URL_TIMESTAMP = new BooleanSetting("revanced_copy_video_url_timestamp", TRUE); public static final BooleanSetting DISABLE_AUTO_CAPTIONS = new BooleanSetting("revanced_disable_auto_captions", FALSE, true); public static final BooleanSetting DISABLE_CHAPTER_SKIP_DOUBLE_TAP = new BooleanSetting("revanced_disable_chapter_skip_double_tap", FALSE); + public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_CHAPTERS = new BooleanSetting("revanced_disable_haptic_feedback_chapters", FALSE); + public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_PRECISE_SEEKING = new BooleanSetting("revanced_disable_haptic_feedback_precise_seeking", FALSE); + public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_SEEK_UNDO = new BooleanSetting("revanced_disable_haptic_feedback_seek_undo", FALSE); + public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_TAP_AND_HOLD = new BooleanSetting("revanced_disable_haptic_feedback_tap_and_hold", FALSE); + public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_ZOOM = new BooleanSetting("revanced_disable_haptic_feedback_zoom", FALSE); + public static final BooleanSetting DISABLE_PLAYER_POPUP_PANELS = new BooleanSetting("revanced_disable_player_popup_panels", FALSE); public static final BooleanSetting DISABLE_FULLSCREEN_AMBIENT_MODE = new BooleanSetting("revanced_disable_fullscreen_ambient_mode", TRUE, true); public static final BooleanSetting DISABLE_ROLLING_NUMBER_ANIMATIONS = new BooleanSetting("revanced_disable_rolling_number_animations", FALSE); public static final EnumSetting EXIT_FULLSCREEN = new EnumSetting<>("revanced_exit_fullscreen", FullscreenMode.DISABLED); public static final BooleanSetting HIDE_AUTOPLAY_BUTTON = new BooleanSetting("revanced_hide_autoplay_button", TRUE, true); + public static final BooleanSetting HIDE_AUTOPLAY_PREVIEW = new BooleanSetting("revanced_hide_autoplay_preview", FALSE, true); public static final BooleanSetting HIDE_CAPTIONS_BUTTON = new BooleanSetting("revanced_hide_captions_button", FALSE); public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_hide_cast_button", TRUE, true); + public static final BooleanSetting HIDE_COLLAPSE_BUTTON = new BooleanSetting("revanced_hide_collapse_button", FALSE, true); public static final BooleanSetting HIDE_CHANNEL_BAR = new BooleanSetting("revanced_hide_channel_bar", FALSE); public static final BooleanSetting HIDE_CHANNEL_WATERMARK = new BooleanSetting("revanced_hide_channel_watermark", TRUE); public static final BooleanSetting HIDE_CROWDFUNDING_BOX = new BooleanSetting("revanced_hide_crowdfunding_box", FALSE, true); public static final BooleanSetting HIDE_EMERGENCY_BOX = new BooleanSetting("revanced_hide_emergency_box", TRUE); - public static final BooleanSetting HIDE_ENDSCREEN_CARDS = new BooleanSetting("revanced_hide_endscreen_cards", FALSE); + public static final BooleanSetting HIDE_END_SCREEN_CARDS = new BooleanSetting("revanced_hide_end_screen_cards", FALSE); public static final BooleanSetting HIDE_END_SCREEN_SUGGESTED_VIDEO = new BooleanSetting("revanced_end_screen_suggested_video", FALSE, true); + public static final BooleanSetting HIDE_FULLSCREEN_BUTTON = new BooleanSetting("revanced_hide_fullscreen_button", FALSE, true); public static final BooleanSetting HIDE_INFO_CARDS = new BooleanSetting("revanced_hide_info_cards", FALSE); public static final BooleanSetting HIDE_INFO_PANELS = new BooleanSetting("revanced_hide_info_panels", TRUE); - public static final BooleanSetting HIDE_JOIN_MEMBERSHIP_BUTTON = new BooleanSetting("revanced_hide_join_membership_button", TRUE); + public static final BooleanSetting HIDE_JOIN_MEMBERSHIP_BUTTON = new BooleanSetting("revanced_hide_join_membership_button", TRUE, parentNot(HIDE_CHANNEL_BAR)); + public static final BooleanSetting HIDE_LIVE_CHAT_REPLAY_BUTTON = new BooleanSetting("revanced_hide_live_chat_replay_button", FALSE); public static final BooleanSetting HIDE_MEDICAL_PANELS = new BooleanSetting("revanced_hide_medical_panels", TRUE); public static final BooleanSetting HIDE_PLAYER_CONTROL_BUTTONS_BACKGROUND = new BooleanSetting("revanced_hide_player_control_buttons_background", FALSE, true); public static final BooleanSetting HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS = new BooleanSetting("revanced_hide_player_previous_next_buttons", FALSE, true); @@ -174,11 +192,11 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_RELATED_VIDEOS = new BooleanSetting("revanced_hide_related_videos", FALSE); public static final BooleanSetting HIDE_SUBSCRIBERS_COMMUNITY_GUIDELINES = new BooleanSetting("revanced_hide_subscribers_community_guidelines", TRUE); public static final BooleanSetting HIDE_TIMED_REACTIONS = new BooleanSetting("revanced_hide_timed_reactions", TRUE); + public static final BooleanSetting HIDE_VIDEO_TITLE = new BooleanSetting("revanced_hide_video_title", FALSE); public static final BooleanSetting OPEN_VIDEOS_FULLSCREEN_PORTRAIT = new BooleanSetting("revanced_open_videos_fullscreen_portrait", FALSE); public static final BooleanSetting PLAYBACK_SPEED_DIALOG_BUTTON = new BooleanSetting("revanced_playback_speed_dialog_button", FALSE); public static final BooleanSetting VIDEO_QUALITY_DIALOG_BUTTON = new BooleanSetting("revanced_video_quality_dialog_button", FALSE); public static final IntegerSetting PLAYER_OVERLAY_OPACITY = new IntegerSetting("revanced_player_overlay_opacity", 100, true); - public static final BooleanSetting PLAYER_POPUP_PANELS = new BooleanSetting("revanced_hide_player_popup_panels", FALSE); // Miniplayer public static final EnumSetting MINIPLAYER_TYPE = new EnumSetting<>("revanced_miniplayer_type", MiniplayerType.DEFAULT, true); @@ -208,6 +226,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_COMMENTS_PREVIEW_COMMENT = new BooleanSetting("revanced_hide_comments_preview_comment", FALSE); public static final BooleanSetting HIDE_COMMENTS_EMOJI_AND_TIMESTAMP_BUTTONS = new BooleanSetting("revanced_hide_comments_emoji_and_timestamp_buttons", FALSE); public static final BooleanSetting HIDE_COMMENTS_SECTION = new BooleanSetting("revanced_hide_comments_section", FALSE); + public static final BooleanSetting HIDE_COMMENTS_SECTION_IN_HOME_FEED = new BooleanSetting("revanced_hide_comments_section_in_home_feed", FALSE, parentNot(HIDE_COMMENTS_SECTION)); public static final BooleanSetting HIDE_COMMENTS_THANKS_BUTTON = new BooleanSetting("revanced_hide_comments_thanks_button", TRUE); // Description @@ -215,6 +234,12 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_ASK_SECTION = new BooleanSetting("revanced_hide_ask_section", FALSE); public static final BooleanSetting HIDE_ATTRIBUTES_SECTION = new BooleanSetting("revanced_hide_attributes_section", FALSE); public static final BooleanSetting HIDE_CHAPTERS_SECTION = new BooleanSetting("revanced_hide_chapters_section", TRUE); + public static final BooleanSetting HIDE_COURSE_PROGRESS_SECTION = new BooleanSetting("revanced_hide_course_progress_section", FALSE); + public static final BooleanSetting HIDE_EXPLORE_SECTION = new BooleanSetting("revanced_hide_explore_section", TRUE); + public static final BooleanSetting HIDE_EXPLORE_COURSE_SECTION = new BooleanSetting("revanced_hide_explore_course_section", FALSE, parentNot(HIDE_EXPLORE_SECTION)); + public static final BooleanSetting HIDE_EXPLORE_PODCAST_SECTION = new BooleanSetting("revanced_hide_explore_podcast_section", FALSE, parentNot(HIDE_EXPLORE_SECTION)); + public static final BooleanSetting HIDE_FEATURED_PLACES_SECTION = new BooleanSetting("revanced_hide_featured_places_section", FALSE); + public static final BooleanSetting HIDE_GAMING_SECTION = new BooleanSetting("revanced_hide_gaming_section", FALSE); public static final BooleanSetting HIDE_HOW_THIS_WAS_MADE_SECTION = new BooleanSetting("revanced_hide_how_this_was_made_section", FALSE); public static final BooleanSetting HIDE_HYPE_POINTS = new BooleanSetting("revanced_hide_hype_points", FALSE); public static final BooleanSetting HIDE_INFO_CARDS_SECTION = new BooleanSetting("revanced_hide_info_cards_section", TRUE); @@ -222,14 +247,15 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_FEATURED_VIDEOS_SECTION = new BooleanSetting("revanced_hide_featured_videos_section", FALSE, parentNot(HIDE_INFO_CARDS_SECTION)); public static final BooleanSetting HIDE_SUBSCRIBE_BUTTON = new BooleanSetting("revanced_hide_subscribe_button", FALSE, parentNot(HIDE_INFO_CARDS_SECTION)); public static final BooleanSetting HIDE_KEY_CONCEPTS_SECTION = new BooleanSetting("revanced_hide_key_concepts_section", FALSE); - public static final BooleanSetting HIDE_PODCAST_SECTION = new BooleanSetting("revanced_hide_podcast_section", TRUE); + public static final BooleanSetting HIDE_MUSIC_SECTION = new BooleanSetting("revanced_hide_music_section", FALSE); public static final BooleanSetting HIDE_TRANSCRIPT_SECTION = new BooleanSetting("revanced_hide_transcript_section", TRUE); + public static final BooleanSetting HIDE_QUIZZES_SECTION = new BooleanSetting("revanced_hide_quizzes_section", FALSE); // Action buttons public static final BooleanSetting DISABLE_LIKE_SUBSCRIBE_GLOW = new BooleanSetting("revanced_disable_like_subscribe_glow", FALSE); public static final BooleanSetting HIDE_ASK_BUTTON = new BooleanSetting("revanced_hide_ask_button", FALSE); - public static final BooleanSetting HIDE_CLIP_BUTTON = new BooleanSetting("revanced_hide_clip_button", TRUE); - public static final BooleanSetting HIDE_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_comments_button", TRUE); + public static final BooleanSetting HIDE_CLIP_BUTTON = new BooleanSetting("revanced_hide_clip_button", FALSE, "revanced_hide_clip_button_user_dialog_message"); + public static final BooleanSetting HIDE_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_comments_button", FALSE); public static final BooleanSetting HIDE_DOWNLOAD_BUTTON = new BooleanSetting("revanced_hide_download_button", FALSE); public static final BooleanSetting HIDE_HYPE_BUTTON = new BooleanSetting("revanced_hide_hype_button", FALSE); public static final BooleanSetting HIDE_LIKE_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_like_dislike_button", FALSE); @@ -256,7 +282,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_PLAYER_FLYOUT_STABLE_VOLUME = new BooleanSetting("revanced_hide_player_flyout_stable_volume", FALSE); public static final BooleanSetting HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER = new BooleanSetting("revanced_hide_player_flyout_video_quality_footer", FALSE); public static final BooleanSetting HIDE_PLAYER_FLYOUT_VIDEO_QUALITY = new BooleanSetting("revanced_hide_player_flyout_video_quality", FALSE); - public static final BooleanSetting HIDE_PLAYER_FLYOUT_WATCH_IN_VR = new BooleanSetting("revanced_hide_player_flyout_watch_in_vr", TRUE); + public static final BooleanSetting HIDE_PLAYER_FLYOUT_WATCH_IN_VR = new BooleanSetting("revanced_hide_player_flyout_watch_in_vr", FALSE); // General layout public static final BooleanSetting RESTORE_OLD_SETTINGS_MENUS = new BooleanSetting("revanced_restore_old_settings_menus", FALSE, true); @@ -265,22 +291,22 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true); public static final EnumSetting SPLASH_SCREEN_ANIMATION_STYLE = new EnumSetting<>("revanced_splash_screen_animation_style", SplashScreenAnimationStyle.FPS_60_ONE_SECOND, true); public static final EnumSetting HEADER_LOGO = new EnumSetting<>("revanced_header_logo", HeaderLogo.DEFAULT, true); - public static final BooleanSetting DISABLE_SIGNIN_TO_TV_POPUP = new BooleanSetting("revanced_disable_signin_to_tv_popup", FALSE); + public static final BooleanSetting DISABLE_SIGN_IN_TO_TV_POPUP = new BooleanSetting("revanced_disable_sign_in_to_tv_popup", FALSE); public static final BooleanSetting REMOVE_VIEWER_DISCRETION_DIALOG = new BooleanSetting("revanced_remove_viewer_discretion_dialog", FALSE, "revanced_remove_viewer_discretion_dialog_user_dialog_message"); public static final BooleanSetting SPOOF_APP_VERSION = new BooleanSetting("revanced_spoof_app_version", FALSE, true, "revanced_spoof_app_version_user_dialog_message"); - public static final BooleanSetting WIDE_SEARCHBAR = new BooleanSetting("revanced_wide_searchbar", FALSE, true); public static final EnumSetting CHANGE_START_PAGE = new EnumSetting<>("revanced_change_start_page", StartPage.DEFAULT, true); public static final BooleanSetting CHANGE_START_PAGE_ALWAYS = new BooleanSetting("revanced_change_start_page_always", FALSE, true, new ChangeStartPageTypeAvailability()); - public static final StringSetting SPOOF_APP_VERSION_TARGET = new StringSetting("revanced_spoof_app_version_target", "19.01.34", true, parent(SPOOF_APP_VERSION)); + public static final StringSetting SPOOF_APP_VERSION_TARGET = new StringSetting("revanced_spoof_app_version_target", "19.35.36", true, parent(SPOOF_APP_VERSION)); // Navigation buttons public static final BooleanSetting HIDE_HOME_BUTTON = new BooleanSetting("revanced_hide_home_button", FALSE, true); public static final BooleanSetting HIDE_CREATE_BUTTON = new BooleanSetting("revanced_hide_create_button", TRUE, true); public static final BooleanSetting HIDE_SHORTS_BUTTON = new BooleanSetting("revanced_hide_shorts_button", TRUE, true); public static final BooleanSetting HIDE_SUBSCRIPTIONS_BUTTON = new BooleanSetting("revanced_hide_subscriptions_button", FALSE, true); public static final BooleanSetting HIDE_NAVIGATION_BUTTON_LABELS = new BooleanSetting("revanced_hide_navigation_button_labels", FALSE, true); + public static final BooleanSetting NARROW_NAVIGATION_BUTTONS = new BooleanSetting("revanced_narrow_navigation_buttons", FALSE, true); public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true); public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); @@ -290,11 +316,19 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = new BooleanSetting("revanced_disable_translucent_navigation_bar_dark", FALSE, true); + // Toolbar + public static final BooleanSetting HIDE_TOOLBAR_CREATE_BUTTON = new BooleanSetting("revanced_hide_toolbar_create_button", TRUE, true); + public static final BooleanSetting HIDE_TOOLBAR_NOTIFICATION_BUTTON = new BooleanSetting("revanced_hide_toolbar_notification_button", FALSE, true); + public static final BooleanSetting HIDE_TOOLBAR_SEARCH_BUTTON = new BooleanSetting("revanced_hide_toolbar_search_button", FALSE, true); + public static final BooleanSetting WIDE_SEARCHBAR = new BooleanSetting("revanced_wide_searchbar", FALSE, true); + // Shorts public static final BooleanSetting DISABLE_RESUMING_SHORTS_PLAYER = new BooleanSetting("revanced_disable_resuming_shorts_player", FALSE); public static final BooleanSetting DISABLE_SHORTS_BACKGROUND_PLAYBACK = new BooleanSetting("revanced_shorts_disable_background_playback", FALSE); public static final EnumSetting SHORTS_PLAYER_TYPE = new EnumSetting<>("revanced_shorts_player_type", ShortsPlayerType.SHORTS_PLAYER); + public static final BooleanSetting HIDE_SHORTS_AI_BUTTON = new BooleanSetting("revanced_hide_shorts_ai_button", FALSE); public static final BooleanSetting HIDE_SHORTS_AUTO_DUBBED_LABEL = new BooleanSetting("revanced_hide_shorts_auto_dubbed_label", FALSE); + public static final BooleanSetting HIDE_SHORTS_CHANNEL = new BooleanSetting("revanced_hide_shorts_channel", FALSE); public static final BooleanSetting HIDE_SHORTS_CHANNEL_BAR = new BooleanSetting("revanced_hide_shorts_channel_bar", FALSE); public static final BooleanSetting HIDE_SHORTS_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_shorts_comments_button", FALSE); public static final BooleanSetting HIDE_SHORTS_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_shorts_dislike_button", FALSE); @@ -330,6 +364,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_SHORTS_UPCOMING_BUTTON = new BooleanSetting("revanced_hide_shorts_upcoming_button", TRUE); public static final BooleanSetting HIDE_SHORTS_USE_SOUND_BUTTON = new BooleanSetting("revanced_hide_shorts_use_sound_button", TRUE); public static final BooleanSetting HIDE_SHORTS_USE_TEMPLATE_BUTTON = new BooleanSetting("revanced_hide_shorts_use_template_button", TRUE); + public static final BooleanSetting HIDE_SHORTS_VIDEO_DESCRIPTION = new BooleanSetting("revanced_hide_shorts_video_description", FALSE); public static final BooleanSetting HIDE_SHORTS_VIDEO_TITLE = new BooleanSetting("revanced_hide_shorts_video_title", FALSE); public static final BooleanSetting SHORTS_AUTOPLAY = new BooleanSetting("revanced_shorts_autoplay", FALSE); public static final BooleanSetting SHORTS_AUTOPLAY_BACKGROUND = new BooleanSetting("revanced_shorts_autoplay_background", TRUE); @@ -340,11 +375,8 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE, true); public static final BooleanSetting FULLSCREEN_LARGE_SEEKBAR = new BooleanSetting("revanced_fullscreen_large_seekbar", FALSE); public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE); - public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE); - public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE); - public static final BooleanSetting SEEKBAR_THUMBNAILS_HIGH_QUALITY = new BooleanSetting("revanced_seekbar_thumbnails_high_quality", FALSE, true, - "revanced_seekbar_thumbnails_high_quality_dialog_message", new SeekbarThumbnailsHighQualityAvailability()); public static final BooleanSetting SLIDE_TO_SEEK = new BooleanSetting("revanced_slide_to_seek", FALSE, true); + public static final BooleanSetting TAP_TO_SEEK = new BooleanSetting("revanced_tap_to_seek", FALSE); public static final BooleanSetting SEEKBAR_CUSTOM_COLOR = new BooleanSetting("revanced_seekbar_custom_color", FALSE, true); public static final StringSetting SEEKBAR_CUSTOM_COLOR_PRIMARY = new StringSetting("revanced_seekbar_custom_color_primary", "#FF0033", true, parent(SEEKBAR_CUSTOM_COLOR)); public static final StringSetting SEEKBAR_CUSTOM_COLOR_ACCENT = new StringSetting("revanced_seekbar_custom_color_accent", "#FF2791", true, parent(SEEKBAR_CUSTOM_COLOR)); @@ -356,10 +388,6 @@ public class Settings extends YouTubeAndMusicSettings { public static final BooleanSetting LOOP_VIDEO_BUTTON = new BooleanSetting("revanced_loop_video_button", FALSE); public static final BooleanSetting PAUSE_ON_AUDIO_INTERRUPT = new BooleanSetting("revanced_pause_on_audio_interrupt", FALSE, true); public static final BooleanSetting BYPASS_URL_REDIRECTS = new BooleanSetting("revanced_bypass_url_redirects", TRUE); - public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_CHAPTERS = new BooleanSetting("revanced_disable_haptic_feedback_chapters", FALSE); - public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_PRECISE_SEEKING = new BooleanSetting("revanced_disable_haptic_feedback_precise_seeking", FALSE); - public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_SEEK_UNDO = new BooleanSetting("revanced_disable_haptic_feedback_seek_undo", FALSE); - public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_ZOOM = new BooleanSetting("revanced_disable_haptic_feedback_zoom", FALSE); public static final BooleanSetting EXTERNAL_BROWSER = new BooleanSetting("revanced_external_browser", TRUE, true); public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true, "revanced_spoof_device_dimensions_user_dialog_message"); @@ -536,10 +564,6 @@ public class Settings extends YouTubeAndMusicSettings { SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault(); } - // RYD requires manually migrating old settings since the lack of - // a "revanced_" on the old setting causes duplicate key exceptions during export. - Setting.migrateFromOldPreferences(Setting.preferences, RYD_USER_ID, "ryd_user_id"); - // Migrate old saved data. Must be done here before the settings can be used by any other code. applyOldSbOpacityToColor(SB_CATEGORY_SPONSOR_COLOR, DEPRECATED_SB_CATEGORY_SPONSOR_OPACITY); applyOldSbOpacityToColor(SB_CATEGORY_SELF_PROMO_COLOR, DEPRECATED_SB_CATEGORY_SELF_PROMO_OPACITY); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java index 0d7e1c70de..d95069898d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java @@ -31,6 +31,7 @@ public class YouTubeActivityHook extends BaseActivityHook { private static final boolean USE_BOLD_ICONS = VersionCheckPatch.IS_20_31_OR_GREATER && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get() + && !Settings.RESTORE_OLD_SETTINGS_MENUS.get() && (System.currentTimeMillis() - Settings.FIRST_TIME_APP_LAUNCHED.get()) > MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java index fd213ca0e4..218d31eeaa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/AlternativeThumbnailsAboutDeArrowPreference.java @@ -2,15 +2,15 @@ package app.revanced.extension.youtube.settings.preference; import android.content.Context; import android.util.AttributeSet; -import app.revanced.extension.shared.settings.preference.UrlLinkPreference; +import app.revanced.extension.shared.settings.preference.URLLinkPreference; /** * Allows tapping the DeArrow about preference to open the DeArrow website. */ @SuppressWarnings("unused") -public class AlternativeThumbnailsAboutDeArrowPreference extends UrlLinkPreference { +public class AlternativeThumbnailsAboutDeArrowPreference extends URLLinkPreference { { - externalUrl = "https://dearrow.ajay.app"; + externalURL = "https://dearrow.ajay.app"; } public AlternativeThumbnailsAboutDeArrowPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java index cf55dcc5dd..88c5c9bffe 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java @@ -247,7 +247,7 @@ public class ExternalDownloaderPreference extends CustomDialogListPreference { } else { String savedPackageName = Settings.EXTERNAL_DOWNLOADER_PACKAGE_NAME.get(); editText.setText(Downloader.findByPackageName(savedPackageName) == null - ? savedPackageName // If the user is clicking thru options then retain existing other app. + ? savedPackageName // If the user is clicking through options then retain existing other app. : "" ); editText.setEnabled(true); // Enable editing for Custom. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HTMLPreference.java similarity index 65% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HTMLPreference.java index 1994bf3681..38852c5b76 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HtmlPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/HTMLPreference.java @@ -8,27 +8,27 @@ import android.text.Html; import android.util.AttributeSet; /** - * Allows using basic html for the summary text. + * Allows using basic HTML for the summary text. */ @SuppressWarnings({"unused", "deprecation"}) -public class HtmlPreference extends Preference { +public class HTMLPreference extends Preference { { setSummary(Html.fromHtml(getSummary().toString(), FROM_HTML_MODE_COMPACT)); } - public HtmlPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + public HTMLPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } - public HtmlPreference(Context context, AttributeSet attrs, int defStyleAttr) { + public HTMLPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - public HtmlPreference(Context context, AttributeSet attrs) { + public HTMLPreference(Context context, AttributeSet attrs) { super(context, attrs); } - public HtmlPreference(Context context) { + public HTMLPreference(Context context) { super(context); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/EngagementPanel.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/EngagementPanel.java new file mode 100644 index 0000000000..773e9c583e --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/EngagementPanel.java @@ -0,0 +1,42 @@ +package app.revanced.extension.youtube.shared; + +import androidx.annotation.Nullable; + +import java.util.concurrent.atomic.AtomicReference; + +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public final class EngagementPanel { + private static final AtomicReference lastEngagementPanelId = new AtomicReference<>(""); + + /** + * Injection point. + */ + public static void close() { + String panelId = getId(); + if (!panelId.isEmpty()) { + lastEngagementPanelId.set(""); + Logger.printDebug(() -> "EngagementPanel closed, Last panel id: " + panelId); + } + } + + /** + * Injection point. + */ + public static void open(@Nullable String panelId) { + if (panelId != null && !panelId.isEmpty()) { + lastEngagementPanelId.set(panelId); + Logger.printDebug(() -> "EngagementPanel open, New panel id: " + panelId); + } + } + + public static boolean isDescription() { + return getId().equals("video-description-ep-identifier"); + } + + private static String getId() { + return lastEngagementPanelId.get(); + } + +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/Event.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/Event.kt similarity index 94% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/Event.kt rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/Event.kt index 802c995b37..d8f7258c05 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/Event.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/Event.kt @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube +package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger import java.util.Collections @@ -31,4 +31,4 @@ class Event { observer.invoke(value) } } -} +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index 52d2f1dcf4..8f15b79c51 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -147,7 +147,7 @@ public final class NavigationBar { } if (Utils.isCurrentlyOnMainThread()) { - // The latch is released from the main thread, and waiting from the main thread will always timeout. + // The latch is released from the main thread, and waiting from the main thread will always time out. // This situation has only been observed when navigating out of a submenu and not changing tabs. // and for that use case the nav bar does not change so it's safe to return here. Logger.printDebug(() -> "Cannot block main thread waiting for nav button. " + @@ -307,7 +307,7 @@ public final class NavigationBar { SHORTS("TAB_SHORTS", "TAB_SHORTS_CAIRO"), /** * Create new video tab. - * This tab will never be in a selected state, even if the create video UI is on screen. + * This tab will never be in a selected state, even if the Create video UI is on screen. */ CREATE("CREATION_TAB_LARGE", "CREATION_TAB_LARGE_CAIRO"), /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibility.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibility.kt index 5585bc157a..161dc6b73e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibility.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibility.kt @@ -1,7 +1,7 @@ package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger -import app.revanced.extension.youtube.Event +import app.revanced.extension.youtube.shared.Event /** * PlayerControls visibility state. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt index f5c51c5f39..ecf71cb05c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt @@ -17,7 +17,7 @@ class PlayerControlsVisibilityObserverImpl( ) : PlayerControlsVisibilityObserver { /** - * id of the direct parent of controls_layout, R.id.youtube_controls_overlay + * ID of the direct parent of controls_layout, R.id.youtube_controls_overlay */ private val controlsLayoutParentId = Utils.getResourceIdentifier(activity, ResourceType.ID, "youtube_controls_overlay") diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerOverlays.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerOverlays.kt index ec82053fa1..6706c5c7be 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerOverlays.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerOverlays.kt @@ -2,7 +2,7 @@ package app.revanced.extension.youtube.shared import android.view.View import android.view.ViewGroup -import app.revanced.extension.youtube.Event +import app.revanced.extension.youtube.shared.Event import app.revanced.extension.youtube.swipecontrols.misc.Rectangle /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt index 0b97b05c6e..555dbfaeaa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt @@ -1,7 +1,7 @@ package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger -import app.revanced.extension.youtube.Event +import app.revanced.extension.youtube.shared.Event /** * Regular player type. @@ -107,7 +107,7 @@ enum class PlayerType { * Instead of this method, consider using {@link ShortsPlayerState} * which may work better for some situations. * - * @return If nothing, a Short, or a regular video is sliding off screen to a dismissed or hidden state. + * @return If nothing, a Short, or a regular video is sliding off-screen to a dismissed or hidden state. * @see ShortsPlayerState */ fun isNoneHiddenOrSlidingMinimized(): Boolean { @@ -119,7 +119,7 @@ enum class PlayerType { * [NONE], [HIDDEN], [WATCH_WHILE_MINIMIZED], [WATCH_WHILE_SLIDING_MINIMIZED_DISMISSED]. * * Useful to check if a Short is being played, - * although will return false positive if a regular video is + * although it will return false positive if a regular video is * opened and minimized (and a Short is not playing or being opened). * * Typically used to detect if a Short is playing when the player cannot be in a minimized state, @@ -128,7 +128,7 @@ enum class PlayerType { * Instead of this method, consider using {@link ShortsPlayerState} * which may work better for some situations. * - * @return If nothing, a Short, a regular video is sliding off screen to a dismissed or hidden state, + * @return If nothing, a Short, a regular video is sliding off-screen to a dismissed or hidden state, * a regular video is minimized (and a new video is not being opened). * @see ShortsPlayerState */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/ShortsPlayerState.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/ShortsPlayerState.kt index 48927d88aa..d960225c4a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/ShortsPlayerState.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/ShortsPlayerState.kt @@ -1,7 +1,7 @@ package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger -import app.revanced.extension.youtube.Event +import app.revanced.extension.youtube.shared.Event /** * Shorts player state. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java index f4d5d5f62a..a296f9e000 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java @@ -35,7 +35,9 @@ import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ui.Dim; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.shared.PlayerControlsVisibility; import app.revanced.extension.youtube.shared.PlayerType; +import app.revanced.extension.youtube.shared.ShortsPlayerState; import app.revanced.extension.youtube.shared.VideoState; import app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour; import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory; @@ -128,7 +130,7 @@ public class SegmentPlaybackController { /** * Current segments that have been auto skipped. - * If field is non null then the range will always contain the current video time. + * If field is non-null then the range will always contain the current video time. * Range is used to prevent auto-skipping after undo. * Android Range object has inclusive end time, unlike {@link SponsorSegment}. */ @@ -136,7 +138,7 @@ public class SegmentPlaybackController { private static Range undoAutoSkipRange; /** * Range to undo if the toast is tapped. - * Is always null or identical to the last non null value of {@link #undoAutoSkipRange}. + * Is always null or identical to the last non-null value of {@link #undoAutoSkipRange}. */ @Nullable private static Range undoAutoSkipRangeToast; @@ -311,7 +313,10 @@ public class SegmentPlaybackController { if (videoId == null || !Settings.SB_ENABLED.get()) { return; } - if (PlayerType.getCurrent().isNoneOrHidden()) { + // Cannot use PlayerType to check because on some newer targets + // the player type can be updated out of order and incorrectly + // is "none" when the regular player is open + if (ShortsPlayerState.isOpen()) { Logger.printDebug(() -> "Ignoring Short"); return; } @@ -382,8 +387,8 @@ public class SegmentPlaybackController { Logger.printDebug(() -> { String visibilityMessage = switch (visibility) { - case View.VISIBLE -> "VISIBLE"; - case View.GONE -> "GONE"; + case View.VISIBLE -> "VISIBLE"; + case View.GONE -> "GONE"; case View.INVISIBLE -> "INVISIBLE"; default -> "UNKNOWN"; }; @@ -394,12 +399,18 @@ public class SegmentPlaybackController { /** * When a video ad is playing in a regular video player, segments or the Skip button should be hidden. + * * @return Whether the Ad Progress TextView is visible in the regular video player. */ public static boolean isAdProgressTextVisible() { return adProgressTextVisibility == View.VISIBLE; } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private static boolean autoSkipIsEnabledAndPlayerOverlayIsActive() { + return Settings.SB_AUTO_HIDE_SKIP_BUTTON.get() && + PlayerControlsVisibility.getCurrent() != PlayerControlsVisibility.PLAYER_CONTROLS_VISIBILITY_HIDDEN; + } /** * Injection point. @@ -422,7 +433,7 @@ public class SegmentPlaybackController { // Amount of time to look ahead for the next segment, // and the threshold to determine if a scheduled show/hide is at the correct video time when it's run. // - // This value must be greater than largest time between calls to this method (1000ms), + // This value must be greater than the largest time between calls to this method (1000ms), // and must be adjusted for the video speed. // // To debug the stale skip logic, set this to a very large value (5000 or more) @@ -490,7 +501,7 @@ public class SegmentPlaybackController { // Only schedule, if the segment start time is not near the end time of the current segment. // This check is needed to prevent scheduled hide and show from clashing with each other. - // Instead the upcoming segment will be handled when the current segment scheduled hide calls back into this method. + // Instead, the upcoming segment will be handled when the current segment scheduled hide calls back into this method. final long minTimeBetweenStartEndOfSegments = 1000; if (foundSegmentCurrentlyPlaying == null || !foundSegmentCurrentlyPlaying.endIsNear(segment.start, minTimeBetweenStartEndOfSegments)) { @@ -519,7 +530,11 @@ public class SegmentPlaybackController { Logger.printDebug(() -> "Auto hiding skip button for segment: " + segmentCurrentlyPlaying); skipSegmentButtonEndTime = 0; hiddenSkipSegmentsForCurrentVideoTime.add(foundSegmentCurrentlyPlaying); - SponsorBlockViewController.hideSkipSegmentButton(); + // Do not hide if auto-hide is enabled and player controls are visible. + // Skip button will hide when the overlay controls are dismissed. + if (!autoSkipIsEnabledAndPlayerOverlayIsActive()) { + SponsorBlockViewController.hideSkipSegmentButton(); + } } // Schedule a hide, but only if the segment end is near. @@ -602,12 +617,12 @@ public class SegmentPlaybackController { } }, delayUntilSkip); } - } - // Clear undo range if video time is outside the segment. Must check last. - if (undoAutoSkipRange != null && !undoAutoSkipRange.contains(millis)) { - Logger.printDebug(() -> "Clearing undo range as current time is now outside range: " + undoAutoSkipRange); - undoAutoSkipRange = null; + // Clear undo range if video time is outside the segment. Must check last. + if (undoAutoSkipRange != null && !undoAutoSkipRange.contains(millis)) { + Logger.printDebug(() -> "Clearing undo range as current time is now outside range: " + undoAutoSkipRange); + undoAutoSkipRange = null; + } } } catch (Exception e) { Logger.printException(() -> "setVideoTime failure", e); @@ -615,7 +630,7 @@ public class SegmentPlaybackController { } /** - * Removes all previously hidden segments that are not longer contained in the given video time. + * Removes all previously hidden segments that are no longer contained in the given video time. */ private static void updateHiddenSegments(long currentVideoTime) { hiddenSkipSegmentsForCurrentVideoTime.removeIf((hiddenSegment) -> { @@ -629,7 +644,9 @@ public class SegmentPlaybackController { private static void setSegmentCurrentlyPlaying(@Nullable SponsorSegment segment) { if (segment == null) { - if (segmentCurrentlyPlaying != null) Logger.printDebug(() -> "Hiding segment: " + segmentCurrentlyPlaying); + if (segmentCurrentlyPlaying != null) { + Logger.printDebug(() -> "Hiding segment: " + segmentCurrentlyPlaying); + } segmentCurrentlyPlaying = null; skipSegmentButtonEndTime = 0; SponsorBlockViewController.hideSkipSegmentButton(); @@ -643,7 +660,12 @@ public class SegmentPlaybackController { if (hiddenSkipSegmentsForCurrentVideoTime.contains(segment)) { // Playback exited a nested segment and the outer segment skip button was previously hidden. Logger.printDebug(() -> "Ignoring previously auto-hidden segment: " + segment); - SponsorBlockViewController.hideSkipSegmentButton(); + // Must set view segment so overlay controls shows the correct skip button. + SponsorBlockViewController.setSkipSegment(segment); + // Do not hide skip button if + if (!autoSkipIsEnabledAndPlayerOverlayIsActive()) { + SponsorBlockViewController.hideSkipSegmentButton(); + } return; } skipSegmentButtonEndTime = System.currentTimeMillis() + getSkipButtonDuration(); @@ -746,6 +768,15 @@ public class SegmentPlaybackController { || !undoAutoSkipRange.contains(currentVideoTime)); } + public static boolean currentlyInsideSkippableSegment() { + return segmentCurrentlyPlaying != null || !hiddenSkipSegmentsForCurrentVideoTime.isEmpty(); + } + + public static boolean shouldNotFadeOutPlayerOverlaySkipButton() { + // Only fade out overlay if auto hide is enabled and a scheduled button auto hide is not scheduled. + return skipSegmentButtonEndTime != 0 || !Settings.SB_AUTO_HIDE_SKIP_BUTTON.get(); + } + private static void showSkippedSegmentToast(SponsorSegment segment) { Utils.verifyOnMainThread(); toastSegmentSkipped = segment; @@ -757,8 +788,8 @@ public class SegmentPlaybackController { final long delayToToastMilliseconds = 250; Utils.runOnMainThreadDelayed(() -> { try { - // Do not show a toast if the user is scrubbing thru a paused video. - // Cannot do this video state check in setTime or before calling this this method, + // Do not show a toast if the user is scrubbing through a paused video. + // Cannot do this video state check in setTime or before calling this method, // as the video state may not be up to date. So instead, only ignore the toast // just before it's about to show since the video state is up to date. if (VideoState.getCurrent() == VideoState.PAUSED) { @@ -792,6 +823,13 @@ public class SegmentPlaybackController { Objects.requireNonNull(messageToToast); Utils.verifyOnMainThread(); + if (PlayerType.getCurrent() == PlayerType.INLINE_MINIMAL) { + // Cannot easily show a toast since there is no layout view context. + // Probably better to not show a toast here anyway. + Logger.printDebug(() -> "Not showing undo toast for feed playback"); + return; + } + Context currentContext = SponsorBlockViewController.getOverLaysViewGroupContext(); if (currentContext == null) { Logger.printException(() -> "Cannot show toast (context is null): " + messageToToast); @@ -836,13 +874,17 @@ public class SegmentPlaybackController { fadeIn.setDuration(fadeDurationFast); fadeOut.setDuration(fadeDurationFast); fadeOut.setAnimationListener(new Animation.AnimationListener() { - public void onAnimationStart(Animation animation) { } + public void onAnimationStart(Animation animation) { + } + public void onAnimationEnd(Animation animation) { if (dialog.isShowing()) { dialog.dismiss(); } } - public void onAnimationRepeat(Animation animation) { } + + public void onAnimationRepeat(Animation animation) { + } }); mainLayout.setOnClickListener(v -> { @@ -891,7 +933,8 @@ public class SegmentPlaybackController { */ public static void onSkipSegmentClicked(SponsorSegment segment) { try { - if (segment != highlightSegment && segment != segmentCurrentlyPlaying) { + if (segment != highlightSegment && segment != segmentCurrentlyPlaying + && !hiddenSkipSegmentsForCurrentVideoTime.contains(segment)) { Logger.printException(() -> "error: segment not available to skip"); // Should never happen. SponsorBlockViewController.hideSkipSegmentButton(); SponsorBlockViewController.hideSkipHighlightButton(); @@ -994,7 +1037,7 @@ public class SegmentPlaybackController { @SuppressWarnings("unused") public static void drawSegmentTimeBars(final Canvas canvas, final float posY) { try { - if (segments == null) return; + if (segments == null || isAdProgressTextVisible()) return; final long videoLength = VideoInformation.getVideoLength(); if (videoLength <= 0) return; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java index a8c76628c5..a86a17cc8a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java @@ -29,7 +29,7 @@ import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGrou @SuppressWarnings("NewApi") public class SponsorBlockSettings { /** - * Minimum length a SB user id must be, as set by SB API. + * Minimum length an SB user ID must be, as set by SB API. */ private static final int SB_PRIVATE_USER_ID_MINIMUM_LENGTH = 30; @@ -80,7 +80,7 @@ public class SponsorBlockSettings { Utils.showToastLong(categoryKey + " unknown behavior key: " + categoryKey); } else if (category == SegmentCategory.HIGHLIGHT && behaviour == CategoryBehaviour.SKIP_AUTOMATICALLY_ONCE) { Utils.showToastLong("Skip-once behavior not allowed for " + category.keyValue); - category.setBehaviour(CategoryBehaviour.SKIP_AUTOMATICALLY); // Use closest match. + category.setBehaviour(CategoryBehaviour.SKIP_AUTOMATICALLY); // Use the closest match. } else { category.setBehaviour(behaviour); } @@ -90,7 +90,7 @@ public class SponsorBlockSettings { if (settingsJson.has("userID")) { // User id does not exist if user never voted or created any segments. String userID = settingsJson.getString("userID"); - if (isValidSBUserId(userID)) { + if (isValidSBUserID(userID)) { Settings.SB_PRIVATE_USER_ID.save(userID); } } @@ -159,7 +159,7 @@ public class SponsorBlockSettings { categorySelectionsArray.put(behaviorObject); } } - if (SponsorBlockSettings.userHasSBPrivateId()) { + if (SponsorBlockSettings.userHasSBPrivateID()) { json.put("userID", Settings.SB_PRIVATE_USER_ID.get()); } json.put("isVip", Settings.SB_USER_IS_VIP.get()); @@ -183,14 +183,14 @@ public class SponsorBlockSettings { } /** - * Export the categories using flatten json (no embedded dictionaries or arrays). + * Export the categories using flatten JSON (no embedded dictionaries or arrays). */ private static void showExportWarningIfNeeded(@Nullable Context dialogContext) { Utils.verifyOnMainThread(); initialize(); - // If user has a SponsorBlock user id then show a warning. - if (dialogContext != null && SponsorBlockSettings.userHasSBPrivateId() + // If user has a SponsorBlock user ID then show a warning. + if (dialogContext != null && SponsorBlockSettings.userHasSBPrivateID() && !Settings.SB_HIDE_EXPORT_WARNING.get()) { // Create the custom dialog. Pair dialogPair = CustomDialog.create( @@ -214,12 +214,12 @@ public class SponsorBlockSettings { } } - public static boolean isValidSBUserId(@NonNull String userId) { - return !userId.isEmpty() && userId.length() >= SB_PRIVATE_USER_ID_MINIMUM_LENGTH; + public static boolean isValidSBUserID(@NonNull String userID) { + return !userID.isEmpty() && userID.length() >= SB_PRIVATE_USER_ID_MINIMUM_LENGTH; } /** - * A non comprehensive check if a SB api server address is valid. + * A non-comprehensive check if an SB API server address is valid. */ public static boolean isValidSBServerAddress(@NonNull String serverAddress) { if (!Patterns.WEB_URL.matcher(serverAddress).matches()) { @@ -237,12 +237,12 @@ public class SponsorBlockSettings { /** * @return if the user has ever voted, created a segment, or imported existing SB settings. */ - public static boolean userHasSBPrivateId() { + public static boolean userHasSBPrivateID() { return !Settings.SB_PRIVATE_USER_ID.get().isEmpty(); } /** - * Use this only if a user id is required (creating segments, voting). + * Use this only if a user ID is required (creating segments, voting). */ @NonNull public static String getSBPrivateUserID() { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockUtils.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockUtils.java index 76c0403d5b..943cfc0373 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockUtils.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockUtils.java @@ -416,10 +416,10 @@ public class SponsorBlockUtils { if (!matcher.matches()) { return -1; } - String hoursStr = matcher.group(2); // Hours is optional. + String hoursStr = matcher.group(2); // Hours are optional. String minutesStr = matcher.group(3); String secondsStr = matcher.group(4); - String millisecondsStr = matcher.group(6); // Milliseconds is optional. + String millisecondsStr = matcher.group(6); // Milliseconds are optional. try { final int hours = (hoursStr != null) ? Integer.parseInt(hoursStr) : 0; @@ -447,7 +447,7 @@ public class SponsorBlockUtils { // Use same time formatting as shown in the video player. final long videoLength = VideoInformation.getVideoLength(); - // Cannot use DateFormatter, as videos over 24 hours will rollover and not display correctly. + // Cannot use DateFormatter, as videos over 24 hours will roll over and not display correctly. final long hours = TimeUnit.MILLISECONDS.toHours(segmentTime); final long minutes = TimeUnit.MILLISECONDS.toMinutes(segmentTime) % 60; final long seconds = TimeUnit.MILLISECONDS.toSeconds(segmentTime) % 60; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/CategoryBehaviour.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/CategoryBehaviour.java index 7cd4a44c55..cc123d1e7d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/CategoryBehaviour.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/CategoryBehaviour.java @@ -16,7 +16,7 @@ public enum CategoryBehaviour { SKIP_AUTOMATICALLY_ONCE("skip-once", 3, true, sf("revanced_sb_skip_automatically_once")), MANUAL_SKIP("manual-skip", 1, false, sf("revanced_sb_skip_showbutton")), SHOW_IN_SEEKBAR("seekbar-only", 0, false, sf("revanced_sb_skip_seekbaronly")), - // ignored categories are not exported to json, and ignore is the default behavior when importing + // ignored categories are not exported to JSON, and ignore is the default behavior when importing IGNORE("ignore", -1, false, sf("revanced_sb_skip_ignore")); /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java index ff0eaffcf1..d26f48bfe9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/UserStats.java @@ -16,8 +16,8 @@ public class UserStats { */ private static final long STATS_EXPIRATION_MILLISECONDS = 60 * 60 * 1000; // 60 minutes. - private final String privateUserId; - public final String publicUserId; + private final String privateUserID; + public final String publicUserID; public final String userName; /** * "User reputation". Unclear how SB determines this value. @@ -37,9 +37,9 @@ public class UserStats { */ public final long fetchTime; - public UserStats(String privateSbId, @NonNull JSONObject json) throws JSONException { - privateUserId = privateSbId; - publicUserId = json.getString("userID"); + public UserStats(String privateSBID, @NonNull JSONObject json) throws JSONException { + privateUserID = privateSBID; + publicUserID = json.getString("userID"); userName = json.getString("userName"); reputation = (float)json.getDouble("reputation"); segmentCount = json.getInt("segmentCount"); @@ -55,17 +55,17 @@ public class UserStats { return true; } - // User changed their SB private user id. - return !SponsorBlockSettings.userHasSBPrivateId() - || !SponsorBlockSettings.getSBPrivateUserID().equals(privateUserId); + // User changed their SB private user ID. + return !SponsorBlockSettings.userHasSBPrivateID() + || !SponsorBlockSettings.getSBPrivateUserID().equals(privateUserID); } @NonNull @Override public String toString() { - // Do not include private user id in toString(). + // Do not include private user ID in toString(). return "UserStats{" - + "publicUserId='" + publicUserId + '\'' + + "publicUserID='" + publicUserID + '\'' + ", userName='" + userName + '\'' + ", reputation=" + reputation + ", segmentCount=" + segmentCount diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java index dc86e1d0d3..bdfb3ae933 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/requests/SBRequester.java @@ -153,7 +153,7 @@ public class SBRequester { segments.add(new SponsorSegment(SegmentCategory.SELF_PROMO, "debug", 8000, 15000, false)); // Test multiple autoskip dialogs rapidly showing. - // Only one toast should be shown at anytime. + // Only one toast should be shown at any time. segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 16000, 17000, false)); segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 18000, 19000, false)); segments.add(new SponsorSegment(SegmentCategory.INTRO, "debug", 20000, 21000, false)); @@ -168,13 +168,13 @@ public class SBRequester { Utils.verifyOffMainThread(); try { - String privateUserId = SponsorBlockSettings.getSBPrivateUserID(); + String privateUserID = SponsorBlockSettings.getSBPrivateUserID(); String start = String.format(Locale.US, TIME_TEMPLATE, startTime / 1000f); String end = String.format(Locale.US, TIME_TEMPLATE, endTime / 1000f); String duration = String.format(Locale.US, TIME_TEMPLATE, videoLength / 1000f); HttpURLConnection connection = getConnectionFromRoute(SBRoutes.SUBMIT_SEGMENTS, - privateUserId, videoId, category, start, end, duration); + privateUserID, videoId, category, start, end, duration); final int responseCode = connection.getResponseCode(); if (responseCode == HTTP_STATUS_CODE_SUCCESS) { @@ -317,8 +317,8 @@ public class SBRequester { } public static void runVipCheckInBackgroundIfNeeded() { - if (!SponsorBlockSettings.userHasSBPrivateId()) { - return; // User cannot be a VIP. User has never voted, created any segments, or has imported a SB user id. + if (!SponsorBlockSettings.userHasSBPrivateID()) { + return; // User cannot be a VIP. User has never voted, created any segments, or has imported an SB user ID. } long now = System.currentTimeMillis(); if (now < (Settings.SB_LAST_VIP_CHECK.get() + TimeUnit.DAYS.toMillis(3))) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java index 9573102f32..22d5b0db55 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java @@ -78,15 +78,17 @@ public class SkipSponsorButton extends FrameLayout { updateLayout(); - skipSponsorBtnContainer.setOnClickListener(v -> { - // The view controller handles hiding this button, but hide it here as well just in case something goofs. - setVisibility(View.GONE); - SegmentPlaybackController.onSkipSegmentClicked(segment); - }); + skipSponsorBtnContainer.setOnClickListener(v -> skipButtonClicked()); + } + + public void skipButtonClicked() { + // The view controller handles hiding this button, but hide it here as well just in case something goofs. + setVisibility(View.GONE); + SegmentPlaybackController.onSkipSegmentClicked(segment); } @Override // android.view.ViewGroup - protected final void dispatchDraw(Canvas canvas) { + protected final void dispatchDraw(@NonNull Canvas canvas) { final int left = skipSponsorBtnContainer.getLeft(); final int top = skipSponsorBtnContainer.getTop(); final int right = left + skipSponsorBtnContainer.getWidth(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java index d8c8a13fef..5857a1c1ed 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockAboutPreference.java @@ -3,12 +3,12 @@ package app.revanced.extension.youtube.sponsorblock.ui; import android.content.Context; import android.util.AttributeSet; -import app.revanced.extension.shared.settings.preference.UrlLinkPreference; +import app.revanced.extension.shared.settings.preference.URLLinkPreference; @SuppressWarnings("unused") -public class SponsorBlockAboutPreference extends UrlLinkPreference { +public class SponsorBlockAboutPreference extends URLLinkPreference { { - externalUrl = "https://sponsor.ajay.app"; + externalURL = "https://sponsor.ajay.app"; } public SponsorBlockAboutPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java index cb05661e7f..e81e2e08aa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockPreferenceGroup.java @@ -96,8 +96,8 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup { // Preferences are synced by AbstractPreferenceFragment since keys are set // and a Setting exist with the same key. - // If the user has a private user id, then include a subtext that mentions not to share it. - String importExportSummary = SponsorBlockSettings.userHasSBPrivateId() + // If the user has a private user ID, then include a subtext that mentions not to share it. + String importExportSummary = SponsorBlockSettings.userHasSBPrivateID() ? str("revanced_sb_settings_ie_sum_warning") : str("revanced_sb_settings_ie_sum"); importExport.setSummary(importExportSummary); @@ -393,7 +393,7 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup { }); generalCategory.addPreference(minSegmentDuration); - EditTextPreference privateUserId = new EditTextPreference(context) { + EditTextPreference privateUserID = new EditTextPreference(context) { @Override protected void showDialog(Bundle state) { try { @@ -442,11 +442,11 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup { } } }; - initializePreference(privateUserId, Settings.SB_PRIVATE_USER_ID, + initializePreference(privateUserID, Settings.SB_PRIVATE_USER_ID, "revanced_sb_general_uuid"); - privateUserId.setOnPreferenceChangeListener((preference1, newValue) -> { + privateUserID.setOnPreferenceChangeListener((preference1, newValue) -> { String newUUID = newValue.toString(); - if (!SponsorBlockSettings.isValidSBUserId(newUUID)) { + if (!SponsorBlockSettings.isValidSBUserID(newUUID)) { Utils.showToastLong(str("revanced_sb_general_uuid_invalid")); updateUIDelayed(); return false; @@ -456,7 +456,7 @@ public class SponsorBlockPreferenceGroup extends PreferenceGroup { updateUIDelayed(); return true; }); - generalCategory.addPreference(privateUserId); + generalCategory.addPreference(privateUserID); Preference apiUrl = new Preference(context); initializePreference(apiUrl, Settings.SB_API_URL, diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java index 6b6d7c4deb..23101b01c9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockStatsPreferenceCategory.java @@ -30,7 +30,7 @@ import app.revanced.extension.youtube.sponsorblock.requests.SBRequester; * User skip stats. * None of the preferences here show up in search results because * a category cannot be added to another category for the search results. - * Additionally the stats must load remotely on a background thread which means the + * Additionally, the stats must load remotely on a background thread which means the * preferences are not available to collect for search when the settings first load. */ @SuppressWarnings({"unused", "deprecation"}) @@ -58,7 +58,7 @@ public class SponsorBlockStatsPreferenceCategory extends PreferenceCategory { setEnabled(enabled); removeAll(); - if (!SponsorBlockSettings.userHasSBPrivateId()) { + if (!SponsorBlockSettings.userHasSBPrivateID()) { // User has never voted or created any segments. Only local stats exist. addLocalUserStats(); return; @@ -134,7 +134,7 @@ public class SponsorBlockStatsPreferenceCategory extends PreferenceCategory { } else { preference.setOnPreferenceClickListener(preference1 -> { Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse("https://sb.ltn.fi/userid/" + stats.publicUserId)); + i.setData(Uri.parse("https://sb.ltn.fi/userid/" + stats.publicUserID)); preference1.getContext().startActivity(i); return true; }); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java index 6e2c9e241d..ca303753aa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java @@ -9,7 +9,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.ref.WeakReference; @@ -18,8 +17,11 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.PlayerType; +import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; +import app.revanced.extension.youtube.videoplayer.PlayerControlButton; import kotlin.Unit; public class SponsorBlockViewController { @@ -28,8 +30,10 @@ public class SponsorBlockViewController { private static WeakReference inlineSponsorOverlayRef = new WeakReference<>(null); private static WeakReference youtubeOverlaysLayoutRef = new WeakReference<>(null); private static WeakReference skipHighlightButtonRef = new WeakReference<>(null); - private static WeakReference skipSponsorButtonRef = new WeakReference<>(null); private static WeakReference newSegmentLayoutRef = new WeakReference<>(null); + private static WeakReference skipSponsorButtonRef = new WeakReference<>(null); + @Nullable + private static PlayerControlButton skipSponsorPlayerButton; private static boolean canShowViewElements; private static boolean newSegmentLayoutVisible; @Nullable @@ -92,6 +96,21 @@ public class SponsorBlockViewController { skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(layout.findViewById( getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_sponsor_button")))); + // Handles fading in/out with the player overlay. + skipSponsorPlayerButton = new PlayerControlButton( + layout, + "revanced_sb_skip_sponsor_button", + null, + () -> canShowViewElements && SegmentPlaybackController.currentlyInsideSkippableSegment(), + view -> { + SkipSponsorButton button = skipSponsorButtonRef.get(); + if (button != null) { + button.skipButtonClicked(); + } + }, + null + ); + NewSegmentLayout newSegmentLayout = Objects.requireNonNull(layout.findViewById( getResourceIdentifier(ResourceType.ID, "revanced_sb_new_segment_view"))); newSegmentLayoutRef = new WeakReference<>(newSegmentLayout); @@ -128,36 +147,62 @@ public class SponsorBlockViewController { } } - public static void showSkipHighlightButton(@NonNull SponsorSegment segment) { + public static void showSkipHighlightButton(SponsorSegment segment) { skipHighlight = Objects.requireNonNull(segment); NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get(); - // don't show highlight button if create new segment is visible + // Don't show highlight button if create new segment is visible. final boolean buttonVisibility = newSegmentLayout == null || newSegmentLayout.getVisibility() != View.VISIBLE; - updateSkipButton(skipHighlightButtonRef.get(), segment, buttonVisibility); + updateSkipButton(skipHighlightButtonRef.get(), false, segment, buttonVisibility); } - public static void showSkipSegmentButton(@NonNull SponsorSegment segment) { + + /** + * Same as {@link #setSkipSegment(SponsorSegment)} and it forcefully shows the skip button. + */ + public static void showSkipSegmentButton(SponsorSegment segment) { skipSegment = Objects.requireNonNull(segment); - updateSkipButton(skipSponsorButtonRef.get(), segment, true); + updateSkipButton(skipSponsorButtonRef.get(), true, segment, true); + } + + /** + * Sets the skip segment and updates the button, but does not forcefully show the skip button. + */ + public static void setSkipSegment(SponsorSegment segment) { + skipSegment = Objects.requireNonNull(segment); + SkipSponsorButton button = skipSponsorButtonRef.get(); + if (button != null) { + button.updateSkipButtonText(segment); + } } public static void hideSkipHighlightButton() { skipHighlight = null; - updateSkipButton(skipHighlightButtonRef.get(), null, false); + updateSkipButton(skipHighlightButtonRef.get(), false, null, false); } + public static void hideSkipSegmentButton() { - skipSegment = null; - updateSkipButton(skipSponsorButtonRef.get(), null, false); + if (!Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()) { + // Must retain segment for auto hide because skip button is shown when player overlay is active. + skipSegment = null; + } + updateSkipButton(skipSponsorButtonRef.get(), true, null, false); } private static void updateSkipButton(@Nullable SkipSponsorButton button, - @Nullable SponsorSegment segment, boolean visible) { + boolean isSkipButton, + @Nullable SponsorSegment segment, + boolean visible) { if (button == null) { return; } if (segment != null) { button.updateSkipButtonText(segment); } - setViewVisibility(button, visible); + + if (isSkipButton && Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()) { + setVisibilityImmediate(visible); + } else { + setGenericViewVisibility(button, visible); + } } public static void toggleNewSegmentLayoutVisibility() { @@ -168,20 +213,21 @@ public class SponsorBlockViewController { } newSegmentLayoutVisible = (newSegmentLayout.getVisibility() != View.VISIBLE); if (skipHighlight != null) { - setViewVisibility(skipHighlightButtonRef.get(), !newSegmentLayoutVisible); + setGenericViewVisibility(skipHighlightButtonRef.get(), !newSegmentLayoutVisible); } - setViewVisibility(newSegmentLayout, newSegmentLayoutVisible); + setGenericViewVisibility(newSegmentLayout, newSegmentLayoutVisible); } public static void hideNewSegmentLayout() { newSegmentLayoutVisible = false; - setViewVisibility(newSegmentLayoutRef.get(), false); + setGenericViewVisibility(newSegmentLayoutRef.get(), false); } - private static void setViewVisibility(@Nullable View view, boolean visible) { + private static void setGenericViewVisibility(@Nullable View view, boolean visible) { if (view == null) { return; } + visible &= canShowViewElements; final int desiredVisibility = visible ? View.VISIBLE : View.GONE; if (view.getVisibility() != desiredVisibility) { @@ -189,22 +235,22 @@ public class SponsorBlockViewController { } } - private static void playerTypeChanged(@NonNull PlayerType playerType) { + private static void playerTypeChanged(PlayerType playerType) { try { final boolean isWatchFullScreen = playerType == PlayerType.WATCH_WHILE_FULLSCREEN; canShowViewElements = (isWatchFullScreen || playerType == PlayerType.WATCH_WHILE_MAXIMIZED); NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get(); setNewSegmentLayoutMargins(newSegmentLayout, isWatchFullScreen); - setViewVisibility(newSegmentLayoutRef.get(), newSegmentLayoutVisible); + setGenericViewVisibility(newSegmentLayoutRef.get(), newSegmentLayoutVisible); SkipSponsorButton skipHighlightButton = skipHighlightButtonRef.get(); setSkipButtonMargins(skipHighlightButton, isWatchFullScreen); - setViewVisibility(skipHighlightButton, skipHighlight != null); + setGenericViewVisibility(skipHighlightButton, skipHighlight != null); SkipSponsorButton skipSponsorButton = skipSponsorButtonRef.get(); setSkipButtonMargins(skipSponsorButton, isWatchFullScreen); - setViewVisibility(skipSponsorButton, skipSegment != null); + setGenericViewVisibility(skipSponsorButton, skipSegment != null); } catch (Exception ex) { Logger.printException(() -> "playerTypeChanged failure", ex); } @@ -220,7 +266,7 @@ public class SponsorBlockViewController { setLayoutMargins(button, fullScreen, button.defaultBottomMargin, button.ctaBottomMargin); } } - private static void setLayoutMargins(@NonNull View view, boolean fullScreen, + private static void setLayoutMargins(View view, boolean fullScreen, int defaultBottomMargin, int ctaBottomMargin) { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); if (params == null) { @@ -230,4 +276,46 @@ public class SponsorBlockViewController { params.bottomMargin = fullScreen ? ctaBottomMargin : defaultBottomMargin; view.setLayoutParams(params); } + + // Additional logic to fade in/out the skip segment button when autohide skip button is active. + + /**` + * injection point. + */ + public static void setVisibilityNegatedImmediate() { + if (SegmentPlaybackController.shouldNotFadeOutPlayerOverlaySkipButton()) { + return; + } + + if (skipSponsorPlayerButton != null) { + skipSponsorPlayerButton.setVisibilityNegatedImmediate(); + } + } + + /** + * injection point. + * Only for skip button when auto hide is enbled. + */ + public static void setVisibilityImmediate(boolean visible) { + if (!visible && SegmentPlaybackController.shouldNotFadeOutPlayerOverlaySkipButton()) { + return; + } + + if (skipSponsorPlayerButton != null) { + skipSponsorPlayerButton.setVisibilityImmediate(visible); + } + } + + /** + * injection point. + */ + public static void setVisibility(boolean visible, boolean animated) { + if (!visible && SegmentPlaybackController.shouldNotFadeOutPlayerOverlaySkipButton()) { + return; + } + + if (skipSponsorPlayerButton != null) { + skipSponsorPlayerButton.setVisibility(visible, animated); + } + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/ScreenBrightnessController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/ScreenBrightnessController.kt index f291bcb415..2e2b6d70b7 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/ScreenBrightnessController.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/ScreenBrightnessController.kt @@ -23,7 +23,7 @@ class ScreenBrightnessController( } /** - * is the screen brightness set to device- default? + * is the screen brightness set to device-default? */ val isDefaultBrightness get() = (rawScreenBrightness == WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt index 5d206dfa9b..b40b9f0287 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt @@ -4,7 +4,7 @@ import android.view.KeyEvent import app.revanced.extension.youtube.swipecontrols.SwipeControlsHostActivity /** - * controller for custom volume button behaviour + * controller for custom volume button behavior * * @param controller main controller instance */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/SwipeControlsOverlay.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/SwipeControlsOverlay.kt index 5e863a3c58..d30ca3e458 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/SwipeControlsOverlay.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/SwipeControlsOverlay.kt @@ -20,7 +20,7 @@ interface SwipeControlsOverlay { fun onBrightnessChanged(brightness: Double) /** - * called when a new swipe- session has started + * called when a new swipe-session has started */ fun onEnterSwipeSession() } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLButton.java similarity index 86% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlButton.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLButton.java index b0dc22e762..21c67ba990 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLButton.java @@ -5,11 +5,11 @@ import android.view.View; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; -import app.revanced.extension.youtube.patches.CopyVideoUrlPatch; +import app.revanced.extension.youtube.patches.CopyVideoURLPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") -public class CopyVideoUrlButton { +public class CopyVideoURLButton { @Nullable private static PlayerControlButton instance; @@ -23,9 +23,9 @@ public class CopyVideoUrlButton { "revanced_copy_video_url_button", null, Settings.COPY_VIDEO_URL::get, - view -> CopyVideoUrlPatch.copyUrl(false), + view -> CopyVideoURLPatch.copyURL(false), view -> { - CopyVideoUrlPatch.copyUrl(true); + CopyVideoURLPatch.copyURL(true); return true; } ); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlTimestampButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLTimestampButton.java similarity index 86% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlTimestampButton.java rename to extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLTimestampButton.java index c702756ed3..a359779f67 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoUrlTimestampButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/CopyVideoURLTimestampButton.java @@ -5,11 +5,11 @@ import android.view.View; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; -import app.revanced.extension.youtube.patches.CopyVideoUrlPatch; +import app.revanced.extension.youtube.patches.CopyVideoURLPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") -public class CopyVideoUrlTimestampButton { +public class CopyVideoURLTimestampButton { @Nullable private static PlayerControlButton instance; @@ -23,9 +23,9 @@ public class CopyVideoUrlTimestampButton { "revanced_copy_video_url_timestamp_button", null, Settings.COPY_VIDEO_URL_TIMESTAMP::get, - view -> CopyVideoUrlPatch.copyUrl(true), + view -> CopyVideoURLPatch.copyURL(true), view -> { - CopyVideoUrlPatch.copyUrl(false); + CopyVideoURLPatch.copyURL(false); return true; } ); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java index 5b8df3b5e6..249c30eb1d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/LoopVideoButton.java @@ -3,6 +3,7 @@ package app.revanced.extension.youtube.videoplayer; import static app.revanced.extension.shared.StringRef.str; import android.view.View; +import android.widget.ImageView; import androidx.annotation.Nullable; @@ -19,7 +20,7 @@ public class LoopVideoButton { private static final int LOOP_VIDEO_ON = Utils.getResourceIdentifierOrThrow( ResourceType.DRAWABLE, "revanced_loop_video_button_on"); private static final int LOOP_VIDEO_OFF = Utils.getResourceIdentifierOrThrow( - ResourceType.DRAWABLE,"revanced_loop_video_button_off"); + ResourceType.DRAWABLE, "revanced_loop_video_button_off"); /** * Injection point. @@ -31,14 +32,44 @@ public class LoopVideoButton { "revanced_loop_video_button", null, Settings.LOOP_VIDEO_BUTTON::get, - v -> updateButtonAppearance(), + v -> updateButtonAppearance(true, v), null ); + // Set icon when initializing button based on current setting + updateButtonAppearance(false, null); } catch (Exception ex) { Logger.printException(() -> "initializeButton failure", ex); } } + /** + * Animate button transition with fade and scale. + */ + private static void animateButtonTransition(View view, boolean newState) { + if (!(view instanceof ImageView imageView)) return; + + // Fade out. + imageView.animate() + .alpha(0.3f) + .scaleX(1.15f) + .scaleY(1.15f) + .setDuration(100) + .withEndAction(() -> { + if (instance != null) { + instance.setIcon(newState ? LOOP_VIDEO_ON : LOOP_VIDEO_OFF); + } + + // Fade in. + imageView.animate() + .alpha(1.0f) + .scaleX(1.0f) + .scaleY(1.0f) + .setDuration(100) + .start(); + }) + .start(); + } + /** * injection point. */ @@ -51,6 +82,9 @@ public class LoopVideoButton { */ public static void setVisibilityImmediate(boolean visible) { if (instance != null) instance.setVisibilityImmediate(visible); + if (visible) { + updateIconFromSettings(); + } } /** @@ -58,27 +92,47 @@ public class LoopVideoButton { */ public static void setVisibility(boolean visible, boolean animated) { if (instance != null) instance.setVisibility(visible, animated); + if (visible) { + updateIconFromSettings(); + } + } + + /** + * Update icon based on current setting value. + */ + private static void updateIconFromSettings() { + PlayerControlButton localInstance = instance; + if (localInstance == null) return; + + final boolean currentState = Settings.LOOP_VIDEO.get(); + localInstance.setIcon(currentState ? LOOP_VIDEO_ON : LOOP_VIDEO_OFF); } /** * Updates the button's appearance. */ - private static void updateButtonAppearance() { + private static void updateButtonAppearance(boolean userClickedButton, @Nullable View buttonView) { if (instance == null) return; try { Utils.verifyOnMainThread(); final boolean currentState = Settings.LOOP_VIDEO.get(); - final boolean newState = !currentState; - Settings.LOOP_VIDEO.save(newState); - instance.setIcon(newState - ? LOOP_VIDEO_ON - : LOOP_VIDEO_OFF); - Utils.showToastShort(str(newState - ? "revanced_loop_video_button_toast_on" - : "revanced_loop_video_button_toast_off")); + if (userClickedButton) { + final boolean newState = !currentState; + + Settings.LOOP_VIDEO.save(newState); + Utils.showToastShort(str(newState + ? "revanced_loop_video_button_toast_on" + : "revanced_loop_video_button_toast_off")); + + // Animate with the new state. + if (buttonView != null) animateButtonTransition(buttonView, newState); + } else { + // Initialization - just set icon based on current state. + instance.setIcon(currentState ? LOOP_VIDEO_ON : LOOP_VIDEO_OFF); + } } catch (Exception ex) { Logger.printException(() -> "updateButtonAppearance failure", ex); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlayerControlButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlayerControlButton.java index 248de966d8..35878a9851 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlayerControlButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlayerControlButton.java @@ -1,5 +1,7 @@ package app.revanced.extension.youtube.videoplayer; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewPropertyAnimator; import android.widget.ImageView; @@ -56,10 +58,23 @@ public class PlayerControlButton { containerRef = new WeakReference<>(containerView); View button = Utils.getChildViewByResourceName(controlsViewGroup, buttonId); - button.setOnClickListener(onClickListener); + + // Wrap click listener to trigger animation. + button.setOnClickListener(view -> { + animateIcon(); + if (onClickListener != null) { + onClickListener.onClick(view); + } + }); + if (longClickListener != null) { - button.setOnLongClickListener(longClickListener); + // Wrap long click listener to trigger animation. + button.setOnLongClickListener(view -> { + animateIcon(); + return longClickListener.onLongClick(view); + }); } + buttonRef = new WeakReference<>(button); TextView tempTextOverlay = null; @@ -82,6 +97,23 @@ public class PlayerControlButton { }); } + /** + * Animates the button icon if it's an AnimatedVectorDrawable. + */ + public void animateIcon() { + try { + View button = buttonRef.get(); + if (button instanceof ImageView imageView) { + Drawable drawable = imageView.getDrawable(); + if (drawable instanceof AnimatedVectorDrawable avd) { + avd.start(); + } + } + } catch (Exception ex) { + Logger.printException(() -> "animateIcon failure", ex); + } + } + public void setVisibilityNegatedImmediate() { try { Utils.verifyOnMainThread(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java index 611c0b7495..2e456f7989 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java @@ -3,7 +3,7 @@ package app.revanced.extension.youtube.videoplayer; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.settings.preference.CustomDialogListPreference.*; import static app.revanced.extension.youtube.patches.VideoInformation.AUTOMATIC_VIDEO_QUALITY_VALUE; -import static app.revanced.extension.youtube.patches.VideoInformation.VIDEO_QUALITY_PREMIUM_NAME; +import static app.revanced.extension.youtube.patches.VideoInformation.isPremiumVideoQuality; import static app.revanced.extension.youtube.videoplayer.PlayerControlButton.fadeInDuration; import static app.revanced.extension.youtube.videoplayer.PlayerControlButton.getDialogBackgroundColor; @@ -23,16 +23,15 @@ import androidx.annotation.Nullable; import app.revanced.extension.shared.ui.Dim; import app.revanced.extension.shared.ui.SheetBottomDialog; import app.revanced.extension.youtube.shared.PlayerType; -import com.google.android.libraries.youtube.innertube.model.media.VideoQuality; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.patches.VideoInformation; +import app.revanced.extension.youtube.patches.VideoInformation.VideoQualityInterface; import app.revanced.extension.youtube.patches.playback.quality.RememberVideoQualityPatch; import app.revanced.extension.youtube.settings.Settings; import kotlin.Unit; @@ -48,7 +47,7 @@ public class VideoQualityDialogButton { private static CharSequence currentOverlayText; static { - VideoInformation.onQualityChange.addObserver((@Nullable VideoQuality quality) -> { + VideoInformation.onQualityChange.addObserver((@Nullable VideoQualityInterface quality) -> { updateButtonText(quality); return Unit.INSTANCE; }); @@ -79,7 +78,7 @@ public class VideoQualityDialogButton { }, view -> { try { - VideoQuality[] qualities = VideoInformation.getCurrentQualities(); + VideoQualityInterface[] qualities = VideoInformation.getCurrentQualities(); if (qualities == null) { Logger.printDebug(() -> "Cannot reset quality, videoQualities is null"); return true; @@ -87,7 +86,7 @@ public class VideoQualityDialogButton { // Reset to default quality. final int defaultResolution = RememberVideoQualityPatch.getDefaultQualityResolution(); - for (VideoQuality quality : qualities) { + for (VideoQualityInterface quality : qualities) { final int resolution = quality.patch_getResolution(); if (resolution != AUTOMATIC_VIDEO_QUALITY_VALUE && resolution <= defaultResolution) { Logger.printDebug(() -> "Resetting quality to: " + quality); @@ -142,7 +141,7 @@ public class VideoQualityDialogButton { /** * Updates the button text based on the current video quality. */ - public static void updateButtonText(@Nullable VideoQuality quality) { + public static void updateButtonText(@Nullable VideoQualityInterface quality) { try { Utils.verifyOnMainThread(); if (instance == null) return; @@ -164,7 +163,7 @@ public class VideoQualityDialogButton { }; text.append(qualityText); - if (quality != null && quality.patch_getQualityName().contains(VIDEO_QUALITY_PREMIUM_NAME)) { + if (quality != null && isPremiumVideoQuality(quality)) { // Underline the entire "FHD" text for 1080p Premium. text.setSpan(new UnderlineSpan(), 0, qualityText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } @@ -187,8 +186,8 @@ public class VideoQualityDialogButton { */ private static void showVideoQualityDialog(Context context) { try { - VideoQuality[] currentQualities = VideoInformation.getCurrentQualities(); - VideoQuality currentQuality = VideoInformation.getCurrentQuality(); + VideoQualityInterface[] currentQualities = VideoInformation.getCurrentQualities(); + VideoQualityInterface currentQuality = VideoInformation.getCurrentQuality(); if (currentQualities == null || currentQuality == null) { Logger.printDebug(() -> "Cannot show qualities dialog, videoQualities is null"); return; @@ -201,7 +200,7 @@ public class VideoQualityDialogButton { // -1 adjustment for automatic quality at first index. int listViewSelectedIndex = -1; - for (VideoQuality quality : currentQualities) { + for (VideoQualityInterface quality : currentQualities) { if (quality.patch_getQualityName().equals(currentQuality.patch_getQualityName())) { break; } @@ -209,7 +208,7 @@ public class VideoQualityDialogButton { } List qualityLabels = new ArrayList<>(currentQualities.length - 1); - for (VideoQuality availableQuality : currentQualities) { + for (VideoQualityInterface availableQuality : currentQualities) { if (availableQuality.patch_getResolution() != AUTOMATIC_VIDEO_QUALITY_VALUE) { qualityLabels.add(availableQuality.patch_getQualityName()); } @@ -283,7 +282,7 @@ public class VideoQualityDialogButton { listView.setOnItemClickListener((parent, view, which, id) -> { try { final int originalIndex = which + 1; // Adjust for automatic. - VideoQuality selectedQuality = currentQualities[originalIndex]; + VideoQualityInterface selectedQuality = currentQualities[originalIndex]; RememberVideoQualityPatch.userChangedQuality(selectedQuality.patch_getResolution()); VideoInformation.changeQuality(selectedQuality); diff --git a/extensions/youtube/stub/src/main/java/com/google/android/libraries/youtube/innertube/model/media/VideoQuality.java b/extensions/youtube/stub/src/main/java/com/google/android/libraries/youtube/innertube/model/media/VideoQuality.java deleted file mode 100644 index 628c423abe..0000000000 --- a/extensions/youtube/stub/src/main/java/com/google/android/libraries/youtube/innertube/model/media/VideoQuality.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.google.android.libraries.youtube.innertube.model.media; - -public abstract class VideoQuality implements Comparable { - public abstract String patch_getQualityName(); - - public abstract int patch_getResolution(); -} - diff --git a/patches/api/patches.api b/patches/api/patches.api index 9d48fa58ce..57f2abaa19 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -485,6 +485,10 @@ public final class app/revanced/patches/music/misc/androidauto/UnlockAndroidAuto public static final fun getUnlockAndroidAutoMediaBrowserPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/music/misc/audio/ForceOriginalAudioPatchKt { + public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatchKt { public static final fun getRemoveBackgroundPlaybackRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -539,10 +543,6 @@ public final class app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPat public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatchKt { - public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/Patch; public static final fun is_7_16_or_greater ()Z @@ -551,6 +551,8 @@ public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { public static final fun is_8_10_or_greater ()Z public static final fun is_8_11_or_greater ()Z public static final fun is_8_15_or_greater ()Z + public static final fun is_8_40_or_greater ()Z + public static final fun is_8_41_or_greater ()Z } public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatchKt { @@ -1479,15 +1481,11 @@ public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatchKt { - public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/ad/video/VideoAdsPatchKt { public static final fun getVideoAdsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatchKt { +public final class app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoURLPatchKt { public static final fun getCopyVideoURLPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1495,6 +1493,10 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD public static final fun getRemoveViewerDiscretionDialogPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/interaction/doubletap/AddMoreDoubleTapToSeekLengthOptionsPatchKt { + public static final fun getAddMoreDoubleTapToSeekLengthOptionsPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1503,18 +1505,22 @@ public final class app/revanced/patches/youtube/interaction/downloads/DownloadsP public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/interaction/hapticfeedback/DisableHapticFeedbackPatchKt { + public static final fun getDisableHapticFeedbackPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatchKt { public static final fun getDisablePreciseSeekingGesturePatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatchKt { - public static final fun getEnableSeekbarTappingPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatchKt { public static final fun getEnableSlideToSeekPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/interaction/seekbar/EnableTapToSeekPatchKt { + public static final fun getEnableTapToSeekPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatchKt { public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1523,10 +1529,6 @@ public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch public static final fun getSeekbarPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatchKt { - public static final fun getSeekbarThumbnailsPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatchKt { public static final fun getSwipeControlsPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1543,12 +1545,12 @@ public final class app/revanced/patches/youtube/layout/branding/header/ChangeHea public static final fun getChangeHeaderPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatchKt { +public final class app/revanced/patches/youtube/layout/buttons/action/HideVideoActionsButtonsPatchKt { public static final fun getHideVideoActionButtonsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatchKt { - public static final fun getNavigationButtonsPatch ()Lapp/revanced/patcher/patch/Patch; +public final class app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatchKt { + public static final fun getNavigationBarPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatchKt { @@ -1559,11 +1561,15 @@ public final class app/revanced/patches/youtube/layout/formfactor/ChangeFormFact public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/layout/hide/autoplaypreview/HideAutoplayPreviewPatchKt { + public static final fun getHideAutoplayPreviewPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatchKt { public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatchKt { +public final class app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/HideEndScreenSuggestedVideoPatchKt { public static final fun getHideEndScreenSuggestedVideoPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1579,10 +1585,14 @@ public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCa public static final fun getHideInfoCardsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatchKt { +public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenu/HidePlayerFlyoutMenuPatchKt { public static final fun getHidePlayerFlyoutMenuItemsPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatchKt { + public static final fun getDisablePlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatchKt { public static final fun getHideRelatedVideoOverlayPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1595,7 +1605,7 @@ public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsCom public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopupKt { +public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTVPopupPatchKt { public static final fun getDisableSignInToTVPopupPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1607,10 +1617,6 @@ public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatc public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt { - public static final fun getDisablePlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatchKt { public static final fun getExitFullscreenPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1637,10 +1643,6 @@ public final class app/revanced/patches/youtube/layout/returnyoutubedislike/Vote public static fun values ()[Lapp/revanced/patches/youtube/layout/returnyoutubedislike/Vote; } -public final class app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatchKt { - public static final fun getWideSearchBarPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatchKt { public static final fun getSeekbarColorPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1681,6 +1683,10 @@ public final class app/revanced/patches/youtube/layout/thumbnails/BypassImageReg public static final fun getBypassImageRegionRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/layout/toolbar/ToolbarHookPatchKt { + public static final fun getToolbarHookPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/youtube/misc/announcements/AnnouncementsPatchKt { public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1693,6 +1699,25 @@ public final class app/revanced/patches/youtube/misc/backgroundplayback/Backgrou public static final fun getRemoveBackgroundPlaybackRestrictionsPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/misc/contexthook/ClientContextHookPatchKt { + public static final fun addClientVersionHook (Lapp/revanced/patches/youtube/misc/contexthook/Endpoint;Ljava/lang/String;)V + public static final fun addOSNameHook (Lapp/revanced/patches/youtube/misc/contexthook/Endpoint;Ljava/lang/String;)V + public static final fun getHookClientContextPatch ()Lapp/revanced/patcher/patch/Patch; +} + +public final class app/revanced/patches/youtube/misc/contexthook/Endpoint : java/lang/Enum { + public static final field BROWSE Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; + public static final field GUIDE Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; + public static final field REEL Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; + public static final field SEARCH Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getGetEndpointMethods ()[Lkotlin/jvm/functions/Function1; + public final fun getInstructions ()Ljava/lang/String; + public final fun setInstructions (Ljava/lang/String;)V + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; + public static fun values ()[Lapp/revanced/patches/youtube/misc/contexthook/Endpoint; +} + public final class app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatchKt { public static final fun getEnableDebuggingPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1705,6 +1730,15 @@ public final class app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomain public static final fun getCheckWatchHistoryDomainNameResolutionPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/youtube/misc/engagement/EngagementPanelHookPatchKt { + public static final fun addEngagementPanelIdHook (Ljava/lang/String;)V + public static final fun getEngagementPanelHookPatch ()Lapp/revanced/patcher/patch/Patch; + public static final fun getPanelControllerMethod ()Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; + public static final fun getPanelIdIndex ()I + public static final fun getPanelIdRegister ()I + public static final fun getPanelIdSmaliInstruction ()Ljava/lang/String; +} + public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -1717,16 +1751,12 @@ public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatchKt { public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/Patch; } -public final class app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatchKt { - public static final fun getDisableHapticFeedbackPatch ()Lapp/revanced/patcher/patch/Patch; -} - public final class app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHookKt { - public static final fun addImageUrlErrorCallbackHook (Ljava/lang/String;)V - public static final fun addImageUrlHook (Ljava/lang/String;Z)V - public static synthetic fun addImageUrlHook$default (Ljava/lang/String;ZILjava/lang/Object;)V - public static final fun addImageUrlSuccessCallbackHook (Ljava/lang/String;)V - public static final fun getCronetImageUrlHookPatch ()Lapp/revanced/patcher/patch/Patch; + public static final fun addImageURLErrorCallbackHook (Ljava/lang/String;)V + public static final fun addImageURLHook (Ljava/lang/String;Z)V + public static synthetic fun addImageURLHook$default (Ljava/lang/String;ZILjava/lang/Object;)V + public static final fun addImageURLSuccessCallbackHook (Ljava/lang/String;)V + public static final fun getCronetImageURLHookPatch ()Lapp/revanced/patcher/patch/Patch; } public final class app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatchKt { @@ -1799,14 +1829,23 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_22_or_greater ()Z public static final fun is_20_26_or_greater ()Z public static final fun is_20_28_or_greater ()Z + public static final fun is_20_29_or_greater ()Z public static final fun is_20_30_or_greater ()Z public static final fun is_20_31_or_greater ()Z public static final fun is_20_34_or_greater ()Z public static final fun is_20_37_or_greater ()Z public static final fun is_20_39_or_greater ()Z + public static final fun is_20_40_or_greater ()Z public static final fun is_20_41_or_greater ()Z public static final fun is_20_45_or_greater ()Z public static final fun is_20_46_or_greater ()Z + public static final fun is_20_49_or_greater ()Z + public static final fun is_21_02_or_greater ()Z + public static final fun is_21_03_or_greater ()Z + public static final fun is_21_05_or_greater ()Z + public static final fun is_21_06_or_greater ()Z + public static final fun is_21_07_or_greater ()Z + public static final fun is_21_08_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { @@ -1913,17 +1952,22 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { } public final class app/revanced/util/BytecodeUtilsKt { - public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;ILjava/lang/String;)V public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/extensions/ExternalLabel;)V + public static final fun cloneMutable (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;ILjava/util/List;Ljava/lang/String;I)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; + public static synthetic fun cloneMutable$default (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;ILjava/util/List;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; + public static final fun cloneMutableAndPreserveParameters (Lapp/revanced/patcher/patch/BytecodePatchContext;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; + public static final fun cloneMutableAndPreserveParameters (Lcom/android/tools/smali/dexlib2/iface/Method;Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableClassDef;)Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableMethod; public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;D)Z public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;F)Z public static final fun containsLiteralInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z - public static final fun findFreeRegister (Lcom/android/tools/smali/dexlib2/iface/Method;I[I)I public static final fun findInstructionIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun findInstructionIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)Ljava/util/List; public static final fun findInstructionIndicesReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun findInstructionIndicesReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)Ljava/util/List; public static final fun forEachInstructionAsSequence (Lapp/revanced/patcher/patch/BytecodePatchContext;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;)V + public static final fun getNumberOfParameterRegisters (Lcom/android/tools/smali/dexlib2/iface/Method;)I + public static final fun getNumberOfParameterRegistersLogical (Lcom/android/tools/smali/dexlib2/iface/Method;)I + public static final fun getP0Register (Lcom/android/tools/smali/dexlib2/iface/Method;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILcom/android/tools/smali/dexlib2/Opcode;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)I @@ -1983,6 +2027,24 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun traverseClassHierarchy (Lapp/revanced/patcher/patch/BytecodePatchContext;Lapp/revanced/com/android/tools/smali/dexlib2/mutable/MutableClassDef;Lkotlin/jvm/functions/Function1;)V } +public final class app/revanced/util/FreeRegisterProvider { + public final fun availableCount ()I + public final fun getAllocatedFreeRegisters ()Ljava/util/List; + public final fun getFreeRegister ()I + public final fun getMethod ()Lcom/android/tools/smali/dexlib2/iface/Method; + public final fun getUsedAndUnAvailableRegisters ()Ljava/util/List; + public final fun hasFreeRegisters ()Z +} + +public final class app/revanced/util/FreeRegisterProviderKt { + public static final fun findFreeRegister (Lcom/android/tools/smali/dexlib2/iface/Method;ILjava/util/List;)I + public static final fun findFreeRegister (Lcom/android/tools/smali/dexlib2/iface/Method;I[I)I + public static final fun getFreeRegisterProvider (Lcom/android/tools/smali/dexlib2/iface/Method;IILjava/util/List;)Lapp/revanced/util/FreeRegisterProvider; + public static final fun getFreeRegisterProvider (Lcom/android/tools/smali/dexlib2/iface/Method;II[I)Lapp/revanced/util/FreeRegisterProvider; + public static final fun getRegistersUsed (Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;)Ljava/util/List; + public static final fun getWriteRegister (Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;)Ljava/lang/Integer; +} + public final class app/revanced/util/ResourceGroup { public fun (Ljava/lang/String;[Ljava/lang/String;)V public final fun getResourceDirectoryName ()Ljava/lang/String; diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt index 0535d6f06f..db17c2f740 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/MethodCall.kt @@ -35,23 +35,10 @@ interface IMethodCall { instruction: Instruction35c, instructionIndex: Int, ) { - val registers = arrayOf( - instruction.registerC, - instruction.registerD, - instruction.registerE, - instruction.registerF, - instruction.registerG, - ) - val argsNum = methodParams.size + 1 // + 1 for instance of definedClassName - if (argsNum > registers.size) { - // should never happen, but just to be sure (also for the future) a safety check - throw RuntimeException( - "Not enough registers for $definedClassName#$methodName: " + - "Required $argsNum registers, but only got ${registers.size}.", - ) + val args = with(instruction) { + arrayOf(registerC, registerD, registerE, registerF, registerG) + .take(registerCount).joinToString(", ") { "v$it" } } - - val args = registers.take(argsNum).joinToString(separator = ", ") { reg -> "v$reg" } val replacementMethod = "$methodName(${definedClassName}${methodParams.joinToString(separator = "")})$returnType" diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt index 410a6aff3e..daa52011fb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt @@ -9,7 +9,8 @@ import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideVideoAdsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/HideVideoAdsPatch;" @Suppress("unused") val hideMusicVideoAdsPatch = bytecodePatch( @@ -26,6 +27,8 @@ val hideMusicVideoAdsPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt index cc4e23c09a..96aac10c51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt @@ -19,6 +19,8 @@ val enableExclusiveAudioPlaybackPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index aa8a0449d6..2e227b60b1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -12,7 +12,8 @@ import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.util.findFreeRegister -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/PermanentRepeatPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/PermanentRepeatPatch;" @Suppress("unused") val permanentRepeatPatch = bytecodePatch( @@ -29,6 +30,8 @@ val permanentRepeatPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index 0587878df9..ff6b5326a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -29,15 +29,15 @@ private val disableSplashAnimationPatch = bytecodePatch { // causing the original YT Music logo to momentarily flash on screen as the animation starts. // // Could replace the lottie animation file with our own custom animation (app_launch.json), - // but the animation is not always the same size as the launch screen and it's still - // barely shown. Instead turn off the animation entirely (app will also launch a little faster). + // but the animation is not always the same size as the launch screen, and it's still + // barely shown. Instead, turn off the animation entirely (app will also launch a little faster). cairoSplashAnimationConfigMethod.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow( ResourceType.LAYOUT["main_activity_launch_animation"], ) val checkCastIndex = indexOfFirstInstructionOrThrow(literalIndex) { opcode == Opcode.CHECK_CAST && - getReference()?.type == "Lcom/airbnb/lottie/LottieAnimationView;" + getReference()?.type == "Lcom/airbnb/lottie/LottieAnimationView;" } val register = getInstruction(checkCastIndex).registerA @@ -73,6 +73,8 @@ val customBrandingPatch = baseCustomBrandingPatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt index d76fb66395..1d01efcab1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -7,8 +7,8 @@ import app.revanced.patches.shared.misc.mapping.ResourceType internal val BytecodePatchContext.cairoSplashAnimationConfigMethod by gettingFirstMethodDeclaratively { name("onCreate") - returnType("V") definingClass(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE) + returnType("V") parameterTypes("Landroid/os/Bundle;") instructions(ResourceType.LAYOUT("main_activity_launch_animation")) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt index 92aa2b6356..e8e1227997 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/Fingerprints.kt @@ -27,9 +27,7 @@ internal val BytecodePatchContext.historyMenuItemMethodMatch by composingFirstMe Opcode.RETURN_VOID, ) literal { historyMenuItem } - custom { - immutableClassDef.methods.count() == 5 - } + custom { immutableClassDef.methods.count() == 5 || immutableClassDef.methods.count() == 4 } } internal val BytecodePatchContext.historyMenuItemOfflineTabMethodMatch by composingFirstMethod { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt index 9c2ea8054c..17a544f89f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt @@ -31,7 +31,8 @@ internal var searchButton = -1L internal var topBarMenuItemImageView = -1L private set -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideButtonsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/HideButtonsPatch;" @Suppress("unused") val hideButtonsPatch = bytecodePatch( @@ -49,6 +50,8 @@ val hideButtonsPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) @@ -91,7 +94,11 @@ val hideButtonsPatch = bytecodePatch( arrayOf( Triple(playerOverlayChipMethod, playerOverlayChip, "hideCastButton"), Triple(searchActionViewMethod, searchButton, "hideSearchButton"), - Triple(topBarMenuItemImageViewMethod, topBarMenuItemImageView, "hideNotificationButton"), + Triple( + topBarMenuItemImageViewMethod, + topBarMenuItemImageView, + "hideNotificationButton" + ), ).forEach { (method, resourceIdLiteral, methodName) -> method.apply { val resourceIndex = indexOfFirstLiteralInstructionOrThrow(resourceIdLiteral) @@ -104,7 +111,7 @@ val hideButtonsPatch = bytecodePatch( addInstruction( targetIndex + 1, "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", + "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index 7bc195419c..aa944fee58 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -15,7 +15,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction internal var chipCloud = -1L private set -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;" @Suppress("unused") val hideCategoryBarPatch = bytecodePatch( @@ -32,6 +33,8 @@ val hideCategoryBarPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) @@ -46,7 +49,8 @@ val hideCategoryBarPatch = bytecodePatch( chipCloudMethodMatch.let { val targetIndex = it[-1] - val targetRegister = it.method.getInstruction(targetIndex).registerA + val targetRegister = + it.method.getInstruction(targetIndex).registerA it.method.addInstruction( targetIndex + 1, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt index 0cf6ad4c90..7c88029dca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt @@ -8,5 +8,12 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( lithoFilterPatch = lithoFilterPatch, settingsPatch = settingsPatch, filterClasses = setOf("Lapp/revanced/extension/shared/patches/litho/CustomFilter;"), - compatibleWithPackages = arrayOf("com.google.android.apps.youtube.music" to setOf("7.29.52", "8.10.52")), + compatibleWithPackages = arrayOf( + "com.google.android.apps.youtube.music" to setOf( + "7.29.52", + "8.10.52", + "8.37.56", + "8.40.54" + ) + ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt index 7a699b2675..d8f78efe2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt @@ -22,7 +22,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/ChangeMiniplayerColorPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/ChangeMiniplayerColorPatch;" @Suppress("unused") val changeMiniplayerColorPatch = bytecodePatch( @@ -40,6 +41,8 @@ val changeMiniplayerColorPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) @@ -71,10 +74,11 @@ val changeMiniplayerColorPatch = bytecodePatch( miniPlayerConstructorMethodMatch.immutableMethod.indexOfFirstInstructionReversedOrThrow { getReference()?.name == "getColor" } - val iPutIndex = miniPlayerConstructorMethodMatch.immutableMethod.indexOfFirstInstructionOrThrow( - colorGreyIndex, - Opcode.IPUT, - ) + val iPutIndex = + miniPlayerConstructorMethodMatch.immutableMethod.indexOfFirstInstructionOrThrow( + colorGreyIndex, + Opcode.IPUT, + ) val colorMathPlayerIPutReference = miniPlayerConstructorMethodMatch.immutableMethod .getInstruction(iPutIndex).reference diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt index 5a3ee206e3..cd621ba5ed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt @@ -7,12 +7,11 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef -internal val BytecodePatchContext.miniPlayerConstructorMethodMatch by composingFirstMethod { - returnType("V") - instructions( - ResourceType.ID("mpp_player_bottom_sheet"), - "sharedToggleMenuItemMutations"(), - ) +internal val BytecodePatchContext.miniPlayerConstructorMethodMatch by composingFirstMethod( + "sharedToggleMenuItemMutations" +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions(ResourceType.ID("music_playback_controls")) } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt index 00984d1e01..0021d79190 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt @@ -2,34 +2,45 @@ package app.revanced.patches.music.layout.navigationbar import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val BytecodePatchContext.tabLayoutTextMethodMatch by composingFirstMethod("FEmusic_search") { + +internal val BytecodePatchContext.tabLayoutTextMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") - opcodes( - Opcode.IGET, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IF_NEZ, - Opcode.SGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, - ) - custom { - containsLiteralInstruction(text1) && - indexOfGetVisibilityInstruction(this) >= 0 - } -} + instructions( + anyOf( + "FEmusic_search"(), // 8.49 and lower. + "FEsearch"() // 8.50+ + ), + // Hide navigation label. + ResourceType.ID("text1"), + afterAtMost( + 5, + method { toString() == "Landroid/view/View;->findViewById(I)Landroid/view/View;" } + ), + afterAtMost( + 5, + allOf(Opcode.CHECK_CAST(), type("Landroid/widget/TextView;")) + ), + // Set navigation enum. + anyOf( + Opcode.SGET_OBJECT(), + Opcode.IGET_OBJECT() + ), + afterAtMost(5, allOf(Opcode.IGET(), field { type == "I" })), -internal fun indexOfGetVisibilityInstruction(method: Method) = method.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "getVisibility" + afterAtMost( + 5, + allOf( + Opcode.INVOKE_STATIC(), + method { returnType == "L" && parameterTypes.size == 1 && parameterTypes.first() == "I" }) + ), + after(Opcode.MOVE_RESULT_OBJECT()), + // Hide navigation buttons. + method("getVisibility") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt index f977920b34..5ff1997f61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt @@ -2,7 +2,6 @@ package app.revanced.patches.music.layout.navigationbar import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources @@ -14,9 +13,6 @@ import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @@ -24,7 +20,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction internal var text1 = -1L private set -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/NavigationBarPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/NavigationBarPatch;" @Suppress("unused") val navigationBarPatch = bytecodePatch( @@ -58,6 +55,8 @@ val navigationBarPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) @@ -83,39 +82,44 @@ val navigationBarPatch = bytecodePatch( ), ) - tabLayoutTextMethodMatch.method.apply { - // Hide navigation labels. - val constIndex = indexOfFirstLiteralInstructionOrThrow(text1) - val targetIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.CHECK_CAST) - val targetParameter = getInstruction(targetIndex).reference - val targetRegister = getInstruction(targetIndex).registerA + tabLayoutTextMethodMatch.let { + it.method.apply { + // Modify in reverse order to preserve match indices. - if (!targetParameter.toString().endsWith("Landroid/widget/TextView;")) { - throw PatchException("Method signature parameter did not match: $targetParameter") + // Hide navigation buttons. + val pivotTabIndex = it[-1] + val pivotTabRegister = + getInstruction(pivotTabIndex).registerC + + addInstruction( + pivotTabIndex, + "invoke-static { v$pivotTabRegister }, " + + "${EXTENSION_CLASS_DESCRIPTOR}->hideNavigationButton(Landroid/view/View;)V" + ) + + + // Set navigation enum and hide navigation buttons. + val enumIndex = it[7] + val enumRegister = getInstruction(enumIndex).registerA + + addInstruction( + enumIndex + 1, + "invoke-static { v$enumRegister }, " + + "${EXTENSION_CLASS_DESCRIPTOR}->setLastAppNavigationEnum(Ljava/lang/Enum;)V" + ) + + + // Hide navigation labels. + val labelIndex = it[3] + val targetParameter = getInstruction(labelIndex).reference + val targetRegister = getInstruction(labelIndex).registerA + + addInstruction( + labelIndex + 1, + "invoke-static { v$targetRegister }, " + + "${EXTENSION_CLASS_DESCRIPTOR}->hideNavigationLabel(Landroid/widget/TextView;)V" + ) } - - addInstruction( - targetIndex + 1, - "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V", - ) - - // Set navigation enum and hide navigation buttons. - val enumIndex = tabLayoutTextMethodMatch[0] + 3 - val enumRegister = getInstruction(enumIndex).registerA - val insertEnumIndex = indexOfFirstInstructionOrThrow(Opcode.AND_INT_LIT8) - 2 - - val pivotTabIndex = indexOfGetVisibilityInstruction(this) - val pivotTabRegister = getInstruction(pivotTabIndex).registerC - - addInstruction( - pivotTabIndex, - "invoke-static { v$pivotTabRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButton(Landroid/view/View;)V", - ) - - addInstruction( - insertEnumIndex, - "invoke-static { v$enumRegister }, $EXTENSION_CLASS_DESCRIPTOR->setLastAppNavigationEnum(Ljava/lang/Enum;)V", - ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index d6f1c0092d..3ec4d3af44 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -13,7 +13,8 @@ import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideGetPremiumPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/HideGetPremiumPatch;" @Suppress("unused") val hideGetMusicPremiumPatch = bytecodePatch( @@ -30,6 +31,8 @@ val hideGetMusicPremiumPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) @@ -56,7 +59,7 @@ val hideGetMusicPremiumPatch = bytecodePatch( addInstruction( insertIndex + 1, "invoke-virtual {v$getPremiumViewRegister, v$visibilityRegister}, " + - "Landroid/view/View;->setVisibility(I)V", + "Landroid/view/View;->setVisibility(I)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/theme/ThemePatch.kt index c6e7091c6a..39a78c3d30 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/theme/ThemePatch.kt @@ -17,19 +17,23 @@ val themePatch = baseThemePatch( dependsOn( sharedExtensionPatch, baseThemeResourcePatch( - darkColorNames = THEME_DEFAULT_DARK_COLOR_NAMES + setOf( - "yt_black_pure", - "yt_black_pure_opacity80", - "ytm_color_grey_12", - "material_grey_800" - ) + getDarkColorNames = { + THEME_DEFAULT_DARK_COLOR_NAMES + setOf( + "yt_black_pure", + "yt_black_pure_opacity80", + "ytm_color_grey_12", + "material_grey_800" + ) + } ) ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" + "8.10.52", + "8.37.56", + "8.40.54" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt index dd2b2eaac7..e5bb4eed22 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt @@ -18,19 +18,25 @@ val unlockAndroidAutoMediaBrowserPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) apply { checkCertificateMethod.returnEarly(true) - searchMediaItemsConstructorMethod.immutableClassDef.getSearchMediaItemsExecuteMethod().apply { - val targetIndex = instructions.indexOfFirst { - it.opcode == Opcode.IGET_OBJECT && it.fieldReference?.type == "Ljava/lang/String;" - } + searchMediaItemsConstructorMethod.immutableClassDef.getSearchMediaItemsExecuteMethod() + .apply { + val targetIndex = instructions.indexOfFirst { + it.opcode == Opcode.IGET_OBJECT && it.fieldReference?.type == "Ljava/lang/String;" + } - val register = instructions[targetIndex].registersUsed.first() - replaceInstruction(targetIndex, "const-string v$register, \"com.google.android.apps.youtube.music\"") - } + val register = instructions[targetIndex].registersUsed.first() + replaceInstruction( + targetIndex, + "const-string v$register, \"com.google.android.apps.youtube.music\"" + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/audio/ForceOriginalAudioPatch.kt similarity index 89% rename from patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/music/misc/audio/ForceOriginalAudioPatch.kt index cbdc7ab803..4fae08ecfb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/audio/ForceOriginalAudioPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.music.misc.tracks +package app.revanced.patches.music.misc.audio import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen @@ -20,7 +20,9 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" + "8.10.52", + "8.37.56", + "8.40.54" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt index 5d8b651c18..cbe36736ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -19,6 +19,8 @@ val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( "com.google.android.apps.youtube.music"( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/debugging/EnableDebuggingPatch.kt index 16e4ddd801..77edc32b42 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/debugging/EnableDebuggingPatch.kt @@ -3,19 +3,31 @@ package app.revanced.patches.music.misc.debugging import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch +import app.revanced.patches.music.playservice.is_8_40_or_greater +import app.revanced.patches.music.playservice.is_8_41_or_greater import app.revanced.patches.shared.misc.debugging.enableDebuggingPatch @Suppress("unused") val enableDebuggingPatch = enableDebuggingPatch( - sharedExtensionPatch = sharedExtensionPatch, - settingsPatch = settingsPatch, - compatibleWithPackages = arrayOf( - "com.google.android.apps.youtube.music" to setOf( - "7.29.52", - "8.10.52" + block = { + dependsOn( + sharedExtensionPatch, + settingsPatch, ) - ), + + compatibleWith( + "com.google.android.apps.youtube.music"( + "7.29.52", + "8.10.52", + "8.37.56", + "8.40.54", + ) + ) + }, // String feature flag does not appear to be present with YT Music. - hookStringFeatureFlag = false, + hookStringFeatureFlag = { false }, + // 8.40 has changes not worth supporting. + hookLongFeatureFlag = { !is_8_40_or_greater || is_8_41_or_greater }, + hookDoubleFeatureFlag = { !is_8_40_or_greater || is_8_41_or_greater }, preferenceScreen = PreferenceScreen.MISC, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index aa00a581ab..f3eb9b08ee 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -13,7 +13,9 @@ val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameReso compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" + "8.10.52", + "8.37.56", + "8.40.54" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt index 88cfe2ca6f..d424f1685e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt @@ -32,6 +32,8 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( MUSIC_PACKAGE_NAME( "7.29.52", "8.10.52", + "8.37.56", + "8.40.54", ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/privacy/SanitizeSharingLinksPatch.kt index e173b5c849..6aa5863fa2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/privacy/SanitizeSharingLinksPatch.kt @@ -16,7 +16,9 @@ val sanitizeSharingLinksPatch = sanitizeSharingLinksPatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" + "8.10.52", + "8.37.56", + "8.40.54" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt index 497e100112..425630b7ed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt @@ -8,14 +8,18 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME +import app.revanced.patches.music.playservice.is_8_40_or_greater +import app.revanced.patches.music.playservice.versionCheckPatch +import app.revanced.patches.shared.boldIconsFeatureFlagMethodMatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.modifyActivityForSettingsInjection import app.revanced.util.copyXmlNode import app.revanced.util.inputStreamFromBundledResource +import app.revanced.util.insertLiteralOverride -private const val GOOGLE_API_ACTIVITY_HOOK_CLASS_DESCRIPTOR = +private const val MUSIC_ACTIVITY_HOOK_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/settings/MusicActivityHook;" private val preferences = mutableSetOf() @@ -72,6 +76,7 @@ val settingsPatch = bytecodePatch( sharedExtensionPatch, settingsResourcePatch, addResourcesPatch, + versionCheckPatch ) apply { @@ -90,6 +95,12 @@ val settingsPatch = bytecodePatch( SwitchPreference("revanced_settings_search_history") ) + if (is_8_40_or_greater) { + PreferenceScreen.GENERAL.addPreferences( + SwitchPreference("revanced_settings_disable_bold_icons") + ) + } + PreferenceScreen.MISC.addPreferences( TextPreference( key = null, @@ -103,9 +114,18 @@ val settingsPatch = bytecodePatch( modifyActivityForSettingsInjection( googleApiActivityMethod.classDef, googleApiActivityMethod, - GOOGLE_API_ACTIVITY_HOOK_CLASS_DESCRIPTOR, + MUSIC_ACTIVITY_HOOK_CLASS_DESCRIPTOR, true ) + + if (is_8_40_or_greater) { + boldIconsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$MUSIC_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useBoldIcons(Z)Z" + ) + } + } } afterDependents { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt index f019fca848..c4c6764e54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt @@ -31,7 +31,9 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" + "8.10.52", + "8.37.56", + "8.40.54" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt index 134121b677..003fa7b6b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt @@ -20,8 +20,11 @@ var is_8_11_or_greater: Boolean by Delegates.notNull() private set var is_8_15_or_greater: Boolean by Delegates.notNull() private set +var is_8_40_or_greater: Boolean by Delegates.notNull() + private set +var is_8_41_or_greater: Boolean by Delegates.notNull() + private set -@Suppress("unused") val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app." ) { @@ -38,5 +41,7 @@ val versionCheckPatch = resourcePatch( is_8_10_or_greater = 251099000 <= playStoreServicesVersion is_8_11_or_greater = 251199000 <= playStoreServicesVersion is_8_15_or_greater = 251530000 <= playStoreServicesVersion + is_8_40_or_greater = 254080000 <= playStoreServicesVersion + is_8_41_or_greater = 254180000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index 035523a62d..d5dddc4da6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -1,7 +1,14 @@ package app.revanced.patches.shared +import app.revanced.patcher.accessFlags +import app.revanced.patcher.composingFirstMethod import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.AccessFlags internal val BytecodePatchContext.castContextFetchMethod by gettingFirstMethodDeclaratively( "Error fetching CastContext." @@ -11,3 +18,14 @@ internal val BytecodePatchContext.primeMethod by gettingFirstMethodDeclaratively "com.android.vending", "com.google.android.GoogleCamera" ) + +// Flag is present in YouTube 20.23, but bold icons are missing and forcing them crashes the app. +// 20.31 is the first target with all the bold icons present. +internal val BytecodePatchContext.boldIconsFeatureFlagMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + instructions( + 45685201L(), + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt index 933af78824..f64366b7eb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/AddBrandLicensePatch.kt @@ -1,8 +1,10 @@ package app.revanced.patches.shared.layout.branding +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.rawResourcePatch import app.revanced.util.inputStreamFromBundledResource import java.nio.file.Files +import java.util.logging.Logger /** * Copies a branding license text file to the target apk. @@ -20,6 +22,8 @@ internal val addBrandLicensePatch = rawResourcePatch { val targetFile = get(brandingLicenseFileName, false).toPath() - Files.copy(inputFileStream, targetFile) + if (Files.exists(targetFile)) Logger.getLogger(this::class.java.name) + .warning("Already patched by ReVanced") + else Files.copy(inputFileStream, targetFile) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt index 750dee5fdf..35baad31cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -3,6 +3,7 @@ package app.revanced.patches.shared.layout.branding import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstImmutableClassDef import app.revanced.patcher.patch.* import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources @@ -52,9 +53,11 @@ private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf( private const val USER_CUSTOM_MONOCHROME_FILE_NAME = "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" -private const val USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME = "${NOTIFICATION_ICON_NAME}_$CUSTOM_USER_ICON_STYLE_NAME.xml" +private const val USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME = + "${NOTIFICATION_ICON_NAME}_$CUSTOM_USER_ICON_STYLE_NAME.xml" -internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;" +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;" /** * Shared custom branding patch for YouTube and YT Music. @@ -75,7 +78,7 @@ internal fun baseCustomBrandingPatch( ) = resourcePatch( name = "Custom branding", description = "Adds options to change the app icon and app name. " + - "Branding cannot be changed for mounted (root) installations.", + "Branding cannot be changed for mounted (root) installations.", ) { val customName by stringOption( name = "App name", @@ -116,6 +119,8 @@ internal fun baseCustomBrandingPatch( ) numberOfPresetAppNamesExtensionMethod.returnEarly(numberOfPresetAppNames) + userProvidedCustomNameExtensionMethod.returnEarly(customName != null) + userProvidedCustomIconExtensionMethod.returnEarly(customIcon != null) notificationMethod.apply { val getBuilderIndex = if (isYouTubeMusic) { @@ -128,7 +133,7 @@ internal fun baseCustomBrandingPatch( val builderCastIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.CHECK_CAST && - reference?.type == "Landroid/app/Notification\$Builder;" + reference?.type == "Landroid/app/Notification\$Builder;" } indexOfFirstInstructionReversedOrThrow(builderCastIndex) { getReference()?.type == "Ljava/lang/Object;" @@ -173,11 +178,14 @@ internal fun baseCustomBrandingPatch( } apply { + val useCustomName = customName != null + val useCustomIcon = customIcon != null + addResources("shared", "layout.branding.baseCustomBrandingPatch") addResources(addResourcePatchName, "layout.branding.customBrandingPatch") preferenceScreen.addPreferences( - if (customName != null) { + if (useCustomName) { ListPreference( key = "revanced_custom_branding_name", entriesKey = "revanced_custom_branding_name_custom_entries", @@ -186,7 +194,7 @@ internal fun baseCustomBrandingPatch( } else { ListPreference("revanced_custom_branding_name") }, - if (customIcon != null) { + if (useCustomIcon) { ListPreference( key = "revanced_custom_branding_icon", entriesKey = "revanced_custom_branding_icon_custom_entries", @@ -197,9 +205,6 @@ internal fun baseCustomBrandingPatch( }, ) - val useCustomName = customName != null - val useCustomIcon = customIcon != null - iconStyleNames.forEach { style -> copyResources( "custom-branding", @@ -307,7 +312,7 @@ internal fun baseCustomBrandingPatch( activityAliasNameWithIntents, ).childNodes - // The YT application name can appear in some places along side the system + // The YT application name can appear in some places alongside the system // YouTube app, such as the settings app list and in the "open with" file picker. // Because the YouTube app cannot be completely uninstalled and only disabled, // use a custom name for this situation to disambiguate which app is which. @@ -316,6 +321,9 @@ internal fun baseCustomBrandingPatch( "@string/revanced_custom_branding_name_entry_2", ) + val enabledNameIndex = if (useCustomName) numberOfPresetAppNames else 1 // 1 indexing. + val enabledIconIndex = if (useCustomIcon) iconStyleNames.size else 0 // 0 indexing. + for (appNameIndex in 1..numberOfPresetAppNames) { fun aliasName(name: String): String = ".revanced_" + name + '_' + appNameIndex @@ -334,14 +342,14 @@ internal fun baseCustomBrandingPatch( ) // Bundled icons. - iconStyleNames.forEach { style -> + iconStyleNames.forEachIndexed { iconIndex, style -> application.appendChild( createAlias( aliasName = aliasName(style), iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + style, appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, - enabled = false, + enabled = (appNameIndex == enabledNameIndex && iconIndex == enabledIconIndex), intentFilters, ), ) @@ -351,7 +359,7 @@ internal fun baseCustomBrandingPatch( // // Must add all aliases even if the user did not provide a custom icon of their own. // This is because if the user installs with an option, then repatches without the option, - // the alias must still exist because if it was previously enabled and then it's removed + // the alias must still exist because if it was previously enabled, and then it's removed // the app will become broken and cannot launch. Even if the app data is cleared // it still cannot be launched and the only fix is to uninstall the app. // To prevent this, always include all aliases and use dummy data if needed. @@ -361,7 +369,7 @@ internal fun baseCustomBrandingPatch( iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + CUSTOM_USER_ICON_STYLE_NAME, appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, - enabled = false, + enabled = appNameIndex == enabledNameIndex && useCustomIcon, intentFilters, ), ) @@ -413,7 +421,7 @@ internal fun baseCustomBrandingPatch( if (customFiles.isNotEmpty() && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) { throw PatchException( "Must include all required icon files " + - "but only found " + customFiles.map { it.name }, + "but only found " + customFiles.map { it.name }, ) } @@ -444,8 +452,8 @@ internal fun baseCustomBrandingPatch( if (!copiedFiles) { throw PatchException( "Expected to find directories and files: " + - USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() + - "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath, + USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() + + "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt index 074bff4f28..0174c49c93 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -5,13 +5,30 @@ import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags internal val BytecodePatchContext.numberOfPresetAppNamesExtensionMethod by gettingFirstMethodDeclaratively { - name("numberOfPresetAppNames") definingClass(EXTENSION_CLASS_DESCRIPTOR) + name("numberOfPresetAppNames") accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("I") parameterTypes() } + +internal val BytecodePatchContext.userProvidedCustomNameExtensionMethod by gettingFirstMethodDeclaratively { + definingClass(EXTENSION_CLASS_DESCRIPTOR) + name("userProvidedCustomName") + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returnType("Z") + parameterTypes() +} + +internal val BytecodePatchContext.userProvidedCustomIconExtensionMethod by gettingFirstMethodDeclaratively { + definingClass(EXTENSION_CLASS_DESCRIPTOR) + name("userProvidedCustomIcon") + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returnType("Z") + parameterTypes() +} + // A much simpler method exists that can set the small icon (contains string "414843287017"), // but that has limited usage and this one allows changing any part of the notification. internal val BytecodePatchContext.notificationMethod by gettingFirstMethodDeclaratively( diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt index cd298fbb86..8c720c76e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt @@ -1,20 +1,26 @@ package app.revanced.patches.shared.layout.theme -import app.revanced.patcher.patch.* +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption import app.revanced.util.childElementsSequence import java.util.* -internal const val THEME_COLOR_OPTION_DESCRIPTION = "Can be a hex color (#RRGGBB) or a color resource reference." +internal const val THEME_COLOR_OPTION_DESCRIPTION = + "Can be a hex color (#RRGGBB) or a color resource reference." internal val THEME_DEFAULT_DARK_COLOR_NAMES = setOf( - "yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", - "yt_black2", "yt_black3", "yt_black4", "yt_status_bar_background_dark", - "material_grey_850" + "yt_black0", "yt_black1", "yt_black2", "yt_black3", "yt_black4", + "yt_black1_opacity95", "yt_black1_opacity98", + "yt_status_bar_background_dark", "material_grey_850", ) internal val THEME_DEFAULT_LIGHT_COLOR_NAMES = setOf( - "yt_white1", "yt_white1_opacity95", "yt_white1_opacity98", - "yt_white2", "yt_white3", "yt_white4" + "yt_white1", "yt_white2", "yt_white3", "yt_white4", + "yt_white1_opacity95", "yt_white1_opacity98", ) /** @@ -94,8 +100,8 @@ internal fun baseThemePatch( } internal fun baseThemeResourcePatch( - darkColorNames: Set = THEME_DEFAULT_DARK_COLOR_NAMES, - lightColorNames: Set = THEME_DEFAULT_LIGHT_COLOR_NAMES, + getDarkColorNames: () -> Set = { THEME_DEFAULT_DARK_COLOR_NAMES }, + getLightColorNames: () -> Set = { THEME_DEFAULT_LIGHT_COLOR_NAMES }, lightColorReplacement: (() -> String)? = null ) = resourcePatch { apply { @@ -114,6 +120,9 @@ internal fun baseThemeResourcePatch( document("res/values/colors.xml").use { document -> val resourcesNode = document.getElementsByTagName("resources").item(0) + val darkColorNames = getDarkColorNames() + val lightColorNames = getLightColorNames() + resourcesNode.childElementsSequence().forEach { node -> val name = node.getAttribute("name") when { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt index c3c7e3d4c0..d0ef6822c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt @@ -11,7 +11,7 @@ internal val BytecodePatchContext.lithoOnBoundsChangeMethodMatch by composingFir returnType("V") parameterTypes("Landroid/graphics/Rect;") - lateinit var methodDefiningClass: String + var methodDefiningClass = "" custom { methodDefiningClass = definingClass true @@ -23,11 +23,7 @@ internal val BytecodePatchContext.lithoOnBoundsChangeMethodMatch by composingFir field { type == "Landroid/graphics/Path;" && definingClass == methodDefiningClass }, ), afterAtMost( - 5, - method { returnType == "Z" && name == "isStateful" && definingClass == methodDefiningClass }, - ), - afterAtMost( - 5, + 10, allOf( Opcode.IGET_OBJECT(), field { type == "Landroid/graphics/Paint;" && definingClass == methodDefiningClass }, diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt index 6360709519..7862271315 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -14,8 +14,11 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.cloneMutable import app.revanced.util.findMethodFromToString import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -96,58 +99,50 @@ internal fun forceOriginalAudioPatch( ).toMutable(), ) - // Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed. - val helperMethodClass = type - val helperMethodName = "patch_isDefaultAudioTrack" - val helperMethod = ImmutableMethod( - helperMethodClass, - helperMethodName, - listOf(ImmutableMethodParameter("Z", null, null)), - "Z", - AccessFlags.PRIVATE.value, - null, - null, - MutableMethodImplementation(6), - ).toMutable().apply { - addInstructionsWithLabels( - 0, - """ - iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - if-eqz v0, :call_extension - invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z - move-result v3 - return v3 - - :call_extension - invoke-virtual { p0 }, $audioTrackIdMethod - move-result-object v1 - - invoke-virtual { p0 }, $audioTrackDisplayNameMethod - move-result-object v2 - - invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z - move-result v3 - - invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; - move-result-object v0 - iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - return v3 - """, - ) + // Clone the method to add additional registers because the + // isDefaultAudioTrack() has only 1 or 2 registers and 3 are needed. + val clonedMethod = isDefaultAudioTrackMethod.cloneMutable( + additionalRegisters = 4 + ) + + // Replace existing method with cloned with more registers. + methods.apply { + remove(isDefaultAudioTrackMethod) + add(clonedMethod) } - methods.add(helperMethod) - // Modify isDefaultAudioTrack() to call extension helper method. - isDefaultAudioTrackMethod.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.RETURN) - val register = getInstruction(index).registerA + clonedMethod.apply { + // Free registers are added + val free1 = isDefaultAudioTrackMethod.implementation!!.registerCount + 1 + val free2 = free1 + 1 + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN) + val originalResultRegister = + getInstruction(insertIndex).registerA - addInstructions( - index, + clonedMethod.addInstructionsAtControlFlowLabel( + insertIndex, """ - invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z - move-result v$register - """, + iget-object v$free1, p0, $type->$helperFieldName:Ljava/lang/Boolean; + if-eqz v$free1, :call_extension + invoke-virtual { v$free1 }, Ljava/lang/Boolean;->booleanValue()Z + move-result v$free1 + return v$free1 + + :call_extension + invoke-virtual { p0 }, $audioTrackIdMethod + move-result-object v$free1 + + invoke-virtual { p0 }, $audioTrackDisplayNameMethod + move-result-object v$free2 + + invoke-static { v$originalResultRegister, v$free1, v$free2 }, ${EXTENSION_CLASS_DESCRIPTOR}->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z + move-result v$free1 + + invoke-static { v$free1 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; + move-result-object v$free2 + iput-object v$free2, p0, $type->$helperFieldName:Ljava/lang/Boolean; + return v$free1 + """ ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt index aa8bb88bf8..5d84c52978 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt @@ -1,18 +1,27 @@ package app.revanced.patches.shared.misc.debugging +import app.revanced.patcher.accessFlags +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.method +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.Patch +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.returnType import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.util.* +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/EnableDebuggingPatch;" @@ -21,21 +30,19 @@ private const val EXTENSION_CLASS_DESCRIPTOR = * Patch shared with YouTube and YT Music. */ internal fun enableDebuggingPatch( - sharedExtensionPatch: Patch, - settingsPatch: Patch, - vararg compatibleWithPackages: Pair>, - hookStringFeatureFlag: Boolean, + block: BytecodePatchBuilder.() -> Unit = {}, + executeBlock: BytecodePatchContext.() -> Unit = {}, + hookStringFeatureFlag: BytecodePatchBuilder.() -> Boolean, + hookLongFeatureFlag: BytecodePatchBuilder.() -> Boolean, + hookDoubleFeatureFlag: BytecodePatchBuilder.() -> Boolean, preferenceScreen: BasePreferenceScreen.Screen, + additionalDebugPreferences: List = emptyList() ) = bytecodePatch( name = "Enable debugging", description = "Adds options for debugging and exporting ReVanced logs to the clipboard.", ) { - compatibleWith(packages = compatibleWithPackages) dependsOn( - sharedExtensionPatch, - settingsPatch, - addResourcesPatch, resourcePatch { apply { copyResources( @@ -50,36 +57,44 @@ internal fun enableDebuggingPatch( "revanced_settings_arrow_left_double.xml", "revanced_settings_arrow_left_one.xml", "revanced_settings_arrow_right_double.xml", - "revanced_settings_arrow_right_one.xml", - ), + "revanced_settings_arrow_right_one.xml" + ) ) } - }, + } ) + block() + apply { + executeBlock() + addResources("shared", "misc.debugging.enableDebuggingPatch") - val preferences = setOf( + val preferences = mutableSetOf( SwitchPreference("revanced_debug"), - SwitchPreference("revanced_debug_protobuffer"), + ) + + preferences + additionalDebugPreferences + + preferences += listOf( SwitchPreference("revanced_debug_stacktrace"), SwitchPreference("revanced_debug_toast_on_error"), NonInteractivePreference( "revanced_debug_export_logs_to_clipboard", tag = "app.revanced.extension.shared.settings.preference.ExportLogToClipboardPreference", - selectable = true, + selectable = true ), NonInteractivePreference( "revanced_debug_logs_clear_buffer", tag = "app.revanced.extension.shared.settings.preference.ClearLogBufferPreference", - selectable = true, + selectable = true ), NonInteractivePreference( "revanced_debug_feature_flags_manager", tag = "app.revanced.extension.shared.settings.preference.FeatureFlagsManagerPreference", - selectable = true, - ), + selectable = true + ) ) preferenceScreen.addPreferences( @@ -87,67 +102,117 @@ internal fun enableDebuggingPatch( key = "revanced_debug_screen", sorting = Sorting.UNSORTED, preferences = preferences, - ), + ) ) - // Hook the methods that look up if a feature flag is active. - experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalBooleanFeatureFlagMethod().apply { - findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> - val register = getInstruction(index).registerA + val experimentalBooleanFeatureFlagMethodMatch = + experimentalFeatureFlagUtilMethod.immutableClassDef.experimentalBooleanFeatureFlagMethodMatch + + experimentalBooleanFeatureFlagMethodMatch.let { + it.method.apply { + // Not enough registers in the method. Clone the method and use the + // original method as an intermediate to call extension code. + + + // Copy the method. + val helperMethod = cloneMutable(name = "patch_getBooleanFeatureFlag") + + // Add the method. + it.classDef.methods.add(helperMethod) addInstructions( - index, + 0, + """ + # Invoke the copied method (helper method). + invoke-static { p0, p1, p2, p3 }, $helperMethod + move-result p0 + + # Redefine boolean in the extension. + invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->isBooleanFeatureFlagEnabled(ZJ)Z + move-result p0 + + # Since the copied method (helper method) has already been invoked, it just returns. + return p0 """ - invoke-static { v$register, p1 }, $EXTENSION_CLASS_DESCRIPTOR->isBooleanFeatureFlagEnabled(ZLjava/lang/Long;)Z - move-result v$register - """, ) } } - experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalDoubleFeatureFlagMethod().apply { - val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) + if (hookDoubleFeatureFlag()) + // 21.06+ doesn't have enough registers and needs to also clone. + experimentalFeatureFlagUtilMethod.immutableClassDef.getExperimentalDoubleFeatureFlagMethod() + .cloneMutableAndPreserveParameters().apply { + val helperMethod = cloneMutable(name = "patch_getDoubleFeatureFlag") - addInstructions( - insertIndex, - """ - move-result-wide v0 # Also clobbers v1 (p0) since result is wide. - invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isDoubleFeatureFlagEnabled(DJD)D - move-result-wide v0 - return-wide v0 - """, - ) - } + classDef.methods.add(helperMethod) - experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalLongFeatureFlagMethod().apply { - val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE) + addInstructions( + 0, + """ + # Invoke the copied method (helper method). + invoke-static/range { p0 .. p4 }, $helperMethod + move-result-wide v0 + + # Move parameter registers to lower register range to use invoke-static/range. + move-wide v2, p1 + move-wide v4, p3 - addInstructions( - insertIndex, - """ - move-result-wide v0 - invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J - move-result-wide v0 - return-wide v0 - """, - ) - } + invoke-static/range { v0 .. v5 }, ${EXTENSION_CLASS_DESCRIPTOR}->isDoubleFeatureFlagEnabled(DJD)D + move-result-wide v0 - if (hookStringFeatureFlag) { - experimentalFeatureFlagParentMethod.immutableClassDef.getExperimentalStringFeatureFlagMethod().apply { - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.MOVE_RESULT_OBJECT) - - addInstructions( - insertIndex, + # Since the copied method (helper method) has already been invoked, it just returns. + return-wide v0 """ - move-result-object v0 - invoke-static { v0, p1, p2, p3 }, $EXTENSION_CLASS_DESCRIPTOR->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String; - move-result-object v0 - return-object v0 - """, - ) - } - } + ) + } + + if (hookLongFeatureFlag()) + experimentalFeatureFlagUtilMethod.immutableClassDef.getExperimentalLongFeatureFlagMethod() + .cloneMutableAndPreserveParameters().apply { + val helperMethod = cloneMutable(name = "patch_getLongFeatureFlag") + + classDef.methods.add(helperMethod) + + addInstructions( + 0, + """ + # Invoke the copied method (helper method). + invoke-static/range { p0 .. p4 }, $helperMethod + move-result-wide v0 + + # Move parameter registers to lower register range to use invoke-static/range. + move-wide v2, p1 + move-wide v4, p3 + + invoke-static/range { v0 .. v5 }, ${EXTENSION_CLASS_DESCRIPTOR}->isLongFeatureFlagEnabled(JJJ)J + move-result-wide v0 + + # Since the copied method (helper method) has already been invoked, it just returns. + return-wide v0 + """ + ) + } + + if (hookStringFeatureFlag()) + experimentalFeatureFlagUtilMethod.immutableClassDef.getExperimentalStringFeatureFlagMethod() + .apply { + val helperMethod = cloneMutable(name = "patch_getStringFeatureFlag") + + classDef.methods.add(helperMethod) + + addInstructions( + 0, + """ + invoke-static { p0, p1, p2, p3 }, $helperMethod + move-result-object p0 + + invoke-static { p0, p1, p2, p3 }, ${EXTENSION_CLASS_DESCRIPTOR}->isStringFeatureFlagEnabled(Ljava/lang/String;JLjava/lang/String;)Ljava/lang/String; + move-result-object p0 + + return-object p0 + """ + ) + } // There exists other experimental accessor methods for byte[] // and wrappers for obfuscated classes, but currently none of those are hooked. diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt index 39611369a5..ec0b435316 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt @@ -1,46 +1,55 @@ package app.revanced.patches.shared.misc.debugging +import app.revanced.patcher.ClassDefComposing import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.accessFlags +import app.revanced.patcher.custom import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.ClassDef -internal val BytecodePatchContext.experimentalFeatureFlagParentMethod by gettingFirstImmutableMethodDeclaratively( +internal val BytecodePatchContext.experimentalFeatureFlagUtilMethod by gettingFirstImmutableMethodDeclaratively( "Unable to parse proto typed experiment flag: " ) { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("L") - parameterTypes("L", "J", "[B") + custom { + // 'public static' or 'public static final' + AccessFlags.STATIC.isSet(accessFlags) + && AccessFlags.PUBLIC.isSet(accessFlags) + // "L", "J", "[B" or "L", "J" + && parameters.let { (it.size == 2 || it.size == 3) && it[1].type == "J" } + } } -context(_: BytecodePatchContext) -internal fun ClassDef.getExperimentalBooleanFeatureFlagMethod() = firstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) +internal val ClassDef.experimentalBooleanFeatureFlagMethodMatch by ClassDefComposing.composingFirstMethod { returnType("Z") parameterTypes("L", "J", "Z") + custom { + // 'public static' or 'public static final' + AccessFlags.STATIC.isSet(accessFlags) && AccessFlags.PUBLIC.isSet(accessFlags) + } } context(_: BytecodePatchContext) internal fun ClassDef.getExperimentalDoubleFeatureFlagMethod() = firstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("D") - parameterTypes("J", "D") + parameterTypes("L", "J", "D") + custom { AccessFlags.STATIC.isSet(accessFlags) } } context(_: BytecodePatchContext) internal fun ClassDef.getExperimentalLongFeatureFlagMethod() = firstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("J") - parameterTypes("J", "J") + parameterTypes("L", "J", "J") + custom { AccessFlags.STATIC.isSet(accessFlags) } } context(_: BytecodePatchContext) internal fun ClassDef.getExperimentalStringFeatureFlagMethod() = firstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") - parameterTypes("J", "Ljava/lang/String;") + parameterTypes("L", "J", "Ljava/lang/String;") + custom { AccessFlags.STATIC.isSet(accessFlags) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index 8018c9bb66..d0990f4620 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef internal val BytecodePatchContext.googlePlayUtilityMethod by gettingFirstMethodDeclarativelyOrNull( "This should never happen.", diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 1ab994b61c..97d2931f40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -14,6 +14,9 @@ import app.revanced.patcher.patch.ResourcePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption +import app.revanced.patcher.firstClassDef +import app.revanced.patcher.firstImmutableClassDef +import app.revanced.patcher.patch.* import app.revanced.patches.all.misc.packagename.changePackageNamePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt index 98269bd356..ad259fcc23 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/hex/HexPatchBuilder.kt @@ -95,18 +95,15 @@ class Replacement( */ private fun indexOfPatternIn(haystack: ByteArray): Int { val needle = bytes - - val haystackLength = haystack.size - 1 - val needleLength = needle.size - 1 val right = IntArray(256) { -1 } - for (i in 0 until needleLength) right[needle[i].toInt().and(0xFF)] = i + for (i in 0 until needle.size) right[needle[i].toInt().and(0xFF)] = i var skip: Int - for (i in 0..haystackLength - needleLength) { + for (i in 0..haystack.size - needle.size) { skip = 0 - for (j in needleLength - 1 downTo 0) { + for (j in needle.size - 1 downTo 0) { if (needle[j] != haystack[i + j]) { skip = max(1, j - right[haystack[i + j].toInt().and(0xFF)]) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt index 1c3292bdea..9e128382e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/Fingerprints.kt @@ -4,7 +4,32 @@ import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +internal val BytecodePatchContext.accessibilityIdMethodMatch by composingFirstMethod { + instructions( + allOf( + Opcode.INVOKE_INTERFACE(), + method { parameterTypes.isEmpty() && returnType == "Ljava/lang/String;" } + ), + afterAtMost(5, "primary_image"()), + ) +} + +internal fun BytecodePatchContext.getAccessibilityTextMethodMatch(accessibilityIdMethod: MethodReference) = firstMethodComposite { + returnType("V") + custom { + // 'public final synthetic' or 'public final bridge synthetic'. + AccessFlags.SYNTHETIC.isSet(accessFlags) + } + instructions( + allOf( + Opcode.INVOKE_INTERFACE(), + method { parameterTypes.isEmpty() && returnType == "Ljava/lang/String;" } + ), + afterAtMost(5, method { this == accessibilityIdMethod }) + ) +} internal val BytecodePatchContext.lithoFilterInitMethod by gettingFirstMethodDeclaratively { definingClass("/LithoFilterPatch;") accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) @@ -40,10 +65,6 @@ internal val BytecodePatchContext.protobufBufferReferenceLegacyMethod by getting opcodes(Opcode.IPUT, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, Opcode.SUB_INT_2ADDR) } -internal val BytecodePatchContext.componentContextParserMethodMatch by composingFirstMethod { - instructions("Number of bits must be positive"()) -} - internal val BytecodePatchContext.emptyComponentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt index fcc830c95c..29548aa469 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/litho/filter/LithoFilterPatch.kt @@ -2,22 +2,36 @@ package app.revanced.patches.shared.misc.litho.filter +import app.revanced.util.getFreeRegisterProvider import app.revanced.com.android.tools.smali.dexlib2.iface.value.MutableEncodedValue.Companion.toMutable +import app.revanced.patcher.afterAtMost +import app.revanced.patcher.allOf import app.revanced.patcher.classDef +import app.revanced.patcher.custom import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.extensions.removeInstructions -import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.extensions.typeReference import app.revanced.patcher.firstImmutableClassDef +import app.revanced.patcher.firstMethodComposite import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.method import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.extension.sharedExtensionPatch import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.findFreeRegister import app.revanced.util.findFieldFromToString +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.immutable.value.ImmutableBooleanEncodedValue /** @@ -156,29 +170,67 @@ internal fun lithoFilterPatch( type == builderMethodDescriptor.returnType }.fields.single() - // Match all component creations methods + // Find the method call that gets the value of 'buttonViewModel.accessibilityId'. + val accessibilityIdMethod = accessibilityIdMethodMatch.let { + it.immutableMethod.getInstruction(it[0]).methodReference!! + } + + // There's a method in the same class that gets the value of 'buttonViewModel.accessibilityText'. + // As this class is abstract, another method that uses a method call is used. + val accessibilityTextMethod = getAccessibilityTextMethodMatch(accessibilityIdMethod).let { + // Find the method call that gets the value of 'buttonViewModel.accessibilityText'. + it.method.getInstruction(it[0]).methodReference + } + componentCreateMethod.apply { val insertIndex = componentCreateInsertionIndex() - val freeRegister = findFreeRegister(insertIndex) - val identifierRegister = findFreeRegister(insertIndex, freeRegister) - val pathRegister = findFreeRegister(insertIndex, freeRegister, identifierRegister) + + // Directly access the class related with the buttonViewModel from this method. + // This is within 10 lines of insertIndex. + val buttonViewModelIndex = indexOfFirstInstructionReversedOrThrow(insertIndex) { + opcode == Opcode.CHECK_CAST && + typeReference?.type == accessibilityIdMethod.definingClass + } + val buttonViewModelRegister = + getInstruction(buttonViewModelIndex).registerA + val accessibilityIdIndex = buttonViewModelIndex + 2 + + // This is an index that checks if there is accessibility-related text. + // This is within 10 lines of buttonViewModelIndex. + val nullCheckIndex = indexOfFirstInstructionReversedOrThrow( + buttonViewModelIndex, Opcode.IF_EQZ + ) + + val registerProvider = getFreeRegisterProvider( + insertIndex, 3, buttonViewModelRegister + ) + val freeRegister = registerProvider.getFreeRegister() + val identifierRegister = registerProvider.getFreeRegister() + val pathRegister = registerProvider.getFreeRegister() + + // Find a free register to store the accessibilityId and accessibilityText. + // This is before the insertion index. + val accessibilityRegisterProvider = getFreeRegisterProvider( + nullCheckIndex, + 2, + registerProvider.getUsedAndUnAvailableRegisters() + ) + val accessibilityIdRegister = accessibilityRegisterProvider.getFreeRegister() + val accessibilityTextRegister = accessibilityRegisterProvider.getFreeRegister() addInstructionsAtControlFlowLabel( insertIndex, """ move-object/from16 v$freeRegister, p2 # ConversionContext parameter - # In YT 20.41 the field is the abstract superclass. - # Check it's the actual ConversionContext just in case. + # In YouTube 20.41 the field is the abstract superclass. + # Verify it's the expected subclass just in case. instance-of v$identifierRegister, v$freeRegister, ${conversionContextToStringMethod.immutableClassDef.type} if-eqz v$identifierRegister, :unfiltered - # Get identifier and path from ConversionContext iget-object v$identifierRegister, v$freeRegister, $conversionContextIdentifierField iget-object v$pathRegister, v$freeRegister, $conversionContextPathBuilderField - - # Check if the component should be filtered. - invoke-static { v$identifierRegister, v$pathRegister }, $EXTENSION_CLASS_DESCRIPTOR->isFiltered(Ljava/lang/String;Ljava/lang/StringBuilder;)Z + invoke-static { v$identifierRegister, v$accessibilityIdRegister, v$accessibilityTextRegister, v$pathRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->isFiltered(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;)Z move-result v$freeRegister if-eqz v$freeRegister, :unfiltered @@ -191,7 +243,31 @@ internal fun lithoFilterPatch( :unfiltered nop - """, + """ + ) + + // If there is text related to accessibility, get the accessibilityId and accessibilityText. + addInstructions( + accessibilityIdIndex, + """ + # Get accessibilityId + invoke-interface { v$buttonViewModelRegister }, $accessibilityIdMethod + move-result-object v$accessibilityIdRegister + + # Get accessibilityText + invoke-interface { v$buttonViewModelRegister }, $accessibilityTextMethod + move-result-object v$accessibilityTextRegister + """ + ) + + // If there is no accessibility-related text, + // both accessibilityId and accessibilityText use empty values. + addInstructions( + nullCheckIndex, + """ + const-string v$accessibilityIdRegister, "" + const-string v$accessibilityTextRegister, "" + """ ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt index bd7a941b7f..7407326eef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt @@ -1,27 +1,25 @@ package app.revanced.patches.shared.misc.settings import app.revanced.patcher.accessFlags -import app.revanced.patcher.definingClass -import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively -import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.name import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType -import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.ClassDef -internal val BytecodePatchContext.themeLightColorResourceNameMethod by gettingFirstMethodDeclaratively { +context(_: BytecodePatchContext) +internal fun ClassDef.getThemeLightColorResourceNameMethod() = firstMethodDeclaratively { name("getThemeLightColorResourceName") - definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() } -internal val BytecodePatchContext.themeDarkColorResourceNameMethod by gettingFirstMethodDeclaratively { +context(_: BytecodePatchContext) +internal fun ClassDef.getThemeDarkColorResourceNameMethod() = firstMethodDeclaratively { name("getThemeDarkColorResourceName") - definingClass(EXTENSION_CLASS_DESCRIPTOR) accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt index efcb89c14b..52f14ae02e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt @@ -1,11 +1,13 @@ package app.revanced.patches.shared.misc.settings +import app.revanced.patcher.firstImmutableClassDef import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResource import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import app.revanced.patches.shared.layout.branding.addBrandLicensePatch import app.revanced.patches.shared.misc.settings.preference.BasePreference import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory @@ -22,8 +24,8 @@ private var darkThemeColor: String? = null /** * Sets the default theme colors used in various ReVanced specific settings menus. - * By default these colors are white and black, but instead can be set to the - * same color the target app uses for it's own settings. + * By default, these colors are white and black, but instead can be set to the + * same color the target app uses for its own settings. */ fun overrideThemeColors(lightThemeColorString: String?, darkThemeColorString: String) { lightThemeColor = lightThemeColorString @@ -32,11 +34,12 @@ fun overrideThemeColors(lightThemeColorString: String?, darkThemeColorString: St private val settingsColorPatch = bytecodePatch { afterDependents { + val extensionClassDef = firstImmutableClassDef(EXTENSION_CLASS_DESCRIPTOR) if (lightThemeColor != null) { - themeLightColorResourceNameMethod.returnEarly(lightThemeColor!!) + extensionClassDef.getThemeLightColorResourceNameMethod().returnEarly(lightThemeColor!!) } if (darkThemeColor != null) { - themeDarkColorResourceNameMethod.returnEarly(darkThemeColor!!) + extensionClassDef.getThemeDarkColorResourceNameMethod().returnEarly(darkThemeColor!!) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 23fec8ebc0..ba7faa001b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -28,7 +28,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/spoof/SpoofVideoStreamsPatch;" private lateinit var buildRequestMethod: MutableMethod -private var buildRequestMethodUrlRegister = -1 +private var buildRequestMethodURLRegister = -1 internal fun spoofVideoStreamsPatch( extensionClassDescriptor: String, @@ -102,14 +102,14 @@ internal fun spoofVideoStreamsPatch( buildRequestMethod = this val newRequestBuilderIndex = buildRequestMethodMatch[0] - buildRequestMethodUrlRegister = getInstruction(newRequestBuilderIndex).registerD - val freeRegister = findFreeRegister(newRequestBuilderIndex, buildRequestMethodUrlRegister) + buildRequestMethodURLRegister = getInstruction(newRequestBuilderIndex).registerD + val freeRegister = findFreeRegister(newRequestBuilderIndex, buildRequestMethodURLRegister) addInstructions( newRequestBuilderIndex, """ move-object v$freeRegister, p1 - invoke-static { v$buildRequestMethodUrlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V + invoke-static { v$buildRequestMethodURLRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V """, ) } @@ -164,7 +164,7 @@ internal fun spoofVideoStreamsPatch( move-result v0 if-eqz v0, :disabled - # Get video id. + # Get video ID. iget-object v2, p1, $videoDetailsClass->c:Ljava/lang/String; if-eqz v2, :disabled @@ -202,15 +202,15 @@ internal fun spoofVideoStreamsPatch( addInstructions( insertIndex, """ - invoke-static { v$buildRequestMethodUrlRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetAttRequest(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$buildRequestMethodUrlRegister + invoke-static { v$buildRequestMethodURLRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetAttRequest(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$buildRequestMethodURLRegister """, ) } // endregion - // region Remove /videoplayback request body to fix playback. + // region Remove video playback request body to fix playback. // It is assumed, YouTube makes a request with a body tuned for Android. // Requesting streams intended for other platforms with a body tuned for Android could be the cause of 400 errors. // A proper fix may include modifying the request body to match the platforms expected body. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt index d1fa2a873b..6258569ad7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt @@ -2,23 +2,72 @@ package app.revanced.patches.youtube.ad.general import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.fullScreenEngagementAdContainerMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.fullScreenEngagementAdContainerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() - custom { - containsLiteralInstruction(fullScreenEngagementAdContainer) && - indexOfAddListInstruction(this) >= 0 - } + instructions( + ResourceType.ID("fullscreen_engagement_ad_container"), + Opcode.IGET_BOOLEAN(), + allOf( + Opcode.INVOKE_VIRTUAL(), + method { + name == "add" && returnType == "Z" + && parameterTypes.size == 1 && parameterTypes[0] == "Ljava/lang/Object;" + } + ), + allOf( + Opcode.INVOKE_VIRTUAL(), + method { + name == "add" && returnType == "Z" + && parameterTypes.size == 1 && parameterTypes[0] == "Ljava/lang/Object;" + } + ), + allOf( + Opcode.INVOKE_VIRTUAL(), + method { name == "size" && returnType == "I" && parameterTypes.isEmpty() } + ), + ) } -internal fun indexOfAddListInstruction(method: Method) = method.indexOfFirstInstructionReversed { - getReference()?.name == "add" +internal val BytecodePatchContext.getPremiumViewMethodMatch by composingFirstMethod { + name("onMeasure") + definingClass("Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;") + accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) + returnType("V") + parameterTypes("I", "I") + opcodes( + Opcode.ADD_INT_2ADDR, + Opcode.ADD_INT_2ADDR, + Opcode.INVOKE_VIRTUAL, + Opcode.RETURN_VOID + ) } + +internal val BytecodePatchContext.lithoDialogBuilderMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("[B", "L") + instructions( + allOf(Opcode.INVOKE_VIRTUAL(), method("show")), + ResourceType.STYLE("SlidingDialogAnimation") + ) +} + + +internal val BytecodePatchContext.playerOverlayTimelyShelfMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Ljava/lang/Object;") + instructions( + "player_overlay_timely_shelf"(), + "innertube_cue_range"(), + "Null id"(), + "Null onExitActions"() + ) +} + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index fb9b6756bf..c9239da9ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -1,10 +1,12 @@ package app.revanced.patches.youtube.ad.general +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.fieldReference import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.extensions.wideLiteral -import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources @@ -13,23 +15,32 @@ import app.revanced.patches.shared.misc.fix.verticalscroll.verticalScrollPatch import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.misc.contexthook.Endpoint +import app.revanced.patches.youtube.misc.contexthook.addOSNameHook import app.revanced.patches.shared.misc.litho.filter.addLithoFilter -import app.revanced.patches.youtube.ad.getpremium.hideGetPremiumPatch +import app.revanced.patches.youtube.misc.contexthook.hookClientContextPatch +import app.revanced.patches.youtube.misc.engagement.addEngagementPanelIdHook +import app.revanced.patches.youtube.misc.engagement.engagementPanelHookPatch import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fixBackToExitGesturePatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch +import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.findFreeRegister import app.revanced.util.forEachInstructionAsSequence +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.injectHideViewCall import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/litho/AdsFilter;" internal var adAttributionId = -1L private set -internal var fullScreenEngagementAdContainer = -1L - private set - -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/litho/AdsFilter;" private val hideAdsResourcePatch = resourcePatch { dependsOn( @@ -37,28 +48,30 @@ private val hideAdsResourcePatch = resourcePatch { settingsPatch, resourceMappingPatch, addResourcesPatch, + hookClientContextPatch, + engagementPanelHookPatch, ) apply { addResources("youtube", "ad.general.hideAdsResourcePatch") PreferenceScreen.ADS.addPreferences( - SwitchPreference("revanced_hide_creator_store_shelf"), SwitchPreference("revanced_hide_end_screen_store_banner"), SwitchPreference("revanced_hide_fullscreen_ads"), SwitchPreference("revanced_hide_general_ads"), SwitchPreference("revanced_hide_merchandise_banners"), SwitchPreference("revanced_hide_paid_promotion_label"), + SwitchPreference("revanced_hide_player_popup_ads"), SwitchPreference("revanced_hide_self_sponsor_ads"), SwitchPreference("revanced_hide_shopping_links"), SwitchPreference("revanced_hide_view_products_banner"), - SwitchPreference("revanced_hide_web_search_results"), + SwitchPreference("revanced_hide_youtube_premium_promotions") ) addLithoFilter("Lapp/revanced/extension/youtube/patches/litho/AdsFilter;") + addEngagementPanelIdHook("$EXTENSION_CLASS_DESCRIPTOR->hidePlayerPopupAds(Ljava/lang/String;)Z") adAttributionId = ResourceType.ID["ad_attribution"] - fullScreenEngagementAdContainer = ResourceType.ID["fullscreen_engagement_ad_container"] } } @@ -68,35 +81,109 @@ val hideAdsPatch = bytecodePatch( description = "Adds options to remove general ads.", ) { dependsOn( - hideGetPremiumPatch, hideAdsResourcePatch, verticalScrollPatch, fixBackToExitGesturePatch, + versionCheckPatch ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { + // Hide fullscreen ad + + lithoDialogBuilderMethodMatch.let { + it.method.apply { + // Find the class name of the custom dialog + val dialogClass = getInstruction(it[0]).methodReference!!.definingClass + + // The dialog can be closed after dialog.show(), + // and it is better to close the dialog after the layout of the dialog has changed + val insertIndex = indexOfFirstInstructionReversedOrThrow { + opcode == Opcode.IPUT_OBJECT && fieldReference?.type == dialogClass + } + val insertRegister = + getInstruction(insertIndex).registerA + val freeRegister = findFreeRegister(insertIndex, insertRegister) + + addInstructionsAtControlFlowLabel( + insertIndex, + """ + move-object/from16 v$freeRegister, p1 + invoke-static { v$insertRegister, v$freeRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->closeFullscreenAd(Ljava/lang/Object;[B)V + """ + ) + } + } + + // Hide get premium + + getPremiumViewMethodMatch.method.apply { + val startIndex = getPremiumViewMethodMatch[0] + val measuredWidthRegister = getInstruction(startIndex).registerA + val measuredHeightInstruction = getInstruction(startIndex + 1) + + val measuredHeightRegister = measuredHeightInstruction.registerA + val tempRegister = measuredHeightInstruction.registerB + + addInstructionsWithLabels( + startIndex + 2, + """ + # Override the internal measurement of the layout with zero values. + invoke-static {}, ${EXTENSION_CLASS_DESCRIPTOR}->hideGetPremiumView()Z + move-result v$tempRegister + if-eqz v$tempRegister, :allow + const/4 v$measuredWidthRegister, 0x0 + const/4 v$measuredHeightRegister, 0x0 + :allow + nop + # Layout width/height is then passed to a protected class method. + """, + ) + } + + // Hide player overlay view. This can be hidden with a regular litho filter + // but an empty space remains. + if (is_20_14_or_greater) { + playerOverlayTimelyShelfMethod.addInstructionsWithLabels( + 0, + """ + invoke-static {}, ${EXTENSION_CLASS_DESCRIPTOR}->hideAds()Z + move-result v0 + if-eqz v0, :show + return-void + :show + nop + """ + ) + } + + // Hide end screen store banner. - fullScreenEngagementAdContainerMethod.apply { - val addListIndex = indexOfAddListInstruction(this) - val addListInstruction = getInstruction(addListIndex) - val listRegister = addListInstruction.registerC - val objectRegister = addListInstruction.registerD + fullScreenEngagementAdContainerMethodMatch.let { + it.method.apply { + val insertIndex = it[3] + val insertInstruction = getInstruction(insertIndex) + val listRegister = insertInstruction.registerC + val objectRegister = insertInstruction.registerD - replaceInstruction( - addListIndex, - "invoke-static { v$listRegister, v$objectRegister }, $EXTENSION_CLASS_DESCRIPTOR" + - "->hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V", - ) + replaceInstruction( + insertIndex, + "invoke-static { v$listRegister, v$objectRegister }, " + + "${EXTENSION_CLASS_DESCRIPTOR}->" + + "hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V" + ) + } } // Hide ad views. @@ -114,7 +201,22 @@ val hideAdsPatch = bytecodePatch( return@forEachInstructionAsSequence insertIndex to viewRegister }) { method, (insertIndex, viewRegister) -> - method.injectHideViewCall(insertIndex, viewRegister, EXTENSION_CLASS_DESCRIPTOR, "hideAdAttributionView") + method.injectHideViewCall( + insertIndex, + viewRegister, + EXTENSION_CLASS_DESCRIPTOR, + "hideAdAttributionView" + ) + } + + setOf( + Endpoint.BROWSE, + Endpoint.SEARCH, + ).forEach { endpoint -> + addOSNameHook( + endpoint, + "$EXTENSION_CLASS_DESCRIPTOR->hideAds(Ljava/lang/String;)Ljava/lang/String;", + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt deleted file mode 100644 index b8ce3bbb24..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.youtube.ad.getpremium - -import app.revanced.patcher.* -import app.revanced.patcher.patch.BytecodePatchContext -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal val BytecodePatchContext.getPremiumViewMethodMatch by composingFirstMethod { - name("onMeasure") - definingClass("Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;") - accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) - returnType("V") - parameterTypes("I", "I") - opcodes( - Opcode.ADD_INT_2ADDR, - Opcode.ADD_INT_2ADDR, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt deleted file mode 100644 index 3b19542202..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ /dev/null @@ -1,66 +0,0 @@ -package app.revanced.patches.youtube.ad.getpremium - -import app.revanced.patcher.extensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.misc.settings.settingsPatch -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/HideGetPremiumPatch;" - -val hideGetPremiumPatch = bytecodePatch( - description = "Hides YouTube Premium signup promotions under the video player.", -) { - dependsOn( - sharedExtensionPatch, - settingsPatch, - addResourcesPatch, - ) - - compatibleWith( - "com.google.android.youtube"( - "19.43.41", - "20.14.43", - "20.21.37", - "20.31.40", - ), - ) - - apply { - addResources("youtube", "ad.getpremium.hideGetPremiumPatch") - - PreferenceScreen.ADS.addPreferences( - SwitchPreference("revanced_hide_get_premium"), - ) - - getPremiumViewMethodMatch.let { - val startIndex = it[0] - val measuredWidthRegister = it.method.getInstruction(startIndex).registerA - val measuredHeightInstruction = it.method.getInstruction(startIndex + 1) - - val measuredHeightRegister = measuredHeightInstruction.registerA - val tempRegister = measuredHeightInstruction.registerB - - it.method.addInstructionsWithLabels( - startIndex + 2, - """ - # Override the internal measurement of the layout with zero values. - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideGetPremiumView()Z - move-result v$tempRegister - if-eqz v$tempRegister, :allow - const/4 v$measuredWidthRegister, 0x0 - const/4 v$measuredHeightRegister, 0x0 - :allow - nop - # Layout width/height is then passed to a protected class method. - """, - ) - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 5ad8b5da75..f6d244f353 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -24,10 +24,12 @@ val videoAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoURLPatch.kt similarity index 86% rename from patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoURLPatch.kt index 18656fa5c4..a93b0a4788 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoURLPatch.kt @@ -12,7 +12,7 @@ import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources -private val copyVideoUrlResourcePatch = resourcePatch { +private val copyVideoURLResourcePatch = resourcePatch { dependsOn( settingsPatch, playerControlsPatch, @@ -20,7 +20,7 @@ private val copyVideoUrlResourcePatch = resourcePatch { ) apply { - addResources("youtube", "interaction.copyvideourl.copyVideoUrlResourcePatch") + addResources("youtube", "interaction.copyvideourl.copyVideoURLResourcePatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_copy_video_url"), @@ -46,25 +46,27 @@ val copyVideoURLPatch = bytecodePatch( description = "Adds options to display buttons in the video player to copy video URLs.", ) { dependsOn( - copyVideoUrlResourcePatch, + copyVideoURLResourcePatch, playerControlsPatch, videoInformationPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { val extensionPlayerPackage = "Lapp/revanced/extension/youtube/videoplayer" val buttonsDescriptors = listOf( - "$extensionPlayerPackage/CopyVideoUrlButton;", - "$extensionPlayerPackage/CopyVideoUrlTimestampButton;", + "$extensionPlayerPackage/CopyVideoURLButton;", + "$extensionPlayerPackage/CopyVideoURLTimestampButton;", ) buttonsDescriptors.forEach { descriptor -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt index fa5c83ebe5..9de6b23d66 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt @@ -2,6 +2,8 @@ package app.revanced.patches.youtube.interaction.dialog import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode internal val BytecodePatchContext.createDialogMethodMatch by composingFirstMethod { returnType("V") @@ -13,3 +15,28 @@ internal val BytecodePatchContext.createDialogMethodMatch by composingFirstMetho method { toString() == "Landroid/app/AlertDialog;->show()V" }, ) } + + +internal val BytecodePatchContext.createModernDialogMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes() + instructions( + Opcode.MOVE_RESULT(), + method { toString() == $$"Landroid/app/AlertDialog$Builder;->setIcon(I)Landroid/app/AlertDialog$Builder;" }, + method { toString() == $$"Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;" } + ) +} + +internal val BytecodePatchContext.playabilityStatusEnumMethod by gettingFirstImmutableMethod( + "OK", + "ERROR", + "UNPLAYABLE", + "LOGIN_REQUIRED", + "CONTENT_CHECK_REQUIRED", + "AGE_CHECK_REQUIRED", + "LIVE_STREAM_OFFLINE", + "FULLSCREEN_ONLY", + "GL_PLAYBACK_REQUIRED", + "AGE_VERIFICATION_REQUIRED", +) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index c0d7e173e3..b57010b903 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -1,15 +1,28 @@ package app.revanced.patches.youtube.interaction.dialog +import app.revanced.patcher.accessFlags +import app.revanced.patcher.custom +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions import app.revanced.patcher.extensions.replaceInstructions +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.returnType import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.backgroundPlaybackManagerShortsMethod +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch;" @@ -18,7 +31,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val removeViewerDiscretionDialogPatch = bytecodePatch( name = "Remove viewer discretion dialog", description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + - "by accepting it automatically. This does not bypass the age restriction.", + "by accepting it automatically. This does not bypass the age restriction.", ) { dependsOn( sharedExtensionPatch, @@ -28,10 +41,12 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -45,13 +60,56 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( createDialogMethodMatch.let { it.method.apply { val showDialogIndex = it[-1] - val dialogRegister = getInstruction(showDialogIndex).registerC + val dialogRegister = + getInstruction(showDialogIndex).registerC replaceInstructions( showDialogIndex, - "invoke-static { v$dialogRegister }, $EXTENSION_CLASS_DESCRIPTOR->confirmDialog(Landroid/app/AlertDialog;)V", + "invoke-static { v$dialogRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->" + + "confirmDialog(Landroid/app/AlertDialog;)V", ) } } + + createModernDialogMethodMatch.let { + it.method.apply { + val showDialogIndex = it[-1] + val dialogRegister = + getInstruction(showDialogIndex).registerC + + replaceInstructions( + showDialogIndex, + "invoke-static { v$dialogRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->" + + "confirmDialog(Landroid/app/AlertDialog\$Builder;)Landroid/app/AlertDialog;", + ) + + val dialogStyleIndex = it[0] + val dialogStyleRegister = + getInstruction(dialogStyleIndex).registerA + + addInstructions( + dialogStyleIndex + 1, + """ + invoke-static { v$dialogStyleRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->disableModernDialog(Z)Z + move-result v$dialogStyleRegister + """ + ) + } + } + + backgroundPlaybackManagerShortsMethod.immutableClassDef.firstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returnType("Z") + parameterTypes(playabilityStatusEnumMethod.immutableClassDef.type) + custom { + // There's another similar method that's difficult to match uniquely, + // Instruction counter is used to identify the target method. + instructions.count() < 10 + } + }.addInstruction( + 0, + "invoke-static { p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->" + + "setPlayabilityStatus(Ljava/lang/Enum;)V" + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/AddMoreDoubleTapToSeekLengthOptionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/AddMoreDoubleTapToSeekLengthOptionsPatch.kt new file mode 100644 index 0000000000..b84afcb4d9 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/AddMoreDoubleTapToSeekLengthOptionsPatch.kt @@ -0,0 +1,66 @@ +package app.revanced.patches.youtube.interaction.doubletap + +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.removeFromParent +import org.w3c.dom.Element + +@Suppress("unused") +val addMoreDoubleTapToSeekLengthOptionsPatch = resourcePatch( + name = "Add more double tap to seek length options", +) { + dependsOn( + sharedExtensionPatch + ) + + compatibleWith( + "com.google.android.youtube"( + "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + ) + ) + + execute { + // Values are hard coded to keep patching simple. + val doubleTapLengthOptionsString = "3, 5, 10, 15, 20, 30, 60, 120, 180, 240" + + val doubleTapLengths = doubleTapLengthOptionsString + .replace(" ", "") + .split(",") + if (doubleTapLengths.isEmpty()) throw PatchException("Invalid double-tap length elements") + + document("res/values/arrays.xml").use { document -> + fun Element.removeAllChildren() { + val children = childNodes // Calling childNodes creates a new list. + for (i in children.length - 1 downTo 0) { + children.item(i).removeFromParent() + } + } + + val values = document.childNodes.findElementByAttributeValueOrThrow( + attributeName = "name", + value = "double_tap_length_values" + ) + values.removeAllChildren() + + val entries = document.childNodes.findElementByAttributeValueOrThrow( + attributeName = "name", + value = "double_tap_length_entries" + ) + entries.removeAllChildren() + + doubleTapLengths.forEach { length -> + val item = document.createElement("item") + item.textContent = length + entries.appendChild(item) + values.appendChild(item.cloneNode(true)) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt index adfbd1cdf9..fce736f556 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt @@ -34,7 +34,10 @@ val disableDoubleTapActionsPatch = bytecodePatch( "com.google.android.youtube"( "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -77,12 +80,13 @@ val disableDoubleTapActionsPatch = bytecodePatch( """, ) - doubleTapInfoGetSeekSourceMethod.immutableClassDef.getDoubleTapInfoCtorMethod().addInstructions( - 0, - """ + doubleTapInfoGetSeekSourceMethod.immutableClassDef.getDoubleTapInfoCtorMethod() + .addInstructions( + 0, + """ invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->disableDoubleTapChapters(Z)Z move-result p3 """, - ) + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index c1d1cdcbc4..337dea4666 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -55,15 +55,17 @@ private val downloadsResourcePatch = resourcePatch { } } -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DownloadsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/DownloadsPatch;" -internal const val BUTTON_DESCRIPTOR = "Lapp/revanced/extension/youtube/videoplayer/ExternalDownloadButton;" +internal const val BUTTON_DESCRIPTOR = + "Lapp/revanced/extension/youtube/videoplayer/ExternalDownloadButton;" @Suppress("unused") val downloadsPatch = bytecodePatch( name = "Downloads", description = "Adds support to download videos with an external downloader app " + - "using the in-app download button or a video player action button.", + "using the in-app download button or a video player action button.", ) { dependsOn( downloadsResourcePatch, @@ -73,10 +75,12 @@ val downloadsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt index 1eac7848a8..ee7276d2a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt @@ -10,7 +10,7 @@ internal val BytecodePatchContext.offlineVideoEndpointMethod by gettingFirstMeth parameterTypes( "Ljava/util/Map;", "L", - "Ljava/lang/String", // VideoId + "Ljava/lang/String", // Video ID "L", ) instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/DisableHapticFeedbackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/DisableHapticFeedbackPatch.kt new file mode 100644 index 0000000000..9084e593d9 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/DisableHapticFeedbackPatch.kt @@ -0,0 +1,139 @@ +package app.revanced.patches.youtube.interaction.hapticfeedback + +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.all.misc.transformation.IMethodCall +import app.revanced.patches.all.misc.transformation.filterMapInstruction35c +import app.revanced.patches.all.misc.transformation.transformInstructionsPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.misc.settings.settingsPatch +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR_PREFIX = + "Lapp/revanced/extension/youtube/patches/DisableHapticFeedbackPatch" + +private const val EXTENSION_CLASS_DESCRIPTOR = "$EXTENSION_CLASS_DESCRIPTOR_PREFIX;" + +@Suppress("unused") +val disableHapticFeedbackPatch = bytecodePatch( + name = "Disable haptic feedback", + description = "Adds an option to disable haptic feedback in the player for various actions.", +) { + dependsOn( + settingsPatch, + addResourcesPatch, + transformInstructionsPatch( + filterMap = { classDef, _, instruction, instructionIndex -> + filterMapInstruction35c( + EXTENSION_CLASS_DESCRIPTOR_PREFIX, + classDef, + instruction, + instructionIndex, + ) + }, + transform = { method, entry -> + val (methodType, instruction, instructionIndex) = entry + methodType.replaceInvokeVirtualWithExtension( + EXTENSION_CLASS_DESCRIPTOR, + method, + instruction, + instructionIndex, + ) + }, + ), + ) + + compatibleWith( + "com.google.android.youtube"( + "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + ), + ) + + apply { + addResources("youtube", "misc.hapticfeedback.disableHapticFeedbackPatch") + + PreferenceScreen.PLAYER.addPreferences( + PreferenceScreenPreference( + "revanced_disable_haptic_feedback", + preferences = setOf( + SwitchPreference("revanced_disable_haptic_feedback_chapters"), + SwitchPreference("revanced_disable_haptic_feedback_precise_seeking"), + SwitchPreference("revanced_disable_haptic_feedback_seek_undo"), + SwitchPreference("revanced_disable_haptic_feedback_tap_and_hold"), + SwitchPreference("revanced_disable_haptic_feedback_zoom"), + ), + ), + ) + + arrayOf( + markerHapticsMethod to "disableChapterVibrate", + scrubbingHapticsMethod to "disablePreciseSeekingVibrate", + seekUndoHapticsMethod to "disableSeekUndoVibrate", + zoomHapticsMethod to "disableZoomVibrate", + ).forEach { (method, methodName) -> + method.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z + move-result v0 + if-eqz v0, :vibrate + return-void + """, + ExternalLabel("vibrate", method.getInstruction(0)), + ) + } + + val vibratorField = tapAndHoldHapticsHandlerMethodMatch.let { + it.immutableMethod.getInstruction(it[-1]).fieldReference!! + } + // Function, because it can be the same method as getTapAndHoldSpeedMethodMatch. + getTapAndHoldHapticsMethodMatch(vibratorField).let { + it.method.apply { + val index = it[0] + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->disableTapAndHoldVibrate(Ljava/lang/Object;)Ljava/lang/Object; + move-result-object v$register + """ + ) + } + } + } +} + +@Suppress("unused") +private enum class MethodCall( + override val definedClassName: String, + override val methodName: String, + override val methodParams: Array, + override val returnType: String, +) : IMethodCall { + VibrationEffect( + "Landroid/os/Vibrator;", + "vibrate", + arrayOf("Landroid/os/VibrationEffect;"), + "V", + ), + VibrationMilliseconds( + "Landroid/os/Vibrator;", + "vibrate", + arrayOf("J"), + "V", + ), +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/Fingerprints.kt new file mode 100644 index 0000000000..c1f082b8ad --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/hapticfeedback/Fingerprints.kt @@ -0,0 +1,56 @@ +package app.revanced.patches.youtube.interaction.hapticfeedback + +import app.revanced.patcher.* +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to execute markers haptics vibrate.", +) { + returnType("V") +} + +internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to haptics vibrate for fine scrubbing.", +) { + returnType("V") +} + +internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to execute seek undo haptics vibrate.", +) { + returnType("V") +} + +internal val BytecodePatchContext.tapAndHoldHapticsHandlerMethodMatch by composingFirstMethod { + name("") + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") + parameterTypes("Landroid/content/Context;", "Landroid/os/Handler;") + instructions( + "vibrator"(), + allOf(Opcode.CHECK_CAST(), type("Landroid/os/Vibrator;")), + after(allOf(Opcode.IPUT_OBJECT(), field { type == "Ljava/lang/Object;" })) + ) +} + +internal fun BytecodePatchContext.getTapAndHoldHapticsMethodMatch(vibratorFieldReference: FieldReference) = + firstMethodComposite { + name("run") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes() + instructions( + allOf(Opcode.IGET_OBJECT(), field { this == vibratorFieldReference }), + allOf(Opcode.CHECK_CAST(), type("Landroid/os/Vibrator;")), + "Failed to easy seek haptics vibrate."() + ) + } + +internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMethodDeclaratively( + "Failed to haptics vibrate for video zoom", +) { + returnType("V") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index ceefafbb94..208151e344 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -41,7 +41,7 @@ val enableSlideToSeekPatch = bytecodePatch( var modifiedMethods = false - // Restore the behaviour to slide to seek. + // Restore the behavior to slide to seek. val checkIndex = slideToSeekMethodMatch[0] val checkReference = slideToSeekMethodMatch.method.getInstruction(checkIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableTapToSeekPatch.kt similarity index 85% rename from patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableTapToSeekPatch.kt index c3e867c496..610d923c26 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableTapToSeekPatch.kt @@ -15,9 +15,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/SeekbarTappingPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/TapToSeekPatch;" -val enableSeekbarTappingPatch = bytecodePatch( +val enableTapToSeekPatch = bytecodePatch( description = "Adds an option to enable tap to seek on the seekbar of the video player.", ) { dependsOn( @@ -27,14 +27,14 @@ val enableSeekbarTappingPatch = bytecodePatch( ) apply { - addResources("youtube", "interaction.seekbar.enableSeekbarTappingPatch") + addResources("youtube", "interaction.seekbar.enableTapToSeekPatch") PreferenceScreen.SEEKBAR.addPreferences( - SwitchPreference("revanced_seekbar_tapping"), + SwitchPreference("revanced_tap_to_seek"), ) // Find the required methods to tap the seekbar. - val seekbarTappingMethods = onTouchEventHandlerMethodMatch.let { + val tapToSeekMethods = onTouchEventHandlerMethodMatch.let { fun getReference(index: Int) = it.method.getInstruction(index) .reference as MethodReference @@ -44,7 +44,7 @@ val enableSeekbarTappingPatch = bytecodePatch( ) } - seekbarTappingMethodMatch.let { + tapToSeekMethodMatch.let { val insertIndex = it[-1] + 1 it.method.apply { @@ -62,13 +62,13 @@ val enableSeekbarTappingPatch = bytecodePatch( xAxisRegister, ) - val oMethod = seekbarTappingMethods[0] - val nMethod = seekbarTappingMethods[1] + val oMethod = tapToSeekMethods[0] + val nMethod = tapToSeekMethods[1] addInstructionsWithLabels( insertIndex, """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->seekbarTappingEnabled()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->tapToSeekEnabled()Z move-result v$freeRegister if-eqz v$freeRegister, :disabled invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $oMethod diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index 38683f9acc..52e7dfb036 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -2,10 +2,7 @@ package app.revanced.patches.youtube.interaction.seekbar import app.revanced.patcher.* import app.revanced.patcher.extensions.instructions -import app.revanced.patcher.extensions.stringReference import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patches.youtube.misc.playservice.* -import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -61,25 +58,6 @@ internal val BytecodePatchContext.disableFastForwardGestureMethodMatch by compos custom { instructions.count() > 30 } } -internal val BytecodePatchContext.customTapAndHoldMethodMatch by composingFirstMethod { - name("run") - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("V") - parameterTypes() - instructions(2.0f.toRawBits().toLong()()) - custom { - // Code is found in different methods with different strings. - val findSearchLandingKey = (is_19_34_or_greater && !is_19_47_or_greater) || - (is_20_19_or_greater && !is_20_20_or_greater) || is_20_31_or_greater - - indexOfFirstInstruction { - val string = stringReference?.string - string == "Failed to easy seek haptics vibrate." || - (findSearchLandingKey && string == "search_landing_cache_key") - } >= 0 - } -} - internal val BytecodePatchContext.onTouchEventHandlerMethodMatch by composingFirstMethod { name("onTouchEvent") accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) @@ -103,7 +81,7 @@ internal val BytecodePatchContext.onTouchEventHandlerMethodMatch by composingFir ) } -internal val BytecodePatchContext.seekbarTappingMethodMatch by composingFirstMethod { +internal val BytecodePatchContext.tapToSeekMethodMatch by composingFirstMethod { name("onTouchEvent") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") @@ -132,15 +110,6 @@ internal val BytecodePatchContext.slideToSeekMethodMatch by composingFirstMethod literal { 67108864 } } -internal val BytecodePatchContext.fullscreenSeekbarThumbnailsQualityMethod by gettingFirstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("Z") - parameterTypes() - instructions( - 45399684L(), // Video stream seekbar thumbnails feature flag. - ) -} - internal val BytecodePatchContext.fullscreenLargeSeekbarFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt index 6033875241..934442eeaf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt @@ -6,24 +6,24 @@ import app.revanced.patcher.patch.bytecodePatch val seekbarPatch = bytecodePatch( name = "Seekbar", description = "Adds options to disable precise seeking when swiping up on the seekbar, " + - "slide to seek instead of playing at 2x speed when pressing and holding, " + - "tapping the player seekbar to seek, " + - "and hiding the video player seekbar.", + "slide to seek instead of playing at 2x speed when pressing and holding, " + + "tapping the player seekbar to seek, and hiding the video player seekbar.", ) { dependsOn( disablePreciseSeekingGesturePatch, enableSlideToSeekPatch, - enableSeekbarTappingPatch, + enableTapToSeekPatch, hideSeekbarPatch, - seekbarThumbnailsPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt deleted file mode 100644 index 2ffae0d6b9..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt +++ /dev/null @@ -1,71 +0,0 @@ -package app.revanced.patches.youtube.interaction.seekbar - -import app.revanced.patcher.extensions.addInstruction -import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.instructions -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsMethod -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.PreferenceScreen - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/SeekbarThumbnailsPatch;" - -val seekbarThumbnailsPatch = bytecodePatch( - description = "Adds an option to use high quality fullscreen seekbar thumbnails.", -) { - dependsOn( - sharedExtensionPatch, - addResourcesPatch, - versionCheckPatch, - ) - - apply { - if (is_20_09_or_greater) { - // High quality seekbar thumbnails is partially broken in 20.09 - // and the code is completely removed in 20.10+ - return@apply - } - - addResources("youtube", "layout.seekbar.seekbarThumbnailsPatch") - - if (is_19_17_or_greater) { - PreferenceScreen.SEEKBAR.addPreferences( - SwitchPreference("revanced_seekbar_thumbnails_high_quality"), - ) - } else { - PreferenceScreen.SEEKBAR.addPreferences( - SwitchPreference("revanced_restore_old_seekbar_thumbnails"), - SwitchPreference( - key = "revanced_seekbar_thumbnails_high_quality", - summaryOnKey = "revanced_seekbar_thumbnails_high_quality_legacy_summary_on", - summaryOffKey = "revanced_seekbar_thumbnails_high_quality_legacy_summary_on", - ), - ) - - fullscreenSeekbarThumbnailsMethod.apply { - val moveResultIndex = instructions.lastIndex - 1 - - addInstruction( - moveResultIndex, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->useFullscreenSeekbarThumbnails()Z", - ) - } - } - - fullscreenSeekbarThumbnailsQualityMethod.addInstructions( - 0, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->useHighQualityFullscreenThumbnails()Z - move-result v0 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index 6c49c61618..13c90762b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -53,7 +53,10 @@ private val swipeControlsResourcePatch = resourcePatch { SwitchPreference("revanced_swipe_save_and_restore_brightness"), SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"), ListPreference("revanced_swipe_overlay_style"), - TextPreference("revanced_swipe_overlay_background_opacity", inputType = InputType.NUMBER), + TextPreference( + "revanced_swipe_overlay_background_opacity", + inputType = InputType.NUMBER + ), TextPreference( "revanced_swipe_overlay_progress_brightness_color", tag = "app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference", @@ -101,10 +104,12 @@ val swipeControlsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index bc67ed397c..b5f90ac566 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -8,6 +8,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.subtitleButtonControllerMethod private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableAutoCaptionsPatch;" @@ -25,10 +26,12 @@ val disableAutoCaptionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -54,7 +57,7 @@ val disableAutoCaptionsPatch = bytecodePatch( arrayOf( startVideoInformerMethod to 0, - storyboardRendererDecoderRecommendedLevelMethod to 1, + subtitleButtonControllerMethod to 1, ).forEach { (method, enabled) -> method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt index a85542b891..04241cfc07 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt @@ -14,23 +14,8 @@ internal val BytecodePatchContext.startVideoInformerMethod by gettingFirstMethod ) } -internal val BytecodePatchContext.storyboardRendererDecoderRecommendedLevelMethod by gettingFirstMethodDeclaratively("#-1#") { - returnType("V") - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameterTypes("L") -} - internal val BytecodePatchContext.subtitleTrackMethod by gettingFirstMethodDeclaratively("DISABLE_CAPTIONS_OPTION") { - definingClass("/SubtitleTrack;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() - opcodes( - Opcode.CONST_STRING, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.RETURN, - ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 3859ce093d..befd7171e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -26,10 +26,12 @@ val customBrandingPatch = baseCustomBrandingPatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index 261b0a0d80..38b40e4d33 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -53,7 +53,8 @@ private val customHeaderResourceFileNames = variants.map { variant -> "${CUSTOM_HEADER_RESOURCE_NAME}_$variant.png" }.toTypedArray() -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeHeaderPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/ChangeHeaderPatch;" private val changeHeaderBytecodePatch = bytecodePatch { dependsOn( @@ -106,10 +107,12 @@ val changeHeaderPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideVideoActionsButtonsPatch.kt similarity index 76% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideVideoActionsButtonsPatch.kt index c614b2ebb9..a869906f37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideVideoActionsButtonsPatch.kt @@ -16,7 +16,8 @@ import java.util.logging.Logger @Suppress("unused") val hideVideoActionButtonsPatch = resourcePatch( name = "Hide video action buttons", - description = "Adds options to hide action buttons (such as the Download button) under videos.", + description = "Adds options to hide action buttons (such as the Download button) under videos. " + + "Patching version 20.21.37 or lower can hide more player button types." ) { dependsOn( resourceMappingPatch, @@ -27,10 +28,12 @@ val hideVideoActionButtonsPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - // 20.22+ does not yet support hiding all player buttons. + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -43,27 +46,20 @@ val hideVideoActionButtonsPatch = resourcePatch( SwitchPreference("revanced_hide_like_dislike_button"), SwitchPreference("revanced_hide_comments_button"), SwitchPreference("revanced_hide_save_button"), - ) + SwitchPreference("revanced_hide_remix_button"), + SwitchPreference("revanced_hide_share_button"), - if (is_20_22_or_greater) { - // FIXME: 20.22+ filtering of the action buttons doesn't work because - // the buffer is the same for all buttons. - Logger.getLogger(this::class.java.name).warning( - "\n!!!" + - "\n!!! Not all player action buttons can be set hidden when patching 20.22+" + - "\n!!! Patch 20.21.37 or lower if you want to hide player action buttons" + - "\n!!!", ) - } else { + + // 20.22+ cannot hide all action buttons because of buffer changes. + if (!is_20_22_or_greater) { preferences.addAll( listOf( SwitchPreference("revanced_hide_hype_button"), SwitchPreference("revanced_hide_ask_button"), SwitchPreference("revanced_hide_clip_button"), SwitchPreference("revanced_hide_promote_button"), - SwitchPreference("revanced_hide_remix_button"), SwitchPreference("revanced_hide_report_button"), - SwitchPreference("revanced_hide_share_button"), SwitchPreference("revanced_hide_shop_button"), SwitchPreference("revanced_hide_stop_ads_button"), SwitchPreference("revanced_hide_thanks_button"), @@ -78,6 +74,6 @@ val hideVideoActionButtonsPatch = resourcePatch( ), ) - addLithoFilter("Lapp/revanced/extension/youtube/patches/litho/ButtonsFilter;") + addLithoFilter("Lapp/revanced/extension/youtube/patches/litho/VideoActionButtonsFilter;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index 35d51ba015..4e8c86e823 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -2,17 +2,10 @@ package app.revanced.patches.youtube.layout.buttons.navigation import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.addCreateButtonViewMethodMatch by composingFirstMethod { - instructions( - "Android Wear"(), - Opcode.IF_EQZ(), - after("Android Automotive"()), - ) -} - internal val BytecodePatchContext.createPivotBarMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( @@ -34,6 +27,28 @@ internal val BytecodePatchContext.animatedNavigationTabsFeatureFlagMethodMatch b ) } + +internal val BytecodePatchContext.pivotBarStyleMethodMatch by composingFirstMethod { + definingClass("/PivotBar;") + returnType("V") + parameterTypes("L") + opcodes( + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT, + Opcode.XOR_INT_2ADDR + ) +} + +internal val BytecodePatchContext.pivotBarChangedMethodMatch by composingFirstMethod { + name("onConfigurationChanged") + definingClass("/PivotBar;") + returnType("V") + opcodes( + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT + ) +} + internal val BytecodePatchContext.translucentNavigationStatusBarFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") @@ -63,3 +78,20 @@ internal val BytecodePatchContext.translucentNavigationButtonsSystemFeatureFlagM 45632194L(), // Translucent system buttons feature flag. ) } + +internal val BytecodePatchContext.setWordmarkHeaderMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Landroid/widget/ImageView;") + instructions( + ResourceType.ATTR("ytPremiumWordmarkHeader"), + ResourceType.ATTR("ytWordmarkHeader") + ) +} + +internal val BytecodePatchContext.wideSearchbarLayoutMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + parameterTypes("L", "L") + instructions(ResourceType.LAYOUT("action_bar_ringo")) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt new file mode 100644 index 0000000000..8abeeab8d3 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt @@ -0,0 +1,253 @@ +package app.revanced.patches.youtube.layout.buttons.navigation + +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.layout.toolbar.hookToolbar +import app.revanced.patches.youtube.layout.toolbar.toolbarHookPatch +import app.revanced.patches.youtube.misc.contexthook.Endpoint +import app.revanced.patches.youtube.misc.contexthook.addOSNameHook +import app.revanced.patches.youtube.misc.contexthook.hookClientContextPatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated +import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch +import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.findInstructionIndicesReversedOrThrow +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.insertLiteralOverride +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import kotlin.collections.plusAssign + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/NavigationBarPatch;" + +val navigationBarPatch = bytecodePatch( + name = "Navigation bar", + description = "Adds options to hide and change the bottom navigation bar (such as the Shorts button) " + + " and the upper navigation toolbar. Patching version 20.21.37 and lower also adds a setting to use a wide searchbar." +) { + dependsOn( + sharedExtensionPatch, + settingsPatch, + addResourcesPatch, + navigationBarHookPatch, + versionCheckPatch, + hookClientContextPatch, + toolbarHookPatch + ) + + compatibleWith( + "com.google.android.youtube"( + "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + ), + ) + + apply { + addResources("youtube", "layout.buttons.navigation.navigationBarPatch") + + val preferences = mutableSetOf( + SwitchPreference("revanced_hide_home_button"), + SwitchPreference("revanced_hide_shorts_button"), + SwitchPreference("revanced_hide_create_button"), + SwitchPreference("revanced_hide_subscriptions_button"), + SwitchPreference("revanced_hide_notifications_button"), + SwitchPreference("revanced_switch_create_with_notifications_button"), + SwitchPreference("revanced_hide_navigation_button_labels"), + SwitchPreference("revanced_narrow_navigation_buttons"), + ) + + if (is_19_25_or_greater) { + preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_light") + preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") + + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_disable_translucent_status_bar") + ) + + if (is_20_15_or_greater) { + preferences += SwitchPreference("revanced_navigation_bar_animations") + } + } + + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreenPreference( + key = "revanced_navigation_buttons_screen", + sorting = Sorting.UNSORTED, + preferences = preferences + ) + ) + + + // Switch create with notifications button. + addOSNameHook( + Endpoint.GUIDE, + "${EXTENSION_CLASS_DESCRIPTOR}->switchCreateWithNotificationButton(Ljava/lang/String;)Ljava/lang/String;", + ) + + // Hide navigation button labels. + createPivotBarMethodMatch.let { + it.method.apply { + val setTextIndex = it[0] + val targetRegister = getInstruction(setTextIndex).registerC + + addInstruction( + setTextIndex, + "invoke-static { v$targetRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", + ) + } + } + + // Hook navigation button created, in order to hide them. + hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) + + // Force on/off translucent effect on status bar and navigation buttons. + if (is_19_25_or_greater) { + translucentNavigationStatusBarFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", + ) + } + + translucentNavigationButtonsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } + + translucentNavigationButtonsSystemFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } + } + + if (is_20_15_or_greater) { + animatedNavigationTabsFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z", + ) + } + } + + arrayOf( + pivotBarChangedMethodMatch, + pivotBarStyleMethodMatch + ).forEach { match -> + match.method.apply { + val targetIndex = match[1] + 1 + val register = getInstruction(targetIndex - 1).registerA + + addInstructions( + targetIndex, + """ + invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->enableNarrowNavigationButton(Z)Z + move-result v$register + """ + ) + } + + } + + + // + // Toolbar. + // + + val toolbarPreferences = mutableSetOf( + SwitchPreference("revanced_hide_toolbar_create_button"), + SwitchPreference("revanced_hide_toolbar_notification_button"), + SwitchPreference("revanced_hide_toolbar_search_button") + ) + if (!is_20_31_or_greater) { + toolbarPreferences += SwitchPreference("revanced_wide_searchbar") + } + + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreenPreference( + key = "revanced_toolbar_screen", + sorting = Sorting.UNSORTED, + preferences = toolbarPreferences + ) + ) + + hookToolbar("${EXTENSION_CLASS_DESCRIPTOR}->hideCreateButton") + hookToolbar("${EXTENSION_CLASS_DESCRIPTOR}->hideNotificationButton") + hookToolbar("${EXTENSION_CLASS_DESCRIPTOR}->hideSearchButton") + + + // + // Wide searchbar. + // + + // YT removed the legacy text search text field all code required to use it. + // This functionality could be restored by adding a search text field to the toolbar + // with a listener that artificially clicks the toolbar search button. + if (!is_20_31_or_greater) { + // Navigate to the method that checks if the YT logo is shown beside the search bar. + val shouldShowLogoMethod = with(setWordmarkHeaderMethod) { + val invokeStaticIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.INVOKE_STATIC && methodReference?.returnType == "Z" + } + navigate(this).to(invokeStaticIndex).stop() + } + + shouldShowLogoMethod.apply { + findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> + val register = getInstruction(index).registerA + + addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->enableWideSearchbar(Z)Z + move-result v$register + """ + ) + } + } + + // Fix missing left padding when using wide searchbar. + wideSearchbarLayoutMethod.apply { + findInstructionIndicesReversedOrThrow { + val reference = getReference() + reference?.definingClass == "Landroid/view/LayoutInflater;" && reference.name == "inflate" + }.forEach { inflateIndex -> + val register = + getInstruction(inflateIndex + 1).registerA + + addInstruction( + inflateIndex + 2, + "invoke-static { v$register }, " + + "${EXTENSION_CLASS_DESCRIPTOR}->setActionBar(Landroid/view/View;)V" + ) + } + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt deleted file mode 100644 index 230db65c62..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ /dev/null @@ -1,150 +0,0 @@ -package app.revanced.patches.youtube.layout.buttons.navigation - -import app.revanced.patcher.extensions.addInstruction -import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated -import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.insertLiteralOverride -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/NavigationButtonsPatch;" - -@Suppress("ObjectPropertyName") -val navigationButtonsPatch = bytecodePatch( - name = "Navigation buttons", - description = "Adds options to hide and change navigation buttons (such as the Shorts button).", -) { - dependsOn( - sharedExtensionPatch, - settingsPatch, - addResourcesPatch, - navigationBarHookPatch, - versionCheckPatch, - ) - - compatibleWith( - "com.google.android.youtube"( - "19.43.41", - "20.14.43", - "20.21.37", - "20.31.40", - ), - ) - - apply { - addResources("youtube", "layout.buttons.navigation.navigationButtonsPatch") - - val preferences = mutableSetOf( - SwitchPreference("revanced_hide_home_button"), - SwitchPreference("revanced_hide_shorts_button"), - SwitchPreference("revanced_hide_create_button"), - SwitchPreference("revanced_hide_subscriptions_button"), - SwitchPreference("revanced_hide_notifications_button"), - SwitchPreference("revanced_switch_create_with_notifications_button"), - SwitchPreference("revanced_hide_navigation_button_labels"), - ) - - if (is_19_25_or_greater) { - preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_light") - preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") - - PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_disable_translucent_status_bar"), - ) - } - - if (is_20_15_or_greater) { - PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_navigation_bar_animations"), - ) - } - - PreferenceScreen.GENERAL_LAYOUT.addPreferences( - PreferenceScreenPreference( - key = "revanced_navigation_buttons_screen", - sorting = Sorting.UNSORTED, - preferences = preferences, - ), - ) - - // Switch create with notifications button. - addCreateButtonViewMethodMatch.method.apply { - val conditionalCheckIndex = addCreateButtonViewMethodMatch[1] - val conditionRegister = - getInstruction(conditionalCheckIndex).registerA - - addInstructions( - conditionalCheckIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z - move-result v$conditionRegister - """, - ) - } - - // Hide navigation button labels. - createPivotBarMethodMatch.let { - it.method.apply { - val setTextIndex = it[0] - val targetRegister = getInstruction(setTextIndex).registerC - - addInstruction( - setTextIndex, - "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", - ) - } - } - - // Hook navigation button created, in order to hide them. - hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - - // Force on/off translucent effect on status bar and navigation buttons. - if (is_19_25_or_greater) { - translucentNavigationStatusBarFeatureFlagMethodMatch.let { - it.method.insertLiteralOverride( - it[0], - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", - ) - } - - translucentNavigationButtonsFeatureFlagMethodMatch.let { - it.method.insertLiteralOverride( - it[0], - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) - } - - translucentNavigationButtonsSystemFeatureFlagMethodMatch.let { - it.method.insertLiteralOverride( - it[0], - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) - } - } - - if (is_20_15_or_greater) { - animatedNavigationTabsFeatureFlagMethodMatch.let { - it.method.insertLiteralOverride( - it[0], - "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z", - ) - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index da59a908f4..a350d883a9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -4,6 +4,7 @@ import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode internal val BytecodePatchContext.mediaRouteButtonMethod by gettingFirstMethodDeclaratively { name("setVisibility") @@ -30,3 +31,23 @@ internal val BytecodePatchContext.inflateControlsGroupLayoutStubMethodMatch by c method("inflate"), ) } + +internal val BytecodePatchContext.fullscreenButtonMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameterTypes("Landroid/view/View;") + returnType("V") + instructions( + ResourceType.ID("fullscreen_button"), + Opcode.CHECK_CAST() + ) +} + +internal val BytecodePatchContext.titleAnchorMethodMatch by composingFirstMethod { + returnType("V") + instructions( + ResourceType.ID("player_collapse_button"), + Opcode.CHECK_CAST(), + ResourceType.ID("title_anchor"), + Opcode.MOVE_RESULT_OBJECT() + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index 4039e8a7cb..f09b64213f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -26,7 +26,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val hidePlayerOverlayButtonsPatch = bytecodePatch( name = "Hide player overlay buttons", description = "Adds options to hide the player Cast, Autoplay, Captions, Previous & Next buttons, and the player " + - "control buttons background.", + "control buttons background.", ) { dependsOn( sharedExtensionPatch, @@ -38,10 +38,12 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -49,23 +51,26 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( addResources("youtube", "layout.buttons.overlay.hidePlayerOverlayButtonsPatch") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_player_previous_next_buttons"), - SwitchPreference("revanced_hide_cast_button"), - SwitchPreference("revanced_hide_captions_button"), SwitchPreference("revanced_hide_autoplay_button"), + SwitchPreference("revanced_hide_captions_button"), + SwitchPreference("revanced_hide_cast_button"), + SwitchPreference("revanced_hide_collapse_button"), + SwitchPreference("revanced_hide_fullscreen_button"), SwitchPreference("revanced_hide_player_control_buttons_background"), + SwitchPreference("revanced_hide_player_previous_next_buttons"), ) // region Hide player next/previous button. getLayoutConstructorMethodMatch().let { val insertIndex = it[-1] - val viewRegister = it.method.getInstruction(insertIndex).registerC + val viewRegister = + it.method.getInstruction(insertIndex).registerC it.method.addInstruction( insertIndex, "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + - "->hidePreviousNextButtons(Landroid/view/View;)V", + "->hidePreviousNextButtons(Landroid/view/View;)V", ) } @@ -84,7 +89,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( if (is_20_28_or_greater) { arrayOf( castButtonPlayerFeatureFlagMethodMatch, - castButtonActionFeatureFlagMethodMatch, + castButtonActionFeatureFlagMethodMatch, // Cast button in the feed. ).forEach { match -> match.method.insertLiteralOverride( match[0], @@ -118,14 +123,14 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( val gotoIndex = indexOfFirstInstructionOrThrow(constIndex) { val parameterTypes = getReference()?.parameterTypes opcode == Opcode.INVOKE_VIRTUAL && - parameterTypes?.size == 2 && - parameterTypes.first() == "Landroid/view/ViewStub;" + parameterTypes?.size == 2 && + parameterTypes.first() == "Landroid/view/ViewStub;" } + 1 addInstructionsWithLabels( constIndex, """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideAutoPlayButton()Z + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideAutoplayButton()Z move-result v$constRegister if-nez v$constRegister, :hidden """, @@ -135,6 +140,54 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // endregion + + // region Hide collapse button. + + titleAnchorMethodMatch.let { + it.method.apply { + val titleAnchorIndex = it[-1] + val titleAnchorRegister = getInstruction(titleAnchorIndex).registerA + + addInstruction( + titleAnchorIndex + 1, + "invoke-static { v$titleAnchorRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->setTitleAnchorStartMargin(Landroid/view/View;)V" + ) + + val playerCollapseButtonIndex = it[1] + val playerCollapseButtonRegister = getInstruction(playerCollapseButtonIndex).registerA + + addInstruction( + playerCollapseButtonIndex + 1, + "invoke-static { v$playerCollapseButtonRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->hideCollapseButton(Landroid/widget/ImageView;)V" + ) + } + } + + // endregion + + // region Hide fullscreen button. + + fullscreenButtonMethodMatch.let { + it.method.apply { + val castIndex = it[1] + val insertIndex = castIndex + 1 + val insertRegister = getInstruction(castIndex).registerA + + addInstructionsWithLabels( + insertIndex, + """ + invoke-static { v$insertRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->hideFullscreenButton(Landroid/widget/ImageView;)Landroid/widget/ImageView; + move-result-object v$insertRegister + if-nez v$insertRegister, :show + return-void + """, + ExternalLabel("show", getInstruction(insertIndex)) + ) + } + } + + // endregion + // region Hide player control buttons background. inflateControlsGroupLayoutStubMethodMatch.let { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index e4a5d1d1a8..d20f4d742d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -7,15 +7,16 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.ListPreference -import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated +import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" @Suppress("unused") val changeFormFactorPatch = bytecodePatch( @@ -26,15 +27,17 @@ val changeFormFactorPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - navigationButtonsPatch, + navigationBarHookPatch ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/autoplaypreview/HideAutoplayPreviewPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/autoplaypreview/HideAutoplayPreviewPatch.kt new file mode 100644 index 0000000000..4417a906cc --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/autoplaypreview/HideAutoplayPreviewPatch.kt @@ -0,0 +1,74 @@ +package app.revanced.patches.youtube.layout.hide.autoplaypreview + +import app.revanced.patcher.extensions.ExternalLabel +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.getLayoutConstructorMethodMatch +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstResourceIdOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import kotlin.collections.first + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/HideAutoplayPreviewPatch;" + +@Suppress("unused") +val hideAutoplayPreviewPatch = bytecodePatch( + name = "Hide autoplay preview", + description = "Adds an option to hide the autoplay preview at the end of videos.", +) { + dependsOn( + settingsPatch, + sharedExtensionPatch, + resourceMappingPatch + ) + + compatibleWith( + "com.google.android.youtube"( + "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + ) + ) + + apply { + addResources("youtube", "layout.hide.autoplaypreview.hideAutoplayPreviewPatch") + + PreferenceScreen.PLAYER.addPreferences( + SwitchPreference("revanced_hide_autoplay_preview") + ) + + getLayoutConstructorMethodMatch().method.apply { + val constIndex = indexOfFirstResourceIdOrThrow("autonav_preview_stub") + val constRegister = getInstruction(constIndex).registerA + val gotoIndex = indexOfFirstInstructionOrThrow(constIndex) { + val parameterTypes = methodReference?.parameterTypes + opcode == Opcode.INVOKE_VIRTUAL && + parameterTypes?.size == 2 && + parameterTypes.first() == "Landroid/view/ViewStub;" + } + 1 + + addInstructionsWithLabels( + constIndex, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideAutoplayPreview()Z + move-result v$constRegister + if-nez v$constRegister, :hidden + """, + ExternalLabel("hidden", getInstruction(gotoIndex)), + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index b09e058942..0f61cd5a17 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -2,13 +2,9 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal val BytecodePatchContext.layoutCircleMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -33,7 +29,7 @@ internal val BytecodePatchContext.layoutIconMethodMatch by composingFirstMethod Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST, - ) + ) literal { layoutIcon } } @@ -55,14 +51,18 @@ internal val BytecodePatchContext.showEndscreenCardsMethod by gettingFirstMethod accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") + instructions( + allOf(Opcode.IPUT_OBJECT(), field { type == "Ljava/lang/String;" }), + allOf(Opcode.IGET_OBJECT(), field { type == "Ljava/lang/String;" }), + afterAtMost(7, allOf(Opcode.INVOKE_VIRTUAL(), method("ordinal"))), + 5L(), + 8L(), + 9L() + ) custom { - immutableClassDef.methods.count() == 5 && - containsLiteralInstruction(0) && - containsLiteralInstruction(5) && - containsLiteralInstruction(8) && - indexOfFirstInstruction { - val reference = getReference() - reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" - } >= 0 + immutableClassDef.methods.count() == 5 + // 'public final' or 'final' + && AccessFlags.FINAL.isSet(accessFlags) } } + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt index ca2fca5c35..e6f36cd84f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources @@ -35,7 +36,7 @@ private val hideEndScreenCardsResourcePatch = resourcePatch { addResources("youtube", "layout.hide.endscreencards.hideEndScreenCardsResourcePatch") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_endscreen_cards"), + SwitchPreference("revanced_hide_end_screen_cards"), ) fun idOf(name: String) = ResourceType.LAYOUT["endscreen_element_layout_$name"] @@ -62,10 +63,12 @@ val hideEndScreenCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -82,7 +85,7 @@ val hideEndScreenCardsPatch = bytecodePatch( addInstruction( insertIndex, "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", + "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/Fingerprints.kt similarity index 99% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/Fingerprints.kt index ebb221781d..432cae1cf5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/Fingerprints.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.hide.endscreensuggestion +package app.revanced.patches.youtube.layout.hide.endscreensuggestedvideo import app.revanced.patcher.* import app.revanced.patcher.extensions.instructions diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/HideEndScreenSuggestedVideoPatch.kt similarity index 81% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/HideEndScreenSuggestedVideoPatch.kt index 979621b5e1..ae14785935 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestedvideo/HideEndScreenSuggestedVideoPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.hide.endscreensuggestion +package app.revanced.patches.youtube.layout.hide.endscreensuggestedvideo import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstructionsWithLabels @@ -31,15 +31,17 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { - addResources("youtube", "layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch") + addResources("youtube", "layout.hide.endscreensuggestedvideo.hideEndScreenSuggestedVideoPatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_end_screen_suggested_video"), @@ -49,18 +51,21 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( val endScreenMethod = navigate(it.immutableMethod).to(it[-1]).stop() endScreenMethod.apply { - val autoNavStatusMethodName = autoNavConstructorMethod.immutableClassDef.getAutoNavStatusMethod().name + val autoNavStatusMethodName = + autoNavConstructorMethod.immutableClassDef.getAutoNavStatusMethod().name val invokeIndex = indexOfFirstInstructionOrThrow { val reference = methodReference reference?.name == autoNavStatusMethodName && - reference.returnType == "Z" && - reference.parameterTypes.isEmpty() + reference.returnType == "Z" && + reference.parameterTypes.isEmpty() } - val iGetObjectIndex = indexOfFirstInstructionReversedOrThrow(invokeIndex, Opcode.IGET_OBJECT) + val iGetObjectIndex = + indexOfFirstInstructionReversedOrThrow(invokeIndex, Opcode.IGET_OBJECT) val invokeReference = getInstruction(invokeIndex).reference - val iGetObjectReference = getInstruction(iGetObjectIndex).reference + val iGetObjectReference = + getInstruction(iGetObjectIndex).reference val opcodeName = getInstruction(invokeIndex).opcode.name addInstructionsWithLabels( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 8d048b6458..00cf27fe76 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -30,15 +30,20 @@ val disableFullscreenAmbientModePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { - addResources("youtube", "layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch") + addResources( + "youtube", + "layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch" + ) PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_disable_fullscreen_ambient_mode"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 73180a043c..c88d7a8bec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -1,34 +1,96 @@ package app.revanced.patches.youtube.layout.hide.general import app.revanced.patcher.* +import app.revanced.patcher.after import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutMethod import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef -/** - * 20.26+ - */ -internal val BytecodePatchContext.hideShowMoreButtonMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) + +internal val BytecodePatchContext.hideShowMoreButtonSetViewMethodMatch by composingFirstMethod { returnType("V") - parameterTypes("L", "Ljava/lang/Object;") + + var methodDefiningClass = "" + custom { + methodDefiningClass = definingClass + true + } instructions( - ResourceType.LAYOUT("expand_button_down"), - method { toString() == "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;" }, - after(Opcode.MOVE_RESULT_OBJECT()), + ResourceType.ID("link_text_start"), + allOf( + Opcode.IPUT_OBJECT(), + field { type == "Landroid/widget/TextView;" && definingClass == methodDefiningClass }), + ResourceType.ID("expand_button_container"), + allOf( + Opcode.IPUT_OBJECT(), + field { type == "Landroid/view/View;" && definingClass == methodDefiningClass }) ) } -internal val BytecodePatchContext.hideShowMoreLegacyButtonMethodMatch by composingFirstMethod { +context(_: BytecodePatchContext) +internal fun ClassDef.getHideShowMoreButtonGetParentViewMethod() = + firstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + parameterTypes() + } + +context(_: BytecodePatchContext) +internal fun ClassDef.getHideShowMoreButtonMethod() = firstMethodDeclaratively { + returnType("V") + parameterTypes("L", "Ljava/lang/Object;") + instructions( + allOf( + Opcode.INVOKE_VIRTUAL(), + method { + toString() == "Landroid/view/View;->setContentDescription(Ljava/lang/CharSequence;)V" + } + ) + ) +} + + +/** + * 20.21+ + */ +internal val BytecodePatchContext.hideSubscribedChannelsBarConstructorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - ResourceType.LAYOUT("expand_button_down"), - method { toString() == "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;" }, - Opcode.MOVE_RESULT_OBJECT(), + ResourceType.ID("parent_container"), + afterAtMost(3, Opcode.MOVE_RESULT_OBJECT()), + afterAtMost( + 5, + allOf(Opcode.NEW_INSTANCE(), type($$"Landroid/widget/LinearLayout$LayoutParams;")) + ) + ) + custom { immutableClassDef.anyField { type == "Landroid/support/v7/widget/RecyclerView;" } } +} + +/** + * ~ 20.21 + */ +internal val BytecodePatchContext.hideSubscribedChannelsBarConstructorLegacyMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + ResourceType.ID("parent_container"), + afterAtMost(3, Opcode.MOVE_RESULT_OBJECT()), + afterAtMost( + 5, + allOf(Opcode.NEW_INSTANCE(), type($$"Landroid/widget/LinearLayout$LayoutParams;")) + ) + ) +} + +internal val ClassDef.hideSubscribedChannelsBarLandscapeMethodMatch by ClassDefComposing.composingFirstMethod { + returnType("V") + parameterTypes() + instructions( + ResourceType.DIMEN("parent_view_width_in_wide_mode"), + allOf(Opcode.INVOKE_VIRTUAL(), method("getDimensionPixelSize")), + after(Opcode.MOVE_RESULT()) ) } @@ -146,3 +208,124 @@ internal val BytecodePatchContext.hideViewCountMethodMatch by composingFirstMeth Opcode.RETURN_OBJECT, ) } + +internal val BytecodePatchContext.searchBoxTypingStringMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("L") + instructions( + allOf(Opcode.IGET_OBJECT(), field { type == "Ljava/util/Collection;" }), + afterAtMost(5, method { toString() == "Ljava/util/ArrayList;->(Ljava/util/Collection;)V" }), + allOf(Opcode.IGET_OBJECT(), field { type == "Ljava/lang/String;" }), + afterAtMost(5, method { toString() == "Ljava/lang/String;->isEmpty()Z" }), + ResourceType.DIMEN("suggestion_category_divider_height") + ) +} + +internal val BytecodePatchContext.searchSuggestionEndpointConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "\u2026 " +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") +} + +internal val ClassDef.searchSuggestionEndpointMethodMatch by ClassDefComposing.composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Z") + parameterTypes() + + var methodDefiningClass = "" + custom { + methodDefiningClass = definingClass + true + } + + instructions( + allOf( + Opcode.IGET_OBJECT(), + field { definingClass == methodDefiningClass && type == "Ljava/lang/String;" }), + allOf( + Opcode.INVOKE_STATIC(), + method { toString() == "Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z" }), + ) +} + +internal val BytecodePatchContext.latestVideosContentPillMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("L", "Z") + instructions( + ResourceType.LAYOUT("content_pill"), + method { + toString() == "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;" + }, + after(Opcode.MOVE_RESULT_OBJECT()) + ) +} + +internal val BytecodePatchContext.latestVideosBarMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("L", "Z") + instructions( + ResourceType.LAYOUT("bar"), + method { + toString() == "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;" + }, + after(Opcode.MOVE_RESULT_OBJECT()) + ) +} + + +internal val BytecodePatchContext.bottomSheetMenuItemBuilderMethodMatch by composingFirstMethod { + returnType("L") + parameterTypes("L") + instructions( + allOf( + Opcode.INVOKE_STATIC(), + method { + returnType == "Ljava/lang/CharSequence;" && + parameterTypes.size == 1 && parameterTypes[0].startsWith("L") + } + ), + after(Opcode.MOVE_RESULT_OBJECT()), + "Text missing for BottomSheetMenuItem."() + ) +} + +internal val BytecodePatchContext.contextualMenuItemBuilderMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) + returnType("V") + parameterTypes("L", "L") + instructions( + allOf(Opcode.CHECK_CAST(), type("Landroid/widget/TextView;")), + afterAtMost( + 5, + method { toString() == "Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V" } + ), + ResourceType.DIMEN("poster_art_width_default"), + ) +} + +internal val BytecodePatchContext.channelTabBuilderMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Landroid/view/View;") + parameterTypes( + "Ljava/lang/CharSequence;", + "Ljava/lang/CharSequence;", + "Z", + "L" + ) +} + +internal val BytecodePatchContext.channelTabRendererMethod by gettingFirstMethodDeclaratively( + "TabRenderer.content contains SectionListRenderer but the tab does not have a section list controller." +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes( + "L", + "Ljava/util/List;", + "I" + ) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 1abf4833c2..864583af4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -1,6 +1,8 @@ package app.revanced.patches.youtube.layout.hide.general +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patcher.CompositeMatch +import app.revanced.patcher.classDef import app.revanced.patcher.extensions.* import app.revanced.patcher.immutableClassDef import app.revanced.patcher.patch.resourcePatch @@ -9,9 +11,11 @@ import app.revanced.patches.shared.layout.hide.general.hideLayoutComponentsPatch import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.* +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting +import app.revanced.patches.youtube.misc.engagement.engagementPanelHookPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_20_26_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_21_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -19,12 +23,18 @@ import app.revanced.util.findFreeRegister import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter internal var albumCardId = -1L private set @@ -71,6 +81,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( hideLayoutComponentsResourcePatch, navigationBarHookPatch, versionCheckPatch, + engagementPanelHookPatch, resourceMappingPatch, ), filterClasses = setOf( @@ -82,15 +93,23 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( ), compatibleWithPackages = arrayOf( "com.google.android.youtube" to setOf( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ), ) { addResources("youtube", "layout.hide.general.hideLayoutComponentsPatch") + PreferenceScreen.ADS.addPreferences( + // Uses horizontal shelf and a buffer, which requires managing in a single place in the code + // to ensure the generic "hide horizontal shelves" doesn't hide when it should show. + SwitchPreference("revanced_hide_creator_store_shelf") + ) + PreferenceScreen.PLAYER.addPreferences( PreferenceScreenPreference( key = "revanced_hide_description_components_screen", @@ -99,15 +118,22 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_ask_section"), SwitchPreference("revanced_hide_attributes_section"), SwitchPreference("revanced_hide_chapters_section"), + SwitchPreference("revanced_hide_course_progress_section"), + SwitchPreference("revanced_hide_explore_section"), + SwitchPreference("revanced_hide_explore_course_section"), + SwitchPreference("revanced_hide_explore_podcast_section"), SwitchPreference("revanced_hide_featured_links_section"), + SwitchPreference("revanced_hide_featured_places_section"), SwitchPreference("revanced_hide_featured_videos_section"), - SwitchPreference("revanced_hide_info_cards_section"), + SwitchPreference("revanced_hide_gaming_section"), SwitchPreference("revanced_hide_how_this_was_made_section"), SwitchPreference("revanced_hide_hype_points"), + SwitchPreference("revanced_hide_info_cards_section"), SwitchPreference("revanced_hide_key_concepts_section"), - SwitchPreference("revanced_hide_podcast_section"), + SwitchPreference("revanced_hide_music_section"), SwitchPreference("revanced_hide_subscribe_button"), SwitchPreference("revanced_hide_transcript_section"), + SwitchPreference("revanced_hide_quizzes_section") ), ), PreferenceScreenPreference( @@ -118,13 +144,14 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_comments_channel_guidelines"), SwitchPreference("revanced_hide_comments_by_members_header"), SwitchPreference("revanced_hide_comments_section"), + SwitchPreference("revanced_hide_comments_section_in_home_feed"), SwitchPreference("revanced_hide_comments_community_guidelines"), SwitchPreference("revanced_hide_comments_create_a_short_button"), SwitchPreference("revanced_hide_comments_emoji_and_timestamp_buttons"), SwitchPreference("revanced_hide_comments_preview_comment"), SwitchPreference("revanced_hide_comments_thanks_button"), ), - sorting = PreferenceScreenPreference.Sorting.UNSORTED, + sorting = Sorting.UNSORTED, ), SwitchPreference("revanced_hide_channel_bar"), SwitchPreference("revanced_hide_channel_watermark"), @@ -132,29 +159,34 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_emergency_box"), SwitchPreference("revanced_hide_info_panels"), SwitchPreference("revanced_hide_join_membership_button"), + SwitchPreference("revanced_hide_live_chat_replay_button"), SwitchPreference("revanced_hide_medical_panels"), SwitchPreference("revanced_hide_quick_actions"), SwitchPreference("revanced_hide_related_videos"), SwitchPreference("revanced_hide_subscribers_community_guidelines"), SwitchPreference("revanced_hide_timed_reactions"), + SwitchPreference("revanced_hide_video_title") ) PreferenceScreen.FEED.addPreferences( PreferenceScreenPreference( key = "revanced_hide_keyword_content_screen", - sorting = PreferenceScreenPreference.Sorting.UNSORTED, + sorting = Sorting.UNSORTED, preferences = setOf( SwitchPreference("revanced_hide_keyword_content_home"), SwitchPreference("revanced_hide_keyword_content_subscriptions"), SwitchPreference("revanced_hide_keyword_content_search"), - TextPreference("revanced_hide_keyword_content_phrases", inputType = InputType.TEXT_MULTI_LINE), + TextPreference( + "revanced_hide_keyword_content_phrases", + inputType = InputType.TEXT_MULTI_LINE + ), NonInteractivePreference( key = "revanced_hide_keyword_content_about", tag = "app.revanced.extension.shared.settings.preference.BulletPointPreference", ), NonInteractivePreference( key = "revanced_hide_keyword_content_about_whole_words", - tag = "app.revanced.extension.youtube.settings.preference.HtmlPreference", + tag = "app.revanced.extension.youtube.settings.preference.HTMLPreference", ), ), ), @@ -170,6 +202,18 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( PreferenceScreenPreference( key = "revanced_channel_screen", preferences = setOf( + PreferenceCategory( + titleKey = null, + sorting = Sorting.UNSORTED, + tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", + preferences = setOf( + SwitchPreference("revanced_hide_channel_tab"), + TextPreference( + "revanced_hide_channel_tab_filter_strings", + inputType = InputType.TEXT_MULTI_LINE + ), + ) + ), SwitchPreference("revanced_hide_community_button"), SwitchPreference("revanced_hide_for_you_shelf"), SwitchPreference("revanced_hide_join_button"), @@ -185,6 +229,18 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_community_posts"), SwitchPreference("revanced_hide_compact_banner"), SwitchPreference("revanced_hide_expandable_card"), + PreferenceCategory( + titleKey = null, + sorting = Sorting.UNSORTED, + tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", + preferences = setOf( + SwitchPreference("revanced_hide_feed_flyout_menu"), + TextPreference( + "revanced_hide_feed_flyout_menu_filter_strings", + inputType = InputType.TEXT_MULTI_LINE + ), + ) + ), SwitchPreference("revanced_hide_floating_microphone_button"), SwitchPreference( key = "revanced_hide_horizontal_shelves", @@ -192,6 +248,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( ), SwitchPreference("revanced_hide_image_shelf"), SwitchPreference("revanced_hide_latest_posts"), + SwitchPreference("revanced_hide_latest_videos_button"), SwitchPreference("revanced_hide_mix_playlists"), SwitchPreference("revanced_hide_movies_section"), SwitchPreference("revanced_hide_notify_me_button"), @@ -206,7 +263,13 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( SwitchPreference("revanced_hide_doodles"), ) - // region Mix playlists + if (is_20_21_or_greater) { + PreferenceScreen.FEED.addPreferences( + SwitchPreference("revanced_hide_you_may_like_section") + ) + } + + // region Hide mix playlists parseElementFromBufferMethodMatch.let { it.method.apply { @@ -214,12 +277,18 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( val insertIndex = startIndex + 1 val byteArrayParameter = "p3" - val conversionContextRegister = getInstruction(startIndex).registerA - val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } + val conversionContextRegister = + getInstruction(startIndex).registerA + val returnEmptyComponentInstruction = + instructions.last { it.opcode == Opcode.INVOKE_STATIC } val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC val freeRegister = - findFreeRegister(insertIndex, conversionContextRegister, returnEmptyComponentRegister) + findFreeRegister( + insertIndex, + conversionContextRegister, + returnEmptyComponentRegister + ) addInstructionsWithLabels( insertIndex, @@ -239,7 +308,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // endregion - // region Watermark (legacy code for old versions of YouTube) + // region Hide watermark (legacy code for old versions of YouTube) playerOverlayMethod.immutableClassDef.getShowWatermarkMethod().apply { val index = implementation!!.instructions.size - 5 @@ -256,25 +325,94 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // endregion - // region Show more button + // region Hide Show more button - (if (is_20_26_or_greater) hideShowMoreButtonMethodMatch else hideShowMoreLegacyButtonMethodMatch).let { + val (textViewField, buttonContainerField) = hideShowMoreButtonSetViewMethodMatch.let { + val textViewIndex = it[1] + val buttonContainerIndex = it[3] + + Pair( + it.method.getInstruction(textViewIndex).reference, + it.method.getInstruction(buttonContainerIndex).reference + ) + } + + val parentViewMethod = hideShowMoreButtonSetViewMethodMatch.immutableClassDef + .getHideShowMoreButtonGetParentViewMethod() + + hideShowMoreButtonSetViewMethodMatch.immutableClassDef.getHideShowMoreButtonMethod().apply { + val helperMethod = ImmutableMethod( + definingClass, + "patch_hideShowMoreButton", + listOf(), + "V", + AccessFlags.PRIVATE.value or AccessFlags.FINAL.value, + null, + null, + MutableMethodImplementation(7), + ).toMutable().apply { + addInstructions( + 0, + """ + move-object/from16 v0, p0 + invoke-virtual { v0 }, $parentViewMethod + move-result-object v1 + iget-object v2, v0, $buttonContainerField + iget-object v3, v0, $textViewField + invoke-static { v1, v2, v3 }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideShowMoreButton(Landroid/view/View;Landroid/view/View;Landroid/widget/TextView;)V + return-void + """ + ) + }.also(classDef.methods::add) + + findInstructionIndicesReversedOrThrow(Opcode.RETURN_VOID).forEach { index -> + addInstruction(index, "invoke-direct/range { p0 .. p0 }, $helperMethod") + } + } + + // endregion + + + // region Hide Subscribed channels bar + + // Tablet + val methodMatch = if (is_20_21_or_greater) + hideSubscribedChannelsBarConstructorMethodMatch + else hideSubscribedChannelsBarConstructorLegacyMethodMatch + + methodMatch.let { it.method.apply { - val moveRegisterIndex = it[-1] - val viewRegister = getInstruction(moveRegisterIndex).registerA + val index = it[1] + val register = getInstruction(index).registerA - val insertIndex = moveRegisterIndex + 1 addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideShowMoreButton(Landroid/view/View;)V", + index + 1, + "invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + + "->hideSubscribedChannelsBar(Landroid/view/View;)V", + ) + } + } + + // Phone (landscape mode) + methodMatch.immutableClassDef.hideSubscribedChannelsBarLandscapeMethodMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideSubscribedChannelsBar(I)I + move-result v$register + """ ) } } // endregion - // region crowdfunding box + // region Hide Crowdfunding box + crowdfundingBoxMethodMatch.let { it.method.apply { val insertIndex = it[-1] @@ -283,14 +421,14 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( addInstruction( insertIndex, "invoke-static {v$objectRegister}, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideCrowdfundingBox(Landroid/view/View;)V", + "->hideCrowdfundingBox(Landroid/view/View;)V", ) } } // endregion - // region hide album cards + // region Hide Album cards albumCardsMethodMatch.let { it.method.apply { @@ -301,14 +439,14 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( addInstruction( insertIndex, "invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideAlbumCard(Landroid/view/View;)V", + "->hideAlbumCard(Landroid/view/View;)V", ) } } // endregion - // region hide floating microphone + // region Hide Floating microphone showFloatingMicrophoneButtonMethodMatch.let { it.method.apply { @@ -327,7 +465,27 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // endregion - // region 'Yoodles' + // region Hide latest videos button + + listOf( + latestVideosContentPillMethodMatch, + latestVideosBarMethodMatch, + ).forEach { match -> + match.method.apply { + val moveIndex = match[-1] + val viewRegister = getInstruction(moveIndex).registerA + + addInstruction( + moveIndex + 1, + "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + + "->hideLatestVideosButton(Landroid/view/View;)V" + ) + } + } + + // endregion + + // region Hide 'Yoodles' yoodlesImageViewMethod.apply { findInstructionIndicesReversedOrThrow { @@ -339,14 +497,14 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( replaceInstruction( insertIndex, "invoke-static { v$imageViewRegister, v$drawableRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->" + - "setDoodleDrawable(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V", + "setDoodleDrawable(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V", ) } } // endregion - // region hide view count + // region Hide view count hideViewCountMethodMatch.method.apply { val startIndex = hideViewCountMethodMatch[0] @@ -356,10 +514,10 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( val applyDimensionIndex = indexOfFirstInstructionReversedOrThrow { val reference = getReference() opcode == Opcode.INVOKE_STATIC && - reference?.definingClass == "Landroid/util/TypedValue;" && - reference.returnType == "F" && - reference.name == "applyDimension" && - reference.parameterTypes == listOf("I", "F", "Landroid/util/DisplayMetrics;") + reference?.definingClass == "Landroid/util/TypedValue;" && + reference.returnType == "F" && + reference.name == "applyDimension" && + reference.parameterTypes == listOf("I", "F", "Landroid/util/DisplayMetrics;") } // A float value is passed which is used to determine subtitle text size. @@ -378,7 +536,7 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( // endregion - // region hide filter bar + // region Hide filter bar /** * Patch a [Method] with a given [instructions]. @@ -416,6 +574,179 @@ val hideLayoutComponentsPatch = hideLayoutComponentsPatch( relatedChipCloudMethodMatch.patch(1) { register -> "invoke-static { v$register }, " + - "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" + "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" } + + // endregion + + // region Hide You may like section + + if (is_20_21_or_greater) { + val searchSuggestionEndpointField = + searchSuggestionEndpointConstructorMethod.immutableClassDef + .searchSuggestionEndpointMethodMatch.let { + it.method.getInstruction(it[0]).fieldReference!! + } + val searchSuggestionEndpointClass = searchSuggestionEndpointField.definingClass + + searchBoxTypingStringMethodMatch.let { + it.method.apply { + // A collection of search suggestions. + // This includes trending search (also known as 'You may like' section) + // and your search history. + + val searchSuggestionCollectionField = getInstruction(it[0]).fieldReference!! + val typedStringField = getInstruction(it[2]).fieldReference!! + + val helperMethod = ImmutableMethod( + definingClass, + "patch_setSearchSuggestions", + listOf( + ImmutableMethodParameter( + parameterTypes.first().toString(), + null, + null + ) + ), + "V", + AccessFlags.PRIVATE.value or AccessFlags.FINAL.value, + annotations, + null, + MutableMethodImplementation(7), + ).toMutable().apply { + addInstructionsWithLabels( + 0, + """ + move-object/from16 v0, p1 + iget-object v1, v0, $typedStringField + + # Check if the setting is enabled and if the typed string is empty. + invoke-static { v1 }, ${LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR}->hideYouMayLikeSection(Ljava/lang/String;)Z + move-result v1 + + # If the setting is disabled or the typed string is not empty, do nothing. + if-eqz v1, :ignore + + ## Get a collection of search suggestions. + iget-object v1, v0, $searchSuggestionCollectionField + + # Iterate through the collection and check if the search suggestion is the search history. + invoke-interface { v1 }, Ljava/util/Collection;->iterator()Ljava/util/Iterator; + move-result-object v2 + + :loop + invoke-interface { v2 }, Ljava/util/Iterator;->hasNext()Z + move-result v3 + if-eqz v3, :exit + invoke-interface { v2 }, Ljava/util/Iterator;->next()Ljava/lang/Object; + move-result-object v3 + instance-of v4, v3, $searchSuggestionEndpointClass + if-eqz v4, :loop + check-cast v3, $searchSuggestionEndpointClass + + # Each search suggestion has a command endpoint. + # If the search suggestion is the search history, the command includes the keyword '/delete'. + iget-object v4, v3, $searchSuggestionEndpointField + invoke-static { v3, v4 }, ${LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR}->isSearchHistory(Ljava/lang/Object;Ljava/lang/String;)Z + move-result v3 + + # If this search suggestion is the search history, do nothing. + if-nez v3, :loop + + # If this search suggestion is not the search history, remove it from the search suggestions collection. + invoke-interface { v2 }, Ljava/util/Iterator;->remove()V + goto :loop + + # Save the updated collection to a field. + :exit + iput-object v1, v0, $searchSuggestionCollectionField + + :ignore + return-void + """ + ) + }.also(it.classDef.methods::add) + + addInstruction( + 0, + "invoke-direct/range { p0 .. p1 }, $helperMethod" + ) + } + } + } + + // endregion + + // region Hide flyout menu items + + bottomSheetMenuItemBuilderMethodMatch.let { + it.method.apply { + val index = it[1] + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, ${LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR}->hideFlyoutMenu(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$register + """ + ) + } + } + + contextualMenuItemBuilderMethodMatch.let { + it.method.apply { + val index = it[1] + val targetInstruction = getInstruction(index) + + addInstruction( + index + 1, + "invoke-static { v${targetInstruction.registerC}, v${targetInstruction.registerD} }, " + + "${LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR}->hideFlyoutMenu(Landroid/widget/TextView;Ljava/lang/CharSequence;)V" + ) + } + } + + // endregion + + // region Hide channel tab + + channelTabRendererMethod.apply { + val iteratorIndex = indexOfFirstInstructionReversedOrThrow { + methodReference?.name == "hasNext" + } + + val iteratorRegister = getInstruction(iteratorIndex).registerC + val targetIndex = indexOfFirstInstructionReversedOrThrow { + val reference = methodReference + + opcode == Opcode.INVOKE_INTERFACE && + reference?.returnType == channelTabBuilderMethod.returnType && + reference.parameterTypes == channelTabBuilderMethod.parameterTypes + } + + val objectIndex = indexOfFirstInstructionReversedOrThrow( + targetIndex, + Opcode.IGET_OBJECT + ) + val objectInstruction = getInstruction(objectIndex) + val objectReference = getInstruction(objectIndex).reference + + addInstructionsWithLabels( + objectIndex + 1, + """ + invoke-static { v${objectInstruction.registerA} }, ${LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR}->hideChannelTab(Ljava/lang/String;)Z + move-result v${objectInstruction.registerA} + if-eqz v${objectInstruction.registerA}, :ignore + invoke-interface { v$iteratorRegister }, Ljava/util/Iterator;->remove()V + goto :next_iterator + :ignore + iget-object v${objectInstruction.registerA}, v${objectInstruction.registerB}, $objectReference + """, + ExternalLabel("next_iterator", getInstruction(iteratorIndex)) + ) + } + + // endregion } + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index d42b037990..ad8a320178 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -47,10 +47,12 @@ val hideInfoCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -61,21 +63,21 @@ val hideInfoCardsPatch = bytecodePatch( SwitchPreference("revanced_hide_info_cards"), ) - // Edit: This old non litho code may be obsolete and no longer used by any supported versions. + // Edit: This old non-litho code may be obsolete and no longer used by any supported versions. infocardsIncognitoParentMethod.immutableClassDef.getInfocardsIncognitoMethod().apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && - ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") + ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") } addInstruction( invokeInstructionIndex, "invoke-static {v${getInstruction(invokeInstructionIndex).registerC}}," + - " Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V", + " Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V", ) } - // Edit: This old non litho code may be obsolete and no longer used by any supported versions. + // Edit: This old non-litho code may be obsolete and no longer used by any supported versions. infocardsMethodCallMethodMatch.let { val invokeInterfaceIndex = it[-1] it.method.apply { @@ -97,7 +99,8 @@ val hideInfoCardsPatch = bytecodePatch( } // Info cards can also appear as Litho components. - val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/litho/HideInfoCardsFilter;" + val filterClassDescriptor = + "Lapp/revanced/extension/youtube/patches/litho/HideInfoCardsFilter;" addLithoFilter(filterClassDescriptor) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenu/HidePlayerFlyoutMenuPatch.kt similarity index 90% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenu/HidePlayerFlyoutMenuPatch.kt index 9fae036084..abbe5f023d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenu/HidePlayerFlyoutMenuPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.hide.player.flyoutmenupanel +package app.revanced.patches.youtube.layout.hide.player.flyoutmenu import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources @@ -25,15 +25,18 @@ val hidePlayerFlyoutMenuItemsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { - val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter;" + val filterClassDescriptor = + "Lapp/revanced/extension/youtube/patches/litho/PlayerFlyoutMenuItemsFilter;" addResources("youtube", "layout.hide.player.flyoutmenupanel.hidePlayerFlyoutMenuPatch") @@ -42,24 +45,24 @@ val hidePlayerFlyoutMenuItemsPatch = bytecodePatch( key = "revanced_hide_player_flyout", preferences = setOf( SwitchPreference("revanced_hide_player_flyout_captions"), - SwitchPreference("revanced_hide_player_flyout_additional_settings"), - SwitchPreference("revanced_hide_player_flyout_loop_video"), - SwitchPreference("revanced_hide_player_flyout_ambient_mode"), - SwitchPreference("revanced_hide_player_flyout_stable_volume"), SwitchPreference("revanced_hide_player_flyout_listen_with_youtube_music"), SwitchPreference("revanced_hide_player_flyout_help"), SwitchPreference("revanced_hide_player_flyout_speed"), SwitchPreference("revanced_hide_player_flyout_lock_screen"), SwitchPreference( key = "revanced_hide_player_flyout_audio_track", - tag = "app.revanced.extension.youtube.settings.preference.HideAudioFlyoutMenuPreference", + tag = "app.revanced.extension.youtube.settings.preference.HideAudioFlyoutMenuPreference" ), - SwitchPreference("revanced_hide_player_flyout_watch_in_vr"), - SwitchPreference("revanced_hide_player_flyout_sleep_timer"), SwitchPreference("revanced_hide_player_flyout_video_quality"), SwitchPreference("revanced_hide_player_flyout_video_quality_footer"), + SwitchPreference("revanced_hide_player_flyout_additional_settings"), + SwitchPreference("revanced_hide_player_flyout_ambient_mode"), + SwitchPreference("revanced_hide_player_flyout_stable_volume"), + SwitchPreference("revanced_hide_player_flyout_loop_video"), + SwitchPreference("revanced_hide_player_flyout_sleep_timer"), + SwitchPreference("revanced_hide_player_flyout_watch_in_vr"), ), - ), + ) ) addLithoFilter(filterClassDescriptor) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt similarity index 78% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt index 6e952f4461..dfebabb2f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.panels.popup +package app.revanced.patches.youtube.layout.hide.player.popup import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch @@ -8,8 +8,10 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.getEngagementPanelControllerMethodMatch -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;" @Suppress("unused") val disablePlayerPopupPanelsPatch = bytecodePatch( @@ -24,10 +26,12 @@ val disablePlayerPopupPanelsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -38,7 +42,7 @@ val disablePlayerPopupPanelsPatch = bytecodePatch( SwitchPreference("revanced_hide_player_popup_panels"), ) - engagementPanelControllerMethod.addInstructionsWithLabels( + getEngagementPanelControllerMethodMatch().method.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disablePlayerPopupPanels()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt index ad93bc6060..3ebbb974f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt @@ -30,10 +30,12 @@ val hideRelatedVideoOverlayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 0372dfb2e0..7700ff0a57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -30,10 +30,12 @@ val disableRollingNumberAnimationsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index 8915cac958..d730022f92 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -7,6 +7,21 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef +internal val BytecodePatchContext.componentContextParserMethod by gettingFirstImmutableMethodDeclaratively { + returnType("L") + instructions( + "Failed to parse Element proto."(), + "Cannot read theme key from model."() + ) +} + +context(_: BytecodePatchContext) +internal fun ClassDef.getTreeNodeResultListMethod() = firstMethodDeclaratively { + accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) + returnType("Ljava/util/List;") + instructions(allOf(Opcode.INVOKE_STATIC(), method("nCopies"))) +} + internal val BytecodePatchContext.shortsBottomBarContainerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") @@ -19,9 +34,6 @@ internal val BytecodePatchContext.shortsBottomBarContainerMethodMatch by composi ) } -/** - * 19.41 to 20.44. - */ context(_: BytecodePatchContext) internal fun ClassDef.getRenderBottomNavigationBarMethodMatch() = firstMethodDeclaratively { @@ -34,10 +46,10 @@ internal fun ClassDef.getRenderBottomNavigationBarMethodMatch() = firstMethodDec after(Opcode.IF_EQZ()), after(Opcode.INVOKE_INTERFACE()), Opcode.MONITOR_EXIT(), - after(Opcode.RETURN_VOID()), - after(Opcode.MOVE_EXCEPTION()), - after(Opcode.MONITOR_EXIT()), - after(Opcode.THROW()), + Opcode.RETURN_VOID(), + Opcode.MOVE_EXCEPTION(), + Opcode.MONITOR_EXIT(), + Opcode.THROW() ) } @@ -59,8 +71,7 @@ internal val BytecodePatchContext.legacyRenderBottomNavigationBarLegacyParentMet } /** - * Identical to [legacyRenderBottomNavigationBarLegacyParentMethod] - * except this has an extra parameter. + * 19.41 - 20.44 */ internal val BytecodePatchContext.renderBottomNavigationBarLegacy1941ParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -78,6 +89,9 @@ internal val BytecodePatchContext.renderBottomNavigationBarLegacy1941ParentMetho ) } +/** + * 20.45+ + */ internal val BytecodePatchContext.renderBottomNavigationBarParentMethod by gettingFirstImmutableMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("[Ljava/lang/Class;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 632934da7b..08ae72ea1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -12,11 +12,13 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.music.shared.conversionContextToStringMethod import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.youtube.misc.engagement.engagementPanelHookPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch @@ -25,8 +27,6 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.* import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import java.util.logging.Logger internal val hideShortsAppShortcutOption = booleanOption( name = "Hide Shorts app shortcut", @@ -54,82 +54,65 @@ private val hideShortsComponentsResourcePatch = resourcePatch { addResources("youtube", "layout.hide.shorts.hideShortsComponentsResourcePatch") - val preferences = mutableSetOf( - // Shorts player components. - // Ideally each group should be ordered similar to how they appear in the UI - - // Vertical row of buttons on right side of the screen. - SwitchPreference("revanced_hide_shorts_like_fountain"), - SwitchPreference("revanced_hide_shorts_like_button"), - SwitchPreference("revanced_hide_shorts_dislike_button"), - ) - - if (is_20_22_or_greater) { - // FIXME: The buffer is very different for 20.22+ and these current cannot be hidden. - Logger.getLogger(this::class.java.name).warning( - "\n!!!" + - "\n!!! Shorts action buttons currently cannot be set hidden when patching 20.22+" + - "\n!!! Patch 20.21.37 or lower if you want to hide Shorts action buttons" + - "\n!!!", - ) - } else { - preferences.addAll( - listOf( - SwitchPreference("revanced_hide_shorts_comments_button"), - SwitchPreference("revanced_hide_shorts_share_button"), - SwitchPreference("revanced_hide_shorts_remix_button"), - SwitchPreference("revanced_hide_shorts_sound_button"), - ), - ) - } - - preferences.addAll( - listOf( - // Upper and middle area of the player. - SwitchPreference("revanced_hide_shorts_join_button"), - SwitchPreference("revanced_hide_shorts_subscribe_button"), - SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), - - // Suggested actions. - SwitchPreference("revanced_hide_shorts_preview_comment"), - SwitchPreference("revanced_hide_shorts_save_sound_button"), - SwitchPreference("revanced_hide_shorts_use_sound_button"), - SwitchPreference("revanced_hide_shorts_use_template_button"), - SwitchPreference("revanced_hide_shorts_upcoming_button"), - SwitchPreference("revanced_hide_shorts_effect_button"), - SwitchPreference("revanced_hide_shorts_green_screen_button"), - SwitchPreference("revanced_hide_shorts_hashtag_button"), - SwitchPreference("revanced_hide_shorts_live_preview"), - SwitchPreference("revanced_hide_shorts_new_posts_button"), - SwitchPreference("revanced_hide_shorts_shop_button"), - SwitchPreference("revanced_hide_shorts_tagged_products"), - SwitchPreference("revanced_hide_shorts_search_suggestions"), - SwitchPreference("revanced_hide_shorts_super_thanks_button"), - SwitchPreference("revanced_hide_shorts_stickers"), - - // Bottom of the screen. - SwitchPreference("revanced_hide_shorts_auto_dubbed_label"), - SwitchPreference("revanced_hide_shorts_location_label"), - SwitchPreference("revanced_hide_shorts_channel_bar"), - SwitchPreference("revanced_hide_shorts_info_panel"), - SwitchPreference("revanced_hide_shorts_full_video_link_label"), - SwitchPreference("revanced_hide_shorts_video_title"), - SwitchPreference("revanced_hide_shorts_sound_metadata_label"), - SwitchPreference("revanced_hide_shorts_navigation_bar"), - ), - ) - PreferenceScreen.SHORTS.addPreferences( + SwitchPreference("revanced_hide_shorts_channel"), SwitchPreference("revanced_hide_shorts_home"), SwitchPreference("revanced_hide_shorts_search"), SwitchPreference("revanced_hide_shorts_subscriptions"), + SwitchPreference("revanced_hide_shorts_video_description"), SwitchPreference("revanced_hide_shorts_history"), PreferenceScreenPreference( key = "revanced_shorts_player_screen", sorting = PreferenceScreenPreference.Sorting.UNSORTED, - preferences = preferences, - ), + preferences = setOf( + // Shorts player components. + // Ideally each group should be ordered similar to how they appear in the UI + + // Vertical row of buttons on right side of the screen. + // Like fountain may no longer be used by YT anymore. + //SwitchPreference("revanced_hide_shorts_like_fountain"), + SwitchPreference("revanced_hide_shorts_like_button"), + SwitchPreference("revanced_hide_shorts_dislike_button"), + SwitchPreference("revanced_hide_shorts_comments_button"), + SwitchPreference("revanced_hide_shorts_share_button"), + SwitchPreference("revanced_hide_shorts_remix_button"), + SwitchPreference("revanced_hide_shorts_sound_button"), + + // Upper and middle area of the player. + SwitchPreference("revanced_hide_shorts_join_button"), + SwitchPreference("revanced_hide_shorts_subscribe_button"), + SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), + + // Suggested actions. + SwitchPreference("revanced_hide_shorts_preview_comment"), + SwitchPreference("revanced_hide_shorts_save_sound_button"), + SwitchPreference("revanced_hide_shorts_use_sound_button"), + SwitchPreference("revanced_hide_shorts_use_template_button"), + SwitchPreference("revanced_hide_shorts_upcoming_button"), + SwitchPreference("revanced_hide_shorts_effect_button"), + SwitchPreference("revanced_hide_shorts_green_screen_button"), + SwitchPreference("revanced_hide_shorts_hashtag_button"), + SwitchPreference("revanced_hide_shorts_live_preview"), + SwitchPreference("revanced_hide_shorts_new_posts_button"), + SwitchPreference("revanced_hide_shorts_shop_button"), + SwitchPreference("revanced_hide_shorts_tagged_products"), + SwitchPreference("revanced_hide_shorts_search_suggestions"), + SwitchPreference("revanced_hide_shorts_super_thanks_button"), + SwitchPreference("revanced_hide_shorts_stickers"), + + // Bottom of the screen. + SwitchPreference("revanced_hide_shorts_ai_button"), + SwitchPreference("revanced_hide_shorts_auto_dubbed_label"), + SwitchPreference("revanced_hide_shorts_location_label"), + SwitchPreference("revanced_hide_shorts_channel_bar"), + SwitchPreference("revanced_hide_shorts_info_panel"), + SwitchPreference("revanced_hide_shorts_full_video_link_label"), + SwitchPreference("revanced_hide_shorts_video_title"), + SwitchPreference("revanced_hide_shorts_sound_metadata_label"), + SwitchPreference("revanced_hide_shorts_navigation_bar"), + ), + ) ) // Verify the file has the expected node, even if the patch option is off. @@ -157,28 +140,33 @@ private val hideShortsComponentsResourcePatch = resourcePatch { } } -private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/litho/ShortsFilter;" +private const val FILTER_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/litho/ShortsFilter;" @Suppress("unused") val hideShortsComponentsPatch = bytecodePatch( name = "Hide Shorts components", - description = "Adds options to hide components related to Shorts.", + description = "Adds options to hide components related to Shorts. " + + "Patching version 20.21.37 or lower can hide more Shorts player button types." ) { dependsOn( sharedExtensionPatch, lithoFilterPatch, hideShortsComponentsResourcePatch, resourceMappingPatch, + engagementPanelHookPatch, navigationBarHookPatch, versionCheckPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - // 20.22+ does not yet support hiding Shorts action buttons. + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -188,26 +176,66 @@ val hideShortsComponentsPatch = bytecodePatch( apply { addLithoFilter(FILTER_CLASS_DESCRIPTOR) + // region Hide sound button. + val id = ResourceType.DIMEN["reel_player_right_pivot_v2_size"] - forEachInstructionAsSequence({ _, method, instruction, index -> - if (instruction.wideLiteral != id) return@forEachInstructionAsSequence null + if (!is_21_05_or_greater) { + forEachInstructionAsSequence({ _, method, instruction, index -> + if (instruction.wideLiteral != id) return@forEachInstructionAsSequence null - val targetIndex = method.indexOfFirstInstructionOrThrow(index) { - methodReference?.name == "getDimensionPixelSize" - } + 1 + val targetIndex = method.indexOfFirstInstructionOrThrow(index) { + methodReference?.name == "getDimensionPixelSize" + } + 1 - val sizeRegister = method.getInstruction(targetIndex).registerA + val sizeRegister = method.getInstruction(targetIndex).registerA - return@forEachInstructionAsSequence targetIndex to sizeRegister - }) { method, (targetIndex, sizeRegister) -> - firstMethod(method).addInstructions( - targetIndex + 1, - """ + return@forEachInstructionAsSequence targetIndex to sizeRegister + }) { method, (targetIndex, sizeRegister) -> + firstMethod(method).addInstructions( + targetIndex + 1, + """ invoke-static { v$sizeRegister }, $FILTER_CLASS_DESCRIPTOR->getSoundButtonSize(I)I move-result v$sizeRegister """, - ) + ) + } + } + + // endregion + + // region Hide action buttons. + + if (is_20_22_or_greater) { + componentContextParserMethod.immutableClassDef.getTreeNodeResultListMethod().apply { + val conversionContextPathBuilderField = + conversionContextToStringMethod.immutableClassDef + .fields.single { field -> field.type == "Ljava/lang/StringBuilder;" } + + val insertIndex = implementation!!.instructions.lastIndex + val listRegister = getInstruction(insertIndex).registerA + + val registerProvider = getFreeRegisterProvider(insertIndex, 2) + val freeRegister = registerProvider.getFreeRegister() + val pathRegister = registerProvider.getFreeRegister() + + addInstructionsAtControlFlowLabel( + insertIndex, + """ + move-object/from16 v$freeRegister, p2 + + # In YouTube 20.41 field is the abstract superclass. + # Verify it's the expected subclass just in case. + instance-of v$pathRegister, v$freeRegister, ${conversionContextToStringMethod.immutableClassDef} + if-eqz v$pathRegister, :ignore + + iget-object v$pathRegister, v$freeRegister, $conversionContextPathBuilderField + invoke-static { v$pathRegister, v$listRegister }, ${FILTER_CLASS_DESCRIPTOR}->hideActionButtons(Ljava/lang/StringBuilder;Ljava/util/List;)V + :ignore + nop + """ + ) + } } // endregion @@ -262,7 +290,7 @@ val hideShortsComponentsPatch = bytecodePatch( // region Disable experimental Shorts flags. // Flags might be present in earlier targets, but they are not found in 19.47.53. - // If these flags are forced on, the experimental layout is still not used and + // If these flags are forced on, the experimental layout is still not used, and // it appears the features requires additional server side data to fully use. if (is_20_07_or_greater) { // Experimental Shorts player uses Android native buttons and not Litho, @@ -274,7 +302,7 @@ val hideShortsComponentsPatch = bytecodePatch( shortsExperimentalPlayerFeatureFlagMethod.returnLate(false) // Experimental UI renderer must also be disabled since it requires the - // experimental Shorts player. If this is enabled but Shorts player + // experimental Shorts player. If this is enabled but Shorts player // is disabled then the app crashes when the Shorts player is opened. renderNextUIFeatureFlagMethod.returnLate(false) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTVPopupPatch.kt similarity index 83% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTVPopupPatch.kt index bd5d5eb64f..6195af9f4e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTVPopupPatch.kt @@ -11,7 +11,7 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch;" + "Lapp/revanced/extension/youtube/patches/DisableSignInToTVPopupPatch;" @Suppress("unused") val disableSignInToTVPopupPatch = bytecodePatch( @@ -27,24 +27,26 @@ val disableSignInToTVPopupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { - addResources("youtube", "layout.hide.signintotv.disableSignInToTvPopupPatch") + addResources("youtube", "layout.hide.signintotv.disableSignInToTVPopupPatch") PreferenceScreen.MISC.addPreferences( - SwitchPreference("revanced_disable_signin_to_tv_popup"), + SwitchPreference("revanced_disable_sign_in_to_tv_popup"), ) - signInToTvPopupMethod.addInstructionsWithLabels( + signInToTVPopupMethod.addInstructionsWithLabels( 0, """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSignInToTvPopup()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSignInToTVPopup()Z move-result v0 if-eqz v0, :allow_sign_in_popup const/4 v0, 0x0 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt index fa3846fdb4..6a549c950f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -internal val BytecodePatchContext.signInToTvPopupMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.signInToTVPopupMethod by gettingFirstMethodDeclaratively { returnType("Z") parameterTypes("Ljava/lang/String;", "Z", "L") instructions(ResourceType.STRING("mdx_seamless_tv_sign_in_drawer_fragment_title")) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 24b240232f..b9ae184e0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -9,7 +9,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideTimestampPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/HideTimestampPatch;" @Suppress("unused") val hideTimestampPatch = bytecodePatch( @@ -24,10 +25,12 @@ val hideTimestampPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 796a308636..210af8b85e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -12,8 +12,10 @@ import com.android.tools.smali.dexlib2.iface.ClassDef internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L -// In later targets this feature flag does nothing and is dead code. -internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L +internal const val MINIPLAYER_MODERN_TYPE_1_FEATURE_KEY = 45623000L +internal const val MINIPLAYER_MODERN_TYPE_2_FEATURE_KEY = 45623273L +internal const val MINIPLAYER_MODERN_TYPE_3_FEATURE_KEY = 45623076L +internal const val MINIPLAYER_MODERN_TYPE_4_FEATURE_KEY = 45674402L internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L internal const val MINIPLAYER_DRAG_DROP_FEATURE_KEY = 45628752L internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L @@ -21,11 +23,13 @@ internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L +// In later targets this feature flag does nothing and is dead code. +internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L internal val BytecodePatchContext.miniplayerModernConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( - 45623000L(), // Magic number found in the constructor. + MINIPLAYER_MODERN_TYPE_1_FEATURE_KEY(), ) } @@ -148,8 +152,14 @@ internal val BytecodePatchContext.miniplayerMinimumSizeMethodMatch by composingF accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.DIMEN("miniplayer_max_size"), - 192L(), // Default miniplayer width constant. - 128L(), // Default miniplayer height constant. + anyOf( // Default miniplayer width constant. + 192L(), + 192.0f.toRawBits().toLong()(), // 21.03+ + ), + anyOf( // Default miniplayer height constant. + 128L(), + 128.0f.toRawBits().toLong()(), // 21.03+ + ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index a2effc6a04..0ef561d714 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -53,13 +53,15 @@ private val miniplayerResourcePatch = resourcePatch { // Only required for exactly 19.16 if (!is_19_17_or_greater) { - ytOutlinePictureInPictureWhite24 = ResourceType.DRAWABLE["yt_outline_picture_in_picture_white_24"] + ytOutlinePictureInPictureWhite24 = + ResourceType.DRAWABLE["yt_outline_picture_in_picture_white_24"] ytOutlineXWhite24 = ResourceType.DRAWABLE["yt_outline_x_white_24"] } } } -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/MiniplayerPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/MiniplayerPatch;" @Suppress("unused") val miniplayerPatch = bytecodePatch( @@ -75,10 +77,12 @@ val miniplayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -143,7 +147,10 @@ val miniplayerPatch = bytecodePatch( } if (is_19_26_or_greater) { - preferences += TextPreference("revanced_miniplayer_width_dip", inputType = InputType.NUMBER) + preferences += TextPreference( + "revanced_miniplayer_width_dip", + inputType = InputType.NUMBER + ) } preferences += TextPreference("revanced_miniplayer_opacity", inputType = InputType.NUMBER) @@ -167,7 +174,8 @@ val miniplayerPatch = bytecodePatch( ) } - fun Method.findReturnIndicesReversed() = findInstructionIndicesReversedOrThrow(Opcode.RETURN) + fun Method.findReturnIndicesReversed() = + findInstructionIndicesReversedOrThrow(Opcode.RETURN) /** * Adds an override to force legacy tablet miniplayer to be used or not used. @@ -227,11 +235,12 @@ val miniplayerPatch = bytecodePatch( // Parts of the YT code is removed in 20.37+ and the legacy player no longer works. if (!is_20_37_or_greater) { - miniplayerDimensionsCalculatorParentMethod.immutableClassDef.getMiniplayerOverrideNoContextMethod().apply { - findReturnIndicesReversed().forEach { index -> - insertLegacyTabletMiniplayerOverride(index) + miniplayerDimensionsCalculatorParentMethod.immutableClassDef.getMiniplayerOverrideNoContextMethod() + .apply { + findReturnIndicesReversed().forEach { index -> + insertLegacyTabletMiniplayerOverride(index) + } } - } // endregion @@ -265,7 +274,11 @@ val miniplayerPatch = bytecodePatch( insertModernMiniplayerTypeOverride(iPutIndex) } else { - findReturnIndicesReversed().forEach { index -> insertModernMiniplayerOverride(index) } + findReturnIndicesReversed().forEach { index -> + insertModernMiniplayerOverride( + index + ) + } } } } @@ -355,17 +368,23 @@ val miniplayerPatch = bytecodePatch( // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. if (!is_19_17_or_greater) { - miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernExpandCloseDrawablesMethod().apply { - listOf( - ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, - ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, - ).forEach { (originalResource, replacementResource) -> - val imageResourceIndex = indexOfFirstLiteralInstructionOrThrow(originalResource) - val register = getInstruction(imageResourceIndex).registerA + miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernExpandCloseDrawablesMethod() + .apply { + listOf( + ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, + ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, + ).forEach { (originalResource, replacementResource) -> + val imageResourceIndex = + indexOfFirstLiteralInstructionOrThrow(originalResource) + val register = + getInstruction(imageResourceIndex).registerA - replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") + replaceInstruction( + imageResourceIndex, + "const v$register, $replacementResource" + ) + } } - } } // endregion @@ -377,7 +396,7 @@ val miniplayerPatch = bytecodePatch( findInstructionIndicesReversedOrThrow { val reference = getReference() opcode == Opcode.INVOKE_INTERFACE && - reference?.returnType == "Z" && reference.parameterTypes.isEmpty() + reference?.returnType == "Z" && reference.parameterTypes.isEmpty() }.forEach { index -> val register = getInstruction(index + 1).registerA @@ -417,11 +436,12 @@ val miniplayerPatch = bytecodePatch( } } - miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernAddViewListenerMethod().addInstruction( - 0, - "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "hideMiniplayerSubTexts(Landroid/view/View;)V", - ) + miniplayerModernViewParentMethod.immutableClassDef.getMiniplayerModernAddViewListenerMethod() + .addInstruction( + 0, + "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + + "hideMiniplayerSubTexts(Landroid/view/View;)V", + ) // Modern 2 has a broken overlay subtitle view that is always present. // Modern 2 uses the same overlay controls as the regular video player, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt deleted file mode 100644 index 28c218d9d1..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.youtube.layout.panels.popup - -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType - -internal val BytecodePatchContext.engagementPanelControllerMethod by gettingFirstMethodDeclaratively( - "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", - "[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called.", -) { - returnType("L") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 9f04df3c06..236a6c05fe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.layout.player.fullscreen +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -9,10 +10,9 @@ import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.playerStatusMethod import app.revanced.patches.youtube.video.information.videoInformationPatch -import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode @Suppress("unused") @@ -22,10 +22,12 @@ val exitFullscreenPatch = bytecodePatch( ) { compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -51,13 +53,15 @@ val exitFullscreenPatch = bytecodePatch( ListPreference("revanced_exit_fullscreen"), ) - videoEndMethod.apply { - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN_VOID) + playerStatusMethod.apply { + // +1 to ensure inserted after the loop logic added by the "Loop video" patch. + val insertIndex = indexOfFirstInstructionOrThrow(Opcode.SGET_OBJECT) + 1 - addInstructionsAtControlFlowLabel( + addInstruction( insertIndex, - "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", - ) + "invoke-static/range { p1 .. p1 }, " + + "$EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached(Ljava/lang/Enum;)V", + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 5f53f6cb7a..1828079230 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -36,7 +36,7 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { // Remove A/B feature call that forces what this patch already does. // Cannot use the A/B flag to accomplish the same goal because 19.50+ // Shorts fullscreen regular player does not use fullscreen - // if the player is minimized and it must be forced using other conditional check. + // if the player is minimized, and it must be forced using other conditional check. it.method.insertLiteralOverride( it[-1], false, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt index c1a70e42d4..79f044a6e7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt @@ -21,12 +21,13 @@ val openVideosFullscreenPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", - "19.43.41", "19.47.53", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index 4bb4c275d0..d4dd999ef5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -28,10 +28,12 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -45,12 +47,13 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( createPlayerOverviewMethodMatch.let { it.method.apply { val viewRegisterIndex = it[-1] - val viewRegister = getInstruction(viewRegisterIndex).registerA + val viewRegister = + getInstruction(viewRegisterIndex).registerA addInstruction( viewRegisterIndex + 1, "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", + "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index 7588c8d899..470cad9cb2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike import app.revanced.patcher.* import app.revanced.patcher.extensions.instructions +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -70,7 +71,8 @@ internal val BytecodePatchContext.rollingNumberSetterMethodMatch by composingFir Opcode.IGET_OBJECT, ) - val match = indexedMatcher("RollingNumberType required properties missing! Need"(String::contains)) + val match = + indexedMatcher("RollingNumberType required properties missing! Need"(String::contains)) custom { match(instructions) } } @@ -88,15 +90,17 @@ internal val BytecodePatchContext.rollingNumberTextViewMethod by gettingFirstMet ) custom { immutableClassDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || immutableClassDef.superclass == - "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" + "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" } } internal val BytecodePatchContext.textComponentConstructorMethod by gettingFirstImmutableMethodDeclaratively { - accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) - instructions( - "TextComponent"(), - ) + custom { + // 20.23+ is public. + // 20.22 and lower is private. + AccessFlags.CONSTRUCTOR.isSet(accessFlags) + } + instructions("TextComponent"()) } internal val BytecodePatchContext.textComponentDataMethod by gettingFirstImmutableMethodDeclaratively { @@ -119,9 +123,35 @@ internal fun ClassDef.getTextComponentLookupMethod() = firstMethodDeclaratively instructions("…"()) } -internal val BytecodePatchContext.textComponentFeatureFlagMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.textComponentFeatureFlagMethodMatch by composingFirstMethod { accessFlags(AccessFlags.FINAL) returnType("Z") parameterTypes() instructions(45675738L()) } + + +internal val BytecodePatchContext.lithoSpannableStringCreationMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) + returnType("V") + parameterTypes("L", "Ljava/lang/Object;", "L") + instructions( + allOf(Opcode.NEW_INSTANCE(), type("Landroid/text/SpannableString;")), + afterAtMost( + 5, + method { + toString() == "Landroid/text/SpannableString;->(Ljava/lang/CharSequence;)V" + } + ), + afterAtMost( + 5, + method { + toString() == "Landroid/text/SpannableString;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;" + } + ), + method { + name == "addOnLayoutChangeListener" && parameterTypes.size == 1 && + parameterTypes.first() == $$"Landroid/view/View$OnLayoutChangeListener;" + } + ) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index bb81a31c0c..b216bcb201 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -27,15 +27,15 @@ import app.revanced.patches.youtube.video.videoid.hookPlayerResponseVideoId import app.revanced.patches.youtube.video.videoid.hookVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.cloneMutableAndPreserveParameters import app.revanced.util.findFreeRegister import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.returnLate +import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch;" @@ -60,11 +60,12 @@ val returnYouTubeDislikePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", - // 20.40+ does not support yet support the Shorts player. + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -95,7 +96,7 @@ val returnYouTubeDislikePatch = bytecodePatch( hookVideoId("$EXTENSION_CLASS_DESCRIPTOR->newVideoLoaded(Ljava/lang/String;)V") - // Hook the player response video id, to start loading RYD sooner in the background. + // Hook the player response video ID, to start loading RYD sooner in the background. hookPlayerResponseVideoId("$EXTENSION_CLASS_DESCRIPTOR->preloadVideoId(Ljava/lang/String;Z)V") // endregion @@ -111,8 +112,8 @@ val returnYouTubeDislikePatch = bytecodePatch( 0, """ const/4 v0, ${vote.value} - invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->sendVote(I)V - """, + invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->sendVote(I)V + """ ) } @@ -126,94 +127,115 @@ val returnYouTubeDislikePatch = bytecodePatch( // Find the field name of the conversion context. val conversionContextClass = conversionContextToStringMethod.immutableClassDef - val textComponentConversionContextField = textComponentConstructorMethod.immutableClassDef.fields.find { - it.type == conversionContextClass.type || - // 20.41+ uses superclass field type. - it.type == conversionContextClass.superclass - } ?: throw PatchException("Could not find conversion context field") + val textComponentConversionContextField = + textComponentConstructorMethod.immutableClassDef.fields.find { + it.type == conversionContextClass.type || + // 20.41+ uses superclass field type. + it.type == conversionContextClass.superclass + } ?: throw PatchException("Could not find conversion context field") - textComponentConstructorMethod.immutableClassDef.getTextComponentLookupMethod().apply { - // Find the instruction for creating the text data object. - val textDataClassType = textComponentDataMethod.immutableClassDef.type + val conversionContextPathBuilderField = conversionContextToStringMethod.immutableClassDef + .fields.single { field -> field.type == "Ljava/lang/StringBuilder;" } - val insertIndex: Int - val charSequenceRegister: Int + // Old pre 20.40 and lower hook. + // 21.05 clobbers p0 (this) register. + // Add additional registers so all parameters including p0 are free to use anywhere in the method. + textComponentConstructorMethod.immutableClassDef + .getTextComponentLookupMethod() + .cloneMutableAndPreserveParameters().apply { + // Find the instruction for creating the text data object. + val textDataClassType = textComponentDataMethod.immutableClassDef.type - if (is_19_33_or_greater && !is_20_10_or_greater) { - val index = indexOfFirstInstructionOrThrow { - (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) && - methodReference?.returnType == textDataClassType + val insertIndex: Int + val charSequenceRegister: Int + + if (is_19_33_or_greater && !is_20_10_or_greater) { + val index = indexOfFirstInstructionOrThrow { + (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) && + methodReference?.returnType == textDataClassType + } + + insertIndex = indexOfFirstInstructionOrThrow(index) { + opcode == Opcode.INVOKE_VIRTUAL && + methodReference?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" + } + + charSequenceRegister = + getInstruction(insertIndex).registerD + } else { + insertIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.NEW_INSTANCE && + typeReference?.type == textDataClassType + } + + val charSequenceIndex = indexOfFirstInstructionOrThrow(insertIndex) { + opcode == Opcode.IPUT_OBJECT && + fieldReference?.type == "Ljava/lang/CharSequence;" + } + charSequenceRegister = + getInstruction(charSequenceIndex).registerA } - insertIndex = indexOfFirstInstructionOrThrow(index) { - opcode == Opcode.INVOKE_VIRTUAL && - methodReference?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" - } + val conversionContext = findFreeRegister(insertIndex, charSequenceRegister) - charSequenceRegister = getInstruction(insertIndex).registerD - } else { - insertIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.NEW_INSTANCE && - typeReference?.type == textDataClassType - } - - val charSequenceIndex = indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.IPUT_OBJECT && - fieldReference?.type == "Ljava/lang/CharSequence;" - } - charSequenceRegister = getInstruction(charSequenceIndex).registerA - } - - val conversionContext = findFreeRegister(insertIndex, charSequenceRegister) - - addInstructionsAtControlFlowLabel( - insertIndex, - """ + addInstructionsAtControlFlowLabel( + insertIndex, + """ # Copy conversion context. move-object/from16 v$conversionContext, p0 - iget-object v$conversionContext, v$conversionContext, $textComponentConversionContextField - invoke-static { v$conversionContext, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$charSequenceRegister :ignore nop """ - ) + ) + } + + // Hook new litho text creation code. + if (is_20_07_or_greater) { + textComponentFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useNewLithoTextCreation(Z)Z" + ) + } + + lithoSpannableStringCreationMethodMatch.let { + val conversionContextField = it.immutableClassDef.type + + "->" + textComponentConversionContextField.name + + ":" + textComponentConversionContextField.type + + it.method.apply { + val insertIndex = it[1] + val charSequenceRegister = + getInstruction(insertIndex).registerD + val conversionContextPathRegister = + findFreeRegister(insertIndex, charSequenceRegister) + + addInstructions( + insertIndex, + """ + move-object/from16 v$conversionContextPathRegister, p0 + iget-object v$conversionContextPathRegister, v$conversionContextPathRegister, $conversionContextField + iget-object v$conversionContextPathRegister, v$conversionContextPathRegister, $conversionContextPathBuilderField + invoke-static { v$conversionContextPathRegister, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$charSequenceRegister + """ + ) + } + } } // endregion // region Hook Shorts - // Filter that parses the video id from the UI + // Filter that parses the video ID from the UI addLithoFilter(FILTER_CLASS_DESCRIPTOR) - if (is_20_07_or_greater) { - // Turn off a/b flag that enables new code for creating litho spans. - // If enabled then the litho text span hook is never called. - // Target code is very obfuscated and exactly what the code does is not clear. - // Return late so debug patch logs if the flag is enabled. - if (is_20_41_or_greater) { - // TODO: Support the new non litho Shorts layout. - // Turning off this flag on later versions can break the Shorts overlay and nothing is shown. - Logger.getLogger(this::class.java.name).warning( - "\n!!!" + - "\n!!! Dislikes are not yet fully supported when patching YouTube 20.40+" + - "\n!!! Patch 20.21.37 or lower if you want to see dislikes" + - "\n!!!", - ) - - Logger.getLogger(this::class.java.name).warning( - "20.40+ Shorts player is not fully supported yet. Shorts Dislikes may not show.", - ) - } else { - textComponentFeatureFlagMethod.returnLate(false) - } - } - - // Player response video id is needed to search for the video ids in Shorts litho components. + // Player response video ID is needed to search for the video IDs in Shorts litho components. hookPlayerResponseVideoId("$FILTER_CLASS_DESCRIPTOR->newPlayerResponseVideoId(Ljava/lang/String;Z)V") // endregion @@ -224,17 +246,22 @@ val returnYouTubeDislikePatch = bytecodePatch( val insertIndex = 1 val dislikesIndex = rollingNumberSetterMethodMatch[-1] val charSequenceInstanceRegister = getInstruction(0).registerA - val charSequenceFieldReference = getInstruction(dislikesIndex).reference + val charSequenceFieldReference = + getInstruction(dislikesIndex).reference val conversionContextRegister = implementation!!.registerCount - parameters.size + 1 - val freeRegister = findFreeRegister(insertIndex, charSequenceInstanceRegister, conversionContextRegister) + val freeRegister = findFreeRegister( + insertIndex, + charSequenceInstanceRegister, + conversionContextRegister + ) addInstructions( insertIndex, """ iget-object v$freeRegister, v$charSequenceInstanceRegister, $charSequenceFieldReference - invoke-static {v$conversionContextRegister, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberLoaded(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String; + invoke-static { v$conversionContextRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberLoaded(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String; move-result-object v$freeRegister iput-object v$freeRegister, v$charSequenceInstanceRegister, $charSequenceFieldReference """, @@ -249,12 +276,13 @@ val returnYouTubeDislikePatch = bytecodePatch( val endIndex = it[-1] it.method.apply { - val measuredTextWidthRegister = getInstruction(endIndex).registerA + val measuredTextWidthRegister = + getInstruction(endIndex).registerA addInstructions( endIndex + 1, """ - invoke-static {p1, v$measuredTextWidthRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F + invoke-static { p1, v$measuredTextWidthRegister }, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F move-result v$measuredTextWidthRegister """, ) @@ -272,7 +300,7 @@ val returnYouTubeDislikePatch = bytecodePatch( measureTextIndex + 1, """ move-result v$freeRegister - invoke-static {p1, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F + invoke-static { p1, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F """, ) } @@ -292,13 +320,15 @@ val returnYouTubeDislikePatch = bytecodePatch( methodReference?.name == "setText" } - val textViewRegister = getInstruction(setTextIndex).registerC - val textSpanRegister = getInstruction(setTextIndex).registerD + val textViewRegister = + getInstruction(setTextIndex).registerC + val textSpanRegister = + getInstruction(setTextIndex).registerD addInstructions( setTextIndex, """ - invoke-static {v$textViewRegister, v$textSpanRegister}, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + invoke-static { v$textViewRegister, v$textSpanRegister }, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$textSpanRegister """, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt deleted file mode 100644 index e7748db661..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt +++ /dev/null @@ -1,34 +0,0 @@ -package app.revanced.patches.youtube.layout.searchbar - -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively -import app.revanced.patcher.gettingFirstMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.parameterTypes -import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType -import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewMethod -import com.android.tools.smali.dexlib2.AccessFlags - -internal val BytecodePatchContext.setWordmarkHeaderMethod by gettingFirstImmutableMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("V") - parameterTypes("Landroid/widget/ImageView;") - instructions( - ResourceType.ATTR("ytPremiumWordmarkHeader"), - ResourceType.ATTR("ytWordmarkHeader"), - ) -} - -/** - * Matches the same method as [yoodlesImageViewMethod]. - */ -internal val BytecodePatchContext.wideSearchbarLayoutMethod by gettingFirstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("Landroid/view/View;") - parameterTypes("L", "L") - instructions( - ResourceType.LAYOUT("action_bar_ringo"), - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt deleted file mode 100644 index 9ac4138abd..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ /dev/null @@ -1,105 +0,0 @@ -package app.revanced.patches.youtube.layout.searchbar - -import app.revanced.patcher.extensions.addInstruction -import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.findInstructionIndicesReversedOrThrow -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import java.util.logging.Logger - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/WideSearchbarPatch;" - -@Suppress("unused") -val wideSearchBarPatch = bytecodePatch( - name = "Wide search bar", - description = "Adds an option to replace the search icon with a wide search bar. " + - "This will hide the YouTube logo when active.", -) { - dependsOn( - sharedExtensionPatch, - settingsPatch, - addResourcesPatch, - resourceMappingPatch, - versionCheckPatch, - ) - - compatibleWith( - "com.google.android.youtube"( - "19.43.41", - "20.14.43", - "20.21.37", - // 20.31.40+ not supported. YouTube code was removed. - ), - ) - - apply { - if (is_20_31_or_greater) { - // YT removed the legacy text search text field all code required to use it. - // This functionality could be restored by adding a search text field to the toolbar - // with a listener that artificially clicks the toolbar search button. - return@apply Logger.getLogger(this::class.java.name).warning( - "Wide searchbar is not compatible with 20.31+", - ) - } - - addResources("youtube", "layout.searchbar.wideSearchbarPatch") - - PreferenceScreen.FEED.addPreferences( - SwitchPreference("revanced_wide_searchbar"), - ) - - // Navigate to the method that checks if the YT logo is shown beside the search bar. - val shouldShowLogoMethod = with(setWordmarkHeaderMethod) { - val invokeStaticIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_STATIC && - getReference()?.returnType == "Z" - } - navigate(this).to(invokeStaticIndex).stop() - } - - shouldShowLogoMethod.apply { - findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> - val register = getInstruction(index).registerA - - addInstructionsAtControlFlowLabel( - index, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->enableWideSearchbar(Z)Z - move-result v$register - """, - ) - } - } - - // Fix missing left padding when using wide searchbar. - wideSearchbarLayoutMethod.apply { - findInstructionIndicesReversedOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/view/LayoutInflater;" && - reference.name == "inflate" - }.forEach { inflateIndex -> - val register = getInstruction(inflateIndex + 1).registerA - - addInstruction( - inflateIndex + 2, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setActionBar(Landroid/view/View;)V", - ) - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 63cb2e0f1f..832e2ee57b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -112,7 +112,7 @@ internal val BytecodePatchContext.lottieAnimationViewSetAnimationIntMethod by ge parameterTypes("I") returnType("V") - lateinit var methodDefiningClass: String + var methodDefiningClass = "" custom { methodDefiningClass = definingClass true diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 9a67e0491c..801fc83880 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -14,6 +14,7 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_21_02_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod import app.revanced.util.findInstructionIndicesReversedOrThrow @@ -152,7 +153,7 @@ val seekbarColorPatch = bytecodePatch( return@apply // 19.25 does not have a cairo launch animation. } - // Hook the splash animation to set the a seekbar color. + // Hook the splash animation to set the seekbar color. mainActivityOnCreateMethod.apply { val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntMethod.name @@ -208,7 +209,7 @@ val seekbarColorPatch = bytecodePatch( factoryStreamReturnType = it.returnType } - val lottieAnimationViewSetAnimationStreamMethod = firstMethodDeclaratively { + val lottieAnimationViewSetAnimationStreamMethod = firstImmutableMethodDeclaratively { definingClass(lottieAnimationViewSetAnimationIntMethod.immutableClassDef.type) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes(factoryStreamReturnType.toString()) @@ -230,13 +231,17 @@ val seekbarColorPatch = bytecodePatch( null, MutableMethodImplementation(4), ).toMutable().apply { + // 21.02+ method is private. Cannot easily change the access flags to public + // because that breaks unrelated opcode that uses invoke-direct and not invoke-virtual. + val methodOpcode = if (is_21_02_or_greater) "invoke-direct" else "invoke-virtual" + addInstructions( """ - invoke-static { p1, p2 }, $factoryStreamClass->$factoryStreamName(Ljava/io/InputStream;Ljava/lang/String;)$factoryStreamReturnType - move-result-object v0 - invoke-virtual { p0, v0}, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationStreamMethodName($factoryStreamReturnType)V - return-void - """, + invoke-static { p1, p2 }, $factoryStreamClass->$factoryStreamName(Ljava/io/InputStream;Ljava/lang/String;)$factoryStreamReturnType + move-result-object v0 + $methodOpcode { p0, v0}, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationStreamMethodName($factoryStreamReturnType)V + return-void + """ ) }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt index f6b30c4650..507c7c2af8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt @@ -19,7 +19,6 @@ internal val BytecodePatchContext.reelEnumConstructorMethodMatch by composingFir internal val BytecodePatchContext.reelPlaybackRepeatParentMethod by gettingFirstImmutableMethodDeclaratively { returnType("V") - parameterTypes("Ljava/lang/String;", "J") instructions( "Reels[%s] Playback Time: %d ms"(), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index 988529db90..63fa21a216 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -32,7 +32,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ShortsAutoplayPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/ShortsAutoplayPatch;" @Suppress("ObjectPropertyName") val shortsAutoplayPatch = bytecodePatch( @@ -48,10 +49,12 @@ val shortsAutoplayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -90,15 +93,16 @@ val shortsAutoplayPatch = bytecodePatch( ) } - val reelPlaybackRepeatMethod = reelPlaybackRepeatParentMethod.immutableClassDef.getReelPlaybackRepeatMethod() + val reelPlaybackRepeatMethod = + reelPlaybackRepeatParentMethod.immutableClassDef.getReelPlaybackRepeatMethod() reelPlaybackRepeatMethod.apply { // The behavior enums are looked up from an ordinal value to an enum type. findInstructionIndicesReversedOrThrow { val reference = getReference() reference?.definingClass == reelEnumClass && - reference.parameterTypes.firstOrNull() == "I" && - reference.returnType == reelEnumClass + reference.parameterTypes.firstOrNull() == "I" && + reference.returnType == reelEnumClass }.forEach { index -> val register = getInstruction(index + 1).registerA @@ -125,14 +129,15 @@ val shortsAutoplayPatch = bytecodePatch( // Find the first call modified by extension code above. val extensionReturnResultIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_STATIC && - getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR + getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR } + 1 - val enumRegister = getInstruction(extensionReturnResultIndex).registerA + val enumRegister = + getInstruction(extensionReturnResultIndex).registerA val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.IGET_OBJECT && - reference?.definingClass == definingClass && - reference.type == reelSequenceControllerMethodReference.definingClass + reference?.definingClass == definingClass && + reference.type == reelSequenceControllerMethodReference.definingClass } val getReelSequenceControllerReference = getInstruction(getReelSequenceControllerIndex).reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 7fb5ae1ca0..96f2b56032 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -4,80 +4,13 @@ import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -/** - * Purpose of this method is not clear, and it's only used to identify - * the obfuscated name of the videoId() method in PlaybackStartDescriptor. - * 20.38 and lower. - */ -internal val BytecodePatchContext.playbackStartFeatureFlagMethodMatch by composingFirstMethod { - returnType("Z") - parameterTypes("Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;") - instructions( - method { - definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" && - returnType == "Ljava/lang/String;" - }, - 45380134L(), - ) -} - -/** - * Purpose of this method is not entirely clear, and it's only used to identify - * the obfuscated name of the videoId() method in PlaybackStartDescriptor. - * 20.39+ - */ -internal val BytecodePatchContext.watchPanelVideoIdMethodMatch by composingFirstMethod { - returnType("Ljava/lang/String;") - parameterTypes() - instructions( - allOf( - Opcode.IGET_OBJECT(), - field { type == "Lcom/google/android/apps/youtube/app/common/player/queue/WatchPanelId;" }, - ), - allOf( - Opcode.CHECK_CAST(), - type("Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;"), - ), - method { - definingClass == "Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;" && - returnType == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" - }, - method { - definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" && - returnType == "Ljava/lang/String;" - }, - - ) -} - -// Pre 19.25 -internal val BytecodePatchContext.shortsPlaybackIntentLegacyMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("V") - parameterTypes( - "L", - "Ljava/util/Map;", - "J", - "Ljava/lang/String;", - "Z", - "Ljava/util/Map;", - ) - instructions( - method { returnType == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" }, - // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags"(), - "ReelWatchFragmentArgs"(), - "reels_fragment_descriptor"(), - ) -} +// 19.25+ internal val BytecodePatchContext.shortsPlaybackIntentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returnType("V") parameterTypes( - "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", + "L", "Ljava/util/Map;", "J", "Ljava/lang/String;", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 9b115730b4..518902cab2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -1,9 +1,13 @@ package app.revanced.patches.youtube.layout.shortsplayer +import app.revanced.util.findFreeRegister +import app.revanced.util.registersUsed +import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -12,18 +16,20 @@ import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscreenHookPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater +import app.revanced.patches.youtube.misc.playservice.is_21_07_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateMethod -import app.revanced.util.findFreeRegister +import app.revanced.patches.youtube.video.information.playbackStartDescriptorToStringMethodMatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = @@ -46,10 +52,12 @@ val openShortsInRegularPlayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -64,78 +72,129 @@ val openShortsInRegularPlayerPatch = bytecodePatch( mainActivityOnCreateMethod.addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "setMainActivity(Landroid/app/Activity;)V", + "setMainActivity(Landroid/app/Activity;)V", ) - // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val (videoIdStartMethod, videoIdIndex) = if (is_20_39_or_greater) { - watchPanelVideoIdMethodMatch.let { - it.immutableMethod to it[-1] - } - } else { - playbackStartFeatureFlagMethodMatch.let { - it.immutableMethod to it[0] - } - } - val playbackStartVideoIdMethodName = navigate(videoIdStartMethod).to(videoIdIndex).stop().name - fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = + val playbackStartVideoIdMethod = playbackStartDescriptorToStringMethodMatch.let { + navigate(it.method).to(it[1]).original() + } + + shortsPlaybackIntentMethod.addInstructionsWithLabels( + 0, """ - invoke-virtual { v$playbackStartRegister }, Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;->$playbackStartVideoIdMethodName()Ljava/lang/String; - move-result-object v$freeRegister - invoke-static { v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->openShort(Ljava/lang/String;)Z - move-result v$freeRegister - if-eqz v$freeRegister, :disabled + move-object/from16 v0, p1 + + invoke-virtual { v0 }, $playbackStartVideoIdMethod + move-result-object v1 + invoke-static { v1 }, ${EXTENSION_CLASS_DESCRIPTOR}->openShort(Ljava/lang/String;)Z + move-result v1 + if-eqz v1, :disabled return-void :disabled nop """ - - if (is_19_25_or_greater) { - shortsPlaybackIntentMethod.addInstructionsWithLabels( - 0, - """ - move-object/from16 v0, p1 - ${extensionInstructions(0, 1)} - """, - ) - } else { - shortsPlaybackIntentLegacyMethodMatch.let { - it.method.apply { - val index = it[0] - val playbackStartRegister = getInstruction(index + 1).registerA - val insertIndex = index + 2 - val freeRegister = findFreeRegister(insertIndex, playbackStartRegister) - - addInstructionsWithLabels( - insertIndex, - extensionInstructions(playbackStartRegister, freeRegister), - ) - } - } - } + ) // Fix issue with back button exiting the app instead of minimizing the player. // Without this change this issue can be difficult to reproduce, but seems to occur // most often with 'open video in regular player' and not open in fullscreen player. exitVideoPlayerMethod.apply { + // TODO: Check if this logic works for older app targets as well. + if (is_21_07_or_greater) { + findInstructionIndicesReversedOrThrow { + val methodReference = methodReference + methodReference?.name == "finish" && methodReference.parameterTypes.isEmpty() + }.forEach { index -> + val returnIndex = indexOfFirstInstructionOrThrow( + index, Opcode.RETURN_VOID + ) + + if (returnIndex == this.implementation!!.instructions.lastIndex) { + val freeRegister = findFreeRegister(index) + + // Jumps to last index + addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->overrideBackPressToExit()Z + move-result v$freeRegister + if-eqz v$freeRegister, :doNotCallActivityFinish + return-void + :doNotCallActivityFinish + nop + """ + ) + } else { + // Must check free register after the return index. + val freeRegister = findFreeRegister(returnIndex + 1) + + addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->overrideBackPressToExit()Z + move-result v$freeRegister + if-eqz v$freeRegister, :doNotCallActivityFinish + """, ExternalLabel( + "doNotCallActivityFinish", + getInstruction(returnIndex + 1) + ) + ) + } + } + return@apply + } + + // Method call for Activity.finish() - val finishIndex = indexOfFirstInstructionOrThrow { + val finishIndexFirst = indexOfFirstInstructionOrThrow { val reference = getReference() reference?.name == "finish" } - // Index of PlayerType.isWatchWhileMaximizedOrFullscreen() - val index = indexOfFirstInstructionReversedOrThrow(finishIndex, Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA + // Second Activity.finish() call. Has been present since 19.x but started + // to interfere with back to exit fullscreen around 20.47. + val finishIndexSecond = indexOfFirstInstruction(finishIndexFirst + 1) { + val reference = getReference() + reference?.name == "finish" + } + val getBooleanFieldIndex = indexOfFirstInstructionReversedOrThrow(finishIndexSecond) { + opcode == Opcode.IGET_BOOLEAN + } + val booleanRegister = + getInstruction(getBooleanFieldIndex).registerA addInstructions( - index + 1, + getBooleanFieldIndex + 1, """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->overrideBackPressToExit(Z)Z - move-result v$register + invoke-static { v$booleanRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->overrideBackPressToExit(Z)Z + move-result v$booleanRegister + """ + ) + + // Surround first activity.finish() and return-void with conditional check. + val returnVoidIndex = indexOfFirstInstructionOrThrow( + finishIndexFirst, Opcode.RETURN_VOID + ) + // Find free register using index after return void (new control flow path added below). + val freeRegister = findFreeRegister( + returnVoidIndex + 1, + // Exclude all registers used by only instruction we will skip over. + getInstruction(finishIndexFirst).registersUsed + ) + + addInstructionsAtControlFlowLabel( + finishIndexFirst, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->overrideBackPressToExit()Z + move-result v$freeRegister + if-eqz v$freeRegister, :doNotCallActivityFinish """, + ExternalLabel( + "doNotCallActivityFinish", + getInstruction(returnVoidIndex + 1) + ) ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index d17441dea9..41c049d821 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -129,10 +129,12 @@ val sponsorBlockPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -145,7 +147,7 @@ val sponsorBlockPatch = bytecodePatch( hookBackgroundPlayVideoId( EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR + - "->setCurrentVideoId(Ljava/lang/String;)V", + "->setCurrentVideoId(Ljava/lang/String;)V", ) // Set seekbar draw rectangle. @@ -157,7 +159,8 @@ val sponsorBlockPatch = bytecodePatch( ) { getReference()?.type == "Landroid/graphics/Rect;" } - rectangleFieldName = getInstruction(rectangleIndex).reference as FieldReference + rectangleFieldName = + getInstruction(rectangleIndex).reference as FieldReference } } @@ -169,11 +172,12 @@ val sponsorBlockPatch = bytecodePatch( it.method.apply { // Set seekbar thickness. val thicknessIndex = it[-1] - val thicknessRegister = getInstruction(thicknessIndex).registerA + val thicknessRegister = + getInstruction(thicknessIndex).registerA addInstruction( thicknessIndex + 1, "invoke-static { v$thicknessRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarThickness(I)V", + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarThickness(I)V", ) // Find the drawCircle call and draw the segment before it. @@ -187,8 +191,8 @@ val sponsorBlockPatch = bytecodePatch( addInstruction( drawCircleIndex, "invoke-static { v$canvasInstanceRegister, v$centerYRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + - "drawSegmentTimeBars(Landroid/graphics/Canvas;F)V", + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + + "drawSegmentTimeBars(Landroid/graphics/Canvas;F)V", ) // Set seekbar bounds. @@ -234,7 +238,8 @@ val sponsorBlockPatch = bytecodePatch( val checkCastIndex = it[-1] it.method.apply { - val frameLayoutRegister = getInstruction(checkCastIndex).registerA + val frameLayoutRegister = + getInstruction(checkCastIndex).registerA addInstruction( checkCastIndex + 1, "invoke-static {v$frameLayoutRegister}, $EXTENSION_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V", @@ -244,7 +249,8 @@ val sponsorBlockPatch = bytecodePatch( adProgressTextViewVisibilityMethodMatch.let { val setVisibilityIndex = it[0] - val register = it.method.getInstruction(setVisibilityIndex).registerD + val register = + it.method.getInstruction(setVisibilityIndex).registerD it.method.addInstructionsAtControlFlowLabel( setVisibilityIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt index 2d316f7623..d7842649a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt @@ -6,21 +6,6 @@ import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val BytecodePatchContext.toolBarButtonMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("V") - instructions( - ResourceType.ID("menu_item_view"), - allOf(Opcode.INVOKE_INTERFACE(), method { returnType == "I" }), - after(Opcode.MOVE_RESULT()), - afterAtMost(6, allOf(Opcode.IGET_OBJECT(), field { type == "Landroid/widget/ImageView;" })), - afterAtMost(8, method { name == "getDrawable" && definingClass == "Landroid/content/res/Resources;" }), - afterAtMost(4, method { name == "setImageDrawable" && definingClass == "Landroid/widget/ImageView;" }), - ) - // 20.37+ has second parameter of "Landroid/content/Context;" - custom { parameterTypes.count() in 1..2 && parameterTypes.first() == "Landroid/view/MenuItem;" } -} - internal val BytecodePatchContext.spoofAppVersionMethodMatch by composingFirstMethod( // Instead of applying a bytecode patch, it might be possible to only rely on code from the extension and // manually set the desired version string as this keyed value in the SharedPreferences. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index cb9259325f..f55cab1921 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -18,16 +18,16 @@ import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.getToolBarButtonMethodMatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofAppVersionPatch;" -@Suppress("ObjectPropertyName") val spoofAppVersionPatch = bytecodePatch( name = "Spoof app version", description = "Adds an option to trick YouTube into thinking you are running an older version of the app. " + - "This can be used to restore old UI elements and features.", + "This can be used to restore old UI elements and features.", ) { dependsOn( resourceMappingPatch, @@ -39,10 +39,12 @@ val spoofAppVersionPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -82,9 +84,11 @@ val spoofAppVersionPatch = bytecodePatch( * missing image resources. As a workaround, do not set an image in the * toolbar when the enum name is UNKNOWN. */ - toolBarButtonMethodMatch.let { + // Method is shared and indexes may no longer be correct. + getToolBarButtonMethodMatch().let { val imageResourceIndex = it[2] - val register = it.method.getInstruction(imageResourceIndex).registerA + val register = + it.method.getInstruction(imageResourceIndex).registerA val jumpIndex = it[-1] + 1 it.method.addInstructionsWithLabels( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index ec86e1d561..c2d47290db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -15,7 +15,8 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeStartPagePatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/ChangeStartPagePatch;" @Suppress("unused") val changeStartPagePatch = bytecodePatch( @@ -30,10 +31,12 @@ val changeStartPagePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -59,7 +62,8 @@ val changeStartPagePatch = bytecodePatch( browseIdMethodMatch.let { it.method.apply { val browseIdIndex = it[0] - val browseIdRegister = getInstruction(browseIdIndex).registerA + val browseIdRegister = + getInstruction(browseIdIndex).registerA addInstructions( browseIdIndex + 1, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index 6c172b1513..66b5350244 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -11,7 +11,7 @@ internal val BytecodePatchContext.intentActionMethod by gettingFirstMethodDeclar } internal val BytecodePatchContext.browseIdMethodMatch by composingFirstMethod { - returnType("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") + returnType("L") // parameterTypes() // 20.30 and earlier is no parameters. 20.31+ parameter is L. instructions( "FEwhat_to_watch"(), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 3b8023f26c..c727aa8267 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -8,6 +8,7 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_20_03_or_greater +import app.revanced.patches.youtube.misc.playservice.is_21_03_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -36,14 +37,22 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + // This patch is obsolete with 21.03 because YT seems to have + // removed resuming Shorts functionality. + // TODO: Before adding 21.03+, merge this patch into `Hide Shorts component` ), ) apply { + // 21.03+ seems to no longer have resuming Shorts functionality. + if (is_21_03_or_greater) return@apply + addResources("youtube", "layout.startupshortsreset.disableResumingShortsOnStartupPatch") PreferenceScreen.SHORTS.addPreferences( @@ -69,8 +78,8 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( userWasInShortsLegacyMethod.apply { val listenableInstructionIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_INTERFACE && - getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - getReference()?.name == "isDone" + getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + getReference()?.name == "isDone" } val freeRegister = findFreeRegister(listenableInstructionIndex) @@ -83,7 +92,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( return-void :show_startup_shorts_player nop - """, + """ ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index c89783668c..b14b0d7b19 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE +import com.android.tools.smali.dexlib2.Opcode internal val BytecodePatchContext.useGradientLoadingScreenMethodMatch by composingFirstMethod { instructions(45412406L()) @@ -20,3 +21,56 @@ internal val BytecodePatchContext.splashScreenStyleMethodMatch by composingFirst ), ) } + + +/** + * Matches to the same method as [splashScreenStyleMethodMatch]. + */ +internal val BytecodePatchContext.showSplashScreen1MethodMatch by composingFirstMethod { + name("onCreate") + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) + returnType("V") + parameterTypes("Landroid/os/Bundle;") + instructions( + anyOf(Opcode.CONST_4(), Opcode.CONST_16()), + afterAtMost( + 20, + method { + returnType == "V" && + parameterTypes.size == 2 && + parameterTypes[0].startsWith("L") && + parameterTypes[1] == "Ljava/lang/Runnable;" + + + }, + ), + afterAtMost(10, Opcode.APUT_OBJECT()), + afterAtMost( + 5, + method { returnType == "V" && parameterTypes.size == 1 && parameterTypes[0].startsWith("[L") }, + ), + after(Opcode.IGET_OBJECT()), + after(method { returnType == "I" && parameterTypes.isEmpty() }), + after(Opcode.MOVE_RESULT()), + after(method { returnType == "Z" && parameterTypes.size == 1 && parameterTypes[0] == "I" }), + after(Opcode.MOVE_RESULT()), + ) +} + +/** + * Matches to the same method as [splashScreenStyleMethodMatch]. + */ +internal val BytecodePatchContext.showSplashScreen2MethodMatch by composingFirstMethod { + name("onCreate") + definingClass(YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE) + returnType("V") + parameterTypes("Landroid/os/Bundle;") + instructions( + allOf( + Opcode.INVOKE_VIRTUAL(), + method { returnType == "V" && parameterTypes.size == 1 && parameterTypes[0].startsWith("[L") } + ), + Opcode.IF_NE(), + method { toString() == "Landroid/graphics/drawable/AnimatedVectorDrawable;->start()V" } + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index dad35b727a..f1d4fb2cc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -1,11 +1,16 @@ package app.revanced.patches.youtube.layout.theme + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.layout.theme.THEME_COLOR_OPTION_DESCRIPTION +import app.revanced.patches.shared.layout.theme.THEME_DEFAULT_DARK_COLOR_NAMES +import app.revanced.patches.shared.layout.theme.THEME_DEFAULT_LIGHT_COLOR_NAMES import app.revanced.patches.shared.layout.theme.baseThemePatch import app.revanced.patches.shared.layout.theme.baseThemeResourcePatch import app.revanced.patches.shared.layout.theme.darkThemeBackgroundColorOption @@ -20,13 +25,19 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.is_21_06_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.forEachChildElement import app.revanced.util.insertLiteralOverride +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import org.w3c.dom.Element -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/theme/ThemePatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/theme/ThemePatch;" val themePatch = baseThemePatch( extensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR, @@ -147,18 +158,44 @@ val themePatch = baseThemePatch( settingsPatch, addResourcesPatch, seekbarColorPatch, + versionCheckPatch, baseThemeResourcePatch( lightColorReplacement = { lightThemeBackgroundColor!! }, + getDarkColorNames = { + THEME_DEFAULT_DARK_COLOR_NAMES + if (is_21_06_or_greater) + setOf( + // yt_ref_color_constants_baseline_black_black0 + "yt_sys_color_baseline_dark_menu_background", + // yt_ref_color_constants_baseline_black_black1 + "yt_sys_color_baseline_dark_static_black", + "yt_sys_color_baseline_dark_raised_background", + // yt_ref_color_constants_baseline_black_black3 + "yt_sys_color_baseline_dark_base_background", + "yt_sys_color_baseline_dark_static_black", + "yt_sys_color_baseline_light_inverted_background", + "yt_sys_color_baseline_light_static_black", + ) else emptySet() + }, + getLightColorNames = { + THEME_DEFAULT_LIGHT_COLOR_NAMES + if (is_21_06_or_greater) + setOf( + "yt_sys_color_baseline_light_base_background", + "yt_sys_color_baseline_light_raised_background" + ) + else emptySet() + } ), themeResourcePatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) }, @@ -211,5 +248,39 @@ val themePatch = baseThemePatch( "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I", ) } + + showSplashScreen1MethodMatch.let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA + + addInstructions( + index + 1, + """ + invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->showSplashScreen(Z)Z + move-result v$register + """ + ) + } + } + + if (is_20_02_or_greater) { + showSplashScreen2MethodMatch.let { + val insertIndex = it[1] + it.method.apply { + val insertInstruction = getInstruction(insertIndex) + val registerA = insertInstruction.registerA + val registerB = insertInstruction.registerB + + addInstructions( + insertIndex, + """ + invoke-static { v$registerA, v$registerB }, ${EXTENSION_CLASS_DESCRIPTOR}->showSplashScreen(II)I + move-result v$registerA + """ + ) + } + } + } }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index bc4c213cf0..6051aa2e79 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -8,10 +8,10 @@ import app.revanced.patches.shared.misc.settings.preference.NonInteractivePrefer import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.imageurlhook.addImageUrlErrorCallbackHook -import app.revanced.patches.youtube.misc.imageurlhook.addImageUrlHook -import app.revanced.patches.youtube.misc.imageurlhook.addImageUrlSuccessCallbackHook -import app.revanced.patches.youtube.misc.imageurlhook.cronetImageUrlHookPatch +import app.revanced.patches.youtube.misc.imageurlhook.addImageURLErrorCallbackHook +import app.revanced.patches.youtube.misc.imageurlhook.addImageURLHook +import app.revanced.patches.youtube.misc.imageurlhook.addImageURLSuccessCallbackHook +import app.revanced.patches.youtube.misc.imageurlhook.cronetImageURLHookPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -29,15 +29,17 @@ val alternativeThumbnailsPatch = bytecodePatch( settingsPatch, addResourcesPatch, navigationBarHookPatch, - cronetImageUrlHookPatch, + cronetImageURLHookPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -85,8 +87,8 @@ val alternativeThumbnailsPatch = bytecodePatch( ListPreference("revanced_alt_thumbnail_stills_time"), ) - addImageUrlHook(EXTENSION_CLASS_DESCRIPTOR) - addImageUrlSuccessCallbackHook(EXTENSION_CLASS_DESCRIPTOR) - addImageUrlErrorCallbackHook(EXTENSION_CLASS_DESCRIPTOR) + addImageURLHook(EXTENSION_CLASS_DESCRIPTOR) + addImageURLSuccessCallbackHook(EXTENSION_CLASS_DESCRIPTOR) + addImageURLErrorCallbackHook(EXTENSION_CLASS_DESCRIPTOR) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt index 566a9069c2..e785fcf199 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.imageurlhook.addImageUrlHook -import app.revanced.patches.youtube.misc.imageurlhook.cronetImageUrlHookPatch +import app.revanced.patches.youtube.misc.imageurlhook.addImageURLHook +import app.revanced.patches.youtube.misc.imageurlhook.cronetImageURLHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -17,21 +17,23 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val bypassImageRegionRestrictionsPatch = bytecodePatch( name = "Bypass image region restrictions", description = "Adds an option to use a different host for user avatar and channel images " + - "and can fix missing images that are blocked in some countries.", + "and can fix missing images that are blocked in some countries.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, - cronetImageUrlHookPatch, + cronetImageURLHookPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -42,8 +44,8 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch( SwitchPreference("revanced_bypass_image_region_restrictions"), ) - // A priority hook is not needed, as the image urls of interest are not modified + // A priority hook is not needed, as the image URLs of interest are not modified // by AlternativeThumbnails or any other patch in this repo. - addImageUrlHook(EXTENSION_CLASS_DESCRIPTOR) + addImageURLHook(EXTENSION_CLASS_DESCRIPTOR) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/Fingerprints.kt new file mode 100644 index 0000000000..22360b5c41 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/Fingerprints.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.layout.toolbar + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags + +internal val BytecodePatchContext.hookToolbarMethod by gettingFirstMethodDeclaratively { + name("hookToolbar") + definingClass(EXTENSION_CLASS_DESCRIPTOR) + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/ToolbarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/ToolbarHookPatch.kt new file mode 100644 index 0000000000..b01a440873 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/toolbar/ToolbarHookPatch.kt @@ -0,0 +1,74 @@ +package app.revanced.patches.youtube.layout.toolbar + +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.removeInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.shared.getToolBarButtonMethodMatch +import app.revanced.util.findFreeRegister +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ToolbarPatch;" + +internal lateinit var hookToolbar: (descriptor: String)-> Unit + +val toolbarHookPatch = bytecodePatch { + dependsOn( + sharedExtensionPatch, + resourceMappingPatch + ) + + apply { + fun indexOfGetDrawableInstruction(method: Method) = + method.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.toString() == "Landroid/content/res/Resources;->getDrawable(I)Landroid/graphics/drawable/Drawable;" + } + + getToolBarButtonMethodMatch().method.apply { + val getDrawableIndex = indexOfGetDrawableInstruction(this) + val enumOrdinalIndex = indexOfFirstInstructionReversedOrThrow(getDrawableIndex) { + opcode == Opcode.INVOKE_INTERFACE && + getReference()?.returnType == "I" + } + val replaceReference = getInstruction(enumOrdinalIndex).reference + val replaceRegister = getInstruction(enumOrdinalIndex).registerC + val enumRegister = getInstruction(enumOrdinalIndex).registerD + val insertIndex = enumOrdinalIndex + 1 + val freeRegister = findFreeRegister(insertIndex, enumRegister, replaceRegister) + + val imageViewIndex = indexOfFirstInstructionOrThrow(enumOrdinalIndex) { + opcode == Opcode.IGET_OBJECT && fieldReference?.type == "Landroid/widget/ImageView;" + } + val imageViewReference = getInstruction(imageViewIndex).reference + + addInstructions( + insertIndex, + """ + iget-object v$freeRegister, p0, $imageViewReference + invoke-static {v$enumRegister, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->hookToolbar(Ljava/lang/Enum;Landroid/widget/ImageView;)V + invoke-interface {v$replaceRegister, v$enumRegister}, $replaceReference + """ + ) + removeInstruction(enumOrdinalIndex) + } + + hookToolbar = { descriptor -> + hookToolbarMethod.addInstructions( + 0, + "invoke-static {p0, p1}, $descriptor(Ljava/lang/String;Landroid/view/View;)V" + ) + } + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index e50b59c3d2..11b2729a0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -24,10 +24,12 @@ val announcementsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt index 22689c44ca..53cc5beca7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/audiofocus/PauseOnAudioInterruptPatch.kt @@ -27,6 +27,11 @@ val pauseOnAudioInterruptPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt index 6b39c04b5d..6f4944eaa4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -11,9 +11,11 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_29_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.backgroundPlaybackManagerShortsMethod import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode @@ -43,10 +45,12 @@ val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -57,7 +61,8 @@ val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( SwitchPreference("revanced_shorts_disable_background_playback"), ) - prefBackgroundAndOfflineCategoryId = ResourceType.STRING["pref_background_and_offline_category"] + prefBackgroundAndOfflineCategoryId = + ResourceType.STRING["pref_background_and_offline_category"] arrayOf( backgroundPlaybackManagerMethod to "isBackgroundPlaybackAllowed", @@ -72,7 +77,7 @@ val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$integrationsMethod(Z)Z move-result v$register - """, + """ ) } } @@ -106,5 +111,11 @@ val removeBackgroundPlaybackRestrictionsPatch = bytecodePatch( ) } } + + if (is_20_29_or_greater) { + // Client flag that interferes with background playback of some video types. + // Exact purpose is not clear and it's used in ~ 100 locations. + newPlayerTypeEnumFeatureFlagMethod.returnLate(false) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt index 64d6a26d2d..8f1c18ad8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt @@ -72,13 +72,6 @@ internal val BytecodePatchContext.kidsBackgroundPlaybackPolicyControllerMethod b literal { 5 } } -internal val BytecodePatchContext.backgroundPlaybackManagerShortsMethod by gettingFirstMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returnType("Z") - parameterTypes("L") - instructions(151635310L()) -} - internal val BytecodePatchContext.shortsBackgroundPlaybackFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") @@ -93,3 +86,7 @@ internal val BytecodePatchContext.pipInputConsumerFeatureFlagMethodMatch by comp 45638483L(), ) } + +internal val BytecodePatchContext.newPlayerTypeEnumFeatureFlagMethod by gettingFirstMethodDeclaratively { + instructions(45698813L()) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/ClientContextHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/ClientContextHookPatch.kt new file mode 100644 index 0000000000..ec82e4bdbe --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/ClientContextHookPatch.kt @@ -0,0 +1,177 @@ +package app.revanced.patches.youtube.misc.contexthook + +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable +import app.revanced.patcher.accessFlags +import app.revanced.patcher.classDef +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.returnType +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.cloneMutableAndPreserveParameters +import app.revanced.util.findInstructionIndicesReversedOrThrow +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod + +private lateinit var browseIdField: FieldReference +private lateinit var clientInfoField: FieldReference +private lateinit var clientVersionField: FieldReference +private lateinit var messageLiteBuilderField: FieldReference +private lateinit var messageLiteBuilderMethod: MethodReference +private lateinit var osNameField: FieldReference + +enum class Endpoint( + vararg val getEndpointMethods: BytecodePatchContext.() -> Method, + var instructions: String = "", +) { + BROWSE( + BytecodePatchContext::browseEndpointParentMethod::get + ), + GUIDE( + BytecodePatchContext::guideEndpointConstructorMethod::get + ), + REEL( + BytecodePatchContext::reelCreateItemsEndpointConstructorMethod::get, + BytecodePatchContext::reelItemWatchEndpointConstructorMethod::get, + BytecodePatchContext::reelWatchSequenceEndpointConstructorMethod::get, + ), + SEARCH(BytecodePatchContext::searchRequestBuildParametersMethod::get) +} + +val hookClientContextPatch = bytecodePatch( + description = "Hooks the context body of the endpoint.", +) { + dependsOn(sharedExtensionPatch) + + apply { + buildDummyClientContextBodyMethodMatch.let { + it.method.apply { + val clientInfoIndex = it[-1] + val clientVersionIndex = it[2] + val messageLiteBuilderIndex = it[0] + + clientInfoField = + getInstruction(clientInfoIndex).fieldReference!! + clientVersionField = + getInstruction(clientVersionIndex).fieldReference!! + messageLiteBuilderField = + getInstruction(messageLiteBuilderIndex).fieldReference!! + } + } + + authenticationChangeListenerMethod.apply { + val messageLiteBuilderIndex = + indexOfMessageLiteBuilderReference(this, messageLiteBuilderField.definingClass) + + messageLiteBuilderMethod = + getInstruction(messageLiteBuilderIndex).methodReference!! + } + + buildClientContextBodyConstructorMethod.immutableClassDef.buildClientContextBodyMethodMatch.let { + it.method.apply { + val osNameIndex = it[1] + + osNameField = + getInstruction(osNameIndex).fieldReference!! + } + } + + browseEndpointParentMethod.immutableClassDef.browseEndpointConstructorMethodMatch.let { + it.method.apply { + val browseIdIndex = it[-1] + browseIdField = + getInstruction(browseIdIndex).fieldReference!! + } + } + } + + afterDependents { + val helperMethodName = "patch_setClientContext" + + Endpoint.entries.filter { + it.instructions.isNotEmpty() + }.forEach { endpoint -> + endpoint.getEndpointMethods.forEach { getEndpointRequestBodyParentMethod -> + getEndpointRequestBodyParentMethod().immutableClassDef.firstMethodDeclaratively { + accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) + returnType("V") + parameterTypes() + }.cloneMutableAndPreserveParameters().let { + it.classDef.methods.add( + ImmutableMethod( + it.definingClass, + helperMethodName, + emptyList(), + "V", + AccessFlags.PRIVATE.value or AccessFlags.FINAL.value, + it.annotations, + null, + MutableMethodImplementation(5), + ).toMutable().apply { + addInstructionsWithLabels( + 0, + """ + invoke-virtual { p0 }, $messageLiteBuilderMethod + move-result-object v0 + iget-object v0, v0, $messageLiteBuilderField + check-cast v0, ${clientInfoField.definingClass} + iget-object v1, v0, $clientInfoField + if-eqz v1, :ignore + """ + endpoint.instructions + + """ + :ignore + return-void + """, + ) + } + ) + + it.findInstructionIndicesReversedOrThrow(Opcode.RETURN_VOID).forEach { index -> + it.addInstructionsAtControlFlowLabel( + index, + "invoke-direct/range { p0 .. p0 }, ${it.definingClass}->$helperMethodName()V" + ) + } + } + } + } + } +} + +fun addClientVersionHook(endPoint: Endpoint, descriptor: String) { + endPoint.instructions += if (endPoint == Endpoint.BROWSE) """ + iget-object v3, p0, $browseIdField + iget-object v2, v1, $clientVersionField + invoke-static { v3, v2 }, $descriptor + move-result-object v2 + iput-object v2, v1, $clientVersionField + """ else """ + iget-object v2, v1, $clientVersionField + invoke-static { v2 }, $descriptor + move-result-object v2 + iput-object v2, v1, $clientVersionField + """ +} + +fun addOSNameHook(endPoint: Endpoint, descriptor: String) { + endPoint.instructions += """ + iget-object v2, v1, $osNameField + invoke-static { v2 }, $descriptor + move-result-object v2 + iput-object v2, v1, $osNameField + """ +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/Fingerprints.kt new file mode 100644 index 0000000000..9c52762689 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/contexthook/Fingerprints.kt @@ -0,0 +1,153 @@ +package app.revanced.patches.youtube.misc.contexthook + +import app.revanced.patcher.ClassDefComposing +import app.revanced.patcher.accessFlags +import app.revanced.patcher.after +import app.revanced.patcher.afterAtMost +import app.revanced.patcher.allOf +import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.custom +import app.revanced.patcher.extensions.methodReference +import app.revanced.patcher.field +import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.method +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef +import com.android.tools.smali.dexlib2.iface.Method +import com.google.common.io.ByteArrayDataOutput + +internal const val CLIENT_INFO_CLASS_DESCRIPTOR = + $$"Lcom/google/protos/youtube/api/innertube/InnertubeContext$ClientInfo;" + +internal val BytecodePatchContext.authenticationChangeListenerMethod by gettingFirstMethodDeclaratively( + "Authentication changed while request was being made" +) { + accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) + returnType("V") + custom { indexOfMessageLiteBuilderReference(this) >= 0 } +} + +internal fun indexOfMessageLiteBuilderReference(method: Method, type: String = "L") = + method.indexOfFirstInstruction { + val reference = methodReference + opcode == Opcode.INVOKE_VIRTUAL && + reference?.parameterTypes?.isEmpty() == true && reference.returnType.startsWith(type) + } + +internal val BytecodePatchContext.buildClientContextBodyConstructorMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") + instructions( + "Android Wear"(), + Opcode.IF_EQZ(), + after("Android Automotive"()), + "Android"(), + after(allOf(Opcode.IPUT_OBJECT(), field())) + ) +} + +internal val ClassDef.buildClientContextBodyMethodMatch by ClassDefComposing.composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("L") + parameterTypes() + instructions( + allOf(Opcode.SGET(), field("SDK_INT")), + allOf( + Opcode.IPUT_OBJECT(), + field { definingClass == CLIENT_INFO_CLASS_DESCRIPTOR && type == "Ljava/lang/String;" } + ), + Opcode.OR_INT_LIT16() + ) +} + +internal val BytecodePatchContext.buildDummyClientContextBodyMethodMatch by composingFirstMethod { + instructions( + allOf( + Opcode.IGET_OBJECT(), + field("instance") + ), + afterAtMost(10, "10.29"()), + allOf( + Opcode.IPUT_OBJECT(), + field { definingClass == CLIENT_INFO_CLASS_DESCRIPTOR && type == "Ljava/lang/String;" } + ), + allOf( + Opcode.IPUT_OBJECT(), + field { type == CLIENT_INFO_CLASS_DESCRIPTOR } + ) + ) +} + +internal val ClassDef.browseEndpointConstructorMethodMatch by ClassDefComposing.composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") + + var methodDefiningClass = "" + custom { + methodDefiningClass = this.definingClass + true + } + + instructions( + ""(), + after( + allOf( + Opcode.IPUT_OBJECT(), + field { definingClass == methodDefiningClass && type == "Ljava/lang/String;" } + ) + ), + ) +} + +internal val BytecodePatchContext.browseEndpointParentMethod by gettingFirstImmutableMethodDeclaratively( + "browseId" +) { + returnType("Ljava/lang/String;") +} + +internal val BytecodePatchContext.guideEndpointConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "guide" +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") +} + +internal val BytecodePatchContext.reelCreateItemsEndpointConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "reel/create_reel_items" +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") +} + +internal val BytecodePatchContext.reelItemWatchEndpointConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "reel/reel_item_watch" +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") +} + +internal val BytecodePatchContext.reelWatchSequenceEndpointConstructorMethod by gettingFirstImmutableMethodDeclaratively( + "reel/reel_watch_sequence" +) { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") +} + +internal val BytecodePatchContext.searchRequestBuildParametersMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Ljava/lang/String;") + parameterTypes() + instructions( + "searchFormData"(), + after(allOf(Opcode.INVOKE_VIRTUAL(), method("toByteArray"))), + after(Opcode.MOVE_RESULT_OBJECT()) + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index 73e5f30e78..3ac32bd420 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -2,21 +2,35 @@ package app.revanced.patches.youtube.misc.debugging import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch; import app.revanced.patches.shared.misc.debugging.enableDebuggingPatch +import app.revanced.patches.youtube.misc.playservice.is_20_40_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_41_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @Suppress("unused") val enableDebuggingPatch = enableDebuggingPatch( - sharedExtensionPatch = sharedExtensionPatch, - settingsPatch = settingsPatch, - compatibleWithPackages = arrayOf( - "com.google.android.youtube" to setOf( - "19.43.41", - "20.14.43", - "20.21.37", - "20.31.40", + block = { + dependsOn( + sharedExtensionPatch, + settingsPatch, + versionCheckPatch ) - ), - hookStringFeatureFlag = true, + + compatibleWith( + "com.google.android.youtube"( + "20.14.43", + "20.21.37", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" + ) + ) + }, + hookStringFeatureFlag = { true }, + // 20.40 has changes not worth supporting. + hookLongFeatureFlag = { !is_20_40_or_greater || is_20_41_or_greater }, + hookDoubleFeatureFlag = { !is_20_40_or_greater || is_20_41_or_greater }, preferenceScreen = PreferenceScreen.MISC, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 934e2049bd..4b1381b280 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -27,10 +27,12 @@ val spoofDeviceDimensionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -42,19 +44,20 @@ val spoofDeviceDimensionsPatch = bytecodePatch( ) // Override the parameters containing the dimensions. - deviceDimensionsModelToStringMethod.classDef.methods.firstMethod { name == "" }.addInstructions( - 1, // Add after super call. - arrayOf( - 1 to "MinHeightOrWidth", // p1 = min height - 2 to "MaxHeightOrWidth", // p2 = max height - 3 to "MinHeightOrWidth", // p3 = min width - 4 to "MaxHeightOrWidth", // p4 = max width - ).map { (parameter, method) -> - """ + deviceDimensionsModelToStringMethod.classDef.methods.firstMethod { name == "" } + .addInstructions( + 1, // Add after super call. + arrayOf( + 1 to "MinHeightOrWidth", // p1 = min height + 2 to "MaxHeightOrWidth", // p2 = max height + 3 to "MinHeightOrWidth", // p3 = min width + 4 to "MaxHeightOrWidth", // p4 = max width + ).map { (parameter, method) -> + """ invoke-static { p$parameter }, $EXTENSION_CLASS_DESCRIPTOR->get$method(I)I move-result p$parameter """ - }.joinToString("\n") { it }, - ) + }.joinToString("\n") { it }, + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index 2824056d46..28125a0809 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -13,10 +13,12 @@ val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameReso compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/EngagementPanelHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/EngagementPanelHookPatch.kt new file mode 100644 index 0000000000..dc274c3b64 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/EngagementPanelHookPatch.kt @@ -0,0 +1,80 @@ +package app.revanced.patches.youtube.misc.engagement + +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.patcher.extensions.addInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.shared.getEngagementPanelControllerMethodMatch +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import kotlin.properties.Delegates + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/shared/EngagementPanel;" + +var panelControllerMethod: MutableMethod by Delegates.notNull() + private set +var panelIdIndex = 0 + private set +var panelIdRegister = 0 + private set +var panelIdSmaliInstruction = "" + private set + +val engagementPanelHookPatch = bytecodePatch( + description = "Hook to get the current engagement panel state.", +) { + dependsOn(sharedExtensionPatch) + + apply { + val match = getEngagementPanelControllerMethodMatch() + match.method.apply { + val panelIdField = getInstruction(match[-1]).fieldReference + val insertIndex = match[5] + + val (freeRegister, panelRegister) = + with(getInstruction(insertIndex)) { + Pair(registerA, registerB) + } + + panelControllerMethod = this + panelIdIndex = insertIndex + panelIdRegister = freeRegister + panelIdSmaliInstruction = + "iget-object v$panelIdRegister, v$panelRegister, $panelIdField" + + addInstructions( + insertIndex, + """ + $panelIdSmaliInstruction + invoke-static { v${panelIdRegister} }, ${EXTENSION_CLASS_DESCRIPTOR}->open(Ljava/lang/String;)V + """ + ) + } + + match.immutableClassDef.getEngagementPanelUpdateMethod().addInstruction( + 0, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->close()V" + ) + } +} + + +fun addEngagementPanelIdHook(descriptor: String) = panelControllerMethod.addInstructionsWithLabels( + panelIdIndex, + """ + $panelIdSmaliInstruction + invoke-static { v$panelIdRegister }, $descriptor + move-result v$panelIdRegister + if-eqz v$panelIdRegister, :shown + const/4 v$panelIdRegister, 0x0 + return-object v$panelIdRegister + :shown + nop + """ +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/Fingerprints.kt new file mode 100644 index 0000000000..2d199f62f6 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/engagement/Fingerprints.kt @@ -0,0 +1,22 @@ +package app.revanced.patches.youtube.misc.engagement + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.allOf +import app.revanced.patcher.field +import app.revanced.patcher.firstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef + +context(_: BytecodePatchContext) +internal fun ClassDef.getEngagementPanelUpdateMethod() = firstMethodDeclaratively { + accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) + returnType("V") + parameterTypes("L", "Z") + instructions(allOf(Opcode.IGET_OBJECT(), field { type == "Landroid/app/Activity;" })) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt index 6b07ea5bed..a1e094788a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt @@ -22,12 +22,12 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { // If the user recently changed their account password, // the app can show "You're offline. Check your internet connection." - // even when the internet is available. For this situation + // even when the internet is available. For this situation // YouTube + MicroG shows an offline error message. // // Change the error text to inform the user to uninstall and reinstall MicroG. // The user can also fix this by deleting the MicroG account but - // MicroG accounts look almost identical to Google device accounts + // MicroG accounts look almost identical to Google device accounts, // and it's more foolproof to instead uninstall/reinstall. arrayOf( specificNetworkErrorViewControllerMethodMatch, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt index 78ab4b951d..b434de2bbb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt @@ -18,8 +18,8 @@ internal val BytecodePatchContext.specificNetworkErrorViewControllerMethodMatch ) } -// It's not clear if this second class is ever used and it may be dead code, -// but it the layout image/text is identical to the network error match above. +// It's not clear if this second class is ever used, and it may be dead code, +// but it is the layout image/text is identical to the network error match above. internal val BytecodePatchContext.loadingFrameLayoutControllerMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index e745c28381..edeeb237f9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -36,10 +36,12 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( compatibleWith( YOUTUBE_PACKAGE_NAME( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt deleted file mode 100644 index 95f7b428e4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt +++ /dev/null @@ -1,69 +0,0 @@ -package app.revanced.patches.youtube.misc.hapticfeedback - -import app.revanced.patcher.extensions.ExternalLabel -import app.revanced.patcher.extensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.misc.settings.settingsPatch - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/DisableHapticFeedbackPatch;" - -@Suppress("unused") -val disableHapticFeedbackPatch = bytecodePatch( - name = "Disable haptic feedback", - description = "Adds an option to disable haptic feedback in the player for various actions.", -) { - dependsOn( - settingsPatch, - addResourcesPatch, - ) - - compatibleWith( - "com.google.android.youtube"( - "19.43.41", - "20.14.43", - "20.21.37", - "20.31.40", - ), - ) - - apply { - addResources("youtube", "misc.hapticfeedback.disableHapticFeedbackPatch") - - PreferenceScreen.PLAYER.addPreferences( - PreferenceScreenPreference( - "revanced_disable_haptic_feedback", - preferences = setOf( - SwitchPreference("revanced_disable_haptic_feedback_chapters"), - SwitchPreference("revanced_disable_haptic_feedback_precise_seeking"), - SwitchPreference("revanced_disable_haptic_feedback_seek_undo"), - SwitchPreference("revanced_disable_haptic_feedback_zoom"), - ), - ), - ) - - arrayOf( - markerHapticsMethod to "disableChapterVibrate", - scrubbingHapticsMethod to "disablePreciseSeekingVibrate", - seekUndoHapticsMethod to "disableSeekUndoVibrate", - zoomHapticsMethod to "disableZoomVibrate", - ).forEach { (method, methodName) -> - method.addInstructionsWithLabels( - 0, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->$methodName()Z - move-result v0 - if-eqz v0, :vibrate - return-void - """, - ExternalLabel("vibrate", method.getInstruction(0)), - ) - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt deleted file mode 100644 index f37729e3d1..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt +++ /dev/null @@ -1,28 +0,0 @@ -package app.revanced.patches.youtube.misc.hapticfeedback - -import app.revanced.patcher.* -import app.revanced.patcher.patch.BytecodePatchContext - -internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMethodDeclaratively( - "Failed to execute markers haptics vibrate.", -) { - returnType("V") -} - -internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMethodDeclaratively( - "Failed to haptics vibrate for fine scrubbing.", -) { - returnType("V") -} - -internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMethodDeclaratively( - "Failed to execute seek undo haptics vibrate.", -) { - returnType("V") -} - -internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMethodDeclaratively( - "Failed to haptics vibrate for video zoom", -) { - returnType("V") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index 91b2192276..f1d569e459 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -17,8 +17,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -private lateinit var loadImageUrlMethod: MutableMethod -private var loadImageUrlIndex = 0 +private lateinit var loadImageURLMethod: MutableMethod +private var loadImageURLIndex = 0 private lateinit var loadImageSuccessCallbackMethod: MutableMethod private var loadImageSuccessCallbackIndex = 0 @@ -26,14 +26,14 @@ private var loadImageSuccessCallbackIndex = 0 private lateinit var loadImageErrorCallbackMethod: MutableMethod private var loadImageErrorCallbackIndex = 0 -val cronetImageUrlHookPatch = bytecodePatch( - description = "Hooks Cronet image urls.", +val cronetImageURLHookPatch = bytecodePatch( + description = "Hooks Cronet image URLs.", ) { dependsOn(sharedExtensionPatch) apply { - loadImageUrlMethod = messageDigestImageUrlParentMethod.immutableClassDef.getMessageDigestImageUrlMethod() + loadImageURLMethod = messageDigestImageURLParentMethod.immutableClassDef.getMessageDigestImageURLMethod() loadImageSuccessCallbackMethod = onResponseStartedMethod.immutableClassDef.getOnSucceededMethod() loadImageErrorCallbackMethod = onResponseStartedMethod.immutableClassDef.getOnFailureMethod() @@ -72,22 +72,22 @@ val cronetImageUrlHookPatch = bytecodePatch( /** * @param highPriority If the hook should be called before all other hooks. */ -fun addImageUrlHook(targetMethodClass: String, highPriority: Boolean = false) { - loadImageUrlMethod.addInstructions( - if (highPriority) 0 else loadImageUrlIndex, +fun addImageURLHook(targetMethodClass: String, highPriority: Boolean = false) { + loadImageURLMethod.addInstructions( + if (highPriority) 0 else loadImageURLIndex, """ invoke-static { p1 }, $targetMethodClass->overrideImageURL(Ljava/lang/String;)Ljava/lang/String; move-result-object p1 """, ) - loadImageUrlIndex += 2 + loadImageURLIndex += 2 } /** * If a connection completed, which includes normal 200 responses but also includes * status 404 and other error like http responses. */ -fun addImageUrlSuccessCallbackHook(targetMethodClass: String) { +fun addImageURLSuccessCallbackHook(targetMethodClass: String) { loadImageSuccessCallbackMethod.addInstruction( loadImageSuccessCallbackIndex++, "invoke-static { p1, p2 }, $targetMethodClass->handleCronetSuccess(" + @@ -98,7 +98,7 @@ fun addImageUrlSuccessCallbackHook(targetMethodClass: String) { /** * If a connection outright failed to complete any connection. */ -fun addImageUrlErrorCallbackHook(targetMethodClass: String) { +fun addImageURLErrorCallbackHook(targetMethodClass: String) { loadImageErrorCallbackMethod.addInstruction( loadImageErrorCallbackIndex++, "invoke-static { p1, p2, p3 }, $targetMethodClass->handleCronetFailure(" + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index 29d69d9a80..a273132f94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -46,12 +46,12 @@ internal val BytecodePatchContext.requestMethod by gettingFirstMethodDeclarative } context(_: BytecodePatchContext) -internal fun ClassDef.getMessageDigestImageUrlMethod() = firstMethodDeclaratively { +internal fun ClassDef.getMessageDigestImageURLMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("Ljava/lang/String;", "L") } -internal val BytecodePatchContext.messageDigestImageUrlParentMethod by gettingFirstMethodDeclaratively { +internal val BytecodePatchContext.messageDigestImageURLParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 99f4a9f2cf..7978e8e8b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.links +import app.revanced.patcher.CompositeMatch import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @@ -8,11 +9,13 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_20_37_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_49_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" @Suppress("unused") val bypassURLRedirectsPatch = bytecodePatch( @@ -27,10 +30,12 @@ val bypassURLRedirectsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) @@ -42,20 +47,24 @@ val bypassURLRedirectsPatch = bytecodePatch( ) arrayOf( - if (is_20_37_or_greater) { - (abUriParserMethodMatch to 2) + if (is_20_49_or_greater) { + // Code has moved, and now seems to be an account URL + // and may not be anything to do with sharing links. + null to -1 + } else if (is_20_37_or_greater) { + abUriParserMethodMatch to 2 } else { - (abUriParserLegacyMethodMatch to 2) - }, - httpUriParserMethodMatch to 0, + abUriParserLegacyMethodMatch to 2 + } ).forEach { (match, index) -> - val insertIndex = match[index] - val uriStringRegister = match.method.getInstruction(insertIndex).registerC + val insertIndex = match?.get(index) ?: return@forEach + val uriStringRegister = + match.method.getInstruction(insertIndex).registerC match.method.replaceInstruction( insertIndex, "invoke-static { v$uriStringRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + - "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index bea03da447..7e268e76f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -34,15 +34,3 @@ internal val BytecodePatchContext.abUriParserMethodMatch by composingFirstMethod method { toString() == "Ljava/util/List;->get(I)Ljava/lang/Object;" }, ) } - -internal val BytecodePatchContext.httpUriParserMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returnType("Landroid/net/Uri;") - parameterTypes("Ljava/lang/String;") - instructions( - method { toString() == "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" }, - "https"(), - "://"(), - "https:"(), - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 6132801071..0128184a68 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -42,10 +42,12 @@ val openLinksExternallyPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index aab6d49715..4813ed99ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -3,7 +3,6 @@ package app.revanced.patches.youtube.misc.litho.filter import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode internal val BytecodePatchContext.lithoComponentNameUpbFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index be87c62780..772e5b6efc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -49,7 +49,7 @@ val lithoFilterPatch = lithoFilterPatch( executeBlock = { // region A/B test of new Litho native code. - // Turn off native code that handles litho component names. If this feature is on then nearly + // Turn off native code that handles litho component names. If this feature is on then nearly // all litho components have a null name and identifier/path filtering is completely broken. // // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt deleted file mode 100644 index 388a54e5d5..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.youtube.misc.loopvideo - -import app.revanced.patcher.accessFlags -import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively -import app.revanced.patcher.instructions -import app.revanced.patcher.invoke -import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.returnType -import com.android.tools.smali.dexlib2.AccessFlags - -internal val BytecodePatchContext.videoStartPlaybackMethod by gettingFirstImmutableMethodDeclaratively { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("V") - instructions( - "play() called when the player wasn't loaded."(), - "play() blocked because Background Playability failed"(), - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt index 1c70aa973c..e30ae91997 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt @@ -1,5 +1,7 @@ package app.revanced.patches.youtube.misc.loopvideo +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -7,15 +9,15 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.loopvideo.button.loopVideoButtonPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.playerStatusMethod import app.revanced.patches.youtube.video.information.videoInformationPatch -import app.revanced.util.addInstructionsAtControlFlowLabel -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/LoopVideoPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/LoopVideoPatch;" -@Suppress("ObjectPropertyName") val loopVideoPatch = bytecodePatch( name = "Loop video", description = "Adds an option to loop videos and display loop video button in the video player.", @@ -29,36 +31,42 @@ val loopVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) apply { addResources("youtube", "misc.loopvideo.loopVideoPatch") - PreferenceScreen.MISC.addPreferences( + PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_loop_video"), ) - videoEndMethod.apply { - // Add call to start playback again, but must not allow exit fullscreen patch call - // to be reached if the video is looped. - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.INVOKE_VIRTUAL) + 1 + playerStatusMethod.apply { + // Add call to start playback again, but must happen before "Exit fullscreen" patch call. + val insertIndex = indexOfFirstInstructionOrThrow(Opcode.SGET_OBJECT) + // Since instructions are added just above Opcode.SGET_OBJECT, instead of calling findFreeRegister(), + // a register from Opcode.SGET_OBJECT is used. + val freeRegister = + getInstruction(insertIndex).registerA - addInstructionsAtControlFlowLabel( + // Since 'videoInformationPatch' is used as a dependency of this patch, + // the loop is implemented through 'VideoInformation.seekTo(0)'. + addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldLoopVideo()Z - move-result v0 - if-eqz v0, :do_not_loop - invoke-virtual { p0 }, $videoStartPlaybackMethod + invoke-static/range { p1 .. p1 }, $EXTENSION_CLASS_DESCRIPTOR->shouldLoopVideo(Ljava/lang/Enum;)Z + move-result v$freeRegister + if-eqz v$freeRegister, :do_not_loop return-void :do_not_loop nop - """, + """ ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index b1a3dbc82f..c8a6a5fce0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -8,7 +8,7 @@ import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch +import app.revanced.patches.youtube.layout.buttons.navigation.navigationBarPatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef @@ -50,12 +50,12 @@ context(_: BytecodePatchContext) internal fun ClassDef.getInitializeButtonsMethod() = firstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") - instructions(ResourceType.LAYOUT("image_only_tab")) + instructions("FEvideo_picker"()) } /** * Extension method, used for callback into to other patches. - * Specifically, [navigationButtonsPatch]. + * Specifically, [navigationBarPatch]. */ internal val BytecodePatchContext.navigationBarHookCallbackMethod by gettingFirstMethodDeclaratively { name("navigationTabCreatedCallback") @@ -76,8 +76,8 @@ internal val BytecodePatchContext.navigationEnumMethod by gettingFirstImmutableM "TAB_ACTIVITY", "VIDEO_LIBRARY_WHITE", "INCOGNITO_CIRCLE", - "UNKNOWN", // Required to distinguish from patch extension class. ) { + definingClass { !startsWith("Lapp/revanced") } accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) } @@ -125,11 +125,11 @@ internal val BytecodePatchContext.pivotBarConstructorMethod by gettingFirstImmut } internal val BytecodePatchContext.imageEnumConstructorMethodMatch by composingFirstMethod { + definingClass { !startsWith("Lapp/revanced") } accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( "TAB_ACTIVITY_CAIRO"(), - after(Opcode.INVOKE_DIRECT()), - after(Opcode.SPUT_OBJECT()), + Opcode.SPUT_OBJECT() ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 8e7651635c..705539bd40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -126,7 +126,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig ) } - // Hook onto back button pressed. Needed to fix race problem with + // Hook onto back button pressed. Needed to fix race problem with // Litho filtering based on navigation tab before the tab is updated. mainActivityOnBackPressedMethod.addInstruction( 0, @@ -204,14 +204,8 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig ) } - if (is_20_39_or_greater) { - return@apply Logger.getLogger(this::class.java.name).warning( - "20.39+ Navigation tab activity button selected state is not yet fixed.", - ) - } - // Fix YT bug of notification tab missing the filled icon. - if (is_19_35_or_greater && !is_20_39_or_greater) { // FIXME: 20.39+ needs this fix. + if (is_19_35_or_greater) { val cairoNotificationEnumReference = imageEnumConstructorMethodMatch.method.getInstruction(imageEnumConstructorMethodMatch[-1]).reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index 973fa94ff5..aeec4f5b01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -110,7 +110,7 @@ internal val playerControlsResourcePatch = resourcePatch { "android.support.constraint.ConstraintLayout", ).item(0).childNodes - // Copy the patch layout xml into the target layout file. + // Copy the patch layout XML into the target layout file. for (index in sourceElements.length - 1 downTo 1) { val element = sourceElements.item(index).cloneNode(true) @@ -252,7 +252,7 @@ val playerControlsPatch = bytecodePatch( visibilityMethod = playerTopControlsInflateMethodMatch.immutableClassDef.getControlsOverlayVisibilityMethod() - // Hook the fullscreen close button. Used to fix visibility + // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. overlayViewInflateMethodMatch.method.apply { val index = overlayViewInflateMethodMatch[-1] diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index aa761dac94..f2e6b41ee3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -8,94 +8,124 @@ import kotlin.properties.Delegates // Use notNull delegate so an exception is thrown if these fields are accessed before they are set. -@Deprecated("19.43.41 is the lowest supported version") -var is_19_17_or_greater : Boolean by Delegates.notNull() +@Deprecated("20.14.43 is the lowest supported version") +var is_19_17_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_18_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_18_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_23_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_23_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_25_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_25_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_26_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_26_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_29_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_29_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_32_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_32_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_33_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_33_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_34_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_34_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_35_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_35_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_36_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_36_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_41_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_41_or_greater: Boolean by Delegates.notNull() private set -@Deprecated("19.43.41 is the lowest supported version") -var is_19_43_or_greater : Boolean by Delegates.notNull() + +@Deprecated("20.14.43 is the lowest supported version") +var is_19_43_or_greater: Boolean by Delegates.notNull() private set -var is_19_46_or_greater : Boolean by Delegates.notNull() +var is_19_46_or_greater: Boolean by Delegates.notNull() private set -var is_19_47_or_greater : Boolean by Delegates.notNull() +var is_19_47_or_greater: Boolean by Delegates.notNull() private set -var is_19_49_or_greater : Boolean by Delegates.notNull() +var is_19_49_or_greater: Boolean by Delegates.notNull() private set -var is_20_02_or_greater : Boolean by Delegates.notNull() +var is_20_02_or_greater: Boolean by Delegates.notNull() private set -var is_20_03_or_greater : Boolean by Delegates.notNull() +var is_20_03_or_greater: Boolean by Delegates.notNull() private set -var is_20_05_or_greater : Boolean by Delegates.notNull() +var is_20_05_or_greater: Boolean by Delegates.notNull() private set -var is_20_07_or_greater : Boolean by Delegates.notNull() +var is_20_07_or_greater: Boolean by Delegates.notNull() private set -var is_20_09_or_greater : Boolean by Delegates.notNull() +var is_20_09_or_greater: Boolean by Delegates.notNull() private set -var is_20_10_or_greater : Boolean by Delegates.notNull() +var is_20_10_or_greater: Boolean by Delegates.notNull() private set -var is_20_14_or_greater : Boolean by Delegates.notNull() +var is_20_14_or_greater: Boolean by Delegates.notNull() private set -var is_20_15_or_greater : Boolean by Delegates.notNull() +var is_20_15_or_greater: Boolean by Delegates.notNull() private set -var is_20_19_or_greater : Boolean by Delegates.notNull() +var is_20_19_or_greater: Boolean by Delegates.notNull() private set -var is_20_20_or_greater : Boolean by Delegates.notNull() +var is_20_20_or_greater: Boolean by Delegates.notNull() private set -var is_20_21_or_greater : Boolean by Delegates.notNull() +var is_20_21_or_greater: Boolean by Delegates.notNull() private set -var is_20_22_or_greater : Boolean by Delegates.notNull() +var is_20_22_or_greater: Boolean by Delegates.notNull() private set -var is_20_26_or_greater : Boolean by Delegates.notNull() +var is_20_26_or_greater: Boolean by Delegates.notNull() private set -var is_20_28_or_greater : Boolean by Delegates.notNull() +var is_20_28_or_greater: Boolean by Delegates.notNull() private set -var is_20_30_or_greater : Boolean by Delegates.notNull() +var is_20_29_or_greater: Boolean by Delegates.notNull() private set -var is_20_31_or_greater : Boolean by Delegates.notNull() +var is_20_30_or_greater: Boolean by Delegates.notNull() private set -var is_20_34_or_greater : Boolean by Delegates.notNull() +var is_20_31_or_greater: Boolean by Delegates.notNull() private set -var is_20_37_or_greater : Boolean by Delegates.notNull() +var is_20_34_or_greater: Boolean by Delegates.notNull() private set -var is_20_39_or_greater : Boolean by Delegates.notNull() +var is_20_37_or_greater: Boolean by Delegates.notNull() private set -var is_20_41_or_greater : Boolean by Delegates.notNull() +var is_20_39_or_greater: Boolean by Delegates.notNull() private set -var is_20_45_or_greater : Boolean by Delegates.notNull() +var is_20_40_or_greater: Boolean by Delegates.notNull() private set -var is_20_46_or_greater : Boolean by Delegates.notNull() +var is_20_41_or_greater: Boolean by Delegates.notNull() + private set +var is_20_45_or_greater: Boolean by Delegates.notNull() + private set +var is_20_46_or_greater: Boolean by Delegates.notNull() + private set +var is_20_49_or_greater: Boolean by Delegates.notNull() + private set +var is_21_02_or_greater: Boolean by Delegates.notNull() + private set +var is_21_03_or_greater: Boolean by Delegates.notNull() + private set +var is_21_05_or_greater : Boolean by Delegates.notNull() + private set +var is_21_06_or_greater : Boolean by Delegates.notNull() + private set +var is_21_07_or_greater : Boolean by Delegates.notNull() + private set +var is_21_08_or_greater : Boolean by Delegates.notNull() private set val versionCheckPatch = resourcePatch( @@ -137,13 +167,22 @@ val versionCheckPatch = resourcePatch( is_20_22_or_greater = 252305000 <= playStoreServicesVersion is_20_26_or_greater = 252705000 <= playStoreServicesVersion is_20_28_or_greater = 252905000 <= playStoreServicesVersion + is_20_29_or_greater = 253005000 <= playStoreServicesVersion is_20_30_or_greater = 253105000 <= playStoreServicesVersion is_20_31_or_greater = 253205000 <= playStoreServicesVersion is_20_34_or_greater = 253505000 <= playStoreServicesVersion is_20_37_or_greater = 253805000 <= playStoreServicesVersion is_20_39_or_greater = 253980000 <= playStoreServicesVersion + is_20_40_or_greater = 254105000 <= playStoreServicesVersion is_20_41_or_greater = 254205000 <= playStoreServicesVersion is_20_45_or_greater = 254605000 <= playStoreServicesVersion is_20_46_or_greater = 254705000 <= playStoreServicesVersion + is_20_49_or_greater = 255005000 <= playStoreServicesVersion + is_21_02_or_greater = 260305000 <= playStoreServicesVersion + is_21_03_or_greater = 260405000 <= playStoreServicesVersion + is_21_05_or_greater = 260605000 <= playStoreServicesVersion + is_21_06_or_greater = 260705000 <= playStoreServicesVersion + is_21_07_or_greater = 260805000 <= playStoreServicesVersion + is_21_08_or_greater = 260905000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt index c3cf0e93d0..a8c9549578 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt @@ -15,10 +15,12 @@ val sanitizeSharingLinksPatch = sanitizeSharingLinksPatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ) ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index 37b3b50806..6467516580 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -29,14 +29,3 @@ internal val BytecodePatchContext.cairoFragmentConfigMethodMatch by composingFir afterAtMost(10, Opcode.MOVE_RESULT()), ) } - -// Flag is present in 20.23, but bold icons are missing and forcing them crashes the app. -// 20.31 is the first target with all the bold icons present. -internal val BytecodePatchContext.boldIconsFeatureFlagMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("Z") - parameterTypes() - instructions( - 45685201L(), - ) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 38b200d4b3..3eb9d2eb15 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -11,6 +11,7 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.boldIconsFeatureFlagMethodMatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.overrideThemeColors import app.revanced.patches.shared.misc.settings.preference.* @@ -270,7 +271,7 @@ val settingsPatch = bytecodePatch( } /** - * Modifies the activity to show ReVanced settings instead of it's original purpose. + * Modifies the activity to show ReVanced settings instead of its original purpose. */ internal fun modifyActivityForSettingsInjection( activityOnCreateClass: MutableClassDef, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index 428d55af73..980e64888e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -33,10 +33,12 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( block = { compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 0397f26992..05edd856cd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -1,8 +1,8 @@ package app.revanced.patches.youtube.shared -import app.revanced.patcher.ClassDefComposing import app.revanced.patcher.accessFlags import app.revanced.patcher.after +import app.revanced.patcher.afterAtMost import app.revanced.patcher.allOf import app.revanced.patcher.composingFirstMethod import app.revanced.patcher.custom @@ -20,13 +20,13 @@ import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType -import app.revanced.patcher.type import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef -internal const val YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" +internal const val YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE = + "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" internal val BytecodePatchContext.conversionContextToStringMethod by gettingFirstImmutableMethodDeclaratively( ", widthConstraint=", @@ -40,6 +40,31 @@ internal val BytecodePatchContext.conversionContextToStringMethod by gettingFirs instructions("ConversionContext{"(String::startsWith)) // Partial string match. } +internal val BytecodePatchContext.backgroundPlaybackManagerShortsMethod by gettingFirstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returnType("Z") + parameterTypes("L") + instructions(151635310L()) +} + +internal fun BytecodePatchContext.getEngagementPanelControllerMethodMatch() = firstMethodComposite { + accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) + returnType("L") + parameterTypes("L", "L", "Z", "Z") + instructions( + "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called."(), + method { toString() == "Lj$/util/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object;" }, + method { toString() == "Lj$/util/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object;" }, + afterAtMost(4, Opcode.CHECK_CAST()), + after(Opcode.IF_EQZ()), + after(Opcode.IGET_OBJECT()), + 45615449L(), + method { toString() == "Ljava/util/ArrayDeque;->iterator()Ljava/util/Iterator;" }, + afterAtMost(10, allOf(Opcode.IGET_OBJECT(), field { type == "Ljava/lang/String;" })) + ) +} + + internal fun BytecodePatchContext.getLayoutConstructorMethodMatch() = firstMethodComposite { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") @@ -53,7 +78,8 @@ internal fun BytecodePatchContext.getLayoutConstructorMethodMatch() = firstMetho ResourceType.ID("player_control_next_button_touch_area"), method { parameterTypes.size == 2 && - parameterTypes.zip(methodParameterTypePrefixes).all { (a, b) -> a.startsWith(b) } + parameterTypes.zip(methodParameterTypePrefixes) + .all { (a, b) -> a.startsWith(b) } }, ) } @@ -100,8 +126,8 @@ internal val BytecodePatchContext.rollingNumberTextViewAnimationUpdateMethodMatc ) custom { immutableClassDef.superclass == "Landroid/support/v7/widget/AppCompatTextView;" || - immutableClassDef.superclass == - "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" + immutableClassDef.superclass == + "Lcom/google/android/libraries/youtube/rendering/ui/spec/typography/YouTubeAppCompatTextView;" } } @@ -110,9 +136,6 @@ internal val BytecodePatchContext.seekbarMethod by gettingFirstImmutableMethodDe instructions("timed_markers_width"()) } -/** - * Matches to _mutable_ class found in [seekbarMethod]. - */ internal fun ClassDef.getSeekbarOnDrawMethodMatch() = firstMethodComposite { name("onDraw") instructions( @@ -124,7 +147,7 @@ internal fun ClassDef.getSeekbarOnDrawMethodMatch() = firstMethodComposite { internal val BytecodePatchContext.subtitleButtonControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") - parameterTypes("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") + parameterTypes("L") instructions( ResourceType.STRING("accessibility_captions_unavailable"), ResourceType.STRING("accessibility_captions_button_name"), @@ -136,9 +159,32 @@ internal val BytecodePatchContext.videoQualityChangedMethodMatch by composingFir returnType("L") parameterTypes("L") instructions( - allOf(Opcode.NEW_INSTANCE(), type("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;")), - Opcode.IGET_OBJECT(), + allOf(Opcode.IGET(), field { type == "I" }), + after(2L()), + after(Opcode.IF_NE()), + after(Opcode.NEW_INSTANCE()), // Obfuscated VideoQuality. + afterAtMost(6, Opcode.IGET_OBJECT()), Opcode.CHECK_CAST(), after(allOf(Opcode.IGET(), field { type == "I" })), // Video resolution (human-readable). ) } + + +internal fun BytecodePatchContext.getToolBarButtonMethodMatch() = firstMethodComposite { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + instructions( + ResourceType.ID("menu_item_view"), + allOf(Opcode.INVOKE_INTERFACE(), method { returnType == "I" }), + after(Opcode.MOVE_RESULT()), + afterAtMost(6, allOf(Opcode.IGET_OBJECT(), field { type == "Landroid/widget/ImageView;" })), + afterAtMost( + 8, + method { name == "getDrawable" && definingClass == "Landroid/content/res/Resources;" }), + afterAtMost( + 4, + method { name == "setImageDrawable" && definingClass == "Landroid/widget/ImageView;" }), + ) + // 20.37+ has second parameter of "Landroid/content/Context;" + custom { parameterTypes.count() in 1..2 && parameterTypes.first() == "Landroid/view/MenuItem;" } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 90fbbe740f..2289a65dbd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -20,10 +20,12 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) }, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt index a7f027fd73..7e3360dde0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt @@ -14,7 +14,8 @@ import app.revanced.util.getReference import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableVideoCodecsPatch;" +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/DisableVideoCodecsPatch;" @Suppress("unused") val disableVideoCodecsPatch = bytecodePatch( @@ -55,10 +56,12 @@ val disableVideoCodecsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 9f3b8e52cb..544cad4d0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -7,33 +7,47 @@ import app.revanced.patches.youtube.shared.videoQualityChangedMethodMatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef -import org.stringtemplate.v4.compiler.Bytecode internal val BytecodePatchContext.createVideoPlayerSeekbarMethod by gettingFirstImmutableMethodDeclaratively { returnType("V") instructions("timed_markers_width"()) } -internal val BytecodePatchContext.onPlaybackSpeedItemClickMethod by gettingFirstMethodDeclaratively { + +internal val BytecodePatchContext.onPlaybackSpeedItemClickParentMethod by gettingFirstImmutableMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returnType("L") + parameterTypes("L", "Ljava/lang/String;") + instructions( + method("getSupportFragmentManager"), + after(Opcode.MOVE_RESULT_OBJECT()), + after(method { returnType.startsWith("L") && parameterTypes.size == 1 && parameterTypes.first() == "Ljava/lang/String;" }), + after(Opcode.MOVE_RESULT_OBJECT()), + after(Opcode.IF_EQZ()), + after(Opcode.CHECK_CAST()) + ) + custom { immutableClassDef.methods.count() == 8 } +} + +/** + * Resolves using the method found in [onPlaybackSpeedItemClickParentMethod]. + */ + +context(_: BytecodePatchContext) +internal fun ClassDef.getOnPlaybackSpeedItemClickMethod() = firstMethodDeclaratively { name("onItemClick") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L", "L", "I", "J") - instructions( - allOf( - Opcode.IGET_OBJECT(), - field { type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" }, - ), - ) } internal val BytecodePatchContext.playerControllerSetTimeReferenceMethodMatch by - composingFirstMethod("Media progress reported outside media playback: ") { - opcodes( - Opcode.INVOKE_DIRECT_RANGE, - Opcode.IGET_OBJECT, - ) - } +composingFirstMethod("Media progress reported outside media playback: ") { + opcodes( + Opcode.INVOKE_DIRECT_RANGE, + Opcode.IGET_OBJECT, + ) +} internal val BytecodePatchContext.playVideoCheckVideoStreamingDataResponseMethod by gettingFirstImmutableMethodDeclaratively { instructions("playVideo called on player response with no videoStreamingData."()) @@ -43,7 +57,14 @@ internal val BytecodePatchContext.playVideoCheckVideoStreamingDataResponseMethod * Matched using class found in [playVideoCheckVideoStreamingDataResponseMethod]. */ internal fun ClassDef.getSeekMethod() = firstImmutableMethodDeclaratively { - instructions("Attempting to seek during an ad"()) + instructions( + anyOf( + // 20.xx + "Attempting to seek during an ad"(), + // 21.02+ + "currentPositionMs."() + ) + ) } internal val ClassDef.videoLengthMethodMatch by ClassDefComposing.composingFirstMethod { @@ -116,17 +137,33 @@ internal fun ClassDef.getSeekRelativeMethod() = firstMethodDeclaratively { ) } -internal val BytecodePatchContext.videoEndMethodMatch by composingFirstMethod { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returnType("Z") - parameterTypes("J", "L") - instructions( - method { parameterTypes.isEmpty() && returnType == "V" }, - afterAtMost(5, 45368273L()), - "Attempting to seek when video is not playing"(), - ) +internal val BytecodePatchContext.playerStatusEnumMethod by gettingFirstImmutableMethodDeclaratively( + "NEW", + "PLAYBACK_PENDING", + "PLAYBACK_LOADED", + "PLAYBACK_INTERRUPTED", + "INTERSTITIAL_REQUESTED", + "INTERSTITIAL_PLAYING", + "VIDEO_PLAYING", + "ENDED", +) { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) } +context(context: BytecodePatchContext) +internal fun ClassDef.getPlayerStatusMethod() = + firstMethodDeclaratively { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes(context.playerStatusEnumMethod.immutableClassDef.type) + instructions( + // The opcode for the first index of the method is sget-object. + // Even in sufficiently old versions, such as YT 17.34, the opcode for the first index is sget-object. + Opcode.SGET_OBJECT(), + method { name == "plus" && definingClass == "Lj$/time/Instant;" }, + ) + } + /** * Matches with the class found in [videoQualityChangedMethodMatch]. */ @@ -146,14 +183,11 @@ internal val BytecodePatchContext.playbackSpeedClassMethod by gettingFirstMethod opcodes(Opcode.RETURN_OBJECT) } -internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = - "Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;" - /** * YouTube 20.19 and lower. */ internal val BytecodePatchContext.videoQualityLegacyMethod by gettingFirstMethodDeclaratively { - definingClass(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE) + definingClass("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( "I", // Resolution. @@ -163,8 +197,21 @@ internal val BytecodePatchContext.videoQualityLegacyMethod by gettingFirstMethod ) } + +internal val BytecodePatchContext.playbackStartDescriptorToStringMethodMatch by composingFirstMethod { + name("toString") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Ljava/lang/String;") + instructions( + method { toString() == "Ljava/util/Locale;->getDefault()Ljava/util/Locale;" }, + // First method call after Locale is the video ID. + method { returnType == "Ljava/lang/String;" && parameterTypes.isEmpty() }, + "PlaybackStartDescriptor:"(String::startsWith) + ) +} + +// Class name is un-obfuscated in targets before 21.01. internal val BytecodePatchContext.videoQualityMethod by gettingFirstMethodDeclaratively { - definingClass(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( "I", // Resolution. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index b8bd0a4f57..26117af4df 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -11,6 +11,7 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_20_19_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.videoQualityChangedMethodMatch import app.revanced.patches.youtube.video.playerresponse.Hook @@ -24,9 +25,11 @@ import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.addStaticFieldToExtension import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.patcher.patch.PatchException import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation +import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -42,9 +45,11 @@ import com.android.tools.smali.dexlib2.util.MethodUtil private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/VideoInformation;" private const val EXTENSION_PLAYER_INTERFACE = - "Lapp/revanced/extension/youtube/patches/VideoInformation\$PlaybackController;" + $$"Lapp/revanced/extension/youtube/patches/VideoInformation$PlaybackController;" private const val EXTENSION_VIDEO_QUALITY_MENU_INTERFACE = - "Lapp/revanced/extension/youtube/patches/VideoInformation\$VideoQualityMenuInterface;" + $$"Lapp/revanced/extension/youtube/patches/VideoInformation$VideoQualityMenuInterface;" +internal const val EXTENSION_VIDEO_QUALITY_INTERFACE = + $$"Lapp/revanced/extension/youtube/patches/VideoInformation$VideoQualityInterface;" private lateinit var playerInitMethod: MutableMethod private var playerInitInsertIndex = -1 @@ -57,7 +62,7 @@ private var mdxInitInsertRegister = -1 private lateinit var timeMethod: MutableMethod private var timeInitInsertIndex = 2 -// Old speed menu, where speeds are entries in a list. Method is also used by the player speed button. +// Old speed menu, where speeds are entries in a list. Method is also used by the player speed button. private lateinit var legacySpeedSelectionInsertMethod: MutableMethod private var legacySpeedSelectionInsertIndex = -1 private var legacySpeedSelectionValueRegister = -1 @@ -71,11 +76,13 @@ private var speedSelectionValueRegister = -1 private lateinit var setPlaybackSpeedMethod: MutableMethod private var setPlaybackSpeedMethodIndex = -1 -internal lateinit var videoEndMethod: MutableMethod +internal lateinit var playerStatusMethod: MutableMethod // Used by other patches. internal lateinit var setPlaybackSpeedContainerClassFieldReference: FieldReference private set +internal lateinit var setPlaybackSpeedContainerClassFieldReferenceClassType: ClassDef + private set internal lateinit var setPlaybackSpeedClassFieldReference: FieldReference private set internal lateinit var setPlaybackSpeedMethodReference: MethodReference @@ -123,7 +130,7 @@ val videoInformationPatch = bytecodePatch( mdxInitInsertIndex = initThisIndex + 1 // Hook the MDX director for use through the extension. - onCreateHookMdx(EXTENSION_CLASS_DESCRIPTOR, "initializeMdx") + onCreateHookMDX(EXTENSION_CLASS_DESCRIPTOR, "initializeMDX") addSeekInterfaceMethods( classDef, @@ -150,11 +157,10 @@ val videoInformationPatch = bytecodePatch( } } - videoEndMethod = navigate(videoEndMethodMatch.immutableMethod) - .to(videoEndMethodMatch[0]).stop() + playerStatusMethod = playerInitMethod.immutableClassDef.getPlayerStatusMethod() /* - * Inject call for video ids + * Inject call for video IDs */ val videoIdMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->setVideoId(Ljava/lang/String;)V" hookVideoId(videoIdMethodDescriptor) @@ -162,8 +168,8 @@ val videoInformationPatch = bytecodePatch( hookPlayerResponseVideoId( "$EXTENSION_CLASS_DESCRIPTOR->setPlayerResponseVideoId(Ljava/lang/String;Z)V", ) - // Call before any other video id hooks, - // so they can use VideoInformation and check if the video id is for a Short. + // Call before any other video ID hooks, + // so they can use VideoInformation and check if the video ID is for a Short. addPlayerResponseMethodHook( Hook.ProtoBufferParameterBeforeVideoId( "$EXTENSION_CLASS_DESCRIPTOR->" + @@ -185,7 +191,7 @@ val videoInformationPatch = bytecodePatch( /* * Hook the user playback speed selection. */ - onPlaybackSpeedItemClickMethod.apply { + onPlaybackSpeedItemClickParentMethod.immutableClassDef.getOnPlaybackSpeedItemClickMethod().apply { val speedSelectionValueInstructionIndex = indexOfFirstInstructionOrThrow(Opcode.IGET) legacySpeedSelectionInsertMethod = this @@ -193,20 +199,49 @@ val videoInformationPatch = bytecodePatch( legacySpeedSelectionValueRegister = getInstruction(speedSelectionValueInstructionIndex).registerA - setPlaybackSpeedMethodReference = - getInstruction(speedSelectionValueInstructionIndex + 2).reference as MethodReference - setPlaybackSpeedClassFieldReference = - getInstruction(speedSelectionValueInstructionIndex + 1).reference as FieldReference - setPlaybackSpeedContainerClassFieldReference = - getInstruction(indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) - 1).reference as FieldReference + setPlaybackSpeedMethodReference = getInstruction( + indexOfFirstInstructionOrThrow(speedSelectionValueInstructionIndex) { + val reference = getReference() + reference?.parameterTypes?.size == 1 && reference.parameterTypes.first() == "F" + } + ).reference as MethodReference - setPlaybackSpeedMethod = - firstClassDef(setPlaybackSpeedMethodReference.definingClass) - .methods.first { it.name == setPlaybackSpeedMethodReference.name } + setPlaybackSpeedContainerClassFieldReference = getInstruction( + indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) - 1 + ).reference as FieldReference + + if (is_20_49_or_greater) { + // Only one class implements the interface. Patcher currently does not have a + // 'first' accessor for looking up classes, so do it ourselves to verify + // we're using the expected class type. + var fieldReferenceType: ClassDef? = null + classDefs.forEach { classDef -> + if (classDef.interfaces.contains(setPlaybackSpeedContainerClassFieldReference.type)) { + if (fieldReferenceType != null) { + throw PatchException("Found more than one playback speed interface: $classDef") + } + fieldReferenceType = classDef + } + } + setPlaybackSpeedContainerClassFieldReferenceClassType = fieldReferenceType!! + } else { + setPlaybackSpeedContainerClassFieldReferenceClassType = + classDefs[setPlaybackSpeedContainerClassFieldReference.type]!! + } + + setPlaybackSpeedClassFieldReference = getInstruction( + indexOfFirstInstructionOrThrow(speedSelectionValueInstructionIndex) { + getReference()?.type?.startsWith("L") == true + } + ).reference as FieldReference + + setPlaybackSpeedMethod = firstClassDef( + setPlaybackSpeedMethodReference.definingClass + ).methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 // Add override playback speed method. - onPlaybackSpeedItemClickMethod.classDef.methods.add( + classDef.methods.add( ImmutableMethod( definingClass, "overridePlaybackSpeed", @@ -224,16 +259,19 @@ val videoInformationPatch = bytecodePatch( if-lez v0, :ignore # Get the container class field. - iget-object v0, v2, $setPlaybackSpeedContainerClassFieldReference - + iget-object v0, v2, $setPlaybackSpeedContainerClassFieldReference + # For some reason, in YouTube 19.44.39 this value is sometimes null. if-eqz v0, :ignore + + # Required cast for 20.49+ + check-cast v0, $setPlaybackSpeedContainerClassFieldReferenceClassType # Get the field from its class. iget-object v1, v0, $setPlaybackSpeedClassFieldReference # Invoke setPlaybackSpeed on that class. - invoke-virtual {v1, v3}, $setPlaybackSpeedMethodReference + invoke-virtual { v1, v3 }, $setPlaybackSpeedMethodReference :ignore return-void @@ -286,7 +324,10 @@ val videoInformationPatch = bytecodePatch( } } + val videoQualityClassType : String (if (is_20_19_or_greater) videoQualityMethod else videoQualityLegacyMethod).apply { + videoQualityClassType = immutableClassDef.type + // Fix bad data used by YouTube. val nameRegister = if (is_20_20_or_greater) "p3" else "p2" addInstructions( @@ -299,6 +340,9 @@ val videoInformationPatch = bytecodePatch( // Add methods to access obfuscated quality fields. classDef.apply { + // Add interface and helper methods to allow extension code to call obfuscated methods. + interfaces.add(EXTENSION_VIDEO_QUALITY_INTERFACE) + methods.add( ImmutableMethod( type, @@ -370,7 +414,7 @@ val videoInformationPatch = bytecodePatch( type, "patch_setQuality", listOf( - ImmutableMethodParameter(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE, null, null), + ImmutableMethodParameter(EXTENSION_VIDEO_QUALITY_INTERFACE, null, null), ), "V", AccessFlags.PUBLIC.value or AccessFlags.FINAL.value, @@ -379,12 +423,13 @@ val videoInformationPatch = bytecodePatch( MutableMethodImplementation(2), ).toMutable().apply { val setQualityMenuIndexMethod = methods.single { method -> - method.parameterTypes.firstOrNull() == YOUTUBE_VIDEO_QUALITY_CLASS_TYPE + method.parameterTypes.firstOrNull() == videoQualityClassType } addInstructions( 0, """ + check-cast p1, $videoQualityClassType invoke-virtual { p0, p1 }, $setQualityMenuIndexMethod return-void """, @@ -400,7 +445,7 @@ val videoInformationPatch = bytecodePatch( iget-object v0, p0, $onItemClickListenerClassReference iget-object v0, v0, $setQualityFieldReference - invoke-static { p1, v0, p2 }, $EXTENSION_CLASS_DESCRIPTOR->setVideoQuality([$YOUTUBE_VIDEO_QUALITY_CLASS_TYPE${EXTENSION_VIDEO_QUALITY_MENU_INTERFACE}I)I + invoke-static { p1, v0, p2 }, $EXTENSION_CLASS_DESCRIPTOR->setVideoQuality([$EXTENSION_VIDEO_QUALITY_INTERFACE${EXTENSION_VIDEO_QUALITY_MENU_INTERFACE}I)I move-result p2 """, ) @@ -471,9 +516,9 @@ private fun MutableMethod.insertTimeHook(insertIndex: Int, descriptor: String) = insert(insertIndex, "p1, p2", descriptor) /** - * Hook the player controller. Called when a video is opened or the current video is changed. + * Hook the player controller. Called when a video is opened or the current video is changed. * - * Note: This hook is called very early and is called before the video id, video time, video length, + * Note: This hook is called very early and is called before the video ID, video time, video length, * and many other data fields are set. * * @param targetMethodClass The descriptor for the class to invoke when the player controller is created. @@ -492,7 +537,7 @@ internal fun onCreateHook(targetMethodClass: String, targetMethodName: String) = * @param targetMethodClass The descriptor for the class to invoke when the player controller is created. * @param targetMethodName The name of the static method to invoke when the player controller is created. */ -internal fun onCreateHookMdx(targetMethodClass: String, targetMethodName: String) = +internal fun onCreateHookMDX(targetMethodClass: String, targetMethodName: String) = mdxInitMethod.insert( mdxInitInsertIndex++, "v$mdxInitInsertRegister", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index cd78c70575..3a981345ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -23,7 +23,7 @@ internal val BytecodePatchContext.playerParameterBuilderMethod by gettingFirstMe "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", "Lj$/time/Duration;", @@ -49,7 +49,7 @@ internal val BytecodePatchContext.playerParameterBuilder2026Method by gettingFir "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", "Lj$/time/Duration;", @@ -76,7 +76,7 @@ internal val BytecodePatchContext.playerParameterBuilder2015Method by gettingFir "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", ) @@ -102,7 +102,7 @@ internal val BytecodePatchContext.playerParameterBuilder2010Method by gettingFir "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", "Z", @@ -128,7 +128,7 @@ internal val BytecodePatchContext.playerParameterBuilder2002Method by gettingFir "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", "Z", @@ -154,7 +154,7 @@ internal val BytecodePatchContext.playerParameterBuilder1925Method by gettingFir "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", ) @@ -178,7 +178,7 @@ internal val BytecodePatchContext.playerParameterBuilderLegacyMethod by gettingF "Ljava/lang/String;", "Ljava/lang/String;", "L", - "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", // Appears to indicate if the video ID is being opened or is currently playing. "Z", "Z", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index f10565959c..614fd9c0f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -1,9 +1,18 @@ package app.revanced.patches.youtube.video.quality import app.revanced.patcher.accessFlags +import app.revanced.patcher.afterAtMost +import app.revanced.patcher.allOf import app.revanced.patcher.composingFirstMethod +import app.revanced.patcher.custom +import app.revanced.patcher.definingClass +import app.revanced.patcher.field import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.gettingFirstImmutableMethodDeclaratively +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.name import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes @@ -14,6 +23,43 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.ClassDef +internal val BytecodePatchContext.currentVideoFormatToStringMethod by gettingFirstImmutableMethodDeclaratively( + "currentVideoFormat=" +) { + name("toString") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Ljava/lang/String;") + parameterTypes() +} + +internal val BytecodePatchContext.defaultOverflowOverlayOnClickMethodMatch by composingFirstMethod { + name("onClick") + definingClass("Lcom/google/android/libraries/youtube/player/features/overlay/overflow/ui/DefaultOverflowOverlay;") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes("Landroid/view/View;") + + var methodDefiningClass = "" + custom { + methodDefiningClass = definingClass + true + } + + instructions( + Opcode.IF_NE(), + afterAtMost(2, allOf(Opcode.IGET_OBJECT(), field { definingClass == methodDefiningClass })) + ) +} + +internal val BytecodePatchContext.hidePremiumVideoQualityGetArrayMethod by gettingFirstMethodDeclaratively { + name("apply") + definingClass("Lapp/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("Ljava/lang/Object;") + parameterTypes("I") + custom { AccessFlags.SYNTHETIC.isSet(immutableClassDef.accessFlags) } +} + internal val BytecodePatchContext.videoQualityItemOnClickParentMethod by gettingFirstImmutableMethodDeclaratively( "VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT", ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/HidePremiumVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/HidePremiumVideoQualityPatch.kt new file mode 100644 index 0000000000..3bac14e576 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/HidePremiumVideoQualityPatch.kt @@ -0,0 +1,97 @@ +package app.revanced.patches.youtube.video.quality + +import app.revanced.patcher.accessFlags +import app.revanced.patcher.afterAtMost +import app.revanced.patcher.allOf +import app.revanced.patcher.custom +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.fieldReference +import app.revanced.patcher.field +import app.revanced.patcher.firstMethodComposite +import app.revanced.patcher.immutableClassDef +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.returnType +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.video.information.EXTENSION_VIDEO_QUALITY_INTERFACE +import app.revanced.patches.youtube.video.information.videoInformationPatch +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.ClassDef +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/playback/quality/HidePremiumVideoQualityPatch;" + +internal val hidePremiumVideoQualityPatch = bytecodePatch { + dependsOn( + sharedExtensionPatch, + settingsPatch, + videoInformationPatch, + addResourcesPatch + ) + + apply { + addResources("youtube", "video.quality.hidePremiumVideoQualityPatch") + + settingsMenuVideoQualityGroup.add( + SwitchPreference("revanced_hide_premium_video_quality") + ) + + // Class name is obfuscated in 21.02+. + val videoQualityArrayFieldType = defaultOverflowOverlayOnClickMethodMatch.let { + it.method.getInstruction(it[-1]).fieldReference!!.type + } + + // To avoid ClassCastException, declare the new array + // as original video quality class instead of EXTENSION_VIDEO_QUALITY_INTERFACE. + hidePremiumVideoQualityGetArrayMethod.addInstructions( + 0, + """ + new-array p1, p1, $videoQualityArrayFieldType + return-object p1 + """ + ) + + fun ClassDef.getCurrentVideoFormatConstructorMethodMatch() = firstMethodComposite { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + returnType("V") + + var methodDefiningClass = "" + custom { + methodDefiningClass = definingClass + true + } + + instructions( + allOf( + Opcode.IPUT_OBJECT(), + field { type == videoQualityArrayFieldType && definingClass == methodDefiningClass } + ) + ) + } + + currentVideoFormatToStringMethod.immutableClassDef.getCurrentVideoFormatConstructorMethodMatch() + .let { + it.method.apply { + val index = it[-1] + val register = getInstruction(index).registerA + + addInstructions( + index, + """ + invoke-static/range { v$register .. v$register }, $EXTENSION_CLASS_DESCRIPTOR->hidePremiumVideoQuality([$EXTENSION_VIDEO_QUALITY_INTERFACE)[Ljava/lang/Object; + move-result-object v$register + check-cast v$register, $videoQualityArrayFieldType + """ + ) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index 9b38ead454..15db089e5f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -72,7 +72,7 @@ val rememberVideoQualityPatch = bytecodePatch { // Inject a call to remember the user selected quality for regular videos. videoQualityChangedMethodMatch.let { match -> - val index = match[3] + val index = match[-1] val register = match.method.getInstruction(index).registerA match.method.addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index bc5639098b..eac5428f97 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.youtube.misc.settings.PreferenceScreen /** - * Video quality settings. Used to organize all speed related settings together. + * Video quality settings. Used to organize all speed related settings together. */ internal val settingsMenuVideoQualityGroup = mutableSetOf() @@ -19,15 +19,18 @@ val videoQualityPatch = bytecodePatch( dependsOn( rememberVideoQualityPatch, advancedVideoQualityMenuPatch, + hidePremiumVideoQualityPatch, videoQualityDialogButtonPatch, ) compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index cecb755e0f..16b54823e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -10,7 +10,7 @@ import app.revanced.patches.youtube.video.speed.custom.customPlaybackSpeedPatch import app.revanced.patches.youtube.video.speed.remember.rememberPlaybackSpeedPatch /** - * Speed menu settings. Used to organize all speed related settings together. + * Speed menu settings. Used to organize all speed related settings together. */ internal val settingsMenuVideoSpeedGroup = mutableSetOf() @@ -18,7 +18,7 @@ internal val settingsMenuVideoSpeedGroup = mutableSetOf() val playbackSpeedPatch = bytecodePatch( name = "Playback speed", description = "Adds options to customize available playback speeds, set a default playback speed, " + - "and show a speed dialog button in the video player.", + "and show a speed dialog button in the video player.", ) { dependsOn( customPlaybackSpeedPatch, @@ -28,10 +28,12 @@ val playbackSpeedPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.43.41", "20.14.43", "20.21.37", - "20.31.40", + "20.26.46", + "20.31.42", + "20.37.48", + "20.40.45" ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 5f3273718f..606c78c458 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -17,7 +17,6 @@ import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.shared.misc.litho.filter.addLithoFilter -import app.revanced.patches.youtube.interaction.seekbar.customTapAndHoldMethodMatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater @@ -98,13 +97,15 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // Apply changes from last index to first to preserve indexes. val originalArrayFetchIndex = it[5] - val originalArrayFetchDestination = getInstruction(it[5]).registerA + val originalArrayFetchDestination = + getInstruction(it[5]).registerA replaceInstruction( originalArrayFetchIndex, "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", ) - val arrayLengthConstDestination = getInstruction(it[3]).registerA + val arrayLengthConstDestination = + getInstruction(it[3]).registerA val newArrayIndex = it[4] addInstructions( newArrayIndex, @@ -115,7 +116,8 @@ internal val customPlaybackSpeedPatch = bytecodePatch( ) val sizeCallIndex = it[0] + 1 - val sizeCallResultRegister = getInstruction(sizeCallIndex).registerA + val sizeCallResultRegister = + getInstruction(sizeCallIndex).registerA replaceInstruction(sizeCallIndex, "const/4 v$sizeCallResultRegister, 0x0") } } @@ -170,17 +172,19 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // region Custom tap and hold 2x speed. if (is_19_47_or_greater) { - customTapAndHoldMethodMatch.let { + // Function, because it can be the same method as getTapAndHoldHapticsMethodMatch. + getTapAndHoldSpeedMethodMatch().let { it.method.apply { - val index = it[0] - val register = getInstruction(index).registerA + val speedIndex = it[-1] + val speedRegister = + getInstruction(speedIndex).registerA addInstructions( - index + 1, + speedIndex + 1, + """ + invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->getTapAndHoldSpeed()F + move-result v$speedRegister """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F - move-result v$register - """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index c2db863a55..e431b77c37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -35,14 +35,14 @@ internal val BytecodePatchContext.serverSideMaxSpeedFeatureFlagMethod by getting internal val BytecodePatchContext.speedArrayGeneratorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("[L") - parameterTypes("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") + parameterTypes("L") instructions( method { name == "size" && returnType == "I" }, allOf(Opcode.NEW_INSTANCE(), type("Ljava/text/DecimalFormat;")), "0.0#"(), 7L(), Opcode.NEW_ARRAY(), - field { definingClass.endsWith("/PlayerConfigModel;") && type == "[F" }, + field { type == "[F" }, ) } @@ -52,8 +52,9 @@ internal val BytecodePatchContext.speedArrayGeneratorMethodMatch by composingFir internal val BytecodePatchContext.speedLimiterMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") - parameterTypes("F", "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;") + parameterTypes("F", "L") instructions( + "setPlaybackRate"(), 0.25f.toRawBits().toLong()(), 4.0f.toRawBits().toLong()(), ) @@ -77,3 +78,29 @@ internal val BytecodePatchContext.speedLimiterLegacyMethod by gettingFirstMethod Opcode.INVOKE_STATIC, ) } + + +internal fun BytecodePatchContext.getTapAndHoldSpeedMethodMatch() = firstMethodComposite { + name("run") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes() + instructions( + allOf( + Opcode.IGET_OBJECT(), + field { type == "Landroid/os/Handler;" } + ), + allOf( + Opcode.INVOKE_VIRTUAL(), + method { toString() == "Landroid/os/Handler;->removeCallbacks(Ljava/lang/Runnable;)V" } + ), + allOf( + Opcode.INVOKE_VIRTUAL(), + method { returnType == "Z" && parameterTypes.isEmpty() } + ), + Opcode.IF_EQZ(), + allOf(Opcode.IGET_BOOLEAN(), field { type == "Z" }), + Opcode.IF_NEZ(), + 2.0f.toRawBits().toLong()() + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index 315da7fa0a..ca2035fcd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -74,7 +74,10 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { iget-object v1, p0, $onItemClickListenerClassFieldReference # Get the container class field. - iget-object v1, v1, $setPlaybackSpeedContainerClassFieldReference + iget-object v1, v1, $setPlaybackSpeedContainerClassFieldReference + + # Required cast for 20.49+ + check-cast v1, $setPlaybackSpeedContainerClassFieldReferenceClassType # Get the field from its class. iget-object v2, v1, $setPlaybackSpeedClassFieldReference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index 535f38abc6..526485fb54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -15,11 +15,10 @@ internal fun ClassDef.getVideoIdMethodMatch() = firstMethodComposite { returnType("V") parameterTypes("L") instructions( - method { - definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && - returnType == "Ljava/lang/String;" - }, - Opcode.MOVE_RESULT_OBJECT(), + allOf(Opcode.INVOKE_INTERFACE(), method { returnType == "Ljava/lang/String;" }), + after(Opcode.MOVE_RESULT_OBJECT()), // videoId + afterAtMost(6, method { toString() == "Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" }), + after(Opcode.RETURN_VOID()) ) } @@ -28,10 +27,7 @@ internal val BytecodePatchContext.videoIdBackgroundPlayMethodMatch by composingF returnType("V") parameterTypes("L") instructions( - method { - definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && - returnType == "Ljava/lang/String;" - }, + method { returnType == "Ljava/lang/String;" }, Opcode.MOVE_RESULT_OBJECT(), Opcode.IPUT_OBJECT(), Opcode.MONITOR_EXIT(), @@ -41,7 +37,7 @@ internal val BytecodePatchContext.videoIdBackgroundPlayMethodMatch by composingF ) custom { immutableClassDef.methods.count() == 17 || // 20.39 and lower. - immutableClassDef.methods.count() == 16 // 20.40+ + immutableClassDef.methods.count() == 16 // 20.40+ } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 76465dd9e9..ac016b3a6b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -12,13 +12,13 @@ import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHoo import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction /** - * Hooks the new video id when the video changes. + * Hooks the new video ID when the video changes. * * Supports all videos (regular videos and Shorts). * * _Does not function if playing in the background with no video visible_. * - * Be aware, this can be called multiple times for the same video id. + * Be aware, this can be called multiple times for the same video ID. * * @param methodDescriptor which method to call. Params have to be `Ljava/lang/String;` */ @@ -35,7 +35,7 @@ fun hookVideoId( * * _Does not support Shorts_. * - * Be aware, the hook can be called multiple times for the same video id. + * Be aware, the hook can be called multiple times for the same video ID. * * @param methodDescriptor which method to call. Params have to be `Ljava/lang/String;` */ @@ -47,10 +47,10 @@ fun hookBackgroundPlayVideoId( ) /** - * Hooks the video id of every video when loaded. + * Hooks the video ID of every video when loaded. * Supports all videos and functions in all situations. * - * First parameter is the video id. + * First parameter is the video ID. * Second parameter is if the video is a Short AND it is being opened or is currently playing. * * Hook is always called off the main thread. @@ -58,14 +58,14 @@ fun hookBackgroundPlayVideoId( * This hook is called as soon as the player response is parsed, * and called before many other hooks are updated such as [playerTypeHookPatch]. * - * Note: The video id returned here may not be the current video that's being played. + * Note: The video ID returned here may not be the current video that's being played. * It's common for multiple Shorts to load at once in preparation * for the user swiping to the next Short. * * For most use cases, you probably want to use * [hookVideoId] or [hookBackgroundPlayVideoId] instead. * - * Be aware, this can be called multiple times for the same video id. + * Be aware, this can be called multiple times for the same video ID. * * @param methodDescriptor which method to call. Params must be `Ljava/lang/String;Z` */ @@ -84,7 +84,7 @@ private var backgroundPlaybackInsertIndex = 0 private lateinit var backgroundPlaybackMethod: MutableMethod val videoIdPatch = bytecodePatch( - description = "Hooks to detect when the video id changes.", + description = "Hooks to detect when the video ID changes.", ) { dependsOn( sharedExtensionPatch, @@ -95,9 +95,9 @@ val videoIdPatch = bytecodePatch( videoIdParentMethodMatch.immutableClassDef.getVideoIdMethodMatch().let { videoIdMethod = it.method - val index = it[0] - videoIdRegister = it.method.getInstruction(index + 1).registerA - videoIdInsertIndex = index + 2 + val index = it[1] + videoIdRegister = it.method.getInstruction(index).registerA + videoIdInsertIndex = index + 1 } videoIdBackgroundPlayMethodMatch.let { diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 8ffe3e029f..5694608dfe 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -4,15 +4,13 @@ import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableClassDef import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod +import app.revanced.com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patcher.* import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.util.InstructionUtils.Companion.branchOpcodes -import app.revanced.util.InstructionUtils.Companion.returnOpcodes -import app.revanced.util.InstructionUtils.Companion.writeOpcodes import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode.* @@ -20,6 +18,7 @@ import com.android.tools.smali.dexlib2.analysis.reflection.util.ReflectionUtils import com.android.tools.smali.dexlib2.formatter.DexFormatter import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.MethodParameter import com.android.tools.smali.dexlib2.iface.instruction.* import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -27,158 +26,17 @@ import com.android.tools.smali.dexlib2.iface.reference.Reference import com.android.tools.smali.dexlib2.iface.reference.StringReference import com.android.tools.smali.dexlib2.iface.value.* import com.android.tools.smali.dexlib2.immutable.ImmutableField +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodImplementation import com.android.tools.smali.dexlib2.immutable.value.* import java.util.* -import kotlin.collections.ArrayDeque - -/** - * Starting from and including the instruction at index [startIndex], - * finds the next register that is wrote to and not read from. If a return instruction - * is encountered, then the lowest unused register is returned. - * - * This method can return a non 4-bit register, and the calling code may need to temporarily - * swap register contents if a 4-bit register is required. - * - * @param startIndex Inclusive starting index. - * @param registersToExclude Registers to exclude, and consider as used. For most use cases, - * all registers used in injected code should be specified. - * @throws IllegalArgumentException If a branch or conditional statement is encountered - * before a suitable register is found. - */ -fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): Int { - if (implementation == null) { - throw IllegalArgumentException("Method has no implementation: $this") - } - if (startIndex < 0 || startIndex >= instructions.count()) { - throw IllegalArgumentException("startIndex out of bounds: $startIndex") - } - - // Highest 4-bit register available, exclusive. Ideally return a free register less than this. - val maxRegister4Bits = 16 - var bestFreeRegisterFound: Int? = null - val usedRegisters = registersToExclude.toMutableSet() - - for (i in startIndex until instructions.count()) { - val instruction = getInstruction(i) - val instructionRegisters = instruction.registersUsed - - val writeRegister = instruction.writeRegister - if (writeRegister != null) { - if (writeRegister !in usedRegisters) { - // Verify the register is only used for write and not also as a parameter. - // If the instruction uses the write register once then it's not also a read register. - if (instructionRegisters.count { register -> register == writeRegister } == 1) { - if (writeRegister < maxRegister4Bits) { - // Found an ideal register. - return writeRegister - } - - // Continue searching for a 4-bit register if available. - if (bestFreeRegisterFound == null || writeRegister < bestFreeRegisterFound) { - bestFreeRegisterFound = writeRegister - } - } - } - } - - usedRegisters.addAll(instructionRegisters) - - if (instruction.isBranchInstruction) { - if (bestFreeRegisterFound != null) { - return bestFreeRegisterFound - } - // This method is simple and does not follow branching. - throw IllegalArgumentException( - "Encountered a branch statement before " + - "a free register could be found from startIndex: $startIndex", - ) - } - - if (instruction.isReturnInstruction) { - // Use lowest register that hasn't been encountered. - val freeRegister = (0 until implementation!!.registerCount).find { - it !in usedRegisters - } - if (freeRegister != null) { - return freeRegister - } - if (bestFreeRegisterFound != null) { - return bestFreeRegisterFound - } - - // Somehow every method register was read from before any register was wrote to. - // In practice this never occurs. - throw IllegalArgumentException( - "Could not find a free register from startIndex: " + - "$startIndex excluding: $registersToExclude", - ) - } - } - - // Some methods can have array payloads at the end of the method after a return statement. - // But in normal usage this cannot be reached since a branch or return statement - // will be encountered before the end of the method. - throw IllegalArgumentException("Start index is outside the range of normal control flow: $startIndex") -} - -/** - * @return The registers used by this instruction. - */ -internal val Instruction.registersUsed: List - get() = when (this) { - is FiveRegisterInstruction -> { - when (registerCount) { - 0 -> listOf() - 1 -> listOf(registerC) - 2 -> listOf(registerC, registerD) - 3 -> listOf(registerC, registerD, registerE) - 4 -> listOf(registerC, registerD, registerE, registerF) - else -> listOf(registerC, registerD, registerE, registerF, registerG) - } - } - - is ThreeRegisterInstruction -> listOf(registerA, registerB, registerC) - - is TwoRegisterInstruction -> listOf(registerA, registerB) - - is OneRegisterInstruction -> listOf(registerA) - - is RegisterRangeInstruction -> (startRegister until (startRegister + registerCount)).toList() - - else -> emptyList() - } - -/** - * @return The register that is written to by this instruction, - * or NULL if this is not a write opcode. - */ -internal val Instruction.writeRegister: Int? - get() { - if (this.opcode !in writeOpcodes) { - return null - } - if (this !is OneRegisterInstruction) { - throw IllegalStateException("Not a write instruction: $this") - } - return registerA - } - -/** - * @return If this instruction is an unconditional or conditional branch opcode. - */ -internal val Instruction.isBranchInstruction: Boolean - get() = this.opcode in branchOpcodes - -/** - * @return If this instruction returns or throws. - */ -internal val Instruction.isReturnInstruction: Boolean - get() = this.opcode in returnOpcodes +import kotlin.apply +import kotlin.collections.remove /** * Find the instruction index used for a toString() StringBuilder write of a given String name. * - * @param fieldName The name of the field to find. Partial matches are allowed. + * @param fieldName The name of the field to find. Partial matches are allowed. */ private fun Method.findInstructionIndexFromToString(fieldName: String): Int { val stringIndex = indexOfFirstInstruction { @@ -231,7 +89,7 @@ private fun Method.findInstructionIndexFromToString(fieldName: String): Int { /** * Find the method used for a toString() StringBuilder write of a given String name. * - * @param fieldName The name of the field to find. Partial matches are allowed. + * @param fieldName The name of the field to find. Partial matches are allowed. */ context(context: BytecodePatchContext) internal fun Method.findMethodFromToString(fieldName: String): MutableMethod { @@ -242,7 +100,7 @@ internal fun Method.findMethodFromToString(fieldName: String): MutableMethod { /** * Find the field used for a toString() StringBuilder write of a given String name. * - * @param fieldName The name of the field to find. Partial matches are allowed. + * @param fieldName The name of the field to find. Partial matches are allowed. */ internal fun Method.findFieldFromToString(fieldName: String): FieldReference { val methodUsageIndex = findInstructionIndexFromToString(fieldName) @@ -285,25 +143,6 @@ fun MutableMethod.injectHideViewCall( "invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V", ) -/** - * Inserts instructions at a given index, using the existing control flow label at that index. - * Inserted instructions can have it's own control flow labels as well. - * - * Effectively this changes the code from: - * :label - * (original code) - * - * Into: - * :label - * (patch code) - * (original code) - */ -// TODO: delete this on next major version bump. -fun MutableMethod.addInstructionsAtControlFlowLabel( - insertIndex: Int, - instructions: String, -) = addInstructionsAtControlFlowLabel(insertIndex, instructions, *arrayOf()) - /** * Inserts instructions at a given index, using the existing control flow label at that index. * Inserted instructions can have it's own control flow labels as well. @@ -819,8 +658,197 @@ private fun MutableMethod.checkReturnType(expectedTypes: Iterable>) { check(expectedTypes.any { returnTypeJava == it.name }) { "Actual return type $returnTypeJava is not contained in expected types: $expectedTypes" } + } +/** + * Additional registers effectively take the place of the pX parameters (p0, p1, p2, etc.) + * and contain the original contents of the method parameters. + * Added registers always start at index: `originalMethod.implementation!!.registerCount` of the + * original uncloned method. + * + * **Fingerprint match indexes will be increased positively by [numberOfParameterRegistersLogical]**. + */ +context(_: BytecodePatchContext) +fun Method.cloneMutableAndPreserveParameters() = + cloneMutableAndPreserveParameters(classDef) + +/** + * Additional registers effectively take the place of the pX parameters (p0, p1, p2, etc.) + * and contain the original contents of the method parameters. + * Added registers always start at index: `originalMethod.implementation!!.registerCount` of the + * original uncloned method. + * + * **Fingerprint match indexes will be increased positively by [numberOfParameterRegistersLogical]**. + */ +fun Method.cloneMutableAndPreserveParameters(mutableClassDef : MutableClassDef) : MutableMethod { + check (!AccessFlags.STATIC.isSet(accessFlags) || parameters.isNotEmpty()) { + "Static methods have no parameter registers to preserve" + } + + val clonedMethod = cloneMutable( + additionalRegisters = numberOfParameterRegisters + ) + + // Replace existing method with cloned with more registers. + mutableClassDef.methods.apply { + remove(this@cloneMutableAndPreserveParameters) + add(clonedMethod) + } + + return clonedMethod +} + +// Adapted from BiliRoamingX: +// https://github.com/BiliRoamingX/BiliRoamingX/blob/ae58109f3acdd53ec2d2b3fb439c2a2ef1886221/patches/src/main/kotlin/app/revanced/patches/bilibili/utils/Extenstions.kt#L51 +/** + * Additional registers effectively take the place of the pX parameters (p0, p1, p2, etc.) + * and contain the original contents of the method parameters. + * Added registers always start at index: `originalMethod.implementation!!.registerCount` of the + * original uncloned method. + * + * **Fingerprint match indexes will be increased positively by [additionalRegisters]**. + */ +fun Method.cloneMutable( + name: String = this.name, + accessFlags: Int = this.accessFlags, + parameters: List = this.parameters, + returnType: String = this.returnType, + additionalRegisters: Int = 0, +): MutableMethod { + check(additionalRegisters >= 0) { + "Additional registers cannot be negative" + } + + val implementationExists = implementation != null + val oldFirstParameterRegister = if (implementationExists) p0Register else 0 + + val clonedImplementation = implementation?.let { + ImmutableMethodImplementation( + it.registerCount + additionalRegisters, + it.instructions, + it.tryBlocks, + it.debugItems, + ) + } + + return ImmutableMethod( + definingClass, + name, + parameters, + returnType, + accessFlags, + annotations, + hiddenApiRestrictions, + clonedImplementation + ).toMutable().apply { + var insertIndex = 0 + var addedInstructions = 0 + val isNotStatic = !AccessFlags.STATIC.isSet(accessFlags) + + if (implementationExists && additionalRegisters > 0 && (parameters.isNotEmpty() || isNotStatic)) { + var destReg = oldFirstParameterRegister + var pReg = 0 + + // Handle `this`. + if (isNotStatic) { + addInstructions(insertIndex++, "move-object/from16 v$destReg, p$pReg") + addedInstructions++ + destReg += 1 + pReg += 1 + } + + // Handle method parameters. + for (parameter in parameters) { + val opcode = when (parameter.type) { + "J", "D" -> "move-wide/from16" + else -> { + if (parameter.type.startsWith('L') || parameter.type.startsWith('[')) { + "move-object/from16" + } else { + "move/from16" + } + } + } + + addInstructions(insertIndex++, "$opcode v$destReg, p$pReg") + addedInstructions++ + + val width = if (opcode.startsWith("move-wide")) 2 else 1 + destReg += width + pReg += width + } + + if (addedInstructions != numberOfParameterRegistersLogical) { + throw IllegalStateException( + "Added instructions do not match additional registers " + + "addedInstructions: $addedInstructions " + + "numberOfParameterRegistersLogical: $numberOfParameterRegistersLogical" + ) + } + } + } +} + +/** + * @return The number of registers for all parameters, including p0. + * This includes 2 registers for each wide parameter. + */ +val Method.numberOfParameterRegisters: Int + get() { + var count = 0 + + if (!AccessFlags.STATIC.isSet(accessFlags)) { + count += 1 + } + + for (param in parameters) { + count += when (param.type) { + "J", "D" -> 2 // wide + else -> 1 // normal + } + } + + return count + } + +/** + * @return The number of parameter registers, including p0 as 'this' if method is not static. + * This differs from [numberOfParameterRegisters] in that long/double parameters are counted only once each. + */ +val Method.numberOfParameterRegistersLogical: Int + get() = parameters.count() + if (AccessFlags.STATIC.isSet(accessFlags)) { + 0 + } else { + 1 + } + +/** + * @return the actual register number of p0 for this method. + * Throws if the method has no implementation. + */ +val Method.p0Register: Int + get() { + val impl = implementation ?: throw IllegalStateException("Method has no implementation: $this") + var paramRegs = 0 + + // Count explicit parameters (wide types take 2 registers). + for (type in this.parameterTypes) { + paramRegs += if (type == "J" || type == "D") 2 else 1 + } + + // Add implicit 'this' for non-static methods. + if (!AccessFlags.STATIC.isSet(this.accessFlags)) { + paramRegs += 1 + } + + val totalRegs = impl.registerCount + + return totalRegs - paramRegs + } + +private const val RETURN_TYPE_MISMATCH = "Mismatch between override type and Method return type" + /** * Overrides the first instruction of a method with returning the default value for the type (or `void`). * None of the method code will ever execute. @@ -1253,61 +1281,3 @@ fun MutablePredicateList.literal(literalSupplier: () -> Long) { custom { containsLiteralInstruction(literalSupplier()) } } -private class InstructionUtils { - companion object { - val branchOpcodes: EnumSet = EnumSet.of( - GOTO, GOTO_16, GOTO_32, - IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE, - IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ, - PACKED_SWITCH_PAYLOAD, SPARSE_SWITCH_PAYLOAD, - ) - - val returnOpcodes: EnumSet = EnumSet.of( - RETURN_VOID, - RETURN, - RETURN_WIDE, - RETURN_OBJECT, - RETURN_VOID_NO_BARRIER, - THROW, - ) - - val writeOpcodes: EnumSet = EnumSet.of( - ARRAY_LENGTH, - INSTANCE_OF, - NEW_INSTANCE, NEW_ARRAY, - MOVE, MOVE_FROM16, MOVE_16, MOVE_WIDE, MOVE_WIDE_FROM16, MOVE_WIDE_16, MOVE_OBJECT, - MOVE_OBJECT_FROM16, MOVE_OBJECT_16, MOVE_RESULT, MOVE_RESULT_WIDE, MOVE_RESULT_OBJECT, MOVE_EXCEPTION, - CONST, CONST_4, CONST_16, CONST_HIGH16, CONST_WIDE_16, CONST_WIDE_32, - CONST_WIDE, CONST_WIDE_HIGH16, CONST_STRING, CONST_STRING_JUMBO, - IGET, IGET_WIDE, IGET_OBJECT, IGET_BOOLEAN, IGET_BYTE, IGET_CHAR, IGET_SHORT, - IGET_VOLATILE, IGET_WIDE_VOLATILE, IGET_OBJECT_VOLATILE, - SGET, SGET_WIDE, SGET_OBJECT, SGET_BOOLEAN, SGET_BYTE, SGET_CHAR, SGET_SHORT, - SGET_VOLATILE, SGET_WIDE_VOLATILE, SGET_OBJECT_VOLATILE, - AGET, AGET_WIDE, AGET_OBJECT, AGET_BOOLEAN, AGET_BYTE, AGET_CHAR, AGET_SHORT, - // Arithmetic and logical operations. - ADD_DOUBLE_2ADDR, ADD_DOUBLE, ADD_FLOAT_2ADDR, ADD_FLOAT, ADD_INT_2ADDR, - ADD_INT_LIT8, ADD_INT, ADD_LONG_2ADDR, ADD_LONG, ADD_INT_LIT16, - AND_INT_2ADDR, AND_INT_LIT8, AND_INT_LIT16, AND_INT, AND_LONG_2ADDR, AND_LONG, - DIV_DOUBLE_2ADDR, DIV_DOUBLE, DIV_FLOAT_2ADDR, DIV_FLOAT, DIV_INT_2ADDR, - DIV_INT_LIT16, DIV_INT_LIT8, DIV_INT, DIV_LONG_2ADDR, DIV_LONG, - DOUBLE_TO_FLOAT, DOUBLE_TO_INT, DOUBLE_TO_LONG, - FLOAT_TO_DOUBLE, FLOAT_TO_INT, FLOAT_TO_LONG, - INT_TO_BYTE, INT_TO_CHAR, INT_TO_DOUBLE, INT_TO_FLOAT, INT_TO_LONG, INT_TO_SHORT, - LONG_TO_DOUBLE, LONG_TO_FLOAT, LONG_TO_INT, - MUL_DOUBLE_2ADDR, MUL_DOUBLE, MUL_FLOAT_2ADDR, MUL_FLOAT, MUL_INT_2ADDR, - MUL_INT_LIT16, MUL_INT_LIT8, MUL_INT, MUL_LONG_2ADDR, MUL_LONG, - NEG_DOUBLE, NEG_FLOAT, NEG_INT, NEG_LONG, - NOT_INT, NOT_LONG, - OR_INT_2ADDR, OR_INT_LIT16, OR_INT_LIT8, OR_INT, OR_LONG_2ADDR, OR_LONG, - REM_DOUBLE_2ADDR, REM_DOUBLE, REM_FLOAT_2ADDR, REM_FLOAT, REM_INT_2ADDR, - REM_INT_LIT16, REM_INT_LIT8, REM_INT, REM_LONG_2ADDR, REM_LONG, - RSUB_INT_LIT8, RSUB_INT, - SHL_INT_2ADDR, SHL_INT_LIT8, SHL_INT, SHL_LONG_2ADDR, SHL_LONG, - SHR_INT_2ADDR, SHR_INT_LIT8, SHR_INT, SHR_LONG_2ADDR, SHR_LONG, - SUB_DOUBLE_2ADDR, SUB_DOUBLE, SUB_FLOAT_2ADDR, SUB_FLOAT, SUB_INT_2ADDR, - SUB_INT, SUB_LONG_2ADDR, SUB_LONG, - USHR_INT_2ADDR, USHR_INT_LIT8, USHR_INT, USHR_LONG_2ADDR, USHR_LONG, - XOR_INT_2ADDR, XOR_INT_LIT16, XOR_INT_LIT8, XOR_INT, XOR_LONG_2ADDR, XOR_LONG, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/util/FreeRegisterProvider.kt b/patches/src/main/kotlin/app/revanced/util/FreeRegisterProvider.kt new file mode 100644 index 0000000000..c309e05368 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/util/FreeRegisterProvider.kt @@ -0,0 +1,575 @@ +package app.revanced.util + +import app.revanced.patcher.extensions.getInstruction +import app.revanced.patcher.extensions.instructions +import app.revanced.util.FreeRegisterProvider.Companion.conditionalBranchOpcodes +import app.revanced.util.FreeRegisterProvider.Companion.logFreeRegisterSearch +import app.revanced.util.FreeRegisterProvider.Companion.returnOpcodes +import app.revanced.util.FreeRegisterProvider.Companion.switchOpcodes +import app.revanced.util.FreeRegisterProvider.Companion.unconditionalBranchOpcodes +import app.revanced.util.FreeRegisterProvider.Companion.writeOpcodes +import com.android.tools.smali.dexlib2.Format +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.Opcode.* +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.Instruction +import com.android.tools.smali.dexlib2.iface.instruction.OffsetInstruction +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.RegisterRangeInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ThreeRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import java.util.EnumSet +import java.util.LinkedList + +/** + * Finds free registers at a specific index in a method. + * Allows allocating multiple free registers for a given index. + * + * If you only need a single free register, instead use [findFreeRegister]. + * + * @param index Index you need a use a free register at. + * @param numberOfFreeRegistersNeeded The maximum number of free registers you may get using + * [FreeRegisterProvider.getFreeRegister]. + * @param registersToExclude Registers to exclude, and consider as used. For most use cases, + * all registers used in injected code should be specified. + * + * @throws IllegalArgumentException If no free registers can be found at the given index. + * This includes unusual method indexes that read from every register + * before any registers are wrote to, or if a switch statement is + * encountered before any free registers are found. + */ +fun Method.getFreeRegisterProvider(index: Int, numberOfFreeRegistersNeeded: Int, registersToExclude: List) = + FreeRegisterProvider(this, index, numberOfFreeRegistersNeeded, registersToExclude) + +/** + * Finds free registers at a specific index in a method. + * Allows allocating multiple free registers for a given index. + * + * If you only need a single free register, instead use [findFreeRegister]. + * + * @param index Index you need a use a free register at. + * @param numberOfFreeRegistersNeeded The minimum free registers to find. + * @param registersToExclude Registers to exclude, and consider as used. For most use cases, + * all registers used in injected code should be specified. + * + * @throws IllegalArgumentException If no free registers can be found at the given index. + * This includes unusual method indexes that read from every register + * before any registers are wrote to, or if a switch statement is + * encountered before any free registers are found. + */ +fun Method.getFreeRegisterProvider(index: Int, numberOfFreeRegistersNeeded: Int, vararg registersToExclude: Int) = + FreeRegisterProvider(this, index, numberOfFreeRegistersNeeded, *registersToExclude) + +class FreeRegisterProvider internal constructor( + val method: Method, + index: Int, + numberOfFreeRegistersNeeded: Int, + registersToExclude: List +) { + internal constructor( + method: Method, + index: Int, + numberOfFreeRegistersNeeded: Int, + vararg registersToExclude: Int + ) : this(method, index, numberOfFreeRegistersNeeded, registersToExclude.toList()) + + private var freeRegisters: MutableList = LinkedList( + method.findFreeRegisters(index, numberOfFreeRegistersNeeded, registersToExclude) + ) + + private val originallyExcludedRegisters = registersToExclude + private val allocatedFreeRegisters = mutableListOf() + + /** + * Returns a free register and removes it from the available list. + * + * @return A free register number + * @throws IllegalStateException if no free registers are available + */ + fun getFreeRegister(): Int { + if (freeRegisters.isEmpty()) { + throw IllegalStateException("No free registers available") + } + val register = freeRegisters.removeFirst() + allocatedFreeRegisters.add(register) + return register + } + + /** + * Returns all registers that have been allocated via [getFreeRegister]. + * This does not include the originally excluded registers. + * + * @return List of registers that have been allocated, in allocation order + */ + fun getAllocatedFreeRegisters(): List = allocatedFreeRegisters.toList() + + /** + * Returns all registers that are considered "in use" or unsafe to use. This includes the + * excluded registers originally passed in, all registers that are unsuitable to use + * (registers are read from by the original code), and all free registers previously provided + * by this class using [getFreeRegister]. + * + * @return List of all registers that are unsafe to use at this time. + */ + fun getUsedAndUnAvailableRegisters(): List { + val allRegisters = 0 until method.implementation!!.registerCount + return (allocatedFreeRegisters + originallyExcludedRegisters + (allRegisters - freeRegisters.toSet())) + .distinct() + } + + /** + * @return The number of free registers still available. + */ + fun availableCount(): Int = freeRegisters.size + + /** + * Checks if there are any free registers available. + */ + fun hasFreeRegisters(): Boolean = freeRegisters.isNotEmpty() + + internal companion object { + val conditionalBranchOpcodes: EnumSet = EnumSet.of( + IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE, + IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ + ) + + val unconditionalBranchOpcodes: EnumSet = EnumSet.of( + GOTO, GOTO_16, GOTO_32 + ) + + val switchOpcodes: EnumSet = EnumSet.of( + PACKED_SWITCH, SPARSE_SWITCH + ) + + val returnOpcodes: EnumSet = EnumSet.of( + RETURN_VOID, RETURN, RETURN_WIDE, RETURN_OBJECT, RETURN_VOID_NO_BARRIER, + THROW + ) + + val writeOpcodes: EnumSet = EnumSet.of( + ARRAY_LENGTH, + INSTANCE_OF, + NEW_INSTANCE, NEW_ARRAY, + MOVE, MOVE_FROM16, MOVE_16, MOVE_WIDE, MOVE_WIDE_FROM16, MOVE_WIDE_16, MOVE_OBJECT, + MOVE_OBJECT_FROM16, MOVE_OBJECT_16, MOVE_RESULT, MOVE_RESULT_WIDE, MOVE_RESULT_OBJECT, MOVE_EXCEPTION, + CONST, CONST_4, CONST_16, CONST_HIGH16, CONST_WIDE_16, CONST_WIDE_32, + CONST_WIDE, CONST_WIDE_HIGH16, CONST_STRING, CONST_STRING_JUMBO, + IGET, IGET_WIDE, IGET_OBJECT, IGET_BOOLEAN, IGET_BYTE, IGET_CHAR, IGET_SHORT, + IGET_VOLATILE, IGET_WIDE_VOLATILE, IGET_OBJECT_VOLATILE, + SGET, SGET_WIDE, SGET_OBJECT, SGET_BOOLEAN, SGET_BYTE, SGET_CHAR, SGET_SHORT, + SGET_VOLATILE, SGET_WIDE_VOLATILE, SGET_OBJECT_VOLATILE, + AGET, AGET_WIDE, AGET_OBJECT, AGET_BOOLEAN, AGET_BYTE, AGET_CHAR, AGET_SHORT, + // Arithmetic and logical operations. + ADD_DOUBLE_2ADDR, ADD_DOUBLE, ADD_FLOAT_2ADDR, ADD_FLOAT, ADD_INT_2ADDR, + ADD_INT_LIT8, ADD_INT, ADD_LONG_2ADDR, ADD_LONG, ADD_INT_LIT16, + AND_INT_2ADDR, AND_INT_LIT8, AND_INT_LIT16, AND_INT, AND_LONG_2ADDR, AND_LONG, + DIV_DOUBLE_2ADDR, DIV_DOUBLE, DIV_FLOAT_2ADDR, DIV_FLOAT, DIV_INT_2ADDR, + DIV_INT_LIT16, DIV_INT_LIT8, DIV_INT, DIV_LONG_2ADDR, DIV_LONG, + DOUBLE_TO_FLOAT, DOUBLE_TO_INT, DOUBLE_TO_LONG, + FLOAT_TO_DOUBLE, FLOAT_TO_INT, FLOAT_TO_LONG, + INT_TO_BYTE, INT_TO_CHAR, INT_TO_DOUBLE, INT_TO_FLOAT, INT_TO_LONG, INT_TO_SHORT, + LONG_TO_DOUBLE, LONG_TO_FLOAT, LONG_TO_INT, + MUL_DOUBLE_2ADDR, MUL_DOUBLE, MUL_FLOAT_2ADDR, MUL_FLOAT, MUL_INT_2ADDR, + MUL_INT_LIT16, MUL_INT_LIT8, MUL_INT, MUL_LONG_2ADDR, MUL_LONG, + NEG_DOUBLE, NEG_FLOAT, NEG_INT, NEG_LONG, + NOT_INT, NOT_LONG, + OR_INT_2ADDR, OR_INT_LIT16, OR_INT_LIT8, OR_INT, OR_LONG_2ADDR, OR_LONG, + REM_DOUBLE_2ADDR, REM_DOUBLE, REM_FLOAT_2ADDR, REM_FLOAT, REM_INT_2ADDR, + REM_INT_LIT16, REM_INT_LIT8, REM_INT, REM_LONG_2ADDR, REM_LONG, + RSUB_INT_LIT8, RSUB_INT, + SHL_INT_2ADDR, SHL_INT_LIT8, SHL_INT, SHL_LONG_2ADDR, SHL_LONG, + SHR_INT_2ADDR, SHR_INT_LIT8, SHR_INT, SHR_LONG_2ADDR, SHR_LONG, + SUB_DOUBLE_2ADDR, SUB_DOUBLE, SUB_FLOAT_2ADDR, SUB_FLOAT, SUB_INT_2ADDR, + SUB_INT, SUB_LONG_2ADDR, SUB_LONG, + USHR_INT_2ADDR, USHR_INT_LIT8, USHR_INT, USHR_LONG_2ADDR, USHR_LONG, + XOR_INT_2ADDR, XOR_INT_LIT16, XOR_INT_LIT8, XOR_INT, XOR_LONG_2ADDR, XOR_LONG, + ) + + /** + * For debugging and development. + */ + internal const val logFreeRegisterSearch = false + } +} + +/** + * Starting from and including the instruction at index [index], + * finds the next register that is written to and not read from. If a return instruction + * is encountered, then the lowest unused register is returned. + * + * This method should work for all situations including inserting at a branch statement, + * but this may not work if the index is at or just before a switch statement or if the branch + * paths have no common free registers. + * + * If you need multiple free registers, then instead use [Method.getFreeRegisterProvider]. + * + * @param index Index you need a use a free register at. + * @param registersToExclude Registers to exclude, and consider as used. For most use cases, + * all registers used in injected code should be specified. + * @return The lowest register number (usually a 4-bit register) that is free at the given index. + * @throws IllegalArgumentException If no free registers can be found at the given index. + * This includes unusual method indexes that read from every register + * before any registers are wrote to, or if a switch statement is + * encountered before any free registers are found, or if the index is + * at/before a branch statement and the method has an unusually high + * amount of branching where no common free registers exist in both branch paths. + */ +fun Method.findFreeRegister( + index: Int, + vararg registersToExclude: Int +) = findFreeRegisters( + startIndex = index, + numberOfFreeRegistersNeeded = 1, + registersToExclude = registersToExclude.toList() +).first() + +/** + * Starting from and including the instruction at index [index], + * finds the next register that is written to and not read from. If a return instruction + * is encountered, then the lowest unused register is returned. + * + * This method should work for all situations including inserting at a branch statement, + * but this may not work if the index is at or just before a switch statement or if the branch + * paths have no common free registers. + * + * If you need multiple free registers, then instead use [Method.getFreeRegisterProvider]. + * + * @param index Index you need a use a free register at. + * @param registersToExclude Registers to exclude, and consider as used. For most use cases, + * all registers used in injected code should be specified. + * @return The lowest register number (usually a 4-bit register) that is free at the given index. + * @throws IllegalArgumentException If no free registers can be found at the given index. + * This includes unusual method indexes that read from every register + * before any registers are wrote to, or if a switch statement is + * encountered before any free registers are found, or if the index is + * at/before a branch statement and the method has an unusually high + * amount of branching where no common free registers exist in both branch paths. + */ +fun Method.findFreeRegister( + index: Int, + registersToExclude: List +) = findFreeRegisters( + startIndex = index, + numberOfFreeRegistersNeeded = 1, + registersToExclude = registersToExclude +).first() + +private fun Method.findFreeRegisters( + startIndex: Int, + numberOfFreeRegistersNeeded: Int, + registersToExclude: List +): List { + if (logFreeRegisterSearch) println("Searching startIndex: $startIndex method: $this") + + val freeRegisters = findFreeRegistersInternal( + startIndex = startIndex, + numberOfFreeRegistersNeeded = numberOfFreeRegistersNeeded, + currentDepth = 0, + foundFreeRegistersAtIndex = mutableMapOf(), + registersToExclude = registersToExclude, + offsetArray = buildInstructionOffsetArray() + ) + + if (freeRegisters.isEmpty()) { + // Should only happen if a switch statement is encountered before enough free registers are found. + throw IllegalArgumentException("Could not find a free register from startIndex: " + + "$startIndex excluding: $registersToExclude") + } + + if (logFreeRegisterSearch) println("Final free registers found: $freeRegisters") + + // Use 4-bit registers first, but keep sorting stable among 4-bit vs not 4-bit. + return freeRegisters.sortedWith { first, second -> + val firstIsFourBit = first < 16 + val secondIsFourBit = second < 16 + if (firstIsFourBit == secondIsFourBit) { + return@sortedWith 0 + } + + if (firstIsFourBit) -1 else 1 + } +} + +/** + * Returns all free registers found starting from [startIndex].Follows branches up to [maxDepth]. + * + * @param startIndex Inclusive starting index. + * @param numberOfFreeRegistersNeeded The minimum free registers to ensure will be returned. + * @param currentDepth Current branching depth. Value of zero means no branching has been followed yet. + * @param foundFreeRegistersAtIndex Map of instruction index to list of free registers previously found. + * @param registersToExclude Registers to exclude from consideration. + * @param offsetArray Map from instruction index to code offset. + * @return List of all free registers found. + */ +private fun Method.findFreeRegistersInternal( + startIndex: Int, + numberOfFreeRegistersNeeded: Int, + currentDepth: Int, + foundFreeRegistersAtIndex: MutableMap?>, + registersToExclude: List, + offsetArray: IntArray +): List { + check(implementation != null) { + "Method has no implementation: $this" + } + check(startIndex > 0 && startIndex < instructions.count()) { + "startIndex out of bounds: $startIndex methodInstructionCount: ${instructions.count()}" + } + check(numberOfFreeRegistersNeeded > 0) { + "numberOfFreeRegistersNeeded must be greater than zero: $numberOfFreeRegistersNeeded" + } + + fun Collection.numberOf4BitRegisters() = this.count { it < 16 } + + foundFreeRegistersAtIndex[startIndex]?.let { + // Recursive call to a branch index that has already been explored. + return (it - registersToExclude.toSet()).toList() + } + + val usedRegisters = registersToExclude.toMutableSet() + val freeRegisters = mutableSetOf() + foundFreeRegistersAtIndex[startIndex] = freeRegisters + + for (i in startIndex until instructions.count()) { + val instruction = getInstruction(i) + val instructionRegisters = instruction.registersUsed + + // Check for write-only register. + val writeRegister = instruction.writeRegister + if (writeRegister != null && writeRegister !in usedRegisters) { + // Check if this register is ONLY written to (not also read) + // Count occurrences of writeRegister in instructionRegisters. + val occurrences = instructionRegisters.count { it == writeRegister } + // If it appears only once, it's write-only (to write). + // If it appears more than once, it's also read. + if (occurrences <= 1) { + if (logFreeRegisterSearch) println("Found free register at $i: $writeRegister " + + "opcode: " + instruction.opcode + " reference: " + (instruction.getReference())) + freeRegisters.add(writeRegister) + // If the requested number of free registers is found and this is not a branch, + // then no additional searching is needed. + // But if this is a branch, then this all free registers should be found + // because the intersection of free registers from different branches may be + // less than the requested number of registers. + if (currentDepth == 0 && freeRegisters.numberOf4BitRegisters() >= numberOfFreeRegistersNeeded) { + return freeRegisters.toList() + } + } + } + + // Mark all registers used by this instruction as "used". + usedRegisters.addAll(instructionRegisters) + + // If we hit a return, all unused registers on this path are free. + if (instruction.isReturnInstruction) { + val allRegisters = (0 until implementation!!.registerCount).toList() + val unusedRegisters = allRegisters - usedRegisters + freeRegisters.addAll(unusedRegisters) + if (logFreeRegisterSearch) println("Encountered return index: $i and found: $freeRegisters") + return freeRegisters.toList() + } + + if (instruction.isSwitchInstruction) { + // For now, do not handle the complexity of a switch statement and handle as a leaf node. + if (logFreeRegisterSearch) println("Encountered switch index: $i opcode: " + instruction.opcode) + return freeRegisters.toList() + } + + if (instruction.isUnconditionalBranchInstruction) { + if (logFreeRegisterSearch) println("encountered unconditional branch index: $i opcode: " + instruction.opcode) + + // Continue searching from the go-to index. + return (freeRegisters + findFreeRegistersInternal( + startIndex = getBranchTargetInstructionIndex(instruction, i, offsetArray), + numberOfFreeRegistersNeeded = numberOfFreeRegistersNeeded, + currentDepth = currentDepth, // Same depth since it's a continuation of single path. + foundFreeRegistersAtIndex = foundFreeRegistersAtIndex, + registersToExclude = usedRegisters.toList(), + offsetArray = offsetArray + )).toList() + } + + if (instruction.isConditionalBranchInstruction) { + if (logFreeRegisterSearch) println("encountered conditional branch index: $i opcode: " + instruction.opcode) + val usedRegistersList = usedRegisters.toList() + + val branchFreeRegisters = findFreeRegistersInternal( + startIndex = getBranchTargetInstructionIndex(instruction, i, offsetArray), + numberOfFreeRegistersNeeded = numberOfFreeRegistersNeeded, + currentDepth = currentDepth + 1, + foundFreeRegistersAtIndex = foundFreeRegistersAtIndex, + registersToExclude = usedRegistersList, + offsetArray = offsetArray + ) + if (logFreeRegisterSearch) println("branch registers: $branchFreeRegisters") + + val fallThruFreeRegisters = findFreeRegistersInternal( + startIndex = i + 1, + numberOfFreeRegistersNeeded = numberOfFreeRegistersNeeded, + currentDepth = currentDepth + 1, + foundFreeRegistersAtIndex = foundFreeRegistersAtIndex, + registersToExclude = usedRegistersList, + offsetArray = offsetArray + ) + if (logFreeRegisterSearch) println("fall thru registers: $fallThruFreeRegisters") + + return (freeRegisters + branchFreeRegisters.intersect(fallThruFreeRegisters.toSet())).toList() + } + } + + // A return or branch instruction will be encountered before all instructions can be iterated. + // Some methods have switch payload instructions after the last actual instruction, + // but these cannot be reached through normal control flow. + throw IllegalArgumentException("Start index is outside normal control flow: $startIndex") +} + +private fun Method.buildInstructionOffsetArray(): IntArray { + val instructionCount = instructions.count() + val offsetArray = IntArray(instructionCount) { -1 } + var currentOffset = 0 + + for (i in 0 until instructionCount) { + val instruction = getInstruction(i) + val format = instruction.opcode.format + + if (!format.isPayloadFormat) { + offsetArray[i] = currentOffset + + // Get size in bytes from format. + val sizeInBytes = format.size + val sizeInCodeUnits = when { + sizeInBytes > 0 -> sizeInBytes / 2 // Normal instruction + format == Format.UnresolvedOdexInstruction -> 1 // Default size + else -> 1 // Fallback for any other edge case + } + + currentOffset += sizeInCodeUnits + } + // Skip payloads + } + + return offsetArray +} + +/** + * Returns an instruction index for a given branch instruction. + * + * @param instruction The branch instruction + * @param index Current instruction index + * @param offsetArray Array mapping instruction index to code offset. + */ +private fun Method.getBranchTargetInstructionIndex( + instruction: Instruction, + index: Int, + offsetArray: IntArray +): Int { + check (index >0 && index < offsetArray.size) { + "Invalid index: $index" + } + val currentOffset = offsetArray[index] + + return when (instruction.opcode) { + GOTO, GOTO_16, GOTO_32, + IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE, + IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ -> { + val offset = (instruction as OffsetInstruction).codeOffset + val targetOffset = currentOffset + offset + // Find the instruction index at this offset. + findInstructionIndexByOffset(targetOffset, offsetArray) + } + // These need special handling - they jump to payloads + // which then have their own target lists. + // PACKED_SWITCH, SPARSE_SWITCH -> // TODO? + else -> throw IllegalStateException("Unsupported opcode: ${instruction.opcode}") + } +} + +/** + * Finds the instruction index for a given code offset. + * + * @param targetOffset Target code offset in 16-bit units + * @param offsetArray Array mapping instruction index to code offset (-1 for payloads) + * @return Instruction index at the target offset, or null if not found + */ +private fun Method.findInstructionIndexByOffset( + targetOffset: Int, + offsetArray: IntArray +): Int { + // Simple linear search using indexOfFirst + val index = offsetArray.indexOfFirst { it == targetOffset } + if (index >= 0) { + return index + } + + // Should never happen. + // Code has been tested on hundreds of random methods on all instruction indices, + // but maybe some weird code exists that this has overlooked. + throw IllegalArgumentException("Could not find exact instruction offset for method: " + + "$this at offset: $targetOffset." + ) +} + +/** + * @return The registers used by this instruction. + */ +val Instruction.registersUsed: List + get() = when (this) { + is FiveRegisterInstruction -> { + when (registerCount) { + 0 -> listOf() + 1 -> listOf(registerC) + 2 -> listOf(registerC, registerD) + 3 -> listOf(registerC, registerD, registerE) + 4 -> listOf(registerC, registerD, registerE, registerF) + else -> listOf(registerC, registerD, registerE, registerF, registerG) + } + } + + is ThreeRegisterInstruction -> listOf(registerA, registerB, registerC) + is TwoRegisterInstruction -> listOf(registerA, registerB) + is OneRegisterInstruction -> listOf(registerA) + is RegisterRangeInstruction -> (startRegister until (startRegister + registerCount)).toList() + else -> emptyList() + } + +/** + * @return The register that is written to by this instruction, + * or NULL if this is not a write opcode. + */ +val Instruction.writeRegister: Int? + get() { + if (this.opcode !in writeOpcodes) { + return null + } + if (this !is OneRegisterInstruction) { + throw IllegalStateException("Not a write instruction: $this") + } + return registerA + } + +/** + * This differs from [isUnconditionalBranchInstruction] in that it does not include unconditional goto. + * + * @return If this instruction is a conditional branch (multiple branch paths). + */ +internal val Instruction.isConditionalBranchInstruction: Boolean + get() = this.opcode in conditionalBranchOpcodes + +/** + * @return If this instruction is a GOTO opcode. + */ +internal val Instruction.isUnconditionalBranchInstruction: Boolean + get() = this.opcode in unconditionalBranchOpcodes + +/** + * @return If this instruction is a switch opcode. + */ +internal val Instruction.isSwitchInstruction: Boolean + get() = this.opcode in switchOpcodes + +/** + * @return If this instruction returns or throws. + */ +internal val Instruction.isReturnInstruction: Boolean + get() = this.opcode in returnOpcodes diff --git a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt index b2d8ba287f..c1d76a8bb3 100644 --- a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -76,12 +76,16 @@ fun ResourcePatchContext.copyResources( for (resourceGroup in resources) { resourceGroup.resources.forEach { resource -> + // Create the target directory if it doesn't exist. + Files.createDirectories(targetResourceDirectory.resolve(resourceGroup.resourceDirectoryName).toPath()) + val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" val stream = inputStreamFromBundledResource(sourceResourceDirectory, resourceFile) - if (stream == null) { - throw IllegalArgumentException("Could not find resource: $resourceFile " + - "in directory: $sourceResourceDirectory") - } + ?: throw IllegalArgumentException( + "Could not find resource: $resourceFile " + + "in directory: $sourceResourceDirectory" + ) + Files.copy( stream, targetResourceDirectory.resolve(resourceFile).toPath(), @@ -105,8 +109,8 @@ class ResourceGroup(val resourceDirectoryName: String, vararg val resources: Str /** * Iterate through the children of a node by its tag. - * @param resource The xml resource. - * @param targetTag The target xml node. + * @param resource The XML resource. + * @param targetTag The target XML node. * @param callback The callback to call when iterating over the nodes. */ fun ResourcePatchContext.iterateXmlNodeChildren( diff --git a/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt b/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt index c0956257c3..ddd3e6e528 100644 --- a/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt +++ b/patches/src/main/kotlin/app/revanced/util/resource/StringResource.kt @@ -10,7 +10,6 @@ import java.util.logging.Logger * * @param name The name of the string. * @param value The value of the string. - * @param formatted If the string is formatted. Defaults to `true`. */ class StringResource( name: String, diff --git a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml index 3a40645452..76d0bdac9e 100644 --- a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml +++ b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml @@ -75,7 +75,7 @@ Second \"item\" text" - + diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 097a7d9412..0be0a47ed0 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -303,23 +303,19 @@ @string/revanced_spoof_app_version_target_entry_1 @string/revanced_spoof_app_version_target_entry_2 @string/revanced_spoof_app_version_target_entry_3 - @string/revanced_spoof_app_version_target_entry_4 20.13.41 20.05.46 19.35.36 - 19.01.34 @string/revanced_spoof_app_version_target_entry_2 @string/revanced_spoof_app_version_target_entry_3 - @string/revanced_spoof_app_version_target_entry_4 20.05.46 19.35.36 - 19.01.34 19.01.34 @@ -350,8 +346,10 @@ @string/revanced_splash_screen_animation_style_entry_1 @string/revanced_splash_screen_animation_style_entry_2 + @string/revanced_splash_screen_animation_style_entry_3 + DISABLED FPS_60_ONE_SECOND FPS_60_BLACK_AND_WHITE diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 38d270a1d0..4a990f5fda 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -184,6 +184,7 @@ You will not be notified of any unexpected events." Flags saved Flags reset Flags copied to clipboard + Restart the app to use this feature Log protocol buffer Debug logs include proto buffer Debug logs do not include proto buffer @@ -237,6 +238,9 @@ However, enabling this will also log some user data such as your IP address."Shorts background play is enabled + Hide creator store shelf + Creator store shelf under video player is hidden + Creator store shelf under video player is shown Hide album cards Album cards are hidden Album cards are shown @@ -246,6 +250,9 @@ However, enabling this will also log some user data such as your IP address."Hide chips shelf Chips shelf is hidden Chips shelf is shown + Hide comments section under videos in Home feed + Comments section under videos in Home feed is hidden + Comments section under videos in Home feed is shown Hide community posts Community posts are hidden Community posts are shown @@ -274,21 +281,26 @@ However, enabling this will also log some user data such as your IP address."Hide latest posts Latest posts are hidden Latest posts are shown + + Hide \'Latest videos\' button + Latest videos button is hidden + Latest videos button is shown Hide mix playlists Mix playlists are hidden Mix playlists are shown Hide movies section Movies section is hidden Movies section is shown - + Hide \'Notify me\' button Notify me button is hidden Notify me button is shown Hide Playables Playables are hidden Playables are shown - Hide \'Show more\' button Show more button in search results is hidden @@ -306,13 +318,16 @@ However, enabling this will also log some user data such as your IP address."Hide visual spacer Visual spacer is hidden Visual spacer is shown + Hide web search results + Web search results are hidden + Web search results are shown + Hide \'You may like\' section + \'You may like\' section is hidden + \'You may like\' section is shown Hide YouTube Doodles YouTube Doodles animation on the logo is hidden YouTube Doodles animation on the logo is shown - "YouTube Doodles are shown a few days each year. - -If a Doodle is currently showing in your region and this hide setting is on, then the filter bar below the search bar will also be hidden." Hide channel bar Channel bar is hidden Channel bar is shown @@ -329,10 +344,15 @@ If a Doodle is currently showing in your region and this hide setting is on, the Info panels are hidden Info panels are shown + This button usually appears in the video player for certain videos. --> Hide Join button Join button is hidden Join button is shown + + Hide \'Live chat replay\' button + Live chat replay button in player overlay is hidden + Live chat replay button in player overlay is shown Hide medical panels Medical panels are hidden Medical panels are shown @@ -348,6 +368,9 @@ If a Doodle is currently showing in your region and this hide setting is on, the Hide timed reactions Timed reactions are hidden Timed reactions are shown + Hide video title + Video title in player overlay is hidden + Video title in player overlay is shown Hide \'AI-generated video summary\' AI-generated video summary section is hidden AI-generated video summary section is shown @@ -360,33 +383,62 @@ If a Doodle is currently showing in your region and this hide setting is on, the Hide Chapters Chapters section is hidden Chapters section is shown - Hide \'How this content was made\' - How this content was made section is hidden - How this content was made section is shown - Hide Hype points - Hype points are hidden - Hype points are shown + Hide \'Course progress\' + Course progress section is hidden + Course progress section is shown + Hide Explore + Explore this course and Explore the podcast sections are hidden + Explore this course and Explore the podcast sections are shown + Hide \'Explore this course\' + Explore this course section is hidden + Explore this course section is shown + Hide \'Explore the podcast\' + Explore the podcast section is hidden + Explore the podcast section is shown Hide \'Explore the podcast\' Explore the podcast section is hidden Explore the podcast section is shown Hide Featured links Featured links section is hidden Featured links section is shown + Hide \'Featured places\' + Featured places section is hidden + Featured places section is shown Hide Featured videos Featured videos section is hidden Featured videos section is shown + Enable feed flyout menu filter + Feed flyout menu filter is enabled + Feed flyout menu filter is disabled + Feed flyout menu filter + Enter the flyout menu names to filter by, one per line + Hide Gaming + Gaming section is hidden + Gaming section is shown + Hide \'How this content was made\' + How this content was made section is hidden + How this content was made section is shown + Hide Hype points + Hype points are hidden + Hype points are shown Hide Info cards Info cards section is hidden Info cards section is shown Hide \'Key concepts\' Key concepts section is hidden Key concepts section is shown + Hide Music + Music section is hidden + Music section is shown Hide Subscribe button Subscribe button is hidden Subscribe button is shown Hide Transcript Transcript section is hidden Transcript section is shown + Hide Quizzes + Quizzes section is hidden + Quizzes section is shown Video description Hide or show video description components @@ -407,6 +459,11 @@ If a Doodle is currently showing in your region and this hide setting is on, the Channel page Hide or show channel page components + Enable channel tab filter + Channel tab filter is enabled + Channel tab filter is disabled + Channel tab filter + Enter the channel tab names to filter by, one per line Hide Community button Community button is hidden @@ -471,15 +528,15 @@ If a Doodle is currently showing in your region and this hide setting is on, the View count is shown in feed and search results "Limitations: -• Shorts shelves, channel pages, and search results may still show view counts -• This feature does not work with automotive form factor" +• Shorts shelves, channel pages, and search results may still show view counts. +• This feature does not work with automotive form factor." Hide upload time Upload time is hidden in feed and search results Upload time is shown in feed and search results "Limitations: -• Shorts shelves, channel pages, and search results may still show upload times -• This feature does not work with automotive form factor" +• Shorts shelves, channel pages, and search results may still show upload times. +• This feature does not work with automotive form factor." Hide keyword content Hide feed and search videos using keyword filters Hide Home videos by keywords @@ -502,7 +559,7 @@ Words with uppercase letters in the middle must be entered with the casing (ie: About keyword filtering "Home/Subscriptions/Search results are filtered to hide content that matches keyword phrases -Limitations +Limitations: • Shorts cannot be hidden by channel name • Some UI components may not be hidden • Searching for a keyword may show no results" @@ -517,19 +574,12 @@ Limitations Keyword will hide all videos: %s - Hide creator store shelf - Creator store shelf under video player is hidden - Creator store shelf under video player is shown Hide end screen store banner End screen store banner is hidden End screen store banner is shown Hide fullscreen ads - "Fullscreen ads are hidden - -This feature is only available for older devices" + Fullscreen ads are hidden Fullscreen ads are shown - - Hide fullscreen ads only works with older devices Hide general ads General ads are hidden General ads are shown @@ -539,6 +589,9 @@ This feature is only available for older devices" Hide paid promotion label Paid promotion label is hidden Paid promotion label is shown + Hide player popup ads + Player popup ads are hidden + Player popup ads are shown Hide self sponsored cards Self sponsored cards are hidden Self sponsored cards are shown @@ -546,23 +599,18 @@ This feature is only available for older devices" Shopping links in video description are hidden Shopping links in video description are shown Hide view products banner - View products banner in video overlay is hidden - View products banner in video overlay is shown - Hide web search results - Web search results are hidden - Web search results are shown - - - Hide YouTube Premium promotions - YouTube Premium promotions under video player are hidden - YouTube Premium promotions under video player are shown + View products banner in player overlay is hidden + View products banner in player overlay is shown + Hide YouTube Premium promotions + YouTube Premium promotions are hidden + YouTube Premium promotions are shown Hide video ads Video ads are hidden Video ads are shown - + URL copied to clipboard URL with timestamp copied Show copy video URL button @@ -578,10 +626,10 @@ This feature is only available for older devices" Dialog will be shown This does not bypass the age restriction. It just accepts it automatically. - - Disable \'Sign in to TV\' popup - Sign in to TV popup is disabled - Sign in to TV popup is enabled + + Disable \'Sign in to TV\' popup + Sign in to TV popup is disabled + Sign in to TV popup is enabled Disable double tap chapter skip @@ -614,10 +662,10 @@ Verify the package name is correct and the app is installed" Precise seeking gesture is disabled Precise seeking gesture is enabled - - Enable tap to seek - Tap to seek is enabled - Tap to seek is disabled + + Enable tap to seek + Tap to seek is enabled + Tap to seek is disabled Enable brightness gesture @@ -698,7 +746,7 @@ Adjust volume by swiping vertically on the right side of the screen" Comments button is hidden Comments button is shown + This button usually appears on live streamed videos. --> Hide Report Report button is hidden Report button is shown @@ -711,7 +759,7 @@ Adjust volume by swiping vertically on the right side of the screen" Download button is hidden Download button is shown + This button usually appears on videos uploaded by the logged-in user. --> Hide Hype Hype button is hidden Hype button is shown @@ -724,7 +772,7 @@ Adjust volume by swiping vertically on the right side of the screen" Thanks button is hidden Thanks button is shown + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Hide Ask Ask button is hidden Ask button is shown @@ -732,6 +780,7 @@ Adjust volume by swiping vertically on the right side of the screen" Hide Clip Clip button is hidden Clip button is shown + Hiding may not work for some user accounts. Hide Shop Shop button is hidden @@ -741,7 +790,7 @@ Adjust volume by swiping vertically on the right side of the screen" Save button is hidden Save button is shown - + Navigation buttons Hide or change navigation bar buttons @@ -765,29 +814,41 @@ Adjust volume by swiping vertically on the right side of the screen" Notifications button is shown Switch Create with Notifications - "Create button is switched with Notifications button - -Note: Enabling this also forcibly hides video ads" + Create button is switched with Notifications button Create button is not switched with Notifications button - "Disabling this setting will also disable Shorts ad blocking. - -If changing this setting does not take effect, try switching to Incognito mode." + If changing this setting does not take effect, try switching to Incognito mode. Hide navigation button labels Labels are hidden Labels are shown + Enable narrow navigation buttons + Spacing between navigation buttons is narrow + Spacing between navigation buttons is normal Enable navigation bar animations Navigation transitions are animated Navigation transitions are not animated Disable translucent status bar Status bar is opaque Status bar is opaque or translucent - On some devices, enabling this feature can change the system navigation bar to transparent. + "Limitations: +• A black bar may appear at the top of the video player. +• On some devices, enabling this feature can change the system navigation bar to transparent." Disable light translucent bar Light mode navigation bar is opaque Light mode navigation bar is opaque or translucent Disable dark translucent bar Dark mode navigation bar is opaque Dark mode navigation bar is opaque or translucent + Toolbar + Hide or change toolbar components + Hide Create button + Create button is hidden + Create button is shown + Hide Notifications button + Notifications button is hidden + Notifications button is shown + Hide Search button + Search button is hidden + Search button is shown. Flyout menu @@ -862,6 +923,12 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Hide Cast button Cast button is hidden Cast button is shown + Hide Collapse button + Collapse button is hidden + Collapse button is shown + Hide Fullscreen button + Fullscreen button is hidden + Fullscreen button is shown Hide player controls background Player controls background is hidden Player controls background is shown @@ -870,9 +937,9 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Previous & Next buttons are shown - Hide end screen cards - End screen cards are hidden - End screen cards are shown + Hide end screen cards + End screen cards are hidden + End screen cards are shown Disable Ambient mode in fullscreen @@ -904,6 +971,9 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Shorts player Hide or show Shorts player components + Hide Shorts in channel page + Hidden in channel page + Shown in channel page Hide Shorts in Home feed Hidden in Home feed and related videos @@ -915,9 +985,18 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Hide Shorts in Subscriptions feed Hidden in Subscriptions feed Shown in Subscriptions feed + Hide Shorts in video description + Hidden in video description + Shown in video description Hide Shorts in watch history Hidden in watch history Shown in watch history + Hide AI button + AI button is hidden + AI button is shown + Hide \'Auto-dubbed\' label + Auto-dubbed label is hidden + Auto-dubbed label is shown Hide \'Auto-dubbed\' label Auto-dubbed label is hidden Auto-dubbed label is shown @@ -979,6 +1058,7 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Hide \'Use this template\' button Use this template button is hidden Use this template button is shown + Hide Like button fountain animation Like button fountain animation is hidden Like button fountain animation is shown @@ -1021,7 +1101,12 @@ To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK Navigation bar is hidden Navigation bar is shown - + + Hide autoplay preview + Autoplay preview is hidden + Autoplay preview is shown + + Hide end screen suggested video "End screen suggested video is hidden when autoplay is turned off @@ -1117,21 +1202,6 @@ Limitation: Dislikes may not appear in incognito mode" Wide search bar is enabled Wide search bar is disabled - - Enable high quality thumbnails - Seekbar thumbnails are high quality - Seekbar thumbnails are medium quality - Fullscreen seekbar thumbnails are high quality - Fullscreen seekbar thumbnails are medium quality - "This will also restore thumbnails on livestreams that do not have seekbar thumbnails. - -Seekbar thumbnails will use the same quality as the current video. - -This feature works best with a video quality of 720p or lower and when using a very fast internet connection." - Restore old seekbar thumbnails - Seekbar thumbnails will appear above the seekbar - Seekbar thumbnails will appear in fullscreen - SponsorBlock Enable SponsorBlock @@ -1233,7 +1303,7 @@ Your user id is like a password and it should never be shared. Tangent / Jokes Tangential scenes or jokes that are not required to understand the main content of the video. Does not include sections providing context or background details Music: Non-Music Section - Only for use in music videos. Sections of music videos without music, that aren\'t already covered by another category + Only for use in music videos. Sections of music videos without music, that are not already covered by another category Skip Highlight Skip sponsor @@ -1276,8 +1346,8 @@ Your user id is like a password and it should never be shared. SponsorBlock is temporarily down Unable to submit segment (status: %1$d %2$s) Unable to submit segment. Rate Limited (too many from the same user or IP) - Can\'t submit the segment: %s - "Can\'t submit the segment. + Cannot submit the segment: %s + "Cannot submit the segment. Already exists" Segment submitted successfully @@ -1374,7 +1444,6 @@ If later turned off, it is recommended to clear the app data to prevent UI bugs. 20.13.41 - Restore non collapsed video action bar 20.05.46 - Restore transcript functionality 19.35.36 - Restore old Shorts player icons - 19.01.34 - Restore old navigation icons Change start page @@ -1485,8 +1554,9 @@ Swipe to expand or close" Loading screen will have a gradient background Loading screen will have a solid background Splash screen style - Color - Black and white + Disabled + Color + Black and white Enable custom seekbar color Custom seekbar color is shown Original seekbar color is shown @@ -1602,6 +1672,9 @@ Enabling this can unlock higher video qualities" Disable seek undo haptics Seek undo haptics is disabled Seek undo haptics is enabled + Disable tap and hold haptics + Tap and hold haptics is disabled + Tap and hold haptics is enabled Disable zoom haptics Zoom haptics is disabled Zoom haptics is enabled @@ -1697,6 +1770,11 @@ Limitations: Advanced video quality menu is shown Advanced video quality menu is not shown + + Hide Premium quality options + Premium quality options are hidden + Premium quality options are shown + Enable slide to seek Slide to seek is enabled @@ -1732,6 +1810,7 @@ Video playback with AV1 may stutter or drop frames." Music + About Ads General diff --git a/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy.xml b/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy.xml index 1a2ab36293..967bd75071 100644 --- a/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy.xml +++ b/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy.xml @@ -1,6 +1,7 @@ + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy_timestamp.xml b/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy_timestamp.xml index de5835b5be..879ee6a663 100644 --- a/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy_timestamp.xml +++ b/patches/src/main/resources/copyvideourl/drawable/revanced_yt_copy_timestamp.xml @@ -1,7 +1,8 @@ + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/downloads/drawable/revanced_yt_download_button.xml b/patches/src/main/resources/downloads/drawable/revanced_yt_download_button.xml index 18d0944b07..32898a39f1 100644 --- a/patches/src/main/resources/downloads/drawable/revanced_yt_download_button.xml +++ b/patches/src/main/resources/downloads/drawable/revanced_yt_download_button.xml @@ -1,6 +1,7 @@ + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/qualitybutton/drawable/revanced_video_quality_dialog_button_rectangle.xml b/patches/src/main/resources/qualitybutton/drawable/revanced_video_quality_dialog_button_rectangle.xml index 2791f1990a..a4c0785a92 100644 --- a/patches/src/main/resources/qualitybutton/drawable/revanced_video_quality_dialog_button_rectangle.xml +++ b/patches/src/main/resources/qualitybutton/drawable/revanced_video_quality_dialog_button_rectangle.xml @@ -1,9 +1,45 @@ - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/speedbutton/drawable/revanced_playback_speed_dialog_button_rectangle.xml b/patches/src/main/resources/speedbutton/drawable/revanced_playback_speed_dialog_button_rectangle.xml index 2791f1990a..a4c0785a92 100644 --- a/patches/src/main/resources/speedbutton/drawable/revanced_playback_speed_dialog_button_rectangle.xml +++ b/patches/src/main/resources/speedbutton/drawable/revanced_playback_speed_dialog_button_rectangle.xml @@ -1,9 +1,45 @@ - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index edfcf40ede..24d395c4ae 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,6 +13,12 @@ pluginManagement { } } +dependencyResolutionManagement { + repositories { + mavenLocal() + } +} + plugins { id("app.revanced.patches") version "1.0.0-dev.9" } From f59323c87d8da36b39e19936c8ed5c07d3903b16 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:27 +0100 Subject: [PATCH 019/161] fix(Hex patch): Fix bug in implementation of Boyer-Moore algorithm (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From cfcae434652b747345cb31b66748f0cc3220eb4a Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:27 +0100 Subject: [PATCH 020/161] fix(YouTube Music - Navigation bar): Hide library tab with 8.24+ (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 88724d47b13d56a90384b0a2588ba82ccdd5b101 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:27 +0100 Subject: [PATCH 021/161] fix(YouTube - Exit fullscreen mode): Handle exiting fullscreen on first opened video (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 64c397eb1c46bdd77f2b05d03c22a841971bea81 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:28 +0100 Subject: [PATCH 022/161] fix(YouTube - Remove viewer discretion dialog): Not working on 20.14.43+ (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From ad10d760354dba1e8f470972955a706da9b85c02 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:28 +0100 Subject: [PATCH 023/161] fix(YouTube - Return YouTube Dislike): Fix incorrect dislike counts after cancel (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 203388329484616cc83aef2c3bda38a3069839ca Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:28 +0100 Subject: [PATCH 024/161] fix(YouTube - ReturnYouTubeDislike): Fix dislikes not showing with 20.31+ (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 6aba2d127472643c346108d481513442fa9a3fde Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:29 +0100 Subject: [PATCH 025/161] fix(Custom branding): Resolve background playback crash with custom branded root installation (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 3e00a99c1bb3af24f9e8420e8c7c2bbaeb003c6c Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:29 +0100 Subject: [PATCH 026/161] fix(Custom branding): Fix defaults (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 2d098f2352b7dc1f0dc185ac65074443289ef2de Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:29 +0100 Subject: [PATCH 027/161] fix(YouTube - Remove background playback restrictions): Fix background playback not working with certain offline videos (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 3ff303f045c4fbda0331e3f1e9fbba50f97dedab Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:30 +0100 Subject: [PATCH 028/161] fix(YouTube - Hide end screen cards): Resolve patching 20.31.4x (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From ae69bdc1d376a05b6854401586408cb6a9bda7eb Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:30 +0100 Subject: [PATCH 029/161] fix(YouTube - Hide Shorts components): Resolve hiding Shorts not working (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a90a0b1199e66cace3eb1b8c827314ceaf514ecf Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:30 +0100 Subject: [PATCH 030/161] fix(YouTube - Hide Shorts components): Action buttons not hidden in 20.22+ (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a6b8d2f1039b7896b21826a46f3f13b32d16b51d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:31 +0100 Subject: [PATCH 031/161] fix(YouTube - Hide Shorts components): Hide new type of sound metadata label (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 49d1f65fcae5b6732b768f6184969a6c796bc5e3 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:31 +0100 Subject: [PATCH 032/161] fix(YouTube - Hide Shorts components): Fix sound metadata label hiding other components (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 1246e430f2104bc4a33881fa4dbb188201c02202 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:32 +0100 Subject: [PATCH 033/161] fix(YouTube - Hide Shorts components): Do not hide channel page headers when hiding shorts (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 46ec3d3bdd7d0368e1503a1b1be815eaf9b56525 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:32 +0100 Subject: [PATCH 034/161] fix(YouTube - Open Shorts in regular player): Fix back behavior with 20.51 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From b787c469fd856dff74870fcb61bb3fc3dc5514b7 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:33 +0100 Subject: [PATCH 035/161] fix(YouTube - Open Shorts in regular player): Resolve back button closing app instead of exiting fullscreen (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From b34adf6437294b0b28500c207b5f29ddd2ed294d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:33 +0100 Subject: [PATCH 036/161] fix(YouTube - Loop video): Wrong icon applied (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 06dbf7ee80c836404e3698c9db6176da9a2ab8e1 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:33 +0100 Subject: [PATCH 037/161] fix(YouTube - Loop video): Enable loop video not working in playlist (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 14d0135b3c41bb0c06fb8cd6569a489c41e51105 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:34 +0100 Subject: [PATCH 038/161] fix(YouTube - Loop video): Fix looping button state (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 88157ac5b791d4d56e8347203a02f5c78014235b Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:34 +0100 Subject: [PATCH 039/161] fix(YouTube - SponsorBlock): Do not show context toast when auto skipping in feed (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f5ef68b61a5880a574f6d0f06e4b96c00daf11bb Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:35 +0100 Subject: [PATCH 040/161] fix(YouTube - SponsorBlock): Show correct nested skip segment when seeking (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 206779942d9b4e8131c4df1acb1e7eab63ec75a0 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:35 +0100 Subject: [PATCH 041/161] fix(YouTube - SponsorBlock): Resolve segments not fetching on experimental app targets (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 5d45b6da74165ca69a336aa36e90daafaaf87411 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:35 +0100 Subject: [PATCH 042/161] fix(YouTube - Hide ads): YouTube Doodles unclickable when Hide ads is enabled (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From d26e352850c2659a65b13ff1ba50dcd18278603a Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:36 +0100 Subject: [PATCH 043/161] fix(YouTube - Hide ads): Fix "Hide YouTube Premium promotions" hiding YouTube Doodles (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From c1c2aa98b2d7ce900eb152bc736f3c1a5558d9fc Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:36 +0100 Subject: [PATCH 044/161] fix(YouTube - Hide ads): Empty space left when ads are hidden on tablets (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 02b405e6ac5beeff81c7705379e6c6eb1561270d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:37 +0100 Subject: [PATCH 045/161] fix(YouTube - Hide ads): Support Hide fullscreen ads on Android 13+ devices (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 8d274a7afc3abfafc2b702b27f022316c854dae6 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:37 +0100 Subject: [PATCH 046/161] fix(YouTube - Hide ads): Hide video ads does not hide Shorts ads (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From c97aefc272b83b522e5ac393ec41d03630cee6fb Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:37 +0100 Subject: [PATCH 047/161] fix(YouTube - Hide ads): Hide new type of player ad (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 9b12dd106546d94004c971b887ffa7627ae5a8d4 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:38 +0100 Subject: [PATCH 048/161] fix(YouTube - Hide ads): Hide new type of general ad, movie ad and web search result (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From d639faf71f476bcd7fffa08bfbb0e77c02450c9f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:38 +0100 Subject: [PATCH 049/161] fix(YouTube - Hide layout components): Ensure featured places also hide watch history shelf (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 5760c5860ac2dc6a41821cc66f849a58e44bf3e7 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:39 +0100 Subject: [PATCH 050/161] fix(YouTube - Hide layout components): Fix side effect of Disable translucent status bar (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 1bf64eb8b06435dea9cd292376c5feda6683e0a6 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:39 +0100 Subject: [PATCH 051/161] fix(YouTube - Hide layout components): Fix certain description components not working (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 22ef7002e07df919c30e9274a2479925a4be69c0 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:40 +0100 Subject: [PATCH 052/161] fix(YouTube - Hide layout components): Fix empty space issues (subscribed channels bar, show more button, landscape mode) (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 315322220d6a09814406394414bcfcff61ead786 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:40 +0100 Subject: [PATCH 053/161] fix(YouTube - Hide layout components): Resolve "Hide community posts" not working in search results (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 828df77810b551c70e03d888dc0fe1555c488f51 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:40 +0100 Subject: [PATCH 054/161] fix(YouTube - Hide layout components): Resolve community posts sometimes showing in player suggestions (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From dce204b41beb13b675d04afea3129df73a182172 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:41 +0100 Subject: [PATCH 055/161] fix(YouTube): Changes the default values for some settings (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a8526dc8ae325b3b3d386ad1d23670b05a48da51 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:41 +0100 Subject: [PATCH 056/161] fix(YouTube): Remove 19.43.41 that YouTube no longer supports (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 3dd305ca5d092144a924e150a668443b8f7ec3d8 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:42 +0100 Subject: [PATCH 057/161] fix(YouTube): Change recommended version to 20.37.48 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 093497c34f7d6c431ce7958d6b0f85b9dd0373cd Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:42 +0100 Subject: [PATCH 058/161] fix(YouTube): Ignore cairo flag in debug flag manager (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 30bd852ba5236ca25a7cc49fc23f987def27d23a Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:43 +0100 Subject: [PATCH 059/161] fix(YouTube): Do not show bold icons if old settings menus is enabled (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From ed453751057310a053600c4d50c87532a3f94989 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:43 +0100 Subject: [PATCH 060/161] fix(YouTube): Fix patching unsupported 20.13.41 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f6fc6aa5ac6364dc2806e62618c300a8542b3cb0 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:43 +0100 Subject: [PATCH 061/161] feat: Add overlay buttons animation (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 1f91bc8a20134c5519b8e031badfa741f7cac7a7 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:44 +0100 Subject: [PATCH 062/161] feat(Enable debugging): Allow overriding String/long/double flags in debug flag manager (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 01ef43ababdf015f1ad3edaf45445da0e72199f2 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:44 +0100 Subject: [PATCH 063/161] feat: Perform full search of free registers (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 2f7b57d071d316985a1fec215045b6b78ede6212 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:45 +0100 Subject: [PATCH 064/161] feat: Handle multiple branch conditionals jumping to the same instruction index (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 26e5ce1a325c2a6e78a5486d661f7750ecc792a3 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:45 +0100 Subject: [PATCH 065/161] feat: Use more informative patch error if the same APK is patched twice (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f19c35e21cc77e8f6f746f7f910d520f86981dd5 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:46 +0100 Subject: [PATCH 066/161] feat(Custom branding): Default to user-provided icon and name when provided (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f135122df1a5e6a8b822652abb2451ea4e4a3d08 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:46 +0100 Subject: [PATCH 067/161] feat(YouTube - Disable haptic feedback): Add Disable tap and hold haptics setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 35ec655f83ffe7ab661dca07107a74f2f9617037 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:46 +0100 Subject: [PATCH 068/161] feat(YouTube - SponsorBlock): Show skip button if player overlay controls are active (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From ca6e184172e67cca48ea4c70cfe6371e806dd793 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:47 +0100 Subject: [PATCH 069/161] feat(YouTube - Theme): Add "Hide splash screen" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From e48a5d76f7651b0edcdb5a9b27e596df41e9c6af Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:47 +0100 Subject: [PATCH 070/161] feat(YouTube - Navigation buttons): Add setting to use narrow navigation bar buttons (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From d72e39f2a8fc0894667546826ef07cb3edf78e50 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:48 +0100 Subject: [PATCH 071/161] feat(YouTube - Navigation bar): Add settings to hide toolbar buttons (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From e0a8b7bc59113ce57e5b8b358bad9171a4ea1f99 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:48 +0100 Subject: [PATCH 072/161] feat(YouTube - Hide Shorts components): Add "Hide in video description" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 99aace4178ccc9aeaaeb0b19cd6f520c10ef7df2 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:48 +0100 Subject: [PATCH 073/161] feat(YouTube - Hide Shorts components): Add "Hide AI button" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 50a2b67ef6e6382894636acdc1c2fcf7236ab4ee Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:49 +0100 Subject: [PATCH 074/161] feat(YouTube - Video quality): Add Hide Premium video quality setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 80f6b01c64971881bb9144cada0e91bb78b9f38d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:49 +0100 Subject: [PATCH 075/161] feat(YouTube - Hide layout components): Replace "Hide search suggestions" with "Hide You may like section" (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a43c0e111bfe290f7dec3c9b75b882ea9dc5630f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:50 +0100 Subject: [PATCH 076/161] feat(YouTube - Hide layout components): Apply hide search suggestions only to more recent app targets (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 21bf455c3f61e5fd19f97a1580ecb26ac40dcdce Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:51 +0100 Subject: [PATCH 077/161] feat(YouTube - Hide layout components): Add "Hide search box trending results" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From e41a40f0d754397f9cea09f387cc901f0397787e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:51 +0100 Subject: [PATCH 078/161] feat(YouTube - Hide layout components): Add "Hide subscribed channels bar" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f9e843d75641d4a87dfbe05fa8fd407ccc0345d6 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:52 +0100 Subject: [PATCH 079/161] feat(YouTube - Hide layout components): Add "Hide featured links", "Hide featured videos", "Hide join button", and "Hide subscribe button" options (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 2cfbe08b2137b2520dd37927202a4586af8326ff Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:52 +0100 Subject: [PATCH 080/161] feat(YouTube - Hide layout components): Add "Hide video title" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From ebfdd8df2c5323290f6e655ebf0dd1db683f33dd Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:53 +0100 Subject: [PATCH 081/161] feat(YouTube - Hide layout components): Add "Hide latest videos button" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a6bd3116f97e539482c752e8e4e1b1e8e90ed464 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:53 +0100 Subject: [PATCH 082/161] feat(YouTube - Hide layout components): Add "Hide live chat replay button" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 192756443a1b2ede413e2d4ae55eed2bd9d57aac Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:54 +0100 Subject: [PATCH 083/161] feat(YouTube - Hide layout components): Add "Hide course progress" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 5278434534653ea741e67cc1e5258abb7ca0e21e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:54 +0100 Subject: [PATCH 084/161] feat(YouTube - Hide layout components): Add "Hide comments section in Home feed" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 3e24762c1847dfc467a5d6bf65cc1c3c0931ca0f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:55 +0100 Subject: [PATCH 085/161] feat(YouTube - Hide layout components): Add "Hide explore this course" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 70b9e103aea817bed1d0972444c7b0726214c69c Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:55 +0100 Subject: [PATCH 086/161] feat(YouTube - Hide layout components): Add "Hide quizzes" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From b07b1609e4bd9341611d6aa0194c9764616719b4 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:56 +0100 Subject: [PATCH 087/161] feat(YouTube - Hide layout components): Add "Hide fullscreen button" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 1554fd916d1bcc9c67319d55b21072423926fc32 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:56 +0100 Subject: [PATCH 088/161] feat(YouTube - Hide layout components): Add "Hide collapse button" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From a93de46572a7bd1ff30a1fb653e3f7afb1c67571 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:57 +0100 Subject: [PATCH 089/161] feat(YouTube - Hide layout components): Add "Hide feed flyout menu filter" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 0adcd8c62e12619d5adaac5ee9886613deb53ca4 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:57 +0100 Subject: [PATCH 090/161] feat(YouTube - Hide layout components): Add "Hide channel tab filter" setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 487a95d3efa878d9b41f1b719924c5504e0a1d0a Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:57 +0100 Subject: [PATCH 091/161] feat(YouTube - Hide ads): Add Hide player popup ads setting (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From d1e7900793ceef7b53b140ba9efe25025a8aac01 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:58 +0100 Subject: [PATCH 092/161] feat(YouTube Music): Change recommended version to 8.37.56 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From c1d7caeee2cfa425769571b0ebff2da86e709ef9 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:58 +0100 Subject: [PATCH 093/161] feat(YouTube Music): Unofficial support of 8.50.51 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 50a102d8afc573936f790991381b0a8d2f8dd54d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:59 +0100 Subject: [PATCH 094/161] feat(YouTube Music): Add experimental support for 9.02.50 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From d5b9c0c03d334ff31c9601a48a3beb1a4db98310 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:18:59 +0100 Subject: [PATCH 095/161] feat(YouTube Music): Add experimental support for 9.03.52 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 62f130cc883d69d40c364cac45158012dd01272f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:00 +0100 Subject: [PATCH 096/161] feat(YouTube Music): Support version 8.40.54 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 9909fc1e5d490e9edb59894d66c6a929fbaebb3b Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:00 +0100 Subject: [PATCH 097/161] feat(YouTube): Remove obsolete seekbar thumbnail patch (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From fb04071528683d38913c57f628cbab64bf0ef6a4 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:00 +0100 Subject: [PATCH 098/161] feat(YouTube): Add more double tap to seek length options (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 79e3955fde7068eac90ae404b3869c27f17bd5f7 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:01 +0100 Subject: [PATCH 099/161] feat(YouTube): Add Hide autoplay preview patch (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 96c85d03712e79217dc8f97bcda5f38c0e47f064 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:01 +0100 Subject: [PATCH 100/161] feat(YouTube): Support version 20.40.45 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 7904b60dbea526af45b4a69dc349c6250453b385 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:02 +0100 Subject: [PATCH 101/161] feat(YouTube): Add experimental support for 21.02.32 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 1ae36a1cc72f0fb29d592206f74fcd40e37acaba Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:02 +0100 Subject: [PATCH 102/161] feat(YouTube): Add experimental support for 21.03.34 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 66e113a96639d0c99126749125adf234a9b10cab Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:03 +0100 Subject: [PATCH 103/161] feat(YouTube): Add experimental support for 21.04.221 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From f646c820d7d6027cf013e0968189a1e2cfd9e641 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:03 +0100 Subject: [PATCH 104/161] feat(YouTube): Add experimental support for 21.05.264 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 44b17d47588251b9fab5c801a49ace2ce371fa99 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:04 +0100 Subject: [PATCH 105/161] feat(YouTube): Add experimental support for 21.06.251 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From abb703dcb2ac96f30e699a33d3a896b775bb0851 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:04 +0100 Subject: [PATCH 106/161] feat(YouTube): Add experimental support for 21.06.257 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 79b0c1f72ff5b52b162f3f861d5e10c657efa097 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 16:19:05 +0100 Subject: [PATCH 107/161] feat(YouTube): Add experimental support for 21.07.240 (#6571) This commit is empty because its changes are squashed into commit 88d33b847de4d2ad834a4940ee257e06e3c3ad31 instead, also containing relevant attribution notices. From 4c484d90ebfd3713100ef352305a9ef86fcde371 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 27 Feb 2026 17:14:41 +0100 Subject: [PATCH 108/161] build: Update ReVanced Patches Gradle plugin to fix publication --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 24d395c4ae..6e13ceb408 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,7 +20,7 @@ dependencyResolutionManagement { } plugins { - id("app.revanced.patches") version "1.0.0-dev.9" + id("app.revanced.patches") version "1.0.0-dev.10" } settings { From 756783fc70b93925639c3f45f1747d2c0915b166 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 27 Feb 2026 16:58:21 +0000 Subject: [PATCH 109/161] chore: Release v6.0.0-dev.4 [skip ci] # [6.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.3...v6.0.0-dev.4) (2026-02-27) ### Bug Fixes * **Custom branding:** Fix defaults ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3e00a99](https://github.com/ReVanced/revanced-patches/commit/3e00a99c1bb3af24f9e8420e8c7c2bbaeb003c6c)) * **Custom branding:** Resolve background playback crash with custom branded root installation ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([6aba2d1](https://github.com/ReVanced/revanced-patches/commit/6aba2d127472643c346108d481513442fa9a3fde)) * **Hex patch:** Fix bug in implementation of Boyer-Moore algorithm ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f59323c](https://github.com/ReVanced/revanced-patches/commit/f59323c87d8da36b39e19936c8ed5c07d3903b16)) * **YouTube - Exit fullscreen mode:** Handle exiting fullscreen on first opened video ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88724d4](https://github.com/ReVanced/revanced-patches/commit/88724d47b13d56a90384b0a2588ba82ccdd5b101)) * **YouTube - Hide ads:** Empty space left when ads are hidden on tablets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c1c2aa9](https://github.com/ReVanced/revanced-patches/commit/c1c2aa98b2d7ce900eb152bc736f3c1a5558d9fc)) * **YouTube - Hide ads:** Fix "Hide YouTube Premium promotions" hiding YouTube Doodles ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d26e352](https://github.com/ReVanced/revanced-patches/commit/d26e352850c2659a65b13ff1ba50dcd18278603a)) * **YouTube - Hide ads:** Hide new type of general ad, movie ad and web search result ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([9b12dd1](https://github.com/ReVanced/revanced-patches/commit/9b12dd106546d94004c971b887ffa7627ae5a8d4)) * **YouTube - Hide ads:** Hide new type of player ad ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c97aefc](https://github.com/ReVanced/revanced-patches/commit/c97aefc272b83b522e5ac393ec41d03630cee6fb)) * **YouTube - Hide ads:** Hide video ads does not hide Shorts ads ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([8d274a7](https://github.com/ReVanced/revanced-patches/commit/8d274a7afc3abfafc2b702b27f022316c854dae6)) * **YouTube - Hide ads:** Support Hide fullscreen ads on Android 13+ devices ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([02b405e](https://github.com/ReVanced/revanced-patches/commit/02b405e6ac5beeff81c7705379e6c6eb1561270d)) * **YouTube - Hide ads:** YouTube Doodles unclickable when Hide ads is enabled ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5d45b6d](https://github.com/ReVanced/revanced-patches/commit/5d45b6da74165ca69a336aa36e90daafaaf87411)) * **YouTube - Hide end screen cards:** Resolve patching 20.31.4x ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3ff303f](https://github.com/ReVanced/revanced-patches/commit/3ff303f045c4fbda0331e3f1e9fbba50f97dedab)) * **YouTube - Hide layout components:** Ensure featured places also hide watch history shelf ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d639faf](https://github.com/ReVanced/revanced-patches/commit/d639faf71f476bcd7fffa08bfbb0e77c02450c9f)) * **YouTube - Hide layout components:** Fix certain description components not working ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1bf64eb](https://github.com/ReVanced/revanced-patches/commit/1bf64eb8b06435dea9cd292376c5feda6683e0a6)) * **YouTube - Hide layout components:** Fix empty space issues (subscribed channels bar, show more button, landscape mode) ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([22ef700](https://github.com/ReVanced/revanced-patches/commit/22ef7002e07df919c30e9274a2479925a4be69c0)) * **YouTube - Hide layout components:** Fix side effect of Disable translucent status bar ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5760c58](https://github.com/ReVanced/revanced-patches/commit/5760c5860ac2dc6a41821cc66f849a58e44bf3e7)) * **YouTube - Hide layout components:** Resolve "Hide community posts" not working in search results ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3153222](https://github.com/ReVanced/revanced-patches/commit/315322220d6a09814406394414bcfcff61ead786)) * **YouTube - Hide layout components:** Resolve community posts sometimes showing in player suggestions ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([828df77](https://github.com/ReVanced/revanced-patches/commit/828df77810b551c70e03d888dc0fe1555c488f51)) * **YouTube - Hide Shorts components:** Action buttons not hidden in 20.22+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a90a0b1](https://github.com/ReVanced/revanced-patches/commit/a90a0b1199e66cace3eb1b8c827314ceaf514ecf)) * **YouTube - Hide Shorts components:** Do not hide channel page headers when hiding shorts ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1246e43](https://github.com/ReVanced/revanced-patches/commit/1246e430f2104bc4a33881fa4dbb188201c02202)) * **YouTube - Hide Shorts components:** Fix sound metadata label hiding other components ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([49d1f65](https://github.com/ReVanced/revanced-patches/commit/49d1f65fcae5b6732b768f6184969a6c796bc5e3)) * **YouTube - Hide Shorts components:** Hide new type of sound metadata label ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a6b8d2f](https://github.com/ReVanced/revanced-patches/commit/a6b8d2f1039b7896b21826a46f3f13b32d16b51d)) * **YouTube - Hide Shorts components:** Resolve hiding Shorts not working ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ae69bdc](https://github.com/ReVanced/revanced-patches/commit/ae69bdc1d376a05b6854401586408cb6a9bda7eb)) * **YouTube - Loop video:** Enable loop video not working in playlist ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([06dbf7e](https://github.com/ReVanced/revanced-patches/commit/06dbf7ee80c836404e3698c9db6176da9a2ab8e1)) * **YouTube - Loop video:** Fix looping button state ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([14d0135](https://github.com/ReVanced/revanced-patches/commit/14d0135b3c41bb0c06fb8cd6569a489c41e51105)) * **YouTube - Loop video:** Wrong icon applied ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b34adf6](https://github.com/ReVanced/revanced-patches/commit/b34adf6437294b0b28500c207b5f29ddd2ed294d)) * **YouTube - Open Shorts in regular player:** Fix back behavior with 20.51 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([46ec3d3](https://github.com/ReVanced/revanced-patches/commit/46ec3d3bdd7d0368e1503a1b1be815eaf9b56525)) * **YouTube - Open Shorts in regular player:** Resolve back button closing app instead of exiting fullscreen ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b787c46](https://github.com/ReVanced/revanced-patches/commit/b787c469fd856dff74870fcb61bb3fc3dc5514b7)) * **YouTube - Remove background playback restrictions:** Fix background playback not working with certain offline videos ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2d098f2](https://github.com/ReVanced/revanced-patches/commit/2d098f2352b7dc1f0dc185ac65074443289ef2de)) * **YouTube - Remove viewer discretion dialog:** Not working on 20.14.43+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([64c397e](https://github.com/ReVanced/revanced-patches/commit/64c397eb1c46bdd77f2b05d03c22a841971bea81)) * **YouTube - Return YouTube Dislike:** Fix incorrect dislike counts after cancel ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ad10d76](https://github.com/ReVanced/revanced-patches/commit/ad10d760354dba1e8f470972955a706da9b85c02)) * **YouTube - ReturnYouTubeDislike:** Fix dislikes not showing with 20.31+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2033883](https://github.com/ReVanced/revanced-patches/commit/203388329484616cc83aef2c3bda38a3069839ca)) * **YouTube - SponsorBlock:** Do not show context toast when auto skipping in feed ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88157ac](https://github.com/ReVanced/revanced-patches/commit/88157ac5b791d4d56e8347203a02f5c78014235b)) * **YouTube - SponsorBlock:** Resolve segments not fetching on experimental app targets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2067799](https://github.com/ReVanced/revanced-patches/commit/206779942d9b4e8131c4df1acb1e7eab63ec75a0)) * **YouTube - SponsorBlock:** Show correct nested skip segment when seeking ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f5ef68b](https://github.com/ReVanced/revanced-patches/commit/f5ef68b61a5880a574f6d0f06e4b96c00daf11bb)) * **YouTube Music - Navigation bar:** Hide library tab with 8.24+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([cfcae43](https://github.com/ReVanced/revanced-patches/commit/cfcae434652b747345cb31b66748f0cc3220eb4a)) * **YouTube:** Change recommended version to 20.37.48 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3dd305c](https://github.com/ReVanced/revanced-patches/commit/3dd305ca5d092144a924e150a668443b8f7ec3d8)) * **YouTube:** Changes the default values for some settings ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([dce204b](https://github.com/ReVanced/revanced-patches/commit/dce204b41beb13b675d04afea3129df73a182172)) * **YouTube:** Do not show bold icons if old settings menus is enabled ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([30bd852](https://github.com/ReVanced/revanced-patches/commit/30bd852ba5236ca25a7cc49fc23f987def27d23a)) * **YouTube:** Fix patching unsupported 20.13.41 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ed45375](https://github.com/ReVanced/revanced-patches/commit/ed453751057310a053600c4d50c87532a3f94989)) * **YouTube:** Ignore cairo flag in debug flag manager ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([093497c](https://github.com/ReVanced/revanced-patches/commit/093497c34f7d6c431ce7958d6b0f85b9dd0373cd)) * **YouTube:** Remove 19.43.41 that YouTube no longer supports ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a8526dc](https://github.com/ReVanced/revanced-patches/commit/a8526dc8ae325b3b3d386ad1d23670b05a48da51)) ### Features * Add overlay buttons animation ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f6fc6aa](https://github.com/ReVanced/revanced-patches/commit/f6fc6aa5ac6364dc2806e62618c300a8542b3cb0)) * **Custom branding:** Default to user-provided icon and name when provided ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f19c35e](https://github.com/ReVanced/revanced-patches/commit/f19c35e21cc77e8f6f746f7f910d520f86981dd5)) * **Enable debugging:** Allow overriding String/long/double flags in debug flag manager ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1f91bc8](https://github.com/ReVanced/revanced-patches/commit/1f91bc8a20134c5519b8e031badfa741f7cac7a7)) * Handle multiple branch conditionals jumping to the same instruction index ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2f7b57d](https://github.com/ReVanced/revanced-patches/commit/2f7b57d071d316985a1fec215045b6b78ede6212)) * Perform full search of free registers ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([01ef43a](https://github.com/ReVanced/revanced-patches/commit/01ef43ababdf015f1ad3edaf45445da0e72199f2)) * Update YouTube & YouTube Music patches ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88d33b8](https://github.com/ReVanced/revanced-patches/commit/88d33b847de4d2ad834a4940ee257e06e3c3ad31)) * Use more informative patch error if the same APK is patched twice ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([26e5ce1](https://github.com/ReVanced/revanced-patches/commit/26e5ce1a325c2a6e78a5486d661f7750ecc792a3)) * **YouTube - Disable haptic feedback:** Add Disable tap and hold haptics setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f135122](https://github.com/ReVanced/revanced-patches/commit/f135122df1a5e6a8b822652abb2451ea4e4a3d08)) * **YouTube - Hide ads:** Add Hide player popup ads setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([487a95d](https://github.com/ReVanced/revanced-patches/commit/487a95d3efa878d9b41f1b719924c5504e0a1d0a)) * **YouTube - Hide layout components:** Add "Hide channel tab filter" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([0adcd8c](https://github.com/ReVanced/revanced-patches/commit/0adcd8c62e12619d5adaac5ee9886613deb53ca4)) * **YouTube - Hide layout components:** Add "Hide collapse button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1554fd9](https://github.com/ReVanced/revanced-patches/commit/1554fd916d1bcc9c67319d55b21072423926fc32)) * **YouTube - Hide layout components:** Add "Hide comments section in Home feed" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5278434](https://github.com/ReVanced/revanced-patches/commit/5278434534653ea741e67cc1e5258abb7ca0e21e)) * **YouTube - Hide layout components:** Add "Hide course progress" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1927564](https://github.com/ReVanced/revanced-patches/commit/192756443a1b2ede413e2d4ae55eed2bd9d57aac)) * **YouTube - Hide layout components:** Add "Hide explore this course" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3e24762](https://github.com/ReVanced/revanced-patches/commit/3e24762c1847dfc467a5d6bf65cc1c3c0931ca0f)) * **YouTube - Hide layout components:** Add "Hide featured links", "Hide featured videos", "Hide join button", and "Hide subscribe button" options ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f9e843d](https://github.com/ReVanced/revanced-patches/commit/f9e843d75641d4a87dfbe05fa8fd407ccc0345d6)) * **YouTube - Hide layout components:** Add "Hide feed flyout menu filter" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a93de46](https://github.com/ReVanced/revanced-patches/commit/a93de46572a7bd1ff30a1fb653e3f7afb1c67571)) * **YouTube - Hide layout components:** Add "Hide fullscreen button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b07b160](https://github.com/ReVanced/revanced-patches/commit/b07b1609e4bd9341611d6aa0194c9764616719b4)) * **YouTube - Hide layout components:** Add "Hide latest videos button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ebfdd8d](https://github.com/ReVanced/revanced-patches/commit/ebfdd8df2c5323290f6e655ebf0dd1db683f33dd)) * **YouTube - Hide layout components:** Add "Hide live chat replay button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a6bd311](https://github.com/ReVanced/revanced-patches/commit/a6bd3116f97e539482c752e8e4e1b1e8e90ed464)) * **YouTube - Hide layout components:** Add "Hide quizzes" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([70b9e10](https://github.com/ReVanced/revanced-patches/commit/70b9e103aea817bed1d0972444c7b0726214c69c)) * **YouTube - Hide layout components:** Add "Hide search box trending results" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([21bf455](https://github.com/ReVanced/revanced-patches/commit/21bf455c3f61e5fd19f97a1580ecb26ac40dcdce)) * **YouTube - Hide layout components:** Add "Hide subscribed channels bar" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e41a40f](https://github.com/ReVanced/revanced-patches/commit/e41a40f0d754397f9cea09f387cc901f0397787e)) * **YouTube - Hide layout components:** Add "Hide video title" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2cfbe08](https://github.com/ReVanced/revanced-patches/commit/2cfbe08b2137b2520dd37927202a4586af8326ff)) * **YouTube - Hide layout components:** Apply hide search suggestions only to more recent app targets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a43c0e1](https://github.com/ReVanced/revanced-patches/commit/a43c0e111bfe290f7dec3c9b75b882ea9dc5630f)) * **YouTube - Hide layout components:** Replace "Hide search suggestions" with "Hide You may like section" ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([80f6b01](https://github.com/ReVanced/revanced-patches/commit/80f6b01c64971881bb9144cada0e91bb78b9f38d)) * **YouTube - Hide Shorts components:** Add "Hide AI button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([99aace4](https://github.com/ReVanced/revanced-patches/commit/99aace4178ccc9aeaaeb0b19cd6f520c10ef7df2)) * **YouTube - Hide Shorts components:** Add "Hide in video description" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e0a8b7b](https://github.com/ReVanced/revanced-patches/commit/e0a8b7bc59113ce57e5b8b358bad9171a4ea1f99)) * **YouTube - Navigation bar:** Add settings to hide toolbar buttons ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d72e39f](https://github.com/ReVanced/revanced-patches/commit/d72e39f2a8fc0894667546826ef07cb3edf78e50)) * **YouTube - Navigation buttons:** Add setting to use narrow navigation bar buttons ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e48a5d7](https://github.com/ReVanced/revanced-patches/commit/e48a5d76f7651b0edcdb5a9b27e596df41e9c6af)) * **YouTube - SponsorBlock:** Show skip button if player overlay controls are active ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([35ec655](https://github.com/ReVanced/revanced-patches/commit/35ec655f83ffe7ab661dca07107a74f2f9617037)) * **YouTube - Theme:** Add "Hide splash screen" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ca6e184](https://github.com/ReVanced/revanced-patches/commit/ca6e184172e67cca48ea4c70cfe6371e806dd793)) * **YouTube - Video quality:** Add Hide Premium video quality setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([50a2b67](https://github.com/ReVanced/revanced-patches/commit/50a2b67ef6e6382894636acdc1c2fcf7236ab4ee)) * **YouTube Music:** Add experimental support for 9.02.50 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([50a102d](https://github.com/ReVanced/revanced-patches/commit/50a102d8afc573936f790991381b0a8d2f8dd54d)) * **YouTube Music:** Add experimental support for 9.03.52 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d5b9c0c](https://github.com/ReVanced/revanced-patches/commit/d5b9c0c03d334ff31c9601a48a3beb1a4db98310)) * **YouTube Music:** Change recommended version to 8.37.56 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d1e7900](https://github.com/ReVanced/revanced-patches/commit/d1e7900793ceef7b53b140ba9efe25025a8aac01)) * **YouTube Music:** Support version 8.40.54 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([62f130c](https://github.com/ReVanced/revanced-patches/commit/62f130cc883d69d40c364cac45158012dd01272f)) * **YouTube Music:** Unofficial support of 8.50.51 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c1d7cae](https://github.com/ReVanced/revanced-patches/commit/c1d7caeee2cfa425769571b0ebff2da86e709ef9)) * **YouTube:** Add experimental support for 21.02.32 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([7904b60](https://github.com/ReVanced/revanced-patches/commit/7904b60dbea526af45b4a69dc349c6250453b385)) * **YouTube:** Add experimental support for 21.03.34 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1ae36a1](https://github.com/ReVanced/revanced-patches/commit/1ae36a1cc72f0fb29d592206f74fcd40e37acaba)) * **YouTube:** Add experimental support for 21.04.221 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([66e113a](https://github.com/ReVanced/revanced-patches/commit/66e113a96639d0c99126749125adf234a9b10cab)) * **YouTube:** Add experimental support for 21.05.264 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f646c82](https://github.com/ReVanced/revanced-patches/commit/f646c820d7d6027cf013e0968189a1e2cfd9e641)) * **YouTube:** Add experimental support for 21.06.251 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([44b17d4](https://github.com/ReVanced/revanced-patches/commit/44b17d47588251b9fab5c801a49ace2ce371fa99)) * **YouTube:** Add experimental support for 21.06.257 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([abb703d](https://github.com/ReVanced/revanced-patches/commit/abb703dcb2ac96f30e699a33d3a896b775bb0851)) * **YouTube:** Add experimental support for 21.07.240 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([79b0c1f](https://github.com/ReVanced/revanced-patches/commit/79b0c1f72ff5b52b162f3f861d5e10c657efa097)) * **YouTube:** Add Hide autoplay preview patch ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([79e3955](https://github.com/ReVanced/revanced-patches/commit/79e3955fde7068eac90ae404b3869c27f17bd5f7)) * **YouTube:** Add more double tap to seek length options ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([fb04071](https://github.com/ReVanced/revanced-patches/commit/fb04071528683d38913c57f628cbab64bf0ef6a4)) * **YouTube:** Remove obsolete seekbar thumbnail patch ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([9909fc1](https://github.com/ReVanced/revanced-patches/commit/9909fc1e5d490e9edb59894d66c6a929fbaebb3b)) * **YouTube:** Support version 20.40.45 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([96c85d0](https://github.com/ReVanced/revanced-patches/commit/96c85d03712e79217dc8f97bcda5f38c0e47f064)) --- CHANGELOG.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6ec92c581..c813f95e04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,103 @@ +# [6.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.3...v6.0.0-dev.4) (2026-02-27) + + +### Bug Fixes + +* **Custom branding:** Fix defaults ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3e00a99](https://github.com/ReVanced/revanced-patches/commit/3e00a99c1bb3af24f9e8420e8c7c2bbaeb003c6c)) +* **Custom branding:** Resolve background playback crash with custom branded root installation ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([6aba2d1](https://github.com/ReVanced/revanced-patches/commit/6aba2d127472643c346108d481513442fa9a3fde)) +* **Hex patch:** Fix bug in implementation of Boyer-Moore algorithm ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f59323c](https://github.com/ReVanced/revanced-patches/commit/f59323c87d8da36b39e19936c8ed5c07d3903b16)) +* **YouTube - Exit fullscreen mode:** Handle exiting fullscreen on first opened video ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88724d4](https://github.com/ReVanced/revanced-patches/commit/88724d47b13d56a90384b0a2588ba82ccdd5b101)) +* **YouTube - Hide ads:** Empty space left when ads are hidden on tablets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c1c2aa9](https://github.com/ReVanced/revanced-patches/commit/c1c2aa98b2d7ce900eb152bc736f3c1a5558d9fc)) +* **YouTube - Hide ads:** Fix "Hide YouTube Premium promotions" hiding YouTube Doodles ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d26e352](https://github.com/ReVanced/revanced-patches/commit/d26e352850c2659a65b13ff1ba50dcd18278603a)) +* **YouTube - Hide ads:** Hide new type of general ad, movie ad and web search result ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([9b12dd1](https://github.com/ReVanced/revanced-patches/commit/9b12dd106546d94004c971b887ffa7627ae5a8d4)) +* **YouTube - Hide ads:** Hide new type of player ad ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c97aefc](https://github.com/ReVanced/revanced-patches/commit/c97aefc272b83b522e5ac393ec41d03630cee6fb)) +* **YouTube - Hide ads:** Hide video ads does not hide Shorts ads ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([8d274a7](https://github.com/ReVanced/revanced-patches/commit/8d274a7afc3abfafc2b702b27f022316c854dae6)) +* **YouTube - Hide ads:** Support Hide fullscreen ads on Android 13+ devices ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([02b405e](https://github.com/ReVanced/revanced-patches/commit/02b405e6ac5beeff81c7705379e6c6eb1561270d)) +* **YouTube - Hide ads:** YouTube Doodles unclickable when Hide ads is enabled ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5d45b6d](https://github.com/ReVanced/revanced-patches/commit/5d45b6da74165ca69a336aa36e90daafaaf87411)) +* **YouTube - Hide end screen cards:** Resolve patching 20.31.4x ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3ff303f](https://github.com/ReVanced/revanced-patches/commit/3ff303f045c4fbda0331e3f1e9fbba50f97dedab)) +* **YouTube - Hide layout components:** Ensure featured places also hide watch history shelf ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d639faf](https://github.com/ReVanced/revanced-patches/commit/d639faf71f476bcd7fffa08bfbb0e77c02450c9f)) +* **YouTube - Hide layout components:** Fix certain description components not working ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1bf64eb](https://github.com/ReVanced/revanced-patches/commit/1bf64eb8b06435dea9cd292376c5feda6683e0a6)) +* **YouTube - Hide layout components:** Fix empty space issues (subscribed channels bar, show more button, landscape mode) ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([22ef700](https://github.com/ReVanced/revanced-patches/commit/22ef7002e07df919c30e9274a2479925a4be69c0)) +* **YouTube - Hide layout components:** Fix side effect of Disable translucent status bar ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5760c58](https://github.com/ReVanced/revanced-patches/commit/5760c5860ac2dc6a41821cc66f849a58e44bf3e7)) +* **YouTube - Hide layout components:** Resolve "Hide community posts" not working in search results ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3153222](https://github.com/ReVanced/revanced-patches/commit/315322220d6a09814406394414bcfcff61ead786)) +* **YouTube - Hide layout components:** Resolve community posts sometimes showing in player suggestions ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([828df77](https://github.com/ReVanced/revanced-patches/commit/828df77810b551c70e03d888dc0fe1555c488f51)) +* **YouTube - Hide Shorts components:** Action buttons not hidden in 20.22+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a90a0b1](https://github.com/ReVanced/revanced-patches/commit/a90a0b1199e66cace3eb1b8c827314ceaf514ecf)) +* **YouTube - Hide Shorts components:** Do not hide channel page headers when hiding shorts ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1246e43](https://github.com/ReVanced/revanced-patches/commit/1246e430f2104bc4a33881fa4dbb188201c02202)) +* **YouTube - Hide Shorts components:** Fix sound metadata label hiding other components ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([49d1f65](https://github.com/ReVanced/revanced-patches/commit/49d1f65fcae5b6732b768f6184969a6c796bc5e3)) +* **YouTube - Hide Shorts components:** Hide new type of sound metadata label ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a6b8d2f](https://github.com/ReVanced/revanced-patches/commit/a6b8d2f1039b7896b21826a46f3f13b32d16b51d)) +* **YouTube - Hide Shorts components:** Resolve hiding Shorts not working ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ae69bdc](https://github.com/ReVanced/revanced-patches/commit/ae69bdc1d376a05b6854401586408cb6a9bda7eb)) +* **YouTube - Loop video:** Enable loop video not working in playlist ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([06dbf7e](https://github.com/ReVanced/revanced-patches/commit/06dbf7ee80c836404e3698c9db6176da9a2ab8e1)) +* **YouTube - Loop video:** Fix looping button state ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([14d0135](https://github.com/ReVanced/revanced-patches/commit/14d0135b3c41bb0c06fb8cd6569a489c41e51105)) +* **YouTube - Loop video:** Wrong icon applied ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b34adf6](https://github.com/ReVanced/revanced-patches/commit/b34adf6437294b0b28500c207b5f29ddd2ed294d)) +* **YouTube - Open Shorts in regular player:** Fix back behavior with 20.51 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([46ec3d3](https://github.com/ReVanced/revanced-patches/commit/46ec3d3bdd7d0368e1503a1b1be815eaf9b56525)) +* **YouTube - Open Shorts in regular player:** Resolve back button closing app instead of exiting fullscreen ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b787c46](https://github.com/ReVanced/revanced-patches/commit/b787c469fd856dff74870fcb61bb3fc3dc5514b7)) +* **YouTube - Remove background playback restrictions:** Fix background playback not working with certain offline videos ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2d098f2](https://github.com/ReVanced/revanced-patches/commit/2d098f2352b7dc1f0dc185ac65074443289ef2de)) +* **YouTube - Remove viewer discretion dialog:** Not working on 20.14.43+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([64c397e](https://github.com/ReVanced/revanced-patches/commit/64c397eb1c46bdd77f2b05d03c22a841971bea81)) +* **YouTube - Return YouTube Dislike:** Fix incorrect dislike counts after cancel ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ad10d76](https://github.com/ReVanced/revanced-patches/commit/ad10d760354dba1e8f470972955a706da9b85c02)) +* **YouTube - ReturnYouTubeDislike:** Fix dislikes not showing with 20.31+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2033883](https://github.com/ReVanced/revanced-patches/commit/203388329484616cc83aef2c3bda38a3069839ca)) +* **YouTube - SponsorBlock:** Do not show context toast when auto skipping in feed ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88157ac](https://github.com/ReVanced/revanced-patches/commit/88157ac5b791d4d56e8347203a02f5c78014235b)) +* **YouTube - SponsorBlock:** Resolve segments not fetching on experimental app targets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2067799](https://github.com/ReVanced/revanced-patches/commit/206779942d9b4e8131c4df1acb1e7eab63ec75a0)) +* **YouTube - SponsorBlock:** Show correct nested skip segment when seeking ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f5ef68b](https://github.com/ReVanced/revanced-patches/commit/f5ef68b61a5880a574f6d0f06e4b96c00daf11bb)) +* **YouTube Music - Navigation bar:** Hide library tab with 8.24+ ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([cfcae43](https://github.com/ReVanced/revanced-patches/commit/cfcae434652b747345cb31b66748f0cc3220eb4a)) +* **YouTube:** Change recommended version to 20.37.48 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3dd305c](https://github.com/ReVanced/revanced-patches/commit/3dd305ca5d092144a924e150a668443b8f7ec3d8)) +* **YouTube:** Changes the default values for some settings ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([dce204b](https://github.com/ReVanced/revanced-patches/commit/dce204b41beb13b675d04afea3129df73a182172)) +* **YouTube:** Do not show bold icons if old settings menus is enabled ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([30bd852](https://github.com/ReVanced/revanced-patches/commit/30bd852ba5236ca25a7cc49fc23f987def27d23a)) +* **YouTube:** Fix patching unsupported 20.13.41 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ed45375](https://github.com/ReVanced/revanced-patches/commit/ed453751057310a053600c4d50c87532a3f94989)) +* **YouTube:** Ignore cairo flag in debug flag manager ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([093497c](https://github.com/ReVanced/revanced-patches/commit/093497c34f7d6c431ce7958d6b0f85b9dd0373cd)) +* **YouTube:** Remove 19.43.41 that YouTube no longer supports ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a8526dc](https://github.com/ReVanced/revanced-patches/commit/a8526dc8ae325b3b3d386ad1d23670b05a48da51)) + + +### Features + +* Add overlay buttons animation ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f6fc6aa](https://github.com/ReVanced/revanced-patches/commit/f6fc6aa5ac6364dc2806e62618c300a8542b3cb0)) +* **Custom branding:** Default to user-provided icon and name when provided ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f19c35e](https://github.com/ReVanced/revanced-patches/commit/f19c35e21cc77e8f6f746f7f910d520f86981dd5)) +* **Enable debugging:** Allow overriding String/long/double flags in debug flag manager ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1f91bc8](https://github.com/ReVanced/revanced-patches/commit/1f91bc8a20134c5519b8e031badfa741f7cac7a7)) +* Handle multiple branch conditionals jumping to the same instruction index ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2f7b57d](https://github.com/ReVanced/revanced-patches/commit/2f7b57d071d316985a1fec215045b6b78ede6212)) +* Perform full search of free registers ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([01ef43a](https://github.com/ReVanced/revanced-patches/commit/01ef43ababdf015f1ad3edaf45445da0e72199f2)) +* Update YouTube & YouTube Music patches ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([88d33b8](https://github.com/ReVanced/revanced-patches/commit/88d33b847de4d2ad834a4940ee257e06e3c3ad31)) +* Use more informative patch error if the same APK is patched twice ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([26e5ce1](https://github.com/ReVanced/revanced-patches/commit/26e5ce1a325c2a6e78a5486d661f7750ecc792a3)) +* **YouTube - Disable haptic feedback:** Add Disable tap and hold haptics setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f135122](https://github.com/ReVanced/revanced-patches/commit/f135122df1a5e6a8b822652abb2451ea4e4a3d08)) +* **YouTube - Hide ads:** Add Hide player popup ads setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([487a95d](https://github.com/ReVanced/revanced-patches/commit/487a95d3efa878d9b41f1b719924c5504e0a1d0a)) +* **YouTube - Hide layout components:** Add "Hide channel tab filter" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([0adcd8c](https://github.com/ReVanced/revanced-patches/commit/0adcd8c62e12619d5adaac5ee9886613deb53ca4)) +* **YouTube - Hide layout components:** Add "Hide collapse button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1554fd9](https://github.com/ReVanced/revanced-patches/commit/1554fd916d1bcc9c67319d55b21072423926fc32)) +* **YouTube - Hide layout components:** Add "Hide comments section in Home feed" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([5278434](https://github.com/ReVanced/revanced-patches/commit/5278434534653ea741e67cc1e5258abb7ca0e21e)) +* **YouTube - Hide layout components:** Add "Hide course progress" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1927564](https://github.com/ReVanced/revanced-patches/commit/192756443a1b2ede413e2d4ae55eed2bd9d57aac)) +* **YouTube - Hide layout components:** Add "Hide explore this course" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([3e24762](https://github.com/ReVanced/revanced-patches/commit/3e24762c1847dfc467a5d6bf65cc1c3c0931ca0f)) +* **YouTube - Hide layout components:** Add "Hide featured links", "Hide featured videos", "Hide join button", and "Hide subscribe button" options ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f9e843d](https://github.com/ReVanced/revanced-patches/commit/f9e843d75641d4a87dfbe05fa8fd407ccc0345d6)) +* **YouTube - Hide layout components:** Add "Hide feed flyout menu filter" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a93de46](https://github.com/ReVanced/revanced-patches/commit/a93de46572a7bd1ff30a1fb653e3f7afb1c67571)) +* **YouTube - Hide layout components:** Add "Hide fullscreen button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([b07b160](https://github.com/ReVanced/revanced-patches/commit/b07b1609e4bd9341611d6aa0194c9764616719b4)) +* **YouTube - Hide layout components:** Add "Hide latest videos button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ebfdd8d](https://github.com/ReVanced/revanced-patches/commit/ebfdd8df2c5323290f6e655ebf0dd1db683f33dd)) +* **YouTube - Hide layout components:** Add "Hide live chat replay button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a6bd311](https://github.com/ReVanced/revanced-patches/commit/a6bd3116f97e539482c752e8e4e1b1e8e90ed464)) +* **YouTube - Hide layout components:** Add "Hide quizzes" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([70b9e10](https://github.com/ReVanced/revanced-patches/commit/70b9e103aea817bed1d0972444c7b0726214c69c)) +* **YouTube - Hide layout components:** Add "Hide search box trending results" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([21bf455](https://github.com/ReVanced/revanced-patches/commit/21bf455c3f61e5fd19f97a1580ecb26ac40dcdce)) +* **YouTube - Hide layout components:** Add "Hide subscribed channels bar" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e41a40f](https://github.com/ReVanced/revanced-patches/commit/e41a40f0d754397f9cea09f387cc901f0397787e)) +* **YouTube - Hide layout components:** Add "Hide video title" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([2cfbe08](https://github.com/ReVanced/revanced-patches/commit/2cfbe08b2137b2520dd37927202a4586af8326ff)) +* **YouTube - Hide layout components:** Apply hide search suggestions only to more recent app targets ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([a43c0e1](https://github.com/ReVanced/revanced-patches/commit/a43c0e111bfe290f7dec3c9b75b882ea9dc5630f)) +* **YouTube - Hide layout components:** Replace "Hide search suggestions" with "Hide You may like section" ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([80f6b01](https://github.com/ReVanced/revanced-patches/commit/80f6b01c64971881bb9144cada0e91bb78b9f38d)) +* **YouTube - Hide Shorts components:** Add "Hide AI button" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([99aace4](https://github.com/ReVanced/revanced-patches/commit/99aace4178ccc9aeaaeb0b19cd6f520c10ef7df2)) +* **YouTube - Hide Shorts components:** Add "Hide in video description" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e0a8b7b](https://github.com/ReVanced/revanced-patches/commit/e0a8b7bc59113ce57e5b8b358bad9171a4ea1f99)) +* **YouTube - Navigation bar:** Add settings to hide toolbar buttons ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d72e39f](https://github.com/ReVanced/revanced-patches/commit/d72e39f2a8fc0894667546826ef07cb3edf78e50)) +* **YouTube - Navigation buttons:** Add setting to use narrow navigation bar buttons ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([e48a5d7](https://github.com/ReVanced/revanced-patches/commit/e48a5d76f7651b0edcdb5a9b27e596df41e9c6af)) +* **YouTube - SponsorBlock:** Show skip button if player overlay controls are active ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([35ec655](https://github.com/ReVanced/revanced-patches/commit/35ec655f83ffe7ab661dca07107a74f2f9617037)) +* **YouTube - Theme:** Add "Hide splash screen" setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([ca6e184](https://github.com/ReVanced/revanced-patches/commit/ca6e184172e67cca48ea4c70cfe6371e806dd793)) +* **YouTube - Video quality:** Add Hide Premium video quality setting ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([50a2b67](https://github.com/ReVanced/revanced-patches/commit/50a2b67ef6e6382894636acdc1c2fcf7236ab4ee)) +* **YouTube Music:** Add experimental support for 9.02.50 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([50a102d](https://github.com/ReVanced/revanced-patches/commit/50a102d8afc573936f790991381b0a8d2f8dd54d)) +* **YouTube Music:** Add experimental support for 9.03.52 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d5b9c0c](https://github.com/ReVanced/revanced-patches/commit/d5b9c0c03d334ff31c9601a48a3beb1a4db98310)) +* **YouTube Music:** Change recommended version to 8.37.56 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([d1e7900](https://github.com/ReVanced/revanced-patches/commit/d1e7900793ceef7b53b140ba9efe25025a8aac01)) +* **YouTube Music:** Support version 8.40.54 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([62f130c](https://github.com/ReVanced/revanced-patches/commit/62f130cc883d69d40c364cac45158012dd01272f)) +* **YouTube Music:** Unofficial support of 8.50.51 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([c1d7cae](https://github.com/ReVanced/revanced-patches/commit/c1d7caeee2cfa425769571b0ebff2da86e709ef9)) +* **YouTube:** Add experimental support for 21.02.32 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([7904b60](https://github.com/ReVanced/revanced-patches/commit/7904b60dbea526af45b4a69dc349c6250453b385)) +* **YouTube:** Add experimental support for 21.03.34 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([1ae36a1](https://github.com/ReVanced/revanced-patches/commit/1ae36a1cc72f0fb29d592206f74fcd40e37acaba)) +* **YouTube:** Add experimental support for 21.04.221 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([66e113a](https://github.com/ReVanced/revanced-patches/commit/66e113a96639d0c99126749125adf234a9b10cab)) +* **YouTube:** Add experimental support for 21.05.264 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([f646c82](https://github.com/ReVanced/revanced-patches/commit/f646c820d7d6027cf013e0968189a1e2cfd9e641)) +* **YouTube:** Add experimental support for 21.06.251 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([44b17d4](https://github.com/ReVanced/revanced-patches/commit/44b17d47588251b9fab5c801a49ace2ce371fa99)) +* **YouTube:** Add experimental support for 21.06.257 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([abb703d](https://github.com/ReVanced/revanced-patches/commit/abb703dcb2ac96f30e699a33d3a896b775bb0851)) +* **YouTube:** Add experimental support for 21.07.240 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([79b0c1f](https://github.com/ReVanced/revanced-patches/commit/79b0c1f72ff5b52b162f3f861d5e10c657efa097)) +* **YouTube:** Add Hide autoplay preview patch ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([79e3955](https://github.com/ReVanced/revanced-patches/commit/79e3955fde7068eac90ae404b3869c27f17bd5f7)) +* **YouTube:** Add more double tap to seek length options ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([fb04071](https://github.com/ReVanced/revanced-patches/commit/fb04071528683d38913c57f628cbab64bf0ef6a4)) +* **YouTube:** Remove obsolete seekbar thumbnail patch ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([9909fc1](https://github.com/ReVanced/revanced-patches/commit/9909fc1e5d490e9edb59894d66c6a929fbaebb3b)) +* **YouTube:** Support version 20.40.45 ([#6571](https://github.com/ReVanced/revanced-patches/issues/6571)) ([96c85d0](https://github.com/ReVanced/revanced-patches/commit/96c85d03712e79217dc8f97bcda5f38c0e47f064)) + # [6.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.51.0-dev.2...v6.0.0-dev.1) (2026-02-27) diff --git a/gradle.properties b/gradle.properties index 05c6263438..fa778eb069 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.1 +version = 6.0.0-dev.4 From adcaa11953c06fc7b6568a0dd2de97b07d5206c8 Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:03:34 +0100 Subject: [PATCH 110/161] build: Use more fitting repository name to pull Gradle plugin from --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 6e13ceb408..167fb51c8b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ pluginManagement { google() maven { name = "githubPackages" - url = uri("https://maven.pkg.github.com/revanced/revanced-patches") + url = uri("https://maven.pkg.github.com/revanced/revanced-patches-gradle-plugin") credentials(PasswordCredentials::class) } } From 00da4027707068f06ee7041b53d1316a7b218d5d Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Sat, 28 Feb 2026 20:05:29 +0100 Subject: [PATCH 111/161] fix(Reddit clients): Fix patching broken during patcher migration by searching for strings with contains(#6681) --- .../infinityforreddit/subscription/Fingerprints.kt | 5 +++-- .../customclients/sync/syncforreddit/api/Fingerprints.kt | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 0313a99321..daaa72793d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -1,12 +1,13 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription -import app.revanced.patcher.gettingFirstMethod import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.invoke import app.revanced.patcher.instructions import app.revanced.patcher.patch.BytecodePatchContext -internal val BytecodePatchContext.billingClientOnServiceConnectedMethod by gettingFirstMethod("Billing service connected") +internal val BytecodePatchContext.billingClientOnServiceConnectedMethod by gettingFirstMethodDeclaratively { + instructions("Billing service connected"(String::contains)) +} internal val BytecodePatchContext.startSubscriptionActivityMethod by gettingFirstMethodDeclaratively { instructions(0x10008000L()) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index 5b1044513a..976d062e40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api import app.revanced.patcher.ClassDefComposing import app.revanced.patcher.composingFirstMethod -import app.revanced.patcher.gettingFirstMethod +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.instructions import app.revanced.patcher.invoke import app.revanced.patcher.patch.BytecodePatchContext @@ -17,9 +17,9 @@ internal val ClassDef.getBearerTokenMethodMatch by ClassDefComposing.composingFi instructions(string { contains("Basic") }) } -internal val BytecodePatchContext.getUserAgentMethod by gettingFirstMethod( - "android:com.laurencedawson.reddit_sync", -) +internal val BytecodePatchContext.getUserAgentMethod by gettingFirstMethodDeclaratively { + instructions("android:com.laurencedawson.reddit_sync"(String::contains)) +} internal val BytecodePatchContext.imgurImageAPIMethodMatch by composingFirstMethod { instructions("https://imgur-apiv3.p.rapidapi.com/3/image"()) From 4dbc5312f5a356a0588aae487a14d983c1a6a83e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Feb 2026 19:08:53 +0000 Subject: [PATCH 112/161] chore: Release v6.0.0-dev.5 [skip ci] # [6.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.4...v6.0.0-dev.5) (2026-02-28) ### Bug Fixes * **Reddit clients:** Fix patching broken during patcher migration by searching for strings with contains([#6681](https://github.com/ReVanced/revanced-patches/issues/6681)) ([00da402](https://github.com/ReVanced/revanced-patches/commit/00da4027707068f06ee7041b53d1316a7b218d5d)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c813f95e04..61797b9d75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.4...v6.0.0-dev.5) (2026-02-28) + + +### Bug Fixes + +* **Reddit clients:** Fix patching broken during patcher migration by searching for strings with contains([#6681](https://github.com/ReVanced/revanced-patches/issues/6681)) ([00da402](https://github.com/ReVanced/revanced-patches/commit/00da4027707068f06ee7041b53d1316a7b218d5d)) + # [6.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.3...v6.0.0-dev.4) (2026-02-27) diff --git a/gradle.properties b/gradle.properties index fa778eb069..179f3590ee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.4 +version = 6.0.0-dev.5 From 4dfe3fb08812ed572e01e58a8604c1be9e989438 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 28 Feb 2026 22:24:48 +0100 Subject: [PATCH 113/161] fix: Move strings to correct patch --- .../src/main/resources/addresources/values/strings.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 4a990f5fda..44398a5479 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -849,6 +849,9 @@ Adjust volume by swiping vertically on the right side of the screen" Hide Search button Search button is hidden Search button is shown. + Enable wide search bar + Wide search bar is enabled + Wide search bar is disabled Flyout menu @@ -1197,11 +1200,6 @@ Limitation: Dislikes may not appear in incognito mode" Client rate limit encountered %d times %d milliseconds - - Enable wide search bar - Wide search bar is enabled - Wide search bar is disabled - SponsorBlock Enable SponsorBlock From f7d0a184405e71e9932410e54feafd08ad8f7e88 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Feb 2026 21:28:48 +0000 Subject: [PATCH 114/161] chore: Release v6.0.0-dev.6 [skip ci] # [6.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.5...v6.0.0-dev.6) (2026-02-28) ### Bug Fixes * Move strings to correct patch ([4dfe3fb](https://github.com/ReVanced/revanced-patches/commit/4dfe3fb08812ed572e01e58a8604c1be9e989438)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61797b9d75..b0ce205733 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.5...v6.0.0-dev.6) (2026-02-28) + + +### Bug Fixes + +* Move strings to correct patch ([4dfe3fb](https://github.com/ReVanced/revanced-patches/commit/4dfe3fb08812ed572e01e58a8604c1be9e989438)) + # [6.0.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.4...v6.0.0-dev.5) (2026-02-28) diff --git a/gradle.properties b/gradle.properties index 179f3590ee..94942ffda7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.5 +version = 6.0.0-dev.6 From 16e00ab4c0ff10e58adea40c7de72658788fcd97 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 28 Feb 2026 23:08:37 +0100 Subject: [PATCH 115/161] fix: Rename string keys correctly --- .../revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt | 3 --- .../layout/hide/player/popup/PlayerPopupPanelsPatch.kt | 2 +- patches/src/main/resources/addresources/values/strings.xml | 6 +++--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 97d2931f40..1ab994b61c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -14,9 +14,6 @@ import app.revanced.patcher.patch.ResourcePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patcher.firstClassDef -import app.revanced.patcher.firstImmutableClassDef -import app.revanced.patcher.patch.* import app.revanced.patches.all.misc.packagename.changePackageNamePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt index dfebabb2f5..71d0888516 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/popup/PlayerPopupPanelsPatch.kt @@ -39,7 +39,7 @@ val disablePlayerPopupPanelsPatch = bytecodePatch( addResources("youtube", "layout.panels.popup.playerPopupPanelsPatch") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_player_popup_panels"), + SwitchPreference("revanced_disable_player_popup_panels"), ) getEngagementPanelControllerMethodMatch().method.addInstructionsWithLabels( diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 44398a5479..f444c66291 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1128,9 +1128,9 @@ Settings → Playback → Autoplay next video" Timestamp is shown - Hide player popup panels - Player popup panels are hidden - Player popup panels are shown + Hide player popup panels + Player popup panels are hidden + Player popup panels are shown Exit fullscreen mode at end of video From 0cd6be5cd8eb2a819fedd648add94f3f2731418c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Feb 2026 22:12:17 +0000 Subject: [PATCH 116/161] chore: Release v6.0.0-dev.7 [skip ci] # [6.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.6...v6.0.0-dev.7) (2026-02-28) ### Bug Fixes * Rename string keys correctly ([16e00ab](https://github.com/ReVanced/revanced-patches/commit/16e00ab4c0ff10e58adea40c7de72658788fcd97)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0ce205733..14e9bd5300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.6...v6.0.0-dev.7) (2026-02-28) + + +### Bug Fixes + +* Rename string keys correctly ([16e00ab](https://github.com/ReVanced/revanced-patches/commit/16e00ab4c0ff10e58adea40c7de72658788fcd97)) + # [6.0.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.5...v6.0.0-dev.6) (2026-02-28) diff --git a/gradle.properties b/gradle.properties index 94942ffda7..1bcf9cf771 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.6 +version = 6.0.0-dev.7 From 4d94a41c46f2d4e1bf33debc95b8aa84a64964bb Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 1 Mar 2026 00:10:52 +0100 Subject: [PATCH 117/161] fix(GmsCore support): Try replacing in strings before prefixing to handle more edge cases --- .../shared/misc/gms/GmsCoreSupportPatch.kt | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 1ab994b61c..e9c994e3d3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -87,15 +87,11 @@ fun gmsCoreSupportPatch( "com.google.android.gms", in GMS_PERMISSIONS, in GMS_AUTHORITIES, - -> if (string.startsWith("com.google")) { - string.replace("com.google", gmsCoreVendorGroupId) - } else { - "$gmsCoreVendorGroupId.$string" - } + -> string.prefixOrReplace("com.google", gmsCoreVendorGroupId) in APP_PERMISSIONS, in APP_AUTHORITIES, - -> "$toPackageName.$string" + -> string.prefixOrReplace(fromPackageName, toPackageName) else -> null } @@ -116,7 +112,17 @@ fun gmsCoreSupportPatch( } in APP_AUTHORITIES -> - string.replace(it.authority, "$toPackageName.${it.authority}") + if (it.authority.startsWith(fromPackageName)) { + string.replace( + it.authority, + it.authority.replace(fromPackageName, toPackageName) + ) + } else { + string.replace( + it.authority, + "$toPackageName.${it.authority}", + ) + } else -> null } @@ -226,7 +232,7 @@ fun gmsCoreSupportResourcePatch( node.attributes.getNamedItem("android:name").apply { APP_PERMISSIONS += textContent - textContent = "$toPackageName.$textContent" + textContent = textContent.prefixOrReplace(fromPackageName, toPackageName) } } @@ -235,7 +241,7 @@ fun gmsCoreSupportResourcePatch( if (textContent in GMS_PERMISSIONS) { textContent.replace("com.google", gmsCoreVendorGroupId) } else if (textContent in APP_PERMISSIONS) { - textContent = "$toPackageName.$textContent" + textContent = textContent.prefixOrReplace(fromPackageName, toPackageName) } } } @@ -245,7 +251,8 @@ fun gmsCoreSupportResourcePatch( textContent = textContent.split(";") .joinToString(";") { authority -> APP_AUTHORITIES += authority - "$toPackageName.$authority" + + authority.replace(fromPackageName, toPackageName) } } } @@ -345,3 +352,9 @@ private object Constants { val APP_AUTHORITIES = mutableSetOf() } + +fun String.prefixOrReplace(from: String, to: String) = if (startsWith(from)) { + replace(from, to) +} else { + "$to.$this" +} From c6da2841a143715d44d5948f9f435c3b6a48fcc0 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Feb 2026 23:14:40 +0000 Subject: [PATCH 118/161] chore: Release v6.0.0-dev.8 [skip ci] # [6.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.7...v6.0.0-dev.8) (2026-02-28) ### Bug Fixes * **GmsCore support:** Try replacing in strings before prefixing to handle more edge cases ([4d94a41](https://github.com/ReVanced/revanced-patches/commit/4d94a41c46f2d4e1bf33debc95b8aa84a64964bb)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14e9bd5300..269a8971f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.7...v6.0.0-dev.8) (2026-02-28) + + +### Bug Fixes + +* **GmsCore support:** Try replacing in strings before prefixing to handle more edge cases ([4d94a41](https://github.com/ReVanced/revanced-patches/commit/4d94a41c46f2d4e1bf33debc95b8aa84a64964bb)) + # [6.0.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.6...v6.0.0-dev.7) (2026-02-28) diff --git a/gradle.properties b/gradle.properties index 1bcf9cf771..8b8fa1d8eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.7 +version = 6.0.0-dev.8 From 2a10489a869cbab1ed01502bc6fe9330c4052e06 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 1 Mar 2026 00:54:36 +0100 Subject: [PATCH 119/161] fix(YouTube): Add back missing custom filter by adding the preference to the correct screen --- .../layout/hide/general/HideLayoutComponentsPatch.kt | 2 ++ .../layout/hide/general/HideLayoutComponentsPatch.kt | 5 +++-- .../dialog/RemoveViewerDiscretionDialogPatch.kt | 3 +-- .../youtube/layout/branding/CustomBrandingPatch.kt | 2 +- .../youtube/layout/branding/header/ChangeHeaderPatch.kt | 3 +-- .../layout/buttons/navigation/NavigationBarPatch.kt | 6 +++--- .../youtube/layout/formfactor/ChangeFormFactorPatch.kt | 2 +- .../layout/hide/general/HideLayoutComponentsPatch.kt | 2 +- .../layout/spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../youtube/layout/startpage/ChangeStartPagePatch.kt | 2 +- .../revanced/patches/youtube/layout/theme/ThemePatch.kt | 4 ++-- .../patches/youtube/misc/settings/SettingsPatch.kt | 8 ++++---- 12 files changed, 21 insertions(+), 20 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt index 7c88029dca..e44f4cc0f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/hide/general/HideLayoutComponentsPatch.kt @@ -3,10 +3,12 @@ package app.revanced.patches.music.layout.hide.general import app.revanced.patches.music.misc.litho.filter.lithoFilterPatch import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.shared.layout.hide.general.hideLayoutComponentsPatch +import app.revanced.patches.music.misc.settings.PreferenceScreen val hideLayoutComponentsPatch = hideLayoutComponentsPatch( lithoFilterPatch = lithoFilterPatch, settingsPatch = settingsPatch, + generalSettingsScreen = PreferenceScreen.GENERAL, filterClasses = setOf("Lapp/revanced/extension/shared/patches/litho/CustomFilter;"), compatibleWithPackages = arrayOf( "com.google.android.apps.youtube.music" to setOf( diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt index aa13dc7e0c..dda9f05ae4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/hide/general/HideLayoutComponentsPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.shared.misc.litho.filter.addLithoFilter +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -16,6 +16,7 @@ import kotlin.collections.toTypedArray internal fun hideLayoutComponentsPatch( lithoFilterPatch: Patch, settingsPatch: Patch, + generalSettingsScreen: BasePreferenceScreen.Screen, additionalDependencies: Set = emptySet(), filterClasses: Set, vararg compatibleWithPackages: Pair?>, @@ -36,7 +37,7 @@ internal fun hideLayoutComponentsPatch( apply { addResources("shared", "layout.hide.general.hideLayoutComponentsPatch") - PreferenceScreen.GENERAL.addPreferences( + generalSettingsScreen.addPreferences( PreferenceScreenPreference( key = "revanced_custom_filter_screen", sorting = PreferenceScreenPreference.Sorting.UNSORTED, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index b57010b903..a1260cdd0c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -9,7 +9,6 @@ import app.revanced.patcher.extensions.instructions import app.revanced.patcher.extensions.replaceInstructions import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.immutableClassDef -import app.revanced.patcher.instructions import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.returnType @@ -53,7 +52,7 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( apply { addResources("youtube", "interaction.dialog.removeViewerDiscretionDialogPatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_remove_viewer_discretion_dialog"), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index befd7171e9..36c6aa2653 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -19,7 +19,7 @@ val customBrandingPatch = baseCustomBrandingPatch( getMainActivityOnCreate = BytecodePatchContext::mainActivityOnCreateMethod::get, mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME, activityAliasNameWithIntents = $$"com.google.android.youtube.app.honeycomb.Shell$HomeActivity", - preferenceScreen = PreferenceScreen.GENERAL_LAYOUT, + preferenceScreen = PreferenceScreen.GENERAL, block = { dependsOn(sharedExtensionPatch) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index 38b40e4d33..4555a64b3c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -3,7 +3,6 @@ package app.revanced.patches.youtube.layout.branding.header import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.wideLiteral -import app.revanced.patcher.firstMethod import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -135,7 +134,7 @@ val changeHeaderPatch = resourcePatch( apply { addResources("youtube", "layout.branding.changeHeaderPatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( if (custom == null) { ListPreference("revanced_header_logo") } else { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt index 8abeeab8d3..64df88bb37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationBarPatch.kt @@ -82,7 +82,7 @@ val navigationBarPatch = bytecodePatch( preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_light") preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_disable_translucent_status_bar") ) @@ -91,7 +91,7 @@ val navigationBarPatch = bytecodePatch( } } - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", sorting = Sorting.UNSORTED, @@ -189,7 +189,7 @@ val navigationBarPatch = bytecodePatch( toolbarPreferences += SwitchPreference("revanced_wide_searchbar") } - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( PreferenceScreenPreference( key = "revanced_toolbar_screen", sorting = Sorting.UNSORTED, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index d20f4d742d..c1ca314270 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -44,7 +44,7 @@ val changeFormFactorPatch = bytecodePatch( apply { addResources("youtube", "layout.formfactor.changeFormFactorPatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( ListPreference("revanced_change_form_factor"), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 864583af4c..ea7fd4c919 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -31,7 +31,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter @@ -77,6 +76,7 @@ private const val KEYWORD_FILTER_CLASS_NAME = val hideLayoutComponentsPatch = hideLayoutComponentsPatch( lithoFilterPatch = lithoFilterPatch, settingsPatch = settingsPatch, + generalSettingsScreen = PreferenceScreen.GENERAL, additionalDependencies = setOf( hideLayoutComponentsResourcePatch, navigationBarHookPatch, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index f55cab1921..0704ca1036 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -51,7 +51,7 @@ val spoofAppVersionPatch = bytecodePatch( apply { addResources("youtube", "layout.spoofappversion.spoofAppVersionPatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( // Group the switch and list preference together, since General menu is sorted by name // and the preferences can be scattered apart with non English languages. PreferenceCategory( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index c2d47290db..599a6e36ea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -43,7 +43,7 @@ val changeStartPagePatch = bytecodePatch( apply { addResources("youtube", "layout.startpage.changeStartPagePatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( PreferenceCategory( titleKey = null, sorting = Sorting.UNSORTED, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index f1d4fb2cc5..87a40c54dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -203,7 +203,7 @@ val themePatch = baseThemePatch( executeBlock = { addResources("youtube", "layout.theme.themePatch") - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_gradient_loading_screen"), ) @@ -231,7 +231,7 @@ val themePatch = baseThemePatch( ) if (is_19_47_or_greater) { - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( ListPreference("revanced_splash_screen_animation_style"), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 3eb9d2eb15..dd3dd01761 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -188,16 +188,16 @@ val settingsPatch = bytecodePatch( ) if (is_19_34_or_greater) { - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_restore_old_settings_menus"), ) } - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_settings_search_history"), ) - PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen.GENERAL.addPreferences( if (is_20_31_or_greater) { PreferenceCategory( titleKey = null, @@ -382,7 +382,7 @@ object PreferenceScreen : BasePreferenceScreen() { iconBold = "@drawable/revanced_settings_screen_03_feed_bold", layout = "@layout/preference_with_icon", ) - val GENERAL_LAYOUT = Screen( + val GENERAL = Screen( key = "revanced_settings_screen_04_general", summaryKey = null, icon = "@drawable/revanced_settings_screen_04_general", From d5c896167558bfecb2952117eb2abbeb3acb8b84 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Feb 2026 23:58:41 +0000 Subject: [PATCH 120/161] chore: Release v6.0.0-dev.9 [skip ci] # [6.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.8...v6.0.0-dev.9) (2026-02-28) ### Bug Fixes * **YouTube:** Add back missing custom filter by adding the preference to the correct screen ([2a10489](https://github.com/ReVanced/revanced-patches/commit/2a10489a869cbab1ed01502bc6fe9330c4052e06)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 269a8971f1..c8f0c00d69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.8...v6.0.0-dev.9) (2026-02-28) + + +### Bug Fixes + +* **YouTube:** Add back missing custom filter by adding the preference to the correct screen ([2a10489](https://github.com/ReVanced/revanced-patches/commit/2a10489a869cbab1ed01502bc6fe9330c4052e06)) + # [6.0.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.7...v6.0.0-dev.8) (2026-02-28) diff --git a/gradle.properties b/gradle.properties index 8b8fa1d8eb..82beaccdcc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.8 +version = 6.0.0-dev.9 From 26d8a9e5f891e08fe3c23601e8238de6a301b8df Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 1 Mar 2026 01:08:09 +0100 Subject: [PATCH 121/161] fix(Enable debugging): Add missing preference to log protocol buffer --- .../patches/shared/misc/debugging/EnableDebuggingPatch.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt index 5d84c52978..191aa17909 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/EnableDebuggingPatch.kt @@ -78,6 +78,7 @@ internal fun enableDebuggingPatch( preferences + additionalDebugPreferences preferences += listOf( + SwitchPreference("revanced_debug_protocolbuffer"), SwitchPreference("revanced_debug_stacktrace"), SwitchPreference("revanced_debug_toast_on_error"), NonInteractivePreference( From 4936011ad50479039a43eef3c390363963d7f5c0 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 1 Mar 2026 00:12:25 +0000 Subject: [PATCH 122/161] chore: Release v6.0.0-dev.10 [skip ci] # [6.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.9...v6.0.0-dev.10) (2026-03-01) ### Bug Fixes * **Enable debugging:** Add missing preference to log protocol buffer ([26d8a9e](https://github.com/ReVanced/revanced-patches/commit/26d8a9e5f891e08fe3c23601e8238de6a301b8df)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8f0c00d69..c937927382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.9...v6.0.0-dev.10) (2026-03-01) + + +### Bug Fixes + +* **Enable debugging:** Add missing preference to log protocol buffer ([26d8a9e](https://github.com/ReVanced/revanced-patches/commit/26d8a9e5f891e08fe3c23601e8238de6a301b8df)) + # [6.0.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.8...v6.0.0-dev.9) (2026-02-28) diff --git a/gradle.properties b/gradle.properties index 82beaccdcc..7c19720f8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.9 +version = 6.0.0-dev.10 From 0f378c9cea58bbca9b6fa04229488f0444781fb2 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 2 Mar 2026 12:57:46 +0100 Subject: [PATCH 123/161] ci: Do not archive PR build artifacts --- .github/workflows/build_pull_request.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 505feaa0b6..adf6c2fa6f 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -43,3 +43,4 @@ jobs: with: name: revanced-patches path: patches/build/libs + archive: false From 9d55d00ff46a2cd18111a91a98dbc8e3137dd0ed Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 2 Mar 2026 17:34:47 +0100 Subject: [PATCH 124/161] fix: Use correct string key --- .../src/main/resources/addresources/values/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index f444c66291..d2f3b702a6 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -185,10 +185,10 @@ You will not be notified of any unexpected events." Flags reset Flags copied to clipboard Restart the app to use this feature - Log protocol buffer - Debug logs include proto buffer - Debug logs do not include proto buffer - "Enabling this setting will log additional layout data, including on-screen text for some UI components. + Log protocol buffer + Debug logs include proto buffer + Debug logs do not include proto buffer + "Enabling this setting will log additional layout data, including on-screen text for some UI components. This can help identify components when creating custom filters. From 29b60bad4c1d1452b34ad4fc30c9adfa8cd6ba01 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 2 Mar 2026 16:38:29 +0000 Subject: [PATCH 125/161] chore: Release v6.0.0-dev.11 [skip ci] # [6.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.10...v6.0.0-dev.11) (2026-03-02) ### Bug Fixes * Use correct string key ([9d55d00](https://github.com/ReVanced/revanced-patches/commit/9d55d00ff46a2cd18111a91a98dbc8e3137dd0ed)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c937927382..d216f863c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.10...v6.0.0-dev.11) (2026-03-02) + + +### Bug Fixes + +* Use correct string key ([9d55d00](https://github.com/ReVanced/revanced-patches/commit/9d55d00ff46a2cd18111a91a98dbc8e3137dd0ed)) + # [6.0.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.9...v6.0.0-dev.10) (2026-03-01) diff --git a/gradle.properties b/gradle.properties index 7c19720f8f..e3bceb1f72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.10 +version = 6.0.0-dev.11 From e4dea682c6640ce817d5e30cfddec953fe85436f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 2 Mar 2026 18:18:10 +0100 Subject: [PATCH 126/161] feat(Check environment patch): Support another ReVanced Manager debug variant package name --- .../extension/shared/checks/CheckEnvironmentPatch.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java index 4eb4c23c48..b5fe752c25 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java @@ -7,8 +7,10 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.util.Base64; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; @@ -39,6 +41,7 @@ public final class CheckEnvironmentPatch { ADB((String) null), ROOT_MOUNT_ON_APP_STORE("com.android.vending"), MANAGER("app.revanced.manager.flutter", + "app.revanced.manager.flutter.debug", "app.revanced.manager", "app.revanced.manager.debug"); From 0a734528dc4407571ae1dba3e80347bc9f236e3e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 2 Mar 2026 18:21:05 +0100 Subject: [PATCH 127/161] fix: Fix return type check to match method successfully --- .../revanced/patches/music/layout/navigationbar/Fingerprints.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt index 0021d79190..90448053f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt @@ -37,7 +37,7 @@ internal val BytecodePatchContext.tabLayoutTextMethodMatch by composingFirstMeth 5, allOf( Opcode.INVOKE_STATIC(), - method { returnType == "L" && parameterTypes.size == 1 && parameterTypes.first() == "I" }) + method { returnType.startsWith("L") && parameterTypes.size == 1 && parameterTypes.first() == "I" }) ), after(Opcode.MOVE_RESULT_OBJECT()), // Hide navigation buttons. From 8125741d906a66753d3180dae88908e21d0541ff Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 2 Mar 2026 17:26:36 +0000 Subject: [PATCH 128/161] chore: Release v6.0.0-dev.12 [skip ci] # [6.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.11...v6.0.0-dev.12) (2026-03-02) ### Bug Fixes * Fix return type check to match method successfully ([0a73452](https://github.com/ReVanced/revanced-patches/commit/0a734528dc4407571ae1dba3e80347bc9f236e3e)) ### Features * **Check environment patch:** Support another ReVanced Manager debug variant package name ([e4dea68](https://github.com/ReVanced/revanced-patches/commit/e4dea682c6640ce817d5e30cfddec953fe85436f)) --- CHANGELOG.md | 12 ++++++++++++ gradle.properties | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d216f863c3..35c9c48768 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [6.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.11...v6.0.0-dev.12) (2026-03-02) + + +### Bug Fixes + +* Fix return type check to match method successfully ([0a73452](https://github.com/ReVanced/revanced-patches/commit/0a734528dc4407571ae1dba3e80347bc9f236e3e)) + + +### Features + +* **Check environment patch:** Support another ReVanced Manager debug variant package name ([e4dea68](https://github.com/ReVanced/revanced-patches/commit/e4dea682c6640ce817d5e30cfddec953fe85436f)) + # [6.0.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.10...v6.0.0-dev.11) (2026-03-02) diff --git a/gradle.properties b/gradle.properties index e3bceb1f72..521d0e96b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.11 +version = 6.0.0-dev.12 From 56a087dbacf331ccadfe753cbc1ced77e318fc27 Mon Sep 17 00:00:00 2001 From: drobotk Date: Mon, 2 Mar 2026 23:26:26 +0100 Subject: [PATCH 129/161] fix: Use custom comparison block for strings in `anyOf` --- .../patches/music/layout/navigationbar/Fingerprints.kt | 4 ++-- .../patches/youtube/video/information/Fingerprints.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt index 90448053f5..f2169cbdca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt @@ -13,8 +13,8 @@ internal val BytecodePatchContext.tabLayoutTextMethodMatch by composingFirstMeth parameterTypes("L") instructions( anyOf( - "FEmusic_search"(), // 8.49 and lower. - "FEsearch"() // 8.50+ + "FEmusic_search" { equals(it) }, // 8.49 and lower. Must use custom comparison block, otherwise string is added to stringsList for lookup + "FEsearch" { equals(it) } // 8.50+ ), // Hide navigation label. ResourceType.ID("text1"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 544cad4d0e..e5b5657a5e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -60,9 +60,9 @@ internal fun ClassDef.getSeekMethod() = firstImmutableMethodDeclaratively { instructions( anyOf( // 20.xx - "Attempting to seek during an ad"(), + "Attempting to seek during an ad" { equals(it) }, // Must use custom comparison block, otherwise string is added to stringsList for lookup // 21.02+ - "currentPositionMs."() + "currentPositionMs." { equals(it) } ) ) } From eff53885206092d20e704b3a4b1b975c2985420e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 2 Mar 2026 22:30:24 +0000 Subject: [PATCH 130/161] chore: Release v6.0.0-dev.13 [skip ci] # [6.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.12...v6.0.0-dev.13) (2026-03-02) ### Bug Fixes * Use custom comparison block for strings in `anyOf` ([56a087d](https://github.com/ReVanced/revanced-patches/commit/56a087dbacf331ccadfe753cbc1ced77e318fc27)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35c9c48768..a87d40e2e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.12...v6.0.0-dev.13) (2026-03-02) + + +### Bug Fixes + +* Use custom comparison block for strings in `anyOf` ([56a087d](https://github.com/ReVanced/revanced-patches/commit/56a087dbacf331ccadfe753cbc1ced77e318fc27)) + # [6.0.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.11...v6.0.0-dev.12) (2026-03-02) diff --git a/gradle.properties b/gradle.properties index 521d0e96b0..297827db91 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.12 +version = 6.0.0-dev.13 From b8b4cfbd016058a158364f4549e7ef6ed4d154e0 Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Tue, 3 Mar 2026 08:30:04 +0100 Subject: [PATCH 131/161] fix(YouTube - Playback speed): Use correct extension method name --- .../patches/playback/speed/CustomPlaybackSpeedPatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java index 198a05c1c8..767ea7d7c3 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java @@ -111,7 +111,7 @@ public class CustomPlaybackSpeedPatch { /** * Injection point. */ - public static float tapAndHoldSpeed() { + public static float getTapAndHoldSpeed() { return TAP_AND_HOLD_SPEED; } From 380be33fedb1981a6e4af0d509205a07da35448e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 3 Mar 2026 07:33:54 +0000 Subject: [PATCH 132/161] chore: Release v6.0.0-dev.14 [skip ci] # [6.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.13...v6.0.0-dev.14) (2026-03-03) ### Bug Fixes * **YouTube - Playback speed:** Use correct extension method name ([b8b4cfb](https://github.com/ReVanced/revanced-patches/commit/b8b4cfbd016058a158364f4549e7ef6ed4d154e0)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a87d40e2e4..acfd7da560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.13...v6.0.0-dev.14) (2026-03-03) + + +### Bug Fixes + +* **YouTube - Playback speed:** Use correct extension method name ([b8b4cfb](https://github.com/ReVanced/revanced-patches/commit/b8b4cfbd016058a158364f4549e7ef6ed4d154e0)) + # [6.0.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.12...v6.0.0-dev.13) (2026-03-02) diff --git a/gradle.properties b/gradle.properties index 297827db91..72f3607679 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.13 +version = 6.0.0-dev.14 From 393700f74ac141bfa109988202707b40d35a64ea Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 5 Mar 2026 22:26:14 +0100 Subject: [PATCH 133/161] fix(Check environment): Use another (also more suitable) API to circumvent a bug --- .../patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt | 4 ++-- .../app/revanced/patches/shared/misc/checks/Fingerprints.kt | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt index dafda23bdd..19d924f11c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.kt @@ -29,7 +29,7 @@ fun checkEnvironmentPatch( ) = bytecodePatch( description = "Checks, if the application was patched by, otherwise warns the user.", ) { - compatibleWith(*compatiblePackages) + compatibleWith(packages = compatiblePackages) dependsOn( extensionPatch, @@ -41,7 +41,7 @@ fun checkEnvironmentPatch( fun setPatchInfo() { fun MutableClassDef.setClassFields(vararg fieldNameValues: Pair) { - val fieldNameValueMap = mapOf(*fieldNameValues) + val fieldNameValueMap = mapOf(pairs = fieldNameValues) fields.forEach { field -> field.initialValue = fieldNameValueMap[field.name] ?: return@forEach diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt index 237344acb2..3570ad86fb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt @@ -1,12 +1,13 @@ package app.revanced.patches.shared.misc.checks +import app.revanced.patcher.gettingFirstClassDef import app.revanced.patcher.gettingFirstClassDefDeclaratively import app.revanced.patcher.patch.BytecodePatchContext -internal val BytecodePatchContext.patchInfoClassDef by gettingFirstClassDefDeclaratively( +internal val BytecodePatchContext.patchInfoClassDef by gettingFirstClassDef( "Lapp/revanced/extension/shared/checks/PatchInfo;" ) -internal val BytecodePatchContext.patchInfoBuildClassDef by gettingFirstClassDefDeclaratively( +internal val BytecodePatchContext.patchInfoBuildClassDef by gettingFirstClassDef( $$"Lapp/revanced/extension/shared/checks/PatchInfo$Build;" ) From 79b6733eecd65be88b05a662f94d7b00d8340292 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Mar 2026 21:29:55 +0000 Subject: [PATCH 134/161] chore: Release v6.0.0-dev.15 [skip ci] # [6.0.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.14...v6.0.0-dev.15) (2026-03-05) ### Bug Fixes * **Check environment:** Use another (also more suitable) API to circumvent a bug ([393700f](https://github.com/ReVanced/revanced-patches/commit/393700f74ac141bfa109988202707b40d35a64ea)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acfd7da560..de807be354 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.14...v6.0.0-dev.15) (2026-03-05) + + +### Bug Fixes + +* **Check environment:** Use another (also more suitable) API to circumvent a bug ([393700f](https://github.com/ReVanced/revanced-patches/commit/393700f74ac141bfa109988202707b40d35a64ea)) + # [6.0.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.13...v6.0.0-dev.14) (2026-03-03) diff --git a/gradle.properties b/gradle.properties index 72f3607679..3ec9b76458 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.14 +version = 6.0.0-dev.15 From 46fb3669ee59534327d7c3d78e07b813d8a2badb Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:17:53 +0100 Subject: [PATCH 135/161] fix(YouTube - Spoof app version): Remove target `19.35.36` no longer supported by YouTube (#6717) --- .../extension/youtube/settings/Settings.java | 2 +- .../spoofappversion/SpoofAppVersionPatch.kt | 18 +----------------- .../resources/addresources/values/arrays.xml | 16 ---------------- .../resources/addresources/values/strings.xml | 1 - 4 files changed, 2 insertions(+), 35 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index da8d9d4e95..d69ed54e2d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -299,7 +299,7 @@ public class Settings extends YouTubeAndMusicSettings { public static final EnumSetting CHANGE_START_PAGE = new EnumSetting<>("revanced_change_start_page", StartPage.DEFAULT, true); public static final BooleanSetting CHANGE_START_PAGE_ALWAYS = new BooleanSetting("revanced_change_start_page_always", FALSE, true, new ChangeStartPageTypeAvailability()); - public static final StringSetting SPOOF_APP_VERSION_TARGET = new StringSetting("revanced_spoof_app_version_target", "19.35.36", true, parent(SPOOF_APP_VERSION)); + public static final StringSetting SPOOF_APP_VERSION_TARGET = new StringSetting("revanced_spoof_app_version_target", "20.05.46", true, parent(SPOOF_APP_VERSION)); // Navigation buttons public static final BooleanSetting HIDE_HOME_BUTTON = new BooleanSetting("revanced_hide_home_button", FALSE, true); public static final BooleanSetting HIDE_CREATE_BUTTON = new BooleanSetting("revanced_hide_create_button", TRUE, true); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 0704ca1036..74e4d65c5d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -13,8 +13,6 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -60,21 +58,7 @@ val spoofAppVersionPatch = bytecodePatch( tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", preferences = setOf( SwitchPreference("revanced_spoof_app_version"), - if (is_20_14_or_greater) { - ListPreference("revanced_spoof_app_version_target") - } else if (is_19_43_or_greater) { - ListPreference( - key = "revanced_spoof_app_version_target", - entriesKey = "revanced_spoof_app_version_target_legacy_20_13_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values", - ) - } else { - ListPreference( - key = "revanced_spoof_app_version_target", - entriesKey = "revanced_spoof_app_version_target_legacy_19_34_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values", - ) - }, + ListPreference("revanced_spoof_app_version_target") ), ), ) diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 0be0a47ed0..230b9b8f38 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -302,26 +302,10 @@ @string/revanced_spoof_app_version_target_entry_1 @string/revanced_spoof_app_version_target_entry_2 - @string/revanced_spoof_app_version_target_entry_3 20.13.41 20.05.46 - 19.35.36 - - - @string/revanced_spoof_app_version_target_entry_2 - @string/revanced_spoof_app_version_target_entry_3 - - - 20.05.46 - 19.35.36 - - - 19.01.34 - - - 19.01.34 diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index d2f3b702a6..95da75bad4 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1441,7 +1441,6 @@ If later turned off, it is recommended to clear the app data to prevent UI bugs. Spoof app version target 20.13.41 - Restore non collapsed video action bar 20.05.46 - Restore transcript functionality - 19.35.36 - Restore old Shorts player icons Change start page From e9bfb7ca9bcd1499f1abe8872999aefff10cd187 Mon Sep 17 00:00:00 2001 From: rospino74 <34315725+rospino74@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:19:29 +0100 Subject: [PATCH 136/161] fix(YouTube Music): Prevent crash on bold icons loading (#6712) --- .../extension/music/VersionCheckUtils.java | 12 ++++++++ .../music/settings/MusicActivityHook.java | 29 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/VersionCheckUtils.java diff --git a/extensions/music/src/main/java/app/revanced/extension/music/VersionCheckUtils.java b/extensions/music/src/main/java/app/revanced/extension/music/VersionCheckUtils.java new file mode 100644 index 0000000000..76331a720b --- /dev/null +++ b/extensions/music/src/main/java/app/revanced/extension/music/VersionCheckUtils.java @@ -0,0 +1,12 @@ +package app.revanced.extension.music; + +import app.revanced.extension.shared.Utils; + +public class VersionCheckUtils { + private static boolean isVersionOrGreater(String version) { + return Utils.getAppVersionName().compareTo(version) >= 0; + } + + public static final boolean IS_8_40_OR_GREATER = isVersionOrGreater("8.40.00"); +} + diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java index 5d6f6ce54a..c3874f655c 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java @@ -8,6 +8,7 @@ import android.preference.PreferenceFragment; import android.view.View; import android.widget.Toolbar; +import app.revanced.extension.music.VersionCheckUtils; import app.revanced.extension.music.settings.preference.MusicPreferenceFragment; import app.revanced.extension.music.settings.search.MusicSearchViewController; import app.revanced.extension.shared.Logger; @@ -23,6 +24,24 @@ public class MusicActivityHook extends BaseActivityHook { @SuppressLint("StaticFieldLeak") public static MusicSearchViewController searchViewController; + /** + * How much time has passed since the first launch of the app. Simple check to prevent + * forcing bold icons on first launch where the settings menu is partially broken + * due to missing icon resources the client has not yet received. + * + * @see app.revanced.extension.youtube.settings.YouTubeActivityHook#MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS + */ + private static final long MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS = 30 * 1000; // 30 seconds. + + static { + final boolean useBoldIcons = VersionCheckUtils.IS_8_40_OR_GREATER + && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get() + && (System.currentTimeMillis() - Settings.FIRST_TIME_APP_LAUNCHED.get()) + > MINIMUM_TIME_AFTER_FIRST_LAUNCH_BEFORE_ALLOWING_BOLD_ICONS; + + Utils.setAppIsUsingBoldIcons(useBoldIcons); + } + /** * Injection point. */ @@ -116,4 +135,14 @@ public class MusicActivityHook extends BaseActivityHook { public static boolean handleFinish() { return MusicSearchViewController.handleFinish(searchViewController); } + + /** + * Injection point. + *

+ * Decides whether to use bold icons. + */ + @SuppressWarnings("unused") + public static boolean useBoldIcons(boolean original) { + return Utils.appIsUsingBoldIcons(); + } } From f045923cef3273bc448d10b60a601a2274bba0b4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Mar 2026 22:23:17 +0000 Subject: [PATCH 137/161] chore: Release v6.0.0-dev.16 [skip ci] # [6.0.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.15...v6.0.0-dev.16) (2026-03-05) ### Bug Fixes * **YouTube - Spoof app version:** Remove target `19.35.36` no longer supported by YouTube ([#6717](https://github.com/ReVanced/revanced-patches/issues/6717)) ([46fb366](https://github.com/ReVanced/revanced-patches/commit/46fb3669ee59534327d7c3d78e07b813d8a2badb)) * **YouTube Music:** Prevent crash on bold icons loading ([#6712](https://github.com/ReVanced/revanced-patches/issues/6712)) ([e9bfb7c](https://github.com/ReVanced/revanced-patches/commit/e9bfb7ca9bcd1499f1abe8872999aefff10cd187)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de807be354..78cffe5d16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [6.0.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.15...v6.0.0-dev.16) (2026-03-05) + + +### Bug Fixes + +* **YouTube - Spoof app version:** Remove target `19.35.36` no longer supported by YouTube ([#6717](https://github.com/ReVanced/revanced-patches/issues/6717)) ([46fb366](https://github.com/ReVanced/revanced-patches/commit/46fb3669ee59534327d7c3d78e07b813d8a2badb)) +* **YouTube Music:** Prevent crash on bold icons loading ([#6712](https://github.com/ReVanced/revanced-patches/issues/6712)) ([e9bfb7c](https://github.com/ReVanced/revanced-patches/commit/e9bfb7ca9bcd1499f1abe8872999aefff10cd187)) + # [6.0.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.14...v6.0.0-dev.15) (2026-03-05) diff --git a/gradle.properties b/gradle.properties index 3ec9b76458..cf402f817a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.15 +version = 6.0.0-dev.16 From fdfed3c9dd46f477c1cc1b9db0f08054ffa32293 Mon Sep 17 00:00:00 2001 From: Jack <18360463+wowitsjack@users.noreply.github.com> Date: Fri, 6 Mar 2026 21:27:41 +1000 Subject: [PATCH 138/161] fix(YouTube - Spoof video streams): Make it work on 21.x (#6705) Co-authored-by: wowitsjack Co-authored-by: oSumAtrIX --- .../youtube/patches/ExitFullscreenPatch.java | 4 ++-- .../patches/HidePlayerOverlayButtonsPatch.java | 8 ++++---- .../youtube/patches/PlayerControlsPatch.java | 11 +++++------ .../shared/misc/spoof/SpoofVideoStreamsPatch.kt | 6 +++--- .../youtube/layout/buttons/overlay/Fingerprints.kt | 3 ++- .../buttons/overlay/HidePlayerOverlayButtonsPatch.kt | 10 ++++++---- .../youtube/misc/playercontrols/Fingerprints.kt | 2 +- .../misc/playercontrols/PlayerControlsPatch.kt | 2 +- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java index abb2d6ba9e..1666860287 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java @@ -1,6 +1,6 @@ package app.revanced.extension.youtube.patches; -import android.widget.ImageView; +import android.view.View; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; @@ -46,7 +46,7 @@ public class ExitFullscreenPatch { // To fix this, push the perform click to the back fo the main thread, // and by then the overlay controls will be visible since the video is now finished. Utils.runOnMainThreadDelayed(() -> { - ImageView button = PlayerControlsPatch.fullscreenButtonRef.get(); + View button = PlayerControlsPatch.fullscreenButtonRef.get(); if (button == null) { Logger.printDebug(() -> "Fullscreen button is null, cannot click"); } else { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index d7a413b790..3c6937a996 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -109,13 +109,13 @@ public final class HidePlayerOverlayButtonsPatch { /** * Injection point. */ - public static ImageView hideFullscreenButton(ImageView imageView) { + public static View hideFullscreenButton(View view) { if (!Settings.HIDE_FULLSCREEN_BUTTON.get()) { - return imageView; + return view; } - if (imageView != null) { - imageView.setVisibility(View.GONE); + if (view != null) { + view.setVisibility(View.GONE); } return null; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java index be7fe91190..482c0c3c49 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java @@ -2,7 +2,6 @@ package app.revanced.extension.youtube.patches; import android.view.View; import android.view.ViewTreeObserver; -import android.widget.ImageView; import java.lang.ref.WeakReference; @@ -11,7 +10,7 @@ import app.revanced.extension.shared.Logger; @SuppressWarnings("unused") public class PlayerControlsPatch { - public static WeakReference fullscreenButtonRef = new WeakReference<>(null); + public static WeakReference fullscreenButtonRef = new WeakReference<>(null); private static boolean fullscreenButtonVisibilityCallbacksExist() { return false; // Modified during patching if needed. @@ -20,8 +19,8 @@ public class PlayerControlsPatch { /** * Injection point. */ - public static void setFullscreenCloseButton(ImageView imageButton) { - fullscreenButtonRef = new WeakReference<>(imageButton); + public static void setFullscreenCloseButton(View button) { + fullscreenButtonRef = new WeakReference<>(button); Logger.printDebug(() -> "Fullscreen button set"); if (!fullscreenButtonVisibilityCallbacksExist()) { @@ -30,13 +29,13 @@ public class PlayerControlsPatch { // Add a global listener, since the protected method // View#onVisibilityChanged() does not have any call backs. - imageButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + button.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { int lastVisibility = View.VISIBLE; @Override public void onGlobalLayout() { try { - final int visibility = imageButton.getVisibility(); + final int visibility = button.getVisibility(); if (lastVisibility != visibility) { lastVisibility = visibility; diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index ba7faa001b..7662718fc8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -216,10 +216,10 @@ internal fun spoofVideoStreamsPatch( // A proper fix may include modifying the request body to match the platforms expected body. buildMediaDataSourceMethod.apply { - val targetIndex = instructions.count() - 1 + // Find return-void, not the last instruction, which may be a throw in an error branch + // where p0 is overwritten by new-instance IllegalArgumentException. + val targetIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID) - // Instructions are added just before the method returns, - // so there's no concern of clobbering in-use registers. addInstructions( targetIndex, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index a350d883a9..1016fd667a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -38,7 +38,8 @@ internal val BytecodePatchContext.fullscreenButtonMethodMatch by composingFirstM returnType("V") instructions( ResourceType.ID("fullscreen_button"), - Opcode.CHECK_CAST() + Opcode.INVOKE_VIRTUAL(), // findViewById call. + Opcode.MOVE_RESULT_OBJECT() // The actual view, not a check-cast in 21.x. ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index f09b64213f..2af8a1177a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -169,14 +169,16 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( fullscreenButtonMethodMatch.let { it.method.apply { - val castIndex = it[1] - val insertIndex = castIndex + 1 - val insertRegister = getInstruction(castIndex).registerA + // Youtube 21.x doesn't cast the fullscreen button to ImageView anymore, + // so match on move-result-object after findViewById instead of check-cast. + val moveResultIndex = it[2] + val insertIndex = moveResultIndex + 1 + val insertRegister = getInstruction(moveResultIndex).registerA addInstructionsWithLabels( insertIndex, """ - invoke-static { v$insertRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->hideFullscreenButton(Landroid/widget/ImageView;)Landroid/widget/ImageView; + invoke-static { v$insertRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->hideFullscreenButton(Landroid/view/View;)Landroid/view/View; move-result-object v$insertRegister if-nez v$insertRegister, :show return-void diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index 41889cb905..f289bc9035 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -78,7 +78,7 @@ internal val BytecodePatchContext.overlayViewInflateMethodMatch by composingFirs instructions( ResourceType.ID("heatseeker_viewstub"), ResourceType.ID("fullscreen_button"), - allOf(Opcode.CHECK_CAST(), type("Landroid/widget/ImageView;")), + Opcode.CHECK_CAST(), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index aeec4f5b01..3dde033313 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -261,7 +261,7 @@ val playerControlsPatch = bytecodePatch( addInstruction( index + 1, "invoke-static { v$register }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", + "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/view/View;)V", ) } From a031891566f7ab9cace0c32d2c73a8fffc50356b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Mar 2026 11:31:07 +0000 Subject: [PATCH 139/161] chore: Release v6.0.0-dev.17 [skip ci] # [6.0.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.16...v6.0.0-dev.17) (2026-03-06) ### Bug Fixes * **YouTube - Spoof video streams:** Make it work on 21.x ([#6705](https://github.com/ReVanced/revanced-patches/issues/6705)) ([fdfed3c](https://github.com/ReVanced/revanced-patches/commit/fdfed3c9dd46f477c1cc1b9db0f08054ffa32293)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78cffe5d16..d916711db8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.16...v6.0.0-dev.17) (2026-03-06) + + +### Bug Fixes + +* **YouTube - Spoof video streams:** Make it work on 21.x ([#6705](https://github.com/ReVanced/revanced-patches/issues/6705)) ([fdfed3c](https://github.com/ReVanced/revanced-patches/commit/fdfed3c9dd46f477c1cc1b9db0f08054ffa32293)) + # [6.0.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.15...v6.0.0-dev.16) (2026-03-05) diff --git a/gradle.properties b/gradle.properties index cf402f817a..a8742c2c65 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.16 +version = 6.0.0-dev.17 From 63161e9fb357387685294e4a80de94cb351c6713 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 6 Mar 2026 15:31:41 +0100 Subject: [PATCH 140/161] fix(YouTube - Hide Shorts components): Find resource id only for 21.05+ --- .../youtube/layout/hide/shorts/HideShortsComponentsPatch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 08ae72ea1b..be6e539361 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -178,9 +178,9 @@ val hideShortsComponentsPatch = bytecodePatch( // region Hide sound button. - val id = ResourceType.DIMEN["reel_player_right_pivot_v2_size"] - if (!is_21_05_or_greater) { + val id = ResourceType.DIMEN["reel_player_right_pivot_v2_size"] + forEachInstructionAsSequence({ _, method, instruction, index -> if (instruction.wideLiteral != id) return@forEachInstructionAsSequence null From f7298ffd52c1e78edc624cbe1cc4d4eb3886cd3e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Mar 2026 14:36:34 +0000 Subject: [PATCH 141/161] chore: Release v6.0.0-dev.18 [skip ci] # [6.0.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.17...v6.0.0-dev.18) (2026-03-06) ### Bug Fixes * **YouTube - Hide Shorts components:** Find resource id only for 21.05+ ([63161e9](https://github.com/ReVanced/revanced-patches/commit/63161e9fb357387685294e4a80de94cb351c6713)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d916711db8..2d4b7d8103 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.17...v6.0.0-dev.18) (2026-03-06) + + +### Bug Fixes + +* **YouTube - Hide Shorts components:** Find resource id only for 21.05+ ([63161e9](https://github.com/ReVanced/revanced-patches/commit/63161e9fb357387685294e4a80de94cb351c6713)) + # [6.0.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.16...v6.0.0-dev.17) (2026-03-06) diff --git a/gradle.properties b/gradle.properties index a8742c2c65..76e3815dfe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.17 +version = 6.0.0-dev.18 From 6a547a97e52b7914bb6602f3ecc2c6cecd50e946 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 6 Mar 2026 18:56:21 +0100 Subject: [PATCH 142/161] fix(Hex): Add back name, which was accidentally removed from the patch --- .../main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt index 74b21e50a2..dec4f3f438 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/hex/HexPatch.kt @@ -8,6 +8,7 @@ import app.revanced.util.Utils.trimIndentMultiline @Suppress("unused") val Hex = rawResourcePatch( + name = "Hex", description = "Replaces a hexadecimal patterns of bytes of files in an APK.", use = false, ) { From 11bd06d374c8989db76ca13235c03b8819d96ae6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Mar 2026 18:01:51 +0000 Subject: [PATCH 143/161] chore: Release v6.0.0-dev.19 [skip ci] # [6.0.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.18...v6.0.0-dev.19) (2026-03-06) ### Bug Fixes * **Hex:** Add back name, which was accidentally removed from the patch ([6a547a9](https://github.com/ReVanced/revanced-patches/commit/6a547a97e52b7914bb6602f3ecc2c6cecd50e946)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d4b7d8103..78c1aed0e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.18...v6.0.0-dev.19) (2026-03-06) + + +### Bug Fixes + +* **Hex:** Add back name, which was accidentally removed from the patch ([6a547a9](https://github.com/ReVanced/revanced-patches/commit/6a547a97e52b7914bb6602f3ecc2c6cecd50e946)) + # [6.0.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.17...v6.0.0-dev.18) (2026-03-06) diff --git a/gradle.properties b/gradle.properties index 76e3815dfe..3d892361a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.18 +version = 6.0.0-dev.19 From f934022f37ba178ac23abfa9bcd59a0c12abe43f Mon Sep 17 00:00:00 2001 From: rospino74 <34315725+rospino74@users.noreply.github.com> Date: Sun, 8 Mar 2026 17:09:24 +0100 Subject: [PATCH 144/161] fix(YouTube - Enable Debugging Patch): Use correct Protocolbuffer setting name (#6711) --- .../extension/shared/patches/litho/LithoFilterPatch.java | 2 +- .../extension/shared/settings/YouTubeAndMusicSettings.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java index dc60f5d7da..e1b329ee54 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/litho/LithoFilterPatch.java @@ -49,7 +49,7 @@ public final class LithoFilterPatch { } builder.append(" Path: "); builder.append(path); - if (YouTubeAndMusicSettings.DEBUG_PROTOBUFFER.get()) { + if (YouTubeAndMusicSettings.DEBUG_PROTOCOLBUFFER.get()) { builder.append(" BufferStrings: "); findAsciiStrings(builder, buffer); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/YouTubeAndMusicSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/YouTubeAndMusicSettings.java index 67adab4efa..221ce00456 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/YouTubeAndMusicSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/YouTubeAndMusicSettings.java @@ -9,6 +9,6 @@ public class YouTubeAndMusicSettings extends BaseSettings { public static final StringSetting CUSTOM_FILTER_STRINGS = new StringSetting("revanced_custom_filter_strings", "", true, parent(CUSTOM_FILTER)); // Miscellaneous - public static final BooleanSetting DEBUG_PROTOBUFFER = new BooleanSetting("revanced_debug_protobuffer", FALSE, false, - "revanced_debug_protobuffer_user_dialog_message", parent(BaseSettings.DEBUG)); + public static final BooleanSetting DEBUG_PROTOCOLBUFFER = new BooleanSetting("revanced_debug_protocolbuffer", FALSE, false, + "revanced_debug_protocolbuffer_user_dialog_message", parent(BaseSettings.DEBUG)); } From ed9f191a2e85a4763437240a1f650bfbc5932d38 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 8 Mar 2026 16:12:49 +0000 Subject: [PATCH 145/161] chore: Release v6.0.0-dev.20 [skip ci] # [6.0.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.19...v6.0.0-dev.20) (2026-03-08) ### Bug Fixes * **YouTube - Enable Debugging Patch:** Use correct Protocolbuffer setting name ([#6711](https://github.com/ReVanced/revanced-patches/issues/6711)) ([f934022](https://github.com/ReVanced/revanced-patches/commit/f934022f37ba178ac23abfa9bcd59a0c12abe43f)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78c1aed0e1..4e42fd1a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.19...v6.0.0-dev.20) (2026-03-08) + + +### Bug Fixes + +* **YouTube - Enable Debugging Patch:** Use correct Protocolbuffer setting name ([#6711](https://github.com/ReVanced/revanced-patches/issues/6711)) ([f934022](https://github.com/ReVanced/revanced-patches/commit/f934022f37ba178ac23abfa9bcd59a0c12abe43f)) + # [6.0.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.18...v6.0.0-dev.19) (2026-03-06) diff --git a/gradle.properties b/gradle.properties index 3d892361a8..bd0d600b59 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.19 +version = 6.0.0-dev.20 From bb7448bc9d789843371d16bfccc9815662913333 Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:33:36 +0100 Subject: [PATCH 146/161] fix(Spotify - Sanitize sharing links): Update patch to latest app versions (#6685) --- .../app/revanced/patches/spotify/misc/privacy/Fingerprints.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt index 6e4dbd7a13..bebaa869ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt @@ -2,7 +2,6 @@ package app.revanced.patches.spotify.misc.privacy import app.revanced.patcher.* import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -28,13 +27,12 @@ internal val BytecodePatchContext.formatAndroidShareSheetUrlMethod by gettingFir returnType("Ljava/lang/String;") parameterTypes("L", "Ljava/lang/String;") opcodes( - Opcode.GOTO, Opcode.IF_EQZ, Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, ) - literal { '\n'.code.toLong() } + instructions('\n'.code.toLong()()) } internal val BytecodePatchContext.oldFormatAndroidShareSheetUrlMethod by gettingFirstMethodDeclaratively { From 55f510dbedd28678411b4f11d9bbdd303fa68a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aaron=20Mompi=C3=A9?= Date: Sun, 8 Mar 2026 20:34:52 +0100 Subject: [PATCH 147/161] fix(Instagram): Update fingerprints for version `417.0.0.54.77` (#6734) --- .../patches/instagram/hide/explore/Fingerprints.kt | 4 ++-- .../patches/instagram/hide/navigation/Fingerprints.kt | 4 ++-- .../patches/instagram/hide/suggestions/Fingerprints.kt | 2 +- .../revanced/patches/instagram/misc/share/Fingerprints.kt | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt index a9b705dd4e..1aeb57bdd4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.invoke import app.revanced.patcher.name import app.revanced.patcher.patch.BytecodePatchContext -internal val BytecodePatchContext.exploreResponseJsonParserMethodMatch by composingFirstMethod("ExploreTopicalFeedResponse") { - name("parseFromJson") +internal val BytecodePatchContext.exploreResponseJsonParserMethodMatch by composingFirstMethod("clusters") { + name("unsafeParseFromJson") instructions("sectional_items"()) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index 0a07351aa9..40ab13f63f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -11,8 +11,8 @@ internal val BytecodePatchContext.initializeNavigationButtonsListMethod by getti } internal val BytecodePatchContext.navigationButtonsEnumMethod by gettingFirstImmutableMethodDeclaratively( - "FEED", + "fragment_clips", "fragment_feed", - "SEARCH", + "fragment_news", "fragment_search", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt index 9d486f5520..a1f4f1fab0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt @@ -16,6 +16,6 @@ internal val FEED_ITEM_KEYS_TO_BE_HIDDEN = arrayOf( "suggested_users", ) -internal val BytecodePatchContext.feedItemParseFromJsonMethodMatch by composingFirstMethod("FeedItem") { +internal val BytecodePatchContext.feedItemParseFromJsonMethodMatch by composingFirstMethod("feed_item_type") { instructions(predicates = unorderedAllOf(predicates = FEED_ITEM_KEYS_TO_BE_HIDDEN.map { it() }.toTypedArray())) } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt index b7703b3147..4f3d159001 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/Fingerprints.kt @@ -9,7 +9,7 @@ import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.Opcode internal val BytecodePatchContext.permalinkResponseJsonParserMethodMatch by composingFirstMethod { - name("parseFromJson") + name("unsafeParseFromJson") instructions("permalink"()) opcodes( Opcode.NEW_INSTANCE, @@ -19,16 +19,16 @@ internal val BytecodePatchContext.permalinkResponseJsonParserMethodMatch by comp } internal val BytecodePatchContext.storyUrlResponseJsonParserMethodMatch by composingFirstMethod { - name("parseFromJson") + name("unsafeParseFromJson") instructions("story_item_to_share_url"()) } internal val BytecodePatchContext.profileUrlResponseJsonParserMethodMatch by composingFirstMethod { - name("parseFromJson") + name("unsafeParseFromJson") instructions("profile_to_share_url"()) } internal val BytecodePatchContext.liveUrlResponseJsonParserMethodMatch by composingFirstMethod { - name("parseFromJson") + name("unsafeParseFromJson") instructions("live_to_share_url"()) } From 0637d4596a22faddcf973857c38385c7bf7ac534 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 9 Mar 2026 02:36:06 +0700 Subject: [PATCH 148/161] ci: Use new attestation action (#6744) --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 28f152e2c9..765099b0b5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,7 @@ jobs: packages: write id-token: write attestations: write + artifact-metadata: write runs-on: ubuntu-latest steps: - name: Checkout @@ -61,7 +62,7 @@ jobs: - name: Attest if: steps.release.outputs.new_release_published == 'true' - uses: actions/attest-build-provenance@v3 + uses: actions/attest@v4 with: subject-name: 'ReVanced Patches ${{ steps.release.outputs.new_release_git_tag }}' subject-path: patches/build/libs/patches-*.rvp From 49dffe37c505267f1f122d56c1b12a70a4a274e5 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 8 Mar 2026 19:39:41 +0000 Subject: [PATCH 149/161] chore: Release v6.0.0-dev.21 [skip ci] # [6.0.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.20...v6.0.0-dev.21) (2026-03-08) ### Bug Fixes * **Instagram:** Update fingerprints for version `417.0.0.54.77` ([#6734](https://github.com/ReVanced/revanced-patches/issues/6734)) ([55f510d](https://github.com/ReVanced/revanced-patches/commit/55f510dbedd28678411b4f11d9bbdd303fa68a0d)) * **Spotify - Sanitize sharing links:** Update patch to latest app versions ([#6685](https://github.com/ReVanced/revanced-patches/issues/6685)) ([bb7448b](https://github.com/ReVanced/revanced-patches/commit/bb7448bc9d789843371d16bfccc9815662913333)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e42fd1a12..a43a1de002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [6.0.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.20...v6.0.0-dev.21) (2026-03-08) + + +### Bug Fixes + +* **Instagram:** Update fingerprints for version `417.0.0.54.77` ([#6734](https://github.com/ReVanced/revanced-patches/issues/6734)) ([55f510d](https://github.com/ReVanced/revanced-patches/commit/55f510dbedd28678411b4f11d9bbdd303fa68a0d)) +* **Spotify - Sanitize sharing links:** Update patch to latest app versions ([#6685](https://github.com/ReVanced/revanced-patches/issues/6685)) ([bb7448b](https://github.com/ReVanced/revanced-patches/commit/bb7448bc9d789843371d16bfccc9815662913333)) + # [6.0.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.19...v6.0.0-dev.20) (2026-03-08) diff --git a/gradle.properties b/gradle.properties index bd0d600b59..7271e86370 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.20 +version = 6.0.0-dev.21 From ddb6396b3f3f7a2c29b9fa171e189f9931ba0e02 Mon Sep 17 00:00:00 2001 From: Dawid Krajcarz <80264606+drobotk@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:52:16 +0100 Subject: [PATCH 150/161] fix(YouTube - Settings): Icon not drawn correctly on some systems (#6683) --- .../ReVancedSettingsIconDynamicDrawable.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java index 0b74f45e85..637266c667 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java @@ -1,7 +1,9 @@ package app.revanced.extension.youtube.patches.theme; +import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -10,7 +12,6 @@ import androidx.annotation.Nullable; import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; -import app.revanced.extension.shared.settings.BaseSettings; /** * Dynamic drawable that is either the regular or bolded ReVanced preference icon. @@ -82,4 +83,19 @@ public class ReVancedSettingsIconDynamicDrawable extends Drawable { super.onBoundsChange(bounds); icon.setBounds(bounds); } + + @Override + public void setTint(int tintColor) { + icon.setTint(tintColor); + } + + @Override + public void setTintList(@Nullable ColorStateList tint) { + icon.setTintList(tint); + } + + @Override + public void setTintMode(@Nullable PorterDuff.Mode tintMode) { + icon.setTintMode(tintMode); + } } \ No newline at end of file From d2659637ace6eed7859741e652dc660216e967e3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 8 Mar 2026 19:55:59 +0000 Subject: [PATCH 151/161] chore: Release v6.0.0-dev.22 [skip ci] # [6.0.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.21...v6.0.0-dev.22) (2026-03-08) ### Bug Fixes * **YouTube - Settings:** Icon not drawn correctly on some systems ([#6683](https://github.com/ReVanced/revanced-patches/issues/6683)) ([ddb6396](https://github.com/ReVanced/revanced-patches/commit/ddb6396b3f3f7a2c29b9fa171e189f9931ba0e02)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a43a1de002..b9a8eea0d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.21...v6.0.0-dev.22) (2026-03-08) + + +### Bug Fixes + +* **YouTube - Settings:** Icon not drawn correctly on some systems ([#6683](https://github.com/ReVanced/revanced-patches/issues/6683)) ([ddb6396](https://github.com/ReVanced/revanced-patches/commit/ddb6396b3f3f7a2c29b9fa171e189f9931ba0e02)) + # [6.0.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.20...v6.0.0-dev.21) (2026-03-08) diff --git a/gradle.properties b/gradle.properties index 7271e86370..9aae0bed79 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.21 +version = 6.0.0-dev.22 From e0dc009780afea9c2f393c4f348cda5ca9c3cbbf Mon Sep 17 00:00:00 2001 From: Sayanth <13906889+SayanthD@users.noreply.github.com> Date: Mon, 9 Mar 2026 23:40:05 +0530 Subject: [PATCH 152/161] fix(ProtonVPN - Remove delay): Make it work on latest version by patching the correct class (#6757) --- .../app/revanced/patches/protonvpn/delay/Fingerprints.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt index 0791f3a88f..e30f845182 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonvpn/delay/Fingerprints.kt @@ -1,13 +1,16 @@ package app.revanced.patches.protonvpn.delay +import app.revanced.patcher.definingClass import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.name import app.revanced.patcher.patch.BytecodePatchContext internal val BytecodePatchContext.longDelayMethod by gettingFirstMethodDeclaratively { + definingClass("AppConfigResponse;") name("getChangeServerLongDelayInSeconds") } internal val BytecodePatchContext.shortDelayMethod by gettingFirstMethodDeclaratively { + definingClass("AppConfigResponse;") name("getChangeServerShortDelayInSeconds") } From a02350bbc84981ec28371f3f7affe9cd56ed5836 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 9 Mar 2026 18:13:38 +0000 Subject: [PATCH 153/161] chore: Release v6.0.0-dev.23 [skip ci] # [6.0.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.22...v6.0.0-dev.23) (2026-03-09) ### Bug Fixes * **ProtonVPN - Remove delay:** Make it work on latest version by patching the correct class ([#6757](https://github.com/ReVanced/revanced-patches/issues/6757)) ([e0dc009](https://github.com/ReVanced/revanced-patches/commit/e0dc009780afea9c2f393c4f348cda5ca9c3cbbf)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9a8eea0d8..8450d1a6b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.22...v6.0.0-dev.23) (2026-03-09) + + +### Bug Fixes + +* **ProtonVPN - Remove delay:** Make it work on latest version by patching the correct class ([#6757](https://github.com/ReVanced/revanced-patches/issues/6757)) ([e0dc009](https://github.com/ReVanced/revanced-patches/commit/e0dc009780afea9c2f393c4f348cda5ca9c3cbbf)) + # [6.0.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.21...v6.0.0-dev.22) (2026-03-08) diff --git a/gradle.properties b/gradle.properties index 9aae0bed79..7e5154179e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.22 +version = 6.0.0-dev.23 From 24caae98b7b4d61b388f644cc1512438e408e6b1 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 9 Mar 2026 19:03:25 +0000 Subject: [PATCH 154/161] feat(Photoshop Mix): Add `Bypass login` patch (#6745) Co-authored-by: oSumAtrIX --- patches/api/patches.api | 4 +++ .../patches/photoshopmix/BypassLoginPatch.kt | 21 ++++++++++++++ .../patches/photoshopmix/Fingerprints.kt | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/photoshopmix/BypassLoginPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/photoshopmix/Fingerprints.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 57f2abaa19..bf62f55d8c 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -627,6 +627,10 @@ public final class app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPat public static final fun getUnlockPlusPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/photoshopmix/BypassLoginPatchKt { + public static final fun getBypassLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/piccomafr/misc/SpoofAndroidDeviceIdPatchKt { public static final fun getSpoofAndroidDeviceIDPatch ()Lapp/revanced/patcher/patch/Patch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/photoshopmix/BypassLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photoshopmix/BypassLoginPatch.kt new file mode 100644 index 0000000000..104db4a726 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/photoshopmix/BypassLoginPatch.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.photoshopmix + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +@Suppress("unused") +val bypassLoginPatch = bytecodePatch( + name = "Bypass login", + description = "Allows the use of the app after its discontinuation.", +) { + compatibleWith("com.adobe.photoshopmix") + + apply { + isLoggedInMethod.returnEarly(true) + + // Disables these buttons that cause the app to crash while not logged in. + ccLibButtonClickHandlerMethod.returnEarly() + lightroomButtonClickHandlerMethod.returnEarly() + ccButtonClickHandlerMethod.returnEarly() + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/photoshopmix/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photoshopmix/Fingerprints.kt new file mode 100644 index 0000000000..4fca34a3fd --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/photoshopmix/Fingerprints.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.photoshopmix + +import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.name +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType + +internal val BytecodePatchContext.isLoggedInMethod by gettingFirstMethodDeclaratively { + name("isLoggedIn") + definingClass("CreativeCloudSource;") + returnType("Z") +} + +internal val BytecodePatchContext.ccLibButtonClickHandlerMethod by gettingFirstMethodDeclaratively { + name("ccLibButtonClickHandler") + definingClass("PSMixFragment;") +} + +internal val BytecodePatchContext.lightroomButtonClickHandlerMethod by gettingFirstMethodDeclaratively { + name("lightroomButtonClickHandler") + definingClass("PSMixFragment;") +} + +internal val BytecodePatchContext.ccButtonClickHandlerMethod by gettingFirstMethodDeclaratively { + name("ccButtonClickHandler") + definingClass("PSMixFragment;") +} From 882cb4a0d4f8402dd2d8e36e4f0cc8e8d73eabd5 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 9 Mar 2026 19:07:17 +0000 Subject: [PATCH 155/161] chore: Release v6.0.0-dev.24 [skip ci] # [6.0.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.23...v6.0.0-dev.24) (2026-03-09) ### Features * **Photoshop Mix:** Add `Bypass login` patch ([#6745](https://github.com/ReVanced/revanced-patches/issues/6745)) ([24caae9](https://github.com/ReVanced/revanced-patches/commit/24caae98b7b4d61b388f644cc1512438e408e6b1)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8450d1a6b6..11b101ba19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.23...v6.0.0-dev.24) (2026-03-09) + + +### Features + +* **Photoshop Mix:** Add `Bypass login` patch ([#6745](https://github.com/ReVanced/revanced-patches/issues/6745)) ([24caae9](https://github.com/ReVanced/revanced-patches/commit/24caae98b7b4d61b388f644cc1512438e408e6b1)) + # [6.0.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.22...v6.0.0-dev.23) (2026-03-09) diff --git a/gradle.properties b/gradle.properties index 7e5154179e..d76b3eae9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.23 +version = 6.0.0-dev.24 From b2b1e4f993730373f3d23b0bb1429c28c2c40758 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Fri, 13 Mar 2026 20:41:35 +0700 Subject: [PATCH 156/161] ci: Bump actions to avoid Node 20 deprecation (#6772) --- .github/workflows/build_pull_request.yml | 4 ++-- .github/workflows/open_pull_request.yml | 2 +- .github/workflows/pull_strings.yml | 2 +- .github/workflows/push_strings.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index adf6c2fa6f..32c03cbe64 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ inputs.pr && format('refs/pull/{0}/merge', inputs.pr) || github.ref }} @@ -39,7 +39,7 @@ jobs: run: ./gradlew :patches:buildAndroid --no-daemon - name: Upload artifacts - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: revanced-patches path: patches/build/libs diff --git a/.github/workflows/open_pull_request.yml b/.github/workflows/open_pull_request.yml index 6e3eddd18b..c1402f5490 100644 --- a/.github/workflows/open_pull_request.yml +++ b/.github/workflows/open_pull_request.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Open pull request uses: repo-sync/pull-request@v2 diff --git a/.github/workflows/pull_strings.yml b/.github/workflows/pull_strings.yml index 7e6b74d57c..8fef9fe309 100644 --- a/.github/workflows/pull_strings.yml +++ b/.github/workflows/pull_strings.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: dev persist-credentials: true diff --git a/.github/workflows/push_strings.yml b/.github/workflows/push_strings.yml index 61e79b4cde..d13f88573d 100644 --- a/.github/workflows/push_strings.yml +++ b/.github/workflows/push_strings.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Process strings env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 765099b0b5..27a19a17c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Java uses: actions/setup-java@v5 diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 765927aaff..f02668b990 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -10,9 +10,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@v1 + uses: gradle-update/update-gradle-wrapper-action@v2 with: target-branch: dev From 806d6c799fb67c0fb630ae954ef615ff01597b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aaron=20Mompi=C3=A9?= Date: Sat, 14 Mar 2026 13:52:12 +0100 Subject: [PATCH 157/161] feat(Instagram): Add `Disable Reels auto-scroll` patch (#6736) Co-authored-by: oSumAtrIX --- patches/api/patches.api | 7 +++++- .../autoscroll/DisableReelsAutoScrollPatch.kt | 22 +++++++++++++++++ .../reels/autoscroll/Fingerprints.kt | 24 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/DisableReelsAutoScrollPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/Fingerprints.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index bf62f55d8c..be251e84a5 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -357,6 +357,10 @@ public final class app/revanced/patches/instagram/reels/DisableReelsScrollingPat public static final fun getDisableReelsScrollingPatch ()Lapp/revanced/patcher/patch/Patch; } +public final class app/revanced/patches/instagram/reels/autoscroll/DisableReelsAutoScrollPatchKt { + public static final fun getDisableReelsAutoScrollPatch ()Lapp/revanced/patcher/patch/Patch; +} + public final class app/revanced/patches/instagram/story/flipping/DisableStoryAutoFlippingPatchKt { public static final fun getDisableStoryAutoFlippingPatch ()Lapp/revanced/patcher/patch/Patch; } @@ -888,6 +892,7 @@ public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/util/Set;Lkotlin/Pair;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/Patch; public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/Patch; + public static final fun prefixOrReplace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -1867,7 +1872,7 @@ public final class app/revanced/patches/youtube/misc/settings/PreferenceScreen : public final fun getADS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getALTERNATIVE_THUMBNAILS ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getFEED ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; - public final fun getGENERAL_LAYOUT ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; + public final fun getGENERAL ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getMISC ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getPLAYER ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; public final fun getRETURN_YOUTUBE_DISLIKE ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen; diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/DisableReelsAutoScrollPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/DisableReelsAutoScrollPatch.kt new file mode 100644 index 0000000000..596556d234 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/DisableReelsAutoScrollPatch.kt @@ -0,0 +1,22 @@ +package app.revanced.patches.instagram.reels.autoscroll + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +@Suppress("unused") +val disableReelsAutoScrollPatch = bytecodePatch( + name = "Disable Reels auto-scroll", + description = "Removes the auto-scroll toggle and prevents Reels from scrolling automatically.", + use = false, +) { + compatibleWith("com.instagram.android") + + apply { + // Prevent the auto-scroll feature from being initialized. + // When this returns false, ClipsViewerFragment skips creating the auto-scroller. + clipsAutoScrollFeatureCheckMethod.returnEarly() + + // Make the toggle button handler a no-op so tapping it does nothing. + clipsAutoScrollToggleMethod.returnEarly() + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/Fingerprints.kt new file mode 100644 index 0000000000..a3c75efe92 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/reels/autoscroll/Fingerprints.kt @@ -0,0 +1,24 @@ +package app.revanced.patches.instagram.reels.autoscroll + +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType + +/** + * Matches the feature availability gate that determines + * whether auto-scroll should be available for Reels. + */ +internal val BytecodePatchContext.clipsAutoScrollFeatureCheckMethod by gettingFirstMethodDeclaratively("auto_scroll") { + returnType("Z") + parameterTypes("Lcom/instagram/common/session/UserSession;", "Z") +} + +/** + * Matches the toggle handler called when the user taps + * the auto-scroll button. Contains analytics logging strings. + */ +internal val BytecodePatchContext.clipsAutoScrollToggleMethod by gettingFirstMethodDeclaratively( + "auto_scroll", + "instagram_clips_viewer_autoplay_tap", +) From dc39dfdab4d2b8b418f8c0099fbbbf50f4b73bdd Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 14 Mar 2026 12:55:58 +0000 Subject: [PATCH 158/161] chore: Release v6.0.0-dev.25 [skip ci] # [6.0.0-dev.25](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.24...v6.0.0-dev.25) (2026-03-14) ### Features * **Instagram:** Add `Disable Reels auto-scroll` patch ([#6736](https://github.com/ReVanced/revanced-patches/issues/6736)) ([806d6c7](https://github.com/ReVanced/revanced-patches/commit/806d6c799fb67c0fb630ae954ef615ff01597b1f)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b101ba19..4ae7ccd627 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.25](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.24...v6.0.0-dev.25) (2026-03-14) + + +### Features + +* **Instagram:** Add `Disable Reels auto-scroll` patch ([#6736](https://github.com/ReVanced/revanced-patches/issues/6736)) ([806d6c7](https://github.com/ReVanced/revanced-patches/commit/806d6c799fb67c0fb630ae954ef615ff01597b1f)) + # [6.0.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.23...v6.0.0-dev.24) (2026-03-09) diff --git a/gradle.properties b/gradle.properties index d76b3eae9d..1673aa9f4f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.24 +version = 6.0.0-dev.25 From 7517f57ac7a54e1c914e8dd8cc3e1aa908e28e54 Mon Sep 17 00:00:00 2001 From: kitadai31 <90122968+kitadai31@users.noreply.github.com> Date: Sun, 15 Mar 2026 03:41:18 +0900 Subject: [PATCH 159/161] fix: Add minSdk to all extension projects (#6778) --- extensions/all/misc/adb/hide-adb/build.gradle.kts | 7 ------- .../connectivity/wifi/spoof/spoof-wifi/build.gradle.kts | 7 ++----- .../build.gradle.kts | 7 ------- .../all/misc/disable-play-integrity/build.gradle.kts | 7 ------- .../remove-screen-capture-restriction/build.gradle.kts | 7 ------- .../remove-screenshot-restriction/build.gradle.kts | 7 ------- extensions/baconreader/build.gradle.kts | 6 ++++++ extensions/boostforreddit/build.gradle.kts | 6 ++++++ extensions/cricbuzz/build.gradle.kts | 8 +++++++- extensions/instagram/build.gradle.kts | 6 ++++++ extensions/messenger/build.gradle.kts | 6 ++++++ extensions/nothingx/build.gradle.kts | 7 +------ extensions/nunl/build.gradle.kts | 6 ++++++ extensions/primevideo/build.gradle.kts | 6 ++++++ extensions/reddit/build.gradle.kts | 6 ++++++ extensions/samsung/radio/build.gradle.kts | 6 ++++++ extensions/shared/build.gradle.kts | 2 +- .../main/java/app/revanced/extension/shared/Utils.java | 1 - .../java/app/revanced/extension/shared/checks/Check.java | 5 +++-- .../extension/shared/checks/CheckEnvironmentPatch.java | 7 +++++-- .../extension/shared/settings/BaseActivityHook.java | 6 +++++- .../settings/preference/ToolbarPreferenceFragment.java | 5 +++-- extensions/spotify/build.gradle.kts | 7 +------ extensions/spotify/stub/build.gradle.kts | 6 +++--- extensions/strava/build.gradle.kts | 6 ++++++ .../revanced/extension/strava/AddMediaDownloadPatch.java | 7 ++----- .../revanced/extension/strava/HideDistractionsPatch.java | 3 --- extensions/strava/stub/build.gradle.kts | 2 +- extensions/syncforreddit/build.gradle.kts | 6 ++++++ extensions/tiktok/build.gradle.kts | 5 ----- .../extension/tiktok/settings/TikTokActivityHook.java | 2 +- extensions/tudortmund/build.gradle.kts | 6 ++++++ extensions/twitch/build.gradle.kts | 5 ----- .../extension/twitch/settings/TwitchActivityHook.java | 2 +- extensions/twitter/build.gradle.kts | 6 ++++++ .../youtube/sponsorblock/SegmentPlaybackController.java | 2 -- .../youtube/sponsorblock/SponsorBlockSettings.java | 1 - 37 files changed, 108 insertions(+), 89 deletions(-) diff --git a/extensions/all/misc/adb/hide-adb/build.gradle.kts b/extensions/all/misc/adb/hide-adb/build.gradle.kts index 18568df5c5..42eb9984c0 100644 --- a/extensions/all/misc/adb/hide-adb/build.gradle.kts +++ b/extensions/all/misc/adb/hide-adb/build.gradle.kts @@ -1,14 +1,7 @@ android { - namespace = "app.revanced.extension" - defaultConfig { minSdk = 21 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } dependencies { diff --git a/extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/build.gradle.kts b/extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/build.gradle.kts index 61ff628c75..c269c9862f 100644 --- a/extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/build.gradle.kts +++ b/extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/build.gradle.kts @@ -1,9 +1,6 @@ android { - namespace = "app.revanced.extension" - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + defaultConfig { + minSdk = 23 } } diff --git a/extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/build.gradle.kts b/extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/build.gradle.kts index 18568df5c5..42eb9984c0 100644 --- a/extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/build.gradle.kts +++ b/extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/build.gradle.kts @@ -1,14 +1,7 @@ android { - namespace = "app.revanced.extension" - defaultConfig { minSdk = 21 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } dependencies { diff --git a/extensions/all/misc/disable-play-integrity/build.gradle.kts b/extensions/all/misc/disable-play-integrity/build.gradle.kts index 5492972271..b3a57874e5 100644 --- a/extensions/all/misc/disable-play-integrity/build.gradle.kts +++ b/extensions/all/misc/disable-play-integrity/build.gradle.kts @@ -1,15 +1,8 @@ android { - namespace = "app.revanced.extension" - defaultConfig { minSdk = 21 } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - buildFeatures { aidl = true } diff --git a/extensions/all/misc/screencapture/remove-screen-capture-restriction/build.gradle.kts b/extensions/all/misc/screencapture/remove-screen-capture-restriction/build.gradle.kts index 18568df5c5..42eb9984c0 100644 --- a/extensions/all/misc/screencapture/remove-screen-capture-restriction/build.gradle.kts +++ b/extensions/all/misc/screencapture/remove-screen-capture-restriction/build.gradle.kts @@ -1,14 +1,7 @@ android { - namespace = "app.revanced.extension" - defaultConfig { minSdk = 21 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } dependencies { diff --git a/extensions/all/misc/screenshot/remove-screenshot-restriction/build.gradle.kts b/extensions/all/misc/screenshot/remove-screenshot-restriction/build.gradle.kts index 18568df5c5..42eb9984c0 100644 --- a/extensions/all/misc/screenshot/remove-screenshot-restriction/build.gradle.kts +++ b/extensions/all/misc/screenshot/remove-screenshot-restriction/build.gradle.kts @@ -1,14 +1,7 @@ android { - namespace = "app.revanced.extension" - defaultConfig { minSdk = 21 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } dependencies { diff --git a/extensions/baconreader/build.gradle.kts b/extensions/baconreader/build.gradle.kts index 804e90884c..843fd12cc9 100644 --- a/extensions/baconreader/build.gradle.kts +++ b/extensions/baconreader/build.gradle.kts @@ -3,3 +3,9 @@ dependencies { compileOnly(libs.annotation) compileOnly(libs.okhttp) } + +android { + defaultConfig { + minSdk = 22 + } +} diff --git a/extensions/boostforreddit/build.gradle.kts b/extensions/boostforreddit/build.gradle.kts index 4f79f5a794..d84b488441 100644 --- a/extensions/boostforreddit/build.gradle.kts +++ b/extensions/boostforreddit/build.gradle.kts @@ -4,3 +4,9 @@ dependencies { compileOnly(libs.annotation) compileOnly(libs.okhttp) } + +android { + defaultConfig { + minSdk = 21 + } +} diff --git a/extensions/cricbuzz/build.gradle.kts b/extensions/cricbuzz/build.gradle.kts index 7d4adde29b..b09ca9effe 100644 --- a/extensions/cricbuzz/build.gradle.kts +++ b/extensions/cricbuzz/build.gradle.kts @@ -1,4 +1,10 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:cricbuzz:stub")) -} \ No newline at end of file +} + +android { + defaultConfig { + minSdk = 21 + } +} diff --git a/extensions/instagram/build.gradle.kts b/extensions/instagram/build.gradle.kts index 8cf6305c11..9b476b1c81 100644 --- a/extensions/instagram/build.gradle.kts +++ b/extensions/instagram/build.gradle.kts @@ -1,3 +1,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/messenger/build.gradle.kts b/extensions/messenger/build.gradle.kts index 8cf6305c11..36b080b27b 100644 --- a/extensions/messenger/build.gradle.kts +++ b/extensions/messenger/build.gradle.kts @@ -1,3 +1,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) } + +android { + defaultConfig { + minSdk = 24 + } +} diff --git a/extensions/nothingx/build.gradle.kts b/extensions/nothingx/build.gradle.kts index bfbf5c8154..ed2b78c5f6 100644 --- a/extensions/nothingx/build.gradle.kts +++ b/extensions/nothingx/build.gradle.kts @@ -5,11 +5,6 @@ dependencies { android { defaultConfig { - minSdk = 26 - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + minSdk = 23 } } \ No newline at end of file diff --git a/extensions/nunl/build.gradle.kts b/extensions/nunl/build.gradle.kts index 6020de901a..ab48531bba 100644 --- a/extensions/nunl/build.gradle.kts +++ b/extensions/nunl/build.gradle.kts @@ -2,3 +2,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:nunl:stub")) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/primevideo/build.gradle.kts b/extensions/primevideo/build.gradle.kts index 9a81cc3e89..17a3c31a21 100644 --- a/extensions/primevideo/build.gradle.kts +++ b/extensions/primevideo/build.gradle.kts @@ -2,3 +2,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:primevideo:stub")) } + +android { + defaultConfig { + minSdk = 21 + } +} diff --git a/extensions/reddit/build.gradle.kts b/extensions/reddit/build.gradle.kts index 8693f97f53..75c8d7a179 100644 --- a/extensions/reddit/build.gradle.kts +++ b/extensions/reddit/build.gradle.kts @@ -1,3 +1,9 @@ dependencies { compileOnly(project(":extensions:reddit:stub")) } + +android { + defaultConfig { + minSdk = 28 + } +} diff --git a/extensions/samsung/radio/build.gradle.kts b/extensions/samsung/radio/build.gradle.kts index 0eadeef265..15d386efb3 100644 --- a/extensions/samsung/radio/build.gradle.kts +++ b/extensions/samsung/radio/build.gradle.kts @@ -2,3 +2,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:samsung:radio:stub")) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/shared/build.gradle.kts b/extensions/shared/build.gradle.kts index 13949a8dc6..3eb6ff48c7 100644 --- a/extensions/shared/build.gradle.kts +++ b/extensions/shared/build.gradle.kts @@ -5,6 +5,6 @@ dependencies { android { defaultConfig { - minSdk = 26 + minSdk = 23 } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index e978301a65..d18ea89f51 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -65,7 +65,6 @@ import app.revanced.extension.shared.settings.BooleanSetting; import app.revanced.extension.shared.settings.preference.ReVancedAboutPreference; import app.revanced.extension.shared.ui.Dim; -@SuppressWarnings("NewApi") public class Utils { @SuppressLint("StaticFieldLeak") diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index 53db12c4d7..bde66a043c 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -4,12 +4,12 @@ import static android.text.Html.FROM_HTML_MODE_COMPACT; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.Utils.DialogFragmentOnStartAction; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Intent; import android.graphics.PorterDuff; import android.net.Uri; +import android.os.Build; import android.text.Html; import android.util.Pair; import android.view.Gravity; @@ -19,6 +19,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import java.util.Collection; @@ -28,6 +29,7 @@ import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.ui.CustomDialog; +@RequiresApi(api = Build.VERSION_CODES.N) abstract class Check { private static final int NUMBER_OF_TIMES_TO_IGNORE_WARNING_BEFORE_DISABLING = 2; @@ -76,7 +78,6 @@ abstract class Check { BaseSettings.CHECK_ENVIRONMENT_WARNINGS_ISSUED.save(Integer.MAX_VALUE); } - @SuppressLint("NewApi") static void issueWarning(Activity activity, Collection failedChecks) { final var reasons = new StringBuilder(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java index b5fe752c25..e54ab27f74 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/CheckEnvironmentPatch.java @@ -10,6 +10,8 @@ import android.util.Base64; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; @@ -29,6 +31,7 @@ import static app.revanced.extension.shared.checks.PatchInfo.Build.*; *
* Various indicators help to detect if the app was patched by the user. */ +@RequiresApi(api = Build.VERSION_CODES.N) @SuppressWarnings("unused") public final class CheckEnvironmentPatch { private static final boolean DEBUG_ALWAYS_SHOW_CHECK_FAILED_DIALOG = debugAlwaysShowWarning(); @@ -121,7 +124,7 @@ public final class CheckEnvironmentPatch { * If the build properties are different, the app was likely downloaded pre-patched or patched on another device. */ private static class CheckWasPatchedOnSameDevice extends Check { - @SuppressLint({"NewApi", "HardwareIds"}) + @SuppressLint("HardwareIds") @Override protected Boolean check() { if (PATCH_BOARD.isEmpty()) { @@ -195,7 +198,7 @@ public final class CheckEnvironmentPatch { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); - // Duration since initial install or last update, which ever is sooner. + // Duration since initial install or last update, whichever is sooner. durationBetweenPatchingAndInstallation = packageInfo.lastUpdateTime - PatchInfo.PATCH_TIME; Logger.printInfo(() -> "App was installed/updated: " + (durationBetweenPatchingAndInstallation / (60 * 1000) + " minutes after patching")); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index 7a7b4d3337..1a2bfe9a2b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -6,12 +6,15 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; +import android.os.Build; import android.preference.PreferenceFragment; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toolbar; +import androidx.annotation.RequiresApi; + import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; @@ -22,7 +25,8 @@ import app.revanced.extension.shared.ui.Dim; * Base class for hooking activities to inject a custom PreferenceFragment with a toolbar. * Provides common logic for initializing the activity and setting up the toolbar. */ -@SuppressWarnings({"deprecation", "NewApi"}) +@SuppressWarnings("deprecation") +@RequiresApi(api = Build.VERSION_CODES.O) public abstract class BaseActivityHook extends Activity { private static final int ID_REVANCED_SETTINGS_FRAGMENTS = diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java index cc0a642745..8b1d8b882d 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java @@ -15,15 +15,16 @@ import android.widget.TextView; import android.widget.Toolbar; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; import app.revanced.extension.shared.ui.Dim; -import app.revanced.extension.shared.settings.BaseSettings; -@SuppressWarnings({"deprecation", "NewApi"}) +@SuppressWarnings("deprecation") +@RequiresApi(api = Build.VERSION_CODES.O) public class ToolbarPreferenceFragment extends AbstractPreferenceFragment { /** diff --git a/extensions/spotify/build.gradle.kts b/extensions/spotify/build.gradle.kts index 39d58a0227..69206d623a 100644 --- a/extensions/spotify/build.gradle.kts +++ b/extensions/spotify/build.gradle.kts @@ -6,11 +6,6 @@ dependencies { android { defaultConfig { - minSdk = 21 - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + minSdk = 24 } } diff --git a/extensions/spotify/stub/build.gradle.kts b/extensions/spotify/stub/build.gradle.kts index e31f1e3226..51eeab78a6 100644 --- a/extensions/spotify/stub/build.gradle.kts +++ b/extensions/spotify/stub/build.gradle.kts @@ -7,11 +7,11 @@ android { compileSdk = 34 defaultConfig { - minSdk = 21 + minSdk = 24 } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } } diff --git a/extensions/strava/build.gradle.kts b/extensions/strava/build.gradle.kts index f282f41ead..dce8dfacac 100644 --- a/extensions/strava/build.gradle.kts +++ b/extensions/strava/build.gradle.kts @@ -3,3 +3,9 @@ dependencies { compileOnly(project(":extensions:strava:stub")) compileOnly(libs.okhttp) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java b/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java index 1ddb99ffad..f1c84e3040 100644 --- a/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java +++ b/extensions/strava/src/main/java/app/revanced/extension/strava/AddMediaDownloadPatch.java @@ -1,9 +1,7 @@ package app.revanced.extension.strava; -import android.annotation.SuppressLint; import android.content.ContentResolver; import android.content.ContentValues; -import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environment; @@ -28,7 +26,6 @@ import java.util.stream.Stream; import app.revanced.extension.shared.Utils; -@SuppressLint("NewApi") public final class AddMediaDownloadPatch { public static final int ACTION_DOWNLOAD = -1; public static final int ACTION_OPEN_LINK = -2; @@ -85,7 +82,7 @@ public final class AddMediaDownloadPatch { } finally { values.clear(); values.put(MediaStore.Images.Media.IS_PENDING, 0); - resolver.update(row, values, null); + resolver.update(row, values, null, null); } showInfoToast("yis_2024_local_save_image_success", "✔️"); } catch (IOException e) { @@ -151,7 +148,7 @@ public final class AddMediaDownloadPatch { } finally { values.clear(); values.put(MediaStore.Video.Media.IS_PENDING, 0); - resolver.update(row, values, null); + resolver.update(row, values, null, null); } showInfoToast("yis_2024_local_save_video_success", "✔️"); } catch (IOException e) { diff --git a/extensions/strava/src/main/java/app/revanced/extension/strava/HideDistractionsPatch.java b/extensions/strava/src/main/java/app/revanced/extension/strava/HideDistractionsPatch.java index 7d04a2ac65..63deb93af4 100644 --- a/extensions/strava/src/main/java/app/revanced/extension/strava/HideDistractionsPatch.java +++ b/extensions/strava/src/main/java/app/revanced/extension/strava/HideDistractionsPatch.java @@ -1,7 +1,5 @@ package app.revanced.extension.strava; -import android.annotation.SuppressLint; - import com.strava.modularframework.data.Destination; import com.strava.modularframework.data.GenericLayoutModule; import com.strava.modularframework.data.GenericModuleField; @@ -21,7 +19,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@SuppressLint("NewApi") public class HideDistractionsPatch { public static boolean upselling; public static boolean promo; diff --git a/extensions/strava/stub/build.gradle.kts b/extensions/strava/stub/build.gradle.kts index ffdfac5a61..72184a0466 100644 --- a/extensions/strava/stub/build.gradle.kts +++ b/extensions/strava/stub/build.gradle.kts @@ -7,6 +7,6 @@ android { compileSdk = 34 defaultConfig { - minSdk = 21 + minSdk = 26 } } diff --git a/extensions/syncforreddit/build.gradle.kts b/extensions/syncforreddit/build.gradle.kts index ae95bb48f2..e2871f2390 100644 --- a/extensions/syncforreddit/build.gradle.kts +++ b/extensions/syncforreddit/build.gradle.kts @@ -4,3 +4,9 @@ dependencies { compileOnly(libs.annotation) compileOnly(libs.okhttp) } + +android { + defaultConfig { + minSdk = 23 + } +} diff --git a/extensions/tiktok/build.gradle.kts b/extensions/tiktok/build.gradle.kts index 13e98ec39e..fa21489446 100644 --- a/extensions/tiktok/build.gradle.kts +++ b/extensions/tiktok/build.gradle.kts @@ -8,9 +8,4 @@ android { defaultConfig { minSdk = 22 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } diff --git a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/TikTokActivityHook.java b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/TikTokActivityHook.java index b9d6bc8ecb..045afafe96 100644 --- a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/TikTokActivityHook.java +++ b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/TikTokActivityHook.java @@ -20,7 +20,7 @@ import java.lang.reflect.InvocationTargetException; /** * Hooks AdPersonalizationActivity to inject a custom {@link TikTokPreferenceFragment}. */ -@SuppressWarnings({"deprecation", "NewApi", "unused"}) +@SuppressWarnings({"deprecation", "unused"}) public class TikTokActivityHook { public static Object createSettingsEntry(String entryClazzName, String entryInfoClazzName) { try { diff --git a/extensions/tudortmund/build.gradle.kts b/extensions/tudortmund/build.gradle.kts index 1c9660b0ee..eb380fd6e5 100644 --- a/extensions/tudortmund/build.gradle.kts +++ b/extensions/tudortmund/build.gradle.kts @@ -1,3 +1,9 @@ dependencies { compileOnly(libs.appcompat) } + +android { + defaultConfig { + minSdk = 22 + } +} diff --git a/extensions/twitch/build.gradle.kts b/extensions/twitch/build.gradle.kts index 9051cb7d8a..34f2d8f113 100644 --- a/extensions/twitch/build.gradle.kts +++ b/extensions/twitch/build.gradle.kts @@ -11,9 +11,4 @@ android { defaultConfig { minSdk = 21 } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } } diff --git a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java index 8886ecbe4d..463a2e761d 100644 --- a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java +++ b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/TwitchActivityHook.java @@ -22,7 +22,7 @@ import tv.twitch.android.settings.SettingsActivity; /** * Hooks AppCompatActivity to inject a custom {@link TwitchPreferenceFragment}. */ -@SuppressWarnings({"deprecation", "NewApi", "unused"}) +@SuppressWarnings({"deprecation", "unused"}) public class TwitchActivityHook { private static final int REVANCED_SETTINGS_MENU_ITEM_ID = 0x7; private static final String EXTRA_REVANCED_SETTINGS = "app.revanced.twitch.settings"; diff --git a/extensions/twitter/build.gradle.kts b/extensions/twitter/build.gradle.kts index 8cf6305c11..9b476b1c81 100644 --- a/extensions/twitter/build.gradle.kts +++ b/extensions/twitter/build.gradle.kts @@ -1,3 +1,9 @@ dependencies { compileOnly(project(":extensions:shared:library")) } + +android { + defaultConfig { + minSdk = 26 + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java index a296f9e000..fc6e786407 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java @@ -3,7 +3,6 @@ package app.revanced.extension.youtube.sponsorblock; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY; -import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.graphics.Canvas; @@ -51,7 +50,6 @@ import kotlin.Unit; *

* Class is not thread safe. All methods must be called on the main thread unless otherwise specified. */ -@SuppressLint("NewApi") public class SegmentPlaybackController { /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java index a86a17cc8a..e3a4c31ad9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SponsorBlockSettings.java @@ -26,7 +26,6 @@ import app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour; import app.revanced.extension.youtube.sponsorblock.objects.SegmentCategory; import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup; -@SuppressWarnings("NewApi") public class SponsorBlockSettings { /** * Minimum length an SB user ID must be, as set by SB API. From a2a11d7362ca84410ca0ee84cd7174fe32a3969c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 14 Mar 2026 18:44:52 +0000 Subject: [PATCH 160/161] chore: Release v6.0.0-dev.26 [skip ci] # [6.0.0-dev.26](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.25...v6.0.0-dev.26) (2026-03-14) ### Bug Fixes * Add minSdk to all extension projects ([#6778](https://github.com/ReVanced/revanced-patches/issues/6778)) ([7517f57](https://github.com/ReVanced/revanced-patches/commit/7517f57ac7a54e1c914e8dd8cc3e1aa908e28e54)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ae7ccd627..3b4c2cc6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [6.0.0-dev.26](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.25...v6.0.0-dev.26) (2026-03-14) + + +### Bug Fixes + +* Add minSdk to all extension projects ([#6778](https://github.com/ReVanced/revanced-patches/issues/6778)) ([7517f57](https://github.com/ReVanced/revanced-patches/commit/7517f57ac7a54e1c914e8dd8cc3e1aa908e28e54)) + # [6.0.0-dev.25](https://github.com/ReVanced/revanced-patches/compare/v6.0.0-dev.24...v6.0.0-dev.25) (2026-03-14) diff --git a/gradle.properties b/gradle.properties index 1673aa9f4f..580cec1ce3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.parallel = true android.useAndroidX = true android.uniquePackageNames = false kotlin.code.style = official -version = 6.0.0-dev.25 +version = 6.0.0-dev.26 From ca903248a5073302aee797cf44bce8f930f9cd8d Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 14 Mar 2026 22:52:08 +0100 Subject: [PATCH 161/161] chore: Sync translations from Crowdin --- .../addresources/values-af-rZA/strings.xml | 290 +- .../addresources/values-am-rET/strings.xml | 290 +- .../addresources/values-ar-rSA/strings.xml | 309 +- .../addresources/values-as-rIN/strings.xml | 290 +- .../addresources/values-az-rAZ/strings.xml | 292 +- .../addresources/values-be-rBY/strings.xml | 347 +- .../addresources/values-bg-rBG/strings.xml | 333 +- .../addresources/values-bn-rBD/strings.xml | 307 +- .../addresources/values-bs-rBA/strings.xml | 290 +- .../addresources/values-ca-rES/strings.xml | 290 +- .../addresources/values-cs-rCZ/strings.xml | 308 +- .../addresources/values-da-rDK/strings.xml | 315 +- .../addresources/values-de-rDE/strings.xml | 330 +- .../addresources/values-el-rGR/strings.xml | 313 +- .../addresources/values-es-rES/strings.xml | 297 +- .../addresources/values-et-rEE/strings.xml | 338 +- .../addresources/values-eu-rES/strings.xml | 290 +- .../addresources/values-fa-rIR/strings.xml | 289 +- .../addresources/values-fi-rFI/strings.xml | 291 +- .../addresources/values-fil-rPH/strings.xml | 307 +- .../addresources/values-fr-rFR/strings.xml | 303 +- .../addresources/values-ga-rIE/strings.xml | 3533 ++++++++-------- .../addresources/values-gl-rES/strings.xml | 290 +- .../addresources/values-gu-rIN/strings.xml | 282 +- .../addresources/values-hi-rIN/strings.xml | 290 +- .../addresources/values-hr-rHR/strings.xml | 282 +- .../addresources/values-hu-rHU/strings.xml | 307 +- .../addresources/values-hy-rAM/strings.xml | 310 +- .../addresources/values-in-rID/strings.xml | 3533 ++++++++-------- .../addresources/values-is-rIS/strings.xml | 282 +- .../addresources/values-it-rIT/strings.xml | 289 +- .../addresources/values-iw-rIL/strings.xml | 304 +- .../addresources/values-ja-rJP/strings.xml | 3542 +++++++++-------- .../addresources/values-ka-rGE/strings.xml | 288 +- .../addresources/values-kk-rKZ/strings.xml | 290 +- .../addresources/values-km-rKH/strings.xml | 290 +- .../addresources/values-kn-rIN/strings.xml | 282 +- .../addresources/values-ko-rKR/strings.xml | 3533 ++++++++-------- .../addresources/values-ky-rKG/strings.xml | 290 +- .../addresources/values-lo-rLA/strings.xml | 282 +- .../addresources/values-lt-rLT/strings.xml | 311 +- .../addresources/values-lv-rLV/strings.xml | 312 +- .../addresources/values-mk-rMK/strings.xml | 290 +- .../addresources/values-ml-rIN/strings.xml | 290 +- .../addresources/values-mn-rMN/strings.xml | 282 +- .../addresources/values-mr-rIN/strings.xml | 290 +- .../addresources/values-ms-rMY/strings.xml | 290 +- .../addresources/values-my-rMM/strings.xml | 288 +- .../addresources/values-nb-rNO/strings.xml | 290 +- .../addresources/values-ne-rIN/strings.xml | 290 +- .../addresources/values-nl-rNL/strings.xml | 330 +- .../addresources/values-or-rIN/strings.xml | 290 +- .../addresources/values-pa-rIN/strings.xml | 290 +- .../addresources/values-pl-rPL/strings.xml | 3533 ++++++++-------- .../addresources/values-pt-rBR/strings.xml | 316 +- .../addresources/values-pt-rPT/strings.xml | 335 +- .../addresources/values-ro-rRO/strings.xml | 330 +- .../addresources/values-ru-rRU/strings.xml | 3539 ++++++++-------- .../addresources/values-si-rLK/strings.xml | 290 +- .../addresources/values-sk-rSK/strings.xml | 319 +- .../addresources/values-sl-rSI/strings.xml | 337 +- .../addresources/values-sq-rAL/strings.xml | 309 +- .../addresources/values-sr-rCS/strings.xml | 299 +- .../addresources/values-sr-rSP/strings.xml | 329 +- .../addresources/values-sv-rSE/strings.xml | 311 +- .../addresources/values-sw-rKE/strings.xml | 290 +- .../addresources/values-ta-rIN/strings.xml | 286 +- .../addresources/values-te-rIN/strings.xml | 288 +- .../addresources/values-th-rTH/strings.xml | 333 +- .../addresources/values-tr-rTR/strings.xml | 3533 ++++++++-------- .../addresources/values-uk-rUA/strings.xml | 340 +- .../addresources/values-ur-rIN/strings.xml | 290 +- .../addresources/values-uz-rUZ/strings.xml | 278 +- .../addresources/values-vi-rVN/strings.xml | 333 +- .../addresources/values-zh-rCN/strings.xml | 324 +- .../addresources/values-zh-rTW/strings.xml | 316 +- .../addresources/values-zu-rZA/strings.xml | 282 +- 77 files changed, 29297 insertions(+), 16604 deletions(-) diff --git a/patches/src/main/resources/addresources/values-af-rZA/strings.xml b/patches/src/main/resources/addresources/values-af-rZA/strings.xml index 3a40645452..2331d9ce46 100644 --- a/patches/src/main/resources/addresources/values-af-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-af-rZA/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Deaktiveer vetgedrukte ikone + Ikone is nie vetgedruk nie + Ikone is vetgedruk + GmsCore + Instellings verwant aan GmsCore + Kyk vir GmsCore-opdaterings + Gaan vir opdaterings is geaktiveer + Kontrole vir opdaterings is gedeaktiveer + Maak GmsCore-instellings oop + Instellings van GmsCore + MicroG GmsCore is nie geïnstalleer nie. Installeer dit. + Aksie benodig + Kon nie vir MicroG GmsCore-opdaterings kontroleer nie + \'n Nuwe weergawe (%1$s) van MicroG GmsCore is beskikbaar. Tans gebruik u weergawe %2$s. + "MicroG GmsCore het nie toestemming om op die agtergrond te loop nie. + +Vind die \"Moenie my app doodmaak nie\"-gids vir jou foon, en pas die instruksies op jou MicroG-installasie toe. + +Dit is nodig vir die toepassing om te werk." + Maak webwerf oop + Kanselleer + "MicroG GmsCore battery-optimalisasies moet gedeaktiveer word om probleme te voorkom. + +Deaktivering van battery-optimalisasies vir MicroG sal nie batteryverbruik negatief beïnvloed nie. + +Tik op die 'Gaan voort'-knoppie en laat optimalisasieveranderings toe." + Gaan voort - + + Herbegin die toepassing om hierdie funksie te gebruik + Teken protokolbuffer + Ontfoutlogboeke sluit protobuffer in + Ontfoutlogboeke sluit nie protobuffer in nie + "Aktivering van hierdie instelling sal addisionele uitlegdata aanteken, insluitend teks op die skerm vir sommige UI-komponente. + +Dit kan help om komponente te identifiseer wanneer persoonlike filters geskep word. + +Die aktivering hiervan sal egter ook sekere gebruikersdata, soos jou IP-adres, aanteken." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Versteek skepperwinkelrak + Skepperwinkelrak onder videospeler is versteek + Skepperwinkelrak onder videospeler word gewys + Versteek kommentaarafdeling onder video\'s in Tuisstroom + Kommentaarafdeling onder video\'s in Tuisstroom is versteek + Kommentaarafdeling onder video\'s in Tuisstroom word gewys + + Versteek \'Nuutste video\'s\'-knoppie + Nuutste video\'s-knoppie is versteek + Nuutste video\'s-knoppie word gewys + + Versteek websoekresultate + Websoekresultate is versteek + Websoekresultate word gewys + Versteek \'Jy mag dalk van hou\'-afdeling + \'Jy mag dalk van hou\'-afdeling is versteek + \'Jy mag dalk van hou\'-afdeling word gewys + This button usually appears in the video player for certain videos. --> + + Versteek \'Regstreekse klets herhaling\'-knoppie + Regstreekse klets herhaling-knoppie in speleroorleg is versteek + Regstreekse klets herhaling-knoppie in speleroorleg word gewys + Versteek videotitel + Videotitel in speleroorleg is versteek + Videotitel in speleroorleg word gewys + Versteek \'Kursusvordering\' + Kursusvordering-afdeling is versteek + Kursusvordering-afdeling word gewys + Versteek Verken + Verken hierdie kursus- en Verken die poduitsending-afdelings is versteek + Verken hierdie kursus- en Verken die poduitsending-afdelings word gewys + Versteek \'Verken hierdie kursus\' + Verken hierdie kursus-afdeling is versteek + Verken hierdie kursus-afdeling word gewys + Versteek \'Verken die poduitsending\' + Verken die poduitsending-afdeling is versteek + Verken die poduitsending-afdeling word gewys + Versteek \'Uitgestalde plekke\' + Uitgestalde plekke-afdeling is versteek + Uitgestalde plekke-afdeling word gewys + Aktiveer strooiontvou-kieslysfilter + Strooiontvou-kieslysfilter is geaktiveer + Strooiontvou-kieslysfilter is gedeaktiveer + Strooiontvou-kieslysfilter + Voer die ontvou-kieslysname in om te filtreer, een per reël + Versteek Speletjies + Speletjies-afdeling is versteek + Speletjies-afdeling word gewys + Versteek Musiek + Musiek-afdeling is versteek + Musiek-afdeling word gewys + Versteek Vasvrae + Vasvrae-afdeling is versteek + Vasvrae-afdeling word gewys + Aktiveer kanaaloortjiefilter + Kanaaloortjiefilter is geaktiveer + Kanaaloortjiefilter is gedeaktiveer + Kanaaloortjiefilter + Voer die kanaaloortjiename in om te filtreer, een per reël + "Beperkings: +• Shorts-rakke, kanaalbladsye en soekresultate mag steeds kyktellings wys. +• Hierdie funksie werk nie met die motorvormfaktor nie." + "Beperkings: +• Shorts-rakke, kanaalbladsye en soekresultate mag steeds oplaai tye wys. +• Hierdie funksie werk nie met die motorvormfaktor nie." + "Tuis/Inskrywings/Soekresultate word gefiltreer om inhoud te versteek wat sleutelwoordfrases ooreenstem + +Beperkings: +• Shorts kan nie deur kanaalnaam versteek word nie +• Sommige UI-komponente mag dalk nie versteek word nie +• Soek vir 'n sleutelwoord mag dalk geen resultate wys nie" - + Volskermadvertensies is versteek + Versteek speleropspringadvertensies + Speleropspringadvertensies is versteek + Speleropspringadvertensies word gewys + Kyk produkte-banier in speleroorleg is versteek + Kyk produkte-banier in speleroorleg word gewys + Versteek YouTube Premium-promosies + YouTube Premium-promosies is versteek + YouTube Premium-promosies word gewys - - + + URL na knipbord gekopieer + URL met tydstempel gekopieer + Wys kopieervideo-URL-knoppie + Kopieervideo-URL-knoppie word gewys. Tik om video-URL te kopieer. Tik en hou om met tydstempel te kopieer + Kopieervideo-URL-knoppie word nie gewys nie + Wys kopieertydstempel-URL-knoppie + Kopieertydstempel-URL-knoppie word gewys. Tik om video-URL met tydstempel te kopieer. Tik en hou om sonder tydstempel te kopieer + Kopieertydstempel-URL-knoppie word nie gewys nie + - + + Deaktiveer \'Meld aan by TV\'-opspringvenster + Meld aan by TV-opspringvenster is gedeaktiveer + Meld aan by TV-opspringvenster is geaktiveer + - + + Aktiveer tik om te soek + Tik om te soek is geaktiveer + Tik om te soek is gedeaktiveer + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Versteek mag dalk nie vir sommige gebruikersrekeninge werk nie. - + + Navigasieknoppies + Versteek of verander navigasiebalkknoppies + Versteek Tuis + Tuis-knoppie is versteek + Tuis-knoppie word gewys + Versteek Shorts + Shorts-knoppie is versteek + Shorts-knoppie word gewys + Versteek Skep + Skep-knoppie is versteek + Skep-knoppie word gewys + Versteek Inskrywings + Inskrywings-knoppie is versteek + Inskrywings-knoppie word gewys + Versteek Kennisgewings + Kennisgewings-knoppie is versteek + Kennisgewings-knoppie word gewys + Ruil Skep met Kennisgewings + Skep-knoppie is geruil met Kennisgewings-knoppie + Skep-knoppie is nie geruil met Kennisgewings-knoppie nie + As die verandering van hierdie instelling nie in werking tree nie, probeer om na Incognito-modus oor te skakel. + Versteek navigasieknoppie-etikette + Etikette is versteek + Etikette word gewys + Aktiveer smal navigasieknoppies + Spasiëring tussen navigasieknoppies is smal + Spasiëring tussen navigasieknoppies is normaal + Aktiveer navigasiebalkanimasies + Navigasie-oorgange word geanimeer + Navigasie-oorgange word nie geanimeer nie + Deaktiveer deurskynende statusbalk + Statusbalk is ondeursigtig + Statusbalk is ondeursigtig of deurskynend + "Beperkings: +• 'n Swart balk mag bo-aan die videospeler verskyn. +• Op sommige toestelle kan die aktivering van hierdie funksie die stelselnavigasiebalk na deursigtig verander." + Deaktiveer ligte deurskynende balk + Ligte modus navigasiebalk is ondeursigtig + Ligte modus navigasiebalk is ondeursigtig of deurskynend + Deaktiveer donker deurskynende balk + Donker modus navigasiebalk is ondeursigtig + Donker modus navigasiebalk is ondeursigtig of deurskynend + Werksbalk + Versteek of verander werksbalkkomponente + Versteek Skep-knoppie + Skep-knoppie is versteek + Skep-knoppie word gewys + Versteek Kennisgewings-knoppie + Kennisgewings-knoppie is versteek + Kennisgewings-knoppie word gewys + Versteek Soek-knoppie + Soek-knoppie is versteek + Soek-knoppie word gewys. + Aktiveer wye soekbalk + Wye soekbalk is geaktiveer + Wye soekbalk is gedeaktiveer @@ -126,25 +315,67 @@ Second \"item\" text" + Versteek Vou saam-knoppie + Vou saam-knoppie is versteek + Vou saam-knoppie word gewys + Versteek Volskerm-knoppie + Volskerm-knoppie is versteek + Volskerm-knoppie word gewys + + + Versteek eindskermkaarte + Eindskermkaarte is versteek + Eindskermkaarte word gewys - + Aktiveer volskerm groot soekbalk + Volskerm soekbalk is groot + Volskerm soekbalk is normale grootte + Versteek Shorts in kanaalbladsy + Versteek in kanaalbladsy + Gewys in kanaalbladsy + Versteek Shorts in videobeskrywing + Versteek in videobeskrywing + Gewys in videobeskrywing + Versteek KI-knoppie + KI-knoppie is versteek + KI-knoppie word gewys + Versteek \'Outo-gedoop\'-etiket + Outo-gedoop-etiket is versteek + Outo-gedoop-etiket word gewys + - + + Versteek outospeel-voorskou + Outospeel-voorskou is versteek + Outospeel-voorskou word gewys + + + Versteek eindskerm voorgestelde video + "Eindskerm voorgestelde video is versteek wanneer outospeel afgeskakel is + +Outospeel kan in YouTube-instellings verander word: +Instellings → Afspeel → Speel volgende video outomaties af" + Eindskerm voorgestelde video word gewys + - + + Versteek speler opwip panele + Speler opwip panele is versteek + Speler opwip panele word gewys + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Slegs vir gebruik in musiekvideo\'s. Afdelings van musiekvideo\'s sonder musiek, wat nie reeds deur \'n ander kategorie gedek word nie + Kan nie die segment indien nie: %s + "Kan nie die segment indien nie. +Bestaan reeds" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Gedeaktiveer + Kleur + Swart en wit + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Deaktiveer tik-en-hou haptiese terugvoer + Tik-en-hou haptiese terugvoer is gedeaktiveer + Tik-en-hou haptiese terugvoer is geaktiveer + @@ -200,6 +441,11 @@ Second \"item\" text" + + Versteek Premium-kwaliteitopsies + Premium-kwaliteitopsies is versteek + Premium-kwaliteitopsies word gewys + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-am-rET/strings.xml b/patches/src/main/resources/addresources/values-am-rET/strings.xml index 3a40645452..e7d35132a9 100644 --- a/patches/src/main/resources/addresources/values-am-rET/strings.xml +++ b/patches/src/main/resources/addresources/values-am-rET/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + ደማቅ አዶዎችን አሰናክል + አዶዎች ደማቅ አይደሉም + አዶዎች ደማቅ ናቸው + GmsCore + የ GmsCore ቅንብሮች + የ GmsCore ዝማኔዎችን ያረጋግጡ + ዝማኔዎችን ማረጋገጥ ነቅቷል + የዝመናዎች ፍተሻ ተሰናክሏል + የGmsCore ቅንብሮችን ክፈት + የGmsCore ቅንብሮች + MicroG GmsCore አልተጫነም። ይጫኑት። + እርምጃ ያስፈልጋል + ለMicroG GmsCore ዝመናዎች ማረጋገጥ አልተሳካም። + የMicroG GmsCore አዲስ ስሪት (%1$s) ይገኛል። በአሁኑ ጊዜ እርስዎ ስሪት %2$s እየተጠቀሙ ነው። + "MicroG GmsCore ከበስተጀርባ እንዲሰራ ፍቃድ የለውም። + +ለስልክዎ የ\"የእኔን መተግበሪያ አትግደለው\" መመሪያን ይከተሉ እና መመሪያዎቹን ለMicroG ጭነትዎ ይተግብሩ። + +ይህ መተግበሪያው እንዲሰራ ያስፈልጋል።" + ድር ጣቢያ ክፈት + ሰርዝ + "ችግሮችን ለመከላከል የMicroG GmsCore የባትሪ ማመቻቸት መጥፋት አለበት። + +ለMicroG የባትሪ ማመቻቸትን ማጥፋት የባትሪ አጠቃቀምን አይጎዳም። + +የቀጥል አዝራሩን መታ ያድርጉ እና የማመቻቸት ለውጦችን ይፍቀዱ።" + ቀጥል - + + ይህን ባህሪ ለመጠቀም መተግበሪያውን እንደገና ያስጀምሩ + የፕሮቶኮል ማከማቻን ይመዝግቡ + የማረሚያ ምዝግብ ማስታወሻዎች የፕሮቶኮል ማከማቻን ያካትታሉ + የማረሚያ ምዝግብ ማስታወሻዎች የፕሮቶኮል ማከማቻን አያካትቱም + "ይህን ቅንብር ማንቃት ተጨማሪ የአቀማመጥ መረጃዎችን ይመዘግባል፣ ይህም ለአንዳንድ የተጠቃሚ በይነገጽ አካላት የማያ ገጽ ላይ ጽሑፍን ያካትታል። + +ይህ ብጁ ማጣሪያዎችን ሲፈጥሩ አካላትን ለመለየት ይረዳል። + +ሆኖም፣ ይህን ማንቃት እንደ አይፒ አድራሻዎ ያሉ አንዳንድ የተጠቃሚ መረጃዎችንም ይመዘግባል።" + @@ -48,40 +85,135 @@ Second \"item\" text" - + የፈጣሪ ማከማቻ መደርደሪያን ደብቅ + በቪዲዮ ማጫወቻው ስር ያለው የፈጣሪ ማከማቻ መደርደሪያ ተደብቋል + በቪዲዮ ማጫወቻው ስር ያለው የፈጣሪ ማከማቻ መደርደሪያ ይታያል + በመነሻ ገጽ ምግብ ውስጥ ባሉ ቪዲዮዎች ስር ያለውን የአስተያየት ክፍል ደብቅ + በመነሻ ገጽ ምግብ ውስጥ ባሉ ቪዲዮዎች ስር ያለው የአስተያየት ክፍል ተደብቋል + በመነሻ ገጽ ምግብ ውስጥ ባሉ ቪዲዮዎች ስር ያለው የአስተያየት ክፍል ይታያል + + \'የቅርብ ጊዜ ቪዲዮዎች\' የሚለውን ቁልፍ ደብቅ + የቅርብ ጊዜ ቪዲዮዎች ቁልፍ ተደብቋል + የቅርብ ጊዜ ቪዲዮዎች ቁልፍ ይታያል + + የድር ፍለጋ ውጤቶችን ደብቅ + የድር ፍለጋ ውጤቶች ተደብቀዋል + የድር ፍለጋ ውጤቶች ይታያሉ + \'ሊወዷቸው የሚችሏቸው\' ክፍልን ደብቅ + \'ሊወዷቸው የሚችሏቸው\' ክፍል ተደብቋል + \'ሊወዷቸው የሚችሏቸው\' ክፍል ይታያል + This button usually appears in the video player for certain videos. --> + + \'የቀጥታ ውይይት ድጋሚ መልሶ ማጫወት\' ቁልፍን ደብቅ + በማጫወቻው ተደራቢ ውስጥ ያለው የቀጥታ ውይይት ድጋሚ መልሶ ማጫወት ቁልፍ ተደብቋል + በማጫወቻው ተደራቢ ውስጥ ያለው የቀጥታ ውይይት ድጋሚ መልሶ ማጫወት ቁልፍ ይታያል + የቪዲዮውን ርዕስ ደብቅ + በማጫወቻው ተደራቢ ውስጥ ያለው የቪዲዮ ርዕስ ተደብቋል + በማጫወቻው ተደራቢ ውስጥ ያለው የቪዲዮ ርዕስ ይታያል + \'የኮርስ እድገት\'ን ደብቅ + የኮርስ እድገት ክፍል ተደብቋል + የኮርስ እድገት ክፍል ይታያል + አስስን ደብቅ + ይህን ኮርስ አስስ እና ፖድካስቱን አስስ የሚሉ ክፍሎች ተደብቀዋል + ይህን ኮርስ አስስ እና ፖድካስቱን አስስ የሚሉ ክፍሎች ይታያሉ + \'ይህን ኮርስ አስስ\'ን ደብቅ + ይህን ኮርስ አስስ ክፍል ተደብቋል + ይህን ኮርስ አስስ ክፍል ይታያል + \'ፖድካስቱን አስስ\'ን ደብቅ + ፖድካስቱን አስስ ክፍል ተደብቋል + ፖድካስቱን አስስ ክፍል ይታያል + \'የተለዩ ቦታዎች\'ን ደብቅ + የተለዩ ቦታዎች ክፍል ተደብቋል + የተለዩ ቦታዎች ክፍል ይታያል + የምግብ መበተን ምናሌ ማጣሪያን አንቃ + የምግብ መበተን ምናሌ ማጣሪያ ነቅቷል + የምግብ መበተን ምናሌ ማጣሪያ ተሰናክሏል + የምግብ መበተን ምናሌ ማጣሪያ + ለማጣራት የሚፈልጓቸውን የመበተን ምናሌ ስሞች በእያንዳንዱ መስመር አንድ በማድረግ ያስገቡ + ጨዋታን ደብቅ + የጨዋታ ክፍል ተደብቋል + የጨዋታ ክፍል ይታያል + ሙዚቃን ደብቅ + የሙዚቃ ክፍል ተደብቋል + የሙዚቃ ክፍል ይታያል + ጥያቄዎችን ደብቅ + የጥያቄዎች ክፍል ተደብቋል + የጥያቄዎች ክፍል ይታያል + የሰርጥ ትር ማጣሪያን አንቃ + የሰርጥ ትር ማጣሪያ ነቅቷል + የሰርጥ ትር ማጣሪያ ተሰናክሏል + የሰርጥ ትር ማጣሪያ + ለማጣራት የሚፈልጓቸውን የሰርጥ ትር ስሞች በእያንዳንዱ መስመር አንድ በማድረግ ያስገቡ + "ገደቦች: +• Shorts መደርደሪያዎች፣ የሰርጥ ገጾች እና የፍለጋ ውጤቶች አሁንም የእይታ ቁጥሮችን ሊያሳዩ ይችላሉ። +• ይህ ባህሪ ከመኪና ቅርጽ ጋር አይሰራም።" + "ገደቦች: +• Shorts መደርደሪያዎች፣ የሰርጥ ገጾች እና የፍለጋ ውጤቶች አሁንም የመጫኛ ሰዓቶችን ሊያሳዩ ይችላሉ። +• ይህ ባህሪ ከመኪና ቅርጽ ጋር አይሰራም።" + "መነሻ/የተመዘገቡ/የፍለጋ ውጤቶች ከቁልፍ ቃል ሀረጎች ጋር የሚዛመዱ ይዘቶችን ለመደበቅ ተጣርተዋል + +ገደቦች: +• Shorts በሰርጥ ስም ሊደበቁ አይችሉም +• አንዳንድ የUI ክፍሎች ላይደበቁ ይችላሉ +• ቁልፍ ቃል መፈለግ ምንም ውጤት ላያሳይ ይችላል" - + የሙሉ ማያ ገጽ ማስታወቂያዎች ተደብቀዋል + የማጫወቻ ብቅ-ባይ ማስታወቂያዎችን ደብቅ + የማጫወቻ ብቅ-ባይ ማስታወቂያዎች ተደብቀዋል + የማጫወቻ ብቅ-ባይ ማስታወቂያዎች ይታያሉ + በማጫወቻው ተደራቢ ውስጥ ያለው የምርት ማስታወቂያ ባነር ተደብቋል + በማጫወቻው ተደራቢ ውስጥ ያለው የምርት ማስታወቂያ ባነር ይታያል + YouTube Premium ማስተዋወቂያዎችን ደብቅ + YouTube Premium ማስተዋወቂያዎች ተደብቀዋል + YouTube Premium ማስተዋወቂያዎች ይታያሉ - - + + URL ወደ ቅንጥብ ሰሌዳ ተቀድቷል + URL ከሰዓት ማህተም ጋር ተቀድቷል + የቪዲዮ URL መቅጃ ቁልፍን አሳይ + የቪዲዮ URL መቅጃ ቁልፍ ይታያል። የቪዲዮ URL ለመቅዳት ይንኩ። ከሰዓት ማህተም ጋር ለመቅዳት ተጭነው ይያዙ + የቪዲዮ URL መቅጃ ቁልፍ አይታይም + የሰዓት ማህተም URL መቅጃ ቁልፍን አሳይ + የሰዓት ማህተም URL መቅጃ ቁልፍ ይታያል። የቪዲዮ URLን ከሰዓት ማህተም ጋር ለመቅዳት ይንኩ። ያለሰዓት ማህተም ለመቅዳት ተጭነው ይያዙ + የሰዓት ማህተም URL መቅጃ ቁልፍ አይታይም + - + + \'ወደ ቲቪ ግባ\' ብቅ-ባይን አሰናክል + ወደ ቲቪ ግባ ብቅ-ባይ ተሰናክሏል + ወደ ቲቪ ግባ ብቅ-ባይ ነቅቷል + - + + ለመፈለግ መታ ማድረግን አንቃ + ለመፈለግ መታ ማድረግ ነቅቷል + ለመፈለግ መታ ማድረግ ተሰናክሏል + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + መደበቅ ለአንዳንድ የተጠቃሚ መለያዎች ላይሰራ ይችላል። - + + የአሰሳ አዝራሮች + የአሰሳ አሞሌ አዝራሮችን ደብቅ ወይም ቀይር + መነሻን ደብቅ + የመነሻ ቁልፍ ተደብቋል + የመነሻ ቁልፍ ይታያል + Shorts ን ደብቅ + የ Shorts ቁልፍ ተደብቋል + የ Shorts ቁልፍ ይታያል + ፍጠርን ደብቅ + የፍጠር ቁልፍ ተደብቋል + የፍጠር ቁልፍ ይታያል + የተመዘገቡትን ደብቅ + የተመዘገቡ ቁልፍ ተደብቋል + የተመዘገቡ ቁልፍ ይታያል + ማሳወቂያዎችን ደብቅ + የማሳወቂያዎች ቁልፍ ተደብቋል + የማሳወቂያዎች ቁልፍ ይታያል + ፍጠርን በማሳወቂያዎች ቀይር + የፍጠር ቁልፍ ከማሳወቂያዎች ቁልፍ ጋር ተቀይሯል + የፍጠር ቁልፍ ከማሳወቂያዎች ቁልፍ ጋር አልተቀየረም + ይህንን ቅንብር መቀየር ውጤት ከሌለው፣ ወደ ስውር ሁነታ (Incognito mode) ለመቀየር ይሞክሩ። + የአሰሳ ቁልፍ መለያዎችን ደብቅ + መለያዎች ተደብቀዋል + መለያዎች ይታያሉ + ጠባብ የአሰሳ አዝራሮችን አንቃ + በአሰሳ አዝራሮች መካከል ያለው ክፍተት ጠባብ ነው + በአሰሳ አዝራሮች መካከል ያለው ክፍተት መደበኛ ነው + የአሰሳ አሞሌ እነማዎችን አንቃ + የአሰሳ ሽግግሮች እነማ ተደርገዋል + የአሰሳ ሽግግሮች እነማ አልተደረጉም + ግልጽ ያልሆነ የሁኔታ አሞሌን አሰናክል + የሁኔታ አሞሌው ደብዛዛ ነው + የሁኔታ አሞሌው ደብዛዛ ወይም ግልጽ ያልሆነ ነው + "ገደቦች: +• ጥቁር መስመር በቪዲዮ ማጫወቻው አናት ላይ ሊታይ ይችላል። +• በአንዳንድ መሳሪያዎች ላይ ይህን ባህሪ ማንቃት የስርዓቱን የአሰሳ አሞሌ ግልጽነት እንዲቀይር ሊያደርግ ይችላል።" + ቀላል ግልጽ ያልሆነ አሞሌን አሰናክል + ቀላል ሁነታ የአሰሳ አሞሌ ደብዛዛ ነው + ቀላል ሁነታ የአሰሳ አሞሌ ደብዛዛ ወይም ግልጽ ያልሆነ ነው + ጨለማ ግልጽ ያልሆነ አሞሌን አሰናክል + ጨለማ ሁነታ የአሰሳ አሞሌ ደብዛዛ ነው + ጨለማ ሁነታ የአሰሳ አሞሌ ደብዛዛ ወይም ግልጽ ያልሆነ ነው + የመሳሪያ አሞሌ + የመሳሪያ አሞሌ ክፍሎችን ደብቅ ወይም ቀይር + የፍጠር ቁልፍን ደብቅ + የፍጠር ቁልፍ ተደብቋል + የፍጠር ቁልፍ ይታያል + የማሳወቂያዎች ቁልፍን ደብቅ + የማሳወቂያዎች ቁልፍ ተደብቋል + የማሳወቂያዎች ቁልፍ ይታያል + የፍለጋ ቁልፍን ደብቅ + የፍለጋ ቁልፍ ተደብቋል + የፍለጋ ቁልፍ ይታያል። + ሰፊ የፍለጋ አሞሌን አንቃ + ሰፊ የፍለጋ አሞሌ ነቅቷል + ሰፊ የፍለጋ አሞሌ ቦዝኗል @@ -126,25 +315,67 @@ Second \"item\" text" + የመጠቅለያ ቁልፍን ደብቅ + የመጠቅለያ ቁልፍ ተደብቋል + የመጠቅለያ ቁልፍ ይታያል + የሙሉ ማያ ገጽ ቁልፍን ደብቅ + የሙሉ ማያ ገጽ ቁልፍ ተደብቋል + የሙሉ ማያ ገጽ ቁልፍ ይታያል + + + የመጨረሻ ማያ ገጽ ካርዶችን ደብቅ + የመጨረሻ ማያ ገጽ ካርዶች ተደብቀዋል + የመጨረሻ ማያ ገጽ ካርዶች ይታያሉ - + የሙሉ ማያ ገጽ ትልቅ ፍለጋ አሞሌን አንቃ + የሙሉ ማያ ገጽ ፍለጋ አሞሌ ትልቅ መጠን ነው + የሙሉ ማያ ገጽ ፍለጋ አሞሌ መደበኛ መጠን ነው + Shorts ን በሰርጥ ገጽ ደብቅ + በሰርጥ ገጽ ተደብቋል + በሰርጥ ገጽ ይታያል + Shorts ን በቪዲዮ መግለጫ ደብቅ + በቪዲዮ መግለጫ ተደብቋል + በቪዲዮ መግለጫ ይታያል + AI ቁልፍን ደብቅ + የAI ቁልፍ ተደብቋል + የAI ቁልፍ ይታያል + \'በራስ-ሰር የተተረጎመ\' መለያን ደብቅ + በራስ-ሰር የተተረጎመ መለያ ተደብቋል + በራስ-ሰር የተተረጎመ መለያ ይታያል + - + + ራስ-አጫውት ቅድመ እይታን ደብቅ + ራስ-አጫውት ቅድመ እይታ ተደብቋል + ራስ-አጫውት ቅድመ እይታ ይታያል + + + የመጨረሻ ማያ ገጽ የተጠቆመ ቪዲዮን ደብቅ + "ራስ-አጫውት ሲጠፋ የመጨረሻ ማያ ገጽ የተጠቆመ ቪዲዮ ይደበቃል + +ራስ-አጫውት በYouTube ቅንብሮች ውስጥ ሊቀየር ይችላል: +ቅንብሮች → መልሶ ማጫወት → ቀጣዩን ቪዲዮ በራስ-ሰር ያጫውቱ" + የመጨረሻ ማያ ገጽ የተጠቆመ ቪዲዮ ይታያል + - + + የተጫዋች ብቅ-ባይ ፓነሎችን ደብቅ + የተጫዋች ብቅ-ባይ ፓነሎች ተደብቀዋል + የተጫዋች ብቅ-ባይ ፓነሎች ይታያሉ + @@ -155,10 +386,12 @@ Second \"item\" text" - - + ለሙዚቃ ቪዲዮዎች ብቻ። በሌላ ምድብ ያልተሸፈኑ፣ ሙዚቃ የሌላቸው የሙዚቃ ቪዲዮዎች ክፍሎች + ክፍሉን ማስገባት አልተቻለም: %s + "ክፍሉን ማስገባት አልተቻለም። +አስቀድሞ አለ" @@ -170,7 +403,11 @@ Second \"item\" text" - + + ተሰናክሏል + ቀለም + ጥቁር እና ነጭ + @@ -187,7 +424,11 @@ Second \"item\" text" - + + መታ እና ይያዙ የንዝረት ግብረመልስን አሰናክል + መታ እና ይያዙ የንዝረት ግብረመልስ ተሰናክሏል + መታ እና ይያዙ የንዝረት ግብረመልስ ነቅቷል + @@ -200,6 +441,11 @@ Second \"item\" text" + + ፕሪሚየም ጥራት አማራጮችን ደብቅ + ፕሪሚየም ጥራት አማራጮች ተደብቀዋል + ፕሪሚየም ጥራት አማራጮች ይታያሉ + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index a7ad05ddfb..9e3450cfed 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" عرض سجل بحث الإعدادات يتم عرض سجل البحث في الإعدادات لا يتم عرض سجل البحث في الإعدادات + تعطيل الأيقونات الغليظة + الأيقونات ليست غليظة + الأيقونات غليظة عرض أيقونات إعدادات ReVanced يتم عرض أيقونات الإعدادات لا يتم عرض أيقونات الإعدادات @@ -101,23 +104,23 @@ Second \"item\" text" and changes made here must also be made there. --> - إعدادات GmsCore - إعدادات لـ GmsCore + GmsCore + إعدادات متعلقة بـ GmsCore + التحقق من وجود تحديثات لـ GmsCore + تم تمكين التحقق من التحديثات + تم تعطيل التحقق من التحديثات + فتح إعدادات GmsCore + إعدادات لـ GmsCore - لم يتم تثبيت MicroG GmsCore. قم بتثبيته. - الإجراء مطلوب - "لا يملك MicroG GmsCore صلاحية التشغيل في الخلفية. - -اتبع دليل \"لا تغلق تطبيقي\" لهاتفك، وطبّق التعليمات على تثبيت MicroG. - -هذا مطلوب لعمل التطبيق." - فتح الموقع - "يجب تعطيل تحسينات بطارية MicroG GmsCore لمنع حدوث مشكلات. - -لن يؤثر تعطيل تحسينات البطارية لـ MicroG سلبًا على استخدام البطارية. - -انقر فوق زر متابعة واسمح بتغييرات التحسين." - متابعة + لم يتم تثبيت MicroG GmsCore. قم بتثبيته. + الإجراء مطلوب + فشل التحقق من تحديثات MicroG GmsCore + يتوفر إصدار جديد (%1$s) من MicroG GmsCore. أنت تستخدم حاليًا الإصدار %2$s. + "لا يملك MicroG GmsCore صلاحية التشغيل في الخلفية.\n\nاتبع دليل \"لا تغلق تطبيقي\" لهاتفك، وطبّق التعليمات على تثبيت MicroG.\n\nهذا مطلوب لعمل التطبيق." + فتح الموقع + إلغاء + "يجب تعطيل تحسينات بطارية MicroG GmsCore لمنع حدوث مشكلات.\n\nلن يؤثر تعطيل تحسينات البطارية لـ MicroG سلبًا على استخدام البطارية.\n\nانقر فوق زر متابعة واسمح بتغييرات التحسين." + متابعة Spoof Video Streams @@ -173,10 +176,11 @@ Second \"item\" text" تم حفظ Flags تم إعادة تعيين Flags تم نسخ Flags إلى الحافظة - سجل بروتوكول التخزين المؤقت - تتضمن سجلات التصحيح التخزين المؤقت - لا تتضمن سجلات التصحيح التخزين المؤقت - "سيؤدي تمكين هذا الإعداد إلى تسجيل بيانات تخطيط إضافية، بما في ذلك النص المعروض على الشاشة لبعض مكونات واجهة المستخدم. + أعد تشغيل التطبيق لاستخدام هذه الميزة + سجل بروتوكول التخزين المؤقت + تتضمن سجلات التصحيح التخزين المؤقت + لا تتضمن سجلات التصحيح التخزين المؤقت + "سيؤدي تمكين هذا الإعداد إلى تسجيل بيانات تخطيط إضافية، بما في ذلك النص المعروض على الشاشة لبعض مكونات واجهة المستخدم. يمكن أن يساعد هذا في تحديد المكونات عند إنشاء عوامل تصفية مخصصة. @@ -226,6 +230,9 @@ Second \"item\" text" تم تمكين تشغيل Shorts بالخلفية + إخفاء رف متجر المنشئ + تم إخفاء رف متجر المنشئ أسفل مشغل الفيديو + يتم عرض رف متجر المنشئ أسفل مشغل الفيديو إخفاء بطاقات الألبوم تم إخفاء بطاقات الألبوم يتم عرض بطاقات الألبوم @@ -235,6 +242,9 @@ Second \"item\" text" إخفاء رف الشرائح تم إخفاء رف الشرائح يتم عرض رف الشرائح + إخفاء قسم التعليقات أسفل مقاطع الفيديو في الموجز الرئيسي + تم إخفاء قسم التعليقات أسفل مقاطع الفيديو في الموجز الرئيسي + يتم عرض قسم التعليقات أسفل مقاطع الفيديو في الموجز الرئيسي إخفاء مشاركات المجتمع تم إخفاء مشاركات المجتمع يتم عرض مشاركات المجتمع @@ -262,14 +272,19 @@ Second \"item\" text" إخفاء آخر المشاركات تم إخفاء أحدث المشاركات يتم عرض أحدث المشاركات + + إخفاء زر \'أحدث مقاطع الفيديو\' + تم إخفاء زر أحدث مقاطع الفيديو + يتم عرض زر أحدث مقاطع الفيديو إخفاء قوائم تشغيل التشكيلة تم إخفاء قوائم تشغيل التشكيلة يتم عرض قوائم تشغيل التشكيلة إخفاء قسم الأفلام تم إخفاء قسم الأفلام يتم عرض قسم الأفلام - + إخفاء زر \'تنبيهي\' تم إخفاء زر تنبيهي يتم عرض زر تنبيهي @@ -294,13 +309,16 @@ Second \"item\" text" إخفاء المسافة البادئة المرئية تم إخفاء المسافة البادئة المرئية يتم عرض المسافة البادئة المرئية + إخفاء نتائج بحث الويب + تم إخفاء نتائج البحث على الويب + يتم عرض نتائج البحث على الويب + إخفاء قسم \'قد يعجبك\' + \'تم إخفاء قسم \'قد يعجبك\' + \'يتم عرض قسم \'قد يعجبك\' إخفاء رسومات YouTube تم إخفاء رسوم Doodles المتحركة على شعار YouTube يتم عرض رسوم Doodles المتحركة على شعار YouTube - "تظهر رسومات YouTube Doodles لعدة أيام كل عام. - -إذا كانت رسومات Doodles تظهر حاليًا في منطقتك وكان إعداد الإخفاء هذا قيد التشغيل، فسيتم أيضًا إخفاء شريط التصفية الموجود أسفل شريط البحث." إخفاء شريط القناة تم إخفاء شريط القناة يتم عرض شريط القناة @@ -317,10 +335,15 @@ Second \"item\" text" تم إخفاء لوحات المعلومات يتم عرض لوحات المعلومات + This button usually appears in the video player for certain videos. --> إخفاء زر الانضمام تم إخفاء زر الانضمام يتم عرض زر الانضمام + + إخفاء زر \'إعادة تشغيل الدردشة المباشرة\' + تم إخفاء زر إعادة تشغيل الدردشة المباشرة في تراكب المشغل + يتم عرض زر إعادة تشغيل الدردشة المباشرة في تراكب المشغل إخفاء اللوحات الطبية تم إخفاء اللوحات الطبية يتم عرض اللوحات الطبية @@ -336,6 +359,9 @@ Second \"item\" text" إخفاء ردود الفعل المؤقتة تم إخفاء ردود الفعل المؤقتة يتم عرض ردود الفعل المؤقتة + إخفاء عنوان الفيديو + تم إخفاء عنوان الفيديو في تراكب المشغل + يتم عرض عنوان الفيديو في تراكب المشغل إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\' تم إخفاء قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI يتم عرض قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI @@ -348,33 +374,62 @@ Second \"item\" text" إخفاء الفصول تم إخفاء قسم الفصول يتم عرض قسم الفصول - إخفاء \'كيف تم إنشاء هذا المحتوى\' - تم إخفاء قسم كيف تم إنشاء هذا المحتوى - يتم عرض قسم كيف تم إنشاء هذا المحتوى - إخفاء نقاط التشجيع - تم إخفاء نقاط التشجيع - يتم عرض نقاط التشجيع + إخفاء \'تقدم الدورة التدريبية\' + تم إخفاء قسم تقدم الدورة التدريبية + يتم عرض قسم تقدم الدورة التدريبية + إخفاء استكشاف + تم إخفاء أقسام استكشاف هذه الدورة واستكشاف البودكاست + يتم عرض أقسام استكشاف هذه الدورة واستكشاف البودكاست + إخفاء \'استكشاف هذه الدورة\' + تم إخفاء قسم استكشاف هذه الدورة + يتم عرض قسم استكشاف هذه الدورة + إخفاء \'استكشاف البودكاست\' + تم إخفاء قسم استكشاف البودكاست + يتم عرض قسم استكشاف البودكاست إخفاء \'استكشاف البودكاست\' تم إخفاء قسم استكشاف البودكاست يتم عرض قسم استكشاف البودكاست إخفاء الروابط المميزة تم إخفاء قسم الروابط المميزة يتم عرض قسم الروابط المميزة + إخفاء \'الأماكن المميزة\' + تم إخفاء قسم الأماكن المميزة + يتم عرض قسم الأماكن المميزة إخفاء الفيديوهات المميزة تم إخفاء قسم الفيديوهات المميزة يتم عرض قسم الفيديوهات المميزة + تمكين فلتر قائمة الموجز المنبثقة + تم تمكين فلتر قائمة الموجز المنبثقة + تم تعطيل فلتر قائمة الموجز المنبثقة + فلتر قائمة الموجز المنبثقة + أدخل أسماء القائمة المنبثقة للتصفية حسبها، واحد في كل سطر + إخفاء الألعاب + تم إخفاء قسم الألعاب + يتم عرض قسم الألعاب + إخفاء \'كيف تم إنشاء هذا المحتوى\' + تم إخفاء قسم كيف تم إنشاء هذا المحتوى + يتم عرض قسم كيف تم إنشاء هذا المحتوى + إخفاء نقاط التشجيع + تم إخفاء نقاط التشجيع + يتم عرض نقاط التشجيع إخفاء بطاقات المعلومات تم إخفاء قسم بطاقات المعلومات يتم عرض قسم بطاقات المعلومات إخفاء \'المفاهيم الأساسية\' تم إخفاء قسم المفاهيم الأساسية يتم عرض قسم المفاهيم الأساسية + إخفاء الموسيقى + تم إخفاء قسم الموسيقى + يتم عرض قسم الموسيقى إخفاء زر الاشتراك تم إخفاء زر الاشتراك يتم عرض زر الاشتراك إخفاء النص تم إخفاء قسم النص يتم عرض قسم النص + إخفاء الاختبارات + تم إخفاء قسم الاختبارات + يتم عرض قسم الاختبارات وصف الفيديو إخفاء أو عرض مكونات وصف الفيديو شريط التصفية @@ -393,6 +448,11 @@ Second \"item\" text" يُعرض في السجلّ صفحة القناة إخفاء أو عرض مكونات صفحة القناة + تمكين فلتر علامة تبويب القناة + تم تمكين فلتر علامة تبويب القناة + تم تعطيل فلتر علامة تبويب القناة + فلتر علامة تبويب القناة + أدخل أسماء علامات تبويب القناة للتصفية حسبها، واحد في كل سطر إخفاء زر المنتدى تم إخفاء زر المجتمع @@ -456,15 +516,15 @@ Second \"item\" text" يتم عرض عدد المشاهدات في الموجز ونتائج البحث "القيود: -• رفوف Shorts وصفحات القنوات ونتائج البحث قد تظل تعرض أعداد المشاهدات -• هذه الميزة لا تعمل مع عامل الشكل Automotive" +• رفوف Shorts وصفحات القنوات ونتائج البحث قد تظل تعرض أعداد المشاهدات. +• هذه الميزة لا تعمل مع عامل الشكل Automotive." إخفاء وقت التحميل تم إخفاء وقت التحميل في الموجز ونتائج البحث يتم عرض وقت التحميل في الموجز ونتائج البحث "القيود: -• قد تظل أرفف Shorts وصفحات القنوات ونتائج البحث تُظهر أوقات التحميل -• هذه الميزة لا تعمل مع عامل الشكل Automotive" +• قد تظل أرفف Shorts وصفحات القنوات ونتائج البحث تُظهر أوقات التحميل. +• هذه الميزة لا تعمل مع عامل الشكل Automotive." إخفاء محتوى بالكلمات المفتاحية إخفاء فيديوهات البحث والموجز باستخدام فلاتر الكلمات المفتاحية إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية @@ -487,7 +547,7 @@ Second \"item\" text" لمحة عن تصفية الكلمات المفتاحية "الصفحة الرئيسية/الاشتراكات/نتائج البحث يتم تصفيتها لإخفاء المحتوى الذي يتطابق مع كلمات البحث -القيود +القيود: • فيديوهات Shorts لا يمكن إخفاؤها بواسطة اسم القناة • قد لا يتم إخفاء بعض مكونات واجهة المستخدم • البحث عن كلمة ما قد لا يعطي نتائج" @@ -502,19 +562,12 @@ Second \"item\" text" الكلمة المفتاحية سوف تخفي جميع الفيديوهات: %s - إخفاء رف متجر المنشئ - تم إخفاء رف متجر المنشئ أسفل مشغل الفيديو - يتم عرض رف متجر المنشئ أسفل مشغل الفيديو إخفاء لافتة شاشة المتجر النهائية تم إخفاء لافتة المتجر بالشاشة النهائية يتم عرض لافتة المتجر بالشاشة النهائية إخفاء إعلانات ملء الشاشة - "يتم إخفاء إعلانات ملء الشاشة - -هذه الميزة متاحة فقط للأجهزة القديمة" + تم إخفاء إعلانات ملء الشاشة يتم عرض إعلانات ملء الشاشة - - إخفاء إعلانات ملء الشاشة يعمل فقط مع الأجهزة القديمة إخفاء الإعلانات العامة تم إخفاء الإعلانات بشكل عام يتم عرض الإعلانات العامة @@ -524,6 +577,9 @@ Second \"item\" text" إخفاء تسمية الترقية المدفوعة تم إخفاء تسمية الترقية المدفوعة يتم عرض تسمية الترقية المدفوعة + إخفاء إعلانات المشغل المنبثقة + تم إخفاء إعلانات المشغل المنبثقة + يتم عرض إعلانات المشغل المنبثقة إخفاء بطاقات الرعاية الذاتية تم إخفاء بطاقات الرعاية الذاتية يتم عرض بطاقات الرعاية الذاتية @@ -531,23 +587,18 @@ Second \"item\" text" تم إخفاء روابط التسوق في وصف الفيديو يتم عرض روابط التسوق في وصف الفيديو إخفاء لافتة \'عرض المنتجات\' - تم إخفاء لافتة عرض المنتجات في واجهة الفيديو - يتم عرض لافتة عرض المنتجات في واجهة الفيديو - إخفاء نتائج بحث الويب - تم إخفاء نتائج البحث على الويب - يتم عرض نتائج البحث على الويب - - - إخفاء ترقية YouTube Premium - تم إخفاء عروض YouTube Premium الترويجية تحت مشغل الفيديو - يتم إظهار عروض YouTube Premium الترويجية تحت مشغل الفيديو + تم إخفاء لافتة عرض المنتجات في تراكب المشغل + يتم عرض لافتة عرض المنتجات في تراكب المشغل + إخفاء عروض YouTube Premium الترويجية + تم إخفاء عروض YouTube Premium الترويجية + يتم عرض عروض YouTube Premium الترويجية إخفاء إعلانات الفيديو تم إخفاء إعلانات الفيديو يتم عرض إعلانات الفيديو - + تم نسخ URL إلى الحافظة تم نسخ عنوان URL مع الطابع الزمني عرض زر نسخ عنوان URL للفيديو @@ -563,10 +614,10 @@ Second \"item\" text" سيتم عرض مربع الحوار وهذا لا يتجاوز قيود السن. بل يقبلها تلقائيًا. - - تعطيل النافذة المنبثقة لتسجيل الدخول إلى التلفزيون - تم تعطيل نافذة تسجيل الدخول إلى التلفزيون - تم تمكين نافذة تسجيل الدخول إلى التلفزيون + + تعطيل النافذة المنبثقة لتسجيل الدخول إلى التلفزيون + تم تعطيل نافذة تسجيل الدخول إلى التلفزيون + تم تمكين نافذة تسجيل الدخول إلى التلفزيون تعطيل تخطي الفصل بالنقر المزدوج @@ -599,10 +650,10 @@ Second \"item\" text" تم تعطيل إيماءة التمرير الدقيقة تم تمكين إيماءة التمرير الدقيقة - - تمكين النقر للتمرير - تم تمكين النقر للتمرير - تم تعطيل النقر للتمرير + + تمكين النقر للتمرير + تم تمكين النقر للتمرير + تم تعطيل النقر للتمرير تمكين إيماءة السطوع @@ -683,7 +734,7 @@ Second \"item\" text" تم إخفاء زر التعليقات يتم عرض زر التعليقات + This button usually appears on live streamed videos. --> إخفاء إبلاغ تم إخفاء زر إبلاغ يتم عرض زر إبلاغ @@ -696,7 +747,7 @@ Second \"item\" text" تم إخفاء زر تنزيل يتم عرض زر تنزيل + This button usually appears on videos uploaded by the logged-in user. --> إخفاء التشجيع تم إخفاء زر التشجيع يتم عرض زر التشجيع @@ -709,7 +760,7 @@ Second \"item\" text" تم إخفاء زر شكرًا يتم عرض زر شكرًا + This button usually appears if the user IP is from a specific region such as the USA or EU. --> إخفاء طرح سؤال تم إخفاء زر طرح سؤال يتم عرض زر طرح سؤال @@ -717,6 +768,7 @@ Second \"item\" text" إخفاء المقطع تم إخفاء زر المقطع يتم عرض زر المقطع + قد لا يعمل الإخفاء لبعض حسابات المستخدمين. إخفاء المتجر تم إخفاء زر المتجر @@ -726,9 +778,9 @@ Second \"item\" text" تم إخفاء زر حفظ يتم عرض زر حفظ - + أزرار التنقل - إخفاء أو تغيير الأزرار في شريط التنقل + إخفاء أزرار شريط التنقل أو تغييرها إخفاء الصفحة الرئيسية تم إخفاء زر الصفحة الرئيسية @@ -750,26 +802,44 @@ Second \"item\" text" يتم عرض زر الإشعارات تبديل الإنشاء بالإشعارات - "تم تبديل زر الإنشاء بـزر الإشعارات - -ملاحظة: يؤدي تمكين هذا أيضًا إلى إخفاء إعلانات الفيديو بالقوة" + يتم تبديل زر الإنشاء بزر الإشعارات لا يتم تبديل زر الإنشاء بزر الإشعارات - "سيؤدي تعطيل هذا الإعداد أيضًا إلى تعطيل حظر إعلانات Shorts. - -إذا لم يتم تفعيل تغيير هذا الإعداد، فحاول التبديل إلى وضع التصفُّح المتخفي." - إخفاء تسميات زر التنقل - تم إخفاء التسميات - يتم عرض التسميات + إذا لم يسري تغيير هذا الإعداد، فحاول التبديل إلى وضع التصفح المتخفي. + إخفاء تسميات أزرار التنقل + التسميات مخفية + التسميات ظاهرة + تمكين أزرار التنقل الضيقة + المسافة بين أزرار التنقل ضيقة + المسافة بين أزرار التنقل طبيعية + تمكين رسوم شريط التنقل المتحركة + انتقالات التنقل متحركة + انتقالات التنقل ليست متحركة تعطيل شريط الحالة الشفاف شريط الحالة غير شفاف شريط الحالة معتم أو شفاف - في بعض الأجهزة، قد يؤدي تمكين هذه الميزة إلى تغيير شريط التنقل في النظام إلى شفاف. + "القيود: +• قد يظهر شريط أسود في أعلى مشغل الفيديو. +• على بعض الأجهزة، قد يؤدي تمكين هذه الميزة إلى تغيير شريط التنقل الخاص بالنظام ليصبح شفافًا." تعطيل الشريط الشفاف الفاتح شريط التنقل في الوضع الفاتح غير شفاف - شريط التنقل في الوضع الفاتح معتم او شفاف + شريط التنقل في الوضع الفاتح معتم أو شفاف تعطيل الشريط الشفاف الداكن شريط التنقل في الوضع الداكن غير شفاف - شريط التنقل في الوضع الداكن معتم او شفاف + شريط التنقل في الوضع الداكن معتم أو شفاف + شريط الأدوات + إخفاء أو تغيير مكونات شريط الأدوات + إخفاء زر الإنشاء + تم إخفاء زر الإنشاء + يتم عرض زر الإنشاء + إخفاء زر الإشعارات + تم إخفاء زر الإشعارات + يتم عرض زر الإشعارات + إخفاء زر البحث + تم إخفاء زر البحث + يتم عرض زر البحث. + تمكين شريط البحث العريض + تم تمكين شريط البحث العريض + تم تعطيل شريط البحث العريض القائمة المنبثقة @@ -844,6 +914,12 @@ Second \"item\" text" إخفاء زر البث تم إخفاء زر البث يتم عرض زر البث + إخفاء زر الطي + تم إخفاء زر الطي + يتم عرض زر الطي + إخفاء زر ملء الشاشة + تم إخفاء زر ملء الشاشة + يتم عرض زر ملء الشاشة إخفاء خلفية عناصر التحكم بالمشغل تم إخفاء خلفية عناصر تحكم المشغل يتم عرض خلفية عناصر تحكم المشغل @@ -852,9 +928,9 @@ Second \"item\" text" يتم عرض أزرار السابق & التالي - إخفاء بطاقات شاشة النهاية - تم إخفاء بطاقات شاشة النهاية - يتم عرض بطاقات شاشة النهاية + إخفاء بطاقات شاشة النهاية + تم إخفاء بطاقات شاشة النهاية + يتم عرض بطاقات شاشة النهاية تعطيل وضع الإضاءة السينمائية في ملء الشاشة @@ -879,10 +955,16 @@ Second \"item\" text" إخفاء شريط تقدم مصغرات الفيديو تم إخفاء شريط تقدم مصغرات الفيديو يتم عرض شريط تقدم مصغرات الفيديو + تمكين شريط التمرير الكبير بملء الشاشة + شريط التمرير بملء الشاشة كبير الحجم + شريط التمرير بملء الشاشة حجمه طبيعي مشغل Shorts إخفاء أو عرض مكونات مشغل Shorts + إخفاء Shorts في صفحة القناة + مخفي في صفحة القناة + معروض في صفحة القناة إخفاء Shorts في الصفحة الرئيسية مخفي في موجز الصفحة الرئيسية والفيديوهات ذات الصلة @@ -894,9 +976,18 @@ Second \"item\" text" إخفاء Shorts في موجز الاشتراكات مخفي في موجز الاشتراكات يُعرض في موجز الاشتراكات + إخفاء Shorts في وصف الفيديو + مخفي في وصف الفيديو + معروض في وصف الفيديو إخفاء Shorts في السجلّ مخفي في السجلّ يُعرض في السجلّ + إخفاء زر الذكاء الاصطناعي + تم إخفاء زر الذكاء الاصطناعي + يتم عرض زر الذكاء الاصطناعي + إخفاء تسمية \"مدبلج تلقائياً\" + تم إخفاء تسمية الدبلجة التلقائية + يتم عرض تسمية الدبلجة التلقائية إخفاء تسمية \"مدبلج تلقائياً\" تم إخفاء تسمية الدبلجة التلقائية يتم عرض تسمية الدبلجة التلقائية @@ -958,6 +1049,7 @@ Second \"item\" text" إخفاء زر استخدام النموذج تم إخفاء زر استخدم هذا النموذج يتم عرض زر استخدم هذا النموذج + إخفاء التأثير الفوّار لـزر أعجبني تم إخفاء التأثير الفوّار لـزر أعجبني يتم عرض التأثير الفوّار لـزر أعجبني @@ -1000,7 +1092,12 @@ Second \"item\" text" تم إخفاء شريط التنقل يتم عرض شريط التنقل - + + إخفاء معاينة التشغيل التلقائي + تم إخفاء معاينة التشغيل التلقائي + يتم عرض معاينة التشغيل التلقائي + + إخفاء الفيديو المقترح في شاشة النهاية "تم إخفاء الفيديو المقترح في شاشة النهاية عند إيقاف التشغيل التلقائي @@ -1019,9 +1116,9 @@ Second \"item\" text" يتم عرض الطابع الزمني - إخفاء لوحات المشغل المنبثقة - تم إخفاء لوحات المشغل المنبثقة - يتم عرض لوحات المشغل المنبثقة + إخفاء لوحات المشغل المنبثقة + تم إخفاء لوحات المشغل المنبثقة + يتم عرض لوحات المشغل المنبثقة الخروج من وضع ملء الشاشة عند انتهاء الفيديو @@ -1091,26 +1188,6 @@ Second \"item\" text" تم مواجهة حد معدل العميل %d مرة %d جزء الثانية - - تمكين شريط البحث العريض - تم تمكين شريط البحث العريض - تم تعطيل شريط البحث العريض - - - تمكين المصغرات عالية الجودة - مصغرات شريط التقدم عالية الجودة - مصغرات شريط التقدم متوسطة الجودة - مصغرات شريط التقدم بملء الشاشة عالية الجودة - مصغرات شريط التقدم بملء الشاشة متوسطة الجودة - "سيؤدي هذا أيضا إلى استعادة المصغرات على البث المباشر الذي لا يحتوي على مصغرات شريط التقدم. - -مصغرات شريط التقدم سوف تستخدم نفس جودة الفيديو الحالي. - -تعمل هذه الميزة بشكل أفضل مع جودة فيديو 720p أو أقل وعند استخدام اتصال إنترنت سريع جدًا." - استعادة مصغرات شريط التقدم القديمة - مصغرات شريط التقدم ستظهر فوق شريط تقدم الفيديو - مصغرات شريط التقدم ستظهر في ملء الشاشة - SponsorBlock تمكين SponsorBlock @@ -1352,8 +1429,6 @@ Second \"item\" text" الهدف من تغيير إصدار التطبيق 20.13.41 - استعادة شريط إجراءات الفيديو غير المطوي 20.05.46 - استعادة وظيفة النسخ - 19.35.36 - استعادة أيقونات مشغل Shorts القديمة - 19.01.34 - استعادة أيقونات التنقل القديمة تغيير صفحة البداية @@ -1464,8 +1539,9 @@ Second \"item\" text" ستحتوي شاشة التحميل على خلفية متدرجة ستحتوي شاشة التحميل على خلفية ثابتة نمط الشاشة الترحيبية - اللون - أبيض وأسود + معطّل + اللون + أبيض وأسود تمكين لون شريط تقدم الفيديو المخصص يتم عرض لون شريط تقدم الفيديو المخصص يتم عرض لون شريط تقدم الفيديو الاصلي @@ -1577,6 +1653,9 @@ Second \"item\" text" تعطيل اهتزاز التراجع عن التمرير تم تعطيل اهتزاز التراجع عن التمرير تم تمكين اهتزاز التراجع عن التمرير + تعطيل اهتزاز النقر مع الاستمرار + تم تعطيل اهتزاز النقر مع الاستمرار + تم تمكين اهتزاز النقر مع الاستمرار تعطيل الاهتزاز عند التكبير تم تعطيل الاهتزاز عند التكبير تم تمكين الاهتزاز عند التكبير @@ -1672,6 +1751,11 @@ Second \"item\" text" يتم عرض قائمة جودة الفيديو المتقدمة لا يتم عرض قائمة جودة الفيديو المتقدمة + + إخفاء خيارات الجودة المميزة + خيارات الجودة المميزة مخفية + خيارات الجودة المميزة معروضة + تمكين التمرير للتقديم أو الترجيع تم تمكين التمرير للتقديم أو الترجيع @@ -1703,6 +1787,7 @@ Second \"item\" text" + لمحة الإعلانات عام diff --git a/patches/src/main/resources/addresources/values-as-rIN/strings.xml b/patches/src/main/resources/addresources/values-as-rIN/strings.xml index f2d7803a41..7f270bab90 100644 --- a/patches/src/main/resources/addresources/values-as-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-as-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + গাঢ় আইকনসমূহ অক্ষম কৰক + আইকনসমূহ গাঢ় নহয় + আইকনসমূহ গাঢ় হয় + GmsCore + GmsCore সম্পৰ্কীয় ছেটিংছ + GmsCore আপডেটৰ বাবে পৰীক্ষা কৰক + আপডেটৰ বাবে পৰীক্ষা কৰা সক্ষম কৰা হৈছে + আপডেটৰ বাবে পৰীক্ষা কৰা নিষ্ক্ৰিয় কৰা হৈছে + GmsCore ছেটিংছ খোলক + GmsCore-ৰ ছেটিংছ + MicroG GmsCore সংস্থাপন কৰা হোৱা নাই। ইয়াক সংস্থাপন কৰক। + কাৰ্য্যৰ প্ৰয়োজন + MicroG GmsCore আপডেটসমূহৰ বাবে পৰীক্ষা কৰাত বিফল হৈছে + MicroG GmsCore ৰ এটা নতুন সংস্কৰণ (%1$s) উপলব্ধ। বৰ্তমান, আপুনি %2$s সংস্কৰণ ব্যৱহাৰ কৰি আছে। + "MicroG GmsCore-ৰ পৃষ্ঠভূমিত চলাবলৈ অনুমতি নাই। + +আপোনাৰ ফোনৰ বাবে \"মোৰ এপটো নমাৰিব\" নিৰ্দেশিকা অনুসৰণ কৰক, আৰু আপোনাৰ MicroG সংস্থাপনলৈ নিৰ্দেশনা প্ৰয়োগ কৰক। + +এপটো কাম কৰাৰ বাবে ইয়াৰ প্ৰয়োজন।" + ৱেবছাইট খোলক + বাতিল কৰক + "সমস্যা প্ৰতিহত কৰিবলৈ MicroG GmsCore বেটাৰী অপ্টিমাইজেশ্বন নিষ্ক্ৰিয় কৰিব লাগিব। + +MicroG-ৰ বাবে বেটাৰী অপ্টিমাইজেশ্বন নিষ্ক্ৰিয় কৰিলে বেটাৰীৰ ব্যৱহাৰত নেতিবাচক প্ৰভাৱ নপৰিব। + +Continue বুটামত টেপ কৰক আৰু অপ্টিমাইজেশ্বন সলনি কৰিবলৈ অনুমতি দিয়ক।" + অগ্ৰসৰ হওক - + + এই বৈশিষ্ট্য ব্যৱহাৰ কৰিবলৈ এপটো পুনৰ আৰম্ভ কৰক। + লগ প্ৰটোকল বাফাৰ + ডিবাগ লগত প্ৰটোকল বাফাৰ অন্তৰ্ভুক্ত আছে + ডিবাগ লগত প্ৰটোকল বাফাৰ অন্তৰ্ভুক্ত নাই + "এই ছেটিংটো সক্ষম কৰিলে কিছুমান UI উপাদানৰ বাবে অন-স্ক্ৰীণ পাঠ্যকে ধৰি অতিৰিক্ত লেআউট ডেটা ল'গ কৰিব। + +ই কাষ্টম ফিল্টাৰ সৃষ্টি কৰোঁতে উপাদানসমূহ চিনাক্ত কৰাত সহায় কৰিব পাৰে। + +কিন্তু, ইয়াক সক্ষম কৰিলে আপোনাৰ IP ঠিকনাৰ দৰে কিছুমান ব্যৱহাৰকাৰী ডেটাও ল'গ কৰিব।" + @@ -48,40 +85,135 @@ Second \"item\" text" - + সৃষ্টিকৰ্তা ষ্টোৰ শ্বে\'ল্ফ লুকুৱাওক + ভিডিঅ\' প্লেয়াৰৰ তলৰ সৃষ্টিকৰ্তা ষ্টোৰ শ্বে\'ল্ফ লুকাই আছে + ভিডিঅ\' প্লেয়াৰৰ তলৰ সৃষ্টিকৰ্তা ষ্টোৰ শ্বে\'ল্ফ দেখুওৱা হৈছে + হোম ফিডত ভিডিঅ\'ৰ তলৰ মন্তব্যসমূহৰ অংশ লুকুৱাওক + হোম ফিডত ভিডিঅ\'ৰ তলৰ মন্তব্যসমূহৰ অংশ লুকাই আছে + হোম ফিডত ভিডিঅ\'ৰ তলৰ মন্তব্যসমূহৰ অংশ দেখুওৱা হৈছে + + \'সদ্যহতীয়া ভিডিঅ\'সমূহ\' বুটাম লুকুৱাওক + সদ্যহতীয়া ভিডিঅ\'সমূহৰ বুটাম লুকাই আছে + সদ্যহতীয়া ভিডিঅ\'সমূহৰ বুটাম দেখুওৱা হৈছে + + ৱেব সন্ধানৰ ফলাফল লুকুৱাওক + ৱেব সন্ধানৰ ফলাফল লুকাই আছে + ৱেব সন্ধানৰ ফলাফল দেখুওৱা হৈছে + \'আপুনি ভাল পাব পাৰে\' অংশ লুকুৱাওক + \'আপুনি ভাল পাব পাৰে\' অংশ লুকাই আছে + \'আপুনি ভাল পাব পাৰে\' অংশ দেখুওৱা হৈছে + This button usually appears in the video player for certain videos. --> + + \'লাইভ চাট ৰিপ্লে\' বুটাম লুকুৱাওক + প্লেয়াৰ অভাৰলে\'ত লাইভ চাট ৰিপ্লে বুটাম লুকাই আছে + প্লেয়াৰ অভাৰলে\'ত লাইভ চাট ৰিপ্লে বুটাম দেখুওৱা হৈছে + ভিডিঅ\'ৰ শিৰোনাম লুকুৱাওক + প্লেয়াৰ অভাৰলে\'ত ভিডিঅ\'ৰ শিৰোনাম লুকাই আছে + প্লেয়াৰ অভাৰলে\'ত ভিডিঅ\'ৰ শিৰোনাম দেখুওৱা হৈছে + \'পাঠ্যক্ৰমৰ অগ্ৰগতি\' লুকুৱাওক + পাঠ্যক্ৰমৰ অগ্ৰগতি অংশ লুকাই আছে + পাঠ্যক্ৰমৰ অগ্ৰগতি অংশ দেখুওৱা হৈছে + অন্বেষণ লুকুৱাওক + এই পাঠ্যক্ৰম অন্বেষণ কৰক আৰু পডকাষ্ট অংশ অন্বেষণ কৰক লুকাই আছে + এই পাঠ্যক্ৰম অন্বেষণ কৰক আৰু পডকাষ্ট অংশ অন্বেষণ কৰক দেখুওৱা হৈছে + \'এই পাঠ্যক্ৰম অন্বেষণ কৰক\' লুকুৱাওক + এই পাঠ্যক্ৰম অন্বেষণ অংশ লুকাই আছে + এই পাঠ্যক্ৰম অন্বেষণ অংশ দেখুওৱা হৈছে + \'পডকাষ্ট অন্বেষণ কৰক\' লুকুৱাওক + পডকাষ্ট অংশ অন্বেষণ কৰক লুকাই আছে + পডকাষ্ট অংশ অন্বেষণ কৰক দেখুওৱা হৈছে + \'বৈশিষ্ট্যপূৰ্ণ স্থানসমূহ\' লুকুৱাওক + বৈশিষ্ট্যপূৰ্ণ স্থানসমূহৰ অংশ লুকাই আছে + বৈশিষ্ট্যপূৰ্ণ স্থানসমূহৰ অংশ দেখুওৱা হৈছে + ফিড ফ্লাইআউট মেনু ফিল্টাৰ সক্ৰিয় কৰক + ফিড ফ্লাইআউট মেনু ফিল্টাৰ সক্ৰিয় কৰা হৈছে + ফিড ফ্লাইআউট মেনু ফিল্টাৰ নিষ্ক্ৰিয় কৰা হৈছে + ফিড ফ্লাইআউট মেনু ফিল্টাৰ + ফিল্টাৰ কৰিবলৈ ফ্লাইআউট মেনুৰ নামসমূহ প্ৰতি শাৰীত এটা লিখক + গেমিং লুকুৱাওক + গেমিং অংশ লুকাই আছে + গেমিং অংশ দেখুওৱা হৈছে + সংগীত লুকুৱাওক + সংগীত অংশ লুকাই আছে + সংগীত অংশ দেখুওৱা হৈছে + কুইজসমূহ লুকুৱাওক + কুইজসমূহৰ অংশ লুকাই আছে + কুইজসমূহৰ অংশ দেখুওৱা হৈছে + চেনেল টে\'ব ফিল্টাৰ সক্ৰিয় কৰক + চেনেল টে\'ব ফিল্টাৰ সক্ৰিয় কৰা হৈছে + চেনেল টে\'ব ফিল্টাৰ নিষ্ক্ৰিয় কৰা হৈছে + চেনেল টে\'ব ফিল্টাৰ + ফিল্টাৰ কৰিবলৈ চেনেল টে\'বৰ নামসমূহ প্ৰতি শাৰীত এটা লিখক + "সীমাবদ্ধতাসমূহ: +• Shorts শ্বে'ল্ফ, চেনেল পৃষ্ঠা, আৰু সন্ধানৰ ফলাফলসমূহত ভিউ গণনা দেখুওৱা হ'ব পাৰে। +• এই বৈশিষ্ট্যটো অটোমোটিভ ফৰ্ম ফেক্টৰৰ সৈতে কাম নকৰে।" + "সীমাবদ্ধতাসমূহ: +• Shorts শ্বে'ল্ফ, চেনেল পৃষ্ঠা, আৰু সন্ধানৰ ফলাফলসমূহত আপলোডৰ সময় দেখুওৱা হ'ব পাৰে। +• এই বৈশিষ্ট্যটো অটোমোটিভ ফৰ্ম ফেক্টৰৰ সৈতে কাম নকৰে।" + "হোম/চাবস্ক্ৰিপচন/সন্ধানৰ ফলাফলসমূহ কীৱৰ্ড বাক্যাংশৰ সৈতে মিল থকা বিষয়বস্তু লুকুৱাবলৈ ফিল্টাৰ কৰা হৈছে + +সীমাবদ্ধতাসমূহ: +• চেনেলৰ নামৰ দ্বাৰা Shorts লুকুৱাব নোৱাৰি +• কিছুমান UI উপাদান লুকুৱাব নোৱাৰি +• এটা কীৱৰ্ড সন্ধান কৰিলে কোনো ফলাফল দেখুওৱা নহ'ব পাৰে" - + পূৰ্ণ পৰ্দাৰ বিজ্ঞাপনসমূহ লুকাই আছে + প্লেয়াৰ পপআপ বিজ্ঞাপনসমূহ লুকুৱাওক + প্লেয়াৰ পপআপ বিজ্ঞাপনসমূহ লুকাই আছে + প্লেয়াৰ পপআপ বিজ্ঞাপনসমূহ দেখুওৱা হৈছে + প্লেয়াৰ অভাৰলে\'ত পণ্যসমূহৰ বেনাৰ লুকাই আছে + প্লেয়াৰ অভাৰলে\'ত পণ্যসমূহৰ বেনাৰ দেখুওৱা হৈছে + YouTube Premium প্ৰচাৰসমূহ লুকুৱাওক + YouTube Premium প্ৰচাৰসমূহ লুকাই আছে + YouTube Premium প্ৰচাৰসমূহ দেখুওৱা হৈছে - - + + URL ক্লিপব\'ৰ্ডলৈ কপি কৰা হৈছে + টাইমষ্টাম্পৰ সৈতে URL কপি কৰা হৈছে + ভিডিঅ\' URL কপি বুটাম দেখুৱাওক + ভিডিঅ\' URL কপি বুটাম দেখুওৱা হৈছে। ভিডিঅ\' URL কপি কৰিবলৈ টেপ কৰক। টাইমষ্টাম্পৰ সৈতে কপি কৰিবলৈ টেপ কৰি ধৰি ৰাখক + ভিডিঅ\' URL কপি বুটাম দেখুওৱা হোৱা নাই + টাইমষ্টাম্প URL কপি বুটাম দেখুৱাওক + টাইমষ্টাম্প URL কপি বুটাম দেখুওৱা হৈছে। টাইমষ্টাম্পৰ সৈতে ভিডিঅ\' URL কপি কৰিবলৈ টেপ কৰক। টাইমষ্টাম্প অবিহনে কপি কৰিবলৈ টেপ কৰি ধৰি ৰাখক + টাইমষ্টাম্প URL কপি বুটাম দেখুওৱা হোৱা নাই + - + + \'টিভিলেগিন কৰক\' পপআপ নিষ্ক্ৰিয় কৰক + টিভিলেগিন কৰক পপআপ নিষ্ক্ৰিয় কৰা হৈছে + টিভিলেগিন কৰক পপআপ সক্ৰিয় কৰা হৈছে + - + + সন্ধান কৰিবলৈ টেপ সক্ৰিয় কৰক + সন্ধান কৰিবলৈ টেপ সক্ৰিয় কৰা হৈছে + সন্ধান কৰিবলৈ টেপ নিষ্ক্ৰিয় কৰা হৈছে + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + কিছুমান ব্যৱহাৰকাৰী একাউন্টৰ বাবে লুকুৱাটোৱে কাম নকৰিব পাৰে। - + + নেভিগেচন বুটামসমূহ + নেভিগেচন বাৰৰ বুটামসমূহ লুকুৱাওক বা সলনি কৰক + হোম লুকুৱাওক + হোম বুটাম লুকাই আছে + হোম বুটাম দেখুওৱা হৈছে + Shorts লুকুৱাওক + Shorts বুটাম লুকাই আছে + Shorts বুটাম দেখুওৱা হৈছে + সৃষ্টি কৰক লুকুৱাওক + সৃষ্টি বুটাম লুকাই আছে + সৃষ্টি বুটাম দেখুওৱা হৈছে + চাবস্ক্ৰিপচনসমূহ লুকুৱাওক + চাবস্ক্ৰিপচনসমূহ বুটাম লুকাই আছে + চাবস্ক্ৰিপচনসমূহ বুটাম দেখুওৱা হৈছে + অধিসূচনাসমূহ লুকুৱাওক + অধিসূচনাসমূহ বুটাম লুকাই আছে + অধিসূচনাসমূহ বুটাম দেখুওৱা হৈছে + অধিসূচনাসমূহৰ সৈতে সৃষ্টি সলনি কৰক + সৃষ্টি বুটাম অধিসূচনাসমূহ বুটামৰ সৈতে সলনি কৰা হৈছে + সৃষ্টি বুটাম অধিসূচনাসমূহ বুটামৰ সৈতে সলনি কৰা হোৱা নাই + যদি এই ছেটিং সলনি কৰিলে প্ৰযোজ্য নহয়, তেন্তে ইনকগনিটো ম\'ডলৈ সলনি কৰিবলৈ চেষ্টা কৰক। + নেভিগেচন বুটামৰ লেবেলসমূহ লুকুৱাওক + লেবেলসমূহ লুকাই আছে + লেবেলসমূহ দেখুওৱা হৈছে + ঠেক নেভিগেচন বুটামসমূহ সক্ৰিয় কৰক + নেভিগেচন বুটামসমূহৰ মাজৰ ব্যৱধান ঠেক হৈছে + নেভিগেচন বুটামসমূহৰ মাজৰ ব্যৱধান স্বাভাৱিক হৈছে + নেভিগেচন বাৰ এনিমেচনসমূহ সক্ৰিয় কৰক + নেভিগেচন ট্ৰানজিচনসমূহ এনিমেটেড হৈছে + নেভিগেচন ট্ৰানজিচনসমূহ এনিমেটেড হোৱা নাই + ট্ৰেন্সলুচেণ্ট ষ্টেটাচ বাৰ নিষ্ক্ৰিয় কৰক + ষ্টেটাচ বাৰ অপাক হৈছে + ষ্টেটাচ বাৰ অপাক বা ট্ৰেন্সলুচেণ্ট হৈছে + "সীমাবদ্ধতাসমূহ: +• ভিডিঅ' প্লেয়াৰৰ ওপৰত এটা ক'লা বাৰ দেখা যাব পাৰে। +• কিছুমান ডিভাইচত, এই বৈশিষ্ট্য সক্ৰিয় কৰিলে চিষ্টেম নেভিগেচন বাৰ ট্ৰেন্সপেৰেন্টলৈ সলনি হ'ব পাৰে।" + লাইট ট্ৰেন্সলুচেণ্ট বাৰ নিষ্ক্ৰিয় কৰক + লাইট ম\'ড নেভিগেচন বাৰ অপাক হৈছে + লাইট ম\'ড নেভিগেচন বাৰ অপাক বা ট্ৰেন্সলুচেণ্ট হৈছে + ডাৰ্ক ট্ৰেন্সলুচেণ্ট বাৰ নিষ্ক্ৰিয় কৰক + ডাৰ্ক ম\'ড নেভিগেচন বাৰ অপাক হৈছে + ডাৰ্ক ম\'ড নেভিগেচন বাৰ অপাক বা ট্ৰেন্সলুচেণ্ট হৈছে + টুলবাৰ + টুলবাৰৰ উপাদানসমূহ লুকুৱাওক বা সলনি কৰক + সৃষ্টি বুটাম লুকুৱাওক + সৃষ্টি বুটাম লুকাই আছে + সৃষ্টি বুটাম দেখুওৱা হৈছে + অধিসূচনাসমূহ বুটাম লুকুৱাওক + অধিসূচনাসমূহ বুটাম লুকাই আছে + অধিসূচনাসমূহ বুটাম দেখুওৱা হৈছে + সন্ধান বুটাম লুকুৱাওক + সন্ধান বুটাম লুকাই আছে + সন্ধান বুটাম দেখুওৱা হৈছে। + বহল অনুসন্ধান বাৰ সক্ষম কৰক + বহল অনুসন্ধান বাৰ সক্ৰিয় কৰা হৈছে + বহল অনুসন্ধান বাৰ নিষ্ক্ৰিয় কৰা হৈছে @@ -126,25 +315,67 @@ Second \"item\" text" + সংকুচিত কৰক বুটাম লুকুৱাওক + সংকুচিত কৰক বুটাম লুকাই আছে + সংকুচিত কৰক বুটাম দেখুওৱা হৈছে + পূৰ্ণ পৰ্দা বুটাম লুকুৱাওক + পূৰ্ণ পৰ্দা বুটাম লুকাই আছে + পূৰ্ণ পৰ্দা বুটাম দেখুওৱা হৈছে + + + শেষ পৰ্দাৰ কাৰ্ডসমূহ লুকুৱাওক + শেষ পৰ্দাৰ কাৰ্ডসমূহ লুকাই আছে + শেষ পৰ্দাৰ কাৰ্ডসমূহ দেখুওৱা হৈছে - + পূৰ্ণ পৰ্দাৰ ডাঙৰ ছিকবাৰ সক্ৰিয় কৰক + পূৰ্ণ পৰ্দাৰ ছিকবাৰ ডাঙৰ আকাৰৰ হৈছে + পূৰ্ণ পৰ্দাৰ ছিকবাৰ স্বাভাৱিক আকাৰৰ হৈছে + চেনেল পৃষ্ঠাত Shorts লুকুৱাওক + চেনেল পৃষ্ঠাত লুকাই আছে + চেনেল পৃষ্ঠাত দেখুওৱা হৈছে + ভিডিঅ\' বৰ্ণনাত Shorts লুকুৱাওক + ভিডিঅ\' বৰ্ণনাত লুকাই আছে + ভিডিঅ\' বৰ্ণনাত দেখুওৱা হৈছে + AI বুটাম লুকুৱাওক + AI বুটাম লুকাই আছে + AI বুটাম দেখুওৱা হৈছে + \'স্বয়ংক্ৰিয়-ডাব কৰা\' লেবেল লুকুৱাওক + স্বয়ংক্ৰিয়-ডাব কৰা লেবেল লুকাই আছে + স্বয়ংক্ৰিয়-ডাব কৰা লেবেল দেখুওৱা হৈছে + - + + স্বয়ংক্ৰিয় প্লে\'ৰ পূৰ্বদৃশ্য লুকুৱাওক + স্বয়ংক্ৰিয় প্লে\'ৰ পূৰ্বদৃশ্য লুকাই আছে + স্বয়ংক্ৰিয় প্লে\'ৰ পূৰ্বদৃশ্য দেখুওৱা হৈছে + + + শেষ পৰ্দাৰ প্ৰস্তাৱিত ভিডিঅ\' লুকুৱাওক + "স্বয়ংক্ৰিয় প্লে' বন্ধ কৰিলে শেষ পৰ্দাৰ প্ৰস্তাৱিত ভিডিঅ' লুকাই থাকে + +YouTube ছেটিংছত স্বয়ংক্ৰিয় প্লে' সলনি কৰিব পাৰি: +ছেটিংছ → প্লেবেক → পৰৱৰ্তী ভিডিঅ' স্বয়ংক্ৰিয় প্লে'" + শেষ পৰ্দাৰ প্ৰস্তাৱিত ভিডিঅ\' দেখুওৱা হৈছে + - + + প্লেয়াৰ পপআপ পেনেলসমূহ লুকুৱাওক + প্লেয়াৰ পপআপ পেনেলসমূহ লুকাই আছে + প্লেয়াৰ পপআপ পেনেলসমূহ দেখুওৱা হৈছে + @@ -155,10 +386,12 @@ Second \"item\" text" - - + কেৱল সংগীত ভিডিঅ\'ত ব্যৱহাৰৰ বাবে। সংগীত অবিহনে সংগীত ভিডিঅ\'ৰ অংশসমূহ, যিবোৰ ইতিমধ্যে অন্য এটা শ্ৰেণীৰ দ্বাৰা আৱৰা নাই + অংশ জমা দিব নোৱাৰি: %s + "অংশ জমা দিব নোৱাৰি। +ইতিমধ্যে আছে" @@ -170,7 +403,11 @@ Second \"item\" text" - + + নিষ্ক্ৰিয় কৰা হৈছে + ৰং + ক\'লা আৰু বগা + @@ -189,7 +426,11 @@ Second \"item\" text" - + + টেপ আৰু হোল্ড হেপটিক্স নিষ্ক্ৰিয় কৰক + টেপ আৰু হোল্ড হেপটিক্স নিষ্ক্ৰিয় কৰা হৈছে + টেপ আৰু হোল্ড হেপটিক্স সক্ৰিয় কৰা হৈছে + @@ -202,6 +443,11 @@ Second \"item\" text" + + প্ৰিমিয়াম গুণগত মানৰ বিকল্পসমূহ লুকুৱাওক + প্ৰিমিয়াম গুণগত মানৰ বিকল্পসমূহ লুকাই আছে + প্ৰিমিয়াম গুণগত মানৰ বিকল্পসমূহ দেখুওৱা হৈছে + @@ -209,7 +455,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 7726105f33..4905f6c41e 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Tənzimləmə axtarış tarixçəsin göstər Tənzimləmə axtarış tarixçəsi göstərilir Tənzimləmə axtarış tarixçəsi görünmür + Qalın nişanları qapat + Nişanlar qalın deyil + Nişanlar qalındır ReVanced tənzimləmə nişanların göstər Tənzimləmə nişanları göstərilir Tənzimləmə nişanları göstərilmir @@ -99,23 +102,31 @@ Yeni dilləri tərcümə etmək və ya mövcud tərcümələri təkmilləşdirm and changes made here must also be made there. --> - GmsCore Tənzimləmələri - GmsCore üçün Tənzimləmələr + GmsCore + GmsCore ilə əlaqədar tənzimləmələr + GmsCore yeniləmələrini yoxla + Yeniləmələrin yoxlanılması aktivdir + Yeniləmələrin yoxlanılması deaktiv edilib + GmsCore Tənzimləmələrini Aç + GmsCore Tənzimləmələri - MicroG GmsCore quraşdırılmayıb. Bunu quraşdır. - Fəaliyyət lazımdır - "MicroG GmsCore-un arxa planda işləməsi üçün icazəsi yoxdur. + MicroG GmsCore quraşdırılmayıb. Bunu quraşdır. + Fəaliyyət lazımdır + MicroG GmsCore yeniləmələrini yoxlamaq uğursuz oldu + MicroG GmsCore-un yeni versiyası (%1$s) mövcuddur. Hal-hazırda siz %2$s versiyasından istifadə edirsiniz. + "MicroG GmsCore-un arxa planda işləməsi üçün icazəsi yoxdur. Telefonunuz üçün \"Tətbiqimi dayandırma\" bələdçisinə əməl edin və təlimatları MicroG quraşdırmanıza tətbiq edin. Bu, tətbiqin işləməsi üçün tələb olunur." - Veb saytı aç - "Problemlərin olmaması üçün MicroG GmsCore batareya optimallaşması qapadılmalıdır. + Veb saytı aç + Ləğv et + "Problemlərin olmaması üçün MicroG GmsCore batareya optimallaşması qapadılmalıdır. MicroG üçün batareya optimallaşmasın qapatma batareya istifadəsinə mənfi təsir etməyəcək. Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et." - Davam et + Davam et Video yayımların saxtalaşdır @@ -169,10 +180,11 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız." Nişançılar saxlandı Nişançılar sıfırlandı Nişançılar buferə köçürüldü - Bufer protokol jurnalı - Sazlama jurnallarına protokol buferi daxildir - Sazlama jurnallarına protokol buferi daxil deyil - "Bu seçimi aktivləşdirmə bəzi UI quruluşları üçün ekran mətni də olmaqla əlavə tərtibat bazasını daxil edəcək. + Bu xüsusiyyətdən istifadə etmək üçün tətbiqi yenidən başladın + Bufer protokol jurnalı + Sazlama jurnallarına protokol buferi daxildir + Sazlama jurnallarına protokol buferi daxil deyil + "Bu seçimi aktivləşdirmə bəzi UI quruluşları üçün ekran mətni də olmaqla əlavə tərtibat bazasını daxil edəcək. Bu, xüsusi filtrlər yaradarkən quruluşları müəyyən etməyə kömək edə bilər. @@ -219,6 +231,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Shorts arxa plan oynatma aktivdir + Yaradıcı mağaza bölümün gizlət + Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir + Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür Albom kartlarını gizlət Albom kartları gizlidir Albom kartları göstərilir @@ -228,6 +243,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Çip bölməsin gizlət Çip bölməsi gizlidir Çip bölməsi göstərilir + Ev axınındakı videoların altındakı şərhlər bölməsini gizlət + Ev axınındakı videoların altındakı şərhlər bölməsi gizlidir + Ev axınındakı videoların altındakı şərhlər bölməsi göstərilir İcma elanların gizlət İcma elanları gizlədilib İcma elanları göstərilir @@ -255,14 +273,19 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Son elanları gizlət Ən son elanlar gizlədilib Ən son elanlar göstərilir + + \'Ən son videolar\' düyməsini gizlət + Ən son videolar düyməsi gizlidir + Ən son videolar düyməsi göstərilir Qarışıq pleylistləri gizlət Qarışıq oynatma siyahıları gizlədilir Qarışıq oynatma siyahıları göstərilir Filmlər bölməsini gizlət Filmlər bölməsi gizlidir Filmlər bölməsi göstərilir - + \"Mənə bildir\" düyməsini gizlət Mənə bildir düyməsi gizlidir Mənə bildir düyməsi görünür @@ -287,13 +310,16 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Vizual ayırıcı gizlət Vizual ayırıcı gizlənib Vizual ayırıcı göstərilib + Veb axtarış nəticələrini gizlət + Veb axtarış nəticələri gizlədilir + Veb axtarış nəticələri göstərilir + \'Bəyənə bilərsiniz\' bölməsini gizlət + \'Bəyənə bilərsiniz\' bölməsi gizlidir + \'Bəyənə bilərsiniz\' bölməsi göstərilir YouTube Doodle-ları gizlət YouTube Doodles animasiyası simvolda gizlidir YouTube Doodles animasiyası simvolda görünür - "YouTube Doodle-ları hər il bir neçə gün görünür. - -Əgər hazırda bölgənizdə Doodle göstərilirsə və bu gizlətmə seçimi aktivdirsə, axtarış cizgisi aşağısındakı filtr sahəsi də gizlədiləcək." Kanal çubuğunu gizlət Kanal çubuğu gizlidir Kanal çubuğu göstərilir @@ -310,10 +336,15 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Məlumat lövhələri gizlidir Məlumat lövhələri göstərilir + This button usually appears in the video player for certain videos. --> Qoşul düyməsin gizlət Qoşul düyməsi gizlidir Qoşul düyməsi görünür + + \'Canlı çat təkrarı\' düyməsini gizlət + Oynadıcı qatmanıdakı canlı çat təkrarı düyməsi gizlidir + Oynadıcı qatmanıdakı canlı çat təkrarı düyməsi göstərilir Tibbi lövhələri gizlət Tibbi lövhələr gizlidir Tibbi lövhələr göstərilir @@ -329,6 +360,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Vaxtlı reaksiyaları gizlət Zamanlanmış reaksiyalar gizlədilir Zamanlanmış reaksiyalar göstərilir + Video başlığını gizlət + Oynadıcı qatmanıdakı video başlığı gizlidir + Oynadıcı qatmanıdakı video başlığı göstərilir \"AI ilə yaradılan video xülasəsini\" gizlət Sİ ilə yaradılan video xülasə bölməsi gizlədilib Sİ ilə yaradılan video xülasə bölməsi görünür @@ -341,33 +375,62 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Fəsilləri Gizlət Bölümlər bölməsi gizlidir Bölümlər bölməsi göstərilir - \'Bu kontent necə hazırlanıb\'ı Gizlət - Bu məzmunun necə hazırlandığı bölməsi gizlidir - Bu məzmunun necə hazırlandığı bölməsi görünür - Coşqu xalların gizlət - Coşqu xalları gizlədilib - Coşqu xalları göstərilir + \'Kurs irəliləyişi\'ni gizlət + Kurs irəliləyişi bölməsi gizlidir + Kurs irəliləyişi bölməsi göstərilir + Kəşf edin-i gizlət + Bu kursu araşdırın və Podkastı araşdırın bölmələri gizlidir + Bu kursu araşdırın və Podkastı araşdırın bölmələri göstərilir + \'Bu kursu araşdırın\'-ı gizlət + Bu kursu araşdırın bölməsi gizlidir + Bu kursu araşdırın bölməsi göstərilir + \'Podkastı araşdırın\"-ı Gizlət + Podkast bölməsin araşdırın gizlidir + Podkast bölməsin araşdırın görünür \'Podkastı araşdırın\"-ı Gizlət Podkast bölməsin araşdırın gizlidir Podkast bölməsin araşdırın görünür Seçilən keçidləri gizlət Seçilən keçidlər bölməsi gizlidir Seçilən keçidlər bölməsi göstərilir + \'Seçilmiş yerlər\'-i gizlət + Seçilmiş yerlər bölməsi gizlidir + Seçilmiş yerlər bölməsi göstərilir Seçilən videoları gizlət Seçilən videolar bölməsi gizlidir Seçilən videolar bölməsi göstərilir + Axın açılan menyu filtrini aktivləşdir + Axın açılan menyu filtri aktivdir + Axın açılan menyu filtri qeyri-aktivdir + Axın açılan menyu filtri + Filtr etmək üçün açılan menyu adlarını hər sətirdə birini daxil edin + Oyun-u gizlət + Oyun bölməsi gizlidir + Oyun bölməsi göstərilir + \'Bu kontent necə hazırlanıb\'ı Gizlət + Bu məzmunun necə hazırlandığı bölməsi gizlidir + Bu məzmunun necə hazırlandığı bölməsi görünür + Coşqu xalların gizlət + Coşqu xalları gizlədilib + Coşqu xalları göstərilir Məlumat Kartlarını Gizlət Məlumat kartları bölməsi gizlədilir Məlumat kartları bölməsi göstərilir \"Əsas konseptlər-i\" gizlət Əsas konseptlər bölməsi gizlidir Əsas konseptlər bölməsi görünür + Musiqi-ni gizlət + Musiqi bölməsi gizlidir + Musiqi bölməsi göstərilir Abunə ol düyməsini gizlət Abunə ol düyməsi gizlidir Abunə ol düyməsi görünür Transkript-i Gizlət Transkripsiya bölməsi gizlidir Transkripsiya bölməsi göstərilir + Viktorinaları gizlət + Viktorinalar bölməsi gizlidir + Viktorinalar bölməsi göstərilir Video təsviri Video təsviri elementlərini gizlət və ya göstər Filtr çubuğu @@ -386,6 +449,11 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Baxış tarixçəsində görünür Kanal səhifəsi Kanal səhifə elementlərini gizlət və ya göstər + Kanal nişanı filtrini aktivləşdir + Kanal nişanı filtri aktivdir + Kanal nişanı filtri qeyri-aktivdir + Kanal nişanı filtri + Filtr etmək üçün kanal nişanı adlarını hər sətirdə birini daxil edin İcma düyməsini gizlət İcmaya düyməsi gizlidir @@ -449,15 +517,15 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Baxış sayı axın və axtarış nəticələrində görünür "Məhdudiyyətlər: -• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yenə də baxış sayını göstərə bilər -• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yenə də baxış sayını göstərə bilər. +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir." Yüklənilmə vaxtını gizlət Yüklənilmə vaxtı axın və axtarış nəticələrində gizlidir Yüklənilmə vaxtı axın və axtarış nəticələrində göstərilir "Məhdudiyyətlər: -• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yüklənilən vaxtı yenə də göstərə bilər -• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yüklənilən vaxtı yenə də göstərə bilər. +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir." Açar söz məzmununu gizlət Açar söz filtrləri ilə axtarış və axın videolarını gizlət Ev videolarını açar sözlərə görə gizlət @@ -480,8 +548,8 @@ Ortada böyük hərflli sözlər belə yerləşdirilməlidir (yəni: iPhone, Tik Açar söz filtrləməsi haqqında "Ev/Abunəlik/Axtarış nəticələri açar söz ifadələrinə uyğun olan məzmunu gizlətmək üçün çeşidlənir -Məhdudiyyətlər -• Shorts-lar kanal adı ilə gizlənə bilməz +Məhdudiyyətlər: +• Shorts kanal adı ilə gizlənə bilməz • Bəzi UI hissəcikləri gizlənə bilməz • Açar söz axtarma nəticə verməyə bilər" Bütün sözləri uyğunlaşdır @@ -495,19 +563,12 @@ Məhdudiyyətlər Açar söz, bütün videoları gizlədəcək: %s - Yaradıcı mağaza bölümün gizlət - Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir - Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür Son ekran mağaza afişasın gizlət Son ekran mağaza afişası gizlidir Son ekran mağaza afişası görünür Tam ekran reklamlarını gizlət - "Tam ekran reklamları gizlidir - -Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" + Tam ekran reklamları gizlədilir Tam ekran reklamları göstərilir - - Tam ekran reklamları gizlətmə yalnız köhnə cihazlarda işləyir Ümumi reklamları gizlət Ümumi reklamlar gizlidir Ümumi reklamlar göstərilir @@ -517,6 +578,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Ödənişli tanıtım etiketini gizlət Ödənişli reklam etiketi gizlədilib Ödənişli reklam etiketi göstərilir + Oynadıcı açılan reklamları gizlət + Oynadıcı açılan reklamlar gizlidir + Oynadıcı açılan reklamlar göstərilir Öz-sponsorlu kartları gizlət Özünə sponsorluq edilən kartlar gizlidir Özünə sponsorluq edilən kartlar göstərilir @@ -524,23 +588,18 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Alış-veriş linkləri video təsvirdə gizlidir Alış-veriş linkləri video təsvirdə görünür “Məhsullara baxın” afişasın gizlət - Məhsullara baxış etiketi video örtüyündə gizlidir - Məhsullara baxış etiketi video örtüyündə görünür - Veb axtarış nəticələrini gizlət - Veb axtarış nəticələri gizlədilir - Veb axtarış nəticələri göstərilir - - - YouTube Premium reklamlarını gizlət - Video oynadıcı altında YouTube Premium elanları gizlidir - Video oynadıcı altındakı YouTube Premium elanları göstərilir + Oynadıcı qatmanıdakı məhsullara baxış banneri gizlidir + Oynadıcı qatmanıdakı məhsullara baxış banneri göstərilir + YouTube Premium reklamlarını gizlət + YouTube Premium elanları gizlidir + YouTube Premium elanları göstərilir Video reklamlarını gizlət Video reklamlar gizlədilir Video reklamlar göstərilir - + URL buferə köçürüldü Vaxt möhürlü URL köçürüldü Video URL-i köçürmə düyməsin göstər @@ -556,10 +615,10 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Dialoq göstərilir Bu, yaş məhdudiyyətini ötürmür. Sadəcə birbaşa qəbul edir. - - TV ani görüntüsü girişin qapat - TV ani görüntüyə giriş qapadılıb - TV ani görüntüyə giriş işləkdir + + TV ani görüntüsü girişin qapat + TV ani görüntüyə giriş qapadılıb + TV ani görüntüyə giriş işləkdir Cüt toxunuşla fəsil ötürməsini qapat @@ -592,10 +651,10 @@ Paket adının düzgün olduğun yoxla və tətbiqi quraşdırın" Jest qeyri-aktiv edilib Jest aktivləşdirilib - - Axtarmaq üçün toxun\'u aktivləşdir - Axtarmaq üçün toxun, aktivdir - Axtarmaq üçün toxun qapalıdır + + Axtarmaq üçün toxun\'u aktivləşdir + Axtarmaq üçün toxun, aktivdir + Axtarmaq üçün toxun qapalıdır Parlaqlıq jestini aktivləşdir @@ -676,7 +735,7 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Şərhlər düyməsi gizlidir Şərhlər düyməsi görünür + This button usually appears on live streamed videos. --> \"Xəbər verin\"i gizlət Xəbər ver/düyməsi gizlidir Xəbər ver/düyməsi göstərilir @@ -689,7 +748,7 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Yükləmə düyməsi gizlidir Yükləmə düyməsi göstərilir + This button usually appears on videos uploaded by the logged-in user. --> Coşqu Gizlət Coşqu düyməsi gizlidir Coşqu düyməsi görünür @@ -702,7 +761,7 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Təşəkkür düyməsi gizlidir Təşəkkür düyməsi göstərilir + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Soruş\'u Gizlət Soruş düyməsi gizlidir \"Soruş\" düyməsi göstərilir @@ -710,6 +769,7 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Kəsmə/ gizlət Kəsmə düyməsi gizlidir Kəsmə düyməsi göstərilir + Gizlətmə bəzi istifadəçi hesabları üçün işləməyə bilər. Mağazanı Gizlət Mağaza düyməsi gizlidir @@ -719,7 +779,7 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Saxlayın düyməsi gizlidir Saxlayın düyməsi görünür - + Fəaliyyət düymələri Fəaliyyət cərgəsindəki düymələri gizlət və ya dəyiş @@ -743,26 +803,44 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Bildirişlər düyməsi görünür \"Yarat\"ı \"Bildirişlər\" ilə dəyişdir - "Yarat düyməsi Bildirişlər düyməsi ilə dəyişdirilir - -Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir" + Yarat düyməsi Bildirişlər düyməsi ilə əvəz edilib \"Yarat\" düyməsi, \"Bildirişlər\" düyməsi ilə əvəzlənmir - "Bu seçimin qapanması Shorts reklam əngəllənməsin də qapadacaq. - -Bu seçimi dəyişdirmə işə düşmürsə, Gizli rejimə keçməyə çalışın." + Bu ayarı dəyişdirmək təsir etmirsə, Gizli rejimə keçməyə cəhd edin. Fəaliyyət düymə etiketlərini gizlət Etiketlər gizlidir Etiketlər göstərilir + Dar fəaliyyət düymələrini aktivləşdir + Fəaliyyət düymələri arasındakı aralıq dardır + Fəaliyyət düymələri arasındakı aralıq normaldır + Fəaliyyət cərgəsi animasiyalarını aktivləşdir + Naviqasiya keçidləri animasiyalıdır + Naviqasiya keçidləri animasiyalı deyil Yarımşəffaf mövqe cizgisin qapat Mövqe cizgisi qeyri-şəffafdır Mövqe cizgisi qeyri-şəffaf və ya şəffafdır - Bəzi cihazlarda bu xüsusiyyət aktivləşməsi sistem fəaliyyət cərgəsini şəffaf-a dəyişə bilər. + "Məhdudiyyətlər: +• Video oynadıcının yuxarısında qara bir zolaq görünə bilər. +• Bəzi cihazlarda, bu funksiyanı aktivləşdirmək sistem naviqasiya zolağını şəffaf edə bilər." Açıq temada şəffaf cizgini qapat İşıqlı rejim fəaliyyət cərgəsi qeyri-şəffafdır İşıqlı rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdır Qaranlıq rejimdə şəffaf cərgəni qapat Qaranlıq rejimdə fəaliyyət cərgəsi qeyri-şəffafdır Qaranlıq rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdır + Alətlər paneli + Alətlər paneli komponentlərini gizlət və ya dəyiş + Yarat düyməsini gizlət + Yarat düyməsi gizlidir + Yarat düyməsi göstərilir + Bildirişlər düyməsini gizlət + Bildirişlər düyməsi gizlidir + Bildirişlər düyməsi göstərilir + Axtarış düyməsini gizlət + Axtarış düyməsi gizlidir + Axtarış düyməsi görünür. + Geniş axtarış cizgisin aktivləşdir + Geniş axtarış cizgisi aktivdir + Geniş axtarış cizgisi qeyri-aktivdir Açılan menyu @@ -837,6 +915,12 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Yayımla düyməsini gizlət Yayım düyməsi gizlidir Yayım düyməsi göstərilir + Yığışdır düyməsini gizlət + Yığışdır düyməsi gizlidir + Yığışdır düyməsi göstərilir + Tam ekran düyməsini gizlət + Tam ekran düyməsi gizlidir + Tam ekran düyməsi göstərilir Oynadıcı idarəetmələri fonunu gizlət Oynadıcı idarəetmə fonu gizlədilib Oynadıcı idarəetmə fonu görünür @@ -845,9 +929,9 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Düymələr göstərilir - Son ekran kartlarını gizlət - Son ekran kartları gizlidir - Son ekran kartları göstərilir + Son ekran kartlarını gizlət + Son ekran kartları gizlidir + Son ekran kartları göstərilir Tam ekranda Ambient rejimini qapat @@ -872,10 +956,16 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Video miniatür irəliləyiş cizgisin gizlət Video miniatür irəliləyiş cizgisi gizlidir Video miniatür irəliləyiş cizgisi görünür + Tam ekran böyük irəliləyiş çubuğunu aktivləşdir + Tam ekran irəliləyiş çubuğu böyük ölçüdədir + Tam ekran irəliləyiş çubuğu normal ölçüdədir Shorts oynadıcı Shorts oynadıcı elementlərini gizlət və ya göstər + Shorts-u kanal səhifəsində gizlət + Kanal səhifəsində gizlidir + Kanal səhifəsində göstərilir Shorts-u Ev axınında gizlət Ev axını və əlaqəli videolarda gizlidir @@ -887,9 +977,18 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Shorts-u Abunəliklər axınında gizlət Abunəliklər axınında gizlidir Abunəliklər axınında görünür + Shorts-u video təsvirində gizlət + Video təsvirində gizlidir + Video təsvirində göstərilir Baxış tarixçəsində Shorts-u gizlət Baxış tarixçəsində gizlidir Baxış tarixçəsində göstərilib + Süni intellekt düyməsini gizlət + Süni intellekt düyməsi gizlidir + Süni intellekt düyməsi göstərilir + \'Avtomatik dublyaj olunmuş\' etiketini gizlət + Avto-dublyaj etiketi gizlidir + Avto-dublyaj etiketi göstərilir \'Avtomatik dublyaj olunmuş\' etiketini gizlət Avto-dublyaj etiketi gizlidir Avto-dublyaj etiketi göstərilir @@ -951,6 +1050,7 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Bu şablonu işlət düyməsini gizlət Bu şablonu işlət düyməsi gizlidir Bu şablonu işlət düyməsi görünür + Bəyənmə düyməsi fontan animasiyasın gizlət \"Bəyən\" fontan animasiyası gizlidir \"Bəyən\" fontan animasiyası göstərilir @@ -993,11 +1093,17 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"-ı Fəaliyyət çubuğu gizlidir Fəaliyyət çubuğu göstərilir - + + Avtomatik oynatma önizləməsini gizlət + Avtomatik oynatma önizləməsi gizlidir + Avtomatik oynatma önizləməsi göstərilir + + Son ekran bildirilən videonu gizlət "Avtomatik oynatma qapadılanda son ekran bildirilən video gizlədilir -Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunuş → Növbəti videonu avtomatik oxudun" +Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: +Ayarlar → Oxunuş → Növbəti videonu avtomatik oxudun" Son ekranda bildirilən video göstərilir @@ -1011,9 +1117,9 @@ Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunu Vaxt möhürü göstərilir - Oynadıcı açılan pəncərə panellərin gizlə - Oynadıcı açılan pəncərə panelləri gizlidir - Oynadıcı açılan pəncərə panelləri göstərilir + Oynadıcı açılan pəncərə panellərin gizlə + Oynadıcı açılan pəncərə panelləri gizlidir + Oynadıcı açılan pəncərə panelləri göstərilir Video sonunda tam ekran rejimindən çıx @@ -1081,24 +1187,6 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər" Qəbuledici sürət limiti %d dəfə baş verdi %d millisaniyə - - Geniş axtarış cizgisin aktivləşdir - Geniş axtarış cizgisi aktivdir - Geniş axtarış cizgisi qeyri-aktivdir - - - Yüksək keyfiyyətli miniatürləri aktivləşdir - İrəliləyiş cizgisi miniatürləri yüksək keyfiyyətlidir - İrəliləyiş cizgisi miniatürləri orta keyfiyyətlidir - "Bu, həmçinin irəliləyiş cizgisi miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək. - -İrəliləyiş cizgisi miniatürləri cari video kimi eyni keyfiyyəti işlədəcək. - -Bu funksiya 720p və ya daha aşağı video keyfiyyəti ilə və çox sürətli internet bağlantısı işlədərkən yaxşı işləyir." - Köhnə irəliləmə cizgi miniatürün al - Axtarış cizgisi miniatürləri axtarış çubuğu üstündə görünəcək - Axtarış cizgisi miniatürləri tam ekranda görünəcək - \"SponsorBlock\"u aktivləşdir SponsorBlock YouTube videolarının cansıxıcı hissələrini ötürmək üçün toplu sistemdir @@ -1337,8 +1425,6 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların Saxta tətbiq versiyası hədəfi 20.13.41 - Yığılmayan video fəaliyyət cizgisin bərpa et 20.05.46 - Transkript xüsusiyyətin bərpa et - 19.35.36 - Köhnə Shorts oynadıcı işarələrin bərpa et - 19.01.34 - Köhnə fəaliyyət simvolların bərpa et Başlatma səhifəsini dəyişdir @@ -1443,8 +1529,9 @@ Kiçik oynadıcı ekrandan sola və ya sağa sürüklənə bilər" Yükləmə ekranı, dəyişkən arxa plana malik olacaq Yükləmə ekranı, vahid arxa plana malik olacaq Sıçrama ekran üslubu - Rəng - Qara və ağ + Qeyri-aktiv edildi + Rəng + Qara və ağ Fərdi irəliləmə cizgisi rəngini aktivləşdir Fərdi irəliləmə cizgisi rəngi göstərilir Orijinal irəliləmə cizgisi rəngi göstərilir @@ -1549,6 +1636,9 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər Axtarış geriyə reaksiyasın qapat Axtarış geri reaksiyası qapalıdır Axtarış geri reaksiyası aktivdir + Basıb saxla toxunma reaksiyalarını qapat + Basıb saxla toxunma reaksiyaları qapalıdır + Basıb saxla toxunma reaksiyaları aktivdir Yaxınlaşdırma reaksiyasın qapat Yaxınlaşdırma reaksiyası qapalıdır Yaxınlaşdırma reaksiyası aktivdir @@ -1644,6 +1734,11 @@ Məhdudiyyətlər: Qabaqcıl video keyfiyyət siyahısı göstərilir Qabaqcıl video keyfiyyət siyahısı göstərilmir + + Premium keyfiyyət seçimlərini gizlət + Premium keyfiyyət seçimləri gizlidir + Premium keyfiyyət seçimləri göstərilir + Axtarmaq üçün sürüşdürməni aktiv et Axtarmaq üçün sürüşdürmə aktivdir @@ -1675,6 +1770,7 @@ Video oynatma AV1 ilə ilişə bilər və ya kadrlar buraxıla bilər." + Haqqında Reklamlar Ümumi diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 01e3acf65d..bd048e7209 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Паказваць гісторыю пошуку ў наладах Паказваецца гісторыя пошуку ў наладах Гісторыя пошуку налад не паказваецца + Адключыць тлустыя значкі + Значкі не тлустыя + Значкі тлустыя Паказваць значкі налад ReVanced Значкі налад паказваюцца Значкі налад не паказваюцца @@ -99,23 +102,31 @@ Second \"item\" text" and changes made here must also be made there. --> - Налады GmsCore - Налады для GmsCore + GmsCore + Налады, звязаныя з GmsCore + Праверыць наяўнасць абнаўленняў GmsCore + Праверка наяўнасці абнаўленняў уключана + Праверка абнаўленняў адключана + Адкрыць Налады GmsCore + Налады для GmsCore - MicroG GmsCore не ўсталяваны. Усталюйце яго. - Патрабуецца дзеянне - "MicroG GmsCore не мае дазволу на працу ў фонавым рэжыме. + MicroG GmsCore не ўсталяваны. Усталюйце яго. + Патрабуецца дзеянне + Не атрымалася праверыць абнаўленні MicroG GmsCore + Даступна новая версія MicroG GmsCore (%1$s). Зараз вы выкарыстоўваеце версію %2$s. + "MicroG GmsCore не мае дазволу на працу ў фонавым рэжыме. Выконвайце інструкцыі \"Не забівай маё прыкладанне\" для вашага тэлефона і прымяніце іх да вашай ўстаноўкі MicroG. Гэта неабходна для працы прыкладання." - Адкрыць сайт - "Неабходна адключыць аптымізацыю батарэі для MicroG GmsCore, каб пазбегнуць праблем. + Адкрыць сайт + Адмена + "Неабходна адключыць аптымізацыю батарэі для MicroG GmsCore, каб пазбегнуць праблем. Адключэнне аптымізацыі батарэі для MicroG не паўплывае на выкарыстанне батарэі. Націсніце кнопку \"Працягнуць\" і дазвольце змяніць аптымізацыю." - Працягнуць + Працягнуць Падмена відэапатокаў @@ -169,10 +180,11 @@ Second \"item\" text" Сцягі захаваны Сцягі скінуты Сцягі скапіяваны ў буфер абмену - Буфер пратаколу часопіса - Журналы адладкі ўключаюць пратабуфер - Журналы адладкі не ўключаюць пратабуфер - "Уключэнне гэтага параметра будзе запісваць дадатковыя даныя макета, у тым ліку тэкст на экране для некаторых кампанентаў інтэрфейсу. + Перазапусціце праграму, каб выкарыстоўваць гэтую функцыю + Буфер пратаколу часопіса + Журналы адладкі ўключаюць пратабуфер + Журналы адладкі не ўключаюць пратабуфер + "Уключэнне гэтага параметра будзе запісваць дадатковыя даныя макета, у тым ліку тэкст на экране для некаторых кампанентаў інтэрфейсу. Гэта можа дапамагчы ідэнтыфікаваць кампаненты пры стварэнні карыстацкіх фільтраў. @@ -220,6 +232,9 @@ Second \"item\" text" Фоновый плейлист Shorts включен + Схаваць паліцу крамы стваральнікаў + Паліца крамы стваральніка пад відэапрайгравальнікам схаваная + Паліца крамы стваральніка пад відэапрайгравальнікам паказана Схаваць карты альбома Карткі альбомаў схаваныя Паказваюцца альбомныя карткі @@ -229,6 +244,9 @@ Second \"item\" text" Схавайце паліцу для чыпсаў Паліца для чыпсаў схаваная Паказана паліца для чыпсаў + Схаваць раздзел каментарыяў пад відэа ў стужцы «Галоўная» + Раздзел каментарыяў пад відэа ў стужцы «Галоўная» схаваны + Раздзел каментарыяў пад відэа ў стужцы «Галоўная» паказаны Схаваць паведамленні ў супольнасці Паведамленні ў супольнасці схаваны Паказваюцца паведамленні ў супольнасці @@ -256,14 +274,19 @@ Second \"item\" text" Схаваць апошнія паведамленні Апошнія паведамленні схаваны Паказваюцца апошнія паведамленні + + Схаваць кнопку «Апошнія відэа» + Кнопка «Апошнія відэа» схавана + Кнопка «Апошнія відэа» паказана Схаваць міксавыя плэйлісты Спісы міксаў схаваны Паказваюцца міксавыя плэйлісты Схаваць раздзел фільмаў Раздзел фільмаў схаваны Паказваецца раздзел фільмаў - + Схаваць кнопку \"Паведаміць мне\" Кнопка «Паведаміць мне» схаваная Кнопка «Паведаміць мне» паказаная @@ -288,13 +311,16 @@ Second \"item\" text" Схаваць візуальны падзельнік Візуальны падзельнік схаваны Візуальны падзельнік паказаны + Схаваць вынікі вэб-пошуку + Вынікі вэб-пошуку схаваныя + Вынікі вэб-пошуку паказаны + Схаваць раздзел «Вам можа спадабацца» + Раздзел «Вам можа спадабацца» схаваны + Раздзел «Вам можа спадабацца» паказаны Схаваць YouTube Doodles Анімацыя YouTube Doodles на лагатыпе схаваная Анімацыя YouTube Doodles на лагатыпе паказана - "Doodles па YouTube паказваюцца некалькі дзён у год. - -Калі Doodle зараз паказваецца ў вашым рэгіёне і гэты параметр схаваны, панэль фільтраў ніжэй радка пошуку таксама будзе схавана." Схаваць панэль канала Панэль канала схавана Паказана панэль канала @@ -311,10 +337,15 @@ Second \"item\" text" Інфармацыйныя панэлі схаваныя Паказваюцца інфармацыйныя панэлі + This button usually appears in the video player for certain videos. --> Схаваць кнопку «Далучыцца» Кнопка «Далучыцца» схаваная Кнопка «Далучыцца» паказаная + + Схаваць кнопку «Паўтор жывога чата» + Кнопка паўтору жывога чата ў накладцы прайгравальніка схавана + Кнопка паўтору жывога чата ў накладцы прайгравальніка паказана Схаваць медыцынскія панэлі Медпанэлі схаваныя Паказваюцца медыцынскія панэлі @@ -330,6 +361,9 @@ Second \"item\" text" Схаваць рэакцыі па часе Часовыя рэакцыі схаваныя Паказваюцца рэакцыі па часе + Схаваць назву відэа + Назва відэа ў накладцы прайгравальніка схавана + Назва відэа ў накладцы прайгравальніка паказана Схаваць «Зводку відэа, згенэраваную штучным інтэлектам» Раздзел згенераваных штучным інтэлектам відэа-рэзюмэ схаваны Паказаны раздзел зводкі відэа, створанай штучным інтэлектам @@ -342,33 +376,62 @@ Second \"item\" text" Схаваць раздзелы Раздзел раздзелаў схаваны Паказваецца раздзел раздзелаў - Схаваць «Як быў створаны гэты кантэнт» - Раздзел «Як быў створаны гэты кантэнт» схаваны - Раздзел «Як быў створаны гэты кантэнт» паказаны - Схаваць Hype балы - Hype балы схаваны - Hype балы паказаны + Схаваць «Прагрэс курса» + Раздзел «Прагрэс курса» схаваны + Раздзел «Прагрэс курса» паказаны + Схаваць Агляд + Раздзелы «Даследуйце гэты курс» і «Пазнаёмцеся з падкастам» схаваны + Раздзелы «Даследуйце гэты курс» і «Пазнаёмцеся з падкастам» паказаны + Схаваць «Даследуйце гэты курс» + Раздзел «Даследуйце гэты курс» схаваны + Раздзел «Даследуйце гэты курс» паказаны + Схаваць «Пазнаёмцеся з падкастам» + Раздзел «Пазнаёмцеся з падкастам» схаваны + Раздзел «Пазнаёмцеся з падкастам» паказаны Схаваць «Пазнаёмцеся з падкастам» Раздзел «Пазнаёмцеся з падкастам» схаваны Раздзел «Пазнаёмцеся з падкастам» паказаны Схаваць выбраныя спасылкі Раздзел з рэкамендаванымі спасылкамі схаваны Раздзел з рэкамендаванымі спасылкамі паказаны + Схаваць «Выбраныя месцы» + Раздзел «Выбраныя месцы» схаваны + Раздзел «Выбраныя месцы» паказаны Схаваць рэкамендаваныя відэа Раздзел з рэкамендаванымі відэа схаваны Раздзел з рэкамендаванымі відэа паказаны + Уключыць фільтр выпадаючага меню стужкі + Фільтр выпадаючага меню стужкі ўключаны + Фільтр выпадаючага меню стужкі адключаны + Фільтр выпадаючага меню стужкі + Увядзіце назвы выпадаючых меню для фільтрацыі, па адной на радок + Схаваць Гульні + Раздзел «Гульні» схаваны + Раздзел «Гульні» паказаны + Схаваць «Як быў створаны гэты кантэнт» + Раздзел «Як быў створаны гэты кантэнт» схаваны + Раздзел «Як быў створаны гэты кантэнт» паказаны + Схаваць Hype балы + Hype балы схаваны + Hype балы паказаны Схаваць інфармацыйныя карткі Раздзел інфармацыйных картак схаваны Паказваецца раздзел інфармацыйных карт Схаваць «Ключавыя канцэпцыі» Раздзел «Ключавыя канцэпцыі» схаваны Раздзел «Ключавыя канцэпцыі» паказаны + Схаваць Музыку + Раздзел «Музыка» схаваны + Раздзел «Музыка» паказаны Схаваць кнопку «Падпісацца» Кнопка «Падпісацца» схавана Кнопка «Падпісацца» паказана Схаваць стэнаграму Раздзел стэнаграмы схаваны Паказваецца раздзел стэнаграмы + Схаваць Тэсты + Раздзел «Тэсты» схаваны + Раздзел «Тэсты» паказаны Апісанне відэа Схаваць або паказаць кампаненты апісання відэа Панэль фільтраў @@ -387,6 +450,11 @@ Second \"item\" text" Паказаны ў гісторыі праглядаў Старонка канала Схаваць або паказаць кампаненты старонкі канала + Уключыць фільтр ўкладак канала + Фільтр ўкладак канала ўключаны + Фільтр ўкладак канала адключаны + Фільтр ўкладак канала + Увядзіце назвы ўкладак канала для фільтрацыі, па адной на радок Схаваць кнопку «Супольнасць» Кнопка супольнасці схавана @@ -450,15 +518,15 @@ Second \"item\" text" Колькасць праглядаў паказана ў стужцы і выніках пошуку "Абмежаванні: -• На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца колькасць праглядаў -• Гэта функцыя не працуе з аўтамабільным форм-фактарам" +• На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца колькасць праглядаў. +• Гэта функцыя не працуе з аўтамабільным форм-фактарам." Схаваць час загрузкі Час загрузкі схаваны ў стужцы і выніках пошуку Час загрузкі паказаны ў стужцы і выніках пошуку "Абмежаванні: -• На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца час загрузкі -• Гэтая функцыя не працуе з аўтамабільным форм-фактарам" +• На паліцах Shorts, старонках каналаў і ў выніках пошуку ўсё яшчэ можа адлюстроўвацца час загрузкі. +• Гэта функцыя не працуе з аўтамабільным форм-фактарам." Схаваць змест ключавых слоў Схавайце відэа для пошуку і стужкі з дапамогай фільтраў па ключавых словах Схаваць хатняе відэа па ключавых словах @@ -479,9 +547,9 @@ Second \"item\" text" Словы з вялікімі літарамі пасярэдзіне павінны ўводзіцца з вялікай літары (напрыклад: iPhone, TikTok, LeBlanc)" Аб фільтрацыі ключавых слоў - "Вынікі дома/падпіскі/пошуку фільтруюцца, каб схаваць змест, які адпавядае ключавым словам і фразам + "Вынікі галоўнай старонкі/падпісак/пошуку фільтруюцца, каб схаваць змест, які адпавядае ключавым словам і фразам -Абмежаванні +Абмежаванні: • Shorts нельга схаваць па назве канала • Некаторыя элементы інтэрфейсу могуць не быць схаваны • Пошук па ключавым слове можа не паказаць вынікі" @@ -496,19 +564,12 @@ Second \"item\" text" Ключавое слова схавае ўсе відэа: %s - Схаваць паліцу крамы стваральнікаў - Паліца крамы стваральніка пад відэапрайгравальнікам схаваная - Паліца крамы стваральніка пад відэапрайгравальнікам паказана Схаваць банер крамы на канчатковым экране Банер крамы на канцавым экране схаваны Банер крамы на канцавым экране паказаны Схаваць поўнаэкранную рэкламу - "Схаваны поўнаэкранныя рэкламныя ролікі - -Гэтая функцыя даступная толькі для старых прылад" + Поўнаэкранная рэклама схавана Адлюстроўваецца поўнаэкранная рэклама - - Схаваць поўнаэкранную рэкламу працуе толькі са старымі прыладамі Схаваць агульную рэкламу Агульныя аб\"явы схаваныя Паказваюцца агульныя аб\"явы @@ -518,6 +579,9 @@ Second \"item\" text" Схаваць метку аплачанай акцыі Пазнака платнай акцыі схавана Адлюстроўваецца ярлык платнай акцыі + Схаваць усплывальную рэкламу прайгравальніка + Усплывальная рэклама прайгравальніка схавана + Усплывальная рэклама прайгравальніка паказана Схаваць самі спансаваныя карты Спонсарскія карткі схаваныя Паказваюцца ўласныя карты @@ -525,31 +589,26 @@ Second \"item\" text" Спасылкі на пакупкі ў апісанні відэа схаваныя Спасылкі на пакупкі ў апісанні відэа паказаны Схаваць банэр \"Прагледзець тавары\" - Банер «Паглядзець тавары» ў накладцы відэа схаваны - Банер «Паглядзець тавары» ў накладцы відэа паказаны - Схаваць вынікі вэб-пошуку - Вынікі вэб-пошуку схаваныя - Паказваюцца вынікі вэб-пошуку - - - Схаваць акцыі YouTube Premium - Акцыі YouTube Premium пад відэаплэерам схаваны - Пад відэаплэерам паказваюцца акцыі YouTube Premium + Банер «Паглядзець тавары» ў накладцы прайгравальніка схаваны + Банер «Паглядзець тавары» ў накладцы прайгравальніка паказаны + Схаваць акцыі YouTube Premium + Акцыі YouTube Premium схаваны + Акцыі YouTube Premium паказаны Схаваць відэарэкламу Відэарэклама схаваная Паказваецца відэарэклама - + URL скапіраваны ў буфер абмену URL-адрас з пазнакай часу скапіраваны Паказаць кнопку скапіравання URL відэа - Кнопка \"Капіяваць URL відэа\" паказана. Націсніце, каб скапіяваць URL відэа. Націсніце і ўтрымлівайце, каб скапіяваць з пазнакай часу - Кнопка \"Капіяваць URL відэа\" не паказана + Кнопка «Капіяваць URL відэа» паказана. Націсніце, каб скапіяваць URL відэа. Націсніце і ўтрымлівайце, каб скапіяваць з пазнакай часу + Кнопка «Капіяваць URL відэа» не паказана Паказаць кнопку URL-адрас з часовай пазнакай - Кнопка \"Капіяваць URL з пазнакай часу\" паказана. Націсніце, каб скапіяваць URL відэа з пазнакай часу. Націсніце і ўтрымлівайце, каб скапіяваць без пазнакі часу - Кнопка \"Капіяваць URL з пазнакай часу\" не паказана + Кнопка «Капіяваць URL з пазнакай часу» паказана. Націсніце, каб скапіяваць URL відэа з пазнакай часу. Націсніце і ўтрымлівайце, каб скапіяваць без пазнакі часу + Кнопка «Капіяваць URL з пазнакай часу» не паказана Выдаліць дыялогавае акно права прагляду @@ -557,10 +616,10 @@ Second \"item\" text" Будзе паказана дыялогавае акно Гэта не абыходзіць узроставае абмежаванне. Ён проста прымае гэта аўтаматычна. - - Адключыць усплываючае акно \"Увайсці ў ТБ\" - Усплывальнае акно «Уваход у ТБ» адключана - Усплывальнае акно «Уваход у ТБ» уключана + + Адключыць усплываючае акно «Увайсці ў ТБ» + Усплывальнае акно «Уваход у ТБ» адключана + Усплывальнае акно «Уваход у ТБ» уключана Адключыць прапуск раздзела па двайным націску @@ -593,10 +652,10 @@ Second \"item\" text" Жэст адключаны Жэст уключаны - - Уключыць націсканне для пошуку - Націсніце, каб уключыць пошук - Націсканне для пошуку адключана + + Уключыць націсканне для пошуку + Націсканне для пошуку ўключана + Націсканне для пошуку адключана Уключыць жэст яркасці @@ -677,7 +736,7 @@ Second \"item\" text" Кнопка каментарыяў схавана Кнопка каментарыяў паказана + This button usually appears on live streamed videos. --> Схаваць справаздачу Кнопка \"Паведаміць\" схавана Паказана кнопка \"Паведаміць\" @@ -690,7 +749,7 @@ Second \"item\" text" Кнопка загрузкі схавана Паказана кнопка загрузкі + This button usually appears on videos uploaded by the logged-in user. --> Схаваць хайп Кнопка Hype схаваная Кнопка хайпу паказана @@ -703,7 +762,7 @@ Second \"item\" text" Кнопка падзякі схавана Паказана кнопка падзякі + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Схаваць кнопку «Запытацца» Кнопка «Запытацца» схаваная Кнопка «Запытацца» паказаная @@ -711,6 +770,7 @@ Second \"item\" text" Схаваць кліп Кнопка кліпа схавана Паказана кнопка кліпа + Хаванне можа не працаваць для некаторых уліковых запісаў карыстальнікаў. Схаваць Краму Кнопка \"Крама\" схавана @@ -720,50 +780,68 @@ Second \"item\" text" Кнопка \"Захаваць\" схавана Кнопка \"Захаваць\" паказана - + Кнопкі навігацыі - Схаваць або змяніць кнопкі на панэлі навігацыі + Схаваць або змяніць кнопкі панэлі навігацыі - Схаваць галоўную - Кнопка \"Дадому\" схавана - Паказана кнопка \"Дадому\" + Схаваць Галоўную + Кнопка «Галоўная» схавана + Кнопка «Галоўная» паказана Схаваць Shorts Кнопка Shorts схавана - Кнопка shorts паказваецца + Кнопка Shorts паказана Схаваць Стварыць - Кнопка \"Стварыць\" схавана - Паказана кнопка \"Стварыць\" + Кнопка «Стварыць» схавана + Кнопка «Стварыць» паказана Схаваць падпіскі - Кнопка \"Падпіскі\" схавана - Паказана кнопка \"Падпіскі\" + Кнопка «Падпіскі» схавана + Кнопка «Падпіскі» паказана Схаваць апавяшчэнні - Кнопка апавяшчэнняў схаваная - Кнопка апавяшчэнняў паказаная + Кнопка апавяшчэнняў схавана + Кнопка апавяшчэнняў паказана - Пераключальнік \"Стварыць з апавяшчэннямі\" - "Кнопка «Стварыць» заменена кнопкай «Апавяшчэнні» - -Заўвага: Уключэнне гэтага таксама прымусова схавае відэарэкламу" - Кнопка \"Стварыць\" не ўзаемадзейнічае з кнопкай \"Апавяшчэнні\" - "Адключэнне гэтай налады таксама адключыць блакіроўку рэкламы Shorts. - -Калі змена гэтай налады не ўступае ў сілу, паспрабуйце пераключыцца ў рэжым інкогніта." - Схаваць меткі кнопак навігацыі - Цэтлікі схаваныя - Этыкеткі паказаны - Адключыць празрыстую панэль стану - Панэль стану непразрыстая. - Панэль стану няпразрыстая ці празрыстая. - На некаторых прыладах уключэнне гэтай функцыі можа змяніць панэль навігацыі сістэмы на празрыстую. - Адключыць светлую празрыстую панэль + Пераключыць кнопку «Стварыць» з кнопкай «Апавяшчэнні» + Кнопка «Стварыць» пераключана з кнопкай «Апавяшчэнні» + Кнопка «Стварыць» не пераключана з кнопкай «Апавяшчэнні» + Калі змяненне гэтай налады не ўступае ў сілу, паспрабуйце пераключыцца ў рэжым інкогніта. + Схаваць подпісы кнопак навігацыі + Подпісы схаваны + Подпісы паказаны + Уключыць вузкія кнопкі навігацыі + Адлегласць паміж кнопкамі навігацыі вузкая + Адлегласць паміж кнопкамі навігацыі нармальная + Уключыць анімацыю панэлі навігацыі + Пераходы навігацыі аніміраваныя + Пераходы навігацыі не аніміраваныя + Адключыць напаўпразрыстую панэль стану + Панэль стану непразрыстая + Панэль стану непразрыстая або напаўпразрыстая + "Абмежаванні: +• Чорная паласа можа з'явіцца ў верхняй частцы відэапрайгравальніка. +• На некаторых прыладах уключэнне гэтай функцыі можа змяніць сістэмную панэль навігацыі на празрыстую." + Адключыць светлую напаўпразрыстую панэль Панэль навігацыі ў светлым рэжыме непразрыстая - Панэль навігацыі ў светлай тэме няпразрыстая ці празрыстая. - Адключыць цёмную непразрыстую панэль. + Панэль навігацыі ў светлым рэжыме непразрыстая або напаўпразрыстая + Адключыць цёмную напаўпразрыстую панэль Панэль навігацыі ў цёмным рэжыме непразрыстая - Панэль навігацыі ў цёмнай тэме няпразрыстая. + Панэль навігацыі ў цёмным рэжыме непразрыстая або напаўпразрыстая + Панэль інструментаў + Схаваць або змяніць кампаненты панэлі інструментаў + Схаваць кнопку «Стварыць» + Кнопка «Стварыць» схавана + Кнопка «Стварыць» паказана + Схаваць кнопку «Апавяшчэнні» + Кнопка «Апавяшчэнні» схавана + Кнопка «Апавяшчэнні» паказана + Схаваць кнопку «Пошук» + Кнопка «Пошук» схавана + Кнопка «Пошук» паказана. + Уключыць шырокую панэль пошуку + Уключана шырокая панэль пошуку + Шырокая панэль пошуку адключана Выпадаючае меню @@ -838,6 +916,12 @@ Second \"item\" text" Схаваць кнопку «Трансляцыя» Кнопка Cast схавана Паказана кнопка Cast + Схаваць кнопку «Згарнуць» + Кнопка «Згарнуць» схавана + Кнопка «Згарнуць» паказана + Схаваць кнопку «Поўнаэкранны рэжым» + Кнопка «Поўнаэкранны рэжым» схавана + Кнопка «Поўнаэкранны рэжым» паказана Схаваць фон элементаў кіравання прайгравальнікам Фон элементаў кіравання плэерам схаваны Фон элементаў кіравання паказаны @@ -846,9 +930,9 @@ Second \"item\" text" Паказваюцца кнопкі - Схаваць карткі канцавога экрана - Карткі канцавога экрана схаваны - Паказваюцца карткі канцавога экрана + Схаваць карткі канцавога экрана + Карткі канцавога экрана схаваны + Карткі канцавога экрана паказаны Адключыць рэжым навакольнага асяроддзя ў поўнаэкранным рэжыме @@ -873,10 +957,16 @@ Second \"item\" text" Схаваць панэль прагрэсу з эскізамі відэа Панэль прагрэсу з эскізамі відэа схавана Панэль прагрэсу з эскізамі відэа паказана + Уключыць поўнаэкранную вялікую панэль пошуку + Поўнаэкранная панэль пошуку вялікага памеру + Поўнаэкранная панэль пошуку нармальнага памеру Прайгравальнік Shorts Схаваць або паказаць кампаненты прайгравальніка Shorts + Схаваць Shorts на старонцы канала + Схавана на старонцы канала + Паказана на старонцы канала Схаваць Shorts у стужцы «Галоўная» Схавана ў стужцы «Галоўная» і звязаных відэа @@ -888,9 +978,18 @@ Second \"item\" text" Схаваць Shorts у стужцы «Падпіскі» Схавана ў стужцы «Падпіскі» Паказана ў стужцы «Падпіскі» + Схаваць Shorts у апісанні відэа + Схавана ў апісанні відэа + Паказана ў апісанні відэа Схаваць Shorts з гісторыі праглядаў Схавана ў гісторыі праглядаў Паказаны ў гісторыі праглядаў + Схаваць кнопку ШІ + Кнопка ШІ схавана + Кнопка ШІ паказана + Схаваць метку \"Аўтаматычны дубляж\" + Надпіс з аўтадубляжом схаваны + Надпіс з аўтадубляжом паказаны Схаваць метку \"Аўтаматычны дубляж\" Надпіс з аўтадубляжом схаваны Надпіс з аўтадубляжом паказаны @@ -952,6 +1051,7 @@ Second \"item\" text" Схаваць кнопку \"Выкарыстаць гэты шаблон\" Кнопка \"Выкарыстаць гэты шаблон\" схавана Кнопка \"Выкарыстаць гэты шаблон\" паказана + Схаваць анімацыю кнопкі «Падабаецца» Анимация всплывающего окна с лайками Shorts скрыта Анимация всплывающего окна с лайками Shorts отображается @@ -994,13 +1094,18 @@ Second \"item\" text" Панэль навігацыі схавана Паказана панэль навігацыі - + + Схаваць аўтапрагляд + Аўтапрагляд схаваны + Аўтапрагляд паказаны + + Схаваць прапанаванае відэа на канчатковым экране - "Прапанаванае відэа на канчатковым экране будзе схавана, калі аўтаматычнае прайграванне выключана. + "Прапанаванае відэа на канчатковым экране схавана, калі аўтаматычнае прайграванне выключана. Аўтаматычнае прайграванне можна змяніць у наладах YouTube: Налады → Прайграванне → Аўтаматычнае прайграванне наступнага відэа" - Паказваць прапанаванае відэа на канчатковым экране + Прапанаванае відэа на канчатковым экране паказана Схаваць накладку звязаных відэа @@ -1013,9 +1118,9 @@ Second \"item\" text" Адлюстроўваецца метка часу - Схаваць усплывальныя панэлі прайгравальніка - Усплывальныя панэлі прайгравальніка схаваныя - Паказваюцца ўсплывальныя панэлі прайгравальніка + Схаваць усплывальныя панэлі прайгравальніка + Усплывальныя панэлі прайгравальніка схаваныя + Паказваюцца ўсплывальныя панэлі прайгравальніка Выйсці з поўнаэкраннага рэжыму ў канцы відэа @@ -1083,24 +1188,6 @@ Second \"item\" text" Ліміт кліенцкай хуткасці сустракаецца %d разоў %d мілісекунд - - Уключыць шырокую панэль пошуку - Уключана шырокая панэль пошуку - Шырокая панэль пошуку адключана - - - Включить миниатюры высокого качества - Миниатюры ползунка прогресса — высокого качества - Миниатюры ползунка прогресса — среднего качества - "Гэта таксама аднавіць мініатюры на трансляцыях у прамым эфіры, якія не маюць мініатюр з магчымасцю перамоткі. - -Мініатюры з магчымасцю перамоткі будуць выкарыстоўваць тую ж якасць, што і бягучае відэа. - -Гэтая функцыя лепш за ўсё працуе з якасцю відэа 720p або ніжэй і пры выкарыстанні вельмі хуткага Інтэрнэт-злучэння." - Аднавіць старыя мініяцюры панэлі пошуку - Эскізы панэлі пошуку з\"явяцца над панэллю пошуку - Мініяцюры панэлі пошуку з\"явяцца ў поўнаэкранным рэжыме - Уключыць SponsorBlock SponsorBlock — гэта краўдсорсінгавая сістэма, якая дазваляе прапускаць раздражняльныя фрагменты відэа на YouTube @@ -1341,8 +1428,6 @@ Second \"item\" text" Падробка мэтавай версіі праграмы 20.13.41 - Аднавіць не згорнуты радок дзеянняў відэа 20.05.46 - Аднавіць функцыянальнасць стэнаграмы - 19.35.36 — Восстановить старые значки плеера Shorts - 19.01.34 - Аднаўленне старых значкоў навігацыі Змяніць стартавую старонку @@ -1447,8 +1532,9 @@ Second \"item\" text" Экран загрузкі будзе мець градыентны фон Экран загрузкі будзе мець суцэльны фон Стыль застаўкі - Колер - Чорна-белы + Адключана + Колер + Чорна-белы Уключыць уласны колер панэлі пошуку Паказваецца карыстальніцкі колер панэлі пошуку Паказаны зыходны колер панэлі пошуку @@ -1553,6 +1639,9 @@ Second \"item\" text" Адключыць тактыльны эфект адмены пошуку Тактыльны эфект адмены пошуку адключаны Тактыльны эфект адмены пошуку ўключаны + Адключыць тактыльны водгук пры націсканні і ўтрымліванні + Тактыльны водгук пры націсканні і ўтрымліванні адключаны + Тактыльны водгук пры націсканні і ўтрымліванні ўключаны Адключыць тактыльны эфект маштабавання Тактыльны эфект маштабавання адключаны Тактыльны эфект маштабавання ўключаны @@ -1648,6 +1737,11 @@ Second \"item\" text" Пашыранае меню якасці відэа паказана Пашыранае меню якасці відэа не паказана + + Схаваць параметры якасці Premium + Параметры якасці Premium схаваны + Параметры якасці Premium паказаны + Уключыць слайд для пошуку Слайд для пошуку ўключаны @@ -1679,6 +1773,7 @@ Second \"item\" text" + Пра Рэклама Агульныя diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index acec23d43b..69de0baa4b 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Показване на историята на търсенията в настройките Историята на търсенията в настройките е показана Историята на търсенията в настройките не се показва + Деактивиране на удебелени икони + Иконите не са удебелени + Иконите са удебелени Показване на иконите на настройките на ReVanced Иконите на настройките се показват Иконите на настройките не се показват @@ -99,23 +102,31 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore Настройки - Настройки на GmsCore + GmsCore + Настройки на GmsCore + Проверка за актуализации на GmsCore + Проверката за актуализации е активирана + Проверката за актуализации е деактивирана + Отвори GmsCore Настройки + Настройки на GmsCore - GmsCore не е инсталиран. Инсталирайте го. - Нужно е действие - "MicroG GmsCore няма разрешение да работи във фонов режим. + GmsCore не е инсталиран. Инсталирайте го. + Нужно е действие + Неуспешна проверка за актуализации на MicroG GmsCore + Налична е нова версия (%1$s) на MicroG GmsCore. В момента използвате версия %2$s. + "MicroG GmsCore няма разрешение да работи във фонов режим. Следвайте ръководството \"Не убивай моето приложение\" за вашия телефон и приложете инструкциите към вашата инсталация на MicroG. Това е необходимо, за да работи приложението." - Отвори сайта - "Оптимизациите на батерията за MicroG GmsCore трябва да бъдат деактивирани, за да се избегнат проблеми. + Отвори сайта + Отказ + "Оптимизациите на батерията за MicroG GmsCore трябва да бъдат деактивирани, за да се избегнат проблеми. Деактивирането на оптимизациите на батерията за MicroG няма да повлияе отрицателно на използването на батерията. Докоснете бутона за продължаване и разрешете промени в оптимизацията." - Продължи + Продължи Имитиране на видео потоци @@ -169,10 +180,11 @@ Second \"item\" text" Флаговете са запазени Флаговете са нулирани Флаговете са копирани в клипборда - Буфер на протокола за дневника - Файлове с дневници за грешки включват буфера - Файлове с дневници за грешки не включват буфера - "Активирането на тази настройка ще регистрира допълнителни данни за оформлението, включително текст на екрана за някои компоненти на потребителския интерфейс. + Рестартирайте приложението, за да използвате тази функция + Буфер на протокола за дневника + Файлове с дневници за грешки включват буфера + Файлове с дневници за грешки не включват буфера + "Активирането на тази настройка ще регистрира допълнителни данни за оформлението, включително текст на екрана за някои компоненти на потребителския интерфейс. Това може да помогне за идентифициране на компоненти при създаване на персонализирани филтри. @@ -220,6 +232,9 @@ Second \"item\" text" Фоновото възпроизвеждане на Shorts е активирано + Скриване на рафта на магазина на създателя + Рафтът на магазина на създателя под видео плейъра е скрит + Рафтът на магазина на създателя под видеоплейъра е показан \"Карти на албумите\" Албумните карти са скрити Албумните карти се показват @@ -229,6 +244,9 @@ Second \"item\" text" Скриване на филмовите рафтове Рафтът \"Chip\" е скрит Рафтовете със снимки се показват + Скриване на секцията с коментари под видеоклипове в емисията Начало + Секцията с коментари под видеоклипове в емисията Начало е скрита + Секцията с коментари под видеоклипове в емисията Начало е показана Скриване на публикациите от общността Насоките на общността са скрити Последните публикации са показани @@ -256,14 +274,19 @@ Second \"item\" text" Скриване на последните публикации Най-новите публикации са скрити Последните публикации са показани + + Скриване на бутона „Последни видеоклипове“ + Бутонът за последни видеоклипове е скрит + Бутонът за последни видеоклипове е показан Скриване на микс плейлист Плейлист микса е скрит Плейлист микса се показва Скриване на раздела за филми Секцията с коментари е скрита Разделът за филми е показан - + Скриване на бутона \"Уведоми ме\" Бутонът за уведомяване е скрит Бутонът за уведомяване е показан @@ -288,13 +311,16 @@ Second \"item\" text" Скрий визуалния разделител Визуалният разделител е скрит Визуалният разделител е показан + Скриване на резултатите от уеб търсенето + Резултатите от уеб търсенето са скрити + Резултатите от уеб търсенето са показани. + Скриване на секция „Може да ви хареса“ + Секцията „Може да ви хареса“ е скрита + Секцията „Може да ви хареса“ е показана YouTube Doodles Анимацията на YouTube Doodles върху логото е скрита Анимацията на YouTube Doodles върху логото е показана - "Doodles в YouTube се показват няколко дни в годината. - -Ако в момента се показва Doodle във вашия регион и тази настройка за скриване е включена, тогава лентата за филтриране под лентата за търсене също ще бъде скрита." Скриване на лентата на канала Лентата на канала е скрита Лентата на канала е показана @@ -311,10 +337,15 @@ Second \"item\" text" Информационните панели са скрити Информационните панели са показани + This button usually appears in the video player for certain videos. --> Скриване на бутона \"Присъединяване\" Бутонът за присъединяване е скрит Бутонът за присъединяване е показан + + Скриване на бутона „Повторение на чат на живо“ + Бутонът за повторение на чат на живо в наслагването на плейъра е скрит + Бутонът за повторение на чат на живо в наслагването на плейъра е показан Скриване на медицинските панели Медицинските панели са скрити Медицинските панели са показани @@ -330,6 +361,9 @@ Second \"item\" text" Скриване на времевите реакции Времевите реакции са скрити Времевите реакции се показват + Скриване на заглавието на видеото + Заглавието на видеото в наслагването на плейъра е скрито + Заглавието на видеото в наслагването на плейъра е показано Скриване на \"AI-генерирано видео резюме\" Разделът за резюме на видеоклипове, генерирани от AI, е скрит Разделът с генерирани от AI резюмета на видеоклипове е показан @@ -342,33 +376,62 @@ Second \"item\" text" Скриване на глави Секцията с заглавия е скрита Секцията с заглавия се показва - Скриване на \"Как е създадено това съдържание\" - Секцията \"Как е създадено това съдържание\" е скрита - Секцията \"Как е създадено това съдържание\" е показана - Скриване на точките на хайп - Точките на хайп са скрити - Точките на хайп са показани + Скриване на „Прогрес по курса“ + Секцията за прогрес по курса е скрита + Секцията за прогрес по курса е показана + Скриване на Разглеждане + Секциите „Разгледайте този курс“ и „Разгледайте подкаста“ са скрити + Секциите „Разгледайте този курс“ и „Разгледайте подкаста“ са показани + Скриване на „Разгледайте този курс“ + Секцията „Разгледайте този курс“ е скрита + Секцията „Разгледайте този курс“ е показана + Скриване на „Разгледайте подкаста“ + Секцията „Разгледайте подкаста“ е скрита + Секцията „Разгледайте подкаста“ е показана Скриване на \"Разгледайте подкаста\" Секцията \"Разгледайте подкаста\" е скрита Секцията \"Разгледайте подкаста\" е показана Скриване на препоръчени връзки Секцията с представени връзки е скрита Секцията с представени връзки е показана + Скриване на „Препоръчани места“ + Секцията с препоръчани места е скрита + Секцията с препоръчани места е показана Скриване на представени видеоклипове Секцията с представени видеоклипове е скрита Секцията с представени видеоклипове е показана + Активиране на филтъра на изскачащото меню за емисия + Филтърът на изскачащото меню за емисия е активиран + Филтърът на изскачащото меню за емисия е деактивиран + Филтър на изскачащото меню за емисия + Въведете имената на изскачащите менюта, по които да филтрирате, по едно на ред + Скриване на Игри + Секцията с игри е скрита + Секцията с игри е показана + Скриване на \"Как е създадено това съдържание\" + Секцията \"Как е създадено това съдържание\" е скрита + Секцията \"Как е създадено това съдържание\" е показана + Скриване на точките на хайп + Точките на хайп са скрити + Точките на хайп са показани Скриване на инфо. карти Разделът за информационни карти е скрит Разделът за информационни карти е показан Скриване на \"Основни концепции\" Секцията \"Основни концепции\" е скрита Секцията \"Основни концепции\" е показана + Скриване на Музика + Секцията с музика е скрита + Секцията с музика е показана Скриване на бутона за абониране Бутонът за абониране е скрит Бутонът за абониране е показан Скриване на транскрипт Разделът за транскрипция е скрит Разделът за транскрипция е показан + Скриване на Тестове + Секцията с тестове е скрита + Секцията с тестове е показана Описание на видеото Скриване или показване на компонентите за описание на видеоклиповете Лента с филтри @@ -387,6 +450,11 @@ Second \"item\" text" Показано в историята на гледанията Страница на канала Скриване или показване на компоненти на страницата на канала + Активиране на филтъра за раздели на канала + Филтърът за раздели на канала е активиран + Филтърът за раздели на канала е деактивиран + Филтър за раздели на канала + Въведете имената на разделите на канала, по които да филтрирате, по едно на ред Скрий бутона за Общност Бутонът за общност е скрит @@ -450,15 +518,15 @@ Second \"item\" text" Броят на преглежданията е показан във фийда и резултатите от търсенето "Ограничения: -• Рафтовете с Shorts, страниците на каналите и резултатите от търсенето може все още да показват броя на преглежданията -• Тази функция не работи с автомобилен форм фактор" +• Рафтовете с Shorts, страниците на каналите и резултатите от търсенето може все още да показват броя на преглежданията. +• Тази функция не работи с автомобилен форм фактор." Скриване на часа на качване Часът на качване е скрит в емисията и резултатите от търсенето Часът на качване е показан в емисията и резултатите от търсенето "Ограничения: -• Рафтовете с Shorts, страниците на канали и резултатите от търсене може все още да показват часове на качване -• Тази функция не работи с автомобилни форм-фактори" +• Рафтовете с Shorts, страниците на каналите и резултатите от търсенето може все още да показват часове на качване. +• Тази функция не работи с автомобилен форм фактор." Скриване на съдържанието с ключови думи Скриване на видеоклипове в резултатите от търсенуя и в новинарския поток с помощта на филтри с ключови думи Скриване на видеоклипове в началната страница с ключови думи @@ -479,11 +547,11 @@ Second \"item\" text" Думите с главни букви в средата трябва да бъдат въведени с главни букви (напр.: iPhone, TikTok, LeBlanc)" За филтриране с ключови думи - "Резултатите от търсенето в Начало/Абонамент/Търсене се филтрират, за да се скрие съдържанието, което съвпада с фрази с ключови думи + "Резултатите от търсенето в Начало/Абонаменти/Търсене се филтрират, за да се скрие съдържанието, което съвпада с фрази с ключови думи -Ограничения -• Шорти не могат да бъдат скрити по име на канала -• Някои UI компоненти може да не са скрити +Ограничения: +• Shorts не могат да бъдат скрити по име на канала +• Някои потребителски интерфейсни компоненти може да не са скрити • Търсенето на ключова дума може да не покаже резултати" Съвпадение на всички думи @@ -496,19 +564,12 @@ Second \"item\" text" Всички видеа с ключовата дума ще бъдат скрити: %s - Скриване на рафта на магазина на създателя - Рафтът на магазина на създателя под видео плейъра е скрит - Рафтът на магазина на създателя под видеоплейъра е показан Скрий банера за реклама в края на екрана Банерът на магазина на крайния екран е скрит Банерът на магазина на крайния екран е показан Скриване на рекламите в режим на цял екран - "Всички реклами на цял екран са скрити - -Тази функция е налична само за по-стари устройства" + Рекламите на цял екран са скрити Рекламите в режим на цял екран са показани - - Скр. на реклами на цял екран, за по-стари устройства Скриване на общите реклами Общите реклами са скрити Общите реклами се показват @@ -518,6 +579,9 @@ Second \"item\" text" Скриване на платените промоции Промоционалните етикети са скрити Промоционалните етикети се показват + Скриване на изскачащи реклами на плейъра + Изскачащите реклами на плейъра са скрити + Изскачащите реклами на плейъра се показват Скриване на самоспонсорирани карти Самоспонсорираните карти са скрити Самоспонсорираните карти са показани @@ -525,23 +589,18 @@ Second \"item\" text" Линковете за пазаруване във видео описанието са скрити Линковете за пазаруване в описанието на видеоклипа са показани Скриване на банера „Преглед на продукти“ - Банерът за преглед на продукти във видео наслагването е скрит - Банерът за преглед на продукти във видео наслагването е показан - Скриване на резултатите от уеб търсенето - Резултатите от уеб търсенето са скрити - Резултатите от уеб търсенето са показани. - - - Скриване на YouTube Premium промоциите - YouTube Premium промоциите са скрити. - YouTube Premium промоциите се показват. + Банерът за преглед на продукти в наслагването на плейъра е скрит + Банерът за преглед на продукти в наслагването на плейъра е показан + Скриване на YouTube Premium промоциите + YouTube Premium промоциите са скрити + YouTube Premium промоциите се показват Скриване на видео рекламите Видео рекламите са скрити. Видео рекламите се показват. - + Връзката е копирана в клипборда. URL адрес с отметка за време, копиран в клипборда. Показване на бутона за копиране на URL адреса на видеоклипа @@ -557,10 +616,10 @@ Second \"item\" text" Диалоговият прозорец ще бъде показан Тази функция не заобикаля възрастовото ограничение. Тя просто приема възрастовата граница автоматично. - - Деактивиране на изскачащия прозорец „Вход в телевизор“ - Изскачащият прозорец „Влизане в телевизора“ е деактивиран - Изскачащият прозорец „Влизане в телевизора“ е активиран + + Деактивиране на изскачащия прозорец „Вход в телевизор“ + Изскачащият прозорец „Влизане в телевизора“ е деактивиран + Изскачащият прозорец „Влизане в телевизора“ е активиран Деактивиране на пропускане на глава с двойно докосване @@ -593,10 +652,10 @@ Second \"item\" text" Жест отключен Жест включен - - Активиране на докосване за превъртане - Докоснете, за да търсите е активирано - Докосването за превъртане е деактивирано + + Активиране на докосване за търсене + Докосване за търсене е активирано + Докосване за търсене е деактивирано Задаване на яркост чрез плъзгане @@ -677,7 +736,7 @@ Second \"item\" text" Бутонът за коментари е скрит Бутонът за коментари е показан + This button usually appears on live streamed videos. --> Бутон за доклади Бутона за докладване е скрит Бутона за докладване се показва @@ -690,7 +749,7 @@ Second \"item\" text" Бутона за изтегляне е скрит Бутона за изтегляне се показва + This button usually appears on videos uploaded by the logged-in user. --> Скрий хайпа Бутонът за хайп е скрит Бутонът за хайп е показан @@ -703,7 +762,7 @@ Second \"item\" text" Бутона за благодарност е скрит Бутона за благодарност се показва + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Скриване на \"Попитай\" Бутонът \"Попитай\" е скрит Бутонът \"Попитай\" е показан @@ -711,6 +770,7 @@ Second \"item\" text" Бутон за създаване на клип Бутона за клип е скрит Бутона за клип се показва + Скриването може да не работи за някои потребителски акаунти. Скрий магазин Бутонът за магазин е скрит @@ -720,50 +780,68 @@ Second \"item\" text" Бутонът за запазване е скрит Бутонът за запазване е показан - + Бутони за навигация - Скриване или промяна на бутоните в лентата за навигация + Скриване или промяна на бутоните на навигационната лента - Бутон за Начало - Бутона за начало е скрит - Бутона за начало се показва + Скриване на Начало + Бутонът Начало е скрит + Бутонът Начало е показан Скриване на Shorts Бутонът Shorts е скрит - Показан е бутон Shorts + Бутонът Shorts е показан - Бутон за създаване на клип + Скриване на Създаване Бутонът за създаване е скрит - Бутона за създаване се показва + Бутонът за създаване е показан - Абонаменти - Бутона за абонаменти е скрит - Бутона за абонаменти се показва + Скриване на Абонаменти + Бутонът за абонаменти е скрит + Бутонът за абонаменти е показан Скриване на известията Бутонът за известия е скрит Бутонът за известия е показан - Заменете бутона „Създаване“ с бутона „Известия“ - "Бутонът за създаване е сменен с бутона Известия - -Забележка: Активирането на това също принудително скрива видео рекламите" - Бутоните \"Създаване\" и \"Известия\" не са разменени - "Деактивирането на тази настройка също ще деактивира блокирането на рекламите за Shorts. - -Ако промяната на тази настройка не влезе в сила, опитайте да превключите в режим „инкогнито“." - Имена на бутоните на лентата за навигация + Разменете „Създаване“ с „Известия“ + Бутонът „Създаване“ е разменен с бутона „Известия“ + Бутонът „Създаване“ не е разменен с бутона „Известия“ + Ако промяната на тази настройка не влезе в сила, опитайте да превключите към режим „инкогнито“. + Скриване на етикетите на навигационните бутони Етикетите са скрити - Етикетите се показват + Етикетите са показани + Активиране на тесни навигационни бутони + Разстоянието между навигационните бутони е тясно + Разстоянието между навигационните бутони е нормално + Активиране на анимации на навигационната лента + Навигационните преходи са анимирани + Навигационните преходи не са анимирани Деактивирай полупрозрачната лента на състоянието - Статусная лента е непрозрачна - Статусная лента е непрозрачна или прозрачна - На някои устройства активирането на тази функция може да промени навигационната лента на системата на прозрачна. + Лентата на състоянието е непрозрачна + Лентата на състоянието е непрозрачна или полупрозрачна + "Ограничения: +• В горната част на видеоплейъра може да се появи черна лента. +• На някои устройства активирането на тази функция може да промени системната навигационна лента на прозрачна." Деактивирай полупрозрачната светла лента за навигация Светлата лента за навигация е непрозрачна - Светлата лента за навигация е непрозрачна или прозрачна + Светлата лента за навигация е непрозрачна или полупрозрачна Деактивиране на тъмната полупрозрачна лента Тъмната лента за навигация е непрозрачна - Тъмната лента за навигация е непрозрачна или прозрачна + Тъмната лента за навигация е непрозрачна или полупрозрачна + Лента с инструменти + Скриване или промяна на компонентите на лентата с инструменти + Скриване на бутона Създаване + Бутонът Създаване е скрит + Бутонът Създаване е показан + Скриване на бутона Известия + Бутонът Известия е скрит + Бутонът Известия е показан + Скриване на бутона за търсене + Бутонът за търсене е скрит + Бутонът за търсене е показан. + Широка лента за търсене + Широката лента за търсене е включена + Широката лента за търсене е изключена Падащо меню @@ -838,6 +916,12 @@ Second \"item\" text" Скриване на бутона Cast Бутонът за предаване е скрит Бутонът за предаване се показва + Скриване на бутона Свиване + Бутонът Свиване е скрит + Бутонът Свиване е показан + Скриване на бутона Цял екран + Бутонът Цял екран е скрит + Бутонът Цял екран е показан Скриване на фона на контролите на плейъра Фонът на контролите на плейъра е скрит Фонът на контролите на плейъра е показан @@ -846,9 +930,9 @@ Second \"item\" text" Бутоните се показват - Скриване на препоръките в края - Препоръките в края са скрити - Препоръките в края се показват + Скриване на препоръките в края + Препоръките в края са скрити + Препоръките в края се показват Деактивиране на Ambient режим в цял екран @@ -873,10 +957,16 @@ Second \"item\" text" Скриване на лентата за търсене на миниатюри на видеоклипове Лентата за търсене на миниатюри на видеоклипове е скрита Лентата за търсене на миниатюри на видеоклипове е показана + Активиране на голяма лента за търсене на цял екран + Лентата за търсене на цял екран е с голям размер + Лентата за търсене на цял екран е с нормален размер Играч на Shorts Скриване или показване на компонентите на плейъра за Shorts + Скриване на Shorts в страницата на канала + Скрити в страницата на канала + Показани в страницата на канала Скриване на Shorts в емисията Начало Скрито в емисията Начало и свързани видеоклипове @@ -888,9 +978,18 @@ Second \"item\" text" Скриване на Shorts в емисията Абонаменти Скрито в емисията Абонаменти Показано в емисията Абонаменти + Скриване на Shorts в описанието на видеото + Скрити в описанието на видеото + Показани в описанието на видеото Скриване на шортите в историята на гледане Скрито в историята на гледане Показва се в историята на гледане + Скриване на бутона за ИИ + Бутонът за ИИ е скрит + Бутонът за ИИ е показан + Скриване на етикета „Автоматично озвучено“ + Етикетът за автоматично озвучаване е скрит + Етикетът за автоматично озвучаване е показан Скриване на етикета „Автоматично озвучено“ Етикетът за автоматично озвучаване е скрит Етикетът за автоматично озвучаване е показан @@ -952,6 +1051,7 @@ Second \"item\" text" Скриване на бутона „Използване на този шаблон“ Бутонът \"Използвайте този шаблон\" е скрит Бутонът „Използване на този шаблон“ е видим + Скриване на анимацията на Like бутона Анимацията на бутона „Харесва ми“ е скрита Анимацията на бутона „Харесва ми“ се показва @@ -994,7 +1094,12 @@ Second \"item\" text" Навигационната лента е скрита Навигационната лента се показва - + + Скриване на преглед с автоматично пускане + Прегледът с автоматично пускане е скрит + Прегледът с автоматично пускане е показан + + Скриване на предложеното видео в края на екрана "Предложеното видео в края на екрана е скрито, когато автоматичното пускане е изключено @@ -1013,9 +1118,9 @@ Second \"item\" text" Показва се - Изскачащи панели на плейъра - Изскачащите панели на плейъра са скрити - Изскачащите панели на плейъра се показват + Скриване на изскачащите панели на плейъра + Изскачащите панели на плейъра са скрити + Изскачащите панели на плейъра се показват Изход от режим на цял екран в края на видеото @@ -1083,24 +1188,6 @@ Second \"item\" text" Открити са ограничения на скоростта на клиента на Api %d пъти %d милисекунди - - Широка лента за търсене - Широката лента за търсене е включена - Широката лента за търсене е изключена - - - Активиране на висококачествени миниатюри - Миниатюри с високо качество в лентата на възпроизвеждане - Миниатюри с средно качество в лентата на възпроизвеждане - "Това също ще възстанови миниатюрите на предавания на живо, които нямат миниатюри на плъзгача. - -Миниатюрите на плъзгача ще използват същото качество като текущото видео. - -Тази функция работи най-добре с видео качество от 720p или по-ниско и при използване на много бърза интернет връзка." - Стари миниатюри на времевата линия - Над лентата за възпроизвеждане се появяват миниатюри - Миниатюрите се показват в режим на цял екран - Включване на SponsorBlock SponsorBlock е система с отворен код за прескачане на досадни части от видеоклипове в YouTube @@ -1201,7 +1288,7 @@ Second \"item\" text" Отклонение / Шеги Странични сцени или шеги, които не са необходими за разбиране на основното съдържание на видеоклипа. Не включва секции, предоставящи контекст или фонови детайли Музика: Част без музика - За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория + Само за използване в музикални видеоклипове. Части от музикални видеоклипове без музика, които все още не са обхванати от друга категория Пропусни Акценти Пропусни спонсор @@ -1244,7 +1331,7 @@ Second \"item\" text" SponsorBlock временно не работи Не могат да се изпратят сигменти: (статус:%1$d %2$s) Неуспешно изпращане на сегмент. Ограничена скорост (твърде много от един и същ потребител или IP) - Не може да се изпрати частта: %s + Не може да се изпрати сегментът: %s "Не може да се изпрати сегментът. Вече съществува" Частта е изпратена успешно @@ -1340,8 +1427,6 @@ Second \"item\" text" Подлъгване за версията на 20.13.41 - Възстановяване на несгъваема лента с действия за видео 20.05.46 - Възстановяване на функционалността на преписа - 19.35.36 - Възстановете старите икони на Shorts в плейъра - 19.01.34 - Възстановяване на стари икони за навигация Промяна на началната страница @@ -1446,8 +1531,9 @@ Second \"item\" text" Екранът за зареждане ще има градиентен фон Екранът за зареждане ще има плътен фон Стил на началния екран - Цвят - Черно и бяло + Деактивирано + Цвят + Черно и бяло Промяна на цвета на индикатора за време Показва се персонализиран цвят на лентата за напредък Показва се оригиналния цвят на лентата за напредък @@ -1552,6 +1638,9 @@ Second \"item\" text" Деактивиране на вибрация при отмяна на търсене Вибрацията при отмяна на търсене е деактивирана Вибрацията при отмяна на търсене е активирана + Деактивиране на вибрации при докосване и задържане + Вибрациите при докосване и задържане са деактивирани + Вибрациите при докосване и задържане са активирани Деактивиране на вибрация при мащабиране Вибрацията при мащабиране е деактивирана Вибрацията при мащабиране е активирана @@ -1647,6 +1736,11 @@ Second \"item\" text" Показва се менюто за разширено качество на видеото Менюто за разширено качество на видеото не се показва + + Скриване на опции за Premium качество + Опциите за Premium качество са скрити + Опциите за Premium качество са показани + Активиране на слайд за превъртане Слайд за превъртане е активиран @@ -1678,6 +1772,7 @@ Second \"item\" text" + Относно Реклами Общи diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index 7108483442..16d27b155c 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" অনুসন্ধান সেটিংসের ইতিহাস দেখান সেটিংস অনুসন্ধান ইতিহাস দেখানো হয়েছে সেটিংস অনুসন্ধান ইতিহাস দেখানো হয় না + বোল্ড আইকন নিষ্ক্রিয় করুন + আইকনগুলো বোল্ড নয় + আইকনগুলো বোল্ড ReVanced সেটিং আইকন দেখান সেটিং আইকন দেখানো হয়েছে সেটিং আইকন দেখানো হচ্ছে না @@ -99,23 +102,31 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore সেটিং - GmsCore এর জন্য সেটিং + GmsCore + GmsCore সম্পর্কিত সেটিং + GmsCore আপডেট পরীক্ষা করুন + আপডেট পরীক্ষা করা সক্রিয় আছে + আপডেট পরীক্ষা করা নিষ্ক্রিয় করা হয়েছে + GmsCore সেটিং খুলুন + GmsCore এর সেটিং - MicroG GmsCore ইনস্টল করা হয়নি। ইনস্টল করুন। - পদক্ষেপ প্রয়োজন - "MicroG GmsCore-এর পটভূমিতে চালানোর অনুমতি নেই। + MicroG GmsCore ইনস্টল করা হয়নি। ইনস্টল করুন। + পদক্ষেপ প্রয়োজন + MicroG GmsCore আপডেটের জন্য পরীক্ষা করতে ব্যর্থ হয়েছে + MicroG GmsCore-এর একটি নতুন সংস্করণ (%1$s) উপলব্ধ। বর্তমানে, আপনি সংস্করণ %2$s ব্যবহার করছেন। + "MicroG GmsCore-এর পটভূমিতে চালানোর অনুমতি নেই। আপনার ফোনের জন্য \"Don't kill my app\" গাইড অনুসরণ করুন এবং MicroG ইনস্টলেশনের জন্য নির্দেশাবলী প্রয়োগ করুন। এটি অ্যাপ্লিকেশনটি কাজ করার জন্য প্রয়োজন।" - ওয়েবসাইট খুলুন - "সমস্যা এড়াতে MicroG GmsCore-এর ব্যাটারি অপ্টিমাইজেশন অক্ষম করতে হবে। + ওয়েবসাইট খুলুন + বাতিল করুন + "সমস্যা এড়াতে MicroG GmsCore-এর ব্যাটারি অপ্টিমাইজেশন অক্ষম করতে হবে। MicroG-এর জন্য ব্যাটারি অপ্টিমাইজেশন অক্ষম করা ব্যাটারি ব্যবহারকে নেতিবাচকভাবে প্রভাবিত করবে না। চালিয়ে যান বোতামটি ট্যাপ করুন এবং অপ্টিমাইজেশন পরিবর্তনগুলি অনুমোদন করুন।" - এগিয়ে যান + এগিয়ে যান ভিডিও স্ট্রিম স্পুফ করুন @@ -169,10 +180,15 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ফ্ল্যাগ সংরক্ষণ করা হয়েছে ফ্ল্যাগ রিসেট করা হয়েছে ফ্ল্যাগ ক্লিপবোর্ডে কপি করা হয়েছে - প্রটোকল বাফার লগ - ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে - ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে না - "এই সেটিংস সক্ষম করলে কিছু UI উপাদানের জন্য অন-স্ক্রীন পাঠ্য সহ অতিরিক্ত লেআউট ডেটা লগ করা হবে।\n\nএটি কাস্টম ফিল্টার তৈরি করার সময় উপাদান সনাক্ত করতে সাহায্য করতে পারে।\n\nতবে, এটি সক্রিয় করলে আপনার আইপি ঠিকানার মতো কিছু ব্যবহারকারীর ডেটাও লগ করা হবে।" + এই বৈশিষ্ট্য ব্যবহার করার জন্য অ্যাপটি পুনরায় চালু করুন + প্রটোকল বাফার লগ + ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে + ডিবাগ লগ প্রটোকল বাফার সংযুক্ত করবে না + "এই সেটিংস সক্ষম করলে কিছু UI উপাদানের জন্য অন-স্ক্রীন পাঠ্য সহ অতিরিক্ত লেআউট ডেটা লগ করা হবে। + +এটি কাস্টম ফিল্টার তৈরি করার সময় উপাদান সনাক্ত করতে সাহায্য করতে পারে। + +তবে, এটি সক্রিয় করলে আপনার আইপি ঠিকানার মতো কিছু ব্যবহারকারীর ডেটাও লগ করা হবে।" শেয়ারিং লিঙ্ক স্যানিটাইজ করুন @@ -216,6 +232,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ Shorts ব্যাকগ্রাউন্ড প্লে সক্ষম করা হয়েছে + ক্রিয়েটর স্টোর শেল্ফ লুকান + ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেলফ লুকানো আছে + ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেল্ফ দেখানো হয় অ্যালবাম কার্ড লুকান অ্যালবাম কার্ড লুকিয়ে রয়েছে অ্যালবাম কার্ড প্রদর্শিত হয়েছে @@ -225,6 +244,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ চিপ শেলপ লুকান চিপ শেলপ লুকিয়ে রয়েছে চিপ শেলপ প্রদর্শিত হয়েছে + হোম ফিডে ভিডিওর নিচে মন্তব্য বিভাগ লুকান + হোম ফিডে ভিডিওর নিচে মন্তব্য বিভাগ লুকানো আছে + হোম ফিডে ভিডিওর নিচে মন্তব্য বিভাগ দেখানো আছে সম্প্রদায় পোস্ট লুকান সম্প্রদায় পোস্ট লুকিয়ে রয়েছে সম্প্রদায় পোস্ট প্রদর্শিত হয়েছে @@ -252,14 +274,19 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ সর্বশেষ পোস্ট লুকান সর্বশেষ পোস্ট লুকিয়ে রয়েছে সর্বশেষ পোস্ট প্রদর্শিত হয়েছে + + \'সর্বশেষ ভিডিও\' বোতাম লুকান + সর্বশেষ ভিডিও বোতাম লুকানো আছে + সর্বশেষ ভিডিও বোতাম দেখানো আছে মিক্স প্লেলিস্ট লুকান মিক্স প্লেলিস্ট লুকিয়ে রয়েছে মিক্স প্লেলিস্ট প্রদর্শিত হয়েছে চলচ্চিত্র বিভাগ লুকান চলচ্চিত্র বিভাগ লুকিয়ে রয়েছে চলচ্চিত্র বিভাগ প্রদর্শিত হয়েছে - + \'আমাকে জানান\' বোতাম লুকান আমাকে জানান বোতামটি লুকানো আছে আমাকে জানান বোতামটি দেখানো হয়েছে @@ -284,13 +311,16 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ভিজ্যুয়াল স্পেসার লুকান ভিজ্যুয়াল স্পেসার লুকানো হয়েছে ভিজ্যুয়াল স্পেসার দেখানো হয়েছে + লোকেরা এইগুলিও সার্চ করছে লুকান + লোকেরা এইগুলিও সার্চ করছে লুকিয়ে রয়েছে + লোকেরা এইগুলিও সার্চ করছে প্রদর্শিত হয়েছে + \'আপনার পছন্দ হতে পারে\' বিভাগ লুকান + \'আপনার পছন্দ হতে পারে\' বিভাগ লুকানো আছে + \'আপনার পছন্দ হতে পারে\' বিভাগ দেখানো আছে YouTube Doodles छिपाएँ লোগোতে YouTube Doodles অ্যানিমেশন লুকানো আছে লোগোতে YouTube Doodles অ্যানিমেশন দেখানো হয় - "YouTube Doodles প্রতি বছর কয়েক দিনের জন্য দেখানো হয়। - -আপনার অঞ্চলে যদি কোনও Doodle বর্তমানে দেখানো হচ্ছে এবং এই লুকানো সেটিং চালু থাকে, তাহলে সার্চ বারের নীচে ফিল্টার বারটিও লুকানো থাকবে।" চ্যানেল বার লুকান চ্যানেল বার লুকিয়ে রয়েছে চ্যানেল বার প্রদর্শিত হয়েছে @@ -307,10 +337,15 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ তথ্য প্যানেল লুকিয়ে রয়েছে তথ্য প্যানেল প্রদর্শিত হয়েছে + This button usually appears in the video player for certain videos. --> যোগদান বোতাম লুকান যোগদান বোতামটি লুকানো আছে যোগদান বোতামটি দেখানো হয়েছে + + \'লাইভ চ্যাট রিপ্লে\' বোতাম লুকান + প্লেয়ার ওভারলেতে লাইভ চ্যাট রিপ্লে বোতাম লুকানো আছে + প্লেয়ার ওভারলেতে লাইভ চ্যাট রিপ্লে বোতাম দেখানো আছে মেডিকেল প্যানেল লুকান মেডিকেল প্যানেল লুকিয়ে রয়েছে মেডিকেল প্যানেল প্রদর্শিত হয়েছে @@ -326,6 +361,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ সময় অনুযায়ী প্রতিক্রিয়া লুকান সময় অনুযায়ী প্রতিক্রিয়া লুকিয়ে রয়েছে সময় অনুযায়ী প্রতিক্রিয়া প্রদর্শিত হয়েছে + ভিডিওর শিরোনাম লুকান + প্লেয়ার ওভারলেতে ভিডিওর শিরোনাম লুকানো আছে + প্লেয়ার ওভারলেতে ভিডিওর শিরোনাম দেখানো আছে \'AI-জেনারেটেড ভিডিও সারসংক্ষেপ\' লুকান এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ লুকানো আছে এআই-জেনারেটেড ভিডিও সারাংশ বিভাগ দেখানো হয়েছে @@ -338,33 +376,62 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ অধ্যায় লুকান চ্যাপ্টার বিভাগ লুকিয়ে রয়েছে চ্যাপ্টার বিভাগ প্রদর্শিত হয়েছে - \'How this content was made\' লুকান - How this content was made বিভাগটি লুকানো আছে - How this content was made বিভাগটি দেখানো হয়েছে - হাইপ পয়েন্ট লুকান - হাইপ পয়েন্ট লুকানো আছে - হাইপ পয়েন্ট দেখানো আছে + \'কোর্স অগ্রগতি\' লুকান + কোর্স অগ্রগতি বিভাগ লুকানো আছে + কোর্স অগ্রগতি বিভাগ দেখানো আছে + এক্সপ্লোর লুকান + এই কোর্সটি এক্সপ্লোর করুন এবং পডকাস্ট বিভাগ এক্সপ্লোর করুন লুকানো আছে + এই কোর্সটি এক্সপ্লোর করুন এবং পডকাস্ট বিভাগ এক্সপ্লোর করুন দেখানো আছে + \'এই কোর্সটি এক্সপ্লোর করুন\' লুকান + এই কোর্সটি এক্সপ্লোর করুন বিভাগ লুকানো আছে + এই কোর্সটি এক্সপ্লোর করুন বিভাগ দেখানো আছে + \'Explore the podcast\' লুকান + Explore the podcast বিভাগটি লুকানো আছে + Explore the podcast বিভাগটি দেখানো হয়েছে \'Explore the podcast\' লুকান Explore the podcast বিভাগটি লুকানো আছে Explore the podcast বিভাগটি দেখানো হয়েছে ফিচার লিঙ্ক লুকান বিশেষ লিঙ্ক বিভাগ লুকানো আছে বিশেষ লিঙ্ক বিভাগ দেখানো আছে + \'বৈশিষ্ট্যযুক্ত স্থান\' লুকান + বৈশিষ্ট্যযুক্ত স্থান বিভাগ লুকানো আছে + বৈশিষ্ট্যযুক্ত স্থান বিভাগ দেখানো আছে বিশেষ ভিডিও লুকান বিশেষ ভিডিও বিভাগ লুকানো আছে বিশেষ ভিডিও বিভাগ দেখানো আছে + ফিড ফ্লাইআউট মেনু ফিল্টার সক্রিয় করুন + ফিড ফ্লাইআউট মেনু ফিল্টার সক্রিয় আছে + ফিড ফ্লাইআউট মেনু ফিল্টার নিষ্ক্রিয় আছে + ফিড ফ্লাইআউট মেনু ফিল্টার + ফিল্টার করার জন্য ফ্লাইআউট মেনুর নামগুলি প্রবেশ করান, প্রতি লাইনে একটি + গেমিং লুকান + গেমিং বিভাগ লুকানো আছে + গেমিং বিভাগ দেখানো আছে + \'How this content was made\' লুকান + How this content was made বিভাগটি লুকানো আছে + How this content was made বিভাগটি দেখানো হয়েছে + হাইপ পয়েন্ট লুকান + হাইপ পয়েন্ট লুকানো আছে + হাইপ পয়েন্ট দেখানো আছে তথ্য কার্ড লুকান তথ্য কার্ড সেকশন লুকিয়ে রয়েছে তথ্য কার্ড সেকশন প্রদর্শিত হয়েছে \'Key concepts\' লুকান Key concepts বিভাগটি লুকানো আছে Key concepts বিভাগটি দেখানো হয়েছে + মিউজিক লুকান + মিউজিক বিভাগ লুকানো আছে + মিউজিক বিভাগ দেখানো আছে সাবস্ক্রাইব বোতাম লুকান সাবস্ক্রাইব বোতাম লুকানো আছে সাবস্ক্রাইব বোতাম দেখানো আছে নথি লুকান ট্রান্সস্ক্রিপ্ট বিভাগ লুকিয়ে রয়েছে ট্রান্সস্ক্রিপ্ট বিভাগ প্রদর্শিত হয়েছে + কুইজ লুকান + কুইজ বিভাগ লুকানো আছে + কুইজ বিভাগ দেখানো আছে ভিডিওর বিবরণ ভিডিও বিবরণ এর উপাদান লুকান বা প্রদর্শন করুন ফিল্টার বার @@ -383,6 +450,11 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ দেখার ইতিহাসে দেখানো হয়েছে চ্যানেল পৃষ্ঠা চ্যানেল পৃষ্ঠার উপাদানগুলি লুকান বা দেখান + চ্যানেল ট্যাব ফিল্টার সক্রিয় করুন + চ্যানেল ট্যাব ফিল্টার সক্রিয় আছে + চ্যানেল ট্যাব ফিল্টার নিষ্ক্রিয় আছে + চ্যানেল ট্যাব ফিল্টার + ফিল্টার করার জন্য চ্যানেল ট্যাবের নামগুলি প্রবেশ করান, প্রতি লাইনে একটি কমিউনিটি বোতাম লুকান কমিউনিটি বোতাম লুকানো আছে @@ -446,15 +518,15 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ফিড এবং অনুসন্ধানের ফলাফলে দেখার সংখ্যা দেখানো আছে "সীমাবদ্ধতা: -• Shorts শেল্ফ, চ্যানেল পেজ এবং অনুসন্ধানের ফলাফলে এখনও দেখার সংখ্যা দেখানো হতে পারে -• এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না" +• Shorts শেল্ফ, চ্যানেল পেজ এবং অনুসন্ধানের ফলাফলে এখনও দেখার সংখ্যা দেখানো হতে পারে। +• এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না।" আপলোডের সময় লুকান আপলোডের সময় ফিড এবং সার্চ ফলাফলে লুকানো আছে আপলোডের সময় ফিড এবং সার্চ ফলাফলে দেখানো আছে "সীমাবদ্ধতা: -• Shorts শেলফ, চ্যানেল পেজ এবং সার্চ ফলাফলে এখনও আপলোডের সময় দেখানো হতে পারে -• এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না" +• Shorts শেলফ, চ্যানেল পেজ এবং সার্চ ফলাফলে এখনও আপলোডের সময় দেখানো হতে পারে। +• এই বৈশিষ্ট্যটি অটোমোটিভ ফর্ম ফ্যাক্টরের সাথে কাজ করে না।" কীওয়ার্ড কনটেন্ট লুকান কীওয়ার্ড ফিল্টার ব্যবহার করে অনুসন্ধান এবং ফিড ভিডিও লুকান কীওয়ার্ড ব্যবহার করে প্রধান পাতার ভিডিও লুকান @@ -477,10 +549,10 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ কীওয়ার্ড ফিল্টারিং সম্পর্কে "হোম / সাবস্ক্রিপশন / অনুসন্ধানের ফলাফলগুলি কিওয়ার্ড বাক্যাংশের সাথে মিলে যাওয়া সামগ্রী লুকানোর জন্য ফিল্টার করা হয় -সীমাবদ্ধতা +সীমাবদ্ধতা: • চ্যানেলের নাম দ্বারা Shorts লুকানো যাবে না • কিছু UI উপাদান লুকানো নাও হতে পারে -• কোনও কিওয়ার্ড অনুসন্ধান করলে কোনও ফলাফল নাও দেখাতে পারে" +• কোনো কিওয়ার্ড অনুসন্ধান করলে কোনো ফলাফল নাও দেখাতে পারে" সম্পূর্ণ শব্দ মেলাও ডাবল কোটের মধ্যে একটি কীওয়ার্ড/ফ্রেজ রাখলে ভিডিও শিরোনাম এবং চ্যানেলের নামের আংশিক মিল সনাক্ত করা বন্ধ হয়ে যাবে<br><br>উদাহরণস্বরূপ,<br><b>\"ai\"</b> ভিডিওটি লুকিয়ে দেবে: <b>How does AI work?</b><br>কিন্তু লুকিয়ে দেবে না: <b>What does fair use mean?</b> @@ -492,19 +564,12 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ কিওয়ার্ড সমস্ত ভিডিও লুকিয়ে রাখবে: %s - ক্রিয়েটর স্টোর শেল্ফ লুকান - ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেলফ লুকানো আছে - ভিডিও প্লেয়ারের নিচে ক্রিয়েটর স্টোর শেল্ফ দেখানো হয় শেষ পর্দার স্টোর ব্যানার লুকান এন্ড স্ক্রিন স্টোর ব্যানার লুকানো আছে এন্ড স্ক্রিন স্টোর ব্যানার দেখানো হয়েছে পূর্ণ স্ক্রীন প্যানেল লুকান - "পূর্ণ পর্দার বিজ্ঞাপন লুকানো হয় - -এই বৈশিষ্ট্যটি কেবল পুরনো ডিভাইসের জন্য উপলব্ধ" + পূর্ণ স্ক্রীন বিজ্ঞাপন লুকানো আছে পূর্ণ স্ক্রীন বিজ্ঞাপন প্রদর্শিত হয়েছে - - পূর্ণস্ক্রীন বিজ্ঞাপন লুকানো পুরোনো ডিভাইসে কাজ করে সাধারণ বিজ্ঞাপন লুকান সাধারণ বিজ্ঞাপন লুকিয়ে রয়েছে সাধারণ বিজ্ঞাপন প্রদর্শিত হয়েছে @@ -514,6 +579,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকান অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার লুকিয়ে রয়েছে অর্থের বিনিময়ে প্রচার অন্তর্ভুক্ত রয়েছে ব্যানার প্রদর্শিত হয়েছে + প্লেয়ার পপআপ বিজ্ঞাপন লুকান + প্লেয়ার পপআপ বিজ্ঞাপন লুকানো আছে + প্লেয়ার পপআপ বিজ্ঞাপন দেখানো আছে স্ব-স্পন্সর কার্ড লুকান স্ব-স্পন্সর কার্ড লুকিয়ে রয়েছে স্ব-স্পন্সর কার্ড প্রদর্শিত হয়েছে @@ -521,23 +589,18 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ভিডিও বিবরণে কেনাকাটার লিঙ্ক লুকানো আছে ভিডিও বর্ণনায় কেনাকাটার লিঙ্ক দেখানো হয় \'পণ্য দেখুন\' ব্যানার লুকান - ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার লুকানো আছে - ভিডিও ওভারলেতে \"পণ্য দেখুন\" ব্যানার দেখানো হয়েছে - লোকেরা এইগুলিও সার্চ করছে লুকান - লোকেরা এইগুলিও সার্চ করছে লুকিয়ে রয়েছে - লোকেরা এইগুলিও সার্চ করছে প্রদর্শিত হয়েছে - - - YouTube প্রিমিয়াম প্রচারণা লুকান - ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা লুকিয়ে রয়েছে - ভিডিওর নিচের YouTube প্রিমিয়াম প্রচারণা প্রদর্শিত হয়েছে + প্লেয়ার ওভারলেতে পণ্য ব্যানার লুকানো আছে + প্লেয়ার ওভারলেতে পণ্য ব্যানার দেখানো আছে + YouTube প্রিমিয়াম প্রচারণা লুকান + YouTube প্রিমিয়াম প্রচারণা লুকানো আছে + YouTube প্রিমিয়াম প্রচারণা দেখানো আছে ভিডিও বিজ্ঞাপন লুকান ভিডিও বিজ্ঞাপন লুকিয়ে রয়েছে ভিডিও বিজ্ঞাপন প্রদর্শিত হয়েছে - + ক্লিপবোর্ডে URL অনুলিপি করা হয়েছে টাইমস্ট্যাম্প সহ URL অনুলিপি করা হয়েছে ভিডিও URL অনুলিপি বোতাম দেখান @@ -553,10 +616,10 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ডায়ালগ প্রদর্শিত হবে এটি বয়সের সীমাবদ্ধতাকে বাইপাস করে না। এটা শুধু স্বয়ংক্রিয়ভাবে গ্রহণ করে। - - \'টিভি-তে সাইন ইন করুন\' পপআপ নিষ্ক্রিয় করুন - টিভিতে সাইন ইন পপআপ অক্ষম করা হয়েছে - টিভিতে সাইন ইন পপআপ সক্ষম করা হয়েছে + + \'টিভি-তে সাইন ইন করুন\' পপআপ নিষ্ক্রিয় করুন + টিভিতে সাইন ইন পপআপ অক্ষম করা হয়েছে + টিভিতে সাইন ইন পপআপ সক্ষম করা হয়েছে ডাবল ট্যাপ অধ্যায় স্কিপ অক্ষম করুন @@ -589,10 +652,10 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ অঙ্গভঙ্গি নিষ্ক্রিয় করা হয়েছে অঙ্গভঙ্গি সক্রিয় করা হয়েছে - - ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা সক্রিয় করুন - ট্যাপ করে খোঁজা সক্রিয় করা হয়েছে - ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা নিষ্ক্রিয় করা হয়েছে + + ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা সক্রিয় করুন + ট্যাপ করে খোঁজা সক্রিয় করা হয়েছে + ভিডিওর নির্দিষ্ট অংশে যেতে ট্যাপ করা নিষ্ক্রিয় করা হয়েছে উজ্জ্বলতার সোয়াইপ অঙ্গভঙ্গি সক্রিয় করুন @@ -673,7 +736,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ মন্তব্য বোতাম লুকানো আছে মন্তব্য বোতাম দেখানো আছে + This button usually appears on live streamed videos. --> Report লুকান রিপোর্ট বাটন লুকিয়ে রয়েছে রিপোর্ট বাটন প্রদর্শিত @@ -686,7 +749,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ডাউনলোড বোতাম লুকানো আছে ডাউনলোড বোতাম দেখানো হয়েছে + This button usually appears on videos uploaded by the logged-in user. --> হাইপ লুকান হাইপ বোতাম লুকানো আছে হাইপ বাটন দেখানো হয়েছে @@ -699,7 +762,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ধন্যবাদ বোতাম লুকানো আছে ধন্যবাদ বোতাম দেখানো হয় + This button usually appears if the user IP is from a specific region such as the USA or EU. --> জিজ্ঞাসা লুকান জিজ্ঞাসা বোতাম লুকানো আছে জিজ্ঞাসা বোতাম দেখানো হয়েছে @@ -707,6 +770,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ক্লিপ লুকান ক্লিপ বোতাম লুকিয়ে রয়েছে ক্লিপ বোতাম প্রদর্শিত হয়েছে + কিছু ব্যবহারকারীর অ্যাকাউন্টের জন্য লুকানো কাজ নাও করতে পারে। শপ লুকান শপ বাটন লুকানো আছে @@ -716,13 +780,13 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ সংরক্ষণ বোতাম লুকানো আছে সংরক্ষণ বোতাম দেখানো হচ্ছে - + নেভিগেশন বোতাম - নেভিগেশন বারে বোতাম লুকান বা পরিবর্তন করুন + নেভিগেশন বারের বোতামগুলি লুকান বা পরিবর্তন করুন হোম লুকান হোম বোতাম লুকানো আছে - হোম বোতাম দেখানো হয় + হোম বোতাম দেখানো আছে Shorts লুকান Shorts বোতাম লুকিয়ে রয়েছে @@ -740,26 +804,44 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ বিজ্ঞপ্তি বোতাম দেখানো হয়েছে তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করুন - "তৈরি বোতামটি বিজ্ঞপ্তি বোতামের সাথে পরিবর্তন করা হয় - -মনে রাখবেন: এটি সক্রিয় করা ভিডিও বিজ্ঞাপনগুলিও জোর করে লুকিয়ে দেয়" + তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করা হয়েছে তৈরি বোতামকে বিজ্ঞপ্তি বোতাম দ্বারা সুইচ করা হয়নি - "এই সেটিংস নিষ্ক্রিয় করলে Shorts বিজ্ঞাপন ব্লকিংও নিষ্ক্রিয় হয়ে যাবে। - -যদি এই সেটিংস পরিবর্তন করার পরে কাজ না করে, তাহলে Incognito মোডে চেষ্টা করুন।" - নেভিগেশন বোতাম লেবেল লুকান - লেবেল লুকিয়ে রয়েছে - লেবেল প্রদর্শিত হয়েছে + যদি এই সেটিং পরিবর্তন কার্যকর না হয়, তবে ছদ্মবেশী মোডে স্যুইচ করার চেষ্টা করুন। + নেভিগেশন বোতামের লেবেলগুলি লুকান + লেবেলগুলি লুকানো আছে + লেবেলগুলি দেখানো আছে + সংকীর্ণ নেভিগেশন বোতাম সক্রিয় করুন + নেভিগেশন বোতামের মধ্যে ব্যবধান সংকীর্ণ + নেভিগেশন বোতামের মধ্যে ব্যবধান স্বাভাবিক + নেভিগেশন বার অ্যানিমেশন সক্রিয় করুন + নেভিগেশন ট্রানজিশনগুলি অ্যানিমেটেড + নেভিগেশন ট্রানজিশনগুলি অ্যানিমেটেড নয় অর্ধস্বচ্ছ স্থিতি বার নিষ্ক্রিয় করুন স্ট্যাটাস বারটি অস্বচ্ছ স্ট্যাটাস বারটি অস্বচ্ছ বা স্বচ্ছ - কিছু ডিভাইসে, এই বৈশিষ্ট্যটি সক্ষম করলে সিস্টেম নেভিগেশন বার স্বচ্ছ হয়ে যেতে পারে। + "সীমাবদ্ধতা: +• ভিডিও প্লেয়ারের উপরে একটি কালো বার প্রদর্শিত হতে পারে। +• কিছু ডিভাইসে, এই বৈশিষ্ট্যটি সক্ষম করলে সিস্টেম নেভিগেশন বারটি স্বচ্ছ হতে পারে।" অর্ধস্বচ্ছ হালকা বার নিষ্ক্রিয় করুন হালকা মোড নেভিগেশন বার অস্বচ্ছ লাইট মোড ন্যাভিগেশন বারটি অস্বচ্ছ বা স্বচ্ছ গাঢ় স্বচ্ছ বার অক্ষম করুন গাঢ় মোড নেভিগেশন বার অস্বচ্ছ গাঢ় মোড ন্যাভিগেশন বারটি অস্বচ্ছ বা স্বচ্ছ + টুলবার + টুলবারের উপাদানগুলি লুকান বা পরিবর্তন করুন + তৈরি বোতাম লুকান + তৈরি বোতাম লুকানো আছে + ক্রিয়েট বাটন প্রদর্শিত হয়েছে + বিজ্ঞপ্তি বোতাম লুকান + বিজ্ঞপ্তি বোতাম লুকানো আছে + বিজ্ঞপ্তি বোতাম দেখানো হয়েছে + অনুসন্ধান বোতাম লুকান + অনুসন্ধান বোতাম লুকানো আছে + অনুসন্ধান বোতাম দেখানো আছে। + প্রশস্ত অনুসন্ধান বার সক্রিয় করুন + প্রশস্ত অনুসন্ধান বার সক্রিয় হয়েছে + প্রশস্ত অনুসন্ধান বার নিষ্ক্রিয় হয়েছে ফ্লাইআউট মেনু @@ -834,6 +916,12 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ কাস্ট বোতামটি লুকান কাস্ট বাটন লুকিয়ে রয়েছে কাস্ট বাটন প্রদর্শিত হয়েছে + সংকুচিত বোতাম লুকান + সংকুচিত বোতাম লুকানো আছে + সংকুচিত বোতাম দেখানো আছে + পূর্ণস্ক্রিন বোতাম লুকান + পূর্ণস্ক্রিন বোতাম লুকানো আছে + পূর্ণস্ক্রিন বোতাম দেখানো আছে প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড লুকান প্লেয়ার নিয়ন্ত্রণের পটভূমি লুকানো আছে প্লেয়ার কন্ট্রোল ব্যাকগ্রাউন্ড দেখানো হয়েছে @@ -842,9 +930,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ বোতাম দেখানো হয় - শেষ স্ক্রীন কার্ড লুকান - শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে - শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে + শেষ স্ক্রীন কার্ড লুকান + শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে + শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে ফুলস্ক্রিনে অ্যাম্বিয়েন্ট মোডটি অক্ষম করুন @@ -869,10 +957,16 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ ভিডিও থাম্বনেইল সিকবার লুকান ভিডিও থাম্বনেইল সিকবার লুকানো আছে ভিডিও থাম্বনেইল সিকবার দেখানো হয়েছে + পূর্ণস্ক্রিন বড় সিকবার সক্রিয় করুন + পূর্ণস্ক্রিন সিকবার বড় আকারের + পূর্ণস্ক্রিন সিকবার স্বাভাবিক আকারের Shorts প্লেয়ার Shorts প্লেয়ারের উপাদান লুকান বা দেখান + চ্যানেল পৃষ্ঠায় Shorts লুকান + চ্যানেল পৃষ্ঠায় লুকানো আছে + চ্যানেল পৃষ্ঠায় দেখানো আছে হোম ফিডে Shorts লুকান হোম ফিড এবং সম্পর্কিত ভিডিওতে লুকানো আছে @@ -884,9 +978,18 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ সাবস্ক্রিপশনস ফিডে Shorts লুকান সাবস্ক্রিপশনস ফিডে লুকানো আছে সাবস্ক্রিপশনস ফিডে দেখানো হয়েছে + ভিডিওর বিবরণে Shorts লুকান + ভিডিওর বিবরণে লুকানো আছে + ভিডিওর বিবরণে দেখানো আছে Shortsগুলিকে ওয়াচ ইতিহাসে লুকান ওয়াচ হিস্ট্রিতে লুকানো ওয়াচ ইতিহাসে দেখানো + AI বোতাম লুকান + AI বোতাম লুকানো আছে + AI বোতাম দেখানো আছে + \'স্বয়ংক্রিয়-ডাবড\' লেবেল লুকান + স্বয়ংক্রিয় ডাব করা লেবেল লুকানো হয়েছে + স্বয়ংক্রিয় ডাব করা লেবেল দেখা যাচ্ছে \'স্বয়ংক্রিয়-ডাবড\' লেবেল লুকান স্বয়ংক্রিয় ডাব করা লেবেল লুকানো হয়েছে স্বয়ংক্রিয় ডাব করা লেবেল দেখা যাচ্ছে @@ -948,6 +1051,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ \'এই টেমপ্লেট ব্যবহার করুন\' বোতাম লুকান এই টেমপ্লেট বাটনটি লুকানো আছে \"এই টেমপ্লেট ব্যবহার করুন\" বোতামটি দেখানো হয়েছে + লাইক বোতাম ফাউন্টেন অ্যানিমেশনটি লুকান পছন্দ বোতাম ঝর্ণা অ্যানিমেশন লুকিয়ে রয়েছে পছন্দ বোতাম ঝর্ণা অ্যানিমেশন প্রদর্শিত হয়েছে @@ -990,8 +1094,13 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ নেভিগেশন বার লুকিয়ে রয়েছে পনেভিগেশন বার প্রদর্শিত হয়েছে - - শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো হবে + + অটো প্লে পূর্বরূপ লুকান + অটো প্লে পূর্বরূপ লুকানো আছে + অটো প্লে পূর্বরূপ দেখানো আছে + + + শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকান "অটো প্লে বন্ধ থাকলে শেষ স্ক্রীনে প্রস্তাবিত ভিডিও লুকানো থাকে YouTube সেটিংসে অটো প্লে পরিবর্তন করা যেতে পারে: @@ -1009,9 +1118,9 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন সময়স্ট্যাম্প প্রদর্শিত হয়েছে - প্লেয়ার পপআপ প্যানেলগুলো লুকান - প্লেয়ার পপআপ প্যানেলগুলো লুকিয়ে রয়েছে - প্লেয়ার পপআপ প্যানেলগুলো প্রদর্শিত হয়েছে + প্লেয়ার পপআপ প্যানেলগুলো লুকান + প্লেয়ার পপআপ প্যানেলগুলো লুকিয়ে রয়েছে + প্লেয়ার পপআপ প্যানেলগুলো প্রদর্শিত হয়েছে ভিডিও শেষ হওয়ার সময় পূর্ণ পর্দা মোড থেকে বেরিয়ে যান @@ -1079,24 +1188,6 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন %d বার ক্লায়েন্ট রেট লিমিট এর সম্মুখীন হয়েছে %d মিলিসেকেন্ড - - প্রশস্ত অনুসন্ধান বার সক্রিয় করুন - প্রশস্ত অনুসন্ধান বার সক্রিয় হয়েছে - প্রশস্ত অনুসন্ধান বার নিষ্ক্রিয় হয়েছে - - - উচ্চমানের থাম্বনেইল সক্ষম করুন - সিকবার থাম্বনেইল উচ্চমানের - সিকবার থাম্বনেইল মাঝারিমানের - "এটি সেই লাইভস্ট্রিমগুলিতে থাম্বনেইল পুনরুদ্ধার করবে যেখানে সিকবার থাম্বনেইল নেই। - -সিকবার থাম্বনেইল বর্তমান ভিডিওর একই মান ব্যবহার করবে। - -এই বৈশিষ্ট্যটি 720p অথবা তার চেয়ে কম ভিডিও মান এবং খুব দ্রুত ইন্টারনেট সংযোগ ব্যবহার করার সময় সবচেয়ে ভালো কাজ করে।" - পুরোনো সিকবার থাম্বনেইল পুনরুদ্ধার করুন - সিকবার এর উপরে সিকবার থাম্বনেইল দেখানো হবে - পূর্ণস্ক্রীণে সিকবার থাম্বনেইল দেখানো হবে - SponsorBlock সক্রিয় করুন SponsorBlock হল YouTube ভিডিওর বিরক্তিকর অংশগুলি স্কিপ করার জন্য একটি ক্রাউডসোর্সড সিস্টেম @@ -1196,7 +1287,7 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন অপ্রাসঙ্গিক / কৌতুক পার্শ্বীয় দৃশ্য বা কৌতুক যা ভিডিওর মূল বিষয়বস্তু বোঝার জন্য অপরিহার্য নয়। প্রসঙ্গ বা পটভূমি বিশদ প্রদানকারী অংশগুলি অন্তর্ভুক্ত নয়। সঙ্গীত: সঙ্গীতবিহীন অংশ - শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়। + শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনো বিভাগ দ্বারা আচ্ছাদিত নয়। এড়িয়ে যান লক্ষণীয় করা স্পন্সর এড়িয়ে যান @@ -1336,8 +1427,6 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন স্পুফ অ্যাপ সংস্করণ লক্ষ্য 20.13.41 - প্রসারিত নয় এমন ভিডিও অ্যাকশন বার পুনরুদ্ধার করুন 20.05.46 - প্রতিলিপি কার্যকারিতা পুনরুদ্ধার করুন - 19.35.36 - পুরনো Shorts প্লেয়ার আইকন পুনরুদ্ধার করুন - 19.01.34 - পুরনো নেভিগেশন আইকন পুনরুদ্ধার করুন শুরুর পৃষ্ঠা পরিবর্তন করুন @@ -1442,8 +1531,9 @@ Miniplayer স্ক্রিন থেকে বামে বা ডানে লোডিং স্ক্রিণে একটি গ্রেডিয়েন্ড ব্যাকগ্রাউন্ড থাকবে লোডিং স্ক্রিণে একটি সলিড ব্যাকগ্রাউন্ড থাকবে স্প্ল্যাশ স্ক্রিন শৈলী - রং - কালো এবং সাদা + নিষ্ক্রিয় হয়েছে + রং + কালো এবং সাদা সিকবারে নিজস্ব রং সক্রিয় করুন সিকবারে নিজস্ব রং প্রদর্শিত হয়েছে সিকবারে মূল রং প্রদর্শিত হয়েছে @@ -1548,6 +1638,9 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট সীক আনডু কম্পন নিষ্ক্রিয় করুন সীক আনডু কম্পন নিষ্ক্রিয় করা হয়েছে সীক আনডু কম্পন সক্রিয় করা হয়েছে + ট্যাপ করে ধরে রাখার হ্যাপিটিক্স নিষ্ক্রিয় করুন + ট্যাপ করে ধরে রাখার হ্যাপিটিক্স নিষ্ক্রিয় করা হয়েছে + ট্যাপ করে ধরে রাখার হ্যাপিটিক্স সক্রিয় করা হয়েছে জুম করার কম্পন নিষ্ক্রিয় করুন জুম করার কম্পন নিষ্ক্রিয় করা হয়েছে জুম করার কম্পন সক্রিয় করা হয়েছে @@ -1643,6 +1736,11 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট উন্নত ভিডিও গুণমান মেনু দেখানো হয়েছে উন্নত ভিডিও গুণমান মেনু দেখানো হয়নি + + প্রিমিয়াম কোয়ালিটি অপশন লুকান + প্রিমিয়াম কোয়ালিটি অপশন লুকানো আছে + প্রিমিয়াম কোয়ালিটি অপশন দেখানো আছে + ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করুন ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়েছে @@ -1674,6 +1772,7 @@ AV1 সহ ভিডিও প্লেব্যাক আটকে যেতে + সম্পর্কে বিজ্ঞাপন সাধারণ diff --git a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml index 76d0bdac9e..738ac7935b 100644 --- a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml +++ b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Onemogući podebljane ikone + Ikone nisu podebljane + Ikone su podebljane + GmsCore + Postavke vezane za GmsCore + Provjeri ažuriranja za GmsCore + Provjera ažuriranja je omogućena + Provjera ažuriranja je onemogućena + Otvori GmsCore postavke + Postavke GmsCore-a + MicroG GmsCore nije instaliran. Instaliraj ga. + Potrebna akcija + Neuspješna provjera ažuriranja za MicroG GmsCore + Dostupna je nova verzija (%1$s) MicroG GmsCore. Trenutno koristite verziju %2$s. + "MicroG GmsCore nema dozvolu za rad u pozadini. + +Slijedite upute \"Ne ubijaj moju aplikaciju\" za vaš telefon i primijenite ih na vašu MicroG instalaciju. + +Ovo je potrebno za rad aplikacije." + Otvori web stranicu + Poništi + "Optimizacije baterije MicroG GmsCore-a moraju biti onemogućene kako bi se spriječili problemi. + +Onemogućavanje optimizacija baterije za MicroG neće negativno uticati na potrošnju baterije. + +Dodirnite dugme Nastavi i dozvolite promjene optimizacije." + Nastavi - + + Ponovo pokrenite aplikaciju za korištenje ove funkcije + Zabilježi protokol bafera + Dnevnik otklanjanja grešaka uključuje proto bafer + Dnevnik otklanjanja grešaka ne uključuje proto bafer + "Omogućavanje ove postavke će bilježiti dodatne podatke o rasporedu, uključujući tekst na ekranu za neke UI komponente. + +Ovo može pomoći u identifikaciji komponenti prilikom kreiranja prilagođenih filtera. + +Međutim, omogućavanjem ovoga će se bilježiti i neki korisnički podaci kao što je vaša IP adresa." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Sakrij policu trgovine za kreatore + Polica trgovine za kreatore ispod video playera je skrivena + Polica trgovine za kreatore ispod video playera je prikazana + Sakrij odjeljak s komentarima ispod videa u početnom feedu + Odjeljak s komentarima ispod videa u početnom feedu je skriven + Odjeljak s komentarima ispod videa u početnom feedu je prikazan + + Sakrij dugme \'Najnoviji videozapisi\' + Dugme Najnoviji videozapisi je skriveno + Dugme Najnoviji videozapisi je prikazano + + Sakrij rezultate web pretrage + Rezultati web pretrage su skriveni + Rezultati web pretrage su prikazani + Sakrij odjeljak \'Možda vam se sviđa\' + Odjeljak \'Možda vam se sviđa\' je skriven + Odjeljak \'Možda vam se sviđa\' je prikazan + This button usually appears in the video player for certain videos. --> + + Sakrij dugme \'Ponovljena reprodukcija chata uživo\' + Dugme za ponovnu reprodukciju chata uživo u prekrivaču playera je skriveno + Dugme za ponovnu reprodukciju chata uživo u prekrivaču playera je prikazano + Sakrij naslov videozapisa + Naslov videozapisa u prekrivaču playera je skriven + Naslov videozapisa u prekrivaču playera je prikazan + Sakrij \'Napredak kursa\' + Odjeljak Napredak kursa je skriven + Odjeljak Napredak kursa je prikazan + Sakrij Istraži + Odjeljci Istražite ovaj kurs i Istražite podcast su skriveni + Odjeljci Istražite ovaj kurs i Istražite podcast su prikazani + Sakrij \'Istražite ovaj kurs\' + Odjeljak Istražite ovaj kurs je skriven + Odjeljak Istražite ovaj kurs je prikazan + Sakrij \'Istražite podcast\' + Odjeljak Istražite podcast je skriven + Odjeljak Istražite podcast je prikazan + Sakrij \'Istaknuta mjesta\' + Odjeljak Istaknuta mjesta je skriven + Odjeljak Istaknuta mjesta je prikazan + Omogući filter padajućeg menija feeda + Filter padajućeg menija feeda je omogućen + Filter padajućeg menija feeda je onemogućen + Filter padajućeg menija feeda + Unesite nazive padajućih menija za filtriranje, po jedan u svakom redu + Sakrij Gaming + Odjeljak Gaming je skriven + Odjeljak Gaming je prikazan + Sakrij Muziku + Odjeljak Muzika je skriven + Odjeljak Muzika je prikazan + Sakrij Kvizove + Odjeljak Kvizovi je skriven + Odjeljak Kvizovi je prikazan + Omogući filter kartice kanala + Filter kartice kanala je omogućen + Filter kartice kanala je onemogućen + Filter kartice kanala + Unesite nazive kartica kanala za filtriranje, po jedan u svakom redu + "Ograničenja: +• Police za Shorts, stranice kanala i rezultati pretrage i dalje mogu prikazivati preglede. +• Ova funkcija ne radi s automobilskim faktorom oblika." + "Ograničenja: +• Police za Shorts, stranice kanala i rezultati pretrage i dalje mogu prikazivati vremena otpremanja. +• Ova funkcija ne radi s automobilskim faktorom oblika." + "Početna/Pretplate/Rezultati pretrage su filtrirani kako bi sakrili sadržaj koji odgovara ključnim frazama + +Ograničenja: +• Shorts se ne mogu sakriti po nazivu kanala +• Neki UI elementi možda neće biti skriveni +• Pretraga ključne riječi možda neće pokazati rezultate" - + Oglasi preko cijelog ekrana su skriveni + Sakrij skočne oglase playera + Skočni oglasi playera su skriveni + Skočni oglasi playera su prikazani + Banner \'Prikaži proizvode\' u prekrivaču playera je skriven + Banner \'Prikaži proizvode\' u prekrivaču playera je prikazan + Sakrij YouTube Premium promocije + YouTube Premium promocije su skrivene + YouTube Premium promocije su prikazane - - + + URL kopiran u međuspremnik + URL sa vremenskom oznakom kopiran + Prikaži dugme za kopiranje URL-a videozapisa + Dugme za kopiranje URL-a videozapisa je prikazano. Dodirnite za kopiranje URL-a videozapisa. Dodirnite i držite za kopiranje sa vremenskom oznakom + Dugme za kopiranje URL-a videozapisa nije prikazano + Prikaži dugme za kopiranje URL-a vremenske oznake + Dugme za kopiranje URL-a vremenske oznake je prikazano. Dodirnite za kopiranje URL-a videozapisa sa vremenskom oznakom. Dodirnite i držite za kopiranje bez vremenske oznake + Dugme za kopiranje URL-a vremenske oznake nije prikazano + - + + Onemogući skočni prozor \'Prijavi se na TV\' + Skočni prozor Prijavi se na TV je onemogućen + Skočni prozor Prijavi se na TV je omogućen + - + + Omogući dodir za pretraživanje + Dodir za pretraživanje je omogućen + Dodir za pretraživanje je onemogućen + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Skrivanje možda neće raditi za neke korisničke račune. - + + Dugmad za navigaciju + Sakrij ili promijeni dugmad navigacijske trake + Sakrij Početnu + Dugme Početna je skriveno + Dugme Početna je prikazano + Sakrij Shorts + Dugme Shorts je skriveno + Dugme Shorts je prikazano + Sakrij Kreiraj + Dugme Kreiraj je skriveno + Dugme Kreiraj je prikazano + Sakrij Pretplate + Dugme Pretplate je skriveno + Dugme Pretplate je prikazano + Sakrij Obavještenja + Dugme Obavještenja je skriveno + Dugme Obavještenja je prikazano + Zamijeni Kreiraj sa Obavještenjima + Dugme Kreiraj je zamijenjeno sa dugmetom Obavještenja + Dugme Kreiraj nije zamijenjeno sa dugmetom Obavještenja + Ako promjena ove postavke nema efekta, pokušajte se prebaciti na anonimni način rada. + Sakrij oznake dugmadi za navigaciju + Oznake su skrivene + Oznake su prikazane + Omogući uska dugmad za navigaciju + Razmak između dugmadi za navigaciju je uzak + Razmak između dugmadi za navigaciju je normalan + Omogući animacije navigacijske trake + Tranzicije navigacije su animirane + Tranzicije navigacije nisu animirane + Onemogući prozirnu statusnu traku + Statusna traka je neprozirna + Statusna traka je neprozirna ili prozirna + "Ograničenja: +• Crna traka se može pojaviti na vrhu video playera. +• Na nekim uređajima, omogućavanje ove funkcije može promijeniti sistemsku navigacijsku traku u prozirnu." + Onemogući svijetlu prozirnu traku + Navigacijska traka u svijetlom načinu rada je neprozirna + Navigacijska traka u svijetlom načinu rada je neprozirna ili prozirna + Onemogući tamnu prozirnu traku + Navigacijska traka u tamnom načinu rada je neprozirna + Navigacijska traka u tamnom načinu rada je neprozirna ili prozirna + Traka sa alatima + Sakrij ili promijeni komponente trake sa alatima + Sakrij dugme Kreiraj + Dugme Kreiraj je skriveno + Dugme Kreiraj je prikazano + Sakrij dugme Obavještenja + Dugme Obavještenja je skriveno + Dugme Obavještenja je prikazano + Sakrij dugme Pretraga + Dugme Pretraga je skriveno + Dugme Pretraga je prikazano. + Omogući široku traku za pretraživanje + Široka traka za pretraživanje je omogućena + Široka traka za pretraživanje je onemogućena @@ -126,25 +315,67 @@ Second \"item\" text" + Sakrij dugme Skupi + Dugme Skupi je skriveno + Dugme Skupi je prikazano + Sakrij dugme preko cijelog ekrana + Dugme preko cijelog ekrana je skriveno + Dugme preko cijelog ekrana je prikazano + + + Sakrij kartice završnog ekrana + Kartice završnog ekrana su skrivene + Kartice završnog ekrana su prikazane - + Omogući veliku traku pretraživanja preko cijelog ekrana + Traka pretraživanja preko cijelog ekrana je velike veličine + Traka pretraživanja preko cijelog ekrana je normalne veličine + Sakrij Shorts na stranici kanala + Skriveno na stranici kanala + Prikazano na stranici kanala + Sakrij Shorts u opisu videozapisa + Skriveno u opisu videozapisa + Prikazano u opisu videozapisa + Sakrij AI dugme + AI dugme je skriveno + AI dugme je prikazano + Sakrij oznaku \'Automatski sinkronizirano\' + Oznaka Automatski sinkronizirano je skrivena + Oznaka Automatski sinkronizirano je prikazana + - + + Sakrij pregled automatske reprodukcije + Pregled automatske reprodukcije je skriven + Pregled automatske reprodukcije je prikazan + + + Sakrij predloženi videozapis na završnom ekranu + "Predloženi videozapis na završnom ekranu je skriven kada je automatska reprodukcija isključena + +Automatska reprodukcija se može promijeniti u postavkama YouTube-a: +Postavke → Reprodukcija → Automatska reprodukcija sljedećeg videozapisa" + Predloženi videozapis na završnom ekranu je prikazan + - + + Sakrij iskačuće panele plejera + Iskačući paneli plejera su skriveni + Iskačući paneli plejera su prikazani + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Samo za upotrebu u muzičkim videozapisima. Dijelovi muzičkih videozapisa bez muzike, koji već nisu pokriveni drugom kategorijom + Nije moguće poslati segment: %s + "Nije moguće poslati segment. +Već postoji" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Onemogućeno + Boja + Crno-bijelo + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Onemogući vibracije prilikom dodira i držanja + Vibracije prilikom dodira i držanja su onemogućene + Vibracije prilikom dodira i držanja su omogućene + @@ -200,6 +441,11 @@ Second \"item\" text" + + Sakrij Premium opcije kvaliteta + Premium opcije kvaliteta su skrivene + Premium opcije kvaliteta su prikazane + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 3a40645452..a9051ea13b 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Desactiva les icones en negreta + Les icones no estan en negreta + Les icones estan en negreta + GmsCore + Configuració relacionada amb GmsCore + Cerca actualitzacions de GmsCore + S\'ha activat la cerca d\'actualitzacions + La cerca d\'actualitzacions està deshabilitada + Obrir la configuració de GmsCore + Configuració de GmsCore + MicroG GmsCore no instal·lat. Instal·la\'l. + Acció necessària + No s\'ha pogut cercar actualitzacions de MicroG GmsCore + Una nova versió (%1$s) de MicroG GmsCore està disponible. Actualment, utilitzes la versió %2$s. + "MicroG GmsCore no té permís per executar-se en segon pla. + +Segueix la guia \"Don't kill my app\" per al teu telèfon i aplica les instruccions a la teva instal·lació de MicroG. + +Això és necessari perquè l'aplicació funcioni." + Obrir lloc web + Cancel·lar + "Les optimitzacions de bateria de MicroG GmsCore s'han de deshabilitar per evitar problemes. + +Deshabilitar les optimitzacions de bateria per a MicroG no afectarà negativament l'ús de la bateria. + +Toca el botó de continuar i permet els canvis d'optimització." + Continuar - + + Reinicia l\'aplicació per utilitzar aquesta característica + Buffer del protocol de registre + Els registres de depuració inclouen el buffer de proto + Els registres de depuració no inclouen el buffer de proto + "Activar aquesta configuració registrarà dades addicionals de disseny, incloent text en pantalla per a alguns components de la interfície d'usuari. + +Això pot ajudar a identificar components en crear filtres personalitzats. + +No obstant això, activar-ho també registrarà algunes dades d'usuari, com ara la teva adreça IP." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Amaga la secció de la botiga del creador + La secció de la botiga del creador sota el reproductor de vídeo està oculta + La secció de la botiga del creador sota el reproductor de vídeo es mostra + Amaga la secció de comentaris sota els vídeos al feed d\'inici + La secció de comentaris sota els vídeos al feed d\'inici està oculta + La secció de comentaris sota els vídeos al feed d\'inici es mostra + + Amaga el botó \'Últims vídeos\' + El botó d\'últims vídeos està ocult + El botó d\'últims vídeos es mostra + + Amaga els resultats de la cerca web + Els resultats de la cerca web estan ocults + Els resultats de la cerca web es mostren + Amaga la secció \'Et pot agradar\' + La secció \'Et pot agradar\' està oculta + La secció \'Et pot agradar\' es mostra + This button usually appears in the video player for certain videos. --> + + Amaga el botó \'Reproducció del xat en directe\' + El botó de reproducció del xat en directe a la superposició del reproductor està ocult + El botó de reproducció del xat en directe a la superposició del reproductor es mostra + Amaga el títol del vídeo + El títol del vídeo a la superposició del reproductor està ocult + El títol del vídeo a la superposició del reproductor es mostra + Amaga \'Progrés del curs\' + La secció de progrés del curs està oculta + La secció de progrés del curs es mostra + Amaga Explora + Les seccions Explora aquest curs i Explora el podcast estan ocultes + Les seccions Explora aquest curs i Explora el podcast es mostren + Amaga \'Explora aquest curs\' + La secció Explora aquest curs està oculta + La secció Explora aquest curs es mostra + Amaga \'Explora el podcast\' + La secció Explora el podcast està oculta + La secció Explora el podcast es mostra + Amaga \'Llocs destacats\' + La secció de llocs destacats està oculta + La secció de llocs destacats es mostra + Activa el filtre del menú desplegable del feed + El filtre del menú desplegable del feed està activat + El filtre del menú desplegable del feed està desactivat + Filtre del menú desplegable del feed + Introdueix els noms dels menús desplegables per filtrar, un per línia + Amaga Jocs + La secció de jocs està oculta + La secció de jocs es mostra + Amaga Música + La secció de música està oculta + La secció de música es mostra + Amaga Qüestionaris + La secció de qüestionaris està oculta + La secció de qüestionaris es mostra + Activa el filtre de pestanyes del canal + El filtre de pestanyes del canal està activat + El filtre de pestanyes del canal està desactivat + Filtre de pestanyes del canal + Introdueix els noms de les pestanyes del canal per filtrar, un per línia + "Limitacions: +• Les llistes de Shorts, les pàgines de canals i els resultats de la cerca encara poden mostrar el nombre de visualitzacions. +• Aquesta característica no funciona amb el format per a automòbils." + "Limitacions: +• Les llistes de Shorts, les pàgines de canals i els resultats de la cerca encara poden mostrar les hores de càrrega. +• Aquesta característica no funciona amb el format per a automòbils." + "La pàgina d'inici/Subscripcions/Resultats de la cerca es filtren per ocultar el contingut que coincideix amb frases de paraules clau + +Limitacions: +• Els Shorts no es poden ocultar pel nom del canal +• És possible que alguns components de la interfície d'usuari no s'ocultin +• La cerca d'una paraula clau pot no mostrar resultats" - + Els anuncis de pantalla completa estan ocults + Amaga els anuncis emergents del reproductor + Els anuncis emergents del reproductor estan ocults + Els anuncis emergents del reproductor es mostren + El bàner de visualització de productes a la superposició del reproductor està ocult + El bàner de visualització de productes a la superposició del reproductor es mostra + Amaga les promocions de YouTube Premium + Les promocions de YouTube Premium estan ocultes + Les promocions de YouTube Premium es mostren - - + + URL copiada al porta-retalls + URL amb marca de temps copiada + Mostra el botó per copiar l\'URL del vídeo + Es mostra el botó per copiar l\'URL del vídeo. Toca per copiar l\'URL del vídeo. Mantén premut per copiar amb marca de temps + El botó per copiar l\'URL del vídeo no es mostra + Mostra el botó per copiar l\'URL amb marca de temps + Es mostra el botó per copiar l\'URL amb marca de temps. Toca per copiar l\'URL del vídeo amb marca de temps. Mantén premut per copiar sense marca de temps + El botó per copiar l\'URL amb marca de temps no es mostra + - + + Desactiva la finestra emergent \'Inicia la sessió a la TV\' + La finestra emergent \'Inicia la sessió a la TV\' està desactivada + La finestra emergent \'Inicia la sessió a la TV\' està activada + - + + Activa tocar per buscar + Tocar per buscar està activat + Tocar per buscar està desactivat + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + L\'ocultació podria no funcionar per a alguns comptes d\'usuari. - + + Botons de navegació + Amaga o canvia els botons de la barra de navegació + Amaga Inici + El botó d\'inici està ocult + El botó d\'inici es mostra + Amaga Shorts + El botó de Shorts està ocult + El botó de Shorts es mostra + Amaga Crea + El botó de creació està ocult + El botó de creació es mostra + Amaga Subscripcions + El botó de Subscripcions està ocult + El botó de Subscripcions es mostra + Amaga Notificacions + El botó de Notificacions està ocult + El botó de Notificacions es mostra + Intercanvia Crea amb Notificacions + El botó de creació s\'intercanvia amb el botó de Notificacions + El botó de creació no s\'intercanvia amb el botó de Notificacions + Si el canvi d\'aquesta configuració no té efecte, prova de canviar al mode d\'incògnit. + Amaga les etiquetes dels botons de navegació + Les etiquetes estan ocultes + Les etiquetes es mostren + Activa els botons de navegació estrets + L\'espaiat entre els botons de navegació és estret + L\'espaiat entre els botons de navegació és normal + Activa les animacions de la barra de navegació + Les transicions de navegació estan animades + Les transicions de navegació no estan animades + Desactiva la barra d\'estat translúcida + La barra d\'estat és opaca + La barra d\'estat és opaca o translúcida + "Limitacions: +• Pot aparèixer una barra negra a la part superior del reproductor de vídeo. +• En alguns dispositius, l'activació d'aquesta característica pot canviar la barra de navegació del sistema a transparent." + Desactiva la barra translúcida clara + La barra de navegació en mode clar és opaca + La barra de navegació en mode clar és opaca o translúcida + Desactiva la barra translúcida fosca + La barra de navegació en mode fosc és opaca + La barra de navegació en mode fosc és opaca o translúcida + Barra d\'eines + Amaga o canvia els components de la barra d\'eines + Amaga el botó Crea + El botó Crea està ocult + El botó Crea es mostra + Amaga el botó Notificacions + El botó Notificacions està ocult + El botó Notificacions es mostra + Amaga el botó Cerca + El botó Cerca està ocult + El botó Cerca es mostra. + Activa la barra de cerca ampla + La barra de cerca ampla està activada + La barra de cerca ampla està desactivada @@ -126,25 +315,67 @@ Second \"item\" text" + Amaga el botó Col·lapsa + El botó Col·lapsa està ocult + El botó Col·lapsa es mostra + Amaga el botó Pantalla completa + El botó Pantalla completa està ocult + El botó Pantalla completa es mostra + + + Amaga les targetes de la pantalla final + Les targetes de la pantalla final estan ocultes + Les targetes de la pantalla final es mostren - + Activa la barra de cerca gran a pantalla completa + La barra de cerca a pantalla completa és de mida gran + La barra de cerca a pantalla completa és de mida normal + Amaga Shorts a la pàgina del canal + Ocult a la pàgina del canal + Mostrat a la pàgina del canal + Amaga Shorts a la descripció del vídeo + Ocult a la descripció del vídeo + Mostrat a la descripció del vídeo + Amaga el botó d\'IA + El botó d\'IA està ocult + El botó d\'IA es mostra + Amaga l\'etiqueta \'Doblat automàticament\' + L\'etiqueta de doblat automàtic està oculta + L\'etiqueta de doblat automàtic es mostra + - + + Amaga la previsualització de la reproducció automàtica + La previsualització de la reproducció automàtica està oculta + La previsualització de la reproducció automàtica es mostra + + + Amaga el vídeo suggerit de la pantalla final + "El vídeo suggerit de la pantalla final està ocult quan la reproducció automàtica està desactivada + +La reproducció automàtica es pot canviar a la configuració de YouTube: +Configuració → Reproducció → Reprodueix el següent vídeo automàticament" + El vídeo suggerit de la pantalla final es mostra + - + + Amaga els panells emergents del reproductor + Els panells emergents del reproductor estan ocults + Els panells emergents del reproductor es mostren + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Només per a ús en vídeos musicals. Seccions de vídeos musicals sense música que no estiguin ja cobertes per una altra categoria + No es pot enviar el segment: %s + "No es pot enviar el segment. +Ja existeix" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Desactivat + Color + Blanc i negre + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Desactiva la resposta hàptica de tocar i mantenir premut + La resposta hàptica de tocar i mantenir premut està desactivada + La resposta hàptica de tocar i mantenir premut està activada + @@ -200,6 +441,11 @@ Second \"item\" text" + + Amaga les opcions de qualitat Premium + Les opcions de qualitat Premium estan ocultes + Les opcions de qualitat Premium es mostren + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index e14f6d3aba..a4105694a5 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Zobrazit historii vyhledávání v nastavení Historie vyhledávání v nastavení je zobrazena Historie vyhledávání nastavení se nezobrazuje + Zakázat tučné ikony + Ikony nejsou tučné + Ikony jsou tučné Zobrazit ikony nastavení ReVanced Ikony nastavení se zobrazují Ikony nastavení se nezobrazují @@ -99,23 +102,31 @@ Chcete-li přeložit nové jazyky nebo zlepšit stávající překlady, navštiv and changes made here must also be made there. --> - Nastavení GmsCore - Nastavení pro GmsCore + GmsCore + Nastavení pro GmsCore + Zkontrolovat aktualizace GmsCore + Kontrola aktualizací je povolena + Kontrola aktualizací je zakázána + Otevřít nastavení GmsCore + Nastavení GmsCore - MicroG GmsCore není nainstalován. Nainstalujte jej. - Požadovaná akce - "MicroG GmsCore nemá oprávnění běžet na pozadí. + MicroG GmsCore není nainstalován. Nainstalujte jej. + Požadovaná akce + Nepodařilo se zkontrolovat aktualizace MicroG GmsCore + Je dostupná nová verze (%1$s) MicroG GmsCore. Aktuálně používáte verzi %2$s. + "MicroG GmsCore nemá oprávnění běžet na pozadí. Postupujte podle návodu \"Nezabíjej mou aplikaci\" pro váš telefon a použijte pokyny pro instalaci MicroG. To je nutné pro fungování aplikace." - Otevřít web - "Optimalizace baterie MicroG GmsCore musí být zakázány, aby se zabránilo problémům. + Otevřít web + Zrušit + "Optimalizace baterie MicroG GmsCore musí být zakázány, aby se zabránilo problémům. Zakázání optimalizace baterie pro MicroG nebude mít negativní vliv na spotřebu baterie. Klepněte na tlačítko Pokračovat a povolte změny optimalizace." - Pokračovat + Pokračovat Falšovat video streamy @@ -169,10 +180,11 @@ Nebudete informováni o žádné neočekávané události." Přepínače uloženy Přepínače resetovány Přepínače zkopírovány do schránky - Záznam bufferu protokolu - Debugovací záznamy obsahují proto buffer - Debugovací záznamy neobsahují proto buffer - "Povolením tohoto nastavení se bude zaznamenávat další data rozvržení, včetně textu na obrazovce pro některé komponenty uživatelského rozhraní. + Restartujte aplikaci, abyste mohli používat tuto funkci + Záznam bufferu protokolu + Debugovací záznamy obsahují proto buffer + Debugovací záznamy neobsahují proto buffer + "Povolením tohoto nastavení se bude zaznamenávat další data rozvržení, včetně textu na obrazovce pro některé komponenty uživatelského rozhraní. To může pomoci identifikovat komponenty při vytváření vlastních filtrů. @@ -219,6 +231,9 @@ Povolením této možnosti se však budou zaznamenávat i některá uživatelsk Přehrávání Shorts v pozadí je povoleno + Skrýt poličku obchodu tvůrce + Police s obchodem tvůrce pod přehrávačem videa je skryta + Police obchodu pro tvůrce pod přehrávačem videa je zobrazena Skrýt karty alb Karty alb jsou skryté Karty alb jsou zobrazeny @@ -228,6 +243,9 @@ Povolením této možnosti se však budou zaznamenávat i některá uživatelsk Skryť police \"Ďalsej videá\" Police \"Další videá\" sa nezobrazuje Zobrazuje sa polícia \"Další videá\" + Skrýt sekci komentářů pod videi v kanálu Domů + Sekce komentářů pod videi v kanálu Domů je skrytá + Sekce komentářů pod videi v kanálu Domů je zobrazena Skrýt příspěvky komunity Příspěvky komunity jsou skryté Příspěvky komunity jsou zobrazeny @@ -255,14 +273,19 @@ Povolením této možnosti se však budou zaznamenávat i některá uživatelsk Skrýt nejnovější příspěvky Nejnovější příspěvky jsou skryty Nejnovější příspěvky jsou zobrazeny + + Skrýt tlačítko „Nejnovější videa“ + Tlačítko Nejnovější videa je skryté + Tlačítko Nejnovější videa je zobrazeno Skrýt seznamy přehrávání Mix Mix seznamy skladeb jsou skryty Mix seznamy skladeb se zobrazují Skrýt sekci Filmy Sekce Filmy je skrytá Sekce Filmy je viditelná - + Skrýt tlačitko \'Upozorněte mě\' Tlačítko \"Upozornit mě\" je skryto Tlačítko \"Upozornit mě\" je zobrazeno @@ -287,13 +310,16 @@ Povolením této možnosti se však budou zaznamenávat i některá uživatelsk Skrýt vizuální oddělovač Vizuální oddělovač je skryt Vizuální oddělovač je zobrazen + Skrýt webové výsledky vyhledávání + Webové výsledky vyhledávání jsou skryté + Webové výsledky vyhledávání jsou zobrazeny + Skrýt sekci „Mohlo by se vám líbit“ + Sekce „Mohlo by se vám líbit“ je skrytá + Sekce „Mohlo by se vám líbit“ je zobrazena Skrýt YouTube Doodles Animace \"Doodles\" YouTube na logu je skryta Animace YouTube Doodles na logu je zobrazena - "YouTube Doodles se zobrazují několik dní v roce. - -Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení skrytí je zapnuto, bude také skrytý panel s filtry pod vyhledávacím panelem." Skrýt lištu kanálu Lišta kanálu je skrytá Lišta kanálu je zobrazena @@ -310,10 +336,15 @@ Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení Informační panely jsou skryté Informační panely jsou zobrazeny + This button usually appears in the video player for certain videos. --> Skrýt tlačítko Připojit se Tlačítko \"Připojit se\" je skryto Tlačítko \"Připojit se\" je zobrazeno + + Skrýt tlačítko „Opakování živého chatu“ + Tlačítko pro opakování živého chatu v překrytí přehrávače je skryto + Tlačítko pro opakování živého chatu v překrytí přehrávače je zobrazeno Skrýt informační panely o zdravotnictví Informační panely o zdravotnictví jsou skryty Informační panely o zdravotnictví jsou zobrazeny @@ -329,6 +360,9 @@ Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení Skrýt reakce zobrazené po čase Reakce zobrazené po čase jsou skryty Reakce se zobrazují po čase + Skrýt název videa + Název videa v překrytí přehrávače je skrytý + Název videa v překrytí přehrávače je zobrazen Skrýt „Souhrn videa generovaný pomocí AI“ Sekce souhrnu videa generovaná AI je skryta Sekce se souhrnem videa generovaným umělou inteligencí je zobrazena @@ -341,33 +375,62 @@ Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení Skrýt kapitoly Sekcja Rozdziały jest ukryta Sekcja Rozdziały jest widoczna - Skrýt „Jak tento obsah vznikl“ - Sekce Jak tento obsah vznikl je skrytá - Sekce Jak tento obsah vznikl je zobrazena - Skrýt Hype body - Hype body jsou skryté - Hype body jsou zobrazené + Skrýt „Průběh kurzu“ + Sekce Průběh kurzu je skrytá + Sekce Průběh kurzu je zobrazena + Skrýt Prozkoumat + Sekce Prozkoumat tento kurz a Prozkoumat podcast jsou skryté + Sekce Prozkoumat tento kurz a Prozkoumat podcast jsou zobrazeny + Skrýt „Prozkoumat tento kurz“ + Sekce Prozkoumat tento kurz je skrytá + Sekce Prozkoumat tento kurz je zobrazena + Skrýt „Prozkoumat podcast“ + Sekce Prozkoumat podcast je skrytá + Sekce Prozkoumat podcast je zobrazena Skrýt „Prozkoumat podcast“ Sekce Prozkoumat podcast je skrytá Sekce Prozkoumat podcast je zobrazena Skrýt doporučené odkazy Sekce doporučených odkazů je skrytá Sekce doporučených odkazů je zobrazena + Skrýt „Doporučená místa“ + Sekce Doporučená místa je skrytá + Sekce Doporučená místa je zobrazena Skrýt doporučená videa Sekce doporučených videí je skrytá Sekce doporučených videí je zobrazena + Povolit filtr vysouvací nabídky kanálu + Filtr vysouvací nabídky kanálu je povolen + Filtr vysouvací nabídky kanálu je zakázán + Filtr vysouvací nabídky kanálu + Zadejte názvy vysouvacích nabídek pro filtrování, jeden na řádek + Skrýt Hry + Sekce Hry je skrytá + Sekce Hry je zobrazena + Skrýt „Jak tento obsah vznikl“ + Sekce Jak tento obsah vznikl je skrytá + Sekce Jak tento obsah vznikl je zobrazena + Skrýt Hype body + Hype body jsou skryté + Hype body jsou zobrazené Skrýt informační karty Sekce informačních karet je skrytá Sekce informačních karet je zobrazena Skrýt „Klíčové koncepty“ Sekce Klíčové koncepty je skrytá Sekce Klíčové koncepty je zobrazena + Skrýt Hudbu + Sekce Hudba je skrytá + Sekce Hudba je zobrazena Skrýt tlačítko Odebírat Tlačítko Odebírat je skryté Tlačítko Odebírat je zobrazeno Skrýt přepis Sekce přepisu je skrytá Sekce přepisu je zobrazena + Skrýt Kvízy + Sekce Kvízy je skrytá + Sekce Kvízy je zobrazena Popis videa Skrýt nebo zobrazit komponenty popisu videa Lišta filtrů @@ -386,6 +449,11 @@ Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení Zobrazeno v historii sledování Stránka kanálu Skrýt nebo zobrazit komponenty stránky kanálu + Povolit filtr záložek kanálu + Filtr záložek kanálu je povolen + Filtr záložek kanálu je zakázán + Filtr záložek kanálu + Zadejte názvy záložek kanálů pro filtrování, jeden na řádek Skrýt tlačítko Komunita Tlačítko Komunita je skryto @@ -449,15 +517,15 @@ Pokud se Doodle v současné době zobrazuje ve vaší oblasti a toto nastavení Počet zhlédnutí je zobrazený ve zdroji a výsledcích vyhledávání "Omezení: -• Police Shorts, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat počty zhlédnutí -• Tato funkce nefunguje s automobilovým provedením" +• Shorts police, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat počty zhlédnutí. +• Tato funkce nefunguje s automobilovým provedením." Skrýt čas nahrání Čas nahrání je skryt ve feedu a výsledcích vyhledávání Čas nahrání je zobrazen ve feedu a výsledcích vyhledávání "Omezení: -• Police Shorts, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat časy nahrání -• Tato funkce nefunguje s automobilovým provedením" +• Shorts police, stránky kanálů a výsledky vyhledávání mohou stále zobrazovat časy nahrání. +• Tato funkce nefunguje s automobilovým provedením." Skrýt obsah s klíčovými slovy Skrýt videa ve vyhledávání a feedu pomocí filtrů klíčových slov Skrýt domácí videa podle klíčových slov @@ -478,10 +546,10 @@ Klíčová slova mohou být názvy kanálů nebo jakýkoli text zobrazený v ná Slova s velkými písmeny na začátku musí být zadána s velkými písmeny (např.: iPhone, TikTok, LeBlanc)" O filtrování klíčových slov - "Výsledky vyhledávání Domů/Přihlášení/ jsou filtrovány tak, aby se skryl obsah, který odpovídá klíčovým frázím + "Výsledky vyhledávání Domů/Odběry/ jsou filtrovány tak, aby se skryl obsah, který odpovídá klíčovým frázím Omezení: -• Krátká videa nelze skrýt podle názvu kanálu +• Shorts nelze skrýt podle názvu kanálu • Některé komponenty uživatelského rozhraní nemusí být skryty • Hledání klíčového slova nemusí zobrazit žádné výsledky" Hledat shodu v celých slovech @@ -495,19 +563,12 @@ Omezení: Klíčové slovo skryje všechna videa: %s - Skrýt poličku obchodu tvůrce - Police s obchodem tvůrce pod přehrávačem videa je skryta - Police obchodu pro tvůrce pod přehrávačem videa je zobrazena Skrýt koncový banner obchodu Banner obchodu na závěrečné obrazovce je skryt Banner obchodu na závěrečné obrazovce je zobrazen Skrýt celostránkové reklamy - "Celoobrazovkové reklamy jsou skryty - -Tato funkce je dostupná pouze pro starší zařízení" + Celostránkové reklamy jsou skryty Celostránkové reklamy jsou zobrazeny - - Blokování reklam na celou obrazovku je funkční pouze na starších zařízeních Skrýt běžné reklamy Běžné reklamy jsou skryty Běžné reklamy jsou zobrazeny @@ -517,6 +578,9 @@ Tato funkce je dostupná pouze pro starší zařízení" Skrýt štítek placené propagace Štítek placené propagace je skryt Štítek placené propagace je zobrazen + Skrýt vyskakovací reklamy přehrávače + Vyskakovací reklamy přehrávače jsou skryté + Vyskakovací reklamy přehrávače jsou zobrazeny Skrýt karty se sponzorovanými produkty Karty se sponzorovanými produkty jsou skryty Karty se sponzorovanými produkty jsou zobrazeny @@ -524,23 +588,18 @@ Tato funkce je dostupná pouze pro starší zařízení" Nákupní odkazy v popisu videa jsou skryty Nákupní odkazy v popisu videa jsou zobrazeny Skrýt banner „Zobrazit produkty“ - Banner \"Zobrazit produkty\" v překrytí videa je skryt - Banner \"Zobrazit produkty\" v překrytí videa je zobrazen - Skryté webové výsledky vyhledávání - Webové výsledky vyhledávání jsou skryté - Webové výsledky vyhledávání jsou zobrazeny - - - Skrýt nabídky YouTube Premium - Nabídky YouTube Premium pod videem jsou skryty - Nabídky YouTube Premium pod videem jsou zobrazeny + Banner „Zobrazit produkty“ v překrytí přehrávače je skryt + Banner „Zobrazit produkty“ v překrytí přehrávače je zobrazen + Skrýt nabídky YouTube Premium + Nabídky YouTube Premium jsou skryty + Nabídky YouTube Premium jsou zobrazeny Skrýt reklamy ve videu Reklamy ve videu jsou skryty Reklamy ve videu jsou zobrazeny - + URL zkopírováno do schránky Adresa URL s časovým razítkem zkopírována Zobrazit tlačítko pro kopírování adresy URL videa @@ -556,10 +615,10 @@ Tato funkce je dostupná pouze pro starší zařízení" Dialog bude zobrazen Tímto krokem neobcházíte věkové omezení. Pouze jej automaticky akceptujete. - - Zakázat vyskakovací okno „Přihlásit se k televizi“ - Vyskakovací okno Přihlásit se k televizi je zakázáno - Vyskakovací okno Přihlásit se k televizi je povoleno + + Zakázat vyskakovací okno „Přihlásit se k televizi“ + Vyskakovací okno Přihlásit se k televizi je zakázáno + Vyskakovací okno Přihlásit se k televizi je povoleno Zakázat přeskočení kapitoly dvojitým klepnutím @@ -592,10 +651,10 @@ Zkontrolujte, zda je název balíčku správný a aplikace je nainstalována"Gesto je zakázáno Gesto je povoleno - - Povolit klepnutím přejít na - Klepnutím aktivujete vyhledávání - Klepnutím přejít na je zakázané + + Povolit klepnutím přejít na + Klepnutím přejít na je povoleno + Klepnutím přejít na je zakázané Povolit gesto pro jas @@ -676,7 +735,7 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Tlačítko komentářů je skryto Tlačítko komentářů je zobrazeno + This button usually appears on live streamed videos. --> Skrýt Nahlásit Tlačítko Nahlásit je skryto Tlačítko Nahlásit je zobrazeno @@ -689,7 +748,7 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Tlačítko Stáhnout je skryto Tlačítko Stáhnout je zobrazeno + This button usually appears on videos uploaded by the logged-in user. --> Skrýt Hype Tlačítko Hype je skryto Tlačítko Hype je zobrazeno @@ -702,7 +761,7 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Tlačítko Poděkování je skryto Tlačítko Poděkování je zobrazeno + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Skrýt Zeptat se Tlačítko Zeptat se je skryté Tlačítko Zeptat se je zobrazeno @@ -710,6 +769,7 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Skrýt Klip Tlačítko Klip je skryto Tlačítko Klip je zobrazeno + Skrytí nemusí fungovat u některých uživatelských účtů. Skrýt Obchod Tlačítko Obchod je skryté @@ -719,17 +779,17 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Tlačítko Uložit je skryté Tlačítko Uložit je zobrazeno - + Navigační tlačítka - Skrýt nebo změnit tlačítka na navigačním panelu + Skrýt nebo změnit tlačítka navigačního panelu - Skrýt Domov - Tlačítko Domov je skryto - Tlačítko Domov je zobrazeno + Skrýt Domů + Tlačítko Domů je skryté + Tlačítko Domů je zobrazeno Skrýt Shorts - Tlačítko \"Shorts\" je skryté - Tlačítko \"Shorts\" je viditelné + Tlačítko „Shorts“ je skryté + Tlačítko „Shorts“ je viditelné Skrýt Vytvořit Tlačítko Vytvořit je skryto @@ -743,26 +803,44 @@ Hlasitost se upravuje svislým přejetím po pravé straně obrazovky" Tlačítko oznámení je zobrazeno Zaměnit Vytvořit s Oznámeními - "Tlačítko Vytvořit se přepne s tlačítkem Oznámení - -Poznámka: Povolení této funkce také vynuceně skryje video reklamy" + Tlačítko Vytvořit je zaměněno s tlačítkem Oznámení Tlačítko Vytvořit není zaměněno s tlačítkem Oznámení - "Zakázáním tohoto nastavení také zakážete blokování reklam u položek Shorts. - -Pokud změna tohoto nastavení nemá žádný účinek, zkuste přepnout do režimu anonymního prohlížení." - Skrýt štítky navigačních tlačítek - Štítky jsou skryty - Štítky jsou zobrazeny + Pokud se změna tohoto nastavení neprojeví, zkuste přepnout do anonymního režimu. + Skrýt popisky navigačních tlačítek + Popisky jsou skryté + Popisky jsou zobrazeny + Povolit úzká navigační tlačítka + Rozestupy mezi navigačními tlačítky jsou úzké + Rozestupy mezi navigačními tlačítky jsou normální + Povolit animace navigačního panelu + Přechody v navigaci jsou animované + Přechody v navigaci nejsou animované Deaktivovat průsvitný stavový řádek Statusový řádek je neprůhledný Statusový řádek je neprůhledný nebo průsvitný - Na některých zařízeních může aktivace této funkce změnit navigační lištu systému na průhlednou. + "Omezení: +• V horní části video přehrávače se může zobrazit černý pruh. +• Na některých zařízeních může povolení této funkce změnit systémový navigační panel na průhledný." Deaktivovat světlý průsvitný navigační panel Navigační panel v světlém režimu je neprůhledný Navigační lišta v světlém režimu je neprůhledná nebo průsvitná Zakázat tmavý průsvitný panel Navigační panel v tmavém režimu je neprůhledný Navigační lišta v tmavém režimu je neprůhledná nebo průsvitná + Panel nástrojů + Skrýt nebo změnit komponenty panelu nástrojů + Skrýt tlačítko Vytvořit + Tlačítko Vytvořit je skryto + Tlačítko Vytvořit je zobrazeno + Skrýt tlačítko Oznámení + Tlačítko oznámení je skryto + Tlačítko oznámení je zobrazeno + Skrýt tlačítko vyhledávání + Tlačítko vyhledávání je skryté + Tlačítko vyhledávání je zobrazené. + Povolit široký vyhledávací panel + Široký vyhledávací panel je povolen + Široký vyhledávací panel je zakázán Menu vyskakovacích oken @@ -837,6 +915,12 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Skrýt tlačítko Odeslat Tlačítko pro odesílání je skryto Tlačítko vysílání je viditelné + Skrýt tlačítko Sbalit + Tlačítko Sbalit je skryté + Tlačítko Sbalit je zobrazeno + Skrýt tlačítko Celá obrazovka + Tlačítko Celá obrazovka je skryté + Tlačítko Celá obrazovka je zobrazeno Skrýt pozadí ovládacích prvků přehrávače Pozadí ovládacích prvků přehrávače je skryto Pozadí ovládacích prvků přehrávače je zobrazeno @@ -845,9 +929,9 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Tlačítka jsou zobrazena - Skrýt karty s informacemi o videu - Karty s informacemi o videu jsou skryty - Karty s informacemi o videu jsou zobrazeny + Skrýt karty s informacemi o videu + Karty s informacemi o videu jsou skryty + Karty s informacemi o videu jsou zobrazeny Deaktivovat okolní režim v celoobrazovkovém režimu @@ -872,10 +956,16 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Skrýt posuvník miniatur videí Posuvník miniatur videí je skryt Posuvník miniatur videí je zobrazen + Povolit velký posuvník přes celou obrazovku + Posuvník přes celou obrazovku má velkou velikost + Posuvník přes celou obrazovku má normální velikost Přehrávač Shorts Skrýt nebo zobrazit komponenty přehrávače Shorts + Skrýt Shorts na stránce kanálu + Skryto na stránce kanálu + Zobrazeno na stránce kanálu Skrýt Shorts v kanálu Domů Skryto v kanálu Domů a souvisejících videích @@ -887,9 +977,18 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Skrýt Shorts v kanálu Odběry Skryto v kanálu Odběry Zobrazeno v kanálu Odběry + Skrýt Shorts v popisu videa + Skryto v popisu videa + Zobrazeno v popisu videa Skrýt Shorts z historie sledování Skryté v historii sledování Zobrazené v historii sledování + Skrýt tlačítko AI + Tlačítko AI je skryté + Tlačítko AI je zobrazeno + Skrýt štítek „Automatický dabing“ + Štítek s automatickým dabingem je skryt + Štítek s automatickým dabingem je zobrazen Skrýt štítek „Automatický dabing“ Štítek s automatickým dabingem je skryt Štítek s automatickým dabingem je zobrazen @@ -951,6 +1050,7 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Skrýt tlačítko „Použít tuto šablonu“ Tlačítko Použít tuto šablonu je skryté Tlačítko Použít tuto šablonu je zobrazeno + Skrýt animaci s fontánou u tlačítka To se mi líbí Animace fontány tlačítka lajku je skrytá Animace fontány tlačítka lajku je zobrazena @@ -993,7 +1093,12 @@ Chcete-li zobrazit nabídku zvukových stop, změňte \"Podvrhnout video streamy Navigační panel je skrytý Navigační panel je zobrazen - + + Skrýt náhled automatického přehrávání + Náhled automatického přehrávání je skrytý + Náhled automatického přehrávání je zobrazen + + Skrýt navrhované video na konci obrazovky "Navrhované video na konci obrazovky je skryté, když je automatické přehrávání vypnuté. @@ -1012,9 +1117,9 @@ Nastavení → Přehrávání → Automatické přehrávání dalšího videa"Čas je zobrazen - Skrýt vyskakovací panely přehrávače - Vyskakovací panely přehrávače jsou skryté - Vyskakovací panely přehrávače jsou zobrazeny + Skrýt vyskakovací panely přehrávače + Vyskakovací panely přehrávače jsou skryté + Vyskakovací panely přehrávače jsou zobrazeny Ukončete režim celé obrazovky na konci videa @@ -1082,25 +1187,6 @@ Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu"< Limit rychlosti klienta byl zaznamenán %d krát %d milisekund - - Povolit široký vyhledávací panel - Široký vyhledávací panel je povolen - Široký vyhledávací panel je zakázán - - - Povolit miniatury vysoké kvality - Miniatury posuvníku jsou vysoké kvality - Miniatury posuvníku jsou střední kvality - Miniatury posuvníku na celou obrazovku jsou vysoké kvality - "Obnoví se také miniatury živých přenosů, které nemají miniatury s posuvníkem. - -Miniatury s posuvníkem budou používat stejnou kvalitu jako aktuální video. - -Tato funkce funguje nejlépe s kvalitou videa 720p nebo nižší a při použití velmi rychlého internetového připojení." - Obnovit staré miniatury posuvníku - Miniatury posuvníku se zobrazí nad posuvníkem - Miniatury posuvníku se zobrazí na celou obrazovku - Povolit SponsorBlock SponsorBlock je systém s participací komunity pro přeskakování otravných částí videí na YouTube @@ -1338,8 +1424,6 @@ Pokud bude později vypnuta, doporučujeme vymazat data aplikace, aby se zabrán Cíl napodobení verze aplikace 20.13.41 - Obnovit nerozbalený panel akcí videa 20.05.46 - Obnovit funkci přepisu - 19.35.36 - Obnovuje staré ikony Shorts přehrávače - 19.01.34 – Obnovit staré ikony navigace Změnit úvodní stránku @@ -1443,8 +1527,9 @@ Omezení: Použití tlačítka zpět na panelu nástrojů nemusí fungovat"Obrazovka načítání bude mít přechodové pozadí Obrazovka načítání bude mít pevné pozadí Styl úvodní obrazovky - Barva - Černobílá + Vypnuto + Barva + Černobílá Povolit vlastní barvu posuvníku Vlasní barva posuvníku je zobrazena Původní barva posuvníku je zobrazena @@ -1549,6 +1634,9 @@ Povolením této funkce lze odemknout vyšší kvality videa" Zakázat haptiku pro vrácení zpět vyhledávání Haptika pro vrácení zpět vyhledávání je vypnutá Haptika pro vrácení zpět vyhledávání je zapnutá + Zakázat haptickou odezvu pro klepnutí a podržení + Haptická odezva pro klepnutí a podržení je zakázána + Haptická odezva pro klepnutí a podržení je povolena Zakázat haptiku pro zoom Haptika zoomu je vypnutá Haptika zoomu je zapnutá @@ -1644,6 +1732,11 @@ Omezení: Zobrazuje se rozšířené menu kvality videa Nezobrazuje se rozšířené menu kvality videa + + Skrýt možnosti prémiové kvality + Možnosti prémiové kvality jsou skryté + Možnosti prémiové kvality jsou zobrazeny + Povolit posun pro hledání Posun pro hledání je povolen @@ -1675,6 +1768,7 @@ Přehrávání videa s AV1 se může sekat nebo vypadávat snímky." + O aplikaci Reklamy Obecné diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index b3104307b3..9158e49a4b 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -78,6 +78,9 @@ Second \"item\" text" Vis indstillingssøgehistorik Indstillingssøgehistorik vises Søgehistorik for indstillinger vises ikke + Deaktiver fede ikoner + Ikoner er ikke fede + Ikoner er fede Vis ReVanced-indstillingsikoner Indstillingsikoner vises Indstillingsikoner vises ikke @@ -97,23 +100,31 @@ For at oversætte nye sprog eller forbedre de eksisterende oversættelser, besø and changes made here must also be made there. --> - GmsCore Indstillinger - Indstillinger for GmsCore + GmsCore + Indstillinger for GmsCore + Søg efter GmsCore-opdateringer + Søgning efter opdateringer er aktiveret + Søgning efter opdateringer er deaktiveret + Åbn GmsCore Indstillinger + Indstillinger for GmsCore - MicroG GmsCore er ikke installeret. Installer det. - Handling påkrævet - "MicroG GmsCore har ikke tilladelse til at køre i baggrunden. + MicroG GmsCore er ikke installeret. Installer det. + Handling påkrævet + Kunne ikke søge efter MicroG GmsCore-opdateringer + En ny version (%1$s) af MicroG GmsCore er tilgængelig. Du bruger i øjeblikket version %2$s. + "MicroG GmsCore har ikke tilladelse til at køre i baggrunden. Følg \"Dræb ikke min app\"-vejledningen til din telefon, og anvend instruktionerne på din MicroG-installation. Dette er påkrævet for, at appen fungerer." - Åbn hjemmeside - "MicroG GmsCore-batterioptimeringer skal deaktiveres for at forhindre problemer. + Åbn hjemmeside + Annuller + "MicroG GmsCore-batterioptimeringer skal deaktiveres for at forhindre problemer. Deaktivering af batterioptimeringer for MicroG vil ikke påvirke batteriforbruget negativt. Tap på knappen Fortsæt, og tillad optimeringsændringer." - Fortsæt + Fortsæt Simuler videostreams @@ -167,14 +178,11 @@ Du modtager ikke notifikationer om uventede hændelser." Flag gemt Flag nulstillet Flag kopieret til udklipsholder - Logprotokolbuffer - Fejlfindingslogge inkluderer protobuffer - Fejlfindingslogge inkluderer ikke protobuffer - "Aktivering af denne indstilling logger yderligere layoutdata, inklusive tekst på skærmen for nogle UI-komponenter. - -Dette kan hjælpe med at identificere komponenter, når der oprettes brugerdefinerede filtre. - -Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse." + Genstart appen for at bruge denne funktion + Logprotokolbuffer + Fejlfindingslogge inkluderer protobuffer + Fejlfindingslogge inkluderer ikke protobuffer + "Aktivering af denne indstilling logger yderligere layoutdata, inklusive tekst på skærmen for nogle UI-komponenter.\n\nDette kan hjælpe med at identificere komponenter, når der oprettes brugerdefinerede filtre.\n\nAktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse." Rens delingslinks @@ -216,6 +224,9 @@ Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse. Baggrundsafspilning af Shorts er aktiveret + Skjul butikshylde for skabere + Opretterbutikshylde under videoafspiller er skjult + Butikshylde for skaber under videoafspiller vises Skjul albumkort Albumkort er skjult Albumkort vises @@ -225,6 +236,9 @@ Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse. Skjul chips hylde Chips hylde er skjult Chips hylde er vist + Skjul kommentarersektion under videoer i Hjem-feed + Kommentarersektionen under videoer i Hjem-feed er skjult + Kommentarersektionen under videoer i Hjem-feed vises Skjul fællesskabs indlæg Fællesskabs indlæg er skjult Fællesskabs indlæg er vist @@ -252,14 +266,19 @@ Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse. Skjul seneste indlæg Seneste indlæg er skjult Seneste indlæg vises + + Skjul knappen \'Seneste videoer\' + Knappen Seneste videoer er skjult + Knappen Seneste videoer vises Skjul miks afspilningslister Mix afspilningslister er skjult Mix afspilningslister vises Skjul filmsektion Afsnittet Film er skjult Afsnittet Film vises - + Skjul knappen \'Underret mig\' Giv mig besked-knap er skjult Giv mig besked-knap vises @@ -284,13 +303,16 @@ Aktivering af dette vil dog også logge nogle brugerdata, såsom din IP-adresse. Skjul visuelt mellemrum Visuelt mellemrum er skjult Visuelt mellemrum vises + Skjul søgeresultater + Websøgeresultater er skjult + Websøgeresultater vises + Skjul afsnittet \'Du vil måske også synes om\' + Afsnittet \'Du vil måske også synes om\' er skjult + Afsnittet \'Du vil måske også synes om\' vises Skjul YouTube-Doudler YouTube Doodles-animation på logoet er skjult YouTube Doodles-animation på logoet vises - "YouTube-doodles vises et par dage om året. - -Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er aktiveret, skjules filterfeltet under søgefeltet også." Skjul kanallinje Kanalbjælken er skjult Kanalbjælken vises @@ -307,10 +329,15 @@ Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er a Infopaneler er skjult Infopaneler vises + This button usually appears in the video player for certain videos. --> Skjul knappen \"Deltag\" Tilmeld-knap er skjult Tilmeld-knap vises + + Skjul knappen \'Genafspilning af livechat\' + Knappen Genafspilning af livechat i afspilleroverlay er skjult + Knappen Genafspilning af livechat i afspilleroverlay vises Skjul medicinske paneler Medicinske paneler er skjult Medicinske paneler er vist @@ -326,6 +353,9 @@ Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er a Skjul tidsreaktioner Tidsreaktioner skjules Tidsreaktioner vises + Skjul videotitel + Videotitel i afspilleroverlay er skjult + Videotitel i afspilleroverlay vises Skjul \"AI-genereret videooversigt\" AI-genereret videooversigt er skjult AI-genereret videooversigtssektion vises @@ -338,33 +368,62 @@ Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er a Skjul kapitler Kapitler sektion er skjult Kapitel afsnit er vist - Skjul \"Hvordan dette indhold blev lavet\" - Sektionen Sådan blev dette indhold lavet er skjult - Sektionen Sådan blev dette indhold lavet vises - Skjul Hype-point - Hype-point er skjult - Hype-point er vist + Skjul \'Kursusforløb\' + Afsnittet Kursusforløb er skjult + Afsnittet Kursusforløb vises + Skjul Udforsk + Afsnittene Udforsk dette kursus og Udforsk podcasten er skjult + Afsnittene Udforsk dette kursus og Udforsk podcasten vises + Skjul \'Udforsk dette kursus\' + Afsnittet Udforsk dette kursus er skjult + Afsnittet Udforsk dette kursus vises + Skjul \'Udforsk podcasten\' + Sektionen Udforsk podcasten er skjult + Sektionen Udforsk podcasten vises Skjul \"Udforsk podcasten\" Sektionen Udforsk podcasten er skjult Sektionen Udforsk podcasten vises Skjul fremhævede links Sektionen med fremhævede links er skjult Sektionen med fremhævede links er vist + Skjul \'Udvalgte steder\' + Afsnittet Udvalgte steder er skjult + Afsnittet Udvalgte steder vises Skjul fremhævede videoer Sektionen med fremhævede videoer er skjult Sektionen med fremhævede videoer er vist + Aktiver filter for rullemenu til feed + Filter for rullemenu til feed er aktiveret + Filter for rullemenu til feed er deaktiveret + Filter for rullemenu til feed + Indtast navnene på rullemenuerne, der skal filtreres efter, én per linje + Skjul Gaming + Gaming-afsnittet er skjult + Gaming-afsnittet vises + Skjul \"Hvordan dette indhold blev lavet\" + Sektionen Sådan blev dette indhold lavet er skjult + Sektionen Sådan blev dette indhold lavet vises + Skjul Hype-point + Hype-point er skjult + Hype-point er vist Skjul infokort Info-kort sektion er skjult Info-kort sektion er vist Skjul \"Nøglebegreber\" Nøglebegrebssektionen er skjult Nøglebegrebssektionen vises + Skjul Musik + Musikafsnittet er skjult + Musikafsnittet vises Skjul abonner-knappen Abonner-knappen er skjult Abonner-knappen er vist Skjul udskrift Afsnittet er skjult Afsnittet er vist + Skjul Quizzer + Quizzer-afsnittet er skjult + Quizzer-afsnittet vises Video beskrivelse Skjul eller vis komponenter til videobeskrivelse Filtrer bjælke @@ -383,6 +442,11 @@ Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er a Vist i seerhistorik Kanalside Skjul eller vis kanalsidekomponenter + Aktiver filter for kanalfane + Filter for kanalfane er aktiveret + Filter for kanalfane er deaktiveret + Filter for kanalfane + Indtast navnene på kanalfanerne, der skal filtreres efter, én per linje Skjul knappen Fællesskab Fællesskabs-knap er skjult @@ -446,15 +510,15 @@ Hvis et Doodle vises i øjeblikket i din region, og denne skjuleindstilling er a Antal visninger vises i feed og søgeresultater "Begrænsninger: -• Shorts-hylder, kanalsider og søgeresultater kan stadig vise antal visninger -• Denne funktion virker ikke med bilformat" +• Shorts-hylder, kanalsider og søgeresultater kan stadig vise antal visninger. +• Denne funktion virker ikke med bilformat." Skjul uploadtid Uploadtid er skjult i feed og søgeresultater Uploadtid vises i feed og søgeresultater "Begrænsninger: -• Shorts hylder, kanalsider og søgeresultater kan stadig vise uploadtider -• Denne funktion virker ikke med bilformat" +• Shorts-hylder, kanalsider og søgeresultater kan stadig vise uploadtider. +• Denne funktion virker ikke med bilformat." Skjul nøgleordsindhold Skjul søge- og feed videoer ved hjælp af søgeordsfiltre Skjul hjemmevideoer med søgeord @@ -477,10 +541,10 @@ Ord med store bogstaver i midten skal indtastes med store og små bogstaver (f.e Om søgeord filtrering "Hjem-/abonnement-/søgeresultater filtreres for at skjule indhold, der svarer til søgeordssætninger -Begrænsninger -● Shorts kan ikke skjules efter kanalnavn -● Nogle UI-komponenter skjules muligvis ikke -● Søgning efter et søgeord viser muligvis ingen resultater" +Begrænsninger: +• Shorts kan ikke skjules efter kanalnavn +• Nogle UI-komponenter skjules muligvis ikke +• Søgning efter et søgeord viser muligvis ingen resultater" Match hele ord Omkring et nøgleord/sætning med dobbelt-citater vil forhindre partielle kampe af videotitler og kanalnavne<br><br>For eksempel<br><b>\"ai\"</b> vil skjule videoen: <b>How does AI work?</b><br>, men skjuler ikke: <b>What does fair use mean?</b> @@ -492,19 +556,12 @@ Begrænsninger Nøgleord vil skjule alle videoer: %s - Skjul butikshylde for skabere - Opretterbutikshylde under videoafspiller er skjult - Butikshylde for skaber under videoafspiller vises Skjul banner fra butikken på slutskærmen Slutskærmsbutiksbanner er skjult Slutskærmsbutiksbanner vises Skjul fuldskærmsannoncer - "Fuldsskærmsannoncer er skjult - -Denne funktion er kun tilgængelig for ældre enheder" + Fuldskærmsannoncer er skjult Fuldskærms annoncer vises - - Skjul reklamer på fuld skærm virker kun med ældre enheder Skjul generelle annoncer Generelle annoncer er skjult Generelle annoncer vises @@ -514,6 +571,9 @@ Denne funktion er kun tilgængelig for ældre enheder" Skjul betalt kampagneetiket Betalt reklamemærke er skjult Betalt salgsfremmende mærke er vist + Skjul afspiller pop op-annoncer + Afspiller pop op-annoncer er skjult + Afspiller pop op-annoncer vises Skjul selvsponsorerede kort Selvsponsorerede kort er skjult Selvsponsorerede kort vises @@ -521,23 +581,18 @@ Denne funktion er kun tilgængelig for ældre enheder" Shoppinglinks i videobeskrivelse er skjult Shoppinglinks i videobeskrivelsen vises Skjul banneret \"Se produkter\" - Se produkter-banner i videooverlay er skjult - Se produkter-banner i videooverlay vises - Skjul søgeresultater - Websøgeresultater er skjult - Websøgeresultater vises - - - Skjul YouTube Premium kampagner - YouTube Premium kampagner under videoafspiller er skjult - YouTube Premium kampagner under videoafspiller vises + Se produkter-banner i afspilleroverlay er skjult + Se produkter-banner i afspilleroverlay vises + Skjul YouTube Premium kampagner + YouTube Premium kampagner er skjult + YouTube Premium kampagner vises Skjul videoannoncer Videoannoncer er skjult Videoannoncer vises - + URL kopieret til udklipsholder URL med tidsstempel kopieret Vis kopiér video URL knap @@ -553,10 +608,10 @@ Denne funktion er kun tilgængelig for ældre enheder" Dialog vil blive vist Dette går ikke uden om aldersbegrænsningen. Det accepterer bare det automatisk. - - Deaktiver \'Log ind på TV\'-popup - Log ind på TV-pop op er deaktiveret - Log ind på TV-pop op er aktiveret + + Deaktiver \'Log ind på TV\'-popup + Log ind på TV-pop op er deaktiveret + Log ind på TV-pop op er aktiveret Deaktiver dobbeltklik kapitelspring @@ -589,10 +644,10 @@ Kontrollér, at pakkenavnet er korrekt, og at appen er installeret" Bevægelse er deaktiveret Bevægelse er aktiveret - - Aktivér tryk for at søge - Tryk for at søge er aktiveret - Tryk for at søge er deaktiveret + + Aktivér tryk for at søge + Tryk for at søge er aktiveret + Tryk for at søge er deaktiveret Aktivér lysstyrke-bevægelse @@ -673,7 +728,7 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Kommentarknappen er skjult Kommentarknappen vises + This button usually appears on live streamed videos. --> Skjul Rapport Rapport-knappen er skjult Rapport-knappen er vist @@ -686,7 +741,7 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Download-knappen er skjult Download-knappen vises + This button usually appears on videos uploaded by the logged-in user. --> Skjul Hype Hype-knappen er skjult Hype-knappen vises @@ -699,7 +754,7 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Tak knappen er skjult Tak knappen er vist + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Skjul Spørg Spørg-knappen er skjult Spørg-knappen vises @@ -707,6 +762,7 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Skjul klip Klip knappen er skjult Klip knappen er vist + Skjuling virker muligvis ikke for nogle brugerkonti. Skjul butik Butiksknappen er skjult @@ -716,13 +772,13 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Knappen \"Gem\" er skjult Knappen \"Gem\" vises - + Navigationsknapper - Skjul eller skift knapper i navigationsbjælken + Skjul eller skift navigationslinjeknapper - Skjul Hjem - Hjem-knap er skjult - Hjem-knap vises + Skjul Startside + Startside-knappen er skjult + Startside-knappen vises Skjul Shorts Shorts knap er skjult @@ -740,26 +796,44 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Notifikationsknappen vises Skift Opret med notifikationer - "Opret-knappen er skiftet med knappen Meddelelser - -Bemærk: Aktivering af dette skjuler også videoannoncer" + Opret knappen er skiftet med Notifikationer knappen Opret knappen er ikke skiftet med Notifikationer knappen - "Deaktivering af denne indstilling vil også deaktivere Shorts-annonceblokering. - -Hvis ændring af denne indstilling ikke træder i kraft, kan du prøve at skifte til inkognitotilstand." - Skjul navigationsknappens etiketter + Hvis ændring af denne indstilling ikke træder i kraft, prøv at skifte til inkognitotilstand. + Skjul etiketter for navigationsknapper Etiketter er skjult - Etiketter er vist + Etiketter vises + Aktiver smalle navigationsknapper + Afstand mellem navigationsknapper er smal + Afstand mellem navigationsknapper er normal + Aktiver animationer for navigationslinje + Navigationsovergange er animerede + Navigationsovergange er ikke animerede Deaktiver gennemsigtig statuslinje Statuslinjen er opak Statuslinjen er opak eller gennemsigtig - På nogle enheder kan aktivering af denne funktion ændre systemets navigationslinje til gennemsigtig. + "Begrænsninger: +• En sort bjælke kan vises øverst på videoafspilleren. +• På nogle enheder kan aktivering af denne funktion ændre systemets navigationslinje til gennemsigtig." Deaktiver lys gennemsigtig linje - Navigationslinjen i lys tilstand er ikke gennemsigtig + Navigationslinjen i lys tilstand er opak Lys tilstand navigationslinjen er opak eller gennemsigtig Deaktiver mørk gennemsigtig linje - Navigationslinjen i mørk tilstand er ikke gennemsigtig + Navigationslinjen i mørk tilstand er opak Mørk tilstand navigationslinjen er opak eller gennemsigtig + Værktøjslinje + Skjul eller skift værktøjslinjekomponenter + Skjul Opret-knap + Opret knap er skjult + Opret knap vises + Skjul Notifikationer-knap + Notifikationsknappen er skjult + Notifikationsknappen vises + Skjul søgeknap + Søgeknappen er skjult + Søgeknappen vises. + Aktiver bred søgelinje + Bred søgelinje er aktiveret + Bred søgelinje er deaktiveret Udfyldningsmenu @@ -834,6 +908,12 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Skjul Cast-knappen Cast-knappen er skjult Cast knap er vist + Skjul knappen \'Skjul\' + Skjul-knappen er skjult + Skjul-knappen vises + Skjul Fuldskærmsknap + Fuldskærmsknap er skjult + Fuldskærmsknap vises Skjul baggrund for afspillerkontroller Baggrund for afspilningskontroller er skjult Baggrund for afspillerkontroller vises @@ -842,9 +922,9 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Knapper vises - Skjul slutskærmkort - Slutskærmskortene er skjult - Kort til slutskærm vises + Skjul slutskærmkort + Slutskærmskortene er skjult + Kort til slutskærm vises Deaktiver Ambient-tilstand i fuldskærm @@ -869,10 +949,16 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Skjul video-miniaturebilledernes søgelinje Video-miniaturebilledernes søgelinje er skjult Video-miniaturebilledernes søgelinje vises + Aktiver stor søgelinje i fuldskærm + Fuldskærms søgelinje er stor + Fuldskærms søgelinje har normal størrelse Shorts-afspiller Skjul eller vis Shorts-afspillerkomponenter + Skjul Shorts på kanalsiden + Skjult på kanalsiden + Vist på kanalsiden Skjul Shorts i \'Hjem\'-feed Skjult i \'Hjem\'-feed og relaterede videoer @@ -884,9 +970,18 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Skjul Shorts i \'Abonnementer\'-feed Skjult i \'Abonnementer\'-feed Vises i \'Abonnementer\'-feed + Skjul Shorts i videobeskrivelsen + Skjult i videobeskrivelsen + Vist i videobeskrivelsen Skjul shorts i historik Skjult i historikken Vises i historik + Skjul AI-knap + AI-knap er skjult + AI-knap vises + Skjul \'Auto-dubbet\'-etiket + Automatisk dubbet etiket er skjult + Automatisk dubbet etiket vises Skjul \'Auto-dubbet\'-etiket Automatisk dubbet etiket er skjult Automatisk dubbet etiket vises @@ -948,6 +1043,7 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Skjul \'Brug denne skabelon\'-knap Knappen \"Brug denne skabelon\" er skjult Knappen Brug denne skabelon vises + Skjul knap for springvand-animation af like-knap Ligesom knap springvand animation er skjult Animation af springvand vises som knap @@ -990,7 +1086,12 @@ For at vise audiospormenuen, skift 'Maskér videostreams' til 'Android No SDK'"< Navigationsbjælken er skjult Navigationsbjælken vises - + + Skjul automatisk afspilningsforhåndsvisning + Automatisk afspilningsforhåndsvisning er skjult + Automatisk afspilningsforhåndsvisning vises + + Skjul foreslået video på slutskærmen "Foreslået video på slutskærmen er skjult, når automatisk afspilning er slået fra @@ -1009,9 +1110,9 @@ Indstillinger → Afspilning → Afspil næste video automatisk" Tidsstempel er vist - Skjul pop op- paneler - Spiller popup paneler er skjult - Spiller popup paneler vises + Skjul pop op- paneler + Spiller popup paneler er skjult + Spiller popup paneler vises Afslut fuldskærmstilstand ved videoens afslutning @@ -1079,26 +1180,6 @@ Begrænsning: Synes ikke godt om vises muligvis ikke i inkognitotilstand"Klient sats grænse stødt %d gange %d millisekunder - - Aktiver bred søgelinje - Bred søgelinje er aktiveret - Bred søgelinje er deaktiveret - - - Aktiver miniaturer af høj kvalitet - Seekbar miniaturer er af høj kvalitet - Seekbar miniaturer er af middel kvalitet - Fuldskærmssøgerbar miniaturer er af høj kvalitet - Fuldskærmssøgerbar miniaturer er af middel kvalitet - "Dette vil også gendanne miniaturebilleder på livestreams, der ikke har miniaturebilleder i søgefeltet. - -Miniaturebilleder i søgefeltet bruger den samme kvalitet som den aktuelle video. - -Denne funktion fungerer bedst med en videokvalitet på 720p eller lavere og ved brug af en meget hurtig internetforbindelse." - Gendan gamle miniaturer på søgelinjen - Seekbar miniaturer vises over søgelinjen - Seekbar miniaturer vises i fuld skærm - Aktiver SponsorBloker SponsorBlock er et crowdsourcet system, der springer irriterende dele af YouTube-videoer over @@ -1335,8 +1416,6 @@ Hvis det senere slås fra, anbefales det at rydde app-dataene for at forhindre U Spoof app version mål 20.13.41 - Gendan ikke-kollapset videohandlingslinje 20.05.46 - Gendan transkriptionsfunktionalitet - 19.35.36 - Gendan gamle Shorts player ikoner - 19.01.34 - Gendan gamle navigationsikoner Skift startside @@ -1438,8 +1517,9 @@ Miniafspiller kan trækkes ud over skærmen til venstre eller højre" Indlæser skærmen vil have en gradient baggrund Indlæser skærmen vil have en solid baggrund Splash screens udseende - Farve - Sort og hvid + Deaktiveret + Farve + Sort og hvid Aktivér brugerdefineret søgelinjefarve Brugerdefineret søgelinje farve vises Original søgelinje farve vises @@ -1543,6 +1623,9 @@ Aktivering af dette kan låse op for højere videokvalitet" Deaktivér fortryd søge-haptik Fortryd søge-haptik er deaktiveret Fortryd søge-haptik er aktiveret + Deaktiver tryk-og-hold haptik + Tryk-og-hold haptik er deaktiveret + Tryk-og-hold haptik er aktiveret Deaktivér zoom haptics Zoom haptics er deaktiveret Zoom haptics er aktiveret @@ -1638,6 +1721,11 @@ Begrænsninger: Avanceret menu for videokvalitet vises Avanceret menu for videokvalitet vises ikke + + Skjul Premium kvalitetsindstillinger + Premium kvalitetsindstillinger er skjult + Premium kvalitetsindstillinger vises + Aktivér dias for at søge Dias for at søge er aktiveret @@ -1669,6 +1757,7 @@ Videoafspilning med AV1 kan hakke eller tabe billeder." + Om Annoncer Generelt diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index a5f1ec3812..a7d6425153 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -78,6 +78,9 @@ Second \"item\" text" Suchverlauf der Einstellungen anzeigen Suchverlauf der Einstellungen wird angezeigt Der Suchverlauf der Einstellungen wird nicht angezeigt + Fette Symbole deaktivieren + Symbole sind nicht fett + Symbole sind fett ReVanced-Einstellungssymbole anzeigen Einstellungssymbole werden angezeigt Einstellungssymbole werden nicht angezeigt @@ -97,23 +100,31 @@ Um neue Sprachen zu übersetzen oder die vorhandenen Übersetzungen zu verbesser and changes made here must also be made there. --> - GmsCore Einstellungen - Einstellungen für GmsCore + GmsCore + Einstellungen für GmsCore + Nach GmsCore-Updates suchen + Die Suche nach Updates ist aktiviert + Die Suche nach Updates ist deaktiviert + GmsCore Einstellungen öffnen + Einstellungen für GmsCore - MicroG GmsCore ist nicht installiert. Installieren Sie es. - Aktion notwendig - "MicroG GmsCore hat keine Berechtigung, im Hintergrund zu laufen. + MicroG GmsCore ist nicht installiert. Installieren Sie es. + Aktion notwendig + Fehler beim Überprüfen auf MicroG GmsCore Updates + Eine neue Version (%1$s) von MicroG GmsCore ist verfügbar. Derzeit verwenden Sie Version %2$s. + "MicroG GmsCore hat keine Berechtigung, im Hintergrund zu laufen. Folgen Sie der Anleitung \"Don't kill my app\" für Ihr Gerät und wenden Sie die Anweisungen auf Ihre MicroG-Installation an. Dies ist erforderlich, damit die App funktioniert." - Website öffnen - "Die Akku-Optimierung muss für MicroG GmsCore deaktiviert werden, um Probleme zu vermeiden. + Website öffnen + Abbrechen + "Die Akku-Optimierung muss für MicroG GmsCore deaktiviert werden, um Probleme zu vermeiden. Die Deaktivierung der Akku-Optimierung für MicroG hat keinen negativen Einfluss auf den Akkuverbrauch. Tippen Sie auf die Schaltfläche \"Fortfahren\" und erlauben Sie die Optimierungsänderungen." - Weiter + Weiter Spoofe Video-Streams @@ -167,10 +178,11 @@ Sie werden nicht über unerwartete Ereignisse informiert." Flags gespeichert Flags zurückgesetzt Flags in die Zwischenablage kopiert - Protokollpuffer protokollieren - Debug-Protokolle enthalten Protokollpuffer - Debug-Protokolle enthalten kein Protokollpuffer - "Wenn Sie diese Einstellung aktivieren, werden zusätzliche Layoutdaten protokolliert, einschließlich Text auf dem Bildschirm für einige UI-Komponenten. + Starten Sie die App neu, um diese Funktion zu nutzen + Protokollpuffer protokollieren + Debug-Protokolle enthalten Protokollpuffer + Debug-Protokolle enthalten kein Protokollpuffer + "Wenn Sie diese Einstellung aktivieren, werden zusätzliche Layoutdaten protokolliert, einschließlich Text auf dem Bildschirm für einige UI-Komponenten. Dies kann helfen, Komponenten bei der Erstellung benutzerdefinierter Filter zu identifizieren. @@ -216,6 +228,9 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad Hintergrundwiedergabe von Shorts ist aktiviert + Creator-Shop-Regal ausblenden + Creator Store-Regal unter dem Videoplayer ist ausgeblendet + Creator Store-Regal unter dem Videoplayer wird angezeigt Albumkarten ausblenden Albumkarten werden ausgeblendet Albumkarten werden angezeigt @@ -225,6 +240,9 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad Chips ausblenden Chips werden ausgeblendet Chips werden angezeigt + Kommentarbereich unter Videos im Home-Feed ausblenden + Kommentarbereich unter Videos im Home-Feed ist ausgeblendet + Kommentarbereich unter Videos im Home-Feed wird angezeigt Communitybeiträge ausblenden Communitybeiträge sind ausgeblendet Communitybeiträge werden angezeigt @@ -252,14 +270,19 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad Neueste Beiträge ausblenden Neueste Beiträge werden ausgeblendet Neueste Beiträge werden angezeigt + + Schaltfläche „Neueste Videos“ ausblenden + Schaltfläche „Neueste Videos“ ist ausgeblendet + Schaltfläche „Neueste Videos“ wird angezeigt Mix-Wiedergabelisten ausblenden Mix-Wiedergabelisten werden ausgeblendet Mix-Wiedergabelisten werden angezeigt Film-Bereich ausblenden Film-Bereich wird ausgeblendet Film-Bereich wird angezeigt - + Schaltfläche \"Benachrichtige mich\" ausblenden Schaltfläche \"Benachrichtige mich\" wird ausgeblendet Schaltfläche \"Benachrichtige mich\" wird angezeigt @@ -284,12 +307,16 @@ Wenn Sie dies aktivieren, werden jedoch auch einige Benutzerdaten wie Ihre IP-Ad Visuellen Abstandshalter ausblenden Visueller Abstandshalter ist ausgeblendet Visueller Abstandshalter ist sichtbar + Suchergebnisse ausblenden + Web-Suchergebnisse sind ausgeblendet + Web-Suchergebnisse werden angezeigt + Bereich „Das könnte dir gefallen“ ausblenden + Bereich „Das könnte dir gefallen“ ist ausgeblendet + Bereich „Das könnte dir gefallen“ wird angezeigt YouTube Doodles ausblenden YouTube Doodles-Animation auf dem Logo ist ausgeblendet YouTube Doodles Animation auf dem Logo wird angezeigt - "YouTube-Doodles werden ein paar Tage im Jahr angezeigt. -Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Ausblenden aktiviert ist, wird auch die Filterleiste unterhalb der Suchleiste ausgeblendet." Senderleiste ausblenden Kanalleiste ist ausgeblendet Kanalleiste wird angezeigt @@ -306,10 +333,15 @@ Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Info-Panels sind ausgeblendet Info-Panels werden angezeigt + This button usually appears in the video player for certain videos. --> \"Abonnieren\"-Button ausblenden Schaltfläche \"Beitreten\" ist ausgeblendet Schaltfläche \"Beitreten\" wird angezeigt + + Schaltfläche „Live-Chat-Wiedergabe“ ausblenden + Schaltfläche „Live-Chat-Wiedergabe“ im Player-Overlay ist ausgeblendet + Schaltfläche „Live-Chat-Wiedergabe“ im Player-Overlay wird angezeigt Verstecke medizinische Panels Medizinische Panels sind ausgeblendet Medizinische Panels werden angezeigt @@ -325,6 +357,9 @@ Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Zeitliche Reaktionen ausblenden Zeitgesteuerte Reaktionen sind ausgeblendet Zeitgesteuerte Reaktionen werden angezeigt + Videotitel ausblenden + Videotitel im Player-Overlay ist ausgeblendet + Videotitel im Player-Overlay wird angezeigt \'KI-generierte Videozusammenfassung\' ausblenden KI-generierter Videozusammenfassungsbereich ist ausgeblendet Abschnitt mit KI-generierter Videozusammenfassung wird angezeigt @@ -337,33 +372,62 @@ Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Kapitel ausblenden Kapitel ist ausgeblendet Kapitel wird angezeigt - \"Wie dieser Inhalt erstellt wurde\" ausblenden - Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" ist ausgeblendet - Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" wird angezeigt - Hype-Punkte ausblenden - Hype-Punkte sind ausgeblendet - Hype-Punkte werden angezeigt + „Kursfortschritt“ ausblenden + Abschnitt „Kursfortschritt“ ist ausgeblendet + Abschnitt „Kursfortschritt“ wird angezeigt + Erkunden ausblenden + Die Abschnitte „Diesen Kurs erkunden“ und „Podcast erkunden“ sind ausgeblendet + Die Abschnitte „Diesen Kurs erkunden“ und „Podcast erkunden“ werden angezeigt + „Diesen Kurs erkunden“ ausblenden + Abschnitt „Diesen Kurs erkunden“ ist ausgeblendet + Abschnitt „Diesen Kurs erkunden“ wird angezeigt + \'Podcast entdecken\' ausblenden + Der Abschnitt „Podcast entdecken“ ist ausgeblendet + Der Abschnitt „Podcast entdecken“ wird angezeigt \'Podcast entdecken\' ausblenden Der Abschnitt \"Podcast entdecken\" ist ausgeblendet Der Abschnitt \"Podcast entdecken\" wird angezeigt Empfohlene Links ausblenden Bereich „Empfohlene Links“ wird ausgeblendet Bereich „Empfohlene Links“ wird angezeigt + „Besondere Orte“ ausblenden + Abschnitt „Besondere Orte“ ist ausgeblendet + Abschnitt „Besondere Orte“ wird angezeigt Empfohlene Videos ausblenden Bereich „Empfohlene Videos“ wird ausgeblendet Bereich „Empfohlene Videos“ wird angezeigt + Feed-Flyout-Menüfilter aktivieren + Feed-Flyout-Menüfilter ist aktiviert + Feed-Flyout-Menüfilter ist deaktiviert + Feed-Flyout-Menüfilter + Geben Sie die Namen der Flyout-Menüs ein, nach denen gefiltert werden soll, jeweils einen pro Zeile + Gaming ausblenden + Abschnitt „Gaming“ ist ausgeblendet + Abschnitt „Gaming“ wird angezeigt + \"Wie dieser Inhalt erstellt wurde\" ausblenden + Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" ist ausgeblendet + Der Abschnitt \"Wie dieser Inhalt erstellt wurde\" wird angezeigt + Hype-Punkte ausblenden + Hype-Punkte sind ausgeblendet + Hype-Punkte werden angezeigt Infokarten ausblenden Info-Kartenbereich ist ausgeblendet Info-Kartenbereich wird angezeigt \'Schlüsselkonzepte\' ausblenden Abschnitt \"Schlüsselkonzepte\" ist ausgeblendet Abschnitt \"Schlüsselkonzepte\" wird angezeigt + Musik ausblenden + Abschnitt „Musik“ ist ausgeblendet + Abschnitt „Musik“ wird angezeigt Schaltfläche „Abonnieren“ ausblenden Schaltfläche „Abonnieren“ wird ausgeblendet Schaltfläche „Abonnieren“ wird angezeigt Transkript ausblenden Transkript-Abschnitt ist ausgeblendet Sektion Transkripte wird angezeigt + Quizze ausblenden + Abschnitt „Quizze“ ist ausgeblendet + Abschnitt „Quizze“ wird angezeigt Videobeschreibung Komponenten der Videobeschreibung ausblenden oder anzeigen Filterleiste @@ -382,6 +446,11 @@ Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Im Wiedergabeverlauf angezeigt Kanalseite Kanalseitenkomponenten ausblenden oder anzeigen + Kanal-Tab-Filter aktivieren + Kanal-Tab-Filter ist aktiviert + Kanal-Tab-Filter ist deaktiviert + Kanal-Tab-Filter + Geben Sie die Namen der Kanal-Tabs ein, nach denen gefiltert werden soll, jeweils einen pro Zeile Schaltfläche \"Community\" ausblenden Community-Schaltfläche ist ausgeblendet @@ -445,15 +514,15 @@ Wenn ein Doodle zurzeit in Ihrer Region angezeigt wird und diese Einstellung zum Aufrufe werden im Feed und in den Suchergebnissen angezeigt "Einschränkungen: -• Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Aufrufe anzeigen -• Diese Funktion funktioniert nicht mit dem Automotive-Formfaktor" +• Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Aufrufe anzeigen. +• Diese Funktion funktioniert nicht mit dem Automotive-Formfaktor." Upload-Zeit ausblenden Die Upload-Zeit ist im Feed und in den Suchergebnissen ausgeblendet Die Upload-Zeit wird im Feed und in den Suchergebnissen angezeigt "Einschränkungen: -• Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Upload-Zeiten anzeigen -• Diese Funktion funktioniert nicht mit dem Automobil-Formfaktor" +• Shorts-Regale, Kanalseiten und Suchergebnisse können weiterhin Upload-Zeiten anzeigen. +• Diese Funktion funktioniert nicht mit dem Automobil-Formfaktor." Keyword-Inhalt ausblenden Verstecke Such- und Feed-Videos mit Schlüsselwortfilter Home-Videos nach Schlüsselwörtern ausblenden @@ -476,10 +545,10 @@ Wörter mit Großbuchstaben in der Mitte müssen mit der Groß- und Kleinschreib Über Keyword-Filterung "Startseite/Abonnements/Suchergebnisse werden gefiltert, um Inhalte auszublenden, die mit Stichwortphrasen übereinstimmen -Einschränkungen +Einschränkungen: • Shorts können nicht nach Kanalnamen ausgeblendet werden -• Einige UI-Komponenten können nicht ausgeblendet werden -• Die Suche nach einem Stichwort kann zu keinen Ergebnissen führen" +• Einige UI-Komponenten können möglicherweise nicht ausgeblendet werden +• Die Suche nach einem Stichwort liefert möglicherweise keine Ergebnisse" Ganze Wörter abgleichen Durch das Umschließen mit doppelten Anführungszeichen wird verhindert, dass teilweise Videotitel und Kanalnamen<br><br><br><b>\"ai\"</b> wird das Video ausblenden: <b>How does AI work?</b><br>aber nicht versteckt: <b>What does fair use mean?</b> @@ -491,19 +560,12 @@ Einschränkungen Stichwort wird alle Videos ausblenden: %s - Creator-Shop-Regal ausblenden - Creator Store-Regal unter dem Videoplayer ist ausgeblendet - Creator Store-Regal unter dem Videoplayer wird angezeigt Endbild-Banner ausblenden Endbildschirm-Shop-Banner ist ausgeblendet Endbildschirm-Shop-Banner wird angezeigt Vollbild-Werbung ausblenden - "Vollbildwerbung wird ausgeblendet - -Diese Funktion ist nur für ältere Geräte verfügbar" + Vollbild-Anzeigen sind ausgeblendet Vollbild-Anzeigen werden angezeigt - - Vollbild-Werbung ausblenden funktioniert nur mit älteren Geräten Allgemeine Werbung ausblenden Allgemeine Werbung werden ausgeblendet Allgemeine Werbung werden angezeigt @@ -513,6 +575,9 @@ Diese Funktion ist nur für ältere Geräte verfügbar" \"Enthält bezahlte Werbung\"-Hinweis ausblenden \"Enthält bezahlte Werbung\"-Hinweis wird ausgeblendet \"Enthält bezahlte Werbung\"-Hinweis wird angezeigt + Player-Popup-Anzeigen ausblenden + Player-Popup-Anzeigen sind ausgeblendet + Player-Popup-Anzeigen werden angezeigt Selbst gesponserte Karten ausblenden Selbst gesponserte Karten sind ausgeblendet Selbstgesponserte Karten werden angezeigt @@ -520,31 +585,26 @@ Diese Funktion ist nur für ältere Geräte verfügbar" Shopping-Links in der Videobeschreibung sind ausgeblendet Shopping-Links in der Videobeschreibung werden angezeigt „Produkte ansehen“-Banner ausblenden - Produkte anzeigen-Banner im Video-Overlay ist ausgeblendet - Produkte anzeigen-Banner im Video-Overlay wird angezeigt - Suchergebnisse ausblenden - Web-Suchergebnisse sind ausgeblendet - Web-Suchergebnisse werden angezeigt - - - YouTube Premium-Aktionen ausblenden - YouTube-Premium-Angebote unterm Video-Player sind ausgeblendet - YouTube-Premium-Aktionen unter Video-Player werden angezeigt + „Produkte anzeigen“-Banner im Player-Overlay ist ausgeblendet + „Produkte anzeigen“-Banner im Player-Overlay wird angezeigt + YouTube Premium-Aktionen ausblenden + YouTube Premium-Aktionen sind ausgeblendet + YouTube Premium-Aktionen werden angezeigt Videowerbung ausblenden Video-Anzeigen sind ausgeblendet Video-Anzeigen werden angezeigt - + URL in Zwischenablage kopiert URL mit Zeitstempel kopiert Video-URL-Schaltfläche kopieren anzeigen - Schaltfläche \"Video-URL kopieren\" wird angezeigt. Tippen, um Video-URL zu kopieren. Tippen und halten, um mit Zeitstempel zu kopieren. - Schaltfläche \"Video-URL kopieren\" wird nicht angezeigt - Kopiere Zeitstempel URL-Schaltfläche anzeigen - Schaltfläche \"URL mit Zeitstempel kopieren\" wird angezeigt. Tippen, um Video-URL mit Zeitstempel zu kopieren. Tippen und halten, um ohne Zeitstempel zu kopieren. - Schaltfläche \"URL mit Zeitstempel kopieren\" wird nicht angezeigt + Schaltfläche „Video-URL kopieren“ wird angezeigt. Tippen, um Video-URL zu kopieren. Tippen und halten, um mit Zeitstempel zu kopieren. + Schaltfläche „Video-URL kopieren“ wird nicht angezeigt + Schaltfläche „URL mit Zeitstempel kopieren“ anzeigen + Schaltfläche „URL mit Zeitstempel kopieren“ wird angezeigt. Tippen, um Video-URL mit Zeitstempel zu kopieren. Tippen und halten, um ohne Zeitstempel zu kopieren. + Schaltfläche „URL mit Zeitstempel kopieren“ wird nicht angezeigt Diskretion des Betrachters entfernen @@ -552,10 +612,10 @@ Diese Funktion ist nur für ältere Geräte verfügbar" Dialog wird angezeigt Dies umgeht nicht die Altersbeschränkung, sondern akzeptiert sie nur automatisch. - - Pop-up \"Beim Fernseher anmelden\" deaktivieren - Pop-up \"Bei TV anmelden\" ist deaktiviert - Pop-up \"Bei TV anmelden\" ist aktiviert + + Pop-up „Beim Fernseher anmelden“ deaktivieren + Pop-up „Bei TV anmelden“ ist deaktiviert + Pop-up „Bei TV anmelden“ ist aktiviert Doppeltippen zum Kapitelüberspringen deaktivieren @@ -588,10 +648,10 @@ Stellen Sie sicher, dass der Paketname korrekt ist und die App installiert ist"< Geste ist deaktiviert Geste ist aktiviert - - Tippen zum Suchen aktivieren - Tippen zum Suchen ist aktiviert - Tippen zum Suchen ist deaktiviert + + Tippen zum Suchen aktivieren + Tippen zum Suchen ist aktiviert + Tippen zum Suchen ist deaktiviert Helligkeitsgeste aktivieren @@ -670,7 +730,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Kommentare-Schaltfläche ist ausgeblendet Kommentare-Schaltfläche wird angezeigt + This button usually appears on live streamed videos. --> Bericht ausblenden Bericht-Button ist ausgeblendet Bericht-Button wird angezeigt @@ -683,7 +743,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Download-Button ist ausgeblendet Download-Button wird angezeigt + This button usually appears on videos uploaded by the logged-in user. --> Hypen ausblenden Hypen-Button ist ausgeblendet Hypen-Button wird angezeigt @@ -696,7 +756,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Dankeschön-Taste ist ausgeblendet Dankeschön Button wird angezeigt + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ask ausblenden Ask-Button ist ausgeblendet Ask-Button wird angezeigt @@ -704,6 +764,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Clip ausblenden Clip-Button ist ausgeblendet Clip-Taste wird angezeigt + Das Ausblenden funktioniert möglicherweise nicht für einige Benutzerkonten. Shop ausblenden Shop-Button ist ausgeblendet @@ -713,13 +774,13 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Schaltfläche \"Speichern\" ist ausgeblendet Schaltfläche \"Speichern\" ist sichtbar - + Navigationstasten - Verstecke oder ändere Schaltflächen in der Navigationsleiste + Navigationsleisten-Schaltflächen ausblenden oder ändern - Haus ausblenden - Home-Taste ist ausgeblendet - Home-Taste wird angezeigt + Startseite ausblenden + Start-Schaltfläche ist ausgeblendet + Start-Schaltfläche wird angezeigt Shorts ausblenden Shorts Button ist ausgeblendet @@ -727,7 +788,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Erstellen ausblenden Erstellen-Button ist ausgeblendet - Erstelle Schaltfläche wird angezeigt + Erstellen-Schaltfläche wird angezeigt Abonnements ausblenden Abonnement-Button ist ausgeblendet @@ -736,27 +797,45 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Benachrichtigungs-Button ist ausgeblendet Benachrichtigungs-Button wird angezeigt - Tauscht Erstellen mit Benachrichtigungen - "Die Schaltfläche \"Erstellen\" wird mit der Schaltfläche \"Benachrichtigungen\" vertauscht - -Hinweis: Durch Aktivieren dieser Option wird auch die Videowerbung zwangsweise ausgeblendet" + Erstellen mit Benachrichtigungen tauschen + „Erstellen“-Schaltfläche ist mit „Benachrichtigungen“-Schaltfläche getauscht Erstellen-Button ist nicht mit Benachrichtigungs-Button getauscht - "Wenn Sie diese Einstellung deaktivieren, wird auch die Anzeigenblockierung für \"Shorts\" deaktiviert. - -Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus zu wechseln." - Navigationstastenbezeichnungen ausblenden - Labels sind ausgeblendet - Labels werden angezeigt + Falls die Änderung dieser Einstellung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus zu wechseln. + Beschriftungen der Navigationsschaltflächen ausblenden + Beschriftungen sind ausgeblendet + Beschriftungen werden angezeigt + Schmale Navigationsschaltflächen aktivieren + Abstand zwischen Navigationsschaltflächen ist schmal + Abstand zwischen Navigationsschaltflächen ist normal + Navigationsleisten-Animationen aktivieren + Navigationsübergänge sind animiert + Navigationsübergänge sind nicht animiert Transluzente Statusleiste deaktivieren Statusleiste ist undurchsichtig Die Statusleiste ist undurchsichtig oder durchscheinend - Auf einigen Geräten kann die Aktivierung dieser Funktion die Systemnavigationsleiste in transparent ändern. - Hellen, lichtdurchlässigen Balken deaktivieren - Heller Navigationsbalken ist opak - Die Navigationsleiste im hellen Modus ist undurchsichtig oder durchscheinend - Deaktiviere die dunkle, durchscheinende Leiste - Dunkler Navigationsbalken ist opak - Die Navigationsleiste im dunklen Modus ist undurchsichtig oder durchscheinend + "Einschränkungen: +• Oben im Videoplayer kann ein schwarzer Balken erscheinen. +• Auf einigen Geräten kann die Aktivierung dieser Funktion die Systemnavigationsleiste transparent machen." + Helle transluzente Leiste deaktivieren + Navigationsleiste im hellen Modus ist opak + Navigationsleiste im hellen Modus ist undurchsichtig oder durchscheinend + Dunkle transluzente Leiste deaktivieren + Navigationsleiste im dunklen Modus ist opak + Navigationsleiste im dunklen Modus ist undurchsichtig oder durchscheinend + Symbolleiste + Symbolleistenkomponenten ausblenden oder ändern + „Erstellen“-Schaltfläche ausblenden + „Erstellen“-Schaltfläche ist ausgeblendet + „Erstellen“-Schaltfläche wird angezeigt + „Benachrichtigungen“-Schaltfläche ausblenden + „Benachrichtigungen“-Schaltfläche ist ausgeblendet + „Benachrichtigungen“-Schaltfläche wird angezeigt + Suchschaltfläche ausblenden + Suchschaltfläche ist ausgeblendet + Suchschaltfläche wird angezeigt. + breite Suchleiste aktivieren + Breite Suchleiste ist aktiviert + Breite Suchleiste ist deaktiviert Einblendmenü @@ -829,6 +908,12 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Cast-Button ausblenden Der Cast button ist ausgeblendet Der Cast button wird angezeigt + Schaltfläche „Reduzieren“ ausblenden + Schaltfläche „Reduzieren“ ist ausgeblendet + Schaltfläche „Reduzieren“ wird angezeigt + Schaltfläche „Vollbild“ ausblenden + Schaltfläche „Vollbild“ ist ausgeblendet + Schaltfläche „Vollbild“ wird angezeigt Hintergrund der Player-Steuerelemente ausblenden Hintergrund der Wiedergabesteuerung ist ausgeblendet Hintergrund der Player-Steuerelemente wird angezeigt @@ -837,9 +922,9 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Tasten werden angezeigt - Endkarte ausblenden - Endbildschirmkarten sind ausgeblendet - Endbildschirmkarten werden angezeigt + Endbildschirmkarten ausblenden + Endbildschirmkarten sind ausgeblendet + Endbildschirmkarten werden angezeigt Ambient-Modus im Vollbildmodus deaktivieren @@ -864,10 +949,16 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Suchleiste für Video-Thumbnails ausblenden Suchleiste für Video-Thumbnails ist ausgeblendet Suchleiste für Video-Thumbnails ist eingeblendet + Große Vollbild-Suchleiste aktivieren + Vollbild-Suchleiste ist groß + Vollbild-Suchleiste ist normalgroß Shorts Spieler Shorts-Player-Komponenten aus- oder einblenden + Shorts auf der Kanalseite ausblenden + Auf der Kanalseite ausgeblendet + Auf der Kanalseite angezeigt Shorts im Startseiten-Feed ausblenden Im Startseiten-Feed und verwandten Videos ausgeblendet @@ -879,9 +970,18 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Shorts im Abos-Feed ausblenden Im Abos-Feed ausgeblendet Im Abos-Feed angezeigt + Shorts in der Videobeschreibung ausblenden + In Videobeschreibung ausgeblendet + In Videobeschreibung angezeigt Shorts im Verlauf verstecken Im Verlauf versteckt Im Verlauf angezeigt + KI-Schaltfläche ausblenden + KI-Schaltfläche ist ausgeblendet + KI-Schaltfläche wird angezeigt + Label \"Automatisch synchronisiert\" ausblenden + Automatisch synchronisiertes Label ist ausgeblendet + Automatisch synchronisiertes Label wird angezeigt Label \"Automatisch synchronisiert\" ausblenden Automatisch synchronisiertes Label ist ausgeblendet Automatisch synchronisiertes Label wird angezeigt @@ -943,6 +1043,7 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Schaltfläche \"Diese Vorlage verwenden\" ausblenden Schaltfläche \"Diese Vorlage verwenden\" ist ausgeblendet Schaltfläche „Diese Vorlage verwenden“ wird angezeigt + \'Like\'-Button-Fontäne ausblenden Wie Knopf Fontänen-Animation ist ausgeblendet Wie Button Fontänen-Animation wird angezeigt @@ -985,7 +1086,12 @@ Wenn diese Änderung nicht wirksam wird, versuchen Sie, in den Inkognito-Modus z Navigationsleiste ist ausgeblendet Navigationsleiste wird angezeigt - + + Autoplay-Vorschau ausblenden + Autoplay-Vorschau ist ausgeblendet + Autoplay-Vorschau wird angezeigt + + Vorgeschlagenes Video auf dem Endbildschirm ausblenden "Das vorgeschlagene Video auf dem Endbildschirm wird ausgeblendet, wenn die automatische Wiedergabe deaktiviert ist. @@ -1004,9 +1110,9 @@ Einstellungen → Wiedergabe → Nächstes Video automatisch abspielen" Zeitstempel wird angezeigt - Player-Popup-Panels ausblenden - Player-Popup-Fenster sind ausgeblendet - Player-Popup-Fenster werden angezeigt + Player-Popup-Panels ausblenden + Player-Popup-Fenster sind ausgeblendet + Player-Popup-Fenster werden angezeigt Beenden Sie den Vollbildmodus am Ende des Videos @@ -1074,24 +1180,6 @@ Einschränkung: Dislikes werden möglicherweise nicht im Inkognito-Modus angezei Client-Ratenlimit %d-mal erreicht %d Millisekunden - - breite Suchleiste aktivieren - Breite Suchleiste ist aktiviert - Breite Suchleiste ist deaktiviert - - - Aktiviere hochwertige Vorschaubilder - Thumbnails der Suchleiste sind hohe Qualität - Thumbnails in der Suchleiste sind mittlere Qualität - "Dadurch werden auch Miniaturansichten in Livestreams wiederhergestellt, die keine Miniaturansichten mit Suchleiste haben. - -Miniaturansichten mit Suchleiste verwenden die gleiche Qualität wie das aktuelle Video. - -Diese Funktion funktioniert am besten mit einer Videoqualität von 720p oder niedriger und bei Verwendung einer sehr schnellen Internetverbindung." - Alte Suchleisten-Thumbnails wiederherstellen - Suchleisten-Thumbnails werden über der Suchleiste angezeigt - Miniaturansichten werden im Vollbild angezeigt - SponsorBlock aktivieren SponsorBlock ist ein Crowdsourcing-System zum Überspringen von nervigen Segmenten von YouTube-Videos @@ -1328,8 +1416,6 @@ Wenn Sie die Funktion später deaktivieren, wird empfohlen, die App-Daten zu lö Spoof-App-Versionsziel 20.13.41 - Nicht eingeklappte Video-Aktionsleiste wiederherstellen 20.05.46 - Funktionalität der Transkription wiederherstellen - 19.35.36 - Alte Shorts Spielersymbole wiederherstellen - 19.01.34 - Alte Navigations-Symbole wiederherstellen Startseite ändern @@ -1428,8 +1514,9 @@ Der Mini-Player kann mit einer Wischgeste vom Bildschirm nach links oder rechts Lade Bildschirm hat einen Farbverlauf Hintergrund Das Laden des Bildschirms wird einen soliden Hintergrund haben Art des Begrüßungsbildschirms - Farbe - Schwarz und Weiß + Deaktiviert + Farbe + Schwarz und Weiß Eigene Suchleistenfarbe aktivieren Angepasste Suchleistenfarbe wird angezeigt Originalfarbe der Suchleiste wird angezeigt @@ -1534,6 +1621,9 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w Haptik für das Rückgängigmachen der Suche deaktivieren Die Haptik für das Rückgängigmachen der Suche ist deaktiviert Die Haptik für das Rückgängigmachen der Suche ist aktiviert + Haptisches Feedback bei Tippen und Halten deaktivieren + Haptisches Feedback bei Tippen und Halten ist deaktiviert + Haptisches Feedback bei Tippen und Halten ist aktiviert Zoomhaptik deaktivieren Zoomhaptik ist deaktiviert Zoomhaptik ist aktiviert @@ -1629,6 +1719,11 @@ Einschränkungen: Erweitertes Videoqualitätsmenü wird angezeigt Erweitertes Videoqualitätsmenü wird nicht angezeigt + + Optionen für Premium-Qualität ausblenden + Optionen für Premium-Qualität sind ausgeblendet + Optionen für Premium-Qualität werden angezeigt + Folie zum Suchen aktivieren Slide zum Suchen ist aktiviert @@ -1660,6 +1755,7 @@ Die Videowiedergabe mit AV1 kann stottern oder Bilder überspringen." + Über Werbung Allgemein diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 8bca06358a..f8dcb2d550 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Εμφάνιση ιστορικού αναζήτησης ρυθμίσεων Το ιστορικό αναζήτησης ρυθμίσεων εμφανίζεται Το ιστορικό αναζήτησης ρυθμίσεων δεν εμφανίζεται + Απενεργοποίηση έντονων εικονιδίων + Τα εικονίδια δεν είναι έντονα + Τα εικονίδια είναι έντονα Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced Τα εικονίδια ρυθμίσεων εμφανίζονται Τα εικονίδια ρυθμίσεων δεν εμφανίζονται @@ -101,23 +104,31 @@ Second \"item\" text" and changes made here must also be made there. --> - Ρυθμίσεις GmsCore - Ρυθμίσεις για το MicroG GmsCore + MicroG GmsCore + Ρυθμίσεις που σχετίζονται με το MicroG GmsCore + Έλεγχος για ενημερώσεις του MicroG GmsCore + Ο έλεγχος για ενημερώσεις είναι ενεργοποιημένος + Ο έλεγχος για ενημερώσεις είναι απενεργοποιημένος + Άνοιγμα ρυθμίσεων GmsCore + Ρυθμίσεις του GmsCore - Το MicroG GmsCore δεν έχει εγκατασταθεί. Εγκαταστήστε το. - Απαιτείται ενέργεια - "Το MicroG GmsCore δεν έχει άδεια να εκτελείται στο παρασκήνιο. + Το MicroG GmsCore δεν έχει εγκατασταθεί. Εγκαταστήστε το. + Απαιτείται ενέργεια + Απέτυχε ο έλεγχος για ενημερώσεις του MicroG GmsCore + Μια νέα έκδοση (%1$s) του MicroG GmsCore είναι διαθέσιμη. Αυτή την στιγμή, χρησιμοποιείτε την έκδοση %2$s. + "Το MicroG GmsCore δεν έχει άδεια να εκτελείται στο παρασκήνιο. Ακολουθήστε τον οδηγό \"Don't kill my app\" για το τηλέφωνό σας και εφαρμόστε τις οδηγίες στο MicroG. Αυτό είναι απαραίτητο για τη σωστή λειτουργία της εφαρμογής." - Άνοιγμα ιστοσελίδας - "Οι βελτιστοποιήσεις μπαταρίας πρέπει να απενεργοποιηθούν για το MicroG GmsCore ώστε να αποφευχθούν προβλήματα. + Άνοιγμα ιστοσελίδας + Ακύρωση + "Οι βελτιστοποιήσεις μπαταρίας πρέπει να απενεργοποιηθούν για το MicroG GmsCore ώστε να αποφευχθούν προβλήματα. Η απενεργοποίηση των βελτιστοποιήσεων μπαταρίας για το MicroG δεν θα επηρεάσει αρνητικά την κατανάλωση ενέργειας. Πατήστε το κουμπί «Συνέχεια» και επιτρέψτε τις αλλαγές βελτιστοποίησης." - Συνέχεια + Συνέχεια Παραποίηση ροών βίντεο @@ -173,10 +184,11 @@ Second \"item\" text" Οι σημαίες αποθηκεύτηκαν Οι σημαίες επαναφέρθηκαν Οι σημαίες αντιγράφηκαν στο πρόχειρο - Καταγραφή του buffer πρωτοκόλλου - Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν το buffer του πρωτοκόλλου - Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν τον buffer πρωτοκόλλου - "Η ενεργοποίηση αυτής της ρύθμισης θα καταγράψει επιπλέον δεδομένα διάταξης, συμπεριλαμβανομένου του κειμένου στην οθόνη για ορισμένα στοιχεία διεπαφής χρήστη. + Επανεκκινήστε την εφαρμογή για να χρησιμοποιήσετε αυτήν τη λειτουργία + Καταγραφή του buffer πρωτοκόλλου + Τα αρχεία καταγραφής σφαλμάτων περιλαμβάνουν το buffer του πρωτοκόλλου + Τα αρχεία καταγραφής σφαλμάτων δεν περιλαμβάνουν τον buffer πρωτοκόλλου + "Η ενεργοποίηση αυτής της ρύθμισης θα καταγράψει επιπλέον δεδομένα διάταξης, συμπεριλαμβανομένου του κειμένου στην οθόνη για ορισμένα στοιχεία διεπαφής χρήστη. Αυτό μπορεί να βοηθήσει στον εντοπισμό στοιχείων κατά τη δημιουργία προσαρμοσμένων φίλτρων. @@ -226,6 +238,13 @@ Second \"item\" text" Η αναπαραγωγή παρασκηνίου είναι ενεργοποιημένη για τα Shorts + Ενότητα καταστήματος δημιουργού + Κρυμμένη + +Αφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής + Εμφανίζεται + +Αφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής Κάρτες άλμπουμ Κρυμμένες Εμφανίζονται @@ -235,6 +254,9 @@ Second \"item\" text" Ενότητα σχετιζόμενων λέξεων Κρυμμένη Εμφανίζεται + Eνότητα σχολίων κάτω από βίντεο στην αρχική ροή + Κρυμμένη + Εμφανίζεται Δημοσιεύσεις κοινότητας Κρυμμένες Εμφανίζονται @@ -264,14 +286,19 @@ Second \"item\" text" Τελευταίες δημοσιεύσεις Κρυμμένες Εμφανίζονται + + Κουμπί «Τελευταία βίντεο» + Κρυμμένο + Εμφανίζεται Λίστες αναπαραγωγής μίξης Κρυμμένες Εμφανίζονται Ενότητα ταινιών Κρυμμένη Εμφανίζεται - + Κουμπί «Να λαμβάνω ειδοποιήσεις» Κρυμμένο Εμφανίζεται @@ -296,13 +323,16 @@ Second \"item\" text" Οπτικό διαχωριστικό Κρυμμένο Εμφανίζεται + Αποτελέσματα αναζήτησης στο διαδίκτυο + Κρυμμένα + Εμφανίζονται + Ενότητα «Ενδέχεται να σας αρέσουν» + Κρυμμένη + Εμφανίζεται YouTube Doodles Κρυμμένα\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο Εμφανίζεται\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο - "Τα YouTube Doodles εμφανίζονται για μερικές μέρες κάθε χρόνο. - -Αν ένα YouTube Doodle εμφανίζεται αυτή τη στιγμή στην περιοχή σας και αυτή η ρύθμιση είναι ενεργοποιημένη, τότε η γραμμή φίλτρων κάτω από τη γραμμή αναζήτησης θα είναι κρυμμένη επίσης." Γραμμή καναλιού Κρυμμένη Εμφανίζεται @@ -319,10 +349,15 @@ Second \"item\" text" Κρυμμένα Εμφανίζονται + This button usually appears in the video player for certain videos. --> Κουμπί «Συμμετοχή» Κρυμμένο Εμφανίζεται + + Κουμπί «Επανάληψη ζωντανής συζήτησης» + Κρυμμένο + Εμφανίζεται Πάνελ ιατρικών πληροφοριών Κρυμμένα Εμφανίζονται @@ -338,6 +373,13 @@ Second \"item\" text" Συγχρονισμένες αντιδράσεις Κρυμμένες Εμφανίζονται + Τίτλος του βίντεο + Κρυμμένος + +Αφορά τον τίτλο του βίντεο στη λειτουργία πλήρους οθόνης + Εμφανίζεται + +Αφορά τον τίτλο του βίντεο στη λειτουργία πλήρους οθόνης Σύνοψη βίντεο που δημιουργήθηκε από AI Κρυμμένη Εμφανίζεται @@ -350,33 +392,66 @@ Second \"item\" text" Κεφάλαια του βίντεο Κρυμμένη Εμφανίζεται - Ενότητα «Πως δημιουργήθηκε» - Κρυμμένη - Εμφανίζεται - Πόντοι Hype - Κρυμμένοι - Εμφανίζονται + Ενότητα «Πρόοδος μαθήματος» + Κρυμμένη + Εμφανίζεται + Ενότητες «Εξερεύνηση» + Κρυμμένες + +Αφορά τις ενότητες «Εξερευνήστε αυτή τη σειρά μαθημάτων» και «Εξερευνήστε το podcast» + Εμφανίζονται + +Αφορά τις ενότητες «Εξερευνήστε αυτή τη σειρά μαθημάτων» και «Εξερευνήστε το podcast» + Ενότητα «Εξερευνήστε αυτή τη σειρά μαθημάτων» + Κρυμμένη + Εμφανίζεται + Ενότητα «Εξερευνήστε το podcast» + Κρυμμένη + Εμφανίζεται Ενότητα «Εξερευνήστε το podcast» Κρυμμένη Εμφανίζεται Ενότητα προτεινόμενων συνδέσμων Κρυμμένη Εμφανίζεται + Ενότητα «Προτεινόμενα μέρη» + Κρυμμένη + Εμφανίζεται Ενότητα προτεινόμενων βίντεο Κρυμμένη Εμφανίζεται + Φιλτράρισμα των αναδυόμενων μενού στη ροή + Το φιλτράρισμα αναδυόμενων μενού στη ροή είναι ενεργοποιημένο + Το φιλτράρισμα αναδυόμενων μενού στη ροή είναι απενεργοποιημένο + Φίλτρο αναδυόμενων μενού ροής + Εισάγετε τα ονόματα των αναδυόμενων μενού για φιλτράρισμα, ένα ανά γραμμή + Ενότητα «Παιχνίδια» + Κρυμμένη + Εμφανίζεται + Ενότητα «Πως δημιουργήθηκε» + Κρυμμένη + Εμφανίζεται + Πόντοι Hype + Κρυμμένοι + Εμφανίζονται Ενότητα καρτών πληροφοριών Κρυμμένη Εμφανίζεται Ενότητα «Βασικές έννοιες» Κρυμμένη Εμφανίζεται + Ενότητα «Μουσική» + Κρυμμένη + Εμφανίζεται Κουμπί «Εγγραφή» Κρυμμένο Εμφανίζεται Ενότητα «Μεταγραφή» Κρυμμένη Εμφανίζεται + Ενότητα «Κουίζ» + Κρυμμένη + Εμφανίζεται Περιγραφή βίντεο Απόκρυψη ή εμφάνιση στοιχείων περιγραφής βίντεο Γραμμή φίλτρων @@ -395,6 +470,11 @@ Second \"item\" text" Εμφανίζεται Σελίδα καναλιού Απόκρυψη ή εμφάνιση στοιχείων της σελίδας καναλιού + Φιλτράρισμα καρτελών καναλιού + Το φιλτράρισμα καρτελών καναλιού είναι ενεργοποιημένο + Το φιλτράρισμα καρτελών καναλιού είναι απενεργοποιημένο + Φίλτρο καρτελών καναλιού + Εισάγετε τα ονόματα των καρτελών καναλιού για φιλτράρισμα, ένα ανά γραμμή Κουμπί «Κοινότητα» Κρυμμένο @@ -458,15 +538,15 @@ Second \"item\" text" Εμφανίζεται "Περιορισμοί: -• Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τους αριθμούς προβολών -• Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου" +• Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τους αριθμούς προβολών. +• Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου." Χρόνος μεταμόρφωσης στη ροή και στα αποτελέσματα αναζήτησης Κρυμμένος Εμφανίζεται "Περιορισμοί: -• Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τον χρόνο μεταμόρφωσης -• Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου" +• Οι ενότητες Shorts, οι σελίδες καναλιών και τα αποτελέσματα αναζήτησης ενδέχεται να εξακολουθούν να εμφανίζουν τον χρόνο μεταμόρφωσης. +• Αυτή η λειτουργία δεν λειτουργεί με την διάταξη αυτοκινήτου." Απόκρυψη περιεχομένου λέξεων-κλειδιών Απόκρυψη βίντεο ροής και αναζήτησης χρησιμοποιώντας φίλτρα λέξεων-κλειδιών Φιλτράρισμα αρχικής ροής @@ -504,19 +584,12 @@ Second \"item\" text" Θα κρυφτούν όλα τα βίντεο με την λέξη-κλειδί: %s - Ενότητα καταστήματος δημιουργού - Κρυμμένη\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής - Εμφανίζεται\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής Ετικέτα καταστήματος στην τελική οθόνη Κρυμμένη Εμφανίζεται Διαφημίσεις πλήρους οθόνης - "Κρυμμένες - -Αυτή η λειτουργία είναι διαθέσιμη μόνο για παλιότερες συσκευές" + Κρυμμένες Οι διαφημίσεις πλήρους οθόνης εμφανίζονται - - Η απόκρυψη διαφημίσεων πλήρους οθόνης λειτουργεί μόνο με παλαιότερες συσκευές Γενικές διαφημίσεις Κρυμμένες Εμφανίζονται @@ -526,6 +599,9 @@ Second \"item\" text" Ετικέτες προώθησης επί πληρωμή Κρυμμένες Εμφανίζονται + Αναδυόμενες διαφημίσεις στην οθόνη αναπαραγωγής + Κρυμμένες + Εμφανίζονται Κάρτες αυτοπροώθησης Κρυμμένες Εμφανίζονται @@ -535,28 +611,23 @@ Second \"item\" text" Ετικέτα «Προβολή προϊόντων» στην οθόνη αναπαραγωγής Κρυμμένη Εμφανίζεται - Αποτελέσματα αναζήτησης στο διαδίκτυο - Κρυμμένα - Εμφανίζονται - - - Προωθήσεις για απόκτηση YouTube Premium - Κρυμμένες - Εμφανίζονται + Προωθήσεις YouTube Premium + Κρυμμένες + Εμφανίζονται Διαφημίσεις βίντεο Κρυμμένες Εμφανίζονται - + Η διεύθυνση URL αντιγράφηκε στο πρόχειρο Η διεύθυνση URL αντιγράφηκε με χρονική σήμανση Εμφάνιση κουμπιού αντιγραφής URL του βίντεο - Το κουμπί αντιγραφής URL βίντεο εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL με χρονική σήμανση + Το κουμπί αντιγραφής URL βίντεο εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο, ή πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL με χρονική σήμανση Το κουμπί αντιγραφής URL βίντεο δεν εμφανίζεται Εμφάνιση κουμπιού αντιγραφής URL με χρονική σήμανση - Το κουμπί αντιγραφής URL με χρονική σήμανση εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο με χρονική σήμανση. Πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL χωρίς χρονική σήμανση + Το κουμπί αντιγραφής URL με χρονική σήμανση εμφανίζεται. Πατήστε για να αντιγράψετε τη διεύθυνση URL του βίντεο με χρονική σήμανση, ή πατήστε παρατεταμένα για να αντιγράψετε τη διεύθυνση URL χωρίς χρονική σήμανση Το κουμπί αντιγραφής URL με χρονική σήμανση δεν εμφανίζεται @@ -565,10 +636,10 @@ Second \"item\" text" Εμφανίζεται Αυτό δεν παρακάμπτει τον ηλικιακό περιορισμό. Απλώς τον αποδέχεται αυτόματα. - - Απενεργοποίηση αναδυόμενου παραθύρου σύνδεσης στην τηλεόραση - Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι απενεργοποιημένο - Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι ενεργοποιημένο + + Απενεργοποίηση αναδυόμενου παραθύρου σύνδεσης στην τηλεόραση + Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι απενεργοποιημένο + Το αναδυόμενο παράθυρο σύνδεσης στην τηλεόραση είναι ενεργοποιημένο Απενεργοποίηση παράλειψης κεφαλαίου με διπλό πάτημα @@ -601,10 +672,10 @@ Second \"item\" text" Η χειρονομία αναζήτησης καρέ-καρέ είναι απενεργοποιημένη Η χειρονομία αναζήτησης καρέ-καρέ είναι ενεργοποιημένη - - Πάτημα για αναζήτηση στη γραμμή προόδου - Το πάτημα για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένο - Το πάτημα για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένο + + Πάτημα για αναζήτηση + Το πάτημα για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένο + Το πάτημα για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένο Σάρωση οθόνης για φωτεινότητα @@ -685,7 +756,7 @@ Second \"item\" text" Κρυμμένο Εμφανίζεται + This button usually appears on live streamed videos. --> Μενού «Αναφορά» Κρυμμένο Εμφανίζεται @@ -698,7 +769,7 @@ Second \"item\" text" Κρυμμένο Εμφανίζεται + This button usually appears on videos uploaded by the logged-in user. --> Κουμπί «Hype» Κρυμμένο Εμφανίζεται @@ -711,7 +782,7 @@ Second \"item\" text" Κρυμμένο Εμφανίζεται + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Κουμπί «Ερώτηση» Κρυμμένο Εμφανίζεται @@ -719,6 +790,7 @@ Second \"item\" text" Κουμπί «Κλιπ» Κρυμμένο Εμφανίζεται + Η απόκρυψη μπορεί να μην λειτουργεί για ορισμένους λογαριασμούς χρηστών. Κουμπί «Αγορές» Κρυμμένο @@ -728,7 +800,7 @@ Second \"item\" text" Κρυμμένο Εμφανίζεται - + Κουμπιά γραμμής πλοήγησης Απόκρυψη ή αλλαγή κουμπιών στη γραμμή πλοήγησης @@ -751,27 +823,45 @@ Second \"item\" text" Κρυμμένο Εμφανίζεται - Εναλλαγή κουμπιού «Δημιουργία» με κουμπί «Ειδοποιήσεις» - "Γίνεται εναλλαγή θέσεων των κουμπιών «Δημιουργία» και «Ειδοποιήσεις» - -Σημείωση: Η ενεργοποίηση αυτής της ρύθμισης εξαναγκάζει επίσης την απόκρυψη των διαφημίσεων βίντεο" - Δε γίνεται εναλλαγή του κουμπιού δημιουργίας σε κουμπί ειδοποιήσεων - "Η απενεργοποίηση αυτής της ρύθμισης θα έχει ως αποτέλεσμα την εμφάνιση διαφημίσεων Shorts. - -Εάν η αλλαγή αυτής της ρύθμισης δεν έχει αποτέλεσμα, δοκιμάστε να μεταβείτε σε λειτουργία ανώνυμης περιήγησης." + Εναλλαγή κουμπιού «Δημιουργία» με το κουμπί «Ειδοποιήσεις» + Το κουμπί «Δημιουργία» εναλλάσσεται με το κουμπί «Ειδοποιήσεις» + Το κουμπί «Δημιουργία» δεν εναλλάσσεται με το κουμπί «Ειδοποιήσεις» + Εάν η αλλαγή αυτής της ρύθμισης δεν έχει αποτέλεσμα, δοκιμάστε να μεταβείτε σε λειτουργία ανώνυμης περιήγησης. Ονομασίες κουμπιών γραμμής πλοήγησης Κρυμμένες Εμφανίζονται + Κουμπιά πλοήγησης στενού στυλ + Η απόσταση μεταξύ των κουμπιών πλοήγησης είναι στενή + Η απόσταση μεταξύ των κουμπιών πλοήγησης είναι κανονική + Ενεργοποίηση κινούμενων εφέ γραμμής πλοήγησης + Οι μεταβάσεις πλοήγησης είναι κινούμενες + Οι μεταβάσεις πλοήγησης δεν είναι κινούμενες Απενεργοποίηση διαφανούς γραμμής κατάστασης Η γραμμή κατάστασης δεν είναι διαφανής Η διαφάνεια της γραμμής κατάστασης ορίζεται αυτόματα - Σε ορισμένες συσκευές, η ενεργοποίηση αυτής της λειτουργίας μπορεί να αλλάξει τη γραμμή πλοήγησης του συστήματος σε διαφανή. - Απενεργοποίηση διαφανούς γραμμής στο φωτεινό θέμα + "Περιορισμοί: +• Ενδέχεται να εμφανίζεται μια μαύρη γραμμή στην κορυφή του προγράμματος αναπαραγωγής βίντεο. +• Σε ορισμένες συσκευές, η ενεργοποίηση αυτής της λειτουργίας μπορεί να αλλάξει τη γραμμή πλοήγησης του συστήματος σε διαφανή." + Απενεργοποίηση διαφανούς γραμμής πλοήγησης στο φωτεινό θέμα Η γραμμή πλοήγησης στο φωτεινό θέμα δεν είναι διαφανής Η διαφάνεια της γραμμής πλοήγησης στο φωτεινό θέμα ορίζεται αυτόματα - Απενεργοποίηση διαφανούς γραμμής στο σκούρο θέμα + Απενεργοποίηση διαφανούς γραμμής πλοήγησης στο σκούρο θέμα Η γραμμή πλοήγησης στο σκούρο θέμα δεν είναι διαφανής Η διαφάνεια της γραμμής πλοήγησης στο σκούρο θέμα ορίζεται αυτόματα + Γραμμή εργαλείων + Απόκρυψη ή αλλαγή στοιχείων γραμμής εργαλείων + Κουμπί δημιουργίας + Κρυμμένο + Εμφανίζεται + Κουμπί ειδοποιήσεων + Κρυμμένο + Εμφανίζεται + Κουμπί αναζήτησης + Κρυμμένο + Εμφανίζεται + Ευρεία γραμμή αναζήτησης + Η ευρεία γραμμή αναζήτησης είναι ενεργοποιημένη + Η ευρεία γραμμή αναζήτησης είναι απενεργοποιημένη Αναδυόμενο μενού ρυθμίσεων @@ -846,6 +936,12 @@ Second \"item\" text" Κουμπί μετάδοσης Κρυμμένο Εμφανίζεται + Κουμπί ελαχιστοποίησης + Κρυμμένο + Εμφανίζεται + Κουμπί λειτουργίας πλήρους οθόνης + Κρυμμένο + Εμφανίζεται Φόντο κουμπιών ελέγχου οθόνης αναπαραγωγής Κρυμμένο Εμφανίζεται @@ -854,9 +950,9 @@ Second \"item\" text" Εμφανίζονται - Κάρτες τελικής οθόνης - Κρυμμένες - Εμφανίζονται + Κάρτες τελικής οθόνης + Κρυμμένες + Εμφανίζονται Απενεργοποίηση λειτουργίας περιβάλλοντος σε πλήρη οθόνη @@ -881,10 +977,16 @@ Second \"item\" text" Γραμμή προόδου στις μικρογραφίες βίντεο Κρυμμένη Εμφανίζεται + Ενεργοποίηση μεγάλης γραμμής προόδου πλήρους οθόνης + Η γραμμή προόδου στη λειτουργία πλήρους οθόνης έχει μεγάλο μέγεθος + Η γραμμή προόδου στη λειτουργία πλήρους οθόνης έχει κανονικό μέγεθος Οθόνη αναπαραγωγής Shorts Απόκρυψη ή εμφάνιση στοιχείων στην οθόνη αναπαραγωγής Shorts + Shorts στη σελίδα καναλιού + Κρυμμένα + Εμφανίζονται Shorts στην αρχική ροή και στα σχετικά βίντεο Κρυμμένα @@ -896,12 +998,21 @@ Second \"item\" text" Shorts στην καρτέλα «Εγγραφές» Κρυμμένα Εμφανίζονται + Shorts στην περιγραφή βίντεο + Κρυμμένα + Εμφανίζονται Shorts στο ιστορικό παρακολούθησης Κρυμμένα Εμφανίζονται + Κουμπί AI + Κρυμμένο + Εμφανίζεται Ετικέτα αυτόματης μεταγλώττισης Κρυμμένη Εμφανίζεται + Ετικέτα «Αυτόματη μεταγλώττιση» + Κρυμμένη + Εμφανίζεται Κουμπί «Αγορά Super Thanks» Κρυμμένο Εμφανίζεται @@ -960,6 +1071,7 @@ Second \"item\" text" Κουμπί «Χρήση αυτού του προτύπου» Κρυμμένο Εμφανίζεται + Εφέ κουμπιού «Μου αρέσει» Κρυμμένο Εμφανίζεται @@ -1002,7 +1114,12 @@ Second \"item\" text" Η γραμμή πλοήγησης θα είναι κρυμμένη κατά την αναπαραγωγή Shorts Η γραμμή πλοήγησης εμφανίζεται κατά την αναπαραγωγή Shorts - + + Προεπισκόπηση αυτόματης αναπαραγωγής + Κρυμμένη + Εμφανίζεται + + Προτεινόμενο βίντεο τελικής οθόνης "Κρυμμένο όταν η αυτόματη αναπαραγωγή είναι απενεργοποιημένη @@ -1021,9 +1138,9 @@ Second \"item\" text" Εμφανίζεται - Αναδυόμενα παράθυρα οθόνης αναπαραγωγής - Κρυμμένα - Εμφανίζονται + Αναδυόμενα παράθυρα οθόνης αναπαραγωγής + Κρυμμένα + Εμφανίζονται Έξοδος από την λειτουργία πλήρους οθόνης στο τέλος του βίντεο @@ -1093,26 +1210,6 @@ Second \"item\" text" Ανιχνεύθηκαν %d φορές περιορισμοί ορίου πελάτη %d χιλιοστά δευτερολέπτου - - Ευρεία γραμμή αναζήτησης - Η ευρεία γραμμή αναζήτησης είναι ενεργοποιημένη - Η ευρεία γραμμή αναζήτησης είναι απενεργοποιημένη - - - Μικρογραφίες υψηλής ποιότητας - Οι μικρογραφίες της γραμμής προόδου είναι υψηλής ποιότητας - Οι μικρογραφίες της γραμμής προόδου είναι μέτριας ποιότητας - Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι υψηλής ποιότητας - Οι μικρογραφίες πλήρους οθόνης της γραμμής προόδου είναι μέτριας ποιότητας - "Αυτό θα επαναφέρει επίσης τις μικρογραφίες σε ζωντανές μεταδόσεις που δεν έχουν μικρογραφίες γραμμής προόδου. - -Οι μικρογραφίες γραμμής αναζήτησης θα χρησιμοποιούν την ίδια ποιότητα με το τρέχον βίντεο. - -Αυτή η δυνατότητα λειτουργεί καλύτερα με ποιότητα βίντεο 720p ή χαμηλότερη και όταν χρησιμοποιείται μια πολύ γρήγορη σύνδεση στο διαδίκτυο." - Παλιές μικρογραφίες γραμμής προόδου - Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται πάνω από τη γραμμή προόδου - Οι μικρογραφίες προεπισκόπησης θα εμφανίζονται σε πλήρη οθόνη - SponsorBlock Ενεργοποίηση του SponsorBlock @@ -1256,8 +1353,8 @@ Second \"item\" text" Το SponsorBlock είναι προσωρινά εκτός λειτουργίας Αδυναμία υποβολής τμήματος (κατάσταση: %1$d %2$s) Αδυναμία υποβολής τμήματος. Όριο Συχνότητας (πάρα πολλά από τον ίδιο χρήστη ή την IP) - Αδυναμία υποβολής του τμήματος: %s - "Δεν είναι δυνατή η υποβολή του τμήματος. + Αδυναμία υποβολής τμήματος: %s + "Αδυναμία υποβολής τμήματος. Υπάρχει ήδη" Το τμήμα υποβλήθηκε επιτυχώς @@ -1353,8 +1450,6 @@ Second \"item\" text" Έκδοση παραποίησης της εφαρμογής 20.13.41 - Επαναφορά της μη συμπτυγμένης γραμμής ενεργειών βίντεο 20.05.46 - Επαναφορά λειτουργικότητας μεταγραφής - 19.35.36 - Επαναφορά των παλιών εικονιδίων της οθόνης αναπαραγωγής Shorts - 19.01.34 - Επαναφορά παλιών εικονιδίων γραμμής πλοήγησης Αλλαγή αρχικής σελίδας @@ -1364,7 +1459,7 @@ Second \"item\" text" Μαθήματα / Εκμάθηση Εξερεύνηση Μόδα & ομορφιά - Παιχνίδια + Gaming Ιστορικό Βιβλιοθήκη Βίντεο που σας αρέσουν @@ -1465,8 +1560,9 @@ Second \"item\" text" Η οθόνη φόρτωσης θα έχει σταδιακές αποχρώσεις φόντο Η οθόνη φόρτωσης θα έχει στατική απόχρωση φόντο Στυλ οθόνης εκκίνησης - Χρωματιστή - Ασπρόμαυρη + Απενεργοποιημένη + Χρωματιστή + Ασπρόμαυρη Προσαρμοσμένο χρώμα γραμμής προόδου Η γραμμή προόδου εμφανίζεται με προσαρμοσμένο χρώμα Η γραμμή προόδου εμφανίζεται με το αρχικό χρώμα @@ -1580,6 +1676,9 @@ Second \"item\" text" Απενεργοποίηση απόκρισης δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι απενεργοποιημένη Η απόκριση δόνησης κατά τη λειτουργία «Αφήστε για ακύρωση» είναι ενεργοποιημένη + Απενεργοποίηση απόκρισης δόνησης παρατεταμένου πατήματος + Η απόκριση δόνησης παρατεταμένου πατήματος είναι απενεργοποιημένη + Η απόκριση δόνησης παρατεταμένου πατήματος είναι ενεργοποιημένη Απενεργοποίηση απόκρισης δόνησης χειρονομίας ζουμ Η απόκριση δόνησης της χειρονομίας ζουμ είναι απενεργοποιημένη Η απόκριση δόνησης της χειρονομίας ζουμ είναι ενεργοποιημένη @@ -1675,6 +1774,11 @@ Second \"item\" text" Εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο Δεν εμφανίζεται το προχωρημένο μενού ποιότητας βίντεο + + Επιλογές ποιότητας Premium + Κρυμμένες + Εμφανίζονται + Χειρονομία συρσίματος για αναζήτηση Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι ενεργοποιημένη @@ -1710,6 +1814,7 @@ Second \"item\" text" Music + Σχετικά με Διαφημίσεις Γενικά diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index 550d7b4f8f..a8079d9ff1 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Mostrar el historial de búsqueda de ajustes El historial de búsqueda de los ajustes es visible El historial de búsqueda de ajustes está oculto + Desactivar iconos en negrita + Los iconos no están en negrita + Los iconos están en negrita Mostrar iconos de configuración de ReVanced Se muestran los iconos de configuración No se muestran los iconos de configuración @@ -101,27 +104,37 @@ Para traducir nuevos idiomas o mejorar las traducciones existentes, visita trans and changes made here must also be made there. --> - Ajustes de GmsCore - Configuración de GmsCore + GmsCore + Configuración relacionada con GmsCore + Buscar actualizaciones de GmsCore + La búsqueda de actualizaciones está habilitada + La comprobación de actualizaciones está desactivada + Abrir Ajustes de GmsCore + Configuración de GmsCore - MicroG GmsCore no está instalado. Instálalo. - Acción necesaria - "MicroG GmsCore no tiene permiso para ejecutarse en segundo plano. + MicroG GmsCore no está instalado. Instálalo. + Acción necesaria + No se pudo comprobar si hay actualizaciones de MicroG GmsCore + Una nueva versión (%1$s) de MicroG GmsCore está disponible. Actualmente, estás usando la versión %2$s. + "MicroG GmsCore no tiene permiso para ejecutarse en segundo plano. Sigue la guía \"Don't kill my app\" para tu teléfono, y aplica las instrucciones a tu instalación de MicroG Esto es requerido para el funcionamiento de la aplicación." - Abrir sitio web - "Las optimizaciones de batería para MicroG GmsCore deben estar desactivadas para evitar problemas. + Abrir sitio web + Cancelar + "Las optimizaciones de batería para MicroG GmsCore deben estar desactivadas para evitar problemas. Deshabilitar las optimizaciones de batería para MicroG no afectará negativamente el uso de la batería. Toca el botón continuar y permite los cambios de optimización." - Continuar + Continuar Falsificar transmisiones de vídeo Falsifica las transmisiones de vídeo del cliente para evitar problemas de reproducción + + Falsificar transmisiones de vídeo "Las transmisiones de vídeo están falsificadas. @@ -171,10 +184,11 @@ No se le notificará de ningún evento inesperado." Banderas guardadas Banderas restablecidas Banderas copiadas al portapapeles - Búfer de protocolo de registro - Los registros de depuración incluyen el búfer proto - Los registros de depuración no incluyen el búfer proto - "Si activas este ajuste, se registrarán datos de diseño adicionales, incluido el texto en pantalla de algunos componentes de la IU. + Reiniciar la aplicación para usar esta función + Búfer de protocolo de registro + Los registros de depuración incluyen el búfer proto + Los registros de depuración no incluyen el búfer proto + "Si activas este ajuste, se registrarán datos de diseño adicionales, incluido el texto en pantalla de algunos componentes de la IU. Esto puede ayudar a identificar componentes al crear filtros personalizados. @@ -224,6 +238,9 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario La reproducción en segundo plano de Shorts está habilitada + Ocultar estantería de la tienda del creador + La estantería de la tienda del creador debajo del reproductor de vídeo está oculta + La estantería de la tienda del creador debajo del reproductor de vídeo es visible Ocultar tarjetas de álbum Las tarjetas de álbum están ocultas Se muestran las tarjetas de álbum @@ -233,6 +250,9 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario Ocultar \"Más como esto\" \"Más como esto\" está oculto \"Más como esto\" es visible + Ocultar sección de comentarios debajo de los vídeos en el feed de Inicio + La sección de comentarios debajo de los vídeos en el feed de Inicio está oculta + La sección de comentarios debajo de los vídeos en el feed de Inicio es visible Ocultar publicaciones de comunidad Las publicaciones de la comunidad están ocultas Las publicaciones de la comunidad se muestran @@ -260,14 +280,19 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario Ocultar últimas publicaciones Las últimas publicaciones están ocultas Se muestran las últimas publicaciones + + Ocultar el botón \"Últimos vídeos\" + El botón Últimos vídeos está oculto + El botón Últimos vídeos es visible Ocultar lista de reproducción Mix Las listas de reproducción Mix están ocultas La lista de reproducción Mix es visible Ocultar sección de películas La sección de películas está oculta La sección de películas es visible - + Ocultar el botón \"Notificarme\" El botón Notificarme está oculto El botón Notificarme es visible @@ -292,13 +317,16 @@ Sin embargo, si activas esto, también se registrarán algunos datos del usuario Ocultar espaciador visual El espaciador visual está oculto El espaciador visual está visible + Ocultar resultados de búsqueda web + Los resultados de búsqueda web están ocultos + Se muestran los resultados de la búsqueda web + Ocultar sección \"Te podría gustar\" + La sección \"Te podría gustar\" está oculta + La sección \"Te podría gustar\" es visible Ocultar YouTube Doodles La animación de los Doodles de YouTube en el logotipo está oculta Se muestra la animación de Doodles de YouTube en el logo - "Los doodles de YouTube se muestran durante unos días al año. - -Si un doodle se está mostrando actualmente en tu región y este ajuste de ocultación está activado, la barra de filtro situada debajo de la barra de búsqueda también estará oculta." Ocultar barra de canal La barra de canales está oculta Barra de canales mostrada @@ -315,10 +343,15 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Los paneles de información están ocultos Los paneles de información se muestran + This button usually appears in the video player for certain videos. --> Ocultar el botón \"Unirse\" El botón Unirse está oculto El botón Unirse es visible + + Ocultar el botón \"Repetición de chat en vivo\" + El botón de repetición de chat en vivo en la superposición del reproductor está oculto + El botón de repetición de chat en vivo en la superposición del reproductor es visible Ocultar paneles médicos Los paneles médicos están ocultos Se muestran paneles médicos @@ -334,6 +367,9 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Ocultar reacciones temporizadas Las reacciones temporizadas están ocultas Se muestran reacciones temporizadas + Ocultar título de vídeo + El título del vídeo en la superposición del reproductor está oculto + El título del vídeo en la superposición del reproductor es visible Ocultar \"Resumen de vídeo generado por IA\" La sección de resumen de vídeo generada por IA está oculta Sección de resumen de vídeo generada por IA está mostrada @@ -346,33 +382,62 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Ocultar capítulos La sección de capítulos está oculta Se muestra la sección de capítulos - Ocultar \"Cómo se hizo este contenido\" - La sección Cómo se hizo este contenido está oculta - Se muestra la sección Cómo se hizo este contenido - Ocultar puntos de Hype - Los puntos de Hype están ocultos - Los puntos de Hype están visibles + Ocultar \"Progreso del curso\" + La sección de progreso del curso está oculta + La sección de progreso del curso es visible + Ocultar Explorar + Las secciones Explorar este curso y Explorar el pódcast están ocultas + Las secciones Explorar este curso y Explorar el pódcast son visibles + Ocultar \"Explorar este curso\" + La sección Explorar este curso está oculta + La sección Explorar este curso es visible + Ocultar \"Explora el pódcast\" + La sección Explora el pódcast está oculta + Se muestra la sección Explora el pódcast Ocultar \"Explora el pódcast\" La sección Explora el pódcast está oculta Se muestra la sección Explora el pódcast Ocultar enlaces destacados La sección de enlaces destacados está oculta La sección de enlaces destacados es visible + Ocultar \"Lugares destacados\" + La sección Lugares destacados está oculta + La sección Lugares destacados es visible Ocultar vídeos destacados La sección de vídeos destacados está oculta La sección de vídeos destacados es visible + Activar el filtro del menú desplegable del feed + El filtro del menú desplegable del feed está activado + El filtro del menú desplegable del feed está desactivado + Filtro del menú desplegable del feed + Introduce los nombres del menú desplegable para filtrar, uno por línea + Ocultar Juegos + La sección Juegos está oculta + La sección Juegos es visible + Ocultar \"Cómo se hizo este contenido\" + La sección Cómo se hizo este contenido está oculta + Se muestra la sección Cómo se hizo este contenido + Ocultar puntos de Hype + Los puntos de Hype están ocultos + Los puntos de Hype están visibles Ocultar tarjetas de información La sección de tarjetas de información está oculta Se muestra la sección de tarjetas de información Ocultar \"Conceptos clave\" La sección Conceptos clave está oculta Se muestra la sección Conceptos clave + Ocultar Música + La sección Música está oculta + La sección Música es visible Ocultar botón de Suscribirse El botón de Suscribirse está oculto El botón de Suscribirse es visible Ocultar transcripción La sección transcripción está oculta Se muestra la sección transcripción + Ocultar Cuestionarios + La sección Cuestionarios está oculta + La sección Cuestionarios es visible Descripción del vídeo Ocultar o mostrar componentes de descripción de vídeo Barra de filtros @@ -391,6 +456,11 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Mostrado en el historial de reproducciones Página del canal Ocultar o mostrar componentes de la página del canal + Activar filtro de pestañas de canal + El filtro de pestañas de canal está activado + El filtro de pestañas de canal está desactivado + Filtro de pestañas de canal + Introduce los nombres de las pestañas de canal para filtrar, uno por línea Ocultar botón de Comunidad El botón de la comunidad está oculto @@ -454,15 +524,15 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult El recuento de visualizaciones se muestra en el feed y los resultados de búsqueda "Limitaciones: -• Las estanterías de Shorts, las páginas de canal y los resultados de búsqueda aún pueden mostrar el recuento de visualizaciones -• Esta característica no funciona con el factor de forma automotriz" +• Las estanterías de Shorts, las páginas de canal y los resultados de búsqueda aún pueden mostrar el recuento de visualizaciones. +• Esta característica no funciona con el factor de forma automotriz." Ocultar hora de subida La hora de subida está oculta en el feed y los resultados de búsqueda La hora de subida se muestra en el feed y los resultados de búsqueda "Limitaciones: -• Las estanterías de Shorts, las páginas de canales y los resultados de búsqueda aún pueden mostrar los tiempos de subida -• Esta función no funciona con el factor de forma automotriz" +• Las estanterías de Shorts, las páginas de canales y los resultados de búsqueda aún pueden mostrar los tiempos de subida. +• Esta función no funciona con el factor de forma automotriz." Ocultar contenido de palabra clave Ocultar videos de búsqueda y feed usando filtros de palabras clave Ocultar videos domésticos por palabras clave @@ -485,8 +555,8 @@ Las palabras con mayúsculas en medio deben introducirse con las mayúsculas (es Acerca del filtrado de palabras clave "Los resultados de búsqueda de Home/Suscripción/Búsqueda se filtran para ocultar el contenido que coincida con las frases de palabras clave -Limitaciones -• Los vídeos cortos no se pueden ocultar por nombre de canal +Limitaciones: +• Los Shorts no se pueden ocultar por nombre de canal • Es posible que algunos componentes de la interfaz de usuario no estén ocultos • La búsqueda de una palabra clave puede no mostrar ningún resultado" Coincidir palabras completas @@ -500,19 +570,12 @@ Limitaciones La palabra clave ocultará todos los vídeos: %s - Ocultar estantería de la tienda del creador - La estantería de la tienda del creador debajo del reproductor de vídeo está oculta - La estantería de la tienda del creador debajo del reproductor de vídeo es visible Ocultar banner de la tienda en la pantalla final El banner de la tienda de la pantalla final está oculto El banner de la tienda de la pantalla final es visible Ocultar anuncios a pantalla completa - "Los anuncios a pantalla completa están ocultos - -Esta función solo está disponible para dispositivos antiguos" + Los anuncios a pantalla completa están ocultos Se muestran anuncios a pantalla completa - - Ocultar anuncios a pantalla completa solo funciona con dispositivos antiguos Ocultar anuncios generales Los anuncios generales están ocultos Se muestran anuncios generales @@ -522,6 +585,9 @@ Esta función solo está disponible para dispositivos antiguos" Ocultar etiqueta de promoción de pago Etiqueta de promoción pagada está oculta Etiqueta de promoción pagada se muestra + Ocultar anuncios emergentes del reproductor + Los anuncios emergentes del reproductor están ocultos + Los anuncios emergentes del reproductor son visibles Ocultar tarjetas autopatrocinadas Las tarjetas autopatrocinadas están ocultas Se muestran las tarjetas autopatrocinadas @@ -529,23 +595,18 @@ Esta función solo está disponible para dispositivos antiguos" Los enlaces de compra en la descripción del vídeo están ocultos Se muestran los enlaces de compras en la descripción del video Ocultar el banner \"Ver productos\" - El banner \"Ver productos\" en la superposición de vídeo está oculto - El banner \"Ver productos\" en la superposición de vídeo es visible - Ocultar resultados de búsqueda web - Los resultados de búsqueda web están ocultos - Se muestran los resultados de la búsqueda web - - - Ocultar promociones de YouTube Premium - Las promociones de YouTube Premium en el reproductor de vídeo están ocultas - Se muestran las promociones de YouTube Premium en el reproductor de vídeo + El banner \"Ver productos\" en la superposición del reproductor está oculto + El banner \"Ver productos\" en la superposición del reproductor es visible + Ocultar promociones de YouTube Premium + Las promociones de YouTube Premium están ocultas + Las promociones de YouTube Premium son visibles Ocultar anuncios de vídeo Los anuncios de vídeo están ocultos Los anuncios de vídeo se muestran - + URL copiada al portapapeles URL con marca de tiempo copiada Mostrar botón URL de copia de vídeo @@ -561,10 +622,10 @@ Esta función solo está disponible para dispositivos antiguos" Se mostrará el diálogo Esto no evita la restricción de edad. Solo la acepta automáticamente. - - Desactivar la ventana emergente \"Iniciar sesión en TV\" - La ventana emergente de Iniciar sesión en TV está desactivada - La ventana emergente de Iniciar sesión en TV está activada + + Desactivar la ventana emergente \"Iniciar sesión en TV\" + La ventana emergente de Iniciar sesión en TV está desactivada + La ventana emergente de Iniciar sesión en TV está activada Deshabilitar el salto de capítulo con doble toque @@ -597,10 +658,10 @@ Verifica que el nombre del paquete sea correcto y que la aplicación esté insta El gesto está desactivado Gesto activado - - Habilitar tocar para buscar - Tocar para buscar está activado - Tocar para buscar está desactivado + + Habilitar tocar para buscar + Tocar para buscar está activado + Tocar para buscar está desactivado Activar gesto de brillo @@ -681,7 +742,7 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"El botón de comentarios está oculto El botón de comentarios es visible + This button usually appears on live streamed videos. --> Ocultar informe El botón Reportar está oculto Se muestra el botón Reportar @@ -694,7 +755,7 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"El botón de descarga está oculto Se muestra el botón de descarga + This button usually appears on videos uploaded by the logged-in user. --> Ocultar Hype El botón Hype está oculto El botón de hype es visible @@ -707,7 +768,7 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"El botón de gracias está oculto Se muestra el botón de gracias + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ocultar pregunta El botón \"Preguntar\" está oculto Se muestra el botón \"Preguntar\" @@ -715,6 +776,7 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"Ocultar Recortar El botón del recortar está oculto Se muestra el botón de recortar + La ocultación podría no funcionar para algunas cuentas de usuario. Ocultar Tienda El botón de la Tienda está oculto @@ -724,13 +786,13 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"El botón de Guardar está oculto El botón de Guardar está mostrado - + Botones de navegación - Ocultar o cambiar botones en la barra de navegación + Ocultar o cambiar los botones de la barra de navegación Ocultar pestaña \'Inicio\' - El botón de inicio está oculto - El botón de inicio es visible + El botón Inicio está oculto + El botón Inicio es visible Ocultar pestaña \'Shorts\' El botón de Shorts está oculto @@ -748,26 +810,44 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"Se muestra el botón de Notificaciones Cambiar botón Crear con el de Notificaciones - "El botón Crear se cambia por el botón Notificaciones - -Nota: Habilitar esto también ocultará forzosamente los anuncios de vídeo" + El botón Crear se cambia con el botón de Notificaciones El botón Crear no se cambia con el botón de notificaciones - "Deshabilitar este ajuste también deshabilitará el bloqueo de anuncios de Shorts. - -Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito." + Si al cambiar esta configuración no surte efecto, intenta cambiar al modo Incógnito. Ocultar etiquetas de navegación Las etiquetas están ocultas Las etiquetas son visibles + Activar botones de navegación estrechos + El espaciado entre los botones de navegación es estrecho + El espaciado entre los botones de navegación es normal + Activar animaciones de la barra de navegación + Las transiciones de navegación están animadas + Las transiciones de navegación no están animadas Desactivar la barra de estado translúcida La barra de estado es opaca La barra de estado es opaca o translúcida - En algunos dispositivos, habilitar esta función puede cambiar la barra de navegación del sistema a transparente. + "Limitaciones: +• Puede aparecer una barra negra en la parte superior del reproductor de vídeo. +• En algunos dispositivos, activar esta función puede cambiar la barra de navegación del sistema a transparente." Desactivar la barra translúcida clara La barra de navegación en modo claro es opaca La barra de navegación en modo claro es opaca o translúcida Desactivar la barra translúcida oscura La barra de navegación en modo oscuro es opaca La barra de navegación en modo oscuro es opaca o translúcida + Barra de herramientas + Ocultar o cambiar los componentes de la barra de herramientas + Ocultar botón Crear + El botón Crear está oculto + Se muestra el botón Crear + Ocultar botón Notificaciones + El botón de Notificaciones está oculto + Se muestra el botón de Notificaciones + Ocultar el botón Buscar + El botón de búsqueda está oculto + Se muestra el botón de búsqueda. + Habilitar barra de búsqueda ancha + Barra de búsqueda ancha habilitada + La barra de búsqueda ancha está desactivada Menú desplegable @@ -842,6 +922,12 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Ocultar el botón Transmitir El botón de envío a otros dispositivos está oculto El botón de envío a otros dispositivos es visible + Ocultar botón Contraer + El botón Contraer está oculto + El botón Contraer es visible + Ocultar botón Pantalla completa + El botón Pantalla completa está oculto + El botón Pantalla completa es visible Ocultar fondo de los controles del reproductor El fondo de los controles del reproductor está oculto Se muestra el fondo de los controles del reproductor @@ -850,9 +936,9 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Los botones se muestran - Ocultar tarjetas de pantalla final - Las tarjetas de pantalla de fin están ocultas - Se muestran las tarjetas de la pantalla final + Ocultar tarjetas de pantalla final + Las tarjetas de pantalla de fin están ocultas + Se muestran las tarjetas de la pantalla final Desactivar el modo Ambiente en pantalla completa @@ -877,10 +963,16 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Ocultar barra de búsqueda de miniaturas de vídeo La barra de búsqueda de miniaturas de vídeo está oculta La barra de búsqueda de miniaturas de vídeo es visible + Activar barra de búsqueda grande a pantalla completa + La barra de búsqueda a pantalla completa es de tamaño grande + La barra de búsqueda a pantalla completa es de tamaño normal Reproductor de Shorts Ocultar o mostrar componentes del reproductor de Shorts + Ocultar Shorts en la página del canal + Oculto en la página del canal + Visible en la página del canal Ocultar Shorts en la pestaña de Inicio Oculto en la página principal y vídeos relacionados @@ -892,9 +984,18 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Ocultar Shorts en la pestaña de Suscripciones Oculto en el feed de Suscripciones Visible en el feed de Suscripciones + Ocultar Shorts en la descripción del vídeo + Oculto en la descripción del vídeo + Visible en la descripción del vídeo Ocultar Shorts en el historial de visualización Oculto en el historial de visualización Mostrado en el historial de visualización + Ocultar botón de IA + El botón de IA está oculto + El botón de IA es visible + Ocultar la etiqueta \"Doblado automáticamente\" + La etiqueta de doblaje automático está oculta + La etiqueta de doblaje automático está visible Ocultar la etiqueta \"Doblado automáticamente\" La etiqueta de doblaje automático está oculta La etiqueta de doblaje automático está visible @@ -956,6 +1057,7 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Ocultar el botón \"Usar esta plantilla\" El botón Usar esta plantilla está oculto El botón Usar esta plantilla se muestra + Ocultar la animación de la fuente de Me gusta La animación de fuente de botón \"Me gusta\" está oculta Se muestra la animación de fuente de botón \"Me gusta\" @@ -998,7 +1100,12 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v La barra de navegación está oculta La barra de navegación es visible - + + Ocultar vista previa de reproducción automática + La vista previa de reproducción automática está oculta + La vista previa de reproducción automática es visible + + Ocultar el vídeo sugerido de la pantalla final "El vídeo sugerido de la pantalla final se oculta cuando la reproducción automática está desactivada @@ -1017,9 +1124,9 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam Marca de tiempo mostrada - Ocultar paneles emergentes del reproductor - Los paneles emergentes del reproductor están ocultos - Se muestran paneles emergentes del reproductor + Ocultar paneles emergentes del reproductor + Los paneles emergentes del reproductor están ocultos + Se muestran paneles emergentes del reproductor Salir del modo de pantalla completa al final del vídeo @@ -1089,24 +1196,6 @@ Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito"< Límite de tasa de cliente encontrado %d veces %d milisegundos - - Habilitar barra de búsqueda ancha - Barra de búsqueda ancha habilitada - La barra de búsqueda ancha está desactivada - - - Habilitar miniaturas de alta calidad - Las miniuñas Seekbar son de alta calidad - Las miniuñas Seekbar son de calidad media - "Esto también restaurará las miniaturas en las transmisiones en vivo que no tengan miniaturas de la barra de búsqueda. - -Las miniaturas de la barra de búsqueda utilizarán la misma calidad que el vídeo actual. - -Esta función funciona mejor con una calidad de vídeo de 720p o inferior y cuando se utiliza una conexión a Internet muy rápida." - Restaurar antiguas miniaturas de la barra de búsqueda - Las miniaturas de la barra de búsqueda aparecerán por encima de la barra de búsqueda - Las miniaturas de Seekbar aparecerán en pantalla completa - Activar SponsorBlock SponsorBlock es un sistema de colaboración abierta para omitir partes molestas de los vídeos de YouTube @@ -1338,8 +1427,6 @@ Si se desactiva posteriormente, se recomienda borrar los datos de la aplicación Versión objetiva de aplicación falsificada 20.13.41 - Restaurar barra de acciones de vídeo no colapsada 20.05.46 - Restaurar la funcionalidad de la transcripción - 19.35.36 - Restaurar iconos antiguos del reproductor de Shorts - 19.01.34 - Restaurar iconos de navegación antiguos Cambiar página de inicio @@ -1445,8 +1532,9 @@ El minireproductor se puede arrastrar fuera de la pantalla hacia la izquierda o La pantalla de carga tendrá un fondo gradiente La pantalla de carga tendrá un fondo sólido Estilo de la pantalla de presentación - Color - Blanco y negro + Desactivado + Color + Blanco y negro Activar el color personalizado de la barra de búsqueda Se muestra el color personalizado de la barra de búsqueda Se muestra el color original de la barra de búsqueda @@ -1557,6 +1645,9 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Desactivar la respuesta háptica de deshacer la búsqueda La respuesta háptica de deshacer la búsqueda está desactivada La respuesta háptica de deshacer la búsqueda está activada + Desactivar la respuesta háptica de tocar y mantener + La respuesta háptica de tocar y mantener está desactivada + La respuesta háptica de tocar y mantener está activada Desactivar la respuesta háptica del zoom La respuesta háptica del zoom está desactivada La respuesta háptica del zoom está activada @@ -1652,6 +1743,11 @@ Limitaciones: Se muestra el menú de calidad de vídeo avanzado No se muestra el menú de calidad de vídeo avanzado + + Ocultar opciones de calidad Premium + Las opciones de calidad Premium están ocultas + Las opciones de calidad Premium son visibles + Habilitar diapositiva para buscar Deslizar para buscar está activado @@ -1685,6 +1781,7 @@ La reproducción puede tartamudear o perder fotogramas" Música + Acerca de Anuncios General diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index 1f3450589c..0d8fcbc0d0 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Kohandatud Rakenduse ikoon Algne + ReVanced ReVanced minimaalne ReVanced skaleeritud @@ -49,6 +50,7 @@ Second \"item\" text" Seaded + ReVanced Kas sa oled kindel, et soovid jätkata? Salvesta Lähtesta @@ -80,6 +82,9 @@ Second \"item\" text" Kuva seadete otsinguajalugu Seadete otsinguajalugu on näidatud Seadete otsingu ajalugu ei kuvata + Keela paksud ikoonid + Ikoonid ei ole paksud + Ikoonid on paksud Näita ReVancedi seadete ikoone Seadete ikoonid on näidatud Seadete ikoonid ei ole nähtavad @@ -99,27 +104,37 @@ Uute keelte tõlkimiseks või olemasolevate tõlgete parandamiseks külastage tr and changes made here must also be made there. --> - GmsCore seaded - GmsCore seaded + GmsCore + GmsCore\'iga seotud seaded + Kontrolli GmsCore värskendusi + Värskenduste kontrollimine on lubatud + Värskenduste kontrollimine on keelatud + Ava GmsCore seaded + GmsCore seaded - MicroG GmsCore pole installitud. Installi see. - Tegevus on vajalik - "MicroG GmsCore l ei ole taustal töötamiseks luba. + MicroG GmsCore pole installitud. Installi see. + Tegevus on vajalik + Ebaõnnestus kontrollida MicroG GmsCore värskendusi + MicroG GmsCore\'i uus versioon (%1$s) on saadaval. Praegu kasutate versiooni %2$s. + "MicroG GmsCore l ei ole taustal töötamiseks luba. Järgige oma telefoni \"Ära tapa minu rakendust\" juhendit ja rakendage juhiseid oma MicroG installile. See on rakenduse toimimiseks vajalik." - Ava veebisait - "MicroG GmsCore aku optimeerimised peavad olema keelatud, et vältida probleeme. + Ava veebisait + Tühista + "MicroG GmsCore aku optimeerimised peavad olema keelatud, et vältida probleeme. MicroG aku optimeerimise keelamine ei mõjuta aku kestvust negatiivselt. Vajutage jätkamise nuppu ja lubage optimeerimismuutused." - Jätka + Jätka Võltsitud videovood Kliendi videovoogude võltsimine taasesitusprobleemide vältimiseks + Võltsi video voogedastused + Kliendi videovoogude võltsimine taasesitusprobleemide vältimiseks Võltsitud video voogedastused "Videovood on võltsitud @@ -169,10 +184,11 @@ Teid ei teavitata ühestki ootamatust sündmusest." Lipud salvestatud Lipud lähtestatud Lipud kopeeritud lõikelauale - Logi protokolipuffari - Vea logid sisaldavad protokolipuffari - Vea logid ei sisalda protokolipuffari - "Selle sätte lubamine logib täiendavaid paigutuse andmeid, sealhulgas mõne kasutajaliidese komponendi ekraanil kuvatavat teksti. + Rakenduse taaskäivitamine selle funktsiooni kasutamiseks + Logi protokolipuffari + Vea logid sisaldavad protokolipuffari + Vea logid ei sisalda protokolipuffari + "Selle sätte lubamine logib täiendavaid paigutuse andmeid, sealhulgas mõne kasutajaliidese komponendi ekraanil kuvatavat teksti. See võib aidata komponente tuvastada kohandatud filtrite loomisel. @@ -206,6 +222,7 @@ Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadress Voog Üldine Mängija + Lühivideod Otsinguriba Pühkimisjuhtimine Mitmesugused @@ -219,6 +236,9 @@ Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadress Lühivideod taasesitus taustal on lubatud + Peida looja poe riiul + Looja poe riiul videopleieri all on peidetud + Looja poeriiul videopleieri all on nähtav Peida albumikaardid Albumikaardid on peidetud Albumikaardid on nähtavad @@ -228,6 +248,9 @@ Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadress Peida kiibi riiul Kiibid on peidetud Kiipe on nähtaval + Peida kommentaaride jaotis avalehe videote all + Kommentaaride jaotis avalehe videote all on peidetud + Kommentaaride jaotis avalehe videote all on nähtav Peida ühenduse postitused Ühenduse postitused on peidetud Ühenduse postitused on nähtavad @@ -255,14 +278,19 @@ Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadress Peida Shortsid Shortsid on peidetud Shortsid on nähtavad + + Peida nupp „Viimased videod” + Nupp „Viimased videod” on peidetud + Nupp „Viimased videod” on nähtav Peida segapleilistid Segapleilistid on peidetud Segapleilistid on nähtavad Peida filmide jaotis Filmide jaotis on peidetud Filmide jaotis on nähtav - + Peida nupu \"Teata mulle\" Teata mulle nupp on peidetud Teata mulle nupp on nähtaval @@ -287,13 +315,16 @@ Selle lubamine logib aga ka mõningaid kasutajaandmeid, näiteks teie IP-aadress Peida visuaalne eraldaja Visuaalne eraldaja on peidetud Visuaalne eraldaja on nähtav + Peida veebiotsingu tulemused + Veebiotsingu tulemused on peidetud + Veebiotsingu tulemused on nähtavad + Peida jaotis „Sulle võivad meeldida” + Jaotis „Sulle võivad meeldida” on peidetud + Jaotis „Sulle võivad meeldida” on nähtav Peida YouTube Doodles YouTube Doodles animatsioon logol on peidetud YouTube Doodles animatsioon logol on nähtav - "YouTube Doodles on näidatud paar päeva aastas. - -Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lülitatud, siis otsinguriba all olev filtreerimisriba peidetakse samuti." Peida kanali riba Kanali riba on peidetud Kanaliribas on näidatud @@ -310,10 +341,15 @@ Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lül Teabepaneelid on peidetud Teabepaneelid on nähtavad + This button usually appears in the video player for certain videos. --> Peida Liitu nupp Liitumisnupp on peidetud Liitumisnupp on nähtaval + + Peida nupp „Otsevestluse kordus” + Otsevestluse korduse nupp pleieri ülekattel on peidetud + Otsevestluse korduse nupp pleieri ülekattel on nähtav Peida meditsiinipaneelid Meditsiinipaneelid on peidetud Meditsiinipaneelid on nähtavad @@ -329,6 +365,9 @@ Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lül Peida ajastatud reaktsioonid Ajastatud reaktsioonid on peidetud Ajastatud reaktsioonid on nähtavad + Peida video pealkiri + Video pealkiri pleieri ülekattel on peidetud + Video pealkiri pleieri ülekattel on nähtav Peida „AI-ga loodud video kokkuvõte” Tehisintellekti loodud videokokkuvõtete jaotis on peidetud AI-ga loodud videokokkuvõtte jaotis on nähtaval @@ -341,33 +380,62 @@ Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lül Peida peatükid Peatükide jaotis on peidetud Peatükide jaotis on näidatud - Peida \"Kuidas see sisu loodi\" - Kuidas see sisu loodi jaotis on peidetud - Kuidas see sisu loodi jaotis on kuvatud - Peida Hype\'i punktid - Hype\'i punktid on peidetud - Hype\'i punktid on nähtavad + Peida „Kursuse edenemine” + Kursuse edenemise jaotis on peidetud + Kursuse edenemise jaotis on nähtav + Peida Avasta + Avasta seda kursust ja Avasta taskuhäälingut jaotised on peidetud + Avasta seda kursust ja Avasta taskuhäälingut jaotised on nähtavad + Peida „Avasta seda kursust” + Jaotis „Avasta seda kursust” on peidetud + Jaotis „Avasta seda kursust” on nähtav + Peida \"Avasta taskuhäälingut\" + Avasta taskuhäälingut jaotis on peidetud + Avasta taskuhäälingut jaotis on kuvatud Peida \"Avasta taskuhäälingut\" Avasta taskuhäälingut jaotis on peidetud Avasta taskuhäälingut jaotis on kuvatud Peida esiletoodud lingid Esiletõstetud linkide sektsioon on peidetud Esiletõstetud linkide sektsioon on nähtav + Peida „Esiletoodud kohad” + Jaotis „Esiletoodud kohad” on peidetud + Jaotis „Esiletoodud kohad” on nähtav Peida esiletõstetud videod Esiletõstetud videote sektsioon on peidetud Esiletõstetud videote sektsioon on nähtav + Luba voo hüpikmenüü filter + Voo hüpikmenüü filter on lubatud + Voo hüpikmenüü filter on keelatud + Voo hüpikmenüü filter + Sisestage filtreerimiseks hüpikmenüü nimed, üks rea kohta + Peida Mängud + Mängude jaotis on peidetud + Mängude jaotis on nähtav + Peida \"Kuidas see sisu loodi\" + Kuidas see sisu loodi jaotis on peidetud + Kuidas see sisu loodi jaotis on kuvatud + Peida Hype\'i punktid + Hype\'i punktid on peidetud + Hype\'i punktid on nähtavad Peida infokaardid Teabekaartide jaotis on peidetud Kuvatakse teabekaartide jaotis Peida \"Põhimõisted\" Põhimõisted jaotis on peidetud Põhimõisted jaotis on kuvatud + Peida Muusika + Muusika jaotis on peidetud + Muusika jaotis on nähtav Peida tellimisnupp Tellimisnupp on peidetud Tellimisnupp on nähtav Peida transkriptsioon Skriptiosa on peidetud Skriptiosa on näidatud + Peida Viktoriinid + Viktoriinide jaotis on peidetud + Viktoriinide jaotis on nähtav Video kirjeldus Peida videokirjelduse komponendid või kuva need Filtriseriba @@ -386,6 +454,11 @@ Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lül Nähtav vaatamisajaloos Kanali leht Peida või näita kanali lehe komponente + Luba kanali vahelehe filter + Kanali vahelehe filter on lubatud + Kanali vahelehe filter on keelatud + Kanali vahelehe filter + Sisestage filtreerimiseks kanali vahelehe nimed, üks rea kohta Peida kogukonna nupp Kogukonna nupp on peidetud @@ -449,15 +522,15 @@ Kui Doodle on teie piirkonnas praegu nähtav ja see peitmise seade on sisse lül Vaatamiste arv on nähtav voos ja otsingutulemustes "Piirangud: -• Shorts-i riiulid, kanalilehed ja otsingutulemused võivad endiselt kuvada vaatamiste arvu -• See funktsioon ei tööta autotööstuse vormiteguriga" +• Shorts-i riiulid, kanalilehed ja otsingutulemused võivad endiselt kuvada vaatamiste arvu. +• See funktsioon ei tööta autotööstuse vormiteguriga." Peida üleslaadimisaeg Üleslaadimisaeg on peidetud voost ja otsingutulemustest Üleslaadimisaeg on nähtav voos ja otsingutulemustes "Piirangud: -• Shorts riiulitel, kanalilehtedel ja otsingutulemustes võib üleslaadimisaeg endiselt nähtav olla -• See funktsioon ei tööta autodele mõeldud vorminguga" +• Shorts riiulitel, kanalilehtedel ja otsingutulemustes võib üleslaadimisaeg endiselt nähtav olla. +• See funktsioon ei tööta autodele mõeldud vorminguga." Peida video sisu märksõna abil Peida otsingu ja voo videod, kasutades märksõna filtreid Peida kodu videod märksõnade abil @@ -478,11 +551,11 @@ Märksõnad võivad olla kanalite nimed või mis tahes tekst, mis kuvatakse vide Sõnad, millel on keskel suurtähed, tuleb sisestada suurtähega (nt iPhone, TikTok, LeBlanc)" Märksõnade filtreerimise kohta - "Kodu/Tellimuste/Otsingutulemused filtreeritakse, et peita sisu, mis vastab märksõnadele ja fraasidele + "Avaleht/Tellimused/Otsingutulemused filtreeritakse, et peita sisu, mis vastab märksõnadele ja fraasidele -Piirangud -• Shorts ei saa peita kanali nime järgi -• Mõnda kasutajaliidese komponenti ei pruugi peita +Piirangud: +• Shorts-i ei saa peita kanali nime järgi +• Mõnda kasutajaliidese komponenti ei pruugita peita • Märksõna otsing ei pruugi anda tulemusi" Sobita täpsed sõnad @@ -495,19 +568,12 @@ Piirangud Võti sõna: %s peidab kõik videod - Peida looja poe riiul - Looja poe riiul videopleieri all on peidetud - Looja poeriiul videopleieri all on nähtav Peida lõpuekraani poe bänner Lõpuekraani poebänner on peidetud Lõpuekraani poebänner on nähtaval Peida täisekraanireklaamid - "Täisekraani reklaamid on peidetud - -See funktsioon on saadaval ainult vanemates seadmetes" + Täisekraanireklaamid on peidetud Täisekraanireklaamid kuvatakse - - Terveekraanireklaamide peitmine toimib ainult vanemate seadmetega Peida üldine reklaamid Üldine reklaamid on peidetud Üldreklaamid kuvatakse @@ -517,6 +583,9 @@ See funktsioon on saadaval ainult vanemates seadmetes" Peida makstud edendamise silt Makstud edendamise silt on peidus Makstud edendamise silt on näidatud + Peida pleieri hüpikreklaamid + Pleieri hüpikreklaamid on peidetud + Pleieri hüpikreklaamid on nähtavad Peida ise-sponsoritud kaardid Ise-sponsoritud kaardid on peidus Ise-sponsoritud kaardid on näidatud @@ -524,31 +593,26 @@ See funktsioon on saadaval ainult vanemates seadmetes" Ostulingid video kirjelduses on peidetud Ostlemise lingid videokirjelduses on nähtavad Peida bänner \"Vaata tooteid\" - Vaata tooteid bänner videokattel on peidetud - Vaata tooteid bänner videokattel on nähtaval - Peida veebiotsingu tulemused - Veebiotsingu tulemused on peidetud - Veebiotsingu tulemused on nähtavad - - - Peida YouTube Premiumi reklaamid - Videoall mängija all olevad YouTube Premiumi reklaamid on peidetud - YouTube Premium reklaamide alla esitatakse YouTube Premiumi reklaamkampaaniad + Tooteid vaatamise bänner pleieri ülekattel on peidetud + Tooteid vaatamise bänner pleieri ülekattel on nähtav + Peida YouTube Premiumi reklaamid + YouTube Premiumi reklaamid on peidetud + YouTube Premiumi reklaamid on nähtavad Peida video reklaamid Videoreklaamid on peidetud Videoreklaamid on kuvatud - - URL kopeeritud clipboardi - Aadres URL ajaga kopeeritud - Kuva video URL kopeerimise nupp - Video URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i kopeerimiseks. Puudutage pikalt, et kopeerida ajatempliga - Video URL-i kopeerimise nupp pole nähtaval - Näita video URL-i ajatempliga kopeerimise nuppu - Ajatempliga URL-i kopeerimise nupp on nähtaval. Puudutage video URL-i ajatempliga kopeerimiseks. Puudutage pikalt, et kopeerida ilma ajatemplita - Ajatempliga URL-i kopeerimise nupp pole nähtaval + + URL kopeeritud lõikelauale + Ajatempliga URL kopeeritud + Kuva video URL-i kopeerimise nupp + Video URL-i kopeerimise nupp on nähtav. Puudutage video URL-i kopeerimiseks. Puudutage ja hoidke all, et kopeerida ajatempliga + Video URL-i kopeerimise nupp ei ole nähtav + Kuva ajatempliga URL-i kopeerimise nupp + Ajatempliga URL-i kopeerimise nupp on nähtav. Puudutage video URL-i ajatempliga kopeerimiseks. Puudutage ja hoidke all, et kopeerida ilma ajatemplita + Ajatempliga URL-i kopeerimise nupp ei ole nähtav Eemalda vaataja arvamuse dialoog @@ -556,10 +620,10 @@ See funktsioon on saadaval ainult vanemates seadmetes" Dialoog kuvatakse See ei mööda vanusepiirangust. See lihtsalt aktsepteerib seda automaatselt. - - Keela hüpikaken „Logi telerisse sisse” - Telerisse sisselogimise hüpikaken on keelatud - Telerisse sisselogimise hüpikaken on lubatud + + Keela hüpikaken „Logi telerisse sisse” + Telerisse sisselogimise hüpikaken on keelatud + Telerisse sisselogimise hüpikaken on lubatud Keela topeltpuudutusega peatüki vahelejätmine @@ -592,10 +656,10 @@ Veendu, et paketi nimi on õige ja rakendus on installitud" Žest on keelatud Žest on lubatud - - Puudutusega otsimise lubamine - Puudutusega otsimine on lubatud - Puudutusega otsimine on keelatud + + Luba puudutusega otsimine + Puudutusega otsimine on lubatud + Puudutusega otsimine on keelatud Luba heleduse žest @@ -676,7 +740,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Kommentaaride nupp on peidetud Kommentaaride nupp on nähtav + This button usually appears on live streamed videos. --> Peida Teata Teata nupp on peidetud Teata nupp on nähtav @@ -689,7 +753,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Laadi alla nupp on peidetud Laadi alla nupp on nähtav + This button usually appears on videos uploaded by the logged-in user. --> Peida Hype Hype nupp on peidetud Hype\'i nupp on nähtav @@ -702,7 +766,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Tänan nupp on peidetud Tänan nupp on nähtav + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Peida küsi Küsi nupp on peidetud Küsi nupp on nähtav @@ -710,6 +774,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Peida Lõik Lõigu nupp on peidetud Lõigu nupp on nähtav + Peitmine ei pruugi mõne kasutajakonto puhul toimida. Peida pood Poe nupp on peidetud @@ -719,7 +784,7 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Nupp Salvesta on peidetud Nupp Salvesta on nähtav - + Navigeerimisnupud Peida või muuda navigeerimisriba nuppe @@ -735,34 +800,52 @@ Helitugevuse reguleerimiseks pühkige ekraani paremal küljel vertikaalselt"Loo nupp on peidetud Loo nupp on nähtav - Peida Tellimuste + Peida Tellimused Tellimuste nupp on peidetud Tellimuste nupp on nähtav Peida teavitused Teavituste nupp on peidetud Teavituste nupp on nähtav - Vaheta Loo ja Teated - "Looda nupp on vahetatud teavituste nupuga - -Märkus: selle lubamine peidab ka sunniviisiliselt video reklaamid" - Loo nuppu ei ole vahetatud Teadete nupuga - "Selle sätte keelamine keelab ka Shorts reklaamide blokeerimise. - -Kui selle sätte muutmine ei avalda mõju, proovige lülituda Inkognito režiimile." - Peida navigeerimisnupude sildistused - Sildistused on peidetud - Sildistused on nähtavad + Vaheta Loo ja Teavituste nupud + Loo nupp on teavituste nupuga vahetatud + Loo nuppu ei ole teavituste nupuga vahetatud + Kui selle seade muutmine ei anna tulemusi, proovige lülituda inkognito režiimile. + Peida navigeerimisnuppude sildid + Sildid on peidetud + Sildid on nähtavad + Luba kitsad navigeerimisnupud + Navigeerimisnuppude vahe on kitsas + Navigeerimisnuppude vahe on normaalne + Luba navigeerimisriba animatsioonid + Navigeerimisüleminekud on animeeritud + Navigeerimisüleminekud ei ole animeeritud Keela läbipaistev olekuriba - Staatusriba on läbipaistev - Olekubuuri on matt või läbipaistev - Mõnedes seadmetes võib selle funktsiooni lubamine muuta süsteemi navigeerimisriba läbipaistvaks. + Olekuriba on läbipaistmatu + Olekuriba on läbipaistmatu või läbipaistev + "Piirangud: +• Videopleieri ülaossa võib ilmuda must riba. +• Mõnedel seadmetel võib selle funktsiooni lubamine muuta süsteemi navigeerimisriba läbipaistvaks." Keela hele läbipaistev riba Heleda režiimi navigeerimisriba on läbipaistmatu - Hele režiimi navigeerimisriba on matt või läbipaistev - Keela tume õhuke riba + Heleda režiimi navigeerimisriba on läbipaistmatu või läbipaistev + Keela tume läbipaistev riba Tumeda režiimi navigeerimisriba on läbipaistmatu - Tume režiimi navigeerimisriba on matt või läbipaistev + Tumeda režiimi navigeerimisriba on läbipaistmatu või läbipaistev + Tööriistariba + Peida või muuda tööriistariba komponente + Peida Loo nupp + Loo nupp on peidetud + Loo nupp on nähtav + Peida teavituste nupp + Teavituste nupp on peidetud + Teavituste nupp on nähtav + Peida otsingunupp + Otsingunupp on peidetud + Otsingunupp on nähtav. + Luba lai otsinguriba + Lai otsinguriba on lubatud + Lai otsinguriba on keelatud Väljuv menüü @@ -837,6 +920,12 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Peida Saada kätte nupp Ülekandmise nupp on peidetud Ülekandmise nupp on nähtav + Peida ahendamise nupp + Ahendamise nupp on peidetud + Ahendamise nupp on nähtav + Peida täisekraani nupp + Täisekraani nupp on peidetud + Täisekraani nupp on nähtav Peida pleieri juhtnuppude taust Mängija juhtnuppude taust on peidetud Pleieri juhtnuppude taust on nähtav @@ -845,9 +934,9 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Nupud on nähtavad - Peida lõpukujunduse kaardid - Lõpukujunduse kaardid on peidetud - Lõpukujunduse kaardid on nähtavad + Peida lõpuekraani kaardid + Lõpuekraani kaardid on peidetud + Lõpuekraani kaardid on nähtavad Keela ümbritseva režiim täisekraanil @@ -872,10 +961,16 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Peida video pisipiltide edenemisriba Video pisipiltide edenemisriba on peidetud Video pisipiltide edenemisriba on nähtav + Luba täisekraani suur otsimisriba + Täisekraani otsimisriba on suures suuruses + Täisekraani otsimisriba on normaalsuuruses Shorts esitusprogramm Peida või näita Shortside pleieri komponente + Peida Shorts kanali lehel + Peidetud kanali lehel + Nähtav kanali lehel Peida Shorts esilehel Peidetud esilehel ja seotud videotes @@ -887,9 +982,18 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Peida Shorts tellimuste voos Peidetud tellimuste voos Nähtaval tellimuste voos + Peida Shorts video kirjelduses + Peidetud video kirjelduses + Nähtav video kirjelduses Peida Shortsid vaatamisaegadust Peidetud vaatamise ajaloos Näidatud vaatamisaegadus + Peida AI nupp + AI nupp on peidetud + AI nupp on nähtav + Peida silt „Automaatselt dubleeritud” + Automaatselt dubleeritud silt on peidetud + Automaatselt dubleeritud silt on nähtav Peida silt „Automaatselt dubleeritud” Automaatselt dubleeritud silt on peidetud Automaatselt dubleeritud silt on nähtav @@ -951,6 +1055,7 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Peida nupp „Kasuta seda malli” Nupp \"Kasuta seda malli\" on peidetud Kasuta seda malli nupp on nähtav + Peida Meeldi nupu purskkaevu animatsioon Meeldimise nupu fontääni animatsioon on peidetud Meeldimise nupu fontääni animatsioon on nähtav @@ -993,13 +1098,18 @@ Heliriba menüü kuvamiseks muutke „Spoof video streams” väärtuseks „And Navigeerimisriba on peidetud Navigeerimisriba on nähtav - + + Peida automaatse esituse eelvaade + Automaatse esituse eelvaade on peidetud + Automaatse esituse eelvaade on nähtav + + Peida lõpuekraani soovitatud video "Lõpuekraani soovitatud video on peidetud, kui automaatesitus on välja lülitatud. Automaatesitust saab muuta YouTube'i seadetes: Seaded → Taasesitus → Esita järgmine video automaatselt" - Lõpuekraani soovitatud video on näidatud + Lõpuekraani soovitatud video on nähtav Peida seotud videote kate @@ -1012,9 +1122,9 @@ Seaded → Taasesitus → Esita järgmine video automaatselt" Ajamärk on nähtav - Peida esitaja hüpikaknad - Esitaja hüpikaknad on peidetud - Esitaja hüpikaknad on nähtavad + Peida esitaja hüpikaknad + Esitaja hüpikaknad on peidetud + Esitaja hüpikaknad on nähtavad Video lõpus välju täisekraanirežiimist @@ -1082,24 +1192,6 @@ Piirang: Ei meeldimised ei pruugi inkognito režiimis kuvada" Kliendi kiirusepiirang on kohatud %d korda %d millisekundit - - Luba lai otsinguriba - Lai otsinguriba on lubatud - Lai otsinguriba on keelatud - - - Luba kvaliteetsed pisipildid - Pisipildid on kvaliteetsed - Pisipildid on keskmiselt kvaliteetsed - "See taastab ka eelvaated otseülekannetel, millel pole otsinguriba eelvaateid. - -Otsinguriba eelvaated kasutavad sama kvaliteeti kui praegune video. - -See funktsioon toimib kõige paremini 720p või madalama video kvaliteedi ja väga kiiresti internetühendusega." - Taasta vanad pisipildid - Pisipildid ilmuvad otsinguriba kohale - Pisipildid ilmuvad täisekraanil - Luba SponsorBlock SponsorBlock on rahvahulga loodud süsteem YouTube\'i videote tüütute osade vahelejätmiseks @@ -1339,8 +1431,6 @@ Kui see hiljem välja lülitatakse, on soovitatav rakenduse andmed kustutada, et Võltsitud rakenduse versiooni siht 20.13.41 - Taasta mittekokkuvarisenud video tegevusriba 20.05.46 - Taasta transkriptsioonifunktsionaalsus - 19.35.36 - Taastage vanad Shortsi esitajaikoonid - 19.01.34 – Taasta vanad navigeerimisikoonid Muuda alguslehte @@ -1445,8 +1535,9 @@ Minimaalset mängijat saab lohistada ekraanilt vasakule või paremale" Laadimiskuval on gradientega taust Laadimiskuval on tahke taust Sissejuhatava ekraani stiil - Värv - Mustvalge + Keelatud + Värv + Mustvalge Lülita kohandatud edastusriba värv sisse Kohandatud edastusriba värv on nähtav Originaal edastusriba värv on nähtav @@ -1551,6 +1642,9 @@ Selle lubamine võib avada kõrgema video kvaliteedi" Keela otsimise tagasivõtmise haptika Otsimise tagasivõtmise haptika on keelatud Otsimise tagasivõtmise haptika on lubatud + Keela puudutamise ja allhoidmise haptika + Puudutamise ja allhoidmise haptika on keelatud + Puudutamise ja allhoidmise haptika on lubatud Keela suumimise hääled Suumi haptika on keelatud Suumi haptika on lubatud @@ -1646,6 +1740,11 @@ Piirangud: Täiustatud video kvaliteedi menüü on kuvatud Täiustatud video kvaliteedi menüü ei ole kuvatud + + Peida Premiumi kvaliteedi valikud + Premiumi kvaliteedi valikud on peidetud + Premiumi kvaliteedi valikud on nähtavad + Luba libistamine otsimiseks Libistamine otsimiseks on lubatud @@ -1677,6 +1776,7 @@ AV1-ga videotaasesitus võib hakitud olla või kaadreid vahele jätta." + Teave Reklaamid Üldine diff --git a/patches/src/main/resources/addresources/values-eu-rES/strings.xml b/patches/src/main/resources/addresources/values-eu-rES/strings.xml index 3a40645452..247cba43b8 100644 --- a/patches/src/main/resources/addresources/values-eu-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-eu-rES/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Desgaitu ikono lodiak + Ikonoak ez dira lodiak + Ikonoak lodiak dira + GmsCore + GmsCorerekin lotutako ezarpenak + GmsCore eguneratzeak egiaztatu + Eguneratzeak egiaztatzea gaituta dago + Eguneraketak bilatzea desgaituta dago + Ireki GmsCore ezarpenak + GmsCore-ren ezarpenak + MicroG GmsCore ez dago instalatuta. Instalatu. + Ekintza beharrezkoa + MicroG GmsCore eguneraketak bilatzean huts egin du + MicroG GmsCore-ren bertsio berri bat (%1$s) eskuragarri dago. Une honetan, %2$s bertsioa erabiltzen ari zara. + "MicroG GmsCore-k ez du atzealdean exekutatzeko baimenik. + +Jarraitu \"Ez hil nire aplikazioa\" gida zure telefonoarentzat, eta aplikatu argibideak zure MicroG instalazioari. + +Hau beharrezkoa da aplikazioak funtziona dezan." + Ireki webgunea + Utzi + "MicroG GmsCore-ren bateria optimizazioak desgaitu behar dira arazoak ekiditeko. + +MicroG-rako bateria optimizazioak desgaitzeak ez du bateriaren erabilera negatiboki eragingo. + +Sakatu jarraitzeko botoia eta baimendu optimizazio aldaketak." + Jarraitu - + + Aplikazioa berrabiarazi eginbide hau erabiltzeko + Log protokolo-bufferra + Arazketa-erregistroek proto-bufferra barne hartzen dute + Arazketa-erregistroek ez dute proto-bufferra barne hartzen + "Ezarpen hau gaitzeak diseinu-datu gehigarriak erregistratuko ditu, UI osagai batzuen pantailako testua barne. + +Honek osagaiak identifikatzen lagun dezake iragazki pertsonalizatuak sortzean. + +Hala ere, hau gaitzeak erabiltzailearen datu batzuk ere erregistratuko ditu, adibidez, zure IP helbidea." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Ezkutatu sortzaileen denda-apala + Bideo-erreproduzitzailearen azpiko sortzaileen denda-apala ezkutatuta dago + Bideo-erreproduzitzailearen azpiko sortzaileen denda-apala ikusgai dago + Ezkutatu iruzkinen atala bideoen azpian Hasierako jarioan + Iruzkinen atala bideoen azpian Hasierako jarioan ezkutatuta dago + Iruzkinen atala bideoen azpian Hasierako jarioan ikusgai dago + + Ezkutatu \'Azken bideoak\' botoia + Azken bideoak botoia ezkutatuta dago + Azken bideoak botoia ikusgai dago + + Ezkutatu web bilaketaren emaitzak + Web bilaketaren emaitzak ezkutatuta daude + Web bilaketaren emaitzak ikusgai daude + Ezkutatu \'Agian gustatuko zaizu\' atala + \'Agian gustatuko zaizu\' atala ezkutatuta dago + \'Agian gustatuko zaizu\' atala ikusgai dago + This button usually appears in the video player for certain videos. --> + + Ezkutatu \'Zuzeneko txataren errepikapena\' botoia + Zuzeneko txataren errepikapena botoia erreproduzitzailearen gainjarpenean ezkutatuta dago + Zuzeneko txataren errepikapena botoia erreproduzitzailearen gainjarpenean ikusgai dago + Ezkutatu bideoaren izenburua + Bideoaren izenburua erreproduzitzailearen gainjarpenean ezkutatuta dago + Bideoaren izenburua erreproduzitzailearen gainjarpenean ikusgai dago + Ezkutatu \'Ikastaroaren aurrerapena\' + Ikastaroaren aurrerapen atala ezkutatuta dago + Ikastaroaren aurrerapen atala ikusgai dago + Ezkutatu Arakatu + \'Ikastaro hau arakatu\' eta \'Podcastea arakatu\' atalak ezkutatuta daude + \'Ikastaro hau arakatu\' eta \'Podcastea arakatu\' atalak ikusgai daude + Ezkutatu \'Ikastaro hau arakatu\' + \'Ikastaro hau arakatu\' atala ezkutatuta dago + \'Ikastaro hau arakatu\' atala ikusgai dago + Ezkutatu \'Podcastea arakatu\' + \'Podcastea arakatu\' atala ezkutatuta dago + \'Podcastea arakatu\' atala ikusgai dago + Ezkutatu \'Leku aipagarriak\' + Leku aipagarriak atala ezkutatuta dago + Leku aipagarriak atala ikusgai dago + Gaitu jarioaren laster-menuaren iragazkia + Jarioaren laster-menuaren iragazkia gaituta dago + Jarioaren laster-menuaren iragazkia desgaituta dago + Jarioaren laster-menuaren iragazkia + Sartu iragazteko laster-menuaren izenak, bat lerroko + Ezkutatu Jokoak + Jokoak atala ezkutatuta dago + Jokoak atala ikusgai dago + Ezkutatu Musika + Musika atala ezkutatuta dago + Musika atala ikusgai dago + Ezkutatu Galdetegiak + Galdetegiak atala ezkutatuta dago + Galdetegiak atala ikusgai dago + Gaitu kanalaren fitxaren iragazkia + Kanalaren fitxaren iragazkia gaituta dago + Kanalaren fitxaren iragazkia desgaituta dago + Kanalaren fitxaren iragazkia + Sartu iragazteko kanalaren fitxen izenak, bat lerroko + "Mugaketak: +• Shorts apalak, kanal orriak eta bilaketa-emaitzak ikustaldi-kopuruak erakusten jarrai dezakete. +• Eginbide honek ez du funtzionatzen automobilgintzako forma-faktoreekin." + "Mugaketak: +• Shorts apalak, kanal orriak eta bilaketa-emaitzak kargatze-denborak erakusten jarrai dezakete. +• Eginbide honek ez du funtzionatzen automobilgintzako forma-faktoreekin." + "Hasiera/Harpidetzak/Bilaketa-emaitzak iragazi egiten dira, gako-hitz esaldiekin bat datozen edukiak ezkutatzeko + +Mugaketak: +• Shorts ezin dira ezkutatu kanalaren izenaren arabera +• UI osagai batzuk agian ez dira ezkutatuko +• Gako-hitz bat bilatzeak ez du emaitzarik erakutsiko" - + Pantaila osoko iragarkiak ezkutatuta daude + Ezkutatu erreproduzitzailearen pop-up iragarkiak + Erreproduzitzailearen pop-up iragarkiak ezkutatuta daude + Erreproduzitzailearen pop-up iragarkiak ikusgai daude + Produktuak ikusteko pankarta erreproduzitzailearen gainjarpenean ezkutatuta dago + Produktuak ikusteko pankarta erreproduzitzailearen gainjarpenean ikusgai dago + Ezkutatu YouTube Premium promozioak + YouTube Premium promozioak ezkutatuta daude + YouTube Premium promozioak ikusgai daude - - + + URLa arbelera kopiatu da + URLa denbora-markarekin kopiatu da + Erakutsi bideoaren URLaren kopia botoia + Bideoaren URLaren kopia botoia ikusgai dago. Sakatu bideoaren URLa kopiatzeko. Luze sakatu denbora-markarekin kopiatzeko + Bideoaren URLaren kopia botoia ez dago ikusgai + Erakutsi denbora-markaren URLaren kopia botoia + Denbora-markaren URLaren kopia botoia ikusgai dago. Sakatu denbora-markarekin bideoaren URLa kopiatzeko. Luze sakatu denbora-markarik gabe kopiatzeko + Denbora-markaren URLaren kopia botoia ez dago ikusgai + - + + Desgaitu \'Telebistan saioa hasi\' pop-upa + \'Telebistan saioa hasi\' pop-upa desgaituta dago + \'Telebistan saioa hasi\' pop-upa gaituta dago + - + + Gaitu sakatu eta bilatu + Sakatu eta bilatu gaituta dago + Sakatu eta bilatu desgaituta dago + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Ezkutatzeak agian ez du funtzionatuko erabiltzaile-kontu batzuetan. - + + Nabigazio-botoiak + Ezkutatu edo aldatu nabigazio-barrako botoiak + Ezkutatu Hasiera + Hasiera botoia ezkutatuta dago + Hasiera botoia ikusgai dago + Ezkutatu Shorts + Shorts botoia ezkutatuta dago + Shorts botoia ikusgai dago + Ezkutatu Sortu + Sortu botoia ezkutatuta dago + Sortu botoia ikusgai dago + Ezkutatu Harpidetzak + Harpidetzak botoia ezkutatuta dago + Harpidetzak botoia ikusgai dago + Ezkutatu Jakinarazpenak + Jakinarazpenak botoia ezkutatuta dago + Jakinarazpenak botoia ikusgai dago + Aldatu Sortu eta Jakinarazpenak + Sortu botoia Jakinarazpenak botoiarekin trukatu da + Sortu botoia ez da Jakinarazpenak botoiarekin trukatu + Ezarpen hau aldatzeak ez badu eraginik, saiatu inkognito modura aldatzen. + Ezkutatu nabigazio-botoien etiketak + Etiketak ezkutatuta daude + Etiketak ikusgai daude + Gaitu nabigazio-botoi estuak + Nabigazio-botoien arteko tartea estua da + Nabigazio-botoien arteko tartea normala da + Gaitu nabigazio-barrako animazioak + Nabigazio-trantsizioak animatuta daude + Nabigazio-trantsizioak ez daude animatuta + Desgaitu egoera-barra zeharrargia + Egoera-barra opakoa da + Egoera-barra opakoa edo zeharrargia da + "Mugaketak: +• Barra beltz bat ager daiteke bideo-erreproduzitzailearen goialdean. +• Gailu batzuetan, eginbide hau gaitzeak sistemaren nabigazio-barra gardena bihur dezake." + Desgaitu barra zeharrargi argia + Modu argiko nabigazio-barra opakoa da + Modu argiko nabigazio-barra opakoa edo zeharrargia da + Desgaitu barra zeharrargi iluna + Modu iluneko nabigazio-barra opakoa da + Modu iluneko nabigazio-barra opakoa edo zeharrargia da + Tresna-barra + Ezkutatu edo aldatu tresna-barrako osagaiak + Ezkutatu Sortu botoia + Sortu botoia ezkutatuta dago + Sortu botoia ikusgai dago + Ezkutatu Jakinarazpenak botoia + Jakinarazpenak botoia ezkutatuta dago + Jakinarazpenak botoia ikusgai dago + Ezkutatu Bilatu botoia + Bilatu botoia ezkutatuta dago + Bilatu botoia ikusgai dago. + Gaitu bilaketa-barra zabala + Bilaketa-barra zabala gaituta dago + Bilaketa-barra zabala desgaituta dago @@ -126,25 +315,67 @@ Second \"item\" text" + Ezkutatu Tolestu botoia + Tolestu botoia ezkutatuta dago + Tolestu botoia ikusgai dago + Ezkutatu Pantaila osoa botoia + Pantaila osoa botoia ezkutatuta dago + Pantaila osoa botoia ikusgai dago + + + Ezkutatu amaiera-pantailako txartelak + Amaiera-pantailako txartelak ezkutatuta daude + Amaiera-pantailako txartelak ikusgai daude - + Gaitu pantaila osoko bilaketa-barra handia + Pantaila osoko bilaketa-barra handia da + Pantaila osoko bilaketa-barra tamaina normalekoa da + Ezkutatu Shorts kanalaren orrian + Ezkutatuta kanalaren orrian + Ikusgai kanalaren orrian + Ezkutatu Shorts bideoaren deskribapenean + Ezkutatuta bideoaren deskribapenean + Ikusgai bideoaren deskribapenean + Ezkutatu AI botoia + AI botoia ezkutatuta dago + AI botoia ikusgai dago + Ezkutatu \'Auto-bikoiztua\' etiketa + Auto-bikoiztua etiketa ezkutatuta dago + Auto-bikoiztua etiketa ikusgai dago + - + + Ezkutatu erreprodukzio automatikoko aurrebista + Erreprodukzio automatikoko aurrebista ezkutatuta dago + Erreprodukzio automatikoko aurrebista ikusgai dago + + + Ezkutatu amaiera-pantailako iradokitako bideoa + "Amaiera-pantailako iradokitako bideoa ezkutatuta dago erreprodukzio automatikoa desgaituta dagoenean + +Erreprodukzio automatikoa YouTube ezarpenetan alda daiteke: +Ezarpenak → Erreprodukzioa → Hurrengo bideoa automatikoki erreproduzitu" + Amaiera-pantailako iradokitako bideoa ikusgai dago + - + + Ezkutatu erreproduzitzailearen pop-up panelak + Erreproduzitzailearen pop-up panelak ezkutatuta daude + Erreproduzitzailearen pop-up panelak bistaratuta daude + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Musika-bideoetan soilik erabiltzeko. Musika gabeko musika-bideoen atalak, beste kategoria batek oraindik estaltzen ez dituenak + Ezin da segmentua bidali: %s + "Ezin da segmentua bidali. +Jada existitzen da" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Desgaituta + Kolorea + Zuri-beltza + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Desgaitu sakatu eta eduki haptikoak + Sakatu eta eduki haptikoak desgaituta daude + Sakatu eta eduki haptikoak gaituta daude + @@ -200,6 +441,11 @@ Second \"item\" text" + + Ezkutatu Premium kalitate-aukerak + Premium kalitate-aukerak ezkutatuta daude + Premium kalitate-aukerak ikusgai daude + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml index 4828816296..ab55540baa 100644 --- a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml +++ b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml @@ -53,6 +53,9 @@ Second \"item\" text" حذف از تاریخچه جستجو؟ تاریخچه جستجو خالی است نمایش تاریخچه جستجوی تنظیمات + غیرفعال کردن آیکون‌های پررنگ + آیکون‌ها پررنگ نیستند + آیکون‌ها پررنگ هستند نمایش آیکون تنظیمات ReVanced نمادهای تنظیمات نشان داده می‌شوند نمادهای تنظیمات نمایش داده نمی شوند @@ -68,11 +71,31 @@ Second \"item\" text" and changes made here must also be made there. --> + GmsCore + تنظیمات مربوط به GmsCore + بررسی به‌روزرسانی‌های GmsCore + بررسی به‌روزرسانی‌ها فعال است + بررسی به‌روزرسانی‌ها غیرفعال است + باز کردن تنظیمات GmsCore + تنظیمات GmsCore - MicroG GmsCore نصب نشده است. آنرا نصب کنید. - اقدام لازم است - باز کردن تارنما - ادامه + MicroG GmsCore نصب نشده است. آنرا نصب کنید. + اقدام لازم است + بررسی به‌روزرسانی‌های MicroG GmsCore با شکست مواجه شد + نسخه جدیدی (%1$s) از MicroG GmsCore در دسترس است. در حال حاضر، شما از نسخه %2$s استفاده می‌کنید. + "MicroG GmsCore مجوز اجرا در پس‌زمینه را ندارد. + +راهنمای \"Don't kill my app\" را برای تلفن خود دنبال کنید و دستورالعمل‌ها را در نصب MicroG خود اعمال کنید. + +این برای کارکرد برنامه الزامی است." + باز کردن تارنما + لغو + "بهینه‌سازی‌های باتری MicroG GmsCore باید غیرفعال شوند تا از مشکلات جلوگیری شود. + +غیرفعال کردن بهینه‌سازی‌های باتری برای MicroG تأثیر منفی بر مصرف باتری نخواهد داشت. + +روی دکمه ادامه ضربه بزنید و تغییرات بهینه‌سازی را مجاز کنید." + ادامه @@ -84,6 +107,13 @@ Second \"item\" text" گزارش عیب لاگ عیب فعال است لاگ عیب غیرفعال است + برای استفاده از این قابلیت، برنامه را دوباره راه‌اندازی کنید + پروتکل بافر را ثبت کنید + لاگ‌های اشکال‌زدایی شامل پروتکل بافر هستند + لاگ‌های اشکال‌زدایی شامل پروتکل بافر نیستند + "فعال‌سازی این تنظیم، داده‌های طرح‌بندی اضافی، از جمله متن روی صفحه برای برخی از اجزای رابط کاربری را ثبت خواهد کرد. +این می‌تواند به شناسایی اجزا هنگام ایجاد فیلترهای سفارشی کمک کند. +با این حال، فعال‌سازی این مورد، برخی از داده‌های کاربر مانند آدرس IP شما را نیز ثبت خواهد کرد." @@ -100,42 +130,137 @@ Second \"item\" text" - + قفسه فروشگاه سازنده را پنهان کنید + قفسه فروشگاه سازنده زیر پخش‌کننده ویدئو پنهان است + قفسه فروشگاه سازنده زیر پخش‌کننده ویدئو نمایش داده می‌شود + بخش نظرات زیر ویدئوها در صفحه اصلی را پنهان کنید + بخش نظرات زیر ویدئوها در صفحه اصلی پنهان است + بخش نظرات زیر ویدئوها در صفحه اصلی نمایش داده می‌شود + + دکمه «آخرین ویدئوها» را پنهان کنید + دکمه آخرین ویدئوها پنهان است + دکمه آخرین ویدئوها نمایش داده می‌شود + پنهان سازی دکمه \'نمایش بیشتر\' پنهان سازی قفسه بلیط + نتایج جستجوی وب را پنهان کنید + نتایج جستجوی وب پنهان هستند + نتایج جستجوی وب نمایش داده می‌شوند + بخش «ممکن است دوست داشته باشید» را پنهان کنید + بخش «ممکن است دوست داشته باشید» پنهان است + بخش «ممکن است دوست داشته باشید» نمایش داده می‌شود + This button usually appears in the video player for certain videos. --> + + دکمه «پخش مجدد گفتگوی زنده» را پنهان کنید + دکمه پخش مجدد گفتگوی زنده در پوشش پخش‌کننده پنهان است + دکمه پخش مجدد گفتگوی زنده در پوشش پخش‌کننده نمایش داده می‌شود + عنوان ویدئو را پنهان کنید + عنوان ویدئو در پوشش پخش‌کننده پنهان است + عنوان ویدئو در پوشش پخش‌کننده نمایش داده می‌شود + «پیشرفت دوره» را پنهان کنید + بخش پیشرفت دوره پنهان است + بخش پیشرفت دوره نمایش داده می‌شود + کاوش را پنهان کنید + بخش‌های «این دوره را کاوش کنید» و «پادکست را کاوش کنید» پنهان هستند + بخش‌های «این دوره را کاوش کنید» و «پادکست را کاوش کنید» نمایش داده می‌شوند + «این دوره را کاوش کنید» را پنهان کنید + بخش «این دوره را کاوش کنید» پنهان است + بخش «این دوره را کاوش کنید» نمایش داده می‌شود + «پادکست را کاوش کنید» را پنهان کنید + بخش «پادکست را کاوش کنید» پنهان است + بخش «پادکست را کاوش کنید» نمایش داده می‌شود + «مکان‌های برجسته» را پنهان کنید + بخش مکان‌های برجسته پنهان است + بخش مکان‌های برجسته نمایش داده می‌شود + فیلتر منوی بازشوی فید را فعال کنید + فیلتر منوی بازشوی فید فعال است + فیلتر منوی بازشوی فید غیرفعال است + فیلتر منوی بازشوی فید + نام‌های منوی بازشو را برای فیلتر کردن، هر یک در یک خط، وارد کنید + بازی را پنهان کنید + بخش بازی پنهان است + بخش بازی نمایش داده می‌شود + موسیقی را پنهان کنید + بخش موسیقی پنهان است + بخش موسیقی نمایش داده می‌شود + مسابقات را پنهان کنید + بخش مسابقات پنهان است + بخش مسابقات نمایش داده می‌شود + فیلتر برگه‌ی کانال را فعال کنید + فیلتر برگه‌ی کانال فعال است + فیلتر برگه‌ی کانال غیرفعال است + فیلتر برگه‌ی کانال + نام‌های برگه‌های کانال را برای فیلتر کردن، هر یک در یک خط، وارد کنید + "محدودیت‌ها: +• قفسه‌های Shorts، صفحات کانال و نتایج جستجو ممکن است همچنان تعداد بازدیدها را نشان دهند. +• این ویژگی با فرم فاکتور خودرو کار نمی‌کند." + "محدودیت‌ها: +• قفسه‌های Shorts، صفحات کانال و نتایج جستجو ممکن است همچنان زمان‌های بارگذاری را نشان دهند. +• این ویژگی با فرم فاکتور خودرو کار نمی‌کند." + "صفحه اصلی/اشتراک‌ها/نتایج جستجو فیلتر شده‌اند تا محتوایی که با عبارات کلیدی مطابقت دارد پنهان شود + +محدودیت‌ها: +• Shorts را نمی‌توان با نام کانال پنهان کرد +• برخی از مؤلفه‌های رابط کاربری ممکن است پنهان نشوند +• جستجو برای یک کلمه کلیدی ممکن است نتیجه‌ای نشان ندهد" - + تبلیغات تمام‌صفحه پنهان هستند + پنهان کردن تبلیغات پاپ‌آپ پخش‌کننده + تبلیغات پاپ‌آپ پخش‌کننده پنهان هستند + تبلیغات پاپ‌آپ پخش‌کننده نمایش داده می‌شوند + بنر مشاهده محصولات در پوشش پخش‌کننده پنهان است + بنر مشاهده محصولات در پوشش پخش‌کننده نمایش داده می‌شود + تبلیغات YouTube Premium را پنهان کنید + تبلیغات YouTube Premium پنهان هستند + تبلیغات YouTube Premium نمایش داده می‌شوند - - + + URL در کلیپ‌بورد کپی شد + URL به همراه برچسب زمانی کپی شد + نمایش دکمه کپی کردن URL ویدئو + دکمه کپی کردن URL ویدئو نمایش داده می‌شود. برای کپی کردن URL ویدئو ضربه بزنید. برای کپی کردن با برچسب زمانی، ضربه زده و نگه دارید + دکمه کپی کردن URL ویدئو نمایش داده نمی‌شود + نمایش دکمه کپی کردن URL با برچسب زمانی + دکمه کپی کردن URL با برچسب زمانی نمایش داده می‌شود. برای کپی کردن URL ویدئو با برچسب زمانی ضربه بزنید. برای کپی کردن بدون برچسب زمانی، ضربه زده و نگه دارید + دکمه کپی کردن URL با برچسب زمانی نمایش داده نمی‌شود + - + + پنجره بازشوی «ورود به تلویزیون» را غیرفعال کنید + پنجره بازشوی «ورود به تلویزیون» غیرفعال است + پنجره بازشوی «ورود به تلویزیون» فعال است + - + + فعال کردن جستجو با ضربه + جستجو با ضربه فعال است + جستجو با ضربه غیرفعال است + @@ -143,25 +268,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + پنهان‌سازی ممکن است برای برخی از حساب‌های کاربری کار نکند. - + + دکمه‌های پیمایش + پنهان کردن یا تغییر دکمه‌های نوار پیمایش + خانه را پنهان کنید + دکمه خانه پنهان است + دکمه خانه نمایش داده می‌شود + Shorts را پنهان کنید + دکمه Shorts پنهان است + دکمه Shorts نمایش داده می‌شود + ساخت را پنهان کنید + دکمه ساخت پنهان است + دکمه ساخت نمایش داده می‌شود + اشتراک‌ها را پنهان کنید + دکمه اشتراک‌ها پنهان است + دکمه اشتراک‌ها نمایش داده می‌شود + اعلان‌ها را پنهان کنید + دکمه اعلان‌ها پنهان است + دکمه اعلان‌ها نمایش داده می‌شود + ساخت را با اعلان‌ها جابجا کنید + دکمه ساخت با دکمه اعلان‌ها جابجا شده است + دکمه ساخت با دکمه اعلان‌ها جابجا نشده است + اگر تغییر این تنظیمات اعمال نمی‌شود، حالت ناشناس را امتحان کنید. + برچسب‌های دکمه پیمایش را پنهان کنید + برچسب‌ها پنهان هستند + برچسب‌ها نمایش داده می‌شوند + فعال کردن دکمه‌های پیمایش باریک + فاصله بین دکمه‌های پیمایش باریک است + فاصله بین دکمه‌های پیمایش عادی است + فعال کردن انیمیشن‌های نوار پیمایش + انتقال‌های پیمایش متحرک هستند + انتقال‌های پیمایش متحرک نیستند + غیرفعال کردن نوار وضعیت شفاف + نوار وضعیت مات است + نوار وضعیت مات یا شفاف است + "محدودیت‌ها: +• ممکن است یک نوار سیاه در بالای پخش‌کننده ویدئو ظاهر شود. +• در برخی دستگاه‌ها، فعال کردن این ویژگی می‌تواند نوار پیمایش سیستم را به شفاف تغییر دهد." + غیرفعال کردن نوار شفاف روشن + نوار پیمایش حالت روشن مات است + نوار پیمایش حالت روشن مات یا شفاف است + غیرفعال کردن نوار شفاف تیره + نوار پیمایش حالت تاریک مات است + نوار پیمایش حالت تاریک مات یا شفاف است + نوار ابزار + پنهان کردن یا تغییر مؤلفه‌های نوار ابزار + دکمه ساخت را پنهان کنید + دکمه ساخت پنهان است + دکمه ساخت نمایش داده می‌شود + دکمه اعلان‌ها را پنهان کنید + دکمه اعلان‌ها پنهان است + دکمه اعلان‌ها نمایش داده می‌شود + دکمه جستجو را پنهان کنید + دکمه جستجو پنهان است + دکمه جستجو نمایش داده می‌شود. + فعال‌سازی نوار جستجوی عریض + نوار جستجوی عریض فعال است + نوار جستجوی عریض غیرفعال است @@ -180,25 +362,67 @@ Second \"item\" text" + دکمه جمع کردن را پنهان کنید + دکمه جمع کردن پنهان است + دکمه جمع کردن نمایش داده می‌شود + دکمه تمام‌صفحه را پنهان کنید + دکمه تمام‌صفحه پنهان است + دکمه تمام‌صفحه نمایش داده می‌شود + + + کارت‌های پایان ویدئو را پنهان کنید + کارت‌های پایان ویدئو پنهان هستند + کارت‌های پایان ویدئو نمایش داده می‌شوند - + فعال کردن نوار جستجوی بزرگ تمام‌صفحه + نوار جستجوی تمام‌صفحه اندازه بزرگ دارد + نوار جستجوی تمام‌صفحه اندازه عادی دارد + Shorts را در صفحه‌ی کانال پنهان کنید + در صفحه‌ی کانال پنهان شده است + در صفحه‌ی کانال نمایش داده می‌شود + Shorts را در توضیحات ویدئو پنهان کنید + در توضیحات ویدئو پنهان شده است + در توضیحات ویدئو نمایش داده می‌شود + دکمه هوش مصنوعی را پنهان کنید + دکمه هوش مصنوعی پنهان است + دکمه هوش مصنوعی نمایش داده می‌شود + برچسب «دوبله خودکار» را پنهان کنید + برچسب دوبله خودکار پنهان است + برچسب دوبله خودکار نمایش داده می‌شود + - + + پیش‌نمایش پخش خودکار را پنهان کنید + پیش‌نمایش پخش خودکار پنهان است + پیش‌نمایش پخش خودکار نمایش داده می‌شود + + + ویدئوی پیشنهادی پایان صفحه را پنهان کنید + "ویدئوی پیشنهادی پایان صفحه هنگامی که پخش خودکار خاموش است، پنهان می‌شود + +پخش خودکار را می‌توان در تنظیمات YouTube تغییر داد: +تنظیمات ← پخش ← پخش خودکار ویدئوی بعدی" + ویدئوی پیشنهادی پایان صفحه نمایش داده می‌شود + - + + پنهان کردن پنل‌های پاپ‌آپ پخش‌کننده + پنل‌های پاپ‌آپ پخش‌کننده پنهان شده‌اند + پنل‌های پاپ‌آپ پخش‌کننده نمایش داده شده‌اند + @@ -209,12 +433,14 @@ Second \"item\" text" - - عمومی رونوشت‌ + فقط برای استفاده در موزیک ویدئوها. بخش‌هایی از موزیک ویدئوها بدون موسیقی، که هنوز تحت پوشش دسته‌بندی دیگری نیستند + نمی‌توان قطعه را ارسال کرد: %s + "نمی‌توان قطعه را ارسال کرد. +از قبل موجود است" @@ -227,7 +453,11 @@ Second \"item\" text" - + + غیرفعال شده + رنگ + سیاه و سفید + @@ -244,7 +474,11 @@ Second \"item\" text" - + + غیرفعال کردن بازخورد لمسی (haptics) با ضربه و نگه داشتن + بازخورد لمسی (haptics) با ضربه و نگه داشتن غیرفعال است + بازخورد لمسی (haptics) با ضربه و نگه داشتن فعال است + @@ -257,6 +491,11 @@ Second \"item\" text" + + گزینه‌های کیفیت Premium را پنهان کنید + گزینه‌های کیفیت Premium پنهان هستند + گزینه‌های کیفیت Premium نمایش داده می‌شوند + @@ -264,7 +503,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 3778c5a71e..f08b770575 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Näytä asetusten hakuhistoria Asetusten hakuhistoria näytetään Asetusten hakuhistoriaa ei näytetä + Poista lihavoidut kuvakkeet käytöstä + Kuvakkeet eivät ole lihavoituja + Kuvakkeet ovat lihavoituja Näytä ReVanced-asetuskuvakkeet Asetuskuvakkeet näytetään Asetuskuvakkeita ei näytetä @@ -101,23 +104,31 @@ Kääntääksesi uusia kieliä tai parantaaksesi olemassa olevia käännöksiä, and changes made here must also be made there. --> - GmsCore-asetukset - GmsCoren asetukset + GmsCore + GmsCoren asetukset + Tarkista GmsCore-päivitykset + Päivitysten tarkistus on käytössä + Päivitysten tarkistus on poistettu käytöstä + Avaa GmsCore-asetukset + GmsCoren asetukset - MicroG GmsCorea ei ole asennettu. Asenna se. - Vaatii toimenpiteitä - "MicroG GmsCorella ei ole lupaa pysyä käynnissä taustalla. + MicroG GmsCorea ei ole asennettu. Asenna se. + Vaatii toimenpiteitä + MicroG GmsCore -päivitysten tarkistus epäonnistui + Uusi versio (%1$s) MicroG GmsCoresta on saatavilla. Käytössäsi on tällä hetkellä versio %2$s. + "MicroG GmsCorella ei ole lupaa pysyä käynnissä taustalla. Seuraa puhelimeesi sopivaa \"Don't kill my app\" -opasta ja sovella sen ohjeita MicroG-asennukseesi. Tämä on välttämätöntä sovelluksen toiminnalle." - Avaa verkkosivusto - "MicroG GmsCoren akun optimoinnit on poistettava käytöstä ongelmien välttämiseksi. + Avaa verkkosivusto + Peruuta + "MicroG GmsCoren akun optimoinnit on poistettava käytöstä ongelmien välttämiseksi. MicroG:n akun optimointien poistaminen käytöstä ei vaikuta akun käyttöön negatiivisesti. Napauta jatka-painiketta ja salli optimoinnin muutokset." - Jatka + Jatka Naamioi videovirrat @@ -173,10 +184,11 @@ Et saa ilmoituksia odottamattomista tapahtumista." Liput tallennettu Liput nollattu Liput kopioitu leikepöydälle - Kirjaa protokollapuskuri - Virheenkorjauslokit sisältävät proto-puskurin - Virheenkorjauslokit eivät sisällä proto-puskuria - "Tämän asetuksen käyttöönotto kirjaa lisätietoja asettelusta, mm. joidenkin käyttöliittymän osien näyttötekstiä. + Käynnistä sovellus uudelleen käyttääksesi tätä ominaisuutta + Kirjaa protokollapuskuri + Virheenkorjauslokit sisältävät proto-puskurin + Virheenkorjauslokit eivät sisällä proto-puskuria + "Tämän asetuksen käyttöönotto kirjaa lisätietoja asettelusta, mm. joidenkin käyttöliittymän osien näyttötekstiä. Tämä voi auttaa komponenttien tunnistamisessa, kun luot mukautettuja suodattimia. @@ -226,6 +238,9 @@ Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoit Shortsien taustatoisto on käytössä + Piilota sisällöntuottajan kauppahylly + Sisällöntuottajan kauppahylly piilotetaan videosoittimen alla + Sisällöntuottajan kauppahylly videosoittimen alla näytetään Piilota albumikortit Albumikortit piilotetaan Albumikortit näytetään @@ -235,6 +250,9 @@ Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoit Piilota siruhylly Siruhylly piilotetaan Siruhylly näytetään + Piilota kommenttiosio videoiden alla Etusivu-syötteessä + Kommenttiosio videoiden alla Etusivu-syötteessä on piilotettu + Kommenttiosio videoiden alla Etusivu-syötteessä näytetään Piilota yhteisöpostaukset Yhteisöpostaukset piilotetaan Yhteisöpostaukset näytetään @@ -262,14 +280,19 @@ Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoit Piilota uusimmat postaukset Uusimmat postaukset piilotetaan Uusimmat postaukset näytetään + + Piilota \"Uusimmat videot\" -painike + Uusimmat videot -painike piilotetaan + Uusimmat videot -painike näytetään Piilota mix-soittolistat Mix-soittolistat piilotetaan Mix-soittolistat näytetään Piilota elokuvat-osio Elokuvat-osio piilotetaan Elokuvat-osio näytetään - + Piilota \"Ilmoita minulle\" -painike Ilmoita minulle -painike piilotetaan Ilmoita minulle -painike näytetään @@ -294,13 +317,16 @@ Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoit Piilota visuaalinen väliosa Visuaalinen väliosa on piilotettu Visuaalinen väliosa on näkyvissä + Piilota verkkohakutulokset + Verkkohakutulokset piilotetaan + Verkkohakutulokset näytetään + Piilota \"Saatat pitää\" -osio + \"Saatat pitää\" -osio on piilotettu + \"Saatat pitää\" -osio näytetään Piilota YouTube Doodlet Logon YouTube Doodles -animaatio piilotetaan Logon YouTube Doodles -animaatio näytetään - "YouTube Doodlet näkyvät muutamana päivänä vuodessa. - -Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käytössä, myös hakupalkin alla oleva suodatinpalkki piilotetaan." Piilota kanavapalkki Kanavapalkki piilotetaan Kanavapalkki näytetään @@ -317,10 +343,15 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt Tietopaneelit piilotetaan Tietopaneelit näytetään + This button usually appears in the video player for certain videos. --> Piilota Liity-painike Liity-painike piilotetaan Liity-painike näytetään + + Piilota \"Live-chat-uusinta\" -painike + Live-chat-uusinta -painike soittimen peittokuvassa on piilotettu + Live-chat-uusinta -painike soittimen peittokuvassa näytetään Piilota lääketieteelliset paneelit Lääketieteelliset paneelit piilotetaan Lääketieteelliset paneelit näytetään @@ -336,6 +367,9 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt Piilota ajoitetut reaktiot Ajoitetut reaktiot piilotetaan Ajoitetut reaktiot näytetään + Piilota videon otsikko + Videon otsikko soittimen peittokuvassa on piilotettu + Videon otsikko soittimen peittokuvassa näytetään Piilota \"tekoälyn luoma videoyhteenveto\" Tekoälyn luoma videon yhteenveto-osio piilotetaan Tekoälyn luoma videon yhteenveto-osio näytetään @@ -348,33 +382,62 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt Piilota Videon osat Videon osat -osio piilotetaan Videon osat -osio näytetään - Piilota \"Miten sisältö on luotu\" - Miten sisältö on luotu -osio piilotetaan - Miten sisältö on luotu -osio näytetään - Piilota Hype-pisteet - Hype-pisteet piilotetaan - Hype-pisteet näytetään + Piilota \'Kurssin edistyminen\' + Kurssin edistyminen -osio on piilotettu + Kurssin edistyminen -osio näytetään + Piilota Tutki + Tutustu tähän kurssiin ja Tutustu podcastiin -osiot on piilotettu + Tutustu tähän kurssiin ja Tutustu podcastiin -osiot näytetään + Piilota \'Tutustu tähän kurssiin\' + Tutustu tähän kurssiin -osio on piilotettu + Tutustu tähän kurssiin -osio näytetään + Piilota \"Tutustu podcastiin\" + Tutustu podcastiin -osio piilotetaan + Tutustu podcastiin -osio näytetään Piilota \"Tutustu podcastiin\" Tutustu podcastiin -osio piilotetaan Tutustu podcastiin -osio näytetään Piilota esitellyt linkit Suositeltujen linkkien osio piilotetaan Suositeltujen linkkien osio näytetään + Piilota \'Esitellyt paikat\' + Esitellyt paikat -osio on piilotettu + Esitellyt paikat -osio näytetään Piilota suositellut videot Suositeltujen videoiden osio piilotetaan Suositeltujen videoiden osio näytetään + Ota syötteen ponnahdusvalikon suodatin käyttöön + Syötteen ponnahdusvalikon suodatin on käytössä + Syötteen ponnahdusvalikon suodatin ei ole käytössä + Syötteen ponnahdusvalikon suodatin + Syötä ponnahdusvalikon nimet suodatettavaksi, yksi per rivi + Piilota Pelit + Pelit-osio on piilotettu + Pelit-osio näytetään + Piilota \"Miten sisältö on luotu\" + Miten sisältö on luotu -osio piilotetaan + Miten sisältö on luotu -osio näytetään + Piilota Hype-pisteet + Hype-pisteet piilotetaan + Hype-pisteet näytetään Piilota tietokortit Infokortit-osio piilotetaan Infokortit-osio näytetään Piilota \"Keskeiset käsitteet\" Keskeiset käsitteet -osio piilotetaan Keskeiset käsitteet -osio näytetään + Piilota Musiikki + Musiikki-osio on piilotettu + Musiikki-osio näytetään Piilota Tilaa-painike Tilaa-painike piilotetaan Tilaa-painike näytetään Piilota transkriptio Transkriptio-osio piilotetaan Transkriptio-osio näytetään + Piilota Tietovisat + Tietovisat-osio on piilotettu + Tietovisat-osio näytetään Videon kuvaus Piilota tai näytä videon kuvauksen osia Suodatinpalkki @@ -393,6 +456,11 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt Näytetään katseluhistoriassa Kanavasivu Piilota tai näytä kanavasivun osia + Ota kanavavälilehden suodatin käyttöön + Kanavavälilehden suodatin on käytössä + Kanavavälilehden suodatin ei ole käytössä + Kanavavälilehden suodatin + Syötä suodatettavat kanavavälilehtien nimet, yksi per rivi Piilota yhteisöpainike Yhteisö-painike piilotetaan @@ -456,15 +524,15 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt Katselukerrat näytetään syötteessä ja hakutuloksissa "Rajoitukset: -• Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää katselukertoja -• Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa" +• Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää katselukertoja. +• Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa." Piilota julkaisuaika Julkaisuaika piilotetaan syötteessä ja hakutuloksissa Julkaisuaika näytetään syötteessä ja hakutuloksissa "Rajoitukset: -• Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää julkaisuaikoja -• Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa" +• Shorts-hyllyt, kanavasivut ja hakutulokset saattavat edelleen näyttää julkaisuaikoja. +• Tämä ominaisuus ei toimi ajoneuvo-käyttöliittymäasettelussa." Piilota sisältöä avainsanojen mukaan Piilota haku- ja syötevideoita avainsanasuodattimilla Piilota koti-videoita avainsanojen mukaan @@ -485,9 +553,9 @@ Avainsanat voivat olla kanavanimiä tai mitä tahansa videootsikoissa näkyvää Sana, jossa on isoja kirjaimia keskellä, on syötettävä samalla kirjainkokoisella (esim: iPhone, TikTok, LeBlanc)" Tietoja avainsanoilla suodatuksesta - "Etusivu/Tilaus/Hakutulokset suodatetaan niin, että avainsanoja vastaava sisältö piilotetaan + "Etusivu/Tilaukset/Hakutulokset suodatetaan niin, että avainsanoja vastaava sisältö piilotetaan -Rajoitukset +Rajoitukset: • Shorts-videoita ei voi piilottaa kanavan nimen perusteella • Joitain käyttöliittymän osia ei välttämättä piiloteta • Avainsanan haku ei välttämättä näytä tuloksia" @@ -502,19 +570,12 @@ Rajoitukset Avainsana piilottaa kaikki videot: %s - Piilota sisällöntuottajan kauppahylly - Sisällöntuottajan kauppahylly piilotetaan videosoittimen alla - Sisällöntuottajan kauppahylly videosoittimen alla näytetään Piilota loppunäytön kauppabanneri Loppunäytön kauppabanneri piilotetaan Loppunäytön kauppabanneri näytetään Piilota koko näytön mainokset - "Koko näytön mainokset piilotetaan - -Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" + Koko näytön mainokset piilotetaan Koko näytön mainokset näytetään - - Koko näytön mainosten piilottaminen toimii vain vanhemmilla laitteilla Piilota yleiset mainokset Yleiset mainokset piilotetaan Yleiset mainokset näytetään @@ -524,6 +585,9 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" Piilota maksetun mainostuksen tunniste Maksetun mainostuksen tunniste piilotetaan Maksetun mainostuksen tunniste näytetään + Piilota soittimen ponnahdusmainokset + Soittimen ponnahdusmainokset piilotetaan + Soittimen ponnahdusmainokset näytetään Piilota itse-sponsoroidut kortit Itse-sponsoroidut kortit piilotetaan Itse-sponsoroidut kortit näytetään @@ -531,23 +595,18 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" Ostoslinkit videon kuvauksessa piilotetaan Ostoslinkit videon kuvauksessa näytetään Piilota \"Näytä tuotteet\" -banneri - Videon peittokuvan tuotebannerit piilotetaan - Videon peittokuvan tuotebannerit näytetään - Piilota verkkohakutulokset - Verkkohakutulokset piilotetaan - Verkkohakutulokset näytetään - - - Piilota YouTube Premium -mainokset - YouTube Premium -mainokset videosoittimen alla piilotetaan - YouTube Premium -mainokset videosoittimen alla näytetään + Tuotenäytön banneri soittimen peittokuvassa on piilotettu + Tuotenäytön banneri soittimen peittokuvassa näytetään + Piilota YouTube Premium -mainokset + YouTube Premium -mainokset piilotetaan + YouTube Premium -mainokset näytetään Piilota videomainokset Videomainokset piilotetaan Videomainokset näytetään - + URL-osoite kopioitiin leikepöydälle Aikaleimattu URL-osoite kopioitiin Näytä videon URL-osoitteen kopiointipainike @@ -563,10 +622,10 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" Valintaikkuna näytetään Tämä ei ohita ikärajoitusta. Se vain hyväksyy sen automaattisesti. - - Poista \"Kirjaudu TV:hen\" -ponnahdusikkuna käytöstä - Kirjaudu televisioon -ponnahdusikkuna on poistettu käytöstä - Kirjaudu televisioon -ponnahdusikkuna on käytössä + + Poista \"Kirjaudu TV:hen\" -ponnahdusikkuna käytöstä + Kirjaudu televisioon -ponnahdusikkuna on poistettu käytöstä + Kirjaudu televisioon -ponnahdusikkuna on käytössä Poista videon osan ohittaminen kaksoisnapauttamalla käytöstä @@ -599,10 +658,10 @@ Tarkista, että paketin nimi on oikein ja sovellus on asennettu" Ele ei ole käytössä Ele on käytössä - - Ota etsintä napauttamalla käyttöön - Etsintä napauttamalla on käytössä - Etsintä napauttamalla ei ole käytössä + + Ota etsintä napauttamalla käyttöön + Etsintä napauttamalla on käytössä + Etsintä napauttamalla ei ole käytössä Ota kirkkauden ele käyttöön @@ -683,7 +742,7 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Kommentit-painike piilotetaan Kommentit-painike näytetään + This button usually appears on live streamed videos. --> Piilota Tee ilmoitus Tee ilmoitus -painike piilotetaan Tee ilmoitus -painike näytetään @@ -696,7 +755,7 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Lataa-painike piilotetaan Lataa-painike näytetään + This button usually appears on videos uploaded by the logged-in user. --> Piilota Hypetä Hypetä-painike piilotetaan Hypetä-painike näytetään @@ -709,7 +768,7 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Kiitos-painike piilotetaan Kiitos-painike näytetään + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Piilota Ask Ask-painike piilotetaan Ask-painike näytetään @@ -717,6 +776,7 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Piilota Klippi Klippi-painike piilotetaan Klippi-painike näytetään + Piilotus ei välttämättä toimi joillakin käyttäjätileillä. Piilota Kauppa Kauppa-painike piilotetaan @@ -726,7 +786,7 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Tallenna-painike piilotetaan Tallenna-painike näytetään - + Navigointipainikkeet Piilota tai muuta navigointipalkin painikkeita @@ -750,26 +810,44 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Ilmoitukset-painike näytetään Vaihda Luo ja Ilmoitukset - "Luo- ja Ilmoitukset-painikkeet vaihdetaan - -Huomaa: Tämä piilottaa väkisin myös videomainokset" + Luo-painike on vaihdettu Ilmoitukset-painikkeen kanssa Luo- ja Ilmoitukset-painikkeita ei vaihdeta - "Tämän asetuksen poistaminen käytöstä poistaa myös Shorts-mainosten eston käytöstä. - -Jos tämän asetuksen muuttaminen ei tule voimaan, kokeile vaihtaa Incognito-tilaan." + Jos tämän asetuksen muuttaminen ei tule voimaan, yritä vaihtaa Incognito-tilaan. Piilota navigointipainikkeiden tunnisteet Tunnisteet piilotetaan Tunnisteet näytetään + Ota kapeat navigointipainikkeet käyttöön + Navigointipainikkeiden väli on kapea + Navigointipainikkeiden väli on normaali + Ota navigointipalkin animaatiot käyttöön + Navigointisiirtymät ovat animoituja + Navigointisiirtymät eivät ole animoituja Poista läpikuultava tilapalkki käytöstä Tilapalkki on läpinäkymätön Tilapalkki on läpinäkymätön tai läpikuultava - Joillakin laitteilla tämän ominaisuuden käyttöönotto voi muuttaa järjestelmän navigointipalkin läpinäkyväksi. + "Rajoitukset: +• Musta palkki saattaa ilmestyä videosoittimen yläreunaan. +• Joissakin laitteissa tämän ominaisuuden käyttöönotto voi muuttaa järjestelmän navigointipalkin läpinäkyväksi." Poista vaalea läpikuultava palkki käytöstä Vaalean tilan navigointipalkki on läpinäkymätön Vaalean tilan navigointipalkki on läpinäkymätön tai läpikuultava Poista tumma läpikuultava palkki käytöstä Tumman tilan navigointipalkki on läpinäkymätön Tumman tilan navigointipalkki on läpinäkymätön tai läpikuultava + Työkalupalkki + Piilota tai muuta työkalupalkin osia + Piilota Luo-painike + Luo-painike on piilotettu + Luo-painike näytetään + Piilota Ilmoitukset-painike + Ilmoitukset-painike on piilotettu + Ilmoitukset-painike näytetään + Piilota Haku-painike + Hakupainike piilotetaan + Hakupainike näytetään. + Ota leveä hakupalkki käyttöön + Leveä hakupalkki on käytössä + Leveä hakupalkki ei ole käytössä Flyout-valikko @@ -844,6 +922,12 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Piilota Cast-painike Cast-painike piilotetaan Cast-painike näytetään + Piilota Kutista-painike + Kutista-painike on piilotettu + Kutista-painike näytetään + Piilota Koko näyttö -painike + Koko näyttö -painike on piilotettu + Koko näyttö -painike näytetään Piilota soittimen ohjainten tausta Soittimen ohjainten tausta piilotetaan Soittimen ohjainten tausta näytetään @@ -852,9 +936,9 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Painikkeet näytetään - Piilota loppunäytön kortit - Loppunäytön kortit piilotetaan - Loppunäytön kortit näytetään + Piilota loppunäytön kortit + Loppunäytön kortit piilotetaan + Loppunäytön kortit näytetään Poista Tunnelmavalaistus käytöstä kokoruututilassa @@ -879,10 +963,16 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Piilota videoiden pikkukuvien etenemispalkki Videoiden pikkukuvien etenemispalkki piilotetaan Videoiden pikkukuvien etenemispalkki näytetään + Ota käyttöön koko näytön suuri etenemispalkki + Koko näytön etenemispalkki on suuri + Koko näytön etenemispalkki on normaalin kokoinen Shorts-soitin Piilota tai näytä Shorts-soittimen osia + Piilota Shorts-videot kanavasivulta + Piilotettu kanavasivulla + Näytetään kanavasivulla Piilota Shortsit Koti-syötteessä Piilotetaan Koti-syötteessä ja liittyvissä videoissa @@ -894,9 +984,18 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Piilota Shortsit Tilaukset-syötteessä Piilotetaan Tilaukset-syötteessä Näytetään tilaukset-syötteessä + Piilota Shorts-videot videon kuvauksesta + Piilotettu videon kuvauksessa + Näytetään videon kuvauksessa Piilota Shortsit katseluhistoriassa Piilotetaan katseluhistoriassa Näytetään katseluhistoriassa + Piilota tekoäly-painike + Tekoäly-painike on piilotettu + Tekoäly-painike näytetään + Piilota \"Automaattisesti jälkiäänitetty\" -merkintä + Automaattisesti jälkiäänitetty merkintä on piilotettu + Automaattisesti jälkiäänitetty merkintä näytetään Piilota \"Automaattisesti jälkiäänitetty\" -merkintä Automaattisesti jälkiäänitetty merkintä on piilotettu Automaattisesti jälkiäänitetty merkintä näytetään @@ -958,6 +1057,7 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Piilota \"Käytä tätä mallia\" -painike Käytä tätä mallia -painike piilotetaan Käytä tätä mallia -painike näytetään + Piilota Tykkää-painikkeen suihkulähdeanimaatio Tykkää-painikkeen suihkulähdeanimaatio piilotetaan Tykkää-painikkeen suihkulähdeanimaatio näytetään @@ -1000,7 +1100,12 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" -asetu Navigointipalkki piilotetaan Navigointipalkki näytetään - + + Piilota automaattisen toiston esikatselu + Automaattisen toiston esikatselu on piilotettu + Automaattisen toiston esikatselu näytetään + + Piilota loppunäytön ehdotettu video "Loppunäytön ehdotettu video on piilotettu, kun automaattinen toisto ei ole käytössä @@ -1019,9 +1124,9 @@ Asetukset → Toisto → Toista seuraava video automaattisesti" Aikaleima näytetään - Piilota soittimen ponnahdusikkunat - Soittimen ponnahdusikkunat piilotetaan - Soittimen ponnahdusikkunat näytetään + Piilota soittimen ponnahdusikkunat + Soittimen ponnahdusikkunat piilotetaan + Soittimen ponnahdusikkunat näytetään Poistu kokoruututilasta videon lopussa @@ -1091,26 +1196,6 @@ Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa" Asiakkaan hintaraja kohdistettu %d kertaa %d millisekuntia - - Ota leveä hakupalkki käyttöön - Leveä hakupalkki on käytössä - Leveä hakupalkki ei ole käytössä - - - Ota korkealaatuiset pikkukuvat käyttöön - Etenemispalkin pikkukuvat ovat korkealaatuisia - Etenemispalkin pikkukuvat ovat keskilaatuisia - Koko näytön etenemispalkin pikkukuvat ovat korkealaatuisia - Koko näytön etenemispalkin pikkukuvat ovat keskilaatuisia - "Tämä palauttaa myös pienoiskuvat livestriimeissä, joilla ei ole etenemispalkin pikkukuvia. - -Etenemispalkin pikkukuvat käyttävät samaa laatua kuin nykyinen video. - -Tämä ominaisuus toimii parhaiten, kun videon laatu on 720p tai alhaisempi ja kun käytössä on erittäin nopea Internet-yhteys." - Palauta vanhat etenemispalkin pikkukuvat - Etenemispalkin pikkukuvat näkyvät etenemispalkin yläpuolella - Etenemispalkin pikkukuvat näkyvät kokoruututilassa - SponsorBlock Ota SponsorBlock käyttöön @@ -1352,8 +1437,6 @@ Jos tämä poistetaan myöhemmin käytöstä, on suositeltavaa tyhjentää sovel Naamioitava kohdeversio 20.13.41 - Palauta laajennettu videon toimintopalkki 20.05.46 - Palauta transkriptiotoiminto - 19.35.36 - Palauta vanhat Shorts-soittimen kuvakkeet - 19.01.34 - Palauta vanhat navigointikuvakkeet Vaihda aloitussivua @@ -1464,8 +1547,9 @@ Pyyhkäise laajentaaksesi tai sulkeaksesi" Latausruudulla on liukuvärillinen tausta Latausruudulla on yksivärinen tausta Aloitussivun tyyli - Väri - Mustavalkoinen + Pois käytöstä + Väri + Mustavalkoinen Ota mukautettu etenemispalkin väri käyttöön Mukautettu etenemispalkin väri näytetään Alkuperäinen etenemispalkin väri näytetään @@ -1581,6 +1665,9 @@ Tämä voi avata korkealaatuisemmat videot" Poista etsinnän kumoamisen haptiikka käytöstä Etsinnän kumoamisen haptiikka ei ole käytössä Etsinnän kumoamisen haptiikka on käytössä + Poista napautuksen ja pitämisen haptiikka käytöstä + Napautuksen ja pitämisen haptiikka on poistettu käytöstä + Napautuksen ja pitämisen haptiikka on käytössä Poista zoomaushaptiikka käytöstä Zoomaushaptiikka ei ole käytössä Zoomaushaptiikka on käytössä @@ -1676,6 +1763,11 @@ Rajoitukset: Edistynyt videolaatuvalikko näytetään Edistynyttä videolaatuvalikkoa ei näytetä + + Piilota Premium-laatuvaihtoehdot + Premium-laatuvaihtoehdot on piilotettu + Premium-laatuvaihtoehdot näytetään + Ota kelaus liu\'uttamalla käyttöön Kelaus liu\'uttamalla on käytössä @@ -1711,6 +1803,7 @@ AV1-videon toisto saattaa pätkiä." Music + Tietoja Mainokset Yleiset diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 29e52989e5..6dbdd29a6a 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -79,6 +79,9 @@ Second \"item\" text" Ipakita ang history ng paghahanap sa mga setting Ipinapakita ang history ng paghahanap sa mga setting Hindi ipinapakita ang kasaysayan ng paghahanap sa Mga Setting + Huwag paganahin ang matatapang na icon + Hindi matatapang ang mga icon + Matatapang ang mga icon Ipakita ang mga icon ng setting ng ReVanced Ipinapakita ang mga icon ng setting Hindi ipinapakita ang mga icon ng setting @@ -98,23 +101,23 @@ Upang isalin ang mga bagong wika o pagbutihin ang kasalukuyang mga pagsasalin, b and changes made here must also be made there. --> - Mga Setting ng GmsCore - Mga setting para sa GmsCore + GmsCore + Mga setting para sa GmsCore + Suriin ang mga update para sa GmsCore + Ang pagsusuri ng mga update ay pinagana + Hindi pinagana ang pagsuri para sa mga update + Buksan ang Mga Setting ng GmsCore + Mga Setting ng GmsCore - Hindi naka-install ang MicroG GmsCore. I-install ito. - Kailangan ng aksyon - "Ang MicroG GmsCore ay walang pahintulot na tumakbo sa background. - -Sundin ang gabay na \"Huwag patayin ang aking app\" para sa iyong telepono, at ilapat ang mga tagubilin sa iyong pag-install ng MicroG. - -Kinakailangan ito para gumana ang app." - Buksan ang website - "Ang mga pag-optimize ng baterya ng MicroG GmsCore ay dapat na hindi pinagana upang maiwasan ang mga problema. - -Ang pag-disable ng mga pag-optimize ng baterya para sa MicroG ay hindi makakaapekto sa paggamit ng baterya. - -Tapikin ang pindutan ng pagpapatuloy at payagan ang mga pagbabago sa pag-optimize." - Magpatuloy + Hindi naka-install ang MicroG GmsCore. I-install ito. + Kailangan ng aksyon + Nabigo ang pagsuri para sa mga update ng MicroG GmsCore + May bagong bersyon (%1$s) ng MicroG GmsCore na available. Sa kasalukuyan, ginagamit mo ang bersyon %2$s. + "Ang MicroG GmsCore ay walang pahintulot na tumakbo sa background.\n\nSundin ang gabay na \"Huwag patayin ang aking app\" para sa iyong telepono, at ilapat ang mga tagubilin sa iyong pag-install ng MicroG.\n\nKinakailangan ito para gumana ang app." + Buksan ang website + Kanselahin + "Ang mga pag-optimize ng baterya ng MicroG GmsCore ay dapat na hindi pinagana upang maiwasan ang mga problema.\n\nAng pag-disable ng mga pag-optimize ng baterya para sa MicroG ay hindi makakaapekto sa paggamit ng baterya.\n\nTapikin ang pindutan ng pagpapatuloy at payagan ang mga pagbabago sa pag-optimize." + Magpatuloy Pekein ang mga video stream @@ -168,14 +171,11 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan." Na-save ang mga flag Na-reset ang mga flag Nakopya ang mga flag sa clipboard - Mag-log protocol buffer - Kasama sa mga debug log ang proto buffer - Ang mga debug log ay hindi kasama ang proto buffer - "Ang pagpapagana sa setting na ito ay magtatala ng karagdagang data ng layout, kabilang ang on-screen na teksto para sa ilang bahagi ng UI. - -Maaaring makatulong ito na matukoy ang mga bahagi kapag lumilikha ng mga custom na filter. - -Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng iyong IP address." + I-restart ang app para gamitin ang feature na ito + Mag-log protocol buffer + Kasama sa mga debug log ang proto buffer + Ang mga debug log ay hindi kasama ang proto buffer + "Ang pagpapagana sa setting na ito ay magtatala ng karagdagang data ng layout, kabilang ang on-screen na teksto para sa ilang bahagi ng UI.\n\nMaaaring makatulong ito na matukoy ang mga bahagi kapag lumilikha ng mga custom na filter.\n\nGayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng iyong IP address." Linisin ang mga link sa pagbabahagi @@ -217,6 +217,9 @@ Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng Ang pag-playback ng Shorts sa background ay pinagana + Itago ang creator store shelf + Nakatago ang istante ng store ng creator sa ilalim ng video player + Ang shelf ng creator store sa ilalim ng video player ay ipinapakita Itago ang mga album card Nakatago ang mga card ng album Ipinapakita ang mga album card @@ -226,6 +229,9 @@ Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng Itago ang shelf ng chips Nakatago ang istante ng chips Ipinapakita ang istante ng chips + Itago ang seksyon ng mga komento sa ilalim ng mga video sa feed ng Tahanan + Nakatago ang seksyon ng mga komento sa ilalim ng mga video sa feed ng Tahanan + Ipinapakita ang seksyon ng mga komento sa ilalim ng mga video sa feed ng Tahanan Itago ang mga post sa komunidad Nakatago ang mga post sa komunidad Ipinapakita ang mga post sa komunidad @@ -253,14 +259,19 @@ Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng Itago ang mga pinakabagong post Nakatago ang pinakabagong mga post Pinakabagong mga post ay ipinapakita + + Itago ang button na \'Pinakabagong mga video\' + Nakatago ang button ng Pinakabagong mga video + Ipinapakita ang button ng Pinakabagong mga video Itago ang mga mix playlist Nakatago ang mga mix playlist Ang mga mix playlist ay ipinapakita Itago ang seksyon ng mga pelikula Nakatago ang seksyon ng mga pelikula Ipinapakita ang seksyon ng mga pelikula - + Itago ang button na \"Abisuhan ako\" Nakatago ang pindutan na Abisuhan ako Ipinapakita ang pindutan na Abisuhan ako @@ -285,13 +296,16 @@ Gayunpaman, ang pagpapagana nito ay magtatala rin ng ilang data ng user gaya ng Itago ang biswal na espasyo Ang biswal na espasyo ay nakatago Ang biswal na espasyo ay ipinapakita + Itago ang mga resulta ng paghahanap sa web + Nakatago ang mga resulta ng paghahanap sa web + Ipinapakita ang mga resulta ng paghahanap sa web + Itago ang seksyon na \'Maaaring magustuhan mo\' + Nakatago ang seksyon na \'Maaaring magustuhan mo\' + Ipinapakita ang seksyon na \'Maaaring magustuhan mo\' Itago ang mga Doodles ng YouTube Nakatago ang animasyon ng YouTube Doodles sa logo Ang animasyon ng YouTube Doodles sa logo ay ipinapakita - "Ang mga Doodles ng YouTube ay ipinapakita ng ilang araw bawat taon. - -Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang setting na ito ng pagtatago ay naka-on, kung gayon ang filter bar sa ibaba ng search bar ay itatago rin." Itago ang channel bar Nakatago ang channel bar Ipinapakita ang channel bar @@ -308,10 +322,15 @@ Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang settin Nakatago ang mga panel ng impormasyon Ang mga panel ng impormasyon ay ipinapakita + This button usually appears in the video player for certain videos. --> Itago ang button na Sumali Nakatago ang pindutan na Sumali Ipinapakita ang pindutan na Sumali + + Itago ang button na \'Live chat replay\' + Nakatago ang button ng live chat replay sa overlay ng player + Ipinapakita ang button ng live chat replay sa overlay ng player Itago ang mga medikal na panel Nakatago ang mga medikal na panel Ipinapakita ang mga medikal na panel @@ -327,6 +346,9 @@ Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang settin Itago ang mga naka-time na reaksyon Nakatago ang mga naka-time na reaksyon Ang mga naka-time na reaksyon ay ipinapakita + Itago ang pamagat ng video + Nakatago ang pamagat ng video sa overlay ng player + Ipinapakita ang pamagat ng video sa overlay ng player Itago ang \'Buod ng video na binuo ng AI\' Ang seksyon ng buod ng video na binuo ng AI ay nakatago Ipinapakita ang seksyon ng buod ng video na nabuo ng AI @@ -339,33 +361,62 @@ Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang settin Itago ang Mga Kabanata Nakatago ang seksyon ng mga kabanata Ang seksyon ng mga kabanata ay ipinapakita - Itago ang \'Paano ginawa ang content na ito\' - Nakatago ang seksyon ng Paano ginawa ang content na ito - Ipinapakita ang seksyon ng Paano ginawa ang content na ito - Itago ang mga Puntos ng Hype - Nakatago ang mga Puntos ng Hype - Ipinapakita ang mga Puntos ng Hype + Itago ang \'Pag-unlad ng kurso\' + Nakatago ang seksyon ng pag-unlad ng kurso + Ipinapakita ang seksyon ng pag-unlad ng kurso + Itago ang Galugarin + Nakatago ang mga seksyon ng I-explore ang kursong ito at I-explore ang podcast + Ipinapakita ang mga seksyon ng I-explore ang kursong ito at I-explore ang podcast + Itago ang \'I-explore ang kursong ito\' + Nakatago ang seksyon ng I-explore ang kursong ito + Ipinapakita ang seksyon ng I-explore ang kursong ito + Itago ang \'I-explore ang podcast\' + Nakatago ang seksyon ng I-explore ang podcast + Ipinapakita ang seksyon ng I-explore ang podcast Itago ang \'I-explore ang podcast\' Nakatago ang seksyon ng I-explore ang podcast Ipinapakita ang seksyon ng I-explore ang podcast Itago ang Mga Itinatampok na link Nakatago ang seksyon ng mga itinatampok na link Ipinapakita ang seksyon ng mga itinatampok na link + Itago ang \'Mga itinatampok na lugar\' + Nakatago ang seksyon ng mga itinatampok na lugar + Ipinapakita ang seksyon ng mga itinatampok na lugar Itago ang Mga Itinatampok na Video Nakatago ang seksyon ng mga itinatampok na video Ipinapakita ang seksyon ng mga itinatampok na video + Paganahin ang filter ng feed flyout menu + Naka-enable ang filter ng feed flyout menu + Naka-disable ang filter ng feed flyout menu + Filter ng feed flyout menu + Ilagay ang mga pangalan ng flyout menu na i-filter, isa bawat linya + Itago ang Gaming + Nakatago ang seksyon ng Gaming + Ipinapakita ang seksyon ng Gaming + Itago ang \'Paano ginawa ang content na ito\' + Nakatago ang seksyon ng Paano ginawa ang content na ito + Ipinapakita ang seksyon ng Paano ginawa ang content na ito + Itago ang mga Puntos ng Hype + Nakatago ang mga Puntos ng Hype + Ipinapakita ang mga Puntos ng Hype Itago ang Mga card ng impormasyon Nakatago ang seksyon ng mga card ng impormasyon Ang seksyon ng mga card ng impormasyon ay ipinapakita Itago ang \'Mga pangunahing konsepto\' Nakatago ang seksyon ng Mga pangunahing konsepto Ipinapakita ang seksyon ng Mga pangunahing konsepto + Itago ang Musika + Nakatago ang seksyon ng Musika + Ipinapakita ang seksyon ng Musika Itago ang button na Mag-subscribe Nakatago ang button na Mag-subscribe Ipinapakita ang button na Mag-subscribe Itago ang Transcript Nakatago ang seksyon ng transcript Ipinapakita ang seksyon ng transcript + Itago ang mga Pagsusulit + Nakatago ang seksyon ng mga Pagsusulit + Ipinapakita ang seksyon ng mga Pagsusulit Paglalarawan ng video Itago o ipakita ang mga bahagi ng paglalarawan ng video Bar ng filter @@ -384,6 +435,11 @@ Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang settin Ipinapakita sa history ng panonood Pahina ng Channel Itago o ipakita ang mga bahagi ng pahina ng channel + Paganahin ang filter ng tab ng channel + Naka-enable ang filter ng tab ng channel + Naka-disable ang filter ng tab ng channel + Filter ng tab ng channel + Ilagay ang mga pangalan ng tab ng channel na i-filter, isa bawat linya Itago ang pindutan ng Komunidad Nakatago ang button ng Komunidad @@ -447,15 +503,15 @@ Kung ang isang Doodle ay kasalukuyang ipinapakita sa iyong rehiyon at ang settin Ang bilang ng panonood ay ipinapakita sa feed at mga resulta ng paghahanap "Mga Limitasyon: -• Ang mga Shorts shelves, mga pahina ng channel, at mga resulta ng paghahanap ay maaari pa ring magpakita ng mga bilang ng panonood -• Ang tampok na ito ay hindi gumagana sa automotive form factor" +• Ang mga Shorts shelves, mga pahina ng channel, at mga resulta ng paghahanap ay maaari pa ring magpakita ng mga bilang ng panonood. +• Ang tampok na ito ay hindi gumagana sa automotive form factor." Itago ang oras ng pag-upload Nakatago ang oras ng pag-upload sa feed at mga resulta ng paghahanap Ipinapakita ang oras ng pag-upload sa feed at mga resulta ng paghahanap "Mga Limitasyon: -• Ang mga seksyon ng Shorts, mga pahina ng channel, at mga resulta ng paghahanap ay maaaring magpakita pa rin ng mga oras ng pag-upload -• Hindi gumagana ang feature na ito sa form factor ng sasakyan" +• Ang mga Shorts shelves, mga pahina ng channel, at mga resulta ng paghahanap ay maaari pa ring magpakita ng mga oras ng pag-upload. +• Ang tampok na ito ay hindi gumagana sa automotive form factor." Itago ang nilalaman ng keyword Itago ang paghahanap at feed ng mga video gamit ang mga filter ng keyword Itago ang mga home video sa pamamagitan ng mga keyword @@ -478,7 +534,7 @@ Ang mga salita na may malalaking titik sa gitna ay dapat ipasok gamit ang casing Tungkol sa pag-filter ng keyword "Ang mga resulta ng Home/Subscription/Search ay na-filter upang itago ang nilalamang tumutugma sa mga parirala ng keyword -Mga limitasyon +Mga limitasyon: • Ang mga Shorts ay hindi maaaring itago sa pamamagitan ng pangalan ng channel • Ang ilang mga bahagi ng UI ay maaaring hindi maitago • Ang paghahanap para sa isang keyword ay maaaring walang resulta" @@ -493,19 +549,12 @@ Mga limitasyon Ang keyword ay magtatago ng lahat ng mga video: %s - Itago ang creator store shelf - Nakatago ang istante ng store ng creator sa ilalim ng video player - Ang shelf ng creator store sa ilalim ng video player ay ipinapakita Itago ang banner ng tindahan ng end screen Nakatago ang banner ng store sa end screen Ipinapakita ang banner ng store sa end screen Itago ang mga fullscreen na ad - "Ang mga fullscreen ad ay nakatago - -Ang tampok na ito ay magagamit lamang para sa mga mas lumang device" + Nakatago ang mga fullscreen na ad Ipinapakita ang mga fullscreen na ad - - Gumagana lang ang Itago ang mga fullscreen na ad sa mga mas lumang device Itago ang mga pangkalahatang ad Nakatago ang mga pangkalahatang ad Ipinapakita ang mga pangkalahatang ad @@ -515,6 +564,9 @@ Ang tampok na ito ay magagamit lamang para sa mga mas lumang device" Itago ang may bayad na label ng promosyon Nakatago ang label ng bayad na promosyon Ipinapakita ang may bayad na label ng promosyon + Itago ang mga popup na ad ng player + Nakatago ang mga popup na ad ng player + Ipinapakita ang mga popup na ad ng player Itago ang mga self sponsored card Nakatago ang mga self sponsored card Ipinapakita ang mga self sponsored card @@ -522,23 +574,18 @@ Ang tampok na ito ay magagamit lamang para sa mga mas lumang device" Nakatago ang mga link ng shopping sa description ng video Ang mga link sa pamimili sa paglalarawan ng video ay ipinapakita Itago ang banner na \"Tingnan ang mga produkto\" - Nakatago ang banner na Tingnan ang mga produkto sa overlay ng video - Ipinapakita ang banner na Tingnan ang mga produkto sa overlay ng video - Itago ang mga resulta ng paghahanap sa web - Nakatago ang mga resulta ng paghahanap sa web - Ipinapakita ang mga resulta ng paghahanap sa web - - - Itago ang mga promosyon sa YouTube Premium - Nakatago ang mga promosyon ng YouTube Premium sa ilalim ng video player - Ipinapakita ang mga promosyon sa YouTube Premium sa ilalim ng video player + Nakatago ang banner na Tingnan ang mga produkto sa overlay ng player + Ipinapakita ang banner na Tingnan ang mga produkto sa overlay ng player + Itago ang mga promosyon sa YouTube Premium + Nakatago ang mga promosyon ng YouTube Premium + Ipinapakita ang mga promosyon sa YouTube Premium Itago ang mga video ad Nakatago ang mga video ad Ipinapakita ang mga video ad - + Nakopya ang URL sa clipboard URL na may timestamp na kinopya Ipakita ang pindutan ng URL ng kopya ng video @@ -554,10 +601,10 @@ Ang tampok na ito ay magagamit lamang para sa mga mas lumang device" Ipapakita ang dialog Hindi nito nilalampasan ang paghihigpit sa edad. Awtomatiko lang itong tinatanggap. - - I-disable ang popup na \"Mag-sign in sa TV\" - Hindi pinagana ang popup ng Pag-sign in sa TV - Pinagana ang popup ng Pag-sign in sa TV + + I-disable ang popup na \'Mag-sign in sa TV\' + Hindi pinagana ang popup ng Pag-sign in sa TV + Pinagana ang popup ng Pag-sign in sa TV Huwag paganahin ang paglaktaw ng kabanata sa doble tap @@ -590,10 +637,10 @@ Suriin kung tama ang pangalan ng package at kung naka-install ang app" Naka-disable ang galaw Naka-enable ang galaw - - Paganahin ang pag-tap para maghanap - Naka-enable ang Tap para maghanap - Hindi naka-enable ang pag-tap para maghanap + + Paganahin ang pag-tap para maghanap + Naka-enable ang Tap para maghanap + Hindi naka-enable ang pag-tap para maghanap I-enable ang brightness gesture @@ -674,7 +721,7 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Nakatago ang pindutan ng Mga Komento Ipinapakita ang pindutan ng Mga Komento + This button usually appears on live streamed videos. --> Itago ang Ulat Nakatago ang button ng ulat Ang pindutan ng ulat ay ipinapakita @@ -687,7 +734,7 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Nakatago ang button sa pag-download Ang pindutan ng pag-download ay ipinapakita + This button usually appears on videos uploaded by the logged-in user. --> Itago ang Ingay Nakatago ang hype button Ipinapakita ang Hype button @@ -700,7 +747,7 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Nakatago ang buton ng salamat Ang pindutan ng salamat ay ipinapakita + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Itago ang Tanong Nakatago ang button na Tanong Ipinapakita ang button na Tanong @@ -708,6 +755,7 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Itago ang Clip Nakatago ang clip button Ang pindutan ng clip ay ipinapakita + Maaaring hindi gumana ang pagtatago para sa ilang user account. Itago ang Tindahan Ang pindutan ng Tindahan ay nakatago @@ -717,13 +765,13 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Nakatago ang button ng I-save Napakita ang button ng I-save - + Mga pindutan ng nabigasyon - Itago o baguhin ang mga button sa navigation bar + Itago o baguhin ang mga pindutan ng navigation bar Itago ang Tahanan - Nakatago ang home button - Ipinapakita ang home button + Nakatago ang pindutan ng Home + Nakalabas ang pindutan ng Home Itago ang Shorts Nakatago ang pindutan sa Shorts @@ -741,24 +789,44 @@ Ayusin ang volume sa pamamagitan ng pag-swipe nang patayo sa kanang bahagi ng sc Ipinapakita ang button ng Mga Notification Lumipat ng Gumawa gamit ang Mga Notification - "Ang pindutan ng Lumikha ay pinalitan ng pindutan ng Mga Notification - -Tandaan: Ang pagpapagana nito ay nagtatago rin ng mga ad ng video" + Ang pindutan ng Lumikha ay inilipat gamit ang pindutan ng Mga Notification Ang pindutan ng Lumikha ay hindi inililipat gamit ang pindutan ng Mga Notification - "Kung hindi gagana ang pagpapalit ng setting na ito, subukang lumipat sa Incognito mode." - Itago ang mga label ng navigation button + Kung ang pagbabago sa setting na ito ay walang epekto, subukang lumipat sa Incognito mode. + Itago ang mga label ng pindutan ng navigation Nakatago ang mga label - Ang mga label ay ipinapakita + Nakalabas ang mga label + Paganahin ang makitid na mga pindutan ng nabigasyon + Makitid ang pagitan ng mga pindutan ng nabigasyon + Normal ang pagitan ng mga pindutan ng nabigasyon + Paganahin ang mga animation ng navigation bar + Animated ang mga transition ng nabigasyon + Hindi animated ang mga transition ng nabigasyon Huwag paganahin ang translucent status bar Ang status bar ay opaque Ang status bar ay opaque o translucent - Sa ilang device, ang pagpapagana sa feature na ito ay maaaring magpabago sa navigation bar ng system sa transparent. + "Mga Limitasyon: +• Maaaring lumitaw ang isang itim na bar sa itaas ng video player. +• Sa ilang device, maaaring gawing transparent ng pag-enable sa feature na ito ang navigation bar ng system." Huwag paganahin ang light translucent bar Ang light mode navigation bar ay opaque Ang light mode navigation bar ay opaque o translucent Huwag paganahin ang dark translucent bar Ang dark mode navigation bar ay opaque Ang dark mode navigation bar ay opaque o translucent + Toolbar + Itago o baguhin ang mga bahagi ng toolbar + Itago ang button na Gumawa + Nakatago ang button na Lumikha + Ang pindutan ng Lumikha ay ipinapakita + Itago ang button ng Mga Notification + Nakatago ang button ng Mga Notification + Ipinapakita ang button ng Mga Notification + Itago ang button ng paghahanap + Nakakubli ang button ng paghahanap + Ipinapakita ang button ng paghahanap. + Paganahin ang malawak na search bar + Ang malawak na search bar ay pinagana + Naka-disable ang malawak na search bar Menu ng flyout @@ -833,6 +901,12 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Itago ang Cast button Ang buton ng Cast ay nakatago Nakikita ang cast button + Itago ang button na I-collapse + Nakatago ang button na I-collapse + Ipinapakita ang button na I-collapse + Itago ang button na Fullscreen + Nakatago ang button na Fullscreen + Ipinapakita ang button na Fullscreen Itago ang background ng mga kontrol ng manlalaro Nakatago ang background ng mga kontrol ng manlalaro Ipinapakita ang background ng mga kontrol ng manlalaro @@ -841,9 +915,9 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Ang mga pindutan ay ipinapakita - Itago ang mga end screen card - Nakatago ang mga end screen card - Ipinapakita ang mga end screen card + Itago ang mga end screen card + Nakatago ang mga end screen card + Ipinapakita ang mga end screen card Huwag paganahin ang Ambient mode sa fullscreen @@ -868,10 +942,16 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Itago ang seekbar ng mga thumbnail ng video Ang seekbar ng mga thumbnail ng video ay nakatago Ang seekbar ng mga thumbnail ng video ay ipinapakita + Paganahin ang fullscreen large seekbar + Malaki ang laki ng fullscreen seekbar + Normal ang laki ng fullscreen seekbar Shorts Manlalaro Itago o ipakita ang mga bahagi ng Shorts player + Itago ang Shorts sa pahina ng channel + Nakatago sa pahina ng channel + Ipinapakita sa pahina ng channel Itago ang Shorts sa Home feed Nakatago sa Home feed at mga kaugnay na video @@ -883,9 +963,18 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Itago ang Shorts sa feed ng Mga Subscription Nakatago sa feed ng Mga Subscription Ipinapakita sa feed ng Mga Subscription + Itago ang Shorts sa paglalarawan ng video + Nakatago sa paglalarawan ng video + Ipinapakita sa paglalarawan ng video Itago ang Shorts sa watch history Nakatago sa kasaysayan ng panonood Ipinapakita sa watch history + Itago ang button ng AI + Nakatago ang button ng AI + Ipinapakita ang button ng AI + Itago ang label na \"Naka-auto-dub\" + Nakatago ang label na auto-dubbed + Ipinapakita ang label na auto-dubbed Itago ang label na \"Naka-auto-dub\" Nakatago ang label na auto-dubbed Ipinapakita ang label na auto-dubbed @@ -947,6 +1036,7 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Itago ang button na \"Gamitin ang template na ito\" Nakatago ang button na Gamitin ang template na ito Ipinapakita ang button na Gamitin ang template na ito + Itago ang Like button fountain animation Nakatago ang animation ng \"like button fountain\" Ipinapakita ang animation ng \"like button fountain\" @@ -989,7 +1079,12 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa 'And Nakatago ang navigation bar Ipinapakita ang navigation bar - + + Itago ang autoplay preview + Nakatago ang autoplay preview + Ipinapakita ang autoplay preview + + Itago ang iminungkahing video sa dulo ng screen "Nakatago ang iminungkahing video sa dulo ng screen kapag nakapatay ang autoplay @@ -1008,9 +1103,9 @@ Mga Setting → Pag-playback → I-autoplay ang susunod na video" Ipinapakita ang timestamp - Itago ang mga popup panel ng player - Nakatago ang mga popup panel ng player - Ipinapakita ang mga popup panel ng player + Itago ang mga popup panel ng player + Nakatago ang mga popup panel ng player + Ipinapakita ang mga popup panel ng player Lumabas sa fullscreen mode sa katapusan ng video @@ -1078,24 +1173,6 @@ Limitasyon: Maaaring hindi lumabas ang mga Dislike sa incognito mode" Nakatagpo ng %d beses ang limitasyon sa rate ng kliyente %d millisecond - - Paganahin ang malawak na search bar - Ang malawak na search bar ay pinagana - Naka-disable ang malawak na search bar - - - Paganahin ang mataas na kalidad na mga thumbnail - Mataas ang kalidad ng mga thumbnail ng seekbar - Katamtaman ang kalidad ng mga thumbnail ng seekbar - "Ito ay magpapanumbalik din ng mga thumbnail sa mga livestream na walang mga thumbnail ng seekbar. - -Ang mga thumbnail ng seekbar ay gagamit ng parehong kalidad ng kasalukuyang video. - -Ang tampok na ito ay pinakamahusay na gumagana sa kalidad ng video na 720p o mas mababa at kapag gumagamit ng napakabilis na koneksyon sa internet." - Ibalik ang mga lumang thumbnail ng seekbar - Lalabas ang mga thumbnail ng Seekbar sa itaas ng seekbar - Lalabas ang mga thumbnail ng Seekbar sa fullscreen - I-enable ang SponsorBlock Ang SponsorBlock ay isang crowdsourced system para sa pag-skip ng mga nakakainis na bahagi ng mga video sa YouTube @@ -1332,8 +1409,6 @@ Kung mamaya ay patayin, inirerekumenda na i-clear ang data ng app upang maiwasan Target na bersyon ng Spoof app 20.13.41 - Ibalik ang hindi nakatiklop na video action bar 20.05.46 - Ibalik ang paggana ng transcript - 19.35.36 - Ibalik ang mga lumang icon ng Shorts player - 19.01.34 - Ibalik ang mga lumang icon ng navigation Baguhin ang panimulang pahina @@ -1432,8 +1507,9 @@ Ang \"miniplayer\" ay maaaring i-drag palabas ng screen sa kaliwa o kanan"Ang paglo-load ng screen ay magkakaroon ng gradient na background Ang paglo-load ng screen ay magkakaroon ng solidong background Estilo ng splash screen - Kulay - Itim at puti + Hindi + Kulay + Itim at puti Paganahin ang custom na kulay ng seekbar Ipinapakita ang kulay ng custom na seekbar Ipinapakita ang orihinal na kulay ng seekbar @@ -1533,6 +1609,9 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"Huwag paganahin ang seek undo haptics Hindi pinagana ang seek undo haptics Pinagana ang seek undo haptics + Huwag paganahin ang tap at hold haptics + Hindi pinagana ang tap at hold haptics + Pinagana ang tap at hold haptics Huwag paganahin ang zoom haptics Hindi pinagana ang zoom haptics Pinagana ang zoom haptics @@ -1628,6 +1707,11 @@ Mga Limitasyon: Ipinapakita ang advanced na menu ng kalidad ng video Hindi ipinapakita ang advanced na menu ng kalidad ng video + + Itago ang mga opsyon ng Premium quality + Nakatago ang mga opsyon ng Premium quality + Ipinapakita ang mga opsyon ng Premium quality + Paganahin ang slide para maghanap Naka-enable ang slide to seek @@ -1659,6 +1743,7 @@ Maaaring mag-stutter o mag-drop ng frames ang pag-playback ng video na may AV1." + Tungkol Mga Ad Pangkalahatan diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index 0d728c7083..0e49b798fc 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Afficher l\'historique des recherches dans les paramètres L\'historique des recherches dans les paramètres est affiché L\'historique des recherches dans les paramètres n\'est pas affiché + Désactiver les icônes en gras + Les icônes ne sont pas en gras + Les icônes sont en gras Afficher les icônes des paramètres ReVanced Les icônes des paramètres sont affichées Les icônes des paramètres ne sont pas affichées @@ -101,23 +104,31 @@ Pour traduire l'application en de nouvelles langues ou améliorer les traduction and changes made here must also be made there. --> - Paramètres GmsCore - Paramètres relatifs à GmsCore + GmsCore + Paramètres relatifs à GmsCore + Rechercher les mises à jour de GmsCore + La recherche de mises à jour est activée + La recherche de mises à jour est désactivée + Ouvrir les paramètres GmsCore + Paramètres de GmsCore - MicroG GmsCore n\'est pas installé. Veuillez l’installer. - Action requise - "MicroG GmsCore n'est pas autorisé à s'exécuter en arrière-plan. + Vous devez installer MicroG GmsCore. + Action requise + Échec de la recherche de mises à jour de MicroG GmsCore + Une nouvelle version (%1$s) de MicroG GmsCore est disponible. Actuellement, vous utilisez la version %2$s. + "MicroG GmsCore n'est pas autorisé à s'exécuter en arrière-plan. -Suivez le guide \"Don't kill my app\" pour votre téléphone et appliquez les instructions à votre installation MicroG. +Suivez le guide \"Don't kill my app\" pour votre téléphone et appliquez les instructions à votre installation MicroG. Cette opération est nécessaire au bon fonctionnement de l'application." - Ouvrir le site Web - "Les optimisations de la batterie doivent être désactivées pour MicroG GmsCore afin d'éviter des problèmes. + Ouvrir le site Web + Annuler + "Les optimisations de la batterie doivent être désactivées pour MicroG GmsCore afin d'éviter des problèmes. -Désactiver les optimisations de la batterie pour MicroG n'aura pas d'impact négatif sur l'utilisation de la batterie. +La désactivation des optimisations de la batterie pour MicroG n'aura pas d'impact négatif sur l'utilisation de la batterie. Appuyez sur le bouton Continuer et autorisez les modifications." - Continuer + Continuer Falsifier les flux vidéo @@ -173,10 +184,11 @@ Vous ne serez pas informé des événements inattendus." Flags enregistrés Flags réinitialisés Flags copiés dans le presse-papiers - Journaliser les protobufs - Les journaux de débogage incluent les protocol buffers - Les journaux de débogage n\'incluent pas les protocol buffers - "En activant cette option, des données supplémentaires relatives à la mise en page seront enregistrées, dont le texte à l'écran de certains composants de l'interface utilisateur. + Redémarrez l\'application pour utiliser cette fonctionnalité + Journaliser les protobufs + Les journaux de débogage incluent les protocol buffers + Les journaux de débogage n\'incluent pas les protocol buffers + "En activant cette option, des données supplémentaires relatives à la mise en page seront enregistrées, dont le texte à l'écran de certains composants de l'interface utilisateur. Cela peut aider à identifier les composants lors de la création de filtres personnalisés. @@ -226,6 +238,9 @@ Toutefois, l'activation de cette option entraînera également l'enregistrement La lecture en arrière-plan des Shorts est activée + Masquer l\'étagère de la boutique du créateur + L\'étagère de la boutique du créateur sous le lecteur vidéo est masquée + L\'étagère de la boutique du créateur sous le lecteur vidéo est affichée Masquer les fiches d\'album Les fiches d\'album sont masquées Les fiches d\'album sont affichées @@ -235,6 +250,9 @@ Toutefois, l'activation de cette option entraînera également l'enregistrement Masquer l\'étagère des filtres L\'étagère des filtres est masquée L\'étagère des filtres est affichée + Masquer la section Commentaires sous les vidéos dans le flux Accueil + La section Commentaires sous les vidéos dans le flux Accueil est masquée + La section Commentaires sous les vidéos dans le flux Accueil est affichée Masquer les posts Les posts destinés à la communauté sont masqués Les posts destinés à la communauté sont affichés @@ -262,14 +280,19 @@ Toutefois, l'activation de cette option entraînera également l'enregistrement Masquer les posts récents Les posts récents sont masqués Les posts récents sont affichés + + Masquer le bouton Dernières vidéos + Le bouton Dernières vidéos est masqué + Le bouton Dernières vidéos est affiché Masquer les playlists mix Les playlists mix sont masquées Les playlists mix sont affichées Masquer la section dédiée aux films La section dédiée aux films est masquée La section dédiée aux films est affichée - + Masquer le bouton M\'avertir Le bouton M\'avertir est masqué Le bouton M\'avertir est affiché @@ -294,13 +317,16 @@ Toutefois, l'activation de cette option entraînera également l'enregistrement Masquer l\'espace séparateur L\'espace séparateur est masqué L\'espace séparateur est affiché + Masquer les résultats Web + Les résultats Web sont masqués + Les résultats Web sont affichés + Masquer la section Recommandations + La section Recommandations est masquée + La section Recommandations est affichée Masquer les Doodles YouTube L\'animation Doodles sur le logo YouTube est masquée L\'animation Doodles sur le logo YouTube est affichée - "Les Doodles YouTube sont affichés quelques jours par an. - -Si un Doodle est actuellement affiché dans votre région et que cette option de masquage est activée, la barre des filtres sous la barre de recherche sera également masquée." Masquer la barre de chaîne La barre de chaîne est masquée La barre de chaîne est affichée @@ -317,10 +343,15 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de Les panneaux d\'information sont masqués Les panneaux d\'information sont affichés + This button usually appears in the video player for certain videos. --> Masquer le bouton Rejoindre Le bouton Rejoindre est masqué Le bouton Rejoindre est affiché + + Masquer le bouton \"Replay du chat en direct\" + Le bouton Replay du chat en direct dans l\'incrustation du lecteur est masqué + Le bouton Replay du chat en direct dans l\'incrustation du lecteur est affiché Masquer les panneaux d\'infos médicales Les panneaux d\'infos médicales sont masqués Les panneaux d\'infos médicales sont affichés @@ -336,6 +367,9 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de Masquer les réactions minutées Les réactions minutées sont masquées Les réactions minutées sont affichées + Masquer le titre de la vidéo + Le titre de la vidéo dans l\'overlay du lecteur est masqué + Le titre de la vidéo dans l\'overlay du lecteur est affiché Masquer \"Résumé de la vidéo généré par IA\" La section du résumé de la vidéo généré par IA est masquée La section du résumé de la vidéo généré par IA est affichée @@ -348,33 +382,62 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de Masquer \"Chapitres\" La section Chapitres est masquée La section Chapitres est affichée - Masquer \"Comment ce contenu a été créé\" - La section \"Comment ce contenu a été créé\" est masquée - La section \"Comment ce contenu a été créé\" est affichée - Masquer les points Boost - Les points Boost sont masqués - Les points Boost sont affichés + Masquer \"Progression dans le cours\" + La section Progression dans le cours est masquée + La section Progression dans le cours est affichée + Masquer \"Explorer\" + Les sections Découvrir ce cours et Découvrir le podcast sont masquées + Les sections Découvrir ce cours et Découvrir le podcast sont affichées + Masquer \"Découvrir ce cours\" + La section Découvrir ce cours est masquée + La section Découvrir ce cours est affichée + Masquer \"Découvrir le podcast\" + La section \"Découvrir le podcast\" est masquée + La section \"Découvrir le podcast\" est affichée Masquer \"Découvrir le podcast\" La section \"Découvrir le podcast\" est masquée La section \"Découvrir le podcast\" est affichée Masquer les liens mis en avant La section des liens mis en avant est masquée La section des liens mis en avant est affichée + Masquer \"Lieux mis en avant\" + La section Lieux mis en avant est masquée + La section Lieux mis en avant est affichée Masquer les vidéos mises en avant La section des vidéos mises en avant est masquée La section des vidéos mises en avant est affichée + Activer le filtre des menus déroulants dans les flux + Le filtre des menus déroulants dans les flux est activé + Le filtre des menus déroulants dans les flux est désactivé + Filtre des menus déroulants dans les flux + Saisissez le nom des éléments à filtrer dans le menu déroulant, un par ligne + Masquer \"Jeux vidéo\" + La section Jeux vidéo est masquée + La section Jeux vidéo est affichée + Masquer \"Comment ce contenu a été créé\" + La section \"Comment ce contenu a été créé\" est masquée + La section \"Comment ce contenu a été créé\" est affichée + Masquer les points Boost + Les points Boost sont masqués + Les points Boost sont affichés Masquer \"Fiches info\" La section \"Fiches info\" est masquée La section \"Fiches info\" est affichée Masquer \"Concepts clés\" La section \"Concepts clés\" est masquée La section \"Concepts clés\" est affichée + Masquer \"Musique\" + La section Musique est masquée + La section Musique est affichée Masquer le bouton S\'abonner Le bouton S\'abonner est masqué Le bouton S\'abonner est affiché Masquer \"Transcription\" La section Transcription est masquée La section Transcription est affichée + Masquer \"Quiz\" + La section Quiz est masquée + La section Quiz est affichée Description de la vidéo Masquez ou affichez des éléments dans la description des vidéos Barre des filtres @@ -393,6 +456,11 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de Affichée dans l\'historique des vidéos regardées Page de chaîne Masquez ou affichez des composants des pages de chaîne + Activer le filtre d\'onglets de chaîne + Le filtre d\'onglets de chaîne est activé + Le filtre d\'onglets de chaîne est désactivé + Filtre d\'onglets de chaîne + Saisissez le nom des onglets de chaîne à filtrer, un par ligne Masquer le bouton Communauté Le bouton Communauté est masqué @@ -456,15 +524,15 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de Le nombre de vues est affiché dans le fil d\'actualité et les résultats de recherche "Limitations : -• Les nombres de vues peuvent encore être affichés dans les étagères à Shorts, les pages de chaînes et les résultats de recherche -• Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive" +• Les nombres de vues peuvent encore être affichés dans les étagères à Shorts, les pages de chaînes et les résultats de recherche. +• Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive." Masquer l\'heure de mise en ligne L\'heure de mise en ligne est masquée dans le flux et les résultats de recherche L\'heure de mise en ligne est affichée dans le flux et les résultats de recherche "Limitations : -• Les heures de mise en ligne peuvent encore être affichées dans les étagères à Shorts, les pages de chaînes et les résultats de recherche -• Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive" +• Les heures de mise en ligne peuvent encore être affichées dans les étagères à Shorts, les pages de chaînes et les résultats de recherche. +• Cette fonctionnalité ne fonctionne pas avec le format de mise en page Automotive." Masquer des contenus par mot-clé Filtrez les vidéos par mot-clé dans les recherches et le flux Filtrer les vidéos de l\'accueil par mot-clé @@ -487,7 +555,7 @@ Les mots avec des majuscules au milieu doivent être saisis en respectant la cas À propos du filtrage par mot-clé "Les résultats de recherche, l'accueil et les abonnements sont filtrés pour masquer le contenu correspondant aux mots-clés -Limitations +Limitations : • Les Shorts ne peuvent pas être masqués par nom de chaîne • Impossible de masquer certains composants de l'interface • Rechercher un mot-clé peut ne pas fonctionner" @@ -502,19 +570,12 @@ Limitations Ce mot-clé va masquer toutes les vidéos : %s - Masquer l\'étagère de la boutique du créateur - L\'étagère de la boutique du créateur sous le lecteur vidéo est masquée - L\'étagère de la boutique du créateur sous le lecteur vidéo est affichée Masquer l\'écran de fin de bannière de boutique L\'écran de fin de bannière de boutique est masqué L\'écran de fin de bannière de boutique est affiché Masquer les annonces plein écran - "Les annonces plein écran sont masquées - -Cette fonctionnalité est disponible uniquement pour les appareils anciens" + Les annonces plein écran sont masquées Les annonces plein écran sont affichées - - Masquer les annonces plein écran ne fonctionne que sur les appareils anciens Masquer les annonces générales Les annonces générales sont masquées Les annonces générales sont affichées @@ -524,6 +585,9 @@ Cette fonctionnalité est disponible uniquement pour les appareils anciens"Masquer la bannière de promotion rémunérée La bannière \"Inclut une promotion rémunérée\" est masquée La bannière \"Inclut une promotion rémunérée\" est affichée + Masquer les annonces pop-up du lecteur + Les annonces pop-up du lecteur sont masquées + Les annonces pop-up du lecteur sont affichées Masquer les cartes d\'autopromotion Les cartes d\'autopromotion sont masquées Les cartes d\'autopromotion sont affichées @@ -533,27 +597,22 @@ Cette fonctionnalité est disponible uniquement pour les appareils anciens"Masquer la bannière \"Afficher les produits\" La bannière Afficher les produits dans l\'overlay de la vidéo est masquée La bannière Afficher les produits dans l\'overlay de la vidéo est affichée - Masquer les résultats Web - Les résultats Web sont masqués - Les résultats Web sont affichés - - - Masquer les publicités pour YouTube Premium - Les publicités pour YouTube Premium sous le lecteur vidéo sont masquées - Les publicités pour YouTube Premium sous le lecteur vidéo sont affichées + Masquer les promotions de YouTube Premium + Les promotions de YouTube Premium sont masquées + Les promotions de YouTube Premium sont affichées Masquer les annonces vidéo Les annonces vidéo sont masquées Les annonces vidéo sont affichées - + URL copiée dans le presse-papiers URL avec horodatage copiée Afficher le bouton \"Copier l\'URL de la vidéo\" Le bouton Copier l\'URL de la vidéo est affiché. Appuyez pour copier l\'URL de la vidéo. Appuyez longuement pour copier avec horodatage. Le bouton Copier l\'URL de la vidéo n\'est pas affiché - Afficher un bouton \"Copier URL avec horodatage\" + Afficher le bouton \"Copier l\'URL avec horodatage\" Le bouton Copier l\'URL avec horodatage est affiché. Appuyez pour copier l\'URL de la vidéo avec horodatage. Appuyez longuement pour copier sans horodatage. Le bouton Copier l\'URL avec horodatage n\'est pas affiché @@ -563,10 +622,10 @@ Cette fonctionnalité est disponible uniquement pour les appareils anciens"Le message sera affiché Cette option ne contourne pas la vérification de l\'âge. Elle est juste confirmée automatiquement. - - Désactiver le pop-up \"Connectez-vous à la TV\" - Le pop-up \"Connectez-vous à la TV\" est désactivé - Le pop-up \"Connectez-vous à la TV\" est activé + + Désactiver le pop-up \"Connectez-vous à la TV\" + Le pop-up Connectez-vous à la TV est désactivé + Le pop-up Connectez-vous à la TV est activé Désactiver le double appui pour passer à un chapitre @@ -599,10 +658,10 @@ Vérifiez que le nom de paquet est correct et que l'application est installée." Le geste est désactivé Le geste est activé - - Activer Appuyer pour rechercher - Appuyer pour rechercher est activé - Appuyer pour rechercher est désactivé + + Activer \"Appuyer pour rechercher\" + Appuyer pour rechercher est activé + Appuyer pour rechercher est désactivé Activer le geste de contrôle de la luminosité @@ -683,7 +742,7 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Le bouton Commentaires est masqué Le bouton Commentaires est affiché + This button usually appears on live streamed videos. --> Masquer \"Signaler\" Le bouton Signaler est masqué Le bouton Signaler est affiché @@ -696,7 +755,7 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Le bouton Télécharger est masqué Le bouton Télécharger est affiché + This button usually appears on videos uploaded by the logged-in user. --> Masquer \"Booster\" Le bouton Booster est masqué Le bouton Booster est affiché @@ -709,7 +768,7 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Le bouton Merci est masqué Le bouton Merci est affiché + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Masquer \"Demander\" Le bouton Demander est masqué Le bouton Demander est affiché @@ -717,6 +776,7 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Masquer \"Clip\" Le bouton Clip est masqué Le bouton Clip est affiché + Pour certains comptes utilisateur, il se peut que le bouton ne puisse pas être masqué. Masquer \"Magasin\" Le bouton Magasin est masqué @@ -726,7 +786,7 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Le bouton Enregistrer est masqué Le bouton Enregistrer est affiché - + Boutons de navigation Masquez ou modifiez les boutons dans la barre de navigation @@ -750,26 +810,44 @@ Réglez le volume en balayant verticalement sur le côté droit de l'écran"Le bouton Notifications est affiché Échanger Créer et Notifications - "Le bouton Créer est échangé avec le bouton Notifications - -Remarque : Activer cette option masque également de force les annonces vidéo" + Le bouton Créer est échangé avec le bouton Notifications Le bouton Créer n\'est pas échangé avec le bouton Notifications - "La désactivation de ce paramètre désactivera également le blocage des publicités Shorts. - -Si la modification de ce paramètre ne prend pas effet, essayez de passer en mode navigation privée." - Masquer le nom des boutons de navigation - Les noms sont masqués - Les noms sont affichés + Si la modification de ce paramètre ne prend pas effet, essayez de passer en mode Navigation privée. + Masquer le libellé des boutons de navigation + Les libellés sont masqués + Les libellés sont affichés + Activer les boutons de navigation étroits + L\'espacement entre les boutons de navigation est étroit + L\'espacement entre les boutons de navigation est normal + Activer les animations de la barre de navigation + Les transitions de navigation sont animées + Les transitions de navigation ne sont pas animées Désactiver la barre d\'état translucide La barre d\'état est opaque La barre d\'état est opaque ou translucide - Sur certains appareils, l\'activation de cette fonctionnalité peut rendre la barre de navigation du système transparente. - Désactiver la barre claire translucide + "Limitations : +• Une barre noire peut apparaître en haut du lecteur vidéo. +• Sur certains appareils, l'activation de cette fonctionnalité peut rendre la barre de navigation système transparente." + Désactiver la barre translucide en mode clair La barre de navigation en mode clair est opaque La barre de navigation en mode clair est opaque ou translucide - Désactiver la barre sombre translucide + Désactiver la barre translucide en mode sombre La barre de navigation en mode sombre est opaque La barre de navigation en mode sombre est opaque ou translucide + Barre d\'outils + Masquez ou modifiez les composants de la barre d\'outils + Masquer le bouton Créer + Le bouton Créer est masqué + Le bouton Créer est affiché + Masquer le bouton Notifications + Le bouton Notifications est masqué + Le bouton Notifications est affiché + Masquer le bouton Rechercher + Le bouton Rechercher est masqué + Le bouton Rechercher est affiché. + Activer la barre de recherche élargie + La barre de recherche élargie est activée + La barre de recherche élargie est désactivée Menu déroulant @@ -844,6 +922,12 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Masquer le bouton Caster Le bouton Caster est masqué Le bouton Caster est affiché + Masquer le bouton Réduire + Le bouton Réduire est masqué + Le bouton Réduire est affiché + Masquer le bouton Plein écran + Le bouton Plein écran est masqué + Le bouton Plein écran est affiché Masquer l\'arrière-plan des commandes du lecteur L\'arrière-plan des commandes du lecteur est masqué L\'arrière-plan des commandes du lecteur est affiché @@ -852,9 +936,9 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Les boutons sont affichés - Masquer les écrans de fin au format fiche - Les écrans de fin au format fiche sont masqués - Les écrans de fin au format fiche sont affichés + Masquer les écrans de fin au format fiche + Les écrans de fin au format fiche sont masqués + Les écrans de fin au format fiche sont affichés Désactiver le mode ambiant en plein écran @@ -879,10 +963,16 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Masquer la barre de progression dans la miniature des vidéos La barre de progression dans la miniature des vidéos est masquée La barre de progression dans la miniature des vidéos est affichée + Activer la grande barre de progression en plein écran + La barre de progression en plein écran est de grande taille + La barre de progression en plein écran est de taille normale Lecteur Shorts Masquez ou affichez des composants du lecteur Shorts + Masquer les Shorts sur la page de chaîne + Masqués sur la page de chaîne + Affichés sur la page de chaîne Masquer les Shorts dans le flux Accueil Masqués dans le flux Accueil et dans les vidéos associées @@ -894,9 +984,18 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Masquer les Shorts dans le flux Abonnements Masqués dans le flux Abonnements Affichés dans le flux Abonnements + Masquer les Shorts dans la description des vidéos + Masqués dans la description des vidéos + Affichés dans la description des vidéos Masquer les Shorts dans l\'historique des vidéos regardées Masqués dans l\'historique des vidéos regardées Affichés dans l\'historique des vidéos regardées + Masquer le bouton IA + Le bouton IA est masqué + Le bouton IA est affiché + Masquer le libellé \"Doublée automatiquement\" + Le libellé Doublée automatiquement est masqué + Le libellé Doublée automatiquement est affiché Masquer le libellé \"Doublée automatiquement\" Le libellé Doublée automatiquement est masqué Le libellé Doublée automatiquement est affiché @@ -958,6 +1057,7 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Masquer le bouton \"Utiliser ce modèle\" Le bouton Utiliser ce modèle est masqué Le bouton Utiliser ce modèle est affiché + Masquer l\'animation de fontaine du bouton J\'aime L\'animation de fontaine du bouton J\'aime est masquée L\'animation de fontaine du bouton J\'aime est affichée @@ -1000,11 +1100,16 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur La barre de navigation est masquée La barre de navigation est affichée - + + Masquer l\'aperçu de lecture automatique + L\'aperçu de lecture automatique est masqué + L\'aperçu de lecture automatique est affiché + + Masquer l\'écran de fin suggérant une vidéo "L'écran de fin suggérant une vidéo est masqué lorsque la lecture automatique est désactivée -La lecture automatique peut être modifiée dans les paramètres de YouTube : +La lecture automatique peut être modifiée dans les paramètres de YouTube : Paramètres → Lecture → Lecture automatique de la vidéo suivante" L\'écran de fin suggérant une vidéo est affiché @@ -1019,9 +1124,9 @@ Paramètres → Lecture → Lecture automatique de la vidéo suivante" Le temps écoulé et la durée totale sont affichés - Masquer les panneaux pop-up du lecteur - Les panneaux pop-up du lecteur sont masqués - Les panneaux pop-up du lecteur sont affichés + Masquer les panneaux pop-up du lecteur + Les panneaux pop-up du lecteur sont masqués + Les panneaux pop-up du lecteur sont affichés Sortir du mode plein écran à la fin de la vidéo @@ -1091,26 +1196,6 @@ Limitation : Il se peut que les \"Je n'aime pas\" n'apparaissent pas en mode na Limite de requêtes appliquée %d fois au client %d millisecondes - - Activer la barre de recherche élargie - La barre de recherche élargie est activée - La barre de recherche élargie est désactivée - - - Activer les miniatures haute qualité - Les miniatures de la barre de progression sont en haute qualité - Les miniatures de la barre de progression sont en qualité moyenne - Les miniatures plein écran de la barre de progression sont en haute qualité - Les miniatures plein écran de la barre de progression sont en qualité moyenne - "Cela restaurera également les miniatures sur les diffusions en direct, qui ne sont normalement pas dotées de miniatures de barre de progression. - -La qualité des miniatures de la barre de progression sera identique à la qualité de la vidéo. - -Cette fonctionnalité fonctionne de manière optimale avec une qualité vidéo de 720p ou inférieur et lorsque votre connexion Internet est très rapide." - Restaurer les anciennes miniatures de la barre de progression - Les miniatures de la barre de progression apparaîtront au-dessus de la barre - Les miniatures de la barre de progression apparaîtront en plein écran - SponsorBlock Activer SponsorBlock @@ -1351,8 +1436,6 @@ Si désactivé ultérieurement, il est recommandé d'effacer les données de l'a Version cible 20.13.41 - Restaurer la barre d\'actions vidéo non réduite 20.05.46 - Restaurer la fonctionnalité de transcription - 19.35.36 - Restaurer les anciennes icônes du lecteur Shorts - 19.01.34 - Restaurer les anciennes icônes de navigation Modifier la page de démarrage @@ -1463,8 +1546,9 @@ Balayez pour développer ou fermer" Le fond de l\'écran de chargement sera un dégradé de couleurs Le fond de l\'écran de chargement sera une couleur unie Style de l\'écran de lancement - Couleur  - Noir et blanc + Désactivée + Couleur  + Noir et blanc Personnaliser la couleur de la barre de progression La couleur de la barre de progression est personnalisée La couleur originale de la barre de progression est affichée @@ -1580,6 +1664,9 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures"Désactiver le retour haptique d\'annulation de la recherche Le retour haptique d\'annulation de la recherche est désactivé Le retour haptique d\'annulation de la recherche est activé + Désactiver le retour haptique d\'appui long + Le retour haptique d\'appui long est désactivé + Le retour haptique d\'appui long est activé Désactiver le retour haptique des actions de zoom Le retour haptique du zoom est désactivé Le retour haptique du zoom est activé @@ -1675,6 +1762,11 @@ Limitations : Le menu de qualité vidéo avancé est affiché Le menu de qualité vidéo avancé n\'est pas affiché + + Masquer les options de qualité Premium + Les options de qualité Premium sont masquées + Les options de qualité Premium sont affichées + Activer Glisser pour rechercher Glisser pour rechercher est activé @@ -1710,6 +1802,7 @@ La lecture vidéo avec AV1 peut être saccadée et des images peuvent être perd Music + À propos Annonces Général diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index 4713c439c1..569faafd9d 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -18,1269 +18,1354 @@ Second \"item\" text" --> - - - Ainm an aip - - Saincheaptha - Deilbhín aip - Bunaidh - ReVanced - - ReVanced Íosmhéid - ReVanced scálaithe - - Saincheaptha - - - Theip ar sheiceálacha - Oscailt láithreán gréasáin oifigiúil - Déan neamhaird de - <h5>Ní cosúil gur tusa a rinne paiste ar an aip seo.</h5><br>B’fhéidir nach bhfeidhmeoidh an aip seo i gceart, <b>agus d’fhéadfadh sé a bheith díobhálach nó fiú contúirteach le húsáid</b>< br><br>.Tugann na seiceálacha seo le fios go bhfuil an aip seo patáilte roimh ré nó gur thángthas uirthi ó dhuine eile:<br><br><small>%1$s</small><br> <b>Moltar go láidir duit an aip seo a dhíshuiteáil agus í a phaisteáil leat féin</b> chun a chinntiú go bhfuil tú ag úsáid aip bailíochtaithe agus slán.<p><br>Mura ndéanann tú aird ar an rabhadh seo, ní thaispeánfar é ach faoi dhó. - Paisteáilte ar ghléas eile - Gan a bheith suiteáilte ag ReVanced Manager - Paisteáilte níos mó ná 10 nóiméad ó shin - Paisteáilte %s lá ó shin - Tá dáta tógála APK truaillithe - - - Fógra ReVanced - Níl do stair faire á sábháil.<br><br>Is é is dóichí gur seachfhreastalaí fógraí DNS nó seachfhreastalaí líonra is cúis leis seo.<br><br> Chun é seo a réiteach, déan liosta bán <b>s.youtube.com</b> nó gach seachfhreastalaí DNS a mhúchadh. - Ná taispeáin arís - - - Socruithe - ReVanced - An bhfuil tú cinnte gur mhaith leat dul ar aghaidh? - Sábháil - Athshocraigh - Athshocraigh dath - Dath neamhbhailí - Atosú ag teastáil - Atosaigh an aip chun go mbeidh an t-athrú seo i bhfeidhm. - Atosaigh - Iompórtáil - Cóipeáil - Athshocraigh socruithe ReVanced go réamhshocrú - Iompórtáladh %d socruithe - Theip ar allmhairiú: %s - Cuardaigh socruithe - Ní bhfuarthas aon toradh ar \'%s\' - Bain triail as eochairfhocal eile - Cuardaigh le déanaí - Bain as stair an chuardaigh? - Glan stair chuardaigh - An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? - Leideanna Cuardaigh - "• Tapáil cosán chun nascleanúint a dhéanamh chuige + + + Ainm an aip + + Saincheaptha + Deilbhín aip + Bunaidh + ReVanced + + ReVanced Íosmhéid + ReVanced scálaithe + + Saincheaptha + + + Theip ar sheiceálacha + Oscailt láithreán gréasáin oifigiúil + Déan neamhaird de + <h5>Ní cosúil gur tusa a rinne paiste ar an aip seo.</h5><br>B’fhéidir nach bhfeidhmeoidh an aip seo i gceart, <b>agus d’fhéadfadh sé a bheith díobhálach nó fiú contúirteach le húsáid</b>< br><br>.Tugann na seiceálacha seo le fios go bhfuil an aip seo patáilte roimh ré nó gur thángthas uirthi ó dhuine eile:<br><br><small>%1$s</small><br> <b>Moltar go láidir duit an aip seo a dhíshuiteáil agus í a phaisteáil leat féin</b> chun a chinntiú go bhfuil tú ag úsáid aip bailíochtaithe agus slán.<p><br>Mura ndéanann tú aird ar an rabhadh seo, ní thaispeánfar é ach faoi dhó. + Paisteáilte ar ghléas eile + Gan a bheith suiteáilte ag ReVanced Manager + Paisteáilte níos mó ná 10 nóiméad ó shin + Paisteáilte %s lá ó shin + Tá dáta tógála APK truaillithe + + + Fógra ReVanced + Níl do stair faire á sábháil.<br><br>Is é is dóichí gur seachfhreastalaí fógraí DNS nó seachfhreastalaí líonra is cúis leis seo.<br><br> Chun é seo a réiteach, déan liosta bán <b>s.youtube.com</b> nó gach seachfhreastalaí DNS a mhúchadh. + Ná taispeáin arís + + + Socruithe + ReVanced + An bhfuil tú cinnte gur mhaith leat dul ar aghaidh? + Sábháil + Athshocraigh + Athshocraigh dath + Dath neamhbhailí + Atosú ag teastáil + Atosaigh an aip chun go mbeidh an t-athrú seo i bhfeidhm. + Atosaigh + Iompórtáil + Cóipeáil + Athshocraigh socruithe ReVanced go réamhshocrú + Iompórtáladh %d socruithe + Theip ar allmhairiú: %s + Cuardaigh socruithe + Ní bhfuarthas aon toradh ar \'%s\' + Bain triail as eochairfhocal eile + Cuardaigh le déanaí + Bain as stair an chuardaigh? + Glan stair chuardaigh + An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? + Leideanna Cuardaigh + "• Tapáil cosán chun nascleanúint a dhéanamh chuige • Brúigh socrú ar feadh i bhfad chun nascleanúint a dhéanamh chuige • Brúigh Iontráil chun fiosrúchán cuardaigh a shábháil sa stair • Ní dhéanann an cuardach aon aird ar cháslitreacha ná ar phoncaíocht • Feictear socruithe tuismitheora os cionn socruithe linbh atá díchumasaithe" - Tá stair an chuardaigh folamh - Chun stair an chuardaigh a shábháil, clóscríobh iarratas cuardaigh agus brúigh Iontráil - Taispeáin stair cuardaigh na socruithe - Taispeántar stair cuardaigh na socruithe - Ní thaispeántar stair chuardaigh na socruithe - Taispeáin deilbhíní socruithe ReVanced - Taispeántar deilbhíní socruithe - Ní thaispeántar deilbhíní socraithe - Teanga ReVanced - "D'fhéadfadh aistriúcháin do roinnt teangacha a bheith ar iarraidh nó mí-iomlán. + Tá stair an chuardaigh folamh + Chun stair an chuardaigh a shábháil, clóscríobh iarratas cuardaigh agus brúigh Iontráil + Taispeáin stair cuardaigh na socruithe + Taispeántar stair cuardaigh na socruithe + Ní thaispeántar stair chuardaigh na socruithe + Díchumasaigh deilbhíní troma + Níl na deilbhíní troma + Tá na deilbhíní troma + Taispeáin deilbhíní socruithe ReVanced + Taispeántar deilbhíní socruithe + Ní thaispeántar deilbhíní socraithe + Teanga ReVanced + "D'fhéadfadh aistriúcháin do roinnt teangacha a bheith ar iarraidh nó mí-iomlán. Chun teangacha nua a aistriú nó chun na haistriúcháin atá ann cheana a fheabhsú, tabhair cuairt ar translate.revanced.app" - Teanga aip - Iompórtáil / Easpórtáil - Iompórtáil / Easpórtáil socruithe ReVanced - - Tá tú ag baint úsáide as leagan <i>%s</i> ReVanced Patches - Nóta - Is réamh-eisiúint é an leagan seo agus d\'fhéadfadh fadhbanna gan choinne a bheith agat - Naisc oifigiúla - + Tá tú ag baint úsáide as leagan <i>%s</i> ReVanced Patches + Nóta + Is réamh-eisiúint é an leagan seo agus d\'fhéadfadh fadhbanna gan choinne a bheith agat + Naisc oifigiúla + - - - Socruithe GmsCore - Socruithe le haghaidh GmsCore - - Níl MicroG GmsCore suiteáilte. Suiteáil é. - Gníomh riachtanach - "Níl cead ag MicroG GmsCore rith sa chúlra. + + + GmsCore + Socruithe a bhaineann le GmsCore + Seiceáil le haghaidh nuashonruithe GmsCore + Tá seiceáil le haghaidh nuashonruithe cumasaithe + Tá seiceáil le haghaidh nuashonruithe díchumasaithe + Oscail Socruithe GmsCore + Socruithe le haghaidh GmsCore + + Níl MicroG GmsCore suiteáilte. Suiteáil é. + Gníomh riachtanach + Theip ar sheiceáil le haghaidh nuashonruithe MicroG GmsCore + Tá leagan nua (%1$s) de MicroG GmsCore ar fáil. Faoi láthair, tá leagan %2$s á úsáid agat. + "Níl cead ag MicroG GmsCore rith sa chúlra. Lean an treoir \"Ná maraigh mo aip\" do do ghuthán, agus cuir na treoracha i bhfeidhm ar do shuiteáil MicroG. Is gá seo chun go n-oibreoidh an aip." - Oscail láithreán gréasáin - "Caithfidh tú optúimíochtaí ceallraí MicroG GmsCore a dhíchumasú chun fadhbanna a sheachaint. + Oscail láithreán gréasáin + Cealaigh + "Caithfidh tú optúimíochtaí ceallraí MicroG GmsCore a dhíchumasú chun fadhbanna a sheachaint. Ní chuirfidh díghníomhachtú optúimíochtaí ceallraí do MicroG isteach ar úsáid ceallraí ar bhealach diúltach. Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta." - Lean ar aghaidh - - - Sruthanna físe bréige - Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc - Sruthanna físe bréige - Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc - Sruthanna físe bréige - "Déantar sruthanna físe a bhréagnú + Lean ar aghaidh + + + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + "Déantar sruthanna físe a bhréagnú Mura bhfuil tú i d’úsáideoir YouTube Premium, b’fhéidir nach mbeidh an socrú seo ag teastáil" - "Ní dhéantar sruthanna físeáin a bhréagnú + "Ní dhéantar sruthanna físeáin a bhréagnú Seans nach n-oibreoidh an t-athsheinm" - Má mhúchann tú an socrú seo, d\'fhéadfadh saincheisteanna athsheinm a theacht chun cinn. - Cliant réamhshocraithe - - - Fórsaigh teanga bhunaidh na fuaime - Ag úsáid teanga bhunaidh na fuaime - Ag úsáid fuaim réamhshocraithe - - Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio - - - Dífhabhtú - Cumasaigh nó díchumasaigh roghanna dífhabhtú - Dífhabhtú logáil - Tá logaí dífhabhtaithe cumasaithe - Tá logaí dífhabhtaithe díchumasaithe - Rianta cruach logála - Cuimsíonn logaí dífhabhtaithe rian cruach - Ní chuimsíonn logaí dífhabhtaithe rian cruach - Taispeáin tósta ar earráid ReVanced - Taispeántar tósta má tharlaíonn earráid - Ní thaispeántar tósta má tharlaíonn earráid - "Má mhúchtar tóstaí earráide, folaítear gach fógra earráide ReVanced. + Má mhúchann tú an socrú seo, d\'fhéadfadh saincheisteanna athsheinm a theacht chun cinn. + Cliant réamhshocraithe + + + Fórsaigh teanga bhunaidh na fuaime + Ag úsáid teanga bhunaidh na fuaime + Ag úsáid fuaim réamhshocraithe + + Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio + + + Dífhabhtú + Cumasaigh nó díchumasaigh roghanna dífhabhtú + Dífhabhtú logáil + Tá logaí dífhabhtaithe cumasaithe + Tá logaí dífhabhtaithe díchumasaithe + Rianta cruach logála + Cuimsíonn logaí dífhabhtaithe rian cruach + Ní chuimsíonn logaí dífhabhtaithe rian cruach + Taispeáin tósta ar earráid ReVanced + Taispeántar tósta má tharlaíonn earráid + Ní thaispeántar tósta má tharlaíonn earráid + "Má mhúchtar tóstaí earráide, folaítear gach fógra earráide ReVanced. Ní chuirfear ar an eolas thú faoi aon imeachtaí gan choinne." - Easpórtáil logaí dífhabhtaithe - Cóipeálann sé logaí dífhabhtaithe ReVanced chuig an gearrthaisce - Tá logáil dífhabhtaithe díchumasaithe - Níor aimsíodh aon logaí - Lógaí cóipeáilte - Theip ar logaí a easpórtáil: %s - Glan logaí dífhabhtaithe - Glanann sé gach loga dífhabhtaithe ReVanced stóráilte - Lógaí glanta - Bainisteoir bratacha gnéithe - Bainistigh bratacha gné booléacha - Bratacha gníomhacha (%d) - Bratacha blocáilte (%d) - Cuardaigh bratacha... - Bratacha sábháilte - Bratacha athshocraithe - Bratacha cóipeáilte chuig an ngearrthaisce - Maolán prótacal logála - Cuimsíonn logaí dífhabhtaithe maolán - Ní chuimsíonn logaí dífhabhtaithe maolán proto - "Logálfaidh an socrú seo sonraí breise leagain amach, lena n-áirítear téacs ar an scáileán do chomhpháirteanna UI áirithe. + Easpórtáil logaí dífhabhtaithe + Cóipeálann sé logaí dífhabhtaithe ReVanced chuig an gearrthaisce + Tá logáil dífhabhtaithe díchumasaithe + Níor aimsíodh aon logaí + Lógaí cóipeáilte + Theip ar logaí a easpórtáil: %s + Glan logaí dífhabhtaithe + Glanann sé gach loga dífhabhtaithe ReVanced stóráilte + Lógaí glanta + Bainisteoir bratacha gnéithe + Bainistigh bratacha gné boole + Bratacha gníomhacha (%d) + Bratacha blocáilte (%d) + Cuardaigh bratacha... + Bratacha sábháilte + Bratacha athshocraithe + Bratacha cóipeáilte chuig an ngearrthaisce + Atosaigh an aip chun an ghné seo a úsáid + Maolán prótacal logála + Tá maolán proto sna logaí dífhabhtaithe + Ní chuimsíonn logaí dífhabhtaithe proto-maolán + "Má chumasaíonn tú an socrú seo, logálfar sonraí breise leagain amach, lena n-áirítear téacs ar an scáileán do roinnt comhpháirteanna den Chomhéadan Úsáideora. Is féidir leis seo cabhrú le comhpháirteanna a aithint agus scagairí saincheaptha á gcruthú. -Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shampla do sheoladh IP." - - - Glan na naisc roinnte - Baintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte - Ní bhaintear an paraiméadar fiosrúcháin rianaithe de na naisc roinnte - Athraigh na naisc comhroinnte go youtube.com - Úsáideann naisc chomhroinnte youtube.com - Úsáideann naisc chomhroinnte music.youtube.com - - - Scagaire saincheaptha - Folaigh comhpháirteanna ag baint úsáide as scagairí saincheaptha - Cumasaigh scagaire saincheaptha - Tá scagaire saincheaptha cumasaithe - Tá scagaire saincheaptha míchumasaithe - Scagaire saincheaptha - - Liosta de na teaghráin tógálaí cosáin chomhpháirte le scagadh scartha le líne nua - Scagaire saincheaptha neamhbhailí: %s - - - - - Maidir - Fógraí - Mionsamhlacha malartacha - Fotha - Ginearálta - Seinnteoir - Shorts - Barra Cuardaigh - Rialuithe Svaidhpeála - Return YouTube Dislike - Ilchineálach - Físeán - Athchóirigh sean-roghchláir socruithe - Taispeántar sean-roghchláir socruithe - Ní thaispeántar sean-roghchláir socruithe - - - Díchumasaigh seinnte Cúlra Shorts - Tá seinm chúlra Shorts díchumasaithe - Tá seinm chúlra Shorts cumasaithe - - - Folaigh cártaí albam - Tá cártaí albam i bhfolach - Taispeántar cártaí albam - Folaigh cártaí ealaíontóra - Tá cártaí ealaíontóirí i bhfolach - Taispeántar cártaí ealaíonta - Folaigh seilf sceallóga - Tá seilf scagairí i bhfolach - Taispeántar seilf scagairí - Folaigh postálacha pobail - Tá postálacha pobail i bhfolach - Taispeántar postálacha pobail - Folaigh meirgí dlúth - Tá meirgí dlúth i bhfolach - Taispeántar meirgí dlúth - Folaigh cárta inleathnaithe - Tá cárta insínte faoi fhíseáin i bhfolach - Taispeántar cárta inleathnaithe faoi fhíseáin - Folaigh an cnaipe micreafón ar snámh - Cnaipe micreafóin ar snámh sa chuardach i bhfolach - Taispeántar cnaipe micreafóin ar snámh sa chuardach - Folaigh seilfeanna cothrománacha - "Tá seilfeanna cothrománacha i bhfolach, amhail: +Mar sin féin, má chumasaíonn tú é seo, logálfar roinnt sonraí úsáideora freisin amhail do sheoladh IP." + + + Glanadh naisc chomhroinnte + Baintear paraiméadar fiosrúcháin rianaithe de naisc chomhroinnte + Ní bhaintear paraiméadar fiosrúcháin rianaithe ó naisc chomhroinnte + Athraigh na naisc comhroinnte go youtube.com + Úsáideann naisc chomhroinnte youtube.com + Úsáideann naisc chomhroinnte music.youtube.com + + + Scagaire saincheaptha + Folaigh comhpháirteanna ag baint úsáide as scagairí saincheaptha + Cumasaigh scagaire saincheaptha + Tá scagaire saincheaptha cumasaithe + Tá an scagaire saincheaptha díchumasaithe + Scagaire saincheaptha + + Liosta de na teaghráin tógálaí cosáin chomhpháirte le scagadh scartha le líne nua + Scagaire saincheaptha neamhbhailí: %s + + + + + Maidir + Fógraí + Mionsamhlacha malartacha + Fotha + Ginearálta + Seinnteoir + Shorts + Barra Cuardaigh + Rialuithe Svaidhpeála + Return YouTube Dislike + Ilchineálach + Físeán + Athchóirigh sean-roghchláir socruithe + Taispeántar sean-roghchláir socruithe + Ní thaispeántar sean-roghchláir socruithe + + + Díchumasaigh seinnte Cúlra Shorts + Tá seinm chúlra Shorts díchumasaithe + Tá seinm chúlra Shorts cumasaithe + + + Folaigh seilf siopa an chruthaitheora + Seilf siopa an chruthaitheora faoin imreoir físeáin i bhfolach + Taispeántar seilf siopa na gcruthaitheoirí faoin seinnteoir físeáin + Folaigh cártaí albam + Tá cártaí albam i bhfolach + Taispeántar cártaí albam + Folaigh cártaí ealaíontóra + Tá cártaí ealaíontóra i bhfolach + Taispeántar cártaí ealaíontóra + Folaigh seilf sceallóga + Tá seilf scagairí i bhfolach + Taispeántar seilf scagairí + Folaigh an chuid tuairimí faoi fhíseáin sa fhotha Baile + Tá an chuid tuairimí faoi fhíseáin sa fhotha Baile i bhfolach + Taispeántar an chuid tuairimí faoi fhíseáin sa fhotha Baile + Folaigh postálacha pobail + Tá postálacha pobail i bhfolach + Taispeántar postálacha pobail + Folaigh meirgí dlúth + Tá meirgí dlúth i bhfolach + Taispeántar meirgí dlúth + Folaigh cárta inleathnaithe + Tá cárta insínte faoi fhíseáin i bhfolach + Taispeántar cárta inleathnaithe faoi fhíseáin + Folaigh an cnaipe micreafón ar snámh + Cnaipe micreafóin ar snámh sa chuardach i bhfolach + Taispeántar cnaipe micreafóin ar snámh sa chuardach + Folaigh seilfeanna cothrománacha + "Tá seilfeanna cothrománacha i bhfolach, amhail: • Nuacht is déanaí • Lean ar aghaidh ag féachaint • Déan iniúchadh ar níos mó cainéal • Is ábhartha • Siopadóireacht • Féach arís air" - Taispeántar seilfeanna cothrománacha - Folaigh seilf íomhá - Tá seilf íomhá i dtorthaí cuardaigh i bhfolach - Taispeántar seilf íomhánna i dtorthaí cuardaigh - Folaigh na poist is déanaí - Tá na poist is déanaí i bhfolach - Taispeántar na poist is déanaí - Folaigh seinmliostaí meascán - Tá seinmliostaí measctha i bhfolach - Taispeántar seinmliostaí measctha - Folaigh rannóg scannán - Tá rannóg na scannán i bhfolach - Taispeántar rannóg na scannán - - Folaigh cnaipe \'Cuir in iúl dom\' - Cnaipe \'Cuir in iúl dom\' i bhfolach - Cnaipe \'Cuir in iúl dom\' taispeánta - Folaigh na heilimintí inseinnte - Tá na heilimintí inseinnte i bhfolach - Taispeántar na heilimintí inseinnte - + Folaigh an cnaipe ‘Físeáin is déanaí’ + Tá cnaipe na bhfíseán is déanaí i bhfolach + Taispeántar cnaipe na bhfíseán is déanaí + Folaigh seinmliostaí meascán + Tá seinmliostaí measctha i bhfolach + Taispeántar seinmliostaí measctha + Folaigh rannóg scannán + Tá rannóg na scannán i bhfolach + Taispeántar rannóg na scannán + + Folaigh cnaipe \'Cuir in iúl dom\' + Cnaipe \'Cuir in iúl dom\' i bhfolach + Cnaipe \'Cuir in iúl dom\' taispeánta + Folaigh na heilimintí inseinnte + Tá na heilimintí inseinnte i bhfolach + Taispeántar na heilimintí inseinnte + - Folaigh an cnaipe \'Taispeáin níos mó\' - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh i bhfolach - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh thaispeánta - Folaigh suirbhéanna - Tá suirbhéanna i bhfolach - Taispeántar suirbhéanna - Folaigh an seilf ticéad - Tá an seilf ticéad i bhfolach - Taispeántar seilf ticéad - - Folaigh lipéid mholtaí físeáin - Tá lipéid \'D\'fhéach daoine freisin ar\' agus \'B\'fhéidir gur mhaith leat freisin\' sna torthaí cuardaigh i bhfolach - Taispeántar lipéid ‘Daoine a d’fhéach freisin’ agus ‘B’fhéidir gur mhaith leat freisin’ i dtorthaí cuardaigh - Folaigh spásaire amhairc - Tá spásaire amhairc i bhfolach - Taispeántar spásaire amhairc - - Folaigh YouTube Doodles - Tá beochan YouTube Doodles ar an lógó i bhfolach - Taispeántar beochan YouTube Doodles ar an lógó - "Taispeántar Doodles ó YouTube cúpla lá gach bliain. - -Má tá Doodle á thaispeáint faoi láthair i do réigiún agus má tá an tsuíomh seo a chumasc, ansin cuirfear an barra scagaire faoin bharra cuardaigh i bhfolach freisin." - Folaigh barra cainéal - Tá an barra Cainéal i bhfolach - Taispeántar barra an chainéil - Folaigh comhartha uisce cainéal - Tá comhartha uisce i bhfolach - Taispeántar comhartha uisce - Folaigh bosca slua-mhaoiniú - Tá bosca slua-mhaoiniú i bhfolach - Taispeántar bosca slua-mhaoiniú - Folaigh boscaí éigeandála - Tá bosca éigeandála i bhfolach - Taispeántar boscaí éigeandála - Folaigh painéil faisnéise - Tá painéil faisnéise i bhfolach - Taispeántar painéil faisnéise - - Folaigh cnaipe Ballraíochta - Tá an cnaipe Glac páirt i bhfolach - Taispeántar an cnaipe Glac páirt - Folaigh painéil leighis - Tá painéil leighis i bhfolach - Taispeántar painéil leighis - Folaigh gníomhartha tapa - Tá gníomhartha tapa sa scáileán iomlán i bhfolach - Taispeántar gníomhartha tapa i lánscáileán - Folaigh físeáin ghaolmhara - Tá físeáin ghaolmhara i ngníomhartha tapa i bhfolach - Taispeántar físeáin ghaolmhara i ngníomhartha tapa - Folaigh treoirlínte síntiúsóirí - Tá treoirlínte pobail síntiúsóirí i bhfolach - Taispeántar treoirlínte pobail do shíntiúsóirí - Folaigh imoibrithe uainithe - Tá imoibrithe uainithe i bhfolach - Taispeántar imoibrithe uainithe - Folaigh \'Achoimre físeáin arna giniúint ag AI\' - Tá an chuid achoimre físe IS-ghinte i bhfolach - Taispeántar an chuid achoimre físe a ghintear ag AI - Folaigh Iarr - Tá an rannán Iarratas i bhfolach - Taispeántar an rannán Iarratas - Folaigh Tréithe - Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach - Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear - Folaigh Caibidlí - Tá an chuid Caibidil i bhfolach - Taispeántar alt na gcaibidlí - Folaigh \'Conas a rinneadh an t-ábhar seo\' - Tá an chuid Conas a rinneadh an t-ábhar seo i bhfolach - Taispeántar an chuid Conas a rinneadh an t-ábhar seo - Folaigh pointí Hype - Tá pointí Hype i bhfolach - Taispeántar pointí Hype - Folaigh \'Déan iniúchadh ar an bpodchraoladh\' - Tá an chuid Déan iniúchadh ar an bpodchraoladh i bhfolach - Taispeántar an chuid Déan iniúchadh ar an bpodchraoladh - Folaigh naisc le feiceáil - Tá an chuid nasc le feiceáil i bhfolach - Taispeántar an chuid nasc le feiceáil - Folaigh físeáin le feiceáil - Tá an chuid físeán le feiceáil i bhfolach - Taispeántar an chuid físeán le feiceáil - Folaigh cártaí eolais - Tá an chuid cártaí faisnéise i bhfolach - Taispeántar rannán cártaí faisnéise - Folaigh \'Príomhchoincheapa\' - Tá an chuid Príomhchoincheapa i bhfolach - Taispeántar an chuid coincheapa lárnacha - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Folaigh Tras-scríbhinn - Tá alt an tras-scríbhinn i bhfolach - Taispeántar alt an tras-scríbhinn - Cur síos físeán - Folaigh nó taispeáin comhpháirteanna cur síos físe - Barra scagaire - Folaigh nó taispeáin an barra scagaire i bhfothaí, físeáin ghaolmhara, torthaí cuardaigh, agus stair féachana - Folaigh i bhfothaí - I bhfolach i bhfothaí - Taispeántar i bhfothaí - Folaigh i bhfíseáin gaolmhara - I bhfolach i bhfíseáin ghaolmhara - Taispeántar i bhfíseáin ghaolmhara - Folaigh i dtorthaí cuardaigh - Folaigh i dtorthaí cuardaigh - Taispeántar i dtorthaí cuardaigh - Folaigh i stair faire - I bhfolach i stair féachana - Taispeántar i stair faire - Leathanach cainéil - Folaigh nó taispeáin comhpháirteanna leathanach cainéil - - Folaigh cnaipe an Phobail - Tá cnaipe an Phobail i bhfolach - Taispeántar cnaipe an Phobail - - Folaigh seilf \'Duitse\' - Tá seilf \'Maidir Leat\' i bhfolach - Tá seilf \'Maidir Leat\' le feiceáil - - Folaigh cnaipe Glac páirt - Tá cnaipe Glac páirt i bhfolach - Taispeántar cnaipe Glac páirt - Folaigh réamhamharc naisc - Tá réamhamharc naisc i bhfolach - Taispeántar réamhamharc naisc - Folaigh seilf na mball - Tá seilf na mball i bhfolach - Taispeántar seilf na gcomhaltaí - - Folaigh cnaipe an tSiopa - Tá cnaipe an tSiopa i bhfolach - Taispeántar cnaipe an tSiopa - - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Tráchtanna - Folaigh nó taispeáin comhpháirteanna na rannóige tráchtanna - Folaigh achoimre comhrá IS - Tá achoimre comhrá IS i bhfolach - Taispeántar achoimre ar chomhrá AI - Folaigh achoimre ar thráchtanna AI - Tá achoimre tráchtanna IS i bhfolach - Taispeántar achoimre ar thráchtanna IS - Folaigh treoirlínte an chainéil - Tá treoirlínte an chainéil i bhfolach - Taispeántar treoirlínte an chainéil - Folaigh ceanntásc \'Tuairimí ag baill \' - Tá ceanntásc na dtuairimí ó chomhaltaí i bhfolach - Taispeántar ceanntásc na dtuairimí ó chomhaltaí - Folaigh roinn tuairimí - Tá an chuid tuairimí i bhfolach - Taispeántar an chuid tuairimí - Folaigh treoirlínte an chomhphobail - Tá treoirlínte an phobail i bhfolach - Taispeántar treoirlínte an phobail - Folaigh an cnaipe \'Cruthaigh Short\' - Tá cnaipe Cruthaigh gearrscéal i bhfolach - Taispeántar cnaipe Cruthaigh gearrscéal - Folaigh cnaipí Emoji agus Stampa Ama - Tá cnaipí Emoji agus Stampa Ama i bhfolach - Taispeántar cnaipí Emoji agus Stampa Ama - Folaigh trácht réamhamharc - Tá trácht réamhamhar i bhfolach - Taispeántar trácht réamhamharc - Folaigh cnaipe Buíochas - Tá cnaipe buíochas i bhfolach - Taispeántar cnaipe buíochas - Folaigh líon radharcanna - Tá líon radharcanna i bhfolach sa fhotha agus sna torthaí cuardaigh - Taispeántar líon radharcanna sa fhotha agus sna torthaí cuardaigh - - "Teorainneacha: -• Is féidir le seilfeanna Shorts, leathanaigh cainéil, agus torthaí cuardaigh líon na radharcanna a thaispeáint fós -• Ní oibríonn an ghné seo le fachtóir foirme feithicleach" - Folaigh am uaslódála - Tá am uaslódála folaithe i bhfotha agus i dtorthaí cuardaigh - Tá am uaslódála le feiceáil i bhfotha agus i dtorthaí cuardaigh - - "Teorainneacha: -• Is féidir le seilfeanna Shorts, leathanaigh chainéal, agus torthaí cuardaigh fós amanna uaslódála a thaispeáint -• Ní oibríonn an ghné seo le fachtóir foirme feithicleach" - Folaigh ábhair eochairfhocal - Folaigh físeáin chuardaigh agus fotha ag baint úsáide as scagairí eochairfhocail - Folaigh físeáin bhaile de réir eochair - Déantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail - Ní dhéantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail - Folaigh torthaí cuardaigh de réir eochairfhocail - Déantar torthaí cuardaigh a scagadh de réir eochairfhocail - Ní dhéantar torthaí cuardaigh a scagadh de réir eochairfhocail - Folaigh físeáin síntiúis de réir eochairfhocail - Déantar físeáin sa chluaisín síntiús a scagadh de réir eochairfhocail - Ní dhéantar físeáin sa chluaisín Síntiúis a scagadh de réir eochairfhocail - Eochairfhocail le cur i bhfolach - + Folaigh lipéid mholtaí físeáin + Tá lipéid \'D\'fhéach daoine freisin ar\' agus \'B\'fhéidir gur mhaith leat freisin\' sna torthaí cuardaigh i bhfolach + Taispeántar lipéid ‘Daoine a d’fhéach freisin’ agus ‘B’fhéidir gur mhaith leat freisin’ i dtorthaí cuardaigh + Folaigh spásaire amhairc + Tá spásaire amhairc i bhfolach + Taispeántar spásaire amhairc + Folaigh torthaí cuardaigh gréasáin + Tá torthaí cuardaigh gréasáin i bhfolach + Taispeántar torthaí cuardaigh gréasáin + Folaigh an rannóg ‘B\'fhéidir gur mhaith leat’ + Tá an rannóg ‘B\'fhéidir gur mhaith leat’ i bhfolach + Taispeántar an rannóg ‘B\'fhéidir gur mhaith leat’ + + Folaigh YouTube Doodles + Tá beochan YouTube Doodles ar an lógó i bhfolach + Taispeántar beochan YouTube Doodles ar an lógó + Folaigh barra cainéal + Tá an barra Cainéal i bhfolach + Taispeántar barra an chainéil + Folaigh comhartha uisce cainéal + Tá comhartha uisce i bhfolach + Taispeántar comhartha uisce + Folaigh bosca slua-mhaoiniú + Tá bosca slua-mhaoiniú i bhfolach + Taispeántar bosca slua-mhaoiniú + Folaigh boscaí éigeandála + Tá bosca éigeandála i bhfolach + Taispeántar boscaí éigeandála + Folaigh painéil faisnéise + Tá painéil faisnéise i bhfolach + Taispeántar painéil faisnéise + + Folaigh an cnaipe Glac páirt + Tá an cnaipe Glac páirt i bhfolach + Taispeántar an cnaipe Glac páirt + + Folaigh an cnaipe ‘Athsheinm comhrá beo’ + Tá cnaipe athsheinm comhrá beo i bhfolach i bhfolach ar an imreoir + Tá cnaipe athsheinm comhrá beo i bhfolach i bhfolach ar an imreoir + Folaigh painéil leighis + Tá painéil leighis i bhfolach + Taispeántar painéil leighis + Folaigh gníomhartha tapa + Tá gníomhartha tapa sa scáileán iomlán i bhfolach + Taispeántar gníomhartha tapa i lánscáileán + Folaigh físeáin ghaolmhara + Tá físeáin ghaolmhara i ngníomhartha tapa i bhfolach + Taispeántar físeáin ghaolmhara i ngníomhartha tapa + Folaigh treoirlínte síntiúsóirí + Tá treoirlínte pobail síntiúsóirí i bhfolach + Taispeántar treoirlínte pobail do shíntiúsóirí + Folaigh imoibrithe uainithe + Tá imoibrithe uainithe i bhfolach + Taispeántar imoibrithe uainithe + Folaigh teideal físeáin + Tá teideal an fhíseáin i bhfolach san fhorleagan seinnteora + Taispeántar teideal an fhíseáin i bhforleagan an imreora + Folaigh \'Achoimre físeáin arna giniúint ag AI\' + Tá an chuid achoimre físe IS-ghinte i bhfolach + Taispeántar an chuid achoimre físe a ghintear ag AI + Folaigh Iarr + Tá an rannán Iarratas i bhfolach + Taispeántar an rannán Iarratas + Folaigh Tréithe + Tá ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear i bhfolach + Taispeántar ailt d\'áiteanna sonracha, Cluichí, Ceol agus Daoine a luaitear + Folaigh Caibidlí + Tá an chuid Caibidil i bhfolach + Taispeántar alt na gcaibidlí + Folaigh ‘Dul chun cinn cúrsa’ + Tá rannóg an dul chun cinn cúrsa i bhfolach + Taispeántar rannóg an dul chun cinn cúrsa + Folaigh Iniúchadh + Tá rannóga Iniúchadh ar an gcúrsa seo agus Déan iniúchadh ar an bpodchraoladh i bhfolach + Taispeántar rannóga Iniúchadh ar an gcúrsa seo agus Déan iniúchadh ar an bpodchraoladh + Folaigh ‘Déan iniúchadh ar an gcúrsa seo’ + Tá rannóg Déan iniúchadh ar an gcúrsa seo i bhfolach + Taispeántar rannóg Déan iniúchadh ar an gcúrsa seo + Folaigh \'Déan iniúchadh ar an bpodchraoladh\' + Tá an chuid Déan iniúchadh ar an bpodchraoladh i bhfolach + Taispeántar an chuid Déan iniúchadh ar an bpodchraoladh + Folaigh \'Déan iniúchadh ar an bpodchraoladh\' + Tá an chuid Déan iniúchadh ar an bpodchraoladh i bhfolach + Taispeántar an chuid Déan iniúchadh ar an bpodchraoladh + Folaigh naisc le feiceáil + Tá an chuid nasc le feiceáil i bhfolach + Taispeántar an chuid nasc le feiceáil + Folaigh ‘Áiteanna faoi Thrácht’ + Tá rannóg na n-áiteanna faoi Thrácht i bhfolach + Taispeántar rannóg na n-áiteanna faoi Thrácht + Folaigh físeáin le feiceáil + Tá an chuid físeán le feiceáil i bhfolach + Taispeántar an chuid físeán le feiceáil + Cumasaigh scagaire an roghchláir aníos fotha + Tá scagaire an roghchláir aníos fotha cumasaithe + Tá scagaire an roghchláir aníos fotha díchumasaithe + Scagaire roghchlár aníos fotha + Cuir isteach ainmneacha an roghchláir aníos chun scagadh a dhéanamh orthu, ceann in aghaidh na líne + Folaigh Cearrbhachas + Tá rannóg an chearrbhachais i bhfolach + Taispeántar rannóg an chearrbhachais + Folaigh \'Conas a rinneadh an t-ábhar seo\' + Tá an chuid Conas a rinneadh an t-ábhar seo i bhfolach + Taispeántar an chuid Conas a rinneadh an t-ábhar seo + Folaigh pointí Hype + Tá pointí Hype i bhfolach + Taispeántar pointí Hype + Folaigh cártaí eolais + Tá an chuid cártaí faisnéise i bhfolach + Taispeántar rannán cártaí faisnéise + Folaigh \'Príomhchoincheapa\' + Tá an chuid Príomhchoincheapa i bhfolach + Taispeántar an chuid coincheapa lárnacha + Folaigh Ceol + Tá rannóg an cheoil i bhfolach + Taispeántar rannóg an cheoil + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Folaigh Tras-scríbhinn + Tá alt an tras-scríbhinn i bhfolach + Taispeántar alt an tras-scríbhinn + Folaigh Tráth na gCeist + Tá rannóg Tráth na gCeist i bhfolach + Taispeántar rannóg Tráth na gCeist + Cur síos físeán + Folaigh nó taispeáin comhpháirteanna cur síos físe + Barra scagaire + Folaigh nó taispeáin an barra scagaire i bhfothaí, físeáin ghaolmhara, torthaí cuardaigh, agus stair féachana + Folaigh i bhfothaí + I bhfolach i bhfothaí + Taispeántar i bhfothaí + Folaigh i bhfíseáin gaolmhara + I bhfolach i bhfíseáin ghaolmhara + Taispeántar i bhfíseáin ghaolmhara + Folaigh i dtorthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeántar i dtorthaí cuardaigh + Folaigh i stair faire + I bhfolach i stair féachana + Taispeántar i stair faire + Leathanach cainéil + Folaigh nó taispeáin comhpháirteanna leathanach cainéil + Cumasaigh scagaire cluaisín cainéil + Tá scagaire cluaisín cainéil cumasaithe + Tá scagaire cluaisín cainéil díchumasaithe + Scagaire cluaisín cainéil + Cuir isteach ainmneacha na gcluaisíní cainéil chun scagadh a dhéanamh orthu, ceann in aghaidh na líne + + Folaigh cnaipe an Phobail + Tá cnaipe an Phobail i bhfolach + Taispeántar cnaipe an Phobail + + Folaigh seilf \'Duitse\' + Tá seilf \'Maidir Leat\' i bhfolach + Tá seilf \'Maidir Leat\' le feiceáil + + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt + Folaigh réamhamharc naisc + Tá réamhamharc naisc i bhfolach + Taispeántar réamhamharc naisc + Folaigh seilf na mball + Tá seilf na mball i bhfolach + Taispeántar seilf na gcomhaltaí + + Folaigh cnaipe an tSiopa + Tá cnaipe an tSiopa i bhfolach + Taispeántar cnaipe an tSiopa + + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Tráchtanna + Folaigh nó taispeáin comhpháirteanna na rannóige tráchtanna + Folaigh achoimre comhrá IS + Tá achoimre comhrá IS i bhfolach + Taispeántar achoimre ar chomhrá AI + Folaigh achoimre ar thráchtanna AI + Tá achoimre tráchtanna IS i bhfolach + Taispeántar achoimre ar thráchtanna IS + Folaigh treoirlínte an chainéil + Tá treoirlínte an chainéil i bhfolach + Taispeántar treoirlínte an chainéil + Folaigh ceanntásc \'Tuairimí ag baill \' + Tá ceanntásc na dtuairimí ó chomhaltaí i bhfolach + Taispeántar ceanntásc na dtuairimí ó chomhaltaí + Folaigh roinn tuairimí + Tá an chuid tuairimí i bhfolach + Taispeántar an chuid tuairimí + Folaigh treoirlínte an chomhphobail + Tá treoirlínte an phobail i bhfolach + Taispeántar treoirlínte an phobail + Folaigh an cnaipe \'Cruthaigh Short\' + Tá cnaipe Cruthaigh gearrscéal i bhfolach + Taispeántar cnaipe Cruthaigh gearrscéal + Folaigh cnaipí Emoji agus Stampa Ama + Tá cnaipí Emoji agus Stampa Ama i bhfolach + Taispeántar cnaipí Emoji agus Stampa Ama + Folaigh trácht réamhamharc + Tá trácht réamhamhar i bhfolach + Taispeántar trácht réamhamharc + Folaigh cnaipe Buíochas + Tá cnaipe buíochas i bhfolach + Taispeántar cnaipe buíochas + Folaigh líon radharcanna + Tá líon radharcanna i bhfolach sa fhotha agus sna torthaí cuardaigh + Taispeántar líon radharcanna sa fhotha agus sna torthaí cuardaigh + + "Teorainneacha: +• Is féidir le seilfeanna Shorts, leathanaigh cainéil, agus torthaí cuardaigh líon na radharcanna a thaispeáint fós. +• Ní oibríonn an ghné seo le fachtóir foirme feithicleach." + Folaigh am uaslódála + Tá am uaslódála folaithe i bhfotha agus i dtorthaí cuardaigh + Tá am uaslódála le feiceáil i bhfotha agus i dtorthaí cuardaigh + + "Teorainneacha: +• Is féidir le seilfeanna Shorts, leathanaigh chainéal, agus torthaí cuardaigh fós amanna uaslódála a thaispeáint. +• Ní oibríonn an ghné seo le fachtóir foirme feithicleach." + Folaigh ábhair eochairfhocal + Folaigh físeáin chuardaigh agus fotha ag baint úsáide as scagairí eochairfhocail + Folaigh físeáin bhaile de réir eochair + Déantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail + Ní dhéantar físeáin sa chluaisín Baile a scagadh de réir eochairfhocail + Folaigh torthaí cuardaigh de réir eochairfhocail + Déantar torthaí cuardaigh a scagadh de réir eochairfhocail + Ní dhéantar torthaí cuardaigh a scagadh de réir eochairfhocail + Folaigh físeáin síntiúis de réir eochairfhocail + Déantar físeáin sa chluaisín síntiús a scagadh de réir eochairfhocail + Ní dhéantar físeáin sa chluaisín Síntiúis a scagadh de réir eochairfhocail + Eochairfhocail le cur i bhfolach + - "Focail agus frásaí le cur i bhfolach, ar leithligh le líne nua + "Focail agus frásaí le cur i bhfolach, ar leithligh le líne nua Is féidir le focail a bheith ina ainmneacha cainéil nó aon fhocal a thaispeántar i dteidil físeán Ní mór focail le litreacha móra sa lár a chur isteach leis an gcású (ie: iPhone, TikTok, LeBlanc)" - Maidir le scagadh eochairfhocal - "Baile/Síntiúis/Déantar torthaí cuardaigh a scagadh chun ábhar a mheaitseálann frásaí eochairfhocail a cheilt + Maidir le scagadh eochairfhocal + "Baile/Síntiúis/Déantar torthaí cuardaigh a scagadh chun ábhar a mheaitseálann frásaí eochairfhocail a cheilt -Teorainneacha +Teorainneacha: • Ní féidir Shorts a chur i bhfolach de réir ainm cainéil • Ní fhéadfar cuid de chomhpháirteanna UI a chur i bhfolach • D'fhéadfadh gan aon torthaí a thaispeáint má chuirtear cuardach ar fhocal eochair" - Meaitseáil focail iomlána - - Má bhaineann tú eochairfhocal/frása le comharthaí athfhriotail dhúbailte, cuirfear cosc ​​ar mheaitseáil pháirteach de theidil físeáin agus ainmneacha cainéal<br><br>Mar shampla,<br><b>\"ai\"</b> ceilteoidh sé an físeán: <b>Conas a oibríonn AI?</b><br>ach ní cheiltfidh sé: <b>Cad is brí le hainm féinig?</b> - - Ní féidir eochairfhocal a úsáid: %s - Cuir luachana leis chun an eochairfhocal a úsáid: %s - Tá dearbhuithe contrártha ag eochairfhocal: %s - Eochairfhocal ró-ghearr, teastaíonn luachana: %s - Folaigh eochairfhocal gach físeán: %s - - - Folaigh seilf siopa an chruthaitheora - Seilf siopa an chruthaitheora faoin imreoir físeáin i bhfolach - Taispeántar seilf siopa na gcruthaitheoirí faoin seinnteoir físeáin - Folaigh brat bhranda siopa scáileáin deiridh - Meirge siopa scáileáin deiridh i bhfolach - Taispeántar meirge siopa scáileáin deiridh - Folaigh fógraí lánscáileáin - "Tá fógraí lána scáileáin i bhfolach - -Níl an ghné seo ar fáil ach do ghléasanna níos sine" - Taispeántar fógraí lánscáileáin - - Ní oibríonn folaigh fógraí lánscáileáin ach le gléasanna níos sine - Folaigh fógraí ginearálta - Tá fógraí ginearálta i bhfolach - Taispeántar fógraí ginearálta - Folaigh meirgí marsantais - Tá meirgí marsantais i bhfolach - Taispeántar meirgí marsantais - Folaigh lipéad chun cinn íoctha - Tá an lipéad promóisin íoctha i bhfolach - Taispeántar lipéad an chur chun cinn íoctha - Folaigh cártaí féin-urraithe - Tá cártaí féin-urraithe i bhfolach - Taispeántar cártaí féin-urraithe - Folaigh naisc siopadóireachta - Naisc siopadóireachta i gcur síos físeáin i bhfolach - Tá naisc siopadóireachta i gcur síos an fhíseáin ar taispeáint - Folaigh meirge táirgí - Tá an meirge féach táirgí i bhfolach sa fhorleagan físe - Taispeántar meirge féach táirgí i bhforleagan físe - Folaigh torthaí cuardaigh gréasáin - Tá torthaí cuardaigh gréasáin i bhfolach - Taispeántar torthaí cuardaigh gréasáin - - - Folaigh ardú céime YouTube Premium - Tá cur chun cinn YouTube Premium faoi seinnteoir físe i bhfolach - Taispeántar ardú céime YouTube Premium faoin seinnteoir físe - - - Folaigh fógraí físe - Tá fógraí físe i bhfolach - Taispeántar fógraí físe - - - URL cóipeáilte chuig gearr - URL le stampa ama cóipeáilte - Taispeáin an cnaipe cóipeála URL an fhíseáin - Taispeántar cnaipe Cóipeáil URL físeáin. Tapáil chun URL an fhíseáin a chóipeáil. Tapáil agus coinnigh síos chun cóipeála leis an stampa ama - Ní thaispeántar cnaipe Cóipeáil URL físeáin - Taispeáin cnaipe URL stampa ama cóipeáil - Taispeántar cnaipe Cóipeáil URL stampa ama. Tapáil chun URL físeáin a chóipeáil le stampa ama. Tapáil agus coinnigh chun cóipe a dhéanamh gan stampa ama - Ní thaispeántar cnaipe Cóipeáil URL stampa ama - - - Bain dialóg rogha féachana - Bainfear dialóg - Taispeánfar dialóg - Ní sheachnaíonn sé seo an srian aoise. Ní ghlacann sé leis go huathoibríoch. - - - Díchumasaigh an aníos ‘Sínigh Isteach sa Teilifís’ - Tá preab aníos sínithe isteach sa teilifís díchumasaithe - Tá preab aníos sínithe isteach sa teilifís cumasaithe - - - Díchumasaigh scipeáil caibidle le sconna dúbailte - Ní féidir léim go dtí an chéad chaibidil eile/roimhe seo a spreagadh le tapáil faoi dhó - Is féidir le sconna dúbailte scipeáil chuig an gcéad chaibidil eile/roimhe seo a spreagadh ó am go chéile - - - Íosluchtaigh seachtracha - Socruithe chun íoslódálaí seachtrach a úsáid - Taispeáin cnaipe íoslódála seachtrach - Taispeántar cnaipe íoslódála sa seinnteoir - Ní thaispeántar cnaipe íoslódála sa seinnteoir - - Sáraigh an cnaipe Íosluchtaigh gníomh - Osclaíonn an cnaipe íoslódála do íoslódálaí seachtrach - Osclaíonn an cnaipe íoslódála an íoslódálaí dúchasach san aip - Ainm pacáiste íoslódálaí - Ainm an phacáiste de d\'aip íoslódálaí seachtrach suiteáilte - Iontráil ainm an phacáiste - Eile - Níl an aip suiteáilte - Níl %s suiteáilte. Suiteáil é le do thoil. - "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" - Ní féidir ainm an phacáiste a fhágáil folamh - - - Díchumasaigh comhartha cuardaigh beacht - Tá gotha ​​cuardaigh chruinn díchumasaithe - Tá gotha ​​cuardaigh chruinn cumasaithe - - - Cumasaigh tapáil chun cuardach a dhéanamh - Tá tapáil chun cuardach cumasaithe - Tá tapáil chun cuardach a dhíchumasaithe - - - Cumasaigh gotha ​​gile - "Tá swipeáil gile lánscáileáin cumasaithe + Meaitseáil focail iomlána + + Má bhaineann tú eochairfhocal/frása le comharthaí athfhriotail dhúbailte, cuirfear cosc ​​ar mheaitseáil pháirteach de theidil físeáin agus ainmneacha cainéal<br><br>Mar shampla,<br><b>\"ai\"</b> ceilteoidh sé an físeán: <b>Conas a oibríonn AI?</b><br>ach ní cheiltfidh sé: <b>Cad is brí le hainm féinig?</b> + + Ní féidir eochairfhocal a úsáid: %s + Cuir luachana leis chun an eochairfhocal a úsáid: %s + Tá dearbhuithe contrártha ag eochairfhocal: %s + Eochairfhocal ró-ghearr, teastaíonn luachana: %s + Folaigh eochairfhocal gach físeán: %s + + + Folaigh brat bhranda siopa scáileáin deiridh + Meirge siopa scáileáin deiridh i bhfolach + Taispeántar meirge siopa scáileáin deiridh + Folaigh fógraí lánscáileáin + Tá fógraí lánscáileáin i bhfolach + Taispeántar fógraí lánscáileáin + Folaigh fógraí ginearálta + Tá fógraí ginearálta i bhfolach + Taispeántar fógraí ginearálta + Folaigh meirgí marsantais + Tá meirgí marsantais i bhfolach + Taispeántar meirgí marsantais + Folaigh lipéad chun cinn íoctha + Tá an lipéad promóisin íoctha i bhfolach + Taispeántar lipéad an chur chun cinn íoctha + Folaigh fógraí preab aníos an imreora + Tá fógraí preab aníos an imreora i bhfolach + Taispeántar fógraí preab aníos an imreora + Folaigh cártaí féin-urraithe + Tá cártaí féin-urraithe i bhfolach + Taispeántar cártaí féin-urraithe + Folaigh naisc siopadóireachta + Naisc siopadóireachta i gcur síos físeáin i bhfolach + Tá naisc siopadóireachta i gcur síos an fhíseáin ar taispeáint + Folaigh meirge táirgí + Tá an meirge féach táirgí i bhforleagan an imreora i bhfolach + Taispeántar an meirge féach táirgí i bhforleagan an imreora + Folaigh ardú céime YouTube Premium + Tá ardú céime YouTube Premium i bhfolach + Taispeántar ardú céime YouTube Premium + + + Folaigh fógraí físe + Tá fógraí físe i bhfolach + Taispeántar fógraí físe + + + URL cóipeáilte chuig gearrthaisce + URL le stampa ama cóipeáilte + Taispeáin an cnaipe cóipeála URL an fhíseáin + Taispeántar cnaipe Cóipeáil URL físeáin. Tapáil chun URL an fhíseáin a chóipeáil. Tapáil agus coinnigh chun cóipeáil leis an stampa ama + Ní thaispeántar cnaipe Cóipeáil URL físeáin + Taispeáin cnaipe URL stampa ama cóipeáil + Taispeántar cnaipe Cóipeáil URL stampa ama. Tapáil chun URL físeáin a chóipeáil le stampa ama. Tapáil agus coinnigh chun cóipeáil a dhéanamh gan stampa ama + Ní thaispeántar cnaipe Cóipeáil URL stampa ama + + + Bain dialóg rogha féachana + Bainfear dialóg + Taispeánfar dialóg + Ní sheachnaíonn sé seo an srian aoise. Ní ghlacann sé leis go huathoibríoch. + + + Díchumasaigh an aníos ‘Sínigh Isteach sa Teilifís’ + Tá aníos sínithe isteach sa teilifís díchumasaithe + Tá aníos sínithe isteach sa teilifís cumasaithe + + + Díchumasaigh scipeáil caibidle le sconna dúbailte + Ní féidir léim go dtí an chéad chaibidil eile/roimhe seo a spreagadh le tapáil faoi dhó + Is féidir le sconna dúbailte scipeáil chuig an gcéad chaibidil eile/roimhe seo a spreagadh ó am go chéile + + + Íosluchtaigh seachtracha + Socruithe chun íoslódálaí seachtrach a úsáid + Taispeáin cnaipe íoslódála seachtrach + Taispeántar cnaipe íoslódála sa seinnteoir + Ní thaispeántar cnaipe íoslódála sa seinnteoir + + Sáraigh an cnaipe Íosluchtaigh gníomh + Osclaíonn an cnaipe íoslódála do íoslódálaí seachtrach + Osclaíonn an cnaipe íoslódála an íoslódálaí dúchasach san aip + Ainm pacáiste íoslódálaí + Ainm an phacáiste de d\'aip íoslódálaí seachtrach suiteáilte + Iontráil ainm an phacáiste + Eile + Níl an aip suiteáilte + Níl %s suiteáilte. Suiteáil é le do thoil. + "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" + Ní féidir ainm an phacáiste a fhágáil folamh + + + Díchumasaigh comhartha cuardaigh beacht + Tá gotha ​​cuardaigh chruinn díchumasaithe + Tá gotha ​​cuardaigh chruinn cumasaithe + + + Cumasaigh tapáil chun cuardach a dhéanamh + Tá tapáil chun cuardach cumasaithe + Tá tapáil chun cuardach díchumasaithe + + + Cumasaigh gotha ​​gile + "Tá swipeáil gile lánscáileáin cumasaithe Coigeartaigh gile trí swipeáil go hingearach ar thaobh clé an scáileáin" - Tá svaidhpeáil gile lánscáileáin díchumasaithe - Cumasaigh gotha ​​toirte - "Tá swipeáil toirte lánscáileáin cumasaithe + Tá svaidhpeáil gile lánscáileáin díchumasaithe + Cumasaigh gotha ​​toirte + "Tá swipeáil toirte lánscáileáin cumasaithe Coigeartaigh an toirt trí swipeáil go hingearach ar thaobh na láimhe deise den scáileán" - Tá swipeáil toirte lánscáileáin díchumasaithe - Cumasaigh gotha ​​brúigh chun svaidhpeáil - Tá brúigh chun svaidhpeáil cumasaithe - Tá brúigh chun svaidhpeáil díchumasaithe - Cumasaigh aiseolas haptic - Tá aiseolas haptic cumasaithe - Tá aiseolas haptic díchumasaithe - Sábháil agus athchóirigh gile - Sábháil agus cuir gile ar ais agus tú ag imeacht nó ag dul isteach i lánscáileán - Ná sábháil agus ná hathchóirigh gile agus tú ag imeacht nó ag dul isteach sa lánscáileán - Cumasaigh gotha ​​gile uathoibríoch - Cumasaíonn tú gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle den ghluaiseacht gile - Ní chumasaítear gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle - Uathoibríoch - Am scoir forleagan svaidhpeála - An méid milleasoicind atá an forleagan le feiceáil - Teimhneacht chúlra forleagan svaidhpeála - Luach teimhneachta idir 0-100 - Teimhneacht svaidhpeála idir 0-100 - Dath gile forleagan svaidhpeála - Dath an bharra dul chun cinn le haghaidh rialuithe gile - Dath toirte forleagan svaidhpeála - Dath an bharra dul chun cinn do rialuithe toirte - Méid téacs forleagan svaidhpeála - Méid an téacs le haghaidh forleagan svaidhpeála idir 1-30 - Caithfidh méid an téacs a bheith idir 1-30 - Tairseach méide svaidhpeála - An méid tairsí le go dtarlóidh svaidhpeáil - Íogaireacht svaidhpeáil toirte - Cé mhéad a athraíonn an toirt in aghaidh an svaidhpeála - Stíl forleagan svaidhpeála - Forleagan cothrománach - Forleagan cothrománach (íosmhéid - barr) - Forleagan cothrománach (íosmhéid - lár) - Forleagan ciorclach - Forleagan ciorclach (íosmhéid) - Forleagan ingearach - Forleagan ingearach (íosmhéid) - Cumasaigh svaidhpeáil chun físeáin a athrú - Athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo - Ní athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo - - - Díchumasaigh fotheidil uathoibríocha - Tá fotheidil uathoibríocha díchumasaithe - Tá fotheidil uathoibríocha cumasaithe - - - Cnaipí gníomhaíochta - Folaigh nó taispeáin cnaipí faoi fhíseáin - Díchumasaigh lonradh na cnaipí Cosúil / Liostáil - Ní bheidh na cnaipe Is maith liom agus Liostáil ag lonrú nuair a luaitear iad - Lonróidh na cnaipe Is maith liom agus Liostáil nuair a luaitear iad - Folaigh Like agus Dislike - Tá cnaipí Like agus Dislike i bhfolach - Taispeántar cnaipí Like agus Dislike - - Folaigh Comhroinn - Tá cnaipe Comhroinn i bhfolach - Taispeántar an cnaipe Comhroinn - - Folaigh Stad fógraí - Tá cnaipe stad fógraí i bhfolach - Taispeántar an cnaipe Stad fógraí - - Folaigh Tráchtanna - Tá an cnaipe tráchtanna i bhfolach - Taispeántar an cnaipe tráchtanna - - Folaigh Tuairisc - Tá an cnaipe tuairisce i bhfolach - Taispeántar an cnaipe tuairisce - - Folaigh Remix - Tá cnaipe Remix i bhfolach - Taispeántar cnaipe Remix - - Folaigh Íoslódáil - Tá an cnaipe íosluchtaithe i bhfolach - Taispeántar cnaipe íoslódáil - - Folaigh Hype - Tá cnaipe an Hype i bhfolach - Taispeántar cnaipe Hype - - Folaigh Cur Chun Cinn - Tá an cnaipe cur chun cinn i bhfolach - Taispeántar an cnaipe cur chun cinn - - Folaigh Buíochas - Tá cnaipe buíochas i bhfolach - Taispeántar cnaipe buíochas - - Folaigh Iarr - Tá an cnaipe Iarr i bhfolach - Taispeántar cnaipe Iarr - - Folaigh Gearrthóg - Tá an cnaipe gearrthóg i bhfolach - Taispeántar cnaipe gearrthóg - - Folaigh Siopa - Tá cnaipe an tSiopa i bhfolach - Taispeántar an cnaipe siopa - - Folaigh Sábháil - Tá cnaipe sábhála i bhfolach - Taispeántar an cnaipe Sábháil - - - Cnaipí nascleanúna - Folaigh nó athraigh cnaipí sa bharra nascleanúna - - Folaigh Baile - Tá cnaipe baile i bhfolach - Taispeántar cnaipe baile - - Folaigh Shorts - Tá cnaipe Shorts i bhfolach - Taispeántar cnaipe Shorts - - Folaigh Cruthaigh - Tá cnaipe Cruthaigh i bhfolach - Taispeántar cnaipe Cruthaigh - - Folaigh Síntiúis - Tá cnaipe síntiús i bhfolach - Taispeántar cnaipe síntiúis - Folaigh Fógraí - Tá cnaipe fógraí i bhfolach - Taispeántar cnaipe fógraí - - Athraigh Cruthaigh le Fógraí - "Cnaipe Cruthaigh athraithe le cnaipe Fógraí - -Nóta: Trí é seo a chumasú, cuirtear fógraí físeáin i bhfolach freisin" - Ní athraítear cnaipe Cruthaigh le cnaipe Fógraí - "Má dhíchumasaíonn tú an socrú seo, díchumasófar bac fógraí Shorts freisin. - -Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur air." - Folaigh lipéid cnaipe nascleanú - Tá lipéid i bhfolach - Taispeántar lipéid - Díchumasaigh barra stádais tréshoilseach - Tá an barra stádais teimhneach - Tá an barra stádais teimhneach nó tréshoilseach - Ar roinnt gléasanna, is féidir leis an ngné seo a chumasú barra nascleanúna an chórais a athrú go trédhearcach. - Díchumasaigh barra tréshoilseach solais - Tá an barra nascleanúna i mód solais teimhneach - Tá barra nascleanúna mód solais teimhneach nó tréshoilseach - Díchumasaigh barra tréshoilseach dorcha - Tá an barra nascleanúna i mód dorcha teimhneach - Tá barra nascleanúna mód dorcha teimhneach nó tréshoilseach - - - Roghchlár Flyout - Folaigh nó taispeáin míreanna roghchlár flyout an imreora - - Folaigh Fotheidil - Tá roghchlár fotheidil i bhfolach - Taispeántar roghchlár fotheidil - - Folaigh Socruithe Breise - Tá roghchlár socruithe breise i bhfolach - Taispeántar roghchlár socruithe breise - - Folaigh lasc ama codlata - Tá an roghchlár lasc ama codlata i bhfolach - Taispeántar roghchlár an lasc ama codlata - - Físeán Lúb Folaigh - Tá roghchlár físe lúb i bhfolach - Taispeántar roghchlár físe lúb - - Folaigh modh comhthimpeallach - Tá roghchlár mód comhthimpeallach i bhfolach - Taispeántar roghchlár mód comhthimpeallach - Folaigh toirt cobhsaí - Taispeántar roghchlár toirte cobhsaí - Tá roghchlár toirte cobhsaí i bhfolach - - Folaigh Cabhair & aiseolas - Cabhair & Tá an roghchlár aiseolais i bhfolach - Taispeántar roghchlár Cabhrach & Aiseolais - - Folaigh luas athsheinm - Tá roghchlár luas athsheinm i bhfolach - Taispeántar roghchlár luas athsheinm - - Folaigh scáileán Glas - Tá roghchlár scáileán glas i bhfolach - Taispeántar roghchlár an scáileáin ghlasála - - Folaigh Éist le YouTube Music - Tá roghchlár Éist le YouTube Music i bhfolach - Taispeántar an roghchlár Éist le YouTube Music - - Folaigh Rian Fuaime - Tá roghchlár rian fuaime i bhfolach - Taispeántar roghchlár rian fuaime - + Folaigh Comhroinn + Tá cnaipe Comhroinn i bhfolach + Taispeántar an cnaipe Comhroinn + + Folaigh Stad fógraí + Tá cnaipe stad fógraí i bhfolach + Taispeántar an cnaipe Stad fógraí + + Folaigh Tráchtanna + Tá an cnaipe tráchtanna i bhfolach + Taispeántar an cnaipe tráchtanna + + Folaigh Tuairisc + Tá an cnaipe tuairisce i bhfolach + Taispeántar an cnaipe tuairisce + + Folaigh Remix + Tá cnaipe Remix i bhfolach + Taispeántar cnaipe Remix + + Folaigh Íoslódáil + Tá an cnaipe íosluchtaithe i bhfolach + Taispeántar cnaipe íoslódáil + + Folaigh Hype + Tá cnaipe an Hype i bhfolach + Taispeántar cnaipe Hype + + Folaigh Cur Chun Cinn + Tá an cnaipe cur chun cinn i bhfolach + Taispeántar an cnaipe cur chun cinn + + Folaigh Buíochas + Tá cnaipe buíochas i bhfolach + Taispeántar cnaipe buíochas + + Folaigh Iarr + Tá an cnaipe Iarr i bhfolach + Taispeántar cnaipe Iarr + + Folaigh Gearrthóg + Tá an cnaipe gearrthóg i bhfolach + Taispeántar cnaipe gearrthóg + B\'fhéidir nach n-oibreoidh an folach do roinnt cuntas úsáideora. + + Folaigh Siopa + Tá cnaipe an tSiopa i bhfolach + Taispeántar an cnaipe siopa + + Folaigh Sábháil + Tá cnaipe sábhála i bhfolach + Taispeántar an cnaipe Sábháil + + + Cnaipí nascleanúna + Folaigh nó athraigh cnaipí sa bharra nascleanúna + + Folaigh Baile + Tá cnaipe Baile i bhfolach + Taispeántar cnaipe Baile + + Folaigh Shorts + Tá cnaipe Shorts i bhfolach + Taispeántar cnaipe Shorts + + Folaigh Cruthaigh + Tá cnaipe Cruthaigh i bhfolach + Taispeántar cnaipe Cruthaigh + + Folaigh Síntiúis + Tá cnaipe Síntiúis i bhfolach + Taispeántar cnaipe Síntiúis + Folaigh Fógraí + Tá cnaipe Fógraí i bhfolach + Taispeántar cnaipe Fógraí + + Athraigh Cruthaigh le Fógraí + Athraítear cnaipe Cruthaigh le cnaipe Fógraí + Ní athraítear cnaipe Cruthaigh le cnaipe Fógraí + Mura dtagann an t-athrú seo i bhfeidhm, bain triail as aistriú go mód Incognito. + Folaigh lipéid cnaipe nascleanúna + Tá lipéid i bhfolach + Taispeántar lipéid + Cumasaigh cnaipí nascleanúna caola + Tá an spásáil idir cnaipí nascleanúna caol + Tá an spásáil idir cnaipí nascleanúna gnáth + Cumasaigh beochana barra nascleanúna + Déantar beochana ar aistrithe nascleanúna + Ní dhéantar beochana ar aistrithe nascleanúna + Díchumasaigh barra stádais tréshoilseach + Tá an barra stádais teimhneach + Tá an barra stádais teimhneach nó tréshoilseach + "Teorainneacha: +• D'fhéadfadh barra dubh a bheith le feiceáil ag barr an imreora físeáin. +• Ar roinnt feistí, is féidir le cumasú na gné seo barra nascleanúna an chórais a athrú go trédhearcach." + Díchumasaigh barra tréshoilseach solais + Tá barra nascleanúna mód solais teimhneach + Tá barra nascleanúna mód solais teimhneach nó tréshoilseach + Díchumasaigh barra tréshoilseach dorcha + Tá barra nascleanúna mód dorcha teimhneach + Tá barra nascleanúna mód dorcha teimhneach nó tréshoilseach + Barra Uirlisí + Folaigh nó athraigh comhpháirteanna an bharra uirlisí + Folaigh cnaipe Cruthaigh + Tá cnaipe Cruthaigh i bhfolach + Taispeántar cnaipe Cruthaigh + Folaigh cnaipe Fógraí + Tá cnaipe Fógraí i bhfolach + Taispeántar cnaipe Fógraí + Folaigh cnaipe Cuardaigh + Tá cnaipe Cuardaigh i bhfolach + Taispeántar cnaipe Cuardaigh. + Cumasaigh barra cuardaigh leathan + Tá barra cuardaigh leathan cumasaithe + Tá an barra cuardaigh leathan díchumasaithe + + + Roghchlár Flyout + Folaigh nó taispeáin míreanna roghchlár flyout an imreora + + Folaigh Fotheidil + Tá roghchlár fotheidil i bhfolach + Taispeántar roghchlár fotheidil + + Folaigh Socruithe Breise + Tá roghchlár socruithe breise i bhfolach + Taispeántar roghchlár socruithe breise + + Folaigh lasc ama codlata + Tá an roghchlár lasc ama codlata i bhfolach + Taispeántar roghchlár an lasc ama codlata + + Físeán Lúb Folaigh + Tá roghchlár físe lúb i bhfolach + Taispeántar roghchlár físe lúb + + Folaigh modh comhthimpeallach + Tá roghchlár mód comhthimpeallach i bhfolach + Taispeántar roghchlár mód comhthimpeallach + Folaigh toirt cobhsaí + Taispeántar roghchlár toirte cobhsaí + Tá roghchlár toirte cobhsaí i bhfolach + + Folaigh Cabhair & aiseolas + Cabhair & Tá an roghchlár aiseolais i bhfolach + Taispeántar roghchlár Cabhrach & Aiseolais + + Folaigh luas athsheinm + Tá roghchlár luas athsheinm i bhfolach + Taispeántar roghchlár luas athsheinm + + Folaigh scáileán Glas + Tá roghchlár scáileán glas i bhfolach + Taispeántar roghchlár an scáileáin ghlasála + + Folaigh Éist le YouTube Music + Tá roghchlár Éist le YouTube Music i bhfolach + Taispeántar an roghchlár Éist le YouTube Music + + Folaigh Rian Fuaime + Tá roghchlár rian fuaime i bhfolach + Taispeántar roghchlár rian fuaime + - "Tá roghchlár an rian fuaime i bhfolach + "Tá roghchlár an rian fuaime i bhfolach Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhréige' go 'Android No SDK'" - - Folaigh Watch i VR - Tá an roghchlár Féach i VR i bhfolach - Taispeántar an roghchlár Féach i VR - Folaigh roghchlár cáilíocht físe - Tá roghchlár cháilíocht na físeáin i bhfolach - Taispeántar roghchlár cáilíochta físe - Folaigh buntásc roghchlár cáilíochta físe - Tá buntásc roghchláir cáilíochta físe i bhfolach - Taispeántar buntásc roghchlár cáilíochta físeáin - - - Folaigh an cnaipe Uath-imirt - Tá an cnaipe uath-sheinm i bhfolach - Taispeántar cnaipe Autoplay - - Folaigh cnaipe fotheidil - Tá cnaipe fotheidil i bhfolach - Taispeántar cnaipe fotheidil - Folaigh cnaipe Cast - Tá cnaipe Cast i bhfolach - Taispeántar cnaipe Cast - Folaigh cúlra rialuithe an imreora - Tá cúlra rialuithe an imreora i bhfolach - Taispeántar cúlra rialuithe an imreora - Folaigh cnaipí Roimhe Seo & Ar Aghaidh - Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach - Taispeántar cnaipí Roimhe Seo & Ar Aghaidh - - - Folaigh cártaí scáileáin deireadh - Tá cártaí scáileáin deiridh i bhfolach - Taispeántar cártaí scáileáin deireadh - - - Díchumasaigh mód comhthimpeallach i lánscáileán - Díchumasaíodh mód comhthimpeallach - Mód comhthimpeallach cumasaithe - - - Folaigh cártaí faisnéise - Tá cártaí faisnéise i bhfolach - Taispeántar cártaí faisnéise - - - Díchumasaigh beochana uimhreacha rollta - Ní bhíonn uimhreacha rollta beoite - Tá uimhreacha rollta beoite - - - Folaigh barra cuardaigh an tseinnteora físeáin - Tá barra cuardaigh seinnteoir físe i bhfolach - Taispeántar barra cuardaigh an t-imreoir físeán - - Folaigh barra cuardaigh mionsamhlacha físeáin - Tá barra cuardaigh mionsamhlacha físeáin i bhfolach - Taispeántar barra cuardaigh mionsamhlacha físe - - - Shorts seinnteoir - Folaigh nó taispeáin comhpháirteanna seinnteora Shorts - - Folaigh Shorts sa fhotha Baile - I bhfolach sa fhotha Baile agus físeáin ghaolmhara - Taispeánta sa fhotha Baile agus físeáin ghaolmhara - Folaigh Shorts i dtorthaí cuardaigh - Folaigh i dtorthaí cuardaigh - Taispeáin i dtorthaí cuardaigh - - Folaigh Shorts sa fhotha Liostálaí - I bhfolach sa fhotha Liostálaí - Taispeánta sa fhotha Liostálaí - Folaigh Shorts i stair féachana - I bhfolach i stair féachana - Taispeántar i stair féachana - Folaigh lipéad ‘Uath-dhúbláilte’ - Tá an lipéad uath-dhúbláilte i bhfolach - Taispeántar an lipéad uath-dhúbláilte - Folaigh cnaipe ‘Ceannaigh Super Thanks’ - Cnaipe Ceannaigh Super Thanks i bhfolach - Taispeántar an cnaipe Ceannaigh Super Thanks - Folaigh cnaipe Éifeacht - Tá cnaipe Éifeacht i bhfolach - Taispeántar cnaipe Éifeacht - Folaigh cnaipe ‘Scáileáin Ghlais’ - Tá cnaipe Scáileáin Ghlais i bhfolach - Taispeántar cnaipe Scáileáin Ghlais - Folaigh cnaipe Hashtag - Tá cnaipe Hashtag i bhfolach - Taispeántar cnaipe hashtag - - Folaigh cnaipe Glac páirt - Tá cnaipe Glac páirt i bhfolach - Taispeántar cnaipe Glac páirt - Folaigh réamhamharc beo - Tá réamhamharc beo i bhfolach - Taispeántar réamhamharc beo - Folaigh lipéad suímh - Tá lipéad suímh i bhfolach - Taispeántar lipéad suímh - Folaigh cnaipe ‘Poist nua’ - Tá cnaipe Poist nua i bhfolach - Taispeántar cnaipe Poist nua - Folaigh cnaipí forleagan ar sos - Tá cnaipí forleagan ar sos i bhfolach - Taispeántar cnaipí forleagan ar sos - Folaigh trácht réamhamhairc - Tá an trácht réamhamhairc i bhfolach - Taispeántar réamhamharc tráchta - Folaigh cnaipe ‘Sábháil Ceoil’ - Tá an cnaipe sábháil ceoil i bhfolach - Taispeántar an cnaipe sábháil ceoil - Folaigh moltaí cuardaigh - Tá moltaí cuardaigh i bhfolach - Taispeántar moltaí cuardaigh - Folaigh cnaipe Siopa - Tá cnaipe siopa i bhfolach - Taispeántar cnaipe siopa - Folaigh greamáin - Tá greamáin i bhfolach - Taispeántar greamáin - Folaigh cnaipe Liostáil - Tá an cnaipe Liostáil i bhfolach - Taispeántar cnaipe Liostáil - Folaigh táirgí clibeáilte - Tá táirgí clibeáilte i bhfolach - Taispeántar táirgí clibeáilte - Folaigh cnaipe Ag Teacht - Tá cnaipe Ag Teacht i bhfolach - Taispeántar an cnaipe Ag Teacht - Folaigh cnaipe ‘Úsáid an fhuaim seo’ - Tá an cnaipe Úsáid an fhuaim seo i bhfolach - Taispeántar an cnaipe Úsáid an fhuaim seo - Folaigh an cnaipe ‘Úsáid an teimpléad seo’ - Tá an cnaipe Úsáid an teimpléid seo i bhfolach - Taispeántar an cnaipe Úsáid an teimpléid seo - Folaigh an cnaipe Is maith liom \'beochan tobair\' - Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach - Taispeántar an cnaipe Is maith liom \'beochan tobair\' - Folaigh cnaipe Is maith liom - Tá an cnaipe Is maith liom i bhfolach - Taispeántar an cnaipe Is maith liom - Folaigh cnaipe Ní maith liom - Tá an cnaipe Ní maith liom i bhfolach - Taispeántar an cnaipe Ní maith liom - Folaigh cnaipe na Tuairimí - Tá an cnaipe tuairimí i bhfolach - Taispeántar cnaipe tuairimí - - Folaigh cnaipe Roinn - Tá cnaipe Roinn i bhfolach - Taispeántar an cnaipe Roinn - - Folaigh cnaipe Athmheasc - Tá cnaipe Athmheasc i bhfolach - Taispeántar cnaipe Athmheasc - Folaigh cnaipe Fuaime - Tá cnaipe fuaime i bhfolach - Taispeántar cnaipe fuaime - Folaigh painéal faisnéise - Tá painéal faisnéise i bhfolach - Taispeántar painéal faisnéise - Folaigh barra cainéal - Tá barra cainéal i bhfolach - Taispeántar barra cainéal - Folaigh teideal físeáin - Teideal físeáin i bhfolach - Taispeántar teideal físeáin - Folaigh lipéad meiteashonraí fuaime - Lipéad meiteashonraí fuaime i bhfolach - Taispeántar Lipéad meiteashonraí fuaime - Folaigh lipéad nasc físeáin - Tá lipéad nasc físeáin i bhfolach - Taispeántar lipéad nasc físeáin - Folaigh barra nascleanúna - Tá barra nascleanúna i bhfolach - Taispeántar barra nascleanúna - - - Folaigh físeán molta deireadh scáileáin - "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta + + Folaigh Watch i VR + Tá an roghchlár Féach i VR i bhfolach + Taispeántar an roghchlár Féach i VR + Folaigh roghchlár cáilíocht físe + Tá roghchlár cháilíocht na físeáin i bhfolach + Taispeántar roghchlár cáilíochta físe + Folaigh buntásc roghchlár cáilíochta físe + Tá buntásc roghchláir cáilíochta físe i bhfolach + Taispeántar buntásc roghchlár cáilíochta físeáin + + + Folaigh an cnaipe Uath-imirt + Tá an cnaipe uath-sheinm i bhfolach + Taispeántar cnaipe Autoplay + + Folaigh cnaipe fotheidil + Tá cnaipe fotheidil i bhfolach + Taispeántar cnaipe fotheidil + Folaigh cnaipe Cast + Tá cnaipe Cast i bhfolach + Taispeántar cnaipe Cast + Folaigh cnaipe Laghdaithe + Tá cnaipe Laghdaithe i bhfolach + Taispeántar cnaipe Laghdaithe + Folaigh cnaipe Lánscáileáin + Tá cnaipe Lánscáileáin i bhfolach + Taispeántar cnaipe Lánscáileáin + Folaigh cúlra rialuithe an imreora + Tá cúlra rialuithe an imreora i bhfolach + Taispeántar cúlra rialuithe an imreora + Folaigh cnaipí Roimhe Seo & Ar Aghaidh + Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach + Taispeántar cnaipí Roimhe Seo & Ar Aghaidh + + + Folaigh cártaí scáileáin deiridh + Tá cártaí scáileáin deiridh i bhfolach + Taispeántar cártaí scáileáin deiridh + + + Díchumasaigh mód comhthimpeallach i lánscáileán + Díchumasaíodh mód comhthimpeallach + Mód comhthimpeallach cumasaithe + + + Folaigh cártaí faisnéise + Tá cártaí faisnéise i bhfolach + Taispeántar cártaí faisnéise + + + Díchumasaigh beochana uimhreacha rollta + Ní bhíonn uimhreacha rollta beoite + Tá uimhreacha rollta beoite + + + Folaigh barra cuardaigh an tseinnteora físeáin + Tá barra cuardaigh seinnteoir físe i bhfolach + Taispeántar barra cuardaigh an t-imreoir físeán + + Folaigh barra cuardaigh mionsamhlacha físeáin + Tá barra cuardaigh mionsamhlacha físeáin i bhfolach + Taispeántar barra cuardaigh mionsamhlacha físe + Cumasaigh barra cuardaigh mór lánscáileáin + Tá barra cuardaigh lánscáileáin de mhéid mór + Tá barra cuardaigh lánscáileáin de mhéid gnáth + + + Shorts seinnteoir + Folaigh nó taispeáin comhpháirteanna seinnteora Shorts + Folaigh Shorts ar leathanach an chainéil + I bhfolach ar leathanach an chainéil + Taispeántar ar leathanach an chainéil + + Folaigh Shorts sa fhotha Baile + I bhfolach sa fhotha Baile agus físeáin ghaolmhara + Taispeánta sa fhotha Baile agus físeáin ghaolmhara + Folaigh Shorts i dtorthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeáin i dtorthaí cuardaigh + + Folaigh Shorts sa fhotha Liostálaí + I bhfolach sa fhotha Liostálaí + Taispeánta sa fhotha Liostálaí + Folaigh Shorts i gcur síos an fhíseáin + I bhfolach i gcur síos an fhíseáin + Taispeántar i gcur síos an fhíseáin + Folaigh Shorts i stair féachana + I bhfolach i stair féachana + Taispeántar i stair féachana + Folaigh cnaipe AI + Tá cnaipe AI i bhfolach + Taispeántar cnaipe AI + Folaigh lipéad ‘Uath-dhúbláilte’ + Tá an lipéad uath-dhúbláilte i bhfolach + Taispeántar an lipéad uath-dhúbláilte + Folaigh lipéad ‘Uath-dhúbláilte’ + Tá an lipéad uath-dhúbláilte i bhfolach + Taispeántar an lipéad uath-dhúbláilte + Folaigh cnaipe ‘Ceannaigh Super Thanks’ + Cnaipe Ceannaigh Super Thanks i bhfolach + Taispeántar an cnaipe Ceannaigh Super Thanks + Folaigh cnaipe Éifeacht + Tá cnaipe Éifeacht i bhfolach + Taispeántar cnaipe Éifeacht + Folaigh cnaipe ‘Scáileáin Ghlais’ + Tá cnaipe Scáileáin Ghlais i bhfolach + Taispeántar cnaipe Scáileáin Ghlais + Folaigh cnaipe Hashtag + Tá cnaipe Hashtag i bhfolach + Taispeántar cnaipe hashtag + + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt + Folaigh réamhamharc beo + Tá réamhamharc beo i bhfolach + Taispeántar réamhamharc beo + Folaigh lipéad suímh + Tá lipéad suímh i bhfolach + Taispeántar lipéad suímh + Folaigh cnaipe ‘Poist nua’ + Tá cnaipe Poist nua i bhfolach + Taispeántar cnaipe Poist nua + Folaigh cnaipí forleagan ar sos + Tá cnaipí forleagan ar sos i bhfolach + Taispeántar cnaipí forleagan ar sos + Folaigh trácht réamhamhairc + Tá an trácht réamhamhairc i bhfolach + Taispeántar réamhamharc tráchta + Folaigh cnaipe ‘Sábháil Ceoil’ + Tá an cnaipe sábháil ceoil i bhfolach + Taispeántar an cnaipe sábháil ceoil + Folaigh moltaí cuardaigh + Tá moltaí cuardaigh i bhfolach + Taispeántar moltaí cuardaigh + Folaigh cnaipe Siopa + Tá cnaipe siopa i bhfolach + Taispeántar cnaipe siopa + Folaigh greamáin + Tá greamáin i bhfolach + Taispeántar greamáin + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil + Folaigh táirgí clibeáilte + Tá táirgí clibeáilte i bhfolach + Taispeántar táirgí clibeáilte + Folaigh cnaipe Ag Teacht + Tá cnaipe Ag Teacht i bhfolach + Taispeántar an cnaipe Ag Teacht + Folaigh cnaipe ‘Úsáid an fhuaim seo’ + Tá an cnaipe Úsáid an fhuaim seo i bhfolach + Taispeántar an cnaipe Úsáid an fhuaim seo + Folaigh an cnaipe ‘Úsáid an teimpléad seo’ + Tá an cnaipe Úsáid an teimpléid seo i bhfolach + Taispeántar an cnaipe Úsáid an teimpléid seo + + Folaigh an cnaipe Is maith liom \'beochan tobair\' + Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach + Taispeántar an cnaipe Is maith liom \'beochan tobair\' + Folaigh cnaipe Is maith liom + Tá an cnaipe Is maith liom i bhfolach + Taispeántar an cnaipe Is maith liom + Folaigh cnaipe Ní maith liom + Tá an cnaipe Ní maith liom i bhfolach + Taispeántar an cnaipe Ní maith liom + Folaigh cnaipe na Tuairimí + Tá an cnaipe tuairimí i bhfolach + Taispeántar cnaipe tuairimí + + Folaigh cnaipe Roinn + Tá cnaipe Roinn i bhfolach + Taispeántar an cnaipe Roinn + + Folaigh cnaipe Athmheasc + Tá cnaipe Athmheasc i bhfolach + Taispeántar cnaipe Athmheasc + Folaigh cnaipe Fuaime + Tá cnaipe fuaime i bhfolach + Taispeántar cnaipe fuaime + Folaigh painéal faisnéise + Tá painéal faisnéise i bhfolach + Taispeántar painéal faisnéise + Folaigh barra cainéal + Tá barra cainéal i bhfolach + Taispeántar barra cainéal + Folaigh teideal físeáin + Teideal físeáin i bhfolach + Taispeántar teideal físeáin + Folaigh lipéad meiteashonraí fuaime + Lipéad meiteashonraí fuaime i bhfolach + Taispeántar Lipéad meiteashonraí fuaime + Folaigh lipéad nasc físeáin + Tá lipéad nasc físeáin i bhfolach + Taispeántar lipéad nasc físeáin + Folaigh barra nascleanúna + Tá barra nascleanúna i bhfolach + Taispeántar barra nascleanúna + + + Folaigh réamhamharc uathsheinm + Tá réamhamharc uathsheinm i bhfolach + Taispeántar réamhamharc uathsheinm + + + Folaigh físeán molta scáileán deiridh + "Bíonn an físeán molta scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta Is féidir an t-uathsheinm a athrú i socruithe YouTube: Socruithe → Athsheinm → Uathsheinm an chéad fhíseán eile" - Taispeántar físeán molta deireadh scáileáin - - - Folaigh forleagan físeáin ghaolmhara - Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach - Taispeántar forleagan físeáin ghaolmhara i lánscáileán - - - Folaigh stampa ama an fhíseáin - Tá stampa ama i bhfolach - Taispeántar stampa ama - - - Folaigh painéil preab aníos imreoir - Tá painéil preab aníos imreoir i bhfolach - Taispeántar painéil preab aníos imreoir - - - Scoir an mód lánscáileáin ag deireadh an fhíseáin - Díchumasaithe - Portráid - Tírdhreach - Portráid agus tírdhreach - - - Oscail físeáin i bportráid lánscáileáin - Osclaítear físeáin i mód lánscáileáin - Ní osclaítear físeáin i mód lánscáileáin - - - Teimhneacht fhorleagan imreora - Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht - Teimhneacht fhorleagan an imreora idir 0-100 - - - - Níl dí-mhaith ar fáil faoi láthair (API am istigh) - Níl \'Ní maith liom\' ar fáil (stádas %d) - Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) - Níl \'Ní maith liom\' ar fáil (%s) - - Athlódáil físeán vótáil trí Return YouTube Dislike - - I bhfolach ag an úinéir - Return YouTube Dislike - Taispeántar \'Ní maith liom\' - Ní thaispeántar \'Ní maith liom\' - Taispeáin \'ní maith liom\' ar Shorts - "Taispeántar 'Ní thaitníonn' ar Shorts + Taispeántar físeán molta scáileán deiridh + + + Folaigh forleagan físeáin ghaolmhara + Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach + Taispeántar forleagan físeáin ghaolmhara i lánscáileán + + + Folaigh stampa ama an fhíseáin + Tá stampa ama i bhfolach + Taispeántar stampa ama + + + Folaigh painéil preab aníos imreoir + Tá painéil preab aníos imreoir i bhfolach + Taispeántar painéil preab aníos imreoir + + + Scoir an mód lánscáileáin ag deireadh an fhíseáin + Díchumasaithe + Portráid + Tírdhreach + Portráid agus tírdhreach + + + Oscail físeáin i bportráid lánscáileáin + Osclaítear físeáin i mód lánscáileáin + Ní osclaítear físeáin i mód lánscáileáin + + + Teimhneacht fhorleagan imreora + Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht + Teimhneacht fhorleagan an imreora idir 0-100 + + + + Níl dí-mhaith ar fáil faoi láthair (API am istigh) + Níl \'Ní maith liom\' ar fáil (stádas %d) + Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) + Níl \'Ní maith liom\' ar fáil (%s) + + Athlódáil físeán vótáil trí Return YouTube Dislike + + I bhfolach ag an úinéir + Return YouTube Dislike + Taispeántar \'Ní maith liom\' + Ní thaispeántar \'Ní maith liom\' + Taispeáin \'ní maith liom\' ar Shorts + "Taispeántar 'Ní thaitníonn' ar Shorts Teorainn: B’fhéidir nach dtaispeánfar 'Ní thaitníonn' i mód incognito" - Ní thaispeántar \'Ní maith liom\' ar Shorts - \'Ní maith liom\' mar chéatadán - Taispeántar \'Ní thaitníonn\' mar chéatadán - Taispeántar \'Ní maith liom\' mar uimhir - - Cnaipe dlúth \'Is maith liom\' - Cnaipe \'Is maith liom\' stílithe don leithead íosta - Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr - Taispeáin \'is maith liom\' measta - Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo - Ní thaispeántar líon na \'is maith leis\' measta - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - ReturnYouTubeDislike.com - Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil - - Staitisticí API ReturnYouTubeDislike an ghléis seo - Am freagartha API, meán - Am freagartha API, íosmhéid - Am freagartha API, uasmhéid - Am freagartha API, físeán deireanach - Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm - Vótaí aisghabhála API, líon na nglaonna - Níor rinneadh aon ghlaonna líonra - %d glaonna líonra déanta - Vótaí aisghabhála API, líon na sosanna ama - Níl aon ghlaonna líonra imithe in éag - %d glaonna líonra imithe thar an am - Teorainneacha ráta cliant API - Níor aimsíodh aon teorainneacha ráta cliant - Teorainn ráta cliant a bhíonn le fáil %d uair - %d milleasoicind - - - Cumasaigh barra cuardaigh leathan - Tá barra cuardaigh leathan cumasaithe - Tá an barra cuardaigh leathan díchumasaithe - - - Cumasaigh mionsamhlacha ardchaighdeáin - Tá mionsamhlacha Seekbar ardchaighdeáin - Tá mionsamhlacha Seekbar ar chaighdeán meánach - Tá mionsamhlacha barra cuardaigh lánscáileáin ardchaighdeáin - Tá mionsamhlacha barra cuardaigh lánscáileáin ar chaighdeán meánach - "Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu. - -Úsáidfidh miontaispeántais cuardaigh an caighdeán céanna leis an bhfíseán reatha. - -Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agus nuair a úsáidtear nasc idirlín an-tapa." - Cuir sean-mionsamhlacha barra cuardaigh ar ais - Beidh mionsamhlacha Seekbar le feiceáil os cionn an barra cuardaigh - Beidh mionsamhlacha Seekbar le feiceáil ar an scáileán - - - SponsorBlock - Cumasaigh SponsorBlock - Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais - Dealramh - Taispeáin an cnaipe vótála - Taispeántar cnaipe vótála deighleog - Ní thaispeántar cnaipe vótála deighleog - Úsáid leagan amach cearnach - Tá cnaipí agus rialtáin cearnach - Tá cnaipí agus rialuithe cruinn - - Úsáid an cnaipe Scipeáil dlúth - Cnaipe Scipeáil stílithe don leithead íosta - Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr - Folaigh an cnaipe Scipeáil go huathoibríoch - Folaítear an cnaipe Scipeáil tar éis cúpla soicind - Taispeántar an cnaipe Scipeáil don deighleog iomlán - Fad an chnaipe Scipeáil - Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad - Taispeáin an tósta cealaithe scipeáilte - Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú - Ní thaispeántar tósta - Scipeáil fad an tósta - Cá fhad a thaispeántar an tósta cealaithe scipeála - 1 soicind - 2 soicind - 3 soicind - 4 soicind - 5 soicind - 6 soicind - 7 soicind - 8 soicind - 9 soicind - 10 soicind - Taispeáin fad an fhíseáin gan deighleog - Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh - Taispeántar fad físe iomlán - Deighleoga nua a chruthú - Taispeáin cnaipe Cruthaigh deighleog nua - Taispeántar an cnaipe cruthaigh deighleog nua - Ní thaispeántar an cnaipe cruthaigh deighleog nua - Coigeartaigh céim deighleog nua - Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú - Caithfidh luach a bheith ina uimhir dheimhneach - Féach ar threoirlínte - Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua - Lean na treoirlínte - Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua - Léigh cheana féin - Taispeáin dom - Ginearálta - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil SponsorBlock ar fáil - Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil - Cumasaigh rianú comhaireamh scipeála - Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog - Níl rianú comhaireamh scipeála cumasaithe - Fad íosta deighleog - Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) - Fad ama neamhbhailí - D\'aitheantas úsáideora príobháideach - Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort - Caithfidh Id príobháideach a bheith ≥30 carachtar - Athraigh URL API - An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí - Athshocrú URL API - Tá URL API neamhbhailí - Athraigh URL API - Socruithe Iompórtála/Easpórtála - Cóipeáil - Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile - Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile. Cuimsíonn sé seo d\'aitheantas úsáideora príobháideach. Bí cinnte é seo a roinnt - D\'éirigh leis na socruithe a iompórtáil - Theip ar iompórtáil: %s - Theip ar easpórtáil: %s - "Tá ID úsáideora príobháideach SponsorBlock i do shocruithe. + Ní thaispeántar \'Ní maith liom\' ar Shorts + \'Ní maith liom\' mar chéatadán + Taispeántar \'Ní thaitníonn\' mar chéatadán + Taispeántar \'Ní maith liom\' mar uimhir + + Cnaipe dlúth \'Is maith liom\' + Cnaipe \'Is maith liom\' stílithe don leithead íosta + Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr + Taispeáin \'is maith liom\' measta + Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo + Ní thaispeántar líon na \'is maith leis\' measta + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + ReturnYouTubeDislike.com + Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil + + Staitisticí API ReturnYouTubeDislike an ghléis seo + Am freagartha API, meán + Am freagartha API, íosmhéid + Am freagartha API, uasmhéid + Am freagartha API, físeán deireanach + Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm + Vótaí aisghabhála API, líon na nglaonna + Níor rinneadh aon ghlaonna líonra + %d glaonna líonra déanta + Vótaí aisghabhála API, líon na sosanna ama + Níl aon ghlaonna líonra imithe in éag + %d glaonna líonra imithe thar an am + Teorainneacha ráta cliant API + Níor aimsíodh aon teorainneacha ráta cliant + Teorainn ráta cliant a bhíonn le fáil %d uair + %d milleasoicind + + + SponsorBlock + Cumasaigh SponsorBlock + Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais + Dealramh + Taispeáin an cnaipe vótála + Taispeántar cnaipe vótála deighleog + Ní thaispeántar cnaipe vótála deighleog + Úsáid leagan amach cearnach + Tá cnaipí agus rialtáin cearnach + Tá cnaipí agus rialuithe cruinn + + Úsáid an cnaipe Scipeáil dlúth + Cnaipe Scipeáil stílithe don leithead íosta + Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr + Folaigh an cnaipe Scipeáil go huathoibríoch + Folaítear an cnaipe Scipeáil tar éis cúpla soicind + Taispeántar an cnaipe Scipeáil don deighleog iomlán + Fad an chnaipe Scipeáil + Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad + Taispeáin an tósta cealaithe scipeáilte + Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú + Ní thaispeántar tósta + Scipeáil fad an tósta + Cá fhad a thaispeántar an tósta cealaithe scipeála + 1 soicind + 2 soicind + 3 soicind + 4 soicind + 5 soicind + 6 soicind + 7 soicind + 8 soicind + 9 soicind + 10 soicind + Taispeáin fad an fhíseáin gan deighleog + Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh + Taispeántar fad físe iomlán + Deighleoga nua a chruthú + Taispeáin cnaipe Cruthaigh deighleog nua + Taispeántar an cnaipe cruthaigh deighleog nua + Ní thaispeántar an cnaipe cruthaigh deighleog nua + Coigeartaigh céim deighleog nua + Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú + Caithfidh luach a bheith ina uimhir dheimhneach + Féach ar threoirlínte + Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua + Lean na treoirlínte + Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua + Léigh cheana féin + Taispeáin dom + Ginearálta + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil SponsorBlock ar fáil + Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil + Cumasaigh rianú comhaireamh scipeála + Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog + Níl rianú comhaireamh scipeála cumasaithe + Fad íosta deighleog + Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) + Fad ama neamhbhailí + D\'aitheantas úsáideora príobháideach + Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort + Caithfidh Id príobháideach a bheith ≥30 carachtar + Athraigh URL API + An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí + Athshocrú URL API + Tá URL API neamhbhailí + Athraigh URL API + Socruithe Iompórtála/Easpórtála + Cóipeáil + Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile + Do chumraíocht SponsorBlock JSON is féidir a allmhairiú/onnmhairiú chuig Revanced agus ardáin SponsorBlock eile. Cuimsíonn sé seo d\'aitheantas úsáideora príobháideach. Bí cinnte é seo a roinnt + D\'éirigh leis na socruithe a iompórtáil + Theip ar iompórtáil: %s + Theip ar easpórtáil: %s + "Tá ID úsáideora príobháideach SponsorBlock i do shocruithe. Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh. " - Ná taispeáin arís - Athraigh iompar deighleog - Urraitheoir - Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo - Neamhíoctha/Féin-chur chun cinn - Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad - Meabhrúchán Idirghníomhaíochta (Liostáil) - Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin - Aibhsigh - An chuid den fhíseán atá ag cuardach mórchuid na ndaoine - Beochan Eatramh / Réamhrá - Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis - Cártaí Deiridh / Creidmheasanna - Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis - Crúca / Beannachtaí - Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis - Réamhamharc / Achoimre - Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile - Seachrán / Scéalta Grinn - Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra - Ceol: Rannóg Neamh-Cheoil - Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile - Scipeáil - Aibhsigh - Scipeáil urraitheoir - Scipeáil promóisean - Scipeáil idirghníomhú - Scipeáil go dtí aird a tharraingt - Scipeáil réamhrá - Scipeáil briseadh - Scipeáil briseadh - Scipeáil an chuid deiridh - Scipeáil crúca - Scipeáil réamhamharc - Scipeáil réamhamharc - Scipeáil achoimre - Scipeáil tadhlaí - Scipeáil neamh-cheol - Scipeáil deighleog - Scipeáilte urraitheoir - Scipeáilte féin-chur chun cinn - Scipeáilte meabhrúchán cráite - Scipeáilte aird a tharraingt - Scipeáilte réamhrá - Scipeáilte briseadh - Scipeáilte briseadh - Scipeáilte an chuid deiridh - Scipeáilte crúca - Scipeáilte réamhamharc - Scipeáilte réamhamharc - Achoimre scipeáilte - Tadhlaí scipeáilte - Scipeáladh cuid nach ceolmhar í - Deighleog gan curtha isteach scipeáilte - Scipeáilte iomadúil deighleoga - Scipeáil go huathoibríoch - Scipeáil go huathoibríoch uair amháin - Taispeáin cnaipe Scipeáil - Taispeáin i mbarra lorg - Díchumasaigh - Ní féidir deighleog a chur isteach: %s - Tá SponsorBlock síos go sealadach - Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) - Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) - Ní féidir an deighleog a chur isteach: %s - "Ní féidir deighleog a chur isteach. + Ná taispeáin arís + Athraigh iompar deighleog + Urraitheoir + Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo + Neamhíoctha/Féin-chur chun cinn + Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad + Meabhrúchán Idirghníomhaíochta (Liostáil) + Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin + Aibhsigh + An chuid den fhíseán atá ag cuardach mórchuid na ndaoine + Beochan Eatramh / Réamhrá + Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis + Cártaí Deiridh / Creidmheasanna + Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis + Crúca / Beannachtaí + Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis + Réamhamharc / Achoimre + Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile + Seachrán / Scéalta Grinn + Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra + Ceol: Rannóg Neamh-Cheoil + Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile + Scipeáil + Aibhsigh + Scipeáil urraitheoir + Scipeáil promóisean + Scipeáil idirghníomhú + Scipeáil go dtí aird a tharraingt + Scipeáil réamhrá + Scipeáil briseadh + Scipeáil briseadh + Scipeáil an chuid deiridh + Scipeáil crúca + Scipeáil réamhamharc + Scipeáil réamhamharc + Scipeáil achoimre + Scipeáil tadhlaí + Scipeáil neamh-cheol + Scipeáil deighleog + Scipeáilte urraitheoir + Scipeáilte féin-chur chun cinn + Scipeáilte meabhrúchán cráite + Scipeáilte aird a tharraingt + Scipeáilte réamhrá + Scipeáilte briseadh + Scipeáilte briseadh + Scipeáilte an chuid deiridh + Scipeáilte crúca + Scipeáilte réamhamharc + Scipeáilte réamhamharc + Achoimre scipeáilte + Tadhlaí scipeáilte + Scipeáladh cuid nach ceolmhar í + Deighleog gan curtha isteach scipeáilte + Scipeáilte iomadúil deighleoga + Scipeáil go huathoibríoch + Scipeáil go huathoibríoch uair amháin + Taispeáin cnaipe Scipeáil + Taispeáin i mbarra lorg + Díchumasaigh + Ní féidir deighleog a chur isteach: %s + Tá SponsorBlock síos go sealadach + Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) + Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) + Ní féidir an deighleog a chur isteach: %s + "Ní féidir an deighleog a chur isteach. Tá sé ann cheana féin" - Cuireadh an deighleog isteach go rathúil - - Níl SponsorBlock ar fáil go sealadach (API am istigh) - Níl SponsorBlock ar fáil go sealadach (stádas %d) - Níl SponsorBlock ar fáil go sealadach - Ní féidir vótáil don deighleog (API am istigh) - Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) - Ní féidir vótáil a dhéanamh don deighleog: %s - Vótáil suas - Vótáil sios - Athraigh catagóir - Níl aon deighleoga le vótáil orthu - - %1$s go %2$s - Roghnaigh catagóir deighleog - Catagóir díchumasaithe. Cumasaigh í le cur isteach. - Deighleog nua SponsorBlock - Socraigh %s mar thús nó deireadh deighleog nua? - Tosaigh - Deireadh - Anois - Am a thosaíonn an deighleog ag - Am a chríochnaíonn an deighleog ag - An bhfuil na hamanna ceart? - "Tá an deighleog ó + Cuireadh an deighleog isteach go rathúil + + Níl SponsorBlock ar fáil go sealadach (API am istigh) + Níl SponsorBlock ar fáil go sealadach (stádas %d) + Níl SponsorBlock ar fáil go sealadach + Ní féidir vótáil don deighleog (API am istigh) + Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) + Ní féidir vótáil a dhéanamh don deighleog: %s + Vótáil suas + Vótáil sios + Athraigh catagóir + Níl aon deighleoga le vótáil orthu + + %1$s go %2$s + Roghnaigh catagóir deighleog + Catagóir díchumasaithe. Cumasaigh í le cur isteach. + Deighleog nua SponsorBlock + Socraigh %s mar thús nó deireadh deighleog nua? + Tosaigh + Deireadh + Anois + Am a thosaíonn an deighleog ag + Am a chríochnaíonn an deighleog ag + An bhfuil na hamanna ceart? + "Tá an deighleog ó %1$s go @@ -1289,47 +1374,47 @@ go (%3$s) Réidh le cur isteach?" - Caithfidh an tús a bheith roimh an deireadh - Marcáil dhá shuíomh ar an mbarra ama ar dtús - Féach ar an deighleog agus cinntigh léim réidh - Cuir am an deighleog in eagar de láimh - Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? - Am neamhbhailí tugtha - Staitisticí - - Níl staitisticí ar fáil faoi láthair (tá an API síos) - Ag lódáil... - Tá SponsorBlock díchumasaithe - D\'ainm úsáideora: <b>%s</b> - Tapáil anseo chun d\'ainm úsáideora a athrú - Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s - Athraíodh ainm úsáideora go rathúil - Is é do chlú <b>%.2f</b> - Chruthaigh tú <b>%s</b> deighleoga - Tapáil anseo chun do dheighleoga a fheiceáil - Clár ceannairí SponsorBlock - Tá daoine sábháilte agat ó <b>%s</b> deighleoga - Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil - Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil - Rinne tú scipeáil ar <b>%s</b> deighleoga - Sin é <b>%s</b> - Athshocrú cuntar deighleoga scipeáilte? - %1$s uaireanta %2$s nóiméad - %1$s nóiméad %2$s soicind - %s soicindí - Teimhneacht: - Dath: - Maidir - sponsor.ajay.app - Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil - - - Fachtóir foirme leagan amach - Réamhshocrú - Guthán - Táibléad - Gluaisteán - "Áirítear leis na hathruithe: + Caithfidh an tús a bheith roimh an deireadh + Marcáil dhá shuíomh ar an mbarra ama ar dtús + Féach ar an deighleog agus cinntigh léim réidh + Cuir am an deighleog in eagar de láimh + Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? + Am neamhbhailí tugtha + Staitisticí + + Níl staitisticí ar fáil faoi láthair (tá an API síos) + Ag lódáil... + Tá SponsorBlock díchumasaithe + D\'ainm úsáideora: <b>%s</b> + Tapáil anseo chun d\'ainm úsáideora a athrú + Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s + Athraíodh ainm úsáideora go rathúil + Is é do chlú <b>%.2f</b> + Chruthaigh tú <b>%s</b> deighleoga + Tapáil anseo chun do dheighleoga a fheiceáil + Clár ceannairí SponsorBlock + Tá daoine sábháilte agat ó <b>%s</b> deighleoga + Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil + Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil + Rinne tú scipeáil ar <b>%s</b> deighleoga + Sin é <b>%s</b> + Athshocrú cuntar deighleoga scipeáilte? + %1$s uaireanta %2$s nóiméad + %1$s nóiméad %2$s soicind + %s soicindí + Teimhneacht: + Dath: + Maidir + sponsor.ajay.app + Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil + + + Fachtóir foirme leagan amach + Réamhshocrú + Guthán + Táibléad + Gluaisteán + "Áirítear leis na hathruithe: Leagan amach táibléid • Tá poist phobail i bhfolach @@ -1337,329 +1422,331 @@ Leagan amach táibléid Leagan amach gluaisteán • Gearrscannáin oscailte sa ghnáth-imreoir • Tá an fotha eagraithe de réir topaicí agus bealaí" - - - Leagan aip bréige - Leagan bréagach - Leagan gan bréag - "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. + + + Leagan aip bréige + Leagan bréagach + Leagan gan bréag + "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. Athróidh sé seo cuma agus gnéithe na haipe, ach d'fhéadfadh fo-iarsmaí anaithnide tarlú. Má mhúchtar é níos déanaí, moltar sonraí na haipe a ghlanadh chun fabhtanna UI a chosc." - Sprioc leagan aip bréagach - 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú - 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn - 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts - 19.01.34 - Athchóirigh deilbhíní nascleanúna sean - - - Athraigh an leathanach tosaigh - Réamhshocrú - Gach síntiús - Brabhsáil cainéil - Cúrsaí / Foghlaim - Taiscéal - Faisean & Áilleacht - Cluichíocht - Stair - Leabharlann - Físeáin a thaitin - Beo - Scannáin - Ceol - Nuacht - Fógraí - Liostaí seinnte - Cuardaigh - Siopadóireacht - Shorts - Spóirt - Síntiúis - Ag treocht - Réaltacht Fhíorúil - Féach níos déanaí - Do ghearrthóga - Athraigh an leathanach tosaigh i gcónaí - "Athraítear an leathanach tosaigh i gcónaí + Sprioc leagan aip bréagach + 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú + 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn + + + Athraigh an leathanach tosaigh + Réamhshocrú + Gach síntiús + Brabhsáil cainéil + Cúrsaí / Foghlaim + Taiscéal + Faisean & Áilleacht + Cluichíocht + Stair + Leabharlann + Físeáin a thaitin + Beo + Scannáin + Ceol + Nuacht + Fógraí + Liostaí seinnte + Cuardaigh + Siopadóireacht + Shorts + Spóirt + Síntiúis + Ag treocht + Réaltacht Fhíorúil + Féach níos déanaí + Do ghearrthóga + Athraigh an leathanach tosaigh i gcónaí + "Athraítear an leathanach tosaigh i gcónaí Teorainn: Seans nach n-oibreoidh úsáid a bhaint as an gcnaipe cúil ar an mbarra uirlisí" - Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip - - - Díchumasaigh atosú seinnteoir Shorts - Ní atosóidh seinnteoir Shorts nuair a thosófar an aip - Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís - - - Oscail Shorts le - Shorts seinnteoir - Imreoir rialta - Lánscáileáin imreoir rialta - - - Shorts Uathsheinn - Seinnfidh Shorts go huathoibríoch - Déanfaidh Shorts arís - Uathsheinn Shorts Cúlra sheinn - Déanfar súgradh cúlra Shorts go huathoibríoch - Athdhéanfar athsheinm Shorts cúlra sheinn - - - Mion seinnteoir - Athraigh stíl an imreora íoslaghdaithe in-aip - Cineál Mion seinnteoir - Díchumasaithe - Réamhshocraithe - Íosta - Táibléad - Nua-aimseartha 1 - Nua-Aimseartha 2 - Nua-aimseartha 3 - Nua-aimseartha 4 - Díchumasaigh coirnéil chruinn - Tá coirnéil cearnach - Déantar coirnéil a shlánú - Cumasaigh sconna dúbailte agus pinch chun méid a athrú - "Gníomh tap dúbailte agus pinch le méid a athrú cumasaithe + Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip + + + Díchumasaigh atosú seinnteoir Shorts + Ní atosóidh seinnteoir Shorts nuair a thosófar an aip + Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís + + + Oscail Shorts le + Shorts seinnteoir + Imreoir rialta + Lánscáileáin imreoir rialta + + + Shorts Uathsheinn + Seinnfidh Shorts go huathoibríoch + Déanfaidh Shorts arís + Uathsheinn Shorts Cúlra sheinn + Déanfar súgradh cúlra Shorts go huathoibríoch + Athdhéanfar athsheinm Shorts cúlra sheinn + + + Mion seinnteoir + Athraigh stíl an imreora íoslaghdaithe in-aip + Cineál Mion seinnteoir + Díchumasaithe + Réamhshocraithe + Íosta + Táibléad + Nua-aimseartha 1 + Nua-Aimseartha 2 + Nua-aimseartha 3 + Nua-aimseartha 4 + Díchumasaigh coirnéil chruinn + Tá coirnéil cearnach + Déantar coirnéil a shlánú + Cumasaigh sconna dúbailte agus pinch chun méid a athrú + "Gníomh tap dúbailte agus pinch le méid a athrú cumasaithe • Tap dúbailte chun méid an mhion-imreora a mhéadú • Tap dúbailte arís chun an méid bunaidh a athchóiriú" - Díchumasaíodh gníomh tapáil faoi dhó agus pinch chun méid a athrú - Díchumasaigh tarraing agus scaoil - Tá tarraing agus scaoil díchumasaithe - "Tá tarraing agus scaoil cumasaithe + Díchumasaíodh gníomh tapáil faoi dhó agus pinch chun méid a athrú + Díchumasaigh tarraing agus scaoil + Tá tarraing agus scaoil díchumasaithe + "Tá tarraing agus scaoil cumasaithe Is féidir an mini-imreoir a tharraingt chuig aon chúinne den scáileán" - Díchumasaigh gotha tarraingthe cothrománach - Gotha tarraingthe cothrománach díchumasaithe - "Gotha tarraingthe cothrománach cumasaithe + Díchumasaigh gotha tarraingthe cothrománach + Gotha tarraingthe cothrománach díchumasaithe + "Gotha tarraingthe cothrománach cumasaithe Is féidir an mini-imreoir a tharraingt amach as an scáileán ar chlé nó ar dheis" - Folaigh cnaipí forleathana - Tá cnaipí forleathana i bhfolach - Taispeántar cnaipí forleathana - Folaigh cnaipí leathnaithe agus dúnta - "Tá na cnaipí i bhfolach + Folaigh cnaipí forleathana + Tá cnaipí forleathana i bhfolach + Taispeántar cnaipí forleathana + Folaigh cnaipí leathnaithe agus dúnta + "Tá na cnaipí i bhfolach Svaip chun leathnú nó dúnadh" - Taispeántar cnaipí leathnaithe agus dúnta - Folaigh fothéacsanna - Tá fothéacsanna i bhfolach - Taispeántar fothéacsanna - Folaigh cnaipí scipeáil ar aghaidh agus ar ais - Tá scipeanna ar aghaidh agus ar ais i bhfolach - Taispeántar scipeáil ar aghaidh agus ar ais - Méid tosaigh - Tosaigh ar mhéid an scáileáin, i bpicteilíní - Caithfidh méid picteilíní a bheith idir %1$s agus %2$s - Trédhearcacht forleagan - Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach - Caithfidh teimhneacht forleagan mion-imreoir a bheith idir 0-100 - - - Cumasaigh scáileán luchtaithe - Beidh cúlra grádáin ag an scáileán lódála - Beidh cúlra láidir ag scáileán luchtaithe - Stíl scáileáin splancais - Dath - Dubh agus bán - Cumasaigh dath barra cuardaigh saincheaptha - Taispeántar dath barra cuardaigh saincheaptha - Taispeántar dath barr cuardaigh bunaidh - Dath barra cuardaigh saincheaptha - Dath an bharra cuardaigh - Dath béime saincheaptha an bharra cuardaigh - Dath béime an bharra cuardaigh - Luach datha barra cuardaigh neamhbhailí - - - YouTube ReVanced - YT ReVanced - YT - - - Lógó ceanntásca - Réamhshocrú - Rialta - Premium - ReVanced - - ReVanced íosta - Saincheaptha - - - Seachbhóthar srianta réigiún íomhá - Ag baint úsáide as óstach íomhá yt4.ggpht.com - "Óstáil íomhá bhunaidh á úsáid + Taispeántar cnaipí leathnaithe agus dúnta + Folaigh fothéacsanna + Tá fothéacsanna i bhfolach + Taispeántar fothéacsanna + Folaigh cnaipí scipeáil ar aghaidh agus ar ais + Tá scipeanna ar aghaidh agus ar ais i bhfolach + Taispeántar scipeáil ar aghaidh agus ar ais + Méid tosaigh + Tosaigh ar mhéid an scáileáin, i bpicteilíní + Caithfidh méid picteilíní a bheith idir %1$s agus %2$s + Trédhearcacht forleagan + Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach + Caithfidh teimhneacht forleagan mion-imreoir a bheith idir 0-100 + + + Cumasaigh scáileán luchtaithe + Beidh cúlra grádáin ag an scáileán lódála + Beidh cúlra láidir ag scáileán luchtaithe + Stíl scáileáin splancais + Díchumasaithe + Dath + Dubh agus bán + Cumasaigh dath barra cuardaigh saincheaptha + Taispeántar dath barra cuardaigh saincheaptha + Taispeántar dath barr cuardaigh bunaidh + Dath barra cuardaigh saincheaptha + Dath an bharra cuardaigh + Dath béime saincheaptha an bharra cuardaigh + Dath béime an bharra cuardaigh + Luach datha barra cuardaigh neamhbhailí + + + YouTube ReVanced + YT ReVanced + YT + + + Lógó ceanntásca + Réamhshocrú + Rialta + Premium + ReVanced + + ReVanced íosta + Saincheaptha + + + Seachbhóthar srianta réigiún íomhá + Ag baint úsáide as óstach íomhá yt4.ggpht.com + "Óstáil íomhá bhunaidh á úsáid Is féidir le seo íomhánna atá blocáilte i roinnt réigiún a dheisiú" - - - - Cluaisín Baile - - Cluaisín Liostálaí - - Tú cluaisín - Seinmliostaí imreora & moltaí - Torthaí cuardaigh - Mionsamhlacha bunaidh - DeArrow & Mionsamhlacha bunaidh - DeArrow & Gabhálacha fós - Gabhann fós - DeArrow - "Soláthraíonn DeArrow miontaispeántais foinse-phobail do fhíseáin YouTube. Bíonn na miontaispeántais seo níos ábhartha go minic ná na cinn a sholáthraíonn YouTube + + + + Cluaisín Baile + + Cluaisín Liostálaí + + Tú cluaisín + Seinmliostaí imreora & moltaí + Torthaí cuardaigh + Mionsamhlacha bunaidh + DeArrow & Mionsamhlacha bunaidh + DeArrow & Gabhálacha fós + Gabhann fós + DeArrow + "Soláthraíonn DeArrow miontaispeántais foinse-phobail do fhíseáin YouTube. Bíonn na miontaispeántais seo níos ábhartha go minic ná na cinn a sholáthraíonn YouTube Má tá sé cumasaithe, cuirfear URLanna físeán chuig an bhfreastalaí API agus ní sheolfar aon sonraí eile. Má níl aon mhiontaisspeántais DeArrow ag físeán, ansin taispeántar na miontaispeántais bunaidh nó na gafaí fós Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" - Taispeáin tósta mura bhfuil API ar fáil - Taispeántar tósta mura bhfuil DeArrow ar fáil - Ní thaispeántar tósta mura bhfuil DeArrow ar fáil - Deirphointe API DeArrow - URL críochphointe taisce mionsamhail DeArrow - Gabhann físeán fós - Tógtar gabhála fós ó thos/lán/deireadh gach físeáin. Tá na híomhánna seo tógtha isteach i YouTube agus ní úsáidtear aon API seachtrach - Úsáid gabhálacha gasta fós - Ag baint úsáide as ardchaighdeán meánach Luchtaítear mionsamhlacha níos gasta, ach d\'fhéadfadh sruthanna beo, físeáin neamh-eisithe nó físeáin an-sean mionsamhlacha bána a thais - Ag baint úsáide as ardchaighdeáin fós gabhálacha - Am físe le gabháil fós a ghlacadh uaidh - Tús an fhíseáin - Lár an fhíseáin - Deireadh an fhíseáin - - Níl DeArrow ar fáil go sealadach (cód stádais: %s) - Níl DeArrow ar fáil go sealadach - - - Taispeáin fógraí ReVanced - Taispeántar fógraí ar thosú - Ní thaispeántar fógraí ar thosú - Taispeáin fógraí ar thosú - Theip ar nascadh le soláthraí fógraí - Díbhe - - - Cumasaigh físeán lúbtha - Lúbfar an físeán - Ní lúbfar an físeán - - - Taispeáin an cnaipe físeáin lúbtha - Taispeántar an cnaipe - Níl an cnaipe ar taispeáint - Tá físeán lúbtha ar siúl - Tá físeán lúbtha as siúl - - - Sos ar chur isteach fuaime - Cuirtear sos ar an athsheinm nuair a sheinneann fuaim eile (m.sh. loingseoireacht) - Laghdaíonn an toirt nuair a sheinneann fuaim eile - - - Toisí gléas a fhalsú - "Toisí na ngléasanna falsaithe + Taispeáin tósta mura bhfuil API ar fáil + Taispeántar tósta mura bhfuil DeArrow ar fáil + Ní thaispeántar tósta mura bhfuil DeArrow ar fáil + Deirphointe API DeArrow + URL críochphointe taisce mionsamhail DeArrow + Gabhann físeán fós + Tógtar gabhála fós ó thos/lán/deireadh gach físeáin. Tá na híomhánna seo tógtha isteach i YouTube agus ní úsáidtear aon API seachtrach + Úsáid gabhálacha gasta fós + Ag baint úsáide as ardchaighdeán meánach Luchtaítear mionsamhlacha níos gasta, ach d\'fhéadfadh sruthanna beo, físeáin neamh-eisithe nó físeáin an-sean mionsamhlacha bána a thais + Ag baint úsáide as ardchaighdeáin fós gabhálacha + Am físe le gabháil fós a ghlacadh uaidh + Tús an fhíseáin + Lár an fhíseáin + Deireadh an fhíseáin + + Níl DeArrow ar fáil go sealadach (cód stádais: %s) + Níl DeArrow ar fáil go sealadach + + + Taispeáin fógraí ReVanced + Taispeántar fógraí ar thosú + Ní thaispeántar fógraí ar thosú + Taispeáin fógraí ar thosú + Theip ar nascadh le soláthraí fógraí + Díbhe + + + Cumasaigh físeán lúbtha + Lúbfar an físeán + Ní lúbfar an físeán + + + Taispeáin an cnaipe físeáin lúbtha + Taispeántar an cnaipe + Níl an cnaipe ar taispeáint + Tá físeán lúbtha ar siúl + Tá físeán lúbtha as siúl + + + Sos ar chur isteach fuaime + Cuirtear sos ar an athsheinm nuair a sheinneann fuaim eile (m.sh. loingseoireacht) + Laghdaíonn an toirt nuair a sheinneann fuaim eile + + + Toisí gléas a fhalsú + "Toisí na ngléasanna falsaithe D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" - "Toisí na ngléasanna gan falsaithe + "Toisí na ngléasanna gan falsaithe D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" - Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. - - - Aiseolas haiptice - Athraigh aiseolas haiptice - Díchumasaigh haiptice caibidlí - Tá haiptice caibidlí díchumasaithe - Tá haiptice caibidlí cumasaithe - Díchumasaigh haiptice beacht cuardaigh - Tá haiptice cuardaigh chruinne díchumasaithe - Tá haiptice cuardaigh chruinn cumasaithe - Díchumasaigh haiptice cuardaigh agus cealaithe - Tá haiptice cuardaigh cealaithe díchumasaithe - Tá haiptice cuardaigh cealaithe cumasaithe - Díchumasaigh haiptice súmála - Tá haiptice súmála díchumasaithe - Tá haiptice súmála cumasaithe - - - Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. - - - Seachain atreoruithe URL - Déantar atreoruithe URL a sheachaint - Ní dhéantar seachaint ar atreoruithe URL - - - Oscail naisc sa bhrabhsála - Ag oscailt naisc sa bhrabhsálaí seachtrach - Ag oscailt naisc sa bhrabhsálaí in-aip - - - - Uathoibríoch - Cuimhnigh athruithe ar cháilíocht físe - Baineann athruithe cáilíochta le gach físeán - Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha - Taispeáin tósta ar athruithe cáilíochta físe - Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Cáilíocht físe réamhshocraithe ar líonra Wi-Fi - Cáilíocht físe réamhshocraithe ar líonra soghluaiste - Cuimhnigh ar athruithe cáilíochta Shorts - Baineann athruithe ar an gcáilíocht le gach Shorts - Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha - Cáilíocht réamhshocraithe Shorts ar líonra Wi-Fi - Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste - soghluaiste - Wi-Fi - Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s - Athraíodh cáilíocht Shorts %1$s go: %2$s - - - Taispeáin cnaipe dialóg luais - Taispeántar cnaipe dialóige luais. Tapáil agus coinnigh síos chun luas athsheinm a athshocrú go réamhshocrú - Ní thaispeántar cnaipe dialóige luais - - - Taispeáin cnaipe cáilíochta físeáin - Taispeántar cnaipe cáilíochta físe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe - Ní thaispeántar cnaipe cáilíochta físe - - - Roghchlár luas athsheinm saincheaptha - Taispeántar roghchlár luais saincheaptha - Ní thaispeántar roghchlár luais saincheaptha - Athchóirigh an sean-roghchlár luas athsheinm - Taispeántar an sean-roghchlár luais - Taispeántar roghchlár luais nua-aimseartha - Luas athsheinm saincheaptha - Cuir leis nó athraigh na luasanna athsheinm saincheaptha - Ní mór luas saincheaptha a bheith níos lú ná %s - Luasanna athsheinm saincheaptha neamhbhailí - Uathoibríoch - Luas saincheaptha tapála agus coinnigh - Luas athsheinm eatarthu 0-8 - - - Cuimhnigh athruithe ar luas athsheinm - Baineann athruithe luais athsheinm le gach físeáin - Ní bhaineann athruithe luas athsheinm ach leis an bhfíseán reatha - Taispeáin fógra beag ar athruithe luais athsheinm - Taispeántar fógra beag nuair a athraítear luas réamhshocraithe an athsheinm - Ní thaispeántar fógra nuair a athraítear an luas athsheinm réamhshocraithe. - Luas athsheinm réamhshocraithe - Athraigh luas réamhshocraithe go: %s - - - Díchumasaigh físeán HDR - Tá físeán HDR díchumasaithe - Tá físeán HDR cumasaithe - Fórsa AVC (H.264) - Éigeantar an códóir físeáin go AVC (H.264) - Cinntear an cóideac físe go huathoibríoch - "Sochair: + Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. + + + Aiseolas haiptice + Athraigh aiseolas haiptice + Díchumasaigh haiptice caibidlí + Tá haiptice caibidlí díchumasaithe + Tá haiptice caibidlí cumasaithe + Díchumasaigh haiptice beacht cuardaigh + Tá haiptice cuardaigh chruinne díchumasaithe + Tá haiptice cuardaigh chruinn cumasaithe + Díchumasaigh haiptice cuardaigh agus cealaithe + Tá haiptice cuardaigh cealaithe díchumasaithe + Tá haiptice cuardaigh cealaithe cumasaithe + Díchumasaigh haiptice tapáil agus coinnigh + Tá haiptice tapáil agus coinnigh díchumasaithe + Tá haiptice tapáil agus coinnigh cumasaithe + Díchumasaigh haiptice súmála + Tá haiptice súmála díchumasaithe + Tá haiptice súmála cumasaithe + + + Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. + + + Seachain atreoruithe URL + Déantar atreoruithe URL a sheachaint + Ní dhéantar seachaint ar atreoruithe URL + + + Oscail naisc sa bhrabhsála + Ag oscailt naisc sa bhrabhsálaí seachtrach + Ag oscailt naisc sa bhrabhsálaí in-aip + + + + Uathoibríoch + Cuimhnigh athruithe ar cháilíocht físe + Baineann athruithe cáilíochta le gach físeán + Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha + Taispeáin tósta ar athruithe cáilíochta físe + Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin + Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin + Cáilíocht físe réamhshocraithe ar líonra Wi-Fi + Cáilíocht físe réamhshocraithe ar líonra soghluaiste + Cuimhnigh ar athruithe cáilíochta Shorts + Baineann athruithe ar an gcáilíocht le gach Shorts + Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha + Cáilíocht réamhshocraithe Shorts ar líonra Wi-Fi + Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste + soghluaiste + Wi-Fi + Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s + Athraíodh cáilíocht Shorts %1$s go: %2$s + + + Taispeáin cnaipe dialóg luais + Taispeántar cnaipe dialóige luais. Tapáil agus coinnigh síos chun luas athsheinm a athshocrú go réamhshocrú + Ní thaispeántar cnaipe dialóige luais + + + Taispeáin cnaipe cáilíochta físeáin + Taispeántar cnaipe cáilíochta físe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe + Ní thaispeántar cnaipe cáilíochta físe + + + Roghchlár luas athsheinm saincheaptha + Taispeántar roghchlár luais saincheaptha + Ní thaispeántar roghchlár luais saincheaptha + Athchóirigh an sean-roghchlár luas athsheinm + Taispeántar an sean-roghchlár luais + Taispeántar roghchlár luais nua-aimseartha + Luas athsheinm saincheaptha + Cuir leis nó athraigh na luasanna athsheinm saincheaptha + Ní mór luas saincheaptha a bheith níos lú ná %s + Luasanna athsheinm saincheaptha neamhbhailí + Uathoibríoch + Luas saincheaptha tapála agus coinnigh + Luas athsheinm eatarthu 0-8 + + + Cuimhnigh athruithe ar luas athsheinm + Baineann athruithe luais athsheinm le gach físeáin + Ní bhaineann athruithe luas athsheinm ach leis an bhfíseán reatha + Taispeáin fógra beag ar athruithe luais athsheinm + Taispeántar fógra beag nuair a athraítear luas réamhshocraithe an athsheinm + Ní thaispeántar fógra nuair a athraítear an luas athsheinm réamhshocraithe. + Luas athsheinm réamhshocraithe + Athraigh luas réamhshocraithe go: %s + + + Díchumasaigh físeán HDR + Tá físeán HDR díchumasaithe + Tá físeán HDR cumasaithe + Fórsa AVC (H.264) + Éigeantar an códóir físeáin go AVC (H.264) + Cinntear an cóideac físe go huathoibríoch + "Sochair: • Féadfaidh sé saolré na ceallraí a fheabhsú • Féadfaidh sé réitigh físeáin atá in easnamh a chur ar ais ar ghléasanna níos sine @@ -1668,182 +1755,188 @@ Teorainneacha: • Úsáidfidh athsheinm físeáin níos mó sonraí idirlín ná VP9 nó AV1 • Ní úsáidfidh físeáin HDR AVC • Ní féidir le roinnt gléasanna AVC a bhrú" - - - Taispeáin roghchlár ardcháilíochta físeáin - Taispeántar roghchlár ardcháilíochta físeáin - Ní thaispeántar roghchlár ardcháilíochta físeáin - - - Cumasaigh sleamhnán a lorg - Tá sleamhnán le lorg cumasaithe - Níl sleamhnán le lorg cumasaithe - - - Ceadaigh Android VR AV1 - "Is é an códac físeáin AVC (H.264), VP9, nó AV1 + + + Taispeáin roghchlár ardcháilíochta físeáin + Taispeántar roghchlár ardcháilíochta físeáin + Ní thaispeántar roghchlár ardcháilíochta físeáin + + + Folaigh roghanna cáilíochta Préimhe + Tá roghanna cáilíochta Préimhe i bhfolach + Taispeántar roghanna cáilíochta Préimhe + + + Cumasaigh sleamhnán a lorg + Tá sleamhnán le lorg cumasaithe + Níl sleamhnán le lorg cumasaithe + + + Ceadaigh Android VR AV1 + "Is é an códac físeáin AVC (H.264), VP9, nó AV1 D'fhéadfadh go mbeadh fadhbanna le hathsheinm nó go gcaillfí frámaí" - Is é an códac físeáin AVC (H.264) nó VP9 - "D’fhéadfadh sé go n-úsáidfí díchódú bogearraí AV1 agus an socrú seo á chumasú. + Is é an códac físeáin AVC (H.264) nó VP9 + "D’fhéadfadh sé go n-úsáidfí díchódú bogearraí AV1 agus an socrú seo á chumasú. D’fhéadfadh sé go mbeadh stad nó go gcaillfí frámaí ag athsheinm físe le AV1." - Fo-éifeachtaí a fhalsúa - • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith - • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe - • Tá an roghchlár rian fuaime in easnamh - • Níl aon cóideac físe AV1 - • Níl toirt chobhsaí ar fáil - • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid - - • Níl an fuaim bhunaidh iallach ar fáil - Taispeáin i Staitisticí do nerds - Taispeántar cineál an chliaint i Staitisticí do nerds - Tá an cliant curtha i bhfolach i Staitisticí do nerds - - - - - YT Music ReVanced - Music ReVanced - Ceol - - - Maidir - Fógraí - Ginearálta - Seinnteoir - Ilchineálach - - - Folaigh fógraí físeáin - Tá fógraí físeáin i bhfolach - Taispeántar fógraí físeáin - - - Cumasaigh athdhéanamh buan - Tá athrá buan cumasaithe - Tá athrá buan díchumasaithe - - - Folaigh an cnaipe teilgthe - Tá an cnaipe teilgthe i bhfolach - Taispeántar an cnaipe teilgthe - Folaigh cnaipe na staire - Tá cnaipe na staire i bhfolach - Taispeántar cnaipe na staire - Folaigh cnaipe fógraí - Tá cnaipe fógraí i bhfolach - Taispeántar cnaipe fógraí - Folaigh cnaipe cuardaigh - Tá cnaipe cuardaigh i bhfolach - Taispeántar an cnaipe cuardaigh - - - Folaigh an barra catagóirí - Tá an barra catagóirí i bhfolach - Taispeántar an barra catagóirí - - - Athraigh dath an mhion-imreoir - Tá dath an mhion-imreoir ag teacht leis an imreoir lánscáileáin - Úsáideann an mion-imreoir an dath réamhshocraithe - - - Barra nascleanúna - Folaigh nó athraigh cnaipí an bharra nascleanúna - - Folaigh Baile - Tá cnaipe Baile folaithe - Taispeántar an cnaipe baile - - Folaigh Samplaí - Tá cnaipe na samplaí i bhfolach - Taispeántar cnaipe na samplaí - - Folaigh Iniúchadh - Tá an cnaipe iniúchadh i bhfolach - Taispeántar an cnaipe iniúchadh - - Folaigh Leabharlann - Tá cnaipe na leabharlainne i bhfolach - Taispeántar cnaipe na leabharlainne - - Folaigh an tUasghrádú - Tá an cnaipe uasghrádaithe i bhfolach - Taispeántar an cnaipe uasghrádaithe - Folaigh barra nascleanúna - Tá an barra nascleanúna i bhfolach - Taispeántar barra nascleanúna - Folaigh lipéid cnaipí nascleanúna - Tá lipéid i bhfolach - Taispeántar lipéid - - - Folaigh an lipéad \'Faigh Music Premium\' - Tá an lipéad i bhfolach - Taispeántar an lipéad - - - Folaigh an cnaipe uasghrádaithe - Tá an cnaipe i bhfolach - Taispeántar an cnaipe - - - - - Cuir bac ar fógraí fuaime - Cuirtear bac ar fhógraí fuaime - Tá fógraí fuaime díbhlocáilte - - - %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. - Tháinig earráid ar %s, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. - Bloc ar fhógraí físe leabaithe - Díchumasaithe - Proxy lonrúil - Seachfhreastalaí PurpleAdBlock - - - Bloc ar fhógraí físe - Cuirtear bac ar fhógraí físe - Déantar fógraí físe a dhíbhlocáil - - - Teachtaireacht scriosta - Taispeáin teachtaireachtaí scriosta - Ná taispeáin teachtaireachtaí scriosta - Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa - Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach - - - Éiligh Pointí Cainéil go huathoibríoch - Éilítear Pointí Cainéal go huathoibríoch - Ní éilítear Pointí Cainéal go huathoibríoch - - - - Cumasaigh modh dífhabhtú Twitch - Tá modh dífhabhtaithe Twitch cumasaithe (ní mholtar) - Tá modh dífhabhtaithe Twitch díchumasaithe - - - Socruithe ReVanced - Maidir - Maidir ReVanced - Blocáil Fógraí - Socruithe Blocála Fógraí - Comhrá - Socruithe comhrá - Ilchineálach - Socruithe Ilchineálach - Socruithe ginearálta - Socruithe eile - Fógraí taobh an chliaint - Fógraí surestream ar thaobh an fhreastalaí - Tá logaí dífhabhtú cumasaithe - Tá logaí dífhabhtaithe cumasaithe - Tá logaí dífhabhtaithe díchumasaithe - - + Fo-éifeachtaí a fhalsúa + • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith + • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe + • Tá an roghchlár rian fuaime in easnamh + • Níl aon cóideac físe AV1 + • Níl toirt chobhsaí ar fáil + • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid + + • Níl an fuaim bhunaidh iallach ar fáil + Taispeáin i Staitisticí do nerds + Taispeántar cineál an chliaint i Staitisticí do nerds + Tá an cliant curtha i bhfolach i Staitisticí do nerds + + + + + YT Music ReVanced + Music ReVanced + Ceol + + + + Maidir + Fógraí + Ginearálta + Seinnteoir + Ilchineálach + + + Folaigh fógraí físeáin + Tá fógraí físeáin i bhfolach + Taispeántar fógraí físeáin + + + Cumasaigh athdhéanamh buan + Tá athrá buan cumasaithe + Tá athrá buan díchumasaithe + + + Folaigh an cnaipe teilgthe + Tá an cnaipe teilgthe i bhfolach + Taispeántar an cnaipe teilgthe + Folaigh cnaipe na staire + Tá cnaipe na staire i bhfolach + Taispeántar cnaipe na staire + Folaigh cnaipe fógraí + Tá cnaipe fógraí i bhfolach + Taispeántar cnaipe fógraí + Folaigh cnaipe cuardaigh + Tá cnaipe cuardaigh i bhfolach + Taispeántar an cnaipe cuardaigh + + + Folaigh an barra catagóirí + Tá an barra catagóirí i bhfolach + Taispeántar an barra catagóirí + + + Athraigh dath an mhion-imreoir + Tá dath an mhion-imreoir ag teacht leis an imreoir lánscáileáin + Úsáideann an mion-imreoir an dath réamhshocraithe + + + Barra nascleanúna + Folaigh nó athraigh cnaipí an bharra nascleanúna + + Folaigh Baile + Tá cnaipe Baile folaithe + Taispeántar an cnaipe baile + + Folaigh Samplaí + Tá cnaipe na samplaí i bhfolach + Taispeántar cnaipe na samplaí + + Folaigh Iniúchadh + Tá an cnaipe iniúchadh i bhfolach + Taispeántar an cnaipe iniúchadh + + Folaigh Leabharlann + Tá cnaipe na leabharlainne i bhfolach + Taispeántar cnaipe na leabharlainne + + Folaigh an tUasghrádú + Tá an cnaipe uasghrádaithe i bhfolach + Taispeántar an cnaipe uasghrádaithe + Folaigh barra nascleanúna + Tá an barra nascleanúna i bhfolach + Taispeántar barra nascleanúna + Folaigh lipéid cnaipí nascleanúna + Tá lipéid i bhfolach + Taispeántar lipéid + + + Folaigh an lipéad \'Faigh Music Premium\' + Tá an lipéad i bhfolach + Taispeántar an lipéad + + + Folaigh an cnaipe uasghrádaithe + Tá an cnaipe i bhfolach + Taispeántar an cnaipe + + + + + Cuir bac ar fógraí fuaime + Cuirtear bac ar fhógraí fuaime + Tá fógraí fuaime díbhlocáilte + + + %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. + Tháinig earráid ar %s, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. + Bloc ar fhógraí físe leabaithe + Díchumasaithe + Proxy lonrúil + Seachfhreastalaí PurpleAdBlock + + + Bloc ar fhógraí físe + Cuirtear bac ar fhógraí físe + Déantar fógraí físe a dhíbhlocáil + + + Teachtaireacht scriosta + Taispeáin teachtaireachtaí scriosta + Ná taispeáin teachtaireachtaí scriosta + Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa + Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach + + + Éiligh Pointí Cainéil go huathoibríoch + Éilítear Pointí Cainéal go huathoibríoch + Ní éilítear Pointí Cainéal go huathoibríoch + + + + Cumasaigh modh dífhabhtú Twitch + Tá modh dífhabhtaithe Twitch cumasaithe (ní mholtar) + Tá modh dífhabhtaithe Twitch díchumasaithe + + + Socruithe ReVanced + Maidir + Maidir ReVanced + Blocáil Fógraí + Socruithe Blocála Fógraí + Comhrá + Socruithe comhrá + Ilchineálach + Socruithe Ilchineálach + Socruithe ginearálta + Socruithe eile + Fógraí taobh an chliaint + Fógraí surestream ar thaobh an fhreastalaí + Logáil dífhabhtaithe + Tá logaí dífhabhtaithe cumasaithe + Tá logaí dífhabhtaithe díchumasaithe + + diff --git a/patches/src/main/resources/addresources/values-gl-rES/strings.xml b/patches/src/main/resources/addresources/values-gl-rES/strings.xml index 3a40645452..084e237d60 100644 --- a/patches/src/main/resources/addresources/values-gl-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-gl-rES/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Desactivar iconas en negrita + As iconas non están en negrita + As iconas están en negrita + GmsCore + Configuracións relacionadas con GmsCore + Buscar actualizacións de GmsCore + A busca de actualizacións está activada + A comprobación de actualizacións está desactivada + Abrir a configuración de GmsCore + Configuración de GmsCore + MicroG GmsCore non está instalado. Instáleo. + Precísase unha acción + Non se puido comprobar as actualizacións de MicroG GmsCore + Unha nova versión (%1$s) de MicroG GmsCore está dispoñible. Actualmente, estás a usar a versión %2$s. + "MicroG GmsCore non ten permiso para executarse en segundo plano. + +Siga a guía \"Non mates a miña aplicación\" para o seu teléfono e aplique as instrucións á súa instalación de MicroG. + +Isto é necesario para que a aplicación funcione." + Abrir sitio web + Cancelar + "As optimizacións da batería de MicroG GmsCore deben desactivarse para evitar problemas. + +Desactivar as optimizacións da batería para MicroG non afectará negativamente o uso da batería. + +Toque o botón continuar e permita os cambios de optimización." + Continuar - + + Reinicia a aplicación para usar esta característica + Rexistrar búfer de protocolo + Os rexistros de depuración inclúen o búfer de protocolo + Os rexistros de depuración non inclúen o búfer de protocolo + "Activar esta configuración rexistrará datos de deseño adicionais, incluído o texto en pantalla para algúns compoñentes da interface de usuario. + +Isto pode axudar a identificar compoñentes ao crear filtros personalizados. + +Non obstante, activalo tamén rexistrará algúns datos de usuario, como o seu enderezo IP." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Ocultar o estante da tenda do creador + O estante da tenda do creador debaixo do reprodutor de vídeo está oculto + O estante da tenda do creador debaixo do reprodutor de vídeo está visible + Ocultar a sección de comentarios debaixo dos vídeos na fonte de inicio + A sección de comentarios debaixo dos vídeos na fonte de inicio está oculta + A sección de comentarios debaixo dos vídeos na fonte de inicio está visible + + Ocultar o botón \'Últimos vídeos\' + O botón de Últimos vídeos está oculto + O botón de Últimos vídeos está visible + + Ocultar resultados de busca web + Os resultados de busca web están ocultos + Os resultados de busca web están visibles + Ocultar a sección \'Tamén che pode gustar\' + A sección \'Tamén che pode gustar\' está oculta + A sección \'Tamén che pode gustar\' está visible + This button usually appears in the video player for certain videos. --> + + Ocultar o botón \'Reprodución do chat en directo\' + O botón de reprodución do chat en directo na superposición do reprodutor está oculto + O botón de reprodución do chat en directo na superposición do reprodutor está visible + Ocultar o título do vídeo + O título do vídeo na superposición do reprodutor está oculto + O título do vídeo na superposición do reprodutor está visible + Ocultar \'Progreso do curso\' + A sección de progreso do curso está oculta + A sección de progreso do curso está visible + Ocultar Explorar + As seccións Explorar este curso e Explorar o podcast están ocultas + As seccións Explorar este curso e Explorar o podcast están visibles + Ocultar \'Explorar este curso\' + A sección Explorar este curso está oculta + A sección Explorar este curso está visible + Ocultar \'Explorar o podcast\' + A sección Explorar o podcast está oculta + A sección Explorar o podcast está visible + Ocultar \'Lugares destacados\' + A sección Lugares destacados está oculta + A sección Lugares destacados está visible + Activar o filtro do menú despregable da fonte + O filtro do menú despregable da fonte está activado + O filtro do menú despregable da fonte está desactivado + Filtro do menú despregable da fonte + Introduce os nomes do menú despregable para filtrar, un por liña + Ocultar Xogos + A sección de Xogos está oculta + A sección de Xogos está visible + Ocultar Música + A sección de Música está oculta + A sección de Música está visible + Ocultar Cuestionarios + A sección de Cuestionarios está oculta + A sección de Cuestionarios está visible + Activar o filtro de pestanas de canle + O filtro de pestanas de canle está activado + O filtro de pestanas de canle está desactivado + Filtro de pestanas de canle + Introduce os nomes das pestanas de canle para filtrar, un por liña + "Limitacións: +• Os estantes de Shorts, as páxinas de canle e os resultados de busca aínda poden mostrar o número de visualizacións. +• Esta característica non funciona co factor de forma automotriz." + "Limitacións: +• Os estantes de Shorts, as páxinas de canle e os resultados de busca aínda poden mostrar as horas de carga. +• Esta característica non funciona co factor de forma automotriz." + "Os resultados de inicio/subscricións/busca fíltranse para ocultar contido que coincide con frases clave + +Limitacións: +• Os Shorts non se poden ocultar por nome de canle +• Algúns compoñentes da interface de usuario poden non estar ocultos +• A busca dunha palabra clave pode non mostrar resultados" - + Os anuncios a pantalla completa están ocultos + Ocultar anuncios emerxentes do reprodutor + Os anuncios emerxentes do reprodutor están ocultos + Os anuncios emerxentes do reprodutor están visibles + O banner de ver produtos na superposición do reprodutor está oculto + O banner de ver produtos na superposición do reprodutor está visible + Ocultar as promocións de YouTube Premium + As promocións de YouTube Premium están ocultas + As promocións de YouTube Premium están visibles - - + + URL copiada ao portapapeis + URL con marca de tempo copiada + Mostrar o botón de copiar URL do vídeo + O botón de copiar URL do vídeo está visible. Toca para copiar a URL do vídeo. Mantén premido para copiar coa marca de tempo + O botón de copiar URL do vídeo non está visible + Mostrar o botón de copiar URL con marca de tempo + O botón de copiar URL con marca de tempo está visible. Toca para copiar a URL do vídeo coa marca de tempo. Mantén premido para copiar sen marca de tempo + O botón de copiar URL con marca de tempo non está visible + - + + Desactivar a ventá emerxente \'Iniciar sesión na TV\' + A ventá emerxente de inicio de sesión na TV está desactivada + A ventá emerxente de inicio de sesión na TV está activada + - + + Activar tocar para buscar + Tocar para buscar está activado + Tocar para buscar está desactivado + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + A ocultación pode non funcionar para algunhas contas de usuario. - + + Botóns de navegación + Ocultar ou cambiar os botóns da barra de navegación + Ocultar Inicio + O botón de Inicio está oculto + O botón de Inicio está visible + Ocultar Shorts + O botón de Shorts está oculto + O botón de Shorts está visible + Ocultar Crear + O botón Crear está oculto + O botón Crear está visible + Ocultar Subscricións + O botón de Subscricións está oculto + O botón de Subscricións está visible + Ocultar Notificacións + O botón de Notificacións está oculto + O botón de Notificacións está visible + Intercambiar Crear con Notificacións + O botón Crear intercámbiase co botón Notificacións + O botón Crear non se intercámbiase co botón Notificacións + Se o cambio desta configuración non ten efecto, tenta cambiar ao modo de incógnito. + Ocultar as etiquetas dos botóns de navegación + As etiquetas están ocultas + As etiquetas están visibles + Activar botóns de navegación estreitos + O espazado entre os botóns de navegación é estreito + O espazado entre os botóns de navegación é normal + Activar as animacións da barra de navegación + As transicións de navegación están animadas + As transicións de navegación non están animadas + Desactivar a barra de estado translúcida + A barra de estado é opaca + A barra de estado é opaca ou translúcida + "Limitacións: +• Pode aparecer unha barra negra na parte superior do reprodutor de vídeo. +• Nalgúns dispositivos, activar esta característica pode cambiar a barra de navegación do sistema a transparente." + Desactivar a barra translúcida clara + A barra de navegación en modo claro é opaca + A barra de navegación en modo claro é opaca ou translúcida + Desactivar a barra translúcida escura + A barra de navegación en modo escuro é opaca + A barra de navegación en modo escuro é opaca ou translúcida + Barra de ferramentas + Ocultar ou cambiar compoñentes da barra de ferramentas + Ocultar o botón Crear + O botón Crear está oculto + O botón Crear está visible + Ocultar o botón Notificacións + O botón Notificacións está oculto + O botón Notificacións está visible + Ocultar o botón Buscar + O botón Buscar está oculto + O botón Buscar está visible. + Activar a barra de busca ampla + A barra de busca ampla está activada + A barra de busca ampla está desactivada @@ -126,25 +315,67 @@ Second \"item\" text" + Ocultar o botón Contraer + O botón Contraer está oculto + O botón Contraer está visible + Ocultar o botón Pantalla completa + O botón Pantalla completa está oculto + O botón Pantalla completa está visible + + + Ocultar as tarxetas finais + As tarxetas finais están ocultas + As tarxetas finais están visibles - + Activar barra de busca grande en pantalla completa + A barra de busca a pantalla completa é de tamaño grande + A barra de busca a pantalla completa é de tamaño normal + Ocultar Shorts na páxina da canle + Oculto na páxina da canle + Visible na páxina da canle + Ocultar Shorts na descrición do vídeo + Oculto na descrición do vídeo + Visible na descrición do vídeo + Ocultar o botón de IA + O botón de IA está oculto + O botón de IA está visible + Ocultar a etiqueta \'Dobrado automaticamente\' + A etiqueta de Dobrado automaticamente está oculta + A etiqueta de Dobrado automaticamente está visible + - + + Ocultar a previsualización de reprodución automática + A previsualización de reprodución automática está oculta + A previsualización de reprodución automática está visible + + + Ocultar vídeo suxerido da pantalla final + "O vídeo suxerido da pantalla final está oculto cando a reprodución automática está desactivada + +A reprodución automática pódese cambiar na configuración de YouTube: +Configuración → Reprodución → Reproducir seguinte vídeo automaticamente" + O vídeo suxerido da pantalla final está visible + - + + Ocultar os paneis emerxentes do reprodutor + Os paneis emerxentes do reprodutor están ocultos + Os paneis emerxentes do reprodutor están visibles + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Só para usar en vídeos musicais. Seccións de vídeos musicais sen música, que non estean xa cubertas por outra categoría + Non se pode enviar o segmento: %s + "Non se pode enviar o segmento. +Xa existe" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Desactivado + Cor + Branco e negro + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Desactivar a retroalimentación háptica ao tocar e manter premido + A retroalimentación háptica ao tocar e manter premido está desactivada + A retroalimentación háptica ao tocar e manter premido está activada + @@ -200,6 +441,11 @@ Second \"item\" text" + + Ocultar as opcións de calidade Premium + As opcións de calidade Premium están ocultas + As opcións de calidade Premium están visibles + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml index 3a40645452..d64fb1c986 100644 --- a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml @@ -27,18 +27,47 @@ Second \"item\" text" + બોલ્ડ આયકન્સ અક્ષમ કરો + આયકન્સ બોલ્ડ નથી + આયકન્સ બોલ્ડ છે + GmsCore + GmsCore સંબંધિત સેટિંગ્સ + GmsCore અપડેટ્સ માટે તપાસો + અપડેટ્સ માટે તપાસ સક્ષમ છે + અપડેટ્સ માટે તપાસવું અક્ષમ છે + GmsCore સેટિંગ્સ ખોલો + GmsCore ની સેટિંગ્સ + MicroG GmsCore ઇન્સ્ટોલ કરેલ નથી. તેને ઇન્સ્ટોલ કરો. + કાર્યવાહી જરૂરી છે + MicroG GmsCore અપડેટ્સ માટે તપાસવામાં નિષ્ફળ + MicroG GmsCore નું નવું વર્ઝન (%1$s) ઉપલબ્ધ છે. હાલમાં, તમે વર્ઝન %2$s નો ઉપયોગ કરી રહ્યા છો. + "MicroG GmsCore ને બેકગ્રાઉન્ડમાં ચાલવાની પરવાનગી નથી.\n\nતમારા ફોન માટે \"મારી એપને બંધ કરશો નહીં\" માર્ગદર્શિકાને અનુસરો, અને MicroG ઇન્સ્ટોલેશન પર સૂચનાઓ લાગુ કરો.\n\nએપ્લિકેશનને કાર્ય કરવા માટે આ જરૂરી છે." + વેબસાઇટ ખોલો + રદ કરો + "સમસ્યાઓ અટકાવવા માટે MicroG GmsCore બેટરી ઑપ્ટિમાઇઝેશનને અક્ષમ કરવા આવશ્યક છે.\n\nMicroG માટે બેટરી ઑપ્ટિમાઇઝેશનને અક્ષમ કરવાથી બેટરીના વપરાશ પર નકારાત્મક અસર નહીં થાય.\n\નચાલુ રાખો બટનને ટેપ કરો અને ઑપ્ટિમાઇઝેશન ફેરફારોને મંજૂરી આપો." + ચાલુ રાખો - + + આ સુવિધાનો ઉપયોગ કરવા માટે એપ્લિકેશન ફરી શરૂ કરો. + લોગ પ્રોટોકોલ બફર + ડિબગ લોગમાં પ્રોટો બફર શામેલ છે + ડિબગ લોગમાં પ્રોટો બફર શામેલ નથી + "આ સેટિંગને સક્ષમ કરવાથી કેટલાક UI ઘટકો માટે ઑન-સ્ક્રીન ટેક્સ્ટ સહિત વધારાનો લેઆઉટ ડેટા લૉગ થશે. + +આ કસ્ટમ ફિલ્ટર્સ બનાવતી વખતે ઘટકોને ઓળખવામાં મદદ કરી શકે છે. + +જોકે, આને સક્ષમ કરવાથી તમારો IP ઍડ્રેસ જેવી કેટલીક વપરાશકર્તા ડેટા પણ લૉગ થશે." + @@ -48,40 +77,135 @@ Second \"item\" text" - + સર્જક સ્ટોર શેલ્ફ છુપાવો + વિડિઓ પ્લેયર હેઠળની સર્જક સ્ટોર શેલ્ફ છુપાવેલ છે + વિડિઓ પ્લેયર હેઠળની સર્જક સ્ટોર શેલ્ફ બતાવવામાં આવી છે + હોમ ફીડમાં વીડિયો હેઠળ ટિપ્પણીઓ વિભાગ છુપાવો + હોમ ફીડમાં વીડિયો હેઠળ ટિપ્પણીઓ વિભાગ છુપાવેલ છે + હોમ ફીડમાં વીડિયો હેઠળ ટિપ્પણીઓ વિભાગ બતાવવામાં આવ્યો છે + + \'તાજેતરના વીડિયો\' બટન છુપાવો + તાજેતરના વીડિયો બટન છુપાવેલ છે + તાજેતરના વીડિયો બટન બતાવવામાં આવ્યું છે + + વેબ શોધ પરિણામો છુપાવો + વેબ શોધ પરિણામો છુપાવેલ છે + વેબ શોધ પરિણામો બતાવવામાં આવ્યા છે + \'તમને ગમશે\' વિભાગ છુપાવો + \'તમને ગમશે\' વિભાગ છુપાવેલ છે + \'તમને ગમશે\' વિભાગ બતાવવામાં આવ્યો છે + This button usually appears in the video player for certain videos. --> + + \'લાઇવ ચેટ રિપ્લે\' બટન છુપાવો + પ્લેયર ઓવરલેમાં લાઇવ ચેટ રિપ્લે બટન છુપાવેલ છે + પ્લેયર ઓવરલેમાં લાઇવ ચેટ રિપ્લે બટન બતાવવામાં આવ્યું છે + વીડિયોનું શીર્ષક છુપાવો + પ્લેયર ઓવરલેમાં વીડિયોનું શીર્ષક છુપાવેલ છે + પ્લેયર ઓવરલેમાં વીડિયોનું શીર્ષક બતાવવામાં આવ્યું છે + \'કોર્સ પ્રગતિ\' છુપાવો + કોર્સ પ્રગતિ વિભાગ છુપાવેલ છે + કોર્સ પ્રગતિ વિભાગ બતાવવામાં આવ્યો છે + એક્સપ્લોર છુપાવો + આ કોર્સ એક્સપ્લોર કરો અને પોડકાસ્ટ વિભાગો એક્સપ્લોર કરો છુપાવેલ છે + આ કોર્સ એક્સપ્લોર કરો અને પોડકાસ્ટ વિભાગો એક્સપ્લોર કરો બતાવવામાં આવ્યા છે + \'આ કોર્સ એક્સપ્લોર કરો\' છુપાવો + આ કોર્સ એક્સપ્લોર કરો વિભાગ છુપાવેલ છે + આ કોર્સ એક્સપ્લોર કરો વિભાગ બતાવવામાં આવ્યો છે + \'પોડકાસ્ટ એક્સપ્લોર કરો\' છુપાવો + પોડકાસ્ટ એક્સપ્લોર કરો વિભાગ છુપાવેલ છે + પોડકાસ્ટ એક્સપ્લોર કરો વિભાગ બતાવવામાં આવ્યો છે + \'વૈશિષ્ટ્યકૃત સ્થાનો\' છુપાવો + વૈશિષ્ટ્યકૃત સ્થાનો વિભાગ છુપાવેલ છે + વૈશિષ્ટ્યકૃત સ્થાનો વિભાગ બતાવવામાં આવ્યો છે + ફીડ ફ્લાયઆઉટ મેનુ ફિલ્ટર સક્ષમ કરો + ફીડ ફ્લાયઆઉટ મેનુ ફિલ્ટર સક્ષમ છે + ફીડ ફ્લાયઆઉટ મેનુ ફિલ્ટર અક્ષમ છે + ફીડ ફ્લાયઆઉટ મેનુ ફિલ્ટર + ફિલ્ટર કરવા માટે ફ્લાયઆઉટ મેનુના નામ દાખલ કરો, દરેક લીટી પર એક + ગેમિંગ છુપાવો + ગેમિંગ વિભાગ છુપાવેલ છે + ગેમિંગ વિભાગ બતાવવામાં આવ્યો છે + સંગીત છુપાવો + સંગીત વિભાગ છુપાવેલ છે + સંગીત વિભાગ બતાવવામાં આવ્યો છે + ક્વિઝ છુપાવો + ક્વિઝ વિભાગ છુપાવેલ છે + ક્વિઝ વિભાગ બતાવવામાં આવ્યો છે + ચેનલ ટેબ ફિલ્ટર સક્ષમ કરો + ચેનલ ટેબ ફિલ્ટર સક્ષમ છે + ચેનલ ટેબ ફિલ્ટર અક્ષમ છે + ચેનલ ટેબ ફિલ્ટર + ફિલ્ટર કરવા માટે ચેનલ ટેબના નામ દાખલ કરો, દરેક લીટી પર એક + "મર્યાદાઓ: +• Shorts શેલ્ફ, ચેનલ પેજ અને શોધ પરિણામો હજુ પણ જોવાયાની સંખ્યા દર્શાવી શકે છે. +• આ સુવિધા ઓટોમોટિવ ફોર્મ ફેક્ટર સાથે કામ કરતી નથી." + "મર્યાદાઓ: +• Shorts શેલ્ફ, ચેનલ પેજ અને શોધ પરિણામો હજુ પણ અપલોડ સમય દર્શાવી શકે છે. +• આ સુવિધા ઓટોમોટિવ ફોર્મ ફેક્ટર સાથે કામ કરતી નથી." + "કીવર્ડ શબ્દસમૂહો સાથે મેળ ખાતી સામગ્રી છુપાવવા માટે હોમ/સબ્સ્ક્રિપ્શન્સ/શોધ પરિણામો ફિલ્ટર કરવામાં આવે છે + +મર્યાદાઓ: +• Shorts ને ચેનલના નામથી છુપાવી શકાતા નથી +• કેટલાક UI ઘટકો છુપાવી શકાય નહીં +• કીવર્ડ માટે શોધ કરવાથી કોઈ પરિણામો ન દેખાઈ શકે છે" - + પૂર્ણસ્ક્રીન જાહેરાતો છુપાવેલ છે + પ્લેયર પોપઅપ જાહેરાતો છુપાવો + પ્લેયર પોપઅપ જાહેરાતો છુપાવેલ છે + પ્લેયર પોપઅપ જાહેરાતો બતાવવામાં આવી છે + પ્લેયર ઓવરલેમાં પ્રોડક્ટ્સ બેનર છુપાવેલ છે + પ્લેયર ઓવરલેમાં પ્રોડક્ટ્સ બેનર બતાવવામાં આવ્યું છે + YouTube Premium પ્રમોશન છુપાવો + YouTube Premium પ્રમોશન છુપાવેલ છે + YouTube Premium પ્રમોશન બતાવવામાં આવ્યા છે - - + + URL ક્લિપબોર્ડ પર કૉપિ કરવામાં આવ્યું + ટાઇમસ્ટેમ્પ સાથેનું URL કૉપિ કરવામાં આવ્યું + વીડિયો URL કૉપિ કરો બટન બતાવો + વીડિયો URL કૉપિ કરો બટન બતાવવામાં આવ્યું છે. વીડિયો URL કૉપિ કરવા માટે ટેપ કરો. ટાઇમસ્ટેમ્પ સાથે કૉપિ કરવા માટે ટેપ કરીને પકડી રાખો + વીડિયો URL કૉપિ કરો બટન બતાવવામાં આવ્યું નથી + ટાઇમસ્ટેમ્પ URL કૉપિ કરો બટન બતાવો + ટાઇમસ્ટેમ્પ URL કૉપિ કરો બટન બતાવવામાં આવ્યું છે. ટાઇમસ્ટેમ્પ સાથે વીડિયો URL કૉપિ કરવા માટે ટેપ કરો. ટાઇમસ્ટેમ્પ વિના કૉપિ કરવા માટે ટેપ કરીને પકડી રાખો + ટાઇમસ્ટેમ્પ URL કૉપિ કરો બટન બતાવવામાં આવ્યું નથી + - + + \'ટીવીમાં સાઇન ઇન કરો\' પોપઅપ અક્ષમ કરો + ટીવીમાં સાઇન ઇન કરો પોપઅપ અક્ષમ છે + ટીવીમાં સાઇન ઇન કરો પોપઅપ સક્ષમ છે + - + + ટેપ કરીને સીક સક્ષમ કરો + ટેપ કરીને સીક સક્ષમ છે + ટેપ કરીને સીક અક્ષમ છે + @@ -89,25 +213,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + કેટલાક વપરાશકર્તા એકાઉન્ટ્સ માટે છુપાવવું કામ ન પણ કરી શકે. - + + નેવિગેશન બટનો + નેવિગેશન બાર બટનો છુપાવો અથવા બદલો + હોમ છુપાવો + હોમ બટન છુપાવેલ છે + હોમ બટન બતાવવામાં આવ્યું છે + Shorts છુપાવો + Shorts બટન છુપાવેલ છે + Shorts બટન બતાવવામાં આવ્યું છે + બનાવો છુપાવો + બનાવો બટન છુપાવેલ છે + બનાવો બટન બતાવવામાં આવ્યું છે + સબ્સ્ક્રિપ્શન્સ છુપાવો + સબ્સ્ક્રિપ્શન્સ બટન છુપાવેલ છે + સબ્સ્ક્રિપ્શન્સ બટન બતાવવામાં આવ્યું છે + સૂચનાઓ છુપાવો + સૂચનાઓ બટન છુપાવેલ છે + સૂચનાઓ બટન બતાવવામાં આવ્યું છે + સૂચનાઓ સાથે બનાવો ને સ્વિચ કરો + બનાવો બટન ને સૂચનાઓ બટન સાથે સ્વિચ કરવામાં આવ્યું છે + બનાવો બટન ને સૂચનાઓ બટન સાથે સ્વિચ કરવામાં આવ્યું નથી + જો આ સેટિંગ બદલવાથી અસર ન થાય, તો છુપા મોડ (Incognito mode) પર સ્વિચ કરવાનો પ્રયાસ કરો. + નેવિગેશન બટન લેબલો છુપાવો + લેબલો છુપાવેલ છે + લેબલો બતાવવામાં આવ્યા છે + સાંકડા નેવિગેશન બટનો સક્ષમ કરો + નેવિગેશન બટનો વચ્ચેની જગ્યા સાંકડી છે + નેવિગેશન બટનો વચ્ચેની જગ્યા સામાન્ય છે + નેવિગેશન બાર એનિમેશન સક્ષમ કરો + નેવિગેશન સંક્રમણો એનિમેટેડ છે + નેવિગેશન સંક્રમણો એનિમેટેડ નથી + અર્ધપારદર્શક સ્ટેટસ બાર અક્ષમ કરો + સ્ટેટસ બાર અપારદર્શક છે + સ્ટેટસ બાર અપારદર્શક અથવા અર્ધપારદર્શક છે + "મર્યાદાઓ: +• વીડિયો પ્લેયરની ટોચ પર કાળો બાર દેખાઈ શકે છે. +• કેટલાક ઉપકરણો પર, આ સુવિધા સક્ષમ કરવાથી સિસ્ટમ નેવિગેશન બાર પારદર્શક થઈ શકે છે." + લાઇટ અર્ધપારદર્શક બાર અક્ષમ કરો + લાઇટ મોડ નેવિગેશન બાર અપારદર્શક છે + લાઇટ મોડ નેવિગેશન બાર અપારદર્શક અથવા અર્ધપારદર્શક છે + ડાર્ક અર્ધપારદર્શક બાર અક્ષમ કરો + ડાર્ક મોડ નેવિગેશન બાર અપારદર્શક છે + ડાર્ક મોડ નેવિગેશન બાર અપારદર્શક અથવા અર્ધપારદર્શક છે + ટૂલબાર + ટૂલબાર ઘટકો છુપાવો અથવા બદલો + બનાવો બટન છુપાવો + બનાવો બટન છુપાવેલ છે + બનાવો બટન બતાવવામાં આવ્યું છે + સૂચનાઓ બટન છુપાવો + સૂચનાઓ બટન છુપાવેલ છે + સૂચનાઓ બટન બતાવવામાં આવ્યું છે + શોધ બટન છુપાવો + શોધ બટન છુપાવેલ છે + શોધ બટન બતાવવામાં આવ્યું છે. + પહોળી શોધ બાર સક્ષમ કરો + પહોળી શોધ બાર સક્ષમ છે + પહોળી શોધ બાર અક્ષમ છે @@ -126,25 +307,67 @@ Second \"item\" text" + કોલેપ્સ બટન છુપાવો + કોલેપ્સ બટન છુપાવેલ છે + કોલેપ્સ બટન બતાવવામાં આવ્યું છે + પૂર્ણસ્ક્રીન બટન છુપાવો + પૂર્ણસ્ક્રીન બટન છુપાવેલ છે + પૂર્ણસ્ક્રીન બટન બતાવવામાં આવ્યું છે + + + અંતિમ સ્ક્રીન કાર્ડ્સ છુપાવો + અંતિમ સ્ક્રીન કાર્ડ્સ છુપાવેલ છે + અંતિમ સ્ક્રીન કાર્ડ્સ બતાવવામાં આવ્યા છે - + પૂર્ણસ્ક્રીન મોટી સીકબાર સક્ષમ કરો + પૂર્ણસ્ક્રીન સીકબાર મોટી સાઇઝની છે + પૂર્ણસ્ક્રીન સીકબાર સામાન્ય સાઇઝની છે + ચેનલ પેજમાં Shorts છુપાવો + ચેનલ પેજમાં છુપાવેલ છે + ચેનલ પેજમાં બતાવવામાં આવ્યું છે + વીડિયો વર્ણનમાં Shorts છુપાવો + વીડિયો વર્ણનમાં છુપાવેલ છે + વીડિયો વર્ણનમાં બતાવવામાં આવ્યું છે + AI બટન છુપાવો + AI બટન છુપાવેલ છે + AI બટન બતાવવામાં આવ્યું છે + \'ઑટો-ડબ્ડ\' લેબલ છુપાવો + ઑટો-ડબ્ડ લેબલ છુપાવેલ છે + ઑટો-ડબ્ડ લેબલ બતાવવામાં આવ્યું છે + - + + ઑટોપ્લે પૂર્વાવલોકન છુપાવો + ઑટોપ્લે પૂર્વાવલોકન છુપાવેલ છે + ઑટોપ્લે પૂર્વાવલોકન બતાવવામાં આવ્યું છે + + + અંતિમ સ્ક્રીન સૂચવેલ વીડિયો છુપાવો + "ઑટોપ્લે બંધ હોય ત્યારે અંતિમ સ્ક્રીન સૂચવેલ વીડિયો છુપાવેલ છે + +ઑટોપ્લે YouTube સેટિંગ્સમાં બદલી શકાય છે: +સેટિંગ્સ → પ્લેબેક → આગલો વીડિયો ઑટોપ્લે કરો" + અંતિમ સ્ક્રીન સૂચવેલ વીડિયો બતાવવામાં આવ્યો છે + - + + પ્લેયર પોપઅપ પેનલ છુપાવો + પ્લેયર પોપઅપ પેનલ છુપાવેલ છે + પ્લેયર પોપઅપ પેનલ બતાવેલ છે + @@ -155,10 +378,12 @@ Second \"item\" text" - - + ફક્ત સંગીત વીડિયોમાં ઉપયોગ માટે. સંગીત વીડિયોના સંગીત વિનાના વિભાગો, જે અન્ય શ્રેણી દ્વારા પહેલેથી જ આવરી લેવામાં આવ્યા નથી + સેગમેન્ટ સબમિટ કરી શકાતો નથી: %s + "સેગમેન્ટ સબમિટ કરી શકાતો નથી. +પહેલેથી જ અસ્તિત્વમાં છે" @@ -170,7 +395,11 @@ Second \"item\" text" - + + અક્ષમ કરેલ + રંગ + કાળો અને સફેદ + @@ -187,7 +416,11 @@ Second \"item\" text" - + + ટેપ અને હોલ્ડ હેપ્ટિક્સ અક્ષમ કરો + ટેપ અને હોલ્ડ હેપ્ટિક્સ અક્ષમ છે + ટેપ અને હોલ્ડ હેપ્ટિક્સ સક્ષમ છે + @@ -200,6 +433,11 @@ Second \"item\" text" + + પ્રીમિયમ ગુણવત્તા વિકલ્પો છુપાવો + પ્રીમિયમ ગુણવત્તા વિકલ્પો છુપાવેલ છે + પ્રીમિયમ ગુણવત્તા વિકલ્પો બતાવવામાં આવ્યા છે + @@ -207,7 +445,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml index f9e796069a..32e8454836 100644 --- a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml @@ -27,12 +27,39 @@ Second \"item\" text" + बोल्ड आइकन अक्षम करें + आइकन बोल्ड नहीं हैं + आइकन बोल्ड हैं + GmsCore + जीएमएस कोर से संबंधित सेटिंग्स + जीएमएस कोर अपडेट के लिए जांचें + अपडेट के लिए जांच सक्षम है + अपडेट की जांच करना अक्षम है + जीएमएसकोर सेटिंग्स खोलें + जीएमएसकोर की सेटिंग्स + MicroG GmsCore स्थापित नहीं है। इसे स्थापित करें। + कार्रवाई आवश्यक है + MicroG GmsCore अपडेट की जांच करने में विफल रहा + MicroG GmsCore का एक नया संस्करण (%1$s) उपलब्ध है। वर्तमान में, आप संस्करण %2$s का उपयोग कर रहे हैं। + "MicroG GmsCore को बैकग्राउंड में चलने की अनुमति नहीं है। + +अपने फोन के लिए \"मेरे ऐप को न मारें\" मार्गदर्शिका का पालन करें, और निर्देशों को अपनी MicroG इंस्टॉलेशन पर लागू करें। + +यह ऐप के काम करने के लिए आवश्यक है।" + वेबसाइट खोलें + रद्द करें + "समस्याओं को रोकने के लिए MicroG GmsCore बैटरी अनुकूलन अक्षम होना चाहिए। + +MicroG के लिए बैटरी अनुकूलन अक्षम करने से बैटरी उपयोग पर नकारात्मक प्रभाव नहीं पड़ेगा। + +जारी रखें बटन पर टैप करें और अनुकूलन परिवर्तनों की अनुमति दें।" + जारी रखें प्लेबैक समस्याओं को रोकने के लिए क्लाइंट वीडियो स्ट्रीम को स्पूफ करें @@ -40,7 +67,17 @@ Second \"item\" text" - + + इस सुविधा का उपयोग करने के लिए ऐप को पुनरारंभ करें। + प्रोटोकॉल बफर लॉग करें + डीबग लॉग में प्रोटो बफर शामिल हैं + डीबग लॉग में प्रोटो बफर शामिल नहीं हैं + "इस सेटिंग को सक्षम करने से अतिरिक्त लेआउट डेटा लॉग होगा, जिसमें कुछ यूआई घटकों के लिए ऑन-स्क्रीन टेक्स्ट भी शामिल है। + +यह कस्टम फ़िल्टर बनाते समय घटकों की पहचान करने में मदद कर सकता है। + +हालांकि, इसे सक्षम करने से आपका आईपी पता जैसे कुछ उपयोगकर्ता डेटा भी लॉग होगा।" + @@ -50,40 +87,135 @@ Second \"item\" text" - + निर्माता स्टोर शेल्फ छिपाएँ + वीडियो प्लेयर के नीचे निर्माता स्टोर शेल्फ छिपा हुआ है + वीडियो प्लेयर के नीचे निर्माता स्टोर शेल्फ दिखाया गया है + होम फ़ीड में वीडियो के नीचे टिप्पणी अनुभाग छिपाएँ + होम फ़ीड में वीडियो के नीचे टिप्पणी अनुभाग छिपा हुआ है + होम फ़ीड में वीडियो के नीचे टिप्पणी अनुभाग दिखाया गया है + + \'नवीनतम वीडियो\' बटन छिपाएँ + नवीनतम वीडियो बटन छिपा हुआ है + नवीनतम वीडियो बटन दिखाया गया है + + वेब खोज परिणाम छिपाएँ + वेब खोज परिणाम छिपे हुए हैं + वेब खोज परिणाम दिखाए गए हैं + \'आपको पसंद आ सकता है\' अनुभाग छिपाएँ + \'आपको पसंद आ सकता है\' अनुभाग छिपा हुआ है + \'आपको पसंद आ सकता है\' अनुभाग दिखाया गया है + This button usually appears in the video player for certain videos. --> + + \'लाइव चैट रीप्ले\' बटन छिपाएँ + प्लेयर ओवरले में लाइव चैट रीप्ले बटन छिपा हुआ है + प्लेयर ओवरले में लाइव चैट रीप्ले बटन दिखाया गया है + वीडियो शीर्षक छिपाएँ + प्लेयर ओवरले में वीडियो शीर्षक छिपा हुआ है + प्लेयर ओवरले में वीडियो शीर्षक दिखाया गया है + \'कोर्स प्रगति\' छिपाएँ + कोर्स प्रगति अनुभाग छिपा हुआ है + कोर्स प्रगति अनुभाग दिखाया गया है + एक्सप्लोर छिपाएँ + इस कोर्स को एक्सप्लोर करें और पॉडकास्ट अनुभागों को एक्सप्लोर करें छिपा हुआ है + इस कोर्स को एक्सप्लोर करें और पॉडकास्ट अनुभागों को एक्सप्लोर करें दिखाया गया है + \'इस कोर्स को एक्सप्लोर करें\' छिपाएँ + \'इस कोर्स को एक्सप्लोर करें\' अनुभाग छिपा हुआ है + \'इस कोर्स को एक्सप्लोर करें\' अनुभाग दिखाया गया है + \'पॉडकास्ट एक्सप्लोर करें\' छिपाएँ + पॉडकास्ट एक्सप्लोर करें अनुभाग छिपा हुआ है + पॉडकास्ट एक्सप्लोर करें अनुभाग दिखाया गया है + \'विशेष स्थान\' छिपाएँ + विशेष स्थान अनुभाग छिपा हुआ है + विशेष स्थान अनुभाग दिखाया गया है + फ़ीड फ़्लायआउट मेनू फ़िल्टर सक्षम करें + फ़ीड फ़्लायआउट मेनू फ़िल्टर सक्षम है + फ़ीड फ़्लायआउट मेनू फ़िल्टर अक्षम है + फ़ीड फ़्लायआउट मेनू फ़िल्टर + फ़िल्टर करने के लिए फ़्लायआउट मेनू नाम दर्ज करें, प्रत्येक पंक्ति में एक + गेमिंग छिपाएँ + गेमिंग अनुभाग छिपा हुआ है + गेमिंग अनुभाग दिखाया गया है + संगीत छिपाएँ + संगीत अनुभाग छिपा हुआ है + संगीत अनुभाग दिखाया गया है + क्विज़ छिपाएँ + क्विज़ अनुभाग छिपा हुआ है + क्विज़ अनुभाग दिखाया गया है + चैनल टैब फ़िल्टर सक्षम करें + चैनल टैब फ़िल्टर सक्षम है + चैनल टैब फ़िल्टर अक्षम है + चैनल टैब फ़िल्टर + फ़िल्टर करने के लिए चैनल टैब नाम दर्ज करें, प्रत्येक पंक्ति में एक + "सीमाएँ: +• Shorts शेल्फ़, चैनल पेज और खोज परिणामों में अभी भी देखे जाने की संख्या दिखाई दे सकती है। +• यह सुविधा ऑटोमोटिव फ़ॉर्म फैक्टर के साथ काम नहीं करती है।" + "सीमाएँ: +• Shorts शेल्फ़, चैनल पेज और खोज परिणामों में अभी भी अपलोड होने का समय दिखाई दे सकता है। +• यह सुविधा ऑटोमोटिव फ़ॉर्म फैक्टर के साथ काम नहीं करती है।" + "होम/सदस्यता/खोज परिणाम कीवर्ड वाक्यांशों से मेल खाने वाली सामग्री को छिपाने के लिए फ़िल्टर किए जाते हैं + +सीमाएँ: +• चैनल नाम से Shorts को छिपाया नहीं जा सकता है +• कुछ UI घटक छिपे नहीं हो सकते हैं +• किसी कीवर्ड की खोज करने पर कोई परिणाम नहीं दिख सकता है" - + फ़ुलस्क्रीन विज्ञापन छिपे हुए हैं + प्लेयर पॉपअप विज्ञापन छिपाएँ + प्लेयर पॉपअप विज्ञापन छिपे हुए हैं + प्लेयर पॉपअप विज्ञापन दिखाए गए हैं + प्लेयर ओवरले में \'उत्पाद देखें\' बैनर छिपा हुआ है + प्लेयर ओवरले में \'उत्पाद देखें\' बैनर दिखाया गया है + YouTube Premium प्रचार छिपाएँ + YouTube Premium प्रचार छिपे हुए हैं + YouTube Premium प्रचार दिखाए गए हैं - - + + यूआरएल क्लिपबोर्ड पर कॉपी किया गया + टाइमस्टैंप के साथ यूआरएल कॉपी किया गया + वीडियो यूआरएल कॉपी बटन दिखाएँ + वीडियो यूआरएल कॉपी बटन दिखाया गया है। वीडियो यूआरएल कॉपी करने के लिए टैप करें। टाइमस्टैंप के साथ कॉपी करने के लिए टैप करके रखें + वीडियो यूआरएल कॉपी बटन नहीं दिखाया गया है + टाइमस्टैंप यूआरएल कॉपी बटन दिखाएँ + टाइमस्टैंप यूआरएल कॉपी बटन दिखाया गया है। टाइमस्टैंप के साथ वीडियो यूआरएल कॉपी करने के लिए टैप करें। टाइमस्टैंप के बिना कॉपी करने के लिए टैप करके रखें + टाइमस्टैंप यूआरएल कॉपी बटन नहीं दिखाया गया है + - + + \'टीवी में साइन इन करें\' पॉपअप अक्षम करें + \'टीवी में साइन इन करें\' पॉपअप अक्षम है + \'टीवी में साइन इन करें\' पॉपअप सक्षम है + - + + टैप टू सीक सक्षम करें + टैप टू सीक सक्षम है + टैप टू सीक अक्षम है + @@ -91,25 +223,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + कुछ उपयोगकर्ता खातों के लिए छिपाना काम नहीं कर सकता है। - + + नेविगेशन बटन + नेविगेशन बार बटन छिपाएँ या बदलें + होम छिपाएँ + होम बटन छिपा हुआ है + होम बटन दिखाया गया है + Shorts छिपाएँ + Shorts बटन छिपा हुआ है + Shorts बटन दिखाया गया है + बनाएँ छिपाएँ + बनाएँ बटन छिपा हुआ है + बनाएँ बटन दिखाया गया है + सदस्यताएँ छिपाएँ + सदस्यताएँ बटन छिपा हुआ है + सदस्यताएँ बटन दिखाया गया है + सूचनाएँ छिपाएँ + सूचनाएँ बटन छिपा हुआ है + सूचनाएँ बटन दिखाया गया है + बनाएँ को सूचनाओं से बदलें + बनाएँ बटन को सूचनाएँ बटन से बदल दिया गया है + बनाएँ बटन को सूचनाएँ बटन से नहीं बदला गया है + यदि यह सेटिंग बदलने से कोई प्रभाव नहीं पड़ता है, तो गुप्त मोड पर स्विच करने का प्रयास करें। + नेविगेशन बटन लेबल छिपाएँ + लेबल छिपे हुए हैं + लेबल दिखाए गए हैं + संकीर्ण नेविगेशन बटन सक्षम करें + नेविगेशन बटन के बीच की जगह संकीर्ण है + नेविगेशन बटन के बीच की जगह सामान्य है + नेविगेशन बार एनिमेशन सक्षम करें + नेविगेशन ट्रांज़िशन एनिमेटेड हैं + नेविगेशन ट्रांज़िशन एनिमेटेड नहीं हैं + पारदर्शी स्टेटस बार अक्षम करें + स्टेटस बार अपारदर्शी है + स्टेटस बार अपारदर्शी या पारदर्शी है + "सीमाएँ: +• वीडियो प्लेयर के शीर्ष पर एक काली पट्टी दिखाई दे सकती है। +• कुछ डिवाइस पर, इस सुविधा को सक्षम करने से सिस्टम नेविगेशन बार पारदर्शी हो सकता है।" + हल्का पारदर्शी बार अक्षम करें + लाइट मोड नेविगेशन बार अपारदर्शी है + लाइट मोड नेविगेशन बार अपारदर्शी या पारदर्शी है + गहरा पारदर्शी बार अक्षम करें + डार्क मोड नेविगेशन बार अपारदर्शी है + डार्क मोड नेविगेशन बार अपारदर्शी या पारदर्शी है + टूलबार + टूलबार घटक छिपाएँ या बदलें + बनाएँ बटन छिपाएँ + बनाएँ बटन छिपा हुआ है + बनाएँ बटन दिखाया गया है + सूचनाएँ बटन छिपाएँ + सूचनाएँ बटन छिपा हुआ है + सूचनाएँ बटन दिखाया गया है + खोज बटन छिपाएँ + खोज बटन छिपा हुआ है + खोज बटन दिखाया गया है। + चौड़े खोज बार को सक्षम करें + चौड़ा खोज बार सक्षम है + चौड़ा खोज बार अक्षम है @@ -128,25 +317,67 @@ Second \"item\" text" + कोलैप्स बटन छिपाएँ + कोलैप्स बटन छिपा हुआ है + कोलैप्स बटन दिखाया गया है + फ़ुलस्क्रीन बटन छिपाएँ + फ़ुलस्क्रीन बटन छिपा हुआ है + फ़ुलस्क्रीन बटन दिखाया गया है + + + अंतिम स्क्रीन कार्ड छिपाएँ + अंतिम स्क्रीन कार्ड छिपे हुए हैं + अंतिम स्क्रीन कार्ड दिखाए गए हैं - + फ़ुलस्क्रीन बड़ा सीकबार सक्षम करें + फ़ुलस्क्रीन सीकबार बड़े आकार का है + फ़ुलस्क्रीन सीकबार सामान्य आकार का है + चैनल पेज में Shorts छिपाएँ + चैनल पेज में छिपा हुआ + चैनल पेज में दिखाया गया + वीडियो विवरण में Shorts छिपाएँ + वीडियो विवरण में छिपा हुआ + वीडियो विवरण में दिखाया गया + एआई बटन छिपाएँ + एआई बटन छिपा हुआ है + एआई बटन दिखाया गया है + \'ऑटो-डब किया गया\' लेबल छिपाएँ + ऑटो-डब किया गया लेबल छिपा हुआ है + ऑटो-डब किया गया लेबल दिखाया गया है + - + + ऑटोप्ले पूर्वावलोकन छिपाएँ + ऑटोप्ले पूर्वावलोकन छिपा हुआ है + ऑटोप्ले पूर्वावलोकन दिखाया गया है + + + अंतिम स्क्रीन सुझाया गया वीडियो छिपाएँ + "ऑटोप्ले बंद होने पर अंतिम स्क्रीन सुझाया गया वीडियो छिपा हुआ है + +ऑटोप्ले को YouTube सेटिंग में बदला जा सकता है: +सेटिंग → प्लेबैक → अगला वीडियो अपने आप चलाएँ" + अंतिम स्क्रीन सुझाया गया वीडियो दिखाया गया है + - + + प्लेयर पॉपअप पैनल छिपाएँ + प्लेयर पॉपअप पैनल छिपे हुए हैं + प्लेयर पॉपअप पैनल दिखाई दे रहे हैं + @@ -157,10 +388,12 @@ Second \"item\" text" - - + केवल संगीत वीडियो में उपयोग के लिए। संगीत वीडियो के वे अनुभाग जिनमें संगीत नहीं है, और जो किसी अन्य श्रेणी के अंतर्गत नहीं आते हैं + सेगमेंट सबमिट नहीं कर सकते: %s + "सेगमेंट सबमिट नहीं कर सकते। +पहले से मौजूद है" @@ -172,7 +405,11 @@ Second \"item\" text" - + + अक्षम + रंग + काला और सफेद + @@ -189,7 +426,11 @@ Second \"item\" text" - + + टैप और होल्ड हैप्टिक्स अक्षम करें + टैप और होल्ड हैप्टिक्स अक्षम है + टैप और होल्ड हैप्टिक्स सक्षम है + @@ -202,6 +443,11 @@ Second \"item\" text" + + प्रीमियम गुणवत्ता विकल्प छिपाएँ + प्रीमियम गुणवत्ता विकल्प छिपे हुए हैं + प्रीमियम गुणवत्ता विकल्प दिखाए गए हैं + @@ -209,7 +455,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml index d18d40cb40..69b5287bdb 100644 --- a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml +++ b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml @@ -30,18 +30,47 @@ Second \"item\" text" Sačuvaj + Onemogući podebljane ikone + Ikone nisu podebljane + Ikone su podebljane + GmsCore + Postavke povezane s GmsCoreom + Provjeri ažuriranja za GmsCore + Provjera ažuriranja omogućena je + Provjera ažuriranja je onemogućena + Otvori postavke za GmsCore + Postavke za GmsCore + MicroG GmsCore nije instaliran. Instalirajte ga. + Potrebna je radnja + Nije uspjela provjera ažuriranja za MicroG GmsCore + Dostupna je nova verzija (%1$s) MicroG GmsCore. Trenutno koristite verziju %2$s. + "MicroG GmsCore nema dopuštenje za rad u pozadini.\n\nSlijedite vodič \"Ne ubijaj moju aplikaciju\" za svoj telefon i primijenite upute na svoju MicroG instalaciju.\n\nOvo je potrebno da bi aplikacija radila." + Otvori web-stranicu + Odustani + "Optimizacije baterije za MicroG GmsCore moraju biti onemogućene kako bi se spriječili problemi.\n\nOnemogućavanje optimizacija baterije za MicroG neće negativno utjecati na potrošnju baterije.\n\nDodirnite gumb za nastavak i dopustite promjene optimizacije." + Nastavi - + + Ponovo pokrenite aplikaciju za korištenje ove značajke + Zapisnik protokola međuspremnika + Dnevnici otklanjanja pogrešaka uključuju proto međuspremnik + Dnevnici otklanjanja pogrešaka ne uključuju proto međuspremnik + "Omogućavanje ove postavke bilježit će dodatne podatke o rasporedu, uključujući tekst na zaslonu za neke komponente korisničkog sučelja. + +To može pomoći u prepoznavanju komponenti prilikom stvaranja prilagođenih filtara. + +Međutim, omogućavanje ove opcije također će bilježiti neke korisničke podatke kao što je vaša IP adresa." + @@ -51,40 +80,135 @@ Second \"item\" text" - + Sakrij policu trgovine za kreatore + Polica trgovine za kreatore ispod video playera je sakrivena + Polica trgovine za kreatore ispod video playera je prikazana + Sakrij odjeljak komentara ispod videozapisa u početnom feedu + Odjeljak komentara ispod videozapisa u početnom feedu je sakriven + Odjeljak komentara ispod videozapisa u početnom feedu je prikazan + + Sakrij gumb „Najnoviji videozapisi” + Gumb „Najnoviji videozapisi” je sakriven + Gumb „Najnoviji videozapisi” je prikazan + + Sakrij rezultate pretraživanja weba + Rezultati pretraživanja weba su sakriveni + Rezultati pretraživanja weba su prikazani + Sakrij odjeljak „Moglo bi vam se svidjeti” + Odjeljak „Moglo bi vam se svidjeti” je sakriven + Odjeljak „Moglo bi vam se svidjeti” je prikazan + This button usually appears in the video player for certain videos. --> + + Sakrij gumb „Ponovna reprodukcija chata uživo” + Gumb za ponovnu reprodukciju chata uživo u preklapanju playera je sakriven + Gumb za ponovnu reprodukciju chata uživo u preklapanju playera je prikazan + Sakrij naslov videozapisa + Naslov videozapisa u preklapanju playera je sakriven + Naslov videozapisa u preklapanju playera je prikazan + Sakrij „Napredak tečaja” + Odjeljak napretka tečaja je sakriven + Odjeljak napretka tečaja je prikazan + Sakrij Istraži + Odjeljci „Istraži ovaj tečaj” i „Istraži podcast” su sakriveni + Odjeljci „Istraži ovaj tečaj” i „Istraži podcast” su prikazani + Sakrij „Istraži ovaj tečaj” + Odjeljak „Istraži ovaj tečaj” je sakriven + Odjeljak „Istraži ovaj tečaj” je prikazan + Sakrij „Istraži podcast” + Odjeljak „Istraži podcast” je sakriven + Odjeljak „Istraži podcast” je prikazan + Sakrij „Istaknuta mjesta” + Odjeljak „Istaknuta mjesta” je sakriven + Odjeljak „Istaknuta mjesta” je prikazan + Omogući filtar padajućeg izbornika feeda + Filtar padajućeg izbornika feeda je omogućen + Filtar padajućeg izbornika feeda je onemogućen + Filtar padajućeg izbornika feeda + Unesite nazive padajućih izbornika za filtriranje, po jedan u svakom retku + Sakrij Igre + Odjeljak Igre je sakriven + Odjeljak Igre je prikazan + Sakrij Glazbu + Odjeljak Glazba je sakriven + Odjeljak Glazba je prikazan + Sakrij Kvizove + Odjeljak Kvizovi je sakriven + Odjeljak Kvizovi je prikazan + Omogući filtar kartica kanala + Filtar kartica kanala je omogućen + Filtar kartica kanala je onemogućen + Filtar kartica kanala + Unesite nazive kartica kanala za filtriranje, po jedan u svakom retku + "Ograničenja: +• Police Shorts, stranice kanala i rezultati pretraživanja i dalje mogu prikazivati broj pregleda. +• Ova značajka ne radi s automobilskim faktorom oblika." + "Ograničenja: +• Police Shorts, stranice kanala i rezultati pretraživanja i dalje mogu prikazivati vrijeme prijenosa. +• Ova značajka ne radi s automobilskim faktorom oblika." + "Rezultati pretraživanja početne stranice/pretplata/pretraživanja filtrirani su kako bi sakrili sadržaj koji odgovara ključnim frazama + +Ograničenja: +• Shorts se ne mogu sakriti po nazivu kanala +• Neke komponente korisničkog sučelja možda neće biti sakrivene +• Pretraživanje ključne riječi možda neće pokazati rezultate" - + Oglasi preko cijelog zaslona su sakriveni + Sakrij skočne oglase playera + Skočni oglasi playera su sakriveni + Skočni oglasi playera su prikazani + Banner s prikazom proizvoda u preklapanju playera je sakriven + Banner s prikazom proizvoda u preklapanju playera je prikazan + Sakrij promocije za YouTube Premium + Promocije za YouTube Premium su sakrivene + Promocije za YouTube Premium su prikazane - - + + URL kopiran u međuspremnik + URL s vremenskom oznakom kopiran + Prikaži gumb za kopiranje URL-a videozapisa + Gumb za kopiranje URL-a videozapisa je prikazan. Dodirnite za kopiranje URL-a videozapisa. Dodirnite i zadržite za kopiranje s vremenskom oznakom + Gumb za kopiranje URL-a videozapisa nije prikazan + Prikaži gumb za kopiranje URL-a vremenske oznake + Gumb za kopiranje URL-a vremenske oznake je prikazan. Dodirnite za kopiranje URL-a videozapisa s vremenskom oznakom. Dodirnite i zadržite za kopiranje bez vremenske oznake + Gumb za kopiranje URL-a vremenske oznake nije prikazan + - + + Onemogući skočni prozor „Prijavi se na TV” + Skočni prozor „Prijavi se na TV” je onemogućen + Skočni prozor „Prijavi se na TV” je omogućen + - + + Omogući dodir za pretraživanje + Dodir za pretraživanje je omogućen + Dodir za pretraživanje je onemogućen + @@ -92,25 +216,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Skrivanje možda neće raditi za neke korisničke račune. - + + Navigacijske tipke + Sakrijte ili promijenite tipke na navigacijskoj traci + Sakrij „Početna” + Gumb za početnu stranicu je sakriven + Gumb za početnu stranicu je prikazan + Sakrij „Shorts” + Gumb za Shorts je sakriven + Gumb za Shorts je prikazan + Sakrij „Stvori” + Gumb za stvaranje je sakriven + Gumb za stvaranje je prikazan + Sakrij „Pretplate” + Gumb za pretplate je sakriven + Gumb za pretplate je prikazan + Sakrij „Obavijesti” + Gumb za obavijesti je sakriven + Gumb za obavijesti je prikazan + Zamijeni „Stvori” s „Obavijesti” + Gumb „Stvori” zamijenjen je s gumbom „Obavijesti” + Gumb „Stvori” nije zamijenjen s gumbom „Obavijesti” + Ako promjena ove postavke nema učinka, pokušajte se prebaciti na anonimni način rada. + Sakrij oznake navigacijskih tipki + Oznake su sakrivene + Oznake su prikazane + Omogući uske navigacijske tipke + Razmak između navigacijskih tipki je uzak + Razmak između navigacijskih tipki je normalan + Omogući animacije navigacijske trake + Navigacijski prijelazi su animirani + Navigacijski prijelazi nisu animirani + Onemogući prozirnu statusnu traku + Statusna traka je neprozirna + Statusna traka je neprozirna ili prozirna + "Ograničenja: +• Crna traka može se pojaviti na vrhu video playera. +• Na nekim uređajima, omogućavanje ove značajke može promijeniti sistemsku navigacijsku traku u prozirnu." + Onemogući svijetlu prozirnu traku + Navigacijska traka u svijetlom načinu rada je neprozirna + Navigacijska traka u svijetlom načinu rada je neprozirna ili prozirna + Onemogući tamnu prozirnu traku + Navigacijska traka u tamnom načinu rada je neprozirna + Navigacijska traka u tamnom načinu rada je neprozirna ili prozirna + Alatna traka + Sakrij ili promijeni komponente alatne trake + Sakrij gumb „Stvori” + Gumb za stvaranje je sakriven + Gumb za stvaranje je prikazan + Sakrij gumb „Obavijesti” + Gumb za obavijesti je sakriven + Gumb za obavijesti je prikazan + Sakrij gumb „Traži” + Gumb za pretraživanje je sakriven + Gumb za pretraživanje je prikazan. + Omogući široku traku za pretraživanje + Široka traka za pretraživanje je omogućena + Široka traka za pretraživanje je onemogućena @@ -129,25 +310,67 @@ Second \"item\" text" + Sakrij gumb „Skupi” + Gumb za skupljanje je sakriven + Gumb za skupljanje je prikazan + Sakrij gumb „Puni zaslon” + Gumb za puni zaslon je sakriven + Gumb za puni zaslon je prikazan + + + Sakrij kartice završnog zaslona + Kartice završnog zaslona su sakrivene + Kartice završnog zaslona su prikazane - + Omogući veliku traku za pretraživanje preko cijelog zaslona + Traka za pretraživanje preko cijelog zaslona je velike veličine + Traka za pretraživanje preko cijelog zaslona je normalne veličine + Sakrij Shorts na stranici kanala + Skriveno na stranici kanala + Prikazano na stranici kanala + Sakrij Shorts u opisu videozapisa + Skriveno u opisu videozapisa + Prikazano u opisu videozapisa + Sakrij AI gumb + AI gumb je sakriven + AI gumb je prikazan + Sakrij oznaku „Automatski sinkronizirano” + Oznaka „Automatski sinkronizirano” je sakrivena + Oznaka „Automatski sinkronizirano” je prikazana + - + + Sakrij pretpregled automatske reprodukcije + Pretpregled automatske reprodukcije je sakriven + Pretpregled automatske reprodukcije je prikazan + + + Sakrij predloženi videozapis na završnom zaslonu + "Predloženi videozapis na završnom zaslonu je skriven kada je automatska reprodukcija isključena + +Automatska reprodukcija može se promijeniti u postavkama YouTubea: +Postavke → Reprodukcija → Automatska reprodukcija sljedećeg videozapisa" + Predloženi videozapis na završnom zaslonu je prikazan + - + + Sakrij skočne ploče playera + Skočne ploče playera su skrivene + Skočne ploče playera su prikazane + @@ -158,10 +381,12 @@ Second \"item\" text" - - + Samo za korištenje u glazbenim videozapisima. Dijelovi glazbenih videozapisa bez glazbe, koji već nisu obuhvaćeni drugom kategorijom + Nije moguće poslati segment: %s + "Nije moguće poslati segment. +Već postoji" @@ -173,7 +398,11 @@ Second \"item\" text" - + + Onemogućeno + Boja + Crno-bijelo + @@ -190,7 +419,11 @@ Second \"item\" text" - + + Onemogući vibracijske povratne informacije pri dodiru i zadržavanju + Vibracijske povratne informacije pri dodiru i zadržavanju su onemogućene + Vibracijske povratne informacije pri dodiru i zadržavanju su omogućene + @@ -203,6 +436,11 @@ Second \"item\" text" + + Sakrij opcije premium kvalitete + Opcije premium kvalitete su sakrivene + Opcije premium kvalitete su prikazane + @@ -210,7 +448,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 01e43dbd55..8d5f5b01f3 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Beállítások keresési előzményeinek megjelenítése A beállítások keresési előzményei láthatók A beállítások keresési előzményei nincsenek megjelenítve + Félkövér ikonok letiltása + Az ikonok nem félkövérek + Az ikonok félkövérek ReVanced beállításikonok megjelenítése A beállításikonok láthatók A beállítások ikonjai nem jelennek meg @@ -99,23 +102,31 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore beállítások - A GmsCore beállításai + GmsCore + A GmsCore beállításai + GmsCore frissítések keresése + A frissítések ellenőrzése engedélyezve van + A frissítések keresése le van tiltva + GmsCore beállítások megnyitása + A GmsCore beállításai - MicroG GmsCore nincs telepítve. Telepítse. - Művelet szükséges - "A MicroG GmsCore nem rendelkezik engedéllyel a háttérben történő futáshoz. + MicroG GmsCore nincs telepítve. Telepítse. + Művelet szükséges + Nem sikerült ellenőrizni a MicroG GmsCore frissítéseit + Elérhető a MicroG GmsCore új, %1$s verziója. Jelenleg a %2$s verziót használod. + "A MicroG GmsCore nem rendelkezik engedéllyel a háttérben történő futáshoz. Kövesse a \"Ne ölj meg az alkalmazásomat\" útmutatót a telefonján, és alkalmazza az utasításokat a MicroG telepítésére. Ez szükséges az alkalmazás működéséhez." - Webhely megnyitása - "A MicroG GmsCore akkumulátor-optimalizálását le kell tiltani a problémák elkerülése érdekében. + Webhely megnyitása + Mégse + "A MicroG GmsCore akkumulátor-optimalizálását le kell tiltani a problémák elkerülése érdekében. A MicroG akkumulátor-optimalizálásának letiltása nem befolyásolja negatívan az akkumulátor használatát. Kattintson a folytatás gombra, és engedélyezze az optimalizálási módosításokat." - Folytatás + Folytatás Videó streamek hamisítása @@ -169,10 +180,11 @@ Nem fog értesülni semmilyen váratlan eseményről." Jelzők mentve Jelzők visszaállítva Jelzők vágólapra másolva - Napló protokoll puffer - A hibakeresési naplók protopuffert tartalmaznak - A hibakeresési naplók nem tartalmaznak protopuffert - "Ennek a beállításnak az engedélyezése további elrendezési adatokat fog naplózni, beleértve néhány felhasználói felületi komponens képernyőn megjelenő szövegét. + Indítsa újra az alkalmazást a funkció használatához + Napló protokoll puffer + A hibakeresési naplók protopuffert tartalmaznak + A hibakeresési naplók nem tartalmaznak protopuffert + "Ennek a beállításnak az engedélyezése további elrendezési adatokat fog naplózni, beleértve néhány felhasználói felületi komponens képernyőn megjelenő szövegét. Ez segíthet azonosítani az összetevőket egyedi szűrők létrehozásakor. @@ -220,6 +232,9 @@ Ez a funkció azonban néhány felhasználói adatot is naplóz, például az IP A Shorts háttérben történő lejátszása engedélyezve van + Alkotói áruház polcának elrejtése + Az alkotói bolt polc a videólejátszó alatt elrejtve + Alkotói bolti polc látható a videólejátszó alatt Album kártyák elrejtése Az album kártyák el vannak rejtve Az album kártyák láthatóak @@ -229,6 +244,9 @@ Ez a funkció azonban néhány felhasználói adatot is naplóz, például az IP Vágások polc elrejtése A vágások polc el van rejtve A részletek polc meg van jelenítve + Hozzászólások rész elrejtése a videók alatt a főoldalon + A hozzászólások rész el van rejtve a videók alatt a főoldalon + A hozzászólások rész látható a videók alatt a főoldalon Közösségi posztok elrejtése A közösségi bejegyzések el vannak rejtve A közösségi bejegyzések meg vannak jelenítve @@ -256,14 +274,19 @@ Ez a funkció azonban néhány felhasználói adatot is naplóz, például az IP Legutóbbi bejegyzések elrejtése A legutóbbi bejegyzések rejtve vannak A legutóbbi bejegyzések láthatóak + + A „Legújabb videók” gomb elrejtése + A „Legújabb videók” gomb el van rejtve + A „Legújabb videók” gomb látható Egyveleg lejátszási listák elrejtése Az egyveleg lejátszási listák el vannak rejtve Az egyveleg lejátszási listák megjelennek Filmek szakasz elrejtése A filmek szakasz el van rejtve A filmek szakasz látható - + \"Értesítést kérek\" gomb elrejtése Az „Értesíts” gomb elrejtve Az „Értesíts” gomb látható @@ -288,13 +311,16 @@ Ez a funkció azonban néhány felhasználói adatot is naplóz, például az IP Vizuális távtartó elrejtése A vizuális távtartó el van rejtve A vizuális távtartó látható + Webes keresési találatok elrejtése + A webes keresési találatok rejtve vannak + A webes keresési találatok megjelennek + A „Neked ajánlott” szakasz elrejtése + A „Neked ajánlott” szakasz el van rejtve + A „Neked ajánlott” szakasz látható YouTube Doodles elrejtése A YouTube Doodles animáció a logón elrejtve YouTube Doodles animáció látható a logón - "YouTube Doodles minden évben néhány napig láthatóak. - -Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be van kapcsolva, akkor a keresősáv alatti szűrősáv is el lesz rejtve." Csatornasáv elrejtése A csatornasáv el van rejtve A csatornasáv megjelenik @@ -311,10 +337,15 @@ Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be Az információs panelek el vannak rejtve Az információs táblák meg vannak jelenítve + This button usually appears in the video player for certain videos. --> Csatlakozás gomb elrejtése A „Csatlakozás” gomb elrejtve A „Csatlakozás” gomb látható + + Az „Élő csevegés visszajátszása” gomb elrejtése + Az élő csevegés visszajátszása gomb a lejátszó átfedésében el van rejtve + Az élő csevegés visszajátszása gomb a lejátszó átfedésében látható Egészségügyi panel elrejtése Az egészségügyi panelek el vannak rejtve Az egészségügyi panelek láthatóak @@ -330,6 +361,9 @@ Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be Időzített reakciók elrejtése Az időzített reakciók elrejtve Az időzített reakciók megjelenítve + Videó címének elrejtése + A videó címe a lejátszó átfedésében el van rejtve + A videó címe a lejátszó átfedésében látható „AI-generált videó összefoglaló” elrejtése Az MI által generált videó összefoglaló szakasz elrejtve AI által generált videó összefoglaló szakasz megjelenítve @@ -342,33 +376,62 @@ Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be Fejezetek elrejtése A fejezetcó szakasz el van rejtve A fejezetcó szakasz meg van jelenítve - A „Hogyan készült ez a tartalom” elrejtése - A Hogyan készült ez a tartalom szakasz rejtett - A Hogyan készült ez a tartalom szakasz látható - Hype pontok elrejtése - A Hype pontok el vannak rejtve - A Hype pontok láthatóak + A „Tanfolyam előrehaladása” elrejtése + A tanfolyam előrehaladása rész el van rejtve + A tanfolyam előrehaladása rész látható + Felfedezés elrejtése + A „Tanfolyam felfedezése” és a „Podcast felfedezése” szakaszok rejtettek + A „Tanfolyam felfedezése” és a „Podcast felfedezése” szakaszok láthatóak + A „Tanfolyam felfedezése” elrejtése + A „Tanfolyam felfedezése” szakasz rejtett + A „Tanfolyam felfedezése” szakasz látható + A „Podcast felfedezése” elrejtése + A Podcast felfedezése szakasz rejtett + A Podcast felfedezése szakasz látható A „Podcast felfedezése” elrejtése A Podcast felfedezése szakasz rejtett A Podcast felfedezése szakasz látható Kiemelt hivatkozások elrejtése A kiemelt linkek szekció rejtett A kiemelt linkek szekció látható + A „Kiemelt helyek” elrejtése + A kiemelt helyek szakasz rejtett + A kiemelt helyek szakasz látható Kiemelt videók elrejtése A kiemelt videók szekció rejtett A kiemelt videók szekció látható + Hírcsatorna előugró menü szűrőjének engedélyezése + A hírcsatorna előugró menü szűrője engedélyezve van + A hírcsatorna előugró menü szűrője le van tiltva + Hírcsatorna előugró menü szűrő + Adja meg az előugró menü neveit a szűréshez, egyet soronként + Játék elrejtése + A játék szakasz rejtett + A játék szakasz látható + A „Hogyan készült ez a tartalom” elrejtése + A Hogyan készült ez a tartalom szakasz rejtett + A Hogyan készült ez a tartalom szakasz látható + Hype pontok elrejtése + A Hype pontok el vannak rejtve + A Hype pontok láthatóak Infó kártyák elrejtése Az infó kártyák rész el van rejtve Az infó kártyák rész látható A „Főbb fogalmak” elrejtése A Főbb fogalmak szakasz rejtett A Főbb fogalmak szakasz látható + Zene elrejtése + A zenei szakasz rejtett + A zenei szakasz látható Feliratkozás gomb elrejtése A Feliratkozás gomb rejtett A Feliratkozás gomb látható Átirat elrejtése Az átirat rész el van rejtve Az átirat rész megjelenik + Kvízek elrejtése + A kvízek szakasz rejtett + A kvízek szakasz látható Videóleírás A videóleírás komponenseinek elrejtése vagy megjelenítése Szűrősáv @@ -387,6 +450,11 @@ Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be Megjelenítve az előzményekben Csatornaoldal Csatornaoldal komponenseinek elrejtése vagy megjelenítése + Csatorna lap szűrőjének engedélyezése + A csatorna lap szűrője engedélyezve van + A csatorna lap szűrője le van tiltva + Csatorna lap szűrő + Adja meg a csatorna lapneveket a szűréshez, egyet soronként Közösség gomb elrejtése A Közösség gomb rejtett @@ -450,15 +518,15 @@ Ha a Doodle jelenleg a régiódában látható, és ez a rejtés beállítás be A megtekintések száma látható a hírfolyamban és a keresési eredményekben "Korlátozások: -• Shorts polcok, csatornaoldalak és a keresési eredmények továbbra is mutathatják a megtekintések számát -• Ez a funkció nem működik autóipari formátummal" +• Shorts polcok, csatornaoldalak és a keresési eredmények továbbra is mutathatják a megtekintések számát. +• Ez a funkció nem működik autóipari formátummal." Feltöltési idő elrejtése A feltöltési idő el van rejtve a hírfolyamban és a keresési eredményekben A feltöltési idő megjelenik a hírfolyamban és a keresési eredményekben "Korlátozások: -• Shorts polcokon, csatornaoldalakon és keresési eredményekben továbbra is megjelenhetnek a feltöltési idők -• Ez a funkció nem működik az autós formátummal" +• Shorts polcokon, csatornaoldalakon és keresési eredményekben továbbra is megjelenhetnek a feltöltési idők. +• Ez a funkció nem működik az autós formátummal." Kulcsszó alapú tartalom elrejtés Kulcsszó alapú videó elrejtés keresésnél és a feedekben Videók elrejtése a kezdőlapon kulcsszavak alapján @@ -481,9 +549,9 @@ Nagybetűs szavakat a középső betűkkel együtt kell megadni (pl.: iPhone, Ti A kulcsszó alapú szűrésről "A kezdőlap/előfizetések/keresési eredmények szűrve vannak, hogy elrejtsék a kulcsszó-kifejezéseknek megfelelő tartalmat -Korlátozások +Korlátozások: • A Shorts nem rejthető el csatorna névvel -• Egyes felület elemek nem rejtőknek el +• Egyes felület elemek nem rejtődnek el • A kulcsszó keresése nem eredményezhet eredményt" Párosítson egész szavakat @@ -496,19 +564,12 @@ Korlátozások A kulcsszó elrejti az összes videót: %s - Alkotói áruház polcának elrejtése - Az alkotói bolt polc a videólejátszó alatt elrejtve - Alkotói bolti polc látható a videólejátszó alatt A befejező képernyőn lévő üzletbanner elrejtése A végképernyő bolt banner elrejtve A végképernyő bolt banner látható Teljes képernyős hirdetések elrejtése - "A teljes képernyős hirdetések el vannak rejtve - -Ez a funkció csak régebbi eszközökön érhető el" + A teljes képernyős hirdetések rejtve vannak A teljes képernyős hirdetések láthatók - - A teljes képernyős hirdetések elrejtése csak régebbi eszközökön működik Általános hirdetések elrejtése Az általános hirdetések el vannak rejtve Az általános hirdetések megjelennek @@ -518,6 +579,9 @@ Ez a funkció csak régebbi eszközökön érhető el" Fizetett promóció címke elrejtése A fizetett promóciós címke el van rejtve A fizetett promóciós címke meg van jelenítve + Lejátszó előugró hirdetéseinek elrejtése + A lejátszó előugró hirdetései el vannak rejtve + A lejátszó előugró hirdetései megjelennek Önpromóciós kártyák elrejtése Az önpromóciós kártyák rejtve vannak Az önpromóciós kártyák megjelennek @@ -525,23 +589,18 @@ Ez a funkció csak régebbi eszközökön érhető el" A vásárlási linkek a videó leírásában elrejtve Vásárlási linkek láthatók a videó leírásában A „Termékek megtekintése” szalaghirdetés elrejtése - A „Termékek megtekintése” banner a videó átfedésében elrejtve - A „Termékek megtekintése” banner a videó átfedésében látható - Webes keresési találatok elrejtése - A webes keresési találatok rejtve vannak - A webes keresési találatok megjelennek - - - YouTube Premium promóciók elrejtése - A YouTube Premium promóciók a videólejátszó alatt el vannak rejtve - A YouTube Premium promóciók a videólejátszó alatt láthatók + A „Termékek megtekintése” banner a lejátszó átfedésében elrejtve + A „Termékek megtekintése” banner a lejátszó átfedésében látható + YouTube Premium promóciók elrejtése + A YouTube Premium promóciók el vannak rejtve + A YouTube Premium promóciók láthatók Videó hirdetések elrejtése A videó hirdetések el vannak rejtve A videó hirdetések láthatók - + Az URL a vágólapra másolva Az URL időbélyeggel a vágólapra másolva A videó URL másolása gomb megjelenítése @@ -557,10 +616,10 @@ Ez a funkció csak régebbi eszközökön érhető el" A párbeszédpanel megjelenik Ez nem kerüli meg a korhatárt, csak automatikusan elfogadja. - - A \"Bejelentkezés TV-re\" felugró ablak letiltása - A TV-bejelentkezési előugró ablak le van tiltva - A TV-bejelentkezési előugró ablak engedélyezve van + + A \'Bejelentkezés TV-re\' felugró ablak letiltása + A TV-bejelentkezési előugró ablak le van tiltva + A TV-bejelentkezési előugró ablak engedélyezve van Dupla koppintásos fejezetátugrás letiltása @@ -593,10 +652,10 @@ Ellenőrizze, hogy a csomagnév helyes-e és az alkalmazás telepítve van-e"A kézmozdulat letiltva A kézmozdulat engedélyezve - - Érintésre keresés engedélyezése - A koppintással történő keresés engedélyezve van - Az érintésre keresés le van tiltva + + Érintésre keresés engedélyezése + A koppintással történő keresés engedélyezve van + Az érintésre keresés le van tiltva Fényerő kézmozdulat engedélyezése @@ -677,7 +736,7 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"A hozzászólások gomb rejtve van A hozzászólások gomb látható + This button usually appears on live streamed videos. --> Bejelentés elrejtése A bejelentés gomb el van rejtve A bejelentés gomb látható @@ -690,7 +749,7 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"A letöltés gomb el van rejtve A letöltés gomb látható + This button usually appears on videos uploaded by the logged-in user. --> Aktivitás elrejtése A Hype gomb rejtett A hype gomb látható @@ -703,7 +762,7 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"A köszönet gomb el van rejtve A köszönet gomb látható + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ask elrejtése Az Ask gomb el van rejtve Az Ask gomb látható @@ -711,6 +770,7 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"Vágás gomb elrejtése A klip gomb el van rejtve A klip gomb látható + Az elrejtés egyes felhasználói fiókok esetében nem működhet. Bolt elrejtése A Bolt gomb elrejtve @@ -720,17 +780,17 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"A mentés gomb rejtett A mentés gomb látható - + Navigációs gombok - Gombok elrejtése vagy módosítása a navigációs sávon + Navigációs sáv gombjainak elrejtése vagy módosítása - Kezdőlap elrejtése - A kezdőlap gomb elrejtve - A kezdőlap gomb látható + Főoldal elrejtése + A Kezdőlap gomb elrejtve + A Kezdőlap gomb látható Shorts elrejtése - A shorts gomb rejtve van - A shorts gomb látható + A Shorts gomb rejtve van + A Shorts gomb látható Létrehozás elrejtése A létrehozás gomb el van rejtve @@ -744,26 +804,44 @@ A hangerő a képernyő jobb oldalán függőlegesen húzva állítható be"Az értesítések gomb megjelenik Létrehozás felcserélése az értesítésekkel - "A Létrehozás gomb kicserélve az Értesítések gombbal - -Megjegyzés: Ez a beállítás a videóhirdetések kényszerű elrejtését is magában foglalja" + A létrehozás gomb fel van cserélve az értesítések gombbal A létrehozás gomb nincs felcserélve az értesítések gombbal - "Ennek a beállításnak a letiltása a Shorts hirdetések blokkolását is letiltja. - -Ha a beállítás módosítása nem lép életbe, próbáljon meg Inkognitó módra váltani." - A navigációs gombok címkéinek elrejtése - A címke el vannak rejtve - A címke meg vannak jelenítve + Ha a beállítás módosítása nem lép életbe, próbálja meg inkognitó módba váltani. + Navigációs gombok feliratainak elrejtése + A feliratok elrejtve + A feliratok láthatóak + Keskeny navigációs gombok engedélyezése + A navigációs gombok közötti távolság keskeny + A navigációs gombok közötti távolság normális + Navigációs sáv animációinak engedélyezése + A navigációs átmenetek animáltak + A navigációs átmenetek nincsenek animálva Átlátszó állapotsor letiltása Az állapotsor nem áttetsző Az állapotsor nem áttetsző vagy áttetsző - Egyes eszközökön ennek a funkciónak az engedélyezése átlátszóvá teheti a rendszer navigációs sávját. + "Korlátozások: +• Fekete sáv jelenhet meg a videólejátszó tetején. +• Egyes eszközökön e funkció engedélyezése átlátszóra változtathatja a rendszer navigációs sávját." Világos, átlátszó sáv letiltása Világos módban az átlátszó navigációs sáv átlátszatlan A világos módú navigációs sáv nem áttetsző vagy áttetsző Sötét áttetsző sáv letiltása Sötét módban az átlátszó navigációs sáv átlátszatlan A sötét módú navigációs sáv nem áttetsző vagy áttetsző + Eszköztár + Eszköztár-összetevők elrejtése vagy módosítása + Létrehozás gomb elrejtése + A létrehozás gomb el van rejtve + A létrehozás gomb látható + Értesítések gomb elrejtése + Az értesítések gomb rejtve van + Az értesítések gomb megjelenik + Keresés gomb elrejtése + A keresés gomb el van rejtve + A keresés gomb látható. + Széles keresősáv bekapcsolása + Széles keresősáv bekapcsolva + Széles keresősáv kikapcsolva Előugró menü @@ -838,6 +916,12 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis Küldés gomb elrejtése Az átküldés gomb rejtve van Az átküldés gomb látható + Összecsukás gomb elrejtése + Az összecsukás gomb el van rejtve + Az összecsukás gomb látható + Teljes képernyő gomb elrejtése + A teljes képernyő gomb el van rejtve + A teljes képernyő gomb látható Lejátszóvezérlők hátterének elrejtése A lejátszóvezérlők háttere rejtett A lejátszóvezérlők háttere látható @@ -846,9 +930,9 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis A gombok megjelennek - Záróképernyő kártyák elrejtése - A záróképernyő kártyák el vannak rejtve - A záróképernyő kártyák megjelennek + Záróképernyő kártyák elrejtése + A záróképernyő kártyák el vannak rejtve + A záróképernyő kártyák megjelennek Ambient mód letiltása teljes képernyős módban @@ -873,10 +957,16 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis Videó miniatűrök keresősávjának elrejtése A videó miniatűrök keresősávja elrejtve A videó miniatűrök keresősávja megjelenítve + Teljes képernyős nagy folyamatsáv engedélyezése + A teljes képernyős folyamatsáv nagy méretű + A teljes képernyős folyamatsáv normál méretű Shorts lejátszó A Shorts lejátszó komponensek elrejtése vagy megjelenítése + Shorts elrejtése a csatornaoldalon + Elrejtve a csatornaoldalon + Megjelenítve a csatornaoldalon Shorts videók elrejtése a Főoldali hírcsatornából Elrejtve a Főoldali hírcsatornából és a kapcsolódó videókból @@ -888,9 +978,18 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis Shorts videók elrejtése a Feliratkozások hírcsatornából Elrejtve a Feliratkozások hírcsatornából Látható a Feliratkozások hírcsatornában + Shorts elrejtése a videóleírásban + Elrejtve a videóleírásban + Megjelenítve a videóleírásban Shorts elrejtése a megtekintési előzményekben Elrejtve a megtekintési előzményekben Megjelenik a megtekintési előzményekben + AI gomb elrejtése + Az AI gomb el van rejtve + Az AI gomb látható + Az \"Automatikusan szinkronizált\" címke elrejtése + Az automatikus szinkronizálás címke rejtett + Az automatikus szinkronizálás címke megjelenik Az \"Automatikusan szinkronizált\" címke elrejtése Az automatikus szinkronizálás címke rejtett Az automatikus szinkronizálás címke megjelenik @@ -952,6 +1051,7 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis Az \"Ez a sablon használata\" gomb elrejtése A \"Sablon használata\" gomb el van rejtve A „Sablon használata” gomb látható + Tetszik gomb szökőkút animációjának elrejtése A Like gomb szökőkút animáció el van rejtve A Like gomb szökőkút animáció látható @@ -994,7 +1094,12 @@ A hangsáv menü megjelenítéséhez módosítsa a(z) \"Videóstreamek meghamis A navigációs sáv el van rejtve A navigációs sáv megjelenik - + + Automatikus lejátszás előnézetének elrejtése + Az automatikus lejátszás előnézete el van rejtve + Az automatikus lejátszás előnézete látható + + Javasolt videó elrejtése a befejező képernyőn "A befejező képernyőn lévő javasolt videó el van rejtve, ha az automatikus lejátszás ki van kapcsolva. @@ -1013,9 +1118,9 @@ Beállítások → Lejátszás → Következő videó automatikus lejátszása"< Az időbélyegző megjelenik - Lejátszó előugró paneleinek elrejtése - A lejátszó előugró panelei el vannak rejtve - A lejátszó előugró panelei megjelennek + Lejátszó előugró paneleinek elrejtése + A lejátszó előugró panelei el vannak rejtve + A lejátszó előugró panelei megjelennek Kilépés a teljes képernyőből @@ -1083,24 +1188,6 @@ Korlátozás: A nem tetszések inkognitómódban nem jelenhetnek meg" Kliens korlátozás %d alkalommal történt %d ezredmásodperc - - Széles keresősáv bekapcsolása - Széles keresősáv bekapcsolva - Széles keresősáv kikapcsolva - - - Jó minőségű miniatűrök engedélyezése - A keresősáv bélyegképei kiváló minőségűek - A keresősáv bélyegképei közepes minőségűek - "Ez visszaállítja a miniatűr képeket az élő közvetítéseknél, amelyeknek nincsenek keresősáv miniatűr képei. - -A keresősáv miniatűr képei ugyanazt a minőséget fogják használni, mint az aktuális videó. - -Ez a funkció a legjobban 720p vagy annál alacsonyabb videóminőség mellett és nagyon gyors internetkapcsolat használatakor működik." - Régi keresősáv bélyegképek visszaállítása - A keresősáv bélyegképei megjelennek a keresősáv felett - A keresősáv bélyegképei megjelennek a teljes képernyőn - SponsorBlock bekapcsolása A SponsorBlock egy közösségi finanszírozású rendszer, amellyel kihagyhatod a YouTube videók idegesítő részeit @@ -1339,8 +1426,6 @@ Ha később kikapcsolja, akkor ajánlott az alkalmazás adatait törölni, hogy Hamisított alkalmazásverzió célja 20.13.41 - Nem összecsukott videó műveletsáv visszaállítása 20.05.46 - Átirat funkció visszaállítása - 19.35.36 - A régi Shorts lejátszó ikonok visszaállítása - 19.01.34 - Állítsa vissza a régi navigációs ikonokat Kezdőlap módosítása @@ -1439,8 +1524,9 @@ A miniatűr képernyőt a képernyő bal vagy jobb szélére húzhatja" A betöltési képernyő színátmenetes hatterű lesz A betöltési képernyő egyszínű hátterű lesz Üdvözlőképernyő stílusa - Színes - Fekete-fehér + Letiltva + Színes + Fekete-fehér Egyéni keresősáv szín engedélyezése Az egyéni keresősáv szín megjelenik Az egyéni keresősáv szín nem jelenik meg @@ -1545,6 +1631,9 @@ Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását"Keresés visszavonása haptikus visszajelzésének letiltása A keresés visszavonása haptikus visszajelzése ki van kapcsolva A keresés visszavonása haptikus visszajelzése be van kapcsolva + Koppintás és tartás haptikus visszajelzésének letiltása + A koppintás és tartás haptikus visszajelzése le van tiltva + A koppintás és tartás haptikus visszajelzése engedélyezve van Haptikus zoom letiltása Haptikus zoom le van tiltva Haptikus zoom be van kapcsolva @@ -1640,6 +1729,11 @@ Korlátozások: A speciális videóminőség menü látható A speciális videóminőség menü nem látható + + Prémium minőségű opciók elrejtése + A prémium minőségű opciók rejtve vannak + A prémium minőségű opciók láthatók + Csúsztatás engedélyezése a kereséshez A csúsztatás a kereséshez engedélyezve van @@ -1671,6 +1765,7 @@ Az AV1-es videólejátszás akadozhat vagy képkockákat ejthet." + Névjegy Hirdetések Általános diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 1845ace37b..043eb3fe5d 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Ցույց տալ կարգավորումների որոնման պատմությունը Կարգավորումների որոնման պատմությունը ցուցադրվում է Կարգավորումների որոնման պատմությունը ցույց չի տրվում + Անջատել հաստ պատկերակները + Պատկերակները հաստ չեն + Պատկերակները հաստ են Ցուցադրել ReVanced-ի կարգավորումների պատկերակները Կարգավորումների պատկերակները ցուցադրվում են Կարգավորումների պատկերակները ցուցադրված չեն @@ -101,23 +104,31 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore կարգավորումներ - GmsCore-ի կարգավորումներ + GmsCore + GmsCore-ի հետ կապված կարգավորումներ + Ստուգել GmsCore-ի թարմացումները + Թարմացումների ստուգումը միացված է + Թարմացումների ստուգումն անջատված է + Բացել GmsCore կարգավորումները + GmsCore-ի կարգավորումներ - MicroG GmsCore-ը տեղադրված չէ։ Տեղադրեք այն։ - Անհրաժեշտ գործողություն - "MicroG GmsCore-ը չունի ֆոնային ռեժիմում աշխատելու թույլտվություն։ + MicroG GmsCore-ը տեղադրված չէ։ Տեղադրեք այն։ + Անհրաժեշտ գործողություն + Չհաջողվեց ստուգել MicroG GmsCore-ի թարմացումները + MicroG GmsCore-ի նոր տարբերակը (%1$s) հասանելի է։ Ներկայումս դուք օգտագործում եք տարբերակ %2$s։ + "MicroG GmsCore-ը չունի ֆոնային ռեժիմում աշխատելու թույլտվություն։ Հետևեք ձեր հեռախոսի \"Մի սպանեք իմ ծրագիրը\" առաջնորդությանը և կիրառեք հրահանգները ձեր MicroG տեղադրման համար։ Դա անհրաժեշտ է ծրագրի աշխատանքի համար։" - Բացել կայքը - "Խնդիրները կանխելու համար անհրաժեշտ է անջատել MicroG GmsCore մարտկոցի օպտիմալացումը։ + Բացել կայքը + Չեղարկել + "Խնդիրները կանխելու համար անհրաժեշտ է անջատել MicroG GmsCore մարտկոցի օպտիմալացումը։ MicroG-ի համար մարտկոցի օպտիմալացումը անջատելը բացասաբար չի ազդի մարտկոցի օգտագործման վրա։ Սեղմեք շարունակել կոճակը և թույլ տվեք օպտիմալացման փոփոխությունները։" - Շարունակել + Շարունակել Տեսահոսքերի կեղծում @@ -171,10 +182,11 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Դրոշակները պահպանվեցին Դրոշակները զրոյացվեցին Դրոշակները պատճենվեցին սեղմատախտակին - Բուֆերի արձանագրությունը մտնել - Մարմնացման առաջնորդման մատնանշումները պարունակում են բուֆերի տարր - Մարմնացման առաջնորդման մատնանշումները ներառում են բուֆերի տարր - "Այս կարգավորումը միացնելը կգրանցի լրացուցիչ դասավորության տվյալներ, ներառյալ էկրանի տեքստը որոշ UI բաղադրիչների համար։ + Վերագործարկեք հավելվածը՝ այս գործառույթն օգտագործելու համար + Բուֆերի արձանագրությունը մտնել + Մարմնացման առաջնորդման մատնանշումները պարունակում են բուֆերի տարր + Մարմնացման առաջնորդման մատնանշումները ներառում են բուֆերի տարր + "Այս կարգավորումը միացնելը կգրանցի լրացուցիչ դասավորության տվյալներ, ներառյալ էկրանի տեքստը որոշ UI բաղադրիչների համար։ Սա կարող է օգնել բացահայտել բաղադրիչները՝ հատուկ զտիչներ ստեղծելիս։ @@ -222,6 +234,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Shorts-ի ֆոնային վերարտադրությունը հնարավոր է + Թաքցնել ստեղծողի խանութի դարակը + Ստեղծողի խանութի դարակը տեսանվագարկչի տակ թաքնված է + Ստեղծողի խանութի դարակը վիդեո նվագարկչի տակ ցուցադրվում է Թաքցնել ալբոմի քարտերը Ալբոմի քարտերը թաքցված են Ալբոմի քարտերը ցույց են տրվում @@ -231,6 +246,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել չիպսի մարզը Չիպսերի դարակը թաքցված է Չիպսերի դարակը երևում է + Թաքցնել մեկնաբանությունների բաժինը Գլխավորի լրահոսի տեսանյութերի տակ + Մեկնաբանությունների բաժինը Գլխավորի լրահոսի տեսանյութերի տակ թաքնված է + Մեկնաբանությունների բաժինը Գլխավորի լրահոսի տեսանյութերի տակ ցուցադրվում է Թաքցնել համայնքային գրառումները Համայնքային գրառումները թաքցված են Համայնքային գրառումները երևում են @@ -258,14 +276,19 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել վերջին գրառումները Վերջին գրառումները թաքցված են Վերջին գրառումները երևում են + + Թաքցնել «Վերջին տեսանյութերը» կոճակը + «Վերջին տեսանյութերը» կոճակը թաքնված է + «Վերջին տեսանյութերը» կոճակը ցուցադրվում է Թաքցնել խառը ցուցակները Խառը ցուցակները թաքցված են Խառը ցուցակները երևում են Թաքցնել ֆիլմերի բաժինը Ֆիլմերի բաժինը թաքցված է Ֆիլմերի բաժինը երևում է - + Թաքցնել \'Notify me\' կոճակը Ինձ ծանուցել կոճակը թաքնված է Ինձ ծանուցել կոճակը ցուցադրված է @@ -290,13 +313,16 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել տեսողական միջակայքը Տեսողական միջակայքը թաքցված է Տեսողական միջակայքը ցուցադրված է + Թաքցնել վեբ-որոնման արդյունքները + Վեբ-որոնման արդյունքները թաքցված են + Վեբ-որոնման արդյունքները երևում են + Թաքցնել «Ձեզ կարող է դուր գալ» բաժինը + «Ձեզ կարող է դուր գալ» բաժինը թաքնված է + «Ձեզ կարող է դուր գալ» բաժինը ցուցադրվում է Թաքցնել YouTube-ի Doodles-ները YouTube Doodles անիմացիան լոգոյի վրա թաքնված է YouTube Doodles անիմացիան լոգոյի վրա ցուցադրվում է - "YouTube Doodles-ները ցուցադրվում են տարեկան մի քանի օր։ - -Եթե Doodle-ը ներկայումս ցուցադրվում է ձեր տարածաշրջանում և այս թաքցնելու առաջադրանքը միացված է, ապա ֆիլտրի գոտին, որը գտնվում է որոնման գոտուց ներքև, նույնպես կթաքնվի։" Թաքցնել ալիքի գծանշանը Ալիքի գծանշանը թաքցված է Ալիքի գծանշանը երևում է @@ -313,10 +339,15 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Տեղեկատվական վահանակները թաքցված են Տեղեկատվական վահանակները երևում են + This button usually appears in the video player for certain videos. --> Թաքցնել Join կոճակը Միանալ կոճակը թաքնված է Միանալ կոճակը ցուցադրված է + + Թաքցնել «Ուղիղ զրույցի վերարտադրում» կոճակը + «Ուղիղ զրույցի վերարտադրում» կոճակը նվագարկչի վերադիրում թաքնված է + «Ուղիղ զրույցի վերարտադրում» կոճակը նվագարկչի վերադիրում ցուցադրվում է Թաքցնել բժշկական վահանակները Բժշկական վահանակները թաքցված են Բժշկական վահանակները երևում են @@ -332,6 +363,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել ժամանակավոր ռեակցիաները Ժամանակավոր ռեակցիաները թաքցված են Ժամանակավոր ռեակցիաները ցույց են տրվում + Թաքցնել տեսանյութի վերնագիրը + Տեսանյութի վերնագիրը նվագարկչի վերադիրում թաքնված է + Տեսանյութի վերնագիրը նվագարկչի վերադիրում ցուցադրվում է Թաքցնել «AI-ով ստեղծված տեսանյութի ամփոփումը» Արհեստական բանականության կողմից ստեղծված տեսանյութի ամփոփման բաժինը թաքցված է Արհեստական բանականությամբ ստեղծված տեսանյութի ամփոփման բաժինը ցուցադրվում է @@ -344,33 +378,62 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել գլուխները Գլուխների բաժինը թաքցված է Գլուխների բաժինը երևում է - Թաքցնել \"Ինչպես է պատրաստվել այս բովանդակությունը\" - Ինչպես է պատրաստվել այս բովանդակությունը բաժինը թաքցված է - Ինչպես է պատրաստվել այս բովանդակությունը բաժինը ցուցադրվում է - Թաքցնել Hype միավորները - Hype միավորները թաքնված են - Hype միավորները ցուցադրվում են + Թաքցնել «Դասընթացի առաջընթացը» + Դասընթացի առաջընթացի բաժինը թաքնված է + Դասընթացի առաջընթացի բաժինը ցուցադրվում է + Թաքցնել Ուսումնասիրելը + «Ուսումնասիրել այս դասընթացը» և «Բացահայտեք փոդքասթը» բաժինները թաքնված են + «Ուսումնասիրել այս դասընթացը» և «Բացահայտեք փոդքասթը» բաժինները ցուցադրվում են + Թաքցնել «Ուսումնասիրել այս դասընթացը» + «Ուսումնասիրել այս դասընթացը» բաժինը թաքնված է + «Ուսումնասիրել այս դասընթացը» բաժինը ցուցադրվում է + Թաքցնել \"Բացահայտեք փոդքասթը\" + Բացահայտեք փոդքասթը բաժինը թաքցված է + Բացահայտեք փոդքասթը բաժինը ցուցադրվում է Թաքցնել \"Բացահայտեք փոդքասթը\" Բացահայտեք փոդքասթը բաժինը թաքցված է Բացահայտեք փոդքասթը բաժինը ցուցադրվում է Թաքցնել առաջարկվող հղումները Առանձնահատուկ հղումների բաժինը թաքցված է Առանձնահատուկ հղումների բաժինը ցուցադրված է + Թաքցնել «Առանձնահատուկ վայրեր» + Առանձնահատուկ վայրերի բաժինը թաքնված է + Առանձնահատուկ վայրերի բաժինը ցուցադրվում է Թաքցնել Առանձնահատուկ տեսանյութերը Առանձնահատուկ տեսանյութերի բաժինը թաքցված է Առանձնահատուկ տեսանյութերի բաժինը ցուցադրված է + Միացնել լրահոսի բացվող մենյուի զտիչը + Լրահոսի բացվող մենյուի զտիչը միացված է + Լրահոսի բացվող մենյուի զտիչը անջատված է + Լրահոսի բացվող մենյուի զտիչը + Մուտքագրեք բացվող մենյուի անունները՝ զտելու համար, յուրաքանչյուրը մեկ տողում + Թաքցնել Խաղերը + Խաղերի բաժինը թաքնված է + Խաղերի բաժինը ցուցադրվում է + Թաքցնել \"Ինչպես է պատրաստվել այս բովանդակությունը\" + Ինչպես է պատրաստվել այս բովանդակությունը բաժինը թաքցված է + Ինչպես է պատրաստվել այս բովանդակությունը բաժինը ցուցադրվում է + Թաքցնել Hype միավորները + Hype միավորները թաքնված են + Hype միավորները ցուցադրվում են Թաքցնել Տեղեկատվական քարտերը Տեղեկատվական քարտերի բաժինը թաքցված է Տեղեկատվական քարտերի բաժինը երևում է Թաքցնել \"Հիմնական հասկացությունները\" Հիմնական հասկացությունների բաժինը թաքցված է Հիմնական հասկացությունների բաժինը ցուցադրվում է + Թաքցնել Երաժշտությունը + Երաժշտության բաժինը թաքնված է + Երաժշտության բաժինը ցուցադրվում է Թաքցնել Բաժանորդագրվել կոճակը Բաժանորդագրվել կոճակը թաքցված է Բաժանորդագրվել կոճակը ցուցադրված է Թաքցնել վերծանումը Տեքստի բաժինը թաքցված է Տեքստի բաժինը երևում է + Թաքցնել Վիկտորինաները + Վիկտորինաների բաժինը թաքնված է + Վիկտորինաների բաժինը ցուցադրվում է Տեսանյութի նկարագրություն Թաքցնել կամ ցույց տալ տեսանյութի նկարագրության բաղադրամասերը Ֆիլտրի գիծ @@ -389,6 +452,11 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Ցուցադրվում է դիտումների պատմությունում Ալիքի էջ Թաքցնել կամ ցուցադրել ալիքի էջի բաղադրիչները + Միացնել ալիքի ներդիրի զտիչը + Ալիքի ներդիրի զտիչը միացված է + Ալիքի ներդիրի զտիչը անջատված է + Ալիքի ներդիրի զտիչը + Մուտքագրեք ալիքի ներդիրների անունները՝ զտելու համար, յուրաքանչյուրը մեկ տողում Թաքցնել Համայնքի կոճակը Համայնքի կոճակը թաքնված է @@ -453,14 +521,14 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել "Սահմանափակումներ. • Shorts-ի բաժինները, ալիքի էջերը և որոնման արդյունքները կարող են դեռևս ցուցադրել դիտումների քանակը -• Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ" +• Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ." Թաքցնել վերբեռնման ժամանակը Վերբեռնման ժամանակը թաքցված է լրահոսում և որոնման արդյունքներում Վերբեռնման ժամանակը ցուցադրված է լրահոսում և որոնման արդյունքներում "Սահմանափակումներ: • Shorts-ի դարակները, ալիքի էջերը և որոնման արդյունքները կարող են դեռևս ցուցադրել վերբեռնման ժամանակները -• Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ" +• Այս գործառույթը չի աշխատում ավտոմոբիլային ձևի գործոնի հետ." Թաքցնել բանալի բառերի բովանդակությունը Թաքցնել որոնումը և կերակրման տեսանյութերը՝ օգտագործելով բանալի բառերի լրացուցիչ կարգավորումներ Թաքցնել տնային տեսանյութերը բանալի բառերի միջոցով @@ -484,7 +552,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել "«Գլխավոր էջ/Գրառում/Որոնում» արդյունքները զտվում են, որպեսզի թաքցվեն բառերին համապատասխանող բովանդակությունը Սահմանափակումներ -• Shorts-ները չեն կարող թաքցվել ալիքի անունով +• Shorts-ները չեն կարող թաքնվել ալիքի անունով • Որոշ UI մասեր կարող է չթաքցվեն • Բառով որոնումը կարող է ոչ մի արդյունք չտալ" Համապատասխանեցնել ամբողջական բառերին @@ -498,19 +566,12 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Բանալի բառը կթաքցնի բոլոր տեսանյութերը։ %s - Թաքցնել ստեղծողի խանութի դարակը - Ստեղծողի խանութի դարակը տեսանվագարկչի տակ թաքնված է - Ստեղծողի խանութի դարակը վիդեո նվագարկչի տակ ցուցադրվում է Թաքցնել վերջնական էկրանի խանութի բաները Վերջնական էկրանի խանութի դրոշակը թաքնված է Վերջնական էկրանի խանութի դրոշակը ցուցադրված է Թաքցնել լի էկրանի գովազդները - "«Լրիվ էկրան» գովազդները թաքցվում են - -Այս հատկությունը հասանելի է միայն հին սարքերի համար" + Լի էկրանի գովազդները թաքնված են Լի էկրանի գովազդները երևում են - - Լի էկրանի գովազդների թաքցումը գործում է միայն հին սարքերի համար Թաքցնել ընդհանուր գովազդները Ընդհանուր գովազդները թաքցված են Ընդհանուր գովազդները երևում են @@ -520,6 +581,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել վճարված խթանման նշանը Վճարված խթանման նշանը թաքցված է Վճարված խթանման նշանը երևում է + Թաքցնել նվագարկչի ելնող գովազդները + Նվագարկչի ելնող գովազդները թաքնված են + Նվագարկչի ելնող գովազդները ցուցադրվում են Թաքցնել ինքնահովանավորված քարտերը Ինքնահովանավորված քարտերը թաքցված են Ինքնահովանավորված քարտերը երևում են @@ -527,23 +591,18 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Գնումների հղումները տեսանյութի նկարագրության մեջ թաքնված են Գնումների հղումները տեսանյութի նկարագրության մեջ ցուցադրվում են Թաքցնել \"Դիտել ապրանքները\" պաստառը - «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում թաքնված է - «Դիտել ապրանքները» դրոշակը տեսանյութի վերադիրում ցուցադրված է - Թաքցնել վեբ-որոնման արդյունքները - Վեբ-որոնման արդյունքները թաքցված են - Վեբ-որոնման արդյունքները երևում են - - - Թաքցնել YouTube Premium-ի խթանումները - YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ թաքցված են - YouTube Premium-ի խթանումները տեսանյութի խաղացողի տակ երևում են + «Դիտել ապրանքները» դրոշակը նվագարկչի վերադիրում թաքնված է + «Դիտել ապրանքները» դրոշակը նվագարկչի վերադիրում ցուցադրված է + Թաքցնել YouTube Premium-ի խթանումները + YouTube Premium-ի խթանումները թաքցված են + YouTube Premium-ի խթանումները ցուցադրվում են Թաքցնել տեսահոլովակների գովազդները Տեսահոլովակների գովազդները բլոկավորված են Տեսահոլովակների գովազդները երևում են - + URL-ը կրկնօրինակվել է բացման տախտակին URL-ը ժամանակի կնիքով կրկնօրինակվել է Ցույց տալ տեսանյութի URL-ի կրկնօրինակման կոճակը @@ -559,10 +618,10 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Զրույցը կցուցադրվի Սա չի խուսափում տարիքային սահմանափակումից։ Այն պարզապես ավտոմատ կերպով ընդունում է այն։ - - Անջատել «Մուտք գործել հեռուստացույց» բացվող պատուհանը - Հեռուստացույց մուտքի պատուհանն անջատված է - Հեռուստացույց մուտքի պատուհանը միացված է + + Անջատել «Մուտք գործել հեռուստացույց» բացվող պատուհանը + Հեռուստացույց մուտքի պատուհանն անջատված է + Հեռուստացույց մուտքի պատուհանը միացված է Անջատել կրկնակի հպումով գլուխը բաց թողնելը @@ -595,10 +654,10 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Ժեստը անջատված է Ժեստը միացված է - - Միացնել հպելը՝ որոնելու համար - Հպեք՝ որոնումը միացնելու համար - Հպելը՝ որոնելու համար, անջատված է + + Միացնել հպելը՝ որոնելու համար + Հպեք՝ որոնումը միացնելու համար + Հպելը՝ որոնելու համար, անջատված է Միացնել լուսավորության ժեստը @@ -679,7 +738,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Մեկնաբանությունների կոճակը թաքնված է Մեկնաբանությունների կոճակը ցուցադրված է + This button usually appears on live streamed videos. --> Թաքցնել Report Report կոճակը թաքցված է Report կոճակը ցուցադրվում է @@ -692,7 +751,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Download կոճակը թաքցված է Download կոճակը ցուցադրվում է + This button usually appears on videos uploaded by the logged-in user. --> Թաքցնել Հայփը Հայփ կոճակը թաքնված է Հայփ կոճակը ցուցադրվում է @@ -705,7 +764,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Thanks կոճակը թաքցված է Thanks կոճակը ցուցադրվում է + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Թաքցնել հարցումը Հարցման կոճակը թաքցված է Հարցման կոճակը երևում է @@ -713,6 +772,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել Clip Clip կոճակը թաքցված է Clip կոճակը ցուցադրվում է + Թաքցնելը կարող է չաշխատել որոշ օգտվողների հաշիվների համար։ Թաքցնել Խանութը Խանութի կոճակը թաքնված է @@ -722,13 +782,13 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Պահելու կոճակը թաքցված է Պահելու կոճակը ցուցադրված է - + Նավիգացիայի կոճակներ - Թաքցնել կամ փոխել կոճակները նավիգացիայի վանդակում + Թաքցնել կամ փոխել նավիգացիոն գծի կոճակները - Թաքցնել Home - Home կոճակը թաքցված է - Home կոճակը ցուցադրվում է + Թաքցնել Գլխավորը + «Գլխավոր» կոճակը թաքնված է + «Գլխավոր» կոճակը ցուցադրված է Թաքցնել Shorts Shorts կոճակը թաքցված է @@ -746,26 +806,44 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Ծանուցումների կոճակը ցուցադրվում է Փոխել Create-ը Notifications-ի հետ - "«Ստեղծել» կոճակը փոխարինվում է «Հայտարարություններ» կոճակով - -Նշում. Այս կարգավորման միացումը նաև ստիպում է թաքցնել տեսանյութի գովազդները" + Create կոճակը փոխվել է Notifications կոճակի հետ Create կոճակը չի փոխվել Notifications կոճակի հետ - "Այս կարգավորումն անջատելը նաև կանջատի Shorts գովազդների արգելափակումը։ - -Եթե այս կարգավորումը փոխելը չի ազդում, փորձեք անցնել անհայտ ռեժիմ։" - Թաքցնել նավիգացիայի կոճակների մակագրությունները - Մակագրությունները թաքցված են - Մակագրությունները ցուցադրվում են + Եթե այս կարգավորումը փոխելը արդյունք չի տալիս, փորձեք անցնել Ինկոգնիտո ռեժիմի։ + Թաքցնել նավիգացիոն կոճակների պիտակները + Պիտակները թաքնված են + Պիտակները ցուցադրված են + Միացնել նեղ նավիգացիոն կոճակները + Նավիգացիոն կոճակների միջև հեռավորությունը նեղ է + Նավիգացիոն կոճակների միջև հեռավորությունը նորմալ է + Միացնել նավիգացիոն գծի անիմացիաները + Նավիգացիոն անցումները անիմացված են + Նավիգացիոն անցումները անիմացված չեն Անջատել կիսաթափանց կարգավիճակի տողը - Վիճակի նوارը անթափանց է - Վիճակի նշագիծը անթափանց է կամ կիսաթափանց - Որոշ սարքերում այս գործառույթի միացումը կարող է համակարգի նավիգացիոն տողը դարձնել թափանցիկ։ + Կարգավիճակի տողը անթափանց է + Կարգավիճակի տողը անթափանց է կամ կիսաթափանց + "Սահմանափակումներ. +• Տեսանվագարկչի վերևում կարող է հայտնվել սև գիծ։ +• Որոշ սարքերում այս գործառույթը միացնելը կարող է համակարգի նավիգացիոն գիծը դարձնել թափանցիկ։" Անջատել կիսաթափանց լուսավոր շերտը Լուսավոր ռեժիմի նավիգացիոն շերտը անթափանց է - Լույսի ռեժիմի նավիգացիոն նշագիծը անթափանց է կամ կիսաթափանց - Անջատել մուգ կիսաթափանց նշագիծ + Լուսավոր ռեժիմի նավիգացիոն շերտը անթափանց է կամ կիսաթափանց + Անջատել մուգ կիսաթափանց շերտը Մութ ռեժիմի նավիգացիոն շերտը անթափանց է - Մուգ ռեժիմի նավիգացիոն նշագիծը անթափանց է կամ կիսաթափանց + Մուգ ռեժիմի նավիգացիոն շերտը անթափանց է կամ կիսաթափանց + Գործիքագոտի + Թաքցնել կամ փոխել գործիքագոտու բաղադրիչները + Թաքցնել Create կոճակը + Create կոճակը թաքցված է + Create կոճակը ցուցադրվում է + Թաքցնել Ծանուցումների կոճակը + Ծանուցումների կոճակը թաքցված է + Ծանուցումների կոճակը ցուցադրվում է + Թաքցնել որոնման կոճակը + Որոնման կոճակը թաքցված է + Որոնման կոճակը ցուցադրվում է. + Ակտիվացնել լայն որոնման տողը + Լայն որոնման տողը ակտիվացված է + Լայն որոնման տողը անակտիվ է Flyout մենյու @@ -840,6 +918,12 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել Cast կոճակը Թափոնելու կոճակը թաքցված է Թափոնելու կոճակը երևում է + Թաքցնել Փլուզման կոճակը + Փլուզման կոճակը թաքնված է + Փլուզման կոճակը ցուցադրվում է + Թաքցնել Լիաէկրան կոճակը + Լիաէկրան կոճակը թաքնված է + Լիաէկրան կոճակը ցուցադրվում է Թաքցնել նվագարկչի կառավարման վահանակի ֆոնը Նվագարկչի կառավարման վահանակի ֆոնը թաքնված է Նվագարկչի կառավարման վահանակի ֆոնը ցուցադրվում է @@ -848,9 +932,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Կոճակները երևում են - Էկրանի վերջում քարտերը թաքցնել - Էկրանի վերջում քարտերը թաքցված են - Էկրանի վերջում քարտերը երևում են + Էկրանի վերջում քարտերը թաքցնել + Էկրանի վերջում քարտերը թաքցված են + Էկրանի վերջում քարտերը երևում են Անջատել շրջապատող ռեժիմը լիարժեք էկրանում @@ -875,10 +959,16 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել տեսանյութերի մանրապատկերների ժամանակագիծը Տեսանյութերի մանրապատկերների ժամանակագիծը թաքցված է Տեսանյութերի մանրապատկերների ժամանակագիծը ցուցադրված է + Միացնել լիաէկրան մեծ որոնման ձողը + Լիաէկրան որոնման ձողը մեծ չափի է + Լիաէկրան որոնման ձողը նորմալ չափի է Shorts կրող Թաքցնել կամ ցուցադրել Shorts նվագարկիչի բաղադրիչները + Թաքցնել Shorts-ը ալիքի էջում + Թաքնված է ալիքի էջում + Ցուցադրված է ալիքի էջում Թաքցնել Shorts-ը Գլխավորի լրահոսում Թաքնված է Գլխավորի լրահոսում և հարակից տեսանյութերում @@ -890,9 +980,18 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել Shorts-ը Բաժանորդագրությունների լրահոսում Թաքնված է Բաժանորդագրությունների լրահոսում Ցուցադրված է Բաժանորդագրությունների լրահոսում + Թաքցնել Shorts-ը տեսանյութի նկարագրության մեջ + Թաքնված է տեսանյութի նկարագրության մեջ + Ցուցադրված է տեսանյութի նկարագրության մեջ Թաքցնել շորտերը դիտման պատմության մեջ Թաքնված է դիտման պատմության մեջ Ցուցադրվում է դիտման պատմության մեջ + Թաքցնել AI կոճակը + AI կոճակը թաքնված է + AI կոճակը ցուցադրվում է + Թաքցնել «Ավտոմատ կրկնօրինակված» պիտակը + Ավտոմատ կրկնօրինակված պիտակը թաքնված է + Ավտոմատ կրկնօրինակված պիտակը ցուցադրվում է Թաքցնել «Ավտոմատ կրկնօրինակված» պիտակը Ավտոմատ կրկնօրինակված պիտակը թաքնված է Ավտոմատ կրկնօրինակված պիտակը ցուցադրվում է @@ -954,6 +1053,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել «Օգտագործել այս ձևանմուշը» կոճակը «Օգտագործել այս ձևանմուշը» կոճակը թաքցված է Օգտագործել այս ձևանմուշի կոճակը ցուցադրված է + Թաքցնել «Like» կոճակի շատրվանի անիմացիան \"Like\" կոճակի ֆունտանային անիմացիան թաքցված է \"Like\" կոճակի ֆունտանային անիմացիան երևում է @@ -996,7 +1096,12 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Նավիգացիայի ձողը թաքցված է Նավիգացիայի ձողը երևում է - + + Թաքցնել ավտոմատ նախադիտումը + Ավտոմատ նախադիտումը թաքնված է + Ավտոմատ նախադիտումը ցուցադրվում է + + Թաքցնել վերջնական էկրանին առաջարկվող տեսանյութը "Վերջնական էկրանին առաջարկվող տեսանյութը թաքցված է, երբ ավտոմատ նվագարկումն անջատված է @@ -1015,9 +1120,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Ժամանակային կետը երևում է - Թաքցնել հաղորդակցման վահանակների ելնող պատուհանները - Հաղորդակցման վահանակների ելնող պատուհանները թաքցված են - Հաղորդակցման վահանակների ելնող պատուհանները երևում են + Թաքցնել հաղորդակցման վահանակների ելնող պատուհանները + Հաղորդակցման վահանակների ելնող պատուհանները թաքցված են + Հաղորդակցման վահանակների ելնող պատուհանները երևում են Տեսանյութի ավարտին դուրս գալ լիաէկրան ռեժիմից @@ -1085,25 +1190,6 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Client-ի կողմից սահմանված արագության սահմանափակումը հանդիպել է %d անգամ %d միլիվայրկյան - - Ակտիվացնել լայն որոնման տողը - Լայն որոնման տողը ակտիվացված է - Լայն որոնման տողը անակտիվ է - - - Ակտիվացնել բարձր որակի մանրապատկերները - Seekbar-ի մանրապատկերները բարձր որակի են - Seekbar-ի մանրապատկերները միջին որակի են - Fullscreen Seekbar-ի մանրապատկերները միջին որակի են - "Այս կարգավորումը կվերականգնի նաև livestream-ների մեջ մինչև այսօր գոյություն չունեցող thumbnails-ները։ - -Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչպես ընթացիկ տեսանյութը։ - -Այս հատկությունը լավագույնս աշխատում է 720p կամ ավելի ցածր որակի տեսանյութի դեպքում և արագ ինտերնետ կապի դեպքում։" - Վերականգնել հին Seekbar մանրապատկերները - Seekbar մանրապատկերները կհայտնվեն Seekbar-ի վերևում - Seekbar մանրապատկերները կհայտնվեն fullscreen-ում - Ակտիվացնել SponsorBlock SponsorBlock е կամավարական համակարգ, որը նախատեսված է YouTube տեսանյութերի ձանձրալի հատվածները բաց թողնելու համար @@ -1204,7 +1290,7 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Շեղում / Կատակներ Երկրորդական տեսարաններ կամ կատակներ, որոնք անհրաժեշտ չեն տեսանյութի հիմնական բովանդակությունը հասկանալու համար։ Չի ներառում համատեքստ կամ ֆոնային մանրամասներ տրամադրող հատվածներ Երաժշտություն՝ ոչ երաժշտական բաժին - Միայն երաժշտական տեսահոլովակներում օգտագործելու համար: Երաժշտական տեսահոլովակների բաժիններ առանց երաժշտության, որոնք դեռ չեն ընդգրկված մեկ այլ կատեգորիայի կողմից + Միայն երաժշտական տեսահոլովակներում օգտագործելու համար: Երաժշտական տեսահոլովակների բաժիններ առանց երաժշտության, որոնք դեռ չեն ընդգրկված մեկ այլ կատեգորիայի կողմից Բաց թողնել Ընդգծել Բաց թողնել հովանավորը @@ -1343,8 +1429,6 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Spoof-ի կիրառության տարբերակի նպատակ 20.13.41 - Վերականգնել չծալված տեսանյութի գործողությունների տողը 20.05.46 - Վերականգնել արտագրման ֆունկցիոնալությունը - 19.35.36 - Վերականգնել հին Shorts պլեյերի պատկերակները - 19.01.34 - Վերականգնել հին նավիգացիոն պատկերակները Փոխել մեկնարկային էջը @@ -1449,8 +1533,9 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Բեռնման էկրանը կունենա գրադիենտի ֆոն Բեռնման էկրանը կունենա մեկ գույնի ֆոն Մեկնարկային էկրանի ոճը - Գույն - Սև և սպիտակ + Անջատված է + Գույն + Սև և սպիտակ Աктиվացնել հարմարեցված seekbar-ի գույնը Հարմարեցված seekbar-ի գույնը ցուցադրվում է Սկզբնական seekbar-ի գույնը ցուցադրվում է @@ -1557,6 +1642,9 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Անջատել հետարկել որոնման հպումը Հետարկել որոնման հպումն անջատված է Հետարկել որոնման հպումը միացված է + Անջատել հպման և պահելու հապտիկան + Հպման և պահելու հապտիկան անջատված է + Հպման և պահելու հապտիկան միացված է Զուումի հպումների ակտիվացումը անջատել Զուումի հպումն անջատված է Զուումի հպումը միացված է @@ -1652,6 +1740,11 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Տեսանյութի որակի ընդլայնված մենյուն ցուցադրվում է Տեսանյութի որակի ընդլայնված մենյուն չի ցուցադրվում + + Թաքցնել Պրեմիում որակի տարբերակները + Պրեմիում որակի տարբերակները թաքնված են + Պրեմիում որակի տարբերակները ցուցադրվում են + Ակտիվացնել սահելը համար ընտրելու Սահելը համար ընտրելը ակտիվացված է @@ -1683,6 +1776,7 @@ AV1-ով տեսանյութի նվագարկումը կարող է ընդհատ + Մասին Գովազդներ Ընդհանուր diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 3fac2ca961..a0182ee1ba 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -18,1270 +18,1355 @@ Second \"item\" text" --> - - - Nama aplikasi - - Khusus - Ikon aplikasi - Asli - ReVanced - - ReVanced minimal - ReVanced berskala - - Khusus - - - Pemeriksaan gagal - Buka situs resmi - Abaikan - <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. - Ditambal pada perangkat yang berbeda - Tidak terpasang oleh ReVanced Manager - Ditambal lebih dari 10 menit yang lalu - Ditambal %s hari yang lalu - Tanggal pembuatan APK rusak - - - Pemberitahuan ReVanced - Riwayat tontonan Anda tidak sedang disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. - Jangan tampilkan lagi - - - Pengaturan - ReVanced - Apakah Anda yakin ingin melanjutkan? - Simpan - Setel ulang - Setel ulang warna - Warna tidak sah - Memerlukan mulai ulang - Mulai ulang aplikasi agar perubahan ini dapat diterapkan. - Mulai ulang - Impor - Salin - Pengaturan ReVanced diatur ke bawaan - %d Setelan terimpor - Impor gagal: %s - Pengaturan pencarian - Tidak ada hasil yang ditemukan untuk \'%s\' - Coba kata kunci lain - Pencarian terbaru - Hapus dari riwayat pencarian? - Hapus riwayat pencarian - Apakah Anda yakin ingin menghapus semua riwayat pencarian? - Tips Pencarian - "• Ketuk jalur untuk menelusuri ke jalur tersebut + + + Nama aplikasi + + Khusus + Ikon aplikasi + Asli + ReVanced + + ReVanced minimal + ReVanced berskala + + Khusus + + + Pemeriksaan gagal + Buka situs resmi + Abaikan + <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. + Ditambal pada perangkat yang berbeda + Tidak terpasang oleh ReVanced Manager + Ditambal lebih dari 10 menit yang lalu + Ditambal %s hari yang lalu + Tanggal pembuatan APK rusak + + + Pemberitahuan ReVanced + Riwayat tontonan Anda tidak sedang disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. + Jangan tampilkan lagi + + + Pengaturan + ReVanced + Apakah Anda yakin ingin melanjutkan? + Simpan + Setel ulang + Setel ulang warna + Warna tidak sah + Memerlukan mulai ulang + Mulai ulang aplikasi agar perubahan ini dapat diterapkan. + Mulai ulang + Impor + Salin + Pengaturan ReVanced diatur ke bawaan + %d Setelan terimpor + Impor gagal: %s + Pengaturan pencarian + Tidak ada hasil yang ditemukan untuk \'%s\' + Coba kata kunci lain + Pencarian terbaru + Hapus dari riwayat pencarian? + Hapus riwayat pencarian + Apakah Anda yakin ingin menghapus semua riwayat pencarian? + Tips Pencarian + "• Ketuk jalur untuk menelusuri ke jalur tersebut • Tekan lama pada pengaturan untuk menelusuri ke jalur tersebut • Tekan Enter untuk menyimpan kueri pencarian ke riwayat • Pencarian mengabaikan huruf besar/kecil dan tanda baca • Pengaturan utama muncul di atas pengaturan sampingan yang dinonaktifkan" - Riwayat pencarian kosong - Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter - Tampilkan riwayat pencarian setelan - Riwayat pencarian setelan ditampilkan - Riwayat pencarian setelan tidak ditampilkan - Tampilkan ikon pengaturan ReVanced - Ikon pengaturan ditampilkan - Ikon pengaturan tidak ditampilkan - Bahasa ReVanced - "Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap. + Riwayat pencarian kosong + Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter + Tampilkan riwayat pencarian setelan + Riwayat pencarian setelan ditampilkan + Riwayat pencarian setelan tidak ditampilkan + Nonaktifkan ikon tebal + Ikon tidak tebal + Ikon tebal + Tampilkan ikon pengaturan ReVanced + Ikon pengaturan ditampilkan + Ikon pengaturan tidak ditampilkan + Bahasa ReVanced + "Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap. Untuk menerjemahkan bahasa baru atau meningkatkan terjemahan yang sudah ada, kunjungi translate.revanced.app" - Bahasa aplikasi - Impor / Ekspor - Impor / Ekspor setelan ReVanced - - Anda menggunakan ReVanced Patches versi <i>%s</i> - Catatan - Versi ini adalah pra-rilis dan Anda mungkin mengalami masalah yang tidak terduga - Tautan resmi - + Anda menggunakan ReVanced Patches versi <i>%s</i> + Catatan + Versi ini adalah pra-rilis dan Anda mungkin mengalami masalah yang tidak terduga + Tautan resmi + - - - Pengaturan GmsCore - Pengaturan untuk GmsCore - - MicroG GmsCore belum dipasang. Pasang dulu. - Tindakan diperlukan - "MicroG GmsCore tidak memiliki izin untuk berjalan di latar belakang. + + + GmsCore + Pengaturan terkait GmsCore + Periksa pembaruan GmsCore + Pemeriksaan pembaruan diaktifkan + Pemeriksaan pembaruan dinonaktifkan + Buka Pengaturan GmsCore + Pengaturan GmsCore + + MicroG GmsCore belum dipasang. Pasang dulu. + Diperlukan tindakan + Gagal memeriksa pembaruan MicroG GmsCore + Versi baru (%1$s) MicroG GmsCore tersedia. Saat ini, Anda menggunakan versi %2$s. + "MicroG GmsCore tidak memiliki izin untuk berjalan di latar belakang. -Ikuti panduan \"Jangan bunuh aplikasi saya\" untuk ponsel Anda, dan terapkan instruksi ke instalasi MicroG Anda. +Ikuti panduan \"Don't kill my app\" untuk ponsel Anda, dan terapkan instruksinya ke pemasangan MicroG Anda. Ini diperlukan agar aplikasi berfungsi." - Buka situs - "Pengoptimalan baterai MicroG GmsCore harus dinonaktifkan untuk mencegah masalah. + Buka situs web + Batalkan + "Pengoptimalan baterai MicroG GmsCore harus dinonaktifkan untuk mencegah masalah. Menonaktifkan pengoptimalan baterai MicroG tidak akan berdampak buruk pada penggunaan baterai. Ketuk tombol lanjutkan dan izinkan perubahan pengoptimalan." - Lanjutkan - - - Palsukan aliran video - Palsukan klien aliran video untuk mencegah masalah pemutaran - Palsukan aliran video - Palsukan klien aliran video untuk mencegah masalah pemutaran - Palsukan aliran video - "Aliran video dipalsukan + Lanjutkan + + + Palsukan aliran video + Palsukan klien aliran video untuk mencegah masalah pemutaran + Palsukan aliran video + Palsukan klien aliran video untuk mencegah masalah pemutaran + Palsukan aliran video + "Aliran video dipalsukan Jika Anda adalah pengguna YouTube Premium, setelan ini mungkin tidak diperlukan" - "Aliran video tidak dipalsukan + "Aliran video tidak dipalsukan Pemutaran mungkin tidak berfungsi" - Mematikan pengaturan ini dapat menyebabkan masalah pemutaran. - Klien bawaan - - - Paksa bahasa audio asli - Menggunakan bahasa audio asli - Menggunakan audio bawaan - - Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio - - - Debug - Mengaktifkan atau menonaktifkan pilihan debugging - Pencatatan debug - Pencatatan debug diaktifkan - Pencatatan debug dinonaktifkan - Jejak catatan stack - Pencatatan debug menyertakan jejak stack - Pencatatan debug tidak menyertakan jejak stack - Tampilkan pesan timbul pada kesalahan ReVanced - Pesan timbul ditampilkan jika terjadi kesalahan - Pesan timbul tidak ditampilkan jika terjadi kesalahan - "Mematikan notifikasi kesalahan menyembunyikan semua notifikasi kesalahan ReVanced. + Mematikan pengaturan ini dapat menyebabkan masalah pemutaran. + Klien bawaan + + + Paksa bahasa audio asli + Menggunakan bahasa audio asli + Menggunakan audio bawaan + + Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio + + + Debug + Mengaktifkan atau menonaktifkan pilihan debugging + Pencatatan debug + Pencatatan debug diaktifkan + Pencatatan debug dinonaktifkan + Jejak catatan stack + Pencatatan debug menyertakan jejak stack + Pencatatan debug tidak menyertakan jejak stack + Tampilkan pesan timbul pada kesalahan ReVanced + Pesan timbul ditampilkan jika terjadi kesalahan + Pesan timbul tidak ditampilkan jika terjadi kesalahan + "Mematikan notifikasi kesalahan menyembunyikan semua notifikasi kesalahan ReVanced. Anda tidak akan diberi tahu tentang kejadian yang tidak terduga." - Ekspor catatan debug - Salin catatan debug ReVanced ke papan klip - Pencatatan debug dinonaktifkan - Tidak ditemukan catatan - Catatan disalin - Gagal mengekspor catatan: %s - Bersihkan catatan debug - Membersihkan semua catatan debug ReVanced yang tersimpan - Catatan dibersihkan - Fitur pengelolaan tanda - Kelola tanda fitur boolean - Tanda aktif (%d) - Tanda diblokir (%d) - Cari tanda... - Tanda disimpan - Tanda diatur ulang - Tanda disalin ke papan klip - Catatan protokol buffer - Pencatatan debug termasuk buffer proto - Pencatatan debug tidak menyertakan buffer proto - "Mengaktifkan setelan ini akan mencatat data tata letak tambahan, termasuk teks pada layar untuk beberapa komponen UI. + Ekspor catatan debug + Salin catatan debug ReVanced ke papan klip + Pencatatan debug dinonaktifkan + Tidak ditemukan catatan + Catatan disalin + Gagal mengekspor catatan: %s + Bersihkan catatan debug + Membersihkan semua catatan debug ReVanced yang tersimpan + Catatan dibersihkan + Fitur pengelolaan tanda + Kelola tanda fitur boolean + Tanda aktif (%d) + Tanda diblokir (%d) + Cari tanda... + Tanda disimpan + Tanda diatur ulang + Tanda disalin ke papan klip + Mulai ulang aplikasi untuk menggunakan fitur ini + Catatan protokol buffer + Pencatatan debug termasuk buffer proto + Pencatatan debug tidak menyertakan buffer proto + "Mengaktifkan setelan ini akan mencatat data tata letak tambahan, termasuk teks pada layar untuk beberapa komponen UI. Ini dapat membantu mengidentifikasi komponen saat membuat penyaring khusus. Namun, mengaktifkan ini juga akan mencatat beberapa data pengguna seperti alamat IP Anda." - - - Bersihkan tautan berbagi - Parameter kueri pelacakan dihapus dari tautan yang dibagikan - Parameter kueri pelacakan tidak dihapus dari tautan yang dibagikan - Ubah tautan berbagi ke youtube.com - Tautan yang dibagikan menggunakan youtube.com - Tautan yang dibagikan menggunakan music.youtube.com - - - Penyaring khusus - Sembunyikan komponen menggunakan penyaring khusus - Aktifkan penyaring khusus - Penyaring khusus diaktifkan - Penyaring khusus dinonaktifkan - Penyaring khusus - - Daftar untaian pembuat jalur komponen untuk disaring dipisahkan oleh baris baru - Penyaring khusus tidak sah: %s - - - - - Tentang - Iklan - Thumbnail alternatif - Umpan - Umum - Pemutar - Shorts - Seekbar - Kontrol usap - Return YouTube Dislike - Lain-lain - Video - Pulihkan menu pengaturan lama - Menu pengaturan lama ditampilkan - Menu pengaturan lama tidak ditampilkan - - - Nonaktifkan pemutaran Shorts di latar belakang - Pemutaran Shorts di latar belakang dinonaktifkan - Pemutaran Shorts di latar belakang diaktifkan - - - Sembunyikan kartu album - Kartu album disembunyikan - Kartu album ditampilkan - Sembunyikan kartu artis - Kartu artis disembunyikan - Kartu artis ditampilkan - Sembunyikan kepingan rak - Kepingan rak disembunyikan - Kepingan rak ditampilkan - Sembunyikan postingan komunitas - Postingan komunitas disembunyikan - Postingan komunitas ditampilkan - Sembunyikan spanduk ringkas - Spanduk ringkas disembunyikan - Spanduk ringkas ditampilkan - Sembunyikan kartu yang dapat diperluas - Kartu yang dapat diperluas di bawah video disembunyikan - Kartu yang dapat diperluas di bawah video ditampilkan - Sembunyikan tombol mikrofon mengambang - Tombol mikrofon mengambang di pencarian disembunyikan - Tombol mikrofon mengambang dalam pencarian ditampilkan - Sembunyikan rak-rak mendatar - "Rak horizontal disembunyikan, seperti: + + + Bersihkan tautan berbagi + Parameter kueri pelacakan dihapus dari tautan yang dibagikan + Parameter kueri pelacakan tidak dihapus dari tautan yang dibagikan + Ubah tautan berbagi ke youtube.com + Tautan yang dibagikan menggunakan youtube.com + Tautan yang dibagikan menggunakan music.youtube.com + + + Penyaring khusus + Sembunyikan komponen menggunakan penyaring khusus + Aktifkan penyaring khusus + Penyaring khusus diaktifkan + Penyaring khusus dinonaktifkan + Penyaring khusus + + Daftar string komponen pembuat jalur yang akan disaring dipisahkan oleh baris baru + Penyaring khusus tidak sah: %s + + + + + Tentang + Iklan + Thumbnail alternatif + Umpan + Umum + Pemutar + Shorts + Seekbar + Kontrol usap + Return YouTube Dislike + Lain-lain + Video + Pulihkan menu pengaturan lama + Menu pengaturan lama ditampilkan + Menu pengaturan lama tidak ditampilkan + + + Nonaktifkan pemutaran Shorts di latar belakang + Pemutaran Shorts di latar belakang dinonaktifkan + Pemutaran Shorts di latar belakang diaktifkan + + + Sembunyikan rak toko kreator + Rak toko kreator di bawah pemutar video disembunyikan + Rak toko kreator di bawah pemutar video ditampilkan + Sembunyikan kartu album + Kartu album disembunyikan + Kartu album ditampilkan + Sembunyikan kartu artis + Kartu artis disembunyikan + Kartu artis ditampilkan + Sembunyikan kepingan rak + Kepingan rak disembunyikan + Kepingan rak ditampilkan + Sembunyikan bagian komentar di bawah video di umpan Beranda + Bagian komentar di bawah video di umpan Beranda disembunyikan + Bagian komentar di bawah video di umpan Beranda ditampilkan + Sembunyikan postingan komunitas + Postingan komunitas disembunyikan + Postingan komunitas ditampilkan + Sembunyikan spanduk ringkas + Spanduk ringkas disembunyikan + Spanduk ringkas ditampilkan + Sembunyikan kartu yang dapat diperluas + Kartu yang dapat diperluas di bawah video disembunyikan + Kartu yang dapat diperluas di bawah video ditampilkan + Sembunyikan tombol mikrofon mengambang + Tombol mikrofon mengambang di pencarian disembunyikan + Tombol mikrofon mengambang dalam pencarian ditampilkan + Sembunyikan rak-rak mendatar + "Rak horizontal disembunyikan, seperti: • Berita terkini • Lanjutkan menonton • Jelajahi lebih banyak saluran • Paling relevan • Belanja • Tonton lagi" - Rak horizontal ditampilkan - Sembunyikan rak gambar - Rak gambar dalam hasil pencarian disembunyikan - Rak gambar dalam hasil pencarian ditampilkan - Sembunyikan postingan terbaru - Postingan terbaru disembunyikan - Postingan terbaru ditampilkan - Sembunyikan daftar putar campuran - Daftar putar campuran disembunyikan - Daftar putar campuran ditampilkan - Sembunyikan bagian film - Bagian film disembunyikan - Bagian film ditampilkan - - Sembunyikan \'Beri tahu saya\' - Tombol beri tahu saya disembunyikan - Tombol beri tahu saya ditampilkan - Sembunyikan Permainan - Permainan disembunyikan - Permainan ditampilkan - + Sembunyikan tombol \'Video terbaru\' + Tombol video terbaru disembunyikan + Tombol video terbaru ditampilkan + Sembunyikan daftar putar campuran + Daftar putar campuran disembunyikan + Daftar putar campuran ditampilkan + Sembunyikan bagian film + Bagian film disembunyikan + Bagian film ditampilkan + + Sembunyikan \'Beri tahu saya\' + Tombol beri tahu saya disembunyikan + Tombol beri tahu saya ditampilkan + Sembunyikan Permainan + Permainan disembunyikan + Permainan ditampilkan + - Sembunyikan tombol \'Tampilkan selengkapnya\' - Tombol tampilkan lebih banyak di hasil pencarian disembunyikan - Tombol tampilkan lebih banyak di hasil pencarian ditampilkan - Sembunyikan survei - Survei disembunyikan - Survei ditampilkan - Sembunyikan rak tiket - Rak tiket disembunyikan - Rak tiket ditampilkan - - Sembunyikan label rekomendasi video - Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian disembunyikan - Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian ditampilkan - Sembunyikan pemisah visual - Pemisah visual disembunyikan - Pemisah visual ditampilkan - - Sembunyikan YouTube Doodles - Animasi YouTube Doodles pada logo disembunyikan - Animasi YouTube Doodles pada logo ditampilkan - "YouTube Doodle muncul beberapa hari setiap tahun. - -Jika Doodle saat ini ditampilkan di wilayah Anda dan pengaturan penyembunyi ini aktif, bilah filter di bawah bilah pencarian juga akan disembunyikan." - Sembunyikan bilah saluran - Bilah saluran disembunyikan - Bilah saluran ditampilkan - Sembunyikan tanda air saluran - Tanda air disembunyikan - Tanda air ditampilkan - Sembunyikan kotak penggalangan dana - Kotak penggalangan dana disembunyikan - Kotak penggalangan dana ditampilkan - Sembunyikan kotak darurat - Kotak darurat disembunyikan - Kotak darurat ditampilkan - Sembunyikan panel info - Panel info disembunyikan - Panel info ditampilkan - - Sembunyikan tombol Gabung - Tombol Gabung disembunyikan - Tombol Gabung ditampilkan - Sembunyikan panel medis - Panel medis disembunyikan - Panel medis ditampilkan - Sembunyikan tindakan cepat - Tindakan cepat dalam layar penuh disembunyikan - Tindakan cepat dalam layar penuh ditampilkan - Sembunyikan video terkait - Video terkait dalam tindakan cepat disembunyikan - Video terkait dalam tindakan cepat ditampilkan - Sembunyikan panduan pelanggan - Pedoman komunitas pelanggan disembunyikan - Pedoman komunitas pelanggan ditampilkan - Sembunyikan reaksi terjadwal - Reaksi terjadwal disembunyikan - Reaksi terjadwal ditampilkan - Sembunyikan \'Ringkasan video yang dibuat AI\' - Bagian ringkasan video buatan AI disembunyikan - Bagian ringkasan video buatan AI ditampilkan - Sembunyikan Tanya - Bagian Tanya disembunyikan - Bagian Tanya ditampilkan - Sembunyikan Atribut - Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan - Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan - Sembunyikan Bab - Bagian Bab disembunyikan - Bagian Bab ditampilkan - Sembunyikan \'Cara konten ini dibuat\' - Bagian Cara konten ini dibuat disembunyikan - Bagian Cara konten ini dibuat ditampilkan - Sembunyikan Poin Hype - Poin Hype disembunyikan - Poin Hype ditampilkan - Sembunyikan \'Jelajahi podcast\' - Bagian Jelajahi podcast disembunyikan - Bagian Jelajahi podcast ditampilkan - Sembunyikan tautan unggulan - Bagian tautan unggulan disembunyikan - Bagian tautan unggulan ditampilkan - Sembunyikan video unggulan - Bagian video unggulan disembunyikan - Bagian video unggulan ditampilkan - Sembunyikan kartu Info - Bagian kartu info disembunyikan - Bagian kartu info ditampilkan - Sembunyikan \'Konsep utama\' - Bagian Konsep utama disembunyikan - Bagian Konsep utama ditampilkan - Sembunyikan tombol Berlangganan - Tombol Langganan disembunyikan - Tombol Langganan ditampilkan - Sembunyikan Transkrip - Bagian transkrip disembunyikan - Bagian transkrip ditampilkan - Keterangan video - Sembunyikan atau tampilkan komponen keterangan video - Bilah saring - Sembunyikan atau tampilkan bilah penyaring di umpan, video terkait, hasil pencarian, dan riwayat tontonan - Sembunyikan di umpan - Disembunyikan di umpan - Ditampilkan di umpan - Sembunyikan di video terkait - Disembunyikan di video terkait - Ditampilkan di video terkait - Sembunyikan di hasil penelusuran - Disembunyikan di hasil penelusuran - Ditampilkan di hasil penelusuran - Sembunyikan di riwayat tontonan - Disembunyikan di riwayat tontonan - Ditampilkan di riwayat tontonan - Halaman saluran - Sembunyikan atau tampilkan komponen halaman saluran - - Sembunyikan tombol Komunitas - Tombol Komunitas disembunyikan - Tombol Komunitas ditampilkan - - Sembunyikan rak \'Untuk Anda\' - Rak Untuk Anda disembunyikan - Rak Untuk Anda ditampilkan - - Sembunyikan tombol Gabung - Tombol Gabung disembunyikan - Tombol Gabung ditampilkan - Sembunyikan pratinjau tautan - Pratinjau tautan disembunyikan - Pratinjau tautan ditampilkan - Sembunyikan rak anggota - Rak anggota disembunyikan - Rak anggota ditampilkan - - Sembunyikan tombol Belanja - Tombol Belanja disembunyikan - Tombol Belanja ditampilkan - - Sembunyikan tombol Berlangganan - Tombol Langganan disembunyikan - Tombol Langganan ditampilkan - Komentar - Sembunyikan atau tampilkan komponen bagian komentar - Sembunyikan ringkasan chat AI - Ringkasan chat AI disembunyikan - Ringkasan chat AI ditampilkan - Sembunyikan ringkasan Komentar AI - Ringkasan komentar AI disembunyikan - Ringkasan komentar AI ditampilkan - Sembunyikan pedoman saluran - Pedoman saluran disembunyikan - Pedoman saluran ditampilkan - Sembunyikan header \'Komentar oleh anggota\' - Header Komentar oleh anggota disembunyikan - Header Komentar oleh anggota ditampilkan - Sembunyikan bagian komentar - Bagian komentar disembunyikan - Bagian komentar ditampilkan - Sembunyikan pedoman komunitas - Pedoman komunitas disembunyikan - Pedoman komunitas ditampilkan - Sembunyikan tombol \'Buat Short\' - Tombol Buat Short disembunyikan - Tombol Buat Short ditampilkan - Sembunyikan tombol Emoji dan Penanda Waktu - Tombol Emoji dan Penanda Waktu disembunyikan - Tombol Emoji dan Penanda Waktu ditampilkan - Sembunyikan pratinjau komentar - Pratinjau komentar disembunyikan - Pratinjau komentar ditampilkan - Sembunyikan tombol Terima Kasih - Tombol terima kasih disembunyikan - Tombol terima kasih ditampilkan - Sembunyikan jumlah penayangan - Jumlah penayangan disembunyikan di umpan dan hasil pencarian - Jumlah penayangan ditampilkan di umpan dan hasil pencarian - - "Keterbatasan: -• Rak Shorts, halaman saluran, dan hasil pencarian mungkin masih menampilkan jumlah penayangan -• Fitur ini tidak berfungsi dengan faktor bentuk otomotif" - Sembunyikan waktu unggah - Waktu unggah disembunyikan di umpan dan hasil penelusuran - Waktu unggah ditampilkan di umpan dan hasil penelusuran - - "Keterbatasan: -• Rak Shorts, halaman saluran, dan hasil penelusuran mungkin masih menampilkan waktu unggah -• Fitur ini tidak berfungsi dengan faktor bentuk otomotif" - Sembunyikan kata kunci konten - Sembunyikan pencarian dan feed video menggunakan penyaring kata kunci - Sembunyikan video beranda dengan kata kunci - Video di tab beranda disaring berdasarkan kata kunci - Video di tab beranda tidak disaring berdasarkan kata kunci - Sembunyikan hasil pencarian berdasarkan kata kunci - Hasil pencarian disaring berdasarkan kata kunci - Hasil pencarian tidak disaring berdasarkan kata kunci - Sembunyikan video langganan dengan kata kunci - Video di tab langganan disaring berdasarkan kata kunci - Video di tab langganan tidak disaring berdasarkan kata kunci - Kata kunci yang ingin disembunyikan - + Sembunyikan label rekomendasi video + Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian disembunyikan + Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian ditampilkan + Sembunyikan pemisah visual + Pemisah visual disembunyikan + Pemisah visual ditampilkan + Sembunyikan hasil pencarian web + Hasil pencarian web disembunyikan + Hasil pencarian web ditampilkan + Sembunyikan bagian \'Anda mungkin suka\' + Bagian \'Anda mungkin suka\' disembunyikan + Bagian \'Anda mungkin suka\' ditampilkan + + Sembunyikan YouTube Doodles + Animasi YouTube Doodles pada logo disembunyikan + Animasi YouTube Doodles pada logo ditampilkan + Sembunyikan bilah saluran + Bilah saluran disembunyikan + Bilah saluran ditampilkan + Sembunyikan tanda air saluran + Tanda air disembunyikan + Tanda air ditampilkan + Sembunyikan kotak penggalangan dana + Kotak penggalangan dana disembunyikan + Kotak penggalangan dana ditampilkan + Sembunyikan kotak darurat + Kotak darurat disembunyikan + Kotak darurat ditampilkan + Sembunyikan panel info + Panel info disembunyikan + Panel info ditampilkan + + Sembunyikan tombol Gabung + Tombol Gabung disembunyikan + Tombol Gabung ditampilkan + + Sembunyikan tombol \'Tayangan ulang obrolan siaran langsung\' + Tombol tayangan ulang obrolan siaran langsung di hamparan pemutar disembunyikan + Tombol tayangan ulang obrolan siaran langsung di hamparan pemutar ditampilkan + Sembunyikan panel medis + Panel medis disembunyikan + Panel medis ditampilkan + Sembunyikan tindakan cepat + Tindakan cepat dalam layar penuh disembunyikan + Tindakan cepat dalam layar penuh ditampilkan + Sembunyikan video terkait + Video terkait dalam tindakan cepat disembunyikan + Video terkait dalam tindakan cepat ditampilkan + Sembunyikan panduan pelanggan + Pedoman komunitas pelanggan disembunyikan + Pedoman komunitas pelanggan ditampilkan + Sembunyikan reaksi terjadwal + Reaksi terjadwal disembunyikan + Reaksi terjadwal ditampilkan + Sembunyikan judul video + Judul video di hamparan pemutar disembunyikan + Judul video di overlay pemutar ditampilkan + Sembunyikan \'Ringkasan video yang dibuat AI\' + Bagian ringkasan video buatan AI disembunyikan + Bagian ringkasan video buatan AI ditampilkan + Sembunyikan Tanya + Bagian Tanya disembunyikan + Bagian Tanya ditampilkan + Sembunyikan Atribut + Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang disembunyikan + Bagian tempat Unggulan, Game, Musik, dan disebutkan Orang ditampilkan + Sembunyikan Bab + Bagian Bab disembunyikan + Bagian Bab ditampilkan + Sembunyikan \'Progres kursus\' + Bagian progres kursus disembunyikan + Bagian progres kursus ditampilkan + Sembunyikan Jelajahi + Bagian Jelajahi kursus ini dan Jelajahi podcast disembunyikan + Bagian Jelajahi kursus ini dan Jelajahi podcast ditampilkan + Sembunyikan \'Jelajahi kursus ini\' + Bagian Jelajahi kursus ini disembunyikan + Bagian Jelajahi kursus ini ditampilkan + Sembunyikan \'Jelajahi podcast\' + Bagian Jelajahi podcast disembunyikan + Bagian Jelajahi podcast ditampilkan + Sembunyikan \'Jelajahi podcast\' + Bagian Jelajahi podcast disembunyikan + Bagian Jelajahi podcast ditampilkan + Sembunyikan tautan unggulan + Bagian tautan unggulan disembunyikan + Bagian tautan unggulan ditampilkan + Sembunyikan \'Tempat Unggulan\' + Bagian Tempat Unggulan disembunyikan + Bagian Tempat Unggulan ditampilkan + Sembunyikan video unggulan + Bagian video unggulan disembunyikan + Bagian video unggulan ditampilkan + Aktifkan penyaring menu umpan flyout + Penyaring menu umpan flyout diaktifkan + Penyaring menu umpan flyout dinonaktifkan + Penyaring menu umpan flyout + Masukkan nama menu flyout yang akan disaring, satu per baris + Sembunyikan Game + Bagian Game disembunyikan + Bagian Game ditampilkan + Sembunyikan \'Cara konten ini dibuat\' + Bagian Cara konten ini dibuat disembunyikan + Bagian Cara konten ini dibuat ditampilkan + Sembunyikan Poin Hype + Poin Hype disembunyikan + Poin Hype ditampilkan + Sembunyikan kartu Info + Bagian kartu info disembunyikan + Bagian kartu info ditampilkan + Sembunyikan \'Konsep utama\' + Bagian Konsep utama disembunyikan + Bagian Konsep utama ditampilkan + Sembunyikan Musik + Bagian Musik disembunyikan + Bagian Musik ditampilkan + Sembunyikan tombol Berlangganan + Tombol Langganan disembunyikan + Tombol Langganan ditampilkan + Sembunyikan Transkrip + Bagian transkrip disembunyikan + Bagian transkrip ditampilkan + Sembunyikan Kuis + Bagian Kuis disembunyikan + Bagian Kuis ditampilkan + Keterangan video + Sembunyikan atau tampilkan komponen keterangan video + Bilah saring + Sembunyikan atau tampilkan bilah penyaring di umpan, video terkait, hasil pencarian, dan riwayat tontonan + Sembunyikan di umpan + Disembunyikan di umpan + Ditampilkan di umpan + Sembunyikan di video terkait + Disembunyikan di video terkait + Ditampilkan di video terkait + Sembunyikan di hasil penelusuran + Disembunyikan di hasil penelusuran + Ditampilkan di hasil penelusuran + Sembunyikan di riwayat tontonan + Disembunyikan di riwayat tontonan + Ditampilkan di riwayat tontonan + Halaman saluran + Sembunyikan atau tampilkan komponen halaman saluran + Aktifkan penyaring tab saluran + Penyaring tab saluran diaktifkan + Penyaring tab saluran dinonaktifkan + Penyaring tab saluran + Masukkan nama tab saluran yang akan disaring, satu per baris + + Sembunyikan tombol Komunitas + Tombol Komunitas disembunyikan + Tombol Komunitas ditampilkan + + Sembunyikan rak \'Untuk Anda\' + Rak Untuk Anda disembunyikan + Rak Untuk Anda ditampilkan + + Sembunyikan tombol Gabung + Tombol Gabung disembunyikan + Tombol Gabung ditampilkan + Sembunyikan pratinjau tautan + Pratinjau tautan disembunyikan + Pratinjau tautan ditampilkan + Sembunyikan rak anggota + Rak anggota disembunyikan + Rak anggota ditampilkan + + Sembunyikan tombol Belanja + Tombol Belanja disembunyikan + Tombol Belanja ditampilkan + + Sembunyikan tombol Berlangganan + Tombol Langganan disembunyikan + Tombol Langganan ditampilkan + Komentar + Sembunyikan atau tampilkan komponen bagian komentar + Sembunyikan ringkasan chat AI + Ringkasan chat AI disembunyikan + Ringkasan chat AI ditampilkan + Sembunyikan ringkasan Komentar AI + Ringkasan komentar AI disembunyikan + Ringkasan komentar AI ditampilkan + Sembunyikan pedoman saluran + Pedoman saluran disembunyikan + Pedoman saluran ditampilkan + Sembunyikan header \'Komentar oleh anggota\' + Header Komentar oleh anggota disembunyikan + Header Komentar oleh anggota ditampilkan + Sembunyikan bagian komentar + Bagian komentar disembunyikan + Bagian komentar ditampilkan + Sembunyikan pedoman komunitas + Pedoman komunitas disembunyikan + Pedoman komunitas ditampilkan + Sembunyikan tombol \'Buat Short\' + Tombol Buat Short disembunyikan + Tombol Buat Short ditampilkan + Sembunyikan tombol Emoji dan Penanda Waktu + Tombol Emoji dan Penanda Waktu disembunyikan + Tombol Emoji dan Penanda Waktu ditampilkan + Sembunyikan pratinjau komentar + Pratinjau komentar disembunyikan + Pratinjau komentar ditampilkan + Sembunyikan tombol Terima Kasih + Tombol terima kasih disembunyikan + Tombol terima kasih ditampilkan + Sembunyikan jumlah penayangan + Jumlah penayangan disembunyikan di umpan dan hasil pencarian + Jumlah penayangan ditampilkan di umpan dan hasil pencarian + + "Keterbatasan: +• Rak Shorts, halaman saluran, dan hasil pencarian mungkin masih menampilkan jumlah penayangan. +• Fitur ini tidak berfungsi dengan faktor bentuk otomotif." + Sembunyikan waktu unggah + Waktu unggah disembunyikan di umpan dan hasil penelusuran + Waktu unggah ditampilkan di umpan dan hasil penelusuran + + "Keterbatasan: +• Rak Shorts, halaman saluran, dan hasil penelusuran mungkin masih menampilkan waktu unggah. +• Fitur ini tidak berfungsi dengan faktor bentuk otomotif." + Sembunyikan kata kunci konten + Sembunyikan pencarian dan feed video menggunakan penyaring kata kunci + Sembunyikan video beranda dengan kata kunci + Video di tab beranda disaring berdasarkan kata kunci + Video di tab beranda tidak disaring berdasarkan kata kunci + Sembunyikan hasil pencarian berdasarkan kata kunci + Hasil pencarian disaring berdasarkan kata kunci + Hasil pencarian tidak disaring berdasarkan kata kunci + Sembunyikan video langganan dengan kata kunci + Video di tab langganan disaring berdasarkan kata kunci + Video di tab langganan tidak disaring berdasarkan kata kunci + Kata kunci yang ingin disembunyikan + - "Kata kunci dan frasa yang akan disembunyikan, dipisahkan oleh baris baru + "Kata kunci dan frasa yang akan disembunyikan, dipisahkan oleh baris baru Kata kunci dapat berupa nama saluran atau teks apa pun yang ditampilkan di judul video Kata-kata dengan huruf besar di tengah harus dimasukkan dengan casing (misalnya: iPhone, TikTok, LeBlanc)" - Tentang penyaringan kata kunci - "Hasil pencarian Beranda/Berlangganan/Pencarian difilter untuk menyembunyikan konten yang cocok dengan frasa kata kunci + Tentang penyaringan kata kunci + "Hasil pencarian Beranda/Berlangganan/Pencarian disaring untuk menyembunyikan konten yang cocok dengan frasa kata kunci -Keterbatasan +Keterbatasan: • Shorts tidak dapat disembunyikan berdasarkan nama saluran • Beberapa komponen UI mungkin tidak disembunyikan • Pencarian kata kunci mungkin tidak menampilkan hasil" - Cocokkan seluruh kata - - Melingkupi kata kunci/frasa dengan tanda kutip ganda akan mencegah pencocokan sebagian judul video dan nama saluran<br><br>Misalnya,<br><b>\"ai\"</b> akan menyembunyikan video: <b>Bagaimana cara kerja AI?</b><br>tetapi tidak akan menyembunyikan: <b>Apa yang dimaksud dengan Jakarta Fair?</b> - - Tidak dapat menggunakan kata kunci: %s - Tambahkan tanda kutip untuk menggunakan kata kunci: %s - Kata kunci punya keterangan yang bertentangan: %s - Kata kunci terlalu pendek dan butuh tanda kutip: %s - Kata kunci akan menyembunyikan semua video: %s - - - Sembunyikan rak toko kreator - Rak toko kreator di bawah pemutar video disembunyikan - Rak toko kreator di bawah pemutar video ditampilkan - Sembunyikan spanduk toko di layar akhir - Spanduk toko layar akhir disembunyikan - Spanduk toko layar akhir ditampilkan - Sembunyikan iklan layar penuh - "Iklan layar penuh disembunyikan - -Fitur ini hanya tersedia untuk perangkat yang lebih lama" - Iklan layar penuh ditampilkan - - Menyembunyikan iklan layar penuh hanya berfungsi pada perangkat lama - Sembunyikan iklan umum - Iklan umum disembunyikan - Iklan umum ditampilkan - Sembunyikan spanduk merchandise - Banner merchandise disembunyikan - Spanduk merchandise ditampilkan - Sembunyikan label promosi berbayar - Label promosi berbayar disembunyikan - Label promosi berbayar ditampilkan - Sembunyikan kartu bersponsor pribadi - Kartu bersponsor pribadi disembunyikan - Kartu bersponsor pribadi ditampilkan - Sembunyikan tautan belanja - Tautan belanja di deskripsi video disembunyikan - Tautan belanja di deskripsi video ditampilkan - Sembunyikan spanduk \'Lihat produk\' - Spanduk lihat produk di hamparan video disembunyikan - Spanduk lihat produk di hamparan video ditampilkan - Sembunyikan hasil pencarian web - Hasil pencarian web disembunyikan - Hasil pencarian web ditampilkan - - - Sembunyikan promosi YouTube Premium - Promosi YouTube Premium di bawah pemutar video disembunyikan - Promosi YouTube Premium di bawah pemutar video ditampilkan - - - Sembunyikan iklan video - Iklan video disembunyikan - Iklan video ditampilkan - - - URL disalin ke papan klip - URL dengan penanda waktu telah disalin - Tampilkan tombol salin URL video - Tombol salin URL video ditampilkan. Ketuk untuk menyalin URL video. Ketuk dan tahan untuk menyalin dengan stempel waktu - Tombol salin URL video tidak ditampilkan - Tampilkan tombol salin penanda waktu URL - Tombol salin URL stempel waktu ditampilkan. Ketuk untuk menyalin URL video dengan stempel waktu. Ketuk dan tahan untuk menyalin tanpa stempel waktu - Tombol salin URL stempel waktu tidak ditampilkan - - - Hapus dialog pembatasan penonton - Dialog akan dihapus - Dialog akan ditampilkan - Ini tidak mengabaikan batasan usia. Ini hanya menerimanya secara otomatis. - - - Nonaktifkan popup \'Masuk ke TV\' - Pop-up Masuk ke TV dinonaktifkan - Pop-up Masuk ke TV diaktifkan - - - Nonaktifkan lewati bab dengan ketuk dua kali - Ketuk dua kali tidak akan pernah memicu lewati ke bab berikutnya/sebelumnya - Ketuk dua kali terkadang dapat memicu lewati ke bab berikutnya/sebelumnya - - - Unduhan eksternal - Pengaturan untuk menggunakan pengunduh eksternal - Tampilkan tombol unduhan eksternal - Tombol Unduh di pemutar ditampilkan - Tombol Unduh di pemutar tidak ditampilkan - - Gantikan tombol tindakan Unduh - Tombol unduh membuka pengunduh eksternal Anda - Tombol unduh membuka pengunduh asli di dalam aplikasi - Nama paket pengunduh - Nama paket aplikasi pengunduh eksternal yang telah Anda pasang - Masukkan nama paket - Lainnya - Aplikasi tidak terpasang - %s belum terpasang. Silahkan pasang. - "Tidak dapat menemukan aplikasi terpasang dengan nama paket: %s + Cocokkan seluruh kata + + Melingkupi kata kunci/frasa dengan tanda kutip ganda akan mencegah pencocokan sebagian judul video dan nama saluran<br><br>Misalnya,<br><b>\"ai\"</b> akan menyembunyikan video: <b>Bagaimana cara kerja AI?</b><br>tetapi tidak akan menyembunyikan: <b>Apa yang dimaksud dengan Jakarta Fair?</b> + + Tidak dapat menggunakan kata kunci: %s + Tambahkan tanda kutip untuk menggunakan kata kunci: %s + Kata kunci punya keterangan yang bertentangan: %s + Kata kunci terlalu pendek dan butuh tanda kutip: %s + Kata kunci akan menyembunyikan semua video: %s + + + Sembunyikan spanduk toko di layar akhir + Spanduk toko layar akhir disembunyikan + Spanduk toko layar akhir ditampilkan + Sembunyikan iklan layar penuh + Iklan layar penuh disembunyikan + Iklan layar penuh ditampilkan + Sembunyikan iklan umum + Iklan umum disembunyikan + Iklan umum ditampilkan + Sembunyikan spanduk merchandise + Banner merchandise disembunyikan + Spanduk merchandise ditampilkan + Sembunyikan label promosi berbayar + Label promosi berbayar disembunyikan + Label promosi berbayar ditampilkan + Sembunyikan iklan popup pemutar + Iklan popup pemutar disembunyikan + Iklan popup pemutar ditampilkan + Sembunyikan kartu bersponsor pribadi + Kartu bersponsor pribadi disembunyikan + Kartu bersponsor pribadi ditampilkan + Sembunyikan tautan belanja + Tautan belanja di deskripsi video disembunyikan + Tautan belanja di deskripsi video ditampilkan + Sembunyikan spanduk \'Lihat produk\' + Spanduk lihat produk di hamparan pemutar disembunyikan + Spanduk lihat produk di hamparan pemutar ditampilkan + Sembunyikan promosi YouTube Premium + Promosi YouTube Premium disembunyikan + Promosi YouTube Premium ditampilkan + + + Sembunyikan iklan video + Iklan video disembunyikan + Iklan video ditampilkan + + + URL disalin ke papan klip + URL dengan penanda waktu telah disalin + Tampilkan tombol salin URL video + Tombol salin URL video ditampilkan. Ketuk untuk menyalin URL video. Ketuk dan tahan untuk menyalin dengan stempel waktu + Tombol salin URL video tidak ditampilkan + Tampilkan tombol salin penanda waktu URL + Tombol salin URL penanda waktu ditampilkan. Ketuk untuk menyalin URL video dengan penanda waktu. Ketuk dan tahan untuk menyalin tanpa penanda waktu + Tombol salin URL penanda waktu tidak ditampilkan + + + Hapus dialog pembatasan penonton + Dialog akan dihapus + Dialog akan ditampilkan + Ini tidak mengabaikan batasan usia. Ini hanya menerimanya secara otomatis. + + + Nonaktifkan popup \'Masuk ke TV\' + Pop-up Masuk ke TV dinonaktifkan + Pop-up Masuk ke TV diaktifkan + + + Nonaktifkan lewati bab dengan ketuk dua kali + Ketuk dua kali tidak akan pernah memicu lewati ke bab berikutnya/sebelumnya + Ketuk dua kali terkadang dapat memicu lewati ke bab berikutnya/sebelumnya + + + Unduhan eksternal + Pengaturan untuk menggunakan pengunduh eksternal + Tampilkan tombol unduhan eksternal + Tombol Unduh di pemutar ditampilkan + Tombol Unduh di pemutar tidak ditampilkan + + Gantikan tombol tindakan Unduh + Tombol unduh membuka pengunduh eksternal Anda + Tombol unduh membuka pengunduh asli di dalam aplikasi + Nama paket pengunduh + Nama paket aplikasi pengunduh eksternal yang telah Anda pasang + Masukkan nama paket + Lainnya + Aplikasi tidak terpasang + %s belum terpasang. Silahkan pasang. + "Tidak dapat menemukan aplikasi terpasang dengan nama paket: %s Verifikasi nama paket sudah benar dan aplikasi sudah terpasang" - Nama paket tidak boleh kosong - - - Matikan gerakan pencarian presisi - Gerakan dinonaktifkan - Gerakan diaktifkan - - - Aktifkan ketuk untuk mencari - Ketuk untuk mencari diaktifkan - Ketuk untuk mencari dinonaktifkan - - - Aktifkan gerakan kecerahan - "Pengusapan kecerahan layar penuh diaktifkan + Nama paket tidak boleh kosong + + + Matikan gerakan pencarian presisi + Gerakan dinonaktifkan + Gerakan diaktifkan + + + Aktifkan ketuk untuk mencari + Ketuk untuk mencari diaktifkan + Ketuk untuk mencari dinonaktifkan + + + Aktifkan gerakan kecerahan + "Pengusapan kecerahan layar penuh diaktifkan Sesuaikan kecerahan dengan mengusap secara vertikal pada sisi kiri layar" - Pengusapan kecerahan layar penuh dinonaktifkan - Aktifkan gerakan volume - "Pengusapan volume layar penuh diaktifkan + Pengusapan kecerahan layar penuh dinonaktifkan + Aktifkan gerakan volume + "Pengusapan volume layar penuh diaktifkan Menyesuaikan volume dengan mengusap secara vertikal di sisi kanan layar" - Pengusapan volume layar penuh dinonaktifkan - Aktifkan tekan untuk gerakan geser - Tekan untuk menggeser diaktifkan - Tekan untuk menggeser dinonaktifkan - Aktifkan umpan balik sentuhan - Umpan balik sentuhan diaktifkan - Umpan balik sentuhan dinonaktifkan - Simpan dan pulihkan kecerahan - Simpan dan pulihkan kecerahan saat keluar atau memasuki layar penuh - Jangan simpan dan pulihkan kecerahan saat keluar atau memasuki layar penuh - Aktifkan gerakan kecerahan otomatis - Mengusap ke bawah ke nilai terendah dari gerakan kecerahan akan menyalakan kecerahan otomatis - Mengusap ke bawah ke nilai terendah tidak mengaktifkan kecerahan otomatis - Otomatis - Batas waktu hamparan usap - Jumlah milidetik hamparan terlihat - Opasitas latar belakang hamparan geser - Nilai opasitas antara 0-100 - Opasitas geser harus antara 0-100 - Warna kecerahan lapisan usap - Warna bilah kemajuan untuk kontrol kecerahan - Warna volume lapisan usap - Warna bilah kemajuan untuk kontrol volume - Ukuran teks lapisan usap - Ukuran teks untuk lapisan usap antara 1-30 - Ukuran teks harus antara 1-30 - Ambang batas magnitudo usap - Jumlah ambang batas untuk terjadinya usapan - Sensitivitas volume usap - Seberapa besar perubahan volume per usapan - Gaya hamparan usap - Hamparan horizontal - Hamparan horizontal (minimal - atas) - Hamparan horizontal (minimal - tengah) - Hamparan melingkar - Hamparan melingkar (minimal) - Hamparan vertikal - Hamparan vertikal (minimal) - Aktifkan usapan untuk beralih video - Mengusap dalam mode layar penuh akan beralih ke video berikutnya/sebelumnya - Mengusap dalam mode layar penuh tidak akan beralih ke video berikutnya/sebelumnya - - - Matikan teks otomatis - Teks otomatis dinonaktifkan - Teks otomatis diaktifkan - - - Tombol tindakan - Sembunyikan atau tampilkan tombol di bawah video - Nonaktifkan kilauan Suka dan Langganan - Tombol Suka dan Berlangganan tidak akan berkilau saat disebut - Tombol Suka dan Berlangganan akan berkilau saat disebut - Sembunyikan Suka dan Tidak Suka - Tombol Suka dan Tidak suka disembunyikan - Tombol Suka dan Tidak suka ditampilkan - - Sembunyikan Bagikan - Tombol bagikan disembunyikan - Tombol bagikan ditampilkan - - Sembunyikan Hentikan iklan - Tombol hentikan iklan disembunyikan - Tombol hentikan iklan ditampilkan - - Sembunyikan Komentar - Tombol Komentar disembunyikan - Tombol Komentar ditampilkan - - Sembunyikan Laporkan - Tombol laporkan disembunyikan - Tombol laporkan ditampilkan - - Sembunyikan Remix - Tombol remix disembunyikan - Tombol remix ditampilkan - - Sembunyikan Unduhan - Tombol unduh disembunyikan - Tombol unduh ditampilkan - - Sembunyikan Hype - Tombol Hype disembunyikan - Tombol Hype ditampilkan - - Sembunyikan Promosi - Tombol Promosi disembunyikan - Tombol Promosi ditampilkan - - Sembunyikan Terima kasih - Tombol terima kasih disembunyikan - Tombol terima kasih ditampilkan - - Sembunyikan Tanya - Tombol Tanya disembunyikan - Tombol Tanya ditampilkan - - Sembunyikan Klip - Tombol klip disembunyikan - Tombol klip ditampilkan - - Sembunyikan Belanja - Tombol belanja disembunyikan - Tombol belanja ditampilkan - - Sembunyikan Simpan - Tombol Simpan disembunyikan - Tombol Simpan ditampilkan - - - Tombol navigasi - Sembunyikan atau ganti tombol di bilah navigasi - - Sembunyikan Beranda - Tombol beranda disembunyikan - Tombol beranda ditampilkan - - Sembunyikan Shorts - Tombol shorts disembunyikan - Tombol shorts ditampilkan - - Sembunyikan Buat - Tombol buat disembunyikan - Tombol buat ditampilkan - - Sembunyikan Langganan - Tombol langganan disembunyikan - Tombol langganan ditampilkan - Sembunyikan Notifikasi - Tombol notifikasi disembunyikan - Tombol notifikasi ditampilkan - - Ganti Buat dengan Notifikasi - "Tombol buat diganti dengan tombol Notifikasi - -Catatan: Mengaktifkan ini juga akan memaksa menyembunyikan iklan video" - Tombol buat tidak diganti dengan tombol Notifikasi - "Menonaktifkan setelan ini juga akan menonaktifkan pemblokiran iklan di Shorts. - -Jika mengubah setelan ini tidak berpengaruh, coba beralih ke mode Penyamaran." - Sembunyikan label tombol navigasi - Label disembunyikan - Label ditampilkan - Nonaktifkan bilah status tembus cahaya - Bilah status buram - Bilah status buram atau tembus pandang - Di beberapa perangkat, mengaktifkan fitur ini dapat mengubah bilah navigasi sistem menjadi transparan. - Nonaktifkan bilah tembus cahaya terang - Bilah navigasi mode terang adalah buram - Bilah navigasi mode terang buram atau tembus pandang - Nonaktifkan bilah tembus pandang gelap - Bilah navigasi mode gelap adalah buram - Bilah navigasi mode gelap buram atau tembus pandang - - - Menu flyout - Sembunyikan atau tampilkan item menu pemutar flyout - - Sembunyikan Teks - Menu teks disembunyikan - Menu teks ditampilkan - - Sembunyikan Pengaturan tambahan - Menu pengaturan tambahan disembunyikan - Menu pengaturan tambahan ditampilkan - - Sembunyikan pengatur waktu tidur - Menu pengatur waktu tidur disembunyikan - Menu pengatur waktu tidur ditampilkan - - Sembunyikan Ulangi video - Menu ulangi video disembunyikan - Menu ulangi video ditampilkan - - Sembunyikan mode Sinematik - Menu mode sinematik disembunyikan - Menu mode sinematik ditampilkan - Sembunyikan volume Stabil - Menu volume stabil ditampilkan - Menu volume stabil disembunyikan - - Sembunyikan Bantuan & masukan - Bantuan & menu masukan disembunyikan - Bantuan & menu masukan ditampilkan - - Sembunyikan Kecepatan pemutaran - Menu kecepatan pemutaran disembunyikan - Menu kecepatan pemutaran ditampilkan - - Sembunyikan Kunci layar - Menu kunci layar disembunyikan - Menu kunci layar ditampilkan - - Sembunyikan Dengarkan dengan YouTube Music - Menu Dengarkan dengan YouTube Music disembunyikan - Menu Dengarkan dengan YouTube Music ditampilkan - - Sembunyikan trek Audio - Menu trek audio disembunyikan - Menu trek audio ditampilkan - + Sembunyikan Bagikan + Tombol bagikan disembunyikan + Tombol bagikan ditampilkan + + Sembunyikan Hentikan iklan + Tombol hentikan iklan disembunyikan + Tombol hentikan iklan ditampilkan + + Sembunyikan Komentar + Tombol Komentar disembunyikan + Tombol Komentar ditampilkan + + Sembunyikan Laporkan + Tombol laporkan disembunyikan + Tombol laporkan ditampilkan + + Sembunyikan Remix + Tombol remix disembunyikan + Tombol remix ditampilkan + + Sembunyikan Unduhan + Tombol unduh disembunyikan + Tombol unduh ditampilkan + + Sembunyikan Hype + Tombol Hype disembunyikan + Tombol Hype ditampilkan + + Sembunyikan Promosi + Tombol Promosi disembunyikan + Tombol Promosi ditampilkan + + Sembunyikan Terima kasih + Tombol terima kasih disembunyikan + Tombol terima kasih ditampilkan + + Sembunyikan Tanya + Tombol Tanya disembunyikan + Tombol Tanya ditampilkan + + Sembunyikan Klip + Tombol klip disembunyikan + Tombol klip ditampilkan + Penyembunyian mungkin tidak berfungsi untuk beberapa akun pengguna. + + Sembunyikan Belanja + Tombol belanja disembunyikan + Tombol belanja ditampilkan + + Sembunyikan Simpan + Tombol Simpan disembunyikan + Tombol Simpan ditampilkan + + + Tombol navigasi + Sembunyikan atau ubah tombol bilah navigasi + + Sembunyikan Beranda + Tombol Beranda disembunyikan + Tombol Beranda ditampilkan + + Sembunyikan Shorts + Tombol shorts disembunyikan + Tombol shorts ditampilkan + + Sembunyikan Buat + Tombol buat disembunyikan + Tombol buat ditampilkan + + Sembunyikan Langganan + Tombol langganan disembunyikan + Tombol langganan ditampilkan + Sembunyikan Pemberitahuan + Tombol pemberitahuan disembunyikan + Tombol pemberitahuan ditampilkan + + Ganti Buat dengan Pemberitahuan + Tombol buat diganti dengan tombol Pemberitahuan + Tombol buat tidak diganti dengan tombol Pemberitahuan + Jika perubahan setelan ini tidak berlaku, coba beralih ke mode Samaran. + Sembunyikan label tombol navigasi + Label disembunyikan + Label ditampilkan + Aktifkan tombol navigasi sempit + Jarak antar tombol navigasi sempit + Jarak antar tombol navigasi normal + Aktifkan animasi bilah navigasi + Transisi navigasi dianimasikan + Transisi navigasi tidak dianimasikan + Nonaktifkan bilah status transparan + Bilah status buram + Bilah status buram atau transparan + "Keterbatasan: +• Bilah hitam mungkin muncul di bagian atas pemutar video. +• Pada beberapa perangkat, mengaktifkan fitur ini dapat mengubah bilah navigasi sistem menjadi transparan." + Nonaktifkan bilah transparan terang + Bilah navigasi mode terang adalah buram + Bilah navigasi mode terang buram atau transparan + Nonaktifkan bilah transparan gelap + Bilah navigasi mode gelap adalah buram + Bilah navigasi mode gelap buram atau transparan + Bilah Alat + Sembunyikan atau ubah komponen bilah alat + Sembunyikan tombol Buat + Tombol buat disembunyikan + Tombol buat ditampilkan + Sembunyikan tombol Pemberitahuan + Tombol notifikasi disembunyikan + Tombol pemberitahuan ditampilkan + Sembunyikan tombol Pencarian + Tombol pencarian disembunyikan + Tombol pencarian ditampilkan. + Aktifkan bilah pencarian lebar + Bilah pencarian lebar diaktifkan + Bilah pencarian lebar dinonaktifkan + + + Menu flyout + Sembunyikan atau tampilkan item menu pemutar flyout + + Sembunyikan Teks + Menu teks disembunyikan + Menu teks ditampilkan + + Sembunyikan Pengaturan tambahan + Menu pengaturan tambahan disembunyikan + Menu pengaturan tambahan ditampilkan + + Sembunyikan pengatur waktu tidur + Menu pengatur waktu tidur disembunyikan + Menu pengatur waktu tidur ditampilkan + + Sembunyikan Ulangi video + Menu ulangi video disembunyikan + Menu ulangi video ditampilkan + + Sembunyikan mode Sinematik + Menu mode sinematik disembunyikan + Menu mode sinematik ditampilkan + Sembunyikan volume Stabil + Menu volume stabil ditampilkan + Menu volume stabil disembunyikan + + Sembunyikan Bantuan & masukan + Bantuan & menu masukan disembunyikan + Bantuan & menu masukan ditampilkan + + Sembunyikan Kecepatan pemutaran + Menu kecepatan pemutaran disembunyikan + Menu kecepatan pemutaran ditampilkan + + Sembunyikan Kunci layar + Menu kunci layar disembunyikan + Menu kunci layar ditampilkan + + Sembunyikan Dengarkan dengan YouTube Music + Menu Dengarkan dengan YouTube Music disembunyikan + Menu Dengarkan dengan YouTube Music ditampilkan + + Sembunyikan trek Audio + Menu trek audio disembunyikan + Menu trek audio ditampilkan + - "Menu trek audio disembunyikan + "Menu trek audio disembunyikan Untuk menampilkan menu trek audio, ubah 'Palsukan aliran video' ke 'Android No SDK'" - - Sembunyikan Tonton di VR - Menu tonton di VR disembunyikan - Menu tonton di VR ditampilkan - Sembunyikan menu kualitas video - Menu kualitas video disembunyikan - Menu kualitas video ditampilkan - Sembunyikan footer menu kualitas video - Footer menu kualitas video disembunyikan - Footer menu kualitas video ditampilkan - - - Sembunyikan tombol Putar Otomatis - Tombol putar otomatis disembunyikan - Tombol putar otomatis ditampilkan - - Sembunyikan tombol Teks - Tombol teks disembunyikan - Tombol teks ditampilkan - Sembunyikan tombol Transmisi - Tombol transmisi disembunyikan - Tombol transmisi ditampilkan - Sembunyikan latar belakang kontrol pemutar - Latar belakang kontrol pemutar disembunyikan - Latar belakang kontrol pemutar ditampilkan - Sembunyikan tombol Sebelumnya & Berikutnya - Tombol disembunyikan - Tombol ditampilkan - - - Sembunyikan kartu layar akhir - Kartu layar akhir disembunyikan - Kartu layar akhir ditampilkan - - - Nonaktifkan mode Senematik dalam layar penuh - Mode sinematik dinonaktifkan - Mode sinematik diaktifkan - - - Sembunyikan kartu info - Kartu info disembunyikan - Kartu info ditampilkan - - - Nonaktifkan animasi angka bergulir - Angka bergulir tidak dianimasikan - Angka bergulir dianimasikan - - - Sembunyikan bilah pencari pemutar video - Seekbar pemutar video disembunyikan - Seekbar pemutar video ditampilkan - - Sembunyikan bilah pencari thumbnail video - Bilah pencari thumbnail video disembunyikan - Bilah pencari thumbnail video ditampilkan - - - Pemutar Shorts - Sembunyikan atau tampilkan komponen pemutar Shorts - - Sembunyikan Shorts di umpan Beranda - Disembunyikan di umpan Beranda dan video terkait - Ditampilkan di umpan Beranda dan video terkait - Sembunyikan Shorts di hasil pencarian - Disembunyikan dalam hasil penelusuran - Ditampilkan dalam hasil penelusuran - - Sembunyikan Shorts di umpan Langganan - Disembunyikan di umpan Langganan - Ditampilkan di umpan Langganan - Sembunyikan Shorts dalam riwayat tontonan - Disembunyikan dalam riwayat tontonan - Ditampilkan dalam riwayat tontonan - Sembunyikan label \'Dubbing Otomatis\' - Label sulih suara otomatis disembunyikan - Label sulih suara otomatis ditampilkan - Sembunyikan tombol \'Beli Super Thanks\' - Tombol Beli Super Thanks disembunyikan - Tombol Beli Super Thanks ditampilkan - Sembunyikan tombol Efek - Tombol Efek disembunyikan - Tombol Efek ditampilkan - Sembunyikan tombol \'Layar hijau\' - Tombol layar hijau disembunyikan - Tombol layar hijau ditampilkan - Sembunyikan tombol tagar - Tombol tagar disembunyikan - Tombol tagar ditampilkan - - Sembunyikan tombol Gabung - Tombol gabung disembunyikan - Tombol gabung ditampilkan - Sembunyikan pratinjau langsung - Pratinjau langsung disembunyikan - Pratinjau langsung ditampilkan - Sembunyikan label lokasi - Label lokasi disembunyikan - Label lokasi ditampilkan - Sembunyikan tombol \'Postingan baru\' - Tombol postingan baru disembunyikan - Tombol postingan baru ditampilkan - Sembunyikan tombol hamparan terjeda - Tombol hamparan terjeda disembunyikan - Tombol hamparan terjeda ditampilkan - Sembunyikan pratinjau komentar - Pratinjau komentar disembunyikan - Pratinjau komentar ditampilkan - Sembunyikan tombol \'Simpan musik\' - Tombol simpan musik disembunyikan - Tombol simpan musik ditampilkan - Sembunyikan saran penelusuran - Saran penelusuran disembunyikan - Saran penelusuran ditampilkan - Sembunyikan tombol Belanja - Tombol belanja disembunyikan - Tombol belanja ditampilkan - Sembunyikan stiker - Stiker disembunyikan - Stiker ditampilkan - Sembunyikan tombol Berlangganan - Tombol berlangganan disembunyikan - Tombol berlangganan ditampilkan - Sembunyikan produk yang ditandai - Produk yang ditandai disembunyikan - Produk yang ditandai ditampilkan - Sembunyikan tombol Mendatang - Tombol yang akan datang disembunyikan - Tombol yang akan datang ditampilkan - Sembunyikan tombol \'Gunakan suara ini\' - Tombol gunakan suara ini disembunyikan - Tombol gunakan suara ini ditampilkan - Sembunyikan tombol \'Gunakan template ini\' - Tombol gunakan template ini disembunyikan - Tombol gunakan template ini ditampilkan - Sembunyikan tombol Suka yang memancar - Animasi tombol suka yang memancar disembunyikan - Animasi tombol suka yang memancar ditampilkan - Sembunyikan tombol Suka - Tombol suka disembunyikan - Tombol suka ditampilkan - Sembunyikan tombol Tidak Suka - Tombol tidak suka disembunyikan - Tombol tidak suka ditampilkan - Sembunyikan tombol Komentar - Tombol komentar disembunyikan - Tombol komentar ditampilkan - - Sembunyikan tombol Bagikan - Tombol bagikan disembunyikan - Tombol bagikan ditampilkan - - Sembunyikan tombol Remix - Tombol remix disembunyikan - Tombol remix ditampilkan - Sembunyikan tombol suara - Tombol suara disembunyikan - Tombol suara ditampilkan - Sembunyikan panel info - Panel info disembunyikan - Panel info ditampilkan - Sembunyikan bilah saluran - Bilah saluran disembunyikan - Bilah saluran ditampilkan - Sembunyikan judul video - Judul video disembunyikan - Judul video ditampilkan - Sembunyikan label metadata suara - Label metadata suara disembunyikan - Label metadata suara ditampilkan - Sembunyikan label tautan video - Label tautan video disembunyikan - Label tautan video ditampilkan - Sembunyikan bilah navigasi - Bilah navigasi disembunyikan - Bilah navigasi ditampilkan - - - Sembunyikan video yang disarankan di layar akhir - "Video yang disarankan di layar akhir disembunyikan saat pemutaran otomatis dimatikan + + Sembunyikan Tonton di VR + Menu tonton di VR disembunyikan + Menu tonton di VR ditampilkan + Sembunyikan menu kualitas video + Menu kualitas video disembunyikan + Menu kualitas video ditampilkan + Sembunyikan footer menu kualitas video + Footer menu kualitas video disembunyikan + Footer menu kualitas video ditampilkan + + + Sembunyikan tombol Putar Otomatis + Tombol putar otomatis disembunyikan + Tombol putar otomatis ditampilkan + + Sembunyikan tombol Teks + Tombol teks disembunyikan + Tombol teks ditampilkan + Sembunyikan tombol Transmisi + Tombol transmisi disembunyikan + Tombol transmisi ditampilkan + Sembunyikan tombol Ciutkan + Tombol ciutkan disembunyikan + Tombol ciutkan ditampilkan + Sembunyikan tombol Layar Penuh + Tombol layar penuh disembunyikan + Tombol layar penuh ditampilkan + Sembunyikan latar belakang kontrol pemutar + Latar belakang kontrol pemutar disembunyikan + Latar belakang kontrol pemutar ditampilkan + Sembunyikan tombol Sebelumnya & Berikutnya + Tombol disembunyikan + Tombol ditampilkan + + + Sembunyikan kartu layar akhir + Kartu layar akhir disembunyikan + Kartu layar akhir ditampilkan + + + Nonaktifkan mode Senematik dalam layar penuh + Mode sinematik dinonaktifkan + Mode sinematik diaktifkan + + + Sembunyikan kartu info + Kartu info disembunyikan + Kartu info ditampilkan + + + Nonaktifkan animasi angka bergulir + Angka bergulir tidak dianimasikan + Angka bergulir dianimasikan + + + Sembunyikan bilah pencari pemutar video + Seekbar pemutar video disembunyikan + Seekbar pemutar video ditampilkan + + Sembunyikan bilah pencari thumbnail video + Bilah pencari thumbnail video disembunyikan + Bilah pencari thumbnail video ditampilkan + Aktifkan seekbar besar layar penuh + Seekbar layar penuh berukuran besar + Seekbar layar penuh berukuran normal + + + Pemutar Shorts + Sembunyikan atau tampilkan komponen pemutar Shorts + Sembunyikan Shorts di halaman saluran + Disembunyikan di halaman saluran + Ditampilkan di halaman saluran + + Sembunyikan Shorts di umpan Beranda + Disembunyikan di umpan Beranda dan video terkait + Ditampilkan di umpan Beranda dan video terkait + Sembunyikan Shorts di hasil pencarian + Disembunyikan dalam hasil penelusuran + Ditampilkan dalam hasil penelusuran + + Sembunyikan Shorts di umpan Langganan + Disembunyikan di umpan Langganan + Ditampilkan di umpan Langganan + Sembunyikan Shorts di deskripsi video + Disembunyikan di deskripsi video + Ditampilkan di deskripsi video + Sembunyikan Shorts dalam riwayat tontonan + Disembunyikan dalam riwayat tontonan + Ditampilkan dalam riwayat tontonan + Sembunyikan tombol AI + Tombol AI disembunyikan + Tombol AI ditampilkan + Sembunyikan label \'Dubbing Otomatis\' + Label sulih suara otomatis disembunyikan + Label sulih suara otomatis ditampilkan + Sembunyikan label \'Sulih Suara Otomatis\' + Label sulih suara otomatis disembunyikan + Label sulih suara otomatis ditampilkan + Sembunyikan tombol \'Beli Super Thanks\' + Tombol Beli Super Thanks disembunyikan + Tombol Beli Super Thanks ditampilkan + Sembunyikan tombol Efek + Tombol Efek disembunyikan + Tombol Efek ditampilkan + Sembunyikan tombol \'Layar hijau\' + Tombol layar hijau disembunyikan + Tombol layar hijau ditampilkan + Sembunyikan tombol tagar + Tombol tagar disembunyikan + Tombol tagar ditampilkan + + Sembunyikan tombol Gabung + Tombol gabung disembunyikan + Tombol gabung ditampilkan + Sembunyikan pratinjau langsung + Pratinjau langsung disembunyikan + Pratinjau langsung ditampilkan + Sembunyikan label lokasi + Label lokasi disembunyikan + Label lokasi ditampilkan + Sembunyikan tombol \'Postingan baru\' + Tombol postingan baru disembunyikan + Tombol postingan baru ditampilkan + Sembunyikan tombol hamparan terjeda + Tombol hamparan terjeda disembunyikan + Tombol hamparan terjeda ditampilkan + Sembunyikan pratinjau komentar + Pratinjau komentar disembunyikan + Pratinjau komentar ditampilkan + Sembunyikan tombol \'Simpan musik\' + Tombol simpan musik disembunyikan + Tombol simpan musik ditampilkan + Sembunyikan saran penelusuran + Saran penelusuran disembunyikan + Saran penelusuran ditampilkan + Sembunyikan tombol Belanja + Tombol belanja disembunyikan + Tombol belanja ditampilkan + Sembunyikan stiker + Stiker disembunyikan + Stiker ditampilkan + Sembunyikan tombol Berlangganan + Tombol berlangganan disembunyikan + Tombol berlangganan ditampilkan + Sembunyikan produk yang ditandai + Produk yang ditandai disembunyikan + Produk yang ditandai ditampilkan + Sembunyikan tombol Mendatang + Tombol yang akan datang disembunyikan + Tombol yang akan datang ditampilkan + Sembunyikan tombol \'Gunakan suara ini\' + Tombol gunakan suara ini disembunyikan + Tombol gunakan suara ini ditampilkan + Sembunyikan tombol \'Gunakan template ini\' + Tombol gunakan template ini disembunyikan + Tombol gunakan template ini ditampilkan + + Sembunyikan tombol Suka yang memancar + Animasi tombol suka yang memancar disembunyikan + Animasi tombol suka yang memancar ditampilkan + Sembunyikan tombol Suka + Tombol suka disembunyikan + Tombol suka ditampilkan + Sembunyikan tombol Tidak Suka + Tombol tidak suka disembunyikan + Tombol tidak suka ditampilkan + Sembunyikan tombol Komentar + Tombol komentar disembunyikan + Tombol komentar ditampilkan + + Sembunyikan tombol Bagikan + Tombol bagikan disembunyikan + Tombol bagikan ditampilkan + + Sembunyikan tombol Remix + Tombol remix disembunyikan + Tombol remix ditampilkan + Sembunyikan tombol suara + Tombol suara disembunyikan + Tombol suara ditampilkan + Sembunyikan panel info + Panel info disembunyikan + Panel info ditampilkan + Sembunyikan bilah saluran + Bilah saluran disembunyikan + Bilah saluran ditampilkan + Sembunyikan judul video + Judul video disembunyikan + Judul video ditampilkan + Sembunyikan label metadata suara + Label metadata suara disembunyikan + Label metadata suara ditampilkan + Sembunyikan label tautan video + Label tautan video disembunyikan + Label tautan video ditampilkan + Sembunyikan bilah navigasi + Bilah navigasi disembunyikan + Bilah navigasi ditampilkan + + + Sembunyikan pratinjau putar otomatis + Pratinjau putar otomatis disembunyikan + Pratinjau putar otomatis ditampilkan + + + Sembunyikan video yang disarankan di layar akhir + "Video yang disarankan di layar akhir disembunyikan saat pemutaran otomatis dimatikan Pemutaran otomatis dapat diubah di pengaturan YouTube: Pengaturan → Pemutaran → Putar otomatis video berikutnya" - Video yang disarankan di layar akhir ditampilkan - - - Sembunyikan hamparan video terkait - Hamparan video terkait dalam layar penuh disembunyikan - Hamparan video terkait dalam layar penuh ditampilkan - - - Sembunyikan penanda waktu video - Penanda waktu disembunyikan - Penanda waktu ditampilkan - - - Sembunyikan panel popup pemutar - Panel popup pemutar disembunyikan - Panel popup pemutar ditampilkan - - - Keluar dari mode layar penuh di akhir video - Nonaktif - Potret - Lanskap - Potret dan lanskap - - - Buka video dalam potret layar penuh - Video terbuka dalam layar penuh - Video tidak terbuka dalam layar penuh - - - Opasitas hamparan pemutar - Nilai opasitas antara 0-100, dimana 0 adalah transparan - Opasitas hamparan pemutar harus di antara 0-100 - - - - Dislike sementara tidak tersedia (waktu API habis) - Dislike tidak tersedia (status %d) - Dislike tidak tersedia (pembatasan API klien) - Dislike tidak tersedia (%s) - - Muat ulang video untuk memilih Return YouTube Dislike - - Disembunyikan oleh pemilik - Return YouTube Dislike - Dislike ditampilkan - Dislike tidak ditampilkan - Tampilkan dislike di Shorts - "Dislike pada Shorts ditampilkan + Video yang disarankan di layar akhir ditampilkan + + + Sembunyikan hamparan video terkait + Hamparan video terkait dalam layar penuh disembunyikan + Hamparan video terkait dalam layar penuh ditampilkan + + + Sembunyikan penanda waktu video + Penanda waktu disembunyikan + Penanda waktu ditampilkan + + + Sembunyikan panel popup pemutar + Panel popup pemutar disembunyikan + Panel popup pemutar ditampilkan + + + Keluar dari mode layar penuh di akhir video + Nonaktif + Potret + Lanskap + Potret dan lanskap + + + Buka video dalam potret layar penuh + Video terbuka dalam layar penuh + Video tidak terbuka dalam layar penuh + + + Opasitas hamparan pemutar + Nilai opasitas antara 0-100, dimana 0 adalah transparan + Opasitas hamparan pemutar harus di antara 0-100 + + + + Dislike sementara tidak tersedia (waktu API habis) + Dislike tidak tersedia (status %d) + Dislike tidak tersedia (pembatasan API klien) + Dislike tidak tersedia (%s) + + Muat ulang video untuk memilih Return YouTube Dislike + + Disembunyikan oleh pemilik + Return YouTube Dislike + Dislike ditampilkan + Dislike tidak ditampilkan + Tampilkan dislike di Shorts + "Dislike pada Shorts ditampilkan Batasan: Dislike mungkin tidak muncul dalam mode penyamaran" - Dislike pada Shorts tidak ditampilkan - Dislike sebagai persentase - Dislike ditampilkan sebagai persentase - Dislike ditampilkan sebagai angka - - Tombol Suka Ringkas - Tombol suka ditata untuk lebar minimum - Tombol suka ditata untuk tampilan terbaik - Tampilkan perkiraan suka - Video dengan suka yang dinonaktifkan menampilkan perkiraan jumlah suka - Perkiraan jumlah suka tidak ditampilkan - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia - Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia - ReturnYouTubeDislike.com - Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut - - Statistik API ReturnYoutubeDislike dari perangkat ini - Waktu respons API, rata-rata - Waktu respons API, minimum - Waktu respons API, maksimum - Waktu respons API, video terakhir - Dislike sementara tidak tersedia - Pembatasan tarif API klien berlaku - API mengambil vote, jumlah dari panggilan - Tidak ada panggilan jaringan yang terjadi - %d panggilan jaringan terjadi - API mengambil vote, jumlah dari waktu habis - Tidak ada panggilan jaringan yang kehabisan waktu - %d panggilan jaringan yang kehabisan waktu - Pembatasan tarif API klien - Tidak ada pembatasan tarif klien terjadi - Pembatasan tarif klien terjadi %d kali - %d milidetik - - - Aktifkan bilah pencarian lebar - Bilah pencarian lebar diaktifkan - Bilah pencarian lebar dinonaktifkan - - - Aktifkan thumbnail berkualitas tinggi - Thumbnail seekbar berkualitas tinggi - Thumbnail seekbar berkualitas sedang - Seekbar layar penuh memiliki thumbnail berkualitas tinggi - Seekbar layar penuh memiliki thumbnail berkualitas menengah - "Ini juga akan memulihkan thumbnail pada livestream yang tidak memiliki gambar mini seekbar. - -Thumbnail seekbar akan menggunakan kualitas yang sama dengan video saat ini. - -Fitur ini bekerja paling baik dengan kualitas video 720p atau lebih rendah dan saat menggunakan sambungan internet yang sangat cepat." - Pulihkan thumbnail seekbar yang lama - Thumbnail seekbar akan muncul di atas seekbar - Thumbnail seekbar akan muncul di layar penuh - - - SponsorBlock - Aktifkan SponsorBlock - SponsorBlock adalah sistem yang bersumber dari banyak orang untuk melewatkan bagian video YouTube yang mengganggu - Tampilan - Tampilkan tombol voting - Tombol segmen voting ditampilkan - Tombol segmen voting tidak ditampilkan - Gunakan tata letak persegi - Tombol dan kontrol berbentuk persegi - Tombol dan kontrol berbentuk bulat - - Gunakan tombol Lewati ringkas - Tombol lewati ditata untuk lebar minimum - Tombol lewati ditata untuk penampilan terbaik - Sembunyikan tombol Lewati secara otomatis - Tombol lewati disembunyikan setelah beberapa detik - Tombol Lewati ditampilkan untuk seluruh segmen - Durasi tombol Lewati - Berapa lama untuk menampilkan tombol lewati dan lewati ke sorotan sebelum bersembunyi secara otomatis - Tampilkan pembatalan pesan timbul lewati - Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Ketuk notifikasi pesan timbul untuk membatalkan lewati - Pesan timbul tidak ditampilkan - Durasi pesan timbul lewati - Berapa lama waktu yang dibutuhkan untuk menampilkan pembatalan pesan timbul - 1 detik - 2 detik - 3 detik - 4 detik - 5 detik - 6 detik - 7 detik - 8 detik - 9 detik - 10 detik - Tampilkan durasi video tanpa segmen - Durasi video tanpa semua segmen ditampilkan pada bilah pencarian - Durasi video penuh ditampilkan - Membuat segmen baru - Tampilkan tombol Buat segmen baru - Tombol buat segmen baru ditampilkan - Tombol buat segmen baru tidak ditampilkan - Sesuaikan langkah segmen baru - Jumlah milidetik tombol penyesuaian waktu bergerak saat membuat segmen baru - Nilainya harus berupa angka positif - Lihat pedoman - Pedoman berisi aturan dan saran untuk membuat segmen baru - Ikuti pedoman - Bacalah panduan SponsorBlock sebelum membuat segmen baru - Sudah dibaca - Tunjukkan - Umum - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul ditampilkan jika SponsorBlock tidak tersedia - Pesan timbul tidak ditampilkan jika SponsorBlock tidak tersedia - Aktifkan pelacakan melewati hitungan - Mengizinkan papan peringkat SponsorBlock mengetahui berapa banyak waktu yang dihemat. Pesan dikirim ke papan peringkat setiap kali sebuah segmen dilewati - Lewati pelacakan jumlah tidak diaktifkan - Durasi minimum segmen - Segmen yang lebih pendek pada dari nilai ini (detik) tidak akan ditampilkan atau dilewati - Durasi waktu tidak sah - ID pengguna pribadi Anda - Ini harus dijaga kerahasiaannya. Seperti kata sandi dan tidak disarankan untuk dibagikan dengan siapa pun. Jika seseorang mendapatkan ini, mereka dapat menyamar sebagai Anda - ID pengguna tidak boleh lebih dari 30 karakter - Ubah URL API - Alamat yang digunakan SponsorBlock untuk membuat panggilan ke server - Atur ulang URL API - URL API tidak sah - URL API diubah - Impor/Ekspor pengaturan - Salin - Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya - Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya, termasuk ID pengguna Anda. Pastikan untuk membagikannya dengan bijak - Pengaturan berhasil diimpor - Gagal mengimpor: %s - Gagal mengekspor: %s - "Pengaturan Anda berisi Id pengguna pribadi SponsorBlock. + Dislike pada Shorts tidak ditampilkan + Dislike sebagai persentase + Dislike ditampilkan sebagai persentase + Dislike ditampilkan sebagai angka + + Tombol Suka Ringkas + Tombol suka ditata untuk lebar minimum + Tombol suka ditata untuk tampilan terbaik + Tampilkan perkiraan suka + Video dengan suka yang dinonaktifkan menampilkan perkiraan jumlah suka + Perkiraan jumlah suka tidak ditampilkan + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia + Pesan timbul tidak ditampilkan jika Return YouTube Dislike tidak tersedia + ReturnYouTubeDislike.com + Data disediakan oleh API Return YouTube Dislike. Tekan di sini untuk mempelajari lebih lanjut + + Statistik API ReturnYoutubeDislike dari perangkat ini + Waktu respons API, rata-rata + Waktu respons API, minimum + Waktu respons API, maksimum + Waktu respons API, video terakhir + Dislike sementara tidak tersedia - Pembatasan tarif API klien berlaku + API mengambil vote, jumlah dari panggilan + Tidak ada panggilan jaringan yang terjadi + %d panggilan jaringan terjadi + API mengambil vote, jumlah dari waktu habis + Tidak ada panggilan jaringan yang kehabisan waktu + %d panggilan jaringan yang kehabisan waktu + Pembatasan tarif API klien + Tidak ada pembatasan tarif klien terjadi + Pembatasan tarif klien terjadi %d kali + %d milidetik + + + SponsorBlock + Aktifkan SponsorBlock + SponsorBlock adalah sistem yang bersumber dari banyak orang untuk melewatkan bagian video YouTube yang mengganggu + Tampilan + Tampilkan tombol voting + Tombol segmen voting ditampilkan + Tombol segmen voting tidak ditampilkan + Gunakan tata letak persegi + Tombol dan kontrol berbentuk persegi + Tombol dan kontrol berbentuk bulat + + Gunakan tombol Lewati ringkas + Tombol lewati ditata untuk lebar minimum + Tombol lewati ditata untuk penampilan terbaik + Sembunyikan tombol Lewati secara otomatis + Tombol lewati disembunyikan setelah beberapa detik + Tombol Lewati ditampilkan untuk seluruh segmen + Durasi tombol Lewati + Berapa lama untuk menampilkan tombol lewati dan lewati ke sorotan sebelum bersembunyi secara otomatis + Tampilkan pembatalan pesan timbul lewati + Pesan timbul ditampilkan saat segmen dilewati secara otomatis. Ketuk notifikasi pesan timbul untuk membatalkan lewati + Pesan timbul tidak ditampilkan + Durasi pesan timbul lewati + Berapa lama waktu yang dibutuhkan untuk menampilkan pembatalan pesan timbul + 1 detik + 2 detik + 3 detik + 4 detik + 5 detik + 6 detik + 7 detik + 8 detik + 9 detik + 10 detik + Tampilkan durasi video tanpa segmen + Durasi video tanpa semua segmen ditampilkan pada bilah pencarian + Durasi video penuh ditampilkan + Membuat segmen baru + Tampilkan tombol Buat segmen baru + Tombol buat segmen baru ditampilkan + Tombol buat segmen baru tidak ditampilkan + Sesuaikan langkah segmen baru + Jumlah milidetik tombol penyesuaian waktu bergerak saat membuat segmen baru + Nilainya harus berupa angka positif + Lihat pedoman + Pedoman berisi aturan dan saran untuk membuat segmen baru + Ikuti pedoman + Bacalah panduan SponsorBlock sebelum membuat segmen baru + Sudah dibaca + Tunjukkan + Umum + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul ditampilkan jika SponsorBlock tidak tersedia + Pesan timbul tidak ditampilkan jika SponsorBlock tidak tersedia + Aktifkan pelacakan melewati hitungan + Mengizinkan papan peringkat SponsorBlock mengetahui berapa banyak waktu yang dihemat. Pesan dikirim ke papan peringkat setiap kali sebuah segmen dilewati + Lewati pelacakan jumlah tidak diaktifkan + Durasi minimum segmen + Segmen yang lebih pendek pada dari nilai ini (detik) tidak akan ditampilkan atau dilewati + Durasi waktu tidak sah + ID pengguna pribadi Anda + Ini harus dijaga kerahasiaannya. Seperti kata sandi dan tidak disarankan untuk dibagikan dengan siapa pun. Jika seseorang mendapatkan ini, mereka dapat menyamar sebagai Anda + ID pengguna tidak boleh lebih dari 30 karakter + Ubah URL API + Alamat yang digunakan SponsorBlock untuk membuat panggilan ke server + Atur ulang URL API + URL API tidak sah + URL API diubah + Impor/Ekspor pengaturan + Salin + Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya + Konfigurasi JSON SponsorBlock Anda yang dapat diimpor/diekspor ke ReVanced dan platform SponsorBlock lainnya, termasuk ID pengguna Anda. Pastikan untuk membagikannya dengan bijak + Pengaturan berhasil diimpor + Gagal mengimpor: %s + Gagal mengekspor: %s + "Pengaturan Anda berisi Id pengguna pribadi SponsorBlock. Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan." - Jangan tampilkan lagi - Ubah perilaku segmen - Sponsor - Promosi berbayar, rujukan berbayar, dan iklan langsung. Bukan untuk promosi diri atau promosi gratis untuk gerakan/kreator/situs web/produk yang mereka sukai - Tidak Dibayar/Promosi Diri Sendiri - Serupa dengan Sponsor kecuali tidak dibayar atau promosi diri sendiri. Termasuk bagian merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka - Pengingat Interaksi (Berlangganan) - Pengingat singkat untuk menyukai, berlangganan, atau mengikuti mereka di tengah-tengah konten. Jika berdurasi panjang atau tentang sesuatu yang spesifik, sebaiknya berada di bawah promosi diri sendiri - Sorotan - Bagian video yang paling dilihat oleh orang - Jeda/Animasi Intro - Interval tanpa konten yang sebenarnya. Bisa berupa jeda, bingkai statis, atau animasi berulang. Tidak termasuk transisi yang berisi informasi - Kartu Akhir / Kredit - Kredit atau ketika layar akhir YouTube muncul. Bukan kesimpulan dengan informasi - Pengantar / Sapaan - Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan - Pratinjau / Rekap - Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain - Singgungan / Lelucon - Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang - Musik: Bagian Non-Musik - Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain - Lewati - Sorotan - Lewati sponsor - Lewati promo - Lewati interaksi - Lewati ke sorotan - Lewati intro - Lewati jeda - Lewati jeda - Lewati outro - Lewati pengantar - Lewati pratinjau - Lewati pratinjau - Lewati rekap - Lewati singgungan - Lewati non-musik - Lewati segmen - Sponsor dilewati - Promosi diri sendiri dilewati - Pengingat mengganggu dilewati - Dilewati ke sorotan - Intro dilewati - Jeda dilewati - Jeda dilewati - Outro dilewati - Sapaan dilewati - Pratinjau dilewati - Pratinjau dilewati - Rekap dilewati - Singgungan dilewati - Melewati bagian non-musik - Melewati segmen yang belum dikirim - Beberapa segmen dilewati - Lewati otomatis - Lewati otomatis sekali - Tampilkan tombol Lewati - Tampilkan di seekbar - Nonaktifkan - Tak dapat mengirim segmen: %s - SponsorBlock sementara tidak tersedia - Tak dapat mengirim segmen (status: %1$d %2$s) - Tidak dapat mengirimkan segmen. Rate Limited (terlalu banyak dari pengguna atau IP yang sama) - Tidak dapat mengirim segmen: %s - "Tidak dapat mengirimkan segmen. + Jangan tampilkan lagi + Ubah perilaku segmen + Sponsor + Promosi berbayar, rujukan berbayar, dan iklan langsung. Bukan untuk promosi diri atau promosi gratis untuk gerakan/kreator/situs web/produk yang mereka sukai + Tidak Dibayar/Promosi Diri Sendiri + Serupa dengan Sponsor kecuali tidak dibayar atau promosi diri sendiri. Termasuk bagian merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka + Pengingat Interaksi (Berlangganan) + Pengingat singkat untuk menyukai, berlangganan, atau mengikuti mereka di tengah-tengah konten. Jika berdurasi panjang atau tentang sesuatu yang spesifik, sebaiknya berada di bawah promosi diri sendiri + Sorotan + Bagian video yang paling dilihat oleh orang + Jeda/Animasi Intro + Interval tanpa konten yang sebenarnya. Bisa berupa jeda, bingkai statis, atau animasi berulang. Tidak termasuk transisi yang berisi informasi + Kartu Akhir / Kredit + Kredit atau ketika layar akhir YouTube muncul. Bukan kesimpulan dengan informasi + Pengantar / Sapaan + Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan + Pratinjau / Rekap + Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain + Singgungan / Lelucon + Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang + Musik: Bagian Non-Musik + Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain + Lewati + Sorotan + Lewati sponsor + Lewati promo + Lewati interaksi + Lewati ke sorotan + Lewati intro + Lewati jeda + Lewati jeda + Lewati outro + Lewati pengantar + Lewati pratinjau + Lewati pratinjau + Lewati rekap + Lewati singgungan + Lewati non-musik + Lewati segmen + Sponsor dilewati + Promosi diri sendiri dilewati + Pengingat mengganggu dilewati + Dilewati ke sorotan + Intro dilewati + Jeda dilewati + Jeda dilewati + Outro dilewati + Sapaan dilewati + Pratinjau dilewati + Pratinjau dilewati + Rekap dilewati + Singgungan dilewati + Melewati bagian non-musik + Melewati segmen yang belum dikirim + Beberapa segmen dilewati + Lewati otomatis + Lewati otomatis sekali + Tampilkan tombol Lewati + Tampilkan di seekbar + Nonaktifkan + Tak dapat mengirim segmen: %s + SponsorBlock sementara tidak tersedia + Tak dapat mengirim segmen (status: %1$d %2$s) + Tidak dapat mengirimkan segmen. Rate Limited (terlalu banyak dari pengguna atau IP yang sama) + Tidak dapat mengirim segmen: %s + "Tidak dapat mengirimkan segmen. Sudah ada" - Segmen berhasil terkirim - - SponsorBlock tidak tersedia (API kehabisan waktu) - SponsorBlock sementara tidak tersedia (status %d) - SponsorBlock sementara tidak tersedia - Tidak dapat memilih segmen (API kehabisan waktu) - Tidak dapat memilih segmen (status: %1$d %2$s) - Tidak dapat memilih segmen: %s - Sukai - Tidak sukai - Ubah kategori - Tidak ada segmen untuk dipilih - - %1$s ke %2$s - Pilih kategori segmen - Kategori dinonaktifkan di pengaturan. Aktifkan kategori untuk dikirim. - Segmen SponsorBlock Baru - Tetapkan %s sebagai awal atau akhir segmen baru? - Mulai - Akhir - Sekarang - Waktu segmen dimulai pada - Waktu segmen diakhiri pada - Apakah waktunya benar? - "Bagian ini terdiri dari + Segmen berhasil terkirim + + SponsorBlock tidak tersedia (API kehabisan waktu) + SponsorBlock sementara tidak tersedia (status %d) + SponsorBlock sementara tidak tersedia + Tidak dapat memilih segmen (API kehabisan waktu) + Tidak dapat memilih segmen (status: %1$d %2$s) + Tidak dapat memilih segmen: %s + Sukai + Tidak sukai + Ubah kategori + Tidak ada segmen untuk dipilih + + %1$s ke %2$s + Pilih kategori segmen + Kategori dinonaktifkan di pengaturan. Aktifkan kategori untuk dikirim. + Segmen SponsorBlock Baru + Tetapkan %s sebagai awal atau akhir segmen baru? + Mulai + Akhir + Sekarang + Waktu segmen dimulai pada + Waktu segmen diakhiri pada + Apakah waktunya benar? + "Bagian ini terdiri dari %1$s sampai @@ -1290,47 +1375,47 @@ sampai (%3$s) Siap mengirim?" - Awal harus sebelum akhir - Tandai dua lokasi pada bilah waktu terlebih dahulu - Pratinjau segmen, dan pastikan segmen dilewati dengan lancar - Ubah waktu segmen secara manual - Apakah Anda ingin menubah waktu awal atau akhir segmen? - Waktu yang diberikan tidak sah - Statistik - - Statistik sementara tidak tersedia (API tidak aktif) - Memuat... - SponsorBlock dinonaktifkan - Nama pengguna Anda: <b>%s</b> - Tekan di sini untuk mengubah nama pengguna Anda - Tidak dapat mengubah nama pengguna: Status: %1$d %2$s - Nama pengguna berhasil diubah - Reputasi Anda: <b>%.2f</b> - Anda telah membuat <b>%s</b> segmen - Ketuk di sini untuk melihat segmen Anda - Papan peringkat SponsorBlock - Anda menghindarkan orang dari <b>%s</b> segmen - Tekan di sini untuk melihat data global dan kontributor utama - Itu <b>%s</b> dari hidup mereka.<br>Tekan di sini untuk melihat papan peringkat - Anda melewati <b>%s</b> segmen - Itu <b>%s</b> - Atur ulang penghitungan segmen terlewati? - %1$s jam %2$s menit - %1$s menit %2$s detik - %s detik - Opasitas: - Warna: - Tentang - sponsor.ajay.app - Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain - - - Faktor bentuk tata letak - Bawaan - Ponsel - Tablet - Otomotif - "Perubahan meliputi: + Awal harus sebelum akhir + Tandai dua lokasi pada bilah waktu terlebih dahulu + Pratinjau segmen, dan pastikan segmen dilewati dengan lancar + Ubah waktu segmen secara manual + Apakah Anda ingin menubah waktu awal atau akhir segmen? + Waktu yang diberikan tidak sah + Statistik + + Statistik sementara tidak tersedia (API tidak aktif) + Memuat... + SponsorBlock dinonaktifkan + Nama pengguna Anda: <b>%s</b> + Tekan di sini untuk mengubah nama pengguna Anda + Tidak dapat mengubah nama pengguna: Status: %1$d %2$s + Nama pengguna berhasil diubah + Reputasi Anda: <b>%.2f</b> + Anda telah membuat <b>%s</b> segmen + Ketuk di sini untuk melihat segmen Anda + Papan peringkat SponsorBlock + Anda menghindarkan orang dari <b>%s</b> segmen + Tekan di sini untuk melihat data global dan kontributor utama + Itu <b>%s</b> dari hidup mereka.<br>Tekan di sini untuk melihat papan peringkat + Anda melewati <b>%s</b> segmen + Itu <b>%s</b> + Atur ulang penghitungan segmen terlewati? + %1$s jam %2$s menit + %1$s menit %2$s detik + %s detik + Opasitas: + Warna: + Tentang + sponsor.ajay.app + Data disediakan oleh API SponsorBlock. Tekan di sini untuk mempelajari lebih lanjut dan melihat hasil pengunduhan untuk platform lain + + + Faktor bentuk tata letak + Bawaan + Ponsel + Tablet + Otomotif + "Perubahan meliputi: Tata letak tablet • Postingan komunitas disembunyikan @@ -1338,329 +1423,331 @@ Tata letak tablet Tata letak otomotif • Shorts dibuka di pemutar biasa • Umpan diatur berdasarkan topik dan channel" - - - Palsukan versi app - Versi yang dipalsukan - Versi asli - "Versi aplikasi akan dipalsukan ke versi lama YouTube. + + + Palsukan versi app + Versi yang dipalsukan + Versi asli + "Versi aplikasi akan dipalsukan ke versi lama YouTube. Ini akan mengubah tampilan dan fitur aplikasi, tetapi efek samping yang tidak diketahui dapat terjadi. Jika kemudian dimatikan, disarankan untuk menghapus data aplikasi untuk mencegah bug UI." - Target versi app yang dipalsukan - 20.13.41 - Pulihkan bilah tindakan video yang tidak diciutkan - 20.05.46 - Pulihkan fungsionalitas transkrip - 19.35.36 - Pulihkan ikon pemutar Shorts lama - 19.01.34 - Pulihkan ikon navigasi lama - - - Ubah halaman awal - Bawaan - Semua langganan - Jelajahi saluran - Kursus / Pembelajaran - Jelajahi - Fashion & Kecantikan - Permainan - Riwayat - Pustaka - Video yang disukai - Siaran langsunng - Film - Musik - Berita - Pemberitahuan - Daftar Putar - Pencarian - Belanja - Shorts - Olahraga - Langganan - Sedang tren - Realitas Virtual - Tonton nanti - Klip Anda - Selalu ubah halaman awal - "Halaman awal selalu diubah + Target versi app yang dipalsukan + 20.13.41 - Pulihkan bilah tindakan video yang tidak diciutkan + 20.05.46 - Pulihkan fungsionalitas transkrip + + + Ubah halaman awal + Bawaan + Semua langganan + Jelajahi saluran + Kursus / Pembelajaran + Jelajahi + Fashion & Kecantikan + Permainan + Riwayat + Pustaka + Video yang disukai + Siaran langsunng + Film + Musik + Berita + Pemberitahuan + Daftar Putar + Pencarian + Belanja + Shorts + Olahraga + Langganan + Sedang tren + Realitas Virtual + Tonton nanti + Klip Anda + Selalu ubah halaman awal + "Halaman awal selalu diubah Batasan: Menggunakan tombol kembali pada toolbar mungkin tidak berfungsi" - Halaman awal hanya diubah saat aplikasi dimulai - - - Matikan melanjutkan pemutar video Shorts - Pemutaran Shorts tidak akan dilanjutkan saat aplikasi dimulai - Pemutaran Shorts akan dilanjutkan saat aplikasi dimulai - - - Buka Shorts dengan - Pemutar Shorts - Pemutar biasa - Pemutar biasa layar penuh - - - Putar otomatis Shorts - Shorts akan diputar otomatis - Shorts akan diulangi - Putar otomatis Shorts di latar belakang - Pemutaran latar belakang Shorts akan diputar otomatis - Pemutaran latar belakang Shorts akan diulangi - - - Pemutar Mini - Ubah gaya pemutar mini dalam aplikasi - Jenis pemutar mini - Nonaktif - Bawaan - Minimal - Tablet - Modern 1 - Modern 2 - Modern 3 - Modern 4 - Nonaktifkan sudut membulat - Sudutnya persegi - Sudutnya membulat - Aktifkan ketuk dua kali dan cubit untuk mengubah ukuran - "Tindakan ketuk dua kali dan cubit untuk mengubah ukuran diaktifkan + Halaman awal hanya diubah saat aplikasi dimulai + + + Matikan melanjutkan pemutar video Shorts + Pemutaran Shorts tidak akan dilanjutkan saat aplikasi dimulai + Pemutaran Shorts akan dilanjutkan saat aplikasi dimulai + + + Buka Shorts dengan + Pemutar Shorts + Pemutar biasa + Pemutar biasa layar penuh + + + Putar otomatis Shorts + Shorts akan diputar otomatis + Shorts akan diulangi + Putar otomatis Shorts di latar belakang + Pemutaran latar belakang Shorts akan diputar otomatis + Pemutaran latar belakang Shorts akan diulangi + + + Pemutar Mini + Ubah gaya pemutar mini dalam aplikasi + Jenis pemutar mini + Nonaktif + Bawaan + Minimal + Tablet + Modern 1 + Modern 2 + Modern 3 + Modern 4 + Nonaktifkan sudut membulat + Sudutnya persegi + Sudutnya membulat + Aktifkan ketuk dua kali dan cubit untuk mengubah ukuran + "Tindakan ketuk dua kali dan cubit untuk mengubah ukuran diaktifkan • Ketuk dua kali untuk memperbesar ukuran miniplayer • Ketuk dua kali lagi untuk mengembalikan ukuran asli" - Tindakan ketuk dua kali dan cubit untuk mengubah ukuran dinonaktifkan - Nonaktifkan seret dan lepas - Seret dan lepas dinonaktifkan - "Seret dan lepas diaktifkan + Tindakan ketuk dua kali dan cubit untuk mengubah ukuran dinonaktifkan + Nonaktifkan seret dan lepas + Seret dan lepas dinonaktifkan + "Seret dan lepas diaktifkan Miniplayer dapat diseret ke sudut layar mana pun" - Nonaktifkan gerakan seret horizontal - Gerakan seret horizontal dinonaktifkan - "Gerakan seret horizontal diaktifkan + Nonaktifkan gerakan seret horizontal + Gerakan seret horizontal dinonaktifkan + "Gerakan seret horizontal diaktifkan Miniplayer dapat diseret keluar layar ke kiri atau kanan" - Sembunyikan tombol hamparan - Tombol hamparan disembunyikan - Tombol hamparan ditampilkan - Sembunyikan tombol perluas dan tutup - "Tombol disembunyikan + Sembunyikan tombol hamparan + Tombol hamparan disembunyikan + Tombol hamparan ditampilkan + Sembunyikan tombol perluas dan tutup + "Tombol disembunyikan Seret untuk memperluas atau menutup" - Tombol perluas dan tutup ditampilkan - Sembunyikan subteks - Subteks disembunyikan - Subteks ditampilkan - Sembunyikan tombol maju dan mundur - Lewati maju dan mundur disembunyikan - Lewati maju dan mundur ditampilkan - Ukuran awal - Awal pada ukuran layar, dalam piksel - Ukuran piksel harus antara %1$s dan %2$s - Opasitas hamparan - Nilai opasitas antara 0-100, dimana 0 adalah transparan - Opasitas hamparan pemutar mini antara 0-100 - - - Aktifkan layar pemuatan gradien - Layar pemuatan akan memiliki latar belakang gradien - Layar pemuatan akan memiliki latar belakang yang solid - Gaya layar pembuka - Berwarna - Hitam dan putih - Aktifkan warna seekbar khusus - Warna seekbar khusus ditampilkan - Warna seekbar asli ditampilkan - Warna seekbar khusus - Warna seekbar - Warna aksen seekbar khusus - Warna aksen seekbar - Nilai warna seekbar tidak sah - - - YouTube ReVanced - YT ReVanced - YT - - - Logo Header - Bawaan - Reguler - Premium - ReVanced - - ReVanced minimal - Khusus - - - Abaikan pembatasan wilayah gambar - Menggunakan sumber gambar yt4.ggpht.com - "Menggunakan host gambar asli + Tombol perluas dan tutup ditampilkan + Sembunyikan subteks + Subteks disembunyikan + Subteks ditampilkan + Sembunyikan tombol maju dan mundur + Lewati maju dan mundur disembunyikan + Lewati maju dan mundur ditampilkan + Ukuran awal + Awal pada ukuran layar, dalam piksel + Ukuran piksel harus antara %1$s dan %2$s + Opasitas hamparan + Nilai opasitas antara 0-100, dimana 0 adalah transparan + Opasitas hamparan pemutar mini antara 0-100 + + + Aktifkan layar pemuatan gradien + Layar pemuatan akan memiliki latar belakang gradien + Layar pemuatan akan memiliki latar belakang yang solid + Gaya layar pembuka + Nonaktif + Berwarna + Hitam dan putih + Aktifkan warna seekbar khusus + Warna seekbar khusus ditampilkan + Warna seekbar asli ditampilkan + Warna seekbar khusus + Warna seekbar + Warna aksen seekbar khusus + Warna aksen seekbar + Nilai warna seekbar tidak sah + + + YouTube ReVanced + YT ReVanced + YT + + + Logo Header + Bawaan + Reguler + Premium + ReVanced + + ReVanced minimal + Khusus + + + Abaikan pembatasan wilayah gambar + Menggunakan sumber gambar yt4.ggpht.com + "Menggunakan host gambar asli Mengaktifkan ini dapat memperbaiki gambar yang hilang yang diblokir di beberapa wilayah" - - - - Tab beranda - - Bilah Langganan - - Tab Anda - Daftar putar & rekomendasi pemutar - Hasil pencarian - Thumbnail asli - DeArrow & Thumbnail asli - DeArrow & Tangkapan diam - Tangkapan diam - DeArrow - "DeArrow menyediakan gambar mini crowdsourced untuk video YouTube. Gambar mini ini seringkali lebih relevan daripada yang disediakan oleh YouTube + + + + Tab beranda + + Bilah Langganan + + Tab Anda + Daftar putar & rekomendasi pemutar + Hasil pencarian + Thumbnail asli + DeArrow & Thumbnail asli + DeArrow & Tangkapan diam + Tangkapan diam + DeArrow + "DeArrow menyediakan gambar mini crowdsourced untuk video YouTube. Gambar mini ini seringkali lebih relevan daripada yang disediakan oleh YouTube Jika diaktifkan, URL video akan dikirim ke server API dan tidak ada data lain yang dikirim. Jika video tidak memiliki gambar mini DeArrow, maka gambar asli atau tangkapan statis yang ditampilkan Ketuk di sini untuk mempelajari lebih lanjut tentang DeArrow" - Tampilkan pesan timbul jika API tidak tersedia - Pesan timbul ditampilkan jika DeArrow tidak tersedia - Pesan timbul tidak ditampilkan jika DeArrow tidak tersedia - Titik akhir API DeArrow - URL titik akhir cache thumbnail DeArrow - Tangkapan video diam - Tangkapan diam diambil dari awal/tengah/akhir setiap video. Gambar-gambar ini dibuat di YouTube dan tidak ada API eksternal yang digunakan - Gunakan tangkapan diam cepat - Menggunakan tangkapan diam kualitas sedang. Thumbnail akan dimuat lebih cepat, tetapi siaran langsung, video yang belum dirilis, atau video yang sangat lama mungkin menampilkan thumbnail kosong - Menggunakan tangkapan diam berkualitas tinggi - Waktu video untuk mengambil gambar diam - Awal video - Pertengahan video - Akhir video - - DeArrow sementara tidak tersedia (kode status: %s) - DeArrow sementara tidak tersedia - - - Tampilkan pengumuman ReVanced - Pengumuman saat memulai ditampilkan - Pengumuman saat memulai tidak ditampilkan - Tampilkan pengumuman saat memulai - Gagal menghubungkan ke penyedia pengumuman - Abaikan - - - Aktifkan pengulangan video - Video akan diulangi - Video tidak akan diulangi - - - Tampilkan tombol pengulangan video - Tombol ditampilkan - Tombol tidak ditampilkan - Pengulangan video aktif - Pengulangan video tidak aktif - - - Jeda saat terjadi gangguan audio - Pemutaran terjeda saat audio lain diputar (mis. navigasi) - Volume berkurang saat audio lain diputar - - - Palsukan dimensi perangkat - "Dimensi perangkat dipalsukan + Tampilkan pesan timbul jika API tidak tersedia + Pesan timbul ditampilkan jika DeArrow tidak tersedia + Pesan timbul tidak ditampilkan jika DeArrow tidak tersedia + Titik akhir API DeArrow + URL titik akhir cache thumbnail DeArrow + Tangkapan video diam + Tangkapan diam diambil dari awal/tengah/akhir setiap video. Gambar-gambar ini dibuat di YouTube dan tidak ada API eksternal yang digunakan + Gunakan tangkapan diam cepat + Menggunakan tangkapan diam kualitas sedang. Thumbnail akan dimuat lebih cepat, tetapi siaran langsung, video yang belum dirilis, atau video yang sangat lama mungkin menampilkan thumbnail kosong + Menggunakan tangkapan diam berkualitas tinggi + Waktu video untuk mengambil gambar diam + Awal video + Pertengahan video + Akhir video + + DeArrow sementara tidak tersedia (kode status: %s) + DeArrow sementara tidak tersedia + + + Tampilkan pengumuman ReVanced + Pengumuman saat memulai ditampilkan + Pengumuman saat memulai tidak ditampilkan + Tampilkan pengumuman saat memulai + Gagal menghubungkan ke penyedia pengumuman + Abaikan + + + Aktifkan pengulangan video + Video akan diulangi + Video tidak akan diulangi + + + Tampilkan tombol pengulangan video + Tombol ditampilkan + Tombol tidak ditampilkan + Pengulangan video aktif + Pengulangan video tidak aktif + + + Jeda saat terjadi gangguan audio + Pemutaran terjeda saat audio lain diputar (mis. navigasi) + Volume berkurang saat audio lain diputar + + + Palsukan dimensi perangkat + "Dimensi perangkat dipalsukan Kualitas video yang lebih tinggi mungkin tidak terkunci, tetapi Anda mungkin mengalami masalah pemutaran video, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui" - "Dimensi perangkat tidak dipalsukan + "Dimensi perangkat tidak dipalsukan Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi" - Mengaktifkan ini dapat menyebabkan pemutaran video tersendat-sendat, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui. - - - Umpan balik sentuh getar - Ubah umpan balik sentuh getar - Nonaktifkan sentuh getar bab - Sentuh getar bab dinonaktifkan - Sentuh getar bab diaktifkan - Nonaktifkan sentuh getar pencarian presisi - Sentuh getar pencarian presisi dinonaktifkan - Sentuh getar pencarian presisi diaktifkan - Nonaktifkan sentuh getar urungkan pencarian - Sentuh getar urungkan pencarian dinonaktifkan - Sentuh getar urungkan pencarian diaktifkan - Matikan sentuh getar zoom - Sentuh getar zoom dinonaktifkan - Sentuh getar zoom diaktifkan - - - Jika Anda baru saja mengubah detail login akun Anda, hapus pemasangan dan ulangi memasang MicroG. - - - Abaikan pengalihan URL - Pengalihan URL diabaikan - Pengalihan URL tidak diabaikan - - - Buka tautan di peramban - Membuka tautan di peramban eksternal - Membuka tautan di peramban dalam aplikasi - - - - Otomatis - Ingat perubahan kualitas video - Perubahan kualitas diatur ke semua video - Perubahan kualitas hanya diatur di video saat ini - Tampilkan pesan timbul saat kualitas video berubah - Pesan timbul ditampilkan saat kualitas video bawaan diubah - Pesan timbul tidak ditampilkan saat kualitas video bawaan diubah - Kualitas video bawaan di jaringan Wi-Fi - Kualitas video bawaan di jaringan selular - Ingat perubahan kualitas Shorts - Perubahan kualitas berlaku untuk semua Shorts - Perubahan kualitas hanya berlaku untuk Short saat ini - Kualitas Shorts bawaan di jaringan Wi-Fi - Kualitas Shorts bawaan di jaringan seluler - seluler - wifi - Kualitas bawaan %1$s diubah ke: %2$s - Kualitas Shorts %1$s diubah menjadi: %2$s - - - Tampilkan tombol dialog kecepatan - Tombol dialog kecepatan ditampilkan. Ketuk dan tahan untuk mengatur ulang kecepatan pemutaran ke bawaan - Tombol dialog kecepatan tidak ditampilkan - - - Tampilkan tombol kualitas video - Tombol kualitas video ditampilkan. Ketuk dan tahan untuk mengatur ulang kualitas ke bawaan - Tombol kualitas video tidak ditampilkan - - - Menu kecepatan pemutaran khusus - Menu kecepatan khusus ditampilkan - Menu kecepatan khusus tidak ditampilkan - Pulihkan menu kecepatan pemutaran lama - Menu kecepatan lama ditampilkan - Menu kecepatan modern ditampilkan - Kecepatan pemutaran khusus - Tambah atau ubah kecepatan pemutaran khusus - Kecepatan khusus harus kurang dari %s - Kecepatan pemutaran khusus tidak valid - Otomatis - Kecepatan ketuk dan tahan khusus - Kecepatan pemutaran antara 0-8 - - - Ingat perubahan kecepatan pemutaran - Perubahan kecepatan pemutaran berlaku untuk semua video - Perubahan kecepatan pemutaran berlaku untuk video saat ini - Tampilkan pesan timbul saat kecepatan pemutaran berubah - Pesan timbul ditampilkan saat kecepatan pemutaran bawaan diubah - Pesan timbul tidak ditampilkan ketika kecepatan pemutaran bawaan diubah - Kecepatan pemutaran bawaan - Mengubah kecepatan bawaan menjadi: %s - - - Nonaktifkan video HDR - Video HDR dinonaktifkan - Video HDR diaktifkan - Paksa AVC (H.264) - Codec video dipaksa ke AVC (H.264) - Codec video ditentukan secara otomatis - "Manfaat: + Mengaktifkan ini dapat menyebabkan pemutaran video tersendat-sendat, masa pakai baterai yang lebih buruk, dan efek samping yang tidak diketahui. + + + Umpan balik sentuh getar + Ubah umpan balik sentuh getar + Nonaktifkan sentuh getar bab + Sentuh getar bab dinonaktifkan + Sentuh getar bab diaktifkan + Nonaktifkan sentuh getar pencarian presisi + Sentuh getar pencarian presisi dinonaktifkan + Sentuh getar pencarian presisi diaktifkan + Nonaktifkan sentuh getar urungkan pencarian + Sentuh getar urungkan pencarian dinonaktifkan + Sentuh getar urungkan pencarian diaktifkan + Nonaktifkan getar ketuk dan tahan + Getar ketuk dan tahan dinonaktifkan + Getar ketuk dan tahan diaktifkan + Matikan sentuh getar zoom + Sentuh getar zoom dinonaktifkan + Sentuh getar zoom diaktifkan + + + Jika Anda baru saja mengubah detail login akun Anda, hapus pemasangan dan ulangi memasang MicroG. + + + Abaikan pengalihan URL + Pengalihan URL diabaikan + Pengalihan URL tidak diabaikan + + + Buka tautan di peramban + Membuka tautan di peramban eksternal + Membuka tautan di peramban dalam aplikasi + + + + Otomatis + Ingat perubahan kualitas video + Perubahan kualitas diatur ke semua video + Perubahan kualitas hanya diatur di video saat ini + Tampilkan pesan timbul saat kualitas video berubah + Pesan timbul ditampilkan saat kualitas video bawaan diubah + Pesan timbul tidak ditampilkan saat kualitas video bawaan diubah + Kualitas video bawaan di jaringan Wi-Fi + Kualitas video bawaan di jaringan selular + Ingat perubahan kualitas Shorts + Perubahan kualitas berlaku untuk semua Shorts + Perubahan kualitas hanya berlaku untuk Short saat ini + Kualitas Shorts bawaan di jaringan Wi-Fi + Kualitas Shorts bawaan di jaringan seluler + seluler + wifi + Kualitas bawaan %1$s diubah ke: %2$s + Kualitas Shorts %1$s diubah menjadi: %2$s + + + Tampilkan tombol dialog kecepatan + Tombol dialog kecepatan ditampilkan. Ketuk dan tahan untuk mengatur ulang kecepatan pemutaran ke bawaan + Tombol dialog kecepatan tidak ditampilkan + + + Tampilkan tombol kualitas video + Tombol kualitas video ditampilkan. Ketuk dan tahan untuk mengatur ulang kualitas ke bawaan + Tombol kualitas video tidak ditampilkan + + + Menu kecepatan pemutaran khusus + Menu kecepatan khusus ditampilkan + Menu kecepatan khusus tidak ditampilkan + Pulihkan menu kecepatan pemutaran lama + Menu kecepatan lama ditampilkan + Menu kecepatan modern ditampilkan + Kecepatan pemutaran khusus + Tambah atau ubah kecepatan pemutaran khusus + Kecepatan khusus harus kurang dari %s + Kecepatan pemutaran khusus tidak valid + Otomatis + Kecepatan ketuk dan tahan khusus + Kecepatan pemutaran antara 0-8 + + + Ingat perubahan kecepatan pemutaran + Perubahan kecepatan pemutaran berlaku untuk semua video + Perubahan kecepatan pemutaran berlaku untuk video saat ini + Tampilkan pesan timbul saat kecepatan pemutaran berubah + Pesan timbul ditampilkan saat kecepatan pemutaran bawaan diubah + Pesan timbul tidak ditampilkan ketika kecepatan pemutaran bawaan diubah + Kecepatan pemutaran bawaan + Mengubah kecepatan bawaan menjadi: %s + + + Nonaktifkan video HDR + Video HDR dinonaktifkan + Video HDR diaktifkan + Paksa AVC (H.264) + Codec video dipaksa ke AVC (H.264) + Codec video ditentukan secara otomatis + "Manfaat: • Dapat meningkatkan daya tahan baterai • Dapat memulihkan resolusi video yang hilang pada perangkat lama @@ -1669,182 +1756,188 @@ Batasan: • Pemutaran video akan menggunakan lebih banyak data internet dibandingkan VP9 atau AV1 • Video HDR tidak akan menggunakan AVC • Beberapa perangkat tidak dapat memaksakan AVC" - - - Tampilkan menu kualitas video lanjutan - Menu kualitas video lanjutan ditampilkan - Menu kualitas video lanjutan tidak ditampilkan - - - Aktifkan geser untuk mencari - Geser untuk mencari diaktifkan - Geser untuk mencari tidak diaktifkan - - - Izinkan Android VR AV1 - "Codec video adalah AVC (H.264), VP9, atau AV1 + + + Tampilkan menu kualitas video lanjutan + Menu kualitas video lanjutan ditampilkan + Menu kualitas video lanjutan tidak ditampilkan + + + Sembunyikan pilihan kualitas Premium + Pilihan kualitas Premium disembunyikan + Pilihan kualitas Premium ditampilkan + + + Aktifkan geser untuk mencari + Geser untuk mencari diaktifkan + Geser untuk mencari tidak diaktifkan + + + Izinkan Android VR AV1 + "Codec video adalah AVC (H.264), VP9, atau AV1 Pemutaran mungkin tersendat atau kehilangan bingkai" - Codec video adalah AVC (H.264) atau VP9 - "Mengaktifkan pengaturan ini mungkin menggunakan perangkat lunak decoding AV1. + Codec video adalah AVC (H.264) atau VP9 + "Mengaktifkan pengaturan ini mungkin menggunakan perangkat lunak decoding AV1. Pemutaran video dengan AV1 mungkin tersendat atau kehilangan bingkai." - Efek samping pemalsuan - • Klien eksperimental dan dapat berhenti berfungsi kapan saja - • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah - • Menu trek audio hilang - • Tidak ada codec video AV1 - • Volume stabil tidak tersedia - • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran - - • Paksa audio asli tidak tersedia - Tampilkan di Statistik untuk nerds - Jenis klien ditampilkan di Statistik untuk nerds - Klien disembunyikan di Statistik untuk nerds - - - - - YT Musik ReVanced - Musik ReVanced - Musik - - - Tentang - Iklan - Umum - Pemutar - Lain-lain - - - Sembunyikan iklan video - Iklan video disembunyikan - Iklan video ditampilkan - - - Aktifkan pengulangan permanen - Pengulangan permanen diaktifkan - Pengulangan permanen dinonaktifkan - - - Sembunyikan tombol transmisi - Tombol transmisi disembunyikan - Tombol transmisi ditampilkan - Sembunyikan tombol Riwayat - Tombol Riwayat disembunyikan - Tombol Riwayat ditampilkan - Sembunyikan tombol notifikasi - Tombol notifikasi disembunyikan - Tombol notifikasi ditampilkan - Sembunyikan tombol pencarian - Tombol pencarian disembunyikan - Tombol pencarian ditampilkan - - - Sembunyikan bilah kategori - Bilah kategori disembunyikan - Bilah kategori ditampilkan - - - Ubah warna pemutar mini - Warna pemutar mini sesuai dengan pemutar layar penuh - Pemutar mini menggunakan warna standar - - - Bilah navigasi - Sembunyikan atau ubah tombol bilah navigasi - - Sembunyikan Beranda - Tombol Beranda disembunyikan - Tombol Beranda ditampilkan - - Sembunyikan Sampel - Tombol Sampel disembunyikan - Tombol Sampel ditampilkan - - Sembunyikan Jelajahi - Tombol Jelajahi disembunyikan - Tombol Jelajahi ditampilkan - - Sembunyikan Pustaka - Tombol Pustaka disembunyikan - Tombol Pustaka ditampilkan - - Sembunyikan Upgrade - Tombol Upgrade disembunyikan - Tombol Upgrade ditampilkan - Sembunyikan bilah navigasi - Bilah navigasi disembunyikan - Bilah navigasi ditampilkan - Sembunyikan label tombol navigasi - Label disembunyikan - Label ditampilkan - - - Sembunyikan label \'Dapatkan Music Premium\' - Label disembunyikan - Label ditampilkan - - - Sembunyikan tombol Upgrade - Tombol disembunyikan - Tombol ditampilkan - - - - - Blokir iklan audio - Iklan audio diblokir - Iklan audio tidak diblokir - - - %s tidak tersedia, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. - %s mengembalikan kesalahan, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. - Blokir iklan video yang disematkan - Nonaktif - Proksi Luminous - Proksi PurpleAdBlock - - - Blokir iklan video - Iklan video diblokir - Iklan video tidak diblokir - - - Pesan dihapus - Tampilkan pesan yang terhapus - Jangan tampilkan pesan yang terhapus - Sembunyikan pesan yang dihapus di balik spoiler - Tampilkan pesan yang dihapus sebagai teks yang dicoret - - - Klaim Poin Saluran secara otomatis - Poin Saluran diklaim secara otomatis - Poin Saluran tidak diklaim secara otomatis - - - - Nyalakan mode debug Twitch - Mode debug Twitch diaktifkan (tidak disarankan) - Mode debug Twitch dinonaktifkan - - - Pengaturan ReVanced - Tentang - Tentang ReVanced - Pemblokiran Iklan - Setelan Pemblokiran Iklan - Obrolan - Pengaturan obrolan - Lain-lain - Pengaturan lain-lain - Pengaturan umum - Pengaturan lainnya - Iklan sisi klien - Iklan surestream di sisi server - Pencatatan debug - Pencatatan debug diaktifkan - Pencatatan debug dinonaktifkan - - + Efek samping pemalsuan + • Klien eksperimental dan dapat berhenti berfungsi kapan saja + • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah + • Menu trek audio hilang + • Tidak ada codec video AV1 + • Volume stabil tidak tersedia + • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran + + • Paksa audio asli tidak tersedia + Tampilkan di Statistik untuk nerds + Jenis klien ditampilkan di Statistik untuk nerds + Klien disembunyikan di Statistik untuk nerds + + + + + YT Musik ReVanced + Musik ReVanced + Musik + + + + Tentang + Iklan + Umum + Pemutar + Lain-lain + + + Sembunyikan iklan video + Iklan video disembunyikan + Iklan video ditampilkan + + + Aktifkan pengulangan permanen + Pengulangan permanen diaktifkan + Pengulangan permanen dinonaktifkan + + + Sembunyikan tombol transmisi + Tombol transmisi disembunyikan + Tombol transmisi ditampilkan + Sembunyikan tombol Riwayat + Tombol Riwayat disembunyikan + Tombol Riwayat ditampilkan + Sembunyikan tombol notifikasi + Tombol notifikasi disembunyikan + Tombol notifikasi ditampilkan + Sembunyikan tombol pencarian + Tombol pencarian disembunyikan + Tombol pencarian ditampilkan + + + Sembunyikan bilah kategori + Bilah kategori disembunyikan + Bilah kategori ditampilkan + + + Ubah warna pemutar mini + Warna pemutar mini sesuai dengan pemutar layar penuh + Pemutar mini menggunakan warna standar + + + Bilah navigasi + Sembunyikan atau ubah tombol bilah navigasi + + Sembunyikan Beranda + Tombol Beranda disembunyikan + Tombol Beranda ditampilkan + + Sembunyikan Sampel + Tombol Sampel disembunyikan + Tombol Sampel ditampilkan + + Sembunyikan Jelajahi + Tombol Jelajahi disembunyikan + Tombol Jelajahi ditampilkan + + Sembunyikan Pustaka + Tombol Pustaka disembunyikan + Tombol Pustaka ditampilkan + + Sembunyikan Upgrade + Tombol Upgrade disembunyikan + Tombol Upgrade ditampilkan + Sembunyikan bilah navigasi + Bilah navigasi disembunyikan + Bilah navigasi ditampilkan + Sembunyikan label tombol navigasi + Label disembunyikan + Label ditampilkan + + + Sembunyikan label \'Dapatkan Music Premium\' + Label disembunyikan + Label ditampilkan + + + Sembunyikan tombol Upgrade + Tombol disembunyikan + Tombol ditampilkan + + + + + Blokir iklan audio + Iklan audio diblokir + Iklan audio tidak diblokir + + + %s tidak tersedia, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. + %s mengembalikan kesalahan, iklan mungkin muncul. Coba ubah layanan pemblokiran iklan di pengaturan. + Blokir iklan video yang disematkan + Nonaktif + Proksi Luminous + Proksi PurpleAdBlock + + + Blokir iklan video + Iklan video diblokir + Iklan video tidak diblokir + + + Pesan dihapus + Tampilkan pesan yang terhapus + Jangan tampilkan pesan yang terhapus + Sembunyikan pesan yang dihapus di balik spoiler + Tampilkan pesan yang dihapus sebagai teks yang dicoret + + + Klaim Poin Saluran secara otomatis + Poin Saluran diklaim secara otomatis + Poin Saluran tidak diklaim secara otomatis + + + + Nyalakan mode debug Twitch + Mode debug Twitch diaktifkan (tidak disarankan) + Mode debug Twitch dinonaktifkan + + + Pengaturan ReVanced + Tentang + Tentang ReVanced + Pemblokiran Iklan + Setelan Pemblokiran Iklan + Obrolan + Pengaturan obrolan + Lain-lain + Pengaturan lain-lain + Pengaturan umum + Pengaturan lainnya + Iklan sisi klien + Iklan surestream di sisi server + Pencatatan debug + Pencatatan debug diaktifkan + Pencatatan debug dinonaktifkan + + diff --git a/patches/src/main/resources/addresources/values-is-rIS/strings.xml b/patches/src/main/resources/addresources/values-is-rIS/strings.xml index 3a40645452..6489344997 100644 --- a/patches/src/main/resources/addresources/values-is-rIS/strings.xml +++ b/patches/src/main/resources/addresources/values-is-rIS/strings.xml @@ -27,18 +27,47 @@ Second \"item\" text" + Slökkva á feitletruðum táknum + Tákn eru ekki feitletruð + Tákn eru feitletruð + GmsCore + Stillingar tengdar GmsCore + Athuga með uppfærslur fyrir GmsCore + Að athuga með uppfærslur er virkt + Slökkt er á athugun á uppfærslum + Opna GmsCore stillingar + Stillingar GmsCore + MicroG GmsCore er ekki uppsett. Settu það upp. + Þörf á aðgerð + Tókst ekki að athuga hvort MicroG GmsCore væri með uppfærslur + Ný útgáfa (%1$s) af MicroG GmsCore er fáanleg. Eins og er, ertu að nota útgáfu %2$s. + "MicroG GmsCore hefur ekki leyfi til að keyra í bakgrunni.\n\nFylgdu leiðbeiningunum „Ekki drepa appið mitt“ fyrir símann þinn og beittu leiðbeiningunum á MicroG uppsetninguna þína.\n\nÞetta er nauðsynlegt til að appið virki." + Opna vefsíðu + Hætta við + "Slökkva verður á rafhlöðubestun MicroG GmsCore til að koma í veg fyrir vandamál.\n\nAð slökkva á rafhlöðubestun fyrir MicroG mun ekki hafa neikvæð áhrif á rafhlöðunotkun.\n\nÝttu á áfram hnappinn og leyfðu breytingar á bestun." + Áfram - + + Endurræstu forritið til að nota þennan eiginleika + Skrá samskiptastaðal biðminni + Villuleitarskrár innihalda samskiptastaðal biðminni + Villuleitarskrár innihalda ekki samskiptastaðal biðminni + "Með því að virkja þessa stillingu verða skráð auka uppsetningargögn, þar á meðal texti á skjánum fyrir suma notendaviðmótshluta. + +Þetta getur hjálpað til við að auðkenna hluta þegar sérsniðnar síur eru búnar til. + +Hins vegar mun virkjun þessa einnig skrá notendagögn eins og IP tölu þína." + @@ -48,40 +77,135 @@ Second \"item\" text" - + Fela hillu fyrir verslun höfunda + Hilla fyrir verslun höfunda undir myndbandsspilaranum er falin + Hilla fyrir verslun höfunda undir myndbandsspilaranum er sýnd + Fela athugasemdahluta undir myndböndum í heimasíðu + Athugasemdahluti undir myndböndum í heimasíðu er falinn + Athugasemdahluti undir myndböndum í heimasíðu er sýndur + + Fela hnappinn „Nýjustu myndbönd“ + Hnappurinn „Nýjustu myndbönd“ er falinn + Hnappurinn „Nýjustu myndbönd“ er sýndur + + Fela niðurstöður vefleitar + Niðurstöður vefleitar eru falnar + Niðurstöður vefleitar eru sýndar + Fela hlutann „Þér gæti líkað“ + Hlutinn „Þér gæti líkað“ er falinn + Hlutinn „Þér gæti líkað“ er sýndur + This button usually appears in the video player for certain videos. --> + + Fela hnappinn „Endursýning á spjalli“ + Hnappurinn „Endursýning á spjalli“ í spilarayfirlagi er falinn + Hnappurinn „Endursýning á spjalli“ í spilarayfirlagi er sýndur + Fela myndbandsheiti + Myndbandsheiti í spilarayfirlagi er falið + Myndbandsheiti í spilarayfirlagi er sýnt + Fela „Námsframvindu“ + Hluti námsframvindu er falinn + Hluti námsframvindu er sýndur + Fela Kanna + Hlutarnir „Kanna þetta námskeið“ og „Kanna hlaðvarpið“ eru faldir + Hlutarnir „Kanna þetta námskeið“ og „Kanna hlaðvarpið“ eru sýndir + Fela „Kanna þetta námskeið“ + Hluti „Kanna þetta námskeið“ er falinn + Hluti „Kanna þetta námskeið“ er sýndur + Fela „Kanna hlaðvarpið“ + Hluti „Kanna hlaðvarpið“ er falinn + Hluti „Kanna hlaðvarpið“ er sýndur + Fela „Valda staði“ + Hluti „Valda staði“ er falinn + Hluti „Valda staði“ er sýndur + Virkja síu fyrir fellivalmynd straums + Sía fyrir fellivalmynd straums er virk + Sía fyrir fellivalmynd straums er óvirk + Sía fyrir fellivalmynd straums + Sláðu inn nöfn fellivalmynda til að sía eftir, eitt nafn á línu + Fela leiki + Leikjahlutinn er falinn + Leikjahlutinn er sýndur + Fela tónlist + Tónlistahlutinn er falinn + Tónlistahlutinn er sýndur + Fela spurningakeppni + Spurningakeppnishlutinn er falinn + Spurningakeppnishlutinn er sýndur + Virkja síu fyrir rásarflipa + Sía fyrir rásarflipa er virk + Sía fyrir rásarflipa er óvirk + Sía fyrir rásarflipa + Sláðu inn nöfn rásarflipa til að sía eftir, eitt nafn á línu + "Takmarkanir: +• Shorts hillur, rásasíður og leitarniðurstöður gætu enn sýnt fjölda áhorfa. +• Þessi eiginleiki virkar ekki með bíllíkanaformi." + "Takmarkanir: +• Shorts hillur, rásasíður og leitarniðurstöður gætu enn sýnt upphleðslutíma. +• Þessi eiginleiki virkar ekki með bíllíkanaformi." + "Heima/áskriftir/leitarniðurstöður eru síaðar til að fela efni sem passar við leitarorðasetningar + +Takmarkanir: +• Shorts er ekki hægt að fela eftir rásarnafni +• Sumir notendaviðmótshlutar gætu ekki verið faldir +• Leit eftir leitarorði gæti ekki sýnt neinar niðurstöður" - + Heilskjáauglýsingar eru falnar + Fela sprettigluggaauglýsingar spilara + Sprettigluggaauglýsingar spilara eru falnar + Sprettigluggaauglýsingar spilara eru sýndar + Borði „Skoða vörur“ í spilarayfirlagi er falinn + Borði „Skoða vörur“ í spilarayfirlagi er sýndur + Fela YouTube Premium kynningar + YouTube Premium kynningar eru falnar + YouTube Premium kynningar eru sýndar - - + + Slóð afrituð á klippiborð + Slóð með tímastimpli afrituð + Sýna hnappinn til að afrita myndbandsslóð + Hnappurinn til að afrita myndbandsslóð er sýndur. Bankaðu til að afrita myndbandsslóð. Haltu inni til að afrita með tímastimpli + Hnappurinn til að afrita myndbandsslóð er ekki sýndur + Sýna hnappinn til að afrita slóð með tímastimpli + Hnappurinn til að afrita slóð með tímastimpli er sýndur. Bankaðu til að afrita myndbandsslóð með tímastimpli. Haltu inni til að afrita án tímastimpils + Hnappurinn til að afrita slóð með tímastimpli er ekki sýndur + - + + Slökkva á sprettiglugganum „Skráðu þig inn á sjónvarp“ + Sprettiglugginn „Skráðu þig inn á sjónvarp“ er óvirkur + Sprettiglugginn „Skráðu þig inn á sjónvarp“ er virkur + - + + Virkja bank til að spóla + Bank til að spóla er virkur + Bank til að spóla er óvirkur + @@ -89,25 +213,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Fela gæti ekki virkað fyrir suma notendareikninga. - + + Flakkahnappar + Fela eða breyta flakkastikuhnappum + Fela Heim + Heimahnappur er falinn + Heimahnappur er sýndur + Fela Shorts + Shorts hnappur er falinn + Shorts hnappur er sýndur + Fela Búa til + Hnappurinn „Búa til“ er falinn + Hnappurinn „Búa til“ er sýndur + Fela áskriftir + Áskriftarhnappur er falinn + Áskriftarhnappur er sýndur + Fela tilkynningar + Tilkynningarhnappur er falinn + Tilkynningarhnappur er sýndur + Skipta um Búa til og Tilkynningar + Hnappurinn „Búa til“ er skipt út fyrir tilkynningarhnappinn + Hnappurinn „Búa til“ er ekki skipt út fyrir tilkynningarhnappinn + Ef þessi breyting tekur ekki gildi skaltu reyna að skipta yfir í ósýnilegan ham. + Fela flakkahnappamerki + Merkin eru falin + Merkin eru sýnd + Virkja þrönga flakkahnappa + Bil á milli flakkahnappa er þröngt + Bil á milli flakkahnappa er eðlilegt + Virkja hreyfimyndir í flakkastiku + Flakksbreytingar eru líflegar + Flakksbreytingar eru ekki líflegar + Slökkva á hálfgegnsæri stöðustiku + Stöðustika er ógegnsæ + Stöðustika er ógegnsæ eða hálfgegnsæ + "Takmarkanir: +• Svartur stika gæti birst efst á myndbandsspilaranum. +• Á sumum tækjum getur virkjun þessa eiginleika breytt flakkastiku kerfisins í gegnsæja." + Slökkva á ljósri hálfgegnsæri stiku + Flakkastika í ljósum ham er ógegnsæ + Flakkastika í ljósum ham er ógegnsæ eða hálfgegnsæ + Slökkva á dökkri hálfgegnsæri stiku + Flakkastika í dökkum ham er ógegnsæ + Flakkastika í dökkum ham er ógegnsæ eða hálfgegnsæ + Tækjastika + Fela eða breyta íhlutum tækjastiku + Fela hnappinn „Búa til“ + Hnappurinn „Búa til“ er falinn + Hnappurinn „Búa til“ er sýndur + Fela tilkynningarhnapp + Tilkynningarhnappur er falinn + Tilkynningarhnappur er sýndur + Fela leitarhnapp + Leitarhnappur er falinn + Leitarhnappur er sýndur. + Virkja breiða leitarstiku + Breið leitarstika er virkjuð + Breið leitarstika er óvirk @@ -126,25 +307,67 @@ Second \"item\" text" + Fela fellihnapp + Fellihnappur er falinn + Fellihnappur er sýndur + Fela heilskjárhnapp + Heilskjárhnappur er falinn + Heilskjárhnappur er sýndur + + + Fela endaskjárspjöld + Endaskjárspjöld eru falin + Endaskjárspjöld eru sýnd - + Virkja stóra spólustiku í heilskjá + Spólustika í heilskjá er stór + Spólustika í heilskjá er venjuleg + Fela Shorts á rásasíðu + Falið á rásasíðu + Sýnt á rásasíðu + Fela Shorts í myndbandslýsingu + Falið í myndbandslýsingu + Sýnt í myndbandslýsingu + Fela gervigreindarhnapp + Gervigreindarhnappur er falinn + Gervigreindarhnappur er sýndur + Fela merkið „Sjálfvirkt talsett“ + Merkið „Sjálfvirkt talsett“ er falið + Merkið „Sjálfvirkt talsett“ er sýnt + - + + Fela sjálfvirka forskoðun + Sjálfvirk forskoðun er falin + Sjálfvirk forskoðun er sýnd + + + Fela ráðlagt myndband á endaskjá + "Ráðlagt myndband á endaskjá er falið þegar sjálfvirk spilun er slökkt + +Hægt er að breyta sjálfvirkri spilun í YouTube stillingum: +Stillingar → Spilun → Spila næsta myndband sjálfvirkt" + Ráðlagt myndband á endaskjá er sýnt + - + + Fela sprettigluggaspjöld spilarans + Sprettigluggaspjöld spilarans eru falin + Sprettigluggaspjöld spilarans eru sýnd + @@ -155,10 +378,12 @@ Second \"item\" text" - - + Aðeins til notkunar í tónlistarmyndböndum. Hlutar tónlistarmyndbanda án tónlistar, sem falla ekki undir annan flokk + Ekki tókst að senda inn hluta: %s + "Ekki tókst að senda inn hluta. +Er þegar til" @@ -170,7 +395,11 @@ Second \"item\" text" - + + Óvirkur + Litur + Svart og hvítt + @@ -187,7 +416,11 @@ Second \"item\" text" - + + Slökkva á snertiviðbrögðum við snertingu og hald + Snertiviðbrögð við snertingu og hald eru óvirk + Snertiviðbrögð við snertingu og hald eru virk + @@ -200,6 +433,11 @@ Second \"item\" text" + + Fela Premium gæðavalkosti + Premium gæðavalkostir eru falnir + Premium gæðavalkostir eru sýndir + @@ -207,7 +445,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 3c41ba8e56..d3ceb8d044 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Mostra la cronologia di ricerca delle impostazioni La cronologia di ricerca delle impostazioni è visualizzata La cronologia di ricerca delle impostazioni non viene mostrata + Disabilita icone in grassetto + Le icone non sono in grassetto + Le icone sono in grassetto Mostra le icone delle impostazioni di ReVanced Le icone delle impostazioni vengono mostrate Le icone delle impostazioni non vengono mostrate @@ -101,23 +104,31 @@ Per tradurre nuove lingue o migliorare le traduzioni esistenti, visita translate and changes made here must also be made there. --> - Impostazioni di GmsCore - Impostazioni per GmsCore + GmsCore + Impostazioni relative a GmsCore + Verifica aggiornamenti per GmsCore + La verifica degli aggiornamenti è abilitata + Il controllo degli aggiornamenti è disabilitato + Apri Impostazioni di GmsCore + Impostazioni di GmsCore - MicroG GmsCore non è installato. Installalo. - Azione necessaria - "MicroG GmsCore non ha l'autorizzazione per essere eseguito in background. + MicroG GmsCore non è installato. Installalo. + Azione necessaria + Impossibile verificare la presenza di aggiornamenti di MicroG GmsCore + È disponibile una nuova versione (%1$s) di MicroG GmsCore. Attualmente, stai utilizzando la versione %2$s. + "MicroG GmsCore non ha l'autorizzazione per essere eseguito in background. Segui la guida \"Don't kill my app\" per il tuo telefono e applica le istruzioni all'installazione di MicroG. Questo è necessario per il funzionamento dell'app." - Apri sito web - "Le ottimizzazioni della batteria di MicroG GmsCore devono essere disabilitate per evitare problemi. + Apri sito web + Annulla + "Le ottimizzazioni della batteria di MicroG GmsCore devono essere disabilitate per evitare problemi. Disabilitare le ottimizzazioni della batteria per MicroG non influirà negativamente sull'utilizzo della batteria. Tocca il pulsante Continua e consenti le modifiche di ottimizzazione." - Continua + Continua Falsifica i flussi video @@ -173,10 +184,11 @@ Non sarai notificato di eventi imprevisti." Flag salvati Flag ripristinati Flag copiati negli appunti - Buffer di protocollo per log - I log di debug includono proto buffer - I log di debug non includono proto buffer - "L'abilitazione di questa impostazione registrerà dati di layout aggiuntivi, incluso il testo su schermo per alcuni componenti dell'interfaccia utente. + Riavvia l\'app per usare questa funzione + Buffer di protocollo per log + I log di debug includono proto buffer + I log di debug non includono proto buffer + "L'abilitazione di questa impostazione registrerà dati di layout aggiuntivi, incluso il testo su schermo per alcuni componenti dell'interfaccia utente. Questo può aiutare a identificare i componenti durante la creazione di filtri personalizzati. @@ -226,6 +238,9 @@ Tuttavia, l'abilitazione di questa opzione registrerà anche alcuni dati dell'ut La riproduzione in background degli Shorts è abilitata + Nascondi sezione negozio del creatore + La sezione del negozio del creator sotto il riproduttore video è nascosta + La mensola del negozio del creatore sotto il riproduttore video è mostrata Nascondi le schede degli album Le schede album sono nascoste Le schede degli album sono visibili @@ -235,6 +250,9 @@ Tuttavia, l'abilitazione di questa opzione registrerà anche alcuni dati dell'ut Nascondi la sezione chip La sezione dei chip è nascosta La sezione dei chip è visibile + Nascondi la sezione commenti sotto i video nel feed Home + La sezione commenti sotto i video nel feed Home è nascosta + La sezione commenti sotto i video nel feed Home è visibile Nascondi i post della community I post della community sono nascosti I post della community sono visibili @@ -262,14 +280,19 @@ Tuttavia, l'abilitazione di questa opzione registrerà anche alcuni dati dell'ut Nascondi i post più recenti I post più recenti sono nascosti I post più recenti sono visibili + + Nascondi il pulsante \'Ultimi video\' + Il pulsante Ultimi video è nascosto + Il pulsante Ultimi video è visibile Nascondi le playlist miste Le playlist miste sono nascoste Le playlist miste sono visibili Nascondi la sezione film La sezione film è nascosta La sezione film è visibile - + Nascondi il pulsante \'Avvisami\' Il pulsante Avvisami è nascosto Il pulsante Avvisami è mostrato @@ -294,13 +317,16 @@ Tuttavia, l'abilitazione di questa opzione registrerà anche alcuni dati dell'ut Nascondi il separatore visivo Il separatore visivo è nascosto Il separatore visivo è mostrato + Nascondi i risultati della ricerca web + I risultati della ricerca web sono nascosti + I risultati della ricerca web sono visibili + Nascondi la sezione \'Potrebbero piacerti\' + La sezione \'Potrebbero piacerti\' è nascosta + La sezione \'Potrebbero piacerti\' è visibile Nascondi Doodles di YouTube L\'animazione YouTube Doodles sul logo è nascosta L\'animazione di YouTube Doodles sul logo è mostrata - "I Doodle di YouTube vengono visualizzati alcuni giorni all'anno. - -Se al momento un Doodle è visibile nella tua regione e questa impostazione nascondi è attiva, la barra dei filtri sotto la barra di ricerca verrà anch'essa nascosta." Nascondi barra del canale La barra del canale è nascosta La barra dei canali è visibile @@ -317,10 +343,15 @@ Se al momento un Doodle è visibile nella tua regione e questa impostazione nasc I pannelli informativi sono nascosti I pannelli informativi sono visibili + This button usually appears in the video player for certain videos. --> Nascondi il pulsante Abbonati Il pulsante Unisciti è nascosto Il pulsante Unisciti è mostrato + + Nascondi il pulsante \'Replay chat dal vivo\' + Il pulsante Replay chat dal vivo nell\'overlay del player è nascosto + Il pulsante Replay chat dal vivo nell\'overlay del player è visibile Nascondi i pannelli medici I pannelli medici sono nascosti I pannelli medici sono visibili @@ -336,6 +367,9 @@ Se al momento un Doodle è visibile nella tua regione e questa impostazione nasc Nascondi le reazioni a tempo Le reazioni a tempo sono nascoste Le reazioni a tempo sono visibili + Nascondi il titolo del video + Il titolo del video nell\'overlay del player è nascosto + Il titolo del video nell\'overlay del player è visibile Nascondi \"Riepilogo video generato dall\'AI\" La sezione del riepilogo video generato dall\'IA è nascosta Sezione di riepilogo video generata dall\'IA mostrata @@ -348,33 +382,62 @@ Se al momento un Doodle è visibile nella tua regione e questa impostazione nasc Nascondi Capitoli La sezione Capitoli è nascosta La sezione Capitoli è visibile - Nascondi \"Come è stato realizzato questo contenuto\" - La sezione Come è stato realizzato questo contenuto è nascosta - La sezione Come è stato realizzato questo contenuto è visibile - Nascondi i punti Hype - I punti Hype sono nascosti - I punti Hype sono mostrati + Nascondi \'Avanzamento corso\' + La sezione Avanzamento corso è nascosta + La sezione Avanzamento corso è visibile + Nascondi Esplora + Le sezioni Esplora questo corso ed Esplora il podcast sono nascoste + Le sezioni Esplora questo corso ed Esplora il podcast sono visibili + Nascondi \'Esplora questo corso\' + La sezione Esplora questo corso è nascosta + La sezione Esplora questo corso è visibile + Nascondi \"Esplora il podcast\" + La sezione Esplora il podcast è nascosta + La sezione Esplora il podcast è visibile Nascondi \"Esplora il podcast\" La sezione Esplora il podcast è nascosta La sezione Esplora il podcast è visibile Nascondi i link in primo piano La sezione dei link in evidenza è nascosta La sezione dei link in evidenza è mostrata + Nascondi \'Luoghi in primo piano\' + La sezione Luoghi in primo piano è nascosta + La sezione Luoghi in primo piano è visibile Nascondi i video in evidenza La sezione dei video in evidenza è nascosta La sezione dei video in evidenza è mostrata + Attiva il filtro del menu a tendina del feed + Il filtro del menu a tendina del feed è attivo + Il filtro del menu a tendina del feed è disattivo + Filtro del menu a tendina del feed + Inserisci i nomi del menu a tendina da filtrare, uno per riga + Nascondi Gaming + La sezione Gaming è nascosta + La sezione Gaming è visibile + Nascondi \"Come è stato realizzato questo contenuto\" + La sezione Come è stato realizzato questo contenuto è nascosta + La sezione Come è stato realizzato questo contenuto è visibile + Nascondi i punti Hype + I punti Hype sono nascosti + I punti Hype sono mostrati Nascondi le schede informative La sezione Schede Informative è nascosta La sezione Schede Informative è visibile Nascondi \"Concetti chiave\" La sezione Concetti chiave è nascosta La sezione Concetti chiave è visibile + Nascondi Musica + La sezione Musica è nascosta + La sezione Musica è visibile Nascondi il pulsante Iscriviti Il pulsante Iscriviti è nascosto Il pulsante Iscriviti è mostrato Nascondi Trascrizione La sezione Trascrizione è nascosta La sezione Trascrizione è visibile + Nascondi Quiz + La sezione Quiz è nascosta + La sezione Quiz è visibile Descrizione del video Mostra o nascondi i componenti della descrizione del video Barra dei filtri @@ -393,6 +456,11 @@ Se al momento un Doodle è visibile nella tua regione e questa impostazione nasc Mostrato nella cronologia visualizzazioni Pagina canale Nascondi o mostra i componenti della pagina del canale + Attiva filtro schede canale + Il filtro schede canale è attivo + Il filtro schede canale è disattivo + Filtro schede canale + Inserisci i nomi delle schede canale da filtrare, uno per riga Nascondi il pulsante Community Il pulsante Community è nascosto @@ -457,7 +525,7 @@ Se al momento un Doodle è visibile nella tua regione e questa impostazione nasc "Limitazioni: • Le sezioni Shorts, le pagine dei canali e i risultati di ricerca potrebbero mostrare comunque il numero di visualizzazioni -• Questa funzionalità non è compatibile con i fattori di forma automobilistici" +• Questa funzionalità non è compatibile con i fattori di forma automobilistici." Nascondi l\'ora di caricamento L\'ora di caricamento è nascosta nel feed e nei risultati di ricerca L\'ora di caricamento è mostrata nel feed e nei risultati di ricerca @@ -502,19 +570,12 @@ Note: La parola chiave nasconderà tutti i video: %s - Nascondi sezione negozio del creatore - La sezione del negozio del creator sotto il riproduttore video è nascosta - La mensola del negozio del creatore sotto il riproduttore video è mostrata Nascondi banner del negozio della schermata finale Il banner del negozio nella schermata finale è nascosto Il banner del negozio nella schermata finale è mostrato Nascondi le pubblicità a schermo intero - "Le pubblicità a schermo intero sono nascoste - -Questa funzione è disponibile solo per i dispositivi più vecchi" + Le pubblicità a schermo intero sono nascoste Le pubblicità a schermo intero sono visibili - - Nascondi gli annunci a schermo intero funziona solo con dispositivi più vecchi Nascondi pubblicità generali Le pubblicità generali sono nascoste Le pubblicità generali sono visibili @@ -524,6 +585,9 @@ Questa funzione è disponibile solo per i dispositivi più vecchi" Nascondi l\'etichetta della promozione a pagamento L\'etichetta della promozione a pagamento è nascosta L\'etichetta della promozione a pagamento è visibile + Nascondi annunci popup del player + Gli annunci popup del player sono nascosti + Gli annunci popup del player sono visibili Nascondi le schede autopromozionali Le schede autopromozionali sono nascoste Le schede autopromozionali sono visibili @@ -531,23 +595,18 @@ Questa funzione è disponibile solo per i dispositivi più vecchi" I link per lo shopping nella descrizione del video sono nascosti I link per lo shopping nella descrizione del video sono mostrati Nascondi il banner \'Visualizza prodotti\' - Il banner Visualizza prodotti nell\'overlay del video è nascosto - Il banner Visualizza prodotti nell\'overlay del video è mostrato - Nascondi i risultati della ricerca web - I risultati della ricerca web sono nascosti - I risultati della ricerca web sono visibili - - - Nascondi la promozione di YouTube Premium - Le promozioni di YouTube Premium sotto il video player sono nascoste - Le promozioni di YouTube Premium sotto il lettore video sono mostrate + Il banner Visualizza prodotti nel player overlay è nascosto + Il banner Visualizza prodotti nel player overlay è mostrato + Nascondi la promozione di YouTube Premium + Le promozioni di YouTube Premium sono nascoste + Le promozioni di YouTube Premium sono mostrate Nascondi le pubblicità del video Le pubblicità del video sono nascoste Le pubblicità del video sono visibili - + URL copiato negli appunti URL con timestamp copiato Mostra il pulsante Copia URL Video @@ -563,10 +622,10 @@ Questa funzione è disponibile solo per i dispositivi più vecchi" La finestra di dialogo verrà mostrata Questo non aggira la restrizione di età. Lo accetta solo automaticamente. - - Disabilita il popup \'Accedi alla TV\' - Il popup \"Accedi alla TV\" è disabilitato - Il popup \"Accedi alla TV\" è abilitato + + Disabilita il popup \'Accedi alla TV\' + Il popup \"Accedi alla TV\" è disabilitato + Il popup \"Accedi alla TV\" è abilitato Disabilita salto capitolo con doppio tocco @@ -599,10 +658,10 @@ Verifica che il nome del pacchetto sia corretto e che l'app sia installata"Il gesto è disabilitato Il gesto è abilitato - - Abilita tocco per cercare - Tocco per cercare è abilitato - Tocco per cercare è disabilitato + + Abilita tocco per cercare + Tocco per cercare è abilitato + Tocco per cercare è disabilitato Attiva il gesto per modificare la luminosità @@ -683,7 +742,7 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Il pulsante Commenti è nascosto Il pulsante Commenti è mostrato + This button usually appears on live streamed videos. --> Nascondi Segnala Il pulsante Segnala è nascosto Il pulsante Segnala è visibile @@ -696,7 +755,7 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Il pulsante Scarica è nascosto Il pulsante Scarica è visibile + This button usually appears on videos uploaded by the logged-in user. --> Nascondi Hype Il pulsante Hype è nascosto Pulsante Hype è mostrato @@ -709,7 +768,7 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Grazie pulsante è nascosto Il pulsante Grazie è visibile + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Nascondi richiesta Il pulsante Richiedi è nascosto Il pulsante Richiedi è visibile @@ -717,6 +776,7 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Nascondi Clip Il pulsante Clip è nascosto Il pulsante Clip è visibile + L\'occultamento potrebbe non funzionare per alcuni account utente. Nascondi Acquisti Il pulsante Acquisti è nascosto @@ -726,13 +786,13 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Il pulsante Salva è nascosto Il pulsante Salva è mostrato - + Pulsanti di navigazione - Nascondi o cambia i pulsanti nella barra di navigazione + Nascondi o modifica i pulsanti della barra di navigazione Nascondi Home Il pulsante Home è nascosto - Il pulsante Home è visibile + Il pulsante Home è mostrato Nascondi Shorts Il pulsante Shorts è nascosto @@ -750,26 +810,44 @@ Regola il volume scorrendo verticalmente sul lato destro dello schermo" Il pulsante Notifiche è visibile Cambia Crea con le notifiche - "Il pulsante Crea viene sostituito con il pulsante Notifiche - -Nota: Abilitare questa opzione nasconde anche le pubblicità video" + Il pulsante Crea è scambiato con il pulsante Notifiche Il pulsante Crea non è cambiato con il pulsante Notifiche - "La disattivazione di questa impostazione disabiliterà anche il blocco degli annunci per gli Shorts. - -Se la modifica di questa impostazione non ha effetto, prova a passare alla modalità di navigazione in incognito." - Nascondi etichette dei pulsanti di navigazione + Se la modifica di questa impostazione non ha effetto, prova a passare alla modalità Incognito. + Nascondi le etichette dei pulsanti di navigazione Le etichette sono nascoste - Le etichette sono visibili + Le etichette sono mostrate + Abilita pulsanti di navigazione stretti + Lo spazio tra i pulsanti di navigazione è stretto + Lo spazio tra i pulsanti di navigazione è normale + Abilita animazioni barra di navigazione + Le transizioni di navigazione sono animate + Le transizioni di navigazione non sono animate Disabilita la barra di stato traslucida La barra di stato è opaca La barra di stato è opaca o traslucida - Su alcuni dispositivi, l\'abilitazione di questa funzione può rendere trasparente la barra di navigazione del sistema. + "Limitazioni: +• Potrebbe apparire una barra nera nella parte superiore del player video. +• Su alcuni dispositivi, l'attivazione di questa funzione può modificare la barra di navigazione del sistema in trasparente." Disabilita la barra traslucida chiara La barra di navigazione in modalità chiara è opaca La barra di navigazione in modalità chiara è opaca o traslucida Disabilita la barra traslucida scura La barra di navigazione in modalità scura è opaca La barra di navigazione in modalità scura è opaca o traslucida + Barra degli strumenti + Nascondi o modifica i componenti della barra degli strumenti + Nascondi pulsante Crea + Il pulsante Crea è nascosto + Il pulsante Crea è visibile + Nascondi pulsante Notifiche + Il pulsante Notifiche è nascosto + Il pulsante Notifiche è visibile + Nascondi pulsante Cerca + Il pulsante di ricerca è nascosto + Il pulsante di ricerca è mostrato. + Attiva la barra di ricerca estesa + La barra di ricerca estesa è abilitata + La barra di ricerca estesa è disabilitata Menù a comparsa @@ -844,6 +922,12 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" Nascondi il pulsante Trasmetti Il pulsante Trasmetti è nascosto Il pulsante Trasmetti è visibile + Nascondi pulsante Riduci a icona + Il pulsante Riduci a icona è nascosto + Il pulsante Riduci a icona è visibile + Nascondi pulsante Schermo intero + Il pulsante Schermo intero è nascosto + Il pulsante Schermo intero è visibile Nascondi lo sfondo dei controlli del player Lo sfondo dei controlli del player è nascosto Lo sfondo dei controlli del player è mostrato @@ -852,9 +936,9 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" I pulsanti sono visibili - Nascondi le schede della schermata finale - Le schede della schermata finale sono nascoste - Le schede della schermata finale sono visibili + Nascondi le schede della schermata finale + Le schede della schermata finale sono nascoste + Le schede della schermata finale sono visibili Disattiva la modalità Ambient a schermo intero @@ -879,10 +963,16 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" Nascondi barra di ricerca delle miniature video La barra di ricerca delle miniature video è nascosta La barra di ricerca delle miniature video è mostrata + Abilita barra di ricerca grande a schermo intero + La barra di ricerca a schermo intero è di grandi dimensioni + La barra di ricerca a schermo intero è di dimensioni normali Player Shorts Nascondi o mostra i componenti del lettore Shorts + Nascondi Shorts nella pagina del canale + Nascosto nella pagina del canale + Visualizzato nella pagina del canale Nascondi Shorts nel feed Home Nascosto nel feed Home e nei video correlati @@ -894,9 +984,18 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" Nascondi Shorts nel feed Iscrizioni Nascosto nel feed Iscrizioni Mostrato nel feed Iscrizioni + Nascondi Shorts nella descrizione del video + Nascosto nella descrizione del video + Visualizzato nella descrizione del video Nascondi Shorts nella cronologia Nascosti nella cronologia di visualizzazione Mostrato nella cronologia + Nascondi pulsante AI + Il pulsante AI è nascosto + Il pulsante AI è visibile + Nascondi l\'etichetta \'Doppiato automaticamente\' + L\'etichetta doppiata automaticamente è nascosta + L\'etichetta doppiata automaticamente è mostrata Nascondi l\'etichetta \'Doppiato automaticamente\' L\'etichetta doppiata automaticamente è nascosta L\'etichetta doppiata automaticamente è mostrata @@ -958,6 +1057,7 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" Nascondi il pulsante \'Usa questo modello\' Il pulsante \"Usa questo modello\" è nascosto Il pulsante \"Usa questo modello\" è mostrato + Nascondi animazione fontana Mi piace L\'animazione della fontana di Mi Piace è nascosta L\'animazione della fontana di Mi Piace è visibile @@ -1000,7 +1100,12 @@ Per mostrare il menu della traccia audio, cambia \"Maschera flussi video\" in \" La barra di navigazione è nascosta La barra di navigazione è visibile - + + Nascondi anteprima riproduzione automatica + L\'anteprima riproduzione automatica è nascosta + L\'anteprima riproduzione automatica è visibile + + Nascondi video suggerito nella schermata finale "Il video suggerito nella schermata finale è nascosto quando l'autoplay è disattivato @@ -1019,9 +1124,9 @@ Impostazioni → Riproduzione → Riproduzione automatica video successivo"Il timestamp è visibile - Nascondi i pannelli popup del player - I pannelli popup del player sono nascosti - I pannelli popup del player sono visibili + Nascondi i pannelli popup del player + I pannelli popup del player sono nascosti + I pannelli popup del player sono visibili Esci dalla modalità schermo intero al termine del video @@ -1091,26 +1196,6 @@ Limitazione: i \"Non mi piace\" potrebbero non apparire in modalità incognito"< Limite di velocità client rilevato %d volte %d millisecondi - - Attiva la barra di ricerca estesa - La barra di ricerca estesa è abilitata - La barra di ricerca estesa è disabilitata - - - Abilita miniature di alta qualità - Le miniature della barra di avanzamento sono di alta qualità - Le miniature della barra di avanzamento sono di media qualità - Le miniature della barra di ricerca a schermo intero sono di alta qualità - Le miniature della barra di ricerca a schermo intero sono di media qualità - "Questo ripristinerà anche le miniature sulle dirette che non hanno miniature della barra di avanzamento. - -Le miniature della barra di avanzamento utilizzeranno la stessa qualità del video corrente. - -Questa funzione funziona meglio con una qualità video di 720p o inferiore e quando si utilizza una connessione Internet molto veloce." - Ripristina vecchie miniature della barra di avanzamento - Le miniature della barra di avanzamento appariranno sopra la barra di avanzamento - Le miniature della barra di avanzamento appariranno a schermo intero - SponsorBlock Abilita SponsorBlock @@ -1351,8 +1436,6 @@ Se in seguito verrà disattivato, si consiglia di cancellare i dati dell'app per Target della versione dell\'app desiderata 20.13.41 - Ripristina la barra delle azioni video non compressa 20.05.46 - Ripristina la funzionalità della trascrizione - 19.35.36 - Ripristinare le vecchie icone del player Shorts - 19.01.34 - Ripristina le vecchie icone di navigazione Cambia pagina iniziale @@ -1463,8 +1546,9 @@ Trascina per espandere o chiudere" La schermata di caricamento avrà uno sfondo col gradiente La schermata di caricamento avrà uno sfondo a tinta unita Stile schermata iniziale - Colore - Bianco e nero + Disattivato + Colore + Bianco e nero Abilita colore personalizzato della barra di avanzamento Il colore personalizzato della barra di avanzamento è visibile Il colore originale della barra di avanzamento è visibile @@ -1580,6 +1664,9 @@ Abilitare questa opzione può sbloccare qualità video più elevate" Disabilita l\'aptica di annullamento della ricerca L\'aptica di annullamento della ricerca è disabilitata L\'aptica di annullamento della ricerca è abilitata + Disabilita aptica tocco prolungato + L\'aptica tocco prolungato è disabilitata + L\'aptica tocco prolungato è abilitata Disabilita zoom aptico Lo zoom aptico è disabilitato Lo zoom aptico è abilitato @@ -1675,6 +1762,11 @@ Limitazioni: Viene mostrato il menu avanzato della qualità video Il menu avanzato della qualità video non viene mostrato + + Nascondi opzioni qualità Premium + Le opzioni qualità Premium sono nascoste + Le opzioni qualità Premium sono visibili + Abilita scorri per avanzare Scorri per avanzare è abilitato @@ -1710,6 +1802,7 @@ La riproduzione video con AV1 potrebbe rallentare o perdere fotogrammi."Music + Informazioni Annunci Generale diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index 3684eb16e7..b2dccc45e7 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" הצג הגדרות היסטוריית חיפוש הגדרות היסטוריית חיפוש מוצגות הגדרות היסטוריית חיפוש אינן מוצגות + בטל סמלים מודגשים + סמלים אינם מודגשים + סמלים מודגשים הצג סמלי הגדרות ReVanced סמלי ההגדרות מוצגים סמלי ההגדרות אינם מוצגים @@ -99,23 +102,31 @@ Second \"item\" text" and changes made here must also be made there. --> - הגדרות GmsCore - הגדרות עבור GmsCore + GmsCore + הגדרות הקשורות ל-GmsCore + בדיקת עדכונים עבור GmsCore + בדיקת עדכונים מופעלת + בדיקת עדכונים מושבתת + פתח את הגדרות GmsCore + הגדרות של GmsCore - היישום MicroG GmsCore אינו מותקן. התקן אותו. - דרושה פעולה - "ל-MicroG GmsCore אין הרשאה לרוץ ברקע. + היישום MicroG GmsCore אינו מותקן. התקן אותו. + דרושה פעולה + אירעה שגיאה בבדיקת עדכונים עבור MicroG GmsCore + גרסה חדשה (%1$s) של MicroG GmsCore זמינה. כרגע, אתה משתמש בגרסה %2$s. + "ל-MicroG GmsCore אין הרשאה לרוץ ברקע. עקוב אחר המדריך \"Don't kill my app\" עבור הטלפון שלך, והחל את ההוראות על התקנת ה-MicroG שלך. זה נדרש כדי שהיישום יעבוד." - פתח אתר - "מיטובי הסוללה של MicroG GmsCore חייבים להיות מושבתים כדי למנוע בעיות. + פתח אתר + ביטול + "מיטובי הסוללה של MicroG GmsCore חייבים להיות מושבתים כדי למנוע בעיות. השבתת מיטובי הסוללה עבור MicroG לא תשפיע לרעה על השימוש בסוללה. הקש על הלחצן 'המשך' ואפשר שינויי מיטוב." - המשך + המשך זיוף זרמי וידאו @@ -169,10 +180,11 @@ Second \"item\" text" הדגלים נשמרו הדגלים אופסו הדגלים הועתקו ללוח - רשום פרוטוקול חוצץ - יומני איתור באגים כוללים פרוטוקול חוצץ - יומני איתור באגים אינם כוללים פרוטוקול חוצץ - "הפעלת הגדרה זו תתעד נתוני פריסה נוספים, כולל טקסט שעל המסך עבור רכיבי ממשק משתמש מסוימים. + הפעל מחדש את האפליקציה כדי להשתמש בתכונה זו + רשום פרוטוקול חוצץ + יומני איתור באגים כוללים פרוטוקול חוצץ + יומני איתור באגים אינם כוללים פרוטוקול חוצץ + "הפעלת הגדרה זו תתעד נתוני פריסה נוספים, כולל טקסט שעל המסך עבור רכיבי ממשק משתמש מסוימים. זה יכול לעזור לזהות רכיבים בעת יצירת מסננים מותאמים אישית. @@ -220,6 +232,9 @@ Second \"item\" text" הפעלה ברקע של Shorts מופעלת + הסתר מדף חנות היוצר + מדף חנות היוצר מתחת לנגן הוידאו מוסתר + מדף חנות היוצר מתחת לנגן הוידאו מוצג הסתר כרטיסי אלבום כרטיסי אלבום מוסתרים כרטיסי אלבום מוצגים @@ -229,6 +244,9 @@ Second \"item\" text" הסתר מדף צ\'יפים מדף צ\'יפים מוסתר מדף צ\'יפים מוצג + הסתר מדור תגובות מתחת לסרטונים בפיד הבית + מדור התגובות מתחת לסרטונים בפיד הבית מוסתר + מדור התגובות מתחת לסרטונים בפיד הבית מוצג הסתר פוסטים קהילתיים פוסטים קהילתיים מוסתרים פוסטים קהילתיים מוצגים @@ -256,14 +274,19 @@ Second \"item\" text" הסתר פוסטים אחרונים הפוסטים האחרונים מוסתרים הפוסטים האחרונים מוצגים + + הסתר לחצן \'סרטונים אחרונים\' + לחצן \'סרטונים אחרונים\' מוסתר + לחצן \'סרטונים אחרונים\' מוצג הסתר פלייליסטים של מיקס פלייליסטים של מיקס מוסתרים פלייליסטים של מיקס מוצגים הסתר את מדור הסרטים מדור הסרטים מוסתר מדור הסרטים מוצג - + הסתר לחצן \'אני רוצה לקבל התראה\' הלחצן \'הודע לי\' מוסתר הלחצן \'הודע לי\' מוצג @@ -288,13 +311,16 @@ Second \"item\" text" הסתר מפריד חזותי המפריד החזותי מוסתר המפריד החזותי מוצג + הסתר תוצאות חיפוש באינטרנט + תוצאות חיפוש באינטרנט מוסתרות + תוצאות חיפוש באינטרנט מוצגות + הסתר מדור \'ייתכן שתאהב\' + מדור \'ייתכן שתאהב\' מוסתר + מדור \'ייתכן שתאהב\' מוצג הסתר YouTube Doodles הנפשת YouTube Doodles על הלוגו מוסתרת הנפשת YouTube Doodles על הלוגו מוצגת - "שרבוטים (Doodles) של YouTube מוצגים למשך כמה ימים בכל שנה. - -אם Doodle מוצג כרגע באזור שלך והגדרת ההסתרה הזו מופעלת, אז גם סרגל הסינון שמתחת לסרגל החיפוש יוסתר." הסתר סרגל ערוץ סרגל הערוץ מוסתר סרגל הערוץ מוצג @@ -311,10 +337,15 @@ Second \"item\" text" לוחות המידע מוסתרים לוחות המידע מוצגים + This button usually appears in the video player for certain videos. --> הסתר לחצן להצטרפות לחצן הצטרפות מוסתר לחצן הצטרפות מוצג + + הסתר לחצן \'הפעלה חוזרת של צ\'אט חי\' + לחצן הפעלה חוזרת של צ\'אט חי בשכבת-על של הנגן מוסתר + לחצן הפעלה חוזרת של צ\'אט חי בשכבת-על של הנגן מוצג הסתר לוחות רפואיים לוחות רפואיים מוסתרים לוחות רפואיים מוצגים @@ -330,6 +361,9 @@ Second \"item\" text" הסתר תגובות באמוג\'י מתוזמנות תגובות באמוג\'י מתוזמנות מוסתרות תגובות באמוג\'י מתוזמנות מוצגות + הסתר כותרת סרטון + כותרת הסרטון בשכבת-על של הנגן מוסתרת + כותרת הסרטון בשכבת-על של הנגן מוצגת הסתר את \'סיכום הווידאו שנוצר על ידי בינה מלאכותית\' קטע סיכום סרטון הנוצר על ידי AI מוסתר קטע סיכום סרטון הנוצר על ידי AI מוצג @@ -342,33 +376,62 @@ Second \"item\" text" הסתר פרקים מדור הפרקים מוסתר מדור הפרקים מוצג - הסתר את \'איך התוכן הזה נוצר\' - מדור \'איך התוכן הזה נוצר\' מוסתר - מדור \'איך התוכן הזה נוצר\' מוצג - הסתר נקודות הייפ - נקודות הייפ מוסתרות - נקודות הייפ מוצגות + הסתר \'התקדמות קורס\' + מדור \'התקדמות קורס\' מוסתר + מדור \'התקדמות קורס\' מוצג + הסתר גלו + מדור \'גלה את הקורס הזה\' ומדור \'גלה את הפודקאסט\' מוסתרים + מדור \'גלה את הקורס הזה\' ומדור \'גלה את הפודקאסט\' מוצגים + הסתר \'גלה את הקורס הזה\' + מדור \'גלה את הקורס הזה\' מוסתר + מדור \'גלה את הקורס הזה\' מוצג + הסתר את \'גלה את הפודקאסט\' + מדור \'גלה את הפודקאסט\' מוסתר + מדור \'גלה את הפודקאסט\' מוצג הסתר את \'גלה את הפודקאסט\' מדור \'גלה את הפודקאסט\' מוסתר מדור \'גלה את הפודקאסט\' מוצג הסתר קישורים מומלצים קטע קישורים מוצגים מוסתר קטע קישורים מוצגים מוצג + הסתר \'מקומות מומלצים\' + מדור \'מקומות מומלצים\' מוסתר + מדור \'מקומות מומלצים\' מוצג הסתר סרטונים מוצגים קטע סרטונים מוצגים מוסתר קטע סרטונים מוצגים מוצג + הפעל מסנן תפריט נשלף של פיד + מסנן תפריט נשלף של פיד מופעל + מסנן תפריט נשלף של פיד מושבת + מסנן תפריט נשלף של פיד + הזן את שמות התפריטים הנשלפים לסנן לפיהם, אחד בכל שורה + הסתר משחקים + מדור משחקים מוסתר + מדור משחקים מוצג + הסתר את \'איך התוכן הזה נוצר\' + מדור \'איך התוכן הזה נוצר\' מוסתר + מדור \'איך התוכן הזה נוצר\' מוצג + הסתר נקודות הייפ + נקודות הייפ מוסתרות + נקודות הייפ מוצגות הסתר כרטיסי מידע מדור כרטיסי המידע מוסתר מדור כרטיסי המידע מוצג הסתר \'מושגי מפתח\' מדור מושגי מפתח מוסתר מדור מושגי מפתח מוצג + הסתר מוזיקה + מדור מוזיקה מוסתר + מדור מוזיקה מוצג הסתר לחצן \'הירשם\' לחצן \'הירשם\' מוסתר לחצן \'הירשם\' מוצג הסתר תמליל מדור התמליל מוסתר מדור התמליל מוצג + הסתר חידונים + מדור חידונים מוסתר + מדור חידונים מוצג תיאור סרטון הסתר או הצג רכיבי תיאור סרטון סרגל סינון @@ -387,6 +450,11 @@ Second \"item\" text" מוצג בהיסטוריית הצפייה דף ערוץ הסתר או הצג רכיבי דף ערוץ + הפעל מסנן לשוניות ערוץ + מסנן לשוניות ערוץ מופעל + מסנן לשוניות ערוץ מושבת + מסנן לשוניות ערוץ + הזן את שמות לשוניות הערוץ לסנן לפיהם, אחד בכל שורה הסתר לחצן קהילה הלחצן \'קהילה\' מוסתר @@ -450,15 +518,15 @@ Second \"item\" text" ספירת הצפיות מוצגת בפיד ובתוצאות החיפוש "מגבלות: -• מדפי Shorts, דפי ערוצים ותוצאות חיפוש עשויים עדיין להציג ספירות צפיות -• תכונה זו אינה פועלת עם גורם צורה לרכב" +• מדפי Shorts, דפי ערוצים ותוצאות חיפוש עשויים עדיין להציג ספירות צפיות. +• תכונה זו אינה פועלת עם גורם צורה לרכב." הסתר זמן העלאה זמן ההעלאה מוסתר בפיד ובעמודי תוצאות חיפוש זמן ההעלאה מוצג בפיד ובעמודי תוצאות חיפוש - "הגבלות: -• מדפי Shorts, דפי ערוץ ותוצאות חיפוש עדיין עשויים להציג זמני העלאה -• תכונה זו אינה פועלת עם גורם צורה לרכב" + "מגבלות: +• מדפי Shorts, דפי ערוצים ותוצאות חיפוש עדיין עשויים להציג זמני העלאה. +• תכונה זו אינה פועלת עם גורם צורה לרכב." הסתר תוכן מילiת מפתח הסתר סרטוני פיד וחיפוש באמצעות מסנני מילות מפתח הסתר סרטוני בית לפי מילות מפתח @@ -481,7 +549,7 @@ Second \"item\" text" אודות סינון מילות מפתח "תוצאות דף הבית/מינויים/חיפוש מסוננות כדי להסתיר תוכן שתואם ביטויי מילות מפתח -מגבלות +מגבלות: • סרטוני Shorts אינם ניתנים להסתרה לפי שם ערוץ • ייתכן שחלק מרכיבי ממשק המשתמש לא יוסתרו • חיפוש אחר מילת מפתח עשוי שלא להציג תוצאות" @@ -496,19 +564,12 @@ Second \"item\" text" מילת מפתח תסתיר את כל הסרטונים: %s - הסתר מדף חנות היוצר - מדף חנות היוצר מתחת לנגן הוידאו מוסתר - מדף חנות היוצר מתחת לנגן הוידאו מוצג הסתר כרזת חנות של מסך סיום באנר החנות של מסך סיום מוסתר באנר החנות של מסך הסיום מוצג הסתר מודעות מסך מלא - "מודעות במסך מלא מוסתרות - -תכונה זו זמינה רק עבור מכשירים ישנים יותר" + מודעות מסך מלא מוסתרות מודעות מסך מלא מוצגות - - הסתר מודעות מסך מלא עובד רק עם מכשירים ישנים יותר הסתר מודעות כלליות מודעות כלליות מוסתרות מודעות כלליות מוצגות @@ -518,6 +579,9 @@ Second \"item\" text" הסתר תווית קידום מכירות בתשלום תווית קידום מכירות בתשלום מוסתרת תווית קידום מכירות בתשלום מוצגת + הסתר מודעות קופצות של הנגן + מודעות קופצות של הנגן מוסתרות + מודעות קופצות של הנגן מוצגות הסתר כרטיסים בחסות עצמית כרטיסים בחסות עצמית מוסתרים כרטיסים בחסות עצמית מוצגים @@ -525,23 +589,18 @@ Second \"item\" text" קישורי קניות בתיאור הסרטון מוסתרים קישורי קניות בתיאור הסרטון מוצגים הסתר באנר צפייה במוצרים - באנר צפייה במוצרים בשכבת-על של וידאו מוסתר - באנר צפייה במוצרים בשכבת-על של וידאו מוצג - הסתר תוצאות חיפוש באינטרנט - תוצאות חיפוש באינטרנט מוסתרות - תוצאות חיפוש באינטרנט מוצגות - - - הסתר קידומי YouTube Premium - קידומי YouTube Premium תחת נגן הוידאו מוסתרים - קידומי YouTube Premium תחת נגן הוידאו מוצגים + באנר צפייה במוצרים בשכבת-על של הנגן מוסתר + באנר צפייה במוצרים בשכבת-על של הנגן מוצג + הסתר קידומי YouTube Premium + קידומי YouTube Premium מוסתרים + קידומי YouTube Premium מוצגים הסתר מודעות סרטון מודעות סרטון מוסתרות מודעות סרטון מוצגות - + כתובת URL הועתקה אל הלוח כתובת URL עם חותמת זמן הועתקה הצג לחצן העתקת כתובת ה-URL של הסרטון @@ -557,10 +616,10 @@ Second \"item\" text" דו-שיח יוצג זה לא עוקף את מגבלת הגיל. זה רק מסכים לזה באופן אוטומטי. - - השבת חלון קופץ של \'כניסה לטלוויזיה\' - חלון קופץ של כניסה לטלוויזיה מושבת - חלון קופץ של כניסה לטלוויזיה מופעל + + השבת חלון קופץ של \'כניסה לטלוויזיה\' + חלון קופץ של כניסה לטלוויזיה מושבת + חלון קופץ של כניסה לטלוויזיה מופעל השבת דילוג פרקים בהקשה כפולה @@ -593,10 +652,10 @@ Second \"item\" text" מחווה מושבתת מחווה מופעלת - - הפעל הקשה כדי לדלג - הקשה כדי לדלג מופעלת - הקשה כדי לדלג מושבתת + + הפעל הקשה כדי לדלג + הקשה כדי לדלג מופעלת + הקשה כדי לדלג מושבתת הפעל מחוות בהירות @@ -677,7 +736,7 @@ Second \"item\" text" הלחצן \'תגובות\' מוסתר הלחצן \'תגובות\' מוצג + This button usually appears on live streamed videos. --> הסתר דיווח לחצן דיווח מוסתר לחצן דיווח מוצג @@ -690,7 +749,7 @@ Second \"item\" text" לחצן הורדה מוסתר לחצן הורדה מוצג + This button usually appears on videos uploaded by the logged-in user. --> הסתר באז לחצן באז מוסתר לחצן באז מוצג @@ -703,7 +762,7 @@ Second \"item\" text" לחצן תודה מוסתר לחצן תודה מוצג + This button usually appears if the user IP is from a specific region such as the USA or EU. --> הסתר Ask לחצן Ask מוסתר לחצן Ask מוצג @@ -711,6 +770,7 @@ Second \"item\" text" הסתר קליפ לחצן קליפ מוסתר לחצן קליפ מוצג + ייתכן שהסתרה לא תפעל עבור חלק מחשבונות המשתמשים. הסתר \'חנות\' הלחצן \'חנות\' מוסתר @@ -720,13 +780,13 @@ Second \"item\" text" הלחצן \'שמירה\' מוסתר הלחצן שמירה\' מוצג - + לחצני ניווט - הסתר או שנה לחצנים בסרגל הניווט + הסתר או שנה לחצני סרגל ניווט - הסתר את דף הבית - לחצן דף הבית מוסתר - לחצן דף הבית מוצג + הסתר דף הבית + לחצן \'דף הבית\' מוסתר + לחצן \'דף הבית\' מוצג הסתר Shorts לחצן Shorts מוסתר @@ -744,26 +804,44 @@ Second \"item\" text" לחצן עדכונים מוצג החלף יצירה עם עדכונים - "לחצן יצירה מוחלף בלחצן עדכונים - -הערה: הפעלת אפשרות זו גם מסתירה באופן כפוי מודעות סרטון" + לחצן יצירה מוחלף עם לחצן עדכונים לחצן יצירה לא יוחלף עם לחצן עדכונים - "השבתת הגדרה זו תשבית גם את חסימת המודעות של Shorts. - -אם שינוי הגדרה זו אינו נכנס לתוקף, נסה לעבור למצב פרטי." + אם שינוי הגדרה זו אינו נכנס לתוקף, נסה לעבור למצב פרטי. הסתר תוויות לחצני ניווט התוויות מוסתרות התוויות מוצגות + הפעל לחצני ניווט צרים + המרווח בין לחצני הניווט צר + המרווח בין לחצני הניווט רגיל + הפעל אנימציות של סרגל הניווט + מעברי ניווט מונפשים + מעברי ניווט אינם מונפשים השבת שורת מצב שקופה שורת מצב אטומה שורת מצב אטומה או שקופה - בחלק מהמכשירים, הפעלת תכונה זו עשויה לשנות את סרגל הניווט של המערכת לשקוף. + "מגבלות: +• פס שחור עשוי להופיע בחלק העליון של נגן הווידאו. +• במכשירים מסוימים, הפעלת תכונה זו יכולה לשנות את סרגל הניווט של המערכת לשקוף." השבת סרגל בהיר שקוף סרגל ניווט במצב בהיר הוא אטום סרגל ניווט במצב בהיר הוא אטום או שקוף השבת סרגל כהה שקוף סרגל ניווט במצב כהה הוא אטום סרגל ניווט במצב כהה הוא אטום או שקוף + סרגל כלים + הסתר או שנה רכיבי סרגל כלים + הסתר לחצן יצירה + לחצן יצירה מוסתר + לחצן יצירה מוצג + הסתר לחצן עדכונים + לחצן עדכונים מוסתר + לחצן עדכונים מוצג + הסתר לחצן חיפוש + לחצן החיפוש מוסתר + לחצן החיפוש מוצג. + הפעל סרגל חיפוש רחב + סרגל חיפוש רחב מופעל + סרגל חיפוש רחב מושבת תפריט נשלף @@ -838,6 +916,12 @@ Second \"item\" text" הסתר לחצן העברה לחצן העברה מוסתר לחצן העברה מוצג + הסתר לחצן כיווץ + לחצן כיווץ מוסתר + לחצן כיווץ מוצג + הסתר לחצן מסך מלא + לחצן מסך מלא מוסתר + לחצן מסך מלא מוצג הסתר רקע פקדי הנגן רקע פקדי הנגן מוסתר רקע פקדי הנגן מוצג @@ -846,9 +930,9 @@ Second \"item\" text" הלחצנים מוצגים - הסתר כרטיסי מסך סיום - כרטיסי מסך מסיום מוסתרים - כרטיסי מסך מסיום מוצגים + הסתר כרטיסי מסך סיום + כרטיסי מסך מסיום מוסתרים + כרטיסי מסך מסיום מוצגים השבת תאורת אווירה במסך מלא @@ -873,10 +957,16 @@ Second \"item\" text" הסתר סרגל דילוג עם תמונות ממוזערות של סרטון סרגל דילוג עם תמונות ממוזערות של סרטון מוסתר סרגל דילוג עם תמונות ממוזערות של סרטון מוצג + הפעל סרגל חיפוש גדול במסך מלא + סרגל חיפוש במסך מלא הוא בגודל גדול + סרגל חיפוש במסך מלא הוא בגודל רגיל נגן Shorts הסתר או הצג רכיבי נגן Shorts + הסתר Shorts בדף הערוץ + מוסתר בדף הערוץ + מוצג בדף הערוץ להסתיר Shorts בפיד הבית מוסתר בפיד הבית ובסרטונים קשורים @@ -888,9 +978,18 @@ Second \"item\" text" להסתיר Shorts בפיד המינויים מוסתר בפיד המנויים מוצג בפיד המינויים + הסתר Shorts בתיאור הסרטון + מוסתר בתיאור הסרטון + מוצג בתיאור הסרטון הסתר Shorts בהיסטוריית הצפייה מוסתר בהיסטוריית הצפייה מוצג בהיסטוריית הצפייה + הסתר לחצן AI + לחצן AI מוסתר + לחצן AI מוצג + הסתר תווית \'מדובב אוטומטית\' + תווית בדיבוב אוטומטי מוסתרת + תווית בדיבוב אוטומטי מוצגת הסתר תווית \'מדובב אוטומטית\' תווית בדיבוב אוטומטי מוסתרת תווית בדיבוב אוטומטי מוצגת @@ -952,6 +1051,7 @@ Second \"item\" text" הסתר לחצן \'השתמש בתבנית זו\' הלחצן \'השתמש בתבנית זו\' מוסתר הלחצן \'השתמש בתבנית זו\' מוצג + הסתר הנפשת מזרקה של לחצן אהבתי הנפשת מזרקה של לחצן אהבתי מוסתרת הנפשת מזרקה של לחצן אהבתי מוצגת @@ -994,11 +1094,15 @@ Second \"item\" text" סרגל ניווט מוסתר סרגל ניווט מוצג - + + הסתר תצוגה מקדימה בהפעלה אוטומטית + תצוגה מקדימה בהפעלה אוטומטית מוסתרת + תצוגה מקדימה בהפעלה אוטומטית מוצגת + + הסתר סרטון מוצע של מסך סיום "סרטון מוצע של מסך סיום מוסתר כאשר הפעלה אוטומטית כבויה - הפעלה אוטומטית ניתנת לשינוי בהגדרות YouTube: הגדרות ← הפעלה ← הפעלה אוטומטית של הסרטון הבא" סרטון מוצע של מסך סיום מוצג @@ -1014,9 +1118,9 @@ Second \"item\" text" חותמת זמן מוצגת - הסתר לוחות נגן צצים - לוחות נגן צצים מוסתרים - לוחות נגן צצים מוצגים + הסתר לוחות נגן צצים + לוחות נגן צצים מוסתרים + לוחות נגן צצים מוצגים צא ממצב מסך מלא בסוף סרטון @@ -1084,26 +1188,6 @@ Second \"item\" text" מגבלת קצב לקוח נתקלו %d פעמים %d אלפיות שנייה - - הפעל סרגל חיפוש רחב - סרגל חיפוש רחב מופעל - סרגל חיפוש רחב מושבת - - - הפעל תמונות ממוזערות באיכות גבוהה - תמונות ממוזערות של סרגל דילוג הן באיכות גבוהה - תמונות ממוזערות של סרגל דילוג הן באיכות בינונית - תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות גבוהה - תמונות ממוזערות של סרגל דילוג במסך מלא הן באיכות בינונית - "זה גם ישחזר תמונות ממוזערות בשידורים חיים שאין להם תמונות ממוזערות של סרגל דילוג. - -תמונות ממוזערות של סרגל דילוג ישתמשו באותה איכות כמו הסרטון הנוכחי. - -תכונה זו עובדת בצורה הטובה ביותר עם איכות סרטון של 720p או פחות ובעת שימוש בחיבור אינטרנט מהיר מאוד." - שחזר תמונות ממוזערות של סרגל דילוג ישנות - תמונות ממוזערות של סרגל דילוג יופיעו מעל סרגל הדילוג - תמונות ממוזערות של סרגל דילוג יופיעו במסך מלא - הפעל את SponsorBlock המערכת SponsorBlock היא מערכת מיקור המונים לדילוג על חלקים מעצבנים של סרטוני YouTube @@ -1246,8 +1330,8 @@ Second \"item\" text" המערכת SponsorBlock מושבתת באופן זמני לא ניתן לשלוח את המקטע (מצב: %1$d %2$s) לא ניתן לשלוח מקטע. מוגבל קצב (יותר מדי מאותו המשתמש או כתובת IP) - לא יכול לשלוח את המקטע: %s - "לא יכול לשלוח את המקטע. + לא ניתן לשלוח את המקטע: %s + "לא ניתן לשלוח את המקטע. כבר קיים" המקטע נשלח בהצלחה @@ -1342,8 +1426,6 @@ Second \"item\" text" יעד גרסת יישום מזויפת 20.13.41 - שחזור סרגל פעולות וידאו לא מכווץ 20.05.46 - שחזור פונקציונליות תמלול - 19.35.36 - שחזר סמלי נגן Shorts ישנים - 19.01.34 - שחזר סמלי ניווט ישנים שנה את דף ההתחלה @@ -1448,8 +1530,9 @@ Second \"item\" text" מסך הטעינה יהיה בעל רקע עם מעבר צבע מסך הטעינה יהיה בעל רקע מוצק סגנון מסך פתיחה - צבע - שחור ולבן + מושבת + צבע + שחור ולבן הפעל צבע סרגל דילוג מותאם אישית צבע סרגל דילוג מותאם אישית מוצג צבע סרגל דילוג מקורי מוצג @@ -1554,6 +1637,9 @@ Second \"item\" text" השבת משוב ברטט עבור ביטול דילוג משוב ברטט עבור ביטול דילוג מושבת משוב ברטט עבור ביטול דילוג מופעל + השבת משוב ברטט בלחיצה ארוכה + משוב ברטט בלחיצה ארוכה מושבת + משוב ברטט בלחיצה ארוכה מופעל השבת משוב זום ברטט משוב ברטט עבור זום מושבת משוב ברטט עבור זום מופעל @@ -1649,6 +1735,11 @@ Second \"item\" text" תפריט איכות סרטון מתקדם מוצג תפריט איכות סרטון מתקדם אינו מוצג + + הסתר אפשרויות איכות פרימיום + אפשרויות איכות פרימיום מוסתרות + אפשרויות איכות פרימיום מוצגות + הפעל החלק כדי לדלג החלק כדי לדלג מופעל @@ -1680,6 +1771,7 @@ Second \"item\" text" + אודות מודעות כללי diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index 6c361ef70e..2f418fa95f 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -18,237 +18,255 @@ Second \"item\" text" --> - - - アプリ名 - - カスタム - アプリアイコン - オリジナル - ReVanced - - ReVanced(シンプル) - ReVanced(ロゴ拡大) - - カスタム - - - チェックに失敗しました - 公式サイトを開く - 無視 - <h5>このアプリはあなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく機能しない可能性があり、<b>使用すると有害または危険になる可能性があります</b>。<br><br>これらのチェックは、このアプリが事前にパッチが適用されているか、または他の誰かから取得されたことを意味します:<br><br><small>%1$s</small><br>検証済みで安全なアプリを使用していることを確認するために、<b>このアプリをアンインストールして自分でパッチを適用する</b>ことを強くおすすめします。<p><br>無視した場合、この警告は 2 回のみ表示されます。 - 別のデバイス上でパッチが適用されている - ReVanced Manager によってインストールされていない - 10 分以上前にパッチが適用されている - %s 日前にパッチが適用されている - APK の作成日時データが破損している - - - ReVanced からの通知 - 再生履歴が保存されていません。<br><br>これはおそらく、DNS 広告ブロッカーまたはネットワーク プロキシが原因です。<br><br>この問題を解決するには、<b>s.youtube.com</b> をホワイトリストに追加するか、すべての DNS ブロッカーとプロキシをオフにしてください。 - 今後表示しない - - - 設定 - ReVanced - 続行してもよろしいですか? - 保存 - リセット - 色をリセット - 色の値が無効です - 再起動が必要です - この変更を適用するには、アプリを再起動してください。 - 再起動 - インポート - コピー - ReVanced の設定をデフォルトにリセット - %d 個の設定をインポートしました - インポートに失敗しました: %s - 設定を検索 - 「%s」に該当する結果は見つかりませんでした - 別のキーワードを試してください - 最近の検索 - 検索履歴から削除しますか? - 検索履歴を消去 - 本当にすべての検索履歴を消去しますか? - 検索のヒント - "• カテゴリをタップするとそのカテゴリの設定メニューに移動する + + + アプリ名 + + カスタム + アプリアイコン + オリジナル + ReVanced + + ReVanced(シンプル) + ReVanced(ロゴ拡大) + + カスタム + + + チェックに失敗しました + 公式サイトを開く + 無視 + <h5>このアプリはあなたによってパッチが適用されていないようです。</h5><br>このアプリは正しく機能しない可能性があり、<b>使用すると有害または危険になる可能性があります</b>。<br><br>これらのチェックは、このアプリが事前にパッチが適用されているか、または他の誰かから取得されたことを意味します:<br><br><small>%1$s</small><br>検証済みで安全なアプリを使用していることを確認するために、<b>このアプリをアンインストールして自分でパッチを適用する</b>ことを強くおすすめします。<p><br>無視した場合、この警告は 2 回のみ表示されます。 + 別のデバイス上でパッチが適用されている + ReVanced Manager によってインストールされていない + 10 分以上前にパッチが適用されている + %s 日前にパッチが適用されている + APK の作成日時データが破損している + + + ReVanced からの通知 + 再生履歴が保存されていません。<br><br>これはおそらく、DNS 広告ブロッカーまたはネットワーク プロキシが原因です。<br><br>この問題を解決するには、<b>s.youtube.com</b> をホワイトリストに追加するか、すべての DNS ブロッカーとプロキシをオフにしてください。 + 今後表示しない + + + 設定 + ReVanced + 続行してもよろしいですか? + 保存 + リセット + 色をリセット + 色の値が無効です + 再起動が必要です + この変更を適用するには、アプリを再起動してください。 + 再起動 + インポート + コピー + ReVanced の設定をデフォルトにリセット + %d 個の設定をインポートしました + インポートに失敗しました: %s + 設定を検索 + 「%s」に該当する結果は見つかりませんでした + 別のキーワードを試してください + 最近の検索 + 検索履歴から削除しますか? + 検索履歴を消去 + 本当にすべての検索履歴を消去しますか? + 検索のヒント + "• カテゴリをタップするとそのカテゴリの設定メニューに移動する • 設定を長押しすると設定メニューに移動してその設定までスクロールする • Enter キーを押すと検索クエリが履歴に保存される • 検索では、大文字・小文字や句読点は無視される • 無効化されている下位設定の上には、その設定を無効化している上位設定が表示される" - 検索履歴はありません - 検索履歴を保存するには、検索クエリを入力して Enter キーを押してください - 設定の検索履歴を表示 - 設定の検索履歴は表示されます - 設定の検索履歴は表示されません - ReVanced の設定にアイコンを表示 - ReVanced の設定メニューにアイコンが表示されます - ReVanced の設定メニューにアイコンは表示されません - ReVanced 設定の言語 - "一部の言語の翻訳が欠落しているまたは不完全である可能性があります。 + 検索履歴はありません + 検索履歴を保存するには、検索クエリを入力して Enter キーを押してください + 設定の検索履歴を表示 + 設定の検索履歴が表示されます + 設定の検索履歴は表示されません + 太字アイコンを無効化 + 通常のアイコンが表示されます + 太字アイコンが表示されます + ReVanced の設定にアイコンを表示 + ReVanced の設定メニューにアイコンが表示されます + ReVanced の設定メニューにアイコンは表示されません + ReVanced 設定の言語 + "一部の言語の翻訳が欠落しているまたは不完全である可能性があります。 新しい言語を翻訳する、または既存の翻訳を改善するには、translate.revanced.app にアクセスしてください。" - アプリの言語 - インポート / エクスポート - ReVanced の設定をインポート/エクスポートします - - ReVanced Patches のバージョン <i>%s</i> を使用しています - 注意 - このバージョンはプレリリース版であり、予期しない問題が発生する可能性があります - 公式リンク - + ReVanced Patches のバージョン <i>%s</i> を使用しています + 注意 + このバージョンはプレリリース版であり、予期しない問題が発生する可能性があります + 公式リンク + - - - GmsCore 設定 - GmsCore の設定 - - MicroG GmsCore がインストールされていません。インストールしてください。 - 操作が必要です - "GmsCore はバックグラウンドで実行する権限がありません。 + + + GmsCore + GmsCore に関連する設定 + GmsCore の更新を確認 + 更新の確認は有効です + 更新の確認は無効です + GmsCore の設定を開く + GmsCore の設定 + + MicroG GmsCore がインストールされていません。インストールしてください。 + 操作が必要です + MicroG GmsCore の更新の確認に失敗しました + MicroG GmsCore の新しいバージョン (%1$s) が利用可能です。現在、バージョン %2$s を使用しています。 + "MicroG GmsCore には、バックグラウンドで実行するための権限が与えられていません。 -お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore に対するデバイスの設定を変更してください。 +下記ウェブサイト「Don't kill my app!」の携帯電話メーカー別のガイドに従い、MicroG に対するデバイスの設定を変更してください。 -これはアプリが正常に動作するために必要です。" - ウェブサイトを開く - "問題を防ぐためには、GmsCore の電池の最適化を無効にする必要があります。 +この操作は、アプリが正常に動作するために必要です。" + ウェブサイトを開く + キャンセル + "問題を防ぐためには、GmsCore の電池の最適化を無効にする必要があります。 GmsCore の電池の最適化を無効にしても、バッテリーの使用に悪影響を及ぼすことはありません。 [続行] をタップして「電池の最適化」を無効にしてください。" - 続行 - - - 動画ストリームを偽装 - 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します - 動画ストリームを偽装 - 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します - 動画ストリームを偽装 - "動画ストリームは偽装されます + 続行 + + + 動画ストリームを偽装 + 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します + 動画ストリームを偽装 + 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します + 動画ストリームを偽装 + "動画ストリームは偽装されます YouTube Premium ユーザーの場合、この設定は必要ない可能性があります" - "動画ストリームは偽装されません + "動画ストリームは偽装されません 再生に失敗する可能性があります" - この設定を無効にすると、動画の再生に失敗するようになる可能性があります。 - デフォルトのクライアント - - - オリジナルの音声を強制的に使用 - オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用されません - アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックが使用される場合があります - - この機能を使用するには、[動画ストリームを偽装] のクライアントを Android Studio 以外の任意のクライアントに変更してください - - - デバッグ - デバッグ オプションを有効または無効にします - デバッグログを有効化 - デバッグログは有効です - デバッグログは無効です - スタック トレースをログに保存 - デバッグログにはスタック トレースが含まれます - デバッグログにはスタック トレースは含まれません - ReVanced のエラー時にトーストを表示 - エラーが発生した場合にトースト通知が表示されます - エラーが発生した場合にトースト通知は表示されません - "エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。 + この設定を無効にすると、動画の再生に失敗するようになる可能性があります。 + デフォルトのクライアント + + + オリジナルの音声を強制的に使用 + オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用されません + アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックが使用される場合があります + + この機能を使用するには、[動画ストリームを偽装] のクライアントを Android Studio 以外の任意のクライアントに変更してください + + + デバッグ + デバッグ オプションを有効または無効にします + デバッグログを有効化 + デバッグログは有効です + デバッグログは無効です + スタック トレースをログに保存 + デバッグログにはスタック トレースが含まれます + デバッグログにはスタック トレースは含まれません + ReVanced のエラー時にトーストを表示 + エラーが発生した場合にトースト通知が表示されます + エラーが発生した場合にトースト通知は表示されません + "エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。 予期しないイベントが発生した場合でも通知されなくなります。" - デバッグログのエクスポート - ReVanced のデバッグログをクリップボードにコピーします - デバッグログが無効になっています - ログが見つかりませんでした - ログをコピーしました - ログのエクスポートに失敗しました: %s - デバッグログを消去 - 保存されている ReVanced のすべてのデバッグログを消去します - ログを消去しました - feature flag マネージャー - 各機能のオン / オフを制御する feature flag を管理します - 有効な flag (%d) - 無効な flag (%d) - flag を検索 - flag を保存しました - flag をリセットしました - flag をクリップボードにコピーしました - protocol buffer をログに保存 - デバッグログには protocol buffer が含まれます - デバッグログには protocol buffer は含まれません - "この設定を有効にすると、一部の UI コンポーネントの画面上のテキストを含む、追加のレイアウトデータがログに記録されます。 + デバッグログのエクスポート + ReVanced のデバッグログをクリップボードにコピーします + デバッグログが無効になっています + ログが見つかりません + ログをコピーしました + ログのエクスポートに失敗しました: %s + デバッグログを消去 + 保存されているすべての ReVanced のデバッグログを消去します + ログを消去しました + feature flag マネージャー + 各機能のオン / オフを制御する feature flag を管理します + 有効な flag (%d) + 無効な flag (%d) + flag を検索 + flag を保存しました + flag をリセットしました + flag をクリップボードにコピーしました + この機能を使用するにはアプリを再起動してください + protocol buffer をログに保存 + デバッグログには protocol buffer が含まれます + デバッグログには protocol buffer は含まれません + "この設定を有効にすると、一部の UI コンポーネントの画面上に表示されるテキストを含む追加のレイアウト データがログに記録されるようになります。 -これは、カスタムフィルターを作成する際にコンポーネントを識別するのに役立ちます。 +このデータは、カスタム フィルタを作成する際にコンポーネントを識別するのに役立ちます。 -ただし、これを有効にすると、IP アドレスなどの一部のユーザーデータもログに記録されます。" - - - 共有リンクを無害化 - 共有リンクから追跡パラメータが削除されます - 共有リンクから追跡パラメータは削除されません - 共有リンクを youtube.com に変更 - 共有リンクには youtube.com が使用されます - 共有リンクには music.youtube.com が使用されます - - - カスタム フィルタ - カスタム フィルタを使用してコンポーネントを非表示にします - カスタム フィルタを有効化 - カスタム フィルタは有効です - カスタム フィルタは無効です - カスタム フィルタ - - 非表示にするコンポーネントの path builder string のリスト (改行区切り) - 無効なカスタム フィルタ: %s - - - - - ReVanced について - 広告 - 代替サムネイル - フィード - 全般 - プレーヤー - ショート - シークバー - スワイプ コントロール - Return YouTube Dislike - その他 - 動画 - 古い設定メニューを復元 - 古いスタイルの設定メニューが表示されます - 新しいスタイルの設定メニューが表示されます - - - ショートのバックグラウンド再生を無効化 - ショート動画のバックグラウンド再生は無効です - ショート動画のバックグラウンド再生は有効です - - - アルバムカードを非表示 - アーティストの概要欄下のアルバムカードは表示されません - アーティストの概要欄下のアルバムカードは表示されます - アーティスト カードを非表示 - アーティスト カードは表示されません - アーティスト カードは表示されます - チップ欄を非表示 - チップ欄は表示されません - チップ欄は表示されます - コミュニティ投稿を非表示 - コミュニティ投稿は表示されません - コミュニティ投稿は表示されます - コンパクトなバナーを非表示 - コンパクトなバナーは表示されません - コンパクトなバナーは表示されます - 展開可能なカードを非表示 - 動画下の展開可能なカードは表示されません - 動画下の展開可能なカードは表示されます - 音声入力のフローティング ボタンを非表示 - 検索時の音声入力のフローティング ボタンは表示されません - 検索時の音声入力のフローティング ボタンは表示されます - 横スクロール欄を非表示 - "横スクロール欄は表示されません +ただし、有効にすると、IP アドレスなどの一部のユーザーデータもログに記録されるようになります。" + + + 共有リンクを無害化 + 共有リンクから追跡パラメータが削除されます + 共有リンクから追跡パラメータは削除されません + 共有リンクを youtube.com に変更 + 共有リンクには youtube.com が使用されます + 共有リンクには music.youtube.com が使用されます + + + カスタム フィルタ + カスタム フィルタを使用してコンポーネントを非表示にします + カスタム フィルタを有効化 + カスタム フィルタは有効です + カスタム フィルタは無効です + カスタム フィルタ + + 非表示にするコンポーネントの path builder string のリスト (改行区切り) + 無効なカスタム フィルタ: %s + + + + + ReVanced について + 広告 + 代替サムネイル + フィード + 全般 + プレーヤー + ショート + シークバー + スワイプ コントロール + Return YouTube Dislike + その他 + 動画 + 古い設定メニューを復元 + 古いスタイルの設定メニューが表示されます + 新しいスタイルの設定メニューが表示されます + + + ショートのバックグラウンド再生を無効化 + ショート動画のバックグラウンド再生は無効です + ショート動画のバックグラウンド再生は有効です + + + クリエイターのストア欄を非表示 + 動画プレーヤー下のクリエイターのストア欄は表示されません + 動画プレーヤー下のクリエイターのストア欄は表示されます + アルバムカードを非表示 + アーティストの概要欄下のアルバムカードは表示されません + アーティストの概要欄下のアルバムカードは表示されます + アーティスト カードを非表示 + アーティスト カードは表示されません + アーティスト カードは表示されます + チップ欄を非表示 + チップ欄は表示されません + チップ欄は表示されます + ホームフィードの動画下のコメント欄を非表示 + ホームフィードの動画下のコメント欄は表示されません + ホームフィードの動画下のコメント欄は表示されます + コミュニティ投稿を非表示 + コミュニティ投稿は表示されません + コミュニティ投稿は表示されます + コンパクトなバナーを非表示 + コンパクトなバナーは表示されません + コンパクトなバナーは表示されます + 展開可能なカードを非表示 + 動画下の展開可能なカードは表示されません + 動画下の展開可能なカードは表示されます + 音声入力のフローティング ボタンを非表示 + 検索時の音声入力のフローティング ボタンは表示されません + 検索時の音声入力のフローティング ボタンは表示されます + 横スクロール欄を非表示 + "横スクロール欄は表示されません 例: ・ニュース速報 ・続きを見る @@ -256,1033 +274,1099 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が ・関連が強い ・ショッピング ・もう一度見る" - 横スクロール欄は表示されます - 画像欄を非表示 - 検索結果の画像欄は表示されません - 検索結果の画像欄は表示されます - 最新の投稿を非表示 - 最新の投稿は表示されません - 最新の投稿は表示されます - ミックスリストを非表示 - ミックスリストは表示されません - ミックスリストは表示されます - 映画セクションを非表示 - 映画セクションは表示されません - 映画セクションは表示されます - - 「通知を受け取る」ボタンを非表示 - 「通知を受け取る」ボタンは表示されません - 「通知を受け取る」ボタンは表示されます - ゲームルームを非表示 - ゲームルームは表示されません - ゲームルームは表示されます - + 「新着動画」ボタンを非表示 + 「新着動画」ボタンは表示されません + 「新着動画」ボタンは表示されます + ミックスリストを非表示 + ミックスリストは表示されません + ミックスリストは表示されます + 映画セクションを非表示 + 映画セクションは表示されません + 映画セクションは表示されます + + 「通知を受け取る」ボタンを非表示 + 「通知を受け取る」ボタンは表示されません + 「通知を受け取る」ボタンは表示されます + ゲームルームを非表示 + ゲームルームは表示されません + ゲームルームは表示されます + - 「もっと見る」ボタンを非表示 - 「もっと見る」ボタンは検索結果に表示されません - 「もっと見る」ボタンは検索結果に表示されます - アンケートを非表示 - アンケートは表示されません - アンケートは表示されます - チケット欄を非表示 - チケット欄は表示されません - チケット欄は表示されます - - おすすめ動画のラベルを非表示 - 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されません - 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されます - 区切りのスペースを非表示 - コンポーネントを区切るためのスペースは表示されません - コンポーネントを区切るためのスペースが表示されます - - YouTube Doodle を非表示 - ロゴの YouTube Doodle アニメーションは表示されません - ロゴの YouTube Doodle アニメーションは表示されます - "YouTube Doodle は年に数日表示されます。 - -あなたの地域で Doodle が表示されているときにこの設定をオンにすると、検索結果にフィルタバーが表示されなくなります。" - チャンネルバーを非表示 - チャンネルバーは表示されません - チャンネルバーは表示されます - チャンネルの透かしを非表示 - チャンネルの透かしは表示されません - チャンネルの透かしは表示されます - クラウドファンディング欄を非表示 - クラウドファンディング欄はプレーヤーと概要欄の間に表示されません - クラウドファンディング欄はプレーヤーと概要欄の間に表示されます - 緊急ボックスを非表示 - 緊急ボックスは表示されません - 緊急ボックスは表示されます - 情報パネルを非表示 - 情報パネルは表示されません - 情報パネルは表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - 医療情報パネルを非表示 - 医療情報パネルは表示されません - 医療情報パネルは表示されます - クイック アクションを非表示 - 全画面表示モードのクイック アクションは表示されません - 全画面表示モードのクイック アクションは表示されます - 関連動画を非表示 - クイック アクション内の関連動画 (その他の動画) は表示されません - クイック アクション内の関連動画 (その他の動画) は表示されます - チャンネル登録者のガイドラインを非表示 - チャンネル登録者のコミュニティ ガイドラインは表示されません - チャンネル登録者のコミュニティ ガイドラインは表示されます - Timed Reaction を非表示 - Timed reaction は表示されません\n\nライブ配信のチャット欄に常駐するハート マーク ボタンが非表示になります - Timed reaction は表示されます\n\nライブ配信のチャット欄にハート マーク ボタンが常駐します - 「AI 生成による動画の要約」を非表示 - 「AI 生成による動画の要約」セクションは表示されません - 「AI 生成による動画の要約」セクションは表示されます - 「質問する」を非表示 - 「質問する」セクションは表示されません - 「質問する」セクションは表示されます - 関連情報を非表示 - 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されません - 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されます - チャプターを非表示 - チャプター セクションは表示されません - チャプター セクションは表示されます - 「作成の裏側」を非表示 - 「作成の裏側」セクションは表示されません - 「作成の裏側」セクションは表示されます - ハイプポイントを非表示 - ハイプポイントは表示されません - ハイプポイントは表示されます - 「ポッドキャストを検索」を非表示 - 「ポッドキャストを検索」セクションは表示されません - 「ポッドキャストを検索」セクションは表示されます - おすすめリンクを非表示 - 情報カード セクション内のおすすめリンク セクションは表示されません - 情報カード セクション内のおすすめリンク セクションは表示されます - おすすめ動画を非表示 - 情報カード セクション内のおすすめ動画セクションは表示されません - 情報カード セクション内のおすすめ動画セクションは表示されます - 情報カードを非表示 - 情報カード セクションは表示されません - 情報カード セクションは表示されます - 「主な概念」を非表示 - 主な概念セクションは表示されません - 主な概念セクションが表示されます - チャンネル登録ボタンを非表示 - 情報カード セクション内のチャンネル登録ボタンは表示されません - 情報カード セクション内のチャンネル登録ボタンは表示されます - 文字起こしを非表示 - 文字起こしセクションは表示されません - 文字起こしセクションは表示されます - 概要欄 - 概要欄のコンポーネントを表示または非表示にします - フィルタバー - フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします - フィードで非表示 - フィードには表示されません - フィードには表示されます - 関連動画で非表示 - 関連動画には表示されません - 関連動画には表示されます - 検索結果で非表示 - 検索結果には表示されません - 検索結果には表示されます - 再生履歴で非表示 - 再生履歴には表示されません - 再生履歴には表示されます - チャンネル ページ - チャンネル ページのコンポーネントを表示または非表示にします - - コミュニティ ボタンを非表示 - コミュニティ ボタンは表示されません - コミュニティ ボタンは表示されます - - 「おすすめ」欄を非表示 - 「おすすめ」欄は表示されません - 「おすすめ」欄は表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - リンクのプレビューを非表示 - リンクのプレビューは表示されません - リンクのプレビューは表示されます - メンバー欄を非表示 - メンバー欄は表示されません - メンバー欄は表示されます - - ストアボタンを非表示 - ストアボタンは表示されません - ストアボタンは表示されます - - チャンネル登録ボタンを非表示 - チャンネル登録ボタンは表示されません - チャンネル登録ボタンは表示されます - コメント - コメント セクションのコンポーネントを表示または非表示にします - AI による「チャットの要約」を非表示 - AI による「チャットの要約」は表示されません - AI による「チャットの要約」は表示されます - AI によるコメントの要約を非表示 - AI によるコメントの要約は表示されません\n\nコメント欄のヘッダーにはトピックボタンは表示されません - AI によるコメントの要約は表示されます\n\nコメント欄のヘッダーにはトピックボタンが表示されます - チャンネルのガイドラインを非表示 - チャンネルのガイドラインは表示されません - チャンネルのガイドラインは表示されます - 「メンバーによるコメント」ヘッダーを非表示 - 「メンバーによるコメント」ヘッダーは表示されません - 「メンバーによるコメント」ヘッダーは表示されます - コメント セクションを非表示 - コメント セクションは表示されません - コメント セクションは表示されます - コミュニティ ガイドラインを非表示 - コミュニティ ガイドラインは表示されません - コミュニティ ガイドラインは表示されます - 「ショートを作成」ボタンを非表示 - 「ショートを作成」ボタンは表示されません - 「ショートを作成」ボタンは表示されます - 絵文字ボタンとタイムスタンプ ボタンを非表示 - 絵文字ボタンとタイムスタンプ ボタンは表示されません - 絵文字ボタンとタイムスタンプ ボタンは表示されます - コメントのプレビューを非表示 - コメントのプレビューは表示されません - コメントのプレビューは表示されます - Thanks ボタンを非表示 - Thanks ボタンは表示されません - Thanks ボタンは表示されます - 視聴回数を非表示 - 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されません - 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されます - - "制限事項: -• ショート欄、チャンネル ページ、検索結果では、引き続き視聴回数が表示される場合がある -• この機能は Automotive レイアウトでは動作しない" - 公開日時を非表示 - 公開日時はフィードおよび検索結果の動画のタイトル下に表示されません\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます - 公開日時はフィードおよび検索結果の動画のタイトル下に表示されます\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます - - "制限事項: -• ショート欄、チャンネル ページ、検索結果では、引き続き公開日時が表示される場合がある -• この機能は Automotive レイアウトでは動作しない" - キーワードでコンテンツを非表示 - キーワード フィルタを使用してフィード、検索結果に表示される動画を除外します - ホームの動画をキーワードで非表示 - ホームタブの動画はキーワードでフィルタリングされます - ホームタブの動画はキーワードでフィルタリングされません - 検索結果をキーワードで非表示 - 検索結果はキーワードでフィルタリングされます - 検索結果はキーワードでフィルタリングされません - 登録チャンネルの動画をキーワードで非表示 - 登録チャンネルタブの動画はキーワードでフィルタリングされます - 登録チャンネルタブの動画はキーワードでフィルタリングされません - キーワード - + おすすめ動画のラベルを非表示 + 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されません + 「他の人はこの動画も視聴しています」ラベルと「あなたへのおすすめ」ラベルは検索結果に表示されます + 区切りのスペースを非表示 + コンポーネントを区切るためのスペースは表示されません + コンポーネントを区切るためのスペースが表示されます + ウェブ検索結果を非表示 + ウェブ検索結果は表示されません + ウェブ検索結果は表示されます + 「おすすめ」セクションを非表示 + 検索履歴の「おすすめ」セクションは表示されません + 検索履歴の「おすすめ」セクションは表示されます + + YouTube Doodle を非表示 + ロゴの YouTube Doodle アニメーションは表示されません + ロゴの YouTube Doodle アニメーションは表示されます + チャンネルバーを非表示 + チャンネルバーは表示されません + チャンネルバーは表示されます + チャンネルの透かしを非表示 + チャンネルの透かしは表示されません + チャンネルの透かしは表示されます + クラウドファンディング欄を非表示 + クラウドファンディング欄はプレーヤーと概要欄の間に表示されません + クラウドファンディング欄はプレーヤーと概要欄の間に表示されます + 緊急ボックスを非表示 + 緊急ボックスは表示されません + 緊急ボックスは表示されます + 情報パネルを非表示 + 情報パネルは表示されません + 情報パネルは表示されます + + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + + 「チャットのリプレイ」ボタンを非表示 + プレーヤー オーバーレイの「チャットのリプレイ」ボタンは表示されません + プレーヤー オーバーレイの「チャットのリプレイ」ボタンは表示されます + 医療情報パネルを非表示 + 医療情報パネルは表示されません + 医療情報パネルは表示されます + クイック アクションを非表示 + 全画面表示モードのクイック アクションは表示されません + 全画面表示モードのクイック アクションは表示されます + 関連動画を非表示 + クイック アクション内の関連動画 (その他の動画) は表示されません + クイック アクション内の関連動画 (その他の動画) は表示されます + チャンネル登録者のガイドラインを非表示 + チャンネル登録者のコミュニティ ガイドラインは表示されません + チャンネル登録者のコミュニティ ガイドラインは表示されます + Timed Reaction を非表示 + Timed reaction は表示されません\n\nライブ配信のチャット欄に常駐するハート マーク ボタンが非表示になります + Timed reaction は表示されます\n\nライブ配信のチャット欄にハート マーク ボタンが常駐します + 動画のタイトルを非表示 + 全画面表示モードの動画のタイトルはプレーヤー オーバーレイに表示されません + 全画面表示モードの動画のタイトルはプレーヤー オーバーレイに表示されます + 「AI 生成による動画の要約」を非表示 + 「AI 生成による動画の要約」セクションは表示されません + 「AI 生成による動画の要約」セクションは表示されます + 「質問する」を非表示 + 「質問する」セクションは表示されません + 「質問する」セクションは表示されます + 関連情報を非表示 + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されません + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されます + チャプターを非表示 + チャプター セクションは表示されません + チャプター セクションは表示されます + 「コースの進捗状況」を非表示 + 「コースの進捗状況」セクションは表示されません + 「コースの進捗状況」セクションは表示されます + 「ポッドキャストを検索」と「このコースを見る」を非表示 + 「ポッドキャストを検索」セクションと「このコースを見る」セクションは表示されません + 「ポッドキャストを検索」セクションと「このコースを見る」セクションは表示されます + 「このコースを見る」を非表示 + 「このコースを見る」セクションは表示されません + 「このコースを見る」セクションは表示されます + 「ポッドキャストを検索」を非表示 + 「ポッドキャストを検索」セクションは表示されません + 「ポッドキャストを検索」セクションは表示されます + 「ポッドキャストを検索」を非表示 + 「ポッドキャストを検索」セクションは表示されません + 「ポッドキャストを検索」セクションは表示されます + おすすめリンクを非表示 + 情報カード セクション内のおすすめリンク セクションは表示されません + 情報カード セクション内のおすすめリンク セクションは表示されます + 「注目の場所」を非表示 + 「注目の場所」セクションは表示されません + 「注目の場所」セクションは表示されます + おすすめ動画を非表示 + 情報カード セクション内のおすすめ動画セクションは表示されません + 情報カード セクション内のおすすめ動画セクションは表示されます + フィードのフライアウト メニューのフィルタを有効化 + フィードのフライアウト メニューのフィルタは有効です + フィードのフライアウト メニューのフィルタは無効です + フィードのフライアウト メニューのフィルタ + 非表示にするフライアウト メニューのメニュー名を改行区切りで入力します + 「ゲーム」を非表示 + ゲーム セクションは表示されません + ゲーム セクションは表示されます + 「作成の裏側」を非表示 + 「作成の裏側」セクションは表示されません + 「作成の裏側」セクションは表示されます + ハイプポイントを非表示 + ハイプポイントは表示されません + ハイプポイントは表示されます + 情報カードを非表示 + 情報カード セクションは表示されません + 情報カード セクションは表示されます + 「主な概念」を非表示 + 主な概念セクションは表示されません + 主な概念セクションが表示されます + 「音楽」を非表示 + 音楽セクションは表示されません + 音楽セクションは表示されます + チャンネル登録ボタンを非表示 + 情報カード セクション内のチャンネル登録ボタンは表示されません + 情報カード セクション内のチャンネル登録ボタンは表示されます + 文字起こしを非表示 + 文字起こしセクションは表示されません + 文字起こしセクションは表示されます + クイズを非表示 + クイズ セクションは表示されません + クイズ セクションは表示されます + 概要欄 + 概要欄のコンポーネントを表示または非表示にします + フィルタバー + フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします + フィードで非表示 + フィードには表示されません + フィードには表示されます + 関連動画で非表示 + 関連動画には表示されません + 関連動画には表示されます + 検索結果で非表示 + 検索結果には表示されません + 検索結果には表示されます + 再生履歴で非表示 + 再生履歴には表示されません + 再生履歴には表示されます + チャンネル ページ + チャンネル ページのコンポーネントを表示または非表示にします + チャンネル ページのタブのフィルタを有効化 + チャンネル ページのタブのフィルタは有効です + チャンネル ページのタブのフィルタは無効です + チャンネル ページのタブのフィルタ + 非表示にするチャンネル ページのタブのタブ名を改行区切りで入力します + + コミュニティ ボタンを非表示 + コミュニティ ボタンは表示されません + コミュニティ ボタンは表示されます + + 「おすすめ」欄を非表示 + 「おすすめ」欄は表示されません + 「おすすめ」欄は表示されます + + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + リンクのプレビューを非表示 + リンクのプレビューは表示されません + リンクのプレビューは表示されます + メンバー欄を非表示 + メンバー欄は表示されません + メンバー欄は表示されます + + ストアボタンを非表示 + ストアボタンは表示されません + ストアボタンは表示されます + + チャンネル登録ボタンを非表示 + チャンネル登録ボタンは表示されません + チャンネル登録ボタンは表示されます + コメント + コメント セクションのコンポーネントを表示または非表示にします + AI による「チャットの要約」を非表示 + AI による「チャットの要約」は表示されません + AI による「チャットの要約」は表示されます + AI によるコメントの要約を非表示 + AI によるコメントの要約は表示されません\n\nコメント欄のヘッダーにはトピックボタンは表示されません + AI によるコメントの要約は表示されます\n\nコメント欄のヘッダーにはトピックボタンが表示されます + チャンネルのガイドラインを非表示 + チャンネルのガイドラインは表示されません + チャンネルのガイドラインは表示されます + 「メンバーによるコメント」ヘッダーを非表示 + 「メンバーによるコメント」ヘッダーは表示されません + 「メンバーによるコメント」ヘッダーは表示されます + コメント セクションを非表示 + コメント セクションは表示されません + コメント セクションは表示されます + コミュニティ ガイドラインを非表示 + コミュニティ ガイドラインは表示されません + コミュニティ ガイドラインは表示されます + 「ショートを作成」ボタンを非表示 + 「ショートを作成」ボタンは表示されません + 「ショートを作成」ボタンは表示されます + 絵文字ボタンとタイムスタンプ ボタンを非表示 + 絵文字ボタンとタイムスタンプ ボタンは表示されません + 絵文字ボタンとタイムスタンプ ボタンは表示されます + コメントのプレビューを非表示 + コメントのプレビューは表示されません + コメントのプレビューは表示されます + Thanks ボタンを非表示 + Thanks ボタンは表示されません + Thanks ボタンは表示されます + 視聴回数を非表示 + 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されません + 視聴回数はフィードおよび検索結果の動画のタイトル下に表示されます + + "制限事項: +• ショート欄、チャンネル ページ、検索結果では、引き続き視聴回数が表示される場合がある。 +• この機能は Automotive レイアウトでは動作しない。" + 公開日時を非表示 + 公開日時はフィードおよび検索結果の動画のタイトル下に表示されません\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます + 公開日時はフィードおよび検索結果の動画のタイトル下に表示されます\n\n公開日時は、公開後の動画の場合は公開からの経過時間で表記されます + + "制限事項: +• ショート欄、チャンネル ページ、検索結果では、引き続き公開日時が表示される場合がある。 +• この機能は Automotive レイアウトでは動作しない。" + キーワードでコンテンツを非表示 + キーワード フィルタを使用してフィード、検索結果に表示される動画を除外します + ホームの動画をキーワードで非表示 + ホームタブの動画はキーワードでフィルタリングされます + ホームタブの動画はキーワードでフィルタリングされません + 検索結果をキーワードで非表示 + 検索結果はキーワードでフィルタリングされます + 検索結果はキーワードでフィルタリングされません + 登録チャンネルの動画をキーワードで非表示 + 登録チャンネルタブの動画はキーワードでフィルタリングされます + 登録チャンネルタブの動画はキーワードでフィルタリングされません + キーワード + - "除外するためのキーワードとなる単語やフレーズのリスト (改行区切り) + "除外するためのキーワードとなる単語やフレーズのリスト (改行区切り) キーワードには、除外したい動画のチャンネル名もしくはタイトルの一部を指定することができます 単語の途中に大文字が含まれる場合は、大文字のまま入力する必要があります (例: iPhone、TikTok、LeBlanc)" - キーワード フィルタリングについて - "ホーム / 登録チャンネル / 検索結果でキーワードに合致する動画を除外します - -制限事項 + キーワード フィルタリングについて + "ホーム / 登録チャンネル / 検索結果でキーワードに合致する動画を除外します +制限事項: • ショート動画はチャンネル名の合致では除外できない • 一部の UI コンポーネントが残ってしまう場合がある • キーワードで検索したとき、結果が表示されない場合がある" - 単語全体で合致 - - キーワードを二重引用符で囲むことで、動画のタイトルやチャンネル名に含まれる単語の一部分とキーワードが合致しないようにできます<br><br>例えば、<br><b>\"ai\"</b>は、次の動画を除外します:<b>How does AI work?</b><br>しかし、次の動画は除外しません:<b>What does fair use mean?</b> - - 使用できないキーワード: %s - 二重引用符が必要なキーワード: %s - 矛盾する宣言があるキーワード: %s - 短すぎて引用符が必要なキーワード: %s - 全動画を除外するキーワード: %s - - - クリエイターのストア欄を非表示 - 動画プレーヤー下のクリエイターのストア欄は表示されません - 動画プレーヤー下のクリエイターのストア欄は表示されます - 終了画面のストアバナーを非表示 - 終了画面のストアバナーは表示されません - 終了画面のストアバナーは表示されます - 全画面広告を非表示 - "全画面広告は表示されません - -この機能は、古いデバイスでのみ利用できます" - 全画面広告は表示されます - - 全画面広告の非表示は古いデバイス専用です - 一般的な広告を非表示 - 一般的な広告は表示されません - 一般的な広告は表示されます - 商品バナーを非表示 - 商品バナーは表示されません - 商品バナーは表示されます - 「プロモーションを含みます」ラベルを非表示 - 「プロモーションを含みます」ラベルは表示されません - 「プロモーションを含みます」ラベルは表示されます - 自己宣伝カードを非表示 - 自己宣伝カードは表示されません - 自己宣伝カードは表示されます - 商品へのリンクを非表示 - 動画の概要欄の商品へのリンクは表示されません - 動画の概要欄の商品へのリンクは表示されます - 「商品を表示」バナーを非表示 - 「商品を表示」バナーは動画オーバーレイに表示されません - 「商品を表示」バナーは動画オーバーレイに表示されます - ウェブ検索結果を非表示 - ウェブ検索結果は表示されません - ウェブ検索結果は表示されます - - - YouTube Premium の広告を非表示 - 動画プレーヤー下の YouTube Premium の広告は表示されません - 動画プレーヤー下の YouTube Premium の広告は表示されます - - - 動画広告を非表示 - 動画広告は表示されません - 動画広告は表示されます - - - URL をクリップボードにコピーしました - タイムスタンプ付きの URL がコピーされました - 「動画の URL をコピー」ボタンを表示 - 「動画のURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます - 「動画のURLをコピー」ボタンはプレーヤー オーバーレイに表示されません - 「タイムスタンプ付き URL をコピー」ボタンを表示 - 「タイムスタンプ付きURLをコピー」ボタンがプレーヤー オーバーレイに表示されます。タップするとタイムスタンプ付きの動画の URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます - 「タイムスタンプ付きURLをコピー」ボタンはプレーヤー オーバーレイに表示されません - - - 「ご自身の責任」ダイアログを削除 - ダイアログは削除されます - ダイアログは表示されます - この機能によって年齢制限が回避される訳ではありません。自動的に承認するだけです。 - - - 「テレビでログイン」ポップアップを無効化 - 「テレビでログイン」ポップアップは無効です - 「テレビでログイン」ポップアップは有効です - - - ダブルタップ時のチャプター スキップを無効化 - ダブルタップしたときに、次または前のチャプターへスキップしてしまうことはありません - ダブルタップしたときに、たまに次または前のチャプターへスキップしてしまうことがあります - - - 外部ダウンロード - 外部ダウンローダーの設定 - 外部ダウンロード ボタンを表示 - 外部ダウンロード ボタンがプレーヤー オーバーレイに表示されます - 外部ダウンロード ボタンはプレーヤー オーバーレイに表示されません - - オフライン ボタンの動作を上書き - オフライン ボタンは外部ダウンローダーを呼び出します - オフライン ボタンはアプリ内のダウンローダーを呼び出します - 外部ダウンローダーのパッケージ名 - インストール済みの外部ダウンローダー アプリのパッケージ名 - パッケージ名を入力してください - その他 - アプリがインストールされていません - %s はインストールされていません。インストールしてください。 - "パッケージ名「%s」のインストール済みアプリが見つかりませんでした + 単語全体で合致 + + キーワードを二重引用符で囲むことで、動画のタイトルやチャンネル名に含まれる単語の一部分とキーワードが合致しないようにできます<br><br>例えば、<br><b>\"ai\"</b>は、次の動画を除外します:<b>How does AI work?</b><br>しかし、次の動画は除外しません:<b>What does fair use mean?</b> + + 使用できないキーワード: %s + 二重引用符が必要なキーワード: %s + 矛盾する宣言があるキーワード: %s + 短すぎて引用符が必要なキーワード: %s + 全動画を除外するキーワード: %s + + + 終了画面のストアバナーを非表示 + 終了画面のストアバナーは表示されません + 終了画面のストアバナーは表示されます + 全画面広告を非表示 + 全画面広告は表示されません + 全画面広告は表示されます + 一般的な広告を非表示 + 一般的な広告は表示されません + 一般的な広告は表示されます + 商品バナーを非表示 + 商品バナーは表示されません + 商品バナーは表示されます + 「プロモーションを含みます」ラベルを非表示 + 「プロモーションを含みます」ラベルは表示されません + 「プロモーションを含みます」ラベルは表示されます + プレーヤーのポップアップ広告を非表示 + プレーヤーのポップアップ広告は表示されません + プレーヤーのポップアップ広告は表示されます + 自己宣伝カードを非表示 + 自己宣伝カードは表示されません + 自己宣伝カードは表示されます + 商品へのリンクを非表示 + 動画の概要欄の商品へのリンクは表示されません + 動画の概要欄の商品へのリンクは表示されます + 「商品を表示」バナーを非表示 + 「商品を表示」バナーはプレーヤー オーバーレイに表示されません + 「商品を表示」バナーはプレーヤー オーバーレイに表示されます + YouTube Premium の広告を非表示 + YouTube Premium の広告は表示されません + YouTube Premium の広告は表示されます + + + 動画広告を非表示 + 動画広告は表示されません + 動画広告は表示されます + + + URL をクリップボードにコピーしました + タイムスタンプ付きの URL をコピーしました + 「動画の URL をコピー」ボタンを表示 + プレーヤー オーバーレイに「動画の URL をコピー」ボタンが表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます + プレーヤー オーバーレイに「動画の URL をコピー」ボタンは表示されません + 「タイムスタンプ付き URL をコピー」ボタンを表示 + プレーヤー オーバーレイに「タイムスタンプ付き URL をコピー」ボタンが表示されます。タップするとタイムスタンプ付きの動画の URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます + プレーヤー オーバーレイに「タイムスタンプ付き URL をコピー」ボタンは表示されません + + + 「ご自身の責任」ダイアログを削除 + ダイアログは削除されます + ダイアログは表示されます + この機能によって年齢制限が回避される訳ではありません。自動的に承認するだけです。 + + + 「テレビでログイン」ポップアップを無効化 + 「テレビでログイン」ポップアップは無効です + 「テレビでログイン」ポップアップは有効です + + + ダブルタップ時のチャプター スキップを無効化 + ダブルタップしたときに、次または前のチャプターへスキップしてしまうことはありません + ダブルタップしたときに、たまに次または前のチャプターへスキップしてしまうことがあります + + + 外部ダウンロード + 外部ダウンローダーの設定 + 外部ダウンロード ボタンを表示 + プレーヤー オーバーレイに外部ダウンロード ボタンが表示されます + プレーヤー オーバーレイに外部ダウンロード ボタンは表示されません + + オフライン ボタンの動作を上書き + オフライン ボタンは外部ダウンローダーを呼び出します + オフライン ボタンはアプリ内のダウンローダーを呼び出します + 外部ダウンローダーのパッケージ名 + インストール済みの外部ダウンローダー アプリのパッケージ名 + パッケージ名を入力してください + その他 + アプリがインストールされていません + %s はインストールされていません。インストールしてください。 + "パッケージ名「%s」のインストール済みアプリが見つかりませんでした パッケージ名が正しいこと、アプリがインストールされていることを確認してください" - パッケージ名は空欄にはできません - - - 精密シーク ジェスチャーを無効化 - 精密シーク ジェスチャーは無効です。シークバーを上へスワイプしても、「再生位置の細かい調整」モードにはなりません - 精密シーク ジェスチャーは有効です。シークバーを上へスワイプすると、「再生位置の細かい調整」モードになります - - - タップによるシークを有効化 - タップによるシークは有効です。シークバーをタップすると、タップした位置に移動します - タップによるシークは無効です。シークバーをタップしても、タップした位置に移動しません - - - 明るさジェスチャーを有効化 - "全画面表示モードの明るさジェスチャーは有効です + パッケージ名は空欄にはできません + + + 精密シーク ジェスチャーを無効化 + 精密シーク ジェスチャーは無効です。シークバーを上へスワイプしても、「再生位置の細かい調整」モードにはなりません + 精密シーク ジェスチャーは有効です。シークバーを上へスワイプすると、「再生位置の細かい調整」モードになります + + + タップによるシークを有効化 + タップによるシークは有効です。シークバーをタップすると、タップした位置に移動します + タップによるシークは無効です。シークバーをタップしても、タップした位置に移動しません + + + 明るさジェスチャーを有効化 + "全画面表示モードの明るさジェスチャーは有効です 画面左側を縦にスワイプして明るさを調節します" - 全画面表示モードの明るさジェスチャーは無効です - 音量ジェスチャーを有効化 - "全画面表示モードの音量ジェスチャーは有効です + 全画面表示モードの明るさジェスチャーは無効です + 音量ジェスチャーを有効化 + "全画面表示モードの音量ジェスチャーは有効です 画面右側を縦にスワイプして音量を調節します" - 全画面表示モードの音量ジェスチャーは無効です - 長押しスワイプ ジェスチャーを有効化 - 長押しスワイプは有効です\n\n明るさ / 音量ジェスチャーの開始には、画面の長押しが必要です - 長押しスワイプは無効です\n\n明るさ / 音量ジェスチャーの開始には、画面の長押しは必要ありません - 触覚フィードバックを有効化 - 触覚フィードバックは有効です - 触覚フィードバックは無効です - 明るさを保存 & 復元 - 全画面表示を終了 / 開始するときに明るさを保存 / 復元します - 全画面表示を終了 / 開始するときに明るさを保存 / 復元しません - 明るさジェスチャーの自動調節を有効化 - ジェスチャーで明るさを最小値まで下げると、明るさが自動で調節されます - ジェスチャーで明るさを最小値まで下げても、明るさは自動で調節されません - 自動 - オーバーレイの表示時間 - スワイプ オーバーレイが表示される時間 (ミリ秒) - オーバーレイの背景の透明度 - 透明度の範囲は 0-100 で、0 が透明です - スワイプ: 透明度の範囲は 0-100 です - オーバーレイの明るさグラフの色 - スワイプ中の明るさの現在値を視覚的に表示するグラフの色 - オーバーレイの音量グラフの色 - スワイプ中の音量の現在値を視覚的に表示するグラフの色 - オーバーレイのテキストサイズ - スワイプ オーバーレイのテキストサイズ (1-30) - テキストサイズの範囲は 1-30 です - スワイプのしきい値 - ジェスチャーと判定される最小のスワイプ距離 - 音量ジェスチャーのスワイプ感度 - スワイプによる音量の変化量 - オーバーレイのスタイル - 横型 - 横型(シンプル - 画面上部) - 横型(シンプル - 画面中央) - 円形 - 円形(シンプル) - 縦型 - 縦型(シンプル) - スワイプによる動画の切り替えを有効化 - 全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります - 全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません - - - 自動字幕表示を無効化 - 自動字幕表示は無効です\n\n字幕がオフの状態で動画を開きます - 自動字幕表示は有効です\n\n字幕がオンの状態で動画を開く場合があります - - - アクション ボタン - プレーヤー画面下のボタンを表示または非表示にします - 高評価とチャンネル登録のエフェクトを無効化 - 高評価ボタンとチャンネル登録ボタンのエフェクトは無効です - 高評価ボタンとチャンネル登録ボタンのエフェクトは有効です - 高評価ボタンと低評価ボタンを非表示 - 高評価ボタンと低評価ボタンは表示されません - 高評価ボタンと低評価ボタンは表示されます - - 共有ボタンを非表示 - 共有ボタンは表示されません - 共有ボタンは表示されます - - 「広告の停止」ボタンを非表示 - 「広告の停止」ボタンは表示されません - 「広告の停止」ボタンは表示されます - - コメントボタンを非表示 - コメントボタンは表示されません - コメントボタンは表示されます - - 報告ボタンを非表示 - 報告ボタンは表示されません - 報告ボタンは表示されます - - リミックス ボタンを非表示 - リミックス ボタンは表示されません - リミックス ボタンは表示されます - - オフライン ボタンを非表示 - オフライン ボタンは表示されません - オフライン ボタンは表示されます - - ハイプボタンを非表示 - ハイプボタンは表示されません - ハイプボタンは表示されます - - プロモーション ボタンを非表示 - プロモーション ボタンは表示されません - プロモーション ボタンは表示されます - - Thanks ボタンを非表示 - Thanks ボタンは表示されません - Thanks ボタンは表示されます - - 「質問する」ボタンを非表示 - 「質問する」ボタンは表示されません - 「質問する」ボタンは表示されます - - クリップボタンを非表示 - クリップボタンは表示されません - クリップボタンは表示されます - - 購入ボタンを非表示 - 購入ボタンは表示されません - 購入ボタンは表示されます - - 保存ボタンを非表示 - 保存ボタンは表示されません - 保存ボタンは表示されます - - - ナビゲーション ボタン - ナビゲーション バーのボタンを変更または非表示にします - - 「ホーム」を非表示 - ホームボタンは表示されません - ホームボタンは表示されます - - 「ショート」を非表示 - ショートボタンは表示されません - ショートボタンは表示されます - - 「作成」を非表示 - 作成ボタンは表示されません - 作成ボタンは表示されます - - 「登録チャンネル」を非表示 - 登録チャンネル ボタンは表示されません - 登録チャンネル ボタンは表示されます - 「通知」を非表示 - 通知ボタンは表示されません - 通知ボタンは表示されます - - 「作成」と「通知」を入れ替え - "作成ボタンと通知ボタンが入れ替わります - -注: この設定を有効にすることにより、動画広告も強制的に非表示になります" - 作成ボタンと通知ボタンは入れ替わりません - "この設定を無効にすると、ショート動画の広告ブロックも無効になります。 - -この設定を変更しても効果がない場合は、シークレット モードに切り替えてみてください。" - ボタンをアイコンのみで表示 - ナビゲーション ボタンはアイコンのみで表示されます - ナビゲーション ボタンはアイコンと文字で表示されます - 半透明ステータスバーを無効化 - ステータスバーは常に透けません - ステータスバーは状況に応じて透けます - 一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう場合があります。 - ライトモードの半透明バーを無効化 - ライトモードではナビゲーション バーは透けません - ライトモードではナビゲーション バーが状況に応じて透けます - ダークモードの半透明バーを無効化 - ダークモードではナビゲーション バーは透けません - ダークモードではナビゲーション バーが状況に応じて透けます - - - フライアウト メニュー - プレーヤー オーバーレイの歯車アイコンボタンから呼び出されるフライアウト メニューの項目を表示または非表示にします - - 「字幕」を非表示 - 「字幕」は表示されません - 「字幕」は表示されます - - 「その他の設定」を非表示 - 「その他の設定」は表示されません - 「その他の設定」は表示されます - - 「スリープ タイマー」を非表示 - 「スリープ タイマー」は表示されません - 「スリープ タイマー」は表示されます - - 「動画のループ再生」を非表示 - 「動画のループ再生」は表示されません - 「動画のループ再生」は表示されます - - 「アンビエント モード」を非表示 - 「アンビエント モード」は表示されません - 「アンビエント モード」は表示されます - 「一定音量」を非表示 - 「一定音量」は表示されます - 「一定音量」は表示されません - - 「ヘルプとフィードバック」を非表示 - 「ヘルプとフィードバック」は表示されません - 「ヘルプとフィードバック」は表示されます - - 「再生速度」を非表示 - 「再生速度」は表示されません - 「再生速度」は表示されます - - 「画面のロック」を非表示 - 「画面のロック」は表示されません - 「画面のロック」は表示されます - - 「YouTube Music で聴く」を非表示 - 「YouTube Music で聴く」は表示されません - 「YouTube Music で聴く」は表示されます - - 「音声トラック」を非表示 - 「音声トラック」は表示されません - 「音声トラック」は表示されます - + 共有ボタンを非表示 + 共有ボタンは表示されません + 共有ボタンは表示されます + + 「広告の停止」ボタンを非表示 + 「広告の停止」ボタンは表示されません + 「広告の停止」ボタンは表示されます + + コメントボタンを非表示 + コメントボタンは表示されません + コメントボタンは表示されます + + 報告ボタンを非表示 + 報告ボタンは表示されません + 報告ボタンは表示されます + + リミックス ボタンを非表示 + リミックス ボタンは表示されません + リミックス ボタンは表示されます + + オフライン ボタンを非表示 + オフライン ボタンは表示されません + オフライン ボタンは表示されます + + ハイプボタンを非表示 + ハイプボタンは表示されません + ハイプボタンは表示されます + + プロモーション ボタンを非表示 + プロモーション ボタンは表示されません + プロモーション ボタンは表示されます + + Thanks ボタンを非表示 + Thanks ボタンは表示されません + Thanks ボタンは表示されます + + 「質問する」ボタンを非表示 + 「質問する」ボタンは表示されません + 「質問する」ボタンは表示されます + + クリップボタンを非表示 + クリップボタンは表示されません + クリップボタンは表示されます + この非表示機能は、一部のユーザー アカウントでは動作しない場合があります。 + + 購入ボタンを非表示 + 購入ボタンは表示されません + 購入ボタンは表示されます + + 保存ボタンを非表示 + 保存ボタンは表示されません + 保存ボタンは表示されます + + + ナビゲーション ボタン + ナビゲーション バーのボタンを変更または非表示にします + + 「ホーム」を非表示 + ホームボタンは表示されません + ホームボタンは表示されます + + 「ショート」を非表示 + ショートボタンは表示されません + ショートボタンは表示されます + + 「作成」を非表示 + 作成ボタンは表示されません + 作成ボタンは表示されます + + 「登録チャンネル」を非表示 + 登録チャンネル ボタンは表示されません + 登録チャンネル ボタンは表示されます + 「通知」を非表示 + 通知ボタンは表示されません + 通知ボタンは表示されます + + 「作成」と「通知」を入れ替え + 「作成」ボタンと「通知」ボタンが入れ替わります + 作成ボタンと通知ボタンは入れ替わりません + この設定を変更しても反映されない場合は、シークレットモードに切り替えてみてください。 + ボタンをアイコンのみで表示 + ナビゲーション ボタンはアイコンのみで表示されます + ナビゲーション ボタンはアイコンと文字で表示されます + ナビゲーション ボタンの間を詰める + ナビゲーション ボタンは間隔を詰めて表示されます + ナビゲーション ボタンは間隔を詰めずに表示されます + ナビゲーション バーのアニメーションを有効化 + ナビゲーションの遷移がアニメーション表示されます + ナビゲーションの遷移はアニメーション表示されません + 半透明ステータスバーを無効化 + ステータスバーは透けません + ステータスバーは状況に応じて透けます + "制限事項: +• 動画プレーヤーの上部に黒いバーが表示される場合がある。 +• 一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう場合がある。" + ライトモードの半透明バーを無効化 + ライトモードではナビゲーション バーは透けません + ライトモードではナビゲーション バーが状況に応じて透けます + ダークモードの半透明バーを無効化 + ダークモードではナビゲーション バーは透けません + ダークモードではナビゲーション バーが状況に応じて透けます + ツールバー + 画面上部に表示されるツールバーのコンポーネントを変更または非表示にします + 作成ボタンを非表示 + 作成ボタンは表示されません + 作成ボタンは表示されます + 通知ボタンを非表示 + 通知ボタンは表示されません + 通知ボタンは表示されます + 検索ボタンを非表示 + 検索ボタンは表示されません + 検索ボタンは表示されます. + ワイド検索バーを有効化 + ワイド検索バーは有効です + ワイド検索バーは無効です + + + フライアウト メニュー + プレーヤー オーバーレイの歯車アイコンボタンから呼び出されるフライアウト メニューの項目を表示または非表示にします + + 「字幕」を非表示 + 「字幕」は表示されません + 「字幕」は表示されます + + 「その他の設定」を非表示 + 「その他の設定」は表示されません + 「その他の設定」は表示されます + + 「スリープ タイマー」を非表示 + 「スリープ タイマー」は表示されません + 「スリープ タイマー」は表示されます + + 「動画のループ再生」を非表示 + 「動画のループ再生」は表示されません + 「動画のループ再生」は表示されます + + 「アンビエント モード」を非表示 + 「アンビエント モード」は表示されません + 「アンビエント モード」は表示されます + 「一定音量」を非表示 + 「一定音量」は表示されます + 「一定音量」は表示されません + + 「ヘルプとフィードバック」を非表示 + 「ヘルプとフィードバック」は表示されません + 「ヘルプとフィードバック」は表示されます + + 「再生速度」を非表示 + 「再生速度」は表示されません + 「再生速度」は表示されます + + 「画面のロック」を非表示 + 「画面のロック」は表示されません + 「画面のロック」は表示されます + + 「YouTube Music で聴く」を非表示 + 「YouTube Music で聴く」は表示されません + 「YouTube Music で聴く」は表示されます + + 「音声トラック」を非表示 + 「音声トラック」は表示されません + 「音声トラック」は表示されます + - "「音声トラック」は表示されません + "「音声トラック」は表示されません 「音声トラック」を表示するには、[動画ストリームを偽装] を「Android No SDK」に変更してください" - - 「VR で見る」を非表示 - 「VR で見る」は表示されません - 「VR で見る」は表示されます - 「画質」を非表示 - 「画質」は表示されません - 「画質」は表示されます - 画質メニューの脚注を非表示 - 画質メニューの脚注は表示されません - 画質メニューの脚注は表示されます - - - 自動再生ボタンを非表示 - 自動再生ボタンはプレーヤー オーバーレイに表示されません - 自動再生ボタンはプレーヤー オーバーレイに表示されます - - 字幕ボタンを非表示 - 字幕ボタンはプレーヤー オーバーレイに表示されません - 字幕ボタンはプレーヤー オーバーレイに表示されます - キャストボタンを非表示 - キャストボタンはプレーヤー オーバーレイに表示されません - キャストボタンはプレーヤー オーバーレイに表示されます - プレーヤー コントロールの背景を非表示 - プレーヤー コントロールの背景は表示されません - プレーヤー コントロールの背景は表示されます - 前の動画ボタンと次の動画ボタンを非表示 - 前の動画ボタンと次の動画ボタンは表示されません - 前の動画ボタンと次の動画ボタンは表示されます - - - 終了画面カードを非表示 - 終了画面カードは表示されません - 終了画面カードは表示されます - - - 全画面表示中のアンビエント モードを無効化 - 全画面表示中のアンビエント モードは無効です - 全画面表示中のアンビエント モードは有効です - - - 情報カードを非表示 - 情報カードはプレーヤー画面に表示されません - 情報カードはプレーヤー画面に表示されます - - - 数字の回転アニメーションを無効化 - 数字の回転アニメーションは無効です - 数字の回転アニメーションは有効です - - - プレーヤーのシークバーを非表示 - 動画プレーヤーのシークバーは表示されません - 動画プレーヤーのシークバーは表示されます - - サムネイルのシークバーを非表示 - フィードや再生履歴などの動画のサムネイルのシークバーは表示されません - フィードや再生履歴などの動画のサムネイルのシークバーは表示されます - - - ショート プレーヤー - ショート プレーヤーのコンポーネントを表示または非表示にします - - ホームフィードでショートを非表示 - ホームフィードおよび関連動画にはショート動画は表示されません - ホームフィードおよび関連動画にはショート動画が表示されます - 検索結果でショートを非表示 - 検索結果にはショート動画は表示されません - 検索結果にはショート動画が表示されます - - 登録チャンネル フィードでショートを非表示 - 登録チャンネル フィードにはショート動画は表示されません - 登録チャンネル フィードにはショート動画が表示されます - 再生履歴でショートを非表示 - 再生履歴にはショート動画は表示されません - 再生履歴にはショート動画が表示されます - 「吹替版」ラベルを非表示 - 「吹替版」ラベルは表示されません - 「吹替版」ラベルは表示されます - 「Super Thanks を購入する」ボタンを非表示 - 「Super Thanks を購入する」ボタンは表示されません - 「Super Thanks を購入する」ボタンは表示されます - 効果ボタンを非表示 - 効果ボタンは表示されません - 効果ボタンは表示されます - グリーン スクリーン ボタンを非表示 - グリーン スクリーン ボタンは表示されません - グリーン スクリーン ボタンは表示されます - ハッシュタグ ボタンを非表示 - ハッシュタグ ボタンは表示されません - ハッシュタグ ボタンは表示されます - - 「メンバーになる」ボタンを非表示 - 「メンバーになる」ボタンは表示されません - 「メンバーになる」ボタンは表示されます - ライブ プレビューを非表示 - ライブ プレビューは表示されません - ライブ プレビューは表示されます - 位置情報ラベルを非表示 - 位置情報ラベルは表示されません - 位置情報ラベルは表示されます - 「新しい投稿」ボタンを非表示 - 「新しい投稿」ボタンは表示されません - 「新しい投稿」ボタンは表示されます - 一時停止オーバーレイのボタンを非表示 - 一時停止オーバーレイのボタンは表示されません - 一時停止オーバーレイのボタンは表示されます - コメントのプレビューを非表示 - コメントのプレビューは表示されません - コメントのプレビューは表示されます - 「音楽を保存」ボタンを非表示 - 「音楽を保存」ボタンは表示されません - 「音楽を保存」ボタンは表示されます - 検索候補を非表示 - 検索候補は表示されません - 検索候補は表示されます - 購入ボタンを非表示 - 購入ボタンは表示されません - 購入ボタンは表示されます - ステッカーを非表示 - ステッカーは表示されません - ステッカーは表示されます - チャンネル登録ボタンを非表示 - チャンネル登録ボタンは表示されません - チャンネル登録ボタンは表示されます - タグ付けされた商品を非表示 - タグ付けされた商品は表示されません - タグ付けされた商品は表示されます - 今後の動画ボタンを非表示 - 今後の動画ボタンは表示されません - 今後の動画ボタンは表示されます - 「このサウンドを使用する」ボタンを非表示 - 「このサウンドを使用する」ボタンは表示されません - 「このサウンドを使用する」ボタンは表示されます - 「このテンプレートを使用する」ボタンを非表示 - 「このテンプレートを使用する」ボタンは表示されません - 「このテンプレートを使用する」ボタンは表示されます - 高評価ボタンの噴水アニメーションを非表示 - 高評価ボタンの噴水アニメーションは表示されません - 高評価ボタンの噴水アニメーションは表示されます - 高評価ボタンを非表示 - 高評価ボタンは表示されません - 高評価ボタンは表示されます - 低評価ボタンを非表示 - 低評価ボタンは表示されません - 低評価ボタンは表示されます - コメントボタンを非表示 - コメントボタンは表示されません - コメントボタンは表示されます - - 共有ボタンを非表示 - 共有ボタンは表示されません - 共有ボタンは表示されます - - リミックス ボタンを非表示 - リミックス ボタンは表示されません - リミックス ボタンは表示されます - サウンドボタンを非表示 - サウンドボタンは表示されません - サウンドボタンは表示されます - 情報パネルを非表示 - 情報パネルは表示されません - 情報パネルは表示されます - チャンネルバーを非表示 - チャンネルバーは表示されません - チャンネルバーは表示されます - 動画のタイトルを非表示 - 動画のタイトルは表示されません - 動画のタイトルは表示されます - サウンド メタデータ ラベルを非表示 - サウンド メタデータ ラベルは表示されません - サウンド メタデータ ラベルは表示されます - 関連動画へのリンクを非表示 - 関連動画へのリンクは表示されません - 関連動画へのリンクは表示されます - ナビゲーション バーを非表示 - ナビゲーション バーは表示されません - ナビゲーション バーは表示されます - - - 終了画面の「関連動画」を非表示 - "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます + + 「VR で見る」を非表示 + 「VR で見る」は表示されません + 「VR で見る」は表示されます + 「画質」を非表示 + 「画質」は表示されません + 「画質」は表示されます + 画質メニューの脚注を非表示 + 画質メニューの脚注は表示されません + 画質メニューの脚注は表示されます + + + 自動再生ボタンを非表示 + 自動再生ボタンはプレーヤー オーバーレイに表示されません + 自動再生ボタンはプレーヤー オーバーレイに表示されます + + 字幕ボタンを非表示 + 字幕ボタンはプレーヤー オーバーレイに表示されません + 字幕ボタンはプレーヤー オーバーレイに表示されます + キャストボタンを非表示 + キャストボタンはプレーヤー オーバーレイに表示されません + キャストボタンはプレーヤー オーバーレイに表示されます + 最小化ボタンを非表示 + 最小化ボタンはプレーヤー オーバーレイに表示されません + 最小化ボタンはプレーヤー オーバーレイに表示されます + 全画面表示ボタンを非表示 + 全画面表示ボタンはプレーヤー オーバーレイに表示されません + 全画面表示ボタンはプレーヤー オーバーレイに表示されます + プレーヤー コントロールの背景を非表示 + プレーヤー コントロールの背景は表示されません + プレーヤー コントロールの背景は表示されます + 前の動画ボタンと次の動画ボタンを非表示 + 前の動画ボタンと次の動画ボタンは表示されません + 前の動画ボタンと次の動画ボタンは表示されます + + + 終了画面カードを非表示 + 終了画面カードは表示されません + 終了画面カードは表示されます + + + 全画面表示中のアンビエント モードを無効化 + 全画面表示中のアンビエント モードは無効です + 全画面表示中のアンビエント モードは有効です + + + 情報カードを非表示 + 情報カードはプレーヤー画面に表示されません + 情報カードはプレーヤー画面に表示されます + + + 数字の回転アニメーションを無効化 + 数字の回転アニメーションは無効です + 数字の回転アニメーションは有効です + + + プレーヤーのシークバーを非表示 + 動画プレーヤーのシークバーは表示されません + 動画プレーヤーのシークバーは表示されます + + サムネイルのシークバーを非表示 + フィードや再生履歴などの動画のサムネイルのシークバーは表示されません + フィードや再生履歴などの動画のサムネイルのシークバーは表示されます + 全画面表示のシークバーを拡大 + 全画面表示モードのシークバーを大きいサイズで表示します + 全画面表示モードのシークバーを通常のサイズで表示します + + + ショート プレーヤー + ショート プレーヤーのコンポーネントを表示または非表示にします + チャンネル ページでショートを非表示 + チャンネル ページにはショート動画は表示されません + チャンネル ページにはショート動画が表示されます + + ホームフィードでショートを非表示 + ホームフィードおよび関連動画にはショート動画は表示されません + ホームフィードおよび関連動画にはショート動画が表示されます + 検索結果でショートを非表示 + 検索結果にはショート動画は表示されません + 検索結果にはショート動画が表示されます + + 登録チャンネル フィードでショートを非表示 + 登録チャンネル フィードにはショート動画は表示されません + 登録チャンネル フィードにはショート動画が表示されます + 動画の概要欄でショートを非表示 + 動画の概要欄にはショート動画は表示されません + 動画の概要にはショート動画が表示されます + 再生履歴でショートを非表示 + 再生履歴にはショート動画は表示されません + 再生履歴にはショート動画が表示されます + AI ボタンを非表示 + AI ボタンは表示されません + AI ボタンは表示されます + 「吹替版」ラベルを非表示 + 「吹替版」ラベルは表示されません + 「吹替版」ラベルは表示されます + 「オートダビング」ラベルを非表示 + 「オートダビング」ラベルは表示されません + 「オートダビング」ラベルは表示されます + 「Super Thanks を購入する」ボタンを非表示 + 「Super Thanks を購入する」ボタンは表示されません + 「Super Thanks を購入する」ボタンは表示されます + 効果ボタンを非表示 + 効果ボタンは表示されません + 効果ボタンは表示されます + グリーン スクリーン ボタンを非表示 + グリーン スクリーン ボタンは表示されません + グリーン スクリーン ボタンは表示されます + ハッシュタグ ボタンを非表示 + ハッシュタグ ボタンは表示されません + ハッシュタグ ボタンは表示されます + + 「メンバーになる」ボタンを非表示 + 「メンバーになる」ボタンは表示されません + 「メンバーになる」ボタンは表示されます + ライブ プレビューを非表示 + ライブ プレビューは表示されません + ライブ プレビューは表示されます + 位置情報ラベルを非表示 + 位置情報ラベルは表示されません + 位置情報ラベルは表示されます + 「新しい投稿」ボタンを非表示 + 「新しい投稿」ボタンは表示されません + 「新しい投稿」ボタンは表示されます + 一時停止オーバーレイのボタンを非表示 + 一時停止オーバーレイのボタンは表示されません + 一時停止オーバーレイのボタンは表示されます + コメントのプレビューを非表示 + コメントのプレビューは表示されません + コメントのプレビューは表示されます + 「音楽を保存」ボタンを非表示 + 「音楽を保存」ボタンは表示されません + 「音楽を保存」ボタンは表示されます + 検索候補を非表示 + 検索候補は表示されません + 検索候補は表示されます + 購入ボタンを非表示 + 購入ボタンは表示されません + 購入ボタンは表示されます + ステッカーを非表示 + ステッカーは表示されません + ステッカーは表示されます + チャンネル登録ボタンを非表示 + チャンネル登録ボタンは表示されません + チャンネル登録ボタンは表示されます + タグ付けされた商品を非表示 + タグ付けされた商品は表示されません + タグ付けされた商品は表示されます + 今後の動画ボタンを非表示 + 今後の動画ボタンは表示されません + 今後の動画ボタンは表示されます + 「このサウンドを使用する」ボタンを非表示 + 「このサウンドを使用する」ボタンは表示されません + 「このサウンドを使用する」ボタンは表示されます + 「このテンプレートを使用する」ボタンを非表示 + 「このテンプレートを使用する」ボタンは表示されません + 「このテンプレートを使用する」ボタンは表示されます + + 高評価ボタンの噴水アニメーションを非表示 + 高評価ボタンの噴水アニメーションは表示されません + 高評価ボタンの噴水アニメーションは表示されます + 高評価ボタンを非表示 + 高評価ボタンは表示されません + 高評価ボタンは表示されます + 低評価ボタンを非表示 + 低評価ボタンは表示されません + 低評価ボタンは表示されます + コメントボタンを非表示 + コメントボタンは表示されません + コメントボタンは表示されます + + 共有ボタンを非表示 + 共有ボタンは表示されません + 共有ボタンは表示されます + + リミックス ボタンを非表示 + リミックス ボタンは表示されません + リミックス ボタンは表示されます + サウンドボタンを非表示 + サウンドボタンは表示されません + サウンドボタンは表示されます + 情報パネルを非表示 + 情報パネルは表示されません + 情報パネルは表示されます + チャンネルバーを非表示 + チャンネルバーは表示されません + チャンネルバーは表示されます + 動画のタイトルを非表示 + 動画のタイトルは表示されません + 動画のタイトルは表示されます + サウンド メタデータ ラベルを非表示 + サウンド メタデータ ラベルは表示されません + サウンド メタデータ ラベルは表示されます + 関連動画へのリンクを非表示 + 関連動画へのリンクは表示されません + 関連動画へのリンクは表示されます + ナビゲーション バーを非表示 + ナビゲーション バーは表示されません + ナビゲーション バーは表示されます + + + 自動再生のプレビューを非表示 + 自動再生の「次の動画」のプレビューは表示されません + 自動再生の「次の動画」のプレビューは表示されます + + + 終了画面の「関連動画」を非表示 + "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます 自動再生の設定は YouTube の設定で変更できます: [設定] > [再生] > [次の動画を自動再生]" - 終了画面の「関連動画」は表示されます - - - 関連動画オーバーレイを非表示 - 全画面表示モードの関連動画オーバーレイは表示されません - 全画面表示モードの関連動画オーバーレイは表示されます - - - 動画のタイムスタンプを非表示 - 動画の現在位置を示すタイムスタンプは表示されません - 動画の現在位置を示すタイムスタンプは表示されます - - - プレーヤー ポップアップ パネルを非表示 - プレーヤー ポップアップ パネルは表示されません\n\nプレイリストやライブ配信のチャット欄などを閉じた状態で動画を開きます - プレーヤー ポップアップ パネルは表示されます\n\nプレイリストやライブ配信のチャット欄などを展開した状態で動画を開きます - - - 再生終了時に全画面表示を解除 - 無効 - 縦画面 - 横画面 - 縦画面 & 横画面 - - - 縦画面の全画面表示で動画を開く - 縦画面の全画面表示で動画を開きます - 通常表示で動画を開きます - - - プレーヤー オーバーレイの透明度 - 透明度の範囲は 0-100 で、0 が透明です - プレーヤー: 透明度の範囲は 0-100 です - - - - 低評価数表示は一時的に利用できません (API タイムアウト) - 低評価数表示は利用できません (status %d) - 低評価数表示は利用できません (API のレート制限) - 低評価数表示は利用できません (%s) - - Return YouTube Dislike: 投票するには、再読み込みが必要です - - 非公開 - Return YouTube Dislike - 低評価数は表示されます - 低評価数は表示されません - ショート動画の低評価数を表示 - "ショート動画の低評価数は表示されます + 終了画面の「関連動画」は表示されます + + + 関連動画オーバーレイを非表示 + 全画面表示モードの関連動画オーバーレイは表示されません + 全画面表示モードの関連動画オーバーレイは表示されます + + + 動画のタイムスタンプを非表示 + 動画の現在位置を示すタイムスタンプは表示されません + 動画の現在位置を示すタイムスタンプは表示されます + + + プレーヤー ポップアップ パネルを非表示 + プレーヤー ポップアップ パネルは表示されません\n\nプレイリストやライブ配信のチャット欄などを閉じた状態で動画を開きます + プレーヤー ポップアップ パネルは表示されます\n\nプレイリストやライブ配信のチャット欄などを展開した状態で動画を開きます + + + 再生終了時に全画面表示を解除 + 無効 + 縦画面 + 横画面 + 縦画面 & 横画面 + + + 縦画面の全画面表示で動画を開く + 縦画面の全画面表示で動画を開きます + 通常表示で動画を開きます + + + プレーヤー オーバーレイの透明度 + 透明度の範囲は 0-100 で、0 が透明です + プレーヤー: 透明度の範囲は 0-100 です + + + + 低評価数表示は一時的に利用できません (API タイムアウト) + 低評価数表示は利用できません (status %d) + 低評価数表示は利用できません (API のレート制限) + 低評価数表示は利用できません (%s) + + Return YouTube Dislike: 投票するには再読み込みが必要です + + 非公開 + Return YouTube Dislike + 低評価数は表示されます + 低評価数は表示されません + ショートの低評価数を表示 + "ショート動画の低評価数は表示されます 制限事項: シークレット モードでは低評価数が表示されない場合があります" - ショート動画の低評価数は表示されません - 低評価をパーセントで表示 - 低評価はパーセントで表示されます - 低評価は投票数で表示されます - - コンパクトな高評価ボタン - コンパクトな横幅の高評価ボタンが表示されます - 通常の高評価ボタンが表示されます - 高評価の推定値を表示 - 高評価数が非公開の動画には推定値が表示されます - 高評価の推定値は表示されません - API 利用不可時にトーストを表示 - Return YouTube Dislike が利用できない場合にトースト通知が表示されます - Return YouTube Dislike が利用できない場合にトースト通知は表示されません - ReturnYouTubeDislike.com - データは Return YouTube Dislike API によって提供されています。詳細は、ここをタップしてください - - このデバイスの ReturnYouTubeDislike API 統計情報 - API の応答時間 (平均) - API の応答時間 (最小) - API の応答時間 (最大) - API の応答時間 (直近) - 低評価数表示は一時的に利用できません。クライアント API のレート制限が原因です - API の投票数取得 (呼び出し回数) - ネットワーク呼び出しは実行されていません - %d 回のネットワーク呼び出しが実行されました - API の投票数取得 (タイムアウト回数) - ネットワーク呼び出しはタイムアウトしていません - %d 回のネットワーク呼び出しがタイムアウトしました - API クライアントのレート制限 - クライアントのレート制限には遭遇していません - クライアントのレート制限に %d 回遭遇しました - %d ミリ秒 - - - ワイド検索バーを有効化 - ワイド検索バーは有効です - ワイド検索バーは無効です - - - 高画質サムネイルを有効化 - シークバー サムネイルは高画質です - シークバー サムネイルは中画質です - プレーヤー画面全体表示のシークバー サムネイルは高画質です - プレーヤー画面全体表示のシークバー サムネイルは中画質です - "この機能を有効にすると、シークバー サムネイルを保持していないライブ配信でもシークバー サムネイルが表示されるようになります。 - -シークバー サムネイルは、再生中の動画と同じ画質になります。 - -この機能は、非常に高速なインターネット接続を使用して 720P 以下の画質で動画を視聴する場合に最適です。" - 古いシークバー サムネイルを復元 - シーク中のサムネイルはシークバーの上に表示されます - シーク中のサムネイルはプレーヤー画面全体に表示されます - - - SponsorBlock - SponsorBlock を有効化 - SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です - 外観 - 投票ボタンを表示 - セグメントへの投票ボタンがプレーヤー オーバーレイに表示されます - セグメントへの投票ボタンはプレーヤー オーバーレイに表示されません - ボタンとコントロールを直角化 - ボタンとコントロールの角は直角です - ボタンとコントロールの角は丸角です - - コンパクトなスキップボタンを使用 - コンパクトなスキップボタンが表示されます - 通常のスキップボタンが表示されます - スキップボタンを自動的に非表示 - スキップボタンは、表示された数秒後に自動的に非表示になります - スキップボタンは、セグメントの開始から終了まで表示されます - スキップボタンの表示時間 - 「ハイライトまでスキップ」ボタンと「スキップボタンを自動的に非表示」がオンのときのその他のスキップボタンが、自動的に非表示になるまでの時間の長さ - 自動スキップ時にトーストを表示 - セグメントが自動的にスキップされたときにトースト通知が表示されます。このトースト通知をタップすると、スキップを取り消すことができます - セグメントが自動的にスキップされたときにトースト通知は表示されません。このトースト通知をタップすると、スキップを取り消すことができます - スキップ トーストの表示時間 - セグメントが自動的にスキップされたときに表示されるトースト通知が、自動的に非表示になるまでの時間の長さ - 1 秒 - 2 秒 - 3 秒 - 4 秒 - 5 秒 - 6 秒 - 7 秒 - 8 秒 - 9 秒 - 10 秒 - セグメントを除いた再生時間を表示 - すべてのセグメントを除いた再生時間がシークバーに表示されます - 動画全体の再生時間のみがシークバーに表示されます - 新しいセグメントの作成 - セグメント作成ボタンを表示 - セグメント作成ボタンがプレーヤー オーバーレイに表示されます - セグメント作成ボタンはプレーヤー オーバーレイに表示されません - セグメントの位置調整幅 - セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒) - 値は正の整数でなければなりません - ガイドラインを見る - ガイドラインには、新しいセグメントを作成するためのルールやヒントが記載されています - ガイドラインに従ってください - 新しいセグメントを作成する前に SponsorBlock のガイドラインを確認してください - 既読 - 表示する - その他 - API 利用不可時にトーストを表示 - SponsorBlock が利用できない場合にトースト通知が表示されます - SponsorBlock が利用できない場合にトースト通知は表示されません - スキップデータの収集を有効化 - SponsorBlock リーダーボード にスキップによって節約した時間を送信します。セグメントをスキップする度にデータが送信されます - スキップデータの収集は無効です - セグメントの長さのしきい値 - この値 (秒) よりも短い時間のセグメントは、スキップもプレーヤーに表示もされません - 時間 (長さ) の値が無効です - 非公開ユーザー ID - この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます - 非公開ユーザー ID は 30 文字以上必要です - API URL を変更 - SponsorBlock がサーバーとの通信で使用するアドレス - API URL をリセットしました - API URL が無効です - API URL を変更しました - 設定のインポート / エクスポート - コピー - SponsorBlock の設定を JSON 形式のテキストでインポート / エクスポートします。この JSON テキストは他のプラットフォームでも利用可能です - SponsorBlock の設定を他のプラットフォームでも利用可能な JSON 形式のテキストでインポート / エクスポートします。この JSON テキストには非公開ユーザー ID が含まれています。このテキストを共有する際は十分注意してください - 設定のインポートに成功しました - インポートに失敗しました: %s - エクスポートに失敗しました: %s - "あなたの設定テキストには、SponsorBlock の非公開ユーザー ID が含まれています。 + ショート動画の低評価数は表示されません + 低評価をパーセントで表示 + 低評価はパーセントで表示されます + 低評価は投票数で表示されます + + コンパクトな高評価ボタン + コンパクトな横幅の高評価ボタンが表示されます + 通常の高評価ボタンが表示されます + 高評価の推定値を表示 + 高評価数が非公開の動画には推定値が表示されます + 高評価の推定値は表示されません + API 利用不可時にトーストを表示 + Return YouTube Dislike が利用できない場合にトースト通知が表示されます + Return YouTube Dislike が利用できない場合にトースト通知は表示されません + ReturnYouTubeDislike.com + データは Return YouTube Dislike API によって提供されています。詳細は、ここをタップしてください + + このデバイスの ReturnYouTubeDislike API 統計情報 + API の応答時間 (平均) + API の応答時間 (最小) + API の応答時間 (最大) + API の応答時間 (直近) + 低評価数表示は一時的に利用できません。クライアント API のレート制限が原因です + API の投票数取得 (呼び出し回数) + ネットワーク呼び出しは実行されていません + %d 回のネットワーク呼び出しが実行されました + API の投票数取得 (タイムアウト回数) + ネットワーク呼び出しはタイムアウトしていません + %d 回のネットワーク呼び出しがタイムアウトしました + API クライアントのレート制限 + クライアントのレート制限には遭遇していません + クライアントのレート制限に %d 回遭遇しました + %d ミリ秒 + + + SponsorBlock + SponsorBlock を有効化 + SponsorBlock は、ユーザーからの情報提供により YouTube 動画のわずらわしい部分をスキップする機能です + 外観 + 投票ボタンを表示 + プレーヤー オーバーレイにセグメントへの投票ボタンが表示されます + プレーヤー オーバーレイにセグメントへの投票ボタンは表示されません + ボタンとコントロールを直角化 + ボタンとコントロールの角は直角です + ボタンとコントロールの角は丸角です + + コンパクトなスキップボタンを使用 + コンパクトなスキップボタンが表示されます + 通常のスキップボタンが表示されます + スキップボタンを自動的に非表示 + スキップボタンは、表示された数秒後に自動的に非表示になります + スキップボタンは、セグメントの開始から終了まで表示されます + スキップボタンの表示時間 + 「ハイライトまでスキップ」ボタンと「スキップボタンを自動的に非表示」がオンのときのその他のスキップボタンが、自動的に非表示になるまでの時間の長さ + 自動スキップ時にトーストを表示 + セグメントが自動的にスキップされたときにトースト通知が表示されます。このトースト通知をタップすると、スキップを取り消すことができます + セグメントが自動的にスキップされたときにトースト通知は表示されません。このトースト通知をタップすると、スキップを取り消すことができます + スキップ トーストの表示時間 + セグメントが自動的にスキップされたときに表示されるトースト通知が、自動的に非表示になるまでの時間の長さ + 1 秒 + 2 秒 + 3 秒 + 4 秒 + 5 秒 + 6 秒 + 7 秒 + 8 秒 + 9 秒 + 10 秒 + セグメントを除いた再生時間を表示 + すべてのセグメントを除いた再生時間がシークバーに表示されます + 動画全体の再生時間のみがシークバーに表示されます + 新しいセグメントの作成 + セグメント作成ボタンを表示 + プレーヤー オーバーレイにセグメント作成ボタンが表示されます + プレーヤー オーバーレイにセグメント作成ボタンは表示されません + セグメントの位置調整幅 + セグメント作成メニュー内の早送り / 巻き戻しボタンで移動する時間 (ミリ秒) + 値は正の整数でなければなりません + ガイドラインを見る + ガイドラインには、新しいセグメントを作成するためのルールやヒントが記載されています + ガイドラインに従ってください + 新しいセグメントを作成する前に SponsorBlock のガイドラインを確認してください + 既読 + 表示する + その他 + API 利用不可時にトーストを表示 + SponsorBlock が利用できない場合にトースト通知が表示されます + SponsorBlock が利用できない場合にトースト通知は表示されません + スキップデータの収集を有効化 + SponsorBlock リーダーボード にスキップによって節約した時間を送信します。セグメントをスキップする度にデータが送信されます + スキップデータの収集は無効です + セグメントの長さのしきい値 + この値 (秒) よりも短い時間のセグメントは、スキップもプレーヤーに表示もされません + 時間 (長さ) の値が無効です + 非公開ユーザー ID + この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます + 非公開ユーザー ID は 30 文字以上必要です + API URL を変更 + SponsorBlock がサーバーとの通信で使用するアドレス + API URL をリセットしました + API URL が無効です + API URL を変更しました + 設定のインポート / エクスポート + コピー + SponsorBlock の設定を JSON 形式のテキストでインポート / エクスポートします。この JSON テキストは ReVanced およびその他のプラットフォームで利用可能です + SponsorBlock の設定を ReVanced およびその他のプラットフォームで利用可能な JSON 形式のテキストでインポート / エクスポートします。この JSON テキストには非公開ユーザー ID が含まれています。このテキストを共有する際は十分注意してください + 設定のインポートに成功しました + インポートに失敗しました: %s + エクスポートに失敗しました: %s + "あなたの設定テキストには、SponsorBlock の非公開ユーザー ID が含まれています。 このユーザー ID は、パスワードのようなものであり、決して共有すべきではありません。" - 今後表示しない - セグメントに対する動作を変更 - スポンサー (広告) - 有料の宣伝、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は、このカテゴリには含まれません - 無報酬の宣伝 / 自己宣伝 - 無報酬または自己宣伝である、という点以外は「スポンサー」と同様です。商品、寄付、コラボ相手に関する宣伝などを含みます - 視聴者への催促 (登録) - 動画内に挿入される、高評価、チャンネル登録、フォローなどを視聴者にうながす短時間の催促。時間的に長い場合またはイベントなどの個別具体的なものに関する催促の場合は、このカテゴリではなく「自己宣伝」に分類すべきです - ハイライト - 動画の中で最も重要な場面 - 幕間 / オープニング (OP) - 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリには含まれません - 終了画面 / クレジット (ED) - クレジットまたは YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリには含まれません - フック / あいさつ - 今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。他の部分に存在しない内容や情報を追加する場面は、このカテゴリには含まれません - 予告編 / 総集編 - その動画またはシリーズ内の他の動画で過去に起きたこと、または今後起こることを示すクリップのコレクション。このクリップ群に含まれるすべての情報は、同じ動画の他の部分やシリーズ内の他の動画で繰り返されます - 余談 / 冗談 - 動画の本筋を理解するために必要のない脱線的な場面または冗談。コンテキストや背景情報を提供する場面は、このカテゴリには含まれません - 音楽: 楽曲以外の区間 - ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間であり、公式や他のメディアの音源に存在しない部分 - スキップ - ハイライト - 広告をスキップ - 自己宣伝をスキップ - 登録をスキップ - ハイライトまでスキップ - OP をスキップ - 幕間をスキップ - 幕間をスキップ - ED をスキップ - フックをスキップ - 予告編をスキップ - 予告編をスキップ - 総集編をスキップ - 余談をスキップ - 楽曲以外をスキップ - セグメントをスキップ - スポンサー (広告) をスキップしました - 自己宣伝をスキップしました - 視聴者への催促 (登録) をスキップしました - ハイライトまでスキップしました - オープニング (OP) をスキップしました - 幕間をスキップしました - 幕間をスキップしました - エンディング (ED) をスキップしました - フックをスキップしました - 予告編をスキップしました - 予告編をスキップしました - 総集編をスキップしました - 余談をスキップしました - 楽曲以外の区間をスキップしました - 未送信のセグメントをスキップしました - 複数のセグメントをスキップしました - 自動的にスキップ - 1 回だけ自動的にスキップ - スキップボタンを表示 - シークバーに表示 - 無効 - セグメントの送信に失敗しました: %s - SponsorBlock は一時的にダウンしています - セグメントの送信に失敗しました (status: %1$d %2$s) - セグメントの送信に失敗しました (レート制限: 同じユーザー / IP からの通信が多すぎます) - セグメントを送信できません: %s - "セグメントを送信できません。 + 今後表示しない + セグメントに対する動作を変更 + スポンサー (広告) + 有料の宣伝、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は、このカテゴリには含まれません + 無報酬の宣伝 / 自己宣伝 + 無報酬または自己宣伝である、という点以外は「スポンサー」と同様です。商品、寄付、コラボ相手に関する宣伝などを含みます + 視聴者への催促 (登録) + 動画内に挿入される、高評価、チャンネル登録、フォローなどを視聴者にうながす短時間の催促。時間的に長い場合またはイベントなどの個別具体的なものに関する催促の場合は、このカテゴリではなく「自己宣伝」に分類すべきです + ハイライト + 動画の中で最も重要な場面 + 幕間 / オープニング (OP) + 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリには含まれません + 終了画面 / クレジット (ED) + クレジットまたは YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリには含まれません + フック / あいさつ + 今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。他の部分に存在しない内容や情報を追加する場面は、このカテゴリには含まれません + 予告編 / 総集編 + その動画またはシリーズ内の他の動画で過去に起きたこと、または今後起こることを示すクリップのコレクション。このクリップ群に含まれるすべての情報は、同じ動画の他の部分やシリーズ内の他の動画で繰り返されます + 余談 / 冗談 + 動画の本筋を理解するために必要のない脱線的な場面または冗談。コンテキストや背景情報を提供する場面は、このカテゴリには含まれません + 音楽: 楽曲以外の区間 + ミュージック ビデオ専用。ミュージック ビデオの中で楽曲が流れていない区間であり、公式や他のメディアの音源に存在しない区間 + スキップ + ハイライト + 広告をスキップ + 自己宣伝をスキップ + 登録をスキップ + ハイライトまでスキップ + OP をスキップ + 幕間をスキップ + 幕間をスキップ + ED をスキップ + フックをスキップ + 予告編をスキップ + 予告編をスキップ + 総集編をスキップ + 余談をスキップ + 楽曲以外をスキップ + セグメントをスキップ + スポンサー (広告) をスキップしました + 自己宣伝をスキップしました + 視聴者への催促 (登録) をスキップしました + ハイライトまでスキップしました + オープニング (OP) をスキップしました + 幕間をスキップしました + 幕間をスキップしました + エンディング (ED) をスキップしました + フックをスキップしました + 予告編をスキップしました + 予告編をスキップしました + 総集編をスキップしました + 余談をスキップしました + 楽曲以外の区間をスキップしました + 未送信のセグメントをスキップしました + 複数のセグメントをスキップしました + 自動的にスキップ + 1 回だけ自動的にスキップ + スキップボタンを表示 + シークバーに表示 + 無効 + セグメントの送信に失敗しました: %s + SponsorBlock は一時的にダウンしています + セグメントの送信に失敗しました (status: %1$d %2$s) + セグメントの送信に失敗しました (レート制限: 同じユーザー / IP からの通信が多すぎます) + セグメントを送信できません: %s + "セグメントを送信できません。 すでに存在します" - セグメントの送信に成功しました - - SponsorBlock は一時的に利用できません (API タイムアウト) - SponsorBlock は一時的に利用できません (status %d) - SponsorBlock は一時的に利用できません - セグメントへの投票に失敗しました (API タイムアウト) - セグメントへの投票に失敗しました (status: %1$d %2$s) - セグメントへの投票に失敗しました: %s - 高評価 - 低評価 - カテゴリの変更 - 投票可能なセグメントがありません - - %1$s ~ %2$s - セグメントのカテゴリを選択してください - カテゴリが「無効」に設定されています。送信するには、設定を変更してください。 - 新しいセグメント - %s を SponsorBlock の新しいセグメントの開始位置 / 終了位置に設定しますか? - 開始位置 - 終了位置 - 現在の再生位置 - セグメントの開始位置 - セグメントの終了位置 - 範囲は正確ですか? - "セグメントの範囲: + セグメントの送信に成功しました + + SponsorBlock は一時的に利用できません (API タイムアウト) + SponsorBlock は一時的に利用できません (status %d) + SponsorBlock は一時的に利用できません + セグメントへの投票に失敗しました (API タイムアウト) + セグメントへの投票に失敗しました (status: %1$d %2$s) + セグメントへの投票に失敗しました: %s + 高評価 + 低評価 + カテゴリの変更 + 投票可能なセグメントがありません + + %1$s ~ %2$s + セグメントのカテゴリを選択してください + カテゴリが「無効」に設定されています。送信するには、設定を変更してください。 + 新しいセグメント + %s を SponsorBlock の新しいセグメントの開始位置 / 終了位置に設定しますか? + 開始位置 + 終了位置 + 現在の再生位置 + セグメントの開始位置 + セグメントの終了位置 + 範囲は正確ですか? + "セグメントの範囲: %1$s から @@ -1291,376 +1375,378 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が (%3$s) 送信しますか?" - 開始位置を終了位置よりも前にしてください - 先に開始位置と終了位置を設定してください - セグメントをテストしてスムーズにスキップすることを確認してください - セグメントの範囲を手動で編集 - セグメントの開始位置または終了位置を編集しますか? - 時間 (位置) の値が無効です - 統計 - - 統計情報は一時的に利用できません (API がダウンしています) - 読み込み中… - SponsorBlock は無効です - ユーザー名: <b>%s</b> - ユーザー名を変更するには、ここをタップしてください - ユーザー名の変更に失敗しました (status: %1$d %2$s) - ユーザー名の変更に成功しました - あなたの評価は <b>%.2f</b> です - 合計で <b>%s</b> 個のセグメントを作成しました - 作成したセグメントを表示するには、ここをタップしてください - SponsorBlock リーダーボード - 合計で <b>%s</b> 個のセグメントからユーザーを救いました - 全体の統計とセグメント作成者のランキングを表示するには、ここをタップしてください - 時間にすると <b>%s</b> です。<br>リーダーボードを表示するには、ここをタップしてください - 合計で <b>%s</b> 個のセグメントをスキップしました - 時間にすると <b>%s</b> です - スキップしたセグメントの合計をリセットしますか? - %1$s 時間 %2$s 分 - %1$s 分 %2$s 秒 - %s 秒 - 透明度: - 色: - SponsorBlock について - sponsor.ajay.app - データは SponsorBlock API によって提供されています。詳細を確認するまたは他のプラットフォーム版をダウンロードするには、ここをタップしてください - - - レイアウトの種類 - デフォルト - スマートフォン - タブレット - Automotive - "以下の変更を伴います: + 開始位置を終了位置よりも前にしてください + 先に開始位置と終了位置を設定してください + セグメントのテスト機能でスムーズにスキップすることを確認してください + セグメントの範囲を手動で編集 + セグメントの開始位置または終了位置を編集しますか? + 時間 (位置) の値が無効です + 統計 + + 統計情報は一時的に利用できません (API がダウンしています) + 読み込み中… + SponsorBlock が無効です + ユーザー名: <b>%s</b> + ユーザー名を変更するには、ここをタップしてください + ユーザー名の変更に失敗しました (status: %1$d %2$s) + ユーザー名の変更に成功しました + あなたの評価は <b>%.2f</b> です + 合計で <b>%s</b> 個のセグメントを作成しました + 作成したセグメントを表示するには、ここをタップしてください + SponsorBlock リーダーボード + 合計で <b>%s</b> 個のセグメントからユーザーを救いました + 全体の統計とセグメント作成者のランキングを表示するには、ここをタップしてください + 時間にすると <b>%s</b> です。<br>リーダーボードを表示するには、ここをタップしてください + 合計で <b>%s</b> 個のセグメントをスキップしました + 時間にすると <b>%s</b> です + スキップしたセグメントの合計をリセットしますか? + %1$s 時間 %2$s 分 + %1$s 分 %2$s 秒 + %s 秒 + 透明度: + 色: + SponsorBlock について + sponsor.ajay.app + データは SponsorBlock API によって提供されています。詳細を確認するまたは他のプラットフォーム版をダウンロードするには、ここをタップしてください + + + レイアウトの種類 + デフォルト + スマートフォン + タブレット + Automotive + "以下の変更を伴います: タブレット レイアウト • コミュニティ投稿が表示されない Automotive レイアウト -• ショート動画を通常のプレーヤーで開く +• ショート動画が通常のプレーヤーで再生される • フィードがトピックやチャンネルごとに分類された形で表示される" - - - アプリのバージョンを偽装 - アプリのバージョンは偽装されています - アプリのバージョンは偽装されていません - "アプリのバージョンを YouTube の古いバージョンに偽装します。 + + + アプリのバージョンを偽装 + アプリのバージョンは偽装されています + アプリのバージョンは偽装されていません + "アプリのバージョンを YouTube の古いバージョンに偽装します。 アプリの外観と機能が変化しますが、予期せぬ副作用が発生する可能性があります。 再び偽装を無効にする場合には、UI の不具合を防ぐためにアプリデータを消去することを推奨します。" - アプリバージョンの偽装先 - 20.13.41 - アクション ボタンの文字表示を復元 - 20.05.46 - 文字起こし機能を復元 - 19.35.36 - ショート プレーヤーの古いアイコンを復元 - 19.01.34 - 古いナビゲーション アイコンを復元 - - - スタート画面を変更 - デフォルト - すべての登録チャンネル - チャンネル一覧 - コース / 学び - 探索 - ファッションと美容 - ゲーム - 履歴 - マイページ - 高く評価した動画 - ライブ - 映画とテレビ - 音楽 - ニュース - 通知 - 再生リスト - 検索 - ショッピング - ショート - スポーツ - 登録チャンネル - 急上昇 - バーチャル リアリティ - 後で見る - 自分のクリップ - スタート画面の変更を常時適用 - "スタート画面の変更は常時適用されます + アプリバージョンの偽装先 + 20.13.41 - アクション ボタンの文字表示を復元 + 20.05.46 - 文字起こし機能を復元 + + + スタート画面を変更 + デフォルト + すべての登録チャンネル + チャンネル一覧 + コース / 学び + 探索 + ファッションと美容 + ゲーム + 履歴 + マイページ + 高く評価した動画 + ライブ + 映画とテレビ + 音楽 + ニュース + 通知 + 再生リスト + 検索 + ショッピング + ショート + スポーツ + 登録チャンネル + 急上昇 + バーチャル リアリティ + 後で見る + 自分のクリップ + スタート画面の変更を常時適用 + "スタート画面の変更は常時適用されます 制限事項: ツールバーの [戻る] ボタンが機能しない可能性があります" - スタート画面の変更はアプリの起動時にのみ適用されます - - - ショート プレーヤーの再開を無効化 - ショート プレーヤーはアプリ起動時に再開されません - ショート プレーヤーはアプリ起動時に再開されます - - - ショートを開くプレーヤー - ショート プレーヤー - 通常のプレーヤー - 通常のプレーヤー (全画面) - - - ショート動画の自動再生 - ショート動画は自動再生されます - ショート動画はループ再生されます - ショート動画の自動再生 (バックグラウンド) - バックグラウンドのショート動画は自動再生されます - バックグラウンドのショート動画はループ再生されます - - - ミニプレーヤー - アプリ内に表示される小さな画面のプレーヤーのスタイルを変更します - ミニプレーヤーの種類 - 無効 - デフォルト - 旧タイプ(横長) - タブレット - 新タイプ 1 - 新タイプ 2 - 新タイプ 3 - 新タイプ 4 - ミニプレーヤーを直角化 - ミニプレーヤーの角は直角です - ミニプレーヤーの角は丸角です - ダブルタップとピンチによるサイズ変更を有効化 - "ダブルタップとピンチによるサイズ変更は有効です + スタート画面の変更はアプリの起動時にのみ適用されます + + + ショート プレーヤーの再開を無効化 + ショート プレーヤーはアプリ起動時に再開されません + ショート プレーヤーはアプリ起動時に再開されます + + + ショートを開くプレーヤー + ショート プレーヤー + 通常のプレーヤー + 通常のプレーヤー (全画面) + + + ショート動画の自動再生 + ショート動画は自動再生されます + ショート動画はループ再生されます + ショート動画の自動再生 (バックグラウンド) + バックグラウンドのショート動画は自動再生されます + バックグラウンドのショート動画はループ再生されます + + + ミニプレーヤー + アプリ内に表示される小さな画面のプレーヤーのスタイルを変更します + ミニプレーヤーの種類 + 無効 + デフォルト + 旧タイプ(横長) + タブレット + 新タイプ 1 + 新タイプ 2 + 新タイプ 3 + 新タイプ 4 + ミニプレーヤーを直角化 + ミニプレーヤーの角は直角です + ミニプレーヤーの角は丸角です + ダブルタップとピンチによるサイズ変更を有効化 + "ダブルタップとピンチによるサイズ変更は有効です • ダブルタップするとミニプレーヤーのサイズが大きくなる • もう一度ダブルタップすると元のサイズに戻る" - ダブルタップとピンチによるサイズ変更は無効です - ドラッグ&ドロップを無効化 - ドラッグ&ドロップは無効です - "ドラッグ&ドロップは有効です + ダブルタップとピンチによるサイズ変更は無効です + ドラッグ&ドロップを無効化 + ドラッグ&ドロップは無効です + "ドラッグ&ドロップは有効です ミニプレーヤーをドラッグして画面の四隅に移動できます" - 横方向ドラッグ ジェスチャーを無効化 - 横方向ドラッグ ジェスチャーは無効です - "横方向ドラッグ ジェスチャーは有効です + 横方向ドラッグ ジェスチャーを無効化 + 横方向ドラッグ ジェスチャーは無効です + "横方向ドラッグ ジェスチャーは有効です ミニプレーヤーを画面の左端または右端までドラッグして最小化できます" - オーバーレイ ボタンを非表示 - オーバーレイ ボタンは表示されません - オーバーレイ ボタンは表示されます - 展開ボタンと閉じるボタンを非表示 - "ボタンは表示されません + オーバーレイ ボタンを非表示 + オーバーレイ ボタンは表示されません + オーバーレイ ボタンは表示されます + 展開ボタンと閉じるボタンを非表示 + "ボタンは表示されません 展開するまたは閉じるには、スワイプしてください" - 展開ボタンと閉じるボタンは表示されます - サブテキストを非表示 - サブテキストは表示されません - サブテキストは表示されます - 早送りボタンと巻き戻しボタンを非表示 - 早送りボタンと巻き戻しボタンは表示されません - 早送りボタンと巻き戻しボタンは表示されます - デフォルトのサイズ - 画面に表示される際の大きさ (ピクセル) - ピクセルサイズの範囲は %1$s-%2$s です - オーバーレイの透明度 - 透明度の範囲は 0-100 で、0 が透明です - ミニプレーヤー: 透明度の範囲は 0-100 です - - - グラデーションの読み込み画面を有効化 - 画面読み込み時にグラデーションの背景が表示されます - 画面読み込み時に通常の背景が表示されます - スプラッシュ画面のスタイル - カラー - 白黒 - 編集したシークバーの色を有効化 - シークバーは編集した色で表示されます - シークバーはデフォルトの色で表示されます - シークバーの色 - シークバーの色を編集します - シークバーのアクセント カラー - シークバーのアクセントカラーを編集します - シークバーの色の値が無効です - - - YouTube ReVanced - YT ReVanced - YT - - - ヘッダーロゴ - デフォルト - 標準 - Premium - ReVanced - - ReVanced(シンプル) - カスタム - - - 画像表示の地域制限を回避 - yt4.ggpht.com から画像を取得します - "オリジナルの画像ホストから画像を取得します + 展開ボタンと閉じるボタンは表示されます + サブテキストを非表示 + サブテキストは表示されません + サブテキストは表示されます + 早送りボタンと巻き戻しボタンを非表示 + 早送りボタンと巻き戻しボタンは表示されません + 早送りボタンと巻き戻しボタンは表示されます + デフォルトのサイズ + 画面に表示される際の大きさ (ピクセル) + ピクセルサイズの範囲は %1$s-%2$s です + オーバーレイの透明度 + 透明度の範囲は 0-100 で、0 が透明です + ミニプレーヤー: 透明度の範囲は 0-100 です + + + グラデーションの読み込み画面を有効化 + 画面読み込み時にグラデーションの背景が表示されます + 画面読み込み時に通常の背景が表示されます + スプラッシュ画面のスタイル + 無効 + カラー + 白黒 + 編集したシークバーの色を有効化 + シークバーは編集した色で表示されます + シークバーはデフォルトの色で表示されます + シークバーの色 + シークバーの色を編集します + シークバーのアクセント カラー + シークバーのアクセントカラーを編集します + シークバーの色の値が無効です + + + YouTube ReVanced + YT ReVanced + YT + + + ヘッダーロゴ + デフォルト + 標準 + Premium + ReVanced + + ReVanced(シンプル) + カスタム + + + 画像表示の地域制限を回避 + yt4.ggpht.com から画像を取得します + "オリジナルの画像ホストから画像を取得します この機能を有効にすると、一部の地域でブロックされている画像が表示されるようになる可能性があります" - - - - ホームタブ - - 登録チャンネルタブ - - マイページタブ - プレーヤーのプレイリスト & 関連動画 - 検索結果 - オリジナルのサムネイル - DeArrow & オリジナル - DeArrow & 静止画 - 静止画サムネイル - DeArrow - "DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。これを有効にすると、動画の URL が API サーバーに送信されますが、他のデータは送信されません。動画に DeArrow サムネイルがない場合は、オリジナルのサムネイルまたは静止画サムネイルが表示されます + + + + ホームタブ + + 登録チャンネルタブ + + マイページタブ + プレーヤーのプレイリスト & 関連動画 + 検索結果 + オリジナルのサムネイル + DeArrow & オリジナル + DeArrow & 静止画 + 静止画サムネイル + DeArrow + "DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。これを有効にすると、動画の URL が API サーバーに送信されますが、他のデータは送信されません。動画に DeArrow サムネイルがない場合は、オリジナルのサムネイルまたは静止画サムネイルが表示されます 詳細については、ここをタップしてください" - API 利用不可時にトーストを表示 - DeArrow が利用できない場合にトースト通知が表示されます - DeArrow が利用できない場合にトースト通知は表示されません - DeArrow API のエンドポイント - DeArrow がサムネイルのキャッシュを取得するエンドポイントの URL - 静止画サムネイル - 静止画は各動画の序盤 / 中盤 / 終盤から取得されます。これらの画像は YouTube に組み込まれており、外部 API は使用されません - 高速な静止画サムネイルを使用 - 中画質の静止画サムネイルを使用します。サムネイルの読み込みは速くなりますが、ライブ、未公開、または非常に古い動画には空白のサムネイルが表示されることがあります - 高画質の静止画サムネイルを使用します - 静止画サムネイルを取得する位置 - 動画の序盤 - 動画の中盤 - 動画の終盤 - - DeArrow は一時的に利用できません (status code: %s) - DeArrow は一時的に利用できません - - - ReVanced からのお知らせを表示 - アプリの起動時にお知らせが表示されます - アプリの起動時にお知らせは表示されません - アプリの起動時にお知らせを表示します - お知らせの取得に失敗しました - 閉じる - - - 動画のループ再生を有効化 - 動画はループ再生されます - 動画はループ再生されません - - - 動画のループ再生ボタンを表示 - ボタンがプレーヤー オーバーレイに表示されます - ボタンはプレーヤー オーバーレイに表示されません - 動画のループ再生がオンになっています - 動画のループ再生がオフになっています - - - 音声割り込み時に一時停止 - 他の音声が再生されたときに一時停止します(ナビゲーションなど) - 他の音声が再生されたときに音量を下げます - - - デバイスの画面サイズを偽装 - "デバイスの画面サイズは偽装されています + API 利用不可時にトーストを表示 + DeArrow が利用できない場合にトースト通知が表示されます + DeArrow が利用できない場合にトースト通知は表示されません + DeArrow API のエンドポイント + DeArrow がサムネイルのキャッシュを取得するエンドポイントの URL + 静止画サムネイル + 静止画は各動画の序盤 / 中盤 / 終盤から取得されます。これらの画像は YouTube に組み込まれており、外部 API は使用されません + 高速な静止画サムネイルを使用 + 中画質の静止画サムネイルを使用します。サムネイルの読み込みは速くなりますが、ライブ、未公開、または非常に古い動画には空白のサムネイルが表示されることがあります + 高画質の静止画サムネイルを使用します + 静止画サムネイルを取得する位置 + 動画の序盤 + 動画の中盤 + 動画の終盤 + + DeArrow は一時的に利用できません (status code: %s) + DeArrow は一時的に利用できません + + + ReVanced からのお知らせを表示 + アプリの起動時にお知らせが表示されます + アプリの起動時にお知らせは表示されません + アプリの起動時にお知らせを表示します + お知らせの取得に失敗しました + 閉じる + + + 動画のループ再生を有効化 + 動画はループ再生されます + 動画はループ再生されません + + + 「動画のループ再生」ボタンを表示 + プレーヤー オーバーレイに「動画のループ再生」ボタンが表示されます + プレーヤー オーバーレイに「動画のループ再生」ボタンは表示されません + 動画のループ再生がオンになっています + 動画のループ再生がオフになっています + + + 音声割り込み時に一時停止 + 他の音声が再生されたときに一時停止します(ナビゲーションなど) + 他の音声が再生されたときに音量を下げます + + + デバイスの画面サイズを偽装 + "デバイスの画面サイズは偽装されています より高画質な映像がアンロックされる可能性がありますが、動画のカクつき、バッテリー寿命の悪化、予期せぬ副作用が 発生するかもしれません" - "デバイスの画面サイズは偽装されていません + "デバイスの画面サイズは偽装されていません この機能を有効にすると、より高画質な映像がアンロックされる可能性があります" - この機能を有効にすると、動画のカクつき、バッテリー寿命の悪化、および予期せぬ副作用を引き起こす可能性があります。 - - - 触覚フィードバック - 触覚フィードバックの設定を変更します - チャプターの触覚フィードバックを無効化 - チャプターの触覚フィードバックは無効です - チャプターの触覚フィードバックは有効です - 精密シークの触覚フィードバックを無効化 - 精密シークの触覚フィードバックは無効です - 精密シークの触覚フィードバックは有効です - シーク取り消しの触覚フィードバックを無効化 - シーク取り消しの触覚フィードバックは無効です - シーク取り消しの触覚フィードバックは有効です - ズームの触覚フィードバックを無効化 - ズームの触覚フィードバックは無効です - ズームの触覚フィードバックは有効です - - - 最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。 - - - URL リダイレクトを回避 - YouTube の URL リダイレクトを経由せずにリンク先へ移動します - YouTube の URL リダイレクトを経由してリンク先へ移動します - - - リンクをブラウザで開く - 外部ブラウザでリンクを開きます - アプリ内ブラウザでリンクを開きます - - - - 自動 - 画質の変更を保存 - 画質の変更はすべての動画に適用されます - 画質の変更は現在の動画にのみ適用されます - 画質の変更時にトーストを表示 - デフォルトの画質が変更された場合にトースト通知が表示されます - デフォルトの画質が変更された場合にトースト通知は表示されません - デフォルトの画質 (Wi-Fi) - デフォルトの画質 (携帯回線) - ショートの画質の変更を保存 - 画質の変更はすべてのショート動画に適用されます - 画質の変更は現在のショート動画にのみ適用されます - デフォルトのショートの画質 (Wi-Fi) - デフォルトのショートの画質 (携帯回線) - 携帯回線 - Wi-Fi - デフォルトの画質の変更 (%1$s): %2$s - ショートの画質の変更 (%1$s): %2$s - - - 再生速度設定ボタンを表示 - 再生速度設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、再生速度がデフォルトの値にリセットされます - 再生速度設定ボタンはプレーヤー オーバーレイに表示されません - - - 画質設定ボタンを表示 - 画質設定ボタンがプレーヤー オーバーレイに表示されます。長押しすると、画質がデフォルトの値にリセットされます - 画質設定ボタンはプレーヤー オーバーレイに表示されません - - - カスタム再生速度メニュー - カスタム再生速度リストが再生速度メニューに表示されます - デフォルトの再生速度リストが再生速度メニューに表示されます - 古い再生速度メニューを復元 - 古いスタイルの再生速度メニューが表示されます - 新しいスタイルの再生速度メニューが表示されます - カスタム再生速度リスト - カスタム再生速度リストを編集します - 再生速度は %s 未満でなければなりません - カスタム再生速度リストの値が無効です - 自動 - 長押し倍速再生の速度 - 再生速度の範囲は 0-8 で、0 および 8 は含まれません - - - 再生速度の変更を保存 - 再生速度の変更はすべての動画に適用されます - 再生速度の変更は現在の動画にのみ適用されます - 再生速度の変更時にトーストを表示 - デフォルトの再生速度が変更されたときにトースト通知が表示されます - デフォルトの再生速度が変更されたときにトースト通知は表示されません - デフォルトの再生速度 - デフォルトの再生速度の変更: %s - - - HDR 動画を無効化 - HDR 動画は無効です - HDR 動画は有効です - AVC (H.264) を強制的に使用 - ビデオ コーデックは強制的に AVC (H.264) になります - ビデオ コーデックは自動的に決定されます - "利点: + この機能を有効にすると、動画のカクつき、バッテリー寿命の悪化、および予期せぬ副作用を引き起こす可能性があります。 + + + 触覚フィードバック + 触覚フィードバックの設定を変更します + チャプターの触覚フィードバックを無効化 + チャプターの触覚フィードバックは無効です + チャプターの触覚フィードバックは有効です + 精密シークの触覚フィードバックを無効化 + 精密シークの触覚フィードバックは無効です + 精密シークの触覚フィードバックは有効です + シーク取り消しの触覚フィードバックを無効化 + シーク取り消しの触覚フィードバックは無効です + シーク取り消しの触覚フィードバックは有効です + 長押しの触覚フィードバックを無効化 + 長押しの触覚フィードバックは無効です + 長押しの触覚フィードバックは有効です + ズームの触覚フィードバックを無効化 + ズームの触覚フィードバックは無効です + ズームの触覚フィードバックは有効です + + + 最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。 + + + URL リダイレクトを回避 + YouTube の URL リダイレクトを経由せずにリンク先へ移動します + YouTube の URL リダイレクトを経由してリンク先へ移動します + + + リンクをブラウザで開く + 外部ブラウザでリンクを開きます + アプリ内ブラウザでリンクを開きます + + + + 自動 + 画質の変更を保存 + 画質の変更はすべての動画に適用されます + 画質の変更は現在の動画にのみ適用されます + 画質の変更時にトーストを表示 + デフォルトの画質が変更された場合にトースト通知が表示されます + デフォルトの画質が変更された場合にトースト通知は表示されません + デフォルトの画質 (Wi-Fi) + デフォルトの画質 (携帯回線) + ショートの画質の変更を保存 + 画質の変更はすべてのショート動画に適用されます + 画質の変更は現在のショート動画にのみ適用されます + デフォルトのショートの画質 (Wi-Fi) + デフォルトのショートの画質 (携帯回線) + 携帯回線 + Wi-Fi + デフォルトの画質の変更 (%1$s): %2$s + ショートの画質の変更 (%1$s): %2$s + + + 再生速度設定ボタンを表示 + プレーヤー オーバーレイに再生速度設定ボタンが表示されます。長押しすると、再生速度がデフォルトの値にリセットされます + プレーヤー オーバーレイに再生速度設定ボタンは表示されません + + + 画質設定ボタンを表示 + プレーヤー オーバーレイに画質設定ボタンが表示されます。長押しすると、画質がデフォルトの値にリセットされます + プレーヤー オーバーレイに画質設定ボタンは表示されません + + + カスタム再生速度メニュー + カスタム再生速度リストが再生速度メニューに表示されます + デフォルトの再生速度リストが再生速度メニューに表示されます + 古い再生速度メニューを復元 + 古いスタイルの再生速度メニューが表示されます + 新しいスタイルの再生速度メニューが表示されます + カスタム再生速度リスト + カスタム再生速度リストを編集します + 再生速度は %s 以下でなければなりません + カスタム再生速度リストの値が無効です + 自動 + 長押し倍速再生の速度 + 再生速度の範囲は 0-8 で、0 は含まれません + + + 再生速度の変更を保存 + 再生速度の変更はすべての動画に適用されます + 再生速度の変更は現在の動画にのみ適用されます + 再生速度の変更時にトーストを表示 + デフォルトの再生速度が変更されたときにトースト通知が表示されます + デフォルトの再生速度が変更されたときにトースト通知は表示されません + デフォルトの再生速度 + デフォルトの再生速度の変更: %s + + + HDR 動画を無効化 + HDR 動画は無効です + HDR 動画は有効です + AVC (H.264) を強制的に使用 + ビデオ コーデックは強制的に AVC (H.264) になります + ビデオ コーデックは自動的に決定されます + "利点: • バッテリー寿命が延びる可能性がある • 古いデバイスで失われた動画解像度を復元できる可能性がある @@ -1669,182 +1755,188 @@ Automotive レイアウト • 動画再生時に VP9 または AV1 よりも多くの通信量を使用する • HDR 動画では AVC が使用されない • 一部のデバイスでは AVC を強制できない" - - - 画質の詳細設定メニューを表示 - 詳細設定メニューが画質メニューとして表示されます - 通常の画質メニューが表示されます - - - スライドによるシークを有効化 - スライドによるシークは有効です。プレーヤー画面を左右にスライドすると、前後にシークします - スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません - - - Android VR で AV1 を許可 - "ビデオ コーデックは AVC (H.264)、VP9、AV1 のいずれかになります + + + 画質の詳細設定メニューを表示 + 詳細設定メニューが画質メニューとして表示されます + 通常の画質メニューが表示されます + + + Premium 画質を非表示 + Premium 画質は画質設定メニューに表示されません + Premium 画質は画質設定メニューに表示されます + + + スライドによるシークを有効化 + スライドによるシークは有効です。プレーヤー画面を左右にスライドすると、前後にシークします + スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません + + + Android VR で AV1 を許可 + "ビデオ コーデックは AVC (H.264)、VP9、AV1 のいずれかになります 再生がカクつくまたはコマ落ちが発生する場合があります" - ビデオ コーデックは AVC (H.264)、VP9 のいずれかになります - "この設定を有効にすると、AV1 のソフトウェア デコードが使用される場合があります。 + ビデオ コーデックは AVC (H.264)、VP9 のいずれかになります + "この設定を有効にすると、AV1 のソフトウェア デコードが使用される場合があります。 AV1 での動画再生は、カクつくまたはコマ落ちが発生する場合があります。" - 偽装による副作用 - • 実験的なクライアントであり、いつでも動作しなくなる可能性がある - • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある - •「音声トラック」がフライアウト メニューに表示されない - • AV1 コーデックが利用できない - •「一定音量」が利用できない - • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある - - •「オリジナルの音声を強制的に使用」が利用できない - 統計情報にクライアントを表示 - 統計情報には現在のクライアントが表示されます - 統計情報には現在のクライアントは表示されません - - - - - YT Music ReVanced - Music ReVanced - Music - - - ReVanced について - 広告 - 全般 - プレーヤー - その他 - - - 動画広告を非表示 - 動画広告は表示されません - 動画広告は表示されます - - - 常時リピートを有効化 - 常時リピートは有効です\n\nリピート設定が保存され常時適用されます - 常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます - - - キャストボタンを非表示 - キャストボタンはプレーヤー オーバーレイに表示されません - キャストボタンはプレーヤー オーバーレイに表示されます - 履歴ボタンを非表示 - 履歴ボタンは表示されません - 履歴ボタンは表示されます - 通知ボタンを非表示 - 通知ボタンは表示されません - 通知ボタンは表示されます - 検索ボタンを非表示 - 検索ボタンは表示されません - 検索ボタンは表示されます - - - カテゴリバーを非表示 - カテゴリバーは表示されません - カテゴリバーは表示されます - - - ミニプレーヤーの色を変更 - ミニプレーヤーはフルスクリーン プレーヤーと同じ色を使用します - ミニプレーヤーはデフォルトの色を使用します - - - ナビゲーション バー - ナビゲーション バーのボタンを変更または非表示にします - - 「ホーム」を非表示 - ホームボタンは表示されません - ホームボタンは表示されます - - 「サンプル」を非表示 - サンプルボタンは表示されません - サンプルボタンは表示されます - - 「探索」を非表示 - 探索ボタンは表示されません - 探索ボタンは表示されます - - 「ライブラリ」を非表示 - ライブラリ ボタンは表示されません - ライブラリ ボタンは表示されます - - 「アップグレード」を非表示 - アップグレード ボタンは表示されません - アップグレード ボタンは表示されます - ナビゲーション バーを非表示 - ナビゲーション バーは表示されません - ナビゲーション バーは表示されます - ボタンをアイコンのみで表示 - ナビゲーション ボタンはアイコンのみで表示されます - ナビゲーション ボタンはアイコンと文字で表示されます - - - 「Music Premium に登録」ラベルを非表示 - ラベルは表示されません - ラベルは表示されます - - - アップグレード ボタンを非表示 - ボタンは表示されません - ボタンは表示されます - - - - - 音声広告をブロック - 音声広告はブロックされます - 音声広告はブロックされません - - - %s は利用できません。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 - %s でエラーが発生しました。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 - 埋め込み動画広告をブロック - 無効 - Luminous プロキシ - PurpleAdBlock プロキシ - - - 動画広告をブロック - 動画広告はブロックされます - 動画広告はブロックされません - - - メッセージを削除しました - 削除されたメッセージの表示方法 - 削除されたメッセージを表示しない - 削除されたメッセージをスポイラー表示で隠して表示する - 削除されたメッセージを取り消し線つきで表示する - - - チャンネルポイントの受け取りを自動化 - チャンネルポイントの受け取りは自動的に行われます - チャンネルポイントの受け取りは自動的には行われません - - - - Twitch デバッグモードを有効化 - Twitch デバッグモードは有効です (非推奨) - Twitch デバッグモードは無効です - - - ReVanced 設定 - 製品情報 - ReVanced について - 広告ブロック - 広告ブロック設定 - チャット - チャット設定 - その他 - その他の設定 - 全般設定 - その他の設定 - クライアントサイド広告 - サーバーサイド SureStream 広告 - デバッグログを有効化 - デバッグログは有効です - デバッグログは無効です - - + 偽装による副作用 + • 実験的なクライアントであり、いつでも動作しなくなる可能性がある + • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある + •「音声トラック」がフライアウト メニューに表示されない + • AV1 コーデックが利用できない + •「一定音量」が利用できない + • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある + + •「オリジナルの音声を強制的に使用」が利用できない + 統計情報にクライアントを表示 + 統計情報には現在のクライアントが表示されます + 統計情報には現在のクライアントは表示されません + + + + + YT Music ReVanced + Music ReVanced + Music + + + + ReVanced について + 広告 + 全般 + プレーヤー + その他 + + + 動画広告を非表示 + 動画広告は表示されません + 動画広告は表示されます + + + 常時リピートを有効化 + 常時リピートは有効です\n\nリピート設定が保存され常時適用されます + 常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます + + + キャストボタンを非表示 + キャストボタンはプレーヤー オーバーレイに表示されません + キャストボタンはプレーヤー オーバーレイに表示されます + 履歴ボタンを非表示 + 履歴ボタンは表示されません + 履歴ボタンは表示されます + 通知ボタンを非表示 + 通知ボタンは表示されません + 通知ボタンは表示されます + 検索ボタンを非表示 + 検索ボタンは表示されません + 検索ボタンは表示されます + + + カテゴリバーを非表示 + カテゴリバーは表示されません + カテゴリバーは表示されます + + + ミニプレーヤーの色を変更 + ミニプレーヤーはフルスクリーン プレーヤーと同じ色を使用します + ミニプレーヤーはデフォルトの色を使用します + + + ナビゲーション バー + ナビゲーション バーのボタンを変更または非表示にします + + 「ホーム」を非表示 + ホームボタンは表示されません + ホームボタンは表示されます + + 「サンプル」を非表示 + サンプルボタンは表示されません + サンプルボタンは表示されます + + 「探索」を非表示 + 探索ボタンは表示されません + 探索ボタンは表示されます + + 「ライブラリ」を非表示 + ライブラリ ボタンは表示されません + ライブラリ ボタンは表示されます + + 「アップグレード」を非表示 + アップグレード ボタンは表示されません + アップグレード ボタンは表示されます + ナビゲーション バーを非表示 + ナビゲーション バーは表示されません + ナビゲーション バーは表示されます + ボタンをアイコンのみで表示 + ナビゲーション ボタンはアイコンのみで表示されます + ナビゲーション ボタンはアイコンと文字で表示されます + + + 「Music Premium に登録」ラベルを非表示 + ラベルは表示されません + ラベルは表示されます + + + アップグレード ボタンを非表示 + ボタンは表示されません + ボタンは表示されます + + + + + 音声広告をブロック + 音声広告はブロックされます + 音声広告はブロックされません + + + %s は利用できません。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 + %s でエラーが発生しました。広告が表示される可能性があります。設定で広告ブロックサービスを変更してみてください。 + 埋め込み動画広告をブロック + 無効 + Luminous プロキシ + PurpleAdBlock プロキシ + + + 動画広告をブロック + 動画広告はブロックされます + 動画広告はブロックされません + + + メッセージを削除しました + 削除されたメッセージの表示方法 + 削除されたメッセージを表示しない + 削除されたメッセージをスポイラー表示で隠して表示する + 削除されたメッセージを取り消し線つきで表示する + + + チャンネルポイントの受け取りを自動化 + チャンネルポイントの受け取りは自動的に行われます + チャンネルポイントの受け取りは自動的には行われません + + + + Twitch デバッグモードを有効化 + Twitch デバッグモードは有効です (非推奨) + Twitch デバッグモードは無効です + + + ReVanced 設定 + 製品情報 + ReVanced について + 広告ブロック + 広告ブロック設定 + チャット + チャット設定 + その他 + その他の設定 + 全般設定 + その他の設定 + クライアントサイド広告 + サーバーサイド SureStream 広告 + デバッグログを有効化 + デバッグログは有効です + デバッグログは無効です + + diff --git a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml index 3a40645452..2995e6b7d0 100644 --- a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml +++ b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml @@ -27,18 +27,53 @@ Second \"item\" text" + გამორთეთ თამამი ხატები + ხატები არ არის თამამი + ხატები თამამია + GmsCore + GmsCore-სთან დაკავშირებული პარამეტრები + GmsCore-ის განახლებების შემოწმება + განახლებების შემოწმება ჩართულია + განახლებების შემოწმება გამორთულია + გახსენით GmsCore პარამეტრები + GmsCore-ის პარამეტრები + MicroG GmsCore არ არის დაინსტალირებული. დააინსტალირეთ. + საჭიროა მოქმედება + ვერ მოხერხდა MicroG GmsCore-ის განახლებების შემოწმება + MicroG GmsCore-ის ახალი ვერსია (%1$s) ხელმისაწვდომია. ამჟამად, თქვენ იყენებთ ვერსიას %2$s. + "MicroG GmsCore-ს არ აქვს ნებართვა იმუშაოს ფონურ რეჟიმში. + +მიჰყევით „არ გამორთოთ ჩემი აპი“ სახელმძღვანელოს თქვენი ტელეფონისთვის და გამოიყენეთ ინსტრუქციები თქვენი MicroG ინსტალაციისთვის. + +ეს აუცილებელია აპის მუშაობისთვის." + გახსენით ვებსაიტი + გაუქმება + "MicroG GmsCore-ის ბატარეის ოპტიმიზაცია უნდა გამორთოთ პრობლემების თავიდან ასაცილებლად. + +MicroG-ისთვის ბატარეის ოპტიმიზაციის გამორთვა უარყოფითად არ იმოქმედებს ბატარეის მოხმარებაზე. + +შეეხეთ ღილაკს „გაგრძელება“ და დაუშვით ოპტიმიზაციის ცვლილებები." + გაგრძელება - + + ფუნქციის გამოსაყენებლად, გადატვირთეთ აპი + პროტოკოლის ბუფერის ჟურნალი + გამართვის ჟურნალები მოიცავს პროტოკოლის ბუფერს + გამართვის ჟურნალები არ მოიცავს პროტოკოლის ბუფერს + "ამ პარამეტრის ჩართვა დააფიქსირებს დამატებით განლაგების მონაცემებს, მათ შორის ეკრანზე გამოსახულ ტექსტს ზოგიერთი ინტერფეისის კომპონენტისთვის. +ეს დაგეხმარებათ კომპონენტების იდენტიფიცირებაში მორგებული ფილტრების შექმნისას. +თუმცა, ამის ჩართვა ასევე დააფიქსირებს მომხმარებლის ზოგიერთ მონაცემს, როგორიცაა თქვენი IP მისამართი." + @@ -48,40 +83,135 @@ Second \"item\" text" - + შემოქმედის მაღაზიის თაროს დამალვა + შემოქმედის მაღაზიის თარო ვიდეო პლეერის ქვეშ დამალულია + შემოქმედის მაღაზიის თარო ვიდეო პლეერის ქვეშ ნაჩვენებია + მთავარ გვერდზე ვიდეოების ქვეშ კომენტარების სექციის დამალვა + მთავარ გვერდზე ვიდეოების ქვეშ კომენტარების სექცია დამალულია + მთავარ გვერდზე ვიდეოების ქვეშ კომენტარების სექცია ნაჩვენებია + + \'უახლესი ვიდეოების\' ღილაკის დამალვა + უახლესი ვიდეოების ღილაკი დამალულია + უახლესი ვიდეოების ღილაკი ნაჩვენებია + + ვებ ძიების შედეგების დამალვა + ვებ ძიების შედეგები დამალულია + ვებ ძიების შედეგები ნაჩვენებია + \'შეიძლება მოგეწონოთ\' სექციის დამალვა + \'შეიძლება მოგეწონოთ\' სექცია დამალულია + \'შეიძლება მოგეწონოთ\' სექცია ნაჩვენებია + This button usually appears in the video player for certain videos. --> + + \'ლაივ ჩეთის ჩანაწერის\' ღილაკის დამალვა + ლაივ ჩეთის ჩანაწერის ღილაკი პლეერის გადაფარვაში დამალულია + ლაივ ჩეთის ჩანაწერის ღილაკი პლეერის გადაფარვაში ნაჩვენებია + ვიდეოს სათაურის დამალვა + ვიდეოს სათაური პლეერის გადაფარვაში დამალულია + ვიდეოს სათაური პლეერის გადაფარვაში ნაჩვენებია + \'კურსის პროგრესის\' დამალვა + კურსის პროგრესის სექცია დამალულია + კურსის პროგრესის სექცია ნაჩვენებია + „შესწავლის“ დამალვა + „შეისწავლე ეს კურსი“ და „შეისწავლე პოდკასტი“ სექციები დამალულია + „შეისწავლე ეს კურსი“ და „შეისწავლე პოდკასტი“ სექციები ნაჩვენებია + \'ამ კურსის შესწავლის\' დამალვა + ამ კურსის შესწავლის სექცია დამალულია + ამ კურსის შესწავლის სექცია ნაჩვენებია + \'პოდკასტის შესწავლის\' დამალვა + პოდკასტის შესწავლის სექცია დამალულია + პოდკასტის შესწავლის სექცია ნაჩვენებია + \'რჩეული ადგილების\' დამალვა + რჩეული ადგილების სექცია დამალულია + რჩეული ადგილების სექცია ნაჩვენებია + არხის მფრინავი მენიუს ფილტრის ჩართვა + არხის მფრინავი მენიუს ფილტრი ჩართულია + არხის მფრინავი მენიუს ფილტრი გამორთულია + არხის მფრინავი მენიუს ფილტრი + შეიყვანეთ მფრინავი მენიუს სახელები გასაფილტრად, თითო სტრიქონზე ერთი + თამაშების დამალვა + თამაშების სექცია დამალულია + თამაშების სექცია ნაჩვენებია + მუსიკის დამალვა + მუსიკის სექცია დამალულია + მუსიკის სექცია ნაჩვენებია + ვიქტორინების დამალვა + ვიქტორინების სექცია დამალულია + ვიქტორინების სექცია ნაჩვენებია + არხის ჩანართის ფილტრის ჩართვა + არხის ჩანართის ფილტრი ჩართულია + არხის ჩანართის ფილტრი გამორთულია + არხის ჩანართის ფილტრი + შეიყვანეთ არხის ჩანართის სახელები გასაფილტრად, თითო სტრიქონზე ერთი + "შეზღუდვები: +• Shorts-ის თაროებზე, არხის გვერდებზე და ძიების შედეგებში შეიძლება კვლავ გამოჩნდეს ნახვების რაოდენობა. +• ეს ფუნქცია არ მუშაობს საავტომობილო ფორმა ფაქტორთან." + "შეზღუდვები: +• Shorts-ის თაროებზე, არხის გვერდებზე და ძიების შედეგებში შეიძლება კვლავ გამოჩნდეს ატვირთვის დრო. +• ეს ფუნქცია არ მუშაობს საავტომობილო ფორმა ფაქტორთან." + "მთავარი/გამოწერები/ძიების შედეგები გაფილტრულია საკვანძო ფრაზების შესაბამისი კონტენტის დასამალად + +შეზღუდვები: +• Shorts არ იმალება არხის სახელის მიხედვით +• ზოგიერთი UI კომპონენტი შეიძლება არ დაიმალოს +• საკვანძო სიტყვის ძიებამ შეიძლება არ აჩვენოს შედეგები" - + მთელ ეკრანზე რეკლამები დამალულია + პლეერის ამომხტარი რეკლამების დამალვა + პლეერის ამომხტარი რეკლამები დამალულია + პლეერის ამომხტარი რეკლამები ნაჩვენებია + პროდუქტების ნახვის ბანერი პლეერის გადაფარვაში დამალულია + პროდუქტების ნახვის ბანერი პლეერის გადაფარვაში ნაჩვენებია + YouTube Premium-ის აქციების დამალვა + YouTube Premium-ის აქციები დამალულია + YouTube Premium-ის აქციები ნაჩვენებია - - + + URL ბუფერში დაკოპირებულია + URL დროის ნიშნულით დაკოპირებულია + ვიდეო URL-ის კოპირების ღილაკის ჩვენება + ვიდეო URL-ის კოპირების ღილაკი ნაჩვენებია. შეეხეთ ვიდეო URL-ის კოპირებისთვის. ხანგრძლივად შეხება დროის ნიშნულით კოპირებისთვის + ვიდეო URL-ის კოპირების ღილაკი არ არის ნაჩვენები + დროის ნიშნულის URL-ის კოპირების ღილაკის ჩვენება + დროის ნიშნულის URL-ის კოპირების ღილაკი ნაჩვენებია. შეეხეთ ვიდეო URL-ის დროის ნიშნულით კოპირებისთვის. ხანგრძლივად შეხება დროის ნიშნულის გარეშე კოპირებისთვის + დროის ნიშნულის URL-ის კოპირების ღილაკი არ არის ნაჩვენები + - + + \'ტელევიზორში შესვლის\' ამომხტარი ფანჯრის გამორთვა + ტელევიზორში შესვლის ამომხტარი ფანჯარა გამორთულია + ტელევიზორში შესვლის ამომხტარი ფანჯარა ჩართულია + - + + გადახტომისთვის შეხების ჩართვა + გადახტომისთვის შეხება ჩართულია + გადახტომისთვის შეხება გამორთულია + @@ -89,25 +219,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + დამალვა შეიძლება არ იმუშაოს ზოგიერთი მომხმარებლის ანგარიშისთვის. - + + ნავიგაციის ღილაკები + ნავიგაციის ზოლის ღილაკების დამალვა ან შეცვლა + \'მთავარის\' დამალვა + მთავარი ღილაკი დამალულია + მთავარი ღილაკი ნაჩვენებია + Shorts-ის დამალვა + Shorts-ის ღილაკი დამალულია + Shorts-ის ღილაკი ნაჩვენებია + \'შექმნის\' დამალვა + შექმნის ღილაკი დამალულია + შექმნის ღილაკი ნაჩვენებია + \'გამოწერების\' დამალვა + გამოწერების ღილაკი დამალულია + გამოწერების ღილაკი ნაჩვენებია + შეტყობინებების დამალვა + შეტყობინებების ღილაკი დამალულია + შეტყობინებების ღილაკი ნაჩვენებია + შექმნის შეცვლა შეტყობინებებით + შექმნის ღილაკი შეცვლილია შეტყობინებების ღილაკით + შექმნის ღილაკი არ არის შეცვლილი შეტყობინებების ღილაკით + თუ ამ პარამეტრის შეცვლა არ მოქმედებს, სცადეთ ინკოგნიტო რეჟიმზე გადართვა. + ნავიგაციის ღილაკების ლეიბლების დამალვა + ლეიბლები დამალულია + ლეიბლები ნაჩვენებია + ვიწრო ნავიგაციის ღილაკების ჩართვა + ნავიგაციის ღილაკებს შორის მანძილი ვიწროა + ნავიგაციის ღილაკებს შორის მანძილი ნორმალურია + ნავიგაციის ზოლის ანიმაციების ჩართვა + ნავიგაციის გადასვლები ანიმირებულია + ნავიგაციის გადასვლები არ არის ანიმირებული + გამჭვირვალე სტატუსის ზოლის გამორთვა + სტატუსის ზოლი გაუმჭვირვალეა + სტატუსის ზოლი გაუმჭვირვალე ან გამჭვირვალეა + "შეზღუდვები: +• ვიდეო პლეერის თავზე შეიძლება გამოჩნდეს შავი ზოლი. +• ზოგიერთ მოწყობილობაზე, ამ ფუნქციის ჩართვამ შეიძლება სისტემის ნავიგაციის ზოლი გახადოს გამჭვირვალე." + ღია გამჭვირვალე ზოლის გამორთვა + ღია რეჟიმის ნავიგაციის ზოლი გაუმჭვირვალეა + ღია რეჟიმის ნავიგაციის ზოლი გაუმჭვირვალე ან გამჭვირვალეა + ბნელი გამჭვირვალე ზოლის გამორთვა + ბნელი რეჟიმის ნავიგაციის ზოლი გაუმჭვირვალეა + ბნელი რეჟიმის ნავიგაციის ზოლი გაუმჭვირვალე ან გამჭვირვალეა + ხელსაწყოთა ზოლი + ხელსაწყოთა ზოლის კომპონენტების დამალვა ან შეცვლა + შექმნის ღილაკის დამალვა + შექმნის ღილაკი დამალულია + შექმნის ღილაკი ნაჩვენებია + შეტყობინებების ღილაკის დამალვა + შეტყობინებების ღილაკი დამალულია + შეტყობინებების ღილაკი ნაჩვენებია + ძიების ღილაკის დამალვა + ძიების ღილაკი დამალულია + ძიების ღილაკი ნაჩვენებია. + ფართო საძიებო ზოლის ჩართვა + ფართო საძიებო ზოლი ჩართულია + ფართო საძიებო ზოლი გამორთულია @@ -126,25 +313,67 @@ Second \"item\" text" + ჩაკეცვის ღილაკის დამალვა + ჩაკეცვის ღილაკი დამალულია + ჩაკეცვის ღილაკი ნაჩვენებია + მთელი ეკრანის ღილაკის დამალვა + მთელი ეკრანის ღილაკი დამალულია + მთელი ეკრანის ღილაკი ნაჩვენებია + + + ბოლო ეკრანის ბარათების დამალვა + ბოლო ეკრანის ბარათები დამალულია + ბოლო ეკრანის ბარათები ნაჩვენებია - + მთელი ეკრანის დიდი გადახვევის ზოლის ჩართვა + მთელი ეკრანის გადახვევის ზოლი დიდი ზომისაა + მთელი ეკრანის გადახვევის ზოლი ნორმალური ზომისაა + Shorts-ის დამალვა არხის გვერდზე + დამალულია არხის გვერდზე + ნაჩვენებია არხის გვერდზე + Shorts-ის დამალვა ვიდეოს აღწერილობაში + დამალულია ვიდეოს აღწერილობაში + ნაჩვენებია ვიდეოს აღწერილობაში + AI ღილაკის დამალვა + AI ღილაკი დამალულია + AI ღილაკი ნაჩვენებია + \'ავტომატურად გაჟღერებული\' ლეიბლის დამალვა + ავტომატურად გაჟღერებული ლეიბლი დამალულია + ავტომატურად გაჟღერებული ლეიბლი ნაჩვენებია + - + + ავტომატური დაკვრის გადახედვის დამალვა + ავტომატური დაკვრის გადახედვა დამალულია + ავტომატური დაკვრის გადახედვა ნაჩვენებია + + + ბოლო ეკრანის შემოთავაზებული ვიდეოს დამალვა + "ბოლო ეკრანის შემოთავაზებული ვიდეო დამალულია, როდესაც ავტომატური დაკვრა გამორთულია + +ავტომატური დაკვრის შეცვლა შესაძლებელია YouTube-ის პარამეტრებში: +პარამეტრები → დაკვრა → შემდეგი ვიდეოს ავტომატური დაკვრა" + ბოლო ეკრანის შემოთავაზებული ვიდეო ნაჩვენებია + - + + დამალე პლეერის ამომხტარი პანელები + პლეერის ამომხტარი პანელები დამალულია + პლეერის ამომხტარი პანელები ნაჩვენებია + @@ -155,10 +384,12 @@ Second \"item\" text" - - + მხოლოდ მუსიკალური ვიდეოებისთვის. მუსიკალური ვიდეოების სექციები მუსიკის გარეშე, რომლებიც უკვე არ არის დაფარული სხვა კატეგორიით + სეგმენტის გაგზავნა შეუძლებელია: %s + "სეგმენტის გაგზავნა შეუძლებელია. +უკვე არსებობს" @@ -170,7 +401,11 @@ Second \"item\" text" - + + გამორთულია + ფერი + შავ-თეთრი + @@ -187,7 +422,11 @@ Second \"item\" text" - + + შეხება-დაჭერის ჰაპტიკის გამორთვა + შეხება-დაჭერის ჰაპტიკა გამორთულია + შეხება-დაჭერის ჰაპტიკა ჩართულია + @@ -200,6 +439,11 @@ Second \"item\" text" + + პრემიუმ ხარისხის პარამეტრების დამალვა + პრემიუმ ხარისხის პარამეტრები დამალულია + პრემიუმ ხარისხის პარამეტრები ნაჩვენებია + @@ -207,7 +451,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml index 3a40645452..fa4feaa456 100644 --- a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml +++ b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Қалың белгішелерді өшіру + Белгішелер қалың емес + Белгішелер қалың + GmsCore + GmsCore-ға қатысты параметрлер + GmsCore жаңартуларын тексеру + Жаңартуларды тексеру қосулы + Жаңартуларды тексеру өшірілген + GmsCore параметрлерін ашу + GmsCore параметрлері + MicroG GmsCore орнатылмаған. Орнатыңыз. + Әрекет қажет + MicroG GmsCore жаңартуларын тексеру сәтсіз аяқталды + MicroG GmsCore-тің жаңа нұсқасы (%1$s) қолжетімді. Қазір сіз %2$s нұсқасын қолданып жатырсыз. + "MicroG GmsCore фондық режимде жұмыс істеуге рұқсаты жоқ. + +Телефоныңызға арналған \"Менің қолданбамды өлтірмеңіз\" нұсқаулығын орындаңыз және нұсқауларды MicroG орнатуыңызға қолданыңыз. + +Бұл қолданбаның жұмыс істеуі үшін қажет." + Веб-сайтты ашу + Бас тарту + "Мәселелерді болдырмау үшін MicroG GmsCore батареяны оңтайландыруды өшіру керек. + +MicroG үшін батареяны оңтайландыруды өшіру батареяны пайдалануға кері әсер етпейді. + +Жалғастыру түймесін түртіп, оңтайландыру өзгерістеріне рұқсат беріңіз." + Жалғастыру - + + Бұл мүмкіндікті пайдалану үшін қолданбаны қайта іске қосыңыз + Протокол буферін журналдау + Отладка журналдары протокол буферін қамтиды + Отладка журналдары протокол буферін қамтымайды + "Бұл параметрді қосу қосымша орналасу деректерін, соның ішінде кейбір UI компоненттері үшін экрандағы мәтінді тіркейді. + +Бұл арнайы сүзгілерді жасау кезінде компоненттерді анықтауға көмектеседі. + +Дегенмен, мұны қосу сіздің IP мекенжайыңыз сияқты кейбір пайдаланушы деректерін де тіркейді." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Автор дүкенінің сөресін жасыру + Бейне ойнатқыштың астындағы автор дүкенінің сөресі жасырылған + Бейне ойнатқыштың астындағы автор дүкенінің сөресі көрсетілген + Басты беттегі бейнелер астындағы пікірлер бөлімін жасыру + Басты беттегі бейнелер астындағы пікірлер бөлімі жасырылған + Басты беттегі бейнелер астындағы пікірлер бөлімі көрсетілген + + \'Соңғы бейнелер\' түймесін жасыру + Соңғы бейнелер түймесі жасырылған + Соңғы бейнелер түймесі көрсетілген + + Веб іздеу нәтижелерін жасыру + Веб іздеу нәтижелері жасырылған + Веб іздеу нәтижелері көрсетілген + \'Сізге ұнауы мүмкін\' бөлімін жасыру + \'Сізге ұнауы мүмкін\' бөлімі жасырылған + \'Сізге ұнауы мүмкін\' бөлімі көрсетілген + This button usually appears in the video player for certain videos. --> + + \'Тікелей чат қайталауы\' түймесін жасыру + Ойнатқыш үстіндегі тікелей чат қайталау түймесі жасырылған + Ойнатқыш үстіндегі тікелей чат қайталау түймесі көрсетілген + Бейне атауын жасыру + Ойнатқыш үстіндегі бейне атауы жасырылған + Ойнатқыш үстіндегі бейне атауы көрсетілген + \'Курс үлгерімі\' бөлімін жасыру + Курс үлгерімі бөлімі жасырылған + Курс үлгерімі бөлімі көрсетілген + \'Зерттеу\' бөлімін жасыру + Бұл курсты зерттеу және подкаст бөлімдерін зерттеу жасырылған + Бұл курсты зерттеу және подкаст бөлімдерін зерттеу көрсетілген + \'Осы курсты зерттеу\' бөлімін жасыру + Осы курсты зерттеу бөлімі жасырылған + Осы курсты зерттеу бөлімі көрсетілген + \'Подкастты зерттеу\' бөлімін жасыру + Подкастты зерттеу бөлімі жасырылған + Подкастты зерттеу бөлімі көрсетілген + \'Таңдаулы орындар\' бөлімін жасыру + Таңдаулы орындар бөлімі жасырылған + Таңдаулы орындар бөлімі көрсетілген + Таспаның қалқымалы мәзірінің сүзгісін қосу + Таспаның қалқымалы мәзірінің сүзгісі қосылған + Таспаның қалқымалы мәзірінің сүзгісі өшірілген + Таспаның қалқымалы мәзірінің сүзгісі + Әр жолға бір-бірден сүзгілеу үшін қалқымалы мәзір атауларын енгізіңіз + \'Ойындар\' бөлімін жасыру + Ойындар бөлімі жасырылған + Ойындар бөлімі көрсетілген + \'Музыка\' бөлімін жасыру + Музыка бөлімі жасырылған + Музыка бөлімі көрсетілген + \'Викториналар\' бөлімін жасыру + Викториналар бөлімі жасырылған + Викториналар бөлімі көрсетілген + Арна қойындысы сүзгісін қосу + Арна қойындысы сүзгісі қосылған + Арна қойындысы сүзгісі өшірілген + Арна қойындысының сүзгісі + Әр жолға бір-бірден сүзгілеу үшін арна қойындысының атауларын енгізіңіз + "Шектеулер: +• Shorts сөрелері, арна беттері және іздеу нәтижелері қаралым санын әлі де көрсетуі мүмкін. +• Бұл мүмкіндік автомобиль форма-факторымен жұмыс істемейді." + "Шектеулер: +• Shorts сөрелері, арна беттері және іздеу нәтижелері жүктеу уақытын әлі де көрсетуі мүмкін. +• Бұл мүмкіндік автомобиль форма-факторымен жұмыс істемейді." + "Басты бет/Жазылымдар/Іздеу нәтижелері кілт сөз тіркестеріне сәйкес келетін мазмұнды жасыру үшін сүзгіленген + +Шектеулер: +• Shorts арна атауы бойынша жасырылмайды +• Кейбір UI компоненттері жасырылмауы мүмкін +• Кілт сөзді іздеу нәтиже көрсетпеуі мүмкін" - + Толық экранды жарнамалар жасырылған + Ойнатқыштың қалқымалы жарнамаларын жасыру + Ойнатқыштың қалқымалы жарнамалары жасырылған + Ойнатқыштың қалқымалы жарнамалары көрсетілген + Ойнатқыш үстіндегі өнімдер баннерін көрсету жасырылған + Ойнатқыш үстіндегі өнімдер баннерін көрсету көрсетілген + YouTube Premium жарнамаларын жасыру + YouTube Premium жарнамалары жасырылған + YouTube Premium жарнамалары көрсетілген - - + + URL мекенжайы алмасу буферіне көшірілді + Уақыт белгісі бар URL көшірілді + Бейне URL мекенжайын көшіру түймесін көрсету + Бейне URL мекенжайын көшіру түймесі көрсетілген. Бейне URL мекенжайын көшіру үшін түртіңіз. Уақыт белгісімен көшіру үшін түртіп ұстаңыз + Бейне URL мекенжайын көшіру түймесі көрсетілмеген + Уақыт белгісі бар URL көшіру түймесін көрсету + Уақыт белгісі бар URL көшіру түймесі көрсетілген. Уақыт белгісі бар бейне URL мекенжайын көшіру үшін түртіңіз. Уақыт белгісінсіз көшіру үшін түртіп ұстаңыз + Уақыт белгісі бар URL көшіру түймесі көрсетілмеген + - + + \'Теледидарға кіру\' қалқымалы терезесін өшіру + Теледидарға кіру қалқымалы терезесі өшірілген + Теледидарға кіру қалқымалы терезесі қосылған + - + + Іздеу үшін түртуді қосу + Іздеу үшін түрту қосылған + Іздеу үшін түрту өшірілген + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Жасыру кейбір пайдаланушы тіркелгілері үшін жұмыс істемеуі мүмкін. - + + Навигация түймелері + Навигация тақтасының түймелерін жасыру немесе өзгерту + \'Басты бет\' түймесін жасыру + Басты бет түймесі жасырылған + Басты бет түймесі көрсетілген + Shorts түймесін жасыру + Shorts түймесі жасырылған + Shorts түймесі көрсетілген + \'Жасау\' түймесін жасыру + Жасау түймесі жасырылған + Жасау түймесі көрсетілген + \'Жазылымдар\' түймесін жасыру + Жазылымдар түймесі жасырылған + Жазылымдар түймесі көрсетілген + \'Хабарландырулар\' түймесін жасыру + Хабарландырулар түймесі жасырылған + Хабарландырулар түймесі көрсетілген + \'Жасау\' мен \'Хабарландырулар\' түймелерін ауыстыру + Жасау түймесі Хабарландырулар түймесімен ауыстырылған + Жасау түймесі Хабарландырулар түймесімен ауыстырылмаған + Егер бұл параметрді өзгерту күшіне енбесе, Құпия режимге ауыстырып көріңіз. + Навигация түймесінің белгілерін жасыру + Белгілер жасырылған + Белгілер көрсетілген + Жіңішке навигация түймелерін қосу + Навигация түймелері арасындағы аралық жіңішке + Навигация түймелері арасындағы аралық қалыпты + Навигация тақтасының анимацияларын қосу + Навигациялық ауысулар анимацияланған + Навигациялық ауысулар анимацияланбаған + Мөлдір емес күй жолағын өшіру + Күй жолағы мөлдір емес + Күй жолағы мөлдір емес немесе мөлдір + "Шектеулер: +• Бейне ойнатқыштың жоғарғы жағында қара жолақ пайда болуы мүмкін. +• Кейбір құрылғыларда бұл мүмкіндікті қосу жүйелік навигация жолағын мөлдірге өзгертуі мүмкін." + Ашық мөлдір жолақты өшіру + Ашық режимдегі навигация тақтасы мөлдір емес + Ашық режимдегі навигация тақтасы мөлдір емес немесе мөлдір + Қараңғы мөлдір жолақты өшіру + Қараңғы режимдегі навигация тақтасы мөлдір емес + Қараңғы режимдегі навигация тақтасы мөлдір емес немесе мөлдір + Құралдар тақтасы + Құралдар тақтасының компоненттерін жасыру немесе өзгерту + \'Жасау\' түймесін жасыру + Жасау түймесі жасырылған + Жасау түймесі көрсетілген + \'Хабарландырулар\' түймесін жасыру + Хабарландырулар түймесі жасырылған + Хабарландырулар түймесі көрсетілген + \'Іздеу\' түймесін жасыру + Іздеу түймесі жасырылған + Іздеу түймесі көрсетілген. + Кең іздеу жолағын қосу + Кең іздеу жолағы қосулы + Кең іздеу жолағы өшірулі @@ -126,25 +315,67 @@ Second \"item\" text" + \'Жиыру\' түймесін жасыру + Жиыру түймесі жасырылған + Жиыру түймесі көрсетілген + \'Толық экран\' түймесін жасыру + Толық экран түймесі жасырылған + Толық экран түймесі көрсетілген + + + Бейненің соңындағы карталарды жасыру + Бейненің соңындағы карталар жасырылған + Бейненің соңындағы карталар көрсетілген - + Толық экранды үлкен іздеу жолағын қосу + Толық экранды іздеу жолағы үлкен өлшемді + Толық экранды іздеу жолағы қалыпты өлшемді + Арна бетіндегі Shorts жасыру + Арна бетінде жасырылған + Арна бетінде көрсетілген + Бейне сипаттамасындағы Shorts жасыру + Бейне сипаттамасында жасырылған + Бейне сипаттамасында көрсетілген + ЖИ түймесін жасыру + ЖИ түймесі жасырылған + ЖИ түймесі көрсетілген + \'Автоматты түрде дубляждалған\' белгісін жасыру + Автоматты түрде дубляждалған белгісі жасырылған + Автоматты түрде дубляждалған белгісі көрсетілген + - + + Автоматты ойнату алдын ала қарауын жасыру + Автоматты ойнату алдын ала қарауы жасырылған + Автоматты ойнату алдын ала қарауы көрсетілген + + + Бейненің соңында ұсынылған бейнені жасыру + "Автоматты ойнату өшірілген кезде бейненің соңында ұсынылған бейне жасырылған + +Автоматты ойнатуды YouTube параметрлерінен өзгертуге болады: +Параметрлер → Ойнату → Келесі бейнені автоматты ойнату" + Бейненің соңында ұсынылған бейне көрсетілген + - + + Ойнатқыштың қалқымалы панельдерін жасыру + Ойнатқыштың қалқымалы панельдері жасырылған + Ойнатқыштың қалқымалы панельдері көрсетілген + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Тек музыкалық бейнелерде пайдалануға арналған. Басқа санатқа кірмейтін, музыкасыз музыкалық бейнелер бөлімдері + Сегментті жіберу мүмкін емес: %s + "Сегментті жіберу мүмкін емес. +Бұрыннан бар" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Өшірілген + Түс + Ақ-қара + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Түртіп ұстау хаптикасын өшіру + Түртіп ұстау хаптикасы өшірілген + Түртіп ұстау хаптикасы қосылған + @@ -200,6 +441,11 @@ Second \"item\" text" + + Премиум сапа опцияларын жасыру + Премиум сапа опциялары жасырылған + Премиум сапа опциялары көрсетілген + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-km-rKH/strings.xml b/patches/src/main/resources/addresources/values-km-rKH/strings.xml index 3a40645452..769ade3d7d 100644 --- a/patches/src/main/resources/addresources/values-km-rKH/strings.xml +++ b/patches/src/main/resources/addresources/values-km-rKH/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + បិទ​រូប​តំណាង​ដិត + រូប​តំណាង​មិន​ដិត + រូប​តំណាង​ដិត + GmsCore + ការកំណត់ទាក់ទងនឹង GmsCore + ពិនិត្យរកមើលការអាប់ដេត GmsCore + ការពិនិត្យរកមើលការអាប់ដេតត្រូវបានបើកដំណើរការ + ការពិនិត្យមើលបច្ចុប្បន្នភាពត្រូវបានបិទ + បើកការកំណត់ GmsCore + ការកំណត់របស់ GmsCore + MicroG GmsCore មិនត្រូវបានដំឡើងទេ។ សូមដំឡើងវា។ + ត្រូវការសកម្មភាព + ការត្រួតពិនិត្យបច្ចុប្បន្នភាព MicroG GmsCore បរាជ័យ + មានកំណែថ្មី (%1$s) របស់ MicroG GmsCore អាចប្រើបានហើយ។ បច្ចុប្បន្ន អ្នកកំពុងប្រើកំណែ %2$s។ + "MicroG GmsCore មិនមានការអនុញ្ញាតឱ្យដំណើរការក្នុងផ្ទៃខាងក្រោយទេ។ + +អនុវត្តតាមការណែនាំ \"កុំបិទកម្មវិធីរបស់ខ្ញុំ\" សម្រាប់ទូរស័ព្ទរបស់អ្នក ហើយអនុវត្តការណែនាំទៅការដំឡើង MicroG របស់អ្នក។ + +នេះតម្រូវឱ្យកម្មវិធីដំណើរការ។" + បើកគេហទំព័រ + បោះបង់ + "ការបង្កើនប្រសិទ្ធភាពថ្ម MicroG GmsCore ត្រូវតែបិទដើម្បីការពារបញ្ហា។ + +ការបិទការបង្កើនប្រសិទ្ធភាពថ្មសម្រាប់ MicroG នឹងមិនប៉ះពាល់ដល់ការប្រើប្រាស់ថ្មទេ។ + +ចុចប៊ូតុងបន្ត ហើយអនុញ្ញាតឱ្យមានការផ្លាស់ប្តូរការបង្កើនប្រសិទ្ធភាព។" + បន្ត - + + ចាប់ផ្ដើមកម្មវិធីឡើងវិញដើម្បីប្រើមុខងារនេះ + កំណត់ហេតុប្រូតូកូលបណ្ដោះអាសន្ន + កំណត់ហេតុដោះស្រាយកំហុសរួមបញ្ចូលប្រូតូកូលបណ្ដោះអាសន្ន + កំណត់ហេតុដោះស្រាយកំហុសមិនរួមបញ្ចូលប្រូតូកូលបណ្ដោះអាសន្ន + "ការបើកការកំណត់នេះនឹងកត់ត្រាទិន្នន័យប្លង់បន្ថែម រួមទាំងអត្ថបទនៅលើអេក្រង់សម្រាប់សមាសធាតុ UI មួយចំនួន។ + +នេះអាចជួយកំណត់អត្តសញ្ញាណសមាសធាតុនៅពេលបង្កើតតម្រងផ្ទាល់ខ្លួន។ + +ទោះជាយ៉ាងណាក៏ដោយ ការបើកដំណើរការនេះក៏នឹងកត់ត្រាទិន្នន័យអ្នកប្រើប្រាស់មួយចំនួនដូចជាអាសយដ្ឋាន IP របស់អ្នកផងដែរ។" + @@ -48,40 +85,135 @@ Second \"item\" text" - + លាក់ធ្នើហាងអ្នកបង្កើត + ធ្នើហាងអ្នកបង្កើតនៅក្រោមកម្មវិធីចាក់វីដេអូត្រូវបានលាក់ + ធ្នើហាងអ្នកបង្កើតនៅក្រោមកម្មវិធីចាក់វីដេអូត្រូវបានបង្ហាញ + លាក់ផ្នែកមតិយោបល់ក្រោមវីដេអូក្នុងមតិព័ត៌មានដើម + ផ្នែកមតិយោបល់ក្រោមវីដេអូក្នុងមតិព័ត៌មានដើមត្រូវបានលាក់ + ផ្នែកមតិយោបល់ក្រោមវីដេអូក្នុងមតិព័ត៌មានដើមត្រូវបានបង្ហាញ + + លាក់ប៊ូតុង \'វីដេអូចុងក្រោយបំផុត\' + ប៊ូតុងវីដេអូចុងក្រោយបំផុតត្រូវបានលាក់ + ប៊ូតុងវីដេអូចុងក្រោយបំផុតត្រូវបានបង្ហាញ + + លាក់លទ្ធផលស្វែងរកតាមគេហទំព័រ + លទ្ធផលស្វែងរកតាមគេហទំព័រត្រូវបានលាក់ + លទ្ធផលស្វែងរកតាមគេហទំព័រត្រូវបានបង្ហាញ + លាក់ផ្នែក \'អ្នកប្រហែលជាចូលចិត្ត\' + ផ្នែក \'អ្នកប្រហែលជាចូលចិត្ត\' ត្រូវបានលាក់ + ផ្នែក \'អ្នកប្រហែលជាចូលចិត្ត\' ត្រូវបានបង្ហាញ + This button usually appears in the video player for certain videos. --> + + លាក់ប៊ូតុង \'ចាក់សារឡើងវិញនៃការជជែកផ្ទាល់\' + ប៊ូតុងចាក់សារឡើងវិញនៃការជជែកផ្ទាល់ក្នុងស្រទាប់ចាក់ត្រូវបានលាក់ + ប៊ូតុងចាក់សារឡើងវិញនៃការជជែកផ្ទាល់ក្នុងស្រទាប់ចាក់ត្រូវបានបង្ហាញ + លាក់ចំណងជើងវីដេអូ + ចំណងជើងវីដេអូក្នុងស្រទាប់ចាក់ត្រូវបានលាក់ + ចំណងជើងវីដេអូក្នុងស្រទាប់ចាក់ត្រូវបានបង្ហាញ + លាក់ \'វឌ្ឍនភាពវគ្គសិក្សា\' + ផ្នែកវឌ្ឍនភាពវគ្គសិក្សាត្រូវបានលាក់ + ផ្នែកវឌ្ឍនភាពវគ្គសិក្សាត្រូវបានបង្ហាញ + លាក់រុករក + ផ្នែករុករកវគ្គសិក្សានេះ និងរុករកផតខាសត្រូវបានលាក់ + ផ្នែករុករកវគ្គសិក្សានេះ និងរុករកផតខាសត្រូវបានបង្ហាញ + លាក់ \'រុករកវគ្គសិក្សានេះ\' + ផ្នែករុករកវគ្គសិក្សានេះត្រូវបានលាក់ + ផ្នែករុករកវគ្គសិក្សានេះត្រូវបានបង្ហាញ + លាក់ \'រុករកផតខាស\' + ផ្នែករុករកផតខាសត្រូវបានលាក់ + ផ្នែករុករកផតខាសត្រូវបានបង្ហាញ + លាក់ \'ទីកន្លែងលេចធ្លោ\' + ផ្នែកទីកន្លែងលេចធ្លោត្រូវបានលាក់ + ផ្នែកទីកន្លែងលេចធ្លោត្រូវបានបង្ហាញ + បើកតម្រងម៉ឺនុយហោះចេញនៃមតិព័ត៌មាន + តម្រងម៉ឺនុយហោះចេញនៃមតិព័ត៌មានត្រូវបានបើក + តម្រងម៉ឺនុយហោះចេញនៃមតិព័ត៌មានត្រូវបានបិទ + តម្រងម៉ឺនុយហោះចេញនៃមតិព័ត៌មាន + បញ្ចូលឈ្មោះម៉ឺនុយហោះចេញដើម្បីត្រង ដោយមួយក្នុងមួយបន្ទាត់ + លាក់ហ្គេម + ផ្នែកហ្គេមត្រូវបានលាក់ + ផ្នែកហ្គេមត្រូវបានបង្ហាញ + លាក់តន្ត្រី + ផ្នែកតន្ត្រីត្រូវបានលាក់ + ផ្នែកតន្ត្រីត្រូវបានបង្ហាញ + លាក់កម្រងសំណួរ + ផ្នែកកម្រងសំណួរត្រូវបានលាក់ + ផ្នែកកម្រងសំណួរត្រូវបានបង្ហាញ + បើកតម្រងផ្ទាំងឆានែល + តម្រងផ្ទាំងឆានែលត្រូវបានបើក + តម្រងផ្ទាំងឆានែលត្រូវបានបិទ + តម្រងផ្ទាំងឆានែល + បញ្ចូលឈ្មោះផ្ទាំងឆានែលដើម្បីត្រង ដោយមួយក្នុងមួយបន្ទាត់ + "ដែនកំណត់: +• Shorts ធ្នើ គេហទំព័រឆានែល និងលទ្ធផលស្វែងរកអាចនៅតែបង្ហាញចំនួនមើល។ +• មុខងារនេះមិនដំណើរការជាមួយកត្តាទម្រង់រថយន្តទេ។" + "ដែនកំណត់: +• Shorts ធ្នើ គេហទំព័រឆានែល និងលទ្ធផលស្វែងរកអាចនៅតែបង្ហាញពេលវេលាផ្ទុកឡើង។ +• មុខងារនេះមិនដំណើរការជាមួយកត្តាទម្រង់រថយន្តទេ។" + "មតិព័ត៌មានដើម/ការជាវ/លទ្ធផលស្វែងរកត្រូវបានត្រងដើម្បីលាក់មាតិកាដែលត្រូវគ្នានឹងឃ្លាពាក្យគន្លឹះ + +ដែនកំណត់: +• Shorts មិនអាចលាក់ដោយឈ្មោះឆានែលបានទេ +• ធាតុផ្សំ UI មួយចំនួនប្រហែលជាមិនត្រូវបានលាក់ទេ +• ការស្វែងរកពាក្យគន្លឹះអាចបង្ហាញលទ្ធផលគ្មាន" - + ការផ្សាយពាណិជ្ជកម្មពេញអេក្រង់ត្រូវបានលាក់ + លាក់ការផ្សាយពាណិជ្ជកម្មលេចឡើងរបស់កម្មវិធីចាក់ + ការផ្សាយពាណិជ្ជកម្មលេចឡើងរបស់កម្មវិធីចាក់ត្រូវបានលាក់ + ការផ្សាយពាណិជ្ជកម្មលេចឡើងរបស់កម្មវិធីចាក់ត្រូវបានបង្ហាញ + បដាផលិតផលមើលក្នុងស្រទាប់កម្មវិធីចាក់ត្រូវបានលាក់ + បដាផលិតផលមើលក្នុងស្រទាប់កម្មវិធីចាក់ត្រូវបានបង្ហាញ + លាក់ការផ្សព្វផ្សាយ YouTube Premium + ការផ្សព្វផ្សាយ YouTube Premium ត្រូវបានលាក់ + ការផ្សព្វផ្សាយ YouTube Premium ត្រូវបានបង្ហាញ - - + + URL ត្រូវបានចម្លងទៅក្ដារតម្បៀតខ្ទាស់ + URL ដែលមានត្រាពេលវេលាត្រូវបានចម្លង + បង្ហាញប៊ូតុងចម្លង URL វីដេអូ + ប៊ូតុងចម្លង URL វីដេអូត្រូវបានបង្ហាញ។ ចុចដើម្បីចម្លង URL វីដេអូ។ ចុចឱ្យជាប់ដើម្បីចម្លងជាមួយត្រាពេលវេលា + ប៊ូតុងចម្លង URL វីដេអូមិនត្រូវបានបង្ហាញទេ + បង្ហាញប៊ូតុងចម្លង URL ត្រាពេលវេលា + ប៊ូតុងចម្លង URL ត្រាពេលវេលាត្រូវបានបង្ហាញ។ ចុចដើម្បីចម្លង URL វីដេអូជាមួយត្រាពេលវេលា។ ចុចឱ្យជាប់ដើម្បីចម្លងដោយគ្មានត្រាពេលវេលា + ប៊ូតុងចម្លង URL ត្រាពេលវេលាមិនត្រូវបានបង្ហាញទេ + - + + បិទការលេចឡើង \'ចូលទៅទូរទស្សន៍\' + ការលេចឡើងចូលទៅទូរទស្សន៍ត្រូវបានបិទ + ការលេចឡើងចូលទៅទូរទស្សន៍ត្រូវបានបើក + - + + បើកការប៉ះដើម្បីស្វែងរក + ការប៉ះដើម្បីស្វែងរកត្រូវបានបើក + ការប៉ះដើម្បីស្វែងរកត្រូវបានបិទ + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + ការលាក់ប្រហែលជាមិនដំណើរការសម្រាប់គណនីអ្នកប្រើប្រាស់មួយចំនួនទេ។ - + + ប៊ូតុងរុករក + លាក់ ឬផ្លាស់ប្ដូរប៊ូតុងរបាររុករក + លាក់ទំព័រដើម + ប៊ូតុងទំព័រដើមត្រូវបានលាក់ + ប៊ូតុងទំព័រដើមត្រូវបានបង្ហាញ + លាក់ Shorts + ប៊ូតុង Shorts ត្រូវបានលាក់ + ប៊ូតុង Shorts ត្រូវបានបង្ហាញ + លាក់បង្កើត + ប៊ូតុងបង្កើតត្រូវបានលាក់ + ប៊ូតុងបង្កើតត្រូវបានបង្ហាញ + លាក់ការជាវ + ប៊ូតុងការជាវត្រូវបានលាក់ + ប៊ូតុងការជាវត្រូវបានបង្ហាញ + លាក់ការជូនដំណឹង + ប៊ូតុងការជូនដំណឹងត្រូវបានលាក់ + ប៊ូតុងការជូនដំណឹងត្រូវបានបង្ហាញ + ប្ដូរបង្កើតជាមួយការជូនដំណឹង + ប៊ូតុងបង្កើតត្រូវបានប្ដូរជាមួយប៊ូតុងការជូនដំណឹង + ប៊ូតុងបង្កើតមិនត្រូវបានប្ដូរជាមួយប៊ូតុងការជូនដំណឹងទេ + ប្រសិនបើការផ្លាស់ប្ដូរការកំណត់នេះមិនមានប្រសិទ្ធភាពទេ សូមសាកល្បងប្ដូរទៅរបៀបអនាមិក។ + លាក់ស្លាកប៊ូតុងរុករក + ស្លាកត្រូវបានលាក់ + ស្លាកត្រូវបានបង្ហាញ + បើកប៊ូតុងរុករកតូចចង្អៀត + ចន្លោះរវាងប៊ូតុងរុករកគឺតូចចង្អៀត + ចន្លោះរវាងប៊ូតុងរុករកគឺធម្មតា + បើកចលនារបាររុករក + ការផ្លាស់ប្ដូរការរុករកត្រូវបានធ្វើឱ្យមានចលនា + ការផ្លាស់ប្ដូរការរុករកមិនត្រូវបានធ្វើឱ្យមានចលនាទេ + បិទរបារស្ថានភាពថ្លា + របារស្ថានភាពគឺស្រអាប់ + របារស្ថានភាពគឺស្រអាប់ ឬថ្លា + "ដែនកំណត់: +• របារខ្មៅអាចលេចឡើងនៅផ្នែកខាងលើនៃកម្មវិធីចាក់វីដេអូ។ +• នៅលើឧបករណ៍មួយចំនួន ការបើកមុខងារនេះអាចផ្លាស់ប្ដូររបាររុករកប្រព័ន្ធទៅជាថ្លា។" + បិទរបារថ្លាស្រាល + របាររុករករបៀបពន្លឺគឺស្រអាប់ + របាររុករករបៀបពន្លឺគឺស្រអាប់ ឬថ្លា + បិទរបារថ្លាងងឹត + របាររុករករបៀបងងឹតគឺស្រអាប់ + របាររុករករបៀបងងឹតគឺស្រអាប់ ឬថ្លា + របារឧបករណ៍ + លាក់ ឬផ្លាស់ប្ដូរធាតុផ្សំរបារឧបករណ៍ + លាក់ប៊ូតុងបង្កើត + ប៊ូតុងបង្កើតត្រូវបានលាក់ + ប៊ូតុងបង្កើតត្រូវបានបង្ហាញ + លាក់ប៊ូតុងការជូនដំណឹង + ប៊ូតុងការជូនដំណឹងត្រូវបានលាក់ + ប៊ូតុងការជូនដំណឹងត្រូវបានបង្ហាញ + លាក់ប៊ូតុងស្វែងរក + ប៊ូតុងស្វែងរកត្រូវបានលាក់ + ប៊ូតុងស្វែងរកត្រូវបានបង្ហាញ។ + បើករបារស្វែងរកធំទូលាយ + របារស្វែងរកធំទូលាយត្រូវបានបើក + របារស្វែងរកធំទូលាយត្រូវបានបិទ @@ -126,25 +315,67 @@ Second \"item\" text" + លាក់ប៊ូតុងបង្រួម + ប៊ូតុងបង្រួមត្រូវបានលាក់ + ប៊ូតុងបង្រួមត្រូវបានបង្ហាញ + លាក់ប៊ូតុងពេញអេក្រង់ + ប៊ូតុងពេញអេក្រង់ត្រូវបានលាក់ + ប៊ូតុងពេញអេក្រង់ត្រូវបានបង្ហាញ + + + លាក់កាតអេក្រង់បញ្ចប់ + កាតអេក្រង់បញ្ចប់ត្រូវបានលាក់ + កាតអេក្រង់បញ្ចប់ត្រូវបានបង្ហាញ - + បើករបារស្វែងរកធំពេញអេក្រង់ + របារស្វែងរកពេញអេក្រង់គឺមានទំហំធំ + របារស្វែងរកពេញអេក្រង់គឺមានទំហំធម្មតា + លាក់ Shorts ក្នុងទំព័រឆានែល + លាក់ក្នុងទំព័រឆានែល + បង្ហាញក្នុងទំព័រឆានែល + លាក់ Shorts ក្នុងការពន្យល់វីដេអូ + លាក់ក្នុងការពន្យល់វីដេអូ + បង្ហាញក្នុងការពន្យល់វីដេអូ + លាក់ប៊ូតុង AI + ប៊ូតុង AI ត្រូវបានលាក់ + ប៊ូតុង AI ត្រូវបានបង្ហាញ + លាក់ស្លាក \'បកប្រែដោយស្វ័យប្រវត្តិ\' + ស្លាកបកប្រែដោយស្វ័យប្រវត្តិត្រូវបានលាក់ + ស្លាកបកប្រែដោយស្វ័យប្រវត្តិត្រូវបានបង្ហាញ + - + + លាក់ការមើលជាមុននៃការចាក់ដោយស្វ័យប្រវត្តិ + ការមើលជាមុននៃការចាក់ដោយស្វ័យប្រវត្តិត្រូវបានលាក់ + ការមើលជាមុននៃការចាក់ដោយស្វ័យប្រវត្តិត្រូវបានបង្ហាញ + + + លាក់វីដេអូដែលបានណែនាំនៅអេក្រង់បញ្ចប់ + "វីដេអូដែលបានណែនាំនៅអេក្រង់បញ្ចប់ត្រូវបានលាក់នៅពេលដែលការចាក់ដោយស្វ័យប្រវត្តិត្រូវបានបិទ + +ការចាក់ដោយស្វ័យប្រវត្តិអាចត្រូវបានផ្លាស់ប្ដូរនៅក្នុងការកំណត់ YouTube: +ការកំណត់ → ការចាក់ → ចាក់វីដេអូបន្ទាប់ដោយស្វ័យប្រវត្តិ" + វីដេអូដែលបានណែនាំនៅអេក្រង់បញ្ចប់ត្រូវបានបង្ហាញ + - + + លាក់ផ្ទាំងលេចឡើងកម្មវិធីចាក់ + ផ្ទាំងលេចឡើងកម្មវិធីចាក់ត្រូវបានលាក់ + ផ្ទាំងលេចឡើងកម្មវិធីចាក់ត្រូវបានបង្ហាញ + @@ -155,10 +386,12 @@ Second \"item\" text" - - + សម្រាប់តែការប្រើប្រាស់ក្នុងវីដេអូតន្ត្រីប៉ុណ្ណោះ។ ផ្នែកនៃវីដេអូតន្ត្រីដែលគ្មានតន្ត្រី ដែលមិនទាន់ត្រូវបានគ្របដណ្ដប់ដោយប្រភេទផ្សេងទៀត។ + មិនអាចបញ្ជូនផ្នែកនេះបានទេ: %s + "មិនអាចបញ្ជូនផ្នែកនេះបានទេ។ +មានរួចហើយ" @@ -170,7 +403,11 @@ Second \"item\" text" - + + បានបិទ + ពណ៌ + ខ្មៅនិងស + @@ -187,7 +424,11 @@ Second \"item\" text" - + + បិទការប៉ះនិងសង្កត់ haptics + ការប៉ះនិងសង្កត់ haptics ត្រូវបានបិទ + ការប៉ះនិងសង្កត់ haptics ត្រូវបានបើក + @@ -200,6 +441,11 @@ Second \"item\" text" + + លាក់ជម្រើសគុណភាព Premium + ជម្រើសគុណភាព Premium ត្រូវបានលាក់ + ជម្រើសគុណភាព Premium ត្រូវបានបង្ហាញ + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml index f9bd2dd50c..3c6a1f3f5c 100644 --- a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml @@ -43,18 +43,47 @@ Second \"item\" text" ಬಣ್ಣ ಮರುಹೊಂದಿಸಿ ಅಮಾನ್ಯ ಬಣ್ಣ ಮರುಪ್ರಾರಂಭದ ಅಗತ್ಯವಿದೆ + ದಪ್ಪ ಐಕಾನ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಐಕಾನ್‌ಗಳು ದಪ್ಪವಾಗಿಲ್ಲ + ಐಕಾನ್‌ಗಳು ದಪ್ಪವಾಗಿವೆ + GmsCore + GmsCore ಗೆ ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್‌ಗಳು + GmsCore ನವೀಕರಣಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಿ + ನವೀಕರಣಗಳ ಪರಿಶೀಲನೆ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಅಪ್‌ಡೇಟ್‌ಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + GmsCore ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ + GmsCore ಸೆಟ್ಟಿಂಗ್‌ಗಳು + MicroG GmsCore ಸ್ಥಾಪಿಸಿಲ್ಲ. ಅದನ್ನು ಸ್ಥಾಪಿಸಿ. + ಕ್ರಮದ ಅಗತ್ಯವಿದೆ + MicroG GmsCore ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ವಿಫಲವಾಗಿದೆ + MicroG GmsCore ನ ಹೊಸ ಆವೃತ್ತಿ (%1$s) ಲಭ್ಯವಿದೆ. ಪ್ರಸ್ತುತ, ನೀವು %2$s ಆವೃತ್ತಿಯನ್ನು ಬಳಸುತ್ತಿದ್ದೀರಿ. + "MicroG GmsCore ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಚಲಾಯಿಸಲು ಅನುಮತಿ ಹೊಂದಿಲ್ಲ.\n\nನಿಮ್ಮ ಫೋನ್‌ಗಾಗಿ \"ನನ್ನ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಕೊಲ್ಲಬೇಡಿ\" ಮಾರ್ಗದರ್ಶಿಯನ್ನು ಅನುಸರಿಸಿ ಮತ್ತು ನಿಮ್ಮ MicroG ಸ್ಥಾಪನೆಗೆ ಸೂಚನೆಗಳನ್ನು ಅನ್ವಯಿಸಿ.\n\nಅಪ್ಲಿಕೇಶನ್ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಇದು ಅಗತ್ಯವಿದೆ." + ವೆಬ್‌ಸೈಟ್ ತೆರೆಯಿರಿ + ರದ್ದುಮಾಡಿ + "ಸಮಸ್ಯೆಗಳನ್ನು ತಡೆಗಟ್ಟಲು MicroG GmsCore ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕು.\n\nMicroG ಗಾಗಿ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದು ಬ್ಯಾಟರಿ ಬಳಕೆಗೆ ನಕಾರಾತ್ಮಕವಾಗಿ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ.\n\nಮುಂದುವರಿ ಬಟನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಆಪ್ಟಿಮೈಸೇಶನ್ ಬದಲಾವಣೆಗಳನ್ನು ಅನುಮತಿಸಿ." + ಮುಂದುವರಿಸಿ - + + ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ + ಲಾಗ್ ಪ್ರೋಟೋಕಾಲ್ ಬಫರ್ + ಡೀಬಗ್ ಲಾಗ್‌ಗಳು ಪ್ರೋಟೋ ಬಫರ್ ಅನ್ನು ಒಳಗೊಂಡಿವೆ + ಡೀಬಗ್ ಲಾಗ್‌ಗಳು ಪ್ರೋಟೋ ಬಫರ್ ಅನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ + "ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಕೆಲವು UI ಘಟಕಗಳ ಆನ್-ಸ್ಕ್ರೀನ್ ಪಠ್ಯ ಸೇರಿದಂತೆ ಹೆಚ್ಚುವರಿ ವಿನ್ಯಾಸ ಡೇಟಾವನ್ನು ಲಾಗ್ ಮಾಡಲಾಗುತ್ತದೆ. + +ಕಸ್ಟಮ್ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ರಚಿಸುವಾಗ ಘಟಕಗಳನ್ನು ಗುರುತಿಸಲು ಇದು ಸಹಾಯ ಮಾಡುತ್ತದೆ. + +ಆದಾಗ್ಯೂ, ಇದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ನಿಮ್ಮ IP ವಿಳಾಸದಂತಹ ಕೆಲವು ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ಸಹ ಲಾಗ್ ಮಾಡಲಾಗುತ್ತದೆ." + @@ -64,40 +93,135 @@ Second \"item\" text" - + ರಚನೆಕಾರರ ಅಂಗಡಿ ಶೆಲ್ಫ್ ಮರೆಮಾಡಿ + ವೀಡಿಯೊ ಪ್ಲೇಯರ್ ಕೆಳಗಿರುವ ರಚನೆಕಾರರ ಅಂಗಡಿ ಶೆಲ್ಫ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ವೀಡಿಯೊ ಪ್ಲೇಯರ್ ಕೆಳಗಿರುವ ರಚನೆಕಾರರ ಅಂಗಡಿ ಶೆಲ್ಫ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಮುಖಪುಟ ಫೀಡ್‌ನಲ್ಲಿ ವೀಡಿಯೊಗಳ ಕೆಳಗಿರುವ ಕಾಮೆಂಟ್ಗಳ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಿ + ಮುಖಪುಟ ಫೀಡ್‌ನಲ್ಲಿ ವೀಡಿಯೊಗಳ ಕೆಳಗಿರುವ ಕಾಮೆಂಟ್ಗಳ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಮುಖಪುಟ ಫೀಡ್‌ನಲ್ಲಿ ವೀಡಿಯೊಗಳ ಕೆಳಗಿರುವ ಕಾಮೆಂಟ್ಗಳ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + + \'ಇತ್ತೀಚಿನ ವೀಡಿಯೊಗಳು\' ಬಟನ್ ಮರೆಮಾಡಿ + ಇತ್ತೀಚಿನ ವೀಡಿಯೊಗಳ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಇತ್ತೀಚಿನ ವೀಡಿಯೊಗಳ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + + ವೆಬ್ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ಮರೆಮಾಡಿ + ವೆಬ್ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ವೆಬ್ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + \'ನೀವು ಇಷ್ಟಪಡಬಹುದು\' ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಿ + \'ನೀವು ಇಷ್ಟಪಡಬಹುದು\' ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + \'ನೀವು ಇಷ್ಟಪಡಬಹುದು\' ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + This button usually appears in the video player for certain videos. --> + + \'ಲೈವ್ ಚಾಟ್ ಮರುಪ್ಲೇ\' ಬಟನ್ ಮರೆಮಾಡಿ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿರುವ ಲೈವ್ ಚಾಟ್ ಮರುಪ್ಲೇ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿರುವ ಲೈವ್ ಚಾಟ್ ಮರುಪ್ಲೇ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ವೀಡಿಯೊ ಶೀರ್ಷಿಕೆ ಮರೆಮಾಡಿ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿರುವ ವೀಡಿಯೊ ಶೀರ್ಷಿಕೆ ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿರುವ ವೀಡಿಯೊ ಶೀರ್ಷಿಕೆ ತೋರಿಸಲಾಗಿದೆ + \'ಕೋರ್ಸ್ ಪ್ರಗತಿ\' ಮರೆಮಾಡಿ + ಕೋರ್ಸ್ ಪ್ರಗತಿ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಕೋರ್ಸ್ ಪ್ರಗತಿ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮರೆಮಾಡಿ + ಈ ಕೋರ್ಸ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮತ್ತು ಪಾಡ್‌ಕಾಸ್ಟ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಈ ಕೋರ್ಸ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮತ್ತು ಪಾಡ್‌ಕಾಸ್ಟ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + \'ಈ ಕೋರ್ಸ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್\' ಮರೆಮಾಡಿ + ಈ ಕೋರ್ಸ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಈ ಕೋರ್ಸ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + \'ಪಾಡ್‌ಕಾಸ್ಟ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್\' ಮರೆಮಾಡಿ + ಪಾಡ್‌ಕಾಸ್ಟ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪಾಡ್‌ಕಾಸ್ಟ್ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + \'ವೈಶಿಷ್ಟ್ಯಪೂರ್ಣ ಸ್ಥಳಗಳು\' ಮರೆಮಾಡಿ + ವೈಶಿಷ್ಟ್ಯಪೂರ್ಣ ಸ್ಥಳಗಳ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ವೈಶಿಷ್ಟ್ಯಪೂರ್ಣ ಸ್ಥಳಗಳ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಫೀಡ್ ಫ್ಲೈಔಟ್ ಮೆನು ಫಿಲ್ಟರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ + ಫೀಡ್ ಫ್ಲೈಔಟ್ ಮೆನು ಫಿಲ್ಟರ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಫೀಡ್ ಫ್ಲೈಔಟ್ ಮೆನು ಫಿಲ್ಟರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಫೀಡ್ ಫ್ಲೈಔಟ್ ಮೆನು ಫಿಲ್ಟರ್ + ಪ್ರತಿ ಸಾಲಿಗೆ ಒಂದರಂತೆ, ಫಿಲ್ಟರ್ ಮಾಡಲು ಫ್ಲೈಔಟ್ ಮೆನು ಹೆಸರುಗಳನ್ನು ನಮೂದಿಸಿ + ಗೇಮಿಂಗ್ ಮರೆಮಾಡಿ + ಗೇಮಿಂಗ್ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಗೇಮಿಂಗ್ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಸಂಗೀತ ಮರೆಮಾಡಿ + ಸಂಗೀತ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಸಂಗೀತ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + ರಸಪ್ರಶ್ನೆಗಳನ್ನು ಮರೆಮಾಡಿ + ರಸಪ್ರಶ್ನೆಗಳ ವಿಭಾಗವನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ರಸಪ್ರಶ್ನೆಗಳ ವಿಭಾಗವನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಚಾನೆಲ್ ಟ್ಯಾಬ್ ಫಿಲ್ಟರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ + ಚಾನೆಲ್ ಟ್ಯಾಬ್ ಫಿಲ್ಟರ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಚಾನೆಲ್ ಟ್ಯಾಬ್ ಫಿಲ್ಟರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಚಾನೆಲ್ ಟ್ಯಾಬ್ ಫಿಲ್ಟರ್ + ಪ್ರತಿ ಸಾಲಿಗೆ ಒಂದರಂತೆ, ಫಿಲ್ಟರ್ ಮಾಡಲು ಚಾನೆಲ್ ಟ್ಯಾಬ್ ಹೆಸರುಗಳನ್ನು ನಮೂದಿಸಿ + "ಮಿತಿಗಳು: +• Shorts ಶೆಲ್ಫ್‌ಗಳು, ಚಾನೆಲ್ ಪುಟಗಳು ಮತ್ತು ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ವೀಕ್ಷಣೆ ಎಣಿಕೆಗಳನ್ನು ಇನ್ನೂ ತೋರಿಸಬಹುದು. +• ಈ ವೈಶಿಷ್ಟ್ಯವು ಆಟೋಮೋಟಿವ್ ಫಾರ್ಮ್ ಫ್ಯಾಕ್ಟರ್‌ನೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ." + "ಮಿತಿಗಳು: +• Shorts ಶೆಲ್ಫ್‌ಗಳು, ಚಾನೆಲ್ ಪುಟಗಳು ಮತ್ತು ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ಅಪ್‌ಲೋಡ್ ಸಮಯವನ್ನು ಇನ್ನೂ ತೋರಿಸಬಹುದು. +• ಈ ವೈಶಿಷ್ಟ್ಯವು ಆಟೋಮೋಟಿವ್ ಫಾರ್ಮ್ ಫ್ಯಾಕ್ಟರ್‌ನೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ." + "ಮುಖಪುಟ/ಚಂದಾದಾರಿಕೆಗಳು/ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ಕೀವರ್ಡ್ ನುಡಿಗಟ್ಟುಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ ವಿಷಯವನ್ನು ಮರೆಮಾಡಲು ಫಿಲ್ಟರ್ ಮಾಡಲಾಗಿದೆ + +ಮಿತಿಗಳು: +• Shorts ಅನ್ನು ಚಾನೆಲ್ ಹೆಸರಿನಿಂದ ಮರೆಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ +• ಕೆಲವು UI ಘಟಕಗಳನ್ನು ಮರೆಮಾಡಲಾಗದಿರಬಹುದು +• ಕೀವರ್ಡ್‌ಗಾಗಿ ಹುಡುಕಿದಾಗ ಯಾವುದೇ ಫಲಿತಾಂಶಗಳನ್ನು ತೋರಿಸದಿರಬಹುದು" - + ಪೂರ್ಣ-ಪರದೆ ಜಾಹೀರಾತುಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಜಾಹೀರಾತುಗಳನ್ನು ಮರೆಮಾಡಿ + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಜಾಹೀರಾತುಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿನ ಉತ್ಪನ್ನಗಳ ಬ್ಯಾನರ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಓವರ್‌ಲೇಯಲ್ಲಿನ ಉತ್ಪನ್ನಗಳ ಬ್ಯಾನರ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + YouTube Premium ಪ್ರಚಾರಗಳನ್ನು ಮರೆಮಾಡಿ + YouTube Premium ಪ್ರಚಾರಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + YouTube Premium ಪ್ರಚಾರಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ - - + + URL ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಲಾಗಿದೆ + ಸಮಯದ ಮುದ್ರೆಯೊಂದಿಗೆ URL ನಕಲಿಸಲಾಗಿದೆ + ವೀಡಿಯೊ URL ನಕಲಿಸುವ ಬಟನ್ ತೋರಿಸಿ + ವೀಡಿಯೊ URL ನಕಲಿಸುವ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವೀಡಿಯೊ URL ಅನ್ನು ನಕಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಸಮಯದ ಮುದ್ರೆಯೊಂದಿಗೆ ನಕಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ + ವೀಡಿಯೊ URL ನಕಲಿಸುವ ಬಟನ್ ಅನ್ನು ತೋರಿಸಿಲ್ಲ + ಸಮಯದ ಮುದ್ರೆ URL ನಕಲಿಸುವ ಬಟನ್ ತೋರಿಸಿ + ಸಮಯದ ಮುದ್ರೆ URL ನಕಲಿಸುವ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ. ಸಮಯದ ಮುದ್ರೆಯೊಂದಿಗೆ ವೀಡಿಯೊ URL ಅನ್ನು ನಕಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಸಮಯದ ಮುದ್ರೆಯಿಲ್ಲದೆ ನಕಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ + ಸಮಯದ ಮುದ್ರೆ URL ನಕಲಿಸುವ ಬಟನ್ ಅನ್ನು ತೋರಿಸಿಲ್ಲ + - + + \'ಟಿವಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ\' ಪಾಪ್‌ಅಪ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಟಿವಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವ ಪಾಪ್‌ಅಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಟಿವಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವ ಪಾಪ್‌ಅಪ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + - + + ಸೀಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಸಕ್ರಿಯಗೊಳಿಸಿ + ಸೀಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಸೀಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + @@ -105,25 +229,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + ಕೆಲವು ಬಳಕೆದಾರರ ಖಾತೆಗಳಿಗೆ ಮರೆಮಾಡುವುದು ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು. - + + ನ್ಯಾವಿಗೇಶನ್ ಬಟನ್‌ಗಳು + ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಬಟನ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ ಅಥವಾ ಬದಲಾಯಿಸಿ + ಮುಖಪುಟ ಮರೆಮಾಡಿ + ಮುಖಪುಟ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಮುಖಪುಟ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + Shorts ಮರೆಮಾಡಿ + Shorts ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + Shorts ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ರಚಿಸಿ ಮರೆಮಾಡಿ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಚಂದಾದಾರಿಕೆಗಳನ್ನು ಮರೆಮಾಡಿ + ಚಂದಾದಾರಿಕೆಗಳ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಚಂದಾದಾರಿಕೆಗಳ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಅಧಿಸೂಚನೆಗಳನ್ನು ಮರೆಮಾಡಿ + ಅಧಿಸೂಚನೆಗಳ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಅಧಿಸೂಚನೆಗಳ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ಅಧಿಸೂಚನೆಗಳೊಂದಿಗೆ ಬದಲಾಯಿಸಿ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ಅಧಿಸೂಚನೆಗಳ ಬಟನ್‌ನೊಂದಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ಅಧಿಸೂಚನೆಗಳ ಬಟನ್‌ನೊಂದಿಗೆ ಬದಲಾಯಿಸಲಾಗಿಲ್ಲ + ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಪರಿಣಾಮ ಬೀರದಿದ್ದರೆ, ಅಜ್ಞಾತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ. + ನ್ಯಾವಿಗೇಶನ್ ಬಟನ್ ಲೇಬಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ + ಲೇಬಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಲೇಬಲ್‌ಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಕಿರಿದಾದ ನ್ಯಾವಿಗೇಶನ್ ಬಟನ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ + ನ್ಯಾವಿಗೇಶನ್ ಬಟನ್‌ಗಳ ನಡುವಿನ ಅಂತರವು ಕಿರಿದಾಗಿದೆ + ನ್ಯಾವಿಗೇಶನ್ ಬಟನ್‌ಗಳ ನಡುವಿನ ಅಂತರವು ಸಾಮಾನ್ಯವಾಗಿರುತ್ತದೆ + ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅನಿಮೇಷನ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ + ನ್ಯಾವಿಗೇಶನ್ ಪರಿವರ್ತನೆಗಳು ಅನಿಮೇಟ್ ಆಗಿವೆ + ನ್ಯಾವಿಗೇಶನ್ ಪರಿವರ್ತನೆಗಳು ಅನಿಮೇಟ್ ಆಗಿಲ್ಲ + ಪಾರದರ್ಶಕವಲ್ಲದ ಸ್ಥಿತಿ ಪಟ್ಟಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಸ್ಥಿತಿ ಪಟ್ಟಿ ಅಪಾರದರ್ಶಕವಾಗಿದೆ + ಸ್ಥಿತಿ ಪಟ್ಟಿ ಅಪಾರದರ್ಶಕ ಅಥವಾ ಪಾರದರ್ಶಕವಾಗಿದೆ + "ಮಿತಿಗಳು: +• ವೀಡಿಯೊ ಪ್ಲೇಯರ್‌ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಕಪ್ಪು ಪಟ್ಟಿ ಕಾಣಿಸಿಕೊಳ್ಳಬಹುದು. +• ಕೆಲವು ಸಾಧನಗಳಲ್ಲಿ, ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಸಿಸ್ಟಮ್ ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅನ್ನು ಪಾರದರ್ಶಕವಾಗಿ ಬದಲಾಯಿಸಬಹುದು." + ತಿಳಿ ಪಾರದರ್ಶಕ ಬಾರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಲೈಟ್ ಮೋಡ್ ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅಪಾರದರ್ಶಕವಾಗಿದೆ + ಲೈಟ್ ಮೋಡ್ ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅಪಾರದರ್ಶಕ ಅಥವಾ ಪಾರದರ್ಶಕವಾಗಿದೆ + ಗಾಢ ಪಾರದರ್ಶಕ ಬಾರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಡಾರ್ಕ್ ಮೋಡ್ ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅಪಾರದರ್ಶಕವಾಗಿದೆ + ಡಾರ್ಕ್ ಮೋಡ್ ನ್ಯಾವಿಗೇಶನ್ ಬಾರ್ ಅಪಾರದರ್ಶಕ ಅಥವಾ ಪಾರದರ್ಶಕವಾಗಿದೆ + ಟೂಲ್‌ಬಾರ್ + ಟೂಲ್‌ಬಾರ್ ಘಟಕಗಳನ್ನು ಮರೆಮಾಡಿ ಅಥವಾ ಬದಲಾಯಿಸಿ + ರಚಿಸಿ ಬಟನ್ ಮರೆಮಾಡಿ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ರಚಿಸಿ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಅಧಿಸೂಚನೆಗಳ ಬಟನ್ ಮರೆಮಾಡಿ + ಅಧಿಸೂಚನೆಗಳ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಅಧಿಸೂಚನೆಗಳ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಹುಡುಕಾಟ ಬಟನ್ ಮರೆಮಾಡಿ + ಹುಡುಕಾಟ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಹುಡುಕಾಟ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ. + ವೈಡ್ ಸರ್ಚ್ ಬಾರ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ + ವೈಡ್ ಸರ್ಚ್ ಬಾರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ವೈಡ್ ಸರ್ಚ್ ಬಾರ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ @@ -142,25 +323,67 @@ Second \"item\" text" + ಸಂಕ್ಷೇಪಿಸು ಬಟನ್ ಮರೆಮಾಡಿ + ಸಂಕ್ಷೇಪಿಸು ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಸಂಕ್ಷೇಪಿಸು ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + ಪೂರ್ಣ-ಪರದೆ ಬಟನ್ ಮರೆಮಾಡಿ + ಪೂರ್ಣ-ಪರದೆ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪೂರ್ಣ-ಪರದೆ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + + + ಅಂತ್ಯ ಪರದೆಯ ಕಾರ್ಡ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ + ಅಂತ್ಯ ಪರದೆಯ ಕಾರ್ಡ್‌ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಅಂತ್ಯ ಪರದೆಯ ಕಾರ್ಡ್‌ಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ - + ಪೂರ್ಣ-ಪರದೆ ದೊಡ್ಡ ಸೀಕ್‌ಬಾರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ + ಪೂರ್ಣ-ಪರದೆ ಸೀಕ್‌ಬಾರ್ ದೊಡ್ಡ ಗಾತ್ರದಲ್ಲಿದೆ + ಪೂರ್ಣ-ಪರದೆ ಸೀಕ್‌ಬಾರ್ ಸಾಮಾನ್ಯ ಗಾತ್ರದಲ್ಲಿದೆ + ಚಾನೆಲ್ ಪುಟದಲ್ಲಿ Shorts ಮರೆಮಾಡಿ + ಚಾನೆಲ್ ಪುಟದಲ್ಲಿ ಮರೆಮಾಡಲಾಗಿದೆ + ಚಾನೆಲ್ ಪುಟದಲ್ಲಿ ತೋರಿಸಲಾಗಿದೆ + ವೀಡಿಯೊ ವಿವರಣೆಯಲ್ಲಿ Shorts ಮರೆಮಾಡಿ + ವೀಡಿಯೊ ವಿವರಣೆಯಲ್ಲಿ ಮರೆಮಾಡಲಾಗಿದೆ + ವೀಡಿಯೊ ವಿವರಣೆಯಲ್ಲಿ ತೋರಿಸಲಾಗಿದೆ + AI ಬಟನ್ ಮರೆಮಾಡಿ + AI ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + AI ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + \'ಸ್ವಯಂ-ಡಬ್ ಮಾಡಲಾಗಿದೆ\' ಲೇಬಲ್ ಮರೆಮಾಡಿ + ಸ್ವಯಂ-ಡಬ್ ಮಾಡಲಾಗಿದೆ ಲೇಬಲ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಸ್ವಯಂ-ಡಬ್ ಮಾಡಲಾಗಿದೆ ಲೇಬಲ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ + - + + ಸ್ವಯಂಪ್ಲೇ ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ಮರೆಮಾಡಿ + ಸ್ವಯಂಪ್ಲೇ ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಸ್ವಯಂಪ್ಲೇ ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ತೋರಿಸಲಾಗಿದೆ + + + ಅಂತ್ಯ ಪರದೆಯ ಸೂಚಿಸಿದ ವೀಡಿಯೊವನ್ನು ಮರೆಮಾಡಿ + "ಸ್ವಯಂಪ್ಲೇ ಆಫ್ ಮಾಡಿದಾಗ ಅಂತ್ಯ ಪರದೆಯ ಸೂಚಿಸಿದ ವೀಡಿಯೊ ಮರೆಮಾಡಲಾಗಿದೆ + +ಸ್ವಯಂಪ್ಲೇ ಅನ್ನು YouTube ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು: +ಸೆಟ್ಟಿಂಗ್‌ಗಳು → ಪ್ಲೇಬ್ಯಾಕ್ → ಮುಂದಿನ ವೀಡಿಯೊವನ್ನು ಸ್ವಯಂಪ್ಲೇ ಮಾಡಿ" + ಅಂತ್ಯ ಪರದೆಯ ಸೂಚಿಸಿದ ವೀಡಿಯೊವನ್ನು ತೋರಿಸಲಾಗಿದೆ + - + + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಪ್ಯಾನೆಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಪ್ಯಾನೆಲ್‌ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ಲೇಯರ್ ಪಾಪ್‌ಅಪ್ ಪ್ಯಾನೆಲ್‌ಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + @@ -171,10 +394,12 @@ Second \"item\" text" - - + ಕೇವಲ ಸಂಗೀತ ವೀಡಿಯೊಗಳಲ್ಲಿ ಬಳಸಲು. ಸಂಗೀತವಿಲ್ಲದ ಸಂಗೀತ ವೀಡಿಯೊಗಳ ವಿಭಾಗಗಳು, ಇನ್ನೊಂದು ವರ್ಗದಿಂದ ಈಗಾಗಲೇ ಒಳಗೊಂಡಿರದವು + ವಿಭಾಗವನ್ನು ಸಲ್ಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ: %s + "ವಿಭಾಗವನ್ನು ಸಲ್ಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. +ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" @@ -186,7 +411,11 @@ Second \"item\" text" - + + ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಬಣ್ಣ + ಕಪ್ಪು ಮತ್ತು ಬಿಳಿ + @@ -203,7 +432,11 @@ Second \"item\" text" - + + ಟ್ಯಾಪ್ ಮತ್ತು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಹ್ಯಾಪ್ಟಿಕ್ಸ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ + ಟ್ಯಾಪ್ ಮತ್ತು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಹ್ಯಾಪ್ಟಿಕ್ಸ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + ಟ್ಯಾಪ್ ಮತ್ತು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಹ್ಯಾಪ್ಟಿಕ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ + @@ -216,6 +449,11 @@ Second \"item\" text" + + ಪ್ರೀಮಿಯಂ ಗುಣಮಟ್ಟದ ಆಯ್ಕೆಗಳನ್ನು ಮರೆಮಾಡಿ + ಪ್ರೀಮಿಯಂ ಗುಣಮಟ್ಟದ ಆಯ್ಕೆಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ + ಪ್ರೀಮಿಯಂ ಗುಣಮಟ್ಟದ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ + @@ -223,7 +461,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 9f09f16e1e..886f8e9a8d 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -18,237 +18,255 @@ Second \"item\" text" --> - - - 앱 이름 - - 사용자 정의 - 앱 아이콘 - 원본 - ReVanced - - ReVanced 최소화 - ReVanced 스케일 - - 사용자 정의 - - - 환경 검사에 실패하였습니다 - 공식 홈페이지 열기 - 닫기 - <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 다른 사람에 의하여 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 제거하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. - 다른 기기에서 패치되었습니다 - ReVanced Manager에 의해 설치되지 않았습니다 - 10분 이상 전에 패치되었습니다 - %s 일 전에 패치되었습니다 - APK 빌드 날짜가 손상되었습니다 - - - ReVanced 알림 - 시청 기록이 저장되지 않습니다.<br><br> DNS 광고 차단기 또는 네트워크 프록시로 인하여 발생한 문제일 가능성이 높습니다.<br><br> 이 문제를 해결하려면 <b>s.youtube.com</b>을 허용 목록에서 제외하거나 모든 DNS 차단기 및 프록시를 해제하세요. - 다시 보지 않기 - - - 설정 - ReVanced - 계속하시겠습니까? - 저장 - 초기화 - 색상 초기화 - 잘못된 색상입니다 - 다시 시작하세요 - 이 변경 사항을 적용하려면 앱을 다시 시작하세요. - 다시 시작 - 가져오기 - 복사하기 - ReVanced 설정을 기본값으로 초기화합니다 - %d 개의 설정을 가져왔습니다 - 설정을 가져올 수 없습니다: %s - 설정 검색 - \'%s\'에 대한 검색 결과가 없습니다 - 다른 키워드를 검색해 보세요 - 최근 검색어 - 검색 기록에서 제거하시겠습니까? - 검색 기록 지우기 - 모든 검색 기록을 지우시겠습니까? - 검색 팁 - "• 경로를 탭하여 설정 카테고리로 이동할 수 있습니다 + + + 앱 이름 + + 사용자 정의 + 앱 아이콘 + 원본 + ReVanced + + ReVanced 최소화 + ReVanced 스케일 + + 사용자 정의 + + + 환경 검사에 실패하였습니다 + 공식 홈페이지 열기 + 닫기 + <h5>이 앱은 사용자가 패치하지 않은 것 같습니다.</h5><br>이 앱은 제대로 작동하지 않을 수 있으며, <b>사용 시 해롭거나 심지어 위험할 수도 있습니다</b>.<br><br>이러한 검사는 이 앱이 다른 사람에 의하여 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:<br><br><small>%1$s</small><br>검증되고 안전한 앱을 사용하고 있는지 확인하려면 <b>이 앱을 제거하고 직접 패치하는 것</b>을 강력히 권장합니다.<p><br>이 경고는 두 번만 표시됩니다. + 다른 기기에서 패치되었습니다 + ReVanced Manager에 의해 설치되지 않았습니다 + 10분 이상 전에 패치되었습니다 + %s 일 전에 패치되었습니다 + APK 빌드 날짜가 손상되었습니다 + + + ReVanced 알림 + 시청 기록이 저장되지 않습니다.<br><br> DNS 광고 차단기 또는 네트워크 프록시로 인하여 발생한 문제일 가능성이 높습니다.<br><br> 이 문제를 해결하려면 <b>s.youtube.com</b>을 허용 목록에서 제외하거나 모든 DNS 차단기 및 프록시를 해제하세요. + 다시 보지 않기 + + + 설정 + ReVanced + 계속하시겠습니까? + 저장 + 초기화 + 색상 초기화 + 잘못된 색상입니다 + 다시 시작하세요 + 이 변경 사항을 적용하려면 앱을 다시 시작하세요. + 다시 시작 + 가져오기 + 복사하기 + ReVanced 설정을 기본값으로 초기화합니다 + %d 개의 설정을 가져왔습니다 + 설정을 가져올 수 없습니다: %s + 설정 검색 + \'%s\'에 대한 검색 결과가 없습니다 + 다른 키워드를 검색해 보세요 + 최근 검색어 + 검색 기록에서 제거하시겠습니까? + 검색 기록 지우기 + 모든 검색 기록을 지우시겠습니까? + 검색 팁 + "• 경로를 탭하여 설정 카테고리로 이동할 수 있습니다 • 설정을 길게 탭하여 설정 위치로 이동할 수 있습니다 • 엔터키를 눌러서 검색어를 기록에 저장할 수 있습니다 • 검색할 경우에 대소문자와 구두점이 무시됩니다 • 상위 설정이 비활성화된 하위 설정 위에 표시됩니다" - 검색 기록이 비어 있습니다 - 검색 기록을 저장하려면 검색어를 입력하고 엔터키를 누르세요 - 설정 검색 기록 표시하기 - 설정 검색 기록을 표시합니다 - 설정 검색 기록을 표시하지 않습니다 - ReVanced 설정 아이콘 표시하기 - 설정 아이콘을 표시합니다 - 설정 아이콘을 표시하지 않습니다 - ReVanced 언어 - "일부 언어의 번역이 누락되었거나 완료되지 않았을 수 있습니다. + 검색 기록이 비어 있습니다 + 검색 기록을 저장하려면 검색어를 입력하고 엔터키를 누르세요 + 설정 검색 기록 표시하기 + 설정 검색 기록을 표시합니다 + 설정 검색 기록을 표시하지 않습니다 + 굵은 아이콘 비활성화하기 + 아이콘을 굵게 표시하지 않습니다 + 아이콘을 굵게 표시합니다 + ReVanced 설정 아이콘 표시하기 + 설정 아이콘을 표시합니다 + 설정 아이콘을 표시하지 않습니다 + ReVanced 언어 + "일부 언어의 번역이 누락되었거나 완료되지 않았을 수 있습니다. -새 언어를 번역하거나 기존 번역을 개선하려면 translate.revanced.app를 방문하세요." - 앱 언어 - 가져오기 / 내보내기 - ReVanced 설정을 가져오거나 내보낼 수 있습니다 - - ReVanced Patches <i>%s</i><br>버전을 사용 중입니다 - 알림 - Pre-release 버전이므로<br>알려지지 않은 문제점이<br>발생할 수 있습니다 - 공식 링크 - + ReVanced Patches <i>%s</i><br>버전을 사용하는 중입니다 + 알림 + Pre-release 버전이므로<br>예상되지 않은 문제점이<br>발생할 수 있습니다 + 공식 링크 + - - - GmsCore 설정 - 알림 수신을 위한 클라우드 메시징을 설정할 수 있습니다 - - MicroG GmsCore가 설치되어 있지 않습니다. 설치하세요. - 필수 조치 - "MicroG GmsCore에 백그라운드에서 실행할 수 있는 권한이 없습니다. + + + GmsCore + GmsCore 관련 설정을 할 수 있습니다 + GmsCore 업데이트 확인 + 앱 시작 시 GmsCore 업데이트를 확인합니다 + 앱 시작 시 GmsCore 업데이트를 확인하지 않습니다 + GmsCore 설정 열기 + GmsCore 설정을 실행할 수 있습니다 + + MicroG GmsCore가 설치되어 있지 않습니다. 설치하세요. + 필수 조치 + MicroG GmsCore 업데이트를 확인할 수 없습니다 + MicroG GmsCore의 새 버전(%1$s)을 업데이트할 수 있습니다. 현재 %2$s 버전을 사용 중입니다. + "MicroG GmsCore에 백그라운드에서 실행할 수 있는 권한이 없습니다. 이 기기에 대한 \"Don't kill my app\" 가이드를 읽어보고, MicroG 설치 지침을 적용하세요. 앱이 실행하려면 이 과정이 필요합니다." - 웹사이트 열기 - "MicroG GmsCore 앱 배터리 최적화를 비활성화(제한 없음)하여 앱 문제를 방지할 수 있습니다. + 웹사이트 열기 + 취소하기 + "MicroG GmsCore 앱 배터리 최적화를 비활성화(제한 없음)하여 앱 문제를 방지할 수 있습니다. -MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배터리 사용량에 부정적인 영향을 미치지 않습니다. +MicroG GmsCore 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배터리 사용량에 부정적인 영향을 미치지 않습니다. 앱 배터리 최적화를 비활성화(제한 없음)하려면 '계속하기' 버튼을 탭하세요." - 계속하기 - - - 동영상 스트림 속이기 - 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 - 동영상 스트림 속이기 - 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 - 동영상 스트림 속이기 - "동영상 스트림이 속여집니다 + 계속하기 + + + 동영상 스트림 속이기 + 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 + 동영상 스트림 속이기 + 클라이언트 동영상 스트림을 속여서 재생 문제를 방지할 수 있습니다 + 동영상 스트림 속이기 + "동영상 스트림이 속여집니다 YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니다" - "동영상 스트림이 속여지지 않습니다 + "동영상 스트림이 속여지지 않습니다 재생 문제가 발생할 수 있습니다" - 이 설정을 비활성화하면 재생 문제가 발생할 수 있습니다. - 기본 클라이언트 - - - 원본 오디오 언어 강제로 활성화하기 - 원본 오디오 언어를 사용 중입니다 - 기본 오디오 언어를 사용 중입니다 - - 이 기능을 사용하려면, \'동영상 스트림 속이기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 - - - 디버그 - 디버그 옵션을 활성화하거나 비활성화할 수 있습니다 - 디버그 로그 - 디버그 로그를 활성화합니다 - 디버그 로그를 비활성화합니다 - 로그 스택 트레이스 - 디버그 로그에 로그 스택 트레이스를 포함합니다 - 디버그 로그에 로그 스택 트레이스를 포함하지 않습니다 - ReVanced 오류 메시지 표시하기 - 오류가 발생하면 팝업 메시지를 표시합니다 - 오류가 발생하면 팝업 메시지를 표시하지 않습니다 - "오류 메시지를 비활성화하면 모든 ReVanced 오류 알림이 숨겨집니다. + 이 설정을 비활성화하면 재생 문제가 발생할 수 있습니다. + 기본 클라이언트 + + + 원본 오디오 언어 강제로 활성화하기 + 원본 오디오 언어를 활성화합니다 + 기본 오디오 언어를 활성화합니다 + + 이 기능을 사용하려면, \'동영상 스트림 속이기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 + + + 디버그 + 디버그 옵션을 활성화하거나 비활성화할 수 있습니다 + 디버그 로그 + 디버그 로그를 활성화합니다 + 디버그 로그를 비활성화합니다 + 로그 스택 트레이스 + 디버그 로그에 로그 스택 트레이스를 포함합니다 + 디버그 로그에 로그 스택 트레이스를 포함하지 않습니다 + ReVanced 오류 메시지 표시하기 + 오류가 발생하면 팝업 메시지를 표시합니다 + 오류가 발생하면 팝업 메시지를 표시하지 않습니다 + "오류 메시지를 비활성화하면 모든 ReVanced 오류 알림이 숨겨집니다. 예상되지 않은 이벤트에 대한 알림을 받지 못할 수 있습니다." - 디버그 로그 내보내기 - ReVanced 디버그 로그를 클립보드에 복사할 수 있습니다 - 디버그 로그가 비활성화되어 있습니다 - 디버그 로그를 찾을 수 없습니다 - 디버그 로그를 복사하였습니다 - 디버그 로그를 내보낼 수 없습니다: %s - 디버그 로그 지우기 - 저장된 모든 ReVanced 디버그 로그를 지울 수 있습니다 - 디버그 로그가 지워졌습니다 - 기능 플래그 관리자 - 부울 기능 플래그를 관리할 수 있습니다 - 허용된 플래그 (%d) - 차단된 플래그 (%d) - 플래그 검색... - 플래그를 저장하였습니다 - 플래그를 초기화하였습니다 - 플래그를 클립보드에 복사하였습니다 - 로그 프로토콜 버퍼 - 디버그 로그에 프로토콜 버퍼를 포함합니다 - 디버그 로그에 프로토콜 버퍼를 포함하지 않습니다 - "이 설정을 활성화하면 일부 UI 구성 요소에 대한 화면 텍스트를 포함한 추가 레이아웃 데이터가 기록됩니다. + 디버그 로그 내보내기 + ReVanced 디버그 로그를 클립보드에 복사할 수 있습니다 + 디버그 로그가 비활성화되어 있습니다 + 디버그 로그를 찾을 수 없습니다 + 디버그 로그를 복사하였습니다 + 디버그 로그를 내보낼 수 없습니다: %s + 디버그 로그 지우기 + 저장된 모든 ReVanced 디버그 로그를 지울 수 있습니다 + 디버그 로그가 지워졌습니다 + 기능 플래그 관리자 + 부울 기능 플래그를 관리할 수 있습니다 + 허용된 플래그 (%d) + 차단된 플래그 (%d) + 플래그 검색... + 플래그를 저장하였습니다 + 플래그를 초기화하였습니다 + 플래그를 클립보드에 복사하였습니다 + 이 기능을 사용하려면 앱을 다시 시작하세요 + 로그 프로토콜 버퍼 + 디버그 로그에 프로토콜 버퍼를 포함합니다 + 디버그 로그에 프로토콜 버퍼를 포함하지 않습니다 + "이 설정을 활성화하면 일부 UI 구성 요소에 대한 화면 텍스트를 포함한 추가 레이아웃 데이터가 기록됩니다. 이 설정은 사용자 정의 필터를 만들 경우에 구성 요소를 식별하는 데 도움이 될 수 있습니다. 그러나 이 설정을 활성화하면 IP 주소와 같은 일부 사용자 데이터도 기록됩니다." - - - 추적 쿼리를 제거한 링크 공유하기 - 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거합니다 - 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거하지 않습니다 - 공유 링크를 \'youtube.com\'으로 변경하기 - 공유 링크를 \'youtube.com\'으로 사용합니다 - 공유 링크를 \'music.youtube.com\'으로 사용합니다 - - - 사용자 정의 필터 - 사용자 정의 필터를 사용하여 구성요소를 숨길 수 있습니다 - 사용자 정의 필터 활성화하기 - 사용자 정의 필터를 활성화합니다 - 사용자 정의 필터를 비활성화합니다 - 사용자 정의 필터 - - 필터링할 컴포넌트 패스 빌더 문자열을 줄바꿈으로 구분하여 설정합니다 - 잘못된 사용자 정의 필터 값입니다: %s - - - - - 정보 - 광고 - 대체 썸네일 - 피드 - 일반 - 플레이어 - Shorts - 재생바 - 스와이프 제스처 - Return YouTube Dislike - 기타 - 동영상 - 이전 설정 메뉴 복원하기 - 이전 설정 메뉴를 표시합니다 - 이전 설정 메뉴를 표시하지 않습니다 - - - Shorts 백그라운드 재생 비활성화하기 - Shorts 백그라운드 재생을 비활성화합니다 - Shorts 백그라운드 재생을 활성화합니다\n\n알림: Shorts 백그라운드 재생은 PIP 모드를 통해서만 사용할 수 있습니다 - - - 음악 앨범 카드 숨기기 - 검색 결과에서 음악 앨범 카드가 숨겨집니다 - 검색 결과에서 음악 앨범 카드가 표시됩니다 - 아티스트 카드 숨기기 - 아티스트 카드가 숨겨집니다 - 아티스트 카드가 표시됩니다 - \'다른 주제 더 살펴보기\' 선반 숨기기 - \'다른 주제 더 살펴보기\' 선반이 숨겨집니다 - \'다른 주제 더 살펴보기\' 선반이 표시됩니다 - 커뮤니티 게시물 숨기기 - 커뮤니티 게시물이 숨겨집니다 - 커뮤니티 게시물이 표시됩니다 - 소형 배너 숨기기 - 소형 배너가 숨겨집니다 - 소형 배너가 표시됩니다 - 펼쳐볼 수 있는 정보 숨기기 - 썸네일 하단에서 다음 정보들이 숨겨집니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. - 썸네일 하단에서 다음 정보들이 표시됩니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. - 플로팅 마이크 버튼 숨기기 - 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 숨겨집니다 - 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 표시됩니다 - 좌우 슬라이드형 선반 숨기기 - "다음 선반이 숨겨집니다: + + + 추적 쿼리를 제거한 링크 공유하기 + 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거합니다 + 링크를 공유할 경우에 URL에서 추적 쿼리 매개변수를 제거하지 않습니다 + 공유 링크를 \'youtube.com\'으로 변경하기 + 공유 링크를 \'youtube.com\'으로 사용합니다 + 공유 링크를 \'music.youtube.com\'으로 사용합니다 + + + 사용자 정의 필터 + 사용자 정의 필터를 사용하여 구성요소를 숨길 수 있습니다 + 사용자 정의 필터 활성화하기 + 사용자 정의 필터를 활성화합니다 + 사용자 정의 필터를 비활성화합니다 + 사용자 정의 필터 + + 필터링할 컴포넌트 패스 빌더 문자열을 줄바꿈으로 구분하여 설정합니다 + 잘못된 사용자 정의 필터 값입니다: %s + + + + + 정보 + 광고 + 대체 썸네일 + 피드 + 일반 + 플레이어 + Shorts + 재생바 + 스와이프 제스처 + Return YouTube Dislike + 기타 + 동영상 + 이전 설정 메뉴 복원하기 + 이전 설정 메뉴를 표시합니다 + 이전 설정 메뉴를 표시하지 않습니다 + + + Shorts 백그라운드 재생 비활성화하기 + Shorts 백그라운드 재생을 비활성화합니다 + Shorts 백그라운드 재생을 활성화합니다\n\n알림: Shorts 백그라운드 재생은 PIP 모드를 통해서만 사용할 수 있습니다 + + + 판매자 스토어 선반 숨기기 + 판매자(크리에이터) 스토어 선반이 숨겨집니다 + 판매자(크리에이터) 스토어 선반이 표시됩니다 + 음악 앨범 카드 숨기기 + 검색 결과에서 음악 앨범 카드가 숨겨집니다 + 검색 결과에서 음악 앨범 카드가 표시됩니다 + 아티스트 카드 숨기기 + 아티스트 카드가 숨겨집니다 + 아티스트 카드가 표시됩니다 + \'다른 주제 더 살펴보기\' 선반 숨기기 + \'다른 주제 더 살펴보기\' 선반이 숨겨집니다 + \'다른 주제 더 살펴보기\' 선반이 표시됩니다 + 홈 피드에서 댓글 섹션 숨기기 + 홈 피드에서 동영상 하단에 있는 댓글 섹션이 숨겨집니다 + 홈 피드에서 동영상 하단에 있는 댓글 섹션이 표시됩니다 + 커뮤니티 게시물 숨기기 + 커뮤니티 게시물이 숨겨집니다 + 커뮤니티 게시물이 표시됩니다 + 소형 배너 숨기기 + 소형 배너가 숨겨집니다 + 소형 배너가 표시됩니다 + 펼쳐볼 수 있는 정보 숨기기 + 썸네일 하단에서 다음 정보들이 숨겨집니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. + 썸네일 하단에서 다음 정보들이 표시됩니다:\n동영상 설명, 챕터, 주요 순간, 스크립트,\n재생목록의 동영상, 이 동영상에 나온 제품, etc. + 플로팅 마이크 버튼 숨기기 + 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 숨겨집니다 + 검색 시 오른쪽 하단에서 플로팅 마이크 버튼이 표시됩니다 + 좌우 슬라이드형 선반 숨기기 + "다음 선반이 숨겨집니다: • 다시 듣기, 다시 시청하기 • 이어서 시청하기 • 채널 더보기 @@ -258,1029 +276,1096 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 • 라이브 쇼핑 • 보건 정보 출처 • 관련성, etc." - 다음 선반이 표시됩니다:\n• 다시 듣기, 다시 시청하기\n• 이어서 시청하기\n• 채널 더보기\n• 이 게임 더보기\n• 주요 뉴스, 뉴스 속보\n• 맞춤 실시간 스트림\n• 라이브 쇼핑\n• 보건 정보 출처\n• 관련성, etc. - 이미지 선반 숨기기 - 검색 결과에서 이미지 선반이 숨겨집니다 - 검색 결과에서 이미지 선반이 표시됩니다 - 최신 게시물 숨기기 - 최신 게시물이 숨겨집니다 - 최신 게시물이 표시됩니다 - 믹스 재생목록 숨기기 - 믹스 재생목록이 숨겨집니다 - 믹스 재생목록이 표시됩니다 - 영화 선반 숨기기 - 영화 선반이 숨겨집니다 - 영화 선반이 표시됩니다 - - \'알림 받기\' 버튼 숨기기 - 예정 동영상 하단에서 \'알림 받기\' 버튼이 숨겨집니다 - 예정 동영상 하단에서 \'알림 받기\' 버튼이 표시됩니다 - 게임 룸 숨기기 - 게임 룸이 숨겨집니다 - 게임 룸이 표시됩니다 - + 최신 동영상 버튼 숨기기 + 피드 상단에서 최신 동영상 버튼이 숨겨집니다 + 피드 상단에서 최신 동영상 버튼이 표시됩니다 + 믹스 재생목록 숨기기 + 믹스 재생목록이 숨겨집니다 + 믹스 재생목록이 표시됩니다 + 영화 선반 숨기기 + 영화 선반이 숨겨집니다 + 영화 선반이 표시됩니다 + + \'알림 받기\' 버튼 숨기기 + 예정 동영상 하단에서 \'알림 받기\' 버튼이 숨겨집니다 + 예정 동영상 하단에서 \'알림 받기\' 버튼이 표시됩니다 + 게임 룸 숨기기 + 게임 룸이 숨겨집니다 + 게임 룸이 표시됩니다 + - \'자세히 보기\' 버튼 숨기기 - 검색 결과에서 \'자세히 보기\' 버튼이 숨겨집니다 - 검색 결과에서 \'자세히 보기\' 버튼이 표시됩니다 - 설문 조사 숨기기 - 설문 조사가 숨겨집니다 - 설문 조사가 표시됩니다 - 콘서트 티켓 선반 숨기기 - 콘서트 티켓 선반이 숨겨집니다 - 콘서트 티켓 선반이 표시됩니다 - - 동영상 추천 라벨 숨기기 - 검색 결과에서 다음 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 - 검색 결과에서 다음 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 - 시각적 공백 숨기기 - 시각적 공백이 숨겨집니다 - 시각적 공백이 표시됩니다 - - YouTube Doodles 숨기기 - 해더 로고에서 YouTube Doodles 애니메이션이 숨겨집니다 - 헤더 로고에서 YouTube Doodles 애니메이션이 표시됩니다 - "YouTube Doodles는 공휴일이나 기념일 등, 그날에 맞춘 디자인으로 변경되는 왼쪽 상단의 YouTube 헤더를 말합니다. - -현재 거주하는 지역에서 YouTube Doodles가 표시되어 있는데 이 설정이 활성화되어 있는 경우에는 검색창 아래에 표시되는 카테고리 바도 숨겨집니다." - 채널바 숨기기 - 채널바가 숨겨집니다 - 채널바가 표시됩니다 - 채널 워터마크 숨기기 - 플레이어 하단에서 채널 워터마크가 숨겨집니다 - 플레이어 하단에서 채널 워터마크가 표시됩니다 - 모금 행사 패널 숨기기 - 모금 행사 패널이 숨겨집니다 - 모금 행사 패널이 표시됩니다 - 긴급 정보 패널 숨기기 - 긴급 정보 패널이 숨겨집니다 - 긴급 정보 패널이 표시됩니다 - 정보 패널 숨기기 - 정보 패널이 숨겨집니다 - 정보 패널이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 보건 정보 패널 숨기기 - 보건 정보 패널이 숨겨집니다 - 보건 정보 패널이 표시됩니다 - 빠른 동작 컨테이너 숨기기 - 전체 화면에서 빠른 동작 컨테이너가 숨겨집니다 - 전체 화면에서 빠른 동작 컨테이너가 표시됩니다 - 관련 동영상 숨기기 - 빠른 동작 컨테이너에서 관련 동영상이 숨겨집니다 - 빠른 동작 컨테이너에서 관련 동영상이 표시됩니다 - 구독자를 위한 커뮤니티 가이드라인 숨기기 - 구독자를 위한 커뮤니티 가이드라인이 숨겨집니다 - 구독자를 위한 커뮤니티 가이드라인이 표시됩니다 - 실시간 이모티콘 리액션 숨기기 - 실시간 이모티콘 리액션이 숨겨집니다 - 실시간 이모티콘 리액션이 표시됩니다 - AI 생성 동영상 요약 숨기기 - AI 생성 동영상 요약 섹션이 숨겨집니다 - AI 생성 동영상 요약 섹션이 표시됩니다 - \'질문하기\' 숨기기 - \'질문하기\' 섹션이 숨겨집니다 - \'질문하기\' 섹션이 표시됩니다 - 속성 숨기기 - 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 숨겨집니다 - 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 표시됩니다 - 챕터 숨기기 - 챕터 섹션이 숨겨집니다 - 챕터 섹션이 표시됩니다 - 이 콘텐츠가 제작된 방식 숨기기 - 이 콘텐츠가 제작된 방식 섹션이 숨겨집니다 - 이 콘텐츠가 제작된 방식 섹션이 표시됩니다 - Hype 점수 숨기기 - Hype 점수가 숨겨집니다 - Hype 점수가 표시됩니다 - \'팟캐스트 살펴보기\' 숨기기 - 팟캐스트 살펴보기 섹션이 숨겨집니다 - 팟캐스트 살펴보기 섹션이 표시됩니다 - 추천 링크 숨기기 - 추천 링크 섹션이 숨겨집니다 - 추천 링크 섹션이 표시됩니다 - 추천 동영상 숨기기 - 추천 동영상 섹션이 숨겨집니다 - 추천 동영상 섹션이 표시됩니다 - 크리에이터 정보 카드 숨기기 - 크리에이터 정보 카드 섹션이 숨겨집니다 - 크리에이터 정보 카드 섹션이 표시됩니다 - 주요 개념 숨기기 - 주요 개념 섹션이 숨겨집니다 - 주요 개념 섹션이 표시됩니다 - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 스크립트 숨기기 - 스크립트 섹션이 숨겨집니다 - 스크립트 섹션이 표시됩니다 - 동영상 설명 - 동영상 설명에서 구성요소를 숨기거나 표시할 수 있습니다 - 카테고리 바 - 피드, 관련 동영상, 검색 결과 그리고 시청 기록에서 카테고리 바를 숨기거나 표시할 수 있습니다 - 피드에서 숨기기 - 피드에서 숨겨집니다 - 피드에서 표시됩니다 - 관련 동영상에서 숨기기 - 관련 동영상에서 숨겨집니다 - 관련 동영상에서 표시됩니다 - 검색 결과에서 숨기기 - 검색 결과에서 숨겨집니다 - 검색 결과에서 표시됩니다 - 시청 기록에서 숨기기 - 시청 기록에서 숨겨집니다 - 시청 기록에서 표시됩니다 - 채널 페이지 - 채널 페이지에서 구성요소를 숨기거나 표시할 수 있습니다 - - 커뮤니티 버튼 숨기기 - 커뮤니티 버튼이 숨겨집니다 - 커뮤니티 버튼이 표시됩니다 - - 추천 선반 숨기기 - 추천 선반이 숨겨집니다 - 추천 선반이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 링크 미리보기 숨기기 - 링크 미리보기가 숨겨집니다 - 링크 미리보기가 표시됩니다 - 멤버십 선반 숨기기 - 멤버십 선반이 숨겨집니다 - 멤버십 선반이 표시됩니다 - - 스토어 버튼 숨기기 - 스토어 버튼이 숨겨집니다 - 스토어 버튼이 표시됩니다 - - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 댓글 - 댓글 섹션에서 구성요소가 숨기거나 표시할 수 있습니다 - AI 채팅 요약 숨기기 - AI 채팅 요약이 숨겨집니다 - AI 채팅 요약이 표시됩니다 - AI 댓글 요약 숨기기 - AI 댓글 요약이 숨겨집니다 - AI 댓글 요약이 표시됩니다 - 채널 가이드라인 숨기기 - 채널 가이드라인이 숨겨집니다 - 채널 가이드라인이 표시됩니다 - 회원별 댓글 헤더 숨기기 - 회원별 댓글 헤더가 숨겨집니다 - 회원별 댓글 헤더가 표시됩니다 - 댓글 섹션 숨기기 - 댓글 섹션이 숨겨집니다 - 댓글 섹션이 표시됩니다 - 커뮤니티 가이드라인 숨기기 - 커뮤니티 가이드라인이 숨겨집니다 - 커뮤니티 가이드라인이 표시됩니다 - Shorts 만들기 버튼 숨기기 - Shorts 만들기 버튼이 숨겨집니다 - Shorts 만들기 버튼이 표시됩니다 - 이모지 & 타임스탬프 버튼 숨기기 - 이모지 & 타임스탬프 버튼이 숨겨집니다 - 이모지 & 타임스탬프 버튼이 표시됩니다 - 댓글 미리보기 숨기기 - 댓글 미리보기가 숨겨집니다 - 댓글 미리보기가 표시됩니다 - Thanks 버튼 숨기기 - Thanks 버튼이 숨겨집니다 - Thanks 버튼이 표시됩니다 - 조회수 숨기기 - 피드 및 검색 결과에서 조회수가 숨겨집니다 - 피드 및 검색 결과에서 조회수가 표시됩니다 - - "제한 사항: -• Shorts 선반, 채널 페이지 그리고 검색 결과에서는 조회수가 여전히 표시될 수 있습니다 -• 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다" - 업로드 시간 숨기기 - 피드 및 검색 결과에서 업로드 시간이 숨겨집니다 - 피드 및 검색 결과에서 업로드 시간이 표시됩니다 - - "제한 사항: -• Shorts 선반, 채널 페이지 그리고 검색 결과에서는 업로드 시간이 여전히 표시될 수 있습니다 -• 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다" - 키워드 필터링 - 키워드 필터를 사용하여 검색 결과 및 피드에서 동영상을 숨길 수 있습니다 - 홈 탭에서 키워드 필터 활성화하기 - 홈 탭에서 키워드 필터를 활성화합니다 - 홈 탭에서 키워드 필터를 비활성화합니다 - 검색 결과에서 키워드 필터 활성화하기 - 검색 결과에서 키워드 필터를 활성화합니다 - 검색 결과에서 키워드 필터를 비활성화합니다 - 구독 탭에서 키워드 필터 활성화하기 - 구독 탭에서 키워드 필터를 활성화합니다 - 구독 탭에서 키워드 필터를 비활성화합니다 - 키워드 필터 - + 동영상 추천 라벨 숨기기 + 검색 결과에서 다음 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 + 검색 결과에서 다음 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상 + 시각적 공백 숨기기 + 시각적 공백이 숨겨집니다 + 시각적 공백이 표시됩니다 + 웹 검색 결과 숨기기 + 웹 검색 결과가 숨겨집니다 + 웹 검색 결과가 표시됩니다 + 추천 콘텐츠 섹션 숨기기 + 추천 콘텐츠 섹션이 숨겨집니다 + 추천 콘텐츠 섹션이 표시됩니다 + + YouTube Doodles 숨기기 + 해더 로고에서 YouTube Doodles 애니메이션이 숨겨집니다 + 헤더 로고에서 YouTube Doodles 애니메이션이 표시됩니다 + 채널바 숨기기 + 채널바가 숨겨집니다 + 채널바가 표시됩니다 + 채널 워터마크 숨기기 + 플레이어 하단에서 채널 워터마크가 숨겨집니다 + 플레이어 하단에서 채널 워터마크가 표시됩니다 + 모금 행사 패널 숨기기 + 모금 행사 패널이 숨겨집니다 + 모금 행사 패널이 표시됩니다 + 긴급 정보 패널 숨기기 + 긴급 정보 패널이 숨겨집니다 + 긴급 정보 패널이 표시됩니다 + 정보 패널 숨기기 + 정보 패널이 숨겨집니다 + 정보 패널이 표시됩니다 + + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + + \'실시간 채팅 다시보기\' 버튼 숨기기 + 전체 화면에서 \'실시간 채팅 다시보기\' 버튼이 숨겨집니다 + 전체 화면에서 \'실시간 채팅 다시보기\' 버튼이 표시됩니다 + 보건 정보 패널 숨기기 + 보건 정보 패널이 숨겨집니다 + 보건 정보 패널이 표시됩니다 + 빠른 동작 컨테이너 숨기기 + 전체 화면에서 빠른 동작 컨테이너가 숨겨집니다 + 전체 화면에서 빠른 동작 컨테이너가 표시됩니다 + 관련 동영상 숨기기 + 빠른 동작 컨테이너에서 관련 동영상이 숨겨집니다 + 빠른 동작 컨테이너에서 관련 동영상이 표시됩니다 + 구독자를 위한 커뮤니티 가이드라인 숨기기 + 구독자를 위한 커뮤니티 가이드라인이 숨겨집니다 + 구독자를 위한 커뮤니티 가이드라인이 표시됩니다 + 실시간 이모티콘 리액션 숨기기 + 실시간 이모티콘 리액션이 숨겨집니다 + 실시간 이모티콘 리액션이 표시됩니다 + 동영상 제목 숨기기 + 전체 화면에서 동영상 제목이 숨겨집니다 + 전체 화면에서 동영상 제목이 표시됩니다 + AI 생성 동영상 요약 숨기기 + AI 생성 동영상 요약 섹션이 숨겨집니다 + AI 생성 동영상 요약 섹션이 표시됩니다 + \'질문하기\' 숨기기 + \'질문하기\' 섹션이 숨겨집니다 + \'질문하기\' 섹션이 표시됩니다 + 속성 숨기기 + 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 숨겨집니다 + 게임, 음악, 동영상 속 장소 그리고 언급된 인물 섹션이 표시됩니다 + 챕터 숨기기 + 챕터 섹션이 숨겨집니다 + 챕터 섹션이 표시됩니다 + 과정 진행 상황 숨기기 + 과정 진행 상황 섹션이 숨겨집니다 + 과정 진행 상황 섹션이 표시됩니다 + \'살펴보기\' 숨기기 + \'이 학습 프로그램 살펴보기\' 및 \'팟캐스트 살펴보기\' 섹션이 숨겨집니다 + \'이 학습 프로그램 살펴보기\' 및 \'팟캐스트 살펴보기\' 섹션이 표시됩니다 + \'이 학습 프로그램 살펴보기\' 숨기기 + \'이 학습 프로그램 살펴보기\' 섹션이 숨겨집니다 + \'이 학습 프로그램 살펴보기\' 섹션이 표시됩니다 + \'팟캐스트 살펴보기\' 숨기기 + \'팟캐스트 살펴보기\' 섹션이 숨겨집니다 + \'팟캐스트 살펴보기\' 섹션이 표시됩니다 + \'팟캐스트 살펴보기\' 숨기기 + \'팟캐스트 살펴보기\' 섹션이 숨겨집니다 + \'팟캐스트 살펴보기\' 섹션이 표시됩니다 + 추천 링크 숨기기 + 추천 링크 섹션이 숨겨집니다 + 추천 링크 섹션이 표시됩니다 + 동영상 속 장소 숨기기 + 동영상 속 장소 섹션이 숨겨집니다 + 동영상 속 장소 섹션이 표시됩니다 + 추천 동영상 숨기기 + 추천 동영상 섹션이 숨겨집니다 + 추천 동영상 섹션이 표시됩니다 + 피드 메뉴 구성요소 필터 활성화하기 + 피드 메뉴 구성요소 필터를 활성화합니다 + 피드 메뉴 구성요소 필터를 비활성화합니다 + 피드 메뉴 구성요소 필터 활성화하기 + 필터링할 메뉴 구성요소 이름을 줄바꿈으로 구분하여 설정하세요 + 게임 숨기기 + 게임 섹션이 숨겨집니다 + 게임 섹션이 표시됩니다 + 이 콘텐츠가 제작된 방식 숨기기 + 이 콘텐츠가 제작된 방식 섹션이 숨겨집니다 + 이 콘텐츠가 제작된 방식 섹션이 표시됩니다 + Hype 점수 숨기기 + Hype 점수가 숨겨집니다 + Hype 점수가 표시됩니다 + 크리에이터 정보 카드 숨기기 + 크리에이터 정보 카드 섹션이 숨겨집니다 + 크리에이터 정보 카드 섹션이 표시됩니다 + 주요 개념 숨기기 + 주요 개념 섹션이 숨겨집니다 + 주요 개념 섹션이 표시됩니다 + 음악 숨기기 + 음악 섹션이 숨겨집니다 + 음악 섹션이 표시됩니다 + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 스크립트 숨기기 + 스크립트 섹션이 숨겨집니다 + 스크립트 섹션이 표시됩니다 + 퀴즈 숨기기 + 퀴즈 섹션이 숨겨집니다 + 퀴즈 섹션이 표시됩니다 + 동영상 설명 + 동영상 설명에서 구성요소를 숨기거나 표시할 수 있습니다 + 카테고리 바 + 피드, 관련 동영상, 검색 결과 그리고 시청 기록에서 카테고리 바를 숨기거나 표시할 수 있습니다 + 피드에서 숨기기 + 피드에서 숨겨집니다 + 피드에서 표시됩니다 + 관련 동영상에서 숨기기 + 관련 동영상에서 숨겨집니다 + 관련 동영상에서 표시됩니다 + 검색 결과에서 숨기기 + 검색 결과에서 숨겨집니다 + 검색 결과에서 표시됩니다 + 시청 기록에서 숨기기 + 시청 기록에서 숨겨집니다 + 시청 기록에서 표시됩니다 + 채널 페이지 + 채널 페이지에서 구성요소를 숨기거나 표시할 수 있습니다 + 채널 탭 필터 활성화하기 + 채널 탭 필터를 활성화합니다 + 채널 탭 필터를 비활성화합니다 + 채널 탭 필터 + 필터링할 채널 탭 이름을 줄바꿈으로 구분하여 설정하세요 + + 커뮤니티 버튼 숨기기 + 커뮤니티 버튼이 숨겨집니다 + 커뮤니티 버튼이 표시됩니다 + + 추천 선반 숨기기 + 추천 선반이 숨겨집니다 + 추천 선반이 표시됩니다 + + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + 링크 미리보기 숨기기 + 링크 미리보기가 숨겨집니다 + 링크 미리보기가 표시됩니다 + 멤버십 선반 숨기기 + 멤버십 선반이 숨겨집니다 + 멤버십 선반이 표시됩니다 + + 스토어 버튼 숨기기 + 스토어 버튼이 숨겨집니다 + 스토어 버튼이 표시됩니다 + + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 댓글 + 댓글 섹션에서 구성요소가 숨기거나 표시할 수 있습니다 + AI 채팅 요약 숨기기 + AI 채팅 요약이 숨겨집니다 + AI 채팅 요약이 표시됩니다 + AI 댓글 요약 숨기기 + AI 댓글 요약이 숨겨집니다 + AI 댓글 요약이 표시됩니다 + 채널 가이드라인 숨기기 + 채널 가이드라인이 숨겨집니다 + 채널 가이드라인이 표시됩니다 + 회원별 댓글 헤더 숨기기 + 회원별 댓글 헤더가 숨겨집니다 + 회원별 댓글 헤더가 표시됩니다 + 댓글 섹션 숨기기 + 댓글 섹션이 숨겨집니다 + 댓글 섹션이 표시됩니다 + 커뮤니티 가이드라인 숨기기 + 커뮤니티 가이드라인이 숨겨집니다 + 커뮤니티 가이드라인이 표시됩니다 + Shorts 만들기 버튼 숨기기 + Shorts 만들기 버튼이 숨겨집니다 + Shorts 만들기 버튼이 표시됩니다 + 이모지 & 타임스탬프 버튼 숨기기 + 이모지 & 타임스탬프 버튼이 숨겨집니다 + 이모지 & 타임스탬프 버튼이 표시됩니다 + 댓글 미리보기 숨기기 + 댓글 미리보기가 숨겨집니다 + 댓글 미리보기가 표시됩니다 + Thanks 버튼 숨기기 + Thanks 버튼이 숨겨집니다 + Thanks 버튼이 표시됩니다 + 조회수 숨기기 + 피드 및 검색 결과에서 조회수가 숨겨집니다 + 피드 및 검색 결과에서 조회수가 표시됩니다 + + "제한 사항: +• Shorts 선반, 채널 페이지 그리고 검색 결과에서는 조회수가 여전히 표시될 수 있습니다. +• 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다." + 업로드 시간 숨기기 + 피드 및 검색 결과에서 업로드 시간이 숨겨집니다 + 피드 및 검색 결과에서 업로드 시간이 표시됩니다 + + "제한 사항: +• Shorts 선반, 채널 페이지 그리고 검색 결과에서는 업로드 시간이 여전히 표시될 수 있습니다. +• 이 기능은 오토모티브 폼 팩터에서는 작동하지 않습니다." + 키워드 필터링 + 키워드 필터를 사용하여 검색 결과 및 피드에서 동영상을 숨길 수 있습니다 + 홈 탭에서 키워드 필터 활성화하기 + 홈 탭에서 키워드 필터를 활성화합니다 + 홈 탭에서 키워드 필터를 비활성화합니다 + 검색 결과에서 키워드 필터 활성화하기 + 검색 결과에서 키워드 필터를 활성화합니다 + 검색 결과에서 키워드 필터를 비활성화합니다 + 구독 탭에서 키워드 필터 활성화하기 + 구독 탭에서 키워드 필터를 활성화합니다 + 구독 탭에서 키워드 필터를 비활성화합니다 + 키워드 필터 + - "필터링할 키워드 및 구문을 줄바꿈으로 구분하여 설정합니다 + "필터링할 키워드 및 구문을 줄바꿈으로 구분하여 설정합니다 • 필터링 키워드는 채널 이름 또는 동영상 제목에 표시되는 모든 텍스트가 될 수 있습니다 • 대문자가 있는 단어는 대소문자를 함께 입력해야 합니다 (예: iPhone, TikTok, LeBlanc)" - 키워드 필터링 정보 - "홈 / 구독 / 검색 결과가 필터링되어 키워드 구문과 일치하는 콘텐츠가 숨겨집니다 + 키워드 필터링 정보 + "홈 / 구독 / 검색 결과가 필터링되어 키워드 구문과 일치하는 콘텐츠가 숨겨집니다 제한 사항: • 채널 이름으로 Shorts는 숨길 수 없습니다 • 일부 UI 구성요소는 숨겨지지 않을 수 있습니다 • 필터링 키워드를 검색하면 검색 결과가 표시되지 않을 수 있습니다" - 전체 단어 일치시키기 - - 필터링할 키워드 및 구문을 큰따옴표로 묶으면 동영상 제목과 채널 이름이 부분적으로 일치하지 않도록 방지할 수 있습니다<br><br>예를 들어<br><b>\"ai\"</b>는 다음 동영상을 숨김: <b>AI 커리어 완벽 가이드</b><br>하지만 다음 동영상을 숨기지 못함: <b>생성형AI가 바꿔놓은 세계</b> - - 키워드를 사용할 수 없습니다: %s - 키워드를 사용하려면 따옴표를 추가하세요: %s - 키워드에 충돌하는 선언이 있습니다: %s - 키워드가 너무 짧아서 따옴표가 필요합니다: %s - 키워드가 모든 동영상을 숨길 것입니다: %s - - - 판매자 스토어 선반 숨기기 - 판매자(크리에이터명) 스토어 선반이 숨겨집니다 - 판매자(크리에이터명) 스토어 선반이 표시됩니다 - 최종 화면 스토어 배너 숨기기 - 최종 화면에서 스토어 배너가 숨겨집니다 - 최종 화면에서 스토어 배너가 표시됩니다 - 전체 화면 광고 숨기기 - "전체 화면 광고가 숨겨집니다 - -이 기능은 구형 기기에서만 사용할 수 있습니다" - 전체 화면 광고가 표시됩니다 - - \'전체 화면 광고 숨기기\'는 구형 기기에서만 사용할 수 있습니다 - 일반 레이아웃 광고 숨기기 - 일반 레이아웃 광고가 숨겨집니다 - 일반 레이아웃 광고가 표시됩니다 - 매장 쇼핑 배너 숨기기 - 매장 쇼핑 배너가 숨겨집니다 - 매장 쇼핑 배너가 표시됩니다 - 유료 광고 포함 라벨 숨기기 - 유료 광고 포함 라벨이 숨겨집니다 - 유료 광고 포함 라벨이 표시됩니다 - 셀프 스폰서 카드 숨기기 - 셀프 스폰서 카드가 숨겨집니다 - 셀프 스폰서 카드가 표시됩니다 - 쇼핑 링크 숨기기 - 동영상 설명에서 쇼핑 링크가 숨겨집니다 - 동영상 설명에서 쇼핑 링크가 표시됩니다 - \'제품 보기\' 배너 숨기기 - 플레이어에서 제품 보기 배너가 숨겨집니다 - 플레이어에서 제품 보기 배너가 표시됩니다 - 웹 검색 결과 숨기기 - 웹 검색 결과가 숨겨집니다 - 웹 검색 결과가 표시됩니다 - - - YouTube Premium 프로모션 숨기기 - YouTube Premium 프로모션이 숨겨집니다 - YouTube Premium 프로모션이 표시됩니다 - - - 동영상 광고 숨기기 - 동영상 광고가 숨겨집니다 - 동영상 광고가 표시됩니다 - - - URL을 클립보드에 복사하였습니다 - 타임스탬프가 표기된 URL을 클립보드에 복사하였습니다 - 동영상 URL 복사 버튼 표시하기 - 동영상 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기된 동영상 URL이 복사됩니다 - 동영상 URL 복사 버튼이 표시되지 않습니다 - 타임스탬프 URL 복사 버튼 표시하기 - 타임스탬프가 표기된 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 타임스탬프가 표기된 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기되지 않은 동영상 URL이 복사됩니다 - 타임스탬프가 표기된 URL 복사 버튼이 표시되지 않습니다 - - - 시청 경고 다이얼로그 제거하기 - 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다 - 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다 - 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다. - - - \'TV에 로그인\' 팝업 비활성화하기 - \'TV에 로그인\' 팝업을 비활성화합니다 - \'TV에 로그인\' 팝업을 활성화합니다 - - - 두 번 탭하여 챕터 건너뛰기 비활성화하기 - 두 번 탭하여 다음/이전 챕터로 건너뛰기가 절대 트리거될 수 없습니다 - 두 번 탭하여 다음/이전 챕터로 건너뛰기가 가끔 트리거될 수 있습니다 - - - 외부 다운로드 - 외부 다운로더를 설정할 수 있습니다 - 외부 다운로드 버튼 표시하기 - 플레이어에서 외부 다운로드 버튼을 표시합니다 - 플레이어에서 외부 다운로드 버튼을 표시하지 않습니다 - - 오프라인 저장 버튼 재정의하기 - 오프라인 저장 버튼으로 외부 다운로더를 실행할 수 있습니다 - 오프라인 저장 버튼으로 기본 다운로더를 실행할 수 있습니다 - 외부 다운로더 앱 패키지명 - 설치된 외부 다운로더 앱 패키지명을 설정하세요 - 앱 패키지명을 입력하세요 - 기타 - 앱이 설치되지 않습니다 - %s 는 설치되어 있지 않습니다. 설치하세요 - "패키지 이름이 '%s'인 설치된 앱을 찾을 수 없습니다 + 전체 단어 일치시키기 + + 필터링할 키워드 및 구문을 큰따옴표로 묶으면 동영상 제목과 채널 이름이 부분적으로 일치하지 않도록 방지할 수 있습니다<br><br>예를 들어<br><b>\"ai\"</b>는 다음 동영상을 숨김: <b>AI 커리어 완벽 가이드</b><br>하지만 다음 동영상을 숨기지 못함: <b>생성형AI가 바꿔놓은 세계</b> + + 키워드를 사용할 수 없습니다: %s + 키워드를 사용하려면 따옴표를 추가하세요: %s + 키워드에 충돌하는 선언이 있습니다: %s + 키워드가 너무 짧아서 따옴표가 필요합니다: %s + 키워드가 모든 동영상을 숨길 것입니다: %s + + + 최종 화면 스토어 배너 숨기기 + 최종 화면에서 스토어 배너가 숨겨집니다 + 최종 화면에서 스토어 배너가 표시됩니다 + 전체 화면 광고 숨기기 + 전체 화면 광고가 숨겨집니다 + 전체 화면 광고가 표시됩니다 + 일반 레이아웃 광고 숨기기 + 일반 레이아웃 광고가 숨겨집니다 + 일반 레이아웃 광고가 표시됩니다 + 매장 쇼핑 배너 숨기기 + 매장 쇼핑 배너가 숨겨집니다 + 매장 쇼핑 배너가 표시됩니다 + 유료 광고 포함 라벨 숨기기 + 유료 광고 포함 라벨이 숨겨집니다 + 유료 광고 포함 라벨이 표시됩니다 + 플레이어 팝업 광고 숨기기 + 플레이어 팝업 광고가 숨겨집니다 + 플레이어 팝업 광고가 표시됩니다 + 셀프 스폰서 카드 숨기기 + 셀프 스폰서 카드가 숨겨집니다 + 셀프 스폰서 카드가 표시됩니다 + 쇼핑 링크 숨기기 + 동영상 설명에서 쇼핑 링크가 숨겨집니다 + 동영상 설명에서 쇼핑 링크가 표시됩니다 + \'제품 보기\' 배너 숨기기 + 플레이어 오버레이에서 제품 보기 배너가 숨겨집니다 + 플레이어 오버레이에서 제품 보기 배너가 표시됩니다 + YouTube Premium 프로모션 숨기기 + YouTube Premium 프로모션이 숨겨집니다 + YouTube Premium 프로모션이 표시됩니다 + + + 동영상 광고 숨기기 + 동영상 광고가 숨겨집니다 + 동영상 광고가 표시됩니다 + + + URL을 클립보드에 복사하였습니다 + 타임스탬프가 표기된 URL을 클립보드에 복사하였습니다 + 동영상 URL 복사 버튼 표시하기 + 동영상 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기된 동영상 URL이 복사됩니다 + 동영상 URL 복사 버튼이 표시되지 않습니다 + 타임스탬프 URL 복사 버튼 표시하기 + 타임스탬프가 표기된 URL 복사 버튼이 표시됩니다\n\n• 버튼을 탭하여 타임스탬프가 표기된 동영상 URL을 복사할 수 있습니다\n• 길게 탭하면 타임스탬프가 표기되지 않은 동영상 URL이 복사됩니다 + 타임스탬프가 표기된 URL 복사 버튼이 표시되지 않습니다 + + + 시청 경고 다이얼로그 제거하기 + 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거합니다 + 일부 동영상을 시청하기 전에 표시되는 시청 경고 다이얼로그를 제거하지 않습니다 + 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다. + + + \'TV에 로그인\' 팝업 비활성화하기 + \'TV에 로그인\' 팝업을 비활성화합니다 + \'TV에 로그인\' 팝업을 활성화합니다 + + + 두 번 탭하여 챕터 건너뛰기 비활성화하기 + 두 번 탭하여 다음/이전 챕터로 건너뛰기가 절대 트리거될 수 없습니다 + 두 번 탭하여 다음/이전 챕터로 건너뛰기가 가끔 트리거될 수 있습니다 + + + 외부 다운로드 + 외부 다운로더를 설정할 수 있습니다 + 외부 다운로드 버튼 표시하기 + 플레이어에서 외부 다운로드 버튼을 표시합니다 + 플레이어에서 외부 다운로드 버튼을 표시하지 않습니다 + + 오프라인 저장 버튼 재정의하기 + 오프라인 저장 버튼으로 외부 다운로더를 실행할 수 있습니다 + 오프라인 저장 버튼으로 기본 다운로더를 실행할 수 있습니다 + 외부 다운로더 앱 패키지명 + 설치된 외부 다운로더 앱 패키지명을 설정하세요 + 앱 패키지명을 입력하세요 + 기타 + 앱이 설치되지 않습니다 + %s 는 설치되어 있지 않습니다. 설치하세요 + "패키지 이름이 '%s'인 설치된 앱을 찾을 수 없습니다 패키지 이름이 올바르고 앱이 설치되어 있는지 확인하세요" - 패키지명은 비워둘 수 없습니다 - - - 세밀한 탐색 제스처 비활성화하기 - 세밀한 탐색 제스처를 비활성화합니다 - 세밀한 탐색 제스처를 활성화합니다 - - - 재생바 터치 조작 활성화하기 - 재생바 터치 조작을 활성화합니다 - 재생바 터치 조작을 비활성화합니다 - - - 스와이프 제스처로 밝기 조절 활성화하기 - "전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절합니다" - 전체 화면 왼쪽에서 위로/아래로 스와이프하여 밝기 조절하지 않습니다 - 스와이프 제스처로 볼륨 조절 활성화하기 - "전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절합니다" - 전체 화면 오른쪽에서 위로/아래로 스와이프하여 볼륨 조절하지 않습니다 - 길게 탭하여 스와이프 제스처 사용하기 - 화면을 길게 탭하여 스와이프 제스처를 사용합니다 - 화면을 짧게 탭하여 스와이프 제스처를 사용합니다 - 진동 피드백 활성화하기 - 진동 피드백을 활성화합니다 - 진동 피드백을 비활성화합니다 - 화면 밝기 저장 및 복원 활성화하기 - 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원합니다 - 전체 화면에서 나가거나 들어갈 때마다 화면 밝기 값을 저장 및 복원하지 않습니다 - 스와이프 제스처로 자동 밝기 활성화하기 - 전체 화면에서 스와이프하여 밝기가 0이 되면 자동 밝기를 활성화합니다 - 전체 화면에서 스와이프하여 밝기가 0이 되더라도 자동 밝기를 활성화하지 않습니다 - 자동 - 스와이프 오버레이 타임아웃 - 오버레이가 표시되는 시간을 지정할 수 있습니다 (밀리초) - 스와이프 오버레이 배경 불투명도 - 배경 불투명도 값을 0-100 사이에서 지정할 수 있습니다 - 스와이프 배경 불투명도 값은 0-100 사이여야 합니다 - 스와이프 오버레이 밝기 조절바 색상 - 밝기 조절 진행률 색상을 지정할 수 있습니다 - 스와이프 오버레이 볼륨 조절바 색상 - 볼륨 조절 진행률 색상을 지정할 수 있습니다 - 스와이프 오버레이 텍스트 크기 - 텍스트 크기를 1-30 사이에서 지정할 수 있습니다 - 텍스트 크기는 1-30 사이여야 합니다 - 스와이프 한계치 - 제스처 인식을 위해 얼마나 스와이프를 해야 할지를 지정할 수 있으며, 원하지 않은 제스처 인식을 방지할 수 있습니다 - 볼륨 스와이프 민감도 - 스와이프할 때마다 볼륨이 얼마나 변경되는지를 지정할 수 있습니다 - 스와이프 오버레이 스타일 - 가로 - 가로 (최소화 - 상단) - 가로 (최소화 - 중앙) - 원형 - 원형 (최소화) - 세로 - 세로 (최소화) - 스와이프 제스처로 동영상 전환 비활성화하기 - 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환합니다 - 전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환하지 않습니다 - - - 자동 자막 비활성화하기 - 자동 자막을 비활성화합니다 - 자동 자막을 활성화합니다 - - - 동작 버튼 - 플레이어 하단에서 동작 버튼을 숨기거나 표시할 수 있습니다 - 빛나는 \'좋아요\' / \'구독\' 비활성화하기 - 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용하지 않습니다 - 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용합니다 - 좋아요 & 싫어요 숨기기 - 좋아요 & 싫어요 버튼이 숨겨집니다 - 좋아요 & 싫어요 버튼이 표시됩니다 - - 공유 숨기기 - 공유 버튼이 숨겨집니다 - 공유 버튼이 표시됩니다 - - 광고 중지 숨기기 - 광고 중지 버튼이 숨겨집니다 - 광고 중지 버튼이 표시됩니다 - - 댓글 숨기기 - 댓글 버튼이 숨겨집니다 - 댓글 버튼이 표시됩니다 - - 신고 숨기기 - 신고 버튼이 숨겨집니다 - 신고 버튼이 표시됩니다 - - 리믹스 숨기기 - 리믹스 버튼이 숨겨집니다 - 리믹스 버튼이 표시됩니다 - - 오프라인 저장 숨기기 - 오프라인 저장 버튼이 숨겨집니다 - 오프라인 저장 버튼이 표시됩니다 - - Hype 숨기기 - Hype 버튼이 숨겨집니다 - Hype 버튼이 표시됩니다 - - 프로모션 숨기기 - 프로모션 버튼이 숨겨집니다 - 프로모션 버튼이 표시됩니다 - - Thanks 숨기기 - Thanks 버튼이 숨겨집니다 - Thanks 버튼이 표시됩니다 - - \'질문하기\' 숨기기 - \'질문하기\' 버튼이 숨겨집니다 - \'질문하기\' 버튼이 표시됩니다 - - 클립 숨기기 - 클립 버튼이 숨겨집니다 - 클립 버튼이 표시됩니다 - - 쇼핑 숨기기 - 쇼핑 버튼이 숨겨집니다 - 쇼핑 버튼이 표시됩니다 - - 저장 숨기기 - 저장 버튼이 숨겨집니다 - 저장 버튼이 표시됩니다 - - - 하단바 버튼 - 하단바에서 버튼을 숨기거나 변경할 수 있습니다 - - 홈 숨기기 - 홈 버튼이 숨겨집니다 - 홈 버튼이 표시됩니다 - - Shorts 숨기기 - Shorts 버튼이 숨겨집니다 - Shorts 버튼이 표시됩니다 - - 만들기 숨기기 - 만들기 버튼이 숨겨집니다 - 만들기 버튼이 표시됩니다 - - 구독 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 알림 숨기기 - 알림 버튼이 숨겨집니다 - 알림 버튼이 표시됩니다 - - 만들기와 알림 위치 교환하기 - "만들기 버튼과 알림 버튼의 위치를 교환합니다 - -알림: 이 설정을 활성화하면 동영상 광고가 강제로 숨겨집니다" - 만들기 버튼과 알림 버튼의 위치를 교환하지 않습니다 - "이 설정을 비활성화하면 Shorts 광고가 차단되지 않습니다. - -이 설정을 변경해도 적용되지 않는다면 시크릿 모드로 전환해 보세요." - 하단바 버튼 라벨 숨기기 - 하단바 버튼 라벨이 숨겨집니다 - 하단바 버튼 라벨이 표시됩니다 - 반투명 상태바 비활성화하기 - 상태바가 불투명합니다 - 상태바가 불투명하거나 반투명합니다 - 일부 기기에서는 이 기능을 활성화하면 시스템 네비게이션 바가 투명하게 변경될 수 있습니다. - 밝은 반투명 하단바 비활성화하기 - 밝은 테마에서 하단바가 불투명합니다 - 밝은 테마에서 하단바가 불투명하거나 반투명합니다 - 어두운 반투명 하단바 비활성화하기 - 어두운 테마에서 하단바가 불투명합니다 - 어두운 테마에서 하단바가 불투명하거나 반투명합니다 - - - 메뉴 구성요소 - 플레이어에서 메뉴 구성요소를 숨기거나 표시할 수 있습니다 - - 자막 숨기기 - 자막 메뉴가 숨겨집니다 - 자막 메뉴가 표시됩니다 - - 추가 설정 숨기기 - 추가 설정 메뉴가 숨겨집니다 - 추가 설정 메뉴가 표시됩니다 - - 취침 타이머 숨기기 - 취침 타이머 메뉴가 숨겨집니다 - 취침 타이머 메뉴가 표시됩니다 - - 동영상 연속 재생 숨기기 - 동영상 연속 재생 메뉴가 숨겨집니다 - 동영상 연속 재생 메뉴가 표시됩니다 - - 앰비언트 모드 숨기기 - 앰비언트 모드 메뉴가 숨겨집니다 - 앰비언트 모드 메뉴가 표시됩니다 - 안정적인 볼륨 숨기기 - 안정적인 볼륨 메뉴가 표시됩니다 - 안정적인 볼륨 메뉴가 숨겨집니다 - - 고객센터 숨기기 - 고객센터 메뉴가 숨겨집니다 - 고객센터 메뉴가 표시됩니다 - - 재생 속도 숨기기 - 재생 속도 메뉴가 숨겨집니다 - 재생 속도 메뉴가 표시됩니다 - - 잠금 화면 숨기기 - 잠금 화면 메뉴가 숨겨집니다 - 잠금 화면 메뉴가 표시됩니다 - - YouTube Music으로 음악 감상 숨기기 - YouTube Music으로 음악 감상 메뉴가 숨겨집니다 - YouTube Music으로 음악 감상 메뉴가 표시됩니다 - - 오디오 트랙 숨기기 - 오디오 트랙 메뉴가 숨겨집니다 - 오디오 트랙 메뉴가 표시됩니다 - + 공유 숨기기 + 공유 버튼이 숨겨집니다 + 공유 버튼이 표시됩니다 + + 광고 중지 숨기기 + 광고 중지 버튼이 숨겨집니다 + 광고 중지 버튼이 표시됩니다 + + 댓글 숨기기 + 댓글 버튼이 숨겨집니다 + 댓글 버튼이 표시됩니다 + + 신고 숨기기 + 신고 버튼이 숨겨집니다 + 신고 버튼이 표시됩니다 + + 리믹스 숨기기 + 리믹스 버튼이 숨겨집니다 + 리믹스 버튼이 표시됩니다 + + 오프라인 저장 숨기기 + 오프라인 저장 버튼이 숨겨집니다 + 오프라인 저장 버튼이 표시됩니다 + + Hype 숨기기 + Hype 버튼이 숨겨집니다 + Hype 버튼이 표시됩니다 + + 프로모션 숨기기 + 프로모션 버튼이 숨겨집니다 + 프로모션 버튼이 표시됩니다 + + Thanks 숨기기 + Thanks 버튼이 숨겨집니다 + Thanks 버튼이 표시됩니다 + + \'질문하기\' 숨기기 + \'질문하기\' 버튼이 숨겨집니다 + \'질문하기\' 버튼이 표시됩니다 + + 클립 숨기기 + 클립 버튼이 숨겨집니다 + 클립 버튼이 표시됩니다 + 숨기기 기능은 일부 사용자 계정에서 작동하지 않을 수 있습니다. + + 쇼핑 숨기기 + 쇼핑 버튼이 숨겨집니다 + 쇼핑 버튼이 표시됩니다 + + 저장 숨기기 + 저장 버튼이 숨겨집니다 + 저장 버튼이 표시됩니다 + + + 하단바 버튼 + 하단바에서 버튼을 숨기거나 변경할 수 있습니다 + + 홈 숨기기 + 홈 버튼이 숨겨집니다 + 홈 버튼이 표시됩니다 + + Shorts 숨기기 + Shorts 버튼이 숨겨집니다 + Shorts 버튼이 표시됩니다 + + 만들기 숨기기 + 만들기 버튼이 숨겨집니다 + 만들기 버튼이 표시됩니다 + + 구독 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 알림 숨기기 + 알림 버튼이 숨겨집니다 + 알림 버튼이 표시됩니다 + + 만들기와 알림 위치 교환하기 + 만들기 버튼과 알림 버튼의 위치가 교환됩니다 + 만들기 버튼과 알림 버튼의 위치를 교환하지 않습니다 + 이 설정을 변경해도 적용되지 않는 경우에는 시크릿 모드로 전환해 보세요. + 하단바 버튼 라벨 숨기기 + 하단바 버튼 라벨이 숨겨집니다 + 하단바 버튼 라벨이 표시됩니다 + 좁은 하단바 버튼 활성화하기 + 하단바 버튼 사이의 간격이 좁아집니다 + 하단바 버튼 사이의 간격이 좁아지지 않습니다 + 하단바 애니메이션 활성화하기 + 하단바 전환 애니메이션을 활성화합니다 + 하단바 전환 애니메이션을 비활성화합니다 + 반투명 상태바 비활성화하기 + 상태바가 불투명합니다 + 상태바가 불투명하거나 반투명합니다 + "제한 사항: +• 동영상 플레이어 상단에서 검은색 막대가 표시될 수 있습니다. +• 일부 기기에서 이 기능을 활성화하면 시스템 네비게이션 바가 투명해질 수 있습니다." + 밝은 반투명 하단바 비활성화하기 + 밝은 테마에서 하단바가 불투명합니다 + 밝은 테마에서 하단바가 불투명하거나 반투명합니다 + 어두운 반투명 하단바 비활성화하기 + 어두운 테마에서 하단바가 불투명합니다 + 어두운 테마에서 하단바가 불투명하거나 반투명합니다 + 툴바 + 툴바 구성요소를 숨기거나 변경할 수 있습니다 + 만들기 버튼 숨기기 + 만들기 버튼이 숨겨집니다 + 만들기 버튼이 표시됩니다 + 알림 버튼 숨기기 + 알림 버튼이 숨겨집니다 + 알림 버튼이 표시됩니다 + 검색 버튼 숨기기 + 검색 버튼이 숨겨집니다 + 검색 버튼이 표시됩니다. + 넓은 검색창 활성화하기 + 넓은 검색창을 활성화합니다 + 넓은 검색창을 비활성화합니다 + + + 메뉴 구성요소 + 플레이어에서 메뉴 구성요소를 숨기거나 표시할 수 있습니다 + + 자막 숨기기 + 자막 메뉴가 숨겨집니다 + 자막 메뉴가 표시됩니다 + + 추가 설정 숨기기 + 추가 설정 메뉴가 숨겨집니다 + 추가 설정 메뉴가 표시됩니다 + + 취침 타이머 숨기기 + 취침 타이머 메뉴가 숨겨집니다 + 취침 타이머 메뉴가 표시됩니다 + + 동영상 연속 재생 숨기기 + 동영상 연속 재생 메뉴가 숨겨집니다 + 동영상 연속 재생 메뉴가 표시됩니다 + + 앰비언트 모드 숨기기 + 앰비언트 모드 메뉴가 숨겨집니다 + 앰비언트 모드 메뉴가 표시됩니다 + 안정적인 볼륨 숨기기 + 안정적인 볼륨 메뉴가 표시됩니다 + 안정적인 볼륨 메뉴가 숨겨집니다 + + 고객센터 숨기기 + 고객센터 메뉴가 숨겨집니다 + 고객센터 메뉴가 표시됩니다 + + 재생 속도 숨기기 + 재생 속도 메뉴가 숨겨집니다 + 재생 속도 메뉴가 표시됩니다 + + 잠금 화면 숨기기 + 잠금 화면 메뉴가 숨겨집니다 + 잠금 화면 메뉴가 표시됩니다 + + YouTube Music으로 음악 감상 숨기기 + YouTube Music으로 음악 감상 메뉴가 숨겨집니다 + YouTube Music으로 음악 감상 메뉴가 표시됩니다 + + 오디오 트랙 숨기기 + 오디오 트랙 메뉴가 숨겨집니다 + 오디오 트랙 메뉴가 표시됩니다 + - "오디오 트랙 메뉴가 숨겨집니다 + "오디오 트랙 메뉴가 숨겨집니다 오디오 트랙 메뉴를 표시하려면, '동영상 스트림 속이기'에서 기본 클라이언트를 'Android No SDK'로 변경하세요" - - VR로 보기 숨기기 - VR로 보기 메뉴가 숨겨집니다 - VR로 보기 메뉴가 표시됩니다 - 동영상 화질 메뉴 숨기기 - 동영상 화질 메뉴가 숨겨집니다 - 동영상 화질 메뉴가 표시됩니다 - 동영상 화질 메뉴에서 하단 설명 숨기기 - 화질 설정 메뉴에서 하단 설명이 숨겨집니다 - 화질 설정 메뉴에서 하단 설명이 표시됩니다 - - - 자동재생 버튼 숨기기 - 자동재생 버튼이 숨겨집니다 - 자동재생 버튼이 표시됩니다 - - 자막 버튼 숨기기 - 자막 버튼이 숨겨집니다 - 자막 버튼이 표시됩니다 - 크롬캐스트 버튼 숨기기 - 크롬캐스트 버튼이 숨겨집니다 - 크롬캐스트 버튼이 표시됩니다 - 플레이어 컨트롤 버튼 배경 숨기기 - 플레이어 컨트롤 버튼 배경이 숨겨집니다 - 플레이어 컨트롤 버튼 배경이 표시됩니다 - 이전 & 다음 버튼 숨기기 - 이전 & 다음 동영상 버튼이 숨겨집니다 - 이전 & 다음 동영상 버튼이 표시됩니다 - - - 최종 화면 카드 숨기기 - 최종 화면 카드가 숨겨집니다 - 최종 화면 카드가 표시됩니다 - - - 전체 화면 앰비언트 모드 비활성화하기 - 앰비언트 모드를 비활성화합니다 - 앰비언트 모드를 활성화합니다 - - - 정보 카드 숨기기 - 정보 카드가 숨겨집니다 - 정보 카드가 표시됩니다 - - - 롤링 넘버 애니메이션 비활성화하기 - 롤링 넘버 애니메이션을 비활성화합니다 - 롤링 넘버 애니메이션을 활성화합니다 - - - 동영상 플레이어 재생바 숨기기 - 동영상 플레이어 재생바가 숨겨집니다 - 동영상 플레이어 재생바가 표시됩니다 - - 동영상 썸네일 재생바 숨기기 - 동영상 썸네일 재생바가 숨겨집니다 - 동영상 썸네일 재생바가 표시됩니다 - - - Shorts 플레이어 - Shorts 플레이어에서 구성요소를 숨기거나 표시할 수 있습니다 - - 홈 피드에서 Shorts 숨기기 - 홈 피드 및 관련 동영상에서 숨겨집니다 - 홈 피드 및 관련 동영상에서 표시됩니다 - 검색 결과에서 Shorts 숨기기 - 검색 결과에서 숨겨집니다 - 검색 결과에서 표시됩니다 - - 구독 피드에서 Shorts 숨기기 - 구독 피드에서 숨겨집니다 - 구독 피드에서 표시됩니다 - 시청 기록에서 Shorts 숨기기 - 시청 기록에서 숨겨집니다 - 시청 기록에서 표시됩니다 - 자동 더빙 라벨 숨기기 - 자동 더빙 라벨이 숨겨집니다 - 자동 더빙 라벨이 표시됩니다 - Super Thanks 구매 버튼 숨기기 - Super Thanks 구매 버튼이 숨겨집니다 - Super Thanks 구매 버튼이 표시됩니다 - 효과 버튼 숨기기 - 효과 버튼이 숨겨집니다 - 효과 버튼이 표시됩니다 - 그린 스크린 버튼 숨기기 - 그린 스크린 버튼이 숨겨집니다 - 그린 스크린 버튼이 표시됩니다 - 해시태그 버튼 숨기기 - 해시태그 버튼이 숨겨집니다 - 해시태그 버튼이 표시됩니다 - - 가입 버튼 숨기기 - 가입 버튼이 숨겨집니다 - 가입 버튼이 표시됩니다 - 라이브 미리보기 숨기기 - 라이브 미리보기가 숨겨집니다 - 라이브 미리보기가 표시됩니다 - 위치 라벨 숨기기 - 위치 라벨이 숨겨집니다 - 위치 라벨이 표시됩니다 - 새로운 게시물 버튼 숨기기 - 새로운 게시물 버튼이 숨겨집니다 - 새로운 게시물 버튼이 표시됩니다 - 일시 정지 오버레이 버튼 숨기기 - 플레이어 왼쪽 상단에서 다음 버튼들이 숨겨집니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 - 플레이어 왼쪽 상단에서 다음 버튼들이 표시됩니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 - 댓글 미리보기 숨기기 - 댓글 미리보기가 숨겨집니다 - 댓글 미리보기가 표시됩니다 - 음악 저장 버튼 숨기기 - 음악 저장 버튼이 숨겨집니다 - 음악 저장 버튼이 표시됩니다 - 검색 추천 숨기기 - 검색 추천이 숨겨집니다 - 검색 추천이 표시됩니다 - 쇼핑 버튼 숨기기 - 쇼핑 버튼이 숨겨집니다 - 쇼핑 버튼이 표시됩니다 - 스티커 숨기기 - 스티커가 숨겨집니다 - 스티커가 표시됩니다 - 구독 버튼 숨기기 - 구독 버튼이 숨겨집니다 - 구독 버튼이 표시됩니다 - 태그된 제품 숨기기 - 태그된 제품이 숨겨집니다 - 태그된 제품이 표시됩니다 - 예정된 라이브 버튼 숨기기 - 예정된 라이브 버튼이 숨겨집니다 - 예정된 라이브 버튼이 표시됩니다 - 이 사운드 사용 버튼 숨기기 - 이 사운드 사용 버튼이 숨겨집니다 - 이 사운드 사용 버튼이 표시됩니다 - 템플릿 사용 버튼 숨기기 - 템플릿 사용 버튼이 숨겨집니다 - 템플릿 사용 버튼이 표시됩니다 - 좋아요 버튼 애니메이션을 비활성화하기 - 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다 - 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다 - 좋아요 버튼 숨기기 - 좋아요 버튼이 숨겨집니다 - 좋아요 버튼이 표시됩니다 - 싫어요 버튼 숨기기 - 싫어요 버튼이 숨겨집니다 - 싫어요 버튼이 표시됩니다 - 댓글 버튼 숨기기 - 댓글 버튼이 숨겨집니다 - 댓글 버튼이 표시됩니다 - - 공유 버튼 숨기기 - 공유 버튼이 숨겨집니다 - 공유 버튼이 표시됩니다 - - 리믹스 버튼 숨기기 - 리믹스 버튼이 숨겨집니다 - 리믹스 버튼이 표시됩니다 - 사운드 버튼 숨기기 - 사운드 버튼이 숨겨집니다 - 사운드 버튼이 표시됩니다 - 정보 패널 숨기기 - 정보 패널이 숨겨집니다 - 정보 패널이 표시됩니다 - 채널바 숨기기 - 채널바가 숨겨집니다 - 채널바가 표시됩니다 - 동영상 제목 숨기기 - 동영상 제목이 숨겨집니다 - 동영상 제목이 표시됩니다 - 사운드 메타데이터 라벨 숨기기 - 사운드 메타데이터 라벨이 숨겨집니다 - 사운드 메타데이터 라벨이 표시됩니다 - 동영상 링크 라벨 숨기기 - 동영상 링크 라벨이 숨겨집니다 - 동영상 링크 라벨이 표시됩니다 - 하단바 숨기기 - 하단바가 숨겨집니다 - 하단바가 표시됩니다 - - - 최종 화면 추천 동영상 숨기기 - "자동재생이 꺼져 있을 경우에 최종 화면에서 추천 동영상이 숨겨집니다 + + VR로 보기 숨기기 + VR로 보기 메뉴가 숨겨집니다 + VR로 보기 메뉴가 표시됩니다 + 동영상 화질 메뉴 숨기기 + 동영상 화질 메뉴가 숨겨집니다 + 동영상 화질 메뉴가 표시됩니다 + 동영상 화질 메뉴에서 하단 설명 숨기기 + 화질 설정 메뉴에서 하단 설명이 숨겨집니다 + 화질 설정 메뉴에서 하단 설명이 표시됩니다 + + + 자동재생 버튼 숨기기 + 자동재생 버튼이 숨겨집니다 + 자동재생 버튼이 표시됩니다 + + 자막 버튼 숨기기 + 자막 버튼이 숨겨집니다 + 자막 버튼이 표시됩니다 + 크롬캐스트 버튼 숨기기 + 크롬캐스트 버튼이 숨겨집니다 + 크롬캐스트 버튼이 표시됩니다 + 접기 버튼 숨기기 + 접기 버튼이 숨겨집니다 + 접기 버튼이 표시됩니다 + 전체 화면 버튼 숨기기 + 전체 화면 버튼이 숨겨집니다 + 전체 화면 버튼이 표시됩니다 + 플레이어 컨트롤 버튼 배경 숨기기 + 플레이어 컨트롤 버튼 배경이 숨겨집니다 + 플레이어 컨트롤 버튼 배경이 표시됩니다 + 이전 & 다음 버튼 숨기기 + 이전 & 다음 동영상 버튼이 숨겨집니다 + 이전 & 다음 동영상 버튼이 표시됩니다 + + + 최종 화면 카드 숨기기 + 최종 화면 카드가 숨겨집니다 + 최종 화면 카드가 표시됩니다 + + + 전체 화면 앰비언트 모드 비활성화하기 + 앰비언트 모드를 비활성화합니다 + 앰비언트 모드를 활성화합니다 + + + 정보 카드 숨기기 + 정보 카드가 숨겨집니다 + 정보 카드가 표시됩니다 + + + 롤링 넘버 애니메이션 비활성화하기 + 롤링 넘버 애니메이션을 비활성화합니다 + 롤링 넘버 애니메이션을 활성화합니다 + + + 동영상 플레이어 재생바 숨기기 + 동영상 플레이어 재생바가 숨겨집니다 + 동영상 플레이어 재생바가 표시됩니다 + + 동영상 썸네일 재생바 숨기기 + 동영상 썸네일 재생바가 숨겨집니다 + 동영상 썸네일 재생바가 표시됩니다 + 전체 화면 두꺼운 재생바 활성하기 + 전체 화면에서 재생바가 두껍습니다 + 전체 화면에서 재생바가 두껍지 않습니다 + + + Shorts 플레이어 + Shorts 플레이어에서 구성요소를 숨기거나 표시할 수 있습니다 + 채널 페이지에서 Shorts 숨기기 + 채널 페이지에서 숨겨집니다 + 채널 페이지에서 표시됩니다 + + 홈 피드에서 Shorts 숨기기 + 홈 피드 및 관련 동영상에서 숨겨집니다 + 홈 피드 및 관련 동영상에서 표시됩니다 + 검색 결과에서 Shorts 숨기기 + 검색 결과에서 숨겨집니다 + 검색 결과에서 표시됩니다 + + 구독 피드에서 Shorts 숨기기 + 구독 피드에서 숨겨집니다 + 구독 피드에서 표시됩니다 + 동영상 설명에서 Shorts 숨기기 + 동영상 설명에서 숨겨집니다 + 동영상 설명에서 표시됩니다 + 시청 기록에서 Shorts 숨기기 + 시청 기록에서 숨겨집니다 + 시청 기록에서 표시됩니다 + AI 버튼 숨기기 + AI 버튼이 숨겨집니다 + AI 버튼이 표시됩니다 + 자동 더빙 라벨 숨기기 + 자동 더빙 라벨이 숨겨집니다 + 자동 더빙 라벨이 표시됩니다 + 자동 더빙 라벨 숨기기 + 자동 더빙 라벨이 숨겨집니다 + 자동 더빙 라벨이 표시됩니다 + Super Thanks 구매 버튼 숨기기 + Super Thanks 구매 버튼이 숨겨집니다 + Super Thanks 구매 버튼이 표시됩니다 + 효과 버튼 숨기기 + 효과 버튼이 숨겨집니다 + 효과 버튼이 표시됩니다 + 그린 스크린 버튼 숨기기 + 그린 스크린 버튼이 숨겨집니다 + 그린 스크린 버튼이 표시됩니다 + 해시태그 버튼 숨기기 + 해시태그 버튼이 숨겨집니다 + 해시태그 버튼이 표시됩니다 + + 가입 버튼 숨기기 + 가입 버튼이 숨겨집니다 + 가입 버튼이 표시됩니다 + 라이브 미리보기 숨기기 + 라이브 미리보기가 숨겨집니다 + 라이브 미리보기가 표시됩니다 + 위치 라벨 숨기기 + 위치 라벨이 숨겨집니다 + 위치 라벨이 표시됩니다 + 새로운 게시물 버튼 숨기기 + 새로운 게시물 버튼이 숨겨집니다 + 새로운 게시물 버튼이 표시됩니다 + 일시 정지 오버레이 버튼 숨기기 + 플레이어 왼쪽 상단에서 다음 버튼들이 숨겨집니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 + 플레이어 왼쪽 상단에서 다음 버튼들이 표시됩니다\n• 구독 & 라이브 & 렌즈 & 트렌드 & 쇼핑 + 댓글 미리보기 숨기기 + 댓글 미리보기가 숨겨집니다 + 댓글 미리보기가 표시됩니다 + 음악 저장 버튼 숨기기 + 음악 저장 버튼이 숨겨집니다 + 음악 저장 버튼이 표시됩니다 + 검색 추천 숨기기 + 검색 추천이 숨겨집니다 + 검색 추천이 표시됩니다 + 쇼핑 버튼 숨기기 + 쇼핑 버튼이 숨겨집니다 + 쇼핑 버튼이 표시됩니다 + 스티커 숨기기 + 스티커가 숨겨집니다 + 스티커가 표시됩니다 + 구독 버튼 숨기기 + 구독 버튼이 숨겨집니다 + 구독 버튼이 표시됩니다 + 태그된 제품 숨기기 + 태그된 제품이 숨겨집니다 + 태그된 제품이 표시됩니다 + 예정된 라이브 버튼 숨기기 + 예정된 라이브 버튼이 숨겨집니다 + 예정된 라이브 버튼이 표시됩니다 + 이 사운드 사용 버튼 숨기기 + 이 사운드 사용 버튼이 숨겨집니다 + 이 사운드 사용 버튼이 표시됩니다 + 템플릿 사용 버튼 숨기기 + 템플릿 사용 버튼이 숨겨집니다 + 템플릿 사용 버튼이 표시됩니다 + + 좋아요 버튼 애니메이션을 비활성화하기 + 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다 + 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다 + 좋아요 버튼 숨기기 + 좋아요 버튼이 숨겨집니다 + 좋아요 버튼이 표시됩니다 + 싫어요 버튼 숨기기 + 싫어요 버튼이 숨겨집니다 + 싫어요 버튼이 표시됩니다 + 댓글 버튼 숨기기 + 댓글 버튼이 숨겨집니다 + 댓글 버튼이 표시됩니다 + + 공유 버튼 숨기기 + 공유 버튼이 숨겨집니다 + 공유 버튼이 표시됩니다 + + 리믹스 버튼 숨기기 + 리믹스 버튼이 숨겨집니다 + 리믹스 버튼이 표시됩니다 + 사운드 버튼 숨기기 + 사운드 버튼이 숨겨집니다 + 사운드 버튼이 표시됩니다 + 정보 패널 숨기기 + 정보 패널이 숨겨집니다 + 정보 패널이 표시됩니다 + 채널바 숨기기 + 채널바가 숨겨집니다 + 채널바가 표시됩니다 + 동영상 제목 숨기기 + 동영상 제목이 숨겨집니다 + 동영상 제목이 표시됩니다 + 사운드 메타데이터 라벨 숨기기 + 사운드 메타데이터 라벨이 숨겨집니다 + 사운드 메타데이터 라벨이 표시됩니다 + 동영상 링크 라벨 숨기기 + 동영상 링크 라벨이 숨겨집니다 + 동영상 링크 라벨이 표시됩니다 + 하단바 숨기기 + 하단바가 숨겨집니다 + 하단바가 표시됩니다 + + + 자동 재생 미리보기 숨기기 + 자동 재생 미리보기가 숨겨집니다 + 자동 재생 미리보기가 표시됩니다 + + + 최종 화면 추천 동영상 숨기기 + "자동재생이 꺼져 있을 경우에 최종 화면에서 추천 동영상이 숨겨집니다 자동재생은 YouTube 설정에서 변경할 수 있습니다: 설정 → 재생 → 다음 동영상 자동재생" - 최종 화면에서 추천 동영상이 표시됩니다 - - - 관련 동영상 오버레이 숨기기 - 전체 화면에서 관련 동영상 오버레이가 숨겨집니다 - 전체 화면에서 관련 동영상 오버레이가 표시됩니다 - - - 동영상 타임스탬프 숨기기 - 타임스탬프가 숨겨집니다 - 타임스탬프가 표시됩니다 - - - 플레이어 팝업 패널 숨기기 - 다음 플레이어 팝업 패널이 숨겨집니다:\n실시간 채팅, 재생목록, etc. - 다음 플레이어 팝업 패널이 표시됩니다:\n실시간 채팅, 재생목록, etc. - - - 동영상 종료 시 전체 화면에서 나가기 - 사용 안함 - 세로 모드 - 가로 모드 - 세로 및 가로 모드 - - - 동영상을 전체 화면 세로 모드로 열기 - 동영상을 전체 화면으로 엽니다 - 동영상을 전체 화면으로 열지 않습니다 - - - 플레이어 오버레이 불투명도 - 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) - 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 - - - - 싫어요 수를 일시적으로 표시할 수 없습니다 (API 시간 초과) - 싫어요 수를 표시할 수 없습니다 (상태 코드: %d) - 싫어요 수를 표시할 수 없습니다 (클라이언트 API 제한 도달) - 싫어요 수를 표시할 수 없습니다 (%s) - - ReturnYouTubeDislike를 사용하여 투표하려면 동영상을 다시 불러오세요 - - 소유자에 의해 숨겨짐 - Return YouTube Dislike - 싫어요 수를 표시합니다 - 싫어요 수를 표시하지 않습니다 - Shorts에서 싫어요 수 표시하기 - "Shorts에서 싫어요 수를 표시합니다 + 최종 화면에서 추천 동영상이 표시됩니다 + + + 관련 동영상 오버레이 숨기기 + 전체 화면에서 관련 동영상 오버레이가 숨겨집니다 + 전체 화면에서 관련 동영상 오버레이가 표시됩니다 + + + 동영상 타임스탬프 숨기기 + 타임스탬프가 숨겨집니다 + 타임스탬프가 표시됩니다 + + + 플레이어 팝업 패널 숨기기 + 다음 플레이어 팝업 패널이 숨겨집니다:\n실시간 채팅, 재생목록, etc. + 다음 플레이어 팝업 패널이 표시됩니다:\n실시간 채팅, 재생목록, etc. + + + 동영상 종료 시 전체 화면에서 나가기 + 사용 안함 + 세로 모드 + 가로 모드 + 세로 및 가로 모드 + + + 동영상을 전체 화면 세로 모드로 열기 + 동영상을 전체 화면으로 엽니다 + 동영상을 전체 화면으로 열지 않습니다 + + + 플레이어 오버레이 불투명도 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) + 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 + + + + 싫어요 수를 일시적으로 표시할 수 없습니다 (API 시간 초과) + 싫어요 수를 표시할 수 없습니다 (상태 코드: %d) + 싫어요 수를 표시할 수 없습니다 (클라이언트 API 제한 도달) + 싫어요 수를 표시할 수 없습니다 (%s) + + ReturnYouTubeDislike를 사용하여 투표하려면 동영상을 다시 불러오세요 + + 소유자에 의해 숨겨짐 + Return YouTube Dislike + 싫어요 수를 표시합니다 + 싫어요 수를 표시하지 않습니다 + Shorts에서 싫어요 수 표시하기 + "Shorts에서 싫어요 수를 표시합니다 제한 사항: • 사용자가 로그인을 하지 않았거나 시크릿 모드에서는 싫어요 수가 표시되지 않을 수 있습니다" - Shorts에서 싫어요 수를 표시하지 않습니다 - 싫어요 수를 퍼센트로 표시하기 - 싫어요 수를 퍼센트로 표시합니다 - 싫어요 수를 숫자로 표시합니다 - - 좋아요 버튼에서 구분선 숨기기 - 좋아요 버튼에서 구분선을 표시하지 않습니다 - 좋아요 버튼에서 구분선을 표시합니다 - 추정되는 좋아요 수 표시하기 - 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시합니다 - 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시하지 않습니다 - API 사용 불가 메시지 표시하기 - ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - ReturnYouTubeDislike.com - 싫어요 수의 데이터는 Return YouTube Dislike API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 - - 이 기기의 ReturnYouTubeDislike API 사용 통계 - 평균 API 응답 시간 - 최소 API 응답 시간 - 최대 API 응답 시간 - 최근 동영상 API 응답 시간 - 싫어요 수를 일시적으로 표시할 수 없습니다 - 클라이언트 API 속도 제한이 적용됨 - API 투표 가져오기, 호출 횟수 - 네트워크 호출한 적이 없습니다 - %d 건의 네트워크 호출이 이루어졌습니다 - API 투표 가져오기, 시간 초과 횟수 - 네트워크 호출이 시간 초과한 적이 없습니다 - %d 건의 네트워크 호출이 시간 초과하였습니다 - API 클라이언트 비율 제한 - 클라이언트 비율을 제한한 적이 없습니다 - %d 건의 클라이언트 비율 제한이 발생하였습니다 - %d 밀리초 - - - 넓은 검색창 활성화하기 - 넓은 검색창을 활성화합니다 - 넓은 검색창을 비활성화합니다 - - - 고화질 재생바 썸네일 활성화하기 - 고화질 재생바 썸네일을 활성화합니다 - 일반 화질 재생바 썸네일을 활성화합니다 - 전체 화면 고화질 재생바 썸네일을 활성화합니다 - 전체 화면 일반 화질 재생바 썸네일을 활성화합니다 - "이 기능을 활성화하면 재생바 썸네일이 없는 실시간 스트림의 썸네일도 복원됩니다. - -재생바 썸네일에는 현재 동영상과 동일한 화질 값이 사용됩니다. - -이 기능은 동영상 화질 값이 720p 이하이고 인터넷 연결 상태가 매우 빠를 때 가장 잘 작동합니다." - 이전 재생바 썸네일 복원하기 - 재생바 상단에서 최소화된 썸네일을 표시합니다 - 플레이어에서 전체 화면으로 된 썸네일을 표시합니다 - - - SponsorBlock - SponsorBlock 활성화하기 - SponsorBlock은 YouTube 동영상의 성가신 부분을 건너뛰기 위한 크라우드소싱 시스템입니다 - 레이아웃 - 구간 투표 버튼 표시하기 - 플레이어에서 구간 투표 버튼을 표시합니다 - 플레이어에서 구간 투표 버튼을 표시하지 않습니다 - 각진 레이아웃 사용하기 - 버튼과 컨트롤을 각지게 활성화합니다 - 버튼과 컨트롤을 둥글게 활성화합니다 - - 최소화된 건너뛰기 버튼 표시하기 - 최소화된 건너뛰기 버튼을 표시합니다 - 일반적인 건너뛰기 버튼을 표시합니다 - 자동으로 건너뛰기 버튼 숨기기 - 건너뛰기 버튼이 몇 초 후에 숨겨집니다 - 건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다 - 건너뛰기 버튼 표시 시간 - 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다 - 건너뛰기 취소 메시지 표시하기 - 구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다 - 팝업 메시지를 표시하지 않습니다 - 건너뛰기 취소 메시지 표시 시간 - 건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다 - 1 초 - 2 초 - 3 초 - 4 초 - 5 초 - 6 초 - 7 초 - 8 초 - 9 초 - 10 초 - 건너뛸 구간이 제외된 시간 표시하기 - 건너뛸 구간이 제외된 동영상 길이를 재생바에 표시합니다 - 건너뛸 구간이 포함된 동영상 길이를 재생바에 표시합니다 - 새 구간 추가하기 - 구간 추가 버튼 표시하기 - 플레이어에서 구간 추가 버튼을 표시합니다 - 플레이어에서 구간 추가 버튼을 표시하지 않습니다 - 구간 추가 시 최소 슬라이더 단위 설정 - 새 구간 추가 시에 시간 앞으로 버튼 또는 뒤로 버튼을 탭하였을 때 이동하는 최소 시간으로, 단위는 밀리초입니다 - 값은 양수여야 합니다 - 가이드라인 보기 - 구간 제출 시의 주의사항에 대한 내용을 포함하고 있습니다 - 가이드라인 읽어보기 - 광고 구간을 제출하기 전에 SponsorBlock 가이드라인을 읽어보시는 것을 추천합니다 - 이미 읽음 - 보기 - 일반 - API 사용 불가 메시지 표시하기 - SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - 건너뛴 횟수 기록 활성화하기 - 구간 건너뛰기를 통해 절약한 시간을 SponsorBlock의 리더보드 시스템에 알려줍니다. 건너뛴 구간에 대한 정보가 서버에 전송됩니다 - 건너뛴 횟수 기록을 비활성화합니다 - 건너뛸 최소 구간 길이 - 설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다 - 잘못된 표시 시간입니다 - 비공개 사용자 아이디 - 비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요 - 비공개 사용자 아이디는 30자 이상이어야 합니다 - API URL 변경하기 - SponsorBlock이 요청을 보낼 서버 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 - API URL 초기화하기 - 잘못된 주소입니다 - API URL을 변경하였습니다 - 설정 가져오기 / 내보내기 - 복사하기 - ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponsorBlock JSON 구성입니다 - ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponserBlock JSON의 전체 구성 파일입니다. 비공개 사용자 아이디를 포함하고 있으므로 주의하세요 - 설정을 성공적으로 가져왔습니다 - 설정을 가져올 수 없습니다: %s - 설정을 내보낼 수 없습니다: %s - "설정에는 비공개 SponsorBlock 사용자 아이디가 포함되어 있습니다 + Shorts에서 싫어요 수를 표시하지 않습니다 + 싫어요 수를 퍼센트로 표시하기 + 싫어요 수를 퍼센트로 표시합니다 + 싫어요 수를 숫자로 표시합니다 + + 좋아요 버튼에서 구분선 숨기기 + 좋아요 버튼에서 구분선을 표시하지 않습니다 + 좋아요 버튼에서 구분선을 표시합니다 + 추정되는 좋아요 수 표시하기 + 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시합니다 + 좋아요 수가 숨겨진 동영상에서 추정되는 좋아요 수를 표시하지 않습니다 + API 사용 불가 메시지 표시하기 + ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + ReturnYouTubeDislike를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + ReturnYouTubeDislike.com + 싫어요 수의 데이터는 Return YouTube Dislike API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 + + 이 기기의 ReturnYouTubeDislike API 사용 통계 + 평균 API 응답 시간 + 최소 API 응답 시간 + 최대 API 응답 시간 + 최근 동영상 API 응답 시간 + 싫어요 수를 일시적으로 표시할 수 없습니다 - 클라이언트 API 속도 제한이 적용됨 + API 투표 가져오기, 호출 횟수 + 네트워크 호출한 적이 없습니다 + %d 건의 네트워크 호출이 이루어졌습니다 + API 투표 가져오기, 시간 초과 횟수 + 네트워크 호출이 시간 초과한 적이 없습니다 + %d 건의 네트워크 호출이 시간 초과하였습니다 + API 클라이언트 비율 제한 + 클라이언트 비율을 제한한 적이 없습니다 + %d 건의 클라이언트 비율 제한이 발생하였습니다 + %d 밀리초 + + + SponsorBlock + SponsorBlock 활성화하기 + SponsorBlock은 YouTube 동영상의 성가신 부분을 건너뛰기 위한 크라우드소싱 시스템입니다 + 레이아웃 + 구간 투표 버튼 표시하기 + 플레이어에서 구간 투표 버튼을 표시합니다 + 플레이어에서 구간 투표 버튼을 표시하지 않습니다 + 각진 레이아웃 사용하기 + 버튼과 컨트롤을 각지게 활성화합니다 + 버튼과 컨트롤을 둥글게 활성화합니다 + + 최소화된 건너뛰기 버튼 표시하기 + 최소화된 건너뛰기 버튼을 표시합니다 + 일반적인 건너뛰기 버튼을 표시합니다 + 자동으로 건너뛰기 버튼 숨기기 + 건너뛰기 버튼이 몇 초 후에 숨겨집니다 + 건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다 + 건너뛰기 버튼 표시 시간 + 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다 + 건너뛰기 취소 메시지 표시하기 + 구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다 + 팝업 메시지를 표시하지 않습니다 + 건너뛰기 취소 메시지 표시 시간 + 건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다 + 1 초 + 2 초 + 3 초 + 4 초 + 5 초 + 6 초 + 7 초 + 8 초 + 9 초 + 10 초 + 건너뛸 구간이 제외된 시간 표시하기 + 건너뛸 구간이 제외된 동영상 길이를 재생바에 표시합니다 + 건너뛸 구간이 포함된 동영상 길이를 재생바에 표시합니다 + 새 구간 추가하기 + 구간 추가 버튼 표시하기 + 플레이어에서 구간 추가 버튼을 표시합니다 + 플레이어에서 구간 추가 버튼을 표시하지 않습니다 + 구간 추가 시 최소 슬라이더 단위 설정 + 새 구간 추가 시에 시간 앞으로 버튼 또는 뒤로 버튼을 탭하였을 때 이동하는 최소 시간으로, 단위는 밀리초입니다 + 값은 양수여야 합니다 + 가이드라인 보기 + 구간 제출 시의 주의사항에 대한 내용을 포함하고 있습니다 + 가이드라인 읽어보기 + 광고 구간을 제출하기 전에 SponsorBlock 가이드라인을 읽어보시는 것을 추천합니다 + 이미 읽음 + 보기 + 일반 + API 사용 불가 메시지 표시하기 + SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + SponsorBlock을 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + 건너뛴 횟수 기록 활성화하기 + 구간 건너뛰기를 통해 절약한 시간을 SponsorBlock의 리더보드 시스템에 알려줍니다. 건너뛴 구간에 대한 정보가 서버에 전송됩니다 + 건너뛴 횟수 기록을 비활성화합니다 + 건너뛸 최소 구간 길이 + 설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다 + 잘못된 표시 시간입니다 + 비공개 사용자 아이디 + 비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요 + 비공개 사용자 아이디는 30자 이상이어야 합니다 + API URL 변경하기 + SponsorBlock이 요청을 보낼 서버 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 + API URL 초기화하기 + 잘못된 주소입니다 + API URL을 변경하였습니다 + 설정 가져오기 / 내보내기 + 복사하기 + ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponsorBlock JSON 구성입니다 + ReVanced 및 다른 SponsorBlock 플랫폼에서 가져오거나 내보낼 수 있는 SponserBlock JSON의 전체 구성 파일입니다. 비공개 사용자 아이디를 포함하고 있으므로 주의하세요 + 설정을 성공적으로 가져왔습니다 + 설정을 가져올 수 없습니다: %s + 설정을 내보낼 수 없습니다: %s + "설정에는 비공개 SponsorBlock 사용자 아이디가 포함되어 있습니다 절대 다른 이에게 공개하지 마세요" - 다시 보지 않기 - 각 구간에 설정할 동작 - 스폰서 광고 - 유료 광고, 협찬과 같은 직/간접적인 광고 구간입니다 - 자체 홍보 구간 - \'스폰서 광고\' 구간과 비슷하지만, 자발적으로 홍보하는 내용을 포함하는 구간입니다. 채널 굿즈 광고, 기부 광고와 동영상에 참여한 사람들을 홍보하는 광고가 해당됩니다 - 상호 작용 요청 (구독) - 좋아요, 구독, 알림 설정을 요청하는 내용에 관한 구간입니다 - 하이라이트 - 사람들이 동영상에서 가장 많이 찾는 구간입니다 - 무음 / 인트로 구간 - 아무 내용도 없는 구간입니다. 애니메이션이나 정적 프레임과 같은 내용을 포함하고 있습니다 - 최종 화면 / 크레딧 - 엔딩 크레딧이나 최종 화면이 나타나는 구간입니다 - 흥미 유발 / 인사말 - 예정 동영상, 인사말 그리고 마무리 인사말에 대한 내레이션 트레일러 구간입니다. 추가 콘텐츠를 포함하는 부분은 제외됩니다 - 미리 보기 / 요약 - 이전 에피소드를 간략히 요약하거나 현재 동영상의 하이라이트를 미리 보여줍니다 - 주제와 관련 없는 구간 - 전반적인 동영상의 주제를 이해하는데 필요 없는 내용을 포함하고 있습니다 - 음악이 아닌 구간 - 음악 동영상에서 음악이 아닌 구간이 해당됩니다 - 건너뛰기 - 하이라이트 - 스폰서 광고 건너뛰기 - 자체 홍보 구간 건너뛰기 - 상호 작용 요청 건너뛰기 - 하이라이트로 건너뛰기 - 인트로 건너뛰기 - 무음 구간 건너뛰기 - 무음 구간 건너뛰기 - 최종 화면 건너뛰기 - 흥미 유발 건너뛰기 - 미리 보기 건너뛰기 - 미리 보기 건너뛰기 - 요약 건너뛰기 - 주제와 관련 없는 구간 건너뛰기 - 음악이 아닌 구간 건너뛰기 - 미제출한 구간 건너뛰기 - 스폰서 광고를 건너뛰었습니다 - 자체 홍보 구간을 건너뛰었습니다 - 상호 작용 요청을 건너뛰었습니다 - 하이라이트로 건너뛰었습니다 - 인트로를 건너뛰었습니다 - 무음 구간을 건너뛰었습니다 - 무음 구간을 건너뛰었습니다 - 최종 화면을 건너뛰었습니다 - 흥미 유발 구간을 건너뛰었습니다 - 미리 보기를 건너뛰었습니다 - 미리 보기를 건너뛰었습니다 - 요약을 건너뛰었습니다 - 주제와 관련 없는 구간을 건너뛰었습니다 - 음악이 아닌 구간을 건너뛰었습니다 - 미제출한 구간을 건너뛰었습니다 - 여러 구간을 건너뛰었습니다 - 자동으로 건너뛰기 - 한 번만 자동으로 건너뛰기 - 건너뛰기 버튼 표시하기 - 재생바에만 표시하기 - 아무것도 하지 않기 - 구간을 제출할 수 없습니다: %s - SponsorBlock을 일시적으로 사용할 수 없습니다 - 구간을 제출할 수 없습니다 (상태 코드: %1$d %2$s) - 구간을 제출할 수 없습니다. 동일 사용자 또는 동일 IP로 부터 제출된 요청이 너무 많습니다 - 구간을 제출할 수 없습니다: %s - "구간을 제출할 수 없습니다 + 다시 보지 않기 + 각 구간에 설정할 동작 + 스폰서 광고 + 유료 광고, 협찬과 같은 직/간접적인 광고 구간입니다 + 자체 홍보 구간 + \'스폰서 광고\' 구간과 비슷하지만, 자발적으로 홍보하는 내용을 포함하는 구간입니다. 채널 굿즈 광고, 기부 광고와 동영상에 참여한 사람들을 홍보하는 광고가 해당됩니다 + 상호 작용 요청 (구독) + 좋아요, 구독, 알림 설정을 요청하는 내용에 관한 구간입니다 + 하이라이트 + 사람들이 동영상에서 가장 많이 찾는 구간입니다 + 무음 / 인트로 구간 + 아무 내용도 없는 구간입니다. 애니메이션이나 정적 프레임과 같은 내용을 포함하고 있습니다 + 최종 화면 / 크레딧 + 엔딩 크레딧이나 최종 화면이 나타나는 구간입니다 + 흥미 유발 / 인사말 + 예정 동영상, 인사말 그리고 마무리 인사말에 대한 내레이션 트레일러 구간입니다. 추가 콘텐츠를 포함하는 부분은 제외됩니다 + 미리 보기 / 요약 + 이전 에피소드를 간략히 요약하거나 현재 동영상의 하이라이트를 미리 보여줍니다 + 주제와 관련 없는 구간 + 전반적인 동영상의 주제를 이해하는데 필요 없는 내용을 포함하고 있습니다 + 음악이 아닌 구간 + 음악 동영상에서 음악이 아닌 구간이 해당됩니다 + 건너뛰기 + 하이라이트 + 스폰서 광고 건너뛰기 + 자체 홍보 구간 건너뛰기 + 상호 작용 요청 건너뛰기 + 하이라이트로 건너뛰기 + 인트로 건너뛰기 + 무음 구간 건너뛰기 + 무음 구간 건너뛰기 + 최종 화면 건너뛰기 + 흥미 유발 건너뛰기 + 미리 보기 건너뛰기 + 미리 보기 건너뛰기 + 요약 건너뛰기 + 주제와 관련 없는 구간 건너뛰기 + 음악이 아닌 구간 건너뛰기 + 미제출한 구간 건너뛰기 + 스폰서 광고를 건너뛰었습니다 + 자체 홍보 구간을 건너뛰었습니다 + 상호 작용 요청을 건너뛰었습니다 + 하이라이트로 건너뛰었습니다 + 인트로를 건너뛰었습니다 + 무음 구간을 건너뛰었습니다 + 무음 구간을 건너뛰었습니다 + 최종 화면을 건너뛰었습니다 + 흥미 유발 구간을 건너뛰었습니다 + 미리 보기를 건너뛰었습니다 + 미리 보기를 건너뛰었습니다 + 요약을 건너뛰었습니다 + 주제와 관련 없는 구간을 건너뛰었습니다 + 음악이 아닌 구간을 건너뛰었습니다 + 미제출한 구간을 건너뛰었습니다 + 여러 구간을 건너뛰었습니다 + 자동으로 건너뛰기 + 한 번만 자동으로 건너뛰기 + 건너뛰기 버튼 표시하기 + 재생바에만 표시하기 + 아무것도 하지 않기 + 구간을 제출할 수 없습니다: %s + SponsorBlock을 일시적으로 사용할 수 없습니다 + 구간을 제출할 수 없습니다 (상태 코드: %1$d %2$s) + 구간을 제출할 수 없습니다. 동일 사용자 또는 동일 IP로 부터 제출된 요청이 너무 많습니다 + 구간을 제출할 수 없습니다: %s + "구간을 제출할 수 없습니다 이미 존재하는 구간입니다" - 구간을 성공적으로 제출하였습니다 - - SponsorBlock을 일시적으로 사용할 수 없습니다 (응답 시간 초과) - SponsorBlock을 일시적으로 사용할 수 없습니다 (상태 코드: %d) - SponsorBlock을 일시적으로 사용할 수 없습니다 - 구간에 투표할 수 없습니다 (응답 시간 초과) - 구간에 투표할 수 없습니다 (상태 코드: %1$d %2$s) - 구간에 투표할 수 없습니다: %s - 좋아요 - 싫어요 - 카테고리 변경 - 투표할 구간이 없습니다 - - %1$s ~ %2$s - 구간 카테고리를 선택하세요 - 이 카테고리는 비활성화되어 있습니다. 제출하려면 설정에서 활성화해야 합니다. - 새 SponsorBlock 구간 - %s 을 구간의 시작 또는 끝으로 설정하시겠습니까? - 시작 - - 현재 - 구간의 시작 - 구간의 끝 - 설정된 구간이 정확합니까? - "선택한 구간이 + 구간을 성공적으로 제출하였습니다 + + SponsorBlock을 일시적으로 사용할 수 없습니다 (응답 시간 초과) + SponsorBlock을 일시적으로 사용할 수 없습니다 (상태 코드: %d) + SponsorBlock을 일시적으로 사용할 수 없습니다 + 구간에 투표할 수 없습니다 (응답 시간 초과) + 구간에 투표할 수 없습니다 (상태 코드: %1$d %2$s) + 구간에 투표할 수 없습니다: %s + 좋아요 + 싫어요 + 카테고리 변경 + 투표할 구간이 없습니다 + + %1$s ~ %2$s + 구간 카테고리를 선택하세요 + 이 카테고리는 비활성화되어 있습니다. 제출하려면 설정에서 활성화해야 합니다. + 새 SponsorBlock 구간 + %s 을 구간의 시작 또는 끝으로 설정하시겠습니까? + 시작 + + 현재 + 구간의 시작 + 구간의 끝 + 설정된 구간이 정확합니까? + "선택한 구간이 %1$s 부터 @@ -1289,47 +1374,47 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 (%3$s) 까지 입니다 이렇게 제출하시겠습니까?" - 구간의 시작 또는 끝을 잘못 설정하였습니다 - 먼저 재생바에서 시작 지점과 끝 지점을 표시하세요 - 구간 미리 보기 버튼을 탭하여 설정한 구간이 정상적으로 건너뛰기가 되는지 확인하세요 - 직접 시간 구간 편집하기 - 구간의 시작이나 끝을 편집하시겠습니까? - 잘못된 시간 형식입니다 - 기록 - - 기록을 일시적으로 가져올 수 없습니다 (응답 시간 초과) - 불러오는 중... - SponsorBlock을 비활성화하였습니다 - 사용자 이름: <b>%s</b> - 사용자 이름을 변경하려면 여기를 탭하세요 - 사용자 이름을 변경할 수 없습니다. 상태 코드: %1$d %2$s - 사용자 이름을 성공적으로 변경하였습니다 - 사용자의 평판: <b>%.2f</b> - 제출 횟수: <b>%s</b> - 구간을 보려면 여기를 탭하세요 - SponsorBlock 리더보드 - 다른 분들이 <b>%s</b>개의 구간을 건너뛸 수 있게 해주셨습니다 - 글로벌 기록 또는 상위 기여자를 확인하려면 여기를 탭하세요 - 이는 <b>%s</b>에 해당됩니다.<br>리더보드를 보려면 여기를 탭하세요 - 구간 <b>%s</b>개를 건너뛰었습니다 - 이는 <b>%s</b>에 해당됩니다 - 건너뛴 횟수 기록을 초기화하시겠습니까? - %1$s 시간 %2$s 분 - %1$s 분 %2$s 초 - %s 초 - 불투명도: - 색상: - 정보 - sponsor.ajay.app - 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 - - - 레이아웃 폼 팩터 변경하기 - 기본값 - - 태블릿 - 오토모티브 - "변경 사항: + 구간의 시작 또는 끝을 잘못 설정하였습니다 + 먼저 재생바에서 시작 지점과 끝 지점을 표시하세요 + 구간 미리 보기 버튼을 탭하여 설정한 구간이 정상적으로 건너뛰기가 되는지 확인하세요 + 직접 시간 구간 편집하기 + 구간의 시작이나 끝을 편집하시겠습니까? + 잘못된 시간 형식입니다 + 기록 + + 기록을 일시적으로 가져올 수 없습니다 (응답 시간 초과) + 불러오는 중... + SponsorBlock을 비활성화하였습니다 + 사용자 이름: <b>%s</b> + 사용자 이름을 변경하려면 여기를 탭하세요 + 사용자 이름을 변경할 수 없습니다. 상태 코드: %1$d %2$s + 사용자 이름을 성공적으로 변경하였습니다 + 사용자의 평판: <b>%.2f</b> + 제출 횟수: <b>%s</b> + 구간을 보려면 여기를 탭하세요 + SponsorBlock 리더보드 + 다른 분들이 <b>%s</b>개의 구간을 건너뛸 수 있게 해주셨습니다 + 글로벌 기록 또는 상위 기여자를 확인하려면 여기를 탭하세요 + 이는 <b>%s</b>에 해당됩니다.<br>리더보드를 보려면 여기를 탭하세요 + 구간 <b>%s</b>개를 건너뛰었습니다 + 이는 <b>%s</b>에 해당됩니다 + 건너뛴 횟수 기록을 초기화하시겠습니까? + %1$s 시간 %2$s 분 + %1$s 분 %2$s 초 + %s 초 + 불투명도: + 색상: + 정보 + sponsor.ajay.app + 건너뛸 구간의 데이터는 SponsorBlock API에 의해 제공됩니다. 자세한 내용을 보려면 여기를 탭하세요 + + + 레이아웃 폼 팩터 변경하기 + 기본값 + + 태블릿 + 오토모티브 + "변경 사항: 태블릿 레이아웃 • 커뮤니티 게시물이 숨겨집니다 @@ -1337,330 +1422,332 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 오토모티브 레이아웃 • Shorts가 일반 플레이어에서 재생됩니다 • 피드가 주제와 채널별로 구성됩니다" - - - 앱 버전 속이기 - 앱 버전이 속여집니다 - 앱 버전이 속여지지 않습니다 - "앱 버전이 YouTube 이전 앱 버전으로 속여집니다. + + + 앱 버전 속이기 + 앱 버전이 속여집니다 + 앱 버전이 속여지지 않습니다 + "앱 버전이 YouTube 이전 앱 버전으로 속여집니다. 이 경우 앱 레이아웃과 기능이 변경되지만 알려지지 않은 부작용이 발생할 수 있습니다. 나중에 이 기능을 비활성화하면 앱 UI 버그를 방지하기 위해 앱 데이터를 지우는 것이 좋습니다." - 속이기에 사용될 앱 버전 - 20.13.41 - 접히지 않은 동영상 동작바를 복원합니다 - 20.05.46 - 스크립트 기능을 복원합니다 - 19.35.36 - 이전 Shorts 플레이어 아이콘을 복원합니다 - 19.01.34 - 이전 하단바 아이콘을 복원합니다 - - - 앱 시작 페이지 변경하기 - 기본값 - 모든 구독 채널 - 채널 둘러보기 - 학습 프로그램 - 탐색 - 패션 및 뷰티 - 게임 - 기록 - 내 페이지 - 좋아요 표시한 동영상 - 실시간 - 영화 - 음악 - 뉴스 - 알림 - 재생목록 - 검색 - 쇼핑 - Shorts - 스포츠 - 구독 - 인기 급상승 - 가상 현실 - 나중에 볼 동영상 - 내 클립 - 앱 시작 페이지 항상 변경하기 - "앱 시작 페이지를 항상 변경합니다 + 속이기에 사용될 앱 버전 + 20.13.41 - 접히지 않은 동영상 동작바를 복원합니다 + 20.05.46 - 스크립트 기능을 복원합니다 + + + 앱 시작 페이지 변경하기 + 기본값 + 모든 구독 채널 + 채널 둘러보기 + 학습 프로그램 + 탐색 + 패션 및 뷰티 + 게임 + 기록 + 내 페이지 + 좋아요 표시한 동영상 + 실시간 + 영화 + 음악 + 뉴스 + 알림 + 재생목록 + 검색 + 쇼핑 + Shorts + 스포츠 + 구독 + 인기 급상승 + 가상 현실 + 나중에 볼 동영상 + 내 클립 + 앱 시작 페이지 항상 변경하기 + "앱 시작 페이지를 항상 변경합니다 제한 사항: • 툴바에서 '뒤로 가기' 버튼이 작동하지 않을 수 있습니다" - 앱 시작 페이지를 앱 시작 시에만 변경합니다 - - - 앱 시작 시 Shorts 플레이어 비활성화하기 - 앱 시작 시 Shorts 플레이어를 다시 실행하지 않습니다 - 앱 시작 시 Shorts 플레이어를 다시 실행합니다 - - - Shorts 재생 플레이어 유형 - Shorts 플레이어 - 일반 플레이어 - 일반 플레이어 전체 화면 - - - Shorts 자동재생 - Shorts가 자동넘김됩니다 - Shorts가 반복재생됩니다 - Shorts 백그라운드 재생 자동넘김 - Shorts 백그라운드 재생이 자동넘김됩니다 - Shorts 백그라운드 재생이 반복재생됩니다 - - - 미니 플레이어 - 앱 내에서 최소화된 플레이어의 스타일을 변경할 수 있습니다 - 미니 플레이어 유형 - 사용 안함 - 기본값 - 최소화 - 태블릿 - 모던 스타일 1 - 모던 스타일 2 - 모던 스타일 3 - 모던 스타일 4 - 둥근 모서리 비활성화하기 - 모서리를 각지게 활성화합니다 - 모서리를 둥글게 활성화합니다 - \'두 번 탭하기\' 및 \'핀치하여 크기 조정\' 활성화하기 - "'두 번 탭하기 동작' 및 '핀치하여 크기 조정'을 활성화합니다 + 앱 시작 페이지를 앱 시작 시에만 변경합니다 + + + 앱 시작 시 Shorts 플레이어 비활성화하기 + 앱 시작 시 Shorts 플레이어를 다시 실행하지 않습니다 + 앱 시작 시 Shorts 플레이어를 다시 실행합니다 + + + Shorts 재생 플레이어 유형 + Shorts 플레이어 + 일반 플레이어 + 일반 플레이어 전체 화면 + + + Shorts 자동재생 + Shorts가 자동넘김됩니다 + Shorts가 반복재생됩니다 + Shorts 백그라운드 재생 자동재생 + Shorts 백그라운드 재생이 자동넘김됩니다 + Shorts 백그라운드 재생이 반복재생됩니다 + + + 미니 플레이어 + 앱 내에서 최소화된 플레이어의 스타일을 변경할 수 있습니다 + 미니 플레이어 유형 + 사용 안함 + 기본값 + 최소화 + 태블릿 + 모던 스타일 1 + 모던 스타일 2 + 모던 스타일 3 + 모던 스타일 4 + 둥근 모서리 비활성화하기 + 모서리를 각지게 활성화합니다 + 모서리를 둥글게 활성화합니다 + \'두 번 탭하기\' 및 \'핀치하여 크기 조정\' 활성화하기 + "'두 번 탭하기 동작' 및 '핀치하여 크기 조정'을 활성화합니다 • 두 번 탭하여 미니 플레이어 크기를 늘릴 수 있습니다 • 다시 두 번 탭하면 원래 크기로 복원됩니다" - \'두 번 탭하기 동작\' 및 \'핀치하여 크기 조정\'을 비활성화합니다 - 드래그 & 드롭 비활성화하기 - 드래그 & 드롭을 비활성화합니다 - "드래그 & 드롭을 활성화합니다 + \'두 번 탭하기 동작\' 및 \'핀치하여 크기 조정\'을 비활성화합니다 + 드래그 & 드롭 비활성화하기 + 드래그 & 드롭을 비활성화합니다 + "드래그 & 드롭을 활성화합니다 • 미니 플레이어를 화면 구석으로 드래그 할 수 있습니다" - 수평 드래그 제스처 비활성화하기 - 수평 드래그 제스처를 비활성화합니다 - "수평 드래그 제스처를 활성화합니다 + 수평 드래그 제스처 비활성화하기 + 수평 드래그 제스처를 비활성화합니다 + "수평 드래그 제스처를 활성화합니다 • 미니 플레이어 절반 정도를 왼쪽 밖 또는 오른쪽 밖으로 드래그하여 숨길 수 있습니다" - 오버레이 버튼 숨기기 - 오버레이 버튼이 숨겨집니다. - 오버레이 버튼이 표시됩니다. - \'펼치기\' & \'닫기\' 버튼 숨기기 - "'펼치기' & '닫기' 버튼이 숨겨집니다 + 오버레이 버튼 숨기기 + 오버레이 버튼이 숨겨집니다. + 오버레이 버튼이 표시됩니다. + \'펼치기\' & \'닫기\' 버튼 숨기기 + "'펼치기' & '닫기' 버튼이 숨겨집니다 • 미니 플레이어를 스와이프하여 펼치거나 닫을 수 있습니다" - \'펼치기\' & \'닫기\' 버튼이 표시됩니다 - 서브텍스트 숨기기 - 서브텍스트가 숨겨집니다 - 서브텍스트가 표시됩니다 - \'되감기\' & \'빨리 감기\' 버튼 숨기기 - \'되감기\' & \'빨리 감기\' 버튼이 숨겨집니다 - \'되감기\' & \'빨리 감기\' 버튼이 표시됩니다 - 화면 크기 초기값 - 화면 크기 초기값을 지정할 수 있습니다 (픽셀) - 픽셀 크기는 %1$s-%2$s 사이여야 합니다 - 미니 플레이어 오버레이 불투명도 - 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) - 미니 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 - - - 그라데이션 색상 로딩 화면 활성화하기 - 그라데이션 색상 로딩 화면을 활성화합니다 - 기본 로딩 화면을 활성화합니다 - 스플래시 애니메이션 스타일 - 컬러 - 흑백 - 사용자 정의 재생바 색상 활성화하기 - 사용자 정의 재생바 색상을 활성화합니다 - 기본 재생바 색상을 활성화합니다 - 사용자 정의 재생바 메인 색상 - 재생바 메인 색상을 지정할 수 있습니다 - 사용자 정의 재생바 보조 색상 - 재생바 보조 색상을 지정할 수 있습니다 - 잘못된 재생바 색상입니다 - - - YouTube ReVanced - YT ReVanced - YT - - - 헤더 로고 - 기본값 - 일반 - Premium - ReVanced - - ReVanced 최소화 - 사용자 정의 - - - 이미지 표시 제한 지역 우회하기 - 이미지 호스트로 \'yt4.ggpht.com\'를 사용합니다 - "기본 이미지 호스트를 사용합니다 + \'펼치기\' & \'닫기\' 버튼이 표시됩니다 + 서브텍스트 숨기기 + 서브텍스트가 숨겨집니다 + 서브텍스트가 표시됩니다 + \'되감기\' & \'빨리 감기\' 버튼 숨기기 + \'되감기\' & \'빨리 감기\' 버튼이 숨겨집니다 + \'되감기\' & \'빨리 감기\' 버튼이 표시됩니다 + 화면 크기 초기값 + 화면 크기 초기값을 지정할 수 있습니다 (픽셀) + 픽셀 크기는 %1$s-%2$s 사이여야 합니다 + 미니 플레이어 오버레이 불투명도 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) + 미니 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 + + + 그라데이션 색상 로딩 화면 활성화하기 + 그라데이션 색상 로딩 화면을 활성화합니다 + 기본 로딩 화면을 활성화합니다 + 스플래시 애니메이션 스타일 + 사용 안함 + 컬러 + 흑백 + 사용자 정의 재생바 색상 활성화하기 + 사용자 정의 재생바 색상을 활성화합니다 + 기본 재생바 색상을 활성화합니다 + 사용자 정의 재생바 메인 색상 + 재생바 메인 색상을 지정할 수 있습니다 + 사용자 정의 재생바 보조 색상 + 재생바 보조 색상을 지정할 수 있습니다 + 잘못된 재생바 색상입니다 + + + YouTube ReVanced + YT ReVanced + YT + + + 헤더 로고 + 기본값 + 일반 + Premium + ReVanced + + ReVanced 최소화 + 사용자 정의 + + + 이미지 표시 제한 지역 우회하기 + 이미지 호스트로 \'yt4.ggpht.com\'를 사용합니다 + "기본 이미지 호스트를 사용합니다 이 기능을 활성화하면 일부 지역에서 차단된 이미지를 수신할 수 있습니다" - - - - 홈 탭 - - 구독 탭 - - 내 페이지 탭 - 플레이어 재생목록 & 추천 동영상 - 검색 결과 - 원본 썸네일 - DeArrow & 원본 썸네일 - DeArrow & 스틸 컷 썸네일 - 스틸 컷 썸네일 - DeArrow - "DeArrow는 YouTube 동영상에 크라우드 소싱된 썸네일을 제공합니다. 이러한 썸네일은 YouTube에서 제공하는 썸네일보다 관련성이 높은 경우가 많습니다 + + + + 홈 탭 + + 구독 탭 + + 내 페이지 탭 + 플레이어 재생목록 & 추천 동영상 + 검색 결과 + 원본 썸네일 + DeArrow & 원본 썸네일 + DeArrow & 스틸 컷 썸네일 + 스틸 컷 썸네일 + DeArrow + "DeArrow는 YouTube 동영상에 크라우드 소싱된 썸네일을 제공합니다. 이러한 썸네일은 YouTube에서 제공하는 썸네일보다 관련성이 높은 경우가 많습니다 이 설정을 활성화하면 동영상 URL이 API 서버로 전송되며, 다른 데이터는 전송되지 않습니다. 동영상에 DeArrow 썸네일이 없는 경우에는 원본 썸네일 또는 스틸 컷 썸네일이 표시됩니다 DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" - API 사용 불가 메시지 표시하기 - DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 - DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 - DeArrow API 엔드포인트 - DeArrow 썸네일 캐시 엔드포인트 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 - 스틸 컷 썸네일 - 스틸 컷 썸네일은 각 동영상의 시작 / 중간 / 끝 부분에서 캡쳐된 이미지입니다. 이러한 이미지는 YouTube에 내장되어 있으며, 외부 API는 사용되지 않습니다 - 일반화질 스틸 컷 썸네일 표시하기 - 일반화질 스틸 컷 썸네일을 표시합니다. 썸네일을 빠르게 불러오지만 실시간 스트림, 비공개, 오래된 동영상에서는 아무것도 표시되지 않은 썸네일이 표시될 수 있습니다 - 고화질 스틸 컷 썸네일을 표시합니다 - 스틸 컷 썸네일에서 표시되는 이미지 - 동영상의 시작 부분 이미지 - 동영상의 중간 부분 이미지 - 동영상의 끝 부분 이미지 - - DeArrow를 일시적으로 사용할 수 없습니다 (상태 코드: %s) - DeArrow를 일시적으로 사용할 수 없습니다 - - - ReVanced 공지 사항 팝업 표시하기 - 앱 시작 시 공지 사항 팝업을 표시합니다 - 앱 시작 시 공지 사항 팝업을 표시하지 않습니다 - 앱 시작 시 공지 사항 팝업을 표시할 수 있습니다 - 공지 사항 제공자와 연결할 수 없습니다 - 닫기 - - - 동영상 연속 재생 활성화하기 - 동영상이 연속 재생됩니다 - 동영상이 연속 재생되지 않습니다 - - - 동영상 연속 재생 버튼 표시하기 - 버튼을 표시합니다 - 버튼을 표시하지 않습니다 - 동영상 연속 재생이 켜집니다 - 동영상 연속 재생이 꺼집니다 - - - 오디오 인터럽트 시 일시 정지 - 다른 오디오가 재생될 경우에 재생이 일시 정지됩니다 (예: 네비게이션) - 다른 오디오가 재생될 경우에 볼륨이 낮아집니다 - - - 기기 크기 정보 속이기 - "기기 크기 정보가 속여집니다 + API 사용 불가 메시지 표시하기 + DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시합니다 + DeArrow를 사용할 수 없을 경우에 팝업 메시지를 표시하지 않습니다 + DeArrow API 엔드포인트 + DeArrow 썸네일 캐시 엔드포인트 URL입니다. 이것이 무슨 역할을 하는지 모르는 경우에는 이 URL을 변경하지 마세요 + 스틸 컷 썸네일 + 스틸 컷 썸네일은 각 동영상의 시작 / 중간 / 끝 부분에서 캡쳐된 이미지입니다. 이러한 이미지는 YouTube에 내장되어 있으며, 외부 API는 사용되지 않습니다 + 일반화질 스틸 컷 썸네일 표시하기 + 일반화질 스틸 컷 썸네일을 표시합니다. 썸네일을 빠르게 불러오지만 실시간 스트림, 비공개, 오래된 동영상에서는 아무것도 표시되지 않은 썸네일이 표시될 수 있습니다 + 고화질 스틸 컷 썸네일을 표시합니다 + 스틸 컷 썸네일에서 표시되는 이미지 + 동영상의 시작 부분 이미지 + 동영상의 중간 부분 이미지 + 동영상의 끝 부분 이미지 + + DeArrow를 일시적으로 사용할 수 없습니다 (상태 코드: %s) + DeArrow를 일시적으로 사용할 수 없습니다 + + + ReVanced 공지사항 팝업 표시하기 + 앱 시작 시 공지사항 팝업을 표시합니다 + 앱 시작 시 공지사항 팝업을 표시하지 않습니다 + 앱 시작 시 공지사항 팝업을 표시할 수 있습니다 + 공지사항 제공자와 연결할 수 없습니다 + 닫기 + + + 동영상 연속 재생 활성화하기 + 동영상이 연속 재생됩니다 + 동영상이 연속 재생되지 않습니다 + + + 동영상 연속 재생 버튼 표시하기 + 버튼을 표시합니다 + 버튼을 표시하지 않습니다 + 동영상 연속 재생이 켜집니다 + 동영상 연속 재생이 꺼집니다 + + + 오디오 인터럽트 시 일시 정지 + 다른 오디오가 재생될 경우에 재생이 일시 정지됩니다 (예: 네비게이션) + 다른 오디오가 재생될 경우에 볼륨이 낮아집니다 + + + 기기 크기 정보 속이기 + "기기 크기 정보가 속여집니다 이 설정을 활성화하면 더 높은 동영상 화질 값을 잠금 해제할 수 있지만, 동영상 재생이 끊기거나 배터리 수명이 단축될 수 있으며, 알려지지 않은 부작용도 발생할 수 있습니다" - "기기 크기 정보가 속여지지 않습니다 + "기기 크기 정보가 속여지지 않습니다 이 설정을 활성화하면 더 높은 동영상 화질 값을 잠금 해제할 수 있습니다" - 이 설정을 활성화하면 동영상 재생이 끊기거나 배터리 수명이 단축되고 알려지지 않은 부작용이 발생할 수 있습니다. - - - 진동 피드백 - 진동 피드백을 활성화하거나 비활성화할 수 있습니다 - 챕터 진동 피드백 비활성화하기 - 챕터 진동 피드백을 비활성화합니다 - 챕터 진동 피드백을 활성화합니다 - 세밀한 탐색 진동 피드백 비활성화하기 - 세밀한 탐색 진동 피드백을 비활성화합니다 - 세밀한 탐색 진동 피드백을 활성화합니다 - 탐색 취소 진동 피드백 비활성화하기 - 탐색 취소 진동 피드백을 비활성화합니다 - 탐색 취소 진동 피드백을 활성화합니다 - 동영상 확대 진동 피드백 비활성화하기 - 동영상 확대 진동 피드백을 비활성화합니다 - 동영상 확대 진동 피드백을 활성화합니다 - - - 최근에 계정 로그인 정보를 변경했다면 MicroG를 제거하고 다시 설치하세요. - - - 리다이렉션 없이 링크 바로 열기 - 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거치지 않고 연결됩니다 - 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거쳐서 연결됩니다 - - - 외부 브라우저 사용하기 - 앱 내에서 외부 링크를 열 경우에 외부 브라우저를 사용합니다 - 앱 내에서 외부 링크를 열 경우에 내부 브라우저를 사용합니다 - - - - 자동 - 동영상 화질 저장 활성화하기 - 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장합니다 - 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장하지 않습니다 - 동영상 화질 변경 메시지 표시하기 - 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시합니다 - 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 - Wi-Fi 이용 시 기본 동영상 화질 - 모바일 네트워크 이용 시 기본 동영상 화질 - Shorts 화질 저장 활성화하기 - Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장합니다 - Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장하지 않습니다 - Wi-Fi 이용 시 기본 Shorts 화질 - 모바일 네트워크 이용 시 기본 Shorts 화질 - 모바일 네트워크 - Wi-Fi - %1$s 이용 시 기본 동영상 화질 값을 %2$s 로 변경하였습니다 - %1$s 이용 시 기본 Shorts 화질 값을 %2$s 로 변경하였습니다 - - - 동영상 재생 속도 다이얼로그 버튼 표시하기 - 속도 다이얼로그 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 동영상 재생 속도가 기본값으로 초기화됩니다 - 속도 다이얼로그 버튼이 표시되지 않습니다 - - - 동영상 화질 버튼 표시하기 - 동영상 화질 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 화질이 기본값으로 초기화됩니다 - 동영상 화질 버튼이 표시되지 않습니다 - - - 사용자 정의 동영상 재생 속도 활성화하기 - 사용자 정의 동영상 재생 속도를 활성화합니다 - 사용자 정의 동영상 재생 속도를 비활성화합니다 - 이전 재생 속도 메뉴 복원하기 - 이전 재생 속도 메뉴가 표시됩니다 - 모던 재생 속도 메뉴가 표시됩니다 - 사용자 정의 동영상 재생 속도 편집하기 - 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 - 재생 속도 값은 %s배속보다 작아야 합니다 - 잘못된 사용자 정의 재생 속도 값입니다 - 자동 - 사용자 정의 길게 탭하여 동영상 재생 속도 - 화면을 길게 탭하는 동안에 변경되는 동영상 재생 속도를 0-8 사이에서 지정할 수 있습니다 - - - 동영상 재생 속도 저장 활성화하기 - 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장합니다 - 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장하지 않습니다 - 동영상 재생 속도 변경 메시지 표시하기 - 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시합니다 - 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 - 기본 동영상 재생 속도 - 기본 동영상 재생 속도 값을 %s 로 변경하였습니다 - - - HDR 동영상 비활성화하기 - HDR 동영상을 비활성화합니다 - HDR 동영상을 활성화합니다 - AVC (H.264) 강제로 활성화하기 - 동영상 코덱이 AVC (H.264)로 강제로 결정됩니다 - 동영상 코덱이 자동으로 결정됩니다 - "장점: + 이 설정을 활성화하면 동영상 재생이 끊기거나 배터리 수명이 단축되고 알려지지 않은 부작용이 발생할 수 있습니다. + + + 진동 피드백 + 진동 피드백을 활성화하거나 비활성화할 수 있습니다 + 챕터 진동 피드백 비활성화하기 + 챕터 진동 피드백을 비활성화합니다 + 챕터 진동 피드백을 활성화합니다 + 세밀한 탐색 진동 피드백 비활성화하기 + 세밀한 탐색 진동 피드백을 비활성화합니다 + 세밀한 탐색 진동 피드백을 활성화합니다 + 탐색 취소 진동 피드백 비활성화하기 + 탐색 취소 진동 피드백을 비활성화합니다 + 탐색 취소 진동 피드백을 활성화합니다 + 길게 탭하기 진동 피드백 비활성화하기 + 길게 탭하기 진동 피드백을 비활성화합니다 + 길게 탭하기 진동 피드백을 활성화합니다 + 동영상 확대 진동 피드백 비활성화하기 + 동영상 확대 진동 피드백을 비활성화합니다 + 동영상 확대 진동 피드백을 활성화합니다 + + + 최근에 계정 로그인 정보를 변경했다면 MicroG를 제거하고 다시 설치하세요. + + + 리다이렉션 없이 링크 바로 열기 + 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거치지 않고 연결됩니다 + 앱 내에서 외부 링크를 열 경우에 URL 리다이렉션(youtube.com/redirect)을 거쳐서 연결됩니다 + + + 외부 브라우저 사용하기 + 앱 내에서 외부 링크를 열 경우에 외부 브라우저를 사용합니다 + 앱 내에서 외부 링크를 열 경우에 내부 브라우저를 사용합니다 + + + + 자동 + 동영상 화질 저장 활성화하기 + 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장합니다 + 동영상 화질 값을 변경할 때마다 기본 동영상 화질으로 저장하지 않습니다 + 동영상 화질 변경 메시지 표시하기 + 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시합니다 + 기본 동영상 화질 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 + Wi-Fi 이용 시 기본 동영상 화질 + 모바일 네트워크 이용 시 기본 동영상 화질 + Shorts 화질 저장 활성화하기 + Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장합니다 + Shorts 화질 값을 변경할 때마다 기본 Shorts 화질으로 저장하지 않습니다 + Wi-Fi 이용 시 기본 Shorts 화질 + 모바일 네트워크 이용 시 기본 Shorts 화질 + 모바일 네트워크 + Wi-Fi + %1$s 이용 시 기본 동영상 화질 값을 %2$s 로 변경하였습니다 + %1$s 이용 시 기본 Shorts 화질 값을 %2$s 로 변경하였습니다 + + + 동영상 재생 속도 다이얼로그 버튼 표시하기 + 속도 다이얼로그 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 동영상 재생 속도가 기본값으로 초기화됩니다 + 속도 다이얼로그 버튼이 표시되지 않습니다 + + + 동영상 화질 버튼 표시하기 + 동영상 화질 버튼이 표시됩니다\n\n• 버튼을 길게 탭하면 화질이 기본값으로 초기화됩니다 + 동영상 화질 버튼이 표시되지 않습니다 + + + 사용자 정의 동영상 재생 속도 활성화하기 + 사용자 정의 동영상 재생 속도를 활성화합니다 + 사용자 정의 동영상 재생 속도를 비활성화합니다 + 이전 재생 속도 메뉴 복원하기 + 이전 재생 속도 메뉴가 표시됩니다 + 모던 재생 속도 메뉴가 표시됩니다 + 사용자 정의 동영상 재생 속도 편집하기 + 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 + 재생 속도 값은 %s배속보다 작아야 합니다 + 잘못된 사용자 정의 재생 속도 값입니다 + 자동 + 사용자 정의 길게 탭하여 동영상 재생 속도 + 화면을 길게 탭하는 동안에 변경되는 동영상 재생 속도를 0-8 사이에서 지정할 수 있습니다 + + + 동영상 재생 속도 저장 활성화하기 + 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장합니다 + 동영상 재생 속도 값을 변경할 때마다 기본 동영상 재생 속도로 저장하지 않습니다 + 동영상 재생 속도 변경 메시지 표시하기 + 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시합니다 + 기본 동영상 재생 속도 값을 변경할 때마다 팝업 메시지를 표시하지 않습니다 + 기본 동영상 재생 속도 + 기본 동영상 재생 속도 값을 %s 로 변경하였습니다 + + + HDR 동영상 비활성화하기 + HDR 동영상을 비활성화합니다 + HDR 동영상을 활성화합니다 + AVC (H.264) 강제로 활성화하기 + 동영상 코덱이 AVC (H.264)로 강제로 결정됩니다 + 동영상 코덱이 자동으로 결정됩니다 + "장점: • 배터리 수명을 향상시킬 수 있습니다 • 구형 기기에서 누락된 동영상 화질을 복원할 수 있습니다 @@ -1669,182 +1756,188 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" • 동영상을 재생할 경우에 VP9 또는 AV1보다 더 많은 인터넷 데이터가 사용됩니다 • HDR 동영상에서는 AVC가 사용되지 않습니다 • 일부 기기에서는 AVC를 강제로 활성화할 수 없습니다" - - - 고급 동영상 화질 설정 메뉴 표시하기 - 고급 동영상 화질 설정 메뉴를 표시합니다 - 고급 동영상 화질 설정 메뉴를 표시하지 않습니다 - - - 슬라이드하여 탐색 활성화하기 - 슬라이드하여 탐색을 활성화합니다 - 슬라이드하여 탐색을 비활성화합니다 - - - Android VR AV1 허용하기 - "동영상 코덱이 AVC (H.264), VP9 또는 AV1으로 결정됩니다 + + + 고급 동영상 화질 설정 메뉴 표시하기 + 고급 동영상 화질 설정 메뉴를 표시합니다 + 고급 동영상 화질 설정 메뉴를 표시하지 않습니다 + + + Premium 화질 옵션 숨기기 + Premium 화질 옵션이 숨겨집니다 + Premium 화질 옵션이 표시됩니다 + + + 슬라이드하여 탐색 활성화하기 + 슬라이드하여 탐색을 활성화합니다 + 슬라이드하여 탐색을 비활성화합니다 + + + Android VR AV1 허용하기 + "동영상 코덱이 AVC (H.264), VP9 또는 AV1으로 결정됩니다 동영상 재생이 끊기거나 프레임이 손실될 수 있습니다" - 동영상 코덱이 AVC (H.264) 또는 VP9으로 결정됩니다 - "이 설정을 활성화하면, 소프트웨어 AV1 디코딩이 사용될 수 있습니다. + 동영상 코덱이 AVC (H.264) 또는 VP9으로 결정됩니다 + "이 설정을 활성화하면, 소프트웨어 AV1 디코딩이 사용될 수 있습니다. AV1이 사용된 동영상 재생이 끊기거나 프레임이 손실될 수 있습니다." - 속이기에 따른 부작용 - • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 - • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 - • 오디오 트랙 메뉴가 표시되지 않습니다 - • AV1 코덱이 지원되지 않습니다 - • 안정적인 볼륨을 사용할 수 없습니다 - • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 - - • 원본 오디오를 강제로 활성화할 수 없습니다 - 전문 통계에서 표시하기 - 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 - 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 - - - - - YT Music ReVanced - Music ReVanced - Music - - - 정보 - 광고 - 일반 - 플레이어 - 기타 - - - 동영상 광고 숨기기 - 동영상 광고가 숨겨집니다 - 동영상 광고가 표시됩니다 - - - 영구적인 반복 활성화하기 - 영구적인 반복을 활성화합니다 - 영구적인 반복을 비활성화합니다 - - - 크롬캐스트 버튼 숨기기 - 크롬캐스트 버튼이 숨겨집니다 - 크롬캐스트 버튼이 표시됩니다 - 기록 버튼 숨기기 - 기록 버튼이 숨겨집니다 - 기록 버튼이 표시됩니다 - 알림 버튼 숨기기 - 알림 버튼이 숨겨집니다 - 알림 버튼이 표시됩니다 - 검색 버튼 숨기기 - 검색 버튼이 숨겨집니다 - 검색 버튼이 표시됩니다 - - - 카테고리 바 숨기기 - 카테고리 바가 숨겨집니다 - 카테고리 바가 표시됩니다 - - - 미니 플레이어 색상 변경하기 - 미니 플레이어 색상이 전체 화면 플레이어와 일치합니다 - 미니 플레이어 색상이 기본 색상입니다 - - - 하단바 - 하단바에서 버튼을 숨기거나 변경할 수 있습니다 - - 홈 버튼 숨기기 - 홈 버튼이 숨겨집니다 - 홈 버튼이 표시됩니다 - - 샘플 버튼 숨기기 - 샘플 버튼이 숨겨집니다 - 샘플 버튼이 표시됩니다 - - 둘러보기 버튼 숨기기 - 둘러보기 버튼이 숨겨집니다 - 둘러보기 버튼이 표시됩니다 - - 보관함 버튼 숨기기 - 보관함 버튼이 숨겨집니다 - 보관함 버튼이 표시됩니다 - - 업그레이드 버튼 숨기기 - 업그레이드 버튼이 숨겨집니다 - 업그레이드 버튼이 표시됩니다 - 하단바 숨기기 - 하단바가 숨겨집니다 - 하단바가 표시됩니다 - 하단바 버튼 라벨 숨기기 - 하단바 버튼 라벨이 숨겨집니다 - 하단바 버튼 라벨이 표시됩니다 - - - Music Premium 가입 라벨 숨기기 - Music Premium 가입 라벨이 숨겨집니다 - Music Premium 가입 라벨이 표시됩니다 - - - 업그레이드 버튼 숨기기 - 업그레이드 버튼이 숨겨집니다 - 업그레이드 버튼이 표시됩니다 - - - - - 음성 광고 차단하기 - 음성 광고를 차단합니다 - 음성 광고를 차단하지 않습니다 - - - %s 를 차단할 수 없기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. - %s 에서 오류가 발생했기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. - 광고 차단 Proxy 서버 사용하기 - 사용 안함 - Luminous Proxy - PurpleAdBlock Proxy - - - 동영상 광고 차단하기 - 동영상 광고를 차단합니다 - 동영상 광고를 차단하지 않습니다 - - - 메시지를 삭제하였습니다 - 삭제된 메시지 표시하기 - 삭제된 메시지 표시하지 않기 - 스포일러 뒤에 삭제된 메시지 숨기기 - 삭제된 메시지를 줄이 그어진 텍스트로 표시하기 - - - 채널 포인트 자동 적립하기 - 채널 포인트을 자동으로 적립합니다 - 채널 포인트를 자동으로 적립하지 않습니다 - - - - Twitch 디버그 모드 활성화하기 - Twitch 디버그 모드를 활성화합니다 (추천하지 않음) - Twitch 디버그 모드를 비활성화합니다 - - - ReVanced 설정 - 정보 - ReVanced 정보 - 광고 차단 - 광고 차단 설정을 할 수 있습니다 - 채팅 - 채팅을 설정할 수 있습니다 - 기타 - 그외 부분을 설정할 수 있습니다 - 일반 설정 - 기타 설정 - 클라이언트 광고 - 서버 광고 - 디버그 로그 - 디버그 로그를 활성화합니다 - 디버그 로그를 비활성화합니다 - - + 속이기에 따른 부작용 + • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 + • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 + • 오디오 트랙 메뉴가 표시되지 않습니다 + • AV1 코덱이 지원되지 않습니다 + • 안정적인 볼륨을 사용할 수 없습니다 + • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 + + • 원본 오디오를 강제로 활성화할 수 없습니다 + 전문 통계에서 표시하기 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시됩니다 + 동영상 스트림을 가져오는 데 사용되는 클라이언트가 전문 통계에서 표시되지 않습니다 + + + + + YT Music ReVanced + Music ReVanced + Music + + + + 정보 + 광고 + 일반 + 플레이어 + 기타 + + + 동영상 광고 숨기기 + 동영상 광고가 숨겨집니다 + 동영상 광고가 표시됩니다 + + + 영구적인 반복 활성화하기 + 영구적인 반복을 활성화합니다 + 영구적인 반복을 비활성화합니다 + + + 크롬캐스트 버튼 숨기기 + 크롬캐스트 버튼이 숨겨집니다 + 크롬캐스트 버튼이 표시됩니다 + 기록 버튼 숨기기 + 기록 버튼이 숨겨집니다 + 기록 버튼이 표시됩니다 + 알림 버튼 숨기기 + 알림 버튼이 숨겨집니다 + 알림 버튼이 표시됩니다 + 검색 버튼 숨기기 + 검색 버튼이 숨겨집니다 + 검색 버튼이 표시됩니다 + + + 카테고리 바 숨기기 + 카테고리 바가 숨겨집니다 + 카테고리 바가 표시됩니다 + + + 미니 플레이어 색상 변경하기 + 미니 플레이어 색상이 전체 화면 플레이어와 일치합니다 + 미니 플레이어 색상이 기본 색상입니다 + + + 하단바 + 하단바에서 버튼을 숨기거나 변경할 수 있습니다 + + 홈 버튼 숨기기 + 홈 버튼이 숨겨집니다 + 홈 버튼이 표시됩니다 + + 샘플 버튼 숨기기 + 샘플 버튼이 숨겨집니다 + 샘플 버튼이 표시됩니다 + + 둘러보기 버튼 숨기기 + 둘러보기 버튼이 숨겨집니다 + 둘러보기 버튼이 표시됩니다 + + 보관함 버튼 숨기기 + 보관함 버튼이 숨겨집니다 + 보관함 버튼이 표시됩니다 + + 업그레이드 버튼 숨기기 + 업그레이드 버튼이 숨겨집니다 + 업그레이드 버튼이 표시됩니다 + 하단바 숨기기 + 하단바가 숨겨집니다 + 하단바가 표시됩니다 + 하단바 버튼 라벨 숨기기 + 하단바 버튼 라벨이 숨겨집니다 + 하단바 버튼 라벨이 표시됩니다 + + + Music Premium 가입 라벨 숨기기 + Music Premium 가입 라벨이 숨겨집니다 + Music Premium 가입 라벨이 표시됩니다 + + + 업그레이드 버튼 숨기기 + 업그레이드 버튼이 숨겨집니다 + 업그레이드 버튼이 표시됩니다 + + + + + 음성 광고 차단하기 + 음성 광고를 차단합니다 + 음성 광고를 차단하지 않습니다 + + + %s 를 차단할 수 없기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. + %s 에서 오류가 발생했기 때문에 광고가 표시될 것입니다. 설정에서 다른 광고 차단 서비스로 전환해 보세요. + 광고 차단 Proxy 서버 사용하기 + 사용 안함 + Luminous Proxy + PurpleAdBlock Proxy + + + 동영상 광고 차단하기 + 동영상 광고를 차단합니다 + 동영상 광고를 차단하지 않습니다 + + + 메시지를 삭제하였습니다 + 삭제된 메시지 표시하기 + 삭제된 메시지 표시하지 않기 + 스포일러 뒤에 삭제된 메시지 숨기기 + 삭제된 메시지를 줄이 그어진 텍스트로 표시하기 + + + 채널 포인트 자동 적립하기 + 채널 포인트을 자동으로 적립합니다 + 채널 포인트를 자동으로 적립하지 않습니다 + + + + Twitch 디버그 모드 활성화하기 + Twitch 디버그 모드를 활성화합니다 (추천하지 않음) + Twitch 디버그 모드를 비활성화합니다 + + + ReVanced 설정 + 정보 + ReVanced 정보 + 광고 차단 + 광고 차단 설정을 할 수 있습니다 + 채팅 + 채팅을 설정할 수 있습니다 + 기타 + 그외 부분을 설정할 수 있습니다 + 일반 설정 + 기타 설정 + 클라이언트 광고 + 서버 광고 + 디버그 로그 + 디버그 로그를 활성화합니다 + 디버그 로그를 비활성화합니다 + + diff --git a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml index 3a40645452..5c89814a2e 100644 --- a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml +++ b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Жоон иконаларды өчүрүү + Иконалар жоон эмес + Иконалар жоон + GmsCore + GmsCore\'го тиешелүү жөндөөлөр + GmsCore жаңыртууларын текшерүү + Жаңыртууларды текшерүү иштетилген + Жаңыртууларды текшерүү өчүрүлгөн + GmsCore Жөндөөлөрүн ачуу + GmsCore Жөндөөлөрү + MicroG GmsCore орнотулган эмес. Орнотуңуз. + Аракет талап кылынат + MicroG GmsCore жаңыртууларын текшерүү мүмкүн болгон жок + MicroG GmsCore\'дун жаңы версиясы (%1$s) жеткиликтүү. Учурда сиз %2$s версиясын колдонуп жатасыз. + "MicroG GmsCore фондо иштөөгө уруксаты жок. + +Телефонуңуз үчүн \"Менин колдонмомду өлтүрбө\" жол көрсөткүчүн ээрчиңиз жана нускамаларды MicroG орнотууңузга колдонуңуз. + +Бул колдонмонун иштеши үчүн талап кылынат." + Веб-сайтты ачуу + Жокко чыгаруу + "Көйгөйлөрдү болтурбоо үчүн MicroG GmsCore батареяны оптималдаштырууну өчүрүү керек. + +MicroG үчүн батареяны оптималдаштырууну өчүрүү батареянын колдонулушуна терс таасирин тийгизбейт. + +Улантуу баскычын басып, оптималдаштыруу өзгөрүүлөрүнө уруксат бериңиз." + Улантуу - + + Бул функцияны колдонуу үчүн колдонмону өчүрүп кайра баштаңыз. + Протокол буферди журналга жазуу + Мүчүлүштүктөрдү оңдоо журналдары протокол буферди камтыйт + Мүчүлүштүктөрдү оңдоо журналдары протокол буферди камтыбайт + "Бул жөндөөнү иштетүү кошумча жайгашуу дайындарын, анын ичинде кээ бир UI компоненттери үчүн экрандагы текстти каттайт. + +Бул ыңгайлаштырылган чыпкаларды түзүүдө компоненттерди аныктоого жардам берет. + +Бирок, муну иштетүү IP дарегиңиз сыяктуу кээ бир колдонуучу дайындарын да каттайт." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Жаратуучу дүкөнүнүн текчесин жашыруу + Видео ойноткучтун астындагы жаратуучу дүкөнүнүн текчеси жашырылган + Видео ойноткучтун астындагы жаратуучу дүкөнүнүн текчеси көрсөтүлгөн + Башкы лентадагы видеолордун астындагы комментарийлер бөлүмүн жашыруу + Башкы лентадагы видеолордун астындагы комментарийлер бөлүмү жашырылган + Башкы лентадагы видеолордун астындагы комментарийлер бөлүмү көрсөтүлгөн + + Жаңы видеолор + Жаңы видеолор баскычы жашырылган + Жаңы видеолор баскычы көрсөтүлгөн + + Веб издөө натыйжаларын жашыруу + Веб издөө натыйжалары жашырылган + Веб издөө натыйжалары көрсөтүлгөн + \"Сизге жагышы мүмкүн\" бөлүмүн жашыруу + \"Сизге жагышы мүмкүн\" бөлүмү жашырылган + \"Сизге жагышы мүмкүн\" бөлүмү көрсөтүлгөн + This button usually appears in the video player for certain videos. --> + + \"Жандуу баарлашууну кайталоо\" баскычын жашыруу + Ойноткучтун үстүңкү катмарындагы \"Жандуу баарлашууну кайталоо\" баскычы жашырылган + Ойноткучтун үстүңкү катмарындагы \"Жандуу баарлашууну кайталоо\" баскычы көрсөтүлгөн + Видеонун аталышын жашыруу + Ойноткучтун үстүңкү катмарындагы видеонун аталышы жашырылган + Ойноткучтун үстүңкү катмарындагы видеонун аталышы көрсөтүлгөн + Курстун жүрүшүн жашыруу + Курстун жүрүшү бөлүмү жашырылган + Курстун жүрүшү бөлүмү көрсөтүлгөн + Изилдөөнү жашыруу + \"Бул курсту изилдөө\" жана \"Подкастты изилдөө\" бөлүмдөрү жашырылган + \"Бул курсту изилдөө\" жана \"Подкастты изилдөө\" бөлүмдөрү көрсөтүлгөн + \"Бул курсту изилдөө\" бөлүмүн жашыруу + \"Бул курсту изилдөө\" бөлүмү жашырылган + \"Бул курсту изилдөө\" бөлүмү көрсөтүлгөн + \"Подкастты изилдөө\" бөлүмүн жашыруу + \"Подкастты изилдөө\" бөлүмү жашырылган + \"Подкастты изилдөө\" бөлүмү көрсөтүлгөн + \"Өзгөчөлөнгөн жерлерди\" жашыруу + Өзгөчөлөнгөн жерлер + Өзгөчөлөнгөн жерлер бөлүмү көрсөтүлгөн + Лентанын калкыма меню чыпкасын иштетүү + Лентанын калкыма меню чыпкасы иштетилген + Лентанын калкыма меню чыпкасы өчүрүлгөн + Лентанын калкыма меню чыпкасы + Чыпкалоо үчүн калкыма меню аттарын сапка бирден киргизиңиз + Оюндарды жашыруу + Оюндар бөлүмү жашырылган + Оюндар бөлүмү көрсөтүлгөн + Музыканы жашыруу + Музыка бөлүмү жашырылган + Музыка бөлүмү көрсөтүлгөн + Викториналарды жашыруу + Викториналар бөлүмү жашырылган + Викториналар бөлүмү көрсөтүлгөн + Канал өтмөгүнүн чыпкасын иштетүү + Канал өтмөгүнүн чыпкасы иштетилген + Канал өтмөгүнүн чыпкасы өчүрүлгөн + Канал өтмөгүнүн чыпкасы + Чыпкалоо үчүн канал өтмөгүнүн аттарын сапка бирден киргизиңиз + "Чектөөлөр: +• Shorts текчелеринде, канал баракчаларында жана издөө натыйжаларында көрүү сандары дагы эле көрсөтүлүшү мүмкүн. +• Бул функция унаа форма фактору менен иштебейт." + "Чектөөлөр: +• Shorts текчелеринде, канал баракчаларында жана издөө натыйжаларында жүктөө убакыттары дагы эле көрсөтүлүшү мүмкүн. +• Бул функция унаа форма фактору менен иштебейт." + "Башкы бет/Жазылуулар/Издөө натыйжалары ачкыч сөз айкаштарына дал келген мазмунду жашыруу үчүн чыпкаланган + +Чектөөлөр: +• Shorts каналдын аты боюнча жашырылбайт +• Кээ бир UI компоненттери жашырылбай калышы мүмкүн +• Ачкыч сөз менен издөө натыйжаларды көрсөтпөй калышы мүмкүн" - + Толук экрандагы жарнамалар жашырылган + Ойноткучтун калкыма жарнамаларын жашыруу + Ойноткучтун калкыма жарнамалары жашырылган + Ойноткучтун калкыма жарнамалары көрсөтүлгөн + Ойноткучтун үстүңкү катмарындагы өнүмдөрдү көрүү баннери жашырылган + Ойноткучтун үстүңкү катмарындагы өнүмдөрдү көрүү баннери көрсөтүлгөн + YouTube Premium промоакцияларын жашыруу + YouTube Premium промоакциялары жашырылган + YouTube Premium промоакциялары көрсөтүлгөн - - + + URL алмашуу буферине көчүрүлдү + Убакыт белгиси менен URL көчүрүлдү + Видеонун URL дарегин көчүрүү баскычын көрсөтүү + Видеонун URL дарегин көчүрүү баскычы көрсөтүлгөн. Видеонун URL дарегин көчүрүү үчүн басыңыз. Убакыт белгиси менен көчүрүү үчүн басып туруңуз + Видеонун URL дарегин көчүрүү баскычы көрсөтүлгөн эмес + Убакыт белгиси менен URL көчүрүү баскычын көрсөтүү + Убакыт белгиси менен URL көчүрүү баскычы көрсөтүлгөн. Видеонун URL дарегин убакыт белгиси менен көчүрүү үчүн басыңыз. Убакыт белгиси жок көчүрүү үчүн басып туруңуз + Убакыт белгиси менен URL көчүрүү баскычы көрсөтүлгөн эмес + - + + \"ТВга кирүү\" калкыма терезесин өчүрүү + \"ТВга кирүү\" калкыма терезеси өчүрүлгөн + \"ТВга кирүү\" калкыма терезеси иштетилген + - + + Издөө үчүн басууну иштетүү + Издөө үчүн басуу иштетилген + Издөө үчүн басуу өчүрүлгөн + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Кээ бир колдонуучу аккаунттары үчүн жашыруу иштебей калышы мүмкүн. - + + Навигация баскычтары + Навигация тилкесинин баскычтарын жашыруу же өзгөртүү + Башкы бетти жашыруу + Башкы бет баскычы жашырылган + Башкы бет баскычы көрсөтүлгөн + Shorts жашыруу + Shorts баскычы жашырылган + Shorts баскычы көрсөтүлгөн + Түзүүнү жашыруу + Түзүү баскычы жашырылган + Түзүү баскычы көрсөтүлгөн + Жазылууларды жашыруу + Жазылуулар баскычы жашырылган + Жазылуулар баскычы көрсөтүлгөн + Эскертмелерди жашыруу + Эскертмелер баскычы жашырылган + Эскертмелер баскычы көрсөтүлгөн + Түзүүнү Эскертмелер менен алмаштыруу + Түзүү баскычы Эскертмелер баскычы менен алмаштырылган + Түзүү баскычы Эскертмелер баскычы менен алмаштырылган эмес + Эгер бул жөндөөнү өзгөртүү натыйжа бербесе, Инкогнито режимине өтүп көрүңүз. + Навигация баскычтарынын этикеткаларын жашыруу + Этикеткалар жашырылган + Этикеткалар көрсөтүлгөн + Тар навигация баскычтарын иштетүү + Навигация баскычтарынын ортосундагы аралык тар + Навигация баскычтарынын ортосундагы аралык кадимкидей + Навигация тилкесинин анимацияларын иштетүү + Навигация өтүүлөрү анимацияланган + Навигация өтүүлөрү анимацияланган эмес + Тунук эмес абал тилкесин өчүрүү + Абал тилкеси тунук эмес + Абал тилкеси тунук эмес же тунук + "Чектөөлөр: +• Видео ойноткучтун жогору жагында кара тилке пайда болушу мүмкүн. +• Кээ бир түзмөктөрдө бул функцияны иштетүү системанын навигация тилкесин тунук кылып өзгөртө алат." + Ачык тунук тилкени өчүрүү + Жарык режимдеги навигация тилкеси тунук эмес + Жарык режимдеги навигация тилкеси тунук эмес же тунук + Кара тунук тилкени өчүрүү + Караңгы режимдеги навигация тилкеси тунук эмес + Караңгы режимдеги навигация тилкеси тунук эмес же тунук + Куралдар тилкеси + Куралдар тилкесинин компоненттерин жашыруу же өзгөртүү + Түзүү баскычын жашыруу + Түзүү баскычы жашырылган + Түзүү баскычы көрсөтүлгөн + Эскертмелер баскычын жашыруу + Эскертмелер баскычы жашырылган + Эскертмелер баскычы көрсөтүлгөн + Издөө баскычын жашыруу + Издөө баскычы жашырылган + Издөө баскычы көрсөтүлгөн. + Кең издөө тилкесин иштетүү + Кең издөө тилкеси иштетилген + Кең издөө тилкеси өчүрүлгөн @@ -126,25 +315,67 @@ Second \"item\" text" + Кичирейтүү баскычын жашыруу + Кичирейтүү баскычы жашырылган + Кичирейтүү баскычы көрсөтүлгөн + Толук экран баскычын жашыруу + Толук экран баскычы жашырылган + Толук экран баскычы көрсөтүлгөн + + + Акыркы экран карталарын жашыруу + Акыркы экран карталары жашырылган + Акыркы экран карталары көрсөтүлгөн - + Толук экрандуу чоң издөө тилкесин иштетүү + Толук экрандуу издөө тилкеси чоң өлчөмдө + Толук экрандуу издөө тилкеси кадимки өлчөмдө + Канал баракчасындагы Shorts жашыруу + Канал баракчасында жашырылган + Канал баракчасында көрсөтүлгөн + Видео сыпаттамасындагы Shorts жашыруу + Видео сыпаттамасында жашырылган + Видео сыпаттамасында көрсөтүлгөн + AI баскычын жашыруу + AI баскычы жашырылган + AI баскычы көрсөтүлгөн + \"Авто-котормо\" этикеткасын жашыруу + Авто-котормо этикеткасы жашырылган + Авто-котормо этикеткасы көрсөтүлгөн + - + + Авто ойнотуунун алдын ала көрүнүшүн жашыруу + Авто ойнотуунун алдын ала көрүнүшү жашырылган + Авто ойнотуунун алдын ала көрүнүшү көрсөтүлгөн + + + Акыркы экрандагы сунушталган видеону жашыруу + "Авто ойнотуу өчүрүлгөндө акыркы экрандагы сунушталган видео жашырылат + +Авто ойнотууну YouTube жөндөөлөрүнөн өзгөртсө болот: +Жөндөөлөр → Ойнотуу → Кийинки видеону автоматтык түрдө ойнотуу" + Акыркы экрандагы сунушталган видео көрсөтүлгөн + - + + Ойноткучтун калкыма панелдерин жашыруу + Ойноткучтун калкыма панелдери жашырылган + Ойноткучтун калкыма панелдери көрсөтүлгөн + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Музыкалык видеолордо гана колдонулат. Музыкасы жок музыкалык видеолордун башка категорияга кирбеген бөлүктөрү + Сегментти жөнөтүү мүмкүн эмес: %s + "Сегментти жөнөтүү мүмкүн эмес. +Буга чейин бар" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Өчүрүлгөн + Түс + Ак-кара + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Басып кармап туруу гаптикасын өчүрүү + Басып кармап туруу гаптикасы өчүрүлгөн + Басып кармап туруу гаптикасы иштетилген + @@ -200,6 +441,11 @@ Second \"item\" text" + + Премиум сапат параметрлерин жашыруу + Премиум сапат параметрлери жашырылган + Премиум сапат параметрлери көрсөтүлгөн + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml index 3a40645452..abcd433f67 100644 --- a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml +++ b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml @@ -27,18 +27,47 @@ Second \"item\" text" + ປິດການໃຊ້ງານໄອຄອນຕົວໜາ + ໄອຄອນບໍ່ເປັນຕົວໜາ + ໄອຄອນເປັນຕົວໜາ + GmsCore + ການຕັ້ງຄ່າທີ່ກ່ຽວຂ້ອງກັບ GmsCore + ກວດສອບການອັບເດດ GmsCore + ເປີດໃຊ້ງານການກວດສອບການອັບເດດ + ປິດການກວດສອບການອັບເດດແລ້ວ + ເປີດການຕັ້ງຄ່າ GmsCore + ການຕັ້ງຄ່າຂອງ GmsCore + MicroG GmsCore ບໍ່ໄດ້ຕິດຕັ້ງ. ຕິດຕັ້ງມັນ. + ຕ້ອງການການກະທຳ + ກວດສອບການອັບເດດ MicroG GmsCore ລົ້ມເຫຼວ + ລຸ້ນໃໝ່ (%1$s) ຂອງ MicroG GmsCore ມີໃຫ້ໃຊ້ແລ້ວ. ປັດຈຸບັນ, ທ່ານກໍາລັງໃຊ້ລຸ້ນ %2$s. + "MicroG GmsCore ບໍ່ມີສິດໃນການເຮັດວຽກໃນພື້ນຫຼັງ.\n\nປະຕິບັດຕາມຄູ່ມື \"ຢ່າປິດແອັບຂອງຂ້ອຍ\" ສຳລັບໂທລະສັບຂອງທ່ານ, ແລະ ນຳໃຊ້ຄຳແນະນຳໃສ່ການຕິດຕັ້ງ MicroG ຂອງທ່ານ.\n\nອັນນີ້ແມ່ນຈຳເປັນສຳລັບແອັບເພື່ອເຮັດວຽກ." + ເປີດເວັບໄຊ + ຍົກເລີກ + "ການເພີ່ມປະສິດທິພາບແບັດເຕີຣີຂອງ MicroG GmsCore ຕ້ອງຖືກປິດເພື່ອປ້ອງກັນບັນຫາ.\n\nການປິດການເພີ່ມປະສິດທິພາບແບັດເຕີຣີສຳລັບ MicroG ຈະບໍ່ສົ່ງຜົນກະທົບຕໍ່ການນຳໃຊ້ແບັດເຕີຣີ.\n\nແຕະປຸ່ມສືບຕໍ່ ແລະ ອະນຸຍາດການປ່ຽນແປງການເພີ່ມປະສິດທິພາບ." + ສືບຕໍ່ - + + ປິດເປີດແອັບໃໝ່ເພື່ອໃຊ້ຄຸນສົມບັດນີ້ + ບັນທຶກໂປຣໂຕຄໍບັຟເຟີ + ບັນທຶກດີບັກລວມມີໂປຣໂຕຄໍບັຟເຟີ + ບັນທຶກດີບັກບໍ່ລວມມີໂປຣໂຕຄໍບັຟເຟີ + "ການເປີດໃຊ້ການຕັ້ງຄ່ານີ້ຈະບັນທຶກຂໍ້ມູນເຄົ້າໂຄງເພີ່ມເຕີມ, ລວມທັງຂໍ້ຄວາມເທິງໜ້າຈໍສໍາລັບບາງອົງປະກອບ UI. + +ອັນນີ້ສາມາດຊ່ວຍລະບຸອົງປະກອບຕ່າງໆ ເມື່ອສ້າງຕົວກອງແບບກຳນົດເອງ. + +ແນວໃດກໍຕາມ, ການເປີດໃຊ້ນີ້ກໍຈະບັນທຶກຂໍ້ມູນຜູ້ໃຊ້ບາງຢ່າງ ເຊັ່ນ: ທີ່ຢູ່ IP ຂອງທ່ານ." + @@ -48,40 +77,135 @@ Second \"item\" text" - + ເຊື່ອງຊັ້ນວາງຮ້ານຄ້າຜູ້ສ້າງ + ຊັ້ນວາງຮ້ານຄ້າຜູ້ສ້າງທີ່ຢູ່ລຸ່ມເຄື່ອງຫຼິ້ນວິດີໂອຖືກເຊື່ອງໄວ້ + ຊັ້ນວາງຮ້ານຄ້າຜູ້ສ້າງທີ່ຢູ່ລຸ່ມເຄື່ອງຫຼິ້ນວິດີໂອຖືກສະແດງ + ເຊື່ອງພາກສ່ວນຄຳເຫັນພາຍໃຕ້ວິດີໂອໃນຟີດໜ້າຫຼັກ + ພາກສ່ວນຄຳເຫັນພາຍໃຕ້ວິດີໂອໃນຟີດໜ້າຫຼັກຖືກເຊື່ອງໄວ້ + ພາກສ່ວນຄຳເຫັນພາຍໃຕ້ວິດີໂອໃນຟີດໜ້າຫຼັກຖືກສະແດງ + + ເຊື່ອງປຸ່ມ \'ວິດີໂອລ່າສຸດ\' + ປຸ່ມວິດີໂອລ່າສຸດຖືກເຊື່ອງໄວ້ + ປຸ່ມວິດີໂອລ່າສຸດຖືກສະແດງ + + ເຊື່ອງຜົນການຄົ້ນຫາເວັບ + ຜົນການຄົ້ນຫາເວັບຖືກເຊື່ອງໄວ້ + ຜົນການຄົ້ນຫາເວັບຖືກສະແດງ + ເຊື່ອງພາກສ່ວນ \'ທີ່ທ່ານອາດຈະມັກ\' + ພາກສ່ວນ \'ທີ່ທ່ານອາດຈະມັກ\' ຖືກເຊື່ອງໄວ້ + ພາກສ່ວນ \'ທີ່ທ່ານອາດຈະມັກ\' ຖືກສະແດງ + This button usually appears in the video player for certain videos. --> + + ເຊື່ອງປຸ່ມ \'ເປີດເບິ່ງການສົນທະນາສົດຄືນໃໝ່\' + ປຸ່ມເປີດເບິ່ງການສົນທະນາສົດຄືນໃໝ່ໃນການວາງຊ້ອນເຄື່ອງຫຼິ້ນຖືກເຊື່ອງໄວ້ + ປຸ່ມເປີດເບິ່ງການສົນທະນາສົດຄືນໃໝ່ໃນການວາງຊ້ອນເຄື່ອງຫຼິ້ນຖືກສະແດງ + ເຊື່ອງຫົວຂໍ້ວິດີໂອ + ຫົວຂໍ້ວິດີໂອໃນການວາງຊ້ອນເຄື່ອງຫຼິ້ນຖືກເຊື່ອງໄວ້ + ຫົວຂໍ້ວິດີໂອໃນການວາງຊ້ອນເຄື່ອງຫຼິ້ນຖືກສະແດງ + ເຊື່ອງ \'ຄວາມຄືບໜ້າຂອງຫຼັກສູດ\' + ພາກສ່ວນຄວາມຄືບໜ້າຂອງຫຼັກສູດຖືກເຊື່ອງໄວ້ + ພາກສ່ວນຄວາມຄືບໜ້າຂອງຫຼັກສູດຖືກສະແດງ + ເຊື່ອງສຳຫຼວດ + ພາກສ່ວນສຳຫຼວດຫຼັກສູດນີ້ ແລະ ສຳຫຼວດພອດແຄສຖືກເຊື່ອງໄວ້ + ພາກສ່ວນສຳຫຼວດຫຼັກສູດນີ້ ແລະ ສຳຫຼວດພອດແຄສຖືກສະແດງ + ເຊື່ອງ \'ສຳຫຼວດຫຼັກສູດນີ້\' + ພາກສ່ວນສຳຫຼວດຫຼັກສູດນີ້ຖືກເຊື່ອງໄວ້ + ພາກສ່ວນສຳຫຼວດຫຼັກສູດນີ້ຖືກສະແດງ + ເຊື່ອງ \'ສຳຫຼວດພອດແຄສ\' + ພາກສ່ວນສຳຫຼວດພອດແຄສຖືກເຊື່ອງໄວ້ + ພາກສ່ວນສຳຫຼວດພອດແຄສຖືກສະແດງ + ເຊື່ອງ \'ສະຖານທີ່ແນະນຳ\' + ພາກສ່ວນສະຖານທີ່ແນະນຳຖືກເຊື່ອງໄວ້ + ພາກສ່ວນສະຖານທີ່ແນະນຳຖືກສະແດງ + ເປີດນຳໃຊ້ຕົວກອງເມນູຟີດແບບປັອບອັບ + ຕົວກອງເມນູຟີດແບບປັອບອັບຖືກເປີດນຳໃຊ້ + ຕົວກອງເມນູຟີດແບບປັອບອັບຖືກປິດນຳໃຊ້ + ຕົວກອງເມນູຟີດແບບປັອບອັບ + ໃສ່ຊື່ເມນູແບບປັອບອັບເພື່ອໃຊ້ຕົວກອງ, ແຕ່ລະລາຍການຢູ່ແຖວໃໝ່ + ເຊື່ອງເກມ + ພາກສ່ວນເກມຖືກເຊື່ອງໄວ້ + ພາກສ່ວນເກມຖືກສະແດງ + ເຊື່ອງເພງ + ພາກສ່ວນເພງຖືກເຊື່ອງໄວ້ + ພາກສ່ວນເພງຖືກສະແດງ + ເຊື່ອງແບບສອບຖາມ + ພາກສ່ວນແບບສອບຖາມຖືກເຊື່ອງໄວ້ + ພາກສ່ວນແບບສອບຖາມຖືກສະແດງ + ເປີດນຳໃຊ້ຕົວກອງແຖບຊ່ອງ + ຕົວກອງແຖບຊ່ອງຖືກເປີດນຳໃຊ້ + ຕົວກອງແຖບຊ່ອງຖືກປິດນຳໃຊ້ + ຕົວກອງແຖບຊ່ອງ + ໃສ່ຊື່ແຖບຊ່ອງເພື່ອໃຊ້ຕົວກອງ, ແຕ່ລະລາຍການຢູ່ແຖວໃໝ່ + "ຂໍ້ຈຳກັດ: +• ຊັ້ນວາງ Shorts, ໜ້າຊ່ອງ ແລະ ຜົນການຄົ້ນຫາອາດຍັງສະແດງຈຳນວນການເບິ່ງ. +• ຄຸນສົມບັດນີ້ບໍ່ຮອງຮັບກັບຮູບແບບຍານຍົນ." + "ຂໍ້ຈຳກັດ: +• ຊັ້ນວາງ Shorts, ໜ້າຊ່ອງ ແລະ ຜົນການຄົ້ນຫາອາດຍັງສະແດງເວລາອັບໂຫຼດ. +• ຄຸນສົມບັດນີ້ບໍ່ຮອງຮັບກັບຮູບແບບຍານຍົນ." + "ໜ້າຫຼັກ/ການສະໝັກໃຊ້/ຜົນການຄົ້ນຫາຖືກກັ່ນຕອງເພື່ອເຊື່ອງເນື້ອຫາທີ່ກົງກັບຄຳສັບຫຼັກ + +ຂໍ້ຈຳກັດ: +• ບໍ່ສາມາດເຊື່ອງ Shorts ຕາມຊື່ຊ່ອງໄດ້ +• ອົງປະກອບບາງສ່ວນຂອງ UI ອາດຈະບໍ່ຖືກເຊື່ອງ +• ການຄົ້ນຫາດ້ວຍຄຳສັບຫຼັກອາດຈະບໍ່ພົບຜົນ" - + ໂຄສະນາແບບເຕັມຈໍຖືກເຊື່ອງໄວ້ + ເຊື່ອງໂຄສະນາປັອບອັບຂອງເຄື່ອງຫຼິ້ນ + ໂຄສະນາປັອບອັບຂອງເຄື່ອງຫຼິ້ນຖືກເຊື່ອງໄວ້ + ໂຄສະນາປັອບອັບຂອງເຄື່ອງຫຼິ້ນຖືກສະແດງ + ປ້າຍໂຄສະນາເບິ່ງສິນຄ້າໃນການວາງຊ້ອນຂອງເຄື່ອງຫຼິ້ນຖືກເຊື່ອງໄວ້ + ປ້າຍໂຄສະນາເບິ່ງສິນຄ້າໃນການວາງຊ້ອນຂອງເຄື່ອງຫຼິ້ນຖືກສະແດງ + ເຊື່ອງການໂປຣໂມດ YouTube Premium + ການໂປຣໂມດ YouTube Premium ຖືກເຊື່ອງໄວ້ + ການໂປຣໂມດ YouTube Premium ຖືກສະແດງ - - + + ສຳເນົາ URL ໃສ່ຄລິບບອດແລ້ວ + ສຳເນົາ URL ພ້ອມເຄື່ອງໝາຍເວລາແລ້ວ + ສະແດງປຸ່ມສຳເນົາ URL ວິດີໂອ + ປຸ່ມສຳເນົາ URL ວິດີໂອຖືກສະແດງ. ແຕະເພື່ອສຳເນົາ URL ວິດີໂອ. ແຕະຄ້າງໄວ້ເພື່ອສຳເນົາພ້ອມເຄື່ອງໝາຍເວລາ + ປຸ່ມສຳເນົາ URL ວິດີໂອບໍ່ຖືກສະແດງ + ສະແດງປຸ່ມສຳເນົາ URL ເຄື່ອງໝາຍເວລາ + ປຸ່ມສຳເນົາ URL ເຄື່ອງໝາຍເວລາຖືກສະແດງ. ແຕະເພື່ອສຳເນົາ URL ວິດີໂອພ້ອມເຄື່ອງໝາຍເວລາ. ແຕະຄ້າງໄວ້ເພື່ອສຳເນົາໂດຍບໍ່ມີເຄື່ອງໝາຍເວລາ + ປຸ່ມສຳເນົາ URL ເຄື່ອງໝາຍເວລາບໍ່ຖືກສະແດງ + - + + ປິດໃຊ້ງານປັອບອັບ \'ເຂົ້າສູ່ລະບົບໂທລະພາບ\' + ປັອບອັບເຂົ້າສູ່ລະບົບໂທລະພາບຖືກປິດໃຊ້ງານ + ປັອບອັບເຂົ້າສູ່ລະບົບໂທລະພາບຖືກເປີດໃຊ້ງານ + - + + ເປີດໃຊ້ງານແຕະເພື່ອຊອກຫາ + ການແຕະເພື່ອຊອກຫາຖືກເປີດໃຊ້ງານ + ການແຕະເພື່ອຊອກຫາຖືກປິດໃຊ້ງານ + @@ -89,25 +213,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + ການເຊື່ອງອາດຈະບໍ່ໄດ້ຜົນສຳລັບບາງບັນຊີຜູ້ໃຊ້. - + + ປຸ່ມນຳທາງ + ເຊື່ອງ ຫຼື ປ່ຽນປຸ່ມແຖບນຳທາງ + ເຊື່ອງໜ້າຫຼັກ + ປຸ່ມໜ້າຫຼັກຖືກເຊື່ອງໄວ້ + ປຸ່ມໜ້າຫຼັກຖືກສະແດງ + ເຊື່ອງ Shorts + ປຸ່ມ Shorts ຖືກເຊື່ອງໄວ້ + ປຸ່ມ Shorts ຖືກສະແດງ + ເຊື່ອງສ້າງ + ປຸ່ມສ້າງຖືກເຊື່ອງໄວ້ + ປຸ່ມສ້າງຖືກສະແດງ + ເຊື່ອງການສະໝັກໃຊ້ + ປຸ່ມການສະໝັກໃຊ້ຖືກເຊື່ອງໄວ້ + ປຸ່ມການສະໝັກໃຊ້ຖືກສະແດງ + ເຊື່ອງການແຈ້ງເຕືອນ + ປຸ່ມການແຈ້ງເຕືອນຖືກເຊື່ອງໄວ້ + ປຸ່ມການແຈ້ງເຕືອນຖືກສະແດງ + ສັບປ່ຽນສ້າງກັບການແຈ້ງເຕືອນ + ປຸ່ມສ້າງຖືກສັບປ່ຽນກັບປຸ່ມການແຈ້ງເຕືອນ + ປຸ່ມສ້າງບໍ່ຖືກສັບປ່ຽນກັບປຸ່ມການແຈ້ງເຕືອນ + ຖ້າການປ່ຽນແປງການຕັ້ງຄ່ານີ້ບໍ່ມີຜົນ, ໃຫ້ລອງປ່ຽນເປັນໂໝດບໍ່ລະບຸຕົວຕົນ. + ເຊື່ອງປ້າຍກຳກັບປຸ່ມນຳທາງ + ປ້າຍກຳກັບຖືກເຊື່ອງໄວ້ + ປ້າຍກຳກັບຖືກສະແດງ + ເປີດໃຊ້ງານປຸ່ມນຳທາງແບບແຄບ + ໄລຍະຫ່າງລະຫວ່າງປຸ່ມນຳທາງແມ່ນແຄບ + ໄລຍະຫ່າງລະຫວ່າງປຸ່ມນຳທາງແມ່ນປົກກະຕິ + ເປີດໃຊ້ງານອະນິເມຊັນແຖບນຳທາງ + ການປ່ຽນຜ່ານການນຳທາງຖືກເຮັດໃຫ້ມີອະນິເມຊັນ + ການປ່ຽນຜ່ານການນຳທາງບໍ່ມີອະນິເມຊັນ + ປິດໃຊ້ງານແຖບສະຖານະແບບໂປ່ງໃສ + ແຖບສະຖານະແມ່ນແນ່ນອນ + ແຖບສະຖານະແມ່ນແນ່ນອນ ຫຼື ໂປ່ງໃສ + "ຂໍ້ຈຳກັດ: +• ແຖບສີດຳອາດຈະປາກົດຢູ່ເທິງສຸດຂອງເຄື່ອງຫຼິ້ນວິດີໂອ. +• ໃນບາງອຸປະກອນ, ການເປີດໃຊ້ງານຄຸນສົມບັດນີ້ສາມາດປ່ຽນແຖບນຳທາງລະບົບໃຫ້ເປັນແບບໂປ່ງໃສ." + ປິດໃຊ້ງານແຖບໂປ່ງໃສແບບສະຫວ່າງ + ແຖບນຳທາງໂໝດສະຫວ່າງແມ່ນແນ່ນອນ + ແຖບນຳທາງໂໝດສະຫວ່າງແມ່ນແນ່ນອນ ຫຼື ໂປ່ງໃສ + ປິດໃຊ້ງານແຖບໂປ່ງໃສແບບມືດ + ແຖບນຳທາງໂໝດມືດແມ່ນແນ່ນອນ + ແຖບນຳທາງໂໝດມືດແມ່ນແນ່ນອນ ຫຼື ໂປ່ງໃສ + ແຖບເຄື່ອງມື + ເຊື່ອງ ຫຼື ປ່ຽນອົງປະກອບຂອງແຖບເຄື່ອງມື + ເຊື່ອງປຸ່ມສ້າງ + ປຸ່ມສ້າງຖືກເຊື່ອງໄວ້ + ປຸ່ມສ້າງຖືກສະແດງ + ເຊື່ອງປຸ່ມການແຈ້ງເຕືອນ + ປຸ່ມການແຈ້ງເຕືອນຖືກເຊື່ອງໄວ້ + ປຸ່ມການແຈ້ງເຕືອນຖືກສະແດງ + ເຊື່ອງປຸ່ມຄົ້ນຫາ + ປຸ່ມຄົ້ນຫາຖືກເຊື່ອງໄວ້ + ປຸ່ມຄົ້ນຫາຖືກສະແດງ. + ເປີດໃຊ້ແຖບຄົ້ນຫາແບບກວ້າງ + ແຖບຄົ້ນຫາແບບກວ້າງຖືກເປີດໃຊ້ງານ + ແຖບຄົ້ນຫາແບບກວ້າງຖືກປິດໃຊ້ງານ @@ -126,25 +307,67 @@ Second \"item\" text" + ເຊື່ອງປຸ່ມຫຍໍ້ລົງ + ປຸ່ມຫຍໍ້ລົງຖືກເຊື່ອງໄວ້ + ປຸ່ມຫຍໍ້ລົງຖືກສະແດງ + ເຊື່ອງປຸ່ມເຕັມຈໍ + ປຸ່ມເຕັມຈໍຖືກເຊື່ອງໄວ້ + ປຸ່ມເຕັມຈໍຖືກສະແດງ + + + ເຊື່ອງບັດຈໍສິ້ນສຸດ + ບັດຈໍສິ້ນສຸດຖືກເຊື່ອງໄວ້ + ບັດຈໍສິ້ນສຸດຖືກສະແດງ - + ເປີດໃຊ້ງານແຖບຊອກຫາຂະໜາດໃຫຍ່ແບບເຕັມຈໍ + ແຖບຊອກຫາເຕັມຈໍມີຂະໜາດໃຫຍ່ + ແຖບຊອກຫາເຕັມຈໍມີຂະໜາດປົກກະຕິ + ເຊື່ອງ Shorts ໃນໜ້າຊ່ອງ + ເຊື່ອງໄວ້ໃນໜ້າຊ່ອງ + ສະແດງໃນໜ້າຊ່ອງ + ເຊື່ອງ Shorts ໃນຄຳອະທິບາຍວິດີໂອ + ເຊື່ອງໄວ້ໃນຄຳອະທິບາຍວິດີໂອ + ສະແດງໃນຄຳອະທິບາຍວິດີໂອ + ເຊື່ອງປຸ່ມ AI + ປຸ່ມ AI ຖືກເຊື່ອງໄວ້ + ປຸ່ມ AI ຖືກສະແດງ + ເຊື່ອງປ້າຍກຳກັບ \'ພາກສຽງອັດຕະໂນມັດ\' + ປ້າຍກຳກັບພາກສຽງອັດຕະໂນມັດຖືກເຊື່ອງໄວ້ + ປ້າຍກຳກັບພາກສຽງອັດຕະໂນມັດຖືກສະແດງ + - + + ເຊື່ອງການສະແດງຕົວຢ່າງແບບຫຼິ້ນອັດຕະໂນມັດ + ການສະແດງຕົວຢ່າງແບບຫຼິ້ນອັດຕະໂນມັດຖືກເຊື່ອງໄວ້ + ການສະແດງຕົວຢ່າງແບບຫຼິ້ນອັດຕະໂນມັດຖືກສະແດງ + + + ເຊື່ອງວິດີໂອທີ່ແນະນຳໃນຈໍສິ້ນສຸດ + "ວິດີໂອທີ່ແນະນຳໃນຈໍສິ້ນສຸດຖືກເຊື່ອງໄວ້ເມື່ອການຫຼິ້ນອັດຕະໂນມັດຖືກປິດ + +ສາມາດປ່ຽນການຫຼິ້ນອັດຕະໂນມັດໄດ້ໃນການຕັ້ງຄ່າ YouTube: +ການຕັ້ງຄ່າ → ການຫຼິ້ນ → ຫຼິ້ນວິດີໂອຕໍ່ໄປອັດຕະໂນມັດ" + ວິດີໂອທີ່ແນະນຳໃນຈໍສິ້ນສຸດຖືກສະແດງ + - + + ເຊື່ອງແຜງປ໊ອບອັບເຄື່ອງຫຼິ້ນ + ແຜງປ໊ອບອັບເຄື່ອງຫຼິ້ນຖືກເຊື່ອງໄວ້ + ແຜງປ໊ອບອັບເຄື່ອງຫຼິ້ນຖືກສະແດງ + @@ -155,10 +378,12 @@ Second \"item\" text" - - + ໃຊ້ໄດ້ສະເພາະກັບວິດີໂອເພງເທົ່ານັ້ນ. ພາກສ່ວນຂອງວິດີໂອເພງທີ່ບໍ່ມີດົນຕີ, ເຊິ່ງຍັງບໍ່ໄດ້ຖືກຄອບຄຸມໂດຍໝວດໝູ່ນັ້ນ + ບໍ່ສາມາດສົ່ງສ່ວນ: %s + "ບໍ່ສາມາດສົ່ງສ່ວນ. +ມີຢູ່ແລ້ວ" @@ -170,7 +395,11 @@ Second \"item\" text" - + + ປິດໃຊ້ງານ + ສີ + ສີດຳ ແລະ ສີຂາວ + @@ -187,7 +416,11 @@ Second \"item\" text" - + + ປິດໃຊ້ງານການສັ່ນສະເທືອນເມື່ອແຕະຄ້າງໄວ້ + ການສັ່ນສະເທືອນເມື່ອແຕະຄ້າງໄວ້ຖືກປິດໃຊ້ງານ + ການສັ່ນສະເທືອນເມື່ອແຕະຄ້າງໄວ້ຖືກເປີດໃຊ້ງານ + @@ -200,6 +433,11 @@ Second \"item\" text" + + ເຊື່ອງຕົວເລືອກຄຸນນະພາບພຣີມຽມ + ຕົວເລືອກຄຸນນະພາບພຣີມຽມຖືກເຊື່ອງໄວ້ + ຕົວເລືອກຄຸນນະພາບພຣີມຽມຖືກສະແດງ + @@ -207,7 +445,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 526f1ab5ff..a9f1696a63 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Rodyti nustatymų paieškos istoriją Nustatymų paieškos istorija rodoma Nustatymų paieškos istorija nerodoma + Išjungti paryškintas piktogramas + Piktogramos nėra paryškintos + Piktogramos yra paryškintos Rodyti „ReVanced“ nustatymų piktogramas Nustatymų piktogramos yra rodomos Nenurodomos nustatymų piktogramos @@ -99,23 +102,31 @@ Norėdami išversti naujas kalbas arba patobulinti esamus vertimus, apsilankykit and changes made here must also be made there. --> - „GmsCore“ nustatymai - „GmsCore“ nustatymai + GmsCore + „GmsCore“ nustatymai + Tikrinti, ar yra „GmsCore“ naujinimų + Naujinimų tikrinimas įjungtas + Atnaujinimų tikrinimas išjungtas + Atidaryti „GmsCore“ nustatymus + „GmsCore“ nustatymai - MicroG GmsCore nėra įdiegta. Įdiekite. - Reikalingas veiksmas - "„MicroG GmsCore“ neturi leidimo veikti fone. + MicroG GmsCore nėra įdiegta. Įdiekite. + Reikalingas veiksmas + Nepavyko patikrinti „MicroG GmsCore“ atnaujinimų + Yra nauja „MicroG GmsCore“ (%1$s) versija. Šiuo metu naudojate %2$s versiją. + "„MicroG GmsCore“ neturi leidimo veikti fone. Sekite savo telefonui skirtą vadovą „Don’t kill my app“ ir pritaikykite nurodymus savo „MicroG“ diegimui. Tai būtina, kad programa veiktų." - Atidaryti svetainę - "Kad nekiltų problemų, „MicroG GmsCore“ akumuliatoriaus optimizavimas turi būti išjungtas. + Atidaryti svetainę + Atšaukti + "Kad nekiltų problemų, „MicroG GmsCore“ akumuliatoriaus optimizavimas turi būti išjungtas. Išjungus „MicroG“ akumuliatoriaus optimizavimą, akumuliatoriaus naudojimas nebus neigiamai paveiktas. Palieskite mygtuką Tęsti ir leiskite optimizavimo pakeitimus." - Tęsti + Tęsti Klastoti vaizdo srautus @@ -169,10 +180,11 @@ Apie netikėtus įvykius nebus pranešta." Vėliavėlės išsaugotos Vėliavėlės nustatytos iš naujo Vėliavėlės nukopijuotos į iškarpinę - Žurnalų protokolo buferis - Debugavimo žurnalai apima protokolo buferį - Debugavimo žurnalai neapima protokolo buferio - "Įjungus šį nustatymą bus registruojami papildomi išdėstymo duomenys, įskaitant ekrane rodomą tekstą kai kuriems vartotojo sąsajos komponentams. + Perkraukite programėlę, kad naudotumėte šią funkciją + Žurnalų protokolo buferis + Debugavimo žurnalai apima protokolo buferį + Debugavimo žurnalai neapima protokolo buferio + "Įjungus šį nustatymą bus registruojami papildomi išdėstymo duomenys, įskaitant ekrane rodomą tekstą kai kuriems vartotojo sąsajos komponentams. Tai gali padėti identifikuoti komponentus kuriant pasirinktinius filtrus. @@ -220,6 +232,9 @@ Tačiau įjungus šį nustatymą taip pat bus registruojami kai kurie vartotojo \"Shorts\" foninis atkūrimas yra įjungtas + Slėpti kūrėjo parduotuvės lentyną + Kūrėjų parduotuvės lentyna po vaizdo grotuvu yra paslėpta + Kūrėjų parduotuvės lentyna po vaizdo įrašo grotuvu rodoma Slėpti albumo korteles Albumo kortelės yra paslėptos Albumo kortelės yra rodomos @@ -229,6 +244,9 @@ Tačiau įjungus šį nustatymą taip pat bus registruojami kai kurie vartotojo Slėpti lustų lentyną Lustų lenta yra paslėpta Lustų lenta yra rodoma + Slėpti komentarų skyrių po vaizdo įrašais pagrindiniame sraute + Komentarų skyrius po vaizdo įrašais pagrindiniame sraute yra paslėptas + Komentarų skyrius po vaizdo įrašais pagrindiniame sraute yra rodomas Slėpti bendruomenės įrašus Bendruomenės įrašai yra paslėpti Bendruomenės įrašai yra rodomi @@ -256,14 +274,19 @@ Tačiau įjungus šį nustatymą taip pat bus registruojami kai kurie vartotojo Slėpti naujausius įrašus Naujausi įrašai yra paslėpti Naujausi įrašai yra rodomi + + Slėpti mygtuką „Naujausi vaizdo įrašai“ + Mygtukas „Naujausi vaizdo įrašai“ yra paslėptas + Mygtukas „Naujausi vaizdo įrašai“ yra rodomas Slėpti mišrius grojaraščius Mišrūs grojaraščiai yra paslėpti Mišrūs grojaraščiai yra rodomi Slėpti filmų skyrių Filmų skyrius yra paslėptas Filmų skyrius yra rodomas - + Slėpti mygtuką \"Pranešti man\" Pranešti mygtukas yra paslėptas Pranešti mygtukas yra rodomas @@ -288,13 +311,16 @@ Tačiau įjungus šį nustatymą taip pat bus registruojami kai kurie vartotojo Slėpti vizualinį tarpiklį Vizualinis tarpiklis paslėptas Vizualinis tarpiklis rodomas + Slėpti žiniatinklio paieškos rezultatus + Žiniatinklio paieškos rezultatai yra paslėpti + Žiniatinklio paieškos rezultatai yra rodomi + Slėpti skyrių „Jums gali patikti“ + Skyrius „Jums gali patikti“ yra paslėptas + Skyrius „Jums gali patikti“ yra rodomas Slėpti YouTube Doodles YouTube Doodles animacija ant logotipo yra paslėpta YouTube Doodles animacija ant logotipo rodoma - "YouTube „Doodles“ rodomi kelias dienas per metus. - -Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas yra įjungtas, tada filtro juosta po paieškos juosta taip pat bus paslėpta." Slėpti kanalo juostą Kanalo juosta yra paslėpta Kanalo juosta yra rodoma @@ -311,10 +337,15 @@ Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas Informacijos plokštės yra paslėptos Informacijos plokštės yra rodomos + This button usually appears in the video player for certain videos. --> Slėpti prisijungimo mygtuką Prisijungimo mygtukas yra paslėptas Prisijungimo mygtukas yra rodomas + + Slėpti mygtuką „Tiesioginio pokalbio kartojimas“ + Mygtukas „Tiesioginio pokalbio kartojimas“ grotuvo perdangoje yra paslėptas + Mygtukas „Tiesioginio pokalbio kartojimas“ grotuvo perdangoje yra rodomas Slėpti medicinos plokštes Medicinos plokštės yra paslėptos Medicinos plokštės yra rodomos @@ -330,6 +361,9 @@ Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas Slėpti laiku įvykusias reakcijas Laiku įvykusios reakcijos yra paslėptos Laiku įvykusios reakcijos yra rodomos + Slėpti vaizdo įrašo pavadinimą + Vaizdo įrašo pavadinimas grotuvo perdangoje yra paslėptas + Vaizdo įrašo pavadinimas grotuvo perdangoje yra rodomas Slėpti „AI sukurtos vaizdo įrašo santraukos“ Dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius paslėptas Rodomas dirbtinio intelekto sugeneruotos vaizdo įrašo santraukos skyrius @@ -342,33 +376,62 @@ Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas Slėpti skyrius Skyrius \"Skyriai\" yra paslėptas Skyrius \"Skyriai\" yra rodomas - Slėpti „Kaip buvo sukurtas šis turinys“ - Skyrius „Kaip buvo sukurtas šis turinys“ yra paslėptas - Skyrius „Kaip buvo sukurtas šis turinys“ yra rodomas - Slėpti „Hype“ taškus - „Hype“ taškai paslėpti - „Hype“ taškai rodomi + Slėpti „Kurso eigą“ + Kurso eigos skyrius yra paslėptas + Kurso eigos skyrius yra rodomas + Slėpti Naršyti + Skyriai „Naršyti šį kursą“ ir „Naršyti podcast\'ą“ yra paslėpti + Skyriai „Naršyti šį kursą“ ir „Naršyti podcast\'ą“ yra rodomi + Slėpti „Naršyti šį kursą“ + Skyrius „Naršyti šį kursą“ yra paslėptas + Skyrius „Naršyti šį kursą“ yra rodomas + Slėpti „Naršyti podcast\'ą“ + Skyrius „Naršyti podcast\'ą“ yra paslėptas + Skyrius „Naršyti podcast\'ą“ yra rodomas Slėpti „Naršyti podcast\'ą“ Skyrius „Naršyti podcast\'ą“ yra paslėptas Skyrius „Naršyti podcast\'ą“ yra rodomas Slėpti rekomenduojamas nuorodas Pasiūlytų nuorodų skiltis paslėpta Pasiūlytų nuorodų skiltis rodoma + Slėpti „Pasiūlytas vietas“ + Pasiūlytų vietų skyrius yra paslėptas + Pasiūlytų vietų skyrius yra rodomas Slėpti pasiūlytus vaizdo įrašus Pasiūlytų vaizdo įrašų skiltis paslėpta Pasiūlytų vaizdo įrašų skiltis rodoma + Įjungti srauto išskleidžiamojo meniu filtrą + Srauto išskleidžiamojo meniu filtras yra įjungtas + Srauto išskleidžiamojo meniu filtras yra išjungtas + Srauto išskleidžiamojo meniu filtras + Įveskite išskleidžiamojo meniu pavadinimus, pagal kuriuos filtruoti, po vieną eilutėje + Slėpti Žaidimus + Žaidimų skyrius yra paslėptas + Žaidimų skyrius yra rodomas + Slėpti „Kaip buvo sukurtas šis turinys“ + Skyrius „Kaip buvo sukurtas šis turinys“ yra paslėptas + Skyrius „Kaip buvo sukurtas šis turinys“ yra rodomas + Slėpti „Hype“ taškus + „Hype“ taškai paslėpti + „Hype“ taškai rodomi Slėpti informacines korteles Informacijos kortelių skyrius yra paslėptas Informacijos kortelių skyrius yra rodomas Slėpti „Pagrindines sąvokas“ Skyrius „Pagrindinės sąvokos“ yra paslėptas Skyrius „Pagrindinės sąvokos“ yra rodomas + Slėpti Muziką + Muzikos skyrius yra paslėptas + Muzikos skyrius yra rodomas Slėpti prenumeratos mygtuką Prenumeratos mygtukas paslėptas Prenumeratos mygtukas rodomas Slėpti transkripciją Transkripcijos skyrius yra paslėptas Transkripcijos skyrius yra rodomas + Slėpti Viktorinas + Viktorinų skyrius yra paslėptas + Viktorinų skyrius yra rodomas Vaizdo įrašo aprašymas Slėpti arba rodyti vaizdo įrašo aprašymo komponentus Filtravimo juosta @@ -387,6 +450,11 @@ Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas Rodoma žiūrėjimo istorijoje Kanalo puslapis Slėpti arba rodyti kanalo puslapio komponentus + Įjungti kanalo skirtuko filtrą + Kanalo skirtuko filtras yra įjungtas + Kanalo skirtuko filtras yra išjungtas + Kanalo skirtuko filtras + Įveskite kanalo skirtukų pavadinimus, pagal kuriuos filtruoti, po vieną eilutėje Slėpti bendruomenės mygtuką Bendruomenės mygtukas paslėptas @@ -450,15 +518,15 @@ Jei „Doodle“ šiuo metu rodomas jūsu regione ir šis paslėpimo nustatymas Peržiūrų skaičius rodomas kanale ir paieškos rezultatuose "Apribojimai: -• Shorts lentynos, kanalų puslapiai ir paieškos rezultatai vis tiek gali rodyti peržiūrų skaičių -• Ši funkcija neveikia su automobiline formos išraiška" +• Shorts lentynos, kanalų puslapiai ir paieškos rezultatai vis tiek gali rodyti peržiūrų skaičių. +• Ši funkcija neveikia su automobiline formos išraiška." Slėpti įkėlimo laiką Įkėlimo laikas paslėptas sraute ir paieškos rezultatuose Įkėlimo laikas rodomas sraute ir paieškos rezultatuose "Apribojimai: -• „Shorts“ lentynose, kanalų puslapiuose ir paieškos rezultatuose vis dar gali būti rodomi įkėlimo laikai -• Ši funkcija neveikia su automobilių formos faktoriumi" +• Shorts lentynose, kanalų puslapiuose ir paieškos rezultatuose vis dar gali būti rodomi įkėlimo laikai. +• Ši funkcija neveikia su automobilių formos faktoriumi." Slėpti raktinių žodžių turinį Slėpti paieškos ir sklaidos srauto vaizdo įrašus naudojant raktinių žodžių filtrus Slėpti namų vaizdo įrašus pagal raktinius žodžius @@ -481,7 +549,7 @@ Raktažodžiai gali būti kanalų pavadinimai arba bet koks tekstas, rodomas vai Apie raktinių žodžių filtravimą "„Pagrindinis“ / „Prenumeratos“ / „Paieška“ rezultatai filtruojami, kad būtų paslėptas turinys, atitinkantis raktinių frazių sąrašą. -Apribojimai +Apribojimai: • Shorts negali būti paslėpti pagal kanalo pavadinimą • Kai kurie vartotojo sąsajos komponentai gali būti nepaslėpti • Ieškant raktinio žodžio, gali nebūti rezultatų" @@ -496,19 +564,12 @@ Apribojimai Raktiniu žodžiu bus paslėpti visi vaizdo įrašai: %s - Slėpti kūrėjo parduotuvės lentyną - Kūrėjų parduotuvės lentyna po vaizdo grotuvu yra paslėpta - Kūrėjų parduotuvės lentyna po vaizdo įrašo grotuvu rodoma Paslˁpti pabaigos ekrano parduotuvÄ—s reklaminį juostelÄ™ Pabaigos ekrano parduotuvės reklaminis skydelis yra paslėptas Pabaigos ekrano parduotuvės reklaminis skydelis yra rodomas Slėpti viso ekrano reklamas - "Pilno ekrano reklamos paslėptos - -Ši funkcija yra prieinama tik senesniuose įrenginiuose" + Viso ekrano reklamos yra paslėptos Viso ekrano reklamos yra rodomos - - Slėpti viso ekrano reklamas veikia tik senesniuose įrenginiuose Slėpti bendras reklamas Bendros reklamos yra paslėptos Bendros reklamos yra rodomos @@ -518,6 +579,9 @@ Apribojimai Slėpti apmokėtos reklamos etiketę Apmokėtos reklamos etiketė yra paslėpta Apmokėtos reklamos etiketė yra rodoma + Slėpti grotuvo iššokančius skelbimus + Grotuvo iššokantys skelbimai yra paslėpti + Grotuvo iššokantys skelbimai yra rodomi Slėpti savarankiškus rėmėjų kortelės Savarankiški rėmėjų kortelės yra paslėpti Savarankiški rėmėjų kortelės yra rodomi @@ -525,29 +589,24 @@ Apribojimai Apsipirkimo nuorodos vaizdo įrašo aprašyme yra paslėptos Apsipirkimo nuorodos vaizdo įrašo aprašyme rodomos Slėpti reklamjuostę „Žiūrėti produktus“ - Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra paslėptas - Peržiūrėti produktus reklaminis skydelis vaizdo įrašo perdangoje yra rodomas - Slėpti žiniatinklio paieškos rezultatus - Žiniatinklio paieškos rezultatai yra paslėpti - Žiniatinklio paieškos rezultatai yra rodomi - - - Slėpti YouTube Premium reklamą - YouTube Premium reklama po vaizdo įrašo grotuvu yra paslėpta - YouTube Premium reklama po vaizdo įrašo grotuvu yra rodoma + Peržiūrėti produktus reklaminis skydelis grotuvo perdangoje yra paslėptas + Peržiūrėti produktus reklaminis skydelis grotuvo perdangoje yra rodomas + Slėpti YouTube Premium reklamą + YouTube Premium reklama yra paslėpta + YouTube Premium reklama yra rodoma Slėpti vaizdo įrašų reklamas Vaizdo įrašų reklamos yra paslėptos Vaizdo įrašų reklamos yra rodomos - + URL nukopijuotas į iškarpinę URL su laiko žyma nukopijuotas Rodyti kopijuoti vaizdo įrašo URL mygtuką Vaizdo įrašo nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą. Bakstelėkite ir palaikykite norėdami nukopijuoti su laiko žyma Vaizdo įrašo nuorodos kopijavimo mygtukas nerodomas - Rodyti mygtuką kopijuoti laikrodžio URL + Rodyti mygtuką kopijuoti laiko žymos URL Laiko žymos nuorodos kopijavimo mygtukas rodomas. Bakstelėkite norėdami nukopijuoti vaizdo įrašo nuorodą su laiko žyma. Bakstelėkite ir palaikykite norėdami nukopijuoti be laiko žymos Laiko žymos nuorodos kopijavimo mygtukas nerodomas @@ -557,10 +616,10 @@ Apribojimai Dialogas bus rodomas Tai neaplenkia amžiaus apribojimo. Jis tiesiog jį automatiškai priima. - - Išjungti „Prisijungti prie TV“ iššokantįjį langą - Prisijungimo prie TV iškylantysis langas išjungtas - Prisijungimo prie TV iškylantysis langas įjungtas + + Išjungti „Prisijungti prie TV“ iššokantįjį langą + Prisijungimo prie TV iškylantysis langas išjungtas + Prisijungimo prie TV iškylantysis langas įjungtas Išjungti dvigubo bakstelėjimo skyriaus praleidimą @@ -593,10 +652,10 @@ Patikrinkite, ar paketo pavadinimas yra teisingas ir programa įdiegta" Gestas išjungtas Gestas įjungtas - - Įgalinti palietimą, kad būtų galima ieškoti - Bakstelėkite, kad įgalintumėte paiešką - Palietimas, kad būtų galima ieškoti, yra išjungtas + + Įgalinti palietimą, kad būtų galima ieškoti + Bakstelėkite, kad įgalintumėte paiešką + Palietimas, kad būtų galima ieškoti, yra išjungtas Įjungti ryškumo gestą @@ -677,7 +736,7 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Komentarų mygtukas paslėptas Komentarų mygtukas rodomas + This button usually appears on live streamed videos. --> Slėpti Pranešti Pranešimo mygtukas paslėptas Pranešimo mygtukas rodomas @@ -690,7 +749,7 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Atsisiuntimo mygtukas paslėptas Atsisiuntimo mygtukas rodomas + This button usually appears on videos uploaded by the logged-in user. --> Slėpti Ažiotažą „Hype“ mygtukas paslėptas Haipo mygtukas rodomas @@ -703,7 +762,7 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Ačiū mygtukas paslėptas Ačiū mygtukas rodomas + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Slėpti klausimą Klausimo mygtukas yra paslėptas Klausimo mygtukas rodomas @@ -711,6 +770,7 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Slėpti Iškarpą Iškarpos mygtukas paslėptas Iškarpos mygtukas rodomas + Slėpimas gali neveikti kai kurioms naudotojų paskyroms. Slėpti parduotuvę Parduotuvės mygtukas paslėptas @@ -720,13 +780,13 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Išsaugojimo mygtukas paslėptas Išsaugojimo mygtukas rodomas - + Navigacijos mygtukai - Slėpti arba keisti mygtukus navigacijos juostoje + Slėpti arba keisti naršymo juostos mygtukus - Slėpti Pagrindinis - Pagrindinio mygtukas paslėptas - Pagrindinio mygtukas rodomas + Slėpti Pagrindinį + Mygtukas „Pagrindinis“ yra paslėptas + Mygtukas „Pagrindinis“ yra rodomas Slėpti Shorts Shorts mygtukas paslėptas @@ -736,7 +796,7 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Kurti mygtukas paslėptas Kurti mygtukas rodomas - Slėpti Prenumeratos + Slėpti Prenumeratas Prenumeratų mygtukas paslėptas Prenumeratų mygtukas rodomas Slėpti pranešimus @@ -744,26 +804,44 @@ Reguliuokite garsumą braukdami vertikaliai dešinėje ekrano pusėje" Pranešimų mygtukas rodomas Pakeisti Kurti su Pranešimais - "„Sukurti“ mygtukas pakeistas į „Pranešimai“ mygtuką - -Pastaba: įjungus šį nustatymą, vaizdo įrašų reklamos taip pat yra priverstinai paslėptos" - Sukurti mygtukas nėra pakeistas Pranešimų mygtuku - "Išjungus šį nustatymą, bus išjungtas ir „Shorts“ skelbimų blokavimas. - -Jei pakeitus šį nustatymą neįsigalioja, pabandykite perjungti į inkognito režimą." + Kurti mygtukas yra pakeistas Pranešimų mygtuku + Kurti mygtukas nėra pakeistas Pranešimų mygtuku + Jei pakeitus šį nustatymą nepasireiškia poveikis, pabandykite persijungti į inkognito režimą. Slėpti naršymo mygtukų etiketes Etiketės yra paslėptos Etiketės yra rodomos + Įjungti siaurus naršymo mygtukus + Tarpas tarp naršymo mygtukų yra siauras + Tarpas tarp naršymo mygtukų yra normalus + Įjungti naršymo juostos animacijas + Naršymo perėjimai yra animuoti + Naršymo perėjimai nėra animuoti Išjungti permatomą būsenos juostą - Bžas statuso juosta nepermatoma - Bžas statuso juosta yra nepermatoma arba permatoma - Kai kuriuose įrenginiuose, įgalinus šią funkciją, sistemos naršymo juosta gali tapti permatoma. + Būsenos juosta nepermatoma + Būsenos juosta yra nepermatoma arba permatoma + "Apribojimai: +• Vaizdo grotuvo viršuje gali atsirasti juoda juosta. +• Kai kuriuose įrenginiuose įjungus šią funkciją, sistemos naršymo juosta gali tapti permatoma." Išjungti permatomą šviesią naršymo juostą Šviesios spalvos naršymo juosta yra nepermatoma - Šviesiosios temos narūybos juosta yra nepermatoma arba permatoma - Išjunkite tamsios temos permatomą narūybos juostą + Šviesiosios temos naršymo juosta yra nepermatoma arba permatoma + Išjungti tamsios temos permatomą naršymo juostą Tamsios spalvos naršymo juosta yra nepermatoma - Tamsios temos narūybos juosta yra nepermatoma arba permatoma + Tamsios temos naršymo juosta yra nepermatoma arba permatoma + Įrankių juosta + Slėpti arba keisti įrankių juostos komponentus + Slėpti mygtuką „Kurti“ + Mygtukas „Kurti“ yra paslėptas + Mygtukas „Kurti“ yra rodomas + Slėpti mygtuką „Pranešimai“ + Pranešimų mygtukas yra paslėptas + Pranešimų mygtukas rodomas + Slėpti paieškos mygtuką + Paieškos mygtukas paslėptas + Paieškos mygtukas rodomas. + Įjungti plačią paieškos juostą + Plačioji paieškos juosta įjungta + Plačioji paieškos juosta išjungta Išskleidžiamasis meniu @@ -838,6 +916,12 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Paslėpti mygtuką \"Transliuoti\" Transliacijos mygtukas yra paslėptas Transliacijos mygtukas yra rodomas + Slėpti mygtuką „Sutraukti“ + Mygtukas „Sutraukti“ yra paslėptas + Mygtukas „Sutraukti“ yra rodomas + Slėpti mygtuką „Visas ekranas“ + Mygtukas „Visas ekranas“ yra paslėptas + Mygtukas „Visas ekranas“ yra rodomas Slėpti grotuvo valdiklių foną Grotojo valdiklių fonas paslėptas Rodomas grotuvo valdiklių fonas @@ -846,9 +930,9 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Mygtukai yra rodomi - Slėpti ekrano pabaigos korteles - Ekrano pabaigos kortelės yra paslėptos - Ekrano pabaigos kortelės yra rodomos + Slėpti ekrano pabaigos korteles + Ekrano pabaigos kortelės yra paslėptos + Ekrano pabaigos kortelės yra rodomos Išjungti aplinkos režimą visame ekrane @@ -873,10 +957,16 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Slėpti vaizdo įrašo miniatiūrų paieškos juostą Vaizdo įrašo miniatiūrų paieškos juosta paslėpta Vaizdo įrašo miniatiūrų paieškos juosta rodoma + Įjungti viso ekrano didelę ieškojimo juostą + Viso ekrano ieškojimo juosta yra didelio dydžio + Viso ekrano ieškojimo juosta yra normalaus dydžio Shorts grotuvas Slėpti arba rodyti Shorts grotuvo komponentus + Slėpti Shorts kanalo puslapyje + Paslėpta kanalo puslapyje + Rodyti kanalo puslapyje Slėpti Shorts pagrindiniame sraute Paslėpta pagrindiniame sraute ir susijusiuose vaizdo įrašuose @@ -888,9 +978,18 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Slėpti Shorts prenumeratų sraute Paslėpta prenumeratų sraute Rodoma prenumeratų sraute + Slėpti Shorts vaizdo įrašo aprašyme + Paslėpta vaizdo įrašo aprašyme + Rodyti vaizdo įrašo aprašyme Slėpti šortus žiūrėjimo istorijoje Paslėpta žiūrėjimo istorijoje Rodoma žiūrėjimo istorijoje + Slėpti AI mygtuką + AI mygtukas yra paslėptas + AI mygtukas yra rodomas + Slėpti „Automatiškai įgarsinta“ etiketę + Automatiškai dubliuota žymė paslėpta + Automatiškai dubliuota žymė rodoma Slėpti „Automatiškai įgarsinta“ etiketę Automatiškai dubliuota žymė paslėpta Automatiškai dubliuota žymė rodoma @@ -952,6 +1051,7 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Slėpti mygtuką „Naudoti šį šabloną“ Mygtukas „Naudoti šį šabloną“ paslėptas Rodomas mygtukas „Naudoti šį šabloną“ + Paslėpti mygtuko „Patinka“ fontaną \"Patinka\" mygtuko fontano animacija paslėpta \"Patinka\" mygtuko fontano animacija rodoma @@ -994,7 +1094,12 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Spoof video streams“ į Naršymo juosta paslėpta Naršymo juosta rodoma - + + Slėpti automatinio paleidimo peržiūrą + Automatinio paleidimo peržiūra yra paslėpta + Automatinio paleidimo peržiūra yra rodoma + + Slėpti pabaigos ekrano siūlomą vaizdo įrašą "Pabaigos ekrane siūlomas vaizdo įrašas yra paslėptas, kai automatinis paleidimas yra išjungtas. @@ -1013,9 +1118,9 @@ Nustatymai → Atkūrimas → Automatiškai leisti kitą vaizdo įrašą"Laiko žymė rodoma - Slėpti grotuvo iššokančius skydelius - Grotuvo iššokančius skydelius paslėpti - Grotuvo iššokančius skydelius rodyti + Slėpti grotuvo iššokančius skydelius + Grotuvo iššokančius skydelius paslėpti + Grotuvo iššokančius skydelius rodyti Išeiti iš viso ekrano režimo pasibaigus vaizdo įrašui @@ -1083,24 +1188,6 @@ Apribojimas: nepritarimai gali būti nerodomi inkognito režimu" Kliento normos ribojimas įvyko %d kartus %d milisekundžių - - Įjungti plačią paieškos juostą - Plačioji paieškos juosta įjungta - Plačioji paieškos juosta išjungta - - - Įjungti aukštos kokybės miniatiūras - Paieškos juostos miniatiūros yra aukštos kokybės - Paieškos juostos miniatiūros yra vidutinės kokybės - "Tai taip pat atkurs miniatiūras tiesioginėse transliacijose, kuriose nėra miniatiūrų paieškos juostoje. - -Paieškos juostos miniatiūros bus naudojamos tos pačios kokybės kaip dabartinis vaizdo įrašas. - -Ši funkcija geriausiai veikia su 720p ar žemesnės kokybės vaizdo įrašu ir naudojant labai greitą interneto ryšį." - Atkurti senas paieškos juostos miniatiūras - Paieškos juostos miniatiūros bus rodomos virš paieškos juostos - Paieškos juostos miniatiūros bus rodomos viso ekrano režimu - Įjungti SponsorBlock SponsorBlock – tai sutelktinė sistema, skirta praleisti erzinamam YouTube vaizdo įrašo dalims @@ -1341,8 +1428,6 @@ Jei vėliau išjungta, rekomenduojama išvalyti programos duomenis, kad būtų i Programėlės versijos apsimetinėjimo tikslas 20.13.41 – Atkurti neišskleistą vaizdo veiksmų juostą 20.05.46 - Atkurti transkripto funkcionalumą - 19.35.36 - Atkurti senus \"Shorts\" grotuvo piktogramas - 19.01.34 – Atkurti senas naršymo piktogramas Keisti pradžios puslapį @@ -1447,8 +1532,9 @@ Ribojimas: įrankių juostoje esantis atgal mygtukas gali neveikti." Įkėlimo ekranas turės gradientinį foną Įkėlimo ekranas turės tvirtą foną Paleidimo ekrano stilius - Spalva - Juoda ir balta + Išjungtas + Spalva + Juoda ir balta Įgalinti pritaikytą slankiklio spalvą Rodoma pritaikyta slankiklio spalva Rodoma originali slankiklio spalva @@ -1553,6 +1639,9 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v Išjungti ieškojimo anuliavimo vibraciją Ieškojimo anuliavimo vibracijos grįžtamasis ryšys išjungtas Ieškojimo anuliavimo vibracijos grįžtamasis ryšys įjungtas + Išjungti paspaudimo ir laikymo lytėjimo grįžtamąjį ryšį + Paspaudimo ir laikymo lytėjimo grįžtamasis ryšys yra išjungtas + Paspaudimo ir laikymo lytėjimo grįžtamasis ryšys yra įjungtas Išjungti priartinimo vibraciją Priartinimo vibracija išjungta Priartinimo vibracija įjungta @@ -1648,6 +1737,11 @@ Apribojimai: Rodomas išplėstinis vaizdo įrašo kokybės meniu Nerodomas išplėstinis vaizdo įrašo kokybės meniu + + Slėpti Premium kokybės parinktis + Premium kokybės parinktys yra paslėptos + Premium kokybės parinktys yra rodomos + Įjungti slinkimą, kad ieškotumėte Slinkimas, kad ieškotumėte, įjungtas @@ -1679,6 +1773,7 @@ Vaizdo įrašo atkūrimas su AV1 gali strigti arba praleisti kadrus." + Apie Skelbimai Bendra diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index 1b6439021d..77874c64fc 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Rādīt iestatījumu meklēšanas vēsturi Iestatījumu meklēšanas vēsture tiek rādīta Iestatījumu meklēšanas vēsture netiek rādīta + Atspējot treknās ikonas + Ikonas nav treknas + Ikonas ir treknas Rādīt ReVanced iestatījumu ikonas Iestatījumu ikonas tiek rādītas Ikonas iestatījumos netiek rādītas @@ -99,27 +102,36 @@ Lai tulkotu jaunās valodas vai uzlabotu esošos tulkojumus, apmeklējiet transl and changes made here must also be made there. --> - GmsCore iestatījumi - GmsCore iestatījumi + GmsCore + GmsCore iestatījumi + Pārbaudīt GmsCore atjauninājumus + Atjauninājumu pārbaude ir iespējota + Atjauninājumu pārbaude ir atspējota + Atvērt GmsCore iestatījumus + GmsCore iestatījumi - MicroG GmsCore nav instalēts. Instalējiet to. - Nepieciešama darbība - "MicroG GmsCore nav atļauts darboties fonā. + MicroG GmsCore nav instalēts. Instalējiet to. + Nepieciešama darbība + Neizdevās pārbaudīt MicroG GmsCore atjauninājumus + Ir pieejama jauna MicroG GmsCore versija (%1$s). Pašlaik izmantojat versiju %2$s. + "MicroG GmsCore nav atļauts darboties fonā. Sekojiet sava tālruņa \"Nenoslepkaviet manu lietotni\" rokasgrāmatai un lietojiet norādījumus savam MicroG instalācijai. Tas ir nepieciešams, lai lietotne darbotos." - Atvērt vietni - "MicroG GmsCore akumulatora optimizācijas ir jāatspējo, lai novērstu problēmas. + Atvērt vietni + Atcelt + "MicroG GmsCore akumulatora optimizācijas ir jāatspējo, lai novērstu problēmas. Akumulatora optimizāciju atspējošana MicroG neietekmēs akumulatora lietojumu negatīvi. Nospiediet turpināt pogu un atļaujiet optimizācijas izmaiņas." - Turpināt + Turpināt Viltot video straumes Viltot klienta video straumes, lai novērstu atskaņošanas problēmas + Viltot video straumes Viltot video straumes "Video straumes ir viltotas @@ -169,10 +181,11 @@ Jūs netiksit informēts par neparedzētiem notikumiem." Karodziņi saglabāti Karodziņi atiestatīti Karodziņi kopēti starpliktuvē - Reģistrēt protokola buferi - Atkļūdošanas žurnāli ietver protokola buferi - Atkļūdošanas žurnāli neietver protokola buferi - "Iespējojot šo iestatījumu, tiks reģistrēti papildu izkārtojuma dati, tostarp teksta attēlojums ekrānā dažiem lietotāja interfeisa komponentiem. + Restartējiet lietotni, lai izmantotu šo funkciju + Reģistrēt protokola buferi + Atkļūdošanas žurnāli ietver protokola buferi + Atkļūdošanas žurnāli neietver protokola buferi + "Iespējojot šo iestatījumu, tiks reģistrēti papildu izkārtojuma dati, tostarp teksta attēlojums ekrānā dažiem lietotāja interfeisa komponentiem. Tas var palīdzēt identificēt komponentus, veidojot pielāgotus filtrus. @@ -208,6 +221,7 @@ Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja da Atskaņotājs Slīdņu skala Pārvelciet vadīklas + Atgriezt YouTube Dislike Dažādi Atjaunot vecās iestatījumu izvēlnes Tiek rādītas vecās iestatījumu izvēlnes @@ -219,6 +233,9 @@ Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja da Shorts fonu atskaņošana ir iespējota + Slēpt veidotāja veikala plauktu + Radītāja veikala plaukts zem video atskaņotāja ir paslēpts. + Radītāja veikala plaukts zem videoklipu atskaņotāja ir redzams Paslēpt albumu kartītes Albumu kartītes ir paslēptas Albumu kartītes ir redzamas @@ -228,6 +245,9 @@ Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja da Slēpt mikroshēmu plauktu Mikroshēmu plaukts ir paslēpts Mikroshēmu plaukts ir redzams + Slēpt komentāru sadaļu zem videoklipiem sākumlapas plūsmā + Komentāru sadaļa zem videoklipiem sākumlapas plūsmā ir paslēpta + Komentāru sadaļa zem videoklipiem sākumlapas plūsmā ir redzama Slēpt kopienas ierakstus Kopienas ieraksti ir paslēpti Kopienas ieraksti ir redzami @@ -255,14 +275,19 @@ Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja da Slēpt jaunākos ierakstus Jaunākie ieraksti ir paslēpti Jaunākie ieraksti ir redzami + + Slēpt pogu \"Jaunākie video\" + Poga \"Jaunākie video\" ir paslēpta + Poga \"Jaunākie video\" ir redzama Slēpt jaukto atskaņošanas sarakstu Jauktie atskaņošanas saraksti ir paslēpti Jauktie atskaņošanas saraksti ir redzami Slēpt filmu sadaļu Filmu sadaļa ir paslēpta Filmu sadaļa ir redzama - + Paslēpt \"Paziņot\" pogu Poga \"Informēt mani\" ir paslēpta. Poga \"Informēt mani\" ir redzama. @@ -287,13 +312,16 @@ Tomēr, iespējojot šo iestatījumu, tiks reģistrēti arī daži lietotāja da Slēpt vizuālo atstarpi Vizuālā atstarpe ir paslēpta Vizuālā atstarpe ir redzama + Paslēpt tīmekļa meklēšanas rezultātus + Tīmekļa meklēšanas rezultāti ir paslēpti + Tīmekļa meklēšanas rezultāti ir redzami + Slēpt sadaļu \"Varētu patikt\" + Sadaļa \"Varētu patikt\" ir paslēpta + Sadaļa \"Varētu patikt\" ir redzama Paslēpt YouTube Doodles YouTube Doodles animācija uz logotipa ir paslēpta. YouTube Doodles animācija uz logotipa ir redzama - "YouTube Doodles tiek rādīti dažas dienas gadā. - -Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījums ir ieslēgts, tad filtrēšanas josla zem meklēšanas joslas arī tiks paslēpta." Slēpt kanāla joslu Kanāla josla ir paslēpta Kanāla josla ir redzama @@ -310,10 +338,15 @@ Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījum Informācijas paneļi ir paslēpti Informācijas paneļi ir redzami + This button usually appears in the video player for certain videos. --> Paslēpt Pievienoties pogu Poga \"Pievienoties\" ir paslēpta. Poga \"Pievienoties\" ir redzama. + + Slēpt pogu \"Tiešraides tērzēšanas atkārtojums\" + Tiešraides tērzēšanas atkārtojuma poga atskaņotāja pārklājumā ir paslēpta + Tiešraides tērzēšanas atkārtojuma poga atskaņotāja pārklājumā ir redzama Slēpt medicīnas paneļus Medicīnas paneļi ir paslēpti Medicīnas paneļi ir redzami @@ -329,6 +362,9 @@ Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījum Paslēpt laika reakcijas Laika reakcijas ir paslēptas Laika reakcijas ir redzamas + Paslēpt video nosaukumu + Video nosaukums atskaņotāja pārklājumā ir paslēpts + Video nosaukums atskaņotāja pārklājumā ir redzams Paslēpt \"AI ģenerēta video kopsavilkums\" AI ģenerētā video kopsavilkuma sadaļa ir paslēpta Tiek rādīta AI ģenerētā video kopsavilkuma sadaļa @@ -341,33 +377,62 @@ Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījum Paslēpt nodaļas Nodaļu sadaļa ir paslēpta Nodaļu sadaļa ir redzama - Paslēpt \"Kā šis saturs tika veidots\" - Sadaļa \"Kā šis saturs tika veidots\" ir paslēpta - Sadaļa \"Kā šis saturs tika veidots\" ir redzama - Slēpt Hype punktus - Hype punkti ir slēpti - Hype punkti ir redzami + Slēpt \"Kursa progresu\" + Kursa progresa sadaļa ir paslēpta + Kursa progresa sadaļa ir redzama + Slēpt Izpētīt + Sadaļas \"Izpētīt šo kursu\" un \"Izpētīt podkāstu\" ir paslēptas + Sadaļas \"Izpētīt šo kursu\" un \"Izpētīt podkāstu\" ir redzamas + Slēpt \"Izpētīt šo kursu\" + Sadaļa \"Izpētīt šo kursu\" ir paslēpta + Sadaļa \"Izpētīt šo kursu\" ir redzama + Paslēpt sadaļu \"Izpētiet podkāstu\" + Sadaļa \"Izpētiet podkāstu\" ir paslēpta + Sadaļa \"Izpētiet podkāstu\" ir redzama Paslēpt sadaļu \"Izpētiet podkāstu\" Sadaļa \"Izpētiet podkāstu\" ir paslēpta Sadaļa \"Izpētiet podkāstu\" ir redzama Slēpt izceltās saites Ieteikto saišu sadaļa ir paslēpta Ieteikto saišu sadaļa ir redzama + Slēpt \"Ieteiktās vietas\" + Ieteikto vietu sadaļa ir paslēpta + Ieteikto vietu sadaļa ir redzama Paslēpt ieteiktos videoklipus Ieteikto videoklipu sadaļa ir paslēpta Ieteikto videoklipu sadaļa ir redzama + Iespējot plūsmas iznirstošās izvēlnes filtru + Plūsmas iznirstošās izvēlnes filtrs ir iespējots + Plūsmas iznirstošās izvēlnes filtrs ir atspējots + Plūsmas iznirstošās izvēlnes filtrs + Ievadiet iznirstošās izvēlnes nosaukumus, pēc kuriem filtrēt, pa vienam rindā + Slēpt Spēļu sadaļu + Spēļu sadaļa ir paslēpta + Spēļu sadaļa ir redzama + Paslēpt \"Kā šis saturs tika veidots\" + Sadaļa \"Kā šis saturs tika veidots\" ir paslēpta + Sadaļa \"Kā šis saturs tika veidots\" ir redzama + Slēpt Hype punktus + Hype punkti ir slēpti + Hype punkti ir redzami Paslēpt informācijas kartītes Informācijas karšu sadaļa ir paslēpta Informācijas karšu sadaļa ir redzama Paslēpt \"Galvenos jēdzienus\" Sadaļa \"Galvenie jēdzieni\" ir paslēpta Sadaļa \"Galvenie jēdzieni\" ir redzama + Slēpt Mūzikas sadaļu + Mūzikas sadaļa ir paslēpta + Mūzikas sadaļa ir redzama Paslēpt pogu Abonēt Abonēšanas poga ir paslēpta Abonēšanas poga ir redzama Paslēpt transkriptu Transkripcijas sadaļa ir paslēpta Transkripcijas sadaļa ir redzama + Slēpt Viktorīnu sadaļu + Viktorīnu sadaļa ir paslēpta + Viktorīnu sadaļa ir redzama Videoklipa apraksts Slēpt vai parādīt videoklipa apraksta komponentus Filtra josla @@ -386,6 +451,11 @@ Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījum Parādīts skatīšanās vēsturē Kanāla lapa Slēpt vai parādīt kanāla lapas komponentus + Iespējot kanāla cilnes filtru + Kanāla cilnes filtrs ir iespējots + Kanāla cilnes filtrs ir atspējots + Kanāla cilnes filtrs + Ievadiet kanāla cilņu nosaukumus, pēc kuriem filtrēt, pa vienam rindā Slēpt pogu Kopiena Kopienas poga ir paslēpta @@ -449,15 +519,15 @@ Ja Doodle pašlaik tiek rādīts jūsu reģionā un šis slēpšanas iestatījum Skatījumu skaits ir redzams plūsmā un meklēšanas rezultātos "Ierobežojumi: -• Shorts sadaļās, kanālu lapās un meklēšanas rezultātos joprojām var tikt rādīts skatījumu skaits -• Šī funkcija nedarbojas ar automobiļu formas faktoru" +• Shorts sadaļās, kanālu lapās un meklēšanas rezultātos joprojām var tikt rādīts skatījumu skaits. +• Šī funkcija nedarbojas ar automobiļu formas faktoru." Slēpt augšupielādes laiku Augšupielādes laiks ir paslēpts plūsmā un meklēšanas rezultātos Augšupielādes laiks tiek rādīts plūsmā un meklēšanas rezultātos "Ierobežojumi: -• Shorts plaukti, kanālu lapas un meklēšanas rezultāti joprojām var rādīt augšupielādes laiku -• Šī funkcija nedarbojas ar automobiļu formas faktoru" +• Shorts plaukti, kanālu lapas un meklēšanas rezultāti joprojām var rādīt augšupielādes laiku. +• Šī funkcija nedarbojas ar automobiļu formas faktoru." Paslēpt atslēgvārdu saturu Paslēpt meklēšanas un plūsmas video, izmantojot atslēgvārdu filtrus Paslēpt mājas video ar atslēgvārdiem @@ -480,7 +550,7 @@ Vārdi ar lielo burtu vidū ir jāievada ar lielo burtu (piemēram: iPhone, TikT Par atslēgvārdu filtrēšanu "Mājas/Abonementu/Meklēšanas rezultāti tiek filtrēti, lai slēptu saturu, kas atbilst atslēgvārdu frāzēm -Ierobežojumi +Ierobežojumi: • Shorts nevar slēpt pēc kanāla nosaukuma • Daži lietotāja saskarnes komponenti var nebūt paslēpti • Meklējot atslēgvārdu, rezultāti var nebūt parādīti" @@ -495,19 +565,12 @@ Ierobežojumi Atslēgvārds paslēps visus video: %s - Slēpt veidotāja veikala plauktu - Radītāja veikala plaukts zem video atskaņotāja ir paslēpts. - Radītāja veikala plaukts zem videoklipu atskaņotāja ir redzams Paslēpt veikala reklāmkarogu ekrāna beigās Beigu ekrāna veikala reklāmkarogs ir paslēpts. Beigu ekrāna veikala reklāmkarogs ir redzams. Paslēpt pilnekrāna reklāmas - "Pilnekrāna reklāmas ir paslēptas - -Šī funkcija ir pieejama tikai vecākiem ierīcēm" + Pilnekrāna reklāmas ir paslēptas Pilnekrāna reklāmas ir redzamas - - Paslēpt pilnekrāna reklāmas darbojas tikai ar vecākām ierīcēm Paslēpt vispārējas reklāmas Vispārējas reklāmas ir paslēptas Vispārējas reklāmas ir redzamas @@ -517,6 +580,9 @@ Ierobežojumi Paslēpt apmaksātas reklāmas etiķeti Apmaksātas reklāmas etiķete ir paslēpta Apmaksātas reklāmas etiķete ir redzama + Slēpt atskaņotāja uznirstošās reklāmas + Atskaņotāja uznirstošās reklāmas ir paslēptas + Atskaņotāja uznirstošās reklāmas ir redzamas Paslēpt pašreklāmas kartītes Pašreklāmas kartītes ir paslēptas Pašreklāmas kartītes ir redzamas @@ -526,21 +592,16 @@ Ierobežojumi Paslēpt reklāmkarogu \"Skatīt produktus\" Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir paslēpts. Reklāmkarogs \"Skatīt produktus\" video pārklājumā ir redzams. - Paslēpt tīmekļa meklēšanas rezultātus - Tīmekļa meklēšanas rezultāti ir paslēpti - Tīmekļa meklēšanas rezultāti ir redzami - - - Paslēpt YouTube Premium reklāmas - YouTube Premium reklāmas zem video atskaņotāja ir paslēptas - YouTube Premium reklāmas zem video atskaņotāja ir redzamas + Paslēpt YouTube Premium reklāmas + YouTube Premium reklāmas ir paslēptas + YouTube Premium reklāmas ir redzamas Paslēpt video reklāmas Video reklāmas ir paslēptas Video reklāmas ir redzamas - + URL kopēts starpliktuvē URL ar laika zīmi kopēts Rādīt video URL kopēšanas pogu @@ -556,10 +617,10 @@ Ierobežojumi Dialogs tiks rādīts Tas neapiet vecuma ierobežojumu. Tas vienkārši automātiski to pieņem. - - Atspējot uznirstošo logu \"Pierakstīties televizorā\" - Uznirstošais paziņojums Pierakstīties televizorā ir atspējots - Uznirstošais paziņojums Pierakstīties televizorā ir iespējots + + Atspējot uznirstošo logu \"Pierakstīties televizorā\" + Uznirstošais paziņojums Pierakstīties televizorā ir atspējots + Uznirstošais paziņojums Pierakstīties televizorā ir iespējots Atspējot divkāršu pieskārienu nodaļas izlaišanai @@ -592,10 +653,10 @@ Pārbaudiet, vai pakotnes nosaukums ir pareizs un lietotne ir instalēta"Žests ir atslēgts Žests ir ieslēgts - - Iespējot pieskārienu, lai meklētu - Pieskarieties, lai iespējotu meklēšanu - Pieskāriens, lai meklētu, ir atspējots + + Iespējot pieskārienu, lai meklētu + Pieskarieties, lai iespējotu meklēšanu + Pieskāriens, lai meklētu, ir atspējots Ieslēgt spilgtuma žestu @@ -676,7 +737,7 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Komentāru poga ir paslēpta Komentāru poga ir redzama + This button usually appears on live streamed videos. --> Paslēpt Ziņot Ziņot poga ir paslēpta Ziņot poga ir redzama @@ -689,7 +750,7 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Lejupielādēt poga ir paslēpta Lejupielādēt poga ir redzama + This button usually appears on videos uploaded by the logged-in user. --> Paslēpt ažiotāžu Poga \ Hype poga tiek rādīta @@ -702,7 +763,7 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Paldies poga ir paslēpta Paldies poga ir redzama + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Paslēpt jautājumu Jautājuma poga ir paslēpta Jautājuma poga ir redzama @@ -710,6 +771,7 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Paslēpt Izgriezt Izgriezt poga ir paslēpta Izgriezt poga ir redzama + Paslēpšana var nedarboties dažiem lietotāju kontiem. Paslēpt veikalu Veikala poga ir paslēpta @@ -719,13 +781,13 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Poga Saglabāt ir paslēpta Poga Saglabāt ir redzama - + Navigācijas pogas - Paslēpt vai mainīt pogas navigācijas joslā + Slēpt vai mainīt navigācijas joslas pogas - Paslēpt Sākums - Sākums poga ir paslēpta - Sākums poga ir redzama + Paslēpt Sākumlapu + Poga Sākums ir paslēpta + Poga Sākums ir redzama Paslēpt Shorts Shorts poga ir paslēpta @@ -743,26 +805,44 @@ Regulējiet skaļumu, velkot vertikāli ekrāna labajā pusē" Paziņojumu poga ir redzama Mainīt Izveidot ar Paziņojumiem - "Izveidot poga tiek pārslēgta ar Paziņojumu pogu - -Piezīme: Šī iestatījuma ieslēgšana arī piespiedu kārtā slēpj video reklāmas" + Izveidot poga ir pārslēgta ar Paziņojumu pogu Izveidot pogu nevar pārslēgt ar paziņojumu pogu - "Atspējojot šo iestatījumu, tiks atspējota arī Shorts reklāmu bloķēšana. - -Ja šī iestatījuma maiņa nestājas spēkā, mēģiniet pārslēgties uz inkognito režīmu." - Paslēpt navigācijas pogu etiķetes + Ja šī iestatījuma maiņa nestājas spēkā, mēģiniet pārslēgties uz inkognito režīmu. + Slēpt navigācijas pogu etiķetes Etiķetes ir paslēptas Etiķetes ir redzamas + Iespējot šauras navigācijas pogas + Atstarpe starp navigācijas pogām ir šaura + Atstarpe starp navigācijas pogām ir normāla + Iespējot navigācijas joslas animācijas + Navigācijas pārejas ir animētas + Navigācijas pārejas nav animētas Atspējojiet puscaurspīdu statusa joslu Statusa josla ir necaurspīdīga Statusa josla ir necaurspīdīga vai caurspīdīga - Dažās ierīcēs, iespējojot šo funkciju, sistēmas navigācijas josla var kļūt caurspīdīga. + "Ierobežojumi: +• Videoklipu atskaņotāja augšpusē var parādīties melna josla. +• Dažās ierīcēs šīs funkcijas iespējošana var mainīt sistēmas navigācijas joslu uz caurspīdīgu." Atspējojiet gaišo caurspīdu joslu - Gaišais režīma navigācijas josla ir necaurspīdiga + Gaišā režīma navigācijas josla ir necaurspīdīga Gaišā režīma navigācijas josla ir necaurspīdīga vai caurspīdīga Atspējot tumšo caurspīdīgo joslu - Tumšais režīma navigācijas josla ir necaurspīdiga + Tumšā režīma navigācijas josla ir necaurspīdīga Tumšā režīma navigācijas josla ir necaurspīdīga vai caurspīdīga + Rīkjosla + Slēpt vai mainīt rīkjoslas komponentus + Slēpt pogu \"Izveidot\" + Izveidot poga ir paslēpta + Izveidot poga ir redzama + Slēpt Paziņojumu pogu + Paziņojumu poga ir paslēpta + Paziņojumu poga ir redzama + Slēpt meklēšanas pogu + Meklēšanas poga ir paslēpta + Meklēšanas poga ir redzama. + Iespējot platu meklēšanas joslu + Plata meklēšanas josla ir iespējota + Plata meklēšanas josla ir atspējota Izvelkamo izvēlni @@ -837,6 +917,12 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Paslēpt pogu \"Sūtīt\" Pārraides poga ir paslēpta Pārraides poga ir redzama + Slēpt Sakļaušanas pogu + Sakļaušanas poga ir paslēpta + Sakļaušanas poga ir redzama + Slēpt Pilnekrāna pogu + Pilnekrāna poga ir paslēpta + Pilnekrāna poga ir redzama Paslēpt atskaņotāja vadīklu fonu Atskaņotāja vadības elementu fons ir paslēpts Atskaņotāja vadīklu fons tiek rādīts @@ -845,9 +931,9 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Pogas ir redzamas - Paslēpt ekrāna beigās esošās kartītes - Ekrāna beigās esošās kartītes ir paslēptas - Ekrāna beigās esošās kartītes ir redzamas + Paslēpt ekrāna beigās esošās kartītes + Ekrāna beigās esošās kartītes ir paslēptas + Ekrāna beigās esošās kartītes ir redzamas Atspējot apkārtējās vides režīmu pilnekrāna režīmā @@ -872,10 +958,16 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Slēpt video sīktēlu laika joslu Video sīktēlu laika josla ir paslēpta Video sīktēlu laika josla ir redzama + Iespējot pilnekrāna lielo meklēšanas joslu + Pilnekrāna meklēšanas josla ir liela izmēra + Pilnekrāna meklēšanas josla ir normāla izmēra Shorts atskaņotājs Slēpt vai rādīt Shorts atskaņotāja komponentus + Slēpt Shorts kanāla lapā + Paslēpts kanāla lapā + Rādīts kanāla lapā Slēpt Shorts sākumlapā. Paslēpti sākumlapā un saistītajos video. @@ -887,9 +979,18 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Slēpt Shorts abonementu plūsmā. Paslēpti abonementu plūsmā. Redzami abonementu plūsmā. + Slēpt Shorts video aprakstā + Paslēpts video aprakstā + Rādīts video aprakstā Paslēpt šortus skatīšanās vēsturē Slēpts skatīšanās vēsturē Parādīts skatīšanās vēsturē + Slēpt AI pogu + AI poga ir paslēpta + AI poga ir redzama + Slēpt etiķeti \"Automātiski dublēts\" + Automātiski dublētā iezīme ir paslēpta + Automātiski dublētā iezīme ir redzama Slēpt etiķeti \"Automātiski dublēts\" Automātiski dublētā iezīme ir paslēpta Automātiski dublētā iezīme ir redzama @@ -951,6 +1052,7 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Slēpt pogu \"Izmantot šo veidni\" Poga \"Izmantot šo veidni\" ir paslēpta Poga \"Izmantot šo veidni\" ir redzama + Paslēpt pogas \"Like\" strūklaku animāciju Patīk pogas fonteinu animācija ir paslēpta Patīk pogas fonteinu animācija ir redzama @@ -993,7 +1095,12 @@ Lai parādītu audio celiņa izvēlni, mainiet \"" Navigācijas josla ir paslēpta Navigācijas josla ir redzama - + + Slēpt automātiskās atskaņošanas priekšskatījumu + Automātiskās atskaņošanas priekšskatījums ir paslēpts + Automātiskās atskaņošanas priekšskatījums ir redzams + + Slēpt ieteikto video beigu ekrānā "Ieteiktais video beigu ekrānā ir paslēpts, kad automātiskā atskaņošana ir izslēgta @@ -1012,9 +1119,9 @@ Iestatījumi → Atskaņošana → Automātiski atskaņot nākamo video"Laika zīme ir redzama - Paslēpt atskaņotāja uznirstošos paneļus - Atskaņotāja uznirstošie paneļi ir paslēpti - Atskaņotāja uznirstošie paneļi ir redzami + Paslēpt atskaņotāja uznirstošos paneļus + Atskaņotāja uznirstošie paneļi ir paslēpti + Atskaņotāja uznirstošie paneļi ir redzami Iziet no pilnekrāna režīma video beigās @@ -1082,26 +1189,6 @@ Ierobežojums: Nepatīk var neparādīties inkognito režīmā" Klienta ātruma ierobežojums sastapts %d reizes %d milisekundes - - Iespējot platu meklēšanas joslu - Plata meklēšanas josla ir iespējota - Plata meklēšanas josla ir atspējota - - - Iespējot augstas kvalitātes sīktēlus - Meklēšanas joslas sīktēli ir augstas kvalitātes - Meklēšanas joslas sīktēli ir vidējas kvalitātes - Pilnekrāna meklēšanas joslas sīktēli ir augstas kvalitātes - Pilnekrāna meklēšanas joslas sīktēli ir vidējas kvalitātes - "Tādējādi tiks atjaunotas miniatūras tiešraides straumēs, kurām nav laika skalas miniatūru. - -Laika skalas miniatūras izmantos tādu pašu kvalitāti kā pašreizējais video. - -Šī funkcija darbojas vislabāk ar video kvalitāti 720p vai zemāku un, ja tiek izmantots ļoti ātrs interneta savienojums." - Atjaunot vecās meklēšanas joslas sīktēlus - Meklēšanas joslas sīktēli parādīsies virs meklēšanas joslas - Meklēšanas joslas sīktēli parādīsies pilnekrānā - Iespējot SponsorBlock SponsorBlock ir kopienas sistēma YouTube videoklipu kaitinošo daļu izlaišanai @@ -1201,7 +1288,7 @@ Jūsu lietotāja ID ir kā parole, un to nekad nedrīkst dalīties." Atkāpes / Joki Sānu ainas vai joki, kas nav nepieciešami, lai saprastu video galveno saturu. Neietver sadaļas, kas sniedz kontekstu vai fona informāciju Mūzika: Ne-mūzikas sadaļa - Lietojams tikai mūzikas video. Mūzikas video sadaļas bez mūzikas, kas jau nav aptvertas citā kategorijā + Lietojams tikai mūzikas video. Mūzikas video sadaļas bez mūzikas, kas vēl nav aptvertas citā kategorijā Izlaist Izcelt Izlaist sponsorēšanu @@ -1340,8 +1427,6 @@ Ja vēlāk tiks izslēgts, ieteicams notīrīt lietotnes datus, lai novērstu li Viltot lietotnes versijas mērķis 20.13.41 - Atjaunot nesaspiestu video darbību joslu 20.05.46 - Atjaunot transkripta funkcionalitāti - 19.35.36 - Atjaunot vecās Shorts spēlētāja ikonas - 19.01.34 - Atjaunot vecās navigācijas ikonas Mainīt sākuma lapu @@ -1428,6 +1513,10 @@ Miniatskaņotāju var pārvilkt no ekrāna uz kreiso vai labo pusi" Paslēpt pārklājuma pogas Pārklājuma pogas ir paslēptas Pārklājuma pogas ir redzamas + "Pogas ir paslēptas + +Velciet, lai izvērstu vai aizvērtu" + Izvēršanas un aizvēršanas pogas ir redzamas Slēpt apakštekstu Apakšteksts ir paslēpts Apakšteksts ir redzams @@ -1446,8 +1535,9 @@ Miniatskaņotāju var pārvilkt no ekrāna uz kreiso vai labo pusi" Ielādes ekrānam būs gradientu fons Ielādes ekrānam būs ciets fons Sākuma ekrāna stils - Krāsa - Melnbalts + Atspējots + Krāsa + Melnbalts Iespējot pielāgotu meklēšanas joslas krāsu Pielāgota meklēšanas joslas krāsa ir redzama Oriģinālā meklēšanas joslas krāsa ir redzama @@ -1529,7 +1619,10 @@ Nospiediet šeit, lai uzzinātu vairāk par DeArrow" Video atkārtošana ir ieslēgta Video atkārtošana ir izslēgta - + + Apturēt skaņu pārtraukuma gadījumā + Klusināt skaļumu citas atskaņošanas laikā + Viltot ierīces izmērus "Ierīces izmēri ir viltoti @@ -1552,6 +1645,9 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk Atspējot meklēšanas atsaukšanas haptisko atgriezenisko saiti Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir atspējota Meklēšanas atsaukšanas haptiskā atgriezeniskā saite ir iespējota + Atspējot pieskaršanās un turēšanas haptisko atgriezenisko saiti + Pieskaršanās un turēšanas haptiskā atgriezeniskā saite ir atspējota + Pieskaršanās un turēšanas haptiskā atgriezeniskā saite ir iespējota Atspējot tālummaiņas haptisko atgriezenisko saiti Tālummaiņas haptiskā atgriezeniskā saite ir atspējota Tālummaiņas haptiskā atgriezeniskā saite ir iespējota @@ -1647,6 +1743,11 @@ Ierobežojumi: Tiek rādīta izvērstā video kvalitātes izvēlne Izvērstā video kvalitātes izvēlne netiek rādīta + + Slēpt Premium kvalitātes opcijas + Premium kvalitātes opcijas ir paslēptas + Premium kvalitātes opcijas ir redzamas + Iespējot slīdēšanu, lai meklētu Slīdēšana, lai meklētu, ir iespējota @@ -1678,6 +1779,7 @@ AV1 video atskaņošana var raustīties vai izlaist kadrus." + Par Reklāmas Vispārīgi diff --git a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml index 3a40645452..a9b10d980c 100644 --- a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml +++ b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Оневозможи задебелени икони + Иконите не се задебелени + Иконите се задебелени + GmsCore + Поставки поврзани со GmsCore + Проверете за ажурирања на GmsCore + Проверката за ажурирања е овозможена + Проверката за ажурирања е оневозможена + Отвори поставки за GmsCore + Поставки на GmsCore + MicroG GmsCore не е инсталиран. Инсталирајте го. + Потребно е дејство + Неуспешна проверка за ажурирања на MicroG GmsCore + Достапна е нова верзија (%1$s) на MicroG GmsCore. Моментално користите верзија %2$s. + "MicroG GmsCore нема дозвола да работи во позадина. + +Следете го водичот \"Don't kill my app\" за вашиот телефон и применете ги упатствата на вашата инсталација на MicroG. + +Ова е потребно за апликацијата да работи." + Отвори веб-страница + Откажи + "Оптимизациите за батерија на MicroG GmsCore мора да бидат оневозможени за да се спречат проблеми. + +Оневозможувањето на оптимизациите за батерија за MicroG нема негативно да влијае на потрошувачката на батерија. + +Допрете го копчето „Продолжи“ и дозволете промени во оптимизацијата." + Продолжи - + + Рестартирајте ја апликацијата за да ја користите оваа функција + Запиши протоколен бафер + Дневниците за дебагирање вклучуваат протоколен бафер + Дневниците за дебагирање не вклучуваат протоколен бафер + "Овозможувањето на оваа поставка ќе евидентира дополнителни податоци за распоредот, вклучувајќи го и текстот на екранот за некои UI компоненти. + +Ова може да помогне во идентификувањето на компонентите при креирање прилагодени филтри. + +Сепак, овозможувањето на ова исто така ќе евидентира некои кориснички податоци како вашата IP адреса." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Сокриј ја полицата на продавницата за креатори + Полицата на продавницата за креатори под видео плеерот е скриена + Полицата на продавницата за креатори под видео плеерот е прикажана + Сокриј го делот за коментари под видеата во почетниот довод + Делот за коментари под видеата во почетниот довод е скриен + Делот за коментари под видеата во почетниот довод е прикажан + + Сокриј го копчето „Најнови видеа“ + Копчето „Најнови видеа“ е скриено + Копчето „Најнови видеа“ е прикажано + + Сокриј ги резултатите од веб-пребарувањето + Резултатите од веб-пребарувањето се скриени + Резултатите од веб-пребарувањето се прикажани + Сокриј го делот „Можеби ќе ви се допадне“ + Делот „Можеби ќе ви се допадне“ е скриен + Делот „Можеби ќе ви се допадне“ е прикажан + This button usually appears in the video player for certain videos. --> + + Сокриј го копчето „Повторување на разговор во живо“ + Копчето за повторување на разговор во живо во преклопот на плеерот е скриено + Копчето за повторување на разговор во живо во преклопот на плеерот е прикажано + Сокриј го насловот на видеото + Насловот на видеото во преклопот на плеерот е скриен + Насловот на видеото во преклопот на плеерот е прикажан + Сокриј го „Напредок во курсот“ + Делот за напредок во курсот е скриен + Делот за напредок во курсот е прикажан + Сокриј го Истражи + Деловите „Истражете го овој курс“ и „Истражете го подкастот“ се скриени + Деловите „Истражете го овој курс“ и „Истражете го подкастот“ се прикажани + Сокриј го „Истражете го овој курс“ + Делот „Истражете го овој курс“ е скриен + Делот „Истражете го овој курс“ е прикажан + Сокриј го „Истражете го подкастот“ + Делот „Истражете го подкастот“ е скриен + Делот „Истражете го подкастот“ е прикажан + Сокриј ги „Избрани места“ + Делот „Избрани места“ е скриен + Делот „Избрани места“ е прикажан + Овозможи филтер за менито што се појавува во доводот + Филтерот за менито што се појавува во доводот е овозможен + Филтерот за менито што се појавува во доводот е оневозможен + Филтер за менито што се појавува во доводот + Внесете ги имињата на менито што се појавува за филтрирање, по едно во ред + Сокриј Игри + Делот за игри е скриен + Делот за игри е прикажан + Сокриј Музика + Делот за музика е скриен + Делот за музика е прикажан + Сокриј Квизови + Делот за квизови е скриен + Делот за квизови е прикажан + Овозможи филтер за јазичиња на каналот + Филтерот за јазичиња на каналот е овозможен + Филтерот за јазичиња на каналот е оневозможен + Филтер за јазичиња на каналот + Внесете ги имињата на јазичињата на каналот за филтрирање, по едно во ред + "Ограничувања: +• Полиците со Shorts, страниците на каналите и резултатите од пребарувањето сè уште може да прикажуваат број на прегледи. +• Оваа функција не работи со автомобилски форм-фактор." + "Ограничувања: +• Полиците со Shorts, страниците на каналите и резултатите од пребарувањето сè уште може да прикажуваат времиња на поставување. +• Оваа функција не работи со автомобилски форм-фактор." + "Почетна/Претплати/Резултатите од пребарувањето се филтрираат за да се сокрие содржината што одговара на фразите со клучни зборови + +Ограничувања: +• Shorts не може да се сокријат по име на канал +• Некои компоненти на корисничкиот интерфејс може да не се скриени +• Пребарувањето за клучен збор може да не прикаже резултати" - + Рекламите на цел екран се скриени + Сокриј ги скокачките реклами на плеерот + Скокачките реклами на плеерот се скриени + Скокачките реклами на плеерот се прикажани + Банерот „Прикажи производи“ во преклопот на плеерот е скриен + Банерот „Прикажи производи“ во преклопот на плеерот е прикажан + Сокриј промоции на YouTube Premium + Промоциите на YouTube Premium се скриени + Промоциите на YouTube Premium се прикажани - - + + URL-то е копирано во таблата со исечоци + URL-то со временска ознака е копирано + Прикажи копче за копирање URL на видео + Копчето за копирање URL на видео е прикажано. Допрете за да копирате URL на видео. Допрете и задржете за да копирате со временска ознака + Копчето за копирање URL на видео не е прикажано + Прикажи копче за копирање URL со временска ознака + Копчето за копирање URL со временска ознака е прикажано. Допрете за да копирате URL на видео со временска ознака. Допрете и задржете за да копирате без временска ознака + Копчето за копирање URL со временска ознака не е прикажано + - + + Оневозможи скокачки прозорец „Најави се на ТВ“ + Скокачкиот прозорец „Најави се на ТВ“ е оневозможен + Скокачкиот прозорец „Најави се на ТВ“ е овозможен + - + + Овозможи допир за пребарување + Допир за пребарување е овозможен + Допир за пребарување е оневозможен + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Сокривањето може да не работи за некои кориснички сметки. - + + Копчиња за навигација + Сокриј или промени ги копчињата на лентата за навигација + Сокриј Почетна + Копчето „Почетна“ е скриено + Копчето „Почетна“ е прикажано + Сокриј Shorts + Копчето Shorts е скриено + Копчето Shorts е прикажано + Сокриј Креирај + Копчето „Креирај“ е скриено + Копчето „Креирај“ е прикажано + Сокриј Претплати + Копчето „Претплати“ е скриено + Копчето „Претплати“ е прикажано + Сокриј Известувања + Копчето „Известувања“ е скриено + Копчето „Известувања“ е прикажано + Замени Креирај со Известувања + Копчето „Креирај“ е заменето со копчето „Известувања“ + Копчето „Креирај“ не е заменето со копчето „Известувања“ + Ако менувањето на оваа поставка не стапи на сила, обидете се да се префрлите на инкогнито режим. + Сокриј ги ознаките на копчињата за навигација + Ознаките се скриени + Ознаките се прикажани + Овозможи тесни копчиња за навигација + Растојанието меѓу копчињата за навигација е тесно + Растојанието меѓу копчињата за навигација е нормално + Овозможи анимации на лентата за навигација + Навигациските транзиции се анимирани + Навигациските транзиции не се анимирани + Оневозможи проѕирна статусна лента + Статусната лента е непроѕирна + Статусната лента е непроѕирна или проѕирна + "Ограничувања: +• Црна лента може да се појави на врвот на видео плеерот. +• На некои уреди, овозможувањето на оваа функција може да ја промени системската лента за навигација во проѕирна." + Оневозможи светла проѕирна лента + Лентата за навигација во светол режим е непроѕирна + Лентата за навигација во светол режим е непроѕирна или проѕирна + Оневозможи темна проѕирна лента + Лентата за навигација во темен режим е непроѕирна + Лентата за навигација во темен режим е непроѕирна или проѕирна + Лента со алатки + Сокриј или промени ги компонентите на лентата со алатки + Сокриј го копчето „Креирај“ + Копчето „Креирај“ е скриено + Копчето „Креирај“ е прикажано + Сокриј го копчето „Известувања“ + Копчето „Известувања“ е скриено + Копчето „Известувања“ е прикажано + Сокриј го копчето „Пребарај“ + Копчето „Пребарај“ е скриено + Копчето „Пребарај“ е прикажано. + Овозможи широка лента за пребарување + Широката лента за пребарување е овозможена + Широката лента за пребарување е оневозможена @@ -126,25 +315,67 @@ Second \"item\" text" + Сокриј го копчето „Собери“ + Копчето „Собери“ е скриено + Копчето „Собери“ е прикажано + Сокриј го копчето „Цел екран“ + Копчето „Цел екран“ е скриено + Копчето „Цел екран“ е прикажано + + + Сокриј ги картичките на крајниот екран + Картичките на крајниот екран се скриени + Картичките на крајниот екран се прикажани - + Овозможи голема лента за пребарување на цел екран + Лентата за пребарување на цел екран е со голема големина + Лентата за пребарување на цел екран е со нормална големина + Сокриј Shorts на страницата на каналот + Скриено на страницата на каналот + Прикажано на страницата на каналот + Сокриј Shorts во описот на видеото + Скриено во описот на видеото + Прикажано во описот на видеото + Сокриј го копчето за АИ + Копчето за АИ е скриено + Копчето за АИ е прикажано + Сокриј ја ознаката „Автоматски синхронизирано“ + Ознаката „Автоматски синхронизирано“ е скриена + Ознаката „Автоматски синхронизирано“ е прикажана + - + + Сокриј преглед за автоматска репродукција + Прегледот за автоматска репродукција е скриен + Прегледот за автоматска репродукција е прикажан + + + Сокриј го предложеното видео на крајниот екран + "Предложеното видео на крајниот екран е скриено кога автоматската репродукција е исклучена + +Автоматската репродукција може да се промени во поставките на YouTube: +Поставки → Репродукција → Автоматска репродукција на следно видео" + Предложеното видео на крајниот екран е прикажано + - + + Сокриј ги скокачките панели на плеерот + Скокачките панели на плеерот се скриени + Скокачките панели на плеерот се прикажани + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Само за употреба во музички видеа. Деловите од музичките видеа без музика, кои сè уште не се опфатени со друга категорија + Не може да се поднесе сегментот: %s + "Не може да се поднесе сегментот. +Веќе постои" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Оневозможено + Боја + Црно-бело + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Оневозможи хаптички повратни информации при допирање и задржување + Хаптичките повратни информации при допирање и задржување се оневозможени + Хаптичките повратни информации при допирање и задржување се овозможени + @@ -200,6 +441,11 @@ Second \"item\" text" + + Сокриј опции за премиум квалитет + Опциите за премиум квалитет се скриени + Опциите за премиум квалитет се прикажани + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml index 3a40645452..7fb153c092 100644 --- a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + കട്ടിയുള്ള ഐക്കണുകൾ പ്രവർത്തനരഹിതമാക്കുക + ഐക്കണുകൾ കട്ടിയുള്ളതല്ല + ഐക്കണുകൾ കട്ടിയുള്ളതാണ് + GmsCore + GmsCore-മായി ബന്ധപ്പെട്ട ക്രമീകരണങ്ങൾ + GmsCore അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുക + അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നത് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു. + GmsCore ക്രമീകരണങ്ങൾ തുറക്കുക + GmsCore-ൻ്റെ ക്രമീകരണങ്ങൾ + MicroG GmsCore ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. ഇൻസ്റ്റാൾ ചെയ്യുക. + നടപടി ആവശ്യമാണ് + MicroG GmsCore അപ്‌ഡേറ്റുകൾ പരിശോധിക്കുന്നതിൽ പരാജയപ്പെട്ടു + MicroG GmsCore-ന്റെ ഒരു പുതിയ പതിപ്പ് (%1$s) ലഭ്യമാണ്. നിലവിൽ, നിങ്ങൾ ഉപയോഗിക്കുന്നത് %2$s പതിപ്പാണ്. + "MicroG GmsCore-ന് പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കാൻ അനുമതിയില്ല. + +നിങ്ങളുടെ ഫോണിനായുള്ള \"എൻ്റെ ആപ്പ് നിർത്തരുത്\" എന്ന ഗൈഡ് പിന്തുടരുക, നിർദ്ദേശങ്ങൾ നിങ്ങളുടെ MicroG ഇൻസ്റ്റലേഷനിൽ പ്രയോഗിക്കുക. + +ആപ്പ് പ്രവർത്തിക്കുന്നതിന് ഇത് ആവശ്യമാണ്." + വെബ്സൈറ്റ് തുറക്കുക + റദ്ദാക്കുക + "പ്രശ്‌നങ്ങൾ ഒഴിവാക്കാൻ MicroG GmsCore ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ പ്രവർത്തനരഹിതമാക്കണം. + +MicroG-യുടെ ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ പ്രവർത്തനരഹിതമാക്കുന്നത് ബാറ്ററി ഉപയോഗത്തെ പ്രതികൂലമായി ബാധിക്കില്ല. + +തുടരുക ബട്ടണിൽ ടാപ്പുചെയ്ത് ഒപ്റ്റിമൈസേഷൻ മാറ്റങ്ങൾ അനുവദിക്കുക." + തുടരുക - + + ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ ആപ്പ് പുനരാരംഭിക്കുക + പ്രോട്ടോക്കോൾ ബഫർ ലോഗ് ചെയ്യുക + ഡീബഗ് ലോഗുകളിൽ പ്രോട്ടോ ബഫർ ഉൾപ്പെടുന്നു + ഡീബഗ് ലോഗുകളിൽ പ്രോട്ടോ ബഫർ ഉൾപ്പെടുന്നില്ല + "ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നത് അധിക ലേഔട്ട് ഡാറ്റ രേഖപ്പെടുത്താൻ സഹായിക്കും, ചില UI ഘടകങ്ങളുടെ ഓൺ-സ്ക്രീൻ ടെക്സ്റ്റ് ഉൾപ്പെടെ. + +ഇത് കസ്റ്റം ഫിൽട്ടറുകൾ നിർമ്മിക്കുമ്പോൾ ഘടകങ്ങളെ തിരിച്ചറിയാൻ സഹായിക്കും. + +എന്നിരുന്നാലും, ഇത് പ്രവർത്തനക്ഷമമാക്കുന്നത് നിങ്ങളുടെ IP വിലാസം പോലുള്ള ചില ഉപയോക്തൃ ഡാറ്റയും രേഖപ്പെടുത്തും." + @@ -48,40 +85,135 @@ Second \"item\" text" - + ക്രിയേറ്റർ സ്റ്റോർ ഷെൽഫ് മറയ്ക്കുക + വീഡിയോ പ്ലെയറിന് താഴെയുള്ള ക്രിയേറ്റർ സ്റ്റോർ ഷെൽഫ് മറച്ചിരിക്കുന്നു + വീഡിയോ പ്ലെയറിന് താഴെയുള്ള ക്രിയേറ്റർ സ്റ്റോർ ഷെൽഫ് കാണിക്കുന്നു + ഹോം ഫീഡിലെ വീഡിയോകൾക്ക് താഴെയുള്ള കമന്റ്സ് വിഭാഗം മറയ്ക്കുക + ഹോം ഫീഡിലെ വീഡിയോകൾക്ക് താഴെയുള്ള കമന്റ്സ് വിഭാഗം മറച്ചിരിക്കുന്നു + ഹോം ഫീഡിലെ വീഡിയോകൾക്ക് താഴെയുള്ള കമന്റ്സ് വിഭാഗം കാണിക്കുന്നു + + \'ഏറ്റവും പുതിയ വീഡിയോകൾ\' ബട്ടൺ മറയ്ക്കുക + ഏറ്റവും പുതിയ വീഡിയോകൾ ബട്ടൺ മറച്ചിരിക്കുന്നു + ഏറ്റവും പുതിയ വീഡിയോകൾ ബട്ടൺ കാണിക്കുന്നു + + വെബ് തിരയൽ ഫലങ്ങൾ മറയ്ക്കുക + വെബ് തിരയൽ ഫലങ്ങൾ മറച്ചിരിക്കുന്നു + വെബ് തിരയൽ ഫലങ്ങൾ കാണിക്കുന്നു + \'നിങ്ങൾക്കിഷ്ടപ്പെട്ടേക്കാവുന്നവ\' വിഭാഗം മറയ്ക്കുക + \'നിങ്ങൾക്കിഷ്ടപ്പെട്ടേക്കാവുന്നവ\' വിഭാഗം മറച്ചിരിക്കുന്നു + \'നിങ്ങൾക്കിഷ്ടപ്പെട്ടേക്കാവുന്നവ\' വിഭാഗം കാണിക്കുന്നു + This button usually appears in the video player for certain videos. --> + + \'ലൈവ് ചാറ്റ് റീപ്ലേ\' ബട്ടൺ മറയ്ക്കുക + പ്ലെയർ ഓവർലേയിലെ ലൈവ് ചാറ്റ് റീപ്ലേ ബട്ടൺ മറച്ചിരിക്കുന്നു + പ്ലെയർ ഓവർലേയിലെ ലൈവ് ചാറ്റ് റീപ്ലേ ബട്ടൺ കാണിക്കുന്നു + വീഡിയോ തലക്കെട്ട് മറയ്ക്കുക + പ്ലെയർ ഓവർലേയിലെ വീഡിയോ തലക്കെട്ട് മറച്ചിരിക്കുന്നു + പ്ലെയർ ഓവർലേയിലെ വീഡിയോ തലക്കെട്ട് കാണിക്കുന്നു + \'കോഴ്‌സ് പ്രോഗ്രസ്\' മറയ്ക്കുക + കോഴ്‌സ് പ്രോഗ്രസ് വിഭാഗം മറച്ചിരിക്കുന്നു + കോഴ്‌സ് പ്രോഗ്രസ് വിഭാഗം കാണിക്കുന്നു + എക്സ്പ്ലോർ മറയ്ക്കുക + ഈ കോഴ്‌സ് എക്സ്പ്ലോർ ചെയ്യുക, പോഡ്‌കാസ്റ്റ് വിഭാഗങ്ങൾ എക്സ്പ്ലോർ ചെയ്യുക എന്നിവ മറച്ചിരിക്കുന്നു + ഈ കോഴ്‌സ് എക്സ്പ്ലോർ ചെയ്യുക, പോഡ്‌കാസ്റ്റ് വിഭാഗങ്ങൾ എക്സ്പ്ലോർ ചെയ്യുക എന്നിവ കാണിക്കുന്നു + \'ഈ കോഴ്‌സ് എക്സ്പ്ലോർ ചെയ്യുക\' മറയ്ക്കുക + ഈ കോഴ്‌സ് എക്സ്പ്ലോർ ചെയ്യുക വിഭാഗം മറച്ചിരിക്കുന്നു + ഈ കോഴ്‌സ് എക്സ്പ്ലോർ ചെയ്യുക വിഭാഗം കാണിക്കുന്നു + \'പോഡ്‌കാസ്റ്റ് എക്സ്പ്ലോർ ചെയ്യുക\' മറയ്ക്കുക + പോഡ്‌കാസ്റ്റ് എക്സ്പ്ലോർ ചെയ്യുക വിഭാഗം മറച്ചിരിക്കുന്നു + പോഡ്‌കാസ്റ്റ് എക്സ്പ്ലോർ ചെയ്യുക വിഭാഗം കാണിക്കുന്നു + \'ഫീച്ചർ ചെയ്ത സ്ഥലങ്ങൾ\' മറയ്ക്കുക + ഫീച്ചർ ചെയ്ത സ്ഥലങ്ങൾ വിഭാഗം മറച്ചിരിക്കുന്നു + ഫീച്ചർ ചെയ്ത സ്ഥലങ്ങൾ വിഭാഗം കാണിക്കുന്നു + ഫീഡ് ഫ്ലൈഔട്ട് മെനു ഫിൽട്ടർ പ്രവർത്തനക്ഷമമാക്കുക + ഫീഡ് ഫ്ലൈഔട്ട് മെനു ഫിൽട്ടർ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + ഫീഡ് ഫ്ലൈഔട്ട് മെനു ഫിൽട്ടർ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു + ഫീഡ് ഫ്ലൈഔട്ട് മെനു ഫിൽട്ടർ + ഫിൽട്ടർ ചെയ്യാൻ ഫ്ലൈഔട്ട് മെനുവിന്റെ പേരുകൾ ഓരോ വരിയിലും ഒന്നായി നൽകുക + ഗെയിമിംഗ് മറയ്ക്കുക + ഗെയിമിംഗ് വിഭാഗം മറച്ചിരിക്കുന്നു + ഗെയിമിംഗ് വിഭാഗം കാണിക്കുന്നു + സംഗീതം മറയ്ക്കുക + സംഗീത വിഭാഗം മറച്ചിരിക്കുന്നു + സംഗീത വിഭാഗം കാണിക്കുന്നു + ക്വിസുകൾ മറയ്ക്കുക + ക്വിസുകൾ വിഭാഗം മറച്ചിരിക്കുന്നു + ക്വിസുകൾ വിഭാഗം കാണിക്കുന്നു + ചാനൽ ടാബ് ഫിൽട്ടർ പ്രവർത്തനക്ഷമമാക്കുക + ചാനൽ ടാബ് ഫിൽട്ടർ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + ചാനൽ ടാബ് ഫിൽട്ടർ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു + ചാനൽ ടാബ് ഫിൽട്ടർ + ഫിൽട്ടർ ചെയ്യാൻ ചാനൽ ടാബ് പേരുകൾ ഓരോ വരിയിലും ഒന്നായി നൽകുക + "പരിമിതികൾ: +• Shorts ഷെൽഫുകൾ, ചാനൽ പേജുകൾ, തിരയൽ ഫലങ്ങൾ എന്നിവയിൽ ഇപ്പോഴും കാഴ്ച്ചകൾ കാണിച്ചേക്കാം. +• ഈ ഫീച്ചർ ഓട്ടോമോട്ടീവ് ഫോം ഫാക്ടറിൽ പ്രവർത്തിക്കില്ല." + "പരിമിതികൾ: +• Shorts ഷെൽഫുകൾ, ചാനൽ പേജുകൾ, തിരയൽ ഫലങ്ങൾ എന്നിവയിൽ ഇപ്പോഴും അപ്‌ലോഡ് സമയം കാണിച്ചേക്കാം. +• ഈ ഫീച്ചർ ഓട്ടോമോട്ടീവ് ഫോം ഫാക്ടറിൽ പ്രവർത്തിക്കില്ല." + "ഹോം/സബ്‌സ്ക്രിപ്ഷനുകൾ/തിരയൽ ഫലങ്ങൾ കീവേഡ് ശൈലികളുമായി പൊരുത്തപ്പെടുന്ന ഉള്ളടക്കം മറയ്ക്കാൻ ഫിൽട്ടർ ചെയ്തിരിക്കുന്നു + +പരിമിതികൾ: +• Shorts ചാനൽ പേര് ഉപയോഗിച്ച് മറയ്ക്കാൻ കഴിയില്ല +• ചില UI ഘടകങ്ങൾ മറയ്ക്കാൻ കഴിഞ്ഞെന്ന് വരില്ല +• ഒരു കീവേഡിനായി തിരയുമ്പോൾ ഫലങ്ങൾ കാണിക്കില്ലായിരിക്കാം" - + പൂർണ്ണ സ്ക്രീൻ പരസ്യങ്ങൾ മറച്ചിരിക്കുന്നു + പ്ലെയർ പോപ്പ്അപ്പ് പരസ്യങ്ങൾ മറയ്ക്കുക + പ്ലെയർ പോപ്പ്അപ്പ് പരസ്യങ്ങൾ മറച്ചിരിക്കുന്നു + പ്ലെയർ പോപ്പ്അപ്പ് പരസ്യങ്ങൾ കാണിക്കുന്നു + പ്ലെയർ ഓവർലേയിലെ ഉൽപ്പന്നങ്ങൾ കാണിക്കുന്ന ബാനർ മറച്ചിരിക്കുന്നു + പ്ലെയർ ഓവർലേയിലെ ഉൽപ്പന്നങ്ങൾ കാണിക്കുന്ന ബാനർ കാണിക്കുന്നു + YouTube Premium പ്രൊമോഷനുകൾ മറയ്ക്കുക + YouTube Premium പ്രൊമോഷനുകൾ മറച്ചിരിക്കുന്നു + YouTube Premium പ്രൊമോഷനുകൾ കാണിക്കുന്നു - - + + URL ക്ലിപ്‌ബോർഡിലേക്ക് പകർത്തി + ടൈംസ്റ്റാമ്പോടുകൂടിയ URL പകർത്തി + വീഡിയോ URL കോപ്പി ബട്ടൺ കാണിക്കുക + വീഡിയോ URL കോപ്പി ബട്ടൺ കാണിക്കുന്നു. വീഡിയോ URL കോപ്പി ചെയ്യാൻ ടാപ്പുചെയ്യുക. ടൈംസ്റ്റാമ്പോടുകൂടി കോപ്പി ചെയ്യാൻ ടാപ്പുചെയ്ത് പിടിക്കുക + വീഡിയോ URL കോപ്പി ബട്ടൺ കാണിക്കുന്നില്ല + ടൈംസ്റ്റാമ്പ് URL കോപ്പി ബട്ടൺ കാണിക്കുക + ടൈംസ്റ്റാമ്പ് URL കോപ്പി ബട്ടൺ കാണിക്കുന്നു. ടൈംസ്റ്റാമ്പോടുകൂടിയ വീഡിയോ URL കോപ്പി ചെയ്യാൻ ടാപ്പുചെയ്യുക. ടൈംസ്റ്റാമ്പ് ഇല്ലാതെ കോപ്പി ചെയ്യാൻ ടാപ്പുചെയ്ത് പിടിക്കുക + ടൈംസ്റ്റാമ്പ് URL കോപ്പി ബട്ടൺ കാണിക്കുന്നില്ല + - + + \'ടിവിയിലേക്ക് സൈൻ ഇൻ ചെയ്യുക\' പോപ്പ്അപ്പ് പ്രവർത്തനരഹിതമാക്കുക + ടിവിയിലേക്ക് സൈൻ ഇൻ ചെയ്യുക പോപ്പ്അപ്പ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു + ടിവിയിലേക്ക് സൈൻ ഇൻ ചെയ്യുക പോപ്പ്അപ്പ് പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + - + + ടാപ്പ് ടു സീക്ക് പ്രവർത്തനക്ഷമമാക്കുക + ടാപ്പ് ടു സീക്ക് പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + ടാപ്പ് ടു സീക്ക് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + ചില ഉപയോക്തൃ അക്കൗണ്ടുകൾക്ക് മറയ്ക്കൽ പ്രവർത്തിച്ചെന്ന് വരില്ല. - + + നാവിഗേഷൻ ബട്ടണുകൾ + നാവിഗേഷൻ ബാർ ബട്ടണുകൾ മറയ്ക്കുക അല്ലെങ്കിൽ മാറ്റുക + ഹോം മറയ്ക്കുക + ഹോം ബട്ടൺ മറച്ചിരിക്കുന്നു + ഹോം ബട്ടൺ കാണിക്കുന്നു + Shorts മറയ്ക്കുക + Shorts ബട്ടൺ മറച്ചിരിക്കുന്നു + Shorts ബട്ടൺ കാണിക്കുന്നു + ക്രിയേറ്റ് മറയ്ക്കുക + ക്രിയേറ്റ് ബട്ടൺ മറച്ചിരിക്കുന്നു + ക്രിയേറ്റ് ബട്ടൺ കാണിക്കുന്നു + സബ്‌സ്ക്രിപ്ഷനുകൾ മറയ്ക്കുക + സബ്‌സ്ക്രിപ്ഷനുകൾ ബട്ടൺ മറച്ചിരിക്കുന്നു + സബ്‌സ്ക്രിപ്ഷനുകൾ ബട്ടൺ കാണിക്കുന്നു + അറിയിപ്പുകൾ മറയ്ക്കുക + അറിയിപ്പുകൾ ബട്ടൺ മറച്ചിരിക്കുന്നു + അറിയിപ്പുകൾ ബട്ടൺ കാണിക്കുന്നു + ക്രിയേറ്റ് ബട്ടൺ അറിയിപ്പുകൾ ഉപയോഗിച്ച് മാറ്റുക + ക്രിയേറ്റ് ബട്ടൺ അറിയിപ്പുകൾ ബട്ടണുമായി മാറ്റിയിരിക്കുന്നു + ക്രിയേറ്റ് ബട്ടൺ അറിയിപ്പുകൾ ബട്ടണുമായി മാറ്റിയിട്ടില്ല + ഈ ക്രമീകരണം മാറ്റുന്നത് ഫലപ്രദമല്ലെങ്കിൽ, ഇൻകോഗ്നിറ്റോ മോഡിലേക്ക് മാറാൻ ശ്രമിക്കുക. + നാവിഗേഷൻ ബട്ടൺ ലേബലുകൾ മറയ്ക്കുക + ലേബലുകൾ മറച്ചിരിക്കുന്നു + ലേബലുകൾ കാണിക്കുന്നു + നാരോ നാവിഗേഷൻ ബട്ടണുകൾ പ്രവർത്തനക്ഷമമാക്കുക + നാവിഗേഷൻ ബട്ടണുകൾക്കിടയിലുള്ള അകലം കുറവാണ് + നാവിഗേഷൻ ബട്ടണുകൾക്കിടയിലുള്ള അകലം സാധാരണമാണ് + നാവിഗേഷൻ ബാർ ആനിമേഷനുകൾ പ്രവർത്തനക്ഷമമാക്കുക + നാവിഗേഷൻ ട്രാൻസിഷനുകൾ ആനിമേറ്റ് ചെയ്തിരിക്കുന്നു + നാവിഗേഷൻ ട്രാൻസിഷനുകൾ ആനിമേറ്റ് ചെയ്തിട്ടില്ല + ട്രാൻസ്ലൂസന്റ് സ്റ്റാറ്റസ് ബാർ പ്രവർത്തനരഹിതമാക്കുക + സ്റ്റാറ്റസ് ബാർ അതാര്യമാണ് + സ്റ്റാറ്റസ് ബാർ അതാര്യമാണ് അല്ലെങ്കിൽ ട്രാൻസ്ലൂസന്റ് ആണ് + "പരിമിതികൾ: +• വീഡിയോ പ്ലെയറിന് മുകളിൽ ഒരു കറുത്ത ബാർ പ്രത്യക്ഷപ്പെട്ടേക്കാം. +• ചില ഉപകരണങ്ങളിൽ, ഈ ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുന്നത് സിസ്റ്റം നാവിഗേഷൻ ബാറിനെ സുതാര്യമാക്കിയേക്കാം." + ലൈറ്റ് ട്രാൻസ്ലൂസന്റ് ബാർ പ്രവർത്തനരഹിതമാക്കുക + ലൈറ്റ് മോഡ് നാവിഗേഷൻ ബാർ അതാര്യമാണ് + ലൈറ്റ് മോഡ് നാവിഗേഷൻ ബാർ അതാര്യമാണ് അല്ലെങ്കിൽ ട്രാൻസ്ലൂസന്റ് ആണ് + ഡാർക്ക് ട്രാൻസ്ലൂസന്റ് ബാർ പ്രവർത്തനരഹിതമാക്കുക + ഡാർക്ക് മോഡ് നാവിഗേഷൻ ബാർ അതാര്യമാണ് + ഡാർക്ക് മോഡ് നാവിഗേഷൻ ബാർ അതാര്യമാണ് അല്ലെങ്കിൽ ട്രാൻസ്ലൂസന്റ് ആണ് + ടൂൾബാർ + ടൂൾബാർ ഘടകങ്ങൾ മറയ്ക്കുക അല്ലെങ്കിൽ മാറ്റുക + ക്രിയേറ്റ് ബട്ടൺ മറയ്ക്കുക + ക്രിയേറ്റ് ബട്ടൺ മറച്ചിരിക്കുന്നു + ക്രിയേറ്റ് ബട്ടൺ കാണിക്കുന്നു + അറിയിപ്പുകൾ ബട്ടൺ മറയ്ക്കുക + അറിയിപ്പുകൾ ബട്ടൺ മറച്ചിരിക്കുന്നു + അറിയിപ്പുകൾ ബട്ടൺ കാണിക്കുന്നു + തിരയൽ ബട്ടൺ മറയ്ക്കുക + തിരയൽ ബട്ടൺ മറച്ചിരിക്കുന്നു + തിരയൽ ബട്ടൺ കാണിക്കുന്നു. + വിശാലമായ തിരയൽ ബാർ പ്രവർത്തനക്ഷമമാക്കുക + വിശാലമായ തിരയൽ ബാർ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + വിശാലമായ തിരയൽ ബാർ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു @@ -126,25 +315,67 @@ Second \"item\" text" + കൊളാപ്സ് ബട്ടൺ മറയ്ക്കുക + കൊളാപ്സ് ബട്ടൺ മറച്ചിരിക്കുന്നു + കൊളാപ്സ് ബട്ടൺ കാണിക്കുന്നു + പൂർണ്ണ സ്ക്രീൻ ബട്ടൺ മറയ്ക്കുക + പൂർണ്ണ സ്ക്രീൻ ബട്ടൺ മറച്ചിരിക്കുന്നു + പൂർണ്ണ സ്ക്രീൻ ബട്ടൺ കാണിക്കുന്നു + + + എൻഡ് സ്ക്രീൻ കാർഡുകൾ മറയ്ക്കുക + എൻഡ് സ്ക്രീൻ കാർഡുകൾ മറച്ചിരിക്കുന്നു + എൻഡ് സ്ക്രീൻ കാർഡുകൾ കാണിക്കുന്നു - + പൂർണ്ണ സ്ക്രീൻ വലിയ സീക്ക്ബാർ പ്രവർത്തനക്ഷമമാക്കുക + പൂർണ്ണ സ്ക്രീൻ സീക്ക്ബാർ വലിയ വലുപ്പമാണ് + പൂർണ്ണ സ്ക്രീൻ സീക്ക്ബാർ സാധാരണ വലുപ്പമാണ് + ചാനൽ പേജിൽ Shorts മറയ്ക്കുക + ചാനൽ പേജിൽ മറച്ചിരിക്കുന്നു + ചാനൽ പേജിൽ കാണിക്കുന്നു + വീഡിയോ വിവരണത്തിൽ Shorts മറയ്ക്കുക + വീഡിയോ വിവരണത്തിൽ മറച്ചിരിക്കുന്നു + വീഡിയോ വിവരണത്തിൽ കാണിക്കുന്നു + AI ബട്ടൺ മറയ്ക്കുക + AI ബട്ടൺ മറച്ചിരിക്കുന്നു + AI ബട്ടൺ കാണിക്കുന്നു + \'ഓട്ടോ-ഡബ്ബ്ഡ്\' ലേബൽ മറയ്ക്കുക + ഓട്ടോ-ഡബ്ബ്ഡ് ലേബൽ മറച്ചിരിക്കുന്നു + ഓട്ടോ-ഡബ്ബ്ഡ് ലേബൽ കാണിക്കുന്നു + - + + ഓട്ടോപ്ലേ പ്രിവ്യൂ മറയ്ക്കുക + ഓട്ടോപ്ലേ പ്രിവ്യൂ മറച്ചിരിക്കുന്നു + ഓട്ടോപ്ലേ പ്രിവ്യൂ കാണിക്കുന്നു + + + എൻഡ് സ്ക്രീൻ നിർദ്ദേശിച്ച വീഡിയോ മറയ്ക്കുക + "ഓട്ടോപ്ലേ ഓഫായിരിക്കുമ്പോൾ എൻഡ് സ്ക്രീൻ നിർദ്ദേശിച്ച വീഡിയോ മറച്ചിരിക്കുന്നു + +YouTube ക്രമീകരണങ്ങളിൽ ഓട്ടോപ്ലേ മാറ്റാൻ കഴിയും: +ക്രമീകരണങ്ങൾ → പ്ലേബാക്ക് → അടുത്ത വീഡിയോ ഓട്ടോപ്ലേ ചെയ്യുക" + എൻഡ് സ്ക്രീൻ നിർദ്ദേശിച്ച വീഡിയോ കാണിക്കുന്നു + - + + പ്ലെയർ പോപ്പപ്പ് പാനലുകൾ മറയ്ക്കുക + പ്ലെയർ പോപ്പപ്പ് പാനലുകൾ മറച്ചിരിക്കുന്നു + പ്ലെയർ പോപ്പപ്പ് പാനലുകൾ കാണിച്ചിരിക്കുന്നു + @@ -155,10 +386,12 @@ Second \"item\" text" - - + സംഗീത വീഡിയോകളിൽ മാത്രം ഉപയോഗിക്കാനുള്ളതാണ്. സംഗീതമില്ലാത്ത സംഗീത വീഡിയോകളുടെ വിഭാഗങ്ങൾ, മറ്റേതെങ്കിലും വിഭാഗത്തിൽ ഉൾപ്പെടാത്തവ + വിഭാഗം സമർപ്പിക്കാൻ കഴിയില്ല: %s + "വിഭാഗം സമർപ്പിക്കാൻ കഴിയില്ല. +ഇതിനകം നിലവിലുണ്ട്" @@ -170,7 +403,11 @@ Second \"item\" text" - + + പ്രവർത്തനരഹിതമാക്കി + നിറം + കറുപ്പും വെളുപ്പും + @@ -187,7 +424,11 @@ Second \"item\" text" - + + ടാപ്പ് ആൻഡ് ഹോൾഡ് ഹാപ്റ്റിക്സ് പ്രവർത്തനരഹിതമാക്കുക + ടാപ്പ് ആൻഡ് ഹോൾഡ് ഹാപ്റ്റിക്സ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു + ടാപ്പ് ആൻഡ് ഹോൾഡ് ഹാപ്റ്റിക്സ് പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു + @@ -200,6 +441,11 @@ Second \"item\" text" + + പ്രീമിയം ക്വാളിറ്റി ഓപ്ഷനുകൾ മറയ്ക്കുക + പ്രീമിയം ക്വാളിറ്റി ഓപ്ഷനുകൾ മറച്ചിരിക്കുന്നു + പ്രീമിയം ക്വാളിറ്റി ഓപ്ഷനുകൾ കാണിക്കുന്നു + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml index 3a40645452..9cf2059675 100644 --- a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml +++ b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml @@ -27,18 +27,47 @@ Second \"item\" text" + Тод дүрсүүдийг идэвхгүй болгох + Дүрсүүд тод биш байна + Дүрсүүд тод байна + GmsCore + GmsCore-той холбоотой тохиргоо + GmsCore-ийн шинэчлэлтүүдийг шалгах + Шинэчлэлтүүдийг шалгах идэвхжүүлсэн + Шинэчлэл шалгахыг идэвхгүй болгосон + GmsCore Тохиргоог нээх + GmsCore-ийн тохиргоо + MicroG GmsCore суугаагүй байна. Суулгана уу. + Үйлдэл шаардлагатай + MicroG GmsCore-ийн шинэчлэл шалгахад алдаа гарлаа + MicroG GmsCore-ийн шинэ хувилбар (%1$s) бэлэн байна. Одоогоор та %2$s хувилбарыг ашиглаж байна. + "MicroG GmsCore нь ард ажиллах зөвшөөрөлгүй байна.\n\nТаны утасны \"Миний апп-ыг устгаж болохгүй\" гарын авлагыг дагаж, зааврыг MicroG суулгацандаа ашиглана уу.\n\nАпп ажиллахад энэ шаардлагатай." + Вэбсайтыг нээх + Цуцлах + "Алдаа гарахаас урьдчилан сэргийлэхийн тулд MicroG GmsCore-ийн зай хэмнэх оновчлолыг идэвхгүй болгох шаардлагатай.\n\nMicroG-ийн зай хэмнэх оновчлолыг идэвхгүй болгох нь батерейны хэрэглээнд сөргөөр нөлөөлөхгүй.\n\nҮргэлжлүүлэх товчийг дарж, оновчлолын өөрчлөлтийг зөвшөөрнө үү." + Үргэлжлүүлэх - + + Энэ функцийг ашиглахын тулд аппликейшнийг дахин эхлүүлнэ үү + Протокол буферын бүртгэл + Дибаг бүртгэлд прото буфер орсон + Дибаг бүртгэлд прото буфер ороогүй + "Энэ тохиргоог идэвхжүүлэх нь зарим UI бүрэлдэхүүн хэсгүүдийн дэлгэц дээрх текстийг оруулаад нэмэлт байршлын өгөгдлийг бүртгэх болно. + +Энэ нь захиалгат шүүлтүүр үүсгэх үед бүрэлдэхүүн хэсгүүдийг тодорхойлоход тусална. + +Гэсэн хэдий ч, үүнийг идэвхжүүлэх нь таны IP хаяг гэх мэт зарим хэрэглэгчийн өгөгдлийг бүртгэх болно." + @@ -48,40 +77,135 @@ Second \"item\" text" - + Бүтээгчийн дэлгүүрийн тавиурыг нуух + Видео тоглуулагчийн доорх бүтээгчийн дэлгүүрийн тавиур нуугдсан байна + Видео тоглуулагчийн доорх бүтээгчийн дэлгүүрийн тавиур харагдаж байна + Нүүр хуудасны видеоны доорх сэтгэгдлийн хэсгийг нуух + Нүүр хуудасны видеоны доорх сэтгэгдлийн хэсэг нуугдсан байна + Нүүр хуудасны видеоны доорх сэтгэгдлийн хэсэг харагдаж байна + + Шинэ видеонууд товчийг нуух + Шинэ видеонууд товч нуугдсан байна + Шинэ видеонууд товч харагдаж байна + + Вэб хайлтын үр дүнг нуух + Вэб хайлтын үр дүн нуугдсан байна + Вэб хайлтын үр дүн харагдаж байна + \'Таалагдаж магадгүй\' хэсгийг нуух + \'Таалагдаж магадгүй\' хэсэг нуугдсан байна + \'Таалагдаж магадгүй\' хэсэг харагдаж байна + This button usually appears in the video player for certain videos. --> + + Шууд чатын дахин тоглуулах товчийг нуух + Тоглуулагчийн давхарга дахь шууд чатын дахин тоглуулах товч нуугдсан байна + Тоглуулагчийн давхарга дахь шууд чатын дахин тоглуулах товч харагдаж байна + Видеоны гарчгийг нуух + Тоглуулагчийн давхарга дахь видеоны гарчиг нуугдсан байна + Тоглуулагчийн давхарга дахь видеоны гарчиг харагдаж байна + \'Хичээлийн явц\' хэсгийг нуух + Хичээлийн явцын хэсэг нуугдсан байна + Хичээлийн явцын хэсэг харагдаж байна + Судлахыг нуух + Энэ хичээлийг судлах болон подкастыг судлах хэсгүүд нуугдсан байна + Энэ хичээлийг судлах болон подкастыг судлах хэсгүүд харагдаж байна + \'Энэ хичээлийг судлах\' хэсгийг нуух + Энэ хичээлийг судлах хэсэг нуугдсан байна + Энэ хичээлийг судлах хэсэг харагдаж байна + \'Подкастыг судлах\' хэсгийг нуух + Подкастыг судлах хэсэг нуугдсан байна + Подкастыг судлах хэсэг харагдаж байна + \'Онцлох газрууд\' хэсгийг нуух + Онцлох газруудын хэсэг нуугдсан байна + Онцлох газруудын хэсэг харагдаж байна + Мэдээллийн эргүүлгийн нисдэг цэсний шүүлтүүрийг идэвхжүүлэх + Мэдээллийн эргүүлгийн нисдэг цэсний шүүлтүүр идэвхжсэн байна + Мэдээллийн эргүүлгийн нисдэг цэсний шүүлтүүр идэвхгүй болгосон байна + Мэдээллийн эргүүлгийн нисдэг цэсний шүүлтүүр + Шүүх нисдэг цэсний нэрийг мөрөөр тусгаарлан оруулна уу + Тоглоомыг нуух + Тоглоомын хэсэг нуугдсан байна + Тоглоомын хэсэг харагдаж байна + Хөгжмийг нуух + Хөгжмийн хэсэг нуугдсан байна + Хөгжмийн хэсэг харагдаж байна + Асуулт хариултыг нуух + Асуулт хариултын хэсэг нуугдсан байна + Асуулт хариултын хэсэг харагдаж байна + Сувгийн таб шүүлтүүрийг идэвхжүүлэх + Сувгийн таб шүүлтүүр идэвхжсэн байна + Сувгийн таб шүүлтүүр идэвхгүй болгосон байна + Сувгийн таб шүүлтүүр + Шүүх сувгийн таб нэрийг мөрөөр тусгаарлан оруулна уу + "Хязгаарлалт: +• Shorts тавиурууд, сувгийн хуудсууд болон хайлтын үр дүнгүүд үзэлтийн тоог харуулсаар байж болно. +• Энэ функц нь автомашины хэлбэрийн хүчин зүйлтэй ажиллахгүй." + "Хязгаарлалт: +• Shorts тавиурууд, сувгийн хуудсууд болон хайлтын үр дүнгүүд байршуулсан цагийг харуулсаар байж болно. +• Энэ функц нь автомашины хэлбэрийн хүчин зүйлтэй ажиллахгүй." + "Нүүр хуудас/Захиалгууд/Хайлтын үр дүнгүүд түлхүүр үгийн хэллэгүүдтэй таарч байгаа контентыг нуухаар шүүгдсэн байна + +Хязгаарлалт: +• Shorts-ийг сувгийн нэрээр нуух боломжгүй +• Зарим хэрэглэгчийн интерфэйсийн бүрэлдэхүүн хэсгүүд нуугдахгүй байж болно +• Түлхүүр үгээр хайхад үр дүн гарахгүй байж болно" - + Бүтэн дэлгэцийн зар сурталчилгаа нуугдсан байна + Тоглуулагчийн попап зар сурталчилгааг нуух + Тоглуулагчийн попап зар сурталчилгаа нуугдсан байна + Тоглуулагчийн попап зар сурталчилгаа харагдаж байна + Тоглуулагчийн давхарга дахь бүтээгдэхүүн үзэх баннер нуугдсан байна + Тоглуулагчийн давхарга дахь бүтээгдэхүүн үзэх баннер харагдаж байна + YouTube Premium-ийн сурталчилгааг нуух + YouTube Premium-ийн сурталчилгаанууд нуугдсан байна + YouTube Premium-ийн сурталчилгаанууд харагдаж байна - - + + URL хуулбарлагдан санах ойд хадгалагдлаа + Цагийн тэмдэглэгээтэй URL хуулбарлагдан санах ойд хадгалагдлаа + Видео URL хуулах товчийг харуулах + Видео URL хуулах товч харагдаж байна. Видео URL-ийг хуулахын тулд дарна уу. Цагийн тэмдэглэгээтэй хуулахын тулд дарж барина уу + Видео URL хуулах товч харагдахгүй байна + Цагийн тэмдэглэгээтэй URL хуулах товчийг харуулах + Цагийн тэмдэглэгээтэй URL хуулах товч харагдаж байна. Цагийн тэмдэглэгээтэй видео URL-ийг хуулахын тулд дарна уу. Цагийн тэмдэглэгээгүй хуулахын тулд дарж барина уу + Цагийн тэмдэглэгээтэй URL хуулах товч харагдахгүй байна + - + + \'ТВ-д нэвтрэх\' попапыг идэвхгүй болгох + ТВ-д нэвтрэх попап идэвхгүй болсон байна + ТВ-д нэвтрэх попап идэвхжсэн байна + - + + Хайхын тулд дарахад идэвхжүүлэх + Хайхын тулд дарах идэвхжсэн байна + Хайхын тулд дарах идэвхгүй болсон байна + @@ -89,25 +213,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Нуух нь зарим хэрэглэгчийн бүртгэлд ажиллахгүй байж болно. - + + Навигацийн товчлуурууд + Навигацийн мөрний товчлууруудыг нуух эсвэл өөрчлөх + Нүүр хуудсыг нуух + Нүүр хуудас товч нуугдсан байна + Нүүр хуудас товч харагдаж байна + Shorts-ийг нуух + Shorts товч нуугдсан байна + Shorts товч харагдаж байна + Үүсгэхийг нуух + Үүсгэх товч нуугдсан байна + Үүсгэх товч харагдаж байна + Захиалгуудыг нуух + Захиалгын товч нуугдсан байна + Захиалгын товч харагдаж байна + Мэдэгдлүүдийг нуух + Мэдэгдлийн товч нуугдсан байна + Мэдэгдлийн товч харагдаж байна + Үүсгэх товчийг Мэдэгдлийн товчтой солих + Үүсгэх товчийг Мэдэгдлийн товчтой сольсон байна + Үүсгэх товчийг Мэдэгдлийн товчтой солиогүй байна + Хэрэв энэ тохиргоог өөрчлөх нь үр дүнгүй бол, Incognito горим руу шилжиж үзнэ үү. + Навигацийн товчлуурын шошгуудыг нуух + Шошгууд нуугдсан байна + Шошгууд харагдаж байна + Нарийхан навигацийн товчлууруудыг идэвхжүүлэх + Навигацийн товчлууруудын хоорондын зай нарийхан байна + Навигацийн товчлууруудын хоорондын зай хэвийн байна + Навигацийн мөрний хөдөлгөөнт дүрсийг идэвхжүүлэх + Навигацийн шилжилтийн хөдөлгөөнт дүрс идэвхжсэн байна + Навигацийн шилжилтийн хөдөлгөөнт дүрс идэвхгүй байна + Тунгалаг бус статусын мөрийг идэвхгүй болгох + Статусын мөр тунгалаг бус байна + Статусын мөр тунгалаг бус эсвэл тунгалаг байна + "Хязгаарлалт: +• Видео тоглуулагчийн дээд хэсэгт хар судал гарч ирж болно. +• Зарим төхөөрөмж дээр энэ функцийг идэвхжүүлэх нь системийн навигацийн мөрийг тунгалаг болгож болно." + Хөнгөн тунгалаг мөрийг идэвхгүй болгох + Гэрэлтэй горимын навигацийн мөр тунгалаг бус байна + Гэрэлтэй горимын навигацийн мөр тунгалаг бус эсвэл тунгалаг байна + Харанхуй тунгалаг мөрийг идэвхгүй болгох + Харанхуй горимын навигацийн мөр тунгалаг бус байна + Харанхуй горимын навигацийн мөр тунгалаг бус эсвэл тунгалаг байна + Хэрэгслийн самбар + Хэрэгслийн самбарын бүрэлдэхүүн хэсгүүдийг нуух эсвэл өөрчлөх + Үүсгэх товчийг нуух + Үүсгэх товч нуугдсан байна + Үүсгэх товч харагдаж байна + Мэдэгдлийн товчийг нуух + Мэдэгдлийн товч нуугдсан байна + Мэдэгдлийн товч харагдаж байна + Хайх товчийг нуух + Хайх товч нуугдсан байна + Хайх товч харагдаж байна. + Өргөн хайлтын талбарыг идэвхжүүлэх + Өргөн хайлтын талбар идэвхтэй + Өргөн хайлтын талбар идэвхгүй @@ -126,25 +307,67 @@ Second \"item\" text" + Хумих товчийг нуух + Хумих товч нуугдсан байна + Хумих товч харагдаж байна + Бүтэн дэлгэцийн товчийг нуух + Бүтэн дэлгэцийн товч нуугдсан байна + Бүтэн дэлгэцийн товч харагдаж байна + + + Төгсгөлийн дэлгэцийн картуудыг нуух + Төгсгөлийн дэлгэцийн картууд нуугдсан байна + Төгсгөлийн дэлгэцийн картууд харагдаж байна - + Бүтэн дэлгэцийн том хайх мөрийг идэвхжүүлэх + Бүтэн дэлгэцийн хайх мөр том хэмжээтэй байна + Бүтэн дэлгэцийн хайх мөр хэвийн хэмжээтэй байна + Сувгийн хуудсан дээрх Shorts-ийг нуух + Сувгийн хуудсан дээр нуугдсан + Сувгийн хуудсан дээр харагдаж байна + Видеоны тайлбар дахь Shorts-ийг нуух + Видеоны тайлбар дотор нуугдсан + Видеоны тайлбар дотор харагдаж байна + Хиймэл оюун ухааны товчийг нуух + Хиймэл оюун ухааны товч нуугдсан байна + Хиймэл оюун ухааны товч харагдаж байна + \'Автоматаар орчуулсан\' шошгыг нуух + Автоматаар орчуулсан шошго нуугдсан байна + Автоматаар орчуулсан шошго харагдаж байна + - + + Автоматаар тоглуулах урьдчилан харахыг нуух + Автоматаар тоглуулах урьдчилан харах нуугдсан байна + Автоматаар тоглуулах урьдчилан харах харагдаж байна + + + Төгсгөлийн дэлгэцийн санал болгосон видеог нуух + "Автоматаар тоглуулахыг унтраасан үед төгсгөлийн дэлгэцийн санал болгосон видео нуугддаг + +Автоматаар тоглуулахыг YouTube-ийн тохиргооноос өөрчлөх боломжтой: +Тохиргоо → Тоглуулах → Дараагийн видеог автоматаар тоглуулах" + Төгсгөлийн дэлгэцийн санал болгосон видео харагдаж байна + - + + Тоглуулагчийн гарч ирэх самбаруудыг нуух + Тоглуулагчийн гарч ирэх самбарууд нуугдсан + Тоглуулагчийн гарч ирэх самбарууд харагдаж байна + @@ -155,10 +378,12 @@ Second \"item\" text" - - + Зөвхөн хөгжмийн видеонуудад ашиглана. Өөр ангилалд ороогүй, хөгжимгүй хөгжмийн видеоны хэсгүүд + Хэсгийг илгээх боломжгүй: %s + "Хэсгийг илгээх боломжгүй. +Аль хэдийн байна" @@ -170,7 +395,11 @@ Second \"item\" text" - + + Идэвхгүй + Өнгө + Хар ба цагаан + @@ -187,7 +416,11 @@ Second \"item\" text" - + + Дарж барих үеийн мэдрэгчийг идэвхгүй болгох + Дарж барих үеийн мэдрэгч идэвхгүй болсон байна + Дарж барих үеийн мэдрэгч идэвхжсэн байна + @@ -200,6 +433,11 @@ Second \"item\" text" + + Дээд зэргийн чанарын сонголтуудыг нуух + Дээд зэргийн чанарын сонголтууд нуугдсан байна + Дээд зэргийн чанарын сонголтууд харагдаж байна + @@ -207,7 +445,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml index 3a40645452..0a9aefb7ce 100644 --- a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + ठळक चिन्ह अक्षम करा + चिन्ह ठळक नाहीत + चिन्ह ठळक आहेत + GmsCore + GmsCore संबंधित सेटिंग्ज + GmsCore अद्यतनांसाठी तपासा + अद्यतनांसाठी तपासणी सक्षम केली आहे + अपडेट्ससाठी तपासणी अक्षम केली आहे + GmsCore सेटिंग्ज उघडा + GmsCore च्या सेटिंग्ज + MicroG GmsCore स्थापित नाही. ते स्थापित करा. + कृती आवश्यक आहे + MicroG GmsCore अपडेट्स तपासण्यात अयशस्वी. + MicroG GmsCore ची नवीन आवृत्ती (%1$s) उपलब्ध आहे. सध्या, तुम्ही आवृत्ती %2$s वापरत आहात. + "MicroG GmsCore ला पार्श्वभूमीत चालण्याची परवानगी नाही. + +तुमच्या फोनसाठी \"माझे ॲप बंद करू नका\" मार्गदर्शकाचे अनुसरण करा आणि MicroG स्थापनेसाठी सूचना लागू करा. + +ॲप कार्य करण्यासाठी हे आवश्यक आहे." + वेबसाइट उघडा + रद्द करा + "समस्या टाळण्यासाठी MicroG GmsCore बॅटरी ऑप्टिमायझेशन अक्षम करणे आवश्यक आहे. + +MicroG साठी बॅटरी ऑप्टिमायझेशन अक्षम केल्याने बॅटरीच्या वापराला नकारात्मक परिणाम होणार नाही. + +सुरू ठेवा बटणावर टॅप करा आणि ऑप्टिमायझेशन बदलांना अनुमती द्या." + सुरू ठेवा - + + हे वैशिष्ट्य वापरण्यासाठी ॲप रीस्टार्ट करा + प्रोटोकॉल बफर लॉग करा + डीबग लॉग्जमध्ये प्रोटोकॉल बफर समाविष्ट आहे + डीबग लॉग्जमध्ये प्रोटोकॉल बफर समाविष्ट नाही + "हे सेटिंग सक्षम केल्याने अतिरिक्त लेआउट डेटा लॉग केला जाईल, ज्यामध्ये काही UI घटकांसाठी ऑन-स्क्रीन मजकूर समाविष्ट आहे. + +हे सानुकूल फिल्टर तयार करताना घटक ओळखण्यास मदत करू शकते. + +तथापि, हे सक्षम केल्याने तुमचा IP पत्ता यासारखा काही वापरकर्ता डेटा देखील लॉग केला जाईल." + @@ -48,40 +85,135 @@ Second \"item\" text" - + क्रिएटर स्टोअर शेल्फ लपवा + व्हिडिओ प्लेयरच्या खालील क्रिएटर स्टोअर शेल्फ लपवलेला आहे + व्हिडिओ प्लेयरच्या खालील क्रिएटर स्टोअर शेल्फ दिसत आहे + होम फीडमधील व्हिडिओंच्या खालील टिप्पण्या विभाग लपवा + होम फीडमधील व्हिडिओंच्या खालील टिप्पण्या विभाग लपवलेला आहे + होम फीडमधील व्हिडिओंच्या खालील टिप्पण्या विभाग दिसत आहे + + \'नवीनतम व्हिडिओ\' बटण लपवा + नवीनतम व्हिडिओ बटण लपवलेले आहे + नवीनतम व्हिडिओ बटण दिसत आहे + + वेब शोध परिणाम लपवा + वेब शोध परिणाम लपवलेले आहेत + वेब शोध परिणाम दिसत आहेत + \'तुम्हाला आवडू शकणारे\' विभाग लपवा + \'तुम्हाला आवडू शकणारे\' विभाग लपवलेला आहे + \'तुम्हाला आवडू शकणारे\' विभाग दिसत आहे + This button usually appears in the video player for certain videos. --> + + \'लाइव्ह चॅट रिप्ले\' बटण लपवा + प्लेअर ओव्हरलेमधील लाइव्ह चॅट रिप्ले बटण लपवलेले आहे + प्लेअर ओव्हरलेमधील लाइव्ह चॅट रिप्ले बटण दिसत आहे + व्हिडिओ शीर्षक लपवा + प्लेअर ओव्हरलेमधील व्हिडिओ शीर्षक लपवलेले आहे + प्लेअर ओव्हरलेमधील व्हिडिओ शीर्षक दिसत आहे + \'अभ्यासक्रम प्रगती\' लपवा + अभ्यासक्रम प्रगती विभाग लपवलेला आहे + अभ्यासक्रम प्रगती विभाग दिसत आहे + एक्सप्लोर लपवा + हा अभ्यासक्रम एक्सप्लोर करा आणि पॉडकास्ट एक्सप्लोर करा हे विभाग लपवलेले आहेत + हा अभ्यासक्रम एक्सप्लोर करा आणि पॉडकास्ट एक्सप्लोर करा हे विभाग दिसत आहेत + \'हा अभ्यासक्रम एक्सप्लोर करा\' लपवा + हा अभ्यासक्रम एक्सप्लोर करा विभाग लपवलेला आहे + हा अभ्यासक्रम एक्सप्लोर करा विभाग दिसत आहे + \'पॉडकास्ट एक्सप्लोर करा\' लपवा + पॉडकास्ट एक्सप्लोर करा विभाग लपवलेला आहे + पॉडकास्ट एक्सप्लोर करा विभाग दिसत आहे + \'वैशिष्ट्यीकृत ठिकाणे\' लपवा + वैशिष्ट्यीकृत ठिकाणे विभाग लपवलेला आहे + वैशिष्ट्यीकृत ठिकाणे विभाग दिसत आहे + फीड फ्लायआउट मेनू फिल्टर सक्षम करा + फीड फ्लायआउट मेनू फिल्टर सक्षम केलेला आहे + फीड फ्लायआउट मेनू फिल्टर अक्षम केलेला आहे + फीड फ्लायआउट मेनू फिल्टर + फिल्टर करण्यासाठी फ्लायआउट मेनूची नावे प्रविष्ट करा, प्रत्येक ओळीत एक + गेमिंग लपवा + गेमिंग विभाग लपवलेला आहे + गेमिंग विभाग दिसत आहे + संगीत लपवा + संगीत विभाग लपवलेला आहे + संगीत विभाग दिसत आहे + क्विझ लपवा + क्विझ विभाग लपवलेला आहे + क्विझ विभाग दिसत आहे + चॅनल टॅब फिल्टर सक्षम करा + चॅनल टॅब फिल्टर सक्षम केलेला आहे + चॅनल टॅब फिल्टर अक्षम केलेला आहे + चॅनल टॅब फिल्टर + फिल्टर करण्यासाठी चॅनल टॅबची नावे प्रविष्ट करा, प्रत्येक ओळीत एक + "मर्यादा: +• Shorts शेल्फ्ज, चॅनेल पृष्ठे आणि शोध परिणामांमध्ये अजूनही दृश्यांची संख्या दिसू शकते. +• हे वैशिष्ट्य ऑटोमोटिव्ह फॉर्म फॅक्टरसोबत काम करत नाही." + "मर्यादा: +• Shorts शेल्फ्ज, चॅनेल पृष्ठे आणि शोध परिणामांमध्ये अजूनही अपलोडची वेळ दिसू शकते. +• हे वैशिष्ट्य ऑटोमोटिव्ह फॉर्म फॅक्टरसोबत काम करत नाही." + "कीवर्ड वाक्यांश जुळणारी सामग्री लपवण्यासाठी होम/सदस्यता/शोध परिणाम फिल्टर केलेले आहेत + +मर्यादा: +• Shorts चॅनेलच्या नावाने लपवता येत नाहीत +• काही UI घटक लपवले जाऊ शकत नाहीत +• कीवर्ड शोधल्यास कोणतेही परिणाम दिसू शकत नाहीत" - + पूर्ण-स्क्रीन जाहिराती लपवलेल्या आहेत + प्लेअर पॉपअप जाहिराती लपवा + प्लेअर पॉपअप जाहिराती लपवलेल्या आहेत + प्लेअर पॉपअप जाहिराती दिसत आहेत + प्लेअर ओव्हरलेमधील उत्पादने पाहण्यासाठीचे बॅनर लपवलेले आहे + प्लेअर ओव्हरलेमधील उत्पादने पाहण्यासाठीचे बॅनर दिसत आहे + YouTube Premium च्या जाहिराती लपवा + YouTube Premium च्या जाहिराती लपवलेल्या आहेत + YouTube Premium च्या जाहिराती दिसत आहेत - - + + URL क्लिपबोर्डवर कॉपी केली + टाइमस्टॅम्पसह URL कॉपी केली + व्हिडिओ URL कॉपी करा बटण दाखवा + व्हिडिओ URL कॉपी करा बटण दिसत आहे. व्हिडिओ URL कॉपी करण्यासाठी टॅप करा. टाइमस्टॅम्पसह कॉपी करण्यासाठी टॅप करून धरून ठेवा + व्हिडिओ URL कॉपी करा बटण दिसत नाही + टाइमस्टॅम्प URL कॉपी करा बटण दाखवा + टाइमस्टॅम्प URL कॉपी करा बटण दिसत आहे. टाइमस्टॅम्पसह व्हिडिओ URL कॉपी करण्यासाठी टॅप करा. टाइमस्टॅम्पशिवाय कॉपी करण्यासाठी टॅप करून धरून ठेवा + टाइमस्टॅम्प URL कॉपी करा बटण दिसत नाही + - + + \'टीव्हीवर साइन इन करा\' पॉपअप अक्षम करा + टीव्हीवर साइन इन करा पॉपअप अक्षम केलेला आहे + टीव्हीवर साइन इन करा पॉपअप सक्षम केलेला आहे + - + + टॅप करून शोधणे सक्षम करा + टॅप करून शोधणे सक्षम केले आहे + टॅप करून शोधणे अक्षम केले आहे + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + काही वापरकर्ता खात्यांसाठी लपवणे काम करू शकत नाही. - + + नेव्हिगेशन बटणे + नेव्हिगेशन बार बटणे लपवा किंवा बदला + होम लपवा + होम बटण लपवलेले आहे + होम बटण दिसत आहे + Shorts लपवा + Shorts बटण लपवलेले आहे + Shorts बटण दिसत आहे + तयार करा लपवा + तयार करा बटण लपवलेले आहे + तयार करा बटण दिसत आहे + सदस्यत्वे लपवा + सदस्यत्वे बटण लपवलेले आहे + सदस्यत्वे बटण दिसत आहे + सूचना लपवा + सूचना बटण लपवलेले आहे + सूचना बटण दिसत आहे + तयार करा बटणाची अदलाबदल सूचना बटणासोबत करा + तयार करा बटणाची अदलाबदल सूचना बटणासोबत केलेली आहे + तयार करा बटणाची अदलाबदल सूचना बटणासोबत केलेली नाही + जर ही सेटिंग बदलल्याने परिणाम दिसत नसेल, तर गुप्त मोडवर स्विच करण्याचा प्रयत्न करा. + नेव्हिगेशन बटण लेबले लपवा + लेबले लपवलेली आहेत + लेबले दिसत आहेत + अरुंद नेव्हिगेशन बटणे सक्षम करा + नेव्हिगेशन बटणांमधील अंतर अरुंद आहे + नेव्हिगेशन बटणांमधील अंतर सामान्य आहे + नेव्हिगेशन बार ॲनिमेशन सक्षम करा + नेव्हिगेशन संक्रमण ॲनिमेटेड आहेत + नेव्हिगेशन संक्रमण ॲनिमेटेड नाहीत + पारदर्शक स्थिती बार अक्षम करा + स्थिती बार अपारदर्शक आहे + स्थिती बार अपारदर्शक किंवा पारदर्शक आहे + "मर्यादा: +• व्हिडिओ प्लेयरच्या शीर्षस्थानी एक काळी पट्टी दिसू शकते. +• काही उपकरणांवर, हे वैशिष्ट्य सक्षम केल्यास सिस्टम नेव्हिगेशन बार पारदर्शक होऊ शकतो." + हलकी पारदर्शक पट्टी अक्षम करा + लाइट मोड नेव्हिगेशन बार अपारदर्शक आहे + लाइट मोड नेव्हिगेशन बार अपारदर्शक किंवा पारदर्शक आहे + गडद पारदर्शक पट्टी अक्षम करा + डार्क मोड नेव्हिगेशन बार अपारदर्शक आहे + डार्क मोड नेव्हिगेशन बार अपारदर्शक किंवा पारदर्शक आहे + टूलबार + टूलबार घटक लपवा किंवा बदला + तयार करा बटण लपवा + तयार करा बटण लपवलेले आहे + तयार करा बटण दिसत आहे + सूचना बटण लपवा + सूचना बटण लपवलेले आहे + सूचना बटण दिसत आहे + शोध बटण लपवा + शोध बटण लपवलेले आहे + शोध बटण दिसत आहे. + रुंद शोध बार सक्षम करा + रुंद शोध बार सक्षम केला आहे + रुंद शोध बार अक्षम केला आहे @@ -126,25 +315,67 @@ Second \"item\" text" + कोलॅप्स बटण लपवा + कोलॅप्स बटण लपवलेले आहे + कोलॅप्स बटण दिसत आहे + पूर्ण-स्क्रीन बटण लपवा + पूर्ण-स्क्रीन बटण लपवलेले आहे + पूर्ण-स्क्रीन बटण दिसत आहे + + + एंड स्क्रीन कार्ड्स लपवा + एंड स्क्रीन कार्ड्स लपवलेले आहेत + एंड स्क्रीन कार्ड्स दिसत आहेत - + पूर्ण-स्क्रीनमध्ये मोठा सीकबार सक्षम करा + पूर्ण-स्क्रीन सीकबार मोठ्या आकाराचा आहे + पूर्ण-स्क्रीन सीकबार सामान्य आकाराचा आहे + चॅनेल पृष्ठावर Shorts लपवा + चॅनेल पृष्ठावर लपवलेले आहे + चॅनेल पृष्ठावर दिसत आहे + व्हिडिओ वर्णनात Shorts लपवा + व्हिडिओ वर्णनात लपवलेले आहे + व्हिडिओ वर्णनात दिसत आहे + AI बटण लपवा + AI बटण लपवलेले आहे + AI बटण दिसत आहे + \'ऑटो-डब केलेले\' लेबल लपवा + ऑटो-डब केलेले लेबल लपवलेले आहे + ऑटो-डब केलेले लेबल दिसत आहे + - + + स्वयं-प्ले पूर्वावलोकन लपवा + स्वयं-प्ले पूर्वावलोकन लपवलेले आहे + स्वयं-प्ले पूर्वावलोकन दिसत आहे + + + एंड स्क्रीन सुचवलेला व्हिडिओ लपवा + "जेव्हा स्वयं-प्ले बंद असतो, तेव्हा एंड स्क्रीन सुचवलेला व्हिडिओ लपवला जातो + +YouTube सेटिंग्जमध्ये स्वयं-प्ले बदलता येतो: +सेटिंग्ज → प्लेबॅक → पुढील व्हिडिओ स्वयं-प्ले करा" + एंड स्क्रीन सुचवलेला व्हिडिओ दिसत आहे + - + + प्लेअरचे पॉपअप पॅनेल लपवा + प्लेअरची पॉपअप पॅनेल लपविली आहेत + प्लेअरची पॉपअप पॅनेल दर्शविली आहेत + @@ -155,10 +386,12 @@ Second \"item\" text" - - + केवळ संगीत व्हिडिओमध्ये वापरण्यासाठी. संगीत नसलेल्या संगीत व्हिडिओंचे विभाग, जे आधीपासून इतर कोणत्याही श्रेणीमध्ये समाविष्ट नाहीत + विभाग सबमिट करता येत नाही: %s + "विभाग सबमिट करता येत नाही. +आधीपासून अस्तित्वात आहे" @@ -170,7 +403,11 @@ Second \"item\" text" - + + अक्षम केले + रंग + काळा आणि पांढरा + @@ -187,7 +424,11 @@ Second \"item\" text" - + + टॅप आणि धरून ठेवण्याचे हॅप्टिक्स अक्षम करा + टॅप आणि धरून ठेवण्याचे हॅप्टिक्स अक्षम केले आहे + टॅप आणि धरून ठेवण्याचे हॅप्टिक्स सक्षम केले आहे + @@ -200,6 +441,11 @@ Second \"item\" text" + + प्रीमियम गुणवत्ता पर्याय लपवा + प्रीमियम गुणवत्ता पर्याय लपवलेले आहेत + प्रीमियम गुणवत्ता पर्याय दिसत आहेत + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml index ead3215d88..d45d5507f4 100644 --- a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml +++ b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Lumpuhkan ikon tebal + Ikon tidak tebal + Ikon tebal + GmsCore + Tetapan berkaitan GmsCore + Semak kemas kini GmsCore + Semakan kemas kini didayakan + Pemeriksaan kemas kini dilumpuhkan + Buka Tetapan GmsCore + Tetapan GmsCore + MicroG GmsCore tidak dipasang. Pasang. + Tindakan diperlukan + Gagal menyemak kemas kini MicroG GmsCore + Versi baharu (%1$s) MicroG GmsCore tersedia. Pada masa ini, anda menggunakan versi %2$s. + "MicroG GmsCore tiada kebenaran untuk berjalan di latar belakang. + +Ikuti panduan \"Jangan bunuh apl saya\" untuk telefon anda, dan gunakan arahan pada pemasangan MicroG anda. + +Ini diperlukan agar apl berfungsi." + Buka laman web + Batal + "Pengoptimuman bateri MicroG GmsCore mesti dilumpuhkan untuk mengelakkan isu. + +Melumpuhkan pengoptimuman bateri untuk MicroG tidak akan menjejaskan penggunaan bateri secara negatif. + +Sentuh butang teruskan dan benarkan perubahan pengoptimuman." + Teruskan - + + Mulakan semula aplikasi untuk menggunakan ciri ini + Log penampan protokol + Log nyahpepijat termasuk penampan proto + Log nyahpepijat tidak termasuk penampan proto + "Mendayakan tetapan ini akan mencatat data susun atur tambahan, termasuk teks pada skrin untuk beberapa komponen UI. + +Ini boleh membantu mengenal pasti komponen semasa membuat penapis tersuai. + +Walau bagaimanapun, mendayakan ini juga akan mencatat beberapa data pengguna seperti alamat IP anda." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Sembunyikan rak kedai pencipta + Rak kedai pencipta di bawah pemain video disembunyikan + Rak kedai pencipta di bawah pemain video dipaparkan + Sembunyikan bahagian komen di bawah video dalam suapan Utama + Bahagian komen di bawah video dalam suapan Utama disembunyikan + Bahagian komen di bawah video dalam suapan Utama dipaparkan + + Sembunyikan butang \'Video terkini\' + Butang video terkini disembunyikan + Butang video terkini dipaparkan + + Sembunyikan hasil carian web + Hasil carian web disembunyikan + Hasil carian web dipaparkan + Sembunyikan bahagian \'Anda mungkin suka\' + Bahagian \'Anda mungkin suka\' disembunyikan + Bahagian \'Anda mungkin suka\' dipaparkan + This button usually appears in the video player for certain videos. --> + + Sembunyikan butang \'Tayangan semula sembang langsung\' + Butang tayangan semula sembang langsung dalam tindihan pemain disembunyikan + Butang tayangan semula sembang langsung dalam tindihan pemain dipaparkan + Sembunyikan tajuk video + Tajuk video dalam tindihan pemain disembunyikan + Tajuk video dalam tindihan pemain dipaparkan + Sembunyikan \'Kemajuan kursus\' + Bahagian kemajuan kursus disembunyikan + Bahagian kemajuan kursus dipaparkan + Sembunyikan Teroka + Bahagian Teroka kursus ini dan Teroka podcast disembunyikan + Bahagian Teroka kursus ini dan Teroka podcast dipaparkan + Sembunyikan \'Teroka kursus ini\' + Bahagian Teroka kursus ini disembunyikan + Bahagian Teroka kursus ini dipaparkan + Sembunyikan \'Teroka podcast\' + Bahagian Teroka podcast disembunyikan + Bahagian Teroka podcast dipaparkan + Sembunyikan \'Tempat pilihan\' + Bahagian tempat pilihan disembunyikan + Bahagian tempat pilihan dipaparkan + Dayakan penapis menu terbang keluar suapan + Penapis menu terbang keluar suapan didayakan + Penapis menu terbang keluar suapan dilumpuhkan + Penapis menu terbang keluar suapan + Masukkan nama menu terbang keluar untuk ditapis, satu per baris + Sembunyikan Permainan + Bahagian Permainan disembunyikan + Bahagian Permainan dipaparkan + Sembunyikan Muzik + Bahagian Muzik disembunyikan + Bahagian Muzik dipaparkan + Sembunyikan Kuiz + Bahagian Kuiz disembunyikan + Bahagian Kuiz dipaparkan + Dayakan penapis tab saluran + Penapis tab saluran didayakan + Penapis tab saluran dilumpuhkan + Penapis tab saluran + Masukkan nama tab saluran untuk ditapis, satu per baris + "Had: +• Rak Shorts, halaman saluran, dan hasil carian mungkin masih memaparkan jumlah tontonan. +• Ciri ini tidak berfungsi dengan faktor bentuk automotif." + "Had: +• Rak Shorts, halaman saluran, dan hasil carian mungkin masih memaparkan masa muat naik. +• Ciri ini tidak berfungsi dengan faktor bentuk automotif." + "Hasil carian Utama/Langganan/ditapis untuk menyembunyikan kandungan yang sepadan dengan frasa kata kunci + +Had: +• Shorts tidak boleh disembunyikan mengikut nama saluran +• Sesetengah komponen UI mungkin tidak disembunyikan +• Mencari kata kunci mungkin tidak menunjukkan hasil" - + Iklan skrin penuh disembunyikan + Sembunyikan iklan pop timbul pemain + Iklan pop timbul pemain disembunyikan + Iklan pop timbul pemain dipaparkan + Sepanduk lihat produk dalam tindihan pemain disembunyikan + Sepanduk lihat produk dalam tindihan pemain dipaparkan + Sembunyikan promosi YouTube Premium + Promosi YouTube Premium disembunyikan + Promosi YouTube Premium dipaparkan - - + + URL disalin ke papan keratan + URL dengan cap waktu disalin + Paparkan butang salin URL video + Butang salin URL video dipaparkan. Ketik untuk menyalin URL video. Ketik dan tahan untuk menyalin dengan cap waktu + Butang salin URL video tidak dipaparkan + Paparkan butang salin URL cap waktu + Butang salin URL cap waktu dipaparkan. Ketik untuk menyalin URL video dengan cap waktu. Ketik dan tahan untuk menyalin tanpa cap waktu + Butang salin URL cap waktu tidak dipaparkan + - + + Lumpuhkan pop timbul \'Log masuk ke TV\' + Pop timbul Log masuk ke TV dilumpuhkan + Pop timbul Log masuk ke TV didayakan + - + + Dayakan ketik untuk mencari + Ketik untuk mencari didayakan + Ketik untuk mencari dilumpuhkan + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Penyembunyian mungkin tidak berfungsi untuk sesetengah akaun pengguna. - + + Butang navigasi + Sembunyikan atau tukar butang bar navigasi + Sembunyikan Utama + Butang Utama disembunyikan + Butang Utama dipaparkan + Sembunyikan Shorts + Butang Shorts disembunyikan + Butang Shorts dipaparkan + Sembunyikan Cipta + Butang Cipta disembunyikan + Butang Cipta dipaparkan + Sembunyikan Langganan + Butang Langganan disembunyikan + Butang Langganan dipaparkan + Sembunyikan Pemberitahuan + Butang Pemberitahuan disembunyikan + Butang Pemberitahuan dipaparkan + Tukar Cipta dengan Pemberitahuan + Butang Cipta ditukar dengan butang Pemberitahuan + Butang Cipta tidak ditukar dengan butang Pemberitahuan + Jika menukar tetapan ini tidak berkuat kuasa, cuba tukar ke mod Inkognito. + Sembunyikan label butang navigasi + Label disembunyikan + Label dipaparkan + Dayakan butang navigasi sempit + Jarak antara butang navigasi adalah sempit + Jarak antara butang navigasi adalah normal + Dayakan animasi bar navigasi + Peralihan navigasi dianimasikan + Peralihan navigasi tidak dianimasikan + Lumpuhkan bar status lutsinar + Bar status legap + Bar status legap atau lutsinar + "Had: +• Bar hitam mungkin muncul di bahagian atas pemain video. +• Pada sesetengah peranti, mendayakan ciri ini boleh menukar bar navigasi sistem kepada telus." + Lumpuhkan bar lutsinar cahaya + Bar navigasi mod cahaya adalah legap + Bar navigasi mod cahaya adalah legap atau lutsinar + Lumpuhkan bar lutsinar gelap + Bar navigasi mod gelap adalah legap + Bar navigasi mod gelap adalah legap atau lutsinar + Bar alat + Sembunyikan atau tukar komponen bar alat + Sembunyikan butang Cipta + Butang Cipta disembunyikan + Butang Cipta dipaparkan + Sembunyikan butang Pemberitahuan + Butang Pemberitahuan disembunyikan + Butang Pemberitahuan dipaparkan + Sembunyikan butang Carian + Butang Carian disembunyikan + Butang Carian dipaparkan. + Dayakan bar carian lebar + Bar carian lebar didayakan + Bar carian lebar dilumpuhkan @@ -126,25 +315,67 @@ Second \"item\" text" + Sembunyikan butang Runtuhkan + Butang Runtuhkan disembunyikan + Butang Runtuhkan dipaparkan + Sembunyikan butang Skrin Penuh + Butang Skrin Penuh disembunyikan + Butang Skrin Penuh dipaparkan + + + Sembunyikan kad skrin akhir + Kad skrin akhir disembunyikan + Kad skrin akhir dipaparkan - + Dayakan bar cari besar skrin penuh + Bar cari skrin penuh bersaiz besar + Bar cari skrin penuh bersaiz normal + Sembunyikan Shorts di halaman saluran + Disembunyikan di halaman saluran + Dipaparkan di halaman saluran + Sembunyikan Shorts dalam perihalan video + Disembunyikan dalam perihalan video + Dipaparkan dalam perihalan video + Sembunyikan butang AI + Butang AI disembunyikan + Butang AI dipaparkan + Sembunyikan label \'Alih suara automatik\' + Label alih suara automatik disembunyikan + Label alih suara automatik dipaparkan + - + + Sembunyikan pratonton main automatik + Pratonton main automatik disembunyikan + Pratonton main automatik dipaparkan + + + Sembunyikan video yang dicadangkan di skrin akhir + "Video yang dicadangkan di skrin akhir disembunyikan apabila main automatik dimatikan + +Main automatik boleh diubah dalam tetapan YouTube: +Tetapan → Main balik → Main video seterusnya secara automatik" + Video yang dicadangkan di skrin akhir dipaparkan + - + + Sembunyikan panel pop timbul pemain + Panel pop timbul pemain disembunyikan + Panel pop timbul pemain dipaparkan + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Hanya untuk digunakan dalam video muzik. Bahagian video muzik tanpa muzik, yang belum diliputi oleh kategori lain + Tidak dapat menyerahkan segmen: %s + "Tidak dapat menyerahkan segmen. +Sudah wujud" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Dilumpuhkan + Warna + Hitam dan putih + @@ -189,7 +426,11 @@ Second \"item\" text" - + + Lumpuhkan haptik ketik dan tahan + Haptik ketik dan tahan dilumpuhkan + Haptik ketik dan tahan didayakan + @@ -202,6 +443,11 @@ Second \"item\" text" + + Sembunyikan pilihan kualiti Premium + Pilihan kualiti Premium disembunyikan + Pilihan kualiti Premium dipaparkan + @@ -209,7 +455,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-my-rMM/strings.xml b/patches/src/main/resources/addresources/values-my-rMM/strings.xml index 3a40645452..1384a21755 100644 --- a/patches/src/main/resources/addresources/values-my-rMM/strings.xml +++ b/patches/src/main/resources/addresources/values-my-rMM/strings.xml @@ -27,18 +27,53 @@ Second \"item\" text" + ဖောင့်ထူသော အိုင်ကွန်များကို ပိတ်ပါ + အိုင်ကွန်များသည် ဖောင့်ထူမထားပါ + အိုင်ကွန်များသည် ဖောင့်ထူထားပါသည် + GmsCore + GmsCore နှင့်ပတ်သက်သော ဆက်တင်များ + GmsCore အပ်ဒိတ်များ စစ်ဆေးရန် + အပ်ဒိတ်များ စစ်ဆေးခြင်းကို ဖွင့်ထားသည် + အပ်ဒိတ်များ စစ်ဆေးခြင်းကို ပိတ်ထားသည်။ + GmsCore ဆက်တင်များ ဖွင့်ပါ။ + GmsCore ၏ ဆက်တင်များ + MicroG GmsCore ထည့်သွင်းမထားပါ။ ထည့်သွင်းပါ။ + ဆောင်ရွက်ရန် လိုအပ်သည်။ + MicroG GmsCore အပ်ဒိတ်များ စစ်ဆေးမအောင်မြင်ပါ။ + MicroG GmsCore ၏ ဗားရှင်းအသစ် (%1$s) ရရှိနိုင်ပါသည်။ လက်ရှိတွင် သင်သည် ဗားရှင်း %2$s ကို အသုံးပြုနေပါသည်။ + "MicroG GmsCore သည် နောက်ခံတွင် အလုပ်လုပ်ရန် ခွင့်ပြုချက်မရှိပါ။ + +သင့်ဖုန်းအတွက် “ကျွန်ုပ်၏အက်ပ်ကို မပိတ်ပါနှင့်” လမ်းညွှန်ကို လိုက်နာပြီး သင့် MicroG ထည့်သွင်းမှုအတွက် ညွှန်ကြားချက်များကို အသုံးပြုပါ။ + +အက်ပ်အလုပ်လုပ်ရန် ၎င်းသည် လိုအပ်ပါသည်။" + ဝက်ဘ်ဆိုက်ဖွင့်ပါ။ + ပယ်ဖျက်ပါ။ + "ပြဿနာများ ကာကွယ်ရန် MicroG GmsCore ဘက်ထရီ အကောင်းဆုံးပြုလုပ်ခြင်းကို ပိတ်ထားရမည်။ + +MicroG အတွက် ဘက်ထရီ အကောင်းဆုံးပြုလုပ်ခြင်းကို ပိတ်ထားခြင်းသည် ဘက်ထရီအသုံးပြုမှုကို ဆိုးကျိုးသက်ရောက်စေမည် မဟုတ်ပါ။ + +ဆက်လုပ်ရန် ခလုတ်ကို နှိပ်ပြီး အကောင်းဆုံးပြုလုပ်ခြင်း ပြောင်းလဲမှုများကို ခွင့်ပြုပါ။" + ဆက်လုပ်ပါ။ - + + ဤအင်္ဂါရပ်ကို အသုံးပြုရန် အက်ပ်ကို ပြန်လည်စတင်ပါ + ပရိုတိုကောလ် ဘတ်ဖာ မှတ်တမ်း + ဒီဘတ်မှတ်တမ်းများတွင် ပရိုတိုဘတ်ဖာ ပါဝင်သည် + ဒီဘတ်မှတ်တမ်းများတွင် ပရိုတိုဘတ်ဖာ မပါဝင်ပါ + "ဤဆက်တင်ကိုဖွင့်ထားခြင်းသည် အချို့သော UI အစိတ်အပိုင်းများအတွက် မျက်နှာပြင်ပေါ်ရှိ စာသားအပါအဝင် အပိုဆောင်း layout ဒေတာများကို မှတ်တမ်းတင်ပါလိမ့်မည်။ +၎င်းသည် စိတ်ကြိုက် filter များ ဖန်တီးသည့်အခါ အစိတ်အပိုင်းများကို ခွဲခြားသိမြင်နိုင်ရန် ကူညီပေးနိုင်ပါသည်။ +သို့သော်၊ ၎င်းကိုဖွင့်ထားခြင်းသည် သင်၏ IP လိပ်စာကဲ့သို့သော အချို့သော အသုံးပြုသူဒေတာများကိုလည်း မှတ်တမ်းတင်ပါလိမ့်မည်။" + @@ -48,40 +83,135 @@ Second \"item\" text" - + ဖန်တီးရှင်စတိုးစင်ကို ဖျောက်ပါ + ဗီဒီယိုဖွင့်စက်အောက်ရှိ ဖန်တီးရှင်စတိုးစင်ကို ဖျောက်ထားသည် + ဗီဒီယိုဖွင့်စက်အောက်ရှိ ဖန်တီးရှင်စတိုးစင်ကို ပြသထားသည် + Home feed ရှိ ဗီဒီယိုများအောက်ရှိ မှတ်ချက်များအပိုင်းကို ဖျောက်ပါ + Home feed ရှိ ဗီဒီယိုများအောက်ရှိ မှတ်ချက်များအပိုင်းကို ဖျောက်ထားသည် + Home feed ရှိ ဗီဒီယိုများအောက်ရှိ မှတ်ချက်များအပိုင်းကို ပြသထားသည် + + \'နောက်ဆုံးထွက်ဗီဒီယိုများ\' ခလုတ်ကို ဖျောက်ပါ + နောက်ဆုံးထွက်ဗီဒီယိုများ ခလုတ်ကို ဖျောက်ထားသည် + နောက်ဆုံးထွက်ဗီဒီယိုများ ခလုတ်ကို ပြသထားသည် + + ဝဘ်ရှာဖွေမှုရလဒ်များကို ဖျောက်ပါ + ဝဘ်ရှာဖွေမှုရလဒ်များကို ဖျောက်ထားသည် + ဝဘ်ရှာဖွေမှုရလဒ်များကို ပြသထားသည် + \'\'သင်ကြိုက်နှစ်သက်နိုင်သည်\'\' အပိုင်းကို ဖျောက်ပါ + \'\'သင်ကြိုက်နှစ်သက်နိုင်သည်\'\' အပိုင်းကို ဖျောက်ထားသည် + \'\'သင်ကြိုက်နှစ်သက်နိုင်သည်\'\' အပိုင်းကို ပြသထားသည် + This button usually appears in the video player for certain videos. --> + + \'တိုက်ရိုက်စကားပြောပြန်လည်ကြည့်ရှုခြင်း\' ခလုတ်ကို ဖျောက်ပါ + ပလေယာအပေါ်လွှာရှိ တိုက်ရိုက်စကားပြောပြန်လည်ကြည့်ရှုခြင်းခလုတ်ကို ဖျောက်ထားသည် + ပလေယာအပေါ်လွှာရှိ တိုက်ရိုက်စကားပြောပြန်လည်ကြည့်ရှုခြင်းခလုတ်ကို ပြသထားသည် + ဗီဒီယိုခေါင်းစဉ်ကို ဖျောက်ပါ + ပလေယာအပေါ်လွှာရှိ ဗီဒီယိုခေါင်းစဉ်ကို ဖျောက်ထားသည် + ပလေယာအပေါ်လွှာရှိ ဗီဒီယိုခေါင်းစဉ်ကို ပြသထားသည် + \'သင်တန်းတိုးတက်မှု\' ကို ဖျောက်ပါ + သင်တန်းတိုးတက်မှုအပိုင်းကို ဖျောက်ထားသည် + သင်တန်းတိုးတက်မှုအပိုင်းကို ပြသထားသည် + စူးစမ်းလေ့လာမည်ကို ဖျောက်ပါ + ဤသင်တန်းကို စူးစမ်းလေ့လာမည်နှင့် ပေါ့ဒ်ကတ်စ်များကို စူးစမ်းလေ့လာမည် အပိုင်းများကို ဖျောက်ထားသည် + ဤသင်တန်းကို စူးစမ်းလေ့လာမည်နှင့် ပေါ့ဒ်ကတ်စ်များကို စူးစမ်းလေ့လာမည် အပိုင်းများကို ပြသထားသည် + \'\'ဤသင်တန်းကို စူးစမ်းလေ့လာမည်\'\' ကို ဖျောက်ပါ + ဤသင်တန်းကို စူးစမ်းလေ့လာမည်အပိုင်းကို ဖျောက်ထားသည် + ဤသင်တန်းကို စူးစမ်းလေ့လာမည်အပိုင်းကို ပြသထားသည် + \'\'ပေါ့ဒ်ကတ်စ်များကို စူးစမ်းလေ့လာမည်\'\' ကို ဖျောက်ပါ + ပေါ့ဒ်ကတ်စ်များကို စူးစမ်းလေ့လာမည်အပိုင်းကို ဖျောက်ထားသည် + ပေါ့ဒ်ကတ်စ်များကို စူးစမ်းလေ့လာမည်အပိုင်းကို ပြသထားသည် + \'\'အသားပေးနေရာများ\'\' ကို ဖျောက်ပါ + အသားပေးနေရာများအပိုင်းကို ဖျောက်ထားသည် + အသားပေးနေရာများအပိုင်းကို ပြသထားသည် + feed flyout menu filter ကို ဖွင့်ပါ + Feed flyout menu filter ကို ဖွင့်ထားသည် + Feed flyout menu filter ကို ပိတ်ထားသည် + Feed flyout menu filter + စစ်ထုတ်လိုသော flyout menu အမည်များကို တစ်ကြောင်းစီဖြင့် ရိုက်ထည့်ပါ + ဂိမ်းကစားခြင်းကို ဖျောက်ပါ + ဂိမ်းကစားခြင်းအပိုင်းကို ဖျောက်ထားသည် + ဂိမ်းကစားခြင်းအပိုင်းကို ပြသထားသည် + ဂီတကို ဖျောက်ပါ + ဂီတအပိုင်းကို ဖျောက်ထားသည် + ဂီတအပိုင်းကို ပြသထားသည် + ပဟေဠိများကို ဖျောက်ပါ + ပဟေဠိများအပိုင်းကို ဖျောက်ထားသည် + ပဟေဠိများအပိုင်းကို ပြသထားသည် + ချန်နယ် tab filter ကို ဖွင့်ပါ + ချန်နယ် tab filter ကို ဖွင့်ထားသည် + ချန်နယ် tab filter ကို ပိတ်ထားသည် + ချန်နယ် tab filter + စစ်ထုတ်လိုသော ချန်နယ် tab အမည်များကို တစ်ကြောင်းစီဖြင့် ရိုက်ထည့်ပါ + "ကန့်သတ်ချက်များ: +• Shorts shelves, channel pages, and search results may still show view counts. +• ဤအင်္ဂါရပ်သည် မော်တော်ယာဉ်ပုံစံများတွင် အလုပ်မလုပ်ပါ။" + "ကန့်သတ်ချက်များ: +• Shorts shelves, channel pages, and search results may still show upload times. +• ဤအင်္ဂါရပ်သည် မော်တော်ယာဉ်ပုံစံများတွင် အလုပ်မလုပ်ပါ။" + "Home/Subscriptions/Search ရလဒ်များကို သော့ချက်စကားစုများနှင့် ကိုက်ညီသော အကြောင်းအရာများကို ဖျောက်ရန် စစ်ထုတ်ထားသည် + +ကန့်သတ်ချက်များ: +• Shorts ကို ချန်နယ်အမည်ဖြင့် ဖျောက်၍မရပါ +• အချို့ UI အစိတ်အပိုင်းများကို ဖျောက်၍မရပါ +• သော့ချက်စကားလုံးရှာဖွေခြင်းသည် ရလဒ်မပြနိုင်ပါ" - + မျက်နှာပြင်အပြည့် ကြော်ငြာများကို ဖျောက်ထားသည် + ပလေယာ ပေါ့ပ်အပ်ကြော်ငြာများကို ဖျောက်ပါ + ပလေယာ ပေါ့ပ်အပ်ကြော်ငြာများကို ဖျောက်ထားသည် + ပလေယာ ပေါ့ပ်အပ်ကြော်ငြာများကို ပြသထားသည် + ပလေယာအပေါ်လွှာရှိ ကုန်ပစ္စည်းကြည့်ရှုရန်နဖူးစည်းစာတန်းကို ဖျောက်ထားသည် + ပလေယာအပေါ်လွှာရှိ ကုန်ပစ္စည်းကြည့်ရှုရန်နဖူးစည်းစာတန်းကို ပြသထားသည် + YouTube Premium ကြော်ငြာများကို ဖျောက်ပါ + YouTube Premium ကြော်ငြာများကို ဖျောက်ထားသည် + YouTube Premium ကြော်ငြာများကို ပြသထားသည် - - + + URL ကို ကလစ်ဘုတ်သို့ ကူးယူခဲ့သည် + အချိန်တံဆိပ်ပါသော URL ကို ကူးယူခဲ့သည် + ဗီဒီယို URL ကူးယူရန် ခလုတ်ကို ပြသပါ + ဗီဒီယို URL ကူးယူရန် ခလုတ်ကို ပြသထားသည်။ ဗီဒီယို URL ကို ကူးယူရန် နှိပ်ပါ။ အချိန်တံဆိပ်ဖြင့် ကူးယူရန် နှိပ်၍ ဖိထားပါ + ဗီဒီယို URL ကူးယူရန် ခလုတ်ကို မပြသထားပါ + အချိန်တံဆိပ် URL ကူးယူရန် ခလုတ်ကို ပြသပါ + အချိန်တံဆိပ် URL ကူးယူရန် ခလုတ်ကို ပြသထားသည်။ အချိန်တံဆိပ်ပါသော ဗီဒီယို URL ကို ကူးယူရန် နှိပ်ပါ။ အချိန်တံဆိပ်မပါဘဲ ကူးယူရန် နှိပ်၍ ဖိထားပါ + အချိန်တံဆိပ် URL ကူးယူရန် ခလုတ်ကို မပြသထားပါ + - + + \'တီဗီသို့ဝင်ရောက်ရန်\' ပေါ့ပ်အပ်ကို ပိတ်ပါ + တီဗီသို့ဝင်ရောက်ရန် ပေါ့ပ်အပ်ကို ပိတ်ထားသည် + တီဗီသို့ဝင်ရောက်ရန် ပေါ့ပ်အပ်ကို ဖွင့်ထားသည် + - + + ရှာဖွေရန် နှိပ်ခြင်းကို ဖွင့်ပါ + ရှာဖွေရန် နှိပ်ခြင်းကို ဖွင့်ထားသည် + ရှာဖွေရန် နှိပ်ခြင်းကို ပိတ်ထားသည် + @@ -89,25 +219,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + အချို့အသုံးပြုသူအကောင့်များအတွက် ဖျောက်ထားခြင်းသည် အလုပ်မလုပ်နိုင်ပါ။ - + + လမ်းညွှန်ခလုတ်များ + လမ်းညွှန်ဘားခလုတ်များကို ဖျောက်ပါ သို့မဟုတ် ပြောင်းလဲပါ + ပင်မကို ဖျောက်ပါ + ပင်မခလုတ်ကို ဖျောက်ထားသည် + ပင်မခလုတ်ကို ပြသထားသည် + Shorts ကို ဖျောက်ပါ + Shorts ခလုတ်ကို ဖျောက်ထားသည် + Shorts ခလုတ်ကို ပြသထားသည် + ဖန်တီးမည်ကို ဖျောက်ပါ + ဖန်တီးမည်ခလုတ်ကို ဖျောက်ထားသည် + ဖန်တီးမည်ခလုတ်ကို ပြသထားသည် + စာရင်းသွင်းမှုများကို ဖျောက်ပါ + စာရင်းသွင်းမှုများခလုတ်ကို ဖျောက်ထားသည် + စာရင်းသွင်းမှုများခလုတ်ကို ပြသထားသည် + အသိပေးချက်များကို ဖျောက်ပါ + အသိပေးချက်များခလုတ်ကို ဖျောက်ထားသည် + အသိပေးချက်များခလုတ်ကို ပြသထားသည် + ဖန်တီးမည်နှင့် အသိပေးချက်များကို ပြောင်းပါ + ဖန်တီးမည်ခလုတ်ကို အသိပေးချက်များခလုတ်နှင့် ပြောင်းထားသည် + ဖန်တီးမည်ခလုတ်ကို အသိပေးချက်များခလုတ်နှင့် မပြောင်းထားပါ + ဤဆက်တင်ကို ပြောင်းလဲခြင်းသည် အကျိုးသက်ရောက်မှုမရှိပါက လျှို့ဝှက်မုဒ်သို့ ပြောင်းလဲကြည့်ပါ။ + လမ်းညွှန်ခလုတ်တံဆိပ်များကို ဖျောက်ပါ + တံဆိပ်များကို ဖျောက်ထားသည် + တံဆိပ်များကို ပြသထားသည် + ကျဉ်းမြောင်းသော လမ်းညွှန်ခလုတ်များကို ဖွင့်ပါ + လမ်းညွှန်ခလုတ်များကြား နေရာလွတ်သည် ကျဉ်းမြောင်းသည် + လမ်းညွှန်ခလုတ်များကြား နေရာလွတ်သည် ပုံမှန်အတိုင်းဖြစ်သည် + လမ်းညွှန်ဘားကာတွန်းများကို ဖွင့်ပါ + လမ်းညွှန်ပြောင်းလဲမှုများသည် ကာတွန်းများပါရှိသည် + လမ်းညွှန်ပြောင်းလဲမှုများသည် ကာတွန်းများမပါရှိပါ + အလင်းဖြတ်နိုင်သော စတေးတပ်ဘားကို ပိတ်ပါ + စတေးတပ်ဘားသည် အလင်းမဖြတ်နိုင်ပါ + စတေးတပ်ဘားသည် အလင်းမဖြတ်နိုင် သို့မဟုတ် အလင်းဖြတ်နိုင်သည် + "ကန့်သတ်ချက်များ: +• ဗီဒီယိုဖွင့်စက်၏ ထိပ်တွင် အနက်ရောင်ဘားတစ်ခု ပေါ်လာနိုင်ပါသည်။ +• အချို့စက်ပစ္စည်းများတွင် ဤအင်္ဂါရပ်ကို ဖွင့်ခြင်းသည် စနစ်လမ်းညွှန်ဘားကို ပွင့်လင်းမြင်သာအောင် ပြောင်းလဲနိုင်သည်။" + အလင်းဖြတ်နိုင်သော ဘားအလင်းရောင်ကို ပိတ်ပါ + အလင်းမုဒ်လမ်းညွှန်ဘားသည် အလင်းမဖြတ်နိုင်ပါ + အလင်းမုဒ်လမ်းညွှန်ဘားသည် အလင်းမဖြတ်နိုင် သို့မဟုတ် အလင်းဖြတ်နိုင်သည် + အလင်းဖြတ်နိုင်သော ဘားအမှောင်ရောင်ကို ပိတ်ပါ + အမှောင်မုဒ်လမ်းညွှန်ဘားသည် အလင်းမဖြတ်နိုင်ပါ + အမှောင်မုဒ်လမ်းညွှန်ဘားသည် အလင်းမဖြတ်နိုင် သို့မဟုတ် အလင်းဖြတ်နိုင်သည် + ကိရိယာဘား + ကိရိယာဘားအစိတ်အပိုင်းများကို ဖျောက်ပါ သို့မဟုတ် ပြောင်းလဲပါ + ဖန်တီးမည်ခလုတ်ကို ဖျောက်ပါ + ဖန်တီးမည်ခလုတ်ကို ဖျောက်ထားသည် + ဖန်တီးမည်ခလုတ်ကို ပြသထားသည် + အသိပေးချက်များခလုတ်ကို ဖျောက်ပါ + အသိပေးချက်များခလုတ်ကို ဖျောက်ထားသည် + အသိပေးချက်များခလုတ်ကို ပြသထားသည် + ရှာဖွေရန်ခလုတ်ကို ဖျောက်ပါ + ရှာဖွေရန်ခလုတ်ကို ဖျောက်ထားသည် + ရှာဖွေရန်ခလုတ်ကို ပြသထားသည် + ကျယ်ပြန့်သော ရှာဖွေရေးဘားကို ဖွင့်ပါ + ကျယ်ပြန့်သော ရှာဖွေရေးဘားကို ဖွင့်ထားသည် + ကျယ်ပြန့်သော ရှာဖွေရေးဘားကို ပိတ်ထားသည် @@ -126,25 +313,67 @@ Second \"item\" text" + ချုံ့မည်ခလုတ်ကို ဖျောက်ပါ + ချုံ့မည်ခလုတ်ကို ဖျောက်ထားသည် + ချုံ့မည်ခလုတ်ကို ပြသထားသည် + မျက်နှာပြင်အပြည့်ခလုတ်ကို ဖျောက်ပါ + မျက်နှာပြင်အပြည့်ခလုတ်ကို ဖျောက်ထားသည် + မျက်နှာပြင်အပြည့်ခလုတ်ကို ပြသထားသည် + + + အဆုံးသတ်မျက်နှာပြင်ကတ်များကို ဖျောက်ပါ + အဆုံးသတ်မျက်နှာပြင်ကတ်များကို ဖျောက်ထားသည် + အဆုံးသတ်မျက်နှာပြင်ကတ်များကို ပြသထားသည် - + မျက်နှာပြင်အပြည့် အရွယ်အစားကြီး seekbar ကို ဖွင့်ပါ + မျက်နှာပြင်အပြည့် seekbar သည် အရွယ်အစားကြီးဖြစ်သည် + မျက်နှာပြင်အပြည့် seekbar သည် ပုံမှန်အရွယ်အစားဖြစ်သည် + ချန်နယ်စာမျက်နှာရှိ Shorts ကို ဖျောက်ပါ + ချန်နယ်စာမျက်နှာတွင် ဖျောက်ထားသည် + ချန်နယ်စာမျက်နှာတွင် ပြသထားသည် + ဗီဒီယိုဖော်ပြချက်ရှိ Shorts ကို ဖျောက်ပါ + ဗီဒီယိုဖော်ပြချက်တွင် ဖျောက်ထားသည် + ဗီဒီယိုဖော်ပြချက်တွင် ပြသထားသည် + AI ခလုတ်ကို ဖျောက်ပါ + AI ခလုတ်ကို ဖျောက်ထားသည် + AI ခလုတ်ကို ပြသထားသည် + \'အလိုအလျောက် အသံထပ်ဆင့်\' တံဆိပ်ကို ဖျောက်ပါ + အလိုအလျောက် အသံထပ်ဆင့်တံဆိပ်ကို ဖျောက်ထားသည် + အလိုအလျောက် အသံထပ်ဆင့်တံဆိပ်ကို ပြသထားသည် + - + + အလိုအလျောက်ဖွင့်သည့် ကြည့်ရှုမှုအကြိုကို ဖျောက်ပါ + အလိုအလျောက်ဖွင့်သည့် ကြည့်ရှုမှုအကြိုကို ဖျောက်ထားသည် + အလိုအလျောက်ဖွင့်သည့် ကြည့်ရှုမှုအကြိုကို ပြသထားသည် + + + အဆုံးသတ်မျက်နှာပြင် အကြံပြုဗီဒီယိုကို ဖျောက်ပါ + "အလိုအလျောက်ဖွင့်ခြင်းကို ပိတ်ထားသည့်အခါ အဆုံးသတ်မျက်နှာပြင် အကြံပြုဗီဒီယိုကို ဖျောက်ထားသည် + +အလိုအလျောက်ဖွင့်ခြင်းကို YouTube ဆက်တင်များတွင် ပြောင်းလဲနိုင်သည်: +ဆက်တင်များ → ဖွင့်ခြင်း → နောက်ဗီဒီယိုကို အလိုအလျောက်ဖွင့်ပါ" + အဆုံးသတ်မျက်နှာပြင် အကြံပြုဗီဒီယိုကို ပြသထားသည် + - + + ပလေယာ ပေါ့ပ်အပ် ပန်နယ်များကို ဝှက်ပါ + ပလေယာ ပေါ့ပ်အပ် ပန်နယ်များကို ဝှက်ထားသည် + ပလေယာ ပေါ့ပ်အပ် ပန်နယ်များကို ပြသထားသည် + @@ -155,10 +384,12 @@ Second \"item\" text" - - + ဂီတဗီဒီယိုများတွင်သာ အသုံးပြုရန်။ ဂီတမပါဝင်သည့် ဂီတဗီဒီယိုအပိုင်းများ၊ အခြားအမျိုးအစားဖြင့် အကျုံးမဝင်သေးသော အပိုင်းများ + အပိုင်းကို တင်သွင်း၍မရပါ: %s + "အပိုင်းကို တင်သွင်း၍မရပါ။ +ရှိပြီးသားဖြစ်သည်" @@ -170,7 +401,11 @@ Second \"item\" text" - + + ပိတ်ထားသည် + အရောင် + အဖြူအမည်း + @@ -187,7 +422,11 @@ Second \"item\" text" - + + နှိပ်၍ ဖိထားသော haptics ကို ပိတ်ပါ + နှိပ်၍ ဖိထားသော haptics ကို ပိတ်ထားသည် + နှိပ်၍ ဖိထားသော haptics ကို ဖွင့်ထားသည် + @@ -200,6 +439,11 @@ Second \"item\" text" + + ပရီမီယမ်အရည်အသွေးရွေးချယ်စရာများကို ဖျောက်ပါ + ပရီမီယမ်အရည်အသွေးရွေးချယ်စရာများကို ဖျောက်ထားသည် + ပရီမီယမ်အရည်အသွေးရွေးချယ်စရာများကို ပြသထားသည် + @@ -207,7 +451,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml index 3a40645452..0c8f20091d 100644 --- a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml +++ b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Deaktiver fete ikoner + Ikoner er ikke fete + Ikoner er fete + GmsCore + Innstillinger relatert til GmsCore + Se etter GmsCore-oppdateringer + Søk etter oppdateringer er aktivert + Søk etter oppdateringer er deaktivert + Åpne GmsCore-innstillinger + Innstillinger for GmsCore + MicroG GmsCore er ikke installert. Installer det. + Handling nødvendig + Klarte ikke å søke etter MicroG GmsCore-oppdateringer + En ny versjon (%1$s) av MicroG GmsCore er tilgjengelig. Du bruker for øyeblikket versjon %2$s. + "MicroG GmsCore har ikke tillatelse til å kjøre i bakgrunnen. + +Følg guiden \"Ikke drep appen min\" for telefonen din, og følg instruksjonene for din MicroG-installasjon. + +Dette er nødvendig for at appen skal fungere." + Åpne nettside + Avbryt + "Optimaliseringer for MicroG GmsCore-batteri må deaktiveres for å forhindre problemer. + +Deaktivering av batterioptimaliseringer for MicroG vil ikke påvirke batteribruken negativt. + +Trykk på fortsett-knappen og tillat optimaliseringsendringer." + Fortsett - + + Start appen på nytt for å bruke denne funksjonen + Logg protokollbuffer + Feilsøkingslogger inkluderer protokollbuffer + Feilsøkingslogger inkluderer ikke protokollbuffer + "Aktivering av denne innstillingen vil logge ytterligere layoutdata, inkludert tekst på skjermen for enkelte UI-komponenter. + +Dette kan hjelpe med å identifisere komponenter når du oppretter egendefinerte filtre. + +Imidlertid vil aktivering av dette også logge noen brukerdata som din IP-adresse." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Skjul butikkhylle for skapere + Butikkhyllen for skapere under videospilleren er skjult + Butikkhyllen for skapere under videospilleren vises + Skjul kommentarfelt under videoer i hjemmefeeden + Kommentarfeltet under videoer i hjemmefeeden er skjult + Kommentarfeltet under videoer i hjemmefeeden vises + + Skjul «Siste videoer»-knappen + «Siste videoer»-knappen er skjult + «Siste videoer»-knappen vises + + Skjul nettsøkeresultater + Nettsøkeresultater er skjult + Nettsøkeresultater vises + Skjul «Du liker kanskje»-seksjonen + «Du liker kanskje»-seksjonen er skjult + «Du liker kanskje»-seksjonen vises + This button usually appears in the video player for certain videos. --> + + Skjul «Reprise av livechat»-knappen + Knappen for reprise av livechat i spilleroverlegget er skjult + Knappen for reprise av livechat i spilleroverlegget vises + Skjul videotittel + Videotittelen i spilleroverlegget er skjult + Videotittelen i spilleroverlegget vises + Skjul «Kursprogresjon» + Kursprogresjonsseksjonen er skjult + Kursprogresjonsseksjonen vises + Skjul Utforsk + «Utforsk dette kurset»- og «Utforsk podkasten»-seksjonene er skjult + «Utforsk dette kurset»- og «Utforsk podkasten»-seksjonene vises + Skjul «Utforsk dette kurset» + Seksjonen «Utforsk dette kurset» er skjult + Seksjonen «Utforsk dette kurset» vises + Skjul «Utforsk podkasten» + Seksjonen «Utforsk podkasten» er skjult + Seksjonen «Utforsk podkasten» vises + Skjul «Utvalgte steder» + Seksjonen «Utvalgte steder» er skjult + Seksjonen «Utvalgte steder» vises + Aktiver filter for uttrekksmeny for feed + Filteret for uttrekksmeny for feed er aktivert + Filteret for uttrekksmeny for feed er deaktivert + Filter for uttrekksmeny for feed + Skriv inn navnene på uttrekksmenyene du vil filtrere etter, én per linje + Skjul Gaming + Gaming-seksjonen er skjult + Gaming-seksjonen vises + Skjul Musikk + Musikk-seksjonen er skjult + Musikk-seksjonen vises + Skjul Quizer + Quizer-seksjonen er skjult + Quizer-seksjonen vises + Aktiver filter for kanalfane + Filter for kanalfane er aktivert + Filter for kanalfane er deaktivert + Filter for kanalfane + Skriv inn navnene på kanalfanene du vil filtrere etter, én per linje + "Begrensninger: +• Shorts-hyller, kanalsider og søkeresultater kan fortsatt vise antall visninger. +• Denne funksjonen fungerer ikke med bilformfaktor." + "Begrensninger: +• Shorts-hyller, kanalsider og søkeresultater kan fortsatt vise opplastingstider. +• Denne funksjonen fungerer ikke med bilformfaktor." + "Hjem/Abonnementer/Søkeresultater filtreres for å skjule innhold som samsvarer med nøkkelordsfraser + +Begrensninger: +• Shorts kan ikke skjules av kanalnavn +• Enkelte UI-komponenter kan ikke skjules +• Søk etter et nøkkelord kan vise ingen resultater" - + Annonser i fullskjerm er skjult + Skjul popup-annonser i avspilleren + Popup-annonser i avspilleren er skjult + Popup-annonser i avspilleren vises + Banner for visning av produkter i spilleroverlegget er skjult + Banner for visning av produkter i spilleroverlegget vises + Skjul YouTube Premium-kampanjer + YouTube Premium-kampanjer er skjult + YouTube Premium-kampanjer vises - - + + URL kopiert til utklippstavlen + URL med tidsstempel kopiert + Vis knapp for å kopiere video-URL + Knappen for å kopiere video-URL vises. Trykk for å kopiere video-URL. Trykk og hold for å kopiere med tidsstempel + Knappen for å kopiere video-URL vises ikke + Vis knapp for å kopiere tidsstempel-URL + Knappen for å kopiere tidsstempel-URL vises. Trykk for å kopiere video-URL med tidsstempel. Trykk og hold for å kopiere uten tidsstempel + Knappen for å kopiere tidsstempel-URL vises ikke + - + + Deaktiver «Logg på TV»-popup + «Logg på TV»-popup er deaktivert + «Logg på TV»-popup er aktivert + - + + Aktiver trykk for å spole + Trykk for å spole er aktivert + Trykk for å spole er deaktivert + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Skjuling fungerer kanskje ikke for enkelte brukerkontoer. - + + Navigasjonsknapper + Skjul eller endre navigasjonsfeltknapper + Skjul Hjem + Hjem-knappen er skjult + Hjem-knappen vises + Skjul Shorts + Shorts-knappen er skjult + Shorts-knappen vises + Skjul Opprett + Opprett-knappen er skjult + Opprett-knappen vises + Skjul Abonnementer + Abonnementer-knappen er skjult + Abonnementer-knappen vises + Skjul Varsler + Varsler-knappen er skjult + Varsler-knappen vises + Bytt Opprett med Varsler + Opprett-knappen er byttet med Varsler-knappen + Opprett-knappen er ikke byttet med Varsler-knappen + Hvis endring av denne innstillingen ikke trer i kraft, prøv å bytte til inkognitomodus. + Skjul etiketter for navigasjonsknapper + Etiketter er skjult + Etiketter vises + Aktiver smale navigasjonsknapper + Avstand mellom navigasjonsknapper er smal + Avstand mellom navigasjonsknapper er normal + Aktiver animasjoner for navigasjonsfelt + Navigasjons overganger er animert + Navigasjons overganger er ikke animert + Deaktiver gjennomskinnelig statuslinje + Statuslinjen er ugjennomsiktig + Statuslinjen er ugjennomsiktig eller gjennomskinnelig + "Begrensninger: +• En svart linje kan vises øverst i videospilleren. +• På enkelte enheter kan aktivering av denne funksjonen endre systemets navigasjonsfelt til gjennomsiktig." + Deaktiver lys gjennomskinnelig linje + Navigasjonsfeltet i lys modus er ugjennomsiktig + Navigasjonsfeltet i lys modus er ugjennomsiktig eller gjennomskinnelig + Deaktiver mørk gjennomskinnelig linje + Navigasjonsfeltet i mørk modus er ugjennomsiktig + Navigasjonsfeltet i mørk modus er ugjennomsiktig eller gjennomskinnelig + Verktøylinje + Skjul eller endre verktøylinjekomponenter + Skjul Opprett-knappen + Opprett-knappen er skjult + Opprett-knappen vises + Skjul Varsler-knappen + Varsler-knappen er skjult + Varsler-knappen vises + Skjul Søk-knappen + Søk-knappen er skjult + Søk-knappen vises. + Aktiver bredt søkefelt + Bredt søkefelt er aktivert + Bredt søkefelt er deaktivert @@ -126,25 +315,67 @@ Second \"item\" text" + Skjul Kollaps-knappen + Kollaps-knappen er skjult + Kollaps-knappen vises + Skjul Fullskjerm-knappen + Fullskjerm-knappen er skjult + Fullskjerm-knappen vises + + + Skjul sluttkort + Sluttkort er skjult + Sluttkort vises - + Aktiver stor søkebar i fullskjerm + Søkebaren i fullskjerm er stor + Søkebaren i fullskjerm er normal størrelse + Skjul Shorts på kanalsiden + Skjult på kanalsiden + Vist på kanalsiden + Skjul Shorts i videobeskrivelsen + Skjult i videobeskrivelsen + Vist i videobeskrivelsen + Skjul AI-knappen + AI-knappen er skjult + AI-knappen vises + Skjul etiketten «Auto-dubbed» + Etiketten «Auto-dubbed» er skjult + Etiketten «Auto-dubbed» vises + - + + Skjul forhåndsvisning av automatisk avspilling + Forhåndsvisning av automatisk avspilling er skjult + Forhåndsvisning av automatisk avspilling vises + + + Skjul foreslått video på sluttskjermen + "Foreslått video på sluttskjermen er skjult når automatisk avspilling er slått av + +Automatisk avspilling kan endres i YouTube-innstillinger: +Innstillinger → Avspilling → Spill av neste video automatisk" + Foreslått video på sluttskjermen vises + - + + Skjul popup-paneler for avspiller + Popup-paneler for avspiller er skjult + Popup-paneler for avspiller vises + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Kun for bruk i musikkvideoer. Deler av musikkvideoer uten musikk som ikke allerede er dekket av en annen kategori + Kan ikke sende inn segmentet: %s + "Kan ikke sende inn segmentet. +Eksisterer allerede" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Deaktivert + Farge + Svart og hvitt + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Deaktiver haptisk tilbakemelding ved trykk og hold + Haptisk tilbakemelding ved trykk og hold er deaktivert + Haptisk tilbakemelding ved trykk og hold er aktivert + @@ -200,6 +441,11 @@ Second \"item\" text" + + Skjul Premium-kvalitetsalternativer + Premium-kvalitetsalternativer er skjult + Premium-kvalitetsalternativer vises + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml index 2f512c82ba..c73fcc1be9 100644 --- a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml @@ -30,18 +30,55 @@ Second \"item\" text" + बोल्ड आइकनहरू असक्षम गर्नुहोस् + आइकनहरू बोल्ड छैनन् + आइकनहरू बोल्ड छन् + GmsCore + GmsCore सम्बन्धी सेटिङहरू + GmsCore अपडेटहरूका लागि जाँच गर्नुहोस् + अपडेटहरूका लागि जाँच सक्षम पारिएको छ + अपडेटहरूको जाँच अक्षम गरिएको छ + GmsCore सेटिङहरू खोल्नुहोस् + GmsCore का सेटिङहरू + MicroG GmsCore स्थापित छैन। यसलाई स्थापना गर्नुहोस्। + कार्य आवश्यक छ + MicroG GmsCore अपडेटहरू जाँच गर्न असफल भयो + MicroG GmsCore को नयाँ संस्करण (%1$s) उपलब्ध छ। हाल, तपाइँ संस्करण %2$s प्रयोग गर्दै हुनुहुन्छ। + "MicroG GmsCore लाई पृष्ठभूमिमा चल्ने अनुमति छैन। + +आफ्नो फोनको लागि \"मेरो एपलाई नमार्नुहोस्\" गाइड पालना गर्नुहोस्, र MicroG स्थापनामा निर्देशनहरू लागू गर्नुहोस्। + +यो एपले काम गर्नको लागि आवश्यक छ।" + वेबसाइट खोल्नुहोस् + रद्द गर्नुहोस् + "समस्याहरू रोक्नको लागि MicroG GmsCore ब्याट्री अप्टिमाइजेसनहरू अक्षम गरिनुपर्छ। + +MicroG को लागि ब्याट्री अप्टिमाइजेसनहरू अक्षम गर्दा ब्याट्री उपयोगमा नकारात्मक असर पर्दैन। + +जारी राख्नुहोस् बटन ट्याप गर्नुहोस् र अप्टिमाइजेसन परिवर्तनहरूलाई अनुमति दिनुहोस्।" + जारी राख्नुहोस् - + + यो सुविधा प्रयोग गर्नका लागि एप पुन: सुरु गर्नुहोस् + प्रोटोकल बफर लग गर्नुहोस् + डिबग लगहरूमा प्रोटो बफर समावेश छ + डिबग लगहरूमा प्रोटो बफर समावेश छैन + "यो सेटिङ सक्षम गर्नाले केही UI कम्पोनेन्टहरूका लागि अन-स्क्रिन पाठ सहित थप लेआउट डेटा लग गरिनेछ। + +यसले कस्टम फिल्टरहरू बनाउँदा कम्पोनेन्टहरू पहिचान गर्न मद्दत गर्न सक्छ। + +यद्यपि, यसलाई सक्षम गर्नाले तपाईंको IP ठेगाना जस्ता केही प्रयोगकर्ता डेटा पनि लग गरिनेछ।" + @@ -51,40 +88,135 @@ Second \"item\" text" - + क्रिएटर स्टोर शेल्फ लुकाउनुहोस् + भिडियो प्लेयर मुनिको क्रिएटर स्टोर शेल्फ लुकाइएको छ + भिडियो प्लेयर मुनिको क्रिएटर स्टोर शेल्फ देखाइएको छ + गृह फिडमा भिडियोहरू मुनिको टिप्पणी खण्ड लुकाउनुहोस् + गृह फिडमा भिडियोहरू मुनिको टिप्पणी खण्ड लुकाइएको छ + गृह फिडमा भिडियोहरू मुनिको टिप्पणी खण्ड देखाइएको छ + + \'नवीनतम भिडियोहरू\' बटन लुकाउनुहोस् + नवीनतम भिडियोहरू बटन लुकाइएको छ + नवीनतम भिडियोहरू बटन देखाइएको छ + + वेब खोज परिणामहरू लुकाउनुहोस् + वेब खोज परिणामहरू लुकाइएका छन् + वेब खोज परिणामहरू देखाइएका छन् + \'तपाईंलाई मन पर्न सक्छ\' खण्ड लुकाउनुहोस् + \'तपाईंलाई मन पर्न सक्छ\' खण्ड लुकाइएको छ + \'तपाईंलाई मन पर्न सक्छ\' खण्ड देखाइएको छ + This button usually appears in the video player for certain videos. --> + + \'प्रत्यक्ष कुराकानी रिप्ले\' बटन लुकाउनुहोस् + प्लेयर ओभरलेमा प्रत्यक्ष कुराकानी रिप्ले बटन लुकाइएको छ + प्लेयर ओभरलेमा प्रत्यक्ष कुराकानी रिप्ले बटन देखाइएको छ + भिडियो शीर्षक लुकाउनुहोस् + प्लेयर ओभरलेमा भिडियो शीर्षक लुकाइएको छ + प्लेयर ओभरलेमा भिडियो शीर्षक देखाइएको छ + \'पाठ्यक्रम प्रगति\' लुकाउनुहोस् + पाठ्यक्रम प्रगति खण्ड लुकाइएको छ + पाठ्यक्रम प्रगति खण्ड देखाइएको छ + अन्वेषण लुकाउनुहोस् + यो पाठ्यक्रम अन्वेषण गर्नुहोस् र पोडकास्ट खण्डहरू लुकाइएका छन् + यो पाठ्यक्रम अन्वेषण गर्नुहोस् र पोडकास्ट खण्डहरू देखाइएका छन् + \'यो पाठ्यक्रम अन्वेषण गर्नुहोस्\' लुकाउनुहोस् + यो पाठ्यक्रम अन्वेषण खण्ड लुकाइएको छ + यो पाठ्यक्रम अन्वेषण खण्ड देखाइएको छ + \'पोडकास्ट अन्वेषण गर्नुहोस्\' लुकाउनुहोस् + पोडकास्ट खण्ड अन्वेषण गर्नुहोस् लुकाइएको छ + पोडकास्ट खण्ड अन्वेषण गर्नुहोस् देखाइएको छ + \'विशेष स्थानहरू\' लुकाउनुहोस् + विशेष स्थान खण्ड लुकाइएको छ + विशेष स्थान खण्ड देखाइएको छ + फिड फ्लाईआउट मेनु फिल्टर सक्षम गर्नुहोस् + फिड फ्लाईआउट मेनु फिल्टर सक्षम पारिएको छ + फिड फ्लाईआउट मेनु फिल्टर असक्षम पारिएको छ + फिड फ्लाईआउट मेनु फिल्टर + फिल्टर गर्नका लागि फ्लाईआउट मेनुका नामहरू प्रविष्ट गर्नुहोस्, प्रत्येक एक लाइनमा + गेमिङ लुकाउनुहोस् + गेमिङ खण्ड लुकाइएको छ + गेमिङ खण्ड देखाइएको छ + संगीत लुकाउनुहोस् + संगीत खण्ड लुकाइएको छ + संगीत खण्ड देखाइएको छ + क्विजहरू लुकाउनुहोस् + क्विज खण्ड लुकाइएको छ + क्विज खण्ड देखाइएको छ + च्यानल ट्याब फिल्टर सक्षम गर्नुहोस् + च्यानल ट्याब फिल्टर सक्षम पारिएको छ + च्यानल ट्याब फिल्टर असक्षम पारिएको छ + च्यानल ट्याब फिल्टर + फिल्टर गर्नका लागि च्यानल ट्याबका नामहरू प्रविष्ट गर्नुहोस्, प्रत्येक एक लाइनमा + "सीमाहरू: +• Shorts शेल्फ, च्यानल पृष्ठहरू, र खोज परिणामहरूले अझै पनि हेराइ गणना देखाउन सक्छन्। +• यो सुविधा अटोमोटिभ फारम कारकका साथ काम गर्दैन।" + "सीमाहरू: +• Shorts शेल्फ, च्यानल पृष्ठहरू, र खोज परिणामहरूले अझै पनि अपलोड समय देखाउन सक्छन्। +• यो सुविधा अटोमोटिभ फारम कारकका साथ काम गर्दैन।" + "गृह/सदस्यताहरू/खोज परिणामहरू किवर्ड वाक्यांशहरूसँग मिल्ने सामग्री लुकाउनका लागि फिल्टर गरिएका छन् + +सीमाहरू: +• Shorts लाई च्यानलको नामबाट लुकाउन सकिँदैन +• केही UI कम्पोनेन्टहरू लुकाउन नसक्ने हुन सक्छन् +• किवर्डका लागि खोजी गर्दा कुनै परिणाम नदेखाउन सक्छ" - + पूर्ण स्क्रिन विज्ञापनहरू लुकाइएका छन् + प्लेयर पपअप विज्ञापनहरू लुकाउनुहोस् + प्लेयर पपअप विज्ञापनहरू लुकाइएका छन् + प्लेयर पपअप विज्ञापनहरू देखाइएका छन् + प्लेयर ओभरलेमा उत्पादन ब्यानर हेर्नुहोस् लुकाइएको छ + प्लेयर ओभरलेमा उत्पादन ब्यानर हेर्नुहोस् देखाइएको छ + YouTube Premium प्रमोशनहरू लुकाउनुहोस् + YouTube Premium प्रमोशनहरू लुकाइएका छन् + YouTube Premium प्रमोशनहरू देखाइएका छन् - - + + URL क्लिपबोर्डमा प्रतिलिपि गरियो + टाइमस्ट्याम्पसहितको URL प्रतिलिपि गरियो + भिडियो URL प्रतिलिपि गर्नुहोस् बटन देखाउनुहोस् + भिडियो URL प्रतिलिपि गर्नुहोस् बटन देखाइएको छ। भिडियो URL प्रतिलिपि गर्न ट्याप गर्नुहोस्। टाइमस्ट्याम्पसहित प्रतिलिपि गर्न ट्याप गरेर होल्ड गर्नुहोस् + भिडियो URL प्रतिलिपि गर्नुहोस् बटन देखाइएको छैन + टाइमस्ट्याम्प URL प्रतिलिपि गर्नुहोस् बटन देखाउनुहोस् + टाइमस्ट्याम्प URL प्रतिलिपि गर्नुहोस् बटन देखाइएको छ। टाइमस्ट्याम्पसहित भिडियो URL प्रतिलिपि गर्न ट्याप गर्नुहोस्। टाइमस्ट्याम्प बिना प्रतिलिपि गर्न ट्याप गरेर होल्ड गर्नुहोस् + टाइमस्ट्याम्प URL प्रतिलिपि गर्नुहोस् बटन देखाइएको छैन + - + + \'टिभीमा साइन इन गर्नुहोस्\' पपअप असक्षम गर्नुहोस् + टिभीमा साइन इन गर्नुहोस् पपअप असक्षम पारिएको छ + टिभीमा साइन इन गर्नुहोस् पपअप सक्षम पारिएको छ + - + + खोज्नका लागि ट्याप सक्षम गर्नुहोस् + खोज्नका लागि ट्याप सक्षम पारिएको छ + खोज्नका लागि ट्याप असक्षम पारिएको छ + @@ -92,25 +224,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + केही प्रयोगकर्ता खाताहरूको लागि लुकाउने काम नगर्न सक्छ। - + + नेभिगेसन बटनहरू + नेभिगेसन बार बटनहरू लुकाउनुहोस् वा परिवर्तन गर्नुहोस् + गृह लुकाउनुहोस् + गृह बटन लुकाइएको छ + गृह बटन देखाइएको छ + Shorts लुकाउनुहोस् + Shorts बटन लुकाइएको छ + Shorts बटन देखाइएको छ + सिर्जना लुकाउनुहोस् + सिर्जना बटन लुकाइएको छ + सिर्जना बटन देखाइएको छ + सदस्यताहरू लुकाउनुहोस् + सदस्यताहरू बटन लुकाइएको छ + सदस्यताहरू बटन देखाइएको छ + सूचनाहरू लुकाउनुहोस् + सूचनाहरू बटन लुकाइएको छ + सूचनाहरू बटन देखाइएको छ + सिर्जनालाई सूचनाहरूसँग बदल्नुहोस् + सिर्जना बटनलाई सूचनाहरू बटनसँग बदलिएको छ + सिर्जना बटनलाई सूचनाहरू बटनसँग बदलिएको छैन + यदि यो सेटिङ परिवर्तन गर्दा प्रभाव पर्दैन भने, गुप्त मोडमा स्विच गर्ने प्रयास गर्नुहोस्। + नेभिगेसन बटन लेबलहरू लुकाउनुहोस् + लेबलहरू लुकाइएका छन् + लेबलहरू देखाइएका छन् + साँघुरो नेभिगेसन बटनहरू सक्षम गर्नुहोस् + नेभिगेसन बटनहरू बीचको दूरी साँघुरो छ + नेभिगेसन बटनहरू बीचको दूरी सामान्य छ + नेभिगेसन बार एनिमेसनहरू सक्षम गर्नुहोस् + नेभिगेसन ट्रान्जिसनहरू एनिमेटेड छन् + नेभिगेसन ट्रान्जिसनहरू एनिमेटेड छैनन् + पारदर्शी स्थिति बार असक्षम गर्नुहोस् + स्थिति बार अपारदर्शी छ + स्थिति बार अपारदर्शी वा पारदर्शी छ + "सीमाहरू: +• भिडियो प्लेयरको माथि कालो पट्टी देखा पर्न सक्छ। +• केही उपकरणहरूमा, यो सुविधा सक्षम गर्नाले प्रणाली नेभिगेसन बारलाई पारदर्शीमा परिवर्तन गर्न सक्छ।" + हल्का पारदर्शी बार असक्षम गर्नुहोस् + हल्का मोड नेभिगेसन बार अपारदर्शी छ + हल्का मोड नेभिगेसन बार अपारदर्शी वा पारदर्शी छ + गाढा पारदर्शी बार असक्षम गर्नुहोस् + गाढा मोड नेभिगेसन बार अपारदर्शी छ + गाढा मोड नेभिगेसन बार अपारदर्शी वा पारदर्शी छ + उपकरणपट्टी + उपकरणपट्टीका कम्पोनेन्टहरू लुकाउनुहोस् वा परिवर्तन गर्नुहोस् + सिर्जना बटन लुकाउनुहोस् + सिर्जना बटन लुकाइएको छ + सिर्जना बटन देखाइएको छ + सूचनाहरू बटन लुकाउनुहोस् + सूचनाहरू बटन लुकाइएको छ + सूचनाहरू बटन देखाइएको छ + खोज बटन लुकाउनुहोस् + खोज बटन लुकाइएको छ + खोज बटन देखाइएको छ। + फराकिलो खोज पट्टी सक्षम गर्नुहोस् + फराकिलो खोज पट्टी सक्षम पारिएको छ + फराकिलो खोज पट्टी असक्षम पारिएको छ @@ -129,25 +318,67 @@ Second \"item\" text" + संकुचन बटन लुकाउनुहोस् + संकुचन बटन लुकाइएको छ + संकुचन बटन देखाइएको छ + पूर्ण स्क्रिन बटन लुकाउनुहोस् + पूर्ण स्क्रिन बटन लुकाइएको छ + पूर्ण स्क्रिन बटन देखाइएको छ + + + अन्त स्क्रिन कार्डहरू लुकाउनुहोस् + अन्त स्क्रिन कार्डहरू लुकाइएका छन् + अन्त स्क्रिन कार्डहरू देखाइएका छन् - + पूर्ण स्क्रिन ठूलो सीकबार सक्षम गर्नुहोस् + पूर्ण स्क्रिन सीकबार ठूलो आकारको छ + पूर्ण स्क्रिन सीकबार सामान्य आकारको छ + च्यानल पृष्ठमा Shorts लुकाउनुहोस् + च्यानल पृष्ठमा लुकाइएको + च्यानल पृष्ठमा देखाइएको + भिडियो विवरणमा Shorts लुकाउनुहोस् + भिडियो विवरणमा लुकाइएको + भिडियो विवरणमा देखाइएको + AI बटन लुकाउनुहोस् + AI बटन लुकाइएको छ + AI बटन देखाइएको छ + \'स्वचालित रूपमा डब गरिएको\' लेबल लुकाउनुहोस् + स्वचालित रूपमा डब गरिएको लेबल लुकाइएको छ + स्वचालित रूपमा डब गरिएको लेबल देखाइएको छ + - + + स्वत:प्ले पूर्वावलोकन लुकाउनुहोस् + स्वत:प्ले पूर्वावलोकन लुकाइएको छ + स्वत:प्ले पूर्वावलोकन देखाइएको छ + + + अन्त स्क्रिन सुझाव गरिएको भिडियो लुकाउनुहोस् + "स्वत:प्ले बन्द हुँदा अन्त स्क्रिन सुझाव गरिएको भिडियो लुकाइन्छ + +स्वत:प्ले YouTube सेटिङहरूमा परिवर्तन गर्न सकिन्छ: +सेटिङहरू → प्लेब्याक → अर्को भिडियो स्वतः प्ले गर्नुहोस्" + अन्त स्क्रिन सुझाव गरिएको भिडियो देखाइएको छ + - + + प्लेयर पपअप प्यानलहरू लुकाउनुहोस् + प्लेयर पपअप प्यानलहरू लुकाइएका छन् + प्लेयर पपअप प्यानलहरू देखाइएका छन् + @@ -158,10 +389,12 @@ Second \"item\" text" - - + संगीत भिडियोहरूमा मात्र प्रयोगका लागि। संगीत बिनाका संगीत भिडियोहरूका खण्डहरू, जुन पहिले नै अर्को श्रेणीमा समावेश छैनन् + खण्ड पेश गर्न सकिँदैन: %s + "खण्ड पेश गर्न सकिँदैन। +पहिले नै अवस्थित छ" @@ -173,7 +406,11 @@ Second \"item\" text" - + + असक्षम पारिएको + रङ्ग + कालो र सेतो + @@ -190,7 +427,11 @@ Second \"item\" text" - + + ट्याप र होल्ड ह्याप्टिक्स असक्षम गर्नुहोस् + ट्याप र होल्ड ह्याप्टिक्स असक्षम पारिएको छ + ट्याप र होल्ड ह्याप्टिक्स सक्षम पारिएको छ + @@ -203,6 +444,11 @@ Second \"item\" text" + + प्रिमियम गुणस्तर विकल्पहरू लुकाउनुहोस् + प्रिमियम गुणस्तर विकल्पहरू लुकाइएका छन् + प्रिमियम गुणस्तर विकल्पहरू देखाइएका छन् + @@ -210,7 +456,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index 4d6b97e6e2..1a9e2785ac 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Aangepast App-pictogram Origineel + shared.layout.branding.baseCustomBrandingPatch.revanced_custom_branding_icon_entry_2 ReVanced minimaal ReVanced geschaald @@ -49,6 +50,7 @@ Second \"item\" text" Instellingen + shared.layout.branding.baseCustomBrandingPatch.revanced_custom_branding_icon_entry_2 Weet je zeker dat je door wilt gaan? Opslaan Terugzetten @@ -80,6 +82,9 @@ Second \"item\" text" Zoekgeschiedenis instellingen weergeven Zoekgeschiedenis instellingen wordt weergegeven De zoekgeschiedenis van de instellingen wordt niet weergegeven + Vette pictogrammen uitschakelen + Pictogrammen zijn niet vetgedrukt + Pictogrammen zijn vetgedrukt Pictogrammen voor ReVanced-instellingen weergeven Instellingspictogrammen worden weergegeven Pictogrammen voor instellingen worden niet weergegeven @@ -99,25 +104,35 @@ Om nieuwe talen te vertalen of bestaande vertalingen te verbeteren, bezoek trans and changes made here must also be made there. --> - GmsCore-instellingen - Instellingen voor GmsCore + GmsCore + Instellingen voor GmsCore + Controleren op GmsCore updates + Controleren op updates is ingeschakeld + Controleren op updates is uitgeschakeld + GmsCore-instellingen openen + Instellingen van GmsCore - MicroG GmsCore is niet geïnstalleerd. Installeer het. - Actie vereist - "MicroG GmsCore heeft geen toestemming om op de achtergrond te draaien. + MicroG GmsCore is niet geïnstalleerd. Installeer het. + Actie vereist + Niet gelukt om te controleren op MicroG GmsCore-updates + Een nieuwe versie (%1$s) van MicroG GmsCore is beschikbaar. Momenteel gebruikt u versie %2$s. + "MicroG GmsCore heeft geen toestemming om op de achtergrond te draaien. Volg de \"Don't kill my app\"-handleiding voor uw telefoon en pas de instructies toe op uw MicroG-installatie. Dit is vereist om de app te laten werken." - Website openen - "Batterijoptimalisaties voor MicroG GmsCore moeten worden uitgeschakeld om problemen te voorkomen. + Website openen + Annuleren + "Batterijoptimalisaties voor MicroG GmsCore moeten worden uitgeschakeld om problemen te voorkomen. Door batterijoptimalisaties voor MicroG uit te schakelen, wordt het batterijgebruik niet negatief beïnvloed. Tik op de knop Doorgaan en sta wijzigingen in de optimalisatie toe." - Doorgaan + Doorgaan + Videostreams spoofen + Spoof de client-videostreams om afspeelproblemen te voorkomen Videostreams spoofen Spoof de client-videostreams om afspeelproblemen te voorkomen Videostreams vervalsen @@ -169,10 +184,11 @@ U wordt niet op de hoogte gesteld van onverwachte gebeurtenissen." Vlaggen opgeslagen Vlaggen gereset Vlaggen gekopieerd naar klembord - Stamlogboek - Debuglogboeken bevatten stamlogboek - Debuglogboeken bevatten geen stamlogboek - "Als u deze instelling inschakelt, worden extra lay-outgegevens geregistreerd, waaronder tekst op het scherm voor sommige UI-componenten. + Herstart de app om deze functie te gebruiken + Stamlogboek + Debuglogboeken bevatten stamlogboek + Debuglogboeken bevatten geen stamlogboek + "Als u deze instelling inschakelt, worden extra lay-outgegevens geregistreerd, waaronder tekst op het scherm voor sommige UI-componenten. Dit kan helpen bij het identificeren van componenten bij het maken van aangepaste filters. @@ -203,11 +219,15 @@ Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP Info Advertenties Alternatieve miniaturen + Feed titel Algemeen Speler + Shorts titel Zoekbalk Veegbediening + Instellingen voor YouTube Dislike herstellen Diversen + Video titel Oude instellingenmenu\'s herstellen Oude instellingenmenu\'s worden getoond Oude instellingenmenu\'s worden niet getoond @@ -218,6 +238,9 @@ Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP Shorts-achtergrondafspelen is ingeschakeld + Makerswinkelplank verbergen + Creator store-plank onder videospeler is verborgen + Creator-winkelplank onder videospeler wordt getoond Verberg albumkaarten Albumkaarten zijn verborgen Albumkaarten worden getoond @@ -227,6 +250,9 @@ Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP Chipsrek verbergen Chipsrek is verborgen Chip Schap Zichtbaar + Reactiesectie onder video\'s in Home-feed verbergen + Reactiesectie onder video\'s in Home-feed is verborgen + Reactiesectie onder video\'s in Home-feed wordt weergegeven Community berichten verbergen Community berichten zijn verborgen Community berichten worden weergegeven @@ -254,14 +280,19 @@ Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP Nieuwste berichten verbergen Nieuwste berichten zijn verborgen Nieuwste berichten worden weergegeven + + Knop \'Nieuwste video\'s\' verbergen + Knop \'Nieuwste video\'s\' is verborgen + Knop \'Nieuwste video\'s\' wordt weergegeven Mix-afspeellijsten verbergen De mix-afspeellijsten zijn verborgen De mix-afspeellijsten worden weergegeven Verberg films sectie Films sectie is verborgen De sectie Films wordt weergegeven - + \'Herinnering sturen\' knop verbergen Meld mij-knop is verborgen Meld mij-knop wordt getoond @@ -286,13 +317,16 @@ Als u dit inschakelt, worden echter ook bepaalde gebruikersgegevens, zoals uw IP Visuele afstandhouder verbergen Visuele afstandhouder is verborgen Visuele afstandhouder is weergegeven + Webzoekresultaten verbergen + Webzoekresultaten zijn verborgen + Webzoekresultaten worden getoond + Sectie \'Misschien vind je dit leuk\' verbergen + De sectie \'Misschien vind je dit leuk\' is verborgen + De sectie \'Misschien vind je dit leuk\' wordt weergegeven YouTube Doodles verbergen YouTube Doodles-animatie op het logo is verborgen YouTube Doodles-animatie op het logo wordt getoond - "YouTube Doodles worden een paar dagen per jaar getoond. - -Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor verbergen is ingeschakeld, dan wordt de filterbalk onder de zoekbalk ook verborgen." Kanaalbalk verbergen Kanaalbalk is verborgen Kanaalbalk wordt getoond @@ -309,10 +343,15 @@ Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor ve Informatiepanelen zijn verborgen Informatiepanelen worden getoond + This button usually appears in the video player for certain videos. --> Verberg knop \"Lid worden\" Lid worden-knop is verborgen Lid worden-knop wordt getoond + + Knop \'Live chat herhaling\' verbergen + Live chat herhaling knop in speleroverlay is verborgen + Live chat herhaling knop in speleroverlay wordt weergegeven Medische panelen verbergen Medische panelen zijn verborgen Medische panelen worden getoond @@ -328,6 +367,9 @@ Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor ve Verberg getimede reacties Gectimed reacties worden verborgen Gectimed reacties worden getoond + Verberg de videotitel + Videotitel in speleroverlay is verborgen + Videotitel in speleroverlay wordt weergegeven \'AI-gegenereerde videosamenvatting\' verbergen AI-gegenereerde videosamenvattingssectie is verborgen Sectie met door AI gegenereerde videosamenvatting wordt getoond @@ -340,33 +382,62 @@ Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor ve Hoofdstukken verbergen Hoofdstukken sectie is verborgen Hoofdstukken sectie wordt getoond - \'Zo is deze content gemaakt\' verbergen - Het gedeelte \"Zo is deze content gemaakt\" is verborgen - Het gedeelte \"Zo is deze content gemaakt\" is zichtbaar - Verberg Hype-punten - Hype-punten zijn verborgen - Hype-punten worden getoond + Verberg \'Cursusvoortgang\' + Sectie \'Cursusvoortgang\' is verborgen + Sectie \'Cursusvoortgang\' wordt weergegeven + Verberg Ontdekken + Secties \'Verken deze cursus\' en \'Ontdek de podcast\' zijn verborgen + Secties \'Verken deze cursus\' en \'Ontdek de podcast\' worden weergegeven + Verberg \'Verken deze cursus\' + Sectie \'Verken deze cursus\' is verborgen + Sectie \'Verken deze cursus\' wordt weergegeven + \'Ontdek de podcast\' verbergen + Het gedeelte \'Ontdek de podcast\' is verborgen + Het gedeelte \'Ontdek de podcast\' wordt weergegeven \'Ontdek de podcast\' verbergen Het gedeelte \'Ontdek de podcast\' is verborgen Het gedeelte \'Ontdek de podcast\' wordt weergegeven Aanbevolen links verbergen Sectie met aanbevolen links is verborgen Sectie met aanbevolen links is zichtbaar + Verberg \'Aanbevolen plaatsen\' + Sectie \'Aanbevolen plaatsen\' is verborgen + Sectie \'Aanbevolen plaatsen\' wordt weergegeven Verberg aanbevolen video\'s Sectie met aanbevolen video\'s is verborgen Sectie met aanbevolen video\'s is zichtbaar + Schakel filter voor flyoutmenu in feed in + Filter voor flyoutmenu in feed is ingeschakeld + Filter voor flyoutmenu in feed is uitgeschakeld + Filter voor flyoutmenu in feed + Voer de namen van de flyoutmenu\'s in om op te filteren, één per regel + Verberg Gaming + Gaming-sectie is verborgen + Gaming-sectie wordt weergegeven + \'Zo is deze content gemaakt\' verbergen + Het gedeelte \"Zo is deze content gemaakt\" is verborgen + Het gedeelte \"Zo is deze content gemaakt\" is zichtbaar + Verberg Hype-punten + Hype-punten zijn verborgen + Hype-punten worden getoond Infokaarten verbergen Sectie info-kaarten is verborgen Sectie info-kaarten is zichtbaar \'Belangrijkste begrippen\' verbergen Het gedeelte \'Belangrijkste begrippen\' is verborgen Het gedeelte \'Belangrijkste begrippen\' is zichtbaar + Verberg Muziek + Muzieksectie is verborgen + Muzieksectie wordt weergegeven Verberg abonneerknop Abonneerknop is verborgen Abonneerknop is zichtbaar Transcript verbergen Transcriptgedeelte is verborgen Transcriptgedeelte is zichtbaar + Verberg Quizzes + Quizzes-sectie is verborgen + Quizzes-sectie wordt weergegeven Videobeschrijving Skjul eller vis komponentene i videoens beskrivelse Filterbaren @@ -385,6 +456,11 @@ Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor ve Getoond in kijkgeschiedenis Kanaalpagina Kanaalpagina-componenten verbergen of tonen + Schakel kanaaltabbladfilter in + Kanaaltabbladfilter is ingeschakeld + Kanaaltabbladfilter is uitgeschakeld + Kanaaltabbladfilter + Voer de namen van de kanaaltabbladen in om op te filteren, één per regel Community-knop verbergen Communityknop is verborgen @@ -448,15 +524,15 @@ Als er momenteel een Doodle wordt getoond in je regio en deze instelling voor ve Aantal weergaven wordt getoond in feed en zoekresultaten "Beperkingen: -• Shorts-planken, kanaalpagina's en zoekresultaten kunnen nog steeds het aantal weergaven tonen -• Deze functie werkt niet met de automotive form factor" +• Shorts-planken, kanaalpagina's en zoekresultaten kunnen nog steeds het aantal weergaven tonen. +• Deze functie werkt niet met de automotive form factor." Verberg uploadtijd Uploadtijd is verborgen in feed en zoekresultaten Uploadtijd wordt getoond in feed en zoekresultaten "Beperkingen: -• Shorts-schappen, kanaalpagina's en zoekresultaten kunnen nog steeds uploadtijden tonen -• Deze functie werkt niet met de automotive vormfactor" +• Shorts-schappen, kanaalpagina's en zoekresultaten kunnen nog steeds uploadtijden tonen. +• Deze functie werkt niet met de automotive vormfactor." Keyword content verbergen Zoek- en feed-video\'s verbergen met behulp van keyword filters Home-video\'s verbergen door keywords @@ -479,7 +555,7 @@ Woorden met hoofdletters in het midden moeten met de hoofdletter worden ingevoer Over keyword filtering "Home/Abonnementen/Zoekresultaten worden gefilterd om inhoud te verbergen die overeenkomt met trefwoordzinnen -Beperkingen +Beperkingen: • Shorts kunnen niet worden verborgen op kanaalnaam • Sommige UI-componenten zijn mogelijk niet verborgen • Zoeken naar een trefwoord kan geen resultaten opleveren" @@ -494,19 +570,12 @@ Beperkingen Keyword verbergt alle video\'s: %s - Makerswinkelplank verbergen - Creator store-plank onder videospeler is verborgen - Creator-winkelplank onder videospeler wordt getoond Verberg de Store-banner op het eindscherm Eindscherm winkelbanner is verborgen Eindscherm winkelbanner wordt getoond Volledig scherm advertenties verbergen - "Volledig schermadvertenties zijn verborgen - -Deze functie is alleen beschikbaar voor oudere apparaten" + Advertenties op volledig scherm zijn verborgen Volledig scherm advertenties worden getoond - - Volledig scherm advertenties werkt alleen met oudere apparaten Algemene advertenties verbergen Algemene advertenties zijn verborgen Algemene advertenties worden getoond @@ -516,6 +585,9 @@ Deze functie is alleen beschikbaar voor oudere apparaten" Betaalde promotielabel verbergen Betaalde promotielabel is verborgen Betaalde promotielabel wordt getoond + Verberg pop-upadvertenties van speler + Pop-upadvertenties van speler zijn verborgen + Pop-upadvertenties van speler worden weergegeven Zelf gesponsorde kaarten verbergen Zelf gesponsorde kaarten zijn verborgen Zelf gesponsorde kaarten worden getoond @@ -523,23 +595,18 @@ Deze functie is alleen beschikbaar voor oudere apparaten" Winkellinks in videobeschrijving zijn verborgen Winkellinks in videobeschrijving worden getoond Banner \'Producten bekijken\' verbergen - Producten bekijken-banner in video-overlay is verborgen - Producten bekijken-banner in video-overlay wordt getoond - Webzoekresultaten verbergen - Webzoekresultaten zijn verborgen - Webzoekresultaten worden getoond - - - YouTube Premium promoties verbergen - YouTube Premium promoties onder de videospeler zijn verborgen - YouTube Premium promoties onder de videospeler worden getoond + Banner \'Producten bekijken\' in speleroverlay is verborgen + Banner \'Producten bekijken\' in speleroverlay wordt weergegeven + YouTube Premium promoties verbergen + YouTube Premium promoties zijn verborgen + YouTube Premium promoties worden weergegeven Video-advertenties verbergen Video-advertenties zijn verborgen Video-advertenties worden getoond - + URL gekopieerd naar klembord URL met tijdstempel gekopieerd Knop \"Video-URL kopiëren\" weergeven @@ -555,10 +622,10 @@ Deze functie is alleen beschikbaar voor oudere apparaten" Dialog wordt getoond Dit omzeilt de leeftijdsbeperking niet. Het accepteert het alleen automatisch. - - Pop-up \'Inloggen op tv\' uitschakelen - Pop-up \'Inloggen op tv\' is uitgeschakeld - Pop-up \'Inloggen op tv\' is ingeschakeld + + Pop-up \'Inloggen op tv\' uitschakelen + Pop-up \'Inloggen op tv\' is uitgeschakeld + Pop-up \'Inloggen op tv\' is ingeschakeld Dubbeltik om hoofdstukken over te slaan uitschakelen @@ -591,10 +658,10 @@ Controleer of de pakketnaam correct is en de app is geïnstalleerd" Beweging is uitgeschakeld Beweging is ingeschakeld - - Tikken om te zoeken inschakelen - Tikken om te zoeken is ingeschakeld - Tikken om te zoeken is uitgeschakeld + + Tikken om te zoeken inschakelen + Tikken om te zoeken is ingeschakeld + Tikken om te zoeken is uitgeschakeld Helderheidsbeweging inschakelen @@ -675,7 +742,7 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"De reactieknop is verborgen De reactieknop wordt weergegeven + This button usually appears on live streamed videos. --> Melden verbergen Melden is verborgen Melden wordt weergegeven @@ -688,7 +755,7 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"Downloaden knop is verborgen Downloaden knop wordt weergegeven + This button usually appears on videos uploaded by the logged-in user. --> Verberg Hype Hype-knop is verborgen Hype-knop is zichtbaar @@ -701,7 +768,7 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"Bedankt-knop is verborgen Bedankt-knop wordt weergegeven + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Vraag verbergen Knop \"Vraag\" is verborgen Knop \"Vraag\" wordt weergegeven @@ -709,6 +776,7 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"Fragment verbergen Fragment knop is verborgen Fragment knop wordt weergegeven + Verbergen werkt mogelijk niet voor sommige gebruikersaccounts. Winkel verbergen Winkelknop is verborgen @@ -718,13 +786,13 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"Knop \"Opslaan\" is verborgen Knop \"Opslaan\" is zichtbaar - + Navigatieknoppen - Knoppen in de navigatiebalk verbergen of wijzigen + Navigatiebalkknoppen verbergen of wijzigen Startpagina verbergen - Startpagina-knop is verborgen - Startpagina-knop wordt weergegeven + Startknop is verborgen + Startknop wordt weergegeven Verberg Shorts Shorts knop is verborgen @@ -742,26 +810,44 @@ Pas het volume aan door verticaal over de rechterkant van het scherm te vegen"Meldingsknop wordt weergegeven Maak wisselen met Meldingen - "Maken-knop wordt gewisseld met meldingen-knop - -Opmerking: Als u dit inschakelt, worden videoadvertenties ook geforceerd verborgen" + Maak-knop is gewisseld met Meldingsknop Maak-knop wordt niet gewisseld met Meldingen-knop - "Als u deze instelling uitschakelt, wordt ook het blokkeren van Shorts-advertenties uitgeschakeld. - -Als het wijzigen van deze instelling geen effect heeft, probeer dan over te schakelen naar de incognitomodus." - Navigatieknoppenlabels verbergen + Als het wijzigen van deze instelling geen effect heeft, probeer dan over te schakelen naar de Incognito-modus. + Labels van navigatieknoppen verbergen Labels zijn verborgen Labels worden weergegeven + Schakel smalle navigatieknoppen in + Afstand tussen navigatieknoppen is smal + Afstand tussen navigatieknoppen is normaal + Schakel navigatiebalkanimaties in + Navigatieovergangen zijn geanimeerd + Navigatieovergangen zijn niet geanimeerd Transparante statusbalk uitschakelen Statusbalk is ondoorzichtig Statusbalk is ondoorzichtig of doorschijnend - Op sommige apparaten kan het inschakelen van deze functie de systeemnavigatiebalk transparant maken. + "Beperkingen: +• Er kan een zwarte balk bovenaan de videospeler verschijnen. +• Op sommige apparaten kan het inschakelen van deze functie de systeemnavigatiebalk transparant maken." Transparante lichte navigatiebalk uitschakelen De lichte navigatiebalk is ondoorzichtig De lichtmodus navigatiebalk is ondoorzichtig of doorschijnend Schakel de donkere doorschijnende balk uit De donkere navigatiebalk is ondoorzichtig De donkermodus navigatiebalk is ondoorzichtig of doorschijnend + Werkbalk + Werkbalkcomponenten verbergen of wijzigen + Verberg Maak-knop + Maak-knop is verborgen + Maak-knop wordt weergegeven + Verberg Meldingsknop + Meldingsknop is verborgen + Meldingsknop wordt weergegeven + Verberg zoekknop + Zoekknop is verborgen + Zoekknop is weergegeven. + Schakel de brede zoekbalk in + De brede zoekbalk is ingeschakeld + De brede zoekbalk is uitgeschakeld Uitklapmenu @@ -836,6 +922,12 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro Verberg Cast-knop Castknop is verborgen Castknop wordt weergegeven + Verberg knop \'Inklappen\' + Knop \'Inklappen\' is verborgen + Knop \'Inklappen\' wordt weergegeven + Verberg knop \'Volledig scherm\' + Knop \'Volledig scherm\' is verborgen + Knop \'Volledig scherm\' wordt weergegeven Achtergrond van spelerbediening verbergen Achtergrond van spelerbediening is verborgen Achtergrond van spelerbediening wordt weergegeven @@ -844,9 +936,9 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro Knoppen worden weergegeven - Verberg eindschermkaarten - Eindschermkaarten zijn verborgen - Eindschermkaarten worden weergegeven + Verberg eindschermkaarten + Eindschermkaarten zijn verborgen + Eindschermkaarten worden weergegeven Schakel de ambientmodus in volledig scherm uit @@ -871,10 +963,16 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro Zoekbalk videominiaturen verbergen Zoekbalk videominiaturen is verborgen Zoekbalk videominiaturen is getoond + Schakel grote zoekbalk op volledig scherm in + Zoekbalk op volledig scherm is groot formaat + Zoekbalk op volledig scherm is normaal formaat Shorts-speler Shorts-spelercomponenten verbergen of tonen + Verberg Shorts op kanaalpagina + Verborgen op kanaalpagina + Weergegeven op kanaalpagina Shorts verbergen in Home-feed Verborgen in Home-feed en gerelateerde video\'s @@ -886,9 +984,18 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro Shorts verbergen in Abonnementen-feed Verborgen in Abonnementen-feed Getoond in Abonnementen-feed + Verberg Shorts in videobeschrijving + Verborgen in videobeschrijving + Weergegeven in videobeschrijving Verberg Shorts in geschiedenis bekijken Verborgen in de kijkgeschiedenis Getoond in geschiedenis bekijken + Verberg AI-knop + AI-knop is verborgen + AI-knop wordt weergegeven + \'Automatisch nagesynchroniseerd\'-label verbergen + Automatisch nagesynchroniseerd label is verborgen + Automatisch nagesynchroniseerd label wordt getoond \'Automatisch nagesynchroniseerd\'-label verbergen Automatisch nagesynchroniseerd label is verborgen Automatisch nagesynchroniseerd label wordt getoond @@ -950,6 +1057,7 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro Knop \'Deze sjabloon gebruiken\' verbergen Knop Sjabloon gebruiken is verborgen De knop Dit sjabloon gebruiken wordt weergegeven + Verberg de fonteinanimatie van de vind-ik-leukknop De animatie van de \"like fountain\" is verborgen De animatie van de \"like fountain\" is zichtbaar @@ -992,7 +1100,12 @@ Om het Audiotracks-menu weer te geven, wijzig 'Videostreams spoofen' naar 'Andro De navigatiebalk is verborgen De navigatiebalk is zichtbaar - + + Verberg autoplay-voorbeeld + Autoplay-voorbeeld is verborgen + Autoplay-voorbeeld wordt weergegeven + + Voorgestelde video op eindscherm verbergen "De voorgestelde video op het eindscherm is verborgen wanneer automatisch afspelen is uitgeschakeld. @@ -1011,9 +1124,9 @@ Instellingen → Afspelen → Volgende video automatisch afspelen" De tijd is zichtbaar - Verberg de pop-upvensters van de speler - De pop-upvensters van de speler zijn verborgen - De pop-upvensters van de speler zijn zichtbaar + Verberg de pop-upvensters van de speler + De pop-upvensters van de speler zijn verborgen + De pop-upvensters van de speler zijn zichtbaar Afsluiten van volledig scherm modus bij einde van de video @@ -1042,6 +1155,7 @@ Instellingen → Afspelen → Volgende video automatisch afspelen" Herlaad video om te stemmen via Return YouTube Dislike Verborgen door eigenaar + Instellingen voor YouTube Dislike herstellen \"Dislikes\" worden weergegeven \"Dislikes\" worden niet weergegeven Toon onlikes op Shorts @@ -1062,6 +1176,7 @@ Beperking: Vind ik niet leuk verschijnen mogelijk niet in de incognitomodus"Toon een \"toast\" als de API niet beschikbaar is \"Toast\" wordt getoond als Return YouTube Dislike niet beschikbaar is \"Toast\" wordt niet getoond als Return YouTube Dislike niet beschikbaar is + Herstel YouTube Dislike titel Data wordt aangeleverd door de Return YouTube Dislike API. Tik hier voor meer informatie ReturnYouTubeDislike API-statistieken van dit apparaat @@ -1081,25 +1196,8 @@ Beperking: Vind ik niet leuk verschijnen mogelijk niet in de incognitomodus"Client limiet %d keer geconstateerd %d milliseconden - - Schakel de brede zoekbalk in - De brede zoekbalk is ingeschakeld - De brede zoekbalk is uitgeschakeld - - - Schakel miniatuurweergaven van hoge kwaliteit in - Miniatuurweergaven van de zoekbalk zijn van hoge kwaliteit - Miniatuurweergaven van de zoekbalk zijn van gemiddelde kwaliteit - "Dit zal ook miniatuurweergaven herstellen op livestreams die geen miniatuurweergaven van de zoekbalk hebben. - -Miniatuurweergaven van de zoekbalk gebruiken dezelfde kwaliteit als de huidige video. - -Deze functie werkt het beste met een videokwaliteit van 720p of lager en wanneer u een zeer snelle internetverbinding gebruikt." - Herstel oude miniatuurweergaven van de zoekbalk - Miniatuurweergaven van de zoekbalk worden boven de zoekbalk weergegeven - Miniatuurweergaven van de zoekbalk worden in volledig scherm weergegeven - + SponsorBlock Schakel SponsorBlock in SponsorBlock is een crowdsourced systeem om vervelende delen van YouTube-video\'s over te slaan Uiterlijk @@ -1180,6 +1278,7 @@ Uw gebruikers-ID is als een wachtwoord en mag nooit worden gedeeld. " Niet meer tonen Verander het segmentgedrag + Sponsor Betaalde promotie, betaalde verwijzingen en directe advertenties. Niet voor zelfpromotie of gratis shout-outs naar oorzaken/makers/websites/producten die ze leuk vinden Onbetaalde/Zelfpromotie Vergelijkbaar met Sponsor, maar dan voor onbetaalde of zelfpromotie. Inclusief secties over merchandise, donaties of informatie over met wie ze hebben samengewerkt @@ -1262,6 +1361,7 @@ Bestaat al" Categorie is uitgeschakeld in de instellingen. Schakel de categorie in om in te dienen. Nieuw SponsorBlock-segment %s instellen als begin of einde van een nieuw segment? + Nieuwe segmentatie startduur Einde Nu Tijd waarop het segment begint @@ -1307,12 +1407,14 @@ Klaar om in te dienen?" Ondoorzichtigheid: Kleur: Over + sponsor.ajay.app Gegevens worden geleverd door de SponsorBlock API. Tik hier om meer te weten te komen en downloads te bekijken voor andere platforms Indelingsvormfactor Standaard Telefoon + Grootte layout Automobiel "Wijzigingen omvatten: @@ -1335,8 +1437,6 @@ Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen Doel voor vervalsen app-versie 20.13.41 - Herstel niet-ingeklapte videobalk 20.05.46 - Transcriptfunctionaliteit herstellen - 19.35.36 - Herstel oude pictogrammen voor Shorts-speler - 19.01.34 - Herstel oude navigatie-iconen Startpagina wijzigen @@ -1350,6 +1450,7 @@ Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen Geschiedenis Bibliotheek Gelikte video\'s + Startpagina Films Muziek Nieuws @@ -1357,6 +1458,7 @@ Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen Afspeellijsten Zoeken Winkelen + Startpagina Shorts Sport Abonnements Trends @@ -1393,6 +1495,11 @@ Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen Uitgeschakeld Standaard Minimaal + Miniplayer type + Miniplayer type + Miniplayer type 2 + Miniplayer type 3 + Miniplayer type 4 Afgeronde hoeken uitschakelen Hoeken zijn vierkant Hoeken zijn afgerond @@ -1415,6 +1522,11 @@ De miniplayer kan naar links of rechts van het scherm worden gesleept" Overlayknoppen verbergen Overlayknoppen zijn verborgen Overlayknoppen worden weergegeven + Verberg knoppen voor uitvouwen en sluiten + "Knoppen zijn verborgen + +Veeg om uit te vouwen of te sluiten" + Uitvouwen en sluiten knoppen worden weergegeven Verberg subteksten Subteksten zijn verborgen Subteksten zijn zichtbaar @@ -1433,8 +1545,9 @@ De miniplayer kan naar links of rechts van het scherm worden gesleept" Het laadscherm heeft een verlopende achtergrond Het laadscherm heeft een effen achtergrond Stijl van opstartscherm - Kleur - Zwart-wit + Uitgeschakeld + Kleur + Zwart-wit Schakel aangepaste schuifregelaar kleur in De aangepaste kleur van de schuifregelaar is zichtbaar De oorspronkelijke kleur van de schuifregelaar is zichtbaar @@ -1444,11 +1557,17 @@ De miniplayer kan naar links of rechts van het scherm worden gesleept" De accentkleur van de zoekbalk Ongeldige waarde voor de kleur van de schuifregelaar - + + YouTube ReVanced + YT ReVanced + YT + Headerlogo Standaard Normaal + Premium + shared.layout.branding.baseCustomBrandingPatch.revanced_custom_branding_icon_entry_2 ReVanced minimaal Aangepast @@ -1539,6 +1658,9 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen" Haptiek voor ongedaan maken van zoeken uitschakelen Haptiek voor ongedaan maken van zoeken is uitgeschakeld Haptiek voor ongedaan maken van zoeken is ingeschakeld + Haptiek voor tikken en vasthouden uitschakelen + Haptiek voor tikken en vasthouden is uitgeschakeld + Haptiek voor tikken en vasthouden is ingeschakeld Zoom-haptics uitschakelen Zoom-haptics is uitgeschakeld Zoom-haptics is ingeschakeld @@ -1633,6 +1755,11 @@ Beperkingen: Geavanceerd menu voor videokwaliteit wordt weergegeven Geavanceerd menu voor videokwaliteit wordt niet weergegeven + + Premium kwaliteitsopties verbergen + Premium kwaliteitsopties zijn verborgen + Premium kwaliteitsopties worden weergegeven + Schuiven om te zoeken inschakelen Schuiven om te zoeken is ingeschakeld @@ -1664,6 +1791,7 @@ Het afspelen van video met AV1 kan haperen of frames overslaan." + Over Advertenties Algemeen diff --git a/patches/src/main/resources/addresources/values-or-rIN/strings.xml b/patches/src/main/resources/addresources/values-or-rIN/strings.xml index 3a40645452..d8267be4b4 100644 --- a/patches/src/main/resources/addresources/values-or-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-or-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + ଗାଢ଼ ଆଇକନ୍ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଆଇକନ୍ ଗାଢ଼ ନୁହଁନ୍ତି + ଆଇକନ୍ ଗାଢ଼ + ଜିଏମଏସକୋର + ଜିଏମଏସକୋର ସମ୍ବନ୍ଧୀୟ ସେଟିଂସମୂହ + ଜିଏମଏସକୋର ଅପଡେଟ୍‌ ଯାଞ୍ଚ କରନ୍ତୁ + ଅପଡେଟ୍‌ ଯାଞ୍ଚ ସକ୍ଷମ କରାଯାଇଛି + ଅପଡେଟ୍ ଯାଞ୍ଚ ଅକ୍ଷମ କରାଯାଇଛି + GmsCore ସେଟିଂସ୍ ଖୋଲନ୍ତୁ + GmsCore ର ସେଟିଂସ୍ + MicroG GmsCore ସ୍ଥାପିତ ହୋଇନାହିଁ। ଏହାକୁ ସ୍ଥାପନ କରନ୍ତୁ। + କାର୍ଯ୍ୟ ଆବଶ୍ୟକ + MicroG GmsCore ଅପଡେଟ୍ ଯାଞ୍ଚ କରିବାରେ ବିଫଳ ହେଲା + MicroG GmsCore ର ଏକ ନୂତନ ସଂସ୍କରଣ (%1$s) ଉପଲବ୍ଧ ଅଛି। ବର୍ତ୍ତମାନ, ଆପଣ %2$s ସଂସ୍କରଣ ବ୍ୟବହାର କରୁଛନ୍ତି। + "MicroG GmsCore କୁ ପୃଷ୍ଠଭୂମିରେ ଚାଲିବାକୁ ଅନୁମତି ନାହିଁ। + +ଆପଣଙ୍କ ଫୋନ୍ ପାଇଁ \"ମୋ ଆପ୍ କୁ ବନ୍ଦ କରନ୍ତୁ ନାହିଁ\" ଗାଇଡ୍ ଅନୁସରଣ କରନ୍ତୁ ଏବଂ ନିର୍ଦ୍ଦେଶାବଳୀକୁ ଆପଣଙ୍କ MicroG ସ୍ଥାପନାରେ ପ୍ରୟୋଗ କରନ୍ତୁ। + +ଆପ୍ କାର୍ଯ୍ୟ କରିବା ପାଇଁ ଏହା ଆବଶ୍ୟକ।" + ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ + ବାତିଲ୍ କରନ୍ତୁ + "ସମସ୍ୟା ରୋକିବା ପାଇଁ MicroG GmsCore ବ୍ୟାଟେରୀ ଅପ୍ଟିମାଇଜେସନ୍ ଅକ୍ଷମ କରିବା ଆବଶ୍ୟକ। + +MicroG ପାଇଁ ବ୍ୟାଟେରୀ ଅପ୍ଟିମାଇଜେସନ୍ ଅକ୍ଷମ କରିବା ବ୍ୟାଟେରୀ ବ୍ୟବହାରକୁ ନକାରାତ୍ମକ ଭାବରେ ପ୍ରଭାବିତ କରିବ ନାହିଁ। + +ଜାରି ରଖିବା ବଟନ୍ ଉପରେ ଟ୍ୟାପ୍ କରନ୍ତୁ ଏବଂ ଅପ୍ଟିମାଇଜେସନ୍ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ।" + ଜାରି ରଖନ୍ତୁ - + + ଏହି ଫିଚର୍‌ ବ୍ୟବହାର କରିବାକୁ ଆପ୍‌କୁ ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁ + ପ୍ରୋଟୋକଲ ବଫର୍ ଲଗ୍ + ଡିବଗ୍ ଲଗ୍‌ରେ ପ୍ରୋଟୋ ବଫର୍ ଅନ୍ତର୍ଭୁକ୍ତ + ଡିବଗ୍ ଲଗ୍‌ରେ ପ୍ରୋଟୋ ବଫର୍ ଅନ୍ତର୍ଭୁକ୍ତ ନୁହେଁ + "ଏହି ସେଟିଂକୁ ସକ୍ଷମ କରିବା ଦ୍ୱାରା ଅତିରିକ୍ତ ଲେଆଉଟ୍ ଡାଟା ଲଗ୍ ହେବ, ଯେଉଁଥିରେ କିଛି UI କମ୍ପୋନେଣ୍ଟ ପାଇଁ ଅନ୍-ସ୍କ୍ରିନ୍ ଟେକ୍ସଟ୍ ଅନ୍ତର୍ଭୁକ୍ତ। + +ଏହା କଷ୍ଟମ ଫିଲ୍ଟର୍ ସୃଷ୍ଟି କରିବା ସମୟରେ କମ୍ପୋନେଣ୍ଟଗୁଡ଼ିକୁ ଚିହ୍ନଟ କରିବାରେ ସାହାଯ୍ୟ କରିପାରେ। + +ତେବେ, ଏହାକୁ ସକ୍ଷମ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କ IP ଠିକଣା ଭଳି କିଛି ଉପଭୋକ୍ତା ଡାଟା ମଧ୍ୟ ଲଗ୍ ହେବ।" + @@ -48,40 +85,135 @@ Second \"item\" text" - + କ୍ରିଏଟର୍ ଷ୍ଟୋର୍ ସେଲ୍ଫ ଲୁଚାନ୍ତୁ + ଭିଡିଓ ପ୍ଲେୟାର୍‌ ତଳେ ଥିବା କ୍ରିଏଟର୍ ଷ୍ଟୋର୍ ସେଲ୍ଫ ଲୁଚିଛି + ଭିଡିଓ ପ୍ଲେୟାର୍‌ ତଳେ ଥିବା କ୍ରିଏଟର୍ ଷ୍ଟୋର୍ ସେଲ୍ଫ ଦେଖାଯାଉଛି + ହୋମ୍ ଫିଡ୍‌ରେ ଭିଡିଓ ତଳେ ଥିବା କମେଣ୍ଟ୍‌ ସେକ୍ସନ୍ ଲୁଚାନ୍ତୁ + ହୋମ୍ ଫିଡ୍‌ରେ ଭିଡିଓ ତଳେ ଥିବା କମେଣ୍ଟ୍‌ ସେକ୍ସନ୍ ଲୁଚିଛି + ହୋମ୍ ଫିଡ୍‌ରେ ଭିଡିଓ ତଳେ ଥିବା କମେଣ୍ଟ୍‌ ସେକ୍ସନ୍ ଦେଖାଯାଉଛି + + \'ସର୍ବଶେଷ ଭିଡିଓ\' ବଟନ୍ ଲୁଚାନ୍ତୁ + ସର୍ବଶେଷ ଭିଡିଓ ବଟନ୍ ଲୁଚିଛି + ସର୍ବଶେଷ ଭିଡିଓ ବଟନ୍ ଦେଖାଯାଉଛି + + ୱେବ୍ ସନ୍ଧାନ ଫଳାଫଳ ଲୁଚାନ୍ତୁ + ୱେବ୍ ସନ୍ଧାନ ଫଳାଫଳ ଲୁଚିଛି + ୱେବ୍ ସନ୍ଧାନ ଫଳାଫଳ ଦେଖାଯାଉଛି + \'ଆପଣ ପସନ୍ଦ କରିପାରନ୍ତି\' ବିଭାଗ ଲୁଚାନ୍ତୁ + \'ଆପଣ ପସନ୍ଦ କରିପାରନ୍ତି\' ବିଭାଗ ଲୁଚିଛି + \'ଆପଣ ପସନ୍ଦ କରିପାରନ୍ତି\' ବିଭାଗ ଦେଖାଯାଉଛି + This button usually appears in the video player for certain videos. --> + + \'ଲାଇଭ୍ ଚାଟ୍ ରିପ୍ଲେ\' ବଟନ୍ ଲୁଚାନ୍ତୁ + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଥିବା ଲାଇଭ୍ ଚାଟ୍ ରିପ୍ଲେ ବଟନ୍ ଲୁଚିଛି + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଥିବା ଲାଇଭ୍ ଚାଟ୍ ରିପ୍ଲେ ବଟନ୍ ଦେଖାଯାଉଛି + ଭିଡିଓର ଶୀର୍ଷକ ଲୁଚାନ୍ତୁ + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଭିଡିଓର ଶୀର୍ଷକ ଲୁଚିଛି + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଭିଡିଓର ଶୀର୍ଷକ ଦେଖାଯାଉଛି + \'ପାଠ୍ୟକ୍ରମ ପ୍ରଗତି\' ଲୁଚାନ୍ତୁ + ପାଠ୍ୟକ୍ରମ ପ୍ରଗତି ବିଭାଗ ଲୁଚିଛି + ପାଠ୍ୟକ୍ରମ ପ୍ରଗତି ବିଭାଗ ଦେଖାଯାଉଛି + ଏକ୍ସପ୍ଲୋର୍ ଲୁଚାନ୍ତୁ + ଏହି ପାଠ୍ୟକ୍ରମ ଏବଂ ପଡକାଷ୍ଟ ବିଭାଗଗୁଡ଼ିକ ଲୁଚିଛି + ଏହି ପାଠ୍ୟକ୍ରମ ଏବଂ ପଡକାଷ୍ଟ ବିଭାଗଗୁଡ଼ିକ ଦେଖାଯାଉଛି + \'ଏହି ପାଠ୍ୟକ୍ରମ ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ\' ଲୁଚାନ୍ତୁ + ଏହି ପାଠ୍ୟକ୍ରମ ଏକ୍ସପ୍ଲୋର୍ ବିଭାଗ ଲୁଚିଛି + ଏହି ପାଠ୍ୟକ୍ରମ ଏକ୍ସପ୍ଲୋର୍ ବିଭାଗ ଦେଖାଯାଉଛି + \'ପଡକାଷ୍ଟ ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ\' ଲୁଚାନ୍ତୁ + ପଡକାଷ୍ଟ ଏକ୍ସପ୍ଲୋର୍ ବିଭାଗ ଲୁଚିଛି + ପଡକାଷ୍ଟ ଏକ୍ସପ୍ଲୋର୍ ବିଭାଗ ଦେଖାଯାଉଛି + \'ବୈଶିଷ୍ଟ୍ୟପୂର୍ଣ୍ଣ ସ୍ଥାନଗୁଡିକ\' ଲୁଚାନ୍ତୁ + ବୈଶିଷ୍ଟ୍ୟପୂର୍ଣ୍ଣ ସ୍ଥାନଗୁଡିକ ବିଭାଗ ଲୁଚିଛି + ବୈଶିଷ୍ଟ୍ୟପୂର୍ଣ୍ଣ ସ୍ଥାନଗୁଡିକ ବିଭାଗ ଦେଖାଯାଉଛି + ଫିଡ୍ ଫ୍ଲାଇଆଉଟ୍ ମେନୁ ଫିଲ୍ଟର୍ ସକ୍ଷମ କରନ୍ତୁ + ଫିଡ୍ ଫ୍ଲାଇଆଉଟ୍ ମେନୁ ଫିଲ୍ଟର୍ ସକ୍ଷମ ହୋଇଛି + ଫିଡ୍ ଫ୍ଲାଇଆଉଟ୍ ମେନୁ ଫିଲ୍ଟର୍ ନିଷ୍କ୍ରିୟ ହୋଇଛି + ଫିଡ୍ ଫ୍ଲାଇଆଉଟ୍ ମେନୁ ଫିଲ୍ଟର୍ + ଫିଲ୍ଟର୍ କରିବାକୁ ଫ୍ଲାଇଆଉଟ୍ ମେନୁର ନାମ ପ୍ରବେଶ କରନ୍ତୁ, ପ୍ରତି ଧାଡିରେ ଗୋଟିଏ + ଗେମିଂ ଲୁଚାନ୍ତୁ + ଗେମିଂ ବିଭାଗ ଲୁଚିଛି + ଗେମିଂ ବିଭାଗ ଦେଖାଯାଉଛି + ମ୍ୟୁଜିକ୍ ଲୁଚାନ୍ତୁ + ମ୍ୟୁଜିକ୍ ବିଭାଗ ଲୁଚିଛି + ମ୍ୟୁଜିକ୍ ବିଭାଗ ଦେଖାଯାଉଛି + କୁଇଜ୍ ଲୁଚାନ୍ତୁ + କୁଇଜ୍ ବିଭାଗ ଲୁଚିଛି + କୁଇଜ୍ ବିଭାଗ ଦେଖାଯାଉଛି + ଚ୍ୟାନେଲ୍ ଟାବ୍ ଫିଲ୍ଟର୍ ସକ୍ଷମ କରନ୍ତୁ + ଚ୍ୟାନେଲ୍ ଟାବ୍ ଫିଲ୍ଟର୍ ସକ୍ଷମ ହୋଇଛି + ଚ୍ୟାନେଲ୍ ଟାବ୍ ଫିଲ୍ଟର୍ ନିଷ୍କ୍ରିୟ ହୋଇଛି + ଚ୍ୟାନେଲ୍ ଟାବ୍ ଫିଲ୍ଟର୍ + ଫିଲ୍ଟର୍ କରିବାକୁ ଚ୍ୟାନେଲ୍ ଟାବ୍ ନାମ ପ୍ରବେଶ କରନ୍ତୁ, ପ୍ରତି ଧାଡିରେ ଗୋଟିଏ + "ସୀମାବଦ୍ଧତା: +• Shorts ସେଲ୍ଫ, ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠା ଏବଂ ସନ୍ଧାନ ଫଳାଫଳରେ ଦେଖାଯାଇଥିବା ସଂଖ୍ୟାଗୁଡ଼ିକ ପ୍ରଦର୍ଶିତ ହୋଇପାରେ। +• ଏହି ଫିଚର୍ ଅଟୋମୋଟିଭ୍ ଫର୍ମ ଫାକ୍ଟର୍ ସହିତ କାର୍ଯ୍ୟ କରେ ନାହିଁ।" + "ସୀମାବଦ୍ଧତା: +• Shorts ସେଲ୍ଫ, ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠା ଏବଂ ସନ୍ଧାନ ଫଳାଫଳରେ ଅପଲୋଡ୍ ସମୟ ପ୍ରଦର୍ଶିତ ହୋଇପାରେ। +• ଏହି ଫିଚର୍ ଅଟୋମୋଟିଭ୍ ଫର୍ମ ଫାକ୍ଟର୍ ସହିତ କାର୍ଯ୍ୟ କରେ ନାହିଁ।" + "ହୋମ୍/ସବସ୍କ୍ରିପସନ୍/ସନ୍ଧାନ ଫଳାଫଳଗୁଡ଼ିକ କୀୱର୍ଡ୍ ବାକ୍ୟାଂଶ ସହିତ ମେଳ ଖାଉଥିବା ବିଷୟବସ୍ତୁ ଲୁଚାଇବା ପାଇଁ ଫିଲ୍ଟର୍ କରାଯାଇଛି + +ସୀମାବଦ୍ଧତା: +• Shorts ଚ୍ୟାନେଲ୍ ନାମ ଦ୍ୱାରା ଲୁଚାଯାଇପାରିବ ନାହିଁ +• କିଛି UI ଉପାଦାନ ଲୁଚି ନ ପାରେ +• ଏକ କୀୱର୍ଡ୍ ପାଇଁ ସନ୍ଧାନ କଲେ କୌଣସି ଫଳାଫଳ ମିଳିନପାରେ।" - + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ବିଜ୍ଞାପନଗୁଡ଼ିକ ଲୁଚିଛି + ପ୍ଲେୟାର୍ ପପ୍‌ଅପ୍ ବିଜ୍ଞାପନ ଲୁଚାନ୍ତୁ + ପ୍ଲେୟାର୍ ପପ୍‌ଅପ୍ ବିଜ୍ଞାପନଗୁଡ଼ିକ ଲୁଚିଛି + ପ୍ଲେୟାର୍ ପପ୍‌ଅପ୍ ବିଜ୍ଞାପନଗୁଡ଼ିକ ଦେଖାଯାଉଛି + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଥିବା ଉତ୍ପାଦ ବ୍ୟାନର୍ ଦେଖିବା ଲୁଚିଛି + ପ୍ଲେୟାର୍ ଓଭର୍‌ଲେରେ ଥିବା ଉତ୍ପାଦ ବ୍ୟାନର୍ ଦେଖିବା ଦେଖାଯାଉଛି + YouTube Premium ପ୍ରମୋସନ୍ ଲୁଚାନ୍ତୁ + YouTube Premium ପ୍ରମୋସନ୍ ଲୁଚିଛି + YouTube Premium ପ୍ରମୋସନ୍ ଦେଖାଯାଉଛି - - + + URL କ୍ଲିପବୋର୍ଡକୁ କପି ହୋଇଛି + ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ ସହିତ URL କପି ହୋଇଛି + ଭିଡିଓ URL କପି ବଟନ୍ ଦେଖାନ୍ତୁ + ଭିଡିଓ URL କପି ବଟନ୍ ଦେଖାଯାଉଛି। ଭିଡିଓ URL କପି କରିବା ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ। ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ ସହିତ କପି କରିବା ପାଇଁ ଟ୍ୟାପ୍ କରି ଧରି ରଖନ୍ତୁ + ଭିଡିଓ URL କପି ବଟନ୍ ଦେଖାଯାଉ ନାହିଁ + ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ URL କପି ବଟନ୍ ଦେଖାନ୍ତୁ + ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ URL କପି ବଟନ୍ ଦେଖାଯାଉଛି। ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ ସହିତ ଭିଡିଓ URL କପି କରିବା ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ। ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ ବିନା କପି କରିବା ପାଇଁ ଟ୍ୟାପ୍ କରି ଧରି ରଖନ୍ତୁ + ଟାଇମ୍‌ଷ୍ଟାମ୍ପ୍ URL କପି ବଟନ୍ ଦେଖାଯାଉ ନାହିଁ + - + + \'ଟିଭିରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ\' ପପ୍‌ଅପ୍ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଟିଭିରେ ସାଇନ୍ ଇନ୍ ପପ୍‌ଅପ୍ ନିଷ୍କ୍ରିୟ ହୋଇଛି + ଟିଭିରେ ସାଇନ୍ ଇନ୍ ପପ୍‌ଅପ୍ ସକ୍ଷମ ହୋଇଛି + - + + ଖୋଜିବା ପାଇଁ ଟ୍ୟାପ୍ ସକ୍ଷମ କରନ୍ତୁ + ଖୋଜିବା ପାଇଁ ଟ୍ୟାପ୍ ସକ୍ଷମ ହୋଇଛି + ଖୋଜିବା ପାଇଁ ଟ୍ୟାପ୍ ନିଷ୍କ୍ରିୟ ହୋଇଛି + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + କିଛି ଉପଭୋକ୍ତା ଆକାଉଣ୍ଟ୍ ପାଇଁ ଲୁଚାଇବା କାର୍ଯ୍ୟ କରିନପାରେ। - + + ନାଭିଗେସନ୍ ବଟନ୍ଗୁଡ଼ିକ + ନାଭିଗେସନ୍ ବାର୍ ବଟନ୍ଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ କିମ୍ବା ପରିବର୍ତ୍ତନ କରନ୍ତୁ + ହୋମ୍ ଲୁଚାନ୍ତୁ + ହୋମ୍ ବଟନ୍ ଲୁଚିଛି + ହୋମ୍ ବଟନ୍ ଦେଖାଯାଉଛି + Shorts ଲୁଚାନ୍ତୁ + Shorts ବଟନ୍ ଲୁଚିଛି + Shorts ବଟନ୍ ଦେଖାଯାଉଛି + କ୍ରିଏଟ୍ ଲୁଚାନ୍ତୁ + କ୍ରିଏଟ୍ ବଟନ୍ ଲୁଚିଛି + କ୍ରିଏଟ୍ ବଟନ୍ ଦେଖାଯାଉଛି + ସବସ୍କ୍ରିପସନ୍ ଲୁଚାନ୍ତୁ + ସବସ୍କ୍ରିପସନ୍ ବଟନ୍ ଲୁଚିଛି + ସବସ୍କ୍ରିପସନ୍ ବଟନ୍ ଦେଖାଯାଉଛି + ବିଜ୍ଞପ୍ତି ଲୁଚାନ୍ତୁ + ବିଜ୍ଞପ୍ତି ବଟନ୍ ଲୁଚିଛି + ବିଜ୍ଞପ୍ତି ବଟନ୍ ଦେଖାଯାଉଛି + କ୍ରିଏଟ୍ କୁ ବିଜ୍ଞପ୍ତି ସହିତ ସ୍ୱିଚ୍ କରନ୍ତୁ + କ୍ରିଏଟ୍ ବଟନ୍ ବିଜ୍ଞପ୍ତି ବଟନ୍ ସହିତ ସ୍ୱିଚ୍ ହୋଇଛି + କ୍ରିଏଟ୍ ବଟନ୍ ବିଜ୍ଞପ୍ତି ବଟନ୍ ସହିତ ସ୍ୱିଚ୍ ହୋଇନାହିଁ + ଯଦି ଏହି ସେଟିଂ ପରିବର୍ତ୍ତନ କାର୍ଯ୍ୟକାରୀ ହୁଏ ନାହିଁ, ତେବେ ଇନ୍‌କଗ୍ନିଟୋ ମୋଡ୍‌କୁ ସ୍ୱିଚ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ। + ନାଭିଗେସନ୍ ବଟନ୍ ଲେବଲ୍ ଲୁଚାନ୍ତୁ + ଲେବଲ୍ ଲୁଚିଛି + ଲେବଲ୍ ଦେଖାଯାଉଛି + ସଂକୀର୍ଣ୍ଣ ନାଭିଗେସନ୍ ବଟନ୍ ସକ୍ଷମ କରନ୍ତୁ + ନାଭିଗେସନ୍ ବଟନ୍ ମଧ୍ୟରେ ବ୍ୟବଧାନ ସଂକୀର୍ଣ୍ଣ ଅଟେ + ନାଭିଗେସନ୍ ବଟନ୍ ମଧ୍ୟରେ ବ୍ୟବଧାନ ସାଧାରଣ ଅଟେ + ନାଭିଗେସନ୍ ବାର୍ ଆନିମେସନ୍ ସକ୍ଷମ କରନ୍ତୁ + ନାଭିଗେସନ୍ ଟ୍ରାଞ୍ଜିସନ୍ ଆନିମେଟେଡ୍ ହୋଇଛି + ନାଭିଗେସନ୍ ଟ୍ରାଞ୍ଜିସନ୍ ଆନିମେଟେଡ୍ ହୋଇନାହିଁ + ପାରଦର୍ଶୀ ଷ୍ଟାଟସ୍ ବାର୍ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଷ୍ଟାଟସ୍ ବାର୍ ଅସ୍ପଷ୍ଟ ଅଟେ + ଷ୍ଟାଟସ୍ ବାର୍ ଅସ୍ପଷ୍ଟ କିମ୍ବା ପାରଦର୍ଶୀ ଅଟେ + "ସୀମାବଦ୍ଧତା: +• ଭିଡିଓ ପ୍ଲେୟାର୍‌ର ଶୀର୍ଷରେ ଏକ କଳା ବାର୍ ଦେଖାଯାଇପାରେ। +• କିଛି ଡିଭାଇସ୍‌ରେ, ଏହି ଫିଚର୍ ସକ୍ଷମ କରିବା ଦ୍ୱାରା ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ବାର୍ ପାରଦର୍ଶୀରେ ପରିବର୍ତ୍ତନ ହୋଇପାରେ।" + ହାଲୁକା ପାରଦର୍ଶୀ ବାର୍ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଲାଇଟ୍ ମୋଡ୍ ନାଭିଗେସନ୍ ବାର୍ ଅସ୍ପଷ୍ଟ ଅଟେ + ଲାଇଟ୍ ମୋଡ୍ ନାଭିଗେସନ୍ ବାର୍ ଅସ୍ପଷ୍ଟ କିମ୍ବା ପାରଦର୍ଶୀ ଅଟେ + ଗାଢ଼ ପାରଦର୍ଶୀ ବାର୍ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଡାର୍କ ମୋଡ୍ ନାଭିଗେସନ୍ ବାର୍ ଅସ୍ପଷ୍ଟ ଅଟେ + ଡାର୍କ ମୋଡ୍ ନାଭିଗେସନ୍ ବାର୍ ଅସ୍ପଷ୍ଟ କିମ୍ବା ପାରଦର୍ଶୀ ଅଟେ + ଟୁଲବାର୍ + ଟୁଲବାର୍ ଉପାଦାନଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ କିମ୍ବା ପରିବର୍ତ୍ତନ କରନ୍ତୁ + କ୍ରିଏଟ୍ ବଟନ୍ ଲୁଚାନ୍ତୁ + କ୍ରିଏଟ୍ ବଟନ୍ ଲୁଚିଛି + କ୍ରିଏଟ୍ ବଟନ୍ ଦେଖାଯାଉଛି + ବିଜ୍ଞପ୍ତି ବଟନ୍ ଲୁଚାନ୍ତୁ + ବିଜ୍ଞପ୍ତି ବଟନ୍ ଲୁଚିଛି + ବିଜ୍ଞପ୍ତି ବଟନ୍ ଦେଖାଯାଉଛି + ସନ୍ଧାନ ବଟନ୍ ଲୁଚାନ୍ତୁ + ସନ୍ଧାନ ବଟନ୍ ଲୁଚିଛି + ସନ୍ଧାନ ବଟନ୍ ଦେଖାଯାଉଛି। + ବିସ୍ତୃତ ସନ୍ଧାନ ବାର୍ ସକ୍ଷମ କରନ୍ତୁ + ବିସ୍ତୃତ ସନ୍ଧାନ ବାର୍ ସକ୍ଷମ ହୋଇଛି + ବିସ୍ତୃତ ସନ୍ଧାନ ବାର୍ ଅକ୍ଷମ ହୋଇଛି @@ -126,25 +315,67 @@ Second \"item\" text" + କଲାପ୍ସ ବଟନ୍ ଲୁଚାନ୍ତୁ + କଲାପ୍ସ ବଟନ୍ ଲୁଚିଛି + କଲାପ୍ସ ବଟନ୍ ଦେଖାଯାଉଛି + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ବଟନ୍ ଲୁଚାନ୍ତୁ + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ବଟନ୍ ଲୁଚିଛି + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ବଟନ୍ ଦେଖାଯାଉଛି + + + ଶେଷ ସ୍କ୍ରିନ୍ କାର୍ଡଗୁଡ଼ିକ ଲୁଚାନ୍ତୁ + ଶେଷ ସ୍କ୍ରିନ୍ କାର୍ଡଗୁଡ଼ିକ ଲୁଚିଛି + ଶେଷ ସ୍କ୍ରିନ୍ କାର୍ଡଗୁଡ଼ିକ ଦେଖାଯାଉଛି - + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ବଡ଼ ସିକବାର୍ ସକ୍ଷମ କରନ୍ତୁ + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ସିକବାର୍ ବଡ଼ ଆକାରର ଅଟେ + ଫୁଲ୍‌ସ୍କ୍ରିନ୍ ସିକବାର୍ ସାଧାରଣ ଆକାରର ଅଟେ + ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠାରେ Shorts ଲୁଚାନ୍ତୁ + ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠାରେ ଲୁଚିଛି + ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠାରେ ଦେଖାଯାଉଛି + ଭିଡିଓ ବର୍ଣ୍ଣନାରେ Shorts ଲୁଚାନ୍ତୁ + ଭିଡିଓ ବର୍ଣ୍ଣନାରେ ଲୁଚିଛି + ଭିଡିଓ ବର୍ଣ୍ଣନାରେ ଦେଖାଯାଉଛି + AI ବଟନ୍ ଲୁଚାନ୍ତୁ + AI ବଟନ୍ ଲୁଚିଛି + AI ବଟନ୍ ଦେଖାଯାଉଛି + \'ଅଟୋ-ଡବ୍ଡ୍\' ଲେବଲ୍ ଲୁଚାନ୍ତୁ + ଅଟୋ-ଡବ୍ଡ୍ ଲେବଲ୍ ଲୁଚିଛି + ଅଟୋ-ଡବ୍ଡ୍ ଲେବଲ୍ ଦେଖାଯାଉଛି + - + + ଅଟୋପ୍ଲେ ପ୍ରିଭ୍ୟୁ ଲୁଚାନ୍ତୁ + ଅଟୋପ୍ଲେ ପ୍ରିଭ୍ୟୁ ଲୁଚିଛି + ଅଟୋପ୍ଲେ ପ୍ରିଭ୍ୟୁ ଦେଖାଯାଉଛି + + + ଶେଷ ସ୍କ୍ରିନ୍ ସୁପାରିଶିତ ଭିଡିଓ ଲୁଚାନ୍ତୁ + "ଅଟୋପ୍ଲେ ବନ୍ଦ ଥିବାବେଳେ ଶେଷ ସ୍କ୍ରିନ୍ ସୁପାରିଶିତ ଭିଡିଓ ଲୁଚିଛି + +ଅଟୋପ୍ଲେ YouTube ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରାଯାଇପାରିବ: +ସେଟିଂସ୍ → ପ୍ଲେବ୍ୟାକ୍ → ପରବର୍ତ୍ତୀ ଭିଡିଓ ଅଟୋପ୍ଲେ କରନ୍ତୁ" + ଶେଷ ସ୍କ୍ରିନ୍ ସୁପାରିଶିତ ଭିଡିଓ ଦେଖାଯାଉଛି + - + + ପ୍ଲେୟାର ପପଅପ୍ ପ୍ୟାନେଲ୍ ଲୁଚାନ୍ତୁ + ପ୍ଲେୟାର ପପଅପ୍ ପ୍ୟାନେଲ୍ ଲୁଚାଯାଇଛି + ପ୍ଲେୟାର ପପଅପ୍ ପ୍ୟାନେଲ୍ ଦେଖାଯାଉଛି + @@ -155,10 +386,12 @@ Second \"item\" text" - - + କେବଳ ମ୍ୟୁଜିକ୍ ଭିଡିଓରେ ବ୍ୟବହାର ପାଇଁ। ମ୍ୟୁଜିକ୍ ବିନା ମ୍ୟୁଜିକ୍ ଭିଡିଓର ବିଭାଗ, ଯାହା ଅନ୍ୟ କୌଣସି ଶ୍ରେଣୀ ଦ୍ୱାରା ଆବୃତ ହୋଇନାହିଁ + ଏହି ସେଗମେଣ୍ଟ୍ ଦାଖଲ କରିହେବ ନାହିଁ: %s + "ସେଗମେଣ୍ଟ୍ ଦାଖଲ କରିହେବ ନାହିଁ। +ପୂର୍ବରୁ ବିଦ୍ୟମାନ" @@ -170,7 +403,11 @@ Second \"item\" text" - + + ନିଷ୍କ୍ରିୟ + ରଙ୍ଗ + କଳା ଏବଂ ଧଳା + @@ -187,7 +424,11 @@ Second \"item\" text" - + + ଟ୍ୟାପ୍ ଏବଂ ହୋଲ୍ଡ ହାପ୍ଟିକ୍ସ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + ଟ୍ୟାପ୍ ଏବଂ ହୋଲ୍ଡ ହାପ୍ଟିକ୍ସ ନିଷ୍କ୍ରିୟ ହୋଇଛି + ଟ୍ୟାପ୍ ଏବଂ ହୋଲ୍ଡ ହାପ୍ଟିକ୍ସ ସକ୍ଷମ ହୋଇଛି + @@ -200,6 +441,11 @@ Second \"item\" text" + + ପ୍ରିମିୟମ୍ ଗୁଣବତ୍ତା ବିକଳ୍ପ ଲୁଚାନ୍ତୁ + ପ୍ରିମିୟମ୍ ଗୁଣବତ୍ତା ବିକଳ୍ପ ଲୁଚିଛି + ପ୍ରିମିୟମ୍ ଗୁଣବତ୍ତା ବିକଳ୍ପ ଦେଖାଯାଉଛି + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml index 3a40645452..cff7597d74 100644 --- a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + ਮੋਟੇ ਆਈਕਨਾਂ ਨੂੰ ਅਯੋਗ ਕਰੋ + ਆਈਕਨ ਮੋਟੇ ਨਹੀਂ ਹਨ + ਆਈਕਨ ਮੋਟੇ ਹਨ + GmsCore + GmsCore ਨਾਲ ਸੰਬੰਧਿਤ ਸੈਟਿੰਗਾਂ + GmsCore ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰੋ + ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰਨਾ ਯੋਗ ਹੈ + ਅੱਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਅਸਮਰੱਥ ਹੈ + GmsCore ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ + GmsCore ਦੀਆਂ ਸੈਟਿੰਗਾਂ + MicroG GmsCore ਇੰਸਟਾਲ ਨਹੀਂ। ਇੰਸਟਾਲ ਕਰੋ। + ਕਾਰਵਾਈ ਦੀ ਲੋੜ ਹੈ + MicroG GmsCore ਅੱਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ + ਮਾਈਕ੍ਰੋਜੀ ਜੀਐਮਐਸਕੋਰ ਦਾ ਇੱਕ ਨਵਾਂ ਸੰਸਕਰਣ (%1$s) ਉਪਲਬਧ ਹੈ। ਵਰਤਮਾਨ ਵਿੱਚ, ਤੁਸੀਂ ਸੰਸਕਰਣ %2$s ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਹੋ। + "MicroG GmsCore ਕੋਲ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। + +ਆਪਣੇ ਫ਼ੋਨ ਲਈ \"ਮੇਰੀ ਐਪ ਨੂੰ ਨਾ ਮਾਰੋ\" ਗਾਈਡ ਦੀ ਪਾਲਣਾ ਕਰੋ, ਅਤੇ ਨਿਰਦੇਸ਼ਾਂ ਨੂੰ ਆਪਣੀ MicroG ਇੰਸਟਾਲੇਸ਼ਨ 'ਤੇ ਲਾਗੂ ਕਰੋ। + +ਇਹ ਐਪ ਦੇ ਕੰਮ ਕਰਨ ਲਈ ਲੋੜੀਂਦਾ ਹੈ।" + ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹੋ + ਰੱਦ ਕਰੋ + "ਮੁੱਦਿਆਂ ਨੂੰ ਰੋਕਣ ਲਈ MicroG GmsCore ਬੈਟਰੀ ਔਪਟੀਮਾਈਜ਼ੇਸ਼ਨ ਨੂੰ ਅਸਮਰੱਥ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ। + +MicroG ਲਈ ਬੈਟਰੀ ਔਪਟੀਮਾਈਜ਼ੇਸ਼ਨ ਨੂੰ ਅਸਮਰੱਥ ਕਰਨ ਨਾਲ ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ 'ਤੇ ਨਕਾਰਾਤਮਕ ਅਸਰ ਨਹੀਂ ਪਵੇਗਾ। + +ਜਾਰੀ ਰੱਖੋ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰੋ ਅਤੇ ਔਪਟੀਮਾਈਜ਼ੇਸ਼ਨ ਤਬਦੀਲੀਆਂ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ।" + ਜਾਰੀ ਰੱਖੋ - + + ਇਸ ਫੀਚਰ ਨੂੰ ਵਰਤਣ ਲਈ ਐਪ ਨੂੰ ਰੀਸਟਾਰਟ ਕਰੋ + ਪ੍ਰੋਟੋਕੋਲ ਬਫਰ ਲੌਗ ਕਰੋ + ਡੀਬੱਗ ਲੌਗ ਵਿੱਚ ਪ੍ਰੋਟੋ ਬਫਰ ਸ਼ਾਮਲ ਹੈ + ਡੀਬੱਗ ਲੌਗ ਵਿੱਚ ਪ੍ਰੋਟੋ ਬਫਰ ਸ਼ਾਮਲ ਨਹੀਂ ਹੈ + "ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨ ਨਾਲ ਵਾਧੂ ਲੇਆਉਟ ਡਾਟਾ ਲੌਗ ਕੀਤਾ ਜਾਵੇਗਾ, ਜਿਸ ਵਿੱਚ ਕੁਝ UI ਭਾਗਾਂ ਲਈ ਆਨ-ਸਕ੍ਰੀਨ ਟੈਕਸਟ ਸ਼ਾਮਲ ਹੈ। + +ਇਹ ਕਸਟਮ ਫਿਲਟਰ ਬਣਾਉਣ ਵੇਲੇ ਭਾਗਾਂ ਦੀ ਪਛਾਣ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ। + +ਹਾਲਾਂਕਿ, ਇਸਨੂੰ ਚਾਲੂ ਕਰਨ ਨਾਲ ਕੁਝ ਉਪਭੋਗਤਾ ਡਾਟਾ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡਾ IP ਪਤਾ ਵੀ ਲੌਗ ਕੀਤਾ ਜਾਵੇਗਾ।" + @@ -48,40 +85,135 @@ Second \"item\" text" - + ਕ੍ਰੀਏਟਰ ਸਟੋਰ ਸ਼ੈਲਫ ਨੂੰ ਲੁਕਾਓ + ਵੀਡੀਓ ਪਲੇਅਰ ਦੇ ਹੇਠਾਂ ਕ੍ਰੀਏਟਰ ਸਟੋਰ ਸ਼ੈਲਫ ਲੁਕਾਈ ਗਈ ਹੈ + ਵੀਡੀਓ ਪਲੇਅਰ ਦੇ ਹੇਠਾਂ ਕ੍ਰੀਏਟਰ ਸਟੋਰ ਸ਼ੈਲਫ ਦਿਖਾਈ ਗਈ ਹੈ + ਹੋਮ ਫੀਡ ਵਿੱਚ ਵੀਡੀਓਜ਼ ਦੇ ਹੇਠਾਂ ਟਿੱਪਣੀ ਸੈਕਸ਼ਨ ਨੂੰ ਲੁਕਾਓ + ਹੋਮ ਫੀਡ ਵਿੱਚ ਵੀਡੀਓਜ਼ ਦੇ ਹੇਠਾਂ ਟਿੱਪਣੀ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਹੋਮ ਫੀਡ ਵਿੱਚ ਵੀਡੀਓਜ਼ ਦੇ ਹੇਠਾਂ ਟਿੱਪਣੀ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + + \'ਨਵੀਨਤਮ ਵੀਡੀਓਜ਼\' ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਨਵੀਨਤਮ ਵੀਡੀਓਜ਼ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਨਵੀਨਤਮ ਵੀਡੀਓਜ਼ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + + ਵੈੱਬ ਖੋਜ ਨਤੀਜਿਆਂ ਨੂੰ ਲੁਕਾਓ + ਵੈੱਬ ਖੋਜ ਨਤੀਜੇ ਲੁਕਾਏ ਗਏ ਹਨ + ਵੈੱਬ ਖੋਜ ਨਤੀਜੇ ਦਿਖਾਏ ਗਏ ਹਨ + \'ਤੁਹਾਨੂੰ ਪਸੰਦ ਆ ਸਕਦਾ ਹੈ\' ਸੈਕਸ਼ਨ ਨੂੰ ਲੁਕਾਓ + \'ਤੁਹਾਨੂੰ ਪਸੰਦ ਆ ਸਕਦਾ ਹੈ\' ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + \'ਤੁਹਾਨੂੰ ਪਸੰਦ ਆ ਸਕਦਾ ਹੈ\' ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + This button usually appears in the video player for certain videos. --> + + \'ਲਾਈਵ ਚੈਟ ਰੀਪਲੇਅ\' ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਲਾਈਵ ਚੈਟ ਰੀਪਲੇਅ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਲਾਈਵ ਚੈਟ ਰੀਪਲੇਅ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਵੀਡੀਓ ਸਿਰਲੇਖ ਨੂੰ ਲੁਕਾਓ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਵੀਡੀਓ ਸਿਰਲੇਖ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਵੀਡੀਓ ਸਿਰਲੇਖ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + \'ਕੋਰਸ ਪ੍ਰਗਤੀ\' ਨੂੰ ਲੁਕਾਓ + ਕੋਰਸ ਪ੍ਰਗਤੀ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਕੋਰਸ ਪ੍ਰਗਤੀ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਐਕਸਪਲੋਰ ਨੂੰ ਲੁਕਾਓ + ਇਸ ਕੋਰਸ ਦੀ ਪੜਚੋਲ ਕਰੋ ਅਤੇ ਪੋਡਕਾਸਟ ਸੈਕਸ਼ਨ ਲੁਕਾਏ ਗਏ ਹਨ + ਇਸ ਕੋਰਸ ਦੀ ਪੜਚੋਲ ਕਰੋ ਅਤੇ ਪੋਡਕਾਸਟ ਸੈਕਸ਼ਨ ਦਿਖਾਏ ਗਏ ਹਨ + \'ਇਸ ਕੋਰਸ ਦੀ ਪੜਚੋਲ ਕਰੋ\' ਨੂੰ ਲੁਕਾਓ + ਇਸ ਕੋਰਸ ਦੀ ਪੜਚੋਲ ਕਰੋ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਇਸ ਕੋਰਸ ਦੀ ਪੜਚੋਲ ਕਰੋ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + \'ਪੋਡਕਾਸਟ ਦੀ ਪੜਚੋਲ ਕਰੋ\' ਨੂੰ ਲੁਕਾਓ + ਪੋਡਕਾਸਟ ਸੈਕਸ਼ਨ ਦੀ ਪੜਚੋਲ ਕਰੋ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪੋਡਕਾਸਟ ਸੈਕਸ਼ਨ ਦੀ ਪੜਚੋਲ ਕਰੋ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + \'ਪ੍ਰਮੁੱਖ ਸਥਾਨਾਂ\' ਨੂੰ ਲੁਕਾਓ + ਪ੍ਰਮੁੱਖ ਸਥਾਨਾਂ ਦਾ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪ੍ਰਮੁੱਖ ਸਥਾਨਾਂ ਦਾ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਫੀਡ ਫਲਾਈਆਊਟ ਮੀਨੂ ਫਿਲਟਰ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਫੀਡ ਫਲਾਈਆਊਟ ਮੀਨੂ ਫਿਲਟਰ ਸਮਰੱਥ ਹੈ + ਫੀਡ ਫਲਾਈਆਊਟ ਮੀਨੂ ਫਿਲਟਰ ਅਸਮਰੱਥ ਹੈ + ਫੀਡ ਫਲਾਈਆਊਟ ਮੀਨੂ ਫਿਲਟਰ + ਫਿਲਟਰ ਕਰਨ ਲਈ ਫਲਾਈਆਊਟ ਮੀਨੂ ਦੇ ਨਾਮ ਦਰਜ ਕਰੋ, ਪ੍ਰਤੀ ਲਾਈਨ ਇੱਕ + ਗੇਮਿੰਗ ਨੂੰ ਲੁਕਾਓ + ਗੇਮਿੰਗ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਗੇਮਿੰਗ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਸੰਗੀਤ ਨੂੰ ਲੁਕਾਓ + ਸੰਗੀਤ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਸੰਗੀਤ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਕਵਿਜ਼ਾਂ ਨੂੰ ਲੁਕਾਓ + ਕਵਿਜ਼ ਸੈਕਸ਼ਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਕਵਿਜ਼ ਸੈਕਸ਼ਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਚੈਨਲ ਟੈਬ ਫਿਲਟਰ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਚੈਨਲ ਟੈਬ ਫਿਲਟਰ ਸਮਰੱਥ ਹੈ + ਚੈਨਲ ਟੈਬ ਫਿਲਟਰ ਅਸਮਰੱਥ ਹੈ + ਚੈਨਲ ਟੈਬ ਫਿਲਟਰ + ਫਿਲਟਰ ਕਰਨ ਲਈ ਚੈਨਲ ਟੈਬ ਦੇ ਨਾਮ ਦਰਜ ਕਰੋ, ਪ੍ਰਤੀ ਲਾਈਨ ਇੱਕ + "ਸੀਮਾਵਾਂ: +• Shorts ਸ਼ੈਲਫਾਂ, ਚੈਨਲ ਪੰਨਿਆਂ, ਅਤੇ ਖੋਜ ਨਤੀਜਿਆਂ ਵਿੱਚ ਅਜੇ ਵੀ ਦੇਖਣ ਦੀ ਗਿਣਤੀ ਦਿਖਾਈ ਜਾ ਸਕਦੀ ਹੈ। +• ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਆਟੋਮੋਟਿਵ ਫਾਰਮ ਫੈਕਟਰ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੀ।" + "ਸੀਮਾਵਾਂ: +• Shorts ਸ਼ੈਲਫਾਂ, ਚੈਨਲ ਪੰਨਿਆਂ, ਅਤੇ ਖੋਜ ਨਤੀਜਿਆਂ ਵਿੱਚ ਅਜੇ ਵੀ ਅਪਲੋਡ ਕਰਨ ਦਾ ਸਮਾਂ ਦਿਖਾਈ ਜਾ ਸਕਦਾ ਹੈ। +• ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਆਟੋਮੋਟਿਵ ਫਾਰਮ ਫੈਕਟਰ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੀ।" + "ਹੋਮ/ਸਬਸਕ੍ਰਿਪਸ਼ਨ/ਖੋਜ ਨਤੀਜਿਆਂ ਨੂੰ ਕੀਵਰਡ ਵਾਕਾਂਸ਼ਾਂ ਨਾਲ ਮੇਲ ਖਾਂਦੀ ਸਮੱਗਰੀ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਫਿਲਟਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ + +ਸੀਮਾਵਾਂ: +• Shorts ਨੂੰ ਚੈਨਲ ਦੇ ਨਾਮ ਦੁਆਰਾ ਲੁਕਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ +• ਕੁਝ UI ਕੰਪੋਨੈਂਟਸ ਲੁਕਾਏ ਨਹੀਂ ਜਾ ਸਕਦੇ +• ਇੱਕ ਕੀਵਰਡ ਦੀ ਖੋਜ ਕਰਨ 'ਤੇ ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਮਿਲ ਸਕਦਾ" - + ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਾਲੇ ਵਿਗਿਆਪਨ ਲੁਕਾਏ ਗਏ ਹਨ + ਪਲੇਅਰ ਪੌਪਅੱਪ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਲੁਕਾਓ + ਪਲੇਅਰ ਪੌਪਅੱਪ ਵਿਗਿਆਪਨ ਲੁਕਾਏ ਗਏ ਹਨ + ਪਲੇਅਰ ਪੌਪਅੱਪ ਵਿਗਿਆਪਨ ਦਿਖਾਏ ਗਏ ਹਨ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਉਤਪਾਦ ਬੈਨਰ ਦੇਖੋ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪਲੇਅਰ ਓਵਰਲੇਅ ਵਿੱਚ ਉਤਪਾਦ ਬੈਨਰ ਦੇਖੋ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + YouTube Premium ਪ੍ਰੋਮੋਸ਼ਨਾਂ ਨੂੰ ਲੁਕਾਓ + YouTube Premium ਪ੍ਰੋਮੋਸ਼ਨਾਂ ਲੁਕਾਈਆਂ ਗਈਆਂ ਹਨ + YouTube Premium ਪ੍ਰੋਮੋਸ਼ਨਾਂ ਦਿਖਾਈਆਂ ਗਈਆਂ ਹਨ - - + + URL ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ + ਟਾਈਮਸਟੈਂਪ ਵਾਲਾ URL ਕਾਪੀ ਕੀਤਾ ਗਿਆ + ਵੀਡੀਓ URL ਕਾਪੀ ਬਟਨ ਦਿਖਾਓ + ਵੀਡੀਓ URL ਕਾਪੀ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ। ਵੀਡੀਓ URL ਕਾਪੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਟਾਈਮਸਟੈਂਪ ਨਾਲ ਕਾਪੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰਕੇ ਹੋਲਡ ਕਰੋ + ਵੀਡੀਓ URL ਕਾਪੀ ਬਟਨ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ + ਟਾਈਮਸਟੈਂਪ URL ਕਾਪੀ ਬਟਨ ਦਿਖਾਓ + ਟਾਈਮਸਟੈਂਪ URL ਕਾਪੀ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ। ਟਾਈਮਸਟੈਂਪ ਨਾਲ ਵੀਡੀਓ URL ਕਾਪੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਟਾਈਮਸਟੈਂਪ ਤੋਂ ਬਿਨਾਂ ਕਾਪੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰਕੇ ਹੋਲਡ ਕਰੋ + ਟਾਈਮਸਟੈਂਪ URL ਕਾਪੀ ਬਟਨ ਨਹੀਂ ਦਿਖਾਇਆ ਗਿਆ + - + + \'ਟੀਵੀ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕਰੋ\' ਪੌਪਅੱਪ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ + ਟੀਵੀ ਵਿੱਚ ਸਾਈਨ ਇਨ ਪੌਪਅੱਪ ਅਸਮਰੱਥ ਹੈ + ਟੀਵੀ ਵਿੱਚ ਸਾਈਨ ਇਨ ਪੌਪਅੱਪ ਸਮਰੱਥ ਹੈ + - + + ਟੈਪ ਟੂ ਸੀਕ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਟੈਪ ਟੂ ਸੀਕ ਸਮਰੱਥ ਹੈ + ਟੈਪ ਟੂ ਸੀਕ ਅਸਮਰੱਥ ਹੈ + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + ਕੁਝ ਉਪਭੋਗਤਾ ਖਾਤਿਆਂ ਲਈ ਲੁਕਾਉਣਾ ਕੰਮ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ। - + + ਨੈਵੀਗੇਸ਼ਨ ਬਟਨ + ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਬਟਨਾਂ ਨੂੰ ਲੁਕਾਓ ਜਾਂ ਬਦਲੋ + ਹੋਮ ਨੂੰ ਲੁਕਾਓ + ਹੋਮ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਹੋਮ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + Shorts ਨੂੰ ਲੁਕਾਓ + Shorts ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + Shorts ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਕ੍ਰਿਏਟ ਨੂੰ ਲੁਕਾਓ + ਕ੍ਰਿਏਟ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਕ੍ਰਿਏਟ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਲੁਕਾਓ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਸੂਚਨਾਵਾਂ ਨੂੰ ਲੁਕਾਓ + ਸੂਚਨਾਵਾਂ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਸੂਚਨਾਵਾਂ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਕ੍ਰਿਏਟ ਨੂੰ ਸੂਚਨਾਵਾਂ ਨਾਲ ਬਦਲੋ + ਕ੍ਰਿਏਟ ਬਟਨ ਨੂੰ ਸੂਚਨਾਵਾਂ ਬਟਨ ਨਾਲ ਬਦਲਿਆ ਗਿਆ ਹੈ + ਕ੍ਰਿਏਟ ਬਟਨ ਨੂੰ ਸੂਚਨਾਵਾਂ ਬਟਨ ਨਾਲ ਨਹੀਂ ਬਦਲਿਆ ਗਿਆ + ਜੇਕਰ ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣ ਨਾਲ ਕੋਈ ਪ੍ਰਭਾਵ ਨਹੀਂ ਪੈਂਦਾ, ਤਾਂ ਗੁਮਨਾਮ ਮੋਡ \'ਤੇ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ। + ਨੈਵੀਗੇਸ਼ਨ ਬਟਨ ਲੇਬਲ ਲੁਕਾਓ + ਲੇਬਲ ਲੁਕਾਏ ਗਏ ਹਨ + ਲੇਬਲ ਦਿਖਾਏ ਗਏ ਹਨ + ਤੰਗ ਨੈਵੀਗੇਸ਼ਨ ਬਟਨਾਂ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਨੈਵੀਗੇਸ਼ਨ ਬਟਨਾਂ ਵਿਚਕਾਰ ਸਪੇਸਿੰਗ ਤੰਗ ਹੈ + ਨੈਵੀਗੇਸ਼ਨ ਬਟਨਾਂ ਵਿਚਕਾਰ ਸਪੇਸਿੰਗ ਆਮ ਹੈ + ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਐਨੀਮੇਸ਼ਨਾਂ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਨੈਵੀਗੇਸ਼ਨ ਤਬਦੀਲੀਆਂ ਐਨੀਮੇਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ + ਨੈਵੀਗੇਸ਼ਨ ਤਬਦੀਲੀਆਂ ਐਨੀਮੇਟ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ + ਪਾਰਦਰਸ਼ੀ ਸਟੇਟਸ ਬਾਰ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ + ਸਟੇਟਸ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਹੈ + ਸਟੇਟਸ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਜਾਂ ਪਾਰਦਰਸ਼ੀ ਹੈ + "ਸੀਮਾਵਾਂ: +• ਵੀਡੀਓ ਪਲੇਅਰ ਦੇ ਸਿਖਰ 'ਤੇ ਇੱਕ ਕਾਲੀ ਪੱਟੀ ਦਿਖਾਈ ਦੇ ਸਕਦੀ ਹੈ। +• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ, ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਪਾਰਦਰਸ਼ੀ ਹੋ ਸਕਦੀ ਹੈ।" + ਹਲਕੀ ਪਾਰਦਰਸ਼ੀ ਬਾਰ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ + ਲਾਈਟ ਮੋਡ ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਹੈ + ਲਾਈਟ ਮੋਡ ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਜਾਂ ਪਾਰਦਰਸ਼ੀ ਹੈ + ਹਨੇਰੀ ਪਾਰਦਰਸ਼ੀ ਬਾਰ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ + ਡਾਰਕ ਮੋਡ ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਹੈ + ਡਾਰਕ ਮੋਡ ਨੈਵੀਗੇਸ਼ਨ ਬਾਰ ਅਪਾਰਦਰਸ਼ੀ ਜਾਂ ਪਾਰਦਰਸ਼ੀ ਹੈ + ਟੂਲਬਾਰ + ਟੂਲਬਾਰ ਕੰਪੋਨੈਂਟਸ ਨੂੰ ਲੁਕਾਓ ਜਾਂ ਬਦਲੋ + ਕ੍ਰਿਏਟ ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਕ੍ਰਿਏਟ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਕ੍ਰਿਏਟ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਸੂਚਨਾਵਾਂ ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਸੂਚਨਾਵਾਂ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਸੂਚਨਾਵਾਂ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਖੋਜ ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਖੋਜ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਖੋਜ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ। + ਚੌੜੀ ਖੋਜ ਪੱਟੀ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਚੌੜੀ ਖੋਜ ਪੱਟੀ ਸਮਰੱਥ ਹੈ + ਚੌੜੀ ਖੋਜ ਪੱਟੀ ਅਯੋਗ ਹੈ @@ -126,25 +315,67 @@ Second \"item\" text" + ਕੋਲੈਪਸ ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਕੋਲੈਪਸ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਕੋਲੈਪਸ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + ਪੂਰੀ ਸਕ੍ਰੀਨ ਬਟਨ ਨੂੰ ਲੁਕਾਓ + ਪੂਰੀ ਸਕ੍ਰੀਨ ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਪੂਰੀ ਸਕ੍ਰੀਨ ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + + + ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਕਾਰਡਾਂ ਨੂੰ ਲੁਕਾਓ + ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਕਾਰਡ ਲੁਕਾਏ ਗਏ ਹਨ + ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਕਾਰਡ ਦਿਖਾਏ ਗਏ ਹਨ - + ਪੂਰੀ ਸਕ੍ਰੀਨ ਵੱਡੇ ਸੀਕਬਾਰ ਨੂੰ ਸਮਰੱਥ ਕਰੋ + ਪੂਰੀ ਸਕ੍ਰੀਨ ਸੀਕਬਾਰ ਵੱਡੇ ਆਕਾਰ ਦਾ ਹੈ + ਪੂਰੀ ਸਕ੍ਰੀਨ ਸੀਕਬਾਰ ਆਮ ਆਕਾਰ ਦਾ ਹੈ + ਚੈਨਲ ਪੰਨੇ ਵਿੱਚ Shorts ਨੂੰ ਲੁਕਾਓ + ਚੈਨਲ ਪੰਨੇ ਵਿੱਚ ਲੁਕਾਇਆ ਗਿਆ + ਚੈਨਲ ਪੰਨੇ ਵਿੱਚ ਦਿਖਾਇਆ ਗਿਆ + ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ Shorts ਨੂੰ ਲੁਕਾਓ + ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਲੁਕਾਇਆ ਗਿਆ + ਵੀਡੀਓ ਵਰਣਨ ਵਿੱਚ ਦਿਖਾਇਆ ਗਿਆ + AI ਬਟਨ ਨੂੰ ਲੁਕਾਓ + AI ਬਟਨ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + AI ਬਟਨ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + \'ਆਟੋ-ਡੱਬਡ\' ਲੇਬਲ ਨੂੰ ਲੁਕਾਓ + ਆਟੋ-ਡੱਬਡ ਲੇਬਲ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਆਟੋ-ਡੱਬਡ ਲੇਬਲ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + - + + ਆਟੋਪਲੇਅ ਪ੍ਰੀਵਿਊ ਨੂੰ ਲੁਕਾਓ + ਆਟੋਪਲੇਅ ਪ੍ਰੀਵਿਊ ਲੁਕਾਇਆ ਗਿਆ ਹੈ + ਆਟੋਪਲੇਅ ਪ੍ਰੀਵਿਊ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + + + ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਸੁਝਾਏ ਵੀਡੀਓ ਨੂੰ ਲੁਕਾਓ + "ਜਦੋਂ ਆਟੋਪਲੇਅ ਬੰਦ ਹੁੰਦਾ ਹੈ ਤਾਂ ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਸੁਝਾਇਆ ਵੀਡੀਓ ਲੁਕਾਇਆ ਜਾਂਦਾ ਹੈ + +ਆਟੋਪਲੇਅ ਨੂੰ YouTube ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ: +ਸੈਟਿੰਗਾਂ → ਪਲੇਬੈਕ → ਅਗਲਾ ਵੀਡੀਓ ਆਪਣੇ ਆਪ ਚਲਾਓ" + ਅੰਤਿਮ ਸਕ੍ਰੀਨ ਸੁਝਾਇਆ ਵੀਡੀਓ ਦਿਖਾਇਆ ਗਿਆ ਹੈ + - + + ਪਲੇਅਰ ਪੌਪਅੱਪ ਪੈਨਲ ਲੁਕਾਓ + ਪਲੇਅਰ ਪੌਪਅੱਪ ਪੈਨਲ ਲੁਕੇ ਹੋਏ ਹਨ + ਪਲੇਅਰ ਪੌਪਅੱਪ ਪੈਨਲ ਦਿਖਾਏ ਗਏ ਹਨ + @@ -155,10 +386,12 @@ Second \"item\" text" - - + ਸਿਰਫ਼ ਸੰਗੀਤ ਵੀਡੀਓਜ਼ ਵਿੱਚ ਵਰਤਣ ਲਈ। ਸੰਗੀਤ ਵੀਡੀਓਜ਼ ਦੇ ਉਹ ਭਾਗ ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਸੰਗੀਤ ਨਹੀਂ ਹੈ, ਜੋ ਪਹਿਲਾਂ ਹੀ ਕਿਸੇ ਹੋਰ ਸ਼੍ਰੇਣੀ ਵਿੱਚ ਸ਼ਾਮਲ ਨਹੀਂ ਹਨ + ਭਾਗ ਜਮ੍ਹਾਂ ਨਹੀਂ ਕਰ ਸਕਦਾ: %s + "ਭਾਗ ਜਮ੍ਹਾਂ ਨਹੀਂ ਕਰ ਸਕਦਾ। +ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ" @@ -170,7 +403,11 @@ Second \"item\" text" - + + ਅਸਮਰੱਥ + ਰੰਗ + ਕਾਲਾ ਅਤੇ ਚਿੱਟਾ + @@ -187,7 +424,11 @@ Second \"item\" text" - + + ਟੈਪ ਅਤੇ ਹੋਲਡ ਹੈਪਟਿਕਸ ਨੂੰ ਅਸਮਰੱਥ ਕਰੋ + ਟੈਪ ਅਤੇ ਹੋਲਡ ਹੈਪਟਿਕਸ ਅਸਮਰੱਥ ਹੈ + ਟੈਪ ਅਤੇ ਹੋਲਡ ਹੈਪਟਿਕਸ ਸਮਰੱਥ ਹੈ + @@ -200,6 +441,11 @@ Second \"item\" text" + + ਪ੍ਰੀਮੀਅਮ ਗੁਣਵੱਤਾ ਵਿਕਲਪਾਂ ਨੂੰ ਲੁਕਾਓ + ਪ੍ਰੀਮੀਅਮ ਗੁਣਵੱਤਾ ਵਿਕਲਪ ਲੁਕਾਏ ਗਏ ਹਨ + ਪ੍ਰੀਮੀਅਮ ਗੁਣਵੱਤਾ ਵਿਕਲਪ ਦਿਖਾਏ ਗਏ ਹਨ + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 8eb424ad6a..45a502f664 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -18,1267 +18,1352 @@ Second \"item\" text" --> - - - Nazwa aplikacji - - Własna - Ikona aplikacji - Oryginalna - ReVanced - - ReVanced minimalna - ReVanced skalowana - - Niestandardowa - - - Sprawdzanie nie powiodło się - Otwórz oficjalną stronę internetową - Ignoruj - <h5>Ta aplikacja nie wydaje się być przez ciebie załatana.</h5><br>Ta aplikacja może nie działać poprawnie, <b>może być szkodliwa lub nawet niebezpieczna dla użycia</b>.<br><br>Te sprawdzenia oznaczają, że ta aplikacja jest wstępnie przygotowana lub uzyskana od kogoś innego:<br><br><small>%1$s</small><br>Zdecydowanie zaleca się odinstalować aplikację <b>i załatać ją samodzielnie</b>, aby upewnić się, że używasz zweryfikowanej i bezpiecznej aplikacji.<p><br>Jeśli zostanie to zignorowane, ostrzeżenie wyskoczy tylko dwukrotnie. - Załatano na innym urządzeniu - Nie zainstalowany przez ReVanced Manager - Załatano ponad 10 minut temu - Załatano %s dni temu - Data kompilacji APK jest uszkodzona - - - Powiadomienie ReVanced - Twoja historia oglądania nie jest zapisywana.<br><br>Najprawdopodobniej jest to spowodowane blokadą reklam DNS lub serwer proxy.<br><br>Aby to naprawić, dodaj do białej listy<b>s.youtube.com</b> lub wyłącz wszystkie blokady DNS i proxy. - Nie pokazuj ponownie - - - Ustawienia - ReVanced - Czy na pewno chcesz kontynuować? - Zapisz - Zresetuj - Zresetuj kolor - Nieprawidłowy kolor - Wymagane ponowne uruchomienie - Aby zmiany zostały wprowadzone, uruchom ponownie aplikację. - Uruchom ponownie - Zaimportuj - Skopiuj - Przywrócono domyślne ustawienia ReVanced - Zaimportowano %d ustawień - Importowanie nie powiodło się: %s - Szukaj w ustawieniach - Brak wyników dla „%s” - Spróbuj innego słowa kluczowego - Ostatnie wyszukiwania - Usunąć z historii wyszukiwania? - Wyczyść historię wyszukiwania - Czy na pewno chcesz wyczyścić całą historię wyszukiwania? - Wskazówki dotyczące wyszukiwania - "• Dotknij ścieżki, aby do niej przejść + + + Nazwa aplikacji + + Własna + Ikona aplikacji + Oryginalna + ReVanced + + ReVanced minimalna + ReVanced skalowana + + Niestandardowa + + + Sprawdzanie nie powiodło się + Otwórz oficjalną stronę internetową + Ignoruj + <h5>Ta aplikacja nie wydaje się być przez ciebie załatana.</h5><br>Ta aplikacja może nie działać poprawnie, <b>może być szkodliwa lub nawet niebezpieczna dla użycia</b>.<br><br>Te sprawdzenia oznaczają, że ta aplikacja jest wstępnie przygotowana lub uzyskana od kogoś innego:<br><br><small>%1$s</small><br>Zdecydowanie zaleca się odinstalować aplikację <b>i załatać ją samodzielnie</b>, aby upewnić się, że używasz zweryfikowanej i bezpiecznej aplikacji.<p><br>Jeśli zostanie to zignorowane, ostrzeżenie wyskoczy tylko dwukrotnie. + Załatano na innym urządzeniu + Nie zainstalowany przez ReVanced Manager + Załatano ponad 10 minut temu + Załatano %s dni temu + Data kompilacji APK jest uszkodzona + + + Powiadomienie ReVanced + Twoja historia oglądania nie jest zapisywana.<br><br>Najprawdopodobniej jest to spowodowane blokadą reklam DNS lub serwer proxy.<br><br>Aby to naprawić, dodaj do białej listy<b>s.youtube.com</b> lub wyłącz wszystkie blokady DNS i proxy. + Nie pokazuj ponownie + + + Ustawienia + ReVanced + Czy na pewno chcesz kontynuować? + Zapisz + Zresetuj + Zresetuj kolor + Nieprawidłowy kolor + Wymagane ponowne uruchomienie + Aby zmiany zostały wprowadzone, uruchom ponownie aplikację. + Uruchom ponownie + Zaimportuj + Skopiuj + Przywrócono domyślne ustawienia ReVanced + Zaimportowano %d ustawień + Importowanie nie powiodło się: %s + Szukaj w ustawieniach + Brak wyników dla „%s” + Spróbuj innego słowa kluczowego + Ostatnie wyszukiwania + Usunąć z historii wyszukiwania? + Wyczyść historię wyszukiwania + Czy na pewno chcesz wyczyścić całą historię wyszukiwania? + Wskazówki dotyczące wyszukiwania + "• Dotknij ścieżki, aby do niej przejść • Długo naciśnij ustawienie, aby do niego przejść • Naciśnij Enter, aby zapisać wyszukiwane hasło w historii • Wyszukiwanie ignoruje wielkość liter i interpunkcję • Ustawienia nadrzędne pojawiają się powyżej wyłączonych ustawień podrzędnych" - Historia wyszukiwania jest pusta - Aby zapisać historię wyszukiwania, wpisz zapytanie i naciśnij Enter - Pokaż historię wyszukiwania ustawień - Historia wyszukiwania ustawień jest wyświetlana - Historia wyszukiwania w ustawieniach jest niewidoczna - Pokaż ikony ustawień ReVanced - Ikony ustawień są widoczne - Ikony ustawień nie są wyświetlane - Język ReVanced - "Tłumaczenia dla niektórych języków mogą być brakujące lub niekompletne. + Historia wyszukiwania jest pusta + Aby zapisać historię wyszukiwania, wpisz zapytanie i naciśnij Enter + Pokaż historię wyszukiwania ustawień + Historia wyszukiwania ustawień jest wyświetlana + Historia wyszukiwania w ustawieniach jest niewidoczna + Wyłącz pogrubione ikony + Ikony nie są pogrubione + Ikony są pogrubione + Pokaż ikony ustawień ReVanced + Ikony ustawień są widoczne + Ikony ustawień nie są wyświetlane + Język ReVanced + "Tłumaczenia dla niektórych języków mogą być brakujące lub niekompletne. Aby przetłumaczyć nowe języki lub poprawić istniejące tłumaczenia, odwiedź translate.revanced.app" - Język aplikacji - Zaimportuj / Wyeksportuj - Zaimportuj / Wyeksportuj ustawienia ReVanced - - Używasz łatek ReVanced w wersji <i>%s</i> - Notka - Ta wersja jest wersją wstępną i mogą wystąpić nieoczekiwane problemy - Oficjalne linki - + Używasz łatek ReVanced w wersji <i>%s</i> + Notka + Ta wersja jest wersją wstępną i mogą wystąpić nieoczekiwane problemy + Oficjalne linki + - - - Ustawienia GmsCore - Ustawienia GmsCore - - MicroG GmsCore nie jest zainstalowany, zainstaluj. - Wymagane działanie - "MicroG GmsCore nie posiada uprawnień do działania w tle. + + + GmsCore + Ustawienia GmsCore + Sprawdź dostępność aktualizacji GmsCore + Sprawdzanie aktualizacji jest włączone + Sprawdzanie aktualizacji jest wyłączone + Otwórz Ustawienia GmsCore + Ustawienia GmsCore + + MicroG GmsCore nie jest zainstalowany, zainstaluj. + Wymagane działanie + Nie udało się sprawdzić dostępności aktualizacji MicroG GmsCore + Dostępna jest nowa wersja (%1$s) MicroG GmsCore. Obecnie używasz wersji %2$s. + "MicroG GmsCore nie posiada uprawnień do działania w tle. Postępuj zgodnie z instrukcją \"Don't kill my app\" dla swojego telefonu i zastosuj instrukcje do swojej instalacji MicroG. Jest to wymagane do działania aplikacji." - Otwórz stronę - "Aby uniknąć problemów, musisz wyłączyć optymalizację baterii dla MicroG GmsCore. + Otwórz stronę + Anuluj + "Aby uniknąć problemów, musisz wyłączyć optymalizację baterii dla MicroG GmsCore. Wyłączenie optymalizacji baterii dla MicroG nie wpłynie negatywnie na zużycie baterii. Naciśnij przycisk Kontynuuj i zezwól na zmiany optymalizacji." - Kontynuuj - - - Fałszuj strumienie wideo - Fałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem - Sfałszuj strumienie wideo - Sfałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem - Oszukaj strumienie filmu - "Strumienie wideo są fałszowane + Kontynuuj + + + Fałszuj strumienie wideo + Fałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem + Sfałszuj strumienie wideo + Sfałszuj strumienie wideo klienta, aby zapobiec problemom z odtwarzaniem + Oszukaj strumienie filmu + "Strumienie wideo są fałszowane Jeśli jesteś użytkownikiem YouTube Premium, to ustawienie może nie być wymagane" - "Strumienie wideo nie są fałszowane + "Strumienie wideo nie są fałszowane Odtwarzanie może nie działać" - Wyłączenie tego ustawienia może spowodować problemy z odtwarzaniem. - Domyślny klient - - - Wymuś język oryginalnego dźwięku - Używanie oryginalnego języka audio - Używanie domyślnego dźwięku - - Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio - - - Debugowanie - Włącz lub wyłącz opcje debugowania - Logi do debugowania - Logi debugowania są włączone - Logi debugowania są wyłączone - Logi śladów stosów - Logi do debugowania zawierają ślady stosów - Logi do debugowania nie zawierają śladów stosów - Komunikaty o błędach ReVanced - Wyświetlany jest toast, jeśli wystąpi błąd - Toast nie jest wyświetlany, jeśli wystąpi błąd - "Wyłączenie notyfikacji błędów ukrywa wszystkie powiadomienia o błędach ReVanced. + Wyłączenie tego ustawienia może spowodować problemy z odtwarzaniem. + Domyślny klient + + + Wymuś język oryginalnego dźwięku + Używanie oryginalnego języka audio + Używanie domyślnego dźwięku + + Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio + + + Debugowanie + Włącz lub wyłącz opcje debugowania + Logi do debugowania + Logi debugowania są włączone + Logi debugowania są wyłączone + Logi śladów stosów + Logi do debugowania zawierają ślady stosów + Logi do debugowania nie zawierają śladów stosów + Komunikaty o błędach ReVanced + Wyświetlany jest toast, jeśli wystąpi błąd + Toast nie jest wyświetlany, jeśli wystąpi błąd + "Wyłączenie notyfikacji błędów ukrywa wszystkie powiadomienia o błędach ReVanced. Nie będziesz informowany o żadnych nieoczekiwanych zdarzeniach." - Eksportuj dzienniki debugowania - Kopiuje dzienniki debugowania ReVanced do schowka - Rejestrowanie debugowania jest wyłączone - Nie znaleziono dzienników - Dzienniki skopiowane - Nie udało się wyeksportować logów: %s - Wyczyść dzienniki debugowania - Czyści wszystkie zapisane dzienniki debugowania ReVanced - Dzienniki wyczyszczone - Manager flag funkcji - Zarządzaj flagami funkcji typu boolean - Aktywne flagi (%d) - Zablokowane flagi (%d) - Szukaj flag... - Flagi zapisane - Flagi zresetowane - Flagi skopiowane do schowka - Logi protokołu bufora - Logi do debugowania zawierają bufory - Logi do debugowania nie zawierają buforów - "Włączenie tego ustawienia spowoduje rejestrowanie dodatkowych danych układu, w tym tekstu na ekranie dla niektórych komponentów interfejsu użytkownika.\n\nMoże to pomóc w identyfikacji komponentów podczas tworzenia filtrów niestandardowych.\n\nWłączenie tej opcji spowoduje jednak również rejestrowanie niektórych danych użytkownika, takich jak adres IP." - - - Oczyść linki udostępniania - Parametr zapytania śledzenia jest usuwany z udostępnianych linków - Parametr zapytania śledzenia nie jest usuwany z udostępnianych linków - Zmień linki udostępniania na youtube.com - Udostępnione linki używają youtube.com - Udostępnione linki używają music.youtube.com - - - Własny filtr - Ukryj komponenty za pomocą własnego filtra - Włącz własny filtr - Filtr niestandardowy jest włączony - Filtr niestandardowy jest wyłączony - Własny filtr - - Lista tekstów tworzących ścieżkę komponentów do filtrowania, oddzielone nowymi wierszami - Nieprawidłowy niestandardowy filtr: %s - - - - - O aplikacji - Reklamy - Alternatywne miniaturki - Strona główna - Ogólne - Odtwarzacz - Shorts - Pasek postępu filmu - Sterowanie przesuwaniem - Przywróć YouTube Dislike - Różne - Film - Przywróć stare menu ustawień - Wyświetlane są stare menu ustawień - Stare menu ustawień nie są wyświetlane - - - Wyłącz odtwarzanie Shortsów w tle - Odtwarzanie w tle Shortsów jest wyłączone - Odtwarzanie w tle Shortsów jest włączone - - - Ukryj karty albumów - Karty albumów są ukryte - Karty albumów są widoczne - Ukryj karty artystów - Karty artystów są ukryte - Karty artystów są widoczne - Ukryj paski z kategoriami - Paski z kategoriami są ukryte - Paski z kategoriami są widoczne - Ukryj posty społeczności - Posty społeczności są ukryte - Posty społeczności są widoczne - Ukryj kompaktowe banery - Kompaktowe banery są ukryte - Kompaktowe banery są widoczne - Ukryj rozwijaną kartę - Rozwijana karta pod filmami jest ukryta - Rozwijana karta pod filmami jest widoczna - Ukryj pływający przycisk mikrofonu - Pływający przycisk mikrofonu w wyszukiwarce jest ukryty - Pływający przycisk mikrofonu w wyszukiwaniu jest widoczny - Ukryj poziome półki - "Półki są ukryte, takie jak: + Eksportuj dzienniki debugowania + Kopiuje dzienniki debugowania ReVanced do schowka + Rejestrowanie debugowania jest wyłączone + Nie znaleziono dzienników + Dzienniki skopiowane + Nie udało się wyeksportować logów: %s + Wyczyść dzienniki debugowania + Czyści wszystkie zapisane dzienniki debugowania ReVanced + Dzienniki wyczyszczone + Manager flag funkcji + Zarządzaj flagami funkcji typu boolean + Aktywne flagi (%d) + Zablokowane flagi (%d) + Szukaj flag... + Flagi zapisane + Flagi zresetowane + Flagi skopiowane do schowka + Uruchom ponownie aplikację, aby użyć tej funkcji + Logi protokołu bufora + Logi do debugowania zawierają bufory + Logi do debugowania nie zawierają buforów + "Włączenie tego ustawienia spowoduje rejestrowanie dodatkowych danych układu, w tym tekstu na ekranie dla niektórych komponentów interfejsu użytkownika.\n\nMoże to pomóc w identyfikacji komponentów podczas tworzenia filtrów niestandardowych.\n\nWłączenie tej opcji spowoduje jednak również rejestrowanie niektórych danych użytkownika, takich jak adres IP." + + + Oczyść linki udostępniania + Parametr zapytania śledzenia jest usuwany z udostępnianych linków + Parametr zapytania śledzenia nie jest usuwany z udostępnianych linków + Zmień linki udostępniania na youtube.com + Udostępnione linki używają youtube.com + Udostępnione linki używają music.youtube.com + + + Własny filtr + Ukryj komponenty za pomocą własnego filtra + Włącz własny filtr + Filtr niestandardowy jest włączony + Filtr niestandardowy jest wyłączony + Własny filtr + + Lista tekstów tworzących ścieżkę komponentów do filtrowania, oddzielone nowymi wierszami + Nieprawidłowy niestandardowy filtr: %s + + + + + O aplikacji + Reklamy + Alternatywne miniaturki + Strona główna + Ogólne + Odtwarzacz + Shorts + Pasek postępu filmu + Sterowanie przesuwaniem + Przywróć YouTube Dislike + Różne + Film + Przywróć stare menu ustawień + Wyświetlane są stare menu ustawień + Stare menu ustawień nie są wyświetlane + + + Wyłącz odtwarzanie Shortsów w tle + Odtwarzanie w tle Shortsów jest wyłączone + Odtwarzanie w tle Shortsów jest włączone + + + Ukryj półkę sklepu twórcy + Półka sklepu twórcy pod odtwarzaczem wideo jest ukryta + Półka sklepu twórców pod odtwarzaczem wideo jest widoczna + Ukryj karty albumów + Karty albumów są ukryte + Karty albumów są widoczne + Ukryj karty artystów + Karty artystów są ukryte + Karty artystów są widoczne + Ukryj paski z kategoriami + Paski z kategoriami są ukryte + Paski z kategoriami są widoczne + Ukryj sekcję komentarzy pod filmami w kanale głównym + Sekcja komentarzy pod filmami w kanale głównym jest ukryta + Sekcja komentarzy pod filmami w kanale głównym jest widoczna + Ukryj posty społeczności + Posty społeczności są ukryte + Posty społeczności są widoczne + Ukryj kompaktowe banery + Kompaktowe banery są ukryte + Kompaktowe banery są widoczne + Ukryj rozwijaną kartę + Rozwijana karta pod filmami jest ukryta + Rozwijana karta pod filmami jest widoczna + Ukryj pływający przycisk mikrofonu + Pływający przycisk mikrofonu w wyszukiwarce jest ukryty + Pływający przycisk mikrofonu w wyszukiwaniu jest widoczny + Ukryj poziome półki + "Półki są ukryte, takie jak: • Najświeższe wiadomości • Kontynuuj oglądanie • Odkryj więcej kanałów • Najtrafniejsze • Zakupy • Obejrzyj ponownie" - Półki poziome są widoczne - Ukryj półkę obrazów - Półka obrazów w wynikach wyszukiwania jest ukryta - Półka obrazów w wynikach wyszukiwania jest widoczna - Ukryj najnowsze posty - Najnowsze posty są ukryte - Najnowsze posty są widoczne - Ukryj składanki - Składanki są ukryte - Składanki są widoczne - Ukryj sekcję filmów kinowych - Sekcja filmów kinowych jest ukryta - Sekcja filmów kinowych jest widoczna - - Ukryj przycisk \'Powiadom mnie\' - Przycisk „Powiadom mnie” jest ukryty - Przycisk „Powiadom mnie” jest widoczny - Ukryj pokój gier - Pokój gier jest widoczny - Pokój gier jest ukryty - + Ukryj przycisk „Najnowsze filmy” + Przycisk Najnowsze filmy jest ukryty + Przycisk Najnowsze filmy jest widoczny + Ukryj składanki + Składanki są ukryte + Składanki są widoczne + Ukryj sekcję filmów kinowych + Sekcja filmów kinowych jest ukryta + Sekcja filmów kinowych jest widoczna + + Ukryj przycisk \'Powiadom mnie\' + Przycisk „Powiadom mnie” jest ukryty + Przycisk „Powiadom mnie” jest widoczny + Ukryj pokój gier + Pokój gier jest widoczny + Pokój gier jest ukryty + - Ukryj przycisk \'Pokaż więcej\' - Przycisk „Pokaż więcej” w wynikach wyszukiwania jest ukryty - Przycisk „Pokaż więcej” w wynikach wyszukiwania jest widoczny - Ukryj ankiety - Ankiety są ukryte - Ankiety są widoczne - Ukryj pasek z biletami - Pasek z biletami jest ukryty - Pasek z biletami jest widoczny - - Ukryj etykiety rekomendacji wideo - Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są ukryte - Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są widoczne - Ukryj odstęp wizualny - Odstęp wizualny jest ukryty - Odstęp wizualny jest widoczny - - Ukryj YouTube Doodles - Animacja Doodles YouTube na logo jest ukryta - Animacja YouTube Doodles na logo jest widoczna - "'YouTube Doodles' są wyświetlane kilka dni w roku. - -Jeśli Doodle jest obecnie wyświetlany w Twoim regionie, a to ustawienie ukrycia jest włączone, pasek filtrów pod paskiem wyszukiwania również zostanie ukryty." - Ukryj pasek kanału - Pasek kanału jest ukryty - Pasek kanału jest widoczny - Ukryj znaki wodne kanałów - Znaki wodne są ukryte - Znaki wodne są widoczne - Ukryj ramki ze zbiórkami - Ramki ze zbiórkami pieniędzy są ukryte - Ramki ze zbiórkami pieniędzy są widoczne - Ukryj ramki alarmowe - Ramki alarmowe są ukryte - Ramki alarmowe są widoczne - Ukryj panele informacyjne - Panele informacyjne są ukryte - Panele informacyjne są widoczne - - Ukryj przycisk Dołącz - Przycisk „Dołącz” jest ukryty - Przycisk „Dołącz” jest widoczny - Ukryj panele medyczne - Panele medyczne są ukryte - Panele medyczne są widoczne - Ukryj szybkie akcje - Szybkie akcje na pełnym ekranie są ukryte - Szybkie akcje na pełnym ekranie są widoczne - Ukryj powiązane filmy - Powiązane filmy w szybkich akcjach są ukryte - Powiązane filmy w szybkich akcjach są widoczne - Ukryj wytyczne dla subskrybentów - Wytyczne społeczności subskrybentów są widoczne - Wytyczne społeczności subskrybentów są widoczne - Ukryj reakcje czasowe - Reakcje czasowe są ukryte - Reakcje czasowe są widoczne - Ukryj sekcję „Podsumowanie wideo wygenerowane przez AI” - Sekcja podsumowania wideo wygenerowana przez AI jest ukryta - Sekcja podsumowania wideo generowanego przez AI jest widoczna - Ukryj Pytanie - Sekcja Pytania jest ukryta - Sekcja Pytania jest widoczna - Ukryj atrybuty - Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są ukryte - Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są widoczne - Ukryj rozdziały - Sekcja rozdziałów jest ukryta - Sekcja rozdziałów jest widoczna - Ukryj „Jak powstała ta treść” - Sekcja „Jak powstała ta treść” jest ukryta - Sekcja „Jak powstała ta treść” jest widoczna - Ukryj punkty Hype - Punkty Hype są ukryte - Punkty Hype są pokazane - Ukryj „Odkryj podcast” - Sekcja „Odkryj podcast” jest ukryta - Sekcja „Odkryj podcast” jest widoczna - Ukryj wyróżnione linki - Sekcja polecanych linków jest ukryta - Sekcja polecanych linków jest wyświetlona - Ukryj polecane filmy - Sekcja polecanych filmów jest ukryta - Sekcja polecanych filmów jest wyświetlona - Ukryj karty informacyjne - Sekcja kart informacyjnych jest ukryta - Sekcja kart informacyjnych jest widoczna - Ukryj „Kluczowe koncepcje” - Sekcja „Kluczowe koncepcje” jest ukryta - Sekcja „Kluczowe koncepcje” jest widoczna - Ukryj przycisk Subskrybuj - Przycisk Subskrybuj jest ukryty - Przycisk Subskrybuj jest wyświetlony - Ukryj transkrypcję - Sekcja transkrypcji jest ukryta - Sekcja transkrypcji jest widoczna - Opis filmu - Ukryj lub pokaż elementy opisu filmu - Pasek filtrowania - Ukryj lub pokaż pasek filtrów w kanałach, powiązanych filmach, wynikach wyszukiwania i historii oglądania - Ukryj w kanałach - Ukryte w kanałach - Pokazane w kanałach - W powiązanych filmach - Ukryte w powiązanych filmach - Widoczne w powiązanych filmach - Ukryj w wynikach wyszukiwania - Ukryte w wynikach wyszukiwania - Wyświetlane w wynikach wyszukiwania - Ukryj w historii oglądania - Ukryty w historii oglądania - Widoczne w historii oglądania - Strona kanału - Ukryj lub pokaż komponenty strony kanału - - Ukryj przycisk Społeczność - Przycisk Społeczność jest ukryty - Przycisk Społeczność jest widoczny - - Ukryj półkę \"Dla Ciebie\" - Półka \"Dla Ciebie\" jest ukryta - Półka \"Dla Ciebie\" jest widoczna - - Ukryj przycisk Dołącz - Przycisk Dołącz jest ukryty - Przycisk Dołącz jest widoczny - Ukryj podgląd linków - Podgląd linków jest ukryty - Podgląd linków jest widoczny - Ukryj półkę członków - Półka członków jest ukryta - Półka dla członków jest widoczna - - Ukryj przycisk Sklep - Przycisk Sklep jest ukryty - Przycisk Sklep jest widoczny - - Ukryj przycisk Subskrybuj - Przycisk Subskrybuj jest ukryty - Przycisk Subskrybuj jest widoczny - Komentarze - Ukryj lub pokazuj komentarze - Ukryj podsumowanie czatu AI - Podsumowanie czatu AI jest ukryte - Podsumowanie czatu AI jest pokazane - Ukryj podsumowanie komentarzy AI - Podsumowanie komentarzy AI jest ukryte - Podsumowanie komentarzy AI jest pokazane - Ukryj wytyczne kanału - Wytyczne kanału są ukryte - Wytyczne kanału są widoczne - Ukryj nagłówki komentarzy sponsorów - Nagłówek komentarzy od członków jest ukryty - Nagłówek komentarzy od członków jest widoczny - Ukryj sekcję komentarzy - Sekcja komentarzy jest ukryta - Sekcja komentarzy jest widoczna - Ukryj wytyczne dla społeczności - Wytyczne społeczności są ukryte - Wytyczne społeczności są widoczne - Przycisk od tworzenia Shortsów - Przycisk Utwórz Short jest ukryty - Przycisk Utwórz Short jest widoczny - Ukryj przyciski emoji i znacznika czasu - Przyciski emoji i znacznika czasu są ukryte - Przyciski emoji i znacznika czasu są widoczne - Ukryj podgląd komentarzy - Podgląd komentarzy jest ukryty - Podgląd komentarzy jest widoczny - Ukryj przycisk superpodziękowania - Przycisk superpodziękowania jest ukryty - Przycisk superpodziękowania jest widoczny - Ukryj liczbę wyświetleń - Liczba wyświetleń jest ukryta w kanale i wynikach wyszukiwania - Liczba wyświetleń jest widoczna w kanale i wynikach wyszukiwania - - "Ograniczenia: -• Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać liczby wyświetleń -• Ta funkcja nie działa z wersją dla pojazdów" - Ukryj czas przesłania - Czas przesłania jest ukryty w kanale i wynikach wyszukiwania - Czas przesłania jest widoczny w kanale i wynikach wyszukiwania - - "Ograniczenia: -• Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać czasy przesłania -• Ta funkcja nie działa z formatem samochodowym" - Filtrowanie słów - Ukryj wyszukiwanie i filmy na stronie głównej za pomocą filtrów słów - Filtruj filmy na stronie głównej - Filmy na stronie głównej są filtrowane przez słowa - Filmy na stronie głównej nie są filtrowane przez słowa - Filtruj wyniki wyszukiwania - Wyniki wyszukiwania są filtrowane przez słowa - Wyniki wyszukiwania nie są filtrowane przez słowa - Filtruj filmy na stronie subskrypcji - Filmy na stronie subskrypcji są filtrowane przez słowa - Filmy na stronie subskrypcji nie są filtrowane przez słowa - Słowa do ukrycia - + Ukryj etykiety rekomendacji wideo + Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są ukryte + Etykiety „Obejrzyj także” i „Może Ci się spodobać” w wynikach wyszukiwania są widoczne + Ukryj odstęp wizualny + Odstęp wizualny jest ukryty + Odstęp wizualny jest widoczny + Ukryj wyniki wyszukiwania stron internetowych + Wyniki wyszukiwania stron są ukryte + Wyniki wyszukiwania stron są widoczne + Ukryj sekcję „Może Ci się spodobać” + Sekcja „Może Ci się spodobać” jest ukryta + Sekcja „Może Ci się spodobać” jest widoczna + + Ukryj YouTube Doodles + Animacja Doodles YouTube na logo jest ukryta + Animacja YouTube Doodles na logo jest widoczna + Ukryj pasek kanału + Pasek kanału jest ukryty + Pasek kanału jest widoczny + Ukryj znaki wodne kanałów + Znaki wodne są ukryte + Znaki wodne są widoczne + Ukryj ramki ze zbiórkami + Ramki ze zbiórkami pieniędzy są ukryte + Ramki ze zbiórkami pieniędzy są widoczne + Ukryj ramki alarmowe + Ramki alarmowe są ukryte + Ramki alarmowe są widoczne + Ukryj panele informacyjne + Panele informacyjne są ukryte + Panele informacyjne są widoczne + + Ukryj przycisk Dołącz + Przycisk „Dołącz” jest ukryty + Przycisk „Dołącz” jest widoczny + + Ukryj przycisk „Powtórka czatu na żywo” + Przycisk powtórki czatu na żywo w nakładce odtwarzacza jest ukryty + Przycisk powtórki czatu na żywo w nakładce odtwarzacza jest widoczny + Ukryj panele medyczne + Panele medyczne są ukryte + Panele medyczne są widoczne + Ukryj szybkie akcje + Szybkie akcje na pełnym ekranie są ukryte + Szybkie akcje na pełnym ekranie są widoczne + Ukryj powiązane filmy + Powiązane filmy w szybkich akcjach są ukryte + Powiązane filmy w szybkich akcjach są widoczne + Ukryj wytyczne dla subskrybentów + Wytyczne społeczności subskrybentów są widoczne + Wytyczne społeczności subskrybentów są widoczne + Ukryj reakcje czasowe + Reakcje czasowe są ukryte + Reakcje czasowe są widoczne + Ukryj tytuł filmu + Tytuł filmu w nakładce odtwarzacza jest ukryty + Tytuł filmu w nakładce odtwarzacza jest widoczny + Ukryj sekcję „Podsumowanie wideo wygenerowane przez AI” + Sekcja podsumowania wideo wygenerowana przez AI jest ukryta + Sekcja podsumowania wideo generowanego przez AI jest widoczna + Ukryj Pytanie + Sekcja Pytania jest ukryta + Sekcja Pytania jest widoczna + Ukryj atrybuty + Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są ukryte + Sekcje „Polecane miejsca”, „Gry”, „Muzyka” i „Wspomniane osoby” są widoczne + Ukryj rozdziały + Sekcja rozdziałów jest ukryta + Sekcja rozdziałów jest widoczna + Ukryj „Postęp kursu” + Sekcja Postęp kursu jest ukryta + Sekcja Postęp kursu jest widoczna + Ukryj Odkrywaj + Sekcje Odkryj ten kurs i Odkryj podcast są ukryte + Sekcje Odkryj ten kurs i Odkryj podcast są widoczne + Ukryj „Odkryj ten kurs” + Sekcja Odkryj ten kurs jest ukryta + Sekcja Odkryj ten kurs jest widoczna + Ukryj „Odkryj podcast” + Sekcja „Odkryj podcast” jest ukryta + Sekcja „Odkryj podcast” jest widoczna + Ukryj „Odkryj podcast” + Sekcja „Odkryj podcast” jest ukryta + Sekcja „Odkryj podcast” jest widoczna + Ukryj wyróżnione linki + Sekcja polecanych linków jest ukryta + Sekcja polecanych linków jest wyświetlona + Ukryj „Polecane miejsca” + Sekcja Polecane miejsca jest ukryta + Sekcja Polecane miejsca jest widoczna + Ukryj polecane filmy + Sekcja polecanych filmów jest ukryta + Sekcja polecanych filmów jest wyświetlona + Włącz filtr menu wysuwanego kanału + Filtr menu wysuwanego kanału jest włączony + Filtr menu wysuwanego kanału jest wyłączony + Filtr menu wysuwanego kanału + Wpisz nazwy elementów menu wysuwanego do filtrowania, po jednej w wierszu + Ukryj Gry + Sekcja Gry jest ukryta + Sekcja Gry jest widoczna + Ukryj „Jak powstała ta treść” + Sekcja „Jak powstała ta treść” jest ukryta + Sekcja „Jak powstała ta treść” jest widoczna + Ukryj punkty Hype + Punkty Hype są ukryte + Punkty Hype są pokazane + Ukryj karty informacyjne + Sekcja kart informacyjnych jest ukryta + Sekcja kart informacyjnych jest widoczna + Ukryj „Kluczowe koncepcje” + Sekcja „Kluczowe koncepcje” jest ukryta + Sekcja „Kluczowe koncepcje” jest widoczna + Ukryj Muzykę + Sekcja Muzyka jest ukryta + Sekcja Muzyka jest widoczna + Ukryj przycisk Subskrybuj + Przycisk Subskrybuj jest ukryty + Przycisk Subskrybuj jest wyświetlony + Ukryj transkrypcję + Sekcja transkrypcji jest ukryta + Sekcja transkrypcji jest widoczna + Ukryj Quizy + Sekcja Quizy jest ukryta + Sekcja Quizy jest widoczna + Opis filmu + Ukryj lub pokaż elementy opisu filmu + Pasek filtrowania + Ukryj lub pokaż pasek filtrów w kanałach, powiązanych filmach, wynikach wyszukiwania i historii oglądania + Ukryj w kanałach + Ukryte w kanałach + Pokazane w kanałach + W powiązanych filmach + Ukryte w powiązanych filmach + Widoczne w powiązanych filmach + Ukryj w wynikach wyszukiwania + Ukryte w wynikach wyszukiwania + Wyświetlane w wynikach wyszukiwania + Ukryj w historii oglądania + Ukryty w historii oglądania + Widoczne w historii oglądania + Strona kanału + Ukryj lub pokaż komponenty strony kanału + Włącz filtr zakładek kanału + Filtr zakładek kanału jest włączony + Filtr zakładek kanału jest wyłączony + Filtr zakładek kanału + Wprowadź nazwy zakładek kanału do filtrowania, po jednej w wierszu + + Ukryj przycisk Społeczność + Przycisk Społeczność jest ukryty + Przycisk Społeczność jest widoczny + + Ukryj półkę \"Dla Ciebie\" + Półka \"Dla Ciebie\" jest ukryta + Półka \"Dla Ciebie\" jest widoczna + + Ukryj przycisk Dołącz + Przycisk Dołącz jest ukryty + Przycisk Dołącz jest widoczny + Ukryj podgląd linków + Podgląd linków jest ukryty + Podgląd linków jest widoczny + Ukryj półkę członków + Półka członków jest ukryta + Półka dla członków jest widoczna + + Ukryj przycisk Sklep + Przycisk Sklep jest ukryty + Przycisk Sklep jest widoczny + + Ukryj przycisk Subskrybuj + Przycisk Subskrybuj jest ukryty + Przycisk Subskrybuj jest widoczny + Komentarze + Ukryj lub pokazuj komentarze + Ukryj podsumowanie czatu AI + Podsumowanie czatu AI jest ukryte + Podsumowanie czatu AI jest pokazane + Ukryj podsumowanie komentarzy AI + Podsumowanie komentarzy AI jest ukryte + Podsumowanie komentarzy AI jest pokazane + Ukryj wytyczne kanału + Wytyczne kanału są ukryte + Wytyczne kanału są widoczne + Ukryj nagłówki komentarzy sponsorów + Nagłówek komentarzy od członków jest ukryty + Nagłówek komentarzy od członków jest widoczny + Ukryj sekcję komentarzy + Sekcja komentarzy jest ukryta + Sekcja komentarzy jest widoczna + Ukryj wytyczne dla społeczności + Wytyczne społeczności są ukryte + Wytyczne społeczności są widoczne + Przycisk od tworzenia Shortsów + Przycisk Utwórz Short jest ukryty + Przycisk Utwórz Short jest widoczny + Ukryj przyciski emoji i znacznika czasu + Przyciski emoji i znacznika czasu są ukryte + Przyciski emoji i znacznika czasu są widoczne + Ukryj podgląd komentarzy + Podgląd komentarzy jest ukryty + Podgląd komentarzy jest widoczny + Ukryj przycisk superpodziękowania + Przycisk superpodziękowania jest ukryty + Przycisk superpodziękowania jest widoczny + Ukryj liczbę wyświetleń + Liczba wyświetleń jest ukryta w kanale i wynikach wyszukiwania + Liczba wyświetleń jest widoczna w kanale i wynikach wyszukiwania + + "Ograniczenia: +• Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać liczby wyświetleń. +• Ta funkcja nie działa z wersją dla pojazdów." + Ukryj czas przesłania + Czas przesłania jest ukryty w kanale i wynikach wyszukiwania + Czas przesłania jest widoczny w kanale i wynikach wyszukiwania + + "Ograniczenia: +• Półki Shorts, strony kanałów i wyniki wyszukiwania mogą nadal wyświetlać czasy przesłania. +• Ta funkcja nie działa z formatem samochodowym." + Filtrowanie słów + Ukryj wyszukiwanie i filmy na stronie głównej za pomocą filtrów słów + Filtruj filmy na stronie głównej + Filmy na stronie głównej są filtrowane przez słowa + Filmy na stronie głównej nie są filtrowane przez słowa + Filtruj wyniki wyszukiwania + Wyniki wyszukiwania są filtrowane przez słowa + Wyniki wyszukiwania nie są filtrowane przez słowa + Filtruj filmy na stronie subskrypcji + Filmy na stronie subskrypcji są filtrowane przez słowa + Filmy na stronie subskrypcji nie są filtrowane przez słowa + Słowa do ukrycia + - "Słowa kluczowe i wyrażenia do ukrycia, oddzielone nowymi wierszami + "Słowa kluczowe i wyrażenia do ukrycia, oddzielone nowymi wierszami Słowa kluczowe mogą być nazwami kanałów lub dowolnym tekstem wyświetlanym w tytułach filmów Słowa zawierające duże litery w środku muszą być wprowadzane z wielkością liter (np. iPhone, TikTok, LeBlanc)" - O filtrowaniu słów - "Strona główna/Subskrybcje/Wyniki wyszukiwania są filtrowane, by ukryć zawartość, która pasuje do fraz kluczowych + O filtrowaniu słów + "Strona główna/Subskrybcje/Wyniki wyszukiwania są filtrowane, by ukryć zawartość, która pasuje do fraz kluczowych -Ograniczenia -• Filmy Shorts nie mogą być ukrywane przez nazwę kanału +Ograniczenia: +• Shorts nie mogą być ukrywane przez nazwę kanału • Niektóre komponenty interfejsu mogą nie zostać ukryte • Wpisanie słowa kluczowego do pola wyszukiwania może nie pokazać żadnych wyników" - Uwzględnij całe wyrazy - - Otoczenie słowa/frazy podwójnym cudzysłowem może zapobiec częściowemu dopasowywaniu tytułów filmów i nazw kanałów<br><br>Dla przykładu,<br><b>\"ai\"</b> ukryje film: <b>Jak działa AI?</b><br>lecz nie ukryje: <b>Co oznacza aikido?</b> - - Nie można użyć słowa: %s - Dodaj cudzysłowy, aby użyć słowa: %s - Słowo zawiera sprzeczne deklaracje: %s - Słowo jest za krótkie i wymaga cudzysłowu: %s - Słowo ukryje wszystkie filmy: %s - - - Ukryj półkę sklepu twórcy - Półka sklepu twórcy pod odtwarzaczem wideo jest ukryta - Półka sklepu twórców pod odtwarzaczem wideo jest widoczna - Ukryj baner sklepu na ekranie końcowym - Baner sklepu na ekranie końcowym jest ukryty - Baner sklepu na ekranie końcowym jest widoczny - Reklamy pełnoekranowe - "Reklamy pełnoekranowe są ukryte - -Ta funkcja jest dostępna tylko dla starszych urządzeń" - Reklamy pełnoekranowe są widoczne - - Ukrycie pełnoekranowych reklam działa tylko na starszych urządzeniach - Reklamy ogólne - Ogólne reklamy są ukryte - Ogólne reklamy są widoczne - Banery towarowe - Banery z towarami są ukryte - Banery z towarami są widoczne - Etykiety płatnej promocji - Etykiety płatnej promocji są ukryte - Etykiety płatnej promocji są widoczne - Karty z autopromocją - Karty z autopromocją są ukryte - Karty z autopromocją są widoczne - Ukryj linki do zakupów - Linki do zakupów w opisie wideo są ukryte - Linki zakupowe w opisie filmu są widoczne - Ukryj baner \'Zobacz produkty\' - Baner „Zobacz produkty” w nakładce wideo jest ukryty - Baner „Zobacz produkty” w nakładce wideo jest widoczny - Wyniki wyszukiwania stron internetowych - Wyniki wyszukiwania stron są ukryte - Wyniki wyszukiwania stron są widoczne - - - Promocje YouTube Premium - Promocje YouTube Premium w odtwarzaczu filmów są ukryte - Promocje YouTube Premium w odtwarzaczu filmów są widoczne - - - Reklamy filmu - Reklamy filmu są ukryte - Reklamy filmu są widoczne - - - Adres URL skopiowany do schowka - URL ze znacznikiem czasu skopiowany - Przycisk od kopiowania URL filmu - Przycisk Kopiuj adres URL filmu jest widoczny. Dotknij, aby skopiować adres URL filmu. Dotknij i przytrzymaj, aby skopiować z sygnaturą czasową - Przycisk Kopiuj adres URL filmu nie jest widoczny - Przycisk od kopiowania URL filmu z czasem - Przycisk Kopiuj adres URL z sygnaturą czasową jest widoczny. Dotknij, aby skopiować adres URL filmu z sygnaturą czasową. Dotknij i przytrzymaj, aby skopiować bez sygnatury czasowej - Przycisk Kopiuj adres URL z sygnaturą czasową nie jest widoczny - - - Okno dialogowe treści ograniczonej do oglądania - Okno dialogowe zostanie usunięte - Okno dialogowe zostanie wyświetlone - To nie pomija ograniczeń wiekowych i akceptuje je automatycznie. - - - Wyłącz wyskakujące okienko „Zaloguj się do telewizora” - Wyskakujące okienko Zaloguj się do telewizora jest wyłączone - Wyskakujące okienko Zaloguj się do telewizora jest włączone - - - Wyłącz pomijanie rozdziałów dwukrotnym stuknięciem - Dwukrotne stuknięcie nigdy nie spowoduje przejścia do następnego/poprzedniego rozdziału - Dwukrotne stuknięcie może sporadycznie spowodować przejście do następnego/poprzedniego rozdziału - - - Zewnętrzna aplikacja od pobierania - Ustawienia dla zewnętrznej aplikacji - Przycisk zewnętrznego pobierania - Przycisk pobierania w odtwarzaczu jest widoczny - Przycisk pobierania w odtwarzaczu nie jest widoczny - - Zamień przycisk akcji pobierania - Przycisk pobierania otwiera zewnętrzną aplikację - Przycisk pobierania otwiera natywne pobieranie w aplikacji - Nazwa pakietu aplikacji od pobierania - Nazwa pakietu zainstalowanej zewnętrznej aplikacji do pobierania - Wprowadź nazwę pakietu - Inne - Aplikacja nie jest zainstalowana - %s nie jest zainstalowany, zainstaluj. - "Nie znaleziono zainstalowanej aplikacji o nazwie pakietu: %s + Uwzględnij całe wyrazy + + Otoczenie słowa/frazy podwójnym cudzysłowem może zapobiec częściowemu dopasowywaniu tytułów filmów i nazw kanałów<br><br>Dla przykładu,<br><b>\"ai\"</b> ukryje film: <b>Jak działa AI?</b><br>lecz nie ukryje: <b>Co oznacza aikido?</b> + + Nie można użyć słowa: %s + Dodaj cudzysłowy, aby użyć słowa: %s + Słowo zawiera sprzeczne deklaracje: %s + Słowo jest za krótkie i wymaga cudzysłowu: %s + Słowo ukryje wszystkie filmy: %s + + + Ukryj baner sklepu na ekranie końcowym + Baner sklepu na ekranie końcowym jest ukryty + Baner sklepu na ekranie końcowym jest widoczny + Reklamy pełnoekranowe + Reklamy pełnoekranowe są ukryte + Reklamy pełnoekranowe są widoczne + Reklamy ogólne + Ogólne reklamy są ukryte + Ogólne reklamy są widoczne + Banery towarowe + Banery z towarami są ukryte + Banery z towarami są widoczne + Etykiety płatnej promocji + Etykiety płatnej promocji są ukryte + Etykiety płatnej promocji są widoczne + Ukryj wyskakujące reklamy odtwarzacza + Wyskakujące reklamy odtwarzacza są ukryte + Wyskakujące reklamy odtwarzacza są widoczne + Karty z autopromocją + Karty z autopromocją są ukryte + Karty z autopromocją są widoczne + Ukryj linki do zakupów + Linki do zakupów w opisie wideo są ukryte + Linki zakupowe w opisie filmu są widoczne + Ukryj baner \'Zobacz produkty\' + Baner „Zobacz produkty” w nakładce odtwarzacza jest ukryty + Baner „Zobacz produkty” w nakładce odtwarzacza jest widoczny + Ukryj promocje YouTube Premium + Promocje YouTube Premium są ukryte + Promocje YouTube Premium są widoczne + + + Reklamy filmu + Reklamy filmu są ukryte + Reklamy filmu są widoczne + + + Adres URL skopiowany do schowka + URL ze znacznikiem czasu skopiowany + Pokaż przycisk kopiowania URL filmu + Przycisk Kopiuj adres URL filmu jest widoczny. Dotknij, aby skopiować adres URL filmu. Dotknij i przytrzymaj, aby skopiować z sygnaturą czasową + Przycisk Kopiuj adres URL filmu nie jest widoczny + Pokaż przycisk kopiowania URL ze znacznikiem czasu + Przycisk Kopiuj adres URL z sygnaturą czasową jest widoczny. Dotknij, aby skopiować adres URL filmu z sygnaturą czasową. Dotknij i przytrzymaj, aby skopiować bez sygnatury czasowej + Przycisk Kopiuj adres URL z sygnaturą czasową nie jest widoczny + + + Okno dialogowe treści ograniczonej do oglądania + Okno dialogowe zostanie usunięte + Okno dialogowe zostanie wyświetlone + To nie pomija ograniczeń wiekowych i akceptuje je automatycznie. + + + Wyłącz wyskakujące okienko „Zaloguj się do telewizora” + Wyskakujące okienko Zaloguj się do telewizora jest wyłączone + Wyskakujące okienko Zaloguj się do telewizora jest włączone + + + Wyłącz pomijanie rozdziałów dwukrotnym stuknięciem + Dwukrotne stuknięcie nigdy nie spowoduje przejścia do następnego/poprzedniego rozdziału + Dwukrotne stuknięcie może sporadycznie spowodować przejście do następnego/poprzedniego rozdziału + + + Zewnętrzna aplikacja od pobierania + Ustawienia dla zewnętrznej aplikacji + Przycisk zewnętrznego pobierania + Przycisk pobierania w odtwarzaczu jest widoczny + Przycisk pobierania w odtwarzaczu nie jest widoczny + + Zamień przycisk akcji pobierania + Przycisk pobierania otwiera zewnętrzną aplikację + Przycisk pobierania otwiera natywne pobieranie w aplikacji + Nazwa pakietu aplikacji od pobierania + Nazwa pakietu zainstalowanej zewnętrznej aplikacji do pobierania + Wprowadź nazwę pakietu + Inne + Aplikacja nie jest zainstalowana + %s nie jest zainstalowany, zainstaluj. + "Nie znaleziono zainstalowanej aplikacji o nazwie pakietu: %s Sprawdź, czy nazwa pakietu jest prawidłowa i czy aplikacja jest zainstalowana" - Nazwa pakietu nie może być pusta - - - Gest precyzyjnego przewijania - Gest jest wyłączony - Gest jest włączony - - - Włącz dotknięcie, aby przewinąć - Dotknij, aby włączyć przewijanie - Dotknięcie, aby przewinąć, jest wyłączone - - - Gest jasności - "Przesuwanie jasności na pełnym ekranie jest włączone + Nazwa pakietu nie może być pusta + + + Gest precyzyjnego przewijania + Gest jest wyłączony + Gest jest włączony + + + Włącz dotknięcie, aby przewinąć + Dotknij, aby włączyć przewijanie + Dotknięcie, aby przewinąć, jest wyłączone + + + Gest jasności + "Przesuwanie jasności na pełnym ekranie jest włączone Dostosuj jasność, przesuwając pionowo po lewej stronie ekranu" - Przesuwanie jasności na pełnym ekranie jest wyłączone - Gest głośności - "Przesuwanie głośności na pełnym ekranie jest włączone + Przesuwanie jasności na pełnym ekranie jest wyłączone + Gest głośności + "Przesuwanie głośności na pełnym ekranie jest włączone Dostosuj głośność, przesuwając pionowo po prawej stronie ekranu" - Przesuwanie głośności na pełnym ekranie jest wyłączone - Włącz gest przesuwania przez naciśnięcie - Przesuwanie przez naciśnięcie jest włączone - Przesuwanie przez naciśnięcie jest wyłączone - Wibracje - Wibracje są włączone - Wibracje są wyłączone - Zapisywanie i przywracanie jasności - Zapisuj i przywracaj jasność podczas zamykania lub wchodzenia w tryb pełnoekranowy - Nie zapisuj i nie przywracaj jasności podczas zamykania lub wchodzenia w tryb pełnoekranowy - Gest automatycznej jasności - Przesunięcie w dół do najniższej wartości gestu jasności włącza automatyczną jasność - Przesunięcie w dół do najniższej wartości nie włącza automatycznej jasności - Automatycznie - Limit czasu widoczności nakładki - Liczba milisekund, przez które nakładka jest widoczna - Przejrzystość tła nakładki przesuwania - Wartość przezroczystości od 0 do 100 - Przezroczystość przesuwania musi być między 0 a 100 - Kolor nakładki przesunięcia dla jasności - Kolor paska postępu dla elementów sterujących jasnością - Kolor nakładki przesunięcia dla głośności - Kolor paska postępu dla elementów sterujących głośnością - Rozmiar tekstu nakładki przesuwania - Rozmiar tekstu dla nakładki przesunięcia między 1-30 - Rozmiar tekstu musi mieścić się w przedziale 1-30 - Minimalna długość przesunięcia - Wartość wymagana do wykonania gestu przesunięcia - Czułość przesunięcia głośności - O ile zmienia się głośność na przesunięcie - Styl nakładki przesuwania - Nakładka pozioma - Nakładka pozioma (minimalna - góra) - Nakładka pozioma (minimalna - środek) - Nakładka okrągła - Nakładka okrągła (minimalna) - Nakładka pionowa - Nakładka pionowa (minimalna) - Włącz przesuwanie palcem, aby zmienić filmy - Przesunięcie palcem w trybie pełnoekranowym spowoduje przejście do następnego lub poprzedniego filmu - Przesunięcie palcem w trybie pełnoekranowym nie spowoduje przejścia do następnego lub poprzedniego filmu - - - Automatyczne napisy - Automatyczne podpisy są wyłączone - Automatyczne podpisy są włączone - - - Przyciski akcji - Ukryj lub pokaż przyciski pod filmami - Wyłącz poświatę przycisków polubienia i subskrypcji - Przyciski polubienia i subskrypcji nie będą świecić po ich wzmiankowaniu - Przyciski polubienia i subskrypcji będą świecić po ich wzmiankowaniu - Przycisk od łapek w górę i w dół - Przyciski łapki w górę i w dół są ukryte - Przyciski łapki w górę i w dół są widoczne - - Przycisk od udostępniania - Przycisk udostępniania jest ukryty - Przycisk udostępniania jest widoczny - - Ukryj \"Zatrzymaj reklamy\" - Przycisk zatrzymania reklam jest ukryty - Przycisk zatrzymania reklam jest widoczny - - Ukryj komentarze - Przycisk komentarzy jest ukryty - Przycisk komentarzy jest widoczny - - Przycisk od zgłaszania - Przycisk zgłaszania jest ukryty - Przycisk zgłaszania jest widoczny - - Przycisk od remiksu - Przycisk remiksu jest ukryty - Przycisk remiksu jest widoczny - - Przycisk od pobierania - Przycisk pobierania jest ukryty - Przycisk pobierania jest widoczny - - Ukryj Hype - Przycisk Hype jest ukryty - Przycisk Hype jest wyświetlony - - Ukryj Promuj - Przycisk promocji jest ukryty - Przycisk promocji jest widoczny - - Przycisk od dziękowania - Przycisk od dziękowania jest ukryty - Przycisk od dziękowania jest widoczny - - Ukryj Zapytaj - Przycisk Zapytaj jest ukryty - Przycisk Zapytaj jest widoczny - - Przycisk od klipów - Przycisk tworzenia klipów jest ukryty - Przycisk tworzenia klipów jest widoczny - - Ukryj Sklep - Przycisk Sklep jest ukryty - Przycisk Sklep jest widoczny - - Ukryj Zapisz - Przycisk Zapisz jest ukryty - Przycisk Zapisz jest widoczny - - - Przyciski nawigacyjne - Ukryj lub zmień przyciski na pasku nawigacji - - Przycisk od głównej - Przycisk strony głównej jest ukryty - Przycisk strony głównej jest widoczny - - Przycisk od Shortsów - Przycisk Shortsów jest ukryty - Przycisk Shortsów jest widoczny - - Przycisk od przesyłania - Przycisk przesyłania jest ukryty - Przycisk przesyłania jest widoczny - - Przycisk od strony subskrypcji - Przycisk subskrypcji jest ukryty - Przycisk subskrypcji jest widoczny - Ukryj powiadomienia - Przycisk powiadomień jest ukryty - Przycisk powiadomień jest widoczny - - Przełącz przyciski Przesyłania z Powiadomieniami - "Przycisk Utwórz jest zamieniony z przyciskiem Powiadomienia - -Uwaga: Włączenie tej opcji również ukrywa reklamy wideo" - Przycisk Przesyłania nie jest przełączony z przyciskiem Powiadomienia - "Wyłączenie tego ustawienia spowoduje również wyłączenie blokowania reklam w usłudze Shorts. - -Jeśli zmiana tego ustawienia nie przyniesie efektu, spróbuj przełączyć się w tryb incognito." - Etykiety przycisków nawigacji - Etykiety są ukryte - Etykiety są widoczne - Wyłącz przezroczysty pasek statusu - Pasek statusu jest nieprzezroczysty - Pasek statusu jest nieprzezroczysty lub półprzezroczysty - Na niektórych urządzeniach włączenie tej funkcji może zmienić przezroczystość systemowego paska nawigacyjnego. - Wyłącz świetny, przezroczysty pasek - Pasek nawigacyjny w trybie świetnym jest nieprzezroczysty - Pasek nawigacji w trybie jasnym jest nieprzezroczysty lub półprzezroczysty - Wyłącz ciemny półprzezroczysty pasek - Pasek nawigacyjny w trybie ciemnym jest nieprzezroczysty - Pasek nawigacji w trybie ciemnym jest nieprzezroczysty lub półprzezroczysty - - - Menu ustawień - Ukryj lub pokaż elementy menu ustawień - - Menu napisów - Menu napisów jest ukryte - Menu napisów jest widoczne - - Menu dodatkowych ustawień - Menu dodatkowych ustawień jest ukryte - Menu dodatkowych ustawień jest widoczne - - Menu wyłącznika czasowego - Menu wyłącznika czasowego jest ukryte - Menu wyłącznika czasowego jest widoczne - - Menu pętli filmu - Menu pętli filmu jest ukryte - Menu pętli filmu jest widoczne - - Menu oświetlenia kinowego - Menu oświetlenia kinowego jest ukryte - Menu oświetlenia kinowego jest widoczne - Menu stabilnej głośności - Menu stabilnej głośności jest widoczne - Menu stabilnej głośności jest ukryte - - Menu pomocy i opinii - Menu pomocy i opinii jest ukryte - Menu pomocy i opinii jest widoczne - - Menu prędkości odtwarzania - Menu prędkości odtwarzania jest ukryte - Menu prędkości odtwarzania jest widoczne - - Menu blokady ekranu - Menu blokady ekranu jest ukryte - Menu blokady ekranu jest widoczne - - Ukryj Słuchaj w YouTube Music - Menu Słuchaj w YouTube Music jest ukryte - Menu Słuchaj w YouTube Music jest widoczne - - Menu ścieżki dźwiękowej - Menu ścieżki dźwiękowej jest ukryte - Menu ścieżki dźwiękowej jest widoczne - + Przycisk od udostępniania + Przycisk udostępniania jest ukryty + Przycisk udostępniania jest widoczny + + Ukryj \"Zatrzymaj reklamy\" + Przycisk zatrzymania reklam jest ukryty + Przycisk zatrzymania reklam jest widoczny + + Ukryj komentarze + Przycisk komentarzy jest ukryty + Przycisk komentarzy jest widoczny + + Przycisk od zgłaszania + Przycisk zgłaszania jest ukryty + Przycisk zgłaszania jest widoczny + + Przycisk od remiksu + Przycisk remiksu jest ukryty + Przycisk remiksu jest widoczny + + Przycisk od pobierania + Przycisk pobierania jest ukryty + Przycisk pobierania jest widoczny + + Ukryj Hype + Przycisk Hype jest ukryty + Przycisk Hype jest wyświetlony + + Ukryj Promuj + Przycisk promocji jest ukryty + Przycisk promocji jest widoczny + + Przycisk od dziękowania + Przycisk od dziękowania jest ukryty + Przycisk od dziękowania jest widoczny + + Ukryj Zapytaj + Przycisk Zapytaj jest ukryty + Przycisk Zapytaj jest widoczny + + Przycisk od klipów + Przycisk tworzenia klipów jest ukryty + Przycisk tworzenia klipów jest widoczny + Ukrywanie może nie działać w przypadku niektórych kont użytkowników. + + Ukryj Sklep + Przycisk Sklep jest ukryty + Przycisk Sklep jest widoczny + + Ukryj Zapisz + Przycisk Zapisz jest ukryty + Przycisk Zapisz jest widoczny + + + Przyciski nawigacyjne + Ukryj lub zmień przyciski paska nawigacji + + Ukryj Główną + Przycisk Główna jest ukryty + Przycisk Główna jest pokazany + + Ukryj Shorts + Przycisk Shorts jest ukryty + Przycisk Shorts jest widoczny + + Ukryj Utwórz + Przycisk Utwórz jest ukryty + Przycisk Utwórz jest widoczny + + Ukryj Subskrypcje + Przycisk Subskrypcje jest ukryty + Przycisk Subskrypcje jest widoczny + Ukryj Powiadomienia + Przycisk Powiadomienia jest ukryty + Przycisk Powiadomienia jest widoczny + + Przełącz Utwórz z Powiadomieniami + Przycisk Utwórz jest przełączony z przyciskiem Powiadomienia + Przycisk Utwórz nie jest przełączony z przyciskiem Powiadomienia + Jeśli zmiana tego ustawienia nie zadziała, spróbuj przełączyć się na tryb incognito. + Ukryj etykiety przycisków nawigacji + Etykiety są ukryte + Etykiety są widoczne + Włącz wąskie przyciski nawigacyjne + Odstępy między przyciskami nawigacyjnymi są wąskie + Odstępy między przyciskami nawigacyjnymi są normalne + Włącz animacje paska nawigacji + Przejścia nawigacji są animowane + Przejścia nawigacji nie są animowane + Wyłącz przezroczysty pasek statusu + Pasek statusu jest nieprzezroczysty + Pasek statusu jest nieprzezroczysty lub półprzezroczysty + "Ograniczenia: +• U góry odtwarzacza wideo może pojawić się czarny pasek. +• Na niektórych urządzeniach włączenie tej funkcji może zmienić systemowy pasek nawigacji na przezroczysty." + Wyłącz jasny półprzezroczysty pasek + Pasek nawigacji w trybie jasnym jest nieprzezroczysty + Pasek nawigacji w trybie jasnym jest nieprzezroczysty lub półprzezroczysty + Wyłącz ciemny półprzezroczysty pasek + Pasek nawigacji w trybie ciemnym jest nieprzezroczysty + Pasek nawigacji w trybie ciemnym jest nieprzezroczysty lub półprzezroczysty + Pasek narzędzi + Ukryj lub zmień elementy paska narzędzi + Ukryj przycisk Utwórz + Przycisk Utwórz jest ukryty + Przycisk Utwórz jest widoczny + Ukryj przycisk Powiadomienia + Przycisk Powiadomienia jest ukryty + Przycisk Powiadomienia jest widoczny + Ukryj przycisk Wyszukiwania + Przycisk wyszukiwania jest ukryty + Przycisk wyszukiwania jest widoczny. + Szeroki pasek wyszukiwania + Szeroki pasek wyszukiwania jest włączony + Szeroki pasek wyszukiwania jest wyłączony + + + Menu ustawień + Ukryj lub pokaż elementy menu ustawień + + Menu napisów + Menu napisów jest ukryte + Menu napisów jest widoczne + + Menu dodatkowych ustawień + Menu dodatkowych ustawień jest ukryte + Menu dodatkowych ustawień jest widoczne + + Menu wyłącznika czasowego + Menu wyłącznika czasowego jest ukryte + Menu wyłącznika czasowego jest widoczne + + Menu pętli filmu + Menu pętli filmu jest ukryte + Menu pętli filmu jest widoczne + + Menu oświetlenia kinowego + Menu oświetlenia kinowego jest ukryte + Menu oświetlenia kinowego jest widoczne + Menu stabilnej głośności + Menu stabilnej głośności jest widoczne + Menu stabilnej głośności jest ukryte + + Menu pomocy i opinii + Menu pomocy i opinii jest ukryte + Menu pomocy i opinii jest widoczne + + Menu prędkości odtwarzania + Menu prędkości odtwarzania jest ukryte + Menu prędkości odtwarzania jest widoczne + + Menu blokady ekranu + Menu blokady ekranu jest ukryte + Menu blokady ekranu jest widoczne + + Ukryj Słuchaj w YouTube Music + Menu Słuchaj w YouTube Music jest ukryte + Menu Słuchaj w YouTube Music jest widoczne + + Menu ścieżki dźwiękowej + Menu ścieżki dźwiękowej jest ukryte + Menu ścieżki dźwiękowej jest widoczne + - "Menu ścieżek audio jest ukryte + "Menu ścieżek audio jest ukryte Aby wyświetlić menu ścieżek audio, zmień „Fałszowanie strumieni wideo” na 'Android No SDK'" - - Menu oglądania w VR - Menu oglądania w VR jest ukryte - Menu oglądania w VR jest widoczne - Ukryj menu jakości wideo - Menu jakości wideo jest ukryte - Menu jakości wideo jest wyświetlane - Opis menu jakości filmu - Opis menu jakości filmu jest ukryty - Opis menu jakości filmu jest widoczny - - - Ukryj przycisk automatycznego odtwarzania - Przycisk automatycznego odtwarzania jest ukryty - Przycisk automatycznego odtwarzania jest widoczny - - Ukryj przycisk napisów - Przycisk napisów jest ukryty - Przycisk napisów jest widoczny - Ukryj przycisk transmisji - Przycisk powielania jest ukryty - Przycisk powielania jest widoczny - Ukryj tło sterowania odtwarzacza - Tło elementów sterujących odtwarzacza jest ukryte - Tło sterowania odtwarzacza jest widoczne - Ukryj przyciski Poprzedni i Następny - Przyciski są ukryte - Przyciski są widoczne - - - Karty ekranu końcowego - Karty ekranu końcowego są ukryte - Karty ekranu końcowego są widoczne - - - Wyłącz tryb Ambient na pełnym ekranie - Oświetlenie kinowe wyłączone - Oświetlenie kinowe włączone - - - Karty informacyjne - Karty informacyjne są ukryte - Karty informacyjne są widoczne - - - Animacje liczb - Liczby nie są animowane - Liczby są animowane - - - Ukryj pasek przewijania odtwarzacza wideo - Pasek postępu w odtwarzaczu jest ukryty - Pasek postępu w odtwarzaczu jest widoczny - - Ukryj pasek przewijania miniatur wideo - Pasek przewijania miniatur wideo jest ukryty - Pasek przewijania miniatur wideo jest pokazany - - - Odtwarzacz Shortsów - Ukryj lub pokaż komponenty odtwarzacza Shorts - - Ukryj Shorts na stronie głównej - Ukryte na stronie głównej i w powiązanych filmach - Widoczne na stronie głównej i w powiązanych filmach - Shortsy w wynikach wyszukiwania - Ukryte w wynikach wyszukiwania - Wyświetlane w wynikach wyszukiwania - - Ukryj Shorts w subskrypcjach - Ukryte w subskrypcjach - Widoczne w subskrypcjach - Ukryj Shortsy w historii oglądania - Ukryte w historii oglądania - Wyświetlone w historii oglądania - Ukryj etykietę „Zautomatyzowane dubbingowanie” - Etykieta z automatycznym dubbingiem jest ukryta - Etykieta z automatycznym dubbingiem jest widoczna - Ukryj przycisk „Kup Superpodziękowania” - Przycisk „Kup Super podziękowania” jest ukryty - Przycisk „Kup Super podziękowania” jest widoczny - Ukryj przycisk efektu - Przycisk efektu jest ukryty - Przycisk efektu jest widoczny - Ukryj przycisk „Zielony ekran” - Przycisk od greenscreena jest ukryty - Przycisk od greenscreena jest widoczny - Przycisk hashtagu - Przycisk hashtagu jest ukryty - Przycisk hashtagu jest widoczny - - Ukryj przycisk \"Dołącz\" - Przycisk od sponsorowania jest ukryty - Przycisk od sponsorowania jest widoczny - Ukryj podgląd na żywo - Podgląd na żywo jest ukryty - Podgląd na żywo jest widoczny - Etykieta lokalizacji - Etykieta lokalizacji jest ukryta - Etykieta lokalizacji jest widoczna - Ukryj przycisk „Nowe posty” - Przycisk Nowe posty jest ukryty - Przycisk Nowe posty jest widoczny - Wstrzymane przyciski nakładki - Zatrzymane przyciski nakładki są ukryte - Wyświetlane są wstrzymane przyciski nakładki - Ukryj komentarz podglądu - Komentarz podglądu jest ukryty - Podgląd komentarza jest wyświetlany - Ukryj przycisk „Zapisz dźwięk” - Przycisk od zapisywania muzyki jest ukryty - Przycisk od zapisywania muzyki jest widoczny - Sugestie wyszukiwania - Sugestie wyszukiwania są ukryte - Sugestie wyszukiwania są widoczne - Ukryj przycisk \"Sklep\" - Przycisk sklepu jest ukryty - Przycisk sklepu jest widoczny - Naklejki - Naklejki są ukryte - Naklejki są widoczne - Ukryj przycisk \"Subskrybuj\" - Przycisk od subskrybowania jest ukryty - Przycisk od subskrybowania jest widoczny - Oznaczone produkty - Oznaczone produkty są ukryte - Oznaczone produkty są widoczne - Ukryj przycisk \"Nadchodzące\" - Przycisk nadchodzących jest ukryty - Przycisk nadchodzących jest widoczny - Ukryj przycisk „Użyj tego dźwięku” - Przycisk Użyj tego dźwięku jest ukryty - Przycisk Użyj tego dźwięku jest widoczny - Ukryj przycisk „Użyj tego szablonu” - Przycisk Użyj tego szablonu jest ukryty - Przycisk \"Użyj tego szablonu\" jest widoczny - Ukryj animację fontanny przycisku \"Lubię to\" - Animacja przycisku polubienia jest ukryta - Animacja przycisku polubienia jest widoczna - Ukryj przycisk \"Lubię to\" - Przycisk łapki w górę jest ukryty - Przycisk łapki w górę jest widoczny - Ukryj przycisk \"Nie lubię\" - Przycisk łapki w dół jest ukryty - Przycisk łapki w dół jest widoczny - Ukryj przycisk \"Komentarze\" - Przycisk komentarzy jest ukryty - Przycisk komentarzy jest widoczny - - Ukryj przycisk \"Udostępnij\" - Przycisk udostępniania jest ukryty - Przycisk udostępniania jest widoczny - - Ukryj przycisk \"Remiksuj\" - Przycisk remiksu jest ukryty - Przycisk remiksu jest widoczny - Przycisk dźwięku - Przycisk dźwięku jest ukryty - Przycisk dźwięku jest widoczny - Panel z informacjami - Panel informacji jest ukryty - Panel informacji jest widoczny - Pasek kanału - Pasek kanału jest ukryty - Pasek kanału jest widoczny - Tytuł filmu - Tytuł filmu jest ukryty - Tytuł filmu jest widoczny - Etykieta z metadanymi dźwięku - Etykieta metadanych dźwięku jest ukryta - Etykieta metadanych dźwięku jest widoczna - Ukryj etykietę linku do filmu - Etykieta linku do filmu jest ukryta - Etykieta linku do filmu jest widoczna - Pasek nawigacji - Pasek nawigacji jest ukryty - Pasek nawigacji jest widoczny - - - Ukryj sugerowane wideo na ekranie końcowym - "Sugerowane wideo na ekranie końcowym jest ukryte, gdy automatyczne odtwarzanie jest wyłączone + + Menu oglądania w VR + Menu oglądania w VR jest ukryte + Menu oglądania w VR jest widoczne + Ukryj menu jakości wideo + Menu jakości wideo jest ukryte + Menu jakości wideo jest wyświetlane + Opis menu jakości filmu + Opis menu jakości filmu jest ukryty + Opis menu jakości filmu jest widoczny + + + Ukryj przycisk automatycznego odtwarzania + Przycisk automatycznego odtwarzania jest ukryty + Przycisk automatycznego odtwarzania jest widoczny + + Ukryj przycisk napisów + Przycisk napisów jest ukryty + Przycisk napisów jest widoczny + Ukryj przycisk transmisji + Przycisk powielania jest ukryty + Przycisk powielania jest widoczny + Ukryj przycisk zwijania + Przycisk zwijania jest ukryty + Przycisk zwijania jest widoczny + Ukryj przycisk pełnego ekranu + Przycisk pełnego ekranu jest ukryty + Przycisk pełnego ekranu jest widoczny + Ukryj tło sterowania odtwarzacza + Tło elementów sterujących odtwarzacza jest ukryte + Tło sterowania odtwarzacza jest widoczne + Ukryj przyciski Poprzedni i Następny + Przyciski są ukryte + Przyciski są widoczne + + + Ukryj karty ekranu końcowego + Karty ekranu końcowego są ukryte + Karty ekranu końcowego są widoczne + + + Wyłącz tryb Ambient na pełnym ekranie + Oświetlenie kinowe wyłączone + Oświetlenie kinowe włączone + + + Karty informacyjne + Karty informacyjne są ukryte + Karty informacyjne są widoczne + + + Animacje liczb + Liczby nie są animowane + Liczby są animowane + + + Ukryj pasek przewijania odtwarzacza wideo + Pasek postępu w odtwarzaczu jest ukryty + Pasek postępu w odtwarzaczu jest widoczny + + Ukryj pasek przewijania miniatur wideo + Pasek przewijania miniatur wideo jest ukryty + Pasek przewijania miniatur wideo jest pokazany + Włącz duży pasek przewijania na pełnym ekranie + Pasek przewijania na pełnym ekranie jest duży + Pasek przewijania na pełnym ekranie ma normalny rozmiar + + + Odtwarzacz Shortsów + Ukryj lub pokaż komponenty odtwarzacza Shorts + Ukryj Shorts na stronie kanału + Ukryte na stronie kanału + Widoczne na stronie kanału + + Ukryj Shorts na stronie głównej + Ukryte na stronie głównej i w powiązanych filmach + Widoczne na stronie głównej i w powiązanych filmach + Shortsy w wynikach wyszukiwania + Ukryte w wynikach wyszukiwania + Wyświetlane w wynikach wyszukiwania + + Ukryj Shorts w subskrypcjach + Ukryte w subskrypcjach + Widoczne w subskrypcjach + Ukryj Shorts w opisie filmu + Ukryte w opisie filmu + Widoczne w opisie filmu + Ukryj Shortsy w historii oglądania + Ukryte w historii oglądania + Wyświetlone w historii oglądania + Ukryj przycisk AI + Przycisk AI jest ukryty + Przycisk AI jest widoczny + Ukryj etykietę „Zautomatyzowane dubbingowanie” + Etykieta z automatycznym dubbingiem jest ukryta + Etykieta z automatycznym dubbingiem jest widoczna + Ukryj etykietę „Zautomatyzowane dubbingowanie” + Etykieta z automatycznym dubbingiem jest ukryta + Etykieta z automatycznym dubbingiem jest widoczna + Ukryj przycisk „Kup Superpodziękowania” + Przycisk „Kup Super podziękowania” jest ukryty + Przycisk „Kup Super podziękowania” jest widoczny + Ukryj przycisk efektu + Przycisk efektu jest ukryty + Przycisk efektu jest widoczny + Ukryj przycisk „Zielony ekran” + Przycisk od greenscreena jest ukryty + Przycisk od greenscreena jest widoczny + Przycisk hashtagu + Przycisk hashtagu jest ukryty + Przycisk hashtagu jest widoczny + + Ukryj przycisk \"Dołącz\" + Przycisk od sponsorowania jest ukryty + Przycisk od sponsorowania jest widoczny + Ukryj podgląd na żywo + Podgląd na żywo jest ukryty + Podgląd na żywo jest widoczny + Etykieta lokalizacji + Etykieta lokalizacji jest ukryta + Etykieta lokalizacji jest widoczna + Ukryj przycisk „Nowe posty” + Przycisk Nowe posty jest ukryty + Przycisk Nowe posty jest widoczny + Wstrzymane przyciski nakładki + Zatrzymane przyciski nakładki są ukryte + Wyświetlane są wstrzymane przyciski nakładki + Ukryj komentarz podglądu + Komentarz podglądu jest ukryty + Podgląd komentarza jest wyświetlany + Ukryj przycisk „Zapisz dźwięk” + Przycisk od zapisywania muzyki jest ukryty + Przycisk od zapisywania muzyki jest widoczny + Sugestie wyszukiwania + Sugestie wyszukiwania są ukryte + Sugestie wyszukiwania są widoczne + Ukryj przycisk \"Sklep\" + Przycisk sklepu jest ukryty + Przycisk sklepu jest widoczny + Naklejki + Naklejki są ukryte + Naklejki są widoczne + Ukryj przycisk \"Subskrybuj\" + Przycisk od subskrybowania jest ukryty + Przycisk od subskrybowania jest widoczny + Oznaczone produkty + Oznaczone produkty są ukryte + Oznaczone produkty są widoczne + Ukryj przycisk \"Nadchodzące\" + Przycisk nadchodzących jest ukryty + Przycisk nadchodzących jest widoczny + Ukryj przycisk „Użyj tego dźwięku” + Przycisk Użyj tego dźwięku jest ukryty + Przycisk Użyj tego dźwięku jest widoczny + Ukryj przycisk „Użyj tego szablonu” + Przycisk Użyj tego szablonu jest ukryty + Przycisk \"Użyj tego szablonu\" jest widoczny + + Ukryj animację fontanny przycisku \"Lubię to\" + Animacja przycisku polubienia jest ukryta + Animacja przycisku polubienia jest widoczna + Ukryj przycisk \"Lubię to\" + Przycisk łapki w górę jest ukryty + Przycisk łapki w górę jest widoczny + Ukryj przycisk \"Nie lubię\" + Przycisk łapki w dół jest ukryty + Przycisk łapki w dół jest widoczny + Ukryj przycisk \"Komentarze\" + Przycisk komentarzy jest ukryty + Przycisk komentarzy jest widoczny + + Ukryj przycisk \"Udostępnij\" + Przycisk udostępniania jest ukryty + Przycisk udostępniania jest widoczny + + Ukryj przycisk \"Remiksuj\" + Przycisk remiksu jest ukryty + Przycisk remiksu jest widoczny + Przycisk dźwięku + Przycisk dźwięku jest ukryty + Przycisk dźwięku jest widoczny + Panel z informacjami + Panel informacji jest ukryty + Panel informacji jest widoczny + Pasek kanału + Pasek kanału jest ukryty + Pasek kanału jest widoczny + Tytuł filmu + Tytuł filmu jest ukryty + Tytuł filmu jest widoczny + Etykieta z metadanymi dźwięku + Etykieta metadanych dźwięku jest ukryta + Etykieta metadanych dźwięku jest widoczna + Ukryj etykietę linku do filmu + Etykieta linku do filmu jest ukryta + Etykieta linku do filmu jest widoczna + Pasek nawigacji + Pasek nawigacji jest ukryty + Pasek nawigacji jest widoczny + + + Ukryj podgląd autoodtwarzania + Podgląd autoodtwarzania jest ukryty + Podgląd autoodtwarzania jest widoczny + + + Ukryj sugerowane wideo na ekranie końcowym + "Sugerowane wideo na ekranie końcowym jest ukryte, gdy automatyczne odtwarzanie jest wyłączone Automatyczne odtwarzanie można zmienić w ustawieniach YouTube: Ustawienia → Odtwarzanie → Autoodtwarzanie następnego filmu" - Sugerowane wideo na ekranie końcowym jest wyświetlane - - - Ukryj nakładkę powiązanych filmów - Nakładka powiązanych filmów na pełnym ekranie jest ukryta - Nakładka powiązanych filmów na pełnym ekranie jest widoczna - - - Znacznik czasu filmu - Znacznik czasu jest ukryty - Znacznik czasu jest widoczny - - - Wyskakujące panele - Wyskakujące panele odtwarzacza są ukryte - Wyskakujące panele odtwarzacza są widoczne - - - Wyjdź z trybu pełnoekranowego pod koniec filmu - Wyłączone - Portret - Pejzaż - Portret i pejzaż - - - Filmy w trybie pełnoekranowym - Filmy otwierają się w trybie pełnoekranowym - Filmy nie otwierają się w trybie pełnoekranowym - - - Przezroczystość nakładki odtwarzacza - Wartość przezroczystości między 0-100, gdzie 0 jest przezroczysty - Przezroczystość nakładki odtwarzacza musi być pomiędzy 0-100 - - - - Łapki w dół są tymczasowo niedostępne (API nie reaguje) - Łapki w dół niedostępne (status %d) - Oceny negatywne są niedostępne (limit API klienta) - Łapki w dół niedostępne (%s) - - Odśwież film, aby zagłosować za pomocą Return YouTube Dislike - - Ukryte przez właściciela - Przywróć YouTube Dislike - Łapki w dół są widoczne - Łapki w dół są ukryte - Łapki w dół na Shortsach - "Oceny negatywne na Shorts są widoczne + Sugerowane wideo na ekranie końcowym jest wyświetlane + + + Ukryj nakładkę powiązanych filmów + Nakładka powiązanych filmów na pełnym ekranie jest ukryta + Nakładka powiązanych filmów na pełnym ekranie jest widoczna + + + Znacznik czasu filmu + Znacznik czasu jest ukryty + Znacznik czasu jest widoczny + + + Ukryj wyskakujące panele odtwarzacza + Wyskakujące panele odtwarzacza są ukryte + Wyskakujące panele odtwarzacza są widoczne + + + Wyjdź z trybu pełnoekranowego pod koniec filmu + Wyłączone + Portret + Pejzaż + Portret i pejzaż + + + Filmy w trybie pełnoekranowym + Filmy otwierają się w trybie pełnoekranowym + Filmy nie otwierają się w trybie pełnoekranowym + + + Przezroczystość nakładki odtwarzacza + Wartość przezroczystości między 0-100, gdzie 0 jest przezroczysty + Przezroczystość nakładki odtwarzacza musi być pomiędzy 0-100 + + + + Łapki w dół są tymczasowo niedostępne (API nie reaguje) + Łapki w dół niedostępne (status %d) + Oceny negatywne są niedostępne (limit API klienta) + Łapki w dół niedostępne (%s) + + Odśwież film, aby zagłosować za pomocą Return YouTube Dislike + + Ukryte przez właściciela + Przywróć YouTube Dislike + Łapki w dół są widoczne + Łapki w dół są ukryte + Łapki w dół na Shortsach + "Oceny negatywne na Shorts są widoczne Ograniczenie: Oceny negatywne mogą nie pojawiać się w trybie incognito" - Oceny negatywne na Shorts nie są widoczne - Łapki w dół jako procent - Oceny negatywne są wyświetlane jako procent - Oceny negatywne są wyświetlane jako liczba - - Kompaktowy przycisk \"Lubię to\" - Przycisk łapki stylizowany dla minimalnej szerokości - Przycisk łapki stylizowany dla najlepszego wyglądu - Pokaż szacunkową liczbę polubień - Filmy z wyłączonymi polubieniami wyświetlają szacunkową liczbę polubień - Szacunkowa liczba polubień nie jest wyświetlana - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny - Komunikat nie jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny - ReturnYouTubeDislike.com - Dane są dostarczane przez API Return YouTube Dislike. Dotknij tutaj, aby dowiedzieć się więcej - - Statystyki ReturnYouTubeDislike tego urządzenia - Średni czas odpowiedzi API - Minimalny czas odpowiedzi API - Maksymalny czas odpowiedzi API - Czas odpowiedzi API z ostatniego filmu - Łapki w dół tymczasowo niedostępne - wprowadzono limit żądań klienta API - Liczba połączeń do API podczas pobierania łapek - Nie wykonano połączeń sieciowych - %d wykonanych połączeń sieciowych - Liczba przekroczeń czasu API podczas pobierania łapek - Brak połączeń sieciowych zakończonych upływem czasu - %d połączeń sieciowych zakończonych upływem czasu - Limity żądań klienta API - Nie napotkano limitów żądań klienta - Limit żądania klient przekroczony %d razy - %d milisekund - - - Szeroki pasek wyszukiwania - Szeroki pasek wyszukiwania jest włączony - Szeroki pasek wyszukiwania jest wyłączony - - - Miniaturki wysokiej jakości - Podgląd filmu w wysokiej jakości - Podgląd filmu w średniej jakości - Miniatury paska wyszukiwania na pełnym ekranie są wysokiej jakości - Miniatury paska wyszukiwania na pełnym ekranie są średniej jakości - "Przywróci to również miniatury w transmisjach na żywo, które nie mają miniatury paska postępu. - -Miniatury paska postępu będą używać takiej samej jakości jak aktualny film. - -Ta funkcja działa najlepiej przy jakości wideo 720p lub niższej i przy korzystaniu z bardzo szybkiego połączenia internetowego." - Stare miniatury paska nawigacji - Podgląd filmu pojawia się nad paskiem postępu filmów - Podgląd filmu pojawia się w trybie pełnoekranowym - - - SponsorBlock - SponsorBlock - SponsorBlock to system społecznościowy służący do pomijania irytujących części filmów na YouTube - Wygląd - Przycisk głosowania - Przycisk głosowania jest widoczny - Przycisk głosowania nie jest widoczny - Użyj kwadratowego układu - Przyciski i elementy sterujące są kwadratowe - Przyciski i elementy sterujące są zaokrąglone - - Użyj kompaktowego przycisku pomijania - Przycisk od pomijania stylizowany dla minimalnej szerokości - Przycisk od pomijania stylizowany dla najlepszego wyglądu - Automatycznie ukryj przycisk pomijania - Przycisk od pomijania ukrywa się po kilku sekundach - Przycisk pomijania jest wyświetlany dla całego segmentu - Czas trwania przycisku pominięcia - Jak długo wyświetlać przyciski pomijania i przechodzenia do wyróżnienia przed automatycznym ukryciem - Pokaż komunikat o cofnięciu pominięcia - Komunikat jest wyświetlany, gdy segment zostanie automatycznie pominięty. Dotknij powiadomienia, aby cofnąć pominięcie - Komunikat nie jest wyświetlany - Czas trwania komunikatu pominięcia - Jak długo wyświetlać komunikat wyskakujący o cofnięciu pominięcia - 1 sekunda - 2 sekundy - 3 sekundy - 4 sekundy - 5 sekund - 6 sekund - 7 sekund - 8 sekund - 9 sekund - 10 sekund - Długość filmu bez segmentów - Długość wideo pomniejszona o wszystkie segmenty jest wyświetlana na pasku przewijania - Pełna długość wideo wyświetlana - Tworzenie nowych segmentów - Pokaż przycisk „Utwórz nowy segment” - Przycisk tworzenia jest widoczny - Przycisk tworzenia nie jest widoczny - Dokładność tworzenia nowego segmentu - Ilość milisekund, o którą przeskakuje czas podczas używania przycisków od tworzenia segmentów - Wartość musi być liczbą dodatnią - Wyświetl wytyczne - Wytyczne zawierają zasady i wskazówki dotyczące tworzenia nowych segmentów - Postępuj zgodnie z wytycznymi - Przeczytaj wytyczne SponsorBlock przed tworzeniem nowych segmentów - Przeczytano - Pokaż mi - Ogólne - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli SponsorBlock nie jest dostępny - Komunikat nie jest wyświetlany, jeśli SponsorBlock nie jest dostępny - Śledzenie licznika pominięć - Pozwala tabeli wyników SponsorBlock\'a wiedzieć, ile czasu zostało zaoszczędzone. Wiadomość jest wysyłana do tabeli wyników za każdym razem, gdy segment zostanie pominięty - Śledzenie licznika pominięć nie jest włączone - Minimalna długość segmentu - Segmenty krótsze niż ta wartość (w sekundach) nie będą wyświetlane lub pominięte - Nieprawidłowy czas trwania - Twój prywatny identyfikator użytkownika - Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty - Identyfikator użytkownika prywatnego musi mieć co najmniej 30 znaków - Zmień adres URL API - Adres, który jest używany przez SponsorBlock do wykonywania połączeń z serwerem - Zresetuj adres API - Adres API jest nieprawidłowy - Adres API został zmieniony - Importuj/Eksportuj ustawienia - Kopiuj - Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka - Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka. Obejmuje to Twój identyfikator użytkownika prywatnego. Dziel się nim mądrze. - Ustawienia zaimportowane pomyślnie - Nie udało się zaimportować: %s - Nie udało się wyeksportować: %s - "Twoje ustawienia zawierają prywatny identyfikator użytkownika SponsorBlock. + Oceny negatywne na Shorts nie są widoczne + Łapki w dół jako procent + Oceny negatywne są wyświetlane jako procent + Oceny negatywne są wyświetlane jako liczba + + Kompaktowy przycisk \"Lubię to\" + Przycisk łapki stylizowany dla minimalnej szerokości + Przycisk łapki stylizowany dla najlepszego wyglądu + Pokaż szacunkową liczbę polubień + Filmy z wyłączonymi polubieniami wyświetlają szacunkową liczbę polubień + Szacunkowa liczba polubień nie jest wyświetlana + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny + Komunikat nie jest wyświetlany, jeśli Return YouTube Dislike nie jest dostępny + ReturnYouTubeDislike.com + Dane są dostarczane przez API Return YouTube Dislike. Dotknij tutaj, aby dowiedzieć się więcej + + Statystyki ReturnYouTubeDislike tego urządzenia + Średni czas odpowiedzi API + Minimalny czas odpowiedzi API + Maksymalny czas odpowiedzi API + Czas odpowiedzi API z ostatniego filmu + Łapki w dół tymczasowo niedostępne - wprowadzono limit żądań klienta API + Liczba połączeń do API podczas pobierania łapek + Nie wykonano połączeń sieciowych + %d wykonanych połączeń sieciowych + Liczba przekroczeń czasu API podczas pobierania łapek + Brak połączeń sieciowych zakończonych upływem czasu + %d połączeń sieciowych zakończonych upływem czasu + Limity żądań klienta API + Nie napotkano limitów żądań klienta + Limit żądania klient przekroczony %d razy + %d milisekund + + + SponsorBlock + SponsorBlock + SponsorBlock to system społecznościowy służący do pomijania irytujących części filmów na YouTube + Wygląd + Przycisk głosowania + Przycisk głosowania jest widoczny + Przycisk głosowania nie jest widoczny + Użyj kwadratowego układu + Przyciski i elementy sterujące są kwadratowe + Przyciski i elementy sterujące są zaokrąglone + + Użyj kompaktowego przycisku pomijania + Przycisk od pomijania stylizowany dla minimalnej szerokości + Przycisk od pomijania stylizowany dla najlepszego wyglądu + Automatycznie ukryj przycisk pomijania + Przycisk od pomijania ukrywa się po kilku sekundach + Przycisk pomijania jest wyświetlany dla całego segmentu + Czas trwania przycisku pominięcia + Jak długo wyświetlać przyciski pomijania i przechodzenia do wyróżnienia przed automatycznym ukryciem + Pokaż komunikat o cofnięciu pominięcia + Komunikat jest wyświetlany, gdy segment zostanie automatycznie pominięty. Dotknij powiadomienia, aby cofnąć pominięcie + Komunikat nie jest wyświetlany + Czas trwania komunikatu pominięcia + Jak długo wyświetlać komunikat wyskakujący o cofnięciu pominięcia + 1 sekunda + 2 sekundy + 3 sekundy + 4 sekundy + 5 sekund + 6 sekund + 7 sekund + 8 sekund + 9 sekund + 10 sekund + Długość filmu bez segmentów + Długość wideo pomniejszona o wszystkie segmenty jest wyświetlana na pasku przewijania + Pełna długość wideo wyświetlana + Tworzenie nowych segmentów + Pokaż przycisk „Utwórz nowy segment” + Przycisk tworzenia jest widoczny + Przycisk tworzenia nie jest widoczny + Dokładność tworzenia nowego segmentu + Ilość milisekund, o którą przeskakuje czas podczas używania przycisków od tworzenia segmentów + Wartość musi być liczbą dodatnią + Wyświetl wytyczne + Wytyczne zawierają zasady i wskazówki dotyczące tworzenia nowych segmentów + Postępuj zgodnie z wytycznymi + Przeczytaj wytyczne SponsorBlock przed tworzeniem nowych segmentów + Przeczytano + Pokaż mi + Ogólne + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli SponsorBlock nie jest dostępny + Komunikat nie jest wyświetlany, jeśli SponsorBlock nie jest dostępny + Śledzenie licznika pominięć + Pozwala tabeli wyników SponsorBlock\'a wiedzieć, ile czasu zostało zaoszczędzone. Wiadomość jest wysyłana do tabeli wyników za każdym razem, gdy segment zostanie pominięty + Śledzenie licznika pominięć nie jest włączone + Minimalna długość segmentu + Segmenty krótsze niż ta wartość (w sekundach) nie będą wyświetlane lub pominięte + Nieprawidłowy czas trwania + Twój prywatny identyfikator użytkownika + Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty + Identyfikator użytkownika prywatnego musi mieć co najmniej 30 znaków + Zmień adres URL API + Adres, który jest używany przez SponsorBlock do wykonywania połączeń z serwerem + Zresetuj adres API + Adres API jest nieprawidłowy + Adres API został zmieniony + Importuj/Eksportuj ustawienia + Kopiuj + Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka + Twoja konfiguracja SponsorBlock w formacie JSON, którą można importować/eksportować do ReVanced i innych platform SponsorBlocka. Obejmuje to Twój identyfikator użytkownika prywatnego. Dziel się nim mądrze. + Ustawienia zaimportowane pomyślnie + Nie udało się zaimportować: %s + Nie udało się wyeksportować: %s + "Twoje ustawienia zawierają prywatny identyfikator użytkownika SponsorBlock. Twój identyfikator użytkownika jest jak hasło i nigdy nie powinno być udostępniane. " - Nie pokazuj ponownie - Zmień zachowanie segmentu - Treści sponsorowane - Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają - Nieopłacona/Autopromocja - Podobny do SponsorBlock, ale dotyczący nieopłaconej lub autoreklamowanej treści. Obejmuje sekcje dotyczące towarów, darowizn lub informacji o tym, z kim współpracowali - Przypomnienie o interakcji - Krótkie przypomnienie o łapce w górę, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja - Najważniejsze - Część filmu, której szuka większość osób - Przerywnik/Animowane intro - Fragment bez aktualnej zawartości. Może to być pauza, statyczna klatka lub powtarzająca się animacja. Nie dotyczy przejść zawierających informacje - Ekran końcowy / Napisy - Napisy końcowe lub gdy pojawia się ekran końcowy. Nie dotyczy zakończeń zawierających informacje - Wprowadzenie / Pozdrowienia - Zwiastuny nadchodzącego wideo z narracją, pozdrowienia i pożegnania. Nie obejmuje sekcji, które dodają dodatkową treść - Zapowiedź / Podsumowanie - Zbiór klipów pokazujących to, co pojawi się lub co pojawiło się w tym filmie, oraz innych fiilmach z tej serii, w którym wszystkie informacje są gdzieś powielane - Dygresja / Żarty - Sceny poboczne lub żarty, które nie są wymagane do zrozumienia głównej treści filmu. Nie obejmuje sekcji dostarczających kontekstu lub szczegółów tła - Muzyka: Sekcja bez muzyki - Tylko do użytku w teledyskach. Sekcje teledysków, które nie są uwzględnione w innej kategorii - Pomiń - Najważniejsze informacje - Pomiń sponsora - Pomiń promocję - Pomiń przypomnienie o interakcji - Pomiń do najważniejszych informacji - Pomiń wprowadzenie - Pomiń przerywnik - Pomiń przerywnik - Pomiń zakończenie - Pomiń haczyk - Pomiń podgląd - Pomiń podgląd - Pomiń podsumowanie - Pomiń wątek poboczny - Pomiń fragment bez muzyki - Pomiń segment - Pominięto treści sponsorowane - Pominięto autopromocję - Pominięto irytujące przypomnienie - Pominięto do najważniejszych informacji - Pominięto wstęp - Pominięto przerywnik - Pominięto przerywnik - Pominięto zakończenie - Pominięto haczyk - Pominięto podgląd - Pominięto podgląd - Pominięto podsumowanie - Pominięto wątek poboczny - Pominięto fragment bez muzyki - Pominięto niezgłoszony segment - Pominięto wiele segmentów - Pomiń automatycznie - Pomiń automatycznie raz - Pokaż przycisk „Pomiń” - Pokaż w pasku postępu filmu - Wyłącz - Nie można przesłać segmentu: %s - SponsorBlock jest tymczasowo niedostępny - Nie można przesłać segmentu (status: %1$d %2$s) - Nie można wysłać segmentu. Ograniczono szybkość (za dużo od tego samego użytkownika lub IP) - Nie można przesłać segmentu: %s - "Nie można wysłać segmentu. + Nie pokazuj ponownie + Zmień zachowanie segmentu + Treści sponsorowane + Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają + Nieopłacona/Autopromocja + Podobny do SponsorBlock, ale dotyczący nieopłaconej lub autoreklamowanej treści. Obejmuje sekcje dotyczące towarów, darowizn lub informacji o tym, z kim współpracowali + Przypomnienie o interakcji + Krótkie przypomnienie o łapce w górę, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja + Najważniejsze + Część filmu, której szuka większość osób + Przerywnik/Animowane intro + Fragment bez aktualnej zawartości. Może to być pauza, statyczna klatka lub powtarzająca się animacja. Nie dotyczy przejść zawierających informacje + Ekran końcowy / Napisy + Napisy końcowe lub gdy pojawia się ekran końcowy. Nie dotyczy zakończeń zawierających informacje + Wprowadzenie / Pozdrowienia + Zwiastuny nadchodzącego wideo z narracją, pozdrowienia i pożegnania. Nie obejmuje sekcji, które dodają dodatkową treść + Zapowiedź / Podsumowanie + Zbiór klipów pokazujących to, co pojawi się lub co pojawiło się w tym filmie, oraz innych fiilmach z tej serii, w którym wszystkie informacje są gdzieś powielane + Dygresja / Żarty + Sceny poboczne lub żarty, które nie są wymagane do zrozumienia głównej treści filmu. Nie obejmuje sekcji dostarczających kontekstu lub szczegółów tła + Muzyka: Sekcja bez muzyki + Tylko do użytku w teledyskach. Sekcje teledyskówwithout music, które nie są uwzględnione w innej kategorii + Pomiń + Najważniejsze informacje + Pomiń sponsora + Pomiń promocję + Pomiń przypomnienie o interakcji + Pomiń do najważniejszych informacji + Pomiń wprowadzenie + Pomiń przerywnik + Pomiń przerywnik + Pomiń zakończenie + Pomiń haczyk + Pomiń podgląd + Pomiń podgląd + Pomiń podsumowanie + Pomiń wątek poboczny + Pomiń fragment bez muzyki + Pomiń segment + Pominięto treści sponsorowane + Pominięto autopromocję + Pominięto irytujące przypomnienie + Pominięto do najważniejszych informacji + Pominięto wstęp + Pominięto przerywnik + Pominięto przerywnik + Pominięto zakończenie + Pominięto haczyk + Pominięto podgląd + Pominięto podgląd + Pominięto podsumowanie + Pominięto wątek poboczny + Pominięto fragment bez muzyki + Pominięto niezgłoszony segment + Pominięto wiele segmentów + Pomiń automatycznie + Pomiń automatycznie raz + Pokaż przycisk „Pomiń” + Pokaż w pasku postępu filmu + Wyłącz + Nie można przesłać segmentu: %s + SponsorBlock jest tymczasowo niedostępny + Nie można przesłać segmentu (status: %1$d %2$s) + Nie można wysłać segmentu. Ograniczono szybkość (za dużo od tego samego użytkownika lub IP) + Nie można przesłać segmentu: %s + "Nie można wysłać segmentu. Istnieje już" - Pomyślnie przesłano segment - - SponsorBlock jest niedostępny (API nie reaguje) - SponsorBlock tymczasowo niedostępny (status %d) - SponsorBlock tymczasowo niedostępny - Nie można zagłosować na segment (limit czasu) - Nie można zagłosować na segment (status: %1$d %2$s) - Nie można zagłosować na segment: %s - Głos za - Głos przeciw - Zmień kategorię - Brak segmentów do zagłosowania - - %1$s do %2$s - Wybierz kategorię segmentu - Kategoria jest wyłączona w ustawieniach. Włącz kategorię do wysłania. - Nowy segment SponsorBlocka - Ustawić %s jako początek lub koniec nowego segmentu? - Start - Koniec - Teraz - Czas rozpoczęcia segmentu od - Czas zakończenia segmentu od - Czy te czasy są poprawne? - "Segment pochodzi z + Pomyślnie przesłano segment + + SponsorBlock jest niedostępny (API nie reaguje) + SponsorBlock tymczasowo niedostępny (status %d) + SponsorBlock tymczasowo niedostępny + Nie można zagłosować na segment (limit czasu) + Nie można zagłosować na segment (status: %1$d %2$s) + Nie można zagłosować na segment: %s + Głos za + Głos przeciw + Zmień kategorię + Brak segmentów do zagłosowania + + %1$s do %2$s + Wybierz kategorię segmentu + Kategoria jest wyłączona w ustawieniach. Włącz kategorię do wysłania. + Nowy segment SponsorBlocka + Ustawić %s jako początek lub koniec nowego segmentu? + Start + Koniec + Teraz + Czas rozpoczęcia segmentu od + Czas zakończenia segmentu od + Czy te czasy są poprawne? + "Segment pochodzi z od %1$s do @@ -1287,47 +1372,47 @@ do (%3$s) Gotowy do przesłania?" - Początek musi być przed końcem - Zaznacz dwa miejsca na pasku czasu - Zobacz i dopilnuj, aby segment pomijał się płynnie - Edytuj ręcznie czas segmentu - Czy chcesz edytować czas rozpoczęcia lub zakończenia segmentu? - Podano nieprawidłowy format czasu - Statystyki - - Statystyki są tymczasowo niedostępne (API nie działa) - Wczytywanie... - SponsorBlock jest wyłączony - Twoja nazwa użytkownika: <b>%s</b> - Dotknij tutaj, aby zmienić nazwę użytkownika - Nie można zmienić nazwy użytkownika: Status: %1$d %2$s - Nazwa użytkownika została zmieniona - Twoja reputacja to <b>%.2f</b> - Stworzyłeś <b>%s</b> segmentów - Dotknij tutaj, aby zobaczyć swoje segmenty - Tablica wyników SponsorBlock - Uchroniłeś ludzi przed <b>%s</b> segmentami - Dotknij tutaj, aby zobaczyć globalne statystyki i najlepszych współtwórców - To <b>%s</b> ich życia.<br>Dotknij tutaj, aby zobaczyć tabelę wyników - Pominąłeś(aś) <b>%s</b> segmentów - To <b>%s</b> - Czy chcesz zresetować ilość pominiętych segmentów? - %1$s godzin %2$s minut - %1$s minut %2$s sekund - %s sekund - Krycie: - Kolor: - O aplikacji - sponsor.ajay.app - Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy - - - Współczynnik kształtu - Domyślny - Telefon - Tabletowy - Motoryzacja - "Zmiany obejmują: + Początek musi być przed końcem + Zaznacz dwa miejsca na pasku czasu + Zobacz i dopilnuj, aby segment pomijał się płynnie + Edytuj ręcznie czas segmentu + Czy chcesz edytować czas rozpoczęcia lub zakończenia segmentu? + Podano nieprawidłowy format czasu + Statystyki + + Statystyki są tymczasowo niedostępne (API nie działa) + Wczytywanie... + SponsorBlock jest wyłączony + Twoja nazwa użytkownika: <b>%s</b> + Dotknij tutaj, aby zmienić nazwę użytkownika + Nie można zmienić nazwy użytkownika: Status: %1$d %2$s + Nazwa użytkownika została zmieniona + Twoja reputacja to <b>%.2f</b> + Stworzyłeś <b>%s</b> segmentów + Dotknij tutaj, aby zobaczyć swoje segmenty + Tablica wyników SponsorBlock + Uchroniłeś ludzi przed <b>%s</b> segmentami + Dotknij tutaj, aby zobaczyć globalne statystyki i najlepszych współtwórców + To <b>%s</b> ich życia.<br>Dotknij tutaj, aby zobaczyć tabelę wyników + Pominąłeś(aś) <b>%s</b> segmentów + To <b>%s</b> + Czy chcesz zresetować ilość pominiętych segmentów? + %1$s godzin %2$s minut + %1$s minut %2$s sekund + %s sekund + Krycie: + Kolor: + O aplikacji + sponsor.ajay.app + Dane są dostarczane przez API SponsorBlock. Dotknij tutaj, aby dowiedzieć się więcej i pobrać na inne platformy + + + Współczynnik kształtu + Domyślny + Telefon + Tabletowy + Motoryzacja + "Zmiany obejmują: Układ tabletu • Posty społeczności są ukryte @@ -1335,329 +1420,331 @@ Układ tabletu Układ samochodowy • Shorts otwierają się w zwykłym odtwarzaczu • Kanał jest uporządkowany według tematów i kanałów" - - - Oszukiwanie wersji aplikacji - Oszukiwanie wersji jest włączone - Oszukiwanie wersji jest wyłączone - "Wersja aplikacji zostanie zmieniona na starszą wersję YouTube. + + + Oszukiwanie wersji aplikacji + Oszukiwanie wersji jest włączone + Oszukiwanie wersji jest wyłączone + "Wersja aplikacji zostanie zmieniona na starszą wersję YouTube. Spowoduje to zmianę wyglądu i funkcjonalności aplikacji, ale mogą wystąpić nieznane efekty uboczne. Jeśli później zostanie wyłączony, zaleca się wyczyszczenie danych aplikacji, aby zapobiec błędom interfejsu użytkownika." - Docelowa oszukiwana wersja aplikacji - 20.13.41 - Przywróć niezwinięty pasek akcji wideo - 20.05.46 - Przywróć funkcję transkrypcji - 19.35.36 - Przywraca stare ikony odtwarzacza Shortsów - 19.01.34 – Przywróć stare ikony nawigacji - - - Zmień stronę startową - Domyślna - Wszystkie subskrypcje - Przeglądaj kanały - Kursy / Nauka - Odkrywanie - Moda i uroda - Gry - Historia - Biblioteka - Polubione filmy - Na żywo - Filmy - Muzyka - Wiadomości - Powiadomienia - Playlisty - Szukaj - Zakupy - Shorts - Sport - Subskrypcje - Na czasie - Wirtualna rzeczywistość - Do obejrzenia - Twoje klipy - Zawsze zmieniaj stronę startową - "Strona startowa jest zawsze zmieniana + Docelowa oszukiwana wersja aplikacji + 20.13.41 - Przywróć niezwinięty pasek akcji wideo + 20.05.46 - Przywróć funkcję transkrypcji + + + Zmień stronę startową + Domyślna + Wszystkie subskrypcje + Przeglądaj kanały + Kursy / Nauka + Odkrywanie + Moda i uroda + Gry + Historia + Biblioteka + Polubione filmy + Na żywo + Filmy + Muzyka + Wiadomości + Powiadomienia + Playlisty + Szukaj + Zakupy + Shorts + Sport + Subskrypcje + Na czasie + Wirtualna rzeczywistość + Do obejrzenia + Twoje klipy + Zawsze zmieniaj stronę startową + "Strona startowa jest zawsze zmieniana Ograniczenie: użycie przycisku wstecz na pasku narzędzi może nie działać" - Strona startowa jest zmieniana tylko przy uruchomieniu aplikacji - - - Wznawianie odtwarzacza Shortsów - Odtwarzacz Shortsów nie będzie wznawiany przy starcie aplikacji - Odtwarzacz Shortsów zostanie wznowiony przy starcie aplikacji - - - Otwórz Shorts z - Odtwarzacz Shortsów - Odtwarzacz regularny - Odtwarzacz regularny na pełnym ekranie - - - Autoodtwarzanie Shortsów - Shortsy będą odtwarzane automatycznie - Shortsy będą się powtarzać - Autoodtwarzanie Shortsów w tle - Odtwarzanie w tle Shortsów będzie automatyczne - Odtwarzanie w tle Shortsów będzie się powtarzać - - - Miniodtwarzacz - Zmień styl zminimalizowanego odtwarzacza aplikacji - Typ miniodtwarzacza - Wyłączony - Domyślny - Minimalny - Tabletowy - Nowoczesny 1 - Nowoczesny 2 - Nowoczesny 3 - Nowoczesny 4 - Wyłącz zaokrąglone rogi - Narożniki są kwadratowe - Narożniki są zaokrąglone - Podwójne stuknięcie i uszczypnięcie, aby zmienić rozmiar - "Akcja dwukrotnego dotknięcia i gest szczypania w celu zmiany rozmiaru są włączone + Strona startowa jest zmieniana tylko przy uruchomieniu aplikacji + + + Wznawianie odtwarzacza Shortsów + Odtwarzacz Shortsów nie będzie wznawiany przy starcie aplikacji + Odtwarzacz Shortsów zostanie wznowiony przy starcie aplikacji + + + Otwórz Shorts z + Odtwarzacz Shortsów + Odtwarzacz regularny + Odtwarzacz regularny na pełnym ekranie + + + Autoodtwarzanie Shortsów + Shortsy będą odtwarzane automatycznie + Shortsy będą się powtarzać + Autoodtwarzanie Shortsów w tle + Odtwarzanie w tle Shortsów będzie automatyczne + Odtwarzanie w tle Shortsów będzie się powtarzać + + + Miniodtwarzacz + Zmień styl zminimalizowanego odtwarzacza aplikacji + Typ miniodtwarzacza + Wyłączony + Domyślny + Minimalny + Tabletowy + Nowoczesny 1 + Nowoczesny 2 + Nowoczesny 3 + Nowoczesny 4 + Wyłącz zaokrąglone rogi + Narożniki są kwadratowe + Narożniki są zaokrąglone + Podwójne stuknięcie i uszczypnięcie, aby zmienić rozmiar + "Akcja dwukrotnego dotknięcia i gest szczypania w celu zmiany rozmiaru są włączone • Dwukrotnie naciśnij, aby powiększyć rozmiar odtwarzacza • Ponownie dotknij dwukrotnie, aby przywrócić oryginalny rozmiar" - Wyłączone - Wyłącz przeciąganie i upuszczanie - Gest przeciągnięcia i upuszczenia wyłączony - "Przeciąganie i upuszczanie jest włączone + Wyłączone + Wyłącz przeciąganie i upuszczanie + Gest przeciągnięcia i upuszczenia wyłączony + "Przeciąganie i upuszczanie jest włączone Odtwarzacz można przeciągnąć do dowolnego rogu ekranu" - Wyłącz gest przeciągania w poziomie - Gest przeciągania w poziomie jest wyłączony - "Włączony gest przeciągania w poziomie + Wyłącz gest przeciągania w poziomie + Gest przeciągania w poziomie jest wyłączony + "Włączony gest przeciągania w poziomie Odtwarzacz można przeciągnąć poza ekran w lewo lub w prawo" - Ukryj przyciski nakładki - Przyciski nakładki są ukryte - Przyciski nakładki są widoczne - Ukryj przyciski rozwijania i zamykania - "Przyciski są ukryte + Ukryj przyciski nakładki + Przyciski nakładki są ukryte + Przyciski nakładki są widoczne + Ukryj przyciski rozwijania i zamykania + "Przyciski są ukryte Przesuń, aby rozwinąć lub zamknąć" - Przyciski rozwijania i zamykania są widoczne - Podteksty - Podteksty są ukryte - Podteksty są widoczne - Przyciski przewijania do przodu i do tyłu - Przyciski przewijania do przodu i do tyłu są ukryte - Przyciski przewijania do przodu i do tyłu są widoczne - Rozmiar początkowy - Początkowy rozmiar ekranu, w pikselach - Rozmiar piksela musi być pomiędzy %1$s i %2$s - Przezroczystość nakładki - Wartość przezroczystości, gdzie 0 to pełna przezroczystość - Przezroczystość nakładki musi być od 0 do 100 - - - Kolorowy ekran ładowania - Ekran ładowania będzie miał kolorowe tło - Ekran ładowania będzie miał stałe tło - Styl ekranu powitalnego - Kolor - Czarno-biały - Niestandardowy kolor paska postępu - Niestandardowy - Oryginalny - Niestandardowy kolor paska postępu - Kolor paska postępu - Niestandardowy kolor akcentu paska postępu - Kolor akcentu paska postępu - Nieprawidłowa wartość koloru paska postępu - - - YouTube ReVanced - YT ReVanced - YT - - - Logo nagłówka - Domyślne - Zwykłe - Premium - ReVanced - - ReVanced minimalistyczne - Niestandardowe - - - Host dla obrazów - Używanie hosta obrazu yt4.ggpht.com - "Używanie oryginalnego hosta obrazów + Przyciski rozwijania i zamykania są widoczne + Podteksty + Podteksty są ukryte + Podteksty są widoczne + Przyciski przewijania do przodu i do tyłu + Przyciski przewijania do przodu i do tyłu są ukryte + Przyciski przewijania do przodu i do tyłu są widoczne + Rozmiar początkowy + Początkowy rozmiar ekranu, w pikselach + Rozmiar piksela musi być pomiędzy %1$s i %2$s + Przezroczystość nakładki + Wartość przezroczystości, gdzie 0 to pełna przezroczystość + Przezroczystość nakładki musi być od 0 do 100 + + + Kolorowy ekran ładowania + Ekran ładowania będzie miał kolorowe tło + Ekran ładowania będzie miał stałe tło + Styl ekranu powitalnego + Nieaktywne + Kolor + Czarno-biały + Niestandardowy kolor paska postępu + Niestandardowy + Oryginalny + Niestandardowy kolor paska postępu + Kolor paska postępu + Niestandardowy kolor akcentu paska postępu + Kolor akcentu paska postępu + Nieprawidłowa wartość koloru paska postępu + + + YouTube ReVanced + YT ReVanced + YT + + + Logo nagłówka + Domyślne + Zwykłe + Premium + ReVanced + + ReVanced minimalistyczne + Niestandardowe + + + Host dla obrazów + Używanie hosta obrazu yt4.ggpht.com + "Używanie oryginalnego hosta obrazów Włączenie tego może naprawić brakujące obrazy, które są zablokowane w niektórych regionach" - - - - Na stronie głównej - - Karta Subskrypcje - - Na stronie Ty - Listy odtwarzania odtwarzacza i rekomendacje - W wynikach wyszukiwania - Oryginalne miniaturki - DeArrow i oryginalne miniatury - DeArrow i miniaturki przechwycone z filmu - Miniaturki przechwycone z filmu - DeArrow - "DeArrow udostępnia zewnętrzne miniatury filmów YouTube. Te miniatury są często bardziej trafne niż te dostarczane przez YouTube + + + + Na stronie głównej + + Karta Subskrypcje + + Na stronie Ty + Listy odtwarzania odtwarzacza i rekomendacje + W wynikach wyszukiwania + Oryginalne miniaturki + DeArrow i oryginalne miniatury + DeArrow i miniaturki przechwycone z filmu + Miniaturki przechwycone z filmu + DeArrow + "DeArrow udostępnia zewnętrzne miniatury filmów YouTube. Te miniatury są często bardziej trafne niż te dostarczane przez YouTube Jeśli włączone, adresy URL filmów zostaną wysłane do serwera API i żadne inne dane nie zostaną wysłane. Jeśli film nie ma miniatur DeArrow, wyświetlane są miniatury oryginalne lub nieruchome Naciśnij tutaj, aby dowiedzieć się więcej o DeArrow" - Komunikat o niedostępności API - Komunikat jest wyświetlany, jeśli DeArrow nie jest dostępny - Komunikat nie jest wyświetlany, jeśli DeArrow nie jest dostępny - Punkt końcowy API DeArrow - Adres URL punktu końcowego do miniaturek DeArrow - Miniaturki przechwycone z filmu - Przechwytywanie jest nadal pobierane od początku/środka/końca każdego filmu. Te obrazy są wbudowane w YouTube i żadne zewnętrzne API nie jest używane - Szybkie przechwytywanie miniaturek z filmu - Używasz przechwytywania średniej jakości. Miniaturki będą ładować się szybciej, lecz mogą pozostać puste w przypadku transmisji na żywo, niewydanych i bardzo starych filmów - Używasz przechwytywania wysokiej jakości - Czas, z którego ma być przechwycona miniaturka z filmu - Początek filmu - Środek filmu - Koniec filmu - - DeArrow jest tymczasowo niedostępny (kod statusu: %s) - DeArrow jest tymczasowo niedostępny - - - Ogłoszenia ReVanced - Ogłoszenia przy uruchomieniu są wyświetlane - Ogłoszenia przy uruchomieniu nie są wyświetlane - Ogłoszenia przy starcie - Nie udało się połączyć z dostawcą ogłoszeń - Odrzuć - - - Włącz zapętlanie wideo - Wideo będzie się zapętlać - Wideo nie będzie się zapętlać - - - Pokaż przycisk zapętlania wideo - Przycisk jest widoczny - Przycisk nie jest widoczny - Zapętlanie wideo jest włączone - Zapętlanie wideo jest wyłączone - - - Wstrzymaj w przypadku innych dźwięków - Odtwarzanie zostaje wstrzymane, gdy odtwarzany jest inny dźwięk (np. nawigacja) - Głośność zostaje zmniejszona, kiedy odtwarzane są inne dźwięki - - - Oszukaj rozdzielczość urządzenia - "Wymiary urządzenia sfałszowane + Komunikat o niedostępności API + Komunikat jest wyświetlany, jeśli DeArrow nie jest dostępny + Komunikat nie jest wyświetlany, jeśli DeArrow nie jest dostępny + Punkt końcowy API DeArrow + Adres URL punktu końcowego do miniaturek DeArrow + Miniaturki przechwycone z filmu + Przechwytywanie jest nadal pobierane od początku/środka/końca każdego filmu. Te obrazy są wbudowane w YouTube i żadne zewnętrzne API nie jest używane + Szybkie przechwytywanie miniaturek z filmu + Używasz przechwytywania średniej jakości. Miniaturki będą ładować się szybciej, lecz mogą pozostać puste w przypadku transmisji na żywo, niewydanych i bardzo starych filmów + Używasz przechwytywania wysokiej jakości + Czas, z którego ma być przechwycona miniaturka z filmu + Początek filmu + Środek filmu + Koniec filmu + + DeArrow jest tymczasowo niedostępny (kod statusu: %s) + DeArrow jest tymczasowo niedostępny + + + Ogłoszenia ReVanced + Ogłoszenia przy uruchomieniu są wyświetlane + Ogłoszenia przy uruchomieniu nie są wyświetlane + Ogłoszenia przy starcie + Nie udało się połączyć z dostawcą ogłoszeń + Odrzuć + + + Włącz zapętlanie wideo + Wideo będzie się zapętlać + Wideo nie będzie się zapętlać + + + Pokaż przycisk zapętlania wideo + Przycisk jest widoczny + Przycisk nie jest widoczny + Zapętlanie wideo jest włączone + Zapętlanie wideo jest wyłączone + + + Wstrzymaj w przypadku innych dźwięków + Odtwarzanie zostaje wstrzymane, gdy odtwarzany jest inny dźwięk (np. nawigacja) + Głośność zostaje zmniejszona, kiedy odtwarzane są inne dźwięki + + + Oszukaj rozdzielczość urządzenia + "Wymiary urządzenia sfałszowane Mogą zostać odblokowane wyższe jakości wideo, ale możesz doświadczyć zacinania się wideo, gorszego czasu pracy na baterii i nieznanych efektów ubocznych" - "Wymiary urządzenia nie są sfałszowane + "Wymiary urządzenia nie są sfałszowane Włączenie tego może odblokować wyższe jakości wideo" - Włączenie tego może spowodować zacinanie się odtwarzanego filmu, pogorszenie żywotności baterii i nieznane efekty uboczne. - - - Informacje zwrotne haptyczne - Zmień informacje zwrotne haptyczne - Wyłącz haptykę rozdziałów - Haptyka rozdziałów jest wyłączona - Haptyka rozdziałów jest włączona - Wyłącz haptykę precyzyjnego przewijania - Haptyka precyzyjnego wyszukiwania jest wyłączona - Haptyka precyzyjnego przewijania jest włączona - Wyłącz haptykę cofania wyszukiwania - Haptyka cofania wyszukiwania jest wyłączona - Haptyka cofania wyszukiwania jest włączona - Haptyka przy zoomowaniu - Haptyka przybliżania jest wyłączona - Haptyka przybliżania jest włączona - - - Jeśli niedawno zmieniono dane logowania do konta, odinstaluj i zainstaluj ponownie MicroG. - - - Omijanie przekierowań URL - Przekierowanie URL jest omijane - Przekierowanie URL nie jest omijane - - - Otwieranie linków - Otwieranie linków w zewnętrznej przeglądarce - Otwieranie linków w przeglądarce w aplikacji - - - - Automatycznie - Zapamiętaj zmiany jakości filmu - Zmiany jakości dotyczą wszystkich filmów - Zmiany jakości dotyczą tylko bieżącego filmu - Pokaż komunikat przy zmianach jakości wideo - Komunikat jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona - Komunikat nie jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona - Domyślna jakość filmu w sieci Wi-Fi - Domyślna jakość filmu w sieci komórkowej - Zapamiętaj zmiany jakości w Shorts - Zmiany jakości dotyczą wszystkich filmów Shorts - Zmiany jakości dotyczą tylko bieżącego Short - Domyślna jakość Shorts w sieci Wi-Fi - Domyślna jakość Shorts w sieci komórkowej - telefonu - Wi-Fi - Zmieniono domyślną jakość %1$s na: %2$s - Zmieniono jakość Shorts %1$s na: %2$s - - - Przycisk od prędkości - Przycisk dialogu prędkości jest widoczny. Dotknij i przytrzymaj, aby zresetować prędkość odtwarzania do wartości domyślnych - Przycisk dialogu prędkości nie jest widoczny - - - Pokaż przycisk jakości wideo - Przycisk jakości wideo jest widoczny. Dotknij i przytrzymaj, aby zresetować jakość do wartości domyślnych - Przycisk jakości wideo nie jest widoczny - - - Niestandardowe menu prędkości odtwarzania - Niestandardowe menu prędkości jest widoczne - Niestandardowe menu prędkości nie jest widoczne - Przywróć stare menu prędkości odtwarzania - Pokazane jest stare menu prędkości - Pokazane jest nowoczesne menu prędkości - Niestandardowe prędkości odtwarzania - Dodaj lub zmień niestandardowe prędkości odtwarzania - Prędkości niestandardowe muszą być mniejsze niż %s - Nieprawidłowe prędkości odtwarzania niestandardowego - Automatyczne - Szybkość dostosowywania dotknięciem i przytrzymaniem - Prędkość odtwarzania w granicach 0-8 - - - Zapamiętuj zmiany prędkości odtwarzania - Zmiany prędkości odtwarzania dotyczą wszystkich filmów - Zmiany prędkości odtwarzania dotyczą tylko bieżącego filmu - Pokaż komunikat przy zmianach szybkości odtwarzania - Komunikat jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona - Komunikat nie jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona - Domyślna prędkość odtwarzania - Zmieniono domyślną prędkość na: %s - - - Wyłącz wideo HDR - Wideo HDR jest wyłączone - Wideo HDR jest włączone - Wymuś AVC (H.264) - Kodek wideo jest wymuszony na AVC (H.264) - Kodek wideo jest określany automatycznie - "Korzyści: + Włączenie tego może spowodować zacinanie się odtwarzanego filmu, pogorszenie żywotności baterii i nieznane efekty uboczne. + + + Informacje zwrotne haptyczne + Zmień informacje zwrotne haptyczne + Wyłącz haptykę rozdziałów + Haptyka rozdziałów jest wyłączona + Haptyka rozdziałów jest włączona + Wyłącz haptykę precyzyjnego przewijania + Haptyka precyzyjnego wyszukiwania jest wyłączona + Haptyka precyzyjnego przewijania jest włączona + Wyłącz haptykę cofania wyszukiwania + Haptyka cofania wyszukiwania jest wyłączona + Haptyka cofania wyszukiwania jest włączona + Wyłącz haptykę dotknięcia i przytrzymania + Haptyka dotknięcia i przytrzymania jest wyłączona + Haptyka dotknięcia i przytrzymania jest włączona + Haptyka przy zoomowaniu + Haptyka przybliżania jest wyłączona + Haptyka przybliżania jest włączona + + + Jeśli niedawno zmieniono dane logowania do konta, odinstaluj i zainstaluj ponownie MicroG. + + + Omijanie przekierowań URL + Przekierowanie URL jest omijane + Przekierowanie URL nie jest omijane + + + Otwieranie linków + Otwieranie linków w zewnętrznej przeglądarce + Otwieranie linków w przeglądarce w aplikacji + + + + Automatycznie + Zapamiętaj zmiany jakości filmu + Zmiany jakości dotyczą wszystkich filmów + Zmiany jakości dotyczą tylko bieżącego filmu + Pokaż komunikat przy zmianach jakości wideo + Komunikat jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona + Komunikat nie jest wyświetlany, gdy domyślna jakość wideo zostanie zmieniona + Domyślna jakość filmu w sieci Wi-Fi + Domyślna jakość filmu w sieci komórkowej + Zapamiętaj zmiany jakości w Shorts + Zmiany jakości dotyczą wszystkich filmów Shorts + Zmiany jakości dotyczą tylko bieżącego Short + Domyślna jakość Shorts w sieci Wi-Fi + Domyślna jakość Shorts w sieci komórkowej + telefonu + Wi-Fi + Zmieniono domyślną jakość %1$s na: %2$s + Zmieniono jakość Shorts %1$s na: %2$s + + + Przycisk od prędkości + Przycisk dialogu prędkości jest widoczny. Dotknij i przytrzymaj, aby zresetować prędkość odtwarzania do wartości domyślnych + Przycisk dialogu prędkości nie jest widoczny + + + Pokaż przycisk jakości wideo + Przycisk jakości wideo jest widoczny. Dotknij i przytrzymaj, aby zresetować jakość do wartości domyślnych + Przycisk jakości wideo nie jest widoczny + + + Niestandardowe menu prędkości odtwarzania + Niestandardowe menu prędkości jest widoczne + Niestandardowe menu prędkości nie jest widoczne + Przywróć stare menu prędkości odtwarzania + Pokazane jest stare menu prędkości + Pokazane jest nowoczesne menu prędkości + Niestandardowe prędkości odtwarzania + Dodaj lub zmień niestandardowe prędkości odtwarzania + Prędkości niestandardowe muszą być mniejsze niż %s + Nieprawidłowe prędkości odtwarzania niestandardowego + Automatyczne + Szybkość dostosowywania dotknięciem i przytrzymaniem + Prędkość odtwarzania w granicach 0-8 + + + Zapamiętuj zmiany prędkości odtwarzania + Zmiany prędkości odtwarzania dotyczą wszystkich filmów + Zmiany prędkości odtwarzania dotyczą tylko bieżącego filmu + Pokaż komunikat przy zmianach szybkości odtwarzania + Komunikat jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona + Komunikat nie jest wyświetlany, gdy domyślna szybkość odtwarzania zostanie zmieniona + Domyślna prędkość odtwarzania + Zmieniono domyślną prędkość na: %s + + + Wyłącz wideo HDR + Wideo HDR jest wyłączone + Wideo HDR jest włączone + Wymuś AVC (H.264) + Kodek wideo jest wymuszony na AVC (H.264) + Kodek wideo jest określany automatycznie + "Korzyści: • Może poprawić żywotność baterii • Może przywrócić brakujące rozdzielczości wideo na starszych urządzeniach @@ -1666,182 +1753,188 @@ Ograniczenia: • Odtwarzanie wideo będzie zużywać więcej danych internetowych niż VP9 lub AV1 • Filmy HDR nie będą używać AVC • Niektóre urządzenia nie mogą wymusić użycia AVC" - - - Pokaż zaawansowane menu jakości filmu - Zaawansowane menu jakości filmu jest wyświetlane - Zaawansowane menu jakości filmu nie jest wyświetlane - - - Przesuń, by przewinąć - Gest przesuwania jest włączony - Przesuń, aby przeszukiwać nie jest włączony - - - Zezwól na Android VR AV1 - "Kodek wideo to AVC (H.264), VP9 lub AV1 + + + Pokaż zaawansowane menu jakości filmu + Zaawansowane menu jakości filmu jest wyświetlane + Zaawansowane menu jakości filmu nie jest wyświetlane + + + Ukryj opcje jakości Premium + Opcje jakości Premium są ukryte + Opcje jakości Premium są widoczne + + + Przesuń, by przewinąć + Gest przesuwania jest włączony + Przesuń, aby przeszukiwać nie jest włączony + + + Zezwól na Android VR AV1 + "Kodek wideo to AVC (H.264), VP9 lub AV1 Odtwarzanie może się zacinać lub gubić klatki" - Kodek wideo to AVC (H.264) lub VP9 - "Włączenie tego ustawienia może używać programowego dekodowania AV1. + Kodek wideo to AVC (H.264) lub VP9 + "Włączenie tego ustawienia może używać programowego dekodowania AV1. Odtwarzanie wideo z AV1 może powodować zacinanie się lub gubienie klatek." - Skutki uboczne fałszowania - • Eksperymentalny klient i może przestać działać w każdej chwili - • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach - • Brakuje menu ścieżek audio - • Žádný video kodek AV1 - • Stabilna głośność nie jest dostępna - • Filmy dla dzieci mogą nie być odtwarzane po wylogowaniu lub w trybie incognito - - • Wymuś oryginalny dźwięk jest niedostępny - Pokaż w statystykach dla nerdów - Typ klienta jest wyświetlany w Statystykach dla nerdów - Klient jest ukryty w statystykach dla nerdów - - - - - YT Music ReVanced - Music ReVanced - Music - - - O programie - Reklamy - Ogólne - Odtwarzacz - Różne - - - Ukryj reklamy wideo - Reklamy wideo są ukryte - Reklamy wideo są widoczne - - - Włącz stałe powtarzanie - Stałe powtarzanie jest włączone - Stałe powtarzanie jest wyłączone - - - Ukryj przycisk Cast - Przycisk Cast jest ukryty - Przycisk Cast jest widoczny - Ukryj przycisk historii - Przycisk historii jest ukryty - Przycisk historii jest widoczny - Ukryj przycisk powiadomień - Przycisk powiadomień jest ukryty - Przycisk powiadomień jest widoczny - Ukryj przycisk wyszukiwania - Przycisk wyszukiwania jest ukryty - Przycisk wyszukiwania jest widoczny - - - Ukryj pasek kategorii - Pasek kategorii jest ukryty - Pasek kategorii jest widoczny - - - Zmień kolor miniplayera - Kolor miniplayera dopasowany do odtwarzacza pełnoekranowego - Miniplayer używa domyślnego koloru - - - Pasek nawigacji - Ukryj lub zmień przyciski paska nawigacji - - Ukryj Główną - Przycisk Główna jest ukryty - Przycisk Główna jest pokazany - - Ukryj Fragmenty - Przycisk Wycinki jest ukryty - Przycisk Wycinki jest pokazany - - Ukryj Odkrywaj - Przycisk Przeglądaj jest ukryty - Przycisk Przeglądaj jest pokazany - - Ukryj Bibliotekę - Przycisk Biblioteka jest ukryty - Przycisk Biblioteka jest pokazany - - Ukryj Ulepsz - Przycisk Ulepsz jest ukryty - Przycisk Ulepsz jest pokazany - Ukryj pasek nawigacji - Pasek nawigacji jest ukryty - Pasek nawigacji jest pokazany - Ukryj etykiety przycisków nawigacji - Etykiety są ukryte - Etykiety są pokazane - - - Ukryj etykietę „Uzyskaj Music Premium” - Etykieta jest ukryta - Etykieta jest widoczna - - - Ukryj przycisk uaktualnienia - Przycisk jest ukryty - Przycisk jest widoczny - - - - - Reklamy dźwiękowe - Reklamy dźwiękowe są zablokowane - Reklamy dźwiękowe są odblokowane - - - %s niedostępne, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. - %s zwrócił błąd, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. - Osadzone reklamy w filmie - Nieaktywne - Proxy Luminous - Proxy PurpleAdBlock - - - Reklamy w filmie - Reklamy w filmie są zablokowane - Reklamy w filmie są odblokowane - - - Wiadomość usunięta - Usunięte wiadomości - Nie pokazuj usuniętych wiadomości - Ukryj usunięte wiadomości za spoilerem - Pokaż usunięte wiadomości jako przekreślony tekst - - - Automatyczne przyznawanie punktów kanału - Punkty kanału są przyznawane automatycznie - Punkty kanału nie są przyznawane automatycznie - - - - Tryb debugowania - Tryb debugowania jest włączony (niezalecane) - Tryb debugowania jest wyłączony - - - Ustawienia ReVanced - O nas - O ReVanced - Blokowanie reklam - Ustawienia blokowania reklam - Czat - Ustawienia czatu - Różne - Różne ustawienia - Ustawienia ogólne - Inne ustawienia - Reklamy po stronie klienta - Reklamy po stronie serwera - Logi do debugowania - Logi do debugowania są włączone - Logi do debugowania są wyłączone - - + Skutki uboczne fałszowania + • Eksperymentalny klient i może przestać działać w każdej chwili + • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach + • Brakuje menu ścieżek audio + • Žádný video kodek AV1 + • Stabilna głośność nie jest dostępna + • Filmy dla dzieci mogą nie być odtwarzane po wylogowaniu lub w trybie incognito + + • Wymuś oryginalny dźwięk jest niedostępny + Pokaż w statystykach dla nerdów + Typ klienta jest wyświetlany w Statystykach dla nerdów + Klient jest ukryty w statystykach dla nerdów + + + + + YT Music ReVanced + Music ReVanced + Music + + + + O programie + Reklamy + Ogólne + Odtwarzacz + Różne + + + Ukryj reklamy wideo + Reklamy wideo są ukryte + Reklamy wideo są widoczne + + + Włącz stałe powtarzanie + Stałe powtarzanie jest włączone + Stałe powtarzanie jest wyłączone + + + Ukryj przycisk Cast + Przycisk Cast jest ukryty + Przycisk Cast jest widoczny + Ukryj przycisk historii + Przycisk historii jest ukryty + Przycisk historii jest widoczny + Ukryj przycisk powiadomień + Przycisk powiadomień jest ukryty + Przycisk powiadomień jest widoczny + Ukryj przycisk wyszukiwania + Przycisk wyszukiwania jest ukryty + Przycisk wyszukiwania jest widoczny + + + Ukryj pasek kategorii + Pasek kategorii jest ukryty + Pasek kategorii jest widoczny + + + Zmień kolor miniplayera + Kolor miniplayera dopasowany do odtwarzacza pełnoekranowego + Miniplayer używa domyślnego koloru + + + Pasek nawigacji + Ukryj lub zmień przyciski paska nawigacji + + Ukryj Główną + Przycisk Główna jest ukryty + Przycisk Główna jest pokazany + + Ukryj Fragmenty + Przycisk Wycinki jest ukryty + Przycisk Wycinki jest pokazany + + Ukryj Odkrywaj + Przycisk Przeglądaj jest ukryty + Przycisk Przeglądaj jest pokazany + + Ukryj Bibliotekę + Przycisk Biblioteka jest ukryty + Przycisk Biblioteka jest pokazany + + Ukryj Ulepsz + Przycisk Ulepsz jest ukryty + Przycisk Ulepsz jest pokazany + Ukryj pasek nawigacji + Pasek nawigacji jest ukryty + Pasek nawigacji jest pokazany + Ukryj etykiety przycisków nawigacji + Etykiety są ukryte + Etykiety są pokazane + + + Ukryj etykietę „Uzyskaj Music Premium” + Etykieta jest ukryta + Etykieta jest widoczna + + + Ukryj przycisk uaktualnienia + Przycisk jest ukryty + Przycisk jest widoczny + + + + + Reklamy dźwiękowe + Reklamy dźwiękowe są zablokowane + Reklamy dźwiękowe są odblokowane + + + %s niedostępne, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. + %s zwrócił błąd, mogą wyświetlać się reklamy. Spróbuj zmienić usługę blokowania reklam w ustawieniach. + Osadzone reklamy w filmie + Nieaktywne + Proxy Luminous + Proxy PurpleAdBlock + + + Reklamy w filmie + Reklamy w filmie są zablokowane + Reklamy w filmie są odblokowane + + + Wiadomość usunięta + Usunięte wiadomości + Nie pokazuj usuniętych wiadomości + Ukryj usunięte wiadomości za spoilerem + Pokaż usunięte wiadomości jako przekreślony tekst + + + Automatyczne przyznawanie punktów kanału + Punkty kanału są przyznawane automatycznie + Punkty kanału nie są przyznawane automatycznie + + + + Tryb debugowania + Tryb debugowania jest włączony (niezalecane) + Tryb debugowania jest wyłączony + + + Ustawienia ReVanced + O nas + O ReVanced + Blokowanie reklam + Ustawienia blokowania reklam + Czat + Ustawienia czatu + Różne + Różne ustawienia + Ustawienia ogólne + Inne ustawienia + Reklamy po stronie klienta + Reklamy po stronie serwera + Logi do debugowania + Logi do debugowania są włączone + Logi do debugowania są wyłączone + + diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index 99f9dad979..4b2b1bb5d0 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -24,6 +24,7 @@ Second \"item\" text" Personalizado Ícone do aplicativo + ReVanced mínimo ReVanced escalado @@ -79,6 +80,9 @@ Second \"item\" text" Mostrar histórico de pesquisa das configurações O histórico de pesquisa das configurações é mostrado O histórico de pesquisa de configurações não é exibido + Desativar ícones em negrito + Ícones não estão em negrito + Ícones estão em negrito Mostrar ícones de configuração do ReVanced Ícones de configuração são mostrados Os ícones de configuração não são mostrados @@ -98,23 +102,31 @@ Para traduzir novos idiomas ou melhorar as traduções existentes, visite transl and changes made here must also be made there. --> - Configurações do GmsCore - Configurações do GmsCore + GmsCore + Configurações do GmsCore + Verificar atualizações do GmsCore + A verificação de atualizações está ativada + A verificação de atualizações está desativada + Abrir Configurações do GmsCore + Configurações do GmsCore - O MicroG GmsCore não está instalado. Instale-o. - Ação necessária - "MicroG GmsCore não tem permissão para rodar em segundo plano. + O MicroG GmsCore não está instalado. Instale-o. + Ação necessária + Falha ao verificar atualizações do MicroG GmsCore + Uma nova versão (%1$s) do MicroG GmsCore está disponível. Atualmente, você está usando a versão %2$s. + "MicroG GmsCore não tem permissão para rodar em segundo plano. -Siga o guia \"Não mate meu app\" para seu celular e aplique as instruções para sua instalação do MicroG. +Siga o guia \"Não mate meu app\" para seu celular e aplique as instruções para sua instalação do MicroG. -Isso é necessário para o aplicativo funcionar. " - Abrir site - "As otimizações de bateria do MicroG GmsCore devem ser desabilitadas para evitar problemas. +Isso é necessário para o aplicativo funcionar." + Abrir site + Cancelar + "As otimizações de bateria do MicroG GmsCore devem ser desabilitadas para evitar problemas. Desabilitar as otimizações de bateria para o MicroG não afetará negativamente o uso da bateria. -Toque no botão continuar e permita as mudanças de otimização. " - Continuar +Toque no botão continuar e permita as mudanças de otimização." + Continuar Simular fluxos de vídeo @@ -168,10 +180,11 @@ Você não será notificado sobre nenhum evento inesperado." Flags salvas Flags redefinidas Flags copiadas para a área de transferência - Registro de buffer de protocolo - Registro de depuração incluem buffer de protocolo - Registro de depuração não incluem buffer de protocolo - "Ativar esta configuração registrará dados de layout adicionais, incluindo texto na tela para alguns componentes da IU. + Reiniciar o aplicativo para usar este recurso + Registro de buffer de protocolo + Registro de depuração incluem buffer de protocolo + Registro de depuração não incluem buffer de protocolo + "Ativar esta configuração registrará dados de layout adicionais, incluindo texto na tela para alguns componentes da IU. Isso pode ajudar a identificar componentes ao criar filtros personalizados. @@ -218,6 +231,9 @@ No entanto, ativar isso também registrará alguns dados do usuário, como seu e Reprodução de fundo dos Shorts está ativada + Ocultar prateleira da loja do criador + A prateleira da loja do criador sob o player de vídeo está oculta + Prateleira da loja do criador sob o reprodutor de vídeo é exibida Ocultar cartões de álbum Cartões de álbum estão ocultos Cartões de álbum não estão ocultos @@ -227,6 +243,9 @@ No entanto, ativar isso também registrará alguns dados do usuário, como seu e Ocultar prateleira de cartões Prateleira de cartões estão ocultas A prateleira de cartões são mostradas + Ocultar seção de comentários abaixo dos vídeos no feed inicial + A seção de comentários abaixo dos vídeos no feed inicial está oculta + A seção de comentários abaixo dos vídeos no feed inicial é exibida Ocultar publicações da comunidade Publicações da comunidade está oculto Publicações da comunidade não está oculto @@ -254,14 +273,19 @@ No entanto, ativar isso também registrará alguns dados do usuário, como seu e Ocultar últimas publicações Últimas publicações estão ocultas Últimas publicações não estão ocultas + + Ocultar botão \"Vídeos mais recentes\" + O botão Vídeos mais recentes está oculto + O botão Vídeos mais recentes é exibido Ocultar playlists de mix Playlists de mix estão ocultas As playlists de mix são mostradas Ocultar seção de filmes Seção de filmes está oculto A seção de filmes é mostrada - + Ocultar botão \'Notificar-me\' O botão Notificar-me está oculto O botão Notificar-me é exibido @@ -286,13 +310,16 @@ No entanto, ativar isso também registrará alguns dados do usuário, como seu e Ocultar espaçador visual Espaçador visual está oculto Espaçador visual está visível + Ocultar resultados de busca web + Resultados de busca web estão ocultos + Os resultados de busca web são mostrados + Ocultar seção \"Você pode gostar\" + A seção \"Você pode gostar\" está oculta + A seção \"Você pode gostar\" é exibida Ocultar Doodles do YouTube A animação de Doodles do YouTube no logotipo está oculta A animação dos Doodles do YouTube no logotipo é exibida - "Os Doodles do YouTube são exibidos alguns dias por ano. - -Se um Doodle estiver sendo exibido atualmente em sua região e esta configuração de ocultação estiver ativada, a barra de filtros abaixo da barra de pesquisa também será ocultada." Ocultar barra de canais Barra de canal está oculta A barra de canal é mostrada @@ -309,10 +336,15 @@ Se um Doodle estiver sendo exibido atualmente em sua região e esta configuraç Painel de informações está oculto O painel de informações é mostrado + This button usually appears in the video player for certain videos. --> Ocultar botão \"Participar\" O botão \'Seja membro\' está oculto O botão \'Seja membro\' é exibido + + Ocultar botão \"Repetição do chat ao vivo\" + O botão \"Repetição do chat ao vivo\" na sobreposição do player está oculto + O botão \"Repetição do chat ao vivo\" na sobreposição do player é exibido Ocultar painel médico Painel médico está oculto Os painéis médicos são mostrados @@ -328,6 +360,9 @@ Se um Doodle estiver sendo exibido atualmente em sua região e esta configuraç Ocultar reações cronometradas Reações cronometradas estão ocultas Reações cronometradas não estão ocultas + Ocultar título do vídeo + O título do vídeo na sobreposição do player está oculto + O título do vídeo na sobreposição do player é exibido Ocultar \"Resumo de vídeo gerado por IA\" A seção de resumo de vídeo gerada por IA está oculta A seção de resumo de vídeo gerado por IA é exibida @@ -340,33 +375,62 @@ Se um Doodle estiver sendo exibido atualmente em sua região e esta configuraç Ocultar capítulos Seção de capítulos está oculta Seção de capítulos é mostrada - Ocultar \"Como este conteúdo foi feito\" - A seção Como este conteúdo foi feito está oculta - A seção Como este conteúdo foi feito é mostrada - Ocultar pontos de Hype - Pontos de Hype estão ocultos - Pontos de Hype estão visíveis + Ocultar \"Progresso do curso\" + A seção de progresso do curso está oculta + A seção de progresso do curso é exibida + Ocultar Explorar + As seções \"Explore este curso\" e \"Explore o podcast\" estão ocultas + As seções \"Explore este curso\" e \"Explore o podcast\" são exibidas + Ocultar \"Explore este curso\" + A seção \"Explore este curso\" está oculta + A seção \"Explore este curso\" é exibida + Ocultar \"Explore o podcast\" + A seção Explore o podcast está oculta + A seção Explore o podcast é mostrada Ocultar \"Explore o podcast\" A seção Explore o podcast está oculta A seção Explore o podcast é mostrada Ocultar links em destaque A seção de links em destaque está oculta A seção de links em destaque está visível + Ocultar \"Lugares em destaque\" + A seção Lugares em destaque está oculta + A seção Lugares em destaque é exibida Ocultar vídeos em destaque A seção de vídeos em destaque está oculta A seção de vídeos em destaque está visível + Ativar filtro de menu flutuante do feed + O filtro de menu flutuante do feed está ativado + O filtro de menu flutuante do feed está desativado + Filtro de menu flutuante do feed + Digite os nomes dos menus flutuantes para filtrar, um por linha + Ocultar Jogos + A seção Jogos está oculta + A seção Jogos é exibida + Ocultar \"Como este conteúdo foi feito\" + A seção Como este conteúdo foi feito está oculta + A seção Como este conteúdo foi feito é mostrada + Ocultar pontos de Hype + Pontos de Hype estão ocultos + Pontos de Hype estão visíveis Ocultar cartões de informações Seção de cartões de informações está oculto A seção de cartões de informações é mostrada Ocultar \"Conceitos-chave\" A seção Conceitos-chave está oculta A seção Conceitos-chave é mostrada + Ocultar Música + A seção Música está oculta + A seção Música é exibida Ocultar botão de Inscrição O botão de Inscrição está oculto O botão de Inscrição está visível Ocultar transcrição Seção de transcrição está oculta A seção de transcrição é mostrada + Ocultar Quizzes + A seção Quizzes está oculta + A seção Quizzes é exibida Descrição do vídeo Ocultar ou mostrar componentes de descrição do vídeo Barra de filtro @@ -385,6 +449,11 @@ Se um Doodle estiver sendo exibido atualmente em sua região e esta configuraç Exibido no histórico de exibição Página do canal Ocultar ou exibir componentes da página do canal + Ativar filtro de aba do canal + O filtro de aba do canal está ativado + O filtro de aba do canal está desativado + Filtro de aba do canal + Digite os nomes das abas do canal para filtrar, um por linha Ocultar botão Comunidade Botão de Comunidade está oculto @@ -448,15 +517,15 @@ Se um Doodle estiver sendo exibido atualmente em sua região e esta configuraç A contagem de visualizações é mostrada no feed e nos resultados da pesquisa "Limitações: -• As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar as contagens de visualizações -• Este recurso não funciona com o fator de forma automotivo" +• As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar as contagens de visualizações. +• Este recurso não funciona com o fator de forma automotivo." Ocultar tempo de upload O tempo de upload está oculto no feed e nos resultados da pesquisa O tempo de upload é mostrado no feed e nos resultados da pesquisa "Limitações: -• As prateleiras de Shorts, páginas de canais e resultados da pesquisa ainda podem mostrar os tempos de upload -• Este recurso não funciona com o fator de forma automotivo" +• As prateleiras de Shorts, páginas de canais e resultados da pesquisa ainda podem mostrar os tempos de upload. +• Este recurso não funciona com o fator de forma automotivo." Ocultar conteúdo usando palavra-chave Ocultar pesquisa e vídeos na tela inicial usando palavras-chave como filtros Ocultar vídeos na tela inicial com palavras-chave @@ -477,11 +546,11 @@ As palavras-chave podem ser nomes de canais ou qualquer texto mostrado nos títu As palavras com letras maiúsculas no meio devem ser inseridas com a caixa (por exemplo: iPhone, TikTok, LeBlanc)" Sobre a filtragem com palavra-chave - "Os resultados da página inicial/assinatura/pesquisa são filtrados para ocultar o conteúdo que corresponde às frases de palavras-chave + "Os resultados da página inicial/assinatura/pesquisa são filtrados para ocultar o conteúdo que corresponde às frases de palavras-chave -Linitações -• Shorts não podem ser ocultados pelo nome do canal -• Alguns componentes da IU podem não ser ocultados +Limitações: +• Shorts não podem ser ocultados pelo nome do canal +• Alguns componentes da IU podem não ser ocultados • A pesquisa por uma palavra-chave pode não mostrar resultados" Corresponder palavras inteiras @@ -494,19 +563,12 @@ Linitações A palavra-chave irá ocultar todos os vídeos: %s - Ocultar prateleira da loja do criador - A prateleira da loja do criador sob o player de vídeo está oculta - Prateleira da loja do criador sob o reprodutor de vídeo é exibida Ocultar banners da loja na tela final O banner da loja na tela final está oculto O banner da loja na tela final é exibido Ocultar anúncios em tela cheia - "Os anúncios em tela cheia estão ocultos - -Este recurso está disponível apenas para dispositivos mais antigos" + Anúncios em tela cheia estão ocultos Anúncios em tela cheia não estão ocultos - - Ocultar anúncios em tela cheia só funciona com dispositivos antigos Ocultar anúncios gerais Anúncios gerais estão ocultos Os anúncios gerais são mostrados @@ -516,6 +578,9 @@ Este recurso está disponível apenas para dispositivos mais antigos" Ocultar o rótulo de promoção paga O rótulo de promoção paga está oculto O rótulo de promoção paga é mostrada + Ocultar anúncios pop-up do player + Os anúncios pop-up do player estão ocultos + Os anúncios pop-up do player são exibidos Ocultar cartões auto-patrocinados Cartões autopatrocinados estão ocultos Cartões autopatrocinados não estão ocultos @@ -523,26 +588,21 @@ Este recurso está disponível apenas para dispositivos mais antigos" Links de compras na descrição do vídeo estão ocultos Links de compras na descrição do vídeo são exibidos Ocultar banner \"Ver produtos\" - O banner Ver produtos na sobreposição do vídeo está oculto - O banner Ver produtos na sobreposição do vídeo é exibido - Ocultar resultados de busca web - Resultados de busca web estão ocultos - Os resultados de busca web são mostrados - - - Ocultar promoções do YouTube Premium - Promoções do YouTube Premium sob o reprodutor de vídeo estão ocultas - Promoções do YouTube Premium sob o reprodutor de vídeo não estão ocultas + O banner Ver produtos na sobreposição do player está oculto + O banner Ver produtos na sobreposição do player é exibido + Ocultar promoções do YouTube Premium + Promoções do YouTube Premium estão ocultas + Promoções do YouTube Premium são exibidas Ocultar anúncios do vídeo Anúncios do vídeo estão ocultos Anúncios do vídeo não estão ocultos - + URL copiada para a área de transferência URL com tempo copiado - Mostrar botão copiar URL no vídeo + Mostrar botão copiar URL do vídeo Botão de copiar URL do vídeo está visível. Toque para copiar URL do vídeo. Toque e segure para copiar com carimbo de data/hora Botão de copiar URL do vídeo não está visível Mostrar botão copiar URL com tempo @@ -555,10 +615,10 @@ Este recurso está disponível apenas para dispositivos mais antigos" O diálogo vai ser mostrado Isto não ignora a restrição de idade, apenas a aceita automaticamente. - - Desativar pop-up \"Fazer login na TV\" - O pop-up de fazer login na TV está desativado - O pop-up de fazer login na TV está ativado + + Desativar pop-up \"Fazer login na TV\" + O pop-up de fazer login na TV está desativado + O pop-up de fazer login na TV está ativado Desativar pulo de capítulo com toque duplo @@ -591,10 +651,10 @@ Verifique se o nome do pacote está correto e se o aplicativo está instalado"Gesto desativado O gesto está ativado - - Ativar \"Toque para buscar\" - Toque para buscar está ativado - Toque para buscar está desativado + + Ativar \"Toque para buscar\" + Toque para buscar está ativado + Toque para buscar está desativado Ativar gesto de brilho @@ -675,7 +735,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" Botão de comentários está oculto Botão de comentários está visível + This button usually appears on live streamed videos. --> Ocultar Denúncia Botão de denúncia está oculto O botão de denúncia é mostrado @@ -688,7 +748,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" Botão download está oculto O botão download é mostrado + This button usually appears on videos uploaded by the logged-in user. --> Ocultar Hype Botão Hype está oculto O botão Hype é exibido @@ -701,7 +761,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" Botão valeu está oculto O botão valeu é mostrado + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ocultar \"Perguntar\" Botão \"Perguntar\" oculto O botão \"Perguntar\" é mostrado @@ -709,6 +769,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" Ocultar Clipe Botão clipe está oculto O botão clipe é mostrado + A ocultação pode não funcionar para algumas contas de usuário. Ocultar Loja O botão Loja está oculto @@ -718,17 +779,17 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão Salvar está oculto O botão Salvar é exibido - + Botões de navegação - Ocultar ou alterar botões na barra de navegação + Ocultar ou alterar botões da barra de navegação Ocultar Início - Botão de início está oculto - O botão de início é mostrado + Botão Início oculto + Botão Início visível Ocultar Shorts O botão Shorts está oculto - O botão Shorts é mostrado + O botão Shorts é mostrado Ocultar Criar Botão criar está oculto @@ -742,26 +803,44 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão de notificações está visível Mudar botão Criar por Notificações - "O botão Criar é trocado com o botão Notificações - -Nota: Habilitar isso também oculta os anúncios em vídeo" + O botão Criar é alternado com o botão Notificações Botão criar não está alternado com o botão notificações - "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. - -Se alterar esta configuração não fizer efeito, tente mudar para o modo anônimo." + Se a alteração desta configuração não surtir efeito, tente alternar para o modo de navegação anônima. Ocultar rótulos dos botões de navegação - Rótulos são ocultos - Rótulos são mostrados + Rótulos ocultos + Rótulos visíveis + Ativar botões de navegação estreitos + O espaçamento entre os botões de navegação é estreito + O espaçamento entre os botões de navegação é normal + Ativar animações da barra de navegação + As transições de navegação são animadas + As transições de navegação não são animadas Desabilitar barra de status translúcida A barra de status é opaca A barra de status é opaca ou translúcida - Em alguns dispositivos, ativar este recurso pode alterar a barra de navegação do sistema para transparente. + "Limitações: +• Uma barra preta pode aparecer no topo do player de vídeo. +• Em alguns dispositivos, ativar este recurso pode alterar a barra de navegação do sistema para transparente." Desabilitar barra de navegação translúcida clara A barra de navegação no modo claro é opaca A barra de navegação do modo claro é opaca ou translúcida Desabilitar barra translúcida escura A barra de navegação no modo escuro é opaca A barra de navegação do modo escuro é opaca ou translúcida + Barra de ferramentas + Ocultar ou alterar componentes da barra de ferramentas + Ocultar botão Criar + Botão criar está oculto + O botão criar é mostrado + Ocultar botão Notificações + O botão de notificações está oculto + O botão de notificações está visível + Ocultar botão Pesquisar + Botão de pesquisa está oculto + Botão de pesquisa está visível. + Ativar barra de busca ampla + Barra de busca ampla está ativada + Barra de busca ampla está desativada Menu flutuante @@ -836,6 +915,12 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Ocultar botão Transmitir Botão transmitir está oculto Botão transmitir não está oculto + Ocultar botão Recolher + O botão Recolher está oculto + O botão Recolher é exibido + Ocultar botão Tela cheia + O botão Tela cheia está oculto + O botão Tela cheia é exibido Ocultar plano de fundo dos controles do player O plano de fundo dos controles do reprodutor está oculto O plano de fundo dos controles do player está visível @@ -844,9 +929,9 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Os botões serão exibidos - Ocultar cartões de tela final - Cartões de tela final estão ocultos - Cartões de tela final não estão ocultos + Ocultar cartões de tela final + Cartões de tela final estão ocultos + Cartões de tela final são exibidos Desativar modo Ambiente em tela cheia @@ -871,10 +956,16 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Ocultar barra de busca de miniaturas de vídeo A barra de busca de miniaturas de vídeo está oculta A barra de busca de miniaturas de vídeo é mostrada + Ativar barra de busca grande em tela cheia + A barra de busca em tela cheia tem tamanho grande + A barra de busca em tela cheia tem tamanho normal Reprodutor do Shorts Ocultar ou mostrar componentes do player de Shorts + Ocultar Shorts na página do canal + Oculto na página do canal + Exibido na página do canal Ocultar Shorts na página inicial Oculto na página inicial e vídeos relacionados @@ -886,9 +977,18 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Ocultar Shorts no feed de Inscrições Oculto no feed de Inscrições Exibido no feed de Inscrições + Ocultar Shorts na descrição do vídeo + Oculto na descrição do vídeo + Exibido na descrição do vídeo Ocultar Shorts no histórico de exibição Oculto no histórico de exibições Mostrado no histórico de exibição + Ocultar botão IA + O botão IA está oculto + O botão IA é exibido + Ocultar etiqueta \"Dublado automaticamente\" + Rótulo dublado automaticamente está oculto + Rótulo dublado automaticamente está visível Ocultar etiqueta \"Dublado automaticamente\" Rótulo dublado automaticamente está oculto Rótulo dublado automaticamente está visível @@ -950,6 +1050,7 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Ocultar botão \"Usar este modelo\" Botão Usar este modelo está oculto Botão Usar este modelo é mostrado + Ocultar animação de fonte do botão Curtir Como a animação da fonte do botão está oculta Como a animação da fonte do botão é mostrada @@ -992,7 +1093,12 @@ Para exibir o menu da faixa de áudio, altere 'Falsificar streams de vídeo' par Barra de navegação está oculta Barra de navegação não está oculta - + + Ocultar prévia de reprodução automática + A prévia de reprodução automática está oculta + A prévia de reprodução automática é exibida + + Ocultar o vídeo sugerido na tela final "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada @@ -1011,9 +1117,9 @@ Configurações → Reprodução → Reproduzir próximo vídeo automaticamente" Tempo não está oculto - Ocultar painel popup de reprodutor - Painel pop-up do reprodutor está oculto - Painel pop-up do reprodutor não está oculto + Ocultar painel popup de reprodutor + Painel pop-up do reprodutor está oculto + Painel pop-up do reprodutor não está oculto Sair do modo de tela cheia ao final do vídeo @@ -1081,24 +1187,6 @@ Limitação: \"Não gostei\" podem não aparecer no modo anônimo" %d taxa limite do cliente encontrado %d milisegundos - - Ativar barra de busca ampla - Barra de busca ampla está ativada - Barra de busca ampla está desativada - - - Ativar miniaturas de alta qualidade - As miniaturas na barra de busca são de qualidade alta - As miniaturas na barra de busca são de qualidade média - "Isso também restaurará as miniaturas em transmissões ao vivo que não possuem miniaturas de barra de busca. - -A barra de busca usará a mesma qualidade do vídeo atual. - -Este recurso funciona melhor com uma qualidade de vídeo de 720p ou inferior e ao usar uma conexão de internet muito rápida." - Restaurar as miniaturas antigas da barra de busca - As miniaturas vão aparecer acima da barra de busca - As miniaturas na barra de busca vão aparecer em tela cheia - Ativar SponsorBlock SponsorBlock é um sistema de crowdsourcing para pular partes irritantes de vídeos do YouTube @@ -1242,7 +1330,7 @@ Seu ID de usuário é como uma senha e nunca deve ser compartilhado. " Não é possível enviar o segmento (status: %1$d %2$s) Não é possível enviar o segmento. Taxa limitada (muitos do mesmo usuário ou IP) Não é possível enviar o segmento: %s - "Não é possível enviar o segmento. + "Não é possível enviar o segmento. Já existe" Segmento enviado com sucesso @@ -1336,8 +1424,6 @@ Se posteriormente desativado, é recomendável limpar os dados do aplicativo par Versão de spoofing alvo 20.13.41 - Restaurar barra de ações de vídeo não recolhida 20.05.46 - Restaurar funcionalidade de transcrição - 19.35.36 - Restaurar ícones antigos do player dos Shorts - 19.01.34 - Restaurar ícones de navegação antigos Alterar página inicial @@ -1440,8 +1526,9 @@ O miniplayer pode ser arrastado para fora da tela para a esquerda ou direita"Tela de carregamento terá um fundo em gradiente Tela de carregamento terá um fundo sólido Estilo da tela inicial - Cor - Preto e branco + Desativado + Cor + Preto e branco Ativar cor personalizada da barra de busca Cor personalizada da barra de busca é mostrada Cor original da barra de busca é mostrada @@ -1545,6 +1632,9 @@ Habilitar isso pode desbloquear qualidades de vídeo mais altas" Desativar feedback tátil de desfazer busca O feedback tátil de desfazer busca está desativado O feedback tátil de desfazer busca está ativado + Desativar feedback tátil de toque e segurar + O feedback tátil de toque e segurar está desativado + O feedback tátil de toque e segurar está ativado Desativar zoom tátil O zoom tátil está desativado O zoom tátil está ativado @@ -1640,6 +1730,11 @@ Limitações: O menu de qualidade de vídeo avançado é exibido O menu de qualidade de vídeo avançado não é exibido + + Ocultar opções de qualidade Premium + As opções de qualidade Premium estão ocultas + As opções de qualidade Premium são exibidas + Ativar gesto na barra de busca Gesto na barra de busca está ativado @@ -1671,6 +1766,7 @@ A reprodução de vídeo com AV1 pode gaguejar ou perder quadros." + Sobre Anúncios Geral diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index 5edeb74da0..bf92a72989 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Mostrar histórico de pesquisa de configurações O histórico de pesquisa de configurações é exibido O histórico de pesquisa de configurações não é exibido + Desativar ícones em negrito + Os ícones não estão em negrito + Os ícones estão em negrito Mostrar ícones de configuração do ReVanced Os ícones de configuração são mostrados Os ícones de configuração não são mostrados @@ -101,23 +104,31 @@ Para traduzir novos idiomas ou melhorar as traduções existentes, visite transl and changes made here must also be made there. --> - Configurações do GmsCore - Configurações para GmsCore + GmsCore + Configurações relacionadas a GmsCore + Verificar atualizações do GmsCore + A verificação de atualizações está ativada + A verificação de atualizações está desativada + Abrir Configurações do GmsCore + Configurações do GmsCore - MicroG GmsCore não está instalado. Instala-o. - Ação necessária - "O MicroG GmsCore não tem permissão para ser executado em segundo plano. + MicroG GmsCore não está instalado. Instala-o. + Ação necessária + Falha ao verificar atualizações do MicroG GmsCore + Uma nova versão (%1$s) do MicroG GmsCore está disponível. Atualmente, você está usando a versão %2$s. + "O MicroG GmsCore não tem permissão para ser executado em segundo plano. Siga o guia “Não feche a minha aplicação” do seu telemóvel e aplique as instruções à instalação do MicroG. Isto é necessário para que a aplicação funcione." - Abrir site - "As otimizações de bateria do MicroG GmsCore devem ser desativadas para evitar problemas. + Abrir site + Cancelar + "As otimizações de bateria do MicroG GmsCore devem ser desativadas para evitar problemas. A desativação das otimizações de bateria para o MicroG não afetará negativamente o uso da bateria. Toque no botão continuar e permita as alterações de otimização." - Continuar + Continuar Falsificar fluxos de vídeo @@ -173,10 +184,11 @@ Não será notificado de quaisquer eventos inesperados." Sinalizadores salvos Sinalizadores redefinidos Sinalizadores copiados para a área de transferência - Registo do buffer de protocolo - Registos de depuração incluem buffer de sondagem - Os registos da depuração não incluem buffer de perfil - "Ativar esta definição irá registar dados de layout adicionais, incluindo o texto no ecrã para alguns componentes da IU. + Reiniciar a aplicação para usar esta funcionalidade + Registo do buffer de protocolo + Registos de depuração incluem buffer de sondagem + Os registos da depuração não incluem buffer de perfil + "Ativar esta definição irá registar dados de layout adicionais, incluindo o texto no ecrã para alguns componentes da IU. Isto pode ajudar a identificar componentes ao criar filtros personalizados. @@ -226,6 +238,9 @@ No entanto, ativar isto também irá registar alguns dados do utilizador, como o Reprodução de fundo de Shorts está ativa + Ocultar prateleira da loja do criador + A prateleira da loja do criador sob o reprodutor de vídeo está oculta + Prateleira da loja do criador sob o leitor de vídeo é exibida Esconder cartões de álbuns Cartões de álbuns estão escondidos Cartões de álbum são visíveis @@ -235,6 +250,9 @@ No entanto, ativar isto também irá registar alguns dados do utilizador, como o Esconder categoria de chips Categoria de chips está escondida Categoria de chips está visível + Ocultar seção de comentários sob vídeos no feed inicial + A seção de comentários sob vídeos no feed inicial está oculta + A seção de comentários sob vídeos no feed inicial é exibida Esconder publicações da comunidade As postagens da comunidade estão escondidas Os posts da comunidade são visíveis @@ -262,14 +280,19 @@ No entanto, ativar isto também irá registar alguns dados do utilizador, como o Esconder as últimas publicações Últimas publicações estão escondidas Últimas publicações são visíveis + + Ocultar botão \"Vídeos mais recentes\" + O botão Vídeos mais recentes está oculto + O botão Vídeos mais recentes é exibido Esconder mistura de playlists Playlists mistas estão escondidas Playlists misturadas são visíveis Esconder secção de filmes Secção de filmes está escondida Secção de filmes está visível - + Ocultar botão \'Notificar-me\' O botão Notificar-me está oculto O botão Notificar-me está visível @@ -294,13 +317,16 @@ No entanto, ativar isto também irá registar alguns dados do utilizador, como o Ocultar espaçador visual Espaçador visual está oculto Espaçador visual é exibido + Esconder resultados da pesquisa web + Resultados de pesquisa web estão escondidos + Resultados de pesquisa web são visíveis + Ocultar seção \"Você pode gostar\" + A seção \"Você pode gostar\" está oculta + A seção \"Você pode gostar\" é exibida Ocultar Doodles do YouTube A animação dos Doodles do YouTube no logótipo está oculta Animação dos Doodles do YouTube no logótipo é exibida - "Os Doodles do YouTube são apresentados alguns dias por ano. - -Se um Doodle estiver a ser exibido na sua região e esta definição de ocultação estiver activada, a barra de filtros por baixo da barra de pesquisa também será ocultada." Esconder barra do canal A barra do canal está escondida Barra de canal exibida @@ -317,10 +343,15 @@ Se um Doodle estiver a ser exibido na sua região e esta definição de ocultaç Painéis de informação estão escondidos Painéis de informação são visíveis + This button usually appears in the video player for certain videos. --> Ocultar botão \"Participar\" O botão Entrar está oculto O botão Entrar está exibido + + Ocultar botão \"Repetição de chat ao vivo\" + O botão de repetição de chat ao vivo na sobreposição do player está oculto + O botão de repetição de chat ao vivo na sobreposição do player é exibido Esconder painéis médicos Painéis médicos estão escondidos Painéis médicos são visíveis @@ -336,6 +367,9 @@ Se um Doodle estiver a ser exibido na sua região e esta definição de ocultaç Esconder reações cronometradas Reações temporizadas estão escondidas Reações temporizadas são visíveis + Ocultar título do vídeo + O título do vídeo na sobreposição do player está oculto + O título do vídeo na sobreposição do player é exibido Ocultar \"Resumo de vídeo gerado por IA\" Seção de resumo de vídeo gerada por IA está oculta Seção de resumo de vídeo gerado por IA está visível @@ -348,33 +382,62 @@ Se um Doodle estiver a ser exibido na sua região e esta definição de ocultaç Ocultar capítulos Secção de capítulos está oculta Seção de capítulos é mostrada - Ocultar \"Como este conteúdo foi criado\" - A seção Como este conteúdo foi criado está oculta - A seção Como este conteúdo foi criado é mostrada - Ocultar pontos de Hype - Pontos de Hype ocultos - Pontos de Hype mostrados + Ocultar \"Progresso do curso\" + A seção Progresso do curso está oculta + A seção Progresso do curso é exibida + Ocultar Explorar + As seções Explorar este curso e Explorar o podcast estão ocultas + As seções Explorar este curso e Explorar o podcast são exibidas + Ocultar \"Explorar este curso\" + A seção Explorar este curso está oculta + A seção Explorar este curso é exibida + Ocultar \"Explore o podcast\" + A seção Explore o podcast está oculta + A seção Explore o podcast é mostrada Ocultar \"Explore o podcast\" A seção Explore o podcast está oculta A seção Explore o podcast é mostrada Ocultar links em destaque A seção de links em destaque está oculta A seção de links em destaque está exibida + Ocultar \"Locais em destaque\" + A seção Locais em destaque está oculta + A seção Locais em destaque é exibida Ocultar vídeos em destaque A seção de vídeos em destaque está oculta A seção de vídeos em destaque está exibida + Ativar filtro do menu flutuante do feed + O filtro do menu flutuante do feed está ativado + O filtro do menu flutuante do feed está desativado + Filtro do menu flutuante do feed + Insira os nomes dos menus flutuantes para filtrar, um por linha + Ocultar Jogos + A seção Jogos está oculta + A seção Jogos é exibida + Ocultar \"Como este conteúdo foi criado\" + A seção Como este conteúdo foi criado está oculta + A seção Como este conteúdo foi criado é mostrada + Ocultar pontos de Hype + Pontos de Hype ocultos + Pontos de Hype mostrados Ocultar cartões de informação Secção de cartões de informações está escondida Mostrar a secção de cartões de informações Ocultar \'Conceitos-chave\' A seção Conceitos-chave está oculta A seção Conceitos-chave é mostrada + Ocultar Música + A seção Música está oculta + A seção Música é exibida Ocultar botão de inscrição O botão de inscrição está oculto O botão de inscrição está exibido Ocultar transcrição Secção de transcrição escondida Secção de transcrição exibida + Ocultar Questionários + A seção Questionários está oculta + A seção Questionários é exibida Descrição do vídeo Esconder ou mostrar componentes de descrição do vídeo Barra de Filtro @@ -393,6 +456,11 @@ Se um Doodle estiver a ser exibido na sua região e esta definição de ocultaç Visível no histórico de exibição Página do canal Ocultar ou exibir componentes da página do canal + Ativar filtro da aba do canal + O filtro da aba do canal está ativado + O filtro da aba do canal está desativado + Filtro da aba do canal + Insira os nomes das abas do canal para filtrar, um por linha Ocultar botão Comunidade O botão Comunidade está oculto @@ -456,15 +524,15 @@ Se um Doodle estiver a ser exibido na sua região e esta definição de ocultaç A contagem de visualizações é exibida no feed e nos resultados da pesquisa "Limitações: -• As prateleiras de Shorts, páginas de canal e resultados da pesquisa ainda podem mostrar contagens de visualização -• Este recurso não funciona com o fator de forma automotivo" +• As prateleiras de Shorts, páginas de canal e resultados da pesquisa ainda podem mostrar contagens de visualização. +• Este recurso não funciona com o fator de forma automotivo." Ocultar tempo de upload O tempo de upload está oculto no feed e nos resultados da pesquisa O tempo de upload é exibido no feed e nos resultados da pesquisa "Limitações: -• As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar tempos de upload -• Este recurso não funciona com o fator de forma automotivo" +• As prateleiras de Shorts, páginas de canal e resultados de pesquisa ainda podem mostrar tempos de upload. +• Este recurso não funciona com o fator de forma automotivo." Esconder conteúdo da palavra-chave Esconder vídeos de busca e atualização usando filtros de palavra-chave Esconder vídeos de ecrã inicial com palavras-chave @@ -485,9 +553,9 @@ Từ khóa có thể là tên kênh hoặc bất kỳ văn bản nào hiển th Từ có chữ in hoa ở giữa phải được nhập với chữ hoa (ví dụ: iPhone, TikTok, LeBlanc)" Sobre a filtragem por palavra-chave - "Os resultados Home/Assinatura/Pesquisa são filtrados para ocultar conteúdo que corresponda a frases de palavras-chave + "Os resultados Home/Assinaturas/Pesquisa são filtrados para ocultar conteúdo que corresponda a frases de palavras-chave -Limitações +Limitações: • Os Shorts não podem ser ocultados pelo nome do canal • Alguns componentes da interface do usuário podem não estar ocultos • A pesquisa por uma palavra-chave pode não mostrar resultados" @@ -502,19 +570,12 @@ Limitações Palavra-chave irá ocultar todos os vídeos: %s - Ocultar prateleira da loja do criador - A prateleira da loja do criador sob o reprodutor de vídeo está oculta - Prateleira da loja do criador sob o leitor de vídeo é exibida Ocultar banner da loja na tela final O banner da loja de tela final está oculto O banner da loja de tela final está exibido Esconder anúncios em ecrã cheio - "Quảng cáo toàn màn hình bị ẩn - -Tính năng này chỉ khả dụng cho các thiết bị cũ" + Os anúncios em ecrã inteiro estão ocultos Os anúncios são visíveis em ecrã cheia - - Ocultar anúncios de ecrã cheio só em aparelhos antigos Esconder anúncios gerais Anúncios gerais estão escondidos Anúncios gerais são mostrados @@ -524,6 +585,9 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ" Ocultar rótulo de promoção paga O rótulo de promoção pago está oculto Rótulo de promoção pago é mostrado + Ocultar anúncios pop-up do player + Os anúncios pop-up do player estão ocultos + Os anúncios pop-up do player são exibidos Esconder cartões autopatrocinados Cartões auto-patrocinados estão escondidos Cartões auto-patrocinados são visíveis @@ -531,29 +595,24 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ" Links de compra na descrição do vídeo estão ocultos Links de compras na descrição do vídeo são exibidos Ocultar banner \'Ver produtos\' - O banner de visualização de produtos na sobreposição de vídeo está oculto - O banner de visualização de produtos na sobreposição de vídeo está exibido - Esconder resultados da pesquisa web - Resultados de pesquisa web estão escondidos - Resultados de pesquisa web são visíveis - - - Esconder promoções Premium do YouTube - As promoções do YouTube Premium sob o reprodutor de vídeo estão escondidas - Promoções do YouTube Premium sob o reprodutor de vídeo são visíveis + O banner de visualização de produtos na sobreposição do player está oculto + O banner de visualização de produtos na sobreposição do player é exibido + Esconder promoções do YouTube Premium + As promoções do YouTube Premium estão ocultas + As promoções do YouTube Premium são exibidas Esconder anúncios do vídeo Anúncios de vídeo estão escondidos Anúncios de vídeo são visíveis - + URL copiado URL com timestamp copiado Mostrar botão de URL de vídeo copiado O botão \"Copiar URL do vídeo\" está exibido. Toque para copiar o URL do vídeo. Toque e segure para copiar com carimbo de data/hora O botão \"Copiar URL do vídeo\" não está exibido - Mostrar botão de copiar timestamp URL + Mostrar botão de copiar URL com carimbo de data/hora O botão \"Copiar URL com carimbo de data/hora\" está exibido. Toque para copiar o URL do vídeo com carimbo de data/hora. Toque e segure para copiar sem carimbo de data/hora O botão \"Copiar URL com carimbo de data/hora\" não está exibido @@ -563,10 +622,10 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ" A caixa de diálogo será exibida Isto não ignora a restrição de idade, apenas a aceita automaticamente. - - Desativar pop-up \"Fazer login na TV\" - O pop-up Entrar na TV está desativado - O pop-up Entrar na TV está ativado + + Desativar pop-up \"Fazer login na TV\" + O pop-up Entrar na TV está desativado + O pop-up Entrar na TV está ativado Desativar o salto de capítulo com toque duplo @@ -599,10 +658,10 @@ Verifique se o nome do pacote está correto e se o aplicativo está instalado"Gesto está desativado Gesto ativado - - Ativar tocar para procurar - Toque para procurar está ativado - Tocar para procurar está desativado + + Ativar tocar para procurar + Toque para procurar está ativado + Tocar para procurar está desativado Ativar gesto de brilho @@ -683,7 +742,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão de comentários está oculto O botão de comentários está exibido + This button usually appears on live streamed videos. --> Esconder relatório O botão de relatório está escondido Botão de relatório é visível @@ -696,7 +755,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão transferir está escondido O botão transferir está visível + This button usually appears on videos uploaded by the logged-in user. --> Ocultar Hype O botão Hype está oculto O botão Hype está exibido @@ -709,7 +768,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão de agradecimento está escondido O botão Obrigado é visível + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ocultar Perguntar O botão Perguntar está oculto O botão Perguntar está visível @@ -717,6 +776,7 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" Esconder clipe O botão do clipe está escondido Botão de corte é visível + A ocultação pode não funcionar para algumas contas de usuário. Ocultar Loja O botão Loja está oculto @@ -726,50 +786,68 @@ Ajuste o volume deslizando verticalmente no lado direito da tela" O botão Salvar está oculto O botão Salvar está exibido - + Botões de navegação - Esconder ou alterar botões na barra de navegação + Ocultar ou alterar botões da barra de navegação - Esconder Página Inicial - O botão Início está escondido - O botão \"Início\" está visível + Ocultar Início + O botão Início está oculto + O botão Início é exibido Esconder Shorts O botão Shorts está oculto - O botão Shorts está visível + O botão Shorts é exibido Esconder Criar - O botão criar está escondido - Botão criar é visível + O botão Criar está oculto + O botão Criar é exibido - Esconder assinaturas - O botão de assinaturas está escondido - O botão Subscrições está visível - Ocultar notificações - O botão de notificações está oculto - O botão de notificações está visível + Esconder Assinaturas + O botão Assinaturas está oculto + O botão Assinaturas é exibido + Ocultar Notificações + O botão Notificações está oculto + O botão Notificações é exibido - Mudar Criar com Notificações - "Nút Tạo chuyển sang Nút Thông báo - -Lưu ý: Bật tính năng này cũng buộc ẩn quảng cáo video" - O botão criar não está alternado com o botão Notificações - "Desativar esta configuração também desativará o bloqueio de anúncios do Shorts. - -Se alterar esta configuração não fizer efeito, tente alternar para o modo anônimo." + Trocar Criar por Notificações + O botão Criar é trocado pelo botão Notificações + O botão Criar não é trocado pelo botão Notificações + Se alterar esta configuração não tiver efeito, tente mudar para o modo de navegação anónima. Ocultar rótulos dos botões de navegação - Marcadores estão ocultos - Marcadores são mostrados + Os rótulos estão ocultos + Os rótulos são exibidos + Ativar botões de navegação estreitos + O espaçamento entre os botões de navegação é estreito + O espaçamento entre os botões de navegação é normal + Ativar animações da barra de navegação + As transições de navegação são animadas + As transições de navegação não são animadas Desativar a barra de status translúcida A barra de status é opaca A barra de status é opaca ou translúcida - Em alguns dispositivos, habilitar este recurso pode mudar a barra de navegação do sistema para transparente. + "Limitações: +• Uma barra preta pode aparecer no topo do reprodutor de vídeo. +• Em alguns dispositivos, ativar esta funcionalidade pode mudar a barra de navegação do sistema para transparente." Desativar a barra translúcida clara A barra de navegação no modo claro é opaca A barra de navegação em modo claro é opaca ou translúcida Desativar barra translúcida escura A barra de navegação no modo escuro é opaca A barra de navegação em modo escuro é opaca ou translúcida + Barra de ferramentas + Ocultar ou alterar componentes da barra de ferramentas + Ocultar botão Criar + O botão Criar está oculto + O botão Criar é exibido + Ocultar botão Notificações + O botão Notificações está oculto + O botão Notificações é exibido + Ocultar botão Pesquisar + O botão Pesquisar está oculto + O botão Pesquisar é exibido. + Ativar barra de pesquisa ampla + Barra de pesquisa ampla está ativada + Barra de pesquisa ampla está desativada Menu suspenso @@ -844,6 +922,12 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p Ocultar botão Transmitir Botão \"Transmitir\" está escondido Botão \"Transmitir\" é visível + Ocultar botão Recolher + O botão Recolher está oculto + O botão Recolher é exibido + Ocultar botão Ecrã inteiro + O botão Ecrã inteiro está oculto + O botão Ecrã inteiro é exibido Ocultar fundo dos controles do player O fundo dos controles do reprodutor está oculto O fundo dos controles do player é exibido @@ -852,9 +936,9 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p Botões são exibidos - Esconder cartões de ecrã final - Cartões de fim de ecrã estão escondidos - Cartões de fim de ecrã são exibidos + Esconder cartões de ecrã final + Os cartões de fim de ecrã estão ocultos + Os cartões de fim de ecrã são exibidos Desabilitar modo ambiente em tela cheia @@ -879,10 +963,16 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p Ocultar barra de busca de miniaturas de vídeo Barra de busca de miniaturas de vídeo está oculta Barra de busca de miniaturas de vídeo está visível + Ativar barra de busca grande em ecrã inteiro + A barra de busca em ecrã inteiro tem tamanho grande + A barra de busca em ecrã inteiro tem tamanho normal Reprodutor de Shorts Ocultar ou mostrar componentes do player de Shorts + Ocultar Shorts na página do canal + Oculto na página do canal + Exibido na página do canal Ocultar Shorts no feed inicial Oculto no feed inicial e vídeos relacionados @@ -894,9 +984,18 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p Ocultar Shorts no feed de Inscrições Oculto no feed de Inscrições Exibido no feed de Inscrições + Ocultar Shorts na descrição do vídeo + Oculto na descrição do vídeo + Exibido na descrição do vídeo Ocultar Shorts no histórico de visualização Oculto no histórico de visualização Exibido no histórico de visualização + Ocultar botão de IA + O botão de IA está oculto + O botão de IA é exibido + Ocultar rótulo \"Dublado automaticamente\" + O rótulo dublado automaticamente está oculto + O rótulo dublado automaticamente está visível Ocultar rótulo \"Dublado automaticamente\" O rótulo dublado automaticamente está oculto O rótulo dublado automaticamente está visível @@ -958,6 +1057,7 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p Ocultar botão \"Usar este modelo\" O botão Usar este modelo está oculto O botão \"Usar este modelo\" é exibido + Ocultar animação de fonte do botão de Gosto A animação da fonte do botão curtir está oculta Animação de botão fonte é mostrada @@ -1000,12 +1100,17 @@ Para mostrar o menu da faixa de áudio, altere \"Falsificar fluxos de vídeo\" p A barra de navegação está escondida Barra de navegação exibida - - Ocultar o vídeo sugerido na tela final + + Ocultar pré-visualização de reprodução automática + A pré-visualização de reprodução automática está oculta + A pré-visualização de reprodução automática é exibida + + + Ocultar vídeo sugerido na tela final "O vídeo sugerido na tela final fica oculto quando a reprodução automática está desativada A reprodução automática pode ser alterada nas configurações do YouTube: -Configurações → Reprodução → Reproduzir o próximo vídeo automaticamente" +Definições → Reprodução → Reproduzir o próximo vídeo automaticamente" O vídeo sugerido na tela final é exibido @@ -1019,9 +1124,9 @@ Configurações → Reprodução → Reproduzir o próximo vídeo automaticament Timestamp é visível - Esconder painéis popup do player - Painéis pop-up do jogador estão escondidos - Painéis pop-up do jogador são visíveis + Esconder painéis popup do player + Painéis pop-up do jogador estão escondidos + Painéis pop-up do jogador são visíveis Sair do modo de ecrã inteiro no final do vídeo @@ -1091,26 +1196,6 @@ Limitação: As não gostos podem não aparecer no modo anônimo" Limite da taxa de cliente encontrado %d vezes %d milissegundos - - Ativar barra de pesquisa ampla - Barra de pesquisa ampla está ativada - Barra de pesquisa ampla está desativada - - - Habilitar miniaturas de alta qualidade - As miniaturas na barra de busca são de alta qualidade - As miniaturas na barra de busca são de qualidade média - As miniaturas da barra de busca em tela cheia são de alta qualidade - As miniaturas na barra de busca em tela cheia são de qualidade média - "Điều này cũng sẽ khôi phục hình thu nhỏ trên các luồng trực tiếp không có các hình thu nhỏ thanh tìm kiếm. - -Hình thu nhỏ thanh tìm kiếm sẽ sử dụng chất lượng tương tự như video hiện tại. - -Tính năng này hoạt động tốt nhất với chất lg video là 720p trở xuống và khi sử dụng kết nối internet rất nhanh." - Restaurar as miniaturas antigas da barra de pesquisa - As miniaturas da barra de busca aparecerão acima da barra de busca - As miniaturas da Seekbar aparecerão em ecrã cheia - SponsorBlock Habilitar Patrocínio @@ -1256,8 +1341,8 @@ Seu ID de usuário é como uma senha e nunca deve ser compartilhado. Não é possível enviar o segmento (estado: %1$d %2$s) Không thể gửi phân đoạn. Bị giới hạn (quá nhiều từ cùng một người dùng hoặc IP) Não é possível enviar o segmento: %s - "Không thể gửi phân đoạn. -Đã tồn tại" + "Não é possível enviar o segmento. +Já existe" Segmento enviado com sucesso SponsorBlock temporariamente indisponível (API TimeOut) @@ -1352,8 +1437,6 @@ Nếu sau này tắt, bạn nên xóa dữ liệu ứng dụng để tránh lỗ Destaque de versão do app 20.13.41 - Restaurar barra de ação de vídeo não recolhida 20.05.46 - Restaurar funcionalidade de transcrição - 19.35.36 - Restaurar os icones antigos do reprodutor dos Shorts - 19.01.34 - Restaurar ícones antigos de navegação Alterar página inicial @@ -1464,8 +1547,9 @@ Deslize para expandir ou fechar" Carregar ecrã terá um fundo em gradiente Carregar ecrã terá um fundo sólido Estilo da tela inicial - Cor - Preto e branco + Desativado + Cor + Preto e branco Ativar a cor personalizada Cor personalizada da barra de busca é visível Cor original da barra de busca é visível @@ -1581,6 +1665,9 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Desativar haptics de desfazer busca Haptics de desfazer busca está desativado Haptics de desfazer busca está ativado + Desativar resposta tátil ao tocar e segurar + A resposta tátil ao tocar e segurar está desativada + A resposta tátil ao tocar e segurar está ativada Desativar zoom haptics Zoom haptics está desativado Zoom haptics está ativado @@ -1676,6 +1763,11 @@ Limitações: O menu de qualidade de vídeo avançado é mostrado O menu de qualidade de vídeo avançado não é mostrado + + Ocultar opções de qualidade Premium + As opções de qualidade Premium estão ocultas + As opções de qualidade Premium são exibidas + Habilitar o slide para procurar Deslize para procurar está ativado @@ -1711,6 +1803,7 @@ A reprodução de vídeo com AV1 pode apresentar soluços ou perder quadros."Música + Sobre Anúncios Geral diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 029ca32366..6994549e3d 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -78,6 +78,9 @@ Second \"item\" text" Afișează istoricul căutărilor în setări Se afișează istoricul căutărilor în setări Istoricul căutărilor în setări nu este afișat + Dezactivează pictogramele aldine + Pictogramele nu sunt aldine + Pictogramele sunt aldine Afișați pictogramele de setări ReVanced Pictogramele de setări sunt afișate Pictogramele setărilor nu sunt afișate @@ -97,23 +100,31 @@ Pentru a traduce limbi noi sau pentru a îmbunătăți traducerile existente, vi and changes made here must also be made there. --> - Setări GmsCore - Setări pentru GmsCore + GmsCore + Setări legate de GmsCore + Verifică actualizări pentru GmsCore + Verificarea actualizărilor este activată + Verificarea actualizărilor este dezactivată + Deschide Setări GmsCore + Setări pentru GmsCore - MicroG GmsCore nu este instalat. Instalați-l. - Acțiune necesară - "MicroG GmsCore nu are permisiunea de a rula în fundal. + MicroG GmsCore nu este instalat. Instalați-l. + Acțiune necesară + Verificarea actualizărilor MicroG GmsCore a eșuat + O nouă versiune (%1$s) a MicroG GmsCore este disponibilă. În prezent, utilizați versiunea %2$s. + "MicroG GmsCore nu are permisiunea de a rula în fundal. Urmați ghidul \"Don't kill my app\" pentru telefonul dvs. și aplicați instrucțiunile pentru instalarea MicroG. Acest lucru este necesar pentru ca aplicația să funcționeze." - Deschide website - "Optimizările bateriei pentru MicroG GmsCore trebuie dezactivate pentru a preveni problemele. + Deschide website + Anulează + "Optimizările bateriei pentru MicroG GmsCore trebuie dezactivate pentru a preveni problemele. Dezactivare optimizărilor bateriei pentru MicroG nu va afecta negativ utilizarea bateriei. Apăsați butonul continuare și permiteți modificările de optimizare." - Continuă + Continuă Falsifică fluxurile video @@ -167,10 +178,11 @@ Nu veți fi notificat de niciun eveniment neașteptat." Steaguri salvate Steaguri resetate Steaguri copiate în clipboard - Jurnal protocol buffer - Jurnalele de depanare includ bufferul de protocol - Jurnalele de depanare nu includ memoria tampon - "Activarea acestei setări va înregistra date suplimentare despre aspect, inclusiv textul de pe ecran pentru unele componente UI. + Reporniți aplicația pentru a utiliza această funcție + Jurnal protocol buffer + Jurnalele de depanare includ bufferul de protocol + Jurnalele de depanare nu includ memoria tampon + "Activarea acestei setări va înregistra date suplimentare despre aspect, inclusiv textul de pe ecran pentru unele componente UI. Acest lucru poate ajuta la identificarea componentelor atunci când creați filtre personalizate. @@ -215,6 +227,9 @@ Cu toate acestea, activarea acestei opțiuni va înregistra și unele date ale u Redarea Shorts în fundal este activată + Ascunde raftul magazinului creatorului + Raftul magazinului creatorului de sub playerul video este ascuns. + Raftul magazinului creatorului sub playerul video este afișat Ascundeți cardurile de album Cardurile de album sunt ascunse Cardurile de album sunt afișate @@ -224,6 +239,9 @@ Cu toate acestea, activarea acestei opțiuni va înregistra și unele date ale u Ascunde raftul cipurilor Raftul cipurilor este ascuns Se afișează raftul cipurilor + Ascunde secțiunea de comentarii de sub videoclipuri din fluxul Acasă + Secțiunea de comentarii de sub videoclipuri din fluxul Acasă este ascunsă + Secțiunea de comentarii de sub videoclipuri din fluxul Acasă este afișată Ascunde postările comunității Posturile comunitare sunt ascunse Posturile comunitare sunt afișate @@ -251,14 +269,19 @@ Cu toate acestea, activarea acestei opțiuni va înregistra și unele date ale u Ascunde cele mai recente postări Ultimele postări sunt ascunse Ultimele postări sunt afișate + + Ascunde butonul „Cele mai recente videoclipuri” + Butonul „Cele mai recente videoclipuri” este ascuns + Butonul „Cele mai recente videoclipuri” este afișat Ascunde amestecul playlisturilor Listele de redare mixte sunt ascunse Amestecul listelor de redare este afișat Ascunde secțiunea de filme Secțiunea filmelor este ascunsă Se afișează secțiunea Filme - + Ascunde butonul \'Notifică-mă\' Butonul \"Anunță-mă\" este ascuns. Butonul \"Anunță-mă\" este afișat. @@ -283,13 +306,16 @@ Cu toate acestea, activarea acestei opțiuni va înregistra și unele date ale u Ascunde distanțierul vizual Distanțierul vizual este ascuns Distanțierul vizual este afișat + Ascunde rezultatele căutării web + Rezultatele căutării pe web sunt ascunse + Rezultatele căutării web sunt afișate + Ascunde secțiunea „S-ar putea să-ți placă” + Secțiunea „S-ar putea să-ți placă” este ascunsă + Secțiunea „S-ar putea să-ți placă” este afișată Ascunde Doodle-urile YouTube Animația YouTube Doodles de pe logo este ascunsă. Animația Doodles YouTube pe logo este afișată - "YouTube Doodles sunt afișate câteva zile în fiecare an. - -Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare de ascundere este activată, atunci bara de filtre de sub bara de căutare va fi de asemenea ascunsă." Ascunde bara de canal Bara de canal este ascunsă Bara de canal este afișată @@ -306,10 +332,15 @@ Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare d Panouri de informații sunt ascunse Panouri de informații sunt afișate + This button usually appears in the video player for certain videos. --> Ascunde butonul Alătură-te Butonul \"Devino membru\" este ascuns. Butonul \"Devino membru\" este afișat. + + Ascunde butonul „Reluare chat live” + Butonul „Reluare chat live” în suprapunerea playerului este ascuns + Butonul „Reluare chat live” în suprapunerea playerului este afișat Ascunde panourile medicale Panouri medicale sunt ascunse Panourile medicale sunt prezentate @@ -325,6 +356,9 @@ Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare d Ascunde reacţiile cronologie Reacţiile cronologice sunt ascunse Reacţiile cronologice sunt evidenţiate + Ascunde titlul videoclipului + Titlul videoclipului în suprapunerea playerului este ascuns + Titlul videoclipului în suprapunerea playerului este afișat Ascundeți \"Rezumat video generat de AI\" Secțiunea de rezumat video generată de AI este ascunsă Secțiunea de rezumat video generată de AI este afișată @@ -337,33 +371,62 @@ Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare d Ascunde Capitolele Capitolul este ascuns Capitolul este afișat - Ascunde „Cum a fost creat acest conținut” - Secțiunea Cum a fost creat acest conținut este ascunsă - Secțiunea Cum a fost creat acest conținut este afișată - Ascunde Puncte Hype - Punctele Hype sunt ascunse - Punctele Hype sunt afișate + Ascunde „Progresul cursului” + Secțiunea de progres al cursului este ascunsă + Secțiunea de progres al cursului este afișată + Ascundeți Explorare + Secțiunile „Explorează acest curs” și „Explorează podcastul” sunt ascunse + Secțiunile „Explorează acest curs” și „Explorează podcastul” sunt afișate + Ascunde „Explorează acest curs” + Secțiunea „Explorează acest curs” este ascunsă + Secțiunea „Explorează acest curs” este afișată + Ascunde „Explorează podcastul” + Secțiunea Explorează podcastul este ascunsă + Secțiunea Explorează podcastul este afișată Ascunde „Explorează podcastul” Secțiunea Explorează podcastul este ascunsă Secțiunea Explorează podcastul este afișată Ascunde link-urile recomandate Secțiunea de linkuri recomandate este ascunsă Secțiunea de linkuri recomandate este afișată + Ascunde „Locuri recomandate” + Secțiunea „Locuri recomandate” este ascunsă + Secțiunea „Locuri recomandate” este afișată Ascunde videoclipurile recomandate Secțiunea de videoclipuri recomandate este ascunsă Secțiunea de videoclipuri recomandate este afișată + Activează filtrul de meniu pop-up pentru flux + Filtrul de meniu pop-up pentru flux este activat + Filtrul de meniu pop-up pentru flux este dezactivat + Filtru de meniu pop-up pentru flux + Introduceți numele meniurilor pop-up pentru a filtra, câte unul pe rând + Ascunde Jocuri + Secțiunea Jocuri este ascunsă + Secțiunea Jocuri este afișată + Ascunde „Cum a fost creat acest conținut” + Secțiunea Cum a fost creat acest conținut este ascunsă + Secțiunea Cum a fost creat acest conținut este afișată + Ascunde Puncte Hype + Punctele Hype sunt ascunse + Punctele Hype sunt afișate Ascunde cardurile Info Secţiunea carduri de informaţii este ascunsă Secțiunea cartonașelor de informații este afișată Ascunde „Concepte cheie” Secțiunea Concepte cheie este ascunsă Secțiunea Concepte cheie este afișată + Ascunde Muzică + Secțiunea Muzică este ascunsă + Secțiunea Muzică este afișată Ascunde butonul de abonare Butonul de abonare este ascuns Butonul de abonare este afișat Ascunde Transcriere Secțiunea de transcriere este ascunsă Secțiunea de Transcriere este afișată + Ascunde Chestionare + Secțiunea Chestionare este ascunsă + Secțiunea Chestionare este afișată Descriere video Ascunde sau afișează componentele descrierii video Bară de filtrare @@ -382,6 +445,11 @@ Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare d Afișat în istoricul de vizionare Pagina canalului Ascunde sau afișează componentele paginii canalului + Activează filtrul de file ale canalului + Filtrul de file ale canalului este activat + Filtrul de file ale canalului este dezactivat + Filtru de file ale canalului + Introduceți numele filelor canalului pentru a filtra, câte unul pe rând Ascunde butonul Comunitate Butonul Comunitate este ascuns @@ -444,14 +512,12 @@ Dacă un Doodle este afișat în prezent în regiunea dvs. și această setare d Numărul de vizualizări este ascuns în feed și în rezultatele căutării Numărul de vizualizări este afișat în feed și în rezultatele căutării - "Limitări:\n• Secțiunile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare numărul de vizualizări\n• Această funcție nu funcționează cu factorul de formă auto" + "Limitări:\n• Secțiunile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare numărul de vizualizări.\n• Această funcție nu funcționează cu factorul de formă auto." Ascunde ora de încărcare Ora de încărcare este ascunsă în feed și în rezultatele căutării Ora de încărcare este afișată în feed și în rezultatele căutării - "Limitări: -• rafturile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare orele de încărcare -• Această funcție nu funcționează cu factorul de formă auto" + "Limitări:\n• Rafturile Shorts, paginile canalelor și rezultatele căutării pot afișa în continuare orele de încărcare.\n• Această funcție nu funcționează cu factorul de formă auto." Ascundeți conținutul cuvântului cheie Ascundeți căutarea și hrănirea videoclipurilor folosind filtre de cuvinte cheie Ascunde videoclipurile de acasă după cuvintele cheie @@ -472,12 +538,7 @@ Cuvintele cheie pot fi numele canalului sau orice text afișat în titlurile vid Cuvintele cu litere mari în mijloc trebuie introduse cu majuscule (de exemplu: iPhone, TikTok, LeBlanc)" Despre filtrarea cuvintelor cheie - "Rezultatele căutărilor pe pagina de pornire/Abonamente/Căutare sunt filtrate pentru a ascunde conținutul care se potrivește cu expresiile de cuvinte cheie - -Limitări -• Shorts nu pot fi ascunse după numele canalului -• Este posibil ca anumite componente ale interfeței de utilizare să nu fie ascunse -• Căutarea unui cuvânt cheie poate să nu afișeze rezultate" + "Rezultatele căutărilor pe pagina de pornire/Abonamente/Căutare sunt filtrate pentru a ascunde conținutul care se potrivește cu expresiile de cuvinte cheie\n\nLimitări:\n• Shorts nu pot fi ascunse după numele canalului\n• Este posibil ca anumite componente ale interfeței de utilizare să nu fie ascunse\n• Căutarea unui cuvânt cheie poate să nu afișeze rezultate" Potrivește cuvinte întregi Înconjurarea unui cuvânt cheie/frază cu ghilimele va împiedica potrivirile parțiale ale titlurilor videoclipurilor și numelor de canale<br><br>De exemplu,<br><b>\"ai\"</b> va ascunde videoclipul: <b>Cum funcționează AI?</b><br>dar nu va ascunde: <b>What does fair use mean?</b> @@ -489,19 +550,12 @@ Limitări Cuvântul cheie va ascunde toate videoclipurile: %s - Ascunde raftul magazinului creatorului - Raftul magazinului creatorului de sub playerul video este ascuns. - Raftul magazinului creatorului sub playerul video este afișat Ascunde bannerul magazinului de la finalul ecranului Bannerul magazinului de pe ecranul final este ascuns. Bannerul magazinului de pe ecranul final este afișat. Ascunde reclame pe tot ecranul - "Reclamele pe tot ecranul sunt ascunse - -Această funcție este disponibilă numai pentru dispozitivele mai vechi" + Reclamele pe ecran complet sunt ascunse Reclame pe ecran complet sunt afișate - - Ascunde reclamele pe tot ecranul funcționează doar cu dispozitive mai vechi Ascunde reclamele generale Anunțurile generale sunt ascunse Anunțurile generale sunt afișate @@ -511,6 +565,9 @@ Această funcție este disponibilă numai pentru dispozitivele mai vechi"Ascunde eticheta promoției cu plată Eticheta promoției plătite este ascunsă Eticheta promoției plătite este afișată + Ascunde reclamele pop-up ale playerului + Reclamele pop-up ale playerului sunt ascunse + Reclamele pop-up ale playerului sunt afișate Ascunde cardurile auto-sponsorizate Cardurile sponsorizate automat sunt ascunse Cardurile sponsorizate automat sunt afișate @@ -518,31 +575,26 @@ Această funcție este disponibilă numai pentru dispozitivele mai vechi"Linkurile de cumpărături din descrierea videoclipului sunt ascunse. Linkurile de cumpărături din descrierea video sunt afișate Ascunde bannerul \"Vezi produse\" - Bannerul \"Vezi produse\" din suprapunerea video este ascuns. - Bannerul \"Vezi produse\" din suprapunerea video este afișat. - Ascunde rezultatele căutării web - Rezultatele căutării pe web sunt ascunse - Rezultatele căutării web sunt afișate - - - Ascunde promoțiile YouTube Premium - Promoțiile YouTube Premium sub video player sunt ascunse - Promoțiile YouTube Premium sub video player sunt afișate + Bannerul „Vezi produse” în suprapunerea playerului este ascuns + Bannerul „Vezi produse” în suprapunerea playerului este afișat + Ascunde promoțiile YouTube Premium + Promoțiile YouTube Premium sunt ascunse + Promoțiile YouTube Premium sunt afișate Ascunde reclamele video Anunțurile video sunt ascunse Anunțurile video sunt afișate - + URL copiat în clipboard URL cu marcaj de timp copiat - Afișare buton copie URL - Butonul Copiază adresa URL a videoclipului este afișat. Atingeți pentru a copia adresa URL a videoclipului. Atingeți și mențineți apăsat pentru a copia cu marcajul temporal - Butonul Copiază adresa URL a videoclipului nu este afișat - Afișare buton copie marcaj URL - Butonul Copiază adresa URL cu marcaj temporal este afișat. Atingeți pentru a copia adresa URL a videoclipului cu marcajul temporal. Atingeți și mențineți apăsat pentru a copia fără marcajul temporal - Butonul Copiază adresa URL cu marcaj temporal nu este afișat + Afișează butonul de copiere URL video + Butonul de copiere URL video este afișat. Atingeți pentru a copia URL-ul videoclipului. Atingeți și mențineți apăsat pentru a copia cu marcajul temporal + Butonul de copiere URL video nu este afișat + Afișează butonul de copiere URL cu marcaj temporal + Butonul de copiere URL cu marcaj temporal este afișat. Atingeți pentru a copia URL-ul videoclipului cu marcaj temporal. Atingeți și mențineți apăsat pentru a copia fără marcaj temporal + Butonul de copiere URL cu marcaj temporal nu este afișat Eliminați dialogul discreționar al vizualizatorului @@ -550,10 +602,10 @@ Această funcție este disponibilă numai pentru dispozitivele mai vechi"Va fi afișat catalogul Aceasta nu ocolește restricția de vârstă. O acceptă automat. - - Dezactivează fereastra pop-up „Conectați-vă la televizor” - Pop-up-ul Conectare la televizor este dezactivat - Pop-up-ul Conectare la televizor este activat + + Dezactivează fereastra pop-up „Conectați-vă la televizor” + Pop-up-ul Conectare la televizor este dezactivat + Pop-up-ul Conectare la televizor este activat Dezactivare omisiune capitol prin atingere dublă @@ -586,10 +638,10 @@ Verificați dacă numele pachetului este corect și dacă aplicația este instal Gestul este dezactivat Gestul este activat - - Activează atingerea pentru a căuta - Atingeți pentru a activa căutarea - Atingerea pentru a căuta este dezactivată + + Activează atingerea pentru a căuta + Atingerea pentru a căuta este activată + Atingerea pentru a căuta este dezactivată Activează gestul de luminozitate @@ -670,7 +722,7 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul de comentarii este ascuns Butonul de comentarii este afișat + This button usually appears on live streamed videos. --> Ascunde raportul Butonul de raportare este ascuns Butonul de raportare este afișat @@ -683,7 +735,7 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul de descărcare este ascuns Butonul Descărcare este afișat + This button usually appears on videos uploaded by the logged-in user. --> Ascunde Freamătul Butonul de Hype este ascuns Butonul Hype este afișat @@ -696,7 +748,7 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul de multumire este ascuns Butonul de multumire este afisat + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ascunde \"Întreabă\" Butonul Întreabă este ascuns Butonul Întreabă este afișat @@ -704,6 +756,7 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Ascunde Clip Butonul clip este ascuns Butonul clipului este afișat + Ascunderea s-ar putea să nu funcționeze pentru unele conturi de utilizator. Ascunde Magazinul Butonul Magazin este ascuns @@ -713,11 +766,11 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul Salvare este ascuns Butonul Salvare este afișat - + Butoane de navigare - Ascunde sau modifică butoanele din bara de navigare + Ascundeți sau modificați butoanele barei de navigare - Ascunde Acasa + Ascunde Acasă Butonul Acasă este ascuns Butonul Acasă este afișat @@ -726,7 +779,7 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul Shorts este afișat Ascunde Creare - Butonul de creare este ascuns + Butonul Creare este ascuns Butonul Creare este afișat Ascunde abonamentele @@ -736,27 +789,43 @@ Reglați volumul glisând vertical pe partea dreaptă a ecranului" Butonul Notificări este ascuns Butonul Notificări este afișat - Comutare creare cu notificări - "Butonul Creare este comutat cu butonul Notificări - -Notă: Activarea acestei opțiuni ascunde, de asemenea, forțat reclamele video" + Comută Creare cu Notificări + Butonul Creare este comutat cu butonul Notificări Butonul Creare nu este comutat cu butonul Notificări - "Dezactivarea acestei setări va dezactiva, de asemenea, blocarea anunțurilor pentru Shorts. - -Dacă modificarea acestei setări nu are efect, încercați să comutați la modul Incognito." - Ascunde etichetele butoanelor de navigare + Dacă modificarea acestei setări nu produce efect, încercați să treceți în modul Incognito. + Ascundeți etichetele butoanelor de navigare Etichetele sunt ascunse Etichetele sunt afișate + Activează butoanele de navigare înguste + Spațierea dintre butoanele de navigare este îngustă + Spațierea dintre butoanele de navigare este normală + Activează animațiile barei de navigare + Tranzițiile de navigare sunt animate + Tranzițiile de navigare nu sunt animate Dezactivează bara de stare translucidă - Bara de stare este opaca - Bara de stare este opaca sau translucida - Pe unele dispozitive, activarea acestei funcții poate schimba bara de navigare a sistemului în una transparentă. + Bara de stare este opacă + Bara de stare este opacă sau translucidă + "Limitări:\n• O bară neagră poate apărea în partea de sus a playerului video.\n• Pe unele dispozitive, activarea acestei funcții poate schimba bara de navigare a sistemului în transparentă." Dezactivează bara de navigare translucidă deschisă Bara de navigare în modul deschis este opacă - Bara de navigare în modul deschis este opaca sau translucida - Dezactivați bara translucidă închisă la culoare + Bara de navigare în modul deschis este opacă sau translucidă + Dezactivează bara translucidă întunecată Bara de navigare în modul întunecat este opacă - Bara de navigare în modul întunecat este opaca sau translucida + Bara de navigare în modul întunecat este opacă sau translucidă + Bară de instrumente + Ascunde sau modifică componentele barei de instrumente + Ascunde butonul Creare + Butonul Creare este ascuns + Butonul Creare este afișat + Ascunde butonul Notificări + Butonul Notificări este ascuns + Butonul Notificări este afișat + Ascunde butonul Căutare + Butonul Căutare este ascuns + Butonul Căutare este afișat. + Activează bara de căutare largă + Bara de căutare largă este activată + Bara de căutare largă este dezactivată Meniu flyout @@ -831,6 +900,12 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Ascunde butonul Distribuție Butonul de distribuție este ascuns Butonul de execuție este afișat + Ascunde butonul Restrângere + Butonul Restrângere este ascuns + Butonul Restrângere este afișat + Ascunde butonul Ecran complet + Butonul Ecran complet este ascuns + Butonul Ecran complet este afișat Ascunde fundalul controalelor playerului Fundalul comenzilor playerului este ascuns Fundalul comenzilor playerului este afișat @@ -839,9 +914,9 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Butoanele sunt afișate - Ascunde cardurile ecranului final - Cardurile de pe ecranul de închidere sunt ascunse - Cardurile de închidere ecran sunt afișate + Ascunde cardurile ecranului final + Cardurile ecranului final sunt ascunse + Cardurile ecranului final sunt afișate Dezactivați modul Ambient în ecran complet @@ -866,10 +941,16 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Ascunde bara de derulare a miniaturilor video Bara de derulare a miniaturilor video este ascunsă Bara de derulare a miniaturilor video este afișată + Activează bara de căutare mare pe ecran complet + Bara de căutare pe ecran complet este de dimensiune mare + Bara de căutare pe ecran complet este de dimensiune normală Player Shorts Ascunde sau afișează componentele playerului Shorts + Ascunde Shorts în pagina canalului + Ascuns în pagina canalului + Afișat în pagina canalului Ascunde Shorts-urile din feedul Acasă. Ascunse în feedul Acasă și în videoclipurile similare. @@ -881,9 +962,18 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Ascunde Shorts-urile din feedul Abonamente. Ascunse în feedul Abonamente. Afișate în feedul Abonamente. + Ascunde Shorts în descrierea videoclipului + Ascuns în descrierea videoclipului + Afișat în descrierea videoclipului Ascunde Shorts în istoricul vizionărilor Ascuns în istoricul vizionărilor Afișate în istoricul vizionărilor + Ascunde butonul AI + Butonul AI este ascuns + Butonul AI este afișat + Ascunde eticheta „Dublat automat” + Eticheta cu dublaj automat este ascunsă + Eticheta cu dublaj automat este afișată Ascunde eticheta „Dublat automat” Eticheta cu dublaj automat este ascunsă Eticheta cu dublaj automat este afișată @@ -945,6 +1035,7 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Ascunde butonul „Folosește acest șablon” Butonul Folosește acest șablon este ascuns Butonul Folosește acest șablon este afișat + Ascunde animația fântână a butonului Like Animaţia fântânii butoanelor este ascunsă Animația fântânii butoanelor este afișată @@ -987,12 +1078,14 @@ Pentru a afișa meniul piste audio, schimbați \"Falsificare fluxuri video\" în Bara de navigare este ascunsă Bara de navigare este afișată - + + Ascunde previzualizarea redării automate + Previzualizarea redării automate este ascunsă + Previzualizarea redării automate este afișată + + Ascunde videoclipul sugerat de pe ecranul final - "Videoclipul sugerat de pe ecranul final este ascuns când redarea automată este oprită - -Redarea automată poate fi modificată în setările YouTube: -Setări → Redare → Redare automată videoclipul următor" + "Videoclipul sugerat de pe ecranul final este ascuns când redarea automată este oprită\n\nRedarea automată poate fi modificată în setările YouTube:\nSetări → Redare → Redare automată videoclipul următor" Videoclipul sugerat de pe ecranul final este afișat @@ -1006,9 +1099,9 @@ Setări → Redare → Redare automată videoclipul următor" Ora este afișată - Ascunde panourile pop-up jucător - Panourile pop-up ale jucătorilor sunt ascunse - Panourile pop-up ale jucătorului sunt afișate + Ascunde panourile pop-up jucător + Panourile pop-up ale jucătorilor sunt ascunse + Panourile pop-up ale jucătorului sunt afișate Ieșiți din modul ecran complet la sfârșitul videoclipului @@ -1076,24 +1169,6 @@ Limitare: Este posibil ca aprecierile negative să nu apară în modul incognito Limita ratei clientului a fost întâlnită de %d ori %d milisecunde - - Activează bara de căutare largă - Bara de căutare largă este activată - Bara de căutare largă este dezactivată - - - Permite miniaturi de înaltă calitate - Miniaturile din bara de afișare sunt de înaltă calitate - Miniaturile din bara de afișare sunt de calitate medie - "Acest lucru va restaura, de asemenea, miniaturile de la transmisiunile live care nu au miniaturi pentru bara de căutare. - -Miniaturile barei de căutare vor folosi aceeași calitate ca și videoclipul curent. - -Această caracteristică funcționează cel mai bine cu o calitate video de 720p sau mai mică și atunci când se folosește o conexiune la internet foarte rapidă." - Restaurează miniaturile vechi din bara de căutare - Miniaturile din bara de căutare vor apărea deasupra barei de căutare - Miniaturile din bara de afișare vor apărea pe tot ecranul - Activează SponsorBlock SponsorBlock este un sistem bazat pe crowdsourcing pentru a sări peste părțile enervante din videoclipurile de pe YouTube @@ -1192,7 +1267,7 @@ ID-ul tău de utilizator este ca o parolă și nu ar trebui niciodată partajat. Digresiune / Glume Scene tangențiale sau glume care nu sunt necesare pentru a înțelege conținutul principal al videoclipului. Nu include secțiuni care oferă context sau detalii de fundal Muzică: Secţiunea Non-Muzică - Doar pentru utilizare în videoclipuri. Secțiuni de videoclipuri fără muzică, care nu sunt deja acoperite de o altă categorie + Doar pentru utilizare în videoclipuri muzicale. Secțiuni de videoclipuri muzicale fără muzică, care nu sunt deja acoperite de o altă categorie Omitere Evidențiere Sari peste sponsor @@ -1236,8 +1311,7 @@ ID-ul tău de utilizator este ca o parolă și nu ar trebui niciodată partajat. Imposibil de trimis segmentul (stare: %1$d %2$s) Nu se poate trimite segmentul. Rata limitată (prea multe de la același utilizator sau IP) Nu se poate trimite segmentul: %s - "Nu se poate trimite segmentul. -Există deja" + "Nu se poate trimite segmentul.\nExistă deja" Segment trimis cu succes SponsorBlock temporar indisponibil (API a expirat) @@ -1330,8 +1404,6 @@ Dacă este dezactivat ulterior, se recomandă să ștergeți datele aplicației Țintă versiune falsificată a aplicației 20.13.41 - Restabiliți bara de acțiune video necolapsată 20.05.46 - Restaurare funcționalitate transcriere - 19.35.36 - Restaurează pictogramele vechi ale playerului Shorts - 19.01.34 - Restaurați pictogramele de navigare vechi Schimbă pagina de start @@ -1431,8 +1503,9 @@ Miniplayerul poate fi tras pe ecran spre stânga sau spre dreapta" Încărcarea ecranului va avea un fundal pentru gradient Ecranul de încărcare va avea un fundal solid Stil ecran de pornire - Culoare - Alb-negru + Dezactivat + Culoare + Alb-negru Activează culoarea barei de căutare personalizate Culoarea personalizată a barei de căutare este afișată Culoarea bara de căutare originală este afișată @@ -1537,6 +1610,9 @@ Activarea acestei opțiuni poate debloca calități video mai mari" Dezactivare haptics anulare căutare Haptica de anulare a căutării este dezactivată Haptica de anulare a căutării este activată + Dezactivează haptica de atingere și menținere + Haptica de atingere și menținere este dezactivată + Haptica de atingere și menținere este activată Dezactivare haptics zoom Haptica zoom este dezactivată Haptica zoom este activată @@ -1632,6 +1708,11 @@ Limitări: Se afișează meniul avansat de calitate video Nu se afișează meniul avansat de calitate video + + Ascunde opțiunile de calitate Premium + Opțiunile de calitate Premium sunt ascunse + Opțiunile de calitate Premium sunt afișate + Activează diapozitivul pentru a căuta Slide pentru căutare este activat @@ -1663,6 +1744,7 @@ Redarea video cu AV1 poate sacada sau pierde cadre." + Despre Anunțuri Diverse diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index af71023b8a..4711101a8c 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -18,1271 +18,1356 @@ Second \"item\" text" --> - - - Название приложения - - Кастомное - Иконка приложения - Оригинальная - ReVanced - - ReVanced минимальная - ReVanced масштабированная - - Кастомная - - - Проверки не удались - Открыть официальный веб-сайт - Игнорировать - <h5>Похоже, что это приложение пропатчено не Вами.</h5><br>Оно может работать неправильно, <b>быть вредным или даже опасным.</b>.<br><br>Эти проверки предполагают, что это приложение пропатчено или получено от кого-то другого:<br><br><small>%1$s</small><br>Настоятельно рекомендуется <b>удалить это приложение и пропатчить его самостоятельно,</b> чтобы быть уверенным, что Вы используете проверенное и безопасное приложение.<p><br>Если проигнорировать это предупреждение, оно будет показано только дважды. - Пропатчено на другом устройстве - Установлено не через ReVanced Manager - Пропатчено более 10 минут назад - Пропатчено %s дней назад - Дата сборки APK повреждена - - - Уведомление ReVanced - Ваша история просмотра не сохраняется.<br><br>Вероятнее всего это вызвано DNS блокировщиком рекламы или сетевым прокси.<br><br>Чтобы это исправить, добавьте <b>s.youtube.com</b> в белый список блокировщика рекламы или отключите все блокировщики DNS и прокси. - Не показывать снова - - - Настройки - ReVanced - Вы уверены, что хотите продолжить? - Сохранить - Сбросить - Сбросить цвет - Неверный цвет - Требуется перезапуск - Перезапустите приложение, чтобы изменения вступили в силу. - Перезапустить - Импортировать - Копировать - Настройки ReVanced восстановлены до значений по умолчанию - Импортировано %d настроек - Ошибка импорта: %s - Поиск настроек - По запросу \"%s\" ничего не найдено - Попробуйте другое ключевое слово - Недавние поиски - Удалить из истории поиска? - Очистить историю поиска - Вы уверены, что хотите очистить всю историю поиска? - Советы по поиску - "• Нажмите на путь, чтобы перейти к нему + + + Название приложения + + Кастомное + Иконка приложения + Оригинальная + ReVanced + + ReVanced минимальная + ReVanced масштабированная + + Кастомная + + + Проверки не удались + Открыть официальный веб-сайт + Игнорировать + <h5>Похоже, что это приложение пропатчено не Вами.</h5><br>Оно может работать неправильно, <b>быть вредным или даже опасным.</b>.<br><br>Эти проверки предполагают, что это приложение пропатчено или получено от кого-то другого:<br><br><small>%1$s</small><br>Настоятельно рекомендуется <b>удалить это приложение и пропатчить его самостоятельно,</b> чтобы быть уверенным, что Вы используете проверенное и безопасное приложение.<p><br>Если проигнорировать это предупреждение, оно будет показано только дважды. + Пропатчено на другом устройстве + Установлено не через ReVanced Manager + Пропатчено более 10 минут назад + Пропатчено %s дней назад + Дата сборки APK повреждена + + + Уведомление ReVanced + Ваша история просмотра не сохраняется.<br><br>Вероятнее всего это вызвано DNS блокировщиком рекламы или сетевым прокси.<br><br>Чтобы это исправить, добавьте <b>s.youtube.com</b> в белый список блокировщика рекламы или отключите все блокировщики DNS и прокси. + Не показывать снова + + + Настройки + ReVanced + Вы уверены, что хотите продолжить? + Сохранить + Сбросить + Сбросить цвет + Неверный цвет + Требуется перезапуск + Перезапустите приложение, чтобы изменения вступили в силу. + Перезапустить + Импортировать + Копировать + Настройки ReVanced восстановлены до значений по умолчанию + Импортировано %d настроек + Ошибка импорта: %s + Поиск настроек + По запросу \"%s\" ничего не найдено + Попробуйте другое ключевое слово + Недавние поиски + Удалить из истории поиска? + Очистить историю поиска + Вы уверены, что хотите очистить всю историю поиска? + Советы по поиску + "• Нажмите на путь, чтобы перейти к нему • Длительно нажмите на настройку, чтобы перейти к ней • Нажмите Enter, чтобы сохранить поисковый запрос в историю • Поиск игнорирует регистр и знаки препинания • Родительские настройки отображаются над отключенными дочерними настройками" - История поиска пуста - Для сохранения истории поиска введите поисковый запрос и нажмите Enter - Показать историю поиска настроек - История поиска настроек показана - История поиска настроек скрыта - Показать иконки в настройках ReVanced - Иконки в настройках ReVanced показаны - Иконки в настройках ReVanced скрыты - Язык настроек ReVanced - "Переводы для некоторых языков могут отсутствовать или быть неполными. + История поиска пуста + Для сохранения истории поиска введите поисковый запрос и нажмите Enter + Показать историю поиска настроек + История поиска настроек показана + История поиска настроек скрыта + Отключить жирные значки + Значки не жирные + Значки жирные + Показать иконки в настройках ReVanced + Иконки в настройках ReVanced показаны + Иконки в настройках ReVanced скрыты + Язык настроек ReVanced + "Переводы для некоторых языков могут отсутствовать или быть неполными. Чтобы перевести новые языки или улучшить существующие переводы, посетите translate.revanced.app" - Язык приложения YouTube - Резервное копирование настроек - Создание и восстановление резервной копии настроек ReVanced - - Вы используете ReVanced Patches версии <i>%s</i> - Примечание - Эта версия является предварительной, и Вы можете столкнуться с непредвиденными проблемами - Официальные ссылки - + Вы используете ReVanced Patches версии <i>%s</i> + Примечание + Эта версия является предрелизной, и Вы можете столкнуться с непредвиденными проблемами + Официальные ссылки + - - - GmsCore - Настройки GmsCore - - MicroG GmsCore не установлен. Установите его. - Требуется действие - "MicroG GmsCore не имеет разрешения на работу в фоновом режиме. + + + GmsCore + Настройки, относящиеся к GmsCore + Проверить обновления GmsCore + Проверка обновлений включена + Проверка обновлений отключена + Открыть настройки GmsCore + Настройки GmsCore + + MicroG GmsCore не установлен. Установите его. + Требуется действие + Не удалось проверить обновления MicroG GmsCore + Доступна новая версия (%1$s) MicroG GmsCore. В настоящее время Вы используете версию %2$s. + "MicroG GmsCore не имеет разрешения на работу в фоновом режиме. -Настройте MicroG согласно инструкции \"Don't kill my app\" для Вашего телефона. +Следуйте инструкциям из руководства \"Не убивать мое приложение\" для вашего телефона и примените инструкции к установке MicroG. -Это необходимо для работы приложения." - Открыть веб-сайт - "Для предотвращения проблем необходимо отключить оптимизацию батареи для MicroG GmsCore. +Это нужно для работы программы." + Открыть веб-сайт + Отмена + "Чтобы предотвратить проблемы, оптимизацию батареи MicroG GmsCore необходимо отключить. -Отключение оптимизации батареи для MicroG не повлияет на использование батареи. +Выключение оптимизации батареи для MicroG не повлияет на использование батареи. -Нажмите кнопку \"Продолжить\" и разрешите изменения оптимизации." - Продолжить - - - Подмена видеопотоков - Подмена видеопотоков клиента для предотвращения проблем с воспроизведением видео - Подмена видеопотоков - Подмените видеопоток клиента, чтобы предотвратить проблемы с воспроизведением - Подменить видеопотоки - "Видеопотоки подменены +Нажмите кнопку \"Продолжить\" и разрешите внесение изменений в оптимизацию." + Продолжить + + + Подмена видеопотоков + Подмена видеопотоков клиента для предотвращения проблем с воспроизведением видео + Подмена видеопотоков + Подмените видеопоток клиента, чтобы предотвратить проблемы с воспроизведением + Подменить видеопотоки + "Видеопотоки подменены Если Вы являетесь пользователем YouTube Premium, эта настройка может не потребоваться" - "Видеопотоки не подменены + "Видеопотоки не подменены Воспроизведение может не работать" - Отключение этой настройки может вызвать проблемы с воспроизведением. - Клиент по умолчанию - - - Принудительно оригинальная звуковая дорожка - Используется оригинальная звуковая дорожка - Используется звуковая дорожка по умолчанию - - Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio - - - Отладка - Включить или отключить параметры отладки - Включить журналы отладки - Журналы отладки включены - Журналы отладки отключены - Журнал трассировки стека - В журналы отладки включена трассировка стека - В журналы отладки не включена трассировка стека - Показать всплывающее уведомление при ошибке Revanced - Всплывающее уведомление при возникновении ошибки Revanced показано - Всплывающее уведомление при возникновении ошибки Revanced скрыто - "Отключение всплывающих уведомлений об ошибках скроет все сообщения об ошибках ReVanced. + Отключение этой настройки может вызвать проблемы с воспроизведением. + Клиент по умолчанию + + + Принудительно оригинальная звуковая дорожка + Используется оригинальная звуковая дорожка + Используется звуковая дорожка по умолчанию + + Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio + + + Отладка + Включить или отключить параметры отладки + Включить журналы отладки + Журналы отладки включены + Журналы отладки отключены + Журнал трассировки стека + В журналы отладки включена трассировка стека + В журналы отладки не включена трассировка стека + Показать всплывающее уведомление при ошибке Revanced + Всплывающее уведомление при возникновении ошибки Revanced показано + Всплывающее уведомление при возникновении ошибки Revanced скрыто + "Отключение всплывающих уведомлений об ошибках скроет все сообщения об ошибках ReVanced. Вы не будете уведомлены о каких-либо непредвиденных событиях." - Экспортировать журналы отладки - Копирует журналы отладки ReVanced в буфер обмена - Журналы отладки отключены - Журналы не найдены - Журналы скопированы - Не удалось экспортировать журналы: %s - Очистить журналы отладки - Очищает все сохраненные журналы отладки ReVanced - Журналы очищены - Менеджер экспериментальных флагов - Управлять экспериментальными логическими флагами - Активные флаги (%d) - Заблокированные флаги (%d) - Поиск флагов... - Флаги сохранены - Флаги сброшены - Флаги скопированы в буфер обмена - Журнал буфера протоколов - В журналы отладки включен буфер протоколов - В журналы отладки не включен буфер протоколов - "Включение этой настройки позволит регистрировать дополнительные данные макета, включая текст на экране для некоторых компонентов пользовательского интерфейса. + Экспортировать журналы отладки + Копирует журналы отладки ReVanced в буфер обмена + Журналы отладки отключены + Журналы не найдены + Журналы скопированы + Не удалось экспортировать журналы: %s + Очистить журналы отладки + Очищает все сохраненные журналы отладки ReVanced + Журналы очищены + Менеджер экспериментальных флагов + Управлять экспериментальными логическими флагами + Активные флаги (%d) + Заблокированные флаги (%d) + Поиск флагов... + Флаги сохранены + Флаги сброшены + Флаги скопированы в буфер обмена + Перезапустите приложение, чтобы использовать эту функцию + Журнал буфера протокола + Журналы отладки содержат буфер протокола + Журналы отладки не содержат буфер протокола + "Включение этой настройки позволит регистрировать дополнительные данные макета, включая текст на экране для некоторых компонентов пользовательского интерфейса. Это может помочь определить компоненты при создании пользовательских фильтров. Однако включение этой функции также приведет к регистрации некоторых пользовательских данных, таких как ваш IP-адрес." - - - Очищать ссылки для обмена - Параметр отслеживания запросов удален из ссылок для обмена - Параметр отслеживания запросов не удален из ссылок для обмена - Изменить ссылки для обмена на youtube.com - Общие ссылки используют youtube.com - Общие ссылки используют music.youtube.com - - - Кастомный фильтр - Скрыть компоненты с помощью кастомных фильтров - Включить кастомный фильтр - Кастомный фильтр включен - Кастомный фильтр отключен - Кастомный фильтр - - Список строк конструктора путей компонентов для фильтрации, разделенных новой строкой - Недопустимый кастомный фильтр: %s - - - - - Информация - Реклама - Альтернативные миниатюры - Лента - Общие - Плеер - Shorts - Полоса прогресса - Управление жестами - Вернуть дизлайки YouTube - Прочие - Видео - Включить старое меню настроек - Старое меню настроек включено - Новое меню настроек включено - - - Отключить воспроизведение Shorts в фоновом режиме - Воспроизведение Shorts в фоновом режиме отключено - Воспроизведение Shorts в фоновом режиме включено - - - Скрыть карточки альбомов - Карточки альбомов под описанием артистов скрыты - Карточки альбомов под описанием артистов показаны - Скрыть карточки исполнителей - Карточки исполнителей под плеером скрыты - Карточки исполнителей под плеером показаны - Скрыть секцию тегов похожих видео - Секция тегов похожих видео под плеером скрыта - Секция тегов похожих видео под плеером показана - Скрыть публикации сообщества - Публикации сообщества в ленте скрыты - Публикации сообщества в ленте показаны - Скрыть компактные баннеры - Компактные баннеры в ленте скрыты - Компактные баннеры в ленте показаны - Скрыть расширяемые фрагменты - Расширяемые фрагменты под плеером скрыты - Расширяемые фрагменты под плеером показаны - Скрыть плавающую кнопку микрофона - Плавающая кнопка микрофона в поиске скрыта - Плавающая кнопка микрофона в поиске показана - Скрыть горизонтальные секции - "Данные горизонтальные секции скрыты: + + + Очищать ссылки для обмена + Параметр отслеживания запросов удален из ссылок для обмена + Параметр отслеживания запросов не удален из ссылок для обмена + Изменить ссылки для обмена на youtube.com + Общие ссылки используют youtube.com + Общие ссылки используют music.youtube.com + + + Кастомный фильтр + Скрыть компоненты с помощью кастомных фильтров + Включить кастомный фильтр + Кастомный фильтр включен + Кастомный фильтр отключен + Кастомный фильтр + + Список строк конструктора путей компонентов для фильтрации, разделенных новой строкой + Недопустимый кастомный фильтр: %s + + + + + Информация + Реклама + Альтернативные миниатюры + Лента + Общие + Плеер + Shorts + Полоса прогресса + Управление жестами + Вернуть дизлайки YouTube + Прочие + Видео + Включить старое меню настроек + Старое меню настроек включено + Новое меню настроек включено + + + Отключить воспроизведение Shorts в фоновом режиме + Воспроизведение Shorts в фоновом режиме отключено + Воспроизведение Shorts в фоновом режиме включено + + + Скрыть секцию магазина автора + Секция магазина автора под плеером скрыта + Секция магазина автора под плеером показана + Скрыть карточки альбомов + Карточки альбомов под описанием артистов скрыты + Карточки альбомов под описанием артистов показаны + Скрыть карточки исполнителей + Карточки исполнителей под плеером скрыты + Карточки исполнителей под плеером показаны + Скрыть секцию тегов похожих видео + Секция тегов похожих видео под плеером скрыта + Секция тегов похожих видео под плеером показана + Скрыть раздел комментариев под видео в ленте главной страницы + Раздел комментариев под видео в ленте главной страницы скрыт + Раздел комментариев под видео в ленте главной страницы показан + Скрыть публикации сообщества + Публикации сообщества в ленте скрыты + Публикации сообщества в ленте показаны + Скрыть компактные баннеры + Компактные баннеры в ленте скрыты + Компактные баннеры в ленте показаны + Скрыть расширяемые фрагменты + Расширяемые фрагменты под плеером скрыты + Расширяемые фрагменты под плеером показаны + Скрыть плавающую кнопку микрофона + Плавающая кнопка микрофона в поиске скрыта + Плавающая кнопка микрофона в поиске показана + Скрыть горизонтальные секции + "Данные горизонтальные секции скрыты: • Срочные новости • Продолжить просмотр • Исследовать больше каналов • Самые релевантные • Покупки • Смотреть еще раз" - Горизонтальные секции показаны - Скрыть секцию изображений - Секция изображений в результатах поиска скрыта - Секция изображений в результатах поиска показана - Скрыть последние публикации - Последние публикации в ленте скрыты - Последние публикации в ленте показаны - Скрыть плейлисты \"Джем\" - Плейлисты \"Джем\" в ленте и плеере скрыты - Плейлисты \"Джем\" в ленте и плеере показаны - Скрыть раздел фильмов - Раздел фильмов в поиске скрыт - Раздел фильмов в поиске показан - - Скрыть кнопку \"Прислать уведомление\" - Кнопка \"Прислать уведомление\" в ленте скрыта - Кнопка \"Прислать уведомление\" в ленте показана - Скрыть встроенные игры - Встроенные игры в ленте скрыты - Встроенные игры в ленте показаны - + Скрыть кнопку \"Последние видео\" + Кнопка \"Последние видео\" скрыта + Кнопка \"Последние видео\" показана + Скрыть плейлисты \"Джем\" + Плейлисты \"Джем\" в ленте и плеере скрыты + Плейлисты \"Джем\" в ленте и плеере показаны + Скрыть раздел фильмов + Раздел фильмов в поиске скрыт + Раздел фильмов в поиске показан + + Скрыть кнопку \"Прислать уведомление\" + Кнопка \"Прислать уведомление\" в ленте скрыта + Кнопка \"Прислать уведомление\" в ленте показана + Скрыть встроенные игры + Встроенные игры в ленте скрыты + Встроенные игры в ленте показаны + - Скрыть кнопку \"Показать еще\" - Кнопка \"Показать еще\" в результатах поиска скрыта - Кнопка \"Показать еще\" в результатах поиска показана - Скрыть опросы - Опросы в ленте скрыты - Опросы в ленте показаны - Скрыть секцию билетов - Секция билетов под плеером скрыта - Секция билетов под плеером показана - - Скрыть метки видеорекомендаций - Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска скрыты - Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска показаны - Скрыть визуальный разделитель - Визуальный разделитель скрыт - Визуальный разделитель показан - - Скрыть YouTube Doodles - Анимация YouTube Doodles на логотипе скрыта - Анимация YouTube Doodles на логотипе показана - "YouTube Doodles показываются несколько дней в году. - -Если в Вашем регионе в настоящее время показывается Doodle, и данная опция скрытия активна, то панель фильтров под панелью поиска будет также скрыта." - Скрыть панель канала - Панель канала под плеером скрыта - Панель канала под плеером показана - Скрыть водяной знак канала - Водяной знак канала в плеере скрыт - Водяной знак канала в плеере показан - Скрыть колонку \"Коллективный сбор\" - Колонка \"Коллективный сбор\" между плеером и описанием видео скрыта - Колонка \"Коллективный сбор\" между плеером и описанием видео показана - Скрыть экстренные колонки - Экстренные колонки в результатах поиска и плеере скрыты - Экстренные колонки в результатах поиска и плеере показаны - Скрыть информационные панели - Информационные панели в ленте, результатах поиска и видео скрыты - Информационные панели в ленте, результатах поиска и видео показаны - - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Скрыть медицинские панели - Медицинские панели в ленте, результатах поиска и видео скрыты - Медицинские панели в ленте, результатах поиска и видео показаны - Скрыть быстрые действия - Быстрые действия в полноэкранном режиме скрыты - Быстрые действия в полноэкранном режиме показаны - Скрыть похожие видео - Похожие видео в быстрых действиях скрыты - Похожие видео в быстрых действиях показаны - Скрыть правила сообщества подписчиков - Правила сообщества подписчиков в комментариях скрыты - Правила сообщества подписчиков в комментариях показаны - Скрыть временные реакции - Временные реакции в комментариях и живом чате скрыты - Временные реакции в комментариях и живом чате показаны - Скрыть секцию AI-резюме видео - Сгенерированный ИИ раздел сводки видео скрыт - Сгенерированный ИИ раздел сводки видео показан - Скрыть раздел \"Спросить\" - Раздел \"Спросить\" в описании видео скрыт - Раздел \"Спросить\" в описании видео показан - Скрыть раздел атрибутов - Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" скрыты - Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" показаны - Скрыть раздел \"Эпизоды\" - Раздел \"Эпизоды\" в описании видео скрыт - Раздел \"Эпизоды\" в описании видео показан - Скрыть раздел \"Как был создан этот контент\" - Раздел \"Как был создан этот контент\" в описании видео скрыт - Раздел \"Как был создан этот контент\" в описании видео показан - Скрыть очки голосов - Очки голосов скрыты - Очки голосов показаны - Скрыть раздел \"Другие выпуски подкаста\" - Раздел \"Другие выпуски подкаста\" в описании видео скрыт - Раздел \"Другие выпуски подкаста\" в описании видео показан - Скрыть рекомендуемые ссылки - Раздел рекомендуемых ссылок скрыт - Раздел рекомендуемых ссылок показан - Скрыть рекомендуемые видео - Раздел рекомендуемых видео скрыт - Раздел рекомендуемых видео показан - Скрыть раздел информационных карточек - Раздел информационных карточек в описании видео скрыт - Раздел информационных карточек в описании видео показан - Скрыть раздел \"Ключевые понятия\" - Раздел \"Ключевые понятия\" в описании видео скрыт - Раздел \"Ключевые понятия\" в описании видео показан - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Скрыть раздел расшифровки - Раздел расшифровки в описании видео скрыт - Раздел расшифровки в описании видео показан - Описание видео - Скрыть или показать компоненты описания видео - Панель фильтров - Скрыть или показать панель фильтров в лентах, похожих видео, результатах поиска и истории просмотра - Скрыть панель фильтров в ленте - Панель фильтров в ленте скрыта - Панель фильтров в ленте показана - Скрыть панель фильтров в похожих видео - Панель фильтров в похожих видео скрыта - Панель фильтров в похожих видео показана - Скрыть панель фильтров в поиске - Панель фильтров в поиске скрыта - Панель фильтров в поиске показана - Скрыть в истории просмотров - Панель фильтров в истории просмотров скрыта - Панель фильтров в истории просмотров показана - Страница канала - Скрыть или показать компоненты страницы канала - - Скрыть кнопку \"Сообщество\" - Кнопка \"Сообщество\" скрыта - Кнопка \"Сообщество\" показана - - Скрыть секцию \"Для вас\" - Секция \"Для вас\" на странице канала скрыта - Секция \"Для вас\" на странице канала показана - - Скрыть кнопку \"Присоединиться\" - Кнопка \"Присоединиться\" скрыта - Кнопка \"Присоединиться\" показана - Скрыть предпросмотр ссылок - Предпросмотр ссылок на странице канала скрыт - Предпросмотр ссылок на странице канала показан - Скрыть секцию участников - Секция участников на странице канала скрыта - Секция участников на странице канала показана - - Скрыть кнопку \"Магазин\" - Кнопка \"Магазин\" скрыта - Кнопка \"Магазин\" показана - - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" скрыта - Кнопка \"Подписаться\" показана - Комментарии - Скрыть или показать компоненты раздела комментариев - Скрыть секцию ИИ сводки чата - Секция ИИ сводки чата скрыта - Секция ИИ сводки чата показана - Скрыть вкладку AI-сводки по темам комментариев - Секция ИИ сводки по темам комментариев скрыта - Секция ИИ сводки по темам комментариев показана - Скрыть правила канала - Правила канала в комментариях скрыты - Правила канала в комментариях показаны - Скрыть заголовок \"Комментарии спонсоров\" - Заголовок \"Комментарии спонсоров\" в комментариях скрыт - Заголовок \"Комментарии спонсоров\" в комментариях показан - Скрыть раздел комментариев - Раздел комментариев под плеером скрыт - Раздел комментариев под плеером показан - Скрыть правила сообщества - Правила сообщества в комментариях скрыты - Правила сообщества в комментариях показаны - Скрыть кнопку \"Создать Short\" - Кнопка \"Создать Short\" при ответе на комментарий скрыта - Кнопка \"Создать Short\" при ответе на комментарий показана - Скрыть кнопки эмодзи и метки времени - Кнопки эмодзи и метки времени скрыты - Кнопки эмодзи и метки времени показаны - Скрыть предпросмотр комментария - Предпросмотр комментария под плеером скрыт - Предпросмотр комментария под плеером показан - Скрыть кнопку \"Спасибо\" - Кнопка \"Спасибо\" в комментариях скрыта - Кнопка \"Спасибо\" в комментариях показана - Скрыть количество просмотров - Количество просмотров в ленте и результатах поиска скрыто - Количество просмотров в ленте и результатах поиска показано - - "Ограничения: -• Секции Shorts, страницы каналов и результаты поиска все еще могут показывать счетчики просмотров -• Эта функция не работает с автомобильным форм-фактором" - Скрыть время загрузки - Время загрузки в ленте и результатах поиска скрыто - Время загрузки в ленте и результатах поиска показано - - "Ограничения: -• Секции Shorts, страницы каналов и результаты поиска все еще могут показывать время загрузки -• Эта функция не работает с автомобильным форм-фактором" - Скрыть контент по ключевым словам - Скрыть видео из результатов поиска и ленты с помощью фильтров ключевых слов - Скрыть видео на \"Главной\" по ключевым словам - Видео на вкладке \"Главная\" фильтруются по ключевым словам - Видео на вкладке \"Главная\" не фильтруются по ключевым словам - Скрыть результаты поиска по ключевым словам - Результаты поиска видео фильтруются по ключевым словам - Результаты поиска видео не фильтруются по ключевым словам - Скрыть видео в \"Подписках\" по ключевым словам - Видео на вкладке \"Подписки\" фильтруются по ключевым словам - Видео на вкладке \"Подписки\" не фильтруются по ключевым словам - Ключевые слова для скрытия - + Скрыть метки видеорекомендаций + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска скрыты + Метки \"Люди также смотрели\" и \"Вам также может понравиться\" в результатах поиска показаны + Скрыть визуальный разделитель + Визуальный разделитель скрыт + Визуальный разделитель показан + Скрыть результаты веб-поиска + Результаты веб-поиска в ленте скрыты + Результаты веб-поиска в ленте показаны + Скрыть раздел \"Вам может понравиться\" + Раздел \"Вам может понравиться\" скрыт + Раздел \"Вам может понравиться\" показан + + Скрыть YouTube Doodles + Анимация YouTube Doodles на логотипе скрыта + Анимация YouTube Doodles на логотипе показана + Скрыть панель канала + Панель канала под плеером скрыта + Панель канала под плеером показана + Скрыть водяной знак канала + Водяной знак канала в плеере скрыт + Водяной знак канала в плеере показан + Скрыть колонку \"Коллективный сбор\" + Колонка \"Коллективный сбор\" между плеером и описанием видео скрыта + Колонка \"Коллективный сбор\" между плеером и описанием видео показана + Скрыть экстренные колонки + Экстренные колонки в результатах поиска и плеере скрыты + Экстренные колонки в результатах поиска и плеере показаны + Скрыть информационные панели + Информационные панели в ленте, результатах поиска и видео скрыты + Информационные панели в ленте, результатах поиска и видео показаны + + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + + Скрыть кнопку \"Повтор чата\" + Кнопка повтора чата в наложении плеера скрыта + Кнопка повтора чата в наложении плеера показана + Скрыть медицинские панели + Медицинские панели в ленте, результатах поиска и видео скрыты + Медицинские панели в ленте, результатах поиска и видео показаны + Скрыть быстрые действия + Быстрые действия в полноэкранном режиме скрыты + Быстрые действия в полноэкранном режиме показаны + Скрыть похожие видео + Похожие видео в быстрых действиях скрыты + Похожие видео в быстрых действиях показаны + Скрыть правила сообщества подписчиков + Правила сообщества подписчиков в комментариях скрыты + Правила сообщества подписчиков в комментариях показаны + Скрыть временные реакции + Временные реакции в комментариях и живом чате скрыты + Временные реакции в комментариях и живом чате показаны + Скрыть заголовок видео + Заголовок видео в наложении плеера скрыт + Заголовок видео в наложении плеера показан + Скрыть секцию AI-резюме видео + Сгенерированный ИИ раздел сводки видео скрыт + Сгенерированный ИИ раздел сводки видео показан + Скрыть раздел \"Спросить\" + Раздел \"Спросить\" в описании видео скрыт + Раздел \"Спросить\" в описании видео показан + Скрыть раздел атрибутов + Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" скрыты + Разделы \"Упомянутые или показанные места\", \"Игры\", \"Музыка\" и \"Люди, которых упоминали\" показаны + Скрыть раздел \"Эпизоды\" + Раздел \"Эпизоды\" в описании видео скрыт + Раздел \"Эпизоды\" в описании видео показан + Скрыть \"Прогресс курса\" + Раздел \"Прогресс курса\" скрыт + Раздел \"Прогресс курса\" показан + Скрыть кнопку \"Навигация\" + Разделы \"Посмотреть этот курс\" и \"Посмотреть подкаст\" скрыты + Разделы \"Посмотреть этот курс\" и \"Посмотреть подкаст\" показаны + Скрыть \"Посмотреть этот курс\" + Раздел \"Посмотреть этот курс\" скрыт + Раздел \"Просмотреть этот курс\" показан + Скрыть раздел \"Другие выпуски подкаста\" + Раздел \"Другие выпуски подкаста\" в описании видео скрыт + Раздел \"Другие выпуски подкаста\" в описании видео показан + Скрыть раздел \"Другие выпуски подкаста\" + Раздел \"Другие выпуски подкаста\" в описании видео скрыт + Раздел \"Другие выпуски подкаста\" в описании видео показан + Скрыть рекомендуемые ссылки + Раздел рекомендуемых ссылок скрыт + Раздел рекомендуемых ссылок показан + Скрыть \"Рекомендуемые места\" + Раздел \"Рекомендуемые места\" скрыт + Раздел \"Рекомендуемые места\" показан + Скрыть рекомендуемые видео + Раздел рекомендуемых видео скрыт + Раздел рекомендуемых видео показан + Включить фильтр выпадающего меню ленты + Фильтр выпадающего меню ленты включен + Фильтр выпадающего меню ленты отключен + Фильтр выпадающего меню ленты + Введите названия пунктов выпадающего меню для фильтрации, по одному на строку + Скрыть раздел \"Игры\" + Раздел \"Игры\" скрыт + Раздел \"Игры\" показан + Скрыть раздел \"Как был создан этот контент\" + Раздел \"Как был создан этот контент\" в описании видео скрыт + Раздел \"Как был создан этот контент\" в описании видео показан + Скрыть очки голосов + Очки голосов скрыты + Очки голосов показаны + Скрыть раздел информационных карточек + Раздел информационных карточек в описании видео скрыт + Раздел информационных карточек в описании видео показан + Скрыть раздел \"Ключевые понятия\" + Раздел \"Ключевые понятия\" в описании видео скрыт + Раздел \"Ключевые понятия\" в описании видео показан + Скрыть раздел \"Музыка\" + Раздел \"Музыка\" скрыт + Раздел \"Музыка\" показан + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + Скрыть раздел расшифровки + Раздел расшифровки в описании видео скрыт + Раздел расшифровки в описании видео показан + Скрыть раздел \"Тесты\" + Раздел \"Тесты\" скрыт + Раздел \"Тесты\" показан + Описание видео + Скрыть или показать компоненты описания видео + Панель фильтров + Скрыть или показать панель фильтров в лентах, похожих видео, результатах поиска и истории просмотра + Скрыть панель фильтров в ленте + Панель фильтров в ленте скрыта + Панель фильтров в ленте показана + Скрыть панель фильтров в похожих видео + Панель фильтров в похожих видео скрыта + Панель фильтров в похожих видео показана + Скрыть панель фильтров в поиске + Панель фильтров в поиске скрыта + Панель фильтров в поиске показана + Скрыть в истории просмотров + Панель фильтров в истории просмотров скрыта + Панель фильтров в истории просмотров показана + Страница канала + Скрыть или показать компоненты страницы канала + Включить фильтр вкладок канала + Фильтр вкладок канала включен + Фильтр вкладок канала отключен + Фильтр вкладок канала + Введите названия вкладок канала для фильтрации, по одному на строку + + Скрыть кнопку \"Сообщество\" + Кнопка \"Сообщество\" скрыта + Кнопка \"Сообщество\" показана + + Скрыть секцию \"Для вас\" + Секция \"Для вас\" на странице канала скрыта + Секция \"Для вас\" на странице канала показана + + Скрыть кнопку \"Присоединиться\" + Кнопка \"Присоединиться\" скрыта + Кнопка \"Присоединиться\" показана + Скрыть предпросмотр ссылок + Предпросмотр ссылок на странице канала скрыт + Предпросмотр ссылок на странице канала показан + Скрыть секцию участников + Секция участников на странице канала скрыта + Секция участников на странице канала показана + + Скрыть кнопку \"Магазин\" + Кнопка \"Магазин\" скрыта + Кнопка \"Магазин\" показана + + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" скрыта + Кнопка \"Подписаться\" показана + Комментарии + Скрыть или показать компоненты раздела комментариев + Скрыть секцию ИИ сводки чата + Секция ИИ сводки чата скрыта + Секция ИИ сводки чата показана + Скрыть вкладку AI-сводки по темам комментариев + Секция ИИ сводки по темам комментариев скрыта + Секция ИИ сводки по темам комментариев показана + Скрыть правила канала + Правила канала в комментариях скрыты + Правила канала в комментариях показаны + Скрыть заголовок \"Комментарии спонсоров\" + Заголовок \"Комментарии спонсоров\" в комментариях скрыт + Заголовок \"Комментарии спонсоров\" в комментариях показан + Скрыть раздел комментариев + Раздел комментариев под плеером скрыт + Раздел комментариев под плеером показан + Скрыть правила сообщества + Правила сообщества в комментариях скрыты + Правила сообщества в комментариях показаны + Скрыть кнопку \"Создать Short\" + Кнопка \"Создать Short\" при ответе на комментарий скрыта + Кнопка \"Создать Short\" при ответе на комментарий показана + Скрыть кнопки эмодзи и метки времени + Кнопки эмодзи и метки времени скрыты + Кнопки эмодзи и метки времени показаны + Скрыть предпросмотр комментария + Предпросмотр комментария под плеером скрыт + Предпросмотр комментария под плеером показан + Скрыть кнопку \"Спасибо\" + Кнопка \"Спасибо\" в комментариях скрыта + Кнопка \"Спасибо\" в комментариях показана + Скрыть количество просмотров + Количество просмотров в ленте и результатах поиска скрыто + Количество просмотров в ленте и результатах поиска показано + + "Ограничения: +• Секции Shorts, страницы каналов и результаты поиска все еще могут показывать счетчики просмотров. +• Эта функция не работает с автомобильным форм-фактором." + Скрыть время загрузки + Время загрузки в ленте и результатах поиска скрыто + Время загрузки в ленте и результатах поиска показано + + "Ограничения: +• Секции Shorts, страницы каналов и результаты поиска все еще могут показывать время загрузки. +• Эта функция не работает с автомобильным форм-фактором." + Скрыть контент по ключевым словам + Скрыть видео из результатов поиска и ленты с помощью фильтров ключевых слов + Скрыть видео на \"Главной\" по ключевым словам + Видео на вкладке \"Главная\" фильтруются по ключевым словам + Видео на вкладке \"Главная\" не фильтруются по ключевым словам + Скрыть результаты поиска по ключевым словам + Результаты поиска видео фильтруются по ключевым словам + Результаты поиска видео не фильтруются по ключевым словам + Скрыть видео в \"Подписках\" по ключевым словам + Видео на вкладке \"Подписки\" фильтруются по ключевым словам + Видео на вкладке \"Подписки\" не фильтруются по ключевым словам + Ключевые слова для скрытия + - "Ключевые слова и фразы для скрытия, разделенные новой строкой + "Ключевые слова и фразы для скрытия, разделенные новой строкой Ключевыми словами могут быть названия каналов или любой текст, показываемый в заголовках видео Слова с заглавными буквами в середине должны содержать регистр (например: iPhone, TikTok, LeBlanc)" - О фильтрации по ключевым словам - "Вкладки \"Главная\", \"Подписки\" и результаты поиска фильтруются для скрытия контента, соответствующего ключевым фразам + О фильтрации по ключевым словам + "Вкладки \"Главная\", \"Подписки\" и результаты поиска фильтруются для скрытия контента, соответствующего ключевым фразам -Ограничения +Ограничения: • Shorts нельзя скрыть по имени канала • Некоторые компоненты пользовательского интерфейса могут быть не скрыты • Поиск по ключевому слову может не дать результатов" - Только целые слова - - Заключение ключевого слова/фразы в двойные кавычки предотвратит частичное совпадение названий видео и каналов<br><br>Например,<br><b>\"ai\"</b> скроет видео: <b>How does AI work?</b><br>но не скроет: <b>What does fair use mean?</b> - - Невозможно использовать ключевое слово: %s - Добавьте кавычки для использования ключевого слова: %s - Ключевое слово содержит конфликтующие заявления: %s - Ключевое слово слишком короткое и требует кавычки: %s - Ключевое слово скроет все видео: %s - - - Скрыть секцию магазина автора - Секция магазина автора под плеером скрыта - Секция магазина автора под плеером показана - Скрыть баннер магазина - Баннер магазина в конце просмотра скрыт - Баннер магазина в конце просмотра показан - Скрыть полноэкранную рекламу - "Полноэкранная реклама при запуске приложения скрыта - -Данная опция доступна только для старых устройств" - Полноэкранная реклама при запуске приложения показана - - Скрытие полноэкранной рекламы работает только для старых устройств - Скрыть общую рекламу - Общая реклама скрыта - Общая реклама показана - Скрыть баннеры торговли - Баннеры торговли в ленте скрыты - Баннеры торговли в ленте показаны - Скрыть метку платной акции - Метка платной акции в плеере скрыта - Метка платной акции в плеере показана - Скрыть заставки саморекламы - Заставки саморекламы под информацией о видео скрыты - Заставки саморекламы под информацией о видео показаны - Скрыть ссылки на товары - Ссылки на товары в описании видео скрыты - Ссылки на товары в описании видео показаны - Скрыть баннер просмотра товаров - Баннер просмотра товаров в плеере скрыт - Баннер просмотра товаров в плеере показан - Скрыть результаты веб-поиска - Результаты веб-поиска в ленте скрыты - Результаты веб-поиска в ленте показаны - - - Скрыть рекламу YouTube Premium - Реклама YouTube Premium под плеером скрыта - Реклама YouTube Premium под плеером показана - - - Скрыть видеорекламу - Видеореклама в плеере скрыта - Видеореклама в плеере показана - - - URL-адрес скопирован - URL-адрес с меткой времени скопирован - Показать кнопку копирования URL видео - Кнопка копирования URL-адреса видео показана. Нажмите для копирования URL-адреса видео. Нажмите и удерживайте для копирования URL-адреса видео с меткой времени - Кнопка копирования URL-адреса видео не показана - Показать кнопку копирования URL видео с меткой времени - Кнопка копирования URL-адреса с меткой времени показана. Нажмите для копирования URL-адреса видео с меткой времени. Нажмите и удерживайте для копирования URL-адреса видео без метки времени - Кнопка копирования URL-адреса с меткой времени не показана - - - Скрыть диалог о нежелательном контенте - Диалоговое окно о нежелательном контенте скрыто - Диалоговое окно о нежелательном контенте показано - Данная опция не обходит возрастное ограничение. Она только принимает возрастное ограничение автоматически. - - - Отключить всплывающее окно \"Вход на ТВ\" - Всплывающее окно \"Вход на ТВ\" отключено - Всплывающее окно \"Вход на ТВ\" включено - - - Отключить пропуск главы по двойному касанию - Двойное касание никогда не приведет к переходу к следующей/предыдущей главе - Двойное касание может иногда приводить к переходу к следующей/предыдущей главе - - - Внешний загрузчик - Настройки использования внешнего загрузчика видео - Показать кнопку внешнего загрузчика - Кнопка внешнего загрузчика в плеере показана - Кнопка внешнего загрузчика в плеере скрыта - - Действие кнопки \"Скачать\" - Кнопка \"Скачать\" запускает внешний загрузчик - Кнопка \"Скачать\" запускает собственный загрузчик - Имя пакета загрузчика - Имя пакета установленного Вами приложения внешнего загрузчика - Введите имя пакета - Другое - Приложение не установлено - %s не установлен. Пожалуйста, установите его. - "Не удалось найти установленное приложение с именем пакета: %s + Только целые слова + + Заключение ключевого слова/фразы в двойные кавычки предотвратит частичное совпадение названий видео и каналов<br><br>Например,<br><b>\"ai\"</b> скроет видео: <b>How does AI work?</b><br>но не скроет: <b>What does fair use mean?</b> + + Невозможно использовать ключевое слово: %s + Добавьте кавычки для использования ключевого слова: %s + Ключевое слово содержит конфликтующие заявления: %s + Ключевое слово слишком короткое и требует кавычки: %s + Ключевое слово скроет все видео: %s + + + Скрыть баннер магазина + Баннер магазина в конце просмотра скрыт + Баннер магазина в конце просмотра показан + Скрыть полноэкранную рекламу + Полноэкранная реклама при запуске приложения скрыта + Полноэкранная реклама при запуске приложения показана + Скрыть общую рекламу + Общая реклама скрыта + Общая реклама показана + Скрыть баннеры торговли + Баннеры торговли в ленте скрыты + Баннеры торговли в ленте показаны + Скрыть метку платной акции + Метка платной акции в плеере скрыта + Метка платной акции в плеере показана + Скрыть всплывающую рекламу в плеере + Всплывающая реклама в плеере скрыта + Всплывающая реклама в плеере показана + Скрыть заставки саморекламы + Заставки саморекламы под информацией о видео скрыты + Заставки саморекламы под информацией о видео показаны + Скрыть ссылки на товары + Ссылки на товары в описании видео скрыты + Ссылки на товары в описании видео показаны + Скрыть баннер просмотра товаров + Баннер просмотра товаров в плеере скрыт + Баннер просмотра товаров в плеере показан + Скрыть рекламу YouTube Premium + Реклама YouTube Premium скрыта + Реклама YouTube Premium показана + + + Скрыть видеорекламу + Видеореклама в плеере скрыта + Видеореклама в плеере показана + + + URL-адрес скопирован + URL-адрес с меткой времени скопирован + Показать кнопку копирования URL видео + Кнопка копирования URL-адреса видео показана. Нажмите для копирования URL-адреса видео. Нажмите и удерживайте для копирования URL-адреса видео с меткой времени + Кнопка копирования URL-адреса видео не показана + Показать кнопку копирования URL видео с меткой времени + Кнопка копирования URL-адреса с меткой времени показана. Нажмите для копирования URL-адреса видео с меткой времени. Нажмите и удерживайте для копирования URL-адреса видео без метки времени + Кнопка копирования URL-адреса с меткой времени не показана + + + Скрыть диалог о нежелательном контенте + Диалоговое окно о нежелательном контенте скрыто + Диалоговое окно о нежелательном контенте показано + Данная опция не обходит возрастное ограничение. Она только принимает возрастное ограничение автоматически. + + + Отключить всплывающее окно \"Вход на ТВ\" + Всплывающее окно \"Вход на ТВ\" отключено + Всплывающее окно \"Вход на ТВ\" включено + + + Отключить пропуск главы по двойному касанию + Двойное касание никогда не приведет к переходу к следующей/предыдущей главе + Двойное касание может иногда приводить к переходу к следующей/предыдущей главе + + + Внешний загрузчик + Настройки использования внешнего загрузчика видео + Показать кнопку внешнего загрузчика + Кнопка внешнего загрузчика в плеере показана + Кнопка внешнего загрузчика в плеере скрыта + + Действие кнопки \"Скачать\" + Кнопка \"Скачать\" запускает внешний загрузчик + Кнопка \"Скачать\" запускает собственный загрузчик + Имя пакета загрузчика + Имя пакета установленного Вами приложения внешнего загрузчика + Введите имя пакета + Другое + Приложение не установлено + %s не установлен. Пожалуйста, установите его. + "Не удалось найти установленное приложение с именем пакета: %s Убедитесь, что имя пакета указано правильно и приложение установлено" - Имя пакета не может быть пустым - - - Отключить жест покадровой перемотки - Жест покадровой перемотки отключен - Жест покадровой перемотки включен - - - Включить перемотку нажатием - Перемотка нажатием на полосу прогресса включена - Перемотка нажатием на полосу прогресса отключена - - - Включить регулировку яркости жестом - "Регулировка яркости жестом включена + Имя пакета не может быть пустым + + + Отключить жест покадровой перемотки + Жест покадровой перемотки отключен + Жест покадровой перемотки включен + + + Включить перемотку нажатием + Перемотка нажатием на полосу прогресса включена + Перемотка нажатием на полосу прогресса отключена + + + Включить регулировку яркости жестом + "Регулировка яркости жестом включена Изменяйте яркость вертикальным жестом по левой стороне экрана" - Регулировка яркости жестом отключена - Включить регулировку громкости жестом - "Регулировка громкости жестом включена + Регулировка яркости жестом отключена + Включить регулировку громкости жестом + "Регулировка громкости жестом включена Изменяйте громкость вертикальным жестом по левой стороне экрана" - Регулировка громкости жестом отключена - Включить нажатие для выполнения жестов - Нажатие для выполнения жестов включено - Нажатие для выполнения жестов отключено - Включить виброотклик при жестах - Виброотклик при выполнении жестов включен - Виброотклик при выполнении жестов отключен - Сохранять и восстанавливать яркость - Значения яркости сохраняются и восстанавливаются при выходе из полноэкранного режима или входе в него - Значения яркости не сохраняются и не восстанавливаются при выходе из полноэкранного режима или входе в него - Включить жест автояркости - Активация автояркости жестом до самого низкого значения яркости включена - Активация автояркости жестом до самого низкого значения яркости отключена - Авто - Время показа панели жестов - Количество миллисекунд для показа всплывающей панели при жестах - Затемнение фона панели жестов - Значение затемнения всплывающей панели при жестах от 0 до 100 - Значение затемнения панели жестов должно быть от 0 до 100 - Цвет индикатора яркости при жестах - Цвет полосы прогресса при изменении яркости жестами - Цвет индикатора громкости при жестах - Цвет полосы прогресса при изменении громкости жестами - Размер текста панели жестов - Размер текста панели жестов от 1 до 30 - Размер текста должен быть в диапазоне от 1 до 30 - Порог величины жеста - Минимальная амплитуда движения, распознаваемого как жест - Чувствительность жеста регулировки громкости - Величина изменения громкости при регулировке жестом - Стиль панели жестов - Горизонтальный индикатор - Горизонтальный индикатор (минимальный - сверху) - Горизонтальный индикатор (минимальный - по центру) - Круговой индикатор - Круговой индикатор (минимальный) - Вертикальный индикатор - Вертикальный индикатор (минимальный) - Включить переключение видео жестом - Жест в полноэкранном режиме переключает на следующее/предыдущее видео - Жест в полноэкранном режиме не переключает на следующее/предыдущее видео - - - Отключить автоматические субтитры - Автоматические субтитры отключены - Автоматические субтитры включены - - - Кнопки действий - Скрыть или показать кнопки действий под плеером - Отключить подсветку кнопок \"Лайк\" и \"Подписаться\" - Кнопки \"Лайк\" и \"Подписаться\" при упоминании не подсвечиваются - Кнопки \"Лайк\" и \"Подписаться\" при упоминании подсвечиваются - Скрыть кнопки \"Лайк\" и \"Дизлайк\" - Кнопки \"Лайк\" и \"Дизлайк\" под плеером скрыты - Кнопки \"Лайк\" и \"Дизлайк\" под плеером показаны - - Скрыть кнопку \"Поделиться\" - Кнопка \"Поделиться\" под плеером скрыта - Кнопка \"Поделиться\" под плеером показана - - Скрыть кнопку \"Не показывать рекламу\" - Кнопка \"Не показывать рекламу\" скрыта - Кнопка \"Не показывать рекламу\" показана - - Скрыть комментарии - Кнопка \"Комментарии\" скрыта - Кнопка \"Комментарии\" показана - - Скрыть кнопку \"Пожаловаться\" - Кнопка \"Пожаловаться\" под плеером скрыта - Кнопка \"Пожаловаться\" под плеером показана - - Скрыть кнопку \"Ремикс\" - Кнопка \"Ремикс\" под плеером скрыта - Кнопка \"Ремикс\" под плеером показана - - Скрыть кнопку \"Скачать\" - Кнопка \"Скачать\" под плеером скрыта - Кнопка \"Скачать\" под плеером показана - - Скрыть кнопку \"Хайп\" - Кнопка \"Хайп\" скрыта - Кнопка \"Хайп\" показана - - Скрыть кнопку \"Рекламировать\" - Кнопка \"Рекламировать\" скрыта - Кнопка \"Рекламировать\" показана - - Скрыть кнопку \"Спасибо\" - Кнопка \"Спасибо\" под плеером скрыта - Кнопка \"Спасибо\" под плеером показана - - Скрыть кнопку \"Спросить\" - Кнопка \"Спросить\" скрыта - Кнопка \"Спросить\" показана - - Скрыть кнопку \"Создать клип\" - Кнопка \"Создать клип\" под плеером скрыта - Кнопка \"Создать клип\" под плеером показана - - Скрыть магазин - Кнопка \"Магазин\" в Shorts скрыта - Кнопка \"Магазин\" в Shorts показана - - Скрыть кнопку \"Сохранить\" - Кнопка \"Сохранить\" скрыта - Кнопка \"Сохранить\" показана - - - Кнопки навигации - Скрыть или изменить кнопки в панели навигации - - Скрыть кнопку \"Главная\" - Кнопка \"Главная\" в панели навигации скрыта - Кнопка \"Главная\" в панели навигации показана - - Скрыть кнопку \"Shorts\" - Кнопка \"Shorts\" в панели навигации скрыта - Кнопка \"Shorts\" в панели навигации показана - - Скрыть кнопку \"Создать\" - Кнопка \"Создать\" в панели навигации скрыта - Кнопка \"Создать\" в панели навигации показана - - Скрыть кнопку \"Подписки\" - Кнопка \"Подписки\" в панели навигации скрыта - Кнопка \"Подписки\" в панели навигации показана - Скрыть кнопку \"Уведомления\" - Кнопка \"Уведомления\" в панели навигации скрыта - Кнопка \"Уведомления\" в панели навигации показана - - Поменять местами кнопки \"Создать\" и \"Уведомления\" - "Кнопка \"Создать\" поменяна местами с кнопкой \"Уведомления\" - -Примечание: активация данной опции также принудительно скроет видеорекламу" - Кнопка \"Создать\" не поменяна местами с кнопкой \"Уведомления\" - "Отключение этого параметра также отключит блокировку рекламы в Shorts. - -Если изменение этого параметра не вступило в силу, попробуйте перейти в режим инкогнито." - Скрыть подписи кнопок навигации - Подписи кнопок навигации скрыты - Подписи кнопок навигации показаны - Отключить полупрозрачность строки состояния - Строка состояния непрозрачная - Строка состояния непрозрачная или полупрозрачная - На некоторых устройствах включение данной опции может сделать системную панель навигации прозрачной. - Отключить полупрозрачность светлой панели навигации - Панель навигации при светлой теме непрозрачная - Панель навигации при светлой теме непрозрачная или полупрозрачная - Отключить полупрозрачность темной панели навигации - Панель навигации при темной теме непрозрачная - Панель навигации при темной теме непрозрачная или полупрозрачная - - - Выдвижное меню плеера - Скрыть или показать пункты выдвижного меню плеера - - Скрыть пункт \"Субтитры\" - Пункт \"Субтитры\" в выдвижном меню плеера скрыт - Пункт \"Субтитры\" в выдвижном меню плеера показан - - Скрыть пункт \"Дополнительные настройки\" - Пункт \"Дополнительные настройки\" в выдвижном меню плеера скрыт - Пункт \"Дополнительные настройки\" в выдвижном меню плеера показан - - Скрыть пункт \"Таймер сна\" - Пункт \"Таймер сна\" в выдвижном меню плеера скрыт - Пункт \"Таймер сна\" в выдвижном меню плеера показан - - Скрыть пункт \"Повтор воспроизведения\" - Пункт \"Повтор воспроизведения\" в выдвижном меню плеера скрыт - Пункт \"Повтор воспроизведения\" в выдвижном меню плеера показан - - Скрыть пункт \"Фоновая подсветка\" - Пункт \"Фоновая подсветка\" в выдвижном меню плеера скрыт - Пункт \"Фоновая подсветка\" в выдвижном меню плеера показан - Скрыть пункт \"Постоянный уровень громкости\" - Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера показан - Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера скрыт - - Скрыть пункт \"Справка и отзывы\" - Пункт \"Справка и отзывы\" в выдвижном меню плеера скрыт - Пункт \"Справка и отзывы\" в выдвижном меню плеера показан - - Скрыть пункт \"Скорость воспроизведения\" - Пункт \"Скорость воспроизведения\" в выдвижном меню плеера скрыт - Пункт \"Скорость воспроизведения\" в выдвижном меню плеера показан - - Скрыть пункт \"Блокировка экрана\" - Пункт \"Блокировка экрана\" в выдвижном меню плеера скрыт - Пункт \"Блокировка экрана\" в выдвижном меню плеера показан - - Скрыть пункт \"Слушать в YouTube Music\" - Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера скрыт - Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера показан - - Скрыть пункт \"Звуковая дорожка\" - Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт - Пункт \"Звуковая дорожка\" в выдвижном меню плеера показан - + Скрыть кнопку \"Поделиться\" + Кнопка \"Поделиться\" под плеером скрыта + Кнопка \"Поделиться\" под плеером показана + + Скрыть кнопку \"Не показывать рекламу\" + Кнопка \"Не показывать рекламу\" скрыта + Кнопка \"Не показывать рекламу\" показана + + Скрыть комментарии + Кнопка \"Комментарии\" скрыта + Кнопка \"Комментарии\" показана + + Скрыть кнопку \"Пожаловаться\" + Кнопка \"Пожаловаться\" под плеером скрыта + Кнопка \"Пожаловаться\" под плеером показана + + Скрыть кнопку \"Ремикс\" + Кнопка \"Ремикс\" под плеером скрыта + Кнопка \"Ремикс\" под плеером показана + + Скрыть кнопку \"Скачать\" + Кнопка \"Скачать\" под плеером скрыта + Кнопка \"Скачать\" под плеером показана + + Скрыть кнопку \"Хайп\" + Кнопка \"Хайп\" скрыта + Кнопка \"Хайп\" показана + + Скрыть кнопку \"Рекламировать\" + Кнопка \"Рекламировать\" скрыта + Кнопка \"Рекламировать\" показана + + Скрыть кнопку \"Спасибо\" + Кнопка \"Спасибо\" под плеером скрыта + Кнопка \"Спасибо\" под плеером показана + + Скрыть кнопку \"Спросить\" + Кнопка \"Спросить\" скрыта + Кнопка \"Спросить\" показана + + Скрыть кнопку \"Создать клип\" + Кнопка \"Создать клип\" под плеером скрыта + Кнопка \"Создать клип\" под плеером показана + Скрытие может не работать для некоторых учетных записей пользователей. + + Скрыть магазин + Кнопка \"Магазин\" в Shorts скрыта + Кнопка \"Магазин\" в Shorts показана + + Скрыть кнопку \"Сохранить\" + Кнопка \"Сохранить\" скрыта + Кнопка \"Сохранить\" показана + + + Кнопки навигации + Скрыть или изменить кнопки в панели навигации + + Скрыть кнопку \"Главная\" + Кнопка \"Главная\" в панели навигации скрыта + Кнопка \"Главная\" в панели навигации показана + + Скрыть кнопку \"Shorts\" + Кнопка \"Shorts\" в панели навигации скрыта + Кнопка \"Shorts\" в панели навигации показана + + Скрыть кнопку \"Создать\" + Кнопка \"Создать\" в панели навигации скрыта + Кнопка \"Создать\" в панели навигации показана + + Скрыть кнопку \"Подписки\" + Кнопка \"Подписки\" в панели навигации скрыта + Кнопка \"Подписки\" в панели навигации показана + Скрыть кнопку \"Уведомления\" + Кнопка \"Уведомления\" в панели навигации скрыта + Кнопка \"Уведомления\" в панели навигации показана + + Поменять местами кнопки \"Создать\" и \"Уведомления\" + Кнопка \"Создать\" поменяна местами с кнопкой \"Уведомления\" + Кнопка \"Создать\" не поменяна местами с кнопкой \"Уведомления\" + Если изменение этой настройки не вступает в силу, попробуйте переключиться в режим Инкогнито. + Скрыть подписи кнопок навигации + Подписи кнопок навигации скрыты + Подписи кнопок навигации показаны + Включить узкие кнопки навигации + Расстояние между кнопками навигации узкое + Расстояние между кнопками навигации обычное + Включить анимации панели навигации + Переходы навигации анимированы + Переходы навигации не анимированы + Отключить полупрозрачность строки состояния + Строка состояния непрозрачная + Строка состояния непрозрачная или полупрозрачная + "Ограничения: +• Черная полоса может появиться в верхней части видеоплеера. +• На некоторых устройствах включение этой функции может сделать системную панель навигации прозрачной." + Отключить полупрозрачность светлой панели навигации + Панель навигации при светлой теме непрозрачная + Панель навигации при светлой теме непрозрачная или полупрозрачная + Отключить полупрозрачность темной панели навигации + Панель навигации при темной теме непрозрачная + Панель навигации при темной теме непрозрачная или полупрозрачная + Панель инструментов + Скрыть или изменить компоненты панели инструментов + Скрыть кнопку \"Создать\" + Кнопка \"Создать\" скрыта + Кнопка \"Создать\" показана + Скрыть кнопку \"Уведомления\" + Кнопка \"Уведомления\" скрыта + Кнопка \"Уведомления\" показана + Скрыть кнопку поиска + Кнопка поиска скрыта + Кнопка поиска показана. + Включить широкую панель поиска + Широкая панель поиска включена + Широкая панель поиска отключена + + + Выдвижное меню плеера + Скрыть или показать пункты выдвижного меню плеера + + Скрыть пункт \"Субтитры\" + Пункт \"Субтитры\" в выдвижном меню плеера скрыт + Пункт \"Субтитры\" в выдвижном меню плеера показан + + Скрыть пункт \"Дополнительные настройки\" + Пункт \"Дополнительные настройки\" в выдвижном меню плеера скрыт + Пункт \"Дополнительные настройки\" в выдвижном меню плеера показан + + Скрыть пункт \"Таймер сна\" + Пункт \"Таймер сна\" в выдвижном меню плеера скрыт + Пункт \"Таймер сна\" в выдвижном меню плеера показан + + Скрыть пункт \"Повтор воспроизведения\" + Пункт \"Повтор воспроизведения\" в выдвижном меню плеера скрыт + Пункт \"Повтор воспроизведения\" в выдвижном меню плеера показан + + Скрыть пункт \"Фоновая подсветка\" + Пункт \"Фоновая подсветка\" в выдвижном меню плеера скрыт + Пункт \"Фоновая подсветка\" в выдвижном меню плеера показан + Скрыть пункт \"Постоянный уровень громкости\" + Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера показан + Пункт \"Постоянный уровень громкости\" в выдвижном меню плеера скрыт + + Скрыть пункт \"Справка и отзывы\" + Пункт \"Справка и отзывы\" в выдвижном меню плеера скрыт + Пункт \"Справка и отзывы\" в выдвижном меню плеера показан + + Скрыть пункт \"Скорость воспроизведения\" + Пункт \"Скорость воспроизведения\" в выдвижном меню плеера скрыт + Пункт \"Скорость воспроизведения\" в выдвижном меню плеера показан + + Скрыть пункт \"Блокировка экрана\" + Пункт \"Блокировка экрана\" в выдвижном меню плеера скрыт + Пункт \"Блокировка экрана\" в выдвижном меню плеера показан + + Скрыть пункт \"Слушать в YouTube Music\" + Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера скрыт + Пункт \"Слушать в YouTube Music\" в выдвижном меню плеера показан + + Скрыть пункт \"Звуковая дорожка\" + Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт + Пункт \"Звуковая дорожка\" в выдвижном меню плеера показан + - "Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт + "Пункт \"Звуковая дорожка\" в выдвижном меню плеера скрыт Для показа пункта \"Звуковая дорожка\" измените клиент \"Подмены видеопотоков\" на 'Android No SDK'" - - Скрыть пункт \"Смотреть в VR-режиме\" - Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера скрыт - Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера показан - Скрыть меню качества видео - Меню качества видео в выдвижном меню плеера скрыто - Меню качества видео в выдвижном меню плеера показано - Скрыть колонтитул меню качества видео - Нижний колонтитул старого меню качества видео в выдвижном меню плеера скрыт - Нижний колонтитул старого меню качества видео в выдвижном меню плеера показан - - - Скрыть кнопку \"Автовоспроизведение\" - Кнопка \"Автовоспроизведение\" в плеере скрыта - Кнопка \"Автовоспроизведение\" в плеере показана - - Скрыть кнопку \"Субтитры\" - Кнопка \"Субтитры\" в плеере скрыта - Кнопка \"Субтитры\" в плеере показана - Скрыть кнопку \"Трансляция\" - Кнопка \"Трансляция\" в плеере скрыта - Кнопка \"Трансляция\" в плеере показана - Скрыть фон кнопок управления плеера - Фон кнопок управления плеера скрыт - Фон кнопок управления плеера показан - Скрыть кнопки предыдущего и следующего видео - Кнопки предыдущего и следующего видео в плеере скрыты - Кнопки предыдущего и следующего видео в плеере показаны - - - Скрыть заставки следующих видео - Заставки следующих видео в конце просмотра скрыты - Заставки следующих видео в конце просмотра показаны - - - Отключить фоновую подсветку - Фоновая подсветка в полноэкранном режиме отключена - Фоновая подсветка в полноэкранном режиме включена - - - Скрыть всплывающие подсказки - Всплывающие подсказки в плеере скрыты - Всплывающие подсказки в плеере показаны - - - Отключить анимированные счетчики - Анимированные счетчики просмотров, лайков и дизлайков отключены - Анимированные счетчики просмотров, лайков и дизлайков включены - - - Скрыть полосу прогресса плеера - Полоса прогресса в плеере скрыта - Полоса прогресса в плеере показана - - Скрыть полосу прогресса миниатюр видео - Полоса прогресса миниатюр видео скрыта - Полоса прогресса миниатюр видео показана - - - Компоненты плеера Shorts - Скрыть или показать компоненты плеера Shorts - - Скрыть Shorts в ленте \"Главной\" - Shorts в ленте \"Главной\" и похожих видео скрыты - Shorts в ленте \"Главной\" и похожих видео показаны - Скрыть Shorts в результатах поиска - Shorts в результатах поиска скрыты - Shorts в результатах поиска показаны - - Скрыть Shorts в ленте \"Подписок\" - Shorts в ленте \"Подписок\" скрыты - Shorts в ленте \"Подписок\" показаны - Скрыть Shorts в истории просмотров - Shorts в истории просмотров скрыты - Shorts в истории просмотров показаны - Скрыть метку \"Автодубляж\" - Метка \"Автодубляж\" скрыта - Метка \"Автодубляж\" показана - Скрыть кнопку \"Супер спасибо\" - Кнопка \"Купить Супер спасибо\" скрыта - Кнопка \"Купить Супер спасибо\" показана - Скрыть кнопку \"Эффект\" - Кнопка \"Эффект\" скрыта - Кнопка \"Эффект\" показана - Скрыть кнопку \"Зеленый экран\" - Кнопка \"Зеленый экран\" в Shorts скрыта - Кнопка \"Зеленый экран\" в Shorts показана - Скрыть кнопку хэштега - Кнопка хэштега в Shorts скрыта - Кнопка хэштега в Shorts показана - - Скрыть кнопку \"Присоединиться\" - Кнопка \"Присоединиться\" в Shorts скрыта - Кнопка \"Присоединиться\" в Shorts показана - Скрыть предпросмотр трансляции - Предварительный просмотр трансляции скрыт - Предварительный просмотр трансляции показан - Скрыть метку местоположения - Метка местоположения в Shorts скрыта - Метка местоположения в Shorts показана - Скрыть кнопку \"Новые публикации\" - Кнопка \"Новые публикации\" в плеере Shorts скрыта - Кнопка \"Новые публикации\" в плеере Shorts показана - Скрыть кнопки на паузе - Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts скрыты - Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts показаны - Скрыть превью комментариев - Превью комментариев под плеером скрыто - Превью комментариев под плеером показано - Скрыть кнопку \"Сохранить музыку\" - Кнопка \"Сохранить музыку\" в Shorts скрыта - Кнопка \"Сохранить музыку\" в Shorts показана - Скрыть поисковые предложения - Поисковые предложения в Shorts скрыты - Поисковые предложения в Shorts показаны - Скрыть кнопку \"Магазин\" - Кнопка \"Магазин\" в Shorts скрыта - Кнопка \"Магазин\" в Shorts показана - Скрыть стикеры - Стикеры в Shorts скрыты - Стикеры в Shorts показаны - Скрыть кнопку \"Подписаться\" - Кнопка \"Подписаться\" в Shorts скрыта - Кнопка \"Подписаться\" в Shorts показана - Скрыть товары с тегом - Товары с тегом в Shorts скрыты - Товары с тегом в Shorts показаны - Скрыть кнопку \"Предстоящие события\" - Кнопка \"Предстоящие события\" в Shorts скрыта - Кнопка \"Предстоящие события\" в Shorts показана - Скрыть кнопку \"Использовать этот звук\" - Кнопка \"Использовать этот звук\" скрыта - Кнопка \"Использовать этот звук\" показана - Скрыть кнопку \"Использовать шаблон\" - Кнопка \"Использовать этот шаблон\" скрыта - Кнопка \"Использовать шаблон\" показана - Скрыть анимацию кнопки \"Лайк\" - Анимация кнопки \"Лайк\" в Shorts скрыта - Анимация кнопки \"Лайк\" в Shorts показана - Скрыть кнопку \"Лайк\" - Кнопка \"Лайк\" в Shorts скрыта - Кнопка \"Лайк\" в Shorts показана - Скрыть кнопку \"Дизлайк\" - Кнопка \"Дизлайк\" в Shorts скрыта - Кнопка \"Дизлайк\" в Shorts показана - Скрыть кнопку \"Комментарии\" - Кнопка \"Комментарии\" в Shorts скрыта - Кнопка \"Комментарии\" в Shorts показана - - Скрыть кнопку \"Поделиться\" - Кнопка \"Поделиться\" в Shorts скрыта - Кнопка \"Поделиться\" в Shorts показана - - Скрыть кнопку \"Ремикс\" - Кнопка \"Ремикс\" в Shorts скрыта - Кнопка \"Ремикс\" в Shorts показана - Скрыть кнопку \"Со звуком\" - Кнопка \"Со звуком\" в Shorts скрыта - Кнопка \"Со звуком\" в Shorts показана - Скрыть информационную панель - Информационная панель в Shorts скрыта - Информационная панель в Shorts показана - Скрыть панель канала - Панель канала в Shorts скрыта - Панель канала в Shorts показана - Скрыть заголовок видео - Название видео скрыто - Название видео показано - Скрыть метку звуковых метаданных - Метка звуковых метаданных скрыта - Метка звуковых метаданных показана - Скрыть метку ссылки на видео - Метка ссылки на полное видео в Shorts скрыта - Метка ссылки на полное видео в Shorts показана - Скрыть панель навигации - Панель навигации в Shorts скрыта - Панель навигации в Shorts показана - - - Скрыть предлагаемые видео в конце просмотра - "Предлагаемые видео в конце просмотра скрыты при выключенном автовоспроизведении + + Скрыть пункт \"Смотреть в VR-режиме\" + Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера скрыт + Пункт \"Смотреть в VR-режиме\" в выдвижном меню плеера показан + Скрыть меню качества видео + Меню качества видео в выдвижном меню плеера скрыто + Меню качества видео в выдвижном меню плеера показано + Скрыть колонтитул меню качества видео + Нижний колонтитул старого меню качества видео в выдвижном меню плеера скрыт + Нижний колонтитул старого меню качества видео в выдвижном меню плеера показан + + + Скрыть кнопку \"Автовоспроизведение\" + Кнопка \"Автовоспроизведение\" в плеере скрыта + Кнопка \"Автовоспроизведение\" в плеере показана + + Скрыть кнопку \"Субтитры\" + Кнопка \"Субтитры\" в плеере скрыта + Кнопка \"Субтитры\" в плеере показана + Скрыть кнопку \"Трансляция\" + Кнопка \"Трансляция\" в плеере скрыта + Кнопка \"Трансляция\" в плеере показана + Скрыть кнопку \"Свернуть\" + Кнопка \"Свернуть\" скрыта + Кнопка \"Свернуть\" показана + Скрыть кнопку \"Во весь экран\" + Кнопка \"Во весь экран\" скрыта + Кнопка \"Во весь экран\" показана + Скрыть фон кнопок управления плеера + Фон кнопок управления плеера скрыт + Фон кнопок управления плеера показан + Скрыть кнопки предыдущего и следующего видео + Кнопки предыдущего и следующего видео в плеере скрыты + Кнопки предыдущего и следующего видео в плеере показаны + + + Скрыть заставки следующих видео + Заставки следующих видео в конце просмотра скрыты + Заставки следующих видео в конце просмотра показаны + + + Отключить фоновую подсветку + Фоновая подсветка в полноэкранном режиме отключена + Фоновая подсветка в полноэкранном режиме включена + + + Скрыть всплывающие подсказки + Всплывающие подсказки в плеере скрыты + Всплывающие подсказки в плеере показаны + + + Отключить анимированные счетчики + Анимированные счетчики просмотров, лайков и дизлайков отключены + Анимированные счетчики просмотров, лайков и дизлайков включены + + + Скрыть полосу прогресса плеера + Полоса прогресса в плеере скрыта + Полоса прогресса в плеере показана + + Скрыть полосу прогресса миниатюр видео + Полоса прогресса миниатюр видео скрыта + Полоса прогресса миниатюр видео показана + Включить большую полосу перемотки в полноэкранном режиме + Полоса перемотки в полноэкранном режиме большого размера + Полоса перемотки в полноэкранном режиме обычного размера + + + Компоненты плеера Shorts + Скрыть или показать компоненты плеера Shorts + Скрыть Shorts на странице канала + Скрыты на странице канала + Показаны на странице канала + + Скрыть Shorts в ленте \"Главной\" + Shorts в ленте \"Главной\" и похожих видео скрыты + Shorts в ленте \"Главной\" и похожих видео показаны + Скрыть Shorts в результатах поиска + Shorts в результатах поиска скрыты + Shorts в результатах поиска показаны + + Скрыть Shorts в ленте \"Подписок\" + Shorts в ленте \"Подписок\" скрыты + Shorts в ленте \"Подписок\" показаны + Скрыть Shorts в описании видео + Скрыты в описании видео + Показаны в описании видео + Скрыть Shorts в истории просмотров + Shorts в истории просмотров скрыты + Shorts в истории просмотров показаны + Скрыть кнопку ИИ + Кнопка ИИ скрыта + Кнопка ИИ показана + Скрыть метку \"Автодубляж\" + Метка \"Автодубляж\" скрыта + Метка \"Автодубляж\" показана + Скрыть метку \"Авто дублирование\" + Метка \"Авто дублирование\" скрыта + Метка \"Авто дублирование\" показана + Скрыть кнопку \"Супер спасибо\" + Кнопка \"Купить Супер спасибо\" скрыта + Кнопка \"Купить Супер спасибо\" показана + Скрыть кнопку \"Эффект\" + Кнопка \"Эффект\" скрыта + Кнопка \"Эффект\" показана + Скрыть кнопку \"Зеленый экран\" + Кнопка \"Зеленый экран\" в Shorts скрыта + Кнопка \"Зеленый экран\" в Shorts показана + Скрыть кнопку хэштега + Кнопка хэштега в Shorts скрыта + Кнопка хэштега в Shorts показана + + Скрыть кнопку \"Присоединиться\" + Кнопка \"Присоединиться\" в Shorts скрыта + Кнопка \"Присоединиться\" в Shorts показана + Скрыть предпросмотр трансляции + Предварительный просмотр трансляции скрыт + Предварительный просмотр трансляции показан + Скрыть метку местоположения + Метка местоположения в Shorts скрыта + Метка местоположения в Shorts показана + Скрыть кнопку \"Новые публикации\" + Кнопка \"Новые публикации\" в плеере Shorts скрыта + Кнопка \"Новые публикации\" в плеере Shorts показана + Скрыть кнопки на паузе + Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts скрыты + Кнопки \"Подписки\", \"В эфире\" и \"Покупки\" на паузе в Shorts показаны + Скрыть превью комментариев + Превью комментариев под плеером скрыто + Превью комментариев под плеером показано + Скрыть кнопку \"Сохранить музыку\" + Кнопка \"Сохранить музыку\" в Shorts скрыта + Кнопка \"Сохранить музыку\" в Shorts показана + Скрыть поисковые предложения + Поисковые предложения в Shorts скрыты + Поисковые предложения в Shorts показаны + Скрыть кнопку \"Магазин\" + Кнопка \"Магазин\" в Shorts скрыта + Кнопка \"Магазин\" в Shorts показана + Скрыть стикеры + Стикеры в Shorts скрыты + Стикеры в Shorts показаны + Скрыть кнопку \"Подписаться\" + Кнопка \"Подписаться\" в Shorts скрыта + Кнопка \"Подписаться\" в Shorts показана + Скрыть товары с тегом + Товары с тегом в Shorts скрыты + Товары с тегом в Shorts показаны + Скрыть кнопку \"Предстоящие события\" + Кнопка \"Предстоящие события\" в Shorts скрыта + Кнопка \"Предстоящие события\" в Shorts показана + Скрыть кнопку \"Использовать этот звук\" + Кнопка \"Использовать этот звук\" скрыта + Кнопка \"Использовать этот звук\" показана + Скрыть кнопку \"Использовать шаблон\" + Кнопка \"Использовать этот шаблон\" скрыта + Кнопка \"Использовать шаблон\" показана + + Скрыть анимацию кнопки \"Лайк\" + Анимация кнопки \"Лайк\" в Shorts скрыта + Анимация кнопки \"Лайк\" в Shorts показана + Скрыть кнопку \"Лайк\" + Кнопка \"Лайк\" в Shorts скрыта + Кнопка \"Лайк\" в Shorts показана + Скрыть кнопку \"Дизлайк\" + Кнопка \"Дизлайк\" в Shorts скрыта + Кнопка \"Дизлайк\" в Shorts показана + Скрыть кнопку \"Комментарии\" + Кнопка \"Комментарии\" в Shorts скрыта + Кнопка \"Комментарии\" в Shorts показана + + Скрыть кнопку \"Поделиться\" + Кнопка \"Поделиться\" в Shorts скрыта + Кнопка \"Поделиться\" в Shorts показана + + Скрыть кнопку \"Ремикс\" + Кнопка \"Ремикс\" в Shorts скрыта + Кнопка \"Ремикс\" в Shorts показана + Скрыть кнопку \"Со звуком\" + Кнопка \"Со звуком\" в Shorts скрыта + Кнопка \"Со звуком\" в Shorts показана + Скрыть информационную панель + Информационная панель в Shorts скрыта + Информационная панель в Shorts показана + Скрыть панель канала + Панель канала в Shorts скрыта + Панель канала в Shorts показана + Скрыть заголовок видео + Название видео скрыто + Название видео показано + Скрыть метку звуковых метаданных + Метка звуковых метаданных скрыта + Метка звуковых метаданных показана + Скрыть метку ссылки на видео + Метка ссылки на полное видео в Shorts скрыта + Метка ссылки на полное видео в Shorts показана + Скрыть панель навигации + Панель навигации в Shorts скрыта + Панель навигации в Shorts показана + + + Скрыть предпросмотр автовоспроизведения + Предпросмотр автовоспроизведения скрыт + Предпросмотр автовоспроизведения показан + + + Скрыть предлагаемые видео в конце просмотра + "Предлагаемые видео в конце просмотра скрыты при выключенном авто воспроизведении Автовоспроизведение можно изменить в настройках YouTube: Настройки → Фоновое воспроизведение → Следующее видео" - Предлагаемые видео в конце просмотра показаны - - - Скрыть похожие видео - Похожие видео в полноэкранном режиме скрыты - Похожие видео в полноэкранном режиме показаны - - - Скрыть метку времени видео - Метка времени видео над полосой прогресса скрыта - Метка времени видео над полосой прогресса показана - - - Скрыть всплывающие панели плеера - Автоматически всплывающие панели в плеере скрыты - Автоматически всплывающие панели в плеере показаны - - - Выходить из полноэкранного режима по окончании видео - Отключено - Портрет - Ландшафт - Портрет и ландшафт - - - Открыть видео в полноэкранной портретной ориентации - Видео открываются в полноэкранной портретной ориентации - Видео не открываются в полноэкранной портретной ориентации - - - Затемнение плеера при нажатии - Значение затемнения при нажатии на плеер от 0 до 100, где 0 - это прозрачно - Значение затемнения плеера должно быть от 0 до 100 - - - - Дизлайки временно недоступны (таймаут API) - Дизлайки недоступны (статус %d) - Дизлайки недоступны (лимит клиентов API) - Дизлайки недоступны (%s) - - Обновите видео для голосования с помощью Return YouTube Dislike - - Скрыто владельцем - Вернуть YouTube дизлайки - Дизлайки показаны - Дизлайки скрыты - Показать дизлайки в Shorts - "Дизлайки в Shorts показаны + Предлагаемые видео в конце просмотра показаны + + + Скрыть похожие видео + Похожие видео в полноэкранном режиме скрыты + Похожие видео в полноэкранном режиме показаны + + + Скрыть метку времени видео + Метка времени видео над полосой прогресса скрыта + Метка времени видео над полосой прогресса показана + + + Скрыть всплывающие панели плеера + Всплывающие панели плеера скрыты + Всплывающие панели плеера показаны + + + Выходить из полноэкранного режима по окончании видео + Отключено + Портрет + Ландшафт + Портрет и ландшафт + + + Открыть видео в полноэкранной портретной ориентации + Видео открываются в полноэкранной портретной ориентации + Видео не открываются в полноэкранной портретной ориентации + + + Затемнение плеера при нажатии + Значение затемнения при нажатии на плеер от 0 до 100, где 0 - это прозрачно + Значение затемнения плеера должно быть от 0 до 100 + + + + Дизлайки временно недоступны (таймаут API) + Дизлайки недоступны (статус %d) + Дизлайки недоступны (лимит клиентов API) + Дизлайки недоступны (%s) + + Обновите видео для голосования с помощью Return YouTube Dislike + + Скрыто владельцем + Вернуть YouTube дизлайки + Дизлайки показаны + Дизлайки скрыты + Показать дизлайки в Shorts + "Дизлайки в Shorts показаны Ограничение: дизлайки могут не показываться в режиме инкогнито" - Дизлайки в Shorts скрыты - Показать дизлайки в процентах - Дизлайки показаны в процентах - Дизлайки показаны как число - - Компактная кнопка \"Лайк\" - Кнопка \"Лайк\" стилизована для минимальной ширины - Кнопка \"Лайк\" стилизована для лучшего внешнего вида - Показать примерное количество лайков - Для видео с отключенными лайками показывается примерное количество лайков - Примерное количество лайков скрыто - Уведомление при недоступности API - Всплывающее уведомление при недоступности Return YouTube Dislike показано - Всплывающее уведомление при недоступности Return YouTube Dislike скрыто - ReturnYouTubeDislike.com - Данные предоставлены Return YouTube Dislike API. Нажмите для дополнительной информации - - Статистика Return YouTube Dislike API этого устройства - Время ответа API, среднее - Время ответа API, минимальное - Время ответа API, максимальное - Время ответа API, последнее видео - Дизлайки временно недоступны – действует ограничение скорости клиентского API - API получает голоса, количество запросов - Сетевые запросы не выполнены - Выполнено %d сетевых запросов - API получает голоса, количество таймаутов - Сетевые запросы не имели таймаутов - Таймаут %d сетевых запросов - Ограничения скорости клиента API - Ограничения скорости клиента API не обнаружены - Ограничения скорости клиента API обнаружены %d раз - %d миллисекунд - - - Включить широкую панель поиска - Широкая панель поиска вместо кнопки поиска включена (логотип YouTube будет скрыт) - Широкая панель поиска отключена - - - Включить высокое качество миниатюр - Миниатюры полосы прогресса при перемотке имеют высокое качество - Миниатюры полосы прогресса при перемотке имеют среднее качество - Полноэкранные миниатюры полосы прогресса при перемотке имеют высокое качество - Полноэкранные миниатюры полосы прогресса при перемотке имеют среднее качество - "Данная опция также восстановит миниатюры в прямых трансляциях, которые не имеют миниатюр полосы прогресса. - -Миниатюры полосы прогресса будут использовать такое же качество, как и текущее видео. - -Данная опция работает лучше с качеством видео 720p или ниже, и при использовании очень быстрого подключения к Интернету." - Включить старые миниатюры - Старые миниатюры полосы прогресса включены и показываются в мини окнах над полосой прогресса - Старые миниатюры полосы прогресса отключены и показываются в виде полноэкранных миниатюр - - - SponsorBlock - Включить SponsorBlock - SponsorBlock – это краудсорсинговая система для пропуска раздражающих фрагментов видео YouTube - Внешний вид - Показать кнопку голосования за сегмент - Кнопка голосования за сегмент показана - Кнопка голосования за сегмент скрыта - Использовать квадратный макет - Кнопки и элементы управления квадратные - Кнопки и элементы управления закругленные - - Стиль кнопки пропуска - Кнопка пропуска стилизована для минимальной ширины - Кнопка пропуска стилизована для лучшего внешнего вида - Автоскрытие кнопки пропуска - Кнопка пропуска автоматически скрывается через несколько секунд - Кнопка пропуска показывается для всего сегмента - Длительность показа кнопки пропуска - Длительность показа кнопок пропуска и перехода к основному моменту до автоматического скрытия - Показывать уведомление отмены пропуска - Всплывающее уведомление показано при автоматическом пропуске сегмента. Нажмите на всплывающее уведомление для отмены пропуска - Всплывающее уведомление скрыто - Длительность всплывающего уведомления при пропуске - Длительность показа всплывающего сообщения об отмене пропуска - 1 секунда - 2 секунды - 3 секунды - 4 секунды - 5 секунд - 6 секунд - 7 секунд - 8 секунд - 9 секунд - 10 секунд - Показать длительность видео без сегментов - Длина видео без учета всех сегментов показана на полосе прогресса - Полная длительность видео показана - Создание новых сегментов - Показать кнопку создания сегмента - Кнопка создания нового сегмента показана - Кнопка создания нового сегмента скрыта - Настроить шаг нового сегмента - Длительность (в миллисекундах) перемотки кнопками регулировки времени при создании новых сегментов - Значение должно быть положительным числом - Просмотреть инструкцию - Инструкция содержит правила и советы по созданию новых сегментов - Следуйте инструкциям - Перед созданием новых сегментов прочтите инструкции SponsorBlock - Уже прочитано - Показать - Общие настройки - Уведомление при недоступности API - Всплывающее уведомление при недоступности SponsorBlock показано - Всплывающее уведомление при недоступности SponsorBlock скрыто - Включить подсчет количества пропусков - Это позволяет системе лидеров SponsorBlock знать, сколько времени было сэкономлено. Сообщение отправляется на сервер каждый раз при пропуске сегмента - Подсчет количества пропусков отключен - Минимальная продолжительность сегмента - Сегменты короче данного значения (в секундах) не будут показаны или пропущены - Недопустимая длительность - Ваш идентификатор пользователя - Уникальный идентификатор пользователя должен быть конфиденциальным. Он как пароль - не должен никому передаваться. Имеющий доступ к нему может выдать себя за Вас - Уникальный идентификатор пользователя должен содержать не менее 30 символов - Изменить URL-адрес API - Адрес, используемый SponsorBlock для вызовов на сервер - URL-адрес API сброшен - URL-адрес API недействителен - URL-адрес API изменен - Резервное копирование настроек - Копировать - Ваша JSON конфигурация SponsorBlock, которая может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock - Ваша конфигурация JSON SponsorBlock может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock. Она включает в себя Ваш личный идентификатор пользователя. Подумайте дважды перед тем, как делиться ею с кем-либо - Настройки успешно импортированы - Не удалось импортировать: %s - Не удалось экспортировать: %s - "Ваши настройки SponsorBlock содержат уникальный идентификатор пользователя. + Дизлайки в Shorts скрыты + Показать дизлайки в процентах + Дизлайки показаны в процентах + Дизлайки показаны как число + + Компактная кнопка \"Лайк\" + Кнопка \"Лайк\" стилизована для минимальной ширины + Кнопка \"Лайк\" стилизована для лучшего внешнего вида + Показать примерное количество лайков + Для видео с отключенными лайками показывается примерное количество лайков + Примерное количество лайков скрыто + Уведомление при недоступности API + Всплывающее уведомление при недоступности Return YouTube Dislike показано + Всплывающее уведомление при недоступности Return YouTube Dislike скрыто + ReturnYouTubeDislike.com + Данные предоставлены Return YouTube Dislike API. Нажмите для дополнительной информации + + Статистика Return YouTube Dislike API этого устройства + Время ответа API, среднее + Время ответа API, минимальное + Время ответа API, максимальное + Время ответа API, последнее видео + Дизлайки временно недоступны – действует ограничение скорости клиентского API + API получает голоса, количество запросов + Сетевые запросы не выполнены + Выполнено %d сетевых запросов + API получает голоса, количество таймаутов + Сетевые запросы не имели таймаутов + Таймаут %d сетевых запросов + Ограничения скорости клиента API + Ограничения скорости клиента API не обнаружены + Ограничения скорости клиента API обнаружены %d раз + %d миллисекунд + + + SponsorBlock + Включить SponsorBlock + SponsorBlock – это краудсорсинговая система для пропуска раздражающих фрагментов видео YouTube + Внешний вид + Показать кнопку голосования за сегмент + Кнопка голосования за сегмент показана + Кнопка голосования за сегмент скрыта + Использовать квадратный макет + Кнопки и элементы управления квадратные + Кнопки и элементы управления закругленные + + Стиль кнопки пропуска + Кнопка пропуска стилизована для минимальной ширины + Кнопка пропуска стилизована для лучшего внешнего вида + Автоскрытие кнопки пропуска + Кнопка пропуска автоматически скрывается через несколько секунд + Кнопка пропуска показывается для всего сегмента + Длительность показа кнопки пропуска + Длительность показа кнопок пропуска и перехода к основному моменту до автоматического скрытия + Показывать уведомление отмены пропуска + Всплывающее уведомление показано при автоматическом пропуске сегмента. Нажмите на всплывающее уведомление для отмены пропуска + Всплывающее уведомление скрыто + Длительность всплывающего уведомления при пропуске + Длительность показа всплывающего сообщения об отмене пропуска + 1 секунда + 2 секунды + 3 секунды + 4 секунды + 5 секунд + 6 секунд + 7 секунд + 8 секунд + 9 секунд + 10 секунд + Показать длительность видео без сегментов + Длина видео без учета всех сегментов показана на полосе прогресса + Полная длительность видео показана + Создание новых сегментов + Показать кнопку создания сегмента + Кнопка создания нового сегмента показана + Кнопка создания нового сегмента скрыта + Настроить шаг нового сегмента + Длительность (в миллисекундах) перемотки кнопками регулировки времени при создании новых сегментов + Значение должно быть положительным числом + Просмотреть инструкцию + Инструкция содержит правила и советы по созданию новых сегментов + Следуйте инструкциям + Перед созданием новых сегментов прочтите инструкции SponsorBlock + Уже прочитано + Показать + Общие настройки + Уведомление при недоступности API + Всплывающее уведомление при недоступности SponsorBlock показано + Всплывающее уведомление при недоступности SponsorBlock скрыто + Включить подсчет количества пропусков + Это позволяет системе лидеров SponsorBlock знать, сколько времени было сэкономлено. Сообщение отправляется на сервер каждый раз при пропуске сегмента + Подсчет количества пропусков отключен + Минимальная продолжительность сегмента + Сегменты короче данного значения (в секундах) не будут показаны или пропущены + Недопустимая длительность + Ваш идентификатор пользователя + Уникальный идентификатор пользователя должен быть конфиденциальным. Он как пароль - не должен никому передаваться. Имеющий доступ к нему может выдать себя за Вас + Уникальный идентификатор пользователя должен содержать не менее 30 символов + Изменить URL-адрес API + Адрес, используемый SponsorBlock для вызовов на сервер + URL-адрес API сброшен + URL-адрес API недействителен + URL-адрес API изменен + Резервное копирование настроек + Копировать + Ваша JSON конфигурация SponsorBlock, которая может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock + Ваша конфигурация JSON SponsorBlock может быть импортирована или экспортирована в ReVanced и другие платформы SponsorBlock. Она включает в себя Ваш личный идентификатор пользователя. Подумайте дважды перед тем, как делиться ею с кем-либо + Настройки успешно импортированы + Не удалось импортировать: %s + Не удалось экспортировать: %s + "Ваши настройки SponsorBlock содержат уникальный идентификатор пользователя. Ваш идентификатор пользователя как пароль, им не стоит ни с кем делиться. " - Не показывать снова - Изменить поведение сегмента - Спонсорская реклама - Рекламные интеграции, реферальные ссылки и прямая реклама. Не для саморекламы или рекомендаций различных событий/создателей/сайтов/продуктов, которые нравятся автору видео - Бесплатная реклама/самореклама - Подобно \"Спонсорской рекламе\", за исключением неоплачиваемой рекламы или саморекламы. Включает разделы о товарах, пожертвованиях или информации о том, с кем сотрудничал автор - Напоминание о взаимодействии (подписка) - Короткое напоминание поставить лайк, подписаться на канал или соцсети посреди видеоролика. Если эта вставка длительная или о чем-то конкретном, она должна классифицироваться как самореклама - Основной момент - Часть видео, которая интересна большинству людей - Пауза/Заставка - Интервал без фактического содержания. Может быть паузой, статическим кадром или повторяющейся анимацией. Не включает переходы, содержащие информацию - Конечные заставки / Титры - Титры или время появления конечных заставок YouTube. Не для выводов с информацией - Вступление / Приветствие - Трейлеры с закадровым голосом для предстоящего видео, приветствия и прощания. Не включает разделы, добавляющие дополнительный контент - Предпросмотр / Пересказ - Фрагменты, повторяющие текущее видео или предыдущие серии - Отвлеченные темы / Шутки - Отвлеченные сцены или шутки, которые не требуются для понимания основного содержания видео. Не включает разделы, предоставляющие контекст или фоновые детали - Музыка: сегмент без музыки - Только для использования в музыкальных видеороликах. Разделы музыкальных видео без музыки, которые еще не охвачены другой категорией - Пропустить - Основной момент - Пропустить спонсорскую рекламу - Пропустить промо - Пропустить взаимодействие - Перейти к основному моменту - Пропустить вступление - Пропустить паузу - Пропустить паузу - Пропустить концовку - Пропустить вступление - Пропустить предпросмотр - Пропустить предпросмотр - Пропустить пересказ - Пропустить отвлеченные темы - Пропустить сегмент без музыки - Пропустить сегмент - Спонсорская реклама пропущена - Самореклама пропущена - Назойливое напоминание пропущено - Пропущено к основному моменту - Вступление пропущено - Пауза пропущена - Пауза пропущена - Концовка пропущена - Вступление пропущено - Предпросмотр пропущен - Предпросмотр пропущен - Пересказ пропущен - Отвлеченные темы пропущены - Сегмент без музыки пропущен - Неподтвержденный сегмент пропущен - Несколько сегментов пропущены - Пропускать автоматически - Пропускать автоматически один раз - Показать кнопку пропуска - Показать в полосе прогресса - Отключить - Невозможно отправить сегмент: %s - SponsorBlock временно не работает - Невозможно отправить сегмент (статус: %1$d %2$s) - Невозможно отправить сегмент. Частота ограничена (слишком много от одного пользователя или IP) - Невозможно отправить сегмент: %s - "Невозможно отправить сегмент. + Не показывать снова + Изменить поведение сегмента + Спонсорская реклама + Рекламные интеграции, реферальные ссылки и прямая реклама. Не для саморекламы или рекомендаций различных событий/создателей/сайтов/продуктов, которые нравятся автору видео + Бесплатная реклама/самореклама + Подобно \"Спонсорской рекламе\", за исключением неоплачиваемой рекламы или саморекламы. Включает разделы о товарах, пожертвованиях или информации о том, с кем сотрудничал автор + Напоминание о взаимодействии (подписка) + Короткое напоминание поставить лайк, подписаться на канал или соцсети посреди видеоролика. Если эта вставка длительная или о чем-то конкретном, она должна классифицироваться как самореклама + Основной момент + Часть видео, которая интересна большинству людей + Пауза/Заставка + Интервал без фактического содержания. Может быть паузой, статическим кадром или повторяющейся анимацией. Не включает переходы, содержащие информацию + Конечные заставки / Титры + Титры или время появления конечных заставок YouTube. Не для выводов с информацией + Вступление / Приветствие + Трейлеры с закадровым голосом для предстоящего видео, приветствия и прощания. Не включает разделы, добавляющие дополнительный контент + Предпросмотр / Пересказ + Фрагменты, повторяющие текущее видео или предыдущие серии + Отвлеченные темы / Шутки + Отвлеченные сцены или шутки, которые не требуются для понимания основного содержания видео. Не включает разделы, предоставляющие контекст или фоновые детали + Музыка: сегмент без музыки + Только для использования в музыкальных видеороликах. Разделы музыкальных видео без музыки, которые еще не охвачены другой категорией + Пропустить + Основной момент + Пропустить спонсорскую рекламу + Пропустить промо + Пропустить взаимодействие + Перейти к основному моменту + Пропустить вступление + Пропустить паузу + Пропустить паузу + Пропустить концовку + Пропустить вступление + Пропустить предпросмотр + Пропустить предпросмотр + Пропустить пересказ + Пропустить отвлеченные темы + Пропустить сегмент без музыки + Пропустить сегмент + Спонсорская реклама пропущена + Самореклама пропущена + Назойливое напоминание пропущено + Пропущено к основному моменту + Вступление пропущено + Пауза пропущена + Пауза пропущена + Концовка пропущена + Вступление пропущено + Предпросмотр пропущен + Предпросмотр пропущен + Пересказ пропущен + Отвлеченные темы пропущены + Сегмент без музыки пропущен + Неподтвержденный сегмент пропущен + Несколько сегментов пропущены + Пропускать автоматически + Пропускать автоматически один раз + Показать кнопку пропуска + Показать в полосе прогресса + Отключить + Невозможно отправить сегмент: %s + SponsorBlock временно не работает + Невозможно отправить сегмент (статус: %1$d %2$s) + Невозможно отправить сегмент. Частота ограничена (слишком много от одного пользователя или IP) + Невозможно отправить сегмент: %s + "Невозможно отправить сегмент. Уже существует" - Сегмент успешно отправлен - - SponsorBlock временно недоступен (время API истекло) - SponsorBlock временно недоступен (статус %d) - SponsorBlock временно недоступен - Невозможно проголосовать за сегмент (время API истекло) - Невозможно проголосовать за сегмент (статус: %1$d %2$s) - Невозможно проголосовать за сегмент: %s - Голос \"за\" - Голос \"против\" - Изменить категорию - Нет сегментов для голосования - - %1$s до %2$s - Выбрать категорию сегмента - Категория отключена в настройках. Включите категорию для отправки. - Новый сегмент SponsorBlock - Установить %s в качестве начала или конца нового сегмента? - Начало - Конец - Сейчас - Время начала сегмента - Время окончания сегмента - Верно ли выбрано время? - "Сегмент от + Сегмент успешно отправлен + + SponsorBlock временно недоступен (время API истекло) + SponsorBlock временно недоступен (статус %d) + SponsorBlock временно недоступен + Невозможно проголосовать за сегмент (время API истекло) + Невозможно проголосовать за сегмент (статус: %1$d %2$s) + Невозможно проголосовать за сегмент: %s + Голос \"за\" + Голос \"против\" + Изменить категорию + Нет сегментов для голосования + + %1$s до %2$s + Выбрать категорию сегмента + Категория отключена в настройках. Включите категорию для отправки. + Новый сегмент SponsorBlock + Установить %s в качестве начала или конца нового сегмента? + Начало + Конец + Сейчас + Время начала сегмента + Время окончания сегмента + Верно ли выбрано время? + "Сегмент от %1$s до @@ -1291,47 +1376,47 @@ Second \"item\" text" (%3$s) Готов к отправке?" - Начало должно быть перед окончанием - Сначала отметьте два места на шкале времени - Просмотрите сегмент и убедитесь, что пропуск происходит плавно - Изменить время сегмента вручную - Вы хотите изменить время начала или окончания сегмента? - Указано неверное время - Статистика - - Статистика временно недоступна (API отключен) - Загрузка... - SponsorBlock отключен - Ваше имя пользователя: <b>%s</b> - Нажмите для изменения Вашего имени пользователя - Невозможно изменить имя пользователя: Статус: %1$d %2$s - Имя пользователя успешно изменено - Ваша репутация - <b>%.2f</b> - Вы создали <b>%s</b> сегментов - Нажмите здесь для просмотра Ваших сегментов - Таблица лидеров SponsorBlock - Вы избавили людей от <b>%s</b> сегментов - Нажмите для просмотра глобальной статистики и лучших участников - Это <b>%s</b> их жизни.<br>Нажмите для просмотра таблицы лидеров - Вы пропустили <b>%s</b> сегментов - Это <b>%s</b> - Сбросить счетчик пропущенных сегментов? - %1$s часов %2$s минут - %1$s минут(ы) %2$s секунд(ы) - %s секунд - Непрозрачность: - Цвет: - Об интеграции - sponsor.ajay.app - Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ - - - Макет интерфейса - По умолчанию - Телефонный - Планшетный - Автомобильный - "Изменения включают: + Начало должно быть перед окончанием + Сначала отметьте два места на шкале времени + Просмотрите сегмент и убедитесь, что пропуск происходит плавно + Изменить время сегмента вручную + Вы хотите изменить время начала или окончания сегмента? + Указано неверное время + Статистика + + Статистика временно недоступна (API отключен) + Загрузка... + SponsorBlock отключен + Ваше имя пользователя: <b>%s</b> + Нажмите для изменения Вашего имени пользователя + Невозможно изменить имя пользователя: Статус: %1$d %2$s + Имя пользователя успешно изменено + Ваша репутация - <b>%.2f</b> + Вы создали <b>%s</b> сегментов + Нажмите здесь для просмотра Ваших сегментов + Таблица лидеров SponsorBlock + Вы избавили людей от <b>%s</b> сегментов + Нажмите для просмотра глобальной статистики и лучших участников + Это <b>%s</b> их жизни.<br>Нажмите для просмотра таблицы лидеров + Вы пропустили <b>%s</b> сегментов + Это <b>%s</b> + Сбросить счетчик пропущенных сегментов? + %1$s часов %2$s минут + %1$s минут(ы) %2$s секунд(ы) + %s секунд + Непрозрачность: + Цвет: + Об интеграции + sponsor.ajay.app + Данные предоставлены SponsorBlock API. Нажмите для дополнительной информации и просмотра загрузок для других платформ + + + Макет интерфейса + По умолчанию + Телефонный + Планшетный + Автомобильный + "Изменения включают: Планшетный макет • Посты сообщества скрыты @@ -1339,329 +1424,331 @@ Second \"item\" text" Автомобильный макет • Shorts открываются в стандартном плеере • Лента организована по темам и каналам" - - - Подменить версию приложения - Версия приложения подменена - Версия приложения не подменена - "Версия приложения будет подменена на более раннюю версию YouTube. + + + Подменить версию приложения + Версия приложения подменена + Версия приложения не подменена + "Версия приложения будет подменена на более раннюю версию YouTube. Это изменит вид и функции приложения, но могут случиться неизвестные побочные эффекты. Если позже данный параметр будет отключен, рекомендуется очистить данные приложения для предотвращения проблем с пользовательским интерфейсом." - Подменить версию приложения на - 20.13.41 - Восстановить не свернутую панель действий видео - 20.05.46 - Восстановление функциональности транскрипции - 19.35.36 - Восстановление старых иконок плеера Shorts - 19.01.34 - Восстановление старых иконок панели навигации - - - Изменить начальную страницу - По умолчанию - Все подписки - Просмотр каналов - Курсы / Обучение - Навигатор - Мода и Красота - Игры - История просмотров - Библиотека - Понравившиеся видео - Прямые трансляции - Фильмы - Музыка - Новости - Уведомления - Плейлисты - Поиск - Покупки - Шортс - Спорт - Подписки - Популярные - Виртуальная реальность - Смотреть позже - Ваши клипы - Всегда изменять начальную страницу - "Начальная страница изменяется всегда + Подменить версию приложения на + 20.13.41 - Восстановить не свернутую панель действий видео + 20.05.46 - Восстановление функциональности транскрипции + + + Изменить начальную страницу + По умолчанию + Все подписки + Просмотр каналов + Курсы / Обучение + Навигатор + Мода и Красота + Игры + История просмотров + Библиотека + Понравившиеся видео + Прямые трансляции + Фильмы + Музыка + Новости + Уведомления + Плейлисты + Поиск + Покупки + Шортс + Спорт + Подписки + Популярные + Виртуальная реальность + Смотреть позже + Ваши клипы + Всегда изменять начальную страницу + "Начальная страница изменяется всегда Ограничение: использование кнопки \"Назад\" на панели инструментов может не работать" - Начальная страница изменяется только при запуске приложения - - - Отключить возобновление плеера Shorts - Возобновление плеера Shorts при запуске приложения отключено - Возобновление плеера Shorts при запуске приложения включено - - - Плеер для открытия Shorts - Плеер Shorts - Стандартный плеер - Стандартный полноэкранный плеер - - - Автовоспроизведение Shorts - Shorts будут автоматически воспроизводиться одно за другим - Shorts будут повторяться - Автовоспроизведение Shorts в фоне - Shorts будут автоматически воспроизводиться одно за другим в фоновом режиме - Shorts будут повторяться в фоновом режиме - - - Миниплеер - Изменить стиль свернутого миниплеера - Тип миниплеера - Отключено - Стандартный - Минимальный - Планшетный - Современный 1 - Современный 2 - Современный 3 - Современный 4 - Отключить закругление углов - Углы миниплеера квадратны - Углы миниплеера закруглены - Включить двойное нажатие и изменение размера щипком - "Двойное нажатие и изменение размера щипком включены + Начальная страница изменяется только при запуске приложения + + + Отключить возобновление плеера Shorts + Возобновление плеера Shorts при запуске приложения отключено + Возобновление плеера Shorts при запуске приложения включено + + + Плеер для открытия Shorts + Плеер Shorts + Стандартный плеер + Стандартный полноэкранный плеер + + + Автовоспроизведение Shorts + Shorts будут автоматически воспроизводиться одно за другим + Shorts будут повторяться + Автовоспроизведение Shorts в фоне + Shorts будут автоматически воспроизводиться одно за другим в фоновом режиме + Shorts будут повторяться в фоновом режиме + + + Миниплеер + Изменить стиль свернутого миниплеера + Тип миниплеера + Отключено + Стандартный + Минимальный + Планшетный + Современный 1 + Современный 2 + Современный 3 + Современный 4 + Отключить закругление углов + Углы миниплеера квадратны + Углы миниплеера закруглены + Включить двойное нажатие и изменение размера щипком + "Двойное нажатие и изменение размера щипком включены • Двойное нажатие для увеличения размера миниплеера • Двойное нажатие еще раз для восстановления исходного размера" - Двойное нажатие и изменение размера щипком отключены - Отключить перетаскивание - Перетаскивание отключено - "Перетаскивание включено + Двойное нажатие и изменение размера щипком отключены + Отключить перетаскивание + Перетаскивание отключено + "Перетаскивание включено Миниплеер можно перетащить в любой угол экрана" - Отключить жест горизонтального перетаскивания - Жест горизонтального перетаскивания отключен - "Жест горизонтального перетаскивания включен + Отключить жест горизонтального перетаскивания + Жест горизонтального перетаскивания отключен + "Жест горизонтального перетаскивания включен Миниплеер можно перетаскивать за пределы экрана влево или вправо" - Скрыть кнопки миниплеера - Кнопки миниплеера скрыты - Кнопки миниплеера показаны - Скрыть кнопки разворачивания и закрытия - "Кнопки разворачивания и закрытия скрыты + Скрыть кнопки миниплеера + Кнопки миниплеера скрыты + Кнопки миниплеера показаны + Скрыть кнопки разворачивания и закрытия + "Кнопки разворачивания и закрытия скрыты Проведите по миниплееру для его разворачивания или закрытия" - Кнопки разворачивания и закрытия показаны - Скрыть подтексты - Подтексты в миниплеере скрыты - Подтексты в миниплеере показаны - Скрыть кнопки перемотки - Кнопки перемотки вперед и назад в миниплеере скрыты - Кнопки перемотки вперед и назад в миниплеере показаны - Начальный размер - Начальный размер миниплеера на экране, в пикселях - Размер в пикселях должен быть между %1$s и %2$s - Затемнение миниплеера при нажатии - Значение затемнения при нажатии на миниплеер от 0 до 100, где 0 - это прозрачно - Значение затемнения миниплеера должно быть от 0 до 100 - - - Включить градиентный фон экрана загрузки - Градиентный фон экрана загрузки макета включен - Сплошной фон экрана загрузки макета включен - Стиль экрана заставки - Цветной - Черно-белый - Включить кастомный цвет полосы прогресса - Кастомный цвет полосы прогресса включен - Оригинальный цвет полосы прогресса включен - Кастомный цвет полосы прогресса - Цвет полосы прогресса - Кастомный вторичный цвет полосы прогресса - Вторичный цвет полосы прогресса - Неверное значение цвета полосы прогресса - - - YouTube ReVanced - YT ReVanced - YT - - - Логотип заголовка - По умолчанию - Обычный - Премиум - ReVanced - - ReVanced минимальный - Кастомный - - - Обход региональных ограничений изображений - Использование хоста изображений yt4.ggpht.com - "Использование оригинального хоста изображений + Кнопки разворачивания и закрытия показаны + Скрыть подтексты + Подтексты в миниплеере скрыты + Подтексты в миниплеере показаны + Скрыть кнопки перемотки + Кнопки перемотки вперед и назад в миниплеере скрыты + Кнопки перемотки вперед и назад в миниплеере показаны + Начальный размер + Начальный размер миниплеера на экране, в пикселях + Размер в пикселях должен быть между %1$s и %2$s + Затемнение миниплеера при нажатии + Значение затемнения при нажатии на миниплеер от 0 до 100, где 0 - это прозрачно + Значение затемнения миниплеера должно быть от 0 до 100 + + + Включить градиентный фон экрана загрузки + Градиентный фон экрана загрузки макета включен + Сплошной фон экрана загрузки макета включен + Стиль экрана заставки + Отключено + Цветной + Черно-белый + Включить кастомный цвет полосы прогресса + Кастомный цвет полосы прогресса включен + Оригинальный цвет полосы прогресса включен + Кастомный цвет полосы прогресса + Цвет полосы прогресса + Кастомный вторичный цвет полосы прогресса + Вторичный цвет полосы прогресса + Неверное значение цвета полосы прогресса + + + YouTube ReVanced + YT ReVanced + YT + + + Логотип заголовка + По умолчанию + Обычный + Премиум + ReVanced + + ReVanced минимальный + Кастомный + + + Обход региональных ограничений изображений + Использование хоста изображений yt4.ggpht.com + "Использование оригинального хоста изображений Активация данной опции может исправить недостающие изображения, которые заблокированы в некоторых регионах " - - - - Вкладка \"Главная\" - - Вкладка \"Подписки\" - - Вкладка \"Вы\" - Плейлисты плеера и рекомендации - Результаты поиска - Оригинальные миниатюры - DeArrow и оригинальные миниатюры - DeArrow и захват кадра - Захват кадра - DeArrow - "DeArrow предоставляет краудсорсинговые миниатюры (часто более релевантные) для видео YouTube + + + + Вкладка \"Главная\" + + Вкладка \"Подписки\" + + Вкладка \"Вы\" + Плейлисты плеера и рекомендации + Результаты поиска + Оригинальные миниатюры + DeArrow и оригинальные миниатюры + DeArrow и захват кадра + Захват кадра + DeArrow + "DeArrow предоставляет краудсорсинговые миниатюры (часто более релевантные) для видео YouTube При активации URL-адреса видео (и никакие другие данные) будут отправлены на сервер API. При отсутствии миниатюр DeArrow в видео показываются оригинальные или миниатюры захвата кадра Нажмите для дополнительной информации о DeArrow" - Показать всплывающее уведомление при недоступности API - Всплывающее уведомление при недоступности DeArrow показано - Всплывающее уведомление при недоступности DeArrow скрыто - Конечная точка DeArrow API - URL-адрес конечной точки кэша миниатюр DeArrow - Захват кадра из видео - Кадры взяты из начала/середины/конца каждого видео. Эти изображения уже есть в YouTube и внешний API не используется - Быстрый захват кадра - Используется среднее качество кадра. Миниатюры будут грузиться быстрее, но возможна их потеря у трансляций, премьер или очень старых видео - Используется высокое качество кадра - Время видео для взятия кадра - Начало видео - Середина видео - Конец видео - - DeArrow временно недоступен (код статуса: %s) - DeArrow временно недоступен - - - Показать объявления ReVanced - Объявления ReVanced при запуске приложения показаны - Объявления ReVanced при запуске приложения скрыты - Показать объявления ReVanced при запуске приложения - Не удалось подключиться к поставщику объявлений - Закрыть - - - Включить повтор воспроизведения - Видео будет повторяться - Видео не будет повторяться - - - Показать кнопку повтора воспроизведения - Кнопка повтора воспроизведения показана - Кнопка повтора воспроизведения скрыта - Повтор видео включен - Повтор видео выключен - - - Пауза при прерывании звука - Воспроизведение приостанавливается, когда играет другой звук (например, навигация) - Громкость снижается при воспроизведении другого звука - - - Подменить размеры устройства - "Размеры устройства подменены + Показать всплывающее уведомление при недоступности API + Всплывающее уведомление при недоступности DeArrow показано + Всплывающее уведомление при недоступности DeArrow скрыто + Конечная точка DeArrow API + URL-адрес конечной точки кэша миниатюр DeArrow + Захват кадра из видео + Кадры взяты из начала/середины/конца каждого видео. Эти изображения уже есть в YouTube и внешний API не используется + Быстрый захват кадра + Используется среднее качество кадра. Миниатюры будут грузиться быстрее, но возможна их потеря у трансляций, премьер или очень старых видео + Используется высокое качество кадра + Время видео для взятия кадра + Начало видео + Середина видео + Конец видео + + DeArrow временно недоступен (код статуса: %s) + DeArrow временно недоступен + + + Показать объявления ReVanced + Объявления ReVanced при запуске приложения показаны + Объявления ReVanced при запуске приложения скрыты + Показать объявления ReVanced при запуске приложения + Не удалось подключиться к поставщику объявлений + Закрыть + + + Включить повтор воспроизведения + Видео будет повторяться + Видео не будет повторяться + + + Показать кнопку повтора воспроизведения + Кнопка повтора воспроизведения показана + Кнопка повтора воспроизведения скрыта + Повтор видео включен + Повтор видео выключен + + + Пауза при прерывании звука + Воспроизведение приостанавливается, когда играет другой звук (например, навигация) + Громкость снижается при воспроизведении другого звука + + + Подменить размеры устройства + "Размеры устройства подменены Более высокие качества видео могут быть разблокированы, однако при этом возможны заикания видео при воспроизведении, высокое потребление батареи и неизвестные побочные эффекты" - "Размеры устройства не подменены + "Размеры устройства не подменены Активация данной опции может разблокировать более высокие качества видео" - Активация данной опции может привести к заиканиям видео при воспроизведении, высокому потреблению батареи и неизвестным побочным эффектам. - - - Виброотклик - Изменить виброотклик - Отключить виброотклик между эпизодов - Виброотклик между эпизодов отключен - Виброотклик между эпизодов включен - Отключить виброотклик при покадровой перемотке - Виброотклик при покадровой перемотке отключен - Виброотклик при покадровой перемотке включен - Отключить виброотклик отмены перемотки - Виброотклик отмены перемотки отключен - Виброотклик отмены перемотки включен - Отключить виброотклик при масштабировании - Виброотклик при масштабировании отключен - Виброотклик при масштабировании включен - - - Если Вы недавно изменили данные для входа в свою учетную запись, удалите и переустановите MicroG. - - - Обход перенаправлений URL-адресов - Перенаправления URL-адресов (youtube.com/redirect) обходятся и исходные URL-адреса открываются напрямую - Перенаправления URL-адресов (youtube.com/redirect) не обходятся и исходные URL-адреса не открываются напрямую - - - Открывать ссылки в браузере - Ссылки открываются во внешнем браузере - Ссылки открываются во встроенном браузере - - - - Авто - Запоминать изменения качества видео - Изменения качества воспроизведения применяются ко всем видео - Изменения качества воспроизведения применяются только к текущему видео - Показать всплывающее уведомление при изменении качества видео - Всплывающее уведомление при изменении качества видео по умолчанию показано - Всплывающее уведомление при изменении качества видео по умолчанию скрыто - Качество видео по умолчанию в Wi-Fi сети - Качество видео по умолчанию в мобильной сети - Запоминать изменения качества Shorts - Изменения качества воспроизведения применяются ко всем Shorts - Изменения качества воспроизведения применяются только к текущему Short - Качество Shorts по умолчанию в Wi-Fi сети - Качество Shorts по умолчанию в мобильной сети - мобильной сети - Wi-Fi - Качество в %1$s изменено на: %2$s - Качество Shorts в %1$s изменено на: %2$s - - - Показать кнопку скорости воспроизведения - Кнопка диалога скорости показана. Нажмите и удерживайте, чтобы сбросить скорость воспроизведения до значения по умолчанию - Кнопка диалога скорости не показана - - - Показать кнопку качества видео - Кнопка качества видео показана. Нажмите и удерживайте, чтобы сбросить качество до значения по умолчанию - Кнопка качества видео скрыта - - - Показать кастомное меню скорости - Кастомное меню скорости воспроизведения показано - Кастомное меню скорости воспроизведения скрыто - Восстановить старое меню скорости воспроизведения - Старое меню скорости показано - Современное меню скорости показано - Кастомные скорости воспроизведения - Добавить или изменить кастомные скорости воспроизведения - Кастомные скорости должны быть меньше, чем %s - Недопустимые кастомные скорости воспроизведения - Автоматически - Кастомная скорость при нажатии и удержании - Значение кастомной скорости воспроизведения при нажатии и удержании от 0 до 8 - - - Запоминать изменения скорости воспроизведения - Изменения скорости воспроизведения применяются ко всем видео - Изменения скорости воспроизведения применяются только к текущему видео - Показать всплывающее уведомление при изменении скорости воспроизведения - Всплывающее уведомление при изменении скорости воспроизведения по умолчанию показано - Всплывающее уведомление при изменении скорости воспроизведения по умолчанию скрыто - Скорость воспроизведения по умолчанию - Скорость изменена на: %s - - - Отключить HDR видео - HDR видео отключено - HDR видео включено - Принудительное использование AVC (H.264) - Видеокодек принудительно установлен на AVC (H.264) - Видеокодек определяется автоматически - "Преимущества: + Активация данной опции может привести к заиканиям видео при воспроизведении, высокому потреблению батареи и неизвестным побочным эффектам. + + + Виброотклик + Изменить виброотклик + Отключить виброотклик между эпизодов + Виброотклик между эпизодов отключен + Виброотклик между эпизодов включен + Отключить виброотклик при покадровой перемотке + Виброотклик при покадровой перемотке отключен + Виброотклик при покадровой перемотке включен + Отключить виброотклик отмены перемотки + Виброотклик отмены перемотки отключен + Виброотклик отмены перемотки включен + Отключить виброотклик при долгом нажатии + Виброотклик при долгом нажатии отключен + Виброотклик при долгом нажатии включен + Отключить виброотклик при масштабировании + Виброотклик при масштабировании отключен + Виброотклик при масштабировании включен + + + Если Вы недавно изменили данные для входа в свою учетную запись, удалите и переустановите MicroG. + + + Обход перенаправлений URL-адресов + Перенаправления URL-адресов (youtube.com/redirect) обходятся и исходные URL-адреса открываются напрямую + Перенаправления URL-адресов (youtube.com/redirect) не обходятся и исходные URL-адреса не открываются напрямую + + + Открывать ссылки в браузере + Ссылки открываются во внешнем браузере + Ссылки открываются во встроенном браузере + + + + Авто + Запоминать изменения качества видео + Изменения качества воспроизведения применяются ко всем видео + Изменения качества воспроизведения применяются только к текущему видео + Показать всплывающее уведомление при изменении качества видео + Всплывающее уведомление при изменении качества видео по умолчанию показано + Всплывающее уведомление при изменении качества видео по умолчанию скрыто + Качество видео по умолчанию в Wi-Fi сети + Качество видео по умолчанию в мобильной сети + Запоминать изменения качества Shorts + Изменения качества воспроизведения применяются ко всем Shorts + Изменения качества воспроизведения применяются только к текущему Short + Качество Shorts по умолчанию в Wi-Fi сети + Качество Shorts по умолчанию в мобильной сети + мобильной сети + Wi-Fi + Качество в %1$s изменено на: %2$s + Качество Shorts в %1$s изменено на: %2$s + + + Показать кнопку скорости воспроизведения + Кнопка диалога скорости показана. Нажмите и удерживайте, чтобы сбросить скорость воспроизведения до значения по умолчанию + Кнопка диалога скорости не показана + + + Показать кнопку качества видео + Кнопка качества видео показана. Нажмите и удерживайте, чтобы сбросить качество до значения по умолчанию + Кнопка качества видео скрыта + + + Показать кастомное меню скорости + Кастомное меню скорости воспроизведения показано + Кастомное меню скорости воспроизведения скрыто + Восстановить старое меню скорости воспроизведения + Старое меню скорости показано + Современное меню скорости показано + Кастомные скорости воспроизведения + Добавить или изменить кастомные скорости воспроизведения + Кастомные скорости должны быть меньше, чем %s + Недопустимые кастомные скорости воспроизведения + Автоматически + Кастомная скорость при нажатии и удержании + Значение кастомной скорости воспроизведения при нажатии и удержании от 0 до 8 + + + Запоминать изменения скорости воспроизведения + Изменения скорости воспроизведения применяются ко всем видео + Изменения скорости воспроизведения применяются только к текущему видео + Показать всплывающее уведомление при изменении скорости воспроизведения + Всплывающее уведомление при изменении скорости воспроизведения по умолчанию показано + Всплывающее уведомление при изменении скорости воспроизведения по умолчанию скрыто + Скорость воспроизведения по умолчанию + Скорость изменена на: %s + + + Отключить HDR видео + HDR видео отключено + HDR видео включено + Принудительное использование AVC (H.264) + Видеокодек принудительно установлен на AVC (H.264) + Видеокодек определяется автоматически + "Преимущества: • Может улучшить срок службы батареи • Может восстановить отсутствующие разрешения видео на старых устройствах @@ -1670,182 +1757,188 @@ Second \"item\" text" • Воспроизведение видео будет использовать больше интернет-трафика, чем VP9 или AV1 • HDR-видео не будут использовать AVC • Некоторые устройства не могут принудительно использовать AVC" - - - Показать расширенное меню качества видео - Расширенное меню качества видео показано - Расширенное меню качества видео скрыто - - - Включить перемотку видео слайдом - Перемотка видео слайдом включена - Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) - - - Разрешить Android VR AV1 - "Видеокодек: AVC (H.264), VP9 или AV1 + + + Показать расширенное меню качества видео + Расширенное меню качества видео показано + Расширенное меню качества видео скрыто + + + Скрыть параметры Премиум качества + Параметры Премиум качества скрыты + Параметры Премиум качества показаны + + + Включить перемотку видео слайдом + Перемотка видео слайдом включена + Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) + + + Разрешить Android VR AV1 + "Видеокодек: AVC (H.264), VP9 или AV1 Воспроизведение может зависать или пропускать кадры" - Видеокодек AVC (H.264) или VP9 - "Включение этой опции может использовать программное декодирование AV1. + Видеокодек AVC (H.264) или VP9 + "Включение этой опции может использовать программное декодирование AV1. Воспроизведение видео с AV1 может прерываться или пропускать кадры." - Побочные эффекты подмены - • Клиент экспериментальный и может перестать работать в любое время - • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах - • Пункт \"Звуковая дорожка\" отсутствует - • Отсутствует видеокодек AV1 - • Постоянный уровень громкости недоступен - • Видео для детей могут не воспроизводиться при выходе из системы или в режиме инкогнито - - • Принудительная оригинальная звуковая дорожка недоступна - Показать в \"Статистике для сисадминов\" - Тип клиента в \"Статистике для сисадминов\" показан - Тип клиента в \"Статистике для сисадминов\" скрыт - - - - - YT Music ReVanced - ReVanced Музыка - Музыка - - - Информация - Настройки рекламы - Общие настройки - Настройки плеера - Прочие настройки - - - Скрыть видеорекламу - Видеореклама в плеере скрыта - Видеореклама в плеере показана - - - Включить постоянный повтор - Постоянный повтор включен - Постоянный повтор отключен - - - Скрыть кнопку \"Трансляция\" - Кнопка \"Трансляция\" в плеере скрыта - Кнопка \"Трансляция\" в плеере показана - Скрыть кнопку истории - Кнопка истории скрыта - Кнопка истории показана - Скрыть кнопку уведомлений - Кнопка уведомлений скрыта - Кнопка уведомлений показана - Скрыть кнопку поиска - Кнопка поиска скрыта - Кнопка поиска показана - - - Скрыть панель категорий - Панель категорий скрыта - Панель категорий показана - - - Изменить цвет мини-плеера - Цвет мини-плеера соответствует полноэкранному плееру - Мини-плеер использует цвет по умолчанию - - - Панель навигации - Скрыть или изменить кнопки панели навигации - - Скрыть кнопку \"Главная\" - Кнопка \"Главная\" в панели навигации скрыта - Кнопка \"Главная\" в панели навигации показана - - Скрыть Сэмплы - Кнопка \"Семплы\" скрыта - Кнопка \"Семплы\" показана - - Скрыть кнопку \"Навигация\" - Кнопка \"Обзор\" скрыта - Кнопка \"Обзор\" показана - - Скрыть Библиотеку - Кнопка \"Библиотека\" скрыта - Кнопка \"Библиотека\" показана - - Скрыть кнопку \"Подписки\" - Кнопка \"Премиум\" скрыта - Кнопка \"Премиум\" показана - Скрыть панель навигации - Панель навигации скрыта - Панель навигации показана - Скрыть подписи кнопок навигации - Подписи кнопок навигации скрыты - Подписи кнопок навигации показаны - - - Скрыть ярлык \"Купить Music Premium\" - Ярлык \"Купить Music Premium\" скрыт - Ярлык \"Купить Music Premium\" показан - - - Скрыть кнопку \"Подписка\" - Кнопка \"Подписка\" скрыта - Кнопка \"Подписка\" показана - - - - - Заблокировать аудиорекламу - Аудиореклама заблокирована - Аудиореклама разблокирована - - - %s недоступен, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. - %s вернул ошибку, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. - Заблокировать встроенную видеорекламу - Отключено - Luminous прокси - PurpleAdBlock прокси - - - Заблокировать видеорекламу - Видеореклама заблокирована - Видеореклама разблокирована - - - Сообщение удалено - Показать удаленные сообщения - Не показывать удаленные сообщения - Скрыть удаленные сообщения за спойлером - Показать удаленные сообщения как перекрестный текст - - - Собирать Баллы канала автоматически - Баллы канала собираются автоматически - Баллы канала не собираются автоматически - - - - Включить режим отладки Twitch - Режим отладки Twitch включен (не рекомендуется) - Режим отладки Twitch отключен - - - Настройки ReVanced - Информация - О ReVanced - Блокировка рекламы - Настройки блокировки рекламы - Чат - Настройки чата - Прочие - Прочие настройки - Общие настройки - Другие настройки - Реклама на стороне клиента - Реклама на стороне сервера - Включить журналы отладки - Журналы отладки включены - Журналы отладки отключены - - + Побочные эффекты подмены + • Клиент экспериментальный и может перестать работать в любое время + • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах + • Пункт \"Звуковая дорожка\" отсутствует + • Отсутствует видеокодек AV1 + • Постоянный уровень громкости недоступен + • Видео для детей могут не воспроизводиться при выходе из системы или в режиме инкогнито + + • Принудительная оригинальная звуковая дорожка недоступна + Показать в \"Статистике для сисадминов\" + Тип клиента в \"Статистике для сисадминов\" показан + Тип клиента в \"Статистике для сисадминов\" скрыт + + + + + YT Music ReVanced + ReVanced Музыка + Музыка + + + + Информация + Настройки рекламы + Общие настройки + Настройки плеера + Прочие настройки + + + Скрыть видеорекламу + Видеореклама в плеере скрыта + Видеореклама в плеере показана + + + Включить постоянный повтор + Постоянный повтор включен + Постоянный повтор отключен + + + Скрыть кнопку \"Трансляция\" + Кнопка \"Трансляция\" в плеере скрыта + Кнопка \"Трансляция\" в плеере показана + Скрыть кнопку истории + Кнопка истории скрыта + Кнопка истории показана + Скрыть кнопку уведомлений + Кнопка уведомлений скрыта + Кнопка уведомлений показана + Скрыть кнопку поиска + Кнопка поиска скрыта + Кнопка поиска показана + + + Скрыть панель категорий + Панель категорий скрыта + Панель категорий показана + + + Изменить цвет мини-плеера + Цвет мини-плеера соответствует полноэкранному плееру + Мини-плеер использует цвет по умолчанию + + + Панель навигации + Скрыть или изменить кнопки панели навигации + + Скрыть кнопку \"Главная\" + Кнопка \"Главная\" в панели навигации скрыта + Кнопка \"Главная\" в панели навигации показана + + Скрыть Сэмплы + Кнопка \"Семплы\" скрыта + Кнопка \"Семплы\" показана + + Скрыть кнопку \"Навигация\" + Кнопка \"Обзор\" скрыта + Кнопка \"Обзор\" показана + + Скрыть Библиотеку + Кнопка \"Библиотека\" скрыта + Кнопка \"Библиотека\" показана + + Скрыть кнопку \"Подписки\" + Кнопка \"Премиум\" скрыта + Кнопка \"Премиум\" показана + Скрыть панель навигации + Панель навигации скрыта + Панель навигации показана + Скрыть подписи кнопок навигации + Подписи кнопок навигации скрыты + Подписи кнопок навигации показаны + + + Скрыть ярлык \"Купить Music Premium\" + Ярлык \"Купить Music Premium\" скрыт + Ярлык \"Купить Music Premium\" показан + + + Скрыть кнопку \"Подписка\" + Кнопка \"Подписка\" скрыта + Кнопка \"Подписка\" показана + + + + + Заблокировать аудиорекламу + Аудиореклама заблокирована + Аудиореклама разблокирована + + + %s недоступен, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. + %s вернул ошибку, реклама может показываться. Попробуйте изменить службу блокировки рекламы в настройках. + Заблокировать встроенную видеорекламу + Отключено + Luminous прокси + PurpleAdBlock прокси + + + Заблокировать видеорекламу + Видеореклама заблокирована + Видеореклама разблокирована + + + Сообщение удалено + Показать удаленные сообщения + Не показывать удаленные сообщения + Скрыть удаленные сообщения за спойлером + Показать удаленные сообщения как перекрестный текст + + + Собирать Баллы канала автоматически + Баллы канала собираются автоматически + Баллы канала не собираются автоматически + + + + Включить режим отладки Twitch + Режим отладки Twitch включен (не рекомендуется) + Режим отладки Twitch отключен + + + Настройки ReVanced + Информация + О ReVanced + Блокировка рекламы + Настройки блокировки рекламы + Чат + Настройки чата + Прочие + Прочие настройки + Общие настройки + Другие настройки + Реклама на стороне клиента + Реклама на стороне сервера + Включить журналы отладки + Журналы отладки включены + Журналы отладки отключены + + diff --git a/patches/src/main/resources/addresources/values-si-rLK/strings.xml b/patches/src/main/resources/addresources/values-si-rLK/strings.xml index 3a40645452..3fb9bd0e12 100644 --- a/patches/src/main/resources/addresources/values-si-rLK/strings.xml +++ b/patches/src/main/resources/addresources/values-si-rLK/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + තද අයිකන අක්‍රිය කරන්න + අයිකන තද නොවේ + අයිකන තදයි + GmsCore + GmsCore හා සම්බන්ධ සැකසුම් + GmsCore යාවත්කාලීන කිරීම් පරීක්ෂා කරන්න + යාවත්කාලීන කිරීම් පරීක්ෂා කිරීම සක්‍රීයයි + යාවත්කාලීන පරීක්ෂා කිරීම අක්‍රිය කර ඇත + GmsCore සැකසුම් විවෘත කරන්න + GmsCore හි සැකසුම් + MicroG GmsCore ස්ථාපනය කර නැත. එය ස්ථාපනය කරන්න. + ක්‍රියාවක් අවශ්‍යයි + MicroG GmsCore යාවත්කාලීන පරීක්ෂා කිරීම අසාර්ථක විය + MicroG GmsCore හි නව අනුවාදයක් (%1$s) තිබේ. දැනට ඔබ %2$s අනුවාදය භාවිතා කරයි. + "MicroG GmsCore හට පසුබිමේ ධාවනය කිරීමට අවසර නැත. + +ඔබගේ දුරකථනය සඳහා \"මගේ යෙදුම මරා නොදමන්න\" මාර්ගෝපදේශය අනුගමනය කරන්න, සහ MicroG ස්ථාපනයට උපදෙස් අදාළ කරන්න. + +යෙදුම ක්‍රියාත්මක වීමට මෙය අවශ්‍ය වේ." + වෙබ් අඩවිය විවෘත කරන්න + අවලංගු කරන්න + "ගැටළු වළක්වා ගැනීමට MicroG GmsCore බැටරි ප්‍රශස්තකරණය අක්‍රිය කළ යුතුය. + +MicroG සඳහා බැටරි ප්‍රශස්තකරණය අක්‍රිය කිරීම බැටරි භාවිතයට අහිතකර ලෙස බලපාන්නේ නැත. + +ඉදිරියට යන්න බොත්තම තට්ටු කර ප්‍රශස්තකරණ වෙනස්කම් වලට ඉඩ දෙන්න." + ඉදිරියට යන්න - + + මෙම විශේෂාංගය භාවිත කිරීමට යෙදුම නැවත අරඹන්න + ලොග් ප්‍රොටෝකෝල් බෆරය + වර්ගීකරණ ලොග් වල ප්‍රොටෝ බෆරය ඇතුළත් වේ + වර්ගීකරණ ලොග් වල ප්‍රොටෝ බෆරය ඇතුළත් නොවේ + "මෙම සැකසීම සක්‍රීය කිරීමෙන්, සමහර UI සංරචක සඳහා තිරයේ ඇති පෙළ ඇතුළු අමතර පිරිසැලසුම් දත්ත සටහන් කරනු ඇත. + +අභිරුචි පෙරහන් සෑදීමේදී සංරචක හඳුනා ගැනීමට මෙය උපකාරී වේ. + +කෙසේ වෙතත්, මෙය සක්‍රීය කිරීමෙන් ඔබගේ IP ලිපිනය වැනි සමහර පරිශීලක දත්ත ද සටහන් වනු ඇත." + @@ -48,40 +85,135 @@ Second \"item\" text" - + නිර්මාණකරුවන්ගේ ගබඩා රාක්කය සඟවන්න + වීඩියෝ වාදකය යටතේ ඇති නිර්මාණකරුවන්ගේ ගබඩා රාක්කය සඟවා ඇත + වීඩියෝ වාදකය යටතේ ඇති නිර්මාණකරුවන්ගේ ගබඩා රාක්කය පෙන්වා ඇත + මුල් පිටුවේ වීඩියෝ යටතේ අදහස් දැක්වීම් කොටස සඟවන්න + මුල් පිටුවේ වීඩියෝ යටතේ අදහස් දැක්වීම් කොටස සඟවා ඇත + මුල් පිටුවේ වීඩියෝ යටතේ අදහස් දැක්වීම් කොටස පෙන්වා ඇත + + \'නවතම වීඩියෝ\' බොත්තම සඟවන්න + නවතම වීඩියෝ බොත්තම සඟවා ඇත + නවතම වීඩියෝ බොත්තම පෙන්වා ඇත + + වෙබ් සෙවුම් ප්‍රතිඵල සඟවන්න + වෙබ් සෙවුම් ප්‍රතිඵල සඟවා ඇත + වෙබ් සෙවුම් ප්‍රතිඵල පෙන්වා ඇත + \'ඔබ කැමති විය හැකි\' කොටස සඟවන්න + \'ඔබ කැමති විය හැකි\' කොටස සඟවා ඇත + \'ඔබ කැමති විය හැකි\' කොටස පෙන්වා ඇත + This button usually appears in the video player for certain videos. --> + + \'සජීවී කතාබස් නැවත ධාවනය\' බොත්තම සඟවන්න + වාදක ආවරණයේ සජීවී කතාබස් නැවත ධාවනය බොත්තම සඟවා ඇත + වාදක ආවරණයේ සජීවී කතාබස් නැවත ධාවනය බොත්තම පෙන්වා ඇත + වීඩියෝ මාතෘකාව සඟවන්න + වාදක ආවරණයේ වීඩියෝ මාතෘකාව සඟවා ඇත + වාදක ආවරණයේ වීඩියෝ මාතෘකාව පෙන්වා ඇත + \'පාඨමාලා ප්‍රගතිය\' සඟවන්න + පාඨමාලා ප්‍රගති කොටස සඟවා ඇත + පාඨමාලා ප්‍රගති කොටස පෙන්වා ඇත + ගවේෂණය සඟවන්න + මෙම පාඨමාලාව ගවේෂණය කරන්න සහ පොඩ්කාස්ට් කොටස් ගවේෂණය කරන්න සඟවා ඇත + මෙම පාඨමාලාව ගවේෂණය කරන්න සහ පොඩ්කාස්ට් කොටස් ගවේෂණය කරන්න පෙන්වා ඇත + \'මෙම පාඨමාලාව ගවේෂණය කරන්න\' සඟවන්න + මෙම පාඨමාලා කොටස ගවේෂණය කරන්න සඟවා ඇත + මෙම පාඨමාලා කොටස ගවේෂණය කරන්න පෙන්වා ඇත + \'පොඩ්කාස්ට් ගවේෂණය කරන්න\' සඟවන්න + පොඩ්කාස්ට් කොටස ගවේෂණය කරන්න සඟවා ඇත + පොඩ්කාස්ට් කොටස ගවේෂණය කරන්න පෙන්වා ඇත + \'විශේෂිත ස්ථාන\' සඟවන්න + විශේෂිත ස්ථාන කොටස සඟවා ඇත + විශේෂිත ස්ථාන කොටස පෙන්වා ඇත + ෆීඩ් ෆ්ලයිඅවුට් මෙනු පෙරහන සක්‍රීය කරන්න + ෆීඩ් ෆ්ලයිඅවුට් මෙනු පෙරහන සක්‍රීය කර ඇත + ෆීඩ් ෆ්ලයිඅවුට් මෙනු පෙරහන අක්‍රීය කර ඇත + ෆීඩ් ෆ්ලයිඅවුට් මෙනු පෙරහන + පෙරීමට ෆ්ලයිඅවුට් මෙනු නම් ඇතුළු කරන්න, එක් පේළියකට එකක් + ක්‍රීඩා සඟවන්න + ක්‍රීඩා කොටස සඟවා ඇත + ක්‍රීඩා කොටස පෙන්වා ඇත + සංගීතය සඟවන්න + සංගීත කොටස සඟවා ඇත + සංගීත කොටස පෙන්වා ඇත + ප්‍රශ්නාවලී සඟවන්න + ප්‍රශ්නාවලී කොටස සඟවා ඇත + ප්‍රශ්නාවලී කොටස පෙන්වා ඇත + නාලිකා ටැබ් පෙරහන සක්‍රීය කරන්න + නාලිකා ටැබ් පෙරහන සක්‍රීය කර ඇත + නාලිකා ටැබ් පෙරහන අක්‍රීය කර ඇත + නාලිකා ටැබ් පෙරහන + පෙරීමට නාලිකා ටැබ් නම් ඇතුළු කරන්න, එක් පේළියකට එකක් + "සීමාවන්: +• Shorts රාක්ක, නාලිකා පිටු, සහ සෙවුම් ප්‍රතිඵලවල තවමත් බැලීම් ගණන් පෙන්විය හැක. +• මෙම විශේෂාංගය වාහන ආකෘති සාධකය සමඟ ක්‍රියා නොකරයි." + "සීමාවන්: +• Shorts රාක්ක, නාලිකා පිටු, සහ සෙවුම් ප්‍රතිඵලවල තවමත් උඩුගත කළ වේලාවන් පෙන්විය හැක. +• මෙම විශේෂාංගය වාහන ආකෘති සාධකය සමඟ ක්‍රියා නොකරයි." + "මුල් පිටුව/දායකත්වයන්/සෙවුම් ප්‍රතිඵල, ප්‍රධාන පද වාක්‍ය ඛණ්ඩවලට ගැළපෙන අන්තර්ගතය සැඟවීමට පෙරහන් කර ඇත + +සීමාවන්: +• Shorts නාලිකා නාමයෙන් සැඟවිය නොහැක +• සමහර UI අංග සැඟවිය නොහැක +• ප්‍රධාන පදයක් සෙවීමෙන් ප්‍රතිඵල නොපෙන්විය හැක" - + සම්පූර්ණ තිර දැන්වීම් සඟවා ඇත + වාදක පොප්-අප් දැන්වීම් සඟවන්න + වාදක පොප්-අප් දැන්වීම් සඟවා ඇත + වාදක පොප්-අප් දැන්වීම් පෙන්වා ඇත + වාදක ආවරණයේ නිෂ්පාදන බැනරය බලන්න සඟවා ඇත + වාදක ආවරණයේ නිෂ්පාදන බැනරය බලන්න පෙන්වා ඇත + YouTube Premium ප්‍රවර්ධන සඟවන්න + YouTube Premium ප්‍රවර්ධන සඟවා ඇත + YouTube Premium ප්‍රවර්ධන පෙන්වා ඇත - - + + URL ක්ලිප්බෝඩ් එකට පිටපත් කරන ලදි + වේලා මුද්‍රාව සමඟ URL පිටපත් කරන ලදි + වීඩියෝ URL පිටපත් කිරීමේ බොත්තම පෙන්වන්න + වීඩියෝ URL පිටපත් කිරීමේ බොත්තම පෙන්වා ඇත. වීඩියෝ URL පිටපත් කිරීමට තට්ටු කරන්න. වේලා මුද්‍රාව සමඟ පිටපත් කිරීමට තට්ටු කර අල්ලාගෙන සිටින්න + වීඩියෝ URL පිටපත් කිරීමේ බොත්තම පෙන්වා නැත + වේලා මුද්‍රාව URL පිටපත් කිරීමේ බොත්තම පෙන්වන්න + වේලා මුද්‍රාව URL පිටපත් කිරීමේ බොත්තම පෙන්වා ඇත. වේලා මුද්‍රාව සමඟ වීඩියෝ URL පිටපත් කිරීමට තට්ටු කරන්න. වේලා මුද්‍රාව නොමැතිව පිටපත් කිරීමට තට්ටු කර අල්ලාගෙන සිටින්න + වේලා මුද්‍රාව URL පිටපත් කිරීමේ බොත්තම පෙන්වා නැත + - + + \'රූපවාහිනියට පිවිසෙන්න\' පොප්-අප් අක්‍රීය කරන්න + රූපවාහිනියට පිවිසීමේ පොප්-අප් අක්‍රීය කර ඇත + රූපවාහිනියට පිවිසීමේ පොප්-අප් සක්‍රීය කර ඇත + - + + සෙවීමට තට්ටු කිරීම සක්‍රීය කරන්න + සෙවීමට තට්ටු කිරීම සක්‍රීය කර ඇත + සෙවීමට තට්ටු කිරීම අක්‍රීය කර ඇත + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + සමහර පරිශීලක ගිණුම් සඳහා සැඟවීම ක්‍රියා නොකරනු ඇත. - + + සංචාලන බොත්තම් + සංචාලන තීරු බොත්තම් සඟවන්න හෝ වෙනස් කරන්න + මුල් පිටුව සඟවන්න + මුල් පිටුව බොත්තම සඟවා ඇත + මුල් පිටුව බොත්තම පෙන්වා ඇත + Shorts සඟවන්න + Shorts බොත්තම සඟවා ඇත + Shorts බොත්තම පෙන්වා ඇත + සාදන්න සඟවන්න + සාදන්න බොත්තම සඟවා ඇත + සාදන්න බොත්තම පෙන්වා ඇත + දායකත්වයන් සඟවන්න + දායකත්වයන් බොත්තම සඟවා ඇත + දායකත්වයන් බොත්තම පෙන්වා ඇත + දැනුම්දීම් සඟවන්න + දැනුම්දීම් බොත්තම සඟවා ඇත + දැනුම්දීම් බොත්තම පෙන්වා ඇත + සාදන්න දැනුම්දීම් සමඟ මාරු කරන්න + සාදන්න බොත්තම දැනුම්දීම් බොත්තම සමඟ මාරු කර ඇත + සාදන්න බොත්තම දැනුම්දීම් බොත්තම සමඟ මාරු කර නැත + මෙම සැකසුම වෙනස් කිරීමෙන් කිසිදු බලපෑමක් නොමැති නම්, Incognito ප්‍රකාරයට මාරු වීමට උත්සාහ කරන්න. + සංචාලන බොත්තම් ලේබල සඟවන්න + ලේබල සඟවා ඇත + ලේබල පෙන්වා ඇත + පටු සංචාලන බොත්තම් සක්‍රීය කරන්න + සංචාලන බොත්තම් අතර පරතරය පටුය + සංචාලන බොත්තම් අතර පරතරය සාමාන්‍යයි + සංචාලන තීරු සජීවීකරණ සක්‍රීය කරන්න + සංචාලන සංක්‍රාන්ති සජීවිකරණය කර ඇත + සංචාලන සංක්‍රාන්ති සජීවිකරණය කර නැත + පාරභාසක තත්ව තීරුව අක්‍රීය කරන්න + තත්ව තීරුව පාරාන්ධයි + තත්ව තීරුව පාරාන්ධ හෝ පාරභාසකයි + "සීමාවන්: +• වීඩියෝ වාදකයේ ඉහළින් කළු තීරුවක් දිස්විය හැක. +• සමහර උපාංගවල, මෙම විශේෂාංගය සක්‍රීය කිරීමෙන් පද්ධති සංචාලන තීරුව විනිවිද පෙනෙන ලෙස වෙනස් විය හැක." + දිදුලන පාරභාසක තීරුව අක්‍රීය කරන්න + ආලෝක ප්‍රකාර සංචාලන තීරුව පාරාන්ධයි + ආලෝක ප්‍රකාර සංචාලන තීරුව පාරාන්ධ හෝ පාරභාසකයි + අඳුරු පාරභාසක තීරුව අක්‍රීය කරන්න + අඳුරු ප්‍රකාර සංචාලන තීරුව පාරාන්ධයි + අඳුරු ප්‍රකාර සංචාලන තීරුව පාරාන්ධ හෝ පාරභාසකයි + මෙවලම් තීරුව + මෙවලම් තීරු අංග සඟවන්න හෝ වෙනස් කරන්න + සාදන්න බොත්තම සඟවන්න + සාදන්න බොත්තම සඟවා ඇත + සාදන්න බොත්තම පෙන්වා ඇත + දැනුම්දීම් බොත්තම සඟවන්න + දැනුම්දීම් බොත්තම සඟවා ඇත + දැනුම්දීම් බොත්තම පෙන්වා ඇත + සෙවුම් බොත්තම සඟවන්න + සෙවුම් බොත්තම සඟවා ඇත + සෙවුම් බොත්තම පෙන්වා ඇත. + පුළුල් සෙවුම් තීරුව සක්‍රීය කරන්න + පුළුල් සෙවුම් තීරුව සක්‍රීය කර ඇත + පුළුල් සෙවුම් තීරුව අක්‍රීය කර ඇත @@ -126,25 +315,67 @@ Second \"item\" text" + කුඩා කරන බොත්තම සඟවන්න + කුඩා කරන බොත්තම සඟවා ඇත + කුඩා කරන බොත්තම පෙන්වා ඇත + සම්පූර්ණ තිර බොත්තම සඟවන්න + සම්පූර්ණ තිර බොත්තම සඟවා ඇත + සම්පූර්ණ තිර බොත්තම පෙන්වා ඇත + + + අවසාන තිර කාඩ්පත් සඟවන්න + අවසාන තිර කාඩ්පත් සඟවා ඇත + අවසාන තිර කාඩ්පත් පෙන්වා ඇත - + සම්පූර්ණ තිරයේ විශාල සෙවීම් තීරුව සක්‍රීය කරන්න + සම්පූර්ණ තිරයේ සෙවීම් තීරුව විශාල ප්‍රමාණයේය + සම්පූර්ණ තිරයේ සෙවීම් තීරුව සාමාන්‍ය ප්‍රමාණයේය + නාලිකා පිටුවේ Shorts සඟවන්න + නාලිකා පිටුවේ සඟවා ඇත + නාලිකා පිටුවේ පෙන්වා ඇත + වීඩියෝ විස්තරයේ Shorts සඟවන්න + වීඩියෝ විස්තරයේ සඟවා ඇත + වීඩියෝ විස්තරයේ පෙන්වා ඇත + AI බොත්තම සඟවන්න + AI බොත්තම සඟවා ඇත + AI බොත්තම පෙන්වා ඇත + \'ස්වයංක්‍රීයව හඬ කැවුම්\' ලේබලය සඟවන්න + ස්වයංක්‍රීයව හඬ කැවුම් ලේබලය සඟවා ඇත + ස්වයංක්‍රීයව හඬ කැවුම් ලේබලය පෙන්වා ඇත + - + + ස්වයංක්‍රීය වාදනය පෙරදසුන සඟවන්න + ස්වයංක්‍රීය වාදනය පෙරදසුන සඟවා ඇත + ස්වයංක්‍රීය වාදනය පෙරදසුන පෙන්වා ඇත + + + අවසාන තිරයේ යෝජිත වීඩියෝව සඟවන්න + "ස්වයංක්‍රීය වාදනය අක්‍රිය කළ විට අවසාන තිරයේ යෝජිත වීඩියෝව සඟවා ඇත + +YouTube සැකසීම්වලින් ස්වයංක්‍රීය වාදනය වෙනස් කළ හැක: +සැකසීම් → ධාවනය → ඊළඟ වීඩියෝව ස්වයංක්‍රීයව ධාවනය කරන්න" + අවසාන තිරයේ යෝජිත වීඩියෝව පෙන්වා ඇත + - + + ප්ලේයර් පොප්අප් පැනල සඟවන්න + ප්ලේයර් පොප්අප් පැනල සඟවා ඇත + ප්ලේයර් පොප්අප් පැනල පෙන්වා ඇත + @@ -155,10 +386,12 @@ Second \"item\" text" - - + සංගීත වීඩියෝ සඳහා පමණි. වෙනත් කාණ්ඩයක් යටතේ දැනටමත් ආවරණය නොවන, සංගීතය නොමැති සංගීත වීඩියෝ කොටස් + කොටස ඉදිරිපත් කළ නොහැක: %s + "කොටස ඉදිරිපත් කළ නොහැක. +දැනටමත් පවතී" @@ -170,7 +403,11 @@ Second \"item\" text" - + + අක්‍රීය කර ඇත + වර්ණය + කළු සහ සුදු + @@ -187,7 +424,11 @@ Second \"item\" text" - + + තට්ටු කර අල්ලාගෙන සිටින විට කම්පනය අක්‍රීය කරන්න + තට්ටු කර අල්ලාගෙන සිටින විට කම්පනය අක්‍රීය කර ඇත + තට්ටු කර අල්ලාගෙන සිටින විට කම්පනය සක්‍රීය කර ඇත + @@ -200,6 +441,11 @@ Second \"item\" text" + + වාරික තත්ත්ව විකල්ප සඟවන්න + වාරික තත්ත්ව විකල්ප සඟවා ඇත + වාරික තත්ත්ව විකල්ප පෙන්වා ඇත + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index 446aaccee1..6ffdfebdee 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Zobraziť históriu vyhľadávania v nastaveniach História vyhľadávania v nastaveniach je zobrazená História vyhľadávania nastavení sa nezobrazuje + Zakázať tučné ikony + Ikony nie sú tučné + Ikony sú tučné Zobraziť ikony nastavení ReVanced Ikony nastavení sa zobrazujú Ikony nastavení sa nezobrazujú @@ -99,21 +102,31 @@ Pre preloženie nových jazykov alebo zlepšenie existujúcich prekladov navšt and changes made here must also be made there. --> - Nastavenia GmsCore - Nastavenia pre GmsCore + GmsCore + Nastavenia pre GmsCore + Skontrolovať aktualizácie GmsCore + Kontrola aktualizácií je zapnutá + Kontrola aktualizácií je zakázaná + Otvoriť nastavenia GmsCore + Nastavenia GmsCore - MicroG GmsCore nie je nainštalovaný. Nainštalujte ho. - Potrebná akcia - "Aplikácia MicroG GmsCore nemá povolenie na spúšťanie na pozadí. + MicroG GmsCore nie je nainštalovaný. Nainštalujte ho. + Potrebná akcia + Nepodarilo sa skontrolovať aktualizácie MicroG GmsCore + Je k dispozícii nová verzia (%1$s) MicroG GmsCore. Momentálne používate verziu %2$s. + "Aplikácia MicroG GmsCore nemá povolenie na spúšťanie na pozadí. -Postupujte podľa pokynov \"Nechaj moju aplikáciu spustenú\" pre váš telefón a použite ich v aplikácii MicroG GmsCore." - Otvorte webovú stránku - "Pre optimalizáciu MicroG GmsCore je potrebné vypnúť optimalizáciu batérie, aby sa predišlo problémom. +Postupujte podľa pokynov \"Nechaj moju aplikáciu spustenú\" pre váš telefón a použite ich v aplikácii MicroG GmsCore. + +Toto je potrebné pre fungovanie aplikácie." + Otvorte webovú stránku + Zrušiť + "Pre optimalizáciu MicroG GmsCore je potrebné vypnúť optimalizáciu batérie, aby sa predišlo problémom. Vypnutie optimalizácie batérie pre MicroG nebude mať negatívny vplyv na spotrebu batérie. Ťuknite na tlačidlo Pokračovať a povoľte zmeny optimalizácie." - Ďalej + Ďalej Falošné videostreamy @@ -167,10 +180,11 @@ Nebudete informovaní o žiadnych nepredvídaných udalostiach." Príznaky uložené Príznaky resetované Príznaky skopírované do schránky - Vyrovnávacia pamäť protokolu - Protokoly ladenia obsahujú proto buffer - Protokoly ladenia neobsahujú proto buffer - "Povolením tohto nastavenia sa budú zaznamenávať ďalšie údaje o rozložení, vrátane textu na obrazovke pre niektoré komponenty používateľského rozhrania. + Reštartujte aplikáciu pre použitie tejto funkcie + Vyrovnávacia pamäť protokolu + Protokoly ladenia obsahujú proto buffer + Protokoly ladenia neobsahujú proto buffer + "Povolením tohto nastavenia sa budú zaznamenávať ďalšie údaje o rozložení, vrátane textu na obrazovke pre niektoré komponenty používateľského rozhrania. Toto môže pomôcť identifikovať komponenty pri vytváraní vlastných filtrov. @@ -217,6 +231,9 @@ Povolením tejto funkcie sa však budú zaznamenávať aj niektoré používate Prehrávanie Shorts na pozadí je povolené + Skryť poličku obchodu pre tvorcov + Polička obchodu tvorcu pod prehrávačom videí je skrytá + Polička obchodu tvorcov pod prehrávačom videa je zobrazená Skryť karty albumov Karty albumov sú skryté Zobrazia sa karty albumov @@ -226,6 +243,9 @@ Povolením tejto funkcie sa však budú zaznamenávať aj niektoré používate Skryť poličku na žetóny Polica na žetóny je skrytá Je zobrazená polica na hranolky + Skryť sekciu komentárov pod videami na karte Domov + Sekcia komentárov pod videami na karte Domov je skrytá + Sekcia komentárov pod videami na karte Domov je zobrazená Skryť príspevky komunity Príspevky komunity sú skryté Zobrazujú sa príspevky komunity @@ -253,14 +273,19 @@ Povolením tejto funkcie sa však budú zaznamenávať aj niektoré používate Skryť najnovšie príspevky Najnovšie príspevky sú skryté Zobrazia sa najnovšie príspevky + + Skryť tlačidlo „Najnovšie videá“ + Tlačidlo najnovších videí je skryté + Tlačidlo najnovších videí je zobrazené Skryť zoznamy skladieb mixu Zoznamy skladieb mixu sú skryté Zobrazia sa zmiešané zoznamy skladieb Skryť sekciu filmov Sekcia Filmy je skrytá Zobrazí sa sekcia Filmy - + Skryť tlačidlo \"Upozorniť ma\" Tlačidlo „Upozorniť ma“ je skryté Tlačidlo „Upozorniť ma“ je zobrazené @@ -285,13 +310,16 @@ Povolením tejto funkcie sa však budú zaznamenávať aj niektoré používate Skryť vizuálny oddeľovač Vizuálny oddeľovač je skrytý Vizuálny oddeľovač je zobrazený + Skryť výsledky vyhľadávania na webe + Výsledky vyhľadávania na webe sú skryté + Zobrazia sa výsledky vyhľadávania na webe + Skryť sekciu „Mohlo by sa vám páčiť“ + Sekcia „Mohlo by sa vám páčiť“ je skrytá + Sekcia „Mohlo by sa vám páčiť“ je zobrazená Skryť YouTube Doodles Animácia YouTube Doodles na logu je skrytá Animácia YouTube Doodles na logu je zobrazená - "Doodles sa zobrazujú niekoľko dní v roku. - -Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skrytia je zapnuté, tak sa tiež skryje filter pod vyhľadávacím panelom." Skryť panel kanálov Panel kanálov je skrytý Zobrazí sa panel kanálov @@ -308,10 +336,15 @@ Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skryt Informačné panely sú skryté Zobrazia sa informačné panely + This button usually appears in the video player for certain videos. --> Skryť tlačidlo Pripojiť sa Tlačidlo „Pripojiť sa“ je skryté Tlačidlo „Pripojiť sa“ je zobrazené + + Skryť tlačidlo „Opakované prehrávanie živého chatu“ + Tlačidlo opakovaného prehrávania živého chatu v prekrytí prehrávača je skryté + Tlačidlo opakovaného prehrávania živého chatu v prekrytí prehrávača je zobrazené Skryť lekárske panely Lekárske panely sú skryté Zobrazujú sa lekárske panely @@ -327,6 +360,9 @@ Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skryt Skryť načasované reakcie Časované reakcie sú skryté Sú zobrazené načasované reakcie + Skryť názov videa + Názov videa v prekrytí prehrávača je skrytý + Názov videa v prekrytí prehrávača je zobrazený Skryť „Súhrn videa generovaný AI“ Sekcia so súhrnom videa generovaným AI je skrytá Sekcia zhrnutia videa generovaného AI je zobrazená @@ -339,33 +375,62 @@ Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skryt Skryť kapitoly Sekcia kapitol je skrytá Zobrazuje sa sekcia kapitol - Skryť „Ako bol tento obsah vytvorený“ - Sekcia Ako bol tento obsah vytvorený je skrytá - Sekcia Ako bol tento obsah vytvorený je zobrazená - Skryť body Hype - Body Hype sú skryté - Body Hype sú zobrazené + Skryť „Priebeh kurzu“ + Sekcia priebehu kurzu je skrytá + Sekcia priebehu kurzu je zobrazená + Skryť Preskúmať + Sekcie Preskúmať tento kurz a Preskúmať podcast sú skryté + Sekcie Preskúmať tento kurz a Preskúmať podcast sú zobrazené + Skryť „Preskúmať tento kurz“ + Sekcia Preskúmať tento kurz je skrytá + Sekcia Preskúmať tento kurz je zobrazená + Skryť „Preskúmať podcast“ + Sekcia Preskúmať podcast je skrytá + Sekcia Preskúmať podcast je zobrazená Skryť „Preskúmať podcast“ Sekcia Preskúmať podcast je skrytá Sekcia Preskúmať podcast je zobrazená Skryť odporúčané odkazy Sekcia Odporúčané odkazy je skrytá Sekcia Odporúčané odkazy je zobrazená + Skryť „Odporúčané miesta“ + Sekcia Odporúčané miesta je skrytá + Sekcia Odporúčané miesta je zobrazená Skryť Odporúčané videá Sekcia Odporúčané videá je skrytá Sekcia Odporúčané videá je zobrazená + Povoliť filter rozbaľovacej ponuky kanála + Filter rozbaľovacej ponuky kanála je povolený + Filter rozbaľovacej ponuky kanála je zakázaný + Filter rozbaľovacej ponuky kanála + Zadajte názvy rozbaľovacej ponuky na filtrovanie, jeden na riadok + Skryť Hry + Sekcia Hry je skrytá + Sekcia Hry je zobrazená + Skryť „Ako bol tento obsah vytvorený“ + Sekcia Ako bol tento obsah vytvorený je skrytá + Sekcia Ako bol tento obsah vytvorený je zobrazená + Skryť body Hype + Body Hype sú skryté + Body Hype sú zobrazené Skryť informačné karty Sekcia informačných kariet je skrytá Zobrazí sa sekcia informačných kariet Skryť „Kľúčové koncepty“ Sekcia Kľúčové koncepty je skrytá Sekcia Kľúčové koncepty je zobrazená + Skryť Hudba + Sekcia Hudba je skrytá + Sekcia Hudba je zobrazená Skryť tlačidlo Prihlásiť sa na odber Tlačidlo Prihlásiť sa na odber je skryté Tlačidlo Prihlásiť sa na odber je zobrazené Skryť prepis Časť prepisu je skrytá Zobrazí sa sekcia prepisu + Skryť Kvízy + Sekcia Kvízy je skrytá + Sekcia Kvízy je zobrazená Popis videa Skryť alebo zobraziť komponenty popisu videa Panel filtra @@ -384,6 +449,11 @@ Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skryt Zobrazené v histórii pozerania Stránka kanála Skryť alebo zobraziť komponenty stránky kanála + Povoliť filter kariet kanála + Filter kariet kanála je povolený + Filter kariet kanála je zakázaný + Filter kariet kanála + Zadajte názvy kariet kanála na filtrovanie, jeden na riadok Skryť tlačidlo Komunita Tlačidlo Komunita je skryté @@ -447,15 +517,15 @@ Ak sa Doodle v súčasnosti zobrazuje vo vašom regióne a toto nastavenie skryt Počet zhliadnutí je zobrazený vo feede a výsledkoch vyhľadávania "Obmedzenia: -• Police Shorts, stránky kanálov a výsledky vyhľadávania môžu naďalej zobrazovať počty zhliadnutí -• Táto funkcia nefunguje s automobilovým form factorom" +• Police Shorts, stránky kanálov a výsledky vyhľadávania môžu naďalej zobrazovať počty zhliadnutí. +• Táto funkcia nefunguje s automobilovým form factorom." Skryť čas nahrávania Čas nahrávania je skrytý v informačnom kanáli a výsledkoch vyhľadávania Čas nahrávania je zobrazený v informačnom kanáli a výsledkoch vyhľadávania "Obmedzenia: -• Police Shorts, stránky kanálov a výsledky vyhľadávania môžu stále zobrazovať časy nahrávania -• Táto funkcia nefunguje s automobilovým formátom" +• Police Shorts, stránky kanálov a výsledky vyhľadávania môžu stále zobrazovať časy nahrávania. +• Táto funkcia nefunguje s automobilovým formátom." Skryť obsah kľúčových slov Pomocou filtrov kľúčových slov skryte vyhľadávacie a informačné videá Skryť domáce videá podľa kľúčových slov @@ -478,7 +548,7 @@ Slová s veľkými písmenami v strede musia byť zadané s použitím veľkých O filtrovaní kľúčových slov "Domov/Predplatné/Výsledky vyhľadávania sú filtrované tak, aby sa skryl obsah, ktorý zodpovedá kľúčovým slovám -Obmedzenia +Obmedzenia: • Shorts sa nedajú skryť podľa názvu kanála • Niektoré komponenty používateľského rozhrania sa nemusia skryť • Vyhľadávanie kľúčového slova nemusí priniesť žiadne výsledky" @@ -493,19 +563,12 @@ Obmedzenia Kľúčové slovo skryje všetky videá: %s - Skryť poličku obchodu pre tvorcov - Polička obchodu tvorcu pod prehrávačom videí je skrytá - Priehradka obchodu tvorcov pod prehrávačom videa je zobrazená Skryť banner obchodu na konci obrazovky Banner obchodu na záverečnej obrazovke je skrytý Banner obchodu na záverečnej obrazovke je zobrazený Skryť reklamy na celú obrazovku - "Celoobrazovkové reklamy sú skryté - -Táto funkcia je dostupná len pre staršie zariadenia" + Reklamy na celú obrazovku sú skryté Zobrazujú sa reklamy na celú obrazovku - - Skryť reklamy na celú obrazovku funguje iba na starších zariadeniach Skryť všeobecné reklamy Všeobecné reklamy sú skryté Zobrazujú sa všeobecné reklamy @@ -515,6 +578,9 @@ Táto funkcia je dostupná len pre staršie zariadenia" Skryť štítok platenej propagácie Štítok platenej propagácie je skrytý Zobrazuje sa štítok platenej propagácie + Skryť vyskakovacie reklamy prehrávača + Vyskakovacie reklamy prehrávača sú skryté + Vyskakovacie reklamy prehrávača sú zobrazené Skryť vlastné sponzorované karty Vlastné sponzorované karty sú skryté Zobrazujú sa vlastné sponzorované karty @@ -522,23 +588,18 @@ Táto funkcia je dostupná len pre staršie zariadenia" Nákupné odkazy v popise videa sú skryté Odkazy na nakupovanie v popise videa sú zobrazené Skryť banner „Zobraziť produkty“ - Banner „Zobraziť produkty“ v prekrytí videa je skrytý - Banner „Zobraziť produkty“ v prekrytí videa je zobrazený - Skryť výsledky vyhľadávania na webe - Výsledky vyhľadávania na webe sú skryté - Zobrazia sa výsledky vyhľadávania na webe - - - Skryť promá YouTube Premium - Promá YouTube Premium pod prehrávačom videa sú skryté - Promá YouTube Premium sa zobrazujú pod prehrávačom videa + Banner „Zobraziť produkty“ v prekrytí prehrávača je skrytý + Banner „Zobraziť produkty“ v prekrytí prehrávača je zobrazený + Skryť promá YouTube Premium + Promá YouTube Premium sú skryté + Promá YouTube Premium sú zobrazené Skryť videoreklamy Videoreklamy sú skryté Zobrazujú sa videoreklamy - + Adresa URL bola skopírovaná do schránky Adresa URL s časovou pečiatkou bola skopírovaná Zobraziť tlačidlo skopírovať adresu URL videa @@ -554,10 +615,10 @@ Táto funkcia je dostupná len pre staršie zariadenia" Zobrazí sa dialógové okno Neobchádza sa tým ani vekové obmedzenie. Len to automaticky akceptuje. - - Zakázať vyskakovacie okno „Prihlásiť sa do TV“ - Vyskakovacie okno Prihlásiť sa do TV je zakázané - Vyskakovacie okno Prihlásiť sa do TV je povolené + + Zakázať vyskakovacie okno „Prihlásiť sa do TV“ + Vyskakovacie okno Prihlásiť sa do TV je zakázané + Vyskakovacie okno Prihlásiť sa do TV je povolené Zakázať preskočenie kapitoly dvojitým klepnutím @@ -590,10 +651,10 @@ Overte, či je názov balíka správny a aplikácia je nainštalovaná" Gesto je zakázané Gesto je povolené - - Povoliť ťuknutie pre vyhľadávanie - Klepnutím prejdete do povoleného režimu vyhľadávania - Ťuknutie pre vyhľadávanie je vypnuté + + Povoliť ťuknutie pre vyhľadávanie + Ťuknutie pre vyhľadávanie je povolené + Ťuknutie pre vyhľadávanie je vypnuté Povoliť gesto jasu @@ -674,7 +735,7 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Tlačidlo komentárov je skryté Tlačidlo komentárov je zobrazené + This button usually appears on live streamed videos. --> Skryť prehľad Tlačidlo nahlásiť je skryté Zobrazí sa tlačidlo Ohlásiť @@ -687,7 +748,7 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Tlačidlo Stiahnuť je skryté Zobrazí sa tlačidlo Stiahnuť + This button usually appears on videos uploaded by the logged-in user. --> Skryť Hype Tlačidlo Hype je skryté Tlačidlo Hype je zobrazené @@ -700,7 +761,7 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Tlačidlo poďakovania je skryté Zobrazí sa tlačidlo Ďakujem + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Skryť možnosť Opýtať sa Tlačidlo Opýtať sa je skryté Zobrazí sa tlačidlo Opýtať sa @@ -708,6 +769,7 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Skryť klip Tlačidlo klipu je skryté Zobrazí sa tlačidlo klipu + Skrytie nemusí fungovať pre niektoré používateľské účty. Skryť obchod Tlačidlo Obchod je skryté @@ -717,13 +779,13 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Tlačidlo Uložiť je skryté Tlačidlo Uložiť je zobrazené - + Navigačné tlačidlá - Skryť alebo zmeniť tlačidlá na navigačnom paneli + Skryť alebo zmeniť tlačidlá navigačného panela - Skryť domov + Skryť Domov Tlačidlo Domov je skryté - Zobrazí sa tlačidlo Domov + Tlačidlo Domov je zobrazené Skryť Shorts Tlačidlo Shorts je skryté @@ -731,36 +793,54 @@ Upravte hlasitosť posúvaním vertikálne na pravej strane obrazovky" Skryť Vytvoriť Tlačidlo Vytvoriť je skryté - Zobrazí sa tlačidlo Vytvoriť + Tlačidlo Vytvoriť je zobrazené Skryť odbery Tlačidlo odberov je skryté - Zobrazí sa tlačidlo odberov + Tlačidlo odberov je zobrazené Skryť upozornenia Tlačidlo upozornení je skryté Tlačidlo upozornení je zobrazené - Prepnite na položku Vytvoriť s upozorneniami - "Tlačidlo Vytvoriť sa prepne s tlačidlom Upozornenia - -Poznámka: Povolením tejto možnosti sa tiež vynútene skryjú video reklamy" + Prepnúť Vytvoriť s Upozorneniami + Tlačidlo Vytvoriť je prepnuté s tlačidlom Upozornenia Tlačidlo Vytvoriť sa neprepína s tlačidlom Upozornenia - "Deaktiváciou tohto nastavenia sa deaktivuje aj blokovanie reklám pre Shorts. - -Ak zmena tohto nastavenia nemá žiadny účinok, skúste prepnúť do režimu inkognito." - Skryť štítky navigačných tlačidiel - Štítky sú skryté - Zobrazia sa štítky + Ak zmena tohto nastavenia nemá účinok, skúste prejsť do režimu inkognito. + Skryť popisky navigačných tlačidiel + Popisky sú skryté + Popisky sú zobrazené + Povoliť úzke navigačné tlačidlá + Rozostupy medzi navigačnými tlačidlami sú úzke + Rozostupy medzi navigačnými tlačidlami sú normálne + Povoliť animácie navigačného panela + Navigačné prechody sú animované + Navigačné prechody nie sú animované Deaktivovať priesvitný stavový riadok Stavový riadok je nepriehľadný Stavový riadok je nepriehľadný alebo priesvitný - Na niektorých zariadeniach môže povolenie tejto funkcie zmeniť navigačný panel systému na priehľadný. - Deaktivovať priesvitný panel s navigáciou - Panel s navigáciou v svetlom režime je nepriehľadný + "Obmedzenia: +• V hornej časti prehrávača videa sa môže zobraziť čierny pruh. +• Na niektorých zariadeniach môže povolenie tejto funkcie zmeniť systémový navigačný panel na priehľadný." + Deaktivovať svetlý priesvitný panel + Navigačný panel v svetlom režime je nepriehľadný Navigačný panel v svetlom režime je nepriehľadný alebo priesvitný Zakázať tmavý priesvitný panel - Panel s navigáciou v tmavom režime je nepriehľadný + Navigačný panel v tmavom režime je nepriehľadný Navigačný panel v tmavom režime je nepriehľadný alebo priesvitný + Panel s nástrojmi + Skryť alebo zmeniť komponenty panela s nástrojmi + Skryť tlačidlo Vytvoriť + Tlačidlo Vytvoriť je skryté + Tlačidlo Vytvoriť je zobrazené + Skryť tlačidlo Upozornenia + Tlačidlo Upozornenia je skryté + Tlačidlo Upozornenia je zobrazené + Skryť tlačidlo vyhľadávania + Tlačidlo vyhľadávania je skryté + Tlačidlo vyhľadávania je zobrazené. + Povoliť široký panel vyhľadávania + Široký panel vyhľadávania je povolený + Široký panel vyhľadávania je vypnutý Rozbaľovacie menu @@ -835,6 +915,12 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Skryť tlačidlo Cast Tlačidlo zdieľania obrazovky je skryté Tlačidlo zdieľania obrazovky je zobrazené + Skryť tlačidlo Zbaliť + Tlačidlo Zbaliť je skryté + Tlačidlo Zbaliť je zobrazené + Skryť tlačidlo Celá obrazovka + Tlačidlo Celá obrazovka je skryté + Tlačidlo Celá obrazovka je zobrazené Skryť pozadie ovládacích prvkov prehrávača Pozadie ovládacích prvkov prehrávača je skryté Pozadie ovládacích prvkov prehrávača sa zobrazuje @@ -843,9 +929,9 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Zobrazia sa tlačidlá - Skryť karty záverečnej obrazovky - Karty záverečnej obrazovky sú skryté - Zobrazia sa karty záverečnej obrazovky + Skryť karty záverečnej obrazovky + Karty záverečnej obrazovky sú skryté + Karty záverečnej obrazovky sú zobrazené Zakázať režim Ambient na celú obrazovku @@ -870,10 +956,16 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Skryť posuvník miniatúr videa Posuvník miniatúr videa je skrytý Posuvník miniatúr videa je zobrazený + Povoliť veľkú lištu vyhľadávania na celú obrazovku + Lišta vyhľadávania na celú obrazovku je veľká + Lišta vyhľadávania na celú obrazovku je normálna Prehrávač Shorts Skryť alebo zobraziť komponenty prehrávača Shorts + Skryť Shorts na stránke kanála + Skryté na stránke kanála + Zobrazené na stránke kanála Skryť Shorts na karte Domov Skryté v kanáli Domov a súvisiacich videách @@ -885,9 +977,18 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Skryť Shorts v kanáli Odbery Skryté v kanáli Odbery Zobrazené v kanáli Odbery + Skryť Shorts v popise videa + Skryté v popise videa + Zobrazené v popise videa Skryť Shorts z histórie sledovania Skryté v histórii pozerania Zobrazené v histórii sledovania + Skryť tlačidlo AI + Tlačidlo AI je skryté + Tlačidlo AI je zobrazené + Skryť štítok „Automatický dabing“ + Štítok s automatickým dabingom je skrytý + Štítok s automatickým dabingom je zobrazený Skryť štítok „Automatický dabing“ Štítok s automatickým dabingom je skrytý Štítok s automatickým dabingom je zobrazený @@ -949,6 +1050,7 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Skryť tlačidlo „Použiť túto šablónu“ Tlačidlo Použiť túto šablónu je skryté Tlačidlo Použiť túto šablónu je zobrazené + Skryť animáciu fontány tlačidla Páči sa mi to Animácia fontány like bude skrytá Animácia fontány like bude zobrazená @@ -991,13 +1093,18 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte 'Spoof video streams' na 'And Navigačný panel je skrytý Zobrazí sa navigačná lišta - + + Skryť náhľad automatického prehrávania + Náhľad automatického prehrávania je skrytý + Náhľad automatického prehrávania je zobrazený + + Skryť navrhované video na konci obrazovky "Navrhované video na konci obrazovky je skryté, keď je automatické prehrávanie vypnuté. Automatické prehrávanie je možné zmeniť v nastaveniach YouTube: Nastavenia → Prehrávanie → Automatické prehrávanie ďalšieho videa" - Navrhované video na konci obrazovky sa zobrazuje + Navrhované video na konci obrazovky je zobrazené Skryť prekrytie súvisiacich videí @@ -1010,9 +1117,9 @@ Nastavenia → Prehrávanie → Automatické prehrávanie ďalšieho videa"Zobrazí sa časová pečiatka - Skryť vyskakovacie panely prehrávača - Vyskakovacie panely prehrávača sú skryté - Zobrazia sa vyskakovacie panely prehrávača + Skryť vyskakovacie panely prehrávača + Vyskakovacie panely prehrávača sú skryté + Zobrazia sa vyskakovacie panely prehrávača Ukončiť režim celej obrazovky na konci videa @@ -1080,24 +1187,6 @@ Obmedzenie: Hodnotenia Nepáči sa mi to sa nemusia zobraziť v anonymnom režim Limit klientskej sadzby bol zaznamenaný %d-krát %d milisekúnd - - Povoliť široký panel vyhľadávania - Široký panel vyhľadávania je povolený - Široký panel vyhľadávania je vypnutý - - - Povoliť miniatúry vo vysokej kvalite - Miniatúry seekbaru sú vo vysokej kvalite - Miniatúry seekbaru sú v strednej kvalite - "Tým sa tiež obnovia miniatúry živých prenosov, ktoré nemajú miniatúry panela vyhľadávania. - -Miniatúry panela vyhľadávania budú používať rovnakú kvalitu ako aktuálne video. - -Táto funkcia najlepšie funguje s kvalitou videa 720p alebo nižšou a pri použití veľmi rýchleho internetového pripojenia." - Obnovte staré miniatúry vyhľadávacieho panela - Miniatúry panela vyhľadávania sa zobrazia nad panelom vyhľadávania - Miniatúry panela vyhľadávania sa zobrazia na celej obrazovke - Zapnúť SponsorBlock SponsorBlock je systém vytváraný používateľmi na preskakovanie nepríjemných častí videí na YouTube @@ -1238,7 +1327,7 @@ Táto funkcia najlepšie funguje s kvalitou videa 720p alebo nižšou a pri pou SponsorBlock je dočasne mimo prevádzky Segment nie je možné odoslať (stav: %1$d %2$s) Segment sa nedá odoslať. Limit počtu (príliš veľa od rovnakého používateľa alebo IP) - Nie je možné odoslať segment: %s + Segment sa nedá odoslať: %s "Segment sa nedá odoslať. Už existuje" Segment bol úspešne odoslaný @@ -1333,8 +1422,6 @@ Ak sa neskôr vypne, odporúča sa vymazať údaje aplikácie, aby sa zabránilo Falošná cieľová verzia aplikácie 20.13.41 - Obnoviť nerozbalený panel akcií videa 20.05.46 - Obnoviť funkčnosť prepisu - 19.35.36 - Obnoviť staré ikony Shorts prehrávača - 19.01.34 – Obnoviť staré ikony navigácie Zmeniť úvodnú stránku @@ -1436,8 +1523,9 @@ Miniprehrávač sa dá potiahnuť mimo obrazovky doľava alebo doprava" Načítavacia obrazovka bude mať pozadie s prechodom Načítavacia obrazovka bude mať pevné pozadie Štýl úvodnej obrazovky - Farba - Čiernobiela + Vypnuté + Farba + Čiernobiela Povoliť vlastnú farbu vyhľadávacieho panela Zobrazí sa vlastná farba panela vyhľadávania Zobrazí sa pôvodná farba vyhľadávacieho panela @@ -1542,6 +1630,9 @@ Povolením tejto možnosti môžete odomknúť vyššie kvality videa" Vypnúť haptiku vrátenia späť vyhľadávania Haptika vrátenia späť vyhľadávania je vypnutá Haptika vrátenia späť vyhľadávania je zapnutá + Vypnúť haptickú odozvu pre ťuknutie a podržanie + Haptická odozva pre ťuknutie a podržanie je vypnutá + Haptická odozva pre ťuknutie a podržanie je zapnutá Zakázať haptiku priblíženia Haptika priblíženia je vypnutá Haptika priblíženia je zapnutá @@ -1637,6 +1728,11 @@ Obmedzenia: Zobrazuje sa rozšírená ponuka kvality videa Nezobrazuje sa rozšírená ponuka kvality videa + + Skryť možnosti kvality YouTube Premium + Možnosti kvality YouTube Premium sú skryté + Možnosti kvality YouTube Premium sú zobrazené + Povoliť vyhľadávanie snímkou Slide to search je zapnuté @@ -1668,6 +1764,7 @@ Prehrávanie videa s AV1 môže sekať alebo vynechávať snímky." + O aplikácii Reklamy Všeobecné diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index 8bf6001e36..f87eb95b24 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Po meri Ikona aplikacije Izvirno + ReVanced ReVanced minimalno ReVanced prilagojeno @@ -49,6 +50,7 @@ Second \"item\" text" Nastavitve + ReVanced Ali ste prepričani, da želite nadaljevati? Shrani Ponastavi @@ -80,6 +82,9 @@ Second \"item\" text" Pokaži zgodovino iskanja nastavitev Zgodovina iskanja nastavitev je prikazana Zgodovina iskanja nastavitev ni prikazana + Onemogoči krepke ikone + Ikone niso krepke + Ikone so krepke Pokaži ikone nastavitev ReVanced Ikone nastavitev so prikazane Ikone nastavitev niso prikazane @@ -99,27 +104,37 @@ Second \"item\" text" and changes made here must also be made there. --> - Nastavitve GmsCore - Nastavitve za GmsCore + GmsCore + Nastavitve za GmsCore + Preverite posodobitve za GmsCore + Preverjanje posodobitev je omogočeno + Preverjanje posodobitev je onemogočeno + Odpri Nastavitve GmsCore + Nastavitve za GmsCore - MicroG GmsCore ni nameščen. Namestite ga. - Dejanje potrebno - "MicroG GmsCore nima dovoljenja za delovanje v ozadju. + MicroG GmsCore ni nameščen. Namestite ga. + Dejanje potrebno + Preverjanje posodobitev za MicroG GmsCore ni uspelo + Na voljo je nova različica (%1$s) MicroG GmsCore. Trenutno uporabljate različico %2$s. + "MicroG GmsCore nima dovoljenja za delovanje v ozadju. Upoštevajte navodila za \"Ne ubijaj moje aplikacije\" za vaš telefon in uporabite navodila za vašo namestitev MicroG. To je potrebno za delovanje aplikacije." - Odpri spletno mesto - "Optimizacije baterije za MicroG GmsCore morajo biti onemogočene, da se preprečijo težave. + Odpri spletno mesto + Prekliči + "Optimizacije baterije za MicroG GmsCore morajo biti onemogočene, da se preprečijo težave. Onemogočanje optimizacij baterije za MicroG ne bo negativno vplivalo na porabo baterije. Tapnite gumb za nadaljevanje in dovolite spremembe optimizacij." - Nadaljuj + Nadaljuj Ponaredi video tokove Ponaredi video tokove odjemalca, da preprečiš težave z predvajanjem + Ponaredi video tokove + Ponaredi video tokove odjemalca za preprečevanje težav s predvajanjem Ponarejanje video tokov "Video tokovi so ponarejeni @@ -169,14 +184,11 @@ Ne boste obveščeni o nobenih nepričakovanih dogodkih." Zastavice shranjene Zastavice ponastavljene Zastavice kopirane v odložišče - Dnevnik protokola pufra - Dnevniki napak vključujejo protokol pufra - Dnevniki napak ne vključujejo protokola pufra - "Če omogočite to nastavitev, se bodo beležili dodatni podatki o postavitvi, vključno z besedilom na zaslonu za nekatere komponente uporabniškega vmesnika. - -To lahko pomaga prepoznati komponente pri ustvarjanju filtrov po meri. - -Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot je vaš naslov IP." + Znova zaženite aplikacijo za uporabo te funkcije + Dnevnik protokola pufra + Dnevniki napak vključujejo protokol pufra + Dnevniki napak ne vključujejo protokola pufra + "Če omogočite to nastavitev, se bodo beležili dodatni podatki o postavitvi, vključno z besedilom na zaslonu za nekatere komponente uporabniškega vmesnika.To lahko pomaga prepoznati komponente pri ustvarjanju filtrov po meri.Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot je vaš naslov IP." Sanitiziraj povezave za deljenje @@ -206,8 +218,10 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Vir Splošno Predvajalnik + Shorts Drsnik Krmiljenje s potegi + Return YouTube Dislike Razno **Video** Obnovi stare menije nastavitev @@ -220,6 +234,9 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Predvajanje Shorts v ozadju je omogočeno + Skrij polico trgovine ustvarjalcev + Polica trgovine za ustvarjalce pod video predvajalnikom je skrita + Polica trgovine za ustvarjalce pod video predvajalnikom je prikazana Skrij kartice albuma Kartice albuma so skrite Kartice albuma so prikazane @@ -229,6 +246,9 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Skrij polico s čipi Polica s čipi je skrita Polica s čipi je prikazana + Skrij razdelek s komentarji pod videoposnetki v domačem viru + Razdelek s komentarji pod videoposnetki v domačem viru je skrit + Razdelek s komentarji pod videoposnetki v domačem viru je prikazan Skrij objave skupnosti Objave skupnosti so skrite Objave skupnosti so prikazane @@ -256,14 +276,19 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Skrij najnovejše objave Najnovejše objave so skrite Najnovejše objave so prikazane + + Skrij gumb \'Najnovejši videoposnetki\' + Gumb Najnovejši videoposnetki je skrit + Gumb Najnovejši videoposnetki je prikazan Skrij mešane sezname predvajanja Mešani seznami predvajanja so skriti Mešani seznami predvajanja so prikazani Skrij oddelek s filmi Oddelek s filmi je skrit Oddelek s filmi je prikazan - + Skrij gumb \"Obvesti me\" Gumb \"Obvesti me\" je skrit Gumb \"Obvesti me\" je prikazan @@ -288,13 +313,16 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Skrij vizualni distančnik Vizualni distančnik je skrit Vizualni distančnik je prikazan + Skrij rezultate spletnega iskanja + Rezultati spletnega iskanja so skriti + Rezultati spletnega iskanja so prikazani + Skrij razdelek \'Morda vam bo všeč\' + \'Morda vam bo všeč\' razdelek je skrit + \'Morda vam bo všeč\' razdelek je prikazan Skrij YouTube Doodles Animacija YouTube Doodles na logotipu je skrita Animacija YouTube Doodles na logotipu je prikazana - "Doodles so prikazani nekaj dni v letu. - -Če je Doodle trenutno prikazan v vaši regiji in je ta nastavitev skrita, se bo skrila tudi vrstica filtrov pod iskalno vrstico." Skrij vrstico kanala Vrstica kanala je skrita Vrstica kanala je prikazana @@ -311,10 +339,15 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Informativne plošče so skrite Informativne plošče so prikazane + This button usually appears in the video player for certain videos. --> Skrij gumb Pridruži se Gumb \"Pridruži se\" je skrit Gumb \"Pridruži se\" je prikazan + + Skrij gumb \'Ponavljanje klepeta v živo\' + Gumb za ponavljanje klepeta v živo v prekrivanju predvajalnika je skrit + Gumb za ponavljanje klepeta v živo v prekrivanju predvajalnika je prikazan Skrij medicinske plošče Medicinske plošče so skrite Medicinske plošče so prikazane @@ -330,6 +363,9 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Skrij časovno usklajene reakcije Časovno usklajene reakcije so skrite Časovno usklajene reakcije so prikazane + Skrij naslov videoposnetka + Naslov videoposnetka v prekrivanju predvajalnika je skrit + Naslov videoposnetka v prekrivanju predvajalnika je prikazan Skrij »Povzetek videoposnetka, ustvarjenega z umetno inteligenco« Razdelek z AI-generiranim povzetkom videa je skrit Razdelek s povzetkom videoposnetka, ustvarjenim z umetno inteligenco, je prikazan @@ -342,33 +378,62 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Skrij poglavja Oddelek s poglavji je skrit Oddelek s poglavji je prikazan - Skrij »Kako je bila ta vsebina ustvarjena« - Razdelek »Kako je bila ta vsebina ustvarjena« je skrit - Razdelek »Kako je bila ta vsebina ustvarjena« je prikazan - Skrij točke Hype - Točke Hype so skrite - Točke Hype so prikazane + Skrij \'Napredek tečaja\' + Razdelek Napredek tečaja je skrit + Razdelek Napredek tečaja je prikazan + Skrij Raziskovanje + Razdelka Raziščite ta tečaj in Raziščite podcast sta skrita + Razdelka Raziščite ta tečaj in Raziščite podcast sta prikazana + Skrij \'Raziščite ta tečaj\' + Razdelek Raziščite ta tečaj je skrit + Razdelek Raziščite ta tečaj je prikazan + Skrij \'Raziščite podcast\' + Razdelek »Raziščite podcast« je skrit + Razdelek »Raziščite podcast« je prikazan Skrij »Raziščite podcast« Razdelek »Raziščite podcast« je skrit Razdelek »Raziščite podcast« je prikazan Skrij predstavljene povezave Razdelek s poudarjenimi povezavami je skrit Razdelek s poudarjenimi povezavami je prikazan + Skrij \'Predstavljene lokacije\' + Razdelek Predstavljene lokacije je skrit + Razdelek Predstavljene lokacije je prikazan Skrij poudarjene videoposnetke Razdelek s poudarjenimi videoposnetki je skrit Razdelek s poudarjenimi videoposnetki je prikazan + Omogoči filter pojavnega menija vira + Filter pojavnega menija vira je omogočen + Filter pojavnega menija vira je onemogočen + Filter pojavnega menija vira + Vnesite imena pojavnih menijev za filtriranje, eno na vrstico + Skrij Igre + Razdelek Igre je skrit + Razdelek Igre je prikazan + Skrij »Kako je bila ta vsebina ustvarjena« + Razdelek »Kako je bila ta vsebina ustvarjena« je skrit + Razdelek »Kako je bila ta vsebina ustvarjena« je prikazan + Skrij točke Hype + Točke Hype so skrite + Točke Hype so prikazane Skrij kartice z informacijami Oddelek s karticami z informacijami je skrit Oddelek s karticami z informacijami je prikazan Skrij »Ključni koncepti« Razdelek »Ključni koncepti« je skrit Razdelek »Ključni koncepti« je prikazan + Skrij Glasbo + Razdelek Glasba je skrit + Razdelek Glasba je prikazan Skrij gumb Naroči se Gumb Naroči se je skrit Gumb Naroči se je prikazan Skrij prepis Oddelek s prepisom je skrit Oddelek s prepisom je prikazan + Skrij Kvize + Razdelek Kvizi je skrit + Razdelek Kvizi je prikazan Opis videoposnetka Skrij ali prikaži komponente opisa videoposnetka Vrstica filtra @@ -387,6 +452,11 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Prikazano v zgodovini ogledov Stran kanala Skrij ali prikaži komponente strani kanala + Omogoči filter zavihkov kanalov + Filter zavihkov kanalov je omogočen + Filter zavihkov kanalov je onemogočen + Filter zavihkov kanalov + Vnesite imena zavihkov kanalov za filtriranje, eno na vrstico Skrij gumb Skupnost Gumb Skupnost je skrit @@ -450,15 +520,15 @@ Vendar pa bo omogočitev tega beležila tudi nekatere uporabniške podatke, kot Število ogledov je prikazano v viru in rezultatih iskanja "Omejitve: -• Shorts police, strani kanalov in rezultati iskanja lahko še vedno prikazujejo število ogledov -• Ta funkcija ne deluje z avtomobilskim oblikovnim faktorjem" +• Shorts police, strani kanalov in rezultati iskanja lahko še vedno prikazujejo število ogledov. +• Ta funkcija ne deluje z avtomobilskim oblikovnim faktorjem." Skrij čas nalaganja Čas nalaganja je skrit v viru in rezultatih iskanja Čas nalaganja je prikazan v viru in rezultatih iskanja "Omejitve: -• Police s prispevki Shorts, strani kanalov in rezultati iskanja lahko še vedno prikazujejo čase nalaganja -• Ta funkcija ne deluje z avtomobilsko obliko" +• Police s prispevki Shorts, strani kanalov in rezultati iskanja lahko še vedno prikazujejo čase nalaganja. +• Ta funkcija ne deluje z avtomobilsko obliko." Skrij vsebino s ključno besedo Skrij videoposnetke v iskanju in viru s filtri ključnih besed Skrij videoposnetke na domačem zaslonu s ključnimi besedami @@ -481,8 +551,8 @@ Besede z velikimi začetnicami na sredini morajo biti vnesene z veliko začetnic O filtriranju ključnih besed "Rezultati iskanja na domači strani/naročninah so filtrirani, da se skrije vsebina, ki se ujema s ključnimi besedami -Omejitve -• Kratkih videoposnetkov ni mogoče skriti po imenu kanala +Omejitve: +• Shorts ni mogoče skriti po imenu kanala • Nekatere komponente uporabniškega vmesnika morda ne bodo skrite • Iskanje ključne besede morda ne bo prikazalo nobenih rezultatov" Ujemanje celotnih besed @@ -496,19 +566,12 @@ Omejitve Ključna beseda bo skrila vse videoposnetke: %s - Skrij polico trgovine ustvarjalcev - Polica trgovine za ustvarjalce pod video predvajalnikom je skrita - Polica trgovine za ustvarjalce pod video predvajalnikom je prikazana Skrij pasico trgovine na koncu zaslona Pasica trgovine na končnem zaslonu je skrita Pasica trgovine na končnem zaslonu je prikazana Skrij oglase na celotnem zaslonu - "Oglasi na celotnem zaslonu so skriti - -Ta funkcija je na voljo samo za starejše naprave" + Oglasi na celotnem zaslonu so skriti Oglasi na celotnem zaslonu so prikazani - - Skrivanje oglasov na celotnem zaslonu deluje samo s starejšimi napravami. Skrij splošne oglase Splošni oglasi so skriti Splošni oglasi so prikazani @@ -518,6 +581,9 @@ Ta funkcija je na voljo samo za starejše naprave" Skrij nalepko plačane promocije Nalepka plačane promocije je skrita Nalepka plačane promocije je prikazana + Skrij pojavne oglase predvajalnika + Pojavni oglasi predvajalnika so skriti + Pojavni oglasi predvajalnika so prikazani Skrij samoproizvedene oglase Samoproizvedeni oglasi so skriti Samoproizvedeni oglasi so prikazani @@ -525,23 +591,18 @@ Ta funkcija je na voljo samo za starejše naprave" Nakupovalne povezave v opisu videoposnetka so skrite Nakupovalne povezave v opisu videoposnetka so prikazane Skrij pasico \"Prikaži izdelke\" - Pasica \"Ogled izdelkov\" v video prekrivanju je skrita - Pasica \"Ogled izdelkov\" v video prekrivanju je prikazana - Skrij rezultate spletnega iskanja - Rezultati spletnega iskanja so skriti - Rezultati spletnega iskanja so prikazani - - - Skrij promocije YouTube Premium - Promocije YouTube Premium pod video predvajalnikom so skrite - Promocije YouTube Premium pod video predvajalnikom so prikazane + Pasica za ogled izdelkov v prekrivanju predvajalnika je skrita + Pasica za ogled izdelkov v prekrivanju predvajalnika je prikazana + Skrij promocije YouTube Premium + Promocije YouTube Premium so skrite + Promocije YouTube Premium so prikazane Skrij oglase v videoposnetkih Oglasi v videoposnetkih so skriti Oglasi v videoposnetkih so prikazani - + URL je kopiran v odložišče URL s časovnim žigom je kopiran Pokaži gumb za kopiranje URL-ja videoposnetka @@ -557,10 +618,10 @@ Ta funkcija je na voljo samo za starejše naprave" Opozorilo bo prikazano To ne obide starostne omejitve. Samo samodejno jo sprejme. - - Onemogoči pojavno okno \"Prijavite se v TV\" - Pojavno okno za prijavo v TV je onemogočeno - Pojavno okno za prijavo v TV je omogočeno + + Onemogoči pojavno okno \"Prijavite se v TV\" + Pojavno okno za prijavo v TV je onemogočeno + Pojavno okno za prijavo v TV je omogočeno Onemogoči preskok poglavja z dvojnim dotikom @@ -593,10 +654,10 @@ Preverite, ali je ime paketa pravilno in ali je aplikacija nameščena" Kretnja je onemogočena Kretnja je omogočena - - Omogoči dotik za iskanje - Dotik za iskanje je omogočen - Dotik za iskanje je onemogočen + + Omogoči dotik za iskanje + Dotik za iskanje je omogočen + Dotik za iskanje je onemogočen Omogoči kretnjo za svetlost @@ -677,7 +738,7 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Gumb za komentarje je skrit Gumb za komentarje je prikazan + This button usually appears on live streamed videos. --> Skrij Prijavi Gumb Prijavi je skrit Gumb Prijavi je prikazan @@ -690,7 +751,7 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Gumb Prenesi je skrit Gumb Prenesi je prikazan + This button usually appears on videos uploaded by the logged-in user. --> Skrij Hype Gumb Hype je skrit Gumb Hype je prikazan @@ -703,7 +764,7 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Gumb Hvala je skrit Gumb Hvala je prikazan + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Skrij Vprašaj Gumb Vprašaj je skrit Gumb Vprašaj je prikazan @@ -711,6 +772,7 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Skrij Izrezek Gumb Izrezek je skrit Gumb Izrezek je prikazan + Skrivanje morda ne bo delovalo za nekatere uporabniške račune. Skrij Trgovino Gumb Trgovina je skrit @@ -720,9 +782,9 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Gumb Shrani je skrit Gumb Shrani je prikazan - + Navigacijski gumbi - Skrij ali spremeni gumbe v navigacijski vrstici + Skrij ali spremeni gumbe navigacijske vrstice Skrij Domov Gumb Domov je skrit @@ -744,26 +806,44 @@ Prilagodite glasnost s potegom navpično na desni strani zaslona" Gumb za obvestila je prikazan Zamenjaj Ustvari z Obvestili - "Gumb Ustvari je zamenjan z gumbom Obvestila - -Opomba: Omogočanje tega tudi prisilno skrije video oglase" + Gumb Ustvari je zamenjan z gumbom Obvestila Gumb \"Ustvari\" ni zamenjan z gumbom \"Obvestila\" - "Če onemogočite to nastavitev, boste onemogočili tudi blokiranje oglasov za Shorts. - -Če sprememba te nastavitve ne začne veljati, poskusite preklopiti v način brez beleženja zgodovine." - Skrij oznake gumbov za navigacijo + Če sprememba te nastavitve ne začne veljati, poskusite preklopiti na način brez beleženja zgodovine. + Skrij oznake navigacijskih gumbov Oznake so skrite Oznake so prikazane + Omogoči ozke navigacijske gumbe + Razmik med navigacijskimi gumbi je ozek + Razmik med navigacijskimi gumbi je normalen + Omogoči animacije navigacijske vrstice + Prehodi navigacije so animirani + Prehodi navigacije niso animirani Onemogoči prosojno statusno vrstico Statusna vrstica je neprozorna Statusna vrstica je neprozorna ali prosojna - Na nekaterih napravah lahko omogočitev te funkcije spremeni sistemsko navigacijsko vrstico v prozorno. + "Omejitve: +• Na vrhu predvajalnika videoposnetkov se lahko prikaže črna vrstica. +• Na nekaterih napravah lahko omogočanje te funkcije spremeni sistemsko navigacijsko vrstico v prozorno." Onemogoči svetlo prosojno vrstico Navigacijska vrstica v svetlem načinu je neprosojna Navigacijska vrstica v svetlem načinu je neprozorna ali prosojna Onemogoči temno prosojno vrstico Navigacijska vrstica v temnem načinu je neprosojna Navigacijska vrstica v temnem načinu je neprozorna ali prosojna + Orodna vrstica + Skrij ali spremeni komponente orodne vrstice + Skrij gumb Ustvari + Gumb Ustvari je skrit + Gumb Ustvari je prikazan + Skrij gumb Obvestila + Gumb za obvestila je skrit + Gumb za obvestila je prikazan + Skrij gumb za iskanje + Gumb za iskanje je skrit + Gumb za iskanje je prikazan. + Omogoči široko iskalno vrstico + Široka iskalna vrstica je omogočena + Široka iskalna vrstica je onemogočena Izbirni meni @@ -838,6 +918,12 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Skrij gumb \'Predvajaj\' Gumb za predvajanje je skrit Gumb za predvajanje je prikazan + Skrij gumb za strnitev + Gumb za strnitev je skrit + Gumb za strnitev je prikazan + Skrij gumb za celozaslonski način + Gumb za celozaslonski način je skrit + Gumb za celozaslonski način je prikazan Skrij ozadje kontrolnikov predvajalnika Ozadje nadzornih gumbov predvajalnika je skrito Ozadje kontrolnikov predvajalnika je prikazano @@ -846,9 +932,9 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Gumbi so prikazani - Skrij kartice na končnem zaslonu - Kartice na končnem zaslonu so skrite - Kartice na končnem zaslonu so prikazane + Skrij kartice na končnem zaslonu + Kartice na končnem zaslonu so skrite + Kartice na končnem zaslonu so prikazane Onemogoči ambientalni način v celozaslonskem prikazu @@ -873,10 +959,16 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Skrij iskalno vrstico sličic videa Iskalna vrstica sličic videa je skrita Iskalna vrstica sličic videa je prikazana + Omogoči veliko iskalno vrstico v celozaslonskem načinu + Iskalna vrstica v celozaslonskem načinu je velika + Iskalna vrstica v celozaslonskem načinu je normalne velikosti Predvajalnik Shorts Skrij ali prikaži komponente predvajalnika Shorts + Skrij Shorts na strani kanala + Skrito na strani kanala + Prikazano na strani kanala Skrij Shorts v domačem viru Skrito v domačem viru in povezanih videoposnetkih @@ -888,9 +980,18 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Skrij Shorts v viru naročnin Skrito v viru naročnin Prikazano v viru naročnin + Skrij Shorts v opisu videoposnetka + Skrito v opisu videoposnetka + Prikazano v opisu videoposnetka Skrij kratke posnetke v zgodovini ogledov Skrito v zgodovini ogledov Prikazano v zgodovini ogledov + Skrij gumb AI + Gumb AI je skrit + Gumb AI je prikazan + Skrij oznako \"Samodejno sinhronizirano\" + Oznaka samodejnega sinhroniziranja je skrita + Oznaka samodejnega sinhroniziranja je prikazana Skrij oznako \"Samodejno sinhronizirano\" Oznaka samodejnega sinhroniziranja je skrita Oznaka samodejnega sinhroniziranja je prikazana @@ -952,6 +1053,7 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Skrij gumb \"Uporabi to predlogo\" Gumb Uporabi to predlogo je skrit Gumb Uporabi to predlogo je prikazan + Skrij animacijo fontane gumba \'Všeč mi je\' Animacija fontane všečkov je skrita Animacija fontane všečkov je prikazana @@ -994,7 +1096,12 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Navigacijska vrstica je skrita Navigacijska vrstica je prikazana - + + Skrij predogled samodejnega predvajanja + Predogled samodejnega predvajanja je skrit + Predogled samodejnega predvajanja je prikazan + + Skrij predlagani videoposnetek na koncu zaslona "Predlagani videoposnetek na koncu zaslona je skrit, ko je samodejno predvajanje izklopljeno @@ -1013,9 +1120,9 @@ Nastavitve → Predvajanje → Samodejno predvajanje naslednjega videoposnetka"< Časovni žig je prikazan - Skrij pojavna okna predvajalnika - Pojavna okna predvajalnika so skrita - Pojavna okna predvajalnika so prikazana + Skrij pojavna okna predvajalnika + Pojavna okna predvajalnika so skrita + Pojavna okna predvajalnika so prikazana Zapusti način celotnega zaslona ob koncu videoposnetka @@ -1044,6 +1151,7 @@ Nastavitve → Predvajanje → Samodejno predvajanje naslednjega videoposnetka"< Znova naloži videoposnetek, da glasuješ z Return YouTube Dislike Skrito s strani lastnika + Return YouTube Dislike Všečkov ne so prikazani Všečkov ne niso prikazani Pokaži všečkov ne na Shorts @@ -1064,6 +1172,7 @@ Omejitev: Število »Ni mi všeč« se morda ne bo prikazalo v načinu brez bele Pokaži obvestilo, če API ni na voljo Obvestilo se prikaže, če Return YouTube Dislike ni na voljo Obvestilo se ne prikaže, če Return YouTube Dislike ni na voljo + ReturnYouTubeDislike.com Podatki so zagotovljeni s strani API-ja Return YouTube Dislike. Tapnite tukaj, če želite izvedeti več Statistika API-ja ReturnYouTubeDislike za to napravo @@ -1083,25 +1192,8 @@ Omejitev: Število »Ni mi všeč« se morda ne bo prikazalo v načinu brez bele Na omejitev stopnje za klienta je bilo naletov %d-krat %d milisekund - - Omogoči široko iskalno vrstico - Široka iskalna vrstica je omogočena - Široka iskalna vrstica je onemogočena - - - Omogoči sličice visoke kakovosti - Sličice za iskanje so visoke kakovosti - Sličice za iskanje so srednje kakovosti - "To bo obnovilo tudi sličice v živo prenosu, ki nimajo sličic s časovnico. - -Sličice s časovnico bodo uporabljale isto kakovost kot trenutni videoposnetek. - -Ta funkcija deluje najbolje pri kakovosti videa 720p ali nižji in pri uporabi zelo hitre internetne povezave." - Obnovi stare sličice za iskanje - Sličice za iskanje se bodo prikazale nad iskalno vrstico - Sličice za iskanje se bodo prikazale v celozaslonskem načinu - + SponsorBlock Omogoči SponsorBlock SponsorBlock je sistem množičnega urejanja za preskakovanje motečih delov videoposnetkov YouTube Videz @@ -1200,7 +1292,7 @@ Uporabniški ID je, kot je geslo, zato ga nikoli ne delite." Digresija / Šale Povezane scene ali šale, ki niso potrebne za razumevanje glavne vsebine videa. Ne vključuje odsekov, ki zagotavljajo kontekst ali podrobnosti ozadja Glasba: Odsek brez glasbe - Samo za uporabo v glasbenih videoposnetkih. Odseki glasbenih videoposnetkov brez glasbe, ki jih še niso zajeli drugi kategoriji + Samo za uporabo v glasbenih videoposnetkih. Odseki glasbenih videoposnetkov brez glasbe, ki jih še niso zajeli druge kategorije Preskoči Označi Preskoči sponzorja @@ -1244,7 +1336,7 @@ Uporabniški ID je, kot je geslo, zato ga nikoli ne delite." Segmenta ni mogoče oddati (stanje: %1$d %2$s) Segmenta ni mogoče poslati. Hitrostno omejeno (preveč z istega uporabnika ali IP-ja) Segmenta ni mogoče oddati: %s - "Segmenta ni mogoče poslati. + "Segmenta ni mogoče oddati. Že obstaja" Segment je bil uspešno oddan @@ -1310,6 +1402,7 @@ Ali ste pripravljeni na oddajo?" Prosojnost: Barva: O programu + sponsor.ajay.app Podatki so zagotovljeni s strani SponsorBlock API. Tapnite tukaj, da izveste več in si ogledate prenose za druge platforme @@ -1339,8 +1432,6 @@ To bo spremenilo videz in funkcije aplikacije, vendar se lahko pojavijo neznani Cilj spoofa različice aplikacije 20.13.41 - Obnovi nezloženo video akcijsko vrstico 20.05.46 - Obnovi funkcionalnost prepisa - 19.35.36 - Obnovi stare ikone predvajalnika Shorts - 19.01.34 – Obnovi stare ikone za krmarjenje Spremeni začetno stran @@ -1362,6 +1453,7 @@ To bo spremenilo videz in funkcije aplikacije, vendar se lahko pojavijo neznani Predvajalni seznami Iskanje Nakupovanje + Shorts Šport Naročnine Trendi @@ -1428,6 +1520,10 @@ Minipredvajalnik lahko povlečete z zaslona na levo ali desno" Prekrivni gumbi so skriti Prekrivni gumbi so prikazani Skrij gumbe za razširitev in zapiranje + "Gumbi so skriti + +Podrsnite za razširitev ali zapiranje" + Prikazana sta gumba za razširitev in zapiranje Skrij podnaslove Podnaslovi so skriti Podnaslovi so prikazani @@ -1446,8 +1542,9 @@ Minipredvajalnik lahko povlečete z zaslona na levo ali desno" Zaslon za nalaganje bo imel ozadje z gradientom Zaslon za nalaganje bo imel enobarvno ozadje Slog uvodnega zaslona - Barva - Črno-belo + Onemogočeno + Barva + Črno-belo Omogoči prilagojeno barvo drsnika Prilagojena barva drsnika je prikazana Izvorna barva drsnika je prikazana @@ -1457,11 +1554,17 @@ Minipredvajalnik lahko povlečete z zaslona na levo ali desno" Barva poudarka iskalnika Neveljavna vrednost barve drsnika - + + YouTube ReVanced + YT ReVanced + YT + Logotip glave Privzeto Navadno + Premium + ReVanced ReVanced minimalno Po meri @@ -1486,6 +1589,7 @@ Omogočanje tega lahko odpravi manjkajoče slike, ki so v nekaterih regijah blok DeArrow & Prvotne sličice DeArrow & Sličice iz posnetkov Sličice iz posnetkov + DeArrow "DeArrow omogoča množice pridobljene sličice za videoposnetke v YouTubu. Te sličice so pogosto bolj relevantne od tistih, ki jih zagotavlja YouTube Če je omogočeno, bodo URL-ji videoposnetkov poslani na strežnik API in ne bodo poslani nobeni drugi podatki. Če videoposnetek nima sličic DeArrow, se prikažejo izvirne ali posnetki zaslona @@ -1529,7 +1633,11 @@ Tapnite tukaj, če želite izvedeti več o DeArrow" Ponavljanje videa je vklopljeno Ponavljanje videa je izklopljeno - + + Začasno ustavi ob prekinitvi zvoka + Predvajanje se začasno ustavi, ko se predvajajo drugi zvoki (npr. navigacija) + Glasnost se zmanjša, ko se predvajajo drugi zvoki + Ponarejanje dimenzij naprave "Dimenzije naprave so posnemane @@ -1552,6 +1660,9 @@ Omogočanje tega lahko odklene višje kakovosti videa" Onemogoči haptiko za razveljavitev iskanja Haptika za razveljavitev iskanja je onemogočena Haptika za razveljavitev iskanja je omogočena + Onemogoči haptiko dotika in držanja + Haptika dotika in držanja je onemogočena + Haptika dotika in držanja je omogočena Onemogoči haptiko pri povečavi Haptika pri povečavi je onemogočena Haptika pri povečavi je omogočena @@ -1647,6 +1758,11 @@ Omejitve: Napredni meni za kakovost videoposnetkov je prikazan Napredni meni za kakovost videoposnetkov ni prikazan + + Skrij možnosti vrhunske kakovosti + Možnosti vrhunske kakovosti so skrite + Možnosti vrhunske kakovosti so prikazane + Omogoči drsno iskanje Drsno iskanje je omogočeno @@ -1676,8 +1792,13 @@ Predvajanje videa z AV1 se lahko zatika ali izpušča sličice." - + + YT Music ReVanced + Music ReVanced + Music + + O Oglasi Splošno diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 9eeb27c84e..b3942910f6 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -79,6 +79,9 @@ Second \"item\" text" Shfaq historikun e kërkimeve të cilësimeve Historiku i kërkimeve të cilësimeve është shfaqur Historia e kërkimit të cilësimeve nuk shfaqet + Çaktivizo ikonat e theksuara + Ikonat nuk janë të theksuara + Ikonat janë të theksuara Shfaq ikonat e cilësimeve të ReVanced Ikonat e cilësimeve shfaqen Ikonat e cilësimeve nuk shfaqen @@ -98,23 +101,23 @@ Për të përkthyer gjuhë të reja ose për të përmirësuar përkthimet ekzis and changes made here must also be made there. --> - Cilësimet e GmsCore - Cilësimet për GmsCore + GmsCore + Cilësimet lidhur me GmsCore + Kontrollo për azhurnime të GmsCore + Kontrollimi për azhurnime është aktivizuar + Kontrolli për përditësime është çaktivizuar + Hap Cilësimet e GmsCore + Cilësimet e GmsCore - MicroG GmsCore nuk është instaluar. Instalojeni. - Veprim i nevojshëm - "MicroG GmsCore nuk ka leje të funksionojë në sfond. - -Ndiqni udhëzuesin \"Mos e vrisni aplikacionin tim\" për telefonin tuaj dhe aplikoni udhëzimet në instalimin tuaj MicroG. - -Kjo është e nevojshme që aplikacioni të funksionojë." - Hap faqen e internetit - "Optimizimet e baterisë së MicroG GmsCore duhet të çaktivizohen për të parandaluar problemet. - -Çaktivizimi i optimizimeve të baterisë për MicroG nuk do të ndikojë negativisht në përdorimin e baterisë. - -Prekni butonin vazhdo dhe lejoni ndryshimet e optimizimit." - Vazhdo + MicroG GmsCore nuk është instaluar. Instalojeni. + Veprim i nevojshëm + Dështoi kontrolli për përditësimet e MicroG GmsCore + Një version i ri (%1$s) i MicroG GmsCore është i disponueshëm. Aktualisht, po përdorni versionin %2$s. + "MicroG GmsCore nuk ka leje të funksionojë në sfond.\n\nNdiqni udhëzuesin \"Mos e vrisni aplikacionin tim\" për telefonin tuaj dhe aplikoni udhëzimet në instalimin tuaj MicroG.\n\nKjo është e nevojshme që aplikacioni të funksionojë." + Hap faqen e internetit + Anulo + "Optimizimet e baterisë së MicroG GmsCore duhet të çaktivizohen për të parandaluar problemet.\n\nÇaktivizimi i optimizimeve të baterisë për MicroG nuk do të ndikojë negativisht në përdorimin e baterisë.\n\nPrekni butonin vazhdo dhe lejoni ndryshimet e optimizimit." + Vazhdo Falsifiko transmetimet video @@ -168,10 +171,11 @@ Ju nuk do të njoftoheni për ndonjë ngjarje të papritur." Flamujt u ruajtën Flamujt u rivendosën Flamujt u kopjuan në kujtesën e punës - Regjistro protokol buffer - Regjistrimet e depurimit përfshijnë proto buffer - Regjistrimet e depurimit nuk përfshijnë proto buffer - "Aktivizimi i këtij opsioni do të regjistrojë të dhëna shtesë të paraqitjes, duke përfshirë tekstin në ekran për disa komponentë të ndërfaqes përdoruese. + Rinisni aplikacionin për të përdorur këtë veçori + Regjistro protokol buffer + Regjistrimet e depurimit përfshijnë proto buffer + Regjistrimet e depurimit nuk përfshijnë proto buffer + "Aktivizimi i këtij opsioni do të regjistrojë të dhëna shtesë të paraqitjes, duke përfshirë tekstin në ekran për disa komponentë të ndërfaqes përdoruese. Kjo mund të ndihmojë në identifikimin e komponentëve kur krijoni filtra të personalizuar. @@ -218,6 +222,9 @@ Gjithsesi, aktivizimi i këtij opsioni do të regjistrojë edhe disa të dhëna Lujtja në sfond e Shorts është e aktivizuar + Fshih raftin e dyqanit të krijuesit + Rafti i dyqanit të krijuesit nën luajtësin e videos është i fshehur. + Rafti i dyqanit të krijuesve nën luajtësin e videos shfaqet Fshih kartat e albumit Kartat e albumit janë të fshehura Kartat e albumit janë të dukshme @@ -227,6 +234,9 @@ Gjithsesi, aktivizimi i këtij opsioni do të regjistrojë edhe disa të dhëna Fshi raftët me çipat Raftet me çipat janë të fshehura Raftet me çipat janë të dukshme + Fshih seksionin e komenteve nën videot në burimin kryesor + Seksioni i komenteve nën videot në burimin kryesor është i fshehur + Seksioni i komenteve nën videot në burimin kryesor është i shfaqur Fshi postimet e komunitetit Postimet e komunitetit janë të fshehura Postimet e komunitetit janë të dukshme @@ -254,14 +264,19 @@ Gjithsesi, aktivizimi i këtij opsioni do të regjistrojë edhe disa të dhëna Fshi postimet e fundit Postimet e fundit janë të fshehura Postimet e fundit janë të dukshme + + Fsheh butonin \'Video të fundit\' + Butoni \'Video të fundit\' është i fshehur + Butoni \'Video të fundit\' është i shfaqur Fshi përzierjet e listave të këngëve Përzierjet e listave të këngëve janë të fshehura Përzierjet e listave të këngëve janë të dukshme Fshi seksionin e filmave Seksioni i filmave është i fshehur Seksioni i filmave është i dukshme - + Fshih butonin \"Njoftomë\" Butoni \"Njoftomë\" është i fshehur. Butoni \"Njoftomë\" shfaqet. @@ -286,13 +301,16 @@ Gjithsesi, aktivizimi i këtij opsioni do të regjistrojë edhe disa të dhëna Fshi ndarësin vizual Ndarësi vizual është fshehur Ndarësi vizual është shfaqur + Fsheh rezultatet e kërkimit në ueb + Rezultatet e kërkimit në ueb janë të fshehur + Rezultatet e kërkimit në ueb janë të dukshme + Fshih seksionin \'Mund t\'ju pëlqejë\' + \'Mund t\'ju pëlqejë\' seksioni është i fshehur + \'Mund t\'ju pëlqejë\' seksioni është i shfaqur Fsheh YouTube Doodles Animacioni \"Doodles\" i YouTube në logo është i fshehur. Animacioni YouTube Doodles në logo shfaqet - "YouTube Doodles shfaqen disa ditë në vit. - -Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është aktivizuar, atëherë shiriti i filtër nën shiritin e kërkimit gjithashtu do të fshihet." Fshi shiritin e kanalit Shiriti i kanalit është i fshehur Shiriti i kanalit është i dukshme @@ -309,10 +327,15 @@ Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është Panelet informuese janë të fshehura Panelet informuese janë të dukshme + This button usually appears in the video player for certain videos. --> Fshih butonin Anëtarësohu Butoni \"Bashkohu\" është i fshehur. Butoni \"Bashkohu\" shfaqet. + + Fsheh butonin \'Riprodhim bisede live\' + Butoni \'Riprodhim bisede live\' në mbivendosjen e luajtësit është i fshehur + Butoni \'Riprodhim bisede live\' në mbivendosjen e luajtësit është i shfaqur Fshi panele mjekësore Panelet mjekësore janë të fshehura Panelet mjekësore janë të dukshme @@ -328,6 +351,9 @@ Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është Fshih reagimet e kohës Reagimet e kohës janë të fshehura Reagimet e kohës janë të dukshme + Fsheh titullin e videos + Titulli i videos në mbivendosjen e luajtësit është i fshehur + Titulli i videos në mbivendosjen e luajtësit është i shfaqur Fshih \"Përmbledhjen e videos të krijuar nga AI\" Seksioni i përmbledhjes së videos të gjeneruar nga AI është fshehur Seksioni i përmbledhjes së videos i gjeneruar nga AI është i shfaqur @@ -340,33 +366,62 @@ Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është Fshih Kapitujt Seksioni i Kapitujve është i fshehur Seksioni i Kapitujve është i dukshme - Fshih \'Si u krijua ky përmbajtje\' - Seksioni si u krijua kjo përmbajtje është i fshehur - Seksioni si u krijua kjo përmbajtje është i shfaqur - Fsheh pikët e Hype-it - Pikët e Hype-it janë të fshehura - Pikët e Hype-it janë të shfaqura + Fshih \'Progresin e kursit\' + Seksioni i progresit të kursit është i fshehur + Seksioni i progresit të kursit është i shfaqur + Fshih Eksplorimin + Seksionet \'Eksploro këtë kurs\' dhe \'Eksploro podkastin\' janë të fshehura + Seksionet \'Eksploro këtë kurs\' dhe \'Eksploro podkastin\' janë të shfaqura + Fshih \'Eksploro këtë kurs\' + Seksioni \'Eksploro këtë kurs\' është i fshehur + Seksioni \'Eksploro këtë kurs\' është i shfaqur + Fshih \'Eksploro podkastin\' + Seksioni eksploro podkastin është i fshehur + Seksioni eksploro podkastin është i shfaqur Fshih \'Eksploro podkastin\' Seksioni eksploro podkastin është i fshehur Seksioni eksploro podkastin është i shfaqur Fsheh lidhjet e veçuara Seksioni i lidhjeve të veçuara është fshehur Seksioni i lidhjeve të veçuara është shfaqur + Fshih \'Vendet e veçuara\' + Seksioni i vendeve të veçuara është i fshehur + Seksioni i vendeve të veçuara është i shfaqur Fshi videot e veçuara Seksioni i videove të veçuara është fshehur Seksioni i videove të veçuara është shfaqur + Aktivizo filtrin e menysë lëvizëse të burimit + Filtri i menysë lëvizëse të burimit është i aktivizuar + Filtri i menysë lëvizëse të burimit është i çaktivizuar + Filtri i menysë lëvizëse të burimit + Futni emrat e menysë lëvizëse për të filtruar, një për rresht + Fshih Lojërat + Seksioni i lojërave është i fshehur + Seksioni i lojërave është i shfaqur + Fshih \'Si u krijua ky përmbajtje\' + Seksioni si u krijua kjo përmbajtje është i fshehur + Seksioni si u krijua kjo përmbajtje është i shfaqur + Fsheh pikët e Hype-it + Pikët e Hype-it janë të fshehura + Pikët e Hype-it janë të shfaqura Fshih kartat e informacionit Seksioni i kartave informative është i fshehur Seksioni i kartave informative është i dukshme Fshih \'Konceptet kryesore\' Seksioni i koncepteve kryesore është i fshehur Seksioni i koncepteve kryesore është i shfaqur + Fshih Muzikën + Seksioni i muzikës është i fshehur + Seksioni i muzikës është i shfaqur Fshi butonin Abonohu Butoni Abonohu është fshehur Butoni Abonohu është shfaqur Fshih Transkriptin Seksioni i Shkrimit është i fshehur Seksioni i Shkrimit është i dukshme + Fshih Kuizet + Seksioni i kuizeve është i fshehur + Seksioni i kuizeve është i shfaqur Përshkrimi i videos Fshi ose shfaq komponentët e përshkrimit të videos Shiriti i filtrimit @@ -385,6 +440,11 @@ Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është Shfaqur në historikun e shikimeve Faqja e kanalit Fshih ose shfaq komponentët e faqes së kanalit + Aktivizo filtrin e skedës së kanalit + Filtri i skedës së kanalit është i aktivizuar + Filtri i skedës së kanalit është i çaktivizuar + Filtri i skedës së kanalit + Futni emrat e skedave të kanalit për të filtruar, një për rresht Fshi butonin Komuniteti Butoni i komunitetit është fshehur @@ -448,15 +508,15 @@ Nëse një Doodle po shfaqet aktualisht në rajonin tuaj dhe kjo fshehje është Numri i shikimeve shfaqet në burim dhe rezultatet e kërkimit "Kufizimet: -• Raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende numrin e shikimeve -• Ky funksion nuk funksionon me faktorin e formës së automobilave" +• Raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende numrin e shikimeve. +• Ky funksion nuk funksionon me faktorin e formës së automobilave." Fshih kohën e ngarkimit Koha e ngarkimit fshihet në fluks dhe rezultatet e kërkimit Koha e ngarkimit shfaqet në fluks dhe rezultatet e kërkimit "Kufizimet: -• raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende kohën e ngarkimit -• Kjo veçori nuk funksionon me faktorin e formës automobilistike" +• Raftet e Shorts, faqet e kanaleve dhe rezultatet e kërkimit mund të shfaqin ende kohën e ngarkimit. +• Kjo veçori nuk funksionon me faktorin e formës automobilistike." Fsheh përmbajtjen e fjalëve kyçe Fsheh videot e kërkimit dhe të ushqimit duke përdorur filtre fjalësh kyçe Fsheh videot e faqes së fillimit sipas fjalëve kyçe @@ -479,7 +539,7 @@ Words with uppercase letters in the middle must be entered with the casing (ie: Rreth filtrimit të fjalëve kyçe "Rezultatet e kërkimit në Shtëpi/Abonime/Kërkime janë filtruar për të fshehur përmbajtjen që përputhet me frazat kyçe -Kufizime +Kufizime: • Shorts nuk mund të fshihen sipas emrit të kanalit • Disa përbërës të UI mund të mos fshihen • Kërkimi për një fjalë kyçe mund të mos tregojë rezultate" @@ -494,19 +554,12 @@ Kufizime Fjala kyçe do të fshehë të gjitha videot: %s - Fshih raftin e dyqanit të krijuesit - Rafti i dyqanit të krijuesit nën luajtësin e videos është i fshehur. - Rafti i dyqanit të krijuesve nën luajtësin e videos shfaqet Fsheh bannerin e dyqanit të ekranit përfundimtar Baneri i dyqanit në ekranin përfundimtar është i fshehur. Baneri i dyqanit në ekranin përfundimtar shfaqet. Fsheh reklamimet me ekran të plotë - "Reklamat në ekran të plotë janë të fshehura - -Kjo veçori është e disponueshme vetëm për pajisje më të vjetra" + Reklamimet me ekran të plotë janë të fshehura Reklamimet me ekran të plotë janë të dukshme - - Fshehja e reklamave me ekran të plotë funksionon vetëm me pajisje më të vjetra Fsheh reklamimet e përgjithshme Reklamimet e përgjithshme janë të fshehur Reklamimet e përgjithshme janë të dukshme @@ -516,6 +569,9 @@ Kjo veçori është e disponueshme vetëm për pajisje më të vjetra" Fsheh etiketën e promovimit të paguar Etiketë e promovimit të paguar është e fshehur Etiketë e promovimit të paguar është e dukshme + Fsheh reklamat pop-up të luajtësit + Reklamat pop-up të luajtësit janë të fshehura + Reklamat pop-up të luajtësit janë të shfaqura Fsheh kartat e sponsorizuara vetë Kartat e sponsorizuara vetë janë të fshehur Kartat e sponsorizuara vetë janë të dukshme @@ -523,23 +579,18 @@ Kjo veçori është e disponueshme vetëm për pajisje më të vjetra" Lidhjet e blerjeve në përshkrimin e videos janë të fshehura. Lidhjet e blerjeve në përshkrimin e videos shfaqen Fshih banerin \'Shiko produkte\' - Baneri \"Shiko produkte\" në mbivendosjen e videos është i fshehur. - Baneri \"Shiko produkte\" në mbivendosjen e videos shfaqet. - Fsheh rezultatet e kërkimit në ueb - Rezultatet e kërkimit në ueb janë të fshehur - Rezultatet e kërkimit në ueb janë të dukshme - - - Fsheh promovimet e YouTube Premium - Promovimet e YouTube Premium nën lojtarin e videos janë të fshehur - Promovimet e YouTube Premium nën lojtarin e videos janë të dukshme + Baneri \"Shiko produkte\" në mbivendosjen e luajtësit është i fshehur + Baneri \"Shiko produkte\" në mbivendosjen e luajtësit është i shfaqur + Fsheh promovimet e YouTube Premium + Promovimet e YouTube Premium janë të fshehura + Promovimet e YouTube Premium janë të shfaqura Fsheh reklamimet e videos Reklamimet e videos janë të fshehur Reklamimet e videos janë të dukshme - + URL u kopjua në shkëmbim URL me kohëzgjatje u kopjua Shfaq butonin e kopjimit të URL-së së videos @@ -555,10 +606,10 @@ Kjo veçori është e disponueshme vetëm për pajisje më të vjetra" Kutia e dialogut do të shfaqet Kjo nuk e anashkalon kufizimin e moshës. Thjesht e pranon atë automatikisht. - - Çaktivizo dritaren kërcyese \"Hyni në TV\" - Dritarja kërcyese Hyr në TV është çaktivizuar - Dritarja kërcyese Hyr në TV është aktivizuar + + Çaktivizo dritaren kërcyese \"Hyni në TV\" + Dritarja kërcyese Hyr në TV është çaktivizuar + Dritarja kërcyese Hyr në TV është aktivizuar Çaktivizo anashkalimin e kapitullit me prekje të dyfishtë @@ -591,10 +642,10 @@ Verifikoni që emri i paketës është i saktë dhe aplikacioni është instalua Lëvizja është e çaktivizuar Lëvizja është e aktivizuar - - Aktivizo prekjen për të kërkuar - Aktivizo prekjen për të kërkuar - Prekja për të kërkuar është e çaktivizuar + + Aktivizo prekjen për të kërkuar + Aktivizo prekjen për të kërkuar + Prekja për të kërkuar është e çaktivizuar Aktivizo lëvizjen e ndriçimit @@ -675,7 +726,7 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Butoni i komenteve është i fshehur Butoni i komenteve është shfaqur + This button usually appears on live streamed videos. --> Fsheh \"Raporton\" Butoni \"Raporton\" është i fshehur Butoni \"Raporton\" është i dukshëm @@ -688,7 +739,7 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Butoni \"Shkarko\" është i fshehur Butoni \"Shkarko\" është i dukshëm + This button usually appears on videos uploaded by the logged-in user. --> Fsheh Zhurmën Butoni Hype është i fshehur Butoni Hype është i shfaqur @@ -701,7 +752,7 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Butoni \"Faleminderit\" është i fshehur Butoni \"Faleminderit\" është i dukshëm + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Fshih Pyet Butoni Pyet është i fshehur Butoni Pyet shfaqet @@ -709,6 +760,7 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Fsheh \"Klip\" Butoni \"Klip\" është i fshehur Butoni \"Klip\" është i dukshëm + Fshehja mund të mos funksionojë për disa llogari përdoruesish. Fshih Dyqanin Butoni i dyqanit është fshehur @@ -718,13 +770,13 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Butoni Ruaj është i fshehur Butoni Ruaj është i shfaqur - + Butonat e navigimit - Fsheh ose ndrysho butonat në shiritin e navigimit + Fshih ose ndrysho butonat e shiritit të navigimit - Fsheh \"Shtëpia\" - Butoni \"Shtëpia\" është i fshehur - Butoni \"Shtëpia\" është i dukshëm + Fshih Kreun + Butoni Kryesore është fshehur + Butoni Kryesore është shfaqur Fsheh \"Shorts\" Butoni \"Shorts\" është i fshehur @@ -742,26 +794,44 @@ Përshtate shkëlqimin duke rrëshqitur vertikalisht në anën e majtë të ekra Butoni i njoftimeve është shfaqur Ndërro \"Krijoni\" me \"Njoftimet\" - "Butoni i krijimit është ndërruar me butonin e njoftimeve - -Shënim: Aktivizimi i kësaj gjëje gjithashtu fsheh me forcë reklamat video" + Butoni \"Krijoni\" është i ndërruar me butonin \"Njoftimet\" Butoni \"Krijoni\" nuk është i ndërruar me butonin \"Njoftimet\" - "Çaktivizimi i këtij konfigurimi do të çaktivizojë gjithashtu bllokimin e reklamave të Shorts. - -Nëse ndryshimi i këtij konfigurimi nuk ka efekt, provoni të kaloni në modalitetin Incognito." - Fsheh etiketat e butonave të navigimit - Etiketat janë të fshehura - Etiketat janë të dukshme + Nëse ndryshimi i këtij cilësimi nuk ka efekt, provoni të kaloni në modalitetin Incognito. + Fshih etiketat e butonave të navigimit + Etiketat janë fshehur + Etiketat janë shfaqur + Aktivizo butona të ngushtë të navigimit + Hapësira midis butonave të navigimit është e ngushtë + Hapësira midis butonave të navigimit është normale + Aktivizo animacionet e shiritit të navigimit + Tranzicionet e navigimit janë të animuara + Tranzicionet e navigimit nuk janë të animuara Çaktivizo barin transparent të statusit Shiriti i statusit është opak Shiriti i statusit është opak ose translucent - Në disa pajisje, aktivizimi i këtij funksioni mund ta ndryshojë shiritin e navigimit të sistemit në transparent. + "Kufizimet: +• Një shirit i zi mund të shfaqet në pjesën e sipërme të luajtësit të videos. +• Në disa pajisje, aktivizimi i kësaj veçorie mund të ndryshojë shiritin e navigimit të sistemit në transparent." Çaktivizo barin transparent të navigacionit të lehtë Barra e navigacionit në modalitetin e dritës është e paqartë Shiriti i navigimit në modalitetin e ndritshëm është opak ose translucent Çaktivizoni shiritin e errët translucent Barra e navigacionit në modalitetin e errët është e paqartë Shiriti i navigimit në modalitetin e errët është opak ose translucent + Shiriti i veglave + Fshih ose ndrysho komponentët e shiritit të veglave + Fsheh butonin Krijoni + Butoni Krijoni është i fshehur + Butoni Krijoni është i dukshëm + Fsheh butonin Njoftimet + Butoni i njoftimeve është i fshehur + Butoni i njoftimeve është shfaqur + Fsheh butonin e kërkimit + Butoni i kërkimit është fshehur + Butoni i kërkimit është shfaqur. + Aktivizo shiritin e gjerë kërkimi + Shiriti i gjerë kërkimi është i aktivizuar + Shiriti i gjerë kërkimi është i deaktivizuar Menyja \"Fshi\" @@ -836,6 +906,12 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Fsheh butonin Transmeto Butoni \"Transmeto\" është i fshehur Butoni \"Transmeto\" është i dukshëm + Fsheh butonin Palos + Butoni Palos është i fshehur + Butoni Palos është i shfaqur + Fsheh butonin Ekran i plotë + Butoni Ekran i plotë është i fshehur + Butoni Ekran i plotë është i shfaqur Fshih sfondin e kontrollave të luajtësit Sfondi i kontrolleve të luajtësit është i fshehur Sfondi i kontrolleve të luajtësit është shfaqur. @@ -844,9 +920,9 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Butonat janë të dukshme - Fsheh kartat e ekranit të fundit - Kartat e ekranit të fundit janë të fshehura - Kartat e ekranit të fundit janë të dukshme + Fsheh kartat e ekranit të fundit + Kartat e ekranit të fundit janë të fshehura + Kartat e ekranit të fundit janë të dukshme Çaktivizo modalitetin Ambient në ekran të plotë @@ -871,10 +947,16 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Fshih shiritin e kërkimit të minikopjeve të videos Shiriti i kërkimit të minikopjeve të videos është fshehur Shiriti i kërkimit të minikopjeve të videos është shfaqur + Aktivizo shkallën e kërkimit të madhe në ekran të plotë + Shkalla e kërkimit në ekran të plotë është e madhësisë së madhe + Shkalla e kërkimit në ekran të plotë është e madhësisë normale Lojtari i Shorts Fshih ose shfaq komponentët e luajtësit të Shorts + Fsheh Shorts në faqen e kanalit + I fshehur në faqen e kanalit + I shfaqur në faqen e kanalit Fshih \"Shorts\" në faqen kryesore. Fshehur në faqen kryesore dhe videot e lidhura. @@ -886,9 +968,18 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Fshih \"Shorts\" në burimin e Abonimeve. Fshehur në burimin e Abonimeve. Shfaqur në burimin e Abonimeve. + Fsheh Shorts në përshkrimin e videos + I fshehur në përshkrimin e videos + I shfaqur në përshkrimin e videos Fsheh Shorts në historinë e shikimit Fshehur në historinë e shikimit Shfaqet në historinë e shikimit + Fsheh butonin AI + Butoni AI është i fshehur + Butoni AI është i shfaqur + Fsheh etiketën \"Auto-dubluar\" + Etiketa e dubluar automatikisht është fshehur + Etiketa e dubluar automatikisht është shfaqur Fsheh etiketën \"Auto-dubluar\" Etiketa e dubluar automatikisht është fshehur Etiketa e dubluar automatikisht është shfaqur @@ -950,6 +1041,7 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Fsheh butonin \"Përdor këtë shabllon\" Butoni Përdor këtë shabllon është fshehur Butoni Përdor këtë shabllon është shfaqur + Fshih animacionin e shpërdërjes së Të Pëlqejt Animacioni i fontanës \"Pëlqen\" është i fshehur Animacioni i fontanës \"Pëlqen\" është i dukshëm @@ -992,7 +1084,12 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Shiriti i navigimit është i fshehur Shiriti i navigimit është i dukshëm - + + Fsheh pamjen paraprake automatike + Pamja paraprake automatike është e fshehur + Pamja paraprake automatike është e shfaqur + + Fshih videon e sugjeruar në ekranin fundor "Videoja e sugjeruar në ekranin fundor fshihet kur çaktivizohet luajtja automatike @@ -1011,9 +1108,9 @@ Cilësimet → Luajtja → Luaj automatikisht videon tjetër" Vula e kohës është e dukshme - Fsheh panelet pop-up të riprodhuesit - Panelet pop-up të riprodhuesit janë të fshehura - Panelet pop-up të riprodhuesit janë të dukshme + Fsheh panelet pop-up të riprodhuesit + Panelet pop-up të riprodhuesit janë të fshehura + Panelet pop-up të riprodhuesit janë të dukshme Dilni nga gjithëshkëmbja në fund të videos @@ -1081,24 +1178,6 @@ Kufizimi: Mospëlqimet mund të mos shfaqen në modalitetin incognito" Kuota e klientit është hasur %d herë %d milisekonda - - Aktivizo shiritin e gjerë kërkimi - Shiriti i gjerë kërkimi është i aktivizuar - Shiriti i gjerë kërkimi është i deaktivizuar - - - Aktivizo miniatiurat me cilësi të lartë - Miniatiurat e shiritit të kërkimi janë me cilësi të lartë - Miniatiurat e shiritit të kërkimi janë me cilësi të mesme - "Kjo gjithashtu do të rikthejë miniaturat në transmetimet live që nuk kanë miniatura seekbar. - -Miniaturat seekbar do të përdorin të njëjtën cilësi me videon aktuale. - -Kjo veçori funksionon më mirë me një cilësi video prej 720p ose më të ulët dhe kur përdor një lidhje interneti shumë të shpejtë." - Rivendos miniatiurat e vjetra të shiritit të kërkimit - Miniatiurat e shiritit të kërkimit do të shfaqen mbi shiritin e kërkimit - Miniatiurat e shiritit të kërkimit do të shfaqen në ekran të plotë - Aktivizo SponsorBlock SponsorBlock është një sistem me burim të shpërndarë për të hequr pjesët e bezdisshme të videove të YouTube @@ -1335,8 +1414,6 @@ Nëse më vonë është çaktivizuar, është e rekomanduar të fshiheni të dh Shënjestër e versionit të aplikacionit të mashtuar 20.13.41 - Rivendos shiritin e veprimeve të videos jo të palosur 20.05.46 - Rivendos funksionalitetin e transkriptit - 19.35.36 - Rikthe ikonat e vjetra të lojtarit Shorts - 19.01.34 - Ristauro ikonave te vjetra te navigimit Ndrysho faqen e fillimit @@ -1434,8 +1511,9 @@ Miniplayer mund të tërhiqet jashtë ekranit në të majtë ose në të djatht Ekrani i ngarkimit do të ketë një sfond me gradient Ekrani i ngarkimit do të ketë një sfond të ngurtë Stili i ekranit hapës - Ngjyra - E zezë dhe e bardhë + E çaktivizuar + Ngjyra + E zezë dhe e bardhë Aktivizo ngjyrën e personalizuar të shkallës së kërkimit Ngjyra e personalizuar e shkallës së kërkimit është e dukshme Ngjyra origjinale e shkallës së kërkimit është e dukshme @@ -1540,6 +1618,9 @@ Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video" Çaktivizo haptikën e zhbërjes së kërkimit Haptika e zhbërjes së kërkimit është çaktivizuar Haptika e zhbërjes së kërkimit është aktivizuar + Çaktivizo haptikën e prekjes dhe mbajtjes + Haptika e prekjes dhe mbajtjes është e çaktivizuar + Haptika e prekjes dhe mbajtjes është e aktivizuar Çaktivizo haptikën e zmadhimit Haptika e zmadhimit është çaktivizuar Haptika e zmadhimit është aktivizuar @@ -1634,6 +1715,11 @@ Kufizimet: Shfaqet menyja e avancuar e cilësisë së videos Menyja e avancuar e cilësisë së videos nuk shfaqet + + Fsheh opsionet e cilësisë Premium + Opsionet e cilësisë Premium janë të fshehura + Opsionet e cilësisë Premium janë të shfaqura + Aktivizo rrëshqitjen për kërkim Rrëshqitja për kërkim është e aktivizuar @@ -1665,6 +1751,7 @@ Luajtja e videos me AV1 mund të ngecë ose të humbasë korniza." + Rreth Reklama E përgjithshme diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 3db4a778e9..15fedb1aac 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Prikaži istoriju pretrage podešavanja Istorija pretrage podešavanja je prikazana Istorija pretrage podešavanja nije prikazana + Onemogući podebljane ikone + Ikone nisu podebljane + Ikone su podebljane Prikaži ikonice podešavanja ReVanceda Ikonice podešavanja su prikazane Ikonice podešavanja nisu prikazane @@ -99,23 +102,31 @@ Da biste preveli nove jezike ili poboljšali postojeće prevode, posetite transl and changes made here must also be made there. --> - Podešavanja GmsCorea - Podešavanja za GmsCore + GmsCore + Podešavanja za GmsCore + Proveri ažuriranja za GmsCore + Proveravanje ažuriranja je omogućeno + Provera ažuriranja je onemogućena + Otvori podešavanja GmsCorea + Podešavanja za GmsCore - MicroG GmsCore nije instaliran. Instalirajte ga. - Neophodna radnja - "MicroG GmsCore nema dozvolu za rad u pozadini. + MicroG GmsCore nije instaliran. Instalirajte ga. + Neophodna radnja + Provera ažuriranja za MicroG GmsCore nije uspela + Dostupna je nova verzija (%1$s) MicroG GmsCore. Trenutno koristite verziju %2$s. + "MicroG GmsCore nema dozvolu za rad u pozadini. Pratite uputstvo „Don't kill my app” za vaš telefon i primenite uputstva na vašu MicroG instalaciju. Ovo je neophodno za rad aplikacije." - Otvori veb-sajt - "Optimizacije baterije za MicroG GmsCore moraju biti onemogućene da bi se sprečili problemi. + Otvori veb-sajt + Otkaži + "Optimizacije baterije za MicroG GmsCore moraju biti onemogućene da bi se sprečili problemi. Onemogućavanje optimizacije baterije za MicroG neće negativno uticati na potrošnju baterije. Dodirnite dugme „Nastavi” i dozvolite promene optimizacije." - Nastavi + Nastavi Lažirani video strimovi @@ -169,10 +180,11 @@ Nećete biti obavešteni ni o kakvim neočekivanim događajima." Oznake su sačuvane Oznake su resetovane Oznake su kopirane u privremenu memoriju - Evidentiranje bafera protokola - Evidencije otklanjanja grešaka sadrže bafer protokola - Evidencije otklanjanja grešaka ne sadrže bafer protokola - "Omogućavanjem ove opcije evidentiraće se dodatni podaci o izgledu, uključujući tekst na ekranu za neke komponente korisničkog interfejsa. + Ponovo pokrenite aplikaciju da biste koristili ovu funkciju + Evidentiranje bafera protokola + Evidencije otklanjanja grešaka sadrže bafer protokola + Evidencije otklanjanja grešaka ne sadrže bafer protokola + "Omogućavanjem ove opcije evidentiraće se dodatni podaci o izgledu, uključujući tekst na ekranu za neke komponente korisničkog interfejsa. Ovo može pomoći u identifikaciji komponenti prilikom pravljenja prilagođenih filtera. @@ -219,6 +231,9 @@ Međutim, omogućavanje ovoga će takođe evidentirati neke korisničke podatke, Puštanje Shorts videa u pozadini je omogućeno + Sakrij policu prodavnice kreatora + Polica prodavnice kreatora ispod video plejera je skrivena + Polica prodavnice kreatora ispod video plejera je prikazana Sakrij kartice albuma Kartice albuma su skrivene Kartice albuma su prikazane @@ -228,6 +243,9 @@ Međutim, omogućavanje ovoga će takođe evidentirati neke korisničke podatke, Sakrij policu oznaka sličnih videa Polica oznaka sličnih videa je skrivena Polica oznaka sličnih videa je prikazana + Sakrij odeljak za komentare ispod video snimaka u fidu „Početna” + Odeljak za komentare ispod video snimaka u fidu „Početna” je skriven + Odeljak za komentare ispod video snimaka u fidu „Početna” je prikazan Sakrij objave zajednice Objave zajednice su skrivene Objave zajednice su prikazane @@ -255,14 +273,19 @@ Međutim, omogućavanje ovoga će takođe evidentirati neke korisničke podatke, Sakrij najnovije objave Najnovije objave su skrivene Najnovije objave su prikazane + + Sakrij dugme „Najnoviji video snimci” + Dugme „Najnoviji video snimci” je skriveno + Dugme „Najnoviji video snimci” je prikazano Sakrij miks plejliste Miks plejliste su skrivene Miks plejliste su prikazane Sakrij odeljak za filmove Odeljak za filmove je skriven Odeljak za filmove je prikazan - + Sakrij dugme „Obavesti me” Dugme „Obavesti me” je skriveno Dugme „Obavesti me” je prikazano @@ -287,13 +310,16 @@ Međutim, omogućavanje ovoga će takođe evidentirati neke korisničke podatke, Sakrij vizuelni razdelnik Vizuelni razdelnik je skriven Vizuelni razdelnik je prikazan + Sakrij rezultate veb-pretrage + Rezultati veb-pretrage su skriveni + Rezultati veb-pretrage su prikazani + Sakrij odeljak „Možda će vam se dopasti” + Odeljak „Možda će vam se dopasti” je skriven + Odeljak „Možda će vam se dopasti” je prikazan Sakrij YouTube Doodles Animacija YouTube Doodlesa na logotipu je skrivena Animacija YouTube Doodlesa na logotipu je prikazana - "YouTube Doodles se prikazuje nekoliko dana svake godine. - -Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uključena, traka filtera ispod trake za pretragu takođe će biti skrivena." Sakrij traku kanala Traka kanala je skrivena Traka kanala je prikazana @@ -310,10 +336,15 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Okna sa informacijama su skrivena Okna sa informacijama su prikazana + This button usually appears in the video player for certain videos. --> Sakrij dugme „Učlani me” Dugme „Pridruži se” je skriveno Dugme „Pridruži se” je prikazano + + Sakrij dugme „Reprodukcija ćaskanja uživo” + Dugme „Reprodukcija ćaskanja uživo” u prekrivanju plejera je skriveno + Dugme „Reprodukcija ćaskanja uživo” u prekrivanju plejera je prikazano Sakrij okna sa medicinskim informacijama Okna sa medicinskim informacijama su skrivena Okna sa medicinskim informacijama su prikazana @@ -329,6 +360,9 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Sakrij vremenske reakcije Vremenske reakcije su skrivene Vremenske reakcije su prikazane + Sakrij naslov video snimka + Naslov video snimka u prekrivanju plejera je skriven + Naslov video snimka u prekrivanju plejera je prikazan Sakrij „Rezime videa koji je generisala veštačka inteligencija” Odeljak „Rezime videa koji je generisala veštačka inteligencija” je skriven Odeljak „Rezime videa koji je generisala veštačka inteligencija” je prikazan @@ -341,33 +375,62 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Sakrij poglavlja Odeljak za poglavlja je skriven Odeljak za poglavlja je prikazan - Sakrij odeljak „Kako je napravljen ovaj sadržaj” - Odeljak „Kako je napravljen ovaj sadržaj” je skriven - Odeljak „Kako je napravljen ovaj sadržaj” je prikazan - Sakrij hajp poene - Hajp poeni su skriveni - Hajp poeni su prikazani + Sakrij „Napredak kursa” + Odeljak „Napredak kursa” je skriven + Odeljak „Napredak kursa” je prikazan + Sakrij dugme „Istražite” + Odeljci „Istražite ovaj kurs” i „Istražite podkast” su skriveni + Odeljci „Istražite ovaj kurs” i „Istražite podkast” su prikazani + Sakrij „Istražite ovaj kurs” + Odeljak „Istražite ovaj kurs” je skriven + Odeljak „Istražite ovaj kurs” je prikazan + Sakrij odeljak „Istražite podkast” + Odeljak „Istražite podkast” je skriven + Odeljak „Istražite podkast” je prikazan Sakrij odeljak „Istražite podkast” Odeljak „Istražite podkast” je skriven Odeljak „Istražite podkast” je prikazan Sakrij istaknute veze Odeljak istaknutih veza je skriven Odeljak istaknutih veza je prikazan + Sakrij „Istaknute lokacije” + Odeljak „Istaknute lokacije” je skriven + Odeljak „Istaknute lokacije” je prikazan Sakrij istaknute video snimke Odeljak istaknutih video snimaka je skriven Odeljak istaknutih video snimaka je prikazan + Omogući filter iskačućeg menija fida + Filter iskačućeg menija fida je omogućen + Filter iskačućeg menija fida je onemogućen + Filter iskačućeg menija fida + Unesite nazive iskačućeg menija za filtriranje, jedan po redu + Sakrij odeljak „Igre” + Odeljak „Igre” je skriven + Odeljak „Igre” je prikazan + Sakrij odeljak „Kako je napravljen ovaj sadržaj” + Odeljak „Kako je napravljen ovaj sadržaj” je skriven + Odeljak „Kako je napravljen ovaj sadržaj” je prikazan + Sakrij hajp poene + Hajp poeni su skriveni + Hajp poeni su prikazani Sakrij kartice sa informacijama Odeljak za kartice sa informacijama je skriven Odeljak za kartice sa informacijama je prikazan Sakrij odeljak „Ključni koncepti” Odeljak „Ključni koncepti” je skriven Odeljak „Ključni koncepti” je prikazan + Sakrij odeljak „Muzika” + Odeljak „Muzika” je skriven + Odeljak „Muzika” je prikazan Sakrij dugme „Zaprati” Dugme „Zaprati” je skriveno Dugme „Zaprati” je prikazano Sakrij transkript Odeljak za transkripciju je skriven Odeljak za transkripciju je prikazan + Sakrij odeljak „Kvizovi” + Odeljak „Kvizovi” je skriven + Odeljak „Kvizovi” je prikazan Opis videa Sakrijte ili prikažite komponente opisa videa Traka filtera @@ -386,6 +449,11 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Prikazano u istoriji gledanja Stranica kanala Sakrijte ili prikažite komponente stranice kanala + Omogući filter kartica kanala + Filter kartica kanala je omogućen + Filter kartica kanala je onemogućen + Filter kartica kanala + Unesite nazive kartica kanala za filtriranje, jedan po redu Sakrij dugme Zajednica Dugme „Zajednica” je skriveno @@ -449,15 +517,15 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Broj pregleda je prikazan u fidu i rezultatima pretrage "Ograničenja: -• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati broj pregleda -• Ova funkcija ne radi sa automobilskim faktorom forme" +• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati broj pregleda. +• Ova funkcija ne radi sa automobilskim faktorom forme." Sakrij vreme otpremanja Vreme otpremanja je skriveno u fidu i rezultatima pretrage Vreme otpremanja je prikazano u fidu i rezultatima pretrage "Ograničenja: -• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati vreme otpremanja -• Ova funkcija ne radi sa automobilskim faktorom forme" +• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati vreme otpremanja. +• Ova funkcija ne radi sa automobilskim faktorom forme." Sakrij sadržaj ključne reči Sakrijte videe iz rezultata pretrage i fida koristeći filtere ključnih reči Sakrij videe na kartici „Početna” prema ključnim rečima @@ -480,7 +548,7 @@ Reči sa velikim slovima u sredini moraju se uneti sa velikim i malim slovima (n O filtriranju prema ključnim rečima "Početna/Praćenja/Rezultati pretrage se filtriraju da bi sakrili sadržaj koji se podudara sa frazama ključnih reči -Ograničenja +Ograničenja: • Shorts videi se ne mogu sakriti prema nazivu kanala • Neke komponente korisničkog interfejsa možda neće biti sakrivene • Pretraživanje ključne reči možda neće dati rezultate" @@ -495,19 +563,12 @@ Ograničenja Ključna reč će sakriti sve videe: %s - Sakrij policu prodavnice kreatora - Polica prodavnice kreatora ispod video plejera je skrivena - Polica prodavnice kreatora ispod video plejera je prikazana Sakrij baner prodavnice na završnom ekranu Baner prodavnice na završnom ekranu je skriven Baner prodavnice na završnom ekranu je prikazan Sakrij oglase preko celog ekrana - "Oglasi preko celog ekrana su skriveni - -Ova funkcija je dostupna samo za starije uređaje" + Oglasi preko celog ekrana su skriveni Oglasi preko celog ekrana su prikazani - - Sakrivanje oglasa preko celog ekrana radi samo sa starijim uređajima Sakrij opšte oglase Opšti oglasi su skriveni Opšti oglasi su prikazani @@ -517,6 +578,9 @@ Ova funkcija je dostupna samo za starije uređaje" Sakrij oznaku plaćene promocije Oznaka plaćeme promocije je skrivena Oznaka plaćene promocije je prikazana + Sakrij iskačuće oglase plejera + Iskačući oglasi plejera su skriveni + Iskačući oglasi plejera su prikazani Sakrij kartice samosponzorstva Kartice samosponzorstva su skrivene Kartice samosponzorstva su prikazane @@ -524,29 +588,24 @@ Ova funkcija je dostupna samo za starije uređaje" Linkovi za kupovinu u opisu videa su skriveni Linkovi za kupovinu u opisu videa su prikazani Sakrij baner „Pogledajte proizvode” - Baner „Pogledajte proizvode” u video plejeru je skriven - Baner „Pogledajte proizvode” u video plejeru je prikazan - Sakrij rezultate veb-pretrage - Rezultati veb-pretrage su skriveni - Rezultati veb-pretrage su prikazani - - - Sakrij promocije za YouTube Premium - Promocije za YouTube Premium ispod video plejera su skrivene - Promocije za YouTube Premium ispod video plejera su prikazane + Baner „Pogledajte proizvode” u prekrivanju plejera je skriven + Baner „Pogledajte proizvode” u prekrivanju plejera je prikazan + Sakrij promocije za YouTube Premium + Promocije za YouTube Premium su skrivene + Promocije za YouTube Premium su prikazane Sakrij video oglase Video oglasi su skriveni Video oglasi su prikazani - + Link je kopiran u privremenu memoriju Link s vremenskom oznakom je kopiran - Prikaži dugme za kopiranje linka videa + Prikaži dugme za kopiranje URL adrese video snimka Dugme za kopiranje URL adrese video snimka je prikazano. Dodirnite da biste kopirali URL adresu video snimka. Dodirnite i zadržite da biste kopirali sa vremenskom oznakom Dugme za kopiranje URL adrese video snimka nije prikazano - Prikaži dugme za kopiranje linka videa s vremenskom oznakom + Prikaži dugme za kopiranje URL adrese sa vremenskom oznakom Dugme za kopiranje URL adrese sa vremenskom oznakom je prikazano. Dodirnite da biste kopirali URL adresu video snimka sa vremenskom oznakom. Dodirnite i zadržite da biste kopirali bez vremenske oznake Dugme za kopiranje URL adrese sa vremenskom oznakom nije prikazano @@ -556,10 +615,10 @@ Ova funkcija je dostupna samo za starije uređaje" Dijalog o diskreciji gledaoca će biti prikazan Ovo ne zaobilazi starosno ograničenje. Samo ga automatski prihvata. - - Onemogući iskačući prozor „Prijava na TV” - Iskačući prozor „Prijava na TV” je onemogućen - Iskačući prozor „Prijava na TV” je omogućen + + Onemogući iskačući prozor „Prijava na TV” + Iskačući prozor „Prijava na TV” je onemogućen + Iskačući prozor „Prijava na TV” je omogućen Onemogući preskakanje poglavlja dvostrukim dodirom @@ -592,10 +651,10 @@ Proverite da li je naziv paketa ispravan i da li je aplikacija instalirana"Pokret preciznog premotavanja je onemogućen Pokret preciznog premotavanja je omogućen - - Omogući dodir za premotavanje - Dodir za premotavanje je omogućen - Dodir za premotavanje je onemogućen + + Omogući dodir za premotavanje + Dodir za premotavanje je omogućen + Dodir za premotavanje je onemogućen Omogući pokret za osvetljenost @@ -676,7 +735,7 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Dugme „Komentari” je skriveno Dugme „Komentari” je prikazano + This button usually appears on live streamed videos. --> Sakrij dugme „Prijavi” Dugme „Prijavi” je skriveno Dugme „Prijavi” je prikazano @@ -689,7 +748,7 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Dugme „Preuzmi” je skriveno Dugme „Preuzmi” je prikazano + This button usually appears on videos uploaded by the logged-in user. --> Sakrij dugme „Hajp” Dugme „Hajp” je skriveno Dugme „Hajp” je prikazano @@ -702,7 +761,7 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Dugme „Hvala” je skriveno Dugme „Hvala” je prikazano + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Sakrij dugme „Pitaj” Dugme „Pitaj” je skriveno Dugme „Pitaj” je prikazano @@ -710,6 +769,7 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Sakrij dugme „Klip” Dugme „Klip” je skriveno Dugme „Klip” je prikazano + Skrivanje možda neće raditi za neke korisničke naloge. Sakrij dugme „Prodavnica” Dugme „Prodavnica” je skriveno @@ -719,9 +779,9 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Dugme „Sačuvaj” je skriveno Dugme „Sačuvaj” je prikazano - + Dugmad navigacije - Sakrijte ili promenite dugmad na traci za navigaciju + Sakrijte ili promenite dugmad trake za navigaciju Sakrij dugme „Početna” Dugme „Početna” je skriveno @@ -738,31 +798,49 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Sakrij dugme „Praćenja” Dugme „Praćenja” je skriveno Dugme „Praćenja” je prikazano - Sakrij obaveštenja + Sakrij dugme „Obaveštenja” Dugme „Obaveštenja” je skriveno Dugme „Obaveštenja” je prikazano Zameni dugme „Napravi” dugmetom „Obaveštenja” - "Dugme „Napravi” je zamenjeno dugmetom „Obaveštenja” - -Napomena: Omogućavanje ovoga prisilno sakriva i video oglase" + Dugme „Napravi” je zamenjeno dugmetom „Obaveštenja” Dugme „Napravi” nije zamenjeno dugmetom „Obaveštenja” - "Onemogućavanje ove opcije će onemogućiti i blokiranje oglasa u Shorts videima. - -Ako se promena ove opcije ne primeni, pokušajte da pređete u režim bez arhiviranja." + Ako promena ovog podešavanja ne stupi na snagu, pokušajte da pređete na režim bez arhiviranja. Sakrij oznake dugmadi za navigaciju - Oznake dugmadi za navigaciju su skrivene - Oznake dugmadi za navigaciju su prikazane + Oznake su skrivene + Oznake su prikazane + Omogući uska navigaciona dugmad + Razmak između navigacionih dugmadi je uzak + Razmak između navigacionih dugmadi je normalan + Omogući animacije trake za navigaciju + Prelazi navigacije su animirani + Prelazi navigacije nisu animirani Onemogući prozirnu statusnu traku Statusna traka je neprozirna Statusna traka je neprozirna ili prozirna - Na nekim uređajima, omogućavanje ove funkcije može da promeni traku za navigaciju kroz sistem u prozirnu. + "Ograničenja: +• Crna traka se može pojaviti na vrhu video plejera. +• Na nekim uređajima, omogućavanje ove funkcije može promeniti sistemsku traku za navigaciju u providnu." Onemogući svetlu prozirnu traku za navigaciju Traka za navigaciju u svetlom režimu je neprozirna Traka za navigaciju u svetlom režimu je neprozirna ili prozirna Onemogući tamnu prozirnu traku za navigaciju Traka za navigaciju u tamnom režimu je neprozirna Traka za navigaciju u tamnom režimu je neprozirna ili prozirna + Traka sa alatkama + Sakrijte ili promenite komponente trake sa alatkama + Sakrij dugme „Napravi” + Dugme „Napravi” je skriveno + Dugme „Napravi” je prikazano + Sakrij dugme „Obaveštenja” + Dugme „Obaveštenja” je skriveno + Dugme „Obaveštenja” je prikazano + Sakrij dugme „Pretraga” + Dugme „Pretraga” je skriveno + Dugme „Pretraga” je prikazano. + Omogući široku traku za pretragu + Široka traka za pretragu je omogućena + Široka traka za pretragu je onemogućena Padajući meni @@ -837,6 +915,12 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Sakrij dugme „Prebacuj” Dugme „Prebacuj” je skriveno Dugme „Prebacuj” je prikazano + Sakrij dugme „Skupi” + Dugme „Skupi” je skriveno + Dugme „Skupi” je prikazano + Sakrij dugme „Puni ekran” + Dugme „Puni ekran” je skriveno + Dugme „Puni ekran” je prikazano Sakrij pozadinu kontrola plejera Pozadina kontrola plejera je skrivena Pozadina kontrola plejera je prikazana @@ -845,9 +929,9 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Dugmad za prethodni i sledeći video su prikazana - Sakrij kartice završnog ekrana - Kartice završnog ekrana su skrivene - Kartice završnog ekrana su prikazane + Sakrij kartice završnog ekrana + Kartice završnog ekrana su skrivene + Kartice završnog ekrana su prikazane Onemogući „Ambijentalni režim” u režimu preko celog ekrana @@ -872,10 +956,16 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Sakrij traku za premotavanje na sličicama videa Traka za premotavanje na sličicama videa je skrivena Traka za premotavanje na sličicama videa je prikazana + Omogući veliku traku za premotavanje preko celog ekrana + Traka za premotavanje preko celog ekrana je velike veličine + Traka za premotavanje preko celog ekrana je normalne veličine Shorts plejer Sakrijte ili prikažite komponente Shorts plejera + Sakrij Shorts na stranici kanala + Skriveno na stranici kanala + Prikazano na stranici kanala Sakrij Shorts u fidu „Početna” Skriveno u fidu „Početna” i srodnim videima @@ -887,9 +977,18 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Sakrij Shorts u fidu „Praćenja” Skriveno u fidu „Praćenja” Prikazano u fidu „Praćenja” + Sakrij Shorts u opisu video snimka + Skriveno u opisu video snimka + Prikazano u opisu video snimka Sakrij Shorts u istoriji gledanja Skriveno u istoriji gledanja Prikazano u istoriji gledanja + Sakrij dugme AI + Dugme AI je skriveno + Dugme AI je prikazano + Sakrij oznaku „Automatski sinhronizovano” + Oznaka za automatski sinhronizovano je skrivena + Oznaka za automatski sinhronizovano je prikazana Sakrij oznaku „Automatski sinhronizovano” Oznaka za automatski sinhronizovano je skrivena Oznaka za automatski sinhronizovano je prikazana @@ -951,6 +1050,7 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Sakrij dugme „Koristi ovaj šablon” Dugme „Koristi ovaj šablon” je skriveno Dugme „Koristi ovaj šablon” je prikazano + Sakrij animaciju dugmeta „Sviđanje” Animacija dugmeta „Sviđanje” je skrivena Animacija dugmeta „Sviđanje” je prikazana @@ -993,7 +1093,12 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Traka za navigaciju je skrivena Traka za navigaciju je prikazana - + + Sakrij pregled autopleja + Pregled autopleja je skriven + Pregled autopleja je prikazan + + Sakrij predloženi video na završnom ekranu "Predloženi video na završnom ekranu je skriven, kada je autoplej isključen @@ -1012,9 +1117,9 @@ Podešavanja → Reprodukcija → Automatski pusti sledeći video" Vremenska oznaka videa je prikazana - Sakrij iskačuće table u plejeru - Iskačuće table u plejeru su skrivene - Iskačući paneli plejera su prikazani + Sakrij iskačuće table u plejeru + Iskačuće table u plejeru su skrivene + Iskačući paneli plejera su prikazani Izlaz iz režima celog ekrana na kraju videa @@ -1082,24 +1187,6 @@ Ograničenje: Nesviđanja se možda neće pojaviti u režimu bez arhiviranja"Broj ostvarenih ograničenja stope klijenta: %d %d milisekundi - - Omogući široku traku za pretragu - Široka traka za pretragu je omogućena - Široka traka za pretragu je onemogućena - - - Omogući visokokvalitetne sličice - Sličice trake za premotavanje su visokog kvaliteta - Sličice trake za premotavanje su srednjeg kvaliteta - "Ovo će takođe vratiti sličice na strimovima uživo koji nemaju sličice trake za premotavanje. - -Sličice trake za premotavanje će koristiti isti kvalitet kao trenutni video. - -Ova funkcija najbolje radi sa kvalitetom videa od 720p ili nižim i kada koristite veoma brzu internet vezu." - Vrati stare sličice trake za premotavanje - Sličice trake za premotavanje će se pojaviti iznad nje - Sličice trake za premotavanje će se pojaviti u režimu celog ekrana - Omogući SponsorBlock SponsorBlock je sistem zasnovan na doprinosima korisnika i služi za preskakanje dosadnih delova YouTube videa @@ -1337,8 +1424,6 @@ Ako se kasnije isključi, preporučuje se da izbrišete podatke aplikacije da bi Ciljna verzija aplikacije za lažiranje 20.13.41 - Vraća neskupljenu traku radnji videa 20.05.46 - Vrati funkcionalnost transkripta - 19.35.36 - Vraća stare ikonice Shorts plejera - 19.01.34 - Vraća stare ikonice navigacije Promena polazne stranice @@ -1442,8 +1527,9 @@ Mini-plejer se može prevući sa ekrana ulevo ili udesno" Ekran učitavanja će imati gradijentnu pozadinu Ekran učitavanja će imati običnu pozadinu Stil ekrana pokretanja - Boja - Crno-belo + Onemogućen + Boja + Crno-belo Omogući prilagođenu boju trake za premotavanje Prilagođena boja trake za premotavanje je prikazana Originalna boja trake za premotavanje je prikazana @@ -1548,6 +1634,9 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Onemogući vibraciju poništavanja premotavanja Vibracija poništavanja premotavanja je onemogućena Vibracija poništavanja premotavanja je omogućena + Onemogući haptičke povratne informacije za dodir i držanje + Haptičke povratne informacije za dodir i držanje su onemogućene + Haptičke povratne informacije za dodir i držanje su omogućene Onemogući vibraciju pri uveličavanju Vibracija pri uveličavanju je onemogućena Vibracija pri uveličavanju je omogućena @@ -1643,6 +1732,11 @@ Ograničenja: Napredni meni kvaliteta videa je prikazan Napredni meni kvaliteta videa nije prikazan + + Sakrij opcije premium kvaliteta + Opcije premium kvaliteta su skrivene + Opcije premium kvaliteta su prikazane + Omogući prevlačenje za premotavanje Prevlačenje za premotavanje je omogućeno @@ -1674,6 +1768,7 @@ Reprodukcija videa s AV1 može zastajkivati ili preskakati kadrove." + O programu Oglasi Opšte diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 6caf85033b..0dbff86893 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Прилагођено Иконица апликације Оригинална + ReVanced ReVanced минимална ReVanced скалирана @@ -49,6 +50,7 @@ Second \"item\" text" Подешавања + ReVanced Желите ли заиста да наставите? Сачувај Ресетуј @@ -80,6 +82,9 @@ Second \"item\" text" Прикажи историју претраге подешавања Историја претраге подешавања је приказана Историја претраге подешавања није приказана + Онемогући подебљане иконе + Иконе нису подебљане + Иконе су подебљане Прикажи иконице подешавања ReVanced-а Иконице подешавања су приказане Иконице подешавања нису приказане @@ -99,25 +104,35 @@ Second \"item\" text" and changes made here must also be made there. --> - Подешавања GmsCore-а - Подешавања за GmsCore + GmsCore + Подешавања за GmsCore + Провери ажурирања за GmsCore + Провера ажурирања је омогућена + Провера ажурирања је онемогућена + Отвори подешавања GmsCore-а + Подешавања GmsCore-а - MicroG GmsCore није инсталиран. Инсталирајте га. - Неопходна радња - "MicroG GmsCore нема дозволу за рад у позадини. + MicroG GmsCore није инсталиран. Инсталирајте га. + Неопходна радња + Није успело проверавање ажурирања за MicroG GmsCore + Доступна је нова верзија (%1$s) MicroG GmsCore-а. Тренутно користите верзију %2$s. + "MicroG GmsCore нема дозволу за рад у позадини. Пратите упутство „Don't kill my app” за ваш телефон и примените упутства на вашу MicroG инсталацију. Ово је неопходно за рад апликације." - Отвори веб-сајт - "Оптимизације батерије за MicroG GmsCore морају бити онемогућене да би се спречили проблеми. + Отвори веб-сајт + Откажи + "Оптимизације батерије за MicroG GmsCore морају бити онемогућене да би се спречили проблеми. Онемогућавање оптимизације батерије за MicroG неће негативно утицати на потрошњу батерије. Додирните дугме „Настави” и дозволите промене оптимизације." - Настави + Настави + Лажирани видео стримови + Лажирање видео стримова клијента да би се спречили проблеми са репродукцијом Лажирани видео стримови Лажирање видео стримова клијента да би се спречили проблеми са репродукцијом Лажирани видео стримови @@ -169,10 +184,11 @@ Second \"item\" text" Ознаке су сачуване Ознаке су ресетоване Ознаке су копиране у привремену меморију - Евидентирање бафера протокола - Евиденције отклањања грешака садрже бафер протокола - Евиденције отклањања грешака не садрже бафер протокола - "Омогућавањем ове опције ће се евидентирати додатни подаци о изгледу, укључујући текст на екрану за неке компоненте корисничког интерфејса. + Поново покрените апликацију да бисте користили ову функцију + Евидентирање бафера протокола + Евиденције отклањања грешака садрже бафер протокола + Евиденције отклањања грешака не садрже бафер протокола + "Омогућавањем ове опције ће се евидентирати додатни подаци о изгледу, укључујући текст на екрану за неке компоненте корисничког интерфејса. Ово може помоћи у идентификацији компоненти приликом прављења прилагођених филтера. @@ -206,8 +222,10 @@ Second \"item\" text" Фид Опште Плејер + Shorts Трака за премотавање Контроле превлачења + Return YouTube Dislike Разно Видео Врати старе меније подешавања @@ -220,6 +238,9 @@ Second \"item\" text" Пуштање Shorts видеа у позадини је омогућено + Сакриј полицу продавнице креатора + Полица продавнице креатора испод видео плејера је скривена + Полица продавнице креатора испод видео плејера је приказана Сакриј картице албума Картице албума су скривене Картице албума су приказане @@ -229,6 +250,9 @@ Second \"item\" text" Сакриј полицу ознака сличних видеа Полица ознака сличних видеа је скривена Полица ознака сличних видеа је приказана + Сакриј одељак са коментарима испод видео снимака у фиду „Почетна” + Одељак са коментарима испод видео снимака у фиду „Почетна” је скривен + Одељак са коментарима испод видео снимака у фиду „Почетна” је приказан Сакриј објаве заједнице Објаве заједнице су скривене Објаве заједнице су приказане @@ -256,14 +280,19 @@ Second \"item\" text" Сакриј најновије објаве Најновије објаве су скривене Најновије објаве су приказане + + Сакриј дугме „Најновији видео снимци” + Дугме „Најновији видео снимци” је скривено + Дугме „Најновији видео снимци” је приказано Сакриј микс плејлисте Микс плејлисте су скривене Микс плејлисте су приказане Сакриј одељак за филмове Одељак за филмове је скривен Одељак за филмове је приказан - + Сакриј дугме „Обавести ме” Дугме „Обавести ме” је скривено Дугме „Обавести ме” је приказано @@ -288,13 +317,16 @@ Second \"item\" text" Сакриј визуелни размак Визуелни размак је скривен Визуелни размак је приказан + Сакриј резултате веб-претраге + Резултати веб-претраге су скривени + Резултати веб-претраге су приказани + Сакриј одељак „Можда ће вам се свидети” + Одељак „Можда ће вам се свидети” је скривен + Одељак „Можда ће вам се свидети” је приказан Сакриј YouTube Doodles Анимација YouTube Doodles-а на логотипу је скривена Анимација YouTube Doodles-а на логотипу је приказана - "YouTube Doodles се приказује неколико дана сваке године. - -Ако се Doodle тренутно приказује у вашем региону и ова опција скривања је укључена, трака филтера испод траке за претрагу такође ће бити скривена." Сакриј траку канала Трака канала је скривена Трака канала је приказана @@ -311,10 +343,15 @@ Second \"item\" text" Окна са информацијама су скривена Окна са информацијама су приказана + This button usually appears in the video player for certain videos. --> Сакриј дугме „Учлани ме” Дугме „Придружи се” је скривено Дугме „Придружи се” је приказано + + Сакриј дугме „Поновна репродукција ћаскања уживо” + Дугме „Поновна репродукција ћаскања уживо” у преклапању плејера је скривено + Дугме „Поновна репродукција ћаскања уживо” у преклапању плејера је приказано Сакриј окна са медицинским информацијама Окна са медицинским информацијама су скривена Окна са медицинским информацијама су приказана @@ -330,6 +367,9 @@ Second \"item\" text" Сакриј временске реакције Временске реакције су скривене Временске реакције су приказане + Сакриј наслов видеа + Наслов видеа у преклапању плејера је скривен + Наслов видеа у преклапању плејера је приказан Сакриј „Резиме видеа који је генерисала вештачка интелигенција” Одељак „Резиме видеа који је генерисала вештачка интелигенција” је скривен Одељак „Резиме видеа који је генерисала вештачка интелигенција” је приказан @@ -342,33 +382,62 @@ Second \"item\" text" Сакриј поглавља Одељак за поглавља је скривен Одељак за поглавља је приказан - Сакриј одељак „Како је направљен овај садржај” - Одељак „Како је направљен овај садржај” је скривен - Одељак „Како је направљен овај садржај” је приказан - Сакриј хајп поене - Хајп поени су скривени - Хајп поени су приказани + Сакриј „Напредак курса” + Одељак „Напредак курса” је скривен + Одељак „Напредак курса” је приказан + Сакриј дугме „Истражите” + Одељци „Истражите овај курс” и „Истражите подкаст” су скривени + Одељци „Истражите овај курс” и „Истражите подкаст” су приказани + Сакриј одељак „Истражите овај курс” + Одељак „Истражите овај курс” је скривен + Одељак „Истражите овај курс” је приказан + Сакриј одељак „Истражите подкаст” + Одељак „Истражите подкаст” је скривен + Одељак „Истражите подкаст” је приказан Сакриј одељак „Истражите подкаст” Одељак „Истражите подкаст” је скривен Одељак „Истражите подкаст” је приказан Сакриј истакнуте везе Одељак са истакнутим везама је скривен Одељак са истакнутим везама је приказан + Сакриј одељак „Истакнута места” + Одељак „Истакнута места” је скривен + Одељак „Истакнута места” је приказан Сакриј истакнуте видее Одељак са истакнутим видеима је скривен Одељак са истакнутим видеима је приказан + Омогући филтер за искачући мени фида + Филтер за искачући мени фида је омогућен + Филтер за искачући мени фида је онемогућен + Филтер за искачући мени фида + Унесите називе искачућих менија за филтрирање, један по реду + Сакриј „Игре” + Одељак „Игре” је скривен + Одељак „Игре” је приказан + Сакриј одељак „Како је направљен овај садржај” + Одељак „Како је направљен овај садржај” је скривен + Одељак „Како је направљен овај садржај” је приказан + Сакриј хајп поене + Хајп поени су скривени + Хајп поени су приказани Сакриј картице са информацијама Одељак за картице са информацијама је скривен Одељак за картице са информацијама је приказан Сакриј одељак „Кључни концепти” Одељак „Кључни концепти” је скривен Одељак „Кључни концепти” је приказан + Сакриј „Музика” + Одељак „Музика” је скривен + Одељак „Музика” је приказан Сакриј дугме „Запрати” Дугме „Запрати” је скривено Дугме „Запрати” је приказано Сакриј транскрипт Одељак за транскрипцију је скривен Одељак за транскрипцију је приказан + Сакриј „Квизови” + Одељак „Квизови” је скривен + Одељак „Квизови” је приказан Опис видеа Сакријте или прикажите компоненте описа видеа Трака филтера @@ -387,6 +456,11 @@ Second \"item\" text" Приказано у историји гледања Страница канала Сакријте или прикажите компоненте странице канала + Омогући филтер картица канала + Филтер картица канала је омогућен + Филтер картица канала је онемогућен + Филтер картица канала + Унесите називе картица канала за филтрирање, један по реду Сакриј дугме „Заједница” Дугме „Заједница” је скривено @@ -450,15 +524,15 @@ Second \"item\" text" Број прегледа је приказан у фиду и резултатима претраге "Ограничења: -• Полице Shorts, странице канала и резултати претраге могу и даље приказивати број прегледа -• Ова функција не ради са аутомобилским фактором форме" +• Полице Shorts, странице канала и резултати претраге могу и даље приказивати број прегледа. +• Ова функција не ради са аутомобилским фактором форме." Сакриј време отпремања Време отпремања је скривено у фиду и резултатима претраге Време отпремања је приказано у фиду и резултатима претраге "Ограничења: -• Полице Shorts, странице канала и резултати претраге могу и даље приказивати време отпремања -• Ова функција не ради са аутомобилским фактором форме" +• Полице Shorts, странице канала и резултати претраге могу и даље приказивати време отпремања. +• Ова функција не ради са аутомобилским фактором форме." Сакриј садржај кључне речи Сакријте видее из резултата претраге и фида користећи филтере кључних речи Сакриј видее на картици „Почетна” према кључним речима @@ -481,7 +555,7 @@ Second \"item\" text" О филтрирању према кључним речима "Почетна/Праћења/Резултати претраге се филтрирају да би сакрили садржај који се подудара са фразама кључних речи -Ограничења +Ограничења: • Shorts видеи се не могу сакрити према називу канала • Неке компоненте корисничког интерфејса можда неће бити сакривене • Претраживање кључне речи можда неће дати резултате" @@ -496,19 +570,12 @@ Second \"item\" text" Кључна реч ће сакрити све видее: %s - Сакриј полицу продавнице креатора - Полица продавнице креатора испод видео плејера је скривена - Полица продавнице креатора испод видео плејера је приказана Сакриј банер продавнице на завршном екрану Банер продавнице на завршном екрану је скривен Банер продавнице на завршном екрану је приказан Сакриј огласе преко целог екрана - "Огласи преко целог екрана су скривени - -Ова функција је доступна само за старије уређаје" + Огласи преко целог екрана су скривени Огласи преко целог екрана су приказани - - Сакривање огласа преко целог екрана ради само са старијим уређајима Сакриј опште огласе Општи огласи су скривени Општи огласи су приказани @@ -518,6 +585,9 @@ Second \"item\" text" Сакриј ознаку плаћене промоције Ознака плаћене промоције је скривена Ознака плаћене промоције је приказана + Сакриј искачуће огласе у плејеру + Искачући огласи у плејеру су скривени + Искачући огласи у плејеру су приказани Сакриј картице самоспонзорства Картице самоспонзорства су скривене Картице самоспонзорства су приказане @@ -525,23 +595,18 @@ Second \"item\" text" Линкови за куповину у опису видеа су скривени Линкови за куповину у опису видеа су приказани Сакриј банер „Погледајте производе” - Банер „Погледајте производе” у видео плејеру је скривен - Банер „Погледајте производе” у видео плејеру је приказан - Сакриј резултате веб-претраге - Резултати веб-претраге су скривени - Резултати веб-претраге су приказани - - - Сакриј промоције за YouTube Premium - Промоције за YouTube Premium испод видео плејера су скривене - Промоције за YouTube Premium испод видео плејера су приказане + Банер „Погледајте производе” у преклапању плејера је скривен + Банер „Погледајте производе” у преклапању плејера је приказан + Сакриј промоције за YouTube Premium + Промоције за YouTube Premium су скривене + Промоције за YouTube Premium су приказане Сакриј видео огласе Видео огласи су скривени Видео огласи су приказани - + Линк је копиран у привремену меморију Линк с временском ознаком је копиран Прикажи дугме за копирање линка видеа @@ -557,10 +622,10 @@ Second \"item\" text" Дијалог о дискрецији гледаоца ће бити приказан Ово не заобилази старосно ограничење. Само га аутоматски прихвата. - - Онемогући искачући прозор „Пријава на ТВ” - Искачући прозор „Пријава на ТВ” је онемогућен - Искачући прозор „Пријава на ТВ” је омогућен + + Онемогући искачући прозор „Пријава на ТВ” + Искачући прозор „Пријава на ТВ” је онемогућен + Искачући прозор „Пријава на ТВ” је омогућен Онемогући прескакање поглавља двоструким додиром @@ -593,10 +658,10 @@ Second \"item\" text" Покрет прецизног премотавања је онемогућен Покрет прецизног премотавања је омогућен - - Омогући додир за премотавање - Додир за премотавање је омогућен - Додир за премотавање је онемогућен + + Омогући додир за премотавање + Додир за премотавање је омогућен + Додир за премотавање је онемогућен Омогући покрет за осветљеност @@ -677,7 +742,7 @@ Second \"item\" text" Дугме „Коментари” је скривено Дугме „Коментари” је приказано + This button usually appears on live streamed videos. --> Сакриј дугме „Пријави” Дугме „Пријави” је скривено Дугме „Пријави” је приказано @@ -690,7 +755,7 @@ Second \"item\" text" Дугме „Преузми” је скривено Дугме „Преузми” је приказано + This button usually appears on videos uploaded by the logged-in user. --> Сакриј дугме „Хајп” Дугме „Хајп” је скривено Дугме „Хајп” је приказано @@ -703,7 +768,7 @@ Second \"item\" text" Дугме „Хвала” је скривено Дугме „Хвала” је приказано + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Сакриј дугме „Питај” Дугме „Питај” је скривено Дугме „Питај” је приказано @@ -711,6 +776,7 @@ Second \"item\" text" Сакриј дугме „Клип” Дугме „Клип” је скривено Дугме „Клип” је приказано + Сакривање можда неће радити за неке корисничке налоге. Сакриј дугме „Продавница” Дугме „Продавница” је скривено @@ -720,9 +786,9 @@ Second \"item\" text" Дугме „Сачувај” је скривено Дугме „Сачувај” је приказано - + Дугмад навигације - Сакријте или промените дугмад на траци за навигацију + Сакријте или промените дугмад траке за навигацију Сакриј дугме „Почетна” Дугме „Почетна” је скривено @@ -739,31 +805,49 @@ Second \"item\" text" Сакриј дугме „Праћења” Дугме „Праћења” је скривено Дугме „Праћења” је приказано - Сакриј обавештења + Сакриј дугме „Обавештења” Дугме „Обавештења” је скривено Дугме „Обавештења” је приказано Замени дугме „Направи” дугметом „Обавештења” - "Дугме „Направи” је замењено дугметом „Обавештења” - -Напомена: Омогућавање овога присилно сакрива и видео огласе" + Дугме „Направи” је замењено дугметом „Обавештења” Дугме „Направи” није замењено дугметом „Обавештења” - "Онемогућавање ове опције ће онемогућити и блокирање огласа у Shorts видеима. - -Ако се промена ове опције не примени, покушајте да пређете у режим без архивирања." + Ако промена овог подешавања не ступи на снагу, покушајте да се пребаците на режим без архивирања. Сакриј ознаке дугмади за навигацију - Ознаке дугмади за навигацију су скривене - Ознаке дугмади за навигацију су приказане + Ознаке су скривене + Ознаке су приказане + Омогући уска дугмад за навигацију + Размак између дугмади за навигацију је узак + Размак између дугмади за навигацију је нормалан + Омогући анимације траке за навигацију + Прелази навигације су анимирани + Прелази навигације нису анимирани Онемогући прозирну статусну траку Статусна трака је непрозирна Статусна трака је непрозирна или прозирна - На неким уређајима, омогућавање ове функције може да промени траку за навигацију кроз систем у прозирну. + "Ограничења: +• Црна трака се може појавити на врху видео плејера. +• На неким уређајима, омогућавање ове функције може променити системску траку за навигацију у провидну." Онемогући светлу прозирну траку за навигацију Трака за навигацију у светлом режиму је непрозирна Трака за навигацију у светлом режиму је непрозирна или прозирна Онемогући тамну прозирну траку за навигацију Трака за навигацију у тамном режиму је непрозирна Трака за навигацију у тамном режиму је непрозирна или прозирна + Трака са алаткама + Сакријте или промените компоненте траке са алаткама + Сакриј дугме „Направи” + Дугме „Направи” је скривено + Дугме „Направи” је приказано + Сакриј дугме „Обавештења” + Дугме „Обавештења” је скривено + Дугме „Обавештења” је приказано + Сакриј дугме „Претрага” + Дугме „Претрага” је скривено + Дугме „Претрага” је приказано. + Омогући широку траку за претрагу + Широка трака за претрагу је омогућена + Широка трака за претрагу је онемогућена Падајући мени @@ -838,6 +922,12 @@ Second \"item\" text" Сакриј дугме „Пребацуј” Дугме „Пребацуј” је скривено Дугме „Пребацуј” је приказано + Сакриј дугме „Скупи” + Дугме „Скупи” је скривено + Дугме „Скупи” је приказано + Сакриј дугме „Цео екран” + Дугме „Цео екран” је скривено + Дугме „Цео екран” је приказано Сакриј позадину контрола плејера Позадина контрола плејера је скривена Позадина контрола плејера је приказана @@ -846,9 +936,9 @@ Second \"item\" text" Дугмад за претходни и следећи видео су приказана - Сакриј картице завршног екрана - Картице завршног екрана су скривене - Картице завршног екрана су приказане + Сакриј картице завршног екрана + Картице завршног екрана су скривене + Картице завршног екрана су приказане Онемогући „Амбијентални режим” у режиму преко целог екрана @@ -873,10 +963,16 @@ Second \"item\" text" Сакриј траку за премотавање на сличицама видеа Трака за премотавање на сличицама видеа је скривена Трака за премотавање на сличицама видеа је приказана + Омогући траку за премотавање велике преко целог екрана + Трака за премотавање преко целог екрана је велике величине + Трака за премотавање преко целог екрана је нормалне величине Shorts плејер Сакријте или прикажите компоненте Shorts плејера + Сакриј Shorts на страници канала + Скривено на страници канала + Приказано на страници канала Сакриј Shorts у фиду „Почетна” Скривено у фиду „Почетна” и сродним видеима @@ -888,9 +984,18 @@ Second \"item\" text" Сакриј Shorts у фиду „Праћења” Скривено у фиду „Праћења” Приказано у фиду „Праћења” + Сакриј Shorts у опису видеа + Скривено у опису видеа + Приказано у опису видеа Сакриј Shorts у историји гледања Скривено у историји гледања Приказано у историји гледања + Сакриј дугме „АИ” + Дугме „АИ” је скривено + Дугме „АИ” је приказано + Сакриј ознаку „Аутоматски синхронизовано” + Ознака аутоматски синхронизованог је скривена + Ознака аутоматски синхронизованог је приказана Сакриј ознаку „Аутоматски синхронизовано” Ознака аутоматски синхронизованог је скривена Ознака аутоматски синхронизованог је приказана @@ -952,6 +1057,7 @@ Second \"item\" text" Сакриј дугме „Користи овај шаблон” Дугме „Користи овај шаблон” је скривено Дугме „Користи овај шаблон” је приказано + Сакриј анимацију дугмета „Свиђање” Анимација дугмета „Свиђање” је скривена Анимација дугмета „Свиђање” је приказана @@ -994,7 +1100,12 @@ Second \"item\" text" Трака за навигацију је скривена Трака за навигацију је приказана - + + Сакриј преглед аутоматске репродукције + Преглед аутоматске репродукције је скривен + Преглед аутоматске репродукције је приказан + + Сакриј предложени видео на завршном екрану "Предложени видео на завршном екрану је скривен, када је аутоплеј искључен @@ -1013,9 +1124,9 @@ Second \"item\" text" Временска ознака видеа је приказана - Сакриј искачуће табле у плејеру - Искачуће табле у плејеру су скривене - Искачуће табле у плејеру су приказане + Сакриј искачуће табле у плејеру + Искачуће табле у плејеру су скривене + Искачуће табле у плејеру су приказане Излаз из режима целог екрана на крају видеа @@ -1044,6 +1155,7 @@ Second \"item\" text" Освежите видео да бисте гласали помоћу ReturnYouTubeDislike Скривено од стране власника + Return YouTube Dislike Несвиђања су приказана Несвиђања нису приказана Прикажи несвиђања на Shorts видеима @@ -1064,6 +1176,7 @@ Second \"item\" text" Прикажи искачуће обавештење ако API није доступан Искачуће обавештење је приказано, ако Return YouTube Dislike није доступан Искачуће обавештење није приказано, ако Return YouTube Dislike није доступан + ReturnYouTubeDislike.com Податке обезбеђује Return YouTube Dislike API. Додирните овде да сазнате више Статистике ReturnYouTubeDislike API-ја за овај уређај @@ -1083,25 +1196,8 @@ Second \"item\" text" Број остварених ограничења стопе клијента: %d %d милисекунди - - Омогући широку траку за претрагу - Широка трака за претрагу је омогућена - Широка трака за претрагу је онемогућена - - - Омогући висококвалитетне сличице - Сличице траке за премотавање су високог квалитета - Сличице траке за премотавање су средњег квалитета - "Ово ће такође вратити сличице на стримовима уживо који немају сличице траке за премотавање. - -Сличице траке за премотавање ће користити исти квалитет као тренутни видео. - -Ова функција најбоље ради са квалитетом видеа од 720p или нижим и када користите веома брзу интернет везу." - Врати старе сличице траке за премотавање - Сличице траке за премотавање ће се појавити изнад ње - Сличице траке за премотавање ће се појавити у режиму целог екрана - + SponsorBlock Омогући SponsorBlock SponsorBlock је систем заснован на доприносима корисника и служи за прескакање досадних делова YouTube видеа Изглед @@ -1310,6 +1406,7 @@ Second \"item\" text" Непрозирност: Боја: О програму + sponsor.ajay.app Податке обезбеђује SponsorBlock API. Додирните овде да сазнате више и видите преузимања за друге платформе @@ -1339,8 +1436,6 @@ Second \"item\" text" Циљна верзија апликације за лажирање 20.13.41 - Врати нескупљену траку радњи видеа 20.05.46 - Врати функционалност транскрипта - 19.35.36 - Враћа старе иконице Shorts плејера - 19.01.34 - Враћа старе иконице навигације Промена полазне странице @@ -1362,6 +1457,7 @@ Second \"item\" text" Плејлисте Претрага Куповина + Shorts Спорт Праћења У тренду @@ -1427,9 +1523,11 @@ Second \"item\" text" Сакриј дугмад преклопа Дугмад преклопа су скривена Дугмад преклопа су приказана + Сакриј дугмад за проширивање и затварање "Дугмад су скривена Превуците да бисте проширили или затворили" + Дугмад за проширивање и затварање су приказана Сакриј подтекстове Подтекстови су скривени Подтекстови су приказани @@ -1448,8 +1546,9 @@ Second \"item\" text" Екран учитавања ће имати градијентну позадину Екран учитавања ће имати обичну позадину Стил екрана покретања - Боја - Црно-бело + Онемогућено + Боја + Црно-бело Омогући прилагођену боју траке за премотавање Прилагођена боја траке за премотавање је приказана Оригинална боја траке за премотавање је приказана @@ -1459,11 +1558,17 @@ Second \"item\" text" Боја наглашавања траке за премотавање Неважећа вредност боје траке за премотавање - + + YouTube ReVanced + YT ReVanced + YT + Логотип у заглављу Подразумевани Обични + Premium + ReVanced ReVanced минималистички Прилагођени @@ -1488,6 +1593,7 @@ Second \"item\" text" DeArrow и оригиналне сличице DeArrow и захвати кадра Захвати кадра + DeArrow "DeArrow пружа сличице за YouTube видее прикупљене од заједнице корисника. Ове сличице су често релевантније од оних које пружа YouTube Ако је омогућено, линкови видеа ће бити послати на API сервер и никакви други подаци се неће слати. Ако видео нема DeArrow сличице, онда се приказују оригиналне или захвати кадра @@ -1531,7 +1637,11 @@ Second \"item\" text" Понављање видеа је укључено Понављање видеа је искључено - + + Паузирај при прекиду звука + Репродукција се паузира при пуштању другог звука (нпр. навигација) + Јачина звука се смањује при пуштању другог звука + Лажиране димензије уређаја "Димензије уређаја су лажиране @@ -1554,6 +1664,9 @@ Second \"item\" text" Онемогући вибрацију поништавања премотавања Вибрација поништавања премотавања је онемогућена Вибрација поништавања премотавања је омогућена + Онемогући хаптичку повратну информацију при додиру и држању + Хаптичка повратна информација при додиру и држању је онемогућена + Хаптичка повратна информација при додиру и држању је омогућена Онемогући вибрацију при увеличавању Вибрација при увеличавању је онемогућена Вибрација при увеличавању је омогућена @@ -1649,6 +1762,11 @@ Second \"item\" text" Напредни мени квалитета видеа је приказан Напредни мени квалитета видеа није приказан + + Сакриј опције премијум квалитета + Опције премијум квалитета су скривене + Опције премијум квалитета су приказане + Омогући превлачење за премотавање Превлачење за премотавање је омогућено @@ -1678,8 +1796,13 @@ Second \"item\" text" - + + YT Music ReVanced + Music ReVanced + Music + + О програму Огласи Опште diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 370ff826ab..dba4a87ea7 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" Visa sökhistorik för inställningar Sökhistorik för inställningar visas Sökhistorik för inställningar visas inte + Inaktivera feta ikoner + Ikoner är inte feta + Ikoner är feta Visa ikoner för ReVanced-inställningar Inställningsikoner visas Inställningsikoner visas inte @@ -99,23 +102,31 @@ Om du vill översätta till nya språk eller förbättra befintliga översättni and changes made here must also be made there. --> - GmsCore-inställningar - Inställningar för GmsCore + GmsCore + Inställningar relaterade till GmsCore + Sök efter GmsCore-uppdateringar + Söker efter uppdateringar är aktiverat + Sökning efter uppdateringar är inaktiverad + Öppna GmsCore-inställningar + Inställningar för GmsCore - MicroG GmsCore är inte installerat. Installera det. - Åtgärd krävs - "MicroG GmsCore saknar behörighet att köras i bakgrunden. + MicroG GmsCore är inte installerat. Installera det. + Åtgärd krävs + Kunde inte söka efter uppdateringar för MicroG GmsCore + En ny version (%1$s) av MicroG GmsCore är tillgänglig. För närvarande använder du version %2$s. + "MicroG GmsCore saknar behörighet att köras i bakgrunden. Följ guiden \"Don't kill my app\" för din telefon och tillämpa instruktionerna på din MicroG-installation. Detta krävs för att appen ska fungera." - Öppna hemsida - "Batterioptimeringar för MicroG GmsCore måste inaktiveras för att förhindra problem. + Öppna hemsida + Avbryt + "Batterioptimeringar för MicroG GmsCore måste inaktiveras för att förhindra problem. Inaktivering av batterioptimeringar för MicroG kommer inte att påverka batteritiden negativt. Tryck på Fortsätt-knappen och tillåt optimeringsändringar." - Fortsätt + Fortsätt Förfalska videoströmmar @@ -169,14 +180,11 @@ Du kommer inte att bli meddelad om oväntade händelser." Flaggor sparade Flaggor återställda Flaggor kopierade till urklipp - Logga protokollbuffert - Felsökningsloggar inkluderar protokollbuffert - Felsökningsloggar inkluderar inte protokollbuffert - "Om du aktiverar den här inställningen loggas ytterligare layoutdata, inklusive text på skärmen för vissa komponenter i användargränssnittet. - -Detta kan hjälpa till att identifiera komponenter när du skapar anpassade filter. - -Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, att loggas." + Starta om appen för att använda den här funktionen + Logga protokollbuffert + Felsökningsloggar inkluderar protokollbuffert + Felsökningsloggar inkluderar inte protokollbuffert + "Om du aktiverar den här inställningen loggas ytterligare layoutdata, inklusive text på skärmen för vissa komponenter i användargränssnittet.\n\nDetta kan hjälpa till att identifiera komponenter när du skapar anpassade filter.\n\nMen om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, att loggas." Rensa delningslänkar @@ -219,6 +227,9 @@ Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, Uppspelning av Shorts-videor i bakgrunden är aktiverad + Dölj butikshylla för kreatörer + Butikshylla för kreatörer under videospelaren är dold + Butikshylla för kreatörer under videospelaren visas Dölj albumkort Albumkort är dolda Albumkort visas @@ -228,6 +239,9 @@ Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, Dölj hylla med brickor Hylla med brickor är dold Hylla med brickor visas + Dölj kommentarsfältet under videor i Hem-flödet + Kommentarsfältet under videor i Hem-flödet är dolt + Kommentarsfältet under videor i Hem-flödet visas Dölj community-inlägg Community-inlägg är dolda Community-inlägg visas @@ -256,14 +270,19 @@ Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, Dölj senaste inlägg Senaste inlägg är dolda Senaste inlägg visas + + Dölj knappen \'Senaste videor\' + Knappen Senaste videor är dold + Knappen Senaste videor visas Dölj mix-spellistor Mix-spellistor är dolda Mix-spellistor visas Dölj filmsektion Filmsektionen är dold Filmsektionen visas - + Dölj knappen Meddela mig Knappen Meddela mig är dold Knappen Meddela mig visas @@ -288,13 +307,16 @@ Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, Dölj visuell utfyllnad Visuell utfyllnad är dold Visuell utfyllnad visas + Dölj sökresultat från webben + Sökresultat från webben är dolda + Sökresultat från webben visas + Dölj avsnittet \'Du kanske gillar\' + Avsnittet \'Du kanske gillar\' är dolt + Avsnittet \'Du kanske gillar\' visas Dölj YouTube-doodles YouTube-doodles-animation på logotypen är dold YouTube-doodles-animation på logotypen visas - "YouTube-doodles visas några dagar varje år. - -Om en doodle visas för närvarande i din region och den här döljningsinställningen är på, kommer filterfältet under sökfältet också att döljas." Dölj kanalfält Kanalfältet är dolt Kanalfältet visas @@ -311,10 +333,15 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ Infopanelerna är dolda Infopanelerna visas + This button usually appears in the video player for certain videos. --> Dölj knappen Bli medlem Knappen Bli medlem är dold Knappen Bli medlem visas + + Dölj knappen \'Livechatt-repris\' + Knappen Livechatt-repris i spelaröverlägget är dold + Knappen Livechatt-repris i spelaröverlägget visas Dölj hälsoinformationspaneler Hälsoinformationspanelerna är dolda Hälsoinformationspanelerna visas @@ -330,6 +357,9 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ Dölj tidsbaserade reaktioner Tidsbaserade reaktioner är dolda Tidsbaserade reaktioner visas + Dölj videotitel + Videotiteln i spelaröverlägget är dold + Videotiteln i spelaröverlägget visas Dölj AI-genererad videoöversikt Avsnittet AI-genererad videoöversikt är dolt Avsnittet AI-genererad videoöversikt visas @@ -342,33 +372,62 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ Dölj Kapitel Avsnittet Kapitel är dolt Avsnittet Kapitel visas - Dölj Hur det här innehållet skapades - Avsnittet Hur det här innehållet skapades är dolt - Avsnittet Hur det här innehållet skapades visas - Dölj hajppoäng - Hajppoäng är dolda - Hajppoäng visas + Dölj \'Kursförlopp\' + Avsnittet Kursförlopp är dolt + Avsnittet Kursförlopp visas + Dölj Utforska + Avsnitten Utforska den här kursen och Utforska podden är dolda + Avsnitten Utforska den här kursen och Utforska podden visas + Dölj \'Utforska den här kursen\' + Avsnittet Utforska den här kursen är dolt + Avsnittet Utforska den här kursen visas + Dölj Utforska podden + Avsnittet Utforska podden är dolt + Avsnittet Utforska podden visas Dölj Utforska podden Avsnittet Utforska podden är dolt Avsnittet Utforska podden visas Dölj utvalda länkar Avsnittet med utvalda länkar är dolt Avsnittet med utvalda länkar visas + Dölj \'Utvalda platser\' + Avsnittet Utvalda platser är dolt + Avsnittet Utvalda platser visas Dölj utvalda videor Avsnittet med utvalda videor är dolt Avsnittet med utvalda videor visas + Aktivera filter för utrullningsmeny i flödet + Filter för utrullningsmeny i flödet är aktiverat + Filter för utrullningsmeny i flödet är inaktiverat + Filter för utrullningsmeny i flödet + Ange namnen på utrullningsmenyerna att filtrera efter, ett per rad + Dölj Spel + Avsnittet Spel är dolt + Avsnittet Spel visas + Dölj Hur det här innehållet skapades + Avsnittet Hur det här innehållet skapades är dolt + Avsnittet Hur det här innehållet skapades visas + Dölj hajppoäng + Hajppoäng är dolda + Hajppoäng visas Dölj infokort Avsnittet för infokort är dolt Avsnittet för infokort visas Dölj \"Huvudkoncept\" Avsnittet Huvudkoncept är dolt Avsnittet Huvudkoncept visas + Dölj Musik + Avsnittet Musik är dolt + Avsnittet Musik visas Dölj knappen Prenumerera Knappen Prenumerera är dold Knappen Prenumerera visas Dölj Manuskript Avsnittet Manuskript är dolt Avsnittet Manuskript visas + Dölj Frågesporter + Avsnittet Frågesporter är dolt + Avsnittet Frågesporter visas Videobeskrivning Dölj eller visa komponenter i videobeskrivningen Filterfält @@ -387,6 +446,11 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ Visas i visningshistoriken Kanalsida Dölj eller visa komponenter på kanalsidan + Aktivera kanalfliksfilter + Kanalfliksfiltret är aktiverat + Kanalfliksfiltret är inaktiverat + Kanalfliksfilter + Ange namn på kanalflikar att filtrera efter, ett per rad Dölj Community-knapp Knappen Community är dold @@ -450,15 +514,15 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ Antal visningar visas i flödet och sökresultaten "Begränsningar: -• Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa antal visningar -• Denna funktion fungerar inte med bilformfaktor" +• Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa antal visningar. +• Denna funktion fungerar inte med bilformfaktor." Dölj uppladdningstid Uppladdningstid är dold i flödet och sökresultaten Uppladdningstid visas i flödet och sökresultaten "Begränsningar: -• Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa uppladdningstider -• Denna funktion fungerar inte med bilformfaktor" +• Shorts-hyllor, kanalsidor och sökresultat kan fortfarande visa uppladdningstider. +• Denna funktion fungerar inte med bilformfaktor." Dölj innehåll med nyckelord Dölj videor i flöden och i sökning med hjälp av nyckelordsfilter Dölj videor i Hem med nyckelord @@ -481,10 +545,10 @@ Ord med versaler i mitten måste anges med korrekt skiftläge (t.ex. iPhone, Tik Om nyckelordsfiltrering "Hem/Prenumerationer/sökresultat filtreras för att dölja innehåll som matchar nyckelordsfraser -Begränsningar -• Shorts-videor kan inte döljas baserat på kanalnamn -• Vissa komponenter i användargränssnittet kanske inte döljs -• Om du söker på ett nyckelord kan det hända att inga resultat visas" +Begränsningar: +• Shorts kan inte döljas med kanalnamn +• Vissa UI-komponenter kanske inte döljs +• Att söka efter ett nyckelord kanske inte visar några resultat" Matcha hela ord Om du omger ett nyckelord/en fras med dubbla citattecken förhindrar du partiella matchningar av videotitlar och kanalnamn<br><br>Till exempel:<br><b>\"ai\"</b> kommer att dölja videon: <b>How does AI work?</b><br>men kommer inte att dölja: <b>What does fair use mean?</b> @@ -496,19 +560,12 @@ Begränsningar Nyckelordet döljer alla videor: %s - Dölj butikshylla för kreatörer - Butikshylla för kreatörer under videospelaren är dold - Kreatörsbutikens hylla under videospelaren visas Dölj butiksbanner på slutskärmen Butiksbanner på slutskärmen är dold Butiksbanner på slutskärmen visas Dölj helskärmsannonser - "Helskärmsannonser är dolda - -Den här funktionen är endast tillgänglig för äldre enheter" + Helskärmsannonser är dolda Helskärmsannonser visas - - Helskärmsannonser kan döljas bara på äldre enheter Dölj allmänna annonser Allmänna annonser är dolda Allmänna annonser visas @@ -518,6 +575,9 @@ Den här funktionen är endast tillgänglig för äldre enheter" Dölj etikett för betald marknadsföring Etikett för betald marknadsföring är dold Etikett för betald marknadsföring visas + Dölj popup-annonser i spelaren + Popup-annonser i spelaren är dolda + Popup-annonser i spelaren visas Dölj självsponsrade kort Självsponsrade kort är dolda Självsponsrade kort är synliga @@ -525,31 +585,26 @@ Den här funktionen är endast tillgänglig för äldre enheter" Butikslänkar i videobeskrivningen är dolda Butikslänkar i videobeskrivningen visas Dölj bannern Visa produkter - Bannern Visa produkter i videoöverlägget är dold - Bannern Visa produkter i videoöverlägget visas - Dölj sökresultat från webben - Sökresultat från webben är dolda - Sökresultat från webben visas - - - Dölj YouTube Premium-kampanjer - YouTube Premium-kampanjer under videospelaren är dolda - YouTube Premium-kampanjer under videospelaren visas + Bannern Visa produkter i spelaröverlägget är dold + Bannern Visa produkter i spelaröverlägget visas + Dölj YouTube Premium-kampanjer + YouTube Premium-kampanjer är dolda + YouTube Premium-kampanjer visas Dölj videoannonser Videoannonser är dolda Videoannonser visas - - Videoadress kopierad till urklipp - Videoadress med tidsstämpel kopierad - Visa knapp för att kopiera videoadress - Knappen för att kopiera video-URL visas. Tryck för att kopiera videoadressen. Tryck länge för att kopiera med tidsstämpel + + URL kopierad till urklipp + URL med tidsstämpel kopierad + Visa knapp för att kopiera video-URL + Knappen för att kopiera video-URL visas. Tryck för att kopiera video-URL:en. Tryck och håll ned för att kopiera med tidsstämpel Knappen för att kopiera video-URL visas inte - Visa knapp för att kopiera videoadress med tidsstämpel - Knappen för att kopiera tidsstämpel-URL visas. Tryck för att kopiera videoadressen med tidsstämpel. Tryck länge för att kopiera utan tidsstämpel - Knappen för att kopiera tidsstämpel-URL visas inte + Visa knapp för att kopiera URL med tidsstämpel + Knappen för att kopiera URL med tidsstämpel visas. Tryck för att kopiera video-URL med tidsstämpel. Tryck och håll ned för att kopiera utan tidsstämpel + Knappen för att kopiera URL med tidsstämpel visas inte Ta bort dialogrutan Känsliga tittare varnas @@ -557,10 +612,10 @@ Den här funktionen är endast tillgänglig för äldre enheter" Dialogrutan visas Detta kringgår inte åldersbegränsningen. Det bara godkänner automatiskt. - - Inaktivera popup-fönstret \'Logga in på TV\' - \"Logga in på TV\"-popup är inaktiverad - \"Logga in på TV\"-popup är aktiverad + + Inaktivera popup-fönstret \'Logga in på TV\' + \'Logga in på TV\'-popup är inaktiverad + \'Logga in på TV\'-popup är aktiverad Inaktivera dubbeltryck för att hoppa över kapitel @@ -593,10 +648,10 @@ Kontrollera att paketnamnet är korrekt och att appen är installerad" Gesten är inaktiverad Gesten är aktiverad - - Aktivera Tryck för att söka - Tryck för att söka är aktiverat - Tryck för att söka är inaktiverat + + Aktivera Tryck för att söka + Tryck för att söka är aktiverat + Tryck för att söka är inaktiverat Aktivera ljusstyrkegest @@ -677,7 +732,7 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Knappen Kommentarer är dold Knappen Kommentarer visas + This button usually appears on live streamed videos. --> Dölj Rapportera Knappen Rapportera är dold Knappen Rapportera visas @@ -690,7 +745,7 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Knappen Ladda ned är dold Knappen Ladda ned visas + This button usually appears on videos uploaded by the logged-in user. --> Dölj Hajp Knappen Hajp är dold Knappen Hajp visas @@ -703,7 +758,7 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Knappen Thanks är dold Knappen Thanks visas + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Dölj Fråga Knappen Fråga är dold Knappen Fråga visas @@ -711,6 +766,7 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Dölj Klipp Knappen Klipp är dold Knappen Klipp visas + Döljning kanske inte fungerar för vissa användarkonton. Dölj Butik Knappen Butik är dold @@ -720,7 +776,7 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Knappen Spara är dold Knappen Spara visas - + Navigeringsknappar Dölj eller ändra knappar i navigeringsfältet @@ -744,26 +800,44 @@ Justera volymen genom att svepa vertikalt till höger på skärmen" Knappen Aviseringar visas Byt ut Skapa mot Aviseringar - "Knappen Skapa byts ut mot knappen Aviseringar - -Obs! Om du aktiverar detta döljs även videoannonser" + Knappen Skapa byts ut mot knappen Aviseringar Knappen Skapa byts inte ut mot knappen Aviseringar - "Om du inaktiverar den här inställningen inaktiveras även annonsblockering för Shorts. - -Om du ändrar den här inställningen utan att det träder i kraft kan du testa att byta till inkognitoläge." + Om ändringen av den här inställningen inte får effekt, prova att växla till inkognitoläge. Dölj etiketter för navigeringsknappar Etiketter är dolda Etiketter visas + Aktivera smala navigeringsknappar + Avståndet mellan navigeringsknapparna är smalt + Avståndet mellan navigeringsknapparna är normalt + Aktivera animeringar i navigeringsfältet + Navigationsövergångar är animerade + Navigationsövergångar är inte animerade Inaktivera genomskinligt statusfält Statusfältet är ogenomskinligt Statusfältet är ogenomskinligt eller genomskinligt - På vissa enheter kan aktivering av den här funktionen ändra systemets navigeringsfält till genomskinligt. + "Begränsningar: +• En svart list kan visas överst i videospelaren. +• På vissa enheter kan aktivering av den här funktionen ändra systemets navigeringsfält till transparent." Inaktivera ljust genomskinligt fält Navigeringsfältet i ljust läge är ogenomskinligt Navigeringsfältet i ljust läge är ogenomskinligt eller genomskinligt Inaktivera mörkt genomskinligt fält Navigeringsfältet i mörkt läge är ogenomskinligt Navigeringsfältet i mörkt läge är ogenomskinligt eller genomskinligt + Verktygsfält + Dölj eller ändra verktygsfältskomponenter + Dölj knappen Skapa + Knappen Skapa är dold + Knappen Skapa visas + Dölj knappen Aviseringar + Knappen Aviseringar är dold + Knappen Aviseringar visas + Dölj Sök-knappen + Sök-knappen är dold + Sök-knappen visas. + Aktivera brett sökfält + Brett sökfält är aktiverat + Brett sökfält är inaktiverat Flyout-meny @@ -838,6 +912,12 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Dölj knappen Casta Knappen Casta är dold Knappen Casta visas + Dölj knappen Fäll ihop + Knappen Fäll ihop är dold + Knappen Fäll ihop visas + Dölj helskärmsknappen + Helskärmsknappen är dold + Helskärmsknappen visas Dölj bakgrunder för uppspelningsknappar Bakgrunder för uppspelningsknappar är dolda Bakgrunder för uppspelningsknappar visas @@ -846,9 +926,9 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Knapparna visas - Dölj slutskärmskort - Slutskärmskort är dolda - Slutskärmskort visas + Dölj slutskärmskort + Slutskärmskort är dolda + Slutskärmskort visas Inaktivera Ambientljus i helskärm @@ -873,10 +953,16 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Dölj sökreglaget i videominiatyrer Sökreglaget i videominiatyrer är dolt Sökreglaget i videominiatyrer visas + Aktivera stor sökfält i helskärm + Sökfältet i helskärm är stort + Sökfältet i helskärm är normalstorlek Shorts-spelare Dölj eller visa komponenter i Shorts-spelaren + Dölj Shorts på kanalsidan + Dold på kanalsidan + Visas på kanalsidan Dölj Shorts-videor i hemflödet Döljs i hemflödet och liknande videor @@ -888,9 +974,18 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Dölj Shorts-videor i flödet Prenumerationer Döljs i flödet Prenumerationer Visas i flödet Prenumerationer + Dölj Shorts i videobeskrivningen + Dold i videobeskrivningen + Visas i videobeskrivningen Dölj Shorts-videor i visningshistoriken Döljs i visningshistoriken Visas i visningshistoriken + Dölj AI-knappen + AI-knappen är dold + AI-knappen visas + Dölj etiketten \'Automatiskt dubbat\' + Etiketten för automatiskt dubbat är dold + Etiketten för automatiskt dubbat visas Dölj etiketten \'Automatiskt dubbat\' Etiketten för automatiskt dubbat är dold Etiketten för automatiskt dubbat visas @@ -952,6 +1047,7 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Dölj knappen \'Använd den här mallen\' Knappen Använd den här mallen är dold Knappen Använd den här mallen visas + Dölj fontäneffekt för knappen Gilla Fontäneffekten för knappen Gilla är dold Fontäneffekten för knappen Gilla visas @@ -994,7 +1090,12 @@ Om du vill att menyn Ljudspår ska visas ändrar du \"Förfalska videoströmmar\ Navigeringsfältet är dolt Navigeringsfältet visas - + + Dölj automatisk förhandsvisning + Automatisk förhandsvisning är dold + Automatisk förhandsvisning visas + + Dölj föreslagen video på slutskärmen "Föreslagen video på slutskärmen döljs när automatisk uppspelning är avstängd @@ -1013,9 +1114,9 @@ Inställningar → Uppspelning → Spela upp nästa video automatiskt" Tidsstämpel visas - Dölj popup-paneler i spelaren - Popup-paneler i spelaren är dolda - Popup-paneler i spelaren visas + Dölj popup-paneler i spelaren + Popup-paneler i spelaren är dolda + Popup-paneler i spelaren visas Avsluta helskärmsläge i slutet av videon @@ -1083,24 +1184,6 @@ Begränsning: Ogilla-markeringar kanske inte visas i inkognitoläge" Frekvensgräns för klienten har påträffats %d gånger %d millisekunder - - Aktivera brett sökfält - Brett sökfält är aktiverat - Brett sökfält är inaktiverat - - - Aktivera miniatyrbilder av hög kvalitet - Sökreglageminiatyrer är av hög kvalitet - Sökreglageminiatyrer är av medelhög kvalitet - "Detta återställer även miniatyrer på livestreamar som inte har sökreglageminiatyrer. - -Sökreglageminiatyrer kommer att använda samma kvalitet som den aktuella videon. - -Den här funktionen fungerar bäst med en videokvalitet på 720p eller lägre och när du använder en mycket snabb internetanslutning." - Återställ gamla sökreglageminiatyrer - Sökreglageminiatyrer visas ovanför sökreglaget - Sökreglageminiatyrer visas i helskärm - Aktivera SponsorBlock SponsorBlock är ett crowdsourcing-baserat system för att hoppa över irriterande delar av YouTube-videor @@ -1337,8 +1420,6 @@ Om du senare inaktiverar det rekommenderar vi att rensa appens data för att fö Mål för Förfalska appversionen 20.13.41 – Återställ icke-komprimerat åtgärdsfält för video 20.05.46 – Återställ funktionalitet för transkription - 19.35.36 – Återställ gamla ikoner i Shorts-spelaren - 19.01.34 – Återställ gamla navigeringsikoner Byt startsida @@ -1435,8 +1516,9 @@ Minispelaren kan dras utanför skärmen till vänster eller höger" Inläsningsskärmen kommer att ha en tonad bakgrund Inläsningsskärmen kommer att ha en enfärgad bakgrund Välkomstskärmens stil - Färg - Svartvit + Inaktiverad + Färg + Svartvit Aktivera anpassad färg på sökreglaget Sökreglagets anpassade färg visas Sökreglagets ursprungliga färg visas @@ -1541,6 +1623,9 @@ Om du aktiverar detta kan högre videokvaliteter låsas upp" Inaktivera haptik för att ångra sökning Haptik för att ångra sökning är inaktiverad Haptik för att ångra sökning är aktiverad + Inaktivera haptik vid tryck och håll + Haptik vid tryck och håll är inaktiverad + Haptik vid tryck och håll är aktiverad Inaktivera zoomhaptik Zoomhaptik är inaktiverad Zoomhaptik är aktiverad @@ -1635,6 +1720,11 @@ Begränsningar: Avancerad videokvalitetsmeny visas Avancerad videokvalitetsmeny visas inte + + Dölj Premium-kvalitetsalternativ + Premium-kvalitetsalternativ är dolda + Premium-kvalitetsalternativ visas + Aktivera Dra för att söka Dra för att söka är aktiverat @@ -1666,6 +1756,7 @@ Videouppspelning med AV1 kan hacka eller tappa bildrutor." + Om Annonser Allmänt diff --git a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml index 3a40645452..e22f571955 100644 --- a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml +++ b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + Lemaza ikoni nene + Ikoni si nene + Ikoni ni nene + GmsCore + Mipangilio inayohusiana na GmsCore + Angalia sasisho za GmsCore + Kuangalia sasisho kumewashwa + Kuangalia masasisho kumezimwa + Fungua Mipangilio ya GmsCore + Mipangilio ya GmsCore + MicroG GmsCore haijasanikishwa. Isanikishe. + Kitendo kinahitajika + Imeshindwa kuangalia masasisho ya MicroG GmsCore + Toleo jipya la MicroG GmsCore (%1$s) linapatikana. Kwa sasa, unatumia toleo %2$s. + "MicroG GmsCore haina ruhusa ya kufanya kazi chinichini. + +Fuata mwongozo wa \"Usizime programu yangu\" kwa simu yako, na utumie maagizo kwa usakinishaji wako wa MicroG. + +Hii inahitajika ili programu ifanye kazi." + Fungua tovuti + Ghairi + "Uboreshaji wa betri wa MicroG GmsCore lazima uzimwe ili kuzuia matatizo. + +Kuzima uboreshaji wa betri kwa MicroG hakutaathiri vibaya matumizi ya betri. + +Gonga kitufe cha kuendelea na uruhusu mabadiliko ya uboreshaji." + Endelea - + + Anzisha upya programu ili utumie kipengele hiki + Kumbukumbu bafa ya itifaki + Logi za utatuaji zinajumuisha bafa ya itifaki + Logi za utatuaji hazijumuishi bafa ya itifaki + "Kuwezesha mpangilio huu kutaandikisha data ya ziada ya mpangilio, ikijumuisha maandishi yanayoonekana kwenye skrini kwa baadhi ya vijenzi vya UI. + +Hii inaweza kusaidia kutambua vijenzi wakati wa kuunda vichujio maalum. + +Hata hivyo, kuwezesha hii pia kutaandikisha baadhi ya data ya mtumiaji kama vile anwani yako ya IP." + @@ -48,40 +85,135 @@ Second \"item\" text" - + Ficha rafu ya duka la muundaji + Rafu ya duka la muundaji chini ya kicheza video imefichwa + Rafu ya duka la muundaji chini ya kicheza video imeonyeshwa + Ficha sehemu ya maoni chini ya video kwenye mipasho ya Nyumbani + Sehemu ya maoni chini ya video kwenye mipasho ya Nyumbani imefichwa + Sehemu ya maoni chini ya video kwenye mipasho ya Nyumbani imeonyeshwa + + Ficha kitufe cha \'Video mpya zaidi\' + Kitufe cha video mpya zaidi kimefichwa + Kitufe cha video mpya zaidi kimeonyeshwa + + Ficha matokeo ya utafutaji kwenye wavuti + Matokeo ya utafutaji kwenye wavuti yamefichwa + Matokeo ya utafutaji kwenye wavuti yameonyeshwa + Ficha sehemu ya \'Unaweza kupenda\' + Sehemu ya \'Unaweza kupenda\' imefichwa + Sehemu ya \'Unaweza kupenda\' imeonyeshwa + This button usually appears in the video player for certain videos. --> + + Ficha kitufe cha \'Rejea ya gumzo la moja kwa moja\' + Kitufe cha rejea ya gumzo la moja kwa moja kwenye kicheza video kimefichwa + Kitufe cha rejea ya gumzo la moja kwa moja kwenye kicheza video kimeonyeshwa + Ficha jina la video + Jina la video kwenye kicheza video kimefichwa + Jina la video kwenye kicheza video limeonyeshwa + Ficha \'Maendeleo ya kozi\' + Sehemu ya maendeleo ya kozi imefichwa + Sehemu ya maendeleo ya kozi imeonyeshwa + Ficha Gundua + Sehemu za Gundua kozi hii na Gundua podikasti zimefichwa + Sehemu za Gundua kozi hii na Gundua podikasti zimeonyeshwa + Ficha \'Gundua kozi hii\' + Sehemu ya Gundua kozi hii imefichwa + Sehemu ya Gundua kozi hii imeonyeshwa + Ficha \'Gundua podikasti\' + Sehemu ya Gundua podikasti imefichwa + Sehemu ya Gundua podikasti imeonyeshwa + Ficha \'Maeneo Yanayoangaziwa\' + Sehemu ya Maeneo Yanayoangaziwa imefichwa + Sehemu ya Maeneo Yanayoangaziwa imeonyeshwa + Washa kichujio cha menyu ibukizi ya mipasho + Kichujio cha menyu ibukizi ya mipasho kimewashwa + Kichujio cha menyu ibukizi ya mipasho kimezimwa + Kichujio cha menyu ibukizi ya mipasho + Weka majina ya menyu ibukizi ya kuchuja, moja kwa kila mstari + Ficha Michezo + Sehemu ya Michezo imefichwa + Sehemu ya Michezo imeonyeshwa + Ficha Muziki + Sehemu ya Muziki imefichwa + Sehemu ya Muziki imeonyeshwa + Ficha Maswali + Sehemu ya Maswali imefichwa + Sehemu ya Maswali imeonyeshwa + Washa kichujio cha kichupo cha chaneli + Kichujio cha kichupo cha chaneli kimewashwa + Kichujio cha kichupo cha chaneli kimezimwa + Kichujio cha kichupo cha chaneli + Weka majina ya kichupo cha chaneli ya kuchuja, moja kwa kila mstari + "Mapungufu: +• Rafu za Shorts, kurasa za chaneli, na matokeo ya utafutaji bado yanaweza kuonyesha idadi ya kutazamwa. +• Kipengele hiki hakifanyi kazi na muundo wa magari." + "Mapungufu: +• Rafu za Shorts, kurasa za chaneli, na matokeo ya utafutaji bado yanaweza kuonyesha nyakati za kupakiwa. +• Kipengele hiki hakifanyi kazi na muundo wa magari." + "Mipasho ya Nyumbani/Usajili/Matokeo ya utafutaji huchujwa ili kuficha maudhui yanayolingana na misemo ya maneno muhimu + +Mapungufu: +• Shorts haziwezi kufichwa kwa jina la chaneli +• Baadhi ya vipengele vya kiolesura cha mtumiaji huenda visifichwe +• Kutafuta neno muhimu kunaweza kusionyesha matokeo yoyote" - + Matangazo ya skrini nzima yamefichwa + Ficha matangazo ibukizi ya kichezaji + Matangazo ibukizi ya kichezaji yamefichwa + Matangazo ibukizi ya kichezaji yameonyeshwa + Bango la kutazama bidhaa kwenye kicheza video limefichwa + Bango la kutazama bidhaa kwenye kicheza video limeonyeshwa + Ficha matangazo ya YouTube Premium + Matangazo ya YouTube Premium yamefichwa + Matangazo ya YouTube Premium yameonyeshwa - - + + URL imenakiliwa kwenye ubao klipu + URL yenye muhuri wa muda imenakiliwa + Onyesha kitufe cha kunakili URL ya video + Kitufe cha kunakili URL ya video kimeonyeshwa. Gonga ili kunakili URL ya video. Gonga na ushikilie ili kunakili na muhuri wa muda + Kitufe cha kunakili URL ya video hakijaonyeshwa + Onyesha kitufe cha kunakili URL ya muhuri wa muda + Kitufe cha kunakili URL ya muhuri wa muda kimeonyeshwa. Gonga ili kunakili URL ya video na muhuri wa muda. Gonga na ushikilie ili kunakili bila muhuri wa muda + Kitufe cha kunakili URL ya muhuri wa muda hakijaonyeshwa + - + + Zima dirisha ibukizi la \'Ingia kwenye TV\' + Dirisha ibukizi la Ingia kwenye TV limezimwa + Dirisha ibukizi la Ingia kwenye TV limewashwa + - + + Washa gonga ili kutafuta + Gonga ili kutafuta kimewashwa + Gonga ili kutafuta kimezimwa + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Kuficha kunaweza kusifanye kazi kwa baadhi ya akaunti za watumiaji. - + + Vitufe vya kusogeza + Ficha au badilisha vitufe vya upau wa kusogeza + Ficha Nyumbani + Kitufe cha Nyumbani kimefichwa + Kitufe cha Nyumbani kimeonyeshwa + Ficha Shorts + Kitufe cha Shorts kimefichwa + Kitufe cha Shorts kimeonyeshwa + Ficha Unda + Kitufe cha Unda kimefichwa + Kitufe cha Unda kimeonyeshwa + Ficha Usajili + Kitufe cha Usajili kimefichwa + Kitufe cha Usajili kimeonyeshwa + Ficha Arifa + Kitufe cha Arifa kimefichwa + Kitufe cha Arifa kimeonyeshwa + Badilisha Unda na Arifa + Kitufe cha Unda kimebadilishwa na kitufe cha Arifa + Kitufe cha Unda hakijabadilishwa na kitufe cha Arifa + Ikiwa kubadilisha mpangilio huu hakufanyi kazi, jaribu kubadili hali fiche. + Ficha lebo za kitufe cha kusogeza + Lebo zimefichwa + Lebo zimeonyeshwa + Washa vitufe vidogo vya kusogeza + Nafasi kati ya vitufe vya kusogeza ni ndogo + Nafasi kati ya vitufe vya kusogeza ni ya kawaida + Washa uhuishaji wa upau wa kusogeza + Mabadiliko ya usogezaji yana uhuishaji + Mabadiliko ya usogezaji hayana uhuishaji + Zima upau wa hali unaopitisha mwanga + Upau wa hali haupitishi mwanga + Upau wa hali haupitishi mwanga au unapisha mwanga + "Mapungufu: +• Upau mweusi unaweza kuonekana juu ya kicheza video. +• Kwenye baadhi ya vifaa, kuwasha kipengele hiki kunaweza kubadilisha upau wa kusogeza wa mfumo kuwa wa uwazi." + Zima upau mwepesi unaopitisha mwanga + Upau wa kusogeza wa hali nyepesi haupitishi mwanga + Upau wa kusogeza wa hali nyepesi haupitishi mwanga au unapisha mwanga + Zima upau mweusi unaopitisha mwanga + Upau wa kusogeza wa hali nyeusi haupitishi mwanga + Upau wa kusogeza wa hali nyeusi haupitishi mwanga au unapisha mwanga + Upauzana + Ficha au badilisha vipengele vya upauzana + Ficha kitufe cha Unda + Kitufe cha Unda kimefichwa + Kitufe cha Unda kimeonyeshwa + Ficha kitufe cha Arifa + Kitufe cha Arifa kimefichwa + Kitufe cha Arifa kimeonyeshwa + Ficha kitufe cha Tafuta + Kitufe cha Tafuta kimefichwa + Kitufe cha Tafuta kimeonyeshwa. + Washa upau mpana wa utafutaji + Upau mpana wa utafutaji umewashwa + Upau mpana wa utafutaji umezimwa @@ -126,25 +315,67 @@ Second \"item\" text" + Ficha kitufe cha Kunja + Kitufe cha Kunja kimefichwa + Kitufe cha Kunja kimeonyeshwa + Ficha kitufe cha Skrini nzima + Kitufe cha Skrini nzima kimefichwa + Kitufe cha Skrini nzima kimeonyeshwa + + + Ficha kadi za mwisho wa skrini + Kadi za mwisho wa skrini zimefichwa + Kadi za mwisho wa skrini zimeonyeshwa - + Washa upau wa kutafuta mkubwa wa skrini nzima + Upau wa kutafuta wa skrini nzima una ukubwa mkubwa + Upau wa kutafuta wa skrini nzima una ukubwa wa kawaida + Ficha Shorts kwenye ukurasa wa chaneli + Imefichwa kwenye ukurasa wa chaneli + Imeonyeshwa kwenye ukurasa wa chaneli + Ficha Shorts kwenye maelezo ya video + Imefichwa kwenye maelezo ya video + Imeonyeshwa kwenye maelezo ya video + Ficha kitufe cha AI + Kitufe cha AI kimefichwa + Kitufe cha AI kimeonyeshwa + Ficha lebo ya \'Imenukuliwa kiotomatiki\' + Lebo ya Imenukuliwa kiotomatiki imefichwa + Lebo ya Imenukuliwa kiotomatiki imeonyeshwa + - + + Ficha onyesho la kwanza la kucheza kiotomatiki + Onyesho la kwanza la kucheza kiotomatiki limefichwa + Onyesho la kwanza la kucheza kiotomatiki limeonyeshwa + + + Ficha video iliyopendekezwa ya mwisho wa skrini + "Video iliyopendekezwa ya mwisho wa skrini imefichwa wakati kucheza kiotomatiki kumezimwa + +Kucheza kiotomatiki kunaweza kubadilishwa katika mipangilio ya YouTube: +Mipangilio → Uchezaji → Cheza video inayofuata kiotomatiki" + Video iliyopendekezwa ya mwisho wa skrini imeonyeshwa + - + + Ficha paneli ibukizi za kichezaji + Paneli ibukizi za kichezaji zimefichwa + Paneli ibukizi za kichezaji zimeonyeshwa + @@ -155,10 +386,12 @@ Second \"item\" text" - - + Kwa matumizi katika video za muziki pekee. Sehemu za video za muziki zisizo na muziki, ambazo hazijafunikwa tayari na kategoria nyingine + Haiwezi kuwasilisha sehemu: %s + "Haiwezi kuwasilisha sehemu. +Tayari ipo" @@ -170,7 +403,11 @@ Second \"item\" text" - + + Imezimwa + Rangi + Nyeusi na nyeupe + @@ -187,7 +424,11 @@ Second \"item\" text" - + + Zima haptics ya kugonga na kushikilia + Haptics ya kugonga na kushikilia imezimwa + Haptics ya kugonga na kushikilia imewashwa + @@ -200,6 +441,11 @@ Second \"item\" text" + + Ficha chaguo za ubora wa Premium + Chaguo za ubora wa Premium zimefichwa + Chaguo za ubora wa Premium zimeonyeshwa + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml index 3a40645452..9b2e27c90b 100644 --- a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml @@ -27,18 +27,51 @@ Second \"item\" text" + தடித்த ஐகான்களை முடக்கு + ஐகான்கள் தடிமனாக இல்லை + ஐகான்கள் தடிமனாக உள்ளன + GmsCore + GmsCore தொடர்பான அமைப்புகள் + GmsCore புதுப்பிப்புகளைச் சரிபார்க்கவும் + புதுப்பிப்புகளைச் சரிபார்த்தல் செயல்படுத்தப்பட்டது + புதுப்பிப்புகளைச் சரிபார்ப்பது முடக்கப்பட்டுள்ளது + GmsCore அமைப்புகளைத் திறக்கவும் + GmsCore இன் அமைப்புகள் + MicroG GmsCore நிறுவப்படவில்லை. அதை நிறுவவும். + நடவடிக்கை தேவை + MicroG GmsCore புதுப்பிப்புகளைச் சரிபார்க்க முடியவில்லை + MicroG GmsCore இன் புதிய பதிப்பு (%1$s) கிடைக்கிறது. தற்போது, நீங்கள் பதிப்பு %2$s ஐப் பயன்படுத்துகிறீர்கள். + "MicroG GmsCore பின்னணியில் இயங்க அனுமதி இல்லை. + +உங்கள் மொபைலுக்கான \"எனது பயன்பாட்டை முடக்காதீர்\" வழிகாட்டியைப் பின்பற்றி, உங்கள் MicroG நிறுவலுக்கு வழிமுறைகளைப் பயன்படுத்தவும். + +பயன்பாடு செயல்பட இது தேவை." + வலைத்தளத்தைத் திறக்கவும் + ரத்துசெய் + "சிக்கல்களைத் தடுக்க MicroG GmsCore பேட்டரி மேம்படுத்தல்கள் முடக்கப்பட வேண்டும். + +MicroG க்கான பேட்டரி மேம்படுத்தல்களை முடக்குவது பேட்டரி பயன்பாட்டை எதிர்மறையாக பாதிக்காது. + +தொடரவும் பொத்தானைத் தட்டி, மேம்படுத்தல் மாற்றங்களை அனுமதிக்கவும்." + தொடரவும் - + + இந்த அம்சத்தைப் பயன்படுத்த, பயன்பாட்டை மறுதொடக்கம் செய்யவும் + நெறிமுறை இடையகத்தைப் பதிவுசெய் + பிழைத்திருத்தப் பதிவுகளில் புரோட்டோ இடையகம் அடங்கும் + பிழைத்திருத்தப் பதிவுகளில் புரோட்டோ இடையகம் அடங்காது + "இந்த அமைப்பை இயக்குவது, சில UI கூறுகளுக்கான திரையில் உள்ள உரை உட்பட, கூடுதல் தளவமைப்புத் தரவை பதிவு செய்யும்.\n\nதனிப்பயன் வடிப்பான்களை உருவாக்கும்போது கூறுகளை அடையாளம் காண இது உதவும்.\n\nஇருப்பினும், இதை இயக்குவது உங்கள் IP முகவரி போன்ற சில பயனர் தரவுகளையும் பதிவு செய்யும்." + @@ -48,40 +81,135 @@ Second \"item\" text" - + உருவாக்குபவர் அங்காடி அலமாரியை மறை + வீடியோ பிளேயரின் கீழ் உள்ள உருவாக்குபவர் அங்காடி அலமாரி மறைக்கப்பட்டுள்ளது + வீடியோ பிளேயரின் கீழ் உள்ள உருவாக்குபவர் அங்காடி அலமாரி காட்டப்பட்டுள்ளது + முகப்புப் பக்கத்தில் உள்ள வீடியோக்களின் கீழ் கருத்துகள் பிரிவை மறை + முகப்புப் பக்கத்தில் உள்ள வீடியோக்களின் கீழ் கருத்துகள் பிரிவு மறைக்கப்பட்டுள்ளது + முகப்புப் பக்கத்தில் உள்ள வீடியோக்களின் கீழ் கருத்துகள் பிரிவு காட்டப்பட்டுள்ளது + + ‘புதிய வீடியோக்கள்’ பொத்தானை மறை + புதிய வீடியோக்கள் பொத்தான் மறைக்கப்பட்டுள்ளது + புதிய வீடியோக்கள் பொத்தான் காட்டப்பட்டுள்ளது + + இணைய தேடல் முடிவுகளை மறை + இணைய தேடல் முடிவுகள் மறைக்கப்பட்டுள்ளன + இணைய தேடல் முடிவுகள் காட்டப்பட்டுள்ளன + ‘நீங்கள் விரும்பலாம்’ பிரிவை மறை + ‘நீங்கள் விரும்பலாம்’ பிரிவு மறைக்கப்பட்டுள்ளது + ‘நீங்கள் விரும்பலாம்’ பிரிவு காட்டப்பட்டுள்ளது + This button usually appears in the video player for certain videos. --> + + ‘நேரடி அரட்டை மறுஒளிபரப்பு’ பொத்தானை மறை + பிளேயர் ஓவர்லேயில் நேரடி அரட்டை மறுஒளிபரப்பு பொத்தான் மறைக்கப்பட்டுள்ளது + பிளேயர் ஓவர்லேயில் நேரடி அரட்டை மறுஒளிபரப்பு பொத்தான் காட்டப்பட்டுள்ளது + வீடியோ தலைப்பை மறை + பிளேயர் ஓவர்லேயில் வீடியோ தலைப்பு மறைக்கப்பட்டுள்ளது + பிளேயர் ஓவர்லேயில் வீடியோ தலைப்பு காட்டப்பட்டுள்ளது + ‘பாட முன்னேற்றம்’ என்பதை மறை + பாட முன்னேற்றப் பிரிவு மறைக்கப்பட்டுள்ளது + பாட முன்னேற்றப் பிரிவு காட்டப்பட்டுள்ளது + ஆராய்தலை மறை + இந்த பாடத்தை ஆராய் மற்றும் பாட்காஸ்ட் பிரிவுகளை ஆராய் ஆகியவை மறைக்கப்பட்டுள்ளன + இந்த பாடத்தை ஆராய் மற்றும் பாட்காஸ்ட் பிரிவுகளை ஆராய் ஆகியவை காட்டப்பட்டுள்ளன + ‘இந்த பாடத்தை ஆராய்’ என்பதை மறை + இந்த பாடத்தை ஆராய் பிரிவு மறைக்கப்பட்டுள்ளது + இந்த பாடத்தை ஆராய் பிரிவு காட்டப்பட்டுள்ளது + ‘பாட்காஸ்டை ஆராய்’ என்பதை மறை + பாட்காஸ்ட் பிரிவு மறைக்கப்பட்டுள்ளது + பாட்காஸ்ட் பிரிவு காட்டப்பட்டுள்ளது + ‘சிறப்பு இடங்கள்’ என்பதை மறை + சிறப்பு இடங்கள் பிரிவு மறைக்கப்பட்டுள்ளது + சிறப்பு இடங்கள் பிரிவு காட்டப்பட்டுள்ளது + ஊட்ட நீட்டிப்பு மெனு வடிகட்டியை இயக்கு + ஊட்ட நீட்டிப்பு மெனு வடிகட்டி இயக்கப்பட்டுள்ளது + ஊட்ட நீட்டிப்பு மெனு வடிகட்டி முடக்கப்பட்டுள்ளது + ஊட்ட நீட்டிப்பு மெனு வடிகட்டி + வடிகட்ட வேண்டிய நீட்டிப்பு மெனு பெயர்களை ஒரு வரியில் ஒன்றன் பின் ஒன்றாக உள்ளிடவும் + கேமிங்கை மறை + கேமிங் பிரிவு மறைக்கப்பட்டுள்ளது + கேமிங் பிரிவு காட்டப்பட்டுள்ளது + இசையை மறை + இசைப் பிரிவு மறைக்கப்பட்டுள்ளது + இசைப் பிரிவு காட்டப்பட்டுள்ளது + வினாடி வினாக்களை மறை + வினாடி வினாக்கள் பிரிவு மறைக்கப்பட்டுள்ளது + வினாடி வினாக்கள் பிரிவு காட்டப்பட்டுள்ளது + சேனல் தாவல் வடிகட்டியை இயக்கு + சேனல் தாவல் வடிகட்டி இயக்கப்பட்டுள்ளது + சேனல் தாவல் வடிகட்டி முடக்கப்பட்டுள்ளது + சேனல் தாவல் வடிகட்டி + வடிகட்ட வேண்டிய சேனல் தாவல் பெயர்களை ஒரு வரியில் ஒன்றன் பின் ஒன்றாக உள்ளிடவும் + "வரம்புகள்: +• Shorts அலமாரிகள், சேனல் பக்கங்கள் மற்றும் தேடல் முடிவுகள் இன்னும் பார்வைகளின் எண்ணிக்கையைக் காட்டலாம். +• இந்த அம்சம் வாகன வடிவ காரணிகளுடன் செயல்படாது." + "வரம்புகள்: +• Shorts அலமாரிகள், சேனல் பக்கங்கள் மற்றும் தேடல் முடிவுகள் இன்னும் பதிவேற்ற நேரங்களைக் காட்டலாம். +• இந்த அம்சம் வாகன வடிவ காரணிகளுடன் செயல்படாது." + "முகப்பு/சந்தாக்கள்/தேடல் முடிவுகள், முக்கிய சொற்றொடர்களுக்குப் பொருந்தும் உள்ளடக்கத்தை மறைக்க வடிகட்டப்படுகின்றன. + +வரம்புகள்: +• சேனல் பெயர் மூலம் Shorts-ஐ மறைக்க முடியாது +• சில UI கூறுகள் மறைக்கப்படாமல் இருக்கலாம் +• ஒரு முக்கிய சொல்லைத் தேடுவது முடிவுகளைக் காட்டாமல் போகலாம்" - + முழுத்திரை விளம்பரங்கள் மறைக்கப்பட்டுள்ளன + பிளேயர் பாப்அப் விளம்பரங்களை மறை + பிளேயர் பாப்அப் விளம்பரங்கள் மறைக்கப்பட்டுள்ளன + பிளேயர் பாப்அப் விளம்பரங்கள் காட்டப்பட்டுள்ளன + பிளேயர் ஓவர்லேயில் தயாரிப்புகளைக் காட்டும் பேனர் மறைக்கப்பட்டுள்ளது + பிளேயர் ஓவர்லேயில் தயாரிப்புகளைக் காட்டும் பேனர் காட்டப்பட்டுள்ளது + YouTube Premium விளம்பரங்களை மறை + YouTube Premium விளம்பரங்கள் மறைக்கப்பட்டுள்ளன + YouTube Premium விளம்பரங்கள் காட்டப்பட்டுள்ளன - - + + URL கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது + நேர முத்திரையுடன் URL நகலெடுக்கப்பட்டது + வீடியோ URL ஐ நகலெடு பொத்தானைக் காட்டு + வீடியோ URL ஐ நகலெடு பொத்தான் காட்டப்பட்டுள்ளது. வீடியோ URL ஐ நகலெடுக்கத் தட்டவும். நேர முத்திரையுடன் நகலெடுக்க, தட்டிப் பிடிக்கவும் + வீடியோ URL ஐ நகலெடு பொத்தான் காட்டப்படவில்லை + நேர முத்திரை URL ஐ நகலெடு பொத்தானைக் காட்டு + நேர முத்திரை URL ஐ நகலெடு பொத்தான் காட்டப்பட்டுள்ளது. நேர முத்திரையுடன் வீடியோ URL ஐ நகலெடுக்கத் தட்டவும். நேர முத்திரை இல்லாமல் நகலெடுக்க, தட்டிப் பிடிக்கவும் + நேர முத்திரை URL ஐ நகலெடு பொத்தான் காட்டப்படவில்லை + - + + ‘டிவியில் உள்நுழை’ பாப்அப்பை முடக்கு + டிவியில் உள்நுழை பாப்அப் முடக்கப்பட்டுள்ளது + டிவியில் உள்நுழை பாப்அப் இயக்கப்பட்டுள்ளது + - + + தேட தட்டலை இயக்கு + தேட தட்டல் இயக்கப்பட்டுள்ளது + தேட தட்டல் முடக்கப்பட்டுள்ளது + @@ -89,25 +217,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + சில பயனர் கணக்குகளுக்கு மறைப்பது வேலை செய்யாமல் போகலாம். - + + வழிசெலுத்தல் பொத்தான்கள் + வழிசெலுத்தல் பட்டி பொத்தான்களை மறை அல்லது மாற்று + முகப்புப் பக்கத்தை மறை + முகப்புப் பக்கப் பொத்தான் மறைக்கப்பட்டுள்ளது + முகப்புப் பக்கப் பொத்தான் காட்டப்பட்டுள்ளது + Shorts-ஐ மறை + Shorts பொத்தான் மறைக்கப்பட்டுள்ளது + Shorts பொத்தான் காட்டப்பட்டுள்ளது + உருவாக்கு பொத்தானை மறை + உருவாக்கு பொத்தான் மறைக்கப்பட்டுள்ளது + உருவாக்கு பொத்தான் காட்டப்பட்டுள்ளது + சந்தாக்களை மறை + சந்தாக்கள் பொத்தான் மறைக்கப்பட்டுள்ளது + சந்தாக்கள் பொத்தான் காட்டப்பட்டுள்ளது + அறிவிப்புகளை மறை + அறிவிப்புகள் பொத்தான் மறைக்கப்பட்டுள்ளது + அறிவிப்புகள் பொத்தான் காட்டப்பட்டுள்ளது + உருவாக்கு பொத்தானை அறிவிப்புகளுடன் மாற்று + உருவாக்கு பொத்தான் அறிவிப்புகள் பொத்தானுடன் மாற்றப்பட்டுள்ளது + உருவாக்கு பொத்தான் அறிவிப்புகள் பொத்தானுடன் மாற்றப்படவில்லை + இந்த அமைப்பை மாற்றுவது செயல்படவில்லை எனில், மறைநிலை பயன்முறைக்கு மாற முயற்சிக்கவும். + வழிசெலுத்தல் பொத்தான் லேபிள்களை மறை + லேபிள்கள் மறைக்கப்பட்டுள்ளன + லேபிள்கள் காட்டப்பட்டுள்ளன + குறுகிய வழிசெலுத்தல் பொத்தான்களை இயக்கு + வழிசெலுத்தல் பொத்தான்களுக்கு இடையே உள்ள இடைவெளி குறுகியது + வழிசெலுத்தல் பொத்தான்களுக்கு இடையே உள்ள இடைவெளி சாதாரணமானது + வழிசெலுத்தல் பட்டி அசைவூட்டங்களை இயக்கு + வழிசெலுத்தல் மாற்றங்கள் அசைவூட்டப்படுகின்றன + வழிசெலுத்தல் மாற்றங்கள் அசைவூட்டப்படவில்லை + ஒளி ஊடுருவும் நிலைப்பட்டியை முடக்கு + நிலைப்பட்டி ஒளி ஊடுருவாது + நிலைப்பட்டி ஒளி ஊடுருவாது அல்லது ஒளி ஊடுருவும் + "வரம்புகள்: +• வீடியோ பிளேயரின் மேலே ஒரு கருப்பு பட்டி தோன்றலாம். +• சில சாதனங்களில், இந்த அம்சத்தை இயக்குவது சிஸ்டம் வழிசெலுத்தல் பட்டியை வெளிப்படையாக மாற்றக்கூடும்." + மங்கலான ஒளி ஊடுருவும் பட்டியை முடக்கு + லைட் மோட் வழிசெலுத்தல் பட்டி ஒளி ஊடுருவாது + லைட் மோட் வழிசெலுத்தல் பட்டி ஒளி ஊடுருவாது அல்லது ஒளி ஊடுருவும் + அடர்ந்த ஒளி ஊடுருவும் பட்டியை முடக்கு + டார்க் மோட் வழிசெலுத்தல் பட்டி ஒளி ஊடுருவாது + டார்க் மோட் வழிசெலுத்தல் பட்டி ஒளி ஊடுருவாது அல்லது ஒளி ஊடுருவும் + கருவிப்பட்டி + கருவிப்பட்டி கூறுகளை மறை அல்லது மாற்று + உருவாக்கு பொத்தானை மறை + உருவாக்கு பொத்தான் மறைக்கப்பட்டுள்ளது + உருவாக்கு பொத்தான் காட்டப்பட்டுள்ளது + அறிவிப்புகள் பொத்தானை மறை + அறிவிப்புகள் பொத்தான் மறைக்கப்பட்டுள்ளது + அறிவிப்புகள் பொத்தான் காட்டப்பட்டுள்ளது + தேடல் பொத்தானை மறை + தேடல் பொத்தான் மறைக்கப்பட்டுள்ளது + தேடல் பொத்தான் காட்டப்பட்டுள்ளது. + அகலமான தேடல் பட்டியை இயக்கு + அகலமான தேடல் பட்டி இயக்கப்பட்டுள்ளது + அகலமான தேடல் பட்டி முடக்கப்பட்டுள்ளது @@ -126,25 +311,67 @@ Second \"item\" text" + சுருக்கு பொத்தானை மறை + சுருக்கு பொத்தான் மறைக்கப்பட்டுள்ளது + சுருக்கு பொத்தான் காட்டப்பட்டுள்ளது + முழுத்திரை பொத்தானை மறை + முழுத்திரை பொத்தான் மறைக்கப்பட்டுள்ளது + முழுத்திரை பொத்தான் காட்டப்பட்டுள்ளது + + + முடிவுத் திரை கார்டுகளை மறை + முடிவுத் திரை கார்டுகள் மறைக்கப்பட்டுள்ளன + முடிவுத் திரை கார்டுகள் காட்டப்பட்டுள்ளன - + முழுத்திரை பெரிய சீக்பாரை இயக்கு + முழுத்திரை சீக்பார் பெரிய அளவுடையது + முழுத்திரை சீக்பார் சாதாரண அளவுடையது + சேனல் பக்கத்தில் Shorts-ஐ மறை + சேனல் பக்கத்தில் மறைக்கப்பட்டது + சேனல் பக்கத்தில் காட்டப்பட்டது + வீடியோ விளக்கத்தில் Shorts-ஐ மறை + வீடியோ விளக்கத்தில் மறைக்கப்பட்டது + வீடியோ விளக்கத்தில் காட்டப்பட்டது + AI பொத்தானை மறை + AI பொத்தான் மறைக்கப்பட்டுள்ளது + AI பொத்தான் காட்டப்பட்டுள்ளது + ‘தானியங்கு டப்பிங்’ லேபிளை மறை + தானியங்கு டப்பிங் லேபிள் மறைக்கப்பட்டுள்ளது + தானியங்கு டப்பிங் லேபிள் காட்டப்பட்டுள்ளது + - + + தானியங்கு ப்ளே முன்னோட்டத்தை மறை + தானியங்கு ப்ளே முன்னோட்டம் மறைக்கப்பட்டுள்ளது + தானியங்கு ப்ளே முன்னோட்டம் காட்டப்பட்டுள்ளது + + + முடிவுத் திரை பரிந்துரைக்கப்பட்ட வீடியோவை மறை + "தானியங்கு ப்ளே முடக்கப்பட்டிருக்கும்போது முடிவுத் திரை பரிந்துரைக்கப்பட்ட வீடியோ மறைக்கப்படும் + +YouTube அமைப்புகளில் தானியங்கு ப்ளேவை மாற்றலாம்: +அமைப்புகள் → பிளேபேக் → அடுத்த வீடியோவை தானியங்கு ப்ளே" + முடிவுத் திரை பரிந்துரைக்கப்பட்ட வீடியோ காட்டப்பட்டுள்ளது + - + + பிளேயர் பாப்-அப் பேனல்களை மறை + பிளேயர் பாப்-அப் பேனல்கள் மறைக்கப்பட்டுள்ளன + பிளேயர் பாப்-அப் பேனல்கள் காட்டப்பட்டுள்ளன + @@ -155,10 +382,12 @@ Second \"item\" text" - - + இசை வீடியோக்களில் மட்டுமே பயன்படுத்த. இசை இல்லாத இசை வீடியோக்களின் பிரிவுகள், ஏற்கனவே வேறொரு பிரிவில் சேர்க்கப்படாதவை + பகுதியைச் சமர்ப்பிக்க முடியவில்லை: %s + "பகுதியைச் சமர்ப்பிக்க முடியவில்லை. +ஏற்கனவே உள்ளது" @@ -170,7 +399,11 @@ Second \"item\" text" - + + முடக்கப்பட்டது + நிறம் + கருப்பு மற்றும் வெள்ளை + @@ -187,7 +420,11 @@ Second \"item\" text" - + + தட்டிப் பிடிப்பதற்கான ஹேப்டிக்ஸ்ஸை முடக்கு + தட்டிப் பிடிப்பதற்கான ஹேப்டிக்ஸ் முடக்கப்பட்டுள்ளது + தட்டிப் பிடிப்பதற்கான ஹேப்டிக்ஸ் இயக்கப்பட்டுள்ளது + @@ -200,6 +437,11 @@ Second \"item\" text" + + Premium தர விருப்பங்களை மறை + Premium தர விருப்பங்கள் மறைக்கப்பட்டுள்ளன + Premium தர விருப்பங்கள் காட்டப்பட்டுள்ளன + @@ -207,7 +449,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-te-rIN/strings.xml b/patches/src/main/resources/addresources/values-te-rIN/strings.xml index 3a40645452..4512b949a9 100644 --- a/patches/src/main/resources/addresources/values-te-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-te-rIN/strings.xml @@ -27,18 +27,53 @@ Second \"item\" text" + బోల్డ్ ఐకాన్‌లను నిలిపివేయండి + ఐకాన్‌లు బోల్డ్‌గా లేవు + ఐకాన్‌లు బోల్డ్‌గా ఉన్నాయి + GmsCore + GmsCore కు సంబంధించిన సెట్టింగ్‌లు + GmsCore అప్‌డేట్‌ల కోసం తనిఖీ చేయండి + అప్‌డేట్‌ల కోసం తనిఖీ చేయడం ప్రారంభించబడింది + నవీకరణల కోసం తనిఖీ నిలిపివేయబడింది + GmsCore సెట్టింగ్‌లను తెరవండి + GmsCore సెట్టింగ్‌లు + MicroG GmsCore ఇన్‌స్టాల్ చేయబడలేదు. ఇన్‌స్టాల్ చేయండి. + చర్య అవసరం + MicroG GmsCore నవీకరణల కోసం తనిఖీ విఫలమైంది + MicroG GmsCore యొక్క కొత్త వెర్షన్ (%1$s) అందుబాటులో ఉంది. ప్రస్తుతం, మీరు వెర్షన్ %2$s ఉపయోగిస్తున్నారు. + "MicroG GmsCore బ్యాక్‌గ్రౌండ్‌లో రన్ చేయడానికి అనుమతి లేదు. + +మీ ఫోన్ కోసం \"నా యాప్‌ను చంపవద్దు\" గైడ్‌ను అనుసరించండి మరియు సూచనలను మీ MicroG ఇన్‌స్టాలేషన్‌కు వర్తింపజేయండి. + +యాప్ పనిచేయడానికి ఇది అవసరం." + వెబ్‌సైట్ తెరవండి + రద్దు చేయండి + "సమస్యలను నివారించడానికి MicroG GmsCore బ్యాటరీ ఆప్టిమైజేషన్‌లు నిలిపివేయబడాలి. + +MicroG కోసం బ్యాటరీ ఆప్టిమైజేషన్‌లను నిలిపివేయడం బ్యాటరీ వినియోగాన్ని ప్రతికూలంగా ప్రభావితం చేయదు. + +కొనసాగించు బటన్‌ను నొక్కండి మరియు ఆప్టిమైజేషన్ మార్పులను అనుమతించండి." + కొనసాగించు - + + ఈ ఫీచర్ ఉపయోగించడానికి యాప్‌ను మళ్ళీ ప్రారంభించండి. + లాగ్ ప్రోటోకాల్ బఫర్ + డీబగ్ లాగ్‌లలో ప్రోటో బఫర్ ఉంటుంది + డీబగ్ లాగ్‌లలో ప్రోటో బఫర్ ఉండదు + "ఈ సెట్టింగ్‌ను ఎనేబుల్ చేయడం ద్వారా, కొన్ని UI భాగాల కోసం ఆన్-స్క్రీన్ టెక్స్ట్‌తో సహా అదనపు లేఅవుట్ డేటాను లాగ్ చేస్తుంది. +అనుకూల ఫిల్టర్‌లను సృష్టించేటప్పుడు ఇది భాగాలను గుర్తించడంలో సహాయపడుతుంది. +అయితే, దీన్ని ఎనేబుల్ చేయడం ద్వారా మీ IP చిరునామా వంటి కొన్ని వినియోగదారు డేటా కూడా లాగ్ అవుతుంది." + @@ -48,40 +83,135 @@ Second \"item\" text" - + సృష్టికర్త స్టోర్ షెల్ఫ్‌ను దాచు. + వీడియో ప్లేయర్ కింద ఉన్న సృష్టికర్త స్టోర్ షెల్ఫ్ దాచివేయబడింది. + వీడియో ప్లేయర్ కింద ఉన్న సృష్టికర్త స్టోర్ షెల్ఫ్ చూపబడింది. + హోమ్ ఫీడ్‌లోని వీడియోల కింద వ్యాఖ్యల విభాగాన్ని దాచు. + హోమ్ ఫీడ్‌లోని వీడియోల కింద వ్యాఖ్యల విభాగం దాచివేయబడింది. + హోమ్ ఫీడ్‌లోని వీడియోల కింద వ్యాఖ్యల విభాగం చూపబడింది. + + \'తాజా వీడియోలు\' బటన్‌ను దాచు. + తాజా వీడియోల బటన్ దాచివేయబడింది. + తాజా వీడియోల బటన్ చూపబడింది. + + వెబ్ శోధన ఫలితాలను దాచు. + వెబ్ శోధన ఫలితాలు దాచివేయబడ్డాయి. + వెబ్ శోధన ఫలితాలు చూపబడ్డాయి. + \'మీరు ఇష్టపడవచ్చు\' విభాగాన్ని దాచు. + \'మీరు ఇష్టపడవచ్చు\' విభాగం దాచివేయబడింది. + \'మీరు ఇష్టపడవచ్చు\' విభాగం చూపబడింది. + This button usually appears in the video player for certain videos. --> + + \'ప్రత్యక్ష చాట్ రీప్లే\' బటన్‌ను దాచు. + ప్లేయర్ ఓవర్‌లేలో ప్రత్యక్ష చాట్ రీప్లే బటన్ దాచివేయబడింది. + ప్లేయర్ ఓవర్‌లేలో ప్రత్యక్ష చాట్ రీప్లే బటన్ చూపబడింది. + వీడియో శీర్షికను దాచు. + ప్లేయర్ ఓవర్‌లేలో వీడియో శీర్షిక దాచివేయబడింది. + ప్లేయర్ ఓవర్‌లేలో వీడియో శీర్షిక చూపబడింది. + \'కోర్సు పురోగతి\'ని దాచు. + కోర్సు పురోగతి విభాగం దాచివేయబడింది. + కోర్సు పురోగతి విభాగం చూపబడింది. + అన్వేషణను దాచు. + ఈ కోర్సును అన్వేషించండి మరియు పాడ్‌కాస్ట్ విభాగాలను అన్వేషించండి దాచివేయబడ్డాయి. + ఈ కోర్సును అన్వేషించండి మరియు పాడ్‌కాస్ట్ విభాగాలను అన్వేషించండి చూపబడ్డాయి. + \'ఈ కోర్సును అన్వేషించండి\'ని దాచు. + ఈ కోర్సును అన్వేషించండి విభాగం దాచివేయబడింది. + ఈ కోర్సును అన్వేషించండి విభాగం చూపబడింది. + \'పాడ్‌కాస్ట్‌ను అన్వేషించండి\'ని దాచు. + పాడ్‌కాస్ట్ విభాగాన్ని అన్వేషించండి దాచివేయబడింది. + పాడ్‌కాస్ట్ విభాగాన్ని అన్వేషించండి చూపబడింది. + \'ఫీచర్ చేయబడిన ప్రదేశాలు\'ను దాచు. + ఫీచర్ చేయబడిన ప్రదేశాల విభాగం దాచివేయబడింది. + ఫీచర్ చేయబడిన ప్రదేశాల విభాగం చూపబడింది. + ఫీడ్ ఫ్లైఅవుట్ మెను ఫిల్టర్‌ను ప్రారంభించు. + ఫీడ్ ఫ్లైఅవుట్ మెను ఫిల్టర్ ప్రారంభించబడింది. + ఫీడ్ ఫ్లైఅవుట్ మెను ఫిల్టర్ నిలిపివేయబడింది. + ఫీడ్ ఫ్లైఅవుట్ మెను ఫిల్టర్. + ఫిల్టర్ చేయడానికి ఫ్లైఅవుట్ మెను పేర్లను నమోదు చేయండి, ప్రతి లైన్‌కు ఒకటి. + గేమింగ్‌ను దాచు. + గేమింగ్ విభాగం దాచివేయబడింది. + గేమింగ్ విభాగం చూపబడింది. + సంగీతాన్ని దాచు. + సంగీత విభాగం దాచివేయబడింది. + సంగీత విభాగం చూపబడింది. + క్విజ్‌లను దాచు. + క్విజ్‌ల విభాగం దాచివేయబడింది. + క్విజ్‌ల విభాగం చూపబడింది. + ఛానెల్ ట్యాబ్ ఫిల్టర్‌ను ప్రారంభించు. + ఛానెల్ ట్యాబ్ ఫిల్టర్ ప్రారంభించబడింది. + ఛానెల్ ట్యాబ్ ఫిల్టర్ నిలిపివేయబడింది. + ఛానెల్ ట్యాబ్ ఫిల్టర్. + ఫిల్టర్ చేయడానికి ఛానెల్ ట్యాబ్ పేర్లను నమోదు చేయండి, ప్రతి లైన్‌కు ఒకటి. + "పరిమితులు: +• Shorts షెల్ఫ్‌లు, ఛానెల్ పేజీలు మరియు శోధన ఫలితాలు వీక్షణ గణనలను చూపవచ్చు. +• ఈ ఫీచర్ ఆటోమోటివ్ ఫారమ్ ఫ్యాక్టర్‌తో పనిచేయదు." + "పరిమితులు: +• Shorts షెల్ఫ్‌లు, ఛానెల్ పేజీలు మరియు శోధన ఫలితాలు ఇప్పటికీ అప్‌లోడ్ సమయాలను చూపవచ్చు. +• ఈ ఫీచర్ ఆటోమోటివ్ ఫారమ్ ఫ్యాక్టర్‌తో పనిచేయదు." + "కీలకపదాల పదబంధాలకు సరిపోలే కంటెంట్‌ను దాచడానికి హోమ్/సబ్‌స్క్రిప్షన్‌లు/శోధన ఫలితాలు ఫిల్టర్ చేయబడతాయి + +పరిమితులు: +• Shorts ఛానెల్ పేరు ద్వారా దాచిపెట్టబడవు +• కొన్ని UI భాగాలు దాచిపెట్టబడకపోవచ్చు +• కీలకపదం కోసం శోధిస్తే ఫలితాలు చూపకపోవచ్చు." - + పూర్తి స్క్రీన్ ప్రకటనలు దాచివేయబడ్డాయి. + ప్లేయర్ పాప్‌అప్ ప్రకటనలను దాచు. + ప్లేయర్ పాప్‌అప్ ప్రకటనలు దాచివేయబడ్డాయి. + ప్లేయర్ పాప్‌అప్ ప్రకటనలు చూపబడ్డాయి. + ప్లేయర్ ఓవర్‌లేలో ఉత్పత్తులను వీక్షించే బ్యానర్ దాచివేయబడింది. + ప్లేయర్ ఓవర్‌లేలో ఉత్పత్తులను వీక్షించే బ్యానర్ చూపబడింది. + YouTube Premium ప్రమోషన్లను దాచు. + YouTube Premium ప్రమోషన్లు దాచివేయబడ్డాయి. + YouTube Premium ప్రమోషన్లు చూపబడ్డాయి. - - + + URL క్లిప్‌బోర్డ్‌కు కాపీ చేయబడింది. + టైమ్‌స్టాంప్‌తో కూడిన URL కాపీ చేయబడింది. + వీడియో URL కాపీ బటన్‌ను చూపించు. + వీడియో URL కాపీ బటన్ చూపబడింది. వీడియో URLని కాపీ చేయడానికి నొక్కండి. టైమ్‌స్టాంప్‌తో కాపీ చేయడానికి నొక్కి పట్టుకోండి. + వీడియో URL కాపీ బటన్ చూపబడలేదు. + టైమ్‌స్టాంప్ URL కాపీ బటన్‌ను చూపించు. + టైమ్‌స్టాంప్ URL కాపీ బటన్ చూపబడింది. టైమ్‌స్టాంప్‌తో వీడియో URLని కాపీ చేయడానికి నొక్కండి. టైమ్‌స్టాంప్ లేకుండా కాపీ చేయడానికి నొక్కి పట్టుకోండి. + టైమ్‌స్టాంప్ URL కాపీ బటన్ చూపబడలేదు. + - + + \'టీవీకి సైన్ ఇన్ చేయి\' పాప్‌అప్‌ను నిలిపివేయండి. + టీవీకి సైన్ ఇన్ చేయి పాప్‌అప్ నిలిపివేయబడింది. + టీవీకి సైన్ ఇన్ చేయి పాప్‌అప్ ప్రారంభించబడింది. + - + + సీక్ చేయడానికి నొక్కడాన్ని ప్రారంభించు. + సీక్ చేయడానికి నొక్కడం ప్రారంభించబడింది. + సీక్ చేయడానికి నొక్కడం నిలిపివేయబడింది. + @@ -89,25 +219,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + కొన్ని వినియోగదారు ఖాతాలకు దాచడం పనిచేయకపోవచ్చు. - + + నావిగేషన్ బటన్లు. + నావిగేషన్ బార్ బటన్‌లను దాచు లేదా మార్చు. + హోమ్‌ను దాచు. + హోమ్ బటన్ దాచివేయబడింది. + హోమ్ బటన్ చూపబడింది. + Shorts ను దాచు. + Shorts బటన్ దాచివేయబడింది. + Shorts బటన్ చూపబడింది. + సృష్టించును దాచు. + సృష్టించు బటన్ దాచివేయబడింది. + సృష్టించు బటన్ చూపబడింది. + సబ్‌స్క్రిప్షన్‌లను దాచు. + సబ్‌స్క్రిప్షన్‌ల బటన్ దాచివేయబడింది. + సబ్‌స్క్రిప్షన్‌ల బటన్ చూపబడింది. + నోటిఫికేషన్‌లను దాచు. + నోటిఫికేషన్‌ల బటన్ దాచివేయబడింది. + నోటిఫికేషన్‌ల బటన్ చూపబడింది. + సృష్టించును నోటిఫికేషన్‌లతో మార్చు. + సృష్టించు బటన్ నోటిఫికేషన్‌ల బటన్‌తో మార్చబడింది. + సృష్టించు బటన్ నోటిఫికేషన్‌ల బటన్‌తో మార్చబడలేదు. + ఈ సెట్టింగ్‌ని మార్చిన తర్వాత అది అమలులోకి రాకపోతే, అజ్ఞాత మోడ్‌కి మారడానికి ప్రయత్నించండి. + నావిగేషన్ బటన్ లేబుల్‌లను దాచు. + లేబుల్‌లు దాచివేయబడ్డాయి. + లేబుల్‌లు చూపబడ్డాయి. + సన్నని నావిగేషన్ బటన్‌లను ప్రారంభించు. + నావిగేషన్ బటన్‌ల మధ్య ఖాళీ తక్కువగా ఉంది. + నావిగేషన్ బటన్‌ల మధ్య ఖాళీ సాధారణంగా ఉంది. + నావిగేషన్ బార్ యానిమేషన్‌లను ప్రారంభించు. + నావిగేషన్ పరివర్తనాలు యానిమేట్ చేయబడ్డాయి. + నావిగేషన్ పరివర్తనాలు యానిమేట్ చేయబడలేదు. + ట్రాన్స్‌లూసెంట్ స్టేటస్ బార్‌ను నిలిపివేయండి. + స్టేటస్ బార్ అపారదర్శకంగా ఉంది. + స్టేటస్ బార్ అపారదర్శకంగా లేదా ట్రాన్స్‌లూసెంట్‌గా ఉంది. + "పరిమితులు: +• వీడియో ప్లేయర్ పైన నల్లటి పట్టీ కనిపించవచ్చు. +• కొన్ని పరికరాల్లో, ఈ ఫీచర్‌ను ప్రారంభించడం సిస్టమ్ నావిగేషన్ బార్‌ను పారదర్శకంగా మార్చవచ్చు." + లైట్ ట్రాన్స్‌లూసెంట్ బార్‌ను నిలిపివేయండి. + లైట్ మోడ్ నావిగేషన్ బార్ అపారదర్శకంగా ఉంది. + లైట్ మోడ్ నావిగేషన్ బార్ అపారదర్శకంగా లేదా ట్రాన్స్‌లూసెంట్‌గా ఉంది. + డార్క్ ట్రాన్స్‌లూసెంట్ బార్‌ను నిలిపివేయండి. + డార్క్ మోడ్ నావిగేషన్ బార్ అపారదర్శకంగా ఉంది. + డార్క్ మోడ్ నావిగేషన్ బార్ అపారదర్శకంగా లేదా ట్రాన్స్‌లూసెంట్‌గా ఉంది. + టూల్‌బార్. + టూల్‌బార్ భాగాలను దాచు లేదా మార్చు. + సృష్టించు బటన్‌ను దాచు. + సృష్టించు బటన్ దాచివేయబడింది. + సృష్టించు బటన్ చూపబడింది. + నోటిఫికేషన్‌ల బటన్‌ను దాచు. + నోటిఫికేషన్‌ల బటన్ దాచివేయబడింది. + నోటిఫికేషన్‌ల బటన్ చూపబడింది. + శోధన బటన్‌ను దాచు. + శోధన బటన్ దాచివేయబడింది. + శోధన బటన్ చూపబడింది. + విస్తృత శోధన పట్టీని ప్రారంభించండి + విస్తృత శోధన పట్టీ ప్రారంభించబడింది + విస్తృత శోధన పట్టీ నిలిపివేయబడింది @@ -126,25 +313,67 @@ Second \"item\" text" + కుదించు బటన్‌ను దాచు. + కుదించు బటన్ దాచివేయబడింది. + కుదించు బటన్ చూపబడింది. + పూర్తి స్క్రీన్ బటన్‌ను దాచు. + పూర్తి స్క్రీన్ బటన్ దాచివేయబడింది. + పూర్తి స్క్రీన్ బటన్ చూపబడింది. + + + ముగింపు స్క్రీన్ కార్డ్‌లను దాచు. + ముగింపు స్క్రీన్ కార్డ్‌లు దాచివేయబడ్డాయి. + ముగింపు స్క్రీన్ కార్డ్‌లు చూపబడ్డాయి. - + పూర్తి స్క్రీన్ పెద్ద సీక్‌బార్‌ను ప్రారంభించు. + పూర్తి స్క్రీన్ సీక్‌బార్ పెద్ద పరిమాణంలో ఉంది. + పూర్తి స్క్రీన్ సీక్‌బార్ సాధారణ పరిమాణంలో ఉంది. + ఛానెల్ పేజీలో Shorts ను దాచు. + ఛానెల్ పేజీలో దాచివేయబడింది. + ఛానెల్ పేజీలో చూపబడింది. + వీడియో వివరణలో Shorts ను దాచు. + వీడియో వివరణలో దాచివేయబడింది. + వీడియో వివరణలో చూపబడింది. + AI బటన్‌ను దాచు. + AI బటన్ దాచివేయబడింది. + AI బటన్ చూపబడింది. + \'ఆటో-డబ్ చేయబడిన\' లేబుల్‌ను దాచు. + ఆటో-డబ్ చేయబడిన లేబుల్ దాచివేయబడింది. + ఆటో-డబ్ చేయబడిన లేబుల్ చూపబడింది. + - + + ఆటోప్లే ప్రివ్యూను దాచు. + ఆటోప్లే ప్రివ్యూ దాచివేయబడింది. + ఆటోప్లే ప్రివ్యూ చూపబడింది. + + + ముగింపు స్క్రీన్ సూచించిన వీడియోను దాచు. + "ఆటోప్లే ఆఫ్ చేయబడినప్పుడు ముగింపు స్క్రీన్ సూచించిన వీడియో దాచివేయబడింది + +YouTube సెట్టింగ్‌లలో ఆటోప్లే మార్చవచ్చు: +సెట్టింగ్‌లు → ప్లేబ్యాక్ → తర్వాత వీడియోను ఆటోప్లే చేయండి." + ముగింపు స్క్రీన్ సూచించిన వీడియో చూపబడింది. + - + + ప్లేయర్ పాప్అప్ ప్యానెల్‌లను దాచు + ప్లేయర్ పాప్అప్ ప్యానెల్‌లు దాచిపెట్టబడ్డాయి + ప్లేయర్ పాప్అప్ ప్యానెల్‌లు చూపబడ్డాయి + @@ -155,10 +384,12 @@ Second \"item\" text" - - + సంగీత వీడియోలలో మాత్రమే ఉపయోగించాలి. సంగీతం లేని మ్యూజిక్ వీడియోల విభాగాలు, ఇవి ఇతర వర్గంలో చేర్చబడలేదు. + విభాగాన్ని సమర్పించలేరు: %s. + "విభాగాన్ని సమర్పించలేరు. +ఇప్పటికే ఉంది." @@ -170,7 +401,11 @@ Second \"item\" text" - + + నిలిపివేయబడింది. + రంగు. + నలుపు మరియు తెలుపు. + @@ -187,7 +422,11 @@ Second \"item\" text" - + + నొక్కి పట్టుకునే హాప్టిక్స్‌ను నిలిపివేయండి. + నొక్కి పట్టుకునే హాప్టిక్స్ నిలిపివేయబడింది. + నొక్కి పట్టుకునే హాప్టిక్స్ ప్రారంభించబడింది. + @@ -200,6 +439,11 @@ Second \"item\" text" + + ప్రీమియం నాణ్యత ఎంపికలను దాచు. + ప్రీమియం నాణ్యత ఎంపికలు దాచివేయబడ్డాయి. + ప్రీమియం నాణ్యత ఎంపికలు చూపబడ్డాయి. + @@ -207,7 +451,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index 9dbda5bb97..99f1a4f1dd 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" กำหนดเอง ไอคอนแอป ต้นฉบับ + ReVanced ReVanced เรียบง่าย ReVanced ปรับขนาด @@ -49,14 +50,15 @@ Second \"item\" text" การตั้งค่า + ReVanced คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ บันทึก รีเซ็ต รีเซ็ตสี สีไม่ถูกต้อง - ต้องรีสตาร์ท - รีสตาร์ทแอปเพื่อให้การเปลี่ยนแปลงนี้มีผล - เริ่มต้นใหม่ + ต้องรีสตาร์ต + รีสตาร์ตแอปเพื่อให้การเปลี่ยนแปลงนี้มีผล + รีสตาร์ต นำเข้า คัดลอก การตั้งค่า ReVanced ถูกตั้งค่าเป็นค่าเริ่มต้น @@ -80,6 +82,9 @@ Second \"item\" text" แสดงประวัติการค้นหาในการตั้งค่า ประวัติการค้นหาในการตั้งค่าจะปรากฏ ไม่แสดงประวัติการค้นหาการตั้งค่า + ปิดใช้งานไอคอนตัวหนา + ไอคอนไม่เป็นตัวหนา + ไอคอนเป็นตัวหนา แสดงไอคอนการตั้งค่า ReVanced ไอคอนการตั้งค่าจะปรากฏขึ้น ไม่แสดงไอคอนการตั้งค่า @@ -99,27 +104,35 @@ Second \"item\" text" and changes made here must also be made there. --> - การตั้งค่า GmsCore - การตั้งค่าสำหรับ GmsCore + GmsCore + การตั้งค่าสำหรับ GmsCore + ตรวจสอบการอัปเดต GmsCore + เปิดใช้งานการตรวจสอบการอัปเดตแล้ว + ปิดใช้งานการตรวจสอบการอัปเดต + เปิดการตั้งค่า GmsCore + การตั้งค่าของ GmsCore - MicroG GmsCore ไม่ได้ติดตั้ง ติดตั้ง - ต้องดำเนินการ - "MicroG GmsCore ไม่มีสิทธิ์รันในพื้นหลัง + MicroG GmsCore ไม่ได้ติดตั้ง ติดตั้ง + ต้องดำเนินการ + ไม่สามารถตรวจสอบการอัปเดต MicroG GmsCore ได้ + มี MicroG GmsCore เวอร์ชันใหม่ (%1$s) พร้อมใช้งานแล้ว ขณะนี้คุณกำลังใช้เวอร์ชัน %2$s + "MicroG GmsCore ไม่มีสิทธิ์รันในพื้นหลัง -ทำตามคําแนะนํา \"อย่าฆ่าแอปของฉัน\" สําหรับโทรศัพท์ของคุณ และใช้คําแนะนําเหล่านั้นกับการติดตั้ง MicroG ของคุณ - -สิ่งนี้จําเป็นสําหรับแอปในการทํางาน" - เปิดเว็บไซต์ - "การปรับแต่งแบตเตอรี่ของ MicroG GmsCore ต้องถูกปิดใช้งานเพื่อป้องกันปัญหา +ทำตามคําแนะนํา \" + เปิดเว็บไซต์ + ยกเลิก + "การปรับแต่งแบตเตอรี่ของ MicroG GmsCore ต้องถูกปิดใช้งานเพื่อป้องกันปัญหา การปิดใช้งานการปรับแต่งแบตเตอรี่สําหรับ MicroG จะไม่ส่งผลเสียต่อการใช้แบตเตอรี่ แตะปุ่มตกลง และอนุญาตการเปลี่ยนแปลงการปรับแต่ง" - ดำเนินการต่อ + ดำเนินการต่อ ปลอมแปลงสตรีมวิดีโอ ปลอมแปลงสตรีมวิดีโอของไคลเอนต์เพื่อป้องกันปัญหาการเล่น + ปลอมแปลงข้อมูลการสตรีมวิดีโอ + ปลอมแปลงข้อมูลการสตรีมวิดีโอของไคลเอนต์เพื่อป้องกันปัญหาการเล่นวิดีโอ วิดีโอปลอม "สตรีมวิดีโอถูกปลอมแปลง @@ -169,10 +182,11 @@ Second \"item\" text" บันทึกแฟล็กแล้ว รีเซ็ตแฟล็กแล้ว คัดลอกแฟล็กไปยังคลิปบอร์ดแล้ว - บันทึกโปรโตคอลบัฟเฟอร์ - การบันทึกการแก้ไขข้อบกพร่องรวมถึงโปรโตคอลบัฟเฟอร์ - การบันทึกการแก้ไขข้อบกพร่องไม่รวมโปรโตคอลบัฟเฟอร์ - "การเปิดใช้งานการตั้งค่านี้จะบันทึกข้อมูลเค้าโครงเพิ่มเติม รวมถึงข้อความบนหน้าจอสำหรับส่วนประกอบ UI บางส่วน + รีสตาร์ตแอปเพื่อใช้งานคุณสมบัตินี้ + บันทึกโปรโตคอลบัฟเฟอร์ + การบันทึกการแก้ไขข้อบกพร่องรวมถึงโปรโตคอลบัฟเฟอร์ + การบันทึกการแก้ไขข้อบกพร่องไม่รวมโปรโตคอลบัฟเฟอร์ + "การเปิดใช้งานการตั้งค่านี้จะบันทึกข้อมูลเค้าโครงเพิ่มเติม รวมถึงข้อความบนหน้าจอสำหรับส่วนประกอบ UI บางส่วน ซึ่งจะช่วยระบุส่วนประกอบเมื่อสร้างตัวกรองที่กำหนดเองได้ @@ -206,8 +220,10 @@ Second \"item\" text" ฟีด ทั่วไป เครื่องเล่น + Shorts แถบเลื่อน ปัดเพื่อควบคุม + Return YouTube Dislike เบ็ดเตล็ด วิดีโอ กู้คืนเมนูการตั้งค่าแบบเก่า @@ -220,6 +236,9 @@ Second \"item\" text" การเล่นพื้นหลัง Shorts ถูกเปิดใช้งาน + ซ่อนชั้นวางร้านค้าของผู้สร้าง + ชั้นวางร้านค้าของครีเอเตอร์ใต้โปรแกรมเล่นวิดีโอถูกซ่อนไว้ + แสดงชั้นวางร้านค้าของผู้สร้างใต้เครื่องเล่นวิดีโอ ซ่อนการ์ดอัลบั้ม การ์ดอัลบั้มถูกซ่อน การ์ดอัลบั้มถูกแสดง @@ -229,6 +248,9 @@ Second \"item\" text" ซ่อนชั้นวางชิป ชั้นวางชิปถูกซ่อน ชั้นวางชิปแสดงอยู่ + ซ่อนส่วนความคิดเห็นใต้วิดีโอในหน้าแรก + ส่วนความคิดเห็นใต้วิดีโอในหน้าแรกถูกซ่อน + ส่วนความคิดเห็นใต้วิดีโอในหน้าแรกแสดงอยู่ ซ่อนโพสต์ชุมชน โพสต์ชุมชนถูกซ่อนไว้ โพสต์ชุมชนแสดงอยู่ @@ -256,14 +278,19 @@ Second \"item\" text" ซ่อนโพสต์ล่าสุด โพสต์ล่าสุดถูกซ่อนไว้ โพสต์ล่าสุดแสดงอยู่ + + ซ่อนปุ่ม \'วิดีโอใหม่ล่าสุด\' + ปุ่มวิดีโอใหม่ล่าสุดถูกซ่อน + ปุ่มวิดีโอใหม่ล่าสุดแสดงอยู่ ซ่อนเพลย์ลิสต์แบบผสม เพลย์ลิสต์แบบผสมถูกซ่อนไว้ เพลย์ลิสต์แบบผสมแสดงอยู่ ซ่อนส่วนภาพยนตร์ ส่วนภาพยนตร์ถูกซ่อนไว้ ส่วนภาพยนตร์แสดงอยู่ - + ซ่อนปุ่ม \"แจ้งเตือนฉัน\" ปุ่มแจ้งเตือนฉันถูกซ่อนไว้ ปุ่มแจ้งเตือนฉันแสดงอยู่ @@ -288,13 +315,16 @@ Second \"item\" text" ซ่อนตัวคั่นภาพ ตัวคั่นภาพถูกซ่อนแล้ว ตัวคั่นภาพถูกแสดงแล้ว + ซ่อนผลลัพธ์การค้นหาบนเว็บ + ผลลัพธ์การค้นหาบนเว็บถูกซ่อน + ผลลัพธ์การค้นหาบนเว็บจะแสดง + ซ่อนส่วน \'คุณอาจชอบ\' + ส่วน \'คุณอาจชอบ\' ถูกซ่อน + ส่วน \'คุณอาจชอบ\' แสดงอยู่ ซ่อน Doodles ของ YouTube ภาพเคลื่อนไหว YouTube Doodles บนโลโก้ถูกซ่อนไว้ แสดงแอนิเมชัน Doodles ของ YouTube บนโลโก้ - "YouTube Doodles ภาษาไทยจะปรากฏให้เห็นเพียงไม่กี่วันในแต่ละปี - -หาก Doodle กำลังแสดงอยู่ในภูมิภาคของคุณและการตั้งค่าการซ่อนนี้เปิดอยู่ แถบตัวกรองด้านล่างแถบค้นหาจะถูกซ่อนเช่นกัน" ซ่อนแถบช่อง แถบช่องถูกซ่อนไว้ แถบช่องแสดงอยู่ @@ -311,10 +341,15 @@ Second \"item\" text" แผงข้อมูลถูกซ่อนไว้ แผงข้อมูลแสดงอยู่ + This button usually appears in the video player for certain videos. --> ซ่อนปุ่มเข้าร่วม ปุ่มเข้าร่วมถูกซ่อนไว้ ปุ่มเข้าร่วมแสดงอยู่ + + ซ่อนปุ่ม \'เล่นซ้ำแชทสด\' + ปุ่มเล่นซ้ำแชทสดในโอเวอร์เลย์เครื่องเล่นถูกซ่อน + ปุ่มเล่นซ้ำแชทสดในโอเวอร์เลย์เครื่องเล่นแสดงอยู่ ซ่อนแผงทางการแพทย์ แผงทางการแพทย์ถูกซ่อนไว้ แผงทางการแพทย์แสดงอยู่ @@ -330,6 +365,9 @@ Second \"item\" text" ซ่อนปฏิกิริยาตามเวลา ปฏิกิริยาตามเวลาถูกซ่อน ปฏิกิริยาตามเวลาถูกแสดง + ซ่อนชื่อวิดีโอ + ชื่อวิดีโอในโอเวอร์เลย์เครื่องเล่นถูกซ่อน + ชื่อวิดีโอในโอเวอร์เลย์เครื่องเล่นแสดงอยู่ ซ่อน \",สรุปวิดีโอที่สร้างโดย AI\" ส่วนสรุปวิดีโอที่สร้างโดย AI ถูกซ่อนอยู่ แสดงส่วนสรุปวิดีโอที่สร้างโดย AI @@ -342,33 +380,62 @@ Second \"item\" text" ซ่อนบท ส่วนบทถูกซ่อนไว้ ส่วนบทแสดงอยู่ - ซ่อน \'วิธีการสร้างเนื้อหานี้\' - ส่วนวิธีการสร้างเนื้อหานี้ถูกซ่อน - ส่วนวิธีการสร้างเนื้อหานี้แสดงอยู่ - ซ่อนคะแนน Hype - คะแนน Hype ถูกซ่อน - คะแนน Hype แสดงอยู่ + ซ่อน \'ความคืบหน้าของคอร์ส\' + ส่วนความคืบหน้าของคอร์สถูกซ่อน + ส่วนความคืบหน้าของคอร์สแสดงอยู่ + ซ่อนสำรวจ + ส่วนสำรวจคอร์สนี้และสำรวจพอดแคสต์ถูกซ่อน + ส่วนสำรวจคอร์สนี้และสำรวจพอดแคสต์แสดงอยู่ + ซ่อน \'สำรวจคอร์สนี้\' + ส่วนสำรวจคอร์สนี้ถูกซ่อน + ส่วนสำรวจคอร์สนี้แสดงอยู่ + ซ่อน \'สำรวจพอดแคสต์\' + ส่วนสำรวจพอดแคสต์ถูกซ่อน + ส่วนสำรวจพอดแคสต์แสดงอยู่ ซ่อน \'สำรวจพอดแคสต์\' ส่วนสำรวจพอดแคสต์ถูกซ่อน ส่วนสำรวจพอดแคสต์แสดงอยู่ ซ่อนลิงก์เด่น ส่วนลิงก์เด่นถูกซ่อน ส่วนลิงก์เด่นถูกแสดง + ซ่อน \'สถานที่แนะนำ\' + ส่วนสถานที่แนะนำถูกซ่อน + ส่วนสถานที่แนะนำแสดงอยู่ ซ่อนวิดีโอเด่น ส่วนวิดีโอเด่นถูกซ่อน ส่วนวิดีโอเด่นถูกแสดง + เปิดใช้งานตัวกรองเมนูแบบเลื่อนลงของฟีด + เปิดใช้งานตัวกรองเมนูแบบเลื่อนลงของฟีดแล้ว + ปิดใช้งานตัวกรองเมนูแบบเลื่อนลงของฟีดแล้ว + ตัวกรองเมนูแบบเลื่อนลงของฟีด + ป้อนชื่อเมนูแบบเลื่อนลงเพื่อกรอง โดยแต่ละชื่ออยู่คนละบรรทัด + ซ่อนการเล่นเกม + ส่วนการเล่นเกมถูกซ่อน + ส่วนการเล่นเกมแสดงอยู่ + ซ่อน \'วิธีการสร้างเนื้อหานี้\' + ส่วนวิธีการสร้างเนื้อหานี้ถูกซ่อน + ส่วนวิธีการสร้างเนื้อหานี้แสดงอยู่ + ซ่อนคะแนน Hype + คะแนน Hype ถูกซ่อน + คะแนน Hype แสดงอยู่ ซ่อนการ์ดข้อมูล ส่วนบัตรข้อมูลถูกซ่อนไว้ ส่วนบัตรข้อมูลแสดงอยู่ ซ่อน \'แนวคิดหลัก\' ส่วนแนวคิดหลักถูกซ่อน ส่วนแนวคิดหลักแสดงอยู่ + ซ่อนเพลง + ส่วนเพลงถูกซ่อน + ส่วนเพลงแสดงอยู่ ซ่อนปุ่มติดตาม ปุ่มติดตามถูกซ่อน ปุ่มติดตามถูกแสดง ซ่อนบทถอดเสียง ส่วนคำอธิบายถูกซ่อนไว้ ส่วนคำอธิบายแสดงอยู่ + ซ่อนแบบทดสอบ + ส่วนแบบทดสอบถูกซ่อน + ส่วนแบบทดสอบแสดงอยู่ คำอธิบายวิดีโอ ซ่อนหรือแสดงส่วนประกอบของคำอธิบายวิดีโอ แถบตัวกรอง @@ -387,6 +454,11 @@ Second \"item\" text" แสดงในประวัติการดู หน้าช่อง ซ่อนหรือแสดงองค์ประกอบของหน้าช่อง + เปิดใช้งานตัวกรองแท็บช่อง + เปิดใช้งานตัวกรองแท็บช่องแล้ว + ปิดใช้งานตัวกรองแท็บช่องแล้ว + ตัวกรองแท็บช่อง + ป้อนชื่อแท็บช่องเพื่อกรอง โดยแต่ละชื่ออยู่คนละบรรทัด ซ่อนปุ่มชุมชน ปุ่มชุมชนถูกซ่อน @@ -496,19 +568,12 @@ Second \"item\" text" คำสำคัญจะซ่อนวิดีโอทั้งหมด: %s - ซ่อนชั้นวางร้านค้าของผู้สร้าง - ชั้นวางร้านค้าของครีเอเตอร์ใต้โปรแกรมเล่นวิดีโอถูกซ่อนไว้ - แสดงชั้นวางร้านค้าของผู้สร้างใต้เครื่องเล่นวิดีโอ ซ่อนแบนเนอร์ร้านค้าท้ายจอ แบนเนอร์ร้านค้าท้ายหน้าจอถูกซ่อนไว้ แบนเนอร์ร้านค้าท้ายหน้าจอแสดงอยู่ ซ่อนโฆษณาแบบเต็มหน้าจอ - "โฆษณาแบบเต็มจอถูกซ่อน - -คุณสมบัตินี้มีเฉพาะสําหรับอุปกรณ์รุ่นเก่า" + โฆษณาแบบเต็มหน้าจอถูกซ่อน โฆษณาแบบเต็มหน้าจอจะแสดง - - ซ่อนโฆษณาแบบเต็มหน้าจอใช้งานได้กับอุปกรณ์รุ่นเก่าเท่านั้น ซ่อนโฆษณาโดยทั่วไป โฆษณาโดยทั่วไปถูกซ่อน โฆษณาโดยทั่วไปจะแสดง @@ -518,6 +583,9 @@ Second \"item\" text" ซ่อนป้ายโฆษณาที่จ่ายเงิน ป้ายโฆษณาที่จ่ายเงินถูกซ่อน ป้ายโฆษณาที่จ่ายเงินจะแสดง + ซ่อนโฆษณาป๊อปอัปเครื่องเล่น + โฆษณาป๊อปอัปเครื่องเล่นถูกซ่อนอยู่ + โฆษณาป๊อปอัปเครื่องเล่นแสดงอยู่ ซ่อนการ์ดที่สนับสนุนตัวเอง การ์ดที่สนับสนุนตัวเองถูกซ่อน การ์ดที่สนับสนุนตัวเองจะแสดง @@ -525,23 +593,18 @@ Second \"item\" text" ลิงก์การช็อปปิ้งในคำอธิบายวิดีโอถูกซ่อนไว้ แสดงลิงก์ช้อปปิ้งในคำอธิบายวิดีโอ ซ่อนแบนเนอร์ \'ดูสินค้า\' - แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอถูกซ่อนไว้ - แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์วิดีโอแสดงอยู่ - ซ่อนผลลัพธ์การค้นหาบนเว็บ - ผลลัพธ์การค้นหาบนเว็บถูกซ่อน - ผลลัพธ์การค้นหาบนเว็บจะแสดง - - - ซ่อนการโปรโมต YouTube Premium - การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอถูกซ่อน - การโปรโมต YouTube Premium ใต้เครื่องเล่นวิดีโอจะแสดง + แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์เครื่องเล่นถูกซ่อน + แบนเนอร์ดูผลิตภัณฑ์ในโอเวอร์เลย์เครื่องเล่นแสดงอยู่ + ซ่อนการโปรโมต YouTube Premium + การโปรโมต YouTube Premium ถูกซ่อน + การโปรโมต YouTube Premium แสดงอยู่ ซ่อนโฆษณาวิดีโอ โฆษณาวิดีโอถูกซ่อน โฆษณาวิดีโอจะแสดง - + คัดลอก URL ไปยังคลิปบอร์ด คัดลอก URL พร้อมเวลาไปยังคลิปบอร์ด แสดงปุ่มคัดลอก URL วิดีโอ @@ -557,10 +620,10 @@ Second \"item\" text" กล่องโต้ตอบจะแสดง สิ่งนี้ไม่ได้ข้ามข้อจำกัดอายุ มันแค่ยอมรับอายุโดยอัตโนมัติ - - ปิดใช้งานป๊อปอัป \"ลงชื่อเข้าใช้ทีวี\" - ปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว - เปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว + + ปิดใช้งานป๊อปอัป \"ลงชื่อเข้าใช้ทีวี\" + ปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว + เปิดใช้งานป๊อปอัปเข้าสู่ระบบไปยังทีวีแล้ว ปิดใช้งานการแตะสองครั้งเพื่อข้ามบท @@ -593,10 +656,10 @@ Second \"item\" text" ท่าทางถูกปิดใช้งาน ท่าทางถูกเปิดใช้งาน - - เปิดใช้งานแตะเพื่อค้นหา - แตะเพื่อค้นหาเปิดใช้งานอยู่ - ปิดใช้งานการแตะเพื่อค้นหา + + เปิดใช้งานแตะเพื่อค้นหา + แตะเพื่อค้นหาเปิดใช้งานอยู่ + ปิดใช้งานการแตะเพื่อค้นหา เปิดใช้งานท่าทางความสว่าง @@ -675,7 +738,7 @@ Second \"item\" text" ปุ่มความคิดเห็นถูกซ่อน ปุ่มความคิดเห็นแสดงอยู่ + This button usually appears on live streamed videos. --> ซ่อนรายงาน ปุ่มรายงานถูกซ่อน ปุ่มรายงานถูกแสดง @@ -688,7 +751,7 @@ Second \"item\" text" ปุ่มดาวน์โหลดถูกซ่อน ปุ่มดาวน์โหลดถูกแสดง + This button usually appears on videos uploaded by the logged-in user. --> ซ่อนกระแส ปุ่ม Hype ถูกซ่อนอยู่ ปุ่ม Hype กำลังแสดง @@ -701,7 +764,7 @@ Second \"item\" text" ปุ่มขอบคุณถูกซ่อน ปุ่มขอบคุณถูกแสดง + This button usually appears if the user IP is from a specific region such as the USA or EU. --> ซ่อนปุ่มถาม ปุ่มถามถูกซ่อนอยู่ ปุ่มถามแสดงอยู่ @@ -709,6 +772,7 @@ Second \"item\" text" ซ่อนคลิป ปุ่มคลิปถูกซ่อน ปุ่มคลิปถูกแสดง + การซ่อนอาจไม่ทำงานสำหรับบัญชีผู้ใช้บางบัญชี ซ่อนร้านค้า ปุ่มร้านค้าถูกซ่อน @@ -718,13 +782,13 @@ Second \"item\" text" ปุ่มบันทึกถูกซ่อน ปุ่มบันทึกถูกแสดง - + ปุ่มนำทาง - ซ่อนหรือเปลี่ยนปุ่มในแถบนำทาง + ซ่อนหรือเปลี่ยนปุ่มแถบนำทาง ซ่อนหน้าแรก - ปุ่มหน้าแรกถูกซ่อน - ปุ่มหน้าแรกถูกแสดง + ซ่อนปุ่มหน้าแรกแล้ว + แสดงปุ่มหน้าแรกแล้ว ซ่อน Shorts ปุ่ม Shorts ถูกซ่อนอยู่ @@ -742,26 +806,44 @@ Second \"item\" text" ปุ่มการแจ้งเตือนแสดงอยู่ สลับสร้างด้วยการแจ้งเตือน - "ปุ่มสร้างถูกสลับกับปุ่มการแจ้งเตือน - -หมายเหตุ: การเปิดใช้งานสิ่งนี้จะซ่อนโฆษณาวิดีโอด้วย" + ปุ่มสร้างถูกสลับกับปุ่มการแจ้งเตือน ปุ่มสร้างไม่ได้ถูกสลับกับปุ่มการแจ้งเตือน - "การปิดใช้งานการตั้งค่านี้จะปิดใช้งานการบล็อกโฆษณา Shorts ด้วย - -หากการเปลี่ยนการตั้งค่านี้ไม่มีผล ให้ลองสลับไปใช้โหมดไม่ระบุตัวตน" + หากการเปลี่ยนการตั้งค่านี้ไม่มีผล ให้ลองเปลี่ยนไปใช้โหมดไม่ระบุตัวตน ซ่อนป้ายกำกับปุ่มนำทาง - ป้ายกำกับถูกซ่อน - ป้ายกำกับถูกแสดง + ซ่อนป้ายกำกับแล้ว + แสดงป้ายกำกับแล้ว + เปิดใช้งานปุ่มนำทางแบบแคบ + ระยะห่างระหว่างปุ่มนำทางแคบลง + ระยะห่างระหว่างปุ่มนำทางเป็นปกติ + เปิดใช้งานภาพเคลื่อนไหวแถบนำทาง + การเปลี่ยนหน้าจอมีการเคลื่อนไหว + การเปลี่ยนหน้าจอไม่มีภาพเคลื่อนไหว ปิดใช้งานแถบสถานะแบบโปร่งแสง แถบสถานะไม่โปร่งแสง แถบสถานะโปร่งแสงหรือไม่โปร่งแสง - ในอุปกรณ์บางรุ่น การเปิดใช้งานคุณสมบัตินี้อาจเปลี่ยนแถบนำทางระบบให้โปร่งใสได้ + "ข้อจำกัด: +• แถบสีดำอาจปรากฏที่ด้านบนของโปรแกรมเล่นวิดีโอ +• ในอุปกรณ์บางรุ่น การเปิดใช้งานคุณสมบัตินี้สามารถเปลี่ยนแถบนำทางของระบบให้เป็นแบบโปร่งใสได้" ปิดใช้งานแถบนำทางแบบโปร่งแสงสีอ่อน แถบนำทางโหมดสว่างเป็นแบบทึบแสง แถบนำทางโหมดสว่างโปร่งแสงหรือไม่โปร่งแสง ปิดใช้แถบโปร่งแสงสีเข้ม แถบนำทางโหมดมืดเป็นแบบทึบแสง แถบนำทางโหมดมืดโปร่งแสงหรือไม่โปร่งแสง + แถบเครื่องมือ + ซ่อนหรือเปลี่ยนส่วนประกอบแถบเครื่องมือ + ซ่อนปุ่มสร้าง + ปุ่มสร้างถูกซ่อน + ปุ่มสร้างถูกแสดง + ซ่อนปุ่มการแจ้งเตือน + ปุ่มการแจ้งเตือนถูกซ่อนอยู่ + ปุ่มการแจ้งเตือนแสดงอยู่ + ซ่อนปุ่มค้นหา + ซ่อนปุ่มค้นหาแล้ว + แสดงปุ่มค้นหาแล้ว. + ทั้งหละเย้ยนตะโรกเลียด + ทั้งละเย้ยนตะโรกเลียด รตรอกลาดต้อง + ทั้งหละเย้ยนตะโรกเลียด รบกใหม่ยเทศไทย เมนูแบบเลื่อนลง @@ -836,6 +918,12 @@ Second \"item\" text" ซ่อนปุ่มส่ง ปุ่มแคสต์ซ่อนอยู่ ปุ่มแคสต์แสดงอยู่ + ซ่อนปุ่มย่อ + ปุ่มย่อถูกซ่อน + ปุ่มย่อแสดงอยู่ + ซ่อนปุ่มเต็มหน้าจอ + ปุ่มเต็มหน้าจอถูกซ่อน + ปุ่มเต็มหน้าจอแสดงอยู่ ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น ซ่อนพื้นหลังส่วนควบคุมเครื่องเล่น แสดงพื้นหลังส่วนควบคุมเครื่องเล่น @@ -844,9 +932,9 @@ Second \"item\" text" ปุ่มแสดงอยู่ - ซ่อนการ์ดหน้าจอสิ้นสุด - การ์ดหน้าจอสิ้นสุดซ่อนอยู่ - การ์ดหน้าจอสิ้นสุดแสดงอยู่ + ซ่อนการ์ดหน้าจอสิ้นสุด + การ์ดหน้าจอสิ้นสุดซ่อนอยู่ + การ์ดหน้าจอสิ้นสุดแสดงอยู่ ปิดใช้งานโหมดแวดล้อมในโหมดเต็มหน้าจอ @@ -871,10 +959,16 @@ Second \"item\" text" ซ่อนแถบเลื่อนภาพขนาดย่อของวิดีโอ แถบเลื่อนภาพขนาดย่อของวิดีโอถูกซ่อนอยู่ แถบเลื่อนภาพขนาดย่อของวิดีโอแสดงอยู่ + เปิดใช้งานแถบเลื่อนขนาดใหญ่แบบเต็มหน้าจอ + แถบเลื่อนแบบเต็มหน้าจอมีขนาดใหญ่ + แถบเลื่อนแบบเต็มหน้าจอมีขนาดปกติ Shorts Player ซ่อนหรือแสดงส่วนประกอบเครื่องเล่น Shorts + ซ่อน Shorts ในหน้าช่อง + ซ่อนในหน้าช่องแล้ว + แสดงในหน้าช่องแล้ว ซ่อน Shorts ในหน้าแรก ซ่อนในหน้าแรกและวิดีโอที่เกี่ยวข้อง @@ -886,9 +980,18 @@ Second \"item\" text" ซ่อน Shorts ในฟีดการติดตาม ซ่อนในฟีดการติดตาม แสดงในฟีดการติดตาม + ซ่อน Shorts ในคำอธิบายวิดีโอ + ซ่อนในคำอธิบายวิดีโอแล้ว + แสดงในคำอธิบายวิดีโอแล้ว ซ่อน \"shorts\" ในประวัติการรับชม ซ่อนอยู่ในประวัติการรับชม แสดงในการค้นหา + ซ่อนปุ่ม AI + ปุ่ม AI ถูกซ่อน + ปุ่ม AI แสดงอยู่ + ซ่อนป้ายกำกับ \"พากย์เสียงอัตโนมัติ\" + ซ่อนป้ายกำกับที่พากย์อัตโนมัติแล้ว + แสดงป้ายกำกับที่พากย์อัตโนมัติแล้ว ซ่อนป้ายกำกับ \"พากย์เสียงอัตโนมัติ\" ซ่อนป้ายกำกับที่พากย์อัตโนมัติแล้ว แสดงป้ายกำกับที่พากย์อัตโนมัติแล้ว @@ -950,6 +1053,7 @@ Second \"item\" text" ซ่อนปุ่ม \"ใช้เทมเพลตนี้\" ปุ่มใช้เทมเพลตนี้ถูกซ่อน ปุ่ม \"ใช้เทมเพลตนี้\" กำลังแสดง + ซ่อนเอฟเฟกต์น้ำพุปุ่มถูกใจ เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกซ่อนไว้ เอฟเฟกต์น้ำพุของปุ่มไลก์ถูกแสดงไว้ @@ -992,7 +1096,12 @@ Second \"item\" text" ซ่อนแถบนำทางแล้ว ไม่ซ่อนแถบนำทาง - + + ซ่อนการแสดงตัวอย่างเล่นอัตโนมัติ + การแสดงตัวอย่างเล่นอัตโนมัติถูกซ่อน + การแสดงตัวอย่างเล่นอัตโนมัติแสดงอยู่ + + ซ่อนวิดีโอแนะนำในหน้าจอสิ้นสุด "วิดีโอแนะนำในหน้าจอสิ้นสุดจะถูกซ่อนเมื่อปิดเล่นอัตโนมัติ @@ -1011,9 +1120,9 @@ Second \"item\" text" เวลาแสดงอยู่ - ซ่อนแผงป๊อปอัปของเครื่องเล่น - แผงป๊อปอัปของเครื่องเล่นถูกซ่อนอยู่ - แผงป๊อปอัปของเครื่องเล่นแสดงอยู่ + ซ่อนแผงป๊อปอัปของเครื่องเล่น + แผงป๊อปอัปของเครื่องเล่นถูกซ่อนอยู่ + แผงป๊อปอัปของเครื่องเล่นแสดงอยู่ ออกจากโหมดเต็มหน้าจอเมื่อสิ้นสุดวิดีโอ @@ -1042,6 +1151,7 @@ Second \"item\" text" รีโหลดวิดีโอเพื่อลงคะแนนโดยใช้ Return YouTube Dislike ซ่อนโดยเจ้าของ + Return YouTube Dislike แสดง \"ไม่ชอบ\" ไม่แสดง \"ไม่ชอบ\" แสดง \"ไม่ชอบ\" ใน Shorts @@ -1062,6 +1172,7 @@ Second \"item\" text" แสดงคำอวยพรถ้า API ไม่พร้อมใช้งาน ข้อความแจ้งเตือนแสดงขึ้น หาก Return YouTube Dislike ไม่พร้อมใช้งาน Toast ไม่ปรากฏขึ้นหาก ไม่สามารถใช้งาน Return YouTube Dislike + ReturnYouTubeDislike.com ข้อมูลนี้ให้มาโดย Return YouTube Dislike API。 แตะที่นี่เพื่อเรียนรู้เพิ่มเติม อุปกรณ์นี้ @@ -1081,26 +1192,8 @@ Second \"item\" text" %d คุณ ที่ซีแต่องกายการบางาน %d มิกเวฮราธี - - ทั้งหละเย้ยนตะโรกเลียด - ทั้งละเย้ยนตะโรกเลียด รตรอกลาดต้อง - ทั้งหละเย้ยนตะโรกเลียด รบกใหม่ยเทศไทย - - - เปิดใช้งานรูปขนาดย่อคุณภาพสูง - รูปขนาดย่อแถบ Seek มีคุณภาพสูง - รูปขนาดย่อแถบ Seek มีคุณภาพปานกลาง - รูปขนาดย่อแถบ Seek แบบเต็มหน้าจอมีคุณภาพปานกลาง - "สิ่งนี้จะคืนค่าภาพขนาดย่อบนการถ่ายทอดสดที่ไม่มีภาพขนาดย่อของแถบเลื่อนด้วย - -ภาพขนาดย่อของแถบเลื่อนจะใช้คุณภาพเดียวกับวิดีโอปัจจุบัน - -คุณสมบัตินี้ทํางานได้ดีที่สุดด้วยคุณภาพวิดีโอ 720p หรือต่ํากว่า และเมื่อใช้การเชื่อมต่ออินเทอร์เน็ตที่รวดเร็วมาก" - คืนค่าภาพขนาดย่อสำหรับแถบเลื่อนแบบเก่า - ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏเหนือแถบเลื่อน - ภาพขนาดย่อสำหรับแถบเลื่อนจะปรากฏในโหมดเต็มจอ - + SponsorBlock เปิดใช้งาน SponsorBlock SponsorBlock เป็นระบบ crowdsourced สำหรับการข้ามส่วนที่น่ารำคาญของวิดีโอ YouTube หน้าตา @@ -1310,6 +1403,7 @@ User id ของคุณเหมือนกับรหัสผ่าน ความทึบ: สี: เกี่ยวกับ + sponsor.ajay.app ข้อมูลนี้มาจาก SponsorBlock API แตะที่นี่เพื่อเรียนรู้เพิ่มเติมและดูการดาวน์โหลดสำหรับแพลตฟอร์มอื่น ๆ @@ -1339,8 +1433,6 @@ User id ของคุณเหมือนกับรหัสผ่าน เป้าหมายการปลอมแปลงเวอร์ชันแอป 20.13.41 - กู้คืนแถบการทำงานของวิดีโอที่ไม่ได้ยุบ 20.05.46 - คืนค่าฟังก์ชันถอดเสียง - 19.35.36 - คืนค่าไอคอนเครื่องเล่น Shorts เก่า - 19.01.34 - กู้คืนไอคอนการนำทางแบบเก่า เปลี่ยนหน้าเริ่มต้น @@ -1362,6 +1454,7 @@ User id ของคุณเหมือนกับรหัสผ่าน แพล่งของ ค้นหา ช็อปปิ้ง + Shorts กีฬา สมัครสมาชิก กำลังมาแรง @@ -1427,9 +1520,11 @@ User id ของคุณเหมือนกับรหัสผ่าน ซ่อนปุ่มโอเวอร์เลย์ ปุ่มโอเวอร์เลย์ถูกซ่อน ปุ่มโอเวอร์เลย์ถูกแสดง + ซ่อนปุ่มขยายและปุ่มปิด "ปุ่มถูกซ่อน ปัดเพื่อขยายหรือปิด" + ปุ่มขยายและปุ่มปิดแสดงอยู่ ซ่อนข้อความย่อย ข้อความย่อยถูกซ่อน ข้อความย่อยแสดงอยู่ @@ -1448,8 +1543,9 @@ User id ของคุณเหมือนกับรหัสผ่าน หน้าจอโหลดจะมีพื้นหลังแบบไล่ระดับสี หน้าจอโหลดจะมีพื้นหลังแบบทึบ รูปแบบหน้าจอ Splash - สี - ขาวดำ + ปิดการใช้งานอยู่ + สี + ขาวดำ เปิดใช้งานสีแถบเลื่อนแบบกำหนดเอง แสดงสีแถบเลื่อนแบบกำหนดเอง แสดงสีแถบเลื่อนดั้งเดิม @@ -1459,11 +1555,17 @@ User id ของคุณเหมือนกับรหัสผ่าน สีเน้นของ seekbar ค่าสีแถบเลื่อนไม่ถูกต้อง - + + YouTube ReVanced + YT ReVanced + YT + โลโก้ส่วนหัว ค่าเริ่มต้น ปกติ + Premium + ReVanced ReVanced แบบย่อ กำหนดเอง @@ -1488,6 +1590,7 @@ User id ของคุณเหมือนกับรหัสผ่าน DeArrow & รูปขนาดย่อดั้งเดิม DeArrow & ภาพนิ่ง ภาพนิ่ง + DeArrow "DeArrow ให้ภาพขนาดย่อที่รวบรวมจากฝูงชนสําหรับวิดีโอ YouTube ภาพขนาดย่อเหล่านี้มักจะเกี่ยวข้องมากกว่าภาพขนาดย่อที่ให้โดย YouTube ถ้าเปิดใช้งาน URL ของวิดีโอจะถูกส่งไปยังเซิร์ฟเวอร์ API และไม่มีข้อมูลอื่นๆ ถูกส่งไป หากวิดีโอไม่มีภาพขนาดย่อ DeArrow ภาพขนาดย่อดั้งเดิมหรือภาพนิ่งจะถูกแสดง @@ -1531,7 +1634,11 @@ User id ของคุณเหมือนกับรหัสผ่าน เปิดใช้งานการเล่นวิดีโอซ้ำแล้ว ปิดใช้งานการเล่นวิดีโอซ้ำแล้ว - + + หยุดเล่นเมื่อมีเสียงแทรก + จะหยุดเล่นชั่วคราวเมื่อมีเสียงอื่นเล่น (เช่น เสียงนำทาง) + ระดับเสียงจะลดลงเมื่อมีเสียงอื่นเล่นอยู่ + ปลอมแปลงมิติของอุปกรณ์ "มิติของอุปกรณ์ถูกปลอมแปลง @@ -1554,6 +1661,9 @@ User id ของคุณเหมือนกับรหัสผ่าน ปิดใช้งานแฮปติกยกเลิกการค้นหา ปิดใช้งานแฮปติกยกเลิกการค้นหา เปิดใช้งานแฮปติกยกเลิกการค้นหา + ปิดใช้งานการสั่นตอบรับเมื่อแตะค้างไว้ + ปิดใช้งานการสั่นตอบรับเมื่อแตะค้างไว้แล้ว + เปิดใช้งานการสั่นตอบรับเมื่อแตะค้างไว้แล้ว ปิดใช้งานแฮปติกซูม ปิดใช้งานแฮปติกซูม เปิดใช้งานแฮปติกซูม @@ -1588,6 +1698,7 @@ User id ของคุณเหมือนกับรหัสผ่าน คุณภาพ Shorts เริ่มต้นบนเครือข่าย Wi-Fi คุณภาพ Shorts เริ่มต้นบนเครือข่ายมือถือ มือถือ + Wi-Fi เปลี่ยนคุณภาพ %1$s เริ่มต้นเป็น: %2$s เปลี่ยนคุณภาพ Shorts %1$s เป็น: %2$s @@ -1648,6 +1759,11 @@ User id ของคุณเหมือนกับรหัสผ่าน เมนูคุณภาพวิดีโอขั้นสูงปรากฏขึ้น เมนูคุณภาพวิดีโอขั้นสูงไม่ปรากฏ + + ซ่อนตัวเลือกคุณภาพระดับ Premium + ตัวเลือกคุณภาพระดับ Premium ถูกซ่อน + ตัวเลือกคุณภาพระดับ Premium แสดงอยู่ + เปิดใช้งานเลื่อนเพื่อค้นหา เลื่อนเพื่อค้นหาเปิดใช้งาน @@ -1677,8 +1793,13 @@ User id ของคุณเหมือนกับรหัสผ่าน - + + YT Music ReVanced + Music ReVanced + Music + + เกี่ยวกับ โฆษณา ทั่วไป diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index fe7d6e91eb..3d3cee9fca 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -18,237 +18,255 @@ Second \"item\" text" --> - - - Uygulama adı - - Özel - Uygulama simgesi - Orijinal - ReVanced - - ReVanced minimal - ReVanced ölçeklendirilmiş - - Özel - - - Denetimler başarısız - Resmî web sitesini aç - Yok say - <h5>Bu uygulama sizin tarafınızdan yamalanmış gibi görünmüyor.</h5><br>Bu uygulama düzgün çalışmayabilir, <b>kullanması zararlı veya tehlikeli bile olabilir</b>.<br><br>Şu kontroller, bu uygulamanın hali hazırda yamalanmış olduğunu veya başka birinden edinildiğini gösteriyor:<br><br><small>%1$s</small><br>Doğrulanmış ve güvenli bir uygulama kullandığınızdan emin olmak için, <b>bu uygulamayı kaldırmanız ve kendiniz yamalamanız</b> şiddetle tavsiye edilir.<p><br>Bu uyarı yok sayıldığında sadece iki kez gösterilecektir. - Farklı bir cihazda yamalanmış - ReVanced Manager tarafından yüklenmemiş - 10 dakikadan daha uzun bir süre önce yamalanmış - %s gün önce yamalanmış - APK derleme tarihi bozuk - - - ReVanced Bildirimi - İzleme geçmişiniz kaydedilmiyor.<br><br>Bu büyük ihtimalle bir reklam engelleyici DNS\'den veya proxy\'den kaynaklanıyor.<br><br>Bunu düzeltmek için, <b>s.youtube.com</b> adresini beyaz listeye ekleyin veya bütün engelleyici DNS\'leri ve proxy\'leri kapatın. - Bir daha gösterme - - - Ayarlar - ReVanced - Devam etmek istediğinizden emin misiniz? - Kaydet - Sıfırla - Rengi sıfırla - Geçersiz renk - Yeniden başlatma gerekli - Bu değişikliğin etkili olması için uygulamayı yeniden başlatın. - Yeniden başlat - İçe aktar - Kopyala - ReVanced ayarları varsayılanlara sıfırlandı - %d ayar içe aktarıldı - İçe aktarılamadı: %s - Ayarları ara - \'%s\' için sonuç bulunamadı - Başka bir anahtar kelime deneyin - Son aramalar - Arama geçmişinden kaldırılsın mı? - Arama geçmişini temizle - Tüm arama geçmişini temizlemek istediğinizden emin misiniz? - Arama İpuçları - "• Bir yola gitmek için ona dokunun + + + Uygulama adı + + Özel + Uygulama simgesi + Orijinal + ReVanced + + ReVanced minimal + ReVanced ölçeklendirilmiş + + Özel + + + Denetimler başarısız + Resmî web sitesini aç + Yok say + <h5>Bu uygulama sizin tarafınızdan yamalanmış gibi görünmüyor.</h5><br>Bu uygulama düzgün çalışmayabilir, <b>kullanması zararlı veya tehlikeli bile olabilir</b>.<br><br>Şu kontroller, bu uygulamanın hali hazırda yamalanmış olduğunu veya başka birinden edinildiğini gösteriyor:<br><br><small>%1$s</small><br>Doğrulanmış ve güvenli bir uygulama kullandığınızdan emin olmak için, <b>bu uygulamayı kaldırmanız ve kendiniz yamalamanız</b> şiddetle tavsiye edilir.<p><br>Bu uyarı yok sayıldığında sadece iki kez gösterilecektir. + Farklı bir cihazda yamalanmış + ReVanced Manager tarafından yüklenmemiş + 10 dakikadan daha uzun bir süre önce yamalanmış + %s gün önce yamalanmış + APK derleme tarihi bozuk + + + ReVanced Bildirimi + İzleme geçmişiniz kaydedilmiyor.<br><br>Bu büyük ihtimalle bir reklam engelleyici DNS\'den veya proxy\'den kaynaklanıyor.<br><br>Bunu düzeltmek için, <b>s.youtube.com</b> adresini beyaz listeye ekleyin veya bütün engelleyici DNS\'leri ve proxy\'leri kapatın. + Bir daha gösterme + + + Ayarlar + ReVanced + Devam etmek istediğinizden emin misiniz? + Kaydet + Sıfırla + Rengi sıfırla + Geçersiz renk + Yeniden başlatma gerekli + Bu değişikliğin etkili olması için uygulamayı yeniden başlatın. + Yeniden başlat + İçe aktar + Kopyala + ReVanced ayarları varsayılanlara sıfırlandı + %d ayar içe aktarıldı + İçe aktarılamadı: %s + Ayarları ara + \'%s\' için sonuç bulunamadı + Başka bir anahtar kelime deneyin + Son aramalar + Arama geçmişinden kaldırılsın mı? + Arama geçmişini temizle + Tüm arama geçmişini temizlemek istediğinizden emin misiniz? + Arama İpuçları + "• Bir yola gitmek için ona dokunun • Bir ayara gitmek için üzerine uzun basın • Bir arama sorgusunu geçmişe kaydetmek için Enter'a basın • Arama, büyük/küçük harf ve noktalama işaretlerini dikkate almaz • Ana ayarlar, devre dışı bırakılmış alt ayarların üzerinde görünür" - Arama geçmişi boş - Arama geçmişini kaydetmek için bir arama sorgusu yazın ve Enter\'a basın - Ayarlar arama geçmişini göster - Ayarlar arama geçmişi gösteriliyor - Ayarlar arama geçmişi gösterilmiyor - ReVanced ayar simgelerini göster - Ayar simgeleri gösteriliyor - Ayar simgeleri gösterilmiyor - ReVanced dili - "Bazı diller için çeviriler eksik veya tamamlanmamış olabilir. + Arama geçmişi boş + Arama geçmişini kaydetmek için bir arama sorgusu yazın ve Enter\'a basın + Ayarlar arama geçmişini göster + Ayarlar arama geçmişi gösteriliyor + Ayarlar arama geçmişi gösterilmiyor + Kalın simgeleri devre dışı bırak + Simgeler kalın değil + Simgeler kalın + ReVanced ayar simgelerini göster + Ayar simgeleri gösteriliyor + Ayar simgeleri gösterilmiyor + ReVanced dili + "Bazı diller için çeviriler eksik veya tamamlanmamış olabilir. Yeni dilleri çevirmek veya mevcut çevirileri geliştirmek için translate.revanced.app adresini ziyaret edin" - Uygulama dili - İçe / Dışa aktar - ReVanced ayarlarını içe / dışa aktar - - ReVanced Patches <i>%s</i> sürümünü kullanıyorsunuz - Not - Bu sürüm bir ön sürümdür ve beklenmeyen sorunlar yaşayabilirsiniz - Resmî bağlantılar - + ReVanced Patches <i>%s</i> sürümünü kullanıyorsunuz + Not + Bu sürüm bir ön sürümdür ve beklenmeyen sorunlar yaşayabilirsiniz + Resmî bağlantılar + - - - GmsCore Ayarları - GmsCore için ayarlar - - MicroG GmsCore yüklü değil. Yükleyin. - Eylem gerekli - "MicroG GmsCore'nin arka planda çalışma izni yok. + + + GmsCore + GmsCore ile ilgili ayarlar + GmsCore güncellemelerini denetle + Güncellemeleri denetleme etkin + Güncelleme denetleme devre dışı + GmsCore Ayarlarını Aç + GmsCore ayarları + + MicroG GmsCore yüklü değil. Yükleyin. + İşlem gerekli + MicroG GmsCore güncellemeleri denetlenemedi + MicroG GmsCore\'nin yeni bir sürümü (%1$s) mevcut. Şu anda %2$s sürümünü kullanıyorsunuz. + "MicroG GmsCore'nin arka planda çalışma izni yok. Telefonunuz için \"Don't kill my app\" rehberini takip edin ve talimatları MicroG kurulumunuza uygulayın. Bu, uygulamanın çalışması için gereklidir." - Websitesini aç - "Sorunları önlemek için MicroG GmsCore pil optimizasyonları devre dışı bırakılmalıdır. + Web sitesini aç + İptal + "Sorunları önlemek için MicroG GmsCore pil optimizasyonları devre dışı bırakılmalıdır. MicroG için pil optimizasyonlarını devre dışı bırakmak, pil kullanımını olumsuz etkilemeyecektir. Devam düğmesine dokunun ve optimizasyon değişikliklerine izin verin." - Devam et - - - Video akışlarını taklit et - Oynatma sorunlarını önlemek için istemci video akışlarını taklit et - Video akışlarını taklit et - Oynatma sorunlarını önlemek için istemci video akışlarını taklit et - Video akışlarını taklit et - "Video akışları taklit edilir + Devam et + + + Video akışlarını taklit et + Oynatma sorunlarını önlemek için istemci video akışlarını taklit et + Video akışlarını taklit et + Oynatma sorunlarını önlemek için istemci video akışlarını taklit et + Video akışlarını taklit et + "Video akışları taklit edilir YouTube Premium kullanıcısıysanız, bu ayar gerekli olmayabilir" - "Video akışları taklit edilmez + "Video akışları taklit edilmez Oynatma çalışmayabilir" - Bu ayarı devre dışı bırakmak oynatma sorunlarına yol açabilir. - Varsayılan istemci - - - Orijinal ses dilini zorla - Orijinal ses dili kullanılıyor - Varsayılan ses kullanılıyor - - Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin - - - Hata ayıklama - Hata ayıklama seçeneklerini etkinleştir veya devre dışı bırak - Hata ayıklama kayıtları - Hata ayıklama kayıtları etkin - Hata ayıklama kayıtları devre dışı - Stack traces\'in kaydını tut - Hata ayıklama kayıtları stack traces\'i içerir - Hata ayıklama kayıtları stack traces\'i içermez - ReVanced hatası durumunda uyarı göster - Hata oluşursa uyarı gösterilir - Hata oluşursa uyarı gösterilmez - "Hata bildirimlerini kapatmak, tüm ReVanced hata bildirimlerini gizler. + Bu ayarı devre dışı bırakmak oynatma sorunlarına yol açabilir. + Varsayılan istemci + + + Orijinal ses dilini zorla + Orijinal ses dili kullanılıyor + Varsayılan ses kullanılıyor + + Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin + + + Hata ayıklama + Hata ayıklama seçeneklerini etkinleştir veya devre dışı bırak + Hata ayıklama kayıtları + Hata ayıklama kayıtları etkin + Hata ayıklama kayıtları devre dışı + Stack traces\'in kaydını tut + Hata ayıklama kayıtları stack traces\'i içerir + Hata ayıklama kayıtları stack traces\'i içermez + ReVanced hatası durumunda uyarı göster + Hata oluşursa uyarı gösterilir + Hata oluşursa uyarı gösterilmez + "Hata bildirimlerini kapatmak, tüm ReVanced hata bildirimlerini gizler. Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz." - Hata ayıklama kayıtlarını dışa aktar - ReVanced hata ayıklama kayıtlarını panoya kopyalar - Hata ayıklama kayıtları devre dışı - Kayıt bulunamadı - Kayıtlar kopyalandı - Kayıtlar dışa aktarılamadı: %s - Hata ayıklama kayıtlarını temizle - Kaydedilmiş tüm ReVanced hata ayıklama kayıtlarını temizler - Kayıtlar temizlendi - Özellik işaretçileri yöneticisi - Boolean özellik işaretçilerini yönet - Aktif işaretçiler (%d) - Engellenen işaretçiler (%d) - İşaretçileri ara... - İşaretçiler kaydedildi - İşaretçiler sıfırlandı - İşaretçiler panoya kopyalandı - Protocol buffer\'ın kaydını tut - Hata ayıklama kayıtları proto buffer\'ı içerir - Hata ayıklama kayıtları proto buffer\'ı içermez - "Bu ayarın etkinleştirilmesi, bazı kullanıcı arayüzü bileşenleri için ek düzen verilerini, ekran üzerindeki metin dahil olmak üzere günlüğe kaydeder. + Hata ayıklama kayıtlarını dışa aktar + ReVanced hata ayıklama kayıtlarını panoya kopyalar + Hata ayıklama kayıtları devre dışı + Kayıt bulunamadı + Kayıtlar kopyalandı + Kayıtlar dışa aktarılamadı: %s + Hata ayıklama kayıtlarını temizle + Kaydedilmiş tüm ReVanced hata ayıklama kayıtlarını temizler + Kayıtlar temizlendi + Özellik işaretçileri yöneticisi + Boolean özellik işaretçilerini yönet + Aktif işaretçiler (%d) + Engellenen işaretçiler (%d) + İşaretçileri ara... + İşaretçiler kaydedildi + İşaretçiler sıfırlandı + İşaretçiler panoya kopyalandı + Bu özelliği kullanmak için uygulamayı yeniden başlatın + Protocol buffer\'in kaydını tut + Hata ayıklama kayıtları proto buffer\'i içerir + Hata ayıklama kayıtları proto buffer\'i içermez + "Bu ayarın etkinleştirilmesi, bazı kullanıcı arayüzü bileşenleri için ek düzen verilerini, ekran üzerindeki metin dahil olmak üzere günlüğe kaydeder. Bu, özel filtreler oluştururken bileşenlerin belirlenmesine yardımcı olabilir. Ancak, bunun etkinleştirilmesi IP adresiniz gibi bazı kullanıcı verilerini de günlüğe kaydeder." - - - Paylaşım bağlantılarını temizle - Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılır - Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılmaz - Paylaşım bağlantılarını youtube.com olarak değiştir - Paylaşılan bağlantılar youtube.com kullanır - Paylaşılan bağlantılar music.youtube.com kullanır - - - Özel filtre - Özel filtreler kullanarak bileşenleri gizle - Özel filtreyi etkinleştir - Özel filtre etkin - Özel filtre devre dışı - Özel filtre - - Filtrelenecek bileşen yolu oluşturucu dizelerinin yeni satırla ayrılmış şekilde listesi - Geçersiz özel filtre: %s - - - - - Hakkında - Reklamlar - Alternatif kapak resimleri - Akış - Genel - Oynatıcı - Shorts - Zaman çubuğu - Kaydırma denetimleri - Return YouTube Dislike - Çeşitli - Video - Eski ayarlar menülerini geri getir - Eski ayarlar menüleri gösteriliyor - Eski ayarlar menüleri gösterilmiyor - - - Shorts\'un arka planda oynatılmasını devre dışı bırak - Shorts\'un arka planda oynatılması devre dışı - Shorts\'un arka planda oynatılması etkin - - - Albüm kartlarını gizle - Albüm kartları gizli - Albüm kartları görünür - Sanatçı kartlarını gizle - Sanatçı kartları gizli - Sanatçı kartları görünür - Çip rafını gizle - Çip rafı gizli - Çip rafı görünür - Topluluk gönderilerini gizle - Topluluk gönderileri gizli - Topluluk gönderileri görünür - Kompakt afişleri gizle - Kompakt afişler gizli - Kompakt afişler görünür - Genişletilebilir kartı gizle - Videoların altındaki genişletilebilir kart gizli - Videoların altındaki genişletilebilir kart görünür - Alttaki mikrofon düğmesini gizle - Aramada alttaki mikrofon düğmesi gizli - Aramada alttaki mikrofon düğmesi görünür - Yatay rafları gizle - "Şunlar gibi yatay raflar gizlenir: + + + Paylaşım bağlantılarını temizle + Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılır + Paylaşılan bağlantılardan izleyici sorgu parametresi kaldırılmaz + Paylaşım bağlantılarını youtube.com olarak değiştir + Paylaşılan bağlantılar youtube.com kullanır + Paylaşılan bağlantılar music.youtube.com kullanır + + + Özel filtre + Özel filtreler kullanarak bileşenleri gizle + Özel filtreyi etkinleştir + Özel filtre etkin + Özel filtre devre dışı + Özel filtre + + Filtrelenecek bileşen yolu oluşturucu dizelerinin yeni satırla ayrılmış şekilde listesi + Geçersiz özel filtre: %s + + + + + Hakkında + Reklamlar + Alternatif kapak resimleri + Akış + Genel + Oynatıcı + Shorts + Zaman çubuğu + Kaydırma denetimleri + Return YouTube Dislike + Çeşitli + Video + Eski ayarlar menülerini geri getir + Eski ayarlar menüleri gösteriliyor + Eski ayarlar menüleri gösterilmiyor + + + Shorts\'un arka planda oynatılmasını devre dışı bırak + Shorts\'un arka planda oynatılması devre dışı + Shorts\'un arka planda oynatılması etkin + + + İçerik üreticisi mağazası rafını gizle + Video oynatıcısının altındaki içerik üreticisi mağazası rafı gizli + Video oynatıcısının altındaki içerik üreticisi mağazası rafı görünür + Albüm kartlarını gizle + Albüm kartları gizli + Albüm kartları görünür + Sanatçı kartlarını gizle + Sanatçı kartları gizli + Sanatçı kartları görünür + Çip rafını gizle + Çip rafı gizli + Çip rafı görünür + Ana Sayfa akışındaki videoların altındaki yorumlar kısmını gizle + Ana Sayfa akışındaki videoların altındaki yorumlar kısmı gizli + Ana Sayfa akışındaki videoların altındaki yorumlar kısmı görünür + Topluluk gönderilerini gizle + Topluluk gönderileri gizli + Topluluk gönderileri görünür + Kompakt afişleri gizle + Kompakt afişler gizli + Kompakt afişler görünür + Genişletilebilir kartı gizle + Videoların altındaki genişletilebilir kart gizli + Videoların altındaki genişletilebilir kart görünür + Alttaki mikrofon düğmesini gizle + Aramada alttaki mikrofon düğmesi gizli + Aramada alttaki mikrofon düğmesi görünür + Yatay rafları gizle + "Şunlar gibi yatay raflar gizlenir: • Son dakika haberleri • İzlemeye devam et @@ -256,1034 +274,1101 @@ Ancak, bunun etkinleştirilmesi IP adresiniz gibi bazı kullanıcı verilerini d • En alakalı • Alışveriş • Tekrar izle" - Yatay raflar görünür - Resim rafını gizle - Arama sonuçlarındaki resim rafı gizli - Arama sonuçlarındaki resim rafı görünür - Son gönderileri gizle - Son gönderiler gizli - Son gönderiler görünür - Mix oynatma listelerini gizle - Mix oynatma listeleri gizli - Mix oynatma listeleri görünür - Filmler kısmını gizle - Filmler kısmı gizli - Filmler kısmı görünür - - \'Hatırlatma oluştur\' düğmesini gizle - Hatırlatma oluştur düğmesi gizli - Hatırlatma oluştur düğmesi görünür - Hazır Oyunlar\'ı gizle - Hazır Oyunlar gizli - Hazır Oyunlar görünür - + \'En yeni videolar\' düğmesini gizle + En yeni videolar düğmesi gizli + En yeni videolar düğmesi görünür + Mix oynatma listelerini gizle + Mix oynatma listeleri gizli + Mix oynatma listeleri görünür + Filmler kısmını gizle + Filmler kısmı gizli + Filmler kısmı görünür + + \'Hatırlatma oluştur\' düğmesini gizle + Hatırlatma oluştur düğmesi gizli + Hatırlatma oluştur düğmesi görünür + Hazır Oyunlar\'ı gizle + Hazır Oyunlar gizli + Hazır Oyunlar görünür + - \'Daha fazla göster\' düğmesini gizle - Arama sonuçlarındaki daha fazla göster düğmesi gizli - Arama sonuçlarındaki daha fazla göster düğmesi görünür - Anketleri gizle - Anketler gizli - Anketler görünür - Bilet rafını gizle - Bilet rafı gizli - Bilet rafı görünür - - Video öneri etiketlerini gizle - Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri gizli - Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri görünür - Görsel ayırıcıyı gizle - Görsel ayırıcı gizli - Görsel ayırıcı görünür - - YouTube Doodle\'larını gizle - Logodaki YouTube Doodles animasyonu gizli - Logodaki YouTube Doodles animasyonu görünür - "YouTube Doodles, her yıl birkaç gün gösterilir. - -Bir Doodle şu anda bölgenizde gösteriliyorsa ve bu gizleme ayarı açıksa, arama çubuğunun altındaki filtre çubuğu da gizlenecektir." - Kanal çubuğunu gizle - Kanal çubuğu gizli - Kanal çubuğu görünür - Kanal filigranını gizle - Filigran gizli - Filigran görünür - Bağış etkinliği kutularını gizle - Bağış etkinliği kutuları gizli - Bağış etkinliği kutuları görünür - Acil durum kutularını gizle - Acil durum kutuları gizli - Acil durum kutuları görünür - Bilgi panellerini gizle - Bilgi panelleri gizli - Bilgi panelleri görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Tıbbi bilgi panellerini gizle - Tıbbi bilgi panelleri gizli - Tıbbi bilgi panelleri görünür - Hızlı eylemleri gizle - Tam ekrandaki hızlı eylemler gizli - Tam ekrandaki hızlı eylemler görünür - İlgili videoları gizle - Hızlı eylemlerdeki ilgili videolar gizli - Hızlı eylemlerdeki ilgili videolar görünür - Abone yönergelerini gizle - Abone topluluk kuralları gizli - Abone topluluk kuralları görünür - Süreli tepkileri gizle - Süreli tepkiler gizli - Süreli tepkiler görünür - \'Yapay zeka tarafından oluşturulan video özeti\'ni gizle - Yapay zeka tarafından oluşturulan video özet kısmı gizli - Yapay zeka tarafından oluşturulan video özet kısmı görünür - \'Sor\'u gizle - Sor kısmı gizli - Sor kısmı görünür - Nitelikleri gizle - Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları gizli - Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları görünür - Bölümleri gizle - Bölümler kısmı gizli - Bölümler kısmı görünür - \'Bu içerik nasıl yapıldı\'yı gizle - Bu içerik nasıl yapıldı kısmı gizli - Bu içerik nasıl yapıldı kısmı görünür - Hype puanlarını gizle - Hype puanları gizli - Hype puanları görünür - \"Podcast\'i keşfedin\"i gizle - Podcast\'i keşfedin kısmı gizli - Podcast\'i keşfedin kısmı görünür - Öne çıkan bağlantıları gizle - Öne çıkan bağlantılar kısmı gizli - Öne çıkan bağlantılar kısmı görünür - Öne çıkan videoları gizle - Öne çıkan videolar kısmı gizli - Öne çıkan videolar kısmı görünür - Bilgi kartlarını gizle - Bilgi kartları kısmı gizli - Bilgi kartları kısmı görünür - \'Anahtar kavramlar\'ı gizle - Anahtar kavramlar kısmı gizli - Anahtar kavramlar kısmı görünür - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Transkripti gizle - Transkript kısmı gizli - Transkript kısmı görünür - Video açıklaması - Video açıklamasındaki bileşenleri gizle veya göster - Filtreleme çubuğu - Akışlarda, ilgili videolarda, arama sonuçlarında ve izleme geçmişinde filtre çubuğunu gizle veya göster - Akışlarda gizle - Akışlarda gizli - Akışlarda görünür - Alâkalı videolarda gizle - Alâkalı videolarda gizli - Alâkalı videolarda görünür - Arama sonuçlarında gizle - Arama sonuçlarında gizli - Arama sonuçlarında görünür - İzleme geçmişinde gizle - İzleme geçmişinde gizli - İzleme geçmişinde görünür - Kanal sayfası - Kanal sayfası bileşenlerini gizle veya göster - - Topluluk düğmesini gizle - Topluluk düğmesi gizli - Topluluk düğmesi görünür - - \'Sizin İçin\' rafını gizle - Sizin İçin rafı gizli - Sizin İçin rafı görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Bağlantı ön izlemesini gizle - Bağlantı ön izlemesi gizli - Bağlantı ön izlemesi görünür - Üyeler rafını gizle - Üyeler rafı gizli - Üyeler rafı görünür - - Mağaza düğmesini gizle - Mağaza düğmesi gizli - Mağaza düğmesi görünür - - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Yorumlar - Yorumlar kısmı bileşenlerini gizle veya göster - Yapay zeka sohbet özetini gizle - Yapay zeka sohbet özeti gizli - Yapay zeka sohbet özeti görünür - Yapay zeka yorumların özetini gizle - Yapay zeka yorumların özeti gizli - Yapay zeka yorumların özeti görünür - Kanal yönergelerini gizle - Kanal yönergeleri gizli - Kanal yönergeleri görünür - \'Üyelerin yorumları\' başlığını gizle - Üyelerin yorumları başlığı gizli - Üyelerin yorumları başlığı görünür - Yorumlar kısmını gizle - Yorumlar kısmı gizli - Yorumlar kısmı görünür - Topluluk kurallarını gizle - Topluluk kuralları gizli - Topluluk kuralları görünür - \'Short oluştur\' düğmesini gizle - Short oluştur düğmesi gizli - Short oluştur düğmesi görünür - Emoji ve Zaman damgası düğmelerini gizle - Emoji ve Zaman damgası düğmeleri gizli - Emoji ve Zaman damgası düğmeleri görünür - Ön izlenen yorumu gizle - Ön izlenen yorum gizli - Ön izlenen yorum görünür - Teşekkürler düğmesini gizle - Teşekkürler düğmesi gizli - Teşekkürler düğmesi görünür - İzlenme sayısını gizle - İzlenme sayısı akışta ve arama sonuçlarında gizli - İzlenme sayısı akışta ve arama sonuçlarında görünür - - "Sınırlamalar: -• Shorts rafları, kanal sayfaları ve arama sonuçları yine de izlenme sayılarını gösterebilir -• Bu özellik otomotiv form faktörüyle çalışmaz" - Yüklenme zamanını gizle - Yüklenme zamanı akışta ve arama sonuçlarında gizli - Yüklenme zamanı akışta ve arama sonuçlarında görünür - - "Sınırlamalar: -• Shorts rafları, kanal sayfaları ve arama sonuçları yine de yüklenme zamanlarını gösterebilir -• Bu özellik otomotiv form faktörü ile çalışmaz" - Anahtar kelimeyle içerik gizle - Anahtar kelime filtreleriyle arama sonuçlarındaki ve akıştaki videoları gizle - Ana sayfadaki videoları anahtar kelimelerle gizle - Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenir - Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenmez - Arama sonuçlarını anahtar kelimelerle gizle - Arama sonuçları anahtar kelimelerle filtrelenir - Arama sonuçları anahtar kelimelerle filtrelenmez - Aboneliklerdeki videoları anahtar kelimelerle gizle - Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenir - Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenmez - Gizlenecek anahtar kelimeler - + Video öneri etiketlerini gizle + Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri gizli + Arama sonuçlarındaki \'İnsanların izlediği diğer videolar\' ve \'Şunlar da hoşunuza gidebilir\' etiketleri görünür + Görsel ayırıcıyı gizle + Görsel ayırıcı gizli + Görsel ayırıcı görünür + Web arama sonuçlarını gizle + Web arama sonuçları gizli + Web arama sonuçları görünür + \'Beğenebilecekleriniz\' kısmını gizle + \'Beğenebilecekleriniz\' kısmı gizli + \'Beğenebilecekleriniz\' kısmı görünür + + YouTube Doodle\'larını gizle + Logodaki YouTube Doodles animasyonu gizli + Logodaki YouTube Doodles animasyonu görünür + Kanal çubuğunu gizle + Kanal çubuğu gizli + Kanal çubuğu görünür + Kanal filigranını gizle + Filigran gizli + Filigran görünür + Bağış etkinliği kutularını gizle + Bağış etkinliği kutuları gizli + Bağış etkinliği kutuları görünür + Acil durum kutularını gizle + Acil durum kutuları gizli + Acil durum kutuları görünür + Bilgi panellerini gizle + Bilgi panelleri gizli + Bilgi panelleri görünür + + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + + \'Canlı sohbet tekrarı\' düğmesini gizle + Oynatıcı katmanındaki canlı sohbet tekrarı düğmesi gizli + Oynatıcı katmanındaki canlı sohbet tekrarı düğmesi görünür + Tıbbi bilgi panellerini gizle + Tıbbi bilgi panelleri gizli + Tıbbi bilgi panelleri görünür + Hızlı eylemleri gizle + Tam ekrandaki hızlı eylemler gizli + Tam ekrandaki hızlı eylemler görünür + İlgili videoları gizle + Hızlı eylemlerdeki ilgili videolar gizli + Hızlı eylemlerdeki ilgili videolar görünür + Abone yönergelerini gizle + Abone topluluk kuralları gizli + Abone topluluk kuralları görünür + Süreli tepkileri gizle + Süreli tepkiler gizli + Süreli tepkiler görünür + Video başlığını gizle + Oynatıcı katmanındaki video başlığı gizli + Oynatıcı katmanındaki video başlığı görünür + \'Yapay zeka tarafından oluşturulan video özeti\'ni gizle + Yapay zeka tarafından oluşturulan video özet kısmı gizli + Yapay zeka tarafından oluşturulan video özet kısmı görünür + \'Sor\'u gizle + Sor kısmı gizli + Sor kısmı görünür + Nitelikleri gizle + Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları gizli + Öne çıkan yerler, Oyunlar, Müzik ve Bahsedilen kişiler kısımları görünür + Bölümleri gizle + Bölümler kısmı gizli + Bölümler kısmı görünür + \'Ders ilerlemesi\'ni gizle + Ders ilerlemesi kısmı gizli + Ders ilerlemesi kısmı görünür + Keşfet\'i gizle + Bu dersi keşfet ve Podcast\'i keşfedin kısımları gizli + Bu dersi keşfet ve Podcast\'i keşfedin kısımları görünür + \'Bu dersi keşfet\'i gizle + Bu dersi keşfet kısmı gizli + Bu dersi keşfet kısmı görünür + \"Podcast\'i keşfedin\"i gizle + Podcast\'i keşfedin kısmı gizli + Podcast\'i keşfedin kısmı görünür + \"Podcast\'i keşfedin\"i gizle + Podcast\'i keşfedin kısmı gizli + Podcast\'i keşfedin kısmı görünür + Öne çıkan bağlantıları gizle + Öne çıkan bağlantılar kısmı gizli + Öne çıkan bağlantılar kısmı görünür + \'Öne çıkan yerler\'i gizle + Öne çıkan yerler kısmı gizli + Öne çıkan yerler kısmı görünür + Öne çıkan videoları gizle + Öne çıkan videolar kısmı gizli + Öne çıkan videolar kısmı görünür + Akış açılır menü filtresini etkinleştir + Akış açılır menü filtresi etkin + Akış açılır menü filtresi devre dışı + Akış açılır menü filtresi + Filtrelemek için açılır menü adlarını, her satıra bir tane olacak şekilde girin + \'Oyun\'u gizle + Oyun kısmı gizli + Oyun kısmı görünür + \'Bu içerik nasıl yapıldı\'yı gizle + Bu içerik nasıl yapıldı kısmı gizli + Bu içerik nasıl yapıldı kısmı görünür + Hype puanlarını gizle + Hype puanları gizli + Hype puanları görünür + Bilgi kartlarını gizle + Bilgi kartları kısmı gizli + Bilgi kartları kısmı görünür + \'Anahtar kavramlar\'ı gizle + Anahtar kavramlar kısmı gizli + Anahtar kavramlar kısmı görünür + \'Müzik\'i gizle + Müzik kısmı gizli + Müzik kısmı görünür + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Transkripti gizle + Transkript kısmı gizli + Transkript kısmı görünür + Quizleri gizle + Quizler kısmı gizli + Quizler kısmı görünür + Video açıklaması + Video açıklamasındaki bileşenleri gizle veya göster + Filtreleme çubuğu + Akışlarda, ilgili videolarda, arama sonuçlarında ve izleme geçmişinde filtre çubuğunu gizle veya göster + Akışlarda gizle + Akışlarda gizli + Akışlarda görünür + Alâkalı videolarda gizle + Alâkalı videolarda gizli + Alâkalı videolarda görünür + Arama sonuçlarında gizle + Arama sonuçlarında gizli + Arama sonuçlarında görünür + İzleme geçmişinde gizle + İzleme geçmişinde gizli + İzleme geçmişinde görünür + Kanal sayfası + Kanal sayfası bileşenlerini gizle veya göster + Kanal sekmesi filtresini etkinleştir + Kanal sekmesi filtresi etkin + Kanal sekmesi filtresi devre dışı + Kanal sekmesi filtresi + Filtrelemek için kanal sekmesi adlarını, her satıra bir tane olacak şekilde girin + + Topluluk düğmesini gizle + Topluluk düğmesi gizli + Topluluk düğmesi görünür + + \'Sizin İçin\' rafını gizle + Sizin İçin rafı gizli + Sizin İçin rafı görünür + + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + Bağlantı ön izlemesini gizle + Bağlantı ön izlemesi gizli + Bağlantı ön izlemesi görünür + Üyeler rafını gizle + Üyeler rafı gizli + Üyeler rafı görünür + + Mağaza düğmesini gizle + Mağaza düğmesi gizli + Mağaza düğmesi görünür + + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Yorumlar + Yorumlar kısmı bileşenlerini gizle veya göster + Yapay zeka sohbet özetini gizle + Yapay zeka sohbet özeti gizli + Yapay zeka sohbet özeti görünür + Yapay zeka yorumların özetini gizle + Yapay zeka yorumların özeti gizli + Yapay zeka yorumların özeti görünür + Kanal yönergelerini gizle + Kanal yönergeleri gizli + Kanal yönergeleri görünür + \'Üyelerin yorumları\' başlığını gizle + Üyelerin yorumları başlığı gizli + Üyelerin yorumları başlığı görünür + Yorumlar kısmını gizle + Yorumlar kısmı gizli + Yorumlar kısmı görünür + Topluluk kurallarını gizle + Topluluk kuralları gizli + Topluluk kuralları görünür + \'Short oluştur\' düğmesini gizle + Short oluştur düğmesi gizli + Short oluştur düğmesi görünür + Emoji ve Zaman damgası düğmelerini gizle + Emoji ve Zaman damgası düğmeleri gizli + Emoji ve Zaman damgası düğmeleri görünür + Ön izlenen yorumu gizle + Ön izlenen yorum gizli + Ön izlenen yorum görünür + Teşekkürler düğmesini gizle + Teşekkürler düğmesi gizli + Teşekkürler düğmesi görünür + İzlenme sayısını gizle + İzlenme sayısı akışta ve arama sonuçlarında gizli + İzlenme sayısı akışta ve arama sonuçlarında görünür + + "Kısıtlamalar: +• Shorts rafları, kanal sayfaları ve arama sonuçları yine de izlenme sayılarını gösterebilir. +• Bu özellik otomotiv form faktörü ile çalışmaz." + Yüklenme zamanını gizle + Yüklenme zamanı akışta ve arama sonuçlarında gizli + Yüklenme zamanı akışta ve arama sonuçlarında görünür + + "Kısıtlamalar: +• Shorts rafları, kanal sayfaları ve arama sonuçları yine de yüklenme zamanlarını gösterebilir. +• Bu özellik otomotiv form faktörü ile çalışmaz." + Anahtar kelimeyle içerik gizle + Anahtar kelime filtreleriyle arama sonuçlarındaki ve akıştaki videoları gizle + Ana sayfadaki videoları anahtar kelimelerle gizle + Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenir + Ana sayfa sekmesindeki videolar anahtar kelimelerle filtrelenmez + Arama sonuçlarını anahtar kelimelerle gizle + Arama sonuçları anahtar kelimelerle filtrelenir + Arama sonuçları anahtar kelimelerle filtrelenmez + Aboneliklerdeki videoları anahtar kelimelerle gizle + Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenir + Abonelikler sekmesindeki videolar anahtar kelimelerle filtrelenmez + Gizlenecek anahtar kelimeler + - "Yeni satırlarla ayrılmış gizlenecek anahtar kelimeler ve ifadeler + "Yeni satırlarla ayrılmış gizlenecek anahtar kelimeler ve ifadeler Anahtar kelimeler, kanal adları veya video başlıklarında gösterilen herhangi bir metin olabilir Ortadaki harfleri büyük olan kelimeler, büyük/küçük harf kullanımına göre girilmelidir (örneğin: iPhone, TikTok, LeBlanc)" - Anahtar kelimeyle filtreleme hakkında - "Ana Sayfa/Abonelikler/Arama sonuçları, anahtar kelime ifadeleriyle eşleşen içeriği gizlemek için filtrelenir + Anahtar kelimeyle filtreleme hakkında + "Ana Sayfa/Abonelikler/Arama sonuçları, anahtar kelime ifadeleriyle eşleşen içeriği gizlemek için filtrelenir -Sınırlamalar +Kısıtlamalar: • Shorts, kanal adı ile gizlenemez • Bazı kullanıcı arayüzü bileşenleri gizlenemeyebilir • Bir anahtar kelime aranması sonuç göstermeyebilir" - Tam kelimeleri eşleştir - - Bir anahtar kelimeyi veya ifadeyi tırnak işareti içine almak, video başlıkları ve kanal adlarının kısmi eşleşmelerini önleyecektir<br><br>Örneğin,<br><b>\"ağustos\"</b>, <b>Ağustos ayında kardan adam yapmak!</b> başlıklı videoyu gizleyecektir<br>ancak <b>Ağustosböcekleri hakkında bilgiler</b> başlıklı videoyu gizlemeyecektir - - Anahtar kelime kullanılamıyor: %s - Kullanmak için tırnak içine alın: %s - Anahtar kelimede çelişki var: %s - Kelime kısa, tırnak içine alın: %s - Kelime bütün videoları gizler: %s - - - İçerik üreticisi mağazası rafını gizle - Video oynatıcısının altındaki içerik üreticisi mağazası rafı gizli - Video oynatıcısının altındaki içerik üreticisi mağazası rafı görünür - Bitiş ekranındaki mağaza afişini gizle - Bitiş ekranı mağaza afişi gizli - Bitiş ekranı mağaza afişi görünür - Tam ekran reklamları gizle - "Tam ekran reklamlar gizli - -Bu özellik yalnızca eski cihazlarda kullanılabilir" - Tam ekran reklamlar görünür - - Tam ekran reklamlar sadece eski cihazlarda gizlenebilir - Genel reklamları gizle - Genel reklamlar gizli - Genel reklamlar görünür - Ürün afişlerini gizle - Ürün afişleri gizli - Ürün afişleri görünür - Ücretli tanıtım etiketini gizle - Ücretli tanıtım etiketi gizli - Ücretli tanıtım etiketi görünür - Kendine sponsor kartları gizle - Kendine sponsor kartlar gizli - Kendine sponsor kartlar görünür - Alışveriş bağlantılarını gizle - Video açıklamasındaki alışveriş bağlantıları gizli - Video açıklamasındaki alışveriş bağlantıları görünür - \'Ürünleri görüntüle\' afişini gizle - Video katmanındaki ürünleri görüntüle afişi gizli - Video katmanındaki ürünleri görüntüle afişi görünür - Web arama sonuçlarını gizle - Web arama sonuçları gizli - Web arama sonuçları görünür - - - YouTube Premium promosyonlarını gizle - Video oynatıcısı altındaki YouTube Premium promosyonları gizli - Video oynatıcısı altındaki YouTube Premium promosyonları görünür - - - Video reklamlarını gizle - Video reklamları gizli - Video reklamları görünür - - - URL panoya kopyalandı - Zaman damgalı URL kopyalandı - Video URL\'sini kopyalama düğmesini göster - Video URL\'sini kopyalama düğmesi gösterilir. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun - Video URL\'sini kopyalama düğmesi gösterilmez - Zaman damgalı URL\'yi kopyalama düğmesini göster - Zaman damgalı URL kopyalama düğmesi gösterilir. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun - Zaman damgalı URL kopyalama düğmesi gösterilmez - - - İzleyici takdiri iletişim kutusunu kaldır - İletişim kutusu kaldırılacak - İletişim kutusu gösterilecek - Bu, yaş kısıtlamasını atlamaz. Sadece otomatik olarak kabul eder. - - - TV\'de oturum açma penceresini devre dışı bırak - TV\'de oturum açma penceresi devre dışı - TV\'de oturum açma penceresi etkin - - - Çift dokunuşla bölüm atlamayı devre dışı bırak - Çift dokunuş asla bir sonraki/önceki bölüme atlamayı tetikleyemez - Çift dokunuş zaman zaman bir sonraki/önceki bölüme atlamayı tetikleyebilir - - - Harici indirmeler - Harici indirici kullanımı için ayarlar - Harici indirme düğmesini göster - Oynatıcıda indirme düğmesi gösterilir - Oynatıcıda indirme düğmesi gösterilmez - - İndirme eylem düğmesini kullan - İndirme düğmesi harici indiricinizi açar - İndirme düğmesi yerel uygulama içi indiriciyi açar - İndirici paket adı - Yüklü harici indirme uygulamanızın paket adı - Paket adını girin - Diğer - Uygulama yüklü değil - %s yüklü değil. Lütfen yükleyin. - "%s paket adıyla yüklü uygulama bulunamadı + Tam kelimeleri eşleştir + + Bir anahtar kelimeyi veya ifadeyi tırnak işareti içine almak, video başlıkları ve kanal adlarının kısmi eşleşmelerini önleyecektir<br><br>Örneğin,<br><b>\"ağustos\"</b>, <b>Ağustos ayında kardan adam yapmak!</b> başlıklı videoyu gizleyecektir<br>ancak <b>Ağustosböcekleri hakkında bilgiler</b> başlıklı videoyu gizlemeyecektir + + Anahtar kelime kullanılamıyor: %s + Kullanmak için tırnak içine alın: %s + Anahtar kelimede çelişki var: %s + Kelime kısa, tırnak içine alın: %s + Kelime bütün videoları gizler: %s + + + Bitiş ekranındaki mağaza afişini gizle + Bitiş ekranı mağaza afişi gizli + Bitiş ekranı mağaza afişi görünür + Tam ekran reklamları gizle + Tam ekran reklamlar gizli + Tam ekran reklamlar görünür + Genel reklamları gizle + Genel reklamlar gizli + Genel reklamlar görünür + Ürün afişlerini gizle + Ürün afişleri gizli + Ürün afişleri görünür + Ücretli tanıtım etiketini gizle + Ücretli tanıtım etiketi gizli + Ücretli tanıtım etiketi görünür + Oynatıcı açılır reklamlarını gizle + Oynatıcı açılır reklamları gizli + Oynatıcı açılır reklamları görünür + Kendine sponsor kartları gizle + Kendine sponsor kartlar gizli + Kendine sponsor kartlar görünür + Alışveriş bağlantılarını gizle + Video açıklamasındaki alışveriş bağlantıları gizli + Video açıklamasındaki alışveriş bağlantıları görünür + \'Ürünleri görüntüle\' afişini gizle + Oynatıcı katmanındaki ürünleri görüntüle afişi gizli + Oynatıcı katmanındaki ürünleri görüntüle afişi görünür + YouTube Premium promosyonlarını gizle + YouTube Premium promosyonları gizli + YouTube Premium promosyonları görünür + + + Video reklamlarını gizle + Video reklamları gizli + Video reklamları görünür + + + URL panoya kopyalandı + Zaman damgalı URL kopyalandı + Video URL\'sini kopyalama düğmesini göster + Video URL\'sini kopyalama düğmesi gösterilir. Video URL\'sini kopyalamak için dokunun. Zaman damgasıyla kopyalamak için dokunup basılı tutun + Video URL\'sini kopyalama düğmesi gösterilmez + Zaman damgalı URL\'yi kopyalama düğmesini göster + Zaman damgalı URL kopyalama düğmesi gösterilir. Zaman damgalı video URL\'sini kopyalamak için dokunun. Zaman damgası olmadan kopyalamak için dokunup basılı tutun + Zaman damgalı URL kopyalama düğmesi gösterilmez + + + İzleyici takdiri iletişim kutusunu kaldır + İletişim kutusu kaldırılacak + İletişim kutusu gösterilecek + Bu, yaş kısıtlamasını atlamaz. Sadece otomatik olarak kabul eder. + + + TV\'de oturum açma penceresini devre dışı bırak + TV\'de oturum açma penceresi devre dışı + TV\'de oturum açma penceresi etkin + + + Çift dokunuşla bölüm atlamayı devre dışı bırak + Çift dokunuş asla bir sonraki/önceki bölüme atlamayı tetikleyemez + Çift dokunuş zaman zaman bir sonraki/önceki bölüme atlamayı tetikleyebilir + + + Harici indirmeler + Harici indirici kullanımı için ayarlar + Harici indirme düğmesini göster + Oynatıcıda indirme düğmesi gösterilir + Oynatıcıda indirme düğmesi gösterilmez + + İndirme eylem düğmesini kullan + İndirme düğmesi harici indiricinizi açar + İndirme düğmesi yerel uygulama içi indiriciyi açar + İndirici paket adı + Yüklü harici indirme uygulamanızın paket adı + Paket adını girin + Diğer + Uygulama yüklü değil + %s yüklü değil. Lütfen yükleyin. + "%s paket adıyla yüklü uygulama bulunamadı Paket adının doğru olduğunu ve uygulamanın yüklü olduğunu doğrulayın" - Paket adı boş olamaz - - - Hassas sardırma hareketini devre dışı bırak - Hassas sardırma hareketi devre dışı - Hassas sardırma hareketi etkin - - - Dokunarak sardırmayı etkinleştir - Dokunarak sardırma etkin - Dokunarak sardırma devre dışı - - - Parlaklık hareketini etkinleştir - "Tam ekran parlaklık kaydırma etkin + Paket adı boş olamaz + + + Hassas sardırma hareketini devre dışı bırak + Hassas sardırma hareketi devre dışı + Hassas sardırma hareketi etkin + + + Dokunarak sardırmayı etkinleştir + Dokunarak sardırma etkin + Dokunarak sardırma devre dışı + + + Parlaklık hareketini etkinleştir + "Tam ekran parlaklık kaydırma etkin Ekranın sol tarafında dikey olarak kaydırarak parlaklığı ayarlayın" - Tam ekran parlaklık kaydırma devre dışı - Ses hareketini etkinleştir - "Tam ekran ses kaydırma etkin + Tam ekran parlaklık kaydırma devre dışı + Ses hareketini etkinleştir + "Tam ekran ses kaydırma etkin Ekranın sağ tarafında dikey olarak kaydırarak sesi ayarlayın" - Tam ekran ses kaydırma devre dışı - Basılı tutup kaydırma hareketini etkinleştir - Basılı tutup kaydırma hareketi etkin - Basılı tutup kaydırma hareketi devre dışı - Titreşimli geri bildirimi etkinleştir - Titreşimli geri bildirim etkin - Titreşimli geri bildirim devre dışı - Parlaklığı kaydet ve geri yükle - Tam ekrana girip çıkarken parlaklığı kaydet ve geri yükle - Tam ekrana girip çıkarken parlaklığı kaydetme ve geri yükleme - Otomatik parlaklık hareketini etkinleştir - Parlaklık hareketinin en düşük değerine kaydırma otomatik parlaklığı etkinleştirir - Parlaklık hareketinin en düşük değerine kaydırma otomatik parlaklığı etkinleştirmez - Oto - Kaydırma paneli zaman aşımı - Panelin görünür olduğu milisaniye miktarı - Kaydırma paneli arka plan opaklığı - 0-100 arasında opaklık değeri - Kaydırma opaklığı 0-100 arasında olmalıdır - Kaydırma katmanı parlaklık rengi - Parlaklık kontrolleri için ilerleme çubuğunun rengi - Kaydırma katmanı ses rengi - Ses kontrolleri için ilerleme çubuğunun rengi - Kaydırma katmanı metin boyutu - Kaydırma katmanı için 1-30 arası metin boyutu - Metin boyutu 1-30 arasında olmalıdır - Kaydırma büyüklük eşiği - Kaydırma işleminin gerçekleşmesi için eşik miktarı - Ses kaydırma hassasiyeti - Kaydırma başına sesin ne kadar değişeceği - Kaydırma katmanı stili - Yatay katman - Yatay katman (minimal - üst) - Yatay katman (minimal - orta) - Dairesel katman - Dairesel katman (minimal) - Dikey katman - Dikey katman (minimal) - Kaydırarak video değiştirmeyi etkinleştir - Tam ekran modunda kaydırma, bir sonraki/önceki videoya geçecektir - Tam ekran modunda kaydırma, bir sonraki/önceki videoya geçmeyecektir - - - Otomatik altyazıları devre dışı bırak - Otomatik altyazılar devre dışı - Otomatik altyazılar etkin - - - Eylem düğmeleri - Videoların altındaki düğmeleri gizle veya göster - Beğen ve Abone ol parlamasını devre dışı bırak - Beğen ve Abone Ol düğmesi bahsedildiğinde parlamayacak - Beğen ve Abone Ol düğmesi bahsedildiğinde parlayacak - Beğenme ve Beğenmemeyi gizle - Beğenme ve Beğenmeme düğmeleri gizli - Beğenme ve Beğenmeme düğmeleri görünür - - Paylaş\'ı gizle - Paylaş düğmesi gizli - Paylaş düğmesi görünür - - Reklamları durdur\'u Gizle - Reklamları durdur düğmesi gizli - Reklamları durdur düğmesi görünür - - Yorumları gizle - Yorumlar düğmesi gizli - Yorumlar düğmesi görünür - - Bildir\'i gizle - Bildir düğmesi gizli - Bildir düğmesi görünür - - Remix\'i gizle - Remix düğmesi gizli - Remix düğmesi görünür - - İndir\'i gizle - İndir düğmesi gizli - İndir düğmesi görünür - - Hype\'ı gizle - Hype düğmesi gizli - Hype düğmesi görünür - - Tanıt\'ı gizle - Tanıt düğmesi gizli - Tanıt düğmesi görünür - - Teşekkürler\'i gizle - Teşekkürler düğmesi gizli - Teşekkürler düğmesi görünür - - Sor\'u gizle - Sor düğmesi gizli - Sor düğmesi görünür - - Klip\'i gizle - Klip düğmesi gizli - Klip düğmesi görünür - - Alışveriş\'i gizle - Alışveriş düğmesi gizli - Alışveriş düğmesi görünür - - Kaydet\'i gizle - Kaydet düğmesi gizli - Kaydet düğmesi görünür - - - Gezinti düğmeleri - Gezinti çubuğundaki düğmeleri gizle veya değiştir - - Ana Sayfa\'yı gizle - Ana Sayfa düğmesi gizli - Ana Sayfa düğmesi görünür - - Shorts\'u gizle - Shorts düğmesi gizli - Shorts düğmesi görünür - - Oluştur\'u gizle - Oluştur düğmesi gizli - Oluştur düğmesi görünür - - Abonelikleri gizle - Abonelikler düğmesi gizli - Abonelikler düğmesi görünür - Bildirimleri gizle - Bildirimler düğmesi gizli - Bildirimler düğmesi görünür - - Oluştur ve Bildirimleri yer değiştir - "Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilir - -Not: Bunu etkinleştirmek aynı zamanda video reklamlarını zorla gizler" - Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilmez - "Bu ayarın devre dışı bırakılması, Shorts reklam engellemeyi de devre dışı bırakır. - -Bu ayarı değiştirmek etkili olmazsa, Gizli moda geçmeyi deneyin." - Gezinti düğmeleri etiketlerini gizle - Etiketler gizli - Etiketler görünür - Yarı saydam durum çubuğunu devre dışı bırak - Durum çubuğu opak - Durum çubuğu opak veya yarı saydam - Bazı cihazlarda, bu özelliği etkinleştirmek sistem gezinme çubuğunu şeffaf hale getirebilir. - Aydınlık temada yarı saydam çubuğu devre dışı bırak - Aydınlık temada gezinti çubuğu opak - Aydınlık temada gezinti çubuğu opak veya yarı saydam - Koyu temada yarı saydam çubuğu devre dışı bırak - Koyu temada gezinti çubuğu opak - Koyu temada gezinti çubuğu opak veya yarı saydam - - - Açılır menü - Oynatıcı açılır menü öğelerini gizle veya göster - - Altyazıları gizle - Altyazılar menüsü gizli - Altyazılar menüsü görünür - - Ek ayarları gizle - Ek ayarlar menüsü gizli - Ek ayarlar menüsü görünür - - Uyku zamanlayıcısını gizle - Uyku zamanlayıcısı menüsü gizli - Uyku zamanlayıcısı menüsü görünür - - Videoyu döngüye almayı gizle - Videoyu döngüye al menüsü gizli - Videoyu döngüye al menüsü görünür - - Ambiyans modunu gizle - Ambiyans modu menüsü gizli - Ambiyans modu menüsü görünür - Sabit sesi gizle - Sabit ses menüsü görünür - Sabit ses menüsü gizli - - Yardım ve geri bildirimi gizle - Yardım ve geri bildirim menüsü gizli - Yardım ve geri bildirim menüsü görünür - - Oynatma hızını gizle - Oynatma hızı menüsü gizli - Oynatma hızı menüsü görünür - - Ekranı kilitlemeyi gizle - Ekranı kilitle menüsü gizli - Ekranı kilitle menüsü görünür - - \"YouTube Music\'le Dinleyin\"i gizle - YouTube Music\'le Dinleyin menüsü gizli - YouTube Music\'le Dinleyin menüsü görünür - - Ses parçasını gizle - Ses parçası menüsü gizli - Ses parçası menüsü görünür - + Paylaş\'ı gizle + Paylaş düğmesi gizli + Paylaş düğmesi görünür + + Reklamları durdur\'u Gizle + Reklamları durdur düğmesi gizli + Reklamları durdur düğmesi görünür + + Yorumları gizle + Yorumlar düğmesi gizli + Yorumlar düğmesi görünür + + Bildir\'i gizle + Bildir düğmesi gizli + Bildir düğmesi görünür + + Remix\'i gizle + Remix düğmesi gizli + Remix düğmesi görünür + + İndir\'i gizle + İndir düğmesi gizli + İndir düğmesi görünür + + Hype\'ı gizle + Hype düğmesi gizli + Hype düğmesi görünür + + Tanıt\'ı gizle + Tanıt düğmesi gizli + Tanıt düğmesi görünür + + Teşekkürler\'i gizle + Teşekkürler düğmesi gizli + Teşekkürler düğmesi görünür + + Sor\'u gizle + Sor düğmesi gizli + Sor düğmesi görünür + + Klip\'i gizle + Klip düğmesi gizli + Klip düğmesi görünür + Gizleme, bazı kullanıcı hesapları için çalışmayabilir. + + Alışveriş\'i gizle + Alışveriş düğmesi gizli + Alışveriş düğmesi görünür + + Kaydet\'i gizle + Kaydet düğmesi gizli + Kaydet düğmesi görünür + + + Gezinti düğmeleri + Gezinti çubuğu düğmelerini gizle veya değiştir + + Ana Sayfa\'yı gizle + Ana Sayfa düğmesi gizli + Ana Sayfa düğmesi görünür + + Shorts\'u gizle + Shorts düğmesi gizli + Shorts düğmesi görünür + + Oluştur\'u gizle + Oluştur düğmesi gizli + Oluştur düğmesi görünür + + Abonelikleri gizle + Abonelikler düğmesi gizli + Abonelikler düğmesi görünür + Bildirimleri gizle + Bildirimler düğmesi gizli + Bildirimler düğmesi görünür + + Oluştur ve Bildirimleri yer değiştir + Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilir + Oluştur düğmesi ile Bildirimler düğmesinin yerleri değiştirilmez + Bu ayarı değiştirmek etkili olmazsa, Gizli moda geçmeyi deneyin. + Gezinti düğmeleri etiketlerini gizle + Etiketler gizli + Etiketler görünür + Dar gezinti düğmelerini etkinleştir + Gezinti düğmeleri arasındaki boşluk dar + Gezinti düğmeleri arasındaki boşluk normal + Gezinti çubuğu animasyonlarını etkinleştir + Gezinti geçişleri animasyonlu + Gezinti geçişleri animasyonlu değil + Yarı saydam durum çubuğunu devre dışı bırak + Durum çubuğu opak + Durum çubuğu opak veya yarı saydam + "Kısıtlamalar: +• Video oynatıcısının üst kısmında siyah bir çubuk görünebilir. +• Bazı cihazlarda, bu özelliği etkinleştirmek sistem gezinti çubuğunu şeffaf yapabilir." + Aydınlık temada yarı saydam çubuğu devre dışı bırak + Aydınlık temada gezinti çubuğu opak + Aydınlık temada gezinti çubuğu opak veya yarı saydam + Koyu temada yarı saydam çubuğu devre dışı bırak + Koyu temada gezinti çubuğu opak + Koyu temada gezinti çubuğu opak veya yarı saydam + Araç çubuğu + Araç çubuğu bileşenlerini gizle veya değiştir + Oluştur düğmesini gizle + Oluştur düğmesi gizli + Oluştur düğmesi görünür + Bildirimler düğmesini gizle + Bildirimler düğmesi gizli + Bildirimler düğmesi görünür + Arama düğmesini gizle + Arama düğmesi gizli + Arama düğmesi görünür. + Geniş arama çubuğunu etkinleştir + Geniş arama çubuğu etkin + Geniş arama çubuğu devre dışı + + + Açılır menü + Oynatıcı açılır menü öğelerini gizle veya göster + + Altyazıları gizle + Altyazılar menüsü gizli + Altyazılar menüsü görünür + + Ek ayarları gizle + Ek ayarlar menüsü gizli + Ek ayarlar menüsü görünür + + Uyku zamanlayıcısını gizle + Uyku zamanlayıcısı menüsü gizli + Uyku zamanlayıcısı menüsü görünür + + Videoyu döngüye almayı gizle + Videoyu döngüye al menüsü gizli + Videoyu döngüye al menüsü görünür + + Ambiyans modunu gizle + Ambiyans modu menüsü gizli + Ambiyans modu menüsü görünür + Sabit sesi gizle + Sabit ses menüsü görünür + Sabit ses menüsü gizli + + Yardım ve geri bildirimi gizle + Yardım ve geri bildirim menüsü gizli + Yardım ve geri bildirim menüsü görünür + + Oynatma hızını gizle + Oynatma hızı menüsü gizli + Oynatma hızı menüsü görünür + + Ekranı kilitlemeyi gizle + Ekranı kilitle menüsü gizli + Ekranı kilitle menüsü görünür + + \"YouTube Music\'le Dinleyin\"i gizle + YouTube Music\'le Dinleyin menüsü gizli + YouTube Music\'le Dinleyin menüsü görünür + + Ses parçasını gizle + Ses parçası menüsü gizli + Ses parçası menüsü görünür + - "Ses parçası menüsü gizli + "Ses parçası menüsü gizli Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayarını 'Android No SDK' olarak değiştirin" - - VR modunda izlemeyi gizle - VR modunda izle menüsü gizli - VR modunda izle menüsü görünür - Video kalite menüsünü gizle - Video kalite menüsü gizli - Video kalite menüsü görünür - Video kalite menüsü alt bilgisini gizle - Video kalite menüsü alt bilgisi gizli - Video kalite menüsü alt bilgisi görünür - - - Otomatik oynatma düğmesini gizle - Otomatik oynatma düğmesi gizli - Otomatik oynatma düğmesi görünür - - Altyazı düğmesini gizle - Altyazı düğmesi gizli - Altyazı düğmesi görünür - Yayınla düğmesini gizle - Yayınla düğmesi gizli - Yayınla düğmesi görünür - Oynatıcı kontrolleri arka planını gizle - Oynatıcı kontrolleri arka planı gizli - Oynatıcı kontrolleri arka planı görünür - Önceki & Sonraki düğmelerini gizle - Önceki & Sonraki düğmeleri gizli - Önceki & Sonraki düğmeleri görünür - - - Bitiş ekranı kartlarını gizle - Bitiş ekranı kartları gizli - Bitiş ekranı kartları görünür - - - Tam ekranda ambiyans modunu devre dışı bırak - Ambiyans modu devre dışı - Ambiyans modu etkin - - - Bilgi kartlarını gizle - Bilgi kartları gizli - Bilgi kartları görünür - - - Kayan sayı animasyonlarını devre dışı bırak - Kayan sayı animasyonları devre dışı - Kayan sayı animasyonları etkin - - - Video oynatıcısı zaman çubuğunu gizle - Video oynatıcısı zaman çubuğu gizli - Video oynatıcısı zaman çubuğu görünür - - Video kapak fotoğrafı zaman çubuğunu gizle - Video kapak fotoğrafı zaman çubuğu gizli - Video kapak fotoğrafı zaman çubuğu görünür - - - Shorts oynatıcı - Shorts oynatıcı bileşenlerini gizle veya göster - - Ana Sayfa akışında Shorts\'u gizle - Ana Sayfa akışında ve ilgili videolarda gizli - Ana Sayfa akışında ve ilgili videolarda görünür - Arama sonuçlarında Shorts\'u gizle - Arama sonuçlarında gizli - Arama sonuçlarında görünür - - Abonelikler akışında Shorts\'u gizle - Abonelikler akışında gizli - Abonelikler akışında görünür - İzleme geçmişinde Shorts\'u gizle - İzleme geçmişinde gizli - İzleme geçmişinde görünür - \'Otomatik dublajlı\' etiketini gizle - Otomatik dublajlı etiketi gizli - Otomatik dublajlı etiketi görünür - \'Süper Teşekkürler\' düğmesini gizle - Süper Teşekkürler düğmesi gizli - Süper Teşekkürler düğmesi görünür - Efekt düğmesini gizle - Efekt düğmesi gizli - Efekt düğmesi görünür - \'Yeşil ekran\' düğmesini gizle - Yeşil ekran düğmesi gizli - Yeşil ekran düğmesi görünür - Hashtag düğmesini gizle - Hashtag düğmesi gizli - Hashtag düğmesi görünür - - Katıl düğmesini gizle - Katıl düğmesi gizli - Katıl düğmesi görünür - Canlı ön izlemeyi gizle - Canlı ön izleme gizli - Canlı ön izleme görünür - Konum etiketini gizle - Konum etiketi gizli - Konum etiketi görünür - \'Yeni gönderiler\' düğmesini gizle - Yeni gönderiler düğmesi gizli - Yeni gönderiler düğmesi görünür - Duraklama katmanı düğmelerini gizle - Duraklama katmanı düğmeleri gizli - Duraklama katmanı düğmeleri görünür - Ön izlenen yorumu gizle - Ön izlenen yorum gizli - Ön izlenen yorum görünür - \'Müziği kaydet\' düğmesini gizle - Müziği kaydet düğmesi gizli - Müziği kaydet düğmesi görünür - Arama önerilerini gizle - Arama önerileri gizli - Arama önerileri görünür - Alışveriş düğmesini gizle - Mağaza düğmesi gizli - Mağaza düğmesi görünür - Çıkartmaları gizle - Çıkartmalar gizli - Çıkartmalar görünür - Abone ol düğmesini gizle - Abone ol düğmesi gizli - Abone ol düğmesi görünür - Etiketli ürünleri gizle - Etiketli ürünler gizli - Etiketli ürünler görünür - Gelecek düğmesini gizle - Gelecek düğmesi gizli - Gelecek düğmesi görünür - \'Bu sesi kullan\' düğmesini gizle - Bu sesi kullan düğmesi gizli - Bu sesi kullan düğmesi görünür - \'Bu şablonu kullan\' düğmesini gizle - Bu şablonu kullan düğmesi gizli - Bu şablonu kullan düğmesi görünür - Beğeni düğmesi çeşme animasyonunu gizle - Beğeni düğmesi çeşme animasyonu gizli - Beğeni düğmesi çeşme animasyonu görünür - Beğen düğmesini gizle - Beğen düğmesi gizli - Beğen düğmesi görünür - Beğenmeme düğmesini gizle - Beğenmeme düğmesi gizli - Beğenmeme düğmesi görünür - Yorumlar düğmesini gizle - Yorumlar düğmesi gizli - Yorumlar düğmesi görünür - - Paylaş düğmesini gizle - Paylaş düğmesi gizli - Paylaş düğmesi görünür - - Remix düğmesini gizle - Remix düğmesi gizli - Remix düğmesi görünür - Ses düğmesini gizle - Ses düğmesi gizli - Ses düğmesi görünür - Bilgi panelini gizle - Bilgi paneli gizli - Bilgi paneli görünür - Kanal çubuğunu gizle - Kanal çubuğu gizli - Kanal çubuğu görünür - Video başlığını gizle - Video başlığı gizli - Video başlığı görünür - Ses bilgisi etiketini gizle - Ses bilgisi etiketi gizli - Ses bilgisi etiketi görünür - Video bağlantısı etiketini gizle - Video bağlantısı etiketi gizli - Video bağlantısı etiketi görünür - Gezinme çubuğunu gizle - Gezinme çubuğu gizli - Gezinti çubuğu görünür - - - Bitiş ekranı önerilen videosunu gizle - "Otomatik oynatma kapatıldığında bitiş ekranı önerilen videosu gizlenir + + VR modunda izlemeyi gizle + VR modunda izle menüsü gizli + VR modunda izle menüsü görünür + Video kalite menüsünü gizle + Video kalite menüsü gizli + Video kalite menüsü görünür + Video kalite menüsü alt bilgisini gizle + Video kalite menüsü alt bilgisi gizli + Video kalite menüsü alt bilgisi görünür + + + Otomatik oynatma düğmesini gizle + Otomatik oynatma düğmesi gizli + Otomatik oynatma düğmesi görünür + + Altyazı düğmesini gizle + Altyazı düğmesi gizli + Altyazı düğmesi görünür + Yayınla düğmesini gizle + Yayınla düğmesi gizli + Yayınla düğmesi görünür + Daralt düğmesini gizle + Daralt düğmesi gizli + Daralt düğmesi görünür + Tam ekran düğmesini gizle + Tam ekran düğmesi gizli + Tam ekran düğmesi görünür + Oynatıcı kontrolleri arka planını gizle + Oynatıcı kontrolleri arka planı gizli + Oynatıcı kontrolleri arka planı görünür + Önceki & Sonraki düğmelerini gizle + Önceki & Sonraki düğmeleri gizli + Önceki & Sonraki düğmeleri görünür + + + Bitiş ekranı kartlarını gizle + Bitiş ekranı kartları gizli + Bitiş ekranı kartları görünür + + + Tam ekranda ambiyans modunu devre dışı bırak + Ambiyans modu devre dışı + Ambiyans modu etkin + + + Bilgi kartlarını gizle + Bilgi kartları gizli + Bilgi kartları görünür + + + Kayan sayı animasyonlarını devre dışı bırak + Kayan sayı animasyonları devre dışı + Kayan sayı animasyonları etkin + + + Video oynatıcısı zaman çubuğunu gizle + Video oynatıcısı zaman çubuğu gizli + Video oynatıcısı zaman çubuğu görünür + + Video kapak fotoğrafı zaman çubuğunu gizle + Video kapak fotoğrafı zaman çubuğu gizli + Video kapak fotoğrafı zaman çubuğu görünür + Tam ekran büyük zaman çubuğunu etkinleştir + Tam ekran zaman çubuğu büyük boyutlu + Tam ekran zaman çubuğu normal boyutlu + + + Shorts oynatıcı + Shorts oynatıcı bileşenlerini gizle veya göster + Kanal sayfasında Shorts\'u gizle + Kanal sayfasında gizli + Kanal sayfasında görünür + + Ana Sayfa akışında Shorts\'u gizle + Ana Sayfa akışında ve ilgili videolarda gizli + Ana Sayfa akışında ve ilgili videolarda görünür + Arama sonuçlarında Shorts\'u gizle + Arama sonuçlarında gizli + Arama sonuçlarında görünür + + Abonelikler akışında Shorts\'u gizle + Abonelikler akışında gizli + Abonelikler akışında görünür + Video açıklamasında Shorts\'u gizle + Video açıklamasında gizli + Video açıklamasında görünür + İzleme geçmişinde Shorts\'u gizle + İzleme geçmişinde gizli + İzleme geçmişinde görünür + Yapay zeka düğmesini gizle + Yapay zeka düğmesi gizli + Yapay zeka düğmesi görünür + \'Otomatik dublajlı\' etiketini gizle + Otomatik dublajlı etiketi gizli + Otomatik dublajlı etiketi görünür + \'Otomatik dublajlı\' etiketini gizle + Otomatik dublajlı etiketi gizli + Otomatik dublajlı etiketi görünür + \'Süper Teşekkürler\' düğmesini gizle + Süper Teşekkürler düğmesi gizli + Süper Teşekkürler düğmesi görünür + Efekt düğmesini gizle + Efekt düğmesi gizli + Efekt düğmesi görünür + \'Yeşil ekran\' düğmesini gizle + Yeşil ekran düğmesi gizli + Yeşil ekran düğmesi görünür + Hashtag düğmesini gizle + Hashtag düğmesi gizli + Hashtag düğmesi görünür + + Katıl düğmesini gizle + Katıl düğmesi gizli + Katıl düğmesi görünür + Canlı ön izlemeyi gizle + Canlı ön izleme gizli + Canlı ön izleme görünür + Konum etiketini gizle + Konum etiketi gizli + Konum etiketi görünür + \'Yeni gönderiler\' düğmesini gizle + Yeni gönderiler düğmesi gizli + Yeni gönderiler düğmesi görünür + Duraklama katmanı düğmelerini gizle + Duraklama katmanı düğmeleri gizli + Duraklama katmanı düğmeleri görünür + Ön izlenen yorumu gizle + Ön izlenen yorum gizli + Ön izlenen yorum görünür + \'Müziği kaydet\' düğmesini gizle + Müziği kaydet düğmesi gizli + Müziği kaydet düğmesi görünür + Arama önerilerini gizle + Arama önerileri gizli + Arama önerileri görünür + Alışveriş düğmesini gizle + Mağaza düğmesi gizli + Mağaza düğmesi görünür + Çıkartmaları gizle + Çıkartmalar gizli + Çıkartmalar görünür + Abone ol düğmesini gizle + Abone ol düğmesi gizli + Abone ol düğmesi görünür + Etiketli ürünleri gizle + Etiketli ürünler gizli + Etiketli ürünler görünür + Gelecek düğmesini gizle + Gelecek düğmesi gizli + Gelecek düğmesi görünür + \'Bu sesi kullan\' düğmesini gizle + Bu sesi kullan düğmesi gizli + Bu sesi kullan düğmesi görünür + \'Bu şablonu kullan\' düğmesini gizle + Bu şablonu kullan düğmesi gizli + Bu şablonu kullan düğmesi görünür + + Beğeni düğmesi çeşme animasyonunu gizle + Beğeni düğmesi çeşme animasyonu gizli + Beğeni düğmesi çeşme animasyonu görünür + Beğen düğmesini gizle + Beğen düğmesi gizli + Beğen düğmesi görünür + Beğenmeme düğmesini gizle + Beğenmeme düğmesi gizli + Beğenmeme düğmesi görünür + Yorumlar düğmesini gizle + Yorumlar düğmesi gizli + Yorumlar düğmesi görünür + + Paylaş düğmesini gizle + Paylaş düğmesi gizli + Paylaş düğmesi görünür + + Remix düğmesini gizle + Remix düğmesi gizli + Remix düğmesi görünür + Ses düğmesini gizle + Ses düğmesi gizli + Ses düğmesi görünür + Bilgi panelini gizle + Bilgi paneli gizli + Bilgi paneli görünür + Kanal çubuğunu gizle + Kanal çubuğu gizli + Kanal çubuğu görünür + Video başlığını gizle + Video başlığı gizli + Video başlığı görünür + Ses bilgisi etiketini gizle + Ses bilgisi etiketi gizli + Ses bilgisi etiketi görünür + Video bağlantısı etiketini gizle + Video bağlantısı etiketi gizli + Video bağlantısı etiketi görünür + Gezinti çubuğunu gizle + Gezinti çubuğu gizli + Gezinti çubuğu görünür + + + Otomatik oynatma ön izlemesini gizle + Otomatik oynatma ön izlemesi gizli + Otomatik oynatma ön izlemesi görünür + + + Bitiş ekranı önerilen videosunu gizle + "Otomatik oynatma kapatıldığında bitiş ekranı önerilen videosu gizlenir Otomatik oynatma YouTube ayarlarından değiştirilebilir: Ayarlar → Oynatma → Sonraki videoyu otomatik oynat" - Bitiş ekranı önerilen videosu görünür - - - İlgili videolar katmanını gizle - Tam ekrandaki ilgili videolar katmanı gizli - Tam ekrandaki ilgili videolar katmanı görünür - - - Video zaman damgasını gizle - Zaman damgası gizli - Zaman damgası görünür - - - Oynatıcı açılır panellerini gizle - Oynatıcı açılır panelleri gizli - Oynatıcı açılır panelleri görünür - - - Video sonunda tam ekran modundan çık - Devre dışı - Dikey - Yatay - Dikey ve yatay - - - Videoları tam ekran dikey modda aç - Videolar tam ekranda açılır - Videolar tam ekranda açılmaz - - - Oynatıcı katmanı opaklığı - 0-100 arasında opaklık değeri, 0 şeffaftır - Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır - - - - Beğenilmemeler zaman aşımına uğradı - Beğenilmemeler kullanılamıyor (durum %d) - Beğenilmemeler kullanılamıyor (istemci API sınırı) - Beğenilmemeler kullanılamıyor (%s) - - Return YouTube Dislike ile oylamak için videoyu yenileyin - - Sahibi tarafından gizlendi - Return YouTube Dislike - Beğenilmeme sayıları gösterilir - Beğenilmeme sayıları gösterilmez - Shorts\'ta beğenilmeme sayılarını göster - "Shorts'ta beğenilmeme sayıları gösterilir + Bitiş ekranı önerilen videosu görünür + + + İlgili videolar katmanını gizle + Tam ekrandaki ilgili videolar katmanı gizli + Tam ekrandaki ilgili videolar katmanı görünür + + + Video zaman damgasını gizle + Zaman damgası gizli + Zaman damgası görünür + + + Oynatıcı açılır panellerini gizle + Oynatıcı açılır panelleri gizli + Oynatıcı açılır panelleri görünür + + + Video sonunda tam ekran modundan çık + Devre dışı + Dikey + Yatay + Dikey ve yatay + + + Videoları tam ekran dikey modda aç + Videolar tam ekranda açılır + Videolar tam ekranda açılmaz + + + Oynatıcı katmanı opaklığı + 0-100 arasında opaklık değeri, 0 şeffaftır + Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır + + + + Beğenilmemeler zaman aşımına uğradı + Beğenilmemeler kullanılamıyor (durum %d) + Beğenilmemeler kullanılamıyor (istemci API sınırı) + Beğenilmemeler kullanılamıyor (%s) + + Return YouTube Dislike ile oylamak için videoyu yenileyin + + Sahibi tarafından gizlendi + Return YouTube Dislike + Beğenilmeme sayıları gösterilir + Beğenilmeme sayıları gösterilmez + Shorts\'ta beğenilmeme sayılarını göster + "Shorts'ta beğenilmeme sayıları gösterilir Kısıtlama: Beğenilmeme sayıları gizli modda görünmeyebilir" - Shorts\'ta beğenilmeme sayıları gösterilmez - Yüzdelik dilim olarak beğenilmeme - Beğenilmemeler yüzde olarak gösterilir - Beğenilmemeler sayı olarak gösterilir - - Ufak beğenme düğmesi - Beğenme düğmesi en az genişlik için biçimlendirilir - Beğenme düğmesi en iyi görünüm için biçimlendirilir - Tahmini beğenileri göster - Beğenileri devre dışı bırakılan videolarda tahmini beğeni sayısı gösterilir - Tahmini beğeniler gösterilmez - API kullanılamadığında bir uyarı göster - Return YouTube Dislike kullanılamadığında uyarı gösterilir - Return YouTube Dislike kullanılamadığında uyarı gösterilmez - ReturnYouTubeDislike.com - Veri, Return YouTube Dislike API\'sinden sağlanır. Daha fazla bilgi için dokunun - - Bu cihazın ReturnYouTubeDislike API istatistikleri - Ortalama API yanıt süresi - En düşük API yanıt süresi - En yüksek API yanıt süresi - Son videodaki API yanıt süresi - Beğenilmeme sayıları geçici olarak kullanılamıyor - İstemci API sınırında - API\'den oy isteme çağrısı sayısı - Hiç çağrı yapılmadı - %d çağrı yapıldı - API\'den oylar istenirken yaşanan zaman aşımı sayısı - Hiçbir çağrı zaman aşımına uğramadı - %d çağrı zaman aşımına uğradı - API istemci sınırları - Hiçbir sınırla karşılaşılmadı - %d defa istemci sınırıyla karşılaşıldı - %d milisaniye - - - Geniş arama çubuğunu etkinleştir - Geniş arama çubuğu etkin - Geniş arama çubuğu devre dışı - - - Yüksek kalite küçük resimleri etkinleştir - Zaman çubuğu küçük resimleri yüksek kalitede - Zaman çubuğu küçük resimleri orta kalitede - Tam ekran zaman çubuğu küçük resimleri yüksek kalitede - Tam ekran zaman çubuğu küçük resimleri orta kalitede - "Bu aynı zamanda, zaman çubuğu küçük resimleri olmayan canlı yayınlardaki küçük resimleri de geri yükleyecektir. - -Zaman çubuğu küçük resimleri, mevcut video ile aynı kaliteyi kullanacaktır. - -Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet bağlantısı kullanıldığında en iyi şekilde çalışır." - Eski zaman çubuğu küçük resimlerini geri getir - Zaman çubuğu küçük resimleri zaman çubuğunun üzerinde görünecek - Zaman çubuğu küçük resimleri tam ekranda görünecek - - - SponsorBlock - SponsorBlock\'u etkinleştir - SponsorBlock, YouTube videolarının can sıkıcı kısımlarını atlamaya yarayan kitle kaynaklı bir sistemdir - Görünüm - Oylama düğmesini göster - Kısım oylama düğmesi gösterilir - Kısım oylama düğmesi gösterilmez - Kare düzen kullan - Düğmeler ve kontroller kare şeklinde - Düğmeler ve kontroller yuvarlatılmış şekilde - - Ufak atlama düğmesi kullan - Atlama düğmesi en az genişlik için tasarlanır - Atlama düğmesi en iyi görünüm için tasarlanır - Atlama düğmesini otomatik olarak gizle - Atlama düğmesi birkaç saniye sonra gizlenir - Atlama düğmesi bütün kısım boyunca gösterilir - Atlama düğmesi süresi - Atla ve vurguya atla düğmelerinin otomatik olarak gizlenmeden önce ne kadar süre gösterileceği - Atlamayı geri al bildirimini göster - Bir kısım otomatik olarak atlandığında bildirim gösterilir. Atlamayı geri almak için bildirime dokunun - Bildirim gösterilmez - Atlama bildirimi süresi - Atlamayı geri alma bildiriminin ne kadar süre gösterileceği - 1 saniye - 2 saniye - 3 saniye - 4 saniye - 5 saniye - 6 saniye - 7 saniye - 8 saniye - 9 saniye - 10 saniye - Kısımlar olmadan video süresini göster - Video süresi eksi bütün kısımların süresi zaman çubuğunda görünür - Tam video süresi görünür - Yeni kısım oluşturma - Yeni kısım oluşturma düğmesini göster - Yeni kısım oluşturma düğmesi gösterilir - Yeni kısım oluşturma düğmesi gösterilmez - Yeni kısım oluştururkenki atlama süresi - Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı - Değer pozitif bir sayı olmalıdır - Yönergeleri görüntüle - Yönergeler, yeni kısım oluşturma kurallarını ve ipuçlarını içerir - Yönergeleri takip edin - Yeni kısım oluşturmadan önce SponsorBlock yönergelerini okuyun - Okudum - Göster - Genel - API kullanılamadığında bir bildirim göster - SponsorBlock kullanılamadığında bir bildirim gösterilir - SponsorBlock kullanılamadığında bildirim gösterilmez - Atlama sayısı takibini etkinleştir - SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir - Atlama sayısı izleme etkin değil - En az kısım süresi - Bu değerden (saniye cinsinden) kısa olan kısımlar gösterilmeyecek ve atlanmayacaktır - Geçersiz süre - Özel kullanıcı kimliğiniz - Bu gizli tutulmalıdır. Bu bir şifreye benzer ve başkalarıyla paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilirler - Özel kullanıcı kimliği en az 30 karakter olmalıdır - API URL\'sini değiştir - SponsorBlock\'un sunucuya çağrı yapmak için kullandığı adres - API URL\'si sıfırlandı - API URL\'si geçersiz - API URL\'si değiştirildi - Ayarları içe/dışa aktar - Kopyala - ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız - ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız. Bu, özel kullanıcı kimliğinizi içerir. Bunu dikkatli paylaştığınızdan emin olun - Ayarlar başarıyla içe aktarıldı - İçe aktarılamadı: %s - Dışa aktarılamadı: %s - "Ayarlarınız özel bir SponsorBlock kullanıcı kimliği içeriyor. + Shorts\'ta beğenilmeme sayıları gösterilmez + Yüzdelik dilim olarak beğenilmeme + Beğenilmemeler yüzde olarak gösterilir + Beğenilmemeler sayı olarak gösterilir + + Ufak beğenme düğmesi + Beğenme düğmesi en az genişlik için biçimlendirilir + Beğenme düğmesi en iyi görünüm için biçimlendirilir + Tahmini beğenileri göster + Beğenileri devre dışı bırakılan videolarda tahmini beğeni sayısı gösterilir + Tahmini beğeniler gösterilmez + API kullanılamadığında bir uyarı göster + Return YouTube Dislike kullanılamadığında uyarı gösterilir + Return YouTube Dislike kullanılamadığında uyarı gösterilmez + ReturnYouTubeDislike.com + Veri, Return YouTube Dislike API\'sinden sağlanır. Daha fazla bilgi için dokunun + + Bu cihazın ReturnYouTubeDislike API istatistikleri + Ortalama API yanıt süresi + En düşük API yanıt süresi + En yüksek API yanıt süresi + Son videodaki API yanıt süresi + Beğenilmeme sayıları geçici olarak kullanılamıyor - İstemci API sınırında + API\'den oy isteme çağrısı sayısı + Hiç çağrı yapılmadı + %d çağrı yapıldı + API\'den oylar istenirken yaşanan zaman aşımı sayısı + Hiçbir çağrı zaman aşımına uğramadı + %d çağrı zaman aşımına uğradı + API istemci sınırları + Hiçbir sınırla karşılaşılmadı + %d defa istemci sınırıyla karşılaşıldı + %d milisaniye + + + SponsorBlock + SponsorBlock\'u etkinleştir + SponsorBlock, YouTube videolarının can sıkıcı kısımlarını atlamaya yarayan kitle kaynaklı bir sistemdir + Görünüm + Oylama düğmesini göster + Kısım oylama düğmesi gösterilir + Kısım oylama düğmesi gösterilmez + Kare düzen kullan + Düğmeler ve kontroller kare şeklinde + Düğmeler ve kontroller yuvarlatılmış şekilde + + Ufak atlama düğmesi kullan + Atlama düğmesi en az genişlik için tasarlanır + Atlama düğmesi en iyi görünüm için tasarlanır + Atlama düğmesini otomatik olarak gizle + Atlama düğmesi birkaç saniye sonra gizlenir + Atlama düğmesi bütün kısım boyunca gösterilir + Atlama düğmesi süresi + Atla ve vurguya atla düğmelerinin otomatik olarak gizlenmeden önce ne kadar süre gösterileceği + Atlamayı geri al bildirimini göster + Bir kısım otomatik olarak atlandığında bildirim gösterilir. Atlamayı geri almak için bildirime dokunun + Bildirim gösterilmez + Atlama bildirimi süresi + Atlamayı geri alma bildiriminin ne kadar süre gösterileceği + 1 saniye + 2 saniye + 3 saniye + 4 saniye + 5 saniye + 6 saniye + 7 saniye + 8 saniye + 9 saniye + 10 saniye + Kısımlar olmadan video süresini göster + Video süresi eksi bütün kısımların süresi zaman çubuğunda görünür + Tam video süresi görünür + Yeni kısım oluşturma + Yeni kısım oluşturma düğmesini göster + Yeni kısım oluşturma düğmesi gösterilir + Yeni kısım oluşturma düğmesi gösterilmez + Yeni kısım oluştururkenki atlama süresi + Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı + Değer pozitif bir sayı olmalıdır + Yönergeleri görüntüle + Yönergeler, yeni kısım oluşturma kurallarını ve ipuçlarını içerir + Yönergeleri takip edin + Yeni kısım oluşturmadan önce SponsorBlock yönergelerini okuyun + Okudum + Göster + Genel + API kullanılamadığında bir bildirim göster + SponsorBlock kullanılamadığında bildirim gösterilir + SponsorBlock kullanılamadığında bildirim gösterilmez + Atlama sayısı takibini etkinleştir + SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir + Atlama sayısı izleme etkin değil + Minimum kısım süresi + Bu değerden (saniye cinsinden) kısa olan kısımlar gösterilmeyecek ve atlanmayacaktır + Geçersiz süre + Özel kullanıcı kimliğiniz + Bu gizli tutulmalıdır. Bu bir şifreye benzer ve başkalarıyla paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilirler + Özel kullanıcı kimliği en az 30 karakter olmalıdır + API URL\'sini değiştir + SponsorBlock\'un sunucuya çağrı yapmak için kullandığı adres + API URL\'si sıfırlandı + API URL\'si geçersiz + API URL\'si değiştirildi + Ayarları içe/dışa aktar + Kopyala + ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız + ReVanced\'e ve diğer SponsorBlock platformlarına aktarılabilecek SponsorBlock JSON yapılandırmanız. Bu, özel kullanıcı kimliğinizi içerir. Bunu dikkatli paylaştığınızdan emin olun + Ayarlar başarıyla içe aktarıldı + İçe aktarılamadı: %s + Dışa aktarılamadı: %s + "Ayarlarınız özel bir SponsorBlock kullanıcı kimliği içeriyor. Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır. " - Bir daha gösterme - Kısım davranışını değiştir - Sponsor - Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendi reklamı veya beğendiği amaçlara/üreticilere/sitelere/ürünlere atıfta bulunmalar için değil - Karşılıksız / Kendi Reklamı - Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımları içerir - Etkileşim Hatırlatıcısı (Abone Ol) - İçeriğin ortasında beğenme, abone olma veya takip etme için kısa hatırlatmalar. Eğer uzunsa veya belirli birşey hakkındaysa kendi reklamı kategorisinde olmalıdır - Vurgu - Videonun çoğu kişinin aradığı bölümü - Ara / Giriş Animasyonu - Gerçek içerik barındırmayan aralıklar. Duraklama, sabit kare veya tekrar eden bir animasyon olabilir. Bilgi içeren geçişleri içermez - Bitiş Ekranı / Jenerik - Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil - Giriş / Selamlama - Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez - Ön İzleme / Özet - Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu - Konuyla Alakasız / Şakalar - Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan kısımları içermez - Müzik: Müzik Olmayan Kısım - Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri - Atla - Vurgu - Sponsoru atla - Tanıtımı atla - Etkileşimi atla - Vurguya atla - Girişi atla - Arayı atla - Arayı atla - Bitişi atla - Girişi atla - Ön izlemeyi atla - Ön izlemeyi atla - Özeti atla - Konu dışını atla - Müziksiz kısmı atla - Kısmı atla - Sponsor atlandı - Kendi reklamı atlandı - Sıkıcı hatırlatma atlandı - Vurguya atlandı - Giriş atlandı - Ara atlandı - Ara atlandı - Bitiş atlandı - Giriş atlandı - Ön izleme atlandı - Ön izleme atlandı - Özet atlandı - Konu dışı atlandı - Müziksiz kısım atlandı - Gönderilmemiş kısım atlandı - Birden fazla kısım atlandı - Otomatik atla - Bir defalık otomatik atla - Atlama düğmesi göster - Zaman çubuğunda göster - Devre dışı bırak - Kısım gönderilemedi: %s - SponsorBlock geçici olarak kapalı - Kısım gönderilemedi (durum: %1$d %2$s) - Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek - Kısım gönderilemiyor: %s - "Kısım gönderilemiyor. + Bir daha gösterme + Kısım davranışını değiştir + Sponsor + Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendi reklamı veya beğendiği amaçlara/üreticilere/sitelere/ürünlere atıfta bulunmalar için değil + Karşılıksız / Kendi Reklamı + Ücretsiz veya kendi reklamı olması dışında Sponsor\'a benzer. Ürünler, bağışlar veya kimlerle birlikte çalıştıkları hakkında kısımları içerir + Etkileşim Hatırlatıcısı (Abone Ol) + İçeriğin ortasında beğenme, abone olma veya takip etme için kısa hatırlatmalar. Eğer uzunsa veya belirli birşey hakkındaysa kendi reklamı kategorisinde olmalıdır + Vurgu + Videonun çoğu kişinin aradığı kısmı + Ara / Giriş Animasyonu + Gerçek içerik barındırmayan aralıklar. Duraklama, sabit kare veya tekrar eden bir animasyon olabilir. Bilgi içeren geçişleri içermez + Bitiş Ekranı / Jenerik + Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil + Giriş / Selamlama + Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez + Ön İzleme / Özet + Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu + Konuyla Alakasız / Şakalar + Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan kısımları içermez + Müzik: Müzik Olmayan Kısım + Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri + Atla + Vurgu + Sponsoru atla + Tanıtımı atla + Etkileşimi atla + Vurguya atla + Girişi atla + Arayı atla + Arayı atla + Bitişi atla + Girişi atla + Ön izlemeyi atla + Ön izlemeyi atla + Özeti atla + Konu dışını atla + Müziksiz kısmı atla + Kısmı atla + Sponsor atlandı + Kendi reklamı atlandı + Sıkıcı hatırlatma atlandı + Vurguya atlandı + Giriş atlandı + Ara atlandı + Ara atlandı + Bitiş atlandı + Giriş atlandı + Ön izleme atlandı + Ön izleme atlandı + Özet atlandı + Konu dışı atlandı + Müziksiz kısım atlandı + Gönderilmemiş kısım atlandı + Birden fazla kısım atlandı + Otomatik atla + Bir defalık otomatik atla + Atlama düğmesi göster + Zaman çubuğunda göster + Devre dışı bırak + Kısım gönderilemedi: %s + SponsorBlock geçici olarak kapalı + Kısım gönderilemedi (durum: %1$d %2$s) + Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek + Kısım gönderilemiyor: %s + "Kısım gönderilemiyor. Aynısı mevcut" - Kısım başarıyla gönderildi - - SponsorBlock zaman aşımına uğradı - SponsorBlock geçici olarak kullanılamıyor (durum %d) - SponsorBlock geçici olarak kullanılamıyor - Kısım oylanamıyor (API zaman aşımına uğradı) - Kısım oylanamıyor (durum %1$d %2$s) - Kısım oylanamıyor: %s - Olumlu oy - Olumsuz oy - Kategori değiştir - Oylanılacak kısım bulunmuyor - - %1$s - %2$s - Kısım kategorisini seçin - Kategori, ayarlarda devre dışı. Göndermek için etkinleştirin. - Yeni SponsorBlock kısmı - %s yeni kısmın başlangıcı mı, bitişi mi olarak ayarlansın? - Başlangıç - Bitiş - Şimdi - Kısmın başladığı zaman - Kısmın bittiği zaman - Süreler doğru mu? - "Kısım şu süreler arasında: + Kısım başarıyla gönderildi + + SponsorBlock zaman aşımına uğradı + SponsorBlock geçici olarak kullanılamıyor (durum %d) + SponsorBlock geçici olarak kullanılamıyor + Kısım oylanamıyor (API zaman aşımına uğradı) + Kısım oylanamıyor (durum %1$d %2$s) + Kısım oylanamıyor: %s + Olumlu oy + Olumsuz oy + Kategori değiştir + Oylanılacak kısım bulunmuyor + + %1$s - %2$s + Kısım kategorisini seçin + Kategori, ayarlarda devre dışı. Göndermek için etkinleştirin. + Yeni SponsorBlock kısmı + %s yeni kısmın başlangıcı mı, bitişi mi olarak ayarlansın? + Başlangıç + Bitiş + Şimdi + Kısmın başladığı zaman + Kısmın bittiği zaman + Süreler doğru mu? + "Kısım şu süreler arasında: %1$s ile @@ -1292,47 +1377,47 @@ ile (%3$s) Göndermeye hazır mı?" - Başlangıç bitişten önce olmalıdır - Önce zaman çubuğunda iki yer işaretleyin - Kısmı ön izleyin ve sorunsuz bir şekilde atladığından emin olun - Kısmın zamanlamasını el ile ayarlayın - Kısmın başlangıcını mı, bitişini mi düzenlemek istiyorsunuz? - Geçersiz süre girildi - İstatistikler - - İstatistikler geçici olarak kullanılamıyor (API kapalı) - Yükleniyor... - SponsorBlock devre dışı - Kullanıcı adınız: <b>%s</b> - Kullanıcı adınızı değiştirmek için buraya dokunun - Kullanıcı adı değiştirilemiyor: Durum: %1$d %2$s - Kullanıcı adı başarıyla değiştirildi - İtibarınız <b>%.2f</b> - <b>%s</b> kısım oluşturdunuz - Kısımlarınızı görüntülemek için buraya dokunun - SponsorBlock liderlik tablosu - İnsanları <b>%s</b> kısımdan kurtardınız - Küresel istatistikleri ve en çok katkıda bulunanları görmek için buraya dokunun - Bu, hayatlarının <b>%s</b> kadarı.<br>Liderlik tablosunu görmek için dokunun - <b>%s</b> kısım atladınız - Bu da <b>%s</b> demek - Atlanan kısım sayacı sıfırlansın mı? - %1$s saat %2$s dakika - %1$s dakika %2$s saniye - %s saniye - Opaklık: - Renk: - Hakkında - sponsor.ajay.app - Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun - - - Düzen form faktörü - Varsayılan - Telefon - Tablet - Otomotiv - "Değişiklikler şunları içerir: + Başlangıç bitişten önce olmalıdır + Önce zaman çubuğunda iki yer işaretleyin + Kısmı ön izleyin ve sorunsuz bir şekilde atladığından emin olun + Kısmın zamanlamasını el ile ayarlayın + Kısmın başlangıcını mı, bitişini mi düzenlemek istiyorsunuz? + Geçersiz süre girildi + İstatistikler + + İstatistikler geçici olarak kullanılamıyor (API kapalı) + Yükleniyor... + SponsorBlock devre dışı + Kullanıcı adınız: <b>%s</b> + Kullanıcı adınızı değiştirmek için buraya dokunun + Kullanıcı adı değiştirilemiyor: Durum: %1$d %2$s + Kullanıcı adı başarıyla değiştirildi + İtibarınız <b>%.2f</b> + <b>%s</b> kısım oluşturdunuz + Kısımlarınızı görüntülemek için buraya dokunun + SponsorBlock liderlik tablosu + İnsanları <b>%s</b> kısımdan kurtardınız + Küresel istatistikleri ve en çok katkıda bulunanları görmek için buraya dokunun + Bu, hayatlarının <b>%s</b> kadarı.<br>Liderlik tablosunu görmek için dokunun + <b>%s</b> kısım atladınız + Bu da <b>%s</b> demek + Atlanan kısım sayacı sıfırlansın mı? + %1$s saat %2$s dakika + %1$s dakika %2$s saniye + %s saniye + Opaklık: + Renk: + Hakkında + sponsor.ajay.app + Veri, SponsorBlock API\'sinden sağlanır. Daha fazla bilgi ve diğer platformlar için indirmeleri görmek için dokunun + + + Düzen form faktörü + Varsayılan + Telefon + Tablet + Otomotiv + "Değişiklikler şunları içerir: Tablet düzeni • Topluluk yayınları gizlenir @@ -1340,513 +1425,521 @@ Tablet düzeni Otomotiv düzeni • Shorts, normal oynatıcıda açılır • Akış, konulara ve kanallara göre düzenlenir" - - - Uygulama sürümünü taklit et - Sürüm taklit ediliyor - Sürüm taklit edilmiyor - "Uygulama sürümü, YouTube'un eski bir sürümü olarak taklit edilecektir. + + + Uygulama sürümünü taklit et + Sürüm taklit ediliyor + Sürüm taklit edilmiyor + "Uygulama sürümü, YouTube'un eski bir sürümü olarak taklit edilecektir. Bu, uygulamanın görünümünü ve özelliklerini değiştirecektir, ancak bilinmeyen yan etkiler ortaya çıkabilir. Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerinin temizlenmesi önerilir." - Uygulama sürümü taklidi hedefi - 20.13.41 - Daraltılmamış video eylem çubuğunu geri getir - 20.05.46 - Transkript işlevini geri yükle - 19.35.36 - Eski Shorts oynatıcı simgelerini geri getir - 19.01.34 - Eski gezinti simgelerini geri getir - - - Başlangıç sayfasını değiştir - Varsayılan - Tüm abonelikler - Kanallara göz at - Kurslar / Öğrenme - Keşfet - Moda ve Güzellik - Oyun - Geçmiş - Kitaplık - Beğenilen videolar - Canlı yayın - Filmler - Müzik - Haberler - Bildirimler - Oynatma listeleri - Arama - Alışveriş - Shorts - Spor - Abonelikler - Trendler - Sanal Gerçeklik - Daha sonra izle - Klipleriniz - Başlangıç sayfasını her zaman değiştir - "Başlangıç sayfası her zaman değiştirilir + Uygulama sürümü taklidi hedefi + 20.13.41 - Daraltılmamış video eylem çubuğunu geri getir + 20.05.46 - Transkript işlevini geri getir + + + Başlangıç sayfasını değiştir + Varsayılan + Tüm abonelikler + Kanallara göz at + Kurslar / Öğrenme + Keşfet + Moda ve Güzellik + Oyun + Geçmiş + Kitaplık + Beğenilen videolar + Canlı yayın + Filmler + Müzik + Haberler + Bildirimler + Oynatma listeleri + Arama + Alışveriş + Shorts + Spor + Abonelikler + Trendler + Sanal Gerçeklik + Daha sonra izle + Klipleriniz + Başlangıç sayfasını her zaman değiştir + "Başlangıç sayfası her zaman değiştirilir Kısıtlama: Araç çubuğundaki geri düğmesini kullanmak işe yaramayabilir" - Başlangıç sayfası yalnızca uygulama başlatılırken değiştirilir - - - Shorts oynatıcıya devam edilmesini devre dışı bırak - Shorts oynatıcı uygulama açıldığında devam etmeyecek - Shorts oynatıcı uygulama açıldığında devam edecek - - - Shorts\'u şununla aç - Shorts oynatıcı - Normal oynatıcı - Normal oynatıcı tam ekran - - - Shorts\'u otomatik oynat - Shorts otomatik oynatılacak - Aynı Shorts videosu sürekli yeniden oynayacak - Arka planda Shorts\'u otomatik oynat - Shorts arka planda otomatik oynatılacak - Shorts arka planda döngüde olacak - - - Mini oynatıcı - Uygulama içi küçültülmüş oynatıcının tarzını değiştir - Mini oynatıcı tipi - Devre dışı - Varsayılan - Minimal - Tablet - Modern 1 - Modern 2 - Modern 3 - Modern 4 - Yuvarlatılmış köşeleri devre dışı bırak - Köşeler kare şeklinde - Köşeler yuvarlatılmış - Boyutlandırmak için çift dokunmayı ve sıkıştırmayı etkinleştir - "Boyutlandırmak için çift dokunma ve sıkıştırma etkin + Başlangıç sayfası yalnızca uygulama başlatılırken değiştirilir + + + Shorts oynatıcıya devam edilmesini devre dışı bırak + Shorts oynatıcı uygulama açıldığında devam etmeyecek + Shorts oynatıcı uygulama açıldığında devam edecek + + + Shorts\'u şununla aç + Shorts oynatıcı + Normal oynatıcı + Normal oynatıcı tam ekran + + + Shorts\'u otomatik oynat + Shorts otomatik oynatılacak + Aynı Shorts videosu sürekli yeniden oynayacak + Arka planda Shorts\'u otomatik oynat + Shorts arka planda otomatik oynatılacak + Shorts arka planda döngüde olacak + + + Mini oynatıcı + Uygulama içi küçültülmüş oynatıcının tarzını değiştir + Mini oynatıcı tipi + Devre dışı + Varsayılan + Minimal + Tablet + Modern 1 + Modern 2 + Modern 3 + Modern 4 + Yuvarlatılmış köşeleri devre dışı bırak + Köşeler kare şeklinde + Köşeler yuvarlatılmış + Boyutlandırmak için çift dokunmayı ve sıkıştırmayı etkinleştir + "Boyutlandırmak için çift dokunma ve sıkıştırma etkin • Mini oynatıcı boyutunu artırmak için çift dokunun • Orijinal boyuta geri dönmek için tekrar çift dokunun" - Boyutlandırmak için çift dokunma ve sıkıştırma devre dışı - Sürükleyip bırakmayı devre dışı bırak - Sürükle ve bırak devre dışı - "Sürükle ve bırak etkin + Boyutlandırmak için çift dokunma ve sıkıştırma devre dışı + Sürükleyip bırakmayı devre dışı bırak + Sürükle ve bırak devre dışı + "Sürükle ve bırak etkin Mini oynatıcı, ekranın herhangi bir köşesine sürüklenebilir" - Yatay sürükleme hareketini devre dışı bırak - Yatay sürükleme hareketi devre dışı - "Yatay sürükleme hareketi etkin + Yatay sürükleme hareketini devre dışı bırak + Yatay sürükleme hareketi devre dışı + "Yatay sürükleme hareketi etkin Mini oynatıcı, ekranın dışına sağa veya sola sürüklenebilir" - Katman düğmelerini gizle - Katman düğmeleri gizli - Katman düğmeleri görünür - Büyütme ve kapatma düğmelerini gizle - "Düğmeler gizli + Katman düğmelerini gizle + Katman düğmeleri gizli + Katman düğmeleri görünür + Büyütme ve kapatma düğmelerini gizle + "Düğmeler gizli Genişletmek veya kapatmak için kaydırın" - Büyütme ve kapatma düğmeleri görünür - Alt metinleri gizle - Alt metinler gizli - Alt metinler görünür - İleri/geri atlama düğmelerini gizle - İleri ve geri atlama düğmeleri gizli - İleri ve geri atlama düğmeleri görünür - Başlangıç boyutu - Başlangıçtaki boyut, piksel cinsinden - Piksel boyutu %1$s ve %2$s arasında olmalıdır - Katman opaklığı - 0-100 arasında opaklık değeri, 0 şeffaftır - Mini oynatıcı katman opaklığı 0-100 arasında olmalıdır - - - Gradyan yükleme ekranını etkinleştir - Yükleme ekranı gradyan bir arka plana sahip olacak - Yükleme ekranı tek renk bir arka plana sahip olacak - Açılış ekranı stili - Renk - Siyah beyaz - Özel zaman çubuğu rengini etkinleştir - Özel zaman çubuğu rengi gösterilir - Orijinal zaman çubuğu rengi gösterilir - Özel zaman çubuğu rengi - Zaman çubuğunun rengi - Özel zaman çubuğu vurgu rengi - Zaman çubuğunun vurgu rengi - Geçersiz zaman çubuğu renk değeri - - - YouTube ReVanced - YT ReVanced - YT - - - Başlık logosu - Varsayılan - Normal - Premium - ReVanced - - ReVanced minimal - Özel - - - Resimlerin bölge kısıtlamalarını atla - yt4.ggpht.com resim sunucusu kullanılır - "Orijinal resim sunucusu kullanılır + Büyütme ve kapatma düğmeleri görünür + Alt metinleri gizle + Alt metinler gizli + Alt metinler görünür + İleri/geri atlama düğmelerini gizle + İleri ve geri atlama gizli + İleri ve geri atlama görünür + Başlangıç boyutu + Başlangıçtaki boyut, piksel cinsinden + Piksel boyutu %1$s ve %2$s arasında olmalıdır + Katman opaklığı + 0-100 arasında opaklık değeri, 0 şeffaftır + Mini oynatıcı katman opaklığı 0-100 arasında olmalıdır + + + Gradyan yükleme ekranını etkinleştir + Yükleme ekranı gradyan bir arka plana sahip olacak + Yükleme ekranı tek renk bir arka plana sahip olacak + Açılış ekranı stili + Devre dışı + Renk + Siyah beyaz + Özel zaman çubuğu rengini etkinleştir + Özel zaman çubuğu rengi gösterilir + Orijinal zaman çubuğu rengi gösterilir + Özel zaman çubuğu rengi + Zaman çubuğunun rengi + Özel zaman çubuğu vurgu rengi + Zaman çubuğunun vurgu rengi + Geçersiz zaman çubuğu renk değeri + + + YouTube ReVanced + YT ReVanced + YT + + + Başlık logosu + Varsayılan + Normal + Premium + ReVanced + + ReVanced minimal + Özel + + + Resimlerin bölge kısıtlamalarını atla + yt4.ggpht.com resim sunucusu kullanılır + "Orijinal resim sunucusu kullanılır Bunu etkinleştirmek, bazı bölgelerde engellenen eksik resimleri düzeltebilir" - - - - Ana Sayfa sekmesi - - Abonelikler sekmesi - - Siz sekmesi - Oynatıcı çalma listeleri & öneriler - Arama sonuçları - Orijinal kapak resimleri - DeArrow & Orijinal kapak resimleri - DeArrow & Hareketsiz yakalamalar - Hareketsiz yakalamalar - DeArrow - "DeArrow, YouTube videoları için topluluk kaynaklı kapak resimleri sağlar. Bu kapak resimleri, YouTube tarafından sağlananlardan genellikle daha alakalıdır. + + + + Ana Sayfa sekmesi + + Abonelikler sekmesi + + Siz sekmesi + Oynatıcı çalma listeleri & öneriler + Arama sonuçları + Orijinal kapak resimleri + DeArrow & Orijinal kapak resimleri + DeArrow & Hareketsiz yakalamalar + Hareketsiz yakalamalar + DeArrow + "DeArrow, YouTube videoları için topluluk kaynaklı kapak resimleri sağlar. Bu kapak resimleri, YouTube tarafından sağlananlardan genellikle daha alakalıdır. Etkinleştirilirse, video URL'leri API sunucusuna gönderilecek ve başka hiçbir veri gönderilmeyecektir. Bir videoda DeArrow kapak resmi yoksa, orijinal kapak resmi veya hareketsiz yakalamalar gösterilir DeArrow hakkında daha fazla bilgi edinmek için buraya dokunun" - API kullanılamadığında bir uyarı göster - DeArrow kullanılamadığında uyarı gösterilir - DeArrow kullanılamadığında uyarı gösterilmez - DeArrow API uç noktası - DeArrow kapak resim önbelleğinin URL\'si - Hareketsiz video yakalamaları - Hareketsiz yakalamalar, her videonun başından/ortasından/sonundan alınır. Bu resimler YouTube\'da yerleşiktir ve harici bir API kullanılmaz - Hızlı hareketsiz yakalamaları kullan - Orta kalite hareketsiz yakalamalar kullanılıyor. Kapak resimleri daha hızlı yüklenecektir fakat canlı yayınlar, yayınlanmayan veya çok eski videolar boş kapak resimleri gösterebilir - Yüksek kalite hareketsiz yakalamalar kullanılıyor - Hareketsiz yakalamanın alınacağı video zamanı - Video başlangıcı - Video ortası - Video sonu - - DeArrow geçici olarak kullanılamıyor (durum kodu: %s) - DeArrow geçici olarak kullanılamıyor - - - ReVanced duyurularını göster - Başlangıçta duyurular gösteriliyor - Başlangıçta duyurular gösterilmiyor - Başlangıçta duyuruları göster - Duyuru sağlayıcısına bağlanılamadı - Yok say - - - Videoyu döngüye almayı etkinleştir - Video döngüye girecek - Video döngüye girmeyecek - - - Videoyu döngüye al düğmesini göster - Düğme görünür - Düğme gösterilmez - Videoyu döngüye alma açık - Videoyu döngüye alma kapalı - - - Ses kesintisinde duraklat - Başka bir ses çaldığında oynatma duraklatılır (örn. navigasyon) - Başka bir ses çaldığında ses seviyesi azalır - - - Cihaz boyutlarını taklit et - "Cihaz boyutları taklit edilir + API kullanılamadığında bir uyarı göster + DeArrow kullanılamadığında uyarı gösterilir + DeArrow kullanılamadığında uyarı gösterilmez + DeArrow API uç noktası + DeArrow kapak resim önbelleğinin URL\'si + Hareketsiz video yakalamaları + Hareketsiz yakalamalar, her videonun başından/ortasından/sonundan alınır. Bu resimler YouTube\'da yerleşiktir ve harici bir API kullanılmaz + Hızlı hareketsiz yakalamaları kullan + Orta kalite hareketsiz yakalamalar kullanılıyor. Kapak resimleri daha hızlı yüklenecektir fakat canlı yayınlar, yayınlanmayan veya çok eski videolar boş kapak resimleri gösterebilir + Yüksek kalite hareketsiz yakalamalar kullanılıyor + Hareketsiz yakalamanın alınacağı video zamanı + Video başlangıcı + Video ortası + Video sonu + + DeArrow geçici olarak kullanılamıyor (durum kodu: %s) + DeArrow geçici olarak kullanılamıyor + + + ReVanced duyurularını göster + Başlangıçta duyurular gösteriliyor + Başlangıçta duyurular gösterilmiyor + Başlangıçta duyuruları göster + Duyuru sağlayıcısına bağlanılamadı + Yok say + + + Videoyu döngüye almayı etkinleştir + Video döngüye girecek + Video döngüye girmeyecek + + + Videoyu döngüye al düğmesini göster + Düğme gösterilir + Düğme gösterilmez + Videoyu döngüye alma açık + Videoyu döngüye alma kapalı + + + Ses kesintisinde duraklat + Başka bir ses çaldığında oynatma duraklatılır (örn. navigasyon) + Başka bir ses çaldığında ses seviyesi azalır + + + Cihaz boyutlarını taklit et + "Cihaz boyutları taklit edilir Daha yüksek video kaliteleri açılabilir, ancak video oynatmada takılma, daha kötü pil ömrü ve bilinmeyen yan etkiler yaşayabilirsiniz" - "Cihaz boyutları taklit edilmez + "Cihaz boyutları taklit edilmez Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" - Bunu etkinleştirmek video oynatma takılmaları, daha kötü pil ömrü, ve bilinmeyen yan etkiler yaşamanıza sebep olabilir. - - - Titreşimli geri bildirim - Titreşimli geri bildirimi değiştir - Bölümler titreşimini devre dışı bırak - Bölümler titreşimi devre dışı - Bölümler titreşimi etkin - Hassas sarma titreşimini devre dışı bırak - Hassas sardırma titreşimi devre dışı - Hassas sardırma titreşimi etkin - Sardırmayı geri alma titreşimini devre dışı bırak - Sardırmayı geri alma titreşimi devre dışı - Sardırmayı geri alma titreşimi etkin - Yakınlaştırma titreşimini devre dışı bırak - Yakınlaştırma titreşimi devre dışı - Yakınlaştırma titreşimi etkin - - - Yakın zamanda hesap giriş bilgilerinizi değiştirdiyseniz MicroG\'yi kaldırıp yeniden yükleyin. - - - URL yönlendirmelerini atla - URL yönlendirmeleri atlanıyor - URL yönlendirmeleri atlanmıyor - - - Bağlantıları tarayıcıda aç - Bağlantılar harici tarayıcıda açılıyor - Bağlantılar uygulama içi tarayıcıda açılıyor - - - - Oto - Video kalitesi değişikliklerini hatırla - Kalite değişiklikleri tüm videolara uygulanır - Kalite değişiklikleri sadece oynatılan videoya uygulanır - Video kalitesi değişikliklerinde bildirim göster - Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilir - Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilmez - Wi-Fi ağındaki varsayılan video kalitesi - Mobil ağdaki varsayılan video kalitesi - Shorts kalitesi değişikliklerini hatırla - Kalite değişiklikleri tüm Shorts\'lara uygulanır - Kalite değişiklikleri sadece oynatılan Short\'a uygulanır - Wi-Fi ağındaki varsayılan Shorts kalitesi - Mobil ağdaki varsayılan Shorts kalitesi - mobil ağ - wifi - Varsayılan %1$s kalitesi, %2$s olarak ayarlandı - Shorts %1$s kalitesi, %2$s olarak ayarlandı - - - Hız iletişim kutusu düğmesini göster - Hız iletişim kutusu düğmesi görünür. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun - Hız iletişim kutusu düğmesi gösterilmez - - - Video kalitesi düğmesini göster - Video kalitesi düğmesi görünür. Kaliteyi varsayılana sıfırlamak için dokunup basılı tutun - Video kalitesi düğmesi gösterilmez - - - Özel oynatma hızı menüsü - Özel oynatma hızı menüsü gösterilir - Özel oynatma hızı menüsü gösterilmez - Eski oynatma hızı menüsünü geri getir - Eski hız menüsü gösterilir - Modern hız menüsü gösterilir - Özel oynatma hızları - Özel oynatma hızları ekle veya değiştir - Özel hızlar %s\'den az olmalıdır - Geçersiz özel oynatma hızları - Oto - Dokunup basılı tutma özel hızı - 0-8 arası oynatma hızı - - - Oynatma hızı değişikliklerini hatırla - Oynatma hızı değişiklikleri tüm videolara uygulanır - Oynatma hızı değişiklikleri yalnızca mevcut videoya uygulanır - Oynatma hızı değişikliklerinde bildirim göster - Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir - Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez - Varsayılan oynatma hızı - Varsayılan hız %s olarak ayarlandı - - - HDR videoyu devre dışı bırak - HDR video devre dışı - HDR video etkin - AVC\'yi (H.264) zorla - Video kodeği AVC\'ye (H.264) zorlandı - Video kodeği otomatik olarak belirlenir - "Faydaları: + Bunu etkinleştirmek video oynatma takılmaları, daha kötü pil ömrü, ve bilinmeyen yan etkiler yaşamanıza sebep olabilir. + + + Titreşimli geri bildirim + Titreşimli geri bildirimi değiştir + Bölümler titreşimini devre dışı bırak + Bölümler titreşimi devre dışı + Bölümler titreşimi etkin + Hassas sardırma titreşimini devre dışı bırak + Hassas sardırma titreşimi devre dışı + Hassas sardırma titreşimi etkin + Sardırmayı geri alma titreşimini devre dışı bırak + Sardırmayı geri alma titreşimi devre dışı + Sardırmayı geri alma titreşimi etkin + Dokunup basılı tutma titreşimlerini devre dışı bırak + Dokunup basılı tutma titreşimleri devre dışı + Dokunup basılı tutma titreşimleri etkin + Yakınlaştırma titreşimini devre dışı bırak + Yakınlaştırma titreşimi devre dışı + Yakınlaştırma titreşimi etkin + + + Yakın zamanda hesap giriş bilgilerinizi değiştirdiyseniz MicroG\'yi kaldırıp yeniden yükleyin. + + + URL yönlendirmelerini atla + URL yönlendirmeleri atlanıyor + URL yönlendirmeleri atlanmıyor + + + Bağlantıları tarayıcıda aç + Bağlantılar harici tarayıcıda açılıyor + Bağlantılar uygulama içi tarayıcıda açılıyor + + + + Oto + Video kalitesi değişikliklerini hatırla + Kalite değişiklikleri tüm videolara uygulanır + Kalite değişiklikleri sadece oynatılan videoya uygulanır + Video kalitesi değişikliklerinde bildirim göster + Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilir + Varsayılan video kalitesi değiştirildiğinde bir bildirim gösterilmez + Wi-Fi ağındaki varsayılan video kalitesi + Mobil ağdaki varsayılan video kalitesi + Shorts kalitesi değişikliklerini hatırla + Kalite değişiklikleri tüm Shorts\'lara uygulanır + Kalite değişiklikleri sadece oynatılan Short\'a uygulanır + Wi-Fi ağındaki varsayılan Shorts kalitesi + Mobil ağdaki varsayılan Shorts kalitesi + mobil ağ + wifi + Varsayılan %1$s kalitesi, %2$s olarak ayarlandı + Shorts %1$s kalitesi, %2$s olarak ayarlandı + + + Hız penceresi düğmesini göster + Hız penceresi düğmesi görünür. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun + Hız penceresi düğmesi gösterilmez + + + Video kalitesi düğmesini göster + Video kalitesi düğmesi görünür. Kaliteyi varsayılana sıfırlamak için dokunup basılı tutun + Video kalitesi düğmesi gösterilmez + + + Özel oynatma hızı menüsü + Özel oynatma hızı menüsü gösterilir + Özel oynatma hızı menüsü gösterilmez + Eski oynatma hızı menüsünü geri getir + Eski hız menüsü gösterilir + Modern hız menüsü gösterilir + Özel oynatma hızları + Özel oynatma hızları ekle veya değiştir + Özel hızlar %s\'den az olmalıdır + Geçersiz özel oynatma hızları + Oto + Dokunup basılı tutma özel hızı + 0-8 arası oynatma hızı + + + Oynatma hızı değişikliklerini hatırla + Oynatma hızı değişiklikleri tüm videolara uygulanır + Oynatma hızı değişiklikleri yalnızca mevcut videoya uygulanır + Oynatma hızı değişikliklerinde bildirim göster + Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir + Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez + Varsayılan oynatma hızı + Varsayılan hız %s olarak ayarlandı + + + HDR videoyu devre dışı bırak + HDR video devre dışı + HDR video etkin + AVC\'yi (H.264) zorla + Video kodeği AVC\'ye (H.264) zorlandı + Video kodeği otomatik olarak belirlenir + "Faydaları: • Pil ömrünü iyileştirebilir • Eski cihazlarda eksik video çözünürlüklerini geri yükleyebilir -Sınırlamalar: +Kısıtlamalar: • Maksimum çözünürlük 1080p'dir • Video oynatma, VP9 veya AV1'den daha fazla internet verisi kullanır • HDR videolar AVC kullanmaz • Bazı cihazlar AVC'yi zorlayamaz" - - - Gelişmiş video kalitesi menüsünü göster - Gelişmiş video kalitesi menüsü gösterilir - Gelişmiş video kalitesi menüsü gösterilmez - - - Kaydırarak sardırmayı etkinleştir - Kaydırarak sardırma etkin - Kaydırarak sardırma etkin değil - - - Android VR AV1\'e izin ver - "Video kodeği AVC (H.264), VP9 veya AV1'dir + + + Gelişmiş video kalitesi menüsünü göster + Gelişmiş video kalitesi menüsü gösterilir + Gelişmiş video kalitesi menüsü gösterilmez + + + Premium kalite seçeneklerini gizle + Premium kalite seçenekleri gizli + Premium kalite seçenekleri görünür + + + Kaydırarak sardırmayı etkinleştir + Kaydırarak sardırma etkin + Kaydırarak sardırma etkin değil + + + Android VR AV1\'e izin ver + "Video kodeği AVC (H.264), VP9 veya AV1'dir Oynatma takılabilir veya kare atlayabilir" - Video kodeği AVC (H.264) veya VP9\'dur - "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. + Video kodeği AVC (H.264) veya VP9\'dur + "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. AV1 ile video oynatma takılabilir veya kare atlayabilir." - Taklit yan etkileri - • Deneysel istemci ve her an çalışmayı durdurabilir - • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir - • Ses parçası menüsü eksik - • AV1 video kodeği yok - • Sabit ses mevcut değil - • Çocuk videoları oturum açılmadığında veya gizli modda oynatılamayabilir - - • Orijinal sesi zorlama mevcut değil - Meraklısı için istatistiklerde göster - İstemci tipi meraklısı için istatistiklerde gösterilir - İstemci, meraklısı için istatistiklerde gizli - - - - - YT Music ReVanced - Music ReVanced - Music - - - Hakkında - Reklamlar - Genel - Oynatıcı - Çeşitli - - - Video reklamlarını gizle - Video reklamları gizli - Video reklamları görünür - - - Kalıcı tekrarı etkinleştir - Kalıcı tekrar etkin - Kalıcı tekrar devre dışı - - - Yayınla düğmesini gizle - Yayınla düğmesi gizli - Yayınla düğmesi görünür - Geçmiş düğmesini gizle - Geçmiş düğmesi gizli - Geçmiş düğmesi görünür - Bildirim düğmesini gizle - Bildirim düğmesi gizli - Bildirim düğmesi görünür - Arama düğmesini gizle - Arama düğmesi gizli - Arama düğmesi görünür - - - Kategori çubuğunu gizle - Kategori çubuğu gizli - Kategori çubuğu görünür - - - Mini oynatıcı rengini değiştir - Mini oynatıcı rengi tam ekran oynatıcıyla eşleşir - Mini oynatıcı varsayılan rengi kullanır - - - Gezinme çubuğu - Gezinme çubuğundaki düğmeleri gizle veya değiştir - - Ana Sayfa\'yı gizle - Ana Sayfa düğmesi gizli - Ana Sayfa düğmesi görünür - - Örnekler\'i gizle - Sana Özel düğmesi gizli - Sana Özel düğmesi görünür - - Keşfet\'i gizle - Keşfet düğmesi gizli - Keşfet düğmesi görünür - - Kitaplık\'ı gizle - Kitaplık düğmesi gizli - Kitaplık düğmesi görünür - - Yükselt\'i gizle - Yükselt düğmesi gizli - Yükselt düğmesi görünür - Gezinme çubuğunu gizle - Gezinme çubuğu gizli - Gezinme çubuğu görünür - Gezinme düğmeleri etiketlerini gizle - Etiketler gizli - Etiketler görünür - - - \'Müzik Premium Al\' etiketini gizle - Etiket gizli - Etiket görünür - - - Yükseltme düğmesini gizle - Düğme gizli - Düğme görünür - - - - - Ses reklamlarını engelle - Ses reklamları engelleniyor - Ses reklamları engellenmiyor - - - %s kullanılamıyor, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. - %s bir hata döndürdü, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. - Gömülü video reklamlarını engelle - Devre dışı - Luminous proxy - PurpleAdBlock proxy - - - Video reklamlarını engelle - Video reklamları engellenir - Video reklamları engellenmez - - - Mesaj silindi - Silinen mesajları göster - Silinen mesajları gösterme - Silinen mesajları spoiler ile gizle - Silinen mesajları üstü çizilmiş olarak göster - - - Kanal Puanlarını otomatik olarak topla - Kanal Puanları otomatik olarak toplanır - Kanal Puanları otomatik olarak toplanmaz - - - - Twitch hata ayıklama modunu etkinleştir - Twitch hata ayıklama modu etkin (önerilmez) - Twitch hata ayıklama modu devre dışı - - - ReVanced Ayarları - Hakkında - ReVanced hakkında - Reklam Engelleme - Reklam Engelleme ayarları - Sohbet - Sohbet ayarları - Çeşitli - Çeşitli ayarlar - Genel ayarlar - Diğer ayarlar - İstemci taraflı reklamlar - Sunucu taraflı kesin akışlı reklamlar - Hata ayıklama kayıtları - Hata ayıklama kayıtları etkin - Hata ayıklama kayıtları devre dışı - - + Taklit yan etkileri + • Deneysel istemci ve her an çalışmayı durdurabilir + • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir + • Ses parçası menüsü eksik + • AV1 video kodeği yok + • Sabit ses mevcut değil + • Çocuk videoları oturum açılmadığında veya gizli modda oynatılamayabilir + + • Orijinal sesi zorlama mevcut değil + Meraklısı için istatistiklerde göster + İstemci tipi meraklısı için istatistiklerde gösterilir + İstemci, meraklısı için istatistiklerde gizli + + + + + YT Music ReVanced + Music ReVanced + Music + + + + Hakkında + Reklamlar + Genel + Oynatıcı + Çeşitli + + + Video reklamlarını gizle + Video reklamları gizli + Video reklamları görünür + + + Kalıcı tekrarı etkinleştir + Kalıcı tekrar etkin + Kalıcı tekrar devre dışı + + + Yayınla düğmesini gizle + Yayınla düğmesi gizli + Yayınla düğmesi görünür + Geçmiş düğmesini gizle + Geçmiş düğmesi gizli + Geçmiş düğmesi görünür + Bildirim düğmesini gizle + Bildirim düğmesi gizli + Bildirim düğmesi görünür + Arama düğmesini gizle + Arama düğmesi gizli + Arama düğmesi görünür + + + Kategori çubuğunu gizle + Kategori çubuğu gizli + Kategori çubuğu görünür + + + Mini oynatıcı rengini değiştir + Mini oynatıcı rengi tam ekran oynatıcıyla eşleşir + Mini oynatıcı varsayılan rengi kullanır + + + Gezinti çubuğu + Gezinti çubuğu düğmelerini gizle veya değiştir + + Ana Sayfa\'yı gizle + Ana Sayfa düğmesi gizli + Ana Sayfa düğmesi görünür + + Sana Özel\'i gizle + Sana Özel düğmesi gizli + Sana Özel düğmesi görünür + + Keşfet\'i gizle + Keşfet düğmesi gizli + Keşfet düğmesi görünür + + Kitaplık\'ı gizle + Kitaplık düğmesi gizli + Kitaplık düğmesi görünür + + Yükselt\'i gizle + Yükselt düğmesi gizli + Yükselt düğmesi görünür + Gezinti çubuğunu gizle + Gezinti çubuğu gizli + Gezinti çubuğu görünür + Gezinti düğmeleri etiketlerini gizle + Etiketler gizli + Etiketler görünür + + + \'Müzik Premium Al\' etiketini gizle + Etiket gizli + Etiket görünür + + + Yükseltme düğmesini gizle + Düğme gizli + Düğme görünür + + + + + Ses reklamlarını engelle + Ses reklamları engelleniyor + Ses reklamları engellenmiyor + + + %s kullanılamıyor, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. + %s bir hata döndürdü, reklamlar gösterilebilir. Ayarlarda reklam engelleyici hizmetini değiştirmeyi deneyin. + Gömülü video reklamlarını engelle + Devre dışı + Luminous proxy + PurpleAdBlock proxy + + + Video reklamlarını engelle + Video reklamları engellenir + Video reklamları engellenmez + + + Mesaj silindi + Silinen mesajları göster + Silinen mesajları gösterme + Silinen mesajları spoiler ile gizle + Silinen mesajları üstü çizilmiş olarak göster + + + Kanal Puanlarını otomatik olarak topla + Kanal Puanları otomatik olarak toplanır + Kanal Puanları otomatik olarak toplanmaz + + + + Twitch hata ayıklama modunu etkinleştir + Twitch hata ayıklama modu etkin (önerilmez) + Twitch hata ayıklama modu devre dışı + + + ReVanced Ayarları + Hakkında + ReVanced hakkında + Reklam Engelleme + Reklam Engelleme ayarları + Sohbet + Sohbet ayarları + Çeşitli + Çeşitli ayarlar + Genel ayarlar + Diğer ayarlar + İstemci taraflı reklamlar + Sunucu taraflı kesin akışlı reklamlar + Hata ayıklama kayıtları + Hata ayıklama kayıtları etkin + Hata ayıklama kayıtları devre dışı + + diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index 58dcb0d37b..da808515f9 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Користувацька Іконка додатку Оригінальна + ReVanced ReVanced мінімальна ReVanced масштабована @@ -49,6 +50,7 @@ Second \"item\" text" Налаштування + ReVanced Ви впевнені, що хочете продовжити? Зберегти Скинути @@ -80,6 +82,9 @@ Second \"item\" text" Показувати історію пошуку налаштувань Історія пошуку налаштувань показується Історія пошуку налаштувань не показується + Вимкнути жирні значки + Значки не жирні + Значки жирні Показувати іконки в налаштуваннях ReVanced Іконки в налаштуваннях показуються Іконки в налаштуваннях не показуються @@ -99,27 +104,37 @@ Second \"item\" text" and changes made here must also be made there. --> - Налаштування GmsCore - Відкрити GmsCore для налаштування та входу в обліковий запис Google + GmsCore + Налаштування, пов\'язані з GmsCore + Перевіряти оновлення GmsCore + Перевірка оновлень увімкнена + Перевірку оновлень вимкнено + Відкрити налаштування GmsCore + Налаштування GmsCore - MicroG GmsCore не встановлено. Встановіть його. - Потрібна дія - "MicroG GmsCore не має дозволу на роботу в фоновому режимі. + MicroG GmsCore не встановлено. Встановіть його. + Потрібна дія + Не вдалося перевірити наявність оновлень MicroG GmsCore + Доступна нова версія (%1$s) MicroG GmsCore. Наразі ви використовуєте версію %2$s. + "MicroG GmsCore не має дозволу на роботу в фоновому режимі. Дотримуйтесь інструкцій з посібника \"Don't kill my app\" для Вашого телефону та застосуйте їх до своєї інсталяції MicroG. Це необхідно для роботи програми." - Відкрити вебсайт - "Необхідно вимкнути оптимізацію енергії для MicroG GmsCore, щоб запобігти проблемам. + Відкрити вебсайт + Скасувати + "Необхідно вимкнути оптимізацію енергії для MicroG GmsCore, щоб запобігти проблемам. Вимкнення оптимізації енергії для MicroG не вплине негативно на час автономної роботи. Натисніть кнопку \"Продовжити\" та вимкніть оптимізацію." - Продовжити + Продовжити Підміна відеопотоків Підміняти відеопотоки клієнта, щоб уникнути проблем із відтворенням + Підроблені відео потоки + Підробка відео потоків клієнта для запобігання проблемам з відтворенням Підміна відеопотоків "Відеопотоки підмінено @@ -127,7 +142,7 @@ Second \"item\" text" "Відеопотоки не підмінено Відтворення може не працювати" - Вимкнення цієї опції може спричинити проблеми з відтворенням. + Вимкнення цього налаштування може спричинити проблеми з відтворенням. Клієнт за замовчуванням @@ -169,10 +184,11 @@ Second \"item\" text" Прапорці збережено Прапорці скинуто Прапорці скопійовано до буфера обміну - Реєструвати буфер протоколу - Журнали налагодження містять протобуфер - Журнали налагодження не містять протобуфер - "Увімкнення цього налаштування реєструватиме додаткові дані про макет, зокрема текст на екрані для деяких компонентів інтерфейсу. + Перезапустіть програму, щоб скористатися цією функцією + Журнал протоколу буфера + Журнали налагодження містять буфер протоколу + Журнали налагодження не містять буфер протоколу + "Увімкнення цього налаштування реєструватиме додаткові дані про макет, зокрема текст на екрані для деяких компонентів інтерфейсу. Це може допомогти визначити компоненти під час створення користувацьких фільтрів. @@ -206,8 +222,10 @@ Second \"item\" text" Стрічка Загальні Плеєр + Шорти Панель прогресу Керування жестами + Повернути дизлайк на YouTube Різне Відео Відновити старе меню налаштувань @@ -220,6 +238,9 @@ Second \"item\" text" Фонове відтворення Shorts увімкнено + Приховати полицю магазину автора + Полицю магазину автора під відеоплеєром приховано + Полиця магазину автора під відеоплеєром показується Приховати картки альбому Картки альбому приховано Картки альбому показуються @@ -229,6 +250,9 @@ Second \"item\" text" Приховати полицю фішок Полицю фішок приховано Полиця фішок показується + Приховати секцію коментарів під відео у стрічці Головної + Секцію коментарів під відео у стрічці Головної приховано + Секція коментарів під відео у стрічці Головної показується Приховати публікації спільноти Публікації спільноти приховано Публікації спільноти показуються @@ -256,14 +280,19 @@ Second \"item\" text" Приховати останні публікації Останні публікації приховано Останні публікації показуються + + Приховати кнопку \"Останні відео\" + Кнопку \"Останні відео\" приховано + Кнопка \"Останні відео\" показується Приховати \"Мікс плейлисти\" \"Мікс плейлисти\" приховано \"Мікс плейлисти\" показуються Приховати секцію фільмів Секцію фільмів приховано Секція фільмів показується - + Приховати кнопку \"Сповістити мене\" Кнопку \"Сповістити мене\" приховано Кнопка \"Сповістити мене\" показується @@ -288,13 +317,16 @@ Second \"item\" text" Приховати візуальний розділювач Візуальний розділювач приховано Візуальний розділювач відображається + Приховати результати вебпошуку + Результати вебпошуку приховано + Результати вебпошуку показуються + Приховати секцію \"Може сподобатися\" + Секцію \"Може сподобатися\" приховано + Секція \"Може сподобатися\" показується Приховати Дудли YouTube Анімацію Дудлів YouTube на логотипі приховано Анімація Дудлів YouTube на логотипі показується - "Дудли YouTube показуються кілька днів на рік. - -Якщо Дудл зараз показується у вашому регіоні, і це налаштування приховування ввімкнено, то панель фільтрів під рядком пошуку також буде приховано." Приховати панель каналу Панель каналу під відеоплеєром приховано Панель каналу під відеоплеєром показується @@ -311,10 +343,15 @@ Second \"item\" text" Інформаційні панелі приховано Інформаційні панелі показуються + This button usually appears in the video player for certain videos. --> Приховати кнопку \"Підписатися +\" Кнопку \"Підписатися +\" приховано Кнопка \"Підписатися +\" показується + + Приховати кнопку \"Повтор живого чату\" + Кнопку повтору живого чату в накладанні плеєра приховано + Кнопка повтору живого чату в накладанні плеєра показується Приховати медичні панелі Панелі про медицину приховано Панелі про медицину показуються @@ -330,6 +367,9 @@ Second \"item\" text" Приховати тимчасові реакції Тимчасові реакції приховано Тимчасові реакції показуються + Приховати назву відео + Назву відео в накладанні плеєра приховано + Назва відео в накладанні плеєра показується Приховати секцію \"Короткий переказ від ШІ\" Секцію короткого переказу відео, згенерованого ШІ, приховано Секція короткого переказу відео, згенерованого ШІ, показується @@ -342,33 +382,62 @@ Second \"item\" text" Приховати секцію \"Розділи\" Секцію \"Розділи\" приховано Секція \"Розділи\" показується - Приховати секцію \"Як створювався цей контент\" - Секцію \"Як створювався цей контент\" приховано - Секція \"Як створювався цей контент\" показується - Приховати очки голосів - Очки голосів приховано - Очки голосів показуються + Приховати \"Прогрес курсу\" + Секцію \"Прогрес курсу\" приховано + Секція \"Прогрес курсу\" показується + Приховати \"Огляд\" + Секції \"Огляд цього курсу\" та \"Послухайте подкаст\" приховано + Секції \"Огляд цього курсу\" та \"Послухайте подкаст\" показуються + Приховати \"Переглянути цей курс\" + Розділ \"Ознайомитися з цим курсом\" приховано + Секція \"Огляд цього курсу\" показується + Приховати секцію \"Послухайте подкаст\" + Секцію \"Послухайте подкаст\" приховано + Секція \"Послухайте подкаст\" показується Приховати секцію \"Послухайте подкаст\" Секцію \"Послухайте подкаст\" приховано Секція \"Послухайте подкаст\" показується Приховати рекомендовані посилання Секцію рекомендованих посилань приховано Секція рекомендованих посилань показується + Приховати секцію \"Рекомендовані місця\" + Секцію \"Рекомендовані місця\" приховано + Секція \"Рекомендовані місця\" показується Приховати рекомендовані відео Секцію рекомендованих відео приховано Секція рекомендованих відео показується + Увімкнути фільтр вилітаючого меню стрічки + Фільтр вилітаючого меню стрічки увімкнено + Фільтр вилітаючого меню стрічки вимкнено + Фільтр вилітаючого меню стрічки + Введіть назви вилітаючого меню для фільтрації, по одній на рядок + Приховати розділ \"Ігри\" + Розділ \"Ігри\" приховано + Розділ \"Ігри\" показується + Приховати секцію \"Як створювався цей контент\" + Секцію \"Як створювався цей контент\" приховано + Секція \"Як створювався цей контент\" показується + Приховати очки голосів + Очки голосів приховано + Очки голосів показуються Приховати секцію інформаційних карток Секцію інформаційних карток приховано Секція інформаційних карток показується Приховати секцію \"Основні поняття\" Секцію \"Основні поняття\" приховано Секція \"Основні поняття\" показується + Приховати розділ \"Музика\" + Розділ \"Музика\" приховано + Розділ \"Музика\" показується Приховати \"Підписатися\" Кнопку \"Підписатися\" приховано Кнопка \"Підписатися\" показується Приховати секцію \"Текст відео\" Секцію \"Текст відео\" приховано Секція \"Текст відео\" показується + Приховати розділ \"Тести\" + Розділ \"Тести\" приховано + Розділ \"Тести\" показується Опис відео Приховати або показувати компоненти опису відео Панель фільтрів @@ -387,6 +456,11 @@ Second \"item\" text" Показується в історії переглядів Сторінка каналу Приховати або показувати компоненти сторінки каналу + Увімкнути фільтр вкладок каналу + Фільтр вкладок каналу увімкнено + Фільтр вкладок каналу вимкнено + Фільтр вкладок каналу + Введіть назви вкладок каналу для фільтрації, по одній на рядок Приховати кнопку «Спільнота» Кнопку \"Спільнота\" приховано @@ -450,15 +524,15 @@ Second \"item\" text" Кількість переглядів показуються у стрічці та результатах пошуку "Обмеження: -• Полиці Shorts, сторінки каналів та результати пошуку можуть досі показувати кількість переглядів -• Ця функція не працює з автомобільним макетом інтерфейсу" +• Полиці Shorts, сторінки каналів та результати пошуку можуть досі показувати кількість переглядів. +• Ця функція не працює з автомобільним макетом інтерфейсу." Приховати час завантаження Час завантаження приховано у стрічці та результатах пошуку Час завантаження показується у стрічці та результатах пошуку "Обмеження: -• Полиці Shorts, сторінки каналів і результати пошуку можуть досі показувати час завантаження -• Ця функція не працює з автомобільним макетом інтерфейсу" +• Полиці Shorts, сторінки каналів і результати пошуку можуть досі показувати час завантаження. +• Ця функція не працює з автомобільним макетом інтерфейсу." Приховати контент за ключовими словами Приховати відео із результатів пошуку та стрічки за допомогою фільтрів ключових слів Приховати відео на головній @@ -481,7 +555,7 @@ Second \"item\" text" Про фільтр ключових слів "Головна/Підписки/Результати пошуку фільтруються, щоб приховати вміст, який відповідає ключовим фразам -Обмеження +Обмеження: • Shorts неможливо приховати за назвою каналу • Деякі компоненти інтерфейсу можуть не приховуватися • Пошук за ключовим словом може не показувати результатів" @@ -496,19 +570,12 @@ Second \"item\" text" Ключове слово приховає всі відео: %s - Приховати полицю магазину автора - Полицю магазину автора під відеоплеєром приховано - Полиця магазину автора під відеоплеєром показується Приховати банер магазину на кінцевому екрані Банер магазину на кінцевому екрані приховано Банер магазину на кінцевому екрані показується Приховати повноекранну рекламу - "Повноекранну рекламу приховано - -Ця функція доступна тільки для старих пристроїв" + Повноекранну рекламу приховано Повноекранна реклама показується - - Приховувати повноекранну рекламу працює тільки зі старими пристроями Приховати загальну рекламу Загальну рекламу приховано Загальна реклама показується @@ -518,6 +585,9 @@ Second \"item\" text" Приховати \"Містить пряму рекламу\" Мітку \"Містить пряму рекламу\" приховано Мітка \"Містить пряму рекламу\" показується + Приховати спливаючу рекламу плеєра + Спливаючу рекламу плеєра приховано + Спливаюча реклама плеєра показується Приховати картки само спонсорства Картки само спонсорства приховано Картки само спонсорства показуються @@ -525,23 +595,18 @@ Second \"item\" text" Посилання на покупки в описі відео приховано Посилання на покупки в описі відео показуються Приховати банер \"Перегляд товарів\" - Банер перегляду товарів у інтерфейсі відеоплеєра приховано - Банер перегляду товарів у інтерфейсі відеоплеєра показується - Приховати результати вебпошуку - Результати вебпошуку приховано - Результати вебпошуку показуються - - - Приховати рекламу YouTube Premium - Рекламу YouTube Premium під відеоплеєром приховано - Реклама YouTube Premium під відеоплеєром показується + Банер перегляду товарів у накладанні плеєра приховано + Банер перегляду товарів у накладанні плеєра показується + Приховати рекламу YouTube Premium + Рекламу YouTube Premium приховано + Реклама YouTube Premium показується Приховати відеорекламу Відеорекламу приховано Відеореклама показується - + URL-адресу скопійовано до буфера URL-адресу з міткою часу скопійовано до буфера Кнопка копіювання URL відео @@ -557,10 +622,10 @@ Second \"item\" text" Діалогове вікно про неприйнятний контент буде показуватися Це не обходить вікові обмеження, а просто приймає їх автоматично. - - Вимкнути вікно \"Увійти на телевізорі\" - Спливаюче вікно \"Увійти на телевізорі\" вимкнено - Спливаюче вікно \"Увійти на телевізорі\" увімкнено + + Вимкнути вікно \"Увійти на телевізорі\" + Спливаюче вікно \"Увійти на телевізорі\" вимкнено + Спливаюче вікно \"Увійти на телевізорі\" увімкнено Вимкнути пропуск розділу подвійним натисканням @@ -593,10 +658,10 @@ Second \"item\" text" Жест для точного покадрового перемотування вимкнено Жест для точного покадрового перемотування ввімкнено - - Увімкнути перемотку натисканням - Перемотку натисканням на смугу прогресу ввімкнено - Перемотку натисканням на смугу прогресу вимкнено + + Увімкнути перемотку натисканням + Перемотку натисканням на смугу прогресу ввімкнено + Перемотку натисканням на смугу прогресу вимкнено Зміна яскравості жестом @@ -677,7 +742,7 @@ Second \"item\" text" Кнопку \"Коментарі\" приховано Кнопка \"Коментарі\" показується + This button usually appears on live streamed videos. --> Приховати \"Поскаржитися\" Кнопку \"Поскаржитися\" приховано Кнопка \"Поскаржитися\" показується @@ -690,7 +755,7 @@ Second \"item\" text" Кнопку \"Завантажити\" приховано Кнопка \"Завантажити\" показується + This button usually appears on videos uploaded by the logged-in user. --> Приховати \"Голосувати\" Кнопку \"Голосувати\" приховано Кнопка \"Голосувати\" показується @@ -703,7 +768,7 @@ Second \"item\" text" Кнопку \"Дякую\" приховано Кнопка \"Дякую\" показується + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Приховати \"Запитати\" Кнопку \"Запитати\" приховано Кнопка \"Запитати\" показується @@ -711,6 +776,7 @@ Second \"item\" text" Приховати \"Створити кліп\" Кнопку \"Створити кліп\" приховано Кнопка \"Створити кліп\" показується + Приховування може не працювати для деяких облікових записів користувачів. Приховати \"Покупки\" Кнопку \"Покупки\" приховано @@ -720,13 +786,13 @@ Second \"item\" text" Кнопку \"Зберегти\" приховано Кнопка \"Зберегти\" показується - + Кнопки панелі навігації Приховати або змінити кнопки на панелі навігації Приховати \"Головна\" - Кнопку \"Головна\" приховано на панелі навігації - Кнопка \"Головна\" показується на панелі навігації + Кнопку \"Головна\" приховано + Кнопка \"Головна\" показується Приховати \"Shorts\" Кнопку \"Shorts\" приховано на панелі навігації @@ -744,26 +810,44 @@ Second \"item\" text" Кнопка \"Сповіщення\" показується на панелі навігації Замінити \"Створити\" на \"Сповіщення\" - "Кнопку \"Створити\" замінено кнопкою \"Сповіщення\" - -Примітка: Увімкнення цього параметру також примусово приховує відеорекламу" + Кнопку \"Створити\" замінено кнопкою \"Сповіщення\" Кнопку \"Створити\" не замінено кнопкою \"Сповіщення\" - "Вимкнення цього параметра також вимкне блокування реклами в Shorts. - -Якщо зміна цього параметра не діє, спробуйте перейти в режим анонімного перегляду." + Якщо зміна цього налаштування не дає результату, спробуйте перейти в режим анонімного перегляду. Приховати підписи кнопок навігації Підписи кнопок навігації приховано Підписи кнопок навігації показуються + Увімкнути вузькі кнопки навігації + Відстань між кнопками навігації вузька + Відстань між кнопками навігації нормальна + Увімкнути анімації панелі навігації + Навігаційні переходи анімовані + Навігаційні переходи не анімовані Вимкнути напівпрозорість рядка стану Рядок стану непрозорий Рядок стану непрозорий або напівпрозорий - На деяких пристроях увімкнення цієї функції може змінити панель навігації системи на прозору. + "Обмеження: +• У верхній частині відеоплеєра може з'явитися чорна смуга. +• На деяких пристроях увімкнення цієї функції може змінити системну панель навігації на прозору." Вимкнути напівпрозорість світлої панелі Панель навігації світлого режиму непрозора Панель навігації світлого режиму непрозора або напівпрозора Вимкнути напівпрозорість темної панелі Панель навігації темного режиму непрозора Панель навігації темного режиму непрозора або напівпрозора + Панель інструментів + Приховати або змінити компоненти панелі інструментів + Приховати кнопку \"Створити\" + Кнопку \"Створити\" приховано + Кнопка \"Створити\" показується + Приховати кнопку \"Сповіщення\" + Кнопку \"Сповіщення\" приховано + Кнопка \"Сповіщення\" показується + Приховати кнопку пошуку + Кнопку пошуку приховано + Кнопка пошуку показується. + Увімкнути широку панель пошуку + Широка панель пошуку увімкнена + Широка панель пошуку вимкнена Висувне меню @@ -838,6 +922,12 @@ Second \"item\" text" Приховати кнопку \"Трансляція\" Кнопку \"Трансляція\" у відеоплеєрі приховано Кнопка \"Трансляція\" у відеоплеєрі показується + Приховати кнопку \"Згорнути\" + Кнопку \"Згорнути\" приховано + Кнопка \"Згорнути\" показується + Приховати кнопку повноекранного режиму + Кнопку повноекранного режиму приховано + Кнопка повноекранного режиму показується Приховати фон кнопок керування плеєром Фон кнопок керування плеєром приховано Фон кнопок керування плеєром показується @@ -846,9 +936,9 @@ Second \"item\" text" Кнопки попереднього та наступного відео показуються - Приховати картки на кінцевому екрані - Картки на кінцевому екрані приховано - Картки на кінцевому екрані показуються + Приховати картки на кінцевому екрані + Картки на кінцевому екрані приховано + Картки на кінцевому екрані показуються Вимкнути кінематографічне освітлення @@ -873,10 +963,16 @@ Second \"item\" text" Приховати панель прогресу прев\'ю відео Панель прогресу у прев\'ю відео приховано Панель прогресу у прев\'ю відео показується + Увімкнути велику смугу прокрутки в повноекранному режимі + Повноекранна смуга прокрутки великого розміру + Повноекранна смуга прокрутки нормального розміру Плеєр Shorts Приховати або показувати компоненти плеєра Shorts + Приховати Shorts на сторінці каналу + Приховано на сторінці каналу + Показується на сторінці каналу Приховати Shorts у стрічці Приховано в домашній стрічці та пов’язаних відео @@ -888,12 +984,21 @@ Second \"item\" text" Приховати Shorts у підписках Приховано в стрічці підписок Показуються в стрічці підписок + Приховати Shorts в описі відео + Приховано в описі відео + Показується в описі відео Приховати Shorts в історії Приховано в історії переглядів Показуються в історії переглядів - Приховати мітку \"Автопереклад\" - Мітку автоматичного дубляжу приховано - Мітка автоматичного дубляжу показується + Приховати кнопку ШІ + Кнопку ШІ приховано + Кнопка ШІ показується + Приховати мітку \"Авто дублювання\" + Мітка \"Авто дублювання\" прихована + Мітка \"Авто дублювання\" показана + Приховати мітку \"Авто дублювання\" + Мітка \"Авто дублювання\" прихована + Мітка \"Авто дублювання\" показана Приховати \"Суперподяка\" Кнопку \"Суперподяка\" приховано Кнопка \"Суперподяка\" показується @@ -952,6 +1057,7 @@ Second \"item\" text" Приховати кнопку \"Використати цей шаблон\" Кнопку \"Використати цей шаблон\" приховано Кнопка \"Використати цей шаблон\" показується + Приховати анімацію фонтану Анімацію фонтану біля кнопки \"Лайк\" приховано Анімація фонтану біля кнопки \"Лайк\" показується @@ -994,7 +1100,12 @@ Second \"item\" text" Панель навігації приховано Панель навігації показується - + + Приховати попередній перегляд автовідтворення + Попередній перегляд автовідтворення приховано + Попередній перегляд автовідтворення показано + + Приховати пропоноване відео на кінцевому екрані "Пропоноване відео на кінцевому екрані приховано, коли автоматичне відтворення вимкнено. @@ -1013,9 +1124,9 @@ Second \"item\" text" Мітка часу відео над панеллю прогресу показується - Приховати спливаючі панелі плеєра - Автоматичні спливаючі панелі плеєра приховано, такі як список відтворення чи чат - Автоматичні спливаючі панелі плеєра показуються + Приховати панелі плеєра що спливають + Панелі плеєра що спливають приховано + Панелі плеєра що спливають показано Вийти з повноекранного режиму в кінці відео @@ -1044,6 +1155,7 @@ Second \"item\" text" Оновіть відео, щоб проголосувати за допомогою Return YouTube Dislike Приховано власником + Повернути дизлайк на YouTube Дизлайки показуються Дизлайки не показуються Показувати дизлайки в Shorts @@ -1064,6 +1176,7 @@ Second \"item\" text" Показувати тост, якщо API не доступний Тост показується, якщо Return YouTube Dislike не доступний Тост не показується, якщо Return YouTube Dislike не доступний + ReturnYouTubeDislike.com Дані надаються через API Return YouTube Dislike. Натисніть тут, щоб дізнатися більше Статистика API ReturnYouTubeDislike цього пристрою @@ -1083,25 +1196,8 @@ Second \"item\" text" Обмеження швидкості клієнта виявлено %d разів %d мілісекунд - - Широка панель пошуку - Широку панель пошуку ввімкнено\n\nПримітка: Це також приховує значок YouTube та кнопку пошуку - Широку панель пошуку вимкнено - - - Увімкнути мініатюри високої якості - Мініатюри панелі прогресу під час перемотування мають високу якість - Мініатюри панелі прогресу під час перемотування мають середню якість - "Це також відновить мініатюри в прямих трансляціях, які не мають мініатюр при перемотуванні. - -Мініатюри при перемотуванні матимуть ту саму якість, що й поточне відео. - -Ця функція найкраще працює з якістю відео 720p або нижчою та при використанні дуже швидкого підключення до Інтернету." - Відновити старі мініатюри - Мініатюри під час перемотування показуються у мінівікні над панеллю прогресу - Мініатюри під час перемотування показуються в повноекранному режимі - + SponsorBlock Увімкнути SponsorBlock SponsorBlock - це краудсорсингова система для пропускання дратівливих частин відео на YouTube Налаштувати зовнішній вигляд @@ -1310,6 +1406,7 @@ Second \"item\" text" Непрозорість: Колір: Про інтеграцію + sponsor.ajay.app Дані надаються через API SponsorBlock. Натисніть тут, щоб дізнатися більше та побачити завантаження для інших платформ @@ -1339,8 +1436,6 @@ Second \"item\" text" Підмінити версію застосунку на 20.13.41 - Відновити розгорнуту панель дій відео 20.05.46 - Відновити функціональність транскрипції - 19.35.36 - Відновити старі іконки плеєра Shorts - 19.01.34 - Відновити старі іконки панелі навігації Змінити початкову сторінку @@ -1362,6 +1457,7 @@ Second \"item\" text" Списки відтворення Пошук на YouTube Покупки + Шорти Спорт Підписки Популярне @@ -1427,6 +1523,11 @@ Second \"item\" text" Приховати кнопки накладання Кнопки накладання приховано Кнопки накладання показуються + Приховати кнопки розгортання та закриття + "Кнопки приховані + +Свайпніть, щоб розгорнути або закрити" + Кнопки розгортання та закриття показані Приховати підтексти Підтексти в мініплеєрі приховано Підтексти в мініплеєрі показуються @@ -1445,8 +1546,9 @@ Second \"item\" text" Екран завантаження макета матиме градієнтне тло Екран завантаження макета матиме суцільне тло Стиль заставки - Кольорова - Чорно-біла + Вимкнено + Кольорова + Чорно-біла Увімкнути користувацький колір Показується користувацький колір смуги прогресу Показується оригінальний колір смуги прогресу @@ -1456,11 +1558,17 @@ Second \"item\" text" Значення вторинного кольору смуги прогресу Недійсне значення кольору смуги прогресу - + + YouTube ReVanced + YT ReVanced + YT + Логотип заголовка Стандартний Звичайний + Преміум + ReVanced ReVanced мінімальний Користувацький @@ -1485,6 +1593,7 @@ Second \"item\" text" DeArrow та Оригінальні прев\'ю DeArrow та Стоп-кадри Стоп-кадри + DeArrow "DeArrow надає прев'ю для відео YouTube, які створюються користувачами. Ці прев'ю часто більш релевантні, ніж ті, що надає YouTube Якщо увімкнено, серверу API надсилатимуться лише посилання на відео, і більше жодних інших даних. Якщо відео не має прев'ю DeArrow, то відображаються оригінальні прев'ю або стоп-кадри @@ -1528,7 +1637,11 @@ Second \"item\" text" Повторення відео ввімкнено Повторення відео вимкнено - + + Пауза під час переривання звуку + Відтворення призупиняється, коли відтворюється інше аудіо (наприклад, навігація) + Гучність зменшується під час відтворення інших аудіофайлів + Підміняти розміри пристрою "Розміри пристрою підмінено @@ -1536,8 +1649,8 @@ Second \"item\" text" Можуть стати доступні вищі якості відео, але можлива затримка відтворення, швидше розряджання батареї та інші невідомі побічні ефекти" "Розміри пристрою не підмінено -Ввімкнення цієї опції може розблокувати вищі якості відео" - Увімкнення цієї опції може спричинити затримки відтворення відео, швидше розряджання батареї та інші невідомі побічні ефекти. +Увімкнення цієї функції може розблокувати вищу якість відео" + Увімкнення цієї функції може призвести до заїкання відтворення відео, погіршення часу роботи від акумулятора та невідомих побічних ефектів. Тактильна віддача @@ -1551,6 +1664,9 @@ Second \"item\" text" Вимкнути вібрацію скасування перемотування Вібрацію скасування перемотування вимкнено Вібрацію скасування перемотування ввімкнено + Вимкнути вібрацію при натисканні та утриманні + Вібрацію при натисканні та утриманні вимкнено + Вібрацію при натисканні та утриманні ввімкнено Вимкнути вібрацію при масштабуванні Вібрацію при масштабуванні вимкнено Вібрацію при масштабуванні ввімкнено @@ -1646,6 +1762,11 @@ Second \"item\" text" Розширене меню якості відео показується Розширене меню якості відео не показується + + Приховати параметри Преміум якості + Параметри Преміум якості приховані + Параметри Преміум якості показані + Увімкнути перемотку пересуванням Перемотку пересуванням увімкнено\n\nВідновлено поведінку старого інтерфейсу \"Проведіть пальцем, щоб перемотати\" @@ -1675,8 +1796,13 @@ Second \"item\" text" - + + YT Music ReVanced + Music ReVanced + Музика + + Інформація Реклама Загальні diff --git a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml index 3a40645452..6a18623ecc 100644 --- a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml @@ -27,18 +27,55 @@ Second \"item\" text" + بولڈ آئیکنز کو غیر فعال کریں + آئیکنز بولڈ نہیں ہیں + آئیکنز بولڈ ہیں + جی ایم ایس کور + جی ایم ایس کور سے متعلق سیٹنگز + جی ایم ایس کور اپ ڈیٹس چیک کریں + اپ ڈیٹس چیک کرنے کی سہولت فعال ہے + اپ ڈیٹس کی جانچ پڑتال غیر فعال ہے + GmsCore کی ترتیبات کھولیں + GmsCore کی ترتیبات + MicroG GmsCore انسٹال نہیں ہے۔ اسے انسٹال کریں۔ + کارروائی درکار ہے + MicroG GmsCore اپ ڈیٹس کی جانچ میں ناکامی + MicroG GmsCore کا ایک نیا ورژن (%1$s) دستیاب ہے۔ فی الحال، آپ ورژن %2$s استعمال کر رہے ہیں۔ + "MicroG GmsCore کو پس منظر میں چلانے کی اجازت نہیں ہے۔ + +اپنے فون کے لیے \"میری ایپ کو نہ ماریں\" گائیڈ پر عمل کریں، اور ہدایات کو اپنی MicroG انسٹالیشن پر لاگو کریں۔ + +یہ ایپ کے کام کرنے کے لیے ضروری ہے۔" + ویب سائٹ کھولیں + منسوخ کریں + "مسائل سے بچنے کے لیے MicroG GmsCore کی بیٹری آپٹیمائزیشنز کو غیر فعال کیا جانا چاہیے۔ + +MicroG کے لیے بیٹری آپٹیمائزیشنز کو غیر فعال کرنے سے بیٹری کے استعمال پر منفی اثر نہیں پڑے گا۔ + +جاری رکھیں بٹن پر ٹیپ کریں اور آپٹیمائزیشن کی تبدیلیوں کی اجازت دیں۔" + جاری رکھیں - + + اس خصوصیت کو استعمال کرنے کے لیے ایپ کو دوبارہ شروع کریں + پروٹوکول بفر لاگ کریں + ڈیبگ لاگز میں پروٹو بفر شامل ہے + ڈیبگ لاگز میں پروٹو بفر شامل نہیں ہے + "اس سیٹنگ کو فعال کرنے سے اضافی لے آؤٹ ڈیٹا لاگ ہو جائے گا، جس میں کچھ UI کمپونینٹس کے لیے آن-اسکرین ٹیکسٹ بھی شامل ہے۔ + +یہ حسب ضرورت فلٹرز بناتے وقت کمپونینٹس کی شناخت میں مدد کر سکتا ہے۔ + +تاہم، اسے فعال کرنے سے کچھ صارف کا ڈیٹا جیسے کہ آپ کا IP ایڈریس بھی لاگ ہو جائے گا۔" + @@ -48,40 +85,135 @@ Second \"item\" text" - + کرییٹر اسٹور شیلف چھپائیں + ویڈیو پلیئر کے نیچے کرییٹر اسٹور شیلف چھپا ہوا ہے + ویڈیو پلیئر کے نیچے کرییٹر اسٹور شیلف دکھایا گیا ہے + ہوم فیڈ میں ویڈیوز کے نیچے تبصرے کا سیکشن چھپائیں + ہوم فیڈ میں ویڈیوز کے نیچے تبصرے کا سیکشن چھپا ہوا ہے + ہوم فیڈ میں ویڈیوز کے نیچے تبصرے کا سیکشن دکھایا گیا ہے + + \'تازہ ترین ویڈیوز\' بٹن چھپائیں + تازہ ترین ویڈیوز کا بٹن چھپا ہوا ہے + تازہ ترین ویڈیوز کا بٹن دکھایا گیا ہے + + ویب تلاش کے نتائج چھپائیں + ویب تلاش کے نتائج چھپے ہوئے ہیں + ویب تلاش کے نتائج دکھائے گئے ہیں + \'آپ کو پسند آ سکتا ہے\' سیکشن چھپائیں + \'آپ کو پسند آ سکتا ہے\' سیکشن چھپا ہوا ہے + \'آپ کو پسند آ سکتا ہے\' سیکشن دکھایا گیا ہے + This button usually appears in the video player for certain videos. --> + + \'لائیو چیٹ ری پلے\' بٹن چھپائیں + پلیئر اوورلے میں لائیو چیٹ ری پلے بٹن چھپا ہوا ہے + پلیئر اوورلے میں لائیو چیٹ ری پلے بٹن دکھایا گیا ہے + ویڈیو کا عنوان چھپائیں + پلیئر اوورلے میں ویڈیو کا عنوان چھپا ہوا ہے + پلیئر اوورلے میں ویڈیو کا عنوان دکھایا گیا ہے + \'کورس کی پیشرفت\' چھپائیں + کورس کی پیشرفت کا سیکشن چھپا ہوا ہے + کورس کی پیشرفت کا سیکشن دکھایا گیا ہے + دریافت کریں چھپائیں + اس کورس کو دریافت کریں اور پوڈ کاسٹ سیکشن چھپے ہوئے ہیں + اس کورس کو دریافت کریں اور پوڈ کاسٹ سیکشن دکھائے گئے ہیں + \'اس کورس کو دریافت کریں\' چھپائیں + اس کورس کو دریافت کرنے کا سیکشن چھپا ہوا ہے + اس کورس کو دریافت کرنے کا سیکشن دکھایا گیا ہے + \'پوڈ کاسٹ دریافت کریں\' چھپائیں + پوڈ کاسٹ دریافت کرنے کا سیکشن چھپا ہوا ہے + پوڈ کاسٹ دریافت کرنے کا سیکشن دکھایا گیا ہے + \'نمایاں مقامات\' چھپائیں + نمایاں مقامات کا سیکشن چھپا ہوا ہے + نمایاں مقامات کا سیکشن دکھایا گیا ہے + فیڈ فلی آؤٹ مینو فلٹر کو فعال کریں + فیڈ فلی آؤٹ مینو فلٹر فعال ہے + فیڈ فلی آؤٹ مینو فلٹر غیر فعال ہے + فیڈ فلی آؤٹ مینو فلٹر + فلٹر کرنے کے لیے فلی آؤٹ مینو کے نام درج کریں، ہر ایک علیحدہ لائن پر + گیمنگ چھپائیں + گیمنگ سیکشن چھپا ہوا ہے + گیمنگ سیکشن دکھایا گیا ہے + موسیقی چھپائیں + موسیقی کا سیکشن چھپا ہوا ہے + موسیقی کا سیکشن دکھایا گیا ہے + کوئزز چھپائیں + کوئزز کا سیکشن چھپا ہوا ہے + کوئزز کا سیکشن دکھایا گیا ہے + چینل ٹیب فلٹر کو فعال کریں + چینل ٹیب فلٹر فعال ہے + چینل ٹیب فلٹر غیر فعال ہے + چینل ٹیب فلٹر + فلٹر کرنے کے لیے چینل ٹیب کے نام درج کریں، ہر ایک علیحدہ لائن پر + "حدود: +• Shorts شیلف، چینل کے صفحات، اور تلاش کے نتائج میں اب بھی دیکھنے کی گنتی دکھا سکتی ہے۔ +• یہ خصوصیت آٹوموٹیو فارم فیکٹر کے ساتھ کام نہیں کرتی ہے۔" + "حدود: +• Shorts شیلف، چینل کے صفحات، اور تلاش کے نتائج میں اب بھی اپ لوڈ کا وقت دکھا سکتے ہیں۔ +• یہ خصوصیت آٹوموٹیو فارم فیکٹر کے ساتھ کام نہیں کرتی ہے۔" + "ہوم/سبسکرپشنز/تلاش کے نتائج کو کی ورڈ جملوں سے مماثل مواد کو چھپانے کے لیے فلٹر کیا جاتا ہے + +حدود: +• Shorts کو چینل کے نام سے چھپایا نہیں جا سکتا +• کچھ UI اجزاء چھپائے نہیں جا سکتے +• کسی کی ورڈ کو تلاش کرنے سے کوئی نتیجہ نہیں دکھایا جا سکتا" - + فل سکرین اشتہارات چھپے ہوئے ہیں + پلیئر پاپ اپ اشتہارات چھپائیں + پلیئر پاپ اپ اشتہارات چھپے ہوئے ہیں + پلیئر پاپ اپ اشتہارات دکھائے گئے ہیں + پلیئر اوورلے میں مصنوعات کا بینر چھپا ہوا ہے + پلیئر اوورلے میں مصنوعات کا بینر دکھایا گیا ہے + YouTube Premium پروموشنز چھپائیں + YouTube Premium پروموشنز چھپے ہوئے ہیں + YouTube Premium پروموشنز دکھائے گئے ہیں - - + + یو آر ایل کلپ بورڈ پر کاپی ہو گیا + ٹائم اسٹیمپ کے ساتھ یو آر ایل کاپی ہو گیا + ویڈیو یو آر ایل کاپی کرنے کا بٹن دکھائیں + ویڈیو یو آر ایل کاپی کرنے کا بٹن دکھایا گیا ہے۔ ویڈیو یو آر ایل کاپی کرنے کے لیے تھپتھپائیں۔ ٹائم اسٹیمپ کے ساتھ کاپی کرنے کے لیے دبا کر رکھیں + ویڈیو یو آر ایل کاپی کرنے کا بٹن نہیں دکھایا گیا + ٹائم اسٹیمپ یو آر ایل کاپی کرنے کا بٹن دکھائیں + ٹائم اسٹیمپ یو آر ایل کاپی کرنے کا بٹن دکھایا گیا ہے۔ ٹائم اسٹیمپ کے ساتھ ویڈیو یو آر ایل کاپی کرنے کے لیے تھپتھپائیں۔ ٹائم اسٹیمپ کے بغیر کاپی کرنے کے لیے دبا کر رکھیں + ٹائم اسٹیمپ یو آر ایل کاپی کرنے کا بٹن نہیں دکھایا گیا + - + + \'ٹی وی میں سائن ان کریں\' پاپ اپ کو غیر فعال کریں + ٹی وی میں سائن ان کریں پاپ اپ غیر فعال ہے + ٹی وی میں سائن ان کریں پاپ اپ فعال ہے + - + + تلاش کے لیے تھپتھپانے کو فعال کریں + تلاش کے لیے تھپتھپانا فعال ہے + تلاش کے لیے تھپتھپانا غیر فعال ہے + @@ -89,25 +221,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + کچھ صارف اکاؤنٹس کے لیے چھپانا کام نہیں کر سکتا ہے۔ - + + نیویگیشن بٹن + نیویگیشن بار کے بٹن چھپائیں یا تبدیل کریں + ہوم چھپائیں + ہوم بٹن چھپا ہوا ہے + ہوم بٹن دکھایا گیا ہے + Shorts چھپائیں + Shorts بٹن چھپا ہوا ہے + Shorts بٹن دکھایا گیا ہے + تخلیق کریں چھپائیں + تخلیق کریں بٹن چھپا ہوا ہے + تخلیق کریں بٹن دکھایا گیا ہے + سبسکرپشنز چھپائیں + سبسکرپشنز کا بٹن چھپا ہوا ہے + سبسکرپشنز کا بٹن دکھایا گیا ہے + اطلاعات چھپائیں + اطلاعات کا بٹن چھپا ہوا ہے + اطلاعات کا بٹن دکھایا گیا ہے + تخلیق کریں کو اطلاعات کے ساتھ تبدیل کریں + تخلیق کریں بٹن کو اطلاعات کے بٹن سے تبدیل کر دیا گیا ہے + تخلیق کریں بٹن کو اطلاعات کے بٹن سے تبدیل نہیں کیا گیا ہے + اگر اس ترتیب کو تبدیل کرنے سے اثر نہیں ہوتا ہے، تو خفیہ موڈ پر سوئچ کرنے کی کوشش کریں۔ + نیویگیشن بٹن کے لیبل چھپائیں + لیبل چھپے ہوئے ہیں + لیبل دکھائے گئے ہیں + تنگ نیویگیشن بٹن فعال کریں + نیویگیشن بٹنوں کے درمیان فاصلہ تنگ ہے + نیویگیشن بٹنوں کے درمیان فاصلہ عام ہے + نیویگیشن بار کی اینیمیشنز فعال کریں + نیویگیشن ٹرانزیشنز اینیمیٹڈ ہیں + نیویگیشن ٹرانزیشنز اینیمیٹڈ نہیں ہیں + ٹرانسلوسینٹ اسٹیٹس بار کو غیر فعال کریں + اسٹیٹس بار غیر شفاف ہے + اسٹیٹس بار غیر شفاف یا ٹرانسلوسینٹ ہے + "حدود: +• ویڈیو پلیئر کے اوپر ایک کالی پٹی ظاہر ہو سکتی ہے۔ +• کچھ آلات پر، اس خصوصیت کو فعال کرنے سے سسٹم نیویگیشن بار شفاف ہو سکتا ہے۔" + ہلکی ٹرانسلوسینٹ بار کو غیر فعال کریں + لائٹ موڈ نیویگیشن بار غیر شفاف ہے + لائٹ موڈ نیویگیشن بار غیر شفاف یا ٹرانسلوسینٹ ہے + گہری ٹرانسلوسینٹ بار کو غیر فعال کریں + ڈارک موڈ نیویگیشن بار غیر شفاف ہے + ڈارک موڈ نیویگیشن بار غیر شفاف یا ٹرانسلوسینٹ ہے + ٹول بار + ٹول بار کے اجزاء چھپائیں یا تبدیل کریں + تخلیق کریں بٹن چھپائیں + تخلیق کریں بٹن چھپا ہوا ہے + تخلیق کریں بٹن دکھایا گیا ہے + اطلاعات بٹن چھپائیں + اطلاعات بٹن چھپا ہوا ہے + اطلاعات بٹن دکھایا گیا ہے + تلاش بٹن چھپائیں + تلاش بٹن چھپا ہوا ہے + تلاش بٹن دکھایا گیا ہے۔ + وسیع تلاش بار فعال کریں + وسیع تلاش بار فعال ہے + وسیع تلاش بار غیر فعال ہے @@ -126,25 +315,67 @@ Second \"item\" text" + سمیٹیں بٹن چھپائیں + سمیٹیں بٹن چھپا ہوا ہے + سمیٹیں بٹن دکھایا گیا ہے + فل سکرین بٹن چھپائیں + فل سکرین بٹن چھپا ہوا ہے + فل سکرین بٹن دکھایا گیا ہے + + + اختتامی سکرین کارڈز چھپائیں + اختتامی سکرین کارڈز چھپے ہوئے ہیں + اختتامی سکرین کارڈز دکھائے گئے ہیں - + فل سکرین بڑے سییک بار کو فعال کریں + فل سکرین سییک بار بڑا ہے + فل سکرین سییک بار عام سائز کا ہے + چینل کے صفحے میں Shorts چھپائیں + چینل کے صفحے میں چھپا ہوا ہے + چینل کے صفحے میں دکھایا گیا ہے + ویڈیو کی تفصیل میں Shorts چھپائیں + ویڈیو کی تفصیل میں چھپا ہوا ہے + ویڈیو کی تفصیل میں دکھایا گیا ہے + اے آئی بٹن چھپائیں + اے آئی بٹن چھپا ہوا ہے + اے آئی بٹن دکھایا گیا ہے + \'خودکار طور پر ڈب کیا گیا\' لیبل چھپائیں + خودکار طور پر ڈب کیا گیا لیبل چھپا ہوا ہے + خودکار طور پر ڈب کیا گیا لیبل دکھایا گیا ہے + - + + آٹو پلے پیش نظارہ چھپائیں + آٹو پلے پیش نظارہ چھپا ہوا ہے + آٹو پلے پیش نظارہ دکھایا گیا ہے + + + اختتامی سکرین پر تجویز کردہ ویڈیو چھپائیں + "جب آٹو پلے بند ہو تو اختتامی سکرین پر تجویز کردہ ویڈیو چھپی رہتی ہے + +آٹو پلے کو YouTube کی ترتیبات میں تبدیل کیا جا سکتا ہے: +ترتیبات → پلے بیک → اگلی ویڈیو کو خود بخود چلائیں" + اختتامی سکرین پر تجویز کردہ ویڈیو دکھایا گیا ہے + - + + پلیئر پاپ اپ پینلز چھپائیں + پلیئر پاپ اپ پینلز پوشیدہ ہیں + پلیئر پاپ اپ پینلز دکھائے جاتے ہیں + @@ -155,10 +386,12 @@ Second \"item\" text" - - + صرف میوزک ویڈیوز میں استعمال کے لیے۔ میوزک ویڈیوز کے ایسے حصے جن میں موسیقی نہیں ہے اور جو کسی دوسری زمرہ میں شامل نہیں ہیں۔ + سیگمنٹ جمع نہیں کر سکتا: %s + "سیگمنٹ جمع نہیں کر سکتا۔ +پہلے سے موجود ہے" @@ -170,7 +403,11 @@ Second \"item\" text" - + + غیر فعال + رنگ + سیاہ اور سفید + @@ -187,7 +424,11 @@ Second \"item\" text" - + + تھپتھپائیں اور دبا کر رکھیں ہاپٹکس کو غیر فعال کریں + تھپتھپائیں اور دبا کر رکھیں ہاپٹکس غیر فعال ہے + تھپتھپائیں اور دبا کر رکھیں ہاپٹکس فعال ہے + @@ -200,6 +441,11 @@ Second \"item\" text" + + پریمیم کوالٹی کے اختیارات چھپائیں + پریمیم کوالٹی کے اختیارات چھپے ہوئے ہیں + پریمیم کوالٹی کے اختیارات دکھائے گئے ہیں + @@ -207,7 +453,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml index 3a40645452..9f72f88bb7 100644 --- a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml +++ b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml @@ -27,18 +27,43 @@ Second \"item\" text" + Qalin ikonlarni o\'chirish + Ikonkalar qalin emas + Ikonkalar qalin + GmsCore + GmsCorega oid sozlamalar + GmsCore yangilanishlarini tekshirish + Yangilanishlarni tekshirish yoqilgan + Yangilanishlarni tekshirish o\'chirilgan + GmsCore sozlamalarini ochish + GmsCore sozlamalari + MicroG GmsCore o\'rnatilmagan. O\'rnating. + Harakat talab qilinadi + MicroG GmsCore yangilanishlarini tekshirib bo\'lmadi + MicroG GmsCore’ning yangi versiyasi (%1$s) mavjud. Hozirda siz %2$s versiyasidan foydalanmoqdasiz. + "MicroG GmsCore fon rejimida ishlashga ruxsatga ega emas.\n\nTelefoningiz uchun \"Ilovamni o'ldirmang\" qo'llanmasiga amal qiling va ko'rsatmalarni MicroG o'rnatishingizga qo'llang.\n\nBu ilova ishlashi uchun talab qilinadi." + Veb-saytni ochish + Bekor qilish + "Muammolarni oldini olish uchun MicroG GmsCore batareyani optimallashtirish o'chirilishi kerak.\n\nMicroG uchun batareya optimallashtirishni o'chirish batareya quvvatiga salbiy ta'sir ko'rsatmaydi.\n\nDavom etish tugmasini bosing va optimallashtirish o'zgarishlariga ruxsat bering." + Davom etish - + + Ushbu funksiyadan foydalanish uchun ilovani qayta ishga tushiring. + Protokol buferini jurnalga kiritish + Disk raskadrovka jurnallarida protobuffer mavjud + Disk raskadrovka jurnallarida protobuffer mavjud emas + "Ushbu sozlamani yoqish qo'shimcha joylashuv ma'lumotlarini, shu jumladan ba'zi UI komponentlari uchun ekrandagi matnni qayd etadi.\n\nBu maxsus filtrlarni yaratishda komponentlarni aniqlashga yordam beradi.\n\nBiroq, buni yoqish sizning IP manzilingiz kabi ba'zi foydalanuvchi ma'lumotlarini ham qayd etadi." + @@ -48,40 +73,135 @@ Second \"item\" text" - + Muallif doʻkon tokchasini yashirish + Video pleer ostidagi muallif doʻkon tokchasi yashirilgan + Video pleer ostidagi muallif doʻkon tokchasi koʻrsatilgan + Bosh sahifa tasmasidagi videolar ostidagi izohlar boʻlimini yashirish + Bosh sahifa tasmasidagi videolar ostidagi izohlar boʻlimi yashirilgan + Bosh sahifa tasmasidagi videolar ostidagi izohlar boʻlimi koʻrsatilgan + + \"Eng soʻnggi videolar\" tugmasini yashirish + Eng soʻnggi videolar tugmasi yashirilgan + Eng soʻnggi videolar tugmasi koʻrsatilgan + + Veb qidiruv natijalarini yashirish + Veb qidiruv natijalari yashirilgan + Veb qidiruv natijalari koʻrsatilgan + \'Sizga yoqishi mumkin\' boʻlimini yashirish + \'Sizga yoqishi mumkin\' boʻlimi yashirilgan + \'Sizga yoqishi mumkin\' boʻlimi koʻrsatilgan + This button usually appears in the video player for certain videos. --> + + \"Jonli chat takrori\" tugmasini yashirish + Pleer ustidagi jonli chat takrori tugmasi yashirilgan + Pleer ustidagi jonli chat takrori tugmasi koʻrsatilgan + Video sarlavhasini yashirish + Pleer ustidagi video sarlavhasi yashirilgan + Pleer ustidagi video sarlavhasi koʻrsatilgan + \'Kurs jarayoni\'ni yashirish + Kurs jarayoni boʻlimi yashirilgan + Kurs jarayoni boʻlimi koʻrsatilgan + Kashfiyotni yashirish + Ushbu kursni kashf etish va Podcast boʻlimlarini kashf etish yashirilgan + Ushbu kursni kashf etish va Podcast boʻlimlarini kashf etish koʻrsatilgan + \'Ushbu kursni kashf etish\'ni yashirish + Ushbu kursni kashf etish boʻlimi yashirilgan + Ushbu kursni kashf etish boʻlimi koʻrsatilgan + \'Podcastni kashf etish\'ni yashirish + Podcast boʻlimini kashf etish yashirilgan + Podcast boʻlimini kashf etish koʻrsatilgan + \'Tavsiya etilgan joylar\'ni yashirish + Tavsiya etilgan joylar boʻlimi yashirilgan + Tavsiya etilgan joylar boʻlimi koʻrsatilgan + Tasma ochiluvchi menyu filtrini yoqish + Tasma ochiluvchi menyu filtri yoqilgan + Tasma ochiluvchi menyu filtri oʻchirilgan + Tasma ochiluvchi menyu filtri + Filtrga qoʻshish uchun ochiluvchi menyu nomlarini har bir qatorda bittadan kiriting + Oʻyinlarni yashirish + Oʻyinlar boʻlimi yashirilgan + Oʻyinlar boʻlimi koʻrsatilgan + Musiqani yashirish + Musiqa boʻlimi yashirilgan + Musiqa boʻlimi koʻrsatilgan + Viktorinalarni yashirish + Viktorinalar boʻlimi yashirilgan + Viktorinalar boʻlimi koʻrsatilgan + Kanal yorligʻi filtrini yoqish + Kanal yorligʻi filtri yoqilgan + Kanal yorligʻi filtri oʻchirilgan + Kanal yorligʻi filtri + Filtrga qoʻshish uchun kanal yorligʻi nomlarini har bir qatorda bittadan kiriting + "Cheklovlar: +• Shorts tokchalari, kanal sahifalari va qidiruv natijalari koʻrishlar sonini koʻrsatishi mumkin. +• Bu funksiya avtomobil shakl omili bilan ishlamaydi." + "Cheklovlar: +• Shorts tokchalari, kanal sahifalari va qidiruv natijalari yuklash vaqtlarini koʻrsatishi mumkin. +• Bu funksiya avtomobil shakl omili bilan ishlamaydi." + "Asosiy/Obunalar/Qidiruv natijalari kalit soʻz iboralariga mos keladigan kontentni yashirish uchun filtrlangan + +Cheklovlar: +• Shorts kanal nomi boʻyicha yashirilmaydi +• Baʼzi UI komponentlari yashirilmasligi mumkin +• Kalit soʻzni qidirish natija bermasligi mumkin" - + Toʻliq ekranli reklamalar yashirilgan + Pleer ochiluvchi reklamalarini yashirish + Pleer ochiluvchi reklamalari yashirilgan + Pleer ochiluvchi reklamalari koʻrsatilgan + Pleer ustidagi mahsulotlarni koʻrish banneri yashirilgan + Pleer ustidagi mahsulotlarni koʻrish banneri koʻrsatilgan + YouTube Premium aksiyalarini yashirish + YouTube Premium aksiyalari yashirilgan + YouTube Premium aksiyalari koʻrsatilgan - - + + URL manzili buferga nusxalandi + Vaqt tamgʻasi bilan URL manzili nusxalandi + Video URL manzilini nusxalash tugmasini koʻrsatish + Video URL manzilini nusxalash tugmasi koʻrsatilgan. Video URL manzilini nusxalash uchun bosing. Vaqt tamgʻasi bilan nusxalash uchun bosib turing + Video URL manzilini nusxalash tugmasi koʻrsatilmagan + Vaqt tamgʻasi URL manzilini nusxalash tugmasini koʻrsatish + Vaqt tamgʻasi URL manzilini nusxalash tugmasi koʻrsatilgan. Vaqt tamgʻasi bilan video URL manzilini nusxalash uchun bosing. Vaqt tamgʻasisiz nusxalash uchun bosib turing + Vaqt tamgʻasi URL manzilini nusxalash tugmasi koʻrsatilmagan + - + + \"TVga kirish\" ochiluvchi oynasini oʻchirish + TVga kirish ochiluvchi oynasi oʻchirilgan + TVga kirish ochiluvchi oynasi yoqilgan + - + + Qidirish uchun bosishni yoqish + Qidirish uchun bosish yoqilgan + Qidirish uchun bosish oʻchirilgan + @@ -89,25 +209,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Yashirish baʼzi foydalanuvchi akkauntlari uchun ishlamasligi mumkin. - + + Navigatsiya tugmalari + Navigatsiya panelidagi tugmalarni yashirish yoki oʻzgartirish + Bosh sahifani yashirish + Bosh sahifa tugmasi yashirilgan + Bosh sahifa tugmasi koʻrsatilgan + Shortsni yashirish + Shorts tugmasi yashirilgan + Shorts tugmasi koʻrsatilgan + Yaratishni yashirish + Yaratish tugmasi yashirilgan + Yaratish tugmasi koʻrsatilgan + Obunalarni yashirish + Obunalar tugmasi yashirilgan + Obunalar tugmasi koʻrsatilgan + Bildirishnomalarni yashirish + Bildirishnomalar tugmasi yashirilgan + Bildirishnomalar tugmasi koʻrsatilgan + Yaratishni Bildirishnomalar bilan almashtirish + Yaratish tugmasi Bildirishnomalar tugmasi bilan almashtirilgan + Yaratish tugmasi Bildirishnomalar tugmasi bilan almashtirilmagan + Agar bu sozlamani oʻzgartirish ish bermasa, inkognito rejimiga oʻtishga harakat qiling. + Navigatsiya tugmalari yorliqlarini yashirish + Yorliqlar yashirilgan + Yorliqlar koʻrsatilgan + Tor navigatsiya tugmalarini yoqish + Navigatsiya tugmalari orasidagi boʻshliq tor + Navigatsiya tugmalari orasidagi boʻshliq normal + Navigatsiya paneli animatsiyalarini yoqish + Navigatsiya oʻtishlari animatsiyali + Navigatsiya oʻtishlari animatsiyali emas + Yarim shaffof holat panelini oʻchirish + Holat paneli shaffof emas + Holat paneli shaffof emas yoki yarim shaffof + "Cheklovlar: +• Video pleerning yuqori qismida qora chiziq paydo boʻlishi mumkin. +• Baʼzi qurilmalarda bu funksiyani yoqish tizim navigatsiya panelini shaffofga oʻzgartirishi mumkin." + Ochiq rangli yarim shaffof panelni oʻchirish + Ochiq rejim navigatsiya paneli shaffof emas + Ochiq rejim navigatsiya paneli shaffof emas yoki yarim shaffof + Toʻq rangli yarim shaffof panelni oʻchirish + Toʻq rejim navigatsiya paneli shaffof emas + Toʻq rejim navigatsiya paneli shaffof emas yoki yarim shaffof + Asboblar paneli + Asboblar paneli komponentlarini yashirish yoki oʻzgartirish + Yaratish tugmasini yashirish + Yaratish tugmasi yashirilgan + Yaratish tugmasi koʻrsatilgan + Bildirishnomalar tugmasini yashirish + Bildirishnomalar tugmasi yashirilgan + Bildirishnomalar tugmasi koʻrsatilgan + Qidirish tugmasini yashirish + Qidirish tugmasi yashirilgan + Qidirish tugmasi koʻrsatilgan. + Keng qidiruv satrini yoqish + Keng qidiruv satri yoqilgan + Keng qidiruv satri o\'chirilgan @@ -126,25 +303,67 @@ Second \"item\" text" + Yigʻish tugmasini yashirish + Yigʻish tugmasi yashirilgan + Yigʻish tugmasi koʻrsatilgan + Toʻliq ekran tugmasini yashirish + Toʻliq ekran tugmasi yashirilgan + Toʻliq ekran tugmasi koʻrsatilgan + + + Yakuniy ekran kartalarini yashirish + Yakuniy ekran kartalari yashirilgan + Yakuniy ekran kartalari koʻrsatilgan - + Toʻliq ekranli katta qidirish panelini yoqish + Toʻliq ekranli qidirish paneli katta hajmda + Toʻliq ekranli qidirish paneli normal hajmda + Kanal sahifasida Shortsni yashirish + Kanal sahifasida yashirilgan + Kanal sahifasida koʻrsatilgan + Video tavsifida Shortsni yashirish + Video tavsifida yashirilgan + Video tavsifida koʻrsatilgan + Sunʼiy intellekt tugmasini yashirish + Sunʼiy intellekt tugmasi yashirilgan + Sunʼiy intellekt tugmasi koʻrsatilgan + \'Avtomatik dublyaj qilingan\' yorligʻini yashirish + Avtomatik dublyaj qilingan yorliq yashirilgan + Avtomatik dublyaj qilingan yorliq koʻrsatilgan + - + + Avtomatik ijro etish oldindan koʻrishini yashirish + Avtomatik ijro etish oldindan koʻrishi yashirilgan + Avtomatik ijro etish oldindan koʻrishi koʻrsatilgan + + + Yakuniy ekran tavsiya etilgan videosini yashirish + "Avtomatik ijro etish oʻchirilganida yakuniy ekran tavsiya etilgan videosi yashiriladi + +Avtomatik ijro etishni YouTube sozlamalarida oʻzgartirish mumkin: +Sozlamalar → Ijro etish → Keyingi videoni avtomatik ijro etish" + Yakuniy ekran tavsiya etilgan videosi koʻrsatilgan + - + + Pleer qalqib chiquvchi panellarni yashirish + Pleer qalqib chiquvchi panellari yashirilgan + Pleer qalqib chiquvchi panellari ko\'rsatilgan + @@ -155,10 +374,12 @@ Second \"item\" text" - - + Faqat musiqiy videolarda foydalanish uchun. Musiqasiz musiqiy videolarning boshqa kategoriya bilan qamrab olinmagan boʻlimlari + Segmentni yuborib boʻlmadi: %s + "Segmentni yuborib boʻlmadi. +Allaqachon mavjud" @@ -170,7 +391,11 @@ Second \"item\" text" - + + Oʻchirilgan + Rangli + Oq-qora + @@ -187,7 +412,11 @@ Second \"item\" text" - + + Bosish va ushlab turish haptikasini oʻchirish + Bosish va ushlab turish haptikasi oʻchirilgan + Bosish va ushlab turish haptikasi yoqilgan + @@ -200,6 +429,11 @@ Second \"item\" text" + + Premium sifat variantlarini yashirish + Premium sifat variantlari yashirilgan + Premium sifat variantlari koʻrsatilgan + @@ -207,7 +441,9 @@ Second \"item\" text" - + + + diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index e129ba7448..337c1272ed 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -25,6 +25,7 @@ Second \"item\" text" Tùy chỉnh Biểu tượng ứng dụng Gốc + ReVanced ReVanced (tối giản) ReVanced (tỉ lệ) @@ -49,6 +50,7 @@ Second \"item\" text" Thiết lập + ReVanced Bạn có chắc chắn muốn tiếp tục không? Lưu Đặt lại @@ -80,6 +82,9 @@ Second \"item\" text" Hiện lịch sử tìm kiếm cài đặt Lịch sử tìm kiếm cài đặt đã được hiển thị Lịch sử tìm kiếm cài đặt không được hiển thị + Tắt biểu tượng in đậm + Các biểu tượng không in đậm + Các biểu tượng in đậm Hiện biểu tượng cài đặt ReVanced Các biểu tượng cài đặt được hiển thị Các biểu tượng cài đặt không được hiển thị @@ -99,27 +104,37 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore - Chuyển hướng tới GmsCore và thiết lập + GmsCore + Cài đặt liên quan đến GmsCore + Kiểm tra bản cập nhật GmsCore + Kiểm tra cập nhật đã được bật + Đã tắt kiểm tra cập nhật + Mở cài đặt GmsCore + Cài đặt của GmsCore - MicroG GmsCore chưa được cài đặt. Hãy cài đặt ngay. - Yêu cầu thực hiện - "MicroG GmsCore không có quyền chạy nền. + MicroG GmsCore chưa được cài đặt. Hãy cài đặt ngay. + Yêu cầu thực hiện + Không thể kiểm tra cập nhật MicroG GmsCore + Phiên bản mới (%1$s) của MicroG GmsCore đã có sẵn. Hiện tại, bạn đang sử dụng phiên bản %2$s. + "MicroG GmsCore không có quyền chạy nền. Hãy làm theo hướng dẫn \"Don't kill my app\" dành cho điện thoại của bạn và áp dụng các bước đó để cài đặt MicroG. Cấp quyền chạy nền là bắt buộc để ứng dụng hoạt động." - Mở trang web - "Để microG GmsCore hoạt động ổn định, bạn cần phải tắt tối ưu hoá pin cho ứng dụng này. + Mở trang web + Hủy + "Để microG GmsCore hoạt động ổn định, bạn cần phải tắt tối ưu hoá pin cho ứng dụng này. Đừng lo, tắt tối ưu hóa pin cho microG sẽ không làm hao pin hơn. Nhấn tiếp tục để thay đổi lựa chọn tối ưu hóa." - Tiếp tục + Tiếp tục Giả mạo luồng video Giả mạo luồng video của ứng dụng khách nhằm ngăn chặn lỗi khi phát + Giả mạo luồng video + Giả mạo luồng video của trình khách để ngăn lỗi phát lại Giả mạo luồng video "Luồng video đã được giả mạo @@ -169,10 +184,11 @@ Bạn sẽ không được thông báo khi xẩy ra lỗi bất ngờ." Đã lưu cờ Đã đặt lại cờ Đã sao chép cờ vào bảng nhớ tạm - Bộ đệm giao thức nhật ký - Ghi nhật ký gỡ lỗi bao gồm thông tin bộ đệm nguyên mẫu - Ghi nhật ký gỡ lỗi mà không có thông tin bộ đệm nguyên mẫu - "Bật cài đặt này sẽ ghi lại dữ liệu bố cục bổ sung, bao gồm cả văn bản trên màn hình cho một số thành phần giao diện người dùng. + Khởi động lại ứng dụng để sử dụng tính năng này + Bộ đệm giao thức nhật ký + Ghi nhật ký gỡ lỗi bao gồm thông tin bộ đệm nguyên mẫu + Ghi nhật ký gỡ lỗi mà không có thông tin bộ đệm nguyên mẫu + "Bật cài đặt này sẽ ghi lại dữ liệu bố cục bổ sung, bao gồm cả văn bản trên màn hình cho một số thành phần giao diện người dùng. Điều này có thể giúp xác định các thành phần khi tạo bộ lọc tùy chỉnh. @@ -206,9 +222,12 @@ Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu n Trang video Chung Trình phát + Shorts Thanh tiến trình Cử chỉ vuốt + Return YouTube Dislike Khác + Video Khôi phục trình đơn cài đặt cũ Các trình đơn cài đặt cũ được hiển thị Các trình đơn cài đặt cũ không được hiển thị @@ -219,6 +238,9 @@ Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu n Phát nền cho Shorts được bật + Ẩn kệ cửa hàng của nhà sáng tạo + Kệ cửa hàng của nhà sáng tạo bên dưới trình phát video đã bị ẩn + Kệ cửa hàng của người sáng tạo bên dưới trình phát video đang hiển thị Ẩn thẻ đĩa nhạc Các thẻ đĩa nhạc đã bị ẩn Các thẻ đĩa nhạc được hiển thị @@ -228,6 +250,9 @@ Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu n Ẩn kệ danh mục được đề xuất Kệ danh mục được đề xuất đã bị ẩn Kệ danh mục được đề xuất được hiển thị + Ẩn phần bình luận bên dưới video trong nguồn cấp dữ liệu Trang chủ + Phần bình luận bên dưới video trong nguồn cấp dữ liệu Trang chủ đã bị ẩn + Phần bình luận bên dưới video trong nguồn cấp dữ liệu Trang chủ được hiển thị Ẩn bài đăng cộng đồng Các bài đăng cộng đồng đã bị ẩn Các bài đăng cộng đồng được hiển thị @@ -255,14 +280,19 @@ Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu n Ẩn bài đăng mới nhất Bài đăng mới nhất đã bị ẩn Bài đăng mới nhất được hiển thị + + Ẩn nút \'Video mới nhất\' + Nút Video mới nhất đã bị ẩn + Nút Video mới nhất được hiển thị Ẩn danh sách phát kết hợp Danh sách phát kết hợp đã bị ẩn Danh sách phát kết hợp được hiển thị Ẩn phần phim Phần phim đã bị ẩn Phần phim được hiển thị - + Ẩn nút \'Thông báo cho tôi\' Nút thông báo cho tôi đã bị ẩn Nút thông báo cho tôi được hiển thị @@ -287,13 +317,16 @@ Tuy nhiên, bật tính năng này cũng sẽ ghi lại một số dữ liệu n Ẩn dấu cách trực quan Dấu cách trực quan đã bị ẩn Dấu cách trực quan đang hiển thị + Ẩn kết quả tìm kiếm trên web + Kết quả tìm kiếm trên web đã bị ẩn + Kết quả tìm kiếm trên web được hiển thị + Ẩn phần \'Có thể bạn thích\' + Phần \'Có thể bạn thích\' đã bị ẩn + Phần \'Có thể bạn thích\' được hiển thị Ẩn YouTube Doodles Hoạt ảnh YouTube Doodles trên logo đã bị ẩn Hoạt ảnh YouTube Doodles trên logo đang hiển thị - "YouTube Doodles chỉ xuất hiện vào một số ngày nhất định trong năm. - -Nếu cài đặt này được bật và Doodle đang hiển thị tại khu vực của bạn, thì thanh bộ lọc bên dưới thanh tìm kiếm cũng sẽ bị ẩn." Ẩn nút kênh Nút kênh đã bị ẩn Nút kênh được hiển thị @@ -310,10 +343,15 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Bảng thông tin đã bị ẩn Bảng thông tin được hiển thị + This button usually appears in the video player for certain videos. --> Ẩn nút Tham gia Nút tham gia đã bị ẩn Nút tham gia được hiển thị + + Ẩn nút \'Phát lại trò chuyện trực tiếp\' + Nút phát lại trò chuyện trực tiếp trong lớp phủ trình phát đã bị ẩn + Nút phát lại trò chuyện trực tiếp trong lớp phủ trình phát được hiển thị Ẩn bảng thông tin y tế Bảng thông tin y tế đã bị ẩn Bảng thông tin y tế được hiển thị @@ -329,6 +367,9 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Ẩn phản ứng theo thời gian Phản ứng theo thời gian đã bị ẩn Phản ứng theo thời gian được hiển thị + Ẩn tiêu đề video + Tiêu đề video trong lớp phủ trình phát đã bị ẩn + Tiêu đề video trong lớp phủ trình phát được hiển thị Ẩn \'Bản tóm tắt video do AI tạo\' Phần tóm tắt video do AI tạo đã bị ẩn Phần tóm tắt video do AI tạo được hiển thị @@ -341,33 +382,62 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Ẩn Chương Phần chương đã bị ẩn Phần chương được hiển thị - Ẩn \'Cách nội dung này được tạo ra\' - Phần cách nội dung được tạo ra đã bị ẩn - Phần cách nội dung được tạo ra được hiển thị - Ẩn Điểm khuấy động - Điểm khuấy động đã bị ẩn - Điểm khuấy động được hiển thị + Ẩn \'Tiến độ khóa học\' + Phần tiến độ khóa học đã bị ẩn + Phần tiến độ khóa học được hiển thị + Ẩn Khám phá + Phần Khám phá khóa học này và Khám phá podcast đã bị ẩn + Phần Khám phá khóa học này và Khám phá podcast được hiển thị + Ẩn \'Khám phá khóa học này\' + Phần Khám phá khóa học này đã bị ẩn + Phần Khám phá khóa học này được hiển thị + Ẩn \'Khám phá podcast\' + Phần Khám phá podcast đã bị ẩn + Phần Khám phá podcast được hiển thị Ẩn \'Khám phá podcast\' Phần Khám phá podcast đã bị ẩn Phần Khám phá podcast được hiển thị Ẩn Liên kết nổi bật Phần liên kết nổi bật bị ẩn Phần liên kết nổi bật được hiển thị + Ẩn \'Địa điểm nổi bật\' + Phần Địa điểm nổi bật đã bị ẩn + Phần Địa điểm nổi bật được hiển thị Ẩn video nổi bật Phần video nổi bật bị ẩn Phần video nổi bật được hiển thị + Bật bộ lọc menu thả xuống của nguồn cấp dữ liệu + Bộ lọc menu thả xuống của nguồn cấp dữ liệu đã bật + Bộ lọc menu thả xuống của nguồn cấp dữ liệu đã tắt + Bộ lọc menu thả xuống của nguồn cấp dữ liệu + Nhập tên menu thả xuống để lọc, mỗi tên một dòng + Ẩn Trò chơi + Phần Trò chơi đã bị ẩn + Phần Trò chơi được hiển thị + Ẩn \'Cách nội dung này được tạo ra\' + Phần cách nội dung được tạo ra đã bị ẩn + Phần cách nội dung được tạo ra được hiển thị + Ẩn Điểm khuấy động + Điểm khuấy động đã bị ẩn + Điểm khuấy động được hiển thị Ẩn thẻ Thông tin Phần thẻ thông tin đã bị ẩn Phần thẻ thông tin được hiển thị Ẩn \'Khái niệm chính\' Phần Khái niệm chính đã bị ẩn Phần Khái niệm chính được hiển thị + Ẩn Âm nhạc + Phần Âm nhạc đã bị ẩn + Phần Âm nhạc được hiển thị Ẩn nút Đăng ký Nút đăng ký đã bị ẩn Nút đăng ký được hiển thị Ẩn Bản chép lời Phần bản chép lời đã bị ẩn Phần bản chép lời được hiển thị + Ẩn Câu đố + Phần Câu đố đã bị ẩn + Phần Câu đố được hiển thị Mô tả video Ẩn hoặc hiện các thành phần mô tả video Thanh bộ lọc @@ -386,6 +456,11 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Đã hiển thị trong nhật ký xem Trang kênh Ẩn hoặc hiển thị các thành phần trang kênh + Bật bộ lọc tab kênh + Bộ lọc tab kênh đã bật + Bộ lọc tab kênh đã tắt + Bộ lọc tab kênh + Nhập tên tab kênh để lọc, mỗi tên một dòng Ẩn nút Cộng đồng Nút Cộng đồng đã bị ẩn @@ -449,15 +524,15 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Số lượt xem được hiển thị trên trang video và kết quả tìm kiếm "Hạn chế: -• Trên kệ Shorts, trang kênh và kết quả tìm kiếm vẫn có thể thấy số lượt xem -• Tính năng này không hoạt động với bố cục màn hình ô tô" +• Trên kệ Shorts, trang kênh và kết quả tìm kiếm vẫn có thể thấy số lượt xem. +• Tính năng này không hoạt động với bố cục màn hình ô tô." Ẩn ngày tải lên Ngày tải lên đã bị ẩn trên trang video và kết quả tìm kiếm Ngày tải lên được hiển thị trên trang video và kết quả tìm kiếm "Hạn chế: -• Trên kệ Shorts, trang kênh và kết quả tìm kiếm có thể vẫn thấy ngày tải lên -• Tính năng này không hoạt động với bố cục màn hình ô tô" +• Trên kệ Shorts, trang kênh và kết quả tìm kiếm có thể vẫn thấy ngày tải lên. +• Tính năng này không hoạt động với bố cục màn hình ô tô." Ẩn nội dung theo từ khóa Ẩn video trong trang video và tìm kiếm bằng bộ lọc từ khóa Ẩn video Trang chủ theo từ khóa @@ -480,8 +555,8 @@ Từ có chữ in hoa ở giữa phải được nhập cùng với chữ viết Giới thiệu về bộ lọc từ khóa "Trang chủ/Kênh đăng ký/Kết quả tìm kiếm được lọc để ẩn nội dung khớp với cụm từ khóa -Hạn chế -• Video ngắn không thể bị ẩn theo tên kênh +Hạn chế: +• Shorts không thể bị ẩn theo tên kênh • Một số thành phần giao diện người dùng có thể không bị ẩn • Tìm kiếm từ khóa có thể không hiển thị kết quả" Khớp toàn bộ từ @@ -495,19 +570,12 @@ Hạn chế Từ khóa sẽ ẩn tất cả video: %s - Ẩn kệ cửa hàng của nhà sáng tạo - Kệ cửa hàng của nhà sáng tạo bên dưới trình phát video đã bị ẩn - Kệ cửa hàng của người sáng tạo dưới trình phát video đang hiển thị Ẩn biểu ngữ cửa hàng trên màn hình kết thúc Biểu ngữ cửa hàng trên màn hình kết thúc đã bị ẩn Biểu ngữ cửa hàng trên màn hình kết thúc được hiển thị Ẩn quảng cáo toàn màn hình - "Quảng cáo toàn màn hình đã bị ẩn - -Tính năng này chỉ khả dụng trên các thiết bị cũ" + Quảng cáo toàn màn hình đã bị ẩn Quảng cáo toàn màn hình được hiển thị - - Ẩn QC toàn màn hình chỉ hoạt động trên thiết bị cũ Ẩn quảng cáo chung Quảng cáo chung đã bị ẩn Quảng cáo chung được hiển thị @@ -517,6 +585,9 @@ Tính năng này chỉ khả dụng trên các thiết bị cũ" Ẩn nhãn quảng cáo trả phí Nhãn quảng cáo trả phí đã bị ẩn Nhãn quảng cáo trả phí được hiển thị + Ẩn quảng cáo bật lên của trình phát + Quảng cáo bật lên của trình phát đã bị ẩn + Quảng cáo bật lên của trình phát được hiển thị Ẩn thẻ tự tài trợ Các thẻ tự tài trợ đã bị ẩn Các thẻ tự tài trợ được hiển thị @@ -524,23 +595,18 @@ Tính năng này chỉ khả dụng trên các thiết bị cũ" Liên kết mua sắm trong mô tả video đã bị ẩn Liên kết mua sắm trong mô tả video được hiển thị Ẩn biểu ngữ \"Xem sản phẩm\" - Biểu ngữ xem sản phẩm trong lớp phủ video đã bị ẩn - Biểu ngữ xem sản phẩm trong lớp phủ video được hiển thị - Ẩn kết quả tìm kiếm trên web - Kết quả tìm kiếm trên web đã bị ẩn - Kết quả tìm kiếm trên web được hiển thị - - - Ẩn quảng cáo YouTube Premium - Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video đã bị ẩn - Quảng cáo khuyến mãi Youtube Premium bên dưới trình phát video được hiển thị + Biểu ngữ xem sản phẩm trong lớp phủ trình phát đã bị ẩn + Biểu ngữ xem sản phẩm trong lớp phủ trình phát được hiển thị + Ẩn quảng cáo YouTube Premium + Quảng cáo YouTube Premium đã bị ẩn + Quảng cáo YouTube Premium được hiển thị Ẩn quảng cáo trên video Quảng cáo trên video đã bị ẩn Quảng cáo trên video được hiển thị - + Đã sao chép URL vào bảng nhớ tạm Đã sao chép URL kèm dấu thời gian Hiện nút sao chép URL video @@ -556,10 +622,10 @@ Tính năng này chỉ khả dụng trên các thiết bị cũ" Hộp thoại sẽ được hiển thị Tuỳ chọn này chỉ tự động chấp nhận mà không bỏ qua giới hạn độ tuổi. - - Tắt cửa sổ bật lên \"Đăng nhập vào TV\" - Cửa sổ Đăng nhập vào TV đã tắt - Cửa sổ Đăng nhập vào TV đã bật + + Tắt cửa sổ bật lên \"Đăng nhập vào TV\" + Cửa sổ Đăng nhập vào TV đã tắt + Cửa sổ Đăng nhập vào TV đã bật Tắt bỏ qua chương bằng cách chạm hai lần @@ -592,10 +658,10 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Cử chỉ đã tắt Cử chỉ đã bật - - Bật nhấn để tua - Nhấn để tua đã bật - Nhấn để tua đã tắt + + Bật nhấn để tua + Nhấn để tua đã bật + Nhấn để tua đã tắt Bật cử chỉ độ sáng @@ -676,7 +742,7 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Nút bình luận đã bị ẩn Nút bình luận được hiển thị + This button usually appears on live streamed videos. --> Ẩn Báo cáo Nút báo cáo đã bị ẩn Nút báo cáo được hiển thị @@ -689,7 +755,7 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Nút tải xuống đã bị ẩn Nút tải xuống được hiển thị + This button usually appears on videos uploaded by the logged-in user. --> Ẩn Khuấy động Nút khuấy động đã bị ẩn Nút khuấy động được hiển thị @@ -702,7 +768,7 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Nút cảm ơn đã bị ẩn Nút cảm ơn được hiển thị + This button usually appears if the user IP is from a specific region such as the USA or EU. --> Ẩn Đặt câu hỏi Nút đặt câu hỏi đã bị ẩn Nút đặt câu hỏi được hiển thị @@ -710,6 +776,7 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Ẩn Tạo đoạn video Nút tạo đoạn video đã bị ẩn Nút tạo đoạn video được hiển thị + Việc ẩn có thể không hoạt động đối với một số tài khoản người dùng. Ẩn Mua sắm Nút Mua sắm đã bị ẩn @@ -719,13 +786,13 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Nút Lưu đã bị ẩn Nút Lưu được hiển thị - + Các nút điều hướng - Ẩn hoặc thay đổi các nút ở thanh điều hướng + Ẩn hoặc thay đổi các nút trên thanh điều hướng Ẩn Trang chủ - Nút trang chủ đã bị ẩn - Nút trang chủ được hiển thị + Nút Trang chủ đã bị ẩn + Nút Trang chủ được hiển thị Ẩn Shorts Nút Shorts đã bị ẩn @@ -743,26 +810,44 @@ Vui lòng kiểm tra lại tên gói và đảm bảo ứng dụng đã được Nút thông báo được hiển thị Chuyển vị nút Tạo với nút Thông báo - "Nút Tạo được đổi với nút Thông báo - -Lưu ý: Bật tính năng này cũng ẩn quảng cáo video" + Nút Tạo đã được chuyển vị với nút Thông báo Nút Tạo không đổi với nút Thông báo - "Tắt cài đặt này cũng sẽ tắt chặn quảng cáo trên Shorts. - -Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển sang chế độ Ẩn danh." - Ẩn nhãn nút điều hướng + Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển sang chế độ Ẩn danh. + Ẩn tên nút điều hướng Các nhãn đã bị ẩn Các nhãn được hiển thị + Bật nút điều hướng hẹp + Khoảng cách giữa các nút điều hướng là hẹp + Khoảng cách giữa các nút điều hướng là bình thường + Bật hoạt ảnh thanh điều hướng + Chuyển đổi điều hướng có hoạt ảnh + Chuyển đổi điều hướng không có hoạt ảnh Vô hiệu hóa thanh trạng thái trong suốt Thanh trạng thái không trong suốt Thanh trạng thái có thể mờ hoặc trong suốt - Trên một số thiết bị, bật tính năng này có thể thay đổi thanh điều hướng hệ thống thành trong suốt. + "Hạn chế: +• Một thanh màu đen có thể xuất hiện ở đầu trình phát video. +• Trên một số thiết bị, việc bật tính năng này có thể thay đổi thanh điều hướng hệ thống thành trong suốt." Vô hiệu hóa thanh điều hướng trong suốt ở chế độ sáng Thanh điều hướng ở chế độ sáng không trong suốt Thanh điều hướng ở chế độ sáng có thể mờ hoặc trong suốt Vô hiệu hoá thanh điều hướng trong suốt ở chế độ tối Thanh điều hướng ở chế độ tối không trong suốt Thanh điều hướng ở chế độ tối có thể mờ hoặc trong suốt + Thanh công cụ + Ẩn hoặc thay đổi các thành phần của thanh công cụ + Ẩn nút Tạo + Nút tạo đã bị ẩn + Nút tạo được hiển thị + Ẩn nút Thông báo + Nút thông báo đã bị ẩn + Nút thông báo được hiển thị + Ẩn nút Tìm kiếm + Nút tìm kiếm đã bị ẩn + Nút tìm kiếm được hiển thị. + Bật thanh tìm kiếm rộng + Thanh tìm kiếm rộng đã bật + Thanh tìm kiếm rộng đã tắt Trình đơn tuỳ chọn @@ -837,6 +922,12 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Ẩn nút truyền Nút Truyền đã bị ẩn Nút Truyền được hiển thị + Ẩn nút Thu gọn + Nút Thu gọn đã bị ẩn + Nút Thu gọn được hiển thị + Ẩn nút Toàn màn hình + Nút Toàn màn hình đã bị ẩn + Nút Toàn màn hình được hiển thị Ẩn nền điều khiển trình phát Nền điều khiển trình phát bị ẩn Nền điều khiển trình phát được hiện @@ -845,9 +936,9 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Các nút được hiển thị - Ẩn thẻ màn hình kết thúc - Thẻ màn hình kết thúc đã bị ẩn - Thẻ màn hình kết thúc được hiển thị + Ẩn thẻ màn hình kết thúc + Thẻ màn hình kết thúc đã bị ẩn + Thẻ màn hình kết thúc được hiển thị Tắt Chế độ môi trường khi toàn màn hình @@ -872,10 +963,16 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Ẩn thanh tiến trình trong hình thu nhỏ Thanh tiến trình trong hình thu nhỏ video đã xem đã bị ẩn Thanh tiến trình trong hình thu nhỏ video đã xem được hiển thị + Bật thanh tua lớn toàn màn hình + Thanh tua toàn màn hình có kích thước lớn + Thanh tua toàn màn hình có kích thước bình thường Trình phát Shorts Ẩn hoặc hiện các thành phần của trình phát Shorts + Ẩn Shorts trong trang kênh + Đã ẩn trong trang kênh + Được hiển thị trong trang kênh Ẩn Shorts trong thẻ Trang chủ Đã ẩn trong thẻ Trang chủ và video liên quan @@ -887,9 +984,18 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Ẩn Shorts trong thẻ Kênh đăng ký Đã ẩn trong thẻ Kênh đăng ký Đã hiển thị trong thẻ Kênh đăng ký + Ẩn Shorts trong mô tả video + Đã ẩn trong mô tả video + Được hiển thị trong mô tả video Ẩn Shorts trong nhật ký xem Đã ẩn trong nhật ký xem Đã hiển thị trong nhật ký xem + Ẩn nút AI + Nút AI đã bị ẩn + Nút AI được hiển thị + Ẩn nhãn \"Lồng tiếng tự động\" + Nhãn tự động lồng tiếng đã bị ẩn + Nhãn tự động lồng tiếng đang hiển thị Ẩn nhãn \"Lồng tiếng tự động\" Nhãn tự động lồng tiếng đã bị ẩn Nhãn tự động lồng tiếng đang hiển thị @@ -951,6 +1057,7 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Ẩn nút \"Sử dụng mẫu này\" Nút sử dụng mẫu này đã bị ẩn Nút sử dụng mẫu này được hiển thị + Ẩn hiệu ứng đài phun nút Thích Hiệu ứng đài phun nút thích đã bị ẩn Hiệu ứng đài phun nút thích được hiển thị @@ -993,7 +1100,12 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Thanh điều hướng đã bị ẩn Thanh điều hướng được hiển thị - + + Ẩn xem trước tự động phát + Xem trước tự động phát đã bị ẩn + Xem trước tự động phát được hiển thị + + Ẩn video được đề xuất ở màn hình kết thúc "Video được đề xuất ở màn hình kết thúc đã bị ẩn khi tắt tự động phát @@ -1012,9 +1124,9 @@ Cài đặt → Phát → Tự động phát video tiếp theo" Dấu thời gian được hiển thị - Ẩn bảng tự bật lên trên trình phát - Bảng bật lên trên trình phát đã bị ẩn - Bảng bật lên trên trình phát được hiển thị + Ẩn bảng tự bật lên trên trình phát + Bảng bật lên trên trình phát đã bị ẩn + Bảng bật lên trên trình phát được hiển thị Thoát chế độ toàn màn hình khi kết thúc video @@ -1043,6 +1155,7 @@ Cài đặt → Phát → Tự động phát video tiếp theo" Tải lại video để bỏ phiếu bằng ReturnYouTubeDislike Đã ẩn bởi chủ sở hữu + Return YouTube Dislike Số lượt không thích được hiển thị Số lượt không thích không được hiển thị Hiện số lượt không thích trong Shorts @@ -1063,6 +1176,7 @@ Hạn chế: Số lượt không thích có thể không xuất hiện ở chế Hiện thông báo ngắn nếu API không khả dụng Thông báo ngắn sẽ hiện nếu Return YouTube Dislike không khả dụng Thông báo ngắn không hiện nếu Return YouTube Dislike không khả dụng + ReturnYouTubeDislike.com Dữ liệu được cung cấp bởi API Return YouTube Dislike. Nhấn vào đây để tìm hiểu thêm Thống kê API ReturnYouTubeDislike của thiết bị này @@ -1082,27 +1196,8 @@ Hạn chế: Số lượt không thích có thể không xuất hiện ở chế Đã bị giới hạn API %d lần %d mili-giây - - Bật thanh tìm kiếm rộng - Thanh tìm kiếm rộng đã bật - Thanh tìm kiếm rộng đã tắt - - - Bật hình thu nhỏ chất lượng cao - Hình thu nhỏ khi tua có chất lượng cao - Hình thu nhỏ khi tua có chất lượng trung bình - Hình thu nhỏ khi tua toàn màn hình có chất lượng cao - Hình thu nhỏ khi tua toàn màn hình có chất lượng trung bình - "Tính năng này cũng sẽ khôi phục hình thu nhỏ trên luồng trực tiếp không có hình thu nhỏ thanh tiến trình. - -Hình thu nhỏ thanh tiến trình sẽ sử dụng cùng chất lượng với video hiện tại. - -Hoạt động tốt nhất với chất lượng video 720p trở xuống và khi sử dụng kết nối internet tốc độ cao." - Khôi phục hình thu nhỏ thanh tiến trình cũ - Hình thu nhỏ sẽ xuất hiện phía trên thanh tiến trình - Hình thu nhỏ sẽ xuất hiện trong chế độ toàn màn hình - + SponsorBlock Bật SponsorBlock SponsorBlock là một hệ thống dựa trên đóng góp bởi cộng đồng để bỏ qua các phần gây khó chịu trong video YouTube Giao diện @@ -1311,6 +1406,7 @@ Bạn đã sẵn sàng gửi?" Độ mờ: Màu: Giới thiệu + sponsor.ajay.app Dữ liệu được cung cấp bởi API SponsorBlock. Nhấn vào đây để tìm hiểu thêm và xem các bản tải cho các nền tảng khác @@ -1340,8 +1436,6 @@ Nếu tắt đi sau đó, bạn nên xóa dữ liệu ứng dụng để tránh Mục tiêu phiên bản giả mạo 20.13.41 - Khôi phục thanh thao tác video mở rộng 20.05.46 - Khôi phục tính năng bản chép lời - 19.35.36 - Khôi phục biểu tượng trình phát Shorts cũ - 19.01.34 - Khôi phục biểu tượng điều hướng cũ Thay đổi trang bắt đầu @@ -1363,6 +1457,7 @@ Nếu tắt đi sau đó, bạn nên xóa dữ liệu ứng dụng để tránh Danh sách phát Tìm kiếm Mua sắm + Shorts Thể thao Kênh đăng ký Xu hướng @@ -1451,8 +1546,9 @@ Vuốt để mở rộng hoặc đóng" Màn hình tải sẽ có một nền màu dốc Màn hình tải sẽ có một nền màu đặc Kiểu màn hình chờ - Màu - Đen và trắng + Đã tắt + Màu + Đen và trắng Bật màu thanh tiến trình tùy chỉnh Màu tùy chỉnh của thanh tiến trình được hiển thị Màu gốc của thanh tiến trình được hiển thị @@ -1462,11 +1558,17 @@ Vuốt để mở rộng hoặc đóng" Màu sắc nổi bật của thanh tiến trình Giá trị màu của thanh tiến trình không hợp lệ - + + YouTube ReVanced + YT ReVanced + YT + Logo đầu trang Mặc định Thông thường + Premium + ReVanced ReVanced (tối giản) Tùy chỉnh @@ -1491,6 +1593,7 @@ Bật tính năng này có thể khắc phục tình trạng hình ảnh không DeArrow & Hình thu nhỏ gốc DeArrow & Chụp tĩnh Chụp tĩnh + DeArrow "DeArrow cung cấp hình thu nhỏ có nguồn gốc từ cộng đồng cho video YouTube. Những hình thu nhỏ này thường liên quan hơn so với những hình thu nhỏ do YouTube cung cấp Nếu được bật, URL video sẽ được gửi đến máy chủ API và không có dữ liệu nào khác được gửi. Nếu video không có hình thu nhỏ DeArrow, thì hình thu nhỏ gốc hoặc ảnh chụp tĩnh sẽ được hiển thị @@ -1534,7 +1637,11 @@ Nhấn vào đây để tìm hiểu thêm về DeArrow" Lặp lại video đang bật Lặp lại video đang tắt - + + Tạm dừng khi có sự gián đoạn âm thanh + Quá trình phát lại sẽ tạm dừng khi có âm thanh khác phát + Âm lượng sẽ giảm khi có âm thanh khác phát + Giả mạo kích thước thiết bị "Kích thước thiết bị đã được giả mạo @@ -1557,6 +1664,9 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Tắt phản hồi xúc giác khi huỷ tua Phản hồi xúc giác khi huỷ tua đã tắt Phản hồi xúc giác khi huỷ tua đã bật + Tắt phản hồi xúc giác khi nhấn và giữ + Phản hồi xúc giác khi nhấn và giữ đã tắt + Phản hồi xúc giác khi nhấn và giữ đã bật Tắt phản hồi xúc giác khi thu phóng Phản hồi xúc giác khi thu phóng đã tắt Phản hồi xúc giác khi thu phóng đã bật @@ -1591,6 +1701,7 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Chất lượng Shorts mặc định trên mạng Wi-Fi Chất lượng Shorts mặc định trên mạng di động di động + mạng Đã thay đổi chất lượng mặc định %1$s: %2$s Đã thay đổi chất lượng Shorts %1$s: %2$s @@ -1651,6 +1762,11 @@ Hạn chế: Trình đơn chất lượng video nâng cao được hiển thị Trình đơn chất lượng video nâng cao không được hiển thị + + Ẩn tùy chọn chất lượng cao cấp + Tùy chọn chất lượng cao cấp đã bị ẩn + Tùy chọn chất lượng cao cấp được hiển thị + Bật vuốt để tua Vuốt để tua đã bật @@ -1680,8 +1796,13 @@ Phát video bằng AV1 có thể bị giật hoặc tụt khung hình." - + + YT Music ReVanced + Âm thanh Revanced + Âm nhạc + + Giới thiệu Quảng cáo Chung diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index d458814173..33ceb3c8e0 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -80,6 +80,9 @@ Second \"item\" text" 显示设置搜索历史记录 设置搜索历史记录已显示 不显示设置搜索历史记录 + 禁用粗体图标 + 图标未加粗 + 图标已加粗 显示ReVanced设置图标 设置图标已显示 未显示设置图标 @@ -99,23 +102,23 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore 设置 - GmsCore 的设置 + GmsCore + GmsCore 的相关设置 + 检查 GmsCore 更新 + 已启用更新检查 + 检查更新已禁用 + 打开 GmsCore 设置 + GmsCore 的设置 - MicroG GmsCore 未安装。请先安装。 - 需要采取措施 - "MicroG GmsCore 无法在后台运行。 - -请按照「Don't kill my app」网站上对应手机的指南,允许 MicroG 在后台运行。 - -这是应用程序正常运行的必要条件。" - 打开网站 - "必须禁用 MicroG GmsCore 的电池优化,以防止出现问题。 - -禁用 MicroG 的电池优化不会对电池续航时间造成负面影响。 - -点击继续按钮并允许优化更改。" - 继续 + MicroG GmsCore 未安装。请先安装。 + 需要采取措施 + 检查 MicroG GmsCore 更新失败 + MicroG GmsCore 的新版本 (%1$s) 可用。当前,您正在使用版本 %2$s。 + "MicroG GmsCore 无法在后台运行。\n\n请按照「Don't kill my app」网站上对应手机的指南,允许 MicroG 在后台运行。\n\n这是应用程序正常运行的必要条件。" + 打开网站 + 取消 + "必须禁用 MicroG GmsCore 的电池优化,以防止出现问题。\n\n禁用 MicroG 的电池优化不会对电池续航时间造成负面影响。\n\n点击继续按钮并允许优化更改。" + 继续 欺骗视频流 @@ -169,14 +172,11 @@ Second \"item\" text" 标志已保存 标志已重置 标志已复制到剪贴板 - 记录协议缓冲区 - 调试日志包括协议缓冲区 - 调试日志不包括协议缓冲区 - "启用此设置将记录额外的布局数据,包括某些 UI 组件的屏幕文本。 - -这有助于在创建自定义过滤器时识别组件。 - -但是,启用此设置也会记录一些用户数据,例如您的 IP 地址。" + 重启应用以使用此功能 + 记录协议缓冲区 + 调试日志包括协议缓冲区 + 调试日志不包括协议缓冲区 + "启用此设置将记录额外的布局数据,包括某些 UI 组件的屏幕文本。\n\n这有助于在创建自定义过滤器时识别组件。\n\n但是,启用此设置也会记录一些用户数据,例如您的 IP 地址。" 净化分享链接 @@ -220,6 +220,9 @@ Second \"item\" text" Shorts 后台播放已启用 + 隐藏创作者商店专区 + 视频播放器下方的创作者商店内容架已隐藏 + 视频播放器下方的创作者商店货架已显示 隐藏专辑卡片 专辑卡片已隐藏 专辑卡片已显示 @@ -229,6 +232,9 @@ Second \"item\" text" 隐藏标签展示栏 标签展示栏已隐藏 标签展示栏已显示 + 隐藏首页信息流中视频下方的评论区 + 首页信息流中视频下方的评论区已隐藏 + 首页信息流中视频下方的评论区已显示 隐藏社区帖子 社区帖子已隐藏 社区帖子已显示 @@ -257,14 +263,19 @@ Second \"item\" text" 隐藏「最新帖子」 最新帖子已隐藏 最新帖子已显示 + + 隐藏“最新视频”按钮 + 最新视频按钮已隐藏 + 最新视频按钮已显示 隐藏合辑播放列表 合辑播放列表已隐藏 合辑播放列表已显示 隐藏电影部分 相关电影部分已隐藏 相关电影部分已显示 - + 隐藏「通知我」按钮 通知我按钮已隐藏 通知我按钮已显示 @@ -289,13 +300,16 @@ Second \"item\" text" 隐藏视觉分隔符 视觉分隔符已隐藏 视觉分隔符已显示 + 隐藏网页搜索结果 + 网页搜索结果已隐藏 + 网页搜索结果已显示 + 隐藏“您可能喜欢”部分 + “您可能喜欢”部分已隐藏 + “您可能喜欢”部分已显示 隐藏 YouTube 涂鸦 隐藏YouTube徽标上的Doodles动画 YouTube 徽标上的 Doodles 动画已显示 - "YouTube Doodles 每年都会显示几天。 - -如果您的地区当前正在显示 Doodle 并且此隐藏设置已开启,则搜索栏下方的筛选栏也将隐藏。" 隐藏频道栏 频道栏已隐藏 频道栏已显示 @@ -312,10 +326,15 @@ Second \"item\" text" 信息面板已隐藏 信息面板已显示 + This button usually appears in the video player for certain videos. --> 隐藏“加入”按钮 加入按钮已隐藏 加入按钮已显示 + + 隐藏“实时聊天重播”按钮 + 播放器叠加层中的实时聊天重播按钮已隐藏 + 播放器叠加层中的实时聊天重播按钮已显示 隐藏医疗面板 医疗信息面板已隐藏 医疗信息面板已显示 @@ -331,6 +350,9 @@ Second \"item\" text" 隐藏限时反应 定时表情反应已隐藏 定时表情反应已显示 + 隐藏视频标题 + 播放器叠加层中的视频标题已隐藏 + 播放器叠加层中的视频标题已显示 隐藏“AI 生成的视频摘要” AI 生成的视频摘要部分已隐藏 AI 生成的视频摘要部分已显示 @@ -343,33 +365,62 @@ Second \"item\" text" 隐藏章节 「章节」部分已隐藏 「章节」部分已显示 - 隐藏“内容制作说明” - 内容制作说明部分已隐藏 - 「内容制作说明」部分已显示 - 隐藏热度积分 - 热度积分已隐藏 - 热度积分已显示 + 隐藏“课程进度” + 课程进度部分已隐藏 + 课程进度部分已显示 + 隐藏探索 + “探索此课程”和“浏览播客”部分已隐藏 + “探索此课程”和“浏览播客”部分已显示 + 隐藏“探索此课程” + “探索此课程”部分已隐藏 + “探索此课程”部分已显示 + 隐藏“浏览播客” + “浏览播客”部分已隐藏 + “浏览播客”部分已显示 隐藏“浏览播客” “浏览播客”部分已隐藏 “浏览播客”部分已显示 隐藏精选链接 特色链接部分已隐藏 特色链接部分已显示 + 隐藏“精选地点” + 精选地点部分已隐藏 + 精选地点部分已显示 隐藏精选视频 精选视频部分已隐藏 精选视频部分已显示 + 启用动态浮动菜单过滤器 + 动态浮动菜单过滤器已启用 + 动态浮动菜单过滤器已禁用 + 动态浮动菜单过滤器 + 输入要过滤的浮动菜单名称,每行一个 + 隐藏游戏 + 游戏部分已隐藏 + 游戏部分已显示 + 隐藏“内容制作说明” + 内容制作说明部分已隐藏 + 「内容制作说明」部分已显示 + 隐藏热度积分 + 热度积分已隐藏 + 热度积分已显示 隐藏信息卡 信息卡片部分已隐藏 信息卡片部分已显示 隐藏“主要概念” “主要概念”部分已隐藏 “主要概念”部分已显示 + 隐藏音乐 + 音乐部分已隐藏 + 音乐部分已显示 隐藏订阅按钮 订阅按钮已隐藏 订阅按钮已显示 隐藏文字记录 「转写文稿」部分已隐藏 「转写文稿」部分已显示 + 隐藏测验 + 测验部分已隐藏 + 测验部分已显示 视频说明 隐藏或显示视频说明组件 筛选器栏 @@ -388,6 +439,11 @@ Second \"item\" text" 在观看历史记录中显示 频道页面 隐藏或显示频道页面组件 + 启用频道标签页过滤器 + 频道标签页过滤器已启用 + 频道标签页过滤器已禁用 + 频道标签页过滤器 + 输入要过滤的频道标签页名称,每行一个 隐藏社区按钮 “社区”按钮已隐藏 @@ -451,15 +507,15 @@ Second \"item\" text" 观看次数已在动态和搜索结果中显示 "限制: -• Shorts 栏目、频道页面和搜索结果可能仍会显示观看次数 -• 此功能不适用于车载设备" +• Shorts 栏目、频道页面和搜索结果可能仍会显示观看次数。 +• 此功能不适用于车载设备。" 隐藏上传时间 上传时间在动态和搜索结果中已隐藏 上传时间在动态和搜索结果中显示 "限制: -• Shorts 专区、频道页面和搜索结果可能仍会显示上传时间 -• 此功能不适用于车载设备" +• Shorts 专区、频道页面和搜索结果可能仍会显示上传时间。 +• 此功能不适用于车载设备。" 隐藏关键字内容 使用关键字过滤隐藏搜索和动态消息中的视频 过滤首页视频 @@ -482,7 +538,7 @@ Second \"item\" text" 关于关键字过滤 "首页/订阅/搜索结果会过滤掉与关键词短语匹配的内容 -限制 +限制: • Shorts 无法通过频道名称隐藏 • 某些 UI 组件可能不会隐藏 • 搜索关键词可能没有结果" @@ -497,19 +553,12 @@ Second \"item\" text" 关键词将隐藏所有影片:%s - 隐藏创作者商店专区 - 视频播放器下方的创作者商店内容架已隐藏 - 视频播放器下方的创作者商店货架已显示 商店横幅已隐藏 结束画面商店横幅已隐藏 结束画面商店横幅已显示 隐藏全屏广告 - "全屏广告已隐藏 - -此功能仅适用于旧设备" + 全屏广告已隐藏 全屏广告已显示 - - 隐藏全屏广告只适用于旧设备 隐藏一般广告 一般广告已隐藏 一般广告已显示 @@ -519,6 +568,9 @@ Second \"item\" text" 隐藏付费推广标签 付费推广标签已隐藏 付费推广标签已显示 + 隐藏播放器弹出广告 + 播放器弹出广告已隐藏 + 播放器弹出广告已显示 隐藏自我推广卡片 自我推广卡片已隐藏 自我推广卡片已显示 @@ -526,23 +578,18 @@ Second \"item\" text" 视频说明中的购物链接已隐藏 视频描述中的购物链接已显示 隐藏“查看商品”横幅 - 视频叠加层中的查看商品横幅已隐藏 - 视频叠加层中的查看商品横幅已显示 - 隐藏网页搜索结果 - 网页搜索结果已隐藏 - 网页搜索结果已显示 - - - 隐藏 YouTube Premium 促销推广 - YouTube Premium促销推广已隐藏 - YouTube Premium促销推广已显示 + 播放器叠加层中的查看商品横幅已隐藏 + 播放器叠加层中的查看商品横幅已显示 + 隐藏 YouTube Premium 促销推广 + YouTube Premium 促销推广已隐藏 + YouTube Premium 促销推广已显示 隐藏视频广告 视频广告已隐藏 视频广告已显示 - + URL 已复制到剪贴板 URL 已复制,包含时间戳 显示复制视频 URL 按钮 @@ -558,10 +605,10 @@ Second \"item\" text" 「观看须知」对话框将会显示 这并不会绕过年龄限制,只是自动按下接受按钮。 - - 停用“登录到电视”弹出窗口 - 登录电视弹出窗口已禁用 - 登录电视弹出窗口已启用 + + 停用“登录到电视”弹出窗口 + 登录电视弹出窗口已禁用 + 登录电视弹出窗口已启用 禁用双击章节跳过 @@ -594,10 +641,10 @@ Second \"item\" text" 精准定位手势已禁用 精准定位手势已启用 - - 启用点击以快进 - 点击以启用搜寻 - 点击以快进已禁用 + + 启用点击以快进 + 点击以快进已启用 + 点击以快进已禁用 启用亮度控制手势 @@ -678,7 +725,7 @@ Second \"item\" text" 评论按钮已隐藏 评论按钮已显示 + This button usually appears on live streamed videos. --> 隐藏「举报」 举报按钮已隐藏 举报按钮已显示 @@ -691,7 +738,7 @@ Second \"item\" text" 下载按钮已隐藏 下载按钮已显示 + This button usually appears on videos uploaded by the logged-in user. --> 隐藏热度 浮夸按钮已隐藏 热度按钮已显示 @@ -704,7 +751,7 @@ Second \"item\" text" 感谢按钮已隐藏 感谢按钮已显示 + This button usually appears if the user IP is from a specific region such as the USA or EU. --> 隐藏“提问” “提问”按钮已隐藏 “提问”按钮已显示 @@ -712,6 +759,7 @@ Second \"item\" text" 隐藏「剪辑」按钮 剪辑按钮已隐藏 剪辑按钮已显示 + 隐藏功能可能不适用于某些用户帐户。 隐藏购物 购物按钮已隐藏 @@ -721,50 +769,68 @@ Second \"item\" text" 保存按钮已隐藏 保存按钮已显示 - + 导航栏按钮 - 隐藏或更改导航栏中的按钮 + 隐藏或更改导航栏按钮 - 隐藏「首页」 - 首页按钮已隐藏 - 首页按钮已显示 + 隐藏主页 + 主页按钮已隐藏 + 主页按钮已显示 - 隐藏「Shorts」 + 隐藏 Shorts Shorts 按钮已隐藏 Shorts 按钮已显示 - 隐藏创作的「+」号按钮 + 隐藏创作 创作按钮已隐藏 创作按钮已显示 - 隐藏「订阅」按钮 + 隐藏订阅 订阅按钮已隐藏 订阅按钮已显示 隐藏通知 通知按钮已隐藏 通知按钮已显示 - 将「创作」改成「通知」按钮 - "创作按钮将切换成通知按钮 - -注意:启用此功能也会强制隐藏视频广告" + 将创作与通知按钮切换 + 创作按钮已与通知按钮切换 创作按钮未切换成通知按钮 - "禁用此设置也会禁用 Shorts 广告拦截。 - -如果更改此设置未生效,请尝试切换到无痕模式。" - 隐藏导航栏按钮标签 + 如果更改此设置未生效,请尝试切换到无痕模式。 + 隐藏导航按钮标签 标签已隐藏 标签已显示 + 启用窄导航按钮 + 导航按钮之间的间距较窄 + 导航按钮之间的间距正常 + 启用导航栏动画 + 导航过渡具有动画效果 + 导航过渡没有动画效果 禁用半透明状态栏 状态栏为不透明 状态栏为不透明或半透明 - 在某些设备上,启用此功能可能会将系统导航栏更改为透明。 + "限制: +• 视频播放器顶部可能会出现黑条。 +• 在某些设备上,启用此功能可能会使系统导航栏变为透明。" 禁用浅色半透明导航栏 - 浅色模式的导航栏不透明 + 浅色模式导航栏不透明 浅色模式导航栏为不透明或半透明 禁用深色半透明栏 - 深色模式的导航栏不透明 + 深色模式导航栏不透明 深色模式导航栏为不透明或半透明 + 工具栏 + 隐藏或更改工具栏组件 + 隐藏创作按钮 + 创作按钮已隐藏 + 创作按钮已显示 + 隐藏通知按钮 + 通知按钮已隐藏 + 通知按钮已显示 + 隐藏搜索按钮 + 搜索按钮已隐藏 + 搜索按钮已显示。 + 启用宽搜索栏 + 宽搜索栏已启用 + 宽搜索栏已禁用 弹出菜单 @@ -839,6 +905,12 @@ Second \"item\" text" 隐藏「投屏」按钮 投屏按钮已隐藏 投屏按钮已显示 + 隐藏折叠按钮 + 折叠按钮已隐藏 + 折叠按钮已显示 + 隐藏全屏按钮 + 全屏按钮已隐藏 + 全屏按钮已显示 隐藏播放器控件背景 播放器控件背景已隐藏 播放器控件背景已显示 @@ -847,9 +919,9 @@ Second \"item\" text" 按钮已显示 - 隐藏片尾卡 - 片尾卡已隐藏 - 片尾卡已显示 + 隐藏片尾卡 + 片尾卡已隐藏 + 片尾卡已显示 在全屏时禁用氛围模式 @@ -874,10 +946,16 @@ Second \"item\" text" 隐藏视频缩略图进度条 视频缩略图进度条已隐藏 视频缩略图进度条已显示 + 启用全屏大进度条 + 全屏进度条为大尺寸 + 全屏进度条为正常尺寸 Shorts 播放器 隐藏或显示 Shorts 播放器组件 + 在频道页面中隐藏 Shorts + 在频道页面中已隐藏 + 在频道页面中已显示 在首页信息流中隐藏Shorts 已在首页信息流和相关视频中隐藏 @@ -889,9 +967,18 @@ Second \"item\" text" 在订阅内容流中隐藏Shorts 已在订阅内容流中隐藏 已在订阅内容流中显示 + 在视频说明中隐藏 Shorts + 在视频说明中已隐藏 + 在视频说明中已显示 在观看历史中隐藏 Shorts 隐藏在观看历史记录中 显示在观看历史中 + 隐藏 AI 按钮 + AI 按钮已隐藏 + AI 按钮已显示 + 隐藏“自动配音”标签 + 自动配音标签已隐藏 + 自动配音标签已显示 隐藏“自动配音”标签 自动配音标签已隐藏 自动配音标签已显示 @@ -953,6 +1040,7 @@ Second \"item\" text" 隐藏“使用此模板”按钮 “使用此模板”按钮已隐藏 “使用此模板”按钮已显示 + 隐藏点赞按钮喷泉动画 点赞按钮喷泉动画已隐藏 点赞按钮喷泉动画已显示 @@ -995,7 +1083,12 @@ Second \"item\" text" 导航栏已隐藏 导航栏已显示 - + + 隐藏自动播放预览 + 自动播放预览已隐藏 + 自动播放预览已显示 + + 隐藏片尾画面推荐视频 "自动播放关闭时隐藏片尾画面推荐视频 @@ -1014,9 +1107,9 @@ Second \"item\" text" 时间戳已显示 - 隐藏播放器弹出面板 - 播放器弹出面板已隐藏 - 播放器弹出面板已显示 + 隐藏播放器弹出面板 + 播放器弹出面板已隐藏 + 播放器弹出面板已显示 视频结尾时退出全屏模式 @@ -1084,25 +1177,6 @@ Second \"item\" text" 遇到客户端速率限制 %d 次 %d 毫秒 - - 启用宽搜索栏 - 宽搜索栏已启用 - 宽搜索栏已禁用 - - - 启用高质量缩略图 - 进度条缩略图质量为高质量 - 进度条缩略图质量为中等质量 - 全屏进度条缩略图质量为中等质量 - "这也会恢复没有进度条缩略图的直播的缩略图 - -进度条缩略图将使用与当前视频相同的质量。 - -此功能在视频质量为 720p 或更低且使用非常快的互联网连接时效果最佳。" - 恢复旧的进度条缩略图 - 进度条缩略图将显示在进度条上方 - 进度条缩略图将显示在全屏 - 启用 SponsorBlock SponsorBlock 是一个众包平台,旨在帮助人们跳过 YouTube 视频中烦人的部分 @@ -1203,7 +1277,7 @@ Second \"item\" text" 离题 / 笑话 视频中非必需的切题场景或笑话,不包括提供上下文或背景细节的部分 音乐:非音乐部分 - 仅供音乐视频使用。音乐视频中没有音乐的部分,这些部分没有被其他类别涵盖 + 仅供音乐视频使用。音乐视频中没有音乐的部分,这些部分未被其他类别涵盖 跳过 重点 跳过赞助 @@ -1346,8 +1420,6 @@ Second \"item\" text" 伪装应用程序版本为 20.13.41 - 恢复未折叠的视频操作栏 20.05.46 - 恢复字幕功能 - 19.35.36 - 恢复旧的 Shorts 播放器图标 - 19.01.34 - 还原旧的导航图标 更改起始页 @@ -1452,8 +1524,9 @@ Second \"item\" text" 加载屏幕将具有渐变背景 加载屏幕将具有纯色背景 启动画面样式 - 颜色 - 黑白 + 已禁用 + 颜色 + 黑白 启用自定义进度条颜色 自定义进度条颜色显示 显示原始进度条颜色 @@ -1558,6 +1631,9 @@ Second \"item\" text" 禁用撤销查找触觉反馈 撤销查找触觉反馈已禁用 撤销查找触觉反馈已启用 + 禁用长按触觉反馈 + 长按触觉反馈已禁用 + 长按触觉反馈已启用 禁用缩放触觉反馈 缩放触觉反馈已禁用 缩放触觉反馈已启用 @@ -1653,6 +1729,11 @@ Second \"item\" text" 显示高级视频质量菜单 不显示高级视频质量菜单 + + 隐藏 Premium 画质选项 + Premium 画质选项已隐藏 + Premium 画质选项已显示 + 启用滑动拖动进度条 滑动拖动进度条已启用 @@ -1684,6 +1765,7 @@ Second \"item\" text" + 关于 广告 通用 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index 1f7c9b0d48..d2fb68c602 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" 顯示設定搜尋記錄 顯示設定搜尋記錄 不顯示設定搜尋記錄 + 停用粗體圖示 + 圖示沒有粗體 + 圖示為粗體 顯示 ReVanced 設定圖示 已顯示設定圖示 未顯示設定圖示 @@ -101,23 +104,31 @@ Second \"item\" text" and changes made here must also be made there. --> - GmsCore 設定 - GmsCore 設定 + GmsCore + GmsCore 相關設定 + 檢查 GmsCore 更新 + 檢查更新已啟用 + 已停用檢查更新 + 開啟 GmsCore 設定 + GmsCore 設定 - 未安裝 MicroG GmsCore。請前往安裝。 - 需要採取行動 - "MicroG GmsCore 沒有權限在背景執行。 + 未安裝 MicroG GmsCore。請前往安裝。 + 需要採取行動 + 無法檢查 MicroG GmsCore 更新 + MicroG GmsCore 的新版本 (%1$s) 可用。目前,您正在使用版本 %2$s。 + "MicroG GmsCore 沒有權限在背景執行。 請按照你手機的「不要關閉我的應用程式」指南,並將說明套用於你的 MicroG 安裝。 這項設定是應用程式運作的必要條件。" - 開啟網站 - "為了避免問題,必須停用 MicroG GmsCore 的電池最佳化。 + 開啟網站 + 取消 + "為了避免問題,必須停用 MicroG GmsCore 的電池最佳化。 停用 MicroG 的電池最佳化不會對電池用量造成負面影響。 輕觸「繼續」按鈕並允許最佳化變更。" - 繼續 + 繼續 偽裝影片串流 @@ -173,10 +184,11 @@ Second \"item\" text" 旗標已儲存 旗標已重設 旗標已複製到剪貼簿 - 記錄檔協定緩衝區 - 除錯記錄檔會包含協定緩衝資訊 - 除錯記錄檔不會包含協定緩衝資訊 - "啟用此設定將會記錄額外的佈局資料,包括部分使用者介面元件的畫面文字。 + 重新啟動應用程式以使用此功能 + 記錄檔協定緩衝區 + 除錯記錄檔會包含協定緩衝資訊 + 除錯記錄檔不會包含協定緩衝資訊 + "啟用此設定將會記錄額外的佈局資料,包括部分使用者介面元件的畫面文字。 這有助於在建立自訂過濾器時識別元件。 @@ -226,6 +238,9 @@ Second \"item\" text" 已啟用背景播放 Shorts + 隱藏創作者商店區塊 + 已隱藏影片播放器下方的創作者商店區塊 + 已顯示影片播放器下方的創作者商店區塊 隱藏專輯資訊卡 已隱藏專輯資訊卡 已顯示專輯資訊卡 @@ -235,6 +250,9 @@ Second \"item\" text" 隱藏標籤列 已隱藏標籤列 已顯示標籤列 + 隱藏首頁推薦內容中影片下方的留言區塊 + 首頁推薦內容中影片下方的留言區塊已隱藏 + 首頁推薦內容中影片下方的留言區塊已顯示 隱藏社群貼文 已隱藏社群貼文 已顯示社群貼文 @@ -262,14 +280,19 @@ Second \"item\" text" 隱藏最新貼文 已隱藏最新貼文 已顯示最新貼文 + + 隱藏「最新影片」按鈕 + 「最新影片」按鈕已隱藏 + 「最新影片」按鈕已顯示 隱藏合輯 已隱藏合輯 已顯示合輯 隱藏電影版面 已隱藏電影版面 已顯示電影版面 - + 隱藏「通知我」按鈕 「提醒我」按鈕已隱藏 「提醒我」按鈕已顯示 @@ -294,13 +317,16 @@ Second \"item\" text" 隱藏視覺間隔 視覺間隔已隱藏 視覺間隔已顯示 + 隱藏網頁搜尋結果 + 已隱藏網頁搜尋結果 + 已顯示網頁搜尋結果 + 隱藏「你可能會喜歡」區塊 + 「你可能會喜歡」區塊已隱藏 + 「你可能會喜歡」區塊已顯示 隱藏 YouTube Doodles YouTube 標誌上的 Doodles 動畫已隱藏 YouTube 標誌上的 Doodles 動畫已顯示 - "YouTube Doodles 每年會顯示幾天。 - -如果塗鴉目前在你所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。" 隱藏頻道欄 已隱藏頻道欄 已顯示頻道欄 @@ -317,10 +343,15 @@ Second \"item\" text" 已隱藏資訊面板 已顯示資訊面板 + This button usually appears in the video player for certain videos. --> 隱藏「加入」按鈕 「加入」按鈕已隱藏 「加入」按鈕已顯示 + + 隱藏「聊天室重播」按鈕 + 播放器疊加層中的聊天室重播按鈕已隱藏 + 播放器疊加層中的聊天室重播按鈕已顯示 隱藏醫療資訊面板 已隱藏醫療資訊面板 已顯示醫療資訊面板 @@ -336,6 +367,9 @@ Second \"item\" text" 隱藏直播即時反應 已隱藏直播即時反應 已顯示直播即時反應 + 隱藏影片標題 + 播放器疊加層中的影片標題已隱藏 + 播放器疊加層中的影片標題已顯示 隱藏「AI 產生的影片摘要」 AI 生成的影片摘要區塊已隱藏 AI 生成的影片摘要區塊已顯示 @@ -348,33 +382,62 @@ Second \"item\" text" 隱藏章節 已隱藏章節區塊 已顯示章節區塊 - 隱藏「這項內容的製作方式」 - 已隱藏這項內容的製作方式區塊 - 已顯示這項內容的製作方式區塊 - 隱藏Hype點數 - Hype點數已隱藏 - Hype點數已顯示 + 隱藏「課程進度」 + 課程進度區塊已隱藏 + 課程進度區塊已顯示 + 隱藏探索 + 探索此課程和探索 Podcast 區塊已隱藏 + 探索此課程和探索 Podcast 區塊已顯示 + 隱藏「探索此課程」 + 探索此課程區塊已隱藏 + 探索此課程區塊已顯示 + 隱藏「探索 Podcast」 + 已隱藏探索 Podcast 區塊 + 已顯示探索 Podcast 區塊 隱藏「探索 Podcast」 已隱藏探索 Podcast 區塊 已顯示探索 Podcast 區塊 隱藏精選連結 精選連結區塊已隱藏 精選連結區塊已顯示 + 隱藏「精選地點」 + 精選地點區塊已隱藏 + 精選地點區塊已顯示 隱藏精選影片 精選影片區塊已隱藏 精選影片區塊已顯示 + 啟用資訊提供彈出式選單篩選器 + 資訊提供彈出式選單篩選器已啟用 + 資訊提供彈出式選單篩選器已停用 + 資訊提供彈出式選單篩選器 + 輸入要篩選的彈出式選單名稱,每行一個 + 隱藏「遊戲」 + 遊戲區塊已隱藏 + 遊戲區塊已顯示 + 隱藏「這項內容的製作方式」 + 已隱藏這項內容的製作方式區塊 + 已顯示這項內容的製作方式區塊 + 隱藏Hype點數 + Hype點數已隱藏 + Hype點數已顯示 隱藏資訊卡 已隱藏資訊卡區塊 已顯示資訊卡區塊 隱藏「核心概念」 已隱藏核心概念區塊 已顯示核心概念區塊 + 隱藏「音樂」 + 音樂區塊已隱藏 + 音樂區塊已顯示 隱藏「訂閱」按鈕 「訂閱」按鈕已隱藏 「訂閱」按鈕已顯示 隱藏轉錄稿 已隱藏轉錄稿區塊 已顯示轉錄稿區塊 + 隱藏「測驗」 + 測驗區塊已隱藏 + 測驗區塊已顯示 影片說明 隱藏或顯示影片說明元件 篩選列 @@ -393,6 +456,11 @@ Second \"item\" text" 已在觀看記錄中顯示 頻道頁面 隱藏或顯示頻道頁面元件 + 啟用頻道分頁篩選器 + 頻道分頁篩選器已啟用 + 頻道分頁篩選器已停用 + 頻道分頁篩選器 + 輸入要篩選的頻道分頁名稱,每行一個 隱藏社群按鈕 「社群」按鈕已隱藏 @@ -456,15 +524,15 @@ Second \"item\" text" 觀看次數已在資訊提供和搜尋結果中顯示 "限制: -• Shorts 專區、頻道頁面和搜尋結果可能仍會顯示觀看次數 -• 此功能不適用於汽車外型規格" +• Shorts 專區、頻道頁面和搜尋結果可能仍會顯示觀看次數。 +• 此功能不適用於汽車外型規格。" 隱藏「上傳時間」 上傳時間已在資訊提供和搜尋結果中隱藏 上傳時間顯示在資訊提供和搜尋結果中 "限制: -• Shorts 專區、頻道頁面和搜尋結果可能仍會顯示上傳時間 -• 此功能不適用於車載模式" +• Shorts 專區、頻道頁面和搜尋結果可能仍會顯示上傳時間。 +• 此功能不適用於汽車外型規格。" 隱藏關鍵字內容 透過關鍵字篩選,隱藏搜尋結果與推薦內容中的影片 依關鍵字隱藏首頁影片 @@ -487,7 +555,7 @@ Second \"item\" text" 關於關鍵字篩選 "首頁/訂閱/搜尋結果會根據篩選條件,隱藏包含關鍵字詞組的相關內容 -限制 +限制: • Shorts 無法透過頻道名稱篩選隱藏 • 某些使用者介面可能無法隱藏 • 搜尋關鍵字可能顯示無結果" @@ -502,19 +570,12 @@ Second \"item\" text" 關鍵字將隱藏所有影片:%s - 隱藏創作者商店區塊 - 已隱藏影片播放器下方的創作者商店區塊 - 已顯示影片播放器下方的創作者商店區塊 隱藏片尾商店橫幅 已隱藏片尾的商店橫幅 已顯示片尾的商店橫幅 隱藏全螢幕廣告 - "已隱藏全螢幕廣告 - -此功能僅適用於舊版裝置" + 已隱藏全螢幕廣告 已顯示全螢幕廣告 - - 只能在舊裝置上使用隱藏全螢幕廣告 隱藏一般廣告 已隱藏一般廣告 已顯示一般廣告 @@ -524,6 +585,9 @@ Second \"item\" text" 隱藏付費推廣標籤 已隱藏付費推廣標籤 已顯示付費推廣標籤 + 隱藏播放器彈出式廣告 + 播放器彈出式廣告已隱藏 + 播放器彈出式廣告已顯示 隱藏自我贊助資訊卡 已隱藏自我贊助資訊卡 已顯示自我贊助資訊卡 @@ -531,23 +595,18 @@ Second \"item\" text" 已隱藏影片說明中的購物連結 已顯示影片說明中的購物連結 隱藏「查看商品」橫幅 - 已隱藏影片畫面上的「查看商品」橫幅 - 已顯示影片畫面上的「查看商品」橫幅 - 隱藏網頁搜尋結果 - 已隱藏網頁搜尋結果 - 已顯示網頁搜尋結果 - - - 隱藏 YouTube Premium 促銷內容 - 已隱藏影片播放器下方 YouTube Premium 促銷內容 - 已顯示影片播放器下方 YouTube Premium 促銷內容 + 播放器疊加層上的「查看商品」橫幅已隱藏 + 播放器疊加層上的「查看商品」橫幅已顯示 + 隱藏 YouTube Premium 促銷內容 + YouTube Premium 促銷內容已隱藏 + YouTube Premium 促銷內容已顯示 隱藏影片廣告 已隱藏影片廣告 已顯示影片廣告 - + 已將網址複製到剪貼簿 已複製時間戳記網址 顯示複製影片網址按鈕 @@ -563,10 +622,10 @@ Second \"item\" text" 將顯示對話方塊 這不會繞過年齡限制,只會自動按下同意。 - - 停用「登入電視」彈出視窗 - 「登入電視」彈出視窗已停用 - 「登入電視」彈出視窗已啟用 + + 停用「登入電視」彈出視窗 + 「登入電視」彈出視窗已停用 + 「登入電視」彈出視窗已啟用 停用按兩下跳過章節功能 @@ -599,10 +658,10 @@ Second \"item\" text" 已停用精準跳轉手勢 已啟用精準跳轉手勢 - - 啟用輕觸以跳轉 - 已啟用輕觸以跳轉 - 已停用輕觸以跳轉 + + 啟用輕觸以跳轉 + 已啟用輕觸以跳轉 + 已停用輕觸以跳轉 啟用亮度手勢 @@ -683,7 +742,7 @@ Second \"item\" text" 留言按鈕已隱藏 留言按鈕已顯示 + This button usually appears on live streamed videos. --> 隱藏檢舉 已隱藏「檢舉」按鈕 已顯示「檢舉」按鈕 @@ -696,7 +755,7 @@ Second \"item\" text" 已隱藏「下載」按鈕 已顯示「下載」按鈕 + This button usually appears on videos uploaded by the logged-in user. --> 隱藏「熱推」 「熱推」按鈕已隱藏 「熱推」按鈕已顯示 @@ -709,7 +768,7 @@ Second \"item\" text" 已隱藏「感謝」按鈕 已顯示「感謝」按鈕 + This button usually appears if the user IP is from a specific region such as the USA or EU. --> 隱藏詢問 詢問按鈕已隱藏 詢問按鈕已顯示 @@ -717,6 +776,7 @@ Second \"item\" text" 隱藏剪輯片段 已隱藏「剪輯片段」按鈕 已顯示「剪輯片段」按鈕 + 對於某些使用者帳戶,隱藏功能可能無法運作。 隱藏「商店」 「商店」按鈕已隱藏 @@ -726,13 +786,13 @@ Second \"item\" text" 「儲存」按鈕已隱藏 「儲存」按鈕已顯示 - + 導覽列按鈕 - 隱藏或變更導覽列中的按鈕 + 隱藏或變更導覽列按鈕 - 隱藏首頁 - 已隱藏「首頁」按鈕 - 已顯示「首頁」按鈕 + 隱藏「首頁」 + 「首頁」按鈕已隱藏 + 「首頁」按鈕已顯示 隱藏 Shorts 已隱藏「Shorts」按鈕 @@ -750,26 +810,44 @@ Second \"item\" text" 已顯示「通知」按鈕 切換「建立」與「通知」按鈕 - "「建立」按鈕與「通知」按鈕對調 - -注意:啟用此功能也會強制隱藏影片廣告" + 「建立」按鈕已與「通知」按鈕對調 「建立」按鈕不與「通知」按鈕對調 - "停用此設定也會停用 Shorts 的廣告攔截功能。 - -如果變更此設定沒有生效,請試試看切換到無痕模式。" - 隱藏導覽列按鈕標籤 - 已隱藏「標籤」 - 已顯示「標籤」 + 如果更改此設定未生效,請嘗試切換到無痕模式。 + 隱藏導覽按鈕標籤 + 已隱藏標籤 + 已顯示標籤 + 啟用窄式導覽按鈕 + 導覽按鈕之間的間距為窄 + 導覽按鈕之間的間距為正常 + 啟用導覽列動畫 + 導覽轉場有動畫效果 + 導覽轉場沒有動畫效果 停用半透明狀態列 狀態列為不透明 狀態列為不透明或半透明 - 在部分裝置上,啟用這項功能可能會使系統導覽列變成透明。 + "限制: +• 影片播放器頂端可能會出現黑色橫條。 +• 在某些裝置上,啟用此功能可能會將系統導覽列變為透明。" 停用淺色半透明狀態列 淺色模式導覽列為不透明 淺色模式導覽列為不透明或半透明 停用深色半透明狀態列 深色模式導覽列為不透明 深色模式導覽列為不透明或半透明 + 工具列 + 隱藏或變更工具列元件 + 隱藏建立按鈕 + 建立按鈕已隱藏 + 建立按鈕已顯示 + 隱藏通知按鈕 + 通知按鈕已隱藏 + 通知按鈕已顯示 + 隱藏搜尋按鈕 + 搜尋按鈕已隱藏 + 搜尋按鈕已顯示。 + 啟用寬搜尋列 + 已啟用寬搜尋列 + 已停用寬搜尋列 介面選單 @@ -844,6 +922,12 @@ Second \"item\" text" 隱藏「投放」按鈕 已隱藏「投放」按鈕 已顯示「投放」按鈕 + 隱藏收合按鈕 + 收合按鈕已隱藏 + 收合按鈕已顯示 + 隱藏全螢幕按鈕 + 全螢幕按鈕已隱藏 + 全螢幕按鈕已顯示 隱藏播放器控制背景 播放器控制背景已隱藏 播放器控制背景已顯示 @@ -852,9 +936,9 @@ Second \"item\" text" 已顯示「上一部」和「下一部」按鈕 - 隱藏片尾資訊卡 - 已隱藏片尾資訊卡 - 已顯示片尾資訊卡 + 隱藏片尾資訊卡 + 已隱藏片尾資訊卡 + 已顯示片尾資訊卡 在全螢幕狀態下停用微光效果 @@ -879,10 +963,16 @@ Second \"item\" text" 隱藏影片縮圖進度條 影片縮圖進度條已隱藏 影片縮圖進度條已顯示 + 啟用全螢幕大跳轉列 + 全螢幕跳轉列為大尺寸 + 全螢幕跳轉列為正常尺寸 Shorts 播放器 隱藏或顯示 Shorts 播放器元件 + 在頻道頁面中隱藏 Shorts + 在頻道頁面中隱藏 + 在頻道頁面中顯示 在首頁推薦內容中隱藏 Shorts 已在首頁推薦內容和相關影片中隱藏 @@ -894,9 +984,18 @@ Second \"item\" text" 隱藏訂閱內容中的 Shorts 已在訂閱內容中隱藏 已在訂閱內容中顯示 + 在影片說明中隱藏 Shorts + 在影片說明中隱藏 + 在影片說明中顯示 隱藏觀看記錄中的 Shorts 已在觀看記錄中隱藏 已在觀看記錄中顯示 + 隱藏 AI 按鈕 + AI 按鈕已隱藏 + AI 按鈕已顯示 + 隱藏「自動配音」標籤 + 已隱藏自動配音標籤 + 已顯示自動配音標籤 隱藏「自動配音」標籤 已隱藏自動配音標籤 已顯示自動配音標籤 @@ -958,6 +1057,7 @@ Second \"item\" text" 隱藏「使用此範本」按鈕 「使用此範本」按鈕已隱藏 「使用此範本」按鈕已顯示 + 隱藏喜歡按鈕的噴泉動畫 已隱藏喜歡按鈕的動畫 已顯示喜歡按鈕的動畫 @@ -1000,7 +1100,12 @@ Second \"item\" text" 已隱藏導覽列 已顯示導覽列 - + + 隱藏自動播放預覽 + 自動播放預覽已隱藏 + 自動播放預覽已顯示 + + 隱藏片尾推薦影片 "當自動播放關閉時,片尾推薦影片會被隱藏。 @@ -1019,9 +1124,9 @@ Second \"item\" text" 已顯示時間戳記 - 隱藏播放器彈出面板 - 已隱藏播放器彈出面板 - 已顯示播放器彈出面板 + 隱藏播放器彈出面板 + 已隱藏播放器彈出面板 + 已顯示播放器彈出面板 視窗模式結束後退出全螢幕 @@ -1091,27 +1196,6 @@ Second \"item\" text" 遇到 %d 次用戶端速率限制 %d 毫秒 - - 啟用寬搜尋列 - 已啟用寬搜尋列 - 已停用寬搜尋列 - - - 啟用高畫質縮圖 - 已將跳轉列設為高畫質縮圖 - 已將跳轉列設為中畫質縮圖 - 全螢幕跳轉列縮圖為高畫質 - 全螢幕跳轉列縮圖為中畫質 - "這也會還原直播影片上沒有跳轉列縮圖的縮圖。 - -跳轉列縮圖將使用與目前影片相同的畫質。 - -這個功能在影片畫質為 720p 或以下,以及使用非常快速的網路連線時效果最佳。 -" - 還原舊版跳轉列縮圖 - 跳轉列縮圖將出現在跳轉列上方 - 跳轉列縮圖將出現在全螢幕畫面 - SponsorBlock 啟用 SponsorBlock @@ -1353,8 +1437,6 @@ Second \"item\" text" 應用程式偽裝目標版本 20.13.41 - 還原未收合的影片操作列 20.05.46 - 恢復轉錄功能 - 19.35.36 - 還原舊版 Shorts 播放圖示 - 19.01.34 - 還原舊版導覽圖示 變更起始頁面 @@ -1465,8 +1547,9 @@ Second \"item\" text" 載入畫面將具有漸層背景 載入畫面將具有純色背景 啟動畫面樣式 - 顏色 - 黑白 + 已停用 + 顏色 + 黑白 啟用自訂跳轉列顏色 已顯示自訂跳轉列顏色 已顯示原版跳轉列顏色 @@ -1586,6 +1669,9 @@ Second \"item\" text" 停用拖曳還原觸覺回饋 拖曳還原觸覺回饋已停用 拖曳還原觸覺回饋已啟用 + 停用輕觸並按住觸覺回饋 + 輕觸並按住觸覺回饋已停用 + 輕觸並按住觸覺回饋已啟用 停用縮放震動 縮放觸覺回饋已停用 縮放觸覺回饋已啟用 @@ -1681,6 +1767,11 @@ Second \"item\" text" 已顯示進階影片畫質選單 不顯示進階影片畫質選單 + + 隱藏 Premium 品質選項 + Premium 品質選項已隱藏 + Premium 品質選項已顯示 + 啟用滑動預覽 已啟用滑動預覽 @@ -1690,11 +1781,11 @@ Second \"item\" text" 允許 Android VR AV1 "視訊轉碼器為 AVC (H.264)、VP9 或 AV1 -播放可能會卡頓或掉幀" +播放可能會卡頓或丟格" 視訊轉碼器為 AVC (H.264) 或 VP9 "啟用此設定可能會使用軟體 AV1 解碼。 -AV1 視訊播放可能會卡頓或掉幀。" +AV1 視訊播放可能會卡頓或丟格。" 欺騙的副作用 • 實驗性用戶端,隨時可能停止運作 • 影片可能會在 1:00 停止,或在某些地區無法播放 @@ -1716,6 +1807,7 @@ AV1 視訊播放可能會卡頓或掉幀。" Music + 關於 廣告 一般 @@ -1734,8 +1826,8 @@ AV1 視訊播放可能會卡頓或掉幀。" 隱藏「投放」按鈕 - 「投放」按鈕已隱藏 - 「投放」按鈕已顯示 + 已隱藏「投放」按鈕 + 已顯示「投放」按鈕 隱藏「歷史記錄」按鈕 「歷史記錄」按鈕已隱藏 「歷史記錄」按鈕已顯示 @@ -1748,8 +1840,8 @@ AV1 視訊播放可能會卡頓或掉幀。" 隱藏類別列 - 類別列已隱藏 - 類別列已顯示 + 已隱藏類別列 + 已顯示類別列 變更迷你播放器顏色 diff --git a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml index 3a40645452..8c405800e4 100644 --- a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml @@ -27,18 +27,47 @@ Second \"item\" text" + Khubaza izithonjana eziqinile + Izithonjana aziqinile + Izithonjana ziqinile + GmsCore + Izilungiselelo eziphathelene ne-GmsCore + Hlola izibuyekezo ze-GmsCore + Ukuhlolwa kwezibuyekezo kuvuliwe + Ukuhlolwa kwezibuyekezo kukhutshaziwe + Vula Izilungiselelo ze-GmsCore + Izilungiselelo ze-GmsCore + I-MicroG GmsCore ayifakiwe. Yifake. + Kudingeka isenzo + Kuhlulekile ukuhlola izibuyekezo ze-MicroG GmsCore + Uhlobo olusha (%1$s) lwe-MicroG GmsCore luyatholakala. Okwamanje, usebenzisa uhlobo %2$s. + "I-MicroG GmsCore ayinayo imvume yokusebenza ngemuva.\n\nLandela umhlahlandlela othi \"Ungabulali uhlelo lwami lokusebenza\" wefoni yakho, bese usebenzisa imiyalelo ekufakweni kwe-MicroG yakho.\n\nLokhu kuyadingeka ukuze uhlelo lokusebenza lusebenze." + Vula iwebhusayithi + Khansela + "Ukwenziwa kahle kwebhethri ye-MicroG GmsCore kufanele kukhutshazwe ukuze kuvinjelwe izinkinga.\n\nUkukhubaza ukwenziwa kahle kwebhethri kwe-MicroG ngeke kuthinte kabi ukusetshenziswa kwebhethri.\n\nThepha inkinobho ethi qhubeka bese uvumela izinguquko zokwenziwa kahle." + Qhubeka - + + Qala kabusha uhlelo lokusebenza ukuze usebenzise lesi sici + Iphrothokholi bhapha Yelogi + Amalogi okulungisa iphutha afaka phakathi iprothokholi bhapha + Amalogi okulungisa iphutha awafaki phakathi iprothokholi bhapha + "Ukwenza le nkambu isebenze kuzofaka phansi idatha eyengeziwe yokwakheka, okuhlanganisa umbhalo osesikrinini wezingxenye ezithile ze-UI. + +Lokhu kungasiza ekuboneni izingxenye lapho kwakhiwa izihlungi ezingokwezifiso. + +Kodwa-ke, ukuyivula lokhu kuzofaka futhi phansi idatha ethile yomsebenzisi njengesilandi sakho se-IP." + @@ -48,40 +77,135 @@ Second \"item\" text" - + Fihla ishalofu lesitolo somdali + Ishalofu lesitolo somdali elingaphansi kwesidlali sevidiyo lifihliwe + Ishalofu lesitolo somdali elingaphansi kwesidlali sevidiyo libonisiwe + Fihla isigaba samazwana ngaphansi kwamavidiyo kokuphakelayo Kwasekhaya + Isigaba samazwana ngaphansi kwamavidiyo kokuphakelayo Kwasekhaya sifihliwe + Isigaba samazwana ngaphansi kwamavidiyo kokuphakelayo Kwasekhaya sibonisiwe + + Fihla inkinobho \'Yamavidiyo Akamuva\' + Inkinobho yamavidiyo akamuva ifihliwe + Inkinobho yamavidiyo akamuva ibonisiwe + + Fihla imiphumela yokusesha kuwebhu + Imiphumela yokusesha kuwebhu ifihliwe + Imiphumela yokusesha kuwebhu ibonisiwe + Fihla isigaba \'Ongase Usithande\' + Isigaba \'Ongase Usithande\' sifihliwe + Isigaba \'Ongase Usithande\' sibonisiwe + This button usually appears in the video player for certain videos. --> + + Fihla inkinobho \'Yokuphinda Okushiwo Engxoxweni Ebukhoma\' + Inkinobho yokuphinda okushiwo engxoxweni ebukhoma esendlalelweni sesidlali ifihliwe + Inkinobho yokuphinda okushiwo engxoxweni ebukhoma esendlalelweni sesidlali ibonisiwe + Fihla isihloko sevidiyo + Isihloko sevidiyo esendlalelweni sesidlali sifihliwe + Isihloko sevidiyo esendlalelweni sesidlali sibonisiwe + Fihla \'Inqubekela phambili yesifundo\' + Isigaba senqubekela phambili yesifundo sifihliwe + Isigaba senqubekela phambili yesifundo sibonisiwe + Fihla Okumele Kuhloliwe + Isigaba esithi Hlola lesi sifundo kanye Nesigaba esithi Hlola i-podcast kufihliwe + Isigaba esithi Hlola lesi sifundo kanye Nesigaba esithi Hlola i-podcast kubonisiwe + Fihla \'Hlola lesi sifundo\' + Isigaba esithi Hlola lesi sifundo sifihliwe + Isigaba esithi Hlola lesi sifundo sibonisiwe + Fihla \'Hlola i-podcast\' + Isigaba esithi Hlola i-podcast sifihliwe + Isigaba esithi Hlola i-podcast sibonisiwe + Fihla \'Izindawo Ezifakiwe\' + Isigaba sezindawo ezifakiwe sifihliwe + Isigaba sezindawo ezifakiwe sibonisiwe + Vumela isihlungi semenyu esindizayo sokuphakelayo + Isihlungi semenyu esindizayo sokuphakelayo sivunyelwe + Isihlungi semenyu esindizayo sokuphakelayo sikhutshaziwe + Isihlungi semenyu esindizayo sokuphakelayo + Faka amagama emenyu esindizayo ukuze uhlunge ngawo, elilodwa umugqa ngamunye + Fihla Imidlalo + Isigaba semidlalo sifihliwe + Isigaba semidlalo sibonisiwe + Fihla Umculo + Isigaba somculo sifihliwe + Isigaba somculo sibonisiwe + Fihla Imibuzo + Isigaba semibuzo sifihliwe + Isigaba semibuzo sibonisiwe + Vumela isihlungi sethebhu yesiteshi + Isihlungi sethebhu yesiteshi sivunyelwe + Isihlungi sethebhu yesiteshi sikhutshaziwe + Isihlungi sethebhu yesiteshi + Faka amagama ethebhu yesiteshi ukuze uhlunge ngawo, elilodwa umugqa ngamunye + "Imikhawulo: +• Amashalofu Shorts, amakhasi esiteshi, nemiphumela yokusesha kusengabonisa izibalo zokubukwa. +• Lesi sici asisebenzi ngefomu lemoto." + "Imikhawulo: +• Amashalofu Shorts, amakhasi esiteshi, nemiphumela yokusesha kusengabonisa izikhathi zokulayisha. +• Lesi sici asisebenzi ngefomu lemoto." + "Imiphumela yasekhaya/Yokubhalisa/Yokusesha ihlungiwe ukuze kufihlwe okuqukethwe okufana nemishwana yamagama angukhiye + +Imikhawulo: +• Shorts ayikwazi ukufihlwa ngegama lesiteshi +• Ezinye izingxenye ze-UI zingase zingafihlwa +• Ukusesha igama elingukhiye kungase kungabonisi imiphumela" - + Izikhangiso zesikrini esigcwele zifihliwe + Fihla izikhangiso ze-popup zesidlali + Izikhangiso ze-popup zesidlali zifihliwe + Izikhangiso ze-popup zesidlali zibonisiwe + Isibhengezo sokubuka imikhiqizo esendlalelweni sesidlali sifihliwe + Isibhengezo sokubuka imikhiqizo esendlalelweni sesidlali sibonisiwe + Fihla amaphromoshini we-YouTube Premium + Amaphromoshini we-YouTube Premium afihliwe + Amaphromoshini we-YouTube Premium abonisiwe - - + + I-URL ikopishwe ebhodini lokunamathisela + I-URL enesikhathi ikopishwe + Bonisa inkinobho yokukopisha i-URL yevidiyo + Inkinobho yokukopisha i-URL yevidiyo ibonisiwe. Thepha ukuze ukopishe i-URL yevidiyo. Thepha bese ubamba ukuze ukopishe ngesikhathi + Inkinobho yokukopisha i-URL yevidiyo ayibonisiwe + Bonisa inkinobho yokukopisha i-URL yesikhathi + Inkinobho yokukopisha i-URL yesikhathi ibonisiwe. Thepha ukuze ukopishe i-URL yevidiyo ngesikhathi. Thepha bese ubamba ukuze ukopishe ngaphandle kwesikhathi + Inkinobho yokukopisha i-URL yesikhathi ayibonisiwe + - + + Khubaza i-popup ethi \'Ngena ku-TV\' + I-popup ethi Ngena ku-TV ikhutshaziwe + I-popup ethi Ngena ku-TV ivunyelwe + - + + Vumela ukuthepha ukuze useshe + Ukuthepha ukuze useshe kuvunyelwe + Ukuthepha ukuze useshe kukhutshaziwe + @@ -89,25 +213,82 @@ Second \"item\" text" + This button usually appears on live streamed videos. --> + This button usually appears on videos uploaded by the logged-in user. --> + This button usually appears if the user IP is from a specific region such as the USA or EU. --> + Ukufihla kungase kungasebenzi kwamanye ama-akhawunti omsebenzisi. - + + Izinkinobho zokuzulazula + Fihla noma ushintshe izinkinobho zebha yokuzulazula + Fihla Ikhaya + Inkinobho yekhaya ifihliwe + Inkinobho yekhaya ibonisiwe + Fihla Shorts + Inkinobho ye-Shorts ifihliwe + Inkinobho ye-Shorts ibonisiwe + Fihla Dala + Inkinobho yokudala ifihliwe + Inkinobho yokudala ibonisiwe + Fihla Okubhalisiwe + Inkinobho yokubhalisa ifihliwe + Inkinobho yokubhalisa ibonisiwe + Fihla Izaziso + Inkinobho yezaziso ifihliwe + Inkinobho yezaziso ibonisiwe + Shintsha Dala ngezaziso + Inkinobho yokudala ishintshwe ngenkinobho yezaziso + Inkinobho yokudala ayishintshwanga ngenkinobho yezaziso + Uma ukushintsha lesi silungiselelo kungasebenzi, zama ukushintshela kumodi ye-Incognito. + Fihla amalebula ezinkinobho zokuzulazula + Amalebula afihliwe + Amalebula abonisiwe + Vumela izinkinobho zokuzulazula ezincane + Isikhala phakathi kwezinkinobho zokuzulazula sincane + Isikhala phakathi kwezinkinobho zokuzulazula sijwayelekile + Vumela izithombe ezinyakazayo zebha yokuzulazula + Ukuguquka kokuzulazula kunomdwebo + Ukuguquka kokuzulazula akunamdwebo + Khubaza ibha yesimo engabonisi lutho + Ibha yesimo ayibonisi lutho + Ibha yesimo ayibonisi lutho noma iyabonisa + "Imikhawulo: +• Ibha emnyama ingase ivele phezulu esidlali sevidiyo. +• Kwamanye amadivayisi, ukuvumela lesi sici kungashintsha ibha yokuzulazula yesistimu ibe sobala." + Khubaza ibha ekhanyayo engabonisi lutho + Ibha yokuzulazula yemodi ekhanyayo ayibonisi lutho + Ibha yokuzulazula yemodi ekhanyayo ayibonisi lutho noma iyabonisa + Khubaza ibha emnyama engabonisi lutho + Ibha yokuzulazula yemodi emnyama ayibonisi lutho + Ibha yokuzulazula yemodi emnyama ayibonisi lutho noma iyabonisa + Ibha yamathuluzi + Fihla noma ushintshe izingxenye zebha yamathuluzi + Fihla inkinobho yokudala + Inkinobho yokudala ifihliwe + Inkinobho yokudala ibonisiwe + Fihla inkinobho yezaziso + Inkinobho yezaziso ifihliwe + Inkinobho yezaziso ibonisiwe + Fihla inkinobho yokusesha + Inkinobho yokusesha ifihliwe + Inkinobho yokusesha ibonisiwe. + Vumela ibha yokusesha ebanzi + Ibha yokusesha ebanzi ivuliwe + Ibha yokusesha ebanzi ikhutshaziwe @@ -126,25 +307,67 @@ Second \"item\" text" + Fihla inkinobho yokugoqa + Inkinobho yokugoqa ifihliwe + Inkinobho yokugoqa ibonisiwe + Fihla inkinobho yesikrini esigcwele + Inkinobho yesikrini esigcwele ifihliwe + Inkinobho yesikrini esigcwele ibonisiwe + + + Fihla amakhadi esikrini sokuphela + Amakhadi esikrini sokuphela afihliwe + Amakhadi esikrini sokuphela abonisiwe - + Vumela ibha yokusesha enkulu yesikrini esigcwele + Ibha yokusesha yesikrini esigcwele inosayizi omkhulu + Ibha yokusesha yesikrini esigcwele inosayizi ojwayelekile + Fihla Shorts ekhasini lesiteshi + Kufihliwe ekhasini lesiteshi + Kubonisiwe ekhasini lesiteshi + Fihla Shorts encazelweni yevidiyo + Kufihliwe encazelweni yevidiyo + Kubonisiwe encazelweni yevidiyo + Fihla inkinobho ye-AI + Inkinobho ye-AI ifihliwe + Inkinobho ye-AI ibonisiwe + Fihla ilebula \'Elimenyezelwe ngokuzenzakalela\' + Ilebula elimenyezelwe ngokuzenzakalela lifihliwe + Ilebula elimenyezelwe ngokuzenzakalela libonisiwe + - + + Fihla ukubuka kuqala okuzenzakalelayo + Ukubuka kuqala okuzenzakalelayo kufihliwe + Ukubuka kuqala okuzenzakalelayo kubonisiwe + + + Fihla ividiyo ephakanyisiwe yesikrini sokuphela + "Ividiyo ephakanyisiwe yesikrini sokuphela ifihliwe uma ukudlala okuzenzakalelayo kukhutshaziwe + +Ukudlala okuzenzakalelayo kungashintshwa kuzilungiselelo ze-YouTube: +Izilungiselelo → Ukudlala → Dlala ividiyo elandelayo ngokuzenzakalelayo" + Ividiyo ephakanyisiwe yesikrini sokuphela ibonisiwe + - + + Fihla amaphaneli wokuzivelelayo esidlali + Amaphaneli wokuzivelelayo esidlali afihliwe + Amaphaneli wokuzivelelayo esidlali abonisiwe + @@ -155,10 +378,12 @@ Second \"item\" text" - - + Okwamavidiyo omculo kuphela. Izingxenye zamavidiyo omculo angenamculo, angakahlanganiswa ngesigaba esinye + Ayikwazi ukuthumela ingxenye: %s + "Ayikwazi ukuthumela ingxenye. +Isevele ikhona" @@ -170,7 +395,11 @@ Second \"item\" text" - + + Kukhutshaziwe + Umbala + Omnyama nomhlophe + @@ -187,7 +416,11 @@ Second \"item\" text" - + + Khubaza ukuthepha nokubamba kwe-haptics + Ukuthepha nokubamba kwe-haptics kukhutshaziwe + Ukuthepha nokubamba kwe-haptics kuvunyelwe + @@ -200,6 +433,11 @@ Second \"item\" text" + + Fihla izinketho zekhwalithi ye-Premium + Izinketho zekhwalithi ye-Premium zifihliwe + Izinketho zekhwalithi ye-Premium zibonisiwe + @@ -207,7 +445,9 @@ Second \"item\" text" - + + +